diff --git a/.gitattributes b/.gitattributes index a6865f03..5813ba45 100644 --- a/.gitattributes +++ b/.gitattributes @@ -25,32 +25,39 @@ # 代码统计设置 - 只统计 Vue、TypeScript 和 Rust 文件 # 排除 JavaScript 文件 -"*.js" linguist-vendored -"*.jsx" linguist-vendored -"*.cjs" linguist-vendored -"*.mjs" linguist-vendored +*.js linguist-vendored +*.jsx linguist-vendored +*.cjs linguist-vendored +*.mjs linguist-vendored # 排除样式文件 -"*.css" linguist-vendored -"*.scss" linguist-vendored -"*.sass" linguist-vendored -"*.less" linguist-vendored -"*.styl" linguist-vendored +*.css linguist-vendored +*.scss linguist-vendored +*.sass linguist-vendored +*.less linguist-vendored +*.styl linguist-vendored # 排除配置和文档文件 -"*.json" linguist-vendored -"*.html" linguist-vendored -"*.md" linguist-documentation -"*.yml" linguist-vendored -"*.yaml" linguist-vendored +*.json linguist-vendored +*.html linguist-vendored +*.md linguist-documentation +*.yml linguist-vendored +*.yaml linguist-vendored # 排除其他语言文件 -"*.kt" linguist-vendored -"*.java" linguist-vendored -"*.py" linguist-vendored +*.kt linguist-vendored +*.java linguist-vendored +*.py linguist-vendored # 确保构建目录和依赖目录不被统计 -"**/target/**" linguist-vendored -"/node_modules/**" linguist-vendored -"/scripts/**" linguist-vendored -"/build/**" linguist-vendored +**/target/** linguist-vendored +**/node_modules/** linguist-vendored +scripts/** linguist-vendored +**/build/** linguist-vendored +**/dist/** linguist-vendored + +# 确保主要代码文件被正确识别 +*.vue linguist-detectable +*.ts linguist-detectable +*.tsx linguist-detectable +*.rs linguist-detectable diff --git a/biome.json b/biome.json index e47f14b9..1453ad17 100644 --- a/biome.json +++ b/biome.json @@ -5,12 +5,12 @@ "ignoreUnknown": false, "includes": [ "**/*.{js,jsx,ts,tsx,vue,json}", - "!.*/**", - "!public/**", + "!.*", + "!public/*", "!src/typings/*.d.ts", - "!src-tauri/**", - "!node_modules/**", - "!dist/**" + "!src-tauri/*", + "!node_modules/*", + "!dist/*" ] }, "formatter": { @@ -58,7 +58,8 @@ "noAssignInExpressions": "off", "noImplicitAnyLet": "off", "noConfusingVoidType": "off", - "noArrayIndexKey": "off" + "noArrayIndexKey": "off", + "useIterableCallbackReturn": "off" } } }, diff --git a/package.json b/package.json index 8ab41593..e41f3aff 100644 --- a/package.json +++ b/package.json @@ -77,6 +77,7 @@ "@tauri-apps/plugin-clipboard-manager": "2.3.0", "@tauri-apps/plugin-dialog": "^2.3.2", "@tauri-apps/plugin-fs": "^2.4.1", + "@tauri-apps/plugin-global-shortcut": "^2.3.0", "@tauri-apps/plugin-http": "2.5.1", "@tauri-apps/plugin-log": "^2.6.0", "@tauri-apps/plugin-notification": "^2.3.0", @@ -113,10 +114,9 @@ "vue-router": "^4.5.1" }, "devDependencies": { - "@biomejs/biome": "^2.1.4", + "@biomejs/biome": "^2.2.0", "@commitlint/cli": "^19.6.0", "@commitlint/config-conventional": "^19.6.0", - "@iconify/vue": "^5.0.0", "@release-it/bumper": "^6.0.1", "@release-it/conventional-changelog": "8.0.2", "@rollup/plugin-terser": "^0.4.4", @@ -147,7 +147,7 @@ "typescript": "^5.9.2", "unplugin-auto-import": "^19.3.0", "unplugin-vue-components": "^28.8.0", - "vite": "7.1.1", + "vite": "7.1.2", "vite-plugin-vue-setup-extend": "^0.4.0", "vitest": "^3.2.4", "vue-tsc": "^3.0.5" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f55a0476..883aa710 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,6 +32,9 @@ importers: '@tauri-apps/plugin-fs': specifier: ^2.4.1 version: 2.4.1 + '@tauri-apps/plugin-global-shortcut': + specifier: ^2.3.0 + version: 2.3.0 '@tauri-apps/plugin-http': specifier: 2.5.1 version: 2.5.1 @@ -136,17 +139,14 @@ importers: version: 4.5.1(vue@3.5.18(typescript@5.9.2)) devDependencies: '@biomejs/biome': - specifier: ^2.1.4 - version: 2.1.4 + specifier: ^2.2.0 + version: 2.2.0 '@commitlint/cli': specifier: ^19.6.0 version: 19.6.1(@types/node@24.0.10)(typescript@5.9.2) '@commitlint/config-conventional': specifier: ^19.6.0 version: 19.6.0 - '@iconify/vue': - specifier: ^5.0.0 - version: 5.0.0(vue@3.5.18(typescript@5.9.2)) '@release-it/bumper': specifier: ^6.0.1 version: 6.0.1(release-it@17.11.0(typescript@5.9.2)) @@ -182,13 +182,13 @@ importers: version: 66.4.2 '@unocss/vite': specifier: ^66.4.2 - version: 66.4.2(vite@7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)) + version: 66.4.2(vite@7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)) '@vitejs/plugin-vue': specifier: ^6.0.1 - version: 6.0.1(vite@7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))(vue@3.5.18(typescript@5.9.2)) + version: 6.0.1(vite@7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))(vue@3.5.18(typescript@5.9.2)) '@vitejs/plugin-vue-jsx': specifier: ^5.0.1 - version: 5.0.1(vite@7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))(vue@3.5.18(typescript@5.9.2)) + version: 5.0.1(vite@7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))(vue@3.5.18(typescript@5.9.2)) '@vitest/coverage-v8': specifier: ^3.2.4 version: 3.2.4(vitest@3.2.4) @@ -238,11 +238,11 @@ importers: specifier: ^28.8.0 version: 28.8.0(@babel/parser@7.28.0)(@nuxt/kit@3.17.5(magicast@0.3.5))(vue@3.5.18(typescript@5.9.2)) vite: - specifier: 7.1.1 - version: 7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1) + specifier: 7.1.2 + version: 7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1) vite-plugin-vue-setup-extend: specifier: ^0.4.0 - version: 0.4.0(vite@7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)) + version: 0.4.0(vite@7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)) vitest: specifier: ^3.2.4 version: 3.2.4(@types/node@24.0.10)(@vitest/ui@3.2.4)(happy-dom@15.11.7)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1) @@ -417,59 +417,59 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@biomejs/biome@2.1.4': - resolution: {integrity: sha512-QWlrqyxsU0FCebuMnkvBIkxvPqH89afiJzjMl+z67ybutse590jgeaFdDurE9XYtzpjRGTI1tlUZPGWmbKsElA==} + '@biomejs/biome@2.2.0': + resolution: {integrity: sha512-3On3RSYLsX+n9KnoSgfoYlckYBoU6VRM22cw1gB4Y0OuUVSYd/O/2saOJMrA4HFfA1Ff0eacOvMN1yAAvHtzIw==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.1.4': - resolution: {integrity: sha512-sCrNENE74I9MV090Wq/9Dg7EhPudx3+5OiSoQOkIe3DLPzFARuL1dOwCWhKCpA3I5RHmbrsbNSRfZwCabwd8Qg==} + '@biomejs/cli-darwin-arm64@2.2.0': + resolution: {integrity: sha512-zKbwUUh+9uFmWfS8IFxmVD6XwqFcENjZvEyfOxHs1epjdH3wyyMQG80FGDsmauPwS2r5kXdEM0v/+dTIA9FXAg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.1.4': - resolution: {integrity: sha512-gOEICJbTCy6iruBywBDcG4X5rHMbqCPs3clh3UQ+hRKlgvJTk4NHWQAyHOXvaLe+AxD1/TNX1jbZeffBJzcrOw==} + '@biomejs/cli-darwin-x64@2.2.0': + resolution: {integrity: sha512-+OmT4dsX2eTfhD5crUOPw3RPhaR+SKVspvGVmSdZ9y9O/AgL8pla6T4hOn1q+VAFBHuHhsdxDRJgFCSC7RaMOw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.1.4': - resolution: {integrity: sha512-nYr7H0CyAJPaLupFE2cH16KZmRC5Z9PEftiA2vWxk+CsFkPZQ6dBRdcC6RuS+zJlPc/JOd8xw3uCCt9Pv41WvQ==} + '@biomejs/cli-linux-arm64-musl@2.2.0': + resolution: {integrity: sha512-egKpOa+4FL9YO+SMUMLUvf543cprjevNc3CAgDNFLcjknuNMcZ0GLJYa3EGTCR2xIkIUJDVneBV3O9OcIlCEZQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [musl] - '@biomejs/cli-linux-arm64@2.1.4': - resolution: {integrity: sha512-juhEkdkKR4nbUi5k/KRp1ocGPNWLgFRD4NrHZSveYrD6i98pyvuzmS9yFYgOZa5JhaVqo0HPnci0+YuzSwT2fw==} + '@biomejs/cli-linux-arm64@2.2.0': + resolution: {integrity: sha512-6eoRdF2yW5FnW9Lpeivh7Mayhq0KDdaDMYOJnH9aT02KuSIX5V1HmWJCQQPwIQbhDh68Zrcpl8inRlTEan0SXw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [glibc] - '@biomejs/cli-linux-x64-musl@2.1.4': - resolution: {integrity: sha512-lvwvb2SQQHctHUKvBKptR6PLFCM7JfRjpCCrDaTmvB7EeZ5/dQJPhTYBf36BE/B4CRWR2ZiBLRYhK7hhXBCZAg==} + '@biomejs/cli-linux-x64-musl@2.2.0': + resolution: {integrity: sha512-I5J85yWwUWpgJyC1CcytNSGusu2p9HjDnOPAFG4Y515hwRD0jpR9sT9/T1cKHtuCvEQ/sBvx+6zhz9l9wEJGAg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [musl] - '@biomejs/cli-linux-x64@2.1.4': - resolution: {integrity: sha512-Eoy9ycbhpJVYuR+LskV9s3uyaIkp89+qqgqhGQsWnp/I02Uqg2fXFblHJOpGZR8AxdB9ADy87oFVxn9MpFKUrw==} + '@biomejs/cli-linux-x64@2.2.0': + resolution: {integrity: sha512-5UmQx/OZAfJfi25zAnAGHUMuOd+LOsliIt119x2soA2gLggQYrVPA+2kMUxR6Mw5M1deUF/AWWP2qpxgH7Nyfw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [glibc] - '@biomejs/cli-win32-arm64@2.1.4': - resolution: {integrity: sha512-3WRYte7orvyi6TRfIZkDN9Jzoogbv+gSvR+b9VOXUg1We1XrjBg6WljADeVEaKTvOcpVdH0a90TwyOQ6ue4fGw==} + '@biomejs/cli-win32-arm64@2.2.0': + resolution: {integrity: sha512-n9a1/f2CwIDmNMNkFs+JI0ZjFnMO0jdOyGNtihgUNFnlmd84yIYY2KMTBmMV58ZlVHjgmY5Y6E1hVTnSRieggA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.1.4': - resolution: {integrity: sha512-tBc+W7anBPSFXGAoQW+f/+svkpt8/uXfRwDzN1DvnatkRMt16KIYpEi/iw8u9GahJlFv98kgHcIrSsZHZTR0sw==} + '@biomejs/cli-win32-x64@2.2.0': + resolution: {integrity: sha512-Nawu5nHjP/zPKTIryh2AavzTc/KEg4um/MxWdXW0A6P/RZOyIpa7+QSjeXwAwX/utJGaCoXRPWtF3m5U/bB3Ww==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -580,8 +580,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.25.8': - resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} + '@esbuild/aix-ppc64@0.25.9': + resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -592,8 +592,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.8': - resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} + '@esbuild/android-arm64@0.25.9': + resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -604,8 +604,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.8': - resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} + '@esbuild/android-arm@0.25.9': + resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -616,8 +616,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.8': - resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} + '@esbuild/android-x64@0.25.9': + resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -628,8 +628,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.8': - resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} + '@esbuild/darwin-arm64@0.25.9': + resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -640,8 +640,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.8': - resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} + '@esbuild/darwin-x64@0.25.9': + resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -652,8 +652,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.8': - resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} + '@esbuild/freebsd-arm64@0.25.9': + resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -664,8 +664,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.8': - resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} + '@esbuild/freebsd-x64@0.25.9': + resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -676,8 +676,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.8': - resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} + '@esbuild/linux-arm64@0.25.9': + resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -688,8 +688,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.8': - resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} + '@esbuild/linux-arm@0.25.9': + resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -700,8 +700,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.8': - resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} + '@esbuild/linux-ia32@0.25.9': + resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -712,8 +712,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.8': - resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} + '@esbuild/linux-loong64@0.25.9': + resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -724,8 +724,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.8': - resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} + '@esbuild/linux-mips64el@0.25.9': + resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -736,8 +736,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.8': - resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} + '@esbuild/linux-ppc64@0.25.9': + resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -748,8 +748,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.8': - resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} + '@esbuild/linux-riscv64@0.25.9': + resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -760,8 +760,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.8': - resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} + '@esbuild/linux-s390x@0.25.9': + resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -772,14 +772,14 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.8': - resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} + '@esbuild/linux-x64@0.25.9': + resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.8': - resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} + '@esbuild/netbsd-arm64@0.25.9': + resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -790,8 +790,8 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.8': - resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} + '@esbuild/netbsd-x64@0.25.9': + resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] @@ -802,8 +802,8 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.25.8': - resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} + '@esbuild/openbsd-arm64@0.25.9': + resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -814,14 +814,14 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.8': - resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} + '@esbuild/openbsd-x64@0.25.9': + resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.8': - resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} + '@esbuild/openharmony-arm64@0.25.9': + resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] @@ -832,8 +832,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.8': - resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} + '@esbuild/sunos-x64@0.25.9': + resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -844,8 +844,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.8': - resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} + '@esbuild/win32-arm64@0.25.9': + resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -856,8 +856,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.8': - resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} + '@esbuild/win32-ia32@0.25.9': + resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -868,8 +868,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.8': - resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} + '@esbuild/win32-x64@0.25.9': + resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -888,14 +888,6 @@ packages: '@iarna/toml@2.2.5': resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} - '@iconify/types@2.0.0': - resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - - '@iconify/vue@5.0.0': - resolution: {integrity: sha512-C+KuEWIF5nSBrobFJhT//JS87OZ++QDORB6f2q2Wm6fl2mueSTpFBeBsveK0KW9hWiZ4mNiPjsh6Zs4jjdROSg==} - peerDependencies: - vue: '>=3' - '@img/sharp-darwin-arm64@0.33.5': resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -1028,10 +1020,16 @@ packages: '@jridgewell/gen-mapping@0.3.12': resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -1049,12 +1047,18 @@ packages: '@jridgewell/sourcemap-codec@1.5.4': resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} '@jridgewell/trace-mapping@0.3.29': resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + '@jridgewell/trace-mapping@0.3.30': + resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + '@juggle/resize-observer@3.4.0': resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} @@ -1499,6 +1503,9 @@ packages: '@tauri-apps/plugin-fs@2.4.1': resolution: {integrity: sha512-vJlKZVGF3UAFGoIEVT6Oq5L4HGDCD78WmA4uhzitToqYiBKWAvZR61M6zAyQzHqLs0ADemkE4RSy/5sCmZm6ZQ==} + '@tauri-apps/plugin-global-shortcut@2.3.0': + resolution: {integrity: sha512-WbAz0ElhpP+0kzQZRScdCC7UQ7OPH8PAn//fsBNu7+ywihsnVSVOg1L9YhieAtLNtAlnmFI69Yl5AGaA3ge5IQ==} + '@tauri-apps/plugin-http@2.5.1': resolution: {integrity: sha512-SpQ1azXEdQI0UB2NZTIPljJTDEe0bIaKzHYR/k4UQp6yzRYGLC/ktmIgEfQ2RvKAWus8GcYgGr5K6LJPbo/NZw==} @@ -2448,8 +2455,8 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.25.8: - resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} + esbuild@0.25.9: + resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} engines: {node: '>=18'} hasBin: true @@ -2550,6 +2557,15 @@ packages: picomatch: optional: true + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} @@ -4108,6 +4124,10 @@ packages: resolution: {integrity: sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==} engines: {node: '>=18.12.0'} + unplugin@2.3.6: + resolution: {integrity: sha512-+/MdXl8bLTXI2lJF22gUBeCFqZruEpL/oM9f8wxCuKh9+Mw9qeul3gTqgbKpMeOFlusCzc0s7x2Kax2xKW+FQg==} + engines: {node: '>=18.12.0'} + untyped@2.0.0: resolution: {integrity: sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==} hasBin: true @@ -4147,8 +4167,8 @@ packages: peerDependencies: vite: '>=2.0.0' - vite@7.1.1: - resolution: {integrity: sha512-yJ+Mp7OyV+4S+afWo+QyoL9jFWD11QFH0i5i7JypnfTcA1rmgxCbiA8WwAICDEtZ1Z1hzrVhN8R8rGTqkTY8ZQ==} + vite@7.1.2: + resolution: {integrity: sha512-J0SQBPlQiEXAF7tajiH+rUooJPo0l8KQgyg4/aMunNtrOa7bwuZJsJbDWzeljqQpgftxuq5yNJxQ91O9ts29UQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -4587,39 +4607,39 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@biomejs/biome@2.1.4': + '@biomejs/biome@2.2.0': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.1.4 - '@biomejs/cli-darwin-x64': 2.1.4 - '@biomejs/cli-linux-arm64': 2.1.4 - '@biomejs/cli-linux-arm64-musl': 2.1.4 - '@biomejs/cli-linux-x64': 2.1.4 - '@biomejs/cli-linux-x64-musl': 2.1.4 - '@biomejs/cli-win32-arm64': 2.1.4 - '@biomejs/cli-win32-x64': 2.1.4 + '@biomejs/cli-darwin-arm64': 2.2.0 + '@biomejs/cli-darwin-x64': 2.2.0 + '@biomejs/cli-linux-arm64': 2.2.0 + '@biomejs/cli-linux-arm64-musl': 2.2.0 + '@biomejs/cli-linux-x64': 2.2.0 + '@biomejs/cli-linux-x64-musl': 2.2.0 + '@biomejs/cli-win32-arm64': 2.2.0 + '@biomejs/cli-win32-x64': 2.2.0 - '@biomejs/cli-darwin-arm64@2.1.4': + '@biomejs/cli-darwin-arm64@2.2.0': optional: true - '@biomejs/cli-darwin-x64@2.1.4': + '@biomejs/cli-darwin-x64@2.2.0': optional: true - '@biomejs/cli-linux-arm64-musl@2.1.4': + '@biomejs/cli-linux-arm64-musl@2.2.0': optional: true - '@biomejs/cli-linux-arm64@2.1.4': + '@biomejs/cli-linux-arm64@2.2.0': optional: true - '@biomejs/cli-linux-x64-musl@2.1.4': + '@biomejs/cli-linux-x64-musl@2.2.0': optional: true - '@biomejs/cli-linux-x64@2.1.4': + '@biomejs/cli-linux-x64@2.2.0': optional: true - '@biomejs/cli-win32-arm64@2.1.4': + '@biomejs/cli-win32-arm64@2.2.0': optional: true - '@biomejs/cli-win32-x64@2.1.4': + '@biomejs/cli-win32-x64@2.2.0': optional: true '@breezystack/lamejs@1.2.7': {} @@ -4760,151 +4780,151 @@ snapshots: '@esbuild/aix-ppc64@0.23.1': optional: true - '@esbuild/aix-ppc64@0.25.8': + '@esbuild/aix-ppc64@0.25.9': optional: true '@esbuild/android-arm64@0.23.1': optional: true - '@esbuild/android-arm64@0.25.8': + '@esbuild/android-arm64@0.25.9': optional: true '@esbuild/android-arm@0.23.1': optional: true - '@esbuild/android-arm@0.25.8': + '@esbuild/android-arm@0.25.9': optional: true '@esbuild/android-x64@0.23.1': optional: true - '@esbuild/android-x64@0.25.8': + '@esbuild/android-x64@0.25.9': optional: true '@esbuild/darwin-arm64@0.23.1': optional: true - '@esbuild/darwin-arm64@0.25.8': + '@esbuild/darwin-arm64@0.25.9': optional: true '@esbuild/darwin-x64@0.23.1': optional: true - '@esbuild/darwin-x64@0.25.8': + '@esbuild/darwin-x64@0.25.9': optional: true '@esbuild/freebsd-arm64@0.23.1': optional: true - '@esbuild/freebsd-arm64@0.25.8': + '@esbuild/freebsd-arm64@0.25.9': optional: true '@esbuild/freebsd-x64@0.23.1': optional: true - '@esbuild/freebsd-x64@0.25.8': + '@esbuild/freebsd-x64@0.25.9': optional: true '@esbuild/linux-arm64@0.23.1': optional: true - '@esbuild/linux-arm64@0.25.8': + '@esbuild/linux-arm64@0.25.9': optional: true '@esbuild/linux-arm@0.23.1': optional: true - '@esbuild/linux-arm@0.25.8': + '@esbuild/linux-arm@0.25.9': optional: true '@esbuild/linux-ia32@0.23.1': optional: true - '@esbuild/linux-ia32@0.25.8': + '@esbuild/linux-ia32@0.25.9': optional: true '@esbuild/linux-loong64@0.23.1': optional: true - '@esbuild/linux-loong64@0.25.8': + '@esbuild/linux-loong64@0.25.9': optional: true '@esbuild/linux-mips64el@0.23.1': optional: true - '@esbuild/linux-mips64el@0.25.8': + '@esbuild/linux-mips64el@0.25.9': optional: true '@esbuild/linux-ppc64@0.23.1': optional: true - '@esbuild/linux-ppc64@0.25.8': + '@esbuild/linux-ppc64@0.25.9': optional: true '@esbuild/linux-riscv64@0.23.1': optional: true - '@esbuild/linux-riscv64@0.25.8': + '@esbuild/linux-riscv64@0.25.9': optional: true '@esbuild/linux-s390x@0.23.1': optional: true - '@esbuild/linux-s390x@0.25.8': + '@esbuild/linux-s390x@0.25.9': optional: true '@esbuild/linux-x64@0.23.1': optional: true - '@esbuild/linux-x64@0.25.8': + '@esbuild/linux-x64@0.25.9': optional: true - '@esbuild/netbsd-arm64@0.25.8': + '@esbuild/netbsd-arm64@0.25.9': optional: true '@esbuild/netbsd-x64@0.23.1': optional: true - '@esbuild/netbsd-x64@0.25.8': + '@esbuild/netbsd-x64@0.25.9': optional: true '@esbuild/openbsd-arm64@0.23.1': optional: true - '@esbuild/openbsd-arm64@0.25.8': + '@esbuild/openbsd-arm64@0.25.9': optional: true '@esbuild/openbsd-x64@0.23.1': optional: true - '@esbuild/openbsd-x64@0.25.8': + '@esbuild/openbsd-x64@0.25.9': optional: true - '@esbuild/openharmony-arm64@0.25.8': + '@esbuild/openharmony-arm64@0.25.9': optional: true '@esbuild/sunos-x64@0.23.1': optional: true - '@esbuild/sunos-x64@0.25.8': + '@esbuild/sunos-x64@0.25.9': optional: true '@esbuild/win32-arm64@0.23.1': optional: true - '@esbuild/win32-arm64@0.25.8': + '@esbuild/win32-arm64@0.25.9': optional: true '@esbuild/win32-ia32@0.23.1': optional: true - '@esbuild/win32-ia32@0.25.8': + '@esbuild/win32-ia32@0.25.9': optional: true '@esbuild/win32-x64@0.23.1': optional: true - '@esbuild/win32-x64@0.25.8': + '@esbuild/win32-x64@0.25.9': optional: true '@fastify/busboy@2.1.1': {} @@ -4917,13 +4937,6 @@ snapshots: '@iarna/toml@2.2.5': {} - '@iconify/types@2.0.0': {} - - '@iconify/vue@5.0.0(vue@3.5.18(typescript@5.9.2))': - dependencies: - '@iconify/types': 2.0.0 - vue: 3.5.18(typescript@5.9.2) - '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.0.4 @@ -5017,12 +5030,24 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.4 '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.30 + optional: true + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + optional: true + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} @@ -5036,6 +5061,9 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.4': {} + '@jridgewell/sourcemap-codec@1.5.5': + optional: true + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -5046,6 +5074,12 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping@0.3.30': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + optional: true + '@juggle/resize-observer@3.4.0': {} '@lokesh.dhakar/quantize@1.4.0': {} @@ -5421,6 +5455,10 @@ snapshots: dependencies: '@tauri-apps/api': 2.7.0 + '@tauri-apps/plugin-global-shortcut@2.3.0': + dependencies: + '@tauri-apps/api': 2.7.0 + '@tauri-apps/plugin-http@2.5.1': dependencies: '@tauri-apps/api': 2.7.0 @@ -5557,7 +5595,7 @@ snapshots: dependencies: '@unocss/core': 66.4.2 - '@unocss/vite@66.4.2(vite@7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))': + '@unocss/vite@66.4.2(vite@7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))': dependencies: '@ampproject/remapping': 2.3.0 '@unocss/config': 66.4.2 @@ -5568,23 +5606,23 @@ snapshots: pathe: 2.0.3 tinyglobby: 0.2.14 unplugin-utils: 0.2.5 - vite: 7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1) + vite: 7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1) - '@vitejs/plugin-vue-jsx@5.0.1(vite@7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))(vue@3.5.18(typescript@5.9.2))': + '@vitejs/plugin-vue-jsx@5.0.1(vite@7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))(vue@3.5.18(typescript@5.9.2))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.0) '@rolldown/pluginutils': 1.0.0-beta.31 '@vue/babel-plugin-jsx': 1.4.0(@babel/core@7.28.0) - vite: 7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1) + vite: 7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1) vue: 3.5.18(typescript@5.9.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@6.0.1(vite@7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))(vue@3.5.18(typescript@5.9.2))': + '@vitejs/plugin-vue@6.0.1(vite@7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))(vue@3.5.18(typescript@5.9.2))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.29 - vite: 7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1) + vite: 7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1) vue: 3.5.18(typescript@5.9.2) '@vitest/coverage-v8@3.2.4(vitest@3.2.4)': @@ -5614,13 +5652,13 @@ snapshots: chai: 5.2.1 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))': + '@vitest/mocker@3.2.4(vite@7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1) + vite: 7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -6507,34 +6545,34 @@ snapshots: '@esbuild/win32-x64': 0.23.1 optional: true - esbuild@0.25.8: + esbuild@0.25.9: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.8 - '@esbuild/android-arm': 0.25.8 - '@esbuild/android-arm64': 0.25.8 - '@esbuild/android-x64': 0.25.8 - '@esbuild/darwin-arm64': 0.25.8 - '@esbuild/darwin-x64': 0.25.8 - '@esbuild/freebsd-arm64': 0.25.8 - '@esbuild/freebsd-x64': 0.25.8 - '@esbuild/linux-arm': 0.25.8 - '@esbuild/linux-arm64': 0.25.8 - '@esbuild/linux-ia32': 0.25.8 - '@esbuild/linux-loong64': 0.25.8 - '@esbuild/linux-mips64el': 0.25.8 - '@esbuild/linux-ppc64': 0.25.8 - '@esbuild/linux-riscv64': 0.25.8 - '@esbuild/linux-s390x': 0.25.8 - '@esbuild/linux-x64': 0.25.8 - '@esbuild/netbsd-arm64': 0.25.8 - '@esbuild/netbsd-x64': 0.25.8 - '@esbuild/openbsd-arm64': 0.25.8 - '@esbuild/openbsd-x64': 0.25.8 - '@esbuild/openharmony-arm64': 0.25.8 - '@esbuild/sunos-x64': 0.25.8 - '@esbuild/win32-arm64': 0.25.8 - '@esbuild/win32-ia32': 0.25.8 - '@esbuild/win32-x64': 0.25.8 + '@esbuild/aix-ppc64': 0.25.9 + '@esbuild/android-arm': 0.25.9 + '@esbuild/android-arm64': 0.25.9 + '@esbuild/android-x64': 0.25.9 + '@esbuild/darwin-arm64': 0.25.9 + '@esbuild/darwin-x64': 0.25.9 + '@esbuild/freebsd-arm64': 0.25.9 + '@esbuild/freebsd-x64': 0.25.9 + '@esbuild/linux-arm': 0.25.9 + '@esbuild/linux-arm64': 0.25.9 + '@esbuild/linux-ia32': 0.25.9 + '@esbuild/linux-loong64': 0.25.9 + '@esbuild/linux-mips64el': 0.25.9 + '@esbuild/linux-ppc64': 0.25.9 + '@esbuild/linux-riscv64': 0.25.9 + '@esbuild/linux-s390x': 0.25.9 + '@esbuild/linux-x64': 0.25.9 + '@esbuild/netbsd-arm64': 0.25.9 + '@esbuild/netbsd-x64': 0.25.9 + '@esbuild/openbsd-arm64': 0.25.9 + '@esbuild/openbsd-x64': 0.25.9 + '@esbuild/openharmony-arm64': 0.25.9 + '@esbuild/sunos-x64': 0.25.9 + '@esbuild/win32-arm64': 0.25.9 + '@esbuild/win32-ia32': 0.25.9 + '@esbuild/win32-x64': 0.25.9 escalade@3.2.0: {} @@ -6640,7 +6678,7 @@ snapshots: optionalDependencies: picomatch: 4.0.2 - fdir@6.4.6(picomatch@4.0.3): + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -8164,7 +8202,7 @@ snapshots: acorn: 8.15.0 estree-walker: 3.0.3 magic-string: 0.30.17 - unplugin: 2.3.5 + unplugin: 2.3.6 optional: true undici-types@7.8.0: {} @@ -8206,7 +8244,7 @@ snapshots: scule: 1.3.0 strip-literal: 3.0.0 tinyglobby: 0.2.14 - unplugin: 2.3.5 + unplugin: 2.3.6 unplugin-utils: 0.2.5 optional: true @@ -8263,6 +8301,14 @@ snapshots: picomatch: 4.0.2 webpack-virtual-modules: 0.6.2 + unplugin@2.3.6: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.15.0 + picomatch: 4.0.3 + webpack-virtual-modules: 0.6.2 + optional: true + untyped@2.0.0: dependencies: citty: 0.1.6 @@ -8311,7 +8357,7 @@ snapshots: debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1) + vite: 7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1) transitivePeerDependencies: - '@types/node' - jiti @@ -8326,16 +8372,16 @@ snapshots: - tsx - yaml - vite-plugin-vue-setup-extend@0.4.0(vite@7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)): + vite-plugin-vue-setup-extend@0.4.0(vite@7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)): dependencies: '@vue/compiler-sfc': 3.5.13 magic-string: 0.25.9 - vite: 7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1) + vite: 7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1) - vite@7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1): + vite@7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1): dependencies: - esbuild: 0.25.8 - fdir: 6.4.6(picomatch@4.0.3) + esbuild: 0.25.9 + fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 rollup: 4.46.2 @@ -8353,7 +8399,7 @@ snapshots: dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)) + '@vitest/mocker': 3.2.4(vite@7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -8371,7 +8417,7 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1) + vite: 7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1) vite-node: 3.2.4(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1) why-is-node-running: 2.3.0 optionalDependencies: diff --git a/public/icon.js b/public/icon.js index 15e2fb86..d424d98d 100644 --- a/public/icon.js +++ b/public/icon.js @@ -1 +1 @@ -!function(e){var t,n,d,o,i,a,r='';function c(){i||(i=!0,d())}t=function(){var e,t,n;(n=document.createElement("div")).innerHTML=r,r=null,(t=n.getElementsByTagName("svg")[0])&&(t.setAttribute("aria-hidden","true"),t.style.position="absolute",t.style.width=0,t.style.height=0,t.style.overflow="hidden",e=t,(n=document.body).firstChild?(t=n.firstChild).parentNode.insertBefore(e,t):n.appendChild(e))},document.addEventListener?["complete","loaded","interactive"].indexOf(document.readyState)>-1?setTimeout(t,0):(n=function(){document.removeEventListener("DOMContentLoaded",n,!1),t()},document.addEventListener("DOMContentLoaded",n,!1)):document.attachEvent&&(d=t,o=e.document,i=!1,(a=function(){try{o.documentElement.doScroll("left")}catch(e){return void setTimeout(a,50)}c()})(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,c())})}(window); \ No newline at end of file +!function(e){var t,n,d,o,i,a,r='';function c(){i||(i=!0,d())}t=function(){var e,t,n;(n=document.createElement("div")).innerHTML=r,r=null,(t=n.getElementsByTagName("svg")[0])&&(t.setAttribute("aria-hidden","true"),t.style.position="absolute",t.style.width=0,t.style.height=0,t.style.overflow="hidden",e=t,(n=document.body).firstChild?(t=n.firstChild).parentNode.insertBefore(e,t):n.appendChild(e))},document.addEventListener?["complete","loaded","interactive"].indexOf(document.readyState)>-1?setTimeout(t,0):(n=function(){document.removeEventListener("DOMContentLoaded",n,!1),t()},document.addEventListener("DOMContentLoaded",n,!1)):document.attachEvent&&(d=t,o=e.document,i=!1,(a=function(){try{o.documentElement.doScroll("left")}catch(e){return void setTimeout(a,50)}c()})(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,c())})}(window); diff --git a/scripts/check-dependencies.js b/scripts/check-dependencies.js index 7c2b532b..46d89744 100644 --- a/scripts/check-dependencies.js +++ b/scripts/check-dependencies.js @@ -103,8 +103,8 @@ const compareVersions = (version1, version2) => { const v2 = version2.replace(/[^0-9.]/g, '').split('.') for (let i = 0; i < Math.max(v1.length, v2.length); i++) { - const num1 = parseInt(v1[i] || '0') - const num2 = parseInt(v2[i] || '0') + const num1 = parseInt(v1[i] || '0', 10) + const num2 = parseInt(v2[i] || '0', 10) if (num1 > num2) return 1 if (num1 < num2) return -1 } diff --git a/src-tauri/.env b/src-tauri/.env new file mode 100644 index 00000000..7339d3a7 --- /dev/null +++ b/src-tauri/.env @@ -0,0 +1,3 @@ +RUST_BACKTRACE=1 +# APP_ENVIRONMENT=local +APP_ENVIRONMENT=local diff --git a/src-tauri/Info.plist b/src-tauri/Info.plist index e7486ea9..6b55545a 100644 --- a/src-tauri/Info.plist +++ b/src-tauri/Info.plist @@ -6,5 +6,9 @@ Request camera access for WebRTC NSMicrophoneUsageDescription Request microphone access for WebRTC + NSScreenCaptureUsageDescription + HuLa needs screen recording permission to enable screenshot functionality + NSAccessibilityUsageDescription + HuLa needs accessibility permission to capture screen content diff --git a/src-tauri/capabilities/desktop.json b/src-tauri/capabilities/desktop.json index cc44c13b..5e2df6c9 100644 --- a/src-tauri/capabilities/desktop.json +++ b/src-tauri/capabilities/desktop.json @@ -1,6 +1,16 @@ { "identifier": "desktop-capability", "platforms": ["macOS", "windows", "linux"], - "windows": ["home", "login", "update", "checkupdate"], - "permissions": ["updater:default", "updater:allow-check", "updater:allow-download", "updater:allow-install"] + "windows": ["home", "login", "update", "checkupdate", "capture", "settings", "tray"], + "permissions": [ + "updater:default", + "updater:allow-check", + "updater:allow-download", + "updater:allow-install", + "global-shortcut:allow-is-registered", + "global-shortcut:allow-register", + "global-shortcut:allow-register-all", + "global-shortcut:allow-unregister", + "global-shortcut:allow-unregister-all" + ] } diff --git a/src-tauri/gen/schemas/capabilities.json b/src-tauri/gen/schemas/capabilities.json index deef03fd..83b1a6c7 100644 --- a/src-tauri/gen/schemas/capabilities.json +++ b/src-tauri/gen/schemas/capabilities.json @@ -1 +1 @@ -{"default-capability":{"identifier":"default-capability","description":"Capability for the main window","local":true,"windows":["*"],"permissions":["core:default","core:window:default","core:window:allow-create","core:window:allow-start-dragging","core:window:allow-close","core:window:allow-hide","core:window:allow-center","core:window:allow-show","core:window:allow-maximize","core:window:allow-minimize","core:window:allow-destroy","core:window:allow-is-focused","core:window:allow-is-fullscreen","core:window:allow-set-focus","core:window:allow-set-position","core:window:allow-scale-factor","core:window:allow-unminimize","core:window:allow-set-always-on-top","core:window:allow-set-size","core:window:allow-set-min-size","core:window:allow-unmaximize","core:window:allow-set-fullscreen","core:window:allow-request-user-attention","core:window:allow-set-enabled","core:webview:allow-create-webview","core:webview:allow-create-webview-window","core:webview:allow-internal-toggle-devtools","core:webview:allow-set-webview-size","core:webview:allow-webview-size","core:event:default","core:event:allow-listen","core:image:default","core:image:allow-rgba","os:default","os:allow-os-type","os:allow-arch","os:allow-version","os:allow-hostname","process:default","process:allow-exit","clipboard-manager:allow-clear","clipboard-manager:allow-read-image","clipboard-manager:allow-read-text","clipboard-manager:allow-write-html","clipboard-manager:allow-write-image","clipboard-manager:allow-write-text","http:allow-fetch","http:allow-fetch-cancel","http:allow-fetch-read-body","http:allow-fetch-send","core:tray:default","core:tray:allow-get-by-id","autostart:allow-enable","autostart:allow-disable","autostart:allow-is-enabled","dialog:default","dialog:allow-open","dialog:allow-confirm","dialog:allow-save","dialog:allow-ask","dialog:allow-message","core:resources:allow-close","sql:allow-load","sql:allow-execute","sql:allow-select","sql:allow-close","shell:default","shell:allow-open","notification:allow-is-permission-granted","notification:allow-request-permission","notification:allow-notify","notification:allow-register-action-types","notification:allow-register-listener","notification:allow-cancel","notification:allow-get-pending","notification:allow-remove-active","notification:allow-get-active","notification:allow-check-permissions","notification:allow-show","notification:allow-batch","notification:allow-list-channels","notification:allow-delete-channel","notification:allow-create-channel","notification:allow-permission-state","opener:default","opener:allow-reveal-item-in-dir","opener:allow-open-path","mic-recorder:default","log:default","log:allow-log",{"identifier":"shell:allow-execute","allow":[{"args":true,"cmd":"powershell","name":"powershell"},{"args":["-c",{"validator":"\\S+"}],"cmd":"cmd","name":"systemPath"}]},{"identifier":"fs:write-files","allow":[{"path":"**"}]},{"identifier":"fs:allow-mkdir","allow":[{"path":"**"}]},{"identifier":"fs:read-dirs","allow":[{"path":"**"}]},{"identifier":"fs:read-files","allow":[{"path":"**"}]},{"identifier":"fs:allow-copy-file","allow":[{"path":"**"}]},{"identifier":"fs:allow-read-text-file","allow":[{"path":"**"}]},{"identifier":"http:default","allow":[{"url":"http://**"},{"url":"https://**"},{"url":"http://*:*"},{"url":"https://*:*"}]}],"platforms":["macOS","windows","linux"]},"desktop-capability":{"identifier":"desktop-capability","description":"","local":true,"windows":["home","login","update","checkupdate"],"permissions":["updater:default","updater:allow-check","updater:allow-download","updater:allow-install"],"platforms":["macOS","windows","linux"]},"mobile-capability":{"identifier":"mobile-capability","description":"Capability for the main window","local":true,"windows":["*"],"permissions":["core:default","core:webview:allow-internal-toggle-devtools","http:allow-fetch","http:allow-fetch-cancel","http:allow-fetch-read-body","http:allow-fetch-send","os:default","os:allow-os-type","os:allow-arch","os:allow-version","os:allow-hostname","sql:allow-load","sql:allow-execute","sql:allow-select","sql:allow-close","notification:allow-is-permission-granted","notification:allow-request-permission","notification:allow-notify","notification:allow-register-action-types","notification:allow-register-listener","notification:allow-cancel","notification:allow-get-pending","notification:allow-remove-active","notification:allow-get-active","notification:allow-check-permissions","notification:allow-show","notification:allow-batch","notification:allow-list-channels","notification:allow-delete-channel","notification:allow-create-channel","notification:allow-permission-state","safe-area-insets:default","log:default","log:allow-log",{"identifier":"shell:allow-execute","allow":[{"args":true,"cmd":"powershell","name":"powershell"},{"args":["-c",{"validator":"\\S+"}],"cmd":"cmd","name":"systemPath"}]},{"identifier":"fs:write-files","allow":[{"path":"**"}]},{"identifier":"fs:allow-mkdir","allow":[{"path":"**"}]},{"identifier":"fs:read-dirs","allow":[{"path":"**"}]},{"identifier":"fs:read-files","allow":[{"path":"**"}]},{"identifier":"fs:allow-copy-file","allow":[{"path":"**"}]},{"identifier":"fs:allow-read-text-file","allow":[{"path":"**"}]},{"identifier":"http:default","allow":[{"url":"http://**"},{"url":"https://**"},{"url":"http://*:*"},{"url":"https://*:*"}]}],"platforms":["iOS","android"]}} \ No newline at end of file +{"default-capability":{"identifier":"default-capability","description":"Capability for the main window","local":true,"windows":["*"],"permissions":["core:default","core:window:default","core:window:allow-create","core:window:allow-start-dragging","core:window:allow-close","core:window:allow-hide","core:window:allow-center","core:window:allow-show","core:window:allow-maximize","core:window:allow-minimize","core:window:allow-destroy","core:window:allow-is-focused","core:window:allow-is-fullscreen","core:window:allow-set-focus","core:window:allow-set-position","core:window:allow-scale-factor","core:window:allow-unminimize","core:window:allow-set-always-on-top","core:window:allow-set-size","core:window:allow-set-min-size","core:window:allow-unmaximize","core:window:allow-set-fullscreen","core:window:allow-request-user-attention","core:window:allow-set-enabled","core:webview:allow-create-webview","core:webview:allow-create-webview-window","core:webview:allow-internal-toggle-devtools","core:webview:allow-set-webview-size","core:webview:allow-webview-size","core:event:default","core:event:allow-listen","core:image:default","core:image:allow-rgba","os:default","os:allow-os-type","os:allow-arch","os:allow-version","os:allow-hostname","process:default","process:allow-exit","clipboard-manager:allow-clear","clipboard-manager:allow-read-image","clipboard-manager:allow-read-text","clipboard-manager:allow-write-html","clipboard-manager:allow-write-image","clipboard-manager:allow-write-text","http:allow-fetch","http:allow-fetch-cancel","http:allow-fetch-read-body","http:allow-fetch-send","core:tray:default","core:tray:allow-get-by-id","autostart:allow-enable","autostart:allow-disable","autostart:allow-is-enabled","dialog:default","dialog:allow-open","dialog:allow-confirm","dialog:allow-save","dialog:allow-ask","dialog:allow-message","core:resources:allow-close","sql:allow-load","sql:allow-execute","sql:allow-select","sql:allow-close","shell:default","shell:allow-open","notification:allow-is-permission-granted","notification:allow-request-permission","notification:allow-notify","notification:allow-register-action-types","notification:allow-register-listener","notification:allow-cancel","notification:allow-get-pending","notification:allow-remove-active","notification:allow-get-active","notification:allow-check-permissions","notification:allow-show","notification:allow-batch","notification:allow-list-channels","notification:allow-delete-channel","notification:allow-create-channel","notification:allow-permission-state","opener:default","opener:allow-reveal-item-in-dir","opener:allow-open-path","mic-recorder:default","log:default","log:allow-log",{"identifier":"shell:allow-execute","allow":[{"args":true,"cmd":"powershell","name":"powershell"},{"args":["-c",{"validator":"\\S+"}],"cmd":"cmd","name":"systemPath"}]},{"identifier":"fs:write-files","allow":[{"path":"**"}]},{"identifier":"fs:allow-mkdir","allow":[{"path":"**"}]},{"identifier":"fs:read-dirs","allow":[{"path":"**"}]},{"identifier":"fs:read-files","allow":[{"path":"**"}]},{"identifier":"fs:allow-copy-file","allow":[{"path":"**"}]},{"identifier":"fs:allow-read-text-file","allow":[{"path":"**"}]},{"identifier":"http:default","allow":[{"url":"http://**"},{"url":"https://**"},{"url":"http://*:*"},{"url":"https://*:*"}]}],"platforms":["macOS","windows","linux"]},"desktop-capability":{"identifier":"desktop-capability","description":"","local":true,"windows":["home","login","update","checkupdate","capture","settings","tray"],"permissions":["updater:default","updater:allow-check","updater:allow-download","updater:allow-install","global-shortcut:allow-is-registered","global-shortcut:allow-register","global-shortcut:allow-register-all","global-shortcut:allow-unregister","global-shortcut:allow-unregister-all"],"platforms":["macOS","windows","linux"]},"mobile-capability":{"identifier":"mobile-capability","description":"Capability for the main window","local":true,"windows":["*"],"permissions":["core:default","core:webview:allow-internal-toggle-devtools","http:allow-fetch","http:allow-fetch-cancel","http:allow-fetch-read-body","http:allow-fetch-send","os:default","os:allow-os-type","os:allow-arch","os:allow-version","os:allow-hostname","sql:allow-load","sql:allow-execute","sql:allow-select","sql:allow-close","notification:allow-is-permission-granted","notification:allow-request-permission","notification:allow-notify","notification:allow-register-action-types","notification:allow-register-listener","notification:allow-cancel","notification:allow-get-pending","notification:allow-remove-active","notification:allow-get-active","notification:allow-check-permissions","notification:allow-show","notification:allow-batch","notification:allow-list-channels","notification:allow-delete-channel","notification:allow-create-channel","notification:allow-permission-state","safe-area-insets:default","log:default","log:allow-log",{"identifier":"shell:allow-execute","allow":[{"args":true,"cmd":"powershell","name":"powershell"},{"args":["-c",{"validator":"\\S+"}],"cmd":"cmd","name":"systemPath"}]},{"identifier":"fs:write-files","allow":[{"path":"**"}]},{"identifier":"fs:allow-mkdir","allow":[{"path":"**"}]},{"identifier":"fs:read-dirs","allow":[{"path":"**"}]},{"identifier":"fs:read-files","allow":[{"path":"**"}]},{"identifier":"fs:allow-copy-file","allow":[{"path":"**"}]},{"identifier":"fs:allow-read-text-file","allow":[{"path":"**"}]},{"identifier":"http:default","allow":[{"url":"http://**"},{"url":"https://**"},{"url":"http://*:*"},{"url":"https://*:*"}]}],"platforms":["iOS","android"]}} \ No newline at end of file diff --git a/src-tauri/src/configuration.rs b/src-tauri/src/configuration.rs index 4ce0a6de..8b5328fb 100644 --- a/src-tauri/src/configuration.rs +++ b/src-tauri/src/configuration.rs @@ -157,6 +157,7 @@ pub fn get_configuration(app_handle: &AppHandle) -> Result Result<(), String> { /// /// # 参数 /// * `window_label` - 窗口的标签名称 +/// * `hide_close_button` - 可选参数,是否隐藏关闭按钮,默认为false(不隐藏) /// * `handle` - Tauri应用句柄 /// /// # 返回 /// * `Result<(), String>` - 成功返回Ok(()), 失败返回错误信息 #[tauri::command] #[cfg(target_os = "macos")] -pub fn hide_title_bar_buttons(window_label: &str, handle: AppHandle) -> Result<(), String> { +pub fn hide_title_bar_buttons( + window_label: &str, + hide_close_button: Option, + handle: AppHandle, +) -> Result<(), String> { #[cfg(target_os = "macos")] #[allow(deprecated)] { @@ -219,6 +224,11 @@ pub fn hide_title_bar_buttons(window_label: &str, handle: AppHandle) -> Result<( hide_button(ns_window, NSWindowButton::NSWindowMiniaturizeButton); hide_button(ns_window, NSWindowButton::NSWindowZoomButton); + // 根据参数决定是否隐藏关闭按钮 + if hide_close_button.unwrap_or(false) { + hide_button(ns_window, NSWindowButton::NSWindowCloseButton); + } + // 设置窗口不可拖动 let _: () = msg_send![ns_window, setMovable: NO]; } @@ -226,6 +236,54 @@ pub fn hide_title_bar_buttons(window_label: &str, handle: AppHandle) -> Result<( Ok(()) } +/// 恢复Mac窗口的标题栏按钮显示 +/// +/// # 参数 +/// * `window_label` - 窗口的标签名称 +/// * `handle` - Tauri应用句柄 +/// +/// # 返回 +/// * `Result<(), String>` - 成功返回Ok(()), 失败返回错误信息 +#[tauri::command] +#[cfg(target_os = "macos")] +pub fn show_title_bar_buttons(window_label: &str, handle: AppHandle) -> Result<(), String> { + #[cfg(target_os = "macos")] + #[allow(deprecated)] + { + use cocoa::appkit::NSWindowButton; + use cocoa::base::{NO, YES, id}; + use objc::{msg_send, sel, sel_impl}; + + let webview_window = handle + .get_webview_window(window_label) + .ok_or_else(|| format!("Window '{}' not found", window_label))?; + + let ns_window = webview_window + .ns_window() + .map_err(|e| format!("Failed to get NSWindow: {}", e))? as id; + + unsafe { + // 显示标题栏按钮的辅助函数 + let show_button = |window: id, button_type: NSWindowButton| { + let btn = window.standardWindowButton_(button_type); + if !btn.is_null() { + let _: () = msg_send![btn, setHidden: NO]; + } + }; + + // 显示所有标题栏按钮 + show_button(ns_window, NSWindowButton::NSWindowCloseButton); + show_button(ns_window, NSWindowButton::NSWindowMiniaturizeButton); + show_button(ns_window, NSWindowButton::NSWindowZoomButton); + show_button(ns_window, NSWindowButton::NSWindowFullScreenButton); + + // 恢复窗口可拖动 + let _: () = msg_send![ns_window, setMovable: YES]; + } + } + Ok(()) +} + #[tauri::command] pub async fn push_window_payload( label: String, @@ -323,3 +381,30 @@ pub fn set_badge_count(count: Option, handle: AppHandle) -> Result<(), Stri } } } + +/// 设置 macOS 窗口级别为屏幕保护程序级别,以覆盖菜单栏 +#[tauri::command] +#[cfg(target_os = "macos")] +pub fn set_window_level_above_menubar(window_label: &str, handle: AppHandle) -> Result<(), String> { + #[cfg(target_os = "macos")] + #[allow(deprecated)] + { + use cocoa::base::id; + use objc::{msg_send, sel, sel_impl}; + + let webview_window = handle + .get_webview_window(window_label) + .ok_or_else(|| format!("Window '{}' not found", window_label))?; + + let ns_window = webview_window + .ns_window() + .map_err(|e| format!("Failed to get NSWindow: {}", e))? as id; + + unsafe { + // 设置窗口级别为屏幕保护程序级别 (1000),高于菜单栏 + let screen_saver_level: i32 = 1000; + let _: () = msg_send![ns_window, setLevel: screen_saver_level]; + } + } + Ok(()) +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index dbba53f8..e5ca701d 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -3,14 +3,14 @@ mod desktops; #[cfg(desktop)] use common::init::CustomInit; -#[cfg(target_os = "macos")] -use common_cmd::hide_title_bar_buttons; #[cfg(desktop)] use common_cmd::{ audio, default_window_icon, get_files_meta, get_window_payload, push_window_payload, screenshot, set_height, }; #[cfg(target_os = "macos")] +use common_cmd::{hide_title_bar_buttons, set_window_level_above_menubar, show_title_bar_buttons}; +#[cfg(target_os = "macos")] use desktops::app_event; #[cfg(desktop)] use desktops::{common_cmd, directory_scanner, init, tray, video_thumbnail::get_video_thumbnail}; @@ -239,20 +239,35 @@ fn setup_logout_listener(app_handle: tauri::AppHandle) { app_handle.listen("logout", move |_event| { let app_handle = app_handle_clone.clone(); tauri::async_runtime::spawn(async move { - tracing::info!("[LOGOUT] Starting to close all non-login windows"); + tracing::info!("[LOGOUT] Starting to close windows and preserve capture/checkupdate windows"); let all_windows = app_handle.webview_windows(); tracing::info!("[LOGOUT] Found {} windows", all_windows.len()); - // 收集需要关闭的窗口 + // 收集需要关闭的窗口和需要隐藏的窗口 let mut windows_to_close = Vec::new(); + let mut windows_to_hide = Vec::new(); for (label, window) in all_windows { - // 跳过 login 窗口,不关闭它 - if label != "login" && label != "tray" { - windows_to_close.push((label, window)); + match label.as_str() { + // 这些窗口完全不处理 + "login" | "tray" => {}, + // 这些窗口只隐藏,不销毁 + "capture" | "checkupdate" => { + windows_to_hide.push((label, window)); + }, + // 其他窗口需要关闭 + _ => { + windows_to_close.push((label, window)); + } } } + // 先隐藏需要保持的窗口 + for (label, window) in windows_to_hide { + tracing::info!("[LOGOUT] Hiding window (preserving): {}", label); + let _ = window.hide(); + } + // 逐个关闭窗口,添加小延迟以避免并发关闭导致的错误 for (label, window) in windows_to_close { tracing::info!("[LOGOUT] Closing window: {}", label); @@ -282,7 +297,7 @@ fn setup_logout_listener(app_handle: tauri::AppHandle) { } } - tracing::info!("[LOGOUT] All non-login windows closed successfully"); + tracing::info!("[LOGOUT] Logout completed - windows closed and capture/checkupdate windows preserved"); }); }); } @@ -369,6 +384,10 @@ fn get_invoke_handlers() -> impl Fn(tauri::ipc::Invoke) -> bool + Se get_video_thumbnail, #[cfg(target_os = "macos")] hide_title_bar_buttons, + #[cfg(target_os = "macos")] + show_title_bar_buttons, + #[cfg(target_os = "macos")] + set_window_level_above_menubar, #[cfg(desktop)] push_window_payload, #[cfg(desktop)] diff --git a/src-tauri/tauri.macos.conf.json b/src-tauri/tauri.macos.conf.json index 5cd6aaed..86d41259 100644 --- a/src-tauri/tauri.macos.conf.json +++ b/src-tauri/tauri.macos.conf.json @@ -10,16 +10,9 @@ "devUrl": "http://127.0.0.1:6130" }, "bundle": { - "resources": [ - "tray", - "configuration", - "Info.plist" - ], + "resources": ["tray", "configuration", "Info.plist"], "active": true, - "targets": [ - "app", - "dmg" - ], + "targets": ["app", "dmg"], "icon": [ "icons/macos/light/32x32.png", "icons/macos/light/128x128.png", @@ -82,9 +75,14 @@ "fullscreen": false, "transparent": true, "resizable": false, - "skipTaskbar": false, + "skipTaskbar": true, "decorations": false, - "visible": false + "visible": false, + "hiddenTitle": true, + "alwaysOnTop": true, + "focus": true, + "titleBarStyle": "Overlay", + "visibleOnAllWorkspaces": true }, { "label": "checkupdate", diff --git a/src-tauri/tauri.windows.conf.json b/src-tauri/tauri.windows.conf.json index 3691c37f..b220343c 100644 --- a/src-tauri/tauri.windows.conf.json +++ b/src-tauri/tauri.windows.conf.json @@ -96,12 +96,13 @@ { "label": "capture", "url": "/capture", - "fullscreen": false, + "fullscreen": true, "transparent": true, "resizable": false, - "skipTaskbar": false, + "skipTaskbar": true, "decorations": false, - "visible": false + "visible": false, + "hiddenTitle": true }, { "label": "checkupdate", diff --git a/src/App.vue b/src/App.vue index 65d1b169..3577a9b4 100644 --- a/src/App.vue +++ b/src/App.vue @@ -13,6 +13,7 @@ import { WebviewWindow } from '@tauri-apps/api/webviewWindow' import { type } from '@tauri-apps/plugin-os' import { useStorage } from '@vueuse/core' import { MittEnum, StoresEnum, ThemeEnum } from '@/enums' +import { useGlobalShortcut } from '@/hooks/useGlobalShortcut.ts' import { useLogin } from '@/hooks/useLogin.ts' import { useMitt } from '@/hooks/useMitt.ts' import { useWindow } from '@/hooks/useWindow.ts' @@ -29,6 +30,8 @@ const { resetLoginState, logout } = useLogin() const token = useStorage('TOKEN', null) const refreshToken = useStorage('REFRESH_TOKEN', null) const { addListener } = useTauriListener() +// 全局快捷键管理 +const { initializeGlobalShortcut, cleanupGlobalShortcut } = useGlobalShortcut() /** 不需要锁屏的页面 */ const LockExclusion = new Set(['/login', '/tray', '/qrCode', '/about', '/onlineStatus']) @@ -123,6 +126,11 @@ onMounted(async () => { } document.documentElement.dataset.theme = themes.value.content window.addEventListener('dragstart', preventDrag) + + // 只在主窗口中初始化全局快捷键 + if (appWindow.label === 'home') { + await initializeGlobalShortcut() + } /** 开发环境不禁止 */ if (process.env.NODE_ENV !== 'development') { /** 禁用浏览器默认的快捷键 */ @@ -171,9 +179,14 @@ onMounted(async () => { ) }) -onUnmounted(() => { +onUnmounted(async () => { window.removeEventListener('contextmenu', (e) => e.preventDefault(), false) window.removeEventListener('dragstart', preventDrag) + + // 只在主窗口中清理全局快捷键 + if (appWindow.label === 'home') { + await cleanupGlobalShortcut() + } }) diff --git a/src/components/rightBox/ApplyList.vue b/src/components/rightBox/ApplyList.vue index db0c271a..2622f624 100644 --- a/src/components/rightBox/ApplyList.vue +++ b/src/components/rightBox/ApplyList.vue @@ -128,9 +128,9 @@ const isAccepted = (targetId: string) => { const applyList = computed(() => { return contactStore.requestFriendsList.filter((item) => { if (props.type === 'friend') { - return item.type === 1 - } else { return item.type === 2 + } else { + return item.type === 1 } }) }) @@ -194,11 +194,16 @@ const loadMoreFriendRequests = async () => { const handleAgree = async (applyId: string) => { loadingMap.value[applyId] = true - contactStore.onAcceptFriend(applyId).then(() => { - setTimeout(() => { - loadingMap.value[applyId] = false - }, 600) - }) + contactStore + .onHandleInvite({ + applyId, + state: 2 + }) + .then(() => { + setTimeout(() => { + loadingMap.value[applyId] = false + }, 600) + }) } // 处理好友请求操作(拒绝或忽略) @@ -206,9 +211,15 @@ const handleFriendAction = async (action: string, applyId: string) => { loadingMap.value[applyId] = true try { if (action === 'reject') { - await contactStore.onRejectFriend(applyId) + await contactStore.onHandleInvite({ + applyId, + state: 0 + }) } else if (action === 'ignore') { - await contactStore.onIgnoreFriend(applyId) + await contactStore.onHandleInvite({ + applyId, + state: 3 + }) } } finally { setTimeout(() => { diff --git a/src/components/rightBox/chatBox/ChatFooter.vue b/src/components/rightBox/chatBox/ChatFooter.vue index 8ba815c8..3ca5adb0 100644 --- a/src/components/rightBox/chatBox/ChatFooter.vue +++ b/src/components/rightBox/chatBox/ChatFooter.vue @@ -115,7 +115,8 @@ diff --git a/src/views/moreWindow/settings/config.ts b/src/views/moreWindow/settings/config.ts index 12d3f1c1..e6c89a9b 100644 --- a/src/views/moreWindow/settings/config.ts +++ b/src/views/moreWindow/settings/config.ts @@ -16,6 +16,11 @@ const sideOptions = ref([ label: '存储管理', icon: 'mini-sd-card' }, + { + url: '/shortcut', + label: '快捷键管理', + icon: 'enter-the-keyboard' + }, { url: '/loginSetting', label: '登录设置', diff --git a/src/views/videoViewerWindow/index.vue b/src/views/videoViewerWindow/index.vue index b89a6879..620042a6 100644 --- a/src/views/videoViewerWindow/index.vue +++ b/src/views/videoViewerWindow/index.vue @@ -275,7 +275,7 @@ const previousVideo = async () => { // 如果是本地视频,从文件夹获取视频列表 const folderVideos = await getVideosFromCurrentFolder(currentVideoPath) if (folderVideos.length > 0) { - const currentVideoIndex = folderVideos.findIndex((path) => path === currentVideoPath) + const currentVideoIndex = folderVideos.indexOf(currentVideoPath) if (currentVideoIndex > 0) { const previousVideoPath = folderVideos[currentVideoIndex - 1] videoList.value[currentIndex.value] = previousVideoPath @@ -323,7 +323,7 @@ const nextVideo = async () => { // 如果是本地视频,从文件夹获取视频列表 const folderVideos = await getVideosFromCurrentFolder(currentVideoPath) if (folderVideos.length > 0) { - const currentVideoIndex = folderVideos.findIndex((path) => path === currentVideoPath) + const currentVideoIndex = folderVideos.indexOf(currentVideoPath) if (currentVideoIndex < folderVideos.length - 1) { const nextVideoPath = folderVideos[currentVideoIndex + 1] videoList.value[currentIndex.value] = nextVideoPath