commit 3f349a35a4a0cecf854eee0069873a1a7ae2a368
Author: zhenhui <1276357500@qq.com>
Date: Tue Mar 3 09:53:54 2026 +0800
初始化
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..8b5dc09
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2026 saithink
+
+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..44ae9f2
--- /dev/null
+++ b/README.md
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
SaiAdmin 6.x
+
+## 项目简介
+
+SaiAdmin 是一个基于 [Webman](https://www.workerman.net/webman) 的高性能后台管理系统插件。它提供了完整的权限管理、系统配置、代码生成等功能,帮助开发者快速构建企业级应用。
+
+---
+
+## ✨ 核心特性
+
+- **🚀 高性能** - 基于 Webman 常驻内存框架,性能优异
+- **🔐 完整权限系统** - RBAC 权限模型,支持用户、角色、部门、岗位管理
+- **📝 代码生成器** - 一键生成 CRUD 代码,提升开发效率
+- **⚡ 双 ORM 支持** - 同时支持 ThinkORM 和 Eloquent ORM
+- **🔧 插件化架构** - 支持插件扩展,便于功能模块化
+- **📊 系统监控** - 内置服务器监控、缓存管理功能
+- **📋 日志系统** - 完整的登录日志和操作日志记录
+
+## 🛠️ 功能模块
+
+### 系统管理
+
+| 模块 | 说明 |
+| ---------- | -------------------------------- |
+| 用户管理 | 用户增删改查、密码管理、缓存清理 |
+| 角色管理 | 角色 CRUD、菜单权限分配 |
+| 部门管理 | 组织架构管理、树形结构 |
+| 岗位管理 | 岗位信息维护、Excel 模板导入导出 |
+| 菜单管理 | 菜单配置、按钮权限 |
+| 字典管理 | 字典类型与字典数据维护 |
+| 附件管理 | 文件上传、分类管理、资源移动 |
+| 系统配置 | 分组配置、邮件设置、动态参数 |
+| 日志管理 | 登录日志、操作日志查询与清理 |
+| 服务监控 | 服务器状态、缓存信息、一键清理 |
+| 数据表维护 | 数据表结构、表优化、碎片整理 |
+
+### 开发工具
+
+| 模块 | 说明 |
+| -------- | ---------------------------- |
+| 代码生成 | 根据数据表自动生成 CRUD 代码 |
+| 定时任务 | Crontab 任务管理、执行日志 |
+
+
学习
+
+
+
+
+
演示地址
+
演示地址: http://v6.saithink.top
+
演示账号:admin
+
演示密码:123456
+
+
共同交流
+
+
+
+
+
+
+ saiadmin交流群(添加我微信备注"saiadmin")
+
+
+
+
+
+
支持项目
+
+如果您正在使用这个项目并感觉良好,或者是想支持我继续开发,您可以通过如下`任意`方式支持我:
+
+谢谢! ❤️
+
+
+| 微信 | 支付宝 |
+| :------------------------------------------------------------------------------: | :------------------------------------------------------------------------------: |
+|
|
|
+
+
+
LICENSE
+This project is open-sourced software licensed under the MIT.
+
+
+
diff --git a/saiadmin-artd/.env b/saiadmin-artd/.env
new file mode 100644
index 0000000..402bfb1
--- /dev/null
+++ b/saiadmin-artd/.env
@@ -0,0 +1,22 @@
+# 【通用】环境变量
+
+# 版本号
+VITE_VERSION = 3.0.1
+
+# 端口号
+VITE_PORT = 3006
+
+# 应用部署基础路径(如部署在子目录 /admin,则设置为 /admin/)
+VITE_BASE_URL = /
+
+# 权限模式【 frontend 前端模式 / backend 后端模式 】
+VITE_ACCESS_MODE = backend
+
+# 跨域请求时是否携带 Cookie(开启前需确保后端支持)
+VITE_WITH_CREDENTIALS = false
+
+# 是否打开路由信息
+VITE_OPEN_ROUTE_INFO = false
+
+# 锁屏加密密钥
+VITE_LOCK_ENCRYPT_KEY = s3cur3k3y4adpro
diff --git a/saiadmin-artd/.env.development b/saiadmin-artd/.env.development
new file mode 100644
index 0000000..20b591a
--- /dev/null
+++ b/saiadmin-artd/.env.development
@@ -0,0 +1,13 @@
+# 【开发】环境变量
+
+# 应用部署基础路径(如部署在子目录 /admin,则设置为 /admin/)
+VITE_BASE_URL = /
+
+# API 请求基础路径(开发环境设置为 / 使用代理,生产环境设置为完整后端地址)
+VITE_API_URL = /api
+
+# 代理目标地址(开发环境通过 Vite 代理转发请求到此地址,解决跨域问题)
+VITE_API_PROXY_URL = http://127.0.0.1:8787
+
+# Delete console
+VITE_DROP_CONSOLE = false
\ No newline at end of file
diff --git a/saiadmin-artd/.env.production b/saiadmin-artd/.env.production
new file mode 100644
index 0000000..a59b0fc
--- /dev/null
+++ b/saiadmin-artd/.env.production
@@ -0,0 +1,10 @@
+# 【生产】环境变量
+
+# 应用部署基础路径(如部署在子目录 /admin,则设置为 /admin/)
+VITE_BASE_URL = /
+
+# API 地址前缀
+VITE_API_URL = /prod
+
+# Delete console
+VITE_DROP_CONSOLE = true
\ No newline at end of file
diff --git a/saiadmin-artd/.gitattributes b/saiadmin-artd/.gitattributes
new file mode 100644
index 0000000..866e8ee
--- /dev/null
+++ b/saiadmin-artd/.gitattributes
@@ -0,0 +1,2 @@
+*.html linguist-detectable=false
+*.vue linguist-detectable=true
diff --git a/saiadmin-artd/.gitignore b/saiadmin-artd/.gitignore
new file mode 100644
index 0000000..e48d2e9
--- /dev/null
+++ b/saiadmin-artd/.gitignore
@@ -0,0 +1,11 @@
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+.cursorrules
+
+# Auto-generated files
+src/types/import/auto-imports.d.ts
+src/types/import/components.d.ts
+.auto-import.json
diff --git a/saiadmin-artd/.husky/commit-msg b/saiadmin-artd/.husky/commit-msg
new file mode 100644
index 0000000..09d2b14
--- /dev/null
+++ b/saiadmin-artd/.husky/commit-msg
@@ -0,0 +1 @@
+pnpm dlx commitlint --edit $1
\ No newline at end of file
diff --git a/saiadmin-artd/.husky/pre-commit b/saiadmin-artd/.husky/pre-commit
new file mode 100644
index 0000000..22c0347
--- /dev/null
+++ b/saiadmin-artd/.husky/pre-commit
@@ -0,0 +1 @@
+pnpm run lint:lint-staged
\ No newline at end of file
diff --git a/saiadmin-artd/.prettierignore b/saiadmin-artd/.prettierignore
new file mode 100644
index 0000000..9e96efc
--- /dev/null
+++ b/saiadmin-artd/.prettierignore
@@ -0,0 +1,3 @@
+/node_modules/*
+/dist/*
+/src/main.ts
\ No newline at end of file
diff --git a/saiadmin-artd/.prettierrc b/saiadmin-artd/.prettierrc
new file mode 100644
index 0000000..f3d6ad5
--- /dev/null
+++ b/saiadmin-artd/.prettierrc
@@ -0,0 +1,20 @@
+{
+ "printWidth": 100,
+ "tabWidth": 2,
+ "useTabs": false,
+ "semi": false,
+ "vueIndentScriptAndStyle": true,
+ "singleQuote": true,
+ "quoteProps": "as-needed",
+ "bracketSpacing": true,
+ "trailingComma": "none",
+ "bracketSameLine": false,
+ "jsxSingleQuote": false,
+ "arrowParens": "always",
+ "insertPragma": false,
+ "requirePragma": false,
+ "proseWrap": "never",
+ "htmlWhitespaceSensitivity": "strict",
+ "endOfLine": "auto",
+ "rangeStart": 0
+}
diff --git a/saiadmin-artd/.stylelintignore b/saiadmin-artd/.stylelintignore
new file mode 100644
index 0000000..476ea45
--- /dev/null
+++ b/saiadmin-artd/.stylelintignore
@@ -0,0 +1,9 @@
+dist
+node_modules
+public
+.husky
+.vscode
+
+src/components/Layout/MenuLeft/index.vue
+src/assets
+stats.html
\ No newline at end of file
diff --git a/saiadmin-artd/.stylelintrc.cjs b/saiadmin-artd/.stylelintrc.cjs
new file mode 100644
index 0000000..9dbea0b
--- /dev/null
+++ b/saiadmin-artd/.stylelintrc.cjs
@@ -0,0 +1,82 @@
+module.exports = {
+ // 继承推荐规范配置
+ extends: [
+ 'stylelint-config-standard',
+ 'stylelint-config-recommended-scss',
+ 'stylelint-config-recommended-vue/scss',
+ 'stylelint-config-html/vue',
+ 'stylelint-config-recess-order'
+ ],
+ // 指定不同文件对应的解析器
+ overrides: [
+ {
+ files: ['**/*.{vue,html}'],
+ customSyntax: 'postcss-html'
+ },
+ {
+ files: ['**/*.{css,scss}'],
+ customSyntax: 'postcss-scss'
+ }
+ ],
+ // 自定义规则
+ rules: {
+ 'import-notation': 'string', // 指定导入CSS文件的方式("string"|"url")
+ 'selector-class-pattern': null, // 选择器类名命名规则
+ 'custom-property-pattern': null, // 自定义属性命名规则
+ 'keyframes-name-pattern': null, // 动画帧节点样式命名规则
+ 'no-descending-specificity': null, // 允许无降序特异性
+ 'no-empty-source': null, // 允许空样式
+ 'property-no-vendor-prefix': null, // 允许属性前缀
+ // 允许 global 、export 、deep伪类
+ 'selector-pseudo-class-no-unknown': [
+ true,
+ {
+ ignorePseudoClasses: ['global', 'export', 'deep']
+ }
+ ],
+ // 允许未知属性
+ 'property-no-unknown': [
+ true,
+ {
+ ignoreProperties: []
+ }
+ ],
+ // 允许未知规则
+ 'at-rule-no-unknown': [
+ true,
+ {
+ ignoreAtRules: [
+ 'apply',
+ 'use',
+ 'mixin',
+ 'include',
+ 'extend',
+ 'each',
+ 'if',
+ 'else',
+ 'for',
+ 'while',
+ 'reference'
+ ]
+ }
+ ],
+ 'scss/at-rule-no-unknown': [
+ true,
+ {
+ ignoreAtRules: [
+ 'apply',
+ 'use',
+ 'mixin',
+ 'include',
+ 'extend',
+ 'each',
+ 'if',
+ 'else',
+ 'for',
+ 'while',
+ 'reference'
+ ]
+ }
+ ]
+ }
+}
diff --git a/saiadmin-artd/.vscode/extensions.json b/saiadmin-artd/.vscode/extensions.json
new file mode 100644
index 0000000..d7766fa
--- /dev/null
+++ b/saiadmin-artd/.vscode/extensions.json
@@ -0,0 +1,10 @@
+{
+ "recommendations": [
+ "vue.volar",
+ "dbaeumer.vscode-eslint",
+ "esbenp.prettier-vscode",
+ "stylelint.vscode-stylelint",
+ "lokalise.i18n-ally",
+ "bradlc.vscode-tailwindcss"
+ ]
+}
diff --git a/saiadmin-artd/.vscode/settings.json b/saiadmin-artd/.vscode/settings.json
new file mode 100644
index 0000000..40499ab
--- /dev/null
+++ b/saiadmin-artd/.vscode/settings.json
@@ -0,0 +1,18 @@
+{
+ "volar.inlayHints.eventArgumentInInlineHandlers": true,
+ "css.lint.unknownAtRules": "ignore",
+ "i18n-ally.localesPaths": ["src/locales/langs", "src/locales"],
+ "i18n-ally.enabledParsers": ["json"],
+ "i18n-ally.sourceLanguage": "en",
+ "i18n-ally.displayLanguage": "zh",
+ "i18n-ally.enabledFrameworks": ["vue", "react"],
+ "i18n-ally.keystyle": "nested",
+ "i18n-ally.sortKeys": true,
+ "i18n-ally.namespace": true,
+ "editor.formatOnSave": true,
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
+ "prettier.requireConfig": true,
+ "[vue]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ }
+}
diff --git a/saiadmin-artd/LICENSE b/saiadmin-artd/LICENSE
new file mode 100644
index 0000000..68322de
--- /dev/null
+++ b/saiadmin-artd/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025 SuperManTT
+
+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/saiadmin-artd/SAIADMIN.md b/saiadmin-artd/SAIADMIN.md
new file mode 100644
index 0000000..2811ffb
--- /dev/null
+++ b/saiadmin-artd/SAIADMIN.md
@@ -0,0 +1,31 @@
+## 前端开发
+
+[module] 代表一个应用模块
+
+[business] 代表一个功能模块分组
+
+[table] 代表一个具体的功能
+
+### 前端开发规范
+
+```
+src/views/plugin/[module]/
+├── api
+│ ├── [business]/ # 功能模块接口分组
+| │ ├── [table].ts # 具体功能接口
+├── [business]/ # 功能模块分组
+│ ├── [table]/ # 具体功能目录
+│ │ ├── index.vue # 功能主页面(列表页)
+│ │ └── modules/ # 子组件目录
+│ │ ├── table-search.vue # 搜索表单组件
+│ │ └── edit-dialog.vue # 编辑弹窗组件
+```
+
+### 组件说明
+
+| 组件文件 | 说明 |
+|---------|------|
+| `table.ts` | 具体功能接口
+| `index.vue` | 功能主页面,包含列表展示、操作按钮等 |
+| `modules/table-search.vue` | 搜索表单组件,用于筛选列表数据 |
+| `modules/edit-dialog.vue` | 编辑弹窗组件,用于新增/编辑数据 |
\ No newline at end of file
diff --git a/saiadmin-artd/commitlint.config.cjs b/saiadmin-artd/commitlint.config.cjs
new file mode 100644
index 0000000..d2ef1bd
--- /dev/null
+++ b/saiadmin-artd/commitlint.config.cjs
@@ -0,0 +1,97 @@
+/**
+ * commitlint 配置文件
+ * 文档
+ * https://commitlint.js.org/#/reference-rules
+ * https://cz-git.qbb.sh/zh/guide/
+ */
+
+module.exports = {
+ // 继承的规则
+ extends: ['@commitlint/config-conventional'],
+ // 自定义规则
+ rules: {
+ // 提交类型枚举,git提交type必须是以下类型
+ 'type-enum': [
+ 2,
+ 'always',
+ [
+ 'feat', // 新增功能
+ 'fix', // 修复缺陷
+ 'docs', // 文档变更
+ 'style', // 代码格式(不影响功能,例如空格、分号等格式修正)
+ 'refactor', // 代码重构(不包括 bug 修复、功能新增)
+ 'perf', // 性能优化
+ 'test', // 添加疏漏测试或已有测试改动
+ 'build', // 构建流程、外部依赖变更(如升级 npm 包、修改 webpack 配置等)
+ 'ci', // 修改 CI 配置、脚本
+ 'revert', // 回滚 commit
+ 'chore', // 对构建过程或辅助工具和库的更改(不影响源文件、测试用例)
+ 'wip' // 对构建过程或辅助工具和库的更改(不影响源文件、测试用例)
+ ]
+ ],
+ 'subject-case': [0] // subject大小写不做校验
+ },
+
+ prompt: {
+ messages: {
+ type: '选择你要提交的类型 :',
+ scope: '选择一个提交范围(可选):',
+ customScope: '请输入自定义的提交范围 :',
+ subject: '填写简短精炼的变更描述 :\n',
+ body: '填写更加详细的变更描述(可选)。使用 "|" 换行 :\n',
+ breaking: '列举非兼容性重大的变更(可选)。使用 "|" 换行 :\n',
+ footerPrefixesSelect: '选择关联issue前缀(可选):',
+ customFooterPrefix: '输入自定义issue前缀 :',
+ footer: '列举关联issue (可选) 例如: #31, #I3244 :\n',
+ generatingByAI: '正在通过 AI 生成你的提交简短描述...',
+ generatedSelectByAI: '选择一个 AI 生成的简短描述:',
+ confirmCommit: '是否提交或修改commit ?'
+ },
+ // prettier-ignore
+ types: [
+ { value: "feat", name: "feat: 新增功能" },
+ { value: "fix", name: "fix: 修复缺陷" },
+ { value: "docs", name: "docs: 文档变更" },
+ { value: "style", name: "style: 代码格式(不影响功能,例如空格、分号等格式修正)" },
+ { value: "refactor", name: "refactor: 代码重构(不包括 bug 修复、功能新增)" },
+ { value: "perf", name: "perf: 性能优化" },
+ { value: "test", name: "test: 添加疏漏测试或已有测试改动" },
+ { value: "build", name: "build: 构建流程、外部依赖变更(如升级 npm 包、修改 vite 配置等)" },
+ { value: "ci", name: "ci: 修改 CI 配置、脚本" },
+ { value: "revert", name: "revert: 回滚 commit" },
+ { value: "chore", name: "chore: 对构建过程或辅助工具和库的更改(不影响源文件、测试用例)" },
+ ],
+ useEmoji: true,
+ emojiAlign: 'center',
+ useAI: false,
+ aiNumber: 1,
+ themeColorCode: '',
+ scopes: [],
+ allowCustomScopes: true,
+ allowEmptyScopes: true,
+ customScopesAlign: 'bottom',
+ customScopesAlias: 'custom',
+ emptyScopesAlias: 'empty',
+ upperCaseSubject: false,
+ markBreakingChangeMode: false,
+ allowBreakingChanges: ['feat', 'fix'],
+ breaklineNumber: 100,
+ breaklineChar: '|',
+ skipQuestions: ['breaking', 'footerPrefix', 'footer'], // 跳过的步骤
+ issuePrefixes: [{ value: 'closed', name: 'closed: ISSUES has been processed' }],
+ customIssuePrefixAlign: 'top',
+ emptyIssuePrefixAlias: 'skip',
+ customIssuePrefixAlias: 'custom',
+ allowCustomIssuePrefix: true,
+ allowEmptyIssuePrefix: true,
+ confirmColorize: true,
+ maxHeaderLength: Infinity,
+ maxSubjectLength: Infinity,
+ minSubjectLength: 0,
+ scopeOverrides: undefined,
+ defaultBody: '',
+ defaultIssues: '',
+ defaultScope: '',
+ defaultSubject: ''
+ }
+}
diff --git a/saiadmin-artd/eslint.config.mjs b/saiadmin-artd/eslint.config.mjs
new file mode 100644
index 0000000..bb317f6
--- /dev/null
+++ b/saiadmin-artd/eslint.config.mjs
@@ -0,0 +1,83 @@
+// 从 URL 和路径模块中导入必要的功能
+import fs from 'fs'
+import path, { dirname } from 'path'
+import { fileURLToPath } from 'url'
+
+// 从 ESLint 插件中导入推荐配置
+import pluginJs from '@eslint/js'
+import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'
+import pluginVue from 'eslint-plugin-vue'
+import globals from 'globals'
+import tseslint from 'typescript-eslint'
+
+// 使用 import.meta.url 获取当前模块的路径
+const __filename = fileURLToPath(import.meta.url)
+const __dirname = dirname(__filename)
+
+// 读取 .auto-import.json 文件的内容,并将其解析为 JSON 对象
+const autoImportConfig = JSON.parse(
+ fs.readFileSync(path.resolve(__dirname, '.auto-import.json'), 'utf-8')
+)
+
+export default [
+ // 指定文件匹配规则
+ {
+ files: ['**/*.{js,mjs,cjs,ts,vue}']
+ },
+ // 指定全局变量和环境
+ {
+ languageOptions: {
+ globals: {
+ ...globals.browser,
+ ...globals.node
+ }
+ }
+ },
+ // 扩展配置
+ pluginJs.configs.recommended,
+ ...tseslint.configs.recommended,
+ ...pluginVue.configs['flat/essential'],
+ // 自定义规则
+ {
+ // 针对所有 JavaScript、TypeScript 和 Vue 文件应用以下配置
+ files: ['**/*.{js,mjs,cjs,ts,vue}'],
+
+ languageOptions: {
+ globals: {
+ // 合并从 autoImportConfig 中读取的全局变量配置
+ ...autoImportConfig.globals,
+ // TypeScript 全局命名空间
+ Api: 'readonly'
+ }
+ },
+ rules: {
+ quotes: ['error', 'single'], // 使用单引号
+ semi: ['error', 'never'], // 语句末尾不加分号
+ 'no-var': 'error', // 要求使用 let 或 const 而不是 var
+ '@typescript-eslint/no-explicit-any': 'off', // 禁用 any 检查
+ 'vue/multi-word-component-names': 'off', // 禁用对 Vue 组件名称的多词要求检查
+ 'no-multiple-empty-lines': ['warn', { max: 1 }], // 不允许多个空行
+ 'no-unexpected-multiline': 'error' // 禁止空余的多行
+ }
+ },
+ // vue 规则
+ {
+ files: ['**/*.vue'],
+ languageOptions: {
+ parserOptions: { parser: tseslint.parser }
+ }
+ },
+ // 忽略文件
+ {
+ ignores: [
+ 'node_modules',
+ 'dist',
+ 'public',
+ '.vscode/**',
+ 'src/assets/**',
+ 'src/utils/console.ts'
+ ]
+ },
+ // prettier 配置
+ eslintPluginPrettierRecommended
+]
diff --git a/saiadmin-artd/index.html b/saiadmin-artd/index.html
new file mode 100644
index 0000000..e9f36a9
--- /dev/null
+++ b/saiadmin-artd/index.html
@@ -0,0 +1,47 @@
+
+
+
+ SaiAdmin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/package.json b/saiadmin-artd/package.json
new file mode 100644
index 0000000..c438855
--- /dev/null
+++ b/saiadmin-artd/package.json
@@ -0,0 +1,126 @@
+{
+ "name": "art-design-pro",
+ "version": "0.0.0",
+ "type": "module",
+ "engines": {
+ "node": ">=20.19.0",
+ "pnpm": ">=8.8.0"
+ },
+ "scripts": {
+ "dev": "vite --open",
+ "build": "vue-tsc --noEmit && vite build",
+ "serve": "vite preview",
+ "lint": "eslint",
+ "fix": "eslint --fix",
+ "lint:prettier": "prettier --write \"**/*.{js,cjs,ts,json,tsx,css,less,scss,vue,html,md}\"",
+ "lint:stylelint": "stylelint \"**/*.{css,scss,vue}\" --fix",
+ "lint:lint-staged": "lint-staged",
+ "prepare": "husky",
+ "commit": "git-cz",
+ "clean:dev": "tsx scripts/clean-dev.ts"
+ },
+ "config": {
+ "commitizen": {
+ "path": "node_modules/cz-git"
+ }
+ },
+ "lint-staged": {
+ "*.{js,ts,mjs,mts,tsx}": [
+ "eslint --fix",
+ "prettier --write"
+ ],
+ "*.{cjs,json,jsonc}": [
+ "prettier --write"
+ ],
+ "*.vue": [
+ "eslint --fix",
+ "stylelint --fix --allow-empty-input",
+ "prettier --write"
+ ],
+ "*.{html,htm}": [
+ "prettier --write"
+ ],
+ "*.{scss,css,less}": [
+ "stylelint --fix --allow-empty-input",
+ "prettier --write"
+ ],
+ "*.{md,mdx}": [
+ "prettier --write"
+ ],
+ "*.{yaml,yml}": [
+ "prettier --write"
+ ]
+ },
+ "dependencies": {
+ "@element-plus/icons-vue": "^2.3.2",
+ "@iconify/vue": "^5.0.0",
+ "@tailwindcss/vite": "^4.1.14",
+ "@vue/reactivity": "^3.5.21",
+ "@vueuse/core": "^13.9.0",
+ "@wangeditor/editor": "^5.1.23",
+ "@wangeditor/editor-for-vue": "next",
+ "axios": "^1.12.2",
+ "crypto-js": "^4.2.0",
+ "echarts": "^6.0.0",
+ "element-plus": "^2.11.2",
+ "file-saver": "^2.0.5",
+ "highlight.js": "^11.10.0",
+ "mitt": "^3.0.1",
+ "md-editor-v3": "^6.3.1",
+ "nprogress": "^0.2.0",
+ "ohash": "^2.0.11",
+ "pinia": "^3.0.3",
+ "pinia-plugin-persistedstate": "^4.3.0",
+ "qrcode.vue": "^3.6.0",
+ "spark-md5": "^3.0.2",
+ "tailwindcss": "^4.1.14",
+ "vue": "^3.5.21",
+ "vue-draggable-plus": "^0.6.0",
+ "vue-i18n": "^9.14.0",
+ "vue-router": "^4.5.1",
+ "xgplayer": "^3.0.20",
+ "xlsx": "^0.18.5"
+ },
+ "devDependencies": {
+ "@commitlint/cli": "^19.4.1",
+ "@commitlint/config-conventional": "^19.4.1",
+ "@eslint/js": "^9.9.1",
+ "@types/node": "^24.0.5",
+ "@types/spark-md5": "^3.0.5",
+ "@typescript-eslint/eslint-plugin": "^8.3.0",
+ "@typescript-eslint/parser": "^8.3.0",
+ "@vitejs/plugin-vue": "^6.0.1",
+ "@vue/compiler-sfc": "^3.0.5",
+ "commitizen": "^4.3.0",
+ "cz-git": "^1.11.1",
+ "eslint": "^9.9.1",
+ "eslint-config-prettier": "^9.1.0",
+ "eslint-plugin-prettier": "^5.2.1",
+ "eslint-plugin-vue": "^9.27.0",
+ "globals": "^15.9.0",
+ "husky": "^9.1.5",
+ "lint-staged": "^15.5.2",
+ "prettier": "^3.5.3",
+ "rollup-plugin-visualizer": "^5.12.0",
+ "sass": "^1.81.0",
+ "stylelint": "^16.20.0",
+ "stylelint-config-html": "^1.1.0",
+ "stylelint-config-recess-order": "^4.6.0",
+ "stylelint-config-recommended-scss": "^14.1.0",
+ "stylelint-config-recommended-vue": "^1.5.0",
+ "stylelint-config-standard": "^36.0.1",
+ "terser": "^5.36.0",
+ "tsx": "^4.20.3",
+ "typescript": "~5.6.3",
+ "typescript-eslint": "^8.9.0",
+ "unplugin-auto-import": "^20.2.0",
+ "unplugin-element-plus": "^0.10.0",
+ "unplugin-vue-components": "^29.1.0",
+ "vite": "^7.1.5",
+ "vite-plugin-compression": "^0.5.1",
+ "vite-plugin-vue-devtools": "^7.7.6",
+ "vue-demi": "^0.14.9",
+ "vue-img-cutter": "^3.0.5",
+ "vue-tsc": "~2.1.6"
+ }
+}
diff --git a/saiadmin-artd/pnpm-lock.yaml b/saiadmin-artd/pnpm-lock.yaml
new file mode 100644
index 0000000..ebc4b0c
--- /dev/null
+++ b/saiadmin-artd/pnpm-lock.yaml
@@ -0,0 +1,7553 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ '@element-plus/icons-vue':
+ specifier: ^2.3.2
+ version: 2.3.2(vue@3.5.22(typescript@5.6.3))
+ '@iconify/vue':
+ specifier: ^5.0.0
+ version: 5.0.0(vue@3.5.22(typescript@5.6.3))
+ '@tailwindcss/vite':
+ specifier: ^4.1.14
+ version: 4.1.14(vite@7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
+ '@vue/reactivity':
+ specifier: ^3.5.21
+ version: 3.5.22
+ '@vueuse/core':
+ specifier: ^13.9.0
+ version: 13.9.0(vue@3.5.22(typescript@5.6.3))
+ '@wangeditor/editor':
+ specifier: ^5.1.23
+ version: 5.1.23
+ '@wangeditor/editor-for-vue':
+ specifier: next
+ version: 5.1.12(@wangeditor/editor@5.1.23)(vue@3.5.22(typescript@5.6.3))
+ axios:
+ specifier: ^1.12.2
+ version: 1.12.2
+ crypto-js:
+ specifier: ^4.2.0
+ version: 4.2.0
+ echarts:
+ specifier: ^6.0.0
+ version: 6.0.0
+ element-plus:
+ specifier: ^2.11.2
+ version: 2.11.4(vue@3.5.22(typescript@5.6.3))
+ file-saver:
+ specifier: ^2.0.5
+ version: 2.0.5
+ highlight.js:
+ specifier: ^11.10.0
+ version: 11.11.1
+ mitt:
+ specifier: ^3.0.1
+ version: 3.0.1
+ nprogress:
+ specifier: ^0.2.0
+ version: 0.2.0
+ ohash:
+ specifier: ^2.0.11
+ version: 2.0.11
+ pinia:
+ specifier: ^3.0.3
+ version: 3.0.3(typescript@5.6.3)(vue@3.5.22(typescript@5.6.3))
+ pinia-plugin-persistedstate:
+ specifier: ^4.3.0
+ version: 4.5.0(pinia@3.0.3(typescript@5.6.3)(vue@3.5.22(typescript@5.6.3)))
+ qrcode.vue:
+ specifier: ^3.6.0
+ version: 3.6.0(vue@3.5.22(typescript@5.6.3))
+ spark-md5:
+ specifier: ^3.0.2
+ version: 3.0.2
+ tailwindcss:
+ specifier: ^4.1.14
+ version: 4.1.14
+ vue:
+ specifier: ^3.5.21
+ version: 3.5.22(typescript@5.6.3)
+ vue-draggable-plus:
+ specifier: ^0.6.0
+ version: 0.6.0(@types/sortablejs@1.15.8)
+ vue-i18n:
+ specifier: ^9.14.0
+ version: 9.14.5(vue@3.5.22(typescript@5.6.3))
+ vue-router:
+ specifier: ^4.5.1
+ version: 4.5.1(vue@3.5.22(typescript@5.6.3))
+ xgplayer:
+ specifier: ^3.0.20
+ version: 3.0.23(core-js@3.45.1)
+ xlsx:
+ specifier: ^0.18.5
+ version: 0.18.5
+ devDependencies:
+ '@commitlint/cli':
+ specifier: ^19.4.1
+ version: 19.8.1(@types/node@24.8.1)(typescript@5.6.3)
+ '@commitlint/config-conventional':
+ specifier: ^19.4.1
+ version: 19.8.1
+ '@eslint/js':
+ specifier: ^9.9.1
+ version: 9.36.0
+ '@types/node':
+ specifier: ^24.0.5
+ version: 24.8.1
+ '@types/spark-md5':
+ specifier: ^3.0.5
+ version: 3.0.5
+ '@typescript-eslint/eslint-plugin':
+ specifier: ^8.3.0
+ version: 8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.6.3))(eslint@9.36.0(jiti@2.6.0))(typescript@5.6.3)
+ '@typescript-eslint/parser':
+ specifier: ^8.3.0
+ version: 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.6.3)
+ '@vitejs/plugin-vue':
+ specifier: ^6.0.1
+ version: 6.0.1(vite@7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.6.3))
+ '@vue/compiler-sfc':
+ specifier: ^3.0.5
+ version: 3.5.22
+ commitizen:
+ specifier: ^4.3.0
+ version: 4.3.1(@types/node@24.8.1)(typescript@5.6.3)
+ cz-git:
+ specifier: ^1.11.1
+ version: 1.12.0
+ eslint:
+ specifier: ^9.9.1
+ version: 9.36.0(jiti@2.6.0)
+ eslint-config-prettier:
+ specifier: ^9.1.0
+ version: 9.1.2(eslint@9.36.0(jiti@2.6.0))
+ eslint-plugin-prettier:
+ specifier: ^5.2.1
+ version: 5.5.4(eslint-config-prettier@9.1.2(eslint@9.36.0(jiti@2.6.0)))(eslint@9.36.0(jiti@2.6.0))(prettier@3.6.2)
+ eslint-plugin-vue:
+ specifier: ^9.27.0
+ version: 9.33.0(eslint@9.36.0(jiti@2.6.0))
+ globals:
+ specifier: ^15.9.0
+ version: 15.15.0
+ husky:
+ specifier: ^9.1.5
+ version: 9.1.7
+ lint-staged:
+ specifier: ^15.5.2
+ version: 15.5.2
+ prettier:
+ specifier: ^3.5.3
+ version: 3.6.2
+ rollup-plugin-visualizer:
+ specifier: ^5.12.0
+ version: 5.14.0(rollup@4.52.3)
+ sass:
+ specifier: ^1.81.0
+ version: 1.93.2
+ stylelint:
+ specifier: ^16.20.0
+ version: 16.24.0(typescript@5.6.3)
+ stylelint-config-html:
+ specifier: ^1.1.0
+ version: 1.1.0(postcss-html@1.8.0)(stylelint@16.24.0(typescript@5.6.3))
+ stylelint-config-recess-order:
+ specifier: ^4.6.0
+ version: 4.6.0(stylelint@16.24.0(typescript@5.6.3))
+ stylelint-config-recommended-scss:
+ specifier: ^14.1.0
+ version: 14.1.0(postcss@8.5.6)(stylelint@16.24.0(typescript@5.6.3))
+ stylelint-config-recommended-vue:
+ specifier: ^1.5.0
+ version: 1.6.1(postcss-html@1.8.0)(stylelint@16.24.0(typescript@5.6.3))
+ stylelint-config-standard:
+ specifier: ^36.0.1
+ version: 36.0.1(stylelint@16.24.0(typescript@5.6.3))
+ terser:
+ specifier: ^5.36.0
+ version: 5.44.0
+ tsx:
+ specifier: ^4.20.3
+ version: 4.20.6
+ typescript:
+ specifier: ~5.6.3
+ version: 5.6.3
+ typescript-eslint:
+ specifier: ^8.9.0
+ version: 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.6.3)
+ unplugin-auto-import:
+ specifier: ^20.2.0
+ version: 20.2.0(@vueuse/core@13.9.0(vue@3.5.22(typescript@5.6.3)))
+ unplugin-element-plus:
+ specifier: ^0.10.0
+ version: 0.10.0
+ unplugin-vue-components:
+ specifier: ^29.1.0
+ version: 29.1.0(@babel/parser@7.28.4)(vue@3.5.22(typescript@5.6.3))
+ vite:
+ specifier: ^7.1.5
+ version: 7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
+ vite-plugin-compression:
+ specifier: ^0.5.1
+ version: 0.5.1(vite@7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
+ vite-plugin-vue-devtools:
+ specifier: ^7.7.6
+ version: 7.7.7(rollup@4.52.3)(vite@7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.6.3))
+ vue-demi:
+ specifier: ^0.14.9
+ version: 0.14.10(vue@3.5.22(typescript@5.6.3))
+ vue-img-cutter:
+ specifier: ^3.0.5
+ version: 3.0.7(typescript@5.6.3)
+ vue-tsc:
+ specifier: ~2.1.6
+ version: 2.1.10(typescript@5.6.3)
+
+packages:
+
+ '@antfu/utils@0.7.10':
+ resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==}
+
+ '@babel/code-frame@7.27.1':
+ resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/compat-data@7.28.4':
+ resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.28.4':
+ resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@7.28.3':
+ resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-annotate-as-pure@7.27.3':
+ resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-compilation-targets@7.27.2':
+ resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-create-class-features-plugin@7.28.3':
+ resolution: {integrity: sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-globals@7.28.0':
+ resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-member-expression-to-functions@7.27.1':
+ resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-imports@7.27.1':
+ resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-transforms@7.28.3':
+ resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-optimise-call-expression@7.27.1':
+ resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-plugin-utils@7.27.1':
+ resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-replace-supers@7.27.1':
+ resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
+ resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.27.1':
+ resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.27.1':
+ resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-option@7.27.1':
+ resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.28.4':
+ resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.28.4':
+ resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/plugin-proposal-decorators@7.28.0':
+ resolution: {integrity: sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-decorators@7.27.1':
+ resolution: {integrity: sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-import-attributes@7.27.1':
+ resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-import-meta@7.10.4':
+ resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-jsx@7.27.1':
+ resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-typescript@7.27.1':
+ resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-typescript@7.28.0':
+ resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/runtime@7.28.4':
+ resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/template@7.27.2':
+ resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.28.4':
+ resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.28.4':
+ resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==}
+ engines: {node: '>=6.9.0'}
+
+ '@cacheable/memoize@2.0.2':
+ resolution: {integrity: sha512-wPrr7FUiq3Qt4yQyda2/NcOLTJCFcQSU3Am2adP+WLy+sz93/fKTokVTHmtz+rjp4PD7ee0AEOeRVNN6IvIfsg==}
+
+ '@cacheable/memory@2.0.2':
+ resolution: {integrity: sha512-sJTITLfeCI1rg7P3ssaGmQryq235EGT8dXGcx6oZwX5NRnKq9IE6lddlllcOl+oXW+yaeTRddCjo0xrfU6ZySA==}
+
+ '@cacheable/utils@2.0.2':
+ resolution: {integrity: sha512-JTFM3raFhVv8LH95T7YnZbf2YoE9wEtkPPStuRF9a6ExZ103hFvs+QyCuYJ6r0hA9wRtbzgZtwUCoDWxssZd4Q==}
+
+ '@commitlint/cli@19.8.1':
+ resolution: {integrity: sha512-LXUdNIkspyxrlV6VDHWBmCZRtkEVRpBKxi2Gtw3J54cGWhLCTouVD/Q6ZSaSvd2YaDObWK8mDjrz3TIKtaQMAA==}
+ engines: {node: '>=v18'}
+ hasBin: true
+
+ '@commitlint/config-conventional@19.8.1':
+ resolution: {integrity: sha512-/AZHJL6F6B/G959CsMAzrPKKZjeEiAVifRyEwXxcT6qtqbPwGw+iQxmNS+Bu+i09OCtdNRW6pNpBvgPrtMr9EQ==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/config-validator@19.8.1':
+ resolution: {integrity: sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/config-validator@20.0.0':
+ resolution: {integrity: sha512-BeyLMaRIJDdroJuYM2EGhDMGwVBMZna9UiIqV9hxj+J551Ctc6yoGuGSmghOy/qPhBSuhA6oMtbEiTmxECafsg==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/ensure@19.8.1':
+ resolution: {integrity: sha512-mXDnlJdvDzSObafjYrOSvZBwkD01cqB4gbnnFuVyNpGUM5ijwU/r/6uqUmBXAAOKRfyEjpkGVZxaDsCVnHAgyw==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/execute-rule@19.8.1':
+ resolution: {integrity: sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/execute-rule@20.0.0':
+ resolution: {integrity: sha512-xyCoOShoPuPL44gVa+5EdZsBVao/pNzpQhkzq3RdtlFdKZtjWcLlUFQHSWBuhk5utKYykeJPSz2i8ABHQA+ZZw==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/format@19.8.1':
+ resolution: {integrity: sha512-kSJj34Rp10ItP+Eh9oCItiuN/HwGQMXBnIRk69jdOwEW9llW9FlyqcWYbHPSGofmjsqeoxa38UaEA5tsbm2JWw==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/is-ignored@19.8.1':
+ resolution: {integrity: sha512-AceOhEhekBUQ5dzrVhDDsbMaY5LqtN8s1mqSnT2Kz1ERvVZkNihrs3Sfk1Je/rxRNbXYFzKZSHaPsEJJDJV8dg==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/lint@19.8.1':
+ resolution: {integrity: sha512-52PFbsl+1EvMuokZXLRlOsdcLHf10isTPlWwoY1FQIidTsTvjKXVXYb7AvtpWkDzRO2ZsqIgPK7bI98x8LRUEw==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/load@19.8.1':
+ resolution: {integrity: sha512-9V99EKG3u7z+FEoe4ikgq7YGRCSukAcvmKQuTtUyiYPnOd9a2/H9Ak1J9nJA1HChRQp9OA/sIKPugGS+FK/k1A==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/load@20.0.0':
+ resolution: {integrity: sha512-WiNKO9fDPlLY90Rruw2HqHKcghrmj5+kMDJ4GcTlX1weL8K07Q6b27C179DxnsrjGCRAKVwFKyzxV4x+xDY28Q==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/message@19.8.1':
+ resolution: {integrity: sha512-+PMLQvjRXiU+Ae0Wc+p99EoGEutzSXFVwQfa3jRNUZLNW5odZAyseb92OSBTKCu+9gGZiJASt76Cj3dLTtcTdg==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/parse@19.8.1':
+ resolution: {integrity: sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/read@19.8.1':
+ resolution: {integrity: sha512-03Jbjb1MqluaVXKHKRuGhcKWtSgh3Jizqy2lJCRbRrnWpcM06MYm8th59Xcns8EqBYvo0Xqb+2DoZFlga97uXQ==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/resolve-extends@19.8.1':
+ resolution: {integrity: sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/resolve-extends@20.0.0':
+ resolution: {integrity: sha512-BA4vva1hY8y0/Hl80YDhe9TJZpRFMsUYzVxvwTLPTEBotbGx/gS49JlVvtF1tOCKODQp7pS7CbxCpiceBgp3Dg==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/rules@19.8.1':
+ resolution: {integrity: sha512-Hnlhd9DyvGiGwjfjfToMi1dsnw1EXKGJNLTcsuGORHz6SS9swRgkBsou33MQ2n51/boIDrbsg4tIBbRpEWK2kw==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/to-lines@19.8.1':
+ resolution: {integrity: sha512-98Mm5inzbWTKuZQr2aW4SReY6WUukdWXuZhrqf1QdKPZBCCsXuG87c+iP0bwtD6DBnmVVQjgp4whoHRVixyPBg==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/top-level@19.8.1':
+ resolution: {integrity: sha512-Ph8IN1IOHPSDhURCSXBz44+CIu+60duFwRsg6HqaISFHQHbmBtxVw4ZrFNIYUzEP7WwrNPxa2/5qJ//NK1FGcw==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/types@19.8.1':
+ resolution: {integrity: sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/types@20.0.0':
+ resolution: {integrity: sha512-bVUNBqG6aznYcYjTjnc3+Cat/iBgbgpflxbIBTnsHTX0YVpnmINPEkSRWymT2Q8aSH3Y7aKnEbunilkYe8TybA==}
+ engines: {node: '>=v18'}
+
+ '@csstools/css-parser-algorithms@3.0.5':
+ resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@csstools/css-tokenizer': ^3.0.4
+
+ '@csstools/css-tokenizer@3.0.4':
+ resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==}
+ engines: {node: '>=18'}
+
+ '@csstools/media-query-list-parser@4.0.3':
+ resolution: {integrity: sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@csstools/css-parser-algorithms': ^3.0.5
+ '@csstools/css-tokenizer': ^3.0.4
+
+ '@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.2.1':
+ resolution: {integrity: sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==}
+
+ '@element-plus/icons-vue@2.3.2':
+ resolution: {integrity: sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==}
+ peerDependencies:
+ vue: ^3.2.0
+
+ '@esbuild/aix-ppc64@0.25.10':
+ resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.25.10':
+ resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.25.10':
+ resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.25.10':
+ resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.25.10':
+ resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.25.10':
+ resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.25.10':
+ resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.25.10':
+ resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.25.10':
+ resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.25.10':
+ resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.25.10':
+ resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.25.10':
+ resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.25.10':
+ resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.25.10':
+ resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.25.10':
+ resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.25.10':
+ resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.25.10':
+ resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-arm64@0.25.10':
+ resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.25.10':
+ resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-arm64@0.25.10':
+ resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.25.10':
+ resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openharmony-arm64@0.25.10':
+ resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@esbuild/sunos-x64@0.25.10':
+ resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.25.10':
+ resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.25.10':
+ resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.25.10':
+ resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@eslint-community/eslint-utils@4.9.0':
+ resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
+ '@eslint-community/regexpp@4.12.1':
+ resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+ '@eslint/config-array@0.21.0':
+ resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/config-helpers@0.3.1':
+ resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/core@0.15.2':
+ resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/eslintrc@3.3.1':
+ resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/js@9.36.0':
+ resolution: {integrity: sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/object-schema@2.1.6':
+ resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/plugin-kit@0.3.5':
+ resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@floating-ui/core@1.7.3':
+ resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==}
+
+ '@floating-ui/dom@1.7.4':
+ resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==}
+
+ '@floating-ui/utils@0.2.10':
+ resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==}
+
+ '@humanfs/core@0.19.1':
+ resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/node@0.16.7':
+ resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanwhocodes/module-importer@1.0.1':
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+
+ '@humanwhocodes/retry@0.4.3':
+ resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
+ engines: {node: '>=18.18'}
+
+ '@iconify/types@2.0.0':
+ resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
+
+ '@iconify/vue@5.0.0':
+ resolution: {integrity: sha512-C+KuEWIF5nSBrobFJhT//JS87OZ++QDORB6f2q2Wm6fl2mueSTpFBeBsveK0KW9hWiZ4mNiPjsh6Zs4jjdROSg==}
+ peerDependencies:
+ vue: '>=3'
+
+ '@intlify/core-base@9.14.5':
+ resolution: {integrity: sha512-5ah5FqZG4pOoHjkvs8mjtv+gPKYU0zCISaYNjBNNqYiaITxW8ZtVih3GS/oTOqN8d9/mDLyrjD46GBApNxmlsA==}
+ engines: {node: '>= 16'}
+
+ '@intlify/message-compiler@9.14.5':
+ resolution: {integrity: sha512-IHzgEu61/YIpQV5Pc3aRWScDcnFKWvQA9kigcINcCBXN8mbW+vk9SK+lDxA6STzKQsVJxUPg9ACC52pKKo3SVQ==}
+ engines: {node: '>= 16'}
+
+ '@intlify/shared@9.14.5':
+ resolution: {integrity: sha512-9gB+E53BYuAEMhbCAxVgG38EZrk59sxBtv3jSizNL2hEWlgjBjAw1AwpLHtNaeda12pe6W20OGEa0TwuMSRbyQ==}
+ engines: {node: '>= 16'}
+
+ '@isaacs/fs-minipass@4.0.1':
+ resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==}
+ engines: {node: '>=18.0.0'}
+
+ '@jridgewell/gen-mapping@0.3.13':
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
+ '@jridgewell/remapping@2.3.5':
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/source-map@0.3.11':
+ resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==}
+
+ '@jridgewell/sourcemap-codec@1.5.5':
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+
+ '@keyv/bigmap@1.0.2':
+ resolution: {integrity: sha512-KR03xkEZlAZNF4IxXgVXb+uNIVNvwdh8UwI0cnc7WI6a+aQcDp8GL80qVfeB4E5NpsKJzou5jU0r6yLSSbMOtA==}
+ engines: {node: '>= 18'}
+
+ '@keyv/serialize@1.1.1':
+ resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==}
+
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+
+ '@parcel/watcher-android-arm64@2.5.1':
+ resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [android]
+
+ '@parcel/watcher-darwin-arm64@2.5.1':
+ resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@parcel/watcher-darwin-x64@2.5.1':
+ resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@parcel/watcher-freebsd-x64@2.5.1':
+ resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@parcel/watcher-linux-arm-glibc@2.5.1':
+ resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm]
+ os: [linux]
+
+ '@parcel/watcher-linux-arm-musl@2.5.1':
+ resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm]
+ os: [linux]
+
+ '@parcel/watcher-linux-arm64-glibc@2.5.1':
+ resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@parcel/watcher-linux-arm64-musl@2.5.1':
+ resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@parcel/watcher-linux-x64-glibc@2.5.1':
+ resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ '@parcel/watcher-linux-x64-musl@2.5.1':
+ resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ '@parcel/watcher-win32-arm64@2.5.1':
+ resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@parcel/watcher-win32-ia32@2.5.1':
+ resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@parcel/watcher-win32-x64@2.5.1':
+ resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [win32]
+
+ '@parcel/watcher@2.5.1':
+ resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==}
+ engines: {node: '>= 10.0.0'}
+
+ '@pkgr/core@0.2.9':
+ resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==}
+ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+
+ '@polka/url@1.0.0-next.29':
+ resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==}
+
+ '@rolldown/pluginutils@1.0.0-beta.29':
+ resolution: {integrity: sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==}
+
+ '@rollup/pluginutils@5.3.0':
+ resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==}
+ 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.52.3':
+ resolution: {integrity: sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw==}
+ cpu: [arm]
+ os: [android]
+
+ '@rollup/rollup-android-arm64@4.52.3':
+ resolution: {integrity: sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==}
+ cpu: [arm64]
+ os: [android]
+
+ '@rollup/rollup-darwin-arm64@4.52.3':
+ resolution: {integrity: sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-x64@4.52.3':
+ resolution: {integrity: sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-freebsd-arm64@4.52.3':
+ resolution: {integrity: sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@rollup/rollup-freebsd-x64@4.52.3':
+ resolution: {integrity: sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.52.3':
+ resolution: {integrity: sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm-musleabihf@4.52.3':
+ resolution: {integrity: sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-gnu@4.52.3':
+ resolution: {integrity: sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-musl@4.52.3':
+ resolution: {integrity: sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-loong64-gnu@4.52.3':
+ resolution: {integrity: sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==}
+ cpu: [loong64]
+ os: [linux]
+
+ '@rollup/rollup-linux-ppc64-gnu@4.52.3':
+ resolution: {integrity: sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-gnu@4.52.3':
+ resolution: {integrity: sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-musl@4.52.3':
+ resolution: {integrity: sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-s390x-gnu@4.52.3':
+ resolution: {integrity: sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-gnu@4.52.3':
+ resolution: {integrity: sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-musl@4.52.3':
+ resolution: {integrity: sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-openharmony-arm64@4.52.3':
+ resolution: {integrity: sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@rollup/rollup-win32-arm64-msvc@4.52.3':
+ resolution: {integrity: sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rollup/rollup-win32-ia32-msvc@4.52.3':
+ resolution: {integrity: sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-gnu@4.52.3':
+ resolution: {integrity: sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==}
+ cpu: [x64]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.52.3':
+ resolution: {integrity: sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==}
+ cpu: [x64]
+ os: [win32]
+
+ '@sec-ant/readable-stream@0.4.1':
+ resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==}
+
+ '@sindresorhus/merge-streams@4.0.0':
+ resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
+ engines: {node: '>=18'}
+
+ '@sxzz/popperjs-es@2.11.7':
+ resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==}
+
+ '@tailwindcss/node@4.1.14':
+ resolution: {integrity: sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==}
+
+ '@tailwindcss/oxide-android-arm64@4.1.14':
+ resolution: {integrity: sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [android]
+
+ '@tailwindcss/oxide-darwin-arm64@4.1.14':
+ resolution: {integrity: sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@tailwindcss/oxide-darwin-x64@4.1.14':
+ resolution: {integrity: sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@tailwindcss/oxide-freebsd-x64@4.1.14':
+ resolution: {integrity: sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14':
+ resolution: {integrity: sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==}
+ engines: {node: '>= 10'}
+ cpu: [arm]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-arm64-gnu@4.1.14':
+ resolution: {integrity: sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-arm64-musl@4.1.14':
+ resolution: {integrity: sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-x64-gnu@4.1.14':
+ resolution: {integrity: sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-x64-musl@4.1.14':
+ resolution: {integrity: sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@tailwindcss/oxide-wasm32-wasi@4.1.14':
+ resolution: {integrity: sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+ bundledDependencies:
+ - '@napi-rs/wasm-runtime'
+ - '@emnapi/core'
+ - '@emnapi/runtime'
+ - '@tybys/wasm-util'
+ - '@emnapi/wasi-threads'
+ - tslib
+
+ '@tailwindcss/oxide-win32-arm64-msvc@4.1.14':
+ resolution: {integrity: sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@tailwindcss/oxide-win32-x64-msvc@4.1.14':
+ resolution: {integrity: sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+
+ '@tailwindcss/oxide@4.1.14':
+ resolution: {integrity: sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==}
+ engines: {node: '>= 10'}
+
+ '@tailwindcss/vite@4.1.14':
+ resolution: {integrity: sha512-BoFUoU0XqgCUS1UXWhmDJroKKhNXeDzD7/XwabjkDIAbMnc4ULn5e2FuEuBbhZ6ENZoSYzKlzvZ44Yr6EUDUSA==}
+ peerDependencies:
+ vite: ^5.2.0 || ^6 || ^7
+
+ '@transloadit/prettier-bytes@0.0.7':
+ resolution: {integrity: sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==}
+
+ '@types/conventional-commits-parser@5.0.1':
+ resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==}
+
+ '@types/estree@1.0.8':
+ resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+
+ '@types/event-emitter@0.3.5':
+ resolution: {integrity: sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/lodash-es@4.17.12':
+ resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
+
+ '@types/lodash@4.17.20':
+ resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==}
+
+ '@types/node@24.8.1':
+ resolution: {integrity: sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q==}
+
+ '@types/sortablejs@1.15.8':
+ resolution: {integrity: sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg==}
+
+ '@types/spark-md5@3.0.5':
+ resolution: {integrity: sha512-lWf05dnD42DLVKQJZrDHtWFidcLrHuip01CtnC2/S6AMhX4t9ZlEUj4iuRlAnts0PQk7KESOqKxeGE/b6sIPGg==}
+
+ '@types/web-bluetooth@0.0.16':
+ resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
+
+ '@types/web-bluetooth@0.0.21':
+ resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==}
+
+ '@typescript-eslint/eslint-plugin@8.44.1':
+ resolution: {integrity: sha512-molgphGqOBT7t4YKCSkbasmu1tb1MgrZ2szGzHbclF7PNmOkSTQVHy+2jXOSnxvR3+Xe1yySHFZoqMpz3TfQsw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^8.44.1
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/parser@8.44.1':
+ resolution: {integrity: sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/project-service@8.44.1':
+ resolution: {integrity: sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/scope-manager@8.44.1':
+ resolution: {integrity: sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/tsconfig-utils@8.44.1':
+ resolution: {integrity: sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/type-utils@8.44.1':
+ resolution: {integrity: sha512-KdEerZqHWXsRNKjF9NYswNISnFzXfXNDfPxoTh7tqohU/PRIbwTmsjGK6V9/RTYWau7NZvfo52lgVk+sJh0K3g==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/types@8.44.1':
+ resolution: {integrity: sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/typescript-estree@8.44.1':
+ resolution: {integrity: sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/utils@8.44.1':
+ resolution: {integrity: sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/visitor-keys@8.44.1':
+ resolution: {integrity: sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.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-vue@6.0.1':
+ resolution: {integrity: sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ peerDependencies:
+ vite: ^5.0.0 || ^6.0.0 || ^7.0.0
+ vue: ^3.2.25
+
+ '@volar/language-core@2.4.23':
+ resolution: {integrity: sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==}
+
+ '@volar/source-map@2.4.23':
+ resolution: {integrity: sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==}
+
+ '@volar/typescript@2.4.23':
+ resolution: {integrity: sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==}
+
+ '@vue/babel-helper-vue-transform-on@1.5.0':
+ resolution: {integrity: sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==}
+
+ '@vue/babel-plugin-jsx@1.5.0':
+ resolution: {integrity: sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+
+ '@vue/babel-plugin-resolve-type@1.5.0':
+ resolution: {integrity: sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@vue/compiler-core@3.5.22':
+ resolution: {integrity: sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==}
+
+ '@vue/compiler-dom@3.5.22':
+ resolution: {integrity: sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==}
+
+ '@vue/compiler-sfc@3.5.22':
+ resolution: {integrity: sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==}
+
+ '@vue/compiler-ssr@3.5.22':
+ resolution: {integrity: sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==}
+
+ '@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/devtools-api@7.7.7':
+ resolution: {integrity: sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==}
+
+ '@vue/devtools-core@7.7.7':
+ resolution: {integrity: sha512-9z9TLbfC+AjAi1PQyWX+OErjIaJmdFlbDHcD+cAMYKY6Bh5VlsAtCeGyRMrXwIlMEQPukvnWt3gZBLwTAIMKzQ==}
+ peerDependencies:
+ vue: ^3.0.0
+
+ '@vue/devtools-kit@7.7.7':
+ resolution: {integrity: sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==}
+
+ '@vue/devtools-shared@7.7.7':
+ resolution: {integrity: sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==}
+
+ '@vue/language-core@2.1.10':
+ resolution: {integrity: sha512-DAI289d0K3AB5TUG3xDp9OuQ71CnrujQwJrQnfuZDwo6eGNf0UoRlPuaVNO+Zrn65PC3j0oB2i7mNmVPggeGeQ==}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@vue/reactivity@3.5.22':
+ resolution: {integrity: sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A==}
+
+ '@vue/runtime-core@3.5.22':
+ resolution: {integrity: sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ==}
+
+ '@vue/runtime-dom@3.5.22':
+ resolution: {integrity: sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww==}
+
+ '@vue/server-renderer@3.5.22':
+ resolution: {integrity: sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ==}
+ peerDependencies:
+ vue: 3.5.22
+
+ '@vue/shared@3.5.22':
+ resolution: {integrity: sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==}
+
+ '@vueuse/core@13.9.0':
+ resolution: {integrity: sha512-ts3regBQyURfCE2BcytLqzm8+MmLlo5Ln/KLoxDVcsZ2gzIwVNnQpQOL/UKV8alUqjSZOlpFZcRNsLRqj+OzyA==}
+ peerDependencies:
+ vue: ^3.5.0
+
+ '@vueuse/core@9.13.0':
+ resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==}
+
+ '@vueuse/metadata@13.9.0':
+ resolution: {integrity: sha512-1AFRvuiGphfF7yWixZa0KwjYH8ulyjDCC0aFgrGRz8+P4kvDFSdXLVfTk5xAN9wEuD1J6z4/myMoYbnHoX07zg==}
+
+ '@vueuse/metadata@9.13.0':
+ resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==}
+
+ '@vueuse/shared@13.9.0':
+ resolution: {integrity: sha512-e89uuTLMh0U5cZ9iDpEI2senqPGfbPRTHM/0AaQkcxnpqjkZqDYP8rpfm7edOz8s+pOCOROEy1PIveSW8+fL5g==}
+ peerDependencies:
+ vue: ^3.5.0
+
+ '@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
+
+ JSONStream@1.3.5:
+ resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==}
+ hasBin: true
+
+ acorn-jsx@5.3.2:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ acorn@8.15.0:
+ resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ adler-32@1.3.1:
+ resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==}
+ engines: {node: '>=0.8'}
+
+ ajv@6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+
+ ajv@8.17.1:
+ resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
+
+ alien-signals@0.2.2:
+ resolution: {integrity: sha512-cZIRkbERILsBOXTQmMrxc9hgpxglstn69zm+F1ARf4aPAzdAFYd6sBq87ErO0Fj3DV94tglcyHG5kQz9nDC/8A==}
+
+ ansi-escapes@4.3.2:
+ resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+ engines: {node: '>=8'}
+
+ ansi-escapes@7.1.1:
+ resolution: {integrity: sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==}
+ engines: {node: '>=18'}
+
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ ansi-regex@6.2.2:
+ resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
+ engines: {node: '>=12'}
+
+ ansi-styles@3.2.1:
+ resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+ engines: {node: '>=4'}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ ansi-styles@6.2.3:
+ resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
+ engines: {node: '>=12'}
+
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ array-ify@1.0.0:
+ resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==}
+
+ array-union@2.1.0:
+ resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
+ engines: {node: '>=8'}
+
+ astral-regex@2.0.0:
+ resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
+ engines: {node: '>=8'}
+
+ async-validator@4.2.5:
+ resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
+
+ asynckit@0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
+ at-least-node@1.0.0:
+ resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
+ engines: {node: '>= 4.0.0'}
+
+ axios@1.12.2:
+ resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==}
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ balanced-match@2.0.0:
+ resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==}
+
+ base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ baseline-browser-mapping@2.8.8:
+ resolution: {integrity: sha512-be0PUaPsQX/gPWWgFsdD+GFzaoig5PXaUC1xLkQiYdDnANU8sMnHoQd8JhbJQuvTWrWLyeFN9Imb5Qtfvr4RrQ==}
+ hasBin: true
+
+ binary-extensions@2.3.0:
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+ engines: {node: '>=8'}
+
+ birpc@2.6.1:
+ resolution: {integrity: sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==}
+
+ bl@4.1.0:
+ resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+
+ boolbase@1.0.0:
+ resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
+ brace-expansion@1.1.12:
+ resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
+
+ brace-expansion@2.0.2:
+ resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
+
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
+ browserslist@4.26.2:
+ resolution: {integrity: sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ buffer-from@1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+ buffer@5.7.1:
+ resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+
+ bundle-name@4.1.0:
+ resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==}
+ engines: {node: '>=18'}
+
+ cacheable@2.0.2:
+ resolution: {integrity: sha512-dWjhLx8RWnPsAWVKwW/wI6OJpQ/hSVb1qS0NUif8TR9vRiSwci7Gey8x04kRU9iAF+Rnbtex5Kjjfg/aB5w8Pg==}
+
+ cachedir@2.3.0:
+ resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==}
+ engines: {node: '>=6'}
+
+ call-bind-apply-helpers@1.0.2:
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+ engines: {node: '>= 0.4'}
+
+ callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ caniuse-lite@1.0.30001745:
+ resolution: {integrity: sha512-ywt6i8FzvdgrrrGbr1jZVObnVv6adj+0if2/omv9cmR2oiZs30zL4DIyaptKcbOrBdOIc74QTMoJvSE2QHh5UQ==}
+
+ cfb@1.2.2:
+ resolution: {integrity: sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==}
+ engines: {node: '>=0.8'}
+
+ chalk@2.4.2:
+ resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
+ engines: {node: '>=4'}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ chalk@5.6.2:
+ resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+
+ chardet@0.7.0:
+ resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
+
+ 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@3.0.0:
+ resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
+ engines: {node: '>=18'}
+
+ cli-cursor@3.1.0:
+ resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
+ 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@3.0.0:
+ resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==}
+ engines: {node: '>= 10'}
+
+ 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: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
+ engines: {node: '>=0.8'}
+
+ codepage@1.15.0:
+ resolution: {integrity: sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==}
+ engines: {node: '>=0.8'}
+
+ color-convert@1.9.3:
+ resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.3:
+ resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ colord@2.9.3:
+ resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==}
+
+ colorette@2.0.20:
+ resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
+
+ combined-stream@1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+
+ commander@13.1.0:
+ resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==}
+ engines: {node: '>=18'}
+
+ commander@2.20.3:
+ resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+
+ commitizen@4.3.1:
+ resolution: {integrity: sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==}
+ engines: {node: '>= 12'}
+ hasBin: true
+
+ compare-func@2.0.0:
+ resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==}
+
+ compute-scroll-into-view@1.0.20:
+ resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ confbox@0.1.8:
+ resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
+ confbox@0.2.2:
+ resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==}
+
+ 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-commit-types@3.0.0:
+ resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==}
+
+ 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@3.0.5:
+ resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==}
+ engines: {node: '>=12.13'}
+
+ core-js@3.45.1:
+ resolution: {integrity: sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==}
+
+ 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
+
+ crc-32@1.2.2:
+ resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==}
+ engines: {node: '>=0.8'}
+ hasBin: true
+
+ cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
+
+ crypto-js@4.2.0:
+ resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==}
+
+ css-functions-list@3.2.3:
+ resolution: {integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==}
+ engines: {node: '>=12 || >=16'}
+
+ css-tree@3.1.0:
+ resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+
+ cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ csstype@3.1.3:
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+ cz-conventional-changelog@3.3.0:
+ resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==}
+ engines: {node: '>= 10'}
+
+ cz-git@1.12.0:
+ resolution: {integrity: sha512-LaZ+8whPPUOo6Y0Zy4nIbf6JOleV3ejp41sT6N4RPKiKKA+ICWf4ueeIlxIO8b6JtdlDxRzHH/EcRji07nDxcg==}
+ engines: {node: '>=v12.20.0'}
+
+ 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: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==}
+ engines: {node: '>=12'}
+
+ dayjs@1.11.18:
+ resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==}
+
+ de-indent@1.0.2:
+ resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
+
+ debug@4.4.3:
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ dedent@0.7.0:
+ resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==}
+
+ deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+ deep-pick-omit@1.2.1:
+ resolution: {integrity: sha512-2J6Kc/m3irCeqVG42T+SaUMesaK7oGWaedGnQQK/+O0gYc+2SP5bKh/KKTE7d7SJ+GCA9UUE1GRzh6oDe0EnGw==}
+
+ default-browser-id@5.0.0:
+ resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==}
+ engines: {node: '>=18'}
+
+ default-browser@5.2.1:
+ resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==}
+ engines: {node: '>=18'}
+
+ defaults@1.0.4:
+ resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
+
+ define-lazy-prop@2.0.0:
+ resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
+ engines: {node: '>=8'}
+
+ define-lazy-prop@3.0.0:
+ resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
+ engines: {node: '>=12'}
+
+ defu@6.1.4:
+ resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
+
+ delayed-stream@1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+
+ delegate@3.2.0:
+ resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==}
+
+ destr@2.0.5:
+ resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==}
+
+ detect-file@1.0.0:
+ resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==}
+ engines: {node: '>=0.10.0'}
+
+ detect-indent@6.1.0:
+ resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
+ engines: {node: '>=8'}
+
+ detect-libc@1.0.3:
+ resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
+ engines: {node: '>=0.10'}
+ hasBin: true
+
+ detect-libc@2.1.2:
+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
+ engines: {node: '>=8'}
+
+ dir-glob@3.0.1:
+ resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
+ engines: {node: '>=8'}
+
+ dom-serializer@2.0.0:
+ resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+
+ dom7@3.0.0:
+ resolution: {integrity: sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==}
+
+ domelementtype@2.3.0:
+ resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
+ domhandler@5.0.3:
+ resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+ engines: {node: '>= 4'}
+
+ domutils@3.2.2:
+ resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
+
+ dot-prop@5.3.0:
+ resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
+ engines: {node: '>=8'}
+
+ downloadjs@1.4.7:
+ resolution: {integrity: sha512-LN1gO7+u9xjU5oEScGFKvXhYf7Y/empUIIEAGBs1LzUq/rg5duiDrkuH5A2lQGd5jfMOb9X9usDa2oVXwJ0U/Q==}
+
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
+ echarts@6.0.0:
+ resolution: {integrity: sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==}
+
+ electron-to-chromium@1.5.227:
+ resolution: {integrity: sha512-ITxuoPfJu3lsNWUi2lBM2PaBPYgH3uqmxut5vmBxgYvyI4AlJ6P3Cai1O76mOrkJCBzq0IxWg/NtqOrpu/0gKA==}
+
+ element-plus@2.11.4:
+ resolution: {integrity: sha512-sLq+Ypd0cIVilv8wGGMEGvzRVBBsRpJjnAS5PsI/1JU1COZXqzH3N1UYMUc/HCdvdjf6dfrBy80Sj7KcACsT7w==}
+ peerDependencies:
+ vue: ^3.2.0
+
+ emoji-regex@10.5.0:
+ resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==}
+
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ enhanced-resolve@5.18.3:
+ resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==}
+ engines: {node: '>=10.13.0'}
+
+ entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
+ env-paths@2.2.1:
+ resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
+ engines: {node: '>=6'}
+
+ environment@1.1.0:
+ resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==}
+ engines: {node: '>=18'}
+
+ error-ex@1.3.4:
+ resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==}
+
+ error-stack-parser-es@0.1.5:
+ resolution: {integrity: sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==}
+
+ 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@1.7.0:
+ resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
+
+ es-object-atoms@1.1.1:
+ resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+ engines: {node: '>= 0.4'}
+
+ es-set-tostringtag@2.1.0:
+ resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
+ engines: {node: '>= 0.4'}
+
+ es5-ext@0.10.64:
+ resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==}
+ engines: {node: '>=0.10'}
+
+ es6-iterator@2.0.3:
+ resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==}
+
+ es6-symbol@3.1.4:
+ resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==}
+ engines: {node: '>=0.12'}
+
+ esbuild@0.25.10:
+ resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==}
+ 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: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
+ escape-string-regexp@1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ escape-string-regexp@5.0.0:
+ resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+ engines: {node: '>=12'}
+
+ eslint-config-prettier@9.1.2:
+ resolution: {integrity: sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==}
+ hasBin: true
+ peerDependencies:
+ eslint: '>=7.0.0'
+
+ eslint-plugin-prettier@5.5.4:
+ resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ '@types/eslint': '>=8.0.0'
+ eslint: '>=8.0.0'
+ eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0'
+ prettier: '>=3.0.0'
+ peerDependenciesMeta:
+ '@types/eslint':
+ optional: true
+ eslint-config-prettier:
+ optional: true
+
+ eslint-plugin-vue@9.33.0:
+ resolution: {integrity: sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==}
+ 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.4.0:
+ resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint-visitor-keys@4.2.1:
+ resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint@9.36.0:
+ resolution: {integrity: sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==}
+ 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'}
+
+ espree@10.4.0:
+ resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==}
+ 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}
+
+ esquery@1.6.0:
+ resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
+ engines: {node: '>=0.10'}
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ estree-walker@2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+ estree-walker@3.0.3:
+ resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+
+ esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+
+ event-emitter@0.3.5:
+ resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==}
+
+ eventemitter3@4.0.7:
+ resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
+
+ 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'}
+
+ execa@9.6.0:
+ resolution: {integrity: sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==}
+ engines: {node: ^18.19.0 || >=20.5.0}
+
+ expand-tilde@2.0.2:
+ resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==}
+ engines: {node: '>=0.10.0'}
+
+ exsolve@1.0.7:
+ resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==}
+
+ ext@1.7.0:
+ resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==}
+
+ external-editor@3.1.0:
+ resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==}
+ engines: {node: '>=4'}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-diff@1.3.0:
+ resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
+
+ fast-glob@3.3.3:
+ resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+ engines: {node: '>=8.6.0'}
+
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+ fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+ fast-uri@3.1.0:
+ resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==}
+
+ fastest-levenshtein@1.0.16:
+ resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==}
+ engines: {node: '>= 4.9.1'}
+
+ fastq@1.19.1:
+ resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
+
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
+ figures@3.2.0:
+ resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
+ engines: {node: '>=8'}
+
+ figures@6.1.0:
+ resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==}
+ engines: {node: '>=18'}
+
+ file-entry-cache@10.1.4:
+ resolution: {integrity: sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA==}
+
+ file-entry-cache@8.0.0:
+ resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+ engines: {node: '>=16.0.0'}
+
+ file-saver@2.0.5:
+ resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==}
+
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
+ find-node-modules@2.1.3:
+ resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==}
+
+ find-root@1.1.0:
+ resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==}
+
+ find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+
+ find-up@7.0.0:
+ resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==}
+ engines: {node: '>=18'}
+
+ findup-sync@4.0.0:
+ resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==}
+ engines: {node: '>= 8'}
+
+ flat-cache@4.0.1:
+ resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+ engines: {node: '>=16'}
+
+ flat-cache@6.1.14:
+ resolution: {integrity: sha512-ExZSCSV9e7v/Zt7RzCbX57lY2dnPdxzU/h3UE6WJ6NtEMfwBd8jmi1n4otDEUfz+T/R+zxrFDpICFdjhD3H/zw==}
+
+ flatted@3.3.3:
+ resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
+
+ follow-redirects@1.15.11:
+ resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ debug: '*'
+ peerDependenciesMeta:
+ debug:
+ optional: true
+
+ form-data@4.0.4:
+ resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==}
+ engines: {node: '>= 6'}
+
+ frac@1.1.2:
+ resolution: {integrity: sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==}
+ engines: {node: '>=0.8'}
+
+ fs-extra@10.1.0:
+ resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
+ engines: {node: '>=12'}
+
+ fs-extra@11.3.2:
+ resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==}
+ engines: {node: '>=14.14'}
+
+ fs-extra@9.1.0:
+ resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==}
+ engines: {node: '>=10'}
+
+ fs.realpath@1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+ 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==}
+
+ gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
+ get-caller-file@2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+
+ get-east-asian-width@1.4.0:
+ resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==}
+ engines: {node: '>=18'}
+
+ get-intrinsic@1.3.0:
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+ engines: {node: '>= 0.4'}
+
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
+ get-stream@8.0.1:
+ resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
+ engines: {node: '>=16'}
+
+ get-stream@9.0.1:
+ resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==}
+ engines: {node: '>=18'}
+
+ get-tsconfig@4.10.1:
+ resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==}
+
+ 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: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
+ glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+
+ glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ deprecated: Glob versions prior to v9 are no longer supported
+
+ global-directory@4.0.1:
+ resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==}
+ engines: {node: '>=18'}
+
+ global-modules@1.0.0:
+ resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==}
+ engines: {node: '>=0.10.0'}
+
+ global-modules@2.0.0:
+ resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==}
+ engines: {node: '>=6'}
+
+ global-prefix@1.0.2:
+ resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==}
+ engines: {node: '>=0.10.0'}
+
+ global-prefix@3.0.0:
+ resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==}
+ engines: {node: '>=6'}
+
+ 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.15.0:
+ resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==}
+ engines: {node: '>=18'}
+
+ globby@11.1.0:
+ resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
+ engines: {node: '>=10'}
+
+ globjoin@0.1.4:
+ resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==}
+
+ 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==}
+
+ has-flag@3.0.0:
+ resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+ engines: {node: '>=4'}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ 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'}
+
+ hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
+
+ he@1.2.0:
+ resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+ hasBin: true
+
+ highlight.js@11.11.1:
+ resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==}
+ engines: {node: '>=12.0.0'}
+
+ homedir-polyfill@1.0.3:
+ resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==}
+ engines: {node: '>=0.10.0'}
+
+ hookable@5.5.3:
+ resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
+
+ hookified@1.12.1:
+ resolution: {integrity: sha512-xnKGl+iMIlhrZmGHB729MqlmPoWBznctSQTYCpFKqNsCgimJQmithcW0xSQMMFzYnV2iKUh25alswn6epgxS0Q==}
+
+ 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@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'}
+
+ human-signals@8.0.1:
+ resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==}
+ engines: {node: '>=18.18.0'}
+
+ husky@9.1.7:
+ resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ i18next@20.6.1:
+ resolution: {integrity: sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==}
+
+ iconv-lite@0.4.24:
+ resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+ engines: {node: '>=0.10.0'}
+
+ ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
+
+ ignore@7.0.5:
+ resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
+ engines: {node: '>= 4'}
+
+ immer@9.0.21:
+ resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==}
+
+ immutable@5.1.3:
+ resolution: {integrity: sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==}
+
+ import-fresh@3.3.1:
+ resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
+ engines: {node: '>=6'}
+
+ import-meta-resolve@4.2.0:
+ resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==}
+
+ imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+
+ inflight@1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ ini@1.3.8:
+ resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+
+ ini@4.1.1:
+ resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ inquirer@8.2.5:
+ resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==}
+ engines: {node: '>=12.0.0'}
+
+ is-arrayish@0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+ is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+
+ is-docker@2.2.1:
+ resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+ engines: {node: '>=8'}
+ hasBin: true
+
+ is-docker@3.0.0:
+ resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ hasBin: true
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ is-fullwidth-code-point@4.0.0:
+ resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==}
+ engines: {node: '>=12'}
+
+ is-fullwidth-code-point@5.1.0:
+ resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==}
+ engines: {node: '>=18'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-hotkey@0.2.0:
+ resolution: {integrity: sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==}
+
+ 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: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
+ engines: {node: '>=8'}
+
+ is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ is-obj@2.0.0:
+ resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
+ engines: {node: '>=8'}
+
+ is-plain-obj@4.1.0:
+ resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
+ engines: {node: '>=12'}
+
+ is-plain-object@5.0.0:
+ resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
+ engines: {node: '>=0.10.0'}
+
+ is-stream@3.0.0:
+ resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ is-stream@4.0.1:
+ resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==}
+ engines: {node: '>=18'}
+
+ is-text-path@2.0.0:
+ resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==}
+ engines: {node: '>=8'}
+
+ is-unicode-supported@0.1.0:
+ resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+ engines: {node: '>=10'}
+
+ is-unicode-supported@2.1.0:
+ resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==}
+ engines: {node: '>=18'}
+
+ is-url@1.2.4:
+ resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==}
+
+ is-utf8@0.2.1:
+ resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==}
+
+ is-what@4.1.16:
+ resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==}
+ engines: {node: '>=12.13'}
+
+ is-windows@1.0.2:
+ resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
+ engines: {node: '>=0.10.0'}
+
+ is-wsl@2.2.0:
+ resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+ engines: {node: '>=8'}
+
+ is-wsl@3.1.0:
+ resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==}
+ engines: {node: '>=16'}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ jiti@2.6.0:
+ resolution: {integrity: sha512-VXe6RjJkBPj0ohtqaO8vSWP3ZhAKo66fKrFNCll4BTcwljPLz03pCbaNKfzGP5MbrCYcbJ7v0nOYYwUzTEIdXQ==}
+ hasBin: true
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ js-tokens@9.0.1:
+ resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
+
+ js-yaml@4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+
+ jsesc@3.1.0:
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+ json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+ json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
+ json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ jsonfile@6.2.0:
+ resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==}
+
+ jsonparse@1.3.1:
+ resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
+ engines: {'0': node >= 0.2.0}
+
+ keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+ keyv@5.5.3:
+ resolution: {integrity: sha512-h0Un1ieD+HUrzBH6dJXhod3ifSghk5Hw/2Y4/KHBziPlZecrFyE9YOTPU6eOs0V9pYl8gOs86fkr/KN8lUX39A==}
+
+ kind-of@6.0.3:
+ resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
+ engines: {node: '>=0.10.0'}
+
+ known-css-properties@0.36.0:
+ resolution: {integrity: sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA==}
+
+ known-css-properties@0.37.0:
+ resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==}
+
+ kolorist@1.8.0:
+ resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
+
+ levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+
+ lightningcss-darwin-arm64@1.30.1:
+ resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ lightningcss-darwin-x64@1.30.1:
+ resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ lightningcss-freebsd-x64@1.30.1:
+ resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
+ lightningcss-linux-arm-gnueabihf@1.30.1:
+ resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm]
+ os: [linux]
+
+ lightningcss-linux-arm64-gnu@1.30.1:
+ resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ lightningcss-linux-arm64-musl@1.30.1:
+ resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ lightningcss-linux-x64-gnu@1.30.1:
+ resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ lightningcss-linux-x64-musl@1.30.1:
+ resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ lightningcss-win32-arm64-msvc@1.30.1:
+ resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [win32]
+
+ lightningcss-win32-x64-msvc@1.30.1:
+ resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [win32]
+
+ lightningcss@1.30.1:
+ resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==}
+ engines: {node: '>= 12.0.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: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+ lint-staged@15.5.2:
+ resolution: {integrity: sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==}
+ engines: {node: '>=18.12.0'}
+ hasBin: true
+
+ listr2@8.3.3:
+ resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==}
+ engines: {node: '>=18.0.0'}
+
+ local-pkg@1.1.2:
+ resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==}
+ engines: {node: '>=14'}
+
+ locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ 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: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+
+ 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: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
+
+ lodash.clonedeep@4.5.0:
+ resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
+
+ lodash.debounce@4.0.8:
+ resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
+
+ lodash.foreach@4.5.0:
+ resolution: {integrity: sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==}
+
+ lodash.isequal@4.5.0:
+ resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
+ deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead.
+
+ lodash.isplainobject@4.0.6:
+ resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
+
+ lodash.kebabcase@4.1.1:
+ resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==}
+
+ lodash.map@4.6.0:
+ resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==}
+
+ lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+ lodash.mergewith@4.6.2:
+ resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==}
+
+ lodash.snakecase@4.1.1:
+ resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==}
+
+ lodash.startcase@4.4.0:
+ resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==}
+
+ lodash.throttle@4.1.1:
+ resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==}
+
+ lodash.toarray@4.4.0:
+ resolution: {integrity: sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==}
+
+ lodash.truncate@4.4.2:
+ resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==}
+
+ lodash.uniq@4.5.0:
+ resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==}
+
+ lodash.upperfirst@4.3.1:
+ resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==}
+
+ lodash@4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+ log-symbols@4.1.0:
+ resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
+ engines: {node: '>=10'}
+
+ log-update@6.1.0:
+ resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==}
+ engines: {node: '>=18'}
+
+ longest@2.0.1:
+ resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==}
+ engines: {node: '>=0.10.0'}
+
+ lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+ magic-string@0.30.19:
+ resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==}
+
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
+ mathml-tag-names@2.1.3:
+ resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==}
+
+ mdn-data@2.12.2:
+ resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==}
+
+ mdn-data@2.24.0:
+ resolution: {integrity: sha512-i97fklrJl03tL1tdRVw0ZfLLvuDsdb6wxL+TrJ+PKkCbLrp2PCu2+OYdCKychIUm19nSM/35S6qz7pJpnXttoA==}
+
+ memoize-one@6.0.0:
+ resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==}
+
+ 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-stream@2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+
+ merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+
+ merge@2.1.1:
+ resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==}
+
+ 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'}
+
+ mimic-fn@2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+
+ mimic-fn@4.0.0:
+ resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
+ engines: {node: '>=12'}
+
+ mimic-function@5.0.1:
+ resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
+ engines: {node: '>=18'}
+
+ minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+
+ minimatch@9.0.5:
+ resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minimist@1.2.7:
+ resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==}
+
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ minipass@7.1.2:
+ resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minizlib@3.1.0:
+ resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==}
+ engines: {node: '>= 18'}
+
+ mitt@3.0.1:
+ resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
+
+ mlly@1.8.0:
+ resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==}
+
+ mrmime@2.0.1:
+ resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
+ engines: {node: '>=10'}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ muggle-string@0.4.1:
+ resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
+
+ mute-stream@0.0.8:
+ resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==}
+
+ namespace-emitter@2.0.1:
+ resolution: {integrity: sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==}
+
+ nanoid@3.3.11:
+ resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ nanoid@5.1.6:
+ resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==}
+ engines: {node: ^18 || >=20}
+ hasBin: true
+
+ natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+ next-tick@1.1.0:
+ resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==}
+
+ node-addon-api@7.1.1:
+ resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
+
+ node-releases@2.0.21:
+ resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==}
+
+ normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ 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}
+
+ npm-run-path@6.0.0:
+ resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==}
+ engines: {node: '>=18'}
+
+ nprogress@0.2.0:
+ resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==}
+
+ nth-check@2.1.1:
+ resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
+ ohash@2.0.11:
+ resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==}
+
+ once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+ onetime@5.1.2:
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+ engines: {node: '>=6'}
+
+ onetime@6.0.0:
+ resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
+ engines: {node: '>=12'}
+
+ onetime@7.0.0:
+ resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
+ engines: {node: '>=18'}
+
+ open@10.2.0:
+ resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==}
+ 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: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
+ engines: {node: '>=10'}
+
+ os-tmpdir@1.0.2:
+ resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
+ engines: {node: '>=0.10.0'}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+
+ p-limit@4.0.0:
+ resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+
+ p-locate@6.0.0:
+ resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+
+ parse-json@5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+
+ parse-ms@4.0.0:
+ resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==}
+ engines: {node: '>=18'}
+
+ parse-passwd@1.0.0:
+ resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==}
+ engines: {node: '>=0.10.0'}
+
+ path-browserify@1.0.1:
+ resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ path-exists@5.0.0:
+ resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ path-is-absolute@1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-key@4.0.0:
+ resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+ engines: {node: '>=12'}
+
+ path-type@4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+
+ pathe@2.0.3:
+ resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
+ 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.3:
+ resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
+ engines: {node: '>=12'}
+
+ pidtree@0.6.0:
+ resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==}
+ engines: {node: '>=0.10'}
+ hasBin: true
+
+ pinia-plugin-persistedstate@4.5.0:
+ resolution: {integrity: sha512-QTkP1xJVyCdr2I2p3AKUZM84/e+IS+HktRxKGAIuDzkyaKKV48mQcYkJFVVDuvTxlI5j6X3oZObpqoVB8JnWpw==}
+ peerDependencies:
+ '@nuxt/kit': '>=3.0.0'
+ '@pinia/nuxt': '>=0.10.0'
+ pinia: '>=3.0.0'
+ peerDependenciesMeta:
+ '@nuxt/kit':
+ optional: true
+ '@pinia/nuxt':
+ optional: true
+ pinia:
+ optional: true
+
+ pinia@3.0.3:
+ resolution: {integrity: sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==}
+ peerDependencies:
+ typescript: '>=4.4.4'
+ vue: ^2.7.0 || ^3.5.11
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ pkg-types@1.3.1:
+ resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
+
+ pkg-types@2.3.0:
+ resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==}
+
+ postcss-html@1.8.0:
+ resolution: {integrity: sha512-5mMeb1TgLWoRKxZ0Xh9RZDfwUUIqRrcxO2uXO+Ezl1N5lqpCiSU5Gk6+1kZediBfBHFtPCdopr2UZ2SgUsKcgQ==}
+ engines: {node: ^12 || >=14}
+
+ postcss-media-query-parser@0.2.3:
+ resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==}
+
+ postcss-resolve-nested-selector@0.1.6:
+ resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==}
+
+ postcss-safe-parser@6.0.0:
+ resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==}
+ 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-scss@4.0.9:
+ resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==}
+ engines: {node: '>=12.0'}
+ peerDependencies:
+ postcss: ^8.4.29
+
+ postcss-selector-parser@6.1.2:
+ resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
+ engines: {node: '>=4'}
+
+ postcss-selector-parser@7.1.0:
+ resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==}
+ 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@8.5.6:
+ resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ preact@10.27.2:
+ resolution: {integrity: sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==}
+
+ prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+
+ prettier-linter-helpers@1.0.0:
+ resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
+ engines: {node: '>=6.0.0'}
+
+ prettier@3.6.2:
+ resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ pretty-ms@9.3.0:
+ resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==}
+ engines: {node: '>=18'}
+
+ prismjs@1.30.0:
+ resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==}
+ engines: {node: '>=6'}
+
+ proxy-from-env@1.1.0:
+ resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ qrcode.vue@3.6.0:
+ resolution: {integrity: sha512-vQcl2fyHYHMjDO1GguCldJxepq2izQjBkDEEu9NENgfVKP6mv/e2SU62WbqYHGwTgWXLhxZ1NCD1dAZKHQq1fg==}
+ peerDependencies:
+ vue: ^3.0.0
+
+ quansync@0.2.11:
+ resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==}
+
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+ readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+
+ readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+
+ readdirp@4.1.2:
+ resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
+ engines: {node: '>= 14.18.0'}
+
+ require-directory@2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+
+ require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+
+ resolve-dir@1.0.1:
+ resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==}
+ engines: {node: '>=0.10.0'}
+
+ resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+
+ resolve-from@5.0.0:
+ resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
+ engines: {node: '>=8'}
+
+ resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+ restore-cursor@3.1.0:
+ resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
+ engines: {node: '>=8'}
+
+ restore-cursor@5.1.0:
+ resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==}
+ engines: {node: '>=18'}
+
+ reusify@1.1.0:
+ resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ rfdc@1.4.1:
+ resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
+
+ 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@4.52.3:
+ resolution: {integrity: sha512-RIDh866U8agLgiIcdpB+COKnlCreHJLfIhWC3LVflku5YHfpnsIKigRZeFfMfCc4dVcqNVfQQ5gO/afOck064A==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ run-applescript@7.1.0:
+ resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==}
+ engines: {node: '>=18'}
+
+ run-async@2.4.1:
+ resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
+ engines: {node: '>=0.12.0'}
+
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+ rxjs@7.8.2:
+ resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+ sass@1.93.2:
+ resolution: {integrity: sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+
+ 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@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
+ semver@7.7.2:
+ resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ 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.2:
+ resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==}
+ engines: {node: '>=18'}
+
+ slash@3.0.0:
+ resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+ engines: {node: '>=8'}
+
+ 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: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==}
+ engines: {node: '>=10'}
+
+ slice-ansi@5.0.0:
+ resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==}
+ engines: {node: '>=12'}
+
+ slice-ansi@7.1.2:
+ resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==}
+ engines: {node: '>=18'}
+
+ snabbdom@3.6.2:
+ resolution: {integrity: sha512-ig5qOnCDbugFntKi6c7Xlib8bA6xiJVk8O+WdFrV3wxbMqeHO0hXFQC4nAhPVWfZfi8255lcZkNhtIBINCc4+Q==}
+ engines: {node: '>=12.17.0'}
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ source-map-support@0.5.21:
+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+
+ source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.7.6:
+ resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==}
+ engines: {node: '>= 12'}
+
+ spark-md5@3.0.2:
+ resolution: {integrity: sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==}
+
+ speakingurl@14.0.1:
+ resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==}
+ engines: {node: '>=0.10.0'}
+
+ split2@4.2.0:
+ resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+ engines: {node: '>= 10.x'}
+
+ ssf@0.11.2:
+ resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==}
+ engines: {node: '>=0.8'}
+
+ ssr-window@3.0.0:
+ resolution: {integrity: sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==}
+
+ string-argv@0.3.2:
+ resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
+ engines: {node: '>=0.6.19'}
+
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+
+ string-width@7.2.0:
+ resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
+ engines: {node: '>=18'}
+
+ string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
+ strip-ansi@7.1.2:
+ resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==}
+ engines: {node: '>=12'}
+
+ strip-bom@4.0.0:
+ resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==}
+ engines: {node: '>=8'}
+
+ strip-final-newline@3.0.0:
+ resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
+ engines: {node: '>=12'}
+
+ strip-final-newline@4.0.0:
+ resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==}
+ engines: {node: '>=18'}
+
+ strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+
+ strip-literal@3.1.0:
+ resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==}
+
+ 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-recess-order@4.6.0:
+ resolution: {integrity: sha512-V76fhv3YtcNXh/hyAuAdSzi5FmcrG54Mp2AThJ3D/PTMTSYzUPd7GIhP6z9mTqnRhmkk6YTfcu/JWB8h+Yrcaw==}
+ peerDependencies:
+ stylelint: '>=15'
+
+ stylelint-config-recommended-scss@14.1.0:
+ resolution: {integrity: sha512-bhaMhh1u5dQqSsf6ri2GVWWQW5iUjBYgcHkh7SgDDn92ijoItC/cfO/W+fpXshgTQWhwFkP1rVcewcv4jaftRg==}
+ engines: {node: '>=18.12.0'}
+ peerDependencies:
+ postcss: ^8.3.3
+ stylelint: ^16.6.1
+ peerDependenciesMeta:
+ postcss:
+ optional: true
+
+ stylelint-config-recommended-vue@1.6.1:
+ resolution: {integrity: sha512-lLW7hTIMBiTfjenGuDq2kyHA6fBWd/+Df7MO4/AWOxiFeXP9clbpKgg27kHfwA3H7UNMGC7aeP3mNlZB5LMmEQ==}
+ 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-recommended@17.0.0:
+ resolution: {integrity: sha512-WaMSdEiPfZTSFVoYmJbxorJfA610O0tlYuU2aEwY33UQhSPgFbClrVJYWvy3jGJx+XW37O+LyNLiZOEXhKhJmA==}
+ engines: {node: '>=18.12.0'}
+ peerDependencies:
+ stylelint: ^16.23.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-scss@6.12.1:
+ resolution: {integrity: sha512-UJUfBFIvXfly8WKIgmqfmkGKPilKB4L5j38JfsDd+OCg2GBdU0vGUV08Uw82tsRZzd4TbsUURVVNGeOhJVF7pA==}
+ engines: {node: '>=18.12.0'}
+ peerDependencies:
+ stylelint: ^16.0.2
+
+ stylelint@16.24.0:
+ resolution: {integrity: sha512-7ksgz3zJaSbTUGr/ujMXvLVKdDhLbGl3R/3arNudH7z88+XZZGNLMTepsY28WlnvEFcuOmUe7fg40Q3lfhOfSQ==}
+ engines: {node: '>=18.12.0'}
+ hasBin: true
+
+ superjson@2.2.2:
+ resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==}
+ engines: {node: '>=16'}
+
+ supports-color@5.5.0:
+ resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+ engines: {node: '>=4'}
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ supports-hyperlinks@3.2.0:
+ resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==}
+ engines: {node: '>=14.18'}
+
+ svg-tags@1.0.0:
+ resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==}
+
+ synckit@0.11.11:
+ resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+
+ table@6.9.0:
+ resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==}
+ engines: {node: '>=10.0.0'}
+
+ tailwindcss@4.1.14:
+ resolution: {integrity: sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==}
+
+ tapable@2.3.0:
+ resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==}
+ engines: {node: '>=6'}
+
+ tar@7.5.1:
+ resolution: {integrity: sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==}
+ engines: {node: '>=18'}
+
+ terser@5.44.0:
+ resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ text-extensions@2.4.0:
+ resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==}
+ engines: {node: '>=8'}
+
+ through@2.3.8:
+ resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+
+ tiny-warning@1.0.3:
+ resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==}
+
+ tinyexec@1.0.1:
+ resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==}
+
+ tinyglobby@0.2.15:
+ resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
+ engines: {node: '>=12.0.0'}
+
+ tmp@0.0.33:
+ resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
+ engines: {node: '>=0.6.0'}
+
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
+ totalist@3.0.1:
+ resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
+ engines: {node: '>=6'}
+
+ ts-api-utils@2.1.0:
+ resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==}
+ engines: {node: '>=18.12'}
+ peerDependencies:
+ typescript: '>=4.8.4'
+
+ tslib@2.3.0:
+ resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==}
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ tsx@4.20.6:
+ resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==}
+ engines: {node: '>=18.0.0'}
+ hasBin: true
+
+ type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+
+ type-fest@0.20.2:
+ resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
+ engines: {node: '>=10'}
+
+ type-fest@0.21.3:
+ resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
+ engines: {node: '>=10'}
+
+ type@2.7.3:
+ resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==}
+
+ typescript-eslint@8.44.1:
+ resolution: {integrity: sha512-0ws8uWGrUVTjEeN2OM4K1pLKHK/4NiNP/vz6ns+LjT/6sqpaYzIVFajZb1fj/IDwpsrrHb3Jy0Qm5u9CPcKaeg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ typescript@5.6.3:
+ resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ ufo@1.6.1:
+ resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==}
+
+ undici-types@7.14.0:
+ resolution: {integrity: sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==}
+
+ unicorn-magic@0.1.0:
+ resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==}
+ engines: {node: '>=18'}
+
+ unicorn-magic@0.3.0:
+ resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==}
+ engines: {node: '>=18'}
+
+ unimport@5.4.0:
+ resolution: {integrity: sha512-g/OLFZR2mEfqbC6NC9b2225eCJGvufxq34mj6kM3OmI5gdSL0qyqtnv+9qmsGpAmnzSl6x0IWZj4W+8j2hLkMA==}
+ engines: {node: '>=18.12.0'}
+
+ universalify@2.0.1:
+ resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+ engines: {node: '>= 10.0.0'}
+
+ unplugin-auto-import@20.2.0:
+ resolution: {integrity: sha512-vfBI/SvD9hJqYNinipVOAj5n8dS8DJXFlCKFR5iLDp2SaQwsfdnfLXgZ+34Kd3YY3YEY9omk8XQg0bwos3Q8ug==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@nuxt/kit': ^4.0.0
+ '@vueuse/core': '*'
+ peerDependenciesMeta:
+ '@nuxt/kit':
+ optional: true
+ '@vueuse/core':
+ optional: true
+
+ unplugin-element-plus@0.10.0:
+ resolution: {integrity: sha512-oRSW0x6U58xBOWKy8TcoVZNA8ElIpfp3TUJRLQI6ey/E9PpjHl9/deeTAZNt8D57Li4OA4pCJtM6p2cb4Ff4ZA==}
+ engines: {node: '>=18.12.0'}
+
+ unplugin-utils@0.2.5:
+ resolution: {integrity: sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg==}
+ engines: {node: '>=18.12.0'}
+
+ unplugin-utils@0.3.0:
+ resolution: {integrity: sha512-JLoggz+PvLVMJo+jZt97hdIIIZ2yTzGgft9e9q8iMrC4ewufl62ekeW7mixBghonn2gVb/ICjyvlmOCUBnJLQg==}
+ engines: {node: '>=20.19.0'}
+
+ unplugin-vue-components@29.1.0:
+ resolution: {integrity: sha512-z/9ACPXth199s9aCTCdKZAhe5QGOpvzJYP+Hkd0GN1/PpAmsu+W3UlRY3BJAewPqQxh5xi56+Og6mfiCV1Jzpg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/parser': ^7.15.8
+ '@nuxt/kit': ^3.2.2 || ^4.0.0
+ vue: 2 || 3
+ peerDependenciesMeta:
+ '@babel/parser':
+ optional: true
+ '@nuxt/kit':
+ optional: true
+
+ unplugin@2.3.10:
+ resolution: {integrity: sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==}
+ engines: {node: '>=18.12.0'}
+
+ update-browserslist-db@1.1.3:
+ resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ vite-hot-client@2.1.0:
+ resolution: {integrity: sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==}
+ peerDependencies:
+ vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0
+
+ vite-plugin-compression@0.5.1:
+ resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==}
+ peerDependencies:
+ vite: '>=2.0.0'
+
+ vite-plugin-inspect@0.8.9:
+ resolution: {integrity: sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@nuxt/kit': '*'
+ vite: ^3.1.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.1
+ peerDependenciesMeta:
+ '@nuxt/kit':
+ optional: true
+
+ vite-plugin-vue-devtools@7.7.7:
+ resolution: {integrity: sha512-d0fIh3wRcgSlr4Vz7bAk4va1MkdqhQgj9ANE/rBhsAjOnRfTLs2ocjFMvSUOsv6SRRXU9G+VM7yMgqDb6yI4iQ==}
+ engines: {node: '>=v14.21.3'}
+ peerDependencies:
+ vite: ^3.1.0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0
+
+ vite-plugin-vue-inspector@5.3.2:
+ resolution: {integrity: sha512-YvEKooQcSiBTAs0DoYLfefNja9bLgkFM7NI2b07bE2SruuvX0MEa9cMaxjKVMkeCp5Nz9FRIdcN1rOdFVBeL6Q==}
+ peerDependencies:
+ vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0
+
+ vite@7.1.7:
+ resolution: {integrity: sha512-VbA8ScMvAISJNJVbRDTJdCwqQoAareR/wutevKanhR2/1EkoXVZVkkORaYm/tNVCjP/UDTKtcw3bAkwOUdedmA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^20.19.0 || >=22.12.0
+ jiti: '>=1.21.0'
+ less: ^4.0.0
+ lightningcss: ^1.21.0
+ sass: ^1.70.0
+ sass-embedded: ^1.70.0
+ stylus: '>=0.54.8'
+ sugarss: ^5.0.0
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+
+ vscode-uri@3.1.0:
+ resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==}
+
+ 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-i18n@9.14.5:
+ resolution: {integrity: sha512-0jQ9Em3ymWngyiIkj0+c/k7WgaPO+TNzjKSNq9BvBQaKJECqn9cd9fL4tkDhB5G1QBskGl9YxxbDAhgbFtpe2g==}
+ engines: {node: '>= 16'}
+ peerDependencies:
+ vue: ^3.0.0
+
+ vue-img-cutter@3.0.7:
+ resolution: {integrity: sha512-fNw3kimawg9XVXDZCw2bI74NI+Jq+H42wjymatZVVSY46wuBty6LbQsu4GeVfo/yzpS9AHY0tzckpYzX3D2fmA==}
+
+ vue-router@4.5.1:
+ resolution: {integrity: sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==}
+ peerDependencies:
+ vue: ^3.2.0
+
+ vue-tsc@2.1.10:
+ resolution: {integrity: sha512-RBNSfaaRHcN5uqVqJSZh++Gy/YUzryuv9u1aFWhsammDJXNtUiJMNoJ747lZcQ68wUQFx6E73y4FY3D8E7FGMA==}
+ hasBin: true
+ peerDependencies:
+ typescript: '>=5.0.0'
+
+ vue@3.5.22:
+ resolution: {integrity: sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ wcwidth@1.0.1:
+ resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+
+ webpack-virtual-modules@0.6.2:
+ resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+
+ which@1.3.1:
+ resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
+ hasBin: true
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ wildcard@1.1.2:
+ resolution: {integrity: sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==}
+
+ wmf@1.0.2:
+ resolution: {integrity: sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==}
+ engines: {node: '>=0.8'}
+
+ word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+
+ word@0.3.0:
+ resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==}
+ engines: {node: '>=0.8'}
+
+ wrap-ansi@7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+
+ wrap-ansi@9.0.2:
+ resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==}
+ engines: {node: '>=18'}
+
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ write-file-atomic@5.0.1:
+ resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ wsl-utils@0.1.0:
+ resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==}
+ engines: {node: '>=18'}
+
+ xgplayer-subtitles@3.0.23:
+ resolution: {integrity: sha512-deGdV75giVzfTTdG9XATmji39NHwKTpEelWt2rRx/RyXGgU2bQFp0Ft7yWaK2Uu8A/WVrP5fpxEAj4MstREMkQ==}
+ peerDependencies:
+ core-js: '>=3.12.1'
+
+ xgplayer@3.0.23:
+ resolution: {integrity: sha512-Bn3zQfMMAZimlVG9EeIDybMcklc+6FH8Sv47KpTq4K6ofCzyhPG/KenxailDedlHmxjb5B2o+240TpJtMQ3oJA==}
+ peerDependencies:
+ core-js: '>=3.12.1'
+
+ xlsx@0.18.5:
+ resolution: {integrity: sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==}
+ engines: {node: '>=0.8'}
+ hasBin: true
+
+ xml-name-validator@4.0.0:
+ resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
+ engines: {node: '>=12'}
+
+ y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+
+ yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+ yallist@5.0.0:
+ resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
+ engines: {node: '>=18'}
+
+ yaml@2.8.1:
+ resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==}
+ engines: {node: '>= 14.6'}
+ hasBin: true
+
+ yargs-parser@21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+
+ yargs@17.7.2:
+ resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
+ engines: {node: '>=12'}
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+ yocto-queue@1.2.1:
+ resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==}
+ engines: {node: '>=12.20'}
+
+ yoctocolors@2.1.2:
+ resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==}
+ engines: {node: '>=18'}
+
+ zrender@6.0.0:
+ resolution: {integrity: sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==}
+
+snapshots:
+
+ '@antfu/utils@0.7.10': {}
+
+ '@babel/code-frame@7.27.1':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.27.1
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
+ '@babel/compat-data@7.28.4': {}
+
+ '@babel/core@7.28.4':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.28.3
+ '@babel/helper-compilation-targets': 7.27.2
+ '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4)
+ '@babel/helpers': 7.28.4
+ '@babel/parser': 7.28.4
+ '@babel/template': 7.27.2
+ '@babel/traverse': 7.28.4
+ '@babel/types': 7.28.4
+ '@jridgewell/remapping': 2.3.5
+ convert-source-map: 2.0.0
+ debug: 4.4.3
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/generator@7.28.3':
+ dependencies:
+ '@babel/parser': 7.28.4
+ '@babel/types': 7.28.4
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ jsesc: 3.1.0
+
+ '@babel/helper-annotate-as-pure@7.27.3':
+ dependencies:
+ '@babel/types': 7.28.4
+
+ '@babel/helper-compilation-targets@7.27.2':
+ dependencies:
+ '@babel/compat-data': 7.28.4
+ '@babel/helper-validator-option': 7.27.1
+ browserslist: 4.26.2
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-member-expression-to-functions': 7.27.1
+ '@babel/helper-optimise-call-expression': 7.27.1
+ '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4)
+ '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+ '@babel/traverse': 7.28.4
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-globals@7.28.0': {}
+
+ '@babel/helper-member-expression-to-functions@7.27.1':
+ dependencies:
+ '@babel/traverse': 7.28.4
+ '@babel/types': 7.28.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-imports@7.27.1':
+ dependencies:
+ '@babel/traverse': 7.28.4
+ '@babel/types': 7.28.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-module-imports': 7.27.1
+ '@babel/helper-validator-identifier': 7.27.1
+ '@babel/traverse': 7.28.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-optimise-call-expression@7.27.1':
+ dependencies:
+ '@babel/types': 7.28.4
+
+ '@babel/helper-plugin-utils@7.27.1': {}
+
+ '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-member-expression-to-functions': 7.27.1
+ '@babel/helper-optimise-call-expression': 7.27.1
+ '@babel/traverse': 7.28.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
+ dependencies:
+ '@babel/traverse': 7.28.4
+ '@babel/types': 7.28.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-string-parser@7.27.1': {}
+
+ '@babel/helper-validator-identifier@7.27.1': {}
+
+ '@babel/helper-validator-option@7.27.1': {}
+
+ '@babel/helpers@7.28.4':
+ dependencies:
+ '@babel/template': 7.27.2
+ '@babel/types': 7.28.4
+
+ '@babel/parser@7.28.4':
+ dependencies:
+ '@babel/types': 7.28.4
+
+ '@babel/plugin-proposal-decorators@7.28.0(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4)
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.28.4)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4)
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+ '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/runtime@7.28.4': {}
+
+ '@babel/template@7.27.2':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/parser': 7.28.4
+ '@babel/types': 7.28.4
+
+ '@babel/traverse@7.28.4':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.28.3
+ '@babel/helper-globals': 7.28.0
+ '@babel/parser': 7.28.4
+ '@babel/template': 7.27.2
+ '@babel/types': 7.28.4
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/types@7.28.4':
+ dependencies:
+ '@babel/helper-string-parser': 7.27.1
+ '@babel/helper-validator-identifier': 7.27.1
+
+ '@cacheable/memoize@2.0.2':
+ dependencies:
+ '@cacheable/utils': 2.0.2
+
+ '@cacheable/memory@2.0.2':
+ dependencies:
+ '@cacheable/memoize': 2.0.2
+ '@cacheable/utils': 2.0.2
+ '@keyv/bigmap': 1.0.2
+ hookified: 1.12.1
+ keyv: 5.5.3
+
+ '@cacheable/utils@2.0.2': {}
+
+ '@commitlint/cli@19.8.1(@types/node@24.8.1)(typescript@5.6.3)':
+ dependencies:
+ '@commitlint/format': 19.8.1
+ '@commitlint/lint': 19.8.1
+ '@commitlint/load': 19.8.1(@types/node@24.8.1)(typescript@5.6.3)
+ '@commitlint/read': 19.8.1
+ '@commitlint/types': 19.8.1
+ tinyexec: 1.0.1
+ yargs: 17.7.2
+ transitivePeerDependencies:
+ - '@types/node'
+ - typescript
+
+ '@commitlint/config-conventional@19.8.1':
+ dependencies:
+ '@commitlint/types': 19.8.1
+ conventional-changelog-conventionalcommits: 7.0.2
+
+ '@commitlint/config-validator@19.8.1':
+ dependencies:
+ '@commitlint/types': 19.8.1
+ ajv: 8.17.1
+
+ '@commitlint/config-validator@20.0.0':
+ dependencies:
+ '@commitlint/types': 20.0.0
+ ajv: 8.17.1
+ optional: true
+
+ '@commitlint/ensure@19.8.1':
+ dependencies:
+ '@commitlint/types': 19.8.1
+ 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.8.1': {}
+
+ '@commitlint/execute-rule@20.0.0':
+ optional: true
+
+ '@commitlint/format@19.8.1':
+ dependencies:
+ '@commitlint/types': 19.8.1
+ chalk: 5.6.2
+
+ '@commitlint/is-ignored@19.8.1':
+ dependencies:
+ '@commitlint/types': 19.8.1
+ semver: 7.7.2
+
+ '@commitlint/lint@19.8.1':
+ dependencies:
+ '@commitlint/is-ignored': 19.8.1
+ '@commitlint/parse': 19.8.1
+ '@commitlint/rules': 19.8.1
+ '@commitlint/types': 19.8.1
+
+ '@commitlint/load@19.8.1(@types/node@24.8.1)(typescript@5.6.3)':
+ dependencies:
+ '@commitlint/config-validator': 19.8.1
+ '@commitlint/execute-rule': 19.8.1
+ '@commitlint/resolve-extends': 19.8.1
+ '@commitlint/types': 19.8.1
+ chalk: 5.6.2
+ cosmiconfig: 9.0.0(typescript@5.6.3)
+ cosmiconfig-typescript-loader: 6.1.0(@types/node@24.8.1)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3)
+ lodash.isplainobject: 4.0.6
+ lodash.merge: 4.6.2
+ lodash.uniq: 4.5.0
+ transitivePeerDependencies:
+ - '@types/node'
+ - typescript
+
+ '@commitlint/load@20.0.0(@types/node@24.8.1)(typescript@5.6.3)':
+ dependencies:
+ '@commitlint/config-validator': 20.0.0
+ '@commitlint/execute-rule': 20.0.0
+ '@commitlint/resolve-extends': 20.0.0
+ '@commitlint/types': 20.0.0
+ chalk: 5.6.2
+ cosmiconfig: 9.0.0(typescript@5.6.3)
+ cosmiconfig-typescript-loader: 6.1.0(@types/node@24.8.1)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3)
+ lodash.isplainobject: 4.0.6
+ lodash.merge: 4.6.2
+ lodash.uniq: 4.5.0
+ transitivePeerDependencies:
+ - '@types/node'
+ - typescript
+ optional: true
+
+ '@commitlint/message@19.8.1': {}
+
+ '@commitlint/parse@19.8.1':
+ dependencies:
+ '@commitlint/types': 19.8.1
+ conventional-changelog-angular: 7.0.0
+ conventional-commits-parser: 5.0.0
+
+ '@commitlint/read@19.8.1':
+ dependencies:
+ '@commitlint/top-level': 19.8.1
+ '@commitlint/types': 19.8.1
+ git-raw-commits: 4.0.0
+ minimist: 1.2.8
+ tinyexec: 1.0.1
+
+ '@commitlint/resolve-extends@19.8.1':
+ dependencies:
+ '@commitlint/config-validator': 19.8.1
+ '@commitlint/types': 19.8.1
+ global-directory: 4.0.1
+ import-meta-resolve: 4.2.0
+ lodash.mergewith: 4.6.2
+ resolve-from: 5.0.0
+
+ '@commitlint/resolve-extends@20.0.0':
+ dependencies:
+ '@commitlint/config-validator': 20.0.0
+ '@commitlint/types': 20.0.0
+ global-directory: 4.0.1
+ import-meta-resolve: 4.2.0
+ lodash.mergewith: 4.6.2
+ resolve-from: 5.0.0
+ optional: true
+
+ '@commitlint/rules@19.8.1':
+ dependencies:
+ '@commitlint/ensure': 19.8.1
+ '@commitlint/message': 19.8.1
+ '@commitlint/to-lines': 19.8.1
+ '@commitlint/types': 19.8.1
+
+ '@commitlint/to-lines@19.8.1': {}
+
+ '@commitlint/top-level@19.8.1':
+ dependencies:
+ find-up: 7.0.0
+
+ '@commitlint/types@19.8.1':
+ dependencies:
+ '@types/conventional-commits-parser': 5.0.1
+ chalk: 5.6.2
+
+ '@commitlint/types@20.0.0':
+ dependencies:
+ '@types/conventional-commits-parser': 5.0.1
+ chalk: 5.6.2
+ optional: true
+
+ '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)':
+ dependencies:
+ '@csstools/css-tokenizer': 3.0.4
+
+ '@csstools/css-tokenizer@3.0.4': {}
+
+ '@csstools/media-query-list-parser@4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)':
+ dependencies:
+ '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
+ '@csstools/css-tokenizer': 3.0.4
+
+ '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.0)':
+ dependencies:
+ postcss-selector-parser: 7.1.0
+
+ '@ctrl/tinycolor@3.6.1': {}
+
+ '@dual-bundle/import-meta-resolve@4.2.1': {}
+
+ '@element-plus/icons-vue@2.3.2(vue@3.5.22(typescript@5.6.3))':
+ dependencies:
+ vue: 3.5.22(typescript@5.6.3)
+
+ '@esbuild/aix-ppc64@0.25.10':
+ optional: true
+
+ '@esbuild/android-arm64@0.25.10':
+ optional: true
+
+ '@esbuild/android-arm@0.25.10':
+ optional: true
+
+ '@esbuild/android-x64@0.25.10':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.25.10':
+ optional: true
+
+ '@esbuild/darwin-x64@0.25.10':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.25.10':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.25.10':
+ optional: true
+
+ '@esbuild/linux-arm64@0.25.10':
+ optional: true
+
+ '@esbuild/linux-arm@0.25.10':
+ optional: true
+
+ '@esbuild/linux-ia32@0.25.10':
+ optional: true
+
+ '@esbuild/linux-loong64@0.25.10':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.25.10':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.25.10':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.25.10':
+ optional: true
+
+ '@esbuild/linux-s390x@0.25.10':
+ optional: true
+
+ '@esbuild/linux-x64@0.25.10':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.25.10':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.25.10':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.25.10':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.25.10':
+ optional: true
+
+ '@esbuild/openharmony-arm64@0.25.10':
+ optional: true
+
+ '@esbuild/sunos-x64@0.25.10':
+ optional: true
+
+ '@esbuild/win32-arm64@0.25.10':
+ optional: true
+
+ '@esbuild/win32-ia32@0.25.10':
+ optional: true
+
+ '@esbuild/win32-x64@0.25.10':
+ optional: true
+
+ '@eslint-community/eslint-utils@4.9.0(eslint@9.36.0(jiti@2.6.0))':
+ dependencies:
+ eslint: 9.36.0(jiti@2.6.0)
+ eslint-visitor-keys: 3.4.3
+
+ '@eslint-community/regexpp@4.12.1': {}
+
+ '@eslint/config-array@0.21.0':
+ dependencies:
+ '@eslint/object-schema': 2.1.6
+ debug: 4.4.3
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/config-helpers@0.3.1': {}
+
+ '@eslint/core@0.15.2':
+ dependencies:
+ '@types/json-schema': 7.0.15
+
+ '@eslint/eslintrc@3.3.1':
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.4.3
+ espree: 10.4.0
+ globals: 14.0.0
+ ignore: 5.3.2
+ import-fresh: 3.3.1
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/js@9.36.0': {}
+
+ '@eslint/object-schema@2.1.6': {}
+
+ '@eslint/plugin-kit@0.3.5':
+ dependencies:
+ '@eslint/core': 0.15.2
+ levn: 0.4.1
+
+ '@floating-ui/core@1.7.3':
+ dependencies:
+ '@floating-ui/utils': 0.2.10
+
+ '@floating-ui/dom@1.7.4':
+ dependencies:
+ '@floating-ui/core': 1.7.3
+ '@floating-ui/utils': 0.2.10
+
+ '@floating-ui/utils@0.2.10': {}
+
+ '@humanfs/core@0.19.1': {}
+
+ '@humanfs/node@0.16.7':
+ dependencies:
+ '@humanfs/core': 0.19.1
+ '@humanwhocodes/retry': 0.4.3
+
+ '@humanwhocodes/module-importer@1.0.1': {}
+
+ '@humanwhocodes/retry@0.4.3': {}
+
+ '@iconify/types@2.0.0': {}
+
+ '@iconify/vue@5.0.0(vue@3.5.22(typescript@5.6.3))':
+ dependencies:
+ '@iconify/types': 2.0.0
+ vue: 3.5.22(typescript@5.6.3)
+
+ '@intlify/core-base@9.14.5':
+ dependencies:
+ '@intlify/message-compiler': 9.14.5
+ '@intlify/shared': 9.14.5
+
+ '@intlify/message-compiler@9.14.5':
+ dependencies:
+ '@intlify/shared': 9.14.5
+ source-map-js: 1.2.1
+
+ '@intlify/shared@9.14.5': {}
+
+ '@isaacs/fs-minipass@4.0.1':
+ dependencies:
+ minipass: 7.1.2
+
+ '@jridgewell/gen-mapping@0.3.13':
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/remapping@2.3.5':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/source-map@0.3.11':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/sourcemap-codec@1.5.5': {}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ '@keyv/bigmap@1.0.2':
+ dependencies:
+ hookified: 1.12.1
+
+ '@keyv/serialize@1.1.1': {}
+
+ '@nodelib/fs.scandir@2.1.5':
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+
+ '@nodelib/fs.stat@2.0.5': {}
+
+ '@nodelib/fs.walk@1.2.8':
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.19.1
+
+ '@parcel/watcher-android-arm64@2.5.1':
+ optional: true
+
+ '@parcel/watcher-darwin-arm64@2.5.1':
+ optional: true
+
+ '@parcel/watcher-darwin-x64@2.5.1':
+ optional: true
+
+ '@parcel/watcher-freebsd-x64@2.5.1':
+ optional: true
+
+ '@parcel/watcher-linux-arm-glibc@2.5.1':
+ optional: true
+
+ '@parcel/watcher-linux-arm-musl@2.5.1':
+ optional: true
+
+ '@parcel/watcher-linux-arm64-glibc@2.5.1':
+ optional: true
+
+ '@parcel/watcher-linux-arm64-musl@2.5.1':
+ optional: true
+
+ '@parcel/watcher-linux-x64-glibc@2.5.1':
+ optional: true
+
+ '@parcel/watcher-linux-x64-musl@2.5.1':
+ optional: true
+
+ '@parcel/watcher-win32-arm64@2.5.1':
+ optional: true
+
+ '@parcel/watcher-win32-ia32@2.5.1':
+ optional: true
+
+ '@parcel/watcher-win32-x64@2.5.1':
+ optional: true
+
+ '@parcel/watcher@2.5.1':
+ dependencies:
+ detect-libc: 1.0.3
+ is-glob: 4.0.3
+ micromatch: 4.0.8
+ node-addon-api: 7.1.1
+ optionalDependencies:
+ '@parcel/watcher-android-arm64': 2.5.1
+ '@parcel/watcher-darwin-arm64': 2.5.1
+ '@parcel/watcher-darwin-x64': 2.5.1
+ '@parcel/watcher-freebsd-x64': 2.5.1
+ '@parcel/watcher-linux-arm-glibc': 2.5.1
+ '@parcel/watcher-linux-arm-musl': 2.5.1
+ '@parcel/watcher-linux-arm64-glibc': 2.5.1
+ '@parcel/watcher-linux-arm64-musl': 2.5.1
+ '@parcel/watcher-linux-x64-glibc': 2.5.1
+ '@parcel/watcher-linux-x64-musl': 2.5.1
+ '@parcel/watcher-win32-arm64': 2.5.1
+ '@parcel/watcher-win32-ia32': 2.5.1
+ '@parcel/watcher-win32-x64': 2.5.1
+ optional: true
+
+ '@pkgr/core@0.2.9': {}
+
+ '@polka/url@1.0.0-next.29': {}
+
+ '@rolldown/pluginutils@1.0.0-beta.29': {}
+
+ '@rollup/pluginutils@5.3.0(rollup@4.52.3)':
+ dependencies:
+ '@types/estree': 1.0.8
+ estree-walker: 2.0.2
+ picomatch: 4.0.3
+ optionalDependencies:
+ rollup: 4.52.3
+
+ '@rollup/rollup-android-arm-eabi@4.52.3':
+ optional: true
+
+ '@rollup/rollup-android-arm64@4.52.3':
+ optional: true
+
+ '@rollup/rollup-darwin-arm64@4.52.3':
+ optional: true
+
+ '@rollup/rollup-darwin-x64@4.52.3':
+ optional: true
+
+ '@rollup/rollup-freebsd-arm64@4.52.3':
+ optional: true
+
+ '@rollup/rollup-freebsd-x64@4.52.3':
+ optional: true
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.52.3':
+ optional: true
+
+ '@rollup/rollup-linux-arm-musleabihf@4.52.3':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-gnu@4.52.3':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-musl@4.52.3':
+ optional: true
+
+ '@rollup/rollup-linux-loong64-gnu@4.52.3':
+ optional: true
+
+ '@rollup/rollup-linux-ppc64-gnu@4.52.3':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-gnu@4.52.3':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-musl@4.52.3':
+ optional: true
+
+ '@rollup/rollup-linux-s390x-gnu@4.52.3':
+ optional: true
+
+ '@rollup/rollup-linux-x64-gnu@4.52.3':
+ optional: true
+
+ '@rollup/rollup-linux-x64-musl@4.52.3':
+ optional: true
+
+ '@rollup/rollup-openharmony-arm64@4.52.3':
+ optional: true
+
+ '@rollup/rollup-win32-arm64-msvc@4.52.3':
+ optional: true
+
+ '@rollup/rollup-win32-ia32-msvc@4.52.3':
+ optional: true
+
+ '@rollup/rollup-win32-x64-gnu@4.52.3':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.52.3':
+ optional: true
+
+ '@sec-ant/readable-stream@0.4.1': {}
+
+ '@sindresorhus/merge-streams@4.0.0': {}
+
+ '@sxzz/popperjs-es@2.11.7': {}
+
+ '@tailwindcss/node@4.1.14':
+ dependencies:
+ '@jridgewell/remapping': 2.3.5
+ enhanced-resolve: 5.18.3
+ jiti: 2.6.0
+ lightningcss: 1.30.1
+ magic-string: 0.30.19
+ source-map-js: 1.2.1
+ tailwindcss: 4.1.14
+
+ '@tailwindcss/oxide-android-arm64@4.1.14':
+ optional: true
+
+ '@tailwindcss/oxide-darwin-arm64@4.1.14':
+ optional: true
+
+ '@tailwindcss/oxide-darwin-x64@4.1.14':
+ optional: true
+
+ '@tailwindcss/oxide-freebsd-x64@4.1.14':
+ optional: true
+
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14':
+ optional: true
+
+ '@tailwindcss/oxide-linux-arm64-gnu@4.1.14':
+ optional: true
+
+ '@tailwindcss/oxide-linux-arm64-musl@4.1.14':
+ optional: true
+
+ '@tailwindcss/oxide-linux-x64-gnu@4.1.14':
+ optional: true
+
+ '@tailwindcss/oxide-linux-x64-musl@4.1.14':
+ optional: true
+
+ '@tailwindcss/oxide-wasm32-wasi@4.1.14':
+ optional: true
+
+ '@tailwindcss/oxide-win32-arm64-msvc@4.1.14':
+ optional: true
+
+ '@tailwindcss/oxide-win32-x64-msvc@4.1.14':
+ optional: true
+
+ '@tailwindcss/oxide@4.1.14':
+ dependencies:
+ detect-libc: 2.1.2
+ tar: 7.5.1
+ optionalDependencies:
+ '@tailwindcss/oxide-android-arm64': 4.1.14
+ '@tailwindcss/oxide-darwin-arm64': 4.1.14
+ '@tailwindcss/oxide-darwin-x64': 4.1.14
+ '@tailwindcss/oxide-freebsd-x64': 4.1.14
+ '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.14
+ '@tailwindcss/oxide-linux-arm64-gnu': 4.1.14
+ '@tailwindcss/oxide-linux-arm64-musl': 4.1.14
+ '@tailwindcss/oxide-linux-x64-gnu': 4.1.14
+ '@tailwindcss/oxide-linux-x64-musl': 4.1.14
+ '@tailwindcss/oxide-wasm32-wasi': 4.1.14
+ '@tailwindcss/oxide-win32-arm64-msvc': 4.1.14
+ '@tailwindcss/oxide-win32-x64-msvc': 4.1.14
+
+ '@tailwindcss/vite@4.1.14(vite@7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))':
+ dependencies:
+ '@tailwindcss/node': 4.1.14
+ '@tailwindcss/oxide': 4.1.14
+ tailwindcss: 4.1.14
+ vite: 7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
+
+ '@transloadit/prettier-bytes@0.0.7': {}
+
+ '@types/conventional-commits-parser@5.0.1':
+ dependencies:
+ '@types/node': 24.8.1
+
+ '@types/estree@1.0.8': {}
+
+ '@types/event-emitter@0.3.5': {}
+
+ '@types/json-schema@7.0.15': {}
+
+ '@types/lodash-es@4.17.12':
+ dependencies:
+ '@types/lodash': 4.17.20
+
+ '@types/lodash@4.17.20': {}
+
+ '@types/node@24.8.1':
+ dependencies:
+ undici-types: 7.14.0
+
+ '@types/sortablejs@1.15.8': {}
+
+ '@types/spark-md5@3.0.5': {}
+
+ '@types/web-bluetooth@0.0.16': {}
+
+ '@types/web-bluetooth@0.0.21': {}
+
+ '@typescript-eslint/eslint-plugin@8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.6.3))(eslint@9.36.0(jiti@2.6.0))(typescript@5.6.3)':
+ dependencies:
+ '@eslint-community/regexpp': 4.12.1
+ '@typescript-eslint/parser': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.6.3)
+ '@typescript-eslint/scope-manager': 8.44.1
+ '@typescript-eslint/type-utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.6.3)
+ '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.6.3)
+ '@typescript-eslint/visitor-keys': 8.44.1
+ eslint: 9.36.0(jiti@2.6.0)
+ graphemer: 1.4.0
+ ignore: 7.0.5
+ natural-compare: 1.4.0
+ ts-api-utils: 2.1.0(typescript@5.6.3)
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.6.3)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 8.44.1
+ '@typescript-eslint/types': 8.44.1
+ '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.6.3)
+ '@typescript-eslint/visitor-keys': 8.44.1
+ debug: 4.4.3
+ eslint: 9.36.0(jiti@2.6.0)
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/project-service@8.44.1(typescript@5.6.3)':
+ dependencies:
+ '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.6.3)
+ '@typescript-eslint/types': 8.44.1
+ debug: 4.4.3
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/scope-manager@8.44.1':
+ dependencies:
+ '@typescript-eslint/types': 8.44.1
+ '@typescript-eslint/visitor-keys': 8.44.1
+
+ '@typescript-eslint/tsconfig-utils@8.44.1(typescript@5.6.3)':
+ dependencies:
+ typescript: 5.6.3
+
+ '@typescript-eslint/type-utils@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.6.3)':
+ dependencies:
+ '@typescript-eslint/types': 8.44.1
+ '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.6.3)
+ '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.6.3)
+ debug: 4.4.3
+ eslint: 9.36.0(jiti@2.6.0)
+ ts-api-utils: 2.1.0(typescript@5.6.3)
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/types@8.44.1': {}
+
+ '@typescript-eslint/typescript-estree@8.44.1(typescript@5.6.3)':
+ dependencies:
+ '@typescript-eslint/project-service': 8.44.1(typescript@5.6.3)
+ '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.6.3)
+ '@typescript-eslint/types': 8.44.1
+ '@typescript-eslint/visitor-keys': 8.44.1
+ debug: 4.4.3
+ fast-glob: 3.3.3
+ is-glob: 4.0.3
+ minimatch: 9.0.5
+ semver: 7.7.2
+ ts-api-utils: 2.1.0(typescript@5.6.3)
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/utils@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.6.3)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.0))
+ '@typescript-eslint/scope-manager': 8.44.1
+ '@typescript-eslint/types': 8.44.1
+ '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.6.3)
+ eslint: 9.36.0(jiti@2.6.0)
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/visitor-keys@8.44.1':
+ dependencies:
+ '@typescript-eslint/types': 8.44.1
+ eslint-visitor-keys: 4.2.1
+
+ '@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.11
+ preact: 10.27.2
+
+ '@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.11
+
+ '@vitejs/plugin-vue@6.0.1(vite@7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.6.3))':
+ dependencies:
+ '@rolldown/pluginutils': 1.0.0-beta.29
+ vite: 7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
+ vue: 3.5.22(typescript@5.6.3)
+
+ '@volar/language-core@2.4.23':
+ dependencies:
+ '@volar/source-map': 2.4.23
+
+ '@volar/source-map@2.4.23': {}
+
+ '@volar/typescript@2.4.23':
+ dependencies:
+ '@volar/language-core': 2.4.23
+ path-browserify: 1.0.1
+ vscode-uri: 3.1.0
+
+ '@vue/babel-helper-vue-transform-on@1.5.0': {}
+
+ '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/helper-module-imports': 7.27.1
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4)
+ '@babel/template': 7.27.2
+ '@babel/traverse': 7.28.4
+ '@babel/types': 7.28.4
+ '@vue/babel-helper-vue-transform-on': 1.5.0
+ '@vue/babel-plugin-resolve-type': 1.5.0(@babel/core@7.28.4)
+ '@vue/shared': 3.5.22
+ optionalDependencies:
+ '@babel/core': 7.28.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@vue/babel-plugin-resolve-type@1.5.0(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/core': 7.28.4
+ '@babel/helper-module-imports': 7.27.1
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/parser': 7.28.4
+ '@vue/compiler-sfc': 3.5.22
+ transitivePeerDependencies:
+ - supports-color
+
+ '@vue/compiler-core@3.5.22':
+ dependencies:
+ '@babel/parser': 7.28.4
+ '@vue/shared': 3.5.22
+ entities: 4.5.0
+ estree-walker: 2.0.2
+ source-map-js: 1.2.1
+
+ '@vue/compiler-dom@3.5.22':
+ dependencies:
+ '@vue/compiler-core': 3.5.22
+ '@vue/shared': 3.5.22
+
+ '@vue/compiler-sfc@3.5.22':
+ dependencies:
+ '@babel/parser': 7.28.4
+ '@vue/compiler-core': 3.5.22
+ '@vue/compiler-dom': 3.5.22
+ '@vue/compiler-ssr': 3.5.22
+ '@vue/shared': 3.5.22
+ estree-walker: 2.0.2
+ magic-string: 0.30.19
+ postcss: 8.5.6
+ source-map-js: 1.2.1
+
+ '@vue/compiler-ssr@3.5.22':
+ dependencies:
+ '@vue/compiler-dom': 3.5.22
+ '@vue/shared': 3.5.22
+
+ '@vue/compiler-vue2@2.7.16':
+ dependencies:
+ de-indent: 1.0.2
+ he: 1.2.0
+
+ '@vue/devtools-api@6.6.4': {}
+
+ '@vue/devtools-api@7.7.7':
+ dependencies:
+ '@vue/devtools-kit': 7.7.7
+
+ '@vue/devtools-core@7.7.7(vite@7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.6.3))':
+ dependencies:
+ '@vue/devtools-kit': 7.7.7
+ '@vue/devtools-shared': 7.7.7
+ mitt: 3.0.1
+ nanoid: 5.1.6
+ pathe: 2.0.3
+ vite-hot-client: 2.1.0(vite@7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
+ vue: 3.5.22(typescript@5.6.3)
+ transitivePeerDependencies:
+ - vite
+
+ '@vue/devtools-kit@7.7.7':
+ dependencies:
+ '@vue/devtools-shared': 7.7.7
+ birpc: 2.6.1
+ hookable: 5.5.3
+ mitt: 3.0.1
+ perfect-debounce: 1.0.0
+ speakingurl: 14.0.1
+ superjson: 2.2.2
+
+ '@vue/devtools-shared@7.7.7':
+ dependencies:
+ rfdc: 1.4.1
+
+ '@vue/language-core@2.1.10(typescript@5.6.3)':
+ dependencies:
+ '@volar/language-core': 2.4.23
+ '@vue/compiler-dom': 3.5.22
+ '@vue/compiler-vue2': 2.7.16
+ '@vue/shared': 3.5.22
+ alien-signals: 0.2.2
+ minimatch: 9.0.5
+ muggle-string: 0.4.1
+ path-browserify: 1.0.1
+ optionalDependencies:
+ typescript: 5.6.3
+
+ '@vue/reactivity@3.5.22':
+ dependencies:
+ '@vue/shared': 3.5.22
+
+ '@vue/runtime-core@3.5.22':
+ dependencies:
+ '@vue/reactivity': 3.5.22
+ '@vue/shared': 3.5.22
+
+ '@vue/runtime-dom@3.5.22':
+ dependencies:
+ '@vue/reactivity': 3.5.22
+ '@vue/runtime-core': 3.5.22
+ '@vue/shared': 3.5.22
+ csstype: 3.1.3
+
+ '@vue/server-renderer@3.5.22(vue@3.5.22(typescript@5.6.3))':
+ dependencies:
+ '@vue/compiler-ssr': 3.5.22
+ '@vue/shared': 3.5.22
+ vue: 3.5.22(typescript@5.6.3)
+
+ '@vue/shared@3.5.22': {}
+
+ '@vueuse/core@13.9.0(vue@3.5.22(typescript@5.6.3))':
+ dependencies:
+ '@types/web-bluetooth': 0.0.21
+ '@vueuse/metadata': 13.9.0
+ '@vueuse/shared': 13.9.0(vue@3.5.22(typescript@5.6.3))
+ vue: 3.5.22(typescript@5.6.3)
+
+ '@vueuse/core@9.13.0(vue@3.5.22(typescript@5.6.3))':
+ dependencies:
+ '@types/web-bluetooth': 0.0.16
+ '@vueuse/metadata': 9.13.0
+ '@vueuse/shared': 9.13.0(vue@3.5.22(typescript@5.6.3))
+ vue-demi: 0.14.10(vue@3.5.22(typescript@5.6.3))
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - vue
+
+ '@vueuse/metadata@13.9.0': {}
+
+ '@vueuse/metadata@9.13.0': {}
+
+ '@vueuse/shared@13.9.0(vue@3.5.22(typescript@5.6.3))':
+ dependencies:
+ vue: 3.5.22(typescript@5.6.3)
+
+ '@vueuse/shared@9.13.0(vue@3.5.22(typescript@5.6.3))':
+ dependencies:
+ vue-demi: 0.14.10(vue@3.5.22(typescript@5.6.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.11)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(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.11)(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.11
+ 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.11)(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.11)(slate@0.72.8)(snabbdom@3.6.2)
+ dom7: 3.0.0
+ prismjs: 1.30.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.11)(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.11
+ 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.22(typescript@5.6.3))':
+ dependencies:
+ '@wangeditor/editor': 5.1.23
+ vue: 3.5.22(typescript@5.6.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.11)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(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.11)(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.11)(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.11)(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.11)(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.11)(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.11)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(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.11)(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.11)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(nanoid@3.3.11)(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.11
+ 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.11)(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.11)(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.11)(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.11)(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.11)(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.11
+ 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.11)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(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.11)(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.11)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(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.11)(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.11)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(nanoid@3.3.11)(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.11)(slate@0.72.8)(snabbdom@3.6.2)
+ dom7: 3.0.0
+ nanoid: 3.3.11
+ slate: 0.72.8
+ snabbdom: 3.6.2
+
+ JSONStream@1.3.5:
+ dependencies:
+ jsonparse: 1.3.1
+ through: 2.3.8
+
+ acorn-jsx@5.3.2(acorn@8.15.0):
+ dependencies:
+ acorn: 8.15.0
+
+ acorn@8.15.0: {}
+
+ adler-32@1.3.1: {}
+
+ 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.1.0
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+
+ alien-signals@0.2.2: {}
+
+ ansi-escapes@4.3.2:
+ dependencies:
+ type-fest: 0.21.3
+
+ ansi-escapes@7.1.1:
+ dependencies:
+ environment: 1.1.0
+
+ ansi-regex@5.0.1: {}
+
+ ansi-regex@6.2.2: {}
+
+ ansi-styles@3.2.1:
+ dependencies:
+ color-convert: 1.9.3
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ ansi-styles@6.2.3: {}
+
+ anymatch@3.1.3:
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+
+ argparse@2.0.1: {}
+
+ array-ify@1.0.0: {}
+
+ array-union@2.1.0: {}
+
+ astral-regex@2.0.0: {}
+
+ async-validator@4.2.5: {}
+
+ asynckit@0.4.0: {}
+
+ at-least-node@1.0.0: {}
+
+ axios@1.12.2:
+ dependencies:
+ follow-redirects: 1.15.11
+ form-data: 4.0.4
+ proxy-from-env: 1.1.0
+ transitivePeerDependencies:
+ - debug
+
+ balanced-match@1.0.2: {}
+
+ balanced-match@2.0.0: {}
+
+ base64-js@1.5.1: {}
+
+ baseline-browser-mapping@2.8.8: {}
+
+ binary-extensions@2.3.0: {}
+
+ birpc@2.6.1: {}
+
+ bl@4.1.0:
+ dependencies:
+ buffer: 5.7.1
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+
+ boolbase@1.0.0: {}
+
+ brace-expansion@1.1.12:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ brace-expansion@2.0.2:
+ dependencies:
+ balanced-match: 1.0.2
+
+ braces@3.0.3:
+ dependencies:
+ fill-range: 7.1.1
+
+ browserslist@4.26.2:
+ dependencies:
+ baseline-browser-mapping: 2.8.8
+ caniuse-lite: 1.0.30001745
+ electron-to-chromium: 1.5.227
+ node-releases: 2.0.21
+ update-browserslist-db: 1.1.3(browserslist@4.26.2)
+
+ buffer-from@1.1.2: {}
+
+ buffer@5.7.1:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
+ bundle-name@4.1.0:
+ dependencies:
+ run-applescript: 7.1.0
+
+ cacheable@2.0.2:
+ dependencies:
+ '@cacheable/memoize': 2.0.2
+ '@cacheable/memory': 2.0.2
+ '@cacheable/utils': 2.0.2
+ hookified: 1.12.1
+ keyv: 5.5.3
+
+ cachedir@2.3.0: {}
+
+ call-bind-apply-helpers@1.0.2:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+
+ callsites@3.1.0: {}
+
+ caniuse-lite@1.0.30001745: {}
+
+ cfb@1.2.2:
+ dependencies:
+ adler-32: 1.3.1
+ crc-32: 1.2.2
+
+ chalk@2.4.2:
+ dependencies:
+ ansi-styles: 3.2.1
+ escape-string-regexp: 1.0.5
+ supports-color: 5.5.0
+
+ chalk@4.1.2:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ chalk@5.6.2: {}
+
+ 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.1.2
+
+ chownr@3.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@3.0.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: {}
+
+ codepage@1.15.0: {}
+
+ color-convert@1.9.3:
+ dependencies:
+ color-name: 1.1.3
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.3: {}
+
+ 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@13.1.0: {}
+
+ commander@2.20.3: {}
+
+ commitizen@4.3.1(@types/node@24.8.1)(typescript@5.6.3):
+ dependencies:
+ cachedir: 2.3.0
+ cz-conventional-changelog: 3.3.0(@types/node@24.8.1)(typescript@5.6.3)
+ dedent: 0.7.0
+ detect-indent: 6.1.0
+ find-node-modules: 2.1.3
+ find-root: 1.1.0
+ fs-extra: 9.1.0
+ glob: 7.2.3
+ inquirer: 8.2.5
+ is-utf8: 0.2.1
+ lodash: 4.17.21
+ minimist: 1.2.7
+ strip-bom: 4.0.0
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - '@types/node'
+ - typescript
+
+ compare-func@2.0.0:
+ dependencies:
+ array-ify: 1.0.0
+ dot-prop: 5.3.0
+
+ compute-scroll-into-view@1.0.20: {}
+
+ concat-map@0.0.1: {}
+
+ confbox@0.1.8: {}
+
+ confbox@0.2.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-commit-types@3.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@3.0.5:
+ dependencies:
+ is-what: 4.1.16
+
+ core-js@3.45.1: {}
+
+ cosmiconfig-typescript-loader@6.1.0(@types/node@24.8.1)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3):
+ dependencies:
+ '@types/node': 24.8.1
+ cosmiconfig: 9.0.0(typescript@5.6.3)
+ jiti: 2.6.0
+ typescript: 5.6.3
+
+ cosmiconfig@9.0.0(typescript@5.6.3):
+ dependencies:
+ env-paths: 2.2.1
+ import-fresh: 3.3.1
+ js-yaml: 4.1.0
+ parse-json: 5.2.0
+ optionalDependencies:
+ typescript: 5.6.3
+
+ crc-32@1.2.2: {}
+
+ cross-spawn@7.0.6:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ crypto-js@4.2.0: {}
+
+ css-functions-list@3.2.3: {}
+
+ css-tree@3.1.0:
+ dependencies:
+ mdn-data: 2.12.2
+ source-map-js: 1.2.1
+
+ cssesc@3.0.0: {}
+
+ csstype@3.1.3: {}
+
+ cz-conventional-changelog@3.3.0(@types/node@24.8.1)(typescript@5.6.3):
+ dependencies:
+ chalk: 2.4.2
+ commitizen: 4.3.1(@types/node@24.8.1)(typescript@5.6.3)
+ conventional-commit-types: 3.0.0
+ lodash.map: 4.6.0
+ longest: 2.0.1
+ word-wrap: 1.2.5
+ optionalDependencies:
+ '@commitlint/load': 20.0.0(@types/node@24.8.1)(typescript@5.6.3)
+ transitivePeerDependencies:
+ - '@types/node'
+ - typescript
+
+ cz-git@1.12.0: {}
+
+ 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: {}
+
+ dayjs@1.11.18: {}
+
+ de-indent@1.0.2: {}
+
+ debug@4.4.3:
+ dependencies:
+ ms: 2.1.3
+
+ dedent@0.7.0: {}
+
+ deep-is@0.1.4: {}
+
+ deep-pick-omit@1.2.1: {}
+
+ default-browser-id@5.0.0: {}
+
+ default-browser@5.2.1:
+ dependencies:
+ bundle-name: 4.1.0
+ default-browser-id: 5.0.0
+
+ defaults@1.0.4:
+ dependencies:
+ clone: 1.0.4
+
+ define-lazy-prop@2.0.0: {}
+
+ define-lazy-prop@3.0.0: {}
+
+ defu@6.1.4: {}
+
+ delayed-stream@1.0.0: {}
+
+ delegate@3.2.0: {}
+
+ destr@2.0.5: {}
+
+ detect-file@1.0.0: {}
+
+ detect-indent@6.1.0: {}
+
+ detect-libc@1.0.3:
+ optional: true
+
+ detect-libc@2.1.2: {}
+
+ dir-glob@3.0.1:
+ dependencies:
+ path-type: 4.0.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@2.3.0: {}
+
+ domhandler@5.0.3:
+ dependencies:
+ domelementtype: 2.3.0
+
+ domutils@3.2.2:
+ dependencies:
+ dom-serializer: 2.0.0
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+
+ dot-prop@5.3.0:
+ dependencies:
+ is-obj: 2.0.0
+
+ downloadjs@1.4.7: {}
+
+ dunder-proto@1.0.1:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ echarts@6.0.0:
+ dependencies:
+ tslib: 2.3.0
+ zrender: 6.0.0
+
+ electron-to-chromium@1.5.227: {}
+
+ element-plus@2.11.4(vue@3.5.22(typescript@5.6.3)):
+ dependencies:
+ '@ctrl/tinycolor': 3.6.1
+ '@element-plus/icons-vue': 2.3.2(vue@3.5.22(typescript@5.6.3))
+ '@floating-ui/dom': 1.7.4
+ '@popperjs/core': '@sxzz/popperjs-es@2.11.7'
+ '@types/lodash': 4.17.20
+ '@types/lodash-es': 4.17.12
+ '@vueuse/core': 9.13.0(vue@3.5.22(typescript@5.6.3))
+ async-validator: 4.2.5
+ dayjs: 1.11.18
+ 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.22(typescript@5.6.3)
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+
+ emoji-regex@10.5.0: {}
+
+ emoji-regex@8.0.0: {}
+
+ enhanced-resolve@5.18.3:
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.3.0
+
+ entities@4.5.0: {}
+
+ env-paths@2.2.1: {}
+
+ environment@1.1.0: {}
+
+ error-ex@1.3.4:
+ dependencies:
+ is-arrayish: 0.2.1
+
+ error-stack-parser-es@0.1.5: {}
+
+ es-define-property@1.0.1: {}
+
+ es-errors@1.3.0: {}
+
+ es-module-lexer@1.7.0: {}
+
+ es-object-atoms@1.1.1:
+ dependencies:
+ es-errors: 1.3.0
+
+ es-set-tostringtag@2.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+
+ 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.25.10:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.25.10
+ '@esbuild/android-arm': 0.25.10
+ '@esbuild/android-arm64': 0.25.10
+ '@esbuild/android-x64': 0.25.10
+ '@esbuild/darwin-arm64': 0.25.10
+ '@esbuild/darwin-x64': 0.25.10
+ '@esbuild/freebsd-arm64': 0.25.10
+ '@esbuild/freebsd-x64': 0.25.10
+ '@esbuild/linux-arm': 0.25.10
+ '@esbuild/linux-arm64': 0.25.10
+ '@esbuild/linux-ia32': 0.25.10
+ '@esbuild/linux-loong64': 0.25.10
+ '@esbuild/linux-mips64el': 0.25.10
+ '@esbuild/linux-ppc64': 0.25.10
+ '@esbuild/linux-riscv64': 0.25.10
+ '@esbuild/linux-s390x': 0.25.10
+ '@esbuild/linux-x64': 0.25.10
+ '@esbuild/netbsd-arm64': 0.25.10
+ '@esbuild/netbsd-x64': 0.25.10
+ '@esbuild/openbsd-arm64': 0.25.10
+ '@esbuild/openbsd-x64': 0.25.10
+ '@esbuild/openharmony-arm64': 0.25.10
+ '@esbuild/sunos-x64': 0.25.10
+ '@esbuild/win32-arm64': 0.25.10
+ '@esbuild/win32-ia32': 0.25.10
+ '@esbuild/win32-x64': 0.25.10
+
+ 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: {}
+
+ eslint-config-prettier@9.1.2(eslint@9.36.0(jiti@2.6.0)):
+ dependencies:
+ eslint: 9.36.0(jiti@2.6.0)
+
+ eslint-plugin-prettier@5.5.4(eslint-config-prettier@9.1.2(eslint@9.36.0(jiti@2.6.0)))(eslint@9.36.0(jiti@2.6.0))(prettier@3.6.2):
+ dependencies:
+ eslint: 9.36.0(jiti@2.6.0)
+ prettier: 3.6.2
+ prettier-linter-helpers: 1.0.0
+ synckit: 0.11.11
+ optionalDependencies:
+ eslint-config-prettier: 9.1.2(eslint@9.36.0(jiti@2.6.0))
+
+ eslint-plugin-vue@9.33.0(eslint@9.36.0(jiti@2.6.0)):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.0))
+ eslint: 9.36.0(jiti@2.6.0)
+ globals: 13.24.0
+ natural-compare: 1.4.0
+ nth-check: 2.1.1
+ postcss-selector-parser: 6.1.2
+ semver: 7.7.2
+ vue-eslint-parser: 9.4.3(eslint@9.36.0(jiti@2.6.0))
+ 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.4.0:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+
+ eslint-visitor-keys@3.4.3: {}
+
+ eslint-visitor-keys@4.2.1: {}
+
+ eslint@9.36.0(jiti@2.6.0):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.0))
+ '@eslint-community/regexpp': 4.12.1
+ '@eslint/config-array': 0.21.0
+ '@eslint/config-helpers': 0.3.1
+ '@eslint/core': 0.15.2
+ '@eslint/eslintrc': 3.3.1
+ '@eslint/js': 9.36.0
+ '@eslint/plugin-kit': 0.3.5
+ '@humanfs/node': 0.16.7
+ '@humanwhocodes/module-importer': 1.0.1
+ '@humanwhocodes/retry': 0.4.3
+ '@types/estree': 1.0.8
+ '@types/json-schema': 7.0.15
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.6
+ debug: 4.4.3
+ escape-string-regexp: 4.0.0
+ eslint-scope: 8.4.0
+ eslint-visitor-keys: 4.2.1
+ espree: 10.4.0
+ esquery: 1.6.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 8.0.0
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ ignore: 5.3.2
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ json-stable-stringify-without-jsonify: 1.0.1
+ lodash.merge: 4.6.2
+ minimatch: 3.1.2
+ natural-compare: 1.4.0
+ optionator: 0.9.4
+ optionalDependencies:
+ jiti: 2.6.0
+ 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
+
+ espree@10.4.0:
+ dependencies:
+ acorn: 8.15.0
+ acorn-jsx: 5.3.2(acorn@8.15.0)
+ eslint-visitor-keys: 4.2.1
+
+ espree@9.6.1:
+ dependencies:
+ acorn: 8.15.0
+ acorn-jsx: 5.3.2(acorn@8.15.0)
+ eslint-visitor-keys: 3.4.3
+
+ esquery@1.6.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ estraverse@5.3.0: {}
+
+ estree-walker@2.0.2: {}
+
+ estree-walker@3.0.3:
+ dependencies:
+ '@types/estree': 1.0.8
+
+ esutils@2.0.3: {}
+
+ 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
+
+ execa@9.6.0:
+ dependencies:
+ '@sindresorhus/merge-streams': 4.0.0
+ cross-spawn: 7.0.6
+ figures: 6.1.0
+ get-stream: 9.0.1
+ human-signals: 8.0.1
+ is-plain-obj: 4.1.0
+ is-stream: 4.0.1
+ npm-run-path: 6.0.0
+ pretty-ms: 9.3.0
+ signal-exit: 4.1.0
+ strip-final-newline: 4.0.0
+ yoctocolors: 2.1.2
+
+ expand-tilde@2.0.2:
+ dependencies:
+ homedir-polyfill: 1.0.3
+
+ exsolve@1.0.7: {}
+
+ ext@1.7.0:
+ dependencies:
+ type: 2.7.3
+
+ external-editor@3.1.0:
+ dependencies:
+ chardet: 0.7.0
+ iconv-lite: 0.4.24
+ tmp: 0.0.33
+
+ 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.1.0: {}
+
+ fastest-levenshtein@1.0.16: {}
+
+ fastq@1.19.1:
+ dependencies:
+ reusify: 1.1.0
+
+ fdir@6.5.0(picomatch@4.0.3):
+ optionalDependencies:
+ picomatch: 4.0.3
+
+ figures@3.2.0:
+ dependencies:
+ escape-string-regexp: 1.0.5
+
+ figures@6.1.0:
+ dependencies:
+ is-unicode-supported: 2.1.0
+
+ file-entry-cache@10.1.4:
+ dependencies:
+ flat-cache: 6.1.14
+
+ file-entry-cache@8.0.0:
+ dependencies:
+ flat-cache: 4.0.1
+
+ file-saver@2.0.5: {}
+
+ fill-range@7.1.1:
+ dependencies:
+ to-regex-range: 5.0.1
+
+ find-node-modules@2.1.3:
+ dependencies:
+ findup-sync: 4.0.0
+ merge: 2.1.1
+
+ find-root@1.1.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@4.0.0:
+ dependencies:
+ detect-file: 1.0.0
+ is-glob: 4.0.3
+ micromatch: 4.0.8
+ resolve-dir: 1.0.1
+
+ flat-cache@4.0.1:
+ dependencies:
+ flatted: 3.3.3
+ keyv: 4.5.4
+
+ flat-cache@6.1.14:
+ dependencies:
+ cacheable: 2.0.2
+ flatted: 3.3.3
+ hookified: 1.12.1
+
+ flatted@3.3.3: {}
+
+ follow-redirects@1.15.11: {}
+
+ form-data@4.0.4:
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ es-set-tostringtag: 2.1.0
+ hasown: 2.0.2
+ mime-types: 2.1.35
+
+ frac@1.1.2: {}
+
+ fs-extra@10.1.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.2.0
+ universalify: 2.0.1
+
+ fs-extra@11.3.2:
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.2.0
+ universalify: 2.0.1
+
+ fs-extra@9.1.0:
+ dependencies:
+ at-least-node: 1.0.0
+ graceful-fs: 4.2.11
+ jsonfile: 6.2.0
+ universalify: 2.0.1
+
+ fs.realpath@1.0.0: {}
+
+ fsevents@2.3.3:
+ optional: true
+
+ function-bind@1.1.2: {}
+
+ gensync@1.0.0-beta.2: {}
+
+ get-caller-file@2.0.5: {}
+
+ get-east-asian-width@1.4.0: {}
+
+ get-intrinsic@1.3.0:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ function-bind: 1.1.2
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.2
+ math-intrinsics: 1.1.0
+
+ get-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.1
+
+ get-stream@8.0.1: {}
+
+ get-stream@9.0.1:
+ dependencies:
+ '@sec-ant/readable-stream': 0.4.1
+ is-stream: 4.0.1
+
+ get-tsconfig@4.10.1:
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+
+ 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@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@13.24.0:
+ dependencies:
+ type-fest: 0.20.2
+
+ globals@14.0.0: {}
+
+ globals@15.15.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
+
+ globjoin@0.1.4: {}
+
+ gopd@1.2.0: {}
+
+ graceful-fs@4.2.11: {}
+
+ graphemer@1.4.0: {}
+
+ has-flag@3.0.0: {}
+
+ has-flag@4.0.0: {}
+
+ has-symbols@1.1.0: {}
+
+ has-tostringtag@1.0.2:
+ dependencies:
+ has-symbols: 1.1.0
+
+ hasown@2.0.2:
+ dependencies:
+ function-bind: 1.1.2
+
+ he@1.2.0: {}
+
+ highlight.js@11.11.1: {}
+
+ homedir-polyfill@1.0.3:
+ dependencies:
+ parse-passwd: 1.0.0
+
+ hookable@5.5.3: {}
+
+ hookified@1.12.1: {}
+
+ html-tags@3.3.1: {}
+
+ html-void-elements@2.0.1: {}
+
+ 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: {}
+
+ human-signals@8.0.1: {}
+
+ husky@9.1.7: {}
+
+ i18next@20.6.1:
+ dependencies:
+ '@babel/runtime': 7.28.4
+
+ iconv-lite@0.4.24:
+ dependencies:
+ safer-buffer: 2.1.2
+
+ ieee754@1.2.1: {}
+
+ ignore@5.3.2: {}
+
+ ignore@7.0.5: {}
+
+ immer@9.0.21: {}
+
+ immutable@5.1.3: {}
+
+ import-fresh@3.3.1:
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ import-meta-resolve@4.2.0: {}
+
+ imurmurhash@0.1.4: {}
+
+ 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@8.2.5:
+ dependencies:
+ ansi-escapes: 4.3.2
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
+ cli-width: 3.0.0
+ external-editor: 3.1.0
+ figures: 3.2.0
+ lodash: 4.17.21
+ mute-stream: 0.0.8
+ ora: 5.4.1
+ run-async: 2.4.1
+ rxjs: 7.8.2
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ through: 2.3.8
+ wrap-ansi: 7.0.0
+
+ is-arrayish@0.2.1: {}
+
+ is-binary-path@2.1.0:
+ dependencies:
+ binary-extensions: 2.3.0
+
+ is-docker@2.2.1: {}
+
+ is-docker@3.0.0: {}
+
+ is-extglob@2.1.1: {}
+
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-fullwidth-code-point@4.0.0: {}
+
+ is-fullwidth-code-point@5.1.0:
+ dependencies:
+ get-east-asian-width: 1.4.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-number@7.0.0: {}
+
+ is-obj@2.0.0: {}
+
+ is-plain-obj@4.1.0: {}
+
+ is-plain-object@5.0.0: {}
+
+ is-stream@3.0.0: {}
+
+ is-stream@4.0.1: {}
+
+ is-text-path@2.0.0:
+ dependencies:
+ text-extensions: 2.4.0
+
+ is-unicode-supported@0.1.0: {}
+
+ is-unicode-supported@2.1.0: {}
+
+ is-url@1.2.4: {}
+
+ is-utf8@0.2.1: {}
+
+ is-what@4.1.16: {}
+
+ 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
+
+ isexe@2.0.0: {}
+
+ jiti@2.6.0: {}
+
+ js-tokens@4.0.0: {}
+
+ js-tokens@9.0.1: {}
+
+ js-yaml@4.1.0:
+ dependencies:
+ argparse: 2.0.1
+
+ 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@2.2.3: {}
+
+ jsonfile@6.2.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
+
+ keyv@5.5.3:
+ dependencies:
+ '@keyv/serialize': 1.1.1
+
+ kind-of@6.0.3: {}
+
+ known-css-properties@0.36.0: {}
+
+ known-css-properties@0.37.0: {}
+
+ kolorist@1.8.0: {}
+
+ levn@0.4.1:
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+
+ lightningcss-darwin-arm64@1.30.1:
+ optional: true
+
+ lightningcss-darwin-x64@1.30.1:
+ optional: true
+
+ lightningcss-freebsd-x64@1.30.1:
+ optional: true
+
+ lightningcss-linux-arm-gnueabihf@1.30.1:
+ optional: true
+
+ lightningcss-linux-arm64-gnu@1.30.1:
+ optional: true
+
+ lightningcss-linux-arm64-musl@1.30.1:
+ optional: true
+
+ lightningcss-linux-x64-gnu@1.30.1:
+ optional: true
+
+ lightningcss-linux-x64-musl@1.30.1:
+ optional: true
+
+ lightningcss-win32-arm64-msvc@1.30.1:
+ optional: true
+
+ lightningcss-win32-x64-msvc@1.30.1:
+ optional: true
+
+ lightningcss@1.30.1:
+ dependencies:
+ detect-libc: 2.1.2
+ optionalDependencies:
+ lightningcss-darwin-arm64: 1.30.1
+ lightningcss-darwin-x64: 1.30.1
+ lightningcss-freebsd-x64: 1.30.1
+ lightningcss-linux-arm-gnueabihf: 1.30.1
+ lightningcss-linux-arm64-gnu: 1.30.1
+ lightningcss-linux-arm64-musl: 1.30.1
+ lightningcss-linux-x64-gnu: 1.30.1
+ lightningcss-linux-x64-musl: 1.30.1
+ lightningcss-win32-arm64-msvc: 1.30.1
+ lightningcss-win32-x64-msvc: 1.30.1
+
+ lilconfig@3.1.3: {}
+
+ lines-and-columns@1.2.4: {}
+
+ lint-staged@15.5.2:
+ dependencies:
+ chalk: 5.6.2
+ commander: 13.1.0
+ debug: 4.4.3
+ execa: 8.0.1
+ lilconfig: 3.1.3
+ listr2: 8.3.3
+ micromatch: 4.0.8
+ pidtree: 0.6.0
+ string-argv: 0.3.2
+ yaml: 2.8.1
+ transitivePeerDependencies:
+ - supports-color
+
+ listr2@8.3.3:
+ 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.2
+
+ local-pkg@1.1.2:
+ dependencies:
+ mlly: 1.8.0
+ pkg-types: 2.3.0
+ quansync: 0.2.11
+
+ 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.isequal@4.5.0: {}
+
+ lodash.isplainobject@4.0.6: {}
+
+ lodash.kebabcase@4.1.1: {}
+
+ lodash.map@4.6.0: {}
+
+ 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-update@6.1.0:
+ dependencies:
+ ansi-escapes: 7.1.1
+ cli-cursor: 5.0.0
+ slice-ansi: 7.1.2
+ strip-ansi: 7.1.2
+ wrap-ansi: 9.0.2
+
+ longest@2.0.1: {}
+
+ lru-cache@5.1.1:
+ dependencies:
+ yallist: 3.1.1
+
+ magic-string@0.30.19:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ math-intrinsics@1.1.0: {}
+
+ mathml-tag-names@2.1.3: {}
+
+ mdn-data@2.12.2: {}
+
+ mdn-data@2.24.0: {}
+
+ memoize-one@6.0.0: {}
+
+ meow@12.1.1: {}
+
+ meow@13.2.0: {}
+
+ merge-stream@2.0.0: {}
+
+ merge2@1.4.1: {}
+
+ merge@2.1.1: {}
+
+ 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
+
+ mimic-fn@2.1.0: {}
+
+ mimic-fn@4.0.0: {}
+
+ mimic-function@5.0.1: {}
+
+ minimatch@3.1.2:
+ dependencies:
+ brace-expansion: 1.1.12
+
+ minimatch@9.0.5:
+ dependencies:
+ brace-expansion: 2.0.2
+
+ minimist@1.2.7: {}
+
+ minimist@1.2.8: {}
+
+ minipass@7.1.2: {}
+
+ minizlib@3.1.0:
+ dependencies:
+ minipass: 7.1.2
+
+ mitt@3.0.1: {}
+
+ mlly@1.8.0:
+ dependencies:
+ acorn: 8.15.0
+ pathe: 2.0.3
+ pkg-types: 1.3.1
+ ufo: 1.6.1
+
+ mrmime@2.0.1: {}
+
+ ms@2.1.3: {}
+
+ muggle-string@0.4.1: {}
+
+ mute-stream@0.0.8: {}
+
+ namespace-emitter@2.0.1: {}
+
+ nanoid@3.3.11: {}
+
+ nanoid@5.1.6: {}
+
+ natural-compare@1.4.0: {}
+
+ next-tick@1.1.0: {}
+
+ node-addon-api@7.1.1:
+ optional: true
+
+ node-releases@2.0.21: {}
+
+ normalize-path@3.0.0: {}
+
+ normalize-wheel-es@1.2.0: {}
+
+ npm-run-path@5.3.0:
+ dependencies:
+ path-key: 4.0.0
+
+ npm-run-path@6.0.0:
+ dependencies:
+ path-key: 4.0.0
+ unicorn-magic: 0.3.0
+
+ nprogress@0.2.0: {}
+
+ nth-check@2.1.1:
+ dependencies:
+ boolbase: 1.0.0
+
+ ohash@2.0.11: {}
+
+ 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@10.2.0:
+ dependencies:
+ default-browser: 5.2.1
+ define-lazy-prop: 3.0.0
+ is-inside-container: 1.0.0
+ wsl-utils: 0.1.0
+
+ 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
+
+ os-tmpdir@1.0.2: {}
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+
+ p-limit@4.0.0:
+ dependencies:
+ yocto-queue: 1.2.1
+
+ p-locate@5.0.0:
+ dependencies:
+ p-limit: 3.1.0
+
+ p-locate@6.0.0:
+ dependencies:
+ p-limit: 4.0.0
+
+ parent-module@1.0.1:
+ dependencies:
+ callsites: 3.1.0
+
+ parse-json@5.2.0:
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ error-ex: 1.3.4
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 1.2.4
+
+ parse-ms@4.0.0: {}
+
+ parse-passwd@1.0.0: {}
+
+ path-browserify@1.0.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-type@4.0.0: {}
+
+ pathe@2.0.3: {}
+
+ perfect-debounce@1.0.0: {}
+
+ picocolors@1.1.1: {}
+
+ picomatch@2.3.1: {}
+
+ picomatch@4.0.3: {}
+
+ pidtree@0.6.0: {}
+
+ pinia-plugin-persistedstate@4.5.0(pinia@3.0.3(typescript@5.6.3)(vue@3.5.22(typescript@5.6.3))):
+ dependencies:
+ deep-pick-omit: 1.2.1
+ defu: 6.1.4
+ destr: 2.0.5
+ optionalDependencies:
+ pinia: 3.0.3(typescript@5.6.3)(vue@3.5.22(typescript@5.6.3))
+
+ pinia@3.0.3(typescript@5.6.3)(vue@3.5.22(typescript@5.6.3)):
+ dependencies:
+ '@vue/devtools-api': 7.7.7
+ vue: 3.5.22(typescript@5.6.3)
+ optionalDependencies:
+ typescript: 5.6.3
+
+ pkg-types@1.3.1:
+ dependencies:
+ confbox: 0.1.8
+ mlly: 1.8.0
+ pathe: 2.0.3
+
+ pkg-types@2.3.0:
+ dependencies:
+ confbox: 0.2.2
+ exsolve: 1.0.7
+ pathe: 2.0.3
+
+ postcss-html@1.8.0:
+ dependencies:
+ htmlparser2: 8.0.2
+ js-tokens: 9.0.1
+ postcss: 8.5.6
+ postcss-safe-parser: 6.0.0(postcss@8.5.6)
+
+ postcss-media-query-parser@0.2.3: {}
+
+ postcss-resolve-nested-selector@0.1.6: {}
+
+ postcss-safe-parser@6.0.0(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+
+ postcss-safe-parser@7.0.1(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+
+ postcss-scss@4.0.9(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+
+ postcss-selector-parser@6.1.2:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
+ postcss-selector-parser@7.1.0:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
+ postcss-sorting@8.0.2(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+
+ postcss-value-parser@4.2.0: {}
+
+ postcss@8.5.6:
+ dependencies:
+ nanoid: 3.3.11
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ preact@10.27.2: {}
+
+ prelude-ls@1.2.1: {}
+
+ prettier-linter-helpers@1.0.0:
+ dependencies:
+ fast-diff: 1.3.0
+
+ prettier@3.6.2: {}
+
+ pretty-ms@9.3.0:
+ dependencies:
+ parse-ms: 4.0.0
+
+ prismjs@1.30.0: {}
+
+ proxy-from-env@1.1.0: {}
+
+ punycode@2.3.1: {}
+
+ qrcode.vue@3.6.0(vue@3.5.22(typescript@5.6.3)):
+ dependencies:
+ vue: 3.5.22(typescript@5.6.3)
+
+ quansync@0.2.11: {}
+
+ queue-microtask@1.2.3: {}
+
+ readable-stream@3.6.2:
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+
+ readdirp@3.6.0:
+ dependencies:
+ picomatch: 2.3.1
+
+ readdirp@4.1.2: {}
+
+ require-directory@2.1.1: {}
+
+ require-from-string@2.0.2: {}
+
+ 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: {}
+
+ 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
+
+ reusify@1.1.0: {}
+
+ rfdc@1.4.1: {}
+
+ rollup-plugin-visualizer@5.14.0(rollup@4.52.3):
+ dependencies:
+ open: 8.4.2
+ picomatch: 4.0.3
+ source-map: 0.7.6
+ yargs: 17.7.2
+ optionalDependencies:
+ rollup: 4.52.3
+
+ rollup@4.52.3:
+ dependencies:
+ '@types/estree': 1.0.8
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.52.3
+ '@rollup/rollup-android-arm64': 4.52.3
+ '@rollup/rollup-darwin-arm64': 4.52.3
+ '@rollup/rollup-darwin-x64': 4.52.3
+ '@rollup/rollup-freebsd-arm64': 4.52.3
+ '@rollup/rollup-freebsd-x64': 4.52.3
+ '@rollup/rollup-linux-arm-gnueabihf': 4.52.3
+ '@rollup/rollup-linux-arm-musleabihf': 4.52.3
+ '@rollup/rollup-linux-arm64-gnu': 4.52.3
+ '@rollup/rollup-linux-arm64-musl': 4.52.3
+ '@rollup/rollup-linux-loong64-gnu': 4.52.3
+ '@rollup/rollup-linux-ppc64-gnu': 4.52.3
+ '@rollup/rollup-linux-riscv64-gnu': 4.52.3
+ '@rollup/rollup-linux-riscv64-musl': 4.52.3
+ '@rollup/rollup-linux-s390x-gnu': 4.52.3
+ '@rollup/rollup-linux-x64-gnu': 4.52.3
+ '@rollup/rollup-linux-x64-musl': 4.52.3
+ '@rollup/rollup-openharmony-arm64': 4.52.3
+ '@rollup/rollup-win32-arm64-msvc': 4.52.3
+ '@rollup/rollup-win32-ia32-msvc': 4.52.3
+ '@rollup/rollup-win32-x64-gnu': 4.52.3
+ '@rollup/rollup-win32-x64-msvc': 4.52.3
+ fsevents: 2.3.3
+
+ run-applescript@7.1.0: {}
+
+ run-async@2.4.1: {}
+
+ run-parallel@1.2.0:
+ dependencies:
+ queue-microtask: 1.2.3
+
+ rxjs@7.8.2:
+ dependencies:
+ tslib: 2.8.1
+
+ safe-buffer@5.2.1: {}
+
+ safer-buffer@2.1.2: {}
+
+ sass@1.93.2:
+ dependencies:
+ chokidar: 4.0.3
+ immutable: 5.1.3
+ source-map-js: 1.2.1
+ optionalDependencies:
+ '@parcel/watcher': 2.5.1
+
+ scroll-into-view-if-needed@2.2.31:
+ dependencies:
+ compute-scroll-into-view: 1.0.20
+
+ scule@1.3.0: {}
+
+ semver@6.3.1: {}
+
+ semver@7.7.2: {}
+
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ signal-exit@3.0.7: {}
+
+ signal-exit@4.1.0: {}
+
+ sirv@3.0.2:
+ dependencies:
+ '@polka/url': 1.0.0-next.29
+ mrmime: 2.0.1
+ totalist: 3.0.1
+
+ slash@3.0.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.3
+ is-fullwidth-code-point: 4.0.0
+
+ slice-ansi@7.1.2:
+ dependencies:
+ ansi-styles: 6.2.3
+ is-fullwidth-code-point: 5.1.0
+
+ snabbdom@3.6.2: {}
+
+ source-map-js@1.2.1: {}
+
+ source-map-support@0.5.21:
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+
+ source-map@0.6.1: {}
+
+ source-map@0.7.6: {}
+
+ spark-md5@3.0.2: {}
+
+ speakingurl@14.0.1: {}
+
+ split2@4.2.0: {}
+
+ ssf@0.11.2:
+ dependencies:
+ frac: 1.1.2
+
+ ssr-window@3.0.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@7.2.0:
+ dependencies:
+ emoji-regex: 10.5.0
+ get-east-asian-width: 1.4.0
+ strip-ansi: 7.1.2
+
+ string_decoder@1.3.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ strip-ansi@6.0.1:
+ dependencies:
+ ansi-regex: 5.0.1
+
+ strip-ansi@7.1.2:
+ dependencies:
+ ansi-regex: 6.2.2
+
+ strip-bom@4.0.0: {}
+
+ strip-final-newline@3.0.0: {}
+
+ strip-final-newline@4.0.0: {}
+
+ strip-json-comments@3.1.1: {}
+
+ strip-literal@3.1.0:
+ dependencies:
+ js-tokens: 9.0.1
+
+ stylelint-config-html@1.1.0(postcss-html@1.8.0)(stylelint@16.24.0(typescript@5.6.3)):
+ dependencies:
+ postcss-html: 1.8.0
+ stylelint: 16.24.0(typescript@5.6.3)
+
+ stylelint-config-recess-order@4.6.0(stylelint@16.24.0(typescript@5.6.3)):
+ dependencies:
+ stylelint: 16.24.0(typescript@5.6.3)
+ stylelint-order: 6.0.4(stylelint@16.24.0(typescript@5.6.3))
+
+ stylelint-config-recommended-scss@14.1.0(postcss@8.5.6)(stylelint@16.24.0(typescript@5.6.3)):
+ dependencies:
+ postcss-scss: 4.0.9(postcss@8.5.6)
+ stylelint: 16.24.0(typescript@5.6.3)
+ stylelint-config-recommended: 14.0.1(stylelint@16.24.0(typescript@5.6.3))
+ stylelint-scss: 6.12.1(stylelint@16.24.0(typescript@5.6.3))
+ optionalDependencies:
+ postcss: 8.5.6
+
+ stylelint-config-recommended-vue@1.6.1(postcss-html@1.8.0)(stylelint@16.24.0(typescript@5.6.3)):
+ dependencies:
+ postcss-html: 1.8.0
+ semver: 7.7.2
+ stylelint: 16.24.0(typescript@5.6.3)
+ stylelint-config-html: 1.1.0(postcss-html@1.8.0)(stylelint@16.24.0(typescript@5.6.3))
+ stylelint-config-recommended: 17.0.0(stylelint@16.24.0(typescript@5.6.3))
+
+ stylelint-config-recommended@14.0.1(stylelint@16.24.0(typescript@5.6.3)):
+ dependencies:
+ stylelint: 16.24.0(typescript@5.6.3)
+
+ stylelint-config-recommended@17.0.0(stylelint@16.24.0(typescript@5.6.3)):
+ dependencies:
+ stylelint: 16.24.0(typescript@5.6.3)
+
+ stylelint-config-standard@36.0.1(stylelint@16.24.0(typescript@5.6.3)):
+ dependencies:
+ stylelint: 16.24.0(typescript@5.6.3)
+ stylelint-config-recommended: 14.0.1(stylelint@16.24.0(typescript@5.6.3))
+
+ stylelint-order@6.0.4(stylelint@16.24.0(typescript@5.6.3)):
+ dependencies:
+ postcss: 8.5.6
+ postcss-sorting: 8.0.2(postcss@8.5.6)
+ stylelint: 16.24.0(typescript@5.6.3)
+
+ stylelint-scss@6.12.1(stylelint@16.24.0(typescript@5.6.3)):
+ dependencies:
+ css-tree: 3.1.0
+ is-plain-object: 5.0.0
+ known-css-properties: 0.36.0
+ mdn-data: 2.24.0
+ postcss-media-query-parser: 0.2.3
+ postcss-resolve-nested-selector: 0.1.6
+ postcss-selector-parser: 7.1.0
+ postcss-value-parser: 4.2.0
+ stylelint: 16.24.0(typescript@5.6.3)
+
+ stylelint@16.24.0(typescript@5.6.3):
+ dependencies:
+ '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
+ '@csstools/css-tokenizer': 3.0.4
+ '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
+ '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0)
+ '@dual-bundle/import-meta-resolve': 4.2.1
+ balanced-match: 2.0.0
+ colord: 2.9.3
+ cosmiconfig: 9.0.0(typescript@5.6.3)
+ css-functions-list: 3.2.3
+ css-tree: 3.1.0
+ debug: 4.4.3
+ fast-glob: 3.3.3
+ fastest-levenshtein: 1.0.16
+ file-entry-cache: 10.1.4
+ global-modules: 2.0.0
+ globby: 11.1.0
+ globjoin: 0.1.4
+ html-tags: 3.3.1
+ ignore: 7.0.5
+ imurmurhash: 0.1.4
+ is-plain-object: 5.0.0
+ known-css-properties: 0.37.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.5.6
+ postcss-resolve-nested-selector: 0.1.6
+ postcss-safe-parser: 7.0.1(postcss@8.5.6)
+ postcss-selector-parser: 7.1.0
+ postcss-value-parser: 4.2.0
+ resolve-from: 5.0.0
+ string-width: 4.2.3
+ supports-hyperlinks: 3.2.0
+ svg-tags: 1.0.0
+ table: 6.9.0
+ write-file-atomic: 5.0.1
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ superjson@2.2.2:
+ dependencies:
+ copy-anything: 3.0.5
+
+ supports-color@5.5.0:
+ dependencies:
+ has-flag: 3.0.0
+
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
+ supports-hyperlinks@3.2.0:
+ dependencies:
+ has-flag: 4.0.0
+ supports-color: 7.2.0
+
+ svg-tags@1.0.0: {}
+
+ synckit@0.11.11:
+ dependencies:
+ '@pkgr/core': 0.2.9
+
+ 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
+
+ tailwindcss@4.1.14: {}
+
+ tapable@2.3.0: {}
+
+ tar@7.5.1:
+ dependencies:
+ '@isaacs/fs-minipass': 4.0.1
+ chownr: 3.0.0
+ minipass: 7.1.2
+ minizlib: 3.1.0
+ yallist: 5.0.0
+
+ terser@5.44.0:
+ dependencies:
+ '@jridgewell/source-map': 0.3.11
+ acorn: 8.15.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@1.0.1: {}
+
+ tinyglobby@0.2.15:
+ dependencies:
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
+
+ tmp@0.0.33:
+ dependencies:
+ os-tmpdir: 1.0.2
+
+ to-regex-range@5.0.1:
+ dependencies:
+ is-number: 7.0.0
+
+ totalist@3.0.1: {}
+
+ ts-api-utils@2.1.0(typescript@5.6.3):
+ dependencies:
+ typescript: 5.6.3
+
+ tslib@2.3.0: {}
+
+ tslib@2.8.1: {}
+
+ tsx@4.20.6:
+ dependencies:
+ esbuild: 0.25.10
+ get-tsconfig: 4.10.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: {}
+
+ typescript-eslint@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.6.3):
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.6.3))(eslint@9.36.0(jiti@2.6.0))(typescript@5.6.3)
+ '@typescript-eslint/parser': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.6.3)
+ '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.6.3)
+ '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.6.3)
+ eslint: 9.36.0(jiti@2.6.0)
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ typescript@5.6.3: {}
+
+ ufo@1.6.1: {}
+
+ undici-types@7.14.0: {}
+
+ unicorn-magic@0.1.0: {}
+
+ unicorn-magic@0.3.0: {}
+
+ unimport@5.4.0:
+ dependencies:
+ acorn: 8.15.0
+ escape-string-regexp: 5.0.0
+ estree-walker: 3.0.3
+ local-pkg: 1.1.2
+ magic-string: 0.30.19
+ mlly: 1.8.0
+ pathe: 2.0.3
+ picomatch: 4.0.3
+ pkg-types: 2.3.0
+ scule: 1.3.0
+ strip-literal: 3.1.0
+ tinyglobby: 0.2.15
+ unplugin: 2.3.10
+ unplugin-utils: 0.3.0
+
+ universalify@2.0.1: {}
+
+ unplugin-auto-import@20.2.0(@vueuse/core@13.9.0(vue@3.5.22(typescript@5.6.3))):
+ dependencies:
+ local-pkg: 1.1.2
+ magic-string: 0.30.19
+ picomatch: 4.0.3
+ unimport: 5.4.0
+ unplugin: 2.3.10
+ unplugin-utils: 0.3.0
+ optionalDependencies:
+ '@vueuse/core': 13.9.0(vue@3.5.22(typescript@5.6.3))
+
+ unplugin-element-plus@0.10.0:
+ dependencies:
+ es-module-lexer: 1.7.0
+ magic-string: 0.30.19
+ unplugin: 2.3.10
+ unplugin-utils: 0.2.5
+
+ unplugin-utils@0.2.5:
+ dependencies:
+ pathe: 2.0.3
+ picomatch: 4.0.3
+
+ unplugin-utils@0.3.0:
+ dependencies:
+ pathe: 2.0.3
+ picomatch: 4.0.3
+
+ unplugin-vue-components@29.1.0(@babel/parser@7.28.4)(vue@3.5.22(typescript@5.6.3)):
+ dependencies:
+ chokidar: 3.6.0
+ debug: 4.4.3
+ local-pkg: 1.1.2
+ magic-string: 0.30.19
+ mlly: 1.8.0
+ tinyglobby: 0.2.15
+ unplugin: 2.3.10
+ unplugin-utils: 0.3.0
+ vue: 3.5.22(typescript@5.6.3)
+ optionalDependencies:
+ '@babel/parser': 7.28.4
+ transitivePeerDependencies:
+ - supports-color
+
+ unplugin@2.3.10:
+ dependencies:
+ '@jridgewell/remapping': 2.3.5
+ acorn: 8.15.0
+ picomatch: 4.0.3
+ webpack-virtual-modules: 0.6.2
+
+ update-browserslist-db@1.1.3(browserslist@4.26.2):
+ dependencies:
+ browserslist: 4.26.2
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
+ uri-js@4.4.1:
+ dependencies:
+ punycode: 2.3.1
+
+ util-deprecate@1.0.2: {}
+
+ vite-hot-client@2.1.0(vite@7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)):
+ dependencies:
+ vite: 7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
+
+ vite-plugin-compression@0.5.1(vite@7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)):
+ dependencies:
+ chalk: 4.1.2
+ debug: 4.4.3
+ fs-extra: 10.1.0
+ vite: 7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
+ transitivePeerDependencies:
+ - supports-color
+
+ vite-plugin-inspect@0.8.9(rollup@4.52.3)(vite@7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)):
+ dependencies:
+ '@antfu/utils': 0.7.10
+ '@rollup/pluginutils': 5.3.0(rollup@4.52.3)
+ debug: 4.4.3
+ error-stack-parser-es: 0.1.5
+ fs-extra: 11.3.2
+ open: 10.2.0
+ perfect-debounce: 1.0.0
+ picocolors: 1.1.1
+ sirv: 3.0.2
+ vite: 7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
+ transitivePeerDependencies:
+ - rollup
+ - supports-color
+
+ vite-plugin-vue-devtools@7.7.7(rollup@4.52.3)(vite@7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.6.3)):
+ dependencies:
+ '@vue/devtools-core': 7.7.7(vite@7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.6.3))
+ '@vue/devtools-kit': 7.7.7
+ '@vue/devtools-shared': 7.7.7
+ execa: 9.6.0
+ sirv: 3.0.2
+ vite: 7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
+ vite-plugin-inspect: 0.8.9(rollup@4.52.3)(vite@7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
+ vite-plugin-vue-inspector: 5.3.2(vite@7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
+ transitivePeerDependencies:
+ - '@nuxt/kit'
+ - rollup
+ - supports-color
+ - vue
+
+ vite-plugin-vue-inspector@5.3.2(vite@7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)):
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.4)
+ '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.4)
+ '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.4)
+ '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.4)
+ '@vue/compiler-dom': 3.5.22
+ kolorist: 1.8.0
+ magic-string: 0.30.19
+ vite: 7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
+ transitivePeerDependencies:
+ - supports-color
+
+ vite@7.1.7(@types/node@24.8.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1):
+ dependencies:
+ esbuild: 0.25.10
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
+ postcss: 8.5.6
+ rollup: 4.52.3
+ tinyglobby: 0.2.15
+ optionalDependencies:
+ '@types/node': 24.8.1
+ fsevents: 2.3.3
+ jiti: 2.6.0
+ lightningcss: 1.30.1
+ sass: 1.93.2
+ terser: 5.44.0
+ tsx: 4.20.6
+ yaml: 2.8.1
+
+ vscode-uri@3.1.0: {}
+
+ vue-demi@0.14.10(vue@3.5.22(typescript@5.6.3)):
+ dependencies:
+ vue: 3.5.22(typescript@5.6.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.36.0(jiti@2.6.0)):
+ dependencies:
+ debug: 4.4.3
+ eslint: 9.36.0(jiti@2.6.0)
+ 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.7.2
+ transitivePeerDependencies:
+ - supports-color
+
+ vue-i18n@9.14.5(vue@3.5.22(typescript@5.6.3)):
+ dependencies:
+ '@intlify/core-base': 9.14.5
+ '@intlify/shared': 9.14.5
+ '@vue/devtools-api': 6.6.4
+ vue: 3.5.22(typescript@5.6.3)
+
+ vue-img-cutter@3.0.7(typescript@5.6.3):
+ dependencies:
+ core-js: 3.45.1
+ vue: 3.5.22(typescript@5.6.3)
+ vue-i18n: 9.14.5(vue@3.5.22(typescript@5.6.3))
+ transitivePeerDependencies:
+ - typescript
+
+ vue-router@4.5.1(vue@3.5.22(typescript@5.6.3)):
+ dependencies:
+ '@vue/devtools-api': 6.6.4
+ vue: 3.5.22(typescript@5.6.3)
+
+ vue-tsc@2.1.10(typescript@5.6.3):
+ dependencies:
+ '@volar/typescript': 2.4.23
+ '@vue/language-core': 2.1.10(typescript@5.6.3)
+ semver: 7.7.2
+ typescript: 5.6.3
+
+ vue@3.5.22(typescript@5.6.3):
+ dependencies:
+ '@vue/compiler-dom': 3.5.22
+ '@vue/compiler-sfc': 3.5.22
+ '@vue/runtime-dom': 3.5.22
+ '@vue/server-renderer': 3.5.22(vue@3.5.22(typescript@5.6.3))
+ '@vue/shared': 3.5.22
+ optionalDependencies:
+ typescript: 5.6.3
+
+ wcwidth@1.0.1:
+ dependencies:
+ defaults: 1.0.4
+
+ webpack-virtual-modules@0.6.2: {}
+
+ which@1.3.1:
+ dependencies:
+ isexe: 2.0.0
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ wildcard@1.1.2: {}
+
+ wmf@1.0.2: {}
+
+ word-wrap@1.2.5: {}
+
+ word@0.3.0: {}
+
+ wrap-ansi@7.0.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ wrap-ansi@9.0.2:
+ dependencies:
+ ansi-styles: 6.2.3
+ string-width: 7.2.0
+ strip-ansi: 7.1.2
+
+ wrappy@1.0.2: {}
+
+ write-file-atomic@5.0.1:
+ dependencies:
+ imurmurhash: 0.1.4
+ signal-exit: 4.1.0
+
+ wsl-utils@0.1.0:
+ dependencies:
+ is-wsl: 3.1.0
+
+ xgplayer-subtitles@3.0.23(core-js@3.45.1):
+ dependencies:
+ core-js: 3.45.1
+ eventemitter3: 4.0.7
+
+ xgplayer@3.0.23(core-js@3.45.1):
+ dependencies:
+ core-js: 3.45.1
+ danmu.js: 1.1.13
+ delegate: 3.2.0
+ downloadjs: 1.4.7
+ eventemitter3: 4.0.7
+ xgplayer-subtitles: 3.0.23(core-js@3.45.1)
+
+ xlsx@0.18.5:
+ dependencies:
+ adler-32: 1.3.1
+ cfb: 1.2.2
+ codepage: 1.15.0
+ crc-32: 1.2.2
+ ssf: 0.11.2
+ wmf: 1.0.2
+ word: 0.3.0
+
+ xml-name-validator@4.0.0: {}
+
+ y18n@5.0.8: {}
+
+ yallist@3.1.1: {}
+
+ yallist@5.0.0: {}
+
+ yaml@2.8.1: {}
+
+ yargs-parser@21.1.1: {}
+
+ yargs@17.7.2:
+ dependencies:
+ cliui: 8.0.1
+ escalade: 3.2.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 21.1.1
+
+ yocto-queue@0.1.0: {}
+
+ yocto-queue@1.2.1: {}
+
+ yoctocolors@2.1.2: {}
+
+ zrender@6.0.0:
+ dependencies:
+ tslib: 2.3.0
diff --git a/saiadmin-artd/public/favicon.ico b/saiadmin-artd/public/favicon.ico
new file mode 100644
index 0000000..df36fcf
Binary files /dev/null and b/saiadmin-artd/public/favicon.ico differ
diff --git a/saiadmin-artd/scripts/clean-dev.ts b/saiadmin-artd/scripts/clean-dev.ts
new file mode 100644
index 0000000..cc0b9bc
--- /dev/null
+++ b/saiadmin-artd/scripts/clean-dev.ts
@@ -0,0 +1,838 @@
+// scripts/clean-dev.ts
+import fs from 'fs/promises'
+import path from 'path'
+
+// 现代化颜色主题
+const theme = {
+ // 基础颜色
+ reset: '\x1b[0m',
+ bold: '\x1b[1m',
+ dim: '\x1b[2m',
+
+ // 前景色
+ primary: '\x1b[38;5;75m', // 亮蓝色
+ success: '\x1b[38;5;82m', // 亮绿色
+ warning: '\x1b[38;5;220m', // 亮黄色
+ error: '\x1b[38;5;196m', // 亮红色
+ info: '\x1b[38;5;159m', // 青色
+ purple: '\x1b[38;5;141m', // 紫色
+ orange: '\x1b[38;5;208m', // 橙色
+ gray: '\x1b[38;5;245m', // 灰色
+ white: '\x1b[38;5;255m', // 白色
+
+ // 背景色
+ bgDark: '\x1b[48;5;235m', // 深灰背景
+ bgBlue: '\x1b[48;5;24m', // 蓝色背景
+ bgGreen: '\x1b[48;5;22m', // 绿色背景
+ bgRed: '\x1b[48;5;52m' // 红色背景
+}
+
+// 现代化图标集
+const icons = {
+ rocket: '🚀',
+ fire: '🔥',
+ star: '⭐',
+ gem: '💎',
+ crown: '👑',
+ magic: '✨',
+ warning: '⚠️',
+ success: '✅',
+ error: '❌',
+ info: 'ℹ️',
+ folder: '📁',
+ file: '📄',
+ image: '🖼️',
+ code: '💻',
+ data: '📊',
+ globe: '🌐',
+ map: '🗺️',
+ chat: '💬',
+ bolt: '⚡',
+ shield: '🛡️',
+ key: '🔑',
+ link: '🔗',
+ clean: '🧹',
+ trash: '🗑️',
+ check: '✓',
+ cross: '✗',
+ arrow: '→',
+ loading: '⏳'
+}
+
+// 格式化工具
+const fmt = {
+ title: (text: string) => `${theme.bold}${theme.primary}${text}${theme.reset}`,
+ subtitle: (text: string) => `${theme.purple}${text}${theme.reset}`,
+ success: (text: string) => `${theme.success}${text}${theme.reset}`,
+ error: (text: string) => `${theme.error}${text}${theme.reset}`,
+ warning: (text: string) => `${theme.warning}${text}${theme.reset}`,
+ info: (text: string) => `${theme.info}${text}${theme.reset}`,
+ highlight: (text: string) => `${theme.bold}${theme.white}${text}${theme.reset}`,
+ dim: (text: string) => `${theme.dim}${theme.gray}${text}${theme.reset}`,
+ orange: (text: string) => `${theme.orange}${text}${theme.reset}`,
+
+ // 带背景的文本
+ badge: (text: string, bg: string = theme.bgBlue) =>
+ `${bg}${theme.white}${theme.bold} ${text} ${theme.reset}`,
+
+ // 渐变效果模拟
+ gradient: (text: string) => {
+ const colors = ['\x1b[38;5;75m', '\x1b[38;5;81m', '\x1b[38;5;87m', '\x1b[38;5;159m']
+ const chars = text.split('')
+ return chars.map((char, i) => `${colors[i % colors.length]}${char}`).join('') + theme.reset
+ }
+}
+
+// 创建现代化标题横幅
+function createModernBanner() {
+ console.log()
+ console.log(
+ fmt.gradient(' ╔══════════════════════════════════════════════════════════════════╗')
+ )
+ console.log(
+ fmt.gradient(' ║ ║')
+ )
+ console.log(
+ ` ║ ${icons.rocket} ${fmt.title('ART DESIGN PRO')} ${fmt.subtitle('· 代码精简程序')} ${icons.magic} ║`
+ )
+ console.log(
+ ` ║ ${fmt.dim('为项目移除演示数据,快速切换至开发模式')} ║`
+ )
+ console.log(
+ fmt.gradient(' ║ ║')
+ )
+ console.log(
+ fmt.gradient(' ╚══════════════════════════════════════════════════════════════════╝')
+ )
+ console.log()
+}
+
+// 创建分割线
+function createDivider(char = '─', color = theme.primary) {
+ console.log(`${color}${' ' + char.repeat(66)}${theme.reset}`)
+}
+
+// 创建卡片样式容器
+function createCard(title: string, content: string[]) {
+ console.log(` ${fmt.badge('', theme.bgBlue)} ${fmt.title(title)}`)
+ console.log()
+ content.forEach((line) => {
+ console.log(` ${line}`)
+ })
+ console.log()
+}
+
+// 进度条动画
+function createProgressBar(current: number, total: number, text: string, width = 40) {
+ const percentage = Math.round((current / total) * 100)
+ const filled = Math.round((current / total) * width)
+ const empty = width - filled
+
+ const filledBar = '█'.repeat(filled)
+ const emptyBar = '░'.repeat(empty)
+
+ process.stdout.write(
+ `\r ${fmt.info('进度')} [${theme.success}${filledBar}${theme.gray}${emptyBar}${theme.reset}] ${fmt.highlight(percentage + '%')})}`
+ )
+
+ if (current === total) {
+ console.log()
+ }
+}
+
+// 统计信息
+const stats = {
+ deletedFiles: 0,
+ deletedPaths: 0,
+ failedPaths: 0,
+ startTime: Date.now(),
+ totalFiles: 0
+}
+
+// 清理目标
+const targets = [
+ 'README.md',
+ 'README.zh-CN.md',
+ 'CHANGELOG.md',
+ 'CHANGELOG.zh-CN.md',
+ 'src/views/change',
+ 'src/views/safeguard',
+ 'src/views/article',
+ 'src/views/examples',
+ 'src/views/system/nested',
+ 'src/views/widgets',
+ 'src/views/template',
+ 'src/views/dashboard/analysis',
+ 'src/views/dashboard/ecommerce',
+ 'src/mock/json',
+ 'src/mock/temp/articleList.ts',
+ 'src/mock/temp/commentDetail.ts',
+ 'src/mock/temp/commentList.ts',
+ 'src/assets/images/cover',
+ 'src/assets/images/safeguard',
+ 'src/assets/images/3d',
+ 'src/components/core/charts/art-map-chart',
+ 'src/components/business/comment-widget'
+]
+
+// 递归统计文件数量
+async function countFiles(targetPath: string): Promise {
+ const fullPath = path.resolve(process.cwd(), targetPath)
+
+ try {
+ const stat = await fs.stat(fullPath)
+
+ if (stat.isFile()) {
+ return 1
+ } else if (stat.isDirectory()) {
+ const entries = await fs.readdir(fullPath)
+ let count = 0
+
+ for (const entry of entries) {
+ const entryPath = path.join(targetPath, entry)
+ count += await countFiles(entryPath)
+ }
+
+ return count
+ }
+ } catch {
+ return 0
+ }
+
+ return 0
+}
+
+// 统计所有目标的文件数量
+async function countAllFiles(): Promise {
+ let totalCount = 0
+
+ for (const target of targets) {
+ const count = await countFiles(target)
+ totalCount += count
+ }
+
+ return totalCount
+}
+
+// 删除文件和目录
+async function remove(targetPath: string, index: number) {
+ const fullPath = path.resolve(process.cwd(), targetPath)
+
+ createProgressBar(index + 1, targets.length, targetPath)
+
+ try {
+ const fileCount = await countFiles(targetPath)
+ await fs.rm(fullPath, { recursive: true, force: true })
+ stats.deletedFiles += fileCount
+ stats.deletedPaths++
+ await new Promise((resolve) => setTimeout(resolve, 50))
+ } catch (err) {
+ stats.failedPaths++
+ console.log()
+ console.log(` ${icons.error} ${fmt.error('删除失败')}: ${fmt.highlight(targetPath)}`)
+ console.log(` ${fmt.dim('错误详情: ' + err)}`)
+ }
+}
+
+// 清理路由模块
+async function cleanRouteModules() {
+ const modulesPath = path.resolve(process.cwd(), 'src/router/modules')
+
+ try {
+ // 删除演示相关的路由模块
+ const modulesToRemove = [
+ 'template.ts',
+ 'widgets.ts',
+ 'examples.ts',
+ 'article.ts',
+ 'safeguard.ts',
+ 'help.ts'
+ ]
+
+ for (const module of modulesToRemove) {
+ const modulePath = path.join(modulesPath, module)
+ try {
+ await fs.rm(modulePath, { force: true })
+ } catch {
+ // 文件不存在时忽略错误
+ }
+ }
+
+ // 重写 dashboard.ts - 只保留 console
+ const dashboardContent = `import { AppRouteRecord } from '@/types/router'
+
+export const dashboardRoutes: AppRouteRecord = {
+ name: 'Dashboard',
+ path: '/dashboard',
+ component: '/index/index',
+ meta: {
+ title: 'menus.dashboard.title',
+ icon: 'ri:pie-chart-line',
+ roles: ['R_SUPER', 'R_ADMIN']
+ },
+ children: [
+ {
+ path: 'console',
+ name: 'Console',
+ component: '/dashboard/console',
+ meta: {
+ title: 'menus.dashboard.console',
+ keepAlive: false,
+ fixedTab: true
+ }
+ }
+ ]
+}
+`
+ await fs.writeFile(path.join(modulesPath, 'dashboard.ts'), dashboardContent, 'utf-8')
+
+ // 重写 system.ts - 移除 nested 嵌套菜单
+ const systemContent = `import { AppRouteRecord } from '@/types/router'
+
+export const systemRoutes: AppRouteRecord = {
+ path: '/system',
+ name: 'System',
+ component: '/index/index',
+ meta: {
+ title: 'menus.system.title',
+ icon: 'ri:user-3-line',
+ roles: ['R_SUPER', 'R_ADMIN']
+ },
+ children: [
+ {
+ path: 'user',
+ name: 'User',
+ component: '/system/user',
+ meta: {
+ title: 'menus.system.user',
+ keepAlive: true,
+ roles: ['R_SUPER', 'R_ADMIN']
+ }
+ },
+ {
+ path: 'role',
+ name: 'Role',
+ component: '/system/role',
+ meta: {
+ title: 'menus.system.role',
+ keepAlive: true,
+ roles: ['R_SUPER']
+ }
+ },
+ {
+ path: 'user-center',
+ name: 'UserCenter',
+ component: '/system/user-center',
+ meta: {
+ title: 'menus.system.userCenter',
+ isHide: true,
+ keepAlive: true,
+ isHideTab: true
+ }
+ },
+ {
+ path: 'menu',
+ name: 'Menus',
+ component: '/system/menu',
+ meta: {
+ title: 'menus.system.menu',
+ keepAlive: true,
+ roles: ['R_SUPER'],
+ authList: [
+ { title: '新增', authMark: 'add' },
+ { title: '编辑', authMark: 'edit' },
+ { title: '删除', authMark: 'delete' }
+ ]
+ }
+ }
+ ]
+}
+`
+ await fs.writeFile(path.join(modulesPath, 'system.ts'), systemContent, 'utf-8')
+
+ // 重写 index.ts - 只导入保留的模块
+ const indexContent = `import { AppRouteRecord } from '@/types/router'
+import { dashboardRoutes } from './dashboard'
+import { systemRoutes } from './system'
+import { resultRoutes } from './result'
+import { exceptionRoutes } from './exception'
+
+/**
+ * 导出所有模块化路由
+ */
+export const routeModules: AppRouteRecord[] = [
+ dashboardRoutes,
+ systemRoutes,
+ resultRoutes,
+ exceptionRoutes
+]
+`
+ await fs.writeFile(path.join(modulesPath, 'index.ts'), indexContent, 'utf-8')
+
+ console.log(` ${icons.success} ${fmt.success('清理路由模块完成')}`)
+ } catch (err) {
+ console.log(` ${icons.error} ${fmt.error('清理路由模块失败')}`)
+ console.log(` ${fmt.dim('错误详情: ' + err)}`)
+ }
+}
+
+// 清理路由别名
+async function cleanRoutesAlias() {
+ const routesAliasPath = path.resolve(process.cwd(), 'src/router/routesAlias.ts')
+
+ try {
+ const cleanedAlias = `/**
+ * 公共路由别名
+ # 存放系统级公共路由路径,如布局容器、登录页等
+ */
+export enum RoutesAlias {
+ Layout = '/index/index', // 布局容器
+ Login = '/auth/login' // 登录页
+}
+`
+
+ await fs.writeFile(routesAliasPath, cleanedAlias, 'utf-8')
+ console.log(` ${icons.success} ${fmt.success('重写路由别名配置完成')}`)
+ } catch (err) {
+ console.log(` ${icons.error} ${fmt.error('清理路由别名失败')}`)
+ console.log(` ${fmt.dim('错误详情: ' + err)}`)
+ }
+}
+
+// 清理变更日志
+async function cleanChangeLog() {
+ const changeLogPath = path.resolve(process.cwd(), 'src/mock/upgrade/changeLog.ts')
+
+ try {
+ const cleanedChangeLog = `import { ref } from 'vue'
+
+interface UpgradeLog {
+ version: string // 版本号
+ title: string // 更新标题
+ date: string // 更新日期
+ detail?: string[] // 更新内容
+ requireReLogin?: boolean // 是否需要重新登录
+ remark?: string // 备注
+}
+
+export const upgradeLogList = ref([])
+`
+
+ await fs.writeFile(changeLogPath, cleanedChangeLog, 'utf-8')
+ console.log(` ${icons.success} ${fmt.success('清空变更日志数据完成')}`)
+ } catch (err) {
+ console.log(` ${icons.error} ${fmt.error('清理变更日志失败')}`)
+ console.log(` ${fmt.dim('错误详情: ' + err)}`)
+ }
+}
+
+// 清理语言文件
+async function cleanLanguageFiles() {
+ const languageFiles = [
+ { path: 'src/locales/langs/zh.json', name: '中文语言文件' },
+ { path: 'src/locales/langs/en.json', name: '英文语言文件' }
+ ]
+
+ for (const { path: langPath, name } of languageFiles) {
+ try {
+ const fullPath = path.resolve(process.cwd(), langPath)
+ const content = await fs.readFile(fullPath, 'utf-8')
+ const langData = JSON.parse(content)
+
+ const menusToRemove = [
+ 'widgets',
+ 'template',
+ 'article',
+ 'examples',
+ 'safeguard',
+ 'plan',
+ 'help'
+ ]
+
+ if (langData.menus) {
+ menusToRemove.forEach((menuKey) => {
+ if (langData.menus[menuKey]) {
+ delete langData.menus[menuKey]
+ }
+ })
+
+ if (langData.menus.dashboard) {
+ if (langData.menus.dashboard.analysis) {
+ delete langData.menus.dashboard.analysis
+ }
+ if (langData.menus.dashboard.ecommerce) {
+ delete langData.menus.dashboard.ecommerce
+ }
+ }
+
+ if (langData.menus.system) {
+ const systemKeysToRemove = [
+ 'nested',
+ 'menu1',
+ 'menu2',
+ 'menu21',
+ 'menu3',
+ 'menu31',
+ 'menu32',
+ 'menu321'
+ ]
+ systemKeysToRemove.forEach((key) => {
+ if (langData.menus.system[key]) {
+ delete langData.menus.system[key]
+ }
+ })
+ }
+ }
+
+ await fs.writeFile(fullPath, JSON.stringify(langData, null, 2), 'utf-8')
+ console.log(` ${icons.success} ${fmt.success(`清理${name}完成`)}`)
+ } catch (err) {
+ console.log(` ${icons.error} ${fmt.error(`清理${name}失败`)}`)
+ console.log(` ${fmt.dim('错误详情: ' + err)}`)
+ }
+ }
+}
+
+// 清理快速入口组件
+async function cleanFastEnterComponent() {
+ const fastEnterPath = path.resolve(process.cwd(), 'src/config/fastEnter.ts')
+
+ try {
+ const cleanedFastEnter = `/**
+ * 快速入口配置
+ * 包含:应用列表、快速链接等配置
+ */
+import { WEB_LINKS } from '@/utils/constants'
+import type { FastEnterConfig } from '@/types/config'
+
+const fastEnterConfig: FastEnterConfig = {
+ // 显示条件(屏幕宽度)
+ minWidth: 1200,
+ // 应用列表
+ applications: [
+ {
+ name: '工作台',
+ description: '系统概览与数据统计',
+ icon: 'ri:pie-chart-line',
+ iconColor: '#377dff',
+ enabled: true,
+ order: 1,
+ routeName: 'Console'
+ },
+ {
+ name: '官方文档',
+ description: '使用指南与开发文档',
+ icon: 'ri:bill-line',
+ iconColor: '#ffb100',
+ enabled: true,
+ order: 2,
+ link: WEB_LINKS.DOCS
+ },
+ {
+ name: '技术支持',
+ description: '技术支持与问题反馈',
+ icon: 'ri:user-location-line',
+ iconColor: '#ff6b6b',
+ enabled: true,
+ order: 3,
+ link: WEB_LINKS.COMMUNITY
+ },
+ {
+ name: '哔哩哔哩',
+ description: '技术分享与交流',
+ icon: 'ri:bilibili-line',
+ iconColor: '#FB7299',
+ enabled: true,
+ order: 4,
+ link: WEB_LINKS.BILIBILI
+ }
+ ],
+ // 快速链接
+ quickLinks: [
+ {
+ name: '登录',
+ enabled: true,
+ order: 1,
+ routeName: 'Login'
+ },
+ {
+ name: '注册',
+ enabled: true,
+ order: 2,
+ routeName: 'Register'
+ },
+ {
+ name: '忘记密码',
+ enabled: true,
+ order: 3,
+ routeName: 'ForgetPassword'
+ },
+ {
+ name: '个人中心',
+ enabled: true,
+ order: 4,
+ routeName: 'UserCenter'
+ }
+ ]
+}
+
+export default Object.freeze(fastEnterConfig)
+`
+
+ await fs.writeFile(fastEnterPath, cleanedFastEnter, 'utf-8')
+ console.log(` ${icons.success} ${fmt.success('清理快速入口配置完成')}`)
+ } catch (err) {
+ console.log(` ${icons.error} ${fmt.error('清理快速入口配置失败')}`)
+ console.log(` ${fmt.dim('错误详情: ' + err)}`)
+ }
+}
+
+// 更新菜单接口
+async function updateMenuApi() {
+ const apiPath = path.resolve(process.cwd(), 'src/api/system-manage.ts')
+
+ try {
+ const content = await fs.readFile(apiPath, 'utf-8')
+ const updatedContent = content.replace(
+ "url: '/api/v3/system/menus'",
+ "url: '/api/v3/system/menus/simple'"
+ )
+
+ await fs.writeFile(apiPath, updatedContent, 'utf-8')
+ console.log(` ${icons.success} ${fmt.success('更新菜单接口完成')}`)
+ } catch (err) {
+ console.log(` ${icons.error} ${fmt.error('更新菜单接口失败')}`)
+ console.log(` ${fmt.dim('错误详情: ' + err)}`)
+ }
+}
+
+// 用户确认函数
+async function getUserConfirmation(): Promise {
+ const { createInterface } = await import('readline')
+
+ return new Promise((resolve) => {
+ const rl = createInterface({
+ input: process.stdin,
+ output: process.stdout
+ })
+
+ console.log(
+ ` ${fmt.highlight('请输入')} ${fmt.success('yes')} ${fmt.highlight('确认执行清理操作,或按 Enter 取消')}`
+ )
+ console.log()
+ process.stdout.write(` ${icons.arrow} `)
+
+ rl.question('', (answer: string) => {
+ rl.close()
+ resolve(answer.toLowerCase().trim() === 'yes')
+ })
+ })
+}
+
+// 显示清理警告
+async function showCleanupWarning() {
+ createCard('安全警告', [
+ `${fmt.warning('此操作将永久删除以下演示内容,且无法恢复!')}`,
+ `${fmt.dim('请仔细阅读清理列表,确认后再继续操作')}`
+ ])
+
+ const cleanupItems = [
+ {
+ icon: icons.image,
+ name: '图片资源',
+ desc: '演示用的封面图片、3D图片、运维图片等',
+ color: theme.orange
+ },
+ {
+ icon: icons.file,
+ name: '演示页面',
+ desc: 'widgets、template、article、examples、safeguard等页面',
+ color: theme.purple
+ },
+ {
+ icon: icons.code,
+ name: '路由模块文件',
+ desc: '删除演示路由模块,只保留核心模块(dashboard、system、result、exception)',
+ color: theme.primary
+ },
+ {
+ icon: icons.link,
+ name: '路由别名',
+ desc: '重写routesAlias.ts,移除演示路由别名',
+ color: theme.info
+ },
+ {
+ icon: icons.data,
+ name: 'Mock数据',
+ desc: '演示用的JSON数据、文章列表、评论数据等',
+ color: theme.success
+ },
+ {
+ icon: icons.globe,
+ name: '多语言文件',
+ desc: '清理中英文语言包中的演示菜单项',
+ color: theme.warning
+ },
+ { icon: icons.map, name: '地图组件', desc: '移除art-map-chart地图组件', color: theme.error },
+ { icon: icons.chat, name: '评论组件', desc: '移除comment-widget评论组件', color: theme.orange },
+ {
+ icon: icons.bolt,
+ name: '快速入口',
+ desc: '移除分析页、礼花效果、聊天、更新日志、定价、留言管理等无效项目',
+ color: theme.purple
+ }
+ ]
+
+ console.log(` ${fmt.badge('', theme.bgRed)} ${fmt.title('将要清理的内容')}`)
+ console.log()
+
+ cleanupItems.forEach((item, index) => {
+ console.log(` ${item.color}${theme.reset} ${fmt.highlight(`${index + 1}. ${item.name}`)}`)
+ console.log(` ${fmt.dim(item.desc)}`)
+ })
+
+ console.log()
+ console.log(` ${fmt.badge('', theme.bgGreen)} ${fmt.title('保留的功能模块')}`)
+ console.log()
+
+ const preservedModules = [
+ { name: 'Dashboard', desc: '工作台页面' },
+ { name: 'System', desc: '系统管理模块' },
+ { name: 'Result', desc: '结果页面' },
+ { name: 'Exception', desc: '异常页面' },
+ { name: 'Auth', desc: '登录注册功能' },
+ { name: 'Core Components', desc: '核心组件库' }
+ ]
+
+ preservedModules.forEach((module) => {
+ console.log(` ${icons.check} ${fmt.success(module.name)} ${fmt.dim(`- ${module.desc}`)}`)
+ })
+
+ console.log()
+ createDivider()
+ console.log()
+}
+
+// 显示统计信息
+async function showStats() {
+ const duration = Date.now() - stats.startTime
+ const seconds = (duration / 1000).toFixed(2)
+
+ console.log()
+ createCard('清理统计', [
+ `${fmt.success('成功删除')}: ${fmt.highlight(stats.deletedFiles.toString())} 个文件`,
+ `${fmt.info('涉及路径')}: ${fmt.highlight(stats.deletedPaths.toString())} 个目录/文件`,
+ ...(stats.failedPaths > 0
+ ? [
+ `${icons.error} ${fmt.error('删除失败')}: ${fmt.highlight(stats.failedPaths.toString())} 个路径`
+ ]
+ : []),
+ `${fmt.info('耗时')}: ${fmt.highlight(seconds)} 秒`
+ ])
+}
+
+// 创建成功横幅
+function createSuccessBanner() {
+ console.log()
+ console.log(
+ fmt.gradient(' ╔══════════════════════════════════════════════════════════════════╗')
+ )
+ console.log(
+ fmt.gradient(' ║ ║')
+ )
+ console.log(
+ ` ║ ${icons.star} ${fmt.success('清理完成!项目已准备就绪')} ${icons.rocket} ║`
+ )
+ console.log(
+ ` ║ ${fmt.dim('现在可以开始您的开发之旅了!')} ║`
+ )
+ console.log(
+ fmt.gradient(' ║ ║')
+ )
+ console.log(
+ fmt.gradient(' ╚══════════════════════════════════════════════════════════════════╝')
+ )
+ console.log()
+}
+
+// 主函数
+async function main() {
+ // 清屏并显示横幅
+ console.clear()
+ createModernBanner()
+
+ // 显示清理警告
+ await showCleanupWarning()
+
+ // 统计文件数量
+ console.log(` ${fmt.info('正在统计文件数量...')}`)
+ stats.totalFiles = await countAllFiles()
+
+ console.log(` ${fmt.info('即将清理')}: ${fmt.highlight(stats.totalFiles.toString())} 个文件`)
+ console.log(` ${fmt.dim(`涉及 ${targets.length} 个目录/文件路径`)}`)
+ console.log()
+
+ // 用户确认
+ const confirmed = await getUserConfirmation()
+
+ if (!confirmed) {
+ console.log(` ${fmt.warning('操作已取消,清理中止')}`)
+ console.log()
+ return
+ }
+
+ console.log()
+ console.log(` ${icons.check} ${fmt.success('确认成功,开始清理...')}`)
+ console.log()
+
+ // 开始清理过程
+ console.log(` ${fmt.badge('步骤 1/6', theme.bgBlue)} ${fmt.title('删除演示文件')}`)
+ console.log()
+ for (let i = 0; i < targets.length; i++) {
+ await remove(targets[i], i)
+ }
+ console.log()
+
+ console.log(` ${fmt.badge('步骤 2/6', theme.bgBlue)} ${fmt.title('清理路由模块')}`)
+ console.log()
+ await cleanRouteModules()
+ console.log()
+
+ console.log(` ${fmt.badge('步骤 3/6', theme.bgBlue)} ${fmt.title('重写路由别名')}`)
+ console.log()
+ await cleanRoutesAlias()
+ console.log()
+
+ console.log(` ${fmt.badge('步骤 4/6', theme.bgBlue)} ${fmt.title('清空变更日志')}`)
+ console.log()
+ await cleanChangeLog()
+ console.log()
+
+ console.log(` ${fmt.badge('步骤 5/6', theme.bgBlue)} ${fmt.title('清理语言文件')}`)
+ console.log()
+ await cleanLanguageFiles()
+ console.log()
+
+ console.log(` ${fmt.badge('步骤 6/7', theme.bgBlue)} ${fmt.title('清理快速入口')}`)
+ console.log()
+ await cleanFastEnterComponent()
+ console.log()
+
+ console.log(` ${fmt.badge('步骤 7/7', theme.bgBlue)} ${fmt.title('更新菜单接口')}`)
+ console.log()
+ await updateMenuApi()
+
+ // 显示统计信息
+ await showStats()
+
+ // 显示成功横幅
+ createSuccessBanner()
+}
+
+main().catch((err) => {
+ console.log()
+ console.log(` ${icons.error} ${fmt.error('清理脚本执行出错')}`)
+ console.log(` ${fmt.dim('错误详情: ' + err)}`)
+ console.log()
+ process.exit(1)
+})
diff --git a/saiadmin-artd/src/App.vue b/saiadmin-artd/src/App.vue
new file mode 100644
index 0000000..3433913
--- /dev/null
+++ b/saiadmin-artd/src/App.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/api/auth.ts b/saiadmin-artd/src/api/auth.ts
new file mode 100644
index 0000000..ff54e78
--- /dev/null
+++ b/saiadmin-artd/src/api/auth.ts
@@ -0,0 +1,191 @@
+import request from '@/utils/http'
+import { AppRouteRecord } from '@/types/router'
+
+/**
+ * 获取验证码
+ * @returns 响应
+ */
+export function fetchCaptcha() {
+ return request.get({
+ url: '/core/captcha'
+ })
+}
+
+/**
+ * 登录
+ * @param params 登录参数
+ * @returns 登录响应
+ */
+export function fetchLogin(params: Api.Auth.LoginParams) {
+ return request.post({
+ url: '/core/login',
+ params
+ })
+}
+
+/**
+ * 获取用户信息
+ * @returns 用户信息
+ */
+export function fetchGetUserInfo() {
+ return request.get({
+ url: '/core/system/user'
+ })
+}
+
+/**
+ * 修改资料
+ * @param params 修改资料参数
+ * @returns 响应
+ */
+export function updateUserInfo(params: Record) {
+ return request.post({
+ url: '/core/user/updateInfo',
+ params
+ })
+}
+
+/**
+ * 修改密码
+ * @param params 修改密码参数
+ * @returns 响应
+ */
+export function modifyPassword(params: Record) {
+ return request.post({
+ url: '/core/user/modifyPassword',
+ params
+ })
+}
+
+/**
+ * 获取登录日志
+ * @returns 登录日志数组
+ */
+export function fetchGetLogin(params: Record) {
+ return request.get({
+ url: '/core/system/getLoginLogList',
+ params
+ })
+}
+
+/**
+ * 获取操作日志
+ * @returns 操作日志数组
+ */
+export function fetchGetOperate(params: Record) {
+ return request.get({
+ url: '/core/system/getOperationLogList',
+ params
+ })
+}
+
+/**
+ * 清理缓存
+ * @returns
+ */
+export function fetchClearCache() {
+ return request.get({
+ url: '/core/system/clearAllCache'
+ })
+}
+
+/**
+ * 获取字典数据
+ * @returns 字典数组
+ */
+export function fetchGetDictList() {
+ return request.get({
+ url: '/core/system/dictAll'
+ })
+}
+
+/**
+ * 获取菜单列表
+ * @returns 菜单数组
+ */
+export function fetchGetMenuList() {
+ return request.get({
+ url: '/core/system/menu'
+ })
+}
+
+/**
+ * 上传图片
+ * @param params
+ * @returns
+ */
+export function uploadImage(params: any) {
+ return request.post({
+ url: '/core/system/uploadImage',
+ headers: {
+ 'Content-Type': 'multipart/form-data'
+ },
+ params
+ })
+}
+
+/**
+ * 上传文件
+ * @param params
+ * @returns
+ */
+export function uploadFile(params: any) {
+ return request.post({
+ url: '/core/system/uploadFile',
+ headers: {
+ 'Content-Type': 'multipart/form-data'
+ },
+ params
+ })
+}
+
+/**
+ * 切片上传
+ * @param params
+ * @returns
+ */
+export function chunkUpload(params: any) {
+ return request.post({
+ url: '/core/system/chunkUpload',
+ headers: {
+ 'Content-Type': 'multipart/form-data'
+ },
+ params
+ })
+}
+
+/**
+ * 资源分类
+ * @param params
+ * @returns
+ */
+export function getResourceCategory(params: any) {
+ return request.get({
+ url: '/core/system/getResourceCategory',
+ params
+ })
+}
+
+/**
+ * 图片资源列表
+ * @param params
+ * @returns
+ */
+export function getResourceList(params: any) {
+ return request.get({
+ url: '/core/system/getResourceList',
+ params
+ })
+}
+
+/**
+ * 用户列表
+ * @param params
+ * @returns
+ */
+export function getUserList(params: any) {
+ return request.get({
+ url: '/core/system/getUserList',
+ params
+ })
+}
diff --git a/saiadmin-artd/src/api/common.ts b/saiadmin-artd/src/api/common.ts
new file mode 100644
index 0000000..a02a871
--- /dev/null
+++ b/saiadmin-artd/src/api/common.ts
@@ -0,0 +1,46 @@
+import request from '@/utils/http'
+
+/**
+ * 通用API
+ */
+export default {
+ /**
+ * GET请求
+ * @param url 请求URL
+ * @param params 搜索参数
+ * @returns 数据列表
+ */
+ get(url: string, params?: Record) {
+ return request.get({
+ url: url,
+ params
+ })
+ },
+
+ /**
+ * POST请求
+ * @param url 请求URL
+ * @param data 请求参数
+ * @returns 数据列表
+ */
+ post(url: string, data: Record) {
+ return request.post({
+ url: url,
+ data
+ })
+ },
+
+ /**
+ * 下载文件
+ * @param url
+ * @returns
+ */
+ download(url: string) {
+ return request.request({
+ url: url,
+ method: 'post',
+ timeout: 0,
+ responseType: 'blob'
+ })
+ }
+}
diff --git a/saiadmin-artd/src/api/dashboard.ts b/saiadmin-artd/src/api/dashboard.ts
new file mode 100644
index 0000000..2bda696
--- /dev/null
+++ b/saiadmin-artd/src/api/dashboard.ts
@@ -0,0 +1,31 @@
+import request from '@/utils/http'
+
+/**
+ * 基础数据统计
+ * @returns 响应
+ */
+export function fetchStatistics() {
+ return request.get({
+ url: '/core/system/statistics'
+ })
+}
+
+/**
+ * 登录统计图表数据
+ * @returns 响应
+ */
+export function fetchLoginChart() {
+ return request.get({
+ url: '/core/system/loginChart'
+ })
+}
+
+/**
+ * 登录统计图表数据
+ * @returns 响应
+ */
+export function fetchLoginBarChart() {
+ return request.get({
+ url: '/core/system/loginBarChart'
+ })
+}
diff --git a/saiadmin-artd/src/api/safeguard/attachment.ts b/saiadmin-artd/src/api/safeguard/attachment.ts
new file mode 100644
index 0000000..43207d3
--- /dev/null
+++ b/saiadmin-artd/src/api/safeguard/attachment.ts
@@ -0,0 +1,54 @@
+import request from '@/utils/http'
+
+/**
+ * 附件API
+ */
+export default {
+ /**
+ * 数据列表
+ * @param params 搜索参数
+ * @returns 数据列表
+ */
+ list(params: Record) {
+ return request.get({
+ url: '/core/attachment/index',
+ params
+ })
+ },
+
+ /**
+ * 更新数据
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ update(params: Record) {
+ return request.put({
+ url: '/core/attachment/update',
+ data: params
+ })
+ },
+
+ /**
+ * 删除数据
+ * @param id 数据ID
+ * @returns 执行结果
+ */
+ delete(params: Record) {
+ return request.del({
+ url: '/core/attachment/destroy',
+ data: params
+ })
+ },
+
+ /**
+ * 移动文件到分类
+ * @param params 参数,包含文件ID数组和目标分类ID
+ * @returns 执行结果
+ */
+ move(params: Record) {
+ return request.post({
+ url: '/core/attachment/move',
+ data: params
+ })
+ }
+}
diff --git a/saiadmin-artd/src/api/safeguard/category.ts b/saiadmin-artd/src/api/safeguard/category.ts
new file mode 100644
index 0000000..69aeaa6
--- /dev/null
+++ b/saiadmin-artd/src/api/safeguard/category.ts
@@ -0,0 +1,65 @@
+import request from '@/utils/http'
+
+/**
+ * 附件分类API
+ */
+export default {
+ /**
+ * 数据列表
+ * @param params 搜索参数
+ * @returns 数据列表
+ */
+ list(params: Record) {
+ return request.get({
+ url: '/core/category/index',
+ params
+ })
+ },
+
+ /**
+ * 读取数据
+ * @param id 数据ID
+ * @returns 数据详情
+ */
+ read(id: number | string) {
+ return request.get({
+ url: '/core/category/read?id=' + id
+ })
+ },
+
+ /**
+ * 创建数据
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ save(params: Record) {
+ return request.post({
+ url: '/core/category/save',
+ data: params
+ })
+ },
+
+ /**
+ * 更新数据
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ update(params: Record) {
+ return request.put({
+ url: '/core/category/update',
+ data: params
+ })
+ },
+
+ /**
+ * 删除数据
+ * @param id 数据ID
+ * @returns 执行结果
+ */
+ delete(params: Record) {
+ return request.del({
+ url: '/core/category/destroy',
+ data: params
+ })
+ }
+}
diff --git a/saiadmin-artd/src/api/safeguard/database.ts b/saiadmin-artd/src/api/safeguard/database.ts
new file mode 100644
index 0000000..d015ffa
--- /dev/null
+++ b/saiadmin-artd/src/api/safeguard/database.ts
@@ -0,0 +1,95 @@
+import request from '@/utils/http'
+
+/**
+ * 数据表维护API
+ */
+export default {
+ /**
+ * 数据列表
+ * @param params 搜索参数
+ * @returns 数据列表
+ */
+ list(params: Record) {
+ return request.get({
+ url: '/core/database/index',
+ params
+ })
+ },
+
+ /**
+ * 获取数据源
+ * @returns
+ */
+ getDataSource(params: Record = {}) {
+ return request.get({
+ url: '/core/database/dataSource',
+ params
+ })
+ },
+
+ /**
+ * 获取表字段列表
+ * @returns
+ */
+ getDetailed(params: Record = {}) {
+ return request.get({
+ url: '/core/database/detailed',
+ params
+ })
+ },
+
+ /**
+ * 获取回收站数据
+ * @returns
+ */
+ getRecycle(params: Record = {}) {
+ return request.get({
+ url: '/core/database/recycle',
+ params
+ })
+ },
+
+ /**
+ * 销毁数据
+ * @returns
+ */
+ delete(params: Record) {
+ return request.del({
+ url: '/core/database/delete',
+ data: params
+ })
+ },
+
+ /**
+ * 恢复数据
+ * @returns
+ */
+ recovery(params: Record) {
+ return request.post({
+ url: '/core/database/recovery',
+ data: params
+ })
+ },
+
+ /**
+ * 优化表
+ * @returns
+ */
+ optimize(params: Record) {
+ return request.post({
+ url: '/core/database/optimize',
+ data: params
+ })
+ },
+
+ /**
+ * 清理表碎片
+ * @returns
+ */
+ fragment(params: Record) {
+ return request.post({
+ url: '/core/database/fragment',
+ data: params
+ })
+ }
+}
diff --git a/saiadmin-artd/src/api/safeguard/dict.ts b/saiadmin-artd/src/api/safeguard/dict.ts
new file mode 100644
index 0000000..e7f3c74
--- /dev/null
+++ b/saiadmin-artd/src/api/safeguard/dict.ts
@@ -0,0 +1,102 @@
+import request from '@/utils/http'
+
+/**
+ * 字典数据API
+ */
+export default {
+ /**
+ * 获取数据列表
+ * @param params 搜索参数
+ * @returns 数据列表
+ */
+ typeList(params: Record) {
+ return request.get({
+ url: '/core/dictType/index',
+ params
+ })
+ },
+
+ /**
+ * 创建数据
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ save(params: Record) {
+ return request.post({
+ url: '/core/dictType/save',
+ data: params
+ })
+ },
+
+ /**
+ * 更新数据
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ update(params: Record) {
+ return request.put({
+ url: '/core/dictType/update',
+ data: params
+ })
+ },
+
+ /**
+ * 删除数据
+ * @param id 数据ID
+ * @returns 执行结果
+ */
+ delete(params: Record) {
+ return request.del({
+ url: '/core/dictType/destroy',
+ data: params
+ })
+ },
+
+ /**
+ * 字典项数据列表
+ * @param params 搜索参数
+ * @returns 数据列表
+ */
+ dataList(params: Record) {
+ return request.get({
+ url: '/core/dictData/index',
+ params
+ })
+ },
+
+ /**
+ * 创建字典项数据
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ dataSave(params: Record) {
+ return request.post({
+ url: '/core/dictData/save',
+ data: params
+ })
+ },
+
+ /**
+ * 更新字典项数据
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ dataUpdate(params: Record) {
+ return request.put({
+ url: '/core/dictData/update',
+ data: params
+ })
+ },
+
+ /**
+ * 删除数据
+ * @param id 数据ID
+ * @returns 执行结果
+ */
+ dataDelete(params: Record) {
+ return request.del({
+ url: '/core/dictData/destroy',
+ data: params
+ })
+ }
+}
diff --git a/saiadmin-artd/src/api/safeguard/emailLog.ts b/saiadmin-artd/src/api/safeguard/emailLog.ts
new file mode 100644
index 0000000..9f2592c
--- /dev/null
+++ b/saiadmin-artd/src/api/safeguard/emailLog.ts
@@ -0,0 +1,30 @@
+import request from '@/utils/http'
+
+/**
+ * 邮件日志数据API
+ */
+export default {
+ /**
+ * 数据列表
+ * @param params 搜索参数
+ * @returns 数据列表
+ */
+ list(params: Record) {
+ return request.get({
+ url: '/core/email/index',
+ params
+ })
+ },
+
+ /**
+ * 删除数据
+ * @param params
+ * @returns
+ */
+ delete(params: Record) {
+ return request.del({
+ url: '/core/email/destroy',
+ data: params
+ })
+ }
+}
diff --git a/saiadmin-artd/src/api/safeguard/loginLog.ts b/saiadmin-artd/src/api/safeguard/loginLog.ts
new file mode 100644
index 0000000..8fa5ce9
--- /dev/null
+++ b/saiadmin-artd/src/api/safeguard/loginLog.ts
@@ -0,0 +1,30 @@
+import request from '@/utils/http'
+
+/**
+ * 登录日志数据API
+ */
+export default {
+ /**
+ * 数据列表
+ * @param params 搜索参数
+ * @returns 数据列表
+ */
+ list(params: Record) {
+ return request.get({
+ url: '/core/logs/getLoginLogPageList',
+ params
+ })
+ },
+
+ /**
+ * 删除数据
+ * @param params
+ * @returns
+ */
+ delete(params: Record) {
+ return request.del({
+ url: '/core/logs/deleteLoginLog',
+ data: params
+ })
+ }
+}
diff --git a/saiadmin-artd/src/api/safeguard/operLog.ts b/saiadmin-artd/src/api/safeguard/operLog.ts
new file mode 100644
index 0000000..d812560
--- /dev/null
+++ b/saiadmin-artd/src/api/safeguard/operLog.ts
@@ -0,0 +1,30 @@
+import request from '@/utils/http'
+
+/**
+ * 操作日志数据API
+ */
+export default {
+ /**
+ * 数据列表
+ * @param params 搜索参数
+ * @returns 数据列表
+ */
+ list(params: Record) {
+ return request.get({
+ url: '/core/logs/getOperLogPageList',
+ params
+ })
+ },
+
+ /**
+ * 删除数据
+ * @param params
+ * @returns
+ */
+ delete(params: Record) {
+ return request.del({
+ url: '/core/logs/deleteOperLog',
+ data: params
+ })
+ }
+}
diff --git a/saiadmin-artd/src/api/safeguard/server.ts b/saiadmin-artd/src/api/safeguard/server.ts
new file mode 100644
index 0000000..0fa03fa
--- /dev/null
+++ b/saiadmin-artd/src/api/safeguard/server.ts
@@ -0,0 +1,42 @@
+import request from '@/utils/http'
+
+/**
+ * 服务器信息API
+ */
+export default {
+ /**
+ * 服务监控
+ * @param params 搜索参数
+ * @returns 数据列表
+ */
+ monitor(params: Record) {
+ return request.get({
+ url: '/core/server/monitor',
+ params
+ })
+ },
+
+ /**
+ * 缓存列表
+ * @param params 搜索参数
+ * @returns 数据列表
+ */
+ cache(params: Record) {
+ return request.get({
+ url: '/core/server/cache',
+ params
+ })
+ },
+
+ /**
+ * 清理缓存
+ * @param params 搜索参数
+ * @returns 数据列表
+ */
+ clear(params: Record) {
+ return request.post({
+ url: '/core/server/clear',
+ params
+ })
+ }
+}
diff --git a/saiadmin-artd/src/api/system/config.ts b/saiadmin-artd/src/api/system/config.ts
new file mode 100644
index 0000000..f5cfe71
--- /dev/null
+++ b/saiadmin-artd/src/api/system/config.ts
@@ -0,0 +1,126 @@
+import request from '@/utils/http'
+
+/**
+ * 系统设置API
+ */
+export default {
+ /**
+ * 获取数据列表
+ * @param params 搜索参数
+ * @returns 数据列表
+ */
+ groupList(params: Record) {
+ return request.get({
+ url: '/core/configGroup/index',
+ params
+ })
+ },
+
+ /**
+ * 创建数据
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ save(params: Record) {
+ return request.post({
+ url: '/core/configGroup/save',
+ data: params
+ })
+ },
+
+ /**
+ * 更新数据
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ update(params: Record) {
+ return request.put({
+ url: '/core/configGroup/update',
+ data: params
+ })
+ },
+
+ /**
+ * 删除数据
+ * @param id 数据ID
+ * @returns 执行结果
+ */
+ delete(params: Record) {
+ return request.del({
+ url: '/core/configGroup/destroy',
+ data: params
+ })
+ },
+
+ /**
+ * 系统设置项数据列表
+ * @param params 搜索参数
+ * @returns 数据列表
+ */
+ configList(params: Record) {
+ return request.get({
+ url: '/core/config/index',
+ params
+ })
+ },
+
+ /**
+ * 创建系统设置项数据
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ configSave(params: Record) {
+ return request.post({
+ url: '/core/config/save',
+ data: params
+ })
+ },
+
+ /**
+ * 更新系统设置项数据
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ configUpdate(params: Record) {
+ return request.put({
+ url: '/core/config/update',
+ data: params
+ })
+ },
+
+ /**
+ * 删除数据
+ * @param id 数据ID
+ * @returns 执行结果
+ */
+ configDelete(params: Record) {
+ return request.del({
+ url: '/core/config/destroy',
+ data: params
+ })
+ },
+
+ /**
+ * 批量修改配置
+ * @param params
+ * @returns
+ */
+ batchUpdate(params: Record) {
+ return request.post({
+ url: '/core/config/batchUpdate',
+ data: params
+ })
+ },
+
+ /**
+ * 邮件测试
+ * @param params
+ * @returns
+ */
+ emailTest(params: Record) {
+ return request.post({
+ url: '/core/configGroup/email',
+ data: params
+ })
+ }
+}
diff --git a/saiadmin-artd/src/api/system/dept.ts b/saiadmin-artd/src/api/system/dept.ts
new file mode 100644
index 0000000..9f098fe
--- /dev/null
+++ b/saiadmin-artd/src/api/system/dept.ts
@@ -0,0 +1,75 @@
+import request from '@/utils/http'
+
+/**
+ * 部门API
+ */
+export default {
+ /**
+ * 获取数据列表
+ * @param params 搜索参数
+ * @returns 数据列表
+ */
+ list(params: Record) {
+ return request.get({
+ url: '/core/dept/index',
+ params
+ })
+ },
+
+ /**
+ * 读取数据
+ * @param id 数据ID
+ * @returns 数据详情
+ */
+ read(id: number | string) {
+ return request.get({
+ url: '/core/dept/read?id=' + id
+ })
+ },
+
+ /**
+ * 创建数据
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ save(params: Record) {
+ return request.post({
+ url: '/core/dept/save',
+ data: params
+ })
+ },
+
+ /**
+ * 更新数据
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ update(params: Record) {
+ return request.put({
+ url: '/core/dept/update',
+ data: params
+ })
+ },
+
+ /**
+ * 删除数据
+ * @param id 数据ID
+ * @returns 执行结果
+ */
+ delete(params: Record) {
+ return request.del({
+ url: '/core/dept/destroy',
+ data: params
+ })
+ },
+
+ /**
+ * 可操作部门
+ * @returns 数据列表
+ */
+ accessDept() {
+ return request.get({
+ url: '/core/dept/accessDept'
+ })
+ }
+}
diff --git a/saiadmin-artd/src/api/system/menu.ts b/saiadmin-artd/src/api/system/menu.ts
new file mode 100644
index 0000000..b47b804
--- /dev/null
+++ b/saiadmin-artd/src/api/system/menu.ts
@@ -0,0 +1,76 @@
+import request from '@/utils/http'
+
+/**
+ * 菜单API
+ */
+export default {
+ /**
+ * 获取数据列表
+ * @param params 搜索参数
+ * @returns 数据列表
+ */
+ list(params: Record) {
+ return request.get({
+ url: '/core/menu/index',
+ params
+ })
+ },
+
+ /**
+ * 读取数据
+ * @param id 数据ID
+ * @returns 数据详情
+ */
+ read(id: number | string) {
+ return request.get({
+ url: '/core/menu/read?id=' + id
+ })
+ },
+
+ /**
+ * 创建数据
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ save(params: Record) {
+ return request.post({
+ url: '/core/menu/save',
+ data: params
+ })
+ },
+
+ /**
+ * 更新数据
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ update(params: Record) {
+ return request.put({
+ url: '/core/menu/update',
+ data: params
+ })
+ },
+
+ /**
+ * 删除数据
+ * @param id 数据ID
+ * @returns 执行结果
+ */
+ delete(params: Record) {
+ return request.del({
+ url: '/core/menu/destroy',
+ data: params
+ })
+ },
+
+ /**
+ * 可操作角色
+ * @returns 数据列表
+ */
+ accessMenu(params: Record) {
+ return request.get({
+ url: '/core/menu/accessMenu',
+ params
+ })
+ }
+}
diff --git a/saiadmin-artd/src/api/system/post.ts b/saiadmin-artd/src/api/system/post.ts
new file mode 100644
index 0000000..ad87921
--- /dev/null
+++ b/saiadmin-artd/src/api/system/post.ts
@@ -0,0 +1,75 @@
+import request from '@/utils/http'
+
+/**
+ * 岗位API
+ */
+export default {
+ /**
+ * 获取数据列表
+ * @param params 搜索参数
+ * @returns 数据列表
+ */
+ list(params: Record) {
+ return request.get({
+ url: '/core/post/index',
+ params
+ })
+ },
+
+ /**
+ * 读取数据
+ * @param id 数据ID
+ * @returns 数据详情
+ */
+ read(id: number | string) {
+ return request.get({
+ url: '/core/post/read?id=' + id
+ })
+ },
+
+ /**
+ * 创建数据
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ save(params: Record) {
+ return request.post({
+ url: '/core/post/save',
+ data: params
+ })
+ },
+
+ /**
+ * 更新数据
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ update(params: Record) {
+ return request.put({
+ url: '/core/post/update',
+ data: params
+ })
+ },
+
+ /**
+ * 删除数据
+ * @param id 数据ID
+ * @returns 执行结果
+ */
+ delete(params: Record) {
+ return request.del({
+ url: '/core/post/destroy',
+ data: params
+ })
+ },
+
+ /**
+ * 可操作岗位
+ * @returns 数据列表
+ */
+ accessPost() {
+ return request.get({
+ url: '/core/post/accessPost'
+ })
+ }
+}
diff --git a/saiadmin-artd/src/api/system/role.ts b/saiadmin-artd/src/api/system/role.ts
new file mode 100644
index 0000000..12b97ef
--- /dev/null
+++ b/saiadmin-artd/src/api/system/role.ts
@@ -0,0 +1,123 @@
+import request from '@/utils/http'
+
+/**
+ * 角色API
+ */
+export default {
+ /**
+ * 获取数据列表
+ * @param params 搜索参数
+ * @returns 数据列表
+ */
+ list(params: Record) {
+ return request.get({
+ url: '/core/role/index',
+ params
+ })
+ },
+
+ /**
+ * 读取数据
+ * @param id 数据ID
+ * @returns 数据详情
+ */
+ read(id: number | string) {
+ return request.get({
+ url: '/core/role/read?id=' + id
+ })
+ },
+
+ /**
+ * 创建数据
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ save(params: Record) {
+ return request.post({
+ url: '/core/role/save',
+ data: params
+ })
+ },
+
+ /**
+ * 更新数据
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ update(params: Record) {
+ return request.put({
+ url: '/core/role/update',
+ data: params
+ })
+ },
+
+ /**
+ * 删除数据
+ * @param id 数据ID
+ * @returns 执行结果
+ */
+ delete(params: Record) {
+ return request.del({
+ url: '/core/role/destroy',
+ data: params
+ })
+ },
+
+ /**
+ * 获取数据列表
+ * @param params 搜索参数
+ * @returns 数据列表
+ */
+ menuByRole(params: Record) {
+ return request.get({
+ url: '/core/role/getMenuByRole',
+ params
+ })
+ },
+
+ /**
+ * 可操作角色
+ * @returns 数据列表
+ */
+ accessRole() {
+ return request.get({
+ url: '/core/role/accessRole'
+ })
+ },
+
+ /**
+ * 保存菜单权限
+ * @param params
+ * @returns
+ */
+ menuPermission(params: Record) {
+ return request.post({
+ url: '/core/role/menuPermission',
+ data: params
+ })
+ },
+
+ /**
+ * 获取部门数据列表
+ * @param params 搜索参数
+ * @returns 数据列表
+ */
+ deptByRole(params: Record) {
+ return request.get({
+ url: '/core/role/getDeptByRole',
+ params
+ })
+ },
+
+ /**
+ * 保存数据权限
+ * @param params
+ * @returns
+ */
+ dataPermission(params: Record) {
+ return request.post({
+ url: '/core/role/dataPermission',
+ data: params
+ })
+ }
+}
diff --git a/saiadmin-artd/src/api/system/user.ts b/saiadmin-artd/src/api/system/user.ts
new file mode 100644
index 0000000..44e428c
--- /dev/null
+++ b/saiadmin-artd/src/api/system/user.ts
@@ -0,0 +1,101 @@
+import request from '@/utils/http'
+
+/**
+ * 用户API
+ */
+export default {
+ /**
+ * 获取数据列表
+ * @param params 搜索参数
+ * @returns 数据列表
+ */
+ list(params: Record) {
+ return request.get({
+ url: '/core/user/index',
+ params
+ })
+ },
+
+ /**
+ * 读取数据
+ * @param id 数据ID
+ * @returns 数据详情
+ */
+ read(id: number | string) {
+ return request.get({
+ url: '/core/user/read?id=' + id
+ })
+ },
+
+ /**
+ * 创建数据
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ save(params: Record) {
+ return request.post({
+ url: '/core/user/save',
+ data: params
+ })
+ },
+
+ /**
+ * 更新数据
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ update(params: Record) {
+ return request.put({
+ url: '/core/user/update',
+ data: params
+ })
+ },
+
+ /**
+ * 删除数据
+ * @param id 数据ID
+ * @returns 执行结果
+ */
+ delete(params: Record) {
+ return request.del({
+ url: '/core/user/destroy',
+ data: params
+ })
+ },
+
+ /**
+ * 设置首页
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ setHomePage(params: Record) {
+ return request.post({
+ url: '/core/user/setHomePage',
+ data: params
+ })
+ },
+
+ /**
+ * 修改密码
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ changePassword(params: Record) {
+ return request.post({
+ url: '/core/user/initUserPassword',
+ data: params
+ })
+ },
+
+ /**
+ * 清理缓存
+ * @param params
+ * @returns
+ */
+ clearCache(params: Record) {
+ return request.post({
+ url: '/core/user/clearCache',
+ data: params
+ })
+ }
+}
diff --git a/saiadmin-artd/src/api/tool/crontab.ts b/saiadmin-artd/src/api/tool/crontab.ts
new file mode 100644
index 0000000..b8888ca
--- /dev/null
+++ b/saiadmin-artd/src/api/tool/crontab.ts
@@ -0,0 +1,101 @@
+import request from '@/utils/http'
+
+/**
+ * 定时任务API
+ */
+export default {
+ /**
+ * 获取数据列表
+ * @param params 搜索参数
+ * @returns 数据列表
+ */
+ list(params: Record) {
+ return request.get({
+ url: '/tool/crontab/index',
+ params
+ })
+ },
+
+ /**
+ * 读取数据
+ * @param id 数据ID
+ * @returns 数据详情
+ */
+ read(id: number | string) {
+ return request.get({
+ url: '/tool/crontab/read?id=' + id
+ })
+ },
+
+ /**
+ * 创建数据
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ save(params: Record) {
+ return request.post({
+ url: '/tool/crontab/save',
+ data: params
+ })
+ },
+
+ /**
+ * 更新数据
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ update(params: Record) {
+ return request.put({
+ url: '/tool/crontab/update',
+ data: params
+ })
+ },
+
+ /**
+ * 删除数据
+ * @param id 数据ID
+ * @returns 执行结果
+ */
+ delete(params: Record) {
+ return request.del({
+ url: '/tool/crontab/destroy',
+ data: params
+ })
+ },
+
+ /**
+ * 运行
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ run(params: Record) {
+ return request.post({
+ url: '/tool/crontab/run',
+ data: params
+ })
+ },
+
+ /**
+ * 获取运行日志列表
+ * @param params 搜索参数
+ * @returns 数据列表
+ */
+ logPageList(params: Record) {
+ return request.get({
+ url: '/tool/crontab/logPageList',
+ params
+ })
+ },
+
+ /**
+ * 删除运行日志
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ deleteCrontabLog(params: Record) {
+ return request.del({
+ url: '/tool/crontab/deleteCrontabLog',
+ data: params
+ })
+ }
+}
diff --git a/saiadmin-artd/src/api/tool/generate.ts b/saiadmin-artd/src/api/tool/generate.ts
new file mode 100644
index 0000000..30a6f17
--- /dev/null
+++ b/saiadmin-artd/src/api/tool/generate.ts
@@ -0,0 +1,126 @@
+import request from '@/utils/http'
+
+/**
+ * 代码生成API
+ */
+export default {
+ /**
+ * 数据列表
+ * @param params 搜索参数
+ * @returns 数据列表
+ */
+ list(params: Record) {
+ return request.get({
+ url: '/tool/code/index',
+ params
+ })
+ },
+
+ /**
+ * 读取表结构
+ * @param params 搜索参数
+ * @returns 表结构
+ */
+ read(params: Record) {
+ return request.get({
+ url: '/tool/code/read',
+ params
+ })
+ },
+
+ /**
+ * 更新数据
+ * @param params 数据参数
+ * @returns 执行结果
+ */
+ update(params: Record) {
+ return request.put({
+ url: '/tool/code/update',
+ data: params
+ })
+ },
+
+ /**
+ * 删除数据
+ * @param id 数据ID
+ * @returns 执行结果
+ */
+ delete(params: Record) {
+ return request.del({
+ url: '/tool/code/destroy',
+ data: params
+ })
+ },
+
+ /**
+ * 获取表字段
+ * @param params 搜索参数
+ * @returns 表字段
+ */
+ getTableColumns(params: Record) {
+ return request.get({
+ url: '/tool/code/getTableColumns',
+ params
+ })
+ },
+
+ /**
+ * 装载数据表
+ * @param params 搜索参数
+ * @returns 装载结果
+ */
+ loadTable(params: Record) {
+ return request.post({
+ url: '/tool/code/loadTable',
+ params
+ })
+ },
+
+ /**
+ * 同步数据表
+ * @param params 搜索参数
+ * @returns 装载结果
+ */
+ async(params: Record) {
+ return request.post({
+ url: '/tool/code/sync',
+ params
+ })
+ },
+
+ /**
+ * 预览代码
+ * @param params 搜索参数
+ * @returns 预览结果
+ */
+ preview(params: Record) {
+ return request.get({
+ url: '/tool/code/preview',
+ params
+ })
+ },
+
+ /**
+ * 生成代码
+ * @returns
+ */
+ generateCode(params: Record) {
+ return request.post({
+ url: '/tool/code/generate',
+ responseType: 'blob',
+ timeout: 20 * 1000,
+ params
+ })
+ },
+
+ /**
+ * 生成到文件
+ * @returns
+ */
+ generateFile(params: Record) {
+ return request.post({
+ url: '/tool/code/generateFile',
+ params
+ })
+ }
+}
diff --git a/saiadmin-artd/src/assets/images/avatar/avatar.webp b/saiadmin-artd/src/assets/images/avatar/avatar.webp
new file mode 100644
index 0000000..bea307b
Binary files /dev/null and b/saiadmin-artd/src/assets/images/avatar/avatar.webp differ
diff --git a/saiadmin-artd/src/assets/images/avatar/avatar1.webp b/saiadmin-artd/src/assets/images/avatar/avatar1.webp
new file mode 100644
index 0000000..68e256c
Binary files /dev/null and b/saiadmin-artd/src/assets/images/avatar/avatar1.webp differ
diff --git a/saiadmin-artd/src/assets/images/avatar/avatar10.webp b/saiadmin-artd/src/assets/images/avatar/avatar10.webp
new file mode 100644
index 0000000..a813d4c
Binary files /dev/null and b/saiadmin-artd/src/assets/images/avatar/avatar10.webp differ
diff --git a/saiadmin-artd/src/assets/images/avatar/avatar2.webp b/saiadmin-artd/src/assets/images/avatar/avatar2.webp
new file mode 100644
index 0000000..6716e3f
Binary files /dev/null and b/saiadmin-artd/src/assets/images/avatar/avatar2.webp differ
diff --git a/saiadmin-artd/src/assets/images/avatar/avatar3.webp b/saiadmin-artd/src/assets/images/avatar/avatar3.webp
new file mode 100644
index 0000000..7355ad4
Binary files /dev/null and b/saiadmin-artd/src/assets/images/avatar/avatar3.webp differ
diff --git a/saiadmin-artd/src/assets/images/avatar/avatar4.webp b/saiadmin-artd/src/assets/images/avatar/avatar4.webp
new file mode 100644
index 0000000..56a9549
Binary files /dev/null and b/saiadmin-artd/src/assets/images/avatar/avatar4.webp differ
diff --git a/saiadmin-artd/src/assets/images/avatar/avatar5.webp b/saiadmin-artd/src/assets/images/avatar/avatar5.webp
new file mode 100644
index 0000000..f78400c
Binary files /dev/null and b/saiadmin-artd/src/assets/images/avatar/avatar5.webp differ
diff --git a/saiadmin-artd/src/assets/images/avatar/avatar6.webp b/saiadmin-artd/src/assets/images/avatar/avatar6.webp
new file mode 100644
index 0000000..9771b78
Binary files /dev/null and b/saiadmin-artd/src/assets/images/avatar/avatar6.webp differ
diff --git a/saiadmin-artd/src/assets/images/avatar/avatar7.webp b/saiadmin-artd/src/assets/images/avatar/avatar7.webp
new file mode 100644
index 0000000..e5ef6fe
Binary files /dev/null and b/saiadmin-artd/src/assets/images/avatar/avatar7.webp differ
diff --git a/saiadmin-artd/src/assets/images/avatar/avatar8.webp b/saiadmin-artd/src/assets/images/avatar/avatar8.webp
new file mode 100644
index 0000000..b66e48f
Binary files /dev/null and b/saiadmin-artd/src/assets/images/avatar/avatar8.webp differ
diff --git a/saiadmin-artd/src/assets/images/avatar/avatar9.webp b/saiadmin-artd/src/assets/images/avatar/avatar9.webp
new file mode 100644
index 0000000..7974139
Binary files /dev/null and b/saiadmin-artd/src/assets/images/avatar/avatar9.webp differ
diff --git a/saiadmin-artd/src/assets/images/ceremony/hb.png b/saiadmin-artd/src/assets/images/ceremony/hb.png
new file mode 100644
index 0000000..4103324
Binary files /dev/null and b/saiadmin-artd/src/assets/images/ceremony/hb.png differ
diff --git a/saiadmin-artd/src/assets/images/ceremony/sd.png b/saiadmin-artd/src/assets/images/ceremony/sd.png
new file mode 100644
index 0000000..75ec838
Binary files /dev/null and b/saiadmin-artd/src/assets/images/ceremony/sd.png differ
diff --git a/saiadmin-artd/src/assets/images/ceremony/xc.png b/saiadmin-artd/src/assets/images/ceremony/xc.png
new file mode 100644
index 0000000..9c7ab67
Binary files /dev/null and b/saiadmin-artd/src/assets/images/ceremony/xc.png differ
diff --git a/saiadmin-artd/src/assets/images/ceremony/yd.png b/saiadmin-artd/src/assets/images/ceremony/yd.png
new file mode 100644
index 0000000..426912d
Binary files /dev/null and b/saiadmin-artd/src/assets/images/ceremony/yd.png differ
diff --git a/saiadmin-artd/src/assets/images/common/logo.png b/saiadmin-artd/src/assets/images/common/logo.png
new file mode 100644
index 0000000..a048fa8
Binary files /dev/null and b/saiadmin-artd/src/assets/images/common/logo.png differ
diff --git a/saiadmin-artd/src/assets/images/common/logo.webp b/saiadmin-artd/src/assets/images/common/logo.webp
new file mode 100644
index 0000000..71542b5
Binary files /dev/null and b/saiadmin-artd/src/assets/images/common/logo.webp differ
diff --git a/saiadmin-artd/src/assets/images/common/server.png b/saiadmin-artd/src/assets/images/common/server.png
new file mode 100644
index 0000000..d7eee9d
Binary files /dev/null and b/saiadmin-artd/src/assets/images/common/server.png differ
diff --git a/saiadmin-artd/src/assets/images/draw/draw1.png b/saiadmin-artd/src/assets/images/draw/draw1.png
new file mode 100644
index 0000000..da5d87a
Binary files /dev/null and b/saiadmin-artd/src/assets/images/draw/draw1.png differ
diff --git a/saiadmin-artd/src/assets/images/favicon.ico b/saiadmin-artd/src/assets/images/favicon.ico
new file mode 100644
index 0000000..f416642
Binary files /dev/null and b/saiadmin-artd/src/assets/images/favicon.ico differ
diff --git a/saiadmin-artd/src/assets/images/lock/bg_dark.webp b/saiadmin-artd/src/assets/images/lock/bg_dark.webp
new file mode 100644
index 0000000..1c33435
Binary files /dev/null and b/saiadmin-artd/src/assets/images/lock/bg_dark.webp differ
diff --git a/saiadmin-artd/src/assets/images/lock/bg_light.webp b/saiadmin-artd/src/assets/images/lock/bg_light.webp
new file mode 100644
index 0000000..00efbd9
Binary files /dev/null and b/saiadmin-artd/src/assets/images/lock/bg_light.webp differ
diff --git a/saiadmin-artd/src/assets/images/login/lf_icon2.webp b/saiadmin-artd/src/assets/images/login/lf_icon2.webp
new file mode 100644
index 0000000..5e4f3fd
Binary files /dev/null and b/saiadmin-artd/src/assets/images/login/lf_icon2.webp differ
diff --git a/saiadmin-artd/src/assets/images/settings/menu_layouts/dual_column.png b/saiadmin-artd/src/assets/images/settings/menu_layouts/dual_column.png
new file mode 100644
index 0000000..9b868ca
Binary files /dev/null and b/saiadmin-artd/src/assets/images/settings/menu_layouts/dual_column.png differ
diff --git a/saiadmin-artd/src/assets/images/settings/menu_layouts/horizontal.png b/saiadmin-artd/src/assets/images/settings/menu_layouts/horizontal.png
new file mode 100644
index 0000000..ca779bc
Binary files /dev/null and b/saiadmin-artd/src/assets/images/settings/menu_layouts/horizontal.png differ
diff --git a/saiadmin-artd/src/assets/images/settings/menu_layouts/mixed.png b/saiadmin-artd/src/assets/images/settings/menu_layouts/mixed.png
new file mode 100644
index 0000000..c82b580
Binary files /dev/null and b/saiadmin-artd/src/assets/images/settings/menu_layouts/mixed.png differ
diff --git a/saiadmin-artd/src/assets/images/settings/menu_layouts/vertical.png b/saiadmin-artd/src/assets/images/settings/menu_layouts/vertical.png
new file mode 100644
index 0000000..16e942b
Binary files /dev/null and b/saiadmin-artd/src/assets/images/settings/menu_layouts/vertical.png differ
diff --git a/saiadmin-artd/src/assets/images/settings/menu_styles/dark.png b/saiadmin-artd/src/assets/images/settings/menu_styles/dark.png
new file mode 100644
index 0000000..e1653b7
Binary files /dev/null and b/saiadmin-artd/src/assets/images/settings/menu_styles/dark.png differ
diff --git a/saiadmin-artd/src/assets/images/settings/menu_styles/design.png b/saiadmin-artd/src/assets/images/settings/menu_styles/design.png
new file mode 100644
index 0000000..7681aa8
Binary files /dev/null and b/saiadmin-artd/src/assets/images/settings/menu_styles/design.png differ
diff --git a/saiadmin-artd/src/assets/images/settings/menu_styles/light.png b/saiadmin-artd/src/assets/images/settings/menu_styles/light.png
new file mode 100644
index 0000000..3007b99
Binary files /dev/null and b/saiadmin-artd/src/assets/images/settings/menu_styles/light.png differ
diff --git a/saiadmin-artd/src/assets/images/settings/theme_styles/dark.png b/saiadmin-artd/src/assets/images/settings/theme_styles/dark.png
new file mode 100644
index 0000000..e8c6e44
Binary files /dev/null and b/saiadmin-artd/src/assets/images/settings/theme_styles/dark.png differ
diff --git a/saiadmin-artd/src/assets/images/settings/theme_styles/light.png b/saiadmin-artd/src/assets/images/settings/theme_styles/light.png
new file mode 100644
index 0000000..6754238
Binary files /dev/null and b/saiadmin-artd/src/assets/images/settings/theme_styles/light.png differ
diff --git a/saiadmin-artd/src/assets/images/settings/theme_styles/system.png b/saiadmin-artd/src/assets/images/settings/theme_styles/system.png
new file mode 100644
index 0000000..6a6baa9
Binary files /dev/null and b/saiadmin-artd/src/assets/images/settings/theme_styles/system.png differ
diff --git a/saiadmin-artd/src/assets/images/svg/403.svg b/saiadmin-artd/src/assets/images/svg/403.svg
new file mode 100644
index 0000000..68790ad
--- /dev/null
+++ b/saiadmin-artd/src/assets/images/svg/403.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/saiadmin-artd/src/assets/images/svg/404.svg b/saiadmin-artd/src/assets/images/svg/404.svg
new file mode 100644
index 0000000..48e1ca3
--- /dev/null
+++ b/saiadmin-artd/src/assets/images/svg/404.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/saiadmin-artd/src/assets/images/svg/500.svg b/saiadmin-artd/src/assets/images/svg/500.svg
new file mode 100644
index 0000000..512429f
--- /dev/null
+++ b/saiadmin-artd/src/assets/images/svg/500.svg
@@ -0,0 +1,5 @@
+
diff --git a/saiadmin-artd/src/assets/images/svg/login_icon.svg b/saiadmin-artd/src/assets/images/svg/login_icon.svg
new file mode 100644
index 0000000..4beb3ab
--- /dev/null
+++ b/saiadmin-artd/src/assets/images/svg/login_icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/saiadmin-artd/src/assets/images/user/avatar.webp b/saiadmin-artd/src/assets/images/user/avatar.webp
new file mode 100644
index 0000000..6d7234b
Binary files /dev/null and b/saiadmin-artd/src/assets/images/user/avatar.webp differ
diff --git a/saiadmin-artd/src/assets/images/user/user-bg.jpg b/saiadmin-artd/src/assets/images/user/user-bg.jpg
new file mode 100644
index 0000000..4c34724
Binary files /dev/null and b/saiadmin-artd/src/assets/images/user/user-bg.jpg differ
diff --git a/saiadmin-artd/src/assets/styles/core/app.scss b/saiadmin-artd/src/assets/styles/core/app.scss
new file mode 100644
index 0000000..c0efeed
--- /dev/null
+++ b/saiadmin-artd/src/assets/styles/core/app.scss
@@ -0,0 +1,292 @@
+// 全局样式
+// 顶部进度条颜色
+#nprogress .bar {
+ z-index: 2400;
+ background-color: color-mix(in srgb, var(--theme-color) 70%, white);
+}
+
+#nprogress .peg {
+ box-shadow:
+ 0 0 10px var(--theme-color),
+ 0 0 5px var(--theme-color) !important;
+}
+
+#nprogress .spinner-icon {
+ border-top-color: var(--theme-color) !important;
+ border-left-color: var(--theme-color) !important;
+}
+
+// 处理移动端组件兼容性
+@media screen and (max-width: 640px) {
+ * {
+ cursor: default !important;
+ }
+}
+
+// 背景滤镜
+*,
+::before,
+::after {
+ --tw-backdrop-blur: ;
+ --tw-backdrop-brightness: ;
+ --tw-backdrop-contrast: ;
+ --tw-backdrop-grayscale: ;
+ --tw-backdrop-hue-rotate: ;
+ --tw-backdrop-invert: ;
+ --tw-backdrop-opacity: ;
+ --tw-backdrop-saturate: ;
+ --tw-backdrop-sepia: ;
+}
+
+// 色弱模式
+.color-weak {
+ filter: invert(80%);
+ -webkit-filter: invert(80%);
+}
+
+#noop {
+ display: none;
+}
+
+// 语言切换选中样式
+.langDropDownStyle {
+ // 选中项背景颜色
+ .is-selected {
+ background-color: var(--art-el-active-color) !important;
+ }
+
+ // 语言切换按钮菜单样式优化
+ .lang-btn-item {
+ .el-dropdown-menu__item {
+ padding-left: 13px !important;
+ padding-right: 6px !important;
+ margin-bottom: 3px !important;
+ }
+
+ &:last-child {
+ .el-dropdown-menu__item {
+ margin-bottom: 0 !important;
+ }
+ }
+
+ .menu-txt {
+ min-width: 60px;
+ display: block;
+ }
+
+ i {
+ font-size: 10px;
+ margin-left: 10px;
+ }
+ }
+}
+
+// 盒子默认边框
+.page-content {
+ border: 1px solid var(--art-card-border) !important;
+}
+
+@mixin art-card-base($border-color, $shadow: none, $radius-diff: 4px) {
+ background: var(--default-box-color);
+ border: 1px solid #{$border-color} !important;
+ border-radius: calc(var(--custom-radius) + #{$radius-diff}) !important;
+ box-shadow: #{$shadow} !important;
+
+ --el-card-border-color: var(--default-border) !important;
+}
+
+.art-card,
+.art-card-sm,
+.art-card-xs {
+ border: 1px solid var(--art-card-border);
+}
+
+// 盒子边框
+[data-box-mode='border-mode'] {
+ .page-content,
+ .art-table-card {
+ border: 1px solid var(--art-card-border) !important;
+ }
+
+ .art-card {
+ @include art-card-base(var(--art-card-border), none, 4px);
+ }
+
+ .art-card-sm {
+ @include art-card-base(var(--art-card-border), none, 0px);
+ }
+
+ .art-card-xs {
+ @include art-card-base(var(--art-card-border), none, -4px);
+ }
+}
+
+// 盒子阴影
+[data-box-mode='shadow-mode'] {
+ .page-content,
+ .art-table-card {
+ box-shadow: 0px 0px 4px 0px rgba(0, 0, 0, 0.04) !important;
+ border: 1px solid var(--art-gray-200) !important;
+ }
+
+ .layout-sidebar {
+ border-right: 1px solid var(--art-card-border) !important;
+ }
+
+ .art-card {
+ @include art-card-base(
+ var(--art-gray-200),
+ (0 1px 3px 0 rgba(0, 0, 0, 0.03), 0 1px 2px -1px rgba(0, 0, 0, 0.08)),
+ 4px
+ );
+ }
+
+ .art-card-sm {
+ @include art-card-base(
+ var(--art-gray-200),
+ (0 1px 3px 0 rgba(0, 0, 0, 0.03), 0 1px 2px -1px rgba(0, 0, 0, 0.08)),
+ 2px
+ );
+ }
+
+ .art-card-xs {
+ @include art-card-base(
+ var(--art-gray-200),
+ (0 1px 2px 0 rgba(0, 0, 0, 0.03), 0 1px 1px -1px rgba(0, 0, 0, 0.08)),
+ -4px
+ );
+ }
+}
+
+// 元素全屏
+.el-full-screen {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ width: 100vw !important;
+ height: 100% !important;
+ z-index: 2300;
+ margin-top: 0;
+ padding: 15px;
+ box-sizing: border-box;
+ background-color: var(--default-box-color);
+ display: flex;
+ flex-direction: column;
+}
+
+// 表格卡片
+.art-table-card {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ margin-top: 12px;
+ border-radius: calc(var(--custom-radius) / 2 + 2px) !important;
+
+ .el-card__body {
+ height: 100%;
+ overflow: hidden;
+ }
+}
+
+// 容器全高
+.art-full-height {
+ height: var(--art-full-height);
+ display: flex;
+ flex-direction: column;
+
+ @media (max-width: 640px) {
+ height: auto;
+ }
+}
+
+// 徽章样式
+.art-badge {
+ position: absolute;
+ top: 0;
+ right: 20px;
+ bottom: 0;
+ width: 6px;
+ height: 6px;
+ margin: auto;
+ background: #ff3860;
+ border-radius: 50%;
+ animation: breathe 1.5s ease-in-out infinite;
+
+ &.art-badge-horizontal {
+ right: 0;
+ }
+
+ &.art-badge-mixed {
+ right: 0;
+ }
+
+ &.art-badge-dual {
+ right: 5px;
+ top: 5px;
+ bottom: auto;
+ }
+}
+
+// 文字徽章样式
+.art-text-badge {
+ position: absolute;
+ top: 0;
+ right: 12px;
+ bottom: 0;
+ min-width: 20px;
+ height: 18px;
+ line-height: 17px;
+ padding: 0 5px;
+ margin: auto;
+ font-size: 10px;
+ color: #fff;
+ text-align: center;
+ background: #fd4e4e;
+ border-radius: 4px;
+}
+
+@keyframes breathe {
+ 0% {
+ opacity: 0.7;
+ transform: scale(1);
+ }
+
+ 50% {
+ opacity: 1;
+ transform: scale(1.1);
+ }
+
+ 100% {
+ opacity: 0.7;
+ transform: scale(1);
+ }
+}
+
+// 修复老机型 loading 定位问题
+.art-loading-fix {
+ position: fixed !important;
+ top: 0 !important;
+ left: 0 !important;
+ right: 0 !important;
+ bottom: 0 !important;
+ width: 100vw !important;
+ height: 100vh !important;
+ display: flex !important;
+ align-items: center !important;
+ justify-content: center !important;
+}
+
+.art-loading-fix .el-loading-spinner {
+ position: static !important;
+ top: auto !important;
+ left: auto !important;
+ transform: none !important;
+}
+
+// 去除移动端点击背景色
+@media screen and (max-width: 1180px) {
+ * {
+ -webkit-tap-highlight-color: transparent;
+ }
+}
diff --git a/saiadmin-artd/src/assets/styles/core/dark.scss b/saiadmin-artd/src/assets/styles/core/dark.scss
new file mode 100644
index 0000000..c52abc3
--- /dev/null
+++ b/saiadmin-artd/src/assets/styles/core/dark.scss
@@ -0,0 +1,93 @@
+/*
+* 深色主题
+* 单页面移除深色主题 document.getElementsByTagName("html")[0].removeAttribute('class')
+*/
+
+$font-color: rgba(#ffffff, 0.85);
+
+/* 覆盖element-plus默认深色背景色 */
+html.dark {
+ // element-plus
+ --el-bg-color: var(--default-box-color);
+ --el-text-color-regular: #{$font-color};
+
+ // 富文本编辑器
+ // 工具栏背景颜色
+ --w-e-toolbar-bg-color: #18191c;
+ // 输入区域背景颜色
+ --w-e-textarea-bg-color: #090909;
+ // 工具栏文字颜色
+ --w-e-toolbar-color: var(--art-gray-600);
+ // 选中菜单颜色
+ --w-e-toolbar-active-bg-color: #25262b;
+ // 弹窗边框颜色
+ --w-e-toolbar-border-color: var(--default-border-dashed);
+ // 分割线颜色
+ --w-e-textarea-border-color: var(--default-border-dashed);
+ // 链接输入框边框颜色
+ --w-e-modal-button-border-color: var(--default-border-dashed);
+ // 表格头颜色
+ --w-e-textarea-slight-bg-color: #090909;
+ // 按钮背景颜色
+ --w-e-modal-button-bg-color: #090909;
+ // hover toolbar 背景颜色
+ --w-e-toolbar-active-color: var(--art-gray-800);
+}
+
+.dark {
+ .page-content .article-list .item .left .outer > div {
+ border-right-color: var(--dark-border-color) !important;
+ }
+
+ // 富文本编辑器
+ .editor-wrapper {
+ *:not(pre code *) {
+ color: inherit !important;
+ }
+ }
+ // 分隔线
+ .w-e-bar-divider {
+ background-color: var(--art-gray-300) !important;
+ }
+
+ .w-e-select-list,
+ .w-e-drop-panel,
+ .w-e-bar-item-group .w-e-bar-item-menus-container,
+ .w-e-text-container [data-slate-editor] pre > code {
+ border: 1px solid var(--default-border) !important;
+ }
+
+ // 下拉选择框
+ .w-e-select-list {
+ background-color: var(--default-box-color) !important;
+ }
+
+ /* 下拉选择框 hover 样式调整 */
+ .w-e-select-list ul li:hover,
+ /* 工具栏 hover 按钮背景颜色 */
+ .w-e-bar-item button:hover {
+ background-color: #090909 !important;
+ }
+
+ /* 代码块 */
+ .w-e-text-container [data-slate-editor] pre > code {
+ background-color: #25262b !important;
+ text-shadow: none !important;
+ }
+
+ /* 引用 */
+ .w-e-text-container [data-slate-editor] blockquote {
+ border-left: 4px solid var(--default-border-dashed) !important;
+ background-color: var(--art-color);
+ }
+
+ .editor-wrapper {
+ .w-e-text-container [data-slate-editor] .table-container th:last-of-type {
+ border-right: 1px solid var(--default-border-dashed) !important;
+ }
+
+ .w-e-modal {
+ background-color: var(--art-color);
+ }
+ }
+}
diff --git a/saiadmin-artd/src/assets/styles/core/el-dark.scss b/saiadmin-artd/src/assets/styles/core/el-dark.scss
new file mode 100644
index 0000000..8f81cdf
--- /dev/null
+++ b/saiadmin-artd/src/assets/styles/core/el-dark.scss
@@ -0,0 +1,2 @@
+// 导入暗黑主题
+@use 'element-plus/theme-chalk/src/dark/css-vars.scss' as *;
diff --git a/saiadmin-artd/src/assets/styles/core/el-light.scss b/saiadmin-artd/src/assets/styles/core/el-light.scss
new file mode 100644
index 0000000..ddf2bc5
--- /dev/null
+++ b/saiadmin-artd/src/assets/styles/core/el-light.scss
@@ -0,0 +1,34 @@
+// https://github.com/element-plus/element-plus/blob/dev/packages/theme-chalk/src/common/var.scss
+// 自定义Element 亮色主题
+
+@forward 'element-plus/theme-chalk/src/common/var.scss' with (
+ $colors: (
+ 'white': #ffffff,
+ 'black': #000000,
+ 'success': (
+ 'base': #13deb9
+ ),
+ 'warning': (
+ 'base': #ffae1f
+ ),
+ 'danger': (
+ 'base': #ff4d4f
+ ),
+ 'error': (
+ 'base': #fa896b
+ )
+ ),
+ $button: (
+ 'hover-bg-color': var(--el-color-primary-light-9),
+ 'hover-border-color': var(--el-color-primary),
+ 'border-color': var(--el-color-primary),
+ 'text-color': var(--el-color-primary)
+ ),
+ $messagebox: (
+ 'border-radius': '12px'
+ ),
+ $popover: (
+ 'padding': '14px',
+ 'border-radius': '10px'
+ )
+);
diff --git a/saiadmin-artd/src/assets/styles/core/el-ui.scss b/saiadmin-artd/src/assets/styles/core/el-ui.scss
new file mode 100644
index 0000000..44429a1
--- /dev/null
+++ b/saiadmin-artd/src/assets/styles/core/el-ui.scss
@@ -0,0 +1,519 @@
+// 优化 Element Plus 组件库默认样式
+
+:root {
+ // 系统主色
+ --main-color: var(--el-color-primary);
+ --el-color-white: white !important;
+ --el-color-black: white !important;
+ // 输入框边框颜色
+ // --el-border-color: #E4E4E7 !important; // DCDFE6
+ // 按钮粗度
+ --el-font-weight-primary: 400 !important;
+
+ --el-component-custom-height: 36px !important;
+
+ --el-component-size: var(--el-component-custom-height) !important;
+
+ // 边框、按钮圆角...
+ --el-border-radius-base: calc(var(--custom-radius) / 3 + 2px) !important;
+
+ --el-border-radius-small: calc(var(--custom-radius) / 3 + 4px) !important;
+ --el-messagebox-border-radius: calc(var(--custom-radius) / 3 + 4px) !important;
+ --el-popover-border-radius: calc(var(--custom-radius) / 3 + 4px) !important;
+
+ .region .el-radio-button__original-radio:checked + .el-radio-button__inner {
+ color: var(--theme-color);
+ }
+}
+
+// 优化 el-form-item 标签高度
+.el-form-item__label {
+ height: var(--el-component-custom-height) !important;
+ line-height: var(--el-component-custom-height) !important;
+}
+
+// 日期选择器
+.el-date-range-picker {
+ --el-datepicker-inrange-bg-color: var(--art-gray-200) !important;
+}
+
+// el-card 背景色跟系统背景色保持一致
+html.dark .el-card {
+ --el-card-bg-color: var(--default-box-color) !important;
+}
+
+// 修改 el-pagination 大小
+.el-pagination--default {
+ & {
+ --el-pagination-button-width: 32px !important;
+ --el-pagination-button-height: var(--el-pagination-button-width) !important;
+ }
+
+ @media (max-width: 1180px) {
+ & {
+ --el-pagination-button-width: 28px !important;
+ }
+ }
+
+ .el-select--default .el-select__wrapper {
+ min-height: var(--el-pagination-button-width) !important;
+ }
+
+ .el-pagination__jump .el-input {
+ height: var(--el-pagination-button-width) !important;
+ }
+}
+
+.el-pager li {
+ padding: 0 10px !important;
+ // border: 1px solid red !important;
+}
+
+// 优化菜单折叠展开动画(提升动画流畅度)
+.el-menu.el-menu--inline {
+ transition: max-height 0.26s cubic-bezier(0.4, 0, 0.2, 1) !important;
+}
+
+// 优化菜单 item hover 动画(提升鼠标跟手感)
+.el-sub-menu__title,
+.el-menu-item {
+ transition: background-color 0s !important;
+}
+
+// -------------------------------- 修改 el-size=default 组件默认高度 start --------------------------------
+// 修改 el-button 高度
+.el-button--default {
+ height: var(--el-component-custom-height) !important;
+}
+
+// circle 按钮宽度优化
+.el-button--default.is-circle {
+ width: var(--el-component-custom-height) !important;
+}
+
+// 修改 el-select 高度
+.el-select--default {
+ .el-select__wrapper {
+ min-height: var(--el-component-custom-height) !important;
+ }
+}
+
+// 修改 el-checkbox-button 高度
+.el-checkbox-button--default .el-checkbox-button__inner,
+// 修改 el-radio-button 高度
+.el-radio-button--default .el-radio-button__inner {
+ padding: 10px 15px !important;
+}
+// -------------------------------- 修改 el-size=default 组件默认高度 end --------------------------------
+
+.el-pagination.is-background .btn-next,
+.el-pagination.is-background .btn-prev,
+.el-pagination.is-background .el-pager li {
+ border-radius: 6px;
+}
+
+.el-popover {
+ min-width: 80px;
+ border-radius: var(--el-border-radius-small) !important;
+}
+
+.el-dialog {
+ border-radius: 100px !important;
+ border-radius: calc(var(--custom-radius) / 1.2 + 2px) !important;
+ overflow: hidden;
+}
+
+.el-dialog__header {
+ .el-dialog__title {
+ font-size: 16px;
+ }
+}
+
+.el-dialog__body {
+ padding: 25px 0 !important;
+ position: relative; // 为了兼容 el-pagination 样式,需要设置 relative,不然会影响 el-pagination 的样式,比如 el-pagination__jump--small 会被影响,导致 el-pagination__jump--small 按钮无法点击,详见 URL_ADDRESS.com/element-plus/element-plus/issues/5684#issuecomment-1176299275;
+}
+
+.el-dialog.el-dialog-border {
+ .el-dialog__body {
+ // 上边框
+ &::before,
+ // 下边框
+ &::after {
+ content: '';
+ position: absolute;
+ left: -16px;
+ width: calc(100% + 32px);
+ height: 1px;
+ background-color: var(--art-gray-300);
+ }
+
+ &::before {
+ top: 0;
+ }
+
+ &::after {
+ bottom: 0;
+ }
+ }
+}
+
+// el-message 样式优化
+.el-message {
+ background-color: var(--default-box-color) !important;
+ border: 0 !important;
+ box-shadow:
+ 0 6px 16px 0 rgba(0, 0, 0, 0.08),
+ 0 3px 6px -4px rgba(0, 0, 0, 0.12),
+ 0 9px 28px 8px rgba(0, 0, 0, 0.05) !important;
+
+ p {
+ font-size: 13px;
+ }
+}
+
+// 修改 el-dropdown 样式
+.el-dropdown-menu {
+ padding: 6px !important;
+ border-radius: 10px !important;
+ border: none !important;
+
+ .el-dropdown-menu__item {
+ padding: 6px 16px !important;
+ border-radius: 6px !important;
+
+ &:hover:not(.is-disabled) {
+ color: var(--art-gray-900) !important;
+ background-color: var(--art-el-active-color) !important;
+ }
+
+ &:focus:not(.is-disabled) {
+ color: var(--art-gray-900) !important;
+ background-color: var(--art-gray-200) !important;
+ }
+ }
+}
+
+// 隐藏 select、dropdown 的三角
+.el-select__popper,
+.el-dropdown__popper {
+ margin-top: -6px !important;
+
+ .el-popper__arrow {
+ display: none;
+ }
+}
+
+.el-dropdown-selfdefine:focus {
+ outline: none !important;
+}
+
+// 处理移动端组件兼容性
+@media screen and (max-width: 640px) {
+ .el-message-box,
+ .el-dialog {
+ width: calc(100% - 24px) !important;
+ }
+
+ .el-date-picker.has-sidebar.has-time {
+ width: calc(100% - 24px);
+ left: 12px !important;
+ }
+
+ .el-picker-panel *[slot='sidebar'],
+ .el-picker-panel__sidebar {
+ display: none;
+ }
+
+ .el-picker-panel *[slot='sidebar'] + .el-picker-panel__body,
+ .el-picker-panel__sidebar + .el-picker-panel__body {
+ margin-left: 0;
+ }
+}
+
+// 修改el-button样式
+.el-button {
+ &.el-button--text {
+ background-color: transparent !important;
+ padding: 0 !important;
+
+ span {
+ margin-left: 0 !important;
+ }
+ }
+}
+
+// 修改el-tag样式
+.el-tag {
+ font-weight: 500;
+ transition: all 0s !important;
+
+ &.el-tag--default {
+ height: 26px !important;
+ }
+}
+
+.el-checkbox-group {
+ &.el-table-filter__checkbox-group label.el-checkbox {
+ height: 17px !important;
+
+ .el-checkbox__label {
+ font-weight: 400 !important;
+ }
+ }
+}
+
+.el-radio--default {
+ // 优化单选按钮大小
+ .el-radio__input {
+ .el-radio__inner {
+ width: 16px;
+ height: 16px;
+
+ &::after {
+ width: 6px;
+ height: 6px;
+ }
+ }
+ }
+}
+
+.el-checkbox {
+ .el-checkbox__inner {
+ border-radius: 2px !important;
+ }
+}
+
+// 优化复选框样式
+.el-checkbox--default {
+ .el-checkbox__inner {
+ width: 16px !important;
+ height: 16px !important;
+ border-radius: 4px !important;
+
+ &::before {
+ content: '';
+ height: 4px !important;
+ top: 5px !important;
+ background-color: #fff !important;
+ transform: scale(0.6) !important;
+ }
+ }
+
+ .is-checked {
+ .el-checkbox__inner {
+ &::after {
+ width: 3px;
+ height: 8px;
+ margin: auto;
+ border: 2px solid var(--el-checkbox-checked-icon-color);
+ border-left: 0;
+ border-top: 0;
+ transform: translate(-45%, -60%) rotate(45deg) scale(0.86) !important;
+ transform-origin: center;
+ }
+ }
+ }
+}
+
+.el-notification .el-notification__icon {
+ font-size: 22px !important;
+}
+
+// 修改 el-message-box 样式
+.el-message-box__headerbtn .el-message-box__close,
+.el-dialog__headerbtn .el-dialog__close {
+ top: 7px;
+ right: 7px;
+ width: 30px;
+ height: 30px;
+ border-radius: 5px;
+ transition: all 0.3s;
+
+ &:hover {
+ background-color: var(--art-hover-color) !important;
+ color: var(--art-gray-900) !important;
+ }
+}
+
+.el-message-box {
+ padding: 25px 20px !important;
+}
+
+.el-message-box__title {
+ font-weight: 500 !important;
+}
+
+.el-table__column-filter-trigger i {
+ color: var(--theme-color) !important;
+ margin: -3px 0 0 2px;
+}
+
+// 去除 el-dropdown 鼠标放上去出现的边框
+.el-tooltip__trigger:focus-visible {
+ outline: unset;
+}
+
+// ipad 表单右侧按钮优化
+@media screen and (max-width: 1180px) {
+ .el-table-fixed-column--right {
+ padding-right: 0 !important;
+ }
+}
+
+.login-out-dialog {
+ padding: 30px 20px !important;
+ border-radius: 10px !important;
+}
+
+// 修改 dialog 动画
+.dialog-fade-enter-active {
+ .el-dialog:not(.is-draggable) {
+ animation: dialog-open 0.3s cubic-bezier(0.32, 0.14, 0.15, 0.86);
+
+ // 修复 el-dialog 动画后宽度不自适应问题
+ .el-select__selected-item {
+ display: inline-block;
+ }
+ }
+}
+
+.dialog-fade-leave-active {
+ animation: fade-out 0.2s linear;
+
+ .el-dialog:not(.is-draggable) {
+ animation: dialog-close 0.5s;
+ }
+}
+
+@keyframes dialog-open {
+ 0% {
+ opacity: 0;
+ transform: scale(0.2);
+ }
+
+ 100% {
+ opacity: 1;
+ transform: scale(1);
+ }
+}
+
+@keyframes dialog-close {
+ 0% {
+ opacity: 1;
+ transform: scale(1);
+ }
+
+ 100% {
+ opacity: 0;
+ transform: scale(0.2);
+ }
+}
+
+// 遮罩层动画
+@keyframes fade-out {
+ 0% {
+ opacity: 1;
+ }
+
+ 100% {
+ opacity: 0;
+ }
+}
+
+// 修改 el-select 样式
+.el-select__popper:not(.el-tree-select__popper) {
+ .el-select-dropdown__list {
+ padding: 5px !important;
+
+ .el-select-dropdown__item {
+ height: 34px !important;
+ line-height: 34px !important;
+ border-radius: 6px !important;
+
+ &.is-selected {
+ color: var(--art-gray-900) !important;
+ font-weight: 400 !important;
+ background-color: var(--art-el-active-color) !important;
+ margin-bottom: 4px !important;
+ }
+
+ &:hover {
+ background-color: var(--art-hover-color) !important;
+ }
+ }
+
+ .el-select-dropdown__item:hover ~ .is-selected,
+ .el-select-dropdown__item.is-selected:has(~ .el-select-dropdown__item:hover) {
+ background-color: transparent !important;
+ }
+ }
+}
+
+// 修改 el-tree-select 样式
+.el-tree-select__popper {
+ .el-select-dropdown__list {
+ padding: 5px !important;
+
+ .el-tree-node {
+ .el-tree-node__content {
+ height: 36px !important;
+ border-radius: 6px !important;
+
+ &:hover {
+ background-color: var(--art-gray-200) !important;
+ }
+ }
+ }
+ }
+}
+
+// 实现水波纹在文字下面效果
+.el-button > span {
+ position: relative;
+ z-index: 10;
+}
+
+// 优化颜色选择器圆角
+.el-color-picker__color {
+ border-radius: 2px !important;
+}
+
+// 优化日期时间选择器底部圆角
+.el-picker-panel {
+ .el-picker-panel__footer {
+ border-radius: 0 0 var(--el-border-radius-base) var(--el-border-radius-base);
+ }
+}
+
+// 优化树型菜单样式
+.el-tree-node__content {
+ border-radius: 4px;
+ margin-bottom: 4px;
+ padding: 1px 0;
+
+ &:hover {
+ background-color: var(--art-hover-color) !important;
+ }
+}
+
+.dark {
+ .el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {
+ background-color: var(--art-gray-300) !important;
+ }
+}
+
+// 隐藏折叠菜单弹窗 hover 出现的边框
+.menu-left-popper:focus-within,
+.horizontal-menu-popper:focus-within {
+ box-shadow: none !important;
+ outline: none !important;
+}
+
+// 数字输入组件右侧按钮高度跟随自定义组件高度
+.el-input-number--default.is-controls-right {
+ .el-input-number__decrease,
+ .el-input-number__increase {
+ height: calc((var(--el-component-size) / 2)) !important;
+ }
+}
diff --git a/saiadmin-artd/src/assets/styles/core/md.scss b/saiadmin-artd/src/assets/styles/core/md.scss
new file mode 100644
index 0000000..b22fdc2
--- /dev/null
+++ b/saiadmin-artd/src/assets/styles/core/md.scss
@@ -0,0 +1,1036 @@
+/* 文章标题设置(h1-h6)*/
+/* ------------------------------------------------ */
+$font-color: #24292e;
+
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+ color: var(--art-gray-800) !important;
+ margin: 30px 0 10px 0;
+ font-weight: 600;
+}
+
+.markdown-body h1 {
+ font-size: 30px;
+}
+
+@media only screen and (max-width: 550px) {
+ .markdown-body h1 {
+ font-size: 26px;
+ }
+
+ .markdown-body h2 {
+ font-size: 22px;
+ }
+
+ .markdown-body h3 {
+ font-size: 18px;
+ }
+}
+
+/* 块引用 */
+/* ------------------------------------------------ */
+.markdown-body blockquote {
+ color: rgba(60, 60, 67, 0.7);
+ font-size: 15px !important;
+ border-left: 0.18em solid #e7e7e8;
+ background: #f8f8f8;
+ padding: 15px 1em;
+ font-weight: 400 !important;
+}
+
+/* 详情页文章字体颜色 */
+/* ------------------------------------------------ */
+.markdown-body p {
+ line-height: 28px;
+ margin-bottom: 10px;
+}
+
+.markdown-body li,
+.markdown-body p {
+ color: var(--art-gray-800) !important;
+ font-size: 16px !important;
+}
+
+.dark .markdown-body li span {
+ color: var(--art-gray-800) !important;
+ background-color: transparent !important;
+}
+
+.dark .markdown-body p span {
+ color: var(--art-gray-800) !important;
+ background-color: transparent !important;
+}
+
+.line-numbers-mode {
+ background-color: var(--art-code-bg);
+ border-radius: 8px;
+ position: relative;
+ padding-left: 32px;
+ box-sizing: border-box;
+}
+
+.line-numbers-mode pre {
+ flex: 1;
+ border-radius: 0 8px 8px 0;
+ background-color: var(--art-code-bg);
+}
+
+.line-numbers-mode .line-numbers-wrapper {
+ width: 32px;
+ height: 100%;
+ text-align: center;
+ padding: 16px 0;
+ box-sizing: border-box;
+ border-right: 1px solid #000000;
+ position: absolute;
+ left: 0;
+ top: 0;
+}
+
+.line-numbers-mode .line-numbers-wrapper span {
+ height: 23.6px;
+ line-height: 23.6px;
+ display: block;
+ color: #72747b;
+ font-size: 13px;
+ box-sizing: border-box;
+}
+
+.line-numbers-mode .copy-btn {
+ display: inline-block;
+ display: flex;
+ position: absolute;
+ right: 10px;
+ top: 10px;
+ cursor: pointer;
+ opacity: 0;
+ background-color: #000;
+ border-radius: 5px;
+ text-align: center;
+ color: rgba(255, 255, 255, 0.6);
+ transition: opacity 0.3s;
+}
+
+.line-numbers-mode .copy-btn div {
+ width: 34px;
+ height: 34px;
+ line-height: 34px;
+ cursor: pointer;
+ text-align: center;
+ font-size: 20px;
+}
+
+.line-numbers-mode:hover .copy-btn {
+ opacity: 1;
+}
+
+.line-numbers-mode .copy-btn span {
+ height: 34px;
+ line-height: 34px;
+ font-size: 13px;
+ padding-left: 10px;
+ display: none;
+}
+
+.line-numbers-mode .copy-btn .show-copy {
+ opacity: 1;
+ display: block;
+}
+
+.line-numbers-mode ::-webkit-scrollbar-track {
+ background-color: #292b30 !important;
+}
+
+.markdown-body .anchor {
+ float: left;
+ line-height: 1;
+ margin-left: -20px;
+ padding-right: 4px;
+}
+
+.markdown-body .anchor:focus {
+ outline: none;
+}
+
+.markdown-body h1 .octicon-link,
+.markdown-body h2 .octicon-link,
+.markdown-body h3 .octicon-link,
+.markdown-body h4 .octicon-link,
+.markdown-body h5 .octicon-link,
+.markdown-body h6 .octicon-link {
+ color: #1b1f23;
+ vertical-align: middle;
+ visibility: hidden;
+}
+
+.markdown-body h1:hover .anchor,
+.markdown-body h2:hover .anchor,
+.markdown-body h3:hover .anchor,
+.markdown-body h4:hover .anchor,
+.markdown-body h5:hover .anchor,
+.markdown-body h6:hover .anchor {
+ text-decoration: none;
+}
+
+.markdown-body h1:hover .anchor .octicon-link,
+.markdown-body h2:hover .anchor .octicon-link,
+.markdown-body h3:hover .anchor .octicon-link,
+.markdown-body h4:hover .anchor .octicon-link,
+.markdown-body h5:hover .anchor .octicon-link,
+.markdown-body h6:hover .anchor .octicon-link {
+ visibility: visible;
+}
+
+.markdown-body h1:hover .anchor .octicon-link:before,
+.markdown-body h2:hover .anchor .octicon-link:before,
+.markdown-body h3:hover .anchor .octicon-link:before,
+.markdown-body h4:hover .anchor .octicon-link:before,
+.markdown-body h5:hover .anchor .octicon-link:before,
+.markdown-body h6:hover .anchor .octicon-link:before {
+ width: 16px;
+ height: 16px;
+ content: ' ';
+ display: inline-block;
+}
+
+.markdown-body {
+ -ms-text-size-adjust: 100%;
+ -webkit-text-size-adjust: 100%;
+ line-height: 1.5;
+ color: $font-color;
+ font-size: 16px;
+ line-height: 1.5;
+ word-wrap: break-word;
+}
+
+.markdown-body details {
+ display: block;
+}
+
+.markdown-body summary {
+ display: list-item;
+}
+
+.markdown-body a {
+ background-color: initial;
+}
+
+.markdown-body a:active,
+.markdown-body a:hover {
+ outline-width: 0;
+}
+
+.markdown-body strong {
+ font-weight: inherit;
+ font-weight: bolder;
+}
+
+.markdown-body p br {
+ display: inline;
+ line-height: 11px;
+}
+
+.markdown-body img {
+ border-style: none;
+}
+
+.markdown-body hr {
+ box-sizing: initial;
+ height: 0;
+ overflow: visible;
+}
+
+.markdown-body input {
+ font: inherit;
+ margin: 0;
+}
+
+.markdown-body input {
+ overflow: visible;
+}
+
+.markdown-body [type='checkbox'] {
+ box-sizing: border-box;
+ padding: 0;
+}
+
+.markdown-body * {
+ box-sizing: border-box;
+}
+
+.markdown-body input {
+ font-size: inherit;
+ line-height: inherit;
+}
+
+.markdown-body a {
+ color: #0366d6;
+ text-decoration: none;
+}
+
+.markdown-body a:hover {
+ text-decoration: underline;
+}
+
+.markdown-body strong {
+ font-weight: 600;
+}
+
+.markdown-body hr {
+ height: 0;
+ margin: 15px 0;
+ overflow: hidden;
+ background: transparent;
+ border: 0;
+ border-bottom: 1px solid #dfe2e5;
+}
+
+.markdown-body hr:after,
+.markdown-body hr:before {
+ display: table;
+ content: '';
+}
+
+.markdown-body hr:after {
+ clear: both;
+}
+
+.markdown-body table {
+ border-spacing: 0;
+ border-collapse: collapse;
+}
+
+.markdown-body td,
+.markdown-body th {
+ padding: 0;
+}
+
+.markdown-body details summary {
+ cursor: pointer;
+}
+
+.markdown-body kbd {
+ display: inline-block;
+ padding: 3px 5px;
+ font:
+ 11px SFMono-Regular,
+ Consolas,
+ Liberation Mono,
+ Menlo,
+ monospace;
+ line-height: 10px;
+ color: #444d56;
+ vertical-align: middle;
+ background-color: #fafbfc;
+ border: 1px solid #d1d5da;
+ border-radius: 3px;
+ box-shadow: inset 0 -1px 0 #d1d5da;
+}
+
+.markdown-body blockquote {
+ margin: 0;
+}
+
+.markdown-body ol,
+.markdown-body ul {
+ padding-left: 0;
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+.markdown-body ol ol,
+.markdown-body ul ol {
+ list-style-type: lower-roman;
+}
+
+.markdown-body ol ol ol,
+.markdown-body ol ul ol,
+.markdown-body ul ol ol,
+.markdown-body ul ul ol {
+ list-style-type: lower-alpha;
+}
+
+.markdown-body dd {
+ margin-left: 0;
+}
+
+.markdown-body code,
+.markdown-body pre,
+.markdown-body .line-number {
+ font-size: 14px !important;
+ border-radius: 8px;
+ background-color: #282c34;
+}
+
+.dark {
+ .markdown-body code,
+ .markdown-body pre,
+ .markdown-body .line-number {
+ background-color: #252525;
+ }
+}
+
+.markdown-body pre {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+.markdown-body input::-webkit-inner-spin-button,
+.markdown-body input::-webkit-outer-spin-button {
+ margin: 0;
+ -webkit-appearance: none;
+ appearance: none;
+}
+
+.markdown-body :checked + .radio-label {
+ position: relative;
+ z-index: 1;
+ border-color: #0366d6;
+}
+
+.markdown-body .border {
+ border: 1px solid #e1e4e8 !important;
+}
+
+.markdown-body .border-0 {
+ border: 0 !important;
+}
+
+.markdown-body .border-bottom {
+ border-bottom: 1px solid #e1e4e8 !important;
+}
+
+.markdown-body .rounded-1 {
+ border-radius: 3px !important;
+}
+
+.markdown-body .bg-white {
+ background-color: #fff !important;
+}
+
+.markdown-body .bg-gray-light {
+ background-color: #fafbfc !important;
+}
+
+.markdown-body .text-gray-light {
+ color: #6a737d !important;
+}
+
+.markdown-body .mb-0 {
+ margin-bottom: 0 !important;
+}
+
+.markdown-body .my-2 {
+ margin-top: 8px !important;
+ margin-bottom: 8px !important;
+}
+
+.markdown-body .pl-0 {
+ padding-left: 0 !important;
+}
+
+.markdown-body .py-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+}
+
+.markdown-body .pl-1 {
+ padding-left: 4px !important;
+}
+
+.markdown-body .pl-2 {
+ padding-left: 8px !important;
+}
+
+.markdown-body .py-2 {
+ padding-top: 8px !important;
+ padding-bottom: 8px !important;
+}
+
+.markdown-body .pl-3,
+.markdown-body .px-3 {
+ padding-left: 16px !important;
+}
+
+.markdown-body .px-3 {
+ padding-right: 16px !important;
+}
+
+.markdown-body .pl-4 {
+ padding-left: 24px !important;
+}
+
+.markdown-body .pl-5 {
+ padding-left: 32px !important;
+}
+
+.markdown-body .pl-6 {
+ padding-left: 40px !important;
+}
+
+.markdown-body .f6 {
+ font-size: 12px !important;
+}
+
+.markdown-body .lh-condensed {
+ line-height: 1.25 !important;
+}
+
+.markdown-body .text-bold {
+ font-weight: 600 !important;
+}
+
+.markdown-body .pl-c {
+ color: #6a737d;
+}
+
+.markdown-body .pl-c1,
+.markdown-body .pl-s .pl-v {
+ color: #005cc5;
+}
+
+.markdown-body .pl-e,
+.markdown-body .pl-en {
+ color: #6f42c1;
+}
+
+.markdown-body .pl-s .pl-s1,
+.markdown-body .pl-smi {
+ color: $font-color;
+}
+
+.markdown-body .pl-ent {
+ color: #22863a;
+}
+
+.markdown-body .pl-k {
+ color: #d73a49;
+}
+
+.markdown-body .pl-pds,
+.markdown-body .pl-s,
+.markdown-body .pl-s .pl-pse .pl-s1,
+.markdown-body .pl-sr,
+.markdown-body .pl-sr .pl-cce,
+.markdown-body .pl-sr .pl-sra,
+.markdown-body .pl-sr .pl-sre {
+ color: #032f62;
+}
+
+.markdown-body .pl-smw,
+.markdown-body .pl-v {
+ color: #e36209;
+}
+
+.markdown-body .pl-bu {
+ color: #b31d28;
+}
+
+.markdown-body .pl-ii {
+ color: #fafbfc;
+ background-color: #b31d28;
+}
+
+.markdown-body .pl-c2 {
+ color: #fafbfc;
+ background-color: #d73a49;
+}
+
+.markdown-body .pl-c2:before {
+ content: '^M';
+}
+
+.markdown-body .pl-sr .pl-cce {
+ font-weight: 700;
+ color: #22863a;
+}
+
+.markdown-body .pl-ml {
+ color: #735c0f;
+}
+
+.markdown-body .pl-mh,
+.markdown-body .pl-mh .pl-en,
+.markdown-body .pl-ms {
+ font-weight: 700;
+ color: #005cc5;
+}
+
+.markdown-body .pl-mi {
+ font-style: italic;
+ color: $font-color;
+}
+
+.markdown-body .pl-mb {
+ font-weight: 700;
+ color: $font-color;
+}
+
+.markdown-body .pl-md {
+ color: #b31d28;
+ background-color: #ffeef0;
+}
+
+.markdown-body .pl-mi1 {
+ color: #22863a;
+ background-color: #f0fff4;
+}
+
+.markdown-body .pl-mc {
+ color: #e36209;
+ background-color: #ffebda;
+}
+
+.markdown-body .pl-mi2 {
+ color: #f6f8fa;
+ background-color: #005cc5;
+}
+
+.markdown-body .pl-mdr {
+ font-weight: 700;
+ color: #6f42c1;
+}
+
+.markdown-body .pl-ba {
+ color: #586069;
+}
+
+.markdown-body .pl-sg {
+ color: #959da5;
+}
+
+.markdown-body .pl-corl {
+ text-decoration: underline;
+ color: #032f62;
+}
+
+.markdown-body .mb-0 {
+ margin-bottom: 0 !important;
+}
+
+.markdown-body .my-2 {
+ margin-bottom: 8px !important;
+}
+
+.markdown-body .my-2 {
+ margin-top: 8px !important;
+}
+
+.markdown-body .pl-0 {
+ padding-left: 0 !important;
+}
+
+.markdown-body .py-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+}
+
+.markdown-body .pl-1 {
+ padding-left: 4px !important;
+}
+
+.markdown-body .pl-2 {
+ padding-left: 8px !important;
+}
+
+.markdown-body .py-2 {
+ padding-top: 8px !important;
+ padding-bottom: 8px !important;
+}
+
+.markdown-body .pl-3 {
+ padding-left: 16px !important;
+}
+
+.markdown-body .pl-4 {
+ padding-left: 24px !important;
+}
+
+.markdown-body .pl-5 {
+ padding-left: 32px !important;
+}
+
+.markdown-body .pl-6 {
+ padding-left: 40px !important;
+}
+
+.markdown-body .pl-7 {
+ padding-left: 48px !important;
+}
+
+.markdown-body .pl-8 {
+ padding-left: 64px !important;
+}
+
+.markdown-body .pl-9 {
+ padding-left: 80px !important;
+}
+
+.markdown-body .pl-10 {
+ padding-left: 96px !important;
+}
+
+.markdown-body .pl-11 {
+ padding-left: 112px !important;
+}
+
+.markdown-body .pl-12 {
+ padding-left: 128px !important;
+}
+
+.markdown-body hr {
+ border-bottom-color: #eee;
+}
+
+.markdown-body kbd {
+ display: inline-block;
+ padding: 3px 5px;
+ font:
+ 11px SFMono-Regular,
+ Consolas,
+ Liberation Mono,
+ Menlo,
+ monospace;
+ line-height: 10px;
+ color: #444d56;
+ vertical-align: middle;
+ background-color: #fafbfc;
+ border: 1px solid #d1d5da;
+ border-radius: 3px;
+ box-shadow: inset 0 -1px 0 #d1d5da;
+}
+
+.markdown-body:after,
+.markdown-body:before {
+ display: table;
+ content: '';
+}
+
+.markdown-body:after {
+ clear: both;
+}
+
+.markdown-body > :first-child {
+ margin-top: 0 !important;
+}
+
+.markdown-body > :last-child {
+ margin-bottom: 0 !important;
+}
+
+.markdown-body a:not([href]) {
+ color: inherit;
+ text-decoration: none;
+}
+
+.markdown-body blockquote,
+.markdown-body details,
+.markdown-body dl,
+.markdown-body ol,
+.markdown-body pre,
+.markdown-body table,
+.markdown-body ul {
+ margin-top: 0;
+ margin-bottom: 16px;
+}
+
+.markdown-body hr {
+ height: 0.25em;
+ padding: 0;
+ margin: 24px 0;
+ background-color: #e1e4e8;
+ border: 0;
+}
+
+.markdown-body blockquote > :first-child {
+ margin-top: 0;
+}
+
+.markdown-body blockquote > :last-child {
+ margin-bottom: 0;
+}
+
+.markdown-body ol,
+.markdown-body ul {
+ padding-left: 1em;
+}
+
+.markdown-body ol ol,
+.markdown-body ol ul,
+.markdown-body ul ol,
+.markdown-body ul ul {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+.markdown-body li {
+ line-height: 28px;
+ font-size: 14px;
+ word-wrap: break-all;
+ list-style: disc;
+ margin-left: 10px;
+}
+
+.markdown-body li > p {
+ margin-top: 16px;
+}
+
+.markdown-body li + li {
+ margin-top: 0.25em;
+}
+
+.markdown-body dl {
+ padding: 0;
+}
+
+.markdown-body dl dt {
+ padding: 0;
+ margin-top: 16px;
+ font-size: 1em;
+ font-style: italic;
+ font-weight: 600;
+}
+
+.markdown-body dl dd {
+ padding: 0 16px;
+ margin-bottom: 16px;
+}
+
+.markdown-body table {
+ display: block;
+ width: 100%;
+ overflow: auto;
+}
+
+.markdown-body table th {
+ font-weight: 600;
+}
+
+.markdown-body table td,
+.markdown-body table th {
+ padding: 6px 13px;
+ border: 1px solid #dfe2e5;
+}
+
+.markdown-body table tr {
+ background-color: #fff;
+ border-top: 1px solid #c6cbd1;
+}
+
+.markdown-body table tr:nth-child(2n) {
+ background-color: #f6f8fa;
+}
+
+.markdown-body img {
+ max-width: 100%;
+ box-sizing: initial;
+ background-color: #fff;
+ border: 1px solid #eee;
+ border: 1px solid var(--art-c-border-2);
+ cursor: zoom-in;
+}
+
+.markdown-body img[align='right'] {
+ padding-left: 20px;
+}
+
+.markdown-body img[align='left'] {
+ padding-right: 20px;
+}
+
+.markdown-body code {
+ padding: 0.2em 0.4em;
+ margin: 0;
+ font-size: 85%;
+ background-color: rgba(27, 31, 35, 0.05);
+ border-radius: 3px;
+}
+
+.markdown-body pre {
+ word-wrap: normal;
+}
+
+.markdown-body pre > code {
+ padding: 0;
+ margin: 0;
+ font-size: 100%;
+ word-break: normal;
+ white-space: pre;
+ background: transparent;
+ border: 0;
+}
+
+.markdown-body .highlight {
+ margin-bottom: 16px;
+}
+
+.markdown-body .highlight pre {
+ margin-bottom: 0;
+ word-break: normal;
+}
+
+.markdown-body .highlight pre,
+.markdown-body pre {
+ padding: 15px 20px 15px 0;
+ overflow: auto;
+ font-size: 92%;
+ line-height: 1.6;
+}
+
+.markdown-body pre code {
+ display: inline;
+ max-width: auto;
+ padding: 0;
+ margin: 0;
+ overflow: visible;
+ line-height: inherit;
+ word-wrap: normal;
+ background-color: initial;
+ border: 0;
+}
+
+.markdown-body .commit-tease-sha {
+ display: inline-block;
+ font-size: 90%;
+ color: #444d56;
+}
+
+.markdown-body .full-commit .btn-outline:not(:disabled):hover {
+ color: #005cc5;
+ border-color: #005cc5;
+}
+
+.markdown-body .blob-wrapper {
+ overflow-x: auto;
+ overflow-y: hidden;
+}
+
+.markdown-body .blob-wrapper-embedded {
+ max-height: 240px;
+ overflow-y: auto;
+}
+
+.markdown-body .blob-num {
+ width: 1%;
+ min-width: 50px;
+ padding-right: 10px;
+ padding-left: 10px;
+ font-size: 12px;
+ line-height: 20px;
+ color: rgba(27, 31, 35, 0.3);
+ text-align: right;
+ white-space: nowrap;
+ vertical-align: top;
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.markdown-body .blob-num:hover {
+ color: rgba(27, 31, 35, 0.6);
+}
+
+.markdown-body .blob-num:before {
+ content: attr(data-line-number);
+}
+
+.markdown-body .blob-code {
+ position: relative;
+ padding-right: 10px;
+ padding-left: 10px;
+ line-height: 20px;
+ vertical-align: top;
+}
+
+.markdown-body .blob-code-inner {
+ overflow: visible;
+ font-size: 12px;
+ color: $font-color;
+ word-wrap: normal;
+ white-space: pre;
+}
+
+.markdown-body .pl-token.active,
+.markdown-body .pl-token:hover {
+ cursor: pointer;
+ background: #ffea7f;
+}
+
+.markdown-body .tab-size[data-tab-size='1'] {
+ -moz-tab-size: 1;
+ tab-size: 1;
+}
+
+.markdown-body .tab-size[data-tab-size='2'] {
+ -moz-tab-size: 2;
+ tab-size: 2;
+}
+
+.markdown-body .tab-size[data-tab-size='3'] {
+ -moz-tab-size: 3;
+ tab-size: 3;
+}
+
+.markdown-body .tab-size[data-tab-size='4'] {
+ -moz-tab-size: 4;
+ tab-size: 4;
+}
+
+.markdown-body .tab-size[data-tab-size='5'] {
+ -moz-tab-size: 5;
+ tab-size: 5;
+}
+
+.markdown-body .tab-size[data-tab-size='6'] {
+ -moz-tab-size: 6;
+ tab-size: 6;
+}
+
+.markdown-body .tab-size[data-tab-size='7'] {
+ -moz-tab-size: 7;
+ tab-size: 7;
+}
+
+.markdown-body .tab-size[data-tab-size='8'] {
+ -moz-tab-size: 8;
+ tab-size: 8;
+}
+
+.markdown-body .tab-size[data-tab-size='9'] {
+ -moz-tab-size: 9;
+ tab-size: 9;
+}
+
+.markdown-body .tab-size[data-tab-size='10'] {
+ -moz-tab-size: 10;
+ tab-size: 10;
+}
+
+.markdown-body .tab-size[data-tab-size='11'] {
+ -moz-tab-size: 11;
+ tab-size: 11;
+}
+
+.markdown-body .tab-size[data-tab-size='12'] {
+ -moz-tab-size: 12;
+ tab-size: 12;
+}
+
+.markdown-body .task-list-item {
+ list-style-type: none;
+}
+
+.markdown-body .task-list-item + .task-list-item {
+ margin-top: 3px;
+}
+
+.markdown-body .task-list-item input {
+ margin: 0 0.2em 0.25em -1.6em;
+ vertical-align: middle;
+}
diff --git a/saiadmin-artd/src/assets/styles/core/mixin.scss b/saiadmin-artd/src/assets/styles/core/mixin.scss
new file mode 100644
index 0000000..db36888
--- /dev/null
+++ b/saiadmin-artd/src/assets/styles/core/mixin.scss
@@ -0,0 +1,157 @@
+// sass 混合宏(函数)
+
+/**
+* 溢出省略号
+* @param {Number} 行数
+*/
+@mixin ellipsis($rowCount: 1) {
+ @if $rowCount <=1 {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ } @else {
+ min-width: 0;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-line-clamp: $rowCount;
+ -webkit-box-orient: vertical;
+ }
+}
+
+/**
+* 控制用户能否选中文本
+* @param {String} 类型
+*/
+@mixin userSelect($value: none) {
+ user-select: $value;
+ -moz-user-select: $value;
+ -ms-user-select: $value;
+ -webkit-user-select: $value;
+}
+
+// 绝对定位居中
+@mixin absoluteCenter() {
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ margin: auto;
+}
+
+/**
+* css3动画
+*
+*/
+@mixin animation(
+ $from: (
+ width: 0px
+ ),
+ $to: (
+ width: 100px
+ ),
+ $name: mymove,
+ $animate: mymove 2s 1 linear infinite
+) {
+ -webkit-animation: $animate;
+ -o-animation: $animate;
+ animation: $animate;
+
+ @keyframes #{$name} {
+ from {
+ @each $key, $value in $from {
+ #{$key}: #{$value};
+ }
+ }
+
+ to {
+ @each $key, $value in $to {
+ #{$key}: #{$value};
+ }
+ }
+ }
+
+ @-webkit-keyframes #{$name} {
+ from {
+ @each $key, $value in $from {
+ $key: $value;
+ }
+ }
+
+ to {
+ @each $key, $value in $to {
+ $key: $value;
+ }
+ }
+ }
+}
+
+// 圆形盒子
+@mixin circle($size: 11px, $bg: #fff) {
+ border-radius: 50%;
+ width: $size;
+ height: $size;
+ line-height: $size;
+ text-align: center;
+ background: $bg;
+}
+
+// placeholder
+@mixin placeholder($color: #bbb) {
+ // Firefox
+ &::-moz-placeholder {
+ color: $color;
+ opacity: 1;
+ }
+
+ // Internet Explorer 10+
+ &:-ms-input-placeholder {
+ color: $color;
+ }
+
+ // Safari and Chrome
+ &::-webkit-input-placeholder {
+ color: $color;
+ }
+
+ &:placeholder-shown {
+ text-overflow: ellipsis;
+ }
+}
+
+//背景透明,文字不透明。兼容IE8
+@mixin betterTransparentize($color, $alpha) {
+ $c: rgba($color, $alpha);
+ $ie_c: ie_hex_str($c);
+ background: rgba($color, 1);
+ background: $c;
+ background: transparent \9;
+ zoom: 1;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#{$ie_c}, endColorstr=#{$ie_c});
+ -ms-filter: 'progid:DXImageTransform.Microsoft.gradient(startColorstr=#{$ie_c}, endColorstr=#{$ie_c})';
+}
+
+//添加浏览器前缀
+@mixin browserPrefix($propertyName, $value) {
+ @each $prefix in -webkit-, -moz-, -ms-, -o-, '' {
+ #{$prefix}#{$propertyName}: $value;
+ }
+}
+
+// 边框
+@mixin border($color: red) {
+ border: 1px solid $color;
+}
+
+// 背景滤镜
+@mixin backdropBlur() {
+ --tw-backdrop-blur: blur(30px);
+ -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness)
+ var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate)
+ var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate)
+ var(--tw-backdrop-sepia);
+ backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast)
+ var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert)
+ var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
+}
diff --git a/saiadmin-artd/src/assets/styles/core/reset.scss b/saiadmin-artd/src/assets/styles/core/reset.scss
new file mode 100644
index 0000000..17a3bcf
--- /dev/null
+++ b/saiadmin-artd/src/assets/styles/core/reset.scss
@@ -0,0 +1,41 @@
+@charset "UTF-8";
+
+/*滚动条*/
+/*滚动条整体部分,必须要设置*/
+::-webkit-scrollbar {
+ width: 8px !important;
+ height: 0 !important;
+}
+
+/*滚动条的轨道*/
+::-webkit-scrollbar-track {
+ background-color: var(--art-gray-200);
+}
+
+/*滚动条的滑块按钮*/
+::-webkit-scrollbar-thumb {
+ border-radius: 5px;
+ background-color: #cccccc !important;
+ transition: all 0.2s;
+ -webkit-transition: all 0.2s;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background-color: #b0abab !important;
+}
+
+/*滚动条的上下两端的按钮*/
+::-webkit-scrollbar-button {
+ height: 0px;
+ width: 0;
+}
+
+.dark {
+ ::-webkit-scrollbar-track {
+ background-color: var(--default-bg-color);
+ }
+
+ ::-webkit-scrollbar-thumb {
+ background-color: var(--art-gray-300) !important;
+ }
+}
diff --git a/saiadmin-artd/src/assets/styles/core/router-transition.scss b/saiadmin-artd/src/assets/styles/core/router-transition.scss
new file mode 100644
index 0000000..f47c741
--- /dev/null
+++ b/saiadmin-artd/src/assets/styles/core/router-transition.scss
@@ -0,0 +1,104 @@
+@use 'sass:map';
+
+// === 变量区域 ===
+$transition: (
+ // 动画持续时间
+ duration: 0.25s,
+ // 滑动动画的移动距离
+ distance: 15px,
+ // 默认缓动函数
+ easing: cubic-bezier(0.25, 0.1, 0.25, 1),
+ // 淡入淡出专用的缓动函数
+ fade-easing: cubic-bezier(0.4, 0, 0.6, 1)
+);
+
+// 抽取配置值函数,提高可复用性
+@function transition-config($key) {
+ @return map.get($transition, $key);
+}
+
+// 变量简写
+$duration: transition-config('duration');
+$distance: transition-config('distance');
+$easing: transition-config('easing');
+$fade-easing: transition-config('fade-easing');
+
+// === 动画类 ===
+
+// 淡入淡出动画
+.fade {
+ &-enter-active,
+ &-leave-active {
+ transition: opacity $duration $fade-easing;
+ will-change: opacity;
+ }
+
+ &-enter-from,
+ &-leave-to {
+ opacity: 0;
+ }
+
+ &-enter-to,
+ &-leave-from {
+ opacity: 1;
+ }
+}
+
+// 滑动动画通用样式
+@mixin slide-transition($direction) {
+ $distance-x: 0;
+ $distance-y: 0;
+
+ @if $direction == 'left' {
+ $distance-x: -$distance;
+ } @else if $direction == 'right' {
+ $distance-x: $distance;
+ } @else if $direction == 'top' {
+ $distance-y: -$distance;
+ } @else if $direction == 'bottom' {
+ $distance-y: $distance;
+ }
+
+ &-enter-active {
+ transition:
+ opacity $duration $easing,
+ transform $duration $easing;
+ will-change: opacity, transform;
+ }
+
+ &-leave-active {
+ transition:
+ opacity calc($duration * 0.7) $easing,
+ transform calc($duration * 0.7) $easing;
+ will-change: opacity, transform;
+ }
+
+ &-enter-from {
+ opacity: 0;
+ transform: translate3d($distance-x, $distance-y, 0);
+ }
+
+ &-enter-to {
+ opacity: 1;
+ transform: translate3d(0, 0, 0);
+ }
+
+ &-leave-to {
+ opacity: 0;
+ transform: translate3d(-$distance-x, -$distance-y, 0);
+ }
+}
+
+// 滑动动画方向类
+.slide-left {
+ @include slide-transition('left');
+}
+.slide-right {
+ @include slide-transition('right');
+}
+.slide-top {
+ @include slide-transition('top');
+}
+.slide-bottom {
+ @include slide-transition('bottom');
+}
diff --git a/saiadmin-artd/src/assets/styles/core/tailwind.css b/saiadmin-artd/src/assets/styles/core/tailwind.css
new file mode 100644
index 0000000..1a9e22c
--- /dev/null
+++ b/saiadmin-artd/src/assets/styles/core/tailwind.css
@@ -0,0 +1,208 @@
+@import 'tailwindcss';
+@custom-variant dark (&:where(.dark, .dark *));
+
+/* ==================== Light Mode Variables ==================== */
+:root {
+ /* Base Colors */
+ --art-color: #ffffff;
+ --theme-color: var(--main-color);
+
+ /* Theme Colors - OKLCH Format */
+ --art-primary: oklch(0.7 0.23 260);
+ --art-secondary: oklch(0.72 0.19 231.6);
+ --art-error: oklch(0.73 0.15 25.3);
+ --art-info: oklch(0.58 0.03 254.1);
+ --art-success: oklch(0.78 0.17 166.1);
+ --art-warning: oklch(0.78 0.14 75.5);
+ --art-danger: oklch(0.68 0.22 25.3);
+
+ /* Gray Scale - Light Mode */
+ --art-gray-100: #f9fafb;
+ --art-gray-200: #f2f4f5;
+ --art-gray-300: #e6eaeb;
+ --art-gray-400: #dbdfe1;
+ --art-gray-500: #949eb7;
+ --art-gray-600: #7987a1;
+ --art-gray-700: #4d5875;
+ --art-gray-800: #383853;
+ --art-gray-900: #323251;
+
+ /* Border Colors */
+ --art-card-border: rgba(0, 0, 0, 0.08);
+
+ --default-border: #e2e8ee;
+ --default-border-dashed: #dbdfe9;
+
+ /* Background Colors */
+ --default-bg-color: #fafbfc;
+ --default-box-color: #ffffff;
+
+ /* Hover Color */
+ --art-hover-color: #edeff0;
+
+ /* Active Color */
+ --art-active-color: #f2f4f5;
+
+ /* Element Component Active Color */
+ --art-el-active-color: #f2f4f5;
+}
+
+/* ==================== Dark Mode Variables ==================== */
+.dark {
+ /* Base Colors */
+ --art-color: #000000;
+
+ /* Gray Scale - Dark Mode */
+ --art-gray-100: #110f0f;
+ --art-gray-200: #17171c;
+ --art-gray-300: #393946;
+ --art-gray-400: #505062;
+ --art-gray-500: #73738c;
+ --art-gray-600: #8f8fa3;
+ --art-gray-700: #ababba;
+ --art-gray-800: #c7c7d1;
+ --art-gray-900: #e3e3e8;
+
+ /* Border Colors */
+ --art-card-border: rgba(255, 255, 255, 0.08);
+
+ --default-border: rgba(255, 255, 255, 0.1);
+ --default-border-dashed: #363843;
+
+ /* Background Colors */
+ --default-bg-color: #070707;
+ --default-box-color: #161618;
+
+ /* Hover Color */
+ --art-hover-color: #252530;
+
+ /* Active Color */
+ --art-active-color: #202226;
+
+ /* Element Component Active Color */
+ --art-el-active-color: #2e2e38;
+}
+
+/* ==================== Tailwind Theme Configuration ==================== */
+@theme {
+ /* Box Color (Light: white / Dark: black) */
+ --color-box: var(--default-box-color);
+
+ /* System Theme Color */
+ --color-theme: var(--theme-color);
+
+ /* Hover Color */
+ --color-hover-color: var(--art-hover-color);
+
+ /* Active Color */
+ --color-active-color: var(--art-active-color);
+
+ /* Active Color */
+ --color-el-active-color: var(--art-active-color);
+
+ /* ElementPlus Theme Colors */
+ --color-primary: var(--art-primary);
+ --color-secondary: var(--art-secondary);
+ --color-error: var(--art-error);
+ --color-info: var(--art-info);
+ --color-success: var(--art-success);
+ --color-warning: var(--art-warning);
+ --color-danger: var(--art-danger);
+
+ /* Gray Scale Colors (Auto-adapts to dark mode) */
+ --color-g-100: var(--art-gray-100);
+ --color-g-200: var(--art-gray-200);
+ --color-g-300: var(--art-gray-300);
+ --color-g-400: var(--art-gray-400);
+ --color-g-500: var(--art-gray-500);
+ --color-g-600: var(--art-gray-600);
+ --color-g-700: var(--art-gray-700);
+ --color-g-800: var(--art-gray-800);
+ --color-g-900: var(--art-gray-900);
+}
+
+/* ==================== Custom Border Radius Utilities ==================== */
+@utility rounded-custom-xs {
+ border-radius: calc(var(--custom-radius) / 2);
+}
+
+@utility rounded-custom-sm {
+ border-radius: calc(var(--custom-radius) / 2 + 2px);
+}
+
+/* ==================== Custom Utility Classes ==================== */
+@layer utilities {
+ /* Flexbox Layout Utilities */
+ .flex-c {
+ @apply flex items-center;
+ }
+
+ .flex-b {
+ @apply flex justify-between;
+ }
+
+ .flex-cc {
+ @apply flex items-center justify-center;
+ }
+
+ .flex-cb {
+ @apply flex items-center justify-between;
+ }
+
+ /* Transition Utilities */
+ .tad-200 {
+ @apply transition-all duration-200;
+ }
+
+ .tad-300 {
+ @apply transition-all duration-300;
+ }
+
+ /* Border Utilities */
+ .border-full-d {
+ @apply border border-[var(--default-border)];
+ }
+
+ .border-b-d {
+ @apply border-b border-[var(--default-border)];
+ }
+
+ .border-t-d {
+ @apply border-t border-[var(--default-border)];
+ }
+
+ .border-l-d {
+ @apply border-l border-[var(--default-border)];
+ }
+
+ .border-r-d {
+ @apply border-r border-[var(--default-border)];
+ }
+
+ /* Cursor Utilities */
+ .c-p {
+ @apply cursor-pointer;
+ }
+}
+
+/* ==================== Custom Component Classes ==================== */
+@layer components {
+ /* Art Card Header Component */
+ .art-card-header {
+ @apply flex justify-between pr-6 pb-1;
+
+ .title {
+ h4 {
+ @apply text-lg font-medium text-g-900;
+ }
+
+ p {
+ @apply mt-1 text-sm text-g-600;
+
+ span {
+ @apply ml-2 font-medium;
+ }
+ }
+ }
+ }
+}
diff --git a/saiadmin-artd/src/assets/styles/core/theme-animation.scss b/saiadmin-artd/src/assets/styles/core/theme-animation.scss
new file mode 100644
index 0000000..377b945
--- /dev/null
+++ b/saiadmin-artd/src/assets/styles/core/theme-animation.scss
@@ -0,0 +1,63 @@
+// 定义基础变量
+$bg-animation-color-light: #000;
+$bg-animation-color-dark: #fff;
+$bg-animation-duration: 0.5s;
+
+html {
+ --bg-animation-color: $bg-animation-color-light;
+
+ &.dark {
+ --bg-animation-color: $bg-animation-color-dark;
+ }
+
+ // View transition styles
+ &::view-transition-old(*) {
+ animation: none;
+ }
+
+ &::view-transition-new(*) {
+ animation: clip $bg-animation-duration ease-in both;
+ }
+
+ &::view-transition-old(root) {
+ z-index: 1;
+ }
+
+ &::view-transition-new(root) {
+ z-index: 9999;
+ }
+
+ &.dark {
+ &::view-transition-old(*) {
+ animation: clip $bg-animation-duration ease-in reverse both;
+ }
+
+ &::view-transition-new(*) {
+ animation: none;
+ }
+
+ &::view-transition-old(root) {
+ z-index: 9999;
+ }
+
+ &::view-transition-new(root) {
+ z-index: 1;
+ }
+ }
+}
+
+// 定义动画
+@keyframes clip {
+ from {
+ clip-path: circle(0% at var(--x) var(--y));
+ }
+
+ to {
+ clip-path: circle(var(--r) at var(--x) var(--y));
+ }
+}
+
+// body 相关样式
+body {
+ background-color: var(--bg-animation-color);
+}
diff --git a/saiadmin-artd/src/assets/styles/core/theme-change.scss b/saiadmin-artd/src/assets/styles/core/theme-change.scss
new file mode 100644
index 0000000..5b640d2
--- /dev/null
+++ b/saiadmin-artd/src/assets/styles/core/theme-change.scss
@@ -0,0 +1,11 @@
+// 主题切换过渡优化,优化除视觉上的不适感
+.theme-change {
+ * {
+ transition: 0s !important;
+ }
+
+ .el-switch__core,
+ .el-switch__action {
+ transition: all 0.3s !important;
+ }
+}
diff --git a/saiadmin-artd/src/assets/styles/custom/one-dark-pro.scss b/saiadmin-artd/src/assets/styles/custom/one-dark-pro.scss
new file mode 100644
index 0000000..36bdf63
--- /dev/null
+++ b/saiadmin-artd/src/assets/styles/custom/one-dark-pro.scss
@@ -0,0 +1,98 @@
+.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+
+ color: #a6accd;
+}
+
+.hljs-string,
+.hljs-section,
+.hljs-selector-class,
+.hljs-template-variable,
+.hljs-deletion {
+ color: #aed07e !important;
+}
+
+.hljs-comment,
+.hljs-quote {
+ color: #6f747d;
+}
+
+.hljs-doctag,
+.hljs-keyword,
+.hljs-formula {
+ color: #c792ea;
+}
+
+.hljs-section,
+.hljs-name,
+.hljs-selector-tag,
+.hljs-deletion,
+.hljs-subst {
+ color: #c86068;
+}
+
+.hljs-literal {
+ color: #56b6c2;
+}
+
+.hljs-string,
+.hljs-regexp,
+.hljs-addition,
+.hljs-attribute,
+.hljs-meta-string {
+ color: #abb2bf;
+}
+
+.hljs-attribute {
+ color: #c792ea;
+}
+
+.hljs-function {
+ color: #c792ea;
+}
+
+.hljs-type {
+ color: #f07178;
+}
+
+.hljs-title {
+ color: #82aaff !important;
+}
+
+.hljs-built_in,
+.hljs-class {
+ color: #82aaff;
+}
+
+// 括号
+.hljs-params {
+ color: #a6accd;
+}
+
+.hljs-attr,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo,
+.hljs-number {
+ color: #de7e61;
+}
+
+.hljs-symbol,
+.hljs-bullet,
+.hljs-link,
+.hljs-meta,
+.hljs-selector-id {
+ color: #61aeee;
+}
+
+.hljs-strong {
+ font-weight: bold;
+}
+
+.hljs-link {
+ text-decoration: underline;
+}
diff --git a/saiadmin-artd/src/assets/styles/index.scss b/saiadmin-artd/src/assets/styles/index.scss
new file mode 100644
index 0000000..cdc2ddc
--- /dev/null
+++ b/saiadmin-artd/src/assets/styles/index.scss
@@ -0,0 +1,23 @@
+// 重置默认样式
+@use './core/reset.scss';
+
+// 应用全局样式
+@use './core/app.scss';
+
+// Element Plus 样式优化
+@use './core/el-ui.scss';
+
+// Element Plus 暗黑主题
+@use './core/el-dark.scss';
+
+// 暗黑主题样式优化
+@use './core/dark.scss';
+
+// 路由切换动画
+@use './core/router-transition';
+
+// 主题切换过渡优化
+@use './core/theme-change.scss';
+
+// 主题切换圆形扩散动画
+@use './core/theme-animation.scss';
diff --git a/saiadmin-artd/src/assets/svg/loading.ts b/saiadmin-artd/src/assets/svg/loading.ts
new file mode 100644
index 0000000..fdfb078
--- /dev/null
+++ b/saiadmin-artd/src/assets/svg/loading.ts
@@ -0,0 +1,32 @@
+// 自定义四点旋转SVG
+export const fourDotsSpinnerSvg = `
+
+
+
+
+
+
+
+
+
+`
diff --git a/saiadmin-artd/src/components/core/banners/art-basic-banner/index.vue b/saiadmin-artd/src/components/core/banners/art-basic-banner/index.vue
new file mode 100644
index 0000000..65b47e4
--- /dev/null
+++ b/saiadmin-artd/src/components/core/banners/art-basic-banner/index.vue
@@ -0,0 +1,343 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ title }}
+
+
+
+
+ {{
+ subtitle
+ }}
+
+
+
+
+
+ {{ buttonConfig?.text }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/banners/art-card-banner/index.vue b/saiadmin-artd/src/components/core/banners/art-card-banner/index.vue
new file mode 100644
index 0000000..8a5f9d4
--- /dev/null
+++ b/saiadmin-artd/src/components/core/banners/art-card-banner/index.vue
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
{{ title }}
+
{{ description }}
+
+
+
+ {{ cancelButton?.text }}
+
+
+ {{ button?.text }}
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/base/art-back-to-top/index.vue b/saiadmin-artd/src/components/core/base/art-back-to-top/index.vue
new file mode 100644
index 0000000..6f8da61
--- /dev/null
+++ b/saiadmin-artd/src/components/core/base/art-back-to-top/index.vue
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/base/art-logo/index.vue b/saiadmin-artd/src/components/core/base/art-logo/index.vue
new file mode 100644
index 0000000..505f71c
--- /dev/null
+++ b/saiadmin-artd/src/components/core/base/art-logo/index.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/base/art-svg-icon/index.vue b/saiadmin-artd/src/components/core/base/art-svg-icon/index.vue
new file mode 100644
index 0000000..0bfcd0c
--- /dev/null
+++ b/saiadmin-artd/src/components/core/base/art-svg-icon/index.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/cards/art-bar-chart-card/index.vue b/saiadmin-artd/src/components/core/cards/art-bar-chart-card/index.vue
new file mode 100644
index 0000000..6815c2b
--- /dev/null
+++ b/saiadmin-artd/src/components/core/cards/art-bar-chart-card/index.vue
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+ {{ value }}
+
+
{{ label }}
+
+
+ {{ percentage > 0 ? '+' : '' }}{{ percentage }}%
+
+
+ {{ date }}
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/cards/art-data-list-card/index.vue b/saiadmin-artd/src/components/core/cards/art-data-list-card/index.vue
new file mode 100644
index 0000000..fc43323
--- /dev/null
+++ b/saiadmin-artd/src/components/core/cards/art-data-list-card/index.vue
@@ -0,0 +1,74 @@
+
+
+
+
+
{{ title }}
+
{{ subtitle }}
+
+
+
+
+
+
{{ item.title }}
+
{{ item.status }}
+
+
{{ item.time }}
+
+
+
查看更多
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/cards/art-donut-chart-card/index.vue b/saiadmin-artd/src/components/core/cards/art-donut-chart-card/index.vue
new file mode 100644
index 0000000..df2dcbb
--- /dev/null
+++ b/saiadmin-artd/src/components/core/cards/art-donut-chart-card/index.vue
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+ {{ title }}
+
+
+
+ {{ formatNumber(value) }}
+
+
+ {{ percentage > 0 ? '+' : '' }}{{ percentage }}%
+ {{ percentageLabel }}
+
+
+
+
+
+
+ {{ previousValue }}
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/cards/art-image-card/index.vue b/saiadmin-artd/src/components/core/cards/art-image-card/index.vue
new file mode 100644
index 0000000..d27fe00
--- /dev/null
+++ b/saiadmin-artd/src/components/core/cards/art-image-card/index.vue
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ props.readTime }} 阅读
+
+
+
+
+
+ {{ props.category }}
+
+
{{ props.title }}
+
+
+
+ {{ props.views }}
+
+
+
+ {{ props.comments }}
+
+ {{ props.date }}
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/cards/art-line-chart-card/index.vue b/saiadmin-artd/src/components/core/cards/art-line-chart-card/index.vue
new file mode 100644
index 0000000..e58c9b2
--- /dev/null
+++ b/saiadmin-artd/src/components/core/cards/art-line-chart-card/index.vue
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+ {{ value }}
+
+
{{ label }}
+
+
+ {{ percentage > 0 ? '+' : '' }}{{ percentage }}%
+
+
+ {{ date }}
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/cards/art-progress-card/index.vue b/saiadmin-artd/src/components/core/cards/art-progress-card/index.vue
new file mode 100644
index 0000000..048a836
--- /dev/null
+++ b/saiadmin-artd/src/components/core/cards/art-progress-card/index.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/cards/art-stats-card/index.vue b/saiadmin-artd/src/components/core/cards/art-stats-card/index.vue
new file mode 100644
index 0000000..8e0341b
--- /dev/null
+++ b/saiadmin-artd/src/components/core/cards/art-stats-card/index.vue
@@ -0,0 +1,67 @@
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/cards/art-timeline-list-card/index.vue b/saiadmin-artd/src/components/core/cards/art-timeline-list-card/index.vue
new file mode 100644
index 0000000..fbb2c78
--- /dev/null
+++ b/saiadmin-artd/src/components/core/cards/art-timeline-list-card/index.vue
@@ -0,0 +1,69 @@
+
+
+
+
+
{{ title }}
+
{{ subtitle }}
+
+
+
+
+
+
+ {{ item.content }}
+ #{{ item.code }}
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/charts/art-bar-chart/index.vue b/saiadmin-artd/src/components/core/charts/art-bar-chart/index.vue
new file mode 100644
index 0000000..d677196
--- /dev/null
+++ b/saiadmin-artd/src/components/core/charts/art-bar-chart/index.vue
@@ -0,0 +1,203 @@
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/charts/art-dual-bar-compare-chart/index.vue b/saiadmin-artd/src/components/core/charts/art-dual-bar-compare-chart/index.vue
new file mode 100644
index 0000000..32aa60f
--- /dev/null
+++ b/saiadmin-artd/src/components/core/charts/art-dual-bar-compare-chart/index.vue
@@ -0,0 +1,195 @@
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/charts/art-h-bar-chart/index.vue b/saiadmin-artd/src/components/core/charts/art-h-bar-chart/index.vue
new file mode 100644
index 0000000..2e34759
--- /dev/null
+++ b/saiadmin-artd/src/components/core/charts/art-h-bar-chart/index.vue
@@ -0,0 +1,208 @@
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/charts/art-k-line-chart/index.vue b/saiadmin-artd/src/components/core/charts/art-k-line-chart/index.vue
new file mode 100644
index 0000000..0061b51
--- /dev/null
+++ b/saiadmin-artd/src/components/core/charts/art-k-line-chart/index.vue
@@ -0,0 +1,152 @@
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/charts/art-line-chart/index.vue b/saiadmin-artd/src/components/core/charts/art-line-chart/index.vue
new file mode 100644
index 0000000..b70c2c3
--- /dev/null
+++ b/saiadmin-artd/src/components/core/charts/art-line-chart/index.vue
@@ -0,0 +1,371 @@
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/charts/art-radar-chart/index.vue b/saiadmin-artd/src/components/core/charts/art-radar-chart/index.vue
new file mode 100644
index 0000000..e99fff6
--- /dev/null
+++ b/saiadmin-artd/src/components/core/charts/art-radar-chart/index.vue
@@ -0,0 +1,105 @@
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/charts/art-ring-chart/index.vue b/saiadmin-artd/src/components/core/charts/art-ring-chart/index.vue
new file mode 100644
index 0000000..79115f7
--- /dev/null
+++ b/saiadmin-artd/src/components/core/charts/art-ring-chart/index.vue
@@ -0,0 +1,133 @@
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/charts/art-scatter-chart/index.vue b/saiadmin-artd/src/components/core/charts/art-scatter-chart/index.vue
new file mode 100644
index 0000000..995b56a
--- /dev/null
+++ b/saiadmin-artd/src/components/core/charts/art-scatter-chart/index.vue
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/forms/art-button-more/index.vue b/saiadmin-artd/src/components/core/forms/art-button-more/index.vue
new file mode 100644
index 0000000..858d305
--- /dev/null
+++ b/saiadmin-artd/src/components/core/forms/art-button-more/index.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/forms/art-button-table/index.vue b/saiadmin-artd/src/components/core/forms/art-button-table/index.vue
new file mode 100644
index 0000000..c849901
--- /dev/null
+++ b/saiadmin-artd/src/components/core/forms/art-button-table/index.vue
@@ -0,0 +1,59 @@
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/forms/art-drag-verify/index.vue b/saiadmin-artd/src/components/core/forms/art-drag-verify/index.vue
new file mode 100644
index 0000000..5306e04
--- /dev/null
+++ b/saiadmin-artd/src/components/core/forms/art-drag-verify/index.vue
@@ -0,0 +1,430 @@
+
+
+
+
+
+
+
+
+
+
+ {{ message }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/forms/art-excel-export/index.vue b/saiadmin-artd/src/components/core/forms/art-excel-export/index.vue
new file mode 100644
index 0000000..08207c2
--- /dev/null
+++ b/saiadmin-artd/src/components/core/forms/art-excel-export/index.vue
@@ -0,0 +1,389 @@
+
+
+
+
+
+
+
+ {{ loadingText }}
+
+ {{ buttonText }}
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/forms/art-excel-import/index.vue b/saiadmin-artd/src/components/core/forms/art-excel-import/index.vue
new file mode 100644
index 0000000..8aa82fe
--- /dev/null
+++ b/saiadmin-artd/src/components/core/forms/art-excel-import/index.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+ 导入 Excel
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/forms/art-form/index.vue b/saiadmin-artd/src/components/core/forms/art-form/index.vue
new file mode 100644
index 0000000..1e76f14
--- /dev/null
+++ b/saiadmin-artd/src/components/core/forms/art-form/index.vue
@@ -0,0 +1,311 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('table.form.reset') }}
+
+
+ {{ t('table.form.submit') }}
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/forms/art-search-bar/index.vue b/saiadmin-artd/src/components/core/forms/art-search-bar/index.vue
new file mode 100644
index 0000000..b25b5bb
--- /dev/null
+++ b/saiadmin-artd/src/components/core/forms/art-search-bar/index.vue
@@ -0,0 +1,437 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/forms/art-wang-editor/index.vue b/saiadmin-artd/src/components/core/forms/art-wang-editor/index.vue
new file mode 100644
index 0000000..cfc457e
--- /dev/null
+++ b/saiadmin-artd/src/components/core/forms/art-wang-editor/index.vue
@@ -0,0 +1,219 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/forms/art-wang-editor/style.scss b/saiadmin-artd/src/components/core/forms/art-wang-editor/style.scss
new file mode 100644
index 0000000..fd5dbca
--- /dev/null
+++ b/saiadmin-artd/src/components/core/forms/art-wang-editor/style.scss
@@ -0,0 +1,210 @@
+$box-radius: calc(var(--custom-radius) / 3 + 2px);
+
+// 全屏容器 z-index 调整
+.w-e-full-screen-container {
+ z-index: 100 !important;
+}
+
+/* 编辑器容器 */
+.editor-wrapper {
+ width: 100%;
+ height: 100%;
+ border: 1px solid var(--art-gray-300);
+ border-radius: $box-radius !important;
+
+ .w-e-bar {
+ border-radius: $box-radius $box-radius 0 0 !important;
+ }
+
+ .menu-item {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+
+ i {
+ margin-right: 5px;
+ }
+ }
+
+ /* 工具栏 */
+ .editor-toolbar {
+ border-bottom: 1px solid var(--default-border);
+ }
+
+ /* 下拉选择框配置 */
+ .w-e-select-list {
+ min-width: 140px;
+ padding: 5px 10px 10px;
+ border: none;
+ border-radius: $box-radius;
+ }
+
+ /* 下拉选择框元素配置 */
+ .w-e-select-list ul li {
+ margin-top: 5px;
+ font-size: 15px !important;
+ border-radius: $box-radius;
+ }
+
+ /* 下拉选择框 正文文字大小调整 */
+ .w-e-select-list ul li:last-of-type {
+ font-size: 16px !important;
+ }
+
+ /* 下拉选择框 hover 样式调整 */
+ .w-e-select-list ul li:hover {
+ background-color: var(--art-gray-200);
+ }
+
+ :root {
+ /* 激活颜色 */
+ --w-e-toolbar-active-bg-color: var(--art-gray-200);
+
+ /* toolbar 图标和文字颜色 */
+ --w-e-toolbar-color: #000;
+
+ /* 表格选中时候的边框颜色 */
+ --w-e-textarea-selected-border-color: #ddd;
+
+ /* 表格头背景颜色 */
+ --w-e-textarea-slight-bg-color: var(--art-gray-200);
+ }
+
+ /* 工具栏按钮样式 */
+ .w-e-bar-item svg {
+ fill: var(--art-gray-800);
+ }
+
+ .w-e-bar-item button {
+ color: var(--art-gray-800);
+ border-radius: $box-radius;
+ }
+
+ /* 工具栏 hover 按钮背景颜色 */
+ .w-e-bar-item button:hover {
+ background-color: var(--art-gray-200);
+ }
+
+ /* 工具栏分割线 */
+ .w-e-bar-divider {
+ height: 20px;
+ margin-top: 10px;
+ background-color: #ccc;
+ }
+
+ /* 工具栏菜单 */
+ .w-e-bar-item-group .w-e-bar-item-menus-container {
+ min-width: 120px;
+ padding: 10px 0;
+ border: none;
+ border-radius: $box-radius;
+
+ .w-e-bar-item {
+ button {
+ width: 100%;
+ margin: 0 5px;
+ }
+ }
+ }
+
+ /* 代码块 */
+ .w-e-text-container [data-slate-editor] pre > code {
+ padding: 0.6rem 1rem;
+ background-color: var(--art-gray-50);
+ border-radius: $box-radius;
+ }
+
+ /* 弹出框 */
+ .w-e-drop-panel {
+ border: 0;
+ border-radius: $box-radius;
+ }
+
+ a {
+ color: #318ef4;
+ }
+
+ .w-e-text-container {
+ strong,
+ b {
+ font-weight: 500;
+ }
+
+ i,
+ em {
+ font-style: italic;
+ }
+ }
+
+ /* 表格样式优化 */
+ .w-e-text-container [data-slate-editor] .table-container th {
+ border-right: none;
+ }
+
+ .w-e-text-container [data-slate-editor] .table-container th:last-of-type {
+ border-right: 1px solid #ccc !important;
+ }
+
+ /* 引用 */
+ .w-e-text-container [data-slate-editor] blockquote {
+ background-color: var(--art-gray-200);
+ border-left: 4px solid var(--art-gray-300);
+ }
+
+ /* 输入区域弹出 bar */
+ .w-e-hover-bar {
+ border-radius: $box-radius;
+ }
+
+ /* 超链接弹窗 */
+ .w-e-modal {
+ border: none;
+ border-radius: $box-radius;
+ }
+
+ /* 图片样式调整 */
+ .w-e-text-container [data-slate-editor] .w-e-selected-image-container {
+ overflow: inherit;
+
+ &:hover {
+ border: 0;
+ }
+
+ img {
+ border: 1px solid transparent;
+ transition: border 0.3s;
+
+ &:hover {
+ border: 1px solid #318ef4 !important;
+ }
+ }
+
+ .w-e-image-dragger {
+ width: 12px;
+ height: 12px;
+ background-color: #318ef4;
+ border: 2px solid #fff;
+ border-radius: $box-radius;
+ }
+
+ .left-top {
+ top: -6px;
+ left: -6px;
+ }
+
+ .right-top {
+ top: -6px;
+ right: -6px;
+ }
+
+ .left-bottom {
+ bottom: -6px;
+ left: -6px;
+ }
+
+ .right-bottom {
+ right: -6px;
+ bottom: -6px;
+ }
+ }
+}
diff --git a/saiadmin-artd/src/components/core/layouts/art-breadcrumb/index.vue b/saiadmin-artd/src/components/core/layouts/art-breadcrumb/index.vue
new file mode 100644
index 0000000..4b54859
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-breadcrumb/index.vue
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-chat-window/index.vue b/saiadmin-artd/src/components/core/layouts/art-chat-window/index.vue
new file mode 100644
index 0000000..f3d9471
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-chat-window/index.vue
@@ -0,0 +1,262 @@
+
+
+
+
+
+
+
Art Bot
+
+
+
{{ isOnline ? '在线' : '离线' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-fast-enter/index.vue b/saiadmin-artd/src/components/core/layouts/art-fast-enter/index.vue
new file mode 100644
index 0000000..fdde222
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-fast-enter/index.vue
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ application.name }}
+
{{ application.description }}
+
+
+
+
+
+
+
快速链接
+
+
+ {{ quickLink.name }}
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-fireworks-effect/index.vue b/saiadmin-artd/src/components/core/layouts/art-fireworks-effect/index.vue
new file mode 100644
index 0000000..be85274
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-fireworks-effect/index.vue
@@ -0,0 +1,633 @@
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-global-component/index.vue b/saiadmin-artd/src/components/core/layouts/art-global-component/index.vue
new file mode 100644
index 0000000..6908f94
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-global-component/index.vue
@@ -0,0 +1,14 @@
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-global-search/index.vue b/saiadmin-artd/src/components/core/layouts/art-global-search/index.vue
new file mode 100644
index 0000000..a7d88df
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-global-search/index.vue
@@ -0,0 +1,426 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ formatMenuTitle(item.meta.title) }}
+
+
+
+
+
+
+
{{ $t('search.historyTitle') }}
+
+
+ {{ formatMenuTitle(item.meta.title) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-header-bar/index.vue b/saiadmin-artd/src/components/core/layouts/art-header-bar/index.vue
new file mode 100644
index 0000000..41d0f7a
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-header-bar/index.vue
@@ -0,0 +1,485 @@
+
+
+
+
+
+
+
+
+
{{ AppConfig.systemInfo.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ $t('topBar.search.title') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('topBar.guide.title')
+ }} {{ $t('topBar.guide.theme') }} 、 {{ $t('topBar.guide.menu') }} {{ $t('topBar.guide.description') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-header-bar/widget/ArtUserMenu.vue b/saiadmin-artd/src/components/core/layouts/art-header-bar/widget/ArtUserMenu.vue
new file mode 100644
index 0000000..fd7c0cb
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-header-bar/widget/ArtUserMenu.vue
@@ -0,0 +1,156 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ userInfo.username
+ }}
+ {{ userInfo.email }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-menus/art-horizontal-menu/index.vue b/saiadmin-artd/src/components/core/layouts/art-menus/art-horizontal-menu/index.vue
new file mode 100644
index 0000000..edd1473
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-menus/art-horizontal-menu/index.vue
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-menus/art-horizontal-menu/widget/HorizontalSubmenu.vue b/saiadmin-artd/src/components/core/layouts/art-menus/art-horizontal-menu/widget/HorizontalSubmenu.vue
new file mode 100644
index 0000000..ff32c1e
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-menus/art-horizontal-menu/widget/HorizontalSubmenu.vue
@@ -0,0 +1,95 @@
+
+
+
+
+ {{ formatMenuTitle(item.meta.title) }}
+
+
+ {{ item.meta.showTextBadge }}
+
+
+
+
+
+
+
+
+
+ {{ formatMenuTitle(item.meta.title) }}
+
+
+ {{ item.meta.showTextBadge }}
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-menus/art-mixed-menu/index.vue b/saiadmin-artd/src/components/core/layouts/art-menus/art-mixed-menu/index.vue
new file mode 100644
index 0000000..4e98246
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-menus/art-mixed-menu/index.vue
@@ -0,0 +1,279 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue b/saiadmin-artd/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue
new file mode 100644
index 0000000..39387dc
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue
@@ -0,0 +1,355 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-menus/art-sidebar-menu/style.scss b/saiadmin-artd/src/components/core/layouts/art-menus/art-sidebar-menu/style.scss
new file mode 100644
index 0000000..b98011c
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-menus/art-sidebar-menu/style.scss
@@ -0,0 +1,253 @@
+.layout-sidebar {
+ display: flex;
+ height: 100vh;
+ user-select: none;
+ scrollbar-width: none;
+ border-right: 1px solid var(--art-card-border);
+
+ &.no-border {
+ border-right: none !important;
+ }
+
+ // 自定义滚动条宽度
+ :deep(.el-scrollbar__bar.is-vertical) {
+ width: 4px;
+ }
+
+ :deep(.el-scrollbar__thumb) {
+ right: -2px;
+ background-color: #ccc;
+ border-radius: 2px;
+ }
+
+ .dual-menu-left {
+ position: relative;
+ width: 80px;
+ height: 100%;
+ border-right: 1px solid var(--art-card-border) !important;
+ transition: width 0.25s;
+
+ .logo {
+ margin: auto;
+ margin-top: 12px;
+ margin-bottom: 3px;
+ cursor: pointer;
+ }
+
+ ul {
+ li {
+ > div {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ margin: 8px;
+ overflow: hidden;
+ text-align: center;
+ cursor: pointer;
+ border-radius: 5px;
+
+ .art-svg-icon {
+ display: block;
+ margin: 0 auto;
+ font-size: 20px;
+ }
+
+ span {
+ display: -webkit-box;
+ width: 100%;
+ overflow: hidden;
+ font-size: 12px;
+ text-overflow: ellipsis;
+ -webkit-line-clamp: 1;
+ line-clamp: 1;
+ -webkit-box-orient: vertical;
+ }
+
+ &.is-active {
+ background: var(--el-color-primary-light-9);
+
+ .art-svg-icon,
+ span {
+ color: var(--theme-color) !important;
+ }
+ }
+ }
+ }
+ }
+
+ .switch-btn {
+ position: absolute;
+ right: 0;
+ bottom: 15px;
+ left: 0;
+ margin: auto;
+ }
+ }
+
+ .menu-left {
+ position: relative;
+ box-sizing: border-box;
+ height: 100vh;
+
+ @media only screen and (width <= 640px) {
+ height: 100dvh;
+ }
+
+ .el-menu {
+ height: 100%;
+ }
+
+ &:hover {
+ .dual-menu-collapse-btn {
+ opacity: 1 !important;
+ }
+ }
+
+ .dual-menu-collapse-btn {
+ position: absolute;
+ top: 50%;
+ right: -11px;
+ z-index: 10;
+ width: 11px;
+ height: 50px;
+ cursor: pointer;
+ background-color: var(--default-box-color);
+ border: 1px solid var(--art-card-border);
+ border-radius: 0 15px 15px 0;
+ opacity: 0;
+ transition: opacity 0.2s;
+ transform: translateY(-50%);
+
+ &:hover {
+ .art-svg-icon {
+ color: var(--art-gray-800) !important;
+ }
+ }
+
+ .art-svg-icon {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: -4px;
+ margin: auto;
+ transition: all 0.3s;
+ }
+ }
+ }
+
+ .header {
+ position: relative;
+ box-sizing: border-box;
+ display: flex;
+ align-items: center;
+ width: 100%;
+ height: 60px;
+ overflow: hidden;
+ line-height: 60px;
+ cursor: pointer;
+
+ .logo {
+ margin-left: 22px;
+ }
+
+ p {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 58px;
+ box-sizing: border-box;
+ margin-left: 10px;
+ font-size: 18px;
+
+ &.is-dual-menu-name {
+ left: 25px;
+ margin: auto;
+ }
+ }
+ }
+
+ .el-menu {
+ box-sizing: border-box;
+ height: calc(100vh - 60px);
+ overflow-y: auto;
+ // 防止菜单内的滚动影响整个页面滚动
+ overscroll-behavior: contain;
+ border-right: 0;
+ scrollbar-width: none;
+ -ms-scroll-chaining: contain;
+
+ &::-webkit-scrollbar {
+ width: 0 !important;
+ }
+ }
+
+ .menu-model {
+ display: none;
+ }
+}
+
+@media only screen and (width <= 800px) {
+ .layout-sidebar {
+ width: 0;
+
+ .header {
+ height: 50px;
+ line-height: 50px;
+ }
+
+ .el-menu {
+ height: calc(100vh - 60px);
+ }
+
+ .el-menu--collapse {
+ width: 0;
+ }
+
+ // 折叠状态下的header样式
+ .menu-left-close .header {
+ .logo {
+ display: none;
+ }
+
+ p {
+ left: 16px;
+ font-size: 0;
+ opacity: 0 !important;
+ }
+ }
+
+ .menu-model {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: -1;
+ display: block;
+ width: 100%;
+ height: 100vh;
+ background: rgba($color: #000, $alpha: 50%);
+ transition: opacity 0.2s ease-in-out;
+ }
+ }
+}
+
+@media only screen and (width <= 640px) {
+ .layout-sidebar {
+ border-right: 0 !important;
+ }
+}
+
+.dark {
+ .layout-sidebar {
+ border-right: 1px solid rgb(255 255 255 / 13%);
+
+ :deep(.el-scrollbar__thumb) {
+ background-color: #777;
+ }
+
+ .dual-menu-left {
+ border-right: 1px solid rgb(255 255 255 / 9%) !important;
+ }
+ }
+}
diff --git a/saiadmin-artd/src/components/core/layouts/art-menus/art-sidebar-menu/theme.scss b/saiadmin-artd/src/components/core/layouts/art-menus/art-sidebar-menu/theme.scss
new file mode 100644
index 0000000..7626c42
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-menus/art-sidebar-menu/theme.scss
@@ -0,0 +1,258 @@
+@use '@styles/core/mixin.scss' as *;
+
+// 菜单样式变量
+$menu-height: 42px;
+$menu-icon-size: 20px;
+$menu-font-size: 14px;
+$hover-bg-color: var(--art-gray-200);
+$popup-menu-height: 40px;
+$popup-menu-padding: 8px;
+$popup-menu-margin: 5px;
+$popup-menu-radius: 6px;
+
+// 通用菜单项样式
+@mixin menu-item-base {
+ width: calc(100% - 16px);
+ margin-left: 8px;
+ border-radius: 6px;
+
+ .menu-icon {
+ margin-left: -7px;
+ }
+}
+
+// 通用 hover 样式
+@mixin menu-hover($bg-color) {
+ .el-sub-menu__title:hover,
+ .el-menu-item:not(.is-active):hover {
+ background: $bg-color !important;
+ }
+}
+
+// 通用选中样式
+@mixin menu-active($color, $bg-color, $icon-color: var(--theme-color)) {
+ .el-menu-item.is-active {
+ color: $color !important;
+ background-color: $bg-color;
+
+ .menu-icon {
+ .art-svg-icon {
+ color: $icon-color !important;
+ }
+ }
+ }
+}
+
+// 弹窗菜单项样式
+@mixin popup-menu-item {
+ height: $popup-menu-height;
+ margin-bottom: $popup-menu-margin;
+ border-radius: $popup-menu-radius;
+
+ .menu-icon {
+ margin-right: 5px;
+ }
+
+ &:last-of-type {
+ margin-bottom: 0;
+ }
+}
+
+// 主题菜单通用样式(合并 design 和 dark 主题的共同逻辑)
+@mixin theme-menu-base {
+ .el-sub-menu__title,
+ .el-menu-item {
+ @include menu-item-base;
+ }
+}
+
+// 弹窗菜单通用样式
+@mixin popup-menu-base($hover-bg, $active-color, $active-bg) {
+ .el-menu--popup {
+ padding: $popup-menu-padding;
+
+ .el-sub-menu__title:hover,
+ .el-menu-item:hover {
+ background-color: $hover-bg !important;
+ border-radius: $popup-menu-radius;
+ }
+
+ .el-menu-item {
+ @include popup-menu-item;
+
+ &.is-active {
+ color: $active-color !important;
+ background-color: $active-bg !important;
+ }
+ }
+
+ .el-sub-menu {
+ @include popup-menu-item;
+
+ height: $popup-menu-height !important;
+
+ .el-sub-menu__title {
+ height: $popup-menu-height !important;
+ border-radius: $popup-menu-radius;
+ }
+ }
+ }
+}
+
+.layout-sidebar {
+ // ---------------------- Modify default style ----------------------
+
+ // 菜单折叠样式
+ .menu-left-close {
+ .header {
+ .logo {
+ margin: 0 auto;
+ }
+ }
+ }
+
+ // 菜单图标
+ .menu-icon {
+ margin-right: 8px;
+ font-size: $menu-icon-size;
+ }
+
+ // 菜单高度
+ .el-sub-menu__title,
+ .el-menu-item {
+ height: $menu-height !important;
+ margin-bottom: 4px;
+ line-height: $menu-height !important;
+
+ span {
+ font-size: $menu-font-size !important;
+
+ @include ellipsis();
+ }
+ }
+
+ // 右侧箭头
+ .el-sub-menu__icon-arrow {
+ width: 13px !important;
+ font-size: 13px !important;
+ }
+
+ // 菜单折叠
+ .el-menu--collapse {
+ .el-sub-menu.is-active {
+ .el-sub-menu__title {
+ .menu-icon {
+ .art-svg-icon {
+ // 选中菜单图标颜色
+ color: var(--theme-color) !important;
+ }
+ }
+ }
+ }
+ }
+
+ // ---------------------- Design theme menu ----------------------
+ .el-menu-design {
+ @include theme-menu-base;
+ @include menu-active(var(--theme-color), var(--el-color-primary-light-9));
+ @include menu-hover($hover-bg-color);
+
+ .el-sub-menu__icon-arrow {
+ color: var(--art-gray-600);
+ }
+ }
+
+ // ---------------------- Dark theme menu ----------------------
+ .el-menu-dark {
+ @include theme-menu-base;
+ @include menu-active(#fff, #27282d, #fff);
+ @include menu-hover(#0f1015);
+
+ .el-sub-menu__icon-arrow {
+ color: var(--art-gray-400);
+ }
+ }
+
+ // ---------------------- Light theme menu ----------------------
+ .el-menu-light {
+ .el-sub-menu__title,
+ .el-menu-item {
+ .menu-icon {
+ margin-left: 1px;
+ }
+ }
+
+ .el-menu-item.is-active {
+ background-color: var(--el-color-primary-light-9);
+
+ .art-svg-icon {
+ color: var(--theme-color) !important;
+ }
+
+ &::before {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 4px;
+ height: 100%;
+ content: '';
+ background: var(--theme-color);
+ }
+ }
+
+ @include menu-hover($hover-bg-color);
+
+ .el-sub-menu__icon-arrow {
+ color: var(--art-gray-600);
+ }
+ }
+}
+
+@media only screen and (width <= 640px) {
+ .layout-sidebar {
+ .el-menu-design {
+ > .el-sub-menu {
+ margin-left: 0;
+ }
+
+ .el-sub-menu {
+ width: 100% !important;
+ }
+ }
+ }
+}
+
+// 菜单折叠 hover 弹窗样式(浅色主题)
+.el-menu--vertical,
+.el-menu--popup-container {
+ @include popup-menu-base(var(--art-gray-200), var(--art-gray-900), var(--art-gray-200));
+}
+
+// 暗黑模式菜单样式
+.dark {
+ .el-menu--vertical,
+ .el-menu--popup-container {
+ @include popup-menu-base(var(--art-gray-200), var(--art-gray-900), #292a2e);
+ }
+
+ .layout-sidebar {
+ // 图标颜色、文字颜色
+ .menu-icon .art-svg-icon,
+ .menu-name {
+ color: var(--art-gray-800) !important;
+ }
+
+ // 选中的文字颜色跟图标颜色
+ .el-menu-item.is-active {
+ span,
+ .menu-icon .art-svg-icon {
+ color: var(--theme-color) !important;
+ }
+ }
+
+ // 右侧箭头颜色
+ .el-sub-menu__icon-arrow {
+ color: #fff;
+ }
+ }
+}
diff --git a/saiadmin-artd/src/components/core/layouts/art-menus/art-sidebar-menu/widget/SidebarSubmenu.vue b/saiadmin-artd/src/components/core/layouts/art-menus/art-sidebar-menu/widget/SidebarSubmenu.vue
new file mode 100644
index 0000000..a7ac6a9
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-menus/art-sidebar-menu/widget/SidebarSubmenu.vue
@@ -0,0 +1,188 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.meta.showTextBadge }}
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-notification/index.vue b/saiadmin-artd/src/components/core/layouts/art-notification/index.vue
new file mode 100644
index 0000000..a58853c
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-notification/index.vue
@@ -0,0 +1,456 @@
+
+
+
+
+ {{ $t('notice.title') }}
+
+ {{ $t('notice.btnRead') }}
+
+
+
+
+
+ {{ item.name }} ({{ item.num }})
+
+
+
+
+
+
+
+
+ {{ $t('notice.viewAll') }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-page-content/index.vue b/saiadmin-artd/src/components/core/layouts/art-page-content/index.vue
new file mode 100644
index 0000000..a862df1
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-page-content/index.vue
@@ -0,0 +1,136 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-screen-lock/index.vue b/saiadmin-artd/src/components/core/layouts/art-screen-lock/index.vue
new file mode 100644
index 0000000..581f7ee
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-screen-lock/index.vue
@@ -0,0 +1,519 @@
+
+
+
+
+
+
+
🔒
+
系统已锁定
+
+ 检测到开发者工具已打开
+ 为了系统安全,请关闭开发者工具后继续使用
+
+
Security Lock Activated
+
+
+
+
+
+
+
+
+
{{ userInfo.username }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('lockScreen.lock.btnText') }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ userInfo.username }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('lockScreen.unlock.btnText') }}
+
+
+
+ {{ $t('lockScreen.unlock.backBtnText') }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-settings-panel/composables/useSettingsConfig.ts b/saiadmin-artd/src/components/core/layouts/art-settings-panel/composables/useSettingsConfig.ts
new file mode 100644
index 0000000..35e8066
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-settings-panel/composables/useSettingsConfig.ts
@@ -0,0 +1,248 @@
+import { computed } from 'vue'
+import { useI18n } from 'vue-i18n'
+import { ContainerWidthEnum } from '@/enums/appEnum'
+import AppConfig from '@/config'
+import { headerBarConfig } from '@/config/modules/headerBar'
+
+/**
+ * 设置项配置选项管理
+ */
+export function useSettingsConfig() {
+ const { t } = useI18n()
+
+ // 标签页风格选项
+ const tabStyleOptions = computed(() => [
+ {
+ value: 'tab-default',
+ label: t('setting.tabStyle.default')
+ },
+ {
+ value: 'tab-card',
+ label: t('setting.tabStyle.card')
+ },
+ {
+ value: 'tab-google',
+ label: t('setting.tabStyle.google')
+ }
+ ])
+
+ // 页面切换动画选项
+ const pageTransitionOptions = computed(() => [
+ {
+ value: '',
+ label: t('setting.transition.list.none')
+ },
+ {
+ value: 'fade',
+ label: t('setting.transition.list.fade')
+ },
+ {
+ value: 'slide-left',
+ label: t('setting.transition.list.slideLeft')
+ },
+ {
+ value: 'slide-bottom',
+ label: t('setting.transition.list.slideBottom')
+ },
+ {
+ value: 'slide-top',
+ label: t('setting.transition.list.slideTop')
+ }
+ ])
+
+ // 圆角大小选项
+ const customRadiusOptions = [
+ { value: '0', label: '0' },
+ { value: '0.25', label: '0.25' },
+ { value: '0.5', label: '0.5' },
+ { value: '0.75', label: '0.75' },
+ { value: '1', label: '1' }
+ ]
+
+ // 容器宽度选项
+ const containerWidthOptions = computed(() => [
+ {
+ value: ContainerWidthEnum.FULL,
+ label: t('setting.container.list[0]'),
+ icon: 'icon-park-outline:auto-width'
+ },
+ {
+ value: ContainerWidthEnum.BOXED,
+ label: t('setting.container.list[1]'),
+ icon: 'ix:width'
+ }
+ ])
+
+ // 盒子样式选项
+ const boxStyleOptions = computed(() => [
+ {
+ value: 'border-mode',
+ label: t('setting.box.list[0]'),
+ type: 'border-mode' as const
+ },
+ {
+ value: 'shadow-mode',
+ label: t('setting.box.list[1]'),
+ type: 'shadow-mode' as const
+ }
+ ])
+
+ // 从配置文件获取的选项
+ const configOptions = {
+ // 主题色彩选项
+ mainColors: AppConfig.systemMainColor,
+
+ // 主题风格选项
+ themeList: AppConfig.settingThemeList,
+
+ // 菜单布局选项
+ menuLayoutList: AppConfig.menuLayoutList
+ }
+
+ // 基础设置项配置
+ const basicSettingsConfig = computed(() => {
+ // 定义所有基础设置项
+ const allSettings = [
+ {
+ key: 'showWorkTab',
+ label: t('setting.basics.list.multiTab'),
+ type: 'switch' as const,
+ handler: 'workTab',
+ headerBarKey: null // 不依赖headerBar配置
+ },
+ {
+ key: 'uniqueOpened',
+ label: t('setting.basics.list.accordion'),
+ type: 'switch' as const,
+ handler: 'uniqueOpened',
+ headerBarKey: null // 不依赖headerBar配置
+ },
+ {
+ key: 'showMenuButton',
+ label: t('setting.basics.list.collapseSidebar'),
+ type: 'switch' as const,
+ handler: 'menuButton',
+ headerBarKey: 'menuButton' as const
+ },
+ {
+ key: 'showFastEnter',
+ label: t('setting.basics.list.fastEnter'),
+ type: 'switch' as const,
+ handler: 'fastEnter',
+ headerBarKey: 'fastEnter' as const
+ },
+ {
+ key: 'showRefreshButton',
+ label: t('setting.basics.list.reloadPage'),
+ type: 'switch' as const,
+ handler: 'refreshButton',
+ headerBarKey: 'refreshButton' as const
+ },
+ {
+ key: 'showCrumbs',
+ label: t('setting.basics.list.breadcrumb'),
+ type: 'switch' as const,
+ handler: 'crumbs',
+ mobileHide: true,
+ headerBarKey: 'breadcrumb' as const
+ },
+ {
+ key: 'showLanguage',
+ label: t('setting.basics.list.language'),
+ type: 'switch' as const,
+ handler: 'language',
+ headerBarKey: 'language' as const
+ },
+ {
+ key: 'showNprogress',
+ label: t('setting.basics.list.progressBar'),
+ type: 'switch' as const,
+ handler: 'nprogress',
+ headerBarKey: null // 不依赖headerBar配置
+ },
+ {
+ key: 'colorWeak',
+ label: t('setting.basics.list.weakMode'),
+ type: 'switch' as const,
+ handler: 'colorWeak',
+ headerBarKey: null // 不依赖headerBar配置
+ },
+ {
+ key: 'watermarkVisible',
+ label: t('setting.basics.list.watermark'),
+ type: 'switch' as const,
+ handler: 'watermark',
+ headerBarKey: null // 不依赖headerBar配置
+ },
+ {
+ key: 'menuOpenWidth',
+ label: t('setting.basics.list.menuWidth'),
+ type: 'input-number' as const,
+ handler: 'menuOpenWidth',
+ min: 180,
+ max: 320,
+ step: 10,
+ style: { width: '120px' },
+ controlsPosition: 'right' as const,
+ headerBarKey: null // 不依赖headerBar配置
+ },
+ {
+ key: 'tabStyle',
+ label: t('setting.basics.list.tabStyle'),
+ type: 'select' as const,
+ handler: 'tabStyle',
+ options: tabStyleOptions.value,
+ style: { width: '120px' },
+ headerBarKey: null // 不依赖headerBar配置
+ },
+ {
+ key: 'pageTransition',
+ label: t('setting.basics.list.pageTransition'),
+ type: 'select' as const,
+ handler: 'pageTransition',
+ options: pageTransitionOptions.value,
+ style: { width: '120px' },
+ headerBarKey: null // 不依赖headerBar配置
+ },
+ {
+ key: 'customRadius',
+ label: t('setting.basics.list.borderRadius'),
+ type: 'select' as const,
+ handler: 'customRadius',
+ options: customRadiusOptions,
+ style: { width: '120px' },
+ headerBarKey: null // 不依赖headerBar配置
+ }
+ ]
+
+ // 根据 headerBarConfig 过滤设置项
+ return (
+ allSettings
+ .filter((setting) => {
+ // 如果设置项不依赖headerBar配置,则始终显示
+ if (setting.headerBarKey === null) {
+ return true
+ }
+
+ // 如果依赖headerBar配置,检查对应的功能是否启用
+ const headerBarFeature = headerBarConfig[setting.headerBarKey]
+ return headerBarFeature?.enabled !== false
+ })
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ .map(({ headerBarKey: _headerBarKey, ...setting }) => setting)
+ )
+ })
+
+ return {
+ // 选项配置
+ tabStyleOptions,
+ pageTransitionOptions,
+ customRadiusOptions,
+ containerWidthOptions,
+ boxStyleOptions,
+ configOptions,
+
+ // 设置项配置
+ basicSettingsConfig
+ }
+}
diff --git a/saiadmin-artd/src/components/core/layouts/art-settings-panel/composables/useSettingsHandlers.ts b/saiadmin-artd/src/components/core/layouts/art-settings-panel/composables/useSettingsHandlers.ts
new file mode 100644
index 0000000..392c690
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-settings-panel/composables/useSettingsHandlers.ts
@@ -0,0 +1,167 @@
+import { useSettingStore } from '@/store/modules/setting'
+import { storeToRefs } from 'pinia'
+import type { ContainerWidthEnum } from '@/enums/appEnum'
+
+/**
+ * 设置项通用处理逻辑
+ */
+export function useSettingsHandlers() {
+ const settingStore = useSettingStore()
+
+ // DOM 操作相关
+ const domOperations = {
+ // 设置HTML类名
+ setHtmlClass: (className: string, add: boolean) => {
+ const el = document.getElementsByTagName('html')[0]
+ if (add) {
+ el.classList.add(className)
+ } else {
+ el.classList.remove(className)
+ }
+ },
+
+ // 设置根元素属性
+ setRootAttribute: (attribute: string, value: string) => {
+ const el = document.documentElement
+ el.setAttribute(attribute, value)
+ },
+
+ // 设置body类名
+ setBodyClass: (className: string, add: boolean) => {
+ const el = document.getElementsByTagName('body')[0]
+ if (add) {
+ el.classList.add(className)
+ } else {
+ el.classList.remove(className)
+ }
+ }
+ }
+
+ // 通用切换处理器
+ const createToggleHandler = (storeMethod: () => void, callback?: () => void) => {
+ return () => {
+ storeMethod()
+ callback?.()
+ }
+ }
+
+ // 通用值变更处理器
+ const createValueHandler = (
+ storeMethod: (value: T) => void,
+ callback?: (value: T) => void
+ ) => {
+ return (value: T) => {
+ if (value !== undefined && value !== null) {
+ storeMethod(value)
+ callback?.(value)
+ }
+ }
+ }
+
+ // 基础设置处理器
+ const basicHandlers = {
+ // 工作台标签页
+ workTab: createToggleHandler(() => settingStore.setWorkTab(!settingStore.showWorkTab)),
+
+ // 菜单手风琴
+ uniqueOpened: createToggleHandler(() => settingStore.setUniqueOpened()),
+
+ // 显示菜单按钮
+ menuButton: createToggleHandler(() => settingStore.setButton()),
+
+ // 显示快速入口
+ fastEnter: createToggleHandler(() => settingStore.setFastEnter()),
+
+ // 显示刷新按钮
+ refreshButton: createToggleHandler(() => settingStore.setShowRefreshButton()),
+
+ // 显示面包屑
+ crumbs: createToggleHandler(() => settingStore.setCrumbs()),
+
+ // 显示语言切换
+ language: createToggleHandler(() => settingStore.setLanguage()),
+
+ // 显示进度条
+ nprogress: createToggleHandler(() => settingStore.setNprogress()),
+
+ // 色弱模式
+ colorWeak: createToggleHandler(
+ () => settingStore.setColorWeak(),
+ () => {
+ domOperations.setHtmlClass('color-weak', settingStore.colorWeak)
+ }
+ ),
+
+ // 水印显示
+ watermark: createToggleHandler(() =>
+ settingStore.setWatermarkVisible(!settingStore.watermarkVisible)
+ ),
+
+ // 菜单展开宽度
+ menuOpenWidth: createValueHandler((width: number) =>
+ settingStore.setMenuOpenWidth(width)
+ ),
+
+ // 标签页风格
+ tabStyle: createValueHandler((style: string) => settingStore.setTabStyle(style)),
+
+ // 页面切换动画
+ pageTransition: createValueHandler((transition: string) =>
+ settingStore.setPageTransition(transition)
+ ),
+
+ // 圆角大小
+ customRadius: createValueHandler((radius: string) =>
+ settingStore.setCustomRadius(radius)
+ )
+ }
+
+ // 盒子样式处理器
+ const boxStyleHandlers = {
+ // 设置盒子模式
+ setBoxMode: (type: 'border-mode' | 'shadow-mode') => {
+ const { boxBorderMode } = storeToRefs(settingStore)
+
+ // 防止重复设置
+ if (
+ (type === 'shadow-mode' && boxBorderMode.value === false) ||
+ (type === 'border-mode' && boxBorderMode.value === true)
+ ) {
+ return
+ }
+
+ setTimeout(() => {
+ domOperations.setRootAttribute('data-box-mode', type)
+ settingStore.setBorderMode()
+ }, 50)
+ }
+ }
+
+ // 颜色设置处理器
+ const colorHandlers = {
+ // 选择主题色
+ selectColor: (theme: string) => {
+ settingStore.setElementTheme(theme)
+ settingStore.reload()
+ }
+ }
+
+ // 容器设置处理器
+ const containerHandlers = {
+ // 设置容器宽度
+ setWidth: (type: ContainerWidthEnum) => {
+ settingStore.setContainerWidth(type)
+ settingStore.reload()
+ }
+ }
+
+ return {
+ domOperations,
+ basicHandlers,
+ boxStyleHandlers,
+ colorHandlers,
+ containerHandlers,
+ createToggleHandler,
+ createValueHandler
+ }
+}
diff --git a/saiadmin-artd/src/components/core/layouts/art-settings-panel/composables/useSettingsPanel.ts b/saiadmin-artd/src/components/core/layouts/art-settings-panel/composables/useSettingsPanel.ts
new file mode 100644
index 0000000..358ef57
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-settings-panel/composables/useSettingsPanel.ts
@@ -0,0 +1,207 @@
+import { ref, computed, watch } from 'vue'
+import { useSettingStore } from '@/store/modules/setting'
+import { storeToRefs } from 'pinia'
+import { useBreakpoints } from '@vueuse/core'
+import AppConfig from '@/config'
+import { SystemThemeEnum, MenuTypeEnum } from '@/enums/appEnum'
+import { mittBus } from '@/utils/sys'
+import { useTheme } from '@/hooks/core/useTheme'
+import { useCeremony } from '@/hooks/core/useCeremony'
+import { useSettingsState } from './useSettingsState'
+import { useSettingsHandlers } from './useSettingsHandlers'
+
+/**
+ * 设置面板核心逻辑管理
+ */
+export function useSettingsPanel() {
+ const settingStore = useSettingStore()
+ const { systemThemeType, systemThemeMode, menuType } = storeToRefs(settingStore)
+
+ // Composables
+ const { openFestival, cleanup } = useCeremony()
+ const { setSystemTheme, setSystemAutoTheme } = useTheme()
+ const { initColorWeak } = useSettingsState()
+ const { domOperations } = useSettingsHandlers()
+
+ // 响应式状态
+ const showDrawer = ref(false)
+
+ // 使用 VueUse breakpoints 优化性能
+ const breakpoints = useBreakpoints({ tablet: 1000 })
+ const isMobile = breakpoints.smaller('tablet')
+
+ // 记录窗口宽度变化前的菜单类型
+ const beforeMenuType = ref()
+ const hasChangedMenu = ref(false)
+
+ // 计算属性
+ const systemThemeColor = computed(() => settingStore.systemThemeColor as string)
+
+ // 主题相关处理
+ const useThemeHandlers = () => {
+ // 初始化系统颜色
+ const initSystemColor = () => {
+ if (!AppConfig.systemMainColor.includes(systemThemeColor.value)) {
+ settingStore.setElementTheme(AppConfig.systemMainColor[0])
+ settingStore.reload()
+ }
+ }
+
+ // 初始化系统主题
+ const initSystemTheme = () => {
+ if (systemThemeMode.value === SystemThemeEnum.AUTO) {
+ setSystemAutoTheme()
+ } else {
+ setSystemTheme(systemThemeType.value)
+ }
+ }
+
+ // 监听系统主题变化
+ const listenerSystemTheme = () => {
+ const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')
+ mediaQuery.addEventListener('change', initSystemTheme)
+ return () => {
+ mediaQuery.removeEventListener('change', initSystemTheme)
+ }
+ }
+
+ return {
+ initSystemColor,
+ initSystemTheme,
+ listenerSystemTheme
+ }
+ }
+
+ // 响应式布局处理
+ const useResponsiveLayout = () => {
+ // 使用 watch 监听断点变化,性能更优
+ const stopWatch = watch(
+ isMobile,
+ (mobile: boolean) => {
+ if (mobile) {
+ // 切换到移动端布局
+ if (!hasChangedMenu.value) {
+ beforeMenuType.value = menuType.value
+ useSettingsState().switchMenuLayouts(MenuTypeEnum.LEFT)
+ settingStore.setMenuOpen(false)
+ hasChangedMenu.value = true
+ }
+ } else {
+ // 恢复桌面端布局
+ if (hasChangedMenu.value && beforeMenuType.value) {
+ useSettingsState().switchMenuLayouts(beforeMenuType.value)
+ settingStore.setMenuOpen(true)
+ hasChangedMenu.value = false
+ }
+ }
+ },
+ { immediate: true }
+ )
+
+ return { stopWatch }
+ }
+
+ // 抽屉控制
+ const useDrawerControl = () => {
+ // 用于存储 setTimeout 的 ID,以便在需要时清除
+ let themeChangeTimer: ReturnType | null = null
+
+ // 打开抽屉
+ const handleOpen = () => {
+ // 清除可能存在的旧定时器
+ if (themeChangeTimer) {
+ clearTimeout(themeChangeTimer)
+ }
+ // 延迟添加 theme-change class,避免抽屉打开动画受影响
+ themeChangeTimer = setTimeout(() => {
+ domOperations.setBodyClass('theme-change', true)
+ themeChangeTimer = null
+ }, 500)
+ }
+
+ // 关闭抽屉
+ const handleClose = () => {
+ // 清除未执行的定时器,防止关闭后才添加 class
+ if (themeChangeTimer) {
+ clearTimeout(themeChangeTimer)
+ themeChangeTimer = null
+ }
+ // 立即移除 theme-change class
+ domOperations.setBodyClass('theme-change', false)
+ }
+
+ // 打开设置
+ const openSetting = () => {
+ showDrawer.value = true
+ }
+
+ // 关闭设置
+ const closeDrawer = () => {
+ showDrawer.value = false
+ }
+
+ return {
+ handleOpen,
+ handleClose,
+ openSetting,
+ closeDrawer
+ }
+ }
+
+ // Props 变化监听
+ const usePropsWatcher = (props: { open?: boolean }) => {
+ watch(
+ () => props.open,
+ (val: boolean | undefined) => {
+ if (val !== undefined) {
+ showDrawer.value = val
+ }
+ }
+ )
+ }
+
+ // 初始化设置
+ const useSettingsInitializer = () => {
+ const themeHandlers = useThemeHandlers()
+ const { openSetting } = useDrawerControl()
+ const { stopWatch } = useResponsiveLayout()
+ let themeCleanup: (() => void) | null = null
+
+ const initializeSettings = () => {
+ mittBus.on('openSetting', openSetting)
+ themeHandlers.initSystemColor()
+ themeCleanup = themeHandlers.listenerSystemTheme()
+ initColorWeak()
+
+ // 设置盒子模式
+ const boxMode = settingStore.boxBorderMode ? 'border-mode' : 'shadow-mode'
+ domOperations.setRootAttribute('data-box-mode', boxMode)
+
+ themeHandlers.initSystemTheme()
+ openFestival()
+ }
+
+ const cleanupSettings = () => {
+ stopWatch()
+ themeCleanup?.()
+ cleanup()
+ }
+
+ return {
+ initializeSettings,
+ cleanupSettings
+ }
+ }
+
+ return {
+ // 状态
+ showDrawer,
+
+ // 方法组合
+ useThemeHandlers,
+ useResponsiveLayout,
+ useDrawerControl,
+ usePropsWatcher,
+ useSettingsInitializer
+ }
+}
diff --git a/saiadmin-artd/src/components/core/layouts/art-settings-panel/composables/useSettingsState.ts b/saiadmin-artd/src/components/core/layouts/art-settings-panel/composables/useSettingsState.ts
new file mode 100644
index 0000000..65352d2
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-settings-panel/composables/useSettingsState.ts
@@ -0,0 +1,37 @@
+import { useSettingStore } from '@/store/modules/setting'
+import { MenuThemeEnum, MenuTypeEnum } from '@/enums/appEnum'
+
+/**
+ * 设置状态管理
+ */
+export function useSettingsState() {
+ const settingStore = useSettingStore()
+
+ // 色弱模式初始化
+ const initColorWeak = () => {
+ if (settingStore.colorWeak) {
+ const el = document.getElementsByTagName('html')[0]
+ setTimeout(() => {
+ el.classList.add('color-weak')
+ }, 100)
+ }
+ }
+
+ // 菜单布局切换
+ const switchMenuLayouts = (type: MenuTypeEnum) => {
+ if (type === MenuTypeEnum.LEFT || type === MenuTypeEnum.TOP_LEFT) {
+ settingStore.setMenuOpen(true)
+ }
+ settingStore.switchMenuLayouts(type)
+ if (type === MenuTypeEnum.DUAL_MENU) {
+ settingStore.switchMenuStyles(MenuThemeEnum.DESIGN)
+ settingStore.setMenuOpen(true)
+ }
+ }
+
+ return {
+ // 方法
+ initColorWeak,
+ switchMenuLayouts
+ }
+}
diff --git a/saiadmin-artd/src/components/core/layouts/art-settings-panel/index.vue b/saiadmin-artd/src/components/core/layouts/art-settings-panel/index.vue
new file mode 100644
index 0000000..0cbf344
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-settings-panel/index.vue
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-settings-panel/style.scss b/saiadmin-artd/src/components/core/layouts/art-settings-panel/style.scss
new file mode 100644
index 0000000..e863074
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-settings-panel/style.scss
@@ -0,0 +1,92 @@
+@use '@styles/core/mixin.scss' as *;
+
+// 设置抽屉模态框样式
+.setting-modal {
+ background: transparent !important;
+
+ .el-drawer {
+ // 背景滤镜效果
+ background: rgba($color: #fff, $alpha: 50%) !important;
+ box-shadow: 0 0 30px rgb(0 0 0 / 10%) !important;
+
+ @include backdropBlur();
+
+ .setting-box-wrap {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ width: calc(100% + 15px);
+ margin-bottom: 10px;
+
+ .setting-item {
+ box-sizing: border-box;
+ width: calc(33.333% - 15px);
+ margin-right: 15px;
+ text-align: center;
+
+ .box {
+ position: relative;
+ box-sizing: border-box;
+ display: flex;
+ height: 52px;
+ overflow: hidden;
+ cursor: pointer;
+ border: 2px solid var(--default-border);
+ border-radius: 8px;
+ box-shadow: 0 0 8px 0 rgb(0 0 0 / 10%);
+ transition: box-shadow 0.1s;
+
+ &.mt-16 {
+ margin-top: 16px;
+ }
+
+ &.is-active {
+ border: 2px solid var(--theme-color);
+ }
+
+ img {
+ width: 100%;
+ height: 100%;
+ }
+ }
+
+ .name {
+ margin-top: 6px;
+ font-size: 14px;
+ text-align: center;
+ }
+ }
+ }
+ }
+
+ // 去除滚动条
+ .el-drawer__body::-webkit-scrollbar {
+ width: 0 !important;
+ }
+}
+
+.dark {
+ .setting-modal {
+ .el-drawer {
+ background: rgba($color: #000, $alpha: 50%) !important;
+
+ .setting-item {
+ .box {
+ border: 2px solid transparent;
+ }
+ }
+ }
+ }
+}
+
+// 去除火狐浏览器滚动条
+:deep(.el-drawer__body) {
+ scrollbar-width: none;
+}
+
+// 移动端隐藏
+@media screen and (width <= 800px) {
+ .mobile-hide {
+ display: none !important;
+ }
+}
diff --git a/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/BasicSettings.vue b/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/BasicSettings.vue
new file mode 100644
index 0000000..b6dc9d3
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/BasicSettings.vue
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/BoxStyleSettings.vue b/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/BoxStyleSettings.vue
new file mode 100644
index 0000000..86c7a9e
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/BoxStyleSettings.vue
@@ -0,0 +1,38 @@
+
+
+
+
+
+ {{ option.label }}
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/ColorSettings.vue b/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/ColorSettings.vue
new file mode 100644
index 0000000..05a4b41
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/ColorSettings.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/ContainerSettings.vue b/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/ContainerSettings.vue
new file mode 100644
index 0000000..1f5be72
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/ContainerSettings.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/MenuLayoutSettings.vue b/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/MenuLayoutSettings.vue
new file mode 100644
index 0000000..dbcae46
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/MenuLayoutSettings.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
{{ $t(`setting.menuType.list[${index}]`) }}
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/MenuStyleSettings.vue b/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/MenuStyleSettings.vue
new file mode 100644
index 0000000..61237eb
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/MenuStyleSettings.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/SectionTitle.vue b/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/SectionTitle.vue
new file mode 100644
index 0000000..31ef00c
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/SectionTitle.vue
@@ -0,0 +1,17 @@
+
+
+ {{ title }}
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/SettingActions.vue b/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/SettingActions.vue
new file mode 100644
index 0000000..7b47d1a
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/SettingActions.vue
@@ -0,0 +1,235 @@
+
+
+
+
+ {{ $t('setting.actions.copyConfig') }}
+
+
+ {{ $t('setting.actions.resetConfig') }}
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/SettingDrawer.vue b/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/SettingDrawer.vue
new file mode 100644
index 0000000..85372be
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/SettingDrawer.vue
@@ -0,0 +1,51 @@
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/SettingHeader.vue b/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/SettingHeader.vue
new file mode 100644
index 0000000..e3ead9e
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/SettingHeader.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/SettingItem.vue b/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/SettingItem.vue
new file mode 100644
index 0000000..5721027
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/SettingItem.vue
@@ -0,0 +1,101 @@
+
+
+ {{ config.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/ThemeSettings.vue b/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/ThemeSettings.vue
new file mode 100644
index 0000000..4b46fcd
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-settings-panel/widget/ThemeSettings.vue
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
{{ $t(`setting.theme.list[${index}]`) }}
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/layouts/art-work-tab/index.vue b/saiadmin-artd/src/components/core/layouts/art-work-tab/index.vue
new file mode 100644
index 0000000..152ff63
--- /dev/null
+++ b/saiadmin-artd/src/components/core/layouts/art-work-tab/index.vue
@@ -0,0 +1,584 @@
+
+
+
+
+
+ showMenu(e, item.path)"
+ >
+
+ {{ item.customTitle || formatMenuTitle(item.title) }}
+
+
+
+
+
+
+
+
+
+
showMenu(e, activeTab)"
+ >
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/media/art-cutter-img/index.vue b/saiadmin-artd/src/components/core/media/art-cutter-img/index.vue
new file mode 100644
index 0000000..191ceed
--- /dev/null
+++ b/saiadmin-artd/src/components/core/media/art-cutter-img/index.vue
@@ -0,0 +1,350 @@
+
+
+
+
+
{{ title }}
+
+
+ 选择图片
+
+
+ 清除
+
+
+
+
+
+
+
+
+
+
{{ previewTitle }}
+
+
+
+
下载图片
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/media/art-video-player/index.vue b/saiadmin-artd/src/components/core/media/art-video-player/index.vue
new file mode 100644
index 0000000..4f681ea
--- /dev/null
+++ b/saiadmin-artd/src/components/core/media/art-video-player/index.vue
@@ -0,0 +1,111 @@
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/others/art-menu-right/index.vue b/saiadmin-artd/src/components/core/others/art-menu-right/index.vue
new file mode 100644
index 0000000..1cc92ab
--- /dev/null
+++ b/saiadmin-artd/src/components/core/others/art-menu-right/index.vue
@@ -0,0 +1,415 @@
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/others/art-watermark/index.vue b/saiadmin-artd/src/components/core/others/art-watermark/index.vue
new file mode 100644
index 0000000..1d7f06b
--- /dev/null
+++ b/saiadmin-artd/src/components/core/others/art-watermark/index.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/tables/art-table-header/index.vue b/saiadmin-artd/src/components/core/tables/art-table-header/index.vue
new file mode 100644
index 0000000..788c2b7
--- /dev/null
+++ b/saiadmin-artd/src/components/core/tables/art-table-header/index.vue
@@ -0,0 +1,339 @@
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/tables/art-table/index.vue b/saiadmin-artd/src/components/core/tables/art-table/index.vue
new file mode 100644
index 0000000..42151e2
--- /dev/null
+++ b/saiadmin-artd/src/components/core/tables/art-table/index.vue
@@ -0,0 +1,410 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ getGlobalIndex($index) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ col.saiFirst ? row[col.saiFirst] : '' }}
+
{{ col.saiSecond ? row[col.saiSecond] : '' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ col.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/tables/art-table/style.scss b/saiadmin-artd/src/components/core/tables/art-table/style.scss
new file mode 100644
index 0000000..67459e8
--- /dev/null
+++ b/saiadmin-artd/src/components/core/tables/art-table/style.scss
@@ -0,0 +1,99 @@
+.art-table {
+ position: relative;
+ height: 100%;
+
+ .el-table {
+ height: 100%;
+ margin-top: 10px;
+ }
+
+ :deep(.el-loading-mask) {
+ z-index: 100;
+ background-color: var(--default-box-color) !important;
+ }
+
+ // Loading 过渡动画 - 消失时淡出
+ .loading-fade-leave-active {
+ transition: opacity 0.3s ease-out;
+ }
+
+ .loading-fade-leave-to {
+ opacity: 0;
+ }
+
+ // 空状态垂直居中
+ &.is-empty {
+ :deep(.el-scrollbar__wrap) {
+ display: flex;
+ }
+ }
+
+ .pagination {
+ display: flex;
+ margin-top: 13px;
+
+ :deep(.el-select) {
+ width: 102px !important;
+ }
+
+ // 分页对齐方式
+ &.left {
+ justify-content: flex-start;
+ }
+
+ &.center {
+ justify-content: center;
+ }
+
+ &.right {
+ justify-content: flex-end;
+ }
+
+ // 自定义分页组件样式
+ &.custom-pagination {
+ :deep(.el-pagination) {
+ .btn-prev,
+ .btn-next {
+ background-color: transparent;
+ border: 1px solid var(--art-gray-300);
+ transition: border-color 0.15s;
+
+ &:hover:not(.is-disabled) {
+ color: var(--theme-color);
+ border-color: var(--theme-color);
+ }
+ }
+
+ li {
+ box-sizing: border-box;
+ font-weight: 400 !important;
+ background-color: transparent;
+ border: 1px solid var(--art-gray-300);
+ transition: border-color 0.15s;
+
+ &.is-active {
+ font-weight: 400;
+ color: #fff;
+ background-color: var(--theme-color);
+ border: 1px solid var(--theme-color);
+ }
+
+ &:hover:not(.is-disabled) {
+ border-color: var(--theme-color);
+ }
+ }
+ }
+ }
+ }
+}
+
+// 移动端分页
+@media (width <= 640px) {
+ :deep(.el-pagination) {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 15px 0;
+ align-items: center;
+ justify-content: center;
+ }
+}
diff --git a/saiadmin-artd/src/components/core/text-effect/art-count-to/index.vue b/saiadmin-artd/src/components/core/text-effect/art-count-to/index.vue
new file mode 100644
index 0000000..7fb104b
--- /dev/null
+++ b/saiadmin-artd/src/components/core/text-effect/art-count-to/index.vue
@@ -0,0 +1,310 @@
+
+
+
+ {{ formattedValue }}
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/text-effect/art-festival-text-scroll/index.vue b/saiadmin-artd/src/components/core/text-effect/art-festival-text-scroll/index.vue
new file mode 100644
index 0000000..770b457
--- /dev/null
+++ b/saiadmin-artd/src/components/core/text-effect/art-festival-text-scroll/index.vue
@@ -0,0 +1,32 @@
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/text-effect/art-text-scroll/index.vue b/saiadmin-artd/src/components/core/text-effect/art-text-scroll/index.vue
new file mode 100644
index 0000000..90be30f
--- /dev/null
+++ b/saiadmin-artd/src/components/core/text-effect/art-text-scroll/index.vue
@@ -0,0 +1,285 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/theme/theme-svg/index.vue b/saiadmin-artd/src/components/core/theme/theme-svg/index.vue
new file mode 100644
index 0000000..0b565a9
--- /dev/null
+++ b/saiadmin-artd/src/components/core/theme/theme-svg/index.vue
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/views/exception/ArtException.vue b/saiadmin-artd/src/components/core/views/exception/ArtException.vue
new file mode 100644
index 0000000..5f4cf21
--- /dev/null
+++ b/saiadmin-artd/src/components/core/views/exception/ArtException.vue
@@ -0,0 +1,53 @@
+
+
+
+
+
+
{{ data.desc }}
+
{{
+ data.btnText
+ }}
+
+
+
+
+ 重新登录
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/views/login/AuthTopBar.vue b/saiadmin-artd/src/components/core/views/login/AuthTopBar.vue
new file mode 100644
index 0000000..9455253
--- /dev/null
+++ b/saiadmin-artd/src/components/core/views/login/AuthTopBar.vue
@@ -0,0 +1,149 @@
+
+
+
+
+
+
{{ AppConfig.systemInfo.name }}
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/views/login/LoginLeftView.vue b/saiadmin-artd/src/components/core/views/login/LoginLeftView.vue
new file mode 100644
index 0000000..af6a904
--- /dev/null
+++ b/saiadmin-artd/src/components/core/views/login/LoginLeftView.vue
@@ -0,0 +1,602 @@
+
+
+
+
+
+
{{ AppConfig.systemInfo.name }}
+
+
+
+
+
+
+
+
{{ $t('login.leftView.title') }}
+
{{ $t('login.leftView.subTitle') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/views/result/ArtResultPage.vue b/saiadmin-artd/src/components/core/views/result/ArtResultPage.vue
new file mode 100644
index 0000000..b2eca48
--- /dev/null
+++ b/saiadmin-artd/src/components/core/views/result/ArtResultPage.vue
@@ -0,0 +1,43 @@
+
+
+
+
{{
+ title
+ }}
+
{{ message }}
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/core/widget/art-icon-button/index.vue b/saiadmin-artd/src/components/core/widget/art-icon-button/index.vue
new file mode 100644
index 0000000..760888b
--- /dev/null
+++ b/saiadmin-artd/src/components/core/widget/art-icon-button/index.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/sai/sa-button/index.vue b/saiadmin-artd/src/components/sai/sa-button/index.vue
new file mode 100644
index 0000000..30679f6
--- /dev/null
+++ b/saiadmin-artd/src/components/sai/sa-button/index.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/sai/sa-checkbox/index.vue b/saiadmin-artd/src/components/sai/sa-checkbox/index.vue
new file mode 100644
index 0000000..f064034
--- /dev/null
+++ b/saiadmin-artd/src/components/sai/sa-checkbox/index.vue
@@ -0,0 +1,108 @@
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/sai/sa-chunk-upload/README.md b/saiadmin-artd/src/components/sai/sa-chunk-upload/README.md
new file mode 100644
index 0000000..dee6f50
--- /dev/null
+++ b/saiadmin-artd/src/components/sai/sa-chunk-upload/README.md
@@ -0,0 +1,216 @@
+# sa-chunk-upload 切片上传组件
+
+一个支持大文件分片上传的 Vue 3 组件,基于 Element Plus 的 el-upload 封装。
+
+## 功能特性
+
+- ✅ **分片上传**: 自动将大文件切分成小块上传,支持自定义分片大小
+- ✅ **MD5 校验**: 自动计算文件 MD5 哈希值,用于文件去重和完整性校验
+- ✅ **进度跟踪**: 实时显示上传进度、当前分片、上传速度
+- ✅ **断点续传**: 支持上传失败后重试(需后端配合)
+- ✅ **取消上传**: 可随时取消正在进行的上传任务
+- ✅ **拖拽上传**: 支持拖拽文件到指定区域上传
+- ✅ **文件验证**: 支持文件类型和大小验证
+- ✅ **并发控制**: 串行上传多个文件,避免服务器压力过大
+
+## Props 参数
+
+| 参数 | 说明 | 类型 | 默认值 |
+|------|------|------|--------|
+| modelValue | v-model 绑定值,文件 URL | `string \| string[]` | `[]` |
+| multiple | 是否支持多选文件 | `boolean` | `false` |
+| limit | 最大上传文件数量 | `number` | `1` |
+| maxSize | 单个文件最大大小(MB) | `number` | `1024` |
+| chunkSize | 分片大小(MB) | `number` | `5` |
+| accept | 接受的文件类型 | `string` | `'*'` |
+| acceptHint | 文件类型提示文本 | `string` | `''` |
+| disabled | 是否禁用 | `boolean` | `false` |
+| drag | 是否启用拖拽上传 | `boolean` | `true` |
+| buttonText | 按钮文本 | `string` | `'选择文件'` |
+| autoUpload | 是否自动上传 | `boolean` | `false` |
+
+## Events 事件
+
+| 事件名 | 说明 | 回调参数 |
+|--------|------|----------|
+| update:modelValue | 文件 URL 更新 | `(value: string \| string[])` |
+| success | 上传成功 | `(response: any)` |
+| error | 上传失败 | `(error: any)` |
+| progress | 上传进度更新 | `(progress: number)` |
+
+## 基本用法
+
+```vue
+
+
+
+
+
+```
+
+## 高级用法
+
+### 1. 大视频文件上传
+
+```vue
+
+
+
+
+
+```
+
+### 2. 多文件上传
+
+```vue
+
+
+
+
+
+```
+
+### 3. 限制文件类型
+
+```vue
+
+
+
+
+
+
+
+```
+
+### 4. 自动上传模式
+
+```vue
+
+
+
+```
+
+### 5. 手动控制上传
+
+```vue
+
+
+
+
+```
+
+## 后端接口要求
+
+组件会调用 `chunkUpload` API,每个分片上传时会发送以下参数:
+
+```typescript
+{
+ file: Blob, // 分片文件数据
+ hash: string, // 文件 MD5 哈希值
+ chunkIndex: number, // 当前分片索引(从 0 开始)
+ totalChunks: number, // 总分片数
+ fileName: string // 原始文件名
+}
+```
+
+### 后端实现建议
+
+1. **接收分片**: 根据 `hash` 和 `chunkIndex` 保存分片
+2. **合并文件**: 当接收到所有分片后(`chunkIndex === totalChunks - 1`),合并所有分片
+3. **返回 URL**: 合并完成后返回文件访问 URL
+4. **断点续传**: 可以实现接口检查已上传的分片,避免重复上传
+
+### 示例后端响应
+
+```json
+{
+ "code": 200,
+ "data": {
+ "url": "/uploads/abc123def456/example.mp4",
+ "hash": "abc123def456"
+ },
+ "message": "上传成功"
+}
+```
+
+## 工作原理
+
+1. **文件选择**: 用户选择文件后,组件计算文件需要分成多少片
+2. **MD5 计算**: 计算整个文件的 MD5 哈希值(用于去重和校验)
+3. **分片上传**: 按顺序上传每个分片,实时更新进度
+4. **进度显示**: 显示当前分片、总分片数、上传速度
+5. **完成处理**: 所有分片上传完成后,更新 v-model 值
+
+## 性能优化建议
+
+1. **分片大小**:
+ - 网络较好: 可设置 10-20MB
+ - 网络一般: 建议 5-10MB
+ - 网络较差: 建议 2-5MB
+
+2. **文件大小限制**: 根据实际需求设置合理的 `maxSize`
+
+3. **并发控制**: 组件默认串行上传文件,避免同时上传多个大文件
+
+## 注意事项
+
+1. 需要安装依赖: `spark-md5` 和 `@types/spark-md5`
+2. 后端需要实现分片接收和合并逻辑
+3. 建议在后端实现文件去重(通过 MD5 哈希)
+4. 大文件上传时注意服务器超时设置
+
+## 依赖安装
+
+```bash
+pnpm add spark-md5
+pnpm add -D @types/spark-md5
+```
diff --git a/saiadmin-artd/src/components/sai/sa-chunk-upload/index.vue b/saiadmin-artd/src/components/sai/sa-chunk-upload/index.vue
new file mode 100644
index 0000000..d2d33a9
--- /dev/null
+++ b/saiadmin-artd/src/components/sai/sa-chunk-upload/index.vue
@@ -0,0 +1,623 @@
+
+
+
+
+
+
+
将文件拖到此处,或点击选择
+
支持大文件上传,自动分片处理
+
+
+ {{ buttonText }}
+
+
+
+
+ 支持 {{ acceptHint }} 格式,
+ 单个文件不超过 {{ maxSize }}MB,最多上传 {{ limit }} 个文件
+ (分片大小: {{ chunkSize }}MB)
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+ {{ formatFileSize(item.size) }}
+
+
+
+
+
+
+ {{ item.currentChunk }}/{{ item.totalChunks }} 分片
+ - {{ item.speed }}
+
+
+
+ 重试
+
+
+ 取消
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+ 开始上传 ({{ pendingFiles.length }} 个文件)
+
+ 清空列表
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/sai/sa-code/index.vue b/saiadmin-artd/src/components/sai/sa-code/index.vue
new file mode 100644
index 0000000..187facf
--- /dev/null
+++ b/saiadmin-artd/src/components/sai/sa-code/index.vue
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/sai/sa-dict/index.vue b/saiadmin-artd/src/components/sai/sa-dict/index.vue
new file mode 100644
index 0000000..6b884fc
--- /dev/null
+++ b/saiadmin-artd/src/components/sai/sa-dict/index.vue
@@ -0,0 +1,113 @@
+
+
+
+
+
+ {{ getData(item)?.label || item }}
+
+
+
+
+ {{ getData(item)?.label || item }}{{ index < normalizedValues.length - 1 ? '、' : '' }}
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/sai/sa-editor/index.vue b/saiadmin-artd/src/components/sai/sa-editor/index.vue
new file mode 100644
index 0000000..c90a515
--- /dev/null
+++ b/saiadmin-artd/src/components/sai/sa-editor/index.vue
@@ -0,0 +1,297 @@
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/sai/sa-editor/style.scss b/saiadmin-artd/src/components/sai/sa-editor/style.scss
new file mode 100644
index 0000000..fd5dbca
--- /dev/null
+++ b/saiadmin-artd/src/components/sai/sa-editor/style.scss
@@ -0,0 +1,210 @@
+$box-radius: calc(var(--custom-radius) / 3 + 2px);
+
+// 全屏容器 z-index 调整
+.w-e-full-screen-container {
+ z-index: 100 !important;
+}
+
+/* 编辑器容器 */
+.editor-wrapper {
+ width: 100%;
+ height: 100%;
+ border: 1px solid var(--art-gray-300);
+ border-radius: $box-radius !important;
+
+ .w-e-bar {
+ border-radius: $box-radius $box-radius 0 0 !important;
+ }
+
+ .menu-item {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+
+ i {
+ margin-right: 5px;
+ }
+ }
+
+ /* 工具栏 */
+ .editor-toolbar {
+ border-bottom: 1px solid var(--default-border);
+ }
+
+ /* 下拉选择框配置 */
+ .w-e-select-list {
+ min-width: 140px;
+ padding: 5px 10px 10px;
+ border: none;
+ border-radius: $box-radius;
+ }
+
+ /* 下拉选择框元素配置 */
+ .w-e-select-list ul li {
+ margin-top: 5px;
+ font-size: 15px !important;
+ border-radius: $box-radius;
+ }
+
+ /* 下拉选择框 正文文字大小调整 */
+ .w-e-select-list ul li:last-of-type {
+ font-size: 16px !important;
+ }
+
+ /* 下拉选择框 hover 样式调整 */
+ .w-e-select-list ul li:hover {
+ background-color: var(--art-gray-200);
+ }
+
+ :root {
+ /* 激活颜色 */
+ --w-e-toolbar-active-bg-color: var(--art-gray-200);
+
+ /* toolbar 图标和文字颜色 */
+ --w-e-toolbar-color: #000;
+
+ /* 表格选中时候的边框颜色 */
+ --w-e-textarea-selected-border-color: #ddd;
+
+ /* 表格头背景颜色 */
+ --w-e-textarea-slight-bg-color: var(--art-gray-200);
+ }
+
+ /* 工具栏按钮样式 */
+ .w-e-bar-item svg {
+ fill: var(--art-gray-800);
+ }
+
+ .w-e-bar-item button {
+ color: var(--art-gray-800);
+ border-radius: $box-radius;
+ }
+
+ /* 工具栏 hover 按钮背景颜色 */
+ .w-e-bar-item button:hover {
+ background-color: var(--art-gray-200);
+ }
+
+ /* 工具栏分割线 */
+ .w-e-bar-divider {
+ height: 20px;
+ margin-top: 10px;
+ background-color: #ccc;
+ }
+
+ /* 工具栏菜单 */
+ .w-e-bar-item-group .w-e-bar-item-menus-container {
+ min-width: 120px;
+ padding: 10px 0;
+ border: none;
+ border-radius: $box-radius;
+
+ .w-e-bar-item {
+ button {
+ width: 100%;
+ margin: 0 5px;
+ }
+ }
+ }
+
+ /* 代码块 */
+ .w-e-text-container [data-slate-editor] pre > code {
+ padding: 0.6rem 1rem;
+ background-color: var(--art-gray-50);
+ border-radius: $box-radius;
+ }
+
+ /* 弹出框 */
+ .w-e-drop-panel {
+ border: 0;
+ border-radius: $box-radius;
+ }
+
+ a {
+ color: #318ef4;
+ }
+
+ .w-e-text-container {
+ strong,
+ b {
+ font-weight: 500;
+ }
+
+ i,
+ em {
+ font-style: italic;
+ }
+ }
+
+ /* 表格样式优化 */
+ .w-e-text-container [data-slate-editor] .table-container th {
+ border-right: none;
+ }
+
+ .w-e-text-container [data-slate-editor] .table-container th:last-of-type {
+ border-right: 1px solid #ccc !important;
+ }
+
+ /* 引用 */
+ .w-e-text-container [data-slate-editor] blockquote {
+ background-color: var(--art-gray-200);
+ border-left: 4px solid var(--art-gray-300);
+ }
+
+ /* 输入区域弹出 bar */
+ .w-e-hover-bar {
+ border-radius: $box-radius;
+ }
+
+ /* 超链接弹窗 */
+ .w-e-modal {
+ border: none;
+ border-radius: $box-radius;
+ }
+
+ /* 图片样式调整 */
+ .w-e-text-container [data-slate-editor] .w-e-selected-image-container {
+ overflow: inherit;
+
+ &:hover {
+ border: 0;
+ }
+
+ img {
+ border: 1px solid transparent;
+ transition: border 0.3s;
+
+ &:hover {
+ border: 1px solid #318ef4 !important;
+ }
+ }
+
+ .w-e-image-dragger {
+ width: 12px;
+ height: 12px;
+ background-color: #318ef4;
+ border: 2px solid #fff;
+ border-radius: $box-radius;
+ }
+
+ .left-top {
+ top: -6px;
+ left: -6px;
+ }
+
+ .right-top {
+ top: -6px;
+ right: -6px;
+ }
+
+ .left-bottom {
+ bottom: -6px;
+ left: -6px;
+ }
+
+ .right-bottom {
+ right: -6px;
+ bottom: -6px;
+ }
+ }
+}
diff --git a/saiadmin-artd/src/components/sai/sa-export/index.vue b/saiadmin-artd/src/components/sai/sa-export/index.vue
new file mode 100644
index 0000000..09da6c8
--- /dev/null
+++ b/saiadmin-artd/src/components/sai/sa-export/index.vue
@@ -0,0 +1,127 @@
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/sai/sa-file-upload/README.MD b/saiadmin-artd/src/components/sai/sa-file-upload/README.MD
new file mode 100644
index 0000000..05f2d61
--- /dev/null
+++ b/saiadmin-artd/src/components/sai/sa-file-upload/README.MD
@@ -0,0 +1,119 @@
+
+
+
+
+
文件上传组件示例
+
+
+
+
+ 当前文件: {{ singleFile }}
+
+
+
+
+
+ 当前文件: {{ multipleFiles }}
+
+
+
+
+
+ 当前文件: {{ dragFile }}
+
+
+
+
+
+ 当前文件: {{ docFile }}
+
+
+
+
+
+ 当前文件: {{ excelFile }}
+
+
+
+
+
+ 当前文件: {{ zipFile }}
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/sai/sa-file-upload/index.vue b/saiadmin-artd/src/components/sai/sa-file-upload/index.vue
new file mode 100644
index 0000000..9208756
--- /dev/null
+++ b/saiadmin-artd/src/components/sai/sa-file-upload/index.vue
@@ -0,0 +1,269 @@
+
+
+
+
+
+
+ {{ buttonText }}
+
+
+
+
+ 支持 {{ acceptHint }} 格式,
+ 单个文件不超过 {{ maxSize }}MB,最多上传 {{ limit }} 个文件
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/sai/sa-icon-picker/index.vue b/saiadmin-artd/src/components/sai/sa-icon-picker/index.vue
new file mode 100644
index 0000000..0d014e5
--- /dev/null
+++ b/saiadmin-artd/src/components/sai/sa-icon-picker/index.vue
@@ -0,0 +1,186 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/sai/sa-icon-picker/lib/RemixIcon.json b/saiadmin-artd/src/components/sai/sa-icon-picker/lib/RemixIcon.json
new file mode 100644
index 0000000..53b8f54
--- /dev/null
+++ b/saiadmin-artd/src/components/sai/sa-icon-picker/lib/RemixIcon.json
@@ -0,0 +1,3175 @@
+{
+ "Arrows": [
+ "arrow-down-box-fill",
+ "arrow-down-box-line",
+ "arrow-down-circle-fill",
+ "arrow-down-circle-line",
+ "arrow-down-double-fill",
+ "arrow-down-double-line",
+ "arrow-down-fill",
+ "arrow-down-line",
+ "arrow-down-long-fill",
+ "arrow-down-long-line",
+ "arrow-down-s-fill",
+ "arrow-down-s-line",
+ "arrow-down-wide-fill",
+ "arrow-down-wide-line",
+ "arrow-drop-down-fill",
+ "arrow-drop-down-line",
+ "arrow-drop-left-fill",
+ "arrow-drop-left-line",
+ "arrow-drop-right-fill",
+ "arrow-drop-right-line",
+ "arrow-drop-up-fill",
+ "arrow-drop-up-line",
+ "arrow-go-back-fill",
+ "arrow-go-back-line",
+ "arrow-go-forward-fill",
+ "arrow-go-forward-line",
+ "arrow-left-box-fill",
+ "arrow-left-box-line",
+ "arrow-left-circle-fill",
+ "arrow-left-circle-line",
+ "arrow-left-double-fill",
+ "arrow-left-double-line",
+ "arrow-left-down-box-fill",
+ "arrow-left-down-box-line",
+ "arrow-left-down-fill",
+ "arrow-left-down-line",
+ "arrow-left-down-long-fill",
+ "arrow-left-down-long-line",
+ "arrow-left-fill",
+ "arrow-left-line",
+ "arrow-left-long-fill",
+ "arrow-left-long-line",
+ "arrow-left-right-fill",
+ "arrow-left-right-line",
+ "arrow-left-s-fill",
+ "arrow-left-s-line",
+ "arrow-left-up-box-fill",
+ "arrow-left-up-box-line",
+ "arrow-left-up-fill",
+ "arrow-left-up-line",
+ "arrow-left-up-long-fill",
+ "arrow-left-up-long-line",
+ "arrow-left-wide-fill",
+ "arrow-left-wide-line",
+ "arrow-right-box-fill",
+ "arrow-right-box-line",
+ "arrow-right-circle-fill",
+ "arrow-right-circle-line",
+ "arrow-right-double-fill",
+ "arrow-right-double-line",
+ "arrow-right-down-box-fill",
+ "arrow-right-down-box-line",
+ "arrow-right-down-fill",
+ "arrow-right-down-line",
+ "arrow-right-down-long-fill",
+ "arrow-right-down-long-line",
+ "arrow-right-fill",
+ "arrow-right-line",
+ "arrow-right-long-fill",
+ "arrow-right-long-line",
+ "arrow-right-s-fill",
+ "arrow-right-s-line",
+ "arrow-right-up-box-fill",
+ "arrow-right-up-box-line",
+ "arrow-right-up-fill",
+ "arrow-right-up-line",
+ "arrow-right-up-long-fill",
+ "arrow-right-up-long-line",
+ "arrow-right-wide-fill",
+ "arrow-right-wide-line",
+ "arrow-turn-back-fill",
+ "arrow-turn-back-line",
+ "arrow-turn-forward-fill",
+ "arrow-turn-forward-line",
+ "arrow-up-box-fill",
+ "arrow-up-box-line",
+ "arrow-up-circle-fill",
+ "arrow-up-circle-line",
+ "arrow-up-double-fill",
+ "arrow-up-double-line",
+ "arrow-up-down-fill",
+ "arrow-up-down-line",
+ "arrow-up-fill",
+ "arrow-up-line",
+ "arrow-up-long-fill",
+ "arrow-up-long-line",
+ "arrow-up-s-fill",
+ "arrow-up-s-line",
+ "arrow-up-wide-fill",
+ "arrow-up-wide-line",
+ "collapse-diagonal-2-fill",
+ "collapse-diagonal-2-line",
+ "collapse-diagonal-fill",
+ "collapse-diagonal-line",
+ "collapse-horizontal-fill",
+ "collapse-horizontal-line",
+ "collapse-vertical-fill",
+ "collapse-vertical-line",
+ "contract-left-fill",
+ "contract-left-line",
+ "contract-left-right-fill",
+ "contract-left-right-line",
+ "contract-right-fill",
+ "contract-right-line",
+ "contract-up-down-fill",
+ "contract-up-down-line",
+ "corner-down-left-fill",
+ "corner-down-left-line",
+ "corner-down-right-fill",
+ "corner-down-right-line",
+ "corner-left-down-fill",
+ "corner-left-down-line",
+ "corner-left-up-fill",
+ "corner-left-up-line",
+ "corner-right-down-fill",
+ "corner-right-down-line",
+ "corner-right-up-fill",
+ "corner-right-up-line",
+ "corner-up-left-double-fill",
+ "corner-up-left-double-line",
+ "corner-up-left-fill",
+ "corner-up-left-line",
+ "corner-up-right-double-fill",
+ "corner-up-right-double-line",
+ "corner-up-right-fill",
+ "corner-up-right-line",
+ "drag-move-2-fill",
+ "drag-move-2-line",
+ "drag-move-fill",
+ "drag-move-line",
+ "expand-diagonal-2-fill",
+ "expand-diagonal-2-line",
+ "expand-diagonal-fill",
+ "expand-diagonal-line",
+ "expand-diagonal-s-2-fill",
+ "expand-diagonal-s-2-line",
+ "expand-diagonal-s-fill",
+ "expand-diagonal-s-line",
+ "expand-height-fill",
+ "expand-height-line",
+ "expand-horizontal-fill",
+ "expand-horizontal-line",
+ "expand-horizontal-s-fill",
+ "expand-horizontal-s-line",
+ "expand-left-fill",
+ "expand-left-line",
+ "expand-left-right-fill",
+ "expand-left-right-line",
+ "expand-right-fill",
+ "expand-right-line",
+ "expand-up-down-fill",
+ "expand-up-down-line",
+ "expand-vertical-fill",
+ "expand-vertical-line",
+ "expand-vertical-s-fill",
+ "expand-vertical-s-line",
+ "expand-width-fill",
+ "expand-width-line",
+ "scroll-to-bottom-fill",
+ "scroll-to-bottom-line",
+ "skip-down-fill",
+ "skip-down-line",
+ "skip-left-fill",
+ "skip-left-line",
+ "skip-right-fill",
+ "skip-right-line",
+ "skip-up-fill",
+ "skip-up-line"
+ ],
+ "Buildings": [
+ "ancient-gate-fill",
+ "ancient-gate-line",
+ "ancient-pavilion-fill",
+ "ancient-pavilion-line",
+ "bank-fill",
+ "bank-line",
+ "building-2-fill",
+ "building-2-line",
+ "building-3-fill",
+ "building-3-line",
+ "building-4-fill",
+ "building-4-line",
+ "building-fill",
+ "building-line",
+ "community-fill",
+ "community-line",
+ "government-fill",
+ "government-line",
+ "home-2-fill",
+ "home-2-line",
+ "home-3-fill",
+ "home-3-line",
+ "home-4-fill",
+ "home-4-line",
+ "home-5-fill",
+ "home-5-line",
+ "home-6-fill",
+ "home-6-line",
+ "home-7-fill",
+ "home-7-line",
+ "home-8-fill",
+ "home-8-line",
+ "home-9-fill",
+ "home-9-line",
+ "home-fill",
+ "home-gear-fill",
+ "home-gear-line",
+ "home-heart-fill",
+ "home-heart-line",
+ "home-line",
+ "home-office-fill",
+ "home-office-line",
+ "home-smile-2-fill",
+ "home-smile-2-line",
+ "home-smile-fill",
+ "home-smile-line",
+ "home-wifi-fill",
+ "home-wifi-line",
+ "hospital-fill",
+ "hospital-line",
+ "hotel-fill",
+ "hotel-line",
+ "school-fill",
+ "school-line",
+ "store-2-fill",
+ "store-2-line",
+ "store-3-fill",
+ "store-3-line",
+ "store-fill",
+ "store-line",
+ "tent-fill",
+ "tent-line"
+ ],
+ "Business": [
+ "advertisement-fill",
+ "advertisement-line",
+ "archive-2-fill",
+ "archive-2-line",
+ "archive-drawer-fill",
+ "archive-drawer-line",
+ "archive-fill",
+ "archive-line",
+ "archive-stack-fill",
+ "archive-stack-line",
+ "at-fill",
+ "at-line",
+ "attachment-fill",
+ "attachment-line",
+ "award-fill",
+ "award-line",
+ "bar-chart-2-fill",
+ "bar-chart-2-line",
+ "bar-chart-box-ai-fill",
+ "bar-chart-box-ai-line",
+ "bar-chart-box-fill",
+ "bar-chart-box-line",
+ "bar-chart-fill",
+ "bar-chart-grouped-fill",
+ "bar-chart-grouped-line",
+ "bar-chart-horizontal-fill",
+ "bar-chart-horizontal-line",
+ "bar-chart-line",
+ "bookmark-2-fill",
+ "bookmark-2-line",
+ "bookmark-3-fill",
+ "bookmark-3-line",
+ "bookmark-fill",
+ "bookmark-line",
+ "briefcase-2-fill",
+ "briefcase-2-line",
+ "briefcase-3-fill",
+ "briefcase-3-line",
+ "briefcase-4-fill",
+ "briefcase-4-line",
+ "briefcase-5-fill",
+ "briefcase-5-line",
+ "briefcase-fill",
+ "briefcase-line",
+ "bubble-chart-fill",
+ "bubble-chart-line",
+ "calculator-fill",
+ "calculator-line",
+ "calendar-2-fill",
+ "calendar-2-line",
+ "calendar-check-fill",
+ "calendar-check-line",
+ "calendar-close-fill",
+ "calendar-close-line",
+ "calendar-event-fill",
+ "calendar-event-line",
+ "calendar-fill",
+ "calendar-line",
+ "calendar-schedule-fill",
+ "calendar-schedule-line",
+ "calendar-todo-fill",
+ "calendar-todo-line",
+ "cloud-fill",
+ "cloud-line",
+ "cloud-off-fill",
+ "cloud-off-line",
+ "copyleft-fill",
+ "copyleft-line",
+ "copyright-fill",
+ "copyright-line",
+ "creative-commons-by-fill",
+ "creative-commons-by-line",
+ "creative-commons-fill",
+ "creative-commons-line",
+ "creative-commons-nc-fill",
+ "creative-commons-nc-line",
+ "creative-commons-nd-fill",
+ "creative-commons-nd-line",
+ "creative-commons-sa-fill",
+ "creative-commons-sa-line",
+ "creative-commons-zero-fill",
+ "creative-commons-zero-line",
+ "customer-service-2-fill",
+ "customer-service-2-line",
+ "customer-service-fill",
+ "customer-service-line",
+ "donut-chart-fill",
+ "donut-chart-line",
+ "flag-2-fill",
+ "flag-2-line",
+ "flag-fill",
+ "flag-line",
+ "flag-off-fill",
+ "flag-off-line",
+ "global-fill",
+ "global-line",
+ "honour-fill",
+ "honour-line",
+ "id-card-fill",
+ "id-card-line",
+ "inbox-2-fill",
+ "inbox-2-line",
+ "inbox-archive-fill",
+ "inbox-archive-line",
+ "inbox-fill",
+ "inbox-line",
+ "inbox-unarchive-fill",
+ "inbox-unarchive-line",
+ "info-card-fill",
+ "info-card-line",
+ "line-chart-fill",
+ "line-chart-line",
+ "links-fill",
+ "links-line",
+ "mail-add-fill",
+ "mail-add-line",
+ "mail-ai-fill",
+ "mail-ai-line",
+ "mail-check-fill",
+ "mail-check-line",
+ "mail-close-fill",
+ "mail-close-line",
+ "mail-download-fill",
+ "mail-download-line",
+ "mail-fill",
+ "mail-forbid-fill",
+ "mail-forbid-line",
+ "mail-line",
+ "mail-lock-fill",
+ "mail-lock-line",
+ "mail-open-fill",
+ "mail-open-line",
+ "mail-send-fill",
+ "mail-send-line",
+ "mail-settings-fill",
+ "mail-settings-line",
+ "mail-star-fill",
+ "mail-star-line",
+ "mail-unread-fill",
+ "mail-unread-line",
+ "mail-volume-fill",
+ "mail-volume-line",
+ "medal-2-fill",
+ "medal-2-line",
+ "medal-fill",
+ "medal-line",
+ "megaphone-fill",
+ "megaphone-line",
+ "pass-expired-fill",
+ "pass-expired-line",
+ "pass-pending-fill",
+ "pass-pending-line",
+ "pass-valid-fill",
+ "pass-valid-line",
+ "pie-chart-2-fill",
+ "pie-chart-2-line",
+ "pie-chart-box-fill",
+ "pie-chart-box-line",
+ "pie-chart-fill",
+ "pie-chart-line",
+ "presentation-fill",
+ "presentation-line",
+ "printer-cloud-fill",
+ "printer-cloud-line",
+ "printer-fill",
+ "printer-line",
+ "profile-fill",
+ "profile-line",
+ "projector-2-fill",
+ "projector-2-line",
+ "projector-fill",
+ "projector-line",
+ "record-mail-fill",
+ "record-mail-line",
+ "registered-fill",
+ "registered-line",
+ "reply-all-fill",
+ "reply-all-line",
+ "reply-fill",
+ "reply-line",
+ "send-plane-2-fill",
+ "send-plane-2-line",
+ "send-plane-fill",
+ "send-plane-line",
+ "seo-fill",
+ "seo-line",
+ "service-fill",
+ "service-line",
+ "shake-hands-fill",
+ "shake-hands-line",
+ "slideshow-2-fill",
+ "slideshow-2-line",
+ "slideshow-3-fill",
+ "slideshow-3-line",
+ "slideshow-4-fill",
+ "slideshow-4-line",
+ "slideshow-fill",
+ "slideshow-line",
+ "stack-fill",
+ "stack-line",
+ "trademark-fill",
+ "trademark-line",
+ "triangular-flag-fill",
+ "triangular-flag-line",
+ "verified-badge-fill",
+ "verified-badge-line",
+ "window-2-fill",
+ "window-2-line",
+ "window-fill",
+ "window-line"
+ ],
+ "Communication": [
+ "chat-1-fill",
+ "chat-1-line",
+ "chat-2-fill",
+ "chat-2-line",
+ "chat-3-fill",
+ "chat-3-line",
+ "chat-4-fill",
+ "chat-4-line",
+ "chat-ai-2-fill",
+ "chat-ai-2-line",
+ "chat-ai-3-fill",
+ "chat-ai-3-line",
+ "chat-ai-4-fill",
+ "chat-ai-4-line",
+ "chat-ai-fill",
+ "chat-ai-line",
+ "chat-check-fill",
+ "chat-check-line",
+ "chat-delete-fill",
+ "chat-delete-line",
+ "chat-download-fill",
+ "chat-download-line",
+ "chat-follow-up-fill",
+ "chat-follow-up-line",
+ "chat-forward-fill",
+ "chat-forward-line",
+ "chat-heart-fill",
+ "chat-heart-line",
+ "chat-history-fill",
+ "chat-history-line",
+ "chat-new-fill",
+ "chat-new-line",
+ "chat-off-fill",
+ "chat-off-line",
+ "chat-poll-fill",
+ "chat-poll-line",
+ "chat-private-fill",
+ "chat-private-line",
+ "chat-quote-fill",
+ "chat-quote-line",
+ "chat-search-fill",
+ "chat-search-line",
+ "chat-settings-fill",
+ "chat-settings-line",
+ "chat-smile-2-fill",
+ "chat-smile-2-line",
+ "chat-smile-3-fill",
+ "chat-smile-3-line",
+ "chat-smile-ai-3-fill",
+ "chat-smile-ai-3-line",
+ "chat-smile-ai-fill",
+ "chat-smile-ai-line",
+ "chat-smile-fill",
+ "chat-smile-line",
+ "chat-thread-fill",
+ "chat-thread-line",
+ "chat-unread-fill",
+ "chat-unread-line",
+ "chat-upload-fill",
+ "chat-upload-line",
+ "chat-voice-ai-fill",
+ "chat-voice-ai-line",
+ "chat-voice-fill",
+ "chat-voice-line",
+ "discuss-fill",
+ "discuss-line",
+ "emoji-sticker-fill",
+ "emoji-sticker-line",
+ "feedback-fill",
+ "feedback-line",
+ "message-2-fill",
+ "message-2-line",
+ "message-3-fill",
+ "message-3-line",
+ "message-ai-3-fill",
+ "message-ai-3-line",
+ "message-fill",
+ "message-line",
+ "question-answer-fill",
+ "question-answer-line",
+ "questionnaire-fill",
+ "questionnaire-line",
+ "speak-ai-fill",
+ "speak-ai-line",
+ "speak-fill",
+ "speak-line",
+ "speech-to-text-fill",
+ "speech-to-text-line",
+ "text-to-speech-fill",
+ "text-to-speech-line",
+ "video-chat-fill",
+ "video-chat-line"
+ ],
+ "Design": [
+ "ai-generate-2-fill",
+ "ai-generate-2-line",
+ "align-item-bottom-fill",
+ "align-item-bottom-line",
+ "align-item-horizontal-center-fill",
+ "align-item-horizontal-center-line",
+ "align-item-left-fill",
+ "align-item-left-line",
+ "align-item-right-fill",
+ "align-item-right-line",
+ "align-item-top-fill",
+ "align-item-top-line",
+ "align-item-vertical-center-fill",
+ "align-item-vertical-center-line",
+ "anticlockwise-2-fill",
+ "anticlockwise-2-line",
+ "anticlockwise-fill",
+ "anticlockwise-line",
+ "artboard-2-fill",
+ "artboard-2-line",
+ "artboard-fill",
+ "artboard-line",
+ "ball-pen-fill",
+ "ball-pen-line",
+ "blur-off-fill",
+ "blur-off-line",
+ "brush-2-fill",
+ "brush-2-line",
+ "brush-3-fill",
+ "brush-3-line",
+ "brush-4-fill",
+ "brush-4-line",
+ "brush-ai-3-fill",
+ "brush-ai-3-line",
+ "brush-ai-fill",
+ "brush-ai-line",
+ "brush-fill",
+ "brush-line",
+ "circle-fill",
+ "circle-line",
+ "clockwise-2-fill",
+ "clockwise-2-line",
+ "clockwise-fill",
+ "clockwise-line",
+ "collage-fill",
+ "collage-line",
+ "color-filter-ai-fill",
+ "color-filter-ai-line",
+ "color-filter-fill",
+ "color-filter-line",
+ "compasses-2-fill",
+ "compasses-2-line",
+ "compasses-fill",
+ "compasses-line",
+ "contrast-2-fill",
+ "contrast-2-line",
+ "contrast-drop-2-fill",
+ "contrast-drop-2-line",
+ "contrast-drop-fill",
+ "contrast-drop-line",
+ "contrast-fill",
+ "contrast-line",
+ "crop-2-fill",
+ "crop-2-line",
+ "crop-fill",
+ "crop-line",
+ "crosshair-2-fill",
+ "crosshair-2-line",
+ "crosshair-fill",
+ "crosshair-line",
+ "drag-drop-fill",
+ "drag-drop-line",
+ "drop-fill",
+ "drop-line",
+ "edit-2-fill",
+ "edit-2-line",
+ "edit-box-fill",
+ "edit-box-line",
+ "edit-circle-fill",
+ "edit-circle-line",
+ "edit-fill",
+ "edit-line",
+ "eraser-fill",
+ "eraser-line",
+ "flip-horizontal-2-fill",
+ "flip-horizontal-2-line",
+ "flip-horizontal-fill",
+ "flip-horizontal-line",
+ "flip-vertical-2-fill",
+ "flip-vertical-2-line",
+ "flip-vertical-fill",
+ "flip-vertical-line",
+ "focus-2-fill",
+ "focus-2-line",
+ "focus-3-fill",
+ "focus-3-line",
+ "focus-fill",
+ "focus-line",
+ "grid-fill",
+ "grid-line",
+ "hammer-fill",
+ "hammer-line",
+ "hexagon-fill",
+ "hexagon-line",
+ "ink-bottle-fill",
+ "ink-bottle-line",
+ "input-method-fill",
+ "input-method-line",
+ "layout-2-fill",
+ "layout-2-line",
+ "layout-3-fill",
+ "layout-3-line",
+ "layout-4-fill",
+ "layout-4-line",
+ "layout-5-fill",
+ "layout-5-line",
+ "layout-6-fill",
+ "layout-6-line",
+ "layout-bottom-2-fill",
+ "layout-bottom-2-line",
+ "layout-bottom-fill",
+ "layout-bottom-line",
+ "layout-column-fill",
+ "layout-column-line",
+ "layout-fill",
+ "layout-grid-2-fill",
+ "layout-grid-2-line",
+ "layout-grid-fill",
+ "layout-grid-line",
+ "layout-horizontal-fill",
+ "layout-horizontal-line",
+ "layout-left-2-fill",
+ "layout-left-2-line",
+ "layout-left-fill",
+ "layout-left-line",
+ "layout-line",
+ "layout-masonry-fill",
+ "layout-masonry-line",
+ "layout-right-2-fill",
+ "layout-right-2-line",
+ "layout-right-fill",
+ "layout-right-line",
+ "layout-row-fill",
+ "layout-row-line",
+ "layout-top-2-fill",
+ "layout-top-2-line",
+ "layout-top-fill",
+ "layout-top-line",
+ "layout-vertical-fill",
+ "layout-vertical-line",
+ "magic-fill",
+ "magic-line",
+ "mark-pen-fill",
+ "mark-pen-line",
+ "markup-fill",
+ "markup-line",
+ "octagon-fill",
+ "octagon-line",
+ "paint-brush-fill",
+ "paint-brush-line",
+ "paint-fill",
+ "paint-line",
+ "painting-ai-fill",
+ "painting-ai-line",
+ "painting-fill",
+ "painting-line",
+ "palette-fill",
+ "palette-line",
+ "pantone-fill",
+ "pantone-line",
+ "pen-nib-fill",
+ "pen-nib-line",
+ "pencil-ai-2-fill",
+ "pencil-ai-2-line",
+ "pencil-ai-fill",
+ "pencil-ai-line",
+ "pencil-fill",
+ "pencil-line",
+ "pencil-ruler-2-fill",
+ "pencil-ruler-2-line",
+ "pencil-ruler-fill",
+ "pencil-ruler-line",
+ "pentagon-fill",
+ "pentagon-line",
+ "quill-pen-ai-fill",
+ "quill-pen-ai-line",
+ "quill-pen-fill",
+ "quill-pen-line",
+ "rectangle-fill",
+ "rectangle-line",
+ "remix-fill",
+ "remix-line",
+ "ruler-2-fill",
+ "ruler-2-line",
+ "ruler-fill",
+ "ruler-line",
+ "scissors-2-fill",
+ "scissors-2-line",
+ "scissors-cut-fill",
+ "scissors-cut-line",
+ "scissors-fill",
+ "scissors-line",
+ "screenshot-2-fill",
+ "screenshot-2-line",
+ "screenshot-fill",
+ "screenshot-line",
+ "shadow-fill",
+ "shadow-line",
+ "shape-2-fill",
+ "shape-2-line",
+ "shape-fill",
+ "shape-line",
+ "shapes-fill",
+ "shapes-line",
+ "sip-fill",
+ "sip-line",
+ "slice-fill",
+ "slice-line",
+ "square-fill",
+ "square-line",
+ "t-box-fill",
+ "t-box-line",
+ "table-alt-fill",
+ "table-alt-line",
+ "table-fill",
+ "table-line",
+ "tools-fill",
+ "tools-line",
+ "triangle-fill",
+ "triangle-line",
+ "wrench-fill",
+ "wrench-line"
+ ],
+ "Development": [
+ "braces-fill",
+ "braces-line",
+ "brackets-fill",
+ "brackets-line",
+ "bug-2-fill",
+ "bug-2-line",
+ "bug-fill",
+ "bug-line",
+ "code-ai-fill",
+ "code-ai-line",
+ "code-box-fill",
+ "code-box-line",
+ "code-fill",
+ "code-line",
+ "code-s-fill",
+ "code-s-line",
+ "code-s-slash-fill",
+ "code-s-slash-line",
+ "command-fill",
+ "command-line",
+ "css3-fill",
+ "css3-line",
+ "cursor-fill",
+ "cursor-line",
+ "git-branch-fill",
+ "git-branch-line",
+ "git-close-pull-request-fill",
+ "git-close-pull-request-line",
+ "git-commit-fill",
+ "git-commit-line",
+ "git-fork-fill",
+ "git-fork-line",
+ "git-merge-fill",
+ "git-merge-line",
+ "git-pr-draft-fill",
+ "git-pr-draft-line",
+ "git-pull-request-fill",
+ "git-pull-request-line",
+ "git-repository-commits-fill",
+ "git-repository-commits-line",
+ "git-repository-fill",
+ "git-repository-line",
+ "git-repository-private-fill",
+ "git-repository-private-line",
+ "html5-fill",
+ "html5-line",
+ "javascript-fill",
+ "javascript-line",
+ "parentheses-fill",
+ "parentheses-line",
+ "php-fill",
+ "php-line",
+ "puzzle-2-fill",
+ "puzzle-2-line",
+ "puzzle-fill",
+ "puzzle-line",
+ "terminal-box-fill",
+ "terminal-box-line",
+ "terminal-fill",
+ "terminal-line",
+ "terminal-window-fill",
+ "terminal-window-line"
+ ],
+ "Device": [
+ "airplay-fill",
+ "airplay-line",
+ "barcode-box-fill",
+ "barcode-box-line",
+ "barcode-fill",
+ "barcode-line",
+ "base-station-fill",
+ "base-station-line",
+ "battery-2-charge-fill",
+ "battery-2-charge-line",
+ "battery-2-fill",
+ "battery-2-line",
+ "battery-charge-fill",
+ "battery-charge-line",
+ "battery-fill",
+ "battery-line",
+ "battery-low-fill",
+ "battery-low-line",
+ "battery-saver-fill",
+ "battery-saver-line",
+ "battery-share-fill",
+ "battery-share-line",
+ "bluetooth-connect-fill",
+ "bluetooth-connect-line",
+ "bluetooth-fill",
+ "bluetooth-line",
+ "cast-fill",
+ "cast-line",
+ "cellphone-fill",
+ "cellphone-line",
+ "computer-fill",
+ "computer-line",
+ "cpu-fill",
+ "cpu-line",
+ "dashboard-2-fill",
+ "dashboard-2-line",
+ "dashboard-3-fill",
+ "dashboard-3-line",
+ "database-2-fill",
+ "database-2-line",
+ "database-fill",
+ "database-line",
+ "device-fill",
+ "device-line",
+ "device-recover-fill",
+ "device-recover-line",
+ "dual-sim-1-fill",
+ "dual-sim-1-line",
+ "dual-sim-2-fill",
+ "dual-sim-2-line",
+ "fingerprint-2-fill",
+ "fingerprint-2-line",
+ "fingerprint-fill",
+ "fingerprint-line",
+ "gamepad-fill",
+ "gamepad-line",
+ "gps-fill",
+ "gps-line",
+ "gradienter-fill",
+ "gradienter-line",
+ "hard-drive-2-fill",
+ "hard-drive-2-line",
+ "hard-drive-3-fill",
+ "hard-drive-3-line",
+ "hard-drive-fill",
+ "hard-drive-line",
+ "hotspot-fill",
+ "hotspot-line",
+ "install-fill",
+ "install-line",
+ "instance-fill",
+ "instance-line",
+ "keyboard-box-fill",
+ "keyboard-box-line",
+ "keyboard-fill",
+ "keyboard-line",
+ "mac-fill",
+ "mac-line",
+ "macbook-fill",
+ "macbook-line",
+ "mobile-download-fill",
+ "mobile-download-line",
+ "mouse-fill",
+ "mouse-line",
+ "phone-fill",
+ "phone-find-fill",
+ "phone-find-line",
+ "phone-line",
+ "phone-lock-fill",
+ "phone-lock-line",
+ "qr-code-fill",
+ "qr-code-line",
+ "qr-scan-2-fill",
+ "qr-scan-2-line",
+ "qr-scan-fill",
+ "qr-scan-line",
+ "radar-fill",
+ "radar-line",
+ "ram-2-fill",
+ "ram-2-line",
+ "ram-fill",
+ "ram-line",
+ "remote-control-2-fill",
+ "remote-control-2-line",
+ "remote-control-fill",
+ "remote-control-line",
+ "restart-fill",
+ "restart-line",
+ "rfid-fill",
+ "rfid-line",
+ "rotate-lock-fill",
+ "rotate-lock-line",
+ "router-fill",
+ "router-line",
+ "rss-fill",
+ "rss-line",
+ "save-2-fill",
+ "save-2-line",
+ "save-3-fill",
+ "save-3-line",
+ "save-fill",
+ "save-line",
+ "scan-2-fill",
+ "scan-2-line",
+ "scan-fill",
+ "scan-line",
+ "sd-card-fill",
+ "sd-card-line",
+ "sd-card-mini-fill",
+ "sd-card-mini-line",
+ "sensor-fill",
+ "sensor-line",
+ "server-fill",
+ "server-line",
+ "shut-down-fill",
+ "shut-down-line",
+ "signal-wifi-1-fill",
+ "signal-wifi-1-line",
+ "signal-wifi-2-fill",
+ "signal-wifi-2-line",
+ "signal-wifi-3-fill",
+ "signal-wifi-3-line",
+ "signal-wifi-error-fill",
+ "signal-wifi-error-line",
+ "signal-wifi-fill",
+ "signal-wifi-line",
+ "signal-wifi-off-fill",
+ "signal-wifi-off-line",
+ "sim-card-2-fill",
+ "sim-card-2-line",
+ "sim-card-fill",
+ "sim-card-line",
+ "smartphone-fill",
+ "smartphone-line",
+ "tablet-fill",
+ "tablet-line",
+ "tv-2-fill",
+ "tv-2-line",
+ "tv-fill",
+ "tv-line",
+ "u-disk-fill",
+ "u-disk-line",
+ "uninstall-fill",
+ "uninstall-line",
+ "usb-fill",
+ "usb-line",
+ "wifi-fill",
+ "wifi-line",
+ "wifi-off-fill",
+ "wifi-off-line",
+ "wireless-charging-fill",
+ "wireless-charging-line"
+ ],
+ "Document": [
+ "article-fill",
+ "article-line",
+ "bill-fill",
+ "bill-line",
+ "book-2-fill",
+ "book-2-line",
+ "book-3-fill",
+ "book-3-line",
+ "book-ai-fill",
+ "book-ai-line",
+ "book-fill",
+ "book-line",
+ "book-marked-fill",
+ "book-marked-line",
+ "book-open-fill",
+ "book-open-line",
+ "book-read-fill",
+ "book-read-line",
+ "booklet-fill",
+ "booklet-line",
+ "clipboard-fill",
+ "clipboard-line",
+ "contacts-book-2-fill",
+ "contacts-book-2-line",
+ "contacts-book-3-fill",
+ "contacts-book-3-line",
+ "contacts-book-fill",
+ "contacts-book-line",
+ "contacts-book-upload-fill",
+ "contacts-book-upload-line",
+ "contract-fill",
+ "contract-line",
+ "draft-fill",
+ "draft-line",
+ "file-2-fill",
+ "file-2-line",
+ "file-3-fill",
+ "file-3-line",
+ "file-4-fill",
+ "file-4-line",
+ "file-add-fill",
+ "file-add-line",
+ "file-ai-2-fill",
+ "file-ai-2-line",
+ "file-ai-fill",
+ "file-ai-line",
+ "file-chart-2-fill",
+ "file-chart-2-line",
+ "file-chart-fill",
+ "file-chart-line",
+ "file-check-fill",
+ "file-check-line",
+ "file-close-fill",
+ "file-close-line",
+ "file-cloud-fill",
+ "file-cloud-line",
+ "file-code-fill",
+ "file-code-line",
+ "file-copy-2-fill",
+ "file-copy-2-line",
+ "file-copy-fill",
+ "file-copy-line",
+ "file-damage-fill",
+ "file-damage-line",
+ "file-download-fill",
+ "file-download-line",
+ "file-edit-fill",
+ "file-edit-line",
+ "file-excel-2-fill",
+ "file-excel-2-line",
+ "file-excel-fill",
+ "file-excel-line",
+ "file-fill",
+ "file-forbid-fill",
+ "file-forbid-line",
+ "file-gif-fill",
+ "file-gif-line",
+ "file-history-fill",
+ "file-history-line",
+ "file-hwp-fill",
+ "file-hwp-line",
+ "file-image-fill",
+ "file-image-line",
+ "file-info-fill",
+ "file-info-line",
+ "file-line",
+ "file-list-2-fill",
+ "file-list-2-line",
+ "file-list-3-fill",
+ "file-list-3-line",
+ "file-list-fill",
+ "file-list-line",
+ "file-lock-fill",
+ "file-lock-line",
+ "file-marked-fill",
+ "file-marked-line",
+ "file-music-fill",
+ "file-music-line",
+ "file-paper-2-fill",
+ "file-paper-2-line",
+ "file-paper-fill",
+ "file-paper-line",
+ "file-pdf-2-fill",
+ "file-pdf-2-line",
+ "file-pdf-fill",
+ "file-pdf-line",
+ "file-ppt-2-fill",
+ "file-ppt-2-line",
+ "file-ppt-fill",
+ "file-ppt-line",
+ "file-reduce-fill",
+ "file-reduce-line",
+ "file-search-fill",
+ "file-search-line",
+ "file-settings-fill",
+ "file-settings-line",
+ "file-shield-2-fill",
+ "file-shield-2-line",
+ "file-shield-fill",
+ "file-shield-line",
+ "file-shred-fill",
+ "file-shred-line",
+ "file-text-fill",
+ "file-text-line",
+ "file-transfer-fill",
+ "file-transfer-line",
+ "file-unknow-fill",
+ "file-unknow-line",
+ "file-upload-fill",
+ "file-upload-line",
+ "file-user-fill",
+ "file-user-line",
+ "file-video-fill",
+ "file-video-line",
+ "file-warning-fill",
+ "file-warning-line",
+ "file-word-2-fill",
+ "file-word-2-line",
+ "file-word-fill",
+ "file-word-line",
+ "file-zip-fill",
+ "file-zip-line",
+ "folder-2-fill",
+ "folder-2-line",
+ "folder-3-fill",
+ "folder-3-line",
+ "folder-4-fill",
+ "folder-4-line",
+ "folder-5-fill",
+ "folder-5-line",
+ "folder-6-fill",
+ "folder-6-line",
+ "folder-add-fill",
+ "folder-add-line",
+ "folder-chart-2-fill",
+ "folder-chart-2-line",
+ "folder-chart-fill",
+ "folder-chart-line",
+ "folder-check-fill",
+ "folder-check-line",
+ "folder-close-fill",
+ "folder-close-line",
+ "folder-cloud-fill",
+ "folder-cloud-line",
+ "folder-download-fill",
+ "folder-download-line",
+ "folder-fill",
+ "folder-forbid-fill",
+ "folder-forbid-line",
+ "folder-history-fill",
+ "folder-history-line",
+ "folder-image-fill",
+ "folder-image-line",
+ "folder-info-fill",
+ "folder-info-line",
+ "folder-keyhole-fill",
+ "folder-keyhole-line",
+ "folder-line",
+ "folder-lock-fill",
+ "folder-lock-line",
+ "folder-music-fill",
+ "folder-music-line",
+ "folder-open-fill",
+ "folder-open-line",
+ "folder-received-fill",
+ "folder-received-line",
+ "folder-reduce-fill",
+ "folder-reduce-line",
+ "folder-settings-fill",
+ "folder-settings-line",
+ "folder-shared-fill",
+ "folder-shared-line",
+ "folder-shield-2-fill",
+ "folder-shield-2-line",
+ "folder-shield-fill",
+ "folder-shield-line",
+ "folder-transfer-fill",
+ "folder-transfer-line",
+ "folder-unknow-fill",
+ "folder-unknow-line",
+ "folder-upload-fill",
+ "folder-upload-line",
+ "folder-user-fill",
+ "folder-user-line",
+ "folder-video-fill",
+ "folder-video-line",
+ "folder-warning-fill",
+ "folder-warning-line",
+ "folder-zip-fill",
+ "folder-zip-line",
+ "folders-fill",
+ "folders-line",
+ "keynote-fill",
+ "keynote-line",
+ "markdown-fill",
+ "markdown-line",
+ "news-fill",
+ "news-line",
+ "newspaper-fill",
+ "newspaper-line",
+ "numbers-fill",
+ "numbers-line",
+ "pages-fill",
+ "pages-line",
+ "receipt-fill",
+ "receipt-line",
+ "sticky-note-2-fill",
+ "sticky-note-2-line",
+ "sticky-note-add-fill",
+ "sticky-note-add-line",
+ "sticky-note-fill",
+ "sticky-note-line",
+ "survey-fill",
+ "survey-line",
+ "task-fill",
+ "task-line",
+ "todo-fill",
+ "todo-line"
+ ],
+ "Editor": [
+ "a-b",
+ "ai",
+ "ai-generate",
+ "ai-generate-2",
+ "ai-generate-text",
+ "align-bottom",
+ "align-center",
+ "align-justify",
+ "align-left",
+ "align-right",
+ "align-top",
+ "align-vertically",
+ "asterisk",
+ "attachment-2",
+ "bold",
+ "bring-forward",
+ "bring-to-front",
+ "calendar-view",
+ "carousel-view",
+ "code-block",
+ "code-view",
+ "custom-size",
+ "delete-column",
+ "delete-row",
+ "double-quotes-l",
+ "double-quotes-r",
+ "draggable",
+ "dropdown-list",
+ "emphasis",
+ "emphasis-cn",
+ "english-input",
+ "flow-chart",
+ "focus-mode",
+ "font-color",
+ "font-family",
+ "font-mono",
+ "font-sans",
+ "font-sans-serif",
+ "font-size",
+ "font-size-2",
+ "font-size-ai",
+ "format-clear",
+ "formula",
+ "functions",
+ "gallery-view",
+ "gallery-view-2",
+ "h-1",
+ "h-2",
+ "h-3",
+ "h-4",
+ "h-5",
+ "h-6",
+ "hand",
+ "hashtag",
+ "heading",
+ "indent-decrease",
+ "indent-increase",
+ "info-i",
+ "input-cursor-move",
+ "input-field",
+ "insert-column-left",
+ "insert-column-right",
+ "insert-row-bottom",
+ "insert-row-top",
+ "italic",
+ "kanban-view",
+ "kanban-view-2",
+ "letter-spacing-2",
+ "line-height",
+ "line-height-2",
+ "link",
+ "link-m",
+ "link-unlink",
+ "link-unlink-m",
+ "list-check",
+ "list-check-2",
+ "list-check-3",
+ "list-indefinite",
+ "list-ordered",
+ "list-ordered-2",
+ "list-radio",
+ "list-unordered",
+ "list-view",
+ "merge-cells-horizontal",
+ "merge-cells-vertical",
+ "mind-map",
+ "node-tree",
+ "number-0",
+ "number-1",
+ "number-2",
+ "number-3",
+ "number-4",
+ "number-5",
+ "number-6",
+ "number-7",
+ "number-8",
+ "number-9",
+ "omega",
+ "organization-chart",
+ "overline",
+ "page-separator",
+ "paragraph",
+ "pinyin-input",
+ "question-mark",
+ "quote-text",
+ "rounded-corner",
+ "send-backward",
+ "send-to-back",
+ "separator",
+ "single-quotes-l",
+ "single-quotes-r",
+ "sketching",
+ "slash-commands",
+ "slash-commands-2",
+ "slideshow-view",
+ "sort-alphabet-asc",
+ "sort-alphabet-desc",
+ "sort-asc",
+ "sort-desc",
+ "sort-number-asc",
+ "sort-number-desc",
+ "space",
+ "split-cells-horizontal",
+ "split-cells-vertical",
+ "square-root",
+ "stacked-view",
+ "strikethrough",
+ "strikethrough-2",
+ "subscript",
+ "subscript-2",
+ "superscript",
+ "superscript-2",
+ "table-2",
+ "table-3",
+ "table-view",
+ "text",
+ "text-block",
+ "text-direction-l",
+ "text-direction-r",
+ "text-snippet",
+ "text-spacing",
+ "text-wrap",
+ "timeline-view",
+ "translate",
+ "translate-2",
+ "translate-ai",
+ "translate-ai-2",
+ "underline",
+ "wubi-input"
+ ],
+ "Finance": [
+ "24-hours-fill",
+ "24-hours-line",
+ "auction-fill",
+ "auction-line",
+ "bank-card-2-fill",
+ "bank-card-2-line",
+ "bank-card-fill",
+ "bank-card-line",
+ "bit-coin-fill",
+ "bit-coin-line",
+ "bnb-fill",
+ "bnb-line",
+ "btc-fill",
+ "btc-line",
+ "cash-fill",
+ "cash-line",
+ "coin-fill",
+ "coin-line",
+ "coins-fill",
+ "coins-line",
+ "copper-coin-fill",
+ "copper-coin-line",
+ "copper-diamond-fill",
+ "copper-diamond-line",
+ "coupon-2-fill",
+ "coupon-2-line",
+ "coupon-3-fill",
+ "coupon-3-line",
+ "coupon-4-fill",
+ "coupon-4-line",
+ "coupon-5-fill",
+ "coupon-5-line",
+ "coupon-fill",
+ "coupon-line",
+ "currency-fill",
+ "currency-line",
+ "diamond-fill",
+ "diamond-line",
+ "diamond-ring-fill",
+ "diamond-ring-line",
+ "discount-percent-fill",
+ "discount-percent-line",
+ "eth-fill",
+ "eth-line",
+ "exchange-2-fill",
+ "exchange-2-line",
+ "exchange-box-fill",
+ "exchange-box-line",
+ "exchange-cny-fill",
+ "exchange-cny-line",
+ "exchange-dollar-fill",
+ "exchange-dollar-line",
+ "exchange-fill",
+ "exchange-funds-fill",
+ "exchange-funds-line",
+ "exchange-line",
+ "funds-box-fill",
+ "funds-box-line",
+ "funds-fill",
+ "funds-line",
+ "gift-2-fill",
+ "gift-2-line",
+ "gift-fill",
+ "gift-line",
+ "hand-coin-fill",
+ "hand-coin-line",
+ "hand-heart-fill",
+ "hand-heart-line",
+ "increase-decrease-fill",
+ "increase-decrease-line",
+ "jewelry-fill",
+ "jewelry-line",
+ "money-cny-box-fill",
+ "money-cny-box-line",
+ "money-cny-circle-fill",
+ "money-cny-circle-line",
+ "money-dollar-box-fill",
+ "money-dollar-box-line",
+ "money-dollar-circle-fill",
+ "money-dollar-circle-line",
+ "money-euro-box-fill",
+ "money-euro-box-line",
+ "money-euro-circle-fill",
+ "money-euro-circle-line",
+ "money-pound-box-fill",
+ "money-pound-box-line",
+ "money-pound-circle-fill",
+ "money-pound-circle-line",
+ "money-rupee-circle-fill",
+ "money-rupee-circle-line",
+ "nft-fill",
+ "nft-line",
+ "no-credit-card-fill",
+ "no-credit-card-line",
+ "p2p-fill",
+ "p2p-line",
+ "percent-fill",
+ "percent-line",
+ "price-tag-2-fill",
+ "price-tag-2-line",
+ "price-tag-3-fill",
+ "price-tag-3-line",
+ "price-tag-fill",
+ "price-tag-line",
+ "red-packet-fill",
+ "red-packet-line",
+ "refund-2-fill",
+ "refund-2-line",
+ "refund-fill",
+ "refund-line",
+ "safe-2-fill",
+ "safe-2-line",
+ "safe-3-fill",
+ "safe-3-line",
+ "safe-fill",
+ "safe-line",
+ "secure-payment-fill",
+ "secure-payment-line",
+ "shopping-bag-2-fill",
+ "shopping-bag-2-line",
+ "shopping-bag-3-fill",
+ "shopping-bag-3-line",
+ "shopping-bag-4-fill",
+ "shopping-bag-4-line",
+ "shopping-bag-fill",
+ "shopping-bag-line",
+ "shopping-basket-2-fill",
+ "shopping-basket-2-line",
+ "shopping-basket-fill",
+ "shopping-basket-line",
+ "shopping-cart-2-fill",
+ "shopping-cart-2-line",
+ "shopping-cart-fill",
+ "shopping-cart-line",
+ "stock-fill",
+ "stock-line",
+ "swap-2-fill",
+ "swap-2-line",
+ "swap-3-fill",
+ "swap-3-line",
+ "swap-box-fill",
+ "swap-box-line",
+ "swap-fill",
+ "swap-line",
+ "ticket-2-fill",
+ "ticket-2-line",
+ "ticket-fill",
+ "ticket-line",
+ "token-swap-fill",
+ "token-swap-line",
+ "trophy-fill",
+ "trophy-line",
+ "vip-crown-2-fill",
+ "vip-crown-2-line",
+ "vip-crown-fill",
+ "vip-crown-line",
+ "vip-diamond-fill",
+ "vip-diamond-line",
+ "vip-fill",
+ "vip-line",
+ "wallet-2-fill",
+ "wallet-2-line",
+ "wallet-3-fill",
+ "wallet-3-line",
+ "wallet-fill",
+ "wallet-line",
+ "water-flash-fill",
+ "water-flash-line",
+ "xrp-fill",
+ "xrp-line",
+ "xtz-fill",
+ "xtz-line"
+ ],
+ "Food": [
+ "beer-fill",
+ "beer-line",
+ "bowl-fill",
+ "bowl-line",
+ "bread-fill",
+ "bread-line",
+ "cake-2-fill",
+ "cake-2-line",
+ "cake-3-fill",
+ "cake-3-line",
+ "cake-fill",
+ "cake-line",
+ "cup-fill",
+ "cup-line",
+ "drinks-2-fill",
+ "drinks-2-line",
+ "drinks-fill",
+ "drinks-line",
+ "goblet-2-fill",
+ "goblet-2-line",
+ "goblet-broken-fill",
+ "goblet-broken-line",
+ "goblet-fill",
+ "goblet-line",
+ "knife-blood-fill",
+ "knife-blood-line",
+ "knife-fill",
+ "knife-line",
+ "restaurant-2-fill",
+ "restaurant-2-line",
+ "restaurant-fill",
+ "restaurant-line"
+ ],
+ "Health & Medical": [
+ "aed-electrodes-fill",
+ "aed-electrodes-line",
+ "aed-fill",
+ "aed-line",
+ "atom-fill",
+ "atom-line",
+ "brain-2-fill",
+ "brain-2-line",
+ "brain-3-fill",
+ "brain-3-line",
+ "brain-ai-3-fill",
+ "brain-ai-3-line",
+ "brain-fill",
+ "brain-line",
+ "capsule-fill",
+ "capsule-line",
+ "dislike-fill",
+ "dislike-line",
+ "dna-fill",
+ "dna-line",
+ "dossier-fill",
+ "dossier-line",
+ "dropper-fill",
+ "dropper-line",
+ "empathize-fill",
+ "empathize-line",
+ "first-aid-kit-fill",
+ "first-aid-kit-line",
+ "flask-fill",
+ "flask-line",
+ "hand-sanitizer-fill",
+ "hand-sanitizer-line",
+ "health-book-fill",
+ "health-book-line",
+ "heart-2-fill",
+ "heart-2-line",
+ "heart-3-fill",
+ "heart-3-line",
+ "heart-add-2-fill",
+ "heart-add-2-line",
+ "heart-add-fill",
+ "heart-add-line",
+ "heart-fill",
+ "heart-line",
+ "heart-pulse-fill",
+ "heart-pulse-line",
+ "hearts-fill",
+ "hearts-line",
+ "infrared-thermometer-fill",
+ "infrared-thermometer-line",
+ "lungs-fill",
+ "lungs-line",
+ "medicine-bottle-fill",
+ "medicine-bottle-line",
+ "mental-health-fill",
+ "mental-health-line",
+ "microscope-fill",
+ "microscope-line",
+ "nurse-fill",
+ "nurse-line",
+ "psychotherapy-fill",
+ "psychotherapy-line",
+ "pulse-ai-fill",
+ "pulse-ai-line",
+ "pulse-fill",
+ "pulse-line",
+ "rest-time-fill",
+ "rest-time-line",
+ "stethoscope-fill",
+ "stethoscope-line",
+ "surgical-mask-fill",
+ "surgical-mask-line",
+ "syringe-fill",
+ "syringe-line",
+ "test-tube-fill",
+ "test-tube-line",
+ "thermometer-fill",
+ "thermometer-line",
+ "virus-fill",
+ "virus-line",
+ "zzz-fill",
+ "zzz-line"
+ ],
+ "Logos": [
+ "alibaba-cloud-fill",
+ "alibaba-cloud-line",
+ "alipay-fill",
+ "alipay-line",
+ "amazon-fill",
+ "amazon-line",
+ "android-fill",
+ "android-line",
+ "angularjs-fill",
+ "angularjs-line",
+ "anthropic-fill",
+ "anthropic-line",
+ "app-store-fill",
+ "app-store-line",
+ "apple-fill",
+ "apple-line",
+ "baidu-fill",
+ "baidu-line",
+ "bard-fill",
+ "bard-line",
+ "behance-fill",
+ "behance-line",
+ "bilibili-fill",
+ "bilibili-line",
+ "blender-fill",
+ "blender-line",
+ "blogger-fill",
+ "blogger-line",
+ "bluesky-fill",
+ "bluesky-line",
+ "bootstrap-fill",
+ "bootstrap-line",
+ "centos-fill",
+ "centos-line",
+ "chrome-fill",
+ "chrome-line",
+ "claude-fill",
+ "claude-line",
+ "codepen-fill",
+ "codepen-line",
+ "copilot-fill",
+ "copilot-line",
+ "coreos-fill",
+ "coreos-line",
+ "deepseek-fill",
+ "deepseek-line",
+ "dingding-fill",
+ "dingding-line",
+ "discord-fill",
+ "discord-line",
+ "disqus-fill",
+ "disqus-line",
+ "douban-fill",
+ "douban-line",
+ "dribbble-fill",
+ "dribbble-line",
+ "drive-fill",
+ "drive-line",
+ "dropbox-fill",
+ "dropbox-line",
+ "edge-fill",
+ "edge-line",
+ "edge-new-fill",
+ "edge-new-line",
+ "evernote-fill",
+ "evernote-line",
+ "facebook-box-fill",
+ "facebook-box-line",
+ "facebook-circle-fill",
+ "facebook-circle-line",
+ "facebook-fill",
+ "facebook-line",
+ "fediverse-fill",
+ "fediverse-line",
+ "figma-fill",
+ "figma-line",
+ "finder-fill",
+ "finder-line",
+ "firebase-fill",
+ "firebase-line",
+ "firefox-browser-fill",
+ "firefox-browser-line",
+ "firefox-fill",
+ "firefox-line",
+ "flickr-fill",
+ "flickr-line",
+ "flutter-fill",
+ "flutter-line",
+ "friendica-fill",
+ "friendica-line",
+ "gatsby-fill",
+ "gatsby-line",
+ "gemini-fill",
+ "gemini-line",
+ "github-fill",
+ "github-line",
+ "gitlab-fill",
+ "gitlab-line",
+ "google-fill",
+ "google-line",
+ "google-play-fill",
+ "google-play-line",
+ "honor-of-kings-fill",
+ "honor-of-kings-line",
+ "ie-fill",
+ "ie-line",
+ "instagram-fill",
+ "instagram-line",
+ "invision-fill",
+ "invision-line",
+ "java-fill",
+ "java-line",
+ "kakao-talk-fill",
+ "kakao-talk-line",
+ "kick-fill",
+ "kick-line",
+ "line-fill",
+ "line-line",
+ "linkedin-box-fill",
+ "linkedin-box-line",
+ "linkedin-fill",
+ "linkedin-line",
+ "mastercard-fill",
+ "mastercard-line",
+ "mastodon-fill",
+ "mastodon-line",
+ "medium-fill",
+ "medium-line",
+ "messenger-fill",
+ "messenger-line",
+ "meta-fill",
+ "meta-line",
+ "microsoft-fill",
+ "microsoft-line",
+ "microsoft-loop-fill",
+ "microsoft-loop-line",
+ "mini-program-fill",
+ "mini-program-line",
+ "mixtral-fill",
+ "mixtral-line",
+ "netease-cloud-music-fill",
+ "netease-cloud-music-line",
+ "netflix-fill",
+ "netflix-line",
+ "nextjs-fill",
+ "nextjs-line",
+ "nodejs-fill",
+ "nodejs-line",
+ "notion-fill",
+ "notion-line",
+ "npmjs-fill",
+ "npmjs-line",
+ "open-source-fill",
+ "open-source-line",
+ "openai-fill",
+ "openai-line",
+ "openbase-fill",
+ "openbase-line",
+ "opera-fill",
+ "opera-line",
+ "patreon-fill",
+ "patreon-line",
+ "paypal-fill",
+ "paypal-line",
+ "perplexity-fill",
+ "perplexity-line",
+ "pinterest-fill",
+ "pinterest-line",
+ "pix-fill",
+ "pix-line",
+ "pixelfed-fill",
+ "pixelfed-line",
+ "playstation-fill",
+ "playstation-line",
+ "product-hunt-fill",
+ "product-hunt-line",
+ "qq-fill",
+ "qq-line",
+ "reactjs-fill",
+ "reactjs-line",
+ "reddit-fill",
+ "reddit-line",
+ "remix-run-fill",
+ "remix-run-line",
+ "remixicon-fill",
+ "remixicon-line",
+ "safari-fill",
+ "safari-line",
+ "skype-fill",
+ "skype-line",
+ "slack-fill",
+ "slack-line",
+ "snapchat-fill",
+ "snapchat-line",
+ "soundcloud-fill",
+ "soundcloud-line",
+ "spectrum-fill",
+ "spectrum-line",
+ "spotify-fill",
+ "spotify-line",
+ "stack-overflow-fill",
+ "stack-overflow-line",
+ "stackshare-fill",
+ "stackshare-line",
+ "steam-fill",
+ "steam-line",
+ "supabase-fill",
+ "supabase-line",
+ "svelte-fill",
+ "svelte-line",
+ "switch-fill",
+ "switch-line",
+ "tailwind-css-fill",
+ "tailwind-css-line",
+ "taobao-fill",
+ "taobao-line",
+ "telegram-2-fill",
+ "telegram-2-line",
+ "telegram-fill",
+ "telegram-line",
+ "threads-fill",
+ "threads-line",
+ "tiktok-fill",
+ "tiktok-line",
+ "trello-fill",
+ "trello-line",
+ "tumblr-fill",
+ "tumblr-line",
+ "twitch-fill",
+ "twitch-line",
+ "twitter-fill",
+ "twitter-line",
+ "twitter-x-fill",
+ "twitter-x-line",
+ "ubuntu-fill",
+ "ubuntu-line",
+ "unsplash-fill",
+ "unsplash-line",
+ "vercel-fill",
+ "vercel-line",
+ "vimeo-fill",
+ "vimeo-line",
+ "visa-fill",
+ "visa-line",
+ "vk-fill",
+ "vk-line",
+ "vuejs-fill",
+ "vuejs-line",
+ "webhook-fill",
+ "webhook-line",
+ "wechat-2-fill",
+ "wechat-2-line",
+ "wechat-channels-fill",
+ "wechat-channels-line",
+ "wechat-fill",
+ "wechat-line",
+ "wechat-pay-fill",
+ "wechat-pay-line",
+ "weibo-fill",
+ "weibo-line",
+ "whatsapp-fill",
+ "whatsapp-line",
+ "windows-fill",
+ "windows-line",
+ "wordpress-fill",
+ "wordpress-line",
+ "xbox-fill",
+ "xbox-line",
+ "xing-fill",
+ "xing-line",
+ "youtube-fill",
+ "youtube-line",
+ "yuque-fill",
+ "yuque-line",
+ "zcool-fill",
+ "zcool-line",
+ "zhihu-fill",
+ "zhihu-line"
+ ],
+ "Map": [
+ "anchor-fill",
+ "anchor-line",
+ "barricade-fill",
+ "barricade-line",
+ "bike-fill",
+ "bike-line",
+ "bus-2-fill",
+ "bus-2-line",
+ "bus-fill",
+ "bus-line",
+ "bus-wifi-fill",
+ "bus-wifi-line",
+ "car-fill",
+ "car-line",
+ "car-washing-fill",
+ "car-washing-line",
+ "caravan-fill",
+ "caravan-line",
+ "charging-pile-2-fill",
+ "charging-pile-2-line",
+ "charging-pile-fill",
+ "charging-pile-line",
+ "china-railway-fill",
+ "china-railway-line",
+ "compass-2-fill",
+ "compass-2-line",
+ "compass-3-fill",
+ "compass-3-line",
+ "compass-4-fill",
+ "compass-4-line",
+ "compass-discover-fill",
+ "compass-discover-line",
+ "compass-fill",
+ "compass-line",
+ "direction-fill",
+ "direction-line",
+ "e-bike-2-fill",
+ "e-bike-2-line",
+ "e-bike-fill",
+ "e-bike-line",
+ "earth-fill",
+ "earth-line",
+ "flight-land-fill",
+ "flight-land-line",
+ "flight-takeoff-fill",
+ "flight-takeoff-line",
+ "footprint-fill",
+ "footprint-line",
+ "gas-station-fill",
+ "gas-station-line",
+ "globe-fill",
+ "globe-line",
+ "guide-fill",
+ "guide-line",
+ "hotel-bed-fill",
+ "hotel-bed-line",
+ "lifebuoy-fill",
+ "lifebuoy-line",
+ "luggage-cart-fill",
+ "luggage-cart-line",
+ "luggage-deposit-fill",
+ "luggage-deposit-line",
+ "map-2-fill",
+ "map-2-line",
+ "map-fill",
+ "map-line",
+ "map-pin-2-fill",
+ "map-pin-2-line",
+ "map-pin-3-fill",
+ "map-pin-3-line",
+ "map-pin-4-fill",
+ "map-pin-4-line",
+ "map-pin-5-fill",
+ "map-pin-5-line",
+ "map-pin-add-fill",
+ "map-pin-add-line",
+ "map-pin-fill",
+ "map-pin-line",
+ "map-pin-range-fill",
+ "map-pin-range-line",
+ "map-pin-time-fill",
+ "map-pin-time-line",
+ "map-pin-user-fill",
+ "map-pin-user-line",
+ "motorbike-fill",
+ "motorbike-line",
+ "navigation-fill",
+ "navigation-line",
+ "oil-fill",
+ "oil-line",
+ "parking-box-fill",
+ "parking-box-line",
+ "parking-fill",
+ "parking-line",
+ "passport-fill",
+ "passport-line",
+ "pin-distance-fill",
+ "pin-distance-line",
+ "plane-fill",
+ "plane-line",
+ "planet-fill",
+ "planet-line",
+ "police-car-fill",
+ "police-car-line",
+ "pushpin-2-fill",
+ "pushpin-2-line",
+ "pushpin-fill",
+ "pushpin-line",
+ "riding-fill",
+ "riding-line",
+ "road-map-fill",
+ "road-map-line",
+ "roadster-fill",
+ "roadster-line",
+ "rocket-2-fill",
+ "rocket-2-line",
+ "rocket-fill",
+ "rocket-line",
+ "route-fill",
+ "route-line",
+ "run-fill",
+ "run-line",
+ "sailboat-fill",
+ "sailboat-line",
+ "ship-2-fill",
+ "ship-2-line",
+ "ship-fill",
+ "ship-line",
+ "signal-tower-fill",
+ "signal-tower-line",
+ "signpost-fill",
+ "signpost-line",
+ "space-ship-fill",
+ "space-ship-line",
+ "steering-2-fill",
+ "steering-2-line",
+ "steering-fill",
+ "steering-line",
+ "subway-fill",
+ "subway-line",
+ "subway-wifi-fill",
+ "subway-wifi-line",
+ "suitcase-2-fill",
+ "suitcase-2-line",
+ "suitcase-3-fill",
+ "suitcase-3-line",
+ "suitcase-fill",
+ "suitcase-line",
+ "takeaway-fill",
+ "takeaway-line",
+ "taxi-fill",
+ "taxi-line",
+ "taxi-wifi-fill",
+ "taxi-wifi-line",
+ "time-zone-fill",
+ "time-zone-line",
+ "traffic-light-fill",
+ "traffic-light-line",
+ "train-fill",
+ "train-line",
+ "train-wifi-fill",
+ "train-wifi-line",
+ "treasure-map-fill",
+ "treasure-map-line",
+ "truck-fill",
+ "truck-line",
+ "unpin-fill",
+ "unpin-line",
+ "walk-fill",
+ "walk-line"
+ ],
+ "Media": [
+ "4k-fill",
+ "4k-line",
+ "album-fill",
+ "album-line",
+ "aspect-ratio-fill",
+ "aspect-ratio-line",
+ "broadcast-fill",
+ "broadcast-line",
+ "camera-2-fill",
+ "camera-2-line",
+ "camera-3-fill",
+ "camera-3-line",
+ "camera-4-fill",
+ "camera-4-line",
+ "camera-ai-2-fill",
+ "camera-ai-2-line",
+ "camera-ai-fill",
+ "camera-ai-line",
+ "camera-fill",
+ "camera-lens-ai-fill",
+ "camera-lens-ai-line",
+ "camera-lens-fill",
+ "camera-lens-line",
+ "camera-line",
+ "camera-off-fill",
+ "camera-off-line",
+ "camera-switch-fill",
+ "camera-switch-line",
+ "clapperboard-ai-fill",
+ "clapperboard-ai-line",
+ "clapperboard-fill",
+ "clapperboard-line",
+ "closed-captioning-ai-fill",
+ "closed-captioning-ai-line",
+ "closed-captioning-fill",
+ "closed-captioning-line",
+ "disc-fill",
+ "disc-line",
+ "dv-fill",
+ "dv-line",
+ "dvd-ai-fill",
+ "dvd-ai-line",
+ "dvd-fill",
+ "dvd-line",
+ "eject-fill",
+ "eject-line",
+ "equalizer-2-fill",
+ "equalizer-2-line",
+ "equalizer-3-fill",
+ "equalizer-3-line",
+ "equalizer-fill",
+ "equalizer-line",
+ "film-ai-fill",
+ "film-ai-line",
+ "film-fill",
+ "film-line",
+ "forward-10-fill",
+ "forward-10-line",
+ "forward-15-fill",
+ "forward-15-line",
+ "forward-30-fill",
+ "forward-30-line",
+ "forward-5-fill",
+ "forward-5-line",
+ "forward-end-fill",
+ "forward-end-line",
+ "forward-end-mini-fill",
+ "forward-end-mini-line",
+ "fullscreen-exit-fill",
+ "fullscreen-exit-line",
+ "fullscreen-fill",
+ "fullscreen-line",
+ "gallery-fill",
+ "gallery-line",
+ "gallery-upload-fill",
+ "gallery-upload-line",
+ "hd-fill",
+ "hd-line",
+ "headphone-fill",
+ "headphone-line",
+ "hq-fill",
+ "hq-line",
+ "image-2-fill",
+ "image-2-line",
+ "image-add-fill",
+ "image-add-line",
+ "image-ai-fill",
+ "image-ai-line",
+ "image-circle-ai-fill",
+ "image-circle-ai-line",
+ "image-circle-fill",
+ "image-circle-line",
+ "image-edit-fill",
+ "image-edit-line",
+ "image-fill",
+ "image-line",
+ "landscape-ai-fill",
+ "landscape-ai-line",
+ "landscape-fill",
+ "landscape-line",
+ "live-fill",
+ "live-line",
+ "memories-fill",
+ "memories-line",
+ "mic-2-ai-fill",
+ "mic-2-ai-line",
+ "mic-2-fill",
+ "mic-2-line",
+ "mic-ai-fill",
+ "mic-ai-line",
+ "mic-fill",
+ "mic-line",
+ "mic-off-fill",
+ "mic-off-line",
+ "movie-2-ai-fill",
+ "movie-2-ai-line",
+ "movie-2-fill",
+ "movie-2-line",
+ "movie-ai-fill",
+ "movie-ai-line",
+ "movie-fill",
+ "movie-line",
+ "multi-image-fill",
+ "multi-image-line",
+ "music-2-fill",
+ "music-2-line",
+ "music-ai-fill",
+ "music-ai-line",
+ "music-fill",
+ "music-line",
+ "mv-ai-fill",
+ "mv-ai-line",
+ "mv-fill",
+ "mv-line",
+ "notification-2-fill",
+ "notification-2-line",
+ "notification-3-fill",
+ "notification-3-line",
+ "notification-4-fill",
+ "notification-4-line",
+ "notification-fill",
+ "notification-line",
+ "notification-off-fill",
+ "notification-off-line",
+ "notification-snooze-fill",
+ "notification-snooze-line",
+ "order-play-fill",
+ "order-play-line",
+ "pause-circle-fill",
+ "pause-circle-line",
+ "pause-fill",
+ "pause-large-fill",
+ "pause-large-line",
+ "pause-line",
+ "pause-mini-fill",
+ "pause-mini-line",
+ "phone-camera-fill",
+ "phone-camera-line",
+ "picture-in-picture-2-fill",
+ "picture-in-picture-2-line",
+ "picture-in-picture-exit-fill",
+ "picture-in-picture-exit-line",
+ "picture-in-picture-fill",
+ "picture-in-picture-line",
+ "play-circle-fill",
+ "play-circle-line",
+ "play-fill",
+ "play-large-fill",
+ "play-large-line",
+ "play-line",
+ "play-list-2-fill",
+ "play-list-2-line",
+ "play-list-add-fill",
+ "play-list-add-line",
+ "play-list-fill",
+ "play-list-line",
+ "play-mini-fill",
+ "play-mini-line",
+ "play-reverse-fill",
+ "play-reverse-large-fill",
+ "play-reverse-large-line",
+ "play-reverse-line",
+ "play-reverse-mini-fill",
+ "play-reverse-mini-line",
+ "polaroid-2-fill",
+ "polaroid-2-line",
+ "polaroid-fill",
+ "polaroid-line",
+ "radio-2-fill",
+ "radio-2-line",
+ "radio-fill",
+ "radio-line",
+ "record-circle-fill",
+ "record-circle-line",
+ "repeat-2-fill",
+ "repeat-2-line",
+ "repeat-fill",
+ "repeat-line",
+ "repeat-one-fill",
+ "repeat-one-line",
+ "replay-10-fill",
+ "replay-10-line",
+ "replay-15-fill",
+ "replay-15-line",
+ "replay-30-fill",
+ "replay-30-line",
+ "replay-5-fill",
+ "replay-5-line",
+ "rewind-fill",
+ "rewind-line",
+ "rewind-mini-fill",
+ "rewind-mini-line",
+ "rewind-start-fill",
+ "rewind-start-line",
+ "rewind-start-mini-fill",
+ "rewind-start-mini-line",
+ "rhythm-fill",
+ "rhythm-line",
+ "shuffle-fill",
+ "shuffle-line",
+ "skip-back-fill",
+ "skip-back-line",
+ "skip-back-mini-fill",
+ "skip-back-mini-line",
+ "skip-forward-fill",
+ "skip-forward-line",
+ "skip-forward-mini-fill",
+ "skip-forward-mini-line",
+ "slow-down-fill",
+ "slow-down-line",
+ "sound-module-fill",
+ "sound-module-line",
+ "speaker-2-fill",
+ "speaker-2-line",
+ "speaker-3-fill",
+ "speaker-3-line",
+ "speaker-fill",
+ "speaker-line",
+ "speed-fill",
+ "speed-line",
+ "speed-mini-fill",
+ "speed-mini-line",
+ "speed-up-fill",
+ "speed-up-line",
+ "stop-circle-fill",
+ "stop-circle-line",
+ "stop-fill",
+ "stop-large-fill",
+ "stop-large-line",
+ "stop-line",
+ "stop-mini-fill",
+ "stop-mini-line",
+ "surround-sound-fill",
+ "surround-sound-line",
+ "tape-fill",
+ "tape-line",
+ "video-add-fill",
+ "video-add-line",
+ "video-ai-fill",
+ "video-ai-line",
+ "video-download-fill",
+ "video-download-line",
+ "video-fill",
+ "video-line",
+ "video-off-fill",
+ "video-off-line",
+ "video-on-ai-fill",
+ "video-on-ai-line",
+ "video-on-fill",
+ "video-on-line",
+ "video-upload-fill",
+ "video-upload-line",
+ "vidicon-2-fill",
+ "vidicon-2-line",
+ "vidicon-fill",
+ "vidicon-line",
+ "voice-ai-fill",
+ "voice-ai-line",
+ "voiceprint-fill",
+ "voiceprint-line",
+ "volume-down-fill",
+ "volume-down-line",
+ "volume-mute-fill",
+ "volume-mute-line",
+ "volume-off-vibrate-fill",
+ "volume-off-vibrate-line",
+ "volume-up-fill",
+ "volume-up-line",
+ "volume-vibrate-fill",
+ "volume-vibrate-line",
+ "webcam-fill",
+ "webcam-line"
+ ],
+ "Others": [
+ "accessibility-fill",
+ "accessibility-line",
+ "ai-generate-3d-fill",
+ "ai-generate-3d-line",
+ "armchair-fill",
+ "armchair-line",
+ "basketball-fill",
+ "basketball-line",
+ "bell-fill",
+ "bell-line",
+ "billiards-fill",
+ "billiards-line",
+ "book-shelf-fill",
+ "book-shelf-line",
+ "box-1-fill",
+ "box-1-line",
+ "box-2-fill",
+ "box-2-line",
+ "box-3-fill",
+ "box-3-line",
+ "boxing-fill",
+ "boxing-line",
+ "cactus-fill",
+ "cactus-line",
+ "candle-fill",
+ "candle-line",
+ "character-recognition-fill",
+ "character-recognition-line",
+ "chess-fill",
+ "chess-line",
+ "cross-fill",
+ "cross-line",
+ "dice-1-fill",
+ "dice-1-line",
+ "dice-2-fill",
+ "dice-2-line",
+ "dice-3-fill",
+ "dice-3-line",
+ "dice-4-fill",
+ "dice-4-line",
+ "dice-5-fill",
+ "dice-5-line",
+ "dice-6-fill",
+ "dice-6-line",
+ "dice-fill",
+ "dice-line",
+ "door-closed-fill",
+ "door-closed-line",
+ "door-fill",
+ "door-line",
+ "door-lock-box-fill",
+ "door-lock-box-line",
+ "door-lock-fill",
+ "door-lock-line",
+ "door-open-fill",
+ "door-open-line",
+ "flower-fill",
+ "flower-line",
+ "football-fill",
+ "football-line",
+ "fridge-fill",
+ "fridge-line",
+ "game-2-fill",
+ "game-2-line",
+ "game-fill",
+ "game-line",
+ "glasses-2-fill",
+ "glasses-2-line",
+ "glasses-fill",
+ "glasses-line",
+ "goggles-fill",
+ "goggles-line",
+ "golf-ball-fill",
+ "golf-ball-line",
+ "graduation-cap-fill",
+ "graduation-cap-line",
+ "handbag-fill",
+ "handbag-line",
+ "infinity-fill",
+ "infinity-line",
+ "key-2-fill",
+ "key-2-line",
+ "key-fill",
+ "key-line",
+ "leaf-fill",
+ "leaf-line",
+ "lightbulb-ai-fill",
+ "lightbulb-ai-line",
+ "lightbulb-fill",
+ "lightbulb-flash-fill",
+ "lightbulb-flash-line",
+ "lightbulb-line",
+ "outlet-2-fill",
+ "outlet-2-line",
+ "outlet-fill",
+ "outlet-line",
+ "ping-pong-fill",
+ "ping-pong-line",
+ "plant-fill",
+ "plant-line",
+ "plug-2-fill",
+ "plug-2-line",
+ "plug-fill",
+ "plug-line",
+ "poker-clubs-fill",
+ "poker-clubs-line",
+ "poker-diamonds-fill",
+ "poker-diamonds-line",
+ "poker-hearts-fill",
+ "poker-hearts-line",
+ "poker-spades-fill",
+ "poker-spades-line",
+ "police-badge-fill",
+ "police-badge-line",
+ "recycle-fill",
+ "recycle-line",
+ "reserved-fill",
+ "reserved-line",
+ "scales-2-fill",
+ "scales-2-line",
+ "scales-3-fill",
+ "scales-3-line",
+ "scales-fill",
+ "scales-line",
+ "seedling-fill",
+ "seedling-line",
+ "service-bell-fill",
+ "service-bell-line",
+ "shirt-fill",
+ "shirt-line",
+ "sofa-fill",
+ "sofa-line",
+ "stairs-fill",
+ "stairs-line",
+ "sword-fill",
+ "sword-line",
+ "t-shirt-2-fill",
+ "t-shirt-2-line",
+ "t-shirt-air-fill",
+ "t-shirt-air-line",
+ "t-shirt-fill",
+ "t-shirt-line",
+ "target-fill",
+ "target-line",
+ "tooth-fill",
+ "tooth-line",
+ "tree-fill",
+ "tree-line",
+ "umbrella-fill",
+ "umbrella-line",
+ "voice-recognition-fill",
+ "voice-recognition-line",
+ "weight-fill",
+ "weight-line",
+ "wheelchair-fill",
+ "wheelchair-line"
+ ],
+ "System": [
+ "add-box-fill",
+ "add-box-line",
+ "add-circle-fill",
+ "add-circle-line",
+ "add-fill",
+ "add-large-fill",
+ "add-large-line",
+ "add-line",
+ "alarm-add-fill",
+ "alarm-add-line",
+ "alarm-fill",
+ "alarm-line",
+ "alarm-snooze-fill",
+ "alarm-snooze-line",
+ "alarm-warning-fill",
+ "alarm-warning-line",
+ "alert-fill",
+ "alert-line",
+ "apps-2-add-fill",
+ "apps-2-add-line",
+ "apps-2-ai-fill",
+ "apps-2-ai-line",
+ "apps-2-fill",
+ "apps-2-line",
+ "apps-ai-fill",
+ "apps-ai-line",
+ "apps-fill",
+ "apps-line",
+ "check-double-fill",
+ "check-double-line",
+ "check-fill",
+ "check-line",
+ "checkbox-blank-circle-fill",
+ "checkbox-blank-circle-line",
+ "checkbox-blank-fill",
+ "checkbox-blank-line",
+ "checkbox-circle-fill",
+ "checkbox-circle-line",
+ "checkbox-fill",
+ "checkbox-indeterminate-fill",
+ "checkbox-indeterminate-line",
+ "checkbox-line",
+ "checkbox-multiple-blank-fill",
+ "checkbox-multiple-blank-line",
+ "checkbox-multiple-fill",
+ "checkbox-multiple-line",
+ "close-circle-fill",
+ "close-circle-line",
+ "close-fill",
+ "close-large-fill",
+ "close-large-line",
+ "close-line",
+ "dashboard-fill",
+ "dashboard-horizontal-fill",
+ "dashboard-horizontal-line",
+ "dashboard-line",
+ "delete-back-2-fill",
+ "delete-back-2-line",
+ "delete-back-fill",
+ "delete-back-line",
+ "delete-bin-2-fill",
+ "delete-bin-2-line",
+ "delete-bin-3-fill",
+ "delete-bin-3-line",
+ "delete-bin-4-fill",
+ "delete-bin-4-line",
+ "delete-bin-5-fill",
+ "delete-bin-5-line",
+ "delete-bin-6-fill",
+ "delete-bin-6-line",
+ "delete-bin-7-fill",
+ "delete-bin-7-line",
+ "delete-bin-fill",
+ "delete-bin-line",
+ "divide-fill",
+ "divide-line",
+ "download-2-fill",
+ "download-2-line",
+ "download-cloud-2-fill",
+ "download-cloud-2-line",
+ "download-cloud-fill",
+ "download-cloud-line",
+ "download-fill",
+ "download-line",
+ "equal-fill",
+ "equal-line",
+ "error-warning-fill",
+ "error-warning-line",
+ "export-fill",
+ "export-line",
+ "external-link-fill",
+ "external-link-line",
+ "eye-2-fill",
+ "eye-2-line",
+ "eye-close-fill",
+ "eye-close-line",
+ "eye-fill",
+ "eye-line",
+ "eye-off-fill",
+ "eye-off-line",
+ "filter-2-fill",
+ "filter-2-line",
+ "filter-3-fill",
+ "filter-3-line",
+ "filter-fill",
+ "filter-line",
+ "filter-off-fill",
+ "filter-off-line",
+ "find-replace-fill",
+ "find-replace-line",
+ "forbid-2-fill",
+ "forbid-2-line",
+ "forbid-fill",
+ "forbid-line",
+ "function-add-fill",
+ "function-add-line",
+ "function-ai-fill",
+ "function-ai-line",
+ "function-fill",
+ "function-line",
+ "history-fill",
+ "history-line",
+ "hourglass-2-fill",
+ "hourglass-2-line",
+ "hourglass-fill",
+ "hourglass-line",
+ "import-fill",
+ "import-line",
+ "indeterminate-circle-fill",
+ "indeterminate-circle-line",
+ "information-2-fill",
+ "information-2-line",
+ "information-fill",
+ "information-line",
+ "information-off-fill",
+ "information-off-line",
+ "list-settings-fill",
+ "list-settings-line",
+ "loader-2-fill",
+ "loader-2-line",
+ "loader-3-fill",
+ "loader-3-line",
+ "loader-4-fill",
+ "loader-4-line",
+ "loader-5-fill",
+ "loader-5-line",
+ "loader-fill",
+ "loader-line",
+ "lock-2-fill",
+ "lock-2-line",
+ "lock-fill",
+ "lock-line",
+ "lock-password-fill",
+ "lock-password-line",
+ "lock-star-fill",
+ "lock-star-line",
+ "lock-unlock-fill",
+ "lock-unlock-line",
+ "login-box-fill",
+ "login-box-line",
+ "login-circle-fill",
+ "login-circle-line",
+ "logout-box-fill",
+ "logout-box-line",
+ "logout-box-r-fill",
+ "logout-box-r-line",
+ "logout-circle-fill",
+ "logout-circle-line",
+ "logout-circle-r-fill",
+ "logout-circle-r-line",
+ "loop-left-ai-fill",
+ "loop-left-ai-line",
+ "loop-left-fill",
+ "loop-left-line",
+ "loop-right-ai-fill",
+ "loop-right-ai-line",
+ "loop-right-fill",
+ "loop-right-line",
+ "menu-2-fill",
+ "menu-2-line",
+ "menu-3-fill",
+ "menu-3-line",
+ "menu-4-fill",
+ "menu-4-line",
+ "menu-5-fill",
+ "menu-5-line",
+ "menu-add-fill",
+ "menu-add-line",
+ "menu-fill",
+ "menu-fold-2-fill",
+ "menu-fold-2-line",
+ "menu-fold-3-fill",
+ "menu-fold-3-line",
+ "menu-fold-4-fill",
+ "menu-fold-4-line",
+ "menu-fold-fill",
+ "menu-fold-line",
+ "menu-line",
+ "menu-search-fill",
+ "menu-search-line",
+ "menu-unfold-2-fill",
+ "menu-unfold-2-line",
+ "menu-unfold-3-fill",
+ "menu-unfold-3-line",
+ "menu-unfold-4-fill",
+ "menu-unfold-4-line",
+ "menu-unfold-fill",
+ "menu-unfold-line",
+ "more-2-fill",
+ "more-2-line",
+ "more-fill",
+ "more-line",
+ "notification-badge-fill",
+ "notification-badge-line",
+ "progress-1-fill",
+ "progress-1-line",
+ "progress-2-fill",
+ "progress-2-line",
+ "progress-3-fill",
+ "progress-3-line",
+ "progress-4-fill",
+ "progress-4-line",
+ "progress-5-fill",
+ "progress-5-line",
+ "progress-6-fill",
+ "progress-6-line",
+ "progress-7-fill",
+ "progress-7-line",
+ "progress-8-fill",
+ "progress-8-line",
+ "prohibited-2-fill",
+ "prohibited-2-line",
+ "prohibited-fill",
+ "prohibited-line",
+ "question-fill",
+ "question-line",
+ "radio-button-fill",
+ "radio-button-line",
+ "refresh-fill",
+ "refresh-line",
+ "reset-left-fill",
+ "reset-left-line",
+ "reset-right-fill",
+ "reset-right-line",
+ "search-2-fill",
+ "search-2-line",
+ "search-ai-2-fill",
+ "search-ai-2-line",
+ "search-ai-3-fill",
+ "search-ai-3-line",
+ "search-ai-4-fill",
+ "search-ai-4-line",
+ "search-ai-fill",
+ "search-ai-line",
+ "search-eye-fill",
+ "search-eye-line",
+ "search-fill",
+ "search-line",
+ "settings-2-fill",
+ "settings-2-line",
+ "settings-3-fill",
+ "settings-3-line",
+ "settings-4-fill",
+ "settings-4-line",
+ "settings-5-fill",
+ "settings-5-line",
+ "settings-6-fill",
+ "settings-6-line",
+ "settings-fill",
+ "settings-line",
+ "share-2-fill",
+ "share-2-line",
+ "share-box-fill",
+ "share-box-line",
+ "share-circle-fill",
+ "share-circle-line",
+ "share-fill",
+ "share-forward-2-fill",
+ "share-forward-2-line",
+ "share-forward-box-fill",
+ "share-forward-box-line",
+ "share-forward-fill",
+ "share-forward-line",
+ "share-line",
+ "shield-check-fill",
+ "shield-check-line",
+ "shield-cross-fill",
+ "shield-cross-line",
+ "shield-fill",
+ "shield-flash-fill",
+ "shield-flash-line",
+ "shield-keyhole-fill",
+ "shield-keyhole-line",
+ "shield-line",
+ "shield-star-fill",
+ "shield-star-line",
+ "shield-user-fill",
+ "shield-user-line",
+ "side-bar-fill",
+ "side-bar-line",
+ "sidebar-fold-fill",
+ "sidebar-fold-line",
+ "sidebar-unfold-fill",
+ "sidebar-unfold-line",
+ "spam-2-fill",
+ "spam-2-line",
+ "spam-3-fill",
+ "spam-3-line",
+ "spam-fill",
+ "spam-line",
+ "star-fill",
+ "star-half-fill",
+ "star-half-line",
+ "star-half-s-fill",
+ "star-half-s-line",
+ "star-line",
+ "star-off-fill",
+ "star-off-line",
+ "star-s-fill",
+ "star-s-line",
+ "subtract-fill",
+ "subtract-line",
+ "thumb-down-fill",
+ "thumb-down-line",
+ "thumb-up-fill",
+ "thumb-up-line",
+ "time-fill",
+ "time-line",
+ "timer-2-fill",
+ "timer-2-line",
+ "timer-fill",
+ "timer-flash-fill",
+ "timer-flash-line",
+ "timer-line",
+ "toggle-fill",
+ "toggle-line",
+ "upload-2-fill",
+ "upload-2-line",
+ "upload-cloud-2-fill",
+ "upload-cloud-2-line",
+ "upload-cloud-fill",
+ "upload-cloud-line",
+ "upload-fill",
+ "upload-line",
+ "zoom-in-fill",
+ "zoom-in-line",
+ "zoom-out-fill",
+ "zoom-out-line"
+ ],
+ "User & Faces": [
+ "account-box-2-fill",
+ "account-box-2-line",
+ "account-box-fill",
+ "account-box-line",
+ "account-circle-2-fill",
+ "account-circle-2-line",
+ "account-circle-fill",
+ "account-circle-line",
+ "account-pin-box-fill",
+ "account-pin-box-line",
+ "account-pin-circle-fill",
+ "account-pin-circle-line",
+ "admin-fill",
+ "admin-line",
+ "ai-agent-fill",
+ "ai-agent-line",
+ "aliens-fill",
+ "aliens-line",
+ "bear-smile-fill",
+ "bear-smile-line",
+ "body-scan-fill",
+ "body-scan-line",
+ "contacts-fill",
+ "contacts-line",
+ "criminal-fill",
+ "criminal-line",
+ "emotion-2-fill",
+ "emotion-2-line",
+ "emotion-fill",
+ "emotion-happy-fill",
+ "emotion-happy-line",
+ "emotion-laugh-fill",
+ "emotion-laugh-line",
+ "emotion-line",
+ "emotion-normal-fill",
+ "emotion-normal-line",
+ "emotion-sad-fill",
+ "emotion-sad-line",
+ "emotion-unhappy-fill",
+ "emotion-unhappy-line",
+ "genderless-fill",
+ "genderless-line",
+ "ghost-2-fill",
+ "ghost-2-line",
+ "ghost-fill",
+ "ghost-line",
+ "ghost-smile-fill",
+ "ghost-smile-line",
+ "group-2-fill",
+ "group-2-line",
+ "group-3-fill",
+ "group-3-line",
+ "group-fill",
+ "group-line",
+ "men-fill",
+ "men-line",
+ "mickey-fill",
+ "mickey-line",
+ "open-arm-fill",
+ "open-arm-line",
+ "parent-fill",
+ "parent-line",
+ "robot-2-fill",
+ "robot-2-line",
+ "robot-3-fill",
+ "robot-3-line",
+ "robot-fill",
+ "robot-line",
+ "skull-2-fill",
+ "skull-2-line",
+ "skull-fill",
+ "skull-line",
+ "spy-fill",
+ "spy-line",
+ "star-smile-fill",
+ "star-smile-line",
+ "team-fill",
+ "team-line",
+ "travesti-fill",
+ "travesti-line",
+ "user-2-fill",
+ "user-2-line",
+ "user-3-fill",
+ "user-3-line",
+ "user-4-fill",
+ "user-4-line",
+ "user-5-fill",
+ "user-5-line",
+ "user-6-fill",
+ "user-6-line",
+ "user-add-fill",
+ "user-add-line",
+ "user-community-fill",
+ "user-community-line",
+ "user-fill",
+ "user-follow-fill",
+ "user-follow-line",
+ "user-forbid-fill",
+ "user-forbid-line",
+ "user-heart-fill",
+ "user-heart-line",
+ "user-line",
+ "user-location-fill",
+ "user-location-line",
+ "user-minus-fill",
+ "user-minus-line",
+ "user-received-2-fill",
+ "user-received-2-line",
+ "user-received-fill",
+ "user-received-line",
+ "user-search-fill",
+ "user-search-line",
+ "user-settings-fill",
+ "user-settings-line",
+ "user-shared-2-fill",
+ "user-shared-2-line",
+ "user-shared-fill",
+ "user-shared-line",
+ "user-smile-fill",
+ "user-smile-line",
+ "user-star-fill",
+ "user-star-line",
+ "user-unfollow-fill",
+ "user-unfollow-line",
+ "user-voice-fill",
+ "user-voice-line",
+ "women-fill",
+ "women-line"
+ ],
+ "Weather": [
+ "blaze-fill",
+ "blaze-line",
+ "celsius-fill",
+ "celsius-line",
+ "cloud-windy-fill",
+ "cloud-windy-line",
+ "cloudy-2-fill",
+ "cloudy-2-line",
+ "cloudy-fill",
+ "cloudy-line",
+ "drizzle-fill",
+ "drizzle-line",
+ "earthquake-fill",
+ "earthquake-line",
+ "fahrenheit-fill",
+ "fahrenheit-line",
+ "fire-fill",
+ "fire-line",
+ "flashlight-fill",
+ "flashlight-line",
+ "flood-fill",
+ "flood-line",
+ "foggy-fill",
+ "foggy-line",
+ "hail-fill",
+ "hail-line",
+ "haze-2-fill",
+ "haze-2-line",
+ "haze-fill",
+ "haze-line",
+ "heavy-showers-fill",
+ "heavy-showers-line",
+ "meteor-fill",
+ "meteor-line",
+ "mist-fill",
+ "mist-line",
+ "moon-clear-fill",
+ "moon-clear-line",
+ "moon-cloudy-fill",
+ "moon-cloudy-line",
+ "moon-fill",
+ "moon-foggy-fill",
+ "moon-foggy-line",
+ "moon-line",
+ "rainbow-fill",
+ "rainbow-line",
+ "rainy-fill",
+ "rainy-line",
+ "shining-2-fill",
+ "shining-2-line",
+ "shining-fill",
+ "shining-line",
+ "showers-fill",
+ "showers-line",
+ "snowflake-fill",
+ "snowflake-line",
+ "snowy-fill",
+ "snowy-line",
+ "sparkling-2-fill",
+ "sparkling-2-line",
+ "sparkling-fill",
+ "sparkling-line",
+ "sun-cloudy-fill",
+ "sun-cloudy-line",
+ "sun-fill",
+ "sun-foggy-fill",
+ "sun-foggy-line",
+ "sun-line",
+ "temp-cold-fill",
+ "temp-cold-line",
+ "temp-hot-fill",
+ "temp-hot-line",
+ "thunderstorms-fill",
+ "thunderstorms-line",
+ "tornado-fill",
+ "tornado-line",
+ "typhoon-fill",
+ "typhoon-line",
+ "water-percent-fill",
+ "water-percent-line",
+ "windy-fill",
+ "windy-line"
+ ]
+}
\ No newline at end of file
diff --git a/saiadmin-artd/src/components/sai/sa-image-dialog/index.vue b/saiadmin-artd/src/components/sai/sa-image-dialog/index.vue
new file mode 100644
index 0000000..423bc38
--- /dev/null
+++ b/saiadmin-artd/src/components/sai/sa-image-dialog/index.vue
@@ -0,0 +1,389 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ item.origin_name }}
+
{{ item.size_info }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+
+ 确定
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/sai/sa-image-picker/index.vue b/saiadmin-artd/src/components/sai/sa-image-picker/index.vue
new file mode 100644
index 0000000..a3785c4
--- /dev/null
+++ b/saiadmin-artd/src/components/sai/sa-image-picker/index.vue
@@ -0,0 +1,321 @@
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/sai/sa-image-upload/index.vue b/saiadmin-artd/src/components/sai/sa-image-upload/index.vue
new file mode 100644
index 0000000..733a0c3
--- /dev/null
+++ b/saiadmin-artd/src/components/sai/sa-image-upload/index.vue
@@ -0,0 +1,310 @@
+
+
+
+
+
+
+
+
+ 单个文件不超过 {{ maxSize }}MB,最多上传 {{ limit }} 张
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/sai/sa-import/index.vue b/saiadmin-artd/src/components/sai/sa-import/index.vue
new file mode 100644
index 0000000..e6c3a3b
--- /dev/null
+++ b/saiadmin-artd/src/components/sai/sa-import/index.vue
@@ -0,0 +1,223 @@
+
+
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+
+ 将文件拖到此处,或 点击上传
+
+
+ {{ tip || `请上传 ${accept.replace(/,/g, '/')} 格式文件` }}
+
+
+
+
+
+
+ 下载导入模板
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/sai/sa-label/index.vue b/saiadmin-artd/src/components/sai/sa-label/index.vue
new file mode 100644
index 0000000..9508cee
--- /dev/null
+++ b/saiadmin-artd/src/components/sai/sa-label/index.vue
@@ -0,0 +1,30 @@
+
+
+ {{ props.label }}
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/sai/sa-md-editor/index.vue b/saiadmin-artd/src/components/sai/sa-md-editor/index.vue
new file mode 100644
index 0000000..b34464d
--- /dev/null
+++ b/saiadmin-artd/src/components/sai/sa-md-editor/index.vue
@@ -0,0 +1,113 @@
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/sai/sa-radio/index.vue b/saiadmin-artd/src/components/sai/sa-radio/index.vue
new file mode 100644
index 0000000..5a69577
--- /dev/null
+++ b/saiadmin-artd/src/components/sai/sa-radio/index.vue
@@ -0,0 +1,126 @@
+
+
+
+
+
+ {{ nullLabel }}
+
+
+ {{ item.label }}
+
+
+
+
+
+
+ {{ nullLabel }}
+
+
+ {{ item.label }}
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/sai/sa-search-bar/index.vue b/saiadmin-artd/src/components/sai/sa-search-bar/index.vue
new file mode 100644
index 0000000..7598bca
--- /dev/null
+++ b/saiadmin-artd/src/components/sai/sa-search-bar/index.vue
@@ -0,0 +1,236 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/sai/sa-select/index.vue b/saiadmin-artd/src/components/sai/sa-select/index.vue
new file mode 100644
index 0000000..d0c97f7
--- /dev/null
+++ b/saiadmin-artd/src/components/sai/sa-select/index.vue
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/sai/sa-switch/index.vue b/saiadmin-artd/src/components/sai/sa-switch/index.vue
new file mode 100644
index 0000000..67033b4
--- /dev/null
+++ b/saiadmin-artd/src/components/sai/sa-switch/index.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
diff --git a/saiadmin-artd/src/components/sai/sa-user/index.vue b/saiadmin-artd/src/components/sai/sa-user/index.vue
new file mode 100644
index 0000000..aca43bb
--- /dev/null
+++ b/saiadmin-artd/src/components/sai/sa-user/index.vue
@@ -0,0 +1,402 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.username?.charAt(0) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/saiadmin-artd/src/composables/useSaiAdmin.ts b/saiadmin-artd/src/composables/useSaiAdmin.ts
new file mode 100644
index 0000000..4a764b6
--- /dev/null
+++ b/saiadmin-artd/src/composables/useSaiAdmin.ts
@@ -0,0 +1,91 @@
+import { ref, nextTick } from 'vue'
+import { ElMessage, ElMessageBox } from 'element-plus'
+
+/**
+ * SaiAdmin Composable
+ * SaiAdmin状态管理
+ */
+export function useSaiAdmin() {
+ // 弹窗相关
+ const dialogType = ref('add')
+ const dialogVisible = ref(false)
+ const dialogData = ref>>({})
+
+ // 选中行
+ const selectedRows = ref[]>([])
+
+ // 显示弹窗
+ const showDialog = (type: string, row?: Record): void => {
+ dialogType.value = type
+ dialogData.value = row || {}
+ nextTick(() => {
+ dialogVisible.value = true
+ })
+ }
+
+ // 隐藏弹窗
+ const hideDialog = (): void => {
+ dialogVisible.value = false
+ }
+
+ // 表格行选择变化
+ const handleSelectionChange = (selection: Record[]): void => {
+ selectedRows.value = selection
+ }
+
+ // 删除数据
+ const deleteRow = (
+ row: Record,
+ apiFn: (params: any) => Promise,
+ callback?: () => void
+ ): void => {
+ ElMessageBox.confirm(`确定要删除该数据吗?`, '删除数据', {
+ confirmButtonText: '确定',
+ cancelButtonText: '取消',
+ type: 'error'
+ }).then(() => {
+ apiFn({ ids: [row.id] }).then(() => {
+ ElMessage.success('删除成功')
+ if (callback) callback()
+ })
+ })
+ }
+
+ // 批量删除数据
+ const deleteSelectedRows = (
+ apiFn: (params: any) => Promise,
+ callback?: () => void
+ ): void => {
+ if (selectedRows.value.length === 0) {
+ ElMessage.warning('请选择要删除的行')
+ return
+ }
+ ElMessageBox.confirm(
+ `确定要删除选中的 ${selectedRows.value.length} 条数据吗?`,
+ '删除选中数据',
+ {
+ confirmButtonText: '确定',
+ cancelButtonText: '取消',
+ type: 'error'
+ }
+ ).then(() => {
+ apiFn({ ids: selectedRows.value.map((row) => row.id) }).then(() => {
+ ElMessage.success('删除成功')
+ if (callback) callback()
+ selectedRows.value = []
+ })
+ })
+ }
+
+ return {
+ dialogType,
+ dialogVisible,
+ dialogData,
+ selectedRows,
+ showDialog,
+ hideDialog,
+ handleSelectionChange,
+ deleteRow,
+ deleteSelectedRows
+ }
+}
diff --git a/saiadmin-artd/src/config/assets/images.ts b/saiadmin-artd/src/config/assets/images.ts
new file mode 100644
index 0000000..f3e89dd
--- /dev/null
+++ b/saiadmin-artd/src/config/assets/images.ts
@@ -0,0 +1,61 @@
+/**
+ * 配置图片资源
+ *
+ * 统一管理设置中心使用的预览图片资源。
+ * 包含主题样式、菜单布局、菜单风格的预览图。
+ *
+ * ## 图片分类
+ *
+ * - themeStyles: 系统主题预览图(亮色/暗色/自动)
+ * - menuLayouts: 菜单布局预览图(左侧/顶部/混合/双栏)
+ * - menuStyles: 菜单风格预览图(设计/暗色/亮色)
+ *
+ * @module config/assets/images
+ * @author Art Design Pro Team
+ */
+
+import lightTheme from '@imgs/settings/theme_styles/light.png'
+import darkTheme from '@imgs/settings/theme_styles/dark.png'
+import systemTheme from '@imgs/settings/theme_styles/system.png'
+import verticalLayout from '@imgs/settings/menu_layouts/vertical.png'
+import horizontalLayout from '@imgs/settings/menu_layouts/horizontal.png'
+import mixedLayout from '@imgs/settings/menu_layouts/mixed.png'
+import dualColumnLayout from '@imgs/settings/menu_layouts/dual_column.png'
+import designStyle from '@imgs/settings/menu_styles/design.png'
+import darkStyle from '@imgs/settings/menu_styles/dark.png'
+import lightStyle from '@imgs/settings/menu_styles/light.png'
+
+/**
+ * 配置中心图片资源对象
+ */
+export const configImages = {
+ /** 系统主题预览图 */
+ themeStyles: {
+ /** 亮色主题 */
+ light: lightTheme,
+ /** 暗色主题 */
+ dark: darkTheme,
+ /** 自动主题(跟随系统) */
+ system: systemTheme
+ },
+ /** 菜单布局预览图 */
+ menuLayouts: {
+ /** 左侧菜单 */
+ vertical: verticalLayout,
+ /** 顶部菜单 */
+ horizontal: horizontalLayout,
+ /** 混合菜单 */
+ mixed: mixedLayout,
+ /** 双栏菜单 */
+ dualColumn: dualColumnLayout
+ },
+ /** 菜单风格预览图 */
+ menuStyles: {
+ /** 设计风格 */
+ design: designStyle,
+ /** 暗色风格 */
+ dark: darkStyle,
+ /** 亮色风格 */
+ light: lightStyle
+ }
+}
diff --git a/saiadmin-artd/src/config/fastEnter.ts b/saiadmin-artd/src/config/fastEnter.ts
new file mode 100644
index 0000000..ccade16
--- /dev/null
+++ b/saiadmin-artd/src/config/fastEnter.ts
@@ -0,0 +1,79 @@
+/**
+ * 快速入口配置
+ * 包含:应用列表、快速链接等配置
+ */
+import { WEB_LINKS } from '@/utils/constants'
+import type { FastEnterConfig } from '@/types/config'
+
+const fastEnterConfig: FastEnterConfig = {
+ // 显示条件(屏幕宽度)
+ minWidth: 1200,
+ // 应用列表
+ applications: [
+ {
+ name: '工作台',
+ description: '系统概览与数据统计',
+ icon: 'ri:pie-chart-line',
+ iconColor: '#377dff',
+ enabled: true,
+ order: 1,
+ routeName: 'Console'
+ },
+ {
+ name: '官方文档',
+ description: '使用指南与开发文档',
+ icon: 'ri:bill-line',
+ iconColor: '#ffb100',
+ enabled: true,
+ order: 2,
+ link: WEB_LINKS.DOCS
+ },
+ {
+ name: '技术支持',
+ description: '技术支持与问题反馈',
+ icon: 'ri:user-location-line',
+ iconColor: '#ff6b6b',
+ enabled: true,
+ order: 3,
+ link: WEB_LINKS.COMMUNITY
+ },
+ {
+ name: '哔哩哔哩',
+ description: '技术分享与交流',
+ icon: 'ri:bilibili-line',
+ iconColor: '#FB7299',
+ enabled: true,
+ order: 4,
+ link: WEB_LINKS.BILIBILI
+ }
+ ],
+ // 快速链接
+ quickLinks: [
+ {
+ name: '登录',
+ enabled: true,
+ order: 1,
+ routeName: 'Login'
+ },
+ {
+ name: '注册',
+ enabled: true,
+ order: 2,
+ routeName: 'Register'
+ },
+ {
+ name: '忘记密码',
+ enabled: true,
+ order: 3,
+ routeName: 'ForgetPassword'
+ },
+ {
+ name: '个人中心',
+ enabled: true,
+ order: 4,
+ routeName: 'UserCenter'
+ }
+ ]
+}
+
+export default Object.freeze(fastEnterConfig)
diff --git a/saiadmin-artd/src/config/index.ts b/saiadmin-artd/src/config/index.ts
new file mode 100644
index 0000000..9690c9f
--- /dev/null
+++ b/saiadmin-artd/src/config/index.ts
@@ -0,0 +1,135 @@
+/**
+ * 系统全局配置
+ *
+ * 这是系统的核心配置文件,集中管理所有全局配置项。
+ * 包含系统信息、主题样式、菜单布局、颜色方案等所有可配置项。
+ *
+ * ## 主要功能
+ *
+ * - 系统信息 - 系统名称等基础信息
+ * - 主题配置 - 亮色/暗色/自动主题的样式配置
+ * - 菜单配置 - 菜单布局、主题、宽度等配置
+ * - 颜色方案 - 系统主色和预设颜色列表
+ * - 快速入口 - 快速入口应用和链接配置
+ * - 顶部栏配置 - 顶部栏功能模块配置
+ *
+ * ## 配置项说明
+ *
+ * - systemInfo: 系统基础信息(名称等)
+ * - systemThemeStyles: 系统主题样式映射
+ * - settingThemeList: 可选的系统主题列表
+ * - menuLayoutList: 可选的菜单布局列表
+ * - themeList: 菜单主题样式列表
+ * - darkMenuStyles: 暗黑模式下的菜单样式
+ * - systemMainColor: 预设的系统主色列表
+ * - fastEnter: 快速入口配置
+ * - headerBar: 顶部栏功能配置
+ *
+ * @module config
+ * @author Art Design Pro Team
+ */
+
+import { MenuThemeEnum, MenuTypeEnum, SystemThemeEnum } from '@/enums/appEnum'
+import { SystemConfig } from '@/types/config'
+import { configImages } from './assets/images'
+import fastEnterConfig from './modules/fastEnter'
+import { headerBarConfig } from './modules/headerBar'
+
+const appConfig: SystemConfig = {
+ // 系统信息
+ systemInfo: {
+ name: 'SaiAdmin' // 系统名称
+ },
+ // 系统主题
+ systemThemeStyles: {
+ [SystemThemeEnum.LIGHT]: { className: '' },
+ [SystemThemeEnum.DARK]: { className: SystemThemeEnum.DARK }
+ },
+ // 系统主题列表
+ settingThemeList: [
+ {
+ name: 'Light',
+ theme: SystemThemeEnum.LIGHT,
+ color: ['#fff', '#fff'],
+ leftLineColor: '#EDEEF0',
+ rightLineColor: '#EDEEF0',
+ img: configImages.themeStyles.light
+ },
+ {
+ name: 'Dark',
+ theme: SystemThemeEnum.DARK,
+ color: ['#22252A'],
+ leftLineColor: '#3F4257',
+ rightLineColor: '#3F4257',
+ img: configImages.themeStyles.dark
+ },
+ {
+ name: 'System',
+ theme: SystemThemeEnum.AUTO,
+ color: ['#fff', '#22252A'],
+ leftLineColor: '#EDEEF0',
+ rightLineColor: '#3F4257',
+ img: configImages.themeStyles.system
+ }
+ ],
+ // 菜单布局列表
+ menuLayoutList: [
+ { name: 'Left', value: MenuTypeEnum.LEFT, img: configImages.menuLayouts.vertical },
+ { name: 'Top', value: MenuTypeEnum.TOP, img: configImages.menuLayouts.horizontal },
+ { name: 'Mixed', value: MenuTypeEnum.TOP_LEFT, img: configImages.menuLayouts.mixed },
+ { name: 'Dual Column', value: MenuTypeEnum.DUAL_MENU, img: configImages.menuLayouts.dualColumn }
+ ],
+ // 菜单主题列表
+ themeList: [
+ {
+ theme: MenuThemeEnum.DESIGN,
+ background: '#FFFFFF',
+ systemNameColor: 'var(--art-gray-800)',
+ iconColor: '#6B6B6B',
+ textColor: '#29343D',
+ img: configImages.menuStyles.design
+ },
+ {
+ theme: MenuThemeEnum.DARK,
+ background: '#191A23',
+ systemNameColor: '#D9DADB',
+ iconColor: '#BABBBD',
+ textColor: '#BABBBD',
+ img: configImages.menuStyles.dark
+ },
+ {
+ theme: MenuThemeEnum.LIGHT,
+ background: '#ffffff',
+ systemNameColor: 'var(--art-gray-800)',
+ iconColor: '#6B6B6B',
+ textColor: '#29343D',
+ img: configImages.menuStyles.light
+ }
+ ],
+ // 暗黑模式菜单样式
+ darkMenuStyles: [
+ {
+ theme: MenuThemeEnum.DARK,
+ background: 'var(--default-box-color)',
+ systemNameColor: '#DDDDDD',
+ iconColor: '#BABBBD',
+ textColor: 'rgba(#FFFFFF, 0.7)'
+ }
+ ],
+ // 系统主色
+ systemMainColor: [
+ '#5D87FF',
+ '#B48DF3',
+ '#1D84FF',
+ '#60C041',
+ '#38C0FC',
+ '#F9901F',
+ '#FF80C8'
+ ] as const,
+ // 快速入口配置
+ fastEnter: fastEnterConfig,
+ // 顶部栏功能配置
+ headerBar: headerBarConfig
+}
+
+export default Object.freeze(appConfig)
diff --git a/saiadmin-artd/src/config/modules/component.ts b/saiadmin-artd/src/config/modules/component.ts
new file mode 100644
index 0000000..bc709e0
--- /dev/null
+++ b/saiadmin-artd/src/config/modules/component.ts
@@ -0,0 +1,105 @@
+/**
+ * 全局组件配置
+ *
+ * 统一管理系统级全局组件的注册。
+ * 这些组件会在应用启动时全局注册,可在任何地方使用。
+ *
+ * ## 主要功能
+ *
+ * - 组件配置 - 集中管理全局组件的配置信息
+ * - 异步加载 - 使用 defineAsyncComponent 实现按需加载
+ * - 开关控制 - 支持通过 enabled 字段启用/禁用组件
+ * - 配置查询 - 提供工具函数快速查询组件配置
+ *
+ * @module config/component
+ * @author Art Design Pro Team
+ */
+
+import { defineAsyncComponent } from 'vue'
+
+/**
+ * 全局组件配置列表
+ */
+export const globalComponentsConfig: GlobalComponentConfig[] = [
+ {
+ name: '设置面板',
+ key: 'settings-panel',
+ component: defineAsyncComponent(
+ () => import('@/components/core/layouts/art-settings-panel/index.vue')
+ ),
+ enabled: true
+ },
+ {
+ name: '全局搜索',
+ key: 'global-search',
+ component: defineAsyncComponent(
+ () => import('@/components/core/layouts/art-global-search/index.vue')
+ ),
+ enabled: true
+ },
+ {
+ name: '锁屏',
+ key: 'screen-lock',
+ component: defineAsyncComponent(
+ () => import('@/components/core/layouts/art-screen-lock/index.vue')
+ ),
+ enabled: true
+ },
+ {
+ name: '聊天窗口',
+ key: 'chat-window',
+ component: defineAsyncComponent(
+ () => import('@/components/core/layouts/art-chat-window/index.vue')
+ ),
+ enabled: true
+ },
+ {
+ name: '礼花效果',
+ key: 'fireworks-effect',
+ component: defineAsyncComponent(
+ () => import('@/components/core/layouts/art-fireworks-effect/index.vue')
+ ),
+ enabled: true
+ },
+ {
+ name: '水印效果',
+ key: 'watermark',
+ component: defineAsyncComponent(
+ () => import('@/components/core/others/art-watermark/index.vue')
+ ),
+ enabled: true
+ }
+]
+
+/**
+ * 全局组件配置接口
+ */
+export interface GlobalComponentConfig {
+ /** 组件名称 */
+ name: string
+ /** 组件标识 */
+ key: string
+ /** 组件 */
+ component: any
+ /** 是否启用 */
+ enabled?: boolean
+ /** 组件描述 */
+ description?: string
+}
+
+/**
+ * 获取启用的全局组件
+ * @returns 已启用的组件配置列表
+ */
+export const getEnabledGlobalComponents = () => {
+ return globalComponentsConfig.filter((config) => config.enabled !== false)
+}
+
+/**
+ * 根据 key 获取组件配置
+ * @param key 组件标识
+ * @returns 组件配置对象
+ */
+export const getGlobalComponentByKey = (key: string) => {
+ return globalComponentsConfig.find((config) => config.key === key)
+}
diff --git a/saiadmin-artd/src/config/modules/fastEnter.ts b/saiadmin-artd/src/config/modules/fastEnter.ts
new file mode 100644
index 0000000..6b9740c
--- /dev/null
+++ b/saiadmin-artd/src/config/modules/fastEnter.ts
@@ -0,0 +1,127 @@
+/**
+ * 快速入口配置
+ * 包含:应用列表、快速链接等配置
+ */
+import { WEB_LINKS } from '@/utils/constants'
+import type { FastEnterConfig } from '@/types/config'
+
+const fastEnterConfig: FastEnterConfig = {
+ // 显示条件(屏幕宽度)
+ minWidth: 1200,
+ // 应用列表
+ applications: [
+ {
+ name: '工作台',
+ description: '系统概览与数据统计',
+ icon: 'ri:pie-chart-line',
+ iconColor: '#377dff',
+ enabled: true,
+ order: 1,
+ routeName: 'Console'
+ },
+ {
+ name: '分析页',
+ description: '数据分析与可视化',
+ icon: 'ri:game-line',
+ iconColor: '#ff3b30',
+ enabled: true,
+ order: 2,
+ routeName: 'Analysis'
+ },
+ {
+ name: '礼花效果',
+ description: '动画特效展示',
+ icon: 'ri:loader-line',
+ iconColor: '#7A7FFF',
+ enabled: true,
+ order: 3,
+ routeName: 'Fireworks'
+ },
+ {
+ name: '聊天',
+ description: '即时通讯功能',
+ icon: 'ri:user-line',
+ iconColor: '#13DEB9',
+ enabled: true,
+ order: 4,
+ routeName: 'Chat'
+ },
+ {
+ name: '官方文档',
+ description: '使用指南与开发文档',
+ icon: 'ri:bill-line',
+ iconColor: '#ffb100',
+ enabled: true,
+ order: 5,
+ link: WEB_LINKS.DOCS
+ },
+ {
+ name: '技术支持',
+ description: '技术支持与问题反馈',
+ icon: 'ri:user-location-line',
+ iconColor: '#ff6b6b',
+ enabled: true,
+ order: 6,
+ link: WEB_LINKS.COMMUNITY
+ },
+ {
+ name: '更新日志',
+ description: '版本更新与变更记录',
+ icon: 'ri:gamepad-line',
+ iconColor: '#38C0FC',
+ enabled: true,
+ order: 7,
+ routeName: 'ChangeLog'
+ },
+ {
+ name: '哔哩哔哩',
+ description: '技术分享与交流',
+ icon: 'ri:bilibili-line',
+ iconColor: '#FB7299',
+ enabled: true,
+ order: 8,
+ link: WEB_LINKS.BILIBILI
+ }
+ ],
+ // 快速链接
+ quickLinks: [
+ {
+ name: '登录',
+ enabled: true,
+ order: 1,
+ routeName: 'Login'
+ },
+ {
+ name: '注册',
+ enabled: true,
+ order: 2,
+ routeName: 'Register'
+ },
+ {
+ name: '忘记密码',
+ enabled: true,
+ order: 3,
+ routeName: 'ForgetPassword'
+ },
+ {
+ name: '定价',
+ enabled: true,
+ order: 4,
+ routeName: 'Pricing'
+ },
+ {
+ name: '个人中心',
+ enabled: true,
+ order: 5,
+ routeName: 'UserCenter'
+ },
+ {
+ name: '留言管理',
+ enabled: true,
+ order: 6,
+ routeName: 'ArticleComment'
+ }
+ ]
+}
+
+export default Object.freeze(fastEnterConfig)
diff --git a/saiadmin-artd/src/config/modules/festival.ts b/saiadmin-artd/src/config/modules/festival.ts
new file mode 100644
index 0000000..39cd790
--- /dev/null
+++ b/saiadmin-artd/src/config/modules/festival.ts
@@ -0,0 +1,51 @@
+/**
+ * 节日庆祝配置
+ *
+ * 配置系统的节日烟花效果和祝福文本。
+ * 支持单日节日和跨日期节日,可自定义烟花播放次数。
+ *
+ * ## 配置说明
+ *
+ * - name: 节日名称
+ * - date: 节日开始日期(格式:YYYY-MM-DD)
+ * - endDate: 节日结束日期(可选,用于跨日期节日)
+ * - image: 烟花图片(需要预先导入)
+ * - scrollText: 滚动显示的祝福文本
+ * - count: 烟花播放次数(可选,默认为 3 次)
+ *
+ * ## 注意事项
+ *
+ * - 图片需要预先导入并在配置中引用
+ * - 跨日期节日会在整个日期范围内生效
+ * - 每个用户每天只会播放一次烟花效果
+ *
+ * @module config/modules/festival
+ * @author Art Design Pro Team
+ */
+
+import { FestivalConfig } from '@/types/config'
+
+// 导入烟花图片(根据需要取消注释)
+// import sd from '@imgs/ceremony/sd.png'
+// import yd from '@imgs/ceremony/yd.png'
+
+export const festivalConfigList: FestivalConfig[] = [
+ // 跨日期示例
+ // {
+ // name: 'v3.0 Sass 升级至 TailwindCSS',
+ // date: '2025-11-03',
+ // endDate: '2025-11-09',
+ // image: '',
+ // count: 3,
+ // scrollText:
+ // '🚀 系统 v3.0 测试阶段正式开启!测试周期为 11 月 3 日 - 11 月 16 日,通过 TailwindCSS 重构样式体系、统一 Iconify 图标方案,带来更高效现代的开发体验,正式发布敬请期待~'
+ // }
+ // 单日示例:圣诞节
+ // {
+ // name: '圣诞节',
+ // date: '2024-12-25',
+ // image: sd,
+ // count: 3 // 可选,不设置则使用默认值 3 次
+ // scrollText: 'Merry Christmas!Art Design Pro 祝您圣诞快乐,愿节日的欢乐与祝福如雪花般纷至沓来!',
+ // }
+]
diff --git a/saiadmin-artd/src/config/modules/headerBar.ts b/saiadmin-artd/src/config/modules/headerBar.ts
new file mode 100644
index 0000000..a420e82
--- /dev/null
+++ b/saiadmin-artd/src/config/modules/headerBar.ts
@@ -0,0 +1,63 @@
+/**
+ * 顶部栏功能配置
+ *
+ * 统一管理顶部栏各个功能模块的启用状态。
+ * 通过修改此配置文件可以快速启用或禁用顶部栏的功能按钮。
+ *
+ * @module config/headerBar
+ * @author Art Design Pro Team
+ */
+
+import { HeaderBarFeatureConfig } from '@/types'
+
+/**
+ * 顶部栏功能配置对象
+ */
+export const headerBarConfig: HeaderBarFeatureConfig = {
+ menuButton: {
+ enabled: true,
+ description: '控制左侧菜单的展开/收起按钮'
+ },
+ refreshButton: {
+ enabled: true,
+ description: '页面刷新按钮'
+ },
+ fastEnter: {
+ enabled: true,
+ description: '快速入口功能,提供常用应用和链接的快速访问'
+ },
+ breadcrumb: {
+ enabled: true,
+ description: '面包屑导航,显示当前页面路径'
+ },
+ globalSearch: {
+ enabled: true,
+ description: '全局搜索功能,支持快捷键 Ctrl+K 或 Cmd+K'
+ },
+ fullscreen: {
+ enabled: true,
+ description: '全屏切换功能'
+ },
+ notification: {
+ enabled: true,
+ description: '通知中心,显示系统通知和消息'
+ },
+ chat: {
+ enabled: true,
+ description: '聊天功能,提供实时沟通'
+ },
+ language: {
+ enabled: true,
+ description: '多语言切换功能'
+ },
+ settings: {
+ enabled: true,
+ description: '系统设置面板'
+ },
+ themeToggle: {
+ enabled: true,
+ description: '主题切换功能(明暗主题)'
+ }
+}
+
+export default headerBarConfig
diff --git a/saiadmin-artd/src/config/setting.ts b/saiadmin-artd/src/config/setting.ts
new file mode 100644
index 0000000..94f2d2c
--- /dev/null
+++ b/saiadmin-artd/src/config/setting.ts
@@ -0,0 +1,109 @@
+/**
+ * 系统设置默认值配置
+ *
+ * 统一管理系统设置的所有默认值
+ *
+ * ## 主要功能
+ *
+ * - 菜单相关默认配置
+ * - 主题相关默认配置
+ * - 界面显示默认配置
+ * - 功能开关默认配置
+ * - 样式相关默认配置
+ *
+ * ## 注意事项
+ *
+ * 1. 修改此文件的配置项时,需要同步更新以下文件:
+ * - src/components/core/layouts/art-settings-panel/widget/SettingActions.vue(复制配置和重置配置逻辑)
+ * - src/store/modules/setting.ts(Store 状态定义)
+ * 2. 可以通过设置面板的"复制配置"按钮快速生成配置代码
+ * 3. 枚举类型的值需要与 src/enums/appEnum.ts 中的定义保持一致
+ */
+
+import AppConfig from '@/config'
+import { SystemThemeEnum, MenuThemeEnum, MenuTypeEnum, ContainerWidthEnum } from '@/enums/appEnum'
+
+/**
+ * 系统设置默认值配置
+ */
+export const SETTING_DEFAULT_CONFIG = {
+ /** 菜单类型 */
+ menuType: MenuTypeEnum.LEFT,
+ /** 菜单展开宽度 */
+ menuOpenWidth: 230,
+ /** 菜单是否展开 */
+ menuOpen: true,
+ /** 双菜单是否显示文本 */
+ dualMenuShowText: false,
+ /** 系统主题类型 */
+ systemThemeType: SystemThemeEnum.AUTO,
+ /** 系统主题模式 */
+ systemThemeMode: SystemThemeEnum.AUTO,
+ /** 菜单风格 */
+ menuThemeType: MenuThemeEnum.DESIGN,
+ /** 系统主题颜色 */
+ systemThemeColor: AppConfig.systemMainColor[0],
+ /** 是否显示菜单按钮 */
+ showMenuButton: true,
+ /** 是否显示快速入口 */
+ showFastEnter: true,
+ /** 是否显示刷新按钮 */
+ showRefreshButton: true,
+ /** 是否显示面包屑 */
+ showCrumbs: true,
+ /** 是否显示工作台标签 */
+ showWorkTab: true,
+ /** 是否显示语言切换 */
+ showLanguage: true,
+ /** 是否显示进度条 */
+ showNprogress: false,
+ /** 是否显示设置引导 */
+ showSettingGuide: true,
+ /** 是否显示节日文本 */
+ showFestivalText: false,
+ /** 是否显示水印 */
+ watermarkVisible: false,
+ /** 是否自动关闭 */
+ autoClose: false,
+ /** 是否唯一展开 */
+ uniqueOpened: true,
+ /** 是否色弱模式 */
+ colorWeak: false,
+ /** 是否刷新 */
+ refresh: false,
+ /** 是否加载节日烟花 */
+ holidayFireworksLoaded: false,
+ /** 边框模式 */
+ boxBorderMode: true,
+ /** 页面过渡效果 */
+ pageTransition: 'slide-left',
+ /** 标签页样式 */
+ tabStyle: 'tab-default',
+ /** 自定义圆角 */
+ customRadius: '0.75',
+ /** 容器宽度 */
+ containerWidth: ContainerWidthEnum.FULL,
+ /** 节日日期 */
+ festivalDate: ''
+}
+
+/**
+ * 获取设置默认值
+ * @returns 设置默认值对象
+ */
+export function getSettingDefaults() {
+ return { ...SETTING_DEFAULT_CONFIG }
+}
+
+/**
+ * 重置为默认设置
+ * @param currentSettings 当前设置对象
+ */
+export function resetToDefaults(currentSettings: Record) {
+ const defaults = getSettingDefaults()
+ Object.keys(defaults).forEach((key) => {
+ if (key in currentSettings) {
+ currentSettings[key] = defaults[key as keyof typeof defaults]
+ }
+ })
+}
diff --git a/saiadmin-artd/src/directives/business/highlight.ts b/saiadmin-artd/src/directives/business/highlight.ts
new file mode 100644
index 0000000..13af225
--- /dev/null
+++ b/saiadmin-artd/src/directives/business/highlight.ts
@@ -0,0 +1,248 @@
+/**
+ * v-highlight 代码高亮指令
+ *
+ * 为代码块提供语法高亮、行号显示和一键复制功能。
+ * 基于 highlight.js 实现,支持多种编程语言的语法高亮。
+ *
+ * ## 主要功能
+ *
+ * - 语法高亮 - 使用 highlight.js 自动识别并高亮代码
+ * - 行号显示 - 自动为每行代码添加行号
+ * - 一键复制 - 提供复制按钮,点击即可复制代码(自动过滤行号)
+ * - 性能优化 - 批量处理代码块,避免阻塞渲染
+ * - 动态监听 - 使用 MutationObserver 监听新增代码块
+ * - 防重复处理 - 自动标记已处理的代码块,避免重复处理
+ *
+ * ## 使用示例
+ *
+ * ```vue
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ * const hello = 'world';
+ * console.log(hello);
+ *
+ *
+ *
+ * ```
+ *
+ * ## 性能优化
+ *
+ * - 批量处理:每次处理 10 个代码块,避免长时间阻塞
+ * - 延迟处理:使用 requestAnimationFrame 分批处理
+ * - 重试机制:自动重试处理失败的代码块
+ * - 智能监听:只在有新代码块时才触发处理
+ *
+ * @module directives/highlight
+ * @author Art Design Pro Team
+ */
+
+import { App, Directive } from 'vue'
+import hljs from 'highlight.js'
+
+// 高亮代码
+function highlightCode(block: HTMLElement) {
+ hljs.highlightElement(block)
+}
+
+// 插入行号
+function insertLineNumbers(block: HTMLElement) {
+ const lines = block.innerHTML.split('\n')
+ const numberedLines = lines
+ .map((line, index) => {
+ return `${index + 1} ${line}`
+ })
+ .join('\n')
+ block.innerHTML = numberedLines
+}
+
+// 添加复制按钮:调整 DOM 结构,将代码部分包裹在 .code-wrapper 内
+function addCopyButton(block: HTMLElement) {
+ const copyButton = document.createElement('i')
+ copyButton.className = 'copy-button'
+ copyButton.innerHTML =
+ ' '
+ copyButton.onclick = () => {
+ // 过滤掉行号,只复制代码内容
+ const codeContent = block.innerText.replace(/^\d+\s+/gm, '')
+ navigator.clipboard.writeText(codeContent).then(() => {
+ ElMessage.success('复制成功')
+ })
+ }
+
+ const preElement = block.parentElement
+ if (preElement) {
+ let codeWrapper: HTMLElement
+ // 如果代码块还没有被包裹,则创建包裹容器
+ if (!block.parentElement.classList.contains('code-wrapper')) {
+ codeWrapper = document.createElement('div')
+ codeWrapper.className = 'code-wrapper'
+ preElement.replaceChild(codeWrapper, block)
+ codeWrapper.appendChild(block)
+ } else {
+ codeWrapper = block.parentElement
+ }
+ // 将复制按钮添加到 pre 元素(而非 codeWrapper 内),这样它不会随滚动条滚动
+ preElement.appendChild(copyButton)
+ }
+}
+
+// 检查代码块是否已经被处理过
+function isBlockProcessed(block: HTMLElement): boolean {
+ return (
+ block.hasAttribute('data-highlighted') ||
+ !!block.querySelector('.line-number') ||
+ !!block.parentElement?.querySelector('.copy-button')
+ )
+}
+
+// 标记代码块为已处理
+function markBlockAsProcessed(block: HTMLElement) {
+ block.setAttribute('data-highlighted', 'true')
+}
+
+// 处理单个代码块
+function processBlock(block: HTMLElement) {
+ if (isBlockProcessed(block)) {
+ return
+ }
+
+ try {
+ highlightCode(block)
+ insertLineNumbers(block)
+ addCopyButton(block)
+ markBlockAsProcessed(block)
+ } catch (error) {
+ console.warn('处理代码块时出错:', error)
+ }
+}
+
+// 查找并处理所有代码块
+function processAllCodeBlocks(el: HTMLElement) {
+ const blocks = Array.from(el.querySelectorAll('pre code'))
+ const unprocessedBlocks = blocks.filter((block) => !isBlockProcessed(block))
+
+ if (unprocessedBlocks.length === 0) {
+ return
+ }
+
+ if (unprocessedBlocks.length <= 10) {
+ // 如果代码块数量少于等于10,直接处理所有代码块
+ unprocessedBlocks.forEach((block) => processBlock(block))
+ } else {
+ // 定义每次处理的代码块数
+ const batchSize = 10
+ let currentIndex = 0
+
+ const processBatch = () => {
+ const batch = unprocessedBlocks.slice(currentIndex, currentIndex + batchSize)
+
+ batch.forEach((block) => {
+ processBlock(block)
+ })
+
+ // 更新索引并继续处理下一批
+ currentIndex += batchSize
+ if (currentIndex < unprocessedBlocks.length) {
+ // 使用 requestAnimationFrame 确保下一帧再处理
+ requestAnimationFrame(processBatch)
+ }
+ }
+
+ // 开始处理第一批代码块
+ processBatch()
+ }
+}
+
+// 重试处理函数
+function retryProcessing(el: HTMLElement, maxRetries: number = 3, delay: number = 200) {
+ let retryCount = 0
+
+ const tryProcess = () => {
+ processAllCodeBlocks(el)
+
+ // 检查是否还有未处理的代码块
+ const remainingBlocks = Array.from(el.querySelectorAll('pre code')).filter(
+ (block) => !isBlockProcessed(block)
+ )
+
+ if (remainingBlocks.length > 0 && retryCount < maxRetries) {
+ retryCount++
+ setTimeout(tryProcess, delay * retryCount) // 递增延迟
+ }
+ }
+
+ tryProcess()
+}
+
+// 代码高亮、插入行号、复制按钮
+const highlightDirective: Directive = {
+ mounted(el: HTMLElement) {
+ // 立即尝试处理一次
+ processAllCodeBlocks(el)
+
+ // 延迟处理,确保 v-html 内容已经渲染
+ setTimeout(() => {
+ retryProcessing(el)
+ }, 100)
+
+ // 使用 MutationObserver 监听 DOM 变化
+ const observer = new MutationObserver((mutations) => {
+ let hasNewCodeBlocks = false
+
+ mutations.forEach((mutation) => {
+ if (mutation.type === 'childList') {
+ mutation.addedNodes.forEach((node) => {
+ if (node.nodeType === Node.ELEMENT_NODE) {
+ const element = node as HTMLElement
+ // 检查新添加的节点是否包含代码块
+ if (element.tagName === 'PRE' || element.querySelector('pre code')) {
+ hasNewCodeBlocks = true
+ }
+ }
+ })
+ }
+ })
+
+ if (hasNewCodeBlocks) {
+ // 延迟处理新添加的代码块
+ setTimeout(() => {
+ processAllCodeBlocks(el)
+ }, 50)
+ }
+ })
+
+ // 开始观察
+ observer.observe(el, {
+ childList: true,
+ subtree: true
+ })
+
+ // 将 observer 存储到元素上,以便在 unmounted 时清理
+ ;(el as any)._highlightObserver = observer
+ },
+
+ updated(el: HTMLElement) {
+ // 当组件更新时,重新处理代码块
+ setTimeout(() => {
+ processAllCodeBlocks(el)
+ }, 50)
+ },
+
+ unmounted(el: HTMLElement) {
+ // 清理 MutationObserver
+ const observer = (el as any)._highlightObserver
+ if (observer) {
+ observer.disconnect()
+ delete (el as any)._highlightObserver
+ }
+ }
+}
+
+export function setupHighlightDirective(app: App) {
+ app.directive('highlight', highlightDirective)
+}
diff --git a/saiadmin-artd/src/directives/business/ripple.ts b/saiadmin-artd/src/directives/business/ripple.ts
new file mode 100644
index 0000000..8d7d8f9
--- /dev/null
+++ b/saiadmin-artd/src/directives/business/ripple.ts
@@ -0,0 +1,114 @@
+/**
+ * v-ripple 水波纹效果指令
+ *
+ * 为元素添加 Material Design 风格的水波纹点击效果。
+ * 点击时从点击位置扩散出圆形水波纹动画,提升交互体验。
+ *
+ * ## 主要功能
+ *
+ * - 水波纹动画 - 点击时从点击位置扩散圆形波纹
+ * - 自适应大小 - 根据元素尺寸自动调整波纹大小和动画时长
+ * - 智能配色 - 自动识别按钮类型,使用合适的波纹颜色
+ * - 自定义颜色 - 支持通过参数自定义波纹颜色
+ * - 性能优化 - 使用 requestAnimationFrame 和自动清理机制
+ *
+ * ## 使用示例
+ *
+ * ```vue
+ *
+ *
+ * 点击我
+ *
+ *
+ * 自定义颜色
+ *
+ *
+ * 卡片内容
+ *
+ * ```
+ *
+ * ## 颜色规则
+ *
+ * - 有色按钮(primary、success、warning 等):使用白色半透明波纹
+ * - 默认按钮:使用主题色半透明波纹
+ * - 自定义:通过 color 参数指定任意颜色
+ *
+ * @module directives/ripple
+ * @author Art Design Pro Team
+ */
+
+import type { App, Directive, DirectiveBinding } from 'vue'
+
+export interface RippleOptions {
+ /** 水波纹颜色 */
+ color?: string
+}
+
+export const vRipple: Directive = {
+ mounted(el: HTMLElement, binding: DirectiveBinding) {
+ // 获取指令的配置参数
+ const options: RippleOptions = binding.value || {}
+
+ // 设置元素为相对定位,并隐藏溢出部分
+ el.style.position = 'relative'
+ el.style.overflow = 'hidden'
+
+ // 点击事件处理
+ el.addEventListener('mousedown', (e: MouseEvent) => {
+ const rect = el.getBoundingClientRect()
+ const left = e.clientX - rect.left
+ const top = e.clientY - rect.top
+
+ // 创建水波纹元素
+ const ripple = document.createElement('div')
+ const diameter = Math.max(el.clientWidth, el.clientHeight)
+ const radius = diameter / 2
+
+ // 根据直径计算动画时间(直径越大,动画时间越长)
+ const baseTime = 600 // 基础动画时间(毫秒)
+ const scaleFactor = 0.5 // 缩放因子
+ const animationDuration = baseTime + diameter * scaleFactor
+
+ // 设置水波纹的尺寸和位置
+ ripple.style.width = ripple.style.height = `${diameter}px`
+ ripple.style.left = `${left - radius}px`
+ ripple.style.top = `${top - radius}px`
+ ripple.style.position = 'absolute'
+ ripple.style.borderRadius = '50%'
+ ripple.style.pointerEvents = 'none'
+
+ // 判断是否为有色按钮(Element Plus 按钮类型)
+ const buttonTypes = ['primary', 'info', 'warning', 'danger', 'success'].map(
+ (type) => `el-button--${type}`
+ )
+ const isColoredButton = buttonTypes.some((type) => el.classList.contains(type))
+ const defaultColor = isColoredButton
+ ? 'rgba(255, 255, 255, 0.25)' // 有色按钮使用白色水波纹
+ : 'var(--el-color-primary-light-7)' // 默认按钮使用主题色水波纹
+
+ // 设置水波纹颜色、初始状态和过渡效果
+ ripple.style.backgroundColor = options.color || defaultColor
+ ripple.style.transform = 'scale(0)'
+ ripple.style.transition = `transform ${animationDuration}ms cubic-bezier(0.3, 0, 0.2, 1), opacity ${animationDuration}ms cubic-bezier(0.3, 0, 0.5, 1)`
+ ripple.style.zIndex = '1'
+
+ // 添加水波纹元素到DOM中
+ el.appendChild(ripple)
+
+ // 触发动画
+ requestAnimationFrame(() => {
+ ripple.style.transform = 'scale(2)'
+ ripple.style.opacity = '0'
+ })
+
+ // 动画结束后移除水波纹元素
+ setTimeout(() => {
+ ripple.remove()
+ }, animationDuration + 500) // 增加500ms缓冲时间
+ })
+ }
+}
+
+export function setupRippleDirective(app: App) {
+ app.directive('ripple', vRipple)
+}
diff --git a/saiadmin-artd/src/directives/core/auth.ts b/saiadmin-artd/src/directives/core/auth.ts
new file mode 100644
index 0000000..e2f06ed
--- /dev/null
+++ b/saiadmin-artd/src/directives/core/auth.ts
@@ -0,0 +1,78 @@
+/**
+ * v-auth 权限指令
+ *
+ * 适用于后端权限控制模式,基于权限标识控制 DOM 元素的显示和隐藏。
+ * 如果用户没有对应权限,元素将从 DOM 中移除。
+ *
+ * ## 主要功能
+ *
+ * - 权限验证 - 根据路由 meta 中的权限列表验证用户权限
+ * - DOM 控制 - 无权限时自动移除元素,而非隐藏
+ * - 响应式更新 - 权限变化时自动更新元素状态
+ *
+ * ## 使用示例
+ *
+ * ```vue
+ *
+ * 新增
+ *
+ *
+ * 编辑
+ *
+ *
+ * 删除
+ * ```
+ *
+ * ## 注意事项
+ *
+ * - 该指令会直接移除 DOM 元素,而不是使用 v-if 隐藏
+ * - 权限列表从当前路由的 meta.authList 中获取
+ *
+ * @module directives/auth
+ * @author Art Design Pro Team
+ */
+
+import { useUserStore } from '@/store/modules/user'
+import { App, Directive, DirectiveBinding } from 'vue'
+
+interface AuthBinding extends DirectiveBinding {
+ value: string
+}
+
+function checkAuthPermission(el: HTMLElement, binding: AuthBinding): void {
+ const userStore = useUserStore()
+ const userButtons = userStore.getUserInfo.buttons
+
+ if (userButtons?.includes('*')) {
+ return
+ }
+
+ // 如果按钮为空或未定义,移除元素
+ if (!userButtons?.length) {
+ removeElement(el)
+ return
+ }
+
+ // 检查是否有对应的权限标识
+ const hasPermission = userButtons.some((item) => item === binding.value)
+
+ // 如果没有权限,移除元素
+ if (!hasPermission) {
+ removeElement(el)
+ }
+}
+
+function removeElement(el: HTMLElement): void {
+ if (el.parentNode) {
+ el.parentNode.removeChild(el)
+ }
+}
+
+const authDirective: Directive = {
+ mounted: checkAuthPermission,
+ updated: checkAuthPermission
+}
+
+export function setupAuthDirective(app: App): void {
+ app.directive('auth', authDirective)
+}
diff --git a/saiadmin-artd/src/directives/core/roles.ts b/saiadmin-artd/src/directives/core/roles.ts
new file mode 100644
index 0000000..2ab1029
--- /dev/null
+++ b/saiadmin-artd/src/directives/core/roles.ts
@@ -0,0 +1,89 @@
+/**
+ * v-roles 角色权限指令
+ *
+ * 基于用户角色控制 DOM 元素的显示和隐藏。
+ * 只要用户拥有指定角色中的任意一个,元素就会显示,否则从 DOM 中移除。
+ *
+ * ## 主要功能
+ *
+ * - 角色验证 - 检查用户是否拥有指定角色
+ * - 多角色支持 - 支持单个角色或多个角色(满足其一即可)
+ * - DOM 控制 - 无权限时自动移除元素,而非隐藏
+ * - 响应式更新 - 角色变化时自动更新元素状态
+ *
+ * ## 使用示例
+ *
+ * ```vue
+ *
+ *
+ * 超级管理员功能
+ *
+ *
+ * 管理员功能
+ *
+ *
+ *
+ * 所有登录用户可见的内容
+ *
+ *
+ * ```
+ *
+ * ## 权限逻辑
+ *
+ * - 用户角色从 userStore.getUserInfo.roles 获取
+ * - 只要用户拥有指定角色中的任意一个,元素就会显示
+ * - 如果用户没有任何角色或不满足条件,元素将被移除
+ *
+ * ## 注意事项
+ *
+ * - 该指令会直接移除 DOM 元素,而不是使用 v-if 隐藏
+ * - 适用于基于角色的粗粒度权限控制
+ * - 如需基于具体操作的细粒度权限控制,请使用 v-auth 指令
+ *
+ * @module directives/roles
+ * @author Art Design Pro Team
+ */
+
+import { useUserStore } from '@/store/modules/user'
+import { App, Directive, DirectiveBinding } from 'vue'
+
+interface RolesBinding extends DirectiveBinding {
+ value: string | string[]
+}
+
+function checkRolePermission(el: HTMLElement, binding: RolesBinding): void {
+ const userStore = useUserStore()
+ const userRoles = userStore.getUserInfo.roles
+
+ // 如果用户角色为空或未定义,移除元素
+ if (!userRoles?.length) {
+ removeElement(el)
+ return
+ }
+
+ // 确保指令值为数组格式
+ const requiredRoles = Array.isArray(binding.value) ? binding.value : [binding.value]
+
+ // 检查用户是否具有所需角色之一
+ const hasPermission = requiredRoles.some((role: string) => userRoles.includes(role))
+
+ // 如果没有权限,安全地移除元素
+ if (!hasPermission) {
+ removeElement(el)
+ }
+}
+
+function removeElement(el: HTMLElement): void {
+ if (el.parentNode) {
+ el.parentNode.removeChild(el)
+ }
+}
+
+const rolesDirective: Directive = {
+ mounted: checkRolePermission,
+ updated: checkRolePermission
+}
+
+export function setupRolesDirective(app: App): void {
+ app.directive('roles', rolesDirective)
+}
diff --git a/saiadmin-artd/src/directives/index.ts b/saiadmin-artd/src/directives/index.ts
new file mode 100644
index 0000000..69e4b6e
--- /dev/null
+++ b/saiadmin-artd/src/directives/index.ts
@@ -0,0 +1,14 @@
+import type { App } from 'vue'
+import { setupAuthDirective } from './core/auth'
+import { setupHighlightDirective } from './business/highlight'
+import { setupRippleDirective } from './business/ripple'
+import { setupRolesDirective } from './core/roles'
+import { setupPermissionDirective } from './sai/permission'
+
+export function setupGlobDirectives(app: App) {
+ setupAuthDirective(app) // 权限指令
+ setupRolesDirective(app) // 角色权限指令
+ setupHighlightDirective(app) // 高亮指令
+ setupRippleDirective(app) // 水波纹指令
+ setupPermissionDirective(app) // 权限指令
+}
diff --git a/saiadmin-artd/src/directives/sai/permission.ts b/saiadmin-artd/src/directives/sai/permission.ts
new file mode 100644
index 0000000..f223628
--- /dev/null
+++ b/saiadmin-artd/src/directives/sai/permission.ts
@@ -0,0 +1,78 @@
+/**
+ * v-permission 权限指令
+ *
+ * 适用于后端权限控制模式,基于权限标识控制 DOM 元素的显示和隐藏。
+ * 如果用户没有对应权限,元素将从 DOM 中移除。
+ *
+ * ## 主要功能
+ *
+ * - 权限验证 - 判断用户buttons里面是否有对应权限标识
+ *
+ * ## 使用示例
+ *
+ * ```vue
+ *
+ * 新增
+ *
+ *
+ * 编辑
+ *
+ *
+ * 删除
+ *
+ *
+ * 读取
+ * ```
+ *
+ * ## 注意事项
+ *
+ * - 该指令会直接移除 DOM 元素,而不是使用 v-if 隐藏
+ *
+ * @module directives/permission
+ * @author sai
+ */
+
+import { useUserStore } from '@/store/modules/user'
+import { App, Directive, DirectiveBinding } from 'vue'
+
+interface PermissionBinding extends DirectiveBinding {
+ value: string
+}
+
+function checkPermission(el: HTMLElement, binding: PermissionBinding): void {
+ const userStore = useUserStore()
+ const userButtons = userStore.getUserInfo.buttons
+
+ if (userButtons?.includes('*')) {
+ return
+ }
+
+ // 如果按钮为空或未定义,移除元素
+ if (!userButtons?.length) {
+ removeElement(el)
+ return
+ }
+
+ // 检查是否有对应的权限标识
+ const hasPermission = userButtons.some((item) => item === binding.value)
+
+ // 如果没有权限,移除元素
+ if (!hasPermission) {
+ removeElement(el)
+ }
+}
+
+function removeElement(el: HTMLElement): void {
+ if (el.parentNode) {
+ el.parentNode.removeChild(el)
+ }
+}
+
+const permissionDirective: Directive = {
+ mounted: checkPermission,
+ updated: checkPermission
+}
+
+export function setupPermissionDirective(app: App): void {
+ app.directive('permission', permissionDirective)
+}
diff --git a/saiadmin-artd/src/enums/appEnum.ts b/saiadmin-artd/src/enums/appEnum.ts
new file mode 100644
index 0000000..a39c278
--- /dev/null
+++ b/saiadmin-artd/src/enums/appEnum.ts
@@ -0,0 +1,81 @@
+/**
+ * 系统级别枚举定义模块
+ *
+ * ## 主要功能
+ *
+ * - 菜单类型枚举(左侧、顶部、混合、双栏)
+ * - 主题类型枚举(亮色、暗色、自动)
+ * - 菜单主题枚举(设计、亮色、暗色)
+ * - 语言类型枚举(中文、英文)
+ * - 容器宽度枚举(全屏、固定)
+ * - 菜单宽度枚举(收起宽度)
+ *
+ * @module enums/appEnum
+ * @author Art Design Pro Team
+ */
+
+/**
+ * 菜单类型
+ */
+export enum MenuTypeEnum {
+ /** 左侧菜单 */
+ LEFT = 'left',
+ /** 顶部菜单 */
+ TOP = 'top',
+ /** 顶部+左侧菜单 */
+ TOP_LEFT = 'top-left',
+ /** 双栏菜单 */
+ DUAL_MENU = 'dual-menu'
+}
+
+/**
+ * 系统主题
+ */
+export enum SystemThemeEnum {
+ /** 暗色主题 */
+ DARK = 'dark',
+ /** 亮色主题 */
+ LIGHT = 'light',
+ /** 自动主题(跟随系统) */
+ AUTO = 'auto'
+}
+
+/**
+ * 菜单主题
+ */
+export enum MenuThemeEnum {
+ /** 暗色主题 */
+ DARK = 'dark',
+ /** 亮色主题 */
+ LIGHT = 'light',
+ /** 设计主题 */
+ DESIGN = 'design'
+}
+
+/**
+ * 菜单宽度
+ */
+export enum MenuWidth {
+ /** 收起宽度 */
+ CLOSE = '64px'
+}
+
+/**
+ * 语言类型
+ */
+export enum LanguageEnum {
+ /** 中文 */
+ ZH = 'zh',
+ /** 英文 */
+ EN = 'en'
+}
+
+/**
+ * 容器宽度
+ */
+export enum ContainerWidthEnum {
+ /** 全屏宽度 */
+ FULL = '100%',
+ /** 固定宽度 */
+ BOXED = '1200px'
+}
diff --git a/saiadmin-artd/src/enums/formEnum.ts b/saiadmin-artd/src/enums/formEnum.ts
new file mode 100644
index 0000000..8e9b3b4
--- /dev/null
+++ b/saiadmin-artd/src/enums/formEnum.ts
@@ -0,0 +1,24 @@
+/**
+ * 表单相关枚举定义模块
+ *
+ * ## 主要功能
+ *
+ * - 页面模式枚举(新增、编辑)
+ * - 表格尺寸枚举(默认、紧凑、宽松)
+ *
+ * @module enums/formEnum
+ * @author Art Design Pro Team
+ */
+
+// 页面类型
+export enum PageModeEnum {
+ Add, // 新增
+ Edit // 编辑
+}
+
+// 表格大小
+export enum TableSizeEnum {
+ DEFAULT = 'default',
+ SMALL = 'small',
+ LARGE = 'large'
+}
diff --git a/saiadmin-artd/src/env.d.ts b/saiadmin-artd/src/env.d.ts
new file mode 100644
index 0000000..4401f21
--- /dev/null
+++ b/saiadmin-artd/src/env.d.ts
@@ -0,0 +1,34 @@
+///
+
+declare module 'nprogress'
+
+declare module 'crypto-js'
+
+declare module 'vue-img-cutter'
+
+declare module 'file-saver'
+
+declare module 'qrcode.vue' {
+ export type Level = 'L' | 'M' | 'Q' | 'H'
+ export type RenderAs = 'canvas' | 'svg'
+ export type GradientType = 'linear' | 'radial'
+ export interface ImageSettings {
+ src: string
+ height: number
+ width: number
+ excavate: boolean
+ }
+ export interface QRCodeProps {
+ value: string
+ size?: number
+ level?: Level
+ background?: string
+ foreground?: string
+ renderAs?: RenderAs
+ }
+ const QrcodeVue: any
+ export default QrcodeVue
+}
+
+// 全局变量声明
+declare const __APP_VERSION__: string // 版本号
diff --git a/saiadmin-artd/src/hooks/core/useAppMode.ts b/saiadmin-artd/src/hooks/core/useAppMode.ts
new file mode 100644
index 0000000..c39cd9e
--- /dev/null
+++ b/saiadmin-artd/src/hooks/core/useAppMode.ts
@@ -0,0 +1,45 @@
+/**
+ * useAppMode - 应用模式管理
+ *
+ * 提供应用访问模式的判断和管理功能,支持前端和后端两种权限控制模式。
+ * 根据环境变量 VITE_ACCESS_MODE 自动识别当前运行模式。
+ *
+ * ## 主要功能
+ *
+ * 1. 模式识别 - 自动识别前端模式或后端模式
+ * 2. 前端模式 - 权限由前端路由配置控制,适合小型项目或演示环境
+ * 3. 后端模式 - 权限由后端接口返回的菜单数据控制,适合企业级应用
+ * 4. 响应式状态 - 提供响应式的模式判断,方便在组件中使用
+ *
+ * @module useAppMode
+ * @author Art Design Pro Team
+ */
+
+import { computed } from 'vue'
+
+export function useAppMode() {
+ // 获取访问模式配置
+ const accessMode = import.meta.env.VITE_ACCESS_MODE
+
+ /**
+ * 是否为前端控制模式
+ * 前端模式:权限由前端路由配置控制
+ */
+ const isFrontendMode = computed(() => accessMode === 'frontend')
+ /**
+ * 是否为后端控制模式
+ * 后端模式:权限由后端接口返回的菜单数据控制
+ */
+ const isBackendMode = computed(() => accessMode === 'backend')
+
+ /**
+ * 当前应用模式
+ */
+ const currentMode = computed(() => accessMode)
+
+ return {
+ isFrontendMode,
+ isBackendMode,
+ currentMode
+ }
+}
diff --git a/saiadmin-artd/src/hooks/core/useAuth.ts b/saiadmin-artd/src/hooks/core/useAuth.ts
new file mode 100644
index 0000000..283b859
--- /dev/null
+++ b/saiadmin-artd/src/hooks/core/useAuth.ts
@@ -0,0 +1,74 @@
+/**
+ * useAuth - 权限验证管理
+ *
+ * 提供统一的权限验证功能,支持前端和后端两种权限模式。
+ * 用于控制页面按钮、操作等功能的显示和访问权限。
+ *
+ * ## 主要功能
+ *
+ * 1. 权限检查 - 检查用户是否拥有指定的权限标识
+ * 2. 双模式支持 - 自动适配前端模式和后端模式的权限验证
+ * 3. 前端模式 - 从用户信息中获取按钮权限列表(如 ['add', 'edit', 'delete'])
+ * 4. 后端模式 - 从路由 meta 配置中获取权限列表(如 [{ authMark: 'add' }])
+ *
+ * ## 使用示例
+ *
+ * ```typescript
+ * const { hasAuth } = useAuth()
+ *
+ * // 检查是否有新增权限
+ * if (hasAuth('add')) {
+ * // 显示新增按钮
+ * }
+ *
+ * // 在模板中使用
+ * 编辑
+ * 删除
+ * ```
+ *
+ * @module useAuth
+ * @author Art Design Pro Team
+ */
+
+import { useRoute } from 'vue-router'
+import { storeToRefs } from 'pinia'
+import { useUserStore } from '@/store/modules/user'
+import { useAppMode } from '@/hooks/core/useAppMode'
+import type { AppRouteRecord } from '@/types/router'
+
+type AuthItem = NonNullable[number]
+
+const userStore = useUserStore()
+
+export const useAuth = () => {
+ const route = useRoute()
+ const { isFrontendMode } = useAppMode()
+ const { info } = storeToRefs(userStore)
+
+ // 前端按钮权限(例如:['add', 'edit'])
+ const frontendAuthList = info.value?.buttons ?? []
+
+ // 后端路由 meta 配置的权限列表(例如:[{ authMark: 'add' }])
+ const backendAuthList: AuthItem[] = Array.isArray(route.meta.authList)
+ ? (route.meta.authList as AuthItem[])
+ : []
+
+ /**
+ * 检查是否拥有某权限标识(前后端模式通用)
+ * @param auth 权限标识
+ * @returns 是否有权限
+ */
+ const hasAuth = (auth: string): boolean => {
+ // 前端模式
+ if (isFrontendMode.value) {
+ return frontendAuthList.includes(auth)
+ }
+
+ // 后端模式
+ return backendAuthList.some((item) => item?.authMark === auth)
+ }
+
+ return {
+ hasAuth
+ }
+}
diff --git a/saiadmin-artd/src/hooks/core/useCeremony.ts b/saiadmin-artd/src/hooks/core/useCeremony.ts
new file mode 100644
index 0000000..ead2630
--- /dev/null
+++ b/saiadmin-artd/src/hooks/core/useCeremony.ts
@@ -0,0 +1,184 @@
+/**
+ * useCeremony - 节日庆祝管理
+ *
+ * 提供节日烟花效果和祝福文本展示功能,为系统增添节日氛围。
+ * 自动检测当前日期是否为节日,并在首次进入时播放烟花动画和显示祝福语。
+ *
+ * ## 主要功能
+ *
+ * 1. 节日检测 - 自动匹配当前日期与节日配置列表,支持单日和跨日期节日
+ * 2. 烟花动画 - 播放节日烟花特效,支持自定义图片和触发次数
+ * 3. 祝福文本 - 烟花结束后显示节日祝福文本
+ * 4. 状态管理 - 记录烟花播放状态,避免重复播放
+ * 5. 清理机制 - 提供清理方法,支持手动停止和重置
+ *
+ * ## 使用示例
+ *
+ * ```typescript
+ * // 在配置文件中定义节日
+ * // 单日节日
+ * {
+ * date: '2024-12-25',
+ * name: '圣诞节',
+ * image: christmasImage,
+ * count: 3 // 可选,不设置则使用默认值 3 次
+ * scrollText: 'Merry Christmas!',
+ * }
+ *
+ * // 跨日期节日
+ * {
+ * date: '2025-11-07',
+ * endDate: '2025-11-10',
+ * name: 'v3.0 测试阶段',
+ * image: '',
+ * count: 5 // 自定义烟花播放次数
+ * scrollText: '系统 v3.0 测试阶段正式开启!',
+ * }
+ * ```
+ *
+ * @module useCeremony
+ * @author Art Design Pro Team
+ */
+
+import { useTimeoutFn, useIntervalFn, useDateFormat } from '@vueuse/core'
+import { storeToRefs } from 'pinia'
+import { computed } from 'vue'
+import { useSettingStore } from '@/store/modules/setting'
+import { mittBus } from '@/utils/sys'
+import { festivalConfigList } from '@/config/modules/festival'
+
+/**
+ * 节日庆祝配置常量
+ */
+const FESTIVAL_CONFIG = {
+ /** 初始延迟(毫秒) */
+ INITIAL_DELAY: 300,
+ /** 烟花播放间隔(毫秒) */
+ FIREWORK_INTERVAL: 1000,
+ /** 文本显示延迟(毫秒) */
+ TEXT_DELAY: 2000,
+ /** 默认烟花播放次数 */
+ DEFAULT_FIREWORKS_COUNT: 3
+} as const
+
+/**
+ * 节日庆祝功能
+ * 提供节日烟花效果和祝福文本展示
+ */
+export function useCeremony() {
+ const settingStore = useSettingStore()
+ const { holidayFireworksLoaded, isShowFireworks } = storeToRefs(settingStore)
+
+ let fireworksInterval: { pause: () => void } | null = null
+
+ /**
+ * 检查日期是否在节日范围内
+ * @param currentDate 当前日期
+ * @param festivalDate 节日开始日期
+ * @param festivalEndDate 节日结束日期(可选)
+ */
+ const isDateInRange = (
+ currentDate: string,
+ festivalDate: string,
+ festivalEndDate?: string
+ ): boolean => {
+ if (!festivalEndDate) {
+ // 单日节日
+ return currentDate === festivalDate
+ }
+
+ // 跨日期节日
+ const current = new Date(currentDate)
+ const start = new Date(festivalDate)
+ const end = new Date(festivalEndDate)
+
+ return current >= start && current <= end
+ }
+
+ /**
+ * 获取当前日期对应的节日数据
+ */
+ const currentFestivalData = computed(() => {
+ const currentDate = useDateFormat(new Date(), 'YYYY-MM-DD').value
+ return festivalConfigList.find((item) => isDateInRange(currentDate, item.date, item.endDate))
+ })
+
+ /**
+ * 更新节日日期到 store
+ */
+ const updateFestivalDate = () => {
+ settingStore.setFestivalDate(currentFestivalData.value?.date || '')
+ }
+
+ /**
+ * 触发烟花效果
+ */
+ const triggerFirework = () => {
+ mittBus.emit('triggerFireworks', currentFestivalData.value?.image)
+ }
+
+ /**
+ * 完成烟花效果后显示文本
+ */
+ const showFestivalText = () => {
+ settingStore.setholidayFireworksLoaded(true)
+
+ useTimeoutFn(() => {
+ settingStore.setShowFestivalText(true)
+ updateFestivalDate()
+ }, FESTIVAL_CONFIG.TEXT_DELAY)
+ }
+
+ /**
+ * 启动烟花循环
+ */
+ const startFireworksLoop = () => {
+ let playedCount = 0
+ // 使用节日配置的播放次数,如果没有则使用默认值
+ const count = currentFestivalData.value?.count ?? FESTIVAL_CONFIG.DEFAULT_FIREWORKS_COUNT
+
+ const { pause } = useIntervalFn(() => {
+ triggerFirework()
+ playedCount++
+
+ if (playedCount >= count) {
+ pause()
+ showFestivalText()
+ }
+ }, FESTIVAL_CONFIG.FIREWORK_INTERVAL)
+
+ fireworksInterval = { pause }
+ }
+
+ /**
+ * 开启节日庆祝
+ */
+ const openFestival = () => {
+ if (!currentFestivalData.value || !isShowFireworks.value) {
+ return
+ }
+
+ const { start } = useTimeoutFn(startFireworksLoop, FESTIVAL_CONFIG.INITIAL_DELAY)
+ start()
+ }
+
+ /**
+ * 清理烟花效果
+ */
+ const cleanup = () => {
+ if (fireworksInterval) {
+ fireworksInterval.pause()
+ fireworksInterval = null
+ }
+ settingStore.setShowFestivalText(false)
+ updateFestivalDate()
+ }
+
+ return {
+ openFestival,
+ cleanup,
+ holidayFireworksLoaded,
+ currentFestivalData,
+ isShowFireworks
+ }
+}
diff --git a/saiadmin-artd/src/hooks/core/useChart.ts b/saiadmin-artd/src/hooks/core/useChart.ts
new file mode 100644
index 0000000..29ba1d1
--- /dev/null
+++ b/saiadmin-artd/src/hooks/core/useChart.ts
@@ -0,0 +1,745 @@
+/**
+ * useChart - ECharts 图表管理
+ *
+ * 提供完整的 ECharts 图表生命周期管理和配置能力,简化图表开发流程。
+ * 自动处理图表初始化、更新、销毁、主题切换、响应式调整等复杂逻辑。
+ *
+ * ## 核心功能
+ *
+ * 1. 图表生命周期管理 - 自动处理初始化、更新、销毁,支持延迟加载和可见性检测
+ * 2. 主题自动适配 - 响应系统主题变化,自动更新图表样式和配色
+ * 3. 响应式调整 - 监听窗口大小、菜单展开等变化,自动调整图表尺寸
+ * 4. 空状态处理 - 优雅的空数据展示,自动显示"暂无数据"提示
+ * 5. 样式配置统一 - 提供坐标轴、图例、提示框等统一的样式配置方法
+ * 6. 性能优化 - 防抖处理、样式缓存、requestAnimationFrame 优化
+ * 7. 高级组件抽象 - useChartComponent 提供更高层次的图表组件封装
+ *
+ * ## 使用示例
+ *
+ * ```typescript
+ * // 基础用法
+ * const {
+ * chartRef,
+ * initChart,
+ * updateChart,
+ * getAxisLineStyle,
+ * getTooltipStyle
+ * } = useChart()
+ *
+ * onMounted(() => {
+ * initChart({
+ * xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed'] },
+ * yAxis: { type: 'value' },
+ * series: [{ data: [120, 200, 150], type: 'bar' }]
+ * })
+ * })
+ *
+ * // 高级用法 - 组件抽象
+ * const chart = useChartComponent({
+ * props,
+ * generateOptions: () => ({
+ * // ECharts 配置
+ * }),
+ * checkEmpty: () => data.value.length === 0,
+ * watchSources: [() => props.data]
+ * })
+ * ```
+ *
+ * @module useChart
+ * @author Art Design Pro Team
+ */
+
+import { echarts, type EChartsOption } from '@/plugins/echarts'
+import { storeToRefs } from 'pinia'
+import { useSettingStore } from '@/store/modules/setting'
+import { getCssVar } from '@/utils/ui'
+import type { BaseChartProps, ChartThemeConfig, UseChartOptions } from '@/types/component/chart'
+
+// 图表主题配置
+export const useChartOps = (): ChartThemeConfig => ({
+ /** */
+ chartHeight: '16rem',
+ /** 字体大小 */
+ fontSize: 13,
+ /** 字体颜色 */
+ fontColor: '#999',
+ /** 主题颜色 */
+ themeColor: getCssVar('--el-color-primary-light-1'),
+ /** 颜色组 */
+ colors: [
+ getCssVar('--el-color-primary-light-1'),
+ '#4ABEFF',
+ '#EDF2FF',
+ '#14DEBA',
+ '#FFAF20',
+ '#FA8A6C',
+ '#FFAF20'
+ ]
+})
+
+// 常量定义
+const RESIZE_DELAYS = [50, 100, 200, 350] as const
+const MENU_RESIZE_DELAYS = [50, 100, 200] as const
+const RESIZE_DEBOUNCE_DELAY = 100
+
+export function useChart(options: UseChartOptions = {}) {
+ const { initOptions, initDelay = 0, threshold = 0.1, autoTheme = true } = options
+
+ const settingStore = useSettingStore()
+ const { isDark, menuOpen, menuType } = storeToRefs(settingStore)
+
+ const chartRef = ref()
+ let chart: echarts.ECharts | null = null
+ let intersectionObserver: IntersectionObserver | null = null
+ let pendingOptions: EChartsOption | null = null
+ let resizeTimeoutId: number | null = null
+ let resizeFrameId: number | null = null
+ let isDestroyed = false
+ let emptyStateDiv: HTMLElement | null = null
+
+ // 清理定时器的统一方法
+ const clearTimers = () => {
+ if (resizeTimeoutId) {
+ clearTimeout(resizeTimeoutId)
+ resizeTimeoutId = null
+ }
+ if (resizeFrameId) {
+ cancelAnimationFrame(resizeFrameId)
+ resizeFrameId = null
+ }
+ }
+
+ // 使用 requestAnimationFrame 优化 resize 处理
+ const requestAnimationResize = () => {
+ if (resizeFrameId) {
+ cancelAnimationFrame(resizeFrameId)
+ }
+ resizeFrameId = requestAnimationFrame(() => {
+ handleResize()
+ resizeFrameId = null
+ })
+ }
+
+ // 防抖的resize处理(用于窗口resize事件)
+ const debouncedResize = () => {
+ if (resizeTimeoutId) {
+ clearTimeout(resizeTimeoutId)
+ }
+ resizeTimeoutId = window.setTimeout(() => {
+ requestAnimationResize()
+ resizeTimeoutId = null
+ }, RESIZE_DEBOUNCE_DELAY)
+ }
+
+ // 多延迟resize处理 - 统一方法
+ const multiDelayResize = (delays: readonly number[]) => {
+ // 立即调用一次,快速响应
+ nextTick(requestAnimationResize)
+
+ // 使用延迟时间,确保图表正确适应变化
+ delays.forEach((delay) => {
+ setTimeout(requestAnimationResize, delay)
+ })
+ }
+
+ // 收缩菜单时,重新计算图表大小(仅在图表存在时监听)
+ let menuOpenStopHandle: (() => void) | null = null
+ let menuTypeStopHandle: (() => void) | null = null
+
+ const setupMenuWatchers = () => {
+ menuOpenStopHandle = watch(menuOpen, () => multiDelayResize(RESIZE_DELAYS))
+ menuTypeStopHandle = watch(menuType, () => {
+ nextTick(requestAnimationResize)
+ setTimeout(() => multiDelayResize(MENU_RESIZE_DELAYS), 0)
+ })
+ }
+
+ const cleanupMenuWatchers = () => {
+ menuOpenStopHandle?.()
+ menuTypeStopHandle?.()
+ menuOpenStopHandle = null
+ menuTypeStopHandle = null
+ }
+
+ // 主题变化时重新设置图表选项
+ let themeStopHandle: (() => void) | null = null
+
+ const setupThemeWatcher = () => {
+ if (autoTheme) {
+ themeStopHandle = watch(isDark, () => {
+ // 更新空状态样式
+ emptyStateManager.updateStyle()
+
+ if (chart && !isDestroyed) {
+ // 使用 requestAnimationFrame 优化主题更新
+ requestAnimationFrame(() => {
+ if (chart && !isDestroyed) {
+ const currentOptions = chart.getOption()
+ if (currentOptions) {
+ updateChart(currentOptions as EChartsOption)
+ }
+ }
+ })
+ }
+ })
+ }
+ }
+
+ const cleanupThemeWatcher = () => {
+ themeStopHandle?.()
+ themeStopHandle = null
+ }
+
+ // 样式生成器 - 统一的样式配置
+ const createLineStyle = (color: string, width = 1, type?: 'solid' | 'dashed') => ({
+ color,
+ width,
+ ...(type && { type })
+ })
+
+ // 缓存样式配置以减少重复计算
+ const styleCache = {
+ axisLine: null as any,
+ splitLine: null as any,
+ axisLabel: null as any,
+ lastDarkValue: isDark.value
+ }
+
+ const clearStyleCache = () => {
+ styleCache.axisLine = null
+ styleCache.splitLine = null
+ styleCache.axisLabel = null
+ styleCache.lastDarkValue = isDark.value
+ }
+
+ // 坐标轴线样式
+ const getAxisLineStyle = (show: boolean = true) => {
+ if (styleCache.lastDarkValue !== isDark.value) {
+ clearStyleCache()
+ }
+ if (!styleCache.axisLine) {
+ styleCache.axisLine = {
+ show,
+ lineStyle: createLineStyle(isDark.value ? '#444' : '#EDEDED')
+ }
+ }
+ return styleCache.axisLine
+ }
+
+ // 分割线样式
+ const getSplitLineStyle = (show: boolean = true) => {
+ if (styleCache.lastDarkValue !== isDark.value) {
+ clearStyleCache()
+ }
+ if (!styleCache.splitLine) {
+ styleCache.splitLine = {
+ show,
+ lineStyle: createLineStyle(isDark.value ? '#444' : '#EDEDED', 1, 'dashed')
+ }
+ }
+ return styleCache.splitLine
+ }
+
+ // 坐标轴标签样式
+ const getAxisLabelStyle = (show: boolean = true) => {
+ if (styleCache.lastDarkValue !== isDark.value) {
+ clearStyleCache()
+ }
+ if (!styleCache.axisLabel) {
+ const { fontColor, fontSize } = useChartOps()
+ styleCache.axisLabel = {
+ show,
+ color: fontColor,
+ fontSize
+ }
+ }
+ return styleCache.axisLabel
+ }
+
+ // 坐标轴刻度样式(静态配置,无需缓存)
+ const getAxisTickStyle = () => ({
+ show: false
+ })
+
+ // 获取动画配置
+ const getAnimationConfig = (animationDelay: number = 50, animationDuration: number = 1500) => ({
+ animationDelay: (idx: number) => idx * animationDelay + 200,
+ animationDuration: (idx: number) => animationDuration - idx * 50,
+ animationEasing: 'quarticOut' as const
+ })
+
+ // 获取统一的 tooltip 配置
+ const getTooltipStyle = (trigger: 'item' | 'axis' = 'axis', customOptions: any = {}) => ({
+ trigger,
+ backgroundColor: isDark.value ? 'rgba(0, 0, 0, 0.8)' : 'rgba(255, 255, 255, 0.9)',
+ borderColor: isDark.value ? '#333' : '#ddd',
+ borderWidth: 1,
+ textStyle: {
+ color: isDark.value ? '#fff' : '#333'
+ },
+ ...customOptions
+ })
+
+ // 获取统一的图例配置
+ const getLegendStyle = (
+ position: 'bottom' | 'top' | 'left' | 'right' = 'bottom',
+ customOptions: any = {}
+ ) => {
+ const baseConfig = {
+ textStyle: {
+ color: isDark.value ? '#fff' : '#333'
+ },
+ itemWidth: 12,
+ itemHeight: 12,
+ itemGap: 20,
+ ...customOptions
+ }
+
+ // 根据位置设置不同的配置
+ switch (position) {
+ case 'bottom':
+ return {
+ ...baseConfig,
+ bottom: 0,
+ left: 'center',
+ orient: 'horizontal',
+ icon: 'roundRect'
+ }
+ case 'top':
+ return {
+ ...baseConfig,
+ top: 0,
+ left: 'center',
+ orient: 'horizontal',
+ icon: 'roundRect'
+ }
+ case 'left':
+ return {
+ ...baseConfig,
+ left: 0,
+ top: 'center',
+ orient: 'vertical',
+ icon: 'roundRect'
+ }
+ case 'right':
+ return {
+ ...baseConfig,
+ right: 0,
+ top: 'center',
+ orient: 'vertical',
+ icon: 'roundRect'
+ }
+ default:
+ return baseConfig
+ }
+ }
+
+ // 根据图例位置计算 grid 配置
+ const getGridWithLegend = (
+ showLegend: boolean,
+ legendPosition: 'bottom' | 'top' | 'left' | 'right' = 'bottom',
+ baseGrid: any = {}
+ ) => {
+ const defaultGrid = {
+ top: 15,
+ right: 15,
+ bottom: 8,
+ left: 0,
+ containLabel: true,
+ ...baseGrid
+ }
+
+ if (!showLegend) {
+ return defaultGrid
+ }
+
+ // 根据图例位置调整 grid
+ switch (legendPosition) {
+ case 'bottom':
+ return {
+ ...defaultGrid,
+ bottom: 40
+ }
+ case 'top':
+ return {
+ ...defaultGrid,
+ top: 40
+ }
+ case 'left':
+ return {
+ ...defaultGrid,
+ left: 120
+ }
+ case 'right':
+ return {
+ ...defaultGrid,
+ right: 120
+ }
+ default:
+ return defaultGrid
+ }
+ }
+
+ // 创建IntersectionObserver
+ const createIntersectionObserver = () => {
+ if (intersectionObserver || !chartRef.value) return
+
+ intersectionObserver = new IntersectionObserver(
+ (entries) => {
+ entries.forEach((entry) => {
+ if (entry.isIntersecting && pendingOptions && !isDestroyed) {
+ // 使用 requestAnimationFrame 确保在下一帧初始化图表
+ requestAnimationFrame(() => {
+ if (!isDestroyed && pendingOptions) {
+ try {
+ // 元素变为可见,初始化图表
+ if (!chart) {
+ chart = echarts.init(entry.target as HTMLElement)
+ }
+
+ // 触发自定义事件,让组件处理动画逻辑
+ const event = new CustomEvent('chartVisible', {
+ detail: { options: pendingOptions }
+ })
+ entry.target.dispatchEvent(event)
+
+ pendingOptions = null
+ cleanupIntersectionObserver()
+ } catch (error) {
+ console.error('图表初始化失败:', error)
+ }
+ }
+ })
+ }
+ })
+ },
+ { threshold }
+ )
+
+ intersectionObserver.observe(chartRef.value)
+ }
+
+ // 清理IntersectionObserver
+ const cleanupIntersectionObserver = () => {
+ if (intersectionObserver) {
+ intersectionObserver.disconnect()
+ intersectionObserver = null
+ }
+ }
+
+ // 检查容器是否可见
+ const isContainerVisible = (element: HTMLElement): boolean => {
+ const rect = element.getBoundingClientRect()
+ return rect.width > 0 && rect.height > 0 && rect.top < window.innerHeight && rect.bottom > 0
+ }
+
+ // 图表初始化核心逻辑
+ const performChartInit = (options: EChartsOption) => {
+ if (!chart && chartRef.value && !isDestroyed) {
+ chart = echarts.init(chartRef.value)
+ // 图表创建后立即设置监听器
+ setupMenuWatchers()
+ setupThemeWatcher()
+ }
+ if (chart && !isDestroyed) {
+ chart.setOption(options)
+ pendingOptions = null
+ }
+ }
+
+ // 空状态管理器
+ const emptyStateManager = {
+ create: () => {
+ if (!chartRef.value || emptyStateDiv) return
+
+ emptyStateDiv = document.createElement('div')
+ emptyStateDiv.style.cssText = `
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ font-size: 12px;
+ color: ${isDark.value ? '#555555' : '#B3B2B2'};
+ background: transparent;
+ z-index: 10;
+ `
+ emptyStateDiv.innerHTML = `暂无数据 `
+
+ // 确保父容器有相对定位
+ if (
+ chartRef.value.style.position !== 'relative' &&
+ chartRef.value.style.position !== 'absolute'
+ ) {
+ chartRef.value.style.position = 'relative'
+ }
+
+ chartRef.value.appendChild(emptyStateDiv)
+ },
+
+ remove: () => {
+ if (emptyStateDiv && chartRef.value) {
+ chartRef.value.removeChild(emptyStateDiv)
+ emptyStateDiv = null
+ }
+ },
+
+ updateStyle: () => {
+ if (emptyStateDiv) {
+ emptyStateDiv.style.color = isDark.value ? '#666' : '#999'
+ }
+ }
+ }
+
+ // 初始化图表
+ const initChart = (options: EChartsOption = {}, isEmpty: boolean = false) => {
+ if (!chartRef.value || isDestroyed) return
+
+ const mergedOptions = { ...initOptions, ...options }
+
+ try {
+ if (isEmpty) {
+ // 处理空数据情况 - 显示自定义空状态div
+ if (chart) {
+ chart.clear()
+ }
+ emptyStateManager.create()
+ return
+ } else {
+ // 有数据时移除空状态div
+ emptyStateManager.remove()
+ }
+
+ if (isContainerVisible(chartRef.value)) {
+ // 容器可见,正常初始化
+ if (initDelay > 0) {
+ setTimeout(() => performChartInit(mergedOptions), initDelay)
+ } else {
+ performChartInit(mergedOptions)
+ }
+ } else {
+ // 容器不可见,保存选项并设置监听器
+ pendingOptions = mergedOptions
+ createIntersectionObserver()
+ }
+ } catch (error) {
+ console.error('图表初始化失败:', error)
+ }
+ }
+
+ // 更新图表
+ const updateChart = (options: EChartsOption) => {
+ if (isDestroyed) return
+
+ try {
+ if (!chart) {
+ // 如果图表不存在,先初始化
+ initChart(options)
+ return
+ }
+ chart.setOption(options)
+ } catch (error) {
+ console.error('图表更新失败:', error)
+ }
+ }
+
+ // 处理窗口大小变化
+ const handleResize = () => {
+ if (chart && !isDestroyed) {
+ try {
+ chart.resize()
+ } catch (error) {
+ console.error('图表resize失败:', error)
+ }
+ }
+ }
+
+ // 销毁图表
+ const destroyChart = () => {
+ isDestroyed = true
+
+ if (chart) {
+ try {
+ chart.dispose()
+ } catch (error) {
+ console.error('图表销毁失败:', error)
+ } finally {
+ chart = null
+ }
+ }
+
+ // 清理所有监听器和资源
+ cleanupMenuWatchers()
+ cleanupThemeWatcher()
+ emptyStateManager.remove()
+ cleanupIntersectionObserver()
+ clearTimers()
+ clearStyleCache()
+ pendingOptions = null
+ }
+
+ // 获取图表实例
+ const getChartInstance = () => chart
+
+ // 获取图表是否已初始化
+ const isChartInitialized = () => chart !== null
+
+ onMounted(() => {
+ window.addEventListener('resize', debouncedResize)
+ })
+
+ onBeforeUnmount(() => {
+ window.removeEventListener('resize', debouncedResize)
+ })
+
+ onUnmounted(() => {
+ destroyChart()
+ })
+
+ return {
+ isDark,
+ chartRef,
+ initChart,
+ updateChart,
+ handleResize,
+ destroyChart,
+ getChartInstance,
+ isChartInitialized,
+ emptyStateManager,
+ getAxisLineStyle,
+ getSplitLineStyle,
+ getAxisLabelStyle,
+ getAxisTickStyle,
+ getAnimationConfig,
+ getTooltipStyle,
+ getLegendStyle,
+ useChartOps,
+ getGridWithLegend
+ }
+}
+
+// 高级图表组件抽象
+interface UseChartComponentOptions {
+ /** Props响应式对象 */
+ props: T
+ /** 图表配置生成函数 */
+ generateOptions: () => EChartsOption
+ /** 空数据检查函数 */
+ checkEmpty?: () => boolean
+ /** 自定义监听的响应式数据 */
+ watchSources?: (() => any)[]
+ /** 自定义可视事件处理 */
+ onVisible?: () => void
+ /** useChart选项 */
+ chartOptions?: UseChartOptions
+}
+
+export function useChartComponent(options: UseChartComponentOptions) {
+ const {
+ props,
+ generateOptions,
+ checkEmpty,
+ watchSources = [],
+ onVisible,
+ chartOptions = {}
+ } = options
+
+ const chart = useChart(chartOptions)
+ const { chartRef, initChart, isDark, emptyStateManager } = chart
+
+ // 检查是否为空数据
+ const isEmpty = computed(() => {
+ if (props.isEmpty) return true
+ if (checkEmpty) return checkEmpty()
+ return false
+ })
+
+ // 更新图表
+ const updateChart = () => {
+ nextTick(() => {
+ if (isEmpty.value) {
+ // 处理空数据情况 - 显示自定义空状态div
+ if (chart.getChartInstance()) {
+ chart.getChartInstance()?.clear()
+ }
+ emptyStateManager.create()
+ } else {
+ // 有数据时移除空状态div并初始化图表
+ emptyStateManager.remove()
+ initChart(generateOptions())
+ }
+ })
+ }
+
+ // 处理图表进入可视区域时的逻辑
+ const handleChartVisible = () => {
+ if (onVisible) {
+ onVisible()
+ } else {
+ updateChart()
+ }
+ }
+
+ // 存储监听器停止函数
+ const stopHandles: (() => void)[] = []
+
+ // 设置数据监听
+ const setupWatchers = () => {
+ // 监听自定义数据源
+ if (watchSources.length > 0) {
+ const stopHandle = watch(watchSources, updateChart, { deep: true })
+ stopHandles.push(stopHandle)
+ }
+
+ // 监听主题变化
+ const themeStopHandle = watch(isDark, () => {
+ emptyStateManager.updateStyle()
+ updateChart()
+ })
+ stopHandles.push(themeStopHandle)
+ }
+
+ // 清理所有监听器
+ const cleanupWatchers = () => {
+ stopHandles.forEach((stop) => stop())
+ stopHandles.length = 0
+ }
+
+ // 设置生命周期
+ const setupLifecycle = () => {
+ onMounted(() => {
+ updateChart()
+
+ // 监听图表可见事件
+ if (chartRef.value) {
+ chartRef.value.addEventListener('chartVisible', handleChartVisible)
+ }
+ })
+
+ onBeforeUnmount(() => {
+ // 清理事件监听器
+ if (chartRef.value) {
+ chartRef.value.removeEventListener('chartVisible', handleChartVisible)
+ }
+ // 清理所有监听器
+ cleanupWatchers()
+ // 清理空状态div
+ emptyStateManager.remove()
+ })
+ }
+
+ // 初始化
+ setupWatchers()
+ setupLifecycle()
+
+ return {
+ ...chart,
+ isEmpty,
+ updateChart,
+ handleChartVisible
+ }
+}
diff --git a/saiadmin-artd/src/hooks/core/useCommon.ts b/saiadmin-artd/src/hooks/core/useCommon.ts
new file mode 100644
index 0000000..c936854
--- /dev/null
+++ b/saiadmin-artd/src/hooks/core/useCommon.ts
@@ -0,0 +1,87 @@
+/**
+ * useCommon - 通用功能集合
+ *
+ * 提供常用的页面操作功能,包括页面刷新、滚动控制、路径获取等。
+ * 这些功能在多个页面和组件中都会用到,统一封装便于复用。
+ *
+ * ## 主要功能
+ *
+ * 1. 首页路径 - 获取系统配置的首页路径
+ * 2. 页面刷新 - 刷新当前页面内容
+ * 3. 滚动控制 - 提供多种滚动到顶部和指定位置的方法
+ * 4. 平滑滚动 - 支持平滑滚动动画效果
+ *
+ * @module useCommon
+ * @author Art Design Pro Team
+ */
+
+import { computed } from 'vue'
+import { useMenuStore } from '@/store/modules/menu'
+import { useSettingStore } from '@/store/modules/setting'
+
+export function useCommon() {
+ const menuStore = useMenuStore()
+ const settingStore = useSettingStore()
+
+ /**
+ * 首页路径
+ * 从菜单 store 中获取配置的首页路径
+ */
+ const homePath = computed(() => menuStore.getHomePath())
+
+ /**
+ * 刷新当前页面
+ * 通过切换 setting store 中的 refresh 状态触发页面重新渲染
+ */
+ const refresh = () => {
+ settingStore.reload()
+ }
+
+ /**
+ * 滚动到页面顶部
+ * 查找主内容区域并将其滚动位置重置为顶部
+ */
+ const scrollToTop = () => {
+ const scrollContainer = document.getElementById('app-main')
+ if (scrollContainer) {
+ scrollContainer.scrollTop = 0
+ }
+ }
+
+ /**
+ * 平滑滚动到页面顶部
+ * 使用 smooth 行为实现平滑滚动效果
+ */
+ const smoothScrollToTop = () => {
+ const scrollContainer = document.getElementById('app-main')
+ if (scrollContainer) {
+ scrollContainer.scrollTo({
+ top: 0,
+ behavior: 'smooth'
+ })
+ }
+ }
+
+ /**
+ * 滚动到指定位置
+ * @param top 目标滚动位置(像素)
+ * @param smooth 是否使用平滑滚动
+ */
+ const scrollTo = (top: number, smooth: boolean = false) => {
+ const scrollContainer = document.getElementById('app-main')
+ if (scrollContainer) {
+ scrollContainer.scrollTo({
+ top,
+ behavior: smooth ? 'smooth' : 'auto'
+ })
+ }
+ }
+
+ return {
+ homePath,
+ refresh,
+ scrollTo,
+ scrollToTop,
+ smoothScrollToTop
+ }
+}
diff --git a/saiadmin-artd/src/hooks/core/useFastEnter.ts b/saiadmin-artd/src/hooks/core/useFastEnter.ts
new file mode 100644
index 0000000..555eb65
--- /dev/null
+++ b/saiadmin-artd/src/hooks/core/useFastEnter.ts
@@ -0,0 +1,55 @@
+/**
+ * useFastEnter - 快速入口管理
+ *
+ * 管理顶部栏的快速入口功能,提供应用列表和快速链接的配置和过滤。
+ * 支持动态启用/禁用、自定义排序、响应式宽度控制等功能。
+ *
+ * ## 主要功能
+ *
+ * 1. 应用列表管理 - 获取启用的应用列表,自动按排序权重排序
+ * 2. 快速链接管理 - 获取启用的快速链接,支持自定义排序
+ * 3. 响应式配置 - 所有配置自动响应变化,无需手动更新
+ * 4. 宽度控制 - 提供最小显示宽度配置,支持响应式布局
+ *
+ * @module useFastEnter
+ * @author Art Design Pro Team
+ */
+
+import { computed } from 'vue'
+import appConfig from '@/config'
+import type { FastEnterApplication, FastEnterQuickLink } from '@/types/config'
+
+export function useFastEnter() {
+ // 获取快速入口配置
+ const fastEnterConfig = computed(() => appConfig.fastEnter)
+
+ // 获取启用的应用列表(按排序权重排序)
+ const enabledApplications = computed(() => {
+ if (!fastEnterConfig.value?.applications) return []
+
+ return fastEnterConfig.value.applications
+ .filter((app) => app.enabled !== false)
+ .sort((a, b) => (a.order || 0) - (b.order || 0))
+ })
+
+ // 获取启用的快速链接(按排序权重排序)
+ const enabledQuickLinks = computed(() => {
+ if (!fastEnterConfig.value?.quickLinks) return []
+
+ return fastEnterConfig.value.quickLinks
+ .filter((link) => link.enabled !== false)
+ .sort((a, b) => (a.order || 0) - (b.order || 0))
+ })
+
+ // 获取最小显示宽度
+ const minWidth = computed(() => {
+ return fastEnterConfig.value?.minWidth || 1200
+ })
+
+ return {
+ fastEnterConfig,
+ enabledApplications,
+ enabledQuickLinks,
+ minWidth
+ }
+}
diff --git a/saiadmin-artd/src/hooks/core/useHeaderBar.ts b/saiadmin-artd/src/hooks/core/useHeaderBar.ts
new file mode 100644
index 0000000..be10712
--- /dev/null
+++ b/saiadmin-artd/src/hooks/core/useHeaderBar.ts
@@ -0,0 +1,201 @@
+/**
+ * useHeaderBar - 顶部栏功能管理
+ *
+ * 统一管理顶部栏各个功能模块的显示状态和配置信息。
+ * 提供灵活的功能开关控制,支持动态显示/隐藏顶部栏的各个功能按钮。
+ *
+ * ## 主要功能
+ *
+ * 1. 功能开关控制 - 统一管理菜单按钮、刷新按钮、快速入口等功能的显示状态
+ * 2. 配置信息获取 - 获取各个功能模块的详细配置信息
+ * 3. 功能列表查询 - 快速获取所有启用或禁用的功能列表
+ * 4. 响应式状态 - 所有状态自动响应配置和 store 变化
+ *
+ * @module useHeaderBar
+ * @author Art Design Pro Team
+ */
+
+import { computed } from 'vue'
+import { storeToRefs } from 'pinia'
+import { useSettingStore } from '@/store/modules/setting'
+import { headerBarConfig } from '@/config/modules/headerBar'
+import { HeaderBarFeatureConfig } from '@/types'
+
+/**
+ * 顶部栏功能管理
+ * @returns 顶部栏功能相关的状态和方法
+ */
+export function useHeaderBar() {
+ const settingStore = useSettingStore()
+
+ // 获取顶部栏配置
+ const headerBarConfigRef = computed(() => headerBarConfig)
+
+ // 从store中获取相关状态
+ const { showMenuButton, showFastEnter, showRefreshButton, showCrumbs, showLanguage } =
+ storeToRefs(settingStore)
+
+ /**
+ * 检查特定功能是否启用
+ * @param feature 功能名称
+ * @returns 是否启用
+ */
+ const isFeatureEnabled = (feature: keyof HeaderBarFeatureConfig): boolean => {
+ return headerBarConfigRef.value[feature]?.enabled ?? false
+ }
+
+ /**
+ * 获取功能配置信息
+ * @param feature 功能名称
+ * @returns 功能配置信息
+ */
+ const getFeatureConfig = (feature: keyof HeaderBarFeatureConfig) => {
+ return headerBarConfigRef.value[feature]
+ }
+
+ // 检查菜单按钮是否显示
+ const shouldShowMenuButton = computed(() => {
+ return isFeatureEnabled('menuButton') && showMenuButton.value
+ })
+
+ // 检查刷新按钮是否显示
+ const shouldShowRefreshButton = computed(() => {
+ return isFeatureEnabled('refreshButton') && showRefreshButton.value
+ })
+
+ // 检查快速入口是否显示
+ const shouldShowFastEnter = computed(() => {
+ return isFeatureEnabled('fastEnter') && showFastEnter.value
+ })
+
+ // 检查面包屑是否显示
+ const shouldShowBreadcrumb = computed(() => {
+ return isFeatureEnabled('breadcrumb') && showCrumbs.value
+ })
+
+ // 检查全局搜索是否显示
+ const shouldShowGlobalSearch = computed(() => {
+ return isFeatureEnabled('globalSearch')
+ })
+
+ // 检查全屏按钮是否显示
+ const shouldShowFullscreen = computed(() => {
+ return isFeatureEnabled('fullscreen')
+ })
+
+ // 检查通知中心是否显示
+ const shouldShowNotification = computed(() => {
+ return isFeatureEnabled('notification')
+ })
+
+ // 检查聊天功能是否显示
+ const shouldShowChat = computed(() => {
+ return isFeatureEnabled('chat')
+ })
+
+ // 检查语言切换是否显示
+ const shouldShowLanguage = computed(() => {
+ return isFeatureEnabled('language') && showLanguage.value
+ })
+
+ // 检查设置面板是否显示
+ const shouldShowSettings = computed(() => {
+ return isFeatureEnabled('settings')
+ })
+
+ // 检查主题切换是否显示
+ const shouldShowThemeToggle = computed(() => {
+ return isFeatureEnabled('themeToggle')
+ })
+
+ // 获取快速入口的最小宽度
+ const fastEnterMinWidth = computed(() => {
+ const config = getFeatureConfig('fastEnter')
+ return (config as any)?.minWidth || 1200
+ })
+
+ /**
+ * 检查功能是否启用(别名)
+ * @param feature 功能名称
+ * @returns 是否启用
+ */
+ const isFeatureActive = (feature: keyof HeaderBarFeatureConfig): boolean => {
+ return isFeatureEnabled(feature)
+ }
+
+ /**
+ * 获取功能配置(别名)
+ * @param feature 功能名称
+ * @returns 功能配置
+ */
+ const getFeatureInfo = (feature: keyof HeaderBarFeatureConfig) => {
+ return getFeatureConfig(feature)
+ }
+
+ /**
+ * 获取所有启用的功能列表
+ * @returns 启用的功能名称数组
+ */
+ const getEnabledFeatures = (): (keyof HeaderBarFeatureConfig)[] => {
+ return Object.keys(headerBarConfigRef.value).filter(
+ (key) => headerBarConfigRef.value[key as keyof HeaderBarFeatureConfig]?.enabled
+ ) as (keyof HeaderBarFeatureConfig)[]
+ }
+
+ /**
+ * 获取所有禁用的功能列表
+ * @returns 禁用的功能名称数组
+ */
+ const getDisabledFeatures = (): (keyof HeaderBarFeatureConfig)[] => {
+ return Object.keys(headerBarConfigRef.value).filter(
+ (key) => !headerBarConfigRef.value[key as keyof HeaderBarFeatureConfig]?.enabled
+ ) as (keyof HeaderBarFeatureConfig)[]
+ }
+
+ /**
+ * 获取所有启用的功能(别名)
+ * @returns 启用的功能列表
+ */
+ const getActiveFeatures = () => {
+ return getEnabledFeatures()
+ }
+
+ /**
+ * 获取所有禁用的功能(别名)
+ * @returns 禁用的功能列表
+ */
+ const getInactiveFeatures = () => {
+ return getDisabledFeatures()
+ }
+
+ return {
+ // 配置
+ headerBarConfig: headerBarConfigRef,
+
+ // 显示状态计算属性
+ shouldShowMenuButton, // 是否显示菜单按钮
+ shouldShowRefreshButton, // 是否显示刷新按钮
+ shouldShowFastEnter, // 是否显示快速入口
+ shouldShowBreadcrumb, // 是否显示面包屑
+ shouldShowGlobalSearch, // 是否显示全局搜索
+ shouldShowFullscreen, // 是否显示全屏按钮
+ shouldShowNotification, // 是否显示通知中心
+ shouldShowChat, // 是否显示聊天功能
+ shouldShowLanguage, // 是否显示语言切换
+ shouldShowSettings, // 是否显示设置面板
+ shouldShowThemeToggle, // 是否显示主题切换
+
+ // 配置相关
+ fastEnterMinWidth, // 快速入口最小宽度
+
+ // 方法
+ isFeatureEnabled, // 检查功能是否启用
+ isFeatureActive, // 检查功能是否启用(别名)
+ getFeatureConfig, // 获取功能配置
+ getFeatureInfo, // 获取功能配置(别名)
+ getEnabledFeatures, // 获取所有启用的功能
+ getDisabledFeatures, // 获取所有禁用的功能
+ getActiveFeatures, // 获取所有启用的功能(别名)
+ getInactiveFeatures // 获取所有禁用的功能(别名)
+ }
+}
diff --git a/saiadmin-artd/src/hooks/core/useLayoutHeight.ts b/saiadmin-artd/src/hooks/core/useLayoutHeight.ts
new file mode 100644
index 0000000..4b1171a
--- /dev/null
+++ b/saiadmin-artd/src/hooks/core/useLayoutHeight.ts
@@ -0,0 +1,148 @@
+/**
+ * useLayoutHeight - 页面布局高度管理
+ *
+ * 自动计算和管理页面内容区域的高度,确保内容区域能够正确填充剩余空间。
+ * 监听头部元素高度变化,动态调整内容区域高度,避免出现滚动条或布局错乱。
+ *
+ * ## 主要功能
+ *
+ * 1. 动态高度计算 - 根据头部元素高度自动计算内容区域高度
+ * 2. 响应式监听 - 自动监听元素尺寸变化并更新高度
+ * 3. CSS 变量同步 - 自动更新 CSS 变量,方便全局使用
+ * 4. 灵活配置 - 支持自定义间距、CSS 变量名等
+ * 5. 自动查找模式 - 提供通过 ID 自动查找元素的便捷方式
+ *
+ * @module useLayoutHeight
+ * @author Art Design Pro Team
+ */
+
+import { ref, computed, watch, onMounted } from 'vue'
+import { useElementSize } from '@vueuse/core'
+
+/**
+ * 页面容器高度配置
+ */
+interface LayoutHeightOptions {
+ /** 额外的间距(默认 15px) */
+ extraSpacing?: number
+ /** 是否自动更新 CSS 变量(默认 true) */
+ updateCssVar?: boolean
+ /** CSS 变量名称(默认 '--art-full-height') */
+ cssVarName?: string
+}
+
+export function useLayoutHeight(options: LayoutHeightOptions = {}) {
+ const { extraSpacing = 15, updateCssVar = true, cssVarName = '--art-full-height' } = options
+
+ // 元素引用
+ const headerRef = ref()
+ const contentHeaderRef = ref()
+
+ // 使用 VueUse 自动监听元素尺寸变化
+ const { height: headerHeight } = useElementSize(headerRef)
+ const { height: contentHeaderHeight } = useElementSize(contentHeaderRef)
+
+ // 计算容器最小高度(响应式)
+ const containerMinHeight = computed(() => {
+ const totalHeight = headerHeight.value + contentHeaderHeight.value + extraSpacing
+ return `calc(100vh - ${totalHeight}px)`
+ })
+
+ if (updateCssVar) {
+ watch(
+ containerMinHeight,
+ (newHeight) => {
+ requestAnimationFrame(() => {
+ document.documentElement.style.setProperty(cssVarName, newHeight)
+ })
+ },
+ { immediate: true }
+ )
+ }
+
+ return {
+ /** 容器最小高度(响应式) */
+ containerMinHeight,
+ /** 头部元素引用 */
+ headerRef,
+ /** 内容头部元素引用 */
+ contentHeaderRef,
+ /** 头部高度(响应式) */
+ headerHeight,
+ /** 内容头部高度(响应式) */
+ contentHeaderHeight
+ }
+}
+
+/**
+ * 通过 ID 自动查找元素的布局高度管理
+ * 适用于无法直接获取元素引用的场景
+ *
+ * @param headerIds 头部元素的 ID 数组
+ * @param options 配置选项
+ *
+ * ```
+ */
+export function useAutoLayoutHeight(
+ headerIds: string[] = ['app-header', 'app-content-header'],
+ options: LayoutHeightOptions = {}
+) {
+ const { extraSpacing = 15, updateCssVar = true, cssVarName = '--art-full-height' } = options
+
+ // 创建元素引用
+ const headerRef = ref()
+ const contentHeaderRef = ref()
+
+ // 使用 VueUse 自动监听元素尺寸变化
+ const { height: headerHeight } = useElementSize(headerRef)
+ const { height: contentHeaderHeight } = useElementSize(contentHeaderRef)
+
+ // 计算容器最小高度(响应式)
+ const containerMinHeight = computed(() => {
+ const totalHeight = headerHeight.value + contentHeaderHeight.value + extraSpacing
+ return `calc(100vh - ${totalHeight}px)`
+ })
+
+ if (updateCssVar) {
+ watch(
+ containerMinHeight,
+ (newHeight) => {
+ requestAnimationFrame(() => {
+ document.documentElement.style.setProperty(cssVarName, newHeight)
+ })
+ },
+ { immediate: true }
+ )
+ }
+
+ // 在 DOM 挂载后查找元素
+ onMounted(() => {
+ if (typeof document !== 'undefined') {
+ // 使用 nextTick 确保 DOM 完全渲染
+ requestAnimationFrame(() => {
+ const header = document.getElementById(headerIds[0])
+ const contentHeader = document.getElementById(headerIds[1])
+
+ if (header) {
+ headerRef.value = header
+ }
+ if (contentHeader) {
+ contentHeaderRef.value = contentHeader
+ }
+ })
+ }
+ })
+
+ return {
+ /** 容器最小高度(响应式) */
+ containerMinHeight,
+ /** 头部元素引用 */
+ headerRef,
+ /** 内容头部元素引用 */
+ contentHeaderRef,
+ /** 头部高度(响应式) */
+ headerHeight,
+ /** 内容头部高度(响应式) */
+ contentHeaderHeight
+ }
+}
diff --git a/saiadmin-artd/src/hooks/core/useTable.ts b/saiadmin-artd/src/hooks/core/useTable.ts
new file mode 100644
index 0000000..c79da01
--- /dev/null
+++ b/saiadmin-artd/src/hooks/core/useTable.ts
@@ -0,0 +1,767 @@
+/**
+ * useTable - 企业级表格数据管理方案
+ *
+ * 功能完整的表格数据管理解决方案,专为后台管理系统设计。
+ * 封装了表格开发中的所有常见需求,让你专注于业务逻辑。
+ *
+ * ## 主要功能
+ *
+ * 1. 数据管理 - 自动处理 API 请求、响应转换、加载状态和错误处理
+ * 2. 分页控制 - 自动同步分页状态、移动端适配、智能页码边界处理
+ * 3. 搜索功能 - 防抖搜索优化、参数管理、一键重置、参数过滤
+ * 4. 缓存系统 - 智能请求缓存、多种清理策略、自动过期管理、统计信息
+ * 5. 刷新策略 - 提供 5 种刷新方法适配不同业务场景(新增/更新/删除/手动/定时)
+ * 6. 列配置管理 - 动态显示/隐藏列、列排序、配置持久化、批量操作(可选)
+ *
+ * @module useTable
+ * @author Art Design Pro Team
+ */
+
+import { ref, reactive, computed, onMounted, onUnmounted, nextTick, readonly } from 'vue'
+import { useWindowSize } from '@vueuse/core'
+import { useTableColumns } from './useTableColumns'
+import type { ColumnOption } from '@/types/component'
+import {
+ TableCache,
+ CacheInvalidationStrategy,
+ type ApiResponse
+} from '../../utils/table/tableCache'
+import {
+ type TableError,
+ defaultResponseAdapter,
+ extractTableData,
+ updatePaginationFromResponse,
+ createSmartDebounce,
+ createErrorHandler
+} from '../../utils/table/tableUtils'
+import { tableConfig } from '../../utils/table/tableConfig'
+
+// 类型推导工具类型
+type InferApiParams = T extends (params: infer P) => any ? P : never
+type InferApiResponse = T extends (params: any) => Promise ? R : never
+type InferRecordType = T extends Api.Common.PaginatedResponse ? U : never
+
+// 优化的配置接口 - 支持自动类型推导
+export interface UseTableConfig<
+ TApiFn extends (params: any) => Promise