From a67db58cced33f9c9772857c0833ecb27973b0fc Mon Sep 17 00:00:00 2001 From: paff Date: Sun, 23 Aug 2026 16:48:25 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/datatimeutc/.gitignore | 3 + plugins/datatimeutc/CHANGELOG.md | 6 + plugins/datatimeutc/README.md | 282 +++ plugins/datatimeutc/index.html | 11 + plugins/datatimeutc/package-lock.json | 2222 +++++++++++++++++ plugins/datatimeutc/package.json | 24 + plugins/datatimeutc/plugin.json | 42 + plugins/datatimeutc/preload.js | 125 + plugins/datatimeutc/src-ztools/logo.png | Bin 0 -> 57425 bytes plugins/datatimeutc/src-ztools/plugin.json | 42 + .../src-ztools/preload/package.json | 3 + .../src-ztools/preload/services.js | 205 ++ plugins/datatimeutc/src/App.vue | 29 + plugins/datatimeutc/src/Utc/AutoFloat.vue | 36 + plugins/datatimeutc/src/Utc/Float.vue | 394 +++ plugins/datatimeutc/src/Utc/format.ts | 324 +++ plugins/datatimeutc/src/Utc/index.vue | 430 ++++ plugins/datatimeutc/src/Utc/time.ts | 113 + plugins/datatimeutc/src/auto-imports.d.ts | 12 + plugins/datatimeutc/src/components.d.ts | 18 + plugins/datatimeutc/src/env.d.ts | 31 + plugins/datatimeutc/src/main.css | 86 + plugins/datatimeutc/src/main.ts | 17 + plugins/datatimeutc/tsconfig.json | 19 + plugins/datatimeutc/vite.config.js | 28 + 25 files changed, 4502 insertions(+) create mode 100755 plugins/datatimeutc/.gitignore create mode 100755 plugins/datatimeutc/CHANGELOG.md create mode 100755 plugins/datatimeutc/README.md create mode 100755 plugins/datatimeutc/index.html create mode 100755 plugins/datatimeutc/package-lock.json create mode 100755 plugins/datatimeutc/package.json create mode 100755 plugins/datatimeutc/plugin.json create mode 100755 plugins/datatimeutc/preload.js create mode 100755 plugins/datatimeutc/src-ztools/logo.png create mode 100755 plugins/datatimeutc/src-ztools/plugin.json create mode 100755 plugins/datatimeutc/src-ztools/preload/package.json create mode 100755 plugins/datatimeutc/src-ztools/preload/services.js create mode 100755 plugins/datatimeutc/src/App.vue create mode 100755 plugins/datatimeutc/src/Utc/AutoFloat.vue create mode 100755 plugins/datatimeutc/src/Utc/Float.vue create mode 100755 plugins/datatimeutc/src/Utc/format.ts create mode 100755 plugins/datatimeutc/src/Utc/index.vue create mode 100755 plugins/datatimeutc/src/Utc/time.ts create mode 100755 plugins/datatimeutc/src/auto-imports.d.ts create mode 100755 plugins/datatimeutc/src/components.d.ts create mode 100755 plugins/datatimeutc/src/env.d.ts create mode 100755 plugins/datatimeutc/src/main.css create mode 100755 plugins/datatimeutc/src/main.ts create mode 100755 plugins/datatimeutc/tsconfig.json create mode 100755 plugins/datatimeutc/vite.config.js diff --git a/plugins/datatimeutc/.gitignore b/plugins/datatimeutc/.gitignore new file mode 100755 index 000000000..8b0c7587a --- /dev/null +++ b/plugins/datatimeutc/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +AGENTS.md +ztools-dev-reference.md \ No newline at end of file diff --git a/plugins/datatimeutc/CHANGELOG.md b/plugins/datatimeutc/CHANGELOG.md new file mode 100755 index 000000000..67f1edf42 --- /dev/null +++ b/plugins/datatimeutc/CHANGELOG.md @@ -0,0 +1,6 @@ +# Changelog + +## 1.0.2 - 2026-08-23 + +- 获取当前UTC时间,支持更改时区、悬浮窗显示、日期显示格式、悬浮窗透明度和大小调整 + diff --git a/plugins/datatimeutc/README.md b/plugins/datatimeutc/README.md new file mode 100755 index 000000000..c0336bf35 --- /dev/null +++ b/plugins/datatimeutc/README.md @@ -0,0 +1,282 @@ +# {{PLUGIN_NAME}} + +> {{DESCRIPTION}} + +这是一个使用 **Vue 3 + Vite + TypeScript** 构建的 ZTools 插件。 + +## ✨ 功能特性 + +### 📌 已包含的示例功能 + +- **Hello** - 基础功能指令示例 + - 触发指令:`你好` / `hello` + - 展示简单的 Vue 组件界面 + +- **读文件** - 文件读取功能示例 + - 功能指令:`读文件` + - 匹配指令:支持拖拽文件触发 + - 演示如何使用 Node.js 能力读取文件内容 + +- **保存为文件** - 文件写入功能示例 + - 匹配指令:任意文本/图片 → `保存为文件` + - 演示如何将剪贴板内容保存为文件 + +## 📁 项目结构 + +``` +. +├── src/ +│ ├── main.ts # 入口文件 +│ ├── main.css # 全局样式 +│ ├── App.vue # 根组件 +│ ├── env.d.ts # 类型声明 +│ ├── Hello/ # Hello 功能组件 +│ │ └── index.vue +│ ├── Read/ # 读文件功能组件 +│ │ └── index.vue +│ └── Write/ # 写文件功能组件 +│ └── index.vue +├── src-ztools/ # ZTools 插件目录 +│ ├── logo.png # 插件图标 +│ ├── plugin.json # 插件配置文件 +│ ├── preload/ # Preload 脚本目录 +│ │ ├── package.json # Preload 依赖配置 +│ │ └── services.js # Node.js 能力扩展 +│ └── dist/ # Vite 构建产物 +├── index.html # HTML 模板 +├── vite.config.js # Vite 配置 +├── tsconfig.json # TypeScript 配置 +├── package.json # 项目依赖 +└── README.md # 项目文档 +``` + +## 🚀 快速开始 + +### 安装依赖 + +```bash +npm install +``` + +### 开发模式 + +```bash +npm run dev +``` + +开发服务器将在 `http://localhost:5173` 启动。ZTools 会自动加载开发版本。 + +### 构建生产版本 + +```bash +npm run build +``` + +构建产物将输出到 `src-ztools/dist/` 目录,插件配置、图标和 Preload 保留在同级目录。 + +## 📖 开发指南 + +### 1. 修改插件配置 + +编辑 `src-ztools/plugin.json` 文件: + +```json +{ + "name": "你的插件名称", + "description": "插件描述", + "author": "作者名称", + "version": "1.0.0", + "features": [ + // 添加你的功能配置 + ] +} +``` + +### 2. 创建新功能 + +#### 步骤 1: 创建 Vue 组件 + +在 `src/` 目录下创建新的功能组件: + +```vue + + + + + + +``` + +#### 步骤 2: 注册路由 + +在 `src/App.vue` 中添加路由: + +```vue + +``` + +#### 步骤 3: 配置功能 + +在 `plugin.json` 中添加功能配置: + +```json +{ + "code": "myfeature", + "explain": "我的新功能", + "icon": "logo.png", + "cmds": ["触发指令"] +} +``` + +### 3. 使用 Node.js 能力 + +#### 扩展 Preload 服务 + +编辑 `src-ztools/preload/services.js`: + +```javascript +const fs = require('fs') +const path = require('path') + +module.exports = { + // 示例:读取文件 + readFile: (filePath) => { + return fs.readFileSync(filePath, 'utf-8') + }, + + // 添加你的服务 + myService: (params) => { + // 实现你的逻辑 + return result + } +} +``` + +#### 在 Vue 组件中调用 + +```vue + +``` + +### 4. 使用 ZTools API + +```vue + +``` + +## 🎨 样式开发 + +### 使用 CSS 变量 + +ZTools 提供了一套 CSS 变量用于主题适配: + +```css +.my-component { + background: var(--bg-color); + color: var(--text-color); + border: 1px solid var(--border-color); +} +``` + +### 暗色模式支持 + +```css +@media (prefers-color-scheme: dark) { + .my-component { + /* 暗色模式样式 */ + } +} +``` + +## 📦 构建与发布 + +### 1. 构建插件 + +```bash +npm run build +``` + +### 2. 测试构建产物 + +将 `src-ztools/` 作为完整 ZTools 插件目录进行测试或打包。 + +### 3. 发布到插件市场 + +1. 确保 `plugin.json` 中的信息完整准确 +2. 准备好插件截图和详细说明 +3. 访问 ZTools 插件市场提交插件 + +## 📚 相关资源 + +- [ZTools 官方文档](https://github.com/ztool-center/ztools) +- [ZTools API 文档](https://github.com/ztool-center/ztools-api-types) +- [Vue 3 文档](https://vuejs.org/) +- [Vite 文档](https://vitejs.dev/) + +## ❓ 常见问题 + +### Q: 如何调试插件? + +A: 使用 `npm run dev` 启动开发服务器,在插件界面中点击插件头像图标,在弹出的菜单中选择"打开开发者工具"进行调试。 + +### Q: 如何访问 Node.js 能力? + +A: 通过 `src-ztools/preload/services.js` 文件扩展服务,然后在组件中使用 `window.services` 调用。 + +### Q: 插件图标不显示? + +A: 确保 `src-ztools/logo.png` 文件存在,且在 `plugin.json` 中正确配置了 `logo` 字段。 + +### Q: 如何处理大文件上传? + +A: 建议使用 Node.js 流式处理,在 preload 脚本中实现文件分块处理逻辑。 + +## 📄 开源协议 + +MIT License + +--- + +**祝你开发愉快!** 🎉 diff --git a/plugins/datatimeutc/index.html b/plugins/datatimeutc/index.html new file mode 100755 index 000000000..eaa17316c --- /dev/null +++ b/plugins/datatimeutc/index.html @@ -0,0 +1,11 @@ + + + + + + + +
+ + + diff --git a/plugins/datatimeutc/package-lock.json b/plugins/datatimeutc/package-lock.json new file mode 100755 index 000000000..98dba310c --- /dev/null +++ b/plugins/datatimeutc/package-lock.json @@ -0,0 +1,2222 @@ +{ + "name": "datatimeutc", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "datatimeutc", + "version": "1.0.0", + "dependencies": { + "@element-plus/icons-vue": "^2.3.2", + "element-plus": "^2.14.4", + "vue": "^3.5.13" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.2.1", + "@ztools-center/ztools-api-types": "^1.0.1", + "typescript": "^5.3.0", + "unplugin-auto-import": "^21.1.0", + "unplugin-vue-components": "^32.1.0", + "vite": "^6.0.11", + "vue-tsc": "^2.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz", + "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@element-plus/icons-vue": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz", + "integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==", + "license": "MIT", + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.12", + "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "license": "MIT" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@popperjs/core": { + "name": "@sxzz/popperjs-es", + "version": "2.11.8", + "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.8.tgz", + "integrity": "sha512-wOwESXvvED3S8xBmcPWHs2dUuzrE4XiZeFu7e1hROIJkm02a49N120pmOXxY33sBb6hArItm5W5tcg1cBtV+HQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.5.tgz", + "integrity": "sha512-jfkGfTwhQpsiSckPF8r9bU3pn3vyd72NlWaO+TgEO6WPSDnUhXzrNYCHBMOYj0ACaUgjm6eERLF+XV9a6RstoA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.5.tgz", + "integrity": "sha512-oGVqyQlxnrz9/ty89oHpU857VUHEl5/Xu4R2lS+aivCTrNnSsbiENzTnNaBsjxH0CNWGPhzHArOLFwo+oKXveA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.5.tgz", + "integrity": "sha512-bW7B8xMEq8n99Q3ieEcPRGuphurdZAaFzQc9Efyyw3FL6DZO6pMy9xhdN+kBoD7Sy05xNXSr4OyPPnpkYriS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.5.tgz", + "integrity": "sha512-YSwBS86QeHOGlrxJ1PSOIZSkzRL/JmKeunhc+lV6M1a6En8QuVCD/T/qIA0J4Gd2Y86RIOBYrLcOUtqGh9+/1w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.5.tgz", + "integrity": "sha512-2fST8lILgl7cKbme/1KDdPCmbXbG+gqoV3bHp19L0ypX/3akYMBVdOunPleRCwonoLnXOZ/0F+Mt/v8POFmfcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.5.tgz", + "integrity": "sha512-cpIxQCP9J+EVad0a6LO1kY3ZGODlk80VlI+2I96B8xMcdHZ4pLVhfQ49JFpYqjPF91FFkQWftf57YlDcTiw9yQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.5.tgz", + "integrity": "sha512-r9fGh3eFs3e/udWh5ZjXQtxiYK/xoFxQaYR/cELxac/Udkl5Th+IsFm0CX3Kl9hmUH/we7EoMpjJgeQNnE0+IA==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.5.tgz", + "integrity": "sha512-xdvFdp7OM6KLJviJT2g/YuRSUjnZgGHk4RNgwIbN7X6cPugOucV60DdHXWzsBVCUdrGb6qSXnJQrrAKMmQuj3Q==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.5.tgz", + "integrity": "sha512-rRqILAndyzHzP7T9NFQrq+4HFWNhqkqkKur7eiBpfLmz01PO0JKx5Vchu3YllE4YXI/Ftgq/szrDWg5GJ0mI8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.5.tgz", + "integrity": "sha512-Gf4X3qVMucayUvux6aXXPgXovocSFUC0rrffDuPI/S2nHhNMhjcZxsrAFYCOF350PRreW1XwzFj3CT/3bKsWCw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.5.tgz", + "integrity": "sha512-+s5qA0TNM0qm8PK/a5gt/1Hpx+NV08uSuCncvhziIlQzT6AEV2fnUQo7eBtFTFO0nA9scauvoR2HusfXmQnO4w==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.5.tgz", + "integrity": "sha512-ybb6QvWwWJCbBWqERpc8K3pYVGIrXlG8MEQ8IIuJY6Y9KdHQxoFoNyfkAOtKn1VHu3KuLidXvwrvGR1mEjeWCw==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.5.tgz", + "integrity": "sha512-nZb1DtnOyhCmYvsC8A2CwOkopVg+IS1+fPUa7rMOAXtNw5+lLCLLPqd6XAiNrGtoQKsbvIBOwsHnBH/3wnb4HQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.5.tgz", + "integrity": "sha512-yMbj63Sp89ryrXLWyz+sy+fYD2HpOnMCLGbe4Oa1smclFSUukdtD/BgdiHaAetJNb74URD8U4hM+qG5KVzMEkg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.5.tgz", + "integrity": "sha512-mhoan3OJw2kYV/e1jtIdmvUZgyBFeA6zGWsOswmR0Tg19TQbowZuR+JMLID6spbbBN7Zee2ejrgmy3+FxGrIdA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.5.tgz", + "integrity": "sha512-5ZTLmjWbb1VZdjuyhe83K/8QO0/h11midQCBP+X5OYn32ra7eOBoM0ZqtaY4nkgNsYgmdVhMYPoyVPTjUpHf3w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.5.tgz", + "integrity": "sha512-m53kG+br6PGxOTmgBEM2DHSDs9RVjsyEbUwjJPJGTFm1grWOG8EKJggDCTb60unD4Tjby8fi7/m9XfkEWasVWg==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.5.tgz", + "integrity": "sha512-6RHPJR1g/uvdYU8uXBnfq3nlqyZCP82Fr6NHgfGoaIeSh0YEqnX/x6uA9MmJJbnSH7swqX4F+CkGdUF+6doiQA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.5.tgz", + "integrity": "sha512-xs+OXQtEXgpXT0DmA5+U3qnRZHdCST/5HRQxS8wSPZTUZN/EMWeHuSIod32LQklTBZBV9DyfncKBQ8n5V3eFdw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.5.tgz", + "integrity": "sha512-e7hD+sl3s+mcLQDZ8pbudBVsdG6r5yN4w3LqG2TJ8sQHDpblWj5lrJs/3m01Cvlxbt4x13zu5thLjgypgtkYzw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.5.tgz", + "integrity": "sha512-GiyJaCf+WpMub/17aPcKk27QMl5W6f+KhdPTjlFOn5akH5Wa/DCM9Stdx5cDfmasyKB08MqpVQ1uJE2RkkpbXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.5.tgz", + "integrity": "sha512-+OQ8U2DdoEfXl8T4Fb18AjmEwbXMerKDKCL8yCPAYhKCEEKoul7rkbeGCBFCbAlaGaa7pmtRTpkAJM2LE/i5FA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.5.tgz", + "integrity": "sha512-KanvAZrPKbDBFwrgiU9yEVpQoox9QPV1WZOXX7HudJQY+eSlu82CtWxDU8WtuRRvtN5EGkLczkd6Y6DTcvm9wA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.5.tgz", + "integrity": "sha512-1aC3UEWTtRl3RK3VpDJ/Tqk1XI4SLTmXIthAq6wRWo8XiSXJNd+VprJM4/1P4+i6HIaFEFlVi9sTTziniD2tOQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.5.tgz", + "integrity": "sha512-/gDJaRs4gl0NPIwqCz+6PkpmhhjRAD2j6P4rSNHBzUkO3naEx2mIU0pRle1vUNRQ7mE/+8OOeXLTv/J56FKiQg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.25", + "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.25.tgz", + "integrity": "sha512-+K1NIO8I+F9/wNulfVvu23QYd0Pe9/OCqRrim4NoYIf1VoEDL90Ve4ClzpyqBLc7NpGGWRvYNCKZ1BE/Jpf8dQ==", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.15", + "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-2.4.15.tgz", + "integrity": "sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.15" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.15", + "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-2.4.15.tgz", + "integrity": "sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.15", + "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-2.4.15.tgz", + "integrity": "sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.41", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.41.tgz", + "integrity": "sha512-q0Xtv/F9w2YO/7htQhtiL+Ev2WCJbe5N2hc+XfgyKkEKqWpSxknmT8QOuGdEKNdjPq0c3F7rNpFkTo3Kfrm7pg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@vue/shared": "3.5.41", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.41", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.41.tgz", + "integrity": "sha512-oKacVfNglLvGjnS6BXOlGL7EyG2h8X03pqXCjzotRZUaXGjbrTJUnVAQjrCqUnS+lyu31nwQjZY/d817GmCnfw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.41", + "@vue/shared": "3.5.41" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.41", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.41.tgz", + "integrity": "sha512-XJhip7R2wy6vX3knCxdZN4KracFaZUef58s1KYewqluedHIJaPIVfXoYT7MF1F8nCvv6k8bWWxDC8opMkg1VTQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@vue/compiler-core": "3.5.41", + "@vue/compiler-dom": "3.5.41", + "@vue/compiler-ssr": "3.5.41", + "@vue/shared": "3.5.41", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.19", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.41", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.41.tgz", + "integrity": "sha512-U3v5OejKEGqOI0Wy0+Sz7hGuIFZHA4LSXzrNM3IMIeDyJEBBfTpX26n3SDgToRpP2bLc9FfI2j/kSgcJ8Emq5A==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.41", + "@vue/shared": "3.5.41" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmmirror.com/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/language-core": { + "version": "2.2.12", + "resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-2.2.12.tgz", + "integrity": "sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^1.0.3", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.41", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.41.tgz", + "integrity": "sha512-rznsqKM0np0x18EjzF8x88MpEhdNsffbvFbckLL5+oUKz1BxAImEmO7J1ArRYSyo6aQaVoBDp7jEkT91OOxydA==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.41" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.41", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.41.tgz", + "integrity": "sha512-Vcry58hiAKwGen9Z1jUZE0feFsNArPCMOImYI8el48A9Idf6DuQYD0U05zZIF2Iad1hGhPSvcbBbAOhNr55fhg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.41", + "@vue/shared": "3.5.41" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.41", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.41.tgz", + "integrity": "sha512-3vVBahVBS9+U6cmXBLyb8nE6/yYo4J/CGI9eVFs3KiMc0YHuudwKyShTD65jtJy/L9PUUxNAFu4cj4LiJ0UFbw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.41", + "@vue/runtime-core": "3.5.41", + "@vue/shared": "3.5.41", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.41", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.41.tgz", + "integrity": "sha512-n6hx/pNFfbD6SuyeuMVkvqox8bwf/ET9JlA/kAz/imw8sw++wkqKe2mHX5KutjPpbKE4Z56yTHszoOjGMI9igQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.41", + "@vue/runtime-dom": "3.5.41", + "@vue/shared": "3.5.41" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.41", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.41.tgz", + "integrity": "sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==", + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "14.3.0", + "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-14.3.0.tgz", + "integrity": "sha512-aHfz47g0ZhMtTVHmIzMVpJy8ePhhOy68GY5bv110+5DVtZ+W7BsOx+m61UNQqfrWyPztIHIanWa3E2tib3NFIw==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "14.3.0", + "@vueuse/shared": "14.3.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@vueuse/metadata": { + "version": "14.3.0", + "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-14.3.0.tgz", + "integrity": "sha512-BwxmbAzwAVF50+MW57GXOUEV61nFBGnlBvrTqj49PqWJu3uw7hdu72ztXeZ33RdZtDY6kO+bfCAE1PCn88Tktw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "14.3.0", + "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-14.3.0.tgz", + "integrity": "sha512-bZpge9eSXwa4ToSiqJ7j6KRwhAsneMFoSz3LMWKQDkqimm3D/tbFlrklrs/IOqC8tEcYmXQZJ6N0UrjhBirVCg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@ztools-center/ztools-api-types": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@ztools-center/ztools-api-types/-/ztools-api-types-1.0.3.tgz", + "integrity": "sha512-dv1eOAIasAupqKaQL/gESk1i2+RebdM/1gvZhrvH2D/bo3enCUsAGJ8nrHnlCLBSOGB81eC/SU0IH8BNsUlmvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/alien-signals": { + "version": "1.0.13", + "resolved": "https://registry.npmmirror.com/alien-signals/-/alien-signals-1.0.13.tgz", + "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.23", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.23.tgz", + "integrity": "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/element-plus": { + "version": "2.14.4", + "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.14.4.tgz", + "integrity": "sha512-vMKR9tFcLeNrJgFXA3zhUn6YuRKUQW9d0btakBR8U1Iq8MfzkjMOGcgs5de2VgiLldHt69brmuBHpxc3bK4ZgQ==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^4.2.0", + "@element-plus/icons-vue": "^2.3.2", + "@floating-ui/dom": "^1.8.0", + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.8", + "@types/lodash": "^4.17.24", + "@types/lodash-es": "^4.17.12", + "@vueuse/core": "14.3.0", + "async-validator": "^4.2.5", + "dayjs": "^1.11.20", + "lodash": "^4.18.1", + "lodash-es": "^4.18.1", + "lodash-unified": "^1.0.3", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.2.0", + "vue-component-type-helpers": "^3.3.9" + }, + "peerDependencies": { + "vue": "^3.3.7" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/exsolve": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.1.1.tgz", + "integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/js-tokens": { + "version": "10.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/local-pkg": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-1.2.1.tgz", + "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "license": "MIT" + }, + "node_modules/lodash-unified": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz", + "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "license": "MIT", + "peerDependencies": { + "@types/lodash-es": "*", + "lodash": "*", + "lodash-es": "*" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mlly": { + "version": "1.8.2", + "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/normalize-wheel-es": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", + "license": "BSD-3-Clause" + }, + "node_modules/obug": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/obug/-/obug-2.1.4.tgz", + "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.3.1.tgz", + "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.4", + "exsolve": "^1.0.8", + "pathe": "^2.0.3" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmmirror.com/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/rollup": { + "version": "4.62.5", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.62.5.tgz", + "integrity": "sha512-/tqMfgP7GPA3PHhCmuiS4vIjrSVhHLgY++i+dhbG462euyAj7FpM4D9uq1X3BgjlqRdpcOrYhcQtfiQLNc8tqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.62.5", + "@rollup/rollup-android-arm64": "4.62.5", + "@rollup/rollup-darwin-arm64": "4.62.5", + "@rollup/rollup-darwin-x64": "4.62.5", + "@rollup/rollup-freebsd-arm64": "4.62.5", + "@rollup/rollup-freebsd-x64": "4.62.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.5", + "@rollup/rollup-linux-arm-musleabihf": "4.62.5", + "@rollup/rollup-linux-arm64-gnu": "4.62.5", + "@rollup/rollup-linux-arm64-musl": "4.62.5", + "@rollup/rollup-linux-loong64-gnu": "4.62.5", + "@rollup/rollup-linux-loong64-musl": "4.62.5", + "@rollup/rollup-linux-ppc64-gnu": "4.62.5", + "@rollup/rollup-linux-ppc64-musl": "4.62.5", + "@rollup/rollup-linux-riscv64-gnu": "4.62.5", + "@rollup/rollup-linux-riscv64-musl": "4.62.5", + "@rollup/rollup-linux-s390x-gnu": "4.62.5", + "@rollup/rollup-linux-x64-gnu": "4.62.5", + "@rollup/rollup-linux-x64-musl": "4.62.5", + "@rollup/rollup-openbsd-x64": "4.62.5", + "@rollup/rollup-openharmony-arm64": "4.62.5", + "@rollup/rollup-win32-arm64-msvc": "4.62.5", + "@rollup/rollup-win32-ia32-msvc": "4.62.5", + "@rollup/rollup-win32-x64-gnu": "4.62.5", + "@rollup/rollup-win32-x64-msvc": "4.62.5", + "fsevents": "~2.3.2" + } + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-literal": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-4.0.0.tgz", + "integrity": "sha512-PaqAvfUZKBwc/SLmNZtHmzK+v19Z4O4eS3cKPeGvbIv/U3pnyEq4Tuw3/4v/FwfM8VQaEawsyCcOQ0P+kpwWWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^10.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.4", + "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/unimport": { + "version": "6.4.0", + "resolved": "https://registry.npmmirror.com/unimport/-/unimport-6.4.0.tgz", + "integrity": "sha512-JJOOuNMFq8b4ZPBKwQUxEcba4MplskDzYI1Lvrf8rJfWphZTWvPNXWa493qsPngHUmub89w6C7j+SeLWTE/UIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.18.0", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "local-pkg": "^1.2.1", + "magic-string": "^1.1.0", + "mlly": "^1.8.2", + "pathe": "^2.0.3", + "picomatch": "^4.0.5", + "pkg-types": "^2.3.1", + "scule": "^1.3.0", + "strip-literal": "^4.0.0", + "tinyglobby": "^0.2.17", + "unplugin": "^3.3.0", + "unplugin-utils": "^0.3.2" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "oxc-parser": "*", + "rolldown": "^1.0.0" + }, + "peerDependenciesMeta": { + "oxc-parser": { + "optional": true + }, + "rolldown": { + "optional": true + } + } + }, + "node_modules/unimport/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/unimport/node_modules/magic-string": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-1.2.2.tgz", + "integrity": "sha512-veT/+7iXrXzT39XnEN4lOxtNl72dMgJ8Lp+5Bd6YcMSWpb0n0MjBM8Uuooi6jgJr8dhUW2swQgBmoZVMni5SVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/unplugin": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-3.3.0.tgz", + "integrity": "sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "picomatch": "^4.0.4", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@farmfe/core": "*", + "@rspack/core": "*", + "bun-types-no-globals": "*", + "esbuild": "*", + "rolldown": "*", + "rollup": "*", + "unloader": "*", + "vite": "*", + "webpack": "*" + }, + "peerDependenciesMeta": { + "@farmfe/core": { + "optional": true + }, + "@rspack/core": { + "optional": true + }, + "bun-types-no-globals": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "rolldown": { + "optional": true + }, + "rollup": { + "optional": true + }, + "unloader": { + "optional": true + }, + "vite": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/unplugin-auto-import": { + "version": "21.1.0", + "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-21.1.0.tgz", + "integrity": "sha512-EzrSqWIBulEqCuP7idADXH+tVKYrbwKlR5+r/lOWik0o+Ksny1kitmtryHGNSv7puzzORlcIwT/x2JStiszlHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "local-pkg": "^1.2.1", + "magic-string": "^1.1.0", + "picomatch": "^4.0.5", + "unimport": "^6.4.0", + "unplugin": "^3.3.0", + "unplugin-utils": "^0.3.2" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@nuxt/kit": "^4.0.0", + "@vueuse/core": "*" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@vueuse/core": { + "optional": true + } + } + }, + "node_modules/unplugin-auto-import/node_modules/magic-string": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-1.2.2.tgz", + "integrity": "sha512-veT/+7iXrXzT39XnEN4lOxtNl72dMgJ8Lp+5Bd6YcMSWpb0n0MjBM8Uuooi6jgJr8dhUW2swQgBmoZVMni5SVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/unplugin-utils": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/unplugin-utils/-/unplugin-utils-0.3.2.tgz", + "integrity": "sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/unplugin-vue-components": { + "version": "32.1.0", + "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-32.1.0.tgz", + "integrity": "sha512-YiUkSxuRjab18XFOrX5VsIxXzccrfmHVGsGeJgSgklb829DQmCy9E4vvDUE4tuvZZdxyFJZX0Oc4TPnnxiiMyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^5.0.0", + "local-pkg": "^1.2.0", + "magic-string": "^0.30.21", + "mlly": "^1.8.2", + "obug": "^2.1.1", + "picomatch": "^4.0.4", + "tinyglobby": "^0.2.16", + "unplugin": "^3.0.0", + "unplugin-utils": "^0.3.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@nuxt/kit": "^3.2.2 || ^4.0.0", + "vue": "^3.0.0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/vite": { + "version": "6.4.3", + "resolved": "https://registry.npmmirror.com/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.41", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.41.tgz", + "integrity": "sha512-2laE0p+aK+/AOPG/XL/WepOs/GlK755LJ1XECi9kDUrz1FKNw8rb2Xzlw9JS1rqEV55nb0ttsKxVlTCcd+R5cg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.41", + "@vue/compiler-sfc": "3.5.41", + "@vue/runtime-dom": "3.5.41", + "@vue/server-renderer": "3.5.41", + "@vue/shared": "3.5.41" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-component-type-helpers": { + "version": "3.3.10", + "resolved": "https://registry.npmmirror.com/vue-component-type-helpers/-/vue-component-type-helpers-3.3.10.tgz", + "integrity": "sha512-t7IQivQ3oD4D01b7s7a9AWzHAcr3DGBIa/1jZREsFQJcFgSL92gqUkqNiHTYgzTt7QDuJa0I9wCeDwEtZICoBQ==", + "license": "MIT" + }, + "node_modules/vue-tsc": { + "version": "2.2.12", + "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-2.2.12.tgz", + "integrity": "sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.15", + "@vue/language-core": "2.2.12" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/plugins/datatimeutc/package.json b/plugins/datatimeutc/package.json new file mode 100755 index 000000000..87be6d312 --- /dev/null +++ b/plugins/datatimeutc/package.json @@ -0,0 +1,24 @@ +{ + "name": "datatimeutc", + "version": "1.0.0", + "description": "", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc && vite build" + }, + "dependencies": { + "@element-plus/icons-vue": "^2.3.2", + "element-plus": "^2.14.4", + "vue": "^3.5.13" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.2.1", + "@ztools-center/ztools-api-types": "^1.0.1", + "typescript": "^5.3.0", + "unplugin-auto-import": "^21.1.0", + "unplugin-vue-components": "^32.1.0", + "vite": "^6.0.11", + "vue-tsc": "^2.0.0" + } +} diff --git a/plugins/datatimeutc/plugin.json b/plugins/datatimeutc/plugin.json new file mode 100755 index 000000000..d692d82eb --- /dev/null +++ b/plugins/datatimeutc/plugin.json @@ -0,0 +1,42 @@ +{ + "$schema": "node_modules/@ztools-center/ztools-api-types/resource/ztools.schema.json", + "name": "datatimeutc", + "title": "UTC时间悬浮", + "description": "实时显示 UTC 时间,支持多时区切换、自定义日期时间格式,悬浮小窗", + "author": "paff", + "version": "1.0.2", + "main": "dist/index.html", + "logo": "logo.png", + "preload": "preload.js", + "unpack": "{vue-vite/**,react-vite/**}", + "development": { + "main": "http://localhost:8686/" + }, + "features": [ + { + "code": "ui.router", + "explain": "ZTools 开发者工具", + "cmds": ["开发者工具"] + }, + { + "code": "function.reload-all-plugin", + "explain": "重载所有开发中插件", + "icon": "logo.png", + "cmds": ["重载开发中插件"] + }, + { + "code": "function.add-dev-plugin", + "explain": "添加开发中插件", + "icon": "logo.png", + "cmds": [ + { + "type": "files", + "label": "添加开发中插件", + "fileType": "file", + "match": "/plugin\\.json$/i", + "maxLength": 1 + } + ] + } + ] +} diff --git a/plugins/datatimeutc/preload.js b/plugins/datatimeutc/preload.js new file mode 100755 index 000000000..b9e8f165e --- /dev/null +++ b/plugins/datatimeutc/preload.js @@ -0,0 +1,125 @@ +'use strict' + +/* eslint-disable @typescript-eslint/no-require-imports -- Electron 插件 preload 由 CommonJS 运行时加载。 */ + +const { ipcRenderer } = require('electron') +const fs = require('node:fs') +const path = require('node:path') + +const PROJECT_TEMPLATES = new Set(['vue-vite', 'react-vite']) +const PROJECT_NAME_PATTERN = /^[a-z0-9-]+$/ + +/** + * 将捕获的异常转换为界面可展示的错误文本。 + * @param {unknown} error 捕获的异常值 + * @returns {string} 可展示的错误文本 + */ +function formatError(error) { + return error instanceof Error ? error.message : '创建项目失败' +} + +/** + * 定位开发目录或市场 ASAR 配套目录中的物理模板路径。 + * @param {'vue-vite'|'react-vite'} template 模板名称 + * @returns {string|null} 模板物理路径,不存在时返回 null + */ +function resolveTemplateDir(template) { + const candidates = [path.join(`${__dirname}.unpacked`, template), path.join(__dirname, template)] + + // 优先读取市场安装时生成的物理目录,开发态再读取源码目录。 + return candidates.find((candidate) => fs.existsSync(candidate)) || null +} + +/** + * 用表单元数据替换模板内的插件配置占位符。 + * @param {string} projectDir 已复制完成的新项目目录 + * @param {{name:string,title:string,description?:string,platform?:string[],author?:string}} params 插件元数据 + * @returns {Promise} 更新后的 plugin.json 绝对路径 + */ +async function updateProjectMetadata(projectDir, params) { + const pluginJsonPath = path.join(projectDir, 'src-ztools', 'plugin.json') + const packageJsonPath = path.join(projectDir, 'package.json') + + // 先写入插件展示信息,再注入平台字段以保持合法 JSON。 + let pluginJson = await fs.promises.readFile(pluginJsonPath, 'utf-8') + pluginJson = pluginJson + .replace(/\{\{PLUGIN_NAME\}\}/g, params.name) + .replace(/\{\{PLUGIN_TITLE\}\}/g, params.title) + .replace(/\{\{DESCRIPTION\}\}/g, params.description || '') + .replace(/\{\{AUTHOR\}\}/g, params.author || '') + if (Array.isArray(params.platform) && params.platform.length > 0) { + const parsedPlugin = JSON.parse(pluginJson) + parsedPlugin.platform = params.platform + pluginJson = JSON.stringify(parsedPlugin, null, 2) + } + await fs.promises.writeFile(pluginJsonPath, pluginJson, 'utf-8') + + // package.json 只替换项目标识与描述占位符。 + let packageJson = await fs.promises.readFile(packageJsonPath, 'utf-8') + packageJson = packageJson + .replace(/\{\{PROJECT_NAME\}\}/g, params.name) + .replace(/\{\{DESCRIPTION\}\}/g, params.description || '') + await fs.promises.writeFile(packageJsonPath, packageJson, 'utf-8') + + return pluginJsonPath +} + +/** + * 从插件自带模板创建并导入一个开发项目。 + * @param {{template:'vue-vite'|'react-vite',projectPath:string,name:string,title:string,description?:string,platform?:string[],author?:string}} params 创建项目所需参数 + * @returns {Promise<{success:boolean,pluginName?:string,error?:string}>} 创建及导入结果 + */ +async function scaffoldDevProject(params) { + let projectDir = '' + let projectCreated = false + + try { + // 在接触目标文件系统前阻止未知模板及越界项目名。 + if (!PROJECT_TEMPLATES.has(params?.template)) { + throw new Error(`不支持的项目模板: ${params?.template || ''}`) + } + if (!PROJECT_NAME_PATTERN.test(params?.name || '')) { + throw new Error('应用 ID 仅允许小写字母、数字和中划线') + } + if (!params?.projectPath || !params?.title) { + throw new Error('项目位置和插件标题不能为空') + } + + const templateDir = resolveTemplateDir(params.template) + if (!templateDir) { + throw new Error(`模板 "${params.template}" 不存在`) + } + + projectDir = path.join(params.projectPath, params.name) + try { + await fs.promises.access(projectDir) + throw new Error(`目录 "${projectDir}" 已存在`) + } catch (error) { + if (error instanceof Error && !('code' in error)) throw error + if (error?.code !== 'ENOENT') throw error + } + + // 只向确认不存在的目标目录复制,避免覆盖用户已有工程。 + await fs.promises.cp(templateDir, projectDir, { recursive: true, errorOnExist: true }) + projectCreated = true + const pluginJsonPath = await updateProjectMetadata(projectDir, params) + + // 复用宿主现有登记能力,保持开发项目注册表行为一致。 + const result = await ipcRenderer.invoke( + 'internal:upsert-dev-project-by-config-path', + pluginJsonPath + ) + if (!result?.success) { + throw new Error(result?.error || '导入创建的项目失败') + } + return { success: true, pluginName: result.pluginName || params.name } + } catch (error) { + // 创建后的任一步失败都移除半成品;预先存在的目录从未被写入。 + if (projectCreated && projectDir) { + await fs.promises.rm(projectDir, { recursive: true, force: true }) + } + return { success: false, error: formatError(error) } + } +} + +window.ztoolsDeveloperPlugin = Object.freeze({ scaffoldDevProject }) diff --git a/plugins/datatimeutc/src-ztools/logo.png b/plugins/datatimeutc/src-ztools/logo.png new file mode 100755 index 0000000000000000000000000000000000000000..821fa0fb7ed9711052f4a70e956777c4338e61eb GIT binary patch literal 57425 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 { + try { window.ztools.outPlugin(true) } catch (_e) {} + }) + ipcRenderer.on('ztools-float-resize', (_e, size) => { + try { + if ( + floatWin && typeof floatWin.setBounds === 'function' && + size && Number.isFinite(size.width) && Number.isFinite(size.height) && + size.width > 0 && size.height > 0 + ) { + floatWin.setBounds({ width: Math.round(size.width), height: Math.round(size.height) }) + } + } catch (_e) {} + }) + } +} catch (_e) { + // require electron 失败则忽略 +} + +// ===== 悬浮窗尺寸偏好 ===== +// 透明度/缩放由悬浮窗 UI 写入 dbStorage;主窗口创建悬浮窗时按上次缩放取尺寸 +const FLOAT_PREFS_KEY = 'utc-float-prefs' +const FLOAT_BASE_W = 420 +const FLOAT_BASE_H = 165 + +// 读取悬浮窗缩放偏好(脏数据钳制到 0.7–1.6) +function readFloatScale() { + try { + const prefs = window.ztools.dbStorage.getItem(FLOAT_PREFS_KEY) + if (prefs && typeof prefs.scale === 'number' && isFinite(prefs.scale)) { + return Math.min(1.6, Math.max(0.7, prefs.scale)) + } + } catch (_e) { + // ignore + } + return 1 +} + +// ===== NTP 授时 ===== +// 依次尝试多个 NTP 服务器,主用国家授时中心 cn.ntp.org.cn +const NTP_SERVERS = ['cn.ntp.org.cn', 'pool.ntp.org', 'time.nist.gov'] +const NTP_PORT = 123 +// NTP 时间从 1900-01-01 起算,Unix 从 1970-01-01,差 70 年 = 2208988800 秒 +const NTP_EPOCH_OFFSET_MS = 2208988800 * 1000 + +// 发送 NTP 请求并解析响应,返回 { offset, server, rtt }(毫秒) +// offset = 服务器真实时间 - 本地时间,用于修正本地时钟偏差 +function queryNtp(server, timeout) { + timeout = timeout || 3000 + return new Promise((resolve, reject) => { + let socket + try { + socket = dgram.createSocket('udp4') + } catch (e) { + reject(e) + return + } + // NTP 包:48 字节,首字节 0x1B = LI(0)+Version(3)+Mode(3 client),其余补零 + const packet = Buffer.alloc(48) + packet[0] = 0x1B + const t0 = Date.now() + const cleanup = () => { try { socket.close() } catch (_e) {} } + const timer = setTimeout(() => { cleanup(); reject(new Error('NTP timeout')) }, timeout) + socket.on('error', (err) => { + clearTimeout(timer) + cleanup() + reject(err) + }) + socket.on('message', (msg) => { + clearTimeout(timer) + const t1 = Date.now() + // 传输时间戳:byte 40-43 秒, 44-47 小数部分(NTP 1900 起算) + const seconds = msg.readUInt32BE(40) + const fraction = msg.readUInt32BE(44) + if (seconds === 0) { + cleanup() + reject(new Error('NTP invalid response')) + return + } + const ntpMs = seconds * 1000 + Math.floor(fraction / 4294967296 * 1000) + const serverTime = ntpMs - NTP_EPOCH_OFFSET_MS + const rtt = t1 - t0 + // 估算真实时间 = 服务器发送时间 + 单程延迟(rtt/2) + const realTime = serverTime + Math.floor(rtt / 2) + const offset = realTime - t1 + cleanup() + resolve({ offset: offset, server: server, rtt: rtt }) + }) + socket.send(packet, 0, 48, NTP_PORT, server, (err) => { + if (err) { + clearTimeout(timer) + cleanup() + reject(err) + } + }) + }) +} + +window.services = { + // 开启置顶悬浮窗(独立 Electron 窗口) + // 返回 winId;失败返回 null(具体原因已通过 notification 提示) + openFloatWindow() { + const ztools = window.ztools + + // 已存在则聚焦复用 + if (floatWin) { + try { + if (typeof floatWin.focus === 'function') floatWin.focus() + else if (typeof floatWin.show === 'function') floatWin.show() + const id = floatWin.id + return typeof id === 'number' ? id : null + } catch (_e) { + floatWin = null + } + } + // createBrowserWindow 要求 url 必须是 file:// 本地地址(不接受 http://) + // 因此 dev 与生产模式都指向 dist 构建产物 + const htmlPath = path.join(__dirname, '..', 'dist', 'index.html') + if (!fs.existsSync(htmlPath)) { + try { ztools.showNotification && ztools.showNotification('悬浮窗需要构建产物,请先运行 npm run build') } catch (_e) {} + return null + } + const url = 'file://' + htmlPath + '#float' + // 最小 options,不传 webPreferences(main 模式下指定 preload 可能被安全策略拒绝) + // 悬浮窗依赖全局 window.ztools(由客户端注入)+ window.close() 关闭,不依赖 services + // 透明窗口:配合卡片背景 alpha 实现透明度调节;尺寸按上次缩放偏好创建 + const scale = readFloatScale() + const options = { + width: Math.round(FLOAT_BASE_W * scale), + height: Math.round(FLOAT_BASE_H * scale), + frame: false, + resizable: false, + skipTaskbar: true, + transparent: true + } + try { + floatWin = ztools.createBrowserWindow(url, options, function () { + floatWin = null + }) + } catch (e) { + floatWin = null + const msg = e && e.message ? e.message : String(e) + try { ztools.showNotification && ztools.showNotification('悬浮窗创建失败: ' + msg) } catch (_e2) {} + return null + } + if (!floatWin) { + try { ztools.showNotification && ztools.showNotification('悬浮窗创建失败: createBrowserWindow 返回空') } catch (_e2) {} + return null + } + // 创建成功后再设置置顶 + try { + if (typeof floatWin.setAlwaysOnTop === 'function') floatWin.setAlwaysOnTop(true) + } catch (_e) { + // 置顶失败不阻塞 + } + const id = floatWin.id + return typeof id === 'number' ? id : null + }, + + // 关闭主插件持有的悬浮窗 + closeFloatWindow() { + if (!floatWin) return + try { + if (typeof floatWin.close === 'function') floatWin.close() + } catch (_e) { + // 忽略 + } + floatWin = null + }, + + // 悬浮窗自身关闭(在悬浮窗 renderer 进程中调用) + closeSelf() { + try { window.close() } catch (_e) { + try { window.ztools && window.ztools.outPlugin && window.ztools.outPlugin(true) } catch (_e2) {} + } + }, + + // NTP 校时:依次尝试多个服务器,返回 { offset, server, rtt } 或 null + // offset = 服务器真实时间 - 本地时间(毫秒),renderer 用 Date.now()+offset 显示真实时间 + async syncNtpTime() { + for (const server of NTP_SERVERS) { + try { + const result = await queryNtp(server) + return result + } catch (_e) { + // 试下一个服务器 + } + } + return null + } +} diff --git a/plugins/datatimeutc/src/App.vue b/plugins/datatimeutc/src/App.vue new file mode 100755 index 000000000..41ecb1ec9 --- /dev/null +++ b/plugins/datatimeutc/src/App.vue @@ -0,0 +1,29 @@ + + + diff --git a/plugins/datatimeutc/src/Utc/AutoFloat.vue b/plugins/datatimeutc/src/Utc/AutoFloat.vue new file mode 100755 index 000000000..ff1282ce5 --- /dev/null +++ b/plugins/datatimeutc/src/Utc/AutoFloat.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/plugins/datatimeutc/src/Utc/Float.vue b/plugins/datatimeutc/src/Utc/Float.vue new file mode 100755 index 000000000..8b71c5b47 --- /dev/null +++ b/plugins/datatimeutc/src/Utc/Float.vue @@ -0,0 +1,394 @@ + + + + + diff --git a/plugins/datatimeutc/src/Utc/format.ts b/plugins/datatimeutc/src/Utc/format.ts new file mode 100755 index 000000000..b6a5904f8 --- /dev/null +++ b/plugins/datatimeutc/src/Utc/format.ts @@ -0,0 +1,324 @@ +// 时间格式化与时区列表工具 + +export interface FormatOptions { + /** 显示年月日 */ + showDate: boolean + /** 显示星期 */ + showWeekday: boolean + /** 显示时分秒 */ + showTime: boolean + /** 显示毫秒 */ + showMs: boolean + /** 12 小时制 */ + hour12: boolean +} + +export const DEFAULT_FORMAT: FormatOptions = { + showDate: true, + showWeekday: false, + showTime: true, + showMs: true, + hour12: false +} + +// Intl.supportedValuesOf 不可用时的兜底时区列表 +const FALLBACK_TIMEZONES: string[] = [ + 'UTC', + 'Africa/Cairo', + 'America/Argentina/Buenos_Aires', + 'America/Chicago', + 'America/Los_Angeles', + 'America/New_York', + 'America/Sao_Paulo', + 'Asia/Bangkok', + 'Asia/Dubai', + 'Asia/Hong_Kong', + 'Asia/Shanghai', + 'Asia/Singapore', + 'Asia/Tokyo', + 'Australia/Sydney', + 'Europe/Berlin', + 'Europe/London', + 'Europe/Moscow', + 'Europe/Paris', + 'Pacific/Auckland' +] + +/** 获取完整时区列表(Intl.supportedValuesOf 不可用时回退到内置列表) */ +export function getTimezones(): string[] { + try { + const supported = (Intl as any).supportedValuesOf + ? (Intl as any).supportedValuesOf('timeZone') + : null + if (Array.isArray(supported) && supported.length > 0) { + // 确保 UTC 排首位 + const list = supported.filter((tz: string) => tz !== 'UTC') + return ['UTC', ...list] + } + } catch (_e) { + // ignore + } + return FALLBACK_TIMEZONES.slice() +} + +// 常用时区的中文名称(仅用于显示;未收录的时区回退显示 IANA 名称) +const TZ_DISPLAY_NAMES: Record = { + 'UTC': '协调世界时', + 'Africa/Cairo': '埃及标准时间', + 'Africa/Johannesburg': '南非标准时间', + 'Africa/Lagos': '西非时间', + 'Africa/Nairobi': '东非时间', + 'America/Anchorage': '阿拉斯加时间', + 'America/Argentina/Buenos_Aires': '阿根廷时间', + 'America/Chicago': '美国中部时间', + 'America/Denver': '美国山地时间', + 'America/Los_Angeles': '美国太平洋时间', + 'America/Mexico_City': '墨西哥时间', + 'America/New_York': '美国东部时间', + 'America/Phoenix': '亚利桑那时间', + 'America/Sao_Paulo': '巴西时间', + 'America/Toronto': '加拿大多伦多时间', + 'America/Vancouver': '加拿大温哥华时间', + 'Asia/Bangkok': '泰国时间', + 'Asia/Dhaka': '孟加拉时间', + 'Asia/Dubai': '海湾标准时间', + 'Asia/Hong_Kong': '香港时间', + 'Asia/Jakarta': '印尼西部时间', + 'Asia/Karachi': '巴基斯坦时间', + 'Asia/Kolkata': '印度标准时间', + 'Asia/Kuala_Lumpur': '马来西亚时间', + 'Asia/Manila': '菲律宾时间', + 'Asia/Riyadh': '阿拉伯标准时间', + 'Asia/Seoul': '韩国标准时间', + 'Asia/Shanghai': '中国标准时间', + 'Asia/Singapore': '新加坡时间', + 'Asia/Taipei': '台北时间', + 'Asia/Tehran': '伊朗时间', + 'Asia/Tokyo': '日本标准时间', + 'Asia/Urumqi': '乌鲁木齐时间', + 'Asia/Vladivostok': '海参崴时间', + 'Asia/Yekaterinburg': '叶卡捷琳堡时间', + 'Australia/Adelaide': '澳大利亚中部时间', + 'Australia/Brisbane': '澳大利亚东部时间', + 'Australia/Melbourne': '澳大利亚东部时间', + 'Australia/Perth': '澳大利亚西部时间', + 'Australia/Sydney': '澳大利亚东部时间', + 'Europe/Amsterdam': '阿姆斯特丹时间', + 'Europe/Athens': '东欧时间', + 'Europe/Berlin': '中欧时间', + 'Europe/Brussels': '布鲁塞尔时间', + 'Europe/Helsinki': '东欧时间', + 'Europe/Istanbul': '土耳其时间', + 'Europe/Kiev': '东欧时间', + 'Europe/Lisbon': '西欧时间', + 'Europe/London': '格林尼治时间', + 'Europe/Madrid': '中欧时间', + 'Europe/Moscow': '莫斯科时间', + 'Europe/Oslo': '中欧时间', + 'Europe/Paris': '中欧时间', + 'Europe/Prague': '中欧时间', + 'Europe/Rome': '中欧时间', + 'Europe/Stockholm': '中欧时间', + 'Europe/Vienna': '中欧时间', + 'Europe/Warsaw': '中欧时间', + 'Europe/Zurich': '中欧时间', + 'Pacific/Auckland': '新西兰时间', + 'Pacific/Fiji': '斐济时间', + 'Pacific/Honolulu': '夏威夷时间', + // Intl.supportedValuesOf 在部分 ICU 版本返回的旧别名,补充对应中文显示名 + 'Asia/Calcutta': '印度标准时间', + 'Asia/Kathmandu': '尼泊尔时间', + 'Asia/Katmandu': '尼泊尔时间', + 'Asia/Yangon': '缅甸时间', + 'Asia/Rangoon': '缅甸时间', + 'Asia/Kabul': '阿富汗时间', + 'Asia/Magadan': '马加丹时间', + 'America/Nuuk': '格陵兰时间', + 'America/Godthab': '格陵兰时间', + 'America/St_Johns': '纽芬兰时间', + 'America/Miquelon': '圣皮埃尔和密克隆时间', + 'America/Adak': '阿留申群岛时间', + 'Pacific/Midway': '中途岛时间', + 'Pacific/Marquesas': '马克萨斯群岛时间', + 'Pacific/Chatham': '查塔姆群岛时间', + 'Pacific/Apia': '萨摩亚时间', + 'Pacific/Kiritimati': '莱恩群岛时间', + 'Australia/Eucla': '尤克拉时间', + 'Australia/Lord_Howe': '豪勋爵群岛时间' +} + +/** 计算时区在指定时刻相对 UTC 的偏移分钟数(含夏令时),失败返回 null */ +export function getTimezoneOffsetMinutes(tz: string, date = new Date()): number | null { + try { + const dtf = new Intl.DateTimeFormat('en-US', { + timeZone: tz, + hour12: false, + year: 'numeric', month: '2-digit', day: '2-digit', + hour: '2-digit', minute: '2-digit', second: '2-digit' + }) + const parts = dtf.formatToParts(date) + const get = (type: string) => Number(parts.find(p => p.type === type)?.value) + const asUTC = Date.UTC( + get('year'), get('month') - 1, get('day'), + get('hour') % 24, get('minute'), get('second') + ) + return Math.round((asUTC - Math.floor(date.getTime() / 1000) * 1000) / 60000) + } catch (_e) { + return null + } +} + +/** 偏移分钟 → "UTC+8" / "UTC-5:30" / "UTC+5:30" 样式 */ +export function formatOffsetLabel(offsetMinutes: number): string { + const sign = offsetMinutes >= 0 ? '+' : '-' + const abs = Math.abs(offsetMinutes) + const h = Math.floor(abs / 60) + const m = abs % 60 + return `UTC${sign}${h}${m ? ':' + String(m).padStart(2, '0') : ''}` +} + +// 同偏移去重时的代表时区(排名靠前优先;如 UTC+8 保留 Asia/Shanghai 而非台北/新加坡等) +const REPRESENTATIVE_TIMEZONES = [ + 'Asia/Shanghai', + 'Asia/Tokyo', + 'Asia/Kolkata', + 'Asia/Dubai', + 'Asia/Karachi', + 'Asia/Dhaka', + 'Asia/Bangkok', + 'Asia/Tehran', + 'Asia/Kathmandu', + 'Europe/London', + 'Europe/Berlin', + 'Europe/Moscow', + 'Europe/Istanbul', + 'Africa/Cairo', + 'Africa/Lagos', + 'Africa/Johannesburg', + 'Africa/Nairobi', + 'America/New_York', + 'America/Chicago', + 'America/Denver', + 'America/Los_Angeles', + 'America/Anchorage', + 'America/Sao_Paulo', + 'America/Argentina/Buenos_Aires', + 'Australia/Sydney', + 'Australia/Melbourne', + 'Australia/Adelaide', + 'Pacific/Honolulu', + 'Pacific/Auckland' +] + +/** 时区在代表列表中的排名(不在列表返回 Infinity,越小越优先) */ +function representativeRank(tz: string): number { + const idx = REPRESENTATIVE_TIMEZONES.indexOf(tz) + return idx === -1 ? Number.POSITIVE_INFINITY : idx +} + +/** 同偏移去重时判断 candidate 是否优先于 current:代表排名靠前 > 有中文显示名 */ +function isPreferred(candidate: string, current: string): boolean { + const cr = representativeRank(candidate) + const cur = representativeRank(current) + if (cr !== cur) return cr < cur + // 均不在代表列表时,有中文显示名的优先;都无则保持先来者 + return !TZ_DISPLAY_NAMES[current] && !!TZ_DISPLAY_NAMES[candidate] +} + +export interface TimezoneOption { + /** IANA 时区名(存储值) */ + value: string + /** 显示名:如 "UTC+8 中国标准时间" */ + label: string + /** 排序权重(偏移分钟) */ + offset: number +} + +/** + * 生成 "UTC±X 中文名" 的时区选项列表 + * 每个 UTC 偏移仅保留一个代表时区(如 UTC+8 只保留中国标准时间),按偏移排序 + */ +export function getTimezoneOptions(date = new Date()): TimezoneOption[] { + const tzs = getTimezones() + // 按偏移去重:offset -> 该偏移的代表选项 + const byOffset = new Map() + for (const tz of tzs) { + if (tz === 'UTC') continue + const off = getTimezoneOffsetMinutes(tz, date) + // 偏移 0 固定由下方 UTC 选项代表 + if (off === null || off === 0) continue + const existing = byOffset.get(off) + if (existing && !isPreferred(tz, existing.value)) continue + byOffset.set(off, { + value: tz, + label: `${formatOffsetLabel(off)} ${TZ_DISPLAY_NAMES[tz] || tz}`, + offset: off + }) + } + // UTC 固定第一,其余按偏移升序 + return [ + { value: 'UTC', label: 'UTC+0 协调世界时', offset: 0 }, + ...[...byOffset.values()].sort((a, b) => a.offset - b.offset) + ] +} + +/** 取某时区的显示名(当前偏移 + 中文名),用于界面展示当前选择 */ +export function getTimezoneLabel(tz: string, date = new Date()): string { + if (tz === 'UTC') return 'UTC+0 协调世界时' + const off = getTimezoneOffsetMinutes(tz, date) + if (off === null) return tz + return `${formatOffsetLabel(off)} ${TZ_DISPLAY_NAMES[tz] || tz}` +} + +/** + * 按勾选组件格式化时间字符串 + * 使用 Intl.DateTimeFormat 支持任意 IANA 时区 + */ +export function formatTime(date: Date, opts: FormatOptions, timeZone: string): string { + const parts: string[] = [] + + // 日期部分 + if (opts.showDate || opts.showWeekday) { + const dateOpts: Intl.DateTimeFormatOptions = { timeZone } + if (opts.showWeekday) dateOpts.weekday = 'long' + if (opts.showDate) { + dateOpts.year = 'numeric' + dateOpts.month = '2-digit' + dateOpts.day = '2-digit' + } + try { + const formatted = new Intl.DateTimeFormat('zh-CN', dateOpts).format(date) + if (formatted) parts.push(formatted) + } catch (_e) { + // 时区非法时退回本地时区 + const fallback = new Intl.DateTimeFormat('zh-CN', { ...dateOpts, timeZone: undefined }).format(date) + if (fallback) parts.push(fallback) + } + } + + // 时间部分 + if (opts.showTime) { + const timeOpts: Intl.DateTimeFormatOptions = { + timeZone, + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: opts.hour12 + } + try { + const formatted = new Intl.DateTimeFormat('zh-CN', timeOpts).format(date) + if (formatted) parts.push(formatted) + } catch (_e) { + const fallback = new Intl.DateTimeFormat('zh-CN', { ...timeOpts, timeZone: undefined }).format(date) + if (fallback) parts.push(fallback) + } + } + + // 毫秒部分(Intl fractionalSecondDigits 仅支持 3 位,这里直接补零拼接) + if (opts.showMs) { + const ms = String(date.getMilliseconds()).padStart(3, '0') + parts.push('.' + ms) + } + + return parts.filter(Boolean).join(' ').trim() +} diff --git a/plugins/datatimeutc/src/Utc/index.vue b/plugins/datatimeutc/src/Utc/index.vue new file mode 100755 index 000000000..23a04f310 --- /dev/null +++ b/plugins/datatimeutc/src/Utc/index.vue @@ -0,0 +1,430 @@ + + + + + diff --git a/plugins/datatimeutc/src/Utc/time.ts b/plugins/datatimeutc/src/Utc/time.ts new file mode 100755 index 000000000..68d24d72c --- /dev/null +++ b/plugins/datatimeutc/src/Utc/time.ts @@ -0,0 +1,113 @@ +// 时间校准模块:NTP 校准 + 真实时间获取 +// 校准前/失败时 offset=0,getNow() 退化为本地系统时间(不阻塞显示) + +const OFFSET_KEY = 'utc-ntp-offset' + +let offset = 0 +let synced = false + +// 从 dbStorage 加载上次校准的 offset(悬浮窗等无 services 的进程用此路径) +function loadOffset() { + try { + const stored = window.ztools.dbStorage.getItem(OFFSET_KEY) + if (typeof stored === 'number' && isFinite(stored)) offset = stored + } catch (_e) { + // ignore + } +} + +/** 获取真实时间戳(毫秒)= 本地 Date.now() + NTP offset */ +export function getNow(): number { + return Date.now() + offset +} + +/** 获取当前 NTP 偏移量(毫秒),offset = 服务器时间 - 本地时间 */ +export function getOffset(): number { + return offset +} + +/** 是否已成功 NTP 校准 */ +export function isSynced(): boolean { + return synced +} + +export interface SyncResult { + ok: boolean + server?: string + offset?: number + rtt?: number +} + +/** + * 启动时调用:从 NTP 服务器校准时间 + * - 主插件窗口(有 services.syncNtpTime):发 NTP 包校准,写 dbStorage + * - 悬浮窗(无 services):跳过校准,读 dbStorage 的 offset + * 失败则保持 offset=0(用本地系统时间),不影响显示 + */ +export async function syncTime(): Promise { + if (!window.services || typeof window.services.syncNtpTime !== 'function') { + loadOffset() + return { ok: false } + } + try { + const result = await window.services.syncNtpTime() + if (result && typeof result.offset === 'number') { + offset = result.offset + synced = true + try { window.ztools.dbStorage.setItem(OFFSET_KEY, offset) } catch (_e) {} + return { ok: true, server: result.server, offset: result.offset, rtt: result.rtt } + } + } catch (_e) { + // ignore + } + loadOffset() + return { ok: false } +} + +// ===== 周期校准调度 ===== +// 打开插件期间持续定时校准;界面可通过 onSyncTick 注册回调实时刷新 UI +type SyncTickCallback = (result: SyncResult) => void +const tickCallbacks = new Set() +let syncTimer: number | undefined +let syncing = false + +/** 注册周期校准回调(每次校准完成触发,无论成败)。返回解绑函数 */ +export function onSyncTick(cb: SyncTickCallback): () => void { + tickCallbacks.add(cb) + return () => tickCallbacks.delete(cb) +} + +async function runSyncTick() { + if (syncing) return + syncing = true + try { + const result = await syncTime() + tickCallbacks.forEach(cb => { + try { cb(result) } catch (_e) { /* 单个回调异常不影响其他 */ } + }) + } finally { + syncing = false + } +} + +/** + * 启动周期校准(主插件窗口调用;悬浮窗无 services 会自动退化为仅读存储) + * @param intervalMs 校准间隔,默认 5 分钟 + */ +export function startPeriodicSync(intervalMs = 5 * 60 * 1000): void { + stopPeriodicSync() + // 立即校准一次 + runSyncTick() + syncTimer = window.setInterval(runSyncTick, intervalMs) +} + +/** 停止周期校准 */ +export function stopPeriodicSync(): void { + if (syncTimer !== undefined) { + window.clearInterval(syncTimer) + syncTimer = undefined + } +} + +// 模块加载时尝试读 dbStorage 的 offset(快速恢复上次校准值) +loadOffset() diff --git a/plugins/datatimeutc/src/auto-imports.d.ts b/plugins/datatimeutc/src/auto-imports.d.ts new file mode 100755 index 000000000..193bc01ef --- /dev/null +++ b/plugins/datatimeutc/src/auto-imports.d.ts @@ -0,0 +1,12 @@ +/* eslint-disable */ +/* prettier-ignore */ +/* oxlint-disable */ +/* oxfmt-ignore */ +// @ts-nocheck +// noinspection JSUnusedGlobalSymbols +// Generated by unplugin-auto-import +// biome-ignore lint: disable +export {} +declare global { + +} diff --git a/plugins/datatimeutc/src/components.d.ts b/plugins/datatimeutc/src/components.d.ts new file mode 100755 index 000000000..fff1e9173 --- /dev/null +++ b/plugins/datatimeutc/src/components.d.ts @@ -0,0 +1,18 @@ +/* eslint-disable */ +// @ts-nocheck +// biome-ignore lint: disable +// oxlint-disable +// ------ +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 + +export {} + +/* prettier-ignore */ +declare module 'vue' { + export interface GlobalComponents { + ElCheckbox: typeof import('element-plus/es')['ElCheckbox'] + ElIcon: typeof import('element-plus/es')['ElIcon'] + ElSelectV2: typeof import('element-plus/es')['ElSelectV2'] + } +} diff --git a/plugins/datatimeutc/src/env.d.ts b/plugins/datatimeutc/src/env.d.ts new file mode 100755 index 000000000..05e71ffc3 --- /dev/null +++ b/plugins/datatimeutc/src/env.d.ts @@ -0,0 +1,31 @@ +/// +/// + +declare module '*.vue' { + import type { DefineComponent } from 'vue' + const component: DefineComponent, Record, unknown> + export default component +} + +// Preload services 类型声明(对应 src-ztools/preload/services.js) +interface NtpSyncResult { + /** 服务器真实时间 - 本地时间(毫秒),用于修正本地时钟偏差 */ + offset: number + server: string + rtt: number +} + +interface Services { + openFloatWindow: () => number | null + closeFloatWindow: () => void + closeSelf: () => void + syncNtpTime: () => Promise +} + +declare global { + interface Window { + services: Services + } +} + +export {} diff --git a/plugins/datatimeutc/src/main.css b/plugins/datatimeutc/src/main.css new file mode 100755 index 000000000..f58ab9781 --- /dev/null +++ b/plugins/datatimeutc/src/main.css @@ -0,0 +1,86 @@ +:root { + --blue: rgb(88, 164, 246); + --light: #fff; +} + +html, +body { + margin: 0; + padding: 0; + overflow: hidden; +} + +/* 主插件视图需要撑满视口高度,配合组件内弹性布局 */ +#app { + height: 100vh; + display: flex; + flex-direction: column; +} + +#app > * { + flex: 1; + min-height: 0; +} + +/* 悬浮窗模式:透明背景,由内部卡片承载视觉 */ +body.float-mode { + background: transparent; +} + +/* 悬浮窗模式下的暗色卡片由组件 scoped 样式负责 */ +body.float-mode::-webkit-scrollbar { + display: none; +} + +button { + border: none; + background: none var(--blue); + color: var(--light); + line-height: 2.5; + cursor: pointer; + transition: opacity 0.2s; +} + +button:disabled { + filter: grayscale(1); + cursor: not-allowed; +} + +button:not(:disabled):active { + opacity: 0.6; +} + +textarea { + display: block; + margin: 0; +} + +@media (prefers-color-scheme: light) { + body { + background-color: #f4f4f4; + } + + ::-webkit-scrollbar-track-piece { + background-color: #f4f4f4; + } + + ::-webkit-scrollbar-thumb { + border-color: #f4f4f4; + } +} + +@media (prefers-color-scheme: dark) { + &::-webkit-scrollbar-track-piece { + background-color: #303133; + } + + &::-webkit-scrollbar-thumb { + background-color: #666; + border-color: #303133; + } + + body { + background-color: #303133; + color: #fff; + } +} diff --git a/plugins/datatimeutc/src/main.ts b/plugins/datatimeutc/src/main.ts new file mode 100755 index 000000000..ec0bd59bf --- /dev/null +++ b/plugins/datatimeutc/src/main.ts @@ -0,0 +1,17 @@ +import { createApp } from 'vue' +import './main.css' +// element-plus 暗色 CSS 变量(组件样式由按需导入自动注入,暗色变量需手动引入) +import 'element-plus/theme-chalk/dark/css-vars.css' +import App from './App.vue' + +const app = createApp(App) +app.mount('#app') + +// 暗色模式适配:element-plus 通过 html.dark 切换暗色 +// 用 matchMedia 监听系统暗色(ztools 通常跟随系统,且无暗色变化事件 API) +const mql = window.matchMedia('(prefers-color-scheme: dark)') +const applyTheme = (dark: boolean) => { + document.documentElement.classList.toggle('dark', dark) +} +applyTheme(mql.matches) +mql.addEventListener('change', (e) => applyTheme(e.matches)) diff --git a/plugins/datatimeutc/tsconfig.json b/plugins/datatimeutc/tsconfig.json new file mode 100755 index 000000000..39b73bc6f --- /dev/null +++ b/plugins/datatimeutc/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "preserve", + "strict": false, + "noImplicitAny": false, + "types": ["@ztools-center/ztools-api-types"] + }, + "include": ["src"] +} diff --git a/plugins/datatimeutc/vite.config.js b/plugins/datatimeutc/vite.config.js new file mode 100755 index 000000000..7b464e5c3 --- /dev/null +++ b/plugins/datatimeutc/vite.config.js @@ -0,0 +1,28 @@ +import { fileURLToPath } from 'node:url' +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import AutoImport from 'unplugin-auto-import/vite' +import Components from 'unplugin-vue-components/vite' +import { ElementPlusResolver } from 'unplugin-vue-components/resolvers' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + // element-plus 按需导入:组件 + 样式 + 自动 API(ElMessage 等) + // dts 放 src 下,tsconfig include:["src"] 即可识别 + AutoImport({ + resolvers: [ElementPlusResolver()], + dts: 'src/auto-imports.d.ts' + }), + Components({ + resolvers: [ElementPlusResolver()], + dts: 'src/components.d.ts' + }) + ], + base: './', + build: { + outDir: fileURLToPath(new URL('./src-ztools/dist', import.meta.url)), + emptyOutDir: true + } +}) From 9b34178296934803a5048dd37e05874325056d02 Mon Sep 17 00:00:00 2001 From: paff Date: Sun, 23 Aug 2026 17:00:37 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/datatimeutc/.gitignore | 7 ++++--- plugins/datatimeutc/src-ztools/plugin.json | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/plugins/datatimeutc/.gitignore b/plugins/datatimeutc/.gitignore index 8b0c7587a..c3291f4b5 100755 --- a/plugins/datatimeutc/.gitignore +++ b/plugins/datatimeutc/.gitignore @@ -1,3 +1,4 @@ -node_modules/ -AGENTS.md -ztools-dev-reference.md \ No newline at end of file +node_modules/ +AGENTS.md +ztools-dev-reference.md +*.zpx \ No newline at end of file diff --git a/plugins/datatimeutc/src-ztools/plugin.json b/plugins/datatimeutc/src-ztools/plugin.json index e092bd387..4565003c6 100755 --- a/plugins/datatimeutc/src-ztools/plugin.json +++ b/plugins/datatimeutc/src-ztools/plugin.json @@ -4,7 +4,7 @@ "title": "UTC 标准时间", "description": "实时显示 UTC 时间,支持多时区切换、自定义日期时间格式,悬浮小窗", "author": "lvy", - "version": "1.0", + "version": "1.0.2", "main": "dist/index.html", "preload": "preload/services.js", "logo": "logo.png", From 4233d83596e66cb70135e82539ef681227466600 Mon Sep 17 00:00:00 2001 From: paff Date: Mon, 24 Aug 2026 17:27:44 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E5=87=8F=E5=B0=91?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E5=BA=93=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/datatimeutc/package-lock.json | 656 ---------------------- plugins/datatimeutc/package.json | 4 - plugins/datatimeutc/src/Utc/index.vue | 123 +++- plugins/datatimeutc/src/auto-imports.d.ts | 12 - plugins/datatimeutc/src/components.d.ts | 18 - plugins/datatimeutc/src/main.ts | 5 +- plugins/datatimeutc/vite.config.js | 17 +- 7 files changed, 105 insertions(+), 730 deletions(-) delete mode 100755 plugins/datatimeutc/src/auto-imports.d.ts delete mode 100755 plugins/datatimeutc/src/components.d.ts diff --git a/plugins/datatimeutc/package-lock.json b/plugins/datatimeutc/package-lock.json index 98dba310c..94c40521d 100755 --- a/plugins/datatimeutc/package-lock.json +++ b/plugins/datatimeutc/package-lock.json @@ -8,16 +8,12 @@ "name": "datatimeutc", "version": "1.0.0", "dependencies": { - "@element-plus/icons-vue": "^2.3.2", - "element-plus": "^2.14.4", "vue": "^3.5.13" }, "devDependencies": { "@vitejs/plugin-vue": "^5.2.1", "@ztools-center/ztools-api-types": "^1.0.1", "typescript": "^5.3.0", - "unplugin-auto-import": "^21.1.0", - "unplugin-vue-components": "^32.1.0", "vite": "^6.0.11", "vue-tsc": "^2.0.0" } @@ -68,24 +64,6 @@ "node": ">=6.9.0" } }, - "node_modules/@ctrl/tinycolor": { - "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz", - "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/@element-plus/icons-vue": { - "version": "2.3.2", - "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz", - "integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==", - "license": "MIT", - "peerDependencies": { - "vue": "^3.2.0" - } - }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.12", "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", @@ -528,80 +506,12 @@ "node": ">=18" } }, - "node_modules/@floating-ui/core": { - "version": "1.8.0", - "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.8.0.tgz", - "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.12" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.8.0", - "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.8.0.tgz", - "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.8.0", - "@floating-ui/utils": "^0.2.12" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.12", - "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.12.tgz", - "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", - "license": "MIT" - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@napi-rs/lzma-linux-x64-gnu": { "version": "1.5.1", "resolved": "https://registry.npmmirror.com/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", @@ -622,17 +532,6 @@ "node": "^22.20 || ^24.12 || >=25" } }, - "node_modules/@popperjs/core": { - "name": "@sxzz/popperjs-es", - "version": "2.11.8", - "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.8.tgz", - "integrity": "sha512-wOwESXvvED3S8xBmcPWHs2dUuzrE4XiZeFu7e1hROIJkm02a49N120pmOXxY33sBb6hArItm5W5tcg1cBtV+HQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.62.5", "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.5.tgz", @@ -1029,27 +928,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/lodash": { - "version": "4.17.25", - "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.25.tgz", - "integrity": "sha512-+K1NIO8I+F9/wNulfVvu23QYd0Pe9/OCqRrim4NoYIf1VoEDL90Ve4ClzpyqBLc7NpGGWRvYNCKZ1BE/Jpf8dQ==", - "license": "MIT" - }, - "node_modules/@types/lodash-es": { - "version": "4.17.12", - "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz", - "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", - "license": "MIT", - "dependencies": { - "@types/lodash": "*" - } - }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.21", - "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", - "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", - "license": "MIT" - }, "node_modules/@vitejs/plugin-vue": { "version": "5.2.4", "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", @@ -1227,44 +1105,6 @@ "integrity": "sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==", "license": "MIT" }, - "node_modules/@vueuse/core": { - "version": "14.3.0", - "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-14.3.0.tgz", - "integrity": "sha512-aHfz47g0ZhMtTVHmIzMVpJy8ePhhOy68GY5bv110+5DVtZ+W7BsOx+m61UNQqfrWyPztIHIanWa3E2tib3NFIw==", - "license": "MIT", - "dependencies": { - "@types/web-bluetooth": "^0.0.21", - "@vueuse/metadata": "14.3.0", - "@vueuse/shared": "14.3.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vue": "^3.5.0" - } - }, - "node_modules/@vueuse/metadata": { - "version": "14.3.0", - "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-14.3.0.tgz", - "integrity": "sha512-BwxmbAzwAVF50+MW57GXOUEV61nFBGnlBvrTqj49PqWJu3uw7hdu72ztXeZ33RdZtDY6kO+bfCAE1PCn88Tktw==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared": { - "version": "14.3.0", - "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-14.3.0.tgz", - "integrity": "sha512-bZpge9eSXwa4ToSiqJ7j6KRwhAsneMFoSz3LMWKQDkqimm3D/tbFlrklrs/IOqC8tEcYmXQZJ6N0UrjhBirVCg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vue": "^3.5.0" - } - }, "node_modules/@ztools-center/ztools-api-types": { "version": "1.0.3", "resolved": "https://registry.npmmirror.com/@ztools-center/ztools-api-types/-/ztools-api-types-1.0.3.tgz", @@ -1272,19 +1112,6 @@ "dev": true, "license": "MIT" }, - "node_modules/acorn": { - "version": "8.18.0", - "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.18.0.tgz", - "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/alien-signals": { "version": "1.0.13", "resolved": "https://registry.npmmirror.com/alien-signals/-/alien-signals-1.0.13.tgz", @@ -1292,12 +1119,6 @@ "dev": true, "license": "MIT" }, - "node_modules/async-validator": { - "version": "4.2.5", - "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz", - "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", - "license": "MIT" - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1315,41 +1136,12 @@ "balanced-match": "^1.0.0" } }, - "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/confbox": { - "version": "0.2.4", - "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.4.tgz", - "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", - "dev": true, - "license": "MIT" - }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, - "node_modules/dayjs": { - "version": "1.11.23", - "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.23.tgz", - "integrity": "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==", - "license": "MIT" - }, "node_modules/de-indent": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz", @@ -1357,32 +1149,6 @@ "dev": true, "license": "MIT" }, - "node_modules/element-plus": { - "version": "2.14.4", - "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.14.4.tgz", - "integrity": "sha512-vMKR9tFcLeNrJgFXA3zhUn6YuRKUQW9d0btakBR8U1Iq8MfzkjMOGcgs5de2VgiLldHt69brmuBHpxc3bK4ZgQ==", - "license": "MIT", - "dependencies": { - "@ctrl/tinycolor": "^4.2.0", - "@element-plus/icons-vue": "^2.3.2", - "@floating-ui/dom": "^1.8.0", - "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.8", - "@types/lodash": "^4.17.24", - "@types/lodash-es": "^4.17.12", - "@vueuse/core": "14.3.0", - "async-validator": "^4.2.5", - "dayjs": "^1.11.20", - "lodash": "^4.18.1", - "lodash-es": "^4.18.1", - "lodash-unified": "^1.0.3", - "memoize-one": "^6.0.0", - "normalize-wheel-es": "^1.2.0", - "vue-component-type-helpers": "^3.3.9" - }, - "peerDependencies": { - "vue": "^3.3.7" - } - }, "node_modules/entities": { "version": "7.0.1", "resolved": "https://registry.npmmirror.com/entities/-/entities-7.0.1.tgz", @@ -1437,32 +1203,12 @@ "@esbuild/win32-x64": "0.25.12" } }, - "node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "license": "MIT" }, - "node_modules/exsolve": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.1.1.tgz", - "integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==", - "dev": true, - "license": "MIT" - }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", @@ -1506,54 +1252,6 @@ "he": "bin/he" } }, - "node_modules/js-tokens": { - "version": "10.0.0", - "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/local-pkg": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-1.2.1.tgz", - "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "mlly": "^1.7.4", - "pkg-types": "^2.3.0", - "quansync": "^0.2.11" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.18.1", - "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.18.1.tgz", - "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", - "license": "MIT" - }, - "node_modules/lodash-unified": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz", - "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", - "license": "MIT", - "peerDependencies": { - "@types/lodash-es": "*", - "lodash": "*", - "lodash-es": "*" - } - }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", @@ -1563,12 +1261,6 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", - "license": "MIT" - }, "node_modules/minimatch": { "version": "9.0.9", "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.9.tgz", @@ -1585,38 +1277,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mlly": { - "version": "1.8.2", - "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.8.2.tgz", - "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.16.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.3" - } - }, - "node_modules/mlly/node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/mlly/node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, "node_modules/muggle-string": { "version": "0.4.1", "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.4.1.tgz", @@ -1642,26 +1302,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/normalize-wheel-es": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", - "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", - "license": "BSD-3-Clause" - }, - "node_modules/obug": { - "version": "2.1.4", - "resolved": "https://registry.npmmirror.com/obug/-/obug-2.1.4.tgz", - "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" - ], - "license": "MIT", - "engines": { - "node": ">=12.20.0" - } - }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz", @@ -1669,13 +1309,6 @@ "dev": true, "license": "MIT" }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", @@ -1695,18 +1328,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pkg-types": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.3.1.tgz", - "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.2.4", - "exsolve": "^1.0.8", - "pathe": "^2.0.3" - } - }, "node_modules/postcss": { "version": "8.5.26", "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.26.tgz", @@ -1735,37 +1356,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/quansync": { - "version": "0.2.11", - "resolved": "https://registry.npmmirror.com/quansync/-/quansync-0.2.11.tgz", - "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/antfu" - }, - { - "type": "individual", - "url": "https://github.com/sponsors/sxzz" - } - ], - "license": "MIT" - }, - "node_modules/readdirp": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-5.1.1.tgz", - "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/rollup": { "version": "4.62.5", "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.62.5.tgz", @@ -1812,13 +1402,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/scule": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz", - "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", - "dev": true, - "license": "MIT" - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", @@ -1828,19 +1411,6 @@ "node": ">=0.10.0" } }, - "node_modules/strip-literal": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-4.0.0.tgz", - "integrity": "sha512-PaqAvfUZKBwc/SLmNZtHmzK+v19Z4O4eS3cKPeGvbIv/U3pnyEq4Tuw3/4v/FwfM8VQaEawsyCcOQ0P+kpwWWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^10.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/tinyglobby": { "version": "0.2.17", "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.17.tgz", @@ -1872,219 +1442,6 @@ "node": ">=14.17" } }, - "node_modules/ufo": { - "version": "1.6.4", - "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.6.4.tgz", - "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", - "dev": true, - "license": "MIT" - }, - "node_modules/unimport": { - "version": "6.4.0", - "resolved": "https://registry.npmmirror.com/unimport/-/unimport-6.4.0.tgz", - "integrity": "sha512-JJOOuNMFq8b4ZPBKwQUxEcba4MplskDzYI1Lvrf8rJfWphZTWvPNXWa493qsPngHUmub89w6C7j+SeLWTE/UIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.18.0", - "escape-string-regexp": "^5.0.0", - "estree-walker": "^3.0.3", - "local-pkg": "^1.2.1", - "magic-string": "^1.1.0", - "mlly": "^1.8.2", - "pathe": "^2.0.3", - "picomatch": "^4.0.5", - "pkg-types": "^2.3.1", - "scule": "^1.3.0", - "strip-literal": "^4.0.0", - "tinyglobby": "^0.2.17", - "unplugin": "^3.3.0", - "unplugin-utils": "^0.3.2" - }, - "engines": { - "node": ">=18.12.0" - }, - "peerDependencies": { - "oxc-parser": "*", - "rolldown": "^1.0.0" - }, - "peerDependenciesMeta": { - "oxc-parser": { - "optional": true - }, - "rolldown": { - "optional": true - } - } - }, - "node_modules/unimport/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/unimport/node_modules/magic-string": { - "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-1.2.2.tgz", - "integrity": "sha512-veT/+7iXrXzT39XnEN4lOxtNl72dMgJ8Lp+5Bd6YcMSWpb0n0MjBM8Uuooi6jgJr8dhUW2swQgBmoZVMni5SVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/unplugin": { - "version": "3.3.0", - "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-3.3.0.tgz", - "integrity": "sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.5", - "picomatch": "^4.0.4", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "@farmfe/core": "*", - "@rspack/core": "*", - "bun-types-no-globals": "*", - "esbuild": "*", - "rolldown": "*", - "rollup": "*", - "unloader": "*", - "vite": "*", - "webpack": "*" - }, - "peerDependenciesMeta": { - "@farmfe/core": { - "optional": true - }, - "@rspack/core": { - "optional": true - }, - "bun-types-no-globals": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "rolldown": { - "optional": true - }, - "rollup": { - "optional": true - }, - "unloader": { - "optional": true - }, - "vite": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/unplugin-auto-import": { - "version": "21.1.0", - "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-21.1.0.tgz", - "integrity": "sha512-EzrSqWIBulEqCuP7idADXH+tVKYrbwKlR5+r/lOWik0o+Ksny1kitmtryHGNSv7puzzORlcIwT/x2JStiszlHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "local-pkg": "^1.2.1", - "magic-string": "^1.1.0", - "picomatch": "^4.0.5", - "unimport": "^6.4.0", - "unplugin": "^3.3.0", - "unplugin-utils": "^0.3.2" - }, - "engines": { - "node": ">=20.19.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@nuxt/kit": "^4.0.0", - "@vueuse/core": "*" - }, - "peerDependenciesMeta": { - "@nuxt/kit": { - "optional": true - }, - "@vueuse/core": { - "optional": true - } - } - }, - "node_modules/unplugin-auto-import/node_modules/magic-string": { - "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-1.2.2.tgz", - "integrity": "sha512-veT/+7iXrXzT39XnEN4lOxtNl72dMgJ8Lp+5Bd6YcMSWpb0n0MjBM8Uuooi6jgJr8dhUW2swQgBmoZVMni5SVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/unplugin-utils": { - "version": "0.3.2", - "resolved": "https://registry.npmmirror.com/unplugin-utils/-/unplugin-utils-0.3.2.tgz", - "integrity": "sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pathe": "^2.0.3", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=20.19.0" - }, - "funding": { - "url": "https://github.com/sponsors/sxzz" - } - }, - "node_modules/unplugin-vue-components": { - "version": "32.1.0", - "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-32.1.0.tgz", - "integrity": "sha512-YiUkSxuRjab18XFOrX5VsIxXzccrfmHVGsGeJgSgklb829DQmCy9E4vvDUE4tuvZZdxyFJZX0Oc4TPnnxiiMyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^5.0.0", - "local-pkg": "^1.2.0", - "magic-string": "^0.30.21", - "mlly": "^1.8.2", - "obug": "^2.1.1", - "picomatch": "^4.0.4", - "tinyglobby": "^0.2.16", - "unplugin": "^3.0.0", - "unplugin-utils": "^0.3.1" - }, - "engines": { - "node": ">=20.19.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@nuxt/kit": "^3.2.2 || ^4.0.0", - "vue": "^3.0.0" - }, - "peerDependenciesMeta": { - "@nuxt/kit": { - "optional": true - } - } - }, "node_modules/vite": { "version": "6.4.3", "resolved": "https://registry.npmmirror.com/vite/-/vite-6.4.3.tgz", @@ -2188,12 +1545,6 @@ } } }, - "node_modules/vue-component-type-helpers": { - "version": "3.3.10", - "resolved": "https://registry.npmmirror.com/vue-component-type-helpers/-/vue-component-type-helpers-3.3.10.tgz", - "integrity": "sha512-t7IQivQ3oD4D01b7s7a9AWzHAcr3DGBIa/1jZREsFQJcFgSL92gqUkqNiHTYgzTt7QDuJa0I9wCeDwEtZICoBQ==", - "license": "MIT" - }, "node_modules/vue-tsc": { "version": "2.2.12", "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-2.2.12.tgz", @@ -2210,13 +1561,6 @@ "peerDependencies": { "typescript": ">=5.0.0" } - }, - "node_modules/webpack-virtual-modules": { - "version": "0.6.2", - "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", - "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", - "dev": true, - "license": "MIT" } } } diff --git a/plugins/datatimeutc/package.json b/plugins/datatimeutc/package.json index 87be6d312..2538c74fb 100755 --- a/plugins/datatimeutc/package.json +++ b/plugins/datatimeutc/package.json @@ -8,16 +8,12 @@ "build": "vue-tsc && vite build" }, "dependencies": { - "@element-plus/icons-vue": "^2.3.2", - "element-plus": "^2.14.4", "vue": "^3.5.13" }, "devDependencies": { "@vitejs/plugin-vue": "^5.2.1", "@ztools-center/ztools-api-types": "^1.0.1", "typescript": "^5.3.0", - "unplugin-auto-import": "^21.1.0", - "unplugin-vue-components": "^32.1.0", "vite": "^6.0.11", "vue-tsc": "^2.0.0" } diff --git a/plugins/datatimeutc/src/Utc/index.vue b/plugins/datatimeutc/src/Utc/index.vue index 23a04f310..8fb5af945 100755 --- a/plugins/datatimeutc/src/Utc/index.vue +++ b/plugins/datatimeutc/src/Utc/index.vue @@ -1,6 +1,5 @@ - - -``` - -#### 步骤 2: 注册路由 - -在 `src/App.vue` 中添加路由: - -```vue - -``` - -#### 步骤 3: 配置功能 - -在 `plugin.json` 中添加功能配置: - -```json -{ - "code": "myfeature", - "explain": "我的新功能", - "icon": "logo.png", - "cmds": ["触发指令"] -} -``` - -### 3. 使用 Node.js 能力 - -#### 扩展 Preload 服务 - -编辑 `src-ztools/preload/services.js`: - -```javascript -const fs = require('fs') -const path = require('path') - -module.exports = { - // 示例:读取文件 - readFile: (filePath) => { - return fs.readFileSync(filePath, 'utf-8') - }, - - // 添加你的服务 - myService: (params) => { - // 实现你的逻辑 - return result - } -} -``` - -#### 在 Vue 组件中调用 - -```vue - -``` - -### 4. 使用 ZTools API - -```vue - -``` - -## 🎨 样式开发 - -### 使用 CSS 变量 - -ZTools 提供了一套 CSS 变量用于主题适配: - -```css -.my-component { - background: var(--bg-color); - color: var(--text-color); - border: 1px solid var(--border-color); -} +npm install # 安装依赖 +npm run dev # 开发服务器(端口 5173),ZTools 客户端自动加载 dev 版 +npm run build # 类型检查 + 构建 → 输出到 src-ztools/dist/ ``` -### 暗色模式支持 +## 📁 项目结构 -```css -@media (prefers-color-scheme: dark) { - .my-component { - /* 暗色模式样式 */ - } -} ``` - -## 📦 构建与发布 - -### 1. 构建插件 - -```bash -npm run build +. +├── src/ # Vue 3 前端源码 +│ ├── main.ts # 入口 +│ ├── App.vue # 根组件(三态路由:#float / utc-float / 主界面) +│ ├── env.d.ts # window.services 类型声明 +│ └── Utc/ +│ ├── index.vue # 主界面:大字时钟 + 时区/格式设置 +│ ├── Float.vue # 悬浮窗界面 +│ ├── AutoFloat.vue # 自动开悬浮窗(无 UI) +│ ├── time.ts # NTP offset 单例(getNow / 周期校准) +│ └── format.ts # Intl 时间格式化 + 时区列表/中文名 +├── src-ztools/ # 插件发布单元 +│ ├── plugin.json # 插件清单(实际生效的配置) +│ ├── preload/services.js # Node 能力桥接(NTP 校时、悬浮窗管理) +│ ├── dist/ # 构建产物 +│ └── logo.png +├── index.html +├── vite.config.js # base: './'(file:// 加载必需) +└── package.json ``` -### 2. 测试构建产物 - -将 `src-ztools/` 作为完整 ZTools 插件目录进行测试或打包。 - -### 3. 发布到插件市场 - -1. 确保 `plugin.json` 中的信息完整准确 -2. 准备好插件截图和详细说明 -3. 访问 ZTools 插件市场提交插件 - ## 📚 相关资源 -- [ZTools 官方文档](https://github.com/ztool-center/ztools) -- [ZTools API 文档](https://github.com/ztool-center/ztools-api-types) +- [ZTools 文档](https://ztoolscenter.github.io/ZTools-doc) - [Vue 3 文档](https://vuejs.org/) - [Vite 文档](https://vitejs.dev/) -## ❓ 常见问题 - -### Q: 如何调试插件? - -A: 使用 `npm run dev` 启动开发服务器,在插件界面中点击插件头像图标,在弹出的菜单中选择"打开开发者工具"进行调试。 - -### Q: 如何访问 Node.js 能力? - -A: 通过 `src-ztools/preload/services.js` 文件扩展服务,然后在组件中使用 `window.services` 调用。 - -### Q: 插件图标不显示? - -A: 确保 `src-ztools/logo.png` 文件存在,且在 `plugin.json` 中正确配置了 `logo` 字段。 - -### Q: 如何处理大文件上传? - -A: 建议使用 Node.js 流式处理,在 preload 脚本中实现文件分块处理逻辑。 - ## 📄 开源协议 MIT License - ---- - -**祝你开发愉快!** 🎉 diff --git a/plugins/datatimeutc/package.json b/plugins/datatimeutc/package.json index 2538c74fb..9a6c924d3 100755 --- a/plugins/datatimeutc/package.json +++ b/plugins/datatimeutc/package.json @@ -1,6 +1,6 @@ { "name": "datatimeutc", - "version": "1.0.0", + "version": "1.0.4", "description": "", "type": "module", "scripts": { diff --git a/plugins/datatimeutc/plugin.json b/plugins/datatimeutc/plugin.json index d692d82eb..0307afb4c 100755 --- a/plugins/datatimeutc/plugin.json +++ b/plugins/datatimeutc/plugin.json @@ -4,7 +4,7 @@ "title": "UTC时间悬浮", "description": "实时显示 UTC 时间,支持多时区切换、自定义日期时间格式,悬浮小窗", "author": "paff", - "version": "1.0.2", + "version": "1.0.4", "main": "dist/index.html", "logo": "logo.png", "preload": "preload.js", diff --git a/plugins/datatimeutc/src-ztools/preload/services.js b/plugins/datatimeutc/src-ztools/preload/services.js index 3e6a980fb..3a4fc04d8 100755 --- a/plugins/datatimeutc/src-ztools/preload/services.js +++ b/plugins/datatimeutc/src-ztools/preload/services.js @@ -32,17 +32,17 @@ try { } // ===== 悬浮窗尺寸偏好 ===== -// 透明度/缩放由悬浮窗 UI 写入 dbStorage;主窗口创建悬浮窗时按上次缩放取尺寸 +// 透明度/大小由悬浮窗 UI 写入 dbStorage;主窗口创建悬浮窗时按上次缩放取尺寸 const FLOAT_PREFS_KEY = 'utc-float-prefs' -const FLOAT_BASE_W = 420 -const FLOAT_BASE_H = 165 +const FLOAT_BASE_W = 300 +const FLOAT_BASE_H = 118 -// 读取悬浮窗缩放偏好(脏数据钳制到 0.7–1.6) +// 读取悬浮窗缩放偏好(脏数据钳制到 0.8–1.4) function readFloatScale() { try { const prefs = window.ztools.dbStorage.getItem(FLOAT_PREFS_KEY) if (prefs && typeof prefs.scale === 'number' && isFinite(prefs.scale)) { - return Math.min(1.6, Math.max(0.7, prefs.scale)) + return Math.min(1.4, Math.max(0.8, prefs.scale)) } } catch (_e) { // ignore diff --git a/plugins/datatimeutc/src/Utc/Float.vue b/plugins/datatimeutc/src/Utc/Float.vue index 8b71c5b47..32b927ec1 100755 --- a/plugins/datatimeutc/src/Utc/Float.vue +++ b/plugins/datatimeutc/src/Utc/Float.vue @@ -1,23 +1,23 @@