commit 7cdaecc04b9ceba0b18f9b4c38a7eed6ea69cd20
Author: 魏灿斌 <15815221751@163.com>
Date: Wed Nov 19 10:58:34 2025 +0800
first commit
diff --git a/.browserslistrc b/.browserslistrc
new file mode 100644
index 0000000..e7c12fd
--- /dev/null
+++ b/.browserslistrc
@@ -0,0 +1,5 @@
+Android 4.1
+IOS 7.1
+Chrome > 31
+ff > 31
+ie >= 11
\ No newline at end of file
diff --git a/.env.base b/.env.base
new file mode 100644
index 0000000..23fc7a4
--- /dev/null
+++ b/.env.base
@@ -0,0 +1,23 @@
+# 环境
+VITE_NODE_ENV=development
+
+# 接口前缀
+VITE_API_BASE_PATH=
+
+# 打包路径
+VITE_BASE_PATH=/
+
+# 标题
+VITE_APP_TITLE=ElementAdmin
+
+# 是否全量引入element-plus样式
+VITE_USE_ALL_ELEMENT_PLUS_STYLE=true
+
+# 是否开启mock
+VITE_USE_MOCK=true
+
+# 是否使用在线图标
+VITE_USE_ONLINE_ICON=true
+
+# 是否隐藏全局设置按钮
+VITE_HIDE_GLOBAL_SETTING=false
diff --git a/.env.dev b/.env.dev
new file mode 100644
index 0000000..792c9ea
--- /dev/null
+++ b/.env.dev
@@ -0,0 +1,41 @@
+# 环境
+VITE_NODE_ENV=production
+
+# 接口前缀
+VITE_API_BASE_PATH=
+
+# 打包路径
+VITE_BASE_PATH=/dist-dev/
+
+# 是否删除debugger
+VITE_DROP_DEBUGGER=false
+
+# 是否删除console.log
+VITE_DROP_CONSOLE=false
+
+# 是否sourcemap
+VITE_SOURCEMAP=true
+
+# 输出路径
+VITE_OUT_DIR=dist-dev
+
+# 标题
+VITE_APP_TITLE=ElementAdmin
+
+# 是否包分析
+VITE_USE_BUNDLE_ANALYZER=false
+
+# 是否全量引入element-plus样式
+VITE_USE_ALL_ELEMENT_PLUS_STYLE=false
+
+# 是否开启mock
+VITE_USE_MOCK=true
+
+# 是否切割css
+VITE_USE_CSS_SPLIT=true
+
+# 是否使用在线图标
+VITE_USE_ONLINE_ICON=true
+
+# 是否隐藏全局设置按钮
+VITE_HIDE_GLOBAL_SETTING=false
diff --git a/.env.gitee b/.env.gitee
new file mode 100644
index 0000000..5536574
--- /dev/null
+++ b/.env.gitee
@@ -0,0 +1,41 @@
+# 环境
+VITE_NODE_ENV=production
+
+# 接口前缀
+VITE_API_BASE_PATH=
+
+# 打包路径
+VITE_BASE_PATH=/vue-element-plus-admin/
+
+# 是否删除debugger
+VITE_DROP_DEBUGGER=true
+
+# 是否删除console.log
+VITE_DROP_CONSOLE=true
+
+# 是否sourcemap
+VITE_SOURCEMAP=false
+
+# 输出路径
+VITE_OUT_DIR=dist-pro
+
+# 标题
+VITE_APP_TITLE=ElementAdmin
+
+# 是否包分析
+VITE_USE_BUNDLE_ANALYZER=false
+
+# 是否全量引入element-plus样式
+VITE_USE_ALL_ELEMENT_PLUS_STYLE=false
+
+# 是否开启mock
+VITE_USE_MOCK=true
+
+# 是否切割css
+VITE_USE_CSS_SPLIT=true
+
+# 是否使用在线图标
+VITE_USE_ONLINE_ICON=true
+
+# 是否隐藏全局设置按钮
+VITE_HIDE_GLOBAL_SETTING=false
diff --git a/.env.pro b/.env.pro
new file mode 100644
index 0000000..7db3d27
--- /dev/null
+++ b/.env.pro
@@ -0,0 +1,41 @@
+# 环境
+VITE_NODE_ENV=production
+
+# 接口前缀
+VITE_API_BASE_PATH=
+
+# 打包路径
+VITE_BASE_PATH=/
+
+# 是否删除debugger
+VITE_DROP_DEBUGGER=true
+
+# 是否删除console.log
+VITE_DROP_CONSOLE=true
+
+# 是否sourcemap
+VITE_SOURCEMAP=false
+
+# 输出路径
+VITE_OUT_DIR=dist-pro
+
+# 标题
+VITE_APP_TITLE=ElementAdmin
+
+# 是否包分析
+VITE_USE_BUNDLE_ANALYZER=true
+
+# 是否全量引入element-plus样式
+VITE_USE_ALL_ELEMENT_PLUS_STYLE=false
+
+# 是否开启mock
+VITE_USE_MOCK=true
+
+# 是否切割css
+VITE_USE_CSS_SPLIT=true
+
+# 是否使用在线图标
+VITE_USE_ONLINE_ICON=false
+
+# 是否隐藏全局设置按钮
+VITE_HIDE_GLOBAL_SETTING=false
diff --git a/.env.test b/.env.test
new file mode 100644
index 0000000..e589b03
--- /dev/null
+++ b/.env.test
@@ -0,0 +1,41 @@
+# 环境
+VITE_NODE_ENV=production
+
+# 接口前缀
+VITE_API_BASE_PATH=
+
+# 打包路径
+VITE_BASE_PATH=/dist-test/
+
+# 是否删除debugger
+VITE_DROP_DEBUGGER=false
+
+# 是否删除console.log
+VITE_DROP_CONSOLE=false
+
+# 是否sourcemap
+VITE_SOURCEMAP=true
+
+# 输出路径
+VITE_OUT_DIR=dist-test
+
+# 标题
+VITE_APP_TITLE=ElementAdmin
+
+# 是否包分析
+VITE_USE_BUNDLE_ANALYZER=false
+
+# 是否全量引入element-plus样式
+VITE_USE_ALL_ELEMENT_PLUS_STYLE=false
+
+# 是否开启mock
+VITE_USE_MOCK=true
+
+# 是否切割css
+VITE_USE_CSS_SPLIT=false
+
+# 是否使用在线图标
+VITE_USE_ONLINE_ICON=true
+
+# 是否隐藏全局设置按钮
+VITE_HIDE_GLOBAL_SETTING=false
diff --git a/.github/workflows/auto-merge.yml b/.github/workflows/auto-merge.yml
new file mode 100644
index 0000000..f9cd3d7
--- /dev/null
+++ b/.github/workflows/auto-merge.yml
@@ -0,0 +1,131 @@
+name: Automerge
+
+on:
+ pull_request:
+ types:
+ - labeled
+ - unlabeled
+ - synchronize
+ - opened
+ - edited
+ - ready_for_review
+ - reopened
+ - unlocked
+ pull_request_review:
+ types:
+ - submitted
+ status: {}
+
+jobs:
+ # 合并发布版本的 pr 到 master
+ auto-merge:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Automerge
+ uses: 'pascalgn/automerge-action@v0.14.3'
+ env:
+ BASE_BRANCHES: 'release'
+ GITHUB_TOKEN: '${{ secrets.TOKEN }}'
+ MERGE_LABELS: ''
+ MERGE_FILTER_AUTHOR: 'kailong321200875'
+
+ push-to-gh-pages:
+ needs: [auto-merge]
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+
+ - name: Setup Pnpm
+ uses: pnpm/action-setup@v2
+ with:
+ version: latest
+
+ - name: use Node.js 18
+ uses: actions/setup-node@v2.1.2
+ with:
+ node-version: '18.x'
+
+ - name: Set SSH Environment
+ env:
+ DOCS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }}
+ run: |
+ mkdir -p ~/.ssh/
+ echo "$ACTIONS_DEPLOY_KEY" > ~/.ssh/id_rsa
+ chmod 600 ~/.ssh/id_rsa
+ ssh-keyscan github.com > ~/.ssh/known_hosts
+ chmod 700 ~/.ssh && chmod 600 ~/.ssh/*
+ git config --local user.email "321200875@qq.com"
+ git config --local user.name "kailong321200875"
+
+ # 发布到 github
+ - name: Build Github
+ run: |
+ pnpm install --no-frozen-lockfile
+ pnpm run build:pro
+
+ - name: Deploy Github
+ uses: peaceiris/actions-gh-pages@v3
+ with:
+ deploy_key: ${{secrets.ACTIONS_DEPLOY_KEY}}
+ publish_branch: gh-pages
+ publish_dir: ./dist-pro
+ force_orphan: true
+ cname: element-plus-admin.cn
+
+ push-to-gh-pages-gitee:
+ needs: [auto-merge]
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+
+ - name: Setup Pnpm
+ uses: pnpm/action-setup@v2
+ with:
+ version: latest
+
+ - name: use Node.js 18
+ uses: actions/setup-node@v2.1.2
+ with:
+ node-version: '18.x'
+
+ - name: Set SSH Environment
+ env:
+ DOCS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }}
+ run: |
+ mkdir -p ~/.ssh/
+ echo "$ACTIONS_DEPLOY_KEY" > ~/.ssh/id_rsa
+ chmod 600 ~/.ssh/id_rsa
+ ssh-keyscan github.com > ~/.ssh/known_hosts
+ chmod 700 ~/.ssh && chmod 600 ~/.ssh/*
+ git config --local user.email "321200875@qq.com"
+ git config --local user.name "kailong321200875"
+
+ - name: Build Gitee
+ run: |
+ pnpm install --no-frozen-lockfile
+ pnpm run build:gitee
+
+ # 发布到 gitee
+ - name: Deploy Gitee
+ uses: peaceiris/actions-gh-pages@v3
+ with:
+ deploy_key: ${{secrets.ACTIONS_DEPLOY_KEY}}
+ publish_branch: gh-pages-gitee
+ publish_dir: ./dist-pro
+ force_orphan: true
+
+ - name: Sync Github Repos To Gitee # 名字随便起
+ uses: Yikun/hub-mirror-action@v1.1 # 使用Yikun/hub-mirror-action
+ with:
+ src: github/kailong321200875 # 源端账户名(github)
+ dst: gitee/kailong110120130 # 目的端账户名(gitee)
+ dst_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} # SSH密钥对中的私钥
+ dst_token: ${{ secrets.GITEE_TOKEN }} # Gitee账户的私人令牌
+ account_type: user # 账户类型
+ clone_style: 'https' # 使用https方式进行clone,也可以使用ssh
+ debug: true # 启用后会显示所有执行命令
+ force_update: true # 启用后,强制同步,即强制覆盖目的端仓库
+ static_list: 'vue-element-plus-admin' # 静态同步列表,在此填写需要同步的仓库名称,可填写多个
+ timeout: '600s' # git超时设置,超时后会自动重试git操作
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..2c11444
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,19 @@
+on:
+ push:
+ branches:
+ - release
+
+name: Release
+
+jobs:
+ release-please:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: GoogleCloudPlatform/release-please-action@v3
+ id: release
+ with:
+ token: ${{ secrets.TOKEN }}
+ default-branch: release
+ release-type: node
+ package-name: standard-version
+ changelog-types: '[{"type": "types", "section":"Types", "hidden": false},{"type": "revert", "section":"Reverts", "hidden": false},{"type": "feat", "section": "Features", "hidden": false},{"type": "fix", "section": "Bug Fixes", "hidden": false},{"type": "improvement", "section": "Feature Improvements", "hidden": false},{"type": "docs", "section":"Docs", "hidden": false},{"type": "style", "section":"Styling", "hidden": false},{"type": "refactor", "section":"Code Refactoring", "hidden": false},{"type": "perf", "section":"Performance Improvements", "hidden": false},{"type": "test", "section":"Tests", "hidden": false},{"type": "build", "section":"Build System", "hidden": false},{"type": "ci", "section":"CI", "hidden":false}]'
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..2c274c8
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,9 @@
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+/dist*
+pnpm-debug
+stats.html
+.idea
diff --git a/.husky/commit-msg b/.husky/commit-msg
new file mode 100644
index 0000000..34eed8b
--- /dev/null
+++ b/.husky/commit-msg
@@ -0,0 +1 @@
+npx --no -- commitlint --edit $1
\ No newline at end of file
diff --git a/.husky/lintstagedrc.cjs b/.husky/lintstagedrc.cjs
new file mode 100644
index 0000000..fd96fcb
--- /dev/null
+++ b/.husky/lintstagedrc.cjs
@@ -0,0 +1,9 @@
+module.exports = {
+ '*.{js,jsx,ts,tsx}': ['eslint --fix', 'prettier --write'],
+ '{!(package)*.json,*.code-snippets,.!(browserslist)*rc}': ['prettier --parser json --write'],
+ 'package.json': ['prettier --write'],
+ '*.vue': ['prettier --write', 'stylelint --fix'],
+ '*.{scss,less,styl,css,html}': ['stylelint --fix', 'prettier --write'],
+ '*.md': ['prettier --write'],
+ '*.hbs': ['prettier --write']
+}
diff --git a/.husky/pre-commit b/.husky/pre-commit
new file mode 100644
index 0000000..d96ed69
--- /dev/null
+++ b/.husky/pre-commit
@@ -0,0 +1,2 @@
+npm run ts:check
+npm run lint:lint-staged
\ No newline at end of file
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..4ff8c9d
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,9 @@
+/node_modules/**
+/dist/
+/dist*
+/public/*
+/docs/*
+/src/types/env.d.ts
+/docs/**/*
+/plop/**/*
+CHANGELOG
diff --git a/.stylelintignore b/.stylelintignore
new file mode 100644
index 0000000..aa605b4
--- /dev/null
+++ b/.stylelintignore
@@ -0,0 +1,6 @@
+/dist/*
+/public/*
+public/*
+/dist*
+/src/types/env.d.ts
+/docs/**/*
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..62a1b22
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,3 @@
+{
+ "recommendations": ["vue.volar", "lokalise.i18n-ally"]
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..c6be8a8
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,19 @@
+{
+ "typescript.tsdk": "node_modules/typescript/lib",
+ "prettier.enable": true,
+ "editor.codeActionsOnSave": {
+ "source.fixAll.eslint": "explicit"
+ },
+ "[vue]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "i18n-ally.localesPaths": ["src/locales"],
+ "i18n-ally.keystyle": "nested",
+ "i18n-ally.sortKeys": true,
+ "i18n-ally.namespace": false,
+ "i18n-ally.enabledParsers": ["ts"],
+ "i18n-ally.sourceLanguage": "en",
+ "i18n-ally.displayLanguage": "zh-CN",
+ "i18n-ally.enabledFrameworks": ["vue", "react"],
+ "god.tsconfig": "./tsconfig.json"
+}
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..9d8dadd
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,1421 @@
+# Changelog
+
+All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
+
+## [2.9.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.8.1...v2.9.0) (2024-09-07)
+
+
+### Features
+
+* The dialog supports custom-defined window size. [#527](https://github.com/kailong321200875/vue-element-plus-admin/issues/527) ([e6affad](https://github.com/kailong321200875/vue-element-plus-admin/commit/e6affad67fed5e815563396e7ce6ab816ee737ce))
+* 全局默认box-sizing: border-box;降低元素布局难度。 ([a27b14e](https://github.com/kailong321200875/vue-element-plus-admin/commit/a27b14e7ffeeeae6a212f262d20303db02b017f1))
+
+
+### Bug Fixes
+
+* VideoPlayer 的实例未赋值 [#524](https://github.com/kailong321200875/vue-element-plus-admin/issues/524) ([0e99f83](https://github.com/kailong321200875/vue-element-plus-admin/commit/0e99f8374a6c4aac19da9105c9b0c1f4950f87c7))
+* 修复husky问题 ([7b8e58e](https://github.com/kailong321200875/vue-element-plus-admin/commit/7b8e58e0ec81e99517cbca41e04930f013773380))
+* 修复isUrl判断错误bug [#526](https://github.com/kailong321200875/vue-element-plus-admin/issues/526) ([3cd89bd](https://github.com/kailong321200875/vue-element-plus-admin/commit/3cd89bdd09ee45d97d1ea41a5ee7686ca56c4ff2))
+* 修复在表格中给按钮添加link属性后,字体颜色变成白色 [#490](https://github.com/kailong321200875/vue-element-plus-admin/issues/490) ([5d9ca8a](https://github.com/kailong321200875/vue-element-plus-admin/commit/5d9ca8ac629adeb3d9c5fbf908502e597da7a168))
+* 修复新增权限时 id 缺失前端判断错误问题 ([88a0440](https://github.com/kailong321200875/vue-element-plus-admin/commit/88a04404d429e0a7e258fc8974e328dcbc04ae7a))
+* 修复示例图标错误 ([a07f4e9](https://github.com/kailong321200875/vue-element-plus-admin/commit/a07f4e9925ba15b3a94ddbea1908e42c2184b4cb))
+* 修复非一级子菜单显示位置错误;修改滚动条样式和系统滚动条样式一致 ([e0596ef](https://github.com/kailong321200875/vue-element-plus-admin/commit/e0596ef9f1f3ed022396961bf2a82665bebaecf7))
+* 左侧菜单收起后,组件菜单的子菜单显示不全 ([574055c](https://github.com/kailong321200875/vue-element-plus-admin/commit/574055c2749b9a183af44a0aaacab45f898cfff2))
+
+
+### Docs
+
+* 修改readme ([367b350](https://github.com/kailong321200875/vue-element-plus-admin/commit/367b3508e8efaf4b2b8383f44c3fea0e1dd09e8e))
+
+
+### Performance Improvements
+
+* 移除scrollbar__view高度限定。 ([18b08e2](https://github.com/kailong321200875/vue-element-plus-admin/commit/18b08e2983c116228de5282cd6e0c84884b24238))
+
+## [2.8.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.8.0...v2.8.1) (2024-06-20)
+
+
+### Bug Fixes
+
+* [#458](https://github.com/kailong321200875/vue-element-plus-admin/issues/458) ([49451ae](https://github.com/kailong321200875/vue-element-plus-admin/commit/49451ae606009d1f5ab0b98f84535892d3fd7646))
+* [#481](https://github.com/kailong321200875/vue-element-plus-admin/issues/481) ([c77586c](https://github.com/kailong321200875/vue-element-plus-admin/commit/c77586c5670cdc63978b032bbda694a14e875838))
+* 修复 search组件的收起展开 和重置 Bug ([9a5c7bc](https://github.com/kailong321200875/vue-element-plus-admin/commit/9a5c7bcb5b51e76eac6bc1d3aebc287593b13ca1))
+* 修复css前缀无法应用问题([#482](https://github.com/kailong321200875/vue-element-plus-admin/issues/482)) ([4b43c87](https://github.com/kailong321200875/vue-element-plus-admin/commit/4b43c87949fe4a68b4be004a06dfff4c7f87fbd4))
+* 修复表格default-expand-all属性无效BUG ([6657bbc](https://github.com/kailong321200875/vue-element-plus-admin/commit/6657bbc9f11f22cbfb04a57f5629bc810575496e))
+* 修复表格合计报错问题 ([9c44006](https://github.com/kailong321200875/vue-element-plus-admin/commit/9c44006ec26bee446dc5c90b6a4546cdd84ba4dc))
+
+
+### Styling
+
+* 修改登录页样式 ([9f98b7b](https://github.com/kailong321200875/vue-element-plus-admin/commit/9f98b7be266825612f93135c460d7db2d6a8beb0))
+
+
+### Performance Improvements
+
+* 优化使用离线图标后运行慢问题 ([7e9c4a6](https://github.com/kailong321200875/vue-element-plus-admin/commit/7e9c4a6109b417a577d9ac9ecf02db52eb1964af))
+
+## [2.8.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.7.0...v2.8.0) (2024-06-01)
+
+
+### Types
+
+* 修复Table类型错误 ([79b917a](https://github.com/kailong321200875/vue-element-plus-admin/commit/79b917af4957aa4b47db46e034385477828f5fca))
+
+
+### Features
+
+* Add a new component CodeEditor ([#466](https://github.com/kailong321200875/vue-element-plus-admin/issues/466)) ([00989b7](https://github.com/kailong321200875/vue-element-plus-admin/commit/00989b7ac9b92685be495c15c1f11dd2546eb6be))
+
+
+### Bug Fixes
+
+* [#427](https://github.com/kailong321200875/vue-element-plus-admin/issues/427) ([a00d76e](https://github.com/kailong321200875/vue-element-plus-admin/commit/a00d76e4149b430e19c985a78b9d89ce992dba3f))
+* [#428](https://github.com/kailong321200875/vue-element-plus-admin/issues/428) ([97a1cd4](https://github.com/kailong321200875/vue-element-plus-admin/commit/97a1cd41de82dad8855c95cec6bb106541fd53a7))
+* [#432](https://github.com/kailong321200875/vue-element-plus-admin/issues/432) ([df5b716](https://github.com/kailong321200875/vue-element-plus-admin/commit/df5b7166b48b7e0e77a1fb10ab6dd353d186547e))
+* [#438](https://github.com/kailong321200875/vue-element-plus-admin/issues/438) ([f977fdb](https://github.com/kailong321200875/vue-element-plus-admin/commit/f977fdb05d018ee07baeb6db454b9a77acb89f07))
+* [#451](https://github.com/kailong321200875/vue-element-plus-admin/issues/451) ([08665a3](https://github.com/kailong321200875/vue-element-plus-admin/commit/08665a35ac606549322039d073daf8072053eef4))
+* [#465](https://github.com/kailong321200875/vue-element-plus-admin/issues/465) ([8996e01](https://github.com/kailong321200875/vue-element-plus-admin/commit/8996e01ca35bfad8c13bef321f86bdd711202e12))
+* less 变量命名与 css 关键字冲突 [#475](https://github.com/kailong321200875/vue-element-plus-admin/issues/475) ([1c56e13](https://github.com/kailong321200875/vue-element-plus-admin/commit/1c56e13c5523a86d77464eccee26b5408db028c7))
+* 修复 lint-staged 中 prettier 以 json 格式美化代码的无效命令问题 ([7b2eae1](https://github.com/kailong321200875/vue-element-plus-admin/commit/7b2eae1d6aa813e162c3ad4a0553d2df480c765f))
+* 修复 Transfer 组件 optionApi 不生效 ([198718b](https://github.com/kailong321200875/vue-element-plus-admin/commit/198718b8749a036263d756f928b5dd38cfb47701))
+* 修复富文本编辑器初始化时, 报错 Error: Cannot find a descendant at path [0,1] in node ([a65d5fd](https://github.com/kailong321200875/vue-element-plus-admin/commit/a65d5fd20334307a56cb469361e8f9bd838510c9))
+* 修复组件-查询界面:收起和展开功能bug [#473](https://github.com/kailong321200875/vue-element-plus-admin/issues/473) ([8e58eae](https://github.com/kailong321200875/vue-element-plus-admin/commit/8e58eaeed6ea9beb749afaed75edc5a4f6d9867a))
+
+
+### Docs
+
+* 更新群二维码 ([2c89dbc](https://github.com/kailong321200875/vue-element-plus-admin/commit/2c89dbc884c38511d40c92480f65aef46511cefb))
+
+
+### Performance Improvements
+
+* 已经是 FormData 对象的不用再次转换 ([d582ad4](https://github.com/kailong321200875/vue-element-plus-admin/commit/d582ad428f4b378014d063635c4afbbad944a71a))
+
+## [2.7.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.6.0...v2.7.0) (2024-02-29)
+
+
+### Features
+
+* IAgree ([abb6906](https://github.com/kailong321200875/vue-element-plus-admin/commit/abb69064dfdb979e2843e3a1b62a2510f6ed3637))
+* 头像列表 ([3bf28a5](https://github.com/kailong321200875/vue-element-plus-admin/commit/3bf28a5d4555bf2a10754474db81d70b04ee432a))
+* 新增个人中心页 ([4146716](https://github.com/kailong321200875/vue-element-plus-admin/commit/4146716655bfbe4ae5b780e5b52a6377efd914ec))
+
+
+### Bug Fixes
+
+* 修复启动慢问题 ([61d7ef6](https://github.com/kailong321200875/vue-element-plus-admin/commit/61d7ef642a027e9e1f942bc84322233be3ca9a82))
+* 修复第四种布局样式层级问题([#424](https://github.com/kailong321200875/vue-element-plus-admin/issues/424)) ([78aeb89](https://github.com/kailong321200875/vue-element-plus-admin/commit/78aeb897fc93cfb998f94578d1fbe4480426843f))
+
+
+### Docs
+
+* 更新群二维码 ([c8c1a1b](https://github.com/kailong321200875/vue-element-plus-admin/commit/c8c1a1b6357105da73e23adff968c3f2fad7d837))
+
+## [2.6.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.6...v2.6.0) (2024-02-07)
+
+
+### Features
+
+* add vite-plugin-url-copy ([f5ab977](https://github.com/kailong321200875/vue-element-plus-admin/commit/f5ab9776a90e0136b243601571f4619c20da3ccd))
+
+
+### Bug Fixes
+
+* Table组件中size属性的validator设置错误 ([f30e37e](https://github.com/kailong321200875/vue-element-plus-admin/commit/f30e37ee777d4f30d4ae58c4a016a1392d41c25f))
+* Table组件注册为全局组件报错问题,存在对pinia的提前引用 ([1e209a7](https://github.com/kailong321200875/vue-element-plus-admin/commit/1e209a702a5114943a615063eefd0c00f1a6a003))
+* Table组件设置 align="center" 导致横向滚动条位置错误问题 ([22f071d](https://github.com/kailong321200875/vue-element-plus-admin/commit/22f071d9268806f7abd23ab2d08e9392e377a426))
+* 修复 element-plus 2.5版本以上,el-form-item inline模式下,select宽度问题 ([f44e48d](https://github.com/kailong321200875/vue-element-plus-admin/commit/f44e48d08d3f8dd347b829166107dd62e5e18c72))
+* 修复 prettier 报错 ([f5f08f8](https://github.com/kailong321200875/vue-element-plus-admin/commit/f5f08f8f87b063d489f55ea8f19c7c802acf15f7))
+* 修复 useCrudSchemas 详情组件数据结构文案不匹配问题 ([d94fc0a](https://github.com/kailong321200875/vue-element-plus-admin/commit/d94fc0a701bcbc9343ab3e7b630e3db8f6d61623))
+* 修复cutMenu布局刷新样式问题 ([03580b0](https://github.com/kailong321200875/vue-element-plus-admin/commit/03580b0ca0c8d088589ae1d8426b1535f654361b))
+* 修复Menu组件缩略菜单弹窗内样式不统一问题 ([d5dc4e3](https://github.com/kailong321200875/vue-element-plus-admin/commit/d5dc4e32d5978fcd271e841832c9cbf1e0c87db7))
+* 修复TagsView右键菜单逻辑错误 ([901c891](https://github.com/kailong321200875/vue-element-plus-admin/commit/901c891872ef6164e3517eb8e798d6039b7b7f4e))
+* 修复test打包VITE_USE_ONLINE_ICON无效问题 ([a3436a3](https://github.com/kailong321200875/vue-element-plus-admin/commit/a3436a32c6fd746e9e2af67c3cc5a8872aabf919))
+* 修复本地化图标空白问题 ([14ff83a](https://github.com/kailong321200875/vue-element-plus-admin/commit/14ff83affcd267fbdb405d2f46e9f929a1fbfaeb))
+* 修复请求示例中,mock开启时无法取消单个请求的问题 ([d6d70a4](https://github.com/kailong321200875/vue-element-plus-admin/commit/d6d70a443cccb2fe12161b57a1f227d1ed63384a))
+* 修改兼容方式,兼容Form 组件中contentMap中类输入框或下拉选择的所有组件,特殊兼容 InputNumber 组件 ([ab98ceb](https://github.com/kailong321200875/vue-element-plus-admin/commit/ab98ceb85f52c5f7b87c2114997c63f1b80f216f))
+* 更换判断条件 ([b5cb626](https://github.com/kailong321200875/vue-element-plus-admin/commit/b5cb626bfac4df8b1a0741b5000d5b22f6cd4555))
+
+
+### Docs
+
+* 修改群二维码 ([395ff68](https://github.com/kailong321200875/vue-element-plus-admin/commit/395ff68412ff71a9b8ce670c2399da285cfed67d))
+* 更新群二维码 ([c8ccaa8](https://github.com/kailong321200875/vue-element-plus-admin/commit/c8ccaa8d49b5bf7a2784a29af6e126657ce54cda))
+
+
+### Styling
+
+* 添加TabMenu边框 ([feb3d9a](https://github.com/kailong321200875/vue-element-plus-admin/commit/feb3d9a8d07f6444c39ca89f6eb63245c06783a0))
+
+## [2.5.6](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.5...v2.5.6) (2024-01-18)
+
+
+### Bug Fixes
+
+* [#396](https://github.com/kailong321200875/vue-element-plus-admin/issues/396) ([9b2b4d4](https://github.com/kailong321200875/vue-element-plus-admin/commit/9b2b4d42a6d5fffd5012506b7cac3892774c8595))
+* [#399](https://github.com/kailong321200875/vue-element-plus-admin/issues/399) ([59d4ed4](https://github.com/kailong321200875/vue-element-plus-admin/commit/59d4ed4dd9d6b6f0d5881b4d466e7a621770ad75))
+* 修复Form组件设置了hidden还是会出现占位空白 ([0f531fd](https://github.com/kailong321200875/vue-element-plus-admin/commit/0f531fd1d0469ddd56327b0a9a7956a0d6076c91))
+* 修复无法登录问题 ([8ce00ab](https://github.com/kailong321200875/vue-element-plus-admin/commit/8ce00ab247de4061cb56f9c2f6d3079abd39aefd))
+* 修复菜单管理回显问题 ([d9ca9ba](https://github.com/kailong321200875/vue-element-plus-admin/commit/d9ca9ba5e8111b7cc3758a8bba14f7fac45c9446))
+* 升级依赖,修复vue警告 ([eafb507](https://github.com/kailong321200875/vue-element-plus-admin/commit/eafb5075d587feac0501a1adae90a176a72c240f))
+
+
+### Docs
+
+* 更新README ([28bd10f](https://github.com/kailong321200875/vue-element-plus-admin/commit/28bd10f26373ad6e139b412e08d1e2afacc4ab92))
+
+
+### Styling
+
+* 调整样式 ([09b96c7](https://github.com/kailong321200875/vue-element-plus-admin/commit/09b96c75425cd2d931e7df4ef3f330b78bf74f9e))
+
+
+### Performance Improvements
+
+* request请求根据ContentType自动转换数据 ([ef9aa62](https://github.com/kailong321200875/vue-element-plus-admin/commit/ef9aa625724b754afc565b8b1f2589376f4d5c50))
+* 使用flex布局,优化section区域min-height的繁琐计算 ([fbb6f9a](https://github.com/kailong321200875/vue-element-plus-admin/commit/fbb6f9ad4b6d5fac9bb95d0a9250b5a318680d99))
+
+## [2.5.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.4...v2.5.5) (2024-01-06)
+
+
+### Bug Fixes
+
+* [#276](https://github.com/kailong321200875/vue-element-plus-admin/issues/276) ([6fbc2b0](https://github.com/kailong321200875/vue-element-plus-admin/commit/6fbc2b0243e4aec0463a734c37591dc3de40f7db))
+* el-button组件和其他部分使用到相关变量的组件无法适配主题色变化问题 ([00cac6a](https://github.com/kailong321200875/vue-element-plus-admin/commit/00cac6a831c2a0bb2f8a9df8b9264f1cad13ddde))
+
+
+### Styling
+
+* 菜单支持超出省略号 ([a926c56](https://github.com/kailong321200875/vue-element-plus-admin/commit/a926c5607a162145f77d35762b3d6730d67b23f6))
+* 菜单背景支持跟随暗黑模式 ([b34aeba](https://github.com/kailong321200875/vue-element-plus-admin/commit/b34aeba10a464a0f92752fc966386286443df53a))
+
+
+### Performance Improvements
+
+* 优化ImageCropping ([069777c](https://github.com/kailong321200875/vue-element-plus-admin/commit/069777c8801c51ab28c070b2ba3f10000e9c91b4))
+* 图标选择器逻辑优化 ([c2dde25](https://github.com/kailong321200875/vue-element-plus-admin/commit/c2dde252297c94036221d5d9971781182bc2998e))
+* 表格组件预览字段拆分 ([8c5858e](https://github.com/kailong321200875/vue-element-plus-admin/commit/8c5858e2c5d42db1de37d5290ea2ca784f4d4612))
+
+## [2.5.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.3...v2.5.4) (2023-12-26)
+
+
+### Types
+
+* 修复全局组件属性类型无法推导 ([94160c0](https://github.com/kailong321200875/vue-element-plus-admin/commit/94160c0418816e560f440e259e1f0fd4742e0143))
+
+
+### Bug Fixes
+
+* Menu菜单组件显示bug,renderMenuItem返回的数组存在undefined数据,导致省略菜单显示问题 ([1c63757](https://github.com/kailong321200875/vue-element-plus-admin/commit/1c63757d55076d15ffdf21d647de393ca3c6b0be))
+* useClipboard在ip地址下不能使用问题 ([f3593c4](https://github.com/kailong321200875/vue-element-plus-admin/commit/f3593c453a8b8d5eb8cbd0ed5402132b027461b9))
+* 修复request请求自定义headers类型错误 ([bf2cd72](https://github.com/kailong321200875/vue-element-plus-admin/commit/bf2cd720d0e5801603848a0b1520a928443ac549))
+* 修复切换主题色缓存失败 ([1074520](https://github.com/kailong321200875/vue-element-plus-admin/commit/10745207e64d2d444636cb9d877cec9a0bebf1eb))
+* 修复非正式环境打包报错 ([3a5db42](https://github.com/kailong321200875/vue-element-plus-admin/commit/3a5db42c97f382f3fc701b8f113385b38a214583))
+
+
+### Styling
+
+* 本地化图标 ([608bf50](https://github.com/kailong321200875/vue-element-plus-admin/commit/608bf50e1cae49b7f97587395f794ae351f833f0))
+* 添加常见问题链接 ([16b9375](https://github.com/kailong321200875/vue-element-plus-admin/commit/16b93757d32c8ce2f611a62d6015072b0ecfc09a))
+
+
+### Code Refactoring
+
+* 新增列设置 ([7314065](https://github.com/kailong321200875/vue-element-plus-admin/commit/7314065c907f8ef4d184c1f3c724b67c30410ab9))
+* 重写useEventBus ([8035151](https://github.com/kailong321200875/vue-element-plus-admin/commit/80351516ced0ec2d67c30405d4a644aca8ca4bc2))
+
+
+### Performance Improvements
+
+* 优化启动速度 ([379b340](https://github.com/kailong321200875/vue-element-plus-admin/commit/379b340750eb0d4f7816f5d7c25cbd2983fd33b9))
+* 还原mock.js ([83de387](https://github.com/kailong321200875/vue-element-plus-admin/commit/83de387e2a0124804a9c99080ac841a9d6676fca))
+
+## [2.5.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.2...v2.5.3) (2023-12-17)
+
+
+### Bug Fixes
+
+* [#374](https://github.com/kailong321200875/vue-element-plus-admin/issues/374) ([30fb2de](https://github.com/kailong321200875/vue-element-plus-admin/commit/30fb2de6f37fe0bb00b0f364da31b07a292d59a1))
+* 修复cutMenu布局和top布局内容高度计算错误问题 ([8badd48](https://github.com/kailong321200875/vue-element-plus-admin/commit/8badd48a699aabd8fe510052d098fa6848ff5cbd))
+* 修复动态路由多开标签页404问题 ([1c5b16f](https://github.com/kailong321200875/vue-element-plus-admin/commit/1c5b16f529d2e60a1eefcadf3f416585d1adb93b))
+* 修复类型推导错误 ([649fb17](https://github.com/kailong321200875/vue-element-plus-admin/commit/649fb17d000c0d500ffcfe1f9ab6ddd73ab7ecfa))
+* 修复项目配置清楚缓存无效 ([a09ee60](https://github.com/kailong321200875/vue-element-plus-admin/commit/a09ee60bb123f5bc4bbe6d80539145d5c4b94cb8))
+
+
+### Code Refactoring
+
+* 重构描述组件样式 ([c7658d8](https://github.com/kailong321200875/vue-element-plus-admin/commit/c7658d8c70618045a7527156444ba1d564963325))
+
+
+### Performance Improvements
+
+* 优化登录记住我流程 ([2009594](https://github.com/kailong321200875/vue-element-plus-admin/commit/2009594f089722151b739598dbad5ee7fb062b6e))
+
+## [2.5.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.1...v2.5.2) (2023-12-10)
+
+
+### Bug Fixes
+
+* 修复mock无法使用问题 ([319aaef](https://github.com/kailong321200875/vue-element-plus-admin/commit/319aaef7eec6287a0e80f25a479918d43c051810))
+
+## [2.5.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.0...v2.5.1) (2023-12-10)
+
+
+### Bug Fixes
+
+* 修复表单回车刷新页面 ([2f64836](https://github.com/kailong321200875/vue-element-plus-admin/commit/2f6483652b5d130057b4422b0f3350542b4b4b1d))
+* 表单布局方式为top时,查询组件按钮位置错位 ([ca98359](https://github.com/kailong321200875/vue-element-plus-admin/commit/ca983590da72cb13392cb8897f4045fbacbc6c8d))
+
+
+### Docs
+
+* 更新Readme ([81d2dc6](https://github.com/kailong321200875/vue-element-plus-admin/commit/81d2dc6a43df8fd5799461cdafc1b7e6054cf1e1))
+
+
+### Styling
+
+* 修改视频表格样式 ([93767b6](https://github.com/kailong321200875/vue-element-plus-admin/commit/93767b65aa7c41e28a8a79a82edd2a91d20bd176))
+* 抽离BaseButton,支持按钮修改主题色 ([69539ee](https://github.com/kailong321200875/vue-element-plus-admin/commit/69539ee2d34ddfcb83cbfb25e218b94891196e76))
+
+
+### Performance Improvements
+
+* [#344](https://github.com/kailong321200875/vue-element-plus-admin/issues/344) ([7fa533b](https://github.com/kailong321200875/vue-element-plus-admin/commit/7fa533b8ba0d886c0009b350a3b5fe4b027a9126))
+
+## [2.5.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.4.1...v2.5.0) (2023-12-03)
+
+
+### Types
+
+* 删除无用类型 ([30e4214](https://github.com/kailong321200875/vue-element-plus-admin/commit/30e421438793b8283a0113ba50eb9aef90cfed4e))
+
+
+### Features
+
+* VideoPlayer ([7b5bbed](https://github.com/kailong321200875/vue-element-plus-admin/commit/7b5bbedbccf56049ff611005ba17a0f07b07034d))
+* 持久化缓存 ([893459d](https://github.com/kailong321200875/vue-element-plus-admin/commit/893459da7cf819b6b94477cd76fdfeeecacc287f))
+* 新增ImageCropping ([b0a43a7](https://github.com/kailong321200875/vue-element-plus-admin/commit/b0a43a70e6c93690ba4b0779527316f40297a45d))
+* 新增userStore ([77c962e](https://github.com/kailong321200875/vue-element-plus-admin/commit/77c962ea91de68299a01680a7941cf7a73c7e4a7))
+* 新增表格视频预览 ([cfc2d54](https://github.com/kailong321200875/vue-element-plus-admin/commit/cfc2d54586e73353295e7b73e2bf39e4e4d03c96))
+* 替换mock-server插件 ([b8f9a99](https://github.com/kailong321200875/vue-element-plus-admin/commit/b8f9a9940d5eb3f532421b1b85aeb1f3d9afb4b1))
+* 替换mockjs ([7c76d94](https://github.com/kailong321200875/vue-element-plus-admin/commit/7c76d945be8c46b427fe65c728ae0e70ab7a5e91))
+* 重新整理目录结构,mock请求 ([179ab26](https://github.com/kailong321200875/vue-element-plus-admin/commit/179ab2672fe7fff55c8a9c55fae22a4b6c362623))
+
+
+### Bug Fixes
+
+* [#367](https://github.com/kailong321200875/vue-element-plus-admin/issues/367) ([c8400ab](https://github.com/kailong321200875/vue-element-plus-admin/commit/c8400abd9f37405127890be1c9a559edf9f251f8))
+
+
+### Styling
+
+* 格式化代码 ([31ea31d](https://github.com/kailong321200875/vue-element-plus-admin/commit/31ea31dde8a149f4fc805c08e4fca4e755c36752))
+* 表单项宽度默认100% ([416de2b](https://github.com/kailong321200875/vue-element-plus-admin/commit/416de2b4d644f68d7db379c7cb1139c8a17f64d7))
+
+
+### Performance Improvements
+
+* 新增token过期示例 ([bdc8d35](https://github.com/kailong321200875/vue-element-plus-admin/commit/bdc8d358a1ca8f5fc6b43990899834791364e4f2))
+
+## [2.4.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.4.0...v2.4.1) (2023-11-12)
+
+
+### Bug Fixes
+
+* [#361](https://github.com/kailong321200875/vue-element-plus-admin/issues/361) ([2e7797b](https://github.com/kailong321200875/vue-element-plus-admin/commit/2e7797be68b2469d979231e6588b43d0b5bdb88b))
+* Default currentSize ([af583c7](https://github.com/kailong321200875/vue-element-plus-admin/commit/af583c71b0d1760ba4ed4cfa12458820c3f4db52))
+* 修复瀑布流示例图片无法展示 ([3477173](https://github.com/kailong321200875/vue-element-plus-admin/commit/3477173b7649eb43a1e64c91135b0e657a3c7888))
+* 修复自动格式化无效 ([bd82108](https://github.com/kailong321200875/vue-element-plus-admin/commit/bd8210858126f945bad31b3f1e0416aa178afef1))
+
+
+### Styling
+
+* 修改样式 ([92d436b](https://github.com/kailong321200875/vue-element-plus-admin/commit/92d436b8bb95c94831fcfe30678d384c3debc052))
+
+
+### Performance Improvements
+
+* 优化权限管理 ([efc1c25](https://github.com/kailong321200875/vue-element-plus-admin/commit/efc1c25db86d28438a2c324a3dc302501e1fdf8f))
+* 优化瀑布流组件 ([82eb7f1](https://github.com/kailong321200875/vue-element-plus-admin/commit/82eb7f16ad3f663be602a747b55a78f6b986da30))
+
+## [2.4.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.3.0...v2.4.0) (2023-10-14)
+
+
+### Types
+
+* 修改类型错误 ([4760733](https://github.com/kailong321200875/vue-element-plus-admin/commit/4760733bbe39b547285894555754bae6539190f9))
+
+
+### Features
+
+* Waterfall ([d543e56](https://github.com/kailong321200875/vue-element-plus-admin/commit/d543e56efb3b3e5800ab3ec24eda25565311eda2))
+
+
+### Bug Fixes
+
+* [#342](https://github.com/kailong321200875/vue-element-plus-admin/issues/342) ([1c51221](https://github.com/kailong321200875/vue-element-plus-admin/commit/1c512216453b17c64a09f97263fd481816badf7c))
+* [#346](https://github.com/kailong321200875/vue-element-plus-admin/issues/346) ([d392868](https://github.com/kailong321200875/vue-element-plus-admin/commit/d392868c2799c2066ba606b0cdad95c011399559))
+* [#355](https://github.com/kailong321200875/vue-element-plus-admin/issues/355) ([03d5e13](https://github.com/kailong321200875/vue-element-plus-admin/commit/03d5e130146a662a8a312e6c49f995f85ea0f9d3))
+* **Descriptions:** Add a default value ([83b09f0](https://github.com/kailong321200875/vue-element-plus-admin/commit/83b09f09ffafb2a6273a1c5274e22f842c202c32))
+* table column 中定义 selectable 无效 ([b8e043c](https://github.com/kailong321200875/vue-element-plus-admin/commit/b8e043c09c74fe00521ac0d7390331b9f223c797))
+* Table的addColumn不能添加首列 ([240178f](https://github.com/kailong321200875/vue-element-plus-admin/commit/240178fd380402571fc056ddb9c8ae44ccb1e265))
+* 修复Waterfall列数错误BUG ([1c2befa](https://github.com/kailong321200875/vue-element-plus-admin/commit/1c2befa4ddc76c625774100e3f5dd5a68a6faa45))
+* 去除控制台警告 ([4d14246](https://github.com/kailong321200875/vue-element-plus-admin/commit/4d14246de50d2ba9d652ec5ef038f4fd3597006a))
+
+
+### Styling
+
+* Descriptions样式调整 ([be73f4d](https://github.com/kailong321200875/vue-element-plus-admin/commit/be73f4da3e4bbbacf3f748f7ebfd70f825e0d15e))
+* formDemo集成图标选择器 ([99ffe6a](https://github.com/kailong321200875/vue-element-plus-admin/commit/99ffe6a86ac9961ad5b9be0171b01acdfa0cf994))
+* 修改 Search 组件图标错误 ([7c93b74](https://github.com/kailong321200875/vue-element-plus-admin/commit/7c93b74e8f3e69d6c88ef2891eb6accc99a6a1e8))
+
+
+### Performance Improvements
+
+* IconPicker新增搜索功能 ([a4d1391](https://github.com/kailong321200875/vue-element-plus-admin/commit/a4d1391390bb33d498f2ec2cc64965f1a0b0aaab))
+* useClipboard ([1db2248](https://github.com/kailong321200875/vue-element-plus-admin/commit/1db22482b43f6fb7ca8321b838fb41a5b0aff62e))
+* useNetwork ([88be3ee](https://github.com/kailong321200875/vue-element-plus-admin/commit/88be3eea10196054596945af0eb9910e998dfd42))
+* 优化请求例子 ([6b3d2e1](https://github.com/kailong321200875/vue-element-plus-admin/commit/6b3d2e14985c1a7a3c68001e17820d0e7a833a56))
+* 完善demo ([2c4ff7d](https://github.com/kailong321200875/vue-element-plus-admin/commit/2c4ff7d190c816a92d92f9c2dbe048436b2bf964))
+* 新增请求示例 ([2762aaf](https://github.com/kailong321200875/vue-element-plus-admin/commit/2762aaf09b3616944476797a6e112c350c12a0ec))
+
+## [2.3.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.2.0...v2.3.0) (2023-09-24)
+
+
+### Features
+
+* IconPicker ([4490d5e](https://github.com/kailong321200875/vue-element-plus-admin/commit/4490d5eeeb4389f94f90c9c45a30343324db2250))
+* 表格工具栏新增列设置功能 ([9d10ba8](https://github.com/kailong321200875/vue-element-plus-admin/commit/9d10ba821feca414b9b020322859ca4a47291005))
+
+
+### Bug Fixes
+
+* [#326](https://github.com/kailong321200875/vue-element-plus-admin/issues/326) ([c95a4e0](https://github.com/kailong321200875/vue-element-plus-admin/commit/c95a4e0763838e843cf5ce174110a01f2baa8000))
+* default interceptor response return ([c3d8540](https://github.com/kailong321200875/vue-element-plus-admin/commit/c3d8540ab284312f24d9355072f6fb4506ed6d1d))
+* 修复IconPicker BUG ([1e3aa78](https://github.com/kailong321200875/vue-element-plus-admin/commit/1e3aa789260773b1caecdaa32e1cafede22733e3))
+* 修复useCrudSchemas无法自定义label ([aa5deb1](https://github.com/kailong321200875/vue-element-plus-admin/commit/aa5deb13904e45e7cb6ec7285e936b9ebae57273))
+
+
+### Docs
+
+* 更新README ([4947c82](https://github.com/kailong321200875/vue-element-plus-admin/commit/4947c82d6770f0dce2845682f0c41d853268cf82))
+* 更新README ([c3624ce](https://github.com/kailong321200875/vue-element-plus-admin/commit/c3624cee588457e7fedaab360746500337c1b2a7))
+* 更新群二维码 ([ead1ab8](https://github.com/kailong321200875/vue-element-plus-admin/commit/ead1ab8c88c05593d539b56a811809382675faf5))
+
+
+### Styling
+
+* 修复样式层级问题 ([f92d2b6](https://github.com/kailong321200875/vue-element-plus-admin/commit/f92d2b60a956e1963b63e23b446a9d42096704e0))
+* 修改登录样式 ([bdd31f0](https://github.com/kailong321200875/vue-element-plus-admin/commit/bdd31f0621712af89d89b87ac439c3e0b398605a))
+
+## [2.2.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.1.0...v2.2.0) (2023-08-27)
+
+
+### Features
+
+* JsonEditor ([c0f4517](https://github.com/kailong321200875/vue-element-plus-admin/commit/c0f4517b87de5a0172a057fb9da141f758cca1fa))
+* 新增 useCrudSchemas demo ([ae0628e](https://github.com/kailong321200875/vue-element-plus-admin/commit/ae0628e3af3466c7c9d7b593b825f776843de5ec))
+* 新增useTagsView ([a869a45](https://github.com/kailong321200875/vue-element-plus-admin/commit/a869a457e6a8052531ce3040ae0d332d7afbb478))
+
+
+### Bug Fixes
+
+* [#316](https://github.com/kailong321200875/vue-element-plus-admin/issues/316) ([7582e4d](https://github.com/kailong321200875/vue-element-plus-admin/commit/7582e4d12f18ae86f5ef4ff36211c364afca5763))
+* [#317](https://github.com/kailong321200875/vue-element-plus-admin/issues/317) ([2095caa](https://github.com/kailong321200875/vue-element-plus-admin/commit/2095caaa854b686b57f47ee183419f42563a5a95))
+* [#318](https://github.com/kailong321200875/vue-element-plus-admin/issues/318) ([4169e52](https://github.com/kailong321200875/vue-element-plus-admin/commit/4169e52baaaa43765848c29c5ce222d019e81c35))
+* [#319](https://github.com/kailong321200875/vue-element-plus-admin/issues/319) ([b6ee4e5](https://github.com/kailong321200875/vue-element-plus-admin/commit/b6ee4e5d48deb3a07f289366ed3700baa3674cd6))
+* 修复useValidator报错 ([4912f6c](https://github.com/kailong321200875/vue-element-plus-admin/commit/4912f6c0586249b3de7ac7d365c8ea98af7923c7))
+* 修复动态路由无效 ([1452a1a](https://github.com/kailong321200875/vue-element-plus-admin/commit/1452a1afc77eb3f64cd3de91a05ddc15e40f4a06))
+
+
+### Docs
+
+* 更新README ([5b4defa](https://github.com/kailong321200875/vue-element-plus-admin/commit/5b4defa8c4be2de894b2cb50ae9ea739a10cf7d9))
+* 更新群二维码 ([13aa71c](https://github.com/kailong321200875/vue-element-plus-admin/commit/13aa71c5bd5b5076599501961a24a171a9133c57))
+* 更新群二维码 ([ae29e97](https://github.com/kailong321200875/vue-element-plus-admin/commit/ae29e974bfed2214d1beda703b976cdfa63070ab))
+
+
+### Styling
+
+* 修改Descriptions样式 ([cd0e05a](https://github.com/kailong321200875/vue-element-plus-admin/commit/cd0e05a6b9146af7ae64be62613724cd58e6c2a3))
+
+
+### Code Refactoring
+
+* 重构useValidator ([b8849da](https://github.com/kailong321200875/vue-element-plus-admin/commit/b8849dabe2b306831f69e84db167a367570d992a))
+
+
+### Performance Improvements
+
+* 优化动态路由 ([8793588](https://github.com/kailong321200875/vue-element-plus-admin/commit/879358821d02d5e4575dfee0d189b9fee7f2e217))
+* 完善useTagsView ([e0c55f4](https://github.com/kailong321200875/vue-element-plus-admin/commit/e0c55f40d4c1c47e29de6c4c7e9433efa978bf7f))
+* 完善useTagsView ([175abd0](https://github.com/kailong321200875/vue-element-plus-admin/commit/175abd0aa3388e8473f6ecbf63e28133fce55bd3))
+* 更新demo ([2c99cd2](https://github.com/kailong321200875/vue-element-plus-admin/commit/2c99cd20f0c25a740ac7a3a8319f7a112e69c0d3))
+
+## [2.1.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.0.0...v2.1.0) (2023-08-12)
+
+
+### Features
+
+* 新增多开标签页Demo ([5c253ce](https://github.com/kailong321200875/vue-element-plus-admin/commit/5c253ce803a9ef7ce03534ddd5f0865db4602378))
+
+
+### Bug Fixes
+
+* [#307](https://github.com/kailong321200875/vue-element-plus-admin/issues/307) ([4ce07e1](https://github.com/kailong321200875/vue-element-plus-admin/commit/4ce07e150c0bd3903cc5f43fcd88c2cb292d7690))
+* [#311](https://github.com/kailong321200875/vue-element-plus-admin/issues/311) ([bdde4cc](https://github.com/kailong321200875/vue-element-plus-admin/commit/bdde4ccd39d5d698d68b299c6e80546d4a8be89f))
+* 修复eslint错误 ([b5e47e0](https://github.com/kailong321200875/vue-element-plus-admin/commit/b5e47e04d8f5f889e0c46a2dced108d058ded94e))
+* 修复Table插槽传参错误 ([97344e6](https://github.com/kailong321200875/vue-element-plus-admin/commit/97344e68f5abb144d9e5d4ad273108858dbcfba2))
+* 修复Table组件插槽传参错误 ([c83a026](https://github.com/kailong321200875/vue-element-plus-admin/commit/c83a026d559e2854fead17d2e28fbebcf25490de))
+
+
+### Docs
+
+* 修改Readme ([ee059b7](https://github.com/kailong321200875/vue-element-plus-admin/commit/ee059b7619ad01ded9d3be20287086ddbcce3253))
+* 修改Readme ([e05f5a7](https://github.com/kailong321200875/vue-element-plus-admin/commit/e05f5a77edc175daa267e4fc6abbcfc8fec2e291))
+* 修改Readme ([b0e561d](https://github.com/kailong321200875/vue-element-plus-admin/commit/b0e561d8acd36e8780087e317cc34257956981fd))
+* 修改Readme ([fced2e0](https://github.com/kailong321200875/vue-element-plus-admin/commit/fced2e0087694445a89cf360e5e3e3013d8ca604))
+* 修改README ([dce76f0](https://github.com/kailong321200875/vue-element-plus-admin/commit/dce76f042d5243039540828a3fd982af25f37531))
+* 更新群二维码 ([607ef58](https://github.com/kailong321200875/vue-element-plus-admin/commit/607ef585d010c9ade6f54d96c2a12b36099ece74))
+
+
+### Styling
+
+* 修改TabMenu样式 ([e8cd6f9](https://github.com/kailong321200875/vue-element-plus-admin/commit/e8cd6f9e1c4387c582e461cde4d59796bf17c1bd))
+
+## [2.0.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.10.0...v2.0.0) (2023-08-06)
+
+
+### ⚠ BREAKING CHANGES
+
+* 重构完成
+
+### Features
+
+* 重构完成 ([76e971e](https://github.com/kailong321200875/vue-element-plus-admin/commit/76e971ef96ad4f5cc7df58abd0559898ce70207d))
+
+
+### Code Refactoring
+
+* 重构完成 ([85f8cda](https://github.com/kailong321200875/vue-element-plus-admin/commit/85f8cda19d8cafb951f211b845aad970a661dd1e))
+* 重构完成 ([5d55597](https://github.com/kailong321200875/vue-element-plus-admin/commit/5d55597cca6c9d2bc6cb6211a01c161fa5f086ba))
+
+## [1.10.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.9...v1.10.0) (2023-08-06)
+
+
+### Types
+
+* Form类型调整 ([a0f4aeb](https://github.com/kailong321200875/vue-element-plus-admin/commit/a0f4aebc5a685366cd56b1a7bb39fa614976e3bb))
+* Form类型调整 ([674d760](https://github.com/kailong321200875/vue-element-plus-admin/commit/674d760029b451c0c6fc23a2aeac5c83992a0b27))
+* 修改类型 ([c3ac191](https://github.com/kailong321200875/vue-element-plus-admin/commit/c3ac1915045d4d59bca09ec6d19151bc5da342f1))
+* 修改类型 ([7d0476f](https://github.com/kailong321200875/vue-element-plus-admin/commit/7d0476f47c5858019db871cff2bdd19f0210f0d4))
+* 类型优化 ([283bc58](https://github.com/kailong321200875/vue-element-plus-admin/commit/283bc58d46151a8954bb81ee6bf8f499177b15fc))
+* 调整类型 ([24c8af9](https://github.com/kailong321200875/vue-element-plus-admin/commit/24c8af91835fb2c8c00e7c2673fff01f098c9944))
+* 迁移types ([ccbec86](https://github.com/kailong321200875/vue-element-plus-admin/commit/ccbec865568b1c9b3c3321d7071c164fdc350a0f))
+* 迁移types ([46b35e4](https://github.com/kailong321200875/vue-element-plus-admin/commit/46b35e48b3e7876c74159625b5149ef663396f5c))
+
+
+### Features
+
+* axios 改造 ([3238140](https://github.com/kailong321200875/vue-element-plus-admin/commit/32381408bbe418eeaca2a975305bac80ddaa03f5))
+* axios 改造 ([5807db1](https://github.com/kailong321200875/vue-element-plus-admin/commit/5807db1dc12a7ff2dbf66801a742a78974ad8f9c))
+* Descriptions组件重构 ([49e415d](https://github.com/kailong321200875/vue-element-plus-admin/commit/49e415d27788cb468c96f2a828f1df7ae65b7a3c))
+* Dialog组件重构 ([3701a04](https://github.com/kailong321200875/vue-element-plus-admin/commit/3701a04231af02ec7f7ef73533f3a22e707380fb))
+* Form useForm 完成 ([3e4e27c](https://github.com/kailong321200875/vue-element-plus-admin/commit/3e4e27c21fd59c944229856bee929f005d2ee140))
+* Form改造 ([9c724dc](https://github.com/kailong321200875/vue-element-plus-admin/commit/9c724dc9aad18397d5ecd00e53c3c24e142a34b5))
+* Icon改版 ([882f162](https://github.com/kailong321200875/vue-element-plus-admin/commit/882f162ff21c74239b638f284f52161e5791722d))
+* Radio改造 ([deeee73](https://github.com/kailong321200875/vue-element-plus-admin/commit/deeee73bcb3ad912844fddee62b1155d95d4b42b))
+* Radio改造 ([83513d5](https://github.com/kailong321200875/vue-element-plus-admin/commit/83513d519d4b6b8fbfd48db266b9bd7b3a998d63))
+* Search组件重构 ([a7f3702](https://github.com/kailong321200875/vue-element-plus-admin/commit/a7f370214481577ab82bf2871191dda717c7978a))
+* SelectV2改造完成 ([4d04734](https://github.com/kailong321200875/vue-element-plus-admin/commit/4d04734e13f6926c16aeee421feecb0d339534f0))
+* Table重构 ([94800b0](https://github.com/kailong321200875/vue-element-plus-admin/commit/94800b0120ee05ca7d534dda3e59653f38d7fda0))
+* 完善search组件demo ([cdf44a4](https://github.com/kailong321200875/vue-element-plus-admin/commit/cdf44a43a05010dbcba3a3ec0cb7c8251f16fce3))
+* 拖拽表格 ([b69b8ed](https://github.com/kailong321200875/vue-element-plus-admin/commit/b69b8ed1bde36100fc86e51fcc63805d4ea21210))
+* 新增TreeSelect表单项 ([de0cb43](https://github.com/kailong321200875/vue-element-plus-admin/commit/de0cb43566b9065250abbc71548ffeca4c8e8bf1))
+* 新增Uload ([c181887](https://github.com/kailong321200875/vue-element-plus-admin/commit/c181887f7f0c5eecc9584edfe99e9065440bdc56))
+* 新增useStorage ([dfea91c](https://github.com/kailong321200875/vue-element-plus-admin/commit/dfea91c7e1d18fa299067c62557cac61723ea861))
+* 新增权限测试页 ([3fe40ba](https://github.com/kailong321200875/vue-element-plus-admin/commit/3fe40ba62df29c2ffea9adfd65fc559489481e24))
+* 新增锁屏功能 ([e2fd349](https://github.com/kailong321200875/vue-element-plus-admin/commit/e2fd349070147c57f9400fa9a413260b7707bda2))
+* 用户列表重构 ([755cea0](https://github.com/kailong321200875/vue-element-plus-admin/commit/755cea0990d9e3b64c936f29c02e4053393a1a19))
+* 登录页改造 ([5312951](https://github.com/kailong321200875/vue-element-plus-admin/commit/5312951359b5d919b6c1a03783aa6bbaf8ec0044))
+* 综合示例重构 ([9a0259d](https://github.com/kailong321200875/vue-element-plus-admin/commit/9a0259de5c47970502db95f4dda24998ad5d9efe))
+* 菜单管理 ([c72b3a3](https://github.com/kailong321200875/vue-element-plus-admin/commit/c72b3a33aab7d3605770a64d23b8a84ef4ad68d2))
+* 角色管理 ([47016a5](https://github.com/kailong321200875/vue-element-plus-admin/commit/47016a535f2b7a22ab498bee197bc30a983f507d))
+* 部门管理 ([28d0785](https://github.com/kailong321200875/vue-element-plus-admin/commit/28d0785be842022cae7808c23e1f19eaab5fb996))
+* 重构Dialog组件示例 ([9a78ac9](https://github.com/kailong321200875/vue-element-plus-admin/commit/9a78ac977eb0cfb3bd6c2a9b96e69d9f010017f4))
+
+
+### Bug Fixes
+
+* mock数据 ([8bdac71](https://github.com/kailong321200875/vue-element-plus-admin/commit/8bdac7152f463cd98c50c9893a46bb6c111fd428))
+* 修复Form已知问题 ([097b32e](https://github.com/kailong321200875/vue-element-plus-admin/commit/097b32e1a9d92a609a66179d68b3dabe12f96b66))
+* 修复Table组件已知问题 ([b1a83f6](https://github.com/kailong321200875/vue-element-plus-admin/commit/b1a83f601838cb82fb29c036654a4cdc729997cd))
+* 修复类型错误 ([26dc886](https://github.com/kailong321200875/vue-element-plus-admin/commit/26dc886f8ccb5cf1ffc10e1d9601c827a1f960c2))
+* 样式问题修复 ([cdc7c76](https://github.com/kailong321200875/vue-element-plus-admin/commit/cdc7c76eb5ac3ccb79f5f55ff5b7ce6b8c4955e1))
+* 解决类型检测报错 ([9d93496](https://github.com/kailong321200875/vue-element-plus-admin/commit/9d9349600b3d2008e4216d49c9fa1c1b9995fa79))
+* 解决类型检测报错 ([513108c](https://github.com/kailong321200875/vue-element-plus-admin/commit/513108c00e622812e2e70dfe833435f6b5462d6e))
+* 解决类型检测报错 ([28bf8be](https://github.com/kailong321200875/vue-element-plus-admin/commit/28bf8bee45e3cc8575a356623abdbe56e30991f8))
+
+
+### Styling
+
+* Table样式修改 ([5fc57bd](https://github.com/kailong321200875/vue-element-plus-admin/commit/5fc57bdb08488f6898eafd6f28289b0567d6d9e2))
+* Table样式修改 ([411c0f7](https://github.com/kailong321200875/vue-element-plus-admin/commit/411c0f792ae8359c49e81974d8193f049120985b))
+* Table样式修改 ([d487c6a](https://github.com/kailong321200875/vue-element-plus-admin/commit/d487c6a93ec0281d76a3938e6e23ea2a4a7940c1))
+* Table样式修改 ([c7d21e3](https://github.com/kailong321200875/vue-element-plus-admin/commit/c7d21e36d012377ba863ac848d77abb5db4f475a))
+* Table样式修改 ([7f5078a](https://github.com/kailong321200875/vue-element-plus-admin/commit/7f5078a436c4d5abcaf7a420df35d2be9b3680c5))
+* 修改Dialog样式 ([e451bfc](https://github.com/kailong321200875/vue-element-plus-admin/commit/e451bfcde6e5a47d4b3022e240ffcc0576ebb9a8))
+* 修改样式 ([207c5b3](https://github.com/kailong321200875/vue-element-plus-admin/commit/207c5b3fc4e52bb06baa36cd4b659e14893785ba))
+* 完善角色管理 ([c4576bd](https://github.com/kailong321200875/vue-element-plus-admin/commit/c4576bd57bcf504733f20188202ea7d33ab1c184))
+* 布局样式优化 ([962689a](https://github.com/kailong321200875/vue-element-plus-admin/commit/962689a8bd0ed5eb17d946b8a21dec4a197f13a7))
+* 样式布局调整完成 ([7193176](https://github.com/kailong321200875/vue-element-plus-admin/commit/719317694f71e22692256bb557070343f034ffe5))
+* 用户管理样式修改 ([57a5fa7](https://github.com/kailong321200875/vue-element-plus-admin/commit/57a5fa7b82ae9f3d7a1f8ec5391f14b1d1cd32e8))
+* 移除不必要样式 ([7ef1d1e](https://github.com/kailong321200875/vue-element-plus-admin/commit/7ef1d1e3013cc5bf7fc574e67c2004f50792e66d))
+* 移除不必要样式 ([366db45](https://github.com/kailong321200875/vue-element-plus-admin/commit/366db4528254d18659e6a922817702b5b92a57b0))
+* 调整Icon悬停样式 ([64c7e48](https://github.com/kailong321200875/vue-element-plus-admin/commit/64c7e48bd18ba83e605daccbc4c2f4cc6b58695d))
+* 调整工作台样式错乱 ([cc18f29](https://github.com/kailong321200875/vue-element-plus-admin/commit/cc18f297ef50655d5773d01fcfddabc365dc53e7))
+
+
+### Performance Improvements
+
+* Dialog默认高度修改 ([0e04fce](https://github.com/kailong321200875/vue-element-plus-admin/commit/0e04fce4367d6829e8de97a249318b0309e06fd5))
+* Form Table Search Descriptions 支持嵌套赋值 ([46ddf62](https://github.com/kailong321200875/vue-element-plus-admin/commit/46ddf62d2d4ce1a653f47695cb0bb3475aa16bd8))
+* ImageViewer组件优化 ([3b9c3d8](https://github.com/kailong321200875/vue-element-plus-admin/commit/3b9c3d8b757646eaf74625403112a969bfd15e55))
+* 优化Form事件传递 ([69cafb3](https://github.com/kailong321200875/vue-element-plus-admin/commit/69cafb3b7b2ce7ecbd9f2e8ef09e250817e9a55c))
+* 优化Search组件 ([e548668](https://github.com/kailong321200875/vue-element-plus-admin/commit/e548668ccef8c41d9ac7d9fe39ffe66471d160d2))
+* 优化表单组件 ([77a3866](https://github.com/kailong321200875/vue-element-plus-admin/commit/77a38662488ab9ff4cbe5ff3cf9b65eea34abca1))
+* 优化锁屏组件 ([4f8330a](https://github.com/kailong321200875/vue-element-plus-admin/commit/4f8330a4faf6cc98a9bac17bd3e1719ae1b30c81))
+
+## [1.9.9](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.8...v1.9.9) (2023-04-13)
+
+
+### Bug Fixes
+
+* 使用动态路由时,多级路由只有一个子路且父路由未使用alwaysShow时,子路由未添加至路由中 ([9b330a1](https://github.com/kailong321200875/vue-element-plus-admin/commit/9b330a1f513d3af9233b9a9dde6bdfeeefbc3393))
+
+## [1.9.8](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.7...v1.9.8) (2023-04-12)
+
+
+### Bug Fixes
+
+* 修复已知问题 ([0a6f306](https://github.com/kailong321200875/vue-element-plus-admin/commit/0a6f306686ea024e30bcdccac34e485b8526e38f))
+
+## [1.9.7](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.6...v1.9.7) (2023-03-28)
+
+
+### Bug Fixes
+
+* 修复表格与搜索框字段不能不一致的问题 ([5c1cd29](https://github.com/kailong321200875/vue-element-plus-admin/commit/5c1cd298defefb36b858adc766b776a0a7b9bd66))
+
+## [1.9.6](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.5...v1.9.6) (2023-03-22)
+
+
+### Bug Fixes
+
+* 修改 Editor 的 z-index 使其不会遮挡『综合示例 - 新增』界面的下拉菜单 ([c046e45](https://github.com/kailong321200875/vue-element-plus-admin/commit/c046e4554ba8fd99614484d8fb636650072b833e))
+
+## [1.9.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.4...v1.9.5) (2023-03-13)
+
+
+### Bug Fixes
+
+* 面包屑:1.修复使用动态路由的时候,无法显示的bug ([8790c8c](https://github.com/kailong321200875/vue-element-plus-admin/commit/8790c8cbd8d63ea0f8f276fd5af006f39b06e7d3))
+
+## [1.9.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.3...v1.9.4) (2023-03-03)
+
+
+### Bug Fixes
+
+* 修复已知BUG ([782b8e2](https://github.com/kailong321200875/vue-element-plus-admin/commit/782b8e2f94c867c3ee282287c37c888fff93fc55))
+
+## [1.9.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.2...v1.9.3) (2023-03-01)
+
+
+### Types
+
+* 修复类型错误 ([297b2c6](https://github.com/kailong321200875/vue-element-plus-admin/commit/297b2c69a239b487126c3b9316645a1b5f06bb7c))
+
+
+### Styling
+
+* 抽屉弹出样式问题 ([16a3eef](https://github.com/kailong321200875/vue-element-plus-admin/commit/16a3eef85a1ffb296bd44f67d89a911ecaf1c25e))
+* 调整主题切换样式 ([6e6beef](https://github.com/kailong321200875/vue-element-plus-admin/commit/6e6beefc3c380f7297985adcabcf966fbd2c5197))
+
+## [1.9.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.1...v1.9.2) (2023-01-16)
+
+
+### Bug Fixes
+
+* 修复TS类型错误 ([1c06a27](https://github.com/kailong321200875/vue-element-plus-admin/commit/1c06a27b900a891cd0b47098062cebc984ff6505))
+
+## [1.9.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.0...v1.9.1) (2023-01-11)
+
+
+### Bug Fixes
+
+* dark mode toggle ([bbc7646](https://github.com/kailong321200875/vue-element-plus-admin/commit/bbc764601ec864c2fdbe3ad78c083c5ae80615e0))
+
+## [1.9.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.7...v1.9.0) (2022-12-28)
+
+
+### Features
+
+* 添加打包进度条 ([354e87f](https://github.com/kailong321200875/vue-element-plus-admin/commit/354e87f7c533ad8e93ef484b47d0fe16f17048c9))
+
+
+### Bug Fixes
+
+* husky ([6fe5b2e](https://github.com/kailong321200875/vue-element-plus-admin/commit/6fe5b2e6c781b251bff5f0ac936c04dcfe5ef95f))
+
+## [1.8.7](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.6...v1.8.7) (2022-12-05)
+
+
+### Bug Fixes
+
+* 解决iframe无法正常工作 ([4fcc46f](https://github.com/kailong321200875/vue-element-plus-admin/commit/4fcc46fccf747b47909e2079c4f2abc5dbfb1a0c))
+
+## [1.8.6](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.5...v1.8.6) (2022-11-21)
+
+
+### Bug Fixes
+
+* 修复Search组件无法默认值 ([3368fda](https://github.com/kailong321200875/vue-element-plus-admin/commit/3368fda251bd3ff5a8e0059b3b33f9c0339d236b))
+
+## [1.8.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.4...v1.8.5) (2022-11-17)
+
+
+### Bug Fixes
+
+* 修复Form赋值问题 ([f37cc1b](https://github.com/kailong321200875/vue-element-plus-admin/commit/f37cc1b5801add3ada168dbbcf4cd2c340f0e30d))
+
+## [1.8.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.3...v1.8.4) (2022-11-07)
+
+
+### Bug Fixes
+
+* 修复option禁用属性无效 ([0b671e9](https://github.com/kailong321200875/vue-element-plus-admin/commit/0b671e914e396c7666ad5e34768a6e29f7dfbd33))
+
+
+### Styling
+
+* input默认宽度与select对齐 ([0b671e9](https://github.com/kailong321200875/vue-element-plus-admin/commit/0b671e914e396c7666ad5e34768a6e29f7dfbd33))
+
+## [1.8.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.2...v1.8.3) (2022-10-28)
+
+
+### Performance Improvements
+
+* 优化描述组件 ([73ecc98](https://github.com/kailong321200875/vue-element-plus-admin/commit/73ecc98671d430013920246d98ce9ab1752e56eb))
+
+## [1.8.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.1...v1.8.2) (2022-10-18)
+
+
+### Bug Fixes
+
+* Correct spelling of words(aciton →action) ([eb405b2](https://github.com/kailong321200875/vue-element-plus-admin/commit/eb405b2a9041ca0ad4455db79bf617ec910dc485))
+* Correct spelling of words(tigger →trigger) ([c2ca2d7](https://github.com/kailong321200875/vue-element-plus-admin/commit/c2ca2d736c92e02380923a6741450844acb41a38))
+
+## [1.8.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.0...v1.8.1) (2022-10-11)
+
+
+### Bug Fixes
+
+* 修复cutMenu收起时 ([993af6b](https://github.com/kailong321200875/vue-element-plus-admin/commit/993af6bb6576249e66e0c0ea592ebf851f65ab8c))
+
+
+### Styling
+
+* cutMenu层级样式 ([32d2408](https://github.com/kailong321200875/vue-element-plus-admin/commit/32d2408588c487cff2cf73e3cc132e5105ff4459))
+
+## [1.8.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.7.1...v1.8.0) (2022-10-10)
+
+
+### Features
+
+* types优化 ([3351155](https://github.com/kailong321200875/vue-element-plus-admin/commit/33511553cd9055b036b2d7491f9c2eda123f8b22))
+
+
+### Styling
+
+* 优化第四种布局 ([122fa62](https://github.com/kailong321200875/vue-element-plus-admin/commit/122fa62d859413d16175e0d97c7bf13f232dbb3a))
+
+## [1.7.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.7.0...v1.7.1) (2022-10-10)
+
+
+### Bug Fixes
+
+* 修正types提示错误 ([ef3e006](https://github.com/kailong321200875/vue-element-plus-admin/commit/ef3e006859dcd8b93ffb7cffcaeae24cbb330f2a))
+
+## [1.7.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.6...v1.7.0) (2022-10-09)
+
+
+### Features
+
+* type抽离 ([8b4fa1a](https://github.com/kailong321200875/vue-element-plus-admin/commit/8b4fa1aa21aa2c1379288315ccd64a6f3375be51))
+
+## [1.6.6](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.5...v1.6.6) (2022-10-09)
+
+
+### Bug Fixes
+
+* table search params ([a62929a](https://github.com/kailong321200875/vue-element-plus-admin/commit/a62929a8dac21028d3dd1cddf98189492c33b093))
+
+## [1.6.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.4...v1.6.5) (2022-10-08)
+
+
+### Bug Fixes
+
+* The attribute of option does not work ([d946920](https://github.com/kailong321200875/vue-element-plus-admin/commit/d946920e61ed81beacf9f1f8be7ee1f50505f64d))
+
+
+### Performance Improvements
+
+* perf store ([d416178](https://github.com/kailong321200875/vue-element-plus-admin/commit/d416178d69ca6100be4b635922b1a22d27629f08))
+* token test ([b320e65](https://github.com/kailong321200875/vue-element-plus-admin/commit/b320e658d1a559a6eaebdf374d63649c223c2ecd))
+
+## [1.6.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.3...v1.6.4) (2022-09-21)
+
+
+### Bug Fixes
+
+* fix bug ([da39f3b](https://github.com/kailong321200875/vue-element-plus-admin/commit/da39f3bc904ca2d80f432a31709725f9a57deb19))
+
+## [1.6.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.2...v1.6.3) (2022-08-20)
+
+
+### Bug Fixes
+
+* 修复重定向错误 ([89d03fd](https://github.com/kailong321200875/vue-element-plus-admin/commit/89d03fd067e7aca565ceb84ea9276f340bbfcb60))
+
+
+### Styling
+
+* 调整样式 ([d29e151](https://github.com/kailong321200875/vue-element-plus-admin/commit/d29e151f8a660031a685f6ef9f789532b1b7b58b))
+
+## [1.6.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.1...v1.6.2) (2022-08-13)
+
+
+### Styling
+
+* Misspelling ([c43e833](https://github.com/kailong321200875/vue-element-plus-admin/commit/c43e833582e4f14ac78b0683f1eb3bdeb9fb4821))
+* perfect tableDemo ([c589edd](https://github.com/kailong321200875/vue-element-plus-admin/commit/c589edd960b23ad0c8b56d2c7880b61014114d45))
+
+
+### Code Refactoring
+
+* refactor axios ([0980640](https://github.com/kailong321200875/vue-element-plus-admin/commit/0980640f65fc80e3e58ba49e98db10b7b1b80077))
+
+## [1.6.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.0...v1.6.1) (2022-07-30)
+
+
+### Bug Fixes
+
+* fix menu active bug ([ff59fc7](https://github.com/kailong321200875/vue-element-plus-admin/commit/ff59fc7e133202945360a7e210f9cdf3a4a89dd7))
+* Pie chart data not updated ([55d4ce7](https://github.com/kailong321200875/vue-element-plus-admin/commit/55d4ce7e35ff9a0c5590bc3589160cfd304d3ae5))
+
+
+### Performance Improvements
+
+* add static router ([55522b0](https://github.com/kailong321200875/vue-element-plus-admin/commit/55522b0661a8df3ad3c8afafcc9f8fcb162c5a00))
+
+
+### Styling
+
+* tagviews styles update ([bff7d93](https://github.com/kailong321200875/vue-element-plus-admin/commit/bff7d9370db7a9c171828721bb99643dac2f235d))
+
+## [1.6.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.5.4...v1.6.0) (2022-07-18)
+
+
+### Features
+
+* 添加按钮权限 ([7bef662](https://github.com/kailong321200875/vue-element-plus-admin/commit/7bef662db1e91aa8164e9f7a92de3fe4480a3c3b))
+
+
+### Performance Improvements
+
+* 移除md5依赖 ([a123097](https://github.com/kailong321200875/vue-element-plus-admin/commit/a123097f1f38eac45e945c7d3fdccafc16ea9b69))
+
+
+### Styling
+
+* 压缩图片尺寸 ([ae3c565](https://github.com/kailong321200875/vue-element-plus-admin/commit/ae3c5657b604ffbdae5ce3ce3603626ad4acc5e5))
+
+
+### Docs
+
+* vite2 to vite3 ([b3918b9](https://github.com/kailong321200875/vue-element-plus-admin/commit/b3918b9c3c5de4b48811ec95967851cfb3c231e1))
+* vite2 to vite3 ([aaf07de](https://github.com/kailong321200875/vue-element-plus-admin/commit/aaf07de77aa600332880a894faa35757f787c012))
+
+## [1.6.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.5.4...v1.6.0) (2022-07-18)
+
+
+### Features
+
+* 添加按钮权限 ([7bef662](https://github.com/kailong321200875/vue-element-plus-admin/commit/7bef662db1e91aa8164e9f7a92de3fe4480a3c3b))
+
+
+### Performance Improvements
+
+* 移除md5依赖 ([a123097](https://github.com/kailong321200875/vue-element-plus-admin/commit/a123097f1f38eac45e945c7d3fdccafc16ea9b69))
+
+
+### Styling
+
+* 压缩图片尺寸 ([ae3c565](https://github.com/kailong321200875/vue-element-plus-admin/commit/ae3c5657b604ffbdae5ce3ce3603626ad4acc5e5))
+
+
+### Docs
+
+* vite2 to vite3 ([b3918b9](https://github.com/kailong321200875/vue-element-plus-admin/commit/b3918b9c3c5de4b48811ec95967851cfb3c231e1))
+* vite2 to vite3 ([aaf07de](https://github.com/kailong321200875/vue-element-plus-admin/commit/aaf07de77aa600332880a894faa35757f787c012))
+
+## [1.5.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.5.3...v1.5.4) (2022-07-16)
+
+
+### Bug Fixes
+
+* fix build:test error ([14530cf](https://github.com/kailong321200875/vue-element-plus-admin/commit/14530cf790bfbbe37c72fa831f0376bbb4209e9d))
+
+## [1.5.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.5.2...v1.5.3) (2022-07-01)
+
+
+### Bug Fixes
+
+* fix useCrudSchemas not work ([0a855b9](https://github.com/kailong321200875/vue-element-plus-admin/commit/0a855b93e282dfe7863b3fce31dde5d7e0d3e2b6))
+
+## [1.5.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.5.1...v1.5.2) (2022-07-01)
+
+
+### Performance Improvements
+
+* add useCrudSchemas demo ([ca3ce54](https://github.com/kailong321200875/vue-element-plus-admin/commit/ca3ce54630b723d87415b14c642440d6734876ff))
+
+## [1.5.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.5.0...v1.5.1) (2022-07-01)
+
+
+### Bug Fixes
+
+* change showMainRoute to canTo ([5e292f8](https://github.com/kailong321200875/vue-element-plus-admin/commit/5e292f8a2b2ded7297a2a76893e113ac81517d23))
+
+
+### Performance Improvements
+
+* dialog combine with form ([34aefb6](https://github.com/kailong321200875/vue-element-plus-admin/commit/34aefb64ab9237521a1225925264818eebff9ad3))
+* dynamic options demo ([1acb4d7](https://github.com/kailong321200875/vue-element-plus-admin/commit/1acb4d7e8f449ba342699f1b4387ac2404a4c1fb))
+* dynamic options demo ([9a3b617](https://github.com/kailong321200875/vue-element-plus-admin/commit/9a3b6177aa0fbc99c86c5073a1c6c696e1eaf890))
+* useCrudSchemas cutom label ([7864d83](https://github.com/kailong321200875/vue-element-plus-admin/commit/7864d830e2134d814609e722b7bad1754ea9460e))
+
+## [1.5.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.4.5...v1.5.0) (2022-06-25)
+
+
+### Features
+
+* refactoring API ([37b7583](https://github.com/kailong321200875/vue-element-plus-admin/commit/37b75839a591648b145065432efb1dc8c7a3b917))
+
+
+### Bug Fixes
+
+* 修复axios已知问题 ([537af57](https://github.com/kailong321200875/vue-element-plus-admin/commit/537af57a0aaa24c88ebe75acf52dc0403a58b04b))
+
+
+### Performance Improvements
+
+* perf axios config ([39edd84](https://github.com/kailong321200875/vue-element-plus-admin/commit/39edd84023109a84683c21ea33e41bd024756520))
+
+## [1.4.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.4.4...v1.4.5) (2022-06-09)
+
+
+### Bug Fixes
+
+* fix tagsview not work ([d88e051](https://github.com/kailong321200875/vue-element-plus-admin/commit/d88e0514349e877f1c5280a48f9b1bd2bfd622bf))
+* fix tagsview not work ([1bf2d4c](https://github.com/kailong321200875/vue-element-plus-admin/commit/1bf2d4c77287fdca7ed1cb8c9998a53f1375dc6f))
+
+
+### Types
+
+* fix types error ([586486a](https://github.com/kailong321200875/vue-element-plus-admin/commit/586486a68d4bf2a024e50a79945b4007324f642d))
+
+## [1.4.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.4.3...v1.4.4) (2022-06-06)
+
+
+### Types
+
+* fix type error ([d66f12e](https://github.com/kailong321200875/vue-element-plus-admin/commit/d66f12e0e77f6acf485bae06509d9ea4abcd1eaa))
+
+### [1.4.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.4.2...v1.4.3) (2022-06-01)
+
+
+### Bug Fixes
+
+* multiple requests when pageSize change and currentPage isn't 1 ([f71a250](https://github.com/kailong321200875/vue-element-plus-admin/commit/f71a2503bc521c01e7102feecf4ec39a5224a6bb))
+
+### [1.4.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.4.1...v1.4.2) (2022-05-15)
+
+
+### Styling
+
+* fix dark mode bug ([2f9fd5d](https://github.com/kailong321200875/vue-element-plus-admin/commit/2f9fd5d21550d771ec12ae3540b975e2eebcd25b))
+
+### [1.4.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.4.0...v1.4.1) (2022-05-12)
+
+
+### Bug Fixes
+
+* the warning of VSCode extensions ([a368c21](https://github.com/kailong321200875/vue-element-plus-admin/commit/a368c21fb9c41f98f31f51586a2023076a8a9132))
+
+## [1.4.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.3.2...v1.4.0) (2022-05-10)
+
+
+### Features
+
+* add dark mode ([0758a6a](https://github.com/kailong321200875/vue-element-plus-admin/commit/0758a6a9d83170e53d45d39c3313e52ff5885746))
+
+### [1.3.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.3.1...v1.3.2) (2022-05-07)
+
+
+### Bug Fixes
+
+* fix the problem that the page is stuck in top mode ([8d01f48](https://github.com/kailong321200875/vue-element-plus-admin/commit/8d01f48d5098195b10c03b3cb3a0f485ebc9e018))
+
+### [1.3.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.3.0...v1.3.1) (2022-05-06)
+
+
+### Bug Fixes
+
+* spelling 'useRenderChcekbox' ([ee92f03](https://github.com/kailong321200875/vue-element-plus-admin/commit/ee92f039bea4307ccfb819728d3e2ed04fa00e03))
+
+## [1.3.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.13...v1.3.0) (2022-04-26)
+
+
+### Features
+
+* add useCrudSchemas hook ([00d947e](https://github.com/kailong321200875/vue-element-plus-admin/commit/00d947e2f81105194b0622d33768f999e37ad28a))
+
+
+### Bug Fixes
+
+* fix Table slot warning ([0eac05d](https://github.com/kailong321200875/vue-element-plus-admin/commit/0eac05d4f973ff7b15e00973f6e96595a3cd6d43))
+
+
+### Code Refactoring
+
+* refactor useAxios ([185f1e6](https://github.com/kailong321200875/vue-element-plus-admin/commit/185f1e6e210ecaac28ebfdee4198b7ca2eaa0933))
+
+
+### Build System
+
+* add url ([ab0f59a](https://github.com/kailong321200875/vue-element-plus-admin/commit/ab0f59ac91a077cf060923fa76e6d57e05d0b21b))
+* update plugins ([c475a61](https://github.com/kailong321200875/vue-element-plus-admin/commit/c475a610c19094034306f2dc665e240c7c117f87))
+* update plugins ([dfedbc7](https://github.com/kailong321200875/vue-element-plus-admin/commit/dfedbc74fdb2c819a96b6263849bdaab59b9e337))
+
+### [1.2.13](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.12...v1.2.13) (2022-04-18)
+
+
+### Performance Improvements
+
+* Editor component support v-model ([d77f8e3](https://github.com/kailong321200875/vue-element-plus-admin/commit/d77f8e334d77ee43c9ee0f411733f7397b278bc0))
+
+### [1.2.12](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.11...v1.2.12) (2022-04-17)
+
+
+### Bug Fixes
+
+* fixed spelling 'ElememtPlusSzie' ([5dbbc60](https://github.com/kailong321200875/vue-element-plus-admin/commit/5dbbc608640d93fe68fec6f58fdb30a43e02aada))
+
+### [1.2.11](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.10...v1.2.11) (2022-04-14)
+
+
+### Bug Fixes
+
+* fix the error reported by the Editor component ([7dc6d8a](https://github.com/kailong321200875/vue-element-plus-admin/commit/7dc6d8a9d7289bfaf27f972e9ca1773c0a1ddd7d))
+* fix the error reported by the Editor component ([90ef985](https://github.com/kailong321200875/vue-element-plus-admin/commit/90ef9856a0885fa812339cb7047ecc98b86c7b73))
+
+
+### Performance Improvements
+
+* add tagsViewIcon setting ([d395f03](https://github.com/kailong321200875/vue-element-plus-admin/commit/d395f03a57a9265f1d39b3220fc7c9b983efee30))
+* add uniqueopened setting ([b060319](https://github.com/kailong321200875/vue-element-plus-admin/commit/b0603199a5ae0ee923483dad449f49220d36f444))
+
+
+### Build System
+
+* update plugins ([2ee4954](https://github.com/kailong321200875/vue-element-plus-admin/commit/2ee49549e7b601af26ef5204f7648d271f3348f2))
+
+
+### Styling
+
+* add layout background color ([9b614fe](https://github.com/kailong321200875/vue-element-plus-admin/commit/9b614fe89288538197c50f164586aeed7836b7a8))
+
+### [1.2.10](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.9...v1.2.10) (2022-04-12)
+
+
+### Bug Fixes
+
+* fix bug ([327522f](https://github.com/kailong321200875/vue-element-plus-admin/commit/327522f2b73ae0e11f8ebbc39394b06029ce0b65))
+
+
+### Styling
+
+* modify the commitlint package manager ([ba7e722](https://github.com/kailong321200875/vue-element-plus-admin/commit/ba7e7224ab58612548519415f5429c32827a61de))
+
+### [1.2.9](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.8...v1.2.9) (2022-04-12)
+
+
+### Docs
+
+* update changlog ([e37273d](https://github.com/kailong321200875/vue-element-plus-admin/commit/e37273d95d29a3bb752604658d550264aacdc979))
+
+### [1.2.8](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.7...v1.2.8) (2022-04-11)
+
+### Build System
+
+- update plugins ([00a573a](https://github.com/kailong321200875/vue-element-plus-admin/commit/00a573af3f455395b4ee2ab99a03f3103d466e9c))
+
+### Docs
+
+- update changlog ([62fc183](https://github.com/kailong321200875/vue-element-plus-admin/commit/62fc1839fdff3a4d06a7db4cf3f8ce2cb9aee681))
+
+### [1.2.7](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.6...v1.2.7) (2022-04-10)
+
+### Build System
+
+- update plugins ([f13a91d](https://github.com/kailong321200875/vue-element-plus-admin/commit/f13a91dd460b1dcdbd17aef723ab3ca2b01c34f0))
+
+### Styling
+
+- .bhs code formatting ([57b2707](https://github.com/kailong321200875/vue-element-plus-admin/commit/57b27071e9a33423c46542a5d0e5d5c2e9a3b718))
+
+### [1.2.6](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.5...v1.2.6) (2022-04-08)
+
+### Build System
+
+- update plugins ([d645892](https://github.com/kailong321200875/vue-element-plus-admin/commit/d645892cde2f7f43215a2ba1776ee94a322437bf))
+
+### [1.2.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.4...v1.2.5) (2022-04-08)
+
+### Performance Improvements
+
+- add plop ([fa54a17](https://github.com/kailong321200875/vue-element-plus-admin/commit/fa54a1704ffd93f7b42dbeb1229bc4868d2d3a6a))
+
+### Build System
+
+- update plugins ([18c6bd8](https://github.com/kailong321200875/vue-element-plus-admin/commit/18c6bd868622d954b51ea34e37516361ad4eb540))
+
+### Styling
+
+- fix padding and background color ([f8c9d54](https://github.com/kailong321200875/vue-element-plus-admin/commit/f8c9d54687edafd92f5b61bf5288bb1188c73f01))
+
+### [1.2.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.3...v1.2.4) (2022-04-06)
+
+### Bug Fixes
+
+- add Sticky props comment ([46133b3](https://github.com/kailong321200875/vue-element-plus-admin/commit/46133b3ff39d48d11cbcaa1f20a271118f48eb29))
+- fix bug ([179ca06](https://github.com/kailong321200875/vue-element-plus-admin/commit/179ca064ba8adbb3b063d9798ec1930ccc68e459))
+- fix remove unnecessary variables ([ca01cbf](https://github.com/kailong321200875/vue-element-plus-admin/commit/ca01cbfd98b63a0d76190fe8d43097fdc9df74e6))
+- fix style ([17c8fea](https://github.com/kailong321200875/vue-element-plus-admin/commit/17c8fea93811d9d9b708808484f5c907d761fcf1))
+- remove ContentDetailWrap style ([4ceaa9d](https://github.com/kailong321200875/vue-element-plus-admin/commit/4ceaa9d7816369d0dcaf3e18e4cdbbd6165cef88))
+
+### [1.2.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.2...v1.2.3) (2022-03-31)
+
+### Bug Fixes
+
+- fix refresh with query ([e94020f](https://github.com/kailong321200875/vue-element-plus-admin/commit/e94020ff541a061599486c0003258f1dbf13aba8))
+
+### [1.2.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.1...v1.2.2) (2022-03-30)
+
+### Bug Fixes
+
+- fix avatar height bug ([cd4ab76](https://github.com/kailong321200875/vue-element-plus-admin/commit/cd4ab767018941777174d7837045f5259d1cc403))
+- fix parmas to params ([2c7211c](https://github.com/kailong321200875/vue-element-plus-admin/commit/2c7211c89d7299ffc0a36bef8999b3c201dbaf4a))
+
+### [1.2.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.0...v1.2.1) (2022-03-29)
+
+### Bug Fixes
+
+- fix invalid paging ([ad184ee](https://github.com/kailong321200875/vue-element-plus-admin/commit/ad184ee9c0619da36f1ca3f26e67f18f88488523))
+
+### Build System
+
+- update plugins ([0c7276f](https://github.com/kailong321200875/vue-element-plus-admin/commit/0c7276feadaedef83e6a4ad9d457e26d408698a8))
+
+## [1.2.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.14...v1.2.0) (2022-03-27)
+
+### Features
+
+- add hooks demo ([c43f39e](https://github.com/kailong321200875/vue-element-plus-admin/commit/c43f39efef296266c64cc24690717d07fa0bcb85))
+- add inputPassword demo ([8f8b126](https://github.com/kailong321200875/vue-element-plus-admin/commit/8f8b1260e75df6998ebea617f62d4ab6be81d721))
+
+### Docs
+
+- update LICENSE ([69d3dcc](https://github.com/kailong321200875/vue-element-plus-admin/commit/69d3dcc7edf69e9b4e3042ddb11faa85ec7d39e2))
+
+### Styling
+
+- modify the function name to make it more semantic ([046ae51](https://github.com/kailong321200875/vue-element-plus-admin/commit/046ae512f02df2d3f08134949b9376a061c1eef3))
+- update Footer component presentation ([d4a9ba3](https://github.com/kailong321200875/vue-element-plus-admin/commit/d4a9ba3aa6758b8aac18b30e1a6b9501baff826c))
+- update Icon demo ([8597122](https://github.com/kailong321200875/vue-element-plus-admin/commit/85971227cd3055ea280cf493c7c42b250c1515da))
+
+### Tests
+
+- test push first commit ([a67bb48](https://github.com/kailong321200875/vue-element-plus-admin/commit/a67bb48f269651a2dcd01b9e33d10f20c42d76ee))
+
+### Build System
+
+- update plugins ([9c13d92](https://github.com/kailong321200875/vue-element-plus-admin/commit/9c13d92b36a2a7c95b9edb7821367fc8f0ac6658))
+- update server port ([d2be8c1](https://github.com/kailong321200875/vue-element-plus-admin/commit/d2be8c1a307a3c5daf363bd7f1d21e574598de5c))
+
+### [1.1.14](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.13...v1.1.14) (2022-03-22)
+
+### Bug Fixes
+
+- fix the bug that the form search function is invalid of the example-dialog page ([9ec30e7](https://github.com/kailong321200875/vue-element-plus-admin/commit/9ec30e719f89865497dbb1321be1df906f59f14e))
+
+### [1.1.13](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.12...v1.1.13) (2022-03-17)
+
+### Build System
+
+- update plugins ([a2d0313](https://github.com/kailong321200875/vue-element-plus-admin/commit/a2d03137899f9b16fc1d4a09a23576cd74e7950e))
+
+### [1.1.12](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.11...v1.1.12) (2022-03-15)
+
+### Build System
+
+- update plugins ([fee2252](https://github.com/kailong321200875/vue-element-plus-admin/commit/fee2252930b05b709d0c012e809568c4ed32bd89))
+
+### [1.1.11](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.10...v1.1.11) (2022-03-15)
+
+### Bug Fixes
+
+- fix the problem of blank bar when toggle the TagsView component ([b1d9771](https://github.com/kailong321200875/vue-element-plus-admin/commit/b1d9771c750709fe45061d13299a85dbbd6ead25))
+- fix the problem that no reaction when copy setting config in http page ([61e0e33](https://github.com/kailong321200875/vue-element-plus-admin/commit/61e0e33c64d6a889fe6ed80d27a10cf8b201d21a))
+
+### [1.1.10](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.9...v1.1.10) (2022-03-13)
+
+### Build System
+
+- update plugins ([0b525c8](https://github.com/kailong321200875/vue-element-plus-admin/commit/0b525c875075a28288e92243b205b337f85ab550))
+
+### [1.1.9](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.8...v1.1.9) (2022-03-07)
+
+### Build System
+
+- update plugins ([1456fd4](https://github.com/kailong321200875/vue-element-plus-admin/commit/1456fd49ec9abbfe1f25aeadfe5fed54fec07394))
+
+### [1.1.8](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.7...v1.1.8) (2022-03-07)
+
+### Docs
+
+- update changelog ([bf09441](https://github.com/kailong321200875/vue-element-plus-admin/commit/bf09441852e59b0d07d4949a33de75958696817f))
+
+### [1.1.7](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.6...v1.1.7) (2022-03-06)
+
+### Styling
+
+- add labelMessage attribute to Form component ([8c42790](https://github.com/kailong321200875/vue-element-plus-admin/commit/8c427907843ccb2dfd882d27c1e8a894c5616487))
+
+### [1.1.6](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.5...v1.1.6) (2022-03-04)
+
+### Bug Fixes
+
+- fix the problem that the tree data of Table component cannot be displayed ([bf83d3e](https://github.com/kailong321200875/vue-element-plus-admin/commit/bf83d3efbad9097f245c32cc07d1178580cec4e3))
+
+### [1.1.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.4...v1.1.5) (2022-03-02)
+
+### Bug Fixes
+
+- fix the problem of tagsview error when loginout ([835d76a](https://github.com/kailong321200875/vue-element-plus-admin/commit/835d76ae87b950106f957976ebc8f6f2e8842ddf))
+
+### Build System
+
+- update plugins ([de34bb1](https://github.com/kailong321200875/vue-element-plus-admin/commit/de34bb193d6c844dbc1cec38db5f61b3f95e19f2))
+
+### Styling
+
+- fix tabMenu z-index bug ([8b3be02](https://github.com/kailong321200875/vue-element-plus-admin/commit/8b3be02368a1bddb7dc78f18adbea7f4ebfe75d6))
+- fix tags-view style bug ([ebff817](https://github.com/kailong321200875/vue-element-plus-admin/commit/ebff81777b9c0b839256b83e321ecbdbff25fc73))
+
+### [1.1.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.3...v1.1.4) (2022-03-01)
+
+### CI
+
+- update workflow ([0490d18](https://github.com/kailong321200875/vue-element-plus-admin/commit/0490d18145cb0d9c4b066ab01a2c10cb527e38ba))
+- update workflow ([51f7bca](https://github.com/kailong321200875/vue-element-plus-admin/commit/51f7bca6034902b251d081ee383b0d796782d434))
+
+### [1.1.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.2...v1.1.3) (2022-03-01)
+
+### CI
+
+- update workflow ([91cc5c5](https://github.com/kailong321200875/vue-element-plus-admin/commit/91cc5c595cadc5695d8f54bdc4922d8f04439f24))
+
+### [1.1.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.1...v1.1.2) (2022-03-01)
+
+### Workflows
+
+- update workflow ([d9708aa](https://github.com/kailong321200875/vue-element-plus-admin/commit/d9708aae5bc0cb795bb0fbf8d17df753cc88ba1d))
+
+### [1.1.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.0...v1.1.1) (2022-03-01)
+
+### Workflows
+
+- update workflow ([085328a](https://github.com/kailong321200875/vue-element-plus-admin/commit/085328aba8c4f356bf7915a6bbdc1ec4f46ceeda))
+
+## [1.1.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.0.3...v1.1.0) (2022-03-01)
+
+### Features
+
+- 🎸 layout 三种布局重构完成 ([429e428](https://github.com/kailong321200875/vue-element-plus-admin/commit/429e42809cef33a33662e41ad50297217d128b8c))
+- 🎸 layout 布局重构 �[bd24b92](https://github.com/kailong321200875/vue-element-plus-admin/commit/bd24b92acb279343dbaf83b74f1ed2a3f57f1003))
+- 🎸 Table 组件重构完成并给出相应示 �[35879f8](https://github.com/kailong321200875/vue-element-plus-admin/commit/35879f8ecc0ffa76122a336e2eaa93ecfb408c1d))
+- 🎸 v0.0.4 发布 ([a58dc1b](https://github.com/kailong321200875/vue-element-plus-admin/commit/a58dc1b1c2774974782ef6d116b8805975b82b1c))
+- 🎸 初始化项 �[26d4c7c](https://github.com/kailong321200875/vue-element-plus-admin/commit/26d4c7c56894cf2031b3a7cce08d53c37f4a49e3))
+- 🎸 初版完成 ([5bfe4d2](https://github.com/kailong321200875/vue-element-plus-admin/commit/5bfe4d236fd9c2841da100f34c980b4572b67b20))
+- 🎸 新增 Detail 详情组件并给出相应示 �[e77a931](https://github.com/kailong321200875/vue-element-plus-admin/commit/e77a931ef2d2967a9717e27b187d68512c01284f))
+- 🎸 新增二维码组 �[85555ee](https://github.com/kailong321200875/vue-element-plus-admin/commit/85555eef7dc7d72cb701bdd81044ba8fb8e72acc))
+- 🎸 新增全局配置 ([f8405a6](https://github.com/kailong321200875/vue-element-plus-admin/commit/f8405a63c9b1288fbe95bae235b65a08e8fae8d2))
+- 🎸 新增固定 � 级菜单配 �[4c4903e](https://github.com/kailong321200875/vue-element-plus-admin/commit/4c4903e806c8818e320108cc3e5279d728061c29))
+- 🎸 新增权限管理及相关示例文 �[32b6583](https://github.com/kailong321200875/vue-element-plus-admin/commit/32b6583099646b2ee622ac7b35388468769b91b8))
+- 🎸 显示更多组建 � 发中 ([fa9f24d](https://github.com/kailong321200875/vue-element-plus-admin/commit/fa9f24d5da8d2e40d7c3661eabacb8f0474a7bf2))
+- 🎸 权限管理 � 发中 ([38f5211](https://github.com/kailong321200875/vue-element-plus-admin/commit/38f521174ba9eba750fee4516141d7a267f1c4ce))
+- 🎸 权限管理 � 发中 ([6d7ea66](https://github.com/kailong321200875/vue-element-plus-admin/commit/6d7ea6694d8299332018a6689bcd82502a9a552c))
+- 🎸 综合实例重构 �[5142e6e](https://github.com/kailong321200875/vue-element-plus-admin/commit/5142e6e323cb20c89a97398bf41d32c93ce42cad))
+- 🎸 重构 layout ([7ede021](https://github.com/kailong321200875/vue-element-plus-admin/commit/7ede02141e258ab4c88e9b4daad966513d4dbe68))
+- 🎸 重构 layout-classic 布局 ([29d9c98](https://github.com/kailong321200875/vue-element-plus-admin/commit/29d9c988605b822195900268da6bc3f3b0b9c770))
+- 🎸 重构 sider 组件 �[51313d7](https://github.com/kailong321200875/vue-element-plus-admin/commit/51313d7116c7ab2ded7e3a65514ea9ac413edecd))
+- Add analysis api ([83327ea](https://github.com/kailong321200875/vue-element-plus-admin/commit/83327ea763ebb233bb540513276ffa288fbcb4a1))
+- Add analysis demo ([cd06934](https://github.com/kailong321200875/vue-element-plus-admin/commit/cd069340fc5157535fdc82e792c6b6dce7d7a97e))
+- Add count-to demo ([d3fbd3a](https://github.com/kailong321200875/vue-element-plus-admin/commit/d3fbd3a06c3b802fc863b4dc8013122c14bd16f2))
+- Add Descriptions component and add Descriptions demo ([7ad46f8](https://github.com/kailong321200875/vue-element-plus-admin/commit/7ad46f828d626a87699cd4d3a959a5634577d580))
+- Add Dialog component and add dailog demo ([a18ad8f](https://github.com/kailong321200875/vue-element-plus-admin/commit/a18ad8f4a89b78c73e57d8d2543494243f656d05))
+- add doucment link ([53201ae](https://github.com/kailong321200875/vue-element-plus-admin/commit/53201ae97a425714871d99e8847a3672ba0d389f))
+- Add dynamic route ([9d926b2](https://github.com/kailong321200875/vue-element-plus-admin/commit/9d926b2760b75e1d8e71a68dc7ff6c5026223a43))
+- Add Editor component and add editor demo ([3fb3e8d](https://github.com/kailong321200875/vue-element-plus-admin/commit/3fb3e8da39d816bcf4aedb65d40c7052bdb6d8bf))
+- Add Error component ([7411dbc](https://github.com/kailong321200875/vue-element-plus-admin/commit/7411dbc9fd8f122187c86a11523b49c88cc71a8c))
+- Add example-dialog demo ([262f421](https://github.com/kailong321200875/vue-element-plus-admin/commit/262f4211cf53aef30a32f4b88e88fb1b9246ffcb))
+- Add example-page demo ([1492f91](https://github.com/kailong321200875/vue-element-plus-admin/commit/1492f9119aa2960cc05956218e6d151c8b316875))
+- Add form demo ([472f574](https://github.com/kailong321200875/vue-element-plus-admin/commit/472f574f42f8f31c4e6047043ac755ba5fb35b7b))
+- Add form demo ([e6f9580](https://github.com/kailong321200875/vue-element-plus-admin/commit/e6f95803316bb5df2d1060285c1d591a79340721))
+- Add form demo ([543156f](https://github.com/kailong321200875/vue-element-plus-admin/commit/543156f328350bd12e71a41c872e547e41cda7fe))
+- Add form demo ([7795d2a](https://github.com/kailong321200875/vue-element-plus-admin/commit/7795d2a4fe3dbc9849ddc7c1d3e2d9215dc66f56))
+- Add guide demo ([0832194](https://github.com/kailong321200875/vue-element-plus-admin/commit/0832194e6131051416edff7c2eac6b0a016ffd80))
+- Add highlight demo ([eb206b0](https://github.com/kailong321200875/vue-element-plus-admin/commit/eb206b0cc31ac7da3dfd8b3d4b874061c5c91d53))
+- Add Icon demo ([e4b7a76](https://github.com/kailong321200875/vue-element-plus-admin/commit/e4b7a769126d6f0fca424007c294ff229eefcb35))
+- Add ImageViewer component and add ImageViewer demo ([af9fc0a](https://github.com/kailong321200875/vue-element-plus-admin/commit/af9fc0a4aded3ec08746ddeaeabac4c3cfa9463d))
+- Add Infotip component ([e4b7a76](https://github.com/kailong321200875/vue-element-plus-admin/commit/e4b7a769126d6f0fca424007c294ff229eefcb35))
+- Add infotip demo ([dbf3b0f](https://github.com/kailong321200875/vue-element-plus-admin/commit/dbf3b0f5a333ccef524bbac825035b0c6dc78ec9))
+- Add Qrcode component and add qrcode demo ([535a31b](https://github.com/kailong321200875/vue-element-plus-admin/commit/535a31b35eb6a76589f602fd96dcf91f46f349b0))
+- Add Search component and add search demo ([33eca8a](https://github.com/kailong321200875/vue-element-plus-admin/commit/33eca8a97d59f5cc453e1a60ee81b1519527d0f1))
+- Add Table component and add useTable hook ([17e8e7c](https://github.com/kailong321200875/vue-element-plus-admin/commit/17e8e7cda9a009818f11cfa0429ce0f9adc00be5))
+- Add useScrollTo hook ([7d7fd9e](https://github.com/kailong321200875/vue-element-plus-admin/commit/7d7fd9ed646d2b68cec0547ad8e65b0404bb95bb))
+- Add useWatermark hook and add useWatermark demo ([d3fbd3a](https://github.com/kailong321200875/vue-element-plus-admin/commit/d3fbd3a06c3b802fc863b4dc8013122c14bd16f2))
+- Add workplace api ([cb558f8](https://github.com/kailong321200875/vue-element-plus-admin/commit/cb558f8af9dfef2ba2879f021db395ee79e8c8d4))
+- **Animate:** Add animate.css ([1436543](https://github.com/kailong321200875/vue-element-plus-admin/commit/1436543a5c599f651ed7805165ea83b9ebcddef5))
+- **Breadcrumbe:** Add Breadcrumb component ([4612e55](https://github.com/kailong321200875/vue-element-plus-admin/commit/4612e5544bcd626d686972e5cb874d0aa4af08b3))
+- **component:** Add CountTo component and Echart component ([e20fa76](https://github.com/kailong321200875/vue-element-plus-admin/commit/e20fa76cad0894a69fd04c81c2108faabf392684))
+- **component:** Add Footer component ([dad7330](https://github.com/kailong321200875/vue-element-plus-admin/commit/dad733063413c79eca61c6cb5ff671b35933a85f))
+- **component:** Add Footer component ([f81e996](https://github.com/kailong321200875/vue-element-plus-admin/commit/f81e996a426538aeaa2aa37a540395dcf360a09c))
+- **Component:** Add Highlight component ([c53fa56](https://github.com/kailong321200875/vue-element-plus-admin/commit/c53fa562e540447df082e35c7f26e56f2426e430))
+- **component:** Add namespace of class ([d847ccb](https://github.com/kailong321200875/vue-element-plus-admin/commit/d847ccb098edc72fe55c1f8459bf149453a3b73d))
+- **Component:** Setting component add copy button ([e496096](https://github.com/kailong321200875/vue-element-plus-admin/commit/e496096539e6a56b0761a625c9d59210facc5432))
+- **ContextMenu:** Add ContextMenu component ([349ac9d](https://github.com/kailong321200875/vue-element-plus-admin/commit/349ac9d3989d77e5246cecf0006dd8d83c489990))
+- Detail 组件重构完成 ([7f5ef99](https://github.com/kailong321200875/vue-element-plus-admin/commit/7f5ef99ccc32b03f7be21f70c333bb8e679c7d93))
+- Highlight 组件重构 ([34221f3](https://github.com/kailong321200875/vue-element-plus-admin/commit/34221f387f5e15a08cdc21edd76ce8d8c5c20fbc))
+- **hooks:** Add useIntro hook ([0832194](https://github.com/kailong321200875/vue-element-plus-admin/commit/0832194e6131051416edff7c2eac6b0a016ffd80))
+- **hooks:** Add useTimeAgo hook ([c53fa56](https://github.com/kailong321200875/vue-element-plus-admin/commit/c53fa562e540447df082e35c7f26e56f2426e430))
+- **I18n:** Add Ii8n ([3810b8c](https://github.com/kailong321200875/vue-element-plus-admin/commit/3810b8c3b26f86c27aa7db479dfb7b0d283d970f))
+- **Layout:** Add classic layout ([839b601](https://github.com/kailong321200875/vue-element-plus-admin/commit/839b6015b8e31bf70e6f0bf0608fa729b028729b))
+- **Layout:** Add cutMenu layout ([ff4dd3a](https://github.com/kailong321200875/vue-element-plus-admin/commit/ff4dd3afbf5c0c7a439c71b0c494b81e0f2c70d4))
+- **Layout:** Add topLeft layout ([71b1c5e](https://github.com/kailong321200875/vue-element-plus-admin/commit/71b1c5e10cade8d1c018d0c5f63c98ba9357bab8))
+- **LocaleDropdown:** Add LocaleDropdown Component ([3810b8c](https://github.com/kailong321200875/vue-element-plus-admin/commit/3810b8c3b26f86c27aa7db479dfb7b0d283d970f))
+- **Logo:** Add Logo component ([958edef](https://github.com/kailong321200875/vue-element-plus-admin/commit/958edefe7bc2bf3ae77520a5d885a9d47e8a37b9))
+- **mock:** Add mock ([3fc7d4d](https://github.com/kailong321200875/vue-element-plus-admin/commit/3fc7d4d39a72056fcf419fe19a9d41d90f945bad))
+- **router:** Add dynamic routing ([b218ccc](https://github.com/kailong321200875/vue-element-plus-admin/commit/b218ccc9cce2ce1363c4a21d22b4d69c43c7b2dc))
+- Search component add expand attribute and expandField attribute ([9b4b317](https://github.com/kailong321200875/vue-element-plus-admin/commit/9b4b31781765d31dec50acc40e2eed91401502d4))
+- **store:** Add localeStore ([3810b8c](https://github.com/kailong321200875/vue-element-plus-admin/commit/3810b8c3b26f86c27aa7db479dfb7b0d283d970f))
+- **store:** Add tagsView store ([349ac9d](https://github.com/kailong321200875/vue-element-plus-admin/commit/349ac9d3989d77e5246cecf0006dd8d83c489990))
+- Table 组件重构 ([07adefb](https://github.com/kailong321200875/vue-element-plus-admin/commit/07adefb89b7555280e6217e09cf81ba7aa5b93c2))
+- **TagsView:** Add TagsView component ([349ac9d](https://github.com/kailong321200875/vue-element-plus-admin/commit/349ac9d3989d77e5246cecf0006dd8d83c489990))
+- **useForm:** Add useForm ([357fc44](https://github.com/kailong321200875/vue-element-plus-admin/commit/357fc44e519c5829567c17f611fcaadee3f9f933))
+- **useNProgress:** Add useNProgress ([c5ab359](https://github.com/kailong321200875/vue-element-plus-admin/commit/c5ab3599c8ea001ff7831b72fefc9e274163fbbb))
+- **useTitle:** Add useTitle ([c5ab359](https://github.com/kailong321200875/vue-element-plus-admin/commit/c5ab3599c8ea001ff7831b72fefc9e274163fbbb))
+- **utils:** Add color utils ([71dfba2](https://github.com/kailong321200875/vue-element-plus-admin/commit/71dfba21c5bc0276689b5aecf0d75e53efdda09f))
+- **VForm:** Add VForm component ([448ac52](https://github.com/kailong321200875/vue-element-plus-admin/commit/448ac5293e48a03840df2bb0b399a8f02aae666e))
+- **VInputPassword:** Add VInputPassword Component ([a1bf7e9](https://github.com/kailong321200875/vue-element-plus-admin/commit/a1bf7e9b552f75d3b87c64904ac9e7c99fc936a5))
+- **Workplace:** Add wrokplace demo ([c53fa56](https://github.com/kailong321200875/vue-element-plus-admin/commit/c53fa562e540447df082e35c7f26e56f2426e430))
+- 综合实例、权限管理重 �[a4bd206](https://github.com/kailong321200875/vue-element-plus-admin/commit/a4bd2068a5d40d146b5b45cb3727ced990147b68))
+- 部分组件重构完成 ([3d96229](https://github.com/kailong321200875/vue-element-plus-admin/commit/3d9622978dc234ef12dbce63e18caf3440563aa0))
+
+### Bug Fixes
+
+- 🐛 删除 Editor 双向绑定,改 �props 传参 ([c395e27](https://github.com/kailong321200875/vue-element-plus-admin/commit/c395e27f67af9f60b151a5484ab5a3c90c4c1d1e))
+- fix Form component setProps not work bug ([48ffc52](https://github.com/kailong321200875/vue-element-plus-admin/commit/48ffc52ca8fa26d8e6a5fa4b8b3001701a1f0732))
+- fix useScrollTo not work bug ([53201ae](https://github.com/kailong321200875/vue-element-plus-admin/commit/53201ae97a425714871d99e8847a3672ba0d389f))
+- 修复 tagsView 无动画效 �[0e3eb4b](https://github.com/kailong321200875/vue-element-plus-admin/commit/0e3eb4ba8b1503e1d221dfda59a3a0001dbdcb56))
+
+### Performance Improvements
+
+- update useForm hook ([8a958cd](https://github.com/kailong321200875/vue-element-plus-admin/commit/8a958cd71d9afbd32b243aac0814bfa3281477cd))
+
+### Code Refactoring
+
+- 💡 综合实例查看详情重构 ([9c26edd](https://github.com/kailong321200875/vue-element-plus-admin/commit/9c26edd5d599b5fb5a832fb547e3d95b6bfa9a98))
+
+### Build System
+
+- Add conventional-changelog-cli plugin ([384485f](https://github.com/kailong321200875/vue-element-plus-admin/commit/384485f6994c6ac33abee506508ab9d35fe658a9))
+- Add conventional-github-releaser plugin ([3cd5c71](https://github.com/kailong321200875/vue-element-plus-admin/commit/3cd5c71899dde3ac3910aef0180d8b39fad51f1b))
+- Add standard-version plugin ([110ce25](https://github.com/kailong321200875/vue-element-plus-admin/commit/110ce257841648e29b247a0338624a188694b6e9))
+- Add vite-plugin-html plugin ([d5b6e2a](https://github.com/kailong321200875/vue-element-plus-admin/commit/d5b6e2a7770eb59aa32839f69da5be37397e3538))
+- delete useless plugin ([c756761](https://github.com/kailong321200875/vue-element-plus-admin/commit/c756761dfc3200156acb228474d3539197ef413b))
+- **pinia:** Add pinia ([2040500](https://github.com/kailong321200875/vue-element-plus-admin/commit/2040500af14d277a79f01eba5eca2a440203cecf))
+- **types:** Add vue-types ([2c41826](https://github.com/kailong321200875/vue-element-plus-admin/commit/2c41826c572268b74a663a6966c548628ac7e280))
+- **unplugin-auto-import:** Delete unplugin-auto-import ([2040500](https://github.com/kailong321200875/vue-element-plus-admin/commit/2040500af14d277a79f01eba5eca2a440203cecf))
+- **unplugin-vue-components:** Delete unplugin-vue-components ([2040500](https://github.com/kailong321200875/vue-element-plus-admin/commit/2040500af14d277a79f01eba5eca2a440203cecf))
+- update plugin ([8d08bc6](https://github.com/kailong321200875/vue-element-plus-admin/commit/8d08bc6fc92258674abdd12834eaa4530ec276dd))
+- update plugins ([3c58042](https://github.com/kailong321200875/vue-element-plus-admin/commit/3c580420a20121845f02c0dd3caca5a74f06a89d))
+- **vite-plugin-style-import:** Add vite-plugin-style-import ([2040500](https://github.com/kailong321200875/vue-element-plus-admin/commit/2040500af14d277a79f01eba5eca2a440203cecf))
+- **vite-plugin-vue-setup-extend:** Delete vite-plugin-vue-setup-extend ([2040500](https://github.com/kailong321200875/vue-element-plus-admin/commit/2040500af14d277a79f01eba5eca2a440203cecf))
+- 修改 vite 配置 ([9991fb4](https://github.com/kailong321200875/vue-element-plus-admin/commit/9991fb4e5c46b9e4016beaade7232e28dc272797))
+- 设置多语 �([45e879e](https://github.com/kailong321200875/vue-element-plus-admin/commit/45e879edeef677b6aa1d2cfe4dd8dc5b76c83c59))
+- 配置代码格式 �[ffdb556](https://github.com/kailong321200875/vue-element-plus-admin/commit/ffdb556a096db247306eae8eecc1b85718314cdd))
+- 集成基础配置 ([ced99de](https://github.com/kailong321200875/vue-element-plus-admin/commit/ced99de9b113a01d9d0b190f6d2c6adc983a3102))
+- 集成基础配置 ([5dbcf23](https://github.com/kailong321200875/vue-element-plus-admin/commit/5dbcf2397ccdec80c695c113f49e8aa9bb6d012c))
+
+### Styling
+
+- 💄 优化 layout 样式 ([37ec378](https://github.com/kailong321200875/vue-element-plus-admin/commit/37ec378f0b2bf83d73ddf0e472aada6aab248f09))
+- 💄 微调样式 ([612b486](https://github.com/kailong321200875/vue-element-plus-admin/commit/612b48673c3389779ccfdd161e2ca80b21d265b2))
+- Add elNamespace ([d847ccb](https://github.com/kailong321200875/vue-element-plus-admin/commit/d847ccb098edc72fe55c1f8459bf149453a3b73d))
+- **appStore:** code style ([641ed68](https://github.com/kailong321200875/vue-element-plus-admin/commit/641ed684fefeb52e2f91e8baab7b610fc74c8d88))
+- **Breadcrumb:** fix Breadcrumb style bug ([8755c86](https://github.com/kailong321200875/vue-element-plus-admin/commit/8755c862b837d90a25b27c01fabe64abf81fc4a2))
+- **breadcrumb:** update disabled text color ([1522e92](https://github.com/kailong321200875/vue-element-plus-admin/commit/1522e925bae37cb9df4de2252d81f717788f4537))
+- change function to arrow function ([4612e55](https://github.com/kailong321200875/vue-element-plus-admin/commit/4612e5544bcd626d686972e5cb874d0aa4af08b3))
+- delete console.log ([49a6bfe](https://github.com/kailong321200875/vue-element-plus-admin/commit/49a6bfe9d81a40e2f5f15b68d7289e1787e89b54))
+- **Icon:** delete default color ([95a2bd8](https://github.com/kailong321200875/vue-element-plus-admin/commit/95a2bd884dd9846a56cda7c4c3ee4a41ce631b7c))
+- level demo style beautification ([dbf3b0f](https://github.com/kailong321200875/vue-element-plus-admin/commit/dbf3b0f5a333ccef524bbac825035b0c6dc78ec9))
+- lint code style ([b292419](https://github.com/kailong321200875/vue-element-plus-admin/commit/b2924190b8996e8208f951e3fadbcb09baddb8df))
+- **Login:** update login styles ([eb68f1d](https://github.com/kailong321200875/vue-element-plus-admin/commit/eb68f1d919e13c07b7d200e9aec53804b2a6dc7b))
+- modify menu z-index attribute ([0d7a778](https://github.com/kailong321200875/vue-element-plus-admin/commit/0d7a7781ce0b5e39f01355d3acdb3f364cabf76d))
+- **TagView:** Vertical center tag ([41281c4](https://github.com/kailong321200875/vue-element-plus-admin/commit/41281c4d541a2744e5df5dff2764cc85465b6a4c))
+
+### Types
+
+- add ImportMetaEnv ([38e0257](https://github.com/kailong321200875/vue-element-plus-admin/commit/38e0257487e4138a74ad1bb4ee4ba004abcfaa12))
+- Adding BfFrom Component types ([8e036f5](https://github.com/kailong321200875/vue-element-plus-admin/commit/8e036f54b56ce8521eb8ec4b7ca21aa9c24f43f2))
+- **BfForm:** Adding BfForm types ([bc9195b](https://github.com/kailong321200875/vue-element-plus-admin/commit/bc9195b21eeb79629a82a04d90e2ac5aa6592928))
+- **BfForm:** Adding BfForm types ([184b468](https://github.com/kailong321200875/vue-element-plus-admin/commit/184b468cd41dcd1cdae11477b9ee2d6e17de1481))
+- **BfForm:** Adding BfForm types ([58cb24d](https://github.com/kailong321200875/vue-element-plus-admin/commit/58cb24d9f8a50be80b5ea793387d582a77a59137))
+- delete useless types ([3fc79c0](https://github.com/kailong321200875/vue-element-plus-admin/commit/3fc79c0ae7acd0929f47e33f96c8d45a90d8f762))
+- **VForm:** Adding VForm types ([7528fe6](https://github.com/kailong321200875/vue-element-plus-admin/commit/7528fe6da60368213d28d9f1b6310d02d3d53282))
+
+### Docs
+
+- ✏️ 修改 readme ([8edb2a3](https://github.com/kailong321200875/vue-element-plus-admin/commit/8edb2a3493dca975036859b5d2c52afaa91f5dbb))
+- ✏️ 更新 readme ([62eeb55](https://github.com/kailong321200875/vue-element-plus-admin/commit/62eeb55330dd4af2a46801c7a19f38a3ef312bbf))
+- Add README.md ([21dcf88](https://github.com/kailong321200875/vue-element-plus-admin/commit/21dcf88ba31957bbdb50c6207d010650daab70fc))
+- Error modifying readme name ([25d5c84](https://github.com/kailong321200875/vue-element-plus-admin/commit/25d5c84e92e68aa72362a14f55aacd946fa5b1b2))
+- update description ([be6ff98](https://github.com/kailong321200875/vue-element-plus-admin/commit/be6ff9899b25cc00519210950d27ee56ac5112e6))
+- update description ([c15aa87](https://github.com/kailong321200875/vue-element-plus-admin/commit/c15aa8755c9c937512c7380a6d03c4d877ef4d87))
+- update README ([27979dc](https://github.com/kailong321200875/vue-element-plus-admin/commit/27979dc6def7d9d8cea62a08d49a6c828be2258b))
+- update README.md ([53201ae](https://github.com/kailong321200875/vue-element-plus-admin/commit/53201ae97a425714871d99e8847a3672ba0d389f))
+- update README.md ([c11823a](https://github.com/kailong321200875/vue-element-plus-admin/commit/c11823abd8a033e14b4c20d17ac941195d39bcfe))
+- 修改 README ([b79a567](https://github.com/kailong321200875/vue-element-plus-admin/commit/b79a56753df55976e749c4494266df052d315416))
diff --git a/Dockerfile.dev b/Dockerfile.dev
new file mode 100644
index 0000000..106259c
--- /dev/null
+++ b/Dockerfile.dev
@@ -0,0 +1,13 @@
+FROM node:18.0.0
+
+WORKDIR /app
+
+RUN npm install -g pnpm@8.1.0
+
+COPY package.json .
+
+RUN pnpm install
+
+COPY . .
+
+CMD [ "pnpm", "run", "dev" ]
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..9861118
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021-present Archer
+
+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/README.md b/README.md
new file mode 100644
index 0000000..ab94ab3
--- /dev/null
+++ b/README.md
@@ -0,0 +1,148 @@
+
+
+[](LICENSE) [](repo-size) [](last-commit) [](stars) [](forks) [](release) [](watchers)
+
+
vue-element-plus-admin
+
+
+**English** | [中文](./README.zh-CN.md)
+
+## Introduction
+
+vue-element-plus-admin is a free and open source middle and background template based on `element-plus`. Developed using the latest mainstream technologies such as `vue3`, `vite` and `typescript`, the out of the box middle and background front-end solution can be used as the starting template of the project and learning reference. And always pay attention to the latest technological trends and update them as soon as possible.
+
+vue-element-plus-admin is positioned as a background integration scheme, which is not suitable for secondary development as a basic template. Because it integrates many functions that you may not use, it will cause a lot of code redundancy. If your project doesn't pay attention to this problem, you can also directly carry out secondary development based on it.
+
+If you need a basic template, please switch to the `mini` branch. `mini` simply integrates some common layout functions such as layout and dynamic menu, which is more suitable for developers to carry out secondary development.
+
+## Feature
+
+- **State of The Art Development**:Use front-end front-end technology development such as Vue3/vite4
+- **TypeScript**: Application-level JavaScript language
+- **Theming**: Configurable themes
+- **International**:Built-in complete internationalization program
+- **Mock Server** Built-in mock data scheme
+- **Authority** Built-in complete dynamic routing permission generation scheme.
+- **Component** Multiple commonly used components are encapsulated twice
+- **Examples** Built-in rich examples
+
+## Preview
+
+- [vue-element-plus-admin](https://element-plus-admin.cn/) - Full version of the github site
+- [vue-element-plus-admin](https://kailong110120130.gitee.io/vue-element-plus-admin) - Full version of the gitee site
+
+account: **admin/admin**
+
+Online examples do not apply to menu filtering by default, but directly use Static routing
+
+## Documentation
+
+[Document Github](https://element-plus-admin-doc.cn/)
+
+[Document Gitee](https://kailong110120130.gitee.io/vue-element-plus-admin-doc)
+
+## Preparation
+
+- [node](http://nodejs.org/) and [git](https://git-scm.com/) - Project development environment
+- [Vite](https://vitejs.dev/) - Familiar with vite features
+- [Vue3](https://v3.vuejs.org/) - Familiar with Vue basic syntax
+- [TypeScript](https://www.typescriptlang.org/) - Familiar with the basic syntax of `TypeScript`
+- [Es6+](http://es6.ruanyifeng.com/) - Familiar with es6 basic syntax
+- [Vue-Router-Next](https://next.router.vuejs.org/) - Familiar with the basic use of vue-router
+- [Element-Plus](https://element-plus.org/) - Familiar with the basic use of element-plus
+- [Mock.js](https://github.com/nuysoft/Mock) - mockjs basic syntax
+
+## Install and use
+
+- Get the project code
+
+```bash
+git clone https://github.com/kailong321200875/vue-element-plus-admin.git
+```
+
+- Installation dependencies
+
+```bash
+cd vue-element-plus-admin
+
+pnpm install
+
+```
+
+- run
+
+```bash
+pnpm run dev
+```
+
+- build
+
+```bash
+pnpm run build:pro
+```
+
+## Change Log
+
+[CHANGELOG](./CHANGELOG.md)
+
+## How to contribute
+
+
+
+
+
+You can [Raise an issue](https://github.com/kailong321200875/vue-element-plus-admin/issues/new) Or submit a Pull Request.
+
+**Pull Request:**
+
+1. Fork code
+2. Create your own branch: `git checkout -b feat/xxxx`
+3. Submit your changes: `git commit -am 'feat(function): add xxxxx'`
+4. Push your branch: `git push origin feat/xxxx`
+5. submit `pull request`
+
+## Git Contribution submission specification
+
+- `feat` New features
+- `fix` Fix bugs
+- `docs` document
+- `style` Format and style (changes that do not affect code operation)
+- `refactor` Refactor
+- `perf` Optimize related, such as improving performance and experience
+- `test` Add test
+- `build` Compilation related modifications, changes to project construction or dependencies
+- `ci` Continuous integration modification
+- `chore` Changes in the construction process or auxiliary tools
+- `revert` Rollback to previous version
+- `workflow` Workflow improvement
+- `mod` Uncertain modification classification
+- `wip` Under development
+- `types` type
+
+## Browser support
+
+The `Chrome 80+` browser is recommended for local development
+
+Support modern browsers, not IE
+
+| [ ](http://godban.github.io/browsers-support-badges/)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 |
+| :-: | :-: | :-: | :-: | :-: |
+| not support | last 2 versions | last 2 versions | last 2 versions | last 2 versions |
+
+## Donate
+
+If you find this project helpful, welcome sponsorship to show your support~
+
+[Paypal Me](https://www.paypal.com/paypalme/ckl94)
+
+
+
+### My QR code
+
+If you have any project cooperation or outsourcing, please scan the code to add me as a friend and leave a note of your purpose.
+
+
+
+## License
+
+[MIT](./LICENSE)
diff --git a/README.zh-CN.md b/README.zh-CN.md
new file mode 100644
index 0000000..2b153a6
--- /dev/null
+++ b/README.zh-CN.md
@@ -0,0 +1,148 @@
+
+
+[](LICENSE) [](repo-size) [](last-commit) [](stars) [](forks) [](release) [](watchers)
+
+
vue-element-plus-admin
+
+
+[English](./README.md) | **中文**
+
+## 介绍
+
+vue-element-plus-admin 是一个基于 `element-plus` 免费开源的中后台模版。使用了最新的`vue3`,`vite`,`TypeScript`等主流技术开发,开箱即用的中后台前端解决方案,可以用来作为项目的启动模版,也可用于学习参考。并且时刻关注着最新技术动向,尽可能的第一时间更新。
+
+vue-element-plus-admin 的定位是后台集成方案,不太适合当基础模板来进行二次开发。因为集成了很多你可能用不到的功能,会造成不少的代码冗余。如果你的项目不关注这方面的问题,也可以直接基于它进行二次开发。
+
+如需要基础模版,请切换到 `mini` 分支,`mini` 只简单集成了一些如:布局、动态菜单等常用布局功能,更适合开发者进行二次开发。
+
+## 特性
+
+- **最新技术栈**:使用 Vue3/vite4 等前端前沿技术开发
+- **TypeScript**: 应用程序级 JavaScript 的语言
+- **主题**: 可配置的主题
+- **国际化**:内置完善的国际化方案
+- **自定义数据** 内置 Mock 数据方案
+- **权限** 内置完善的动态路由权限生成方案
+- **组件** 二次封装了多个常用的组件
+- **示例** 内置丰富的示例
+
+## 预览
+
+- [vue-element-plus-admin](https://element-plus-admin.cn/) - 完整版 github 站点
+- [vue-element-plus-admin](https://kailong110120130.gitee.io/vue-element-plus-admin) - 完整版 gitee 站点
+
+帐号:**admin/admin**
+
+在线例子默认不适用菜单过滤,而是直接使用静态路由表
+
+## 文档
+
+[文档地址 Github](https://element-plus-admin-doc.cn/)
+
+[文档地址 Gitee](https://kailong110120130.gitee.io/vue-element-plus-admin-doc)
+
+## 前序准备
+
+- [node](http://nodejs.org/) 和 [git](https://git-scm.com/) - 项目开发环境
+- [Vite](https://vitejs.dev/) - 熟悉 vite 特性
+- [Vue3](https://v3.vuejs.org/) - 熟悉 Vue 基础语法
+- [TypeScript](https://www.typescriptlang.org/) - 熟悉 `TypeScript` 基本语法
+- [Es6+](http://es6.ruanyifeng.com/) - 熟悉 es6 基本语法
+- [Vue-Router-Next](https://next.router.vuejs.org/) - 熟悉 vue-router 基本使用
+- [Element-Plus](https://element-plus.org/) - element-plus 基本使用
+- [Mock.js](https://github.com/nuysoft/Mock) - mockjs 基本语法
+
+## 安装和使用
+
+- 获取代码
+
+```bash
+git clone https://github.com/kailong321200875/vue-element-plus-admin.git
+```
+
+- 安装依赖
+
+```bash
+cd vue-element-plus-admin
+
+pnpm install
+
+```
+
+- 运行
+
+```bash
+pnpm run dev
+```
+
+- 打包
+
+```bash
+pnpm run build:pro
+```
+
+## 更新日志
+
+[更新日志](./CHANGELOG.md)
+
+## 如何贡献
+
+
+
+
+
+你可以[提一个 issue](https://github.com/kailong321200875/vue-element-plus-admin/issues/new) 或者提交一个 Pull Request。
+
+**Pull Request:**
+
+1. Fork 代码
+2. 创建自己的分支: `git checkout -b feat/xxxx`
+3. 提交你的修改: `git commit -am 'feat(function): add xxxxx'`
+4. 推送您的分支: `git push origin feat/xxxx`
+5. 提交 `pull request`
+
+## Git 贡献提交规范
+
+- `feat` 新功能
+- `fix` 修补 bug
+- `docs` 文档
+- `style` 格式、样式(不影响代码运行的变动)
+- `refactor` 重构(即不是新增功能,也不是修改 BUG 的代码)
+- `perf` 优化相关,比如提升性能、体验
+- `test` 添加测试
+- `build` 编译相关的修改,对项目构建或者依赖的改动
+- `ci` 持续集成修改
+- `chore` 构建过程或辅助工具的变动
+- `revert` 回滚到上一个版本
+- `workflow` 工作流改进
+- `mod` 不确定分类的修改
+- `wip` 开发中
+- `types` 类型
+
+## 浏览器支持
+
+本地开发推荐使用 `Chrome 80+` 浏览器
+
+支持现代浏览器, 不支持 IE
+
+| [ ](http://godban.github.io/browsers-support-badges/)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 |
+| :-: | :-: | :-: | :-: | :-: |
+| not support | last 2 versions | last 2 versions | last 2 versions | last 2 versions |
+
+## Donate
+
+如果你觉得这个项目有帮助,欢迎赞助以示支持~
+
+[Paypal Me](https://www.paypal.com/paypalme/ckl94)
+
+
+
+### 我的二维码
+
+如有项目合作或项目外包,扫码加我好友,请备注来意。
+
+
+
+## 许可证
+
+[MIT](./LICENSE)
diff --git a/commitlint.config.cjs b/commitlint.config.cjs
new file mode 100644
index 0000000..78d145d
--- /dev/null
+++ b/commitlint.config.cjs
@@ -0,0 +1,28 @@
+module.exports = {
+ extends: ['@commitlint/config-conventional'],
+ rules: {
+ 'type-enum': [
+ 2,
+ 'always',
+ [
+ 'feat', // 新功能(feature)
+ 'fix', // 修补bug
+ 'docs', // 文档(documentation)
+ 'style', // 格式、样式(不影响代码运行的变动)
+ 'refactor', // 重构(即不是新增功能,也不是修改BUG的代码)
+ 'perf', // 优化相关,比如提升性能、体验
+ 'test', // 添加测试
+ 'ci', // 持续集成修改
+ 'chore', // 构建过程或辅助工具的变动
+ 'revert', // 回滚到上一个版本
+ 'workflow', // 工作流改进
+ 'mod', // 不确定分类的修改
+ 'wip', // 开发中
+ 'types', // 类型修改
+ 'release' // 版本发布
+ ]
+ ],
+ 'subject-full-stop': [0, 'never'],
+ 'subject-case': [0, 'never']
+ }
+}
diff --git a/docker-compose.dev.yaml b/docker-compose.dev.yaml
new file mode 100644
index 0000000..b6fd3e1
--- /dev/null
+++ b/docker-compose.dev.yaml
@@ -0,0 +1,10 @@
+services:
+ vue-element-plus-admin:
+ build:
+ context: .
+ dockerfile: Dockerfile.dev
+ ports:
+ - "4000:4000"
+ volumes:
+ - /app/node_modules
+ - .:/app
\ No newline at end of file
diff --git a/eslint.config.mjs b/eslint.config.mjs
new file mode 100644
index 0000000..67bc096
--- /dev/null
+++ b/eslint.config.mjs
@@ -0,0 +1,82 @@
+// 引入vue模版的eslint
+import pluginVue from 'eslint-plugin-vue'
+import eslint from '@eslint/js'
+// ts-eslint解析器,使 eslint 可以解析 ts 语法
+import tseslint from 'typescript-eslint'
+// vue文件解析器
+import vueParser from 'vue-eslint-parser'
+import prettier from 'eslint-plugin-prettier'
+
+export default tseslint.config({
+ // ignores: ['node_modules', 'prettier.config.cjs', 'dist*'],
+ files: ['src/**/*.ts', 'src/**/*.tsx', 'src/**/*.vue'],
+ // tseslint.config添加了extends扁平函数,直接用。否则是eslint9.0版本是没有extends的
+ extends: [
+ eslint.configs.recommended,
+ ...tseslint.configs.recommended,
+ ...pluginVue.configs['flat/essential']
+ ],
+ plugins: {
+ prettier
+ },
+ languageOptions: {
+ parser: vueParser, // 使用vue解析器,这个可以识别vue文件
+ parserOptions: {
+ parser: tseslint.parser, // 在vue文件上使用ts解析器
+ sourceType: 'module',
+ ecmaVersion: 2020,
+ ecmaFeatures: {
+ jsx: true
+ }
+ }
+ },
+ rules: {
+ 'prettier/prettier': 'error',
+ 'no-useless-escape': 0,
+ 'no-undef': 0,
+ '@typescript-eslint/no-unused-expressions': 0,
+ '@typescript-eslint/no-unsafe-function-type': 0,
+ 'vue/no-setup-props-destructure': 0,
+ 'vue/script-setup-uses-vars': 1,
+ 'vue/no-reserved-component-names': 0,
+ '@typescript-eslint/ban-ts-ignore': 0,
+ '@typescript-eslint/explicit-function-return-type': 0,
+ '@typescript-eslint/no-explicit-any': 0,
+ '@typescript-eslint/no-var-requires': 0,
+ '@typescript-eslint/no-empty-function': 0,
+ 'vue/custom-event-name-casing': 0,
+ 'no-use-before-define': 0,
+ '@typescript-eslint/no-use-before-define': 0,
+ '@typescript-eslint/ban-ts-comment': 0,
+ '@typescript-eslint/ban-types': 0,
+ '@typescript-eslint/no-non-null-assertion': 0,
+ '@typescript-eslint/explicit-module-boundary-types': 0,
+ '@typescript-eslint/no-unused-vars': 0,
+ 'no-unused-vars': 0,
+ 'space-before-function-paren': 0,
+ 'vue/attributes-order': 0,
+ 'vue/one-component-per-file': 0,
+ 'vue/html-closing-bracket-newline': 0,
+ 'vue/max-attributes-per-line': 0,
+ 'vue/multiline-html-element-content-newline': 0,
+ 'vue/singleline-html-element-content-newline': 0,
+ 'vue/attribute-hyphenation': 0,
+ 'vue/require-default-prop': 0,
+ 'vue/require-explicit-emits': 0,
+ 'vue/html-self-closing': [
+ 1,
+ {
+ html: {
+ void: 'always',
+ normal: 'never',
+ component: 'always'
+ },
+ svg: 'always',
+ math: 'always'
+ }
+ ],
+ 'vue/multi-word-component-names': 0,
+ 'vue/no-v-html': 0,
+ 'vue/require-toggle-inside-transition': 0
+ }
+})
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..507d616
--- /dev/null
+++ b/index.html
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+ <%= title %>
+
+
+
+
+
+
+
+
+
<%= title %>
+
+
+
+
+
+
+
+
diff --git a/mock/_createProductionServer.ts b/mock/_createProductionServer.ts
new file mode 100644
index 0000000..598ac64
--- /dev/null
+++ b/mock/_createProductionServer.ts
@@ -0,0 +1,18 @@
+import { createProdMockServer } from 'vite-plugin-mock/es/createProdMockServer'
+
+const modules = import.meta.glob('./**/*.mock.ts', {
+ import: 'default',
+ eager: true
+})
+
+const mockModules: any[] = []
+Object.keys(modules).forEach(async (key) => {
+ if (key.includes('_')) {
+ return
+ }
+ mockModules.push(...(modules[key] as any))
+})
+
+export function setupProdMockServer() {
+ createProdMockServer(mockModules)
+}
diff --git a/mock/analysis/index.mock.ts b/mock/analysis/index.mock.ts
new file mode 100644
index 0000000..195f367
--- /dev/null
+++ b/mock/analysis/index.mock.ts
@@ -0,0 +1,87 @@
+import { SUCCESS_CODE } from '@/constants'
+import { MockMethod } from 'vite-plugin-mock'
+
+const timeout = 1000
+
+export default [
+ // 分析页统计接口
+ {
+ url: '/mock/analysis/total',
+ method: 'get',
+ timeout,
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: {
+ users: 102400,
+ messages: 81212,
+ moneys: 9280,
+ shoppings: 13600
+ }
+ }
+ }
+ },
+ // 用户来源
+ {
+ url: '/mock/analysis/userAccessSource',
+ method: 'get',
+ timeout,
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: [
+ { value: 1000, name: 'analysis.directAccess' },
+ { value: 310, name: 'analysis.mailMarketing' },
+ { value: 234, name: 'analysis.allianceAdvertising' },
+ { value: 135, name: 'analysis.videoAdvertising' },
+ { value: 1548, name: 'analysis.searchEngines' }
+ ]
+ }
+ }
+ },
+ // 每周用户活跃量
+ {
+ url: '/mock/analysis/weeklyUserActivity',
+ method: 'get',
+ timeout,
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: [
+ { value: 13253, name: 'analysis.monday' },
+ { value: 34235, name: 'analysis.tuesday' },
+ { value: 26321, name: 'analysis.wednesday' },
+ { value: 12340, name: 'analysis.thursday' },
+ { value: 24643, name: 'analysis.friday' },
+ { value: 1322, name: 'analysis.saturday' },
+ { value: 1324, name: 'analysis.sunday' }
+ ]
+ }
+ }
+ },
+ // 每月销售额
+ {
+ url: '/mock/analysis/monthlySales',
+ method: 'get',
+ timeout,
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: [
+ { estimate: 100, actual: 120, name: 'analysis.january' },
+ { estimate: 120, actual: 82, name: 'analysis.february' },
+ { estimate: 161, actual: 91, name: 'analysis.march' },
+ { estimate: 134, actual: 154, name: 'analysis.april' },
+ { estimate: 105, actual: 162, name: 'analysis.may' },
+ { estimate: 160, actual: 140, name: 'analysis.june' },
+ { estimate: 165, actual: 145, name: 'analysis.july' },
+ { estimate: 114, actual: 250, name: 'analysis.august' },
+ { estimate: 163, actual: 134, name: 'analysis.september' },
+ { estimate: 185, actual: 56, name: 'analysis.october' },
+ { estimate: 118, actual: 99, name: 'analysis.november' },
+ { estimate: 123, actual: 123, name: 'analysis.december' }
+ ]
+ }
+ }
+ }
+] as MockMethod[]
diff --git a/mock/department/index.mock.ts b/mock/department/index.mock.ts
new file mode 100644
index 0000000..443907e
--- /dev/null
+++ b/mock/department/index.mock.ts
@@ -0,0 +1,206 @@
+import { toAnyString } from '@/utils'
+import Mock from 'mockjs'
+import { SUCCESS_CODE } from '@/constants'
+
+const departmentList: any = []
+
+const citys = ['厦门总公司', '北京分公司', '上海分公司', '福州分公司', '深圳分公司', '杭州分公司']
+
+for (let i = 0; i < 5; i++) {
+ departmentList.push({
+ // 部门名称
+ departmentName: citys[i],
+ id: toAnyString(),
+ createTime: '@datetime',
+ // 状态
+ status: Mock.Random.integer(0, 1),
+ // 备注
+ remark: '@cword(10, 15)',
+ children: [
+ {
+ // 部门名称
+ departmentName: '研发部',
+ id: toAnyString(),
+ createTime: '@datetime',
+ // 状态
+ status: Mock.Random.integer(0, 1),
+ // 备注
+ remark: '@cword(10, 15)'
+ },
+ {
+ // 部门名称
+ departmentName: '产品部',
+ id: toAnyString(),
+ createTime: '@datetime',
+ // 状态
+ status: Mock.Random.integer(0, 1),
+ // 备注
+ remark: '@cword(10, 15)'
+ },
+ {
+ // 部门名称
+ departmentName: '运营部',
+ id: toAnyString(),
+ createTime: '@datetime',
+ // 状态
+ status: Mock.Random.integer(0, 1),
+ // 备注
+ remark: '@cword(10, 15)'
+ },
+ {
+ // 部门名称
+ departmentName: '市场部',
+ id: toAnyString(),
+ createTime: '@datetime',
+ // 状态
+ status: Mock.Random.integer(0, 1),
+ // 备注
+ remark: '@cword(10, 15)'
+ },
+ {
+ // 部门名称
+ departmentName: '销售部',
+ id: toAnyString(),
+ createTime: '@datetime',
+ // 状态
+ status: Mock.Random.integer(0, 1),
+ // 备注
+ remark: '@cword(10, 15)'
+ },
+ {
+ // 部门名称
+ departmentName: '客服部',
+ id: toAnyString(),
+ createTime: '@datetime',
+ // 状态
+ status: Mock.Random.integer(0, 1),
+ // 备注
+ remark: '@cword(10, 15)'
+ }
+ ]
+ })
+}
+
+export default [
+ // 列表接口
+ {
+ url: '/mock/department/list',
+ method: 'get',
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: {
+ list: departmentList
+ }
+ }
+ }
+ },
+ {
+ url: '/mock/department/table/list',
+ method: 'get',
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: {
+ list: departmentList,
+ total: 5
+ }
+ }
+ }
+ },
+ {
+ url: '/mock/department/users',
+ method: 'get',
+ timeout: 1000,
+ response: ({ query }) => {
+ const { pageSize } = query
+ // 根据pageSize来创建数据
+ const mockList: any = []
+ for (let i = 0; i < pageSize; i++) {
+ mockList.push(
+ Mock.mock({
+ // 用户名
+ username: '@cname',
+ // 账号
+ account: '@first',
+ // 邮箱
+ email: '@EMAIL',
+ // 创建时间
+ createTime: '@datetime',
+ // 用户id
+ id: toAnyString()
+ })
+ )
+ }
+ return {
+ code: SUCCESS_CODE,
+ data: {
+ total: 100,
+ list: mockList
+ }
+ }
+ }
+ },
+ // 保存接口
+ {
+ url: '/mock/department/user/save',
+ method: 'post',
+ timeout: 1000,
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: 'success'
+ }
+ }
+ },
+ // 删除接口
+ {
+ url: '/mock/department/user/delete',
+ method: 'post',
+ response: ({ body }) => {
+ const ids = body.ids
+ if (!ids) {
+ return {
+ code: 500,
+ message: '请选择需要删除的数据'
+ }
+ } else {
+ return {
+ code: SUCCESS_CODE,
+ data: 'success'
+ }
+ }
+ }
+ },
+ // 保存接口
+ {
+ url: '/mock/department/save',
+ method: 'post',
+ timeout: 1000,
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: 'success'
+ }
+ }
+ },
+ // 删除接口
+ {
+ url: '/mock/department/delete',
+ method: 'post',
+ response: ({ body }) => {
+ const ids = body.ids
+ if (!ids) {
+ return {
+ code: 500,
+ message: '请选择需要删除的数据'
+ }
+ } else {
+ return {
+ code: SUCCESS_CODE,
+ data: 'success'
+ }
+ }
+ }
+ }
+]
diff --git a/mock/dict/index.mock.ts b/mock/dict/index.mock.ts
new file mode 100644
index 0000000..29042c6
--- /dev/null
+++ b/mock/dict/index.mock.ts
@@ -0,0 +1,60 @@
+import { SUCCESS_CODE } from '@/constants'
+
+const timeout = 1000
+
+const dictObj: Recordable = {
+ importance: [
+ {
+ value: 0,
+ label: 'tableDemo.commonly'
+ },
+ {
+ value: 1,
+ label: 'tableDemo.good'
+ },
+ {
+ value: 2,
+ label: 'tableDemo.important'
+ }
+ ]
+}
+
+export default [
+ // 字典接口
+ {
+ url: '/mock/dict/list',
+ method: 'get',
+ timeout,
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: dictObj
+ }
+ }
+ },
+ // 获取某个字典
+ {
+ url: '/mock/dict/one',
+ method: 'get',
+ timeout,
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: [
+ {
+ label: 'test1',
+ value: 0
+ },
+ {
+ label: 'test2',
+ value: 1
+ },
+ {
+ label: 'test3',
+ value: 2
+ }
+ ]
+ }
+ }
+ }
+]
diff --git a/mock/menu/index.mock.ts b/mock/menu/index.mock.ts
new file mode 100644
index 0000000..2823692
--- /dev/null
+++ b/mock/menu/index.mock.ts
@@ -0,0 +1,357 @@
+import Mock from 'mockjs'
+import { SUCCESS_CODE } from '@/constants'
+
+const timeout = 1000
+
+export default [
+ // 列表接口
+ {
+ url: '/mock/menu/list',
+ method: 'get',
+ timeout,
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: {
+ list: [
+ {
+ path: '/dashboard',
+ component: '#',
+ redirect: '/dashboard/analysis',
+ name: 'Dashboard',
+ status: Mock.Random.integer(0, 1),
+ id: 1,
+ type: 0,
+ parentId: undefined,
+ title: '首页',
+ meta: {
+ title: '首页',
+ icon: 'vi-ant-design:dashboard-filled',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'analysis',
+ component: 'views/Dashboard/Analysis',
+ name: 'Analysis',
+ status: Mock.Random.integer(0, 1),
+ id: 2,
+ type: 1,
+ parentId: 1,
+ title: '分析页',
+ permissionList: [
+ {
+ id: 1,
+ label: '新增',
+ value: 'add'
+ },
+ {
+ id: 2,
+ label: '编辑',
+ value: 'edit'
+ }
+ ],
+ meta: {
+ title: '分析页',
+ noCache: true,
+ permission: ['add', 'edit']
+ }
+ },
+ {
+ path: 'workplace',
+ component: 'views/Dashboard/Workplace',
+ name: 'Workplace',
+ status: Mock.Random.integer(0, 1),
+ id: 3,
+ type: 1,
+ parentId: 1,
+ title: '工作台',
+ permissionList: [
+ {
+ id: 1,
+ label: '新增',
+ value: 'add'
+ },
+ {
+ id: 2,
+ label: '编辑',
+ value: 'edit'
+ },
+ {
+ id: 3,
+ label: '删除',
+ value: 'delete'
+ }
+ ],
+ meta: {
+ title: '工作台',
+ noCache: true
+ }
+ }
+ ]
+ },
+ {
+ path: '/external-link',
+ component: '#',
+ meta: {
+ title: '文档',
+ icon: 'vi-clarity:document-solid'
+ },
+ name: 'ExternalLink',
+ status: Mock.Random.integer(0, 1),
+ id: 4,
+ type: 0,
+ parentId: undefined,
+ title: '文档',
+ children: [
+ {
+ path: 'https://element-plus-admin-doc.cn/',
+ name: 'DocumentLink',
+ status: Mock.Random.integer(0, 1),
+ id: 5,
+ type: 1,
+ parentId: 4,
+ title: '文档',
+ meta: {
+ title: '文档'
+ }
+ }
+ ]
+ },
+ {
+ path: '/level',
+ component: '#',
+ redirect: '/level/menu1/menu1-1/menu1-1-1',
+ name: 'Level',
+ status: Mock.Random.integer(0, 1),
+ id: 6,
+ type: 0,
+ parentId: undefined,
+ title: '菜单',
+ meta: {
+ title: '菜单',
+ icon: 'vi-carbon:skill-level-advanced'
+ },
+ children: [
+ {
+ path: 'menu1',
+ name: 'Menu1',
+ component: '##',
+ status: Mock.Random.integer(0, 1),
+ id: 7,
+ type: 0,
+ parentId: 6,
+ title: '菜单1',
+ redirect: '/level/menu1/menu1-1/menu1-1-1',
+ meta: {
+ title: '菜单1'
+ },
+ children: [
+ {
+ path: 'menu1-1',
+ name: 'Menu11',
+ component: '##',
+ status: Mock.Random.integer(0, 1),
+ id: 8,
+ type: 0,
+ parentId: 7,
+ title: '菜单1-1',
+ redirect: '/level/menu1/menu1-1/menu1-1-1',
+ meta: {
+ title: '菜单1-1',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'menu1-1-1',
+ name: 'Menu111',
+ component: 'views/Level/Menu111',
+ status: Mock.Random.integer(0, 1),
+ id: 9,
+ type: 1,
+ parentId: 8,
+ title: '菜单1-1-1',
+ meta: {
+ title: '菜单1-1-1'
+ }
+ }
+ ]
+ },
+ {
+ path: 'menu1-2',
+ name: 'Menu12',
+ component: 'views/Level/Menu12',
+ status: Mock.Random.integer(0, 1),
+ id: 10,
+ type: 1,
+ parentId: 7,
+ title: '菜单1-2',
+ meta: {
+ title: '菜单1-2'
+ }
+ }
+ ]
+ },
+ {
+ path: 'menu2',
+ name: 'Menu2Demo',
+ component: 'views/Level/Menu2',
+ status: Mock.Random.integer(0, 1),
+ id: 11,
+ type: 1,
+ parentId: 6,
+ title: '菜单2',
+ meta: {
+ title: '菜单2'
+ }
+ }
+ ]
+ },
+ {
+ path: '/example',
+ component: '#',
+ redirect: '/example/example-dialog',
+ name: 'Example',
+ status: Mock.Random.integer(0, 1),
+ id: 12,
+ type: 0,
+ parentId: undefined,
+ title: '综合示例',
+ meta: {
+ title: '综合示例',
+ icon: 'vi-ep:management',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'example-dialog',
+ component: 'views/Example/Dialog/ExampleDialog',
+ name: 'ExampleDialog',
+ status: Mock.Random.integer(0, 1),
+ id: 13,
+ type: 1,
+ parentId: 12,
+ title: '综合示例-弹窗',
+ permissionList: [
+ {
+ id: 1,
+ label: '新增',
+ value: 'add'
+ },
+ {
+ id: 2,
+ label: '编辑',
+ value: 'edit'
+ },
+ {
+ id: 3,
+ label: '删除',
+ value: 'delete'
+ },
+ {
+ id: 4,
+ label: '查看',
+ value: 'view'
+ }
+ ],
+ meta: {
+ title: '综合示例-弹窗'
+ }
+ },
+ {
+ path: 'example-page',
+ component: 'views/Example/Page/ExamplePage',
+ name: 'ExamplePage',
+ status: Mock.Random.integer(0, 1),
+ id: 14,
+ type: 1,
+ parentId: 12,
+ title: '综合示例-页面',
+ permissionList: [
+ {
+ id: 1,
+ label: '新增',
+ value: 'add'
+ },
+ {
+ id: 2,
+ label: '编辑',
+ value: 'edit'
+ },
+ {
+ id: 3,
+ label: '删除',
+ value: 'delete'
+ },
+ {
+ id: 4,
+ label: '查看',
+ value: 'view'
+ }
+ ],
+ meta: {
+ title: '综合示例-页面'
+ }
+ },
+ {
+ path: 'example-add',
+ component: 'views/Example/Page/ExampleAdd',
+ name: 'ExampleAdd',
+ status: Mock.Random.integer(0, 1),
+ id: 15,
+ type: 1,
+ parentId: 12,
+ title: '综合示例-新增',
+ meta: {
+ title: '综合示例-新增',
+ noTagsView: true,
+ noCache: true,
+ hidden: true,
+ showMainRoute: true,
+ activeMenu: '/example/example-page'
+ }
+ },
+ {
+ path: 'example-edit',
+ component: 'views/Example/Page/ExampleEdit',
+ name: 'ExampleEdit',
+ status: Mock.Random.integer(0, 1),
+ id: 16,
+ type: 1,
+ parentId: 12,
+ title: '综合示例-编辑',
+ meta: {
+ title: '综合示例-编辑',
+ noTagsView: true,
+ noCache: true,
+ hidden: true,
+ showMainRoute: true,
+ activeMenu: '/example/example-page'
+ }
+ },
+ {
+ path: 'example-detail',
+ component: 'views/Example/Page/ExampleDetail',
+ name: 'ExampleDetail',
+ status: Mock.Random.integer(0, 1),
+ id: 17,
+ type: 1,
+ parentId: 12,
+ title: '综合示例-详情',
+ meta: {
+ title: '综合示例-详情',
+ noTagsView: true,
+ noCache: true,
+ hidden: true,
+ showMainRoute: true,
+ activeMenu: '/example/example-page'
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+]
diff --git a/mock/request/index.mock.ts b/mock/request/index.mock.ts
new file mode 100644
index 0000000..bfaa266
--- /dev/null
+++ b/mock/request/index.mock.ts
@@ -0,0 +1,72 @@
+import { SUCCESS_CODE } from '@/constants'
+
+const timeout = 600000
+
+export default [
+ {
+ url: '/mock/request/1',
+ method: 'get',
+ timeout,
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: 'request-1'
+ }
+ }
+ },
+ {
+ url: '/mock/request/2',
+ method: 'get',
+ timeout,
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: 'request-2'
+ }
+ }
+ },
+ {
+ url: '/mock/request/3',
+ method: 'get',
+ timeout,
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: 'request-3'
+ }
+ }
+ },
+ {
+ url: '/mock/request/4',
+ method: 'get',
+ timeout,
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: 'request-4'
+ }
+ }
+ },
+ {
+ url: '/mock/request/5',
+ method: 'get',
+ timeout,
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: 'request-5'
+ }
+ }
+ },
+ {
+ url: '/mock/request/expired',
+ method: 'get',
+ timeout: 0,
+ response: () => {
+ return {
+ code: 401,
+ message: 'token expired'
+ }
+ }
+ }
+]
diff --git a/mock/role/index.mock.ts b/mock/role/index.mock.ts
new file mode 100644
index 0000000..910b2cc
--- /dev/null
+++ b/mock/role/index.mock.ts
@@ -0,0 +1,1235 @@
+import Mock from 'mockjs'
+import { SUCCESS_CODE } from '@/constants'
+import { toAnyString } from '@/utils'
+
+const timeout = 1000
+
+const adminList = [
+ {
+ path: '/dashboard',
+ component: '#',
+ redirect: '/dashboard/analysis',
+ name: 'Dashboard',
+ meta: {
+ title: 'router.dashboard',
+ icon: 'vi-ant-design:dashboard-filled',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'analysis',
+ component: 'views/Dashboard/Analysis',
+ name: 'Analysis',
+ meta: {
+ title: 'router.analysis',
+ noCache: true,
+ affix: true
+ }
+ },
+ {
+ path: 'workplace',
+ component: 'views/Dashboard/Workplace',
+ name: 'Workplace',
+ meta: {
+ title: 'router.workplace',
+ noCache: true,
+ affix: true
+ }
+ }
+ ]
+ },
+ {
+ path: '/external-link',
+ component: '#',
+ meta: {},
+ name: 'ExternalLink',
+ children: [
+ {
+ path: 'https://element-plus-admin-doc.cn/',
+ name: 'DocumentLink',
+ meta: {
+ title: 'router.document',
+ icon: 'vi-clarity:document-solid'
+ }
+ }
+ ]
+ },
+ {
+ path: '/guide',
+ component: '#',
+ name: 'Guide',
+ meta: {},
+ children: [
+ {
+ path: 'index',
+ component: 'views/Guide/Guide',
+ name: 'GuideDemo',
+ meta: {
+ title: 'router.guide',
+ icon: 'vi-cib:telegram-plane'
+ }
+ }
+ ]
+ },
+ {
+ path: '/components',
+ component: '#',
+ redirect: '/components/form/default-form',
+ name: 'ComponentsDemo',
+ meta: {
+ title: 'router.component',
+ icon: 'vi-bx:bxs-component',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'form',
+ component: '##',
+ name: 'Form',
+ meta: {
+ title: 'router.form',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'default-form',
+ component: 'views/Components/Form/DefaultForm',
+ name: 'DefaultForm',
+ meta: {
+ title: 'router.defaultForm'
+ }
+ },
+ {
+ path: 'use-form',
+ component: 'views/Components/Form/UseFormDemo',
+ name: 'UseForm',
+ meta: {
+ title: 'UseForm'
+ }
+ }
+ ]
+ },
+ {
+ path: 'table',
+ component: '##',
+ redirect: '/components/table/default-table',
+ name: 'TableDemo',
+ meta: {
+ title: 'router.table',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'default-table',
+ component: 'views/Components/Table/DefaultTable',
+ name: 'DefaultTable',
+ meta: {
+ title: 'router.defaultTable'
+ }
+ },
+ {
+ path: 'use-table',
+ component: 'views/Components/Table/UseTableDemo',
+ name: 'UseTable',
+ meta: {
+ title: 'UseTable'
+ }
+ },
+ {
+ path: 'tree-table',
+ component: 'views/Components/Table/TreeTable',
+ name: 'TreeTable',
+ meta: {
+ title: 'TreeTable'
+ }
+ },
+ {
+ path: 'table-image-preview',
+ component: 'views/Components/Table/TableImagePreview',
+ name: 'TableImagePreview',
+ meta: {
+ title: 'router.PicturePreview'
+ }
+ },
+ {
+ path: 'table-video-preview',
+ component: 'views/Components/Table/TableVideoPreview',
+ name: 'TableVideoPreview',
+ meta: {
+ title: 'router.tableVideoPreview'
+ }
+ },
+ {
+ path: 'card-table',
+ component: 'views/Components/Table/CardTable',
+ name: 'CardTable',
+ meta: {
+ title: 'router.cardTable'
+ }
+ }
+ // {
+ // path: 'ref-table',
+ // component: 'views/Components/Table/RefTable',
+ // name: 'RefTable',
+ // meta: {
+ // title: 'RefTable'
+ // }
+ // }
+ ]
+ },
+ {
+ path: 'editor-demo',
+ component: '##',
+ redirect: '/components/editor-demo/editor',
+ name: 'EditorDemo',
+ meta: {
+ title: 'router.editor',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'editor',
+ component: 'views/Components/Editor/Editor',
+ name: 'Editor',
+ meta: {
+ title: 'router.richText'
+ }
+ },
+ {
+ path: 'json-editor',
+ component: 'views/Components/Editor/JsonEditor',
+ name: 'JsonEditor',
+ meta: {
+ title: 'router.jsonEditor'
+ }
+ },
+ {
+ path: 'code-editor',
+ component: 'views/Components/Editor/CodeEditor',
+ name: 'CodeEditor',
+ meta: {
+ title: 'router.codeEditor'
+ }
+ }
+ ]
+ },
+ {
+ path: 'search',
+ component: 'views/Components/Search',
+ name: 'Search',
+ meta: {
+ title: 'router.search'
+ }
+ },
+ {
+ path: 'descriptions',
+ component: 'views/Components/Descriptions',
+ name: 'Descriptions',
+ meta: {
+ title: 'router.descriptions'
+ }
+ },
+ {
+ path: 'image-viewer',
+ component: 'views/Components/ImageViewer',
+ name: 'ImageViewer',
+ meta: {
+ title: 'router.imageViewer'
+ }
+ },
+ {
+ path: 'dialog',
+ component: 'views/Components/Dialog',
+ name: 'Dialog',
+ meta: {
+ title: 'router.dialog'
+ }
+ },
+ {
+ path: 'icon',
+ component: 'views/Components/Icon',
+ name: 'Icon',
+ meta: {
+ title: 'router.icon'
+ }
+ },
+ {
+ path: 'icon-picker',
+ component: 'views/Components/IconPicker',
+ name: 'IconPicker',
+ meta: {
+ title: 'router.iconPicker'
+ }
+ },
+ {
+ path: 'echart',
+ component: 'views/Components/Echart',
+ name: 'Echart',
+ meta: {
+ title: 'router.echart'
+ }
+ },
+ {
+ path: 'count-to',
+ component: 'views/Components/CountTo',
+ name: 'CountTo',
+ meta: {
+ title: 'router.countTo'
+ }
+ },
+ {
+ path: 'qrcode',
+ component: 'views/Components/Qrcode',
+ name: 'Qrcode',
+ meta: {
+ title: 'router.qrcode'
+ }
+ },
+ {
+ path: 'highlight',
+ component: 'views/Components/Highlight',
+ name: 'Highlight',
+ meta: {
+ title: 'router.highlight'
+ }
+ },
+ {
+ path: 'infotip',
+ component: 'views/Components/Infotip',
+ name: 'Infotip',
+ meta: {
+ title: 'router.infotip'
+ }
+ },
+ {
+ path: 'input-password',
+ component: 'views/Components/InputPassword',
+ name: 'InputPassword',
+ meta: {
+ title: 'router.inputPassword'
+ }
+ },
+ {
+ path: 'waterfall',
+ component: 'views/Components/Waterfall',
+ name: 'Waterfall',
+ meta: {
+ title: 'router.waterfall'
+ }
+ },
+ {
+ path: 'image-cropping',
+ component: 'views/Components/ImageCropping',
+ name: 'ImageCropping',
+ meta: {
+ title: 'router.imageCropping'
+ }
+ },
+ {
+ path: 'video-player',
+ component: 'views/Components/VideoPlayer',
+ name: 'VideoPlayer',
+ meta: {
+ title: 'router.videoPlayer'
+ }
+ },
+ {
+ path: 'avatars',
+ component: 'views/Components/Avatars',
+ name: 'Avatars',
+ meta: {
+ title: 'router.avatars'
+ }
+ },
+ {
+ path: 'i-agree',
+ component: 'views/Components/IAgree',
+ name: 'IAgree',
+ meta: {
+ title: 'router.iAgree'
+ }
+ },
+ {
+ path: 'tree',
+ component: 'views/Components/Tree',
+ name: 'Tree',
+ meta: {
+ title: 'router.tree'
+ }
+ }
+ ]
+ },
+ {
+ path: '/function',
+ component: '#',
+ redirect: '/function/multipleTabs',
+ name: 'Function',
+ meta: {
+ title: 'router.function',
+ icon: 'vi-ri:function-fill',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'multipleTabs',
+ component: 'views/Function/MultipleTabs',
+ name: 'MultipleTabs',
+ meta: {
+ title: 'router.multipleTabs'
+ }
+ },
+ {
+ path: 'multiple-tabs-demo/:id',
+ component: 'views/Function/MultipleTabsDemo',
+ name: 'MultipleTabsDemo',
+ meta: {
+ hidden: true,
+ title: 'router.details',
+ canTo: true
+ }
+ },
+ {
+ path: 'request',
+ component: 'views/Function/Request',
+ name: 'Request',
+ meta: {
+ title: 'router.request'
+ }
+ },
+ {
+ path: 'test',
+ component: 'views/Function/Test',
+ name: 'Test',
+ meta: {
+ title: 'router.permission',
+ permission: ['add', 'edit', 'delete']
+ }
+ }
+ ]
+ },
+ {
+ path: '/hooks',
+ component: '#',
+ redirect: '/hooks/useWatermark',
+ name: 'Hooks',
+ meta: {
+ title: 'hooks',
+ icon: 'vi-ic:outline-webhook',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'useWatermark',
+ component: 'views/hooks/useWatermark',
+ name: 'UseWatermark',
+ meta: {
+ title: 'useWatermark'
+ }
+ },
+ {
+ path: 'useTagsView',
+ component: 'views/hooks/useTagsView',
+ name: 'UseTagsView',
+ meta: {
+ title: 'useTagsView'
+ }
+ },
+ {
+ path: 'useValidator',
+ component: 'views/hooks/useValidator',
+ name: 'UseValidator',
+ meta: {
+ title: 'useValidator'
+ }
+ },
+ {
+ path: 'useCrudSchemas',
+ component: 'views/hooks/useCrudSchemas',
+ name: 'UseCrudSchemas',
+ meta: {
+ title: 'useCrudSchemas'
+ }
+ },
+ {
+ path: 'useClipboard',
+ component: 'views/hooks/useClipboard',
+ name: 'UseClipboard',
+ meta: {
+ title: 'useClipboard'
+ }
+ },
+ {
+ path: 'useNetwork',
+ component: 'views/hooks/useNetwork',
+ name: 'UseNetwork',
+ meta: {
+ title: 'useNetwork'
+ }
+ }
+ ]
+ },
+ {
+ path: '/level',
+ component: '#',
+ redirect: '/level/menu1/menu1-1/menu1-1-1',
+ name: 'Level',
+ meta: {
+ title: 'router.level',
+ icon: 'vi-carbon:skill-level-advanced'
+ },
+ children: [
+ {
+ path: 'menu1',
+ name: 'Menu1',
+ component: '##',
+ redirect: '/level/menu1/menu1-1/menu1-1-1',
+ meta: {
+ title: 'router.menu1'
+ },
+ children: [
+ {
+ path: 'menu1-1',
+ name: 'Menu11',
+ component: '##',
+ redirect: '/level/menu1/menu1-1/menu1-1-1',
+ meta: {
+ title: 'router.menu11',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'menu1-1-1',
+ name: 'Menu111',
+ component: 'views/Level/Menu111',
+ meta: {
+ title: 'router.menu111'
+ }
+ }
+ ]
+ },
+ {
+ path: 'menu1-2',
+ name: 'Menu12',
+ component: 'views/Level/Menu12',
+ meta: {
+ title: 'router.menu12'
+ }
+ }
+ ]
+ },
+ {
+ path: 'menu2',
+ name: 'Menu2Demo',
+ component: 'views/Level/Menu2',
+ meta: {
+ title: 'router.menu2'
+ }
+ }
+ ]
+ },
+ {
+ path: '/example',
+ component: '#',
+ redirect: '/example/example-dialog',
+ name: 'Example',
+ meta: {
+ title: 'router.example',
+ icon: 'vi-ep:management',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'example-dialog',
+ component: 'views/Example/Dialog/ExampleDialog',
+ name: 'ExampleDialog',
+ meta: {
+ title: 'router.exampleDialog'
+ }
+ },
+ {
+ path: 'example-page',
+ component: 'views/Example/Page/ExamplePage',
+ name: 'ExamplePage',
+ meta: {
+ title: 'router.examplePage'
+ }
+ },
+ {
+ path: 'example-add',
+ component: 'views/Example/Page/ExampleAdd',
+ name: 'ExampleAdd',
+ meta: {
+ title: 'router.exampleAdd',
+ noTagsView: true,
+ noCache: true,
+ hidden: true,
+ showMainRoute: true,
+ activeMenu: '/example/example-page'
+ }
+ },
+ {
+ path: 'example-edit',
+ component: 'views/Example/Page/ExampleEdit',
+ name: 'ExampleEdit',
+ meta: {
+ title: 'router.exampleEdit',
+ noTagsView: true,
+ noCache: true,
+ hidden: true,
+ showMainRoute: true,
+ activeMenu: '/example/example-page'
+ }
+ },
+ {
+ path: 'example-detail',
+ component: 'views/Example/Page/ExampleDetail',
+ name: 'ExampleDetail',
+ meta: {
+ title: 'router.exampleDetail',
+ noTagsView: true,
+ noCache: true,
+ hidden: true,
+ showMainRoute: true,
+ activeMenu: '/example/example-page'
+ }
+ }
+ ]
+ },
+ {
+ path: '/error',
+ component: '#',
+ redirect: '/error/404',
+ name: 'Error',
+ meta: {
+ title: 'router.errorPage',
+ icon: 'vi-ci:error',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: '404-demo',
+ component: 'views/Error/404',
+ name: '404Demo',
+ meta: {
+ title: '404'
+ }
+ },
+ {
+ path: '403-demo',
+ component: 'views/Error/403',
+ name: '403Demo',
+ meta: {
+ title: '403'
+ }
+ },
+ {
+ path: '500-demo',
+ component: 'views/Error/500',
+ name: '500Demo',
+ meta: {
+ title: '500'
+ }
+ }
+ ]
+ },
+ {
+ path: '/authorization',
+ component: '#',
+ redirect: '/authorization/user',
+ name: 'Authorization',
+ meta: {
+ title: 'router.authorization',
+ icon: 'vi-eos-icons:role-binding',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'department',
+ component: 'views/Authorization/Department/Department',
+ name: 'Department',
+ meta: {
+ title: 'router.department'
+ }
+ },
+ {
+ path: 'user',
+ component: 'views/Authorization/User/User',
+ name: 'User',
+ meta: {
+ title: 'router.user'
+ }
+ },
+ {
+ path: 'menu',
+ component: 'views/Authorization/Menu/Menu',
+ name: 'Menu',
+ meta: {
+ title: 'router.menuManagement'
+ }
+ },
+ {
+ path: 'role',
+ component: 'views/Authorization/Role/Role',
+ name: 'Role',
+ meta: {
+ title: 'router.role'
+ }
+ }
+ ]
+ }
+]
+
+const testList: string[] = [
+ '/dashboard',
+ '/dashboard/analysis',
+ '/dashboard/workplace',
+ 'external-link',
+ 'https://element-plus-admin-doc.cn/',
+ '/guide',
+ '/guide/index',
+ '/components',
+ '/components/form',
+ '/components/form/default-form',
+ '/components/form/use-form',
+ '/components/form/ref-form',
+ '/components/table',
+ '/components/table/default-table',
+ '/components/table/use-table',
+ '/components/table/tree-table',
+ '/components/table/table-image-preview',
+ '/components/table/table-video-preview',
+ '/components/table/ref-table',
+ '/components/table/card-table',
+ '/components/editor-demo',
+ '/components/editor-demo/editor',
+ '/components/editor-demo/json-editor',
+ '/components/editor-demo/code-editor',
+ '/components/search',
+ '/components/descriptions',
+ '/components/image-viewer',
+ '/components/dialog',
+ '/components/icon',
+ '/components/iconPicker',
+ '/components/echart',
+ '/components/count-to',
+ '/components/qrcode',
+ '/components/highlight',
+ '/components/infotip',
+ '/components/input-password',
+ '/components/waterfall',
+ '/components/image-cropping',
+ '/components/video-player',
+ '/components/avatars',
+ '/components/i-agree',
+ 'function',
+ '/function/multiple-tabs',
+ '/function/multiple-tabs-demo/:id',
+ '/function/request',
+ '/function/test',
+ '/hooks',
+ '/hooks/useWatermark',
+ '/hooks/useTagsView',
+ '/hooks/useValidator',
+ '/hooks/useCrudSchemas',
+ '/hooks/useClipboard',
+ '/hooks/useNetwork',
+ '/level',
+ '/level/menu1',
+ '/level/menu1/menu1-1',
+ '/level/menu1/menu1-1/menu1-1-1',
+ '/level/menu1/menu1-2',
+ '/level/menu2',
+ '/example',
+ '/example/example-dialog',
+ '/example/example-page',
+ '/example/example-add',
+ '/example/example-edit',
+ '/example/example-detail',
+ '/authorization',
+ '/authorization/department',
+ '/authorization/user',
+ '/authorization/role',
+ '/authorization/menu',
+ '/error',
+ '/error/404-demo',
+ '/error/403-demo',
+ '/error/500-demo'
+]
+
+const List: any[] = []
+
+const roleNames = ['超级管理员', '管理员', '普通用户', '游客']
+const menus = [
+ [
+ {
+ path: '/dashboard',
+ component: '#',
+ redirect: '/dashboard/analysis',
+ name: 'Dashboard',
+ status: Mock.Random.integer(0, 1),
+ id: 1,
+ meta: {
+ title: '首页',
+ icon: 'vi-ant-design:dashboard-filled',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'analysis',
+ component: 'views/Dashboard/Analysis',
+ name: 'Analysis',
+ status: Mock.Random.integer(0, 1),
+ id: 2,
+ meta: {
+ title: '分析页',
+ noCache: true
+ }
+ },
+ {
+ path: 'workplace',
+ component: 'views/Dashboard/Workplace',
+ name: 'Workplace',
+ status: Mock.Random.integer(0, 1),
+ id: 3,
+ meta: {
+ title: '工作台',
+ noCache: true
+ }
+ }
+ ]
+ },
+ {
+ path: '/external-link',
+ component: '#',
+ meta: {
+ title: '文档',
+ icon: 'vi-clarity:document-solid'
+ },
+ name: 'ExternalLink',
+ status: Mock.Random.integer(0, 1),
+ id: 4,
+ children: [
+ {
+ path: 'https://element-plus-admin-doc.cn/',
+ name: 'DocumentLink',
+ status: Mock.Random.integer(0, 1),
+ id: 5,
+ meta: {
+ title: '文档'
+ }
+ }
+ ]
+ },
+ {
+ path: '/level',
+ component: '#',
+ redirect: '/level/menu1/menu1-1/menu1-1-1',
+ name: 'Level',
+ status: Mock.Random.integer(0, 1),
+ id: 6,
+ meta: {
+ title: '菜单',
+ icon: 'vi-carbon:skill-level-advanced'
+ },
+ children: [
+ {
+ path: 'menu1',
+ name: 'Menu1',
+ component: '##',
+ status: Mock.Random.integer(0, 1),
+ id: 7,
+ redirect: '/level/menu1/menu1-1/menu1-1-1',
+ meta: {
+ title: '菜单1'
+ },
+ children: [
+ {
+ path: 'menu1-1',
+ name: 'Menu11',
+ component: '##',
+ status: Mock.Random.integer(0, 1),
+ id: 8,
+ redirect: '/level/menu1/menu1-1/menu1-1-1',
+ meta: {
+ title: '菜单1-1',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'menu1-1-1',
+ name: 'Menu111',
+ component: 'views/Level/Menu111',
+ status: Mock.Random.integer(0, 1),
+ id: 9,
+ permission: ['edit', 'add', 'delete'],
+ meta: {
+ title: '菜单1-1-1',
+ permission: ['edit', 'add', 'delete']
+ }
+ }
+ ]
+ },
+ {
+ path: 'menu1-2',
+ name: 'Menu12',
+ component: 'views/Level/Menu12',
+ status: Mock.Random.integer(0, 1),
+ id: 10,
+ permission: ['edit', 'add', 'delete'],
+ meta: {
+ title: '菜单1-2',
+ permission: ['edit', 'add', 'delete']
+ }
+ }
+ ]
+ },
+ {
+ path: 'menu2',
+ name: 'Menu2Demo',
+ component: 'views/Level/Menu2',
+ status: Mock.Random.integer(0, 1),
+ id: 11,
+ permission: ['edit', 'add', 'delete'],
+ meta: {
+ title: '菜单2',
+ permission: ['edit', 'add', 'delete']
+ }
+ }
+ ]
+ },
+ {
+ path: '/example',
+ component: '#',
+ redirect: '/example/example-dialog',
+ name: 'Example',
+ status: Mock.Random.integer(0, 1),
+ id: 12,
+ meta: {
+ title: '综合示例',
+ icon: 'vi-ep:management',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'example-dialog',
+ component: 'views/Example/Dialog/ExampleDialog',
+ name: 'ExampleDialog',
+ status: Mock.Random.integer(0, 1),
+ id: 13,
+ permission: ['edit', 'add', 'delete'],
+ meta: {
+ title: '综合示例-弹窗',
+ permission: ['edit', 'add', 'delete']
+ }
+ },
+ {
+ path: 'example-page',
+ component: 'views/Example/Page/ExamplePage',
+ name: 'ExamplePage',
+ status: Mock.Random.integer(0, 1),
+ id: 14,
+ permission: ['edit', 'add', 'delete'],
+ meta: {
+ title: '综合示例-页面',
+ permission: ['edit', 'add', 'delete']
+ }
+ },
+ {
+ path: 'example-add',
+ component: 'views/Example/Page/ExampleAdd',
+ name: 'ExampleAdd',
+ status: Mock.Random.integer(0, 1),
+ id: 15,
+ permission: ['edit', 'add', 'delete'],
+ meta: {
+ title: '综合示例-新增',
+ noTagsView: true,
+ noCache: true,
+ hidden: true,
+ showMainRoute: true,
+ activeMenu: '/example/example-page',
+ permission: ['edit', 'add', 'delete']
+ }
+ },
+ {
+ path: 'example-edit',
+ component: 'views/Example/Page/ExampleEdit',
+ name: 'ExampleEdit',
+ status: Mock.Random.integer(0, 1),
+ id: 16,
+ permission: ['edit', 'add', 'delete'],
+ meta: {
+ title: '综合示例-编辑',
+ noTagsView: true,
+ noCache: true,
+ hidden: true,
+ showMainRoute: true,
+ activeMenu: '/example/example-page',
+ permission: ['edit', 'add', 'delete']
+ }
+ },
+ {
+ path: 'example-detail',
+ component: 'views/Example/Page/ExampleDetail',
+ name: 'ExampleDetail',
+ status: Mock.Random.integer(0, 1),
+ id: 17,
+ permission: ['edit', 'add', 'delete'],
+ meta: {
+ title: '综合示例-详情',
+ noTagsView: true,
+ noCache: true,
+ hidden: true,
+ showMainRoute: true,
+ activeMenu: '/example/example-page',
+ permission: ['edit', 'add', 'delete']
+ }
+ }
+ ]
+ }
+ ],
+ [
+ {
+ path: '/dashboard',
+ component: '#',
+ redirect: '/dashboard/analysis',
+ name: 'Dashboard',
+ status: Mock.Random.integer(0, 1),
+ id: 1,
+ meta: {
+ title: '首页',
+ icon: 'vi-ant-design:dashboard-filled',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'analysis',
+ component: 'views/Dashboard/Analysis',
+ name: 'Analysis',
+ status: Mock.Random.integer(0, 1),
+ id: 2,
+ meta: {
+ title: '分析页',
+ noCache: true
+ }
+ },
+ {
+ path: 'workplace',
+ component: 'views/Dashboard/Workplace',
+ name: 'Workplace',
+ status: Mock.Random.integer(0, 1),
+ id: 3,
+ meta: {
+ title: '工作台',
+ noCache: true
+ }
+ }
+ ]
+ }
+ ],
+ [
+ {
+ path: '/external-link',
+ component: '#',
+ meta: {
+ title: '文档',
+ icon: 'vi-clarity:document-solid'
+ },
+ name: 'ExternalLink',
+ status: Mock.Random.integer(0, 1),
+ id: 4,
+ children: [
+ {
+ path: 'https://element-plus-admin-doc.cn/',
+ name: 'DocumentLink',
+ status: Mock.Random.integer(0, 1),
+ id: 5,
+ meta: {
+ title: '文档'
+ }
+ }
+ ]
+ },
+ {
+ path: '/level',
+ component: '#',
+ redirect: '/level/menu1/menu1-1/menu1-1-1',
+ name: 'Level',
+ status: Mock.Random.integer(0, 1),
+ id: 6,
+ meta: {
+ title: '菜单',
+ icon: 'vi-carbon:skill-level-advanced'
+ },
+ children: [
+ {
+ path: 'menu1',
+ name: 'Menu1',
+ component: '##',
+ status: Mock.Random.integer(0, 1),
+ id: 7,
+ redirect: '/level/menu1/menu1-1/menu1-1-1',
+ meta: {
+ title: '菜单1'
+ },
+ children: [
+ {
+ path: 'menu1-1',
+ name: 'Menu11',
+ component: '##',
+ status: Mock.Random.integer(0, 1),
+ id: 8,
+ redirect: '/level/menu1/menu1-1/menu1-1-1',
+ meta: {
+ title: '菜单1-1',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'menu1-1-1',
+ name: 'Menu111',
+ component: 'views/Level/Menu111',
+ status: Mock.Random.integer(0, 1),
+ id: 9,
+ permission: ['edit', 'add', 'delete'],
+ meta: {
+ title: '菜单1-1-1',
+ permission: ['edit', 'add', 'delete']
+ }
+ }
+ ]
+ },
+ {
+ path: 'menu1-2',
+ name: 'Menu12',
+ component: 'views/Level/Menu12',
+ status: Mock.Random.integer(0, 1),
+ id: 10,
+ permission: ['edit', 'add', 'delete'],
+ meta: {
+ title: '菜单1-2',
+ permission: ['edit', 'add', 'delete']
+ }
+ }
+ ]
+ },
+ {
+ path: 'menu2',
+ name: 'Menu2Demo',
+ component: 'views/Level/Menu2',
+ status: Mock.Random.integer(0, 1),
+ id: 11,
+ permission: ['edit', 'add', 'delete'],
+ meta: {
+ title: '菜单2',
+ permission: ['edit', 'add', 'delete']
+ }
+ }
+ ]
+ }
+ ],
+ [
+ {
+ path: '/example',
+ component: '#',
+ redirect: '/example/example-dialog',
+ name: 'Example',
+ status: Mock.Random.integer(0, 1),
+ id: 12,
+ meta: {
+ title: '综合示例',
+ icon: 'vi-ep:management',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'example-detail',
+ component: 'views/Example/Page/ExampleDetail',
+ name: 'ExampleDetail',
+ status: Mock.Random.integer(0, 1),
+ id: 17,
+ permission: ['edit', 'add', 'delete'],
+ meta: {
+ title: '综合示例-详情',
+ noTagsView: true,
+ noCache: true,
+ hidden: true,
+ showMainRoute: true,
+ activeMenu: '/example/example-page',
+ permission: ['edit', 'add', 'delete']
+ }
+ }
+ ]
+ }
+ ]
+]
+
+for (let i = 0; i < 4; i++) {
+ List.push(
+ Mock.mock({
+ id: toAnyString(),
+ // timestamp: +Mock.Random.date('T'),
+ roleName: roleNames[i],
+ role: '@first',
+ status: Mock.Random.integer(0, 1),
+ createTime: '@datetime',
+ remark: '@cword(10, 15)',
+ menu: menus[i]
+ })
+ )
+}
+
+export default [
+ // 列表接口
+ {
+ url: '/mock/role/list',
+ method: 'get',
+ timeout,
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: adminList
+ }
+ }
+ },
+ {
+ url: '/mock/role/table',
+ method: 'get',
+ timeout,
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: {
+ list: List,
+ total: 4
+ }
+ }
+ }
+ },
+ // 列表接口
+ {
+ url: '/mock/role/list2',
+ method: 'get',
+ timeout,
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: testList
+ }
+ }
+ },
+ {
+ url: '/mock/role/table',
+ method: 'get',
+ timeout,
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: {
+ list: List,
+ total: 4
+ }
+ }
+ }
+ }
+]
diff --git a/mock/table/index.mock.ts b/mock/table/index.mock.ts
new file mode 100644
index 0000000..a83ed14
--- /dev/null
+++ b/mock/table/index.mock.ts
@@ -0,0 +1,319 @@
+import Mock from 'mockjs'
+import { SUCCESS_CODE } from '@/constants'
+import { toAnyString } from '@/utils'
+
+const timeout = 1000
+const count = 100
+
+const baseContent =
+ 'I am testing data, I am testing data.
'
+
+interface ListProps {
+ id: string
+ author: string
+ title: string
+ content: string
+ importance: number
+ display_time: any
+ pageviews: number
+ image_uri: string
+ video_uri?: string
+}
+
+interface TreeListProps {
+ id: string
+ author: string
+ title: string
+ content: string
+ importance: number
+ display_time: any
+ image_uri: string
+ pageviews: number
+ video_uri?: string
+ children?: TreeListProps[]
+}
+
+let List: ListProps[] = []
+
+for (let i = 0; i < count; i++) {
+ List.push(
+ Mock.mock({
+ id: toAnyString(),
+ // timestamp: +Mock.Random.date('T'),
+ author: '@first',
+ title: '@title(5, 10)',
+ content: baseContent,
+ importance: '@integer(1, 3)',
+ display_time: '@datetime',
+ pageviews: '@integer(100, 500)',
+ image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)'),
+ video_uri:
+ '//sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-720p.mp4'
+ })
+ )
+}
+
+const treeList: TreeListProps[] = []
+
+for (let i = 0; i < count; i++) {
+ treeList.push(
+ Mock.mock({
+ id: toAnyString(),
+ // timestamp: +Mock.Random.date('T'),
+ author: '@first',
+ title: '@title(5, 10)',
+ content: baseContent,
+ importance: '@integer(1, 3)',
+ display_time: '@datetime',
+ pageviews: '@integer(300, 5000)',
+ image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)'),
+ children: [
+ {
+ id: toAnyString(),
+ // timestamp: +Mock.Random.date('T'),
+ author: '@first',
+ title: '@title(5, 10)',
+ content: baseContent,
+ importance: '@integer(1, 3)',
+ display_time: '@datetime',
+ pageviews: '@integer(300, 5000)',
+ image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)'),
+ children: [
+ {
+ id: toAnyString(),
+ // timestamp: +Mock.Random.date('T'),
+ author: '@first',
+ title: '@title(5, 10)',
+ content: baseContent,
+ importance: '@integer(1, 3)',
+ display_time: '@datetime',
+ pageviews: '@integer(300, 5000)',
+ image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)')
+ },
+ {
+ id: toAnyString(),
+ // timestamp: +Mock.Random.date('T'),
+ author: '@first',
+ title: '@title(5, 10)',
+ content: baseContent,
+ importance: '@integer(1, 3)',
+ display_time: '@datetime',
+ pageviews: '@integer(300, 5000)',
+ image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)')
+ }
+ ]
+ },
+ {
+ id: toAnyString(),
+ // timestamp: +Mock.Random.date('T'),
+ author: '@first',
+ title: '@title(5, 10)',
+ content: baseContent,
+ importance: '@integer(1, 3)',
+ display_time: '@datetime',
+ pageviews: '@integer(300, 5000)',
+ image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)')
+ },
+ {
+ id: toAnyString(),
+ // timestamp: +Mock.Random.date('T'),
+ author: '@first',
+ title: '@title(5, 10)',
+ content: baseContent,
+ importance: '@integer(1, 3)',
+ display_time: '@datetime',
+ pageviews: '@integer(300, 5000)',
+ image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)')
+ },
+ {
+ id: toAnyString(),
+ // timestamp: +Mock.Random.date('T'),
+ author: '@first',
+ title: '@title(5, 10)',
+ content: baseContent,
+ importance: '@integer(1, 3)',
+ display_time: '@datetime',
+ pageviews: '@integer(300, 5000)',
+ image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)')
+ }
+ ]
+ // image_uri
+ })
+ )
+}
+
+const cardList = [
+ {
+ logo: 'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png',
+ name: 'Alipay',
+ desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。'
+ },
+ {
+ logo: 'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png',
+ name: 'Angular',
+ desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。'
+ },
+ {
+ logo: 'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png',
+ name: 'Bootstrap',
+ desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。'
+ },
+ {
+ logo: 'https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png',
+ name: 'React',
+ desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。'
+ },
+ {
+ logo: 'https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png',
+ name: 'Vue',
+ desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。'
+ },
+ {
+ logo: 'https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png',
+ name: 'Webpack',
+ desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。'
+ }
+]
+
+export default [
+ // 树形列表接口
+ {
+ url: '/mock/example/treeList',
+ method: 'get',
+ timeout,
+ response: ({ query }) => {
+ const { title, pageIndex, pageSize } = query
+ const mockList = treeList.filter((item) => {
+ if (title && item.title.indexOf(title) < 0) return false
+ return true
+ })
+ const pageList = mockList.filter(
+ (_, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1)
+ )
+ return {
+ code: SUCCESS_CODE,
+ data: {
+ total: mockList.length,
+ list: pageList
+ }
+ }
+ }
+ },
+ // 列表接口
+ {
+ url: '/mock/example/list',
+ method: 'get',
+ timeout,
+ response: ({ query }) => {
+ const { title, pageIndex, pageSize } = query
+ const mockList = List.filter((item) => {
+ if (title && item.title.indexOf(title) < 0) return false
+ return true
+ })
+ const pageList = mockList.filter(
+ (_, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1)
+ )
+ return {
+ code: SUCCESS_CODE,
+ data: {
+ total: mockList.length,
+ list: pageList
+ }
+ }
+ }
+ },
+ // 保存接口
+ {
+ url: '/mock/example/save',
+ method: 'post',
+ timeout,
+ response: ({ body }) => {
+ if (!body.id) {
+ List = [
+ Object.assign(body, {
+ id: toAnyString()
+ })
+ ].concat(List)
+ return {
+ code: SUCCESS_CODE,
+ data: 'success'
+ }
+ } else {
+ List.map((item) => {
+ if (item.id === body.id) {
+ for (const key in item) {
+ item[key] = body[key]
+ }
+ }
+ })
+ return {
+ code: SUCCESS_CODE,
+ data: 'success'
+ }
+ }
+ }
+ },
+ // 详情接口
+ {
+ url: '/mock/example/detail',
+ method: 'get',
+ response: ({ query }) => {
+ const { id } = query
+ for (const example of List) {
+ if (example.id === id) {
+ return {
+ code: SUCCESS_CODE,
+ data: example
+ }
+ }
+ }
+ }
+ },
+ // 删除接口
+ {
+ url: '/mock/example/delete',
+ method: 'post',
+ response: ({ body }) => {
+ const ids = body.ids
+ if (!ids) {
+ return {
+ code: 500,
+ message: '请选择需要删除的数据'
+ }
+ } else {
+ let i = List.length
+ while (i--) {
+ if (ids.indexOf(List[i].id) !== -1) {
+ List.splice(i, 1)
+ }
+ }
+ return {
+ code: SUCCESS_CODE,
+ data: 'success'
+ }
+ }
+ }
+ },
+ {
+ url: '/mock/card/list',
+ method: 'get',
+ timeout,
+ response: ({ query }) => {
+ const { name, pageIndex, pageSize } = query
+ const mockList = cardList.filter((item) => {
+ if (name && item.name.indexOf(name) < 0) return false
+ return true
+ })
+ const pageList = mockList.filter(
+ (_, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1)
+ )
+ return {
+ code: SUCCESS_CODE,
+ data: {
+ total: mockList.length,
+ list: pageList
+ }
+ }
+ }
+ }
+]
diff --git a/mock/user/index.mock.ts b/mock/user/index.mock.ts
new file mode 100644
index 0000000..4e5918c
--- /dev/null
+++ b/mock/user/index.mock.ts
@@ -0,0 +1,90 @@
+import { SUCCESS_CODE } from '@/constants'
+
+const timeout = 1000
+
+const List: {
+ username: string
+ password: string
+ role: string
+ roleId: string
+ permissions: string | string[]
+}[] = [
+ {
+ username: 'admin',
+ password: 'admin',
+ role: 'admin',
+ roleId: '1',
+ permissions: ['*.*.*']
+ },
+ {
+ username: 'test',
+ password: 'test',
+ role: 'test',
+ roleId: '2',
+ permissions: ['example:dialog:create', 'example:dialog:delete']
+ }
+]
+
+export default [
+ // 列表接口
+ {
+ url: '/mock/user/list',
+ method: 'get',
+ response: ({ query }) => {
+ const { username, pageIndex, pageSize } = query
+
+ const mockList = List.filter((item) => {
+ if (username && item.username.indexOf(username) < 0) return false
+ return true
+ })
+ const pageList = mockList.filter(
+ (_, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1)
+ )
+
+ return {
+ code: SUCCESS_CODE,
+ data: {
+ total: mockList.length,
+ list: pageList
+ }
+ }
+ }
+ },
+ // 登录接口
+ {
+ url: '/mock/user/login',
+ method: 'post',
+ timeout,
+ response: ({ body }) => {
+ const data = body
+ let hasUser = false
+ for (const user of List) {
+ if (user.username === data.username && user.password === data.password) {
+ hasUser = true
+ return {
+ code: SUCCESS_CODE,
+ data: user
+ }
+ }
+ }
+ if (!hasUser) {
+ return {
+ code: 500,
+ message: '账号或密码错误'
+ }
+ }
+ }
+ },
+ // 退出接口
+ {
+ url: '/mock/user/loginOut',
+ method: 'get',
+ timeout,
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: null
+ }
+ }
+ }
+]
diff --git a/mock/workplace/index.mock.ts b/mock/workplace/index.mock.ts
new file mode 100644
index 0000000..593ba27
--- /dev/null
+++ b/mock/workplace/index.mock.ts
@@ -0,0 +1,169 @@
+import { SUCCESS_CODE } from '@/constants'
+
+const timeout = 1000
+
+export default [
+ // 获取统计
+ {
+ url: '/mock/workplace/total',
+ method: 'get',
+ timeout,
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: {
+ project: 40,
+ access: 2340,
+ todo: 10
+ }
+ }
+ }
+ },
+ // 获取项目
+ {
+ url: '/mock/workplace/project',
+ method: 'get',
+ timeout,
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: [
+ {
+ name: 'Github',
+ icon: 'akar-icons:github-fill',
+ message: 'workplace.introduction',
+ personal: 'Archer',
+ time: new Date()
+ },
+ {
+ name: 'Vue',
+ icon: 'logos:vue',
+ message: 'workplace.introduction',
+ personal: 'Archer',
+ time: new Date()
+ },
+ {
+ name: 'Angular',
+ icon: 'logos:angular-icon',
+ message: 'workplace.introduction',
+ personal: 'Archer',
+ time: new Date()
+ },
+ {
+ name: 'React',
+ icon: 'logos:react',
+ message: 'workplace.introduction',
+ personal: 'Archer',
+ time: new Date()
+ },
+ {
+ name: 'Webpack',
+ icon: 'logos:webpack',
+ message: 'workplace.introduction',
+ personal: 'Archer',
+ time: new Date()
+ },
+ {
+ name: 'Vite',
+ icon: 'vscode-icons:file-type-vite',
+ message: 'workplace.introduction',
+ personal: 'Archer',
+ time: new Date()
+ }
+ ]
+ }
+ }
+ },
+ // 获取动态
+ {
+ url: '/mock/workplace/dynamic',
+ method: 'get',
+ timeout,
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: [
+ {
+ keys: ['workplace.push', 'Github'],
+ time: new Date()
+ },
+ {
+ keys: ['workplace.push', 'Github'],
+ time: new Date()
+ },
+ {
+ keys: ['workplace.push', 'Github'],
+ time: new Date()
+ },
+ {
+ keys: ['workplace.push', 'Github'],
+ time: new Date()
+ },
+ {
+ keys: ['workplace.push', 'Github'],
+ time: new Date()
+ },
+ {
+ keys: ['workplace.push', 'Github'],
+ time: new Date()
+ }
+ ]
+ }
+ }
+ },
+ // 获取团队信息
+ {
+ url: '/mock/workplace/team',
+ method: 'get',
+ timeout,
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: [
+ {
+ name: 'Github',
+ icon: 'akar-icons:github-fill'
+ },
+ {
+ name: 'Vue',
+ icon: 'logos:vue'
+ },
+ {
+ name: 'Angular',
+ icon: 'logos:angular-icon'
+ },
+ {
+ name: 'React',
+ icon: 'logos:react'
+ },
+ {
+ name: 'Webpack',
+ icon: 'logos:webpack'
+ },
+ {
+ name: 'Vite',
+ icon: 'vscode-icons:file-type-vite'
+ }
+ ]
+ }
+ }
+ },
+ // 获取指数
+ {
+ url: '/mock/workplace/radar',
+ method: 'get',
+ timeout,
+ response: () => {
+ return {
+ code: SUCCESS_CODE,
+ data: [
+ { name: 'workplace.quote', max: 65, personal: 42, team: 50 },
+ { name: 'workplace.contribution', max: 160, personal: 30, team: 140 },
+ { name: 'workplace.hot', max: 300, personal: 20, team: 28 },
+ { name: 'workplace.yield', max: 130, personal: 35, team: 35 },
+ { name: 'workplace.follow', max: 100, personal: 80, team: 90 }
+ ]
+ }
+ }
+ }
+]
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..d452fa9
--- /dev/null
+++ b/package.json
@@ -0,0 +1,139 @@
+{
+ "name": "vue-element-plus-admin",
+ "version": "2.9.0",
+ "description": "一套基于vue3、element-plus、typesScript、vite4的后台集成方案。",
+ "author": "Archer <502431556@qq.com>",
+ "private": false,
+ "type": "module",
+ "scripts": {
+ "i": "pnpm install",
+ "dev": "pnpm vite --mode base",
+ "ts:check": "pnpm vue-tsc --noEmit --skipLibCheck",
+ "build:pro": "pnpm vite build --mode pro",
+ "build:gitee": "pnpm vite build --mode gitee",
+ "build:dev": "pnpm vite build --mode dev",
+ "build:test": "pnpm vite build --mode test",
+ "serve:pro": "pnpm vite preview --mode pro",
+ "serve:dev": "pnpm vite preview --mode dev",
+ "serve:test": "pnpm vite preview --mode test",
+ "npm:check": "pnpx npm-check-updates -u",
+ "clean": "pnpx rimraf node_modules",
+ "clean:cache": "pnpx rimraf node_modules/.cache",
+ "lint:eslint": "eslint . --fix \"src/**/*.{js,ts,tsx,vue,html}\"",
+ "lint:format": "prettier --write --loglevel warn \"src/**/*.{js,ts,json,tsx,css,less,vue,html,md}\"",
+ "lint:style": "stylelint --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/",
+ "lint:lint-staged": "lint-staged -c ./.husky/lintstagedrc.cjs",
+ "prepare": "husky install",
+ "p": "plop",
+ "icon": "esno ./scripts/icon.ts"
+ },
+ "dependencies": {
+ "@iconify/iconify": "^3.1.1",
+ "@iconify/vue": "^4.3.0",
+ "@vueuse/core": "^12.3.0",
+ "@wangeditor/editor": "^5.1.23",
+ "@wangeditor/editor-for-vue": "^5.1.10",
+ "@zxcvbn-ts/core": "^3.0.4",
+ "animate.css": "^4.1.1",
+ "axios": "^1.7.9",
+ "cropperjs": "^1.6.2",
+ "dayjs": "^1.11.13",
+ "driver.js": "^1.3.1",
+ "echarts": "^5.6.0",
+ "echarts-wordcloud": "^2.1.0",
+ "element-plus": "2.9.2",
+ "lodash-es": "^4.17.21",
+ "mitt": "^3.0.1",
+ "monaco-editor": "^0.52.2",
+ "nprogress": "^0.2.0",
+ "pinia": "^2.3.0",
+ "pinia-plugin-persistedstate": "^4.2.0",
+ "qrcode": "^1.5.4",
+ "qs": "^6.13.1",
+ "url": "^0.11.4",
+ "vue": "3.5.13",
+ "vue-draggable-plus": "^0.6.0",
+ "vue-i18n": "11.0.1",
+ "vue-json-pretty": "^2.4.0",
+ "vue-router": "^4.5.0",
+ "vue-types": "^5.1.3",
+ "xgplayer": "^3.0.20"
+ },
+ "devDependencies": {
+ "@commitlint/cli": "^19.6.1",
+ "@commitlint/config-conventional": "^19.6.0",
+ "@iconify/json": "^2.2.293",
+ "@intlify/unplugin-vue-i18n": "^6.0.3",
+ "@types/fs-extra": "^11.0.4",
+ "@types/inquirer": "^9.0.7",
+ "@types/lodash-es": "^4.17.12",
+ "@types/mockjs": "^1.0.10",
+ "@types/node": "^22.10.5",
+ "@types/nprogress": "^0.2.3",
+ "@types/qrcode": "^1.5.5",
+ "@types/qs": "^6.9.17",
+ "@types/sortablejs": "^1.15.8",
+ "@typescript-eslint/eslint-plugin": "^8.19.1",
+ "@typescript-eslint/parser": "^8.19.1",
+ "@unocss/transformer-variant-group": "^0.65.4",
+ "@vitejs/plugin-legacy": "^6.0.0",
+ "@vitejs/plugin-vue": "^5.2.1",
+ "@vitejs/plugin-vue-jsx": "^4.1.1",
+ "autoprefixer": "^10.4.20",
+ "chalk": "^5.4.1",
+ "consola": "^3.3.3",
+ "eslint": "^9.17.0",
+ "eslint-config-prettier": "^9.1.0",
+ "eslint-define-config": "^2.1.0",
+ "eslint-plugin-prettier": "^5.2.1",
+ "eslint-plugin-vue": "^9.32.0",
+ "esno": "^4.8.0",
+ "fs-extra": "^11.2.0",
+ "husky": "^9.1.7",
+ "inquirer": "^12.3.0",
+ "less": "^4.2.1",
+ "lint-staged": "^15.3.0",
+ "mockjs": "^1.1.0",
+ "plop": "^4.0.1",
+ "postcss": "^8.4.49",
+ "postcss-html": "^1.7.0",
+ "postcss-less": "^6.0.0",
+ "prettier": "^3.4.2",
+ "rimraf": "^6.0.1",
+ "rollup": "^4.30.1",
+ "rollup-plugin-visualizer": "^5.14.0",
+ "stylelint": "^16.12.0",
+ "stylelint-config-html": "^1.1.0",
+ "stylelint-config-recommended": "^14.0.1",
+ "stylelint-config-standard": "^36.0.1",
+ "stylelint-order": "^6.0.4",
+ "terser": "^5.37.0",
+ "typescript": "5.7.3",
+ "typescript-eslint": "^8.19.1",
+ "unocss": "^0.65.4",
+ "vite": "6.0.7",
+ "vite-plugin-ejs": "^1.7.0",
+ "vite-plugin-eslint": "^1.8.1",
+ "vite-plugin-mock": "2.9.6",
+ "vite-plugin-progress": "^0.0.7",
+ "vite-plugin-purge-icons": "^0.10.0",
+ "vite-plugin-style-import": "2.0.0",
+ "vite-plugin-svg-icons": "^2.0.1",
+ "vite-plugin-url-copy": "^1.1.4",
+ "vue-tsc": "^2.2.0"
+ },
+ "packageManager": "pnpm@9.15.3",
+ "engines": {
+ "node": ">=18.0.0",
+ "pnpm": ">=8.1.0"
+ },
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/kailong321200875/vue-element-plus-admin.git"
+ },
+ "bugs": {
+ "url": "https://github.com/kailong321200875/vue-element-plus-admin/issues"
+ },
+ "homepage": "https://github.com/kailong321200875/vue-element-plus-admin"
+}
diff --git a/plop/component/component.hbs b/plop/component/component.hbs
new file mode 100644
index 0000000..21e5653
--- /dev/null
+++ b/plop/component/component.hbs
@@ -0,0 +1,11 @@
+
+
+
+ {{ upperFirstName }}
+
diff --git a/plop/component/index.hbs b/plop/component/index.hbs
new file mode 100644
index 0000000..aca6f0a
--- /dev/null
+++ b/plop/component/index.hbs
@@ -0,0 +1,3 @@
+import {{ upperFirstName }} from './src/{{ upperFirstName }}.vue'
+
+export { {{ upperFirstName }} }
diff --git a/plop/component/prompt.cjs b/plop/component/prompt.cjs
new file mode 100644
index 0000000..98a852f
--- /dev/null
+++ b/plop/component/prompt.cjs
@@ -0,0 +1,38 @@
+const toUpperCase = (str) => str.charAt(0).toUpperCase() + str.slice(1)
+
+module.exports = {
+ description: 'Create vue component',
+ prompts: [
+ {
+ type: 'input',
+ name: 'name',
+ message: '请输入组件名称(Please enter the component name)'
+ }
+ ],
+ actions: (data) => {
+ const { name } = data
+ const upperFirstName = toUpperCase(name)
+
+ const actions = []
+ if (name) {
+ actions.push({
+ type: 'add',
+ path: `./src/components/${upperFirstName}/src/${upperFirstName}.vue`,
+ templateFile: './plop/component/component.hbs',
+ data: {
+ name,
+ upperFirstName
+ }
+ }, {
+ type: 'add',
+ path: `./src/components/${upperFirstName}/index.ts`,
+ templateFile: './plop/component/index.hbs',
+ data: {
+ upperFirstName
+ }
+ })
+ }
+
+ return actions
+ }
+}
diff --git a/plop/view/prompt.cjs b/plop/view/prompt.cjs
new file mode 100644
index 0000000..dbf324f
--- /dev/null
+++ b/plop/view/prompt.cjs
@@ -0,0 +1,37 @@
+const toUpperCase = (str) => str.charAt(0).toUpperCase() + str.slice(1)
+
+module.exports = {
+ description: 'Create vue view',
+ prompts: [
+ {
+ type: 'input',
+ name: 'path',
+ message: '请输入路径(Please enter a path)',
+ default: 'views'
+ },
+ {
+ type: 'input',
+ name: 'name',
+ message: '请输入模块名称(Please enter module name)'
+ }
+ ],
+ actions: (data) => {
+ const { name, path } = data
+ const upperFirstName = toUpperCase(name)
+
+ const actions = []
+ if (name) {
+ actions.push({
+ type: 'add',
+ path: `./src/${path}/${upperFirstName}.vue`,
+ templateFile: './plop/view/view.hbs',
+ data: {
+ name,
+ upperFirstName
+ }
+ })
+ }
+
+ return actions
+ }
+}
diff --git a/plop/view/view.hbs b/plop/view/view.hbs
new file mode 100644
index 0000000..0ae9c15
--- /dev/null
+++ b/plop/view/view.hbs
@@ -0,0 +1,7 @@
+
+
+
+ {{ name }}
+
diff --git a/plopfile.cjs b/plopfile.cjs
new file mode 100644
index 0000000..ad90fa1
--- /dev/null
+++ b/plopfile.cjs
@@ -0,0 +1,7 @@
+const viewGenerator = require('./plop/view/prompt.cjs')
+const componentGenerator = require('./plop/component/prompt.cjs')
+
+module.exports = function (plop) {
+ plop.setGenerator('view', viewGenerator)
+ plop.setGenerator('component', componentGenerator)
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..f0a6f4e
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,11876 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ '@iconify/iconify':
+ specifier: ^3.1.1
+ version: 3.1.1
+ '@iconify/vue':
+ specifier: ^4.3.0
+ version: 4.3.0(vue@3.5.13(typescript@5.7.3))
+ '@vueuse/core':
+ specifier: ^12.3.0
+ version: 12.3.0(typescript@5.7.3)
+ '@wangeditor/editor':
+ specifier: ^5.1.23
+ version: 5.1.23
+ '@wangeditor/editor-for-vue':
+ specifier: ^5.1.10
+ version: 5.1.12(@wangeditor/editor@5.1.23)(vue@3.5.13(typescript@5.7.3))
+ '@zxcvbn-ts/core':
+ specifier: ^3.0.4
+ version: 3.0.4
+ animate.css:
+ specifier: ^4.1.1
+ version: 4.1.1
+ axios:
+ specifier: ^1.7.9
+ version: 1.7.9
+ cropperjs:
+ specifier: ^1.6.2
+ version: 1.6.2
+ dayjs:
+ specifier: ^1.11.13
+ version: 1.11.13
+ driver.js:
+ specifier: ^1.3.1
+ version: 1.3.1
+ echarts:
+ specifier: ^5.6.0
+ version: 5.6.0
+ echarts-wordcloud:
+ specifier: ^2.1.0
+ version: 2.1.0(echarts@5.6.0)
+ element-plus:
+ specifier: 2.9.2
+ version: 2.9.2(vue@3.5.13(typescript@5.7.3))
+ lodash-es:
+ specifier: ^4.17.21
+ version: 4.17.21
+ mitt:
+ specifier: ^3.0.1
+ version: 3.0.1
+ monaco-editor:
+ specifier: ^0.52.2
+ version: 0.52.2
+ nprogress:
+ specifier: ^0.2.0
+ version: 0.2.0
+ pinia:
+ specifier: ^2.3.0
+ version: 2.3.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))
+ pinia-plugin-persistedstate:
+ specifier: ^4.2.0
+ version: 4.2.0(pinia@2.3.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)))(rollup@4.30.1)
+ qrcode:
+ specifier: ^1.5.4
+ version: 1.5.4
+ qs:
+ specifier: ^6.13.1
+ version: 6.13.1
+ url:
+ specifier: ^0.11.4
+ version: 0.11.4
+ vue:
+ specifier: 3.5.13
+ version: 3.5.13(typescript@5.7.3)
+ vue-draggable-plus:
+ specifier: ^0.6.0
+ version: 0.6.0(@types/sortablejs@1.15.8)
+ vue-i18n:
+ specifier: 11.0.1
+ version: 11.0.1(vue@3.5.13(typescript@5.7.3))
+ vue-json-pretty:
+ specifier: ^2.4.0
+ version: 2.4.0(vue@3.5.13(typescript@5.7.3))
+ vue-router:
+ specifier: ^4.5.0
+ version: 4.5.0(vue@3.5.13(typescript@5.7.3))
+ vue-types:
+ specifier: ^5.1.3
+ version: 5.1.3(vue@3.5.13(typescript@5.7.3))
+ xgplayer:
+ specifier: ^3.0.20
+ version: 3.0.20(core-js@3.40.0)
+ devDependencies:
+ '@commitlint/cli':
+ specifier: ^19.6.1
+ version: 19.6.1(@types/node@22.10.5)(typescript@5.7.3)
+ '@commitlint/config-conventional':
+ specifier: ^19.6.0
+ version: 19.6.0
+ '@iconify/json':
+ specifier: ^2.2.293
+ version: 2.2.293
+ '@intlify/unplugin-vue-i18n':
+ specifier: ^6.0.3
+ version: 6.0.3(@vue/compiler-dom@3.5.13)(eslint@9.17.0(jiti@2.4.2))(rollup@4.30.1)(typescript@5.7.3)(vue-i18n@11.0.1(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3))
+ '@types/fs-extra':
+ specifier: ^11.0.4
+ version: 11.0.4
+ '@types/inquirer':
+ specifier: ^9.0.7
+ version: 9.0.7
+ '@types/lodash-es':
+ specifier: ^4.17.12
+ version: 4.17.12
+ '@types/mockjs':
+ specifier: ^1.0.10
+ version: 1.0.10
+ '@types/node':
+ specifier: ^22.10.5
+ version: 22.10.5
+ '@types/nprogress':
+ specifier: ^0.2.3
+ version: 0.2.3
+ '@types/qrcode':
+ specifier: ^1.5.5
+ version: 1.5.5
+ '@types/qs':
+ specifier: ^6.9.17
+ version: 6.9.17
+ '@types/sortablejs':
+ specifier: ^1.15.8
+ version: 1.15.8
+ '@typescript-eslint/eslint-plugin':
+ specifier: ^8.19.1
+ version: 8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3)
+ '@typescript-eslint/parser':
+ specifier: ^8.19.1
+ version: 8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3)
+ '@unocss/transformer-variant-group':
+ specifier: ^0.65.4
+ version: 0.65.4
+ '@vitejs/plugin-legacy':
+ specifier: ^6.0.0
+ version: 6.0.0(terser@5.37.0)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))
+ '@vitejs/plugin-vue':
+ specifier: ^5.2.1
+ version: 5.2.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))
+ '@vitejs/plugin-vue-jsx':
+ specifier: ^4.1.1
+ version: 4.1.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))
+ autoprefixer:
+ specifier: ^10.4.20
+ version: 10.4.20(postcss@8.4.49)
+ chalk:
+ specifier: ^5.4.1
+ version: 5.4.1
+ consola:
+ specifier: ^3.3.3
+ version: 3.3.3
+ eslint:
+ specifier: ^9.17.0
+ version: 9.17.0(jiti@2.4.2)
+ eslint-config-prettier:
+ specifier: ^9.1.0
+ version: 9.1.0(eslint@9.17.0(jiti@2.4.2))
+ eslint-define-config:
+ specifier: ^2.1.0
+ version: 2.1.0
+ eslint-plugin-prettier:
+ specifier: ^5.2.1
+ version: 5.2.1(@types/eslint@8.56.12)(eslint-config-prettier@9.1.0(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2))(prettier@3.4.2)
+ eslint-plugin-vue:
+ specifier: ^9.32.0
+ version: 9.32.0(eslint@9.17.0(jiti@2.4.2))
+ esno:
+ specifier: ^4.8.0
+ version: 4.8.0
+ fs-extra:
+ specifier: ^11.2.0
+ version: 11.2.0
+ husky:
+ specifier: ^9.1.7
+ version: 9.1.7
+ inquirer:
+ specifier: ^12.3.0
+ version: 12.3.0(@types/node@22.10.5)
+ less:
+ specifier: ^4.2.1
+ version: 4.2.1
+ lint-staged:
+ specifier: ^15.3.0
+ version: 15.3.0
+ mockjs:
+ specifier: ^1.1.0
+ version: 1.1.0
+ plop:
+ specifier: ^4.0.1
+ version: 4.0.1
+ postcss:
+ specifier: ^8.4.49
+ version: 8.4.49
+ postcss-html:
+ specifier: ^1.7.0
+ version: 1.7.0
+ postcss-less:
+ specifier: ^6.0.0
+ version: 6.0.0(postcss@8.4.49)
+ prettier:
+ specifier: ^3.4.2
+ version: 3.4.2
+ rimraf:
+ specifier: ^6.0.1
+ version: 6.0.1
+ rollup:
+ specifier: ^4.30.1
+ version: 4.30.1
+ rollup-plugin-visualizer:
+ specifier: ^5.14.0
+ version: 5.14.0(rollup@4.30.1)
+ stylelint:
+ specifier: ^16.12.0
+ version: 16.12.0(typescript@5.7.3)
+ stylelint-config-html:
+ specifier: ^1.1.0
+ version: 1.1.0(postcss-html@1.7.0)(stylelint@16.12.0(typescript@5.7.3))
+ stylelint-config-recommended:
+ specifier: ^14.0.1
+ version: 14.0.1(stylelint@16.12.0(typescript@5.7.3))
+ stylelint-config-standard:
+ specifier: ^36.0.1
+ version: 36.0.1(stylelint@16.12.0(typescript@5.7.3))
+ stylelint-order:
+ specifier: ^6.0.4
+ version: 6.0.4(stylelint@16.12.0(typescript@5.7.3))
+ terser:
+ specifier: ^5.37.0
+ version: 5.37.0
+ typescript:
+ specifier: 5.7.3
+ version: 5.7.3
+ typescript-eslint:
+ specifier: ^8.19.1
+ version: 8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3)
+ unocss:
+ specifier: ^0.65.4
+ version: 0.65.4(postcss@8.4.49)(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))
+ vite:
+ specifier: 6.0.7
+ version: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)
+ vite-plugin-ejs:
+ specifier: ^1.7.0
+ version: 1.7.0(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))
+ vite-plugin-eslint:
+ specifier: ^1.8.1
+ version: 1.8.1(eslint@9.17.0(jiti@2.4.2))(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))
+ vite-plugin-mock:
+ specifier: 2.9.6
+ version: 2.9.6(mockjs@1.1.0)(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))
+ vite-plugin-progress:
+ specifier: ^0.0.7
+ version: 0.0.7(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))
+ vite-plugin-purge-icons:
+ specifier: ^0.10.0
+ version: 0.10.0(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))
+ vite-plugin-style-import:
+ specifier: 2.0.0
+ version: 2.0.0(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))
+ vite-plugin-svg-icons:
+ specifier: ^2.0.1
+ version: 2.0.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))
+ vite-plugin-url-copy:
+ specifier: ^1.1.4
+ version: 1.1.4(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))
+ vue-tsc:
+ specifier: ^2.2.0
+ version: 2.2.0(typescript@5.7.3)
+
+packages:
+
+ '@ampproject/remapping@2.3.0':
+ resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
+ engines: {node: '>=6.0.0'}
+
+ '@antfu/install-pkg@0.4.1':
+ resolution: {integrity: sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==}
+
+ '@antfu/utils@0.7.10':
+ resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==}
+
+ '@babel/code-frame@7.26.2':
+ resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/compat-data@7.26.3':
+ resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.26.0':
+ resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@7.26.3':
+ resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-annotate-as-pure@7.25.9':
+ resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-compilation-targets@7.25.9':
+ resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-create-class-features-plugin@7.25.9':
+ resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-create-regexp-features-plugin@7.26.3':
+ resolution: {integrity: sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-define-polyfill-provider@0.6.3':
+ resolution: {integrity: sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+ '@babel/helper-member-expression-to-functions@7.25.9':
+ resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-imports@7.25.9':
+ resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-transforms@7.26.0':
+ resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-optimise-call-expression@7.25.9':
+ resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-plugin-utils@7.25.9':
+ resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-remap-async-to-generator@7.25.9':
+ resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-replace-supers@7.25.9':
+ resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-skip-transparent-expression-wrappers@7.25.9':
+ resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.25.9':
+ resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.25.9':
+ resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-option@7.25.9':
+ resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-wrap-function@7.25.9':
+ resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.26.0':
+ resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.26.3':
+ resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9':
+ resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9':
+ resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9':
+ resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9':
+ resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.13.0
+
+ '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9':
+ resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2':
+ resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-import-assertions@7.26.0':
+ resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-import-attributes@7.26.0':
+ resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-jsx@7.25.9':
+ resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-typescript@7.25.9':
+ resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-unicode-sets-regex@7.18.6':
+ resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/plugin-transform-arrow-functions@7.25.9':
+ resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-async-generator-functions@7.25.9':
+ resolution: {integrity: sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-async-to-generator@7.25.9':
+ resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-block-scoped-functions@7.25.9':
+ resolution: {integrity: sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-block-scoping@7.25.9':
+ resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-class-properties@7.25.9':
+ resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-class-static-block@7.26.0':
+ resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.12.0
+
+ '@babel/plugin-transform-classes@7.25.9':
+ resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-computed-properties@7.25.9':
+ resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-destructuring@7.25.9':
+ resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-dotall-regex@7.25.9':
+ resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-duplicate-keys@7.25.9':
+ resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9':
+ resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/plugin-transform-dynamic-import@7.25.9':
+ resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-exponentiation-operator@7.26.3':
+ resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-export-namespace-from@7.25.9':
+ resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-for-of@7.25.9':
+ resolution: {integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-function-name@7.25.9':
+ resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-json-strings@7.25.9':
+ resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-literals@7.25.9':
+ resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-logical-assignment-operators@7.25.9':
+ resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-member-expression-literals@7.25.9':
+ resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-modules-amd@7.25.9':
+ resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-modules-commonjs@7.26.3':
+ resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-modules-systemjs@7.25.9':
+ resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-modules-umd@7.25.9':
+ resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-named-capturing-groups-regex@7.25.9':
+ resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/plugin-transform-new-target@7.25.9':
+ resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-nullish-coalescing-operator@7.25.9':
+ resolution: {integrity: sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-numeric-separator@7.25.9':
+ resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-object-rest-spread@7.25.9':
+ resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-object-super@7.25.9':
+ resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-optional-catch-binding@7.25.9':
+ resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-optional-chaining@7.25.9':
+ resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-parameters@7.25.9':
+ resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-private-methods@7.25.9':
+ resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-private-property-in-object@7.25.9':
+ resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-property-literals@7.25.9':
+ resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-regenerator@7.25.9':
+ resolution: {integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-regexp-modifiers@7.26.0':
+ resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/plugin-transform-reserved-words@7.25.9':
+ resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-shorthand-properties@7.25.9':
+ resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-spread@7.25.9':
+ resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-sticky-regex@7.25.9':
+ resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-template-literals@7.25.9':
+ resolution: {integrity: sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-typeof-symbol@7.25.9':
+ resolution: {integrity: sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-typescript@7.26.3':
+ resolution: {integrity: sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-unicode-escapes@7.25.9':
+ resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-unicode-property-regex@7.25.9':
+ resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-unicode-regex@7.25.9':
+ resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-unicode-sets-regex@7.25.9':
+ resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/preset-env@7.26.0':
+ resolution: {integrity: sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/preset-modules@0.1.6-no-external-plugins':
+ resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0
+
+ '@babel/runtime@7.26.0':
+ resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/standalone@7.26.4':
+ resolution: {integrity: sha512-SF+g7S2mhTT1b7CHyfNjDkPU1corxg4LPYsyP0x5KuCl+EbtBQHRLqr9N3q7e7+x7NQ5LYxQf8mJ2PmzebLr0A==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/template@7.25.9':
+ resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.26.4':
+ resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.26.3':
+ resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==}
+ engines: {node: '>=6.9.0'}
+
+ '@commitlint/cli@19.6.1':
+ resolution: {integrity: sha512-8hcyA6ZoHwWXC76BoC8qVOSr8xHy00LZhZpauiD0iO0VYbVhMnED0da85lTfIULxl7Lj4c6vZgF0Wu/ed1+jlQ==}
+ engines: {node: '>=v18'}
+ hasBin: true
+
+ '@commitlint/config-conventional@19.6.0':
+ resolution: {integrity: sha512-DJT40iMnTYtBtUfw9ApbsLZFke1zKh6llITVJ+x9mtpHD08gsNXaIRqHTmwTZL3dNX5+WoyK7pCN/5zswvkBCQ==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/config-validator@19.5.0':
+ resolution: {integrity: sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/ensure@19.5.0':
+ resolution: {integrity: sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/execute-rule@19.5.0':
+ resolution: {integrity: sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/format@19.5.0':
+ resolution: {integrity: sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/is-ignored@19.6.0':
+ resolution: {integrity: sha512-Ov6iBgxJQFR9koOupDPHvcHU9keFupDgtB3lObdEZDroiG4jj1rzky60fbQozFKVYRTUdrBGICHG0YVmRuAJmw==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/lint@19.6.0':
+ resolution: {integrity: sha512-LRo7zDkXtcIrpco9RnfhOKeg8PAnE3oDDoalnrVU/EVaKHYBWYL1DlRR7+3AWn0JiBqD8yKOfetVxJGdEtZ0tg==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/load@19.6.1':
+ resolution: {integrity: sha512-kE4mRKWWNju2QpsCWt428XBvUH55OET2N4QKQ0bF85qS/XbsRGG1MiTByDNlEVpEPceMkDr46LNH95DtRwcsfA==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/message@19.5.0':
+ resolution: {integrity: sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/parse@19.5.0':
+ resolution: {integrity: sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/read@19.5.0':
+ resolution: {integrity: sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/resolve-extends@19.5.0':
+ resolution: {integrity: sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/rules@19.6.0':
+ resolution: {integrity: sha512-1f2reW7lbrI0X0ozZMesS/WZxgPa4/wi56vFuJENBmed6mWq5KsheN/nxqnl/C23ioxpPO/PL6tXpiiFy5Bhjw==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/to-lines@19.5.0':
+ resolution: {integrity: sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/top-level@19.5.0':
+ resolution: {integrity: sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/types@19.5.0':
+ resolution: {integrity: sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==}
+ engines: {node: '>=v18'}
+
+ '@csstools/css-parser-algorithms@3.0.4':
+ resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@csstools/css-tokenizer': ^3.0.3
+
+ '@csstools/css-tokenizer@3.0.3':
+ resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==}
+ engines: {node: '>=18'}
+
+ '@csstools/media-query-list-parser@4.0.2':
+ resolution: {integrity: sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@csstools/css-parser-algorithms': ^3.0.4
+ '@csstools/css-tokenizer': ^3.0.3
+
+ '@csstools/selector-specificity@5.0.0':
+ resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ postcss-selector-parser: ^7.0.0
+
+ '@ctrl/tinycolor@3.6.1':
+ resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==}
+ engines: {node: '>=10'}
+
+ '@dual-bundle/import-meta-resolve@4.1.0':
+ resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==}
+
+ '@element-plus/icons-vue@2.3.1':
+ resolution: {integrity: sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==}
+ peerDependencies:
+ vue: ^3.2.0
+
+ '@esbuild/aix-ppc64@0.23.1':
+ resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/aix-ppc64@0.24.2':
+ resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.23.1':
+ resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm64@0.24.2':
+ resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.23.1':
+ resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-arm@0.24.2':
+ resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.23.1':
+ resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/android-x64@0.24.2':
+ resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.23.1':
+ resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-arm64@0.24.2':
+ resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.23.1':
+ resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.24.2':
+ resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.23.1':
+ resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-arm64@0.24.2':
+ resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.23.1':
+ resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.24.2':
+ resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.23.1':
+ resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm64@0.24.2':
+ resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.23.1':
+ resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.24.2':
+ resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.23.1':
+ resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.24.2':
+ resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.23.1':
+ resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.24.2':
+ resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.23.1':
+ resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.24.2':
+ resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.23.1':
+ resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.24.2':
+ resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.23.1':
+ resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.24.2':
+ resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.23.1':
+ resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.24.2':
+ resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.23.1':
+ resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.24.2':
+ resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-arm64@0.24.2':
+ resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.23.1':
+ resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.24.2':
+ resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-arm64@0.23.1':
+ resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-arm64@0.24.2':
+ resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.23.1':
+ resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.24.2':
+ resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/sunos-x64@0.23.1':
+ resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/sunos-x64@0.24.2':
+ resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.23.1':
+ resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-arm64@0.24.2':
+ resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.23.1':
+ resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.24.2':
+ resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.23.1':
+ resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.24.2':
+ resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@eslint-community/eslint-utils@4.4.1':
+ resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==}
+ 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.1':
+ resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+ '@eslint/config-array@0.19.1':
+ resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/core@0.9.1':
+ resolution: {integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/eslintrc@3.2.0':
+ resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/js@9.17.0':
+ resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/object-schema@2.1.5':
+ resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/plugin-kit@0.2.4':
+ resolution: {integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@floating-ui/core@1.6.9':
+ resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==}
+
+ '@floating-ui/dom@1.6.13':
+ resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==}
+
+ '@floating-ui/utils@0.2.9':
+ resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==}
+
+ '@humanfs/core@0.19.1':
+ resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/node@0.16.6':
+ resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanwhocodes/module-importer@1.0.1':
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+
+ '@humanwhocodes/retry@0.3.1':
+ resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==}
+ engines: {node: '>=18.18'}
+
+ '@humanwhocodes/retry@0.4.1':
+ resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==}
+ engines: {node: '>=18.18'}
+
+ '@iconify/iconify@2.1.2':
+ resolution: {integrity: sha512-QcUzFeEWkE/mW+BVtEGmcWATClcCOIJFiYUD/PiCWuTcdEA297o8D4oN6Ra44WrNOHu1wqNW4J0ioaDIiqaFOQ==}
+
+ '@iconify/iconify@3.1.1':
+ resolution: {integrity: sha512-1nemfyD/OJzh9ALepH7YfuuP8BdEB24Skhd8DXWh0hzcOxImbb1ZizSZkpCzAwSZSGcJFmscIBaBQu+yLyWaxQ==}
+
+ '@iconify/json@2.2.293':
+ resolution: {integrity: sha512-eMRJNfQa+MXmE7I9noABNSVPxwsCkgmfgzeh84IKS2Su1cdQhi5FtsZa6YjEXK8y1cpbfv6pYk7KKJ6fV3mvOw==}
+
+ '@iconify/types@2.0.0':
+ resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
+
+ '@iconify/utils@2.2.1':
+ resolution: {integrity: sha512-0/7J7hk4PqXmxo5PDBDxmnecw5PxklZJfNjIVG9FM0mEfVrvfudS22rYWsqVk6gR3UJ/mSYS90X4R3znXnqfNA==}
+
+ '@iconify/vue@4.3.0':
+ resolution: {integrity: sha512-Xq0h6zMrHBbrW8jXJ9fISi+x8oDQllg5hTDkDuxnWiskJ63rpJu9CvJshj8VniHVTbsxCg9fVoPAaNp3RQI5OQ==}
+ peerDependencies:
+ vue: '>=3'
+
+ '@inquirer/checkbox@4.0.4':
+ resolution: {integrity: sha512-fYAKCAcGNMdfjL6hZTRUwkIByQ8EIZCXKrIQZH7XjADnN/xvRUhj8UdBbpC4zoUzvChhkSC/zRKaP/tDs3dZpg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@inquirer/confirm@5.1.1':
+ resolution: {integrity: sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@inquirer/core@10.1.2':
+ resolution: {integrity: sha512-bHd96F3ezHg1mf/J0Rb4CV8ndCN0v28kUlrHqP7+ECm1C/A+paB7Xh2lbMk6x+kweQC+rZOxM/YeKikzxco8bQ==}
+ engines: {node: '>=18'}
+
+ '@inquirer/editor@4.2.1':
+ resolution: {integrity: sha512-xn9aDaiP6nFa432i68JCaL302FyL6y/6EG97nAtfIPnWZ+mWPgCMLGc4XZ2QQMsZtu9q3Jd5AzBPjXh10aX9kA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@inquirer/expand@4.0.4':
+ resolution: {integrity: sha512-GYocr+BPyxKPxQ4UZyNMqZFSGKScSUc0Vk17II3J+0bDcgGsQm0KYQNooN1Q5iBfXsy3x/VWmHGh20QnzsaHwg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@inquirer/figures@1.0.9':
+ resolution: {integrity: sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==}
+ engines: {node: '>=18'}
+
+ '@inquirer/input@4.1.1':
+ resolution: {integrity: sha512-nAXAHQndZcXB+7CyjIW3XuQZZHbQQ0q8LX6miY6bqAWwDzNa9JUioDBYrFmOUNIsuF08o1WT/m2gbBXvBhYVxg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@inquirer/number@3.0.4':
+ resolution: {integrity: sha512-DX7a6IXRPU0j8kr2ovf+QaaDiIf+zEKaZVzCWdLOTk7XigqSXvoh4cul7x68xp54WTQrgSnW7P1WBJDbyY3GhA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@inquirer/password@4.0.4':
+ resolution: {integrity: sha512-wiliQOWdjM8FnBmdIHtQV2Ca3S1+tMBUerhyjkRCv1g+4jSvEweGu9GCcvVEgKDhTBT15nrxvk5/bVrGUqSs1w==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@inquirer/prompts@7.2.1':
+ resolution: {integrity: sha512-v2JSGri6/HXSfoGIwuKEn8sNCQK6nsB2BNpy2lSX6QH9bsECrMv93QHnj5+f+1ZWpF/VNioIV2B/PDox8EvGuQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@inquirer/rawlist@4.0.4':
+ resolution: {integrity: sha512-IsVN2EZdNHsmFdKWx9HaXb8T/s3FlR/U1QPt9dwbSyPtjFbMTlW9CRFvnn0bm/QIsrMRD2oMZqrQpSWPQVbXXg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@inquirer/search@3.0.4':
+ resolution: {integrity: sha512-tSkJk2SDmC2MEdTIjknXWmCnmPr5owTs9/xjfa14ol1Oh95n6xW7SYn5fiPk4/vrJPys0ggSWiISdPze4LTa7A==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@inquirer/select@4.0.4':
+ resolution: {integrity: sha512-ZzYLuLoUzTIW9EJm++jBpRiTshGqS3Q1o5qOEQqgzaBlmdsjQr6pA4TUNkwu6OBYgM2mIRbCz6mUhFDfl/GF+w==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@inquirer/type@3.0.2':
+ resolution: {integrity: sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@intlify/bundle-utils@10.0.0':
+ resolution: {integrity: sha512-BR5yLOkF2dzrARTbAg7RGAIPcx9Aark7p1K/0O285F7rfzso9j2dsa+S4dA67clZ0rToZ10NSSTfbyUptVu7Bg==}
+ engines: {node: '>= 18'}
+ peerDependencies:
+ petite-vue-i18n: '*'
+ vue-i18n: '*'
+ peerDependenciesMeta:
+ petite-vue-i18n:
+ optional: true
+ vue-i18n:
+ optional: true
+
+ '@intlify/core-base@11.0.1':
+ resolution: {integrity: sha512-NAmhw1l/llM0HZRpagR/ChJTNymW4ll6/4EDSJML5c8L5Hl/+k6UyF8EIgE6DeHpfheQujkSRngauViHqq6jJQ==}
+ engines: {node: '>= 16'}
+
+ '@intlify/message-compiler@11.0.0-rc.1':
+ resolution: {integrity: sha512-TGw2uBfuTFTegZf/BHtUQBEKxl7Q/dVGLoqRIdw8lFsp9g/53sYn5iD+0HxIzdYjbWL6BTJMXCPUHp9PxDTRPw==}
+ engines: {node: '>= 16'}
+
+ '@intlify/message-compiler@11.0.1':
+ resolution: {integrity: sha512-5RFH8x+Mn3mbjcHXnb6KCXGiczBdiQkWkv99iiA0JpKrNuTAQeW59Pjq/uObMB0eR0shnKYGTkIJxum+DbL3sw==}
+ engines: {node: '>= 16'}
+
+ '@intlify/shared@11.0.0-rc.1':
+ resolution: {integrity: sha512-8tR1xe7ZEbkabTuE/tNhzpolygUn9OaYp9yuYAF4MgDNZg06C3Qny80bes2/e9/Wm3aVkPUlCw6WgU7mQd0yEg==}
+ engines: {node: '>= 16'}
+
+ '@intlify/shared@11.0.1':
+ resolution: {integrity: sha512-lH164+aDDptHZ3dBDbIhRa1dOPQUp+83iugpc+1upTOWCnwyC1PVis6rSWNMMJ8VQxvtHQB9JMib48K55y0PvQ==}
+ engines: {node: '>= 16'}
+
+ '@intlify/unplugin-vue-i18n@6.0.3':
+ resolution: {integrity: sha512-9ZDjBlhUHtgjRl23TVcgfJttgu8cNepwVhWvOv3mUMRDAhjW0pur1mWKEUKr1I8PNwE4Gvv2IQ1xcl4RL0nG0g==}
+ engines: {node: '>= 18'}
+ peerDependencies:
+ petite-vue-i18n: '*'
+ vue: ^3.2.25
+ vue-i18n: '*'
+ peerDependenciesMeta:
+ petite-vue-i18n:
+ optional: true
+ vue-i18n:
+ optional: true
+
+ '@intlify/vue-i18n-extensions@8.0.0':
+ resolution: {integrity: sha512-w0+70CvTmuqbskWfzeYhn0IXxllr6mU+IeM2MU0M+j9OW64jkrvqY+pYFWrUnIIC9bEdij3NICruicwd5EgUuQ==}
+ engines: {node: '>= 18'}
+ peerDependencies:
+ '@intlify/shared': ^9.0.0 || ^10.0.0 || ^11.0.0
+ '@vue/compiler-dom': ^3.0.0
+ vue: ^3.0.0
+ vue-i18n: ^9.0.0 || ^10.0.0 || ^11.0.0
+ peerDependenciesMeta:
+ '@intlify/shared':
+ optional: true
+ '@vue/compiler-dom':
+ optional: true
+ vue:
+ optional: true
+ vue-i18n:
+ optional: true
+
+ '@isaacs/cliui@8.0.2':
+ resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+ engines: {node: '>=12'}
+
+ '@jridgewell/gen-mapping@0.3.8':
+ resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/set-array@1.2.1':
+ resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/source-map@0.3.6':
+ resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==}
+
+ '@jridgewell/sourcemap-codec@1.5.0':
+ resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+
+ '@jridgewell/trace-mapping@0.3.25':
+ resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha1-dhnC6yGyVIP20WdUi0z9WnSIw9U=}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha1-W9Jir5Tp0lvR5xsF3u1Eh2oiLos=}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha1-6Vc36LtnRt3t9pxVaVNJTxlv5po=}
+ engines: {node: '>= 8'}
+
+ '@nuxt/kit@3.15.1':
+ resolution: {integrity: sha512-7cVWjzfz3L6CsZrg6ppDZa7zGrZxCSfZjEQDIvVFn4mFKtJlK9k2izf5EewL6luzWwIQojkZAC3iq/1wtgI0Xw==}
+ engines: {node: '>=18.20.5'}
+
+ '@nuxt/schema@3.15.1':
+ resolution: {integrity: sha512-n5kOHt8uUyUM9z4Wu/8tIZkBYh3KTCGvyruG6oD9bfeT4OaS21+X3M7XsTXFMe+eYBZA70IFFlWn1JJZIPsKeA==}
+ engines: {node: ^14.18.0 || >=16.10.0}
+
+ '@pkgr/core@0.1.1':
+ resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==}
+ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+
+ '@polka/url@1.0.0-next.28':
+ resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==}
+
+ '@purge-icons/core@0.10.0':
+ resolution: {integrity: sha512-AtJbZv5Yy+vWX5v32DPTr+CW7AkSK8HJx52orDbrYt/9s4lGM2t4KKAmwaTQEH2HYr2HVh1mlqs54/S1s3WT1g==}
+
+ '@purge-icons/generated@0.10.0':
+ resolution: {integrity: sha512-I+1yN7/yDy/eZzfhAZqKF8Z6FM8D/O1vempbPrHJ0m9HlZwvf8sWXOArPJ2qRQGB6mJUVSpaXkoGBuoz1GQX5A==}
+
+ '@rollup/plugin-node-resolve@13.3.0':
+ resolution: {integrity: sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==}
+ engines: {node: '>= 10.0.0'}
+ peerDependencies:
+ rollup: ^2.42.0
+
+ '@rollup/pluginutils@3.1.0':
+ resolution: {integrity: sha1-cGtFJO5tyLEDs8mVUz5a1oDAK5s=}
+ engines: {node: '>= 8.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0
+
+ '@rollup/pluginutils@4.2.1':
+ resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==}
+ engines: {node: '>= 8.0.0'}
+
+ '@rollup/pluginutils@5.1.4':
+ resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ '@rollup/rollup-android-arm-eabi@4.30.1':
+ resolution: {integrity: sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==}
+ cpu: [arm]
+ os: [android]
+
+ '@rollup/rollup-android-arm64@4.30.1':
+ resolution: {integrity: sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==}
+ cpu: [arm64]
+ os: [android]
+
+ '@rollup/rollup-darwin-arm64@4.30.1':
+ resolution: {integrity: sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-x64@4.30.1':
+ resolution: {integrity: sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-freebsd-arm64@4.30.1':
+ resolution: {integrity: sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@rollup/rollup-freebsd-x64@4.30.1':
+ resolution: {integrity: sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.30.1':
+ resolution: {integrity: sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-arm-musleabihf@4.30.1':
+ resolution: {integrity: sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==}
+ cpu: [arm]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-arm64-gnu@4.30.1':
+ resolution: {integrity: sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-arm64-musl@4.30.1':
+ resolution: {integrity: sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-loongarch64-gnu@4.30.1':
+ resolution: {integrity: sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==}
+ cpu: [loong64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.30.1':
+ resolution: {integrity: sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-riscv64-gnu@4.30.1':
+ resolution: {integrity: sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-s390x-gnu@4.30.1':
+ resolution: {integrity: sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-x64-gnu@4.30.1':
+ resolution: {integrity: sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-x64-musl@4.30.1':
+ resolution: {integrity: sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-win32-arm64-msvc@4.30.1':
+ resolution: {integrity: sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rollup/rollup-win32-ia32-msvc@4.30.1':
+ resolution: {integrity: sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.30.1':
+ resolution: {integrity: sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==}
+ cpu: [x64]
+ os: [win32]
+
+ '@sindresorhus/merge-streams@2.3.0':
+ resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==}
+ engines: {node: '>=18'}
+
+ '@sxzz/popperjs-es@2.11.7':
+ resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==}
+
+ '@transloadit/prettier-bytes@0.0.7':
+ resolution: {integrity: sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==}
+
+ '@trysound/sax@0.2.0':
+ resolution: {integrity: sha1-zMqrdYr1Z2Hre/N69vA/Mm3XmK0=}
+ engines: {node: '>=10.13.0'}
+
+ '@types/conventional-commits-parser@5.0.1':
+ resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==}
+
+ '@types/eslint@8.56.12':
+ resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==}
+
+ '@types/estree@0.0.39':
+ resolution: {integrity: sha1-4Xfmme4bjCLSMXTKqnQiZEOJUJ8=}
+
+ '@types/estree@1.0.6':
+ resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
+
+ '@types/event-emitter@0.3.5':
+ resolution: {integrity: sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ==}
+
+ '@types/fined@1.1.5':
+ resolution: {integrity: sha512-2N93vadEGDFhASTIRbizbl4bNqpMOId5zZfj6hHqYZfEzEfO9onnU4Im8xvzo8uudySDveDHBOOSlTWf38ErfQ==}
+
+ '@types/fs-extra@11.0.4':
+ resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==}
+
+ '@types/inquirer@9.0.7':
+ resolution: {integrity: sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/jsonfile@6.1.4':
+ resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==}
+
+ '@types/liftoff@4.0.3':
+ resolution: {integrity: sha512-UgbL2kR5pLrWICvr8+fuSg0u43LY250q7ZMkC+XKC3E+rs/YBDEnQIzsnhU5dYsLlwMi3R75UvCL87pObP1sxw==}
+
+ '@types/lodash-es@4.17.12':
+ resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
+
+ '@types/lodash@4.17.14':
+ resolution: {integrity: sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A==}
+
+ '@types/mockjs@1.0.10':
+ resolution: {integrity: sha512-SXgrhajHG7boLv6oU93CcmdDm0HYRiceuz6b+7z+/2lCJPTWDv0V5YiwFHT2ejE4bQqgSXQiVPQYPWv7LGsK1g==}
+
+ '@types/node@10.17.60':
+ resolution: {integrity: sha1-NfPWIT2u2V2n8Pc+dbzGmA6QWXs=}
+
+ '@types/node@22.10.5':
+ resolution: {integrity: sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==}
+
+ '@types/nprogress@0.2.3':
+ resolution: {integrity: sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==}
+
+ '@types/qrcode@1.5.5':
+ resolution: {integrity: sha512-CdfBi/e3Qk+3Z/fXYShipBT13OJ2fDO2Q2w5CIP5anLTLIndQG9z6P1cnm+8zCWSpm5dnxMFd/uREtb0EXuQzg==}
+
+ '@types/qs@6.9.17':
+ resolution: {integrity: sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==}
+
+ '@types/resolve@1.17.1':
+ resolution: {integrity: sha1-Ov1q2JZ8d+Q3bFmKgt3Vj0bsRdY=}
+
+ '@types/sortablejs@1.15.8':
+ resolution: {integrity: sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg==}
+
+ '@types/svgo@2.6.4':
+ resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==}
+
+ '@types/through@0.0.33':
+ resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==}
+
+ '@types/web-bluetooth@0.0.16':
+ resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
+
+ '@types/web-bluetooth@0.0.20':
+ resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==}
+
+ '@typescript-eslint/eslint-plugin@8.19.1':
+ resolution: {integrity: sha512-tJzcVyvvb9h/PB96g30MpxACd9IrunT7GF9wfA9/0TJ1LxGOJx1TdPzSbBBnNED7K9Ka8ybJsnEpiXPktolTLg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.8.0'
+
+ '@typescript-eslint/parser@8.19.1':
+ resolution: {integrity: sha512-67gbfv8rAwawjYx3fYArwldTQKoYfezNUT4D5ioWetr/xCrxXxvleo3uuiFuKfejipvq+og7mjz3b0G2bVyUCw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.8.0'
+
+ '@typescript-eslint/scope-manager@8.19.1':
+ resolution: {integrity: sha512-60L9KIuN/xgmsINzonOcMDSB8p82h95hoBfSBtXuO4jlR1R9L1xSkmVZKgCPVfavDlXihh4ARNjXhh1gGnLC7Q==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/type-utils@8.19.1':
+ resolution: {integrity: sha512-Rp7k9lhDKBMRJB/nM9Ksp1zs4796wVNyihG9/TU9R6KCJDNkQbc2EOKjrBtLYh3396ZdpXLtr/MkaSEmNMtykw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.8.0'
+
+ '@typescript-eslint/types@8.19.1':
+ resolution: {integrity: sha512-JBVHMLj7B1K1v1051ZaMMgLW4Q/jre5qGK0Ew6UgXz1Rqh+/xPzV1aW581OM00X6iOfyr1be+QyW8LOUf19BbA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/typescript-estree@8.19.1':
+ resolution: {integrity: sha512-jk/TZwSMJlxlNnqhy0Eod1PNEvCkpY6MXOXE/WLlblZ6ibb32i2We4uByoKPv1d0OD2xebDv4hbs3fm11SMw8Q==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <5.8.0'
+
+ '@typescript-eslint/utils@8.19.1':
+ resolution: {integrity: sha512-IxG5gLO0Ne+KaUc8iW1A+XuKLd63o4wlbI1Zp692n1xojCl/THvgIKXJXBZixTh5dd5+yTJ/VXH7GJaaw21qXA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.8.0'
+
+ '@typescript-eslint/visitor-keys@8.19.1':
+ resolution: {integrity: sha512-fzmjU8CHK853V/avYZAvuVut3ZTfwN5YtMaoi+X9Y9MA9keaWNHC3zEQ9zvyX/7Hj+5JkNyK1l7TOR2hevHB6Q==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@unocss/astro@0.65.4':
+ resolution: {integrity: sha512-ex1CJOQ6yeftBEPcbA9/W47/YoV+mhQnrAoc8MA1VVrvvFKDitICFU62+nSt3NWRe53XL/fXnQbcbCb8AAgKlA==}
+ peerDependencies:
+ vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0
+ peerDependenciesMeta:
+ vite:
+ optional: true
+
+ '@unocss/cli@0.65.4':
+ resolution: {integrity: sha512-D/4hY5Hezh3QETscl4i+ojb+q8YU9Cl9AYJ8v3gsjc/GjTmEuIOD5V4x+/aN25vY5wjqgoApOgaIDGCV3b+2Ig==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ '@unocss/config@0.65.4':
+ resolution: {integrity: sha512-/vCt4AXnJ4p4Ow6xqsYwdrelF9533yhZjzkg3SQmL3rKeSkicPayKpeq8nkYECdhDI03VTCVD+6oh5Y/26Hg7A==}
+ engines: {node: '>=14'}
+
+ '@unocss/core@0.65.4':
+ resolution: {integrity: sha512-a2JOoFutrhqd5RgPhIR5FIXrDoHDU3gwCbPrpT6KYTjsqlSc/fv02yZ+JGOZFN3MCFhCmaPTs+idDFtwb3xU8g==}
+
+ '@unocss/extractor-arbitrary-variants@0.65.4':
+ resolution: {integrity: sha512-GbvTgsDaHplfWfsQtOY8RrvEZvptmvR9k9NwQ5NsZBNIG1JepYVel93CVQvsxT5KioKcoWngXxTYLNOGyxLs0g==}
+
+ '@unocss/inspector@0.65.4':
+ resolution: {integrity: sha512-byg9x549Ul17U4Ety7ufDwC0UOygypoq4QnLEPzhlZ0KJG1f7WmXKYanOhupeg3h4qCj6Nc/xdZYMGbHl9QRIg==}
+
+ '@unocss/postcss@0.65.4':
+ resolution: {integrity: sha512-8peDRo0+rNQsnKh/H2uZEVy67sV2cC16rAeSLpgbVJUMNfZlmF0rC2DNGsOV17uconUXSwz7+mGcHKNiv+8YlQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ postcss: ^8.4.21
+
+ '@unocss/preset-attributify@0.65.4':
+ resolution: {integrity: sha512-zxE9hJJ5b37phjdzDdZsxX559ZlmH9rFlY5LVEcQySTnsfY0znviHxPbD2iRpCBCRd+YC5HfFd2jb3XlnTKMJQ==}
+
+ '@unocss/preset-icons@0.65.4':
+ resolution: {integrity: sha512-5sSzTN72X2Ag3VH48xY1pYudeWnql9jqdMiwgZuLJcmvETBNGelXy2wGxm7tsUUEx/l40Yr04Ck8XRPGT9jLBw==}
+
+ '@unocss/preset-mini@0.65.4':
+ resolution: {integrity: sha512-dcO2PzSl87qN1KdQWcfZDIKEhpdFeImWbYfiXtE7k6pi1393FJkdHEopgI/1ZciIQN1CkTvQJ5c7EpEVWftYRA==}
+
+ '@unocss/preset-tagify@0.65.4':
+ resolution: {integrity: sha512-qll6koqdFEkvmz594vKnxj9+3nfM3ugkJxYHrTkqtwx7DAnTgtM8fInFFGZelvjwUzR3o3+Zw6uMhFkLTVTfvg==}
+
+ '@unocss/preset-typography@0.65.4':
+ resolution: {integrity: sha512-Dl940ATrviWD9Vh+4fcN0QZXb6wA7al+c7QkdVAzW7I+NtdN2ELvLcN0cY22KnLRpwztzmg52Qp2J/1QnqrLTw==}
+
+ '@unocss/preset-uno@0.65.4':
+ resolution: {integrity: sha512-56bdBtf476i+soQCQmT36uGzcF2z+7DGCnG1hwWiw6XAbL6gmRMQsubwi1c8z8TcTQNBsOFUnOziFil0gbWufw==}
+
+ '@unocss/preset-web-fonts@0.65.4':
+ resolution: {integrity: sha512-UB/MvXHUTqMNVH1bbiKZ/ZtZUI5tsYlTYAvBrnXPO1Cztuwr8hJKSi4RCfI9g+YYtKHX4uYuxUbW5bcN85gmBQ==}
+
+ '@unocss/preset-wind@0.65.4':
+ resolution: {integrity: sha512-0rbNbw5E8Lvh2yf4R1Mq+lxI/wL5Tm6+r+crE0uAAhCPe9kxPHW4k+x1cWKDIwq6Vudlm3cNX85N49wN5tYgdA==}
+
+ '@unocss/reset@0.65.4':
+ resolution: {integrity: sha512-m685H0KFvVMz6R2i5GDIFv4RS9Z7y2G8hJK7xg2OWli+7w8l2ZMihYvXKofPsst4q/ms8EgKXpWc/qqUOTucvA==}
+
+ '@unocss/rule-utils@0.65.4':
+ resolution: {integrity: sha512-+EzdJEWcqGcO6HwbBTe7vEdBRpuKkBiz4MycQeLD6GEio04T45y6VHHO7/WTqxltbO4YwwW9/s2TKRMxKtoG8g==}
+ engines: {node: '>=14'}
+
+ '@unocss/transformer-attributify-jsx@0.65.4':
+ resolution: {integrity: sha512-n438EzWdTKlLCOlAUSpFjmH6FflctqzIReMzMZSJDkmkorymc+C5GpjN3Nty2cKRJXIl6Vwq0oxPuB59RT+FIw==}
+
+ '@unocss/transformer-compile-class@0.65.4':
+ resolution: {integrity: sha512-n1yHDC/iIbcj/9fBUTXkSoASKfLBuRoCN7P1a0ecPc8Gu+uOGfoxafOhrlqC+tpD3hlQGoL+0h74BHSKh+L23Q==}
+
+ '@unocss/transformer-directives@0.65.4':
+ resolution: {integrity: sha512-zkoDEwzPkgXi6ohW7P11gbArwfTRMZ9knYSUYoPEltQz+UZYzeRQ85exiAmdz5MsbCAuhQEr577Kd/CWfhjEuA==}
+
+ '@unocss/transformer-variant-group@0.65.4':
+ resolution: {integrity: sha512-ggO6xMGeOeoD5GHS2xXBJrYFuzqyiZ25tM0zHAMJn9QU9GIu1NwWvcXluvLCF/MRIygBJGPpAE98aEICI6ifEA==}
+
+ '@unocss/vite@0.65.4':
+ resolution: {integrity: sha512-02pRcVLfb5UUxMJwudnjS/0ZQdSlskjuXVHdpZpLBZCA8hhoru2uEOsPbUOBRNNMjDj6ld00pmgk/+im07M35Q==}
+ peerDependencies:
+ vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0
+
+ '@uppy/companion-client@2.2.2':
+ resolution: {integrity: sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==}
+
+ '@uppy/core@2.3.4':
+ resolution: {integrity: sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==}
+
+ '@uppy/store-default@2.1.1':
+ resolution: {integrity: sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ==}
+
+ '@uppy/utils@4.1.3':
+ resolution: {integrity: sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==}
+
+ '@uppy/xhr-upload@2.1.3':
+ resolution: {integrity: sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==}
+ peerDependencies:
+ '@uppy/core': ^2.3.3
+
+ '@vitejs/plugin-legacy@6.0.0':
+ resolution: {integrity: sha512-pWt9cWaGJAKYw+67VLpN8hSP+G+yAQnrf5Pqh/NzSDKFl/4KpxTtwb5OLQezHoZOxghahO/ha3IpvblBbX/t6A==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ peerDependencies:
+ terser: ^5.16.0
+ vite: ^6.0.0
+
+ '@vitejs/plugin-vue-jsx@4.1.1':
+ resolution: {integrity: sha512-uMJqv/7u1zz/9NbWAD3XdjaY20tKTf17XVfQ9zq4wY1BjsB/PjpJPMe2xiG39QpP4ZdhYNhm4Hvo66uJrykNLA==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ peerDependencies:
+ vite: ^5.0.0 || ^6.0.0
+ vue: ^3.0.0
+
+ '@vitejs/plugin-vue@5.2.1':
+ resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ peerDependencies:
+ vite: ^5.0.0 || ^6.0.0
+ vue: ^3.2.25
+
+ '@volar/language-core@2.4.11':
+ resolution: {integrity: sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==}
+
+ '@volar/source-map@2.4.11':
+ resolution: {integrity: sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==}
+
+ '@volar/typescript@2.4.11':
+ resolution: {integrity: sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==}
+
+ '@vue/babel-helper-vue-transform-on@1.2.5':
+ resolution: {integrity: sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==}
+
+ '@vue/babel-plugin-jsx@1.2.5':
+ resolution: {integrity: sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+
+ '@vue/babel-plugin-resolve-type@1.2.5':
+ resolution: {integrity: sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@vue/compiler-core@3.5.13':
+ resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==}
+
+ '@vue/compiler-dom@3.5.13':
+ resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==}
+
+ '@vue/compiler-sfc@3.5.13':
+ resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==}
+
+ '@vue/compiler-ssr@3.5.13':
+ resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==}
+
+ '@vue/compiler-vue2@2.7.16':
+ resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==}
+
+ '@vue/devtools-api@6.6.4':
+ resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
+
+ '@vue/language-core@2.2.0':
+ resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@vue/reactivity@3.5.13':
+ resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==}
+
+ '@vue/runtime-core@3.5.13':
+ resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==}
+
+ '@vue/runtime-dom@3.5.13':
+ resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==}
+
+ '@vue/server-renderer@3.5.13':
+ resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==}
+ peerDependencies:
+ vue: 3.5.13
+
+ '@vue/shared@3.5.13':
+ resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==}
+
+ '@vueuse/core@12.3.0':
+ resolution: {integrity: sha512-cnV8QDKZrsyKC7tWjPbeEUz2cD9sa9faxF2YkR8QqNwfofgbOhmfIgvSYmkp+ttSvfOw4E6hLcQx15mRPr0yBA==}
+
+ '@vueuse/core@9.13.0':
+ resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==}
+
+ '@vueuse/metadata@12.3.0':
+ resolution: {integrity: sha512-M/iQHHjMffOv2npsw2ihlUx1CTiBwPEgb7DzByLq7zpg1+Ke8r7s9p5ybUWc5OIeGewtpY4Xy0R2cKqFqM8hFg==}
+
+ '@vueuse/metadata@9.13.0':
+ resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==}
+
+ '@vueuse/shared@12.3.0':
+ resolution: {integrity: sha512-X3YD35GUeW0d5Gajcwv9jdLAJTV2Jdb/Ll6Ii2JIYcKLYZqv5wxyLeKtiQkqWmHg3v0J0ZWjDUMVOw2E7RCXfA==}
+
+ '@vueuse/shared@9.13.0':
+ resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==}
+
+ '@wangeditor/basic-modules@1.1.7':
+ resolution: {integrity: sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==}
+ peerDependencies:
+ '@wangeditor/core': 1.x
+ dom7: ^3.0.0
+ lodash.throttle: ^4.1.1
+ nanoid: ^3.2.0
+ slate: ^0.72.0
+ snabbdom: ^3.1.0
+
+ '@wangeditor/code-highlight@1.0.3':
+ resolution: {integrity: sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==}
+ peerDependencies:
+ '@wangeditor/core': 1.x
+ dom7: ^3.0.0
+ slate: ^0.72.0
+ snabbdom: ^3.1.0
+
+ '@wangeditor/core@1.1.19':
+ resolution: {integrity: sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==}
+ peerDependencies:
+ '@uppy/core': ^2.1.1
+ '@uppy/xhr-upload': ^2.0.3
+ dom7: ^3.0.0
+ is-hotkey: ^0.2.0
+ lodash.camelcase: ^4.3.0
+ lodash.clonedeep: ^4.5.0
+ lodash.debounce: ^4.0.8
+ lodash.foreach: ^4.5.0
+ lodash.isequal: ^4.5.0
+ lodash.throttle: ^4.1.1
+ lodash.toarray: ^4.4.0
+ nanoid: ^3.2.0
+ slate: ^0.72.0
+ snabbdom: ^3.1.0
+
+ '@wangeditor/editor-for-vue@5.1.12':
+ resolution: {integrity: sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==}
+ peerDependencies:
+ '@wangeditor/editor': '>=5.1.0'
+ vue: ^3.0.5
+
+ '@wangeditor/editor@5.1.23':
+ resolution: {integrity: sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==}
+
+ '@wangeditor/list-module@1.0.5':
+ resolution: {integrity: sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==}
+ peerDependencies:
+ '@wangeditor/core': 1.x
+ dom7: ^3.0.0
+ slate: ^0.72.0
+ snabbdom: ^3.1.0
+
+ '@wangeditor/table-module@1.1.4':
+ resolution: {integrity: sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==}
+ peerDependencies:
+ '@wangeditor/core': 1.x
+ dom7: ^3.0.0
+ lodash.isequal: ^4.5.0
+ lodash.throttle: ^4.1.1
+ nanoid: ^3.2.0
+ slate: ^0.72.0
+ snabbdom: ^3.1.0
+
+ '@wangeditor/upload-image-module@1.0.2':
+ resolution: {integrity: sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==}
+ peerDependencies:
+ '@uppy/core': ^2.0.3
+ '@uppy/xhr-upload': ^2.0.3
+ '@wangeditor/basic-modules': 1.x
+ '@wangeditor/core': 1.x
+ dom7: ^3.0.0
+ lodash.foreach: ^4.5.0
+ slate: ^0.72.0
+ snabbdom: ^3.1.0
+
+ '@wangeditor/video-module@1.1.4':
+ resolution: {integrity: sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==}
+ peerDependencies:
+ '@uppy/core': ^2.1.4
+ '@uppy/xhr-upload': ^2.0.7
+ '@wangeditor/core': 1.x
+ dom7: ^3.0.0
+ nanoid: ^3.2.0
+ slate: ^0.72.0
+ snabbdom: ^3.1.0
+
+ '@zxcvbn-ts/core@3.0.4':
+ resolution: {integrity: sha512-aQeiT0F09FuJaAqNrxynlAwZ2mW/1MdXakKWNmGM1Qp/VaY6CnB/GfnMS2T8gB2231Esp1/maCWd8vTG4OuShw==}
+
+ JSONStream@1.3.5:
+ resolution: {integrity: sha1-MgjB8I06TZkmGrZPkjArwV4RHKA=}
+ hasBin: true
+
+ acorn-jsx@5.3.2:
+ resolution: {integrity: sha1-ftW7VZCLOy8bxVxq8WU7rafweTc=}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ acorn@8.14.0:
+ resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ aggregate-error@4.0.1:
+ resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==}
+ engines: {node: '>=12'}
+
+ ajv@6.12.6:
+ resolution: {integrity: sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=}
+
+ ajv@8.17.1:
+ resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
+
+ alien-signals@0.4.14:
+ resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==}
+
+ animate.css@4.1.1:
+ resolution: {integrity: sha1-YU7FqBEx1+TcNipYFD90BqvWgHU=}
+
+ ansi-escapes@4.3.2:
+ resolution: {integrity: sha1-ayKR0dt9mLZSHV8e+kLQ86n+tl4=}
+ engines: {node: '>=8'}
+
+ ansi-escapes@7.0.0:
+ resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==}
+ engines: {node: '>=18'}
+
+ ansi-regex@2.1.1:
+ resolution: {integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=}
+ engines: {node: '>=0.10.0'}
+
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=}
+ engines: {node: '>=8'}
+
+ ansi-regex@6.1.0:
+ resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
+ engines: {node: '>=12'}
+
+ ansi-styles@2.2.1:
+ resolution: {integrity: sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=}
+ engines: {node: '>=0.10.0'}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha1-7dgDYornHATIWuegkG7a00tkiTc=}
+ engines: {node: '>=8'}
+
+ ansi-styles@6.2.1:
+ resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
+ engines: {node: '>=12'}
+
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha1-JG9Q88p4oyQPbJl+ipvR6sSeSzg=}
+
+ arr-diff@4.0.0:
+ resolution: {integrity: sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=}
+ engines: {node: '>=0.10.0'}
+
+ arr-flatten@1.1.0:
+ resolution: {integrity: sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=}
+ engines: {node: '>=0.10.0'}
+
+ arr-union@3.1.0:
+ resolution: {integrity: sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=}
+ engines: {node: '>=0.10.0'}
+
+ array-buffer-byte-length@1.0.2:
+ resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
+ engines: {node: '>= 0.4'}
+
+ array-each@1.0.1:
+ resolution: {integrity: sha1-p5SvDAWrF1KEbudTofIRoFugxE8=}
+ engines: {node: '>=0.10.0'}
+
+ array-ify@1.0.0:
+ resolution: {integrity: sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=}
+
+ array-slice@1.1.0:
+ resolution: {integrity: sha1-42jqFfibxwaff/uJrsOmx9SsItQ=}
+ engines: {node: '>=0.10.0'}
+
+ array-union@2.1.0:
+ resolution: {integrity: sha1-t5hCCtvrHego2ErNii4j0+/oXo0=}
+ engines: {node: '>=8'}
+
+ array-unique@0.3.2:
+ resolution: {integrity: sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=}
+ 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: sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=}
+ engines: {node: '>=0.10.0'}
+
+ astral-regex@2.0.0:
+ resolution: {integrity: sha1-SDFDxWeu7UeFdZwIZXhtx319LjE=}
+ engines: {node: '>=8'}
+
+ async-validator@4.2.5:
+ resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
+
+ async@3.2.6:
+ resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
+
+ asynckit@0.4.0:
+ resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=}
+
+ atob@2.1.2:
+ resolution: {integrity: sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=}
+ engines: {node: '>= 4.5.0'}
+ hasBin: true
+
+ autoprefixer@10.4.20:
+ resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==}
+ engines: {node: ^10 || ^12 || >=14}
+ hasBin: true
+ peerDependencies:
+ postcss: ^8.1.0
+
+ available-typed-arrays@1.0.7:
+ resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+ engines: {node: '>= 0.4'}
+
+ axios@0.26.1:
+ resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==}
+
+ axios@1.7.9:
+ resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==}
+
+ babel-plugin-polyfill-corejs2@0.4.12:
+ resolution: {integrity: sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+ babel-plugin-polyfill-corejs3@0.10.6:
+ resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+ babel-plugin-polyfill-regenerator@0.6.3:
+ resolution: {integrity: sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4=}
+
+ balanced-match@2.0.0:
+ resolution: {integrity: sha1-3HD5INeNuLhYU1eVhnv0j4IGM9k=}
+
+ base64-js@1.5.1:
+ resolution: {integrity: sha1-GxtEAWClv3rUC2UPCVljSBkDkwo=}
+
+ base@0.11.2:
+ resolution: {integrity: sha1-e95c7RRbbVUakNuH+DxVi060io8=}
+ engines: {node: '>=0.10.0'}
+
+ big.js@5.2.2:
+ resolution: {integrity: sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=}
+
+ binary-extensions@2.3.0:
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+ engines: {node: '>=8'}
+
+ bl@4.1.0:
+ resolution: {integrity: sha1-RRU1JkGCvsL7vIOmKrmM8R2fezo=}
+
+ bluebird@3.7.2:
+ resolution: {integrity: sha1-nyKcFb4nJFT/qXOs4NvueaGww28=}
+
+ boolbase@1.0.0:
+ resolution: {integrity: sha1-aN/1++YMUes3cl6p4+0xDcwed24=}
+
+ brace-expansion@1.1.11:
+ resolution: {integrity: sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=}
+
+ brace-expansion@2.0.1:
+ resolution: {integrity: sha1-HtxFng8MVISG7Pn8mfIiE2S5oK4=}
+
+ braces@2.3.2:
+ resolution: {integrity: sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=}
+ engines: {node: '>=0.10.0'}
+
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
+ browserslist-to-esbuild@2.1.1:
+ resolution: {integrity: sha512-KN+mty6C3e9AN8Z5dI1xeN15ExcRNeISoC3g7V0Kax/MMF9MSoYA2G7lkTTcVUFntiEjkpI0HNgqJC1NjdyNUw==}
+ engines: {node: '>=18'}
+ hasBin: true
+ peerDependencies:
+ browserslist: '*'
+
+ browserslist@4.24.4:
+ resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ buffer-from@1.1.2:
+ resolution: {integrity: sha1-KxRqb9cugLT1XSVfNe1Zo6mkG9U=}
+
+ buffer@5.7.1:
+ resolution: {integrity: sha1-umLnwTEzBTWCGXFghRqPZI6Z7tA=}
+
+ builtin-modules@3.3.0:
+ resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
+ engines: {node: '>=6'}
+
+ bundle-require@5.1.0:
+ resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ peerDependencies:
+ esbuild: '>=0.18'
+
+ c12@2.0.1:
+ resolution: {integrity: sha512-Z4JgsKXHG37C6PYUtIxCfLJZvo6FyhHJoClwwb9ftUkLpPSkuYqn6Tr+vnaN8hymm0kIbcg6Ey3kv/Q71k5w/A==}
+ peerDependencies:
+ magicast: ^0.3.5
+ 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: sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=}
+ engines: {node: '>=0.10.0'}
+
+ call-bind-apply-helpers@1.0.1:
+ resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==}
+ engines: {node: '>= 0.4'}
+
+ call-bind@1.0.8:
+ resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
+ engines: {node: '>= 0.4'}
+
+ call-bound@1.0.3:
+ resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==}
+ engines: {node: '>= 0.4'}
+
+ callsites@3.1.0:
+ resolution: {integrity: sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=}
+ engines: {node: '>=6'}
+
+ camel-case@4.1.2:
+ resolution: {integrity: sha1-lygHKpVPgFIoIlpt7qazhGHhvVo=}
+
+ camelcase@5.3.1:
+ resolution: {integrity: sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=}
+ engines: {node: '>=6'}
+
+ caniuse-lite@1.0.30001690:
+ resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==}
+
+ capital-case@1.0.4:
+ resolution: {integrity: sha1-nRMCkjU8kkn2sA+lhSvuOKcX5mk=}
+
+ chalk@1.1.3:
+ resolution: {integrity: sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=}
+ engines: {node: '>=0.10.0'}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=}
+ engines: {node: '>=10'}
+
+ chalk@5.4.1:
+ resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+
+ change-case@4.1.2:
+ resolution: {integrity: sha1-/t/F8TYEXiOYwEEO5EH5VwRkHhI=}
+
+ chardet@0.7.0:
+ resolution: {integrity: sha1-kAlISfCTfy7twkJdDSip5fDLrZ4=}
+
+ 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'}
+
+ chownr@2.0.0:
+ resolution: {integrity: sha1-Fb++U9LqtM9w8YqM1o6+Wzyx3s4=}
+ engines: {node: '>=10'}
+
+ citty@0.1.6:
+ resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==}
+
+ class-utils@0.3.6:
+ resolution: {integrity: sha1-+TNprouafOAv1B+q0MqDAzGQxGM=}
+ engines: {node: '>=0.10.0'}
+
+ clean-stack@4.2.0:
+ resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==}
+ engines: {node: '>=12'}
+
+ cli-cursor@3.1.0:
+ resolution: {integrity: sha1-JkMFp65JDR0Dvwybp8kl0XU68wc=}
+ engines: {node: '>=8'}
+
+ cli-cursor@5.0.0:
+ resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==}
+ engines: {node: '>=18'}
+
+ cli-spinners@2.9.2:
+ resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
+ engines: {node: '>=6'}
+
+ cli-truncate@4.0.0:
+ resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==}
+ engines: {node: '>=18'}
+
+ cli-width@4.1.0:
+ resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==}
+ engines: {node: '>= 12'}
+
+ clipboardy@4.0.0:
+ resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==}
+ engines: {node: '>=18'}
+
+ cliui@6.0.0:
+ resolution: {integrity: sha1-UR1wLAxOQcoVbX0OlgIfI+EyJbE=}
+
+ cliui@8.0.1:
+ resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+ engines: {node: '>=12'}
+
+ clone@1.0.4:
+ resolution: {integrity: sha1-2jCcwmPfFZlMaIypAheco8fNfH4=}
+ engines: {node: '>=0.8'}
+
+ clone@2.1.2:
+ resolution: {integrity: sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=}
+ engines: {node: '>=0.8'}
+
+ collection-visit@1.0.0:
+ resolution: {integrity: sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=}
+ engines: {node: '>=0.10.0'}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=}
+
+ 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: sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=}
+ engines: {node: '>= 0.8'}
+
+ commander@12.1.0:
+ resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==}
+ engines: {node: '>=18'}
+
+ commander@13.0.0:
+ resolution: {integrity: sha512-oPYleIY8wmTVzkvQq10AEok6YcTC4sRUBl8F9gVuwchGVUCTbl/vhLTaQqutuuySYOsu8YTgV+OxKc/8Yvx+mQ==}
+ engines: {node: '>=18'}
+
+ commander@2.20.3:
+ resolution: {integrity: sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=}
+
+ commander@7.2.0:
+ resolution: {integrity: sha1-o2y1fQtQHOEI5NIFWaFQo5HZerc=}
+ engines: {node: '>= 10'}
+
+ compare-func@2.0.0:
+ resolution: {integrity: sha1-+2XnXtvd/S5WhVTotbBf/3pR/LM=}
+
+ component-emitter@1.3.1:
+ resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==}
+
+ compute-scroll-into-view@1.0.20:
+ resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=}
+
+ confbox@0.1.8:
+ resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
+ connect@3.7.0:
+ resolution: {integrity: sha1-XUk0iRDKpeB6AYALAw0MNfIEhPg=}
+ engines: {node: '>= 0.10.0'}
+
+ consola@3.3.3:
+ resolution: {integrity: sha512-Qil5KwghMzlqd51UXM0b6fyaGHtOC22scxrwrz4A2882LyUMwQjnvaedN1HAeXzphspQ6CpHkzMAWxBTUruDLg==}
+ engines: {node: ^14.18.0 || >=16.10.0}
+
+ console@0.7.2:
+ resolution: {integrity: sha1-+aQzEkkpFZG3v5v/qOIFNW8gqfA=}
+
+ constant-case@3.0.4:
+ resolution: {integrity: sha1-O4Sprq9M8x7EXmv13pG9+wWJ+vE=}
+
+ conventional-changelog-angular@7.0.0:
+ resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==}
+ engines: {node: '>=16'}
+
+ conventional-changelog-conventionalcommits@7.0.2:
+ resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==}
+ engines: {node: '>=16'}
+
+ conventional-commits-parser@5.0.0:
+ resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==}
+ engines: {node: '>=16'}
+ hasBin: true
+
+ convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+ copy-anything@2.0.6:
+ resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==}
+
+ copy-descriptor@0.1.1:
+ resolution: {integrity: sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=}
+ engines: {node: '>=0.10.0'}
+
+ core-js-compat@3.40.0:
+ resolution: {integrity: sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==}
+
+ core-js@3.40.0:
+ resolution: {integrity: sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==}
+
+ cors@2.8.5:
+ resolution: {integrity: sha1-6sEdpRWS3Ya58G9uesKTs9+HXSk=}
+ engines: {node: '>= 0.10'}
+
+ cosmiconfig-typescript-loader@6.1.0:
+ resolution: {integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==}
+ engines: {node: '>=v18'}
+ peerDependencies:
+ '@types/node': '*'
+ cosmiconfig: '>=9'
+ typescript: '>=5'
+
+ cosmiconfig@9.0.0:
+ resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ typescript: '>=4.9.5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ cropperjs@1.6.2:
+ resolution: {integrity: sha512-nhymn9GdnV3CqiEHJVai54TULFAE3VshJTXSqSJKa8yXAKyBKDWdhHarnlIPrshJ0WMFTGuFvG02YjLXfPiuOA==}
+
+ cross-fetch@3.2.0:
+ resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==}
+
+ cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
+
+ css-functions-list@3.2.3:
+ resolution: {integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==}
+ engines: {node: '>=12 || >=16'}
+
+ css-select@4.3.0:
+ resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==}
+
+ css-tree@1.1.3:
+ resolution: {integrity: sha1-60hw+2/XcHMn7JXC/yqwm16NuR0=}
+ 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.1.0:
+ resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
+ engines: {node: '>= 6'}
+
+ cssesc@3.0.0:
+ resolution: {integrity: sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ csso@4.2.0:
+ resolution: {integrity: sha1-6jpWE0bo3J9UbW/r7dUBh884lSk=}
+ engines: {node: '>=8.0.0'}
+
+ csstype@3.1.3:
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+ d@1.0.2:
+ resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==}
+ engines: {node: '>=0.12'}
+
+ danmu.js@1.1.13:
+ resolution: {integrity: sha512-knFd0/cB2HA4FFWiA7eB2suc5vCvoHdqio33FyyCSfP7C+1A+zQcTvnvwfxaZhrxsGj4qaQI2I8XiTqedRaVmg==}
+
+ dargs@8.1.0:
+ resolution: {integrity: sha1-o0hZ6lCcvORUheWqNW/vcL/McnI=}
+ engines: {node: '>=12'}
+
+ 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'}
+
+ dayjs@1.11.13:
+ resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
+
+ de-indent@1.0.2:
+ resolution: {integrity: sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=}
+
+ debug@2.6.9:
+ resolution: {integrity: sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@4.4.0:
+ resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ decamelize@1.2.0:
+ resolution: {integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=}
+ engines: {node: '>=0.10.0'}
+
+ decode-uri-component@0.2.2:
+ resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==}
+ engines: {node: '>=0.10'}
+
+ deep-is@0.1.4:
+ resolution: {integrity: sha1-pvLc5hL63S7x9Rm3NVHxfoUZmDE=}
+
+ deep-pick-omit@1.2.1:
+ resolution: {integrity: sha512-2J6Kc/m3irCeqVG42T+SaUMesaK7oGWaedGnQQK/+O0gYc+2SP5bKh/KKTE7d7SJ+GCA9UUE1GRzh6oDe0EnGw==}
+
+ deepmerge@4.3.1:
+ resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+ engines: {node: '>=0.10.0'}
+
+ defaults@1.0.4:
+ resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
+
+ define-data-property@1.1.4:
+ resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+ engines: {node: '>= 0.4'}
+
+ define-lazy-prop@2.0.0:
+ resolution: {integrity: sha1-P3rkIRKbyqrJvHSQXJigAJ7J7n8=}
+ engines: {node: '>=8'}
+
+ define-properties@1.2.1:
+ resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+ engines: {node: '>= 0.4'}
+
+ define-property@0.2.5:
+ resolution: {integrity: sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=}
+ engines: {node: '>=0.10.0'}
+
+ define-property@1.0.0:
+ resolution: {integrity: sha1-dp66rz9KY6rTr56NMEybvnm/sOY=}
+ engines: {node: '>=0.10.0'}
+
+ define-property@2.0.2:
+ resolution: {integrity: sha1-1Flono1lS6d+AqgX+HENcCyxbp0=}
+ engines: {node: '>=0.10.0'}
+
+ defu@6.1.4:
+ resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
+
+ del@7.1.0:
+ resolution: {integrity: sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==}
+ engines: {node: '>=14.16'}
+
+ delayed-stream@1.0.0:
+ resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=}
+ engines: {node: '>=0.4.0'}
+
+ delegate@3.2.0:
+ resolution: {integrity: sha1-tmtxwxWFIuirV0T3INjKDCr1kWY=}
+
+ destr@2.0.3:
+ resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==}
+
+ detect-file@1.0.0:
+ resolution: {integrity: sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=}
+ engines: {node: '>=0.10.0'}
+
+ dijkstrajs@1.0.3:
+ resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==}
+
+ dir-glob@3.0.1:
+ resolution: {integrity: sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8=}
+ engines: {node: '>=8'}
+
+ dom-serializer@0.2.2:
+ resolution: {integrity: sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E=}
+
+ dom-serializer@1.4.1:
+ resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
+
+ dom-serializer@2.0.0:
+ resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+
+ dom7@3.0.0:
+ resolution: {integrity: sha1-uGHOXWemvs16qjrQKUL/FLEkAzE=}
+
+ domelementtype@1.3.1:
+ resolution: {integrity: sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=}
+
+ domelementtype@2.3.0:
+ resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
+ domhandler@2.4.2:
+ resolution: {integrity: sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=}
+
+ domhandler@4.3.1:
+ resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==}
+ engines: {node: '>= 4'}
+
+ domhandler@5.0.3:
+ resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+ engines: {node: '>= 4'}
+
+ domutils@1.7.0:
+ resolution: {integrity: sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo=}
+
+ domutils@2.8.0:
+ resolution: {integrity: sha1-RDfe9dtuLR9dbuhZvZXKfQIEgTU=}
+
+ domutils@3.2.2:
+ resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
+
+ dot-case@3.0.4:
+ resolution: {integrity: sha1-mytnDQCkMWZ6inW6Kc0bmICc51E=}
+
+ dot-prop@5.3.0:
+ resolution: {integrity: sha1-kMzOcIzZzYLMTcjD3dmr3VWyDog=}
+ engines: {node: '>=8'}
+
+ dotenv@16.4.7:
+ resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==}
+ engines: {node: '>=12'}
+
+ downloadjs@1.4.7:
+ resolution: {integrity: sha1-9p+W+UDg0FU9rCkROYZaPNAQHjw=}
+
+ driver.js@1.3.1:
+ resolution: {integrity: sha512-MvUdXbqSgEsgS/H9KyWb5Rxy0aE6BhOVT4cssi2x2XjmXea6qQfgdx32XKVLLSqTaIw7q/uxU5Xl3NV7+cN6FQ==}
+
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
+ duplexer@0.1.2:
+ resolution: {integrity: sha1-Or5DrvODX4rgd9E23c4PJ2sEAOY=}
+
+ eastasianwidth@0.2.0:
+ resolution: {integrity: sha1-aWzi7Aqg5uqTo5f/zySqeEDIJ8s=}
+
+ echarts-wordcloud@2.1.0:
+ resolution: {integrity: sha512-Kt1JmbcROgb+3IMI48KZECK2AP5lG6bSsOEs+AsuwaWJxQom31RTNd6NFYI01E/YaI1PFZeueaupjlmzSQasjQ==}
+ peerDependencies:
+ echarts: ^5.0.1
+
+ echarts@5.6.0:
+ resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==}
+
+ ee-first@1.1.1:
+ resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=}
+
+ ejs@3.1.10:
+ resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==}
+ engines: {node: '>=0.10.0'}
+ hasBin: true
+
+ electron-to-chromium@1.5.79:
+ resolution: {integrity: sha512-nYOxJNxQ9Om4EC88BE4pPoNI8xwSFf8pU/BAeOl4Hh/b/i6V4biTAzwV7pXi3ARKeoYO5JZKMIXTryXSVer5RA==}
+
+ element-plus@2.9.2:
+ resolution: {integrity: sha512-HS+Cc5mmy70DixJuoN3cMxPPoNWXkjHzUw2PcGmysk6NHQzzUtwi2Vc+dlmbmRxj3eNqgC1xpPQV5Nf9uDtQRg==}
+ peerDependencies:
+ vue: ^3.2.0
+
+ emoji-regex@10.4.0:
+ resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
+
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=}
+
+ emoji-regex@9.2.2:
+ resolution: {integrity: sha1-hAyIA7DYBH9P8M+WMXazLU7z7XI=}
+
+ emojis-list@3.0.0:
+ resolution: {integrity: sha1-VXBmIEatKeLpFucariYKvf9Pang=}
+ engines: {node: '>= 4'}
+
+ encodeurl@1.0.2:
+ resolution: {integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=}
+ engines: {node: '>= 0.8'}
+
+ entities@1.1.2:
+ resolution: {integrity: sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=}
+
+ entities@2.2.0:
+ resolution: {integrity: sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU=}
+
+ entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
+ env-paths@2.2.1:
+ resolution: {integrity: sha1-QgOZ1BbOH76bwKB8Yvpo1n/Q+PI=}
+ engines: {node: '>=6'}
+
+ environment@1.1.0:
+ resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==}
+ engines: {node: '>=18'}
+
+ errno@0.1.8:
+ resolution: {integrity: sha1-i7Ppx9Rjvkl2/4iPdrSAnrwugR8=}
+ hasBin: true
+
+ error-ex@1.3.2:
+ resolution: {integrity: sha1-tKxAZIEH/c3PriQvQovqihTU8b8=}
+
+ es-abstract@1.23.9:
+ resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==}
+ 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-module-lexer@0.9.3:
+ resolution: {integrity: sha1-bxPbAMw4QXE32vdDZvU1yOtDjxk=}
+
+ es-object-atoms@1.0.0:
+ resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==}
+ 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'}
+
+ es5-ext@0.10.64:
+ resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==}
+ engines: {node: '>=0.10'}
+
+ es6-iterator@2.0.3:
+ resolution: {integrity: sha1-p96IkUGgWpSwhUQDstCg+/qY87c=}
+
+ es6-symbol@3.1.4:
+ resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==}
+ engines: {node: '>=0.12'}
+
+ esbuild@0.11.3:
+ resolution: {integrity: sha1-tXFluQe+T/umUfZFBTjOjYwdXrA=}
+ hasBin: true
+
+ esbuild@0.23.1:
+ resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ esbuild@0.24.2:
+ resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ escape-html@1.0.3:
+ resolution: {integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=}
+
+ escape-string-regexp@1.0.5:
+ resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=}
+ engines: {node: '>=0.8.0'}
+
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ=}
+ engines: {node: '>=10'}
+
+ escape-string-regexp@5.0.0:
+ resolution: {integrity: sha1-RoMSa1ALYXYvLb66zhgG6L4xscg=}
+ engines: {node: '>=12'}
+
+ escodegen@2.1.0:
+ resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==}
+ engines: {node: '>=6.0'}
+ hasBin: true
+
+ eslint-config-prettier@9.1.0:
+ resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==}
+ hasBin: true
+ peerDependencies:
+ eslint: '>=7.0.0'
+
+ eslint-define-config@2.1.0:
+ resolution: {integrity: sha512-QUp6pM9pjKEVannNAbSJNeRuYwW3LshejfyBBpjeMGaJjaDUpVps4C6KVR8R7dWZnD3i0synmrE36znjTkJvdQ==}
+ engines: {node: '>=18.0.0', npm: '>=9.0.0', pnpm: '>=8.6.0'}
+
+ eslint-plugin-prettier@5.2.1:
+ resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ '@types/eslint': '>=8.0.0'
+ eslint: '>=8.0.0'
+ eslint-config-prettier: '*'
+ prettier: '>=3.0.0'
+ peerDependenciesMeta:
+ '@types/eslint':
+ optional: true
+ eslint-config-prettier:
+ optional: true
+
+ eslint-plugin-vue@9.32.0:
+ resolution: {integrity: sha512-b/Y05HYmnB/32wqVcjxjHZzNpwxj1onBOvqW89W+V+XNG1dRuaFbNd3vT9CLbr2LXjEoq+3vn8DanWf7XU22Ug==}
+ engines: {node: ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0
+
+ eslint-scope@7.2.2:
+ resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint-scope@8.2.0:
+ resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==}
+ 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.0:
+ resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint@9.17.0:
+ resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ hasBin: true
+ peerDependencies:
+ jiti: '*'
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+
+ esniff@2.0.1:
+ resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==}
+ engines: {node: '>=0.10'}
+
+ esno@4.8.0:
+ resolution: {integrity: sha512-acMtooReAQGzLU0zcuEDHa8S62meh5aIyi8jboYxyvAePdmuWx2Mpwmt0xjwO0bs9/SXf+dvXJ0QJoDWw814Iw==}
+ hasBin: true
+
+ espree@10.3.0:
+ resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ espree@9.6.1:
+ resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ esprima@4.0.1:
+ resolution: {integrity: sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ esquery@1.6.0:
+ resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
+ engines: {node: '>=0.10'}
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha1-eteWTWeauyi+5yzsY3WLHF0smSE=}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha1-LupSkHAvJquP5TcDcP+GyWXSESM=}
+ engines: {node: '>=4.0'}
+
+ estree-walker@1.0.1:
+ resolution: {integrity: sha1-MbxdYSyWtwQQa0d+bdXYqhOMtwA=}
+
+ estree-walker@2.0.2:
+ resolution: {integrity: sha1-UvAQF4wqTBF6d1fP6UKtt9LaTKw=}
+
+ estree-walker@3.0.3:
+ resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+
+ esutils@2.0.3:
+ resolution: {integrity: sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=}
+ engines: {node: '>=0.10.0'}
+
+ etag@1.8.1:
+ resolution: {integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=}
+ engines: {node: '>= 0.6'}
+
+ event-emitter@0.3.5:
+ resolution: {integrity: sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=}
+
+ eventemitter3@4.0.7:
+ resolution: {integrity: sha1-Lem2j2Uo1WRO9cWVJqG0oHMGFp8=}
+
+ eventemitter3@5.0.1:
+ resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
+
+ execa@8.0.1:
+ resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
+ engines: {node: '>=16.17'}
+
+ expand-brackets@2.1.4:
+ resolution: {integrity: sha1-t3c14xXOMPa27/D4OwQVGiJEliI=}
+ engines: {node: '>=0.10.0'}
+
+ expand-tilde@2.0.2:
+ resolution: {integrity: sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=}
+ engines: {node: '>=0.10.0'}
+
+ ext@1.7.0:
+ resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==}
+
+ extend-shallow@2.0.1:
+ resolution: {integrity: sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=}
+ engines: {node: '>=0.10.0'}
+
+ extend-shallow@3.0.2:
+ resolution: {integrity: sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=}
+ engines: {node: '>=0.10.0'}
+
+ extend@3.0.2:
+ resolution: {integrity: sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=}
+
+ external-editor@3.1.0:
+ resolution: {integrity: sha1-ywP3QL764D6k0oPK7SdBqD8zVJU=}
+ engines: {node: '>=4'}
+
+ extglob@2.0.4:
+ resolution: {integrity: sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=}
+ engines: {node: '>=0.10.0'}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=}
+
+ fast-diff@1.3.0:
+ resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
+
+ fast-glob@3.3.3:
+ resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+ engines: {node: '>=8.6.0'}
+
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=}
+
+ fast-levenshtein@2.0.6:
+ resolution: {integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=}
+
+ fast-uri@3.0.5:
+ resolution: {integrity: sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==}
+
+ fastest-levenshtein@1.0.16:
+ resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==}
+ engines: {node: '>= 4.9.1'}
+
+ fastq@1.18.0:
+ resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==}
+
+ fdir@6.4.2:
+ resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
+ file-entry-cache@8.0.0:
+ resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+ engines: {node: '>=16.0.0'}
+
+ file-entry-cache@9.1.0:
+ resolution: {integrity: sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==}
+ engines: {node: '>=18'}
+
+ filelist@1.0.4:
+ resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==}
+
+ fill-range@4.0.0:
+ resolution: {integrity: sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=}
+ engines: {node: '>=0.10.0'}
+
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
+ finalhandler@1.1.2:
+ resolution: {integrity: sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=}
+ engines: {node: '>= 0.8'}
+
+ find-up@4.1.0:
+ resolution: {integrity: sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=}
+ engines: {node: '>=8'}
+
+ find-up@5.0.0:
+ resolution: {integrity: sha1-TJKBnstwg1YeT0okCoa+UZj1Nvw=}
+ engines: {node: '>=10'}
+
+ find-up@7.0.0:
+ resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==}
+ engines: {node: '>=18'}
+
+ findup-sync@5.0.0:
+ resolution: {integrity: sha1-VDgK2WWn7coAzI9jETVZqtxUG9I=}
+ engines: {node: '>= 10.13.0'}
+
+ fined@2.0.0:
+ resolution: {integrity: sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==}
+ engines: {node: '>= 10.13.0'}
+
+ flagged-respawn@2.0.0:
+ resolution: {integrity: sha1-q/OXGdz+GsBshslGYIHFQcaCmHs=}
+ engines: {node: '>= 10.13.0'}
+
+ flat-cache@4.0.1:
+ resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+ engines: {node: '>=16'}
+
+ flat-cache@5.0.0:
+ resolution: {integrity: sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==}
+ engines: {node: '>=18'}
+
+ flatted@3.3.2:
+ resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==}
+
+ follow-redirects@1.15.9:
+ resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ debug: '*'
+ peerDependenciesMeta:
+ debug:
+ optional: true
+
+ for-each@0.3.3:
+ resolution: {integrity: sha1-abRH6IoKXTLD5whPPxcQA0shN24=}
+
+ for-in@1.0.2:
+ resolution: {integrity: sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=}
+ engines: {node: '>=0.10.0'}
+
+ for-own@1.0.0:
+ resolution: {integrity: sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=}
+ engines: {node: '>=0.10.0'}
+
+ foreground-child@3.3.0:
+ resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
+ engines: {node: '>=14'}
+
+ form-data@4.0.1:
+ resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==}
+ engines: {node: '>= 6'}
+
+ fraction.js@4.3.7:
+ resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
+
+ fragment-cache@0.2.1:
+ resolution: {integrity: sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=}
+ engines: {node: '>=0.10.0'}
+
+ fs-extra@10.1.0:
+ resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
+ engines: {node: '>=12'}
+
+ fs-extra@11.2.0:
+ resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==}
+ engines: {node: '>=14.14'}
+
+ fs-minipass@2.1.0:
+ resolution: {integrity: sha1-f1A2/b8SxjwWkZDL5BmchSJx+fs=}
+ engines: {node: '>= 8'}
+
+ fs.realpath@1.0.0:
+ resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=}
+
+ 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==}
+
+ gensync@1.0.0-beta.2:
+ resolution: {integrity: sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA=}
+ engines: {node: '>=6.9.0'}
+
+ get-caller-file@2.0.5:
+ resolution: {integrity: sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=}
+ engines: {node: 6.* || 8.* || >= 10.*}
+
+ get-east-asian-width@1.3.0:
+ resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==}
+ engines: {node: '>=18'}
+
+ get-intrinsic@1.2.7:
+ resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==}
+ engines: {node: '>= 0.4'}
+
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
+ get-stream@8.0.1:
+ resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
+ engines: {node: '>=16'}
+
+ get-symbol-description@1.1.0:
+ resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
+ engines: {node: '>= 0.4'}
+
+ get-tsconfig@4.8.1:
+ resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==}
+
+ get-value@2.0.6:
+ resolution: {integrity: sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=}
+ engines: {node: '>=0.10.0'}
+
+ giget@1.2.3:
+ resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==}
+ hasBin: true
+
+ git-raw-commits@4.0.0:
+ resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==}
+ engines: {node: '>=16'}
+ hasBin: true
+
+ glob-parent@5.1.2:
+ resolution: {integrity: sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=}
+ engines: {node: '>= 6'}
+
+ glob-parent@6.0.2:
+ resolution: {integrity: sha1-bSN9mQg5UMeSkPJMdkKj3poo+eM=}
+ engines: {node: '>=10.13.0'}
+
+ glob@11.0.0:
+ resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==}
+ engines: {node: 20 || >=22}
+ hasBin: true
+
+ glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+
+ global-directory@4.0.1:
+ resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==}
+ engines: {node: '>=18'}
+
+ global-modules@1.0.0:
+ resolution: {integrity: sha1-bXcPDrUjrHgWTXK15xqIdyZcw+o=}
+ engines: {node: '>=0.10.0'}
+
+ global-modules@2.0.0:
+ resolution: {integrity: sha1-mXYFrSNF8n9RU5vqJldEISFcd4A=}
+ engines: {node: '>=6'}
+
+ global-prefix@1.0.2:
+ resolution: {integrity: sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=}
+ engines: {node: '>=0.10.0'}
+
+ global-prefix@3.0.0:
+ resolution: {integrity: sha1-/IX3MGTfafUEIfR/iD/luRO6m5c=}
+ engines: {node: '>=6'}
+
+ globals@11.12.0:
+ resolution: {integrity: sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=}
+ engines: {node: '>=4'}
+
+ globals@13.24.0:
+ resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
+ engines: {node: '>=8'}
+
+ globals@14.0.0:
+ resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
+ engines: {node: '>=18'}
+
+ globals@15.14.0:
+ resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==}
+ engines: {node: '>=18'}
+
+ globalthis@1.0.4:
+ resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
+ engines: {node: '>= 0.4'}
+
+ globby@11.1.0:
+ resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
+ engines: {node: '>=10'}
+
+ globby@13.2.2:
+ resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ globby@14.0.2:
+ resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==}
+ engines: {node: '>=18'}
+
+ globjoin@0.1.4:
+ resolution: {integrity: sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=}
+
+ 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==}
+
+ graphemer@1.4.0:
+ resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+
+ gzip-size@6.0.0:
+ resolution: {integrity: sha1-BlNn/VDCOcBnHLy61b4+LusQ5GI=}
+ engines: {node: '>=10'}
+
+ handlebars@4.7.8:
+ resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==}
+ engines: {node: '>=0.4.7'}
+ hasBin: true
+
+ has-ansi@2.0.0:
+ resolution: {integrity: sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=}
+ 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: sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=}
+ engines: {node: '>=0.10.0'}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=}
+ 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: sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=}
+ engines: {node: '>=0.10.0'}
+
+ has-value@1.0.0:
+ resolution: {integrity: sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=}
+ engines: {node: '>=0.10.0'}
+
+ has-values@0.1.4:
+ resolution: {integrity: sha1-bWHeldkd/Km5oCCJrThL/49it3E=}
+ engines: {node: '>=0.10.0'}
+
+ has-values@1.0.0:
+ resolution: {integrity: sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=}
+ engines: {node: '>=0.10.0'}
+
+ hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
+
+ he@1.2.0:
+ resolution: {integrity: sha1-hK5l+n6vsWX922FWauFLrwVmTw8=}
+ hasBin: true
+
+ header-case@2.0.4:
+ resolution: {integrity: sha1-WkLmO1UXc0nPQFvrjXdayruSwGM=}
+
+ homedir-polyfill@1.0.3:
+ resolution: {integrity: sha1-dDKYzvTlrz4ZQWH7rcwhUdOgWOg=}
+ engines: {node: '>=0.10.0'}
+
+ html-tags@3.3.1:
+ resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
+ engines: {node: '>=8'}
+
+ html-void-elements@2.0.1:
+ resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==}
+
+ htmlparser2@3.10.1:
+ resolution: {integrity: sha1-vWedw/WYl7ajS7EHSchVu1OpOS8=}
+
+ htmlparser2@8.0.2:
+ resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==}
+
+ human-signals@5.0.0:
+ resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
+ engines: {node: '>=16.17.0'}
+
+ husky@9.1.7:
+ resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ i18next@20.6.1:
+ resolution: {integrity: sha1-U15fbluutoXH0l33DbY788wKo0U=}
+
+ iconv-lite@0.4.24:
+ resolution: {integrity: sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=}
+ engines: {node: '>=0.10.0'}
+
+ iconv-lite@0.6.3:
+ resolution: {integrity: sha1-pS+AvzjaGVLrXGgXkHGYcaGnJQE=}
+ engines: {node: '>=0.10.0'}
+
+ ieee754@1.2.1:
+ resolution: {integrity: sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I=}
+
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
+
+ ignore@6.0.2:
+ resolution: {integrity: sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==}
+ engines: {node: '>= 4'}
+
+ ignore@7.0.0:
+ resolution: {integrity: sha512-lcX8PNQygAa22u/0BysEY8VhaFRzlOkvdlKczDPnJvrkJD1EuqzEky5VYYKM2iySIuaVIDv9N190DfSreSLw2A==}
+ engines: {node: '>= 4'}
+
+ image-size@0.5.5:
+ resolution: {integrity: sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=}
+ engines: {node: '>=0.10.0'}
+ hasBin: true
+
+ immer@9.0.21:
+ resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==}
+
+ import-fresh@3.3.0:
+ resolution: {integrity: sha1-NxYsJfy566oublPVtNiM4X2eDCs=}
+ engines: {node: '>=6'}
+
+ import-meta-resolve@4.1.0:
+ resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==}
+
+ importx@0.5.1:
+ resolution: {integrity: sha512-YrRaigAec1sC2CdIJjf/hCH1Wp9Ii8Cq5ROw4k5nJ19FVl2FcJUHZ5gGIb1vs8+JNYIyOJpc2fcufS2330bxDw==}
+
+ imurmurhash@0.1.4:
+ resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=}
+ engines: {node: '>=0.8.19'}
+
+ indent-string@5.0.0:
+ resolution: {integrity: sha1-T9KYD8yvhiLRTGTWlPTPM8gZUaU=}
+ engines: {node: '>=12'}
+
+ inflight@1.0.6:
+ resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=}
+
+ inherits@2.0.4:
+ resolution: {integrity: sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=}
+
+ ini@1.3.8:
+ resolution: {integrity: sha1-op2kJbSIBvNHZ6Tvzjlyaa8oQyw=}
+
+ ini@4.1.1:
+ resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ inquirer@12.3.0:
+ resolution: {integrity: sha512-3NixUXq+hM8ezj2wc7wC37b32/rHq1MwNZDYdvx+d6jokOD+r+i8Q4Pkylh9tISYP114A128LCX8RKhopC5RfQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ inquirer@9.3.7:
+ resolution: {integrity: sha512-LJKFHCSeIRq9hanN14IlOtPSTe3lNES7TYDTE2xxdAy1LS5rYphajK1qtwvj3YmQXvvk0U2Vbmcni8P9EIQW9w==}
+ engines: {node: '>=18'}
+
+ internal-slot@1.1.0:
+ resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
+ engines: {node: '>= 0.4'}
+
+ interpret@3.1.1:
+ resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==}
+ engines: {node: '>=10.13.0'}
+
+ is-absolute@1.0.0:
+ resolution: {integrity: sha1-OV4a6EsR8mrReV5zwXN45IowFXY=}
+ engines: {node: '>=0.10.0'}
+
+ 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-arrayish@0.2.1:
+ resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=}
+
+ is-async-function@2.1.0:
+ resolution: {integrity: sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==}
+ 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: sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=}
+ engines: {node: '>=8'}
+
+ is-boolean-object@1.2.1:
+ resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==}
+ engines: {node: '>= 0.4'}
+
+ is-buffer@1.1.6:
+ resolution: {integrity: sha1-76ouqdqg16suoTqXsritUf776L4=}
+
+ is-builtin-module@3.2.1:
+ resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==}
+ engines: {node: '>=6'}
+
+ is-callable@1.2.7:
+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+ engines: {node: '>= 0.4'}
+
+ is-core-module@2.16.1:
+ resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
+ 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@2.2.1:
+ resolution: {integrity: sha1-M+6r4jz+hvFL3kQIoCwM+4U6zao=}
+ engines: {node: '>=8'}
+ hasBin: true
+
+ is-docker@3.0.0:
+ resolution: {integrity: sha1-kAk6oxBid9inelkQ265xdH4VogA=}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ hasBin: true
+
+ is-extendable@0.1.1:
+ resolution: {integrity: sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=}
+ engines: {node: '>=0.10.0'}
+
+ is-extendable@1.0.1:
+ resolution: {integrity: sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=}
+ engines: {node: '>=0.10.0'}
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=}
+ 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: sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=}
+ engines: {node: '>=8'}
+
+ is-fullwidth-code-point@4.0.0:
+ resolution: {integrity: sha1-+uMWfHKedGP4RhzlErCApJJoqog=}
+ engines: {node: '>=12'}
+
+ is-fullwidth-code-point@5.0.0:
+ resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==}
+ engines: {node: '>=18'}
+
+ is-generator-function@1.1.0:
+ resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==}
+ engines: {node: '>= 0.4'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ=}
+ engines: {node: '>=0.10.0'}
+
+ is-hotkey@0.2.0:
+ resolution: {integrity: sha1-GDWmgXGpHlyUYIadljNpR8g0DO8=}
+
+ is-inside-container@1.0.0:
+ resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
+ engines: {node: '>=14.16'}
+ hasBin: true
+
+ is-interactive@1.0.0:
+ resolution: {integrity: sha1-zqbmrlyHCnsKAAQHC3tYfgJSkS4=}
+ engines: {node: '>=8'}
+
+ is-interactive@2.0.0:
+ resolution: {integrity: sha1-QMV2FFk4JtoRAK3mBZd41ZfxbpA=}
+ engines: {node: '>=12'}
+
+ is-map@2.0.3:
+ resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+ engines: {node: '>= 0.4'}
+
+ is-module@1.0.0:
+ resolution: {integrity: sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=}
+
+ is-number-object@1.1.1:
+ resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
+ engines: {node: '>= 0.4'}
+
+ is-number@3.0.0:
+ resolution: {integrity: sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=}
+ engines: {node: '>=0.10.0'}
+
+ is-number@7.0.0:
+ resolution: {integrity: sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=}
+ engines: {node: '>=0.12.0'}
+
+ is-obj@2.0.0:
+ resolution: {integrity: sha1-Rz+wXZc3BeP9liBUUBjKjiLvSYI=}
+ engines: {node: '>=8'}
+
+ is-path-cwd@3.0.0:
+ resolution: {integrity: sha1-iJtB5VyFiLHrKpamHQV0CmdFIcc=}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ is-path-inside@4.0.0:
+ resolution: {integrity: sha1-gFrrYsR8GxL8P9E7+z7R50MAcds=}
+ engines: {node: '>=12'}
+
+ is-plain-obj@1.1.0:
+ resolution: {integrity: sha1-caUMhCnfync8kqOQpKA7OfzVHT4=}
+ engines: {node: '>=0.10.0'}
+
+ is-plain-object@2.0.4:
+ resolution: {integrity: sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=}
+ engines: {node: '>=0.10.0'}
+
+ is-plain-object@5.0.0:
+ resolution: {integrity: sha1-RCf1CrNCnpAl6n1S6QQ6nvQVk0Q=}
+ engines: {node: '>=0.10.0'}
+
+ is-regex@1.2.1:
+ resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
+ engines: {node: '>= 0.4'}
+
+ is-relative@1.0.0:
+ resolution: {integrity: sha1-obtpNc6MXboei5dUubLcwCDiJg0=}
+ engines: {node: '>=0.10.0'}
+
+ 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@3.0.0:
+ resolution: {integrity: sha1-5r/XqmvvafT0cs6btoHj5XtDGaw=}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ 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-text-path@2.0.0:
+ resolution: {integrity: sha1-skhOK3IKYz/rLoW2fcGT/3LHVjY=}
+ engines: {node: '>=8'}
+
+ is-typed-array@1.1.15:
+ resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
+ engines: {node: '>= 0.4'}
+
+ is-unc-path@1.0.0:
+ resolution: {integrity: sha1-1zHoiY7QkKEsNSrS6u1Qla0yLJ0=}
+ engines: {node: '>=0.10.0'}
+
+ is-unicode-supported@0.1.0:
+ resolution: {integrity: sha1-PybHaoCVk7Ur+i7LVxDtJ3m1Iqc=}
+ engines: {node: '>=10'}
+
+ is-unicode-supported@1.3.0:
+ resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==}
+ engines: {node: '>=12'}
+
+ is-unicode-supported@2.1.0:
+ resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==}
+ engines: {node: '>=18'}
+
+ is-url@1.2.4:
+ resolution: {integrity: sha1-BKTfRtKMTP89c9Af8Gq+sxihqlI=}
+
+ is-weakmap@2.0.2:
+ resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+ engines: {node: '>= 0.4'}
+
+ is-weakref@1.1.0:
+ resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==}
+ engines: {node: '>= 0.4'}
+
+ is-weakset@2.0.4:
+ resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
+ engines: {node: '>= 0.4'}
+
+ is-what@3.14.1:
+ resolution: {integrity: sha1-4SIvRt3ahd6tD9HJ3xMXYOd3VcE=}
+
+ is-windows@1.0.2:
+ resolution: {integrity: sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=}
+ engines: {node: '>=0.10.0'}
+
+ is-wsl@2.2.0:
+ resolution: {integrity: sha1-dKTHbnfKn9P5MvKQwX6jJs0VcnE=}
+ engines: {node: '>=8'}
+
+ is-wsl@3.1.0:
+ resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==}
+ engines: {node: '>=16'}
+
+ is64bit@2.0.0:
+ resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==}
+ engines: {node: '>=18'}
+
+ isarray@1.0.0:
+ resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=}
+
+ isarray@2.0.5:
+ resolution: {integrity: sha1-ivHkwSISRMxiRZ+vOJQNTmRKVyM=}
+
+ isbinaryfile@5.0.4:
+ resolution: {integrity: sha512-YKBKVkKhty7s8rxddb40oOkuP0NbaeXrQvLin6QMHL7Ypiy2RW9LwOVrVgZRyOrhQlayMd9t+D8yDy8MKFTSDQ==}
+ engines: {node: '>= 18.0.0'}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=}
+
+ isobject@2.1.0:
+ resolution: {integrity: sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=}
+ engines: {node: '>=0.10.0'}
+
+ isobject@3.0.1:
+ resolution: {integrity: sha1-TkMekrEalzFjaqH5yNHMvP2reN8=}
+ engines: {node: '>=0.10.0'}
+
+ jackspeak@4.0.2:
+ resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==}
+ engines: {node: 20 || >=22}
+
+ jake@10.9.2:
+ resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ jiti@2.4.2:
+ resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==}
+ hasBin: true
+
+ js-base64@2.6.4:
+ resolution: {integrity: sha1-9OaGxd4eofhn28rT1G2WlCjfmMQ=}
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha1-GSA/tZmR35jjoocFDUZHzerzJJk=}
+
+ js-tokens@9.0.1:
+ resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
+
+ js-yaml@4.1.0:
+ resolution: {integrity: sha1-wftl+PUBeQHN0slRhkuhhFihBgI=}
+ hasBin: true
+
+ jsesc@3.0.2:
+ resolution: {integrity: sha1-u4sJpll7pCZCXy5KByRcPQC5ND4=}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ jsesc@3.1.0:
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ json-buffer@3.0.1:
+ resolution: {integrity: sha1-kziAKjDTtmBfvgYT4JQAjKjAWhM=}
+
+ json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha1-fEeAWpQxmSjgV3dAXcEuH3pO4C0=}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha1-afaofZUTq4u4/mO9sJecRI5oRmA=}
+
+ json-schema-traverse@1.0.0:
+ resolution: {integrity: sha1-rnvLNlard6c7pcSb9lTzjmtoYOI=}
+
+ json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=}
+
+ 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-eslint-parser@2.4.0:
+ resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ jsonfile@6.1.0:
+ resolution: {integrity: sha1-vFWyY0eTxnnsZAMJTrE2mKbsCq4=}
+
+ jsonparse@1.3.1:
+ resolution: {integrity: sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=}
+ engines: {'0': node >= 0.2.0}
+
+ keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+ kind-of@3.2.2:
+ resolution: {integrity: sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=}
+ engines: {node: '>=0.10.0'}
+
+ kind-of@4.0.0:
+ resolution: {integrity: sha1-IIE989cSkosgc3hpGkUGb65y3Vc=}
+ engines: {node: '>=0.10.0'}
+
+ kind-of@5.1.0:
+ resolution: {integrity: sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=}
+ engines: {node: '>=0.10.0'}
+
+ kind-of@6.0.3:
+ resolution: {integrity: sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=}
+ engines: {node: '>=0.10.0'}
+
+ klona@2.0.6:
+ resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==}
+ engines: {node: '>= 8'}
+
+ knitwork@1.2.0:
+ resolution: {integrity: sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==}
+
+ known-css-properties@0.35.0:
+ resolution: {integrity: sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==}
+
+ kolorist@1.8.0:
+ resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
+
+ less@4.2.1:
+ resolution: {integrity: sha512-CasaJidTIhWmjcqv0Uj5vccMI7pJgfD9lMkKtlnTHAdJdYK/7l8pM9tumLyJ0zhbD4KJLo/YvTj+xznQd5NBhg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ levn@0.4.1:
+ resolution: {integrity: sha1-rkViwAdHO5MqYgDUAyaN0v/8at4=}
+ engines: {node: '>= 0.8.0'}
+
+ liftoff@4.0.0:
+ resolution: {integrity: sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==}
+ engines: {node: '>=10.13.0'}
+
+ lilconfig@3.1.3:
+ resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
+ engines: {node: '>=14'}
+
+ lines-and-columns@1.2.4:
+ resolution: {integrity: sha1-7KKE910pZQeTCdwK2SVauy68FjI=}
+
+ lint-staged@15.3.0:
+ resolution: {integrity: sha512-vHFahytLoF2enJklgtOtCtIjZrKD/LoxlaUusd5nh7dWv/dkKQJY74ndFSzxCdv7g0ueGg1ORgTSt4Y9LPZn9A==}
+ engines: {node: '>=18.12.0'}
+ hasBin: true
+
+ listr2@8.2.5:
+ resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==}
+ engines: {node: '>=18.0.0'}
+
+ load-tsconfig@0.2.5:
+ resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ loader-utils@1.4.2:
+ resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==}
+ engines: {node: '>=4.0.0'}
+
+ local-pkg@0.5.1:
+ resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==}
+ engines: {node: '>=14'}
+
+ locate-path@5.0.0:
+ resolution: {integrity: sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=}
+ engines: {node: '>=8'}
+
+ locate-path@6.0.0:
+ resolution: {integrity: sha1-VTIeswn+u8WcSAHZMackUqaB0oY=}
+ engines: {node: '>=10'}
+
+ locate-path@7.2.0:
+ resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ lodash-es@4.17.21:
+ resolution: {integrity: sha1-Q+YmxG5lkbd1C+srUBFzkMYJ4+4=}
+
+ lodash-unified@1.0.3:
+ resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==}
+ peerDependencies:
+ '@types/lodash-es': '*'
+ lodash: '*'
+ lodash-es: '*'
+
+ lodash.camelcase@4.3.0:
+ resolution: {integrity: sha1-soqmKIorn8ZRA1x3EfZathkDMaY=}
+
+ lodash.clonedeep@4.5.0:
+ resolution: {integrity: sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=}
+
+ lodash.debounce@4.0.8:
+ resolution: {integrity: sha1-gteb/zCmfEAF/9XiUVMArZyk168=}
+
+ lodash.foreach@4.5.0:
+ resolution: {integrity: sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=}
+
+ lodash.get@4.4.2:
+ resolution: {integrity: sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=}
+
+ lodash.isequal@4.5.0:
+ resolution: {integrity: sha1-QVxEePK8wwEgwizhDtMib30+GOA=}
+
+ lodash.isplainobject@4.0.6:
+ resolution: {integrity: sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=}
+
+ lodash.kebabcase@4.1.1:
+ resolution: {integrity: sha1-hImxyw0p/4gZXM7KRI/21swpXDY=}
+
+ lodash.merge@4.6.2:
+ resolution: {integrity: sha1-VYqlO0O2YeGSWgr9+japoQhf5Xo=}
+
+ lodash.mergewith@4.6.2:
+ resolution: {integrity: sha1-YXEh+JrFX1kEfHrsHM1mVMZZD1U=}
+
+ lodash.snakecase@4.1.1:
+ resolution: {integrity: sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=}
+
+ lodash.startcase@4.4.0:
+ resolution: {integrity: sha1-lDbjTtJgk+1/+uGTYUQ1CRXZrdg=}
+
+ lodash.throttle@4.1.1:
+ resolution: {integrity: sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=}
+
+ lodash.toarray@4.4.0:
+ resolution: {integrity: sha1-JMS/zWsvuji/0FlNsRedjptlZWE=}
+
+ lodash.truncate@4.4.2:
+ resolution: {integrity: sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=}
+
+ lodash.uniq@4.5.0:
+ resolution: {integrity: sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=}
+
+ lodash.upperfirst@4.3.1:
+ resolution: {integrity: sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984=}
+
+ lodash@4.17.21:
+ resolution: {integrity: sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw=}
+
+ log-symbols@4.1.0:
+ resolution: {integrity: sha1-P727lbRoOsn8eFER55LlWNSr1QM=}
+ engines: {node: '>=10'}
+
+ log-symbols@6.0.0:
+ resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==}
+ engines: {node: '>=18'}
+
+ log-update@6.1.0:
+ resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==}
+ engines: {node: '>=18'}
+
+ lower-case@2.0.2:
+ resolution: {integrity: sha1-b6I3xj29xKgsoP2ILkci3F5jTig=}
+
+ lru-cache@11.0.2:
+ resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==}
+ engines: {node: 20 || >=22}
+
+ lru-cache@5.1.1:
+ resolution: {integrity: sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=}
+
+ magic-string@0.25.9:
+ resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
+
+ magic-string@0.30.17:
+ resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
+
+ make-dir@2.1.0:
+ resolution: {integrity: sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=}
+ engines: {node: '>=6'}
+
+ make-iterator@1.0.1:
+ resolution: {integrity: sha1-KbM/MSqo9UfEpeSQ9Wr87JkTOtY=}
+ engines: {node: '>=0.10.0'}
+
+ map-cache@0.2.2:
+ resolution: {integrity: sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=}
+ engines: {node: '>=0.10.0'}
+
+ map-visit@1.0.0:
+ resolution: {integrity: sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=}
+ engines: {node: '>=0.10.0'}
+
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
+ mathml-tag-names@2.1.3:
+ resolution: {integrity: sha1-TdrdZzCOeAzxakdoWHjuJ7c2oKM=}
+
+ mdn-data@2.0.14:
+ resolution: {integrity: sha1-cRP8QoGRfWPOKbQ0RvcB5owlulA=}
+
+ mdn-data@2.12.2:
+ resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==}
+
+ memoize-one@6.0.0:
+ resolution: {integrity: sha1-slkbhx7YKUiu5HJ9xqvO7qyMEEU=}
+
+ meow@12.1.1:
+ resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==}
+ engines: {node: '>=16.10'}
+
+ meow@13.2.0:
+ resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==}
+ engines: {node: '>=18'}
+
+ merge-options@1.0.1:
+ resolution: {integrity: sha1-KmSyRFe+zU5NxggoMkfpTOWJqjI=}
+ engines: {node: '>=4'}
+
+ merge-stream@2.0.0:
+ resolution: {integrity: sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A=}
+
+ merge2@1.4.1:
+ resolution: {integrity: sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=}
+ engines: {node: '>= 8'}
+
+ micromatch@3.1.0:
+ resolution: {integrity: sha1-UQLU6vILaZfWAI46z+HESj+oFeI=}
+ engines: {node: '>=0.10.0'}
+
+ 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-match@1.0.2:
+ resolution: {integrity: sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==}
+
+ mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+
+ mime@1.6.0:
+ resolution: {integrity: sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ mimic-fn@2.1.0:
+ resolution: {integrity: sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=}
+ engines: {node: '>=6'}
+
+ mimic-fn@4.0.0:
+ resolution: {integrity: sha1-YKkFUNXLCyOcymXYk7GlOymHHsw=}
+ engines: {node: '>=12'}
+
+ mimic-function@5.0.1:
+ resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
+ engines: {node: '>=18'}
+
+ minimatch@10.0.1:
+ resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==}
+ engines: {node: 20 || >=22}
+
+ minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+
+ minimatch@5.1.6:
+ resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
+ engines: {node: '>=10'}
+
+ 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@3.3.6:
+ resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
+ engines: {node: '>=8'}
+
+ minipass@5.0.0:
+ resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==}
+ engines: {node: '>=8'}
+
+ minipass@7.1.2:
+ resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minizlib@2.1.2:
+ resolution: {integrity: sha1-6Q00Zrogm5MkUVCKEc49NjIUWTE=}
+ engines: {node: '>= 8'}
+
+ mitt@3.0.1:
+ resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
+
+ mixin-deep@1.3.2:
+ resolution: {integrity: sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=}
+ engines: {node: '>=0.10.0'}
+
+ mkdirp@1.0.4:
+ resolution: {integrity: sha1-PrXtYmInVteaXw4qIh3+utdcL34=}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ mkdirp@3.0.1:
+ resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ mlly@1.7.3:
+ resolution: {integrity: sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==}
+
+ mockjs@1.1.0:
+ resolution: {integrity: sha1-5qDDeOkZBtuv8gkRzAJzs8fXWwY=}
+ hasBin: true
+
+ monaco-editor@0.52.2:
+ resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==}
+
+ mrmime@2.0.0:
+ resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==}
+ engines: {node: '>=10'}
+
+ ms@2.0.0:
+ resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=}
+
+ ms@2.1.3:
+ resolution: {integrity: sha1-V0yBOM4dK1hh8LRFedut1gxmFbI=}
+
+ muggle-string@0.4.1:
+ resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
+
+ mute-stream@1.0.0:
+ resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ mute-stream@2.0.0:
+ resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ namespace-emitter@2.0.1:
+ resolution: {integrity: sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==}
+
+ nanoid@3.3.8:
+ resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ nanomatch@1.2.13:
+ resolution: {integrity: sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=}
+ engines: {node: '>=0.10.0'}
+
+ natural-compare@1.4.0:
+ resolution: {integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=}
+
+ needle@3.3.1:
+ resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==}
+ engines: {node: '>= 4.4.x'}
+ hasBin: true
+
+ neo-async@2.6.2:
+ resolution: {integrity: sha1-tKr7k+OustgXTKU88WOrfXMIMF8=}
+
+ next-tick@1.1.0:
+ resolution: {integrity: sha1-GDbuMK1W1n7ygbIr0Zn3CUSbNes=}
+
+ no-case@3.0.4:
+ resolution: {integrity: sha1-02H9XJgA9VhVGoNp/A3NRmK2Ek0=}
+
+ node-fetch-native@1.6.4:
+ resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==}
+
+ node-fetch@2.7.0:
+ resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+
+ node-plop@0.32.0:
+ resolution: {integrity: sha512-lKFSRSRuDHhwDKMUobdsvaWCbbDRbV3jMUSMiajQSQux1aNUevAZVxUHc2JERI//W8ABPRbi3ebYuSuIzkNIpQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ node-releases@2.0.19:
+ resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
+
+ normalize-path@3.0.0:
+ resolution: {integrity: sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=}
+ engines: {node: '>=0.10.0'}
+
+ normalize-range@0.1.2:
+ resolution: {integrity: sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=}
+ engines: {node: '>=0.10.0'}
+
+ normalize-wheel-es@1.2.0:
+ resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==}
+
+ npm-run-path@5.3.0:
+ resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ nprogress@0.2.0:
+ resolution: {integrity: sha1-y480xTIT2JVyP8urkH6UIq28r7E=}
+
+ nth-check@2.1.1:
+ resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
+ nypm@0.3.12:
+ resolution: {integrity: sha512-D3pzNDWIvgA+7IORhD/IuWzEk4uXv6GsgOxiid4UU3h9oq5IqV1KtPDi63n4sZJ/xcWlr88c0QM2RgN5VbOhFA==}
+ engines: {node: ^14.16.0 || >=16.10.0}
+ hasBin: true
+
+ object-assign@4.1.1:
+ resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=}
+ engines: {node: '>=0.10.0'}
+
+ object-copy@0.1.0:
+ resolution: {integrity: sha1-fn2Fi3gb18mRpBupde04EnVOmYw=}
+ engines: {node: '>=0.10.0'}
+
+ object-inspect@1.13.3:
+ resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==}
+ engines: {node: '>= 0.4'}
+
+ object-keys@1.1.1:
+ resolution: {integrity: sha1-HEfyct8nfzsdrwYWd9nILiMixg4=}
+ engines: {node: '>= 0.4'}
+
+ object-visit@1.0.1:
+ resolution: {integrity: sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=}
+ engines: {node: '>=0.10.0'}
+
+ object.assign@4.1.7:
+ resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
+ engines: {node: '>= 0.4'}
+
+ object.defaults@1.1.0:
+ resolution: {integrity: sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=}
+ engines: {node: '>=0.10.0'}
+
+ object.map@1.0.1:
+ resolution: {integrity: sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=}
+ engines: {node: '>=0.10.0'}
+
+ object.pick@1.3.0:
+ resolution: {integrity: sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=}
+ engines: {node: '>=0.10.0'}
+
+ ofetch@1.4.1:
+ resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==}
+
+ ohash@1.1.4:
+ resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==}
+
+ on-finished@2.3.0:
+ resolution: {integrity: sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=}
+ engines: {node: '>= 0.8'}
+
+ once@1.4.0:
+ resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=}
+
+ onetime@5.1.2:
+ resolution: {integrity: sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4=}
+ engines: {node: '>=6'}
+
+ onetime@6.0.0:
+ resolution: {integrity: sha1-fCTBjtH9LpvKS9JoBqM2E8d9NLQ=}
+ engines: {node: '>=12'}
+
+ onetime@7.0.0:
+ resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
+ engines: {node: '>=18'}
+
+ open@8.4.2:
+ resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
+ engines: {node: '>=12'}
+
+ optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+ engines: {node: '>= 0.8.0'}
+
+ ora@5.4.1:
+ resolution: {integrity: sha1-GyZ4Qmr0rEpQkAjl5KyemVnbnhg=}
+ engines: {node: '>=10'}
+
+ ora@8.1.1:
+ resolution: {integrity: sha512-YWielGi1XzG1UTvOaCFaNgEnuhZVMSHYkW/FQ7UX8O26PtlpdM84c0f7wLPlkvx2RfiQmnzd61d/MGxmpQeJPw==}
+ engines: {node: '>=18'}
+
+ os-tmpdir@1.0.2:
+ resolution: {integrity: sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=}
+ engines: {node: '>=0.10.0'}
+
+ own-keys@1.0.1:
+ resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
+ engines: {node: '>= 0.4'}
+
+ p-limit@2.3.0:
+ resolution: {integrity: sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE=}
+ engines: {node: '>=6'}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha1-4drMvnjQ0TiMoYxk/qOOPlfjcGs=}
+ engines: {node: '>=10'}
+
+ p-limit@4.0.0:
+ resolution: {integrity: sha1-kUr2VE7TK/pUZwsGHK/L0EmEtkQ=}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ p-locate@4.1.0:
+ resolution: {integrity: sha1-o0KLtwiLOmApL2aRkni3wpetTwc=}
+ engines: {node: '>=8'}
+
+ p-locate@5.0.0:
+ resolution: {integrity: sha1-g8gxXGeFAF470CGDlBHJ4RDm2DQ=}
+ engines: {node: '>=10'}
+
+ p-locate@6.0.0:
+ resolution: {integrity: sha1-PamknUk0uQEIncozAvpl3FoFwE8=}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ p-map@5.5.0:
+ resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==}
+ engines: {node: '>=12'}
+
+ p-try@2.2.0:
+ resolution: {integrity: sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=}
+ engines: {node: '>=6'}
+
+ package-json-from-dist@1.0.1:
+ resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
+
+ package-manager-detector@0.2.8:
+ resolution: {integrity: sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==}
+
+ param-case@3.0.4:
+ resolution: {integrity: sha1-fRf+SqEr3jTUp32RrPtiGcqtAcU=}
+
+ parent-module@1.0.1:
+ resolution: {integrity: sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=}
+ engines: {node: '>=6'}
+
+ parse-filepath@1.0.2:
+ resolution: {integrity: sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=}
+ engines: {node: '>=0.8'}
+
+ parse-json@5.2.0:
+ resolution: {integrity: sha1-x2/Gbe5UIxyWKyK8yKcs8vmXU80=}
+ engines: {node: '>=8'}
+
+ parse-node-version@1.0.1:
+ resolution: {integrity: sha1-4rXb7eAOf6m8NjYH9TMn6LBzGJs=}
+ engines: {node: '>= 0.10'}
+
+ parse-passwd@1.0.0:
+ resolution: {integrity: sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=}
+ engines: {node: '>=0.10.0'}
+
+ parseurl@1.3.3:
+ resolution: {integrity: sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=}
+ engines: {node: '>= 0.8'}
+
+ pascal-case@3.1.2:
+ resolution: {integrity: sha1-tI4O8rmOIF58Ha50fQsVCCN2YOs=}
+
+ pascalcase@0.1.1:
+ resolution: {integrity: sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=}
+ engines: {node: '>=0.10.0'}
+
+ path-browserify@1.0.1:
+ resolution: {integrity: sha1-2YRUqcN1PVeQhg8W9ohnueRr4f0=}
+
+ path-case@3.0.4:
+ resolution: {integrity: sha1-kWhkUzTrlCZYN1xW+AtMDLX4LG8=}
+
+ path-exists@4.0.0:
+ resolution: {integrity: sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=}
+ engines: {node: '>=8'}
+
+ path-exists@5.0.0:
+ resolution: {integrity: sha1-pqrZSJIAsh+rMeSc8JJ35RFvuec=}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ path-is-absolute@1.0.1:
+ resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=}
+ engines: {node: '>=0.10.0'}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=}
+ engines: {node: '>=8'}
+
+ path-key@4.0.0:
+ resolution: {integrity: sha1-KVWI3DruZBVPh3rbnXgLgcVUvxg=}
+ engines: {node: '>=12'}
+
+ path-parse@1.0.7:
+ resolution: {integrity: sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU=}
+
+ path-root-regex@0.1.2:
+ resolution: {integrity: sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=}
+ engines: {node: '>=0.10.0'}
+
+ path-root@0.1.1:
+ resolution: {integrity: sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=}
+ engines: {node: '>=0.10.0'}
+
+ path-scurry@2.0.0:
+ resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==}
+ engines: {node: 20 || >=22}
+
+ path-to-regexp@6.3.0:
+ resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==}
+
+ path-type@4.0.0:
+ resolution: {integrity: sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs=}
+ engines: {node: '>=8'}
+
+ path-type@5.0.0:
+ resolution: {integrity: sha1-FLAe166n3fnHw/RhgdTQT5x4W7g=}
+ engines: {node: '>=12'}
+
+ pathe@0.2.0:
+ resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==}
+
+ pathe@1.1.2:
+ resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
+
+ pathe@2.0.0:
+ resolution: {integrity: sha512-G7n4uhtk9qJt2hlD+UFfsIGY854wpF+zs2bUbQ3CQEUTcn7v25LRsrmurOxTo4bJgjE4qkyshd9ldsEuY9M6xg==}
+
+ perfect-debounce@1.0.0:
+ resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
+
+ 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.2:
+ resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
+ engines: {node: '>=12'}
+
+ pidtree@0.6.0:
+ resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==}
+ engines: {node: '>=0.10'}
+ hasBin: true
+
+ pify@4.0.1:
+ resolution: {integrity: sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=}
+ engines: {node: '>=6'}
+
+ pinia-plugin-persistedstate@4.2.0:
+ resolution: {integrity: sha512-3buhA7ac+ssbOIx3VRCC8oHkoFwhDM9oHRCjo7nj+O8WUqnW+jRqh7eYT5eS/DNa3H28zp3dYf/nd/Vc8zj8eQ==}
+ peerDependencies:
+ '@pinia/nuxt': '>=0.9.0'
+ pinia: '>=2.3.0'
+ peerDependenciesMeta:
+ '@pinia/nuxt':
+ optional: true
+ pinia:
+ optional: true
+
+ pinia@2.3.0:
+ resolution: {integrity: sha512-ohZj3jla0LL0OH5PlLTDMzqKiVw2XARmC1XYLdLWIPBMdhDW/123ZWr4zVAhtJm+aoSkFa13pYXskAvAscIkhQ==}
+ peerDependencies:
+ typescript: '>=4.4.4'
+ vue: ^2.7.0 || ^3.5.11
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ pkg-types@1.3.0:
+ resolution: {integrity: sha512-kS7yWjVFCkIw9hqdJBoMxDdzEngmkr5FXeWZZfQ6GoYacjVnsW6l2CcYW/0ThD0vF4LPJgVYnrg4d0uuhwYQbg==}
+
+ plop@4.0.1:
+ resolution: {integrity: sha512-5n8QU93kvL/ObOzBcPAB1siVFtAH1TZM6TntJ3JK5kXT0jIgnQV+j+uaOWWFJlg1cNkzLYm8klgASF65K36q9w==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ pngjs@5.0.0:
+ resolution: {integrity: sha1-553SshV2f9nARWHAEjbflgvOf7s=}
+ engines: {node: '>=10.13.0'}
+
+ posix-character-classes@0.1.1:
+ resolution: {integrity: sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=}
+ engines: {node: '>=0.10.0'}
+
+ possible-typed-array-names@1.0.0:
+ resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
+ engines: {node: '>= 0.4'}
+
+ postcss-html@1.7.0:
+ resolution: {integrity: sha512-MfcMpSUIaR/nNgeVS8AyvyDugXlADjN9AcV7e5rDfrF1wduIAGSkL4q2+wgrZgA3sHVAHLDO9FuauHhZYW2nBw==}
+ engines: {node: ^12 || >=14}
+
+ postcss-less@6.0.0:
+ resolution: {integrity: sha512-FPX16mQLyEjLzEuuJtxA8X3ejDLNGGEG503d2YGZR5Ask1SpDN8KmZUMpzCvyalWRywAn1n1VOA5dcqfCLo5rg==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ postcss: ^8.3.5
+
+ postcss-prefix-selector@1.16.1:
+ resolution: {integrity: sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==}
+ peerDependencies:
+ postcss: '>4 <9'
+
+ postcss-resolve-nested-selector@0.1.6:
+ resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==}
+
+ postcss-safe-parser@6.0.0:
+ resolution: {integrity: sha1-u0wpiUFxqUvFyZa5owMX70Aq2qE=}
+ engines: {node: '>=12.0'}
+ peerDependencies:
+ postcss: ^8.3.3
+
+ postcss-safe-parser@7.0.1:
+ resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ postcss: ^8.4.31
+
+ postcss-selector-parser@6.1.2:
+ resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
+ engines: {node: '>=4'}
+
+ postcss-selector-parser@7.0.0:
+ resolution: {integrity: sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==}
+ engines: {node: '>=4'}
+
+ postcss-sorting@8.0.2:
+ resolution: {integrity: sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==}
+ peerDependencies:
+ postcss: ^8.4.20
+
+ postcss-value-parser@4.2.0:
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+
+ postcss@5.2.18:
+ resolution: {integrity: sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=}
+ engines: {node: '>=0.12'}
+
+ postcss@8.4.49:
+ resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ posthtml-parser@0.2.1:
+ resolution: {integrity: sha1-NdUw3jhnQMK6JP8usvrznM3ycd0=}
+
+ posthtml-rename-id@1.0.12:
+ resolution: {integrity: sha1-z39us3FGvxr6wx5o8YxswZrmFDM=}
+
+ posthtml-render@1.4.0:
+ resolution: {integrity: sha1-QBFAcMRYgcrLkzR9rj7/U6+8/xM=}
+ engines: {node: '>=10'}
+
+ posthtml-svg-mode@1.0.3:
+ resolution: {integrity: sha1-q9VU+s6BIjyrDLNn4Y5O/SpOdLA=}
+
+ posthtml@0.9.2:
+ resolution: {integrity: sha1-9MBtufZ7Yf0XxOJW5+PZUVv3Jv0=}
+ engines: {node: '>=0.10.0'}
+
+ preact@10.25.4:
+ resolution: {integrity: sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==}
+
+ prelude-ls@1.2.1:
+ resolution: {integrity: sha1-3rxkidem5rDnYRiIzsiAM30xY5Y=}
+ engines: {node: '>= 0.8.0'}
+
+ prettier-linter-helpers@1.0.0:
+ resolution: {integrity: sha1-0j1B/hN1ZG3i0BBNNFSjAIgCz3s=}
+ engines: {node: '>=6.0.0'}
+
+ prettier@3.4.2:
+ resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ prismjs@1.29.0:
+ resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==}
+ engines: {node: '>=6'}
+
+ progress@2.0.3:
+ resolution: {integrity: sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=}
+ engines: {node: '>=0.4.0'}
+
+ proxy-from-env@1.1.0:
+ resolution: {integrity: sha1-4QLxbKNVQkhldV0sno6k8k1Yw+I=}
+
+ prr@1.0.1:
+ resolution: {integrity: sha1-0/wRS6BplaRexok/SEzrHXj19HY=}
+
+ punycode@1.4.1:
+ resolution: {integrity: sha1-wNWmOycYgArY4esPpSachN1BhF4=}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ qrcode@1.5.4:
+ resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+
+ qs@6.13.1:
+ resolution: {integrity: sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==}
+ engines: {node: '>=0.6'}
+
+ query-string@4.3.4:
+ resolution: {integrity: sha1-u7aTucqRXCMlFbIosaArYJBD2+s=}
+ engines: {node: '>=0.10.0'}
+
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha1-SSkii7xyTfrEPg77BYyve2z7YkM=}
+
+ rc9@2.1.2:
+ resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==}
+
+ rd@2.0.1:
+ resolution: {integrity: sha1-4YqK9bL3RAwNsVI8oExuD5ZgAD8=}
+
+ readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+
+ readdirp@3.6.0:
+ resolution: {integrity: sha1-dKNwvYVxFuJFspzJc0DNQxoCpsc=}
+ engines: {node: '>=8.10.0'}
+
+ readdirp@4.0.2:
+ resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==}
+ engines: {node: '>= 14.16.0'}
+
+ rechoir@0.8.0:
+ resolution: {integrity: sha1-Sfhm4NMhRhQto62PDv81KzIV/yI=}
+ engines: {node: '>= 10.13.0'}
+
+ reflect.getprototypeof@1.0.10:
+ resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
+ engines: {node: '>= 0.4'}
+
+ regenerate-unicode-properties@10.2.0:
+ resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==}
+ engines: {node: '>=4'}
+
+ regenerate@1.4.2:
+ resolution: {integrity: sha1-uTRtiCfo9aMve6KWN9OYtpAUhIo=}
+
+ regenerator-runtime@0.14.1:
+ resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
+ regenerator-transform@0.15.2:
+ resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==}
+
+ regex-not@1.0.2:
+ resolution: {integrity: sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=}
+ engines: {node: '>=0.10.0'}
+
+ regexp.prototype.flags@1.5.4:
+ resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
+ engines: {node: '>= 0.4'}
+
+ regexpu-core@6.2.0:
+ resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==}
+ engines: {node: '>=4'}
+
+ regjsgen@0.8.0:
+ resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==}
+
+ regjsparser@0.12.0:
+ resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==}
+ hasBin: true
+
+ repeat-element@1.1.4:
+ resolution: {integrity: sha1-vmgVIIR6tYx1aKx1+/rSjtQtOek=}
+ engines: {node: '>=0.10.0'}
+
+ repeat-string@1.6.1:
+ resolution: {integrity: sha1-jcrkcOHIirwtYA//Sndihtp15jc=}
+ engines: {node: '>=0.10'}
+
+ require-directory@2.1.1:
+ resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=}
+ engines: {node: '>=0.10.0'}
+
+ require-from-string@2.0.2:
+ resolution: {integrity: sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk=}
+ engines: {node: '>=0.10.0'}
+
+ require-main-filename@2.0.0:
+ resolution: {integrity: sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=}
+
+ resolve-dir@1.0.1:
+ resolution: {integrity: sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=}
+ engines: {node: '>=0.10.0'}
+
+ resolve-from@4.0.0:
+ resolution: {integrity: sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=}
+ engines: {node: '>=4'}
+
+ resolve-from@5.0.0:
+ resolution: {integrity: sha1-w1IlhD3493bfIcV1V7wIfp39/Gk=}
+ engines: {node: '>=8'}
+
+ resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+ resolve-url@0.2.1:
+ resolution: {integrity: sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=}
+
+ resolve@1.22.10:
+ resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
+ engines: {node: '>= 0.4'}
+ hasBin: true
+
+ restore-cursor@3.1.0:
+ resolution: {integrity: sha1-OfZ8VLOnpYzqUjbZXPADQjljH34=}
+ engines: {node: '>=8'}
+
+ restore-cursor@5.1.0:
+ resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==}
+ engines: {node: '>=18'}
+
+ ret@0.1.15:
+ resolution: {integrity: sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=}
+ engines: {node: '>=0.12'}
+
+ reusify@1.0.4:
+ resolution: {integrity: sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ rfdc@1.4.1:
+ resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
+
+ rimraf@3.0.2:
+ resolution: {integrity: sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho=}
+ hasBin: true
+
+ rimraf@6.0.1:
+ resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==}
+ engines: {node: 20 || >=22}
+ hasBin: true
+
+ rollup-plugin-purge-icons@0.10.0:
+ resolution: {integrity: sha512-GD2ftg4L9G/sagIhtCmBn5vdyzePOisniythubpbywP0Q3ix9rZuDeFvgXTPemOsc22pvH7t22ryYQIl0rwGog==}
+ engines: {node: '>= 12'}
+
+ rollup-plugin-visualizer@5.14.0:
+ resolution: {integrity: sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==}
+ engines: {node: '>=18'}
+ hasBin: true
+ peerDependencies:
+ rolldown: 1.x
+ rollup: 2.x || 3.x || 4.x
+ peerDependenciesMeta:
+ rolldown:
+ optional: true
+ rollup:
+ optional: true
+
+ rollup@2.79.2:
+ resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==}
+ engines: {node: '>=10.0.0'}
+ hasBin: true
+
+ rollup@4.30.1:
+ resolution: {integrity: sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ run-async@3.0.0:
+ resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==}
+ engines: {node: '>=0.12.0'}
+
+ run-parallel@1.2.0:
+ resolution: {integrity: sha1-ZtE2jae9+SHrnZW9GpIp5/IaQ+4=}
+
+ rxjs@7.8.1:
+ resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
+
+ safe-array-concat@1.1.3:
+ resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
+ engines: {node: '>=0.4'}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=}
+
+ 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: sha1-QKNmnzsHfR6UPURinhV91IAjvy4=}
+
+ safer-buffer@2.1.2:
+ resolution: {integrity: sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=}
+
+ sax@1.4.1:
+ resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==}
+
+ scroll-into-view-if-needed@2.2.31:
+ resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==}
+
+ scule@1.3.0:
+ resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==}
+
+ semver@5.7.2:
+ resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
+ hasBin: true
+
+ semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
+ semver@7.6.3:
+ resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ sentence-case@3.0.4:
+ resolution: {integrity: sha1-NkWnuMEXx4f96HAgViJbtipFEx8=}
+
+ set-blocking@2.0.0:
+ resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=}
+
+ 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: sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=}
+ engines: {node: '>=0.10.0'}
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=}
+ 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@3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+
+ signal-exit@4.1.0:
+ resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+ engines: {node: '>=14'}
+
+ sirv@3.0.0:
+ resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==}
+ engines: {node: '>=18'}
+
+ slash@3.0.0:
+ resolution: {integrity: sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ=}
+ engines: {node: '>=8'}
+
+ slash@4.0.0:
+ resolution: {integrity: sha1-JCI3IXbExsWt214q2oha+YSzlqc=}
+ engines: {node: '>=12'}
+
+ slash@5.1.0:
+ resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==}
+ engines: {node: '>=14.16'}
+
+ slate-history@0.66.0:
+ resolution: {integrity: sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==}
+ peerDependencies:
+ slate: '>=0.65.3'
+
+ slate@0.72.8:
+ resolution: {integrity: sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==}
+
+ slice-ansi@4.0.0:
+ resolution: {integrity: sha1-UA6N0P1VsFgVCGJVsxla3ypF/ms=}
+ engines: {node: '>=10'}
+
+ slice-ansi@5.0.0:
+ resolution: {integrity: sha1-tzBjxXqpb5zYgWVLFSlNldKFxCo=}
+ engines: {node: '>=12'}
+
+ slice-ansi@7.1.0:
+ resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==}
+ engines: {node: '>=18'}
+
+ snabbdom@3.6.2:
+ resolution: {integrity: sha512-ig5qOnCDbugFntKi6c7Xlib8bA6xiJVk8O+WdFrV3wxbMqeHO0hXFQC4nAhPVWfZfi8255lcZkNhtIBINCc4+Q==}
+ engines: {node: '>=12.17.0'}
+
+ snake-case@3.0.4:
+ resolution: {integrity: sha1-Tyu9Vo6ZNavf1ZPzTGkdrbScRSw=}
+
+ snapdragon-node@2.1.1:
+ resolution: {integrity: sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=}
+ engines: {node: '>=0.10.0'}
+
+ snapdragon-util@3.0.1:
+ resolution: {integrity: sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=}
+ engines: {node: '>=0.10.0'}
+
+ snapdragon@0.8.2:
+ resolution: {integrity: sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=}
+ 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: sha1-GQhmvs51U+H48mei7oLGBrVQmho=}
+
+ source-map-support@0.5.21:
+ resolution: {integrity: sha1-BP58f54e0tZiIzwoyys1ufY/bk8=}
+
+ source-map-url@0.4.1:
+ resolution: {integrity: sha1-CvZmBadFpaL5HPG7+KevvCg97FY=}
+
+ source-map@0.5.7:
+ resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.6.1:
+ resolution: {integrity: sha1-dHIq8y6WFOnCh6jQu95IteLxomM=}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.7.4:
+ resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
+ engines: {node: '>= 8'}
+
+ sourcemap-codec@1.4.8:
+ resolution: {integrity: sha1-6oBL2UhXQC5pktBaOO8a41qatMQ=}
+
+ split-string@3.1.0:
+ resolution: {integrity: sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=}
+ engines: {node: '>=0.10.0'}
+
+ split2@4.2.0:
+ resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+ engines: {node: '>= 10.x'}
+
+ ssr-window@3.0.0:
+ resolution: {integrity: sha1-/VuCgBY4lD4MxwTEaRgBQ1r3rDc=}
+
+ stable@0.1.8:
+ resolution: {integrity: sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88=}
+
+ static-extend@0.1.2:
+ resolution: {integrity: sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=}
+ engines: {node: '>=0.10.0'}
+
+ statuses@1.5.0:
+ resolution: {integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=}
+ engines: {node: '>= 0.6'}
+
+ std-env@3.8.0:
+ resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==}
+
+ stdin-discarder@0.2.2:
+ resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==}
+ engines: {node: '>=18'}
+
+ strict-uri-encode@1.1.0:
+ resolution: {integrity: sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=}
+ engines: {node: '>=0.10.0'}
+
+ string-argv@0.3.2:
+ resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
+ engines: {node: '>=0.6.19'}
+
+ string-width@4.2.3:
+ resolution: {integrity: sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=}
+ engines: {node: '>=8'}
+
+ string-width@5.1.2:
+ resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+ engines: {node: '>=12'}
+
+ string-width@7.2.0:
+ resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
+ engines: {node: '>=18'}
+
+ 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: sha1-QvEUWUpGzxqOMLCoT1bHjD7awh4=}
+
+ strip-ansi@3.0.1:
+ resolution: {integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=}
+ engines: {node: '>=0.10.0'}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=}
+ engines: {node: '>=8'}
+
+ strip-ansi@7.1.0:
+ resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
+ engines: {node: '>=12'}
+
+ strip-final-newline@3.0.0:
+ resolution: {integrity: sha1-UolMMT+/8xiDUoCu1g/3Hr8SuP0=}
+ engines: {node: '>=12'}
+
+ strip-json-comments@3.1.1:
+ resolution: {integrity: sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=}
+ engines: {node: '>=8'}
+
+ strip-literal@2.1.1:
+ resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==}
+
+ stylelint-config-html@1.1.0:
+ resolution: {integrity: sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==}
+ engines: {node: ^12 || >=14}
+ peerDependencies:
+ postcss-html: ^1.0.0
+ stylelint: '>=14.0.0'
+
+ stylelint-config-recommended@14.0.1:
+ resolution: {integrity: sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==}
+ engines: {node: '>=18.12.0'}
+ peerDependencies:
+ stylelint: ^16.1.0
+
+ stylelint-config-standard@36.0.1:
+ resolution: {integrity: sha512-8aX8mTzJ6cuO8mmD5yon61CWuIM4UD8Q5aBcWKGSf6kg+EC3uhB+iOywpTK4ca6ZL7B49en8yanOFtUW0qNzyw==}
+ engines: {node: '>=18.12.0'}
+ peerDependencies:
+ stylelint: ^16.1.0
+
+ stylelint-order@6.0.4:
+ resolution: {integrity: sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==}
+ peerDependencies:
+ stylelint: ^14.0.0 || ^15.0.0 || ^16.0.1
+
+ stylelint@16.12.0:
+ resolution: {integrity: sha512-F8zZ3L/rBpuoBZRvI4JVT20ZanPLXfQLzMOZg1tzPflRVh9mKpOZ8qcSIhh1my3FjAjZWG4T2POwGnmn6a6hbg==}
+ engines: {node: '>=18.12.0'}
+ hasBin: true
+
+ supports-color@2.0.0:
+ resolution: {integrity: sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=}
+ engines: {node: '>=0.8.0'}
+
+ supports-color@3.2.3:
+ resolution: {integrity: sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=}
+ engines: {node: '>=0.8.0'}
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=}
+ engines: {node: '>=8'}
+
+ supports-hyperlinks@3.1.0:
+ resolution: {integrity: sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==}
+ engines: {node: '>=14.18'}
+
+ supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ svg-baker@1.7.0:
+ resolution: {integrity: sha1-g2f3jYdVUMUv5HVvcwPVxdfC6ac=}
+
+ svg-tags@1.0.0:
+ resolution: {integrity: sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=}
+
+ svgo@2.8.0:
+ resolution: {integrity: sha1-T/gMzmcQ3CeV8MfHQQHmdkz8zSQ=}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+
+ synckit@0.9.2:
+ resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+
+ system-architecture@0.1.0:
+ resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==}
+ engines: {node: '>=18'}
+
+ systemjs@6.15.1:
+ resolution: {integrity: sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==}
+
+ table@6.9.0:
+ resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==}
+ engines: {node: '>=10.0.0'}
+
+ tar@6.2.1:
+ resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==}
+ engines: {node: '>=10'}
+
+ terser@5.37.0:
+ resolution: {integrity: sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ text-extensions@2.4.0:
+ resolution: {integrity: sha1-oc/MUM802kG/0EfMdE+ATRaA6jQ=}
+ engines: {node: '>=8'}
+
+ through@2.3.8:
+ resolution: {integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=}
+
+ tiny-warning@1.0.3:
+ resolution: {integrity: sha1-lKMNtFPfTGQ9D9VmBg1gqHXYR1Q=}
+
+ tinyexec@0.3.2:
+ resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
+
+ tinyglobby@0.2.10:
+ resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==}
+ engines: {node: '>=12.0.0'}
+
+ title-case@3.0.3:
+ resolution: {integrity: sha1-vGibRvAuQR8dHh0IH3w97KBImYI=}
+
+ tmp@0.0.33:
+ resolution: {integrity: sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=}
+ engines: {node: '>=0.6.0'}
+
+ to-object-path@0.3.0:
+ resolution: {integrity: sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=}
+ engines: {node: '>=0.10.0'}
+
+ to-regex-range@2.1.1:
+ resolution: {integrity: sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=}
+ engines: {node: '>=0.10.0'}
+
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=}
+ engines: {node: '>=8.0'}
+
+ to-regex@3.0.2:
+ resolution: {integrity: sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=}
+ engines: {node: '>=0.10.0'}
+
+ totalist@3.0.1:
+ resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
+ engines: {node: '>=6'}
+
+ tr46@0.0.3:
+ resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=}
+
+ traverse@0.6.10:
+ resolution: {integrity: sha512-hN4uFRxbK+PX56DxYiGHsTn2dME3TVr9vbNqlQGcGcPhJAn+tdP126iA+TArMpI4YSgnTkMWyoLl5bf81Hi5TA==}
+ engines: {node: '>= 0.4'}
+
+ ts-api-utils@2.0.0:
+ resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==}
+ engines: {node: '>=18.12'}
+ peerDependencies:
+ typescript: '>=4.8.4'
+
+ tslib@2.3.0:
+ resolution: {integrity: sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4=}
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ tsx@4.19.2:
+ resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==}
+ engines: {node: '>=18.0.0'}
+ hasBin: true
+
+ type-check@0.4.0:
+ resolution: {integrity: sha1-B7ggO/pwVsBlcFDjzNLDdzC6uPE=}
+ engines: {node: '>= 0.8.0'}
+
+ type-fest@0.20.2:
+ resolution: {integrity: sha1-G/IH9LKPkVg2ZstfvTJ4hzAc1fQ=}
+ engines: {node: '>=10'}
+
+ type-fest@0.21.3:
+ resolution: {integrity: sha1-0mCiSwGYQ24TP6JqUkptZfo7Ljc=}
+ engines: {node: '>=10'}
+
+ type@2.7.3:
+ resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==}
+
+ 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'}
+
+ typedarray.prototype.slice@1.0.5:
+ resolution: {integrity: sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==}
+ engines: {node: '>= 0.4'}
+
+ typescript-eslint@8.19.1:
+ resolution: {integrity: sha512-LKPUQpdEMVOeKluHi8md7rwLcoXHhwvWp3x+sJkMuq3gGm9yaYJtPo8sRZSblMFJ5pcOGCAak/scKf1mvZDlQw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.8.0'
+
+ typescript@5.7.3:
+ resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ ufo@1.5.4:
+ resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
+
+ uglify-js@3.19.3:
+ resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==}
+ engines: {node: '>=0.8.0'}
+ hasBin: true
+
+ unbox-primitive@1.1.0:
+ resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
+ engines: {node: '>= 0.4'}
+
+ unc-path-regex@0.1.2:
+ resolution: {integrity: sha1-5z3T17DXxe2G+6xrCufYxqadUPo=}
+ engines: {node: '>=0.10.0'}
+
+ unconfig@0.6.0:
+ resolution: {integrity: sha512-4C67J0nIF2QwSXty2kW3zZx1pMZ3iXabylvJWWgHybWVUcMf9pxwsngoQt0gC+AVstRywFqrRBp3qOXJayhpOw==}
+
+ unctx@2.4.1:
+ resolution: {integrity: sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==}
+
+ undici-types@6.20.0:
+ resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
+
+ unicode-canonical-property-names-ecmascript@2.0.1:
+ resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==}
+ engines: {node: '>=4'}
+
+ unicode-match-property-ecmascript@2.0.0:
+ resolution: {integrity: sha1-VP0W4OyxZ88Ezx91a9zJLrp5dsM=}
+ engines: {node: '>=4'}
+
+ unicode-match-property-value-ecmascript@2.2.0:
+ resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==}
+ engines: {node: '>=4'}
+
+ unicode-property-aliases-ecmascript@2.1.0:
+ resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==}
+ engines: {node: '>=4'}
+
+ unicorn-magic@0.1.0:
+ resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==}
+ engines: {node: '>=18'}
+
+ unimport@3.14.5:
+ resolution: {integrity: sha512-tn890SwFFZxqaJSKQPPd+yygfKSATbM8BZWW1aCR2TJBTs1SDrmLamBueaFtYsGjHtQaRgqEbQflOjN2iW12gA==}
+
+ union-value@1.0.1:
+ resolution: {integrity: sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc=}
+ engines: {node: '>=0.10.0'}
+
+ universalify@2.0.1:
+ resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+ engines: {node: '>= 10.0.0'}
+
+ unocss@0.65.4:
+ resolution: {integrity: sha512-KUCW5OzI20Ik6j1zXkkrpWhxZ59TwSKl6+DvmYHEzMfaEcrHlBZaFSApAoSt2CYSvo6SluGiKyr+Im1UTkd4KA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@unocss/webpack': 0.65.4
+ vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0
+ peerDependenciesMeta:
+ '@unocss/webpack':
+ optional: true
+ vite:
+ optional: true
+
+ unpipe@1.0.0:
+ resolution: {integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=}
+ engines: {node: '>= 0.8'}
+
+ unplugin@1.16.1:
+ resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==}
+ engines: {node: '>=14.0.0'}
+
+ unplugin@2.1.2:
+ resolution: {integrity: sha512-Q3LU0e4zxKfRko1wMV2HmP8lB9KWislY7hxXpxd+lGx0PRInE4vhMBVEZwpdVYHvtqzhSrzuIfErsob6bQfCzw==}
+ engines: {node: '>=18.12.0'}
+
+ unset-value@1.0.0:
+ resolution: {integrity: sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=}
+ engines: {node: '>=0.10.0'}
+
+ untyped@1.5.2:
+ resolution: {integrity: sha512-eL/8PlhLcMmlMDtNPKhyyz9kEBDS3Uk4yMu/ewlkT2WFbtzScjHWPJLdQLmaGPUKjXzwe9MumOtOgc4Fro96Kg==}
+ hasBin: true
+
+ update-browserslist-db@1.1.2:
+ resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ upper-case-first@2.0.2:
+ resolution: {integrity: sha1-mSwyc/iCq9GdHgKJTMFHEX+EQyQ=}
+
+ upper-case@2.0.2:
+ resolution: {integrity: sha1-2JgQgj+qsd8VSbfZenb4Ziuub3o=}
+
+ uqr@0.1.2:
+ resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==}
+
+ uri-js@4.4.1:
+ resolution: {integrity: sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34=}
+
+ urix@0.1.0:
+ resolution: {integrity: sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=}
+
+ url@0.11.4:
+ resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==}
+ engines: {node: '>= 0.4'}
+
+ use@3.1.1:
+ resolution: {integrity: sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=}
+ engines: {node: '>=0.10.0'}
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=}
+
+ utils-merge@1.0.1:
+ resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=}
+ engines: {node: '>= 0.4.0'}
+
+ v8flags@4.0.1:
+ resolution: {integrity: sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==}
+ engines: {node: '>= 10.13.0'}
+
+ vary@1.1.2:
+ resolution: {integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=}
+ engines: {node: '>= 0.8'}
+
+ vite-plugin-ejs@1.7.0:
+ resolution: {integrity: sha512-JNP3zQDC4mSbfoJ3G73s5mmZITD8NGjUmLkq4swxyahy/W0xuokK9U9IJGXw7KCggq6UucT6hJ0p+tQrNtqTZw==}
+ peerDependencies:
+ vite: '>=5.0.0'
+
+ vite-plugin-eslint@1.8.1:
+ resolution: {integrity: sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang==}
+ peerDependencies:
+ eslint: '>=7'
+ vite: '>=2'
+
+ vite-plugin-mock@2.9.6:
+ resolution: {integrity: sha512-/Rm59oPppe/ncbkSrUuAxIQihlI2YcBmnbR4ST1RA2VzM1C0tEQc1KlbQvnUGhXECAGTaQN2JyasiwXP6EtKgg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ mockjs: '>=1.1.0'
+ vite: '>=2.0.0'
+
+ 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-purge-icons@0.10.0:
+ resolution: {integrity: sha512-4fMJKQuBu9lAPJWjqGEytRaxty1pP9bWgQLA68dwbbaCXu6NBrOUb/3kMaUc7TP09kerEk+qTriCk05OZXpjwA==}
+ engines: {node: '>= 12'}
+ peerDependencies:
+ vite: '>=2'
+
+ vite-plugin-style-import@2.0.0:
+ resolution: {integrity: sha512-qtoHQae5dSUQPo/rYz/8p190VU5y19rtBaeV7ryLa/AYAU/e9CG89NrN/3+k7MR8mJy/GPIu91iJ3zk9foUOSA==}
+ peerDependencies:
+ vite: '>=2.0.0'
+
+ vite-plugin-svg-icons@2.0.1:
+ resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==}
+ peerDependencies:
+ vite: '>=2.0.0'
+
+ vite-plugin-url-copy@1.1.4:
+ resolution: {integrity: sha512-LuNI0RHdg3gfbyIiY4yzJaIxhq2fAapUTV31eskHIV56CxioddReH+H+bZtRkEdcgr3XkFBdetUVRzBSJjNEyg==}
+ peerDependencies:
+ vite: '>=4.0.0'
+
+ vite@6.0.7:
+ resolution: {integrity: sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
+ jiti: '>=1.21.0'
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ sass-embedded: '*'
+ stylus: '*'
+ sugarss: '*'
+ 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
+
+ vscode-uri@3.0.8:
+ resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==}
+
+ vue-demi@0.14.10:
+ resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
+ 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@9.4.3:
+ resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==}
+ engines: {node: ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '>=6.0.0'
+
+ vue-flow-layout@0.1.1:
+ resolution: {integrity: sha512-JdgRRUVrN0Y2GosA0M68DEbKlXMqJ7FQgsK8CjQD2vxvNSqAU6PZEpi4cfcTVtfM2GVOMjHo7GKKLbXxOBqDqA==}
+ peerDependencies:
+ vue: ^3.4.37
+
+ vue-i18n@11.0.1:
+ resolution: {integrity: sha512-pWAT8CusK8q9/EpN7V3oxwHwxWm6+Kp2PeTZmRGvdZTkUzMQDpbbmHp0TwQ8xw04XKm23cr6B4GL72y3W8Yekg==}
+ engines: {node: '>= 16'}
+ peerDependencies:
+ vue: ^3.0.0
+
+ vue-json-pretty@2.4.0:
+ resolution: {integrity: sha512-e9bP41DYYIc2tWaB6KuwqFJq5odZ8/GkE6vHQuGcbPn37kGk4a3n1RNw3ZYeDrl66NWXgTlOfS+M6NKkowmkWw==}
+ engines: {node: '>= 10.0.0', npm: '>= 5.0.0'}
+ peerDependencies:
+ vue: '>=3.0.0'
+
+ vue-router@4.5.0:
+ resolution: {integrity: sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==}
+ peerDependencies:
+ vue: ^3.2.0
+
+ vue-tsc@2.2.0:
+ resolution: {integrity: sha512-gtmM1sUuJ8aSb0KoAFmK9yMxb8TxjewmxqTJ1aKphD5Cbu0rULFY6+UQT51zW7SpUcenfPUuflKyVwyx9Qdnxg==}
+ hasBin: true
+ peerDependencies:
+ typescript: '>=5.0.0'
+
+ vue-types@5.1.3:
+ resolution: {integrity: sha512-3Wy6QcZl0VusCCHX3vYrWSILFlrOB2EQDoySnuYmASM5cUp1FivJGfkS5lp1CutDgyRb41g32r/1QCmiBj5i1Q==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ vue: ^2.0.0 || ^3.0.0
+ peerDependenciesMeta:
+ vue:
+ optional: true
+
+ vue@3.5.13:
+ resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ wcwidth@1.0.1:
+ resolution: {integrity: sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=}
+
+ webidl-conversions@3.0.1:
+ resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=}
+
+ webpack-virtual-modules@0.6.2:
+ resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+
+ whatwg-url@5.0.0:
+ resolution: {integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0=}
+
+ 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-module@2.0.1:
+ resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==}
+
+ which-typed-array@1.1.18:
+ resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==}
+ engines: {node: '>= 0.4'}
+
+ which@1.3.1:
+ resolution: {integrity: sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=}
+ hasBin: true
+
+ which@2.0.2:
+ resolution: {integrity: sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ wildcard@1.1.2:
+ resolution: {integrity: sha1-pwIEUwhNjNLv5wup02liY94XEKU=}
+
+ word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+
+ wordwrap@1.0.0:
+ resolution: {integrity: sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=}
+
+ wrap-ansi@6.2.0:
+ resolution: {integrity: sha1-6Tk7oHEC5skaOyIUePAlfNKFblM=}
+ engines: {node: '>=8'}
+
+ wrap-ansi@7.0.0:
+ resolution: {integrity: sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=}
+ engines: {node: '>=10'}
+
+ wrap-ansi@8.1.0:
+ resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+ engines: {node: '>=12'}
+
+ wrap-ansi@9.0.0:
+ resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==}
+ engines: {node: '>=18'}
+
+ wrappy@1.0.2:
+ resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=}
+
+ write-file-atomic@5.0.1:
+ resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ xgplayer-subtitles@3.0.20:
+ resolution: {integrity: sha512-I1bjsIY+aKOrhYQspLdneOkYg+Vf4cJVGPnDSFnNebnxXl9Mhz5SEpWGzYizMYxL9UvsQ9pgjeEY0o4hkwM+kQ==}
+ peerDependencies:
+ core-js: '>=3.12.1'
+
+ xgplayer@3.0.20:
+ resolution: {integrity: sha512-UNKZJRyODOZGdka83ao8fI18xdhzOV8qG4aNEOOkuOQbXFXfXsJMr/dazRHFP+uXmTqiCXr568euee3ch7CS7g==}
+ peerDependencies:
+ core-js: '>=3.12.1'
+
+ xml-name-validator@4.0.0:
+ resolution: {integrity: sha1-eaAG4uYxSahgDxVDDwpHJdFSSDU=}
+ engines: {node: '>=12'}
+
+ y18n@4.0.3:
+ resolution: {integrity: sha1-tfJZyCzW4zaSHv17/Yv1YN6e7t8=}
+
+ y18n@5.0.8:
+ resolution: {integrity: sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU=}
+ engines: {node: '>=10'}
+
+ yallist@3.1.1:
+ resolution: {integrity: sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=}
+
+ yallist@4.0.0:
+ resolution: {integrity: sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=}
+
+ yaml-eslint-parser@1.2.3:
+ resolution: {integrity: sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==}
+ engines: {node: ^14.17.0 || >=16.0.0}
+
+ yaml@2.6.1:
+ resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==}
+ engines: {node: '>= 14'}
+ hasBin: true
+
+ yaml@2.7.0:
+ resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==}
+ engines: {node: '>= 14'}
+ hasBin: true
+
+ yargs-parser@18.1.3:
+ resolution: {integrity: sha1-vmjEl1xrKr9GkjawyHA2L6sJp7A=}
+ engines: {node: '>=6'}
+
+ yargs-parser@21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+
+ yargs@15.4.1:
+ resolution: {integrity: sha1-DYehbeAa7p2L7Cv7909nhRcw9Pg=}
+ engines: {node: '>=8'}
+
+ yargs@17.7.2:
+ resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
+ engines: {node: '>=12'}
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha1-ApTrPe4FAo0x7hpfosVWpqrxChs=}
+ engines: {node: '>=10'}
+
+ yocto-queue@1.1.1:
+ resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==}
+ engines: {node: '>=12.20'}
+
+ yoctocolors-cjs@2.1.2:
+ resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==}
+ engines: {node: '>=18'}
+
+ zrender@5.6.1:
+ resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==}
+
+snapshots:
+
+ '@ampproject/remapping@2.3.0':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.8
+ '@jridgewell/trace-mapping': 0.3.25
+
+ '@antfu/install-pkg@0.4.1':
+ dependencies:
+ package-manager-detector: 0.2.8
+ tinyexec: 0.3.2
+
+ '@antfu/utils@0.7.10': {}
+
+ '@babel/code-frame@7.26.2':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.25.9
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
+ '@babel/compat-data@7.26.3': {}
+
+ '@babel/core@7.26.0':
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@babel/code-frame': 7.26.2
+ '@babel/generator': 7.26.3
+ '@babel/helper-compilation-targets': 7.25.9
+ '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+ '@babel/helpers': 7.26.0
+ '@babel/parser': 7.26.3
+ '@babel/template': 7.25.9
+ '@babel/traverse': 7.26.4
+ '@babel/types': 7.26.3
+ convert-source-map: 2.0.0
+ debug: 4.4.0
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/generator@7.26.3':
+ dependencies:
+ '@babel/parser': 7.26.3
+ '@babel/types': 7.26.3
+ '@jridgewell/gen-mapping': 0.3.8
+ '@jridgewell/trace-mapping': 0.3.25
+ jsesc: 3.1.0
+
+ '@babel/helper-annotate-as-pure@7.25.9':
+ dependencies:
+ '@babel/types': 7.26.3
+
+ '@babel/helper-compilation-targets@7.25.9':
+ dependencies:
+ '@babel/compat-data': 7.26.3
+ '@babel/helper-validator-option': 7.25.9
+ browserslist: 4.24.4
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-member-expression-to-functions': 7.25.9
+ '@babel/helper-optimise-call-expression': 7.25.9
+ '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+ '@babel/traverse': 7.26.4
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-create-regexp-features-plugin@7.26.3(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ regexpu-core: 6.2.0
+ semver: 6.3.1
+
+ '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-compilation-targets': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ debug: 4.4.0
+ lodash.debounce: 4.0.8
+ resolve: 1.22.10
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-member-expression-to-functions@7.25.9':
+ dependencies:
+ '@babel/traverse': 7.26.4
+ '@babel/types': 7.26.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-imports@7.25.9':
+ dependencies:
+ '@babel/traverse': 7.26.4
+ '@babel/types': 7.26.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-module-imports': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
+ '@babel/traverse': 7.26.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-optimise-call-expression@7.25.9':
+ dependencies:
+ '@babel/types': 7.26.3
+
+ '@babel/helper-plugin-utils@7.25.9': {}
+
+ '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-wrap-function': 7.25.9
+ '@babel/traverse': 7.26.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-member-expression-to-functions': 7.25.9
+ '@babel/helper-optimise-call-expression': 7.25.9
+ '@babel/traverse': 7.26.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-skip-transparent-expression-wrappers@7.25.9':
+ dependencies:
+ '@babel/traverse': 7.26.4
+ '@babel/types': 7.26.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-string-parser@7.25.9': {}
+
+ '@babel/helper-validator-identifier@7.25.9': {}
+
+ '@babel/helper-validator-option@7.25.9': {}
+
+ '@babel/helper-wrap-function@7.25.9':
+ dependencies:
+ '@babel/template': 7.25.9
+ '@babel/traverse': 7.26.4
+ '@babel/types': 7.26.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helpers@7.26.0':
+ dependencies:
+ '@babel/template': 7.25.9
+ '@babel/types': 7.26.3
+
+ '@babel/parser@7.26.3':
+ dependencies:
+ '@babel/types': 7.26.3
+
+ '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/traverse': 7.26.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+ '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/traverse': 7.26.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+
+ '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0)
+ '@babel/traverse': 7.26.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-module-imports': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-compilation-targets': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0)
+ '@babel/traverse': 7.26.4
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/template': 7.25.9
+
+ '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-compilation-targets': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/traverse': 7.26.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
+ '@babel/traverse': 7.26.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-compilation-targets': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0)
+
+ '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ regenerator-transform: 0.15.2
+
+ '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-typescript@7.26.3(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+ '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/preset-env@7.26.0(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/compat-data': 7.26.3
+ '@babel/core': 7.26.0
+ '@babel/helper-compilation-targets': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-validator-option': 7.25.9
+ '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)
+ '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.0)
+ '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0)
+ '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.0)
+ '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-block-scoped-functions': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.0)
+ '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.26.0)
+ '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0)
+ '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.0)
+ '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-template-literals': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-typeof-symbol': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.0)
+ '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.0)
+ babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0)
+ babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0)
+ babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.0)
+ core-js-compat: 3.40.0
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/types': 7.26.3
+ esutils: 2.0.3
+
+ '@babel/runtime@7.26.0':
+ dependencies:
+ regenerator-runtime: 0.14.1
+
+ '@babel/standalone@7.26.4': {}
+
+ '@babel/template@7.25.9':
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ '@babel/parser': 7.26.3
+ '@babel/types': 7.26.3
+
+ '@babel/traverse@7.26.4':
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ '@babel/generator': 7.26.3
+ '@babel/parser': 7.26.3
+ '@babel/template': 7.25.9
+ '@babel/types': 7.26.3
+ debug: 4.4.0
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/types@7.26.3':
+ dependencies:
+ '@babel/helper-string-parser': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
+
+ '@commitlint/cli@19.6.1(@types/node@22.10.5)(typescript@5.7.3)':
+ dependencies:
+ '@commitlint/format': 19.5.0
+ '@commitlint/lint': 19.6.0
+ '@commitlint/load': 19.6.1(@types/node@22.10.5)(typescript@5.7.3)
+ '@commitlint/read': 19.5.0
+ '@commitlint/types': 19.5.0
+ tinyexec: 0.3.2
+ yargs: 17.7.2
+ transitivePeerDependencies:
+ - '@types/node'
+ - typescript
+
+ '@commitlint/config-conventional@19.6.0':
+ dependencies:
+ '@commitlint/types': 19.5.0
+ conventional-changelog-conventionalcommits: 7.0.2
+
+ '@commitlint/config-validator@19.5.0':
+ dependencies:
+ '@commitlint/types': 19.5.0
+ ajv: 8.17.1
+
+ '@commitlint/ensure@19.5.0':
+ dependencies:
+ '@commitlint/types': 19.5.0
+ lodash.camelcase: 4.3.0
+ lodash.kebabcase: 4.1.1
+ lodash.snakecase: 4.1.1
+ lodash.startcase: 4.4.0
+ lodash.upperfirst: 4.3.1
+
+ '@commitlint/execute-rule@19.5.0': {}
+
+ '@commitlint/format@19.5.0':
+ dependencies:
+ '@commitlint/types': 19.5.0
+ chalk: 5.4.1
+
+ '@commitlint/is-ignored@19.6.0':
+ dependencies:
+ '@commitlint/types': 19.5.0
+ semver: 7.6.3
+
+ '@commitlint/lint@19.6.0':
+ dependencies:
+ '@commitlint/is-ignored': 19.6.0
+ '@commitlint/parse': 19.5.0
+ '@commitlint/rules': 19.6.0
+ '@commitlint/types': 19.5.0
+
+ '@commitlint/load@19.6.1(@types/node@22.10.5)(typescript@5.7.3)':
+ dependencies:
+ '@commitlint/config-validator': 19.5.0
+ '@commitlint/execute-rule': 19.5.0
+ '@commitlint/resolve-extends': 19.5.0
+ '@commitlint/types': 19.5.0
+ chalk: 5.4.1
+ cosmiconfig: 9.0.0(typescript@5.7.3)
+ cosmiconfig-typescript-loader: 6.1.0(@types/node@22.10.5)(cosmiconfig@9.0.0(typescript@5.7.3))(typescript@5.7.3)
+ lodash.isplainobject: 4.0.6
+ lodash.merge: 4.6.2
+ lodash.uniq: 4.5.0
+ transitivePeerDependencies:
+ - '@types/node'
+ - typescript
+
+ '@commitlint/message@19.5.0': {}
+
+ '@commitlint/parse@19.5.0':
+ dependencies:
+ '@commitlint/types': 19.5.0
+ conventional-changelog-angular: 7.0.0
+ conventional-commits-parser: 5.0.0
+
+ '@commitlint/read@19.5.0':
+ dependencies:
+ '@commitlint/top-level': 19.5.0
+ '@commitlint/types': 19.5.0
+ git-raw-commits: 4.0.0
+ minimist: 1.2.8
+ tinyexec: 0.3.2
+
+ '@commitlint/resolve-extends@19.5.0':
+ dependencies:
+ '@commitlint/config-validator': 19.5.0
+ '@commitlint/types': 19.5.0
+ global-directory: 4.0.1
+ import-meta-resolve: 4.1.0
+ lodash.mergewith: 4.6.2
+ resolve-from: 5.0.0
+
+ '@commitlint/rules@19.6.0':
+ dependencies:
+ '@commitlint/ensure': 19.5.0
+ '@commitlint/message': 19.5.0
+ '@commitlint/to-lines': 19.5.0
+ '@commitlint/types': 19.5.0
+
+ '@commitlint/to-lines@19.5.0': {}
+
+ '@commitlint/top-level@19.5.0':
+ dependencies:
+ find-up: 7.0.0
+
+ '@commitlint/types@19.5.0':
+ dependencies:
+ '@types/conventional-commits-parser': 5.0.1
+ chalk: 5.4.1
+
+ '@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)':
+ dependencies:
+ '@csstools/css-tokenizer': 3.0.3
+
+ '@csstools/css-tokenizer@3.0.3': {}
+
+ '@csstools/media-query-list-parser@4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)':
+ dependencies:
+ '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3)
+ '@csstools/css-tokenizer': 3.0.3
+
+ '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.0.0)':
+ dependencies:
+ postcss-selector-parser: 7.0.0
+
+ '@ctrl/tinycolor@3.6.1': {}
+
+ '@dual-bundle/import-meta-resolve@4.1.0': {}
+
+ '@element-plus/icons-vue@2.3.1(vue@3.5.13(typescript@5.7.3))':
+ dependencies:
+ vue: 3.5.13(typescript@5.7.3)
+
+ '@esbuild/aix-ppc64@0.23.1':
+ optional: true
+
+ '@esbuild/aix-ppc64@0.24.2':
+ optional: true
+
+ '@esbuild/android-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/android-arm64@0.24.2':
+ optional: true
+
+ '@esbuild/android-arm@0.23.1':
+ optional: true
+
+ '@esbuild/android-arm@0.24.2':
+ optional: true
+
+ '@esbuild/android-x64@0.23.1':
+ optional: true
+
+ '@esbuild/android-x64@0.24.2':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.24.2':
+ optional: true
+
+ '@esbuild/darwin-x64@0.23.1':
+ optional: true
+
+ '@esbuild/darwin-x64@0.24.2':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.24.2':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.23.1':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.24.2':
+ optional: true
+
+ '@esbuild/linux-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-arm64@0.24.2':
+ optional: true
+
+ '@esbuild/linux-arm@0.23.1':
+ optional: true
+
+ '@esbuild/linux-arm@0.24.2':
+ optional: true
+
+ '@esbuild/linux-ia32@0.23.1':
+ optional: true
+
+ '@esbuild/linux-ia32@0.24.2':
+ optional: true
+
+ '@esbuild/linux-loong64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-loong64@0.24.2':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.23.1':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.24.2':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.24.2':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.24.2':
+ optional: true
+
+ '@esbuild/linux-s390x@0.23.1':
+ optional: true
+
+ '@esbuild/linux-s390x@0.24.2':
+ optional: true
+
+ '@esbuild/linux-x64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-x64@0.24.2':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.24.2':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.23.1':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.24.2':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.24.2':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.23.1':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.24.2':
+ optional: true
+
+ '@esbuild/sunos-x64@0.23.1':
+ optional: true
+
+ '@esbuild/sunos-x64@0.24.2':
+ optional: true
+
+ '@esbuild/win32-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/win32-arm64@0.24.2':
+ optional: true
+
+ '@esbuild/win32-ia32@0.23.1':
+ optional: true
+
+ '@esbuild/win32-ia32@0.24.2':
+ optional: true
+
+ '@esbuild/win32-x64@0.23.1':
+ optional: true
+
+ '@esbuild/win32-x64@0.24.2':
+ optional: true
+
+ '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0(jiti@2.4.2))':
+ dependencies:
+ eslint: 9.17.0(jiti@2.4.2)
+ eslint-visitor-keys: 3.4.3
+
+ '@eslint-community/regexpp@4.12.1': {}
+
+ '@eslint/config-array@0.19.1':
+ dependencies:
+ '@eslint/object-schema': 2.1.5
+ debug: 4.4.0
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/core@0.9.1':
+ dependencies:
+ '@types/json-schema': 7.0.15
+
+ '@eslint/eslintrc@3.2.0':
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.4.0
+ espree: 10.3.0
+ globals: 14.0.0
+ ignore: 5.3.2
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/js@9.17.0': {}
+
+ '@eslint/object-schema@2.1.5': {}
+
+ '@eslint/plugin-kit@0.2.4':
+ dependencies:
+ levn: 0.4.1
+
+ '@floating-ui/core@1.6.9':
+ dependencies:
+ '@floating-ui/utils': 0.2.9
+
+ '@floating-ui/dom@1.6.13':
+ dependencies:
+ '@floating-ui/core': 1.6.9
+ '@floating-ui/utils': 0.2.9
+
+ '@floating-ui/utils@0.2.9': {}
+
+ '@humanfs/core@0.19.1': {}
+
+ '@humanfs/node@0.16.6':
+ dependencies:
+ '@humanfs/core': 0.19.1
+ '@humanwhocodes/retry': 0.3.1
+
+ '@humanwhocodes/module-importer@1.0.1': {}
+
+ '@humanwhocodes/retry@0.3.1': {}
+
+ '@humanwhocodes/retry@0.4.1': {}
+
+ '@iconify/iconify@2.1.2':
+ dependencies:
+ cross-fetch: 3.2.0
+ transitivePeerDependencies:
+ - encoding
+
+ '@iconify/iconify@3.1.1':
+ dependencies:
+ '@iconify/types': 2.0.0
+
+ '@iconify/json@2.2.293':
+ dependencies:
+ '@iconify/types': 2.0.0
+ pathe: 1.1.2
+
+ '@iconify/types@2.0.0': {}
+
+ '@iconify/utils@2.2.1':
+ dependencies:
+ '@antfu/install-pkg': 0.4.1
+ '@antfu/utils': 0.7.10
+ '@iconify/types': 2.0.0
+ debug: 4.4.0
+ globals: 15.14.0
+ kolorist: 1.8.0
+ local-pkg: 0.5.1
+ mlly: 1.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@iconify/vue@4.3.0(vue@3.5.13(typescript@5.7.3))':
+ dependencies:
+ '@iconify/types': 2.0.0
+ vue: 3.5.13(typescript@5.7.3)
+
+ '@inquirer/checkbox@4.0.4(@types/node@22.10.5)':
+ dependencies:
+ '@inquirer/core': 10.1.2(@types/node@22.10.5)
+ '@inquirer/figures': 1.0.9
+ '@inquirer/type': 3.0.2(@types/node@22.10.5)
+ '@types/node': 22.10.5
+ ansi-escapes: 4.3.2
+ yoctocolors-cjs: 2.1.2
+
+ '@inquirer/confirm@5.1.1(@types/node@22.10.5)':
+ dependencies:
+ '@inquirer/core': 10.1.2(@types/node@22.10.5)
+ '@inquirer/type': 3.0.2(@types/node@22.10.5)
+ '@types/node': 22.10.5
+
+ '@inquirer/core@10.1.2(@types/node@22.10.5)':
+ dependencies:
+ '@inquirer/figures': 1.0.9
+ '@inquirer/type': 3.0.2(@types/node@22.10.5)
+ ansi-escapes: 4.3.2
+ cli-width: 4.1.0
+ mute-stream: 2.0.0
+ signal-exit: 4.1.0
+ strip-ansi: 6.0.1
+ wrap-ansi: 6.2.0
+ yoctocolors-cjs: 2.1.2
+ transitivePeerDependencies:
+ - '@types/node'
+
+ '@inquirer/editor@4.2.1(@types/node@22.10.5)':
+ dependencies:
+ '@inquirer/core': 10.1.2(@types/node@22.10.5)
+ '@inquirer/type': 3.0.2(@types/node@22.10.5)
+ '@types/node': 22.10.5
+ external-editor: 3.1.0
+
+ '@inquirer/expand@4.0.4(@types/node@22.10.5)':
+ dependencies:
+ '@inquirer/core': 10.1.2(@types/node@22.10.5)
+ '@inquirer/type': 3.0.2(@types/node@22.10.5)
+ '@types/node': 22.10.5
+ yoctocolors-cjs: 2.1.2
+
+ '@inquirer/figures@1.0.9': {}
+
+ '@inquirer/input@4.1.1(@types/node@22.10.5)':
+ dependencies:
+ '@inquirer/core': 10.1.2(@types/node@22.10.5)
+ '@inquirer/type': 3.0.2(@types/node@22.10.5)
+ '@types/node': 22.10.5
+
+ '@inquirer/number@3.0.4(@types/node@22.10.5)':
+ dependencies:
+ '@inquirer/core': 10.1.2(@types/node@22.10.5)
+ '@inquirer/type': 3.0.2(@types/node@22.10.5)
+ '@types/node': 22.10.5
+
+ '@inquirer/password@4.0.4(@types/node@22.10.5)':
+ dependencies:
+ '@inquirer/core': 10.1.2(@types/node@22.10.5)
+ '@inquirer/type': 3.0.2(@types/node@22.10.5)
+ '@types/node': 22.10.5
+ ansi-escapes: 4.3.2
+
+ '@inquirer/prompts@7.2.1(@types/node@22.10.5)':
+ dependencies:
+ '@inquirer/checkbox': 4.0.4(@types/node@22.10.5)
+ '@inquirer/confirm': 5.1.1(@types/node@22.10.5)
+ '@inquirer/editor': 4.2.1(@types/node@22.10.5)
+ '@inquirer/expand': 4.0.4(@types/node@22.10.5)
+ '@inquirer/input': 4.1.1(@types/node@22.10.5)
+ '@inquirer/number': 3.0.4(@types/node@22.10.5)
+ '@inquirer/password': 4.0.4(@types/node@22.10.5)
+ '@inquirer/rawlist': 4.0.4(@types/node@22.10.5)
+ '@inquirer/search': 3.0.4(@types/node@22.10.5)
+ '@inquirer/select': 4.0.4(@types/node@22.10.5)
+ '@types/node': 22.10.5
+
+ '@inquirer/rawlist@4.0.4(@types/node@22.10.5)':
+ dependencies:
+ '@inquirer/core': 10.1.2(@types/node@22.10.5)
+ '@inquirer/type': 3.0.2(@types/node@22.10.5)
+ '@types/node': 22.10.5
+ yoctocolors-cjs: 2.1.2
+
+ '@inquirer/search@3.0.4(@types/node@22.10.5)':
+ dependencies:
+ '@inquirer/core': 10.1.2(@types/node@22.10.5)
+ '@inquirer/figures': 1.0.9
+ '@inquirer/type': 3.0.2(@types/node@22.10.5)
+ '@types/node': 22.10.5
+ yoctocolors-cjs: 2.1.2
+
+ '@inquirer/select@4.0.4(@types/node@22.10.5)':
+ dependencies:
+ '@inquirer/core': 10.1.2(@types/node@22.10.5)
+ '@inquirer/figures': 1.0.9
+ '@inquirer/type': 3.0.2(@types/node@22.10.5)
+ '@types/node': 22.10.5
+ ansi-escapes: 4.3.2
+ yoctocolors-cjs: 2.1.2
+
+ '@inquirer/type@3.0.2(@types/node@22.10.5)':
+ dependencies:
+ '@types/node': 22.10.5
+
+ '@intlify/bundle-utils@10.0.0(vue-i18n@11.0.1(vue@3.5.13(typescript@5.7.3)))':
+ dependencies:
+ '@intlify/message-compiler': 11.0.0-rc.1
+ '@intlify/shared': 11.0.0-rc.1
+ acorn: 8.14.0
+ escodegen: 2.1.0
+ estree-walker: 2.0.2
+ jsonc-eslint-parser: 2.4.0
+ mlly: 1.7.3
+ source-map-js: 1.2.1
+ yaml-eslint-parser: 1.2.3
+ optionalDependencies:
+ vue-i18n: 11.0.1(vue@3.5.13(typescript@5.7.3))
+
+ '@intlify/core-base@11.0.1':
+ dependencies:
+ '@intlify/message-compiler': 11.0.1
+ '@intlify/shared': 11.0.1
+
+ '@intlify/message-compiler@11.0.0-rc.1':
+ dependencies:
+ '@intlify/shared': 11.0.0-rc.1
+ source-map-js: 1.2.1
+
+ '@intlify/message-compiler@11.0.1':
+ dependencies:
+ '@intlify/shared': 11.0.1
+ source-map-js: 1.2.1
+
+ '@intlify/shared@11.0.0-rc.1': {}
+
+ '@intlify/shared@11.0.1': {}
+
+ '@intlify/unplugin-vue-i18n@6.0.3(@vue/compiler-dom@3.5.13)(eslint@9.17.0(jiti@2.4.2))(rollup@4.30.1)(typescript@5.7.3)(vue-i18n@11.0.1(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3))':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.2))
+ '@intlify/bundle-utils': 10.0.0(vue-i18n@11.0.1(vue@3.5.13(typescript@5.7.3)))
+ '@intlify/shared': 11.0.1
+ '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.0.1)(@vue/compiler-dom@3.5.13)(vue-i18n@11.0.1(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3))
+ '@rollup/pluginutils': 5.1.4(rollup@4.30.1)
+ '@typescript-eslint/scope-manager': 8.19.1
+ '@typescript-eslint/typescript-estree': 8.19.1(typescript@5.7.3)
+ debug: 4.4.0
+ fast-glob: 3.3.3
+ js-yaml: 4.1.0
+ json5: 2.2.3
+ pathe: 1.1.2
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+ unplugin: 1.16.1
+ vue: 3.5.13(typescript@5.7.3)
+ optionalDependencies:
+ vue-i18n: 11.0.1(vue@3.5.13(typescript@5.7.3))
+ transitivePeerDependencies:
+ - '@vue/compiler-dom'
+ - eslint
+ - rollup
+ - supports-color
+ - typescript
+
+ '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.0.1)(@vue/compiler-dom@3.5.13)(vue-i18n@11.0.1(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3))':
+ dependencies:
+ '@babel/parser': 7.26.3
+ optionalDependencies:
+ '@intlify/shared': 11.0.1
+ '@vue/compiler-dom': 3.5.13
+ vue: 3.5.13(typescript@5.7.3)
+ vue-i18n: 11.0.1(vue@3.5.13(typescript@5.7.3))
+
+ '@isaacs/cliui@8.0.2':
+ dependencies:
+ string-width: 5.1.2
+ string-width-cjs: string-width@4.2.3
+ strip-ansi: 7.1.0
+ 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.8':
+ dependencies:
+ '@jridgewell/set-array': 1.2.1
+ '@jridgewell/sourcemap-codec': 1.5.0
+ '@jridgewell/trace-mapping': 0.3.25
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/set-array@1.2.1': {}
+
+ '@jridgewell/source-map@0.3.6':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.8
+ '@jridgewell/trace-mapping': 0.3.25
+
+ '@jridgewell/sourcemap-codec@1.5.0': {}
+
+ '@jridgewell/trace-mapping@0.3.25':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.0
+
+ '@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.18.0
+
+ '@nuxt/kit@3.15.1(rollup@4.30.1)':
+ dependencies:
+ '@nuxt/schema': 3.15.1
+ c12: 2.0.1
+ consola: 3.3.3
+ defu: 6.1.4
+ destr: 2.0.3
+ globby: 14.0.2
+ ignore: 7.0.0
+ jiti: 2.4.2
+ klona: 2.0.6
+ knitwork: 1.2.0
+ mlly: 1.7.3
+ ohash: 1.1.4
+ pathe: 2.0.0
+ pkg-types: 1.3.0
+ scule: 1.3.0
+ semver: 7.6.3
+ ufo: 1.5.4
+ unctx: 2.4.1
+ unimport: 3.14.5(rollup@4.30.1)
+ untyped: 1.5.2
+ transitivePeerDependencies:
+ - magicast
+ - rollup
+ - supports-color
+
+ '@nuxt/schema@3.15.1':
+ dependencies:
+ consola: 3.3.3
+ defu: 6.1.4
+ pathe: 2.0.0
+ std-env: 3.8.0
+
+ '@pkgr/core@0.1.1': {}
+
+ '@polka/url@1.0.0-next.28': {}
+
+ '@purge-icons/core@0.10.0':
+ dependencies:
+ '@iconify/iconify': 2.1.2
+ axios: 0.26.1(debug@4.4.0)
+ debug: 4.4.0
+ fast-glob: 3.3.3
+ fs-extra: 10.1.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@purge-icons/generated@0.10.0':
+ dependencies:
+ '@iconify/iconify': 3.1.1
+
+ '@rollup/plugin-node-resolve@13.3.0(rollup@4.30.1)':
+ dependencies:
+ '@rollup/pluginutils': 3.1.0(rollup@4.30.1)
+ '@types/resolve': 1.17.1
+ deepmerge: 4.3.1
+ is-builtin-module: 3.2.1
+ is-module: 1.0.0
+ resolve: 1.22.10
+ rollup: 4.30.1
+
+ '@rollup/pluginutils@3.1.0(rollup@4.30.1)':
+ dependencies:
+ '@types/estree': 0.0.39
+ estree-walker: 1.0.1
+ picomatch: 2.3.1
+ rollup: 4.30.1
+
+ '@rollup/pluginutils@4.2.1':
+ dependencies:
+ estree-walker: 2.0.2
+ picomatch: 2.3.1
+
+ '@rollup/pluginutils@5.1.4(rollup@4.30.1)':
+ dependencies:
+ '@types/estree': 1.0.6
+ estree-walker: 2.0.2
+ picomatch: 4.0.2
+ optionalDependencies:
+ rollup: 4.30.1
+
+ '@rollup/rollup-android-arm-eabi@4.30.1':
+ optional: true
+
+ '@rollup/rollup-android-arm64@4.30.1':
+ optional: true
+
+ '@rollup/rollup-darwin-arm64@4.30.1':
+ optional: true
+
+ '@rollup/rollup-darwin-x64@4.30.1':
+ optional: true
+
+ '@rollup/rollup-freebsd-arm64@4.30.1':
+ optional: true
+
+ '@rollup/rollup-freebsd-x64@4.30.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.30.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm-musleabihf@4.30.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-gnu@4.30.1':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-musl@4.30.1':
+ optional: true
+
+ '@rollup/rollup-linux-loongarch64-gnu@4.30.1':
+ optional: true
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.30.1':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-gnu@4.30.1':
+ optional: true
+
+ '@rollup/rollup-linux-s390x-gnu@4.30.1':
+ optional: true
+
+ '@rollup/rollup-linux-x64-gnu@4.30.1':
+ optional: true
+
+ '@rollup/rollup-linux-x64-musl@4.30.1':
+ optional: true
+
+ '@rollup/rollup-win32-arm64-msvc@4.30.1':
+ optional: true
+
+ '@rollup/rollup-win32-ia32-msvc@4.30.1':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.30.1':
+ optional: true
+
+ '@sindresorhus/merge-streams@2.3.0': {}
+
+ '@sxzz/popperjs-es@2.11.7': {}
+
+ '@transloadit/prettier-bytes@0.0.7': {}
+
+ '@trysound/sax@0.2.0': {}
+
+ '@types/conventional-commits-parser@5.0.1':
+ dependencies:
+ '@types/node': 22.10.5
+
+ '@types/eslint@8.56.12':
+ dependencies:
+ '@types/estree': 1.0.6
+ '@types/json-schema': 7.0.15
+
+ '@types/estree@0.0.39': {}
+
+ '@types/estree@1.0.6': {}
+
+ '@types/event-emitter@0.3.5': {}
+
+ '@types/fined@1.1.5': {}
+
+ '@types/fs-extra@11.0.4':
+ dependencies:
+ '@types/jsonfile': 6.1.4
+ '@types/node': 22.10.5
+
+ '@types/inquirer@9.0.7':
+ dependencies:
+ '@types/through': 0.0.33
+ rxjs: 7.8.1
+
+ '@types/json-schema@7.0.15': {}
+
+ '@types/jsonfile@6.1.4':
+ dependencies:
+ '@types/node': 22.10.5
+
+ '@types/liftoff@4.0.3':
+ dependencies:
+ '@types/fined': 1.1.5
+ '@types/node': 22.10.5
+
+ '@types/lodash-es@4.17.12':
+ dependencies:
+ '@types/lodash': 4.17.14
+
+ '@types/lodash@4.17.14': {}
+
+ '@types/mockjs@1.0.10': {}
+
+ '@types/node@10.17.60': {}
+
+ '@types/node@22.10.5':
+ dependencies:
+ undici-types: 6.20.0
+
+ '@types/nprogress@0.2.3': {}
+
+ '@types/qrcode@1.5.5':
+ dependencies:
+ '@types/node': 22.10.5
+
+ '@types/qs@6.9.17': {}
+
+ '@types/resolve@1.17.1':
+ dependencies:
+ '@types/node': 22.10.5
+
+ '@types/sortablejs@1.15.8': {}
+
+ '@types/svgo@2.6.4':
+ dependencies:
+ '@types/node': 22.10.5
+
+ '@types/through@0.0.33':
+ dependencies:
+ '@types/node': 22.10.5
+
+ '@types/web-bluetooth@0.0.16': {}
+
+ '@types/web-bluetooth@0.0.20': {}
+
+ '@typescript-eslint/eslint-plugin@8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3)':
+ dependencies:
+ '@eslint-community/regexpp': 4.12.1
+ '@typescript-eslint/parser': 8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3)
+ '@typescript-eslint/scope-manager': 8.19.1
+ '@typescript-eslint/type-utils': 8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3)
+ '@typescript-eslint/utils': 8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3)
+ '@typescript-eslint/visitor-keys': 8.19.1
+ eslint: 9.17.0(jiti@2.4.2)
+ graphemer: 1.4.0
+ ignore: 5.3.2
+ natural-compare: 1.4.0
+ ts-api-utils: 2.0.0(typescript@5.7.3)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 8.19.1
+ '@typescript-eslint/types': 8.19.1
+ '@typescript-eslint/typescript-estree': 8.19.1(typescript@5.7.3)
+ '@typescript-eslint/visitor-keys': 8.19.1
+ debug: 4.4.0
+ eslint: 9.17.0(jiti@2.4.2)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/scope-manager@8.19.1':
+ dependencies:
+ '@typescript-eslint/types': 8.19.1
+ '@typescript-eslint/visitor-keys': 8.19.1
+
+ '@typescript-eslint/type-utils@8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3)':
+ dependencies:
+ '@typescript-eslint/typescript-estree': 8.19.1(typescript@5.7.3)
+ '@typescript-eslint/utils': 8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3)
+ debug: 4.4.0
+ eslint: 9.17.0(jiti@2.4.2)
+ ts-api-utils: 2.0.0(typescript@5.7.3)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/types@8.19.1': {}
+
+ '@typescript-eslint/typescript-estree@8.19.1(typescript@5.7.3)':
+ dependencies:
+ '@typescript-eslint/types': 8.19.1
+ '@typescript-eslint/visitor-keys': 8.19.1
+ debug: 4.4.0
+ fast-glob: 3.3.3
+ is-glob: 4.0.3
+ minimatch: 9.0.5
+ semver: 7.6.3
+ ts-api-utils: 2.0.0(typescript@5.7.3)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/utils@8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.2))
+ '@typescript-eslint/scope-manager': 8.19.1
+ '@typescript-eslint/types': 8.19.1
+ '@typescript-eslint/typescript-estree': 8.19.1(typescript@5.7.3)
+ eslint: 9.17.0(jiti@2.4.2)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/visitor-keys@8.19.1':
+ dependencies:
+ '@typescript-eslint/types': 8.19.1
+ eslint-visitor-keys: 4.2.0
+
+ '@unocss/astro@0.65.4(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))':
+ dependencies:
+ '@unocss/core': 0.65.4
+ '@unocss/reset': 0.65.4
+ '@unocss/vite': 0.65.4(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))
+ optionalDependencies:
+ vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)
+ transitivePeerDependencies:
+ - rollup
+ - supports-color
+ - vue
+
+ '@unocss/cli@0.65.4(rollup@4.30.1)':
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@rollup/pluginutils': 5.1.4(rollup@4.30.1)
+ '@unocss/config': 0.65.4
+ '@unocss/core': 0.65.4
+ '@unocss/preset-uno': 0.65.4
+ cac: 6.7.14
+ chokidar: 3.6.0
+ colorette: 2.0.20
+ consola: 3.3.3
+ magic-string: 0.30.17
+ pathe: 1.1.2
+ perfect-debounce: 1.0.0
+ tinyglobby: 0.2.10
+ transitivePeerDependencies:
+ - rollup
+ - supports-color
+
+ '@unocss/config@0.65.4':
+ dependencies:
+ '@unocss/core': 0.65.4
+ unconfig: 0.6.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@unocss/core@0.65.4': {}
+
+ '@unocss/extractor-arbitrary-variants@0.65.4':
+ dependencies:
+ '@unocss/core': 0.65.4
+
+ '@unocss/inspector@0.65.4(vue@3.5.13(typescript@5.7.3))':
+ dependencies:
+ '@unocss/core': 0.65.4
+ '@unocss/rule-utils': 0.65.4
+ colorette: 2.0.20
+ gzip-size: 6.0.0
+ sirv: 3.0.0
+ vue-flow-layout: 0.1.1(vue@3.5.13(typescript@5.7.3))
+ transitivePeerDependencies:
+ - vue
+
+ '@unocss/postcss@0.65.4(postcss@8.4.49)':
+ dependencies:
+ '@unocss/config': 0.65.4
+ '@unocss/core': 0.65.4
+ '@unocss/rule-utils': 0.65.4
+ css-tree: 3.1.0
+ postcss: 8.4.49
+ tinyglobby: 0.2.10
+ transitivePeerDependencies:
+ - supports-color
+
+ '@unocss/preset-attributify@0.65.4':
+ dependencies:
+ '@unocss/core': 0.65.4
+
+ '@unocss/preset-icons@0.65.4':
+ dependencies:
+ '@iconify/utils': 2.2.1
+ '@unocss/core': 0.65.4
+ ofetch: 1.4.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@unocss/preset-mini@0.65.4':
+ dependencies:
+ '@unocss/core': 0.65.4
+ '@unocss/extractor-arbitrary-variants': 0.65.4
+ '@unocss/rule-utils': 0.65.4
+
+ '@unocss/preset-tagify@0.65.4':
+ dependencies:
+ '@unocss/core': 0.65.4
+
+ '@unocss/preset-typography@0.65.4':
+ dependencies:
+ '@unocss/core': 0.65.4
+ '@unocss/preset-mini': 0.65.4
+
+ '@unocss/preset-uno@0.65.4':
+ dependencies:
+ '@unocss/core': 0.65.4
+ '@unocss/preset-mini': 0.65.4
+ '@unocss/preset-wind': 0.65.4
+ '@unocss/rule-utils': 0.65.4
+
+ '@unocss/preset-web-fonts@0.65.4':
+ dependencies:
+ '@unocss/core': 0.65.4
+ ofetch: 1.4.1
+
+ '@unocss/preset-wind@0.65.4':
+ dependencies:
+ '@unocss/core': 0.65.4
+ '@unocss/preset-mini': 0.65.4
+ '@unocss/rule-utils': 0.65.4
+
+ '@unocss/reset@0.65.4': {}
+
+ '@unocss/rule-utils@0.65.4':
+ dependencies:
+ '@unocss/core': 0.65.4
+ magic-string: 0.30.17
+
+ '@unocss/transformer-attributify-jsx@0.65.4':
+ dependencies:
+ '@unocss/core': 0.65.4
+
+ '@unocss/transformer-compile-class@0.65.4':
+ dependencies:
+ '@unocss/core': 0.65.4
+
+ '@unocss/transformer-directives@0.65.4':
+ dependencies:
+ '@unocss/core': 0.65.4
+ '@unocss/rule-utils': 0.65.4
+ css-tree: 3.1.0
+
+ '@unocss/transformer-variant-group@0.65.4':
+ dependencies:
+ '@unocss/core': 0.65.4
+
+ '@unocss/vite@0.65.4(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))':
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@rollup/pluginutils': 5.1.4(rollup@4.30.1)
+ '@unocss/config': 0.65.4
+ '@unocss/core': 0.65.4
+ '@unocss/inspector': 0.65.4(vue@3.5.13(typescript@5.7.3))
+ chokidar: 3.6.0
+ magic-string: 0.30.17
+ tinyglobby: 0.2.10
+ vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)
+ transitivePeerDependencies:
+ - rollup
+ - supports-color
+ - vue
+
+ '@uppy/companion-client@2.2.2':
+ dependencies:
+ '@uppy/utils': 4.1.3
+ namespace-emitter: 2.0.1
+
+ '@uppy/core@2.3.4':
+ dependencies:
+ '@transloadit/prettier-bytes': 0.0.7
+ '@uppy/store-default': 2.1.1
+ '@uppy/utils': 4.1.3
+ lodash.throttle: 4.1.1
+ mime-match: 1.0.2
+ namespace-emitter: 2.0.1
+ nanoid: 3.3.8
+ preact: 10.25.4
+
+ '@uppy/store-default@2.1.1': {}
+
+ '@uppy/utils@4.1.3':
+ dependencies:
+ lodash.throttle: 4.1.1
+
+ '@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4)':
+ dependencies:
+ '@uppy/companion-client': 2.2.2
+ '@uppy/core': 2.3.4
+ '@uppy/utils': 4.1.3
+ nanoid: 3.3.8
+
+ '@vitejs/plugin-legacy@6.0.0(terser@5.37.0)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/preset-env': 7.26.0(@babel/core@7.26.0)
+ browserslist: 4.24.4
+ browserslist-to-esbuild: 2.1.1(browserslist@4.24.4)
+ core-js: 3.40.0
+ magic-string: 0.30.17
+ regenerator-runtime: 0.14.1
+ systemjs: 6.15.1
+ terser: 5.37.0
+ vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@vitejs/plugin-vue-jsx@4.1.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/plugin-transform-typescript': 7.26.3(@babel/core@7.26.0)
+ '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.0)
+ vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)
+ vue: 3.5.13(typescript@5.7.3)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@vitejs/plugin-vue@5.2.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))':
+ dependencies:
+ vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)
+ vue: 3.5.13(typescript@5.7.3)
+
+ '@volar/language-core@2.4.11':
+ dependencies:
+ '@volar/source-map': 2.4.11
+
+ '@volar/source-map@2.4.11': {}
+
+ '@volar/typescript@2.4.11':
+ dependencies:
+ '@volar/language-core': 2.4.11
+ path-browserify: 1.0.1
+ vscode-uri: 3.0.8
+
+ '@vue/babel-helper-vue-transform-on@1.2.5': {}
+
+ '@vue/babel-plugin-jsx@1.2.5(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/helper-module-imports': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0)
+ '@babel/template': 7.25.9
+ '@babel/traverse': 7.26.4
+ '@babel/types': 7.26.3
+ '@vue/babel-helper-vue-transform-on': 1.2.5
+ '@vue/babel-plugin-resolve-type': 1.2.5(@babel/core@7.26.0)
+ html-tags: 3.3.1
+ svg-tags: 1.0.0
+ optionalDependencies:
+ '@babel/core': 7.26.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@vue/babel-plugin-resolve-type@1.2.5(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ '@babel/core': 7.26.0
+ '@babel/helper-module-imports': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/parser': 7.26.3
+ '@vue/compiler-sfc': 3.5.13
+ transitivePeerDependencies:
+ - supports-color
+
+ '@vue/compiler-core@3.5.13':
+ dependencies:
+ '@babel/parser': 7.26.3
+ '@vue/shared': 3.5.13
+ entities: 4.5.0
+ estree-walker: 2.0.2
+ source-map-js: 1.2.1
+
+ '@vue/compiler-dom@3.5.13':
+ dependencies:
+ '@vue/compiler-core': 3.5.13
+ '@vue/shared': 3.5.13
+
+ '@vue/compiler-sfc@3.5.13':
+ dependencies:
+ '@babel/parser': 7.26.3
+ '@vue/compiler-core': 3.5.13
+ '@vue/compiler-dom': 3.5.13
+ '@vue/compiler-ssr': 3.5.13
+ '@vue/shared': 3.5.13
+ estree-walker: 2.0.2
+ magic-string: 0.30.17
+ postcss: 8.4.49
+ source-map-js: 1.2.1
+
+ '@vue/compiler-ssr@3.5.13':
+ dependencies:
+ '@vue/compiler-dom': 3.5.13
+ '@vue/shared': 3.5.13
+
+ '@vue/compiler-vue2@2.7.16':
+ dependencies:
+ de-indent: 1.0.2
+ he: 1.2.0
+
+ '@vue/devtools-api@6.6.4': {}
+
+ '@vue/language-core@2.2.0(typescript@5.7.3)':
+ dependencies:
+ '@volar/language-core': 2.4.11
+ '@vue/compiler-dom': 3.5.13
+ '@vue/compiler-vue2': 2.7.16
+ '@vue/shared': 3.5.13
+ alien-signals: 0.4.14
+ minimatch: 9.0.5
+ muggle-string: 0.4.1
+ path-browserify: 1.0.1
+ optionalDependencies:
+ typescript: 5.7.3
+
+ '@vue/reactivity@3.5.13':
+ dependencies:
+ '@vue/shared': 3.5.13
+
+ '@vue/runtime-core@3.5.13':
+ dependencies:
+ '@vue/reactivity': 3.5.13
+ '@vue/shared': 3.5.13
+
+ '@vue/runtime-dom@3.5.13':
+ dependencies:
+ '@vue/reactivity': 3.5.13
+ '@vue/runtime-core': 3.5.13
+ '@vue/shared': 3.5.13
+ csstype: 3.1.3
+
+ '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.7.3))':
+ dependencies:
+ '@vue/compiler-ssr': 3.5.13
+ '@vue/shared': 3.5.13
+ vue: 3.5.13(typescript@5.7.3)
+
+ '@vue/shared@3.5.13': {}
+
+ '@vueuse/core@12.3.0(typescript@5.7.3)':
+ dependencies:
+ '@types/web-bluetooth': 0.0.20
+ '@vueuse/metadata': 12.3.0
+ '@vueuse/shared': 12.3.0(typescript@5.7.3)
+ vue: 3.5.13(typescript@5.7.3)
+ transitivePeerDependencies:
+ - typescript
+
+ '@vueuse/core@9.13.0(vue@3.5.13(typescript@5.7.3))':
+ dependencies:
+ '@types/web-bluetooth': 0.0.16
+ '@vueuse/metadata': 9.13.0
+ '@vueuse/shared': 9.13.0(vue@3.5.13(typescript@5.7.3))
+ vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3))
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - vue
+
+ '@vueuse/metadata@12.3.0': {}
+
+ '@vueuse/metadata@9.13.0': {}
+
+ '@vueuse/shared@12.3.0(typescript@5.7.3)':
+ dependencies:
+ vue: 3.5.13(typescript@5.7.3)
+ transitivePeerDependencies:
+ - typescript
+
+ '@vueuse/shared@9.13.0(vue@3.5.13(typescript@5.7.3))':
+ dependencies:
+ vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3))
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - vue
+
+ '@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)':
+ dependencies:
+ '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)
+ dom7: 3.0.0
+ is-url: 1.2.4
+ lodash.throttle: 4.1.1
+ nanoid: 3.3.8
+ slate: 0.72.8
+ snabbdom: 3.6.2
+
+ '@wangeditor/code-highlight@1.0.3(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2)':
+ dependencies:
+ '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)
+ dom7: 3.0.0
+ prismjs: 1.29.0
+ slate: 0.72.8
+ snabbdom: 3.6.2
+
+ '@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)':
+ dependencies:
+ '@types/event-emitter': 0.3.5
+ '@uppy/core': 2.3.4
+ '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4)
+ dom7: 3.0.0
+ event-emitter: 0.3.5
+ html-void-elements: 2.0.1
+ i18next: 20.6.1
+ is-hotkey: 0.2.0
+ lodash.camelcase: 4.3.0
+ lodash.clonedeep: 4.5.0
+ lodash.debounce: 4.0.8
+ lodash.foreach: 4.5.0
+ lodash.isequal: 4.5.0
+ lodash.throttle: 4.1.1
+ lodash.toarray: 4.4.0
+ nanoid: 3.3.8
+ scroll-into-view-if-needed: 2.2.31
+ slate: 0.72.8
+ slate-history: 0.66.0(slate@0.72.8)
+ snabbdom: 3.6.2
+
+ '@wangeditor/editor-for-vue@5.1.12(@wangeditor/editor@5.1.23)(vue@3.5.13(typescript@5.7.3))':
+ dependencies:
+ '@wangeditor/editor': 5.1.23
+ vue: 3.5.13(typescript@5.7.3)
+
+ '@wangeditor/editor@5.1.23':
+ dependencies:
+ '@uppy/core': 2.3.4
+ '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4)
+ '@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)
+ '@wangeditor/code-highlight': 1.0.3(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2)
+ '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)
+ '@wangeditor/list-module': 1.0.5(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2)
+ '@wangeditor/table-module': 1.1.4(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)
+ '@wangeditor/upload-image-module': 1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.6.2)
+ '@wangeditor/video-module': 1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)
+ dom7: 3.0.0
+ is-hotkey: 0.2.0
+ lodash.camelcase: 4.3.0
+ lodash.clonedeep: 4.5.0
+ lodash.debounce: 4.0.8
+ lodash.foreach: 4.5.0
+ lodash.isequal: 4.5.0
+ lodash.throttle: 4.1.1
+ lodash.toarray: 4.4.0
+ nanoid: 3.3.8
+ slate: 0.72.8
+ snabbdom: 3.6.2
+
+ '@wangeditor/list-module@1.0.5(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2)':
+ dependencies:
+ '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)
+ dom7: 3.0.0
+ slate: 0.72.8
+ snabbdom: 3.6.2
+
+ '@wangeditor/table-module@1.1.4(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)':
+ dependencies:
+ '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)
+ dom7: 3.0.0
+ lodash.isequal: 4.5.0
+ lodash.throttle: 4.1.1
+ nanoid: 3.3.8
+ slate: 0.72.8
+ snabbdom: 3.6.2
+
+ '@wangeditor/upload-image-module@1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.6.2)':
+ dependencies:
+ '@uppy/core': 2.3.4
+ '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4)
+ '@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)
+ '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)
+ dom7: 3.0.0
+ lodash.foreach: 4.5.0
+ slate: 0.72.8
+ snabbdom: 3.6.2
+
+ '@wangeditor/video-module@1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)':
+ dependencies:
+ '@uppy/core': 2.3.4
+ '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4)
+ '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.8)(slate@0.72.8)(snabbdom@3.6.2)
+ dom7: 3.0.0
+ nanoid: 3.3.8
+ slate: 0.72.8
+ snabbdom: 3.6.2
+
+ '@zxcvbn-ts/core@3.0.4':
+ dependencies:
+ fastest-levenshtein: 1.0.16
+
+ JSONStream@1.3.5:
+ dependencies:
+ jsonparse: 1.3.1
+ through: 2.3.8
+
+ acorn-jsx@5.3.2(acorn@8.14.0):
+ dependencies:
+ acorn: 8.14.0
+
+ acorn@8.14.0: {}
+
+ aggregate-error@4.0.1:
+ dependencies:
+ clean-stack: 4.2.0
+ indent-string: 5.0.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
+
+ ajv@8.17.1:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-uri: 3.0.5
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+
+ alien-signals@0.4.14: {}
+
+ animate.css@4.1.1: {}
+
+ ansi-escapes@4.3.2:
+ dependencies:
+ type-fest: 0.21.3
+
+ ansi-escapes@7.0.0:
+ dependencies:
+ environment: 1.1.0
+
+ ansi-regex@2.1.1: {}
+
+ ansi-regex@5.0.1: {}
+
+ ansi-regex@6.1.0: {}
+
+ ansi-styles@2.2.1: {}
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ ansi-styles@6.2.1: {}
+
+ anymatch@3.1.3:
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+
+ argparse@2.0.1: {}
+
+ 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.3
+ is-array-buffer: 3.0.5
+
+ array-each@1.0.1: {}
+
+ array-ify@1.0.0: {}
+
+ array-slice@1.1.0: {}
+
+ array-union@2.1.0: {}
+
+ 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.23.9
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.7
+ is-array-buffer: 3.0.5
+
+ assign-symbols@1.0.0: {}
+
+ astral-regex@2.0.0: {}
+
+ async-validator@4.2.5: {}
+
+ async@3.2.6: {}
+
+ asynckit@0.4.0: {}
+
+ atob@2.1.2: {}
+
+ autoprefixer@10.4.20(postcss@8.4.49):
+ dependencies:
+ browserslist: 4.24.4
+ caniuse-lite: 1.0.30001690
+ fraction.js: 4.3.7
+ normalize-range: 0.1.2
+ picocolors: 1.1.1
+ postcss: 8.4.49
+ postcss-value-parser: 4.2.0
+
+ available-typed-arrays@1.0.7:
+ dependencies:
+ possible-typed-array-names: 1.0.0
+
+ axios@0.26.1(debug@4.4.0):
+ dependencies:
+ follow-redirects: 1.15.9(debug@4.4.0)
+ transitivePeerDependencies:
+ - debug
+
+ axios@1.7.9:
+ dependencies:
+ follow-redirects: 1.15.9(debug@4.4.0)
+ form-data: 4.0.1
+ proxy-from-env: 1.1.0
+ transitivePeerDependencies:
+ - debug
+
+ babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.0):
+ dependencies:
+ '@babel/compat-data': 7.26.3
+ '@babel/core': 7.26.0
+ '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0)
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.26.0):
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0)
+ core-js-compat: 3.40.0
+ transitivePeerDependencies:
+ - supports-color
+
+ babel-plugin-polyfill-regenerator@0.6.3(@babel/core@7.26.0):
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ balanced-match@1.0.2: {}
+
+ balanced-match@2.0.0: {}
+
+ base64-js@1.5.1: {}
+
+ 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
+
+ big.js@5.2.2: {}
+
+ binary-extensions@2.3.0: {}
+
+ bl@4.1.0:
+ dependencies:
+ buffer: 5.7.1
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+
+ bluebird@3.7.2: {}
+
+ boolbase@1.0.0: {}
+
+ brace-expansion@1.1.11:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ brace-expansion@2.0.1:
+ 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-to-esbuild@2.1.1(browserslist@4.24.4):
+ dependencies:
+ browserslist: 4.24.4
+ meow: 13.2.0
+
+ browserslist@4.24.4:
+ dependencies:
+ caniuse-lite: 1.0.30001690
+ electron-to-chromium: 1.5.79
+ node-releases: 2.0.19
+ update-browserslist-db: 1.1.2(browserslist@4.24.4)
+
+ buffer-from@1.1.2: {}
+
+ buffer@5.7.1:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
+ builtin-modules@3.3.0: {}
+
+ bundle-require@5.1.0(esbuild@0.24.2):
+ dependencies:
+ esbuild: 0.24.2
+ load-tsconfig: 0.2.5
+
+ c12@2.0.1:
+ dependencies:
+ chokidar: 4.0.3
+ confbox: 0.1.8
+ defu: 6.1.4
+ dotenv: 16.4.7
+ giget: 1.2.3
+ jiti: 2.4.2
+ mlly: 1.7.3
+ ohash: 1.1.4
+ pathe: 1.1.2
+ perfect-debounce: 1.0.0
+ pkg-types: 1.3.0
+ rc9: 2.1.2
+
+ 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.1:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+
+ call-bind@1.0.8:
+ dependencies:
+ call-bind-apply-helpers: 1.0.1
+ es-define-property: 1.0.1
+ get-intrinsic: 1.2.7
+ set-function-length: 1.2.2
+
+ call-bound@1.0.3:
+ dependencies:
+ call-bind-apply-helpers: 1.0.1
+ get-intrinsic: 1.2.7
+
+ callsites@3.1.0: {}
+
+ camel-case@4.1.2:
+ dependencies:
+ pascal-case: 3.1.2
+ tslib: 2.8.1
+
+ camelcase@5.3.1: {}
+
+ caniuse-lite@1.0.30001690: {}
+
+ capital-case@1.0.4:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.8.1
+ upper-case-first: 2.0.2
+
+ 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
+
+ chalk@5.4.1: {}
+
+ change-case@4.1.2:
+ dependencies:
+ camel-case: 4.1.2
+ capital-case: 1.0.4
+ constant-case: 3.0.4
+ dot-case: 3.0.4
+ header-case: 2.0.4
+ no-case: 3.0.4
+ param-case: 3.0.4
+ pascal-case: 3.1.2
+ path-case: 3.0.4
+ sentence-case: 3.0.4
+ snake-case: 3.0.4
+ tslib: 2.8.1
+
+ chardet@0.7.0: {}
+
+ 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.0.2
+
+ chownr@2.0.0: {}
+
+ citty@0.1.6:
+ dependencies:
+ consola: 3.3.3
+
+ 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-stack@4.2.0:
+ dependencies:
+ escape-string-regexp: 5.0.0
+
+ cli-cursor@3.1.0:
+ dependencies:
+ restore-cursor: 3.1.0
+
+ cli-cursor@5.0.0:
+ dependencies:
+ restore-cursor: 5.1.0
+
+ cli-spinners@2.9.2: {}
+
+ cli-truncate@4.0.0:
+ dependencies:
+ slice-ansi: 5.0.0
+ string-width: 7.2.0
+
+ cli-width@4.1.0: {}
+
+ clipboardy@4.0.0:
+ dependencies:
+ execa: 8.0.1
+ is-wsl: 3.1.0
+ is64bit: 2.0.0
+
+ cliui@6.0.0:
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 6.2.0
+
+ cliui@8.0.1:
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+
+ clone@1.0.4: {}
+
+ 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@12.1.0: {}
+
+ commander@13.0.0: {}
+
+ commander@2.20.3: {}
+
+ commander@7.2.0: {}
+
+ compare-func@2.0.0:
+ dependencies:
+ array-ify: 1.0.0
+ dot-prop: 5.3.0
+
+ component-emitter@1.3.1: {}
+
+ compute-scroll-into-view@1.0.20: {}
+
+ concat-map@0.0.1: {}
+
+ confbox@0.1.8: {}
+
+ connect@3.7.0:
+ dependencies:
+ debug: 2.6.9
+ finalhandler: 1.1.2
+ parseurl: 1.3.3
+ utils-merge: 1.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ consola@3.3.3: {}
+
+ console@0.7.2: {}
+
+ constant-case@3.0.4:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.8.1
+ upper-case: 2.0.2
+
+ conventional-changelog-angular@7.0.0:
+ dependencies:
+ compare-func: 2.0.0
+
+ conventional-changelog-conventionalcommits@7.0.2:
+ dependencies:
+ compare-func: 2.0.0
+
+ conventional-commits-parser@5.0.0:
+ dependencies:
+ JSONStream: 1.3.5
+ is-text-path: 2.0.0
+ meow: 12.1.1
+ split2: 4.2.0
+
+ convert-source-map@2.0.0: {}
+
+ copy-anything@2.0.6:
+ dependencies:
+ is-what: 3.14.1
+
+ copy-descriptor@0.1.1: {}
+
+ core-js-compat@3.40.0:
+ dependencies:
+ browserslist: 4.24.4
+
+ core-js@3.40.0: {}
+
+ cors@2.8.5:
+ dependencies:
+ object-assign: 4.1.1
+ vary: 1.1.2
+
+ cosmiconfig-typescript-loader@6.1.0(@types/node@22.10.5)(cosmiconfig@9.0.0(typescript@5.7.3))(typescript@5.7.3):
+ dependencies:
+ '@types/node': 22.10.5
+ cosmiconfig: 9.0.0(typescript@5.7.3)
+ jiti: 2.4.2
+ typescript: 5.7.3
+
+ cosmiconfig@9.0.0(typescript@5.7.3):
+ dependencies:
+ env-paths: 2.2.1
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ parse-json: 5.2.0
+ optionalDependencies:
+ typescript: 5.7.3
+
+ cropperjs@1.6.2: {}
+
+ cross-fetch@3.2.0:
+ dependencies:
+ node-fetch: 2.7.0
+ transitivePeerDependencies:
+ - encoding
+
+ cross-spawn@7.0.6:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ css-functions-list@3.2.3: {}
+
+ css-select@4.3.0:
+ dependencies:
+ boolbase: 1.0.0
+ css-what: 6.1.0
+ 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.1.0: {}
+
+ cssesc@3.0.0: {}
+
+ csso@4.2.0:
+ dependencies:
+ css-tree: 1.1.3
+
+ csstype@3.1.3: {}
+
+ d@1.0.2:
+ dependencies:
+ es5-ext: 0.10.64
+ type: 2.7.3
+
+ danmu.js@1.1.13:
+ dependencies:
+ event-emitter: 0.3.5
+
+ dargs@8.1.0: {}
+
+ data-view-buffer@1.0.2:
+ dependencies:
+ call-bound: 1.0.3
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ data-view-byte-length@1.0.2:
+ dependencies:
+ call-bound: 1.0.3
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ data-view-byte-offset@1.0.1:
+ dependencies:
+ call-bound: 1.0.3
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ dayjs@1.11.13: {}
+
+ de-indent@1.0.2: {}
+
+ debug@2.6.9:
+ dependencies:
+ ms: 2.0.0
+
+ debug@4.4.0:
+ dependencies:
+ ms: 2.1.3
+
+ decamelize@1.2.0: {}
+
+ decode-uri-component@0.2.2: {}
+
+ deep-is@0.1.4: {}
+
+ deep-pick-omit@1.2.1: {}
+
+ deepmerge@4.3.1: {}
+
+ defaults@1.0.4:
+ dependencies:
+ clone: 1.0.4
+
+ 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@2.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: {}
+
+ del@7.1.0:
+ dependencies:
+ globby: 13.2.2
+ graceful-fs: 4.2.11
+ is-glob: 4.0.3
+ is-path-cwd: 3.0.0
+ is-path-inside: 4.0.0
+ p-map: 5.5.0
+ rimraf: 3.0.2
+ slash: 4.0.0
+
+ delayed-stream@1.0.0: {}
+
+ delegate@3.2.0: {}
+
+ destr@2.0.3: {}
+
+ detect-file@1.0.0: {}
+
+ dijkstrajs@1.0.3: {}
+
+ dir-glob@3.0.1:
+ dependencies:
+ path-type: 4.0.0
+
+ 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
+
+ dom-serializer@2.0.0:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ entities: 4.5.0
+
+ dom7@3.0.0:
+ dependencies:
+ ssr-window: 3.0.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
+
+ domhandler@5.0.3:
+ 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
+
+ domutils@3.2.2:
+ dependencies:
+ dom-serializer: 2.0.0
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+
+ dot-case@3.0.4:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.8.1
+
+ dot-prop@5.3.0:
+ dependencies:
+ is-obj: 2.0.0
+
+ dotenv@16.4.7: {}
+
+ downloadjs@1.4.7: {}
+
+ driver.js@1.3.1: {}
+
+ dunder-proto@1.0.1:
+ dependencies:
+ call-bind-apply-helpers: 1.0.1
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ duplexer@0.1.2: {}
+
+ eastasianwidth@0.2.0: {}
+
+ echarts-wordcloud@2.1.0(echarts@5.6.0):
+ dependencies:
+ echarts: 5.6.0
+
+ echarts@5.6.0:
+ dependencies:
+ tslib: 2.3.0
+ zrender: 5.6.1
+
+ ee-first@1.1.1: {}
+
+ ejs@3.1.10:
+ dependencies:
+ jake: 10.9.2
+
+ electron-to-chromium@1.5.79: {}
+
+ element-plus@2.9.2(vue@3.5.13(typescript@5.7.3)):
+ dependencies:
+ '@ctrl/tinycolor': 3.6.1
+ '@element-plus/icons-vue': 2.3.1(vue@3.5.13(typescript@5.7.3))
+ '@floating-ui/dom': 1.6.13
+ '@popperjs/core': '@sxzz/popperjs-es@2.11.7'
+ '@types/lodash': 4.17.14
+ '@types/lodash-es': 4.17.12
+ '@vueuse/core': 9.13.0(vue@3.5.13(typescript@5.7.3))
+ async-validator: 4.2.5
+ dayjs: 1.11.13
+ escape-html: 1.0.3
+ lodash: 4.17.21
+ lodash-es: 4.17.21
+ lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21)
+ memoize-one: 6.0.0
+ normalize-wheel-es: 1.2.0
+ vue: 3.5.13(typescript@5.7.3)
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+
+ emoji-regex@10.4.0: {}
+
+ emoji-regex@8.0.0: {}
+
+ emoji-regex@9.2.2: {}
+
+ emojis-list@3.0.0: {}
+
+ encodeurl@1.0.2: {}
+
+ entities@1.1.2: {}
+
+ entities@2.2.0: {}
+
+ entities@4.5.0: {}
+
+ env-paths@2.2.1: {}
+
+ environment@1.1.0: {}
+
+ errno@0.1.8:
+ dependencies:
+ prr: 1.0.1
+ optional: true
+
+ error-ex@1.3.2:
+ dependencies:
+ is-arrayish: 0.2.1
+
+ es-abstract@1.23.9:
+ 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.3
+ 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.0.0
+ es-set-tostringtag: 2.1.0
+ es-to-primitive: 1.3.0
+ function.prototype.name: 1.1.8
+ get-intrinsic: 1.2.7
+ 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-regex: 1.2.1
+ is-shared-array-buffer: 1.0.4
+ is-string: 1.1.1
+ is-typed-array: 1.1.15
+ is-weakref: 1.1.0
+ math-intrinsics: 1.1.0
+ object-inspect: 1.13.3
+ 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
+ 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.18
+
+ es-define-property@1.0.1: {}
+
+ es-errors@1.3.0: {}
+
+ es-module-lexer@0.9.3: {}
+
+ es-object-atoms@1.0.0:
+ dependencies:
+ es-errors: 1.3.0
+
+ es-set-tostringtag@2.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.7
+ 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
+
+ es5-ext@0.10.64:
+ dependencies:
+ es6-iterator: 2.0.3
+ es6-symbol: 3.1.4
+ esniff: 2.0.1
+ next-tick: 1.1.0
+
+ es6-iterator@2.0.3:
+ dependencies:
+ d: 1.0.2
+ es5-ext: 0.10.64
+ es6-symbol: 3.1.4
+
+ es6-symbol@3.1.4:
+ dependencies:
+ d: 1.0.2
+ ext: 1.7.0
+
+ esbuild@0.11.3: {}
+
+ esbuild@0.23.1:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.23.1
+ '@esbuild/android-arm': 0.23.1
+ '@esbuild/android-arm64': 0.23.1
+ '@esbuild/android-x64': 0.23.1
+ '@esbuild/darwin-arm64': 0.23.1
+ '@esbuild/darwin-x64': 0.23.1
+ '@esbuild/freebsd-arm64': 0.23.1
+ '@esbuild/freebsd-x64': 0.23.1
+ '@esbuild/linux-arm': 0.23.1
+ '@esbuild/linux-arm64': 0.23.1
+ '@esbuild/linux-ia32': 0.23.1
+ '@esbuild/linux-loong64': 0.23.1
+ '@esbuild/linux-mips64el': 0.23.1
+ '@esbuild/linux-ppc64': 0.23.1
+ '@esbuild/linux-riscv64': 0.23.1
+ '@esbuild/linux-s390x': 0.23.1
+ '@esbuild/linux-x64': 0.23.1
+ '@esbuild/netbsd-x64': 0.23.1
+ '@esbuild/openbsd-arm64': 0.23.1
+ '@esbuild/openbsd-x64': 0.23.1
+ '@esbuild/sunos-x64': 0.23.1
+ '@esbuild/win32-arm64': 0.23.1
+ '@esbuild/win32-ia32': 0.23.1
+ '@esbuild/win32-x64': 0.23.1
+
+ esbuild@0.24.2:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.24.2
+ '@esbuild/android-arm': 0.24.2
+ '@esbuild/android-arm64': 0.24.2
+ '@esbuild/android-x64': 0.24.2
+ '@esbuild/darwin-arm64': 0.24.2
+ '@esbuild/darwin-x64': 0.24.2
+ '@esbuild/freebsd-arm64': 0.24.2
+ '@esbuild/freebsd-x64': 0.24.2
+ '@esbuild/linux-arm': 0.24.2
+ '@esbuild/linux-arm64': 0.24.2
+ '@esbuild/linux-ia32': 0.24.2
+ '@esbuild/linux-loong64': 0.24.2
+ '@esbuild/linux-mips64el': 0.24.2
+ '@esbuild/linux-ppc64': 0.24.2
+ '@esbuild/linux-riscv64': 0.24.2
+ '@esbuild/linux-s390x': 0.24.2
+ '@esbuild/linux-x64': 0.24.2
+ '@esbuild/netbsd-arm64': 0.24.2
+ '@esbuild/netbsd-x64': 0.24.2
+ '@esbuild/openbsd-arm64': 0.24.2
+ '@esbuild/openbsd-x64': 0.24.2
+ '@esbuild/sunos-x64': 0.24.2
+ '@esbuild/win32-arm64': 0.24.2
+ '@esbuild/win32-ia32': 0.24.2
+ '@esbuild/win32-x64': 0.24.2
+
+ escalade@3.2.0: {}
+
+ escape-html@1.0.3: {}
+
+ escape-string-regexp@1.0.5: {}
+
+ escape-string-regexp@4.0.0: {}
+
+ escape-string-regexp@5.0.0: {}
+
+ escodegen@2.1.0:
+ dependencies:
+ esprima: 4.0.1
+ estraverse: 5.3.0
+ esutils: 2.0.3
+ optionalDependencies:
+ source-map: 0.6.1
+
+ eslint-config-prettier@9.1.0(eslint@9.17.0(jiti@2.4.2)):
+ dependencies:
+ eslint: 9.17.0(jiti@2.4.2)
+
+ eslint-define-config@2.1.0: {}
+
+ eslint-plugin-prettier@5.2.1(@types/eslint@8.56.12)(eslint-config-prettier@9.1.0(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2))(prettier@3.4.2):
+ dependencies:
+ eslint: 9.17.0(jiti@2.4.2)
+ prettier: 3.4.2
+ prettier-linter-helpers: 1.0.0
+ synckit: 0.9.2
+ optionalDependencies:
+ '@types/eslint': 8.56.12
+ eslint-config-prettier: 9.1.0(eslint@9.17.0(jiti@2.4.2))
+
+ eslint-plugin-vue@9.32.0(eslint@9.17.0(jiti@2.4.2)):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.2))
+ eslint: 9.17.0(jiti@2.4.2)
+ globals: 13.24.0
+ natural-compare: 1.4.0
+ nth-check: 2.1.1
+ postcss-selector-parser: 6.1.2
+ semver: 7.6.3
+ vue-eslint-parser: 9.4.3(eslint@9.17.0(jiti@2.4.2))
+ xml-name-validator: 4.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-scope@7.2.2:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+
+ eslint-scope@8.2.0:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+
+ eslint-visitor-keys@3.4.3: {}
+
+ eslint-visitor-keys@4.2.0: {}
+
+ eslint@9.17.0(jiti@2.4.2):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.2))
+ '@eslint-community/regexpp': 4.12.1
+ '@eslint/config-array': 0.19.1
+ '@eslint/core': 0.9.1
+ '@eslint/eslintrc': 3.2.0
+ '@eslint/js': 9.17.0
+ '@eslint/plugin-kit': 0.2.4
+ '@humanfs/node': 0.16.6
+ '@humanwhocodes/module-importer': 1.0.1
+ '@humanwhocodes/retry': 0.4.1
+ '@types/estree': 1.0.6
+ '@types/json-schema': 7.0.15
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.6
+ debug: 4.4.0
+ escape-string-regexp: 4.0.0
+ eslint-scope: 8.2.0
+ eslint-visitor-keys: 4.2.0
+ espree: 10.3.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.4.2
+ transitivePeerDependencies:
+ - supports-color
+
+ esniff@2.0.1:
+ dependencies:
+ d: 1.0.2
+ es5-ext: 0.10.64
+ event-emitter: 0.3.5
+ type: 2.7.3
+
+ esno@4.8.0:
+ dependencies:
+ tsx: 4.19.2
+
+ espree@10.3.0:
+ dependencies:
+ acorn: 8.14.0
+ acorn-jsx: 5.3.2(acorn@8.14.0)
+ eslint-visitor-keys: 4.2.0
+
+ espree@9.6.1:
+ dependencies:
+ acorn: 8.14.0
+ acorn-jsx: 5.3.2(acorn@8.14.0)
+ eslint-visitor-keys: 3.4.3
+
+ 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@1.0.1: {}
+
+ estree-walker@2.0.2: {}
+
+ estree-walker@3.0.3:
+ dependencies:
+ '@types/estree': 1.0.6
+
+ esutils@2.0.3: {}
+
+ etag@1.8.1: {}
+
+ event-emitter@0.3.5:
+ dependencies:
+ d: 1.0.2
+ es5-ext: 0.10.64
+
+ eventemitter3@4.0.7: {}
+
+ eventemitter3@5.0.1: {}
+
+ execa@8.0.1:
+ dependencies:
+ cross-spawn: 7.0.6
+ get-stream: 8.0.1
+ human-signals: 5.0.0
+ is-stream: 3.0.0
+ merge-stream: 2.0.0
+ npm-run-path: 5.3.0
+ onetime: 6.0.0
+ signal-exit: 4.1.0
+ strip-final-newline: 3.0.0
+
+ 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
+
+ expand-tilde@2.0.2:
+ dependencies:
+ homedir-polyfill: 1.0.3
+
+ ext@1.7.0:
+ dependencies:
+ type: 2.7.3
+
+ 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
+
+ extend@3.0.2: {}
+
+ external-editor@3.1.0:
+ dependencies:
+ chardet: 0.7.0
+ iconv-lite: 0.4.24
+ tmp: 0.0.33
+
+ 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.3:
+ 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.8
+
+ fast-json-stable-stringify@2.1.0: {}
+
+ fast-levenshtein@2.0.6: {}
+
+ fast-uri@3.0.5: {}
+
+ fastest-levenshtein@1.0.16: {}
+
+ fastq@1.18.0:
+ dependencies:
+ reusify: 1.0.4
+
+ fdir@6.4.2(picomatch@4.0.2):
+ optionalDependencies:
+ picomatch: 4.0.2
+
+ file-entry-cache@8.0.0:
+ dependencies:
+ flat-cache: 4.0.1
+
+ file-entry-cache@9.1.0:
+ dependencies:
+ flat-cache: 5.0.0
+
+ filelist@1.0.4:
+ dependencies:
+ minimatch: 5.1.6
+
+ 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
+
+ finalhandler@1.1.2:
+ dependencies:
+ debug: 2.6.9
+ encodeurl: 1.0.2
+ escape-html: 1.0.3
+ on-finished: 2.3.0
+ parseurl: 1.3.3
+ statuses: 1.5.0
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ find-up@4.1.0:
+ dependencies:
+ locate-path: 5.0.0
+ path-exists: 4.0.0
+
+ find-up@5.0.0:
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+
+ find-up@7.0.0:
+ dependencies:
+ locate-path: 7.2.0
+ path-exists: 5.0.0
+ unicorn-magic: 0.1.0
+
+ findup-sync@5.0.0:
+ dependencies:
+ detect-file: 1.0.0
+ is-glob: 4.0.3
+ micromatch: 4.0.8
+ resolve-dir: 1.0.1
+
+ fined@2.0.0:
+ dependencies:
+ expand-tilde: 2.0.2
+ is-plain-object: 5.0.0
+ object.defaults: 1.1.0
+ object.pick: 1.3.0
+ parse-filepath: 1.0.2
+
+ flagged-respawn@2.0.0: {}
+
+ flat-cache@4.0.1:
+ dependencies:
+ flatted: 3.3.2
+ keyv: 4.5.4
+
+ flat-cache@5.0.0:
+ dependencies:
+ flatted: 3.3.2
+ keyv: 4.5.4
+
+ flatted@3.3.2: {}
+
+ follow-redirects@1.15.9(debug@4.4.0):
+ optionalDependencies:
+ debug: 4.4.0
+
+ for-each@0.3.3:
+ dependencies:
+ is-callable: 1.2.7
+
+ for-in@1.0.2: {}
+
+ for-own@1.0.0:
+ dependencies:
+ for-in: 1.0.2
+
+ foreground-child@3.3.0:
+ dependencies:
+ cross-spawn: 7.0.6
+ signal-exit: 4.1.0
+
+ form-data@4.0.1:
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ mime-types: 2.1.35
+
+ fraction.js@4.3.7: {}
+
+ fragment-cache@0.2.1:
+ dependencies:
+ map-cache: 0.2.2
+
+ fs-extra@10.1.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.1.0
+ universalify: 2.0.1
+
+ fs-extra@11.2.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.1.0
+ universalify: 2.0.1
+
+ fs-minipass@2.1.0:
+ dependencies:
+ minipass: 3.3.6
+
+ fs.realpath@1.0.0: {}
+
+ 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.3
+ 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: {}
+
+ gensync@1.0.0-beta.2: {}
+
+ get-caller-file@2.0.5: {}
+
+ get-east-asian-width@1.3.0: {}
+
+ get-intrinsic@1.2.7:
+ dependencies:
+ call-bind-apply-helpers: 1.0.1
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.0.0
+ 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.0.0
+
+ get-stream@8.0.1: {}
+
+ get-symbol-description@1.1.0:
+ dependencies:
+ call-bound: 1.0.3
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.7
+
+ get-tsconfig@4.8.1:
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+
+ get-value@2.0.6: {}
+
+ giget@1.2.3:
+ dependencies:
+ citty: 0.1.6
+ consola: 3.3.3
+ defu: 6.1.4
+ node-fetch-native: 1.6.4
+ nypm: 0.3.12
+ ohash: 1.1.4
+ pathe: 1.1.2
+ tar: 6.2.1
+
+ git-raw-commits@4.0.0:
+ dependencies:
+ dargs: 8.1.0
+ meow: 12.1.1
+ split2: 4.2.0
+
+ glob-parent@5.1.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob-parent@6.0.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob@11.0.0:
+ dependencies:
+ foreground-child: 3.3.0
+ jackspeak: 4.0.2
+ minimatch: 10.0.1
+ minipass: 7.1.2
+ package-json-from-dist: 1.0.1
+ path-scurry: 2.0.0
+
+ glob@7.2.3:
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+
+ global-directory@4.0.1:
+ dependencies:
+ ini: 4.1.1
+
+ global-modules@1.0.0:
+ dependencies:
+ global-prefix: 1.0.2
+ is-windows: 1.0.2
+ resolve-dir: 1.0.1
+
+ global-modules@2.0.0:
+ dependencies:
+ global-prefix: 3.0.0
+
+ global-prefix@1.0.2:
+ dependencies:
+ expand-tilde: 2.0.2
+ homedir-polyfill: 1.0.3
+ ini: 1.3.8
+ is-windows: 1.0.2
+ which: 1.3.1
+
+ global-prefix@3.0.0:
+ dependencies:
+ ini: 1.3.8
+ kind-of: 6.0.3
+ which: 1.3.1
+
+ globals@11.12.0: {}
+
+ globals@13.24.0:
+ dependencies:
+ type-fest: 0.20.2
+
+ globals@14.0.0: {}
+
+ globals@15.14.0: {}
+
+ globalthis@1.0.4:
+ dependencies:
+ define-properties: 1.2.1
+ gopd: 1.2.0
+
+ globby@11.1.0:
+ dependencies:
+ array-union: 2.1.0
+ dir-glob: 3.0.1
+ fast-glob: 3.3.3
+ ignore: 5.3.2
+ merge2: 1.4.1
+ slash: 3.0.0
+
+ globby@13.2.2:
+ dependencies:
+ dir-glob: 3.0.1
+ fast-glob: 3.3.3
+ ignore: 5.3.2
+ merge2: 1.4.1
+ slash: 4.0.0
+
+ globby@14.0.2:
+ dependencies:
+ '@sindresorhus/merge-streams': 2.3.0
+ fast-glob: 3.3.3
+ ignore: 5.3.2
+ path-type: 5.0.0
+ slash: 5.1.0
+ unicorn-magic: 0.1.0
+
+ globjoin@0.1.4: {}
+
+ gopd@1.2.0: {}
+
+ graceful-fs@4.2.11: {}
+
+ graphemer@1.4.0: {}
+
+ gzip-size@6.0.0:
+ dependencies:
+ duplexer: 0.1.2
+
+ handlebars@4.7.8:
+ dependencies:
+ minimist: 1.2.8
+ neo-async: 2.6.2
+ source-map: 0.6.1
+ wordwrap: 1.0.0
+ optionalDependencies:
+ uglify-js: 3.19.3
+
+ 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: {}
+
+ header-case@2.0.4:
+ dependencies:
+ capital-case: 1.0.4
+ tslib: 2.8.1
+
+ homedir-polyfill@1.0.3:
+ dependencies:
+ parse-passwd: 1.0.0
+
+ html-tags@3.3.1: {}
+
+ html-void-elements@2.0.1: {}
+
+ 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
+
+ htmlparser2@8.0.2:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ domutils: 3.2.2
+ entities: 4.5.0
+
+ human-signals@5.0.0: {}
+
+ husky@9.1.7: {}
+
+ i18next@20.6.1:
+ dependencies:
+ '@babel/runtime': 7.26.0
+
+ iconv-lite@0.4.24:
+ dependencies:
+ safer-buffer: 2.1.2
+
+ iconv-lite@0.6.3:
+ dependencies:
+ safer-buffer: 2.1.2
+ optional: true
+
+ ieee754@1.2.1: {}
+
+ ignore@5.3.2: {}
+
+ ignore@6.0.2: {}
+
+ ignore@7.0.0: {}
+
+ image-size@0.5.5: {}
+
+ immer@9.0.21: {}
+
+ import-fresh@3.3.0:
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ import-meta-resolve@4.1.0: {}
+
+ importx@0.5.1:
+ dependencies:
+ bundle-require: 5.1.0(esbuild@0.24.2)
+ debug: 4.4.0
+ esbuild: 0.24.2
+ jiti: 2.4.2
+ pathe: 1.1.2
+ tsx: 4.19.2
+ transitivePeerDependencies:
+ - supports-color
+
+ imurmurhash@0.1.4: {}
+
+ indent-string@5.0.0: {}
+
+ inflight@1.0.6:
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+
+ inherits@2.0.4: {}
+
+ ini@1.3.8: {}
+
+ ini@4.1.1: {}
+
+ inquirer@12.3.0(@types/node@22.10.5):
+ dependencies:
+ '@inquirer/core': 10.1.2(@types/node@22.10.5)
+ '@inquirer/prompts': 7.2.1(@types/node@22.10.5)
+ '@inquirer/type': 3.0.2(@types/node@22.10.5)
+ '@types/node': 22.10.5
+ ansi-escapes: 4.3.2
+ mute-stream: 2.0.0
+ run-async: 3.0.0
+ rxjs: 7.8.1
+
+ inquirer@9.3.7:
+ dependencies:
+ '@inquirer/figures': 1.0.9
+ ansi-escapes: 4.3.2
+ cli-width: 4.1.0
+ external-editor: 3.1.0
+ mute-stream: 1.0.0
+ ora: 5.4.1
+ run-async: 3.0.0
+ rxjs: 7.8.1
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 6.2.0
+ yoctocolors-cjs: 2.1.2
+
+ internal-slot@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ hasown: 2.0.2
+ side-channel: 1.1.0
+
+ interpret@3.1.1: {}
+
+ is-absolute@1.0.0:
+ dependencies:
+ is-relative: 1.0.0
+ is-windows: 1.0.2
+
+ 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.3
+ get-intrinsic: 1.2.7
+
+ is-arrayish@0.2.1: {}
+
+ is-async-function@2.1.0:
+ dependencies:
+ call-bound: 1.0.3
+ 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.1:
+ dependencies:
+ call-bound: 1.0.3
+ has-tostringtag: 1.0.2
+
+ is-buffer@1.1.6: {}
+
+ is-builtin-module@3.2.1:
+ dependencies:
+ builtin-modules: 3.3.0
+
+ is-callable@1.2.7: {}
+
+ is-core-module@2.16.1:
+ dependencies:
+ hasown: 2.0.2
+
+ is-data-descriptor@1.0.1:
+ dependencies:
+ hasown: 2.0.2
+
+ is-data-view@1.0.2:
+ dependencies:
+ call-bound: 1.0.3
+ get-intrinsic: 1.2.7
+ is-typed-array: 1.1.15
+
+ is-date-object@1.1.0:
+ dependencies:
+ call-bound: 1.0.3
+ 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@2.2.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.3
+
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-fullwidth-code-point@4.0.0: {}
+
+ is-fullwidth-code-point@5.0.0:
+ dependencies:
+ get-east-asian-width: 1.3.0
+
+ is-generator-function@1.1.0:
+ dependencies:
+ call-bound: 1.0.3
+ 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-hotkey@0.2.0: {}
+
+ is-inside-container@1.0.0:
+ dependencies:
+ is-docker: 3.0.0
+
+ is-interactive@1.0.0: {}
+
+ is-interactive@2.0.0: {}
+
+ is-map@2.0.3: {}
+
+ is-module@1.0.0: {}
+
+ is-number-object@1.1.1:
+ dependencies:
+ call-bound: 1.0.3
+ has-tostringtag: 1.0.2
+
+ is-number@3.0.0:
+ dependencies:
+ kind-of: 3.2.2
+
+ is-number@7.0.0: {}
+
+ is-obj@2.0.0: {}
+
+ is-path-cwd@3.0.0: {}
+
+ is-path-inside@4.0.0: {}
+
+ is-plain-obj@1.1.0: {}
+
+ is-plain-object@2.0.4:
+ dependencies:
+ isobject: 3.0.1
+
+ is-plain-object@5.0.0: {}
+
+ is-regex@1.2.1:
+ dependencies:
+ call-bound: 1.0.3
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+
+ is-relative@1.0.0:
+ dependencies:
+ is-unc-path: 1.0.0
+
+ is-set@2.0.3: {}
+
+ is-shared-array-buffer@1.0.4:
+ dependencies:
+ call-bound: 1.0.3
+
+ is-stream@3.0.0: {}
+
+ is-string@1.1.1:
+ dependencies:
+ call-bound: 1.0.3
+ has-tostringtag: 1.0.2
+
+ is-symbol@1.1.1:
+ dependencies:
+ call-bound: 1.0.3
+ has-symbols: 1.1.0
+ safe-regex-test: 1.1.0
+
+ is-text-path@2.0.0:
+ dependencies:
+ text-extensions: 2.4.0
+
+ is-typed-array@1.1.15:
+ dependencies:
+ which-typed-array: 1.1.18
+
+ is-unc-path@1.0.0:
+ dependencies:
+ unc-path-regex: 0.1.2
+
+ is-unicode-supported@0.1.0: {}
+
+ is-unicode-supported@1.3.0: {}
+
+ is-unicode-supported@2.1.0: {}
+
+ is-url@1.2.4: {}
+
+ is-weakmap@2.0.2: {}
+
+ is-weakref@1.1.0:
+ dependencies:
+ call-bound: 1.0.3
+
+ is-weakset@2.0.4:
+ dependencies:
+ call-bound: 1.0.3
+ get-intrinsic: 1.2.7
+
+ is-what@3.14.1: {}
+
+ is-windows@1.0.2: {}
+
+ is-wsl@2.2.0:
+ dependencies:
+ is-docker: 2.2.1
+
+ is-wsl@3.1.0:
+ dependencies:
+ is-inside-container: 1.0.0
+
+ is64bit@2.0.0:
+ dependencies:
+ system-architecture: 0.1.0
+
+ isarray@1.0.0: {}
+
+ isarray@2.0.5: {}
+
+ isbinaryfile@5.0.4: {}
+
+ isexe@2.0.0: {}
+
+ isobject@2.1.0:
+ dependencies:
+ isarray: 1.0.0
+
+ isobject@3.0.1: {}
+
+ jackspeak@4.0.2:
+ dependencies:
+ '@isaacs/cliui': 8.0.2
+
+ jake@10.9.2:
+ dependencies:
+ async: 3.2.6
+ chalk: 4.1.2
+ filelist: 1.0.4
+ minimatch: 3.1.2
+
+ jiti@2.4.2: {}
+
+ js-base64@2.6.4: {}
+
+ js-tokens@4.0.0: {}
+
+ js-tokens@9.0.1: {}
+
+ js-yaml@4.1.0:
+ dependencies:
+ argparse: 2.0.1
+
+ jsesc@3.0.2: {}
+
+ jsesc@3.1.0: {}
+
+ json-buffer@3.0.1: {}
+
+ json-parse-even-better-errors@2.3.1: {}
+
+ json-schema-traverse@0.4.1: {}
+
+ json-schema-traverse@1.0.0: {}
+
+ json-stable-stringify-without-jsonify@1.0.1: {}
+
+ json5@1.0.2:
+ dependencies:
+ minimist: 1.2.8
+
+ json5@2.2.3: {}
+
+ jsonc-eslint-parser@2.4.0:
+ dependencies:
+ acorn: 8.14.0
+ eslint-visitor-keys: 3.4.3
+ espree: 9.6.1
+ semver: 7.6.3
+
+ jsonfile@6.1.0:
+ dependencies:
+ universalify: 2.0.1
+ optionalDependencies:
+ graceful-fs: 4.2.11
+
+ jsonparse@1.3.1: {}
+
+ 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: {}
+
+ klona@2.0.6: {}
+
+ knitwork@1.2.0: {}
+
+ known-css-properties@0.35.0: {}
+
+ kolorist@1.8.0: {}
+
+ less@4.2.1:
+ dependencies:
+ copy-anything: 2.0.6
+ parse-node-version: 1.0.1
+ tslib: 2.8.1
+ optionalDependencies:
+ errno: 0.1.8
+ graceful-fs: 4.2.11
+ image-size: 0.5.5
+ make-dir: 2.1.0
+ mime: 1.6.0
+ needle: 3.3.1
+ source-map: 0.6.1
+
+ levn@0.4.1:
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+
+ liftoff@4.0.0:
+ dependencies:
+ extend: 3.0.2
+ findup-sync: 5.0.0
+ fined: 2.0.0
+ flagged-respawn: 2.0.0
+ is-plain-object: 5.0.0
+ object.map: 1.0.1
+ rechoir: 0.8.0
+ resolve: 1.22.10
+
+ lilconfig@3.1.3: {}
+
+ lines-and-columns@1.2.4: {}
+
+ lint-staged@15.3.0:
+ dependencies:
+ chalk: 5.4.1
+ commander: 12.1.0
+ debug: 4.4.0
+ execa: 8.0.1
+ lilconfig: 3.1.3
+ listr2: 8.2.5
+ micromatch: 4.0.8
+ pidtree: 0.6.0
+ string-argv: 0.3.2
+ yaml: 2.6.1
+ transitivePeerDependencies:
+ - supports-color
+
+ listr2@8.2.5:
+ dependencies:
+ cli-truncate: 4.0.0
+ colorette: 2.0.20
+ eventemitter3: 5.0.1
+ log-update: 6.1.0
+ rfdc: 1.4.1
+ wrap-ansi: 9.0.0
+
+ load-tsconfig@0.2.5: {}
+
+ loader-utils@1.4.2:
+ dependencies:
+ big.js: 5.2.2
+ emojis-list: 3.0.0
+ json5: 1.0.2
+
+ local-pkg@0.5.1:
+ dependencies:
+ mlly: 1.7.3
+ pkg-types: 1.3.0
+
+ locate-path@5.0.0:
+ dependencies:
+ p-locate: 4.1.0
+
+ locate-path@6.0.0:
+ dependencies:
+ p-locate: 5.0.0
+
+ locate-path@7.2.0:
+ dependencies:
+ p-locate: 6.0.0
+
+ lodash-es@4.17.21: {}
+
+ lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21):
+ dependencies:
+ '@types/lodash-es': 4.17.12
+ lodash: 4.17.21
+ lodash-es: 4.17.21
+
+ lodash.camelcase@4.3.0: {}
+
+ lodash.clonedeep@4.5.0: {}
+
+ lodash.debounce@4.0.8: {}
+
+ lodash.foreach@4.5.0: {}
+
+ lodash.get@4.4.2: {}
+
+ lodash.isequal@4.5.0: {}
+
+ lodash.isplainobject@4.0.6: {}
+
+ lodash.kebabcase@4.1.1: {}
+
+ lodash.merge@4.6.2: {}
+
+ lodash.mergewith@4.6.2: {}
+
+ lodash.snakecase@4.1.1: {}
+
+ lodash.startcase@4.4.0: {}
+
+ lodash.throttle@4.1.1: {}
+
+ lodash.toarray@4.4.0: {}
+
+ lodash.truncate@4.4.2: {}
+
+ lodash.uniq@4.5.0: {}
+
+ lodash.upperfirst@4.3.1: {}
+
+ lodash@4.17.21: {}
+
+ log-symbols@4.1.0:
+ dependencies:
+ chalk: 4.1.2
+ is-unicode-supported: 0.1.0
+
+ log-symbols@6.0.0:
+ dependencies:
+ chalk: 5.4.1
+ is-unicode-supported: 1.3.0
+
+ log-update@6.1.0:
+ dependencies:
+ ansi-escapes: 7.0.0
+ cli-cursor: 5.0.0
+ slice-ansi: 7.1.0
+ strip-ansi: 7.1.0
+ wrap-ansi: 9.0.0
+
+ lower-case@2.0.2:
+ dependencies:
+ tslib: 2.8.1
+
+ lru-cache@11.0.2: {}
+
+ lru-cache@5.1.1:
+ dependencies:
+ yallist: 3.1.1
+
+ magic-string@0.25.9:
+ dependencies:
+ sourcemap-codec: 1.4.8
+
+ magic-string@0.30.17:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.0
+
+ make-dir@2.1.0:
+ dependencies:
+ pify: 4.0.1
+ semver: 5.7.2
+ optional: true
+
+ make-iterator@1.0.1:
+ dependencies:
+ kind-of: 6.0.3
+
+ map-cache@0.2.2: {}
+
+ map-visit@1.0.0:
+ dependencies:
+ object-visit: 1.0.1
+
+ math-intrinsics@1.1.0: {}
+
+ mathml-tag-names@2.1.3: {}
+
+ mdn-data@2.0.14: {}
+
+ mdn-data@2.12.2: {}
+
+ memoize-one@6.0.0: {}
+
+ meow@12.1.1: {}
+
+ meow@13.2.0: {}
+
+ merge-options@1.0.1:
+ dependencies:
+ is-plain-obj: 1.1.0
+
+ merge-stream@2.0.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.8:
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.1
+
+ mime-db@1.52.0: {}
+
+ mime-match@1.0.2:
+ dependencies:
+ wildcard: 1.1.2
+
+ mime-types@2.1.35:
+ dependencies:
+ mime-db: 1.52.0
+
+ mime@1.6.0:
+ optional: true
+
+ mimic-fn@2.1.0: {}
+
+ mimic-fn@4.0.0: {}
+
+ mimic-function@5.0.1: {}
+
+ minimatch@10.0.1:
+ dependencies:
+ brace-expansion: 2.0.1
+
+ minimatch@3.1.2:
+ dependencies:
+ brace-expansion: 1.1.11
+
+ minimatch@5.1.6:
+ dependencies:
+ brace-expansion: 2.0.1
+
+ minimatch@9.0.5:
+ dependencies:
+ brace-expansion: 2.0.1
+
+ minimist@1.2.8: {}
+
+ minipass@3.3.6:
+ dependencies:
+ yallist: 4.0.0
+
+ minipass@5.0.0: {}
+
+ minipass@7.1.2: {}
+
+ minizlib@2.1.2:
+ dependencies:
+ minipass: 3.3.6
+ yallist: 4.0.0
+
+ mitt@3.0.1: {}
+
+ mixin-deep@1.3.2:
+ dependencies:
+ for-in: 1.0.2
+ is-extendable: 1.0.1
+
+ mkdirp@1.0.4: {}
+
+ mkdirp@3.0.1: {}
+
+ mlly@1.7.3:
+ dependencies:
+ acorn: 8.14.0
+ pathe: 1.1.2
+ pkg-types: 1.3.0
+ ufo: 1.5.4
+
+ mockjs@1.1.0:
+ dependencies:
+ commander: 13.0.0
+
+ monaco-editor@0.52.2: {}
+
+ mrmime@2.0.0: {}
+
+ ms@2.0.0: {}
+
+ ms@2.1.3: {}
+
+ muggle-string@0.4.1: {}
+
+ mute-stream@1.0.0: {}
+
+ mute-stream@2.0.0: {}
+
+ namespace-emitter@2.0.1: {}
+
+ nanoid@3.3.8: {}
+
+ 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
+
+ natural-compare@1.4.0: {}
+
+ needle@3.3.1:
+ dependencies:
+ iconv-lite: 0.6.3
+ sax: 1.4.1
+ optional: true
+
+ neo-async@2.6.2: {}
+
+ next-tick@1.1.0: {}
+
+ no-case@3.0.4:
+ dependencies:
+ lower-case: 2.0.2
+ tslib: 2.8.1
+
+ node-fetch-native@1.6.4: {}
+
+ node-fetch@2.7.0:
+ dependencies:
+ whatwg-url: 5.0.0
+
+ node-plop@0.32.0:
+ dependencies:
+ '@types/inquirer': 9.0.7
+ change-case: 4.1.2
+ del: 7.1.0
+ globby: 13.2.2
+ handlebars: 4.7.8
+ inquirer: 9.3.7
+ isbinaryfile: 5.0.4
+ lodash.get: 4.4.2
+ lower-case: 2.0.2
+ mkdirp: 3.0.1
+ resolve: 1.22.10
+ title-case: 3.0.3
+ upper-case: 2.0.2
+
+ node-releases@2.0.19: {}
+
+ normalize-path@3.0.0: {}
+
+ normalize-range@0.1.2: {}
+
+ normalize-wheel-es@1.2.0: {}
+
+ npm-run-path@5.3.0:
+ dependencies:
+ path-key: 4.0.0
+
+ nprogress@0.2.0: {}
+
+ nth-check@2.1.1:
+ dependencies:
+ boolbase: 1.0.0
+
+ nypm@0.3.12:
+ dependencies:
+ citty: 0.1.6
+ consola: 3.3.3
+ execa: 8.0.1
+ pathe: 1.1.2
+ pkg-types: 1.3.0
+ ufo: 1.5.4
+
+ 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.3: {}
+
+ 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.3
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
+ has-symbols: 1.1.0
+ object-keys: 1.1.1
+
+ object.defaults@1.1.0:
+ dependencies:
+ array-each: 1.0.1
+ array-slice: 1.1.0
+ for-own: 1.0.0
+ isobject: 3.0.1
+
+ object.map@1.0.1:
+ dependencies:
+ for-own: 1.0.0
+ make-iterator: 1.0.1
+
+ object.pick@1.3.0:
+ dependencies:
+ isobject: 3.0.1
+
+ ofetch@1.4.1:
+ dependencies:
+ destr: 2.0.3
+ node-fetch-native: 1.6.4
+ ufo: 1.5.4
+
+ ohash@1.1.4: {}
+
+ on-finished@2.3.0:
+ dependencies:
+ ee-first: 1.1.1
+
+ once@1.4.0:
+ dependencies:
+ wrappy: 1.0.2
+
+ onetime@5.1.2:
+ dependencies:
+ mimic-fn: 2.1.0
+
+ onetime@6.0.0:
+ dependencies:
+ mimic-fn: 4.0.0
+
+ onetime@7.0.0:
+ dependencies:
+ mimic-function: 5.0.1
+
+ open@8.4.2:
+ dependencies:
+ define-lazy-prop: 2.0.0
+ is-docker: 2.2.1
+ is-wsl: 2.2.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
+
+ ora@5.4.1:
+ dependencies:
+ bl: 4.1.0
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
+ cli-spinners: 2.9.2
+ is-interactive: 1.0.0
+ is-unicode-supported: 0.1.0
+ log-symbols: 4.1.0
+ strip-ansi: 6.0.1
+ wcwidth: 1.0.1
+
+ ora@8.1.1:
+ dependencies:
+ chalk: 5.4.1
+ cli-cursor: 5.0.0
+ cli-spinners: 2.9.2
+ is-interactive: 2.0.0
+ is-unicode-supported: 2.1.0
+ log-symbols: 6.0.0
+ stdin-discarder: 0.2.2
+ string-width: 7.2.0
+ strip-ansi: 7.1.0
+
+ os-tmpdir@1.0.2: {}
+
+ own-keys@1.0.1:
+ dependencies:
+ get-intrinsic: 1.2.7
+ object-keys: 1.1.1
+ safe-push-apply: 1.0.0
+
+ p-limit@2.3.0:
+ dependencies:
+ p-try: 2.2.0
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+
+ p-limit@4.0.0:
+ dependencies:
+ yocto-queue: 1.1.1
+
+ p-locate@4.1.0:
+ dependencies:
+ p-limit: 2.3.0
+
+ p-locate@5.0.0:
+ dependencies:
+ p-limit: 3.1.0
+
+ p-locate@6.0.0:
+ dependencies:
+ p-limit: 4.0.0
+
+ p-map@5.5.0:
+ dependencies:
+ aggregate-error: 4.0.1
+
+ p-try@2.2.0: {}
+
+ package-json-from-dist@1.0.1: {}
+
+ package-manager-detector@0.2.8: {}
+
+ param-case@3.0.4:
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.8.1
+
+ parent-module@1.0.1:
+ dependencies:
+ callsites: 3.1.0
+
+ parse-filepath@1.0.2:
+ dependencies:
+ is-absolute: 1.0.0
+ map-cache: 0.2.2
+ path-root: 0.1.1
+
+ parse-json@5.2.0:
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ error-ex: 1.3.2
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 1.2.4
+
+ parse-node-version@1.0.1: {}
+
+ parse-passwd@1.0.0: {}
+
+ parseurl@1.3.3: {}
+
+ pascal-case@3.1.2:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.8.1
+
+ pascalcase@0.1.1: {}
+
+ path-browserify@1.0.1: {}
+
+ path-case@3.0.4:
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.8.1
+
+ path-exists@4.0.0: {}
+
+ path-exists@5.0.0: {}
+
+ path-is-absolute@1.0.1: {}
+
+ path-key@3.1.1: {}
+
+ path-key@4.0.0: {}
+
+ path-parse@1.0.7: {}
+
+ path-root-regex@0.1.2: {}
+
+ path-root@0.1.1:
+ dependencies:
+ path-root-regex: 0.1.2
+
+ path-scurry@2.0.0:
+ dependencies:
+ lru-cache: 11.0.2
+ minipass: 7.1.2
+
+ path-to-regexp@6.3.0: {}
+
+ path-type@4.0.0: {}
+
+ path-type@5.0.0: {}
+
+ pathe@0.2.0: {}
+
+ pathe@1.1.2: {}
+
+ pathe@2.0.0: {}
+
+ perfect-debounce@1.0.0: {}
+
+ picocolors@1.1.1: {}
+
+ picomatch@2.3.1: {}
+
+ picomatch@4.0.2: {}
+
+ pidtree@0.6.0: {}
+
+ pify@4.0.1:
+ optional: true
+
+ pinia-plugin-persistedstate@4.2.0(pinia@2.3.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)))(rollup@4.30.1):
+ dependencies:
+ '@nuxt/kit': 3.15.1(rollup@4.30.1)
+ deep-pick-omit: 1.2.1
+ defu: 6.1.4
+ destr: 2.0.3
+ optionalDependencies:
+ pinia: 2.3.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))
+ transitivePeerDependencies:
+ - magicast
+ - rollup
+ - supports-color
+
+ pinia@2.3.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)):
+ dependencies:
+ '@vue/devtools-api': 6.6.4
+ vue: 3.5.13(typescript@5.7.3)
+ vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3))
+ optionalDependencies:
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+
+ pkg-types@1.3.0:
+ dependencies:
+ confbox: 0.1.8
+ mlly: 1.7.3
+ pathe: 1.1.2
+
+ plop@4.0.1:
+ dependencies:
+ '@types/liftoff': 4.0.3
+ chalk: 5.4.1
+ interpret: 3.1.1
+ liftoff: 4.0.0
+ minimist: 1.2.8
+ node-plop: 0.32.0
+ ora: 8.1.1
+ v8flags: 4.0.1
+
+ pngjs@5.0.0: {}
+
+ posix-character-classes@0.1.1: {}
+
+ possible-typed-array-names@1.0.0: {}
+
+ postcss-html@1.7.0:
+ dependencies:
+ htmlparser2: 8.0.2
+ js-tokens: 9.0.1
+ postcss: 8.4.49
+ postcss-safe-parser: 6.0.0(postcss@8.4.49)
+
+ postcss-less@6.0.0(postcss@8.4.49):
+ dependencies:
+ postcss: 8.4.49
+
+ postcss-prefix-selector@1.16.1(postcss@5.2.18):
+ dependencies:
+ postcss: 5.2.18
+
+ postcss-resolve-nested-selector@0.1.6: {}
+
+ postcss-safe-parser@6.0.0(postcss@8.4.49):
+ dependencies:
+ postcss: 8.4.49
+
+ postcss-safe-parser@7.0.1(postcss@8.4.49):
+ dependencies:
+ postcss: 8.4.49
+
+ postcss-selector-parser@6.1.2:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
+ postcss-selector-parser@7.0.0:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
+ postcss-sorting@8.0.2(postcss@8.4.49):
+ dependencies:
+ postcss: 8.4.49
+
+ 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.4.49:
+ dependencies:
+ nanoid: 3.3.8
+ 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
+
+ preact@10.25.4: {}
+
+ prelude-ls@1.2.1: {}
+
+ prettier-linter-helpers@1.0.0:
+ dependencies:
+ fast-diff: 1.3.0
+
+ prettier@3.4.2: {}
+
+ prismjs@1.29.0: {}
+
+ progress@2.0.3: {}
+
+ proxy-from-env@1.1.0: {}
+
+ prr@1.0.1:
+ optional: true
+
+ punycode@1.4.1: {}
+
+ punycode@2.3.1: {}
+
+ qrcode@1.5.4:
+ dependencies:
+ dijkstrajs: 1.0.3
+ pngjs: 5.0.0
+ yargs: 15.4.1
+
+ qs@6.13.1:
+ dependencies:
+ side-channel: 1.1.0
+
+ query-string@4.3.4:
+ dependencies:
+ object-assign: 4.1.1
+ strict-uri-encode: 1.1.0
+
+ queue-microtask@1.2.3: {}
+
+ rc9@2.1.2:
+ dependencies:
+ defu: 6.1.4
+ destr: 2.0.3
+
+ 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.0.2: {}
+
+ rechoir@0.8.0:
+ dependencies:
+ resolve: 1.22.10
+
+ reflect.getprototypeof@1.0.10:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.23.9
+ es-errors: 1.3.0
+ es-object-atoms: 1.0.0
+ get-intrinsic: 1.2.7
+ get-proto: 1.0.1
+ which-builtin-type: 1.2.1
+
+ regenerate-unicode-properties@10.2.0:
+ dependencies:
+ regenerate: 1.4.2
+
+ regenerate@1.4.2: {}
+
+ regenerator-runtime@0.14.1: {}
+
+ regenerator-transform@0.15.2:
+ dependencies:
+ '@babel/runtime': 7.26.0
+
+ regex-not@1.0.2:
+ dependencies:
+ extend-shallow: 3.0.2
+ safe-regex: 1.1.0
+
+ 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
+
+ regexpu-core@6.2.0:
+ dependencies:
+ regenerate: 1.4.2
+ regenerate-unicode-properties: 10.2.0
+ regjsgen: 0.8.0
+ regjsparser: 0.12.0
+ unicode-match-property-ecmascript: 2.0.0
+ unicode-match-property-value-ecmascript: 2.2.0
+
+ regjsgen@0.8.0: {}
+
+ regjsparser@0.12.0:
+ dependencies:
+ jsesc: 3.0.2
+
+ repeat-element@1.1.4: {}
+
+ repeat-string@1.6.1: {}
+
+ require-directory@2.1.1: {}
+
+ require-from-string@2.0.2: {}
+
+ require-main-filename@2.0.0: {}
+
+ resolve-dir@1.0.1:
+ dependencies:
+ expand-tilde: 2.0.2
+ global-modules: 1.0.0
+
+ resolve-from@4.0.0: {}
+
+ resolve-from@5.0.0: {}
+
+ resolve-pkg-maps@1.0.0: {}
+
+ resolve-url@0.2.1: {}
+
+ resolve@1.22.10:
+ dependencies:
+ is-core-module: 2.16.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ restore-cursor@3.1.0:
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+
+ restore-cursor@5.1.0:
+ dependencies:
+ onetime: 7.0.0
+ signal-exit: 4.1.0
+
+ ret@0.1.15: {}
+
+ reusify@1.0.4: {}
+
+ rfdc@1.4.1: {}
+
+ rimraf@3.0.2:
+ dependencies:
+ glob: 7.2.3
+
+ rimraf@6.0.1:
+ dependencies:
+ glob: 11.0.0
+ package-json-from-dist: 1.0.1
+
+ rollup-plugin-purge-icons@0.10.0:
+ dependencies:
+ '@purge-icons/core': 0.10.0
+ '@purge-icons/generated': 0.10.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ rollup-plugin-visualizer@5.14.0(rollup@4.30.1):
+ dependencies:
+ open: 8.4.2
+ picomatch: 4.0.2
+ source-map: 0.7.4
+ yargs: 17.7.2
+ optionalDependencies:
+ rollup: 4.30.1
+
+ rollup@2.79.2:
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ rollup@4.30.1:
+ dependencies:
+ '@types/estree': 1.0.6
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.30.1
+ '@rollup/rollup-android-arm64': 4.30.1
+ '@rollup/rollup-darwin-arm64': 4.30.1
+ '@rollup/rollup-darwin-x64': 4.30.1
+ '@rollup/rollup-freebsd-arm64': 4.30.1
+ '@rollup/rollup-freebsd-x64': 4.30.1
+ '@rollup/rollup-linux-arm-gnueabihf': 4.30.1
+ '@rollup/rollup-linux-arm-musleabihf': 4.30.1
+ '@rollup/rollup-linux-arm64-gnu': 4.30.1
+ '@rollup/rollup-linux-arm64-musl': 4.30.1
+ '@rollup/rollup-linux-loongarch64-gnu': 4.30.1
+ '@rollup/rollup-linux-powerpc64le-gnu': 4.30.1
+ '@rollup/rollup-linux-riscv64-gnu': 4.30.1
+ '@rollup/rollup-linux-s390x-gnu': 4.30.1
+ '@rollup/rollup-linux-x64-gnu': 4.30.1
+ '@rollup/rollup-linux-x64-musl': 4.30.1
+ '@rollup/rollup-win32-arm64-msvc': 4.30.1
+ '@rollup/rollup-win32-ia32-msvc': 4.30.1
+ '@rollup/rollup-win32-x64-msvc': 4.30.1
+ fsevents: 2.3.3
+
+ run-async@3.0.0: {}
+
+ run-parallel@1.2.0:
+ dependencies:
+ queue-microtask: 1.2.3
+
+ rxjs@7.8.1:
+ dependencies:
+ tslib: 2.8.1
+
+ safe-array-concat@1.1.3:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.3
+ get-intrinsic: 1.2.7
+ 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.3
+ es-errors: 1.3.0
+ is-regex: 1.2.1
+
+ safe-regex@1.1.0:
+ dependencies:
+ ret: 0.1.15
+
+ safer-buffer@2.1.2: {}
+
+ sax@1.4.1:
+ optional: true
+
+ scroll-into-view-if-needed@2.2.31:
+ dependencies:
+ compute-scroll-into-view: 1.0.20
+
+ scule@1.3.0: {}
+
+ semver@5.7.2:
+ optional: true
+
+ semver@6.3.1: {}
+
+ semver@7.6.3: {}
+
+ sentence-case@3.0.4:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.8.1
+ upper-case-first: 2.0.2
+
+ set-blocking@2.0.0: {}
+
+ 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.2.7
+ 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.0.0
+
+ 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.3
+
+ side-channel-map@1.0.1:
+ dependencies:
+ call-bound: 1.0.3
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.7
+ object-inspect: 1.13.3
+
+ side-channel-weakmap@1.0.2:
+ dependencies:
+ call-bound: 1.0.3
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.7
+ object-inspect: 1.13.3
+ side-channel-map: 1.0.1
+
+ side-channel@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.3
+ side-channel-list: 1.0.0
+ side-channel-map: 1.0.1
+ side-channel-weakmap: 1.0.2
+
+ signal-exit@3.0.7: {}
+
+ signal-exit@4.1.0: {}
+
+ sirv@3.0.0:
+ dependencies:
+ '@polka/url': 1.0.0-next.28
+ mrmime: 2.0.0
+ totalist: 3.0.1
+
+ slash@3.0.0: {}
+
+ slash@4.0.0: {}
+
+ slash@5.1.0: {}
+
+ slate-history@0.66.0(slate@0.72.8):
+ dependencies:
+ is-plain-object: 5.0.0
+ slate: 0.72.8
+
+ slate@0.72.8:
+ dependencies:
+ immer: 9.0.21
+ is-plain-object: 5.0.0
+ tiny-warning: 1.0.3
+
+ slice-ansi@4.0.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ astral-regex: 2.0.0
+ is-fullwidth-code-point: 3.0.0
+
+ slice-ansi@5.0.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ is-fullwidth-code-point: 4.0.0
+
+ slice-ansi@7.1.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ is-fullwidth-code-point: 5.0.0
+
+ snabbdom@3.6.2: {}
+
+ snake-case@3.0.4:
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.8.1
+
+ 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-support@0.5.21:
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+
+ source-map-url@0.4.1: {}
+
+ source-map@0.5.7: {}
+
+ source-map@0.6.1: {}
+
+ source-map@0.7.4: {}
+
+ sourcemap-codec@1.4.8: {}
+
+ split-string@3.1.0:
+ dependencies:
+ extend-shallow: 3.0.2
+
+ split2@4.2.0: {}
+
+ ssr-window@3.0.0: {}
+
+ stable@0.1.8: {}
+
+ static-extend@0.1.2:
+ dependencies:
+ define-property: 0.2.5
+ object-copy: 0.1.0
+
+ statuses@1.5.0: {}
+
+ std-env@3.8.0: {}
+
+ stdin-discarder@0.2.2: {}
+
+ strict-uri-encode@1.1.0: {}
+
+ string-argv@0.3.2: {}
+
+ 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.0
+
+ string-width@7.2.0:
+ dependencies:
+ emoji-regex: 10.4.0
+ get-east-asian-width: 1.3.0
+ strip-ansi: 7.1.0
+
+ string.prototype.trim@1.2.10:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.3
+ define-data-property: 1.1.4
+ define-properties: 1.2.1
+ es-abstract: 1.23.9
+ es-object-atoms: 1.0.0
+ has-property-descriptors: 1.0.2
+
+ string.prototype.trimend@1.0.9:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.3
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
+
+ string.prototype.trimstart@1.0.8:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
+
+ 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.0:
+ dependencies:
+ ansi-regex: 6.1.0
+
+ strip-final-newline@3.0.0: {}
+
+ strip-json-comments@3.1.1: {}
+
+ strip-literal@2.1.1:
+ dependencies:
+ js-tokens: 9.0.1
+
+ stylelint-config-html@1.1.0(postcss-html@1.7.0)(stylelint@16.12.0(typescript@5.7.3)):
+ dependencies:
+ postcss-html: 1.7.0
+ stylelint: 16.12.0(typescript@5.7.3)
+
+ stylelint-config-recommended@14.0.1(stylelint@16.12.0(typescript@5.7.3)):
+ dependencies:
+ stylelint: 16.12.0(typescript@5.7.3)
+
+ stylelint-config-standard@36.0.1(stylelint@16.12.0(typescript@5.7.3)):
+ dependencies:
+ stylelint: 16.12.0(typescript@5.7.3)
+ stylelint-config-recommended: 14.0.1(stylelint@16.12.0(typescript@5.7.3))
+
+ stylelint-order@6.0.4(stylelint@16.12.0(typescript@5.7.3)):
+ dependencies:
+ postcss: 8.4.49
+ postcss-sorting: 8.0.2(postcss@8.4.49)
+ stylelint: 16.12.0(typescript@5.7.3)
+
+ stylelint@16.12.0(typescript@5.7.3):
+ dependencies:
+ '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3)
+ '@csstools/css-tokenizer': 3.0.3
+ '@csstools/media-query-list-parser': 4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+ '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.0.0)
+ '@dual-bundle/import-meta-resolve': 4.1.0
+ balanced-match: 2.0.0
+ colord: 2.9.3
+ cosmiconfig: 9.0.0(typescript@5.7.3)
+ css-functions-list: 3.2.3
+ css-tree: 3.1.0
+ debug: 4.4.0
+ fast-glob: 3.3.3
+ fastest-levenshtein: 1.0.16
+ file-entry-cache: 9.1.0
+ global-modules: 2.0.0
+ globby: 11.1.0
+ globjoin: 0.1.4
+ html-tags: 3.3.1
+ ignore: 6.0.2
+ imurmurhash: 0.1.4
+ is-plain-object: 5.0.0
+ known-css-properties: 0.35.0
+ mathml-tag-names: 2.1.3
+ meow: 13.2.0
+ micromatch: 4.0.8
+ normalize-path: 3.0.0
+ picocolors: 1.1.1
+ postcss: 8.4.49
+ postcss-resolve-nested-selector: 0.1.6
+ postcss-safe-parser: 7.0.1(postcss@8.4.49)
+ postcss-selector-parser: 7.0.0
+ postcss-value-parser: 4.2.0
+ resolve-from: 5.0.0
+ string-width: 4.2.3
+ supports-hyperlinks: 3.1.0
+ svg-tags: 1.0.0
+ table: 6.9.0
+ write-file-atomic: 5.0.1
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ 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
+
+ supports-hyperlinks@3.1.0:
+ dependencies:
+ has-flag: 4.0.0
+ supports-color: 7.2.0
+
+ supports-preserve-symlinks-flag@1.0.0: {}
+
+ 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.10
+ transitivePeerDependencies:
+ - supports-color
+
+ svg-tags@1.0.0: {}
+
+ 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.9.2:
+ dependencies:
+ '@pkgr/core': 0.1.1
+ tslib: 2.8.1
+
+ system-architecture@0.1.0: {}
+
+ systemjs@6.15.1: {}
+
+ table@6.9.0:
+ dependencies:
+ ajv: 8.17.1
+ lodash.truncate: 4.4.2
+ slice-ansi: 4.0.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ tar@6.2.1:
+ dependencies:
+ chownr: 2.0.0
+ fs-minipass: 2.1.0
+ minipass: 5.0.0
+ minizlib: 2.1.2
+ mkdirp: 1.0.4
+ yallist: 4.0.0
+
+ terser@5.37.0:
+ dependencies:
+ '@jridgewell/source-map': 0.3.6
+ acorn: 8.14.0
+ commander: 2.20.3
+ source-map-support: 0.5.21
+
+ text-extensions@2.4.0: {}
+
+ through@2.3.8: {}
+
+ tiny-warning@1.0.3: {}
+
+ tinyexec@0.3.2: {}
+
+ tinyglobby@0.2.10:
+ dependencies:
+ fdir: 6.4.2(picomatch@4.0.2)
+ picomatch: 4.0.2
+
+ title-case@3.0.3:
+ dependencies:
+ tslib: 2.8.1
+
+ tmp@0.0.33:
+ dependencies:
+ os-tmpdir: 1.0.2
+
+ 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: {}
+
+ tr46@0.0.3: {}
+
+ traverse@0.6.10:
+ dependencies:
+ gopd: 1.2.0
+ typedarray.prototype.slice: 1.0.5
+ which-typed-array: 1.1.18
+
+ ts-api-utils@2.0.0(typescript@5.7.3):
+ dependencies:
+ typescript: 5.7.3
+
+ tslib@2.3.0: {}
+
+ tslib@2.8.1: {}
+
+ tsx@4.19.2:
+ dependencies:
+ esbuild: 0.23.1
+ get-tsconfig: 4.8.1
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ type-check@0.4.0:
+ dependencies:
+ prelude-ls: 1.2.1
+
+ type-fest@0.20.2: {}
+
+ type-fest@0.21.3: {}
+
+ type@2.7.3: {}
+
+ typed-array-buffer@1.0.3:
+ dependencies:
+ call-bound: 1.0.3
+ 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.3
+ 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.3
+ 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.3
+ gopd: 1.2.0
+ is-typed-array: 1.1.15
+ possible-typed-array-names: 1.0.0
+ reflect.getprototypeof: 1.0.10
+
+ typedarray.prototype.slice@1.0.5:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.23.9
+ 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-eslint@8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3):
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3)
+ '@typescript-eslint/parser': 8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3)
+ '@typescript-eslint/utils': 8.19.1(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.3)
+ eslint: 9.17.0(jiti@2.4.2)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ typescript@5.7.3: {}
+
+ ufo@1.5.4: {}
+
+ uglify-js@3.19.3:
+ optional: true
+
+ unbox-primitive@1.1.0:
+ dependencies:
+ call-bound: 1.0.3
+ has-bigints: 1.1.0
+ has-symbols: 1.1.0
+ which-boxed-primitive: 1.1.1
+
+ unc-path-regex@0.1.2: {}
+
+ unconfig@0.6.0:
+ dependencies:
+ '@antfu/utils': 0.7.10
+ defu: 6.1.4
+ importx: 0.5.1
+ transitivePeerDependencies:
+ - supports-color
+
+ unctx@2.4.1:
+ dependencies:
+ acorn: 8.14.0
+ estree-walker: 3.0.3
+ magic-string: 0.30.17
+ unplugin: 2.1.2
+
+ undici-types@6.20.0: {}
+
+ unicode-canonical-property-names-ecmascript@2.0.1: {}
+
+ unicode-match-property-ecmascript@2.0.0:
+ dependencies:
+ unicode-canonical-property-names-ecmascript: 2.0.1
+ unicode-property-aliases-ecmascript: 2.1.0
+
+ unicode-match-property-value-ecmascript@2.2.0: {}
+
+ unicode-property-aliases-ecmascript@2.1.0: {}
+
+ unicorn-magic@0.1.0: {}
+
+ unimport@3.14.5(rollup@4.30.1):
+ dependencies:
+ '@rollup/pluginutils': 5.1.4(rollup@4.30.1)
+ acorn: 8.14.0
+ escape-string-regexp: 5.0.0
+ estree-walker: 3.0.3
+ fast-glob: 3.3.3
+ local-pkg: 0.5.1
+ magic-string: 0.30.17
+ mlly: 1.7.3
+ pathe: 1.1.2
+ picomatch: 4.0.2
+ pkg-types: 1.3.0
+ scule: 1.3.0
+ strip-literal: 2.1.1
+ unplugin: 1.16.1
+ transitivePeerDependencies:
+ - rollup
+
+ 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: {}
+
+ unocss@0.65.4(postcss@8.4.49)(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)):
+ dependencies:
+ '@unocss/astro': 0.65.4(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))
+ '@unocss/cli': 0.65.4(rollup@4.30.1)
+ '@unocss/core': 0.65.4
+ '@unocss/postcss': 0.65.4(postcss@8.4.49)
+ '@unocss/preset-attributify': 0.65.4
+ '@unocss/preset-icons': 0.65.4
+ '@unocss/preset-mini': 0.65.4
+ '@unocss/preset-tagify': 0.65.4
+ '@unocss/preset-typography': 0.65.4
+ '@unocss/preset-uno': 0.65.4
+ '@unocss/preset-web-fonts': 0.65.4
+ '@unocss/preset-wind': 0.65.4
+ '@unocss/transformer-attributify-jsx': 0.65.4
+ '@unocss/transformer-compile-class': 0.65.4
+ '@unocss/transformer-directives': 0.65.4
+ '@unocss/transformer-variant-group': 0.65.4
+ '@unocss/vite': 0.65.4(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))
+ optionalDependencies:
+ vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)
+ transitivePeerDependencies:
+ - postcss
+ - rollup
+ - supports-color
+ - vue
+
+ unpipe@1.0.0: {}
+
+ unplugin@1.16.1:
+ dependencies:
+ acorn: 8.14.0
+ webpack-virtual-modules: 0.6.2
+
+ unplugin@2.1.2:
+ dependencies:
+ acorn: 8.14.0
+ webpack-virtual-modules: 0.6.2
+
+ unset-value@1.0.0:
+ dependencies:
+ has-value: 0.3.1
+ isobject: 3.0.1
+
+ untyped@1.5.2:
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/standalone': 7.26.4
+ '@babel/types': 7.26.3
+ citty: 0.1.6
+ defu: 6.1.4
+ jiti: 2.4.2
+ knitwork: 1.2.0
+ scule: 1.3.0
+ transitivePeerDependencies:
+ - supports-color
+
+ update-browserslist-db@1.1.2(browserslist@4.24.4):
+ dependencies:
+ browserslist: 4.24.4
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
+ upper-case-first@2.0.2:
+ dependencies:
+ tslib: 2.8.1
+
+ upper-case@2.0.2:
+ dependencies:
+ tslib: 2.8.1
+
+ uqr@0.1.2: {}
+
+ uri-js@4.4.1:
+ dependencies:
+ punycode: 2.3.1
+
+ urix@0.1.0: {}
+
+ url@0.11.4:
+ dependencies:
+ punycode: 1.4.1
+ qs: 6.13.1
+
+ use@3.1.1: {}
+
+ util-deprecate@1.0.2: {}
+
+ utils-merge@1.0.1: {}
+
+ v8flags@4.0.1: {}
+
+ vary@1.1.2: {}
+
+ vite-plugin-ejs@1.7.0(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)):
+ dependencies:
+ ejs: 3.1.10
+ vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)
+
+ vite-plugin-eslint@1.8.1(eslint@9.17.0(jiti@2.4.2))(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)):
+ dependencies:
+ '@rollup/pluginutils': 4.2.1
+ '@types/eslint': 8.56.12
+ eslint: 9.17.0(jiti@2.4.2)
+ rollup: 2.79.2
+ vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)
+
+ vite-plugin-mock@2.9.6(mockjs@1.1.0)(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)):
+ dependencies:
+ '@rollup/plugin-node-resolve': 13.3.0(rollup@4.30.1)
+ '@types/mockjs': 1.0.10
+ chalk: 4.1.2
+ chokidar: 3.6.0
+ connect: 3.7.0
+ debug: 4.4.0
+ esbuild: 0.11.3
+ fast-glob: 3.3.3
+ mockjs: 1.1.0
+ path-to-regexp: 6.3.0
+ vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)
+ transitivePeerDependencies:
+ - rollup
+ - supports-color
+
+ vite-plugin-progress@0.0.7(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)):
+ dependencies:
+ picocolors: 1.1.1
+ progress: 2.0.3
+ rd: 2.0.1
+ vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)
+
+ vite-plugin-purge-icons@0.10.0(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)):
+ dependencies:
+ '@purge-icons/core': 0.10.0
+ '@purge-icons/generated': 0.10.0
+ rollup-plugin-purge-icons: 0.10.0
+ vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ vite-plugin-style-import@2.0.0(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)):
+ dependencies:
+ '@rollup/pluginutils': 4.2.1
+ change-case: 4.1.2
+ console: 0.7.2
+ es-module-lexer: 0.9.3
+ fs-extra: 10.1.0
+ magic-string: 0.25.9
+ pathe: 0.2.0
+ vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)
+
+ vite-plugin-svg-icons@2.0.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)):
+ dependencies:
+ '@types/svgo': 2.6.4
+ cors: 2.8.5
+ debug: 4.4.0
+ etag: 1.8.1
+ fs-extra: 10.1.0
+ pathe: 0.2.0
+ svg-baker: 1.7.0
+ svgo: 2.8.0
+ vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ vite-plugin-url-copy@1.1.4(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)):
+ dependencies:
+ clipboardy: 4.0.0
+ consola: 3.3.3
+ uqr: 0.1.2
+ vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)
+
+ vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0):
+ dependencies:
+ esbuild: 0.24.2
+ postcss: 8.4.49
+ rollup: 4.30.1
+ optionalDependencies:
+ '@types/node': 22.10.5
+ fsevents: 2.3.3
+ jiti: 2.4.2
+ less: 4.2.1
+ terser: 5.37.0
+ tsx: 4.19.2
+ yaml: 2.7.0
+
+ vscode-uri@3.0.8: {}
+
+ vue-demi@0.14.10(vue@3.5.13(typescript@5.7.3)):
+ dependencies:
+ vue: 3.5.13(typescript@5.7.3)
+
+ vue-draggable-plus@0.6.0(@types/sortablejs@1.15.8):
+ dependencies:
+ '@types/sortablejs': 1.15.8
+
+ vue-eslint-parser@9.4.3(eslint@9.17.0(jiti@2.4.2)):
+ dependencies:
+ debug: 4.4.0
+ eslint: 9.17.0(jiti@2.4.2)
+ eslint-scope: 7.2.2
+ eslint-visitor-keys: 3.4.3
+ espree: 9.6.1
+ esquery: 1.6.0
+ lodash: 4.17.21
+ semver: 7.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ vue-flow-layout@0.1.1(vue@3.5.13(typescript@5.7.3)):
+ dependencies:
+ vue: 3.5.13(typescript@5.7.3)
+
+ vue-i18n@11.0.1(vue@3.5.13(typescript@5.7.3)):
+ dependencies:
+ '@intlify/core-base': 11.0.1
+ '@intlify/shared': 11.0.1
+ '@vue/devtools-api': 6.6.4
+ vue: 3.5.13(typescript@5.7.3)
+
+ vue-json-pretty@2.4.0(vue@3.5.13(typescript@5.7.3)):
+ dependencies:
+ vue: 3.5.13(typescript@5.7.3)
+
+ vue-router@4.5.0(vue@3.5.13(typescript@5.7.3)):
+ dependencies:
+ '@vue/devtools-api': 6.6.4
+ vue: 3.5.13(typescript@5.7.3)
+
+ vue-tsc@2.2.0(typescript@5.7.3):
+ dependencies:
+ '@volar/typescript': 2.4.11
+ '@vue/language-core': 2.2.0(typescript@5.7.3)
+ typescript: 5.7.3
+
+ vue-types@5.1.3(vue@3.5.13(typescript@5.7.3)):
+ dependencies:
+ is-plain-object: 5.0.0
+ optionalDependencies:
+ vue: 3.5.13(typescript@5.7.3)
+
+ vue@3.5.13(typescript@5.7.3):
+ dependencies:
+ '@vue/compiler-dom': 3.5.13
+ '@vue/compiler-sfc': 3.5.13
+ '@vue/runtime-dom': 3.5.13
+ '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.7.3))
+ '@vue/shared': 3.5.13
+ optionalDependencies:
+ typescript: 5.7.3
+
+ wcwidth@1.0.1:
+ dependencies:
+ defaults: 1.0.4
+
+ webidl-conversions@3.0.1: {}
+
+ webpack-virtual-modules@0.6.2: {}
+
+ whatwg-url@5.0.0:
+ dependencies:
+ tr46: 0.0.3
+ webidl-conversions: 3.0.1
+
+ which-boxed-primitive@1.1.1:
+ dependencies:
+ is-bigint: 1.1.0
+ is-boolean-object: 1.2.1
+ 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.3
+ function.prototype.name: 1.1.8
+ has-tostringtag: 1.0.2
+ is-async-function: 2.1.0
+ is-date-object: 1.1.0
+ is-finalizationregistry: 1.1.1
+ is-generator-function: 1.1.0
+ is-regex: 1.2.1
+ is-weakref: 1.1.0
+ isarray: 2.0.5
+ which-boxed-primitive: 1.1.1
+ which-collection: 1.0.2
+ which-typed-array: 1.1.18
+
+ 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-module@2.0.1: {}
+
+ which-typed-array@1.1.18:
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.8
+ call-bound: 1.0.3
+ for-each: 0.3.3
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+
+ which@1.3.1:
+ dependencies:
+ isexe: 2.0.0
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ wildcard@1.1.2: {}
+
+ word-wrap@1.2.5: {}
+
+ wordwrap@1.0.0: {}
+
+ wrap-ansi@6.2.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ 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.1
+ string-width: 5.1.2
+ strip-ansi: 7.1.0
+
+ wrap-ansi@9.0.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ string-width: 7.2.0
+ strip-ansi: 7.1.0
+
+ wrappy@1.0.2: {}
+
+ write-file-atomic@5.0.1:
+ dependencies:
+ imurmurhash: 0.1.4
+ signal-exit: 4.1.0
+
+ xgplayer-subtitles@3.0.20(core-js@3.40.0):
+ dependencies:
+ core-js: 3.40.0
+ eventemitter3: 4.0.7
+
+ xgplayer@3.0.20(core-js@3.40.0):
+ dependencies:
+ core-js: 3.40.0
+ danmu.js: 1.1.13
+ delegate: 3.2.0
+ downloadjs: 1.4.7
+ eventemitter3: 4.0.7
+ xgplayer-subtitles: 3.0.20(core-js@3.40.0)
+
+ xml-name-validator@4.0.0: {}
+
+ y18n@4.0.3: {}
+
+ y18n@5.0.8: {}
+
+ yallist@3.1.1: {}
+
+ yallist@4.0.0: {}
+
+ yaml-eslint-parser@1.2.3:
+ dependencies:
+ eslint-visitor-keys: 3.4.3
+ lodash: 4.17.21
+ yaml: 2.7.0
+
+ yaml@2.6.1: {}
+
+ yaml@2.7.0: {}
+
+ yargs-parser@18.1.3:
+ dependencies:
+ camelcase: 5.3.1
+ decamelize: 1.2.0
+
+ yargs-parser@21.1.1: {}
+
+ yargs@15.4.1:
+ dependencies:
+ cliui: 6.0.0
+ decamelize: 1.2.0
+ find-up: 4.1.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ require-main-filename: 2.0.0
+ set-blocking: 2.0.0
+ string-width: 4.2.3
+ which-module: 2.0.1
+ y18n: 4.0.3
+ yargs-parser: 18.1.3
+
+ 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: {}
+
+ yocto-queue@1.1.1: {}
+
+ yoctocolors-cjs@2.1.2: {}
+
+ zrender@5.6.1:
+ dependencies:
+ tslib: 2.3.0
diff --git a/postcss.config.cjs b/postcss.config.cjs
new file mode 100644
index 0000000..961986e
--- /dev/null
+++ b/postcss.config.cjs
@@ -0,0 +1,5 @@
+module.exports = {
+ plugins: {
+ autoprefixer: {}
+ }
+}
diff --git a/prettier.config.cjs b/prettier.config.cjs
new file mode 100644
index 0000000..b46239f
--- /dev/null
+++ b/prettier.config.cjs
@@ -0,0 +1,19 @@
+module.exports = {
+ printWidth: 100,
+ tabWidth: 2,
+ useTabs: false,
+ semi: false,
+ vueIndentScriptAndStyle: false,
+ singleQuote: true,
+ quoteProps: 'as-needed',
+ bracketSpacing: true,
+ trailingComma: 'none',
+ jsxSingleQuote: false,
+ arrowParens: 'always',
+ insertPragma: false,
+ requirePragma: false,
+ proseWrap: 'never',
+ htmlWhitespaceSensitivity: 'strict',
+ endOfLine: 'auto',
+ rangeStart: 0
+}
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..5a7de08
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/logo.png b/public/logo.png
new file mode 100644
index 0000000..b76c71b
Binary files /dev/null and b/public/logo.png differ
diff --git a/scripts/icon.ts b/scripts/icon.ts
new file mode 100644
index 0000000..724342e
--- /dev/null
+++ b/scripts/icon.ts
@@ -0,0 +1,73 @@
+import path from 'path'
+import fs from 'fs-extra'
+import inquirer from 'inquirer'
+import chalk from 'chalk'
+import pkg from '../package.json'
+import { ICON_PREFIX } from '../src/constants'
+
+interface Icon {
+ name: string
+ prefix: string
+ icons: string[]
+}
+
+async function generateIcon() {
+ const dir = path.resolve(process.cwd(), 'node_modules/@iconify/json')
+
+ const raw = await fs.readJSON(path.join(dir, 'collections.json'))
+
+ const collections = Object.entries(raw).map(([id, v]) => ({
+ ...(v as any),
+ id
+ }))
+
+ const choices = collections.map((item) => ({ key: item.id, value: item.id, name: item.name }))
+
+ inquirer
+ .prompt([
+ // {
+ // type: 'list',
+ // name: 'useType',
+ // choices: [
+ // { key: 'local', value: 'local', name: 'Local' },
+ // { key: 'onLine', value: 'onLine', name: 'OnLine' }
+ // ],
+ // message: 'How to use icons?'
+ // },
+ {
+ type: 'list',
+ name: 'iconSet',
+ choices: choices,
+ message: 'Select the icon set that needs to be generated?'
+ }
+ ])
+ // ↓命令行问答的答案
+ .then(async (answers) => {
+ const { iconSet } = answers
+ // const isOnLine = useType === 'onLine'
+ const outputDir = path.resolve(process.cwd(), 'src/components/IconPicker/src/data')
+ fs.ensureDir(outputDir)
+ const genCollections = collections.filter((item) => [iconSet].includes(item.id))
+ const prefixSet: string[] = []
+ for (const info of genCollections) {
+ const data = await fs.readJSON(path.join(dir, 'json', `${info.id}.json`))
+ if (data) {
+ const { prefix } = data
+ const prefixName = `${ICON_PREFIX}${prefix}`
+ const icons = Object.keys(data.icons).map((item) => `${prefixName}:${item}`)
+
+ await fs.writeFileSync(
+ path.join('src/components/IconPicker/src/data', `icons.${prefix}.ts`),
+ `export default ${JSON.stringify({ name: info.name, prefix: prefixName, icons })}`
+ )
+ // ↓分类处理完成,push类型名称
+ prefixSet.push(prefix)
+ }
+ }
+ console.log(
+ `✨ ${chalk.cyan(`[${pkg.name}]`)}` + ' - Icon generated successfully:' + `[${prefixSet}]`
+ )
+ })
+}
+
+generateIcon()
diff --git a/src/App.vue b/src/App.vue
new file mode 100644
index 0000000..e3301d9
--- /dev/null
+++ b/src/App.vue
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/api/common/index.ts b/src/api/common/index.ts
new file mode 100644
index 0000000..b8c986c
--- /dev/null
+++ b/src/api/common/index.ts
@@ -0,0 +1,11 @@
+import request from '@/axios'
+
+// 获取所有字典
+export const getDictApi = () => {
+ return request.get({ url: '/mock/dict/list' })
+}
+
+// 模拟获取某个字典
+export const getDictOneApi = async () => {
+ return request.get({ url: '/mock/dict/one' })
+}
diff --git a/src/api/dashboard/analysis/index.ts b/src/api/dashboard/analysis/index.ts
new file mode 100644
index 0000000..f559dc9
--- /dev/null
+++ b/src/api/dashboard/analysis/index.ts
@@ -0,0 +1,23 @@
+import request from '@/axios'
+import type {
+ AnalysisTotalTypes,
+ UserAccessSource,
+ WeeklyUserActivity,
+ MonthlySales
+} from './types'
+
+export const getCountApi = (): Promise> => {
+ return request.get({ url: '/mock/analysis/total' })
+}
+
+export const getUserAccessSourceApi = (): Promise> => {
+ return request.get({ url: '/mock/analysis/userAccessSource' })
+}
+
+export const getWeeklyUserActivityApi = (): Promise> => {
+ return request.get({ url: '/mock/analysis/weeklyUserActivity' })
+}
+
+export const getMonthlySalesApi = (): Promise> => {
+ return request.get({ url: '/mock/analysis/monthlySales' })
+}
diff --git a/src/api/dashboard/analysis/types.ts b/src/api/dashboard/analysis/types.ts
new file mode 100644
index 0000000..4a239f5
--- /dev/null
+++ b/src/api/dashboard/analysis/types.ts
@@ -0,0 +1,22 @@
+export type AnalysisTotalTypes = {
+ users: number
+ messages: number
+ moneys: number
+ shoppings: number
+}
+
+export type UserAccessSource = {
+ value: number
+ name: string
+}
+
+export type WeeklyUserActivity = {
+ value: number
+ name: string
+}
+
+export type MonthlySales = {
+ name: string
+ estimate: number
+ actual: number
+}
diff --git a/src/api/dashboard/workplace/index.ts b/src/api/dashboard/workplace/index.ts
new file mode 100644
index 0000000..062f351
--- /dev/null
+++ b/src/api/dashboard/workplace/index.ts
@@ -0,0 +1,22 @@
+import request from '@/axios'
+import type { WorkplaceTotal, Project, Dynamic, Team, RadarData } from './types'
+
+export const getCountApi = (): Promise> => {
+ return request.get({ url: '/mock/workplace/total' })
+}
+
+export const getProjectApi = (): Promise> => {
+ return request.get({ url: '/mock/workplace/project' })
+}
+
+export const getDynamicApi = (): Promise> => {
+ return request.get({ url: '/mock/workplace/dynamic' })
+}
+
+export const getTeamApi = (): Promise> => {
+ return request.get({ url: '/mock/workplace/team' })
+}
+
+export const getRadarApi = (): Promise> => {
+ return request.get({ url: '/mock/workplace/radar' })
+}
diff --git a/src/api/dashboard/workplace/types.ts b/src/api/dashboard/workplace/types.ts
new file mode 100644
index 0000000..da23e74
--- /dev/null
+++ b/src/api/dashboard/workplace/types.ts
@@ -0,0 +1,30 @@
+export type WorkplaceTotal = {
+ project: number
+ access: number
+ todo: number
+}
+
+export type Project = {
+ name: string
+ icon: string
+ message: string
+ personal: string
+ time: Date | number | string
+}
+
+export type Dynamic = {
+ keys: string[]
+ time: Date | number | string
+}
+
+export type Team = {
+ name: string
+ icon: string
+}
+
+export type RadarData = {
+ personal: number
+ team: number
+ max: number
+ name: string
+}
diff --git a/src/api/department/index.ts b/src/api/department/index.ts
new file mode 100644
index 0000000..eb583ac
--- /dev/null
+++ b/src/api/department/index.ts
@@ -0,0 +1,30 @@
+import request from '@/axios'
+import { DepartmentListResponse, DepartmentUserParams, DepartmentUserResponse } from './types'
+
+export const getDepartmentApi = () => {
+ return request.get({ url: '/mock/department/list' })
+}
+
+export const getUserByIdApi = (params: DepartmentUserParams) => {
+ return request.get({ url: '/mock/department/users', params })
+}
+
+export const deleteUserByIdApi = (ids: string[] | number[]) => {
+ return request.post({ url: '/mock/department/user/delete', data: { ids } })
+}
+
+export const saveUserApi = (data: any) => {
+ return request.post({ url: '/mock/department/user/save', data })
+}
+
+export const saveDepartmentApi = (data: any) => {
+ return request.post({ url: '/mock/department/save', data })
+}
+
+export const deleteDepartmentApi = (ids: string[] | number[]) => {
+ return request.post({ url: '/mock/department/delete', data: { ids } })
+}
+
+export const getDepartmentTableApi = (params: any) => {
+ return request.get({ url: '/mock/department/table/list', params })
+}
diff --git a/src/api/department/types.ts b/src/api/department/types.ts
new file mode 100644
index 0000000..027a628
--- /dev/null
+++ b/src/api/department/types.ts
@@ -0,0 +1,32 @@
+export interface DepartmentItem {
+ id: string
+ departmentName: string
+ children?: DepartmentItem[]
+}
+
+export interface DepartmentListResponse {
+ list: DepartmentItem[]
+}
+
+export interface DepartmentUserParams {
+ pageSize: number
+ pageIndex: number
+ id: string
+ username?: string
+ account?: string
+}
+
+export interface DepartmentUserItem {
+ id: string
+ username: string
+ account: string
+ email: string
+ createTime: string
+ role: string
+ department: DepartmentItem
+}
+
+export interface DepartmentUserResponse {
+ list: DepartmentUserItem[]
+ total: number
+}
diff --git a/src/api/login/index.ts b/src/api/login/index.ts
new file mode 100644
index 0000000..b5012b2
--- /dev/null
+++ b/src/api/login/index.ts
@@ -0,0 +1,34 @@
+import request from '@/axios'
+import type { UserType } from './types'
+
+interface RoleParams {
+ roleName: string
+}
+
+export const loginApi = (data: UserType): Promise> => {
+ return request.post({ url: '/mock/user/login', data })
+}
+
+export const loginOutApi = (): Promise => {
+ return request.get({ url: '/mock/user/loginOut' })
+}
+
+export const getUserListApi = ({ params }: AxiosConfig) => {
+ return request.get<{
+ code: string
+ data: {
+ list: UserType[]
+ total: number
+ }
+ }>({ url: '/mock/user/list', params })
+}
+
+export const getAdminRoleApi = (
+ params: RoleParams
+): Promise> => {
+ return request.get({ url: '/mock/role/list', params })
+}
+
+export const getTestRoleApi = (params: RoleParams): Promise> => {
+ return request.get({ url: '/mock/role/list2', params })
+}
diff --git a/src/api/login/types.ts b/src/api/login/types.ts
new file mode 100644
index 0000000..31bb526
--- /dev/null
+++ b/src/api/login/types.ts
@@ -0,0 +1,11 @@
+export interface UserLoginType {
+ username: string
+ password: string
+}
+
+export interface UserType {
+ username: string
+ password: string
+ role: string
+ roleId: string
+}
diff --git a/src/api/menu/index.ts b/src/api/menu/index.ts
new file mode 100644
index 0000000..a2b934c
--- /dev/null
+++ b/src/api/menu/index.ts
@@ -0,0 +1,5 @@
+import request from '@/axios'
+
+export const getMenuListApi = () => {
+ return request.get({ url: '/mock/menu/list' })
+}
diff --git a/src/api/request/index.ts b/src/api/request/index.ts
new file mode 100644
index 0000000..207f913
--- /dev/null
+++ b/src/api/request/index.ts
@@ -0,0 +1,38 @@
+import request from '@/axios'
+import { RequestResponse } from './types'
+
+export const request1 = () => {
+ return request.get>({
+ url: '/mock/request/1'
+ })
+}
+
+export const request2 = () => {
+ return request.get>({
+ url: '/mock/request/2'
+ })
+}
+
+export const request3 = () => {
+ return request.get>({
+ url: '/mock/request/3'
+ })
+}
+
+export const request4 = () => {
+ return request.get>({
+ url: '/mock/request/4'
+ })
+}
+
+export const request5 = () => {
+ return request.get>({
+ url: '/mock/request/5'
+ })
+}
+
+export const expired = () => {
+ return request.get>({
+ url: '/mock/request/expired'
+ })
+}
diff --git a/src/api/request/types.ts b/src/api/request/types.ts
new file mode 100644
index 0000000..9a2063f
--- /dev/null
+++ b/src/api/request/types.ts
@@ -0,0 +1,3 @@
+export interface RequestResponse {
+ data: string
+}
diff --git a/src/api/role/index.ts b/src/api/role/index.ts
new file mode 100644
index 0000000..ecbf9d9
--- /dev/null
+++ b/src/api/role/index.ts
@@ -0,0 +1,5 @@
+import request from '@/axios'
+
+export const getRoleListApi = () => {
+ return request.get({ url: '/mock/role/table' })
+}
diff --git a/src/api/table/index.ts b/src/api/table/index.ts
new file mode 100644
index 0000000..c870f25
--- /dev/null
+++ b/src/api/table/index.ts
@@ -0,0 +1,26 @@
+import request from '@/axios'
+import type { TableData } from './types'
+
+export const getTableListApi = (params: any) => {
+ return request.get({ url: '/mock/example/list', params })
+}
+
+export const getCardTableListApi = (params: any) => {
+ return request.get({ url: '/mock/card/list', params })
+}
+
+export const getTreeTableListApi = (params: any) => {
+ return request.get({ url: '/mock/example/treeList', params })
+}
+
+export const saveTableApi = (data: Partial): Promise => {
+ return request.post({ url: '/mock/example/save', data })
+}
+
+export const getTableDetApi = (id: string): Promise> => {
+ return request.get({ url: '/mock/example/detail', params: { id } })
+}
+
+export const delTableListApi = (ids: string[] | number[]): Promise => {
+ return request.post({ url: '/mock/example/delete', data: { ids } })
+}
diff --git a/src/api/table/types.ts b/src/api/table/types.ts
new file mode 100644
index 0000000..876c111
--- /dev/null
+++ b/src/api/table/types.ts
@@ -0,0 +1,9 @@
+export type TableData = {
+ id: string
+ author: string
+ title: string
+ content: string
+ importance: number
+ display_time: string
+ pageviews: number
+}
diff --git a/src/assets/imgs/avatar.jpg b/src/assets/imgs/avatar.jpg
new file mode 100644
index 0000000..d46a70a
Binary files /dev/null and b/src/assets/imgs/avatar.jpg differ
diff --git a/src/assets/imgs/logo.png b/src/assets/imgs/logo.png
new file mode 100644
index 0000000..b76c71b
Binary files /dev/null and b/src/assets/imgs/logo.png differ
diff --git a/src/assets/imgs/personal-center-bg.jpg b/src/assets/imgs/personal-center-bg.jpg
new file mode 100644
index 0000000..b8ce80b
Binary files /dev/null and b/src/assets/imgs/personal-center-bg.jpg differ
diff --git a/src/assets/svgs/403.svg b/src/assets/svgs/403.svg
new file mode 100644
index 0000000..4500596
--- /dev/null
+++ b/src/assets/svgs/403.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/svgs/404.svg b/src/assets/svgs/404.svg
new file mode 100644
index 0000000..5244d8d
--- /dev/null
+++ b/src/assets/svgs/404.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/svgs/500.svg b/src/assets/svgs/500.svg
new file mode 100644
index 0000000..9c02092
--- /dev/null
+++ b/src/assets/svgs/500.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/svgs/icon.svg b/src/assets/svgs/icon.svg
new file mode 100644
index 0000000..7024bec
--- /dev/null
+++ b/src/assets/svgs/icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/svgs/login-bg.svg b/src/assets/svgs/login-bg.svg
new file mode 100644
index 0000000..bbe06c1
--- /dev/null
+++ b/src/assets/svgs/login-bg.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/svgs/login-box-bg.svg b/src/assets/svgs/login-box-bg.svg
new file mode 100644
index 0000000..ab10040
--- /dev/null
+++ b/src/assets/svgs/login-box-bg.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/svgs/message.svg b/src/assets/svgs/message.svg
new file mode 100644
index 0000000..14ca817
--- /dev/null
+++ b/src/assets/svgs/message.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/svgs/money.svg b/src/assets/svgs/money.svg
new file mode 100644
index 0000000..c1580de
--- /dev/null
+++ b/src/assets/svgs/money.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/svgs/peoples.svg b/src/assets/svgs/peoples.svg
new file mode 100644
index 0000000..aab852e
--- /dev/null
+++ b/src/assets/svgs/peoples.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/svgs/shopping.svg b/src/assets/svgs/shopping.svg
new file mode 100644
index 0000000..f395bc7
--- /dev/null
+++ b/src/assets/svgs/shopping.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/axios/config.ts b/src/axios/config.ts
new file mode 100644
index 0000000..f17f2e4
--- /dev/null
+++ b/src/axios/config.ts
@@ -0,0 +1,53 @@
+import { AxiosResponse, InternalAxiosRequestConfig } from './types'
+import { ElMessage } from 'element-plus'
+import qs from 'qs'
+import { SUCCESS_CODE, TRANSFORM_REQUEST_DATA } from '@/constants'
+import { useUserStoreWithOut } from '@/store/modules/user'
+import { objToFormData } from '@/utils'
+
+const defaultRequestInterceptors = (config: InternalAxiosRequestConfig) => {
+ if (
+ config.method === 'post' &&
+ config.headers['Content-Type'] === 'application/x-www-form-urlencoded'
+ ) {
+ config.data = qs.stringify(config.data)
+ } else if (
+ TRANSFORM_REQUEST_DATA &&
+ config.method === 'post' &&
+ config.headers['Content-Type'] === 'multipart/form-data' &&
+ !(config.data instanceof FormData)
+ ) {
+ config.data = objToFormData(config.data)
+ }
+ if (config.method === 'get' && config.params) {
+ let url = config.url as string
+ url += '?'
+ const keys = Object.keys(config.params)
+ for (const key of keys) {
+ if (config.params[key] !== void 0 && config.params[key] !== null) {
+ url += `${key}=${encodeURIComponent(config.params[key])}&`
+ }
+ }
+ url = url.substring(0, url.length - 1)
+ config.params = {}
+ config.url = url
+ }
+ return config
+}
+
+const defaultResponseInterceptors = (response: AxiosResponse) => {
+ if (response?.config?.responseType === 'blob') {
+ // 如果是文件流,直接过
+ return response
+ } else if (response.data.code === SUCCESS_CODE) {
+ return response.data
+ } else {
+ ElMessage.error(response?.data?.message)
+ if (response?.data?.code === 401) {
+ const userStore = useUserStoreWithOut()
+ userStore.logout()
+ }
+ }
+}
+
+export { defaultResponseInterceptors, defaultRequestInterceptors }
diff --git a/src/axios/index.ts b/src/axios/index.ts
new file mode 100644
index 0000000..60b46c0
--- /dev/null
+++ b/src/axios/index.ts
@@ -0,0 +1,42 @@
+import service from './service'
+import { CONTENT_TYPE } from '@/constants'
+import { useUserStoreWithOut } from '@/store/modules/user'
+
+const request = (option: AxiosConfig) => {
+ const { url, method, params, data, headers, responseType } = option
+
+ const userStore = useUserStoreWithOut()
+ return service.request({
+ url: url,
+ method,
+ params,
+ data: data,
+ responseType: responseType,
+ headers: {
+ 'Content-Type': CONTENT_TYPE,
+ [userStore.getTokenKey ?? 'Authorization']: userStore.getToken ?? '',
+ ...headers
+ }
+ })
+}
+
+export default {
+ get: (option: AxiosConfig) => {
+ return request({ method: 'get', ...option }) as Promise>
+ },
+ post: (option: AxiosConfig) => {
+ return request({ method: 'post', ...option }) as Promise>
+ },
+ delete: (option: AxiosConfig) => {
+ return request({ method: 'delete', ...option }) as Promise>
+ },
+ put: (option: AxiosConfig) => {
+ return request({ method: 'put', ...option }) as Promise>
+ },
+ cancelRequest: (url: string | string[]) => {
+ return service.cancelRequest(url)
+ },
+ cancelAllRequest: () => {
+ return service.cancelAllRequest()
+ }
+}
diff --git a/src/axios/service.ts b/src/axios/service.ts
new file mode 100644
index 0000000..a392522
--- /dev/null
+++ b/src/axios/service.ts
@@ -0,0 +1,77 @@
+import axios, { AxiosError } from 'axios'
+import { defaultRequestInterceptors, defaultResponseInterceptors } from './config'
+
+import { AxiosInstance, InternalAxiosRequestConfig, RequestConfig, AxiosResponse } from './types'
+import { ElMessage } from 'element-plus'
+import { REQUEST_TIMEOUT } from '@/constants'
+
+export const PATH_URL = import.meta.env.VITE_API_BASE_PATH
+
+const abortControllerMap: Map = new Map()
+
+const axiosInstance: AxiosInstance = axios.create({
+ timeout: REQUEST_TIMEOUT,
+ baseURL: PATH_URL
+})
+
+axiosInstance.interceptors.request.use((res: InternalAxiosRequestConfig) => {
+ const controller = new AbortController()
+ const url = res.url || ''
+ res.signal = controller.signal
+ abortControllerMap.set(
+ import.meta.env.VITE_USE_MOCK === 'true' ? url.replace('/mock', '') : url,
+ controller
+ )
+ return res
+})
+
+axiosInstance.interceptors.response.use(
+ (res: AxiosResponse) => {
+ const url = res.config.url || ''
+ abortControllerMap.delete(url)
+ // 这里不能做任何处理,否则后面的 interceptors 拿不到完整的上下文了
+ return res
+ },
+ (error: AxiosError) => {
+ console.log('err: ' + error) // for debug
+ ElMessage.error(error.message)
+ return Promise.reject(error)
+ }
+)
+
+axiosInstance.interceptors.request.use(defaultRequestInterceptors)
+axiosInstance.interceptors.response.use(defaultResponseInterceptors)
+
+const service = {
+ request: (config: RequestConfig) => {
+ return new Promise((resolve, reject) => {
+ if (config.interceptors?.requestInterceptors) {
+ config = config.interceptors.requestInterceptors(config as any)
+ }
+
+ axiosInstance
+ .request(config)
+ .then((res) => {
+ resolve(res)
+ })
+ .catch((err: any) => {
+ reject(err)
+ })
+ })
+ },
+ cancelRequest: (url: string | string[]) => {
+ const urlList = Array.isArray(url) ? url : [url]
+ for (const _url of urlList) {
+ abortControllerMap.get(_url)?.abort()
+ abortControllerMap.delete(_url)
+ }
+ },
+ cancelAllRequest() {
+ for (const [_, controller] of abortControllerMap) {
+ controller.abort()
+ }
+ abortControllerMap.clear()
+ }
+}
+
+export default service
diff --git a/src/axios/types/index.ts b/src/axios/types/index.ts
new file mode 100644
index 0000000..b70eb26
--- /dev/null
+++ b/src/axios/types/index.ts
@@ -0,0 +1,31 @@
+import type {
+ InternalAxiosRequestConfig,
+ AxiosResponse,
+ AxiosRequestConfig,
+ AxiosInstance,
+ AxiosRequestHeaders,
+ AxiosError
+} from 'axios'
+
+interface RequestInterceptors {
+ // 请求拦截
+ requestInterceptors?: (config: InternalAxiosRequestConfig) => InternalAxiosRequestConfig
+ requestInterceptorsCatch?: (err: any) => any
+ // 响应拦截
+ responseInterceptors?: (config: T) => T
+ responseInterceptorsCatch?: (err: any) => any
+}
+
+interface RequestConfig extends AxiosRequestConfig {
+ interceptors?: RequestInterceptors
+}
+
+export {
+ AxiosResponse,
+ RequestInterceptors,
+ RequestConfig,
+ AxiosInstance,
+ InternalAxiosRequestConfig,
+ AxiosRequestHeaders,
+ AxiosError
+}
diff --git a/src/components/Avatars/index.ts b/src/components/Avatars/index.ts
new file mode 100644
index 0000000..5eaa329
--- /dev/null
+++ b/src/components/Avatars/index.ts
@@ -0,0 +1,4 @@
+import Avatars from './src/Avatars.vue'
+
+export type { AvatarItem } from './src/types'
+export { Avatars }
diff --git a/src/components/Avatars/src/Avatars.vue b/src/components/Avatars/src/Avatars.vue
new file mode 100644
index 0000000..1f3619c
--- /dev/null
+++ b/src/components/Avatars/src/Avatars.vue
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +{{ data.length - max }}
+
+
+
+
+
diff --git a/src/components/Avatars/src/types/index.ts b/src/components/Avatars/src/types/index.ts
new file mode 100644
index 0000000..c2554ee
--- /dev/null
+++ b/src/components/Avatars/src/types/index.ts
@@ -0,0 +1,4 @@
+export interface AvatarItem {
+ url: string
+ name?: string
+}
diff --git a/src/components/Backtop/index.ts b/src/components/Backtop/index.ts
new file mode 100644
index 0000000..96de88d
--- /dev/null
+++ b/src/components/Backtop/index.ts
@@ -0,0 +1,3 @@
+import Backtop from './src/Backtop.vue'
+
+export { Backtop }
diff --git a/src/components/Backtop/src/Backtop.vue b/src/components/Backtop/src/Backtop.vue
new file mode 100644
index 0000000..4619017
--- /dev/null
+++ b/src/components/Backtop/src/Backtop.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/src/components/Breadcrumb/index.ts b/src/components/Breadcrumb/index.ts
new file mode 100644
index 0000000..93ffe70
--- /dev/null
+++ b/src/components/Breadcrumb/index.ts
@@ -0,0 +1,3 @@
+import Breadcrumb from './src/Breadcrumb.vue'
+
+export { Breadcrumb }
diff --git a/src/components/Breadcrumb/src/Breadcrumb.vue b/src/components/Breadcrumb/src/Breadcrumb.vue
new file mode 100644
index 0000000..cc79f1b
--- /dev/null
+++ b/src/components/Breadcrumb/src/Breadcrumb.vue
@@ -0,0 +1,126 @@
+
+
+
diff --git a/src/components/Breadcrumb/src/helper.ts b/src/components/Breadcrumb/src/helper.ts
new file mode 100644
index 0000000..690cff9
--- /dev/null
+++ b/src/components/Breadcrumb/src/helper.ts
@@ -0,0 +1,30 @@
+import { pathResolve } from '@/utils/routerHelper'
+
+export const filterBreadcrumb = (
+ routes: AppRouteRecordRaw[],
+ parentPath = ''
+): AppRouteRecordRaw[] => {
+ const res: AppRouteRecordRaw[] = []
+
+ for (const route of routes) {
+ const meta = route?.meta
+ if (meta.hidden && !meta.canTo) {
+ continue
+ }
+
+ const data: AppRouteRecordRaw =
+ !meta.alwaysShow && route.children?.length === 1
+ ? { ...route.children[0], path: pathResolve(route.path, route.children[0].path) }
+ : { ...route }
+
+ data.path = pathResolve(parentPath, data.path)
+
+ if (data.children) {
+ data.children = filterBreadcrumb(data.children, data.path)
+ }
+ if (data) {
+ res.push(data)
+ }
+ }
+ return res
+}
diff --git a/src/components/Button/index.ts b/src/components/Button/index.ts
new file mode 100644
index 0000000..6ae43b1
--- /dev/null
+++ b/src/components/Button/index.ts
@@ -0,0 +1,3 @@
+import BaseButton from './src/Button.vue'
+
+export { BaseButton }
diff --git a/src/components/Button/src/Button.vue b/src/components/Button/src/Button.vue
new file mode 100644
index 0000000..709f4a7
--- /dev/null
+++ b/src/components/Button/src/Button.vue
@@ -0,0 +1,121 @@
+
+
+
+ emits('click')"
+ >
+
+
+
+
+
diff --git a/src/components/CodeEditor/index.ts b/src/components/CodeEditor/index.ts
new file mode 100644
index 0000000..5bf3e9e
--- /dev/null
+++ b/src/components/CodeEditor/index.ts
@@ -0,0 +1,3 @@
+import CodeEditor from './src/CodeEditor.vue'
+
+export { CodeEditor }
diff --git a/src/components/CodeEditor/src/CodeEditor.vue b/src/components/CodeEditor/src/CodeEditor.vue
new file mode 100644
index 0000000..3ec2495
--- /dev/null
+++ b/src/components/CodeEditor/src/CodeEditor.vue
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/CodeEditor/src/config/config.ts b/src/components/CodeEditor/src/config/config.ts
new file mode 100644
index 0000000..4fa7b30
--- /dev/null
+++ b/src/components/CodeEditor/src/config/config.ts
@@ -0,0 +1,129 @@
+export const languageOptions = [
+ { label: 'plaintext', value: 'plaintext' },
+ { label: 'abap', value: 'abap' },
+ { label: 'apex', value: 'apex' },
+ { label: 'azcli', value: 'azcli' },
+ { label: 'bat', value: 'bat' },
+ { label: 'bicep', value: 'bicep' },
+ { label: 'cameligo', value: 'cameligo' },
+ { label: 'clojure', value: 'clojure' },
+ { label: 'coffeescript', value: 'coffeescript' },
+ { label: 'c', value: 'c' },
+ { label: 'cpp', value: 'cpp' },
+ { label: 'csharp', value: 'csharp' },
+ { label: 'csp', value: 'csp' },
+ { label: 'css', value: 'css' },
+ { label: 'cypher', value: 'cypher' },
+ { label: 'dart', value: 'dart' },
+ { label: 'dockerfile', value: 'dockerfile' },
+ { label: 'ecl', value: 'ecl' },
+ { label: 'elixir', value: 'elixir' },
+ { label: 'flow9', value: 'flow9' },
+ { label: 'fsharp', value: 'fsharp' },
+ { label: 'freemarker2', value: 'freemarker2' },
+ {
+ label: 'freemarker2.tag-angle.interpolation-dollar',
+ value: 'freemarker2.tag-angle.interpolation-dollar'
+ },
+ {
+ label: 'freemarker2.tag-bracket.interpolation-dollar',
+ value: 'freemarker2.tag-bracket.interpolation-dollar'
+ },
+ {
+ label: 'freemarker2.tag-angle.interpolation-bracket',
+ value: 'freemarker2.tag-angle.interpolation-bracket'
+ },
+ {
+ label: 'freemarker2.tag-bracket.interpolation-bracket',
+ value: 'freemarker2.tag-bracket.interpolation-bracket'
+ },
+ {
+ label: 'freemarker2.tag-auto.interpolation-dollar',
+ value: 'freemarker2.tag-auto.interpolation-dollar'
+ },
+ {
+ label: 'freemarker2.tag-auto.interpolation-bracket',
+ value: 'freemarker2.tag-auto.interpolation-bracket'
+ },
+ { label: 'go', value: 'go' },
+ { label: 'graphql', value: 'graphql' },
+ { label: 'handlebars', value: 'handlebars' },
+ { label: 'hcl', value: 'hcl' },
+ { label: 'html', value: 'html' },
+ { label: 'ini', value: 'ini' },
+ { label: 'java', value: 'java' },
+ { label: 'javascript', value: 'javascript' },
+ { label: 'julia', value: 'julia' },
+ { label: 'kotlin', value: 'kotlin' },
+ { label: 'less', value: 'less' },
+ { label: 'lexon', value: 'lexon' },
+ { label: 'lua', value: 'lua' },
+ { label: 'liquid', value: 'liquid' },
+ { label: 'm3', value: 'm3' },
+ { label: 'markdown', value: 'markdown' },
+ { label: 'mdx', value: 'mdx' },
+ { label: 'mips', value: 'mips' },
+ { label: 'msdax', value: 'msdax' },
+ { label: 'mysql', value: 'mysql' },
+ { label: 'objective-c', value: 'objective-c' },
+ { label: 'pascal', value: 'pascal' },
+ { label: 'pascaligo', value: 'pascaligo' },
+ { label: 'perl', value: 'perl' },
+ { label: 'pgsql', value: 'pgsql' },
+ { label: 'php', value: 'php' },
+ { label: 'pla', value: 'pla' },
+ { label: 'postiats', value: 'postiats' },
+ { label: 'powerquery', value: 'powerquery' },
+ { label: 'powershell', value: 'powershell' },
+ { label: 'proto', value: 'proto' },
+ { label: 'pug', value: 'pug' },
+ { label: 'python', value: 'python' },
+ { label: 'qsharp', value: 'qsharp' },
+ { label: 'r', value: 'r' },
+ { label: 'razor', value: 'razor' },
+ { label: 'redis', value: 'redis' },
+ { label: 'redshift', value: 'redshift' },
+ { label: 'restructuredtext', value: 'restructuredtext' },
+ { label: 'ruby', value: 'ruby' },
+ { label: 'rust', value: 'rust' },
+ { label: 'sb', value: 'sb' },
+ { label: 'scala', value: 'scala' },
+ { label: 'scheme', value: 'scheme' },
+ { label: 'scss', value: 'scss' },
+ { label: 'shell', value: 'shell' },
+ { label: 'sol', value: 'sol' },
+ { label: 'aes', value: 'aes' },
+ { label: 'sparql', value: 'sparql' },
+ { label: 'sql', value: 'sql' },
+ { label: 'st', value: 'st' },
+ { label: 'swift', value: 'swift' },
+ { label: 'systemverilog', value: 'systemverilog' },
+ { label: 'verilog', value: 'verilog' },
+ { label: 'tcl', value: 'tcl' },
+ { label: 'twig', value: 'twig' },
+ { label: 'typescript', value: 'typescript' },
+ { label: 'vb', value: 'vb' },
+ { label: 'wgsl', value: 'wgsl' },
+ { label: 'xml', value: 'xml' },
+ { label: 'yaml', value: 'yaml' },
+ { label: 'json', value: 'json' }
+]
+
+export const themeOptions = [
+ {
+ label: 'vs',
+ value: 'vs'
+ },
+ {
+ label: 'vs-dark',
+ value: 'vs-dark'
+ },
+ {
+ label: 'hc-black',
+ value: 'hc-black'
+ },
+ {
+ label: 'hc-light',
+ value: 'hc-light'
+ }
+]
diff --git a/src/components/Collapse/index.ts b/src/components/Collapse/index.ts
new file mode 100644
index 0000000..73f65a3
--- /dev/null
+++ b/src/components/Collapse/index.ts
@@ -0,0 +1,3 @@
+import Collapse from './src/Collapse.vue'
+
+export { Collapse }
diff --git a/src/components/Collapse/src/Collapse.vue b/src/components/Collapse/src/Collapse.vue
new file mode 100644
index 0000000..542d9d3
--- /dev/null
+++ b/src/components/Collapse/src/Collapse.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
diff --git a/src/components/ConfigGlobal/index.ts b/src/components/ConfigGlobal/index.ts
new file mode 100644
index 0000000..eaeb7d0
--- /dev/null
+++ b/src/components/ConfigGlobal/index.ts
@@ -0,0 +1,5 @@
+import ConfigGlobal from './src/ConfigGlobal.vue'
+
+export type { ConfigGlobalTypes } from './src/types'
+
+export { ConfigGlobal }
diff --git a/src/components/ConfigGlobal/src/ConfigGlobal.vue b/src/components/ConfigGlobal/src/ConfigGlobal.vue
new file mode 100644
index 0000000..5bd90cf
--- /dev/null
+++ b/src/components/ConfigGlobal/src/ConfigGlobal.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
diff --git a/src/components/ConfigGlobal/src/types/index.ts b/src/components/ConfigGlobal/src/types/index.ts
new file mode 100644
index 0000000..d41e4d3
--- /dev/null
+++ b/src/components/ConfigGlobal/src/types/index.ts
@@ -0,0 +1,5 @@
+import { ComponentSize } from 'element-plus'
+
+export interface ConfigGlobalTypes {
+ size?: ComponentSize
+}
diff --git a/src/components/ContentDetailWrap/index.ts b/src/components/ContentDetailWrap/index.ts
new file mode 100644
index 0000000..1871cac
--- /dev/null
+++ b/src/components/ContentDetailWrap/index.ts
@@ -0,0 +1,3 @@
+import ContentDetailWrap from './src/ContentDetailWrap.vue'
+
+export { ContentDetailWrap }
diff --git a/src/components/ContentDetailWrap/src/ContentDetailWrap.vue b/src/components/ContentDetailWrap/src/ContentDetailWrap.vue
new file mode 100644
index 0000000..29b4ff7
--- /dev/null
+++ b/src/components/ContentDetailWrap/src/ContentDetailWrap.vue
@@ -0,0 +1,25 @@
+
+
+
+
+
diff --git a/src/components/ContentWrap/index.ts b/src/components/ContentWrap/index.ts
new file mode 100644
index 0000000..8c22cc8
--- /dev/null
+++ b/src/components/ContentWrap/index.ts
@@ -0,0 +1,3 @@
+import ContentWrap from './src/ContentWrap.vue'
+
+export { ContentWrap }
diff --git a/src/components/ContentWrap/src/ContentWrap.vue b/src/components/ContentWrap/src/ContentWrap.vue
new file mode 100644
index 0000000..8557e81
--- /dev/null
+++ b/src/components/ContentWrap/src/ContentWrap.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
{{ title }}
+
+
+ {{ message }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/ContextMenu/index.ts b/src/components/ContextMenu/index.ts
new file mode 100644
index 0000000..1b5442d
--- /dev/null
+++ b/src/components/ContextMenu/index.ts
@@ -0,0 +1,12 @@
+import ContextMenu from './src/ContextMenu.vue'
+import { ElDropdown } from 'element-plus'
+import type { RouteLocationNormalizedLoaded } from 'vue-router'
+
+export type { ContextMenuSchema } from './src/types'
+
+export interface ContextMenuExpose {
+ elDropdownMenuRef: ComponentRef
+ tagItem: RouteLocationNormalizedLoaded
+}
+
+export { ContextMenu }
diff --git a/src/components/ContextMenu/src/ContextMenu.vue b/src/components/ContextMenu/src/ContextMenu.vue
new file mode 100644
index 0000000..9583037
--- /dev/null
+++ b/src/components/ContextMenu/src/ContextMenu.vue
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+ {{ t(item.label) }}
+
+
+
+
+
diff --git a/src/components/ContextMenu/src/types/index.ts b/src/components/ContextMenu/src/types/index.ts
new file mode 100644
index 0000000..b2be72b
--- /dev/null
+++ b/src/components/ContextMenu/src/types/index.ts
@@ -0,0 +1,7 @@
+export interface ContextMenuSchema {
+ disabled?: boolean
+ divided?: boolean
+ icon?: string
+ label: string
+ command?: (item: ContextMenuSchema) => void
+}
diff --git a/src/components/CountTo/index.ts b/src/components/CountTo/index.ts
new file mode 100644
index 0000000..2119f02
--- /dev/null
+++ b/src/components/CountTo/index.ts
@@ -0,0 +1,3 @@
+import CountTo from './src/CountTo.vue'
+
+export { CountTo }
diff --git a/src/components/CountTo/src/CountTo.vue b/src/components/CountTo/src/CountTo.vue
new file mode 100644
index 0000000..cab8ea9
--- /dev/null
+++ b/src/components/CountTo/src/CountTo.vue
@@ -0,0 +1,180 @@
+
+
+
+
+ {{ displayValue }}
+
+
diff --git a/src/components/Descriptions/index.ts b/src/components/Descriptions/index.ts
new file mode 100644
index 0000000..8f9a0f0
--- /dev/null
+++ b/src/components/Descriptions/index.ts
@@ -0,0 +1,5 @@
+import Descriptions from './src/Descriptions.vue'
+
+export type { DescriptionsSchema } from './src/types'
+
+export { Descriptions }
diff --git a/src/components/Descriptions/src/Descriptions.vue b/src/components/Descriptions/src/Descriptions.vue
new file mode 100644
index 0000000..a4b222b
--- /dev/null
+++ b/src/components/Descriptions/src/Descriptions.vue
@@ -0,0 +1,197 @@
+
+
+
diff --git a/src/components/Descriptions/src/types/index.ts b/src/components/Descriptions/src/types/index.ts
new file mode 100644
index 0000000..be55b1c
--- /dev/null
+++ b/src/components/Descriptions/src/types/index.ts
@@ -0,0 +1,15 @@
+export interface DescriptionsSchema {
+ span?: number // 占多少分
+ field: string // 字段名
+ label?: string // label名
+ width?: string | number
+ minWidth?: string | number
+ align?: 'left' | 'center' | 'right'
+ labelAlign?: 'left' | 'center' | 'right'
+ className?: string
+ labelClassName?: string
+ slots?: {
+ default?: (...args: any[]) => JSX.Element | null
+ label?: (...args: any[]) => JSX.Element | null
+ }
+}
diff --git a/src/components/Dialog/hooks/useResize.ts b/src/components/Dialog/hooks/useResize.ts
new file mode 100644
index 0000000..d52b279
--- /dev/null
+++ b/src/components/Dialog/hooks/useResize.ts
@@ -0,0 +1,178 @@
+import { ref } from 'vue'
+
+export const useResize = (props?: {
+ minHeightPx?: number
+ minWidthPx?: number
+ initHeight?: number
+ initWidth?: number
+}) => {
+ const {
+ minHeightPx = 400,
+ minWidthPx = window.innerWidth / 2,
+ initHeight = 400,
+ initWidth = window.innerWidth / 2
+ } = props || {}
+ // 屏幕宽度的 50% 作为最小宽度
+ // const minWidthPx = window.innerWidth / 2
+ // 固定的最小高度 400px
+ // const minHeightPx = 400
+ // 初始高度限制为 400px
+ const maxHeight = ref(initHeight + 'px')
+ // 初始宽度限制为 50%
+ const minWidth = ref(initWidth + 'px')
+ const setupDrag = (elDialog: any, el: any) => {
+ // 获取对话框元素
+ // 是否正在调整大小的标志
+ let isResizing = false
+ // 当前调整的方向
+ let currentResizeDirection = ''
+
+ // 鼠标移动时的事件处理器,用于检测鼠标位置并设置相应的光标样式
+ const handleMouseMove = (e: any) => {
+ const rect = elDialog.getBoundingClientRect()
+ // 鼠标相对于对话框左侧的偏移量
+ const offsetX = e.clientX - rect.left
+ // 鼠标相对于对话框顶部的偏移量
+ const offsetY = e.clientY - rect.top
+ const width = elDialog.clientWidth
+ const height = elDialog.clientHeight
+
+ // 获取对话框的内边距
+ const computedStyle = window.getComputedStyle(elDialog)
+ const paddingLeft = parseFloat(computedStyle.paddingLeft)
+ const paddingRight = parseFloat(computedStyle.paddingRight)
+ const paddingBottom = parseFloat(computedStyle.paddingBottom)
+ const paddingTop = parseFloat(computedStyle.paddingTop)
+
+ // 根据鼠标位置设置相应的光标样式和调整方向
+ if (!isResizing) {
+ if (offsetX < paddingLeft && offsetY > paddingTop && offsetY < height - paddingBottom) {
+ elDialog.style.cursor = 'ew-resize' // 左右箭头
+ currentResizeDirection = 'left'
+ } else if (
+ offsetX > width - paddingRight &&
+ offsetY > paddingTop &&
+ offsetY < height - paddingBottom
+ ) {
+ elDialog.style.cursor = 'ew-resize' // 左右箭头
+ currentResizeDirection = 'right'
+ } else if (
+ offsetY < paddingTop &&
+ offsetX > paddingLeft &&
+ offsetX < width - paddingRight
+ ) {
+ elDialog.style.cursor = 'ns-resize' // 上下箭头
+ currentResizeDirection = 'top'
+ } else if (
+ offsetY > height - paddingBottom &&
+ offsetX > paddingLeft &&
+ offsetX < width - paddingRight
+ ) {
+ elDialog.style.cursor = 'ns-resize' // 上下箭头
+ currentResizeDirection = 'bottom'
+ } else if (offsetX < paddingLeft && offsetY < paddingTop) {
+ elDialog.style.cursor = 'nwse-resize' // 左上右下箭头
+ currentResizeDirection = 'top-left'
+ } else if (offsetX > width - paddingRight && offsetY < paddingTop) {
+ elDialog.style.cursor = 'nesw-resize' // 右上左下箭头
+ currentResizeDirection = 'top-right'
+ } else if (offsetX < paddingLeft && offsetY > height - paddingBottom) {
+ elDialog.style.cursor = 'nesw-resize' // 右上左下箭头
+ currentResizeDirection = 'bottom-left'
+ } else if (offsetX > width - paddingRight && offsetY > height - paddingBottom) {
+ elDialog.style.cursor = 'nwse-resize' // 左上右下箭头
+ currentResizeDirection = 'bottom-right'
+ } else {
+ elDialog.style.cursor = 'default'
+ currentResizeDirection = ''
+ }
+ }
+ }
+
+ // 鼠标按下时的事件处理器,开始调整对话框大小
+ const handleMouseDown = (e) => {
+ if (currentResizeDirection) {
+ isResizing = true
+
+ const initialX = e.clientX
+ const initialY = e.clientY
+ const initialWidth = elDialog.clientWidth
+ const initialHeight = el.querySelector('.el-dialog__body').clientHeight
+
+ // 调整大小的事件处理器
+ const handleResizing = (e: any) => {
+ if (!isResizing) return
+
+ let newWidth = initialWidth
+ let newHeight = initialHeight
+
+ // 根据当前调整方向计算新的宽度和高度
+ if (currentResizeDirection.includes('right')) {
+ newWidth = Math.max(minWidthPx, initialWidth + (e.clientX - initialX) * 2)
+ minWidth.value = `${newWidth}px`
+ }
+
+ if (currentResizeDirection.includes('left')) {
+ newWidth = Math.max(minWidthPx, initialWidth - (e.clientX - initialX) * 2)
+ minWidth.value = `${newWidth}px`
+ }
+
+ if (currentResizeDirection.includes('bottom')) {
+ newHeight = Math.max(minHeightPx, initialHeight + (e.clientY - initialY) * 2 - 20)
+ maxHeight.value = `${Math.min(newHeight, window.innerHeight - 165)}px`
+ }
+
+ if (currentResizeDirection.includes('top')) {
+ newHeight = Math.max(minHeightPx, initialHeight - (e.clientY - initialY) * 2 - 20)
+ maxHeight.value = `${Math.min(newHeight, window.innerHeight - 165)}px`
+ }
+
+ if (currentResizeDirection === 'top-left') {
+ newWidth = Math.max(minWidthPx, initialWidth - (e.clientX - initialX) * 2)
+ minWidth.value = `${newWidth}px`
+ newHeight = Math.max(minHeightPx, initialHeight - (e.clientY - initialY) * 2 - 20)
+ maxHeight.value = `${Math.min(newHeight, window.innerHeight - 165)}px`
+ }
+
+ if (currentResizeDirection === 'top-right') {
+ newWidth = Math.max(minWidthPx, initialWidth + (e.clientX - initialX) * 2)
+ minWidth.value = `${newWidth}px`
+ newHeight = Math.max(minHeightPx, initialHeight - (e.clientY - initialY) * 2 - 20)
+ maxHeight.value = `${Math.min(newHeight, window.innerHeight - 165)}px`
+ }
+
+ if (currentResizeDirection === 'bottom-left') {
+ newWidth = Math.max(minWidthPx, initialWidth - (e.clientX - initialX) * 2)
+ minWidth.value = `${newWidth}px`
+ newHeight = Math.max(minHeightPx, initialHeight + (e.clientY - initialY) * 2 - 20)
+ maxHeight.value = `${Math.min(newHeight, window.innerHeight - 165)}px`
+ }
+
+ if (currentResizeDirection === 'bottom-right') {
+ newWidth = Math.max(minWidthPx, initialWidth + (e.clientX - initialX) * 2)
+ minWidth.value = `${newWidth}px`
+ newHeight = Math.max(minHeightPx, initialHeight + (e.clientY - initialY) * 2 - 20)
+ maxHeight.value = `${Math.min(newHeight, window.innerHeight - 165)}px`
+ }
+ }
+ // 停止调整大小的事件处理器
+ const stopResizing = () => {
+ isResizing = false
+ document.removeEventListener('mousemove', handleResizing)
+ document.removeEventListener('mouseup', stopResizing)
+ }
+
+ document.addEventListener('mousemove', handleResizing)
+ document.addEventListener('mouseup', stopResizing)
+ }
+ }
+ elDialog.addEventListener('mousemove', handleMouseMove)
+ elDialog.addEventListener('mousedown', handleMouseDown)
+ }
+
+ return {
+ setupDrag,
+ maxHeight,
+ minWidth
+ }
+}
diff --git a/src/components/Dialog/index.ts b/src/components/Dialog/index.ts
new file mode 100644
index 0000000..1655dad
--- /dev/null
+++ b/src/components/Dialog/index.ts
@@ -0,0 +1,3 @@
+import Dialog from './src/Dialog.vue'
+
+export { Dialog }
diff --git a/src/components/Dialog/src/Dialog.vue b/src/components/Dialog/src/Dialog.vue
new file mode 100644
index 0000000..611d702
--- /dev/null
+++ b/src/components/Dialog/src/Dialog.vue
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/Dialog/src/ResizeDialog.vue b/src/components/Dialog/src/ResizeDialog.vue
new file mode 100644
index 0000000..d604e12
--- /dev/null
+++ b/src/components/Dialog/src/ResizeDialog.vue
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/Echart/index.ts b/src/components/Echart/index.ts
new file mode 100644
index 0000000..4822092
--- /dev/null
+++ b/src/components/Echart/index.ts
@@ -0,0 +1,3 @@
+import Echart from './src/Echart.vue'
+
+export { Echart }
diff --git a/src/components/Echart/src/Echart.vue b/src/components/Echart/src/Echart.vue
new file mode 100644
index 0000000..58cae29
--- /dev/null
+++ b/src/components/Echart/src/Echart.vue
@@ -0,0 +1,115 @@
+
+
+
+
+
diff --git a/src/components/Editor/index.ts b/src/components/Editor/index.ts
new file mode 100644
index 0000000..3fbf0a9
--- /dev/null
+++ b/src/components/Editor/index.ts
@@ -0,0 +1,8 @@
+import Editor from './src/Editor.vue'
+import { IDomEditor } from '@wangeditor/editor'
+
+export interface EditorExpose {
+ getEditorRef: () => Promise
+}
+
+export { Editor }
diff --git a/src/components/Editor/src/Editor.vue b/src/components/Editor/src/Editor.vue
new file mode 100644
index 0000000..0bb3452
--- /dev/null
+++ b/src/components/Editor/src/Editor.vue
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/Error/index.ts b/src/components/Error/index.ts
new file mode 100644
index 0000000..a52c6f9
--- /dev/null
+++ b/src/components/Error/index.ts
@@ -0,0 +1,3 @@
+import Error from './src/Error.vue'
+
+export { Error }
diff --git a/src/components/Error/src/Error.vue b/src/components/Error/src/Error.vue
new file mode 100644
index 0000000..b18af60
--- /dev/null
+++ b/src/components/Error/src/Error.vue
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
{{ errorMap[type].message }}
+
+ {{ errorMap[type].buttonText }}
+
+
+
+
diff --git a/src/components/Footer/index.ts b/src/components/Footer/index.ts
new file mode 100644
index 0000000..bd052e0
--- /dev/null
+++ b/src/components/Footer/index.ts
@@ -0,0 +1,3 @@
+import Footer from './src/Footer.vue'
+
+export { Footer }
diff --git a/src/components/Footer/src/Footer.vue b/src/components/Footer/src/Footer.vue
new file mode 100644
index 0000000..50b7ce7
--- /dev/null
+++ b/src/components/Footer/src/Footer.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
diff --git a/src/components/Form/index.ts b/src/components/Form/index.ts
new file mode 100644
index 0000000..6688425
--- /dev/null
+++ b/src/components/Form/index.ts
@@ -0,0 +1,48 @@
+import Form from './src/Form.vue'
+import type { FormSchema, FormSetProps } from './src/types'
+export type {
+ ComponentNameEnum,
+ ComponentName,
+ InputComponentProps,
+ AutocompleteComponentProps,
+ InputNumberComponentProps,
+ SelectOption,
+ SelectComponentProps,
+ SelectV2ComponentProps,
+ CascaderComponentProps,
+ SwitchComponentProps,
+ RateComponentProps,
+ ColorPickerComponentProps,
+ TransferComponentProps,
+ RadioOption,
+ RadioGroupComponentProps,
+ RadioButtonComponentProps,
+ CheckboxOption,
+ CheckboxGroupComponentProps,
+ DividerComponentProps,
+ DatePickerComponentProps,
+ DateTimePickerComponentProps,
+ TimePickerComponentProps,
+ TimeSelectComponentProps,
+ ColProps,
+ FormSetProps,
+ FormItemProps,
+ FormSchema,
+ FormProps,
+ PlaceholderModel,
+ InputPasswordComponentProps,
+ TreeSelectComponentProps
+} from './src/types'
+
+export interface FormExpose {
+ setValues: (data: Recordable) => void
+ setProps: (props: Recordable) => void
+ delSchema: (field: string) => void
+ addSchema: (formSchema: FormSchema, index?: number) => void
+ setSchema: (schemaProps: FormSetProps[]) => void
+ formModel: Recordable
+ getComponentExpose: (field: string) => any
+ getFormItemExpose: (field: string) => any
+}
+
+export { Form }
diff --git a/src/components/Form/src/Form.vue b/src/components/Form/src/Form.vue
new file mode 100644
index 0000000..22de784
--- /dev/null
+++ b/src/components/Form/src/Form.vue
@@ -0,0 +1,443 @@
+
+
+
diff --git a/src/components/Form/src/components/useRenderCheckbox.tsx b/src/components/Form/src/components/useRenderCheckbox.tsx
new file mode 100644
index 0000000..63afb10
--- /dev/null
+++ b/src/components/Form/src/components/useRenderCheckbox.tsx
@@ -0,0 +1,31 @@
+import { FormSchema, ComponentNameEnum, CheckboxGroupComponentProps } from '../types'
+import { ElCheckbox, ElCheckboxButton } from 'element-plus'
+import { defineComponent } from 'vue'
+
+export const useRenderCheckbox = () => {
+ const renderCheckboxOptions = (item: FormSchema) => {
+ // 如果有别名,就取别名
+ const componentProps = item?.componentProps as CheckboxGroupComponentProps
+ const valueAlias = componentProps?.props?.value || 'value'
+ const labelAlias = componentProps?.props?.label || 'label'
+ const disabledAlias = componentProps?.props?.disabled || 'disabled'
+ const Com = (
+ item.component === ComponentNameEnum.CHECKBOX_GROUP ? ElCheckbox : ElCheckboxButton
+ ) as ReturnType
+ return componentProps?.options?.map((option) => {
+ const { ...other } = option
+ return (
+
+ )
+ })
+ }
+
+ return {
+ renderCheckboxOptions
+ }
+}
diff --git a/src/components/Form/src/components/useRenderRadio.tsx b/src/components/Form/src/components/useRenderRadio.tsx
new file mode 100644
index 0000000..fc9842b
--- /dev/null
+++ b/src/components/Form/src/components/useRenderRadio.tsx
@@ -0,0 +1,31 @@
+import { FormSchema, ComponentNameEnum, RadioGroupComponentProps } from '../types'
+import { ElRadio, ElRadioButton } from 'element-plus'
+import { defineComponent } from 'vue'
+
+export const useRenderRadio = () => {
+ const renderRadioOptions = (item: FormSchema) => {
+ // 如果有别名,就取别名
+ const componentProps = item?.componentProps as RadioGroupComponentProps
+ const valueAlias = componentProps?.props?.value || 'value'
+ const labelAlias = componentProps?.props?.label || 'label'
+ const disabledAlias = componentProps?.props?.disabled || 'disabled'
+ const Com = (
+ item.component === ComponentNameEnum.RADIO_GROUP ? ElRadio : ElRadioButton
+ ) as ReturnType
+ return componentProps?.options?.map((option) => {
+ const { ...other } = option
+ return (
+
+ )
+ })
+ }
+
+ return {
+ renderRadioOptions
+ }
+}
diff --git a/src/components/Form/src/components/useRenderSelect.tsx b/src/components/Form/src/components/useRenderSelect.tsx
new file mode 100644
index 0000000..46389af
--- /dev/null
+++ b/src/components/Form/src/components/useRenderSelect.tsx
@@ -0,0 +1,58 @@
+import { ElOption, ElOptionGroup } from 'element-plus'
+import { FormSchema, SelectComponentProps, SelectOption } from '../types'
+
+export const useRenderSelect = () => {
+ // 渲染 select options
+ const renderSelectOptions = (item: FormSchema) => {
+ const componentsProps = item?.componentProps as SelectComponentProps
+ const optionGroupDefaultSlot = componentsProps?.slots?.optionGroupDefault
+ // 如果有别名,就取别名
+ const labelAlias = componentsProps?.props?.label
+ const keyAlias = componentsProps?.props?.key
+ return componentsProps?.options?.map((option) => {
+ if (option?.options?.length) {
+ return optionGroupDefaultSlot ? (
+ optionGroupDefaultSlot(option)
+ ) : (
+
+ {{
+ default: () =>
+ option?.options?.map((v) => {
+ return renderSelectOptionItem(item, v)
+ })
+ }}
+
+ )
+ } else {
+ return renderSelectOptionItem(item, option)
+ }
+ })
+ }
+
+ // 渲染 select option item
+ const renderSelectOptionItem = (item: FormSchema, option: SelectOption) => {
+ // 如果有别名,就取别名
+ const componentsProps = item.componentProps as SelectComponentProps
+ const labelAlias = componentsProps?.props?.label
+ const valueAlias = componentsProps?.props?.value
+ const keyAlias = componentsProps?.props?.key
+ const optionDefaultSlot = componentsProps.slots?.optionDefault
+
+ return (
+
+ {{
+ default: () => (optionDefaultSlot ? optionDefaultSlot(option) : undefined)
+ }}
+
+ )
+ }
+
+ return {
+ renderSelectOptions
+ }
+}
diff --git a/src/components/Form/src/helper/componentMap.ts b/src/components/Form/src/helper/componentMap.ts
new file mode 100644
index 0000000..df2714f
--- /dev/null
+++ b/src/components/Form/src/helper/componentMap.ts
@@ -0,0 +1,59 @@
+import type { Component } from 'vue'
+import {
+ ElCascader,
+ ElCheckboxGroup,
+ ElColorPicker,
+ ElDatePicker,
+ ElInput,
+ ElInputNumber,
+ ElRadioGroup,
+ ElRate,
+ ElSelect,
+ ElSelectV2,
+ ElSlider,
+ ElSwitch,
+ ElTimePicker,
+ ElTimeSelect,
+ ElTransfer,
+ ElAutocomplete,
+ ElDivider,
+ ElTreeSelect,
+ ElUpload
+} from 'element-plus'
+import { InputPassword } from '@/components/InputPassword'
+import { Editor } from '@/components/Editor'
+import { JsonEditor } from '@/components/JsonEditor'
+import { IconPicker } from '@/components/IconPicker'
+import { IAgree } from '@/components/IAgree'
+import { ComponentName } from '../types'
+
+const componentMap: Recordable = {
+ RadioGroup: ElRadioGroup,
+ RadioButton: ElRadioGroup,
+ CheckboxGroup: ElCheckboxGroup,
+ CheckboxButton: ElCheckboxGroup,
+ Input: ElInput,
+ Autocomplete: ElAutocomplete,
+ InputNumber: ElInputNumber,
+ Select: ElSelect,
+ Cascader: ElCascader,
+ Switch: ElSwitch,
+ Slider: ElSlider,
+ TimePicker: ElTimePicker,
+ DatePicker: ElDatePicker,
+ Rate: ElRate,
+ ColorPicker: ElColorPicker,
+ Transfer: ElTransfer,
+ Divider: ElDivider,
+ TimeSelect: ElTimeSelect,
+ SelectV2: ElSelectV2,
+ InputPassword: InputPassword,
+ Editor: Editor,
+ TreeSelect: ElTreeSelect,
+ Upload: ElUpload,
+ JsonEditor: JsonEditor,
+ IconPicker: IconPicker,
+ IAgree: IAgree
+}
+
+export { componentMap }
diff --git a/src/components/Form/src/helper/index.ts b/src/components/Form/src/helper/index.ts
new file mode 100644
index 0000000..2ba1dc2
--- /dev/null
+++ b/src/components/Form/src/helper/index.ts
@@ -0,0 +1,169 @@
+import { useI18n } from '@/hooks/web/useI18n'
+import { PlaceholderModel, FormSchema, ComponentNameEnum, ColProps } from '../types'
+import { isFunction } from '@/utils/is'
+import { firstUpperCase, humpToDash } from '@/utils'
+import { set, get } from 'lodash-es'
+
+const { t } = useI18n()
+
+/**
+ *
+ * @param schema 对应组件数据
+ * @returns 返回提示信息对象
+ * @description 用于自动设置placeholder
+ */
+export const setTextPlaceholder = (schema: FormSchema): PlaceholderModel => {
+ const textMap = [
+ ComponentNameEnum.INPUT,
+ ComponentNameEnum.AUTOCOMPLETE,
+ ComponentNameEnum.INPUT_NUMBER,
+ ComponentNameEnum.INPUT_PASSWORD
+ ]
+ const selectMap = [
+ ComponentNameEnum.SELECT,
+ ComponentNameEnum.TIME_PICKER,
+ ComponentNameEnum.DATE_PICKER,
+ ComponentNameEnum.TIME_SELECT,
+ ComponentNameEnum.SELECT_V2
+ ]
+ if (textMap.includes(schema?.component as ComponentNameEnum)) {
+ return {
+ placeholder: t('common.inputText')
+ }
+ }
+ if (selectMap.includes(schema?.component as ComponentNameEnum)) {
+ // 一些范围选择器
+ const twoTextMap = ['datetimerange', 'daterange', 'monthrange', 'datetimerange', 'daterange']
+ if (
+ twoTextMap.includes(
+ ((schema?.componentProps as any)?.type ||
+ (schema?.componentProps as any)?.isRange) as string
+ )
+ ) {
+ return {
+ startPlaceholder: t('common.startTimeText'),
+ endPlaceholder: t('common.endTimeText'),
+ rangeSeparator: '-'
+ }
+ } else {
+ return {
+ placeholder: t('common.selectText')
+ }
+ }
+ }
+ return {}
+}
+
+/**
+ *
+ * @param col 内置栅格
+ * @returns 返回栅格属性
+ * @description 合并传入进来的栅格属性
+ */
+export const setGridProp = (col: ColProps = {}): ColProps => {
+ const colProps: ColProps = {
+ // 如果有span,代表用户优先级更高,所以不需要默认栅格
+ ...(col.span
+ ? {}
+ : {
+ xs: 24,
+ sm: 12,
+ md: 12,
+ lg: 12,
+ xl: 12
+ }),
+ ...col
+ }
+ return colProps
+}
+
+/**
+ *
+ * @param item 传入的组件属性
+ * @returns 默认添加 clearable 属性
+ */
+export const setComponentProps = (item: FormSchema): Recordable => {
+ // const notNeedClearable = ['ColorPicker']
+ // 拆分事件并组合
+ const onEvents = (item?.componentProps as any)?.on || {}
+ const newOnEvents: Recordable = {}
+
+ for (const key in onEvents) {
+ if (onEvents[key]) {
+ newOnEvents[`on${firstUpperCase(key)}`] = (...args: any[]) => {
+ onEvents[key](...args)
+ }
+ }
+ }
+
+ const componentProps: Recordable = {
+ clearable: true,
+ ...item.componentProps,
+ ...newOnEvents
+ }
+ // 需要删除额外的属性
+ if (componentProps.slots) {
+ delete componentProps.slots
+ }
+ if (componentProps.on) {
+ delete componentProps.on
+ }
+ return componentProps
+}
+
+/**
+ *
+ * @param formModel 表单数据
+ * @param slotsProps 插槽属性
+ */
+export const setItemComponentSlots = (slotsProps: Recordable = {}): Recordable => {
+ const slotObj: Recordable = {}
+ for (const key in slotsProps) {
+ if (slotsProps[key]) {
+ if (isFunction(slotsProps[key])) {
+ slotObj[humpToDash(key)] = (...args: any[]) => {
+ return slotsProps[key]?.(...args)
+ }
+ } else {
+ slotObj[humpToDash(key)] = () => {
+ return slotsProps[key]
+ }
+ }
+ }
+ }
+ return slotObj
+}
+
+/**
+ *
+ * @param schema Form表单结构化数组
+ * @param formModel FormMoel
+ * @returns FormMoel
+ * @description 生成对应的formModel
+ */
+export const initModel = (schema: FormSchema[], formModel: Recordable) => {
+ const model: Recordable = { ...formModel }
+ schema.map((v) => {
+ if (v.remove) {
+ delete model[v.field]
+ } else if (v.component !== 'Divider') {
+ // const hasField = Reflect.has(model, v.field)
+ const hasField = get(model, v.field)
+ // 如果先前已经有值存在,则不进行重新赋值,而是采用现有的值
+ set(
+ model,
+ v.field,
+ hasField !== void 0 ? get(model, v.field) : v.value !== void 0 ? v.value : undefined
+ )
+ // model[v.field] = hasField ? model[v.field] : v.value !== void 0 ? v.value : undefined
+ }
+ })
+ // 如果 schema 对应的 field 不存在,则删除 model 中的对应的 field
+ for (let i = 0; i < schema.length; i++) {
+ const key = schema[i].field
+ if (!Object.prototype.hasOwnProperty.call(model, key)) {
+ delete model[key]
+ }
+ }
+ return model
+}
diff --git a/src/components/Form/src/types/index.ts b/src/components/Form/src/types/index.ts
new file mode 100644
index 0000000..ac80193
--- /dev/null
+++ b/src/components/Form/src/types/index.ts
@@ -0,0 +1,670 @@
+import {
+ AutocompleteProps,
+ InputNumberProps,
+ CascaderProps,
+ CascaderNode,
+ CascaderValue,
+ SwitchProps,
+ ComponentSize,
+ InputProps,
+ RateProps,
+ ColorPickerProps,
+ TransferProps,
+ RadioGroupProps,
+ RadioButtonProps,
+ CheckboxGroupProps,
+ DividerProps,
+ DatePickerProps,
+ FormItemProps as ElFormItemProps,
+ FormProps as ElFormProps,
+ ISelectProps,
+ UploadProps
+} from 'element-plus'
+import { IEditorConfig } from '@wangeditor/editor'
+import { JsonEditorProps } from '@/components/JsonEditor'
+import { IAgreeProps } from '@/components/IAgree'
+import { CSSProperties } from 'vue'
+
+export interface PlaceholderModel {
+ placeholder?: string
+ startPlaceholder?: string
+ endPlaceholder?: string
+ rangeSeparator?: string
+}
+
+export enum ComponentNameEnum {
+ RADIO_GROUP = 'RadioGroup',
+ RADIO_BUTTON = 'RadioButton',
+ CHECKBOX_GROUP = 'CheckboxGroup',
+ CHECKBOX_BUTTON = 'CheckboxButton',
+ INPUT = 'Input',
+ AUTOCOMPLETE = 'Autocomplete',
+ INPUT_NUMBER = 'InputNumber',
+ SELECT = 'Select',
+ CASCADER = 'Cascader',
+ SWITCH = 'Switch',
+ SLIDER = 'Slider',
+ TIME_PICKER = 'TimePicker',
+ DATE_PICKER = 'DatePicker',
+ RATE = 'Rate',
+ COLOR_PICKER = 'ColorPicker',
+ TRANSFER = 'Transfer',
+ DIVIDER = 'Divider',
+ TIME_SELECT = 'TimeSelect',
+ SELECT_V2 = 'SelectV2',
+ INPUT_PASSWORD = 'InputPassword',
+ EDITOR = 'Editor',
+ TREE_SELECT = 'TreeSelect',
+ UPLOAD = 'Upload',
+ JSON_EDITOR = 'JsonEditor',
+ ICON_PICKER = 'IconPicker',
+ I_AGREE = 'IAgree'
+}
+
+type CamelCaseComponentName = keyof typeof ComponentNameEnum extends infer K
+ ? K extends string
+ ? K extends `${infer A}_${infer B}`
+ ? `${Capitalize>}${Capitalize>}`
+ : Capitalize>
+ : never
+ : never
+
+export type ComponentName = CamelCaseComponentName
+
+export interface InputPasswordComponentProps {
+ strength?: boolean
+ style?: CSSProperties
+}
+
+export interface InputComponentProps extends Partial {
+ rows?: number
+ on?: {
+ blur?: (event: FocusEvent) => void
+ focus?: (event: FocusEvent) => void
+ change?: (value: string | number) => void
+ clear?: () => void
+ input?: (value: string | number) => void
+ }
+ slots?: {
+ prefix?: (...args: any[]) => JSX.Element | null
+ suffix?: (...args: any[]) => JSX.Element | null
+ prepend?: (...args: any[]) => JSX.Element | null
+ append?: (...args: any[]) => JSX.Element | null
+ }
+ style?: CSSProperties
+}
+
+export interface AutocompleteComponentProps extends Partial {
+ on?: {
+ select?: (item: any) => void
+ change?: (value: string | number) => void
+ }
+ slots?: {
+ default?: (...args: any[]) => JSX.Element | null
+ prefix?: (...args: any[]) => JSX.Element | null
+ suffix?: (...args: any[]) => JSX.Element | null
+ prepend?: (...args: any[]) => JSX.Element | null
+ append?: (...args: any[]) => JSX.Element | null
+ }
+ style?: CSSProperties
+}
+
+export interface InputNumberComponentProps extends Partial {
+ on?: {
+ change?: (currentValue: number | undefined, oldValue: number | undefined) => void
+ blur?: (event: FocusEvent) => void
+ focus?: (event: FocusEvent) => void
+ }
+ style?: CSSProperties
+}
+
+export interface SelectOption {
+ label?: string
+ disabled?: boolean
+ value?: any
+ key?: string | number
+ options?: SelectOption[]
+ [key: string]: any
+}
+
+export interface SelectComponentProps extends Omit, 'options'> {
+ /**
+ * 数据源的字段别名
+ */
+ props?: {
+ key?: string
+ value?: string
+ label?: string
+ children?: string
+ }
+ on?: {
+ change?: (value: string | number | boolean | object) => void
+ visibleChange?: (visible: boolean) => void
+ removeTag?: (tag: any) => void
+ clear?: () => void
+ blur?: (event: FocusEvent) => void
+ focus?: (event: FocusEvent) => void
+ }
+ slots?: {
+ default?: (options: SelectOption[]) => JSX.Element[] | null
+ optionGroupDefault?: (item: SelectOption) => JSX.Element
+ optionDefault?: (option: SelectOption) => JSX.Element | null
+ prefix?: (...args: any[]) => JSX.Element | null
+ empty?: (...args: any[]) => JSX.Element | null
+ }
+ options?: SelectOption[]
+ style?: CSSProperties
+}
+
+export interface SelectV2ComponentProps {
+ multiple?: boolean
+ disabled?: boolean
+ valueKey?: string
+ size?: ComponentSize
+ clearable?: boolean
+ clearIcon?: string | JSX.Element | null
+ collapseTags?: boolean
+ multipleLimit?: number
+ name?: string
+ effect?: string
+ autocomplete?: string
+ placeholder?: string
+ filterable?: boolean
+ allowCreate?: boolean
+ reserveKeyword?: boolean
+ noDataText?: string
+ popperClass?: string
+ teleported?: boolean
+ persistent?: boolean
+ popperOptions?: any
+ automaticDropdown?: boolean
+ height?: number
+ scrollbarAlwaysOn?: boolean
+ remote?: boolean
+ remoteMethod?: (query: string) => void
+ validateEvent?: boolean
+ placement?: AutocompleteProps['placement']
+ collapseTagsTooltip?: boolean
+ on?: {
+ change?: (value: string | number | boolean | object) => void
+ visibleChange?: (visible: boolean) => void
+ removeTag?: (tag: any) => void
+ clear?: () => void
+ blur?: (event: FocusEvent) => void
+ focus?: (event: FocusEvent) => void
+ }
+ options?: SelectOption[]
+ slots?: {
+ default?: (option: SelectOption) => JSX.Element | null
+ }
+ style?: CSSProperties
+}
+
+export interface CascaderComponentProps {
+ options?: Record[]
+ props?: CascaderProps
+ size?: ComponentSize
+ placeholder?: string
+ disabled?: boolean
+ clearable?: boolean
+ showAllLevels?: boolean
+ collapseTags?: boolean
+ collapseTagsTooltip?: boolean
+ separator?: string
+ filterable?: boolean
+ filterMethod?: (node: CascaderNode, keyword: string) => boolean
+ debounce?: number
+ beforeFilter?: (value: string) => boolean
+ popperClass?: string
+ teleported?: boolean
+ tagType?: ElementPlusInfoType
+ validateEvent?: boolean
+ on?: {
+ change?: (value: CascaderValue) => void
+ expandChange?: (value: CascaderValue) => void
+ blur?: (event: FocusEvent) => void
+ focus?: (event: FocusEvent) => void
+ visibleChange?: (value: boolean) => void
+ removeTag?: (value: CascaderNode['valueByOption']) => void
+ }
+ slots?: {
+ default?: (...args: any[]) => JSX.Element | null
+ empty?: (...args: any[]) => JSX.Element | null
+ }
+ style?: CSSProperties
+}
+
+export interface SwitchComponentProps extends Partial {
+ on?: {
+ change?: (value: boolean | string | number) => void
+ }
+ style?: CSSProperties
+}
+
+export interface RateComponentProps extends Partial {
+ on?: {
+ change?: (value: number) => void
+ }
+ style?: CSSProperties
+}
+
+export interface ColorPickerComponentProps extends Partial {
+ on?: {
+ change?: (value: string) => void
+ activeChange?: (value: string) => void
+ }
+ style?: CSSProperties
+}
+
+export interface TransferComponentProps extends Partial {
+ on?: {
+ change?: (
+ value: number | string,
+ direction: 'left' | 'right',
+ movedKeys: string[] | number[]
+ ) => void
+ leftCheckChange?: (value: any[]) => void
+ rightCheckChange?: (value: any[]) => void
+ }
+ slots?: {
+ default?: (...args: any[]) => JSX.Element | null
+ leftFooter?: (...args: any[]) => JSX.Element | null
+ rightFooter?: (...args: any[]) => JSX.Element | null
+ }
+ style?: CSSProperties
+}
+
+export interface RadioOption {
+ label?: string
+ value?: string | number | boolean
+ disabled?: boolean
+ border?: boolean
+ size?: ComponentSize
+ name?: string
+ [key: string]: any
+}
+export interface RadioGroupComponentProps extends Partial {
+ options?: RadioOption[]
+ /**
+ * 数据源的字段别名
+ */
+ props?: {
+ label?: string
+ value?: string
+ disabled?: string
+ }
+ on?: {
+ change?: (value: string | number | boolean) => void
+ }
+ slots?: {
+ default?: (...args: any[]) => JSX.Element[] | null
+ }
+ style?: CSSProperties
+}
+
+export interface RadioButtonComponentProps extends Partial {
+ options?: RadioOption[]
+ /**
+ * 数据源的字段别名
+ */
+ props?: {
+ label?: string
+ value?: string
+ disabled?: string
+ }
+ on?: {
+ change?: (value: string | number | boolean) => void
+ }
+ slots?: {
+ default?: (...args: any[]) => JSX.Element[] | null
+ }
+ style?: CSSProperties
+}
+
+export interface CheckboxOption {
+ label?: string
+ value?: string | number | boolean
+ disabled?: boolean
+ trueLabel?: string | number
+ falseLabel?: string | number
+ border?: boolean
+ size?: ComponentSize
+ name?: string
+ checked?: boolean
+ indeterminate?: boolean
+ validateEvent?: boolean
+ tabindex?: number | string
+ id?: string
+ controls?: boolean
+ [key: string]: any
+}
+
+export interface CheckboxGroupComponentProps extends Partial {
+ options?: CheckboxOption[]
+ /**
+ * 数据源的字段别名
+ */
+ props?: {
+ label?: string
+ value?: string
+ disabled?: string
+ }
+ on?: {
+ change?: (value: string | number | boolean) => void
+ }
+ slots?: {
+ default?: (...args: any[]) => JSX.Element[] | null
+ }
+ style?: CSSProperties
+}
+
+export interface DividerComponentProps extends Partial {
+ on?: {
+ change?: (value: number) => void
+ input?: (value: number) => void
+ }
+ style?: CSSProperties
+}
+
+export interface DatePickerComponentProps extends Partial {
+ on?: {
+ change?: (value: string | Date | number | string[]) => void
+ blur?: (event: FocusEvent) => void
+ focus?: (event: FocusEvent) => void
+ calendarChange?: (val: [Date, Date]) => void
+ panelChange?: (date, mode, view) => void
+ visibleChange?: (visibility: boolean) => void
+ }
+ slots?: {
+ default?: (...args: any[]) => JSX.Element | null
+ rangeSeparator?: (...args: any[]) => JSX.Element | null
+ }
+ style?: CSSProperties
+}
+
+export interface DateTimePickerComponentProps {
+ readonly?: boolean
+ disabled?: boolean
+ editable?: boolean
+ clearable?: boolean
+ size?: ComponentSize
+ placeholder?: string
+ startPlaceholder?: string
+ endPlaceholder?: string
+ timeArrowControl?: boolean
+ type?: 'year' | 'month' | 'date' | 'datetime' | 'datetimerange' | 'daterange' | 'week'
+ format?: string
+ popperClass?: string
+ rangeSeparator?: string
+ defaultValue?: Date | [Date, Date]
+ defaultTime?: Date | [Date, Date]
+ valueFormat?: string
+ id?: string
+ name?: string
+ unlinkPanels?: boolean
+ prefixIcon?: string | JSX.Element
+ clearIcon?: string | JSX.Element
+ shortcuts?: Array<{ text: string; value: Date | Function }>
+ disabledDate?: (date: Date) => boolean
+ cellClassName?: string | ((date: Date) => string | undefined)
+ teleported?: boolean
+ on?: {
+ change?: (value: string | Date | number | string[]) => void
+ blur?: (event: FocusEvent) => void
+ focus?: (event: FocusEvent) => void
+ calendarChange?: (val: [Date, Date]) => void
+ visibleChange?: (visibility: boolean) => void
+ }
+ slots?: {
+ default?: (...args: any[]) => JSX.Element | null
+ rangeSeparator?: (...args: any[]) => JSX.Element | null
+ }
+ style?: CSSProperties
+}
+
+export interface TimePickerComponentProps {
+ readonly?: boolean
+ disabled?: boolean
+ editable?: boolean
+ clearable?: boolean
+ size?: ComponentSize
+ placeholder?: string
+ startPlaceholder?: string
+ endPlaceholder?: string
+ isRange?: boolean
+ arrowControl?: boolean
+ popperClass?: string
+ rangeSeparator?: string
+ format?: string
+ defaultValue?: Date | [Date, Date]
+ id?: string
+ name?: string
+ label?: string
+ prefixIcon?: string | JSX.Element
+ clearIcon?: string | JSX.Element
+ disabledHours?: (role: string, comparingDate?: any) => number[]
+ disabledMinutes?: (hour: number, role: string, comparingDate?: any) => number[]
+ disabledSeconds?: (hour: number, minute: number, role: string, comparingDate?: any) => number[]
+ teleported?: boolean
+ tabindex?: number | string
+ on?: {
+ change: (
+ val: number | string | Date | [number, number] | [string, string] | [Date, Date]
+ ) => void
+ blur?: (event: FocusEvent) => void
+ focus?: (event: FocusEvent) => void
+ visibleChange?: (visibility: boolean) => void
+ }
+ style?: CSSProperties
+}
+
+export interface TimeSelectComponentProps {
+ disabled?: boolean
+ editable?: boolean
+ clearable?: boolean
+ size?: ComponentSize
+ placeholder?: string
+ name?: string
+ effect?: string
+ prefixIcon?: string | JSX.Element
+ clearIcon?: string | JSX.Element
+ start?: string
+ end?: string
+ step?: string
+ minTime?: string
+ maxTime?: string
+ format?: string
+ on?: {
+ change?: (val: string) => void
+ blur?: (event: FocusEvent) => void
+ focus?: (event: FocusEvent) => void
+ }
+ style?: CSSProperties
+}
+
+export interface EditorComponentProps {
+ editorConfig?: IEditorConfig
+ style?: CSSProperties
+}
+
+export interface ColProps {
+ span?: number
+ xs?: number
+ sm?: number
+ md?: number
+ lg?: number
+ xl?: number
+ tag?: string
+}
+
+export interface FormSetProps {
+ field: string
+ path: string
+ value: any
+}
+
+export interface FormItemProps extends Partial {
+ style?: CSSProperties
+ slots?: {
+ default?: (...args: any[]) => JSX.Element | null
+ label?: (...args: any[]) => JSX.Element | null
+ error?: (...args: any[]) => JSX.Element | null
+ }
+}
+
+export interface UploadComponentProps extends Partial {
+ slots?: {
+ default?: (...args: any[]) => JSX.Element | null
+ trigger?: (...args: any[]) => JSX.Element | null
+ tip?: (...args: any[]) => JSX.Element | null
+ file?: (...args: any[]) => JSX.Element | null
+ }
+ style?: CSSProperties
+}
+
+export interface TreeSelectComponentProps
+ extends Omit, 'props' | 'on' | 'slots'> {
+ data?: any[]
+ emptyText?: string
+ nodeKey?: string
+ props?: {
+ children?: string
+ label?: string | ((...args: any[]) => string)
+ disabled?: string | ((...args: any[]) => string)
+ isLeaf?: string | ((...args: any[]) => string)
+ class?: string | ((...args: any[]) => string)
+ }
+ renderAfterExpand?: boolean
+ load?: (...args: any[]) => Promise
+ renderContent?: (...args: any[]) => JSX.Element | null
+ highlightCurrent?: boolean
+ defaultExpandAll?: boolean
+ expandOnClickNode?: boolean
+ checkOnClickNode?: boolean
+ autoExpandParent?: boolean
+ defaultExpandedKeys?: any[]
+ showCheckbox?: boolean
+ checkStrictly?: boolean
+ defaultCheckedKeys?: any[]
+ currentNodeKey?: string | number
+ filterNodeMethod?: (...args: any[]) => boolean
+ accordion?: boolean
+ indent?: number
+ icon?: string | ((...args: any[]) => JSX.Element | null)
+ lazy?: boolean
+ draggable?: boolean
+ allowDrag?: (...args: any[]) => boolean
+ allowDrop?: (...args: any[]) => boolean
+ on?: {
+ change?: (value: string | number | boolean | object) => void
+ visibleChange?: (visible: boolean) => void
+ removeTag?: (tag: any) => void
+ clear?: () => void
+ blur?: (event: FocusEvent) => void
+ focus?: (event: FocusEvent) => void
+ nodeClick?: (...args: any[]) => void
+ nodeContextMenu?: (...args: any[]) => void
+ checkChange?: (...args: any[]) => void
+ check?: (...args: any[]) => void
+ currentChange?: (...args: any[]) => void
+ nodeExpand?: (...args: any[]) => void
+ nodeCollapse?: (...args: any[]) => void
+ nodeDragStart?: (...args: any[]) => void
+ nodeDragEnter?: (...args: any[]) => void
+ nodeDragLeave?: (...args: any[]) => void
+ nodeDragOver?: (...args: any[]) => void
+ nodeDragEnd?: (...args: any[]) => void
+ nodeDrop?: (...args: any[]) => void
+ }
+ slots?: {
+ default?: (...args: any[]) => JSX.Element | null
+ optionGroupDefault?: (item: SelectOption) => JSX.Element
+ optionDefault?: (option: SelectOption) => JSX.Element | null
+ prefix?: (...args: any[]) => JSX.Element | null
+ empty?: (...args: any[]) => JSX.Element | null
+ }
+ style?: CSSProperties
+}
+
+export interface FormSchema {
+ /**
+ * 唯一标识
+ */
+ field: string
+
+ /**
+ * 标题
+ */
+ label?: string
+
+ /**
+ * col组件属性
+ */
+ colProps?: ColProps
+
+ /**
+ * 表单组件属性,具体可以查看element-plus文档
+ */
+ componentProps?:
+ | InputComponentProps
+ | AutocompleteComponentProps
+ | InputNumberComponentProps
+ | SelectComponentProps
+ | SelectV2ComponentProps
+ | CascaderComponentProps
+ | SwitchComponentProps
+ | RateComponentProps
+ | ColorPickerComponentProps
+ | TransferComponentProps
+ | RadioGroupComponentProps
+ | RadioButtonComponentProps
+ | DividerComponentProps
+ | DatePickerComponentProps
+ | DateTimePickerComponentProps
+ | TimePickerComponentProps
+ | InputPasswordComponentProps
+ | TreeSelectComponentProps
+ | UploadComponentProps
+ | JsonEditorProps
+ | IAgreeProps
+ | any
+
+ /**
+ * formItem组件属性,具体可以查看element-plus文档
+ */
+ formItemProps?: FormItemProps
+
+ /**
+ * 渲染的组件名称
+ */
+ component?: ComponentName
+
+ /**
+ * 初始值
+ */
+ value?: any
+
+ /**
+ * 是否隐藏,如果为true,会连同值一同删除,类似v-if
+ */
+ remove?: boolean
+
+ /**
+ * 样式隐藏,不会把值一同删掉,类似v-show
+ */
+ hidden?: boolean
+
+ /**
+ * @returns 远程加载下拉项
+ */
+ optionApi?: any
+}
+
+export interface FormProps extends Partial {
+ schema?: FormSchema[]
+ isCol?: boolean
+ model?: Recordable
+ autoSetPlaceholder?: boolean
+ isCustom?: boolean
+ [key: string]: any
+}
diff --git a/src/components/Highlight/index.ts b/src/components/Highlight/index.ts
new file mode 100644
index 0000000..3e2d9ed
--- /dev/null
+++ b/src/components/Highlight/index.ts
@@ -0,0 +1,3 @@
+import Highlight from './src/Highlight.vue'
+
+export { Highlight }
diff --git a/src/components/Highlight/src/Highlight.vue b/src/components/Highlight/src/Highlight.vue
new file mode 100644
index 0000000..ef923a9
--- /dev/null
+++ b/src/components/Highlight/src/Highlight.vue
@@ -0,0 +1,65 @@
+
diff --git a/src/components/IAgree/index.ts b/src/components/IAgree/index.ts
new file mode 100644
index 0000000..8c31125
--- /dev/null
+++ b/src/components/IAgree/index.ts
@@ -0,0 +1,4 @@
+import IAgree from './src/IAgree.vue'
+
+export type { LinkItem, IAgreeProps } from './src/types'
+export { IAgree }
diff --git a/src/components/IAgree/src/IAgree.vue b/src/components/IAgree/src/IAgree.vue
new file mode 100644
index 0000000..6a36e23
--- /dev/null
+++ b/src/components/IAgree/src/IAgree.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+ {{ text }}
+
+
diff --git a/src/components/IAgree/src/types/index.ts b/src/components/IAgree/src/types/index.ts
new file mode 100644
index 0000000..9ddef75
--- /dev/null
+++ b/src/components/IAgree/src/types/index.ts
@@ -0,0 +1,10 @@
+export interface LinkItem {
+ text: string
+ url?: string
+ onClick?: () => void
+}
+
+export interface IAgreeProps {
+ text: string
+ link: LinkItem[]
+}
diff --git a/src/components/Icon/index.ts b/src/components/Icon/index.ts
new file mode 100644
index 0000000..83469d4
--- /dev/null
+++ b/src/components/Icon/index.ts
@@ -0,0 +1,5 @@
+import Icon from './src/Icon.vue'
+
+export type { IconTypes } from './src/types'
+
+export { Icon }
diff --git a/src/components/Icon/src/Icon.vue b/src/components/Icon/src/Icon.vue
new file mode 100644
index 0000000..0fa4d73
--- /dev/null
+++ b/src/components/Icon/src/Icon.vue
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/Icon/src/types/index.ts b/src/components/Icon/src/types/index.ts
new file mode 100644
index 0000000..632e4e8
--- /dev/null
+++ b/src/components/Icon/src/types/index.ts
@@ -0,0 +1,6 @@
+export interface IconTypes {
+ size?: number
+ color?: string
+ icon: string
+ hoverColor?: string
+}
diff --git a/src/components/IconPicker/index.ts b/src/components/IconPicker/index.ts
new file mode 100644
index 0000000..b7b3022
--- /dev/null
+++ b/src/components/IconPicker/index.ts
@@ -0,0 +1,3 @@
+import IconPicker from './src/IconPicker.vue'
+
+export { IconPicker }
diff --git a/src/components/IconPicker/src/IconPicker.vue b/src/components/IconPicker/src/IconPicker.vue
new file mode 100644
index 0000000..34f350d
--- /dev/null
+++ b/src/components/IconPicker/src/IconPicker.vue
@@ -0,0 +1,193 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/IconPicker/src/data/icons.ant-design.ts b/src/components/IconPicker/src/data/icons.ant-design.ts
new file mode 100644
index 0000000..eab2169
--- /dev/null
+++ b/src/components/IconPicker/src/data/icons.ant-design.ts
@@ -0,0 +1,836 @@
+export default {
+ name: 'Ant Design Icons',
+ prefix: 'vi-ant-design',
+ icons: [
+ 'vi-ant-design:account-book-filled',
+ 'vi-ant-design:account-book-outlined',
+ 'vi-ant-design:account-book-twotone',
+ 'vi-ant-design:aim-outlined',
+ 'vi-ant-design:alert-filled',
+ 'vi-ant-design:alert-outlined',
+ 'vi-ant-design:alert-twotone',
+ 'vi-ant-design:alibaba-outlined',
+ 'vi-ant-design:align-center-outlined',
+ 'vi-ant-design:align-left-outlined',
+ 'vi-ant-design:align-right-outlined',
+ 'vi-ant-design:alipay-circle-filled',
+ 'vi-ant-design:alipay-circle-outlined',
+ 'vi-ant-design:alipay-outlined',
+ 'vi-ant-design:alipay-square-filled',
+ 'vi-ant-design:aliwangwang-filled',
+ 'vi-ant-design:aliwangwang-outlined',
+ 'vi-ant-design:aliyun-outlined',
+ 'vi-ant-design:amazon-circle-filled',
+ 'vi-ant-design:amazon-outlined',
+ 'vi-ant-design:amazon-square-filled',
+ 'vi-ant-design:android-filled',
+ 'vi-ant-design:android-outlined',
+ 'vi-ant-design:ant-cloud-outlined',
+ 'vi-ant-design:ant-design-outlined',
+ 'vi-ant-design:apartment-outlined',
+ 'vi-ant-design:api-filled',
+ 'vi-ant-design:api-outlined',
+ 'vi-ant-design:api-twotone',
+ 'vi-ant-design:apple-filled',
+ 'vi-ant-design:apple-outlined',
+ 'vi-ant-design:appstore-add-outlined',
+ 'vi-ant-design:appstore-filled',
+ 'vi-ant-design:appstore-outlined',
+ 'vi-ant-design:appstore-twotone',
+ 'vi-ant-design:area-chart-outlined',
+ 'vi-ant-design:arrow-down-outlined',
+ 'vi-ant-design:arrow-left-outlined',
+ 'vi-ant-design:arrow-right-outlined',
+ 'vi-ant-design:arrow-up-outlined',
+ 'vi-ant-design:arrows-alt-outlined',
+ 'vi-ant-design:audio-filled',
+ 'vi-ant-design:audio-muted-outlined',
+ 'vi-ant-design:audio-outlined',
+ 'vi-ant-design:audio-twotone',
+ 'vi-ant-design:audit-outlined',
+ 'vi-ant-design:backward-filled',
+ 'vi-ant-design:backward-outlined',
+ 'vi-ant-design:baidu-outlined',
+ 'vi-ant-design:bank-filled',
+ 'vi-ant-design:bank-outlined',
+ 'vi-ant-design:bank-twotone',
+ 'vi-ant-design:bar-chart-outlined',
+ 'vi-ant-design:barcode-outlined',
+ 'vi-ant-design:bars-outlined',
+ 'vi-ant-design:behance-circle-filled',
+ 'vi-ant-design:behance-outlined',
+ 'vi-ant-design:behance-square-filled',
+ 'vi-ant-design:behance-square-outlined',
+ 'vi-ant-design:bell-filled',
+ 'vi-ant-design:bell-outlined',
+ 'vi-ant-design:bell-twotone',
+ 'vi-ant-design:bg-colors-outlined',
+ 'vi-ant-design:bilibili-filled',
+ 'vi-ant-design:bilibili-outlined',
+ 'vi-ant-design:block-outlined',
+ 'vi-ant-design:bold-outlined',
+ 'vi-ant-design:book-filled',
+ 'vi-ant-design:book-outlined',
+ 'vi-ant-design:book-twotone',
+ 'vi-ant-design:border-bottom-outlined',
+ 'vi-ant-design:border-horizontal-outlined',
+ 'vi-ant-design:border-inner-outlined',
+ 'vi-ant-design:border-left-outlined',
+ 'vi-ant-design:border-outer-outlined',
+ 'vi-ant-design:border-outlined',
+ 'vi-ant-design:border-right-outlined',
+ 'vi-ant-design:border-top-outlined',
+ 'vi-ant-design:border-verticle-outlined',
+ 'vi-ant-design:borderless-table-outlined',
+ 'vi-ant-design:box-plot-filled',
+ 'vi-ant-design:box-plot-outlined',
+ 'vi-ant-design:box-plot-twotone',
+ 'vi-ant-design:branches-outlined',
+ 'vi-ant-design:bug-filled',
+ 'vi-ant-design:bug-outlined',
+ 'vi-ant-design:bug-twotone',
+ 'vi-ant-design:build-filled',
+ 'vi-ant-design:build-outlined',
+ 'vi-ant-design:build-twotone',
+ 'vi-ant-design:bulb-filled',
+ 'vi-ant-design:bulb-outlined',
+ 'vi-ant-design:bulb-twotone',
+ 'vi-ant-design:calculator-filled',
+ 'vi-ant-design:calculator-outlined',
+ 'vi-ant-design:calculator-twotone',
+ 'vi-ant-design:calendar-filled',
+ 'vi-ant-design:calendar-outlined',
+ 'vi-ant-design:calendar-twotone',
+ 'vi-ant-design:camera-filled',
+ 'vi-ant-design:camera-outlined',
+ 'vi-ant-design:camera-twotone',
+ 'vi-ant-design:car-filled',
+ 'vi-ant-design:car-outlined',
+ 'vi-ant-design:car-twotone',
+ 'vi-ant-design:caret-down-filled',
+ 'vi-ant-design:caret-down-outlined',
+ 'vi-ant-design:caret-left-filled',
+ 'vi-ant-design:caret-left-outlined',
+ 'vi-ant-design:caret-right-filled',
+ 'vi-ant-design:caret-right-outlined',
+ 'vi-ant-design:caret-up-filled',
+ 'vi-ant-design:caret-up-outlined',
+ 'vi-ant-design:carry-out-filled',
+ 'vi-ant-design:carry-out-outlined',
+ 'vi-ant-design:carry-out-twotone',
+ 'vi-ant-design:check-circle-filled',
+ 'vi-ant-design:check-circle-outlined',
+ 'vi-ant-design:check-circle-twotone',
+ 'vi-ant-design:check-outlined',
+ 'vi-ant-design:check-square-filled',
+ 'vi-ant-design:check-square-outlined',
+ 'vi-ant-design:check-square-twotone',
+ 'vi-ant-design:chrome-filled',
+ 'vi-ant-design:chrome-outlined',
+ 'vi-ant-design:ci-circle-filled',
+ 'vi-ant-design:ci-circle-outlined',
+ 'vi-ant-design:ci-circle-twotone',
+ 'vi-ant-design:ci-outlined',
+ 'vi-ant-design:ci-twotone',
+ 'vi-ant-design:clear-outlined',
+ 'vi-ant-design:clock-circle-filled',
+ 'vi-ant-design:clock-circle-outlined',
+ 'vi-ant-design:clock-circle-twotone',
+ 'vi-ant-design:close-circle-filled',
+ 'vi-ant-design:close-circle-outlined',
+ 'vi-ant-design:close-circle-twotone',
+ 'vi-ant-design:close-outlined',
+ 'vi-ant-design:close-square-filled',
+ 'vi-ant-design:close-square-outlined',
+ 'vi-ant-design:close-square-twotone',
+ 'vi-ant-design:cloud-download-outlined',
+ 'vi-ant-design:cloud-filled',
+ 'vi-ant-design:cloud-outlined',
+ 'vi-ant-design:cloud-server-outlined',
+ 'vi-ant-design:cloud-sync-outlined',
+ 'vi-ant-design:cloud-twotone',
+ 'vi-ant-design:cloud-upload-outlined',
+ 'vi-ant-design:cluster-outlined',
+ 'vi-ant-design:code-filled',
+ 'vi-ant-design:code-outlined',
+ 'vi-ant-design:code-sandbox-circle-filled',
+ 'vi-ant-design:code-sandbox-outlined',
+ 'vi-ant-design:code-sandbox-square-filled',
+ 'vi-ant-design:code-twotone',
+ 'vi-ant-design:codepen-circle-filled',
+ 'vi-ant-design:codepen-circle-outlined',
+ 'vi-ant-design:codepen-outlined',
+ 'vi-ant-design:codepen-square-filled',
+ 'vi-ant-design:coffee-outlined',
+ 'vi-ant-design:column-height-outlined',
+ 'vi-ant-design:column-width-outlined',
+ 'vi-ant-design:comment-outlined',
+ 'vi-ant-design:compass-filled',
+ 'vi-ant-design:compass-outlined',
+ 'vi-ant-design:compass-twotone',
+ 'vi-ant-design:compress-outlined',
+ 'vi-ant-design:console-sql-outlined',
+ 'vi-ant-design:contacts-filled',
+ 'vi-ant-design:contacts-outlined',
+ 'vi-ant-design:contacts-twotone',
+ 'vi-ant-design:container-filled',
+ 'vi-ant-design:container-outlined',
+ 'vi-ant-design:container-twotone',
+ 'vi-ant-design:control-filled',
+ 'vi-ant-design:control-outlined',
+ 'vi-ant-design:control-twotone',
+ 'vi-ant-design:copy-filled',
+ 'vi-ant-design:copy-outlined',
+ 'vi-ant-design:copy-twotone',
+ 'vi-ant-design:copyright-circle-filled',
+ 'vi-ant-design:copyright-circle-outlined',
+ 'vi-ant-design:copyright-circle-twotone',
+ 'vi-ant-design:copyright-outlined',
+ 'vi-ant-design:copyright-twotone',
+ 'vi-ant-design:credit-card-filled',
+ 'vi-ant-design:credit-card-outlined',
+ 'vi-ant-design:credit-card-twotone',
+ 'vi-ant-design:crown-filled',
+ 'vi-ant-design:crown-outlined',
+ 'vi-ant-design:crown-twotone',
+ 'vi-ant-design:customer-service-filled',
+ 'vi-ant-design:customer-service-outlined',
+ 'vi-ant-design:customer-service-twotone',
+ 'vi-ant-design:dash-outlined',
+ 'vi-ant-design:dashboard-filled',
+ 'vi-ant-design:dashboard-outlined',
+ 'vi-ant-design:dashboard-twotone',
+ 'vi-ant-design:database-filled',
+ 'vi-ant-design:database-outlined',
+ 'vi-ant-design:database-twotone',
+ 'vi-ant-design:delete-column-outlined',
+ 'vi-ant-design:delete-filled',
+ 'vi-ant-design:delete-outlined',
+ 'vi-ant-design:delete-row-outlined',
+ 'vi-ant-design:delete-twotone',
+ 'vi-ant-design:delivered-procedure-outlined',
+ 'vi-ant-design:deployment-unit-outlined',
+ 'vi-ant-design:desktop-outlined',
+ 'vi-ant-design:diff-filled',
+ 'vi-ant-design:diff-outlined',
+ 'vi-ant-design:diff-twotone',
+ 'vi-ant-design:dingding-outlined',
+ 'vi-ant-design:dingtalk-circle-filled',
+ 'vi-ant-design:dingtalk-outlined',
+ 'vi-ant-design:dingtalk-square-filled',
+ 'vi-ant-design:disconnect-outlined',
+ 'vi-ant-design:discord-filled',
+ 'vi-ant-design:discord-outlined',
+ 'vi-ant-design:dislike-filled',
+ 'vi-ant-design:dislike-outlined',
+ 'vi-ant-design:dislike-twotone',
+ 'vi-ant-design:docker-outlined',
+ 'vi-ant-design:dollar-circle-filled',
+ 'vi-ant-design:dollar-circle-outlined',
+ 'vi-ant-design:dollar-circle-twotone',
+ 'vi-ant-design:dollar-outlined',
+ 'vi-ant-design:dollar-twotone',
+ 'vi-ant-design:dot-chart-outlined',
+ 'vi-ant-design:dot-net-outlined',
+ 'vi-ant-design:double-left-outlined',
+ 'vi-ant-design:double-right-outlined',
+ 'vi-ant-design:down-circle-filled',
+ 'vi-ant-design:down-circle-outlined',
+ 'vi-ant-design:down-circle-twotone',
+ 'vi-ant-design:down-outlined',
+ 'vi-ant-design:down-square-filled',
+ 'vi-ant-design:down-square-outlined',
+ 'vi-ant-design:down-square-twotone',
+ 'vi-ant-design:download-outlined',
+ 'vi-ant-design:drag-outlined',
+ 'vi-ant-design:dribbble-circle-filled',
+ 'vi-ant-design:dribbble-outlined',
+ 'vi-ant-design:dribbble-square-filled',
+ 'vi-ant-design:dribbble-square-outlined',
+ 'vi-ant-design:dropbox-circle-filled',
+ 'vi-ant-design:dropbox-outlined',
+ 'vi-ant-design:dropbox-square-filled',
+ 'vi-ant-design:edit-filled',
+ 'vi-ant-design:edit-outlined',
+ 'vi-ant-design:edit-twotone',
+ 'vi-ant-design:ellipsis-outlined',
+ 'vi-ant-design:enter-outlined',
+ 'vi-ant-design:environment-filled',
+ 'vi-ant-design:environment-outlined',
+ 'vi-ant-design:environment-twotone',
+ 'vi-ant-design:euro-circle-filled',
+ 'vi-ant-design:euro-circle-outlined',
+ 'vi-ant-design:euro-circle-twotone',
+ 'vi-ant-design:euro-outlined',
+ 'vi-ant-design:euro-twotone',
+ 'vi-ant-design:exception-outlined',
+ 'vi-ant-design:exclamation-circle-filled',
+ 'vi-ant-design:exclamation-circle-outlined',
+ 'vi-ant-design:exclamation-circle-twotone',
+ 'vi-ant-design:exclamation-outlined',
+ 'vi-ant-design:expand-alt-outlined',
+ 'vi-ant-design:expand-outlined',
+ 'vi-ant-design:experiment-filled',
+ 'vi-ant-design:experiment-outlined',
+ 'vi-ant-design:experiment-twotone',
+ 'vi-ant-design:export-outlined',
+ 'vi-ant-design:eye-filled',
+ 'vi-ant-design:eye-invisible-filled',
+ 'vi-ant-design:eye-invisible-outlined',
+ 'vi-ant-design:eye-invisible-twotone',
+ 'vi-ant-design:eye-outlined',
+ 'vi-ant-design:eye-twotone',
+ 'vi-ant-design:facebook-filled',
+ 'vi-ant-design:facebook-outlined',
+ 'vi-ant-design:fall-outlined',
+ 'vi-ant-design:fast-backward-filled',
+ 'vi-ant-design:fast-backward-outlined',
+ 'vi-ant-design:fast-forward-filled',
+ 'vi-ant-design:fast-forward-outlined',
+ 'vi-ant-design:field-binary-outlined',
+ 'vi-ant-design:field-number-outlined',
+ 'vi-ant-design:field-string-outlined',
+ 'vi-ant-design:field-time-outlined',
+ 'vi-ant-design:file-add-filled',
+ 'vi-ant-design:file-add-outlined',
+ 'vi-ant-design:file-add-twotone',
+ 'vi-ant-design:file-done-outlined',
+ 'vi-ant-design:file-excel-filled',
+ 'vi-ant-design:file-excel-outlined',
+ 'vi-ant-design:file-excel-twotone',
+ 'vi-ant-design:file-exclamation-filled',
+ 'vi-ant-design:file-exclamation-outlined',
+ 'vi-ant-design:file-exclamation-twotone',
+ 'vi-ant-design:file-filled',
+ 'vi-ant-design:file-gif-outlined',
+ 'vi-ant-design:file-image-filled',
+ 'vi-ant-design:file-image-outlined',
+ 'vi-ant-design:file-image-twotone',
+ 'vi-ant-design:file-jpg-outlined',
+ 'vi-ant-design:file-markdown-filled',
+ 'vi-ant-design:file-markdown-outlined',
+ 'vi-ant-design:file-markdown-twotone',
+ 'vi-ant-design:file-outlined',
+ 'vi-ant-design:file-pdf-filled',
+ 'vi-ant-design:file-pdf-outlined',
+ 'vi-ant-design:file-pdf-twotone',
+ 'vi-ant-design:file-ppt-filled',
+ 'vi-ant-design:file-ppt-outlined',
+ 'vi-ant-design:file-ppt-twotone',
+ 'vi-ant-design:file-protect-outlined',
+ 'vi-ant-design:file-search-outlined',
+ 'vi-ant-design:file-sync-outlined',
+ 'vi-ant-design:file-text-filled',
+ 'vi-ant-design:file-text-outlined',
+ 'vi-ant-design:file-text-twotone',
+ 'vi-ant-design:file-twotone',
+ 'vi-ant-design:file-unknown-filled',
+ 'vi-ant-design:file-unknown-outlined',
+ 'vi-ant-design:file-unknown-twotone',
+ 'vi-ant-design:file-word-filled',
+ 'vi-ant-design:file-word-outlined',
+ 'vi-ant-design:file-word-twotone',
+ 'vi-ant-design:file-zip-filled',
+ 'vi-ant-design:file-zip-outlined',
+ 'vi-ant-design:file-zip-twotone',
+ 'vi-ant-design:filter-filled',
+ 'vi-ant-design:filter-outlined',
+ 'vi-ant-design:filter-twotone',
+ 'vi-ant-design:fire-filled',
+ 'vi-ant-design:fire-outlined',
+ 'vi-ant-design:fire-twotone',
+ 'vi-ant-design:flag-filled',
+ 'vi-ant-design:flag-outlined',
+ 'vi-ant-design:flag-twotone',
+ 'vi-ant-design:folder-add-filled',
+ 'vi-ant-design:folder-add-outlined',
+ 'vi-ant-design:folder-add-twotone',
+ 'vi-ant-design:folder-filled',
+ 'vi-ant-design:folder-open-filled',
+ 'vi-ant-design:folder-open-outlined',
+ 'vi-ant-design:folder-open-twotone',
+ 'vi-ant-design:folder-outlined',
+ 'vi-ant-design:folder-twotone',
+ 'vi-ant-design:folder-view-outlined',
+ 'vi-ant-design:font-colors-outlined',
+ 'vi-ant-design:font-size-outlined',
+ 'vi-ant-design:fork-outlined',
+ 'vi-ant-design:form-outlined',
+ 'vi-ant-design:format-painter-filled',
+ 'vi-ant-design:format-painter-outlined',
+ 'vi-ant-design:forward-filled',
+ 'vi-ant-design:forward-outlined',
+ 'vi-ant-design:frown-filled',
+ 'vi-ant-design:frown-outlined',
+ 'vi-ant-design:frown-twotone',
+ 'vi-ant-design:fullscreen-exit-outlined',
+ 'vi-ant-design:fullscreen-outlined',
+ 'vi-ant-design:function-outlined',
+ 'vi-ant-design:fund-filled',
+ 'vi-ant-design:fund-outlined',
+ 'vi-ant-design:fund-projection-screen-outlined',
+ 'vi-ant-design:fund-twotone',
+ 'vi-ant-design:fund-view-outlined',
+ 'vi-ant-design:funnel-plot-filled',
+ 'vi-ant-design:funnel-plot-outlined',
+ 'vi-ant-design:funnel-plot-twotone',
+ 'vi-ant-design:gateway-outlined',
+ 'vi-ant-design:gif-outlined',
+ 'vi-ant-design:gift-filled',
+ 'vi-ant-design:gift-outlined',
+ 'vi-ant-design:gift-twotone',
+ 'vi-ant-design:github-filled',
+ 'vi-ant-design:github-outlined',
+ 'vi-ant-design:gitlab-filled',
+ 'vi-ant-design:gitlab-outlined',
+ 'vi-ant-design:global-outlined',
+ 'vi-ant-design:gold-filled',
+ 'vi-ant-design:gold-outlined',
+ 'vi-ant-design:gold-twotone',
+ 'vi-ant-design:golden-filled',
+ 'vi-ant-design:google-circle-filled',
+ 'vi-ant-design:google-outlined',
+ 'vi-ant-design:google-plus-circle-filled',
+ 'vi-ant-design:google-plus-outlined',
+ 'vi-ant-design:google-plus-square-filled',
+ 'vi-ant-design:google-square-filled',
+ 'vi-ant-design:group-outlined',
+ 'vi-ant-design:harmony-o-s-outlined',
+ 'vi-ant-design:hdd-filled',
+ 'vi-ant-design:hdd-outlined',
+ 'vi-ant-design:hdd-twotone',
+ 'vi-ant-design:heart-filled',
+ 'vi-ant-design:heart-outlined',
+ 'vi-ant-design:heart-twotone',
+ 'vi-ant-design:heat-map-outlined',
+ 'vi-ant-design:highlight-filled',
+ 'vi-ant-design:highlight-outlined',
+ 'vi-ant-design:highlight-twotone',
+ 'vi-ant-design:history-outlined',
+ 'vi-ant-design:holder-outlined',
+ 'vi-ant-design:home-filled',
+ 'vi-ant-design:home-outlined',
+ 'vi-ant-design:home-twotone',
+ 'vi-ant-design:hourglass-filled',
+ 'vi-ant-design:hourglass-outlined',
+ 'vi-ant-design:hourglass-twotone',
+ 'vi-ant-design:html5-filled',
+ 'vi-ant-design:html5-outlined',
+ 'vi-ant-design:html5-twotone',
+ 'vi-ant-design:idcard-filled',
+ 'vi-ant-design:idcard-outlined',
+ 'vi-ant-design:idcard-twotone',
+ 'vi-ant-design:ie-circle-filled',
+ 'vi-ant-design:ie-outlined',
+ 'vi-ant-design:ie-square-filled',
+ 'vi-ant-design:import-outlined',
+ 'vi-ant-design:inbox-outlined',
+ 'vi-ant-design:info-circle-filled',
+ 'vi-ant-design:info-circle-outlined',
+ 'vi-ant-design:info-circle-twotone',
+ 'vi-ant-design:info-outlined',
+ 'vi-ant-design:insert-row-above-outlined',
+ 'vi-ant-design:insert-row-below-outlined',
+ 'vi-ant-design:insert-row-left-outlined',
+ 'vi-ant-design:insert-row-right-outlined',
+ 'vi-ant-design:instagram-filled',
+ 'vi-ant-design:instagram-outlined',
+ 'vi-ant-design:insurance-filled',
+ 'vi-ant-design:insurance-outlined',
+ 'vi-ant-design:insurance-twotone',
+ 'vi-ant-design:interaction-filled',
+ 'vi-ant-design:interaction-outlined',
+ 'vi-ant-design:interaction-twotone',
+ 'vi-ant-design:issues-close-outlined',
+ 'vi-ant-design:italic-outlined',
+ 'vi-ant-design:java-outlined',
+ 'vi-ant-design:java-script-outlined',
+ 'vi-ant-design:key-outlined',
+ 'vi-ant-design:kubernetes-outlined',
+ 'vi-ant-design:laptop-outlined',
+ 'vi-ant-design:layout-filled',
+ 'vi-ant-design:layout-outlined',
+ 'vi-ant-design:layout-twotone',
+ 'vi-ant-design:left-circle-filled',
+ 'vi-ant-design:left-circle-outlined',
+ 'vi-ant-design:left-circle-twotone',
+ 'vi-ant-design:left-outlined',
+ 'vi-ant-design:left-square-filled',
+ 'vi-ant-design:left-square-outlined',
+ 'vi-ant-design:left-square-twotone',
+ 'vi-ant-design:like-filled',
+ 'vi-ant-design:like-outlined',
+ 'vi-ant-design:like-twotone',
+ 'vi-ant-design:line-chart-outlined',
+ 'vi-ant-design:line-height-outlined',
+ 'vi-ant-design:line-outlined',
+ 'vi-ant-design:link-outlined',
+ 'vi-ant-design:linkedin-filled',
+ 'vi-ant-design:linkedin-outlined',
+ 'vi-ant-design:linux-outlined',
+ 'vi-ant-design:loading-3-quarters-outlined',
+ 'vi-ant-design:loading-outlined',
+ 'vi-ant-design:lock-filled',
+ 'vi-ant-design:lock-outlined',
+ 'vi-ant-design:lock-twotone',
+ 'vi-ant-design:login-outlined',
+ 'vi-ant-design:logout-outlined',
+ 'vi-ant-design:mac-command-filled',
+ 'vi-ant-design:mac-command-outlined',
+ 'vi-ant-design:mail-filled',
+ 'vi-ant-design:mail-outlined',
+ 'vi-ant-design:mail-twotone',
+ 'vi-ant-design:man-outlined',
+ 'vi-ant-design:medicine-box-filled',
+ 'vi-ant-design:medicine-box-outlined',
+ 'vi-ant-design:medicine-box-twotone',
+ 'vi-ant-design:medium-circle-filled',
+ 'vi-ant-design:medium-outlined',
+ 'vi-ant-design:medium-square-filled',
+ 'vi-ant-design:medium-workmark-outlined',
+ 'vi-ant-design:meh-filled',
+ 'vi-ant-design:meh-outlined',
+ 'vi-ant-design:meh-twotone',
+ 'vi-ant-design:menu-fold-outlined',
+ 'vi-ant-design:menu-outlined',
+ 'vi-ant-design:menu-unfold-outlined',
+ 'vi-ant-design:merge-cells-outlined',
+ 'vi-ant-design:merge-filled',
+ 'vi-ant-design:merge-outlined',
+ 'vi-ant-design:message-filled',
+ 'vi-ant-design:message-outlined',
+ 'vi-ant-design:message-twotone',
+ 'vi-ant-design:minus-circle-filled',
+ 'vi-ant-design:minus-circle-outlined',
+ 'vi-ant-design:minus-circle-twotone',
+ 'vi-ant-design:minus-outlined',
+ 'vi-ant-design:minus-square-filled',
+ 'vi-ant-design:minus-square-outlined',
+ 'vi-ant-design:minus-square-twotone',
+ 'vi-ant-design:mobile-filled',
+ 'vi-ant-design:mobile-outlined',
+ 'vi-ant-design:mobile-twotone',
+ 'vi-ant-design:money-collect-filled',
+ 'vi-ant-design:money-collect-outlined',
+ 'vi-ant-design:money-collect-twotone',
+ 'vi-ant-design:monitor-outlined',
+ 'vi-ant-design:moon-filled',
+ 'vi-ant-design:moon-outlined',
+ 'vi-ant-design:more-outlined',
+ 'vi-ant-design:muted-filled',
+ 'vi-ant-design:muted-outlined',
+ 'vi-ant-design:node-collapse-outlined',
+ 'vi-ant-design:node-expand-outlined',
+ 'vi-ant-design:node-index-outlined',
+ 'vi-ant-design:notification-filled',
+ 'vi-ant-design:notification-outlined',
+ 'vi-ant-design:notification-twotone',
+ 'vi-ant-design:number-outlined',
+ 'vi-ant-design:one-to-one-outlined',
+ 'vi-ant-design:open-a-i-filled',
+ 'vi-ant-design:open-a-i-outlined',
+ 'vi-ant-design:ordered-list-outlined',
+ 'vi-ant-design:paper-clip-outlined',
+ 'vi-ant-design:partition-outlined',
+ 'vi-ant-design:pause-circle-filled',
+ 'vi-ant-design:pause-circle-outlined',
+ 'vi-ant-design:pause-circle-twotone',
+ 'vi-ant-design:pause-outlined',
+ 'vi-ant-design:pay-circle-filled',
+ 'vi-ant-design:pay-circle-outlined',
+ 'vi-ant-design:percentage-outlined',
+ 'vi-ant-design:phone-filled',
+ 'vi-ant-design:phone-outlined',
+ 'vi-ant-design:phone-twotone',
+ 'vi-ant-design:pic-center-outlined',
+ 'vi-ant-design:pic-left-outlined',
+ 'vi-ant-design:pic-right-outlined',
+ 'vi-ant-design:picture-filled',
+ 'vi-ant-design:picture-outlined',
+ 'vi-ant-design:picture-twotone',
+ 'vi-ant-design:pie-chart-filled',
+ 'vi-ant-design:pie-chart-outlined',
+ 'vi-ant-design:pie-chart-twotone',
+ 'vi-ant-design:pinterest-filled',
+ 'vi-ant-design:pinterest-outlined',
+ 'vi-ant-design:play-circle-filled',
+ 'vi-ant-design:play-circle-outlined',
+ 'vi-ant-design:play-circle-twotone',
+ 'vi-ant-design:play-square-filled',
+ 'vi-ant-design:play-square-outlined',
+ 'vi-ant-design:play-square-twotone',
+ 'vi-ant-design:plus-circle-filled',
+ 'vi-ant-design:plus-circle-outlined',
+ 'vi-ant-design:plus-circle-twotone',
+ 'vi-ant-design:plus-outlined',
+ 'vi-ant-design:plus-square-filled',
+ 'vi-ant-design:plus-square-outlined',
+ 'vi-ant-design:plus-square-twotone',
+ 'vi-ant-design:pound-circle-filled',
+ 'vi-ant-design:pound-circle-outlined',
+ 'vi-ant-design:pound-circle-twotone',
+ 'vi-ant-design:pound-outlined',
+ 'vi-ant-design:poweroff-outlined',
+ 'vi-ant-design:printer-filled',
+ 'vi-ant-design:printer-outlined',
+ 'vi-ant-design:printer-twotone',
+ 'vi-ant-design:product-filled',
+ 'vi-ant-design:product-outlined',
+ 'vi-ant-design:profile-filled',
+ 'vi-ant-design:profile-outlined',
+ 'vi-ant-design:profile-twotone',
+ 'vi-ant-design:project-filled',
+ 'vi-ant-design:project-outlined',
+ 'vi-ant-design:project-twotone',
+ 'vi-ant-design:property-safety-filled',
+ 'vi-ant-design:property-safety-outlined',
+ 'vi-ant-design:property-safety-twotone',
+ 'vi-ant-design:pull-request-outlined',
+ 'vi-ant-design:pushpin-filled',
+ 'vi-ant-design:pushpin-outlined',
+ 'vi-ant-design:pushpin-twotone',
+ 'vi-ant-design:python-outlined',
+ 'vi-ant-design:qq-circle-filled',
+ 'vi-ant-design:qq-outlined',
+ 'vi-ant-design:qq-square-filled',
+ 'vi-ant-design:qrcode-outlined',
+ 'vi-ant-design:question-circle-filled',
+ 'vi-ant-design:question-circle-outlined',
+ 'vi-ant-design:question-circle-twotone',
+ 'vi-ant-design:question-outlined',
+ 'vi-ant-design:radar-chart-outlined',
+ 'vi-ant-design:radius-bottomleft-outlined',
+ 'vi-ant-design:radius-bottomright-outlined',
+ 'vi-ant-design:radius-setting-outlined',
+ 'vi-ant-design:radius-upleft-outlined',
+ 'vi-ant-design:radius-upright-outlined',
+ 'vi-ant-design:read-filled',
+ 'vi-ant-design:read-outlined',
+ 'vi-ant-design:reconciliation-filled',
+ 'vi-ant-design:reconciliation-outlined',
+ 'vi-ant-design:reconciliation-twotone',
+ 'vi-ant-design:red-envelope-filled',
+ 'vi-ant-design:red-envelope-outlined',
+ 'vi-ant-design:red-envelope-twotone',
+ 'vi-ant-design:reddit-circle-filled',
+ 'vi-ant-design:reddit-outlined',
+ 'vi-ant-design:reddit-square-filled',
+ 'vi-ant-design:redo-outlined',
+ 'vi-ant-design:reload-outlined',
+ 'vi-ant-design:rest-filled',
+ 'vi-ant-design:rest-outlined',
+ 'vi-ant-design:rest-twotone',
+ 'vi-ant-design:retweet-outlined',
+ 'vi-ant-design:right-circle-filled',
+ 'vi-ant-design:right-circle-outlined',
+ 'vi-ant-design:right-circle-twotone',
+ 'vi-ant-design:right-outlined',
+ 'vi-ant-design:right-square-filled',
+ 'vi-ant-design:right-square-outlined',
+ 'vi-ant-design:right-square-twotone',
+ 'vi-ant-design:rise-outlined',
+ 'vi-ant-design:robot-filled',
+ 'vi-ant-design:robot-outlined',
+ 'vi-ant-design:rocket-filled',
+ 'vi-ant-design:rocket-outlined',
+ 'vi-ant-design:rocket-twotone',
+ 'vi-ant-design:rollback-outlined',
+ 'vi-ant-design:rotate-left-outlined',
+ 'vi-ant-design:rotate-right-outlined',
+ 'vi-ant-design:ruby-outlined',
+ 'vi-ant-design:safety-certificate-filled',
+ 'vi-ant-design:safety-certificate-outlined',
+ 'vi-ant-design:safety-certificate-twotone',
+ 'vi-ant-design:safety-outlined',
+ 'vi-ant-design:save-filled',
+ 'vi-ant-design:save-outlined',
+ 'vi-ant-design:save-twotone',
+ 'vi-ant-design:scan-outlined',
+ 'vi-ant-design:schedule-filled',
+ 'vi-ant-design:schedule-outlined',
+ 'vi-ant-design:schedule-twotone',
+ 'vi-ant-design:scissor-outlined',
+ 'vi-ant-design:search-outlined',
+ 'vi-ant-design:security-scan-filled',
+ 'vi-ant-design:security-scan-outlined',
+ 'vi-ant-design:security-scan-twotone',
+ 'vi-ant-design:select-outlined',
+ 'vi-ant-design:send-outlined',
+ 'vi-ant-design:setting-filled',
+ 'vi-ant-design:setting-outlined',
+ 'vi-ant-design:setting-twotone',
+ 'vi-ant-design:shake-outlined',
+ 'vi-ant-design:share-alt-outlined',
+ 'vi-ant-design:shop-filled',
+ 'vi-ant-design:shop-outlined',
+ 'vi-ant-design:shop-twotone',
+ 'vi-ant-design:shopping-cart-outlined',
+ 'vi-ant-design:shopping-filled',
+ 'vi-ant-design:shopping-outlined',
+ 'vi-ant-design:shopping-twotone',
+ 'vi-ant-design:shrink-outlined',
+ 'vi-ant-design:signal-filled',
+ 'vi-ant-design:signature-filled',
+ 'vi-ant-design:signature-outlined',
+ 'vi-ant-design:sisternode-outlined',
+ 'vi-ant-design:sketch-circle-filled',
+ 'vi-ant-design:sketch-outlined',
+ 'vi-ant-design:sketch-square-filled',
+ 'vi-ant-design:skin-filled',
+ 'vi-ant-design:skin-outlined',
+ 'vi-ant-design:skin-twotone',
+ 'vi-ant-design:skype-filled',
+ 'vi-ant-design:skype-outlined',
+ 'vi-ant-design:slack-circle-filled',
+ 'vi-ant-design:slack-outlined',
+ 'vi-ant-design:slack-square-filled',
+ 'vi-ant-design:slack-square-outlined',
+ 'vi-ant-design:sliders-filled',
+ 'vi-ant-design:sliders-outlined',
+ 'vi-ant-design:sliders-twotone',
+ 'vi-ant-design:small-dash-outlined',
+ 'vi-ant-design:smile-filled',
+ 'vi-ant-design:smile-outlined',
+ 'vi-ant-design:smile-twotone',
+ 'vi-ant-design:snippets-filled',
+ 'vi-ant-design:snippets-outlined',
+ 'vi-ant-design:snippets-twotone',
+ 'vi-ant-design:solution-outlined',
+ 'vi-ant-design:sort-ascending-outlined',
+ 'vi-ant-design:sort-descending-outlined',
+ 'vi-ant-design:sound-filled',
+ 'vi-ant-design:sound-outlined',
+ 'vi-ant-design:sound-twotone',
+ 'vi-ant-design:split-cells-outlined',
+ 'vi-ant-design:spotify-filled',
+ 'vi-ant-design:spotify-outlined',
+ 'vi-ant-design:star-filled',
+ 'vi-ant-design:star-outlined',
+ 'vi-ant-design:star-twotone',
+ 'vi-ant-design:step-backward-filled',
+ 'vi-ant-design:step-backward-outlined',
+ 'vi-ant-design:step-forward-filled',
+ 'vi-ant-design:step-forward-outlined',
+ 'vi-ant-design:stock-outlined',
+ 'vi-ant-design:stop-filled',
+ 'vi-ant-design:stop-outlined',
+ 'vi-ant-design:stop-twotone',
+ 'vi-ant-design:strikethrough-outlined',
+ 'vi-ant-design:subnode-outlined',
+ 'vi-ant-design:sun-filled',
+ 'vi-ant-design:sun-outlined',
+ 'vi-ant-design:swap-left-outlined',
+ 'vi-ant-design:swap-outlined',
+ 'vi-ant-design:swap-right-outlined',
+ 'vi-ant-design:switcher-filled',
+ 'vi-ant-design:switcher-outlined',
+ 'vi-ant-design:switcher-twotone',
+ 'vi-ant-design:sync-outlined',
+ 'vi-ant-design:table-outlined',
+ 'vi-ant-design:tablet-filled',
+ 'vi-ant-design:tablet-outlined',
+ 'vi-ant-design:tablet-twotone',
+ 'vi-ant-design:tag-filled',
+ 'vi-ant-design:tag-outlined',
+ 'vi-ant-design:tag-twotone',
+ 'vi-ant-design:tags-filled',
+ 'vi-ant-design:tags-outlined',
+ 'vi-ant-design:tags-twotone',
+ 'vi-ant-design:taobao-circle-filled',
+ 'vi-ant-design:taobao-circle-outlined',
+ 'vi-ant-design:taobao-outlined',
+ 'vi-ant-design:taobao-square-filled',
+ 'vi-ant-design:team-outlined',
+ 'vi-ant-design:thunderbolt-filled',
+ 'vi-ant-design:thunderbolt-outlined',
+ 'vi-ant-design:thunderbolt-twotone',
+ 'vi-ant-design:tik-tok-filled',
+ 'vi-ant-design:tik-tok-outlined',
+ 'vi-ant-design:to-top-outlined',
+ 'vi-ant-design:tool-filled',
+ 'vi-ant-design:tool-outlined',
+ 'vi-ant-design:tool-twotone',
+ 'vi-ant-design:trademark-circle-filled',
+ 'vi-ant-design:trademark-circle-outlined',
+ 'vi-ant-design:trademark-circle-twotone',
+ 'vi-ant-design:trademark-outlined',
+ 'vi-ant-design:transaction-outlined',
+ 'vi-ant-design:translation-outlined',
+ 'vi-ant-design:trophy-filled',
+ 'vi-ant-design:trophy-outlined',
+ 'vi-ant-design:trophy-twotone',
+ 'vi-ant-design:truck-filled',
+ 'vi-ant-design:truck-outlined',
+ 'vi-ant-design:twitch-outlined',
+ 'vi-ant-design:twitter-circle-filled',
+ 'vi-ant-design:twitter-outlined',
+ 'vi-ant-design:twitter-square-filled',
+ 'vi-ant-design:underline-outlined',
+ 'vi-ant-design:undo-outlined',
+ 'vi-ant-design:ungroup-outlined',
+ 'vi-ant-design:unlock-filled',
+ 'vi-ant-design:unlock-outlined',
+ 'vi-ant-design:unlock-twotone',
+ 'vi-ant-design:unordered-list-outlined',
+ 'vi-ant-design:up-circle-filled',
+ 'vi-ant-design:up-circle-outlined',
+ 'vi-ant-design:up-circle-twotone',
+ 'vi-ant-design:up-outlined',
+ 'vi-ant-design:up-square-filled',
+ 'vi-ant-design:up-square-outlined',
+ 'vi-ant-design:up-square-twotone',
+ 'vi-ant-design:upload-outlined',
+ 'vi-ant-design:usb-filled',
+ 'vi-ant-design:usb-outlined',
+ 'vi-ant-design:usb-twotone',
+ 'vi-ant-design:user-add-outlined',
+ 'vi-ant-design:user-delete-outlined',
+ 'vi-ant-design:user-outlined',
+ 'vi-ant-design:user-switch-outlined',
+ 'vi-ant-design:usergroup-add-outlined',
+ 'vi-ant-design:usergroup-delete-outlined',
+ 'vi-ant-design:verified-outlined',
+ 'vi-ant-design:vertical-align-bottom-outlined',
+ 'vi-ant-design:vertical-align-middle-outlined',
+ 'vi-ant-design:vertical-align-top-outlined',
+ 'vi-ant-design:vertical-left-outlined',
+ 'vi-ant-design:vertical-right-outlined',
+ 'vi-ant-design:video-camera-add-outlined',
+ 'vi-ant-design:video-camera-filled',
+ 'vi-ant-design:video-camera-outlined',
+ 'vi-ant-design:video-camera-twotone',
+ 'vi-ant-design:wallet-filled',
+ 'vi-ant-design:wallet-outlined',
+ 'vi-ant-design:wallet-twotone',
+ 'vi-ant-design:warning-filled',
+ 'vi-ant-design:warning-outlined',
+ 'vi-ant-design:warning-twotone',
+ 'vi-ant-design:wechat-filled',
+ 'vi-ant-design:wechat-outlined',
+ 'vi-ant-design:wechat-work-filled',
+ 'vi-ant-design:wechat-work-outlined',
+ 'vi-ant-design:weibo-circle-filled',
+ 'vi-ant-design:weibo-circle-outlined',
+ 'vi-ant-design:weibo-outlined',
+ 'vi-ant-design:weibo-square-filled',
+ 'vi-ant-design:weibo-square-outlined',
+ 'vi-ant-design:whats-app-outlined',
+ 'vi-ant-design:wifi-outlined',
+ 'vi-ant-design:windows-filled',
+ 'vi-ant-design:windows-outlined',
+ 'vi-ant-design:woman-outlined',
+ 'vi-ant-design:x-filled',
+ 'vi-ant-design:x-outlined',
+ 'vi-ant-design:yahoo-filled',
+ 'vi-ant-design:yahoo-outlined',
+ 'vi-ant-design:youtube-filled',
+ 'vi-ant-design:youtube-outlined',
+ 'vi-ant-design:yuque-filled',
+ 'vi-ant-design:yuque-outlined',
+ 'vi-ant-design:zhihu-circle-filled',
+ 'vi-ant-design:zhihu-outlined',
+ 'vi-ant-design:zhihu-square-filled',
+ 'vi-ant-design:zoom-in-outlined',
+ 'vi-ant-design:zoom-out-outlined'
+ ]
+}
diff --git a/src/components/IconPicker/src/data/icons.ep.ts b/src/components/IconPicker/src/data/icons.ep.ts
new file mode 100644
index 0000000..b3918be
--- /dev/null
+++ b/src/components/IconPicker/src/data/icons.ep.ts
@@ -0,0 +1,299 @@
+export default {
+ name: 'Element Plus',
+ prefix: 'vi-ep',
+ icons: [
+ 'vi-ep:add-location',
+ 'vi-ep:aim',
+ 'vi-ep:alarm-clock',
+ 'vi-ep:apple',
+ 'vi-ep:arrow-down',
+ 'vi-ep:arrow-down-bold',
+ 'vi-ep:arrow-left',
+ 'vi-ep:arrow-left-bold',
+ 'vi-ep:arrow-right',
+ 'vi-ep:arrow-right-bold',
+ 'vi-ep:arrow-up',
+ 'vi-ep:arrow-up-bold',
+ 'vi-ep:avatar',
+ 'vi-ep:back',
+ 'vi-ep:baseball',
+ 'vi-ep:basketball',
+ 'vi-ep:bell',
+ 'vi-ep:bell-filled',
+ 'vi-ep:bicycle',
+ 'vi-ep:bottom',
+ 'vi-ep:bottom-left',
+ 'vi-ep:bottom-right',
+ 'vi-ep:bowl',
+ 'vi-ep:box',
+ 'vi-ep:briefcase',
+ 'vi-ep:brush',
+ 'vi-ep:brush-filled',
+ 'vi-ep:burger',
+ 'vi-ep:calendar',
+ 'vi-ep:camera',
+ 'vi-ep:camera-filled',
+ 'vi-ep:caret-bottom',
+ 'vi-ep:caret-left',
+ 'vi-ep:caret-right',
+ 'vi-ep:caret-top',
+ 'vi-ep:cellphone',
+ 'vi-ep:chat-dot-round',
+ 'vi-ep:chat-dot-square',
+ 'vi-ep:chat-line-round',
+ 'vi-ep:chat-line-square',
+ 'vi-ep:chat-round',
+ 'vi-ep:chat-square',
+ 'vi-ep:check',
+ 'vi-ep:checked',
+ 'vi-ep:cherry',
+ 'vi-ep:chicken',
+ 'vi-ep:chrome-filled',
+ 'vi-ep:circle-check',
+ 'vi-ep:circle-check-filled',
+ 'vi-ep:circle-close',
+ 'vi-ep:circle-close-filled',
+ 'vi-ep:circle-plus',
+ 'vi-ep:circle-plus-filled',
+ 'vi-ep:clock',
+ 'vi-ep:close',
+ 'vi-ep:close-bold',
+ 'vi-ep:cloudy',
+ 'vi-ep:coffee',
+ 'vi-ep:coffee-cup',
+ 'vi-ep:coin',
+ 'vi-ep:cold-drink',
+ 'vi-ep:collection',
+ 'vi-ep:collection-tag',
+ 'vi-ep:comment',
+ 'vi-ep:compass',
+ 'vi-ep:connection',
+ 'vi-ep:coordinate',
+ 'vi-ep:copy-document',
+ 'vi-ep:cpu',
+ 'vi-ep:credit-card',
+ 'vi-ep:crop',
+ 'vi-ep:d-arrow-left',
+ 'vi-ep:d-arrow-right',
+ 'vi-ep:d-caret',
+ 'vi-ep:data-analysis',
+ 'vi-ep:data-board',
+ 'vi-ep:data-line',
+ 'vi-ep:delete',
+ 'vi-ep:delete-filled',
+ 'vi-ep:delete-location',
+ 'vi-ep:dessert',
+ 'vi-ep:discount',
+ 'vi-ep:dish',
+ 'vi-ep:dish-dot',
+ 'vi-ep:document',
+ 'vi-ep:document-add',
+ 'vi-ep:document-checked',
+ 'vi-ep:document-copy',
+ 'vi-ep:document-delete',
+ 'vi-ep:document-remove',
+ 'vi-ep:download',
+ 'vi-ep:drizzling',
+ 'vi-ep:edit',
+ 'vi-ep:edit-pen',
+ 'vi-ep:eleme',
+ 'vi-ep:eleme-filled',
+ 'vi-ep:element-plus',
+ 'vi-ep:expand',
+ 'vi-ep:failed',
+ 'vi-ep:female',
+ 'vi-ep:files',
+ 'vi-ep:film',
+ 'vi-ep:filter',
+ 'vi-ep:finished',
+ 'vi-ep:first-aid-kit',
+ 'vi-ep:flag',
+ 'vi-ep:fold',
+ 'vi-ep:folder',
+ 'vi-ep:folder-add',
+ 'vi-ep:folder-checked',
+ 'vi-ep:folder-delete',
+ 'vi-ep:folder-opened',
+ 'vi-ep:folder-remove',
+ 'vi-ep:food',
+ 'vi-ep:football',
+ 'vi-ep:fork-spoon',
+ 'vi-ep:fries',
+ 'vi-ep:full-screen',
+ 'vi-ep:goblet',
+ 'vi-ep:goblet-full',
+ 'vi-ep:goblet-square',
+ 'vi-ep:goblet-square-full',
+ 'vi-ep:gold-medal',
+ 'vi-ep:goods',
+ 'vi-ep:goods-filled',
+ 'vi-ep:grape',
+ 'vi-ep:grid',
+ 'vi-ep:guide',
+ 'vi-ep:handbag',
+ 'vi-ep:headset',
+ 'vi-ep:help',
+ 'vi-ep:help-filled',
+ 'vi-ep:hide',
+ 'vi-ep:histogram',
+ 'vi-ep:home-filled',
+ 'vi-ep:hot-water',
+ 'vi-ep:house',
+ 'vi-ep:ice-cream',
+ 'vi-ep:ice-cream-round',
+ 'vi-ep:ice-cream-square',
+ 'vi-ep:ice-drink',
+ 'vi-ep:ice-tea',
+ 'vi-ep:info-filled',
+ 'vi-ep:iphone',
+ 'vi-ep:key',
+ 'vi-ep:knife-fork',
+ 'vi-ep:lightning',
+ 'vi-ep:link',
+ 'vi-ep:list',
+ 'vi-ep:loading',
+ 'vi-ep:location',
+ 'vi-ep:location-filled',
+ 'vi-ep:location-information',
+ 'vi-ep:lock',
+ 'vi-ep:lollipop',
+ 'vi-ep:magic-stick',
+ 'vi-ep:magnet',
+ 'vi-ep:male',
+ 'vi-ep:management',
+ 'vi-ep:map-location',
+ 'vi-ep:medal',
+ 'vi-ep:memo',
+ 'vi-ep:menu',
+ 'vi-ep:message',
+ 'vi-ep:message-box',
+ 'vi-ep:mic',
+ 'vi-ep:microphone',
+ 'vi-ep:milk-tea',
+ 'vi-ep:minus',
+ 'vi-ep:money',
+ 'vi-ep:monitor',
+ 'vi-ep:moon',
+ 'vi-ep:moon-night',
+ 'vi-ep:more',
+ 'vi-ep:more-filled',
+ 'vi-ep:mostly-cloudy',
+ 'vi-ep:mouse',
+ 'vi-ep:mug',
+ 'vi-ep:mute',
+ 'vi-ep:mute-notification',
+ 'vi-ep:no-smoking',
+ 'vi-ep:notebook',
+ 'vi-ep:notification',
+ 'vi-ep:odometer',
+ 'vi-ep:office-building',
+ 'vi-ep:open',
+ 'vi-ep:operation',
+ 'vi-ep:opportunity',
+ 'vi-ep:orange',
+ 'vi-ep:paperclip',
+ 'vi-ep:partly-cloudy',
+ 'vi-ep:pear',
+ 'vi-ep:phone',
+ 'vi-ep:phone-filled',
+ 'vi-ep:picture',
+ 'vi-ep:picture-filled',
+ 'vi-ep:picture-rounded',
+ 'vi-ep:pie-chart',
+ 'vi-ep:place',
+ 'vi-ep:platform',
+ 'vi-ep:plus',
+ 'vi-ep:pointer',
+ 'vi-ep:position',
+ 'vi-ep:postcard',
+ 'vi-ep:pouring',
+ 'vi-ep:present',
+ 'vi-ep:price-tag',
+ 'vi-ep:printer',
+ 'vi-ep:promotion',
+ 'vi-ep:quartz-watch',
+ 'vi-ep:question-filled',
+ 'vi-ep:rank',
+ 'vi-ep:reading',
+ 'vi-ep:reading-lamp',
+ 'vi-ep:refresh',
+ 'vi-ep:refresh-left',
+ 'vi-ep:refresh-right',
+ 'vi-ep:refrigerator',
+ 'vi-ep:remove',
+ 'vi-ep:remove-filled',
+ 'vi-ep:right',
+ 'vi-ep:scale-to-original',
+ 'vi-ep:school',
+ 'vi-ep:scissor',
+ 'vi-ep:search',
+ 'vi-ep:select',
+ 'vi-ep:sell',
+ 'vi-ep:semi-select',
+ 'vi-ep:service',
+ 'vi-ep:set-up',
+ 'vi-ep:setting',
+ 'vi-ep:share',
+ 'vi-ep:ship',
+ 'vi-ep:shop',
+ 'vi-ep:shopping-bag',
+ 'vi-ep:shopping-cart',
+ 'vi-ep:shopping-cart-full',
+ 'vi-ep:shopping-trolley',
+ 'vi-ep:smoking',
+ 'vi-ep:soccer',
+ 'vi-ep:sold-out',
+ 'vi-ep:sort',
+ 'vi-ep:sort-down',
+ 'vi-ep:sort-up',
+ 'vi-ep:stamp',
+ 'vi-ep:star',
+ 'vi-ep:star-filled',
+ 'vi-ep:stopwatch',
+ 'vi-ep:success-filled',
+ 'vi-ep:sugar',
+ 'vi-ep:suitcase',
+ 'vi-ep:suitcase-line',
+ 'vi-ep:sunny',
+ 'vi-ep:sunrise',
+ 'vi-ep:sunset',
+ 'vi-ep:switch',
+ 'vi-ep:switch-button',
+ 'vi-ep:switch-filled',
+ 'vi-ep:takeaway-box',
+ 'vi-ep:ticket',
+ 'vi-ep:tickets',
+ 'vi-ep:timer',
+ 'vi-ep:toilet-paper',
+ 'vi-ep:tools',
+ 'vi-ep:top',
+ 'vi-ep:top-left',
+ 'vi-ep:top-right',
+ 'vi-ep:trend-charts',
+ 'vi-ep:trophy',
+ 'vi-ep:trophy-base',
+ 'vi-ep:turn-off',
+ 'vi-ep:umbrella',
+ 'vi-ep:unlock',
+ 'vi-ep:upload',
+ 'vi-ep:upload-filled',
+ 'vi-ep:user',
+ 'vi-ep:user-filled',
+ 'vi-ep:van',
+ 'vi-ep:video-camera',
+ 'vi-ep:video-camera-filled',
+ 'vi-ep:video-pause',
+ 'vi-ep:video-play',
+ 'vi-ep:view',
+ 'vi-ep:wallet',
+ 'vi-ep:wallet-filled',
+ 'vi-ep:warn-triangle-filled',
+ 'vi-ep:warning',
+ 'vi-ep:warning-filled',
+ 'vi-ep:watch',
+ 'vi-ep:watermelon',
+ 'vi-ep:wind-power',
+ 'vi-ep:zoom-in',
+ 'vi-ep:zoom-out'
+ ]
+}
diff --git a/src/components/IconPicker/src/data/icons.tdesign.ts b/src/components/IconPicker/src/data/icons.tdesign.ts
new file mode 100644
index 0000000..77b298b
--- /dev/null
+++ b/src/components/IconPicker/src/data/icons.tdesign.ts
@@ -0,0 +1,1209 @@
+export default {
+ name: 'TDesign Icons',
+ prefix: 'vi-tdesign',
+ icons: [
+ 'vi-tdesign:activity',
+ 'vi-tdesign:add',
+ 'vi-tdesign:add-and-subtract',
+ 'vi-tdesign:add-circle',
+ 'vi-tdesign:add-rectangle',
+ 'vi-tdesign:address-book',
+ 'vi-tdesign:adjustment',
+ 'vi-tdesign:airplay-wave',
+ 'vi-tdesign:alarm',
+ 'vi-tdesign:alarm-add',
+ 'vi-tdesign:alarm-off',
+ 'vi-tdesign:align-top',
+ 'vi-tdesign:align-vertical',
+ 'vi-tdesign:alpha',
+ 'vi-tdesign:analytics',
+ 'vi-tdesign:anchor',
+ 'vi-tdesign:angry',
+ 'vi-tdesign:animation',
+ 'vi-tdesign:animation-1',
+ 'vi-tdesign:anticlockwise',
+ 'vi-tdesign:api',
+ 'vi-tdesign:app',
+ 'vi-tdesign:apple',
+ 'vi-tdesign:application',
+ 'vi-tdesign:architecture-hui-style',
+ 'vi-tdesign:archway',
+ 'vi-tdesign:archway-1',
+ 'vi-tdesign:arrow-down',
+ 'vi-tdesign:arrow-down-circle',
+ 'vi-tdesign:arrow-down-rectangle',
+ 'vi-tdesign:arrow-left',
+ 'vi-tdesign:arrow-left-circle',
+ 'vi-tdesign:arrow-left-down',
+ 'vi-tdesign:arrow-left-down-circle',
+ 'vi-tdesign:arrow-left-right-1',
+ 'vi-tdesign:arrow-left-right-2',
+ 'vi-tdesign:arrow-left-right-3',
+ 'vi-tdesign:arrow-left-right-circle',
+ 'vi-tdesign:arrow-left-up',
+ 'vi-tdesign:arrow-left-up-circle',
+ 'vi-tdesign:arrow-right',
+ 'vi-tdesign:arrow-right-circle',
+ 'vi-tdesign:arrow-right-down',
+ 'vi-tdesign:arrow-right-down-circle',
+ 'vi-tdesign:arrow-right-up',
+ 'vi-tdesign:arrow-right-up-circle',
+ 'vi-tdesign:arrow-triangle-down',
+ 'vi-tdesign:arrow-triangle-down-filled',
+ 'vi-tdesign:arrow-triangle-up',
+ 'vi-tdesign:arrow-triangle-up-filled',
+ 'vi-tdesign:arrow-up',
+ 'vi-tdesign:arrow-up-circle',
+ 'vi-tdesign:arrow-up-down-1',
+ 'vi-tdesign:arrow-up-down-2',
+ 'vi-tdesign:arrow-up-down-3',
+ 'vi-tdesign:arrow-up-down-circle',
+ 'vi-tdesign:artboard',
+ 'vi-tdesign:article',
+ 'vi-tdesign:assignment',
+ 'vi-tdesign:assignment-checked',
+ 'vi-tdesign:assignment-code',
+ 'vi-tdesign:assignment-error',
+ 'vi-tdesign:assignment-user',
+ 'vi-tdesign:attach',
+ 'vi-tdesign:attic',
+ 'vi-tdesign:attic-1',
+ 'vi-tdesign:audio',
+ 'vi-tdesign:awkward',
+ 'vi-tdesign:backtop',
+ 'vi-tdesign:backtop-rectangle',
+ 'vi-tdesign:backup',
+ 'vi-tdesign:backward',
+ 'vi-tdesign:bad-laugh',
+ 'vi-tdesign:bamboo-shoot',
+ 'vi-tdesign:banana',
+ 'vi-tdesign:barbecue',
+ 'vi-tdesign:barcode',
+ 'vi-tdesign:barcode-1',
+ 'vi-tdesign:base-station',
+ 'vi-tdesign:battery',
+ 'vi-tdesign:battery-add',
+ 'vi-tdesign:battery-charging',
+ 'vi-tdesign:battery-low',
+ 'vi-tdesign:bean',
+ 'vi-tdesign:beer',
+ 'vi-tdesign:beta',
+ 'vi-tdesign:bifurcate',
+ 'vi-tdesign:bill',
+ 'vi-tdesign:blockchain',
+ 'vi-tdesign:bluetooth',
+ 'vi-tdesign:bone',
+ 'vi-tdesign:book',
+ 'vi-tdesign:book-open',
+ 'vi-tdesign:bookmark',
+ 'vi-tdesign:bookmark-add',
+ 'vi-tdesign:bookmark-checked',
+ 'vi-tdesign:bookmark-double',
+ 'vi-tdesign:bookmark-minus',
+ 'vi-tdesign:braces',
+ 'vi-tdesign:brackets',
+ 'vi-tdesign:bread',
+ 'vi-tdesign:bridge',
+ 'vi-tdesign:bridge-1',
+ 'vi-tdesign:bridge-2',
+ 'vi-tdesign:bridge-3',
+ 'vi-tdesign:bridge-4',
+ 'vi-tdesign:bridge-5',
+ 'vi-tdesign:bridge-6',
+ 'vi-tdesign:brightness',
+ 'vi-tdesign:brightness-1',
+ 'vi-tdesign:broccoli',
+ 'vi-tdesign:browse',
+ 'vi-tdesign:browse-gallery',
+ 'vi-tdesign:browse-off',
+ 'vi-tdesign:brush',
+ 'vi-tdesign:bug',
+ 'vi-tdesign:bug-report',
+ 'vi-tdesign:building',
+ 'vi-tdesign:building-1',
+ 'vi-tdesign:building-2',
+ 'vi-tdesign:building-3',
+ 'vi-tdesign:building-4',
+ 'vi-tdesign:building-5',
+ 'vi-tdesign:bulletpoint',
+ 'vi-tdesign:button',
+ 'vi-tdesign:cabbage',
+ 'vi-tdesign:cake',
+ 'vi-tdesign:calculation',
+ 'vi-tdesign:calculation-1',
+ 'vi-tdesign:calculator',
+ 'vi-tdesign:calculator-1',
+ 'vi-tdesign:calendar',
+ 'vi-tdesign:calendar-1',
+ 'vi-tdesign:calendar-2',
+ 'vi-tdesign:calendar-edit',
+ 'vi-tdesign:calendar-event',
+ 'vi-tdesign:call',
+ 'vi-tdesign:call-1',
+ 'vi-tdesign:call-cancel',
+ 'vi-tdesign:call-forwarded',
+ 'vi-tdesign:call-incoming',
+ 'vi-tdesign:call-off',
+ 'vi-tdesign:calm',
+ 'vi-tdesign:calm-1',
+ 'vi-tdesign:camera',
+ 'vi-tdesign:camera-1',
+ 'vi-tdesign:camera-2',
+ 'vi-tdesign:camera-off',
+ 'vi-tdesign:candy',
+ 'vi-tdesign:card',
+ 'vi-tdesign:cardmembership',
+ 'vi-tdesign:caret-down',
+ 'vi-tdesign:caret-down-small',
+ 'vi-tdesign:caret-left',
+ 'vi-tdesign:caret-left-small',
+ 'vi-tdesign:caret-right',
+ 'vi-tdesign:caret-right-small',
+ 'vi-tdesign:caret-up',
+ 'vi-tdesign:caret-up-small',
+ 'vi-tdesign:cart',
+ 'vi-tdesign:cart-add',
+ 'vi-tdesign:cast',
+ 'vi-tdesign:castle',
+ 'vi-tdesign:castle-1',
+ 'vi-tdesign:castle-2',
+ 'vi-tdesign:castle-3',
+ 'vi-tdesign:castle-4',
+ 'vi-tdesign:castle-5',
+ 'vi-tdesign:castle-6',
+ 'vi-tdesign:castle-7',
+ 'vi-tdesign:cat',
+ 'vi-tdesign:catalog',
+ 'vi-tdesign:cd',
+ 'vi-tdesign:celsius',
+ 'vi-tdesign:center-focus-strong',
+ 'vi-tdesign:centimeter',
+ 'vi-tdesign:certificate',
+ 'vi-tdesign:certificate-1',
+ 'vi-tdesign:chart',
+ 'vi-tdesign:chart-3d',
+ 'vi-tdesign:chart-add',
+ 'vi-tdesign:chart-analytics',
+ 'vi-tdesign:chart-area',
+ 'vi-tdesign:chart-area-multi',
+ 'vi-tdesign:chart-bar',
+ 'vi-tdesign:chart-bubble',
+ 'vi-tdesign:chart-colum',
+ 'vi-tdesign:chart-combo',
+ 'vi-tdesign:chart-line',
+ 'vi-tdesign:chart-line-data',
+ 'vi-tdesign:chart-line-data-1',
+ 'vi-tdesign:chart-line-multi',
+ 'vi-tdesign:chart-maximum',
+ 'vi-tdesign:chart-median',
+ 'vi-tdesign:chart-minimum',
+ 'vi-tdesign:chart-pie',
+ 'vi-tdesign:chart-radar',
+ 'vi-tdesign:chart-radial',
+ 'vi-tdesign:chart-ring',
+ 'vi-tdesign:chart-ring-1',
+ 'vi-tdesign:chart-scatter',
+ 'vi-tdesign:chart-stacked',
+ 'vi-tdesign:chat',
+ 'vi-tdesign:chat-add',
+ 'vi-tdesign:chat-bubble',
+ 'vi-tdesign:chat-bubble-1',
+ 'vi-tdesign:chat-bubble-add',
+ 'vi-tdesign:chat-bubble-error',
+ 'vi-tdesign:chat-bubble-help',
+ 'vi-tdesign:chat-bubble-history',
+ 'vi-tdesign:chat-bubble-locked',
+ 'vi-tdesign:chat-bubble-smile',
+ 'vi-tdesign:chat-checked',
+ 'vi-tdesign:chat-clear',
+ 'vi-tdesign:chat-double',
+ 'vi-tdesign:chat-error',
+ 'vi-tdesign:chat-heart',
+ 'vi-tdesign:chat-message',
+ 'vi-tdesign:chat-off',
+ 'vi-tdesign:chat-poll',
+ 'vi-tdesign:chat-setting',
+ 'vi-tdesign:check',
+ 'vi-tdesign:check-circle',
+ 'vi-tdesign:check-circle-filled',
+ 'vi-tdesign:check-double',
+ 'vi-tdesign:check-rectangle',
+ 'vi-tdesign:check-rectangle-filled',
+ 'vi-tdesign:cheese',
+ 'vi-tdesign:cherry',
+ 'vi-tdesign:chevron-down',
+ 'vi-tdesign:chevron-down-circle',
+ 'vi-tdesign:chevron-down-double',
+ 'vi-tdesign:chevron-down-double-s',
+ 'vi-tdesign:chevron-down-rectangle',
+ 'vi-tdesign:chevron-down-s',
+ 'vi-tdesign:chevron-left',
+ 'vi-tdesign:chevron-left-circle',
+ 'vi-tdesign:chevron-left-double',
+ 'vi-tdesign:chevron-left-double-s',
+ 'vi-tdesign:chevron-left-rectangle',
+ 'vi-tdesign:chevron-left-s',
+ 'vi-tdesign:chevron-right',
+ 'vi-tdesign:chevron-right-circle',
+ 'vi-tdesign:chevron-right-double',
+ 'vi-tdesign:chevron-right-double-s',
+ 'vi-tdesign:chevron-right-rectangle',
+ 'vi-tdesign:chevron-right-s',
+ 'vi-tdesign:chevron-up',
+ 'vi-tdesign:chevron-up-circle',
+ 'vi-tdesign:chevron-up-double',
+ 'vi-tdesign:chevron-up-double-s',
+ 'vi-tdesign:chevron-up-rectangle',
+ 'vi-tdesign:chevron-up-s',
+ 'vi-tdesign:chicken',
+ 'vi-tdesign:chili',
+ 'vi-tdesign:chimney',
+ 'vi-tdesign:chimney-1',
+ 'vi-tdesign:chimney-2',
+ 'vi-tdesign:chinese-cabbage',
+ 'vi-tdesign:church',
+ 'vi-tdesign:circle',
+ 'vi-tdesign:city',
+ 'vi-tdesign:city-1',
+ 'vi-tdesign:city-10',
+ 'vi-tdesign:city-11',
+ 'vi-tdesign:city-12',
+ 'vi-tdesign:city-13',
+ 'vi-tdesign:city-14',
+ 'vi-tdesign:city-15',
+ 'vi-tdesign:city-2',
+ 'vi-tdesign:city-3',
+ 'vi-tdesign:city-4',
+ 'vi-tdesign:city-5',
+ 'vi-tdesign:city-6',
+ 'vi-tdesign:city-7',
+ 'vi-tdesign:city-8',
+ 'vi-tdesign:city-9',
+ 'vi-tdesign:city-ancient',
+ 'vi-tdesign:city-ancient-1',
+ 'vi-tdesign:city-ancient-2',
+ 'vi-tdesign:clear',
+ 'vi-tdesign:clear-formatting',
+ 'vi-tdesign:clear-formatting-1',
+ 'vi-tdesign:close',
+ 'vi-tdesign:close-circle',
+ 'vi-tdesign:close-circle-filled',
+ 'vi-tdesign:close-octagon',
+ 'vi-tdesign:close-rectangle',
+ 'vi-tdesign:cloud',
+ 'vi-tdesign:cloud-download',
+ 'vi-tdesign:cloud-upload',
+ 'vi-tdesign:cloudy-day',
+ 'vi-tdesign:cloudy-night',
+ 'vi-tdesign:cloudy-night-rain',
+ 'vi-tdesign:cloudy-rain',
+ 'vi-tdesign:cloudy-sunny',
+ 'vi-tdesign:code',
+ 'vi-tdesign:code-1',
+ 'vi-tdesign:code-off',
+ 'vi-tdesign:cola',
+ 'vi-tdesign:collage',
+ 'vi-tdesign:collection',
+ 'vi-tdesign:color-invert',
+ 'vi-tdesign:combination',
+ 'vi-tdesign:command',
+ 'vi-tdesign:compass',
+ 'vi-tdesign:compass-1',
+ 'vi-tdesign:component-breadcrumb',
+ 'vi-tdesign:component-checkbox',
+ 'vi-tdesign:component-divider-horizontal',
+ 'vi-tdesign:component-divider-vertical',
+ 'vi-tdesign:component-dropdown',
+ 'vi-tdesign:component-grid',
+ 'vi-tdesign:component-input',
+ 'vi-tdesign:component-layout',
+ 'vi-tdesign:component-radio',
+ 'vi-tdesign:component-space',
+ 'vi-tdesign:component-steps',
+ 'vi-tdesign:component-switch',
+ 'vi-tdesign:constraint',
+ 'vi-tdesign:contrast',
+ 'vi-tdesign:contrast-1',
+ 'vi-tdesign:control-platform',
+ 'vi-tdesign:cooperate',
+ 'vi-tdesign:coordinate-system',
+ 'vi-tdesign:copy',
+ 'vi-tdesign:copyright',
+ 'vi-tdesign:corn',
+ 'vi-tdesign:coupon',
+ 'vi-tdesign:course',
+ 'vi-tdesign:cpu',
+ 'vi-tdesign:crack',
+ 'vi-tdesign:creditcard',
+ 'vi-tdesign:creditcard-add',
+ 'vi-tdesign:creditcard-off',
+ 'vi-tdesign:crooked-smile',
+ 'vi-tdesign:cry-and-laugh',
+ 'vi-tdesign:cry-loudly',
+ 'vi-tdesign:css3',
+ 'vi-tdesign:cucumber',
+ 'vi-tdesign:currency-exchange',
+ 'vi-tdesign:cursor',
+ 'vi-tdesign:curtain',
+ 'vi-tdesign:curve',
+ 'vi-tdesign:cut',
+ 'vi-tdesign:cut-1',
+ 'vi-tdesign:dam',
+ 'vi-tdesign:dam-1',
+ 'vi-tdesign:dam-2',
+ 'vi-tdesign:dam-3',
+ 'vi-tdesign:dam-4',
+ 'vi-tdesign:dam-5',
+ 'vi-tdesign:dam-6',
+ 'vi-tdesign:dam-7',
+ 'vi-tdesign:dart-board',
+ 'vi-tdesign:dashboard',
+ 'vi-tdesign:dashboard-1',
+ 'vi-tdesign:data',
+ 'vi-tdesign:data-base',
+ 'vi-tdesign:data-checked',
+ 'vi-tdesign:data-display',
+ 'vi-tdesign:data-error',
+ 'vi-tdesign:data-search',
+ 'vi-tdesign:delete',
+ 'vi-tdesign:delete-1',
+ 'vi-tdesign:delete-time',
+ 'vi-tdesign:delta',
+ 'vi-tdesign:depressed',
+ 'vi-tdesign:desktop',
+ 'vi-tdesign:desktop-1',
+ 'vi-tdesign:despise',
+ 'vi-tdesign:device',
+ 'vi-tdesign:discount',
+ 'vi-tdesign:discount-filled',
+ 'vi-tdesign:dissatisfaction',
+ 'vi-tdesign:divide',
+ 'vi-tdesign:dividers',
+ 'vi-tdesign:dividers-1',
+ 'vi-tdesign:doge',
+ 'vi-tdesign:double-storey',
+ 'vi-tdesign:download',
+ 'vi-tdesign:download-1',
+ 'vi-tdesign:downscale',
+ 'vi-tdesign:drag-drop',
+ 'vi-tdesign:drag-move',
+ 'vi-tdesign:drink',
+ 'vi-tdesign:drumstick',
+ 'vi-tdesign:dv',
+ 'vi-tdesign:dvd',
+ 'vi-tdesign:earphone',
+ 'vi-tdesign:earth',
+ 'vi-tdesign:edit',
+ 'vi-tdesign:edit-1',
+ 'vi-tdesign:edit-2',
+ 'vi-tdesign:edit-off',
+ 'vi-tdesign:education',
+ 'vi-tdesign:eggplant',
+ 'vi-tdesign:ellipsis',
+ 'vi-tdesign:emo-emotional',
+ 'vi-tdesign:enter',
+ 'vi-tdesign:equal',
+ 'vi-tdesign:error',
+ 'vi-tdesign:error-circle',
+ 'vi-tdesign:error-circle-filled',
+ 'vi-tdesign:error-triangle',
+ 'vi-tdesign:excited',
+ 'vi-tdesign:excited-1',
+ 'vi-tdesign:expand-horizontal',
+ 'vi-tdesign:expand-vertical',
+ 'vi-tdesign:explore',
+ 'vi-tdesign:explore-off',
+ 'vi-tdesign:exposure',
+ 'vi-tdesign:extension',
+ 'vi-tdesign:extension-off',
+ 'vi-tdesign:face-retouching',
+ 'vi-tdesign:fact-check',
+ 'vi-tdesign:fahrenheit-scale',
+ 'vi-tdesign:feel-at-ease',
+ 'vi-tdesign:ferocious',
+ 'vi-tdesign:ferris-wheel',
+ 'vi-tdesign:file',
+ 'vi-tdesign:file-1',
+ 'vi-tdesign:file-add',
+ 'vi-tdesign:file-add-1',
+ 'vi-tdesign:file-attachment',
+ 'vi-tdesign:file-blocked',
+ 'vi-tdesign:file-code',
+ 'vi-tdesign:file-code-1',
+ 'vi-tdesign:file-copy',
+ 'vi-tdesign:file-download',
+ 'vi-tdesign:file-excel',
+ 'vi-tdesign:file-export',
+ 'vi-tdesign:file-icon',
+ 'vi-tdesign:file-image',
+ 'vi-tdesign:file-import',
+ 'vi-tdesign:file-locked',
+ 'vi-tdesign:file-minus',
+ 'vi-tdesign:file-music',
+ 'vi-tdesign:file-onenote',
+ 'vi-tdesign:file-outlook',
+ 'vi-tdesign:file-paste',
+ 'vi-tdesign:file-pdf',
+ 'vi-tdesign:file-powerpoint',
+ 'vi-tdesign:file-restore',
+ 'vi-tdesign:file-safety',
+ 'vi-tdesign:file-search',
+ 'vi-tdesign:file-setting',
+ 'vi-tdesign:file-teams',
+ 'vi-tdesign:file-unknown',
+ 'vi-tdesign:file-unlocked',
+ 'vi-tdesign:file-word',
+ 'vi-tdesign:file-zip',
+ 'vi-tdesign:fill-color',
+ 'vi-tdesign:fill-color-1',
+ 'vi-tdesign:film',
+ 'vi-tdesign:film-1',
+ 'vi-tdesign:filter',
+ 'vi-tdesign:filter-1',
+ 'vi-tdesign:filter-2',
+ 'vi-tdesign:filter-3',
+ 'vi-tdesign:filter-clear',
+ 'vi-tdesign:filter-off',
+ 'vi-tdesign:fingerprint',
+ 'vi-tdesign:fingerprint-1',
+ 'vi-tdesign:fingerprint-2',
+ 'vi-tdesign:fingerprint-3',
+ 'vi-tdesign:fish',
+ 'vi-tdesign:flag',
+ 'vi-tdesign:flag-1',
+ 'vi-tdesign:flag-2',
+ 'vi-tdesign:flag-3',
+ 'vi-tdesign:flag-4',
+ 'vi-tdesign:flashlight',
+ 'vi-tdesign:flight-landing',
+ 'vi-tdesign:flight-takeoff',
+ 'vi-tdesign:flip-smiling-face',
+ 'vi-tdesign:flip-to-back',
+ 'vi-tdesign:flip-to-front',
+ 'vi-tdesign:focus',
+ 'vi-tdesign:fog',
+ 'vi-tdesign:fog-night',
+ 'vi-tdesign:fog-sunny',
+ 'vi-tdesign:folder',
+ 'vi-tdesign:folder-1',
+ 'vi-tdesign:folder-add',
+ 'vi-tdesign:folder-add-1',
+ 'vi-tdesign:folder-blocked',
+ 'vi-tdesign:folder-details',
+ 'vi-tdesign:folder-export',
+ 'vi-tdesign:folder-import',
+ 'vi-tdesign:folder-locked',
+ 'vi-tdesign:folder-minus',
+ 'vi-tdesign:folder-move',
+ 'vi-tdesign:folder-off',
+ 'vi-tdesign:folder-open',
+ 'vi-tdesign:folder-open-1',
+ 'vi-tdesign:folder-search',
+ 'vi-tdesign:folder-setting',
+ 'vi-tdesign:folder-shared',
+ 'vi-tdesign:folder-unlocked',
+ 'vi-tdesign:folder-zip',
+ 'vi-tdesign:forest',
+ 'vi-tdesign:fork',
+ 'vi-tdesign:form',
+ 'vi-tdesign:format-horizontal-align-bottom',
+ 'vi-tdesign:format-horizontal-align-center',
+ 'vi-tdesign:format-horizontal-align-top',
+ 'vi-tdesign:format-vertical-align-center',
+ 'vi-tdesign:format-vertical-align-left',
+ 'vi-tdesign:format-vertical-align-right',
+ 'vi-tdesign:forward',
+ 'vi-tdesign:frame',
+ 'vi-tdesign:frame-1',
+ 'vi-tdesign:fries',
+ 'vi-tdesign:fullscreen',
+ 'vi-tdesign:fullscreen-1',
+ 'vi-tdesign:fullscreen-2',
+ 'vi-tdesign:fullscreen-exit',
+ 'vi-tdesign:fullscreen-exit-1',
+ 'vi-tdesign:function-curve',
+ 'vi-tdesign:functions',
+ 'vi-tdesign:functions-1',
+ 'vi-tdesign:gamepad',
+ 'vi-tdesign:gamepad-1',
+ 'vi-tdesign:gamma',
+ 'vi-tdesign:garlic',
+ 'vi-tdesign:gender-female',
+ 'vi-tdesign:gender-male',
+ 'vi-tdesign:gesture-applause',
+ 'vi-tdesign:gesture-click',
+ 'vi-tdesign:gesture-down',
+ 'vi-tdesign:gesture-expansion',
+ 'vi-tdesign:gesture-left',
+ 'vi-tdesign:gesture-left-slip',
+ 'vi-tdesign:gesture-pray',
+ 'vi-tdesign:gesture-pray-1',
+ 'vi-tdesign:gesture-press',
+ 'vi-tdesign:gesture-ranslation',
+ 'vi-tdesign:gesture-ranslation-1',
+ 'vi-tdesign:gesture-right',
+ 'vi-tdesign:gesture-right-slip',
+ 'vi-tdesign:gesture-slide-up',
+ 'vi-tdesign:gesture-up',
+ 'vi-tdesign:gesture-up-1',
+ 'vi-tdesign:gesture-up-2',
+ 'vi-tdesign:gesture-up-and-down',
+ 'vi-tdesign:gesture-wipe-down',
+ 'vi-tdesign:gift',
+ 'vi-tdesign:giggle',
+ 'vi-tdesign:git-branch',
+ 'vi-tdesign:git-commit',
+ 'vi-tdesign:git-merge',
+ 'vi-tdesign:git-pull-request',
+ 'vi-tdesign:git-repository',
+ 'vi-tdesign:git-repository-commits',
+ 'vi-tdesign:git-repository-private',
+ 'vi-tdesign:gps',
+ 'vi-tdesign:grape',
+ 'vi-tdesign:greater-than',
+ 'vi-tdesign:greater-than-or-equal',
+ 'vi-tdesign:green-onion',
+ 'vi-tdesign:grid-add',
+ 'vi-tdesign:grid-view',
+ 'vi-tdesign:guitar',
+ 'vi-tdesign:hamburger',
+ 'vi-tdesign:happy',
+ 'vi-tdesign:hard-disk-storage',
+ 'vi-tdesign:hard-drive',
+ 'vi-tdesign:hashtag',
+ 'vi-tdesign:hd',
+ 'vi-tdesign:heart',
+ 'vi-tdesign:heart-filled',
+ 'vi-tdesign:help',
+ 'vi-tdesign:help-circle',
+ 'vi-tdesign:help-circle-filled',
+ 'vi-tdesign:help-rectangle',
+ 'vi-tdesign:highlight',
+ 'vi-tdesign:highlight-1',
+ 'vi-tdesign:history',
+ 'vi-tdesign:history-setting',
+ 'vi-tdesign:home',
+ 'vi-tdesign:hospital',
+ 'vi-tdesign:hospital-1',
+ 'vi-tdesign:hotspot-wave',
+ 'vi-tdesign:hourglass',
+ 'vi-tdesign:houses',
+ 'vi-tdesign:houses-1',
+ 'vi-tdesign:houses-2',
+ 'vi-tdesign:html5',
+ 'vi-tdesign:https',
+ 'vi-tdesign:ice-cream',
+ 'vi-tdesign:icon',
+ 'vi-tdesign:image',
+ 'vi-tdesign:image-1',
+ 'vi-tdesign:image-add',
+ 'vi-tdesign:image-edit',
+ 'vi-tdesign:image-error',
+ 'vi-tdesign:image-off',
+ 'vi-tdesign:image-search',
+ 'vi-tdesign:indent-left',
+ 'vi-tdesign:indent-right',
+ 'vi-tdesign:indicator',
+ 'vi-tdesign:info-circle',
+ 'vi-tdesign:info-circle-filled',
+ 'vi-tdesign:ink',
+ 'vi-tdesign:install',
+ 'vi-tdesign:install-desktop',
+ 'vi-tdesign:install-mobile',
+ 'vi-tdesign:institution',
+ 'vi-tdesign:institution-checked',
+ 'vi-tdesign:internet',
+ 'vi-tdesign:ipod',
+ 'vi-tdesign:joyful',
+ 'vi-tdesign:jump',
+ 'vi-tdesign:jump-off',
+ 'vi-tdesign:keyboard',
+ 'vi-tdesign:laptop',
+ 'vi-tdesign:layers',
+ 'vi-tdesign:layout',
+ 'vi-tdesign:leaderboard',
+ 'vi-tdesign:lemon',
+ 'vi-tdesign:lemon-slice',
+ 'vi-tdesign:less-than',
+ 'vi-tdesign:less-than-or-equal',
+ 'vi-tdesign:letters-a',
+ 'vi-tdesign:letters-b',
+ 'vi-tdesign:letters-c',
+ 'vi-tdesign:letters-d',
+ 'vi-tdesign:letters-e',
+ 'vi-tdesign:letters-f',
+ 'vi-tdesign:letters-g',
+ 'vi-tdesign:letters-h',
+ 'vi-tdesign:letters-i',
+ 'vi-tdesign:letters-j',
+ 'vi-tdesign:letters-k',
+ 'vi-tdesign:letters-l',
+ 'vi-tdesign:letters-m',
+ 'vi-tdesign:letters-n',
+ 'vi-tdesign:letters-o',
+ 'vi-tdesign:letters-p',
+ 'vi-tdesign:letters-q',
+ 'vi-tdesign:letters-r',
+ 'vi-tdesign:letters-s',
+ 'vi-tdesign:letters-t',
+ 'vi-tdesign:letters-u',
+ 'vi-tdesign:letters-v',
+ 'vi-tdesign:letters-w',
+ 'vi-tdesign:letters-x',
+ 'vi-tdesign:letters-y',
+ 'vi-tdesign:letters-z',
+ 'vi-tdesign:lightbulb',
+ 'vi-tdesign:lightbulb-circle',
+ 'vi-tdesign:lighthouse',
+ 'vi-tdesign:lighthouse-1',
+ 'vi-tdesign:lighthouse-2',
+ 'vi-tdesign:lighting-circle',
+ 'vi-tdesign:line-height',
+ 'vi-tdesign:link',
+ 'vi-tdesign:link-1',
+ 'vi-tdesign:link-unlink',
+ 'vi-tdesign:liquor',
+ 'vi-tdesign:list',
+ 'vi-tdesign:load',
+ 'vi-tdesign:loading',
+ 'vi-tdesign:location',
+ 'vi-tdesign:location-1',
+ 'vi-tdesign:location-enlargement',
+ 'vi-tdesign:location-error',
+ 'vi-tdesign:location-parking-place',
+ 'vi-tdesign:location-reduction',
+ 'vi-tdesign:location-setting',
+ 'vi-tdesign:lock-off',
+ 'vi-tdesign:lock-on',
+ 'vi-tdesign:lock-time',
+ 'vi-tdesign:login',
+ 'vi-tdesign:logo-adobe-illustrate',
+ 'vi-tdesign:logo-adobe-photoshop',
+ 'vi-tdesign:logo-adobe-photoshop-1',
+ 'vi-tdesign:logo-android',
+ 'vi-tdesign:logo-apple',
+ 'vi-tdesign:logo-apple-filled',
+ 'vi-tdesign:logo-behance',
+ 'vi-tdesign:logo-chrome',
+ 'vi-tdesign:logo-chrome-filled',
+ 'vi-tdesign:logo-cinema4d',
+ 'vi-tdesign:logo-codepen',
+ 'vi-tdesign:logo-codesandbox',
+ 'vi-tdesign:logo-dribbble',
+ 'vi-tdesign:logo-facebook',
+ 'vi-tdesign:logo-figma',
+ 'vi-tdesign:logo-framer',
+ 'vi-tdesign:logo-github',
+ 'vi-tdesign:logo-github-filled',
+ 'vi-tdesign:logo-gitlab',
+ 'vi-tdesign:logo-ie',
+ 'vi-tdesign:logo-ie-filled',
+ 'vi-tdesign:logo-instagram',
+ 'vi-tdesign:logo-qq',
+ 'vi-tdesign:logo-twitter',
+ 'vi-tdesign:logo-wechat',
+ 'vi-tdesign:logo-wechat-stroke',
+ 'vi-tdesign:logo-wecom',
+ 'vi-tdesign:logo-windows',
+ 'vi-tdesign:logo-windows-filled',
+ 'vi-tdesign:logo-youtube',
+ 'vi-tdesign:logout',
+ 'vi-tdesign:look-around',
+ 'vi-tdesign:loudspeaker',
+ 'vi-tdesign:mail',
+ 'vi-tdesign:map',
+ 'vi-tdesign:map-3d',
+ 'vi-tdesign:map-add',
+ 'vi-tdesign:map-aiming',
+ 'vi-tdesign:map-blocked',
+ 'vi-tdesign:map-bubble',
+ 'vi-tdesign:map-cancel',
+ 'vi-tdesign:map-chat',
+ 'vi-tdesign:map-checked',
+ 'vi-tdesign:map-collection',
+ 'vi-tdesign:map-connection',
+ 'vi-tdesign:map-distance',
+ 'vi-tdesign:map-double',
+ 'vi-tdesign:map-edit',
+ 'vi-tdesign:map-grid',
+ 'vi-tdesign:map-information',
+ 'vi-tdesign:map-information-1',
+ 'vi-tdesign:map-information-2',
+ 'vi-tdesign:map-location',
+ 'vi-tdesign:map-locked',
+ 'vi-tdesign:map-marked',
+ 'vi-tdesign:map-navigation',
+ 'vi-tdesign:map-outline',
+ 'vi-tdesign:map-route-planning',
+ 'vi-tdesign:map-ruler',
+ 'vi-tdesign:map-safety',
+ 'vi-tdesign:map-search',
+ 'vi-tdesign:map-search-1',
+ 'vi-tdesign:map-setting',
+ 'vi-tdesign:map-unlocked',
+ 'vi-tdesign:mark-as-unread',
+ 'vi-tdesign:markup',
+ 'vi-tdesign:mathematics',
+ 'vi-tdesign:measurement',
+ 'vi-tdesign:measurement-1',
+ 'vi-tdesign:measurement-2',
+ 'vi-tdesign:meat-pepper',
+ 'vi-tdesign:media-library',
+ 'vi-tdesign:member',
+ 'vi-tdesign:menu',
+ 'vi-tdesign:menu-application',
+ 'vi-tdesign:menu-fold',
+ 'vi-tdesign:menu-unfold',
+ 'vi-tdesign:merge-cells',
+ 'vi-tdesign:microphone',
+ 'vi-tdesign:microphone-1',
+ 'vi-tdesign:microphone-2',
+ 'vi-tdesign:milk',
+ 'vi-tdesign:minus',
+ 'vi-tdesign:minus-circle',
+ 'vi-tdesign:minus-circle-filled',
+ 'vi-tdesign:minus-rectangle',
+ 'vi-tdesign:minus-rectangle-filled',
+ 'vi-tdesign:mirror',
+ 'vi-tdesign:mobile',
+ 'vi-tdesign:mobile-blocked',
+ 'vi-tdesign:mobile-list',
+ 'vi-tdesign:mobile-navigation',
+ 'vi-tdesign:mobile-shortcut',
+ 'vi-tdesign:mobile-vibrate',
+ 'vi-tdesign:mode-dark',
+ 'vi-tdesign:mode-light',
+ 'vi-tdesign:module',
+ 'vi-tdesign:money',
+ 'vi-tdesign:monument',
+ 'vi-tdesign:moon',
+ 'vi-tdesign:moon-fall',
+ 'vi-tdesign:moon-rising',
+ 'vi-tdesign:more',
+ 'vi-tdesign:mosque',
+ 'vi-tdesign:mosque-1',
+ 'vi-tdesign:mouse',
+ 'vi-tdesign:move',
+ 'vi-tdesign:move-1',
+ 'vi-tdesign:movie-clapper',
+ 'vi-tdesign:multiply',
+ 'vi-tdesign:museum',
+ 'vi-tdesign:museum-1',
+ 'vi-tdesign:museum-2',
+ 'vi-tdesign:mushroom',
+ 'vi-tdesign:mushroom-1',
+ 'vi-tdesign:music',
+ 'vi-tdesign:music-1',
+ 'vi-tdesign:music-2',
+ 'vi-tdesign:music-rectangle-add',
+ 'vi-tdesign:navigation-arrow',
+ 'vi-tdesign:next',
+ 'vi-tdesign:no-expression',
+ 'vi-tdesign:noodle',
+ 'vi-tdesign:notification',
+ 'vi-tdesign:notification-add',
+ 'vi-tdesign:notification-circle',
+ 'vi-tdesign:notification-error',
+ 'vi-tdesign:notification-filled',
+ 'vi-tdesign:numbers-0',
+ 'vi-tdesign:numbers-0-1',
+ 'vi-tdesign:numbers-1',
+ 'vi-tdesign:numbers-1-1',
+ 'vi-tdesign:numbers-2',
+ 'vi-tdesign:numbers-2-1',
+ 'vi-tdesign:numbers-3',
+ 'vi-tdesign:numbers-3-1',
+ 'vi-tdesign:numbers-4',
+ 'vi-tdesign:numbers-4-1',
+ 'vi-tdesign:numbers-5',
+ 'vi-tdesign:numbers-5-1',
+ 'vi-tdesign:numbers-6',
+ 'vi-tdesign:numbers-6-1',
+ 'vi-tdesign:numbers-7',
+ 'vi-tdesign:numbers-7-1',
+ 'vi-tdesign:numbers-8',
+ 'vi-tdesign:numbers-8-1',
+ 'vi-tdesign:numbers-9',
+ 'vi-tdesign:numbers-9-1',
+ 'vi-tdesign:nut',
+ 'vi-tdesign:object-storage',
+ 'vi-tdesign:open-mouth',
+ 'vi-tdesign:opera',
+ 'vi-tdesign:order-adjustment-column',
+ 'vi-tdesign:order-ascending',
+ 'vi-tdesign:order-descending',
+ 'vi-tdesign:outbox',
+ 'vi-tdesign:page-first',
+ 'vi-tdesign:page-head',
+ 'vi-tdesign:page-last',
+ 'vi-tdesign:palace',
+ 'vi-tdesign:palace-1',
+ 'vi-tdesign:palace-2',
+ 'vi-tdesign:palace-3',
+ 'vi-tdesign:palace-4',
+ 'vi-tdesign:palette',
+ 'vi-tdesign:palette-1',
+ 'vi-tdesign:panorama-horizontal',
+ 'vi-tdesign:panorama-vertical',
+ 'vi-tdesign:pantone',
+ 'vi-tdesign:parabola',
+ 'vi-tdesign:parentheses',
+ 'vi-tdesign:paste',
+ 'vi-tdesign:patio',
+ 'vi-tdesign:pause',
+ 'vi-tdesign:pause-circle',
+ 'vi-tdesign:pause-circle-filled',
+ 'vi-tdesign:pause-circle-stroke',
+ 'vi-tdesign:pea',
+ 'vi-tdesign:peach',
+ 'vi-tdesign:pear',
+ 'vi-tdesign:pearl-of-the-orient',
+ 'vi-tdesign:pen',
+ 'vi-tdesign:pen-ball',
+ 'vi-tdesign:pen-brush',
+ 'vi-tdesign:pen-mark',
+ 'vi-tdesign:pen-quill',
+ 'vi-tdesign:pending',
+ 'vi-tdesign:percent',
+ 'vi-tdesign:personal-information',
+ 'vi-tdesign:phone-locked',
+ 'vi-tdesign:phone-search',
+ 'vi-tdesign:pi',
+ 'vi-tdesign:piano',
+ 'vi-tdesign:pin',
+ 'vi-tdesign:pin-filled',
+ 'vi-tdesign:play',
+ 'vi-tdesign:play-circle',
+ 'vi-tdesign:play-circle-filled',
+ 'vi-tdesign:play-circle-stroke',
+ 'vi-tdesign:play-circle-stroke-add',
+ 'vi-tdesign:play-demo',
+ 'vi-tdesign:play-rectangle',
+ 'vi-tdesign:plus',
+ 'vi-tdesign:popsicle',
+ 'vi-tdesign:portrait',
+ 'vi-tdesign:pout',
+ 'vi-tdesign:poweroff',
+ 'vi-tdesign:precise-monitor',
+ 'vi-tdesign:previous',
+ 'vi-tdesign:print',
+ 'vi-tdesign:pumpkin',
+ 'vi-tdesign:pyramid',
+ 'vi-tdesign:pyramid-maya',
+ 'vi-tdesign:qrcode',
+ 'vi-tdesign:quadratic',
+ 'vi-tdesign:questionnaire',
+ 'vi-tdesign:queue',
+ 'vi-tdesign:radar',
+ 'vi-tdesign:radio-1',
+ 'vi-tdesign:radio-2',
+ 'vi-tdesign:radish',
+ 'vi-tdesign:rain-heavy',
+ 'vi-tdesign:rain-light',
+ 'vi-tdesign:rain-medium',
+ 'vi-tdesign:rainbow',
+ 'vi-tdesign:rectangle',
+ 'vi-tdesign:refresh',
+ 'vi-tdesign:relation',
+ 'vi-tdesign:relativity',
+ 'vi-tdesign:remote-wave',
+ 'vi-tdesign:remove',
+ 'vi-tdesign:replay',
+ 'vi-tdesign:rice',
+ 'vi-tdesign:rice-ball',
+ 'vi-tdesign:roast',
+ 'vi-tdesign:rocket',
+ 'vi-tdesign:rollback',
+ 'vi-tdesign:rollfront',
+ 'vi-tdesign:root-list',
+ 'vi-tdesign:rotate',
+ 'vi-tdesign:rotate-locked',
+ 'vi-tdesign:rotation',
+ 'vi-tdesign:round',
+ 'vi-tdesign:router-wave',
+ 'vi-tdesign:rss',
+ 'vi-tdesign:ruler',
+ 'vi-tdesign:sailing-hotel',
+ 'vi-tdesign:sandwich',
+ 'vi-tdesign:saturation',
+ 'vi-tdesign:sausage',
+ 'vi-tdesign:save',
+ 'vi-tdesign:saving-pot',
+ 'vi-tdesign:scan',
+ 'vi-tdesign:screen-4k',
+ 'vi-tdesign:screencast',
+ 'vi-tdesign:screenshot',
+ 'vi-tdesign:scroll-bar',
+ 'vi-tdesign:sd-card',
+ 'vi-tdesign:sd-card-1',
+ 'vi-tdesign:search',
+ 'vi-tdesign:search-error',
+ 'vi-tdesign:secured',
+ 'vi-tdesign:send',
+ 'vi-tdesign:send-cancel',
+ 'vi-tdesign:sensors',
+ 'vi-tdesign:sensors-1',
+ 'vi-tdesign:sensors-2',
+ 'vi-tdesign:sensors-off',
+ 'vi-tdesign:serenity',
+ 'vi-tdesign:server',
+ 'vi-tdesign:service',
+ 'vi-tdesign:setting',
+ 'vi-tdesign:setting-1',
+ 'vi-tdesign:share',
+ 'vi-tdesign:share-1',
+ 'vi-tdesign:sharpness',
+ 'vi-tdesign:shield-error',
+ 'vi-tdesign:shimen',
+ 'vi-tdesign:shop',
+ 'vi-tdesign:shop-1',
+ 'vi-tdesign:shop-2',
+ 'vi-tdesign:shop-3',
+ 'vi-tdesign:shop-4',
+ 'vi-tdesign:shop-5',
+ 'vi-tdesign:shrimp',
+ 'vi-tdesign:shrink-horizontal',
+ 'vi-tdesign:shrink-vertical',
+ 'vi-tdesign:shutter',
+ 'vi-tdesign:shutup',
+ 'vi-tdesign:sim-card',
+ 'vi-tdesign:sim-card-1',
+ 'vi-tdesign:sim-card-2',
+ 'vi-tdesign:sinister-smile',
+ 'vi-tdesign:sip',
+ 'vi-tdesign:slash',
+ 'vi-tdesign:sleep',
+ 'vi-tdesign:slice',
+ 'vi-tdesign:slideshow',
+ 'vi-tdesign:smile',
+ 'vi-tdesign:sneer',
+ 'vi-tdesign:snowflake',
+ 'vi-tdesign:sonic',
+ 'vi-tdesign:sound',
+ 'vi-tdesign:sound-down',
+ 'vi-tdesign:sound-high',
+ 'vi-tdesign:sound-low',
+ 'vi-tdesign:sound-mute',
+ 'vi-tdesign:sound-mute-1',
+ 'vi-tdesign:sound-up',
+ 'vi-tdesign:space',
+ 'vi-tdesign:speechless-1',
+ 'vi-tdesign:star',
+ 'vi-tdesign:star-filled',
+ 'vi-tdesign:statue-of-jesus',
+ 'vi-tdesign:sticky-note',
+ 'vi-tdesign:stop',
+ 'vi-tdesign:stop-circle',
+ 'vi-tdesign:stop-circle-filled',
+ 'vi-tdesign:stop-circle-stroke',
+ 'vi-tdesign:store',
+ 'vi-tdesign:street-road',
+ 'vi-tdesign:street-road-1',
+ 'vi-tdesign:subtitle',
+ 'vi-tdesign:subway-line',
+ 'vi-tdesign:sum',
+ 'vi-tdesign:sun-fall',
+ 'vi-tdesign:sun-rising',
+ 'vi-tdesign:sunny',
+ 'vi-tdesign:support',
+ 'vi-tdesign:surprised',
+ 'vi-tdesign:surprised-1',
+ 'vi-tdesign:swap',
+ 'vi-tdesign:swap-left',
+ 'vi-tdesign:swap-right',
+ 'vi-tdesign:swear-1',
+ 'vi-tdesign:swear-2',
+ 'vi-tdesign:system-2',
+ 'vi-tdesign:system-3',
+ 'vi-tdesign:system-application',
+ 'vi-tdesign:system-blocked',
+ 'vi-tdesign:system-code',
+ 'vi-tdesign:system-components',
+ 'vi-tdesign:system-coordinate',
+ 'vi-tdesign:system-device',
+ 'vi-tdesign:system-interface',
+ 'vi-tdesign:system-location',
+ 'vi-tdesign:system-locked',
+ 'vi-tdesign:system-log',
+ 'vi-tdesign:system-marked',
+ 'vi-tdesign:system-messages',
+ 'vi-tdesign:system-regulation',
+ 'vi-tdesign:system-search',
+ 'vi-tdesign:system-setting',
+ 'vi-tdesign:system-storage',
+ 'vi-tdesign:system-sum',
+ 'vi-tdesign:system-unlocked',
+ 'vi-tdesign:tab',
+ 'vi-tdesign:table',
+ 'vi-tdesign:table-1',
+ 'vi-tdesign:table-2',
+ 'vi-tdesign:table-add',
+ 'vi-tdesign:table-split',
+ 'vi-tdesign:tag',
+ 'vi-tdesign:tangerinr',
+ 'vi-tdesign:tape',
+ 'vi-tdesign:task',
+ 'vi-tdesign:task-1',
+ 'vi-tdesign:task-add',
+ 'vi-tdesign:task-add-1',
+ 'vi-tdesign:task-checked',
+ 'vi-tdesign:task-error',
+ 'vi-tdesign:task-location',
+ 'vi-tdesign:task-marked',
+ 'vi-tdesign:task-setting',
+ 'vi-tdesign:task-visible',
+ 'vi-tdesign:tea',
+ 'vi-tdesign:teahouse',
+ 'vi-tdesign:template',
+ 'vi-tdesign:temple',
+ 'vi-tdesign:terminal',
+ 'vi-tdesign:terminal-rectangle',
+ 'vi-tdesign:terminal-rectangle-1',
+ 'vi-tdesign:terminal-window',
+ 'vi-tdesign:textbox',
+ 'vi-tdesign:textformat-bold',
+ 'vi-tdesign:textformat-color',
+ 'vi-tdesign:textformat-italic',
+ 'vi-tdesign:textformat-strikethrough',
+ 'vi-tdesign:textformat-underline',
+ 'vi-tdesign:textformat-wrap',
+ 'vi-tdesign:theaters',
+ 'vi-tdesign:thumb-down',
+ 'vi-tdesign:thumb-down-1',
+ 'vi-tdesign:thumb-down-2',
+ 'vi-tdesign:thumb-up',
+ 'vi-tdesign:thumb-up-1',
+ 'vi-tdesign:thumb-up-2',
+ 'vi-tdesign:thunder',
+ 'vi-tdesign:thunderstorm',
+ 'vi-tdesign:thunderstorm-night',
+ 'vi-tdesign:thunderstorm-sunny',
+ 'vi-tdesign:ticket',
+ 'vi-tdesign:time',
+ 'vi-tdesign:time-filled',
+ 'vi-tdesign:tips',
+ 'vi-tdesign:tips-double',
+ 'vi-tdesign:tomato',
+ 'vi-tdesign:tools',
+ 'vi-tdesign:tools-circle',
+ 'vi-tdesign:tornado',
+ 'vi-tdesign:tower',
+ 'vi-tdesign:tower-1',
+ 'vi-tdesign:tower-2',
+ 'vi-tdesign:tower-3',
+ 'vi-tdesign:tower-clock',
+ 'vi-tdesign:town',
+ 'vi-tdesign:traffic',
+ 'vi-tdesign:traffic-events',
+ 'vi-tdesign:transform',
+ 'vi-tdesign:transform-1',
+ 'vi-tdesign:transform-2',
+ 'vi-tdesign:transform-3',
+ 'vi-tdesign:translate',
+ 'vi-tdesign:translate-1',
+ 'vi-tdesign:tree-list',
+ 'vi-tdesign:tree-round-dot',
+ 'vi-tdesign:tree-round-dot-vertical',
+ 'vi-tdesign:tree-square-dot',
+ 'vi-tdesign:tree-square-dot-vertical',
+ 'vi-tdesign:trending-down',
+ 'vi-tdesign:trending-up',
+ 'vi-tdesign:tv',
+ 'vi-tdesign:tv-1',
+ 'vi-tdesign:tv-2',
+ 'vi-tdesign:typography',
+ 'vi-tdesign:uncomfortable',
+ 'vi-tdesign:uncomfortable-1',
+ 'vi-tdesign:uncomfortable-2',
+ 'vi-tdesign:undertake',
+ 'vi-tdesign:undertake-delivery',
+ 'vi-tdesign:undertake-environment-protection',
+ 'vi-tdesign:undertake-hold-up',
+ 'vi-tdesign:undertake-transaction',
+ 'vi-tdesign:unfold-less',
+ 'vi-tdesign:unfold-more',
+ 'vi-tdesign:unhappy',
+ 'vi-tdesign:unhappy-1',
+ 'vi-tdesign:uninstall',
+ 'vi-tdesign:upload',
+ 'vi-tdesign:upload-1',
+ 'vi-tdesign:upscale',
+ 'vi-tdesign:usb',
+ 'vi-tdesign:user',
+ 'vi-tdesign:user-1',
+ 'vi-tdesign:user-add',
+ 'vi-tdesign:user-arrow-down',
+ 'vi-tdesign:user-arrow-left',
+ 'vi-tdesign:user-arrow-right',
+ 'vi-tdesign:user-arrow-up',
+ 'vi-tdesign:user-avatar',
+ 'vi-tdesign:user-blocked',
+ 'vi-tdesign:user-business',
+ 'vi-tdesign:user-checked',
+ 'vi-tdesign:user-checked-1',
+ 'vi-tdesign:user-circle',
+ 'vi-tdesign:user-clear',
+ 'vi-tdesign:user-error-1',
+ 'vi-tdesign:user-invisible',
+ 'vi-tdesign:user-list',
+ 'vi-tdesign:user-locked',
+ 'vi-tdesign:user-marked',
+ 'vi-tdesign:user-password',
+ 'vi-tdesign:user-safety',
+ 'vi-tdesign:user-search',
+ 'vi-tdesign:user-setting',
+ 'vi-tdesign:user-talk',
+ 'vi-tdesign:user-talk-1',
+ 'vi-tdesign:user-talk-off-1',
+ 'vi-tdesign:user-time',
+ 'vi-tdesign:user-transmit',
+ 'vi-tdesign:user-unknown',
+ 'vi-tdesign:user-unlocked',
+ 'vi-tdesign:user-vip',
+ 'vi-tdesign:user-visible',
+ 'vi-tdesign:usergroup',
+ 'vi-tdesign:usergroup-add',
+ 'vi-tdesign:usergroup-clear',
+ 'vi-tdesign:vehicle',
+ 'vi-tdesign:verified',
+ 'vi-tdesign:verify',
+ 'vi-tdesign:video',
+ 'vi-tdesign:video-camera',
+ 'vi-tdesign:video-camera-1',
+ 'vi-tdesign:video-camera-2',
+ 'vi-tdesign:video-camera-dollar',
+ 'vi-tdesign:video-camera-minus',
+ 'vi-tdesign:video-camera-music',
+ 'vi-tdesign:video-camera-off',
+ 'vi-tdesign:video-library',
+ 'vi-tdesign:view-agenda',
+ 'vi-tdesign:view-column',
+ 'vi-tdesign:view-in-ar',
+ 'vi-tdesign:view-list',
+ 'vi-tdesign:view-module',
+ 'vi-tdesign:visual-recognition',
+ 'vi-tdesign:wallet',
+ 'vi-tdesign:watch',
+ 'vi-tdesign:watermelon',
+ 'vi-tdesign:wave-left',
+ 'vi-tdesign:wave-right',
+ 'vi-tdesign:wealth',
+ 'vi-tdesign:wealth-1',
+ 'vi-tdesign:widget',
+ 'vi-tdesign:wifi',
+ 'vi-tdesign:wifi-1',
+ 'vi-tdesign:wifi-off',
+ 'vi-tdesign:wifi-off-1',
+ 'vi-tdesign:window',
+ 'vi-tdesign:window-1',
+ 'vi-tdesign:windy',
+ 'vi-tdesign:windy-rain',
+ 'vi-tdesign:wink',
+ 'vi-tdesign:work',
+ 'vi-tdesign:work-history',
+ 'vi-tdesign:work-off',
+ 'vi-tdesign:wry-smile',
+ 'vi-tdesign:zoom-in',
+ 'vi-tdesign:zoom-out'
+ ]
+}
diff --git a/src/components/ImageCropping/index.ts b/src/components/ImageCropping/index.ts
new file mode 100644
index 0000000..d6c0f25
--- /dev/null
+++ b/src/components/ImageCropping/index.ts
@@ -0,0 +1,3 @@
+import ImageCropping from './src/ImageCropping.vue'
+
+export { ImageCropping }
diff --git a/src/components/ImageCropping/src/ImageCropping.vue b/src/components/ImageCropping/src/ImageCropping.vue
new file mode 100644
index 0000000..2f8c685
--- /dev/null
+++ b/src/components/ImageCropping/src/ImageCropping.vue
@@ -0,0 +1,259 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/ImageViewer/index.ts b/src/components/ImageViewer/index.ts
new file mode 100644
index 0000000..35764d6
--- /dev/null
+++ b/src/components/ImageViewer/index.ts
@@ -0,0 +1,33 @@
+import ImageViewer from './src/ImageViewer.vue'
+import { isClient } from '@/utils/is'
+import { createVNode, render, VNode } from 'vue'
+import { ImageViewerProps } from './src/types'
+
+let instance: Nullable = null
+
+export function createImageViewer(options: ImageViewerProps) {
+ if (!isClient) return
+ const {
+ urlList,
+ initialIndex = 0,
+ infinite = true,
+ hideOnClickModal = false,
+ teleported = false,
+ zIndex = 2000,
+ show = true
+ } = options
+
+ const propsData: Partial = {}
+ const container = document.createElement('div')
+ propsData.urlList = urlList
+ propsData.initialIndex = initialIndex
+ propsData.infinite = infinite
+ propsData.hideOnClickModal = hideOnClickModal
+ propsData.teleported = teleported
+ propsData.zIndex = zIndex
+ propsData.show = show
+
+ document.body.appendChild(container)
+ instance = createVNode(ImageViewer, propsData)
+ render(instance, container)
+}
diff --git a/src/components/ImageViewer/src/ImageViewer.vue b/src/components/ImageViewer/src/ImageViewer.vue
new file mode 100644
index 0000000..b9afe17
--- /dev/null
+++ b/src/components/ImageViewer/src/ImageViewer.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
diff --git a/src/components/ImageViewer/src/types/index.ts b/src/components/ImageViewer/src/types/index.ts
new file mode 100644
index 0000000..2fff4c0
--- /dev/null
+++ b/src/components/ImageViewer/src/types/index.ts
@@ -0,0 +1,9 @@
+export interface ImageViewerProps {
+ urlList?: string[]
+ zIndex?: number
+ initialIndex?: number
+ infinite?: boolean
+ hideOnClickModal?: boolean
+ teleported?: boolean
+ show?: boolean
+}
diff --git a/src/components/Infotip/index.ts b/src/components/Infotip/index.ts
new file mode 100644
index 0000000..eb99944
--- /dev/null
+++ b/src/components/Infotip/index.ts
@@ -0,0 +1,5 @@
+import Infotip from './src/Infotip.vue'
+
+export type { InfoTipSchema } from './src/types'
+
+export { Infotip }
diff --git a/src/components/Infotip/src/Infotip.vue b/src/components/Infotip/src/Infotip.vue
new file mode 100644
index 0000000..ff9136c
--- /dev/null
+++ b/src/components/Infotip/src/Infotip.vue
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+ {{ title }}
+
+
+
+
+ {{ showIndex ? `${$index + 1}、` : '' }}{{ typeof item === 'string' ? item : item.label }}
+
+
+
+
+
diff --git a/src/components/Infotip/src/types/index.ts b/src/components/Infotip/src/types/index.ts
new file mode 100644
index 0000000..50398db
--- /dev/null
+++ b/src/components/Infotip/src/types/index.ts
@@ -0,0 +1,4 @@
+export interface InfoTipSchema {
+ label: string
+ keys?: string[]
+}
diff --git a/src/components/InputPassword/index.ts b/src/components/InputPassword/index.ts
new file mode 100644
index 0000000..1dcc38e
--- /dev/null
+++ b/src/components/InputPassword/index.ts
@@ -0,0 +1,3 @@
+import InputPassword from './src/InputPassword.vue'
+
+export { InputPassword }
diff --git a/src/components/InputPassword/src/InputPassword.vue b/src/components/InputPassword/src/InputPassword.vue
new file mode 100644
index 0000000..d9aa928
--- /dev/null
+++ b/src/components/InputPassword/src/InputPassword.vue
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
diff --git a/src/components/JsonEditor/index.ts b/src/components/JsonEditor/index.ts
new file mode 100644
index 0000000..53a2d06
--- /dev/null
+++ b/src/components/JsonEditor/index.ts
@@ -0,0 +1,4 @@
+import JsonEditor from './src/JsonEditor.vue'
+export type { JsonEditorProps } from './src/types'
+
+export { JsonEditor }
diff --git a/src/components/JsonEditor/src/JsonEditor.vue b/src/components/JsonEditor/src/JsonEditor.vue
new file mode 100644
index 0000000..a1c0a43
--- /dev/null
+++ b/src/components/JsonEditor/src/JsonEditor.vue
@@ -0,0 +1,98 @@
+
+
+
+
+
diff --git a/src/components/JsonEditor/src/types/index.ts b/src/components/JsonEditor/src/types/index.ts
new file mode 100644
index 0000000..d77097f
--- /dev/null
+++ b/src/components/JsonEditor/src/types/index.ts
@@ -0,0 +1,23 @@
+export interface JsonEditorProps {
+ value: any
+ deep?: number
+ showLength?: boolean
+ showLineNumbers?: boolean
+ showLineNumber?: boolean
+ showIcon?: boolean
+ showDoubleQuotes?: boolean
+ virtual?: boolean
+ height?: number
+ itemHeight?: number
+ rootPath?: string
+ nodeSelectable?: (...args: any[]) => boolean
+ selectableType?: 'multiple' | 'single'
+ showSelectController?: boolean
+ selectOnClickNode?: boolean
+ highlightSelectedNode?: boolean
+ collapsedOnClickBrackets?: boolean
+ renderNodeKey?: (...args: any[]) => any
+ renderNodeValue?: (...args: any[]) => any
+ editable?: boolean
+ editableTrigger?: 'click' | 'dblclick'
+}
diff --git a/src/components/LocaleDropdown/index.ts b/src/components/LocaleDropdown/index.ts
new file mode 100644
index 0000000..4d9b98a
--- /dev/null
+++ b/src/components/LocaleDropdown/index.ts
@@ -0,0 +1,5 @@
+import LocaleDropdown from './src/LocaleDropdown.vue'
+
+export type { Language, LocaleDropdownType } from './src/types'
+
+export { LocaleDropdown }
diff --git a/src/components/LocaleDropdown/src/LocaleDropdown.vue b/src/components/LocaleDropdown/src/LocaleDropdown.vue
new file mode 100644
index 0000000..e1a0342
--- /dev/null
+++ b/src/components/LocaleDropdown/src/LocaleDropdown.vue
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
diff --git a/src/components/LocaleDropdown/src/types/index.ts b/src/components/LocaleDropdown/src/types/index.ts
new file mode 100644
index 0000000..c749dce
--- /dev/null
+++ b/src/components/LocaleDropdown/src/types/index.ts
@@ -0,0 +1,10 @@
+export interface Language {
+ el: Recordable
+ name: string
+}
+
+export interface LocaleDropdownType {
+ lang: LocaleType
+ name?: string
+ elLocale?: Language
+}
diff --git a/src/components/Logo/index.ts b/src/components/Logo/index.ts
new file mode 100644
index 0000000..1c4224c
--- /dev/null
+++ b/src/components/Logo/index.ts
@@ -0,0 +1,3 @@
+import Logo from './src/Logo.vue'
+
+export { Logo }
diff --git a/src/components/Logo/src/Logo.vue b/src/components/Logo/src/Logo.vue
new file mode 100644
index 0000000..89cbe90
--- /dev/null
+++ b/src/components/Logo/src/Logo.vue
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+ {{ title }}
+
+
+
+
diff --git a/src/components/Menu/index.ts b/src/components/Menu/index.ts
new file mode 100644
index 0000000..a6ec696
--- /dev/null
+++ b/src/components/Menu/index.ts
@@ -0,0 +1,3 @@
+import Menu from './src/Menu.vue'
+
+export { Menu }
diff --git a/src/components/Menu/src/Menu.vue b/src/components/Menu/src/Menu.vue
new file mode 100644
index 0000000..083d03c
--- /dev/null
+++ b/src/components/Menu/src/Menu.vue
@@ -0,0 +1,278 @@
+
+
+
+
+
diff --git a/src/components/Menu/src/components/useRenderMenuItem.tsx b/src/components/Menu/src/components/useRenderMenuItem.tsx
new file mode 100644
index 0000000..96914cc
--- /dev/null
+++ b/src/components/Menu/src/components/useRenderMenuItem.tsx
@@ -0,0 +1,59 @@
+import { ElSubMenu, ElMenuItem } from 'element-plus'
+import { unref } from 'vue'
+import { hasOneShowingChild } from '../helper'
+import { isUrl } from '@/utils/is'
+import { useRenderMenuTitle } from './useRenderMenuTitle'
+import { pathResolve } from '@/utils/routerHelper'
+import { useDesign } from '@/hooks/web/useDesign'
+
+const { getPrefixCls } = useDesign()
+const prefixCls = getPrefixCls('submenu')
+
+const { renderMenuTitle } = useRenderMenuTitle()
+
+export const useRenderMenuItem = (menuMode) =>
+ // allRouters: AppRouteRecordRaw[] = [],
+ {
+ const renderMenuItem = (routers: AppRouteRecordRaw[], parentPath = '/') => {
+ return routers
+ .filter((v) => !v.meta?.hidden)
+ .map((v) => {
+ const meta = v.meta ?? {}
+ const { oneShowingChild, onlyOneChild } = hasOneShowingChild(v.children, v)
+ const fullPath = isUrl(v.path) ? v.path : pathResolve(parentPath, v.path) // getAllParentPath(allRouters, v.path).join('/')
+
+ if (
+ oneShowingChild &&
+ (!onlyOneChild?.children || onlyOneChild?.noShowingChildren) &&
+ !meta?.alwaysShow
+ ) {
+ return (
+
+ {{
+ default: () => renderMenuTitle(onlyOneChild ? onlyOneChild?.meta : meta)
+ }}
+
+ )
+ } else {
+ return (
+
+ {{
+ title: () => renderMenuTitle(meta),
+ default: () => renderMenuItem(v.children!, fullPath)
+ }}
+
+ )
+ }
+ })
+ }
+
+ return {
+ renderMenuItem
+ }
+ }
diff --git a/src/components/Menu/src/components/useRenderMenuTitle.tsx b/src/components/Menu/src/components/useRenderMenuTitle.tsx
new file mode 100644
index 0000000..8941d9d
--- /dev/null
+++ b/src/components/Menu/src/components/useRenderMenuTitle.tsx
@@ -0,0 +1,27 @@
+import type { RouteMeta } from 'vue-router'
+import { Icon } from '@/components/Icon'
+import { useI18n } from '@/hooks/web/useI18n'
+
+export const useRenderMenuTitle = () => {
+ const renderMenuTitle = (meta: RouteMeta) => {
+ const { t } = useI18n()
+ const { title = 'Please set title', icon } = meta
+
+ return icon ? (
+ <>
+
+
+ >
+ ) : (
+
+ )
+ }
+
+ return {
+ renderMenuTitle
+ }
+}
diff --git a/src/components/Menu/src/helper.ts b/src/components/Menu/src/helper.ts
new file mode 100644
index 0000000..003cf10
--- /dev/null
+++ b/src/components/Menu/src/helper.ts
@@ -0,0 +1,54 @@
+import { ref, unref } from 'vue'
+import { findPath } from '@/utils/tree'
+
+type OnlyOneChildType = AppRouteRecordRaw & { noShowingChildren?: boolean }
+
+interface HasOneShowingChild {
+ oneShowingChild?: boolean
+ onlyOneChild?: OnlyOneChildType
+}
+
+export const getAllParentPath = (treeData: T[], path: string) => {
+ const menuList = findPath(treeData, (n) => n.path === path) as AppRouteRecordRaw[]
+ return (menuList || []).map((item) => item.path)
+}
+
+export const hasOneShowingChild = (
+ children: AppRouteRecordRaw[] = [],
+ parent: AppRouteRecordRaw
+): HasOneShowingChild => {
+ const onlyOneChild = ref()
+
+ const showingChildren = children.filter((v) => {
+ const meta = v.meta ?? {}
+ if (meta.hidden) {
+ return false
+ } else {
+ // Temp set(will be used if only has one showing child)
+ onlyOneChild.value = v
+ return true
+ }
+ })
+
+ // When there is only one child router, the child router is displayed by default
+ if (showingChildren.length === 1) {
+ return {
+ oneShowingChild: true,
+ onlyOneChild: unref(onlyOneChild)
+ }
+ }
+
+ // Show parent if there are no child router to display
+ if (!showingChildren.length) {
+ onlyOneChild.value = { ...parent, path: '', noShowingChildren: true }
+ return {
+ oneShowingChild: true,
+ onlyOneChild: unref(onlyOneChild)
+ }
+ }
+
+ return {
+ oneShowingChild: false,
+ onlyOneChild: unref(onlyOneChild)
+ }
+}
diff --git a/src/components/Permission/index.ts b/src/components/Permission/index.ts
new file mode 100644
index 0000000..250ae75
--- /dev/null
+++ b/src/components/Permission/index.ts
@@ -0,0 +1,4 @@
+import Permission from './src/Permission.vue'
+import { hasPermi } from './src/utils'
+
+export { Permission, hasPermi }
diff --git a/src/components/Permission/src/Permission.vue b/src/components/Permission/src/Permission.vue
new file mode 100644
index 0000000..8581a9d
--- /dev/null
+++ b/src/components/Permission/src/Permission.vue
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
diff --git a/src/components/Permission/src/utils.ts b/src/components/Permission/src/utils.ts
new file mode 100644
index 0000000..4c0a9b5
--- /dev/null
+++ b/src/components/Permission/src/utils.ts
@@ -0,0 +1,14 @@
+import { useI18n } from '@/hooks/web/useI18n'
+import router from '@/router'
+
+export const hasPermi = (value: string) => {
+ const { t } = useI18n()
+ const permission = (router.currentRoute.value.meta.permission || []) as string[]
+ if (!value) {
+ throw new Error(t('permission.hasPermission'))
+ }
+ if (permission.includes(value)) {
+ return true
+ }
+ return false
+}
diff --git a/src/components/Qrcode/index.ts b/src/components/Qrcode/index.ts
new file mode 100644
index 0000000..263f039
--- /dev/null
+++ b/src/components/Qrcode/index.ts
@@ -0,0 +1,5 @@
+import Qrcode from './src/Qrcode.vue'
+
+export type { QrcodeLogo } from './src/types'
+
+export { Qrcode }
diff --git a/src/components/Qrcode/src/Qrcode.vue b/src/components/Qrcode/src/Qrcode.vue
new file mode 100644
index 0000000..3b3cc1c
--- /dev/null
+++ b/src/components/Qrcode/src/Qrcode.vue
@@ -0,0 +1,252 @@
+
+
+
+
+
+
+
diff --git a/src/components/Qrcode/src/types/index.ts b/src/components/Qrcode/src/types/index.ts
new file mode 100644
index 0000000..86cdf0b
--- /dev/null
+++ b/src/components/Qrcode/src/types/index.ts
@@ -0,0 +1,9 @@
+export interface QrcodeLogo {
+ src?: string
+ logoSize?: number
+ bgColor?: string
+ borderSize?: number
+ crossOrigin?: string
+ borderRadius?: number
+ logoRadius?: number
+}
diff --git a/src/components/Screenfull/index.ts b/src/components/Screenfull/index.ts
new file mode 100644
index 0000000..faec2d8
--- /dev/null
+++ b/src/components/Screenfull/index.ts
@@ -0,0 +1,3 @@
+import Screenfull from './src/Screenfull.vue'
+
+export { Screenfull }
diff --git a/src/components/Screenfull/src/Screenfull.vue b/src/components/Screenfull/src/Screenfull.vue
new file mode 100644
index 0000000..048df9a
--- /dev/null
+++ b/src/components/Screenfull/src/Screenfull.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
diff --git a/src/components/Search/index.ts b/src/components/Search/index.ts
new file mode 100644
index 0000000..696ad84
--- /dev/null
+++ b/src/components/Search/index.ts
@@ -0,0 +1,15 @@
+import { FormSchema, FormSetProps } from '../Form'
+import Search from './src/Search.vue'
+
+export type { SearchProps } from './src/types'
+
+export interface SearchExpose {
+ setValues: (data: Recordable) => void
+ setProps: (props: Recordable) => void
+ delSchema: (field: string) => void
+ addSchema: (formSchema: FormSchema, index?: number) => void
+ setSchema: (schemaProps: FormSetProps[]) => void
+ getFormData: () => Promise
+}
+
+export { Search }
diff --git a/src/components/Search/src/Search.vue b/src/components/Search/src/Search.vue
new file mode 100644
index 0000000..3e57ed6
--- /dev/null
+++ b/src/components/Search/src/Search.vue
@@ -0,0 +1,271 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/Search/src/components/ActionButton.vue b/src/components/Search/src/components/ActionButton.vue
new file mode 100644
index 0000000..8de1838
--- /dev/null
+++ b/src/components/Search/src/components/ActionButton.vue
@@ -0,0 +1,59 @@
+
+
+
+
+ {{ t('common.query') }}
+
+
+ {{ t('common.reset') }}
+
+
+ {{ t(visible ? 'common.shrink' : 'common.expand') }}
+
+
diff --git a/src/components/Search/src/types/index.ts b/src/components/Search/src/types/index.ts
new file mode 100644
index 0000000..7a1901d
--- /dev/null
+++ b/src/components/Search/src/types/index.ts
@@ -0,0 +1,16 @@
+import { FormSchema } from '@/components/Form'
+
+export interface SearchProps {
+ schema?: FormSchema[]
+ isCol?: boolean
+ labelWidth?: string | number
+ layout?: 'inline' | 'bottom'
+ buttonPosition?: 'left' | 'right' | 'center'
+ showSearch?: boolean
+ showReset?: boolean
+ showExpand?: boolean
+ expandField?: string
+ inline?: boolean
+ removeNoValueItem?: boolean
+ model?: Recordable
+}
diff --git a/src/components/Setting/index.ts b/src/components/Setting/index.ts
new file mode 100644
index 0000000..b64c9ad
--- /dev/null
+++ b/src/components/Setting/index.ts
@@ -0,0 +1,3 @@
+import Setting from './src/Setting.vue'
+
+export { Setting }
diff --git a/src/components/Setting/src/Setting.vue b/src/components/Setting/src/Setting.vue
new file mode 100644
index 0000000..ecbe72d
--- /dev/null
+++ b/src/components/Setting/src/Setting.vue
@@ -0,0 +1,251 @@
+
+
+
+
+
+
+
+
+
+ {{ t('setting.projectSetting') }}
+
+
+
+
+ {{ t('setting.theme') }}
+
+
+
+ {{ t('setting.layout') }}
+
+
+
+ {{ t('setting.systemTheme') }}
+
+
+
+ {{ t('setting.headerTheme') }}
+
+
+
+ {{ t('setting.menuTheme') }}
+
+
+
+
+ {{ t('setting.interfaceDisplay') }}
+
+
+
+
+ {{
+ t('setting.copy')
+ }}
+
+
+
+ {{ t('setting.clearAndReset') }}
+
+
+
+
+
+
diff --git a/src/components/Setting/src/components/ColorRadioPicker.vue b/src/components/Setting/src/components/ColorRadioPicker.vue
new file mode 100644
index 0000000..9774176
--- /dev/null
+++ b/src/components/Setting/src/components/ColorRadioPicker.vue
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/Setting/src/components/InterfaceDisplay.vue b/src/components/Setting/src/components/InterfaceDisplay.vue
new file mode 100644
index 0000000..466dc65
--- /dev/null
+++ b/src/components/Setting/src/components/InterfaceDisplay.vue
@@ -0,0 +1,227 @@
+
+
+
+
+
+ {{ t('setting.breadcrumb') }}
+
+
+
+
+ {{ t('setting.breadcrumbIcon') }}
+
+
+
+
+ {{ t('setting.hamburgerIcon') }}
+
+
+
+
+ {{ t('setting.screenfullIcon') }}
+
+
+
+
+ {{ t('setting.sizeIcon') }}
+
+
+
+
+ {{ t('setting.localeIcon') }}
+
+
+
+
+ {{ t('setting.tagsView') }}
+
+
+
+
+ {{ t('setting.tagsViewIcon') }}
+
+
+
+
+ {{ t('setting.logo') }}
+
+
+
+
+ {{ t('setting.uniqueOpened') }}
+
+
+
+
+ {{ t('setting.fixedHeader') }}
+
+
+
+
+ {{ t('setting.footer') }}
+
+
+
+
+ {{ t('setting.greyMode') }}
+
+
+
+
+ {{ t('setting.dynamicRouter') }}
+
+
+
+
+ {{ t('setting.serverDynamicRouter') }}
+
+
+
+
+ {{ t('setting.fixedMenu') }}
+
+
+
+
diff --git a/src/components/Setting/src/components/LayoutRadioPicker.vue b/src/components/Setting/src/components/LayoutRadioPicker.vue
new file mode 100644
index 0000000..2b6d4b5
--- /dev/null
+++ b/src/components/Setting/src/components/LayoutRadioPicker.vue
@@ -0,0 +1,171 @@
+
+
+
+
+
+
+
diff --git a/src/components/SizeDropdown/index.ts b/src/components/SizeDropdown/index.ts
new file mode 100644
index 0000000..516488d
--- /dev/null
+++ b/src/components/SizeDropdown/index.ts
@@ -0,0 +1,3 @@
+import SizeDropdown from './src/SizeDropdown.vue'
+
+export { SizeDropdown }
diff --git a/src/components/SizeDropdown/src/SizeDropdown.vue b/src/components/SizeDropdown/src/SizeDropdown.vue
new file mode 100644
index 0000000..eb55917
--- /dev/null
+++ b/src/components/SizeDropdown/src/SizeDropdown.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+ {{ t(`size.${item}`) }}
+
+
+
+
+
diff --git a/src/components/TabMenu/index.ts b/src/components/TabMenu/index.ts
new file mode 100644
index 0000000..b5fd71c
--- /dev/null
+++ b/src/components/TabMenu/index.ts
@@ -0,0 +1,3 @@
+import TabMenu from './src/TabMenu.vue'
+
+export { TabMenu }
diff --git a/src/components/TabMenu/src/TabMenu.vue b/src/components/TabMenu/src/TabMenu.vue
new file mode 100644
index 0000000..e6cf366
--- /dev/null
+++ b/src/components/TabMenu/src/TabMenu.vue
@@ -0,0 +1,251 @@
+
+
+
diff --git a/src/components/TabMenu/src/helper.ts b/src/components/TabMenu/src/helper.ts
new file mode 100644
index 0000000..cb4696e
--- /dev/null
+++ b/src/components/TabMenu/src/helper.ts
@@ -0,0 +1,51 @@
+import { getAllParentPath } from '@/components/Menu/src/helper'
+import { isUrl } from '@/utils/is'
+import { cloneDeep } from 'lodash-es'
+import { reactive } from 'vue'
+
+export type TabMapTypes = {
+ [key: string]: string[]
+}
+
+export const tabPathMap = reactive({})
+
+export const initTabMap = (routes: AppRouteRecordRaw[]) => {
+ for (const v of routes) {
+ const meta = v.meta ?? {}
+ if (!meta?.hidden) {
+ tabPathMap[v.path] = []
+ }
+ }
+}
+
+export const filterMenusPath = (
+ routes: AppRouteRecordRaw[],
+ allRoutes: AppRouteRecordRaw[]
+): AppRouteRecordRaw[] => {
+ const res: AppRouteRecordRaw[] = []
+ for (const v of routes) {
+ let data: Nullable = null
+ const meta = v.meta ?? {}
+ if (!meta.hidden || meta.canTo) {
+ const allParentPath = getAllParentPath(allRoutes, v.path)
+
+ const fullPath = isUrl(v.path) ? v.path : allParentPath.join('/')
+
+ data = cloneDeep(v)
+ data.path = fullPath
+ if (v.children && data) {
+ data.children = filterMenusPath(v.children, allRoutes)
+ }
+
+ if (data) {
+ res.push(data)
+ }
+
+ if (allParentPath.length && Reflect.has(tabPathMap, allParentPath[0])) {
+ tabPathMap[allParentPath[0]].push(fullPath)
+ }
+ }
+ }
+
+ return res
+}
diff --git a/src/components/Table/index.ts b/src/components/Table/index.ts
new file mode 100644
index 0000000..472ae5d
--- /dev/null
+++ b/src/components/Table/index.ts
@@ -0,0 +1,21 @@
+import Table from './src/Table.vue'
+import { ElTable } from 'element-plus'
+import { TableColumn, TableSetProps } from './src/types'
+
+export type {
+ TableColumn,
+ TableSlotDefault,
+ Pagination,
+ TableSetProps,
+ TableProps
+} from './src/types'
+
+export interface TableExpose {
+ setProps: (props: Recordable) => void
+ setColumn: (columnProps: TableSetProps[]) => void
+ addColumn: (column: TableColumn, index?: number) => void
+ delColumn: (field: string) => void
+ elTableRef: ComponentRef
+}
+
+export { Table }
diff --git a/src/components/Table/src/Table.vue b/src/components/Table/src/Table.vue
new file mode 100644
index 0000000..9d496f0
--- /dev/null
+++ b/src/components/Table/src/Table.vue
@@ -0,0 +1,587 @@
+
diff --git a/src/components/Table/src/components/ColumnSetting.vue b/src/components/Table/src/components/ColumnSetting.vue
new file mode 100644
index 0000000..f0c3825
--- /dev/null
+++ b/src/components/Table/src/components/ColumnSetting.vue
@@ -0,0 +1,166 @@
+
+
+
+
+
+
+
+
+ {{ checkColumns.length }} / {{ settingColumns?.length }}
+
+
固定 / 排序
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 还原
+ 确定
+
+
+
+
diff --git a/src/components/Table/src/components/TableActions.vue b/src/components/Table/src/components/TableActions.vue
new file mode 100644
index 0000000..05336bb
--- /dev/null
+++ b/src/components/Table/src/components/TableActions.vue
@@ -0,0 +1,105 @@
+
diff --git a/src/components/Table/src/helper/index.ts b/src/components/Table/src/helper/index.ts
new file mode 100644
index 0000000..d8b34a8
--- /dev/null
+++ b/src/components/Table/src/helper/index.ts
@@ -0,0 +1,8 @@
+export const setIndex = (reserveIndex: boolean, index: number, size: number, current: number) => {
+ const newIndex = index + 1
+ if (reserveIndex) {
+ return size * (current - 1) + newIndex
+ } else {
+ return newIndex
+ }
+}
diff --git a/src/components/Table/src/types/index.ts b/src/components/Table/src/types/index.ts
new file mode 100644
index 0000000..21200a7
--- /dev/null
+++ b/src/components/Table/src/types/index.ts
@@ -0,0 +1,98 @@
+import { TableProps as ElTableProps } from 'element-plus'
+export interface TableColumn {
+ field: string
+ label?: string
+ type?: string
+ /**
+ * 是否隐藏
+ */
+ hidden?: boolean
+ children?: TableColumn[]
+ slots?: {
+ default?: (...args: any[]) => JSX.Element | JSX.Element[] | null
+ header?: (...args: any[]) => JSX.Element | null
+ }
+ index?: number | ((index: number) => number)
+ columnKey?: string
+ width?: string | number
+ minWidth?: string | number
+ fixed?: boolean | 'left' | 'right'
+ renderHeader?: (...args: any[]) => JSX.Element | null
+ // sortable?: boolean
+ sortMethod?: (...args: any[]) => number
+ sortBy?: string | string[] | ((...args: any[]) => string | string[])
+ sortOrders?: (string | null)[]
+ resizable?: boolean
+ formatter?: (...args: any[]) => any
+ showOverflowTooltip?: boolean
+ align?: 'left' | 'center' | 'right'
+ headerAlign?: 'left' | 'center' | 'right'
+ className?: string
+ labelClassName?: string
+ selectable?: (...args: any[]) => boolean
+ reserveSelection?: boolean
+ filters?: Array<{ text: string; value: string }>
+ filterPlacement?: string
+ filterMultiple?: boolean
+ filterMethod?: (...args: any[]) => boolean
+ filteredValue?: string[]
+ [key: string]: any
+}
+
+export interface TableSlotDefault {
+ row: Recordable
+ column: TableColumn
+ $index: number
+ [key: string]: any
+}
+
+export interface Pagination {
+ small?: boolean
+ background?: boolean
+ pageSize?: number
+ defaultPageSize?: number
+ total?: number
+ pageCount?: number
+ pagerCount?: number
+ currentPage?: number
+ defaultCurrentPage?: number
+ layout?: string
+ pageSizes?: number[]
+ popperClass?: string
+ prevText?: string
+ nextText?: string
+ disabled?: boolean
+ hideOnSinglePage?: boolean
+}
+
+export interface TableSetProps {
+ field: string
+ path: string
+ value: any
+}
+
+export interface TableProps extends Omit>, 'data'> {
+ pageSize?: number
+ currentPage?: number
+ showAction?: boolean
+ // 是否所有的超出隐藏,优先级低于schema中的showOverflowTooltip,
+ showOverflowTooltip?: boolean
+ // 表头
+ columns?: TableColumn[]
+ // 是否展示分页
+ pagination?: Pagination | undefined
+ // 仅对 type=selection 的列有效,类型为 Boolean,为 true 则会在数据更新之后保留之前选中的数据(需指定 row-key)
+ reserveSelection?: boolean
+ // 加载状态
+ loading?: boolean
+ // 是否叠加索引
+ reserveIndex?: boolean
+ // 对齐方式
+ align?: 'left' | 'center' | 'right'
+ // 表头对齐方式
+ headerAlign?: 'left' | 'center' | 'right'
+ imagePreview?: string[]
+ videoPreview?: string[]
+ sortable?: boolean
+ data?: Recordable
+}
diff --git a/src/components/TagsView/index.ts b/src/components/TagsView/index.ts
new file mode 100644
index 0000000..30e604a
--- /dev/null
+++ b/src/components/TagsView/index.ts
@@ -0,0 +1,3 @@
+import TagsView from './src/TagsView.vue'
+
+export { TagsView }
diff --git a/src/components/TagsView/src/TagsView.vue b/src/components/TagsView/src/TagsView.vue
new file mode 100644
index 0000000..da3336b
--- /dev/null
+++ b/src/components/TagsView/src/TagsView.vue
@@ -0,0 +1,590 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t(item?.meta?.title as string) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/TagsView/src/helper.ts b/src/components/TagsView/src/helper.ts
new file mode 100644
index 0000000..912eb8e
--- /dev/null
+++ b/src/components/TagsView/src/helper.ts
@@ -0,0 +1,21 @@
+import type { RouteLocationNormalizedLoaded } from 'vue-router'
+import { pathResolve } from '@/utils/routerHelper'
+
+export const filterAffixTags = (routes: AppRouteRecordRaw[], parentPath = '') => {
+ let tags: RouteLocationNormalizedLoaded[] = []
+ routes.forEach((route) => {
+ const meta = route.meta ?? {}
+ const tagPath = pathResolve(parentPath, route.path)
+ if (meta?.affix) {
+ tags.push({ ...route, path: tagPath, fullPath: tagPath } as RouteLocationNormalizedLoaded)
+ }
+ if (route.children) {
+ const tempTags: RouteLocationNormalizedLoaded[] = filterAffixTags(route.children, tagPath)
+ if (tempTags.length >= 1) {
+ tags = [...tags, ...tempTags]
+ }
+ }
+ })
+
+ return tags
+}
diff --git a/src/components/ThemeSwitch/index.ts b/src/components/ThemeSwitch/index.ts
new file mode 100644
index 0000000..823a276
--- /dev/null
+++ b/src/components/ThemeSwitch/index.ts
@@ -0,0 +1,3 @@
+import ThemeSwitch from './src/ThemeSwitch.vue'
+
+export { ThemeSwitch }
diff --git a/src/components/ThemeSwitch/src/ThemeSwitch.vue b/src/components/ThemeSwitch/src/ThemeSwitch.vue
new file mode 100644
index 0000000..94b02c6
--- /dev/null
+++ b/src/components/ThemeSwitch/src/ThemeSwitch.vue
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
diff --git a/src/components/Tree/index.ts b/src/components/Tree/index.ts
new file mode 100644
index 0000000..bee5f92
--- /dev/null
+++ b/src/components/Tree/index.ts
@@ -0,0 +1,3 @@
+import Tree from './src/Tree.vue'
+
+export { Tree }
diff --git a/src/components/Tree/src/Tree.vue b/src/components/Tree/src/Tree.vue
new file mode 100644
index 0000000..66597d1
--- /dev/null
+++ b/src/components/Tree/src/Tree.vue
@@ -0,0 +1,147 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ node.label }}
+
+
+
+
+
+
+
+
diff --git a/src/components/UserInfo/index.ts b/src/components/UserInfo/index.ts
new file mode 100644
index 0000000..c3a34ab
--- /dev/null
+++ b/src/components/UserInfo/index.ts
@@ -0,0 +1,3 @@
+import UserInfo from './src/UserInfo.vue'
+
+export { UserInfo }
diff --git a/src/components/UserInfo/src/UserInfo.vue b/src/components/UserInfo/src/UserInfo.vue
new file mode 100644
index 0000000..526b0a0
--- /dev/null
+++ b/src/components/UserInfo/src/UserInfo.vue
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('router.personalCenter') }}
+
+
+
+ {{ t('common.document') }}
+
+
+ {{ t('lock.lockScreen') }}
+
+
+ {{ t('common.loginOut') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/UserInfo/src/components/LockDialog.vue b/src/components/UserInfo/src/components/LockDialog.vue
new file mode 100644
index 0000000..a8dc34f
--- /dev/null
+++ b/src/components/UserInfo/src/components/LockDialog.vue
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+ {{ t('lock.lock') }}
+
+
+
+
+
diff --git a/src/components/UserInfo/src/components/LockPage.vue b/src/components/UserInfo/src/components/LockPage.vue
new file mode 100644
index 0000000..88d6998
--- /dev/null
+++ b/src/components/UserInfo/src/components/LockPage.vue
@@ -0,0 +1,281 @@
+
+
+
+
+
+
+ {{ t('lock.unlock') }}
+
+
+
+
+ {{ hour }}
+
+ {{ meridiem }}
+
+
+
+ {{ minute }}
+
+
+
+
+
+
+
+
Archer
+
+
+
+ {{ t('lock.message') }}
+
+
+
+ {{ t('common.back') }}
+
+
+ {{ t('lock.backToLogin') }}
+
+
+ {{ t('lock.entrySystem') }}
+
+
+
+
+
+
+
+
+ {{ hour }}:{{ minute }} {{ meridiem }}
+
+
{{ year }}/{{ month }}/{{ day }} {{ week }}
+
+
+
+
+
diff --git a/src/components/VideoPlayer/index.ts b/src/components/VideoPlayer/index.ts
new file mode 100644
index 0000000..247deca
--- /dev/null
+++ b/src/components/VideoPlayer/index.ts
@@ -0,0 +1,27 @@
+import { VNode, createVNode, render } from 'vue'
+import VideoPlayer from './src/VideoPlayer.vue'
+import { isClient } from '@/utils/is'
+import { VideoPlayerViewer } from '@/components/VideoPlayerViewer'
+import { toAnyString } from '@/utils'
+
+export { VideoPlayer }
+
+let instance: Nullable = null
+
+export function createVideoViewer(options: { url: string; poster?: string; show?: boolean }) {
+ if (!isClient) return
+ const { url, poster } = options
+
+ const propsData: Partial<{ url: string; poster?: string; show?: boolean; id?: string }> = {}
+ const container = document.createElement('div')
+ const id = toAnyString()
+ container.id = id
+ propsData.url = url
+ propsData.poster = poster
+ propsData.show = true
+ propsData.id = id
+
+ document.body.appendChild(container)
+ instance = createVNode(VideoPlayerViewer, propsData)
+ render(instance, container)
+}
diff --git a/src/components/VideoPlayer/src/VideoPlayer.vue b/src/components/VideoPlayer/src/VideoPlayer.vue
new file mode 100644
index 0000000..83c8d30
--- /dev/null
+++ b/src/components/VideoPlayer/src/VideoPlayer.vue
@@ -0,0 +1,59 @@
+
+
+
+
+
diff --git a/src/components/VideoPlayerViewer/index.ts b/src/components/VideoPlayerViewer/index.ts
new file mode 100644
index 0000000..7f99155
--- /dev/null
+++ b/src/components/VideoPlayerViewer/index.ts
@@ -0,0 +1,3 @@
+import VideoPlayerViewer from './src/VideoPlayerViewer.vue'
+
+export { VideoPlayerViewer }
diff --git a/src/components/VideoPlayerViewer/src/VideoPlayerViewer.vue b/src/components/VideoPlayerViewer/src/VideoPlayerViewer.vue
new file mode 100644
index 0000000..56968df
--- /dev/null
+++ b/src/components/VideoPlayerViewer/src/VideoPlayerViewer.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
diff --git a/src/components/Waterfall/index.ts b/src/components/Waterfall/index.ts
new file mode 100644
index 0000000..6fed67f
--- /dev/null
+++ b/src/components/Waterfall/index.ts
@@ -0,0 +1,3 @@
+import Waterfall from './src/Waterfall.vue'
+
+export { Waterfall }
diff --git a/src/components/Waterfall/src/Waterfall.vue b/src/components/Waterfall/src/Waterfall.vue
new file mode 100644
index 0000000..32a0aa7
--- /dev/null
+++ b/src/components/Waterfall/src/Waterfall.vue
@@ -0,0 +1,234 @@
+
+
+
+
+
+
+
+
+
+
+ {{ end ? endText : loadingText }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ end ? endText : loadingText }}
+
+
+
+
+
diff --git a/src/components/index.ts b/src/components/index.ts
new file mode 100644
index 0000000..9a179ea
--- /dev/null
+++ b/src/components/index.ts
@@ -0,0 +1,10 @@
+import type { App } from 'vue'
+import { Icon } from './Icon'
+import { Permission } from './Permission'
+import { BaseButton } from './Button'
+
+export const setupGlobCom = (app: App): void => {
+ app.component('Icon', Icon)
+ app.component('Permission', Permission)
+ app.component('BaseButton', BaseButton)
+}
diff --git a/src/constants/index.ts b/src/constants/index.ts
new file mode 100644
index 0000000..cdf427e
--- /dev/null
+++ b/src/constants/index.ts
@@ -0,0 +1,39 @@
+/**
+ * 请求成功状态码
+ */
+export const SUCCESS_CODE = 0
+
+/**
+ * 请求contentType
+ */
+export const CONTENT_TYPE: AxiosContentType = 'application/json'
+
+/**
+ * 请求超时时间
+ */
+export const REQUEST_TIMEOUT = 60000
+
+/**
+ * 不重定向白名单
+ */
+export const NO_REDIRECT_WHITE_LIST = ['/login']
+
+/**
+ * 不重置路由白名单
+ */
+export const NO_RESET_WHITE_LIST = ['Redirect', 'RedirectWrap', 'Login', 'NoFind', 'Root']
+
+/**
+ * 表格默认过滤列设置字段
+ */
+export const DEFAULT_FILTER_COLUMN = ['expand', 'selection']
+
+/**
+ * 是否根据headers->content-type自动转换数据格式
+ */
+export const TRANSFORM_REQUEST_DATA = true
+
+/**
+ * 全局图标前缀
+ */
+export const ICON_PREFIX = 'vi-'
diff --git a/src/directives/index.ts b/src/directives/index.ts
new file mode 100644
index 0000000..11b1da8
--- /dev/null
+++ b/src/directives/index.ts
@@ -0,0 +1,10 @@
+import type { App } from 'vue'
+import { setupPermissionDirective } from './permission/hasPermi'
+
+/**
+ * 导出指令:v-xxx
+ * @methods hasPermi 按钮权限,用法: v-hasPermi
+ */
+export const setupPermission = (app: App) => {
+ setupPermissionDirective(app)
+}
diff --git a/src/directives/permission/hasPermi.ts b/src/directives/permission/hasPermi.ts
new file mode 100644
index 0000000..0a74d94
--- /dev/null
+++ b/src/directives/permission/hasPermi.ts
@@ -0,0 +1,37 @@
+import type { App, Directive, DirectiveBinding } from 'vue'
+import { useI18n } from '@/hooks/web/useI18n'
+import router from '@/router'
+
+const { t } = useI18n()
+
+const hasPermission = (value: string): boolean => {
+ const permission = (router.currentRoute.value.meta.permission || []) as string[]
+ if (!value) {
+ throw new Error(t('permission.hasPermission'))
+ }
+ if (permission.includes(value)) {
+ return true
+ }
+ return false
+}
+function hasPermi(el: Element, binding: DirectiveBinding) {
+ const value = binding.value
+
+ const flag = hasPermission(value)
+ if (!flag) {
+ el.parentNode?.removeChild(el)
+ }
+}
+const mounted = (el: Element, binding: DirectiveBinding) => {
+ hasPermi(el, binding)
+}
+
+const permiDirective: Directive = {
+ mounted
+}
+
+export const setupPermissionDirective = (app: App) => {
+ app.directive('hasPermi', permiDirective)
+}
+
+export default permiDirective
diff --git a/src/hooks/event/useEventBus.ts b/src/hooks/event/useEventBus.ts
new file mode 100644
index 0000000..d9ee832
--- /dev/null
+++ b/src/hooks/event/useEventBus.ts
@@ -0,0 +1,26 @@
+import mitt from 'mitt'
+import { onBeforeUnmount } from 'vue'
+
+interface Option {
+ name: string // 事件名称
+ callback: Fn // 回调
+}
+
+const emitter = mitt()
+
+export const useEventBus = (option?: Option) => {
+ if (option) {
+ emitter.on(option.name, option.callback)
+
+ onBeforeUnmount(() => {
+ emitter.off(option.name)
+ })
+ }
+
+ return {
+ on: emitter.on,
+ off: emitter.off,
+ emit: emitter.emit,
+ all: emitter.all
+ }
+}
diff --git a/src/hooks/event/useScrollTo.ts b/src/hooks/event/useScrollTo.ts
new file mode 100644
index 0000000..74fd673
--- /dev/null
+++ b/src/hooks/event/useScrollTo.ts
@@ -0,0 +1,62 @@
+import { ref, unref } from 'vue'
+
+export interface ScrollToParams {
+ el: HTMLElement
+ to: number
+ position: string
+ duration?: number
+ callback?: () => void
+}
+
+const easeInOutQuad = (t: number, b: number, c: number, d: number) => {
+ t /= d / 2
+ if (t < 1) {
+ return (c / 2) * t * t + b
+ }
+ t--
+ return (-c / 2) * (t * (t - 2) - 1) + b
+}
+const move = (el: HTMLElement, position: string, amount: number) => {
+ el[position] = amount
+}
+
+export function useScrollTo({
+ el,
+ position = 'scrollLeft',
+ to,
+ duration = 500,
+ callback
+}: ScrollToParams) {
+ const isActiveRef = ref(false)
+ const start = el[position]
+ const change = to - start
+ const increment = 20
+ let currentTime = 0
+
+ function animateScroll() {
+ if (!unref(isActiveRef)) {
+ return
+ }
+ currentTime += increment
+ const val = easeInOutQuad(currentTime, start, change, duration)
+ move(el, position, val)
+ if (currentTime < duration && unref(isActiveRef)) {
+ requestAnimationFrame(animateScroll)
+ } else {
+ if (callback) {
+ callback()
+ }
+ }
+ }
+
+ function run() {
+ isActiveRef.value = true
+ animateScroll()
+ }
+
+ function stop() {
+ isActiveRef.value = false
+ }
+
+ return { start: run, stop }
+}
diff --git a/src/hooks/web/useClipboard.ts b/src/hooks/web/useClipboard.ts
new file mode 100644
index 0000000..fb8c3d6
--- /dev/null
+++ b/src/hooks/web/useClipboard.ts
@@ -0,0 +1,47 @@
+import { ref } from 'vue'
+
+const useClipboard = () => {
+ const copied = ref(false)
+ const text = ref('')
+ const isSupported = ref(false)
+
+ if (!navigator.clipboard && !document.execCommand) {
+ isSupported.value = false
+ } else {
+ isSupported.value = true
+ }
+
+ const copy = (str: string) => {
+ if (navigator.clipboard) {
+ navigator.clipboard.writeText(str).then(() => {
+ text.value = str
+ copied.value = true
+ resetCopied()
+ })
+ return
+ }
+ const input = document.createElement('input')
+ input.setAttribute('readonly', 'readonly')
+ input.setAttribute('value', str)
+ document.body.appendChild(input)
+ input.select()
+ input.setSelectionRange(0, 9999)
+ if (document.execCommand('copy')) {
+ text.value = str
+ document.execCommand('copy')
+ copied.value = true
+ resetCopied()
+ }
+ document.body.removeChild(input)
+ }
+
+ const resetCopied = () => {
+ setTimeout(() => {
+ copied.value = false
+ }, 1500)
+ }
+
+ return { copy, text, copied, isSupported }
+}
+
+export { useClipboard }
diff --git a/src/hooks/web/useConfigGlobal.ts b/src/hooks/web/useConfigGlobal.ts
new file mode 100644
index 0000000..d1e490b
--- /dev/null
+++ b/src/hooks/web/useConfigGlobal.ts
@@ -0,0 +1,10 @@
+import { ConfigGlobalTypes } from '@/components/ConfigGlobal'
+import { inject } from 'vue'
+
+export const useConfigGlobal = () => {
+ const configGlobal = inject('configGlobal', {}) as ConfigGlobalTypes
+
+ return {
+ configGlobal
+ }
+}
diff --git a/src/hooks/web/useCrudSchemas.ts b/src/hooks/web/useCrudSchemas.ts
new file mode 100644
index 0000000..5e61d65
--- /dev/null
+++ b/src/hooks/web/useCrudSchemas.ts
@@ -0,0 +1,163 @@
+import { reactive } from 'vue'
+import { eachTree, treeMap, filter } from '@/utils/tree'
+import { FormSchema } from '@/components/Form'
+import { TableColumn } from '@/components/Table'
+import { DescriptionsSchema } from '@/components/Descriptions'
+
+export type CrudSchema = Omit & {
+ search?: CrudSearchParams
+ table?: CrudTableParams
+ form?: CrudFormParams
+ detail?: CrudDescriptionsParams
+ children?: CrudSchema[]
+}
+
+interface CrudSearchParams extends Omit {
+ // 是否隐藏在查询项
+ hidden?: boolean
+}
+
+interface CrudTableParams extends Omit {
+ // 是否隐藏表头
+ hidden?: boolean
+}
+
+interface CrudFormParams extends Omit {
+ // 是否隐藏表单项
+ hidden?: boolean
+}
+
+interface CrudDescriptionsParams extends Omit {
+ // 是否隐藏表单项
+ hidden?: boolean
+}
+
+interface AllSchemas {
+ searchSchema: FormSchema[]
+ tableColumns: TableColumn[]
+ formSchema: FormSchema[]
+ detailSchema: DescriptionsSchema[]
+}
+
+/**
+ * @deprecated 不推荐使用,感觉过于繁琐,不是很灵活 可能会在某个版本中删除
+ */
+export const useCrudSchemas = (
+ crudSchema: CrudSchema[]
+): {
+ allSchemas: AllSchemas
+} => {
+ // 所有结构数据
+ const allSchemas = reactive({
+ searchSchema: [],
+ tableColumns: [],
+ formSchema: [],
+ detailSchema: []
+ })
+
+ const searchSchema = filterSearchSchema(crudSchema)
+ // @ts-ignore
+ allSchemas.searchSchema = searchSchema || []
+
+ const tableColumns = filterTableSchema(crudSchema)
+ allSchemas.tableColumns = tableColumns || []
+
+ const formSchema = filterFormSchema(crudSchema)
+ allSchemas.formSchema = formSchema
+
+ const detailSchema = filterDescriptionsSchema(crudSchema)
+ allSchemas.detailSchema = detailSchema
+
+ return {
+ allSchemas
+ }
+}
+
+// 过滤 Search 结构
+const filterSearchSchema = (crudSchema: CrudSchema[]): FormSchema[] => {
+ const searchSchema: FormSchema[] = []
+ const length = crudSchema.length
+
+ for (let i = 0; i < length; i++) {
+ const schemaItem = crudSchema[i]
+ if (schemaItem.search?.hidden === true) {
+ continue
+ }
+ // 判断是否隐藏
+ const searchSchemaItem = {
+ component: schemaItem?.search?.component || 'Input',
+ ...schemaItem.search,
+ field: schemaItem.field,
+ label: schemaItem.search?.label || schemaItem.label
+ }
+
+ searchSchema.push(searchSchemaItem)
+ }
+
+ return searchSchema
+}
+
+// 过滤 table 结构
+const filterTableSchema = (crudSchema: CrudSchema[]): TableColumn[] => {
+ const tableColumns = treeMap(crudSchema, {
+ conversion: (schema: CrudSchema) => {
+ if (!schema?.table?.hidden) {
+ return {
+ ...schema,
+ ...schema.table
+ }
+ }
+ }
+ })
+
+ // 第一次过滤会有 undefined 所以需要二次过滤
+ return filter(tableColumns as TableColumn[], (data) => {
+ if (data.children === void 0) {
+ delete data.children
+ }
+ return !!data.field
+ })
+}
+
+// 过滤 form 结构
+const filterFormSchema = (crudSchema: CrudSchema[]): FormSchema[] => {
+ const formSchema: FormSchema[] = []
+ const length = crudSchema.length
+
+ for (let i = 0; i < length; i++) {
+ const formItem = crudSchema[i]
+ const formSchemaItem = {
+ component: formItem?.form?.component || 'Input',
+ ...formItem.form,
+ field: formItem.field,
+ label: formItem.form?.label || formItem.label
+ }
+
+ formSchema.push(formSchemaItem)
+ }
+
+ return formSchema
+}
+
+// 过滤 descriptions 结构
+const filterDescriptionsSchema = (crudSchema: CrudSchema[]): DescriptionsSchema[] => {
+ const descriptionsSchema: FormSchema[] = []
+
+ eachTree(crudSchema, (schemaItem: CrudSchema) => {
+ // 判断是否隐藏
+ if (!schemaItem?.detail?.hidden) {
+ const descriptionsSchemaItem = {
+ ...schemaItem.detail,
+ field: schemaItem.field,
+ label: schemaItem.detail?.label || schemaItem.label
+ }
+
+ // 删除不必要的字段
+ delete descriptionsSchemaItem.hidden
+
+ descriptionsSchema.push(descriptionsSchemaItem)
+ }
+ })
+
+ return descriptionsSchema
+}
diff --git a/src/hooks/web/useDesign.ts b/src/hooks/web/useDesign.ts
new file mode 100644
index 0000000..1ec349f
--- /dev/null
+++ b/src/hooks/web/useDesign.ts
@@ -0,0 +1,18 @@
+import variables from '@/styles/variables.module.less'
+
+export const useDesign = () => {
+ const lessVariables = variables
+
+ /**
+ * @param scope 类名
+ * @returns 返回空间名-类名
+ */
+ const getPrefixCls = (scope: string) => {
+ return `${lessVariables.namespace}-${scope}`
+ }
+
+ return {
+ variables: lessVariables,
+ getPrefixCls
+ }
+}
diff --git a/src/hooks/web/useForm.ts b/src/hooks/web/useForm.ts
new file mode 100644
index 0000000..cdf5eac
--- /dev/null
+++ b/src/hooks/web/useForm.ts
@@ -0,0 +1,149 @@
+import type { Form, FormExpose } from '@/components/Form'
+import type { ElForm, ElFormItem } from 'element-plus'
+import { ref, unref, nextTick } from 'vue'
+import { FormSchema, FormSetProps, FormProps } from '@/components/Form'
+import { isEmptyVal, isObject } from '@/utils/is'
+
+export const useForm = () => {
+ // From实例
+ const formRef = ref()
+
+ // ElForm实例
+ const elFormRef = ref>()
+
+ /**
+ * @param ref Form实例
+ * @param elRef ElForm实例
+ */
+ const register = (ref: typeof Form & FormExpose, elRef: ComponentRef) => {
+ formRef.value = ref
+ elFormRef.value = elRef
+ }
+
+ const getForm = async () => {
+ await nextTick()
+ const form = unref(formRef)
+ if (!form) {
+ console.error('The form is not registered. Please use the register method to register')
+ }
+ return form
+ }
+
+ // 一些内置的方法
+ const methods = {
+ /**
+ * @description 设置form组件的props
+ * @param props form组件的props
+ */
+ setProps: async (props: FormProps = {}) => {
+ const form = await getForm()
+ form?.setProps(props)
+ if (props.model) {
+ form?.setValues(props.model)
+ }
+ },
+
+ /**
+ * @description 设置form的值
+ * @param data 需要设置的数据
+ */
+ setValues: async (data: Recordable) => {
+ const form = await getForm()
+ form?.setValues(data)
+ },
+
+ /**
+ * @description 设置schema
+ * @param schemaProps 需要设置的schemaProps
+ */
+ setSchema: async (schemaProps: FormSetProps[]) => {
+ const form = await getForm()
+ form?.setSchema(schemaProps)
+ },
+
+ /**
+ * @description 新增schema
+ * @param formSchema 需要新增数据
+ * @param index 在哪里新增
+ */
+ addSchema: async (formSchema: FormSchema, index?: number) => {
+ const form = await getForm()
+ form?.addSchema(formSchema, index)
+ },
+
+ /**
+ * @description 删除schema
+ * @param field 删除哪个数据
+ */
+ delSchema: async (field: string) => {
+ const form = await getForm()
+ form?.delSchema(field)
+ },
+
+ /**
+ * @description 获取表单数据
+ * @returns form data
+ */
+ getFormData: async (filterEmptyVal = true): Promise => {
+ const form = await getForm()
+ const model = form?.formModel as any
+ if (filterEmptyVal) {
+ // 使用reduce过滤空值,并返回一个新对象
+ return Object.keys(model).reduce((prev, next) => {
+ const value = model[next]
+ if (!isEmptyVal(value)) {
+ if (isObject(value)) {
+ if (Object.keys(value).length > 0) {
+ prev[next] = value
+ }
+ } else {
+ prev[next] = value
+ }
+ }
+ return prev
+ }, {}) as T
+ } else {
+ return model as T
+ }
+ },
+
+ /**
+ * @description 获取表单组件的实例
+ * @param field 表单项唯一标识
+ * @returns component instance
+ */
+ getComponentExpose: async (field: string) => {
+ const form = await getForm()
+ return form?.getComponentExpose(field)
+ },
+
+ /**
+ * @description 获取formItem组件的实例
+ * @param field 表单项唯一标识
+ * @returns formItem instance
+ */
+ getFormItemExpose: async (field: string) => {
+ const form = await getForm()
+ return form?.getFormItemExpose(field) as ComponentRef
+ },
+
+ /**
+ * @description 获取ElForm组件的实例
+ * @returns ElForm instance
+ */
+ getElFormExpose: async () => {
+ await getForm()
+ return unref(elFormRef)
+ },
+
+ getFormExpose: async () => {
+ await getForm()
+ return unref(formRef)
+ }
+ }
+
+ return {
+ formRegister: register,
+ formMethods: methods
+ }
+}
diff --git a/src/hooks/web/useGuide.ts b/src/hooks/web/useGuide.ts
new file mode 100644
index 0000000..7fd2fb0
--- /dev/null
+++ b/src/hooks/web/useGuide.ts
@@ -0,0 +1,49 @@
+import { Config, driver } from 'driver.js'
+import 'driver.js/dist/driver.css'
+import { useDesign } from '@/hooks/web/useDesign'
+import { useI18n } from '@/hooks/web/useI18n'
+
+const { t } = useI18n()
+
+const { variables } = useDesign()
+
+export const useGuide = (options?: Config) => {
+ const driverObj = driver(
+ options || {
+ showProgress: true,
+ nextBtnText: t('common.nextLabel'),
+ prevBtnText: t('common.prevLabel'),
+ doneBtnText: t('common.doneLabel'),
+ steps: [
+ {
+ element: `#${variables.namespace}-menu`,
+ popover: {
+ title: t('common.menu'),
+ description: t('common.menuDes'),
+ side: 'right'
+ }
+ },
+ {
+ element: `#${variables.namespace}-tool-header`,
+ popover: {
+ title: t('common.tool'),
+ description: t('common.toolDes'),
+ side: 'left'
+ }
+ },
+ {
+ element: `#${variables.namespace}-tags-view`,
+ popover: {
+ title: t('common.tagsView'),
+ description: t('common.tagsViewDes'),
+ side: 'bottom'
+ }
+ }
+ ]
+ }
+ )
+
+ return {
+ ...driverObj
+ }
+}
diff --git a/src/hooks/web/useI18n.ts b/src/hooks/web/useI18n.ts
new file mode 100644
index 0000000..f1e0e7b
--- /dev/null
+++ b/src/hooks/web/useI18n.ts
@@ -0,0 +1,52 @@
+import { i18n } from '@/plugins/vueI18n'
+
+type I18nGlobalTranslation = {
+ (key: string): string
+ (key: string, locale: string): string
+ (key: string, locale: string, list: unknown[]): string
+ (key: string, locale: string, named: Record): string
+ (key: string, list: unknown[]): string
+ (key: string, named: Record): string
+}
+
+type I18nTranslationRestParameters = [string, any]
+
+const getKey = (namespace: string | undefined, key: string) => {
+ if (!namespace) {
+ return key
+ }
+ if (key.startsWith(namespace)) {
+ return key
+ }
+ return `${namespace}.${key}`
+}
+
+export const useI18n = (
+ namespace?: string
+): {
+ t: I18nGlobalTranslation
+} => {
+ const normalFn = {
+ t: (key: string) => {
+ return getKey(namespace, key)
+ }
+ }
+
+ if (!i18n) {
+ return normalFn
+ }
+
+ const { t, ...methods } = i18n.global
+
+ const tFn: I18nGlobalTranslation = (key: string, ...arg: any[]) => {
+ if (!key) return ''
+ if (!key.includes('.') && !namespace) return key
+ return (t as any)(getKey(namespace, key), ...(arg as I18nTranslationRestParameters))
+ }
+ return {
+ ...methods,
+ t: tFn
+ }
+}
+
+export const t = (key: string) => key
diff --git a/src/hooks/web/useIcon.ts b/src/hooks/web/useIcon.ts
new file mode 100644
index 0000000..b76bb29
--- /dev/null
+++ b/src/hooks/web/useIcon.ts
@@ -0,0 +1,7 @@
+import { h } from 'vue'
+import type { VNode } from 'vue'
+import { Icon, IconTypes } from '@/components/Icon'
+
+export const useIcon = (props: IconTypes): VNode => {
+ return h(Icon, props)
+}
diff --git a/src/hooks/web/useLocale.ts b/src/hooks/web/useLocale.ts
new file mode 100644
index 0000000..c65070e
--- /dev/null
+++ b/src/hooks/web/useLocale.ts
@@ -0,0 +1,35 @@
+import { i18n } from '@/plugins/vueI18n'
+import { useLocaleStoreWithOut } from '@/store/modules/locale'
+import { setHtmlPageLang } from '@/plugins/vueI18n/helper'
+
+const setI18nLanguage = (locale: LocaleType) => {
+ const localeStore = useLocaleStoreWithOut()
+
+ if (i18n.mode === 'legacy') {
+ i18n.global.locale = locale
+ } else {
+ ;(i18n.global.locale as any).value = locale
+ }
+ localeStore.setCurrentLocale({
+ lang: locale
+ })
+ setHtmlPageLang(locale)
+}
+
+export const useLocale = () => {
+ // Switching the language will change the locale of useI18n
+ // And submit to configuration modification
+ const changeLocale = async (locale: LocaleType) => {
+ const globalI18n = i18n.global
+
+ const langModule = await import(`../../locales/${locale}.ts`)
+
+ globalI18n.setLocaleMessage(locale, langModule.default)
+
+ setI18nLanguage(locale)
+ }
+
+ return {
+ changeLocale
+ }
+}
diff --git a/src/hooks/web/useMonacoEditor.ts b/src/hooks/web/useMonacoEditor.ts
new file mode 100644
index 0000000..ab464ea
--- /dev/null
+++ b/src/hooks/web/useMonacoEditor.ts
@@ -0,0 +1,129 @@
+import * as monaco from 'monaco-editor'
+import { ref, nextTick, onBeforeUnmount } from 'vue'
+import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker'
+import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker'
+import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker'
+import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker'
+import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker'
+
+self.MonacoEnvironment = {
+ getWorker(_, label) {
+ if (label === 'json') {
+ return new jsonWorker()
+ }
+ if (label === 'css' || label === 'scss' || label === 'less') {
+ return new cssWorker()
+ }
+ if (label === 'html' || label === 'handlebars' || label === 'razor') {
+ return new htmlWorker()
+ }
+ if (label === 'typescript' || label === 'javascript') {
+ return new tsWorker()
+ }
+ return new editorWorker()
+ }
+}
+
+export function useMonacoEditor(language: string = 'javascript') {
+ // 编辑器示例
+ let monacoEditor: monaco.editor.IStandaloneCodeEditor | null = null
+ // 目标元素
+ const monacoEditorRef = ref()
+
+ // 创建实例
+ function createEditor(editorOption: monaco.editor.IStandaloneEditorConstructionOptions = {}) {
+ if (!monacoEditorRef.value) return
+ monacoEditor = monaco.editor.create(monacoEditorRef.value, {
+ // 初始模型
+ model: monaco.editor.createModel('', language),
+ // 是否启用预览图
+ minimap: { enabled: true },
+ // 圆角
+ roundedSelection: true,
+ // 主题
+ theme: 'vs-dark',
+ // 主键
+ multiCursorModifier: 'ctrlCmd',
+ // 滚动条
+ scrollbar: {
+ verticalScrollbarSize: 8,
+ horizontalScrollbarSize: 8
+ },
+ // 行号
+ lineNumbers: 'on',
+ // tab大小
+ tabSize: 2,
+ //字体大小
+ fontSize: 14,
+ // 控制编辑器在用户键入、粘贴、移动或缩进行时是否应自动调整缩进
+ autoIndent: 'advanced',
+ // 自动布局
+ automaticLayout: true,
+ ...editorOption
+ })
+ return monacoEditor
+ }
+
+ // 格式化
+ async function formatDoc() {
+ await monacoEditor?.getAction('editor.action.formatDocument')?.run()
+ }
+
+ // 数据更新
+ function updateVal(val: string) {
+ nextTick(() => {
+ if (getOption(monaco.editor.EditorOption.readOnly)) {
+ updateOptions({ readOnly: false })
+ }
+ monacoEditor?.setValue(val)
+ setTimeout(async () => {
+ await formatDoc()
+ }, 10)
+ })
+ }
+
+ // 配置更新
+ function updateOptions(opt: monaco.editor.IStandaloneEditorConstructionOptions) {
+ monacoEditor?.updateOptions(opt)
+ }
+
+ // 获取配置
+ function getOption(name: monaco.editor.EditorOption) {
+ return monacoEditor?.getOption(name)
+ }
+
+ // 获取实例
+ function getEditor() {
+ return monacoEditor
+ }
+
+ function changeLanguage(newLanguage: string) {
+ const model = monacoEditor?.getModel()
+ if (model) {
+ monaco.editor.setModelLanguage(model, newLanguage)
+ }
+ }
+
+ function changeTheme(newTheme: string) {
+ monaco.editor.setTheme(newTheme)
+ }
+
+ // 页面离开 销毁
+ onBeforeUnmount(() => {
+ if (monacoEditor) {
+ monacoEditor.dispose()
+ }
+ })
+
+ return {
+ monacoEditorRef,
+ createEditor,
+ getEditor,
+ updateVal,
+ updateOptions,
+ getOption,
+ formatDoc,
+ changeLanguage,
+ changeTheme
+ }
+}
diff --git a/src/hooks/web/useNProgress.ts b/src/hooks/web/useNProgress.ts
new file mode 100644
index 0000000..76859e5
--- /dev/null
+++ b/src/hooks/web/useNProgress.ts
@@ -0,0 +1,34 @@
+import { nextTick, unref } from 'vue'
+import type { NProgressOptions } from 'nprogress'
+import NProgress from 'nprogress'
+import 'nprogress/nprogress.css'
+import { useCssVar } from '@vueuse/core'
+
+const primaryColor = useCssVar('--el-color-primary', document.documentElement)
+
+export const useNProgress = () => {
+ NProgress.configure({ showSpinner: false } as NProgressOptions)
+
+ const initColor = async () => {
+ await nextTick()
+ const bar = document.getElementById('nprogress')?.getElementsByClassName('bar')[0] as ElRef
+ if (bar) {
+ bar.style.background = unref(primaryColor.value) as string
+ }
+ }
+
+ initColor()
+
+ const start = () => {
+ NProgress.start()
+ }
+
+ const done = () => {
+ NProgress.done()
+ }
+
+ return {
+ start,
+ done
+ }
+}
diff --git a/src/hooks/web/useNetwork.ts b/src/hooks/web/useNetwork.ts
new file mode 100644
index 0000000..66fa446
--- /dev/null
+++ b/src/hooks/web/useNetwork.ts
@@ -0,0 +1,21 @@
+import { ref, onBeforeUnmount } from 'vue'
+
+const useNetwork = () => {
+ const online = ref(true)
+
+ const updateNetwork = () => {
+ online.value = navigator.onLine
+ }
+
+ window.addEventListener('online', updateNetwork)
+ window.addEventListener('offline', updateNetwork)
+
+ onBeforeUnmount(() => {
+ window.removeEventListener('online', updateNetwork)
+ window.removeEventListener('offline', updateNetwork)
+ })
+
+ return { online }
+}
+
+export { useNetwork }
diff --git a/src/hooks/web/useNow.ts b/src/hooks/web/useNow.ts
new file mode 100644
index 0000000..09d3176
--- /dev/null
+++ b/src/hooks/web/useNow.ts
@@ -0,0 +1,60 @@
+import { dateUtil } from '@/utils/dateUtil'
+import { reactive, toRefs } from 'vue'
+import { tryOnMounted, tryOnUnmounted } from '@vueuse/core'
+
+export const useNow = (immediate = true) => {
+ let timer: IntervalHandle
+
+ const state = reactive({
+ year: 0,
+ month: 0,
+ week: '',
+ day: 0,
+ hour: '',
+ minute: '',
+ second: 0,
+ meridiem: ''
+ })
+
+ const update = () => {
+ const now = dateUtil()
+
+ const h = now.format('HH')
+ const m = now.format('mm')
+ const s = now.get('s')
+
+ state.year = now.get('y')
+ state.month = now.get('M') + 1
+ state.week = '星期' + ['日', '一', '二', '三', '四', '五', '六'][now.day()]
+ state.day = now.get('date')
+ state.hour = h
+ state.minute = m
+ state.second = s
+
+ state.meridiem = now.format('A')
+ }
+
+ function start() {
+ update()
+ clearInterval(timer)
+ timer = setInterval(() => update(), 1000)
+ }
+
+ function stop() {
+ clearInterval(timer)
+ }
+
+ tryOnMounted(() => {
+ immediate && start()
+ })
+
+ tryOnUnmounted(() => {
+ stop()
+ })
+
+ return {
+ ...toRefs(state),
+ start,
+ stop
+ }
+}
diff --git a/src/hooks/web/usePageLoading.ts b/src/hooks/web/usePageLoading.ts
new file mode 100644
index 0000000..995c941
--- /dev/null
+++ b/src/hooks/web/usePageLoading.ts
@@ -0,0 +1,20 @@
+import { useAppStoreWithOut } from '@/store/modules/app'
+
+export const usePageLoading = () => {
+ const loadStart = () => {
+ const appStore = useAppStoreWithOut()
+
+ appStore.setPageLoading(true)
+ }
+
+ const loadDone = () => {
+ const appStore = useAppStoreWithOut()
+
+ appStore.setPageLoading(false)
+ }
+
+ return {
+ loadStart,
+ loadDone
+ }
+}
diff --git a/src/hooks/web/useSearch.ts b/src/hooks/web/useSearch.ts
new file mode 100644
index 0000000..788c49f
--- /dev/null
+++ b/src/hooks/web/useSearch.ts
@@ -0,0 +1,91 @@
+import { ref, unref, nextTick } from 'vue'
+import { FormSchema, FormSetProps } from '@/components/Form'
+import { SearchExpose, SearchProps } from '@/components/Search'
+
+export const useSearch = () => {
+ // Search实例
+ const searchRef = ref()
+
+ /**
+ * @param ref Search实例
+ * @param elRef ElForm实例
+ */
+ const register = (ref: SearchExpose) => {
+ searchRef.value = ref
+ }
+
+ const getSearch = async () => {
+ await nextTick()
+ const search = unref(searchRef)
+ if (!search) {
+ console.error('The Search is not registered. Please use the register method to register')
+ }
+ return search
+ }
+
+ // 一些内置的方法
+ const methods = {
+ /**
+ * @description 设置search组件的props
+ * @param field FormItem的field
+ */
+ setProps: async (props: SearchProps = {}) => {
+ const search = await getSearch()
+ search?.setProps(props)
+ if (props.model) {
+ search?.setValues(props.model)
+ }
+ },
+
+ /**
+ * @description 设置form的值
+ * @param data 需要设置的数据
+ */
+ setValues: async (data: Recordable) => {
+ const search = await getSearch()
+ search?.setValues(data)
+ },
+
+ /**
+ * @description 设置schema
+ * @param schemaProps 需要设置的schemaProps
+ */
+ setSchema: async (schemaProps: FormSetProps[]) => {
+ const search = await getSearch()
+ search?.setSchema(schemaProps)
+ },
+
+ /**
+ * @description 新增schema
+ * @param formSchema 需要新增数据
+ * @param index 在哪里新增
+ */
+ addSchema: async (formSchema: FormSchema, index?: number) => {
+ const search = await getSearch()
+ search?.addSchema(formSchema, index)
+ },
+
+ /**
+ * @description 删除schema
+ * @param field 删除哪个数据
+ */
+ delSchema: async (field: string) => {
+ const search = await getSearch()
+ search?.delSchema(field)
+ },
+
+ /**
+ * @description 获取表单数据
+ * @returns form data
+ */
+ getFormData: async (): Promise => {
+ const search = await getSearch()
+ return search?.getFormData() as T
+ }
+ }
+
+ return {
+ searchRegister: register,
+ searchMethods: methods
+ }
+}
diff --git a/src/hooks/web/useStorage.ts b/src/hooks/web/useStorage.ts
new file mode 100644
index 0000000..e33a6a5
--- /dev/null
+++ b/src/hooks/web/useStorage.ts
@@ -0,0 +1,46 @@
+// 获取传入的值的类型
+const getValueType = (value: any) => {
+ const type = Object.prototype.toString.call(value)
+ return type.slice(8, -1)
+}
+
+export const useStorage = (type: 'sessionStorage' | 'localStorage' = 'sessionStorage') => {
+ const setStorage = (key: string, value: any) => {
+ const valueType = getValueType(value)
+ window[type].setItem(key, JSON.stringify({ type: valueType, value }))
+ }
+
+ const getStorage = (key: string) => {
+ const value = window[type].getItem(key)
+ if (value) {
+ const { value: val } = JSON.parse(value)
+ return val
+ } else {
+ return value
+ }
+ }
+
+ const removeStorage = (key: string) => {
+ window[type].removeItem(key)
+ }
+
+ const clear = (excludes?: string[]) => {
+ // 获取排除项
+ const keys = Object.keys(window[type])
+ const defaultExcludes = ['dynamicRouter', 'serverDynamicRouter']
+ const excludesArr = excludes ? [...excludes, ...defaultExcludes] : defaultExcludes
+ const excludesKeys = excludesArr ? keys.filter((key) => !excludesArr.includes(key)) : keys
+ // 排除项不清除
+ excludesKeys.forEach((key) => {
+ window[type].removeItem(key)
+ })
+ // window[type].clear()
+ }
+
+ return {
+ setStorage,
+ getStorage,
+ removeStorage,
+ clear
+ }
+}
diff --git a/src/hooks/web/useTable.ts b/src/hooks/web/useTable.ts
new file mode 100644
index 0000000..d831f1c
--- /dev/null
+++ b/src/hooks/web/useTable.ts
@@ -0,0 +1,195 @@
+import { useI18n } from '@/hooks/web/useI18n'
+import { Table, TableExpose, TableProps, TableSetProps, TableColumn } from '@/components/Table'
+import { ElTable, ElMessageBox, ElMessage } from 'element-plus'
+import { ref, watch, unref, nextTick, onMounted } from 'vue'
+
+const { t } = useI18n()
+
+interface UseTableConfig {
+ /**
+ * 是否初始化的时候请求一次
+ */
+ immediate?: boolean
+ fetchDataApi: () => Promise<{
+ list: any[]
+ total?: number
+ }>
+ fetchDelApi?: () => Promise
+}
+
+export const useTable = (config: UseTableConfig) => {
+ const { immediate = true } = config
+
+ const loading = ref(false)
+ const currentPage = ref(1)
+ const pageSize = ref(10)
+ const total = ref(0)
+ const dataList = ref([])
+ let isPageSizeChange = false
+
+ watch(
+ () => currentPage.value,
+ () => {
+ if (!isPageSizeChange) methods.getList()
+ isPageSizeChange = false
+ }
+ )
+
+ watch(
+ () => pageSize.value,
+ () => {
+ if (unref(currentPage) === 1) {
+ methods.getList()
+ } else {
+ currentPage.value = 1
+ isPageSizeChange = true
+ methods.getList()
+ }
+ }
+ )
+
+ onMounted(() => {
+ if (immediate) {
+ methods.getList()
+ }
+ })
+
+ // Table实例
+ const tableRef = ref()
+
+ // ElTable实例
+ const elTableRef = ref>()
+
+ const register = (ref: typeof Table & TableExpose, elRef: ComponentRef) => {
+ tableRef.value = ref
+ elTableRef.value = unref(elRef)
+ }
+
+ const getTable = async () => {
+ await nextTick()
+ const table = unref(tableRef)
+ if (!table) {
+ console.error('The table is not registered. Please use the register method to register')
+ }
+ return table
+ }
+
+ const methods = {
+ /**
+ * 获取表单数据
+ */
+ getList: async () => {
+ loading.value = true
+ try {
+ const res = await config?.fetchDataApi()
+ console.log('fetchDataApi res', res)
+ if (res) {
+ dataList.value = res.list
+ total.value = res.total || 0
+ }
+ } catch (err) {
+ console.log('fetchDataApi error')
+ } finally {
+ loading.value = false
+ }
+ },
+
+ /**
+ * @description 设置table组件的props
+ * @param props table组件的props
+ */
+ setProps: async (props: TableProps = {}) => {
+ const table = await getTable()
+ table?.setProps(props)
+ },
+
+ /**
+ * @description 设置column
+ * @param columnProps 需要设置的列
+ */
+ setColumn: async (columnProps: TableSetProps[]) => {
+ const table = await getTable()
+ table?.setColumn(columnProps)
+ },
+
+ /**
+ * @description 新增column
+ * @param tableColumn 需要新增数据
+ * @param index 在哪里新增
+ */
+ addColumn: async (tableColumn: TableColumn, index?: number) => {
+ const table = await getTable()
+ table?.addColumn(tableColumn, index)
+ },
+
+ /**
+ * @description 删除column
+ * @param field 删除哪个数据
+ */
+ delColumn: async (field: string) => {
+ const table = await getTable()
+ table?.delColumn(field)
+ },
+
+ /**
+ * @description 获取ElTable组件的实例
+ * @returns ElTable instance
+ */
+ getElTableExpose: async () => {
+ await getTable()
+ return unref(elTableRef)
+ },
+
+ refresh: () => {
+ methods.getList()
+ },
+
+ // sortableChange: (e: any) => {
+ // console.log('sortableChange', e)
+ // const { oldIndex, newIndex } = e
+ // dataList.value.splice(newIndex, 0, dataList.value.splice(oldIndex, 1)[0])
+ // // to do something
+ // }
+ // 删除数据
+ delList: async (idsLength: number) => {
+ const { fetchDelApi } = config
+ if (!fetchDelApi) {
+ console.warn('fetchDelApi is undefined')
+ return
+ }
+ ElMessageBox.confirm(t('common.delMessage'), t('common.delWarning'), {
+ confirmButtonText: t('common.delOk'),
+ cancelButtonText: t('common.delCancel'),
+ type: 'warning'
+ }).then(async () => {
+ const res = await fetchDelApi()
+ if (res) {
+ ElMessage.success(t('common.delSuccess'))
+
+ // 计算出临界点
+ const current =
+ unref(total) % unref(pageSize) === idsLength || unref(pageSize) === 1
+ ? unref(currentPage) > 1
+ ? unref(currentPage) - 1
+ : unref(currentPage)
+ : unref(currentPage)
+
+ currentPage.value = current
+ methods.getList()
+ }
+ })
+ }
+ }
+
+ return {
+ tableRegister: register,
+ tableMethods: methods,
+ tableState: {
+ currentPage,
+ pageSize,
+ total,
+ dataList,
+ loading
+ }
+ }
+}
diff --git a/src/hooks/web/useTagsView.ts b/src/hooks/web/useTagsView.ts
new file mode 100644
index 0000000..31eadb0
--- /dev/null
+++ b/src/hooks/web/useTagsView.ts
@@ -0,0 +1,63 @@
+import { useTagsViewStoreWithOut } from '@/store/modules/tagsView'
+import { RouteLocationNormalizedLoaded, useRouter } from 'vue-router'
+import { computed, nextTick, unref } from 'vue'
+
+export const useTagsView = () => {
+ const tagsViewStore = useTagsViewStoreWithOut()
+
+ const { replace, currentRoute } = useRouter()
+
+ const selectedTag = computed(() => tagsViewStore.getSelectedTag)
+
+ const closeAll = (callback?: Fn) => {
+ tagsViewStore.delAllViews()
+ callback?.()
+ }
+
+ const closeLeft = (callback?: Fn) => {
+ tagsViewStore.delLeftViews(unref(selectedTag) as RouteLocationNormalizedLoaded)
+ callback?.()
+ }
+
+ const closeRight = (callback?: Fn) => {
+ tagsViewStore.delRightViews(unref(selectedTag) as RouteLocationNormalizedLoaded)
+ callback?.()
+ }
+
+ const closeOther = (callback?: Fn) => {
+ tagsViewStore.delOthersViews(unref(selectedTag) as RouteLocationNormalizedLoaded)
+ callback?.()
+ }
+
+ const closeCurrent = (view?: RouteLocationNormalizedLoaded, callback?: Fn) => {
+ if (view?.meta?.affix) return
+ tagsViewStore.delView(view || unref(currentRoute))
+
+ callback?.()
+ }
+
+ const refreshPage = async (view?: RouteLocationNormalizedLoaded, callback?: Fn) => {
+ tagsViewStore.delCachedView()
+ const { path, query } = view || unref(currentRoute)
+ await nextTick()
+ replace({
+ path: '/redirect' + path,
+ query: query
+ })
+ callback?.()
+ }
+
+ const setTitle = (title: string, path?: string) => {
+ tagsViewStore.setTitle(title, path)
+ }
+
+ return {
+ closeAll,
+ closeLeft,
+ closeRight,
+ closeOther,
+ closeCurrent,
+ refreshPage,
+ setTitle
+ }
+}
diff --git a/src/hooks/web/useTimeAgo.ts b/src/hooks/web/useTimeAgo.ts
new file mode 100644
index 0000000..5675e5e
--- /dev/null
+++ b/src/hooks/web/useTimeAgo.ts
@@ -0,0 +1,50 @@
+import { useTimeAgo as useTimeAgoCore, UseTimeAgoMessages } from '@vueuse/core'
+import { computed, unref } from 'vue'
+import { useLocaleStoreWithOut } from '@/store/modules/locale'
+
+const TIME_AGO_MESSAGE_MAP: {
+ 'zh-CN': UseTimeAgoMessages
+ en: UseTimeAgoMessages
+} = {
+ 'zh-CN': {
+ justNow: '刚刚',
+ invalid: '无效时间',
+ past: (n) => (n.match(/\d/) ? `${n}前` : n),
+ future: (n) => (n.match(/\d/) ? `${n}后` : n),
+ month: (n, past) => (n === 1 ? (past ? '上个月' : '下个月') : `${n} 个月`),
+ year: (n, past) => (n === 1 ? (past ? '去年' : '明年') : `${n} 年`),
+ day: (n, past) => (n === 1 ? (past ? '昨天' : '明天') : `${n} 天`),
+ week: (n, past) => (n === 1 ? (past ? '上周' : '下周') : `${n} 周`),
+ hour: (n) => `${n} 小时`,
+ minute: (n) => `${n} 分钟`,
+ second: (n) => `${n} 秒`
+ },
+ en: {
+ justNow: '刚刚',
+ invalid: 'Invalid Date',
+ past: (n) => (n.match(/\d/) ? `${n} ago` : n),
+ future: (n) => (n.match(/\d/) ? `in ${n}` : n),
+ month: (n, past) =>
+ n === 1 ? (past ? 'last month' : 'next month') : `${n} month${n > 1 ? 's' : ''}`,
+ year: (n, past) =>
+ n === 1 ? (past ? 'last year' : 'next year') : `${n} year${n > 1 ? 's' : ''}`,
+ day: (n, past) => (n === 1 ? (past ? 'yesterday' : 'tomorrow') : `${n} day${n > 1 ? 's' : ''}`),
+ week: (n, past) =>
+ n === 1 ? (past ? 'last week' : 'next week') : `${n} week${n > 1 ? 's' : ''}`,
+ hour: (n) => `${n} hour${n > 1 ? 's' : ''}`,
+ minute: (n) => `${n} minute${n > 1 ? 's' : ''}`,
+ second: (n) => `${n} second${n > 1 ? 's' : ''}`
+ }
+}
+
+export const useTimeAgo = (time: Date | number | string) => {
+ const localeStore = useLocaleStoreWithOut()
+
+ const currentLocale = computed(() => localeStore.getCurrentLocale)
+
+ const timeAgo = useTimeAgoCore(time, {
+ messages: TIME_AGO_MESSAGE_MAP[unref(currentLocale).lang]
+ })
+
+ return timeAgo
+}
diff --git a/src/hooks/web/useTitle.ts b/src/hooks/web/useTitle.ts
new file mode 100644
index 0000000..546267d
--- /dev/null
+++ b/src/hooks/web/useTitle.ts
@@ -0,0 +1,25 @@
+import { watch, ref } from 'vue'
+import { isString } from '@/utils/is'
+import { useAppStoreWithOut } from '@/store/modules/app'
+import { useI18n } from '@/hooks/web/useI18n'
+
+export const useTitle = (newTitle?: string) => {
+ const { t } = useI18n()
+ const appStore = useAppStoreWithOut()
+
+ const title = ref(
+ newTitle ? `${appStore.getTitle} - ${t(newTitle as string)}` : appStore.getTitle
+ )
+
+ watch(
+ title,
+ (n, o) => {
+ if (isString(n) && n !== o && document) {
+ document.title = n
+ }
+ },
+ { immediate: true }
+ )
+
+ return title
+}
diff --git a/src/hooks/web/useValidator.ts b/src/hooks/web/useValidator.ts
new file mode 100644
index 0000000..00586bd
--- /dev/null
+++ b/src/hooks/web/useValidator.ts
@@ -0,0 +1,109 @@
+import { useI18n } from '@/hooks/web/useI18n'
+import { FormItemRule } from 'element-plus'
+
+const { t } = useI18n()
+
+interface LengthRange {
+ min: number
+ max: number
+ message?: string
+}
+
+export const useValidator = () => {
+ const required = (message?: string): FormItemRule => {
+ return {
+ required: true,
+ message: message || t('common.required')
+ }
+ }
+
+ const lengthRange = (options: LengthRange): FormItemRule => {
+ const { min, max, message } = options
+
+ return {
+ min,
+ max,
+ message: message || t('common.lengthRange', { min, max })
+ }
+ }
+
+ const notSpace = (message?: string): FormItemRule => {
+ return {
+ validator: (_, val, callback) => {
+ if (val?.indexOf(' ') !== -1) {
+ callback(new Error(message || t('common.notSpace')))
+ } else {
+ callback()
+ }
+ }
+ }
+ }
+
+ const notSpecialCharacters = (message?: string): FormItemRule => {
+ return {
+ validator: (_, val, callback) => {
+ if (/[`~!@#$%^&*()_+<>?:"{},.\/;'[\]]/gi.test(val)) {
+ callback(new Error(message || t('common.notSpecialCharacters')))
+ } else {
+ callback()
+ }
+ }
+ }
+ }
+
+ const phone = (message?: string): FormItemRule => {
+ return {
+ validator: (_, val, callback) => {
+ if (!val) return callback()
+ if (!/^1[3456789]\d{9}$/.test(val)) {
+ callback(new Error(message || '请输入正确的手机号码'))
+ } else {
+ callback()
+ }
+ }
+ }
+ }
+
+ const email = (message?: string): FormItemRule => {
+ return {
+ validator: (_, val, callback) => {
+ if (!val) return callback()
+ if (!/^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$/.test(val)) {
+ callback(new Error(message || '请输入正确的邮箱'))
+ } else {
+ callback()
+ }
+ }
+ }
+ }
+
+ const maxlength = (max: number): FormItemRule => {
+ return {
+ max,
+ message: '长度不能超过' + max + '个字符'
+ }
+ }
+
+ const check = (message?: string): FormItemRule => {
+ return {
+ validator: (_, val, callback) => {
+ if (!val) {
+ callback(new Error(message || t('common.required')))
+ } else {
+ callback()
+ }
+ }
+ }
+ }
+
+ return {
+ required,
+ lengthRange,
+ notSpace,
+ notSpecialCharacters,
+ phone,
+ email,
+ maxlength,
+ check
+ }
+}
diff --git a/src/hooks/web/useWatermark.ts b/src/hooks/web/useWatermark.ts
new file mode 100644
index 0000000..4a31359
--- /dev/null
+++ b/src/hooks/web/useWatermark.ts
@@ -0,0 +1,55 @@
+const domSymbol = Symbol('watermark-dom')
+
+export function useWatermark(appendEl: HTMLElement | null = document.body) {
+ let func: Fn = () => {}
+ const id = domSymbol.toString()
+ const clear = () => {
+ const domId = document.getElementById(id)
+ if (domId) {
+ const el = appendEl
+ el && el.removeChild(domId)
+ }
+ window.removeEventListener('resize', func)
+ }
+ const createWatermark = (str: string) => {
+ clear()
+
+ const can = document.createElement('canvas')
+ can.width = 300
+ can.height = 240
+
+ const cans = can.getContext('2d')
+ if (cans) {
+ cans.rotate((-20 * Math.PI) / 120)
+ cans.font = '15px Vedana'
+ cans.fillStyle = 'rgba(0, 0, 0, 0.15)'
+ cans.textAlign = 'left'
+ cans.textBaseline = 'middle'
+ cans.fillText(str, can.width / 20, can.height)
+ }
+
+ const div = document.createElement('div')
+ div.id = id
+ div.style.pointerEvents = 'none'
+ div.style.top = '0px'
+ div.style.left = '0px'
+ div.style.position = 'absolute'
+ div.style.zIndex = '100000000'
+ div.style.width = document.documentElement.clientWidth + 'px'
+ div.style.height = document.documentElement.clientHeight + 'px'
+ div.style.background = 'url(' + can.toDataURL('image/png') + ') left top repeat'
+ const el = appendEl
+ el && el.appendChild(div)
+ return id
+ }
+
+ function setWatermark(str: string) {
+ createWatermark(str)
+ func = () => {
+ createWatermark(str)
+ }
+ window.addEventListener('resize', func)
+ }
+
+ return { setWatermark, clear }
+}
diff --git a/src/layout/Layout.vue b/src/layout/Layout.vue
new file mode 100644
index 0000000..8f570c3
--- /dev/null
+++ b/src/layout/Layout.vue
@@ -0,0 +1,74 @@
+
+
+
diff --git a/src/layout/components/AppView.vue b/src/layout/components/AppView.vue
new file mode 100644
index 0000000..c491f1e
--- /dev/null
+++ b/src/layout/components/AppView.vue
@@ -0,0 +1,37 @@
+
+
+
+
+
+
diff --git a/src/layout/components/ToolHeader.vue b/src/layout/components/ToolHeader.vue
new file mode 100644
index 0000000..e6f953f
--- /dev/null
+++ b/src/layout/components/ToolHeader.vue
@@ -0,0 +1,82 @@
+
+
+
diff --git a/src/layout/components/useRenderLayout.tsx b/src/layout/components/useRenderLayout.tsx
new file mode 100644
index 0000000..9f4b3a7
--- /dev/null
+++ b/src/layout/components/useRenderLayout.tsx
@@ -0,0 +1,306 @@
+import { computed } from 'vue'
+import { useAppStore } from '@/store/modules/app'
+import { Menu } from '@/components/Menu'
+import { TabMenu } from '@/components/TabMenu'
+import { TagsView } from '@/components/TagsView'
+import { Logo } from '@/components/Logo'
+import AppView from './AppView.vue'
+import ToolHeader from './ToolHeader.vue'
+import { ElScrollbar } from 'element-plus'
+import { useDesign } from '@/hooks/web/useDesign'
+
+const { getPrefixCls } = useDesign()
+
+const prefixCls = getPrefixCls('layout')
+
+const appStore = useAppStore()
+
+const pageLoading = computed(() => appStore.getPageLoading)
+
+// 标签页
+const tagsView = computed(() => appStore.getTagsView)
+
+// 菜单折叠
+const collapse = computed(() => appStore.getCollapse)
+
+// logo
+const logo = computed(() => appStore.logo)
+
+// 固定头部
+const fixedHeader = computed(() => appStore.getFixedHeader)
+
+// 是否是移动端
+const mobile = computed(() => appStore.getMobile)
+
+// 固定菜单
+const fixedMenu = computed(() => appStore.getFixedMenu)
+
+export const useRenderLayout = () => {
+ const renderClassic = () => {
+ return (
+ <>
+
+ {logo.value ? (
+
+ ) : undefined}
+
+
+
+
+
+
+
+ {tagsView.value ? (
+
+ ) : undefined}
+
+
+
+
+
+ >
+ )
+ }
+
+ const renderTopLeft = () => {
+ return (
+ <>
+
+
+
+
+
+ {tagsView.value ? (
+
+ ) : undefined}
+
+
+
+
+
+ >
+ )
+ }
+
+ const renderTop = () => {
+ return (
+ <>
+
+ {logo.value ? : undefined}
+
+
+
+
+
+ {tagsView.value ? (
+
+ ) : undefined}
+
+
+
+
+ >
+ )
+ }
+
+ const renderCutMenu = () => {
+ return (
+ <>
+
+
+
+
+
+ {tagsView.value ? (
+
+ ) : undefined}
+
+
+
+
+
+ >
+ )
+ }
+
+ return {
+ renderClassic,
+ renderTopLeft,
+ renderTop,
+ renderCutMenu
+ }
+}
diff --git a/src/locales/en.ts b/src/locales/en.ts
new file mode 100644
index 0000000..04e4e42
--- /dev/null
+++ b/src/locales/en.ts
@@ -0,0 +1,584 @@
+export default {
+ common: {
+ inputText: 'Please input',
+ selectText: 'Please select',
+ startTimeText: 'Start time',
+ endTimeText: 'End time',
+ login: 'Login',
+ required: 'This is required',
+ loginOut: 'Login out',
+ document: 'Document',
+ reminder: 'Reminder',
+ loginOutMessage: 'Exit the system?',
+ back: 'Back',
+ ok: 'OK',
+ cancel: 'Cancel',
+ reload: 'Reload current',
+ closeTab: 'Close current',
+ closeTheLeftTab: 'Close left',
+ closeTheRightTab: 'Close right',
+ closeOther: 'Close other',
+ closeAll: 'Close all',
+ prevLabel: 'Prev',
+ nextLabel: 'Next',
+ skipLabel: 'Jump',
+ doneLabel: 'End',
+ menu: 'Menu',
+ menuDes: 'Menu bar rendered in routed structure',
+ collapse: 'Collapse',
+ collapseDes: 'Expand and zoom the menu bar',
+ tagsView: 'Tags view',
+ tagsViewDes: 'Used to record routing history',
+ tool: 'Tool',
+ toolDes: 'Used to set up custom systems',
+ query: 'Query',
+ reset: 'Reset',
+ shrink: 'Put away',
+ expand: 'Expand',
+ delMessage: 'Delete the selected data?',
+ delWarning: 'Warning',
+ delOk: 'OK',
+ delCancel: 'Cancel',
+ delNoData: 'Please select the data to delete',
+ delSuccess: 'Deleted successfully',
+ refresh: 'Refresh',
+ fullscreen: 'Fullscreen',
+ size: 'Size',
+ columnSetting: 'Column setting',
+ lengthRange: 'The length should be between {min} and {max}',
+ notSpace: 'Spaces are not allowed',
+ notSpecialCharacters: 'Special characters are not allowed',
+ isEqual: 'The two are not equal',
+ // 列设置
+ setting: 'Setting'
+ },
+ lock: {
+ lockScreen: 'Lock screen',
+ lock: 'Lock',
+ lockPassword: 'Lock screen password',
+ unlock: 'Click to unlock',
+ backToLogin: 'Back to login',
+ entrySystem: 'Entry the system',
+ placeholder: 'Please enter the lock screen password',
+ message: 'Lock screen password error'
+ },
+ error: {
+ noPermission: `Sorry, you don't have permission to access this page.`,
+ pageError: 'Sorry, the page you visited does not exist.',
+ networkError: 'Sorry, the server reported an error.',
+ returnToHome: 'Return to home'
+ },
+ setting: {
+ projectSetting: 'Project setting',
+ theme: 'Theme',
+ layout: 'Layout',
+ systemTheme: 'System theme',
+ menuTheme: 'Menu theme',
+ interfaceDisplay: 'Interface display',
+ breadcrumb: 'Breadcrumb',
+ breadcrumbIcon: 'Breadcrumb icon',
+ collapseMenu: 'Collapse menu',
+ hamburgerIcon: 'Hamburger icon',
+ screenfullIcon: 'Screenfull icon',
+ sizeIcon: 'Size icon',
+ localeIcon: 'Locale icon',
+ tagsView: 'Tags view',
+ logo: 'Logo',
+ greyMode: 'Grey mode',
+ fixedHeader: 'Fixed header',
+ headerTheme: 'Header theme',
+ cutMenu: 'Cut Menu',
+ copy: 'Copy',
+ clearAndReset: 'Clear cache and reset',
+ copySuccess: 'Copy success',
+ copyFailed: 'Copy failed',
+ footer: 'Footer',
+ uniqueOpened: 'Unique opened',
+ tagsViewIcon: 'Tags view icon',
+ // 开启动态路由
+ dynamicRouter: 'Enable dynamic router',
+ serverDynamicRouter: 'Server dynamic router',
+ reExperienced: 'Please exit the login experience again',
+ fixedMenu: 'Fixed menu'
+ },
+ size: {
+ default: 'Default',
+ large: 'Large',
+ small: 'Small'
+ },
+ login: {
+ welcome: 'Welcome to the system',
+ message: 'Backstage management system',
+ username: 'Username',
+ password: 'Password',
+ register: 'Register',
+ checkPassword: 'Confirm password',
+ login: 'Sign in',
+ otherLogin: 'Sign in with',
+ remember: 'Remember me',
+ hasUser: 'Existing account? Go to login',
+ forgetPassword: 'Forget password',
+ usernamePlaceholder: 'Please input username',
+ passwordPlaceholder: 'Please input password',
+ code: 'Verification code',
+ codePlaceholder: 'Please input verification code',
+ getCode: 'Get code'
+ },
+ router: {
+ login: 'Login',
+ level: 'Multi level menu',
+ menu: 'Menu',
+ menu1: 'Menu1',
+ menu11: 'Menu1-1',
+ menu111: 'Menu1-1-1',
+ menu12: 'Menu1-2',
+ menu2: 'Menu2',
+ dashboard: 'Dashboard',
+ analysis: 'Analysis',
+ workplace: 'Workplace',
+ guide: 'Guide',
+ component: 'Component',
+ icon: 'Icon',
+ echart: 'Echart',
+ countTo: 'Count to',
+ watermark: 'Watermark',
+ qrcode: 'Qrcode',
+ highlight: 'Highlight',
+ infotip: 'Infotip',
+ form: 'Form',
+ defaultForm: 'All examples',
+ search: 'Search',
+ table: 'Table',
+ defaultTable: 'Basic example',
+ editor: 'Editor',
+ richText: 'Rich text',
+ jsonEditor: 'JSON Editor',
+ codeEditor: 'Code Editor',
+ dialog: 'Dialog',
+ imageViewer: 'Image viewer',
+ descriptions: 'Descriptions',
+ example: 'Example',
+ exampleDialog: 'Example dialog',
+ examplePage: 'Example page',
+ exampleAdd: 'Example page - add',
+ exampleEdit: 'Example page - edit',
+ exampleDetail: 'Example page - detail',
+ errorPage: 'Error page',
+ authorization: 'Authorization',
+ user: 'User management',
+ role: 'Role management',
+ document: 'Document',
+ inputPassword: 'InputPassword',
+ sticky: 'Sticky',
+ treeTable: 'Tree table',
+ PicturePreview: 'Table Image Preview',
+ department: 'Department management',
+ menuManagement: 'Menu management',
+ // 权限测试页面
+ permission: 'Permission test page',
+ function: 'Function',
+ multipleTabs: 'Multiple tabs',
+ details: 'Details',
+ iconPicker: 'Icon picker',
+ request: 'Request',
+ waterfall: 'Waterfall',
+ imageCropping: 'Image cropping',
+ videoPlayer: 'Video player',
+ // 表格视频预览
+ tableVideoPreview: 'Table video preview',
+ cardTable: 'Card table',
+ personalCenter: 'Personal center',
+ personal: 'Personal',
+ avatars: 'Avatars',
+ iAgree: 'I agree',
+ tree: 'Tree'
+ },
+ permission: {
+ hasPermission: 'Please set the operation permission value'
+ },
+ analysis: {
+ newUser: 'New user',
+ unreadInformation: 'Unread information',
+ transactionAmount: 'Transaction amount',
+ totalShopping: 'Total Shopping',
+ monthlySales: 'Monthly sales',
+ userAccessSource: 'User access source',
+ january: 'January',
+ february: 'February',
+ march: 'March',
+ april: 'April',
+ may: 'May',
+ june: 'June',
+ july: 'July',
+ august: 'August',
+ september: 'September',
+ october: 'October',
+ november: 'November',
+ december: 'December',
+ estimate: 'Estimate',
+ actual: 'Actual',
+ directAccess: 'Airect access',
+ mailMarketing: 'Mail marketing',
+ allianceAdvertising: 'Alliance advertising',
+ videoAdvertising: 'Video advertising',
+ searchEngines: 'Search engines',
+ weeklyUserActivity: 'Weekly user activity',
+ activeQuantity: 'Active quantity',
+ monday: 'Monday',
+ tuesday: 'Tuesday',
+ wednesday: 'Wednesday',
+ thursday: 'Thursday',
+ friday: 'Friday',
+ saturday: 'Saturday',
+ sunday: 'Sunday'
+ },
+ workplace: {
+ goodMorning: 'Good morning',
+ happyDay: 'Wish you happy every day!',
+ toady: `It's sunny today`,
+ project: 'Project',
+ access: 'Project access',
+ toDo: 'To do',
+ introduction: 'A serious introduction',
+ more: 'More',
+ shortcutOperation: 'Shortcut operation',
+ operation: 'Operation',
+ index: 'Index',
+ personal: 'Personal',
+ team: 'Team',
+ quote: 'Quote',
+ contribution: 'Contribution',
+ hot: 'Hot',
+ yield: 'Yield',
+ dynamic: 'Dynamic',
+ push: 'push',
+ pushCode: 'Archer push code to Github',
+ follow: 'Follow'
+ },
+ formDemo: {
+ input: 'Input',
+ inputNumber: 'InputNumber',
+ default: 'Default',
+ icon: 'Icon',
+ mixed: 'Mixed',
+ password: 'Password',
+ textarea: 'Textarea',
+ remoteSearch: 'Remote search',
+ slot: 'Slot',
+ position: 'Position',
+ autocomplete: 'Autocomplete',
+ select: 'Select',
+ optionSlot: 'Option Slot',
+ selectGroup: 'Select Group',
+ selectV2: 'SelectV2',
+ cascader: 'Cascader',
+ switch: 'Switch',
+ rate: 'Rate',
+ colorPicker: 'Color Picker',
+ transfer: 'Transfer',
+ render: 'Render',
+ radio: 'Radio',
+ radioGroup: 'Radio Group',
+ button: 'Button',
+ checkbox: 'Checkbox',
+ checkboxButton: 'Checkbox Button',
+ checkboxGroup: 'Checkbox Group',
+ slider: 'Slider',
+ datePicker: 'Date Picker',
+ shortcuts: 'Shortcuts',
+ today: 'Today',
+ yesterday: 'Yesterday',
+ aWeekAgo: 'A week ago',
+ week: 'Week',
+ year: 'Year',
+ month: 'Month',
+ dates: 'Dates',
+ daterange: 'Date Range',
+ monthrange: 'Month Range',
+ dateTimePicker: 'DateTimePicker',
+ dateTimerange: 'Datetime Range',
+ timePicker: 'Time Picker',
+ timeSelect: 'Time Select',
+ inputPassword: 'input Password',
+ passwordStrength: 'Password Strength',
+ defaultForm: 'All examples',
+ formDes:
+ 'The secondary encapsulation of form components based on ElementPlus realizes data-driven and supports all Form parameters',
+ example: 'example',
+ operate: 'operate',
+ change: 'Change',
+ restore: 'Restore',
+ disabled: 'Disabled',
+ disablement: 'Disablement',
+ delete: 'Delete',
+ add: 'Add',
+ setValue: 'Set value',
+ resetValue: 'Reset value',
+ set: 'Set',
+ subitem: 'Subitem',
+ formValidation: 'Form validation',
+ verifyReset: 'Verify reset',
+ // 富文本编辑器
+ richText: 'Rich text',
+ jsonEditor: 'JSON Editor',
+ form: 'Form',
+ // 远程加载
+ remoteLoading: 'Remote loading',
+ // 聚焦
+ focus: 'Focus',
+ treeSelect: 'Tree Select',
+ showCheckbox: 'Show Checkbox',
+ selectAnyLevel: 'Select Any Level',
+ multiple: 'Multiple',
+ filterable: 'Filterable',
+ // 自定义节点内容
+ customContent: 'Custom content',
+ // 懒加载
+ lazyLoad: 'Lazy load',
+ upload: 'Upload',
+ // 用户头像
+ userAvatar: 'User avatar',
+ iconPicker: 'Icon picker',
+ iAgree: 'I agree'
+ },
+ guideDemo: {
+ guide: 'Guide',
+ start: 'Start',
+ message:
+ 'The guide page is very useful for some people who enter the project for the first time. You can briefly introduce the functions of the project. The boot page is based on driver.js'
+ },
+ iconDemo: {
+ icon: 'Icon',
+ localIcon: 'Local Icon',
+ iconify: 'Iconify component',
+ recommendedUse: 'Recommended use',
+ recommendeDes:
+ 'Iconify component basically contains all icons. You can query any icon you want. And packaging will only package the icons used.',
+ accessAddress: 'Access address'
+ },
+ echartDemo: {
+ echart: 'Echart',
+ echartDes:
+ 'Based on the secondary packaging components of eckarts, the width is adaptive. The corresponding chart can be displayed by passing in the options and height attributes.'
+ },
+ countToDemo: {
+ countTo: 'CountTo',
+ countToDes:
+ 'The transformation is based on vue-count-to and supports all vue-count-to parameters.',
+ suffix: 'Suffix',
+ prefix: 'Prefix',
+ separator: 'Separator',
+ duration: 'Duration',
+ endVal: 'End val',
+ startVal: 'Start val',
+ start: 'Start',
+ pause: 'Pause',
+ resume: 'Resume'
+ },
+ watermarkDemo: {
+ watermark: 'Watermark',
+ createdWatermark: 'Created watermark',
+ clearWatermark: 'Clear watermark',
+ resetWatermark: 'Reset watermark'
+ },
+ qrcodeDemo: {
+ qrcode: 'Qrcode',
+ qrcodeDes: 'Secondary packaging based on qrcode',
+ basicUsage: 'Basic usage',
+ imgTag: 'Img tag',
+ style: 'Style config',
+ click: 'Click event',
+ asynchronousContent: 'Asynchronous content',
+ invalid: 'Invalid',
+ logoConfig: 'Logo config',
+ logoStyle: 'Logo style',
+ size: 'size config'
+ },
+ treeDemo: {
+ treeTitle: 'Tree control (right-click node to customize menu options)',
+ message:
+ 'The tree component is based on the secondary packaging of the tree component of ElementPlus'
+ },
+ highlightDemo: {
+ highlight: 'Highlight',
+ message: 'The best time to plant a tree is ten years ago, followed by now.',
+ keys1: 'ten years ago',
+ keys2: 'now'
+ },
+ infotipDemo: {
+ infotip: 'Infotip',
+ infotipDes: 'Secondary packaging of components based on Highlight',
+ title: 'matters needing attention'
+ },
+ levelDemo: {
+ menu: 'Multi level menu cache'
+ },
+ searchDemo: {
+ search: 'Search',
+ searchDes:
+ 'Based on the secondary encapsulation of form components, the functions of query and reset are realized',
+ operate: 'operate',
+ change: 'Change',
+ grid: 'grid',
+ button: 'Button',
+ restore: 'Restore',
+ inline: 'inline',
+ bottom: 'Bottom',
+ position: 'position',
+ left: 'left',
+ center: 'center',
+ right: 'right',
+ dynamicOptions: 'Dynamic options',
+ // 删除单选框
+ deleteRadio: 'Delete radio',
+ // 还原单选框
+ restoreRadio: 'Restore radio',
+ loading: 'Loading',
+ reset: 'Reset'
+ },
+ stickyDemo: {
+ sticky: 'Sticky'
+ },
+ tableDemo: {
+ table: 'Table',
+ tableDes: 'Secondary packaging of Table components based on ElementPlus',
+ index: 'Index',
+ title: 'Title',
+ author: 'Author',
+ displayTime: 'Display time',
+ importance: 'Importance',
+ pageviews: 'Pageviews',
+ action: 'Action',
+ important: 'Important',
+ good: 'Good',
+ commonly: 'Commonly',
+ operate: 'operate',
+ example: 'example',
+ show: 'Show',
+ hidden: 'Hidden',
+ pagination: 'pagination',
+ reserveIndex: 'Reserve index',
+ restoreIndex: 'Restore index',
+ showSelections: 'Show selections',
+ hiddenSelections: 'Restore selections',
+ showExpandedRows: 'Show expanded rows',
+ hiddenExpandedRows: 'Hidden expanded rows',
+ changeTitle: 'Change title',
+ header: 'Header',
+ selectAllNone: 'Select all / none',
+ delOrAddAction: 'Delete or add action',
+ showOrHiddenStripe: 'Show or hidden stripe',
+ showOrHiddenBorder: 'Show or hidden border',
+ fixedHeaderOrAuto: 'Fixed header or auto',
+ getSelections: 'Get selections',
+ preview: 'Preview',
+ showOrHiddenSortable: 'Show or hidden sortable',
+ videoPreview: 'Video preview',
+ cardTable: 'Card table'
+ },
+ richText: {
+ richText: 'Rich text',
+ richTextDes: 'Secondary packaging based on wangeditor',
+ jsonEditor: 'JSON Editor',
+ jsonEditorDes: 'Secondary packaging based on vue-json-pretty',
+ codeEditor: 'Code Editor',
+ codeEditorDes: 'Secondary packaging based on monaco-editor'
+ },
+ dialogDemo: {
+ dialog: 'Dialog',
+ resizeDialog: 'Resize dialog',
+ dialogDes: 'Secondary packaging of Dialog components based on ElementPlus',
+ open: 'Open',
+ close: 'Close',
+ combineWithForm: 'Combine with form',
+ submit: 'Submit'
+ },
+ imageViewerDemo: {
+ open: 'Open',
+ imageViewer: 'Image viewer',
+ imageViewerDes: 'Secondary packaging of ImageViewer components based on ElementPlus'
+ },
+ descriptionsDemo: {
+ descriptions: 'Descriptions',
+ descriptionsDes: 'Secondary packaging of Descriptions components based on ElementPlus',
+ username: 'Username',
+ nickName: 'NickName',
+ phone: 'Phone',
+ email: 'Email',
+ addr: 'Address',
+ form: 'Combined with Form component'
+ },
+ exampleDemo: {
+ title: 'Title',
+ add: 'Add',
+ del: 'Delete',
+ edit: 'Edit',
+ author: 'Author',
+ displayTime: 'Display time',
+ importance: 'Importance',
+ pageviews: 'Pageviews',
+ important: 'Important',
+ content: 'Content',
+ save: 'Save',
+ detail: 'Detail'
+ },
+ userDemo: {
+ title: 'User management',
+ message:
+ 'Because it is simulated data, only two accounts with different permissions are provided, which can be modified and combined by developers according to the actual situation.',
+ index: 'Index',
+ action: 'Action',
+ username: 'Username',
+ password: 'Password',
+ role: 'Role',
+ remark: 'Remark',
+ remarkMessage1: 'Back end control routing permission',
+ remarkMessage2: 'Front end control routing permission',
+ // 部门列表
+ departmentList: 'Department list',
+ // 搜索部门
+ searchDepartment: 'Search department',
+ account: 'Account',
+ email: 'Email',
+ createTime: 'Create time',
+ // 所属部门
+ department: 'Department',
+ departmentName: 'Department name',
+ status: 'Status',
+ enable: 'Enable',
+ disable: 'Disable',
+ superiorDepartment: 'Superior department'
+ },
+ menu: {
+ menuName: 'Menu name',
+ icon: 'Icon',
+ // 权限
+ permission: 'Permission',
+ component: 'Component',
+ path: 'Path',
+ status: 'Status',
+ hidden: 'Hidden',
+ alwaysShow: 'Always show',
+ noCache: 'No cache',
+ breadcrumb: 'Breadcrumb',
+ affix: 'Affix',
+ noTagsView: 'No tags view',
+ activeMenu: 'Active menu',
+ canTo: 'Can to',
+ name: 'Name'
+ },
+ role: {
+ roleName: 'Role name',
+ role: 'Role',
+ // 菜单分配
+ menu: 'Menu allocation'
+ },
+ inputPasswordDemo: {
+ title: 'InputPassword',
+ inputPasswordDes: 'Secondary packaging of Input components based on ElementPlus'
+ },
+ avatarsDemo: {
+ title:
+ 'Avatar component for avatar list, secondary packaging based on element plus Avatar component'
+ }
+}
diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts
new file mode 100644
index 0000000..fe74dfb
--- /dev/null
+++ b/src/locales/zh-CN.ts
@@ -0,0 +1,572 @@
+export default {
+ common: {
+ inputText: '请输入',
+ selectText: '请选择',
+ startTimeText: '开始时间',
+ endTimeText: '结束时间',
+ login: '登录',
+ required: '该项为必填项',
+ loginOut: '退出系统',
+ document: '项目文档',
+ reminder: '温馨提示',
+ loginOutMessage: '是否退出本系统?',
+ back: '返回',
+ ok: '确定',
+ cancel: '取消',
+ reload: '重新加载',
+ closeTab: '关闭标签页',
+ closeTheLeftTab: '关闭左侧标签页',
+ closeTheRightTab: '关闭右侧标签页',
+ closeOther: '关闭其它标签页',
+ closeAll: '关闭全部标签页',
+ prevLabel: '上一步',
+ nextLabel: '下一步',
+ skipLabel: '跳过',
+ doneLabel: '结束',
+ menu: '菜单',
+ menuDes: '以路由的结构渲染的菜单栏',
+ collapse: '展开缩收',
+ collapseDes: '展开和缩放菜单栏',
+ tagsView: '标签页',
+ tagsViewDes: '用于记录路由历史记录',
+ tool: '工具',
+ toolDes: '用于设置定制系统',
+ query: '查询',
+ reset: '重置',
+ shrink: '收起',
+ expand: '展开',
+ delMessage: '是否删除所选中数据?',
+ delWarning: '提示',
+ delOk: '确定',
+ delCancel: '取消',
+ delNoData: '请选择需要删除的数据',
+ delSuccess: '删除成功',
+ refresh: '刷新',
+ fullscreen: '全屏',
+ size: '尺寸',
+ columnSetting: '列设置',
+ lengthRange: '长度在 {min} 到 {max} 个字符',
+ notSpace: '不能包含空格',
+ notSpecialCharacters: '不能包含特殊字符',
+ isEqual: '两次输入不一致',
+ setting: '设置'
+ },
+ lock: {
+ lockScreen: '锁定屏幕',
+ lock: '锁定',
+ lockPassword: '锁屏密码',
+ unlock: '点击解锁',
+ backToLogin: '返回登录',
+ entrySystem: '进入系统',
+ placeholder: '请输入锁屏密码',
+ message: '锁屏密码错误'
+ },
+ error: {
+ noPermission: `抱歉,您无权访问此页面。`,
+ pageError: '抱歉,您访问的页面不存在。',
+ networkError: '抱歉,服务器报告错误。',
+ returnToHome: '返回首页'
+ },
+ setting: {
+ projectSetting: '项目配置',
+ theme: '主题',
+ layout: '布局',
+ systemTheme: '系统主题',
+ menuTheme: '菜单主题',
+ interfaceDisplay: '界面显示',
+ breadcrumb: '面包屑',
+ breadcrumbIcon: '面包屑图标',
+ collapseMenu: '折叠菜单',
+ hamburgerIcon: '折叠图标',
+ screenfullIcon: '全屏图标',
+ sizeIcon: '尺寸图标',
+ localeIcon: '多语言图标',
+ tagsView: '标签页',
+ logo: 'Logo',
+ greyMode: '灰色模式',
+ fixedHeader: '固定头部',
+ headerTheme: '头部主题',
+ cutMenu: '切割菜单',
+ copy: '拷贝',
+ clearAndReset: '清除缓存并且重置',
+ copySuccess: '拷贝成功',
+ copyFailed: '拷贝失败',
+ footer: '页脚',
+ uniqueOpened: '菜单手风琴',
+ tagsViewIcon: '标签页图标',
+ dynamicRouter: '开启动态路由',
+ serverDynamicRouter: '服务端动态路由',
+ reExperienced: '请重新退出登录体验',
+ fixedMenu: '固定菜单'
+ },
+ size: {
+ default: '默认',
+ large: '大',
+ small: '小'
+ },
+ login: {
+ welcome: '欢迎使用本系统',
+ message: '开箱即用的中后台管理系统',
+ username: '用户名',
+ password: '密码',
+ register: '注册',
+ checkPassword: '确认密码',
+ login: '登录',
+ otherLogin: '其它登录方式',
+ remember: '记住我',
+ hasUser: '已有账号?去登录',
+ forgetPassword: '忘记密码',
+ usernamePlaceholder: '请输入用户名',
+ passwordPlaceholder: '请输入密码',
+ code: '验证码',
+ codePlaceholder: '请输入验证码',
+ getCode: '获取验证码'
+ },
+ router: {
+ login: '登录',
+ level: '多级菜单',
+ menu: '菜单',
+ menu1: '菜单1',
+ menu11: '菜单1-1',
+ menu111: '菜单1-1-1',
+ menu12: '菜单1-2',
+ menu2: '菜单2',
+ dashboard: '首页',
+ analysis: '分析页',
+ workplace: '工作台',
+ guide: '引导',
+ component: '组件',
+ icon: '图标',
+ echart: '图表',
+ countTo: '数字动画',
+ watermark: '水印',
+ qrcode: '二维码',
+ highlight: '高亮',
+ infotip: '信息提示',
+ form: '表单',
+ defaultForm: '全部示例',
+ search: '查询',
+ table: '表格',
+ defaultTable: '基础示例',
+ editor: '编辑器',
+ richText: '富文本',
+ jsonEditor: 'JSON编辑器',
+ codeEditor: '代码编辑器',
+ dialog: '弹窗',
+ imageViewer: '图片预览',
+ descriptions: '描述',
+ example: '综合示例',
+ exampleDialog: '综合示例 - 弹窗',
+ examplePage: '综合示例 - 页面',
+ exampleAdd: '综合示例 - 新增',
+ exampleEdit: '综合示例 - 编辑',
+ exampleDetail: '综合示例 - 详情',
+ errorPage: '错误页面',
+ authorization: '权限管理',
+ user: '用户管理',
+ role: '角色管理',
+ document: '文档',
+ inputPassword: '密码输入框',
+ sticky: '黏性',
+ treeTable: '树形表格',
+ PicturePreview: '表格图片预览',
+ department: '部门管理',
+ menuManagement: '菜单管理',
+ permission: '权限测试页',
+ function: '功能',
+ multipleTabs: '多开标签页',
+ details: '详情页',
+ iconPicker: '图标选择器',
+ request: '请求',
+ waterfall: '瀑布流',
+ imageCropping: '图片裁剪',
+ videoPlayer: '视频播放器',
+ tableVideoPreview: '表格视频预览',
+ cardTable: '卡片表格',
+ personalCenter: '个人中心',
+ personal: '个人',
+ avatars: '头像列表',
+ iAgree: '我同意',
+ tree: 'Tree 树形控件'
+ },
+ permission: {
+ hasPermission: '请设置操作权限值'
+ },
+ analysis: {
+ newUser: '新增用户',
+ unreadInformation: '未读消息',
+ transactionAmount: '成交金额',
+ totalShopping: '购物总量',
+ monthlySales: '每月销售额',
+ userAccessSource: '用户访问来源',
+ january: '一月',
+ february: '二月',
+ march: '三月',
+ april: '四月',
+ may: '五月',
+ june: '六月',
+ july: '七月',
+ august: '八月',
+ september: '九月',
+ october: '十月',
+ november: '十一月',
+ december: '十二月',
+ estimate: '预计',
+ actual: '实际',
+ directAccess: '直接访问',
+ mailMarketing: '邮件营销',
+ allianceAdvertising: '联盟广告',
+ videoAdvertising: '视频广告',
+ searchEngines: '搜索引擎',
+ weeklyUserActivity: '每周用户活跃量',
+ activeQuantity: '活跃量',
+ monday: '周一',
+ tuesday: '周二',
+ wednesday: '周三',
+ thursday: '周四',
+ friday: '周五',
+ saturday: '周六',
+ sunday: '周日'
+ },
+ workplace: {
+ goodMorning: '早安',
+ happyDay: '祝你开心每一天!',
+ toady: '今日晴',
+ project: '项目数',
+ access: '项目访问',
+ toDo: '待办',
+ introduction: '一个正经的简介',
+ more: '更多',
+ shortcutOperation: '快捷操作',
+ operation: '操作',
+ index: '指数',
+ personal: '个人',
+ team: '团队',
+ quote: '引用',
+ contribution: '贡献',
+ hot: '热度',
+ yield: '产量',
+ dynamic: '动态',
+ push: '推送',
+ pushCode: 'Archer 推送 代码到 Github',
+ follow: '关注'
+ },
+ formDemo: {
+ input: '输入框',
+ inputNumber: '数字输入框',
+ default: '默认',
+ icon: '图标',
+ mixed: '复合型',
+ password: '密码框',
+ textarea: '多行文本',
+ remoteSearch: '远程搜索',
+ slot: '插槽',
+ position: '位置',
+ autocomplete: '自动补全',
+ select: '选择器',
+ optionSlot: '选项插槽',
+ selectGroup: '选项分组',
+ selectV2: '虚拟列表选择器',
+ cascader: '级联选择器',
+ switch: '开关',
+ rate: '评分',
+ colorPicker: '颜色选择器',
+ transfer: '穿梭框',
+ render: '渲染器',
+ radio: '单选框',
+ radioGroup: '单选框组',
+ button: '按钮',
+ checkbox: '多选框',
+ checkboxButton: '多选框按钮',
+ checkboxGroup: '多选框组',
+ slider: '滑块',
+ datePicker: '日期选择器',
+ shortcuts: '快捷选项',
+ today: '今天',
+ yesterday: '昨天',
+ aWeekAgo: '一周前',
+ week: '周',
+ year: '年',
+ month: '月',
+ dates: '日期',
+ daterange: '日期范围',
+ monthrange: '月份范围',
+ dateTimePicker: '日期时间选择器',
+ dateTimerange: '日期时间范围',
+ timePicker: '时间选择器',
+ timeSelect: '时间选择',
+ inputPassword: '密码输入框',
+ passwordStrength: '密码强度',
+ defaultForm: '全部示例',
+ formDes: '基于 ElementPlus 的 Form 组件二次封装,实现数据驱动,支持所有 Form 参数',
+ example: '示例',
+ operate: '操作',
+ change: '更改',
+ restore: '还原',
+ disabled: '禁用',
+ disablement: '解除禁用',
+ delete: '删除',
+ add: '添加',
+ setValue: '设置值',
+ resetValue: '重置值',
+ set: '设置',
+ subitem: '子项',
+ formValidation: '表单验证',
+ verifyReset: '验证重置',
+ // 富文本编辑器
+ richText: '富文本编辑器',
+ // JSON编辑器
+ jsonEditor: 'JSON编辑器',
+ form: '表单',
+ // 远程加载
+ remoteLoading: '远程加载',
+ // 聚焦
+ focus: '聚焦',
+ treeSelect: '树形选择器',
+ showCheckbox: '显示复选框',
+ selectAnyLevel: '选择任意级别',
+ multiple: '多选',
+ filterable: '可筛选',
+ customContent: '自定义内容',
+ lazyLoad: '懒加载',
+ upload: '上传',
+ userAvatar: '用户头像',
+ iconPicker: '图标选择器',
+ iAgree: '我同意'
+ },
+ guideDemo: {
+ guide: '引导页',
+ start: '开始',
+ message:
+ '引导页对于一些第一次进入项目的人很有用,你可以简单介绍下项目的功能。引导页基于 driver.js'
+ },
+ iconDemo: {
+ icon: '图标',
+ localIcon: '本地图标',
+ iconify: 'Iconify组件',
+ recommendedUse: '推荐使用',
+ recommendeDes:
+ 'Iconify组件基本包含所有的图标,你可以查询到你想要的任何图标。并且打包只会打包所用到的图标。',
+ accessAddress: '访问地址'
+ },
+ echartDemo: {
+ echart: '图表',
+ echartDes:
+ '基于 echarts 二次封装组件,自适应宽度,只需传入 options 与 height 属性即可展示对应的图表。'
+ },
+ countToDemo: {
+ countTo: '数字动画',
+ countToDes: '基于 vue-count-to 进行改造,支持所有 vue-count-to 参数。',
+ suffix: '后缀',
+ prefix: '前缀',
+ separator: '分割符号',
+ duration: '持续时间',
+ endVal: '结束值',
+ startVal: '开始值',
+ start: '开始',
+ pause: '暂停',
+ resume: '继续'
+ },
+ watermarkDemo: {
+ watermark: '水印',
+ createdWatermark: '创建水印',
+ clearWatermark: '清除水印',
+ resetWatermark: '重置水印'
+ },
+ qrcodeDemo: {
+ qrcode: '二维码',
+ qrcodeDes: '基于 qrcode 二次封装',
+ basicUsage: '基础用法',
+ imgTag: 'img标签',
+ style: '样式配置',
+ click: '点击事件',
+ asynchronousContent: '异步内容',
+ invalid: '失效',
+ logoConfig: 'logo配置',
+ logoStyle: 'logo样式',
+ size: '大小配置'
+ },
+ treeDemo: {
+ treeTitle: '树形控件(节点右键可自定义菜单选项)',
+ message: '基于 ElementPlus 的 Tree 组件二次封装'
+ },
+ highlightDemo: {
+ highlight: '高亮',
+ message: '种一棵树最好的时间是十年前,其次就是现在。',
+ keys1: '十年前',
+ keys2: '现在'
+ },
+ infotipDemo: {
+ infotip: '信息提示',
+ infotipDes: '基于 Highlight 组件二次封装',
+ title: '注意事项'
+ },
+ levelDemo: {
+ menu: '多级菜单缓存'
+ },
+ searchDemo: {
+ search: '查询',
+ searchDes: '基于 Form 组件二次封装,实现查询、重置功能',
+ operate: '操作',
+ change: '更改',
+ grid: '栅格',
+ button: '按钮',
+ restore: '还原',
+ inline: '内联',
+ bottom: '底部',
+ position: '位置',
+ left: '左',
+ center: '中',
+ right: '右',
+ dynamicOptions: '动态选项',
+ // 删除单选框
+ deleteRadio: '删除单选框',
+ // 还原单选框
+ restoreRadio: '还原单选框',
+ loading: '加载中',
+ reset: '重置'
+ },
+ stickyDemo: {
+ sticky: '黏性'
+ },
+ tableDemo: {
+ table: '表格',
+ tableDes: '基于 ElementPlus 的 Table 组件二次封装',
+ index: '序号',
+ title: '标题',
+ author: '作者',
+ displayTime: '创建时间',
+ importance: '重要性',
+ pageviews: '阅读数',
+ action: '操作',
+ important: '重要',
+ good: '良好',
+ commonly: '一般',
+ operate: '操作',
+ example: '示例',
+ show: '显示',
+ hidden: '隐藏',
+ pagination: '分页',
+ reserveIndex: '叠加序号',
+ restoreIndex: '还原序号',
+ showSelections: '显示多选',
+ hiddenSelections: '隐藏多选',
+ showExpandedRows: '显示展开行',
+ hiddenExpandedRows: '隐藏展开行',
+ changeTitle: '修改标题',
+ header: '头部',
+ selectAllNone: '全选/全不选',
+ delOrAddAction: '删除/添加操作列',
+ showOrHiddenStripe: '显示/隐藏斑马纹',
+ showOrHiddenBorder: '显示/隐藏边框',
+ fixedHeaderOrAuto: '固定头部/自动',
+ getSelections: '获取多选数据',
+ preview: '封面',
+ showOrHiddenSortable: '显示/隐藏排序',
+ videoPreview: '视频预览',
+ cardTable: '卡片表格'
+ },
+ richText: {
+ richText: '富文本',
+ richTextDes: '基于 wangeditor 二次封装',
+ jsonEditor: 'JSON编辑器',
+ jsonEditorDes: '基于 vue-json-pretty 二次封装',
+ codeEditor: '代码编辑器',
+ codeEditorDes: '基于 monaco-editor 二次封装'
+ },
+ dialogDemo: {
+ dialog: '弹窗',
+ resizeDialog: '可自定义调节弹窗大小的弹窗',
+ dialogDes: '基于 ElementPlus 的 Dialog 组件二次封装',
+ open: '打开',
+ close: '关闭',
+ combineWithForm: '与表单结合',
+ submit: '提交'
+ },
+ imageViewerDemo: {
+ open: '打开',
+ imageViewer: '图片预览',
+ imageViewerDes: '基于 ElementPlus 的 ImageViewer 组件二次封装'
+ },
+ descriptionsDemo: {
+ descriptions: '描述',
+ descriptionsDes: '基于 ElementPlus 的 Descriptions 组件二次封装',
+ username: '用户名',
+ nickName: '昵称',
+ phone: '联系电话',
+ email: '邮箱',
+ addr: '地址',
+ form: '与 Form 组件组合'
+ },
+ exampleDemo: {
+ title: '标题',
+ add: '新增',
+ del: '删除',
+ edit: '编辑',
+ author: '作者',
+ displayTime: '创建时间',
+ importance: '重要性',
+ pageviews: '阅读数',
+ important: '重要',
+ content: '内容',
+ save: '保存',
+ detail: '详情'
+ },
+ userDemo: {
+ title: '用户管理',
+ message: '由于是模拟数据,所以只提供了两种不同权限的帐号,开发者可根据实际情况自行改造结合。',
+ index: '序号',
+ action: '操作',
+ username: '用户名',
+ password: '密码',
+ role: '角色',
+ remark: '备注',
+ remarkMessage1: '后端控制路由权限',
+ remarkMessage2: '前端控制路由权限',
+ // 部门列表
+ departmentList: '部门列表',
+ searchDepartment: '搜索部门',
+ account: '账号',
+ email: '邮箱',
+ createTime: '创建时间',
+ // 所属部门
+ department: '所属部门',
+ departmentName: '部门名称',
+ status: '状态',
+ // 启用
+ enable: '启用',
+ // 禁用
+ disable: '禁用',
+ // 上级部门
+ superiorDepartment: '上级部门'
+ },
+ menu: {
+ menuName: '菜单名称',
+ icon: '图标',
+ permission: '按钮权限',
+ component: '组件',
+ path: '路径',
+ status: '状态',
+ hidden: '是否隐藏',
+ alwaysShow: '是否一直显示',
+ noCache: '是否清除缓存',
+ breadcrumb: '是否显示面包屑',
+ affix: '是否固定在标签页',
+ noTagsView: '是否隐藏标签页',
+ activeMenu: '高亮菜单',
+ canTo: '是否可跳转',
+ name: '组件名称'
+ },
+ role: {
+ roleName: '角色名称',
+ role: '角色',
+ menu: '菜单分配'
+ },
+ inputPasswordDemo: {
+ title: '密码输入框',
+ inputPasswordDes: '基于 ElementPlus 的 Input 组件二次封装'
+ },
+ avatarsDemo: {
+ title: '头像列表组件,基于element-plus的Avatar组件二次封装'
+ }
+}
diff --git a/src/main.ts b/src/main.ts
new file mode 100644
index 0000000..d0f08af
--- /dev/null
+++ b/src/main.ts
@@ -0,0 +1,58 @@
+import 'vue/jsx'
+
+// 引入windi css
+import '@/plugins/unocss'
+
+// 导入全局的svg图标
+import '@/plugins/svgIcon'
+
+// 初始化多语言
+import { setupI18n } from '@/plugins/vueI18n'
+
+// 引入状态管理
+import { setupStore } from '@/store'
+
+// 全局组件
+import { setupGlobCom } from '@/components'
+
+// 引入element-plus
+import { setupElementPlus } from '@/plugins/elementPlus'
+
+// 引入全局样式
+import '@/styles/index.less'
+
+// 引入动画
+import '@/plugins/animate.css'
+
+// 路由
+import { setupRouter } from './router'
+
+// 权限
+import { setupPermission } from './directives'
+
+import { createApp } from 'vue'
+
+import App from './App.vue'
+
+import './permission'
+
+// 创建实例
+const setupAll = async () => {
+ const app = createApp(App)
+
+ await setupI18n(app)
+
+ setupStore(app)
+
+ setupGlobCom(app)
+
+ setupElementPlus(app)
+
+ setupRouter(app)
+
+ setupPermission(app)
+
+ app.mount('#app')
+}
+
+setupAll()
diff --git a/src/permission.ts b/src/permission.ts
new file mode 100644
index 0000000..a14c3a8
--- /dev/null
+++ b/src/permission.ts
@@ -0,0 +1,64 @@
+import router from './router'
+import { useAppStoreWithOut } from '@/store/modules/app'
+import type { RouteRecordRaw } from 'vue-router'
+import { useTitle } from '@/hooks/web/useTitle'
+import { useNProgress } from '@/hooks/web/useNProgress'
+import { usePermissionStoreWithOut } from '@/store/modules/permission'
+import { usePageLoading } from '@/hooks/web/usePageLoading'
+import { NO_REDIRECT_WHITE_LIST } from '@/constants'
+import { useUserStoreWithOut } from '@/store/modules/user'
+
+const { start, done } = useNProgress()
+
+const { loadStart, loadDone } = usePageLoading()
+
+router.beforeEach(async (to, from, next) => {
+ start()
+ loadStart()
+ const permissionStore = usePermissionStoreWithOut()
+ const appStore = useAppStoreWithOut()
+ const userStore = useUserStoreWithOut()
+ if (userStore.getUserInfo) {
+ if (to.path === '/login') {
+ next({ path: '/' })
+ } else {
+ if (permissionStore.getIsAddRouters) {
+ next()
+ return
+ }
+
+ // 开发者可根据实际情况进行修改
+ const roleRouters = userStore.getRoleRouters || []
+
+ // 是否使用动态路由
+ if (appStore.getDynamicRouter) {
+ appStore.serverDynamicRouter
+ ? await permissionStore.generateRoutes('server', roleRouters as AppCustomRouteRecordRaw[])
+ : await permissionStore.generateRoutes('frontEnd', roleRouters as string[])
+ } else {
+ await permissionStore.generateRoutes('static')
+ }
+
+ permissionStore.getAddRouters.forEach((route) => {
+ router.addRoute(route as unknown as RouteRecordRaw) // 动态添加可访问路由表
+ })
+ const redirectPath = from.query.redirect || to.path
+ const redirect = decodeURIComponent(redirectPath as string)
+ const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect }
+ permissionStore.setIsAddRouters(true)
+ next(nextData)
+ }
+ } else {
+ if (NO_REDIRECT_WHITE_LIST.indexOf(to.path) !== -1) {
+ next()
+ } else {
+ next(`/login?redirect=${to.path}`) // 否则全部重定向到登录页
+ }
+ }
+})
+
+router.afterEach((to) => {
+ useTitle(to?.meta?.title as string)
+ done() // 结束Progress
+ loadDone()
+})
diff --git a/src/plugins/animate.css/index.ts b/src/plugins/animate.css/index.ts
new file mode 100644
index 0000000..3e93451
--- /dev/null
+++ b/src/plugins/animate.css/index.ts
@@ -0,0 +1 @@
+import 'animate.css'
diff --git a/src/plugins/echarts/index.ts b/src/plugins/echarts/index.ts
new file mode 100644
index 0000000..34f756f
--- /dev/null
+++ b/src/plugins/echarts/index.ts
@@ -0,0 +1,41 @@
+import * as echarts from 'echarts/core'
+
+import {
+ BarChart,
+ LineChart,
+ PieChart,
+ MapChart,
+ PictorialBarChart,
+ RadarChart
+} from 'echarts/charts'
+
+import {
+ TitleComponent,
+ TooltipComponent,
+ GridComponent,
+ PolarComponent,
+ AriaComponent,
+ ParallelComponent,
+ LegendComponent
+} from 'echarts/components'
+
+import { CanvasRenderer } from 'echarts/renderers'
+
+echarts.use([
+ LegendComponent,
+ TitleComponent,
+ TooltipComponent,
+ GridComponent,
+ PolarComponent,
+ AriaComponent,
+ ParallelComponent,
+ BarChart,
+ LineChart,
+ PieChart,
+ MapChart,
+ CanvasRenderer,
+ PictorialBarChart,
+ RadarChart
+])
+
+export default echarts
diff --git a/src/plugins/elementPlus/index.ts b/src/plugins/elementPlus/index.ts
new file mode 100644
index 0000000..29a7840
--- /dev/null
+++ b/src/plugins/elementPlus/index.ts
@@ -0,0 +1,24 @@
+import type { App } from 'vue'
+
+// 需要全局引入一些组件,如ElScrollbar,不然一些下拉项样式有问题
+import { ElLoading, ElScrollbar } from 'element-plus'
+
+const plugins = [ElLoading]
+
+const components = [ElScrollbar]
+
+export const setupElementPlus = (app: App) => {
+ plugins.forEach((plugin) => {
+ app.use(plugin)
+ })
+
+ // 为了开发环境启动更快,一次性引入所有样式
+ if (import.meta.env.VITE_USE_ALL_ELEMENT_PLUS_STYLE === 'true') {
+ import('element-plus/dist/index.css')
+ return
+ }
+
+ components.forEach((component) => {
+ app.component(component.name!, component)
+ })
+}
diff --git a/src/plugins/svgIcon/index.ts b/src/plugins/svgIcon/index.ts
new file mode 100644
index 0000000..1b11e2d
--- /dev/null
+++ b/src/plugins/svgIcon/index.ts
@@ -0,0 +1 @@
+import 'virtual:svg-icons-register'
diff --git a/src/plugins/unocss/index.ts b/src/plugins/unocss/index.ts
new file mode 100644
index 0000000..d366b5a
--- /dev/null
+++ b/src/plugins/unocss/index.ts
@@ -0,0 +1 @@
+import 'virtual:uno.css'
diff --git a/src/plugins/vueI18n/helper.ts b/src/plugins/vueI18n/helper.ts
new file mode 100644
index 0000000..da6bc8c
--- /dev/null
+++ b/src/plugins/vueI18n/helper.ts
@@ -0,0 +1,3 @@
+export const setHtmlPageLang = (locale: LocaleType) => {
+ document.querySelector('html')?.setAttribute('lang', locale)
+}
diff --git a/src/plugins/vueI18n/index.ts b/src/plugins/vueI18n/index.ts
new file mode 100644
index 0000000..f845b13
--- /dev/null
+++ b/src/plugins/vueI18n/index.ts
@@ -0,0 +1,42 @@
+import type { App } from 'vue'
+import { createI18n } from 'vue-i18n'
+import { useLocaleStoreWithOut } from '@/store/modules/locale'
+import type { I18n, I18nOptions } from 'vue-i18n'
+import { setHtmlPageLang } from './helper'
+
+export let i18n: ReturnType
+
+const createI18nOptions = async (): Promise => {
+ const localeStore = useLocaleStoreWithOut()
+ const locale = localeStore.getCurrentLocale
+ const localeMap = localeStore.getLocaleMap
+ const defaultLocal = await import(`../../locales/${locale.lang}.ts`)
+ const message = defaultLocal.default ?? {}
+
+ setHtmlPageLang(locale.lang)
+
+ localeStore.setCurrentLocale({
+ lang: locale.lang
+ // elLocale: elLocal
+ })
+
+ return {
+ legacy: false,
+ locale: locale.lang,
+ fallbackLocale: locale.lang,
+ messages: {
+ [locale.lang]: message
+ },
+ availableLocales: localeMap.map((v) => v.lang),
+ sync: true,
+ silentTranslationWarn: true,
+ missingWarn: false,
+ silentFallbackWarn: true
+ }
+}
+
+export const setupI18n = async (app: App) => {
+ const options = await createI18nOptions()
+ i18n = createI18n(options) as I18n
+ app.use(i18n)
+}
diff --git a/src/router/index.ts b/src/router/index.ts
new file mode 100644
index 0000000..e203a01
--- /dev/null
+++ b/src/router/index.ts
@@ -0,0 +1,753 @@
+import { createRouter, createWebHashHistory } from 'vue-router'
+import type { RouteRecordRaw } from 'vue-router'
+import type { App } from 'vue'
+import { Layout, getParentLayout } from '@/utils/routerHelper'
+import { useI18n } from '@/hooks/web/useI18n'
+import { NO_RESET_WHITE_LIST } from '@/constants'
+
+const { t } = useI18n()
+
+export const constantRouterMap: AppRouteRecordRaw[] = [
+ {
+ path: '/',
+ component: Layout,
+ redirect: '/dashboard/analysis',
+ name: 'Root',
+ meta: {
+ hidden: true
+ }
+ },
+ {
+ path: '/redirect',
+ component: Layout,
+ name: 'RedirectWrap',
+ children: [
+ {
+ path: '/redirect/:path(.*)',
+ name: 'Redirect',
+ component: () => import('@/views/Redirect/Redirect.vue'),
+ meta: {}
+ }
+ ],
+ meta: {
+ hidden: true,
+ noTagsView: true
+ }
+ },
+ {
+ path: '/login',
+ component: () => import('@/views/Login/Login.vue'),
+ name: 'Login',
+ meta: {
+ hidden: true,
+ title: t('router.login'),
+ noTagsView: true
+ }
+ },
+ {
+ path: '/personal',
+ component: Layout,
+ redirect: '/personal/personal-center',
+ name: 'Personal',
+ meta: {
+ title: t('router.personal'),
+ hidden: true,
+ canTo: true
+ },
+ children: [
+ {
+ path: 'personal-center',
+ component: () => import('@/views/Personal/PersonalCenter/PersonalCenter.vue'),
+ name: 'PersonalCenter',
+ meta: {
+ title: t('router.personalCenter'),
+ hidden: true,
+ canTo: true
+ }
+ }
+ ]
+ },
+ {
+ path: '/404',
+ component: () => import('@/views/Error/404.vue'),
+ name: 'NoFind',
+ meta: {
+ hidden: true,
+ title: '404',
+ noTagsView: true
+ }
+ }
+]
+
+export const asyncRouterMap: AppRouteRecordRaw[] = [
+ {
+ path: '/dashboard',
+ component: Layout,
+ redirect: '/dashboard/analysis',
+ name: 'Dashboard',
+ meta: {
+ title: t('router.dashboard'),
+ icon: 'vi-ant-design:dashboard-filled',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'analysis',
+ component: () => import('@/views/Dashboard/Analysis.vue'),
+ name: 'Analysis',
+ meta: {
+ title: t('router.analysis'),
+ noCache: true,
+ affix: true
+ }
+ },
+ {
+ path: 'workplace',
+ component: () => import('@/views/Dashboard/Workplace.vue'),
+ name: 'Workplace',
+ meta: {
+ title: t('router.workplace'),
+ noCache: true
+ }
+ }
+ ]
+ },
+ {
+ path: '/external-link',
+ component: Layout,
+ meta: {},
+ name: 'ExternalLink',
+ children: [
+ {
+ path: 'https://element-plus-admin-doc.cn/',
+ name: 'DocumentLink',
+ meta: {
+ title: t('router.document'),
+ icon: 'vi-clarity:document-solid'
+ }
+ }
+ ]
+ },
+ {
+ path: '/guide',
+ component: Layout,
+ name: 'Guide',
+ meta: {},
+ children: [
+ {
+ path: 'index',
+ component: () => import('@/views/Guide/Guide.vue'),
+ name: 'GuideDemo',
+ meta: {
+ title: t('router.guide'),
+ icon: 'vi-cib:telegram-plane'
+ }
+ }
+ ]
+ },
+ {
+ path: '/components',
+ component: Layout,
+ name: 'ComponentsDemo',
+ meta: {
+ title: t('router.component'),
+ icon: 'vi-bx:bxs-component',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'form',
+ component: getParentLayout(),
+ redirect: '/components/form/default-form',
+ name: 'Form',
+ meta: {
+ title: t('router.form'),
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'default-form',
+ component: () => import('@/views/Components/Form/DefaultForm.vue'),
+ name: 'DefaultForm',
+ meta: {
+ title: t('router.defaultForm')
+ }
+ },
+ {
+ path: 'use-form',
+ component: () => import('@/views/Components/Form/UseFormDemo.vue'),
+ name: 'UseForm',
+ meta: {
+ title: 'UseForm'
+ }
+ }
+ ]
+ },
+ {
+ path: 'table',
+ component: getParentLayout(),
+ redirect: '/components/table/default-table',
+ name: 'TableDemo',
+ meta: {
+ title: t('router.table'),
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'default-table',
+ component: () => import('@/views/Components/Table/DefaultTable.vue'),
+ name: 'DefaultTable',
+ meta: {
+ title: t('router.defaultTable')
+ }
+ },
+ {
+ path: 'use-table',
+ component: () => import('@/views/Components/Table/UseTableDemo.vue'),
+ name: 'UseTable',
+ meta: {
+ title: 'UseTable'
+ }
+ },
+ {
+ path: 'tree-table',
+ component: () => import('@/views/Components/Table/TreeTable.vue'),
+ name: 'TreeTable',
+ meta: {
+ title: t('router.treeTable')
+ }
+ },
+ {
+ path: 'table-image-preview',
+ component: () => import('@/views/Components/Table/TableImagePreview.vue'),
+ name: 'TableImagePreview',
+ meta: {
+ title: t('router.PicturePreview')
+ }
+ },
+ {
+ path: 'table-video-preview',
+ component: () => import('@/views/Components/Table/TableVideoPreview.vue'),
+ name: 'TableVideoPreview',
+ meta: {
+ title: t('router.tableVideoPreview')
+ }
+ },
+ {
+ path: 'card-table',
+ component: () => import('@/views/Components/Table/CardTable.vue'),
+ name: 'CardTable',
+ meta: {
+ title: t('router.cardTable')
+ }
+ }
+ ]
+ },
+ {
+ path: 'editor-demo',
+ component: getParentLayout(),
+ redirect: '/components/editor-demo/editor',
+ name: 'EditorDemo',
+ meta: {
+ title: t('router.editor'),
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'editor',
+ component: () => import('@/views/Components/Editor/Editor.vue'),
+ name: 'Editor',
+ meta: {
+ title: t('router.richText')
+ }
+ },
+ {
+ path: 'json-editor',
+ component: () => import('@/views/Components/Editor/JsonEditor.vue'),
+ name: 'JsonEditor',
+ meta: {
+ title: t('router.jsonEditor')
+ }
+ }
+ ]
+ },
+ {
+ path: 'search',
+ component: () => import('@/views/Components/Search.vue'),
+ name: 'Search',
+ meta: {
+ title: t('router.search')
+ }
+ },
+ {
+ path: 'descriptions',
+ component: () => import('@/views/Components/Descriptions.vue'),
+ name: 'Descriptions',
+ meta: {
+ title: t('router.descriptions')
+ }
+ },
+ {
+ path: 'image-viewer',
+ component: () => import('@/views/Components/ImageViewer.vue'),
+ name: 'ImageViewer',
+ meta: {
+ title: t('router.imageViewer')
+ }
+ },
+ {
+ path: 'dialog',
+ component: () => import('@/views/Components/Dialog.vue'),
+ name: 'Dialog',
+ meta: {
+ title: t('router.dialog')
+ }
+ },
+ {
+ path: 'icon',
+ component: () => import('@/views/Components/Icon.vue'),
+ name: 'Icon',
+ meta: {
+ title: t('router.icon')
+ }
+ },
+ {
+ path: 'icon-picker',
+ component: () => import('@/views/Components/IconPicker.vue'),
+ name: 'IconPicker',
+ meta: {
+ title: t('router.iconPicker')
+ }
+ },
+ {
+ path: 'echart',
+ component: () => import('@/views/Components/Echart.vue'),
+ name: 'Echart',
+ meta: {
+ title: t('router.echart')
+ }
+ },
+ {
+ path: 'count-to',
+ component: () => import('@/views/Components/CountTo.vue'),
+ name: 'CountTo',
+ meta: {
+ title: t('router.countTo')
+ }
+ },
+ {
+ path: 'qrcode',
+ component: () => import('@/views/Components/Qrcode.vue'),
+ name: 'Qrcode',
+ meta: {
+ title: t('router.qrcode')
+ }
+ },
+ {
+ path: 'highlight',
+ component: () => import('@/views/Components/Highlight.vue'),
+ name: 'Highlight',
+ meta: {
+ title: t('router.highlight')
+ }
+ },
+ {
+ path: 'infotip',
+ component: () => import('@/views/Components/Infotip.vue'),
+ name: 'Infotip',
+ meta: {
+ title: t('router.infotip')
+ }
+ },
+ {
+ path: 'input-password',
+ component: () => import('@/views/Components/InputPassword.vue'),
+ name: 'InputPassword',
+ meta: {
+ title: t('router.inputPassword')
+ }
+ },
+ {
+ path: 'waterfall',
+ component: () => import('@/views/Components/Waterfall.vue'),
+ name: 'waterfall',
+ meta: {
+ title: t('router.waterfall')
+ }
+ },
+ {
+ path: 'image-cropping',
+ component: () => import('@/views/Components/ImageCropping.vue'),
+ name: 'ImageCropping',
+ meta: {
+ title: t('router.imageCropping')
+ }
+ },
+ {
+ path: 'video-player',
+ component: () => import('@/views/Components/VideoPlayer.vue'),
+ name: 'VideoPlayer',
+ meta: {
+ title: t('router.videoPlayer')
+ }
+ },
+ {
+ path: 'avatars',
+ component: () => import('@/views/Components/Avatars.vue'),
+ name: 'Avatars',
+ meta: {
+ title: t('router.avatars')
+ }
+ },
+ {
+ path: 'i-agree',
+ component: () => import('@/views/Components/IAgree.vue'),
+ name: 'IAgree',
+ meta: {
+ title: t('router.iAgree')
+ }
+ }
+ ]
+ },
+ {
+ path: '/function',
+ component: Layout,
+ redirect: '/function/multipleTabs',
+ name: 'Function',
+ meta: {
+ title: t('router.function'),
+ icon: 'vi-ri:function-fill',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'multiple-tabs',
+ component: () => import('@/views/Function/MultipleTabs.vue'),
+ name: 'MultipleTabs',
+ meta: {
+ title: t('router.multipleTabs')
+ }
+ },
+ {
+ path: 'multiple-tabs-demo/:id',
+ component: () => import('@/views/Function/MultipleTabsDemo.vue'),
+ name: 'MultipleTabsDemo',
+ meta: {
+ hidden: true,
+ title: t('router.details'),
+ canTo: true,
+ activeMenu: '/function/multiple-tabs'
+ }
+ },
+ {
+ path: 'request',
+ component: () => import('@/views/Function/Request.vue'),
+ name: 'Request',
+ meta: {
+ title: t('router.request')
+ }
+ },
+ {
+ path: 'test',
+ component: () => import('@/views/Function/Test.vue'),
+ name: 'Test',
+ meta: {
+ title: t('router.permission'),
+ permission: ['add', 'edit', 'delete']
+ }
+ }
+ ]
+ },
+ {
+ path: '/hooks',
+ component: Layout,
+ redirect: '/hooks/useWatermark',
+ name: 'Hooks',
+ meta: {
+ title: 'hooks',
+ icon: 'vi-ic:outline-webhook',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'useWatermark',
+ component: () => import('@/views/hooks/useWatermark.vue'),
+ name: 'UseWatermark',
+ meta: {
+ title: 'useWatermark'
+ }
+ },
+ {
+ path: 'useTagsView',
+ component: () => import('@/views/hooks/useTagsView.vue'),
+ name: 'UseTagsView',
+ meta: {
+ title: 'useTagsView'
+ }
+ },
+ {
+ path: 'useValidator',
+ component: () => import('@/views/hooks/useValidator.vue'),
+ name: 'UseValidator',
+ meta: {
+ title: 'useValidator'
+ }
+ },
+ {
+ path: 'useCrudSchemas',
+ component: () => import('@/views/hooks/useCrudSchemas.vue'),
+ name: 'UseCrudSchemas',
+ meta: {
+ title: 'useCrudSchemas'
+ }
+ },
+ {
+ path: 'useClipboard',
+ component: () => import('@/views/hooks/useClipboard.vue'),
+ name: 'UseClipboard',
+ meta: {
+ title: 'useClipboard'
+ }
+ },
+ {
+ path: 'useNetwork',
+ component: () => import('@/views/hooks/useNetwork.vue'),
+ name: 'UseNetwork',
+ meta: {
+ title: 'useNetwork'
+ }
+ }
+ ]
+ },
+ {
+ path: '/level',
+ component: Layout,
+ redirect: '/level/menu1/menu1-1/menu1-1-1',
+ name: 'Level',
+ meta: {
+ title: t('router.level'),
+ icon: 'vi-carbon:skill-level-advanced'
+ },
+ children: [
+ {
+ path: 'menu1',
+ name: 'Menu1',
+ component: getParentLayout(),
+ redirect: '/level/menu1/menu1-1/menu1-1-1',
+ meta: {
+ title: t('router.menu1')
+ },
+ children: [
+ {
+ path: 'menu1-1',
+ name: 'Menu11',
+ component: getParentLayout(),
+ redirect: '/level/menu1/menu1-1/menu1-1-1',
+ meta: {
+ title: t('router.menu11'),
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'menu1-1-1',
+ name: 'Menu111',
+ component: () => import('@/views/Level/Menu111.vue'),
+ meta: {
+ title: t('router.menu111')
+ }
+ }
+ ]
+ },
+ {
+ path: 'menu1-2',
+ name: 'Menu12',
+ component: () => import('@/views/Level/Menu12.vue'),
+ meta: {
+ title: t('router.menu12')
+ }
+ }
+ ]
+ },
+ {
+ path: 'menu2',
+ name: 'Menu2',
+ component: () => import('@/views/Level/Menu2.vue'),
+ meta: {
+ title: t('router.menu2')
+ }
+ }
+ ]
+ },
+ {
+ path: '/example',
+ component: Layout,
+ redirect: '/example/example-dialog',
+ name: 'Example',
+ meta: {
+ title: t('router.example'),
+ icon: 'vi-ep:management',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'example-dialog',
+ component: () => import('@/views/Example/Dialog/ExampleDialog.vue'),
+ name: 'ExampleDialog',
+ meta: {
+ title: t('router.exampleDialog')
+ }
+ },
+ {
+ path: 'example-page',
+ component: () => import('@/views/Example/Page/ExamplePage.vue'),
+ name: 'ExamplePage',
+ meta: {
+ title: t('router.examplePage')
+ }
+ },
+ {
+ path: 'example-add',
+ component: () => import('@/views/Example/Page/ExampleAdd.vue'),
+ name: 'ExampleAdd',
+ meta: {
+ title: t('router.exampleAdd'),
+ noTagsView: true,
+ noCache: true,
+ hidden: true,
+ canTo: true,
+ activeMenu: '/example/example-page'
+ }
+ },
+ {
+ path: 'example-edit',
+ component: () => import('@/views/Example/Page/ExampleEdit.vue'),
+ name: 'ExampleEdit',
+ meta: {
+ title: t('router.exampleEdit'),
+ noTagsView: true,
+ noCache: true,
+ hidden: true,
+ canTo: true,
+ activeMenu: '/example/example-page'
+ }
+ },
+ {
+ path: 'example-detail',
+ component: () => import('@/views/Example/Page/ExampleDetail.vue'),
+ name: 'ExampleDetail',
+ meta: {
+ title: t('router.exampleDetail'),
+ noTagsView: true,
+ noCache: true,
+ hidden: true,
+ canTo: true,
+ activeMenu: '/example/example-page'
+ }
+ }
+ ]
+ },
+ {
+ path: '/error',
+ component: Layout,
+ redirect: '/error/404',
+ name: 'Error',
+ meta: {
+ title: t('router.errorPage'),
+ icon: 'vi-ci:error',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: '404-demo',
+ component: () => import('@/views/Error/404.vue'),
+ name: '404Demo',
+ meta: {
+ title: '404'
+ }
+ },
+ {
+ path: '403-demo',
+ component: () => import('@/views/Error/403.vue'),
+ name: '403Demo',
+ meta: {
+ title: '403'
+ }
+ },
+ {
+ path: '500-demo',
+ component: () => import('@/views/Error/500.vue'),
+ name: '500Demo',
+ meta: {
+ title: '500'
+ }
+ }
+ ]
+ },
+ {
+ path: '/authorization',
+ component: Layout,
+ redirect: '/authorization/user',
+ name: 'Authorization',
+ meta: {
+ title: t('router.authorization'),
+ icon: 'vi-eos-icons:role-binding',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: 'department',
+ component: () => import('@/views/Authorization/Department/Department.vue'),
+ name: 'Department',
+ meta: {
+ title: t('router.department')
+ }
+ },
+ {
+ path: 'user',
+ component: () => import('@/views/Authorization/User/User.vue'),
+ name: 'User',
+ meta: {
+ title: t('router.user')
+ }
+ },
+ {
+ path: 'menu',
+ component: () => import('@/views/Authorization/Menu/Menu.vue'),
+ name: 'Menu',
+ meta: {
+ title: t('router.menuManagement')
+ }
+ },
+ {
+ path: 'role',
+ component: () => import('@/views/Authorization/Role/Role.vue'),
+ name: 'Role',
+ meta: {
+ title: t('router.role')
+ }
+ }
+ ]
+ }
+]
+
+const router = createRouter({
+ history: createWebHashHistory(),
+ strict: true,
+ routes: constantRouterMap as RouteRecordRaw[],
+ scrollBehavior: () => ({ left: 0, top: 0 })
+})
+
+export const resetRouter = (): void => {
+ router.getRoutes().forEach((route) => {
+ const { name } = route
+ if (name && !NO_RESET_WHITE_LIST.includes(name as string)) {
+ router.hasRoute(name) && router.removeRoute(name)
+ }
+ })
+}
+
+export const setupRouter = (app: App) => {
+ app.use(router)
+}
+
+export default router
diff --git a/src/store/index.ts b/src/store/index.ts
new file mode 100644
index 0000000..ee92ca8
--- /dev/null
+++ b/src/store/index.ts
@@ -0,0 +1,13 @@
+import type { App } from 'vue'
+import { createPinia } from 'pinia'
+import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
+
+const store = createPinia()
+
+store.use(piniaPluginPersistedstate)
+
+export const setupStore = (app: App) => {
+ app.use(store)
+}
+
+export { store }
diff --git a/src/store/modules/app.ts b/src/store/modules/app.ts
new file mode 100644
index 0000000..9a295fb
--- /dev/null
+++ b/src/store/modules/app.ts
@@ -0,0 +1,340 @@
+import { defineStore } from 'pinia'
+import { store } from '../index'
+import { setCssVar, humpToUnderline } from '@/utils'
+import { colorIsDark, hexToRGB, lighten, mix } from '@/utils/color'
+import { ElMessage, ComponentSize } from 'element-plus'
+import { useCssVar } from '@vueuse/core'
+import { unref } from 'vue'
+import { useDark } from '@vueuse/core'
+
+interface AppState {
+ breadcrumb: boolean
+ breadcrumbIcon: boolean
+ collapse: boolean
+ uniqueOpened: boolean
+ hamburger: boolean
+ screenfull: boolean
+ size: boolean
+ locale: boolean
+ tagsView: boolean
+ tagsViewIcon: boolean
+ logo: boolean
+ fixedHeader: boolean
+ greyMode: boolean
+ dynamicRouter: boolean
+ serverDynamicRouter: boolean
+ pageLoading: boolean
+ layout: LayoutType
+ title: string
+ isDark: boolean
+ currentSize: ComponentSize
+ sizeMap: ComponentSize[]
+ mobile: boolean
+ footer: boolean
+ theme: ThemeTypes
+ fixedMenu: boolean
+}
+
+export const useAppStore = defineStore('app', {
+ state: (): AppState => {
+ return {
+ sizeMap: ['default', 'large', 'small'],
+ mobile: false, // 是否是移动端
+ title: import.meta.env.VITE_APP_TITLE, // 标题
+ pageLoading: false, // 路由跳转loading
+ breadcrumb: true, // 面包屑
+ breadcrumbIcon: true, // 面包屑图标
+ collapse: false, // 折叠菜单
+ uniqueOpened: false, // 是否只保持一个子菜单的展开
+ hamburger: true, // 折叠图标
+ screenfull: true, // 全屏图标
+ size: true, // 尺寸图标
+ locale: true, // 多语言图标
+ tagsView: true, // 标签页
+ tagsViewIcon: true, // 是否显示标签图标
+ logo: true, // logo
+ fixedHeader: true, // 固定toolheader
+ footer: true, // 显示页脚
+ greyMode: false, // 是否开始灰色模式,用于特殊悼念日
+ dynamicRouter: true, // 是否动态路由
+ serverDynamicRouter: true, // 是否服务端渲染动态路由
+ fixedMenu: false, // 是否固定菜单
+
+ layout: 'classic', // layout布局
+ isDark: false, // 是否是暗黑模式
+ currentSize: 'default', // 组件尺寸
+ theme: {
+ // 主题色
+ elColorPrimary: '#409eff',
+ // 左侧菜单边框颜色
+ leftMenuBorderColor: 'inherit',
+ // 左侧菜单背景颜色
+ leftMenuBgColor: '#001529',
+ // 左侧菜单浅色背景颜色
+ leftMenuBgLightColor: '#0f2438',
+ // 左侧菜单选中背景颜色
+ leftMenuBgActiveColor: 'var(--el-color-primary)',
+ // 左侧菜单收起选中背景颜色
+ leftMenuCollapseBgActiveColor: 'var(--el-color-primary)',
+ // 左侧菜单字体颜色
+ leftMenuTextColor: '#bfcbd9',
+ // 左侧菜单选中字体颜色
+ leftMenuTextActiveColor: '#fff',
+ // logo字体颜色
+ logoTitleTextColor: '#fff',
+ // logo边框颜色
+ logoBorderColor: 'inherit',
+ // 头部背景颜色
+ topHeaderBgColor: '#fff',
+ // 头部字体颜色
+ topHeaderTextColor: 'inherit',
+ // 头部悬停颜色
+ topHeaderHoverColor: '#f6f6f6',
+ // 头部边框颜色
+ topToolBorderColor: '#eee'
+ }
+ }
+ },
+ getters: {
+ getBreadcrumb(): boolean {
+ return this.breadcrumb
+ },
+ getBreadcrumbIcon(): boolean {
+ return this.breadcrumbIcon
+ },
+ getCollapse(): boolean {
+ return this.collapse
+ },
+ getUniqueOpened(): boolean {
+ return this.uniqueOpened
+ },
+ getHamburger(): boolean {
+ return this.hamburger
+ },
+ getScreenfull(): boolean {
+ return this.screenfull
+ },
+ getSize(): boolean {
+ return this.size
+ },
+ getLocale(): boolean {
+ return this.locale
+ },
+ getTagsView(): boolean {
+ return this.tagsView
+ },
+ getTagsViewIcon(): boolean {
+ return this.tagsViewIcon
+ },
+ getLogo(): boolean {
+ return this.logo
+ },
+ getFixedHeader(): boolean {
+ return this.fixedHeader
+ },
+ getGreyMode(): boolean {
+ return this.greyMode
+ },
+ getDynamicRouter(): boolean {
+ return this.dynamicRouter
+ },
+ getServerDynamicRouter(): boolean {
+ return this.serverDynamicRouter
+ },
+ getFixedMenu(): boolean {
+ return this.fixedMenu
+ },
+ getPageLoading(): boolean {
+ return this.pageLoading
+ },
+ getLayout(): LayoutType {
+ return this.layout
+ },
+ getTitle(): string {
+ return this.title
+ },
+ getIsDark(): boolean {
+ return this.isDark
+ },
+ getCurrentSize(): ComponentSize {
+ return this.currentSize
+ },
+ getSizeMap(): ComponentSize[] {
+ return this.sizeMap
+ },
+ getMobile(): boolean {
+ return this.mobile
+ },
+ getTheme(): ThemeTypes {
+ return this.theme
+ },
+ getFooter(): boolean {
+ return this.footer
+ }
+ },
+ actions: {
+ setBreadcrumb(breadcrumb: boolean) {
+ this.breadcrumb = breadcrumb
+ },
+ setBreadcrumbIcon(breadcrumbIcon: boolean) {
+ this.breadcrumbIcon = breadcrumbIcon
+ },
+ setCollapse(collapse: boolean) {
+ this.collapse = collapse
+ },
+ setUniqueOpened(uniqueOpened: boolean) {
+ this.uniqueOpened = uniqueOpened
+ },
+ setHamburger(hamburger: boolean) {
+ this.hamburger = hamburger
+ },
+ setScreenfull(screenfull: boolean) {
+ this.screenfull = screenfull
+ },
+ setSize(size: boolean) {
+ this.size = size
+ },
+ setLocale(locale: boolean) {
+ this.locale = locale
+ },
+ setTagsView(tagsView: boolean) {
+ this.tagsView = tagsView
+ },
+ setTagsViewIcon(tagsViewIcon: boolean) {
+ this.tagsViewIcon = tagsViewIcon
+ },
+ setLogo(logo: boolean) {
+ this.logo = logo
+ },
+ setFixedHeader(fixedHeader: boolean) {
+ this.fixedHeader = fixedHeader
+ },
+ setGreyMode(greyMode: boolean) {
+ this.greyMode = greyMode
+ },
+ setDynamicRouter(dynamicRouter: boolean) {
+ this.dynamicRouter = dynamicRouter
+ },
+ setServerDynamicRouter(serverDynamicRouter: boolean) {
+ this.serverDynamicRouter = serverDynamicRouter
+ },
+ setFixedMenu(fixedMenu: boolean) {
+ this.fixedMenu = fixedMenu
+ },
+ setPageLoading(pageLoading: boolean) {
+ this.pageLoading = pageLoading
+ },
+ setLayout(layout: LayoutType) {
+ if (this.mobile && layout !== 'classic') {
+ ElMessage.warning('移动端模式下不支持切换其它布局')
+ return
+ }
+ this.layout = layout
+ },
+ setTitle(title: string) {
+ this.title = title
+ },
+ setIsDark(isDark: boolean) {
+ this.isDark = isDark
+ if (this.isDark) {
+ document.documentElement.classList.add('dark')
+ document.documentElement.classList.remove('light')
+ } else {
+ document.documentElement.classList.add('light')
+ document.documentElement.classList.remove('dark')
+ }
+ this.setPrimaryLight()
+ },
+ setCurrentSize(currentSize: ComponentSize) {
+ this.currentSize = currentSize
+ },
+ setMobile(mobile: boolean) {
+ this.mobile = mobile
+ },
+ setTheme(theme: ThemeTypes) {
+ this.theme = Object.assign(this.theme, theme)
+ },
+ setCssVarTheme() {
+ for (const key in this.theme) {
+ setCssVar(`--${humpToUnderline(key)}`, this.theme[key])
+ }
+ this.setPrimaryLight()
+ },
+ setFooter(footer: boolean) {
+ this.footer = footer
+ },
+ setPrimaryLight() {
+ if (this.theme.elColorPrimary) {
+ const elColorPrimary = this.theme.elColorPrimary
+ const color = this.isDark ? '#000000' : '#ffffff'
+ const lightList = [3, 5, 7, 8, 9]
+ lightList.forEach((v) => {
+ setCssVar(`--el-color-primary-light-${v}`, mix(color, elColorPrimary, v / 10))
+ })
+ setCssVar(`--el-color-primary-dark-2`, mix(color, elColorPrimary, 0.2))
+ }
+ },
+ setMenuTheme(color: string) {
+ const primaryColor = useCssVar('--el-color-primary', document.documentElement)
+ const isDarkColor = colorIsDark(color)
+ const theme: Recordable = {
+ // 左侧菜单边框颜色
+ leftMenuBorderColor: isDarkColor ? 'inherit' : '#eee',
+ // 左侧菜单背景颜色
+ leftMenuBgColor: color,
+ // 左侧菜单浅色背景颜色
+ leftMenuBgLightColor: isDarkColor ? lighten(color!, 6) : color,
+ // 左侧菜单选中背景颜色
+ leftMenuBgActiveColor: isDarkColor
+ ? 'var(--el-color-primary)'
+ : hexToRGB(unref(primaryColor) as string, 0.1),
+ // 左侧菜单收起选中背景颜色
+ leftMenuCollapseBgActiveColor: isDarkColor
+ ? 'var(--el-color-primary)'
+ : hexToRGB(unref(primaryColor) as string, 0.1),
+ // 左侧菜单字体颜色
+ leftMenuTextColor: isDarkColor ? '#bfcbd9' : '#333',
+ // 左侧菜单选中字体颜色
+ leftMenuTextActiveColor: isDarkColor ? '#fff' : 'var(--el-color-primary)',
+ // logo字体颜色
+ logoTitleTextColor: isDarkColor ? '#fff' : 'inherit',
+ // logo边框颜色
+ logoBorderColor: isDarkColor ? color : '#eee'
+ }
+ this.setTheme(theme)
+ this.setCssVarTheme()
+ },
+ setHeaderTheme(color: string) {
+ const isDarkColor = colorIsDark(color)
+ const textColor = isDarkColor ? '#fff' : 'inherit'
+ const textHoverColor = isDarkColor ? lighten(color!, 6) : '#f6f6f6'
+ const topToolBorderColor = isDarkColor ? color : '#eee'
+ setCssVar('--top-header-bg-color', color)
+ setCssVar('--top-header-text-color', textColor)
+ setCssVar('--top-header-hover-color', textHoverColor)
+ this.setTheme({
+ topHeaderBgColor: color,
+ topHeaderTextColor: textColor,
+ topHeaderHoverColor: textHoverColor,
+ topToolBorderColor
+ })
+ if (this.getLayout === 'top') {
+ this.setMenuTheme(color)
+ }
+ },
+ initTheme() {
+ const isDark = useDark({
+ valueDark: 'dark',
+ valueLight: 'light'
+ })
+ isDark.value = this.getIsDark
+ const newTitle = import.meta.env.VITE_APP_TITLE
+ newTitle !== this.getTitle && this.setTitle(newTitle)
+ }
+ },
+ persist: true
+})
+
+export const useAppStoreWithOut = () => {
+ return useAppStore(store)
+}
diff --git a/src/store/modules/locale.ts b/src/store/modules/locale.ts
new file mode 100644
index 0000000..8d2ba35
--- /dev/null
+++ b/src/store/modules/locale.ts
@@ -0,0 +1,59 @@
+import { defineStore } from 'pinia'
+import { store } from '../index'
+import zhCn from 'element-plus/es/locale/lang/zh-cn'
+import en from 'element-plus/es/locale/lang/en'
+import { useStorage } from '@/hooks/web/useStorage'
+import { LocaleDropdownType } from '@/components/LocaleDropdown'
+
+const { getStorage, setStorage } = useStorage('localStorage')
+
+const elLocaleMap = {
+ 'zh-CN': zhCn,
+ en: en
+}
+interface LocaleState {
+ currentLocale: LocaleDropdownType
+ localeMap: LocaleDropdownType[]
+}
+
+export const useLocaleStore = defineStore('locales', {
+ state: (): LocaleState => {
+ return {
+ currentLocale: {
+ lang: getStorage('lang') || 'zh-CN',
+ elLocale: elLocaleMap[getStorage('lang') || 'zh-CN']
+ },
+ // 多语言
+ localeMap: [
+ {
+ lang: 'zh-CN',
+ name: '简体中文'
+ },
+ {
+ lang: 'en',
+ name: 'English'
+ }
+ ]
+ }
+ },
+ getters: {
+ getCurrentLocale(): LocaleDropdownType {
+ return this.currentLocale
+ },
+ getLocaleMap(): LocaleDropdownType[] {
+ return this.localeMap
+ }
+ },
+ actions: {
+ setCurrentLocale(localeMap: LocaleDropdownType) {
+ // this.locale = Object.assign(this.locale, localeMap)
+ this.currentLocale.lang = localeMap?.lang
+ this.currentLocale.elLocale = elLocaleMap[localeMap?.lang]
+ setStorage('lang', localeMap?.lang)
+ }
+ }
+})
+
+export const useLocaleStoreWithOut = () => {
+ return useLocaleStore(store)
+}
diff --git a/src/store/modules/lock.ts b/src/store/modules/lock.ts
new file mode 100644
index 0000000..70ff87f
--- /dev/null
+++ b/src/store/modules/lock.ts
@@ -0,0 +1,48 @@
+import { defineStore } from 'pinia'
+import { store } from '../index'
+
+interface lockInfo {
+ isLock?: boolean
+ password?: string
+}
+
+interface LockState {
+ lockInfo: lockInfo
+}
+
+export const useLockStore = defineStore('lock', {
+ state: (): LockState => {
+ return {
+ lockInfo: {
+ // isLock: false, // 是否锁定屏幕
+ // password: '' // 锁屏密码
+ }
+ }
+ },
+ getters: {
+ getLockInfo(): lockInfo {
+ return this.lockInfo
+ }
+ },
+ actions: {
+ setLockInfo(lockInfo: lockInfo) {
+ this.lockInfo = lockInfo
+ },
+ resetLockInfo() {
+ this.lockInfo = {}
+ },
+ unLock(password: string) {
+ if (this.lockInfo?.password === password) {
+ this.resetLockInfo()
+ return true
+ } else {
+ return false
+ }
+ }
+ },
+ persist: true
+})
+
+export const useLockStoreWithOut = () => {
+ return useLockStore(store)
+}
diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts
new file mode 100644
index 0000000..5d48cce
--- /dev/null
+++ b/src/store/modules/permission.ts
@@ -0,0 +1,104 @@
+import { defineStore } from 'pinia'
+import { asyncRouterMap, constantRouterMap } from '@/router'
+import {
+ generateRoutesByFrontEnd,
+ generateRoutesByServer,
+ flatMultiLevelRoutes
+} from '@/utils/routerHelper'
+import { store } from '../index'
+import { cloneDeep } from 'lodash-es'
+
+export interface PermissionState {
+ routers: AppRouteRecordRaw[]
+ addRouters: AppRouteRecordRaw[]
+ isAddRouters: boolean
+ menuTabRouters: AppRouteRecordRaw[]
+}
+
+export const usePermissionStore = defineStore('permission', {
+ state: (): PermissionState => ({
+ routers: [],
+ addRouters: [],
+ isAddRouters: false,
+ menuTabRouters: []
+ }),
+ getters: {
+ getRouters(): AppRouteRecordRaw[] {
+ return this.routers
+ },
+ getAddRouters(): AppRouteRecordRaw[] {
+ return flatMultiLevelRoutes(cloneDeep(this.addRouters))
+ },
+ getIsAddRouters(): boolean {
+ return this.isAddRouters
+ },
+ getMenuTabRouters(): AppRouteRecordRaw[] {
+ return this.menuTabRouters
+ }
+ },
+ actions: {
+ generateRoutes(
+ type: 'server' | 'frontEnd' | 'static',
+ routers?: AppCustomRouteRecordRaw[] | string[]
+ ): Promise {
+ return new Promise((resolve) => {
+ let routerMap: AppRouteRecordRaw[] = []
+ if (type === 'server') {
+ // 模拟后端过滤菜单
+ routerMap = generateRoutesByServer(routers as AppCustomRouteRecordRaw[])
+ } else if (type === 'frontEnd') {
+ // 模拟前端过滤菜单
+ routerMap = generateRoutesByFrontEnd(cloneDeep(asyncRouterMap), routers as string[])
+ } else {
+ // 直接读取静态路由表
+ routerMap = cloneDeep(asyncRouterMap)
+ }
+ // 动态路由,404一定要放到最后面
+ // 如果路由生成结果为空(例如后端返回空路由),为了避免只剩通配符导致所有页面都走 404,
+ // 在没有明确权限路由的情况下回退到静态路由表 `asyncRouterMap` 作为兜底。
+ if (routerMap.length === 0) {
+ routerMap = cloneDeep(asyncRouterMap)
+ }
+
+ this.addRouters = routerMap.concat([
+ {
+ path: '/:path(.*)*',
+ redirect: '/404',
+ name: '404Page',
+ meta: {
+ hidden: true,
+ breadcrumb: false
+ }
+ }
+ ])
+ // 渲染菜单的所有路由
+ this.routers = cloneDeep(constantRouterMap).concat(routerMap)
+ resolve()
+ })
+ },
+ setIsAddRouters(state: boolean): void {
+ this.isAddRouters = state
+ },
+ setMenuTabRouters(routers: AppRouteRecordRaw[]): void {
+ this.menuTabRouters = routers
+ }
+ },
+ persist: [
+ {
+ pick: ['routers'],
+ storage: localStorage
+ },
+ {
+ pick: ['addRouters'],
+ storage: localStorage
+ },
+ {
+ pick: ['menuTabRouters'],
+ storage: localStorage
+ }
+ ]
+})
+
+export const usePermissionStoreWithOut = () => {
+ return usePermissionStore(store)
+}
diff --git a/src/store/modules/tagsView.ts b/src/store/modules/tagsView.ts
new file mode 100644
index 0000000..d07a439
--- /dev/null
+++ b/src/store/modules/tagsView.ts
@@ -0,0 +1,163 @@
+import router from '@/router'
+import type { RouteLocationNormalizedLoaded } from 'vue-router'
+import { getRawRoute } from '@/utils/routerHelper'
+import { defineStore } from 'pinia'
+import { store } from '../index'
+import { findIndex } from '@/utils'
+import { useUserStoreWithOut } from './user'
+
+export interface TagsViewState {
+ visitedViews: RouteLocationNormalizedLoaded[]
+ cachedViews: Set
+ selectedTag?: RouteLocationNormalizedLoaded
+}
+
+export const useTagsViewStore = defineStore('tagsView', {
+ state: (): TagsViewState => ({
+ visitedViews: [],
+ cachedViews: new Set(),
+ selectedTag: undefined
+ }),
+ getters: {
+ getVisitedViews(): RouteLocationNormalizedLoaded[] {
+ return this.visitedViews
+ },
+ getCachedViews(): string[] {
+ return Array.from(this.cachedViews)
+ },
+ getSelectedTag(): RouteLocationNormalizedLoaded | undefined {
+ return this.selectedTag
+ }
+ },
+ actions: {
+ // 新增缓存和tag
+ addView(view: RouteLocationNormalizedLoaded): void {
+ this.addVisitedView(view)
+ this.addCachedView()
+ },
+ // 新增tag
+ addVisitedView(view: RouteLocationNormalizedLoaded) {
+ if (this.visitedViews.some((v) => v.path === view.path)) return
+ if (view.meta?.noTagsView) return
+ this.visitedViews.push(
+ Object.assign({}, view, {
+ title: view.meta?.title || 'no-name'
+ })
+ )
+ },
+ // 新增缓存
+ addCachedView() {
+ const cacheMap: Set = new Set()
+ for (const v of this.visitedViews) {
+ const item = getRawRoute(v)
+ const needCache = !item?.meta?.noCache
+ if (!needCache) {
+ continue
+ }
+ const name = item.name as string
+ cacheMap.add(name)
+ }
+ if (Array.from(this.cachedViews).sort().toString() === Array.from(cacheMap).sort().toString())
+ return
+ this.cachedViews = cacheMap
+ },
+ // 删除某个
+ delView(view: RouteLocationNormalizedLoaded) {
+ this.delVisitedView(view)
+ this.addCachedView()
+ },
+ // 删除tag
+ delVisitedView(view: RouteLocationNormalizedLoaded) {
+ for (const [i, v] of this.visitedViews.entries()) {
+ if (v.path === view.path) {
+ this.visitedViews.splice(i, 1)
+ break
+ }
+ }
+ },
+ // 删除缓存
+ delCachedView() {
+ const route = router.currentRoute.value
+ const index = findIndex(this.getCachedViews, (v) => v === route.name)
+ if (index > -1) {
+ this.cachedViews.delete(this.getCachedViews[index])
+ }
+ },
+ // 删除所有缓存和tag
+ delAllViews() {
+ this.delAllVisitedViews()
+ this.addCachedView()
+ },
+ // 删除所有tag
+ delAllVisitedViews() {
+ const userStore = useUserStoreWithOut()
+
+ // const affixTags = this.visitedViews.filter((tag) => tag.meta.affix)
+ this.visitedViews = userStore.getUserInfo
+ ? this.visitedViews.filter((tag) => tag?.meta?.affix)
+ : []
+ },
+ // 删除其它
+ delOthersViews(view: RouteLocationNormalizedLoaded) {
+ this.delOthersVisitedViews(view)
+ this.addCachedView()
+ },
+ // 删除其它tag
+ delOthersVisitedViews(view: RouteLocationNormalizedLoaded) {
+ this.visitedViews = this.visitedViews.filter((v) => {
+ return v?.meta?.affix || v.path === view.path
+ })
+ },
+ // 删除左侧
+ delLeftViews(view: RouteLocationNormalizedLoaded) {
+ const index = findIndex(
+ this.visitedViews,
+ (v) => v.path === view.path
+ )
+ if (index > -1) {
+ this.visitedViews = this.visitedViews.filter((v, i) => {
+ return v?.meta?.affix || v.path === view.path || i > index
+ })
+ this.addCachedView()
+ }
+ },
+ // 删除右侧
+ delRightViews(view: RouteLocationNormalizedLoaded) {
+ const index = findIndex(
+ this.visitedViews,
+ (v) => v.path === view.path
+ )
+ if (index > -1) {
+ this.visitedViews = this.visitedViews.filter((v, i) => {
+ return v?.meta?.affix || v.path === view.path || i < index
+ })
+ this.addCachedView()
+ }
+ },
+ updateVisitedView(view: RouteLocationNormalizedLoaded) {
+ for (let v of this.visitedViews) {
+ if (v.path === view.path) {
+ v = Object.assign(v, view)
+ break
+ }
+ }
+ },
+ // 设置当前选中的tag
+ setSelectedTag(tag: RouteLocationNormalizedLoaded) {
+ this.selectedTag = tag
+ },
+ setTitle(title: string, path?: string) {
+ for (const v of this.visitedViews) {
+ if (v.path === (path ?? this.selectedTag?.path)) {
+ v.meta.title = title
+ break
+ }
+ }
+ }
+ },
+ persist: false
+})
+
+export const useTagsViewStoreWithOut = () => {
+ return useTagsViewStore(store)
+}
diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts
new file mode 100644
index 0000000..b29a2b7
--- /dev/null
+++ b/src/store/modules/user.ts
@@ -0,0 +1,102 @@
+import { defineStore } from 'pinia'
+import { store } from '../index'
+import { UserLoginType, UserType } from '@/api/login/types'
+import { ElMessageBox } from 'element-plus'
+import { useI18n } from '@/hooks/web/useI18n'
+import { loginOutApi } from '@/api/login'
+import { useTagsViewStore } from './tagsView'
+import router from '@/router'
+
+interface UserState {
+ userInfo?: UserType
+ tokenKey: string
+ token: string
+ roleRouters?: string[] | AppCustomRouteRecordRaw[]
+ rememberMe: boolean
+ loginInfo?: UserLoginType
+}
+
+export const useUserStore = defineStore('user', {
+ state: (): UserState => {
+ return {
+ userInfo: undefined,
+ tokenKey: 'Authorization',
+ token: '',
+ roleRouters: undefined,
+ // 记住我
+ rememberMe: true,
+ loginInfo: undefined
+ }
+ },
+ getters: {
+ getTokenKey(): string {
+ return this.tokenKey
+ },
+ getToken(): string {
+ return this.token
+ },
+ getUserInfo(): UserType | undefined {
+ return this.userInfo
+ },
+ getRoleRouters(): string[] | AppCustomRouteRecordRaw[] | undefined {
+ return this.roleRouters
+ },
+ getRememberMe(): boolean {
+ return this.rememberMe
+ },
+ getLoginInfo(): UserLoginType | undefined {
+ return this.loginInfo
+ }
+ },
+ actions: {
+ setTokenKey(tokenKey: string) {
+ this.tokenKey = tokenKey
+ },
+ setToken(token: string) {
+ this.token = token
+ },
+ setUserInfo(userInfo?: UserType) {
+ this.userInfo = userInfo
+ },
+ setRoleRouters(roleRouters: string[] | AppCustomRouteRecordRaw[]) {
+ this.roleRouters = roleRouters
+ },
+ logoutConfirm() {
+ const { t } = useI18n()
+ ElMessageBox.confirm(t('common.loginOutMessage'), t('common.reminder'), {
+ confirmButtonText: t('common.ok'),
+ cancelButtonText: t('common.cancel'),
+ type: 'warning'
+ })
+ .then(async () => {
+ const res = await loginOutApi().catch(() => {})
+ if (res) {
+ this.reset()
+ }
+ })
+ .catch(() => {})
+ },
+ reset() {
+ const tagsViewStore = useTagsViewStore()
+ tagsViewStore.delAllViews()
+ this.setToken('')
+ this.setUserInfo(undefined)
+ this.setRoleRouters([])
+ router.replace('/login')
+ },
+ logout() {
+ this.reset()
+ },
+ setRememberMe(rememberMe: boolean) {
+ this.rememberMe = rememberMe
+ },
+ setLoginInfo(loginInfo: UserLoginType | undefined) {
+ this.loginInfo = loginInfo
+ }
+ },
+ persist: true
+})
+
+export const useUserStoreWithOut = () => {
+ return useUserStore(store)
+}
diff --git a/src/styles/index.less b/src/styles/index.less
new file mode 100644
index 0000000..6825d70
--- /dev/null
+++ b/src/styles/index.less
@@ -0,0 +1,7 @@
+@import './var.css';
+@import 'element-plus/theme-chalk/dark/css-vars.css';
+
+// 解决抽屉弹出时,body宽度变化的问题
+.el-popup-parent--hidden {
+ width: 100% !important;
+}
diff --git a/src/styles/var.css b/src/styles/var.css
new file mode 100644
index 0000000..fb869ec
--- /dev/null
+++ b/src/styles/var.css
@@ -0,0 +1,69 @@
+:root {
+ --login-bg-color: #293146;
+
+ /* left menu start */
+ --left-menu-max-width: 200px;
+
+ --left-menu-min-width: 64px;
+
+ --left-menu-bg-color: #001529;
+
+ --left-menu-bg-light-color: #0f2438;
+
+ --left-menu-bg-active-color: var(--el-color-primary);
+
+ --left-menu-text-color: #bfcbd9;
+
+ --left-menu-text-active-color: #fff;
+
+ --left-menu-collapse-bg-active-color: var(--el-color-primary);
+ /* left menu end */
+
+ /* logo start */
+ --logo-height: 50px;
+
+ --logo-title-text-color: #fff;
+ /* logo end */
+
+ /* header start */
+ --top-header-bg-color: '#fff';
+
+ --top-header-text-color: 'inherit';
+
+ --top-header-hover-color: #f6f6f6;
+
+ --top-tool-height: var(--logo-height);
+
+ --top-tool-p-x: 0;
+
+ --tags-view-height: 35px;
+ /* header start */
+
+ /* tab menu start */
+ --tab-menu-max-width: 80px;
+
+ --tab-menu-min-width: 30px;
+
+ --tab-menu-collapse-height: 36px;
+ /* tab menu end */
+
+ --app-content-padding: 20px;
+
+ --app-content-bg-color: #f5f7f9;
+
+ --app-footer-height: 50px;
+
+ --transition-time-02: 0.2s;
+}
+
+.dark {
+ --app-content-bg-color: var(--el-bg-color);
+}
+
+*,
+:after,
+:before {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
diff --git a/src/styles/variables.module.less b/src/styles/variables.module.less
new file mode 100644
index 0000000..a773269
--- /dev/null
+++ b/src/styles/variables.module.less
@@ -0,0 +1,10 @@
+// 命名空间
+@adminNamespace: v;
+// el命名空间
+@elNamespace: el;
+
+// 导出变量
+:export {
+ namespace: @adminNamespace;
+ elNamespace: @elNamespace;
+}
diff --git a/src/utils/color.ts b/src/utils/color.ts
new file mode 100644
index 0000000..387ffc6
--- /dev/null
+++ b/src/utils/color.ts
@@ -0,0 +1,172 @@
+/**
+ * 判断是否 十六进制颜色值.
+ * 输入形式可为 #fff000 #f00
+ *
+ * @param String color 十六进制颜色值
+ * @return Boolean
+ */
+export const isHexColor = (color: string) => {
+ const reg = /^#([0-9a-fA-F]{3}|[0-9a-fA-f]{6})$/
+ return reg.test(color)
+}
+
+/**
+ * RGB 颜色值转换为 十六进制颜色值.
+ * r, g, 和 b 需要在 [0, 255] 范围内
+ *
+ * @return String 类似#ff00ff
+ * @param r
+ * @param g
+ * @param b
+ */
+export const rgbToHex = (r: number, g: number, b: number) => {
+ // tslint:disable-next-line:no-bitwise
+ const hex = ((r << 16) | (g << 8) | b).toString(16)
+ return '#' + new Array(Math.abs(hex.length - 7)).join('0') + hex
+}
+
+/**
+ * Transform a HEX color to its RGB representation
+ * @param {string} hex The color to transform
+ * @returns The RGB representation of the passed color
+ */
+export const hexToRGB = (hex: string, opacity?: number) => {
+ let sHex = hex.toLowerCase()
+ if (isHexColor(hex)) {
+ if (sHex.length === 4) {
+ let sColorNew = '#'
+ for (let i = 1; i < 4; i += 1) {
+ sColorNew += sHex.slice(i, i + 1).concat(sHex.slice(i, i + 1))
+ }
+ sHex = sColorNew
+ }
+ const sColorChange: number[] = []
+ for (let i = 1; i < 7; i += 2) {
+ sColorChange.push(parseInt('0x' + sHex.slice(i, i + 2)))
+ }
+ return opacity
+ ? 'RGBA(' + sColorChange.join(',') + ',' + opacity + ')'
+ : 'RGB(' + sColorChange.join(',') + ')'
+ }
+ return sHex
+}
+
+export const colorIsDark = (color: string) => {
+ if (!isHexColor(color)) return
+ const [r, g, b] = hexToRGB(color)
+ .replace(/(?:\(|\)|rgb|RGB)*/g, '')
+ .split(',')
+ .map((item) => Number(item))
+ return r * 0.299 + g * 0.578 + b * 0.114 < 192
+}
+
+/**
+ * Darkens a HEX color given the passed percentage
+ * @param {string} color The color to process
+ * @param {number} amount The amount to change the color by
+ * @returns {string} The HEX representation of the processed color
+ */
+export const darken = (color: string, amount: number) => {
+ color = color.indexOf('#') >= 0 ? color.substring(1, color.length) : color
+ amount = Math.trunc((255 * amount) / 100)
+ return `#${subtractLight(color.substring(0, 2), amount)}${subtractLight(
+ color.substring(2, 4),
+ amount
+ )}${subtractLight(color.substring(4, 6), amount)}`
+}
+
+/**
+ * Lightens a 6 char HEX color according to the passed percentage
+ * @param {string} color The color to change
+ * @param {number} amount The amount to change the color by
+ * @returns {string} The processed color represented as HEX
+ */
+export const lighten = (color: string, amount: number) => {
+ color = color.indexOf('#') >= 0 ? color.substring(1, color.length) : color
+ amount = Math.trunc((255 * amount) / 100)
+ return `#${addLight(color.substring(0, 2), amount)}${addLight(
+ color.substring(2, 4),
+ amount
+ )}${addLight(color.substring(4, 6), amount)}`
+}
+
+/* Suma el porcentaje indicado a un color (RR, GG o BB) hexadecimal para aclararlo */
+/**
+ * Sums the passed percentage to the R, G or B of a HEX color
+ * @param {string} color The color to change
+ * @param {number} amount The amount to change the color by
+ * @returns {string} The processed part of the color
+ */
+const addLight = (color: string, amount: number) => {
+ const cc = parseInt(color, 16) + amount
+ const c = cc > 255 ? 255 : cc
+ return c.toString(16).length > 1 ? c.toString(16) : `0${c.toString(16)}`
+}
+
+/**
+ * Calculates luminance of an rgb color
+ * @param {number} r red
+ * @param {number} g green
+ * @param {number} b blue
+ */
+const luminanace = (r: number, g: number, b: number) => {
+ const a = [r, g, b].map((v) => {
+ v /= 255
+ return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4)
+ })
+ return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722
+}
+
+/**
+ * Calculates contrast between two rgb colors
+ * @param {string} rgb1 rgb color 1
+ * @param {string} rgb2 rgb color 2
+ */
+const contrast = (rgb1: string[], rgb2: number[]) => {
+ return (
+ (luminanace(~~rgb1[0], ~~rgb1[1], ~~rgb1[2]) + 0.05) /
+ (luminanace(rgb2[0], rgb2[1], rgb2[2]) + 0.05)
+ )
+}
+
+/**
+ * Determines what the best text color is (black or white) based con the contrast with the background
+ * @param hexColor - Last selected color by the user
+ */
+export const calculateBestTextColor = (hexColor: string) => {
+ const rgbColor = hexToRGB(hexColor.substring(1))
+ const contrastWithBlack = contrast(rgbColor.split(','), [0, 0, 0])
+
+ return contrastWithBlack >= 12 ? '#000000' : '#FFFFFF'
+}
+
+/**
+ * Subtracts the indicated percentage to the R, G or B of a HEX color
+ * @param {string} color The color to change
+ * @param {number} amount The amount to change the color by
+ * @returns {string} The processed part of the color
+ */
+const subtractLight = (color: string, amount: number) => {
+ const cc = parseInt(color, 16) - amount
+ const c = cc < 0 ? 0 : cc
+ return c.toString(16).length > 1 ? c.toString(16) : `0${c.toString(16)}`
+}
+
+/**
+ * Mixes two colors.
+ *
+ * @param {string} color1 - The first color, should be a 6-digit hexadecimal color code starting with `#`.
+ * @param {string} color2 - The second color, should be a 6-digit hexadecimal color code starting with `#`.
+ * @param {number} [weight=0.5] - The weight of color1 in the mix, should be a number between 0 and 1, where 0 represents 100% of color2, and 1 represents 100% of color1.
+ * @returns {string} The mixed color, a 6-digit hexadecimal color code starting with `#`.
+ */
+export const mix = (color1: string, color2: string, weight: number = 0.5): string => {
+ let color = '#'
+ for (let i = 0; i <= 2; i++) {
+ const c1 = parseInt(color1.substring(1 + i * 2, 3 + i * 2), 16)
+ const c2 = parseInt(color2.substring(1 + i * 2, 3 + i * 2), 16)
+ const c = Math.round(c1 * weight + c2 * (1 - weight))
+ color += c.toString(16).padStart(2, '0')
+ }
+ return color
+}
diff --git a/src/utils/dateUtil.ts b/src/utils/dateUtil.ts
new file mode 100644
index 0000000..36b87e3
--- /dev/null
+++ b/src/utils/dateUtil.ts
@@ -0,0 +1,17 @@
+/**
+ * Independent time operation tool to facilitate subsequent switch to dayjs
+ */
+import dayjs from 'dayjs'
+
+const DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss'
+const DATE_FORMAT = 'YYYY-MM-DD'
+
+export function formatToDateTime(date?: dayjs.ConfigType, format = DATE_TIME_FORMAT): string {
+ return dayjs(date).format(format)
+}
+
+export function formatToDate(date?: dayjs.ConfigType, format = DATE_FORMAT): string {
+ return dayjs(date).format(format)
+}
+
+export const dateUtil = dayjs
diff --git a/src/utils/domUtils.ts b/src/utils/domUtils.ts
new file mode 100644
index 0000000..dbc1989
--- /dev/null
+++ b/src/utils/domUtils.ts
@@ -0,0 +1,289 @@
+import { isServer } from './is'
+const ieVersion = isServer ? 0 : Number((document as any).documentMode)
+const SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g
+const MOZ_HACK_REGEXP = /^moz([A-Z])/
+
+export interface ViewportOffsetResult {
+ left: number
+ top: number
+ right: number
+ bottom: number
+ rightIncludeBody: number
+ bottomIncludeBody: number
+}
+
+/* istanbul ignore next */
+const trim = function (string: string) {
+ return (string || '').replace(/^[\s\uFEFF]+|[\s\uFEFF]+$/g, '')
+}
+
+/* istanbul ignore next */
+const camelCase = function (name: string) {
+ return name
+ .replace(SPECIAL_CHARS_REGEXP, function (_, __, letter, offset) {
+ return offset ? letter.toUpperCase() : letter
+ })
+ .replace(MOZ_HACK_REGEXP, 'Moz$1')
+}
+
+/* istanbul ignore next */
+export function hasClass(el: Element, cls: string) {
+ if (!el || !cls) return false
+ if (cls.indexOf(' ') !== -1) {
+ throw new Error('className should not contain space.')
+ }
+ if (el.classList) {
+ return el.classList.contains(cls)
+ } else {
+ return (' ' + el.className + ' ').indexOf(' ' + cls + ' ') > -1
+ }
+}
+
+/* istanbul ignore next */
+export function addClass(el: Element, cls: string) {
+ if (!el) return
+ let curClass = el.className
+ const classes = (cls || '').split(' ')
+
+ for (let i = 0, j = classes.length; i < j; i++) {
+ const clsName = classes[i]
+ if (!clsName) continue
+
+ if (el.classList) {
+ el.classList.add(clsName)
+ } else if (!hasClass(el, clsName)) {
+ curClass += ' ' + clsName
+ }
+ }
+ if (!el.classList) {
+ el.className = curClass
+ }
+}
+
+/* istanbul ignore next */
+export function removeClass(el: Element, cls: string) {
+ if (!el || !cls) return
+ const classes = cls.split(' ')
+ let curClass = ' ' + el.className + ' '
+
+ for (let i = 0, j = classes.length; i < j; i++) {
+ const clsName = classes[i]
+ if (!clsName) continue
+
+ if (el.classList) {
+ el.classList.remove(clsName)
+ } else if (hasClass(el, clsName)) {
+ curClass = curClass.replace(' ' + clsName + ' ', ' ')
+ }
+ }
+ if (!el.classList) {
+ el.className = trim(curClass)
+ }
+}
+
+export function getBoundingClientRect(element: Element): DOMRect | number {
+ if (!element || !element.getBoundingClientRect) {
+ return 0
+ }
+ return element.getBoundingClientRect()
+}
+
+/**
+ * 获取当前元素的left、top偏移
+ * left:元素最左侧距离文档左侧的距离
+ * top:元素最顶端距离文档顶端的距离
+ * right:元素最右侧距离文档右侧的距离
+ * bottom:元素最底端距离文档底端的距离
+ * rightIncludeBody:元素最左侧距离文档右侧的距离
+ * bottomIncludeBody:元素最底端距离文档最底部的距离
+ *
+ * @description:
+ */
+export function getViewportOffset(element: Element): ViewportOffsetResult {
+ const doc = document.documentElement
+
+ const docScrollLeft = doc.scrollLeft
+ const docScrollTop = doc.scrollTop
+ const docClientLeft = doc.clientLeft
+ const docClientTop = doc.clientTop
+
+ const pageXOffset = window.pageXOffset
+ const pageYOffset = window.pageYOffset
+
+ const box = getBoundingClientRect(element)
+
+ const { left: retLeft, top: rectTop, width: rectWidth, height: rectHeight } = box as DOMRect
+
+ const scrollLeft = (pageXOffset || docScrollLeft) - (docClientLeft || 0)
+ const scrollTop = (pageYOffset || docScrollTop) - (docClientTop || 0)
+ const offsetLeft = retLeft + pageXOffset
+ const offsetTop = rectTop + pageYOffset
+
+ const left = offsetLeft - scrollLeft
+ const top = offsetTop - scrollTop
+
+ const clientWidth = window.document.documentElement.clientWidth
+ const clientHeight = window.document.documentElement.clientHeight
+ return {
+ left: left,
+ top: top,
+ right: clientWidth - rectWidth - left,
+ bottom: clientHeight - rectHeight - top,
+ rightIncludeBody: clientWidth - left,
+ bottomIncludeBody: clientHeight - top
+ }
+}
+
+/* istanbul ignore next */
+export const on = function (
+ element: HTMLElement | Document | Window,
+ event: string,
+ handler: EventListenerOrEventListenerObject
+): void {
+ if (element && event && handler) {
+ element.addEventListener(event, handler, false)
+ }
+}
+
+/* istanbul ignore next */
+export const off = function (
+ element: HTMLElement | Document | Window,
+ event: string,
+ handler: any
+): void {
+ if (element && event && handler) {
+ element.removeEventListener(event, handler, false)
+ }
+}
+
+/* istanbul ignore next */
+export const once = function (el: HTMLElement, event: string, fn: EventListener): void {
+ const listener = function (this: any, ...args: unknown[]) {
+ if (fn) {
+ // @ts-ignore
+ fn.apply(this, args)
+ }
+ off(el, event, listener)
+ }
+ on(el, event, listener)
+}
+
+/* istanbul ignore next */
+export const getStyle =
+ ieVersion < 9
+ ? function (element: Element | any, styleName: string) {
+ if (isServer) return
+ if (!element || !styleName) return null
+ styleName = camelCase(styleName)
+ if (styleName === 'float') {
+ styleName = 'styleFloat'
+ }
+ try {
+ switch (styleName) {
+ case 'opacity':
+ try {
+ return element.filters.item('alpha').opacity / 100
+ } catch (e) {
+ return 1.0
+ }
+ default:
+ return element.style[styleName] || element.currentStyle
+ ? element.currentStyle[styleName]
+ : null
+ }
+ } catch (e) {
+ return element.style[styleName]
+ }
+ }
+ : function (element: Element | any, styleName: string) {
+ if (isServer) return
+ if (!element || !styleName) return null
+ styleName = camelCase(styleName)
+ if (styleName === 'float') {
+ styleName = 'cssFloat'
+ }
+ try {
+ const computed = (document as any).defaultView.getComputedStyle(element, '')
+ return element.style[styleName] || computed ? computed[styleName] : null
+ } catch (e) {
+ return element.style[styleName]
+ }
+ }
+
+/* istanbul ignore next */
+export function setStyle(element: Element | any, styleName: any, value: any) {
+ if (!element || !styleName) return
+
+ if (typeof styleName === 'object') {
+ for (const prop in styleName) {
+ if (Object.prototype.hasOwnProperty.call(styleName, prop)) {
+ setStyle(element, prop, styleName[prop])
+ }
+ }
+ } else {
+ styleName = camelCase(styleName)
+ if (styleName === 'opacity' && ieVersion < 9) {
+ element.style.filter = isNaN(value) ? '' : 'alpha(opacity=' + value * 100 + ')'
+ } else {
+ element.style[styleName] = value
+ }
+ }
+}
+
+/* istanbul ignore next */
+export const isScroll = (el: Element, vertical: any) => {
+ if (isServer) return
+
+ const determinedDirection = vertical !== null || vertical !== undefined
+ const overflow = determinedDirection
+ ? vertical
+ ? getStyle(el, 'overflow-y')
+ : getStyle(el, 'overflow-x')
+ : getStyle(el, 'overflow')
+
+ return overflow.match(/(scroll|auto)/)
+}
+
+/* istanbul ignore next */
+export const getScrollContainer = (el: Element, vertical?: any) => {
+ if (isServer) return
+
+ let parent: any = el
+ while (parent) {
+ if ([window, document, document.documentElement].includes(parent)) {
+ return window
+ }
+ if (isScroll(parent, vertical)) {
+ return parent
+ }
+ parent = parent.parentNode
+ }
+
+ return parent
+}
+
+/* istanbul ignore next */
+export const isInContainer = (el: Element, container: any) => {
+ if (isServer || !el || !container) return false
+
+ const elRect = el.getBoundingClientRect()
+ let containerRect
+
+ if ([window, document, document.documentElement, null, undefined].includes(container)) {
+ containerRect = {
+ top: 0,
+ right: window.innerWidth,
+ bottom: window.innerHeight,
+ left: 0
+ }
+ } else {
+ containerRect = container.getBoundingClientRect()
+ }
+
+ return (
+ elRect.top < containerRect.bottom &&
+ elRect.bottom > containerRect.top &&
+ elRect.right > containerRect.left &&
+ elRect.left < containerRect.right
+ )
+}
diff --git a/src/utils/index.ts b/src/utils/index.ts
new file mode 100644
index 0000000..d91b679
--- /dev/null
+++ b/src/utils/index.ts
@@ -0,0 +1,136 @@
+/**
+ *
+ * @param component 需要注册的组件
+ * @param alias 组件别名
+ * @returns any
+ */
+export const withInstall = (component: T, alias?: string) => {
+ const comp = component as any
+ comp.install = (app: any) => {
+ app.component(comp.name || comp.displayName, component)
+ if (alias) {
+ app.config.globalProperties[alias] = component
+ }
+ }
+ return component as T & Plugin
+}
+
+/**
+ * @param str 需要转下划线的驼峰字符串
+ * @returns 字符串下划线
+ */
+export const humpToUnderline = (str: string): string => {
+ return str.replace(/([A-Z])/g, '-$1').toLowerCase()
+}
+
+/**
+ * @param str 需要转驼峰的下划线字符串
+ * @returns 字符串驼峰
+ */
+export const underlineToHump = (str: string): string => {
+ if (!str) return ''
+ return str.replace(/\-(\w)/g, (_, letter: string) => {
+ return letter.toUpperCase()
+ })
+}
+
+/**
+ * 驼峰转横杠
+ */
+export const humpToDash = (str: string): string => {
+ return str.replace(/([A-Z])/g, '-$1').toLowerCase()
+}
+
+export const setCssVar = (prop: string, val: any, dom = document.documentElement) => {
+ dom.style.setProperty(prop, val)
+}
+
+export const getCssVar = (prop: string, dom = document.documentElement) => {
+ return getComputedStyle(dom).getPropertyValue(prop)
+}
+
+/**
+ * 查找数组对象的某个下标
+ * @param {Array} ary 查找的数组
+ * @param {Functon} fn 判断的方法
+ */
+export const findIndex = (ary: Array, fn: Fn): number => {
+ if (ary.findIndex) {
+ return ary.findIndex(fn)
+ }
+ let index = -1
+ ary.some((item: T, i: number, ary: Array) => {
+ const ret: T = fn(item, i, ary)
+ if (ret) {
+ index = i
+ return ret
+ }
+ })
+ return index
+}
+
+export const trim = (str: string) => {
+ return str.replace(/(^\s*)|(\s*$)/g, '')
+}
+
+/**
+ * @param {Date | number | string} time 需要转换的时间
+ * @param {String} fmt 需要转换的格式 如 yyyy-MM-dd、yyyy-MM-dd HH:mm:ss
+ */
+export function formatTime(time: Date | number | string, fmt: string) {
+ if (!time) return ''
+ else {
+ const date = new Date(time)
+ const o = {
+ 'M+': date.getMonth() + 1,
+ 'd+': date.getDate(),
+ 'H+': date.getHours(),
+ 'm+': date.getMinutes(),
+ 's+': date.getSeconds(),
+ 'q+': Math.floor((date.getMonth() + 3) / 3),
+ S: date.getMilliseconds()
+ }
+ if (/(y+)/.test(fmt)) {
+ fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
+ }
+ for (const k in o) {
+ if (new RegExp('(' + k + ')').test(fmt)) {
+ fmt = fmt.replace(
+ RegExp.$1,
+ RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
+ )
+ }
+ }
+ return fmt
+ }
+}
+
+/**
+ * 生成随机字符串
+ */
+export function toAnyString() {
+ const str: string = 'xxxxx-xxxxx-4xxxx-yxxxx-xxxxx'.replace(/[xy]/g, (c: string) => {
+ const r: number = (Math.random() * 16) | 0
+ const v: number = c === 'x' ? r : (r & 0x3) | 0x8
+ return v.toString()
+ })
+ return str
+}
+
+/**
+ * 首字母大写
+ */
+export function firstUpperCase(str: string) {
+ return str.toLowerCase().replace(/( |^)[a-z]/g, (L) => L.toUpperCase())
+}
+
+/**
+ * 把对象转为formData
+ */
+export function objToFormData(obj: Recordable) {
+ const formData = new FormData()
+ Object.keys(obj).forEach((key) => {
+ formData.append(key, obj[key])
+ })
+ return formData
+}
diff --git a/src/utils/is.ts b/src/utils/is.ts
new file mode 100644
index 0000000..1651420
--- /dev/null
+++ b/src/utils/is.ts
@@ -0,0 +1,117 @@
+// copy to vben-admin
+
+const toString = Object.prototype.toString
+
+export const is = (val: unknown, type: string) => {
+ return toString.call(val) === `[object ${type}]`
+}
+
+export const isDef = (val?: T): val is T => {
+ return typeof val !== 'undefined'
+}
+
+export const isUnDef = (val?: T): val is T => {
+ return !isDef(val)
+}
+
+export const isObject = (val: any): val is Record => {
+ return val !== null && is(val, 'Object')
+}
+
+export const isEmpty = (val: T): val is T => {
+ if (isArray(val) || isString(val)) {
+ return val.length === 0
+ }
+
+ if (val instanceof Map || val instanceof Set) {
+ return val.size === 0
+ }
+
+ if (isObject(val)) {
+ return Object.keys(val).length === 0
+ }
+
+ return false
+}
+
+export const isDate = (val: unknown): val is Date => {
+ return is(val, 'Date')
+}
+
+export const isNull = (val: unknown): val is null => {
+ return val === null
+}
+
+export const isNullAndUnDef = (val: unknown): val is null | undefined => {
+ return isUnDef(val) && isNull(val)
+}
+
+export const isNullOrUnDef = (val: unknown): val is null | undefined => {
+ return isUnDef(val) || isNull(val)
+}
+
+export const isNumber = (val: unknown): val is number => {
+ return is(val, 'Number')
+}
+
+export const isPromise = (val: unknown): val is Promise => {
+ return is(val, 'Promise') && isObject(val) && isFunction(val.then) && isFunction(val.catch)
+}
+
+export const isString = (val: unknown): val is string => {
+ return is(val, 'String')
+}
+
+export const isFunction = (val: unknown): val is Function => {
+ return typeof val === 'function'
+}
+
+export const isBoolean = (val: unknown): val is boolean => {
+ return is(val, 'Boolean')
+}
+
+export const isRegExp = (val: unknown): val is RegExp => {
+ return is(val, 'RegExp')
+}
+
+export const isArray = (val: any): val is Array => {
+ return val && Array.isArray(val)
+}
+
+export const isWindow = (val: any): val is Window => {
+ return typeof window !== 'undefined' && is(val, 'Window')
+}
+
+export const isElement = (val: unknown): val is Element => {
+ return isObject(val) && !!val.tagName
+}
+
+export const isMap = (val: unknown): val is Map => {
+ return is(val, 'Map')
+}
+
+export const isServer = typeof window === 'undefined'
+
+export const isClient = !isServer
+
+export const isUrl = (path: string): boolean => {
+ try {
+ new URL(path)
+ return true
+ } catch (_error) {
+ return false
+ }
+}
+
+export const isDark = (): boolean => {
+ return window.matchMedia('(prefers-color-scheme: dark)').matches
+}
+
+// 是否是图片链接
+export const isImgPath = (path: string): boolean => {
+ return /(https?:\/\/|data:image\/).*?\.(png|jpg|jpeg|gif|svg|webp|ico)/gi.test(path)
+}
+
+export const isEmptyVal = (val: any): boolean => {
+ return val === '' || val === null || val === undefined
+}
diff --git a/src/utils/propTypes.ts b/src/utils/propTypes.ts
new file mode 100644
index 0000000..863f55c
--- /dev/null
+++ b/src/utils/propTypes.ts
@@ -0,0 +1,24 @@
+import { VueTypeValidableDef, VueTypesInterface, createTypes, toValidableType } from 'vue-types'
+import { CSSProperties } from 'vue'
+
+type PropTypes = VueTypesInterface & {
+ readonly style: VueTypeValidableDef
+}
+const newPropTypes = createTypes({
+ func: undefined,
+ bool: undefined,
+ string: undefined,
+ number: undefined,
+ object: undefined,
+ integer: undefined
+}) as PropTypes
+
+class propTypes extends newPropTypes {
+ static get style() {
+ return toValidableType('style', {
+ type: [String, Object]
+ })
+ }
+}
+
+export { propTypes }
diff --git a/src/utils/routerHelper.ts b/src/utils/routerHelper.ts
new file mode 100644
index 0000000..b4e7548
--- /dev/null
+++ b/src/utils/routerHelper.ts
@@ -0,0 +1,197 @@
+import { createRouter, createWebHashHistory } from 'vue-router'
+import type {
+ Router,
+ RouteLocationNormalized,
+ RouteRecordNormalized,
+ RouteRecordRaw
+} from 'vue-router'
+import { isUrl } from '@/utils/is'
+import { omit, cloneDeep } from 'lodash-es'
+
+const modules = import.meta.glob('../views/**/*.{vue,tsx}')
+
+/* Layout */
+export const Layout = () => import('@/layout/Layout.vue')
+
+export const getParentLayout = () => {
+ return () =>
+ new Promise((resolve) => {
+ resolve({
+ name: 'ParentLayout'
+ })
+ })
+}
+
+export const getRawRoute = (route: RouteLocationNormalized): RouteLocationNormalized => {
+ if (!route) return route
+ const { matched, ...opt } = route
+ return {
+ ...opt,
+ matched: (matched
+ ? matched.map((item) => ({
+ meta: item.meta,
+ name: item.name,
+ path: item.path
+ }))
+ : undefined) as RouteRecordNormalized[]
+ }
+}
+
+// 前端控制路由生成
+export const generateRoutesByFrontEnd = (
+ routes: AppRouteRecordRaw[],
+ keys: string[],
+ basePath = '/'
+): AppRouteRecordRaw[] => {
+ const res: AppRouteRecordRaw[] = []
+
+ for (const route of routes) {
+ const meta = route.meta ?? {}
+ // skip some route
+ if (meta.hidden && !meta.canTo) {
+ continue
+ }
+
+ let data: Nullable = null
+
+ let onlyOneChild: Nullable = null
+ if (route.children && route.children.length === 1 && !meta.alwaysShow) {
+ onlyOneChild = (
+ isUrl(route.children[0].path)
+ ? route.children[0].path
+ : pathResolve(pathResolve(basePath, route.path), route.children[0].path)
+ ) as string
+ }
+
+ // 开发者可以根据实际情况进行扩展
+ for (const item of keys) {
+ // 通过路径去匹配
+ if (isUrl(item) && (onlyOneChild === item || route.path === item)) {
+ data = Object.assign({}, route)
+ } else {
+ const routePath = (onlyOneChild ?? pathResolve(basePath, route.path)).trim()
+ if (routePath === item || meta.followRoute === item) {
+ data = Object.assign({}, route)
+ }
+ }
+ }
+
+ // recursive child routes
+ if (route.children && data) {
+ data.children = generateRoutesByFrontEnd(
+ route.children,
+ keys,
+ pathResolve(basePath, data.path)
+ )
+ }
+ if (data) {
+ res.push(data as AppRouteRecordRaw)
+ }
+ }
+ return res
+}
+
+// 后端控制路由生成
+export const generateRoutesByServer = (routes: AppCustomRouteRecordRaw[]): AppRouteRecordRaw[] => {
+ const res: AppRouteRecordRaw[] = []
+
+ for (const route of routes) {
+ const data: AppRouteRecordRaw = {
+ path: route.path,
+ name: route.name,
+ redirect: route.redirect,
+ meta: route.meta
+ }
+ if (route.component) {
+ const comModule = modules[`../${route.component}.vue`] || modules[`../${route.component}.tsx`]
+ const component = route.component as string
+ if (!comModule && !component.includes('#')) {
+ console.error(`未找到${route.component}.vue文件或${route.component}.tsx文件,请创建`)
+ } else {
+ // 动态加载路由文件,可根据实际情况进行自定义逻辑
+ data.component =
+ component === '#' ? Layout : component.includes('##') ? getParentLayout() : comModule
+ }
+ }
+ // recursive child routes
+ if (route.children) {
+ data.children = generateRoutesByServer(route.children)
+ }
+ res.push(data as AppRouteRecordRaw)
+ }
+ return res
+}
+
+export const pathResolve = (parentPath: string, path: string) => {
+ if (isUrl(path)) return path
+ const childPath = path.startsWith('/') || !path ? path : `/${path}`
+ return `${parentPath}${childPath}`.replace(/\/\//g, '/').trim()
+}
+
+// 路由降级
+export const flatMultiLevelRoutes = (routes: AppRouteRecordRaw[]) => {
+ const modules: AppRouteRecordRaw[] = cloneDeep(routes)
+ for (let index = 0; index < modules.length; index++) {
+ const route = modules[index]
+ if (!isMultipleRoute(route)) {
+ continue
+ }
+ promoteRouteLevel(route)
+ }
+ return modules
+}
+
+// 层级是否大于2
+const isMultipleRoute = (route: AppRouteRecordRaw) => {
+ if (!route || !Reflect.has(route, 'children') || !route.children?.length) {
+ return false
+ }
+
+ const children = route.children
+
+ let flag = false
+ for (let index = 0; index < children.length; index++) {
+ const child = children[index]
+ if (child.children?.length) {
+ flag = true
+ break
+ }
+ }
+ return flag
+}
+
+// 生成二级路由
+const promoteRouteLevel = (route: AppRouteRecordRaw) => {
+ let router: Router | null = createRouter({
+ routes: [route as RouteRecordRaw],
+ history: createWebHashHistory()
+ })
+
+ const routes = router.getRoutes()
+ addToChildren(routes, route.children || [], route)
+ router = null
+
+ route.children = route.children?.map((item) => omit(item, 'children'))
+}
+
+// 添加所有子菜单
+const addToChildren = (
+ routes: RouteRecordNormalized[],
+ children: AppRouteRecordRaw[],
+ routeModule: AppRouteRecordRaw
+) => {
+ for (let index = 0; index < children.length; index++) {
+ const child = children[index]
+ const route = routes.find((item) => item.name === child.name)
+ if (!route) {
+ continue
+ }
+ routeModule.children = routeModule.children || []
+ if (!routeModule.children.find((item) => item.name === route.name)) {
+ routeModule.children?.push(route as unknown as AppRouteRecordRaw)
+ }
+ if (child.children?.length) {
+ addToChildren(routes, child.children, routeModule)
+ }
+ }
+}
diff --git a/src/utils/tree.ts b/src/utils/tree.ts
new file mode 100644
index 0000000..fe0207d
--- /dev/null
+++ b/src/utils/tree.ts
@@ -0,0 +1,207 @@
+interface TreeHelperConfig {
+ id: string
+ children: string
+ pid: string
+}
+const DEFAULT_CONFIG: TreeHelperConfig = {
+ id: 'id',
+ children: 'children',
+ pid: 'pid'
+}
+
+const getConfig = (config: Partial) => Object.assign({}, DEFAULT_CONFIG, config)
+
+// tree from list
+export const listToTree = (list: any[], config: Partial = {}): T[] => {
+ const conf = getConfig(config) as TreeHelperConfig
+ const nodeMap = new Map()
+ const result: T[] = []
+ const { id, children, pid } = conf
+
+ for (const node of list) {
+ node[children] = node[children] || []
+ nodeMap.set(node[id], node)
+ }
+ for (const node of list) {
+ const parent = nodeMap.get(node[pid])
+ ;(parent ? parent.children : result).push(node)
+ }
+ return result
+}
+
+export const treeToList = (tree: any, config: Partial = {}): T => {
+ config = getConfig(config)
+ const { children } = config
+ const result: any = [...tree]
+ for (let i = 0; i < result.length; i++) {
+ if (!result[i][children!]) continue
+ result.splice(i + 1, 0, ...result[i][children!])
+ }
+ return result
+}
+
+export const findNode = (
+ tree: any,
+ func: Fn,
+ config: Partial = {}
+): T | null => {
+ config = getConfig(config)
+ const { children } = config
+ const list = [...tree]
+ for (const node of list) {
+ if (func(node)) return node
+ node[children!] && list.push(...node[children!])
+ }
+ return null
+}
+
+export const findNodeAll = (
+ tree: any,
+ func: Fn,
+ config: Partial = {}
+): T[] => {
+ config = getConfig(config)
+ const { children } = config
+ const list = [...tree]
+ const result: T[] = []
+ for (const node of list) {
+ func(node) && result.push(node)
+ node[children!] && list.push(...node[children!])
+ }
+ return result
+}
+
+export const findPath = (
+ tree: any,
+ func: Fn,
+ config: Partial = {}
+): T | T[] | null => {
+ config = getConfig(config)
+ const path: T[] = []
+ const list = [...tree]
+ const visitedSet = new Set()
+ const { children } = config
+ while (list.length) {
+ const node = list[0]
+ if (visitedSet.has(node)) {
+ path.pop()
+ list.shift()
+ } else {
+ visitedSet.add(node)
+ node[children!] && list.unshift(...node[children!])
+ path.push(node)
+ if (func(node)) {
+ return path
+ }
+ }
+ }
+ return null
+}
+
+export const findPathAll = (tree: any, func: Fn, config: Partial = {}) => {
+ config = getConfig(config)
+ const path: any[] = []
+ const list = [...tree]
+ const result: any[] = []
+ const visitedSet = new Set(),
+ { children } = config
+ while (list.length) {
+ const node = list[0]
+ if (visitedSet.has(node)) {
+ path.pop()
+ list.shift()
+ } else {
+ visitedSet.add(node)
+ node[children!] && list.unshift(...node[children!])
+ path.push(node)
+ func(node) && result.push([...path])
+ }
+ }
+ return result
+}
+
+export const filter = (
+ tree: T[],
+ func: (n: T) => boolean,
+ config: Partial = {}
+): T[] => {
+ config = getConfig(config)
+ const children = config.children as string
+ function listFilter(list: T[]) {
+ return list
+ .map((node: any) => ({ ...node }))
+ .filter((node) => {
+ node[children] = node[children] && listFilter(node[children])
+ return func(node) || (node[children] && node[children].length)
+ })
+ }
+ return listFilter(tree)
+}
+
+export const forEach = (
+ tree: T[],
+ func: (n: T) => any,
+ config: Partial = {}
+): void => {
+ config = getConfig(config)
+ const list: any[] = [...tree]
+ const { children } = config
+ for (let i = 0; i < list.length; i++) {
+ // func 返回true就终止遍历,避免大量节点场景下无意义循环,引起浏览器卡顿
+ if (func(list[i])) {
+ return
+ }
+ children && list[i][children] && list.splice(i + 1, 0, ...list[i][children])
+ }
+}
+
+/**
+ * @description: Extract tree specified structure
+ */
+export const treeMap = (
+ treeData: T[],
+ opt: { children?: string; conversion: Fn }
+): T[] => {
+ return treeData.map((item) => treeMapEach(item, opt))
+}
+
+/**
+ * @description: Extract tree specified structure
+ */
+export const treeMapEach = (
+ data: any,
+ { children = 'children', conversion }: { children?: string; conversion: Fn }
+) => {
+ const haveChildren = Array.isArray(data[children]) && data[children].length > 0
+ const conversionData = conversion(data) || {}
+ if (haveChildren) {
+ return {
+ ...conversionData,
+ [children]: data[children].map((i: number) =>
+ treeMapEach(i, {
+ children,
+ conversion
+ })
+ )
+ }
+ } else {
+ return {
+ ...conversionData
+ }
+ }
+}
+
+/**
+ * 递归遍历树结构
+ * @param treeDatas 树
+ * @param callBack 回调
+ * @param parentNode 父节点
+ */
+export const eachTree = (treeDatas: any[], callBack: Fn, parentNode = {}) => {
+ treeDatas.forEach((element) => {
+ const newNode = callBack(element, parentNode) || element
+ if (element.children) {
+ eachTree(element.children, callBack, newNode)
+ }
+ })
+}
diff --git a/src/utils/tsxHelper.ts b/src/utils/tsxHelper.ts
new file mode 100644
index 0000000..6087fa3
--- /dev/null
+++ b/src/utils/tsxHelper.ts
@@ -0,0 +1,16 @@
+import { Slots } from 'vue'
+import { isFunction } from '@/utils/is'
+
+export const getSlot = (slots: Slots, slot = 'default', data?: Recordable) => {
+ // Reflect.has 判断一个对象是否存在某个属性
+ if (!slots || !Reflect.has(slots, slot)) {
+ return null
+ }
+ if (!isFunction(slots[slot])) {
+ console.error(`${slot} is not a function!`)
+ return null
+ }
+ const slotFn = slots[slot]
+ if (!slotFn) return null
+ return slotFn(data)
+}
diff --git a/src/views/Authorization/Department/Department.vue b/src/views/Authorization/Department/Department.vue
new file mode 100644
index 0000000..c889705
--- /dev/null
+++ b/src/views/Authorization/Department/Department.vue
@@ -0,0 +1,341 @@
+
+
+
+
+
+
+
+ {{ t('exampleDemo.add') }}
+
+ {{ t('exampleDemo.del') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('exampleDemo.save') }}
+
+ {{ t('dialogDemo.close') }}
+
+
+
diff --git a/src/views/Authorization/Department/components/Detail.vue b/src/views/Authorization/Department/components/Detail.vue
new file mode 100644
index 0000000..8262b95
--- /dev/null
+++ b/src/views/Authorization/Department/components/Detail.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
diff --git a/src/views/Authorization/Department/components/Write.vue b/src/views/Authorization/Department/components/Write.vue
new file mode 100644
index 0000000..2c3c527
--- /dev/null
+++ b/src/views/Authorization/Department/components/Write.vue
@@ -0,0 +1,59 @@
+
+
+
+
+
diff --git a/src/views/Authorization/Menu/Menu.vue b/src/views/Authorization/Menu/Menu.vue
new file mode 100644
index 0000000..1ea4fb3
--- /dev/null
+++ b/src/views/Authorization/Menu/Menu.vue
@@ -0,0 +1,212 @@
+
+
+
+
+
+
+ {{ t('exampleDemo.add') }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('exampleDemo.save') }}
+
+ {{ t('dialogDemo.close') }}
+
+
+
diff --git a/src/views/Authorization/Menu/components/AddButtonPermission.vue b/src/views/Authorization/Menu/components/AddButtonPermission.vue
new file mode 100644
index 0000000..32cb3c3
--- /dev/null
+++ b/src/views/Authorization/Menu/components/AddButtonPermission.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+ (modelValue = false)">取消
+ 确认
+
+
+
+
diff --git a/src/views/Authorization/Menu/components/Detail.vue b/src/views/Authorization/Menu/components/Detail.vue
new file mode 100644
index 0000000..54b2cad
--- /dev/null
+++ b/src/views/Authorization/Menu/components/Detail.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
diff --git a/src/views/Authorization/Menu/components/Write.vue b/src/views/Authorization/Menu/components/Write.vue
new file mode 100644
index 0000000..2da8b67
--- /dev/null
+++ b/src/views/Authorization/Menu/components/Write.vue
@@ -0,0 +1,409 @@
+
+
+
+
+
+
diff --git a/src/views/Authorization/Role/Role.vue b/src/views/Authorization/Role/Role.vue
new file mode 100644
index 0000000..4b67c3f
--- /dev/null
+++ b/src/views/Authorization/Role/Role.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+ {{ t('exampleDemo.add') }}
+
+
+
+
+
+
+
+
+
+
+ {{ t('exampleDemo.save') }}
+
+ {{ t('dialogDemo.close') }}
+
+
+
diff --git a/src/views/Authorization/Role/components/Detail.vue b/src/views/Authorization/Role/components/Detail.vue
new file mode 100644
index 0000000..97c1b57
--- /dev/null
+++ b/src/views/Authorization/Role/components/Detail.vue
@@ -0,0 +1,106 @@
+
+
+
+
+
diff --git a/src/views/Authorization/Role/components/Write.vue b/src/views/Authorization/Role/components/Write.vue
new file mode 100644
index 0000000..0169427
--- /dev/null
+++ b/src/views/Authorization/Role/components/Write.vue
@@ -0,0 +1,181 @@
+
+
+
+
+
diff --git a/src/views/Authorization/User/User.vue b/src/views/Authorization/User/User.vue
new file mode 100644
index 0000000..12ad2e2
--- /dev/null
+++ b/src/views/Authorization/User/User.vue
@@ -0,0 +1,384 @@
+
+
+
+
+
+
+
{{ t('userDemo.departmentList') }}
+
+
+
+
+
+
+ {{ data.departmentName }}
+
+
+
+
+
+
+
+
+ {{ t('exampleDemo.add') }}
+
+ {{ t('exampleDemo.del') }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('exampleDemo.save') }}
+
+ {{ t('dialogDemo.close') }}
+
+
+
+
diff --git a/src/views/Authorization/User/components/Detail.vue b/src/views/Authorization/User/components/Detail.vue
new file mode 100644
index 0000000..81dd5ee
--- /dev/null
+++ b/src/views/Authorization/User/components/Detail.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
diff --git a/src/views/Authorization/User/components/Write.vue b/src/views/Authorization/User/components/Write.vue
new file mode 100644
index 0000000..ec60c8a
--- /dev/null
+++ b/src/views/Authorization/User/components/Write.vue
@@ -0,0 +1,60 @@
+
+
+
+
+
diff --git a/src/views/Components/Avatars.vue b/src/views/Components/Avatars.vue
new file mode 100644
index 0000000..430c758
--- /dev/null
+++ b/src/views/Components/Avatars.vue
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
diff --git a/src/views/Components/CountTo.vue b/src/views/Components/CountTo.vue
new file mode 100644
index 0000000..a547e8e
--- /dev/null
+++ b/src/views/Components/CountTo.vue
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+ {{ t('countToDemo.startVal') }}:
+
+
+
+
+
+ {{ t('countToDemo.endVal') }}:
+
+
+
+
+
+ {{ t('countToDemo.duration') }}:
+
+
+
+
+
+ {{ t('countToDemo.separator') }}:
+
+
+
+
+
+ {{ t('countToDemo.prefix') }}:
+
+
+
+
+
+ {{ t('countToDemo.suffix') }}:
+
+
+
+
+
+ {{ t('countToDemo.start') }}
+
+ {{ t('countToDemo.pause') }}/{{ t('countToDemo.resume') }}
+
+
+
+
+
+
diff --git a/src/views/Components/Descriptions.vue b/src/views/Components/Descriptions.vue
new file mode 100644
index 0000000..4b96bf6
--- /dev/null
+++ b/src/views/Components/Descriptions.vue
@@ -0,0 +1,192 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/Components/Dialog.vue b/src/views/Components/Dialog.vue
new file mode 100644
index 0000000..33726e4
--- /dev/null
+++ b/src/views/Components/Dialog.vue
@@ -0,0 +1,165 @@
+
+
+
+
+
+ {{ t('dialogDemo.open') }}
+
+
+
+ {{ t('dialogDemo.combineWithForm') }}
+
+
+
+
+
+ {{ t('dialogDemo.close') }}
+
+
+
+
+
+
+ {{ t('dialogDemo.submit') }}
+ {{ t('dialogDemo.close') }}
+
+
+
+
+
+
+ {{ t('dialogDemo.open') }}
+
+
+
+ {{ t('dialogDemo.combineWithForm') }}
+
+
+
+
+
+ {{ t('dialogDemo.close') }}
+
+
+
+
+
+
+ {{ t('dialogDemo.submit') }}
+ {{ t('dialogDemo.close') }}
+
+
+
+
diff --git a/src/views/Components/Echart.vue b/src/views/Components/Echart.vue
new file mode 100644
index 0000000..683d6b4
--- /dev/null
+++ b/src/views/Components/Echart.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/Components/Editor/CodeEditor.vue b/src/views/Components/Editor/CodeEditor.vue
new file mode 100644
index 0000000..db80bb0
--- /dev/null
+++ b/src/views/Components/Editor/CodeEditor.vue
@@ -0,0 +1,23 @@
+
+
+
+ 控制台打印内容
+
+
+
+
+
+
diff --git a/src/views/Components/Editor/Editor.vue b/src/views/Components/Editor/Editor.vue
new file mode 100644
index 0000000..9dde431
--- /dev/null
+++ b/src/views/Components/Editor/Editor.vue
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
diff --git a/src/views/Components/Editor/JsonEditor.vue b/src/views/Components/Editor/JsonEditor.vue
new file mode 100644
index 0000000..c508fbd
--- /dev/null
+++ b/src/views/Components/Editor/JsonEditor.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
diff --git a/src/views/Components/Form/DefaultForm.vue b/src/views/Components/Form/DefaultForm.vue
new file mode 100644
index 0000000..4165c16
--- /dev/null
+++ b/src/views/Components/Form/DefaultForm.vue
@@ -0,0 +1,1863 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/Components/Form/UseFormDemo.vue b/src/views/Components/Form/UseFormDemo.vue
new file mode 100644
index 0000000..de9cc64
--- /dev/null
+++ b/src/views/Components/Form/UseFormDemo.vue
@@ -0,0 +1,470 @@
+
+
+
+
+ {{ t('formDemo.change') }} labelWidth
+ {{ t('formDemo.restore') }} labelWidth
+
+ {{ t('formDemo.change') }} size
+ {{ t('formDemo.restore') }} size
+
+ {{ t('formDemo.disabled') }}
+ {{ t('formDemo.disablement') }}
+
+
+ {{ t('formDemo.delete') }} {{ t('formDemo.select') }}
+
+
+ {{ t('formDemo.add') }} {{ t('formDemo.select') }}
+
+
+ {{ t('formDemo.setValue') }}
+ {{ t('formDemo.resetValue') }}
+
+
+ {{ t('formDemo.set') }} {{ t('formDemo.select') }} label
+
+
+ {{ t('formDemo.add') }} {{ t('formDemo.subitem') }}
+
+ {{ t('formDemo.formValidation') }}
+ {{ t('formDemo.verifyReset') }}
+
+
+ {{ `${t('formDemo.select')} ${t('searchDemo.dynamicOptions')}` }}
+
+
+
+ {{ `${t('formDemo.input')} ${t('formDemo.focus')}` }}
+
+
+ {{ `${t('formDemo.input')} ${t('formDemo.formValidation')}` }}
+
+ 获取值
+
+
+
+
+
+
+
diff --git a/src/views/Components/Highlight.vue b/src/views/Components/Highlight.vue
new file mode 100644
index 0000000..96baedc
--- /dev/null
+++ b/src/views/Components/Highlight.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
+ {{ t('highlightDemo.message') }}
+
+
+
diff --git a/src/views/Components/IAgree.vue b/src/views/Components/IAgree.vue
new file mode 100644
index 0000000..947226b
--- /dev/null
+++ b/src/views/Components/IAgree.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/src/views/Components/Icon.vue b/src/views/Components/Icon.vue
new file mode 100644
index 0000000..02da12a
--- /dev/null
+++ b/src/views/Components/Icon.vue
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Button
+ Button
+ Button
+ Button
+
+
+
diff --git a/src/views/Components/IconPicker.vue b/src/views/Components/IconPicker.vue
new file mode 100644
index 0000000..6643f94
--- /dev/null
+++ b/src/views/Components/IconPicker.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
diff --git a/src/views/Components/ImageCropping.vue b/src/views/Components/ImageCropping.vue
new file mode 100644
index 0000000..9e69952
--- /dev/null
+++ b/src/views/Components/ImageCropping.vue
@@ -0,0 +1,43 @@
+
+
+
+
+ 裁剪
+
+
+
+ 裁剪
+
+
+
+
diff --git a/src/views/Components/ImageViewer.vue b/src/views/Components/ImageViewer.vue
new file mode 100644
index 0000000..a20ce91
--- /dev/null
+++ b/src/views/Components/ImageViewer.vue
@@ -0,0 +1,29 @@
+
+
+
+
+ {{ t('imageViewerDemo.open') }}
+
+
diff --git a/src/views/Components/Infotip.vue b/src/views/Components/Infotip.vue
new file mode 100644
index 0000000..49cff12
--- /dev/null
+++ b/src/views/Components/Infotip.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
diff --git a/src/views/Components/InputPassword.vue b/src/views/Components/InputPassword.vue
new file mode 100644
index 0000000..bfae7e5
--- /dev/null
+++ b/src/views/Components/InputPassword.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/Components/Qrcode.vue b/src/views/Components/Qrcode.vue
new file mode 100644
index 0000000..6b7d792
--- /dev/null
+++ b/src/views/Components/Qrcode.vue
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+ {{ t('qrcodeDemo.basicUsage') }}
+
+
+
+
+
+ {{ t('qrcodeDemo.imgTag') }}
+
+
+
+
+
+ {{ t('qrcodeDemo.style') }}
+
+
+
+
+
+ {{ t('qrcodeDemo.click') }}
+
+
+
+
+
+ {{ t('qrcodeDemo.asynchronousContent') }}
+
+
+
+
+
+ {{ t('qrcodeDemo.invalid') }}
+
+
+
+
+
+ {{ t('qrcodeDemo.logoConfig') }}
+
+
+
+
+
+ {{ t('qrcodeDemo.logoStyle') }}
+
+
+
+
+
+ {{ t('qrcodeDemo.size') }}
+
+
+
+
+
+
diff --git a/src/views/Components/Search.vue b/src/views/Components/Search.vue
new file mode 100644
index 0000000..0cc9154
--- /dev/null
+++ b/src/views/Components/Search.vue
@@ -0,0 +1,363 @@
+
+
+
+
+ {{ t('searchDemo.grid') }}
+
+ {{ t('searchDemo.restore') }} {{ t('searchDemo.grid') }}
+
+
+
+ {{ t('searchDemo.button') }} {{ t('searchDemo.position') }}
+
+
+
+ {{ t('searchDemo.bottom') }} {{ t('searchDemo.position') }}-{{ t('searchDemo.left') }}
+
+
+ {{ t('searchDemo.bottom') }} {{ t('searchDemo.position') }}-{{ t('searchDemo.center') }}
+
+
+ {{ t('searchDemo.bottom') }} {{ t('searchDemo.position') }}-{{ t('searchDemo.right') }}
+
+
+ {{ t('formDemo.select') }} {{ t('searchDemo.dynamicOptions') }}
+
+ {{ t('searchDemo.deleteRadio') }}
+ {{ t('searchDemo.restoreRadio') }}
+ {{ t('formDemo.setValue') }}
+
+
+ {{ t('searchDemo.search') }} {{ t('searchDemo.loading') }}
+
+
+ {{ t('searchDemo.reset') }} {{ t('searchDemo.loading') }}
+
+
+
+
+
+
+
+
+
diff --git a/src/views/Components/Table/CardTable.vue b/src/views/Components/Table/CardTable.vue
new file mode 100644
index 0000000..f07059d
--- /dev/null
+++ b/src/views/Components/Table/CardTable.vue
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
{{ row.name }}
+
{{ row.desc }}
+
+
+
+
+
+
actionClick(item)">
+ 操作一
+
+
+
actionClick(item)">
+ 操作二
+
+
+
+
+
+
diff --git a/src/views/Components/Table/DefaultTable.vue b/src/views/Components/Table/DefaultTable.vue
new file mode 100644
index 0000000..1d9124a
--- /dev/null
+++ b/src/views/Components/Table/DefaultTable.vue
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
diff --git a/src/views/Components/Table/TableImagePreview.vue b/src/views/Components/Table/TableImagePreview.vue
new file mode 100644
index 0000000..ded2d6d
--- /dev/null
+++ b/src/views/Components/Table/TableImagePreview.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
diff --git a/src/views/Components/Table/TableVideoPreview.vue b/src/views/Components/Table/TableVideoPreview.vue
new file mode 100644
index 0000000..a6607b0
--- /dev/null
+++ b/src/views/Components/Table/TableVideoPreview.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
diff --git a/src/views/Components/Table/TreeTable.vue b/src/views/Components/Table/TreeTable.vue
new file mode 100644
index 0000000..90a1dfb
--- /dev/null
+++ b/src/views/Components/Table/TreeTable.vue
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/Components/Table/UseTableDemo.vue b/src/views/Components/Table/UseTableDemo.vue
new file mode 100644
index 0000000..62e9801
--- /dev/null
+++ b/src/views/Components/Table/UseTableDemo.vue
@@ -0,0 +1,283 @@
+
+
+
+
+
+ {{ t('tableDemo.show') }} {{ t('tableDemo.pagination') }}
+
+
+ {{ t('tableDemo.hidden') }} {{ t('tableDemo.pagination') }}
+
+
+ {{ t('tableDemo.reserveIndex') }}
+ {{ t('tableDemo.restoreIndex') }}
+
+ {{ t('tableDemo.showSelections') }}
+ {{ t('tableDemo.hiddenSelections') }}
+
+ {{ t('tableDemo.changeTitle') }}
+
+ {{ t('tableDemo.showExpandedRows') }}
+ {{
+ t('tableDemo.hiddenExpandedRows')
+ }}
+
+ {{ t('tableDemo.selectAllNone') }}
+
+ {{ t('tableDemo.delOrAddAction') }}
+
+ {{ t('tableDemo.showOrHiddenStripe') }}
+
+ {{ t('tableDemo.fixedHeaderOrAuto') }}
+
+ {{ t('tableDemo.getSelections') }}
+
+
+
+
+
+
+
+
+
diff --git a/src/views/Components/Tree.vue b/src/views/Components/Tree.vue
new file mode 100644
index 0000000..661732e
--- /dev/null
+++ b/src/views/Components/Tree.vue
@@ -0,0 +1,252 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/Components/VideoPlayer.vue b/src/views/Components/VideoPlayer.vue
new file mode 100644
index 0000000..66dcad4
--- /dev/null
+++ b/src/views/Components/VideoPlayer.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+ 弹窗展示
+
+
diff --git a/src/views/Components/Waterfall.vue b/src/views/Components/Waterfall.vue
new file mode 100644
index 0000000..c56f8f8
--- /dev/null
+++ b/src/views/Components/Waterfall.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
diff --git a/src/views/Dashboard/Analysis.vue b/src/views/Dashboard/Analysis.vue
new file mode 100644
index 0000000..4ce6f27
--- /dev/null
+++ b/src/views/Dashboard/Analysis.vue
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/Dashboard/Workplace.vue b/src/views/Dashboard/Workplace.vue
new file mode 100644
index 0000000..4e0bd80
--- /dev/null
+++ b/src/views/Dashboard/Workplace.vue
@@ -0,0 +1,293 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('workplace.goodMorning') }},Archer,{{ t('workplace.happyDay') }}
+
+
+ {{ t('workplace.toady') }},20℃ - 32℃!
+
+
+
+
+
+
+
+
{{ t('workplace.project') }}
+
+
+
+
+
{{ t('workplace.toDo') }}
+
+
+
+
+
{{ t('workplace.access') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('workplace.project') }}
+ {{ t('workplace.more') }}
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+ {{ t(item.message) }}
+
+ {{ item.personal }}
+ {{ formatTime(item.time, 'yyyy-MM-dd') }}
+
+
+
+
+
+
+
+
+
+
+ {{ t('workplace.dynamic') }}
+ {{ t('workplace.more') }}
+
+
+
+
+
+
+
+
+
+ {{ t('workplace.pushCode') }}
+
+
+
+ {{ useTimeAgo(item.time) }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('workplace.shortcutOperation') }}
+
+
+
+
+
+ {{ t('workplace.operation') }}{{ item }}
+
+
+
+
+
+
+
+
+ xx{{ t('workplace.index') }}
+
+
+
+
+
+
+
+
+ {{ t('workplace.team') }}
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
diff --git a/src/views/Dashboard/components/PanelGroup.vue b/src/views/Dashboard/components/PanelGroup.vue
new file mode 100644
index 0000000..228cf4d
--- /dev/null
+++ b/src/views/Dashboard/components/PanelGroup.vue
@@ -0,0 +1,200 @@
+
+
+
+
+
+
+
+
+
+
+
+
{{
+ t('analysis.newUser')
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{
+ t('analysis.unreadInformation')
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{
+ t('analysis.transactionAmount')
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{
+ t('analysis.totalShopping')
+ }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/Dashboard/echarts-data.ts b/src/views/Dashboard/echarts-data.ts
new file mode 100644
index 0000000..00a195e
--- /dev/null
+++ b/src/views/Dashboard/echarts-data.ts
@@ -0,0 +1,309 @@
+import { EChartsOption } from 'echarts'
+import { useI18n } from '@/hooks/web/useI18n'
+
+const { t } = useI18n()
+
+export const lineOptions: EChartsOption = {
+ title: {
+ text: t('analysis.monthlySales'),
+ left: 'center'
+ },
+ xAxis: {
+ data: [
+ t('analysis.january'),
+ t('analysis.february'),
+ t('analysis.march'),
+ t('analysis.april'),
+ t('analysis.may'),
+ t('analysis.june'),
+ t('analysis.july'),
+ t('analysis.august'),
+ t('analysis.september'),
+ t('analysis.october'),
+ t('analysis.november'),
+ t('analysis.december')
+ ],
+ boundaryGap: false,
+ axisTick: {
+ show: false
+ }
+ },
+ grid: {
+ left: 20,
+ right: 20,
+ bottom: 20,
+ top: 80,
+ containLabel: true
+ },
+ tooltip: {
+ trigger: 'axis',
+ axisPointer: {
+ type: 'cross'
+ },
+ padding: [5, 10]
+ },
+ yAxis: {
+ axisTick: {
+ show: false
+ }
+ },
+ legend: {
+ data: [t('analysis.estimate'), t('analysis.actual')],
+ top: 50
+ },
+ series: [
+ {
+ name: t('analysis.estimate'),
+ smooth: true,
+ type: 'line',
+ data: [100, 120, 161, 134, 105, 160, 165, 114, 163, 185, 118, 123],
+ animationDuration: 2800,
+ animationEasing: 'cubicInOut'
+ },
+ {
+ name: t('analysis.actual'),
+ smooth: true,
+ type: 'line',
+ itemStyle: {},
+ data: [120, 82, 91, 154, 162, 140, 145, 250, 134, 56, 99, 123],
+ animationDuration: 2800,
+ animationEasing: 'quadraticOut'
+ }
+ ]
+}
+
+export const pieOptions: EChartsOption = {
+ title: {
+ text: t('analysis.userAccessSource'),
+ left: 'center'
+ },
+ tooltip: {
+ trigger: 'item',
+ formatter: '{a} {b} : {c} ({d}%)'
+ },
+ legend: {
+ orient: 'vertical',
+ left: 'left',
+ data: [
+ t('analysis.directAccess'),
+ t('analysis.mailMarketing'),
+ t('analysis.allianceAdvertising'),
+ t('analysis.videoAdvertising'),
+ t('analysis.searchEngines')
+ ]
+ },
+ series: [
+ {
+ name: t('analysis.userAccessSource'),
+ type: 'pie',
+ radius: '55%',
+ center: ['50%', '60%'],
+ data: [
+ { value: 335, name: t('analysis.directAccess') },
+ { value: 310, name: t('analysis.mailMarketing') },
+ { value: 234, name: t('analysis.allianceAdvertising') },
+ { value: 135, name: t('analysis.videoAdvertising') },
+ { value: 1548, name: t('analysis.searchEngines') }
+ ]
+ }
+ ]
+}
+
+export const barOptions: EChartsOption = {
+ title: {
+ text: t('analysis.weeklyUserActivity'),
+ left: 'center'
+ },
+ tooltip: {
+ trigger: 'axis',
+ axisPointer: {
+ type: 'shadow'
+ }
+ },
+ grid: {
+ left: 50,
+ right: 20,
+ bottom: 20
+ },
+ xAxis: {
+ type: 'category',
+ data: [
+ t('analysis.monday'),
+ t('analysis.tuesday'),
+ t('analysis.wednesday'),
+ t('analysis.thursday'),
+ t('analysis.friday'),
+ t('analysis.saturday'),
+ t('analysis.sunday')
+ ],
+ axisTick: {
+ alignWithLabel: true
+ }
+ },
+ yAxis: {
+ type: 'value'
+ },
+ series: [
+ {
+ name: t('analysis.activeQuantity'),
+ data: [13253, 34235, 26321, 12340, 24643, 1322, 1324],
+ type: 'bar'
+ }
+ ]
+}
+
+export const radarOption: EChartsOption = {
+ legend: {
+ data: [t('workplace.personal'), t('workplace.team')]
+ },
+ radar: {
+ // shape: 'circle',
+ indicator: [
+ { name: t('workplace.quote'), max: 65 },
+ { name: t('workplace.contribution'), max: 160 },
+ { name: t('workplace.hot'), max: 300 },
+ { name: t('workplace.yield'), max: 130 },
+ { name: t('workplace.follow'), max: 100 }
+ ]
+ },
+ series: [
+ {
+ name: `xxx${t('workplace.index')}`,
+ type: 'radar',
+ data: [
+ {
+ value: [42, 30, 20, 35, 80],
+ name: t('workplace.personal')
+ },
+ {
+ value: [50, 140, 290, 100, 90],
+ name: t('workplace.team')
+ }
+ ]
+ }
+ ]
+}
+
+export const wordOptions = {
+ series: [
+ {
+ type: 'wordCloud',
+ gridSize: 2,
+ sizeRange: [12, 50],
+ rotationRange: [-90, 90],
+ shape: 'pentagon',
+ width: 600,
+ height: 400,
+ drawOutOfBound: true,
+ textStyle: {
+ color: function () {
+ return (
+ 'rgb(' +
+ [
+ Math.round(Math.random() * 160),
+ Math.round(Math.random() * 160),
+ Math.round(Math.random() * 160)
+ ].join(',') +
+ ')'
+ )
+ }
+ },
+ emphasis: {
+ textStyle: {
+ shadowBlur: 10,
+ shadowColor: '#333'
+ }
+ },
+ data: [
+ {
+ name: 'Sam S Club',
+ value: 10000,
+ textStyle: {
+ color: 'black'
+ },
+ emphasis: {
+ textStyle: {
+ color: 'red'
+ }
+ }
+ },
+ {
+ name: 'Macys',
+ value: 6181
+ },
+ {
+ name: 'Amy Schumer',
+ value: 4386
+ },
+ {
+ name: 'Jurassic World',
+ value: 4055
+ },
+ {
+ name: 'Charter Communications',
+ value: 2467
+ },
+ {
+ name: 'Chick Fil A',
+ value: 2244
+ },
+ {
+ name: 'Planet Fitness',
+ value: 1898
+ },
+ {
+ name: 'Pitch Perfect',
+ value: 1484
+ },
+ {
+ name: 'Express',
+ value: 1112
+ },
+ {
+ name: 'Home',
+ value: 965
+ },
+ {
+ name: 'Johnny Depp',
+ value: 847
+ },
+ {
+ name: 'Lena Dunham',
+ value: 582
+ },
+ {
+ name: 'Lewis Hamilton',
+ value: 555
+ },
+ {
+ name: 'KXAN',
+ value: 550
+ },
+ {
+ name: 'Mary Ellen Mark',
+ value: 462
+ },
+ {
+ name: 'Farrah Abraham',
+ value: 366
+ },
+ {
+ name: 'Rita Ora',
+ value: 360
+ },
+ {
+ name: 'Serena Williams',
+ value: 282
+ },
+ {
+ name: 'NCAA baseball tournament',
+ value: 273
+ },
+ {
+ name: 'Point Break',
+ value: 265
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/views/Error/403.vue b/src/views/Error/403.vue
new file mode 100644
index 0000000..615c940
--- /dev/null
+++ b/src/views/Error/403.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
diff --git a/src/views/Error/404.vue b/src/views/Error/404.vue
new file mode 100644
index 0000000..0a3fbbe
--- /dev/null
+++ b/src/views/Error/404.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
diff --git a/src/views/Error/500.vue b/src/views/Error/500.vue
new file mode 100644
index 0000000..ddb5097
--- /dev/null
+++ b/src/views/Error/500.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
diff --git a/src/views/Example/Dialog/ExampleDialog.vue b/src/views/Example/Dialog/ExampleDialog.vue
new file mode 100644
index 0000000..b93450d
--- /dev/null
+++ b/src/views/Example/Dialog/ExampleDialog.vue
@@ -0,0 +1,340 @@
+
+
+
+
+
+
+
+ {{ t('exampleDemo.add') }}
+
+ {{ t('exampleDemo.del') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('exampleDemo.save') }}
+
+ {{ t('dialogDemo.close') }}
+
+
+
diff --git a/src/views/Example/Dialog/components/Detail.vue b/src/views/Example/Dialog/components/Detail.vue
new file mode 100644
index 0000000..2496e75
--- /dev/null
+++ b/src/views/Example/Dialog/components/Detail.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
diff --git a/src/views/Example/Dialog/components/Write.vue b/src/views/Example/Dialog/components/Write.vue
new file mode 100644
index 0000000..2ea183a
--- /dev/null
+++ b/src/views/Example/Dialog/components/Write.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
diff --git a/src/views/Example/Page/ExampleAdd.vue b/src/views/Example/Page/ExampleAdd.vue
new file mode 100644
index 0000000..fbe7460
--- /dev/null
+++ b/src/views/Example/Page/ExampleAdd.vue
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+ {{ t('common.back') }}
+
+ {{ t('exampleDemo.save') }}
+
+
+
+
diff --git a/src/views/Example/Page/ExampleDetail.vue b/src/views/Example/Page/ExampleDetail.vue
new file mode 100644
index 0000000..6f7e44c
--- /dev/null
+++ b/src/views/Example/Page/ExampleDetail.vue
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+ {{ t('common.back') }}
+
+
+
+
+
diff --git a/src/views/Example/Page/ExampleEdit.vue b/src/views/Example/Page/ExampleEdit.vue
new file mode 100644
index 0000000..eb65721
--- /dev/null
+++ b/src/views/Example/Page/ExampleEdit.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+ {{ t('common.back') }}
+
+
+ {{ t('exampleDemo.save') }}
+
+
+
+
+@/hooks/event/useEventBus
diff --git a/src/views/Example/Page/ExamplePage.vue b/src/views/Example/Page/ExamplePage.vue
new file mode 100644
index 0000000..c13fe3c
--- /dev/null
+++ b/src/views/Example/Page/ExamplePage.vue
@@ -0,0 +1,297 @@
+
+
+
+
+
+
+
+ {{ t('exampleDemo.add') }}
+
+ {{ t('exampleDemo.del') }}
+
+
+
+
+
+
+@/hooks/event/useEventBus
diff --git a/src/views/Example/Page/components/Detail.vue b/src/views/Example/Page/components/Detail.vue
new file mode 100644
index 0000000..11d4a94
--- /dev/null
+++ b/src/views/Example/Page/components/Detail.vue
@@ -0,0 +1,69 @@
+
+
+
+
+
diff --git a/src/views/Example/Page/components/Write.vue b/src/views/Example/Page/components/Write.vue
new file mode 100644
index 0000000..c4f50ad
--- /dev/null
+++ b/src/views/Example/Page/components/Write.vue
@@ -0,0 +1,154 @@
+
+
+
+
+
diff --git a/src/views/Function/MultipleTabs.vue b/src/views/Function/MultipleTabs.vue
new file mode 100644
index 0000000..4a623c8
--- /dev/null
+++ b/src/views/Function/MultipleTabs.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
+ 打开详情页{{ item }}
+
+
+
diff --git a/src/views/Function/MultipleTabsDemo.vue b/src/views/Function/MultipleTabsDemo.vue
new file mode 100644
index 0000000..9421a9a
--- /dev/null
+++ b/src/views/Function/MultipleTabsDemo.vue
@@ -0,0 +1,19 @@
+
+
+
+ 获取参数:
+
diff --git a/src/views/Function/Request.vue b/src/views/Function/Request.vue
new file mode 100644
index 0000000..b37e67b
--- /dev/null
+++ b/src/views/Function/Request.vue
@@ -0,0 +1,173 @@
+
+
+
+
+ 正在请求的接口:{{ setToArray(pending) }}
+ 请求/取消request1
+ 请求/取消request2
+ 请求/取消request3
+ 请求/取消request4
+ 请求/取消request5
+ 发送五个请求
+ 关闭所有请求
+
+ token过期
+
+
diff --git a/src/views/Function/Test.vue b/src/views/Function/Test.vue
new file mode 100644
index 0000000..dbb3732
--- /dev/null
+++ b/src/views/Function/Test.vue
@@ -0,0 +1,70 @@
+
+
+
+
+ 组件方式判断(已经全局注册,支持动态修改)
+
+
+ 新增权限:
+
+ Add
+
+
+
+ 删除权限:
+
+ Delete
+
+
+
+ 3秒后切换查看权限:
+
+ View
+
+
+
+
+ 指令方式判断(已经全局注册,不支持动态修改)
+
+
+ 新增权限:
+ Add
+
+
+ 删除权限:
+ Delete
+
+
+ 3秒后切换查看权限(无法动态修改):
+ View
+
+
+
+ 函数方式判断
+
+
+ 新增权限:
+ Add
+
+
+ 删除权限:
+ Delete
+
+
+ 3秒后切换查看权限:
+ View
+
+
+
+
diff --git a/src/views/Guide/Guide.vue b/src/views/Guide/Guide.vue
new file mode 100644
index 0000000..dbdc91b
--- /dev/null
+++ b/src/views/Guide/Guide.vue
@@ -0,0 +1,19 @@
+
+
+
+
+ {{ t('guideDemo.start') }}
+
+
diff --git a/src/views/Level/Menu111.vue b/src/views/Level/Menu111.vue
new file mode 100644
index 0000000..015d0f8
--- /dev/null
+++ b/src/views/Level/Menu111.vue
@@ -0,0 +1,20 @@
+
+
+
+
+ Menu111:
+
+
diff --git a/src/views/Level/Menu12.vue b/src/views/Level/Menu12.vue
new file mode 100644
index 0000000..8e2725d
--- /dev/null
+++ b/src/views/Level/Menu12.vue
@@ -0,0 +1,20 @@
+
+
+
+
+ Menu12:
+
+
diff --git a/src/views/Level/Menu2.vue b/src/views/Level/Menu2.vue
new file mode 100644
index 0000000..72e2abb
--- /dev/null
+++ b/src/views/Level/Menu2.vue
@@ -0,0 +1,20 @@
+
+
+
+
+ Menu2:
+
+
diff --git a/src/views/Login/Login.vue b/src/views/Login/Login.vue
new file mode 100644
index 0000000..081f30a
--- /dev/null
+++ b/src/views/Login/Login.vue
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
{{ underlineToHump(appStore.getTitle) }}
+
+
+
+
+ {{ t('login.welcome') }}
+
+ {{ t('login.message') }}
+
+
+
+
+
+
+
+
+
{{ underlineToHump(appStore.getTitle) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/Login/components/LoginForm.vue b/src/views/Login/components/LoginForm.vue
new file mode 100644
index 0000000..6d39b8e
--- /dev/null
+++ b/src/views/Login/components/LoginForm.vue
@@ -0,0 +1,313 @@
+
+
+
+
+
diff --git a/src/views/Login/components/RegisterForm.vue b/src/views/Login/components/RegisterForm.vue
new file mode 100644
index 0000000..1f3d251
--- /dev/null
+++ b/src/views/Login/components/RegisterForm.vue
@@ -0,0 +1,218 @@
+
+
+
+
+
diff --git a/src/views/Login/components/index.ts b/src/views/Login/components/index.ts
new file mode 100644
index 0000000..d08be96
--- /dev/null
+++ b/src/views/Login/components/index.ts
@@ -0,0 +1,4 @@
+import LoginForm from './LoginForm.vue'
+import RegisterForm from './RegisterForm.vue'
+
+export { LoginForm, RegisterForm }
diff --git a/src/views/Personal/PersonalCenter/PersonalCenter.vue b/src/views/Personal/PersonalCenter/PersonalCenter.vue
new file mode 100644
index 0000000..dc09883
--- /dev/null
+++ b/src/views/Personal/PersonalCenter/PersonalCenter.vue
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
+
+
账号:
+
{{ userInfo?.username }}
+
+
+
+
昵称:
+
{{ userInfo?.realName }}
+
+
+
+
手机号码:
+
{{ userInfo?.phoneNumber ?? '-' }}
+
+
+
+
用户邮箱:
+
{{ userInfo?.email ?? '-' }}
+
+
+
+
所属角色:
+
+
+ {{ item }}
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+ 关闭
+
+
+
+
+
diff --git a/src/views/Personal/PersonalCenter/components/EditInfo.vue b/src/views/Personal/PersonalCenter/components/EditInfo.vue
new file mode 100644
index 0000000..bd684b7
--- /dev/null
+++ b/src/views/Personal/PersonalCenter/components/EditInfo.vue
@@ -0,0 +1,96 @@
+
+
+
+
+
+ 保存
+
diff --git a/src/views/Personal/PersonalCenter/components/EditPassword.vue b/src/views/Personal/PersonalCenter/components/EditPassword.vue
new file mode 100644
index 0000000..7b320f3
--- /dev/null
+++ b/src/views/Personal/PersonalCenter/components/EditPassword.vue
@@ -0,0 +1,110 @@
+
+
+
+
+
+ 确认修改
+
diff --git a/src/views/Personal/PersonalCenter/components/UploadAvatar.vue b/src/views/Personal/PersonalCenter/components/UploadAvatar.vue
new file mode 100644
index 0000000..9b40e21
--- /dev/null
+++ b/src/views/Personal/PersonalCenter/components/UploadAvatar.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
diff --git a/src/views/Redirect/Redirect.vue b/src/views/Redirect/Redirect.vue
new file mode 100644
index 0000000..0b7af7b
--- /dev/null
+++ b/src/views/Redirect/Redirect.vue
@@ -0,0 +1,30 @@
+
+
+
+
diff --git a/src/views/hooks/useClipboard.vue b/src/views/hooks/useClipboard.vue
new file mode 100644
index 0000000..f49125e
--- /dev/null
+++ b/src/views/hooks/useClipboard.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+ 复制
+ 已复制
+
+
+ 当前已复制: {{ text || 'none' }}
+
+
+ 你的浏览器不支持 Clipboard API
+
+
diff --git a/src/views/hooks/useCrudSchemas.vue b/src/views/hooks/useCrudSchemas.vue
new file mode 100644
index 0000000..69a2d7f
--- /dev/null
+++ b/src/views/hooks/useCrudSchemas.vue
@@ -0,0 +1,186 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/hooks/useNetwork.vue b/src/views/hooks/useNetwork.vue
new file mode 100644
index 0000000..dd6ed93
--- /dev/null
+++ b/src/views/hooks/useNetwork.vue
@@ -0,0 +1,12 @@
+
+
+
+
+ 当前网络状态: {{ online ? '已连接' : '已断开' }}
+
+
diff --git a/src/views/hooks/useTagsView.vue b/src/views/hooks/useTagsView.vue
new file mode 100644
index 0000000..1bacedc
--- /dev/null
+++ b/src/views/hooks/useTagsView.vue
@@ -0,0 +1,59 @@
+
+
+
+
+ 关闭所有标签页
+ 关闭左侧标签页
+ 关闭右侧标签页
+ 关闭其他标签页
+ 关闭当前标签页
+ 刷新当前标签页
+ 修改当前标题
+ 修改分析页标题
+
+
diff --git a/src/views/hooks/useValidator.vue b/src/views/hooks/useValidator.vue
new file mode 100644
index 0000000..c3d6131
--- /dev/null
+++ b/src/views/hooks/useValidator.vue
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
diff --git a/src/views/hooks/useWatermark.vue b/src/views/hooks/useWatermark.vue
new file mode 100644
index 0000000..bd5cc84
--- /dev/null
+++ b/src/views/hooks/useWatermark.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+ {{ t('watermarkDemo.createdWatermark') }}
+
+ {{ t('watermarkDemo.clearWatermark') }}
+
+ {{ t('watermarkDemo.resetWatermark') }}
+
+
+
diff --git a/stylelint.config.cjs b/stylelint.config.cjs
new file mode 100644
index 0000000..a50d202
--- /dev/null
+++ b/stylelint.config.cjs
@@ -0,0 +1,231 @@
+module.exports = {
+ root: true,
+ plugins: ['stylelint-order'],
+ customSyntax: 'postcss-html',
+ extends: ['stylelint-config-standard'],
+ rules: {
+ 'selector-pseudo-class-no-unknown': [
+ true,
+ {
+ ignorePseudoClasses: ['global', 'deep']
+ }
+ ],
+ 'at-rule-no-unknown': [
+ true,
+ {
+ ignoreAtRules: ['function', 'if', 'each', 'include', 'mixin']
+ }
+ ],
+ 'media-query-no-invalid': null,
+ 'function-no-unknown': null,
+ 'no-empty-source': null,
+ 'named-grid-areas-no-invalid': null,
+ 'no-descending-specificity': null,
+ 'font-family-no-missing-generic-family-keyword': null,
+ 'rule-empty-line-before': [
+ 'always',
+ {
+ ignore: ['after-comment', 'first-nested']
+ }
+ ],
+ 'unit-no-unknown': [
+ true,
+ {
+ ignoreUnits: ['rpx']
+ }
+ ],
+ 'order/order': [
+ [
+ 'dollar-variables',
+ 'custom-properties',
+ 'at-rules',
+ 'declarations',
+ {
+ type: 'at-rule',
+ name: 'supports'
+ },
+ {
+ type: 'at-rule',
+ name: 'media'
+ },
+ 'rules'
+ ],
+ {
+ severity: 'warning'
+ }
+ ],
+ // Specify the alphabetical order of the attributes in the declaration block
+ 'order/properties-order': [
+ 'position',
+ 'top',
+ 'right',
+ 'bottom',
+ 'left',
+ 'z-index',
+ 'display',
+ 'float',
+ 'width',
+ 'height',
+ 'max-width',
+ 'max-height',
+ 'min-width',
+ 'min-height',
+ 'padding',
+ 'padding-top',
+ 'padding-right',
+ 'padding-bottom',
+ 'padding-left',
+ 'margin',
+ 'margin-top',
+ 'margin-right',
+ 'margin-bottom',
+ 'margin-left',
+ 'margin-collapse',
+ 'margin-top-collapse',
+ 'margin-right-collapse',
+ 'margin-bottom-collapse',
+ 'margin-left-collapse',
+ 'overflow',
+ 'overflow-x',
+ 'overflow-y',
+ 'clip',
+ 'clear',
+ 'font',
+ 'font-family',
+ 'font-size',
+ 'font-smoothing',
+ 'osx-font-smoothing',
+ 'font-style',
+ 'font-weight',
+ 'hyphens',
+ 'src',
+ 'line-height',
+ 'letter-spacing',
+ 'word-spacing',
+ 'color',
+ 'text-align',
+ 'text-decoration',
+ 'text-indent',
+ 'text-overflow',
+ 'text-rendering',
+ 'text-size-adjust',
+ 'text-shadow',
+ 'text-transform',
+ 'word-break',
+ 'word-wrap',
+ 'white-space',
+ 'vertical-align',
+ 'list-style',
+ 'list-style-type',
+ 'list-style-position',
+ 'list-style-image',
+ 'pointer-events',
+ 'cursor',
+ 'background',
+ 'background-attachment',
+ 'background-color',
+ 'background-image',
+ 'background-position',
+ 'background-repeat',
+ 'background-size',
+ 'border',
+ 'border-collapse',
+ 'border-top',
+ 'border-right',
+ 'border-bottom',
+ 'border-left',
+ 'border-color',
+ 'border-image',
+ 'border-top-color',
+ 'border-right-color',
+ 'border-bottom-color',
+ 'border-left-color',
+ 'border-spacing',
+ 'border-style',
+ 'border-top-style',
+ 'border-right-style',
+ 'border-bottom-style',
+ 'border-left-style',
+ 'border-width',
+ 'border-top-width',
+ 'border-right-width',
+ 'border-bottom-width',
+ 'border-left-width',
+ 'border-radius',
+ 'border-top-right-radius',
+ 'border-bottom-right-radius',
+ 'border-bottom-left-radius',
+ 'border-top-left-radius',
+ 'border-radius-topright',
+ 'border-radius-bottomright',
+ 'border-radius-bottomleft',
+ 'border-radius-topleft',
+ 'content',
+ 'quotes',
+ 'outline',
+ 'outline-offset',
+ 'opacity',
+ 'filter',
+ 'visibility',
+ 'size',
+ 'zoom',
+ 'transform',
+ 'box-align',
+ 'box-flex',
+ 'box-orient',
+ 'box-pack',
+ 'box-shadow',
+ 'box-sizing',
+ 'table-layout',
+ 'animation',
+ 'animation-delay',
+ 'animation-duration',
+ 'animation-iteration-count',
+ 'animation-name',
+ 'animation-play-state',
+ 'animation-timing-function',
+ 'animation-fill-mode',
+ 'transition',
+ 'transition-delay',
+ 'transition-duration',
+ 'transition-property',
+ 'transition-timing-function',
+ 'background-clip',
+ 'backface-visibility',
+ 'resize',
+ 'appearance',
+ 'user-select',
+ 'interpolation-mode',
+ 'direction',
+ 'marks',
+ 'page',
+ 'set-link-source',
+ 'unicode-bidi',
+ 'speak'
+ ]
+ },
+ ignoreFiles: ['**/*.js', '**/*.jsx', '**/*.tsx', '**/*.ts'],
+ overrides: [
+ {
+ files: ['*.vue', '**/*.vue', '*.html', '**/*.html'],
+ extends: ['stylelint-config-recommended', 'stylelint-config-html'],
+ rules: {
+ 'keyframes-name-pattern': null,
+ 'selector-class-pattern': null,
+ 'no-duplicate-selectors': null,
+ 'selector-pseudo-class-no-unknown': [
+ true,
+ {
+ ignorePseudoClasses: ['deep', 'global']
+ }
+ ],
+ 'selector-pseudo-element-no-unknown': [
+ true,
+ {
+ ignorePseudoElements: ['v-deep', 'v-global', 'v-slotted']
+ }
+ ]
+ }
+ }
+ ]
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..fe67772
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,37 @@
+{
+ "compilerOptions": {
+ "target": "esnext",
+ "useDefineForClassFields": true,
+ "module": "esnext",
+ "moduleResolution": "node",
+ "strict": true,
+ "jsx": "preserve",
+ "sourceMap": true,
+ "resolveJsonModule": true,
+ "esModuleInterop": true,
+ "jsxImportSource": "vue",
+ "lib": ["esnext", "dom"],
+ "baseUrl": "./",
+ "allowJs": true,
+ "forceConsistentCasingInFileNames": true,
+ "allowSyntheticDefaultImports": true,
+ "strictFunctionTypes": false,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "experimentalDecorators": true,
+ "noImplicitAny": false,
+ "skipLibCheck": true,
+ "paths": {
+ "@/*": ["src/*"]
+ },
+ "types": [
+ "@intlify/unplugin-vue-i18n/types",
+ "vite/client",
+ "element-plus/global",
+ "@types/qrcode",
+ "vite-plugin-svg-icons/client"
+ ]
+ },
+ "include": ["src", "types/**/*.d.ts", "mock/**/*.ts"]
+ // "exclude": ["dist", "node_modules"]
+}
diff --git a/types/components.d.ts b/types/components.d.ts
new file mode 100644
index 0000000..15b5a6b
--- /dev/null
+++ b/types/components.d.ts
@@ -0,0 +1,9 @@
+declare module 'vue' {
+ export interface GlobalComponents {
+ Icon: (typeof import('../src/components/Icon/index'))['Icon']
+ Permission: (typeof import('../src/components/Permission/index'))['Permission']
+ BaseButton: (typeof import('../src/components/Button/index'))['BaseButton']
+ }
+}
+
+export {}
diff --git a/types/env.d.ts b/types/env.d.ts
new file mode 100644
index 0000000..3811725
--- /dev/null
+++ b/types/env.d.ts
@@ -0,0 +1,14 @@
+///
+
+declare module '*.vue' {
+ import { DefineComponent } from 'vue'
+
+ const component: DefineComponent<{}, {}, any>
+ export default component
+}
+
+declare global {
+ interface ImportMeta {
+ readonly env: ImportMetaEnv
+ }
+}
diff --git a/types/global.d.ts b/types/global.d.ts
new file mode 100644
index 0000000..c8ef5ed
--- /dev/null
+++ b/types/global.d.ts
@@ -0,0 +1,87 @@
+import type { CSSProperties } from 'vue'
+import { RawAxiosRequestHeaders } from 'axios'
+declare global {
+ declare interface Fn {
+ (...arg: T[]): T
+ }
+
+ declare type Nullable = T | null
+
+ declare type ElRef = Nullable
+
+ declare type Recordable = Record
+
+ declare type RemoveReadonly = {
+ -readonly [P in keyof T]: T[P]
+ }
+
+ declare type ComponentRef = InstanceType
+
+ declare type LocaleType = 'zh-CN' | 'en'
+
+ declare type TimeoutHandle = ReturnType
+ declare type IntervalHandle = ReturnType
+
+ declare type ElementPlusInfoType = 'success' | 'info' | 'warning' | 'danger'
+
+ declare type LayoutType = 'classic' | 'topLeft' | 'top' | 'cutMenu'
+
+ declare type AxiosContentType =
+ | 'application/json'
+ | 'application/x-www-form-urlencoded'
+ | 'multipart/form-data'
+ | 'text/plain'
+
+ declare type AxiosMethod = 'get' | 'post' | 'delete' | 'put'
+
+ declare type AxiosResponseType = 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream'
+
+ declare interface AxiosConfig {
+ params?: any
+ data?: any
+ url?: string
+ method?: AxiosMethod
+ headers?: RawAxiosRequestHeaders
+ responseType?: AxiosResponseType
+ }
+
+ declare interface IResponse {
+ code: number
+ data: T extends any ? T : T & any
+ }
+
+ declare interface ThemeTypes {
+ elColorPrimary?: string
+ leftMenuBorderColor?: string
+ leftMenuBgColor?: string
+ leftMenuBgLightColor?: string
+ leftMenuBgActiveColor?: string
+ leftMenuCollapseBgActiveColor?: string
+ leftMenuTextColor?: string
+ leftMenuTextActiveColor?: string
+ logoTitleTextColor?: string
+ logoBorderColor?: string
+ topHeaderBgColor?: string
+ topHeaderTextColor?: string
+ topHeaderHoverColor?: string
+ topToolBorderColor?: string
+ }
+
+ declare interface ImportMetaEnv {
+ readonly VITE_NODE_ENV: string
+ readonly VITE_APP_TITLE: string
+ readonly VITE_API_BASE_PATH: string
+ readonly VITE_BASE_PATH: string
+ readonly VITE_DROP_DEBUGGER: string
+ readonly VITE_DROP_CONSOLE: string
+ readonly VITE_SOURCEMAP: string
+ readonly VITE_OUT_DIR: string
+ readonly VITE_USE_BUNDLE_ANALYZER: string
+ readonly VITE_USE_ALL_ELEMENT_PLUS_STYLE: string
+ readonly VITE_USE_MOCK: string
+ readonly VITE_USE_CSS_SPLIT: string
+ readonly VITE_USE_ONLINE_ICON: string
+ readonly VITE_ICON_PREFIX: string
+ readonly VITE_HIDE_GLOBAL_SETTING: string
+ }
+}
diff --git a/types/router.d.ts b/types/router.d.ts
new file mode 100644
index 0000000..32d9447
--- /dev/null
+++ b/types/router.d.ts
@@ -0,0 +1,78 @@
+import type { RouteRecordRaw } from 'vue-router'
+import { defineComponent } from 'vue'
+
+/**
+* redirect: noredirect 当设置 noredirect 的时候该路由在面包屑导航中不可被点击
+* name:'router-name' 设定路由的名字,一定要填写不然使用时会出现各种问题
+* meta : {
+ hidden: true 当设置 true 的时候该路由不会再侧边栏出现 如404,login等页面(默认 false)
+
+ alwaysShow: true 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式,
+ 只有一个时,会将那个子路由当做根路由显示在侧边栏,
+ 若你想不管路由下面的 children 声明的个数都显示你的根路由,
+ 你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则,
+ 一直显示根路由(默认 false)
+
+ title: 'title' 设置该路由在侧边栏和面包屑中展示的名字
+
+ icon: 'svg-name' 设置该路由的图标
+
+ noCache: true 如果设置为true,则不会被 缓存(默认 false)
+
+ breadcrumb: false 如果设置为false,则不会在breadcrumb面包屑中显示(默认 true)
+
+ affix: true 如果设置为true,则会一直固定在tag项中(默认 false)
+
+ noTagsView: true 如果设置为true,则不会出现在tag中(默认 false)
+
+ activeMenu: '/dashboard' 显示高亮的路由路径
+
+ canTo: true 设置为true即使hidden为true,也依然可以进行路由跳转(默认 false)
+
+ permission: ['edit','add', 'delete'] 设置该路由的权限
+ }
+**/
+
+interface RouteMetaCustom extends Record {
+ hidden?: boolean
+ alwaysShow?: boolean
+ title?: string
+ icon?: string
+ noCache?: boolean
+ breadcrumb?: boolean
+ affix?: boolean
+ activeMenu?: string
+ noTagsView?: boolean
+ canTo?: boolean
+ permission?: string[]
+}
+
+declare module 'vue-router' {
+ interface RouteMeta extends RouteMetaCustom {}
+}
+
+type Component =
+ | ReturnType
+ | (() => Promise)
+ | (() => Promise)
+
+declare global {
+ declare interface AppRouteRecordRaw extends Omit {
+ name: string
+ meta: RouteMetaCustom
+ component?: Component | string
+ children?: AppRouteRecordRaw[]
+ props?: Recordable
+ fullPath?: string
+ }
+
+ declare interface AppCustomRouteRecordRaw
+ extends Omit {
+ name: string
+ meta: RouteMetaCustom
+ component: string
+ path: string
+ redirect: string
+ children?: AppCustomRouteRecordRaw[]
+ }
+}
diff --git a/uno.config.ts b/uno.config.ts
new file mode 100644
index 0000000..997f6c8
--- /dev/null
+++ b/uno.config.ts
@@ -0,0 +1,146 @@
+import { defineConfig, toEscapedSelector as e, presetUno, presetIcons } from 'unocss'
+import transformerVariantGroup from '@unocss/transformer-variant-group'
+import { loadEnv } from 'vite'
+import { ICON_PREFIX } from './src/constants'
+
+const root = process.cwd()
+
+const createPresetIcons = () => {
+ const isBuild = !!process.argv[4]
+ let env = {} as any
+ if (!isBuild) {
+ env = loadEnv(process.argv[3], root)
+ } else {
+ env = loadEnv(process.argv[4], root)
+ }
+ // @ts-ignore
+ if (env.VITE_USE_ONLINE_ICON === 'true') {
+ return []
+ } else {
+ return [
+ presetIcons({
+ autoInstall: false,
+ prefix: ICON_PREFIX
+ })
+ ]
+ }
+}
+
+export default defineConfig({
+ // ...UnoCSS options
+ rules: [
+ [
+ /^overflow-ellipsis$/,
+ ([], { rawSelector }) => {
+ const selector = e(rawSelector)
+ return `
+${selector} {
+ text-overflow: ellipsis;
+}
+`
+ }
+ ],
+ [
+ /^custom-hover$/,
+ ([], { rawSelector }) => {
+ const selector = e(rawSelector)
+ return `
+${selector} {
+ display: flex;
+ height: 100%;
+ padding: 1px 10px 0;
+ cursor: pointer;
+ align-items: center;
+ transition: background var(--transition-time-02);
+}
+/* you can have multiple rules */
+${selector}:hover {
+ background-color: var(--top-header-hover-color);
+}
+.dark ${selector}:hover {
+ background-color: var(--el-bg-color-overlay);
+}
+`
+ }
+ ],
+ [
+ /^layout-border__left$/,
+ ([], { rawSelector }) => {
+ const selector = e(rawSelector)
+ return `
+${selector}:before {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 1px;
+ height: 100%;
+ background-color: var(--el-border-color);
+ z-index: 3;
+}
+`
+ }
+ ],
+ [
+ /^layout-border__right$/,
+ ([], { rawSelector }) => {
+ const selector = e(rawSelector)
+ return `
+${selector}:after {
+ content: "";
+ position: absolute;
+ top: 0;
+ right: 0;
+ width: 1px;
+ height: 100%;
+ background-color: var(--el-border-color);
+ z-index: 3;
+}
+`
+ }
+ ],
+ [
+ /^layout-border__top$/,
+ ([], { rawSelector }) => {
+ const selector = e(rawSelector)
+ return `
+${selector}:before {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 1px;
+ background-color: var(--el-border-color);
+ z-index: 3;
+}
+`
+ }
+ ],
+ [
+ /^layout-border__bottom$/,
+ ([], { rawSelector }) => {
+ const selector = e(rawSelector)
+ return `
+${selector}:after {
+ content: "";
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 1px;
+ background-color: var(--el-border-color);
+ z-index: 3;
+}
+`
+ }
+ ]
+ ],
+ presets: [presetUno({ dark: 'class', attributify: false }), ...createPresetIcons()],
+ transformers: [transformerVariantGroup()],
+ content: {
+ pipeline: {
+ include: [/\.(vue|svelte|[jt]sx|mdx?|astro|elm|php|phtml|html|ts)($|\?)/]
+ }
+ }
+})
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 0000000..749c3c1
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,181 @@
+import { resolve } from 'path'
+import { loadEnv } from 'vite'
+import type { UserConfig, ConfigEnv } from 'vite'
+import Vue from '@vitejs/plugin-vue'
+import VueJsx from '@vitejs/plugin-vue-jsx'
+import progress from 'vite-plugin-progress'
+import EslintPlugin from 'vite-plugin-eslint'
+import { ViteEjsPlugin } from 'vite-plugin-ejs'
+import { viteMockServe } from 'vite-plugin-mock'
+import PurgeIcons from 'vite-plugin-purge-icons'
+import ServerUrlCopy from 'vite-plugin-url-copy'
+import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite'
+import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
+import { createStyleImportPlugin, ElementPlusResolve } from 'vite-plugin-style-import'
+import UnoCSS from 'unocss/vite'
+import { visualizer } from 'rollup-plugin-visualizer'
+
+// https://vitejs.dev/config/
+const root = process.cwd()
+
+function pathResolve(dir: string) {
+ return resolve(root, '.', dir)
+}
+
+export default ({ command, mode }: ConfigEnv): UserConfig => {
+ let env = {} as any
+ const isBuild = command === 'build'
+ if (!isBuild) {
+ env = loadEnv(process.argv[3] === '--mode' ? process.argv[4] : process.argv[3], root)
+ } else {
+ env = loadEnv(mode, root)
+ }
+ return {
+ base: env.VITE_BASE_PATH,
+ plugins: [
+ Vue({
+ script: {
+ // 开启defineModel
+ defineModel: true
+ }
+ }),
+ VueJsx(),
+ ServerUrlCopy(),
+ progress(),
+ env.VITE_USE_ALL_ELEMENT_PLUS_STYLE === 'false'
+ ? createStyleImportPlugin({
+ resolves: [ElementPlusResolve()],
+ libs: [
+ {
+ libraryName: 'element-plus',
+ esModule: true,
+ resolveStyle: (name) => {
+ if (name === 'click-outside') {
+ return ''
+ }
+ return `element-plus/es/components/${name.replace(/^el-/, '')}/style/css`
+ }
+ }
+ ]
+ })
+ : undefined,
+ EslintPlugin({
+ cache: false,
+ failOnWarning: false,
+ failOnError: false,
+ include: ['src/**/*.vue', 'src/**/*.ts', 'src/**/*.tsx'] // 检查的文件
+ }),
+ VueI18nPlugin({
+ runtimeOnly: true,
+ compositionOnly: true,
+ include: [resolve(__dirname, 'src/locales/**')]
+ }),
+ createSvgIconsPlugin({
+ iconDirs: [pathResolve('src/assets/svgs')],
+ symbolId: 'icon-[dir]-[name]',
+ svgoOptions: true
+ }),
+ PurgeIcons(),
+ env.VITE_USE_MOCK === 'true'
+ ? viteMockServe({
+ ignore: /^\_/,
+ mockPath: 'mock',
+ localEnabled: !isBuild,
+ prodEnabled: isBuild,
+ injectCode: `
+ import { setupProdMockServer } from '../mock/_createProductionServer'
+
+ setupProdMockServer()
+ `
+ })
+ : undefined,
+ ViteEjsPlugin({
+ title: env.VITE_APP_TITLE
+ }),
+ UnoCSS()
+ ],
+
+ css: {
+ preprocessorOptions: {
+ less: {
+ additionalData: '@import "./src/styles/variables.module.less";',
+ javascriptEnabled: true
+ }
+ }
+ },
+ resolve: {
+ extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.less', '.css'],
+ alias: [
+ {
+ find: 'vue-i18n',
+ replacement: 'vue-i18n/dist/vue-i18n.cjs.js'
+ },
+ {
+ find: /\@\//,
+ replacement: `${pathResolve('src')}/`
+ }
+ ]
+ },
+ esbuild: {
+ pure: env.VITE_DROP_CONSOLE === 'true' ? ['console.log'] : undefined,
+ drop: env.VITE_DROP_DEBUGGER === 'true' ? ['debugger'] : undefined
+ },
+ build: {
+ target: 'es2015',
+ outDir: env.VITE_OUT_DIR || 'dist',
+ sourcemap: env.VITE_SOURCEMAP === 'true',
+ // brotliSize: false,
+ rollupOptions: {
+ plugins: env.VITE_USE_BUNDLE_ANALYZER === 'true' ? [visualizer()] : undefined,
+ // 拆包
+ output: {
+ manualChunks: {
+ 'vue-chunks': ['vue', 'vue-router', 'pinia', 'vue-i18n'],
+ 'element-plus': ['element-plus'],
+ 'wang-editor': ['@wangeditor/editor', '@wangeditor/editor-for-vue'],
+ echarts: ['echarts', 'echarts-wordcloud']
+ }
+ }
+ },
+ cssCodeSplit: !(env.VITE_USE_CSS_SPLIT === 'false'),
+ cssTarget: ['chrome31']
+ },
+ server: {
+ port: 4000,
+ proxy: {
+ // 选项写法
+ '/api': {
+ target: 'http://127.0.0.1:8000',
+ changeOrigin: true,
+ rewrite: (path) => path.replace(/^\/api/, '')
+ }
+ },
+ hmr: {
+ overlay: false
+ },
+ host: '0.0.0.0'
+ },
+ optimizeDeps: {
+ include: [
+ 'vue',
+ 'vue-router',
+ 'vue-types',
+ 'element-plus/es/locale/lang/zh-cn',
+ 'element-plus/es/locale/lang/en',
+ '@iconify/iconify',
+ '@vueuse/core',
+ 'axios',
+ 'qs',
+ 'echarts',
+ 'echarts-wordcloud',
+ 'qrcode',
+ '@wangeditor/editor',
+ '@wangeditor/editor-for-vue',
+ 'vue-json-pretty',
+ '@zxcvbn-ts/core',
+ 'dayjs',
+ 'cropperjs'
+ ]
+ }
+ }
+}