From eded921144386252a6e835d4576b1b076ebea605 Mon Sep 17 00:00:00 2001 From: cysamurai Date: Wed, 8 Apr 2026 17:01:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E5=B1=8F=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- broadcast-client/.gitignore | 25 + broadcast-client/index.html | 12 + broadcast-client/package-lock.json | 2405 ++++++++ broadcast-client/package.json | 29 + broadcast-client/src-tauri/Cargo.lock | 5492 +++++++++++++++++ broadcast-client/src-tauri/Cargo.toml | 20 + broadcast-client/src-tauri/build.rs | 4 + .../src-tauri/capabilities/default.json | 14 + .../src-tauri/gen/schemas/acl-manifests.json | 1 + .../src-tauri/gen/schemas/capabilities.json | 1 + .../src-tauri/gen/schemas/desktop-schema.json | 2651 ++++++++ .../src-tauri/gen/schemas/windows-schema.json | 2651 ++++++++ broadcast-client/src-tauri/icons/128x128.png | Bin 0 -> 1374 bytes .../src-tauri/icons/128x128@2x.png | Bin 0 -> 2553 bytes broadcast-client/src-tauri/icons/32x32.png | Bin 0 -> 504 bytes broadcast-client/src-tauri/icons/64x64.png | Bin 0 -> 763 bytes .../src-tauri/icons/Square107x107Logo.png | Bin 0 -> 1144 bytes .../src-tauri/icons/Square142x142Logo.png | Bin 0 -> 1528 bytes .../src-tauri/icons/Square150x150Logo.png | Bin 0 -> 1454 bytes .../src-tauri/icons/Square284x284Logo.png | Bin 0 -> 2789 bytes .../src-tauri/icons/Square30x30Logo.png | Bin 0 -> 480 bytes .../src-tauri/icons/Square310x310Logo.png | Bin 0 -> 2986 bytes .../src-tauri/icons/Square44x44Logo.png | Bin 0 -> 617 bytes .../src-tauri/icons/Square71x71Logo.png | Bin 0 -> 860 bytes .../src-tauri/icons/Square89x89Logo.png | Bin 0 -> 1002 bytes .../src-tauri/icons/StoreLogo.png | Bin 0 -> 669 bytes .../android/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../icons/android/mipmap-hdpi/ic_launcher.png | Bin 0 -> 711 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 1741 bytes .../android/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 841 bytes .../icons/android/mipmap-mdpi/ic_launcher.png | Bin 0 -> 758 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 1178 bytes .../android/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 774 bytes .../android/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 1053 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 2405 bytes .../mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 1432 bytes .../android/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1611 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 3118 bytes .../mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 2045 bytes .../android/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 2018 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 4010 bytes .../mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 2490 bytes .../android/values/ic_launcher_background.xml | 4 + broadcast-client/src-tauri/icons/icon.icns | Bin 0 -> 29842 bytes broadcast-client/src-tauri/icons/icon.ico | Bin 0 -> 5741 bytes broadcast-client/src-tauri/icons/icon.png | Bin 0 -> 2037 bytes .../src-tauri/icons/ios/AppIcon-20x20@1x.png | Bin 0 -> 389 bytes .../icons/ios/AppIcon-20x20@2x-1.png | Bin 0 -> 638 bytes .../src-tauri/icons/ios/AppIcon-20x20@2x.png | Bin 0 -> 638 bytes .../src-tauri/icons/ios/AppIcon-20x20@3x.png | Bin 0 -> 736 bytes .../src-tauri/icons/ios/AppIcon-29x29@1x.png | Bin 0 -> 534 bytes .../icons/ios/AppIcon-29x29@2x-1.png | Bin 0 -> 669 bytes .../src-tauri/icons/ios/AppIcon-29x29@2x.png | Bin 0 -> 669 bytes .../src-tauri/icons/ios/AppIcon-29x29@3x.png | Bin 0 -> 971 bytes .../src-tauri/icons/ios/AppIcon-40x40@1x.png | Bin 0 -> 638 bytes .../icons/ios/AppIcon-40x40@2x-1.png | Bin 0 -> 882 bytes .../src-tauri/icons/ios/AppIcon-40x40@2x.png | Bin 0 -> 882 bytes .../src-tauri/icons/ios/AppIcon-40x40@3x.png | Bin 0 -> 1311 bytes .../src-tauri/icons/ios/AppIcon-512@2x.png | Bin 0 -> 14931 bytes .../src-tauri/icons/ios/AppIcon-60x60@2x.png | Bin 0 -> 1311 bytes .../src-tauri/icons/ios/AppIcon-60x60@3x.png | Bin 0 -> 1813 bytes .../src-tauri/icons/ios/AppIcon-76x76@1x.png | Bin 0 -> 875 bytes .../src-tauri/icons/ios/AppIcon-76x76@2x.png | Bin 0 -> 1716 bytes .../icons/ios/AppIcon-83.5x83.5@2x.png | Bin 0 -> 1817 bytes broadcast-client/src-tauri/src/lib.rs | 437 ++ broadcast-client/src-tauri/src/main.rs | 6 + broadcast-client/src-tauri/tauri.conf.json | 39 + broadcast-client/src/App.vue | 30 + .../src/components/RulerSegment.vue | 48 + .../src/components/RulerTicks.vue | 24 + .../src/components/SegmentChildren.vue | 25 + .../src/components/WindowAreasLayer.vue | 68 + .../src/composables/useBroadcastConfig.ts | 56 + .../src/composables/useRulerTicks.ts | 10 + .../src/composables/useScreenInfo.ts | 110 + .../src/composables/useSegmentLayout.ts | 17 + broadcast-client/src/env.d.ts | 1 + broadcast-client/src/main.ts | 8 + broadcast-client/src/models/config.ts | 50 + broadcast-client/src/models/ruler.ts | 48 + .../src/services/childSliceService.ts | 39 + broadcast-client/src/services/configStore.ts | 200 + .../src/services/segmentService.test.ts | 47 + .../src/services/segmentService.ts | 125 + .../src/services/tickService.test.ts | 27 + broadcast-client/src/services/tickService.ts | 32 + .../src/services/windowAreaSliceService.ts | 52 + broadcast-client/src/styles.css | 393 ++ broadcast-client/src/utils/timing.ts | 60 + broadcast-client/src/views/BroadcastView.vue | 106 + broadcast-client/src/views/ConfigView.vue | 477 ++ broadcast-client/tsconfig.json | 21 + broadcast-client/tsconfig.node.json | 10 + broadcast-client/vite.config.ts | 25 + broadcast-client/广播系统需求文档.md | 40 + broadcast-client/技术方案.md | 182 + broadcast-client/更新需求.md | 55 + broadcast-client/软件架构文档.md | 220 + broadcast-client/阶段4验收记录.md | 33 + call-client/.gitignore | 1 + call-client/src/host/dialog.ts | 13 +- call-client/src/utils/service.ts | 26 +- call-client/src/views/MainView.vue | 45 +- call-client/src/views/TicketListView.vue | 68 +- 104 files changed, 16557 insertions(+), 31 deletions(-) create mode 100644 broadcast-client/.gitignore create mode 100644 broadcast-client/index.html create mode 100644 broadcast-client/package-lock.json create mode 100644 broadcast-client/package.json create mode 100644 broadcast-client/src-tauri/Cargo.lock create mode 100644 broadcast-client/src-tauri/Cargo.toml create mode 100644 broadcast-client/src-tauri/build.rs create mode 100644 broadcast-client/src-tauri/capabilities/default.json create mode 100644 broadcast-client/src-tauri/gen/schemas/acl-manifests.json create mode 100644 broadcast-client/src-tauri/gen/schemas/capabilities.json create mode 100644 broadcast-client/src-tauri/gen/schemas/desktop-schema.json create mode 100644 broadcast-client/src-tauri/gen/schemas/windows-schema.json create mode 100644 broadcast-client/src-tauri/icons/128x128.png create mode 100644 broadcast-client/src-tauri/icons/128x128@2x.png create mode 100644 broadcast-client/src-tauri/icons/32x32.png create mode 100644 broadcast-client/src-tauri/icons/64x64.png create mode 100644 broadcast-client/src-tauri/icons/Square107x107Logo.png create mode 100644 broadcast-client/src-tauri/icons/Square142x142Logo.png create mode 100644 broadcast-client/src-tauri/icons/Square150x150Logo.png create mode 100644 broadcast-client/src-tauri/icons/Square284x284Logo.png create mode 100644 broadcast-client/src-tauri/icons/Square30x30Logo.png create mode 100644 broadcast-client/src-tauri/icons/Square310x310Logo.png create mode 100644 broadcast-client/src-tauri/icons/Square44x44Logo.png create mode 100644 broadcast-client/src-tauri/icons/Square71x71Logo.png create mode 100644 broadcast-client/src-tauri/icons/Square89x89Logo.png create mode 100644 broadcast-client/src-tauri/icons/StoreLogo.png create mode 100644 broadcast-client/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 broadcast-client/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png create mode 100644 broadcast-client/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 broadcast-client/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png create mode 100644 broadcast-client/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png create mode 100644 broadcast-client/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 broadcast-client/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png create mode 100644 broadcast-client/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png create mode 100644 broadcast-client/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 broadcast-client/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png create mode 100644 broadcast-client/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png create mode 100644 broadcast-client/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 broadcast-client/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 broadcast-client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png create mode 100644 broadcast-client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 broadcast-client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 broadcast-client/src-tauri/icons/android/values/ic_launcher_background.xml create mode 100644 broadcast-client/src-tauri/icons/icon.icns create mode 100644 broadcast-client/src-tauri/icons/icon.ico create mode 100644 broadcast-client/src-tauri/icons/icon.png create mode 100644 broadcast-client/src-tauri/icons/ios/AppIcon-20x20@1x.png create mode 100644 broadcast-client/src-tauri/icons/ios/AppIcon-20x20@2x-1.png create mode 100644 broadcast-client/src-tauri/icons/ios/AppIcon-20x20@2x.png create mode 100644 broadcast-client/src-tauri/icons/ios/AppIcon-20x20@3x.png create mode 100644 broadcast-client/src-tauri/icons/ios/AppIcon-29x29@1x.png create mode 100644 broadcast-client/src-tauri/icons/ios/AppIcon-29x29@2x-1.png create mode 100644 broadcast-client/src-tauri/icons/ios/AppIcon-29x29@2x.png create mode 100644 broadcast-client/src-tauri/icons/ios/AppIcon-29x29@3x.png create mode 100644 broadcast-client/src-tauri/icons/ios/AppIcon-40x40@1x.png create mode 100644 broadcast-client/src-tauri/icons/ios/AppIcon-40x40@2x-1.png create mode 100644 broadcast-client/src-tauri/icons/ios/AppIcon-40x40@2x.png create mode 100644 broadcast-client/src-tauri/icons/ios/AppIcon-40x40@3x.png create mode 100644 broadcast-client/src-tauri/icons/ios/AppIcon-512@2x.png create mode 100644 broadcast-client/src-tauri/icons/ios/AppIcon-60x60@2x.png create mode 100644 broadcast-client/src-tauri/icons/ios/AppIcon-60x60@3x.png create mode 100644 broadcast-client/src-tauri/icons/ios/AppIcon-76x76@1x.png create mode 100644 broadcast-client/src-tauri/icons/ios/AppIcon-76x76@2x.png create mode 100644 broadcast-client/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png create mode 100644 broadcast-client/src-tauri/src/lib.rs create mode 100644 broadcast-client/src-tauri/src/main.rs create mode 100644 broadcast-client/src-tauri/tauri.conf.json create mode 100644 broadcast-client/src/App.vue create mode 100644 broadcast-client/src/components/RulerSegment.vue create mode 100644 broadcast-client/src/components/RulerTicks.vue create mode 100644 broadcast-client/src/components/SegmentChildren.vue create mode 100644 broadcast-client/src/components/WindowAreasLayer.vue create mode 100644 broadcast-client/src/composables/useBroadcastConfig.ts create mode 100644 broadcast-client/src/composables/useRulerTicks.ts create mode 100644 broadcast-client/src/composables/useScreenInfo.ts create mode 100644 broadcast-client/src/composables/useSegmentLayout.ts create mode 100644 broadcast-client/src/env.d.ts create mode 100644 broadcast-client/src/main.ts create mode 100644 broadcast-client/src/models/config.ts create mode 100644 broadcast-client/src/models/ruler.ts create mode 100644 broadcast-client/src/services/childSliceService.ts create mode 100644 broadcast-client/src/services/configStore.ts create mode 100644 broadcast-client/src/services/segmentService.test.ts create mode 100644 broadcast-client/src/services/segmentService.ts create mode 100644 broadcast-client/src/services/tickService.test.ts create mode 100644 broadcast-client/src/services/tickService.ts create mode 100644 broadcast-client/src/services/windowAreaSliceService.ts create mode 100644 broadcast-client/src/styles.css create mode 100644 broadcast-client/src/utils/timing.ts create mode 100644 broadcast-client/src/views/BroadcastView.vue create mode 100644 broadcast-client/src/views/ConfigView.vue create mode 100644 broadcast-client/tsconfig.json create mode 100644 broadcast-client/tsconfig.node.json create mode 100644 broadcast-client/vite.config.ts create mode 100644 broadcast-client/广播系统需求文档.md create mode 100644 broadcast-client/技术方案.md create mode 100644 broadcast-client/更新需求.md create mode 100644 broadcast-client/软件架构文档.md create mode 100644 broadcast-client/阶段4验收记录.md diff --git a/broadcast-client/.gitignore b/broadcast-client/.gitignore new file mode 100644 index 0000000..4655360 --- /dev/null +++ b/broadcast-client/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +src-tauri/target/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/broadcast-client/index.html b/broadcast-client/index.html new file mode 100644 index 0000000..66973c5 --- /dev/null +++ b/broadcast-client/index.html @@ -0,0 +1,12 @@ + + + + + + Broadcast Client + + +
+ + + diff --git a/broadcast-client/package-lock.json b/broadcast-client/package-lock.json new file mode 100644 index 0000000..1843f18 --- /dev/null +++ b/broadcast-client/package-lock.json @@ -0,0 +1,2405 @@ +{ + "name": "broadcast-client", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "broadcast-client", + "version": "0.1.0", + "dependencies": { + "@tauri-apps/api": "^2", + "@tauri-apps/plugin-opener": "^2", + "@tauri-apps/plugin-store": "^2", + "element-plus": "^2.11.4", + "vue": "^3.5.13" + }, + "devDependencies": { + "@tauri-apps/cli": "^2", + "@vitejs/plugin-vue": "^5.2.1", + "typescript": "~5.6.2", + "vite": "^6.0.3", + "vitest": "^3.2.4", + "vue-tsc": "^2.1.10" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "license": "MIT" + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@popperjs/core": { + "name": "@sxzz/popperjs-es", + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@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.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", + "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", + "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", + "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", + "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", + "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", + "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", + "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", + "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", + "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", + "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", + "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", + "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", + "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", + "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", + "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", + "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", + "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", + "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", + "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", + "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", + "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", + "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", + "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", + "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", + "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tauri-apps/api": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.10.1.tgz", + "integrity": "sha512-hKL/jWf293UDSUN09rR69hrToyIXBb8CjGaWC7gfinvnQrBVvnLr08FeFi38gxtugAVyVcTa5/FD/Xnkb1siBw==", + "license": "Apache-2.0 OR MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/cli": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.10.1.tgz", + "integrity": "sha512-jQNGF/5quwORdZSSLtTluyKQ+o6SMa/AUICfhf4egCGFdMHqWssApVgYSbg+jmrZoc8e1DscNvjTnXtlHLS11g==", + "dev": true, + "license": "Apache-2.0 OR MIT", + "bin": { + "tauri": "tauri.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + }, + "optionalDependencies": { + "@tauri-apps/cli-darwin-arm64": "2.10.1", + "@tauri-apps/cli-darwin-x64": "2.10.1", + "@tauri-apps/cli-linux-arm-gnueabihf": "2.10.1", + "@tauri-apps/cli-linux-arm64-gnu": "2.10.1", + "@tauri-apps/cli-linux-arm64-musl": "2.10.1", + "@tauri-apps/cli-linux-riscv64-gnu": "2.10.1", + "@tauri-apps/cli-linux-x64-gnu": "2.10.1", + "@tauri-apps/cli-linux-x64-musl": "2.10.1", + "@tauri-apps/cli-win32-arm64-msvc": "2.10.1", + "@tauri-apps/cli-win32-ia32-msvc": "2.10.1", + "@tauri-apps/cli-win32-x64-msvc": "2.10.1" + } + }, + "node_modules/@tauri-apps/cli-darwin-arm64": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.10.1.tgz", + "integrity": "sha512-Z2OjCXiZ+fbYZy7PmP3WRnOpM9+Fy+oonKDEmUE6MwN4IGaYqgceTjwHucc/kEEYZos5GICve35f7ZiizgqEnQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-darwin-x64": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.10.1.tgz", + "integrity": "sha512-V/irQVvjPMGOTQqNj55PnQPVuH4VJP8vZCN7ajnj+ZS8Kom1tEM2hR3qbbIRoS3dBKs5mbG8yg1WC+97dq17Pw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.10.1.tgz", + "integrity": "sha512-Hyzwsb4VnCWKGfTw+wSt15Z2pLw2f0JdFBfq2vHBOBhvg7oi6uhKiF87hmbXOBXUZaGkyRDkCHsdzJcIfoJC2w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-gnu": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.10.1.tgz", + "integrity": "sha512-OyOYs2t5GkBIvyWjA1+h4CZxTcdz1OZPCWAPz5DYEfB0cnWHERTnQ/SLayQzncrT0kwRoSfSz9KxenkyJoTelA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-musl": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.10.1.tgz", + "integrity": "sha512-MIj78PDDGjkg3NqGptDOGgfXks7SYJwhiMh8SBoZS+vfdz7yP5jN18bNaLnDhsVIPARcAhE1TlsZe/8Yxo2zqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-riscv64-gnu": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.10.1.tgz", + "integrity": "sha512-X0lvOVUg8PCVaoEtEAnpxmnkwlE1gcMDTqfhbefICKDnOTJ5Est3qL0SrWxizDackIOKBcvtpejrSiVpuJI1kw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-gnu": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.10.1.tgz", + "integrity": "sha512-2/12bEzsJS9fAKybxgicCDFxYD1WEI9kO+tlDwX5znWG2GwMBaiWcmhGlZ8fi+DMe9CXlcVarMTYc0L3REIRxw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-musl": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.10.1.tgz", + "integrity": "sha512-Y8J0ZzswPz50UcGOFuXGEMrxbjwKSPgXftx5qnkuMs2rmwQB5ssvLb6tn54wDSYxe7S6vlLob9vt0VKuNOaCIQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-arm64-msvc": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.10.1.tgz", + "integrity": "sha512-iSt5B86jHYAPJa/IlYw++SXtFPGnWtFJriHn7X0NFBVunF6zu9+/zOn8OgqIWSl8RgzhLGXQEEtGBdR4wzpVgg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-ia32-msvc": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.10.1.tgz", + "integrity": "sha512-gXyxgEzsFegmnWywYU5pEBURkcFN/Oo45EAwvZrHMh+zUSEAvO5E8TXsgPADYm31d1u7OQU3O3HsYfVBf2moHw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-x64-msvc": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.10.1.tgz", + "integrity": "sha512-6Cn7YpPFwzChy0ERz6djKEmUehWrYlM+xTaNzGPgZocw3BD7OfwfWHKVWxXzdjEW2KfKkHddfdxK1XXTYqBRLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/plugin-opener": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-opener/-/plugin-opener-2.5.3.tgz", + "integrity": "sha512-CCcUltXMOfUEArbf3db3kCE7Ggy1ExBEBl51Ko2ODJ6GDYHRp1nSNlQm5uNCFY5k7/ufaK5Ib3Du/Zir19IYQQ==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.8.0" + } + }, + "node_modules/@tauri-apps/plugin-store": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-store/-/plugin-store-2.4.2.tgz", + "integrity": "sha512-0ClHS50Oq9HEvLPhNzTNFxbWVOqoAp3dRvtewQBeqfIQ0z5m3JRnOISIn2ZVPCrQC0MyGyhTS9DWhHjpigQE7A==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.8.0" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", + "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@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.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@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/@vitest/expect": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.2.4", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.2.4", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.32.tgz", + "integrity": "sha512-4x74Tbtqnda8s/NSD6e1Dr5p1c8HdMU5RWSjMSUzb8RTcUQqevDCxVAitcLBKT+ie3o0Dl9crc/S/opJM7qBGQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.2", + "@vue/shared": "3.5.32", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.32.tgz", + "integrity": "sha512-ybHAu70NtiEI1fvAUz3oXZqkUYEe5J98GjMDpTGl5iHb0T15wQYLR4wE3h9xfuTNA+Cm2f4czfe8B4s+CCH57Q==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.32", + "@vue/shared": "3.5.32" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.32.tgz", + "integrity": "sha512-8UYUYo71cP/0YHMO814TRZlPuUUw3oifHuMR7Wp9SNoRSrxRQnhMLNlCeaODNn6kNTJsjFoQ/kqIj4qGvya4Xg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.2", + "@vue/compiler-core": "3.5.32", + "@vue/compiler-dom": "3.5.32", + "@vue/compiler-ssr": "3.5.32", + "@vue/shared": "3.5.32", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.8", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.32.tgz", + "integrity": "sha512-Gp4gTs22T3DgRotZ8aA/6m2jMR+GMztvBXUBEUOYOcST+giyGWJ4WvFd7QLHBkzTxkfOt8IELKNdpzITLbA2rw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.32", + "@vue/shared": "3.5.32" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@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.npmjs.org/@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.32", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.32.tgz", + "integrity": "sha512-/ORasxSGvZ6MN5gc+uE364SxFdJ0+WqVG0CENXaGW58TOCdrAW76WWaplDtECeS1qphvtBZtR+3/o1g1zL4xPQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.32" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.32.tgz", + "integrity": "sha512-pDrXCejn4UpFDFmMd27AcJEbHaLemaE5o4pbb7sLk79SRIhc6/t34BQA7SGNgYtbMnvbF/HHOftYBgFJtUoJUQ==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.32", + "@vue/shared": "3.5.32" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.32.tgz", + "integrity": "sha512-1CDVv7tv/IV13V8Nip1k/aaObVbWqRlVCVezTwx3K07p7Vxossp5JU1dcPNhJk3w347gonIUT9jQOGutyJrSVQ==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.32", + "@vue/runtime-core": "3.5.32", + "@vue/shared": "3.5.32", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.32.tgz", + "integrity": "sha512-IOjm2+JQwRFS7W28HNuJeXQle9KdZbODFY7hFGVtnnghF51ta20EWAZJHX+zLGtsHhaU6uC9BGPV52KVpYryMQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.32", + "@vue/shared": "3.5.32" + }, + "peerDependencies": { + "vue": "3.5.32" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.32.tgz", + "integrity": "sha512-ksNyrmRQzWJJ8n3cRDuSF7zNNontuJg1YHnmWRJd2AMu8Ij2bqwiiri2lH5rHtYPZjj4STkNcgcmiQqlOjiYGg==", + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.0.0.tgz", + "integrity": "sha512-C12RukhXiJCbx4MGhjmd/gH52TjJsc3G0E0kQj/kb19H3Nt6n1CA4DRWuTdWWcaFRdlTe0npWDS942mvacvNBw==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "12.0.0", + "@vueuse/shared": "12.0.0", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/metadata": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.0.0.tgz", + "integrity": "sha512-Yzimd1D3sjxTDOlF05HekU5aSGdKjxhuhRFHA7gDWLn57PRbBIh+SF5NmjhJ0WRgF3my7T8LBucyxdFJjIfRJQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.0.0.tgz", + "integrity": "sha512-3i6qtcq2PIio5i/vVYidkkcgvmTjCqrf26u+Fd4LhnbBmIT6FN8y6q/GJERp8lfcB9zVEfjdV0Br0443qZuJpw==", + "license": "MIT", + "dependencies": { + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/alien-signals": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz", + "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/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.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/check-error": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", + "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/element-plus": { + "version": "2.13.6", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.13.6.tgz", + "integrity": "sha512-XHgwXr8Fjz6i+6BaqFhAbae/dJbG7bBAAlHrY3pWL7dpj+JcqcOyKYt4Oy5KP86FQwS1k4uIZDjCx2FyUR5lDg==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^4.2.0", + "@element-plus/icons-vue": "^2.3.2", + "@floating-ui/dom": "^1.0.1", + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", + "@types/lodash": "^4.17.20", + "@types/lodash-es": "^4.17.12", + "@vueuse/core": "12.0.0", + "async-validator": "^4.2.5", + "dayjs": "^1.11.19", + "lodash": "^4.17.23", + "lodash-es": "^4.17.23", + "lodash-unified": "^1.0.3", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.2.0", + "vue-component-type-helpers": "^3.2.4" + }, + "peerDependencies": { + "vue": "^3.3.0" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/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/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/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/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/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.npmjs.org/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.npmjs.org/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": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/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.npmjs.org/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.npmjs.org/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/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/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.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/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/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "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.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", + "license": "BSD-3-Clause" + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/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.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.9.tgz", + "integrity": "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==", + "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.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", + "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.1", + "@rollup/rollup-android-arm64": "4.60.1", + "@rollup/rollup-darwin-arm64": "4.60.1", + "@rollup/rollup-darwin-x64": "4.60.1", + "@rollup/rollup-freebsd-arm64": "4.60.1", + "@rollup/rollup-freebsd-x64": "4.60.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", + "@rollup/rollup-linux-arm-musleabihf": "4.60.1", + "@rollup/rollup-linux-arm64-gnu": "4.60.1", + "@rollup/rollup-linux-arm64-musl": "4.60.1", + "@rollup/rollup-linux-loong64-gnu": "4.60.1", + "@rollup/rollup-linux-loong64-musl": "4.60.1", + "@rollup/rollup-linux-ppc64-gnu": "4.60.1", + "@rollup/rollup-linux-ppc64-musl": "4.60.1", + "@rollup/rollup-linux-riscv64-gnu": "4.60.1", + "@rollup/rollup-linux-riscv64-musl": "4.60.1", + "@rollup/rollup-linux-s390x-gnu": "4.60.1", + "@rollup/rollup-linux-x64-gnu": "4.60.1", + "@rollup/rollup-linux-x64-musl": "4.60.1", + "@rollup/rollup-openbsd-x64": "4.60.1", + "@rollup/rollup-openharmony-arm64": "4.60.1", + "@rollup/rollup-win32-arm64-msvc": "4.60.1", + "@rollup/rollup-win32-ia32-msvc": "4.60.1", + "@rollup/rollup-win32-x64-gnu": "4.60.1", + "@rollup/rollup-win32-x64-msvc": "4.60.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/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/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "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/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", + "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/vite": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.2.tgz", + "integrity": "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==", + "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/vite-node": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.2.4", + "@vitest/ui": "3.2.4", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/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.32", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.32.tgz", + "integrity": "sha512-vM4z4Q9tTafVfMAK7IVzmxg34rSzTFMyIe0UUEijUCkn9+23lj0WRfA83dg7eQZIUlgOSGrkViIaCfqSAUXsMw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.32", + "@vue/compiler-sfc": "3.5.32", + "@vue/runtime-dom": "3.5.32", + "@vue/server-renderer": "3.5.32", + "@vue/shared": "3.5.32" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-component-type-helpers": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-3.2.6.tgz", + "integrity": "sha512-O02tnvIfOQVmnvoWwuSydwRoHjZVt8UEBR+2p4rT35p8GAy5VTlWP8o5qXfJR/GWCN0nVZoYWsVUvx2jwgdBmQ==", + "license": "MIT" + }, + "node_modules/vue-tsc": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/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/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + } + } +} diff --git a/broadcast-client/package.json b/broadcast-client/package.json new file mode 100644 index 0000000..9432671 --- /dev/null +++ b/broadcast-client/package.json @@ -0,0 +1,29 @@ +{ + "name": "broadcast-client", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc --noEmit && vite build", + "test": "vitest", + "test:run": "vitest run", + "preview": "vite preview", + "tauri": "tauri" + }, + "dependencies": { + "@tauri-apps/api": "^2", + "@tauri-apps/plugin-opener": "^2", + "@tauri-apps/plugin-store": "^2", + "element-plus": "^2.11.4", + "vue": "^3.5.13" + }, + "devDependencies": { + "@tauri-apps/cli": "^2", + "@vitejs/plugin-vue": "^5.2.1", + "typescript": "~5.6.2", + "vite": "^6.0.3", + "vitest": "^3.2.4", + "vue-tsc": "^2.1.10" + } +} diff --git a/broadcast-client/src-tauri/Cargo.lock b/broadcast-client/src-tauri/Cargo.lock new file mode 100644 index 0000000..09b0773 --- /dev/null +++ b/broadcast-client/src-tauri/Cargo.lock @@ -0,0 +1,5492 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "async-signal" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "atk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +dependencies = [ + "serde_core", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "broadcast-client" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "tauri", + "tauri-build", + "tauri-plugin-opener", + "tauri-plugin-store", +] + +[[package]] +name = "brotli" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +dependencies = [ + "serde", +] + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.11.0", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "cargo_toml" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" +dependencies = [ + "serde", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "cc" +version = "1.2.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7a4d3ec6524d28a329fc53654bbadc9bdd7b0431f5d65f1a56ffb28a1ee5283" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chrono" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link 0.2.1", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" +dependencies = [ + "bitflags 2.11.0", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.11.0", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.29.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "matches", + "phf 0.10.1", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf 0.13.1", + "smallvec", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ctor" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "derive_more" +version = "0.99.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.117", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.117", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.11.0", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dom_query" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89" +dependencies = [ + "bit-set", + "cssparser 0.36.0", + "foldhash 0.2.0", + "html5ever 0.38.0", + "precomputed-hash", + "selectors 0.36.1", + "tendril 0.5.0", +] + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "embed-resource" +version = "3.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63a1d0de4f2249aa0ff5884d7080814f446bb241a559af6c170a41e878ed2d45" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 0.9.12+spec-1.1.0", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gdk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "wasip2", + "wasip3", +] + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.11.0", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "html5ever" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" +dependencies = [ + "log", + "mac", + "markup5ever 0.14.1", + "match_token", +] + +[[package]] +name = "html5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" +dependencies = [ + "log", + "markup5ever 0.38.0", +] + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" +dependencies = [ + "byteorder", + "png", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45a8a2b9cb3e0b0c1803dbb0758ffac5de2f425b23c28f518faabd9d805342ff" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", + "serde", + "serde_core", +] + +[[package]] +name = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", +] + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "iri-string" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "js-sys" +version = "0.3.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" +dependencies = [ + "cfg-if", + "futures-util", + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.11.0", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "kuchikiki" +version = "0.8.8-speedreader" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" +dependencies = [ + "cssparser 0.29.6", + "html5ever 0.29.1", + "indexmap 2.13.1", + "selectors 0.24.0", +] + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] + +[[package]] +name = "libc" +version = "0.2.184" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libredox" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ddbf48fd451246b1f8c2610bd3b4ac0cc6e149d89832867093ab69a17194f08" +dependencies = [ + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "markup5ever" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" +dependencies = [ + "log", + "phf 0.11.3", + "phf_codegen 0.11.3", + "string_cache 0.8.9", + "string_cache_codegen 0.5.4", + "tendril 0.4.3", +] + +[[package]] +name = "markup5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862" +dependencies = [ + "log", + "tendril 0.5.0", + "web_atoms", +] + +[[package]] +name = "match_token" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", +] + +[[package]] +name = "muda" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c9fec5a4e89860383d778d10563a605838f8f0b2f9303868937e5ff32e86177" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror 2.0.18", + "windows-sys 0.60.2", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.11.0", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "num-conv" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.11.0", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.11.0", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-exception-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +dependencies = [ + "cc", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "open" +version = "5.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc" +dependencies = [ + "dunce", + "is-wsl", + "libc", + "pathdiff", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_shared 0.8.0", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_macros 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros 0.13.1", + "phf_shared 0.13.1", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared 0.11.3", + "rand 0.8.5", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_macros" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher 1.0.2", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher 1.0.2", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plist" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" +dependencies = [ + "base64 0.22.1", + "indexmap 2.13.1", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.117", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.11+spec-1.1.0", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.18", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "reqwest" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "rustc-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.11.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.117", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "selectors" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" +dependencies = [ + "bitflags 1.3.2", + "cssparser 0.29.6", + "derive_more 0.99.20", + "fxhash", + "log", + "phf 0.8.0", + "phf_codegen 0.8.0", + "precomputed-hash", + "servo_arc 0.2.0", + "smallvec", +] + +[[package]] +name = "selectors" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c" +dependencies = [ + "bitflags 2.11.0", + "cssparser 0.36.0", + "derive_more 2.1.1", + "log", + "new_debug_unreachable", + "phf 0.13.1", + "phf_codegen 0.13.1", + "precomputed-hash", + "rustc-hash", + "servo_arc 0.4.3", + "smallvec", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_with" +version = "3.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.13.1", + "schemars 0.9.0", + "schemars 1.2.1", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "servo_arc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "servo_arc" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "siphasher" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "bytemuck", + "js-sys", + "ndk", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall", + "tracing", + "wasm-bindgen", + "web-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "string_cache" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared 0.11.3", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared 0.13.1", + "precomputed-hash", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", +] + +[[package]] +name = "string_cache_codegen" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "swift-rs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml 0.8.2", + "version-compare", +] + +[[package]] +name = "tao" +version = "0.34.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9103edf55f2da3c82aea4c7fab7c4241032bfeea0e71fa557d98e00e7ce7cc20" +dependencies = [ + "bitflags 2.11.0", + "block2", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dispatch2", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "once_cell", + "parking_lot", + "raw-window-handle", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "2.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da77cc00fb9028caf5b5d4650f75e31f1ef3693459dfca7f7e506d1ecef0ba2d" +dependencies = [ + "anyhow", + "bytes", + "cookie", + "dirs", + "dunce", + "embed_plist", + "getrandom 0.3.4", + "glob", + "gtk", + "heck 0.5.0", + "http", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "percent-encoding", + "plist", + "raw-window-handle", + "reqwest", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.18", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bbc990d1dbf57a8e1c7fa2327f2a614d8b757805603c1b9ba5c81bade09fd4d" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "toml 0.9.12+spec-1.1.0", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a24476afd977c5d5d169f72425868613d82747916dd29e0a357c84c4bd6d29" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.117", + "tauri-utils", + "thiserror 2.0.18", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d39b349a98dadaffebb73f0a40dcd1f23c999211e5a2e744403db384d0c33de7" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-plugin" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddde7d51c907b940fb573006cdda9a642d6a7c8153657e88f8a5c3c9290cd4aa" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri-utils", + "toml 0.9.12+spec-1.1.0", + "walkdir", +] + +[[package]] +name = "tauri-plugin-opener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc624469b06f59f5a29f874bbc61a2ed737c0f9c23ef09855a292c389c42e83f" +dependencies = [ + "dunce", + "glob", + "objc2-app-kit", + "objc2-foundation", + "open", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", + "url", + "windows", + "zbus", +] + +[[package]] +name = "tauri-plugin-store" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca1a8ff83c269b115e98726ffc13f9e548a10161544a92ad121d6d0a96e16ea" +dependencies = [ + "dunce", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", + "tokio", + "tracing", +] + +[[package]] +name = "tauri-runtime" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2826d79a3297ed08cd6ea7f412644ef58e32969504bc4fbd8d7dbeabc4445ea2" +dependencies = [ + "cookie", + "dpi", + "gtk", + "http", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webview2-com", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11ea2e6f801d275fdd890d6c9603736012742a1c33b96d0db788c9cdebf7f9e" +dependencies = [ + "gtk", + "http", + "jni", + "log", + "objc2", + "objc2-app-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219a1f983a2af3653f75b5747f76733b0da7ff03069c7a41901a5eb3ace4557d" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dunce", + "glob", + "html5ever 0.29.1", + "http", + "infer", + "json-patch", + "kuchikiki", + "log", + "memchr", + "phf 0.11.3", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.18", + "toml 0.9.12+spec-1.1.0", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1087b111fe2b005e42dbdc1990fc18593234238d47453b0c99b7de1c9ab2c1e0" +dependencies = [ + "dunce", + "embed-resource", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.2", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "tendril" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4790fc369d5a530f4b544b094e31388b9b3a37c0f4652ade4505945f5660d24" +dependencies = [ + "new_debug_unreachable", + "utf-8", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bd1c4c0fc4a7ab90fc15ef6daaa3ec3b893f004f915f2392557ed23237820cd" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap 2.13.1", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.13.1", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.13.1", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.25.11+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" +dependencies = [ + "indexmap 2.13.1", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.1", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow 1.0.1", +] + +[[package]] +name = "toml_writer" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags 2.11.0", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tray-icon" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e85aa143ceb072062fc4d6356c1b520a51d636e7bc8e77ec94be3608e5e80c" +dependencies = [ + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror 2.0.18", + "windows-sys 0.60.2", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "uds_windows" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" +dependencies = [ + "memoffset", + "tempfile", + "windows-sys 0.61.2", +] + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" +dependencies = [ + "getrandom 0.4.2", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03623de6905b7206edd0a75f69f747f134b7f0a2323392d664448bf2d3c5d87e" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.13.1", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.0", + "hashbrown 0.15.5", + "indexmap 2.13.1", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd70027e39b12f0849461e08ffc50b9cd7688d942c1c8e3c7b22273236b4dd0a" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web_atoms" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57a9779e9f04d2ac1ce317aee707aa2f6b773afba7b931222bff6983843b1576" +dependencies = [ + "phf 0.13.1", + "phf_codegen 0.13.1", + "string_cache 0.9.0", + "string_cache_codegen 0.6.1", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[package]] +name = "webview2-com" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows", + "windows-core 0.61.2", + "windows-implement", + "windows-interface", +] + +[[package]] +name = "webview2-com-macros" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "webview2-com-sys" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" +dependencies = [ + "thiserror 2.0.18", + "windows", + "windows-core 0.61.2", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "window-vibrancy" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" +dependencies = [ + "cfg-if", + "windows-sys 0.59.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap 2.13.1", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.11.0", + "indexmap 2.13.1", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.13.1", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "wry" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a8135d8676225e5744de000d4dff5a082501bf7db6a1c1495034f8c314edbc" +dependencies = [ + "base64 0.22.1", + "block2", + "cookie", + "crossbeam-channel", + "dirs", + "dom_query", + "dpi", + "dunce", + "gdkx11", + "gtk", + "http", + "javascriptcore-rs", + "jni", + "libc", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2", + "soup3", + "tao-macros", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "yoke" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zbus" +version = "5.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca82f95dbd3943a40a53cfded6c2d0a2ca26192011846a1810c4256ef92c60bc" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 0.7.15", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897e79616e84aac4b2c46e9132a4f63b93105d54fe8c0e8f6bffc21fa8d49222" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" +dependencies = [ + "serde", + "winnow 0.7.15", + "zvariant", +] + +[[package]] +name = "zerocopy" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zerofrom" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zvariant" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5708299b21903bbe348e94729f22c49c55d04720a004aa350f1f9c122fd2540b" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow 0.7.15", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b59b012ebe9c46656f9cc08d8da8b4c726510aef12559da3e5f1bf72780752c" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 2.0.117", + "winnow 0.7.15", +] diff --git a/broadcast-client/src-tauri/Cargo.toml b/broadcast-client/src-tauri/Cargo.toml new file mode 100644 index 0000000..924aa60 --- /dev/null +++ b/broadcast-client/src-tauri/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "broadcast-client" +version = "0.1.0" +description = "Broadcast Ruler Client" +authors = ["team"] +edition = "2021" + +[lib] +name = "broadcast_client_lib" +crate-type = ["staticlib", "cdylib", "rlib"] + +[build-dependencies] +tauri-build = { version = "2", features = [] } + +[dependencies] +tauri = { version = "2", features = [] } +tauri-plugin-opener = "2" +tauri-plugin-store = "2" +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/broadcast-client/src-tauri/build.rs b/broadcast-client/src-tauri/build.rs new file mode 100644 index 0000000..a0e9f41 --- /dev/null +++ b/broadcast-client/src-tauri/build.rs @@ -0,0 +1,4 @@ +fn main() { + println!("cargo:rustc-check-cfg=cfg(mobile)"); + tauri_build::build() +} diff --git a/broadcast-client/src-tauri/capabilities/default.json b/broadcast-client/src-tauri/capabilities/default.json new file mode 100644 index 0000000..8897cfb --- /dev/null +++ b/broadcast-client/src-tauri/capabilities/default.json @@ -0,0 +1,14 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "Default capability for broadcast window", + "windows": ["main", "sync-config"], + "permissions": [ + "core:default", + "core:window:allow-set-position", + "core:window:allow-set-size", + "core:window:allow-start-dragging", + "opener:default", + "store:default" + ] +} diff --git a/broadcast-client/src-tauri/gen/schemas/acl-manifests.json b/broadcast-client/src-tauri/gen/schemas/acl-manifests.json new file mode 100644 index 0000000..0237072 --- /dev/null +++ b/broadcast-client/src-tauri/gen/schemas/acl-manifests.json @@ -0,0 +1 @@ +{"core":{"default_permission":{"identifier":"default","description":"Default core plugins set.","permissions":["core:path:default","core:event:default","core:window:default","core:webview:default","core:app:default","core:image:default","core:resources:default","core:menu:default","core:tray:default"]},"permissions":{},"permission_sets":{},"global_scope_schema":null},"core:app":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-version","allow-name","allow-tauri-version","allow-identifier","allow-bundle-type","allow-register-listener","allow-remove-listener"]},"permissions":{"allow-app-hide":{"identifier":"allow-app-hide","description":"Enables the app_hide command without any pre-configured scope.","commands":{"allow":["app_hide"],"deny":[]}},"allow-app-show":{"identifier":"allow-app-show","description":"Enables the app_show command without any pre-configured scope.","commands":{"allow":["app_show"],"deny":[]}},"allow-bundle-type":{"identifier":"allow-bundle-type","description":"Enables the bundle_type command without any pre-configured scope.","commands":{"allow":["bundle_type"],"deny":[]}},"allow-default-window-icon":{"identifier":"allow-default-window-icon","description":"Enables the default_window_icon command without any pre-configured scope.","commands":{"allow":["default_window_icon"],"deny":[]}},"allow-fetch-data-store-identifiers":{"identifier":"allow-fetch-data-store-identifiers","description":"Enables the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":["fetch_data_store_identifiers"],"deny":[]}},"allow-identifier":{"identifier":"allow-identifier","description":"Enables the identifier command without any pre-configured scope.","commands":{"allow":["identifier"],"deny":[]}},"allow-name":{"identifier":"allow-name","description":"Enables the name command without any pre-configured scope.","commands":{"allow":["name"],"deny":[]}},"allow-register-listener":{"identifier":"allow-register-listener","description":"Enables the register_listener command without any pre-configured scope.","commands":{"allow":["register_listener"],"deny":[]}},"allow-remove-data-store":{"identifier":"allow-remove-data-store","description":"Enables the remove_data_store command without any pre-configured scope.","commands":{"allow":["remove_data_store"],"deny":[]}},"allow-remove-listener":{"identifier":"allow-remove-listener","description":"Enables the remove_listener command without any pre-configured scope.","commands":{"allow":["remove_listener"],"deny":[]}},"allow-set-app-theme":{"identifier":"allow-set-app-theme","description":"Enables the set_app_theme command without any pre-configured scope.","commands":{"allow":["set_app_theme"],"deny":[]}},"allow-set-dock-visibility":{"identifier":"allow-set-dock-visibility","description":"Enables the set_dock_visibility command without any pre-configured scope.","commands":{"allow":["set_dock_visibility"],"deny":[]}},"allow-tauri-version":{"identifier":"allow-tauri-version","description":"Enables the tauri_version command without any pre-configured scope.","commands":{"allow":["tauri_version"],"deny":[]}},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]}},"deny-app-hide":{"identifier":"deny-app-hide","description":"Denies the app_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["app_hide"]}},"deny-app-show":{"identifier":"deny-app-show","description":"Denies the app_show command without any pre-configured scope.","commands":{"allow":[],"deny":["app_show"]}},"deny-bundle-type":{"identifier":"deny-bundle-type","description":"Denies the bundle_type command without any pre-configured scope.","commands":{"allow":[],"deny":["bundle_type"]}},"deny-default-window-icon":{"identifier":"deny-default-window-icon","description":"Denies the default_window_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["default_window_icon"]}},"deny-fetch-data-store-identifiers":{"identifier":"deny-fetch-data-store-identifiers","description":"Denies the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_data_store_identifiers"]}},"deny-identifier":{"identifier":"deny-identifier","description":"Denies the identifier command without any pre-configured scope.","commands":{"allow":[],"deny":["identifier"]}},"deny-name":{"identifier":"deny-name","description":"Denies the name command without any pre-configured scope.","commands":{"allow":[],"deny":["name"]}},"deny-register-listener":{"identifier":"deny-register-listener","description":"Denies the register_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["register_listener"]}},"deny-remove-data-store":{"identifier":"deny-remove-data-store","description":"Denies the remove_data_store command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_data_store"]}},"deny-remove-listener":{"identifier":"deny-remove-listener","description":"Denies the remove_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_listener"]}},"deny-set-app-theme":{"identifier":"deny-set-app-theme","description":"Denies the set_app_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_app_theme"]}},"deny-set-dock-visibility":{"identifier":"deny-set-dock-visibility","description":"Denies the set_dock_visibility command without any pre-configured scope.","commands":{"allow":[],"deny":["set_dock_visibility"]}},"deny-tauri-version":{"identifier":"deny-tauri-version","description":"Denies the tauri_version command without any pre-configured scope.","commands":{"allow":[],"deny":["tauri_version"]}},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]}}},"permission_sets":{},"global_scope_schema":null},"core:event":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-listen","allow-unlisten","allow-emit","allow-emit-to"]},"permissions":{"allow-emit":{"identifier":"allow-emit","description":"Enables the emit command without any pre-configured scope.","commands":{"allow":["emit"],"deny":[]}},"allow-emit-to":{"identifier":"allow-emit-to","description":"Enables the emit_to command without any pre-configured scope.","commands":{"allow":["emit_to"],"deny":[]}},"allow-listen":{"identifier":"allow-listen","description":"Enables the listen command without any pre-configured scope.","commands":{"allow":["listen"],"deny":[]}},"allow-unlisten":{"identifier":"allow-unlisten","description":"Enables the unlisten command without any pre-configured scope.","commands":{"allow":["unlisten"],"deny":[]}},"deny-emit":{"identifier":"deny-emit","description":"Denies the emit command without any pre-configured scope.","commands":{"allow":[],"deny":["emit"]}},"deny-emit-to":{"identifier":"deny-emit-to","description":"Denies the emit_to command without any pre-configured scope.","commands":{"allow":[],"deny":["emit_to"]}},"deny-listen":{"identifier":"deny-listen","description":"Denies the listen command without any pre-configured scope.","commands":{"allow":[],"deny":["listen"]}},"deny-unlisten":{"identifier":"deny-unlisten","description":"Denies the unlisten command without any pre-configured scope.","commands":{"allow":[],"deny":["unlisten"]}}},"permission_sets":{},"global_scope_schema":null},"core:image":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-from-bytes","allow-from-path","allow-rgba","allow-size"]},"permissions":{"allow-from-bytes":{"identifier":"allow-from-bytes","description":"Enables the from_bytes command without any pre-configured scope.","commands":{"allow":["from_bytes"],"deny":[]}},"allow-from-path":{"identifier":"allow-from-path","description":"Enables the from_path command without any pre-configured scope.","commands":{"allow":["from_path"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-rgba":{"identifier":"allow-rgba","description":"Enables the rgba command without any pre-configured scope.","commands":{"allow":["rgba"],"deny":[]}},"allow-size":{"identifier":"allow-size","description":"Enables the size command without any pre-configured scope.","commands":{"allow":["size"],"deny":[]}},"deny-from-bytes":{"identifier":"deny-from-bytes","description":"Denies the from_bytes command without any pre-configured scope.","commands":{"allow":[],"deny":["from_bytes"]}},"deny-from-path":{"identifier":"deny-from-path","description":"Denies the from_path command without any pre-configured scope.","commands":{"allow":[],"deny":["from_path"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-rgba":{"identifier":"deny-rgba","description":"Denies the rgba command without any pre-configured scope.","commands":{"allow":[],"deny":["rgba"]}},"deny-size":{"identifier":"deny-size","description":"Denies the size command without any pre-configured scope.","commands":{"allow":[],"deny":["size"]}}},"permission_sets":{},"global_scope_schema":null},"core:menu":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-append","allow-prepend","allow-insert","allow-remove","allow-remove-at","allow-items","allow-get","allow-popup","allow-create-default","allow-set-as-app-menu","allow-set-as-window-menu","allow-text","allow-set-text","allow-is-enabled","allow-set-enabled","allow-set-accelerator","allow-set-as-windows-menu-for-nsapp","allow-set-as-help-menu-for-nsapp","allow-is-checked","allow-set-checked","allow-set-icon"]},"permissions":{"allow-append":{"identifier":"allow-append","description":"Enables the append command without any pre-configured scope.","commands":{"allow":["append"],"deny":[]}},"allow-create-default":{"identifier":"allow-create-default","description":"Enables the create_default command without any pre-configured scope.","commands":{"allow":["create_default"],"deny":[]}},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]}},"allow-insert":{"identifier":"allow-insert","description":"Enables the insert command without any pre-configured scope.","commands":{"allow":["insert"],"deny":[]}},"allow-is-checked":{"identifier":"allow-is-checked","description":"Enables the is_checked command without any pre-configured scope.","commands":{"allow":["is_checked"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-items":{"identifier":"allow-items","description":"Enables the items command without any pre-configured scope.","commands":{"allow":["items"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-popup":{"identifier":"allow-popup","description":"Enables the popup command without any pre-configured scope.","commands":{"allow":["popup"],"deny":[]}},"allow-prepend":{"identifier":"allow-prepend","description":"Enables the prepend command without any pre-configured scope.","commands":{"allow":["prepend"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-remove-at":{"identifier":"allow-remove-at","description":"Enables the remove_at command without any pre-configured scope.","commands":{"allow":["remove_at"],"deny":[]}},"allow-set-accelerator":{"identifier":"allow-set-accelerator","description":"Enables the set_accelerator command without any pre-configured scope.","commands":{"allow":["set_accelerator"],"deny":[]}},"allow-set-as-app-menu":{"identifier":"allow-set-as-app-menu","description":"Enables the set_as_app_menu command without any pre-configured scope.","commands":{"allow":["set_as_app_menu"],"deny":[]}},"allow-set-as-help-menu-for-nsapp":{"identifier":"allow-set-as-help-menu-for-nsapp","description":"Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_help_menu_for_nsapp"],"deny":[]}},"allow-set-as-window-menu":{"identifier":"allow-set-as-window-menu","description":"Enables the set_as_window_menu command without any pre-configured scope.","commands":{"allow":["set_as_window_menu"],"deny":[]}},"allow-set-as-windows-menu-for-nsapp":{"identifier":"allow-set-as-windows-menu-for-nsapp","description":"Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_windows_menu_for_nsapp"],"deny":[]}},"allow-set-checked":{"identifier":"allow-set-checked","description":"Enables the set_checked command without any pre-configured scope.","commands":{"allow":["set_checked"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-text":{"identifier":"allow-set-text","description":"Enables the set_text command without any pre-configured scope.","commands":{"allow":["set_text"],"deny":[]}},"allow-text":{"identifier":"allow-text","description":"Enables the text command without any pre-configured scope.","commands":{"allow":["text"],"deny":[]}},"deny-append":{"identifier":"deny-append","description":"Denies the append command without any pre-configured scope.","commands":{"allow":[],"deny":["append"]}},"deny-create-default":{"identifier":"deny-create-default","description":"Denies the create_default command without any pre-configured scope.","commands":{"allow":[],"deny":["create_default"]}},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]}},"deny-insert":{"identifier":"deny-insert","description":"Denies the insert command without any pre-configured scope.","commands":{"allow":[],"deny":["insert"]}},"deny-is-checked":{"identifier":"deny-is-checked","description":"Denies the is_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["is_checked"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-items":{"identifier":"deny-items","description":"Denies the items command without any pre-configured scope.","commands":{"allow":[],"deny":["items"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-popup":{"identifier":"deny-popup","description":"Denies the popup command without any pre-configured scope.","commands":{"allow":[],"deny":["popup"]}},"deny-prepend":{"identifier":"deny-prepend","description":"Denies the prepend command without any pre-configured scope.","commands":{"allow":[],"deny":["prepend"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-remove-at":{"identifier":"deny-remove-at","description":"Denies the remove_at command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_at"]}},"deny-set-accelerator":{"identifier":"deny-set-accelerator","description":"Denies the set_accelerator command without any pre-configured scope.","commands":{"allow":[],"deny":["set_accelerator"]}},"deny-set-as-app-menu":{"identifier":"deny-set-as-app-menu","description":"Denies the set_as_app_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_app_menu"]}},"deny-set-as-help-menu-for-nsapp":{"identifier":"deny-set-as-help-menu-for-nsapp","description":"Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_help_menu_for_nsapp"]}},"deny-set-as-window-menu":{"identifier":"deny-set-as-window-menu","description":"Denies the set_as_window_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_window_menu"]}},"deny-set-as-windows-menu-for-nsapp":{"identifier":"deny-set-as-windows-menu-for-nsapp","description":"Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_windows_menu_for_nsapp"]}},"deny-set-checked":{"identifier":"deny-set-checked","description":"Denies the set_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["set_checked"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-text":{"identifier":"deny-set-text","description":"Denies the set_text command without any pre-configured scope.","commands":{"allow":[],"deny":["set_text"]}},"deny-text":{"identifier":"deny-text","description":"Denies the text command without any pre-configured scope.","commands":{"allow":[],"deny":["text"]}}},"permission_sets":{},"global_scope_schema":null},"core:path":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-resolve-directory","allow-resolve","allow-normalize","allow-join","allow-dirname","allow-extname","allow-basename","allow-is-absolute"]},"permissions":{"allow-basename":{"identifier":"allow-basename","description":"Enables the basename command without any pre-configured scope.","commands":{"allow":["basename"],"deny":[]}},"allow-dirname":{"identifier":"allow-dirname","description":"Enables the dirname command without any pre-configured scope.","commands":{"allow":["dirname"],"deny":[]}},"allow-extname":{"identifier":"allow-extname","description":"Enables the extname command without any pre-configured scope.","commands":{"allow":["extname"],"deny":[]}},"allow-is-absolute":{"identifier":"allow-is-absolute","description":"Enables the is_absolute command without any pre-configured scope.","commands":{"allow":["is_absolute"],"deny":[]}},"allow-join":{"identifier":"allow-join","description":"Enables the join command without any pre-configured scope.","commands":{"allow":["join"],"deny":[]}},"allow-normalize":{"identifier":"allow-normalize","description":"Enables the normalize command without any pre-configured scope.","commands":{"allow":["normalize"],"deny":[]}},"allow-resolve":{"identifier":"allow-resolve","description":"Enables the resolve command without any pre-configured scope.","commands":{"allow":["resolve"],"deny":[]}},"allow-resolve-directory":{"identifier":"allow-resolve-directory","description":"Enables the resolve_directory command without any pre-configured scope.","commands":{"allow":["resolve_directory"],"deny":[]}},"deny-basename":{"identifier":"deny-basename","description":"Denies the basename command without any pre-configured scope.","commands":{"allow":[],"deny":["basename"]}},"deny-dirname":{"identifier":"deny-dirname","description":"Denies the dirname command without any pre-configured scope.","commands":{"allow":[],"deny":["dirname"]}},"deny-extname":{"identifier":"deny-extname","description":"Denies the extname command without any pre-configured scope.","commands":{"allow":[],"deny":["extname"]}},"deny-is-absolute":{"identifier":"deny-is-absolute","description":"Denies the is_absolute command without any pre-configured scope.","commands":{"allow":[],"deny":["is_absolute"]}},"deny-join":{"identifier":"deny-join","description":"Denies the join command without any pre-configured scope.","commands":{"allow":[],"deny":["join"]}},"deny-normalize":{"identifier":"deny-normalize","description":"Denies the normalize command without any pre-configured scope.","commands":{"allow":[],"deny":["normalize"]}},"deny-resolve":{"identifier":"deny-resolve","description":"Denies the resolve command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve"]}},"deny-resolve-directory":{"identifier":"deny-resolve-directory","description":"Denies the resolve_directory command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve_directory"]}}},"permission_sets":{},"global_scope_schema":null},"core:resources":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-close"]},"permissions":{"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}}},"permission_sets":{},"global_scope_schema":null},"core:tray":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-get-by-id","allow-remove-by-id","allow-set-icon","allow-set-menu","allow-set-tooltip","allow-set-title","allow-set-visible","allow-set-temp-dir-path","allow-set-icon-as-template","allow-set-show-menu-on-left-click"]},"permissions":{"allow-get-by-id":{"identifier":"allow-get-by-id","description":"Enables the get_by_id command without any pre-configured scope.","commands":{"allow":["get_by_id"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-remove-by-id":{"identifier":"allow-remove-by-id","description":"Enables the remove_by_id command without any pre-configured scope.","commands":{"allow":["remove_by_id"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-icon-as-template":{"identifier":"allow-set-icon-as-template","description":"Enables the set_icon_as_template command without any pre-configured scope.","commands":{"allow":["set_icon_as_template"],"deny":[]}},"allow-set-menu":{"identifier":"allow-set-menu","description":"Enables the set_menu command without any pre-configured scope.","commands":{"allow":["set_menu"],"deny":[]}},"allow-set-show-menu-on-left-click":{"identifier":"allow-set-show-menu-on-left-click","description":"Enables the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":["set_show_menu_on_left_click"],"deny":[]}},"allow-set-temp-dir-path":{"identifier":"allow-set-temp-dir-path","description":"Enables the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":["set_temp_dir_path"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-tooltip":{"identifier":"allow-set-tooltip","description":"Enables the set_tooltip command without any pre-configured scope.","commands":{"allow":["set_tooltip"],"deny":[]}},"allow-set-visible":{"identifier":"allow-set-visible","description":"Enables the set_visible command without any pre-configured scope.","commands":{"allow":["set_visible"],"deny":[]}},"deny-get-by-id":{"identifier":"deny-get-by-id","description":"Denies the get_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["get_by_id"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-remove-by-id":{"identifier":"deny-remove-by-id","description":"Denies the remove_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_by_id"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-icon-as-template":{"identifier":"deny-set-icon-as-template","description":"Denies the set_icon_as_template command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon_as_template"]}},"deny-set-menu":{"identifier":"deny-set-menu","description":"Denies the set_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_menu"]}},"deny-set-show-menu-on-left-click":{"identifier":"deny-set-show-menu-on-left-click","description":"Denies the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":[],"deny":["set_show_menu_on_left_click"]}},"deny-set-temp-dir-path":{"identifier":"deny-set-temp-dir-path","description":"Denies the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":[],"deny":["set_temp_dir_path"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-tooltip":{"identifier":"deny-set-tooltip","description":"Denies the set_tooltip command without any pre-configured scope.","commands":{"allow":[],"deny":["set_tooltip"]}},"deny-set-visible":{"identifier":"deny-set-visible","description":"Denies the set_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible"]}}},"permission_sets":{},"global_scope_schema":null},"core:webview":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-webviews","allow-webview-position","allow-webview-size","allow-internal-toggle-devtools"]},"permissions":{"allow-clear-all-browsing-data":{"identifier":"allow-clear-all-browsing-data","description":"Enables the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":["clear_all_browsing_data"],"deny":[]}},"allow-create-webview":{"identifier":"allow-create-webview","description":"Enables the create_webview command without any pre-configured scope.","commands":{"allow":["create_webview"],"deny":[]}},"allow-create-webview-window":{"identifier":"allow-create-webview-window","description":"Enables the create_webview_window command without any pre-configured scope.","commands":{"allow":["create_webview_window"],"deny":[]}},"allow-get-all-webviews":{"identifier":"allow-get-all-webviews","description":"Enables the get_all_webviews command without any pre-configured scope.","commands":{"allow":["get_all_webviews"],"deny":[]}},"allow-internal-toggle-devtools":{"identifier":"allow-internal-toggle-devtools","description":"Enables the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":["internal_toggle_devtools"],"deny":[]}},"allow-print":{"identifier":"allow-print","description":"Enables the print command without any pre-configured scope.","commands":{"allow":["print"],"deny":[]}},"allow-reparent":{"identifier":"allow-reparent","description":"Enables the reparent command without any pre-configured scope.","commands":{"allow":["reparent"],"deny":[]}},"allow-set-webview-auto-resize":{"identifier":"allow-set-webview-auto-resize","description":"Enables the set_webview_auto_resize command without any pre-configured scope.","commands":{"allow":["set_webview_auto_resize"],"deny":[]}},"allow-set-webview-background-color":{"identifier":"allow-set-webview-background-color","description":"Enables the set_webview_background_color command without any pre-configured scope.","commands":{"allow":["set_webview_background_color"],"deny":[]}},"allow-set-webview-focus":{"identifier":"allow-set-webview-focus","description":"Enables the set_webview_focus command without any pre-configured scope.","commands":{"allow":["set_webview_focus"],"deny":[]}},"allow-set-webview-position":{"identifier":"allow-set-webview-position","description":"Enables the set_webview_position command without any pre-configured scope.","commands":{"allow":["set_webview_position"],"deny":[]}},"allow-set-webview-size":{"identifier":"allow-set-webview-size","description":"Enables the set_webview_size command without any pre-configured scope.","commands":{"allow":["set_webview_size"],"deny":[]}},"allow-set-webview-zoom":{"identifier":"allow-set-webview-zoom","description":"Enables the set_webview_zoom command without any pre-configured scope.","commands":{"allow":["set_webview_zoom"],"deny":[]}},"allow-webview-close":{"identifier":"allow-webview-close","description":"Enables the webview_close command without any pre-configured scope.","commands":{"allow":["webview_close"],"deny":[]}},"allow-webview-hide":{"identifier":"allow-webview-hide","description":"Enables the webview_hide command without any pre-configured scope.","commands":{"allow":["webview_hide"],"deny":[]}},"allow-webview-position":{"identifier":"allow-webview-position","description":"Enables the webview_position command without any pre-configured scope.","commands":{"allow":["webview_position"],"deny":[]}},"allow-webview-show":{"identifier":"allow-webview-show","description":"Enables the webview_show command without any pre-configured scope.","commands":{"allow":["webview_show"],"deny":[]}},"allow-webview-size":{"identifier":"allow-webview-size","description":"Enables the webview_size command without any pre-configured scope.","commands":{"allow":["webview_size"],"deny":[]}},"deny-clear-all-browsing-data":{"identifier":"deny-clear-all-browsing-data","description":"Denies the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":[],"deny":["clear_all_browsing_data"]}},"deny-create-webview":{"identifier":"deny-create-webview","description":"Denies the create_webview command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview"]}},"deny-create-webview-window":{"identifier":"deny-create-webview-window","description":"Denies the create_webview_window command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview_window"]}},"deny-get-all-webviews":{"identifier":"deny-get-all-webviews","description":"Denies the get_all_webviews command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_webviews"]}},"deny-internal-toggle-devtools":{"identifier":"deny-internal-toggle-devtools","description":"Denies the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_devtools"]}},"deny-print":{"identifier":"deny-print","description":"Denies the print command without any pre-configured scope.","commands":{"allow":[],"deny":["print"]}},"deny-reparent":{"identifier":"deny-reparent","description":"Denies the reparent command without any pre-configured scope.","commands":{"allow":[],"deny":["reparent"]}},"deny-set-webview-auto-resize":{"identifier":"deny-set-webview-auto-resize","description":"Denies the set_webview_auto_resize command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_auto_resize"]}},"deny-set-webview-background-color":{"identifier":"deny-set-webview-background-color","description":"Denies the set_webview_background_color command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_background_color"]}},"deny-set-webview-focus":{"identifier":"deny-set-webview-focus","description":"Denies the set_webview_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_focus"]}},"deny-set-webview-position":{"identifier":"deny-set-webview-position","description":"Denies the set_webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_position"]}},"deny-set-webview-size":{"identifier":"deny-set-webview-size","description":"Denies the set_webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_size"]}},"deny-set-webview-zoom":{"identifier":"deny-set-webview-zoom","description":"Denies the set_webview_zoom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_zoom"]}},"deny-webview-close":{"identifier":"deny-webview-close","description":"Denies the webview_close command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_close"]}},"deny-webview-hide":{"identifier":"deny-webview-hide","description":"Denies the webview_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_hide"]}},"deny-webview-position":{"identifier":"deny-webview-position","description":"Denies the webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_position"]}},"deny-webview-show":{"identifier":"deny-webview-show","description":"Denies the webview_show command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_show"]}},"deny-webview-size":{"identifier":"deny-webview-size","description":"Denies the webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_size"]}}},"permission_sets":{},"global_scope_schema":null},"core:window":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-windows","allow-scale-factor","allow-inner-position","allow-outer-position","allow-inner-size","allow-outer-size","allow-is-fullscreen","allow-is-minimized","allow-is-maximized","allow-is-focused","allow-is-decorated","allow-is-resizable","allow-is-maximizable","allow-is-minimizable","allow-is-closable","allow-is-visible","allow-is-enabled","allow-title","allow-current-monitor","allow-primary-monitor","allow-monitor-from-point","allow-available-monitors","allow-cursor-position","allow-theme","allow-is-always-on-top","allow-internal-toggle-maximize"]},"permissions":{"allow-available-monitors":{"identifier":"allow-available-monitors","description":"Enables the available_monitors command without any pre-configured scope.","commands":{"allow":["available_monitors"],"deny":[]}},"allow-center":{"identifier":"allow-center","description":"Enables the center command without any pre-configured scope.","commands":{"allow":["center"],"deny":[]}},"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-current-monitor":{"identifier":"allow-current-monitor","description":"Enables the current_monitor command without any pre-configured scope.","commands":{"allow":["current_monitor"],"deny":[]}},"allow-cursor-position":{"identifier":"allow-cursor-position","description":"Enables the cursor_position command without any pre-configured scope.","commands":{"allow":["cursor_position"],"deny":[]}},"allow-destroy":{"identifier":"allow-destroy","description":"Enables the destroy command without any pre-configured scope.","commands":{"allow":["destroy"],"deny":[]}},"allow-get-all-windows":{"identifier":"allow-get-all-windows","description":"Enables the get_all_windows command without any pre-configured scope.","commands":{"allow":["get_all_windows"],"deny":[]}},"allow-hide":{"identifier":"allow-hide","description":"Enables the hide command without any pre-configured scope.","commands":{"allow":["hide"],"deny":[]}},"allow-inner-position":{"identifier":"allow-inner-position","description":"Enables the inner_position command without any pre-configured scope.","commands":{"allow":["inner_position"],"deny":[]}},"allow-inner-size":{"identifier":"allow-inner-size","description":"Enables the inner_size command without any pre-configured scope.","commands":{"allow":["inner_size"],"deny":[]}},"allow-internal-toggle-maximize":{"identifier":"allow-internal-toggle-maximize","description":"Enables the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":["internal_toggle_maximize"],"deny":[]}},"allow-is-always-on-top":{"identifier":"allow-is-always-on-top","description":"Enables the is_always_on_top command without any pre-configured scope.","commands":{"allow":["is_always_on_top"],"deny":[]}},"allow-is-closable":{"identifier":"allow-is-closable","description":"Enables the is_closable command without any pre-configured scope.","commands":{"allow":["is_closable"],"deny":[]}},"allow-is-decorated":{"identifier":"allow-is-decorated","description":"Enables the is_decorated command without any pre-configured scope.","commands":{"allow":["is_decorated"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-is-focused":{"identifier":"allow-is-focused","description":"Enables the is_focused command without any pre-configured scope.","commands":{"allow":["is_focused"],"deny":[]}},"allow-is-fullscreen":{"identifier":"allow-is-fullscreen","description":"Enables the is_fullscreen command without any pre-configured scope.","commands":{"allow":["is_fullscreen"],"deny":[]}},"allow-is-maximizable":{"identifier":"allow-is-maximizable","description":"Enables the is_maximizable command without any pre-configured scope.","commands":{"allow":["is_maximizable"],"deny":[]}},"allow-is-maximized":{"identifier":"allow-is-maximized","description":"Enables the is_maximized command without any pre-configured scope.","commands":{"allow":["is_maximized"],"deny":[]}},"allow-is-minimizable":{"identifier":"allow-is-minimizable","description":"Enables the is_minimizable command without any pre-configured scope.","commands":{"allow":["is_minimizable"],"deny":[]}},"allow-is-minimized":{"identifier":"allow-is-minimized","description":"Enables the is_minimized command without any pre-configured scope.","commands":{"allow":["is_minimized"],"deny":[]}},"allow-is-resizable":{"identifier":"allow-is-resizable","description":"Enables the is_resizable command without any pre-configured scope.","commands":{"allow":["is_resizable"],"deny":[]}},"allow-is-visible":{"identifier":"allow-is-visible","description":"Enables the is_visible command without any pre-configured scope.","commands":{"allow":["is_visible"],"deny":[]}},"allow-maximize":{"identifier":"allow-maximize","description":"Enables the maximize command without any pre-configured scope.","commands":{"allow":["maximize"],"deny":[]}},"allow-minimize":{"identifier":"allow-minimize","description":"Enables the minimize command without any pre-configured scope.","commands":{"allow":["minimize"],"deny":[]}},"allow-monitor-from-point":{"identifier":"allow-monitor-from-point","description":"Enables the monitor_from_point command without any pre-configured scope.","commands":{"allow":["monitor_from_point"],"deny":[]}},"allow-outer-position":{"identifier":"allow-outer-position","description":"Enables the outer_position command without any pre-configured scope.","commands":{"allow":["outer_position"],"deny":[]}},"allow-outer-size":{"identifier":"allow-outer-size","description":"Enables the outer_size command without any pre-configured scope.","commands":{"allow":["outer_size"],"deny":[]}},"allow-primary-monitor":{"identifier":"allow-primary-monitor","description":"Enables the primary_monitor command without any pre-configured scope.","commands":{"allow":["primary_monitor"],"deny":[]}},"allow-request-user-attention":{"identifier":"allow-request-user-attention","description":"Enables the request_user_attention command without any pre-configured scope.","commands":{"allow":["request_user_attention"],"deny":[]}},"allow-scale-factor":{"identifier":"allow-scale-factor","description":"Enables the scale_factor command without any pre-configured scope.","commands":{"allow":["scale_factor"],"deny":[]}},"allow-set-always-on-bottom":{"identifier":"allow-set-always-on-bottom","description":"Enables the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":["set_always_on_bottom"],"deny":[]}},"allow-set-always-on-top":{"identifier":"allow-set-always-on-top","description":"Enables the set_always_on_top command without any pre-configured scope.","commands":{"allow":["set_always_on_top"],"deny":[]}},"allow-set-background-color":{"identifier":"allow-set-background-color","description":"Enables the set_background_color command without any pre-configured scope.","commands":{"allow":["set_background_color"],"deny":[]}},"allow-set-badge-count":{"identifier":"allow-set-badge-count","description":"Enables the set_badge_count command without any pre-configured scope.","commands":{"allow":["set_badge_count"],"deny":[]}},"allow-set-badge-label":{"identifier":"allow-set-badge-label","description":"Enables the set_badge_label command without any pre-configured scope.","commands":{"allow":["set_badge_label"],"deny":[]}},"allow-set-closable":{"identifier":"allow-set-closable","description":"Enables the set_closable command without any pre-configured scope.","commands":{"allow":["set_closable"],"deny":[]}},"allow-set-content-protected":{"identifier":"allow-set-content-protected","description":"Enables the set_content_protected command without any pre-configured scope.","commands":{"allow":["set_content_protected"],"deny":[]}},"allow-set-cursor-grab":{"identifier":"allow-set-cursor-grab","description":"Enables the set_cursor_grab command without any pre-configured scope.","commands":{"allow":["set_cursor_grab"],"deny":[]}},"allow-set-cursor-icon":{"identifier":"allow-set-cursor-icon","description":"Enables the set_cursor_icon command without any pre-configured scope.","commands":{"allow":["set_cursor_icon"],"deny":[]}},"allow-set-cursor-position":{"identifier":"allow-set-cursor-position","description":"Enables the set_cursor_position command without any pre-configured scope.","commands":{"allow":["set_cursor_position"],"deny":[]}},"allow-set-cursor-visible":{"identifier":"allow-set-cursor-visible","description":"Enables the set_cursor_visible command without any pre-configured scope.","commands":{"allow":["set_cursor_visible"],"deny":[]}},"allow-set-decorations":{"identifier":"allow-set-decorations","description":"Enables the set_decorations command without any pre-configured scope.","commands":{"allow":["set_decorations"],"deny":[]}},"allow-set-effects":{"identifier":"allow-set-effects","description":"Enables the set_effects command without any pre-configured scope.","commands":{"allow":["set_effects"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-focus":{"identifier":"allow-set-focus","description":"Enables the set_focus command without any pre-configured scope.","commands":{"allow":["set_focus"],"deny":[]}},"allow-set-focusable":{"identifier":"allow-set-focusable","description":"Enables the set_focusable command without any pre-configured scope.","commands":{"allow":["set_focusable"],"deny":[]}},"allow-set-fullscreen":{"identifier":"allow-set-fullscreen","description":"Enables the set_fullscreen command without any pre-configured scope.","commands":{"allow":["set_fullscreen"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-ignore-cursor-events":{"identifier":"allow-set-ignore-cursor-events","description":"Enables the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":["set_ignore_cursor_events"],"deny":[]}},"allow-set-max-size":{"identifier":"allow-set-max-size","description":"Enables the set_max_size command without any pre-configured scope.","commands":{"allow":["set_max_size"],"deny":[]}},"allow-set-maximizable":{"identifier":"allow-set-maximizable","description":"Enables the set_maximizable command without any pre-configured scope.","commands":{"allow":["set_maximizable"],"deny":[]}},"allow-set-min-size":{"identifier":"allow-set-min-size","description":"Enables the set_min_size command without any pre-configured scope.","commands":{"allow":["set_min_size"],"deny":[]}},"allow-set-minimizable":{"identifier":"allow-set-minimizable","description":"Enables the set_minimizable command without any pre-configured scope.","commands":{"allow":["set_minimizable"],"deny":[]}},"allow-set-overlay-icon":{"identifier":"allow-set-overlay-icon","description":"Enables the set_overlay_icon command without any pre-configured scope.","commands":{"allow":["set_overlay_icon"],"deny":[]}},"allow-set-position":{"identifier":"allow-set-position","description":"Enables the set_position command without any pre-configured scope.","commands":{"allow":["set_position"],"deny":[]}},"allow-set-progress-bar":{"identifier":"allow-set-progress-bar","description":"Enables the set_progress_bar command without any pre-configured scope.","commands":{"allow":["set_progress_bar"],"deny":[]}},"allow-set-resizable":{"identifier":"allow-set-resizable","description":"Enables the set_resizable command without any pre-configured scope.","commands":{"allow":["set_resizable"],"deny":[]}},"allow-set-shadow":{"identifier":"allow-set-shadow","description":"Enables the set_shadow command without any pre-configured scope.","commands":{"allow":["set_shadow"],"deny":[]}},"allow-set-simple-fullscreen":{"identifier":"allow-set-simple-fullscreen","description":"Enables the set_simple_fullscreen command without any pre-configured scope.","commands":{"allow":["set_simple_fullscreen"],"deny":[]}},"allow-set-size":{"identifier":"allow-set-size","description":"Enables the set_size command without any pre-configured scope.","commands":{"allow":["set_size"],"deny":[]}},"allow-set-size-constraints":{"identifier":"allow-set-size-constraints","description":"Enables the set_size_constraints command without any pre-configured scope.","commands":{"allow":["set_size_constraints"],"deny":[]}},"allow-set-skip-taskbar":{"identifier":"allow-set-skip-taskbar","description":"Enables the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":["set_skip_taskbar"],"deny":[]}},"allow-set-theme":{"identifier":"allow-set-theme","description":"Enables the set_theme command without any pre-configured scope.","commands":{"allow":["set_theme"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-title-bar-style":{"identifier":"allow-set-title-bar-style","description":"Enables the set_title_bar_style command without any pre-configured scope.","commands":{"allow":["set_title_bar_style"],"deny":[]}},"allow-set-visible-on-all-workspaces":{"identifier":"allow-set-visible-on-all-workspaces","description":"Enables the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":["set_visible_on_all_workspaces"],"deny":[]}},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]}},"allow-start-dragging":{"identifier":"allow-start-dragging","description":"Enables the start_dragging command without any pre-configured scope.","commands":{"allow":["start_dragging"],"deny":[]}},"allow-start-resize-dragging":{"identifier":"allow-start-resize-dragging","description":"Enables the start_resize_dragging command without any pre-configured scope.","commands":{"allow":["start_resize_dragging"],"deny":[]}},"allow-theme":{"identifier":"allow-theme","description":"Enables the theme command without any pre-configured scope.","commands":{"allow":["theme"],"deny":[]}},"allow-title":{"identifier":"allow-title","description":"Enables the title command without any pre-configured scope.","commands":{"allow":["title"],"deny":[]}},"allow-toggle-maximize":{"identifier":"allow-toggle-maximize","description":"Enables the toggle_maximize command without any pre-configured scope.","commands":{"allow":["toggle_maximize"],"deny":[]}},"allow-unmaximize":{"identifier":"allow-unmaximize","description":"Enables the unmaximize command without any pre-configured scope.","commands":{"allow":["unmaximize"],"deny":[]}},"allow-unminimize":{"identifier":"allow-unminimize","description":"Enables the unminimize command without any pre-configured scope.","commands":{"allow":["unminimize"],"deny":[]}},"deny-available-monitors":{"identifier":"deny-available-monitors","description":"Denies the available_monitors command without any pre-configured scope.","commands":{"allow":[],"deny":["available_monitors"]}},"deny-center":{"identifier":"deny-center","description":"Denies the center command without any pre-configured scope.","commands":{"allow":[],"deny":["center"]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-current-monitor":{"identifier":"deny-current-monitor","description":"Denies the current_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["current_monitor"]}},"deny-cursor-position":{"identifier":"deny-cursor-position","description":"Denies the cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["cursor_position"]}},"deny-destroy":{"identifier":"deny-destroy","description":"Denies the destroy command without any pre-configured scope.","commands":{"allow":[],"deny":["destroy"]}},"deny-get-all-windows":{"identifier":"deny-get-all-windows","description":"Denies the get_all_windows command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_windows"]}},"deny-hide":{"identifier":"deny-hide","description":"Denies the hide command without any pre-configured scope.","commands":{"allow":[],"deny":["hide"]}},"deny-inner-position":{"identifier":"deny-inner-position","description":"Denies the inner_position command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_position"]}},"deny-inner-size":{"identifier":"deny-inner-size","description":"Denies the inner_size command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_size"]}},"deny-internal-toggle-maximize":{"identifier":"deny-internal-toggle-maximize","description":"Denies the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_maximize"]}},"deny-is-always-on-top":{"identifier":"deny-is-always-on-top","description":"Denies the is_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["is_always_on_top"]}},"deny-is-closable":{"identifier":"deny-is-closable","description":"Denies the is_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_closable"]}},"deny-is-decorated":{"identifier":"deny-is-decorated","description":"Denies the is_decorated command without any pre-configured scope.","commands":{"allow":[],"deny":["is_decorated"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-is-focused":{"identifier":"deny-is-focused","description":"Denies the is_focused command without any pre-configured scope.","commands":{"allow":[],"deny":["is_focused"]}},"deny-is-fullscreen":{"identifier":"deny-is-fullscreen","description":"Denies the is_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["is_fullscreen"]}},"deny-is-maximizable":{"identifier":"deny-is-maximizable","description":"Denies the is_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximizable"]}},"deny-is-maximized":{"identifier":"deny-is-maximized","description":"Denies the is_maximized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximized"]}},"deny-is-minimizable":{"identifier":"deny-is-minimizable","description":"Denies the is_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimizable"]}},"deny-is-minimized":{"identifier":"deny-is-minimized","description":"Denies the is_minimized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimized"]}},"deny-is-resizable":{"identifier":"deny-is-resizable","description":"Denies the is_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_resizable"]}},"deny-is-visible":{"identifier":"deny-is-visible","description":"Denies the is_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["is_visible"]}},"deny-maximize":{"identifier":"deny-maximize","description":"Denies the maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["maximize"]}},"deny-minimize":{"identifier":"deny-minimize","description":"Denies the minimize command without any pre-configured scope.","commands":{"allow":[],"deny":["minimize"]}},"deny-monitor-from-point":{"identifier":"deny-monitor-from-point","description":"Denies the monitor_from_point command without any pre-configured scope.","commands":{"allow":[],"deny":["monitor_from_point"]}},"deny-outer-position":{"identifier":"deny-outer-position","description":"Denies the outer_position command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_position"]}},"deny-outer-size":{"identifier":"deny-outer-size","description":"Denies the outer_size command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_size"]}},"deny-primary-monitor":{"identifier":"deny-primary-monitor","description":"Denies the primary_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["primary_monitor"]}},"deny-request-user-attention":{"identifier":"deny-request-user-attention","description":"Denies the request_user_attention command without any pre-configured scope.","commands":{"allow":[],"deny":["request_user_attention"]}},"deny-scale-factor":{"identifier":"deny-scale-factor","description":"Denies the scale_factor command without any pre-configured scope.","commands":{"allow":[],"deny":["scale_factor"]}},"deny-set-always-on-bottom":{"identifier":"deny-set-always-on-bottom","description":"Denies the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_bottom"]}},"deny-set-always-on-top":{"identifier":"deny-set-always-on-top","description":"Denies the set_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_top"]}},"deny-set-background-color":{"identifier":"deny-set-background-color","description":"Denies the set_background_color command without any pre-configured scope.","commands":{"allow":[],"deny":["set_background_color"]}},"deny-set-badge-count":{"identifier":"deny-set-badge-count","description":"Denies the set_badge_count command without any pre-configured scope.","commands":{"allow":[],"deny":["set_badge_count"]}},"deny-set-badge-label":{"identifier":"deny-set-badge-label","description":"Denies the set_badge_label command without any pre-configured scope.","commands":{"allow":[],"deny":["set_badge_label"]}},"deny-set-closable":{"identifier":"deny-set-closable","description":"Denies the set_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_closable"]}},"deny-set-content-protected":{"identifier":"deny-set-content-protected","description":"Denies the set_content_protected command without any pre-configured scope.","commands":{"allow":[],"deny":["set_content_protected"]}},"deny-set-cursor-grab":{"identifier":"deny-set-cursor-grab","description":"Denies the set_cursor_grab command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_grab"]}},"deny-set-cursor-icon":{"identifier":"deny-set-cursor-icon","description":"Denies the set_cursor_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_icon"]}},"deny-set-cursor-position":{"identifier":"deny-set-cursor-position","description":"Denies the set_cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_position"]}},"deny-set-cursor-visible":{"identifier":"deny-set-cursor-visible","description":"Denies the set_cursor_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_visible"]}},"deny-set-decorations":{"identifier":"deny-set-decorations","description":"Denies the set_decorations command without any pre-configured scope.","commands":{"allow":[],"deny":["set_decorations"]}},"deny-set-effects":{"identifier":"deny-set-effects","description":"Denies the set_effects command without any pre-configured scope.","commands":{"allow":[],"deny":["set_effects"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-focus":{"identifier":"deny-set-focus","description":"Denies the set_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focus"]}},"deny-set-focusable":{"identifier":"deny-set-focusable","description":"Denies the set_focusable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focusable"]}},"deny-set-fullscreen":{"identifier":"deny-set-fullscreen","description":"Denies the set_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_fullscreen"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-ignore-cursor-events":{"identifier":"deny-set-ignore-cursor-events","description":"Denies the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":[],"deny":["set_ignore_cursor_events"]}},"deny-set-max-size":{"identifier":"deny-set-max-size","description":"Denies the set_max_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_max_size"]}},"deny-set-maximizable":{"identifier":"deny-set-maximizable","description":"Denies the set_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_maximizable"]}},"deny-set-min-size":{"identifier":"deny-set-min-size","description":"Denies the set_min_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_min_size"]}},"deny-set-minimizable":{"identifier":"deny-set-minimizable","description":"Denies the set_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_minimizable"]}},"deny-set-overlay-icon":{"identifier":"deny-set-overlay-icon","description":"Denies the set_overlay_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_overlay_icon"]}},"deny-set-position":{"identifier":"deny-set-position","description":"Denies the set_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_position"]}},"deny-set-progress-bar":{"identifier":"deny-set-progress-bar","description":"Denies the set_progress_bar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_progress_bar"]}},"deny-set-resizable":{"identifier":"deny-set-resizable","description":"Denies the set_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_resizable"]}},"deny-set-shadow":{"identifier":"deny-set-shadow","description":"Denies the set_shadow command without any pre-configured scope.","commands":{"allow":[],"deny":["set_shadow"]}},"deny-set-simple-fullscreen":{"identifier":"deny-set-simple-fullscreen","description":"Denies the set_simple_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_simple_fullscreen"]}},"deny-set-size":{"identifier":"deny-set-size","description":"Denies the set_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size"]}},"deny-set-size-constraints":{"identifier":"deny-set-size-constraints","description":"Denies the set_size_constraints command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size_constraints"]}},"deny-set-skip-taskbar":{"identifier":"deny-set-skip-taskbar","description":"Denies the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_skip_taskbar"]}},"deny-set-theme":{"identifier":"deny-set-theme","description":"Denies the set_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_theme"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-title-bar-style":{"identifier":"deny-set-title-bar-style","description":"Denies the set_title_bar_style command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title_bar_style"]}},"deny-set-visible-on-all-workspaces":{"identifier":"deny-set-visible-on-all-workspaces","description":"Denies the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible_on_all_workspaces"]}},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]}},"deny-start-dragging":{"identifier":"deny-start-dragging","description":"Denies the start_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_dragging"]}},"deny-start-resize-dragging":{"identifier":"deny-start-resize-dragging","description":"Denies the start_resize_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_resize_dragging"]}},"deny-theme":{"identifier":"deny-theme","description":"Denies the theme command without any pre-configured scope.","commands":{"allow":[],"deny":["theme"]}},"deny-title":{"identifier":"deny-title","description":"Denies the title command without any pre-configured scope.","commands":{"allow":[],"deny":["title"]}},"deny-toggle-maximize":{"identifier":"deny-toggle-maximize","description":"Denies the toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["toggle_maximize"]}},"deny-unmaximize":{"identifier":"deny-unmaximize","description":"Denies the unmaximize command without any pre-configured scope.","commands":{"allow":[],"deny":["unmaximize"]}},"deny-unminimize":{"identifier":"deny-unminimize","description":"Denies the unminimize command without any pre-configured scope.","commands":{"allow":[],"deny":["unminimize"]}}},"permission_sets":{},"global_scope_schema":null},"opener":{"default_permission":{"identifier":"default","description":"This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer","permissions":["allow-open-url","allow-reveal-item-in-dir","allow-default-urls"]},"permissions":{"allow-default-urls":{"identifier":"allow-default-urls","description":"This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"url":"mailto:*"},{"url":"tel:*"},{"url":"http://*"},{"url":"https://*"}]}},"allow-open-path":{"identifier":"allow-open-path","description":"Enables the open_path command without any pre-configured scope.","commands":{"allow":["open_path"],"deny":[]}},"allow-open-url":{"identifier":"allow-open-url","description":"Enables the open_url command without any pre-configured scope.","commands":{"allow":["open_url"],"deny":[]}},"allow-reveal-item-in-dir":{"identifier":"allow-reveal-item-in-dir","description":"Enables the reveal_item_in_dir command without any pre-configured scope.","commands":{"allow":["reveal_item_in_dir"],"deny":[]}},"deny-open-path":{"identifier":"deny-open-path","description":"Denies the open_path command without any pre-configured scope.","commands":{"allow":[],"deny":["open_path"]}},"deny-open-url":{"identifier":"deny-open-url","description":"Denies the open_url command without any pre-configured scope.","commands":{"allow":[],"deny":["open_url"]}},"deny-reveal-item-in-dir":{"identifier":"deny-reveal-item-in-dir","description":"Denies the reveal_item_in_dir command without any pre-configured scope.","commands":{"allow":[],"deny":["reveal_item_in_dir"]}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"properties":{"app":{"allOf":[{"$ref":"#/definitions/Application"}],"description":"An application to open this url with, for example: firefox."},"url":{"description":"A URL that can be opened by the webview when using the Opener APIs.\n\nWildcards can be used following the UNIX glob pattern.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"","type":"string"}},"required":["url"],"type":"object"},{"properties":{"app":{"allOf":[{"$ref":"#/definitions/Application"}],"description":"An application to open this path with, for example: xdg-open."},"path":{"description":"A path that can be opened by the webview when using the Opener APIs.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"}},"required":["path"],"type":"object"}],"definitions":{"Application":{"anyOf":[{"description":"Open in default application.","type":"null"},{"description":"If true, allow open with any application.","type":"boolean"},{"description":"Allow specific application to open with.","type":"string"}],"description":"Opener scope application."}},"description":"Opener scope entry.","title":"OpenerScopeEntry"}},"store":{"default_permission":{"identifier":"default","description":"This permission set configures what kind of\noperations are available from the store plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n","permissions":["allow-load","allow-get-store","allow-set","allow-get","allow-has","allow-delete","allow-clear","allow-reset","allow-keys","allow-values","allow-entries","allow-length","allow-reload","allow-save"]},"permissions":{"allow-clear":{"identifier":"allow-clear","description":"Enables the clear command without any pre-configured scope.","commands":{"allow":["clear"],"deny":[]}},"allow-delete":{"identifier":"allow-delete","description":"Enables the delete command without any pre-configured scope.","commands":{"allow":["delete"],"deny":[]}},"allow-entries":{"identifier":"allow-entries","description":"Enables the entries command without any pre-configured scope.","commands":{"allow":["entries"],"deny":[]}},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]}},"allow-get-store":{"identifier":"allow-get-store","description":"Enables the get_store command without any pre-configured scope.","commands":{"allow":["get_store"],"deny":[]}},"allow-has":{"identifier":"allow-has","description":"Enables the has command without any pre-configured scope.","commands":{"allow":["has"],"deny":[]}},"allow-keys":{"identifier":"allow-keys","description":"Enables the keys command without any pre-configured scope.","commands":{"allow":["keys"],"deny":[]}},"allow-length":{"identifier":"allow-length","description":"Enables the length command without any pre-configured scope.","commands":{"allow":["length"],"deny":[]}},"allow-load":{"identifier":"allow-load","description":"Enables the load command without any pre-configured scope.","commands":{"allow":["load"],"deny":[]}},"allow-reload":{"identifier":"allow-reload","description":"Enables the reload command without any pre-configured scope.","commands":{"allow":["reload"],"deny":[]}},"allow-reset":{"identifier":"allow-reset","description":"Enables the reset command without any pre-configured scope.","commands":{"allow":["reset"],"deny":[]}},"allow-save":{"identifier":"allow-save","description":"Enables the save command without any pre-configured scope.","commands":{"allow":["save"],"deny":[]}},"allow-set":{"identifier":"allow-set","description":"Enables the set command without any pre-configured scope.","commands":{"allow":["set"],"deny":[]}},"allow-values":{"identifier":"allow-values","description":"Enables the values command without any pre-configured scope.","commands":{"allow":["values"],"deny":[]}},"deny-clear":{"identifier":"deny-clear","description":"Denies the clear command without any pre-configured scope.","commands":{"allow":[],"deny":["clear"]}},"deny-delete":{"identifier":"deny-delete","description":"Denies the delete command without any pre-configured scope.","commands":{"allow":[],"deny":["delete"]}},"deny-entries":{"identifier":"deny-entries","description":"Denies the entries command without any pre-configured scope.","commands":{"allow":[],"deny":["entries"]}},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]}},"deny-get-store":{"identifier":"deny-get-store","description":"Denies the get_store command without any pre-configured scope.","commands":{"allow":[],"deny":["get_store"]}},"deny-has":{"identifier":"deny-has","description":"Denies the has command without any pre-configured scope.","commands":{"allow":[],"deny":["has"]}},"deny-keys":{"identifier":"deny-keys","description":"Denies the keys command without any pre-configured scope.","commands":{"allow":[],"deny":["keys"]}},"deny-length":{"identifier":"deny-length","description":"Denies the length command without any pre-configured scope.","commands":{"allow":[],"deny":["length"]}},"deny-load":{"identifier":"deny-load","description":"Denies the load command without any pre-configured scope.","commands":{"allow":[],"deny":["load"]}},"deny-reload":{"identifier":"deny-reload","description":"Denies the reload command without any pre-configured scope.","commands":{"allow":[],"deny":["reload"]}},"deny-reset":{"identifier":"deny-reset","description":"Denies the reset command without any pre-configured scope.","commands":{"allow":[],"deny":["reset"]}},"deny-save":{"identifier":"deny-save","description":"Denies the save command without any pre-configured scope.","commands":{"allow":[],"deny":["save"]}},"deny-set":{"identifier":"deny-set","description":"Denies the set command without any pre-configured scope.","commands":{"allow":[],"deny":["set"]}},"deny-values":{"identifier":"deny-values","description":"Denies the values command without any pre-configured scope.","commands":{"allow":[],"deny":["values"]}}},"permission_sets":{},"global_scope_schema":null}} \ No newline at end of file diff --git a/broadcast-client/src-tauri/gen/schemas/capabilities.json b/broadcast-client/src-tauri/gen/schemas/capabilities.json new file mode 100644 index 0000000..56c61e9 --- /dev/null +++ b/broadcast-client/src-tauri/gen/schemas/capabilities.json @@ -0,0 +1 @@ +{"default":{"identifier":"default","description":"Default capability for broadcast window","local":true,"windows":["main","sync-config"],"permissions":["core:default","core:window:allow-set-position","core:window:allow-set-size","core:window:allow-start-dragging","opener:default","store:default"]}} \ No newline at end of file diff --git a/broadcast-client/src-tauri/gen/schemas/desktop-schema.json b/broadcast-client/src-tauri/gen/schemas/desktop-schema.json new file mode 100644 index 0000000..8d380f2 --- /dev/null +++ b/broadcast-client/src-tauri/gen/schemas/desktop-schema.json @@ -0,0 +1,2651 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "CapabilityFile", + "description": "Capability formats accepted in a capability file.", + "anyOf": [ + { + "description": "A single capability.", + "allOf": [ + { + "$ref": "#/definitions/Capability" + } + ] + }, + { + "description": "A list of capabilities.", + "type": "array", + "items": { + "$ref": "#/definitions/Capability" + } + }, + { + "description": "A list of capabilities.", + "type": "object", + "required": [ + "capabilities" + ], + "properties": { + "capabilities": { + "description": "The list of capabilities.", + "type": "array", + "items": { + "$ref": "#/definitions/Capability" + } + } + } + } + ], + "definitions": { + "Capability": { + "description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\nIt controls application windows' and webviews' fine grained access to the Tauri core, application, or plugin commands. If a webview or its window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create groups of windows, based on their required system access, which can reduce impact of frontend vulnerabilities in less privileged windows. Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`. A Window can have none, one, or multiple associated capabilities.\n\n## Example\n\n```json { \"identifier\": \"main-user-files-write\", \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.\", \"windows\": [ \"main\" ], \"permissions\": [ \"core:default\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] }, ], \"platforms\": [\"macOS\",\"windows\"] } ```", + "type": "object", + "required": [ + "identifier", + "permissions" + ], + "properties": { + "identifier": { + "description": "Identifier of the capability.\n\n## Example\n\n`main-user-files-write`", + "type": "string" + }, + "description": { + "description": "Description of what the capability is intended to allow on associated windows.\n\nIt should contain a description of what the grouped permissions should allow.\n\n## Example\n\nThis capability allows the `main` window access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.", + "default": "", + "type": "string" + }, + "remote": { + "description": "Configure remote URLs that can use the capability permissions.\n\nThis setting is optional and defaults to not being set, as our default use case is that the content is served from our local application.\n\n:::caution Make sure you understand the security implications of providing remote sources with local system access. :::\n\n## Example\n\n```json { \"urls\": [\"https://*.mydomain.dev\"] } ```", + "anyOf": [ + { + "$ref": "#/definitions/CapabilityRemote" + }, + { + "type": "null" + } + ] + }, + "local": { + "description": "Whether this capability is enabled for local app URLs or not. Defaults to `true`.", + "default": true, + "type": "boolean" + }, + "windows": { + "description": "List of windows that are affected by this capability. Can be a glob pattern.\n\nIf a window label matches any of the patterns in this list, the capability will be enabled on all the webviews of that window, regardless of the value of [`Self::webviews`].\n\nOn multiwebview windows, prefer specifying [`Self::webviews`] and omitting [`Self::windows`] for a fine grained access control.\n\n## Example\n\n`[\"main\"]`", + "type": "array", + "items": { + "type": "string" + } + }, + "webviews": { + "description": "List of webviews that are affected by this capability. Can be a glob pattern.\n\nThe capability will be enabled on all the webviews whose label matches any of the patterns in this list, regardless of whether the webview's window label matches a pattern in [`Self::windows`].\n\n## Example\n\n`[\"sub-webview-one\", \"sub-webview-two\"]`", + "type": "array", + "items": { + "type": "string" + } + }, + "permissions": { + "description": "List of permissions attached to this capability.\n\nMust include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`. For commands directly implemented in the application itself only `${permission-name}` is required.\n\n## Example\n\n```json [ \"core:default\", \"shell:allow-open\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] } ] ```", + "type": "array", + "items": { + "$ref": "#/definitions/PermissionEntry" + }, + "uniqueItems": true + }, + "platforms": { + "description": "Limit which target platforms this capability applies to.\n\nBy default all platforms are targeted.\n\n## Example\n\n`[\"macOS\",\"windows\"]`", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Target" + } + } + } + }, + "CapabilityRemote": { + "description": "Configuration for remote URLs that are associated with the capability.", + "type": "object", + "required": [ + "urls" + ], + "properties": { + "urls": { + "description": "Remote domains this capability refers to using the [URLPattern standard](https://urlpattern.spec.whatwg.org/).\n\n## Examples\n\n- \"https://*.mydomain.dev\": allows subdomains of mydomain.dev - \"https://mydomain.dev/api/*\": allows any subpath of mydomain.dev/api", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "PermissionEntry": { + "description": "An entry for a permission value in a [`Capability`] can be either a raw permission [`Identifier`] or an object that references a permission and extends its scope.", + "anyOf": [ + { + "description": "Reference a permission or permission set by identifier.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + { + "description": "Reference a permission or permission set by identifier and extends its scope.", + "type": "object", + "allOf": [ + { + "if": { + "properties": { + "identifier": { + "anyOf": [ + { + "description": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`", + "type": "string", + "const": "opener:default", + "markdownDescription": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`" + }, + { + "description": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application.", + "type": "string", + "const": "opener:allow-default-urls", + "markdownDescription": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application." + }, + { + "description": "Enables the open_path command without any pre-configured scope.", + "type": "string", + "const": "opener:allow-open-path", + "markdownDescription": "Enables the open_path command without any pre-configured scope." + }, + { + "description": "Enables the open_url command without any pre-configured scope.", + "type": "string", + "const": "opener:allow-open-url", + "markdownDescription": "Enables the open_url command without any pre-configured scope." + }, + { + "description": "Enables the reveal_item_in_dir command without any pre-configured scope.", + "type": "string", + "const": "opener:allow-reveal-item-in-dir", + "markdownDescription": "Enables the reveal_item_in_dir command without any pre-configured scope." + }, + { + "description": "Denies the open_path command without any pre-configured scope.", + "type": "string", + "const": "opener:deny-open-path", + "markdownDescription": "Denies the open_path command without any pre-configured scope." + }, + { + "description": "Denies the open_url command without any pre-configured scope.", + "type": "string", + "const": "opener:deny-open-url", + "markdownDescription": "Denies the open_url command without any pre-configured scope." + }, + { + "description": "Denies the reveal_item_in_dir command without any pre-configured scope.", + "type": "string", + "const": "opener:deny-reveal-item-in-dir", + "markdownDescription": "Denies the reveal_item_in_dir command without any pre-configured scope." + } + ] + } + } + }, + "then": { + "properties": { + "allow": { + "items": { + "title": "OpenerScopeEntry", + "description": "Opener scope entry.", + "anyOf": [ + { + "type": "object", + "required": [ + "url" + ], + "properties": { + "app": { + "description": "An application to open this url with, for example: firefox.", + "allOf": [ + { + "$ref": "#/definitions/Application" + } + ] + }, + "url": { + "description": "A URL that can be opened by the webview when using the Opener APIs.\n\nWildcards can be used following the UNIX glob pattern.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"", + "type": "string" + } + } + }, + { + "type": "object", + "required": [ + "path" + ], + "properties": { + "app": { + "description": "An application to open this path with, for example: xdg-open.", + "allOf": [ + { + "$ref": "#/definitions/Application" + } + ] + }, + "path": { + "description": "A path that can be opened by the webview when using the Opener APIs.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + } + } + } + ] + } + }, + "deny": { + "items": { + "title": "OpenerScopeEntry", + "description": "Opener scope entry.", + "anyOf": [ + { + "type": "object", + "required": [ + "url" + ], + "properties": { + "app": { + "description": "An application to open this url with, for example: firefox.", + "allOf": [ + { + "$ref": "#/definitions/Application" + } + ] + }, + "url": { + "description": "A URL that can be opened by the webview when using the Opener APIs.\n\nWildcards can be used following the UNIX glob pattern.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"", + "type": "string" + } + } + }, + { + "type": "object", + "required": [ + "path" + ], + "properties": { + "app": { + "description": "An application to open this path with, for example: xdg-open.", + "allOf": [ + { + "$ref": "#/definitions/Application" + } + ] + }, + "path": { + "description": "A path that can be opened by the webview when using the Opener APIs.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + } + } + } + ] + } + } + } + }, + "properties": { + "identifier": { + "description": "Identifier of the permission or permission set.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + } + } + }, + { + "properties": { + "identifier": { + "description": "Identifier of the permission or permission set.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + "allow": { + "description": "Data that defines what is allowed by the scope.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Value" + } + }, + "deny": { + "description": "Data that defines what is denied by the scope. This should be prioritized by validation logic.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Value" + } + } + } + } + ], + "required": [ + "identifier" + ] + } + ] + }, + "Identifier": { + "description": "Permission identifier", + "oneOf": [ + { + "description": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`", + "type": "string", + "const": "core:default", + "markdownDescription": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`" + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`", + "type": "string", + "const": "core:app:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`" + }, + { + "description": "Enables the app_hide command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-app-hide", + "markdownDescription": "Enables the app_hide command without any pre-configured scope." + }, + { + "description": "Enables the app_show command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-app-show", + "markdownDescription": "Enables the app_show command without any pre-configured scope." + }, + { + "description": "Enables the bundle_type command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-bundle-type", + "markdownDescription": "Enables the bundle_type command without any pre-configured scope." + }, + { + "description": "Enables the default_window_icon command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-default-window-icon", + "markdownDescription": "Enables the default_window_icon command without any pre-configured scope." + }, + { + "description": "Enables the fetch_data_store_identifiers command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-fetch-data-store-identifiers", + "markdownDescription": "Enables the fetch_data_store_identifiers command without any pre-configured scope." + }, + { + "description": "Enables the identifier command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-identifier", + "markdownDescription": "Enables the identifier command without any pre-configured scope." + }, + { + "description": "Enables the name command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-name", + "markdownDescription": "Enables the name command without any pre-configured scope." + }, + { + "description": "Enables the register_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-register-listener", + "markdownDescription": "Enables the register_listener command without any pre-configured scope." + }, + { + "description": "Enables the remove_data_store command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-remove-data-store", + "markdownDescription": "Enables the remove_data_store command without any pre-configured scope." + }, + { + "description": "Enables the remove_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-remove-listener", + "markdownDescription": "Enables the remove_listener command without any pre-configured scope." + }, + { + "description": "Enables the set_app_theme command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-set-app-theme", + "markdownDescription": "Enables the set_app_theme command without any pre-configured scope." + }, + { + "description": "Enables the set_dock_visibility command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-set-dock-visibility", + "markdownDescription": "Enables the set_dock_visibility command without any pre-configured scope." + }, + { + "description": "Enables the tauri_version command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-tauri-version", + "markdownDescription": "Enables the tauri_version command without any pre-configured scope." + }, + { + "description": "Enables the version command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-version", + "markdownDescription": "Enables the version command without any pre-configured scope." + }, + { + "description": "Denies the app_hide command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-app-hide", + "markdownDescription": "Denies the app_hide command without any pre-configured scope." + }, + { + "description": "Denies the app_show command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-app-show", + "markdownDescription": "Denies the app_show command without any pre-configured scope." + }, + { + "description": "Denies the bundle_type command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-bundle-type", + "markdownDescription": "Denies the bundle_type command without any pre-configured scope." + }, + { + "description": "Denies the default_window_icon command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-default-window-icon", + "markdownDescription": "Denies the default_window_icon command without any pre-configured scope." + }, + { + "description": "Denies the fetch_data_store_identifiers command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-fetch-data-store-identifiers", + "markdownDescription": "Denies the fetch_data_store_identifiers command without any pre-configured scope." + }, + { + "description": "Denies the identifier command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-identifier", + "markdownDescription": "Denies the identifier command without any pre-configured scope." + }, + { + "description": "Denies the name command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-name", + "markdownDescription": "Denies the name command without any pre-configured scope." + }, + { + "description": "Denies the register_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-register-listener", + "markdownDescription": "Denies the register_listener command without any pre-configured scope." + }, + { + "description": "Denies the remove_data_store command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-remove-data-store", + "markdownDescription": "Denies the remove_data_store command without any pre-configured scope." + }, + { + "description": "Denies the remove_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-remove-listener", + "markdownDescription": "Denies the remove_listener command without any pre-configured scope." + }, + { + "description": "Denies the set_app_theme command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-set-app-theme", + "markdownDescription": "Denies the set_app_theme command without any pre-configured scope." + }, + { + "description": "Denies the set_dock_visibility command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-set-dock-visibility", + "markdownDescription": "Denies the set_dock_visibility command without any pre-configured scope." + }, + { + "description": "Denies the tauri_version command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-tauri-version", + "markdownDescription": "Denies the tauri_version command without any pre-configured scope." + }, + { + "description": "Denies the version command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-version", + "markdownDescription": "Denies the version command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`", + "type": "string", + "const": "core:event:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`" + }, + { + "description": "Enables the emit command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-emit", + "markdownDescription": "Enables the emit command without any pre-configured scope." + }, + { + "description": "Enables the emit_to command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-emit-to", + "markdownDescription": "Enables the emit_to command without any pre-configured scope." + }, + { + "description": "Enables the listen command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-listen", + "markdownDescription": "Enables the listen command without any pre-configured scope." + }, + { + "description": "Enables the unlisten command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-unlisten", + "markdownDescription": "Enables the unlisten command without any pre-configured scope." + }, + { + "description": "Denies the emit command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-emit", + "markdownDescription": "Denies the emit command without any pre-configured scope." + }, + { + "description": "Denies the emit_to command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-emit-to", + "markdownDescription": "Denies the emit_to command without any pre-configured scope." + }, + { + "description": "Denies the listen command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-listen", + "markdownDescription": "Denies the listen command without any pre-configured scope." + }, + { + "description": "Denies the unlisten command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-unlisten", + "markdownDescription": "Denies the unlisten command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`", + "type": "string", + "const": "core:image:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`" + }, + { + "description": "Enables the from_bytes command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-from-bytes", + "markdownDescription": "Enables the from_bytes command without any pre-configured scope." + }, + { + "description": "Enables the from_path command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-from-path", + "markdownDescription": "Enables the from_path command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the rgba command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-rgba", + "markdownDescription": "Enables the rgba command without any pre-configured scope." + }, + { + "description": "Enables the size command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-size", + "markdownDescription": "Enables the size command without any pre-configured scope." + }, + { + "description": "Denies the from_bytes command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-from-bytes", + "markdownDescription": "Denies the from_bytes command without any pre-configured scope." + }, + { + "description": "Denies the from_path command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-from-path", + "markdownDescription": "Denies the from_path command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the rgba command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-rgba", + "markdownDescription": "Denies the rgba command without any pre-configured scope." + }, + { + "description": "Denies the size command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-size", + "markdownDescription": "Denies the size command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`", + "type": "string", + "const": "core:menu:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`" + }, + { + "description": "Enables the append command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-append", + "markdownDescription": "Enables the append command without any pre-configured scope." + }, + { + "description": "Enables the create_default command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-create-default", + "markdownDescription": "Enables the create_default command without any pre-configured scope." + }, + { + "description": "Enables the get command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-get", + "markdownDescription": "Enables the get command without any pre-configured scope." + }, + { + "description": "Enables the insert command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-insert", + "markdownDescription": "Enables the insert command without any pre-configured scope." + }, + { + "description": "Enables the is_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-is-checked", + "markdownDescription": "Enables the is_checked command without any pre-configured scope." + }, + { + "description": "Enables the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-is-enabled", + "markdownDescription": "Enables the is_enabled command without any pre-configured scope." + }, + { + "description": "Enables the items command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-items", + "markdownDescription": "Enables the items command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the popup command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-popup", + "markdownDescription": "Enables the popup command without any pre-configured scope." + }, + { + "description": "Enables the prepend command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-prepend", + "markdownDescription": "Enables the prepend command without any pre-configured scope." + }, + { + "description": "Enables the remove command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-remove", + "markdownDescription": "Enables the remove command without any pre-configured scope." + }, + { + "description": "Enables the remove_at command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-remove-at", + "markdownDescription": "Enables the remove_at command without any pre-configured scope." + }, + { + "description": "Enables the set_accelerator command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-accelerator", + "markdownDescription": "Enables the set_accelerator command without any pre-configured scope." + }, + { + "description": "Enables the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-app-menu", + "markdownDescription": "Enables the set_as_app_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-help-menu-for-nsapp", + "markdownDescription": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Enables the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-window-menu", + "markdownDescription": "Enables the set_as_window_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-windows-menu-for-nsapp", + "markdownDescription": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Enables the set_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-checked", + "markdownDescription": "Enables the set_checked command without any pre-configured scope." + }, + { + "description": "Enables the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-enabled", + "markdownDescription": "Enables the set_enabled command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-text", + "markdownDescription": "Enables the set_text command without any pre-configured scope." + }, + { + "description": "Enables the text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-text", + "markdownDescription": "Enables the text command without any pre-configured scope." + }, + { + "description": "Denies the append command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-append", + "markdownDescription": "Denies the append command without any pre-configured scope." + }, + { + "description": "Denies the create_default command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-create-default", + "markdownDescription": "Denies the create_default command without any pre-configured scope." + }, + { + "description": "Denies the get command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-get", + "markdownDescription": "Denies the get command without any pre-configured scope." + }, + { + "description": "Denies the insert command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-insert", + "markdownDescription": "Denies the insert command without any pre-configured scope." + }, + { + "description": "Denies the is_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-is-checked", + "markdownDescription": "Denies the is_checked command without any pre-configured scope." + }, + { + "description": "Denies the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-is-enabled", + "markdownDescription": "Denies the is_enabled command without any pre-configured scope." + }, + { + "description": "Denies the items command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-items", + "markdownDescription": "Denies the items command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the popup command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-popup", + "markdownDescription": "Denies the popup command without any pre-configured scope." + }, + { + "description": "Denies the prepend command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-prepend", + "markdownDescription": "Denies the prepend command without any pre-configured scope." + }, + { + "description": "Denies the remove command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-remove", + "markdownDescription": "Denies the remove command without any pre-configured scope." + }, + { + "description": "Denies the remove_at command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-remove-at", + "markdownDescription": "Denies the remove_at command without any pre-configured scope." + }, + { + "description": "Denies the set_accelerator command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-accelerator", + "markdownDescription": "Denies the set_accelerator command without any pre-configured scope." + }, + { + "description": "Denies the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-app-menu", + "markdownDescription": "Denies the set_as_app_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-help-menu-for-nsapp", + "markdownDescription": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Denies the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-window-menu", + "markdownDescription": "Denies the set_as_window_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-windows-menu-for-nsapp", + "markdownDescription": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Denies the set_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-checked", + "markdownDescription": "Denies the set_checked command without any pre-configured scope." + }, + { + "description": "Denies the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-enabled", + "markdownDescription": "Denies the set_enabled command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-text", + "markdownDescription": "Denies the set_text command without any pre-configured scope." + }, + { + "description": "Denies the text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-text", + "markdownDescription": "Denies the text command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`", + "type": "string", + "const": "core:path:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`" + }, + { + "description": "Enables the basename command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-basename", + "markdownDescription": "Enables the basename command without any pre-configured scope." + }, + { + "description": "Enables the dirname command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-dirname", + "markdownDescription": "Enables the dirname command without any pre-configured scope." + }, + { + "description": "Enables the extname command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-extname", + "markdownDescription": "Enables the extname command without any pre-configured scope." + }, + { + "description": "Enables the is_absolute command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-is-absolute", + "markdownDescription": "Enables the is_absolute command without any pre-configured scope." + }, + { + "description": "Enables the join command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-join", + "markdownDescription": "Enables the join command without any pre-configured scope." + }, + { + "description": "Enables the normalize command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-normalize", + "markdownDescription": "Enables the normalize command without any pre-configured scope." + }, + { + "description": "Enables the resolve command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-resolve", + "markdownDescription": "Enables the resolve command without any pre-configured scope." + }, + { + "description": "Enables the resolve_directory command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-resolve-directory", + "markdownDescription": "Enables the resolve_directory command without any pre-configured scope." + }, + { + "description": "Denies the basename command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-basename", + "markdownDescription": "Denies the basename command without any pre-configured scope." + }, + { + "description": "Denies the dirname command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-dirname", + "markdownDescription": "Denies the dirname command without any pre-configured scope." + }, + { + "description": "Denies the extname command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-extname", + "markdownDescription": "Denies the extname command without any pre-configured scope." + }, + { + "description": "Denies the is_absolute command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-is-absolute", + "markdownDescription": "Denies the is_absolute command without any pre-configured scope." + }, + { + "description": "Denies the join command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-join", + "markdownDescription": "Denies the join command without any pre-configured scope." + }, + { + "description": "Denies the normalize command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-normalize", + "markdownDescription": "Denies the normalize command without any pre-configured scope." + }, + { + "description": "Denies the resolve command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-resolve", + "markdownDescription": "Denies the resolve command without any pre-configured scope." + }, + { + "description": "Denies the resolve_directory command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-resolve-directory", + "markdownDescription": "Denies the resolve_directory command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`", + "type": "string", + "const": "core:resources:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`" + }, + { + "description": "Enables the close command without any pre-configured scope.", + "type": "string", + "const": "core:resources:allow-close", + "markdownDescription": "Enables the close command without any pre-configured scope." + }, + { + "description": "Denies the close command without any pre-configured scope.", + "type": "string", + "const": "core:resources:deny-close", + "markdownDescription": "Denies the close command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-show-menu-on-left-click`", + "type": "string", + "const": "core:tray:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-show-menu-on-left-click`" + }, + { + "description": "Enables the get_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-get-by-id", + "markdownDescription": "Enables the get_by_id command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the remove_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-remove-by-id", + "markdownDescription": "Enables the remove_by_id command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-icon-as-template", + "markdownDescription": "Enables the set_icon_as_template command without any pre-configured scope." + }, + { + "description": "Enables the set_menu command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-menu", + "markdownDescription": "Enables the set_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-show-menu-on-left-click", + "markdownDescription": "Enables the set_show_menu_on_left_click command without any pre-configured scope." + }, + { + "description": "Enables the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-temp-dir-path", + "markdownDescription": "Enables the set_temp_dir_path command without any pre-configured scope." + }, + { + "description": "Enables the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-title", + "markdownDescription": "Enables the set_title command without any pre-configured scope." + }, + { + "description": "Enables the set_tooltip command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-tooltip", + "markdownDescription": "Enables the set_tooltip command without any pre-configured scope." + }, + { + "description": "Enables the set_visible command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-visible", + "markdownDescription": "Enables the set_visible command without any pre-configured scope." + }, + { + "description": "Denies the get_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-get-by-id", + "markdownDescription": "Denies the get_by_id command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the remove_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-remove-by-id", + "markdownDescription": "Denies the remove_by_id command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-icon-as-template", + "markdownDescription": "Denies the set_icon_as_template command without any pre-configured scope." + }, + { + "description": "Denies the set_menu command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-menu", + "markdownDescription": "Denies the set_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-show-menu-on-left-click", + "markdownDescription": "Denies the set_show_menu_on_left_click command without any pre-configured scope." + }, + { + "description": "Denies the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-temp-dir-path", + "markdownDescription": "Denies the set_temp_dir_path command without any pre-configured scope." + }, + { + "description": "Denies the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-title", + "markdownDescription": "Denies the set_title command without any pre-configured scope." + }, + { + "description": "Denies the set_tooltip command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-tooltip", + "markdownDescription": "Denies the set_tooltip command without any pre-configured scope." + }, + { + "description": "Denies the set_visible command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-visible", + "markdownDescription": "Denies the set_visible command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`", + "type": "string", + "const": "core:webview:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`" + }, + { + "description": "Enables the clear_all_browsing_data command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-clear-all-browsing-data", + "markdownDescription": "Enables the clear_all_browsing_data command without any pre-configured scope." + }, + { + "description": "Enables the create_webview command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-create-webview", + "markdownDescription": "Enables the create_webview command without any pre-configured scope." + }, + { + "description": "Enables the create_webview_window command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-create-webview-window", + "markdownDescription": "Enables the create_webview_window command without any pre-configured scope." + }, + { + "description": "Enables the get_all_webviews command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-get-all-webviews", + "markdownDescription": "Enables the get_all_webviews command without any pre-configured scope." + }, + { + "description": "Enables the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-internal-toggle-devtools", + "markdownDescription": "Enables the internal_toggle_devtools command without any pre-configured scope." + }, + { + "description": "Enables the print command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-print", + "markdownDescription": "Enables the print command without any pre-configured scope." + }, + { + "description": "Enables the reparent command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-reparent", + "markdownDescription": "Enables the reparent command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_auto_resize command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-auto-resize", + "markdownDescription": "Enables the set_webview_auto_resize command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-background-color", + "markdownDescription": "Enables the set_webview_background_color command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_focus command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-focus", + "markdownDescription": "Enables the set_webview_focus command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-position", + "markdownDescription": "Enables the set_webview_position command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-size", + "markdownDescription": "Enables the set_webview_size command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-zoom", + "markdownDescription": "Enables the set_webview_zoom command without any pre-configured scope." + }, + { + "description": "Enables the webview_close command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-close", + "markdownDescription": "Enables the webview_close command without any pre-configured scope." + }, + { + "description": "Enables the webview_hide command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-hide", + "markdownDescription": "Enables the webview_hide command without any pre-configured scope." + }, + { + "description": "Enables the webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-position", + "markdownDescription": "Enables the webview_position command without any pre-configured scope." + }, + { + "description": "Enables the webview_show command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-show", + "markdownDescription": "Enables the webview_show command without any pre-configured scope." + }, + { + "description": "Enables the webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-size", + "markdownDescription": "Enables the webview_size command without any pre-configured scope." + }, + { + "description": "Denies the clear_all_browsing_data command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-clear-all-browsing-data", + "markdownDescription": "Denies the clear_all_browsing_data command without any pre-configured scope." + }, + { + "description": "Denies the create_webview command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-create-webview", + "markdownDescription": "Denies the create_webview command without any pre-configured scope." + }, + { + "description": "Denies the create_webview_window command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-create-webview-window", + "markdownDescription": "Denies the create_webview_window command without any pre-configured scope." + }, + { + "description": "Denies the get_all_webviews command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-get-all-webviews", + "markdownDescription": "Denies the get_all_webviews command without any pre-configured scope." + }, + { + "description": "Denies the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-internal-toggle-devtools", + "markdownDescription": "Denies the internal_toggle_devtools command without any pre-configured scope." + }, + { + "description": "Denies the print command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-print", + "markdownDescription": "Denies the print command without any pre-configured scope." + }, + { + "description": "Denies the reparent command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-reparent", + "markdownDescription": "Denies the reparent command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_auto_resize command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-auto-resize", + "markdownDescription": "Denies the set_webview_auto_resize command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-background-color", + "markdownDescription": "Denies the set_webview_background_color command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_focus command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-focus", + "markdownDescription": "Denies the set_webview_focus command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-position", + "markdownDescription": "Denies the set_webview_position command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-size", + "markdownDescription": "Denies the set_webview_size command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-zoom", + "markdownDescription": "Denies the set_webview_zoom command without any pre-configured scope." + }, + { + "description": "Denies the webview_close command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-close", + "markdownDescription": "Denies the webview_close command without any pre-configured scope." + }, + { + "description": "Denies the webview_hide command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-hide", + "markdownDescription": "Denies the webview_hide command without any pre-configured scope." + }, + { + "description": "Denies the webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-position", + "markdownDescription": "Denies the webview_position command without any pre-configured scope." + }, + { + "description": "Denies the webview_show command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-show", + "markdownDescription": "Denies the webview_show command without any pre-configured scope." + }, + { + "description": "Denies the webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-size", + "markdownDescription": "Denies the webview_size command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-internal-toggle-maximize`", + "type": "string", + "const": "core:window:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-internal-toggle-maximize`" + }, + { + "description": "Enables the available_monitors command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-available-monitors", + "markdownDescription": "Enables the available_monitors command without any pre-configured scope." + }, + { + "description": "Enables the center command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-center", + "markdownDescription": "Enables the center command without any pre-configured scope." + }, + { + "description": "Enables the close command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-close", + "markdownDescription": "Enables the close command without any pre-configured scope." + }, + { + "description": "Enables the create command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-create", + "markdownDescription": "Enables the create command without any pre-configured scope." + }, + { + "description": "Enables the current_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-current-monitor", + "markdownDescription": "Enables the current_monitor command without any pre-configured scope." + }, + { + "description": "Enables the cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-cursor-position", + "markdownDescription": "Enables the cursor_position command without any pre-configured scope." + }, + { + "description": "Enables the destroy command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-destroy", + "markdownDescription": "Enables the destroy command without any pre-configured scope." + }, + { + "description": "Enables the get_all_windows command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-get-all-windows", + "markdownDescription": "Enables the get_all_windows command without any pre-configured scope." + }, + { + "description": "Enables the hide command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-hide", + "markdownDescription": "Enables the hide command without any pre-configured scope." + }, + { + "description": "Enables the inner_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-inner-position", + "markdownDescription": "Enables the inner_position command without any pre-configured scope." + }, + { + "description": "Enables the inner_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-inner-size", + "markdownDescription": "Enables the inner_size command without any pre-configured scope." + }, + { + "description": "Enables the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-internal-toggle-maximize", + "markdownDescription": "Enables the internal_toggle_maximize command without any pre-configured scope." + }, + { + "description": "Enables the is_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-always-on-top", + "markdownDescription": "Enables the is_always_on_top command without any pre-configured scope." + }, + { + "description": "Enables the is_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-closable", + "markdownDescription": "Enables the is_closable command without any pre-configured scope." + }, + { + "description": "Enables the is_decorated command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-decorated", + "markdownDescription": "Enables the is_decorated command without any pre-configured scope." + }, + { + "description": "Enables the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-enabled", + "markdownDescription": "Enables the is_enabled command without any pre-configured scope." + }, + { + "description": "Enables the is_focused command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-focused", + "markdownDescription": "Enables the is_focused command without any pre-configured scope." + }, + { + "description": "Enables the is_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-fullscreen", + "markdownDescription": "Enables the is_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the is_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-maximizable", + "markdownDescription": "Enables the is_maximizable command without any pre-configured scope." + }, + { + "description": "Enables the is_maximized command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-maximized", + "markdownDescription": "Enables the is_maximized command without any pre-configured scope." + }, + { + "description": "Enables the is_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-minimizable", + "markdownDescription": "Enables the is_minimizable command without any pre-configured scope." + }, + { + "description": "Enables the is_minimized command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-minimized", + "markdownDescription": "Enables the is_minimized command without any pre-configured scope." + }, + { + "description": "Enables the is_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-resizable", + "markdownDescription": "Enables the is_resizable command without any pre-configured scope." + }, + { + "description": "Enables the is_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-visible", + "markdownDescription": "Enables the is_visible command without any pre-configured scope." + }, + { + "description": "Enables the maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-maximize", + "markdownDescription": "Enables the maximize command without any pre-configured scope." + }, + { + "description": "Enables the minimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-minimize", + "markdownDescription": "Enables the minimize command without any pre-configured scope." + }, + { + "description": "Enables the monitor_from_point command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-monitor-from-point", + "markdownDescription": "Enables the monitor_from_point command without any pre-configured scope." + }, + { + "description": "Enables the outer_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-outer-position", + "markdownDescription": "Enables the outer_position command without any pre-configured scope." + }, + { + "description": "Enables the outer_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-outer-size", + "markdownDescription": "Enables the outer_size command without any pre-configured scope." + }, + { + "description": "Enables the primary_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-primary-monitor", + "markdownDescription": "Enables the primary_monitor command without any pre-configured scope." + }, + { + "description": "Enables the request_user_attention command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-request-user-attention", + "markdownDescription": "Enables the request_user_attention command without any pre-configured scope." + }, + { + "description": "Enables the scale_factor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-scale-factor", + "markdownDescription": "Enables the scale_factor command without any pre-configured scope." + }, + { + "description": "Enables the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-always-on-bottom", + "markdownDescription": "Enables the set_always_on_bottom command without any pre-configured scope." + }, + { + "description": "Enables the set_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-always-on-top", + "markdownDescription": "Enables the set_always_on_top command without any pre-configured scope." + }, + { + "description": "Enables the set_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-background-color", + "markdownDescription": "Enables the set_background_color command without any pre-configured scope." + }, + { + "description": "Enables the set_badge_count command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-badge-count", + "markdownDescription": "Enables the set_badge_count command without any pre-configured scope." + }, + { + "description": "Enables the set_badge_label command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-badge-label", + "markdownDescription": "Enables the set_badge_label command without any pre-configured scope." + }, + { + "description": "Enables the set_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-closable", + "markdownDescription": "Enables the set_closable command without any pre-configured scope." + }, + { + "description": "Enables the set_content_protected command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-content-protected", + "markdownDescription": "Enables the set_content_protected command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-grab", + "markdownDescription": "Enables the set_cursor_grab command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-icon", + "markdownDescription": "Enables the set_cursor_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-position", + "markdownDescription": "Enables the set_cursor_position command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-visible", + "markdownDescription": "Enables the set_cursor_visible command without any pre-configured scope." + }, + { + "description": "Enables the set_decorations command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-decorations", + "markdownDescription": "Enables the set_decorations command without any pre-configured scope." + }, + { + "description": "Enables the set_effects command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-effects", + "markdownDescription": "Enables the set_effects command without any pre-configured scope." + }, + { + "description": "Enables the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-enabled", + "markdownDescription": "Enables the set_enabled command without any pre-configured scope." + }, + { + "description": "Enables the set_focus command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-focus", + "markdownDescription": "Enables the set_focus command without any pre-configured scope." + }, + { + "description": "Enables the set_focusable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-focusable", + "markdownDescription": "Enables the set_focusable command without any pre-configured scope." + }, + { + "description": "Enables the set_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-fullscreen", + "markdownDescription": "Enables the set_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-ignore-cursor-events", + "markdownDescription": "Enables the set_ignore_cursor_events command without any pre-configured scope." + }, + { + "description": "Enables the set_max_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-max-size", + "markdownDescription": "Enables the set_max_size command without any pre-configured scope." + }, + { + "description": "Enables the set_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-maximizable", + "markdownDescription": "Enables the set_maximizable command without any pre-configured scope." + }, + { + "description": "Enables the set_min_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-min-size", + "markdownDescription": "Enables the set_min_size command without any pre-configured scope." + }, + { + "description": "Enables the set_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-minimizable", + "markdownDescription": "Enables the set_minimizable command without any pre-configured scope." + }, + { + "description": "Enables the set_overlay_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-overlay-icon", + "markdownDescription": "Enables the set_overlay_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-position", + "markdownDescription": "Enables the set_position command without any pre-configured scope." + }, + { + "description": "Enables the set_progress_bar command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-progress-bar", + "markdownDescription": "Enables the set_progress_bar command without any pre-configured scope." + }, + { + "description": "Enables the set_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-resizable", + "markdownDescription": "Enables the set_resizable command without any pre-configured scope." + }, + { + "description": "Enables the set_shadow command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-shadow", + "markdownDescription": "Enables the set_shadow command without any pre-configured scope." + }, + { + "description": "Enables the set_simple_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-simple-fullscreen", + "markdownDescription": "Enables the set_simple_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the set_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-size", + "markdownDescription": "Enables the set_size command without any pre-configured scope." + }, + { + "description": "Enables the set_size_constraints command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-size-constraints", + "markdownDescription": "Enables the set_size_constraints command without any pre-configured scope." + }, + { + "description": "Enables the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-skip-taskbar", + "markdownDescription": "Enables the set_skip_taskbar command without any pre-configured scope." + }, + { + "description": "Enables the set_theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-theme", + "markdownDescription": "Enables the set_theme command without any pre-configured scope." + }, + { + "description": "Enables the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-title", + "markdownDescription": "Enables the set_title command without any pre-configured scope." + }, + { + "description": "Enables the set_title_bar_style command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-title-bar-style", + "markdownDescription": "Enables the set_title_bar_style command without any pre-configured scope." + }, + { + "description": "Enables the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-visible-on-all-workspaces", + "markdownDescription": "Enables the set_visible_on_all_workspaces command without any pre-configured scope." + }, + { + "description": "Enables the show command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-show", + "markdownDescription": "Enables the show command without any pre-configured scope." + }, + { + "description": "Enables the start_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-start-dragging", + "markdownDescription": "Enables the start_dragging command without any pre-configured scope." + }, + { + "description": "Enables the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-start-resize-dragging", + "markdownDescription": "Enables the start_resize_dragging command without any pre-configured scope." + }, + { + "description": "Enables the theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-theme", + "markdownDescription": "Enables the theme command without any pre-configured scope." + }, + { + "description": "Enables the title command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-title", + "markdownDescription": "Enables the title command without any pre-configured scope." + }, + { + "description": "Enables the toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-toggle-maximize", + "markdownDescription": "Enables the toggle_maximize command without any pre-configured scope." + }, + { + "description": "Enables the unmaximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-unmaximize", + "markdownDescription": "Enables the unmaximize command without any pre-configured scope." + }, + { + "description": "Enables the unminimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-unminimize", + "markdownDescription": "Enables the unminimize command without any pre-configured scope." + }, + { + "description": "Denies the available_monitors command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-available-monitors", + "markdownDescription": "Denies the available_monitors command without any pre-configured scope." + }, + { + "description": "Denies the center command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-center", + "markdownDescription": "Denies the center command without any pre-configured scope." + }, + { + "description": "Denies the close command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-close", + "markdownDescription": "Denies the close command without any pre-configured scope." + }, + { + "description": "Denies the create command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-create", + "markdownDescription": "Denies the create command without any pre-configured scope." + }, + { + "description": "Denies the current_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-current-monitor", + "markdownDescription": "Denies the current_monitor command without any pre-configured scope." + }, + { + "description": "Denies the cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-cursor-position", + "markdownDescription": "Denies the cursor_position command without any pre-configured scope." + }, + { + "description": "Denies the destroy command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-destroy", + "markdownDescription": "Denies the destroy command without any pre-configured scope." + }, + { + "description": "Denies the get_all_windows command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-get-all-windows", + "markdownDescription": "Denies the get_all_windows command without any pre-configured scope." + }, + { + "description": "Denies the hide command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-hide", + "markdownDescription": "Denies the hide command without any pre-configured scope." + }, + { + "description": "Denies the inner_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-inner-position", + "markdownDescription": "Denies the inner_position command without any pre-configured scope." + }, + { + "description": "Denies the inner_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-inner-size", + "markdownDescription": "Denies the inner_size command without any pre-configured scope." + }, + { + "description": "Denies the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-internal-toggle-maximize", + "markdownDescription": "Denies the internal_toggle_maximize command without any pre-configured scope." + }, + { + "description": "Denies the is_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-always-on-top", + "markdownDescription": "Denies the is_always_on_top command without any pre-configured scope." + }, + { + "description": "Denies the is_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-closable", + "markdownDescription": "Denies the is_closable command without any pre-configured scope." + }, + { + "description": "Denies the is_decorated command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-decorated", + "markdownDescription": "Denies the is_decorated command without any pre-configured scope." + }, + { + "description": "Denies the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-enabled", + "markdownDescription": "Denies the is_enabled command without any pre-configured scope." + }, + { + "description": "Denies the is_focused command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-focused", + "markdownDescription": "Denies the is_focused command without any pre-configured scope." + }, + { + "description": "Denies the is_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-fullscreen", + "markdownDescription": "Denies the is_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the is_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-maximizable", + "markdownDescription": "Denies the is_maximizable command without any pre-configured scope." + }, + { + "description": "Denies the is_maximized command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-maximized", + "markdownDescription": "Denies the is_maximized command without any pre-configured scope." + }, + { + "description": "Denies the is_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-minimizable", + "markdownDescription": "Denies the is_minimizable command without any pre-configured scope." + }, + { + "description": "Denies the is_minimized command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-minimized", + "markdownDescription": "Denies the is_minimized command without any pre-configured scope." + }, + { + "description": "Denies the is_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-resizable", + "markdownDescription": "Denies the is_resizable command without any pre-configured scope." + }, + { + "description": "Denies the is_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-visible", + "markdownDescription": "Denies the is_visible command without any pre-configured scope." + }, + { + "description": "Denies the maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-maximize", + "markdownDescription": "Denies the maximize command without any pre-configured scope." + }, + { + "description": "Denies the minimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-minimize", + "markdownDescription": "Denies the minimize command without any pre-configured scope." + }, + { + "description": "Denies the monitor_from_point command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-monitor-from-point", + "markdownDescription": "Denies the monitor_from_point command without any pre-configured scope." + }, + { + "description": "Denies the outer_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-outer-position", + "markdownDescription": "Denies the outer_position command without any pre-configured scope." + }, + { + "description": "Denies the outer_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-outer-size", + "markdownDescription": "Denies the outer_size command without any pre-configured scope." + }, + { + "description": "Denies the primary_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-primary-monitor", + "markdownDescription": "Denies the primary_monitor command without any pre-configured scope." + }, + { + "description": "Denies the request_user_attention command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-request-user-attention", + "markdownDescription": "Denies the request_user_attention command without any pre-configured scope." + }, + { + "description": "Denies the scale_factor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-scale-factor", + "markdownDescription": "Denies the scale_factor command without any pre-configured scope." + }, + { + "description": "Denies the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-always-on-bottom", + "markdownDescription": "Denies the set_always_on_bottom command without any pre-configured scope." + }, + { + "description": "Denies the set_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-always-on-top", + "markdownDescription": "Denies the set_always_on_top command without any pre-configured scope." + }, + { + "description": "Denies the set_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-background-color", + "markdownDescription": "Denies the set_background_color command without any pre-configured scope." + }, + { + "description": "Denies the set_badge_count command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-badge-count", + "markdownDescription": "Denies the set_badge_count command without any pre-configured scope." + }, + { + "description": "Denies the set_badge_label command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-badge-label", + "markdownDescription": "Denies the set_badge_label command without any pre-configured scope." + }, + { + "description": "Denies the set_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-closable", + "markdownDescription": "Denies the set_closable command without any pre-configured scope." + }, + { + "description": "Denies the set_content_protected command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-content-protected", + "markdownDescription": "Denies the set_content_protected command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-grab", + "markdownDescription": "Denies the set_cursor_grab command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-icon", + "markdownDescription": "Denies the set_cursor_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-position", + "markdownDescription": "Denies the set_cursor_position command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-visible", + "markdownDescription": "Denies the set_cursor_visible command without any pre-configured scope." + }, + { + "description": "Denies the set_decorations command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-decorations", + "markdownDescription": "Denies the set_decorations command without any pre-configured scope." + }, + { + "description": "Denies the set_effects command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-effects", + "markdownDescription": "Denies the set_effects command without any pre-configured scope." + }, + { + "description": "Denies the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-enabled", + "markdownDescription": "Denies the set_enabled command without any pre-configured scope." + }, + { + "description": "Denies the set_focus command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-focus", + "markdownDescription": "Denies the set_focus command without any pre-configured scope." + }, + { + "description": "Denies the set_focusable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-focusable", + "markdownDescription": "Denies the set_focusable command without any pre-configured scope." + }, + { + "description": "Denies the set_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-fullscreen", + "markdownDescription": "Denies the set_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-ignore-cursor-events", + "markdownDescription": "Denies the set_ignore_cursor_events command without any pre-configured scope." + }, + { + "description": "Denies the set_max_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-max-size", + "markdownDescription": "Denies the set_max_size command without any pre-configured scope." + }, + { + "description": "Denies the set_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-maximizable", + "markdownDescription": "Denies the set_maximizable command without any pre-configured scope." + }, + { + "description": "Denies the set_min_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-min-size", + "markdownDescription": "Denies the set_min_size command without any pre-configured scope." + }, + { + "description": "Denies the set_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-minimizable", + "markdownDescription": "Denies the set_minimizable command without any pre-configured scope." + }, + { + "description": "Denies the set_overlay_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-overlay-icon", + "markdownDescription": "Denies the set_overlay_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-position", + "markdownDescription": "Denies the set_position command without any pre-configured scope." + }, + { + "description": "Denies the set_progress_bar command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-progress-bar", + "markdownDescription": "Denies the set_progress_bar command without any pre-configured scope." + }, + { + "description": "Denies the set_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-resizable", + "markdownDescription": "Denies the set_resizable command without any pre-configured scope." + }, + { + "description": "Denies the set_shadow command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-shadow", + "markdownDescription": "Denies the set_shadow command without any pre-configured scope." + }, + { + "description": "Denies the set_simple_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-simple-fullscreen", + "markdownDescription": "Denies the set_simple_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the set_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-size", + "markdownDescription": "Denies the set_size command without any pre-configured scope." + }, + { + "description": "Denies the set_size_constraints command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-size-constraints", + "markdownDescription": "Denies the set_size_constraints command without any pre-configured scope." + }, + { + "description": "Denies the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-skip-taskbar", + "markdownDescription": "Denies the set_skip_taskbar command without any pre-configured scope." + }, + { + "description": "Denies the set_theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-theme", + "markdownDescription": "Denies the set_theme command without any pre-configured scope." + }, + { + "description": "Denies the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-title", + "markdownDescription": "Denies the set_title command without any pre-configured scope." + }, + { + "description": "Denies the set_title_bar_style command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-title-bar-style", + "markdownDescription": "Denies the set_title_bar_style command without any pre-configured scope." + }, + { + "description": "Denies the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-visible-on-all-workspaces", + "markdownDescription": "Denies the set_visible_on_all_workspaces command without any pre-configured scope." + }, + { + "description": "Denies the show command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-show", + "markdownDescription": "Denies the show command without any pre-configured scope." + }, + { + "description": "Denies the start_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-start-dragging", + "markdownDescription": "Denies the start_dragging command without any pre-configured scope." + }, + { + "description": "Denies the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-start-resize-dragging", + "markdownDescription": "Denies the start_resize_dragging command without any pre-configured scope." + }, + { + "description": "Denies the theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-theme", + "markdownDescription": "Denies the theme command without any pre-configured scope." + }, + { + "description": "Denies the title command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-title", + "markdownDescription": "Denies the title command without any pre-configured scope." + }, + { + "description": "Denies the toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-toggle-maximize", + "markdownDescription": "Denies the toggle_maximize command without any pre-configured scope." + }, + { + "description": "Denies the unmaximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-unmaximize", + "markdownDescription": "Denies the unmaximize command without any pre-configured scope." + }, + { + "description": "Denies the unminimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-unminimize", + "markdownDescription": "Denies the unminimize command without any pre-configured scope." + }, + { + "description": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`", + "type": "string", + "const": "opener:default", + "markdownDescription": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`" + }, + { + "description": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application.", + "type": "string", + "const": "opener:allow-default-urls", + "markdownDescription": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application." + }, + { + "description": "Enables the open_path command without any pre-configured scope.", + "type": "string", + "const": "opener:allow-open-path", + "markdownDescription": "Enables the open_path command without any pre-configured scope." + }, + { + "description": "Enables the open_url command without any pre-configured scope.", + "type": "string", + "const": "opener:allow-open-url", + "markdownDescription": "Enables the open_url command without any pre-configured scope." + }, + { + "description": "Enables the reveal_item_in_dir command without any pre-configured scope.", + "type": "string", + "const": "opener:allow-reveal-item-in-dir", + "markdownDescription": "Enables the reveal_item_in_dir command without any pre-configured scope." + }, + { + "description": "Denies the open_path command without any pre-configured scope.", + "type": "string", + "const": "opener:deny-open-path", + "markdownDescription": "Denies the open_path command without any pre-configured scope." + }, + { + "description": "Denies the open_url command without any pre-configured scope.", + "type": "string", + "const": "opener:deny-open-url", + "markdownDescription": "Denies the open_url command without any pre-configured scope." + }, + { + "description": "Denies the reveal_item_in_dir command without any pre-configured scope.", + "type": "string", + "const": "opener:deny-reveal-item-in-dir", + "markdownDescription": "Denies the reveal_item_in_dir command without any pre-configured scope." + }, + { + "description": "This permission set configures what kind of\noperations are available from the store plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n\n#### This default permission set includes:\n\n- `allow-load`\n- `allow-get-store`\n- `allow-set`\n- `allow-get`\n- `allow-has`\n- `allow-delete`\n- `allow-clear`\n- `allow-reset`\n- `allow-keys`\n- `allow-values`\n- `allow-entries`\n- `allow-length`\n- `allow-reload`\n- `allow-save`", + "type": "string", + "const": "store:default", + "markdownDescription": "This permission set configures what kind of\noperations are available from the store plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n\n#### This default permission set includes:\n\n- `allow-load`\n- `allow-get-store`\n- `allow-set`\n- `allow-get`\n- `allow-has`\n- `allow-delete`\n- `allow-clear`\n- `allow-reset`\n- `allow-keys`\n- `allow-values`\n- `allow-entries`\n- `allow-length`\n- `allow-reload`\n- `allow-save`" + }, + { + "description": "Enables the clear command without any pre-configured scope.", + "type": "string", + "const": "store:allow-clear", + "markdownDescription": "Enables the clear command without any pre-configured scope." + }, + { + "description": "Enables the delete command without any pre-configured scope.", + "type": "string", + "const": "store:allow-delete", + "markdownDescription": "Enables the delete command without any pre-configured scope." + }, + { + "description": "Enables the entries command without any pre-configured scope.", + "type": "string", + "const": "store:allow-entries", + "markdownDescription": "Enables the entries command without any pre-configured scope." + }, + { + "description": "Enables the get command without any pre-configured scope.", + "type": "string", + "const": "store:allow-get", + "markdownDescription": "Enables the get command without any pre-configured scope." + }, + { + "description": "Enables the get_store command without any pre-configured scope.", + "type": "string", + "const": "store:allow-get-store", + "markdownDescription": "Enables the get_store command without any pre-configured scope." + }, + { + "description": "Enables the has command without any pre-configured scope.", + "type": "string", + "const": "store:allow-has", + "markdownDescription": "Enables the has command without any pre-configured scope." + }, + { + "description": "Enables the keys command without any pre-configured scope.", + "type": "string", + "const": "store:allow-keys", + "markdownDescription": "Enables the keys command without any pre-configured scope." + }, + { + "description": "Enables the length command without any pre-configured scope.", + "type": "string", + "const": "store:allow-length", + "markdownDescription": "Enables the length command without any pre-configured scope." + }, + { + "description": "Enables the load command without any pre-configured scope.", + "type": "string", + "const": "store:allow-load", + "markdownDescription": "Enables the load command without any pre-configured scope." + }, + { + "description": "Enables the reload command without any pre-configured scope.", + "type": "string", + "const": "store:allow-reload", + "markdownDescription": "Enables the reload command without any pre-configured scope." + }, + { + "description": "Enables the reset command without any pre-configured scope.", + "type": "string", + "const": "store:allow-reset", + "markdownDescription": "Enables the reset command without any pre-configured scope." + }, + { + "description": "Enables the save command without any pre-configured scope.", + "type": "string", + "const": "store:allow-save", + "markdownDescription": "Enables the save command without any pre-configured scope." + }, + { + "description": "Enables the set command without any pre-configured scope.", + "type": "string", + "const": "store:allow-set", + "markdownDescription": "Enables the set command without any pre-configured scope." + }, + { + "description": "Enables the values command without any pre-configured scope.", + "type": "string", + "const": "store:allow-values", + "markdownDescription": "Enables the values command without any pre-configured scope." + }, + { + "description": "Denies the clear command without any pre-configured scope.", + "type": "string", + "const": "store:deny-clear", + "markdownDescription": "Denies the clear command without any pre-configured scope." + }, + { + "description": "Denies the delete command without any pre-configured scope.", + "type": "string", + "const": "store:deny-delete", + "markdownDescription": "Denies the delete command without any pre-configured scope." + }, + { + "description": "Denies the entries command without any pre-configured scope.", + "type": "string", + "const": "store:deny-entries", + "markdownDescription": "Denies the entries command without any pre-configured scope." + }, + { + "description": "Denies the get command without any pre-configured scope.", + "type": "string", + "const": "store:deny-get", + "markdownDescription": "Denies the get command without any pre-configured scope." + }, + { + "description": "Denies the get_store command without any pre-configured scope.", + "type": "string", + "const": "store:deny-get-store", + "markdownDescription": "Denies the get_store command without any pre-configured scope." + }, + { + "description": "Denies the has command without any pre-configured scope.", + "type": "string", + "const": "store:deny-has", + "markdownDescription": "Denies the has command without any pre-configured scope." + }, + { + "description": "Denies the keys command without any pre-configured scope.", + "type": "string", + "const": "store:deny-keys", + "markdownDescription": "Denies the keys command without any pre-configured scope." + }, + { + "description": "Denies the length command without any pre-configured scope.", + "type": "string", + "const": "store:deny-length", + "markdownDescription": "Denies the length command without any pre-configured scope." + }, + { + "description": "Denies the load command without any pre-configured scope.", + "type": "string", + "const": "store:deny-load", + "markdownDescription": "Denies the load command without any pre-configured scope." + }, + { + "description": "Denies the reload command without any pre-configured scope.", + "type": "string", + "const": "store:deny-reload", + "markdownDescription": "Denies the reload command without any pre-configured scope." + }, + { + "description": "Denies the reset command without any pre-configured scope.", + "type": "string", + "const": "store:deny-reset", + "markdownDescription": "Denies the reset command without any pre-configured scope." + }, + { + "description": "Denies the save command without any pre-configured scope.", + "type": "string", + "const": "store:deny-save", + "markdownDescription": "Denies the save command without any pre-configured scope." + }, + { + "description": "Denies the set command without any pre-configured scope.", + "type": "string", + "const": "store:deny-set", + "markdownDescription": "Denies the set command without any pre-configured scope." + }, + { + "description": "Denies the values command without any pre-configured scope.", + "type": "string", + "const": "store:deny-values", + "markdownDescription": "Denies the values command without any pre-configured scope." + } + ] + }, + "Value": { + "description": "All supported ACL values.", + "anyOf": [ + { + "description": "Represents a null JSON value.", + "type": "null" + }, + { + "description": "Represents a [`bool`].", + "type": "boolean" + }, + { + "description": "Represents a valid ACL [`Number`].", + "allOf": [ + { + "$ref": "#/definitions/Number" + } + ] + }, + { + "description": "Represents a [`String`].", + "type": "string" + }, + { + "description": "Represents a list of other [`Value`]s.", + "type": "array", + "items": { + "$ref": "#/definitions/Value" + } + }, + { + "description": "Represents a map of [`String`] keys to [`Value`]s.", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Value" + } + } + ] + }, + "Number": { + "description": "A valid ACL number.", + "anyOf": [ + { + "description": "Represents an [`i64`].", + "type": "integer", + "format": "int64" + }, + { + "description": "Represents a [`f64`].", + "type": "number", + "format": "double" + } + ] + }, + "Target": { + "description": "Platform target.", + "oneOf": [ + { + "description": "MacOS.", + "type": "string", + "enum": [ + "macOS" + ] + }, + { + "description": "Windows.", + "type": "string", + "enum": [ + "windows" + ] + }, + { + "description": "Linux.", + "type": "string", + "enum": [ + "linux" + ] + }, + { + "description": "Android.", + "type": "string", + "enum": [ + "android" + ] + }, + { + "description": "iOS.", + "type": "string", + "enum": [ + "iOS" + ] + } + ] + }, + "Application": { + "description": "Opener scope application.", + "anyOf": [ + { + "description": "Open in default application.", + "type": "null" + }, + { + "description": "If true, allow open with any application.", + "type": "boolean" + }, + { + "description": "Allow specific application to open with.", + "type": "string" + } + ] + } + } +} \ No newline at end of file diff --git a/broadcast-client/src-tauri/gen/schemas/windows-schema.json b/broadcast-client/src-tauri/gen/schemas/windows-schema.json new file mode 100644 index 0000000..8d380f2 --- /dev/null +++ b/broadcast-client/src-tauri/gen/schemas/windows-schema.json @@ -0,0 +1,2651 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "CapabilityFile", + "description": "Capability formats accepted in a capability file.", + "anyOf": [ + { + "description": "A single capability.", + "allOf": [ + { + "$ref": "#/definitions/Capability" + } + ] + }, + { + "description": "A list of capabilities.", + "type": "array", + "items": { + "$ref": "#/definitions/Capability" + } + }, + { + "description": "A list of capabilities.", + "type": "object", + "required": [ + "capabilities" + ], + "properties": { + "capabilities": { + "description": "The list of capabilities.", + "type": "array", + "items": { + "$ref": "#/definitions/Capability" + } + } + } + } + ], + "definitions": { + "Capability": { + "description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\nIt controls application windows' and webviews' fine grained access to the Tauri core, application, or plugin commands. If a webview or its window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create groups of windows, based on their required system access, which can reduce impact of frontend vulnerabilities in less privileged windows. Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`. A Window can have none, one, or multiple associated capabilities.\n\n## Example\n\n```json { \"identifier\": \"main-user-files-write\", \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.\", \"windows\": [ \"main\" ], \"permissions\": [ \"core:default\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] }, ], \"platforms\": [\"macOS\",\"windows\"] } ```", + "type": "object", + "required": [ + "identifier", + "permissions" + ], + "properties": { + "identifier": { + "description": "Identifier of the capability.\n\n## Example\n\n`main-user-files-write`", + "type": "string" + }, + "description": { + "description": "Description of what the capability is intended to allow on associated windows.\n\nIt should contain a description of what the grouped permissions should allow.\n\n## Example\n\nThis capability allows the `main` window access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.", + "default": "", + "type": "string" + }, + "remote": { + "description": "Configure remote URLs that can use the capability permissions.\n\nThis setting is optional and defaults to not being set, as our default use case is that the content is served from our local application.\n\n:::caution Make sure you understand the security implications of providing remote sources with local system access. :::\n\n## Example\n\n```json { \"urls\": [\"https://*.mydomain.dev\"] } ```", + "anyOf": [ + { + "$ref": "#/definitions/CapabilityRemote" + }, + { + "type": "null" + } + ] + }, + "local": { + "description": "Whether this capability is enabled for local app URLs or not. Defaults to `true`.", + "default": true, + "type": "boolean" + }, + "windows": { + "description": "List of windows that are affected by this capability. Can be a glob pattern.\n\nIf a window label matches any of the patterns in this list, the capability will be enabled on all the webviews of that window, regardless of the value of [`Self::webviews`].\n\nOn multiwebview windows, prefer specifying [`Self::webviews`] and omitting [`Self::windows`] for a fine grained access control.\n\n## Example\n\n`[\"main\"]`", + "type": "array", + "items": { + "type": "string" + } + }, + "webviews": { + "description": "List of webviews that are affected by this capability. Can be a glob pattern.\n\nThe capability will be enabled on all the webviews whose label matches any of the patterns in this list, regardless of whether the webview's window label matches a pattern in [`Self::windows`].\n\n## Example\n\n`[\"sub-webview-one\", \"sub-webview-two\"]`", + "type": "array", + "items": { + "type": "string" + } + }, + "permissions": { + "description": "List of permissions attached to this capability.\n\nMust include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`. For commands directly implemented in the application itself only `${permission-name}` is required.\n\n## Example\n\n```json [ \"core:default\", \"shell:allow-open\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] } ] ```", + "type": "array", + "items": { + "$ref": "#/definitions/PermissionEntry" + }, + "uniqueItems": true + }, + "platforms": { + "description": "Limit which target platforms this capability applies to.\n\nBy default all platforms are targeted.\n\n## Example\n\n`[\"macOS\",\"windows\"]`", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Target" + } + } + } + }, + "CapabilityRemote": { + "description": "Configuration for remote URLs that are associated with the capability.", + "type": "object", + "required": [ + "urls" + ], + "properties": { + "urls": { + "description": "Remote domains this capability refers to using the [URLPattern standard](https://urlpattern.spec.whatwg.org/).\n\n## Examples\n\n- \"https://*.mydomain.dev\": allows subdomains of mydomain.dev - \"https://mydomain.dev/api/*\": allows any subpath of mydomain.dev/api", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "PermissionEntry": { + "description": "An entry for a permission value in a [`Capability`] can be either a raw permission [`Identifier`] or an object that references a permission and extends its scope.", + "anyOf": [ + { + "description": "Reference a permission or permission set by identifier.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + { + "description": "Reference a permission or permission set by identifier and extends its scope.", + "type": "object", + "allOf": [ + { + "if": { + "properties": { + "identifier": { + "anyOf": [ + { + "description": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`", + "type": "string", + "const": "opener:default", + "markdownDescription": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`" + }, + { + "description": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application.", + "type": "string", + "const": "opener:allow-default-urls", + "markdownDescription": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application." + }, + { + "description": "Enables the open_path command without any pre-configured scope.", + "type": "string", + "const": "opener:allow-open-path", + "markdownDescription": "Enables the open_path command without any pre-configured scope." + }, + { + "description": "Enables the open_url command without any pre-configured scope.", + "type": "string", + "const": "opener:allow-open-url", + "markdownDescription": "Enables the open_url command without any pre-configured scope." + }, + { + "description": "Enables the reveal_item_in_dir command without any pre-configured scope.", + "type": "string", + "const": "opener:allow-reveal-item-in-dir", + "markdownDescription": "Enables the reveal_item_in_dir command without any pre-configured scope." + }, + { + "description": "Denies the open_path command without any pre-configured scope.", + "type": "string", + "const": "opener:deny-open-path", + "markdownDescription": "Denies the open_path command without any pre-configured scope." + }, + { + "description": "Denies the open_url command without any pre-configured scope.", + "type": "string", + "const": "opener:deny-open-url", + "markdownDescription": "Denies the open_url command without any pre-configured scope." + }, + { + "description": "Denies the reveal_item_in_dir command without any pre-configured scope.", + "type": "string", + "const": "opener:deny-reveal-item-in-dir", + "markdownDescription": "Denies the reveal_item_in_dir command without any pre-configured scope." + } + ] + } + } + }, + "then": { + "properties": { + "allow": { + "items": { + "title": "OpenerScopeEntry", + "description": "Opener scope entry.", + "anyOf": [ + { + "type": "object", + "required": [ + "url" + ], + "properties": { + "app": { + "description": "An application to open this url with, for example: firefox.", + "allOf": [ + { + "$ref": "#/definitions/Application" + } + ] + }, + "url": { + "description": "A URL that can be opened by the webview when using the Opener APIs.\n\nWildcards can be used following the UNIX glob pattern.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"", + "type": "string" + } + } + }, + { + "type": "object", + "required": [ + "path" + ], + "properties": { + "app": { + "description": "An application to open this path with, for example: xdg-open.", + "allOf": [ + { + "$ref": "#/definitions/Application" + } + ] + }, + "path": { + "description": "A path that can be opened by the webview when using the Opener APIs.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + } + } + } + ] + } + }, + "deny": { + "items": { + "title": "OpenerScopeEntry", + "description": "Opener scope entry.", + "anyOf": [ + { + "type": "object", + "required": [ + "url" + ], + "properties": { + "app": { + "description": "An application to open this url with, for example: firefox.", + "allOf": [ + { + "$ref": "#/definitions/Application" + } + ] + }, + "url": { + "description": "A URL that can be opened by the webview when using the Opener APIs.\n\nWildcards can be used following the UNIX glob pattern.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"", + "type": "string" + } + } + }, + { + "type": "object", + "required": [ + "path" + ], + "properties": { + "app": { + "description": "An application to open this path with, for example: xdg-open.", + "allOf": [ + { + "$ref": "#/definitions/Application" + } + ] + }, + "path": { + "description": "A path that can be opened by the webview when using the Opener APIs.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + } + } + } + ] + } + } + } + }, + "properties": { + "identifier": { + "description": "Identifier of the permission or permission set.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + } + } + }, + { + "properties": { + "identifier": { + "description": "Identifier of the permission or permission set.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + "allow": { + "description": "Data that defines what is allowed by the scope.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Value" + } + }, + "deny": { + "description": "Data that defines what is denied by the scope. This should be prioritized by validation logic.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Value" + } + } + } + } + ], + "required": [ + "identifier" + ] + } + ] + }, + "Identifier": { + "description": "Permission identifier", + "oneOf": [ + { + "description": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`", + "type": "string", + "const": "core:default", + "markdownDescription": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`" + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`", + "type": "string", + "const": "core:app:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`" + }, + { + "description": "Enables the app_hide command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-app-hide", + "markdownDescription": "Enables the app_hide command without any pre-configured scope." + }, + { + "description": "Enables the app_show command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-app-show", + "markdownDescription": "Enables the app_show command without any pre-configured scope." + }, + { + "description": "Enables the bundle_type command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-bundle-type", + "markdownDescription": "Enables the bundle_type command without any pre-configured scope." + }, + { + "description": "Enables the default_window_icon command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-default-window-icon", + "markdownDescription": "Enables the default_window_icon command without any pre-configured scope." + }, + { + "description": "Enables the fetch_data_store_identifiers command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-fetch-data-store-identifiers", + "markdownDescription": "Enables the fetch_data_store_identifiers command without any pre-configured scope." + }, + { + "description": "Enables the identifier command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-identifier", + "markdownDescription": "Enables the identifier command without any pre-configured scope." + }, + { + "description": "Enables the name command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-name", + "markdownDescription": "Enables the name command without any pre-configured scope." + }, + { + "description": "Enables the register_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-register-listener", + "markdownDescription": "Enables the register_listener command without any pre-configured scope." + }, + { + "description": "Enables the remove_data_store command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-remove-data-store", + "markdownDescription": "Enables the remove_data_store command without any pre-configured scope." + }, + { + "description": "Enables the remove_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-remove-listener", + "markdownDescription": "Enables the remove_listener command without any pre-configured scope." + }, + { + "description": "Enables the set_app_theme command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-set-app-theme", + "markdownDescription": "Enables the set_app_theme command without any pre-configured scope." + }, + { + "description": "Enables the set_dock_visibility command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-set-dock-visibility", + "markdownDescription": "Enables the set_dock_visibility command without any pre-configured scope." + }, + { + "description": "Enables the tauri_version command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-tauri-version", + "markdownDescription": "Enables the tauri_version command without any pre-configured scope." + }, + { + "description": "Enables the version command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-version", + "markdownDescription": "Enables the version command without any pre-configured scope." + }, + { + "description": "Denies the app_hide command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-app-hide", + "markdownDescription": "Denies the app_hide command without any pre-configured scope." + }, + { + "description": "Denies the app_show command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-app-show", + "markdownDescription": "Denies the app_show command without any pre-configured scope." + }, + { + "description": "Denies the bundle_type command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-bundle-type", + "markdownDescription": "Denies the bundle_type command without any pre-configured scope." + }, + { + "description": "Denies the default_window_icon command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-default-window-icon", + "markdownDescription": "Denies the default_window_icon command without any pre-configured scope." + }, + { + "description": "Denies the fetch_data_store_identifiers command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-fetch-data-store-identifiers", + "markdownDescription": "Denies the fetch_data_store_identifiers command without any pre-configured scope." + }, + { + "description": "Denies the identifier command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-identifier", + "markdownDescription": "Denies the identifier command without any pre-configured scope." + }, + { + "description": "Denies the name command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-name", + "markdownDescription": "Denies the name command without any pre-configured scope." + }, + { + "description": "Denies the register_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-register-listener", + "markdownDescription": "Denies the register_listener command without any pre-configured scope." + }, + { + "description": "Denies the remove_data_store command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-remove-data-store", + "markdownDescription": "Denies the remove_data_store command without any pre-configured scope." + }, + { + "description": "Denies the remove_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-remove-listener", + "markdownDescription": "Denies the remove_listener command without any pre-configured scope." + }, + { + "description": "Denies the set_app_theme command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-set-app-theme", + "markdownDescription": "Denies the set_app_theme command without any pre-configured scope." + }, + { + "description": "Denies the set_dock_visibility command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-set-dock-visibility", + "markdownDescription": "Denies the set_dock_visibility command without any pre-configured scope." + }, + { + "description": "Denies the tauri_version command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-tauri-version", + "markdownDescription": "Denies the tauri_version command without any pre-configured scope." + }, + { + "description": "Denies the version command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-version", + "markdownDescription": "Denies the version command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`", + "type": "string", + "const": "core:event:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`" + }, + { + "description": "Enables the emit command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-emit", + "markdownDescription": "Enables the emit command without any pre-configured scope." + }, + { + "description": "Enables the emit_to command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-emit-to", + "markdownDescription": "Enables the emit_to command without any pre-configured scope." + }, + { + "description": "Enables the listen command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-listen", + "markdownDescription": "Enables the listen command without any pre-configured scope." + }, + { + "description": "Enables the unlisten command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-unlisten", + "markdownDescription": "Enables the unlisten command without any pre-configured scope." + }, + { + "description": "Denies the emit command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-emit", + "markdownDescription": "Denies the emit command without any pre-configured scope." + }, + { + "description": "Denies the emit_to command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-emit-to", + "markdownDescription": "Denies the emit_to command without any pre-configured scope." + }, + { + "description": "Denies the listen command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-listen", + "markdownDescription": "Denies the listen command without any pre-configured scope." + }, + { + "description": "Denies the unlisten command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-unlisten", + "markdownDescription": "Denies the unlisten command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`", + "type": "string", + "const": "core:image:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`" + }, + { + "description": "Enables the from_bytes command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-from-bytes", + "markdownDescription": "Enables the from_bytes command without any pre-configured scope." + }, + { + "description": "Enables the from_path command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-from-path", + "markdownDescription": "Enables the from_path command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the rgba command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-rgba", + "markdownDescription": "Enables the rgba command without any pre-configured scope." + }, + { + "description": "Enables the size command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-size", + "markdownDescription": "Enables the size command without any pre-configured scope." + }, + { + "description": "Denies the from_bytes command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-from-bytes", + "markdownDescription": "Denies the from_bytes command without any pre-configured scope." + }, + { + "description": "Denies the from_path command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-from-path", + "markdownDescription": "Denies the from_path command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the rgba command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-rgba", + "markdownDescription": "Denies the rgba command without any pre-configured scope." + }, + { + "description": "Denies the size command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-size", + "markdownDescription": "Denies the size command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`", + "type": "string", + "const": "core:menu:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`" + }, + { + "description": "Enables the append command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-append", + "markdownDescription": "Enables the append command without any pre-configured scope." + }, + { + "description": "Enables the create_default command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-create-default", + "markdownDescription": "Enables the create_default command without any pre-configured scope." + }, + { + "description": "Enables the get command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-get", + "markdownDescription": "Enables the get command without any pre-configured scope." + }, + { + "description": "Enables the insert command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-insert", + "markdownDescription": "Enables the insert command without any pre-configured scope." + }, + { + "description": "Enables the is_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-is-checked", + "markdownDescription": "Enables the is_checked command without any pre-configured scope." + }, + { + "description": "Enables the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-is-enabled", + "markdownDescription": "Enables the is_enabled command without any pre-configured scope." + }, + { + "description": "Enables the items command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-items", + "markdownDescription": "Enables the items command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the popup command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-popup", + "markdownDescription": "Enables the popup command without any pre-configured scope." + }, + { + "description": "Enables the prepend command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-prepend", + "markdownDescription": "Enables the prepend command without any pre-configured scope." + }, + { + "description": "Enables the remove command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-remove", + "markdownDescription": "Enables the remove command without any pre-configured scope." + }, + { + "description": "Enables the remove_at command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-remove-at", + "markdownDescription": "Enables the remove_at command without any pre-configured scope." + }, + { + "description": "Enables the set_accelerator command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-accelerator", + "markdownDescription": "Enables the set_accelerator command without any pre-configured scope." + }, + { + "description": "Enables the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-app-menu", + "markdownDescription": "Enables the set_as_app_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-help-menu-for-nsapp", + "markdownDescription": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Enables the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-window-menu", + "markdownDescription": "Enables the set_as_window_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-windows-menu-for-nsapp", + "markdownDescription": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Enables the set_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-checked", + "markdownDescription": "Enables the set_checked command without any pre-configured scope." + }, + { + "description": "Enables the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-enabled", + "markdownDescription": "Enables the set_enabled command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-text", + "markdownDescription": "Enables the set_text command without any pre-configured scope." + }, + { + "description": "Enables the text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-text", + "markdownDescription": "Enables the text command without any pre-configured scope." + }, + { + "description": "Denies the append command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-append", + "markdownDescription": "Denies the append command without any pre-configured scope." + }, + { + "description": "Denies the create_default command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-create-default", + "markdownDescription": "Denies the create_default command without any pre-configured scope." + }, + { + "description": "Denies the get command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-get", + "markdownDescription": "Denies the get command without any pre-configured scope." + }, + { + "description": "Denies the insert command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-insert", + "markdownDescription": "Denies the insert command without any pre-configured scope." + }, + { + "description": "Denies the is_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-is-checked", + "markdownDescription": "Denies the is_checked command without any pre-configured scope." + }, + { + "description": "Denies the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-is-enabled", + "markdownDescription": "Denies the is_enabled command without any pre-configured scope." + }, + { + "description": "Denies the items command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-items", + "markdownDescription": "Denies the items command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the popup command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-popup", + "markdownDescription": "Denies the popup command without any pre-configured scope." + }, + { + "description": "Denies the prepend command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-prepend", + "markdownDescription": "Denies the prepend command without any pre-configured scope." + }, + { + "description": "Denies the remove command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-remove", + "markdownDescription": "Denies the remove command without any pre-configured scope." + }, + { + "description": "Denies the remove_at command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-remove-at", + "markdownDescription": "Denies the remove_at command without any pre-configured scope." + }, + { + "description": "Denies the set_accelerator command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-accelerator", + "markdownDescription": "Denies the set_accelerator command without any pre-configured scope." + }, + { + "description": "Denies the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-app-menu", + "markdownDescription": "Denies the set_as_app_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-help-menu-for-nsapp", + "markdownDescription": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Denies the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-window-menu", + "markdownDescription": "Denies the set_as_window_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-windows-menu-for-nsapp", + "markdownDescription": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Denies the set_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-checked", + "markdownDescription": "Denies the set_checked command without any pre-configured scope." + }, + { + "description": "Denies the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-enabled", + "markdownDescription": "Denies the set_enabled command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-text", + "markdownDescription": "Denies the set_text command without any pre-configured scope." + }, + { + "description": "Denies the text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-text", + "markdownDescription": "Denies the text command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`", + "type": "string", + "const": "core:path:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`" + }, + { + "description": "Enables the basename command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-basename", + "markdownDescription": "Enables the basename command without any pre-configured scope." + }, + { + "description": "Enables the dirname command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-dirname", + "markdownDescription": "Enables the dirname command without any pre-configured scope." + }, + { + "description": "Enables the extname command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-extname", + "markdownDescription": "Enables the extname command without any pre-configured scope." + }, + { + "description": "Enables the is_absolute command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-is-absolute", + "markdownDescription": "Enables the is_absolute command without any pre-configured scope." + }, + { + "description": "Enables the join command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-join", + "markdownDescription": "Enables the join command without any pre-configured scope." + }, + { + "description": "Enables the normalize command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-normalize", + "markdownDescription": "Enables the normalize command without any pre-configured scope." + }, + { + "description": "Enables the resolve command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-resolve", + "markdownDescription": "Enables the resolve command without any pre-configured scope." + }, + { + "description": "Enables the resolve_directory command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-resolve-directory", + "markdownDescription": "Enables the resolve_directory command without any pre-configured scope." + }, + { + "description": "Denies the basename command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-basename", + "markdownDescription": "Denies the basename command without any pre-configured scope." + }, + { + "description": "Denies the dirname command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-dirname", + "markdownDescription": "Denies the dirname command without any pre-configured scope." + }, + { + "description": "Denies the extname command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-extname", + "markdownDescription": "Denies the extname command without any pre-configured scope." + }, + { + "description": "Denies the is_absolute command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-is-absolute", + "markdownDescription": "Denies the is_absolute command without any pre-configured scope." + }, + { + "description": "Denies the join command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-join", + "markdownDescription": "Denies the join command without any pre-configured scope." + }, + { + "description": "Denies the normalize command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-normalize", + "markdownDescription": "Denies the normalize command without any pre-configured scope." + }, + { + "description": "Denies the resolve command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-resolve", + "markdownDescription": "Denies the resolve command without any pre-configured scope." + }, + { + "description": "Denies the resolve_directory command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-resolve-directory", + "markdownDescription": "Denies the resolve_directory command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`", + "type": "string", + "const": "core:resources:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`" + }, + { + "description": "Enables the close command without any pre-configured scope.", + "type": "string", + "const": "core:resources:allow-close", + "markdownDescription": "Enables the close command without any pre-configured scope." + }, + { + "description": "Denies the close command without any pre-configured scope.", + "type": "string", + "const": "core:resources:deny-close", + "markdownDescription": "Denies the close command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-show-menu-on-left-click`", + "type": "string", + "const": "core:tray:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-show-menu-on-left-click`" + }, + { + "description": "Enables the get_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-get-by-id", + "markdownDescription": "Enables the get_by_id command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the remove_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-remove-by-id", + "markdownDescription": "Enables the remove_by_id command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-icon-as-template", + "markdownDescription": "Enables the set_icon_as_template command without any pre-configured scope." + }, + { + "description": "Enables the set_menu command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-menu", + "markdownDescription": "Enables the set_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-show-menu-on-left-click", + "markdownDescription": "Enables the set_show_menu_on_left_click command without any pre-configured scope." + }, + { + "description": "Enables the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-temp-dir-path", + "markdownDescription": "Enables the set_temp_dir_path command without any pre-configured scope." + }, + { + "description": "Enables the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-title", + "markdownDescription": "Enables the set_title command without any pre-configured scope." + }, + { + "description": "Enables the set_tooltip command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-tooltip", + "markdownDescription": "Enables the set_tooltip command without any pre-configured scope." + }, + { + "description": "Enables the set_visible command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-visible", + "markdownDescription": "Enables the set_visible command without any pre-configured scope." + }, + { + "description": "Denies the get_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-get-by-id", + "markdownDescription": "Denies the get_by_id command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the remove_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-remove-by-id", + "markdownDescription": "Denies the remove_by_id command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-icon-as-template", + "markdownDescription": "Denies the set_icon_as_template command without any pre-configured scope." + }, + { + "description": "Denies the set_menu command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-menu", + "markdownDescription": "Denies the set_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-show-menu-on-left-click", + "markdownDescription": "Denies the set_show_menu_on_left_click command without any pre-configured scope." + }, + { + "description": "Denies the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-temp-dir-path", + "markdownDescription": "Denies the set_temp_dir_path command without any pre-configured scope." + }, + { + "description": "Denies the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-title", + "markdownDescription": "Denies the set_title command without any pre-configured scope." + }, + { + "description": "Denies the set_tooltip command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-tooltip", + "markdownDescription": "Denies the set_tooltip command without any pre-configured scope." + }, + { + "description": "Denies the set_visible command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-visible", + "markdownDescription": "Denies the set_visible command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`", + "type": "string", + "const": "core:webview:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`" + }, + { + "description": "Enables the clear_all_browsing_data command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-clear-all-browsing-data", + "markdownDescription": "Enables the clear_all_browsing_data command without any pre-configured scope." + }, + { + "description": "Enables the create_webview command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-create-webview", + "markdownDescription": "Enables the create_webview command without any pre-configured scope." + }, + { + "description": "Enables the create_webview_window command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-create-webview-window", + "markdownDescription": "Enables the create_webview_window command without any pre-configured scope." + }, + { + "description": "Enables the get_all_webviews command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-get-all-webviews", + "markdownDescription": "Enables the get_all_webviews command without any pre-configured scope." + }, + { + "description": "Enables the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-internal-toggle-devtools", + "markdownDescription": "Enables the internal_toggle_devtools command without any pre-configured scope." + }, + { + "description": "Enables the print command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-print", + "markdownDescription": "Enables the print command without any pre-configured scope." + }, + { + "description": "Enables the reparent command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-reparent", + "markdownDescription": "Enables the reparent command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_auto_resize command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-auto-resize", + "markdownDescription": "Enables the set_webview_auto_resize command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-background-color", + "markdownDescription": "Enables the set_webview_background_color command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_focus command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-focus", + "markdownDescription": "Enables the set_webview_focus command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-position", + "markdownDescription": "Enables the set_webview_position command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-size", + "markdownDescription": "Enables the set_webview_size command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-zoom", + "markdownDescription": "Enables the set_webview_zoom command without any pre-configured scope." + }, + { + "description": "Enables the webview_close command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-close", + "markdownDescription": "Enables the webview_close command without any pre-configured scope." + }, + { + "description": "Enables the webview_hide command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-hide", + "markdownDescription": "Enables the webview_hide command without any pre-configured scope." + }, + { + "description": "Enables the webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-position", + "markdownDescription": "Enables the webview_position command without any pre-configured scope." + }, + { + "description": "Enables the webview_show command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-show", + "markdownDescription": "Enables the webview_show command without any pre-configured scope." + }, + { + "description": "Enables the webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-size", + "markdownDescription": "Enables the webview_size command without any pre-configured scope." + }, + { + "description": "Denies the clear_all_browsing_data command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-clear-all-browsing-data", + "markdownDescription": "Denies the clear_all_browsing_data command without any pre-configured scope." + }, + { + "description": "Denies the create_webview command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-create-webview", + "markdownDescription": "Denies the create_webview command without any pre-configured scope." + }, + { + "description": "Denies the create_webview_window command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-create-webview-window", + "markdownDescription": "Denies the create_webview_window command without any pre-configured scope." + }, + { + "description": "Denies the get_all_webviews command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-get-all-webviews", + "markdownDescription": "Denies the get_all_webviews command without any pre-configured scope." + }, + { + "description": "Denies the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-internal-toggle-devtools", + "markdownDescription": "Denies the internal_toggle_devtools command without any pre-configured scope." + }, + { + "description": "Denies the print command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-print", + "markdownDescription": "Denies the print command without any pre-configured scope." + }, + { + "description": "Denies the reparent command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-reparent", + "markdownDescription": "Denies the reparent command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_auto_resize command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-auto-resize", + "markdownDescription": "Denies the set_webview_auto_resize command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-background-color", + "markdownDescription": "Denies the set_webview_background_color command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_focus command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-focus", + "markdownDescription": "Denies the set_webview_focus command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-position", + "markdownDescription": "Denies the set_webview_position command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-size", + "markdownDescription": "Denies the set_webview_size command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-zoom", + "markdownDescription": "Denies the set_webview_zoom command without any pre-configured scope." + }, + { + "description": "Denies the webview_close command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-close", + "markdownDescription": "Denies the webview_close command without any pre-configured scope." + }, + { + "description": "Denies the webview_hide command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-hide", + "markdownDescription": "Denies the webview_hide command without any pre-configured scope." + }, + { + "description": "Denies the webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-position", + "markdownDescription": "Denies the webview_position command without any pre-configured scope." + }, + { + "description": "Denies the webview_show command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-show", + "markdownDescription": "Denies the webview_show command without any pre-configured scope." + }, + { + "description": "Denies the webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-size", + "markdownDescription": "Denies the webview_size command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-internal-toggle-maximize`", + "type": "string", + "const": "core:window:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-internal-toggle-maximize`" + }, + { + "description": "Enables the available_monitors command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-available-monitors", + "markdownDescription": "Enables the available_monitors command without any pre-configured scope." + }, + { + "description": "Enables the center command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-center", + "markdownDescription": "Enables the center command without any pre-configured scope." + }, + { + "description": "Enables the close command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-close", + "markdownDescription": "Enables the close command without any pre-configured scope." + }, + { + "description": "Enables the create command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-create", + "markdownDescription": "Enables the create command without any pre-configured scope." + }, + { + "description": "Enables the current_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-current-monitor", + "markdownDescription": "Enables the current_monitor command without any pre-configured scope." + }, + { + "description": "Enables the cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-cursor-position", + "markdownDescription": "Enables the cursor_position command without any pre-configured scope." + }, + { + "description": "Enables the destroy command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-destroy", + "markdownDescription": "Enables the destroy command without any pre-configured scope." + }, + { + "description": "Enables the get_all_windows command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-get-all-windows", + "markdownDescription": "Enables the get_all_windows command without any pre-configured scope." + }, + { + "description": "Enables the hide command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-hide", + "markdownDescription": "Enables the hide command without any pre-configured scope." + }, + { + "description": "Enables the inner_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-inner-position", + "markdownDescription": "Enables the inner_position command without any pre-configured scope." + }, + { + "description": "Enables the inner_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-inner-size", + "markdownDescription": "Enables the inner_size command without any pre-configured scope." + }, + { + "description": "Enables the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-internal-toggle-maximize", + "markdownDescription": "Enables the internal_toggle_maximize command without any pre-configured scope." + }, + { + "description": "Enables the is_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-always-on-top", + "markdownDescription": "Enables the is_always_on_top command without any pre-configured scope." + }, + { + "description": "Enables the is_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-closable", + "markdownDescription": "Enables the is_closable command without any pre-configured scope." + }, + { + "description": "Enables the is_decorated command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-decorated", + "markdownDescription": "Enables the is_decorated command without any pre-configured scope." + }, + { + "description": "Enables the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-enabled", + "markdownDescription": "Enables the is_enabled command without any pre-configured scope." + }, + { + "description": "Enables the is_focused command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-focused", + "markdownDescription": "Enables the is_focused command without any pre-configured scope." + }, + { + "description": "Enables the is_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-fullscreen", + "markdownDescription": "Enables the is_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the is_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-maximizable", + "markdownDescription": "Enables the is_maximizable command without any pre-configured scope." + }, + { + "description": "Enables the is_maximized command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-maximized", + "markdownDescription": "Enables the is_maximized command without any pre-configured scope." + }, + { + "description": "Enables the is_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-minimizable", + "markdownDescription": "Enables the is_minimizable command without any pre-configured scope." + }, + { + "description": "Enables the is_minimized command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-minimized", + "markdownDescription": "Enables the is_minimized command without any pre-configured scope." + }, + { + "description": "Enables the is_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-resizable", + "markdownDescription": "Enables the is_resizable command without any pre-configured scope." + }, + { + "description": "Enables the is_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-visible", + "markdownDescription": "Enables the is_visible command without any pre-configured scope." + }, + { + "description": "Enables the maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-maximize", + "markdownDescription": "Enables the maximize command without any pre-configured scope." + }, + { + "description": "Enables the minimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-minimize", + "markdownDescription": "Enables the minimize command without any pre-configured scope." + }, + { + "description": "Enables the monitor_from_point command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-monitor-from-point", + "markdownDescription": "Enables the monitor_from_point command without any pre-configured scope." + }, + { + "description": "Enables the outer_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-outer-position", + "markdownDescription": "Enables the outer_position command without any pre-configured scope." + }, + { + "description": "Enables the outer_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-outer-size", + "markdownDescription": "Enables the outer_size command without any pre-configured scope." + }, + { + "description": "Enables the primary_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-primary-monitor", + "markdownDescription": "Enables the primary_monitor command without any pre-configured scope." + }, + { + "description": "Enables the request_user_attention command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-request-user-attention", + "markdownDescription": "Enables the request_user_attention command without any pre-configured scope." + }, + { + "description": "Enables the scale_factor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-scale-factor", + "markdownDescription": "Enables the scale_factor command without any pre-configured scope." + }, + { + "description": "Enables the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-always-on-bottom", + "markdownDescription": "Enables the set_always_on_bottom command without any pre-configured scope." + }, + { + "description": "Enables the set_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-always-on-top", + "markdownDescription": "Enables the set_always_on_top command without any pre-configured scope." + }, + { + "description": "Enables the set_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-background-color", + "markdownDescription": "Enables the set_background_color command without any pre-configured scope." + }, + { + "description": "Enables the set_badge_count command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-badge-count", + "markdownDescription": "Enables the set_badge_count command without any pre-configured scope." + }, + { + "description": "Enables the set_badge_label command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-badge-label", + "markdownDescription": "Enables the set_badge_label command without any pre-configured scope." + }, + { + "description": "Enables the set_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-closable", + "markdownDescription": "Enables the set_closable command without any pre-configured scope." + }, + { + "description": "Enables the set_content_protected command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-content-protected", + "markdownDescription": "Enables the set_content_protected command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-grab", + "markdownDescription": "Enables the set_cursor_grab command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-icon", + "markdownDescription": "Enables the set_cursor_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-position", + "markdownDescription": "Enables the set_cursor_position command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-visible", + "markdownDescription": "Enables the set_cursor_visible command without any pre-configured scope." + }, + { + "description": "Enables the set_decorations command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-decorations", + "markdownDescription": "Enables the set_decorations command without any pre-configured scope." + }, + { + "description": "Enables the set_effects command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-effects", + "markdownDescription": "Enables the set_effects command without any pre-configured scope." + }, + { + "description": "Enables the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-enabled", + "markdownDescription": "Enables the set_enabled command without any pre-configured scope." + }, + { + "description": "Enables the set_focus command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-focus", + "markdownDescription": "Enables the set_focus command without any pre-configured scope." + }, + { + "description": "Enables the set_focusable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-focusable", + "markdownDescription": "Enables the set_focusable command without any pre-configured scope." + }, + { + "description": "Enables the set_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-fullscreen", + "markdownDescription": "Enables the set_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-ignore-cursor-events", + "markdownDescription": "Enables the set_ignore_cursor_events command without any pre-configured scope." + }, + { + "description": "Enables the set_max_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-max-size", + "markdownDescription": "Enables the set_max_size command without any pre-configured scope." + }, + { + "description": "Enables the set_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-maximizable", + "markdownDescription": "Enables the set_maximizable command without any pre-configured scope." + }, + { + "description": "Enables the set_min_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-min-size", + "markdownDescription": "Enables the set_min_size command without any pre-configured scope." + }, + { + "description": "Enables the set_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-minimizable", + "markdownDescription": "Enables the set_minimizable command without any pre-configured scope." + }, + { + "description": "Enables the set_overlay_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-overlay-icon", + "markdownDescription": "Enables the set_overlay_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-position", + "markdownDescription": "Enables the set_position command without any pre-configured scope." + }, + { + "description": "Enables the set_progress_bar command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-progress-bar", + "markdownDescription": "Enables the set_progress_bar command without any pre-configured scope." + }, + { + "description": "Enables the set_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-resizable", + "markdownDescription": "Enables the set_resizable command without any pre-configured scope." + }, + { + "description": "Enables the set_shadow command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-shadow", + "markdownDescription": "Enables the set_shadow command without any pre-configured scope." + }, + { + "description": "Enables the set_simple_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-simple-fullscreen", + "markdownDescription": "Enables the set_simple_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the set_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-size", + "markdownDescription": "Enables the set_size command without any pre-configured scope." + }, + { + "description": "Enables the set_size_constraints command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-size-constraints", + "markdownDescription": "Enables the set_size_constraints command without any pre-configured scope." + }, + { + "description": "Enables the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-skip-taskbar", + "markdownDescription": "Enables the set_skip_taskbar command without any pre-configured scope." + }, + { + "description": "Enables the set_theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-theme", + "markdownDescription": "Enables the set_theme command without any pre-configured scope." + }, + { + "description": "Enables the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-title", + "markdownDescription": "Enables the set_title command without any pre-configured scope." + }, + { + "description": "Enables the set_title_bar_style command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-title-bar-style", + "markdownDescription": "Enables the set_title_bar_style command without any pre-configured scope." + }, + { + "description": "Enables the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-visible-on-all-workspaces", + "markdownDescription": "Enables the set_visible_on_all_workspaces command without any pre-configured scope." + }, + { + "description": "Enables the show command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-show", + "markdownDescription": "Enables the show command without any pre-configured scope." + }, + { + "description": "Enables the start_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-start-dragging", + "markdownDescription": "Enables the start_dragging command without any pre-configured scope." + }, + { + "description": "Enables the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-start-resize-dragging", + "markdownDescription": "Enables the start_resize_dragging command without any pre-configured scope." + }, + { + "description": "Enables the theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-theme", + "markdownDescription": "Enables the theme command without any pre-configured scope." + }, + { + "description": "Enables the title command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-title", + "markdownDescription": "Enables the title command without any pre-configured scope." + }, + { + "description": "Enables the toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-toggle-maximize", + "markdownDescription": "Enables the toggle_maximize command without any pre-configured scope." + }, + { + "description": "Enables the unmaximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-unmaximize", + "markdownDescription": "Enables the unmaximize command without any pre-configured scope." + }, + { + "description": "Enables the unminimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-unminimize", + "markdownDescription": "Enables the unminimize command without any pre-configured scope." + }, + { + "description": "Denies the available_monitors command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-available-monitors", + "markdownDescription": "Denies the available_monitors command without any pre-configured scope." + }, + { + "description": "Denies the center command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-center", + "markdownDescription": "Denies the center command without any pre-configured scope." + }, + { + "description": "Denies the close command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-close", + "markdownDescription": "Denies the close command without any pre-configured scope." + }, + { + "description": "Denies the create command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-create", + "markdownDescription": "Denies the create command without any pre-configured scope." + }, + { + "description": "Denies the current_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-current-monitor", + "markdownDescription": "Denies the current_monitor command without any pre-configured scope." + }, + { + "description": "Denies the cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-cursor-position", + "markdownDescription": "Denies the cursor_position command without any pre-configured scope." + }, + { + "description": "Denies the destroy command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-destroy", + "markdownDescription": "Denies the destroy command without any pre-configured scope." + }, + { + "description": "Denies the get_all_windows command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-get-all-windows", + "markdownDescription": "Denies the get_all_windows command without any pre-configured scope." + }, + { + "description": "Denies the hide command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-hide", + "markdownDescription": "Denies the hide command without any pre-configured scope." + }, + { + "description": "Denies the inner_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-inner-position", + "markdownDescription": "Denies the inner_position command without any pre-configured scope." + }, + { + "description": "Denies the inner_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-inner-size", + "markdownDescription": "Denies the inner_size command without any pre-configured scope." + }, + { + "description": "Denies the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-internal-toggle-maximize", + "markdownDescription": "Denies the internal_toggle_maximize command without any pre-configured scope." + }, + { + "description": "Denies the is_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-always-on-top", + "markdownDescription": "Denies the is_always_on_top command without any pre-configured scope." + }, + { + "description": "Denies the is_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-closable", + "markdownDescription": "Denies the is_closable command without any pre-configured scope." + }, + { + "description": "Denies the is_decorated command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-decorated", + "markdownDescription": "Denies the is_decorated command without any pre-configured scope." + }, + { + "description": "Denies the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-enabled", + "markdownDescription": "Denies the is_enabled command without any pre-configured scope." + }, + { + "description": "Denies the is_focused command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-focused", + "markdownDescription": "Denies the is_focused command without any pre-configured scope." + }, + { + "description": "Denies the is_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-fullscreen", + "markdownDescription": "Denies the is_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the is_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-maximizable", + "markdownDescription": "Denies the is_maximizable command without any pre-configured scope." + }, + { + "description": "Denies the is_maximized command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-maximized", + "markdownDescription": "Denies the is_maximized command without any pre-configured scope." + }, + { + "description": "Denies the is_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-minimizable", + "markdownDescription": "Denies the is_minimizable command without any pre-configured scope." + }, + { + "description": "Denies the is_minimized command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-minimized", + "markdownDescription": "Denies the is_minimized command without any pre-configured scope." + }, + { + "description": "Denies the is_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-resizable", + "markdownDescription": "Denies the is_resizable command without any pre-configured scope." + }, + { + "description": "Denies the is_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-visible", + "markdownDescription": "Denies the is_visible command without any pre-configured scope." + }, + { + "description": "Denies the maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-maximize", + "markdownDescription": "Denies the maximize command without any pre-configured scope." + }, + { + "description": "Denies the minimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-minimize", + "markdownDescription": "Denies the minimize command without any pre-configured scope." + }, + { + "description": "Denies the monitor_from_point command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-monitor-from-point", + "markdownDescription": "Denies the monitor_from_point command without any pre-configured scope." + }, + { + "description": "Denies the outer_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-outer-position", + "markdownDescription": "Denies the outer_position command without any pre-configured scope." + }, + { + "description": "Denies the outer_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-outer-size", + "markdownDescription": "Denies the outer_size command without any pre-configured scope." + }, + { + "description": "Denies the primary_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-primary-monitor", + "markdownDescription": "Denies the primary_monitor command without any pre-configured scope." + }, + { + "description": "Denies the request_user_attention command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-request-user-attention", + "markdownDescription": "Denies the request_user_attention command without any pre-configured scope." + }, + { + "description": "Denies the scale_factor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-scale-factor", + "markdownDescription": "Denies the scale_factor command without any pre-configured scope." + }, + { + "description": "Denies the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-always-on-bottom", + "markdownDescription": "Denies the set_always_on_bottom command without any pre-configured scope." + }, + { + "description": "Denies the set_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-always-on-top", + "markdownDescription": "Denies the set_always_on_top command without any pre-configured scope." + }, + { + "description": "Denies the set_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-background-color", + "markdownDescription": "Denies the set_background_color command without any pre-configured scope." + }, + { + "description": "Denies the set_badge_count command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-badge-count", + "markdownDescription": "Denies the set_badge_count command without any pre-configured scope." + }, + { + "description": "Denies the set_badge_label command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-badge-label", + "markdownDescription": "Denies the set_badge_label command without any pre-configured scope." + }, + { + "description": "Denies the set_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-closable", + "markdownDescription": "Denies the set_closable command without any pre-configured scope." + }, + { + "description": "Denies the set_content_protected command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-content-protected", + "markdownDescription": "Denies the set_content_protected command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-grab", + "markdownDescription": "Denies the set_cursor_grab command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-icon", + "markdownDescription": "Denies the set_cursor_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-position", + "markdownDescription": "Denies the set_cursor_position command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-visible", + "markdownDescription": "Denies the set_cursor_visible command without any pre-configured scope." + }, + { + "description": "Denies the set_decorations command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-decorations", + "markdownDescription": "Denies the set_decorations command without any pre-configured scope." + }, + { + "description": "Denies the set_effects command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-effects", + "markdownDescription": "Denies the set_effects command without any pre-configured scope." + }, + { + "description": "Denies the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-enabled", + "markdownDescription": "Denies the set_enabled command without any pre-configured scope." + }, + { + "description": "Denies the set_focus command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-focus", + "markdownDescription": "Denies the set_focus command without any pre-configured scope." + }, + { + "description": "Denies the set_focusable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-focusable", + "markdownDescription": "Denies the set_focusable command without any pre-configured scope." + }, + { + "description": "Denies the set_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-fullscreen", + "markdownDescription": "Denies the set_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-ignore-cursor-events", + "markdownDescription": "Denies the set_ignore_cursor_events command without any pre-configured scope." + }, + { + "description": "Denies the set_max_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-max-size", + "markdownDescription": "Denies the set_max_size command without any pre-configured scope." + }, + { + "description": "Denies the set_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-maximizable", + "markdownDescription": "Denies the set_maximizable command without any pre-configured scope." + }, + { + "description": "Denies the set_min_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-min-size", + "markdownDescription": "Denies the set_min_size command without any pre-configured scope." + }, + { + "description": "Denies the set_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-minimizable", + "markdownDescription": "Denies the set_minimizable command without any pre-configured scope." + }, + { + "description": "Denies the set_overlay_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-overlay-icon", + "markdownDescription": "Denies the set_overlay_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-position", + "markdownDescription": "Denies the set_position command without any pre-configured scope." + }, + { + "description": "Denies the set_progress_bar command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-progress-bar", + "markdownDescription": "Denies the set_progress_bar command without any pre-configured scope." + }, + { + "description": "Denies the set_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-resizable", + "markdownDescription": "Denies the set_resizable command without any pre-configured scope." + }, + { + "description": "Denies the set_shadow command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-shadow", + "markdownDescription": "Denies the set_shadow command without any pre-configured scope." + }, + { + "description": "Denies the set_simple_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-simple-fullscreen", + "markdownDescription": "Denies the set_simple_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the set_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-size", + "markdownDescription": "Denies the set_size command without any pre-configured scope." + }, + { + "description": "Denies the set_size_constraints command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-size-constraints", + "markdownDescription": "Denies the set_size_constraints command without any pre-configured scope." + }, + { + "description": "Denies the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-skip-taskbar", + "markdownDescription": "Denies the set_skip_taskbar command without any pre-configured scope." + }, + { + "description": "Denies the set_theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-theme", + "markdownDescription": "Denies the set_theme command without any pre-configured scope." + }, + { + "description": "Denies the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-title", + "markdownDescription": "Denies the set_title command without any pre-configured scope." + }, + { + "description": "Denies the set_title_bar_style command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-title-bar-style", + "markdownDescription": "Denies the set_title_bar_style command without any pre-configured scope." + }, + { + "description": "Denies the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-visible-on-all-workspaces", + "markdownDescription": "Denies the set_visible_on_all_workspaces command without any pre-configured scope." + }, + { + "description": "Denies the show command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-show", + "markdownDescription": "Denies the show command without any pre-configured scope." + }, + { + "description": "Denies the start_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-start-dragging", + "markdownDescription": "Denies the start_dragging command without any pre-configured scope." + }, + { + "description": "Denies the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-start-resize-dragging", + "markdownDescription": "Denies the start_resize_dragging command without any pre-configured scope." + }, + { + "description": "Denies the theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-theme", + "markdownDescription": "Denies the theme command without any pre-configured scope." + }, + { + "description": "Denies the title command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-title", + "markdownDescription": "Denies the title command without any pre-configured scope." + }, + { + "description": "Denies the toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-toggle-maximize", + "markdownDescription": "Denies the toggle_maximize command without any pre-configured scope." + }, + { + "description": "Denies the unmaximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-unmaximize", + "markdownDescription": "Denies the unmaximize command without any pre-configured scope." + }, + { + "description": "Denies the unminimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-unminimize", + "markdownDescription": "Denies the unminimize command without any pre-configured scope." + }, + { + "description": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`", + "type": "string", + "const": "opener:default", + "markdownDescription": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`" + }, + { + "description": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application.", + "type": "string", + "const": "opener:allow-default-urls", + "markdownDescription": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application." + }, + { + "description": "Enables the open_path command without any pre-configured scope.", + "type": "string", + "const": "opener:allow-open-path", + "markdownDescription": "Enables the open_path command without any pre-configured scope." + }, + { + "description": "Enables the open_url command without any pre-configured scope.", + "type": "string", + "const": "opener:allow-open-url", + "markdownDescription": "Enables the open_url command without any pre-configured scope." + }, + { + "description": "Enables the reveal_item_in_dir command without any pre-configured scope.", + "type": "string", + "const": "opener:allow-reveal-item-in-dir", + "markdownDescription": "Enables the reveal_item_in_dir command without any pre-configured scope." + }, + { + "description": "Denies the open_path command without any pre-configured scope.", + "type": "string", + "const": "opener:deny-open-path", + "markdownDescription": "Denies the open_path command without any pre-configured scope." + }, + { + "description": "Denies the open_url command without any pre-configured scope.", + "type": "string", + "const": "opener:deny-open-url", + "markdownDescription": "Denies the open_url command without any pre-configured scope." + }, + { + "description": "Denies the reveal_item_in_dir command without any pre-configured scope.", + "type": "string", + "const": "opener:deny-reveal-item-in-dir", + "markdownDescription": "Denies the reveal_item_in_dir command without any pre-configured scope." + }, + { + "description": "This permission set configures what kind of\noperations are available from the store plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n\n#### This default permission set includes:\n\n- `allow-load`\n- `allow-get-store`\n- `allow-set`\n- `allow-get`\n- `allow-has`\n- `allow-delete`\n- `allow-clear`\n- `allow-reset`\n- `allow-keys`\n- `allow-values`\n- `allow-entries`\n- `allow-length`\n- `allow-reload`\n- `allow-save`", + "type": "string", + "const": "store:default", + "markdownDescription": "This permission set configures what kind of\noperations are available from the store plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n\n#### This default permission set includes:\n\n- `allow-load`\n- `allow-get-store`\n- `allow-set`\n- `allow-get`\n- `allow-has`\n- `allow-delete`\n- `allow-clear`\n- `allow-reset`\n- `allow-keys`\n- `allow-values`\n- `allow-entries`\n- `allow-length`\n- `allow-reload`\n- `allow-save`" + }, + { + "description": "Enables the clear command without any pre-configured scope.", + "type": "string", + "const": "store:allow-clear", + "markdownDescription": "Enables the clear command without any pre-configured scope." + }, + { + "description": "Enables the delete command without any pre-configured scope.", + "type": "string", + "const": "store:allow-delete", + "markdownDescription": "Enables the delete command without any pre-configured scope." + }, + { + "description": "Enables the entries command without any pre-configured scope.", + "type": "string", + "const": "store:allow-entries", + "markdownDescription": "Enables the entries command without any pre-configured scope." + }, + { + "description": "Enables the get command without any pre-configured scope.", + "type": "string", + "const": "store:allow-get", + "markdownDescription": "Enables the get command without any pre-configured scope." + }, + { + "description": "Enables the get_store command without any pre-configured scope.", + "type": "string", + "const": "store:allow-get-store", + "markdownDescription": "Enables the get_store command without any pre-configured scope." + }, + { + "description": "Enables the has command without any pre-configured scope.", + "type": "string", + "const": "store:allow-has", + "markdownDescription": "Enables the has command without any pre-configured scope." + }, + { + "description": "Enables the keys command without any pre-configured scope.", + "type": "string", + "const": "store:allow-keys", + "markdownDescription": "Enables the keys command without any pre-configured scope." + }, + { + "description": "Enables the length command without any pre-configured scope.", + "type": "string", + "const": "store:allow-length", + "markdownDescription": "Enables the length command without any pre-configured scope." + }, + { + "description": "Enables the load command without any pre-configured scope.", + "type": "string", + "const": "store:allow-load", + "markdownDescription": "Enables the load command without any pre-configured scope." + }, + { + "description": "Enables the reload command without any pre-configured scope.", + "type": "string", + "const": "store:allow-reload", + "markdownDescription": "Enables the reload command without any pre-configured scope." + }, + { + "description": "Enables the reset command without any pre-configured scope.", + "type": "string", + "const": "store:allow-reset", + "markdownDescription": "Enables the reset command without any pre-configured scope." + }, + { + "description": "Enables the save command without any pre-configured scope.", + "type": "string", + "const": "store:allow-save", + "markdownDescription": "Enables the save command without any pre-configured scope." + }, + { + "description": "Enables the set command without any pre-configured scope.", + "type": "string", + "const": "store:allow-set", + "markdownDescription": "Enables the set command without any pre-configured scope." + }, + { + "description": "Enables the values command without any pre-configured scope.", + "type": "string", + "const": "store:allow-values", + "markdownDescription": "Enables the values command without any pre-configured scope." + }, + { + "description": "Denies the clear command without any pre-configured scope.", + "type": "string", + "const": "store:deny-clear", + "markdownDescription": "Denies the clear command without any pre-configured scope." + }, + { + "description": "Denies the delete command without any pre-configured scope.", + "type": "string", + "const": "store:deny-delete", + "markdownDescription": "Denies the delete command without any pre-configured scope." + }, + { + "description": "Denies the entries command without any pre-configured scope.", + "type": "string", + "const": "store:deny-entries", + "markdownDescription": "Denies the entries command without any pre-configured scope." + }, + { + "description": "Denies the get command without any pre-configured scope.", + "type": "string", + "const": "store:deny-get", + "markdownDescription": "Denies the get command without any pre-configured scope." + }, + { + "description": "Denies the get_store command without any pre-configured scope.", + "type": "string", + "const": "store:deny-get-store", + "markdownDescription": "Denies the get_store command without any pre-configured scope." + }, + { + "description": "Denies the has command without any pre-configured scope.", + "type": "string", + "const": "store:deny-has", + "markdownDescription": "Denies the has command without any pre-configured scope." + }, + { + "description": "Denies the keys command without any pre-configured scope.", + "type": "string", + "const": "store:deny-keys", + "markdownDescription": "Denies the keys command without any pre-configured scope." + }, + { + "description": "Denies the length command without any pre-configured scope.", + "type": "string", + "const": "store:deny-length", + "markdownDescription": "Denies the length command without any pre-configured scope." + }, + { + "description": "Denies the load command without any pre-configured scope.", + "type": "string", + "const": "store:deny-load", + "markdownDescription": "Denies the load command without any pre-configured scope." + }, + { + "description": "Denies the reload command without any pre-configured scope.", + "type": "string", + "const": "store:deny-reload", + "markdownDescription": "Denies the reload command without any pre-configured scope." + }, + { + "description": "Denies the reset command without any pre-configured scope.", + "type": "string", + "const": "store:deny-reset", + "markdownDescription": "Denies the reset command without any pre-configured scope." + }, + { + "description": "Denies the save command without any pre-configured scope.", + "type": "string", + "const": "store:deny-save", + "markdownDescription": "Denies the save command without any pre-configured scope." + }, + { + "description": "Denies the set command without any pre-configured scope.", + "type": "string", + "const": "store:deny-set", + "markdownDescription": "Denies the set command without any pre-configured scope." + }, + { + "description": "Denies the values command without any pre-configured scope.", + "type": "string", + "const": "store:deny-values", + "markdownDescription": "Denies the values command without any pre-configured scope." + } + ] + }, + "Value": { + "description": "All supported ACL values.", + "anyOf": [ + { + "description": "Represents a null JSON value.", + "type": "null" + }, + { + "description": "Represents a [`bool`].", + "type": "boolean" + }, + { + "description": "Represents a valid ACL [`Number`].", + "allOf": [ + { + "$ref": "#/definitions/Number" + } + ] + }, + { + "description": "Represents a [`String`].", + "type": "string" + }, + { + "description": "Represents a list of other [`Value`]s.", + "type": "array", + "items": { + "$ref": "#/definitions/Value" + } + }, + { + "description": "Represents a map of [`String`] keys to [`Value`]s.", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Value" + } + } + ] + }, + "Number": { + "description": "A valid ACL number.", + "anyOf": [ + { + "description": "Represents an [`i64`].", + "type": "integer", + "format": "int64" + }, + { + "description": "Represents a [`f64`].", + "type": "number", + "format": "double" + } + ] + }, + "Target": { + "description": "Platform target.", + "oneOf": [ + { + "description": "MacOS.", + "type": "string", + "enum": [ + "macOS" + ] + }, + { + "description": "Windows.", + "type": "string", + "enum": [ + "windows" + ] + }, + { + "description": "Linux.", + "type": "string", + "enum": [ + "linux" + ] + }, + { + "description": "Android.", + "type": "string", + "enum": [ + "android" + ] + }, + { + "description": "iOS.", + "type": "string", + "enum": [ + "iOS" + ] + } + ] + }, + "Application": { + "description": "Opener scope application.", + "anyOf": [ + { + "description": "Open in default application.", + "type": "null" + }, + { + "description": "If true, allow open with any application.", + "type": "boolean" + }, + { + "description": "Allow specific application to open with.", + "type": "string" + } + ] + } + } +} \ No newline at end of file diff --git a/broadcast-client/src-tauri/icons/128x128.png b/broadcast-client/src-tauri/icons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..d3f4590a524ee845d9c1cb64a0fab85b01ed82ec GIT binary patch literal 1374 zcma*njXTo`00;1&y@(>xQO!_!8H%}Hh+>v`85t3gmx(TUe@@Iy^AeYjU2<#={zx9b7bI?{0T> zb$2X9dZZ*VR%21kWdDV_OO5HyJJ;?&ZH}ZombMSP9B~ywIL&Frhn&-Fwg&1s-cd$b zqPgX?a&OBD#k|5ABj4Q^_3RT}boeQ?$P1X_h}prZ9WB(v9vwMv&+CHL?xy1)n5k;a zaTA>ks|(F>+rcQ9%O=CFW&(T-;5)734-JMZ$&Z(G`5$q{p98Pd0#?m^Gpo-uLRa=o z*I3Lym~pa)Vo>&=TZ~#NBIjAE0q~z$?7E(cb-{KI+Q(6TTW#cPnHzSa zYEJ?GRjrZ&wALEi~T6C%IN7mfdC2CBwsR zV-w^Cqgb@?ytGtf>VVecZPk&^O~Gq9pDv}W$atAtkF~7vcedz|eI&U2Wl8@T;*9Ef zeEuj7%qz1WqzF5H${{~xTYDqCK6Ei_EgEmyFTaRvO-`~IkSyTY$rhOe{RoX?NZBi+ zhkzp2v$OMnEsLZxTvKJd{_y2sSt2&FAG;_vY_ZF?8o@{2x@NQXq}jnvPbp(}<2V1U z;+U4xe7QF%r3U&a_UsQFH5(Dy50L%h@~@kIHG!)!(dsYe2?1%?Rg(K&r~|ldlHa(n zC^COU3JuxGVF;^!XzQF54s4;%z;b zlhZMsw_PlY^VWk*&2q7Bt7}E`UpA3Wo!i%Qe?s=Cx@$|ZfqvWD8YRT#O}5nM)0qf% zFJBe64cABo_qs z>7+>nd{jj5tIEoAw!$CFP1;a|y|a<@g|=cdF{?Y9qD>dk?Zk!CRf9=!WE6SA4sLYkNf62&|D7P@Atp#OXXeN?Y(c@-GToH0scejkcqfCT@!3J z{5p^o^}D9xUS|^CY-pD+sz<_0EzpGu*|dh;X$O#lqqAV5h4pd}C)*4RbN=eJLCCIj z?zQeY8(isHc$#WZXVjWYL@sm0FZP?AKgskQ&xrmY$$N!ZqI2(+Brc#Ce&fQ`m}VN3 hp=50aw7$zVg;SA~8Xa}dZ}i)50$5KRhIusR;y+f6SF`{C literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/128x128@2x.png b/broadcast-client/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2c18d1b98cafca7bb9d477f10a785e6b8369cdad GIT binary patch literal 2553 zcmb`JX*kr27sr1y_H{^Q%a+QmTqfh9EJL_jag#y}<(Y=Ar7VpRW+s*D3CZ5rZVSpq zB8f3GMfMDaEYVCDJ2Pf7jM@I4|GWG2qUZno?|F01b6$MT`Mx;M_uTVzcT-W+Q3L=$ z<@hm|GXMbEDnWp}>{jxRD!&W>3Y6n6PG{rBmM0SLB9VHOReEB6e&IwcI$#(%sy6m1 z*Z)%w#lncT$0>t?IQ5{bPyVLQX3LW~i29QfWyL+u;7{NucK10d?eDw29Nz6iKXDMY zEj)H&C;*MRjAAvH&08z_p_urXk3f3p*$ZFP2XN zU_c%)1aQE=Rs2ZmKGkBKq5e`jsID>F;OOsVqiVQ}BH-_s9WC-6z~x3T^bt)QGfhp# ziiYXxsh!`+{n7g<1N!`mdG{sqT1I*45%tR7e>Im|z{)<9#YTJE9>@ioGN}PN>}IHf zP5gXEpez}9H5iR;fA2fH8Vd?{1z-{$=%0fAU6KD~{{v~dW?kBUKZN)m>+c#<@s%;r zrKtfb&$J6!*FUW0z1Aih`LzFT=2#|k*(Lh#1kyz{MstdRpy0Bu3XABq73u{DA&b#gb>+!RlLMqNN8igp{RkJ}{ESk>&_~?J)oN zC5uA)>0ysz@n4+A#oH#6P3aPE`cR8UnG|a@=mWvZ&grh;aIdr5CZ}EjL zX=pp7WI-eRdJVdvj`J&0IE&0>e8?q&LY6mPj)*2Rk=lnK?BH-2hXMO5$xyIb`?oGf z>ww|nL4@{HxcLtr-#no+Sse5j(vY->4Atm!@!eT~ zeGDh=?jYdXl#@Oja2(_&;SpmD+I~X99otP#&{ykNXs-`9XXC8jjBf9a@6}o_U!QrH ztH6@5RvK9O@aH$A_ASde0#~l51x^!geSYpMBznh*Ef~Do>ix-Z`UZ@+N6SoaMi0Es z8r8EFiR<&iJY1NJbYPIJ4eCU>lXq8ri5eX@#d?1h5^5||mV!luglBZpBClZ)ZX4`< z!*x`9#0!uvDdJR-gpHo08LE*MVtp2xAX#mis;@K6TUQKw><^E#azujEGI4)!Q|_21 zXh+ECixZ1}8Gjw`6-K{)+P{f8VBwTUmEE*f!ozUoi_XrQ5Je0U9h8KPOQB!&Hgsbw z(99kS&;~aa1yi-QWIfoS3-wCquFHl6AkU}vjv{+;bQ3T;0VcAmDB@J7=DJz3SDG+4 z;s|_&w3K7RnyzF%Dp}46LIEV{wIiI__vFRf?ZNFuDc!da2vGR|L*HX@(|{gz+*d-a zkZ$S5*_lB7ReR7)=p;?+Wwgr+2Fd-Xt_V{ybMPq6`{Bd zxDsP~RnkZzE4^Bh-9;>}p68yRgjQI!6?)ivI`D?{McLHt9GKKW0Z1A*RR%e%is@tJ zf7K*oc;@|dgFXRS_fC{4$KMH|lkg74Opk~R5MUQybuE}6{UmNI zV7hFTP%KSEZGPmqVJx6@jV!s%#+o6dD?>J*;RfXJTO2r%!cLAAeYn;ePF0^qiA5`Xa+|ZD_(3~j6OB=h6Yt{t;xXg8 z!Y!!Y27k^jJBME-Tstq98Rtzb0xQGa5R+f9(?Rj>jQbpRpEw$PYQqS4$*oxz> L?k-hFgKqu@^n773 literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/32x32.png b/broadcast-client/src-tauri/icons/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..d282b6230dbdcdfcf492635a058003cfc77687b1 GIT binary patch literal 504 zcmVzesLx>0>12biH1BOJH z%m-#%Pzf0-F#TRtS5?2(8`~8|j;4{b{bK?&Vy zgTMWW0qH+XC2|A4epZE&CmWv<_LV0}Tlb z9Ey;EaUKF}!F^6$dmOUHR01~bl(HjuSWhAEt3;`l6=_C&s^bU6==OW|d$Hi8?o=HY zd`W5Sm$#&?6&^ocpv9*w2pGVo*T&(_0Zyw&cy7I+;k9sleSuZSMZm#)3D7VDjzsJQ zK01CEpS>^mL69l~D#3O-DrD0^b6c zaP|IxlbcIhjCb`XXi`XXYQ^dTCH>#&d$_IFWX>~|B@={nhi2?KU`UuP7}Nr1I|uMv zguKv%^Cw`%1c&RnsKX;{$EF|0A|%X*Qy#~ob)plXLHI^SjfBZ8B-y~35a`64kr5Ha uLJp#IeBUhVykxnt0_A)$;l<@N8~XtrgRKBi6Y; zKx!FERT)$XN~M+vlBR^%Io>@dX<@1(`3Lr$Wmzv)Vt+q(@7>wDIH$@N2st(fIX3|y z00e*l5C8%|0E94=azzw10G~o%BsOE`SSmsQ`nT0F{S}qcFdzc`@U1QBqMgBEVY z`;@x1kA}FX&;U%>tCVE~>a9;o>Hq;C00e*l5C8%oZ2%N+>Yt*8C?5b=cZWQ9zCZZP zQWi$+f~nyt;YUj+YVkgGai(|@r;8^v2;W3Q%WGp}cMFcPQLvmuAw&wm)&lFlo0y%r ziTe{b{yMj~wT#-*Q*)j{Bn82W<09RjxMyqgn0fmM%XJr*&rV`y{3;rqmIh@d76I`9 z=q-5fch>Q8Z2>FwPiFk3wQa;_b_(oIg@E(J$=j$^Z=q5un`n6MzQI`WxLGGM9RYpg z`M%!xikds z5lh=2O+{$wt>w3MCU8wbbkr#hvP9+paC+lP&uwmE^~Xj~8uA-l9r7$ZY4I^l0YcF# z45q>U!%#PI@v+qb48bRo_W=Sx00;m9AOHk_01yBIKmh#508B#?4cC(w^^1pL9yh|b z$mnJy-YI1*GX49C4uA^W&#h?vW~nr`$pwQD4h{96A#Ow(v2)lcd2pT?%E)P}ED&^H tBG1jz1V|kq00e*l5C8%|00@9A*dLKn{~&J7d~W~%002ovPDHLkV1iy&MhO4_ literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/Square107x107Logo.png b/broadcast-client/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ab121b5fb0c0411758037ed7795134ef97dc3c9d GIT binary patch literal 1144 zcmeAS@N?(olHy`uVBq!ia0vp^*&xip1|$pi*YGefu-JRLIEGZ*dOO!YLnc(__V<0;$EABLjsp5!?D;_-9xPpITPa|oaHX4TsX~RuB83;O z-76CuH)`Fok6O9)>a;6nzLU+~rv10MUp+ZiIZPnt<(W6nnP;nRKD}w?`9IJ8-rN7j zr?lh{S5f0b5e4oEtvU{33fz$mKxz{MkV;_$QYV;F9L-V<-~Uk$JeKO(`MWLf%I!;g zRI*d0%@%LU(aQSK%6ar^-O78feodXqy=T5kSoXGMJ6A5=RC;^s=L>gF6bU|cotpQ$ zJbsfX)0*cot=(qt=Je;?OY*tCUQ7LCH`jUFEbSK`pC3rGJ(yu0`OjVd9@|}c*>x8? zuFSn6JAw6t6VOH29QGytdHh|ToRY&^SuTFsl5=_6gsH57rMCmt2EOlz^gO)xS^xb> zYq-vDTk!gUk-m0clI|7puPYp#I2>&sQ^C)Mq(a=dJO|JCEo?afzI zj9Nv~J_&^Oh6OL4YI-Xow*0YquZMq6?#1hy?O(n;A9wBRvq@foD+>-KJx#c}B!AVk zsNSdd*PPRfyE5CpZpC)LnkB-Y_qRUYnie~I)$6Zkey!CLTEDZSr(@0RttYnDzN=j_ zcVAVUe%;qLt)+Fm-+5o%Z7e(6%^Nf78JJg%JS0Y?d+N7^KL9_zvj1W(KEl7Zzs>sP|&na)J?gYQzK@v zv&x5k+diSZUb~4OY6_lB*jE3s%EPUOEB=UG_?kPpmprTw9$We*H*lW&yBkZ&x4pSA zmswd+S|@4uRO`rNoK|H&x5!y<@b>rHzhrLv_gB-kjo0yNXMaAi<6BPMzRk0lBP9=% zPvW0zze->K&jQ=y_piUp|E76&$Hgnm*=8^5rVHwst#9Wu%?)F-I`wy{ip{S_DqmJ# zy4d&S+VlR%(;RMU9!ZP0PQ9vSt@)kr?o!$BwpTr0K99X3yT9gG=Ns)g29sykUOD}I z?>jdmwf5s*UTzC-=9&LB zby=b%ai^awjDNb^=G@MMw`Don^V9N0&Tqah=y-Qu&hO_wD)T|NYBcaNS+l z_^71NwJp<3B{1>^<0fDtWlB-xMoz0KYm8ze?uB3Qz43q5ss6w9U3+J)%l}@mb#cw# z6;uE7E!-aCn)z4f|A`Vw$MVphT{&6T`(J%LRdV;9wsfew`mSG{6Bj;9{+4aGO@Ga< urAxBnR;~P&W@;5wj+QTx?LH+~&mg55RCP9MZY!`vVeoYIb6Mw<&;$TKYCD(! literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/Square142x142Logo.png b/broadcast-client/src-tauri/icons/Square142x142Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..60573c1dd347d51c47c4fa1eeb01e9beca09392e GIT binary patch literal 1528 zcmaKsdo&XY9LLwgJMR!CuTINY94SBR zqZV#BW?|w_HNm3@2QUs7m7OMV#yRH8L&&zOjJU3Xt&DzYc@5G+KV&6_hgeP zJ^|PlWggH|7nOJ4`QdXjVL|2X|^P1hqAS#8ntAp^Gzqu4-mW} z&IqHbC_U0iFnp#y7|CQ5Ik_H!yLZ|nHIkHj$U$e_oUTH4qs`4IfAsNz3m6>Cpd_*@-aa3HU<$B{ir60iitl<)sfhh7@ums$ zI1o9Wf5)}|bjnJWX(ByE5a)vk^R3Av5-j>E+3=WZv%W~wz};RPx6uiHpOeN`*mqB) zD%@*vY+>!*R;}-Ljnmh72l=|KG)ccWj7^GP0%4HYKN?n(aEbwOylP6>{j+F+7@^b%JHP&4H z{pv4_K)NO5tXF24L8c<1i>#4@B7?ZZ^64#BTjg7QhhP(xG0_lc$aJPTW^vR16HLph zEgC(NkvtbwuVdP74ACxG?-OjpLk)Z%J$-C@+{KSmNBhj9T)tp`rEVQjFzT*~W&koA4P}$iOqNg@A1$hFp7p}5 z*KLkaHjtY7d44_+bv&p{?3im|crRv2PcN?(O?t(0T{JdWtDL{uPCpv-_rSvR5blK$ z)}nT9Ch%b5!F0A|3wWH_gltRTELYxUqqF)sGt=G5tXy$wdk)#I0EzN;Z$YBi?}1~! zAqQO^(uj#R%Ua^AH7+_A*7`I}|8rFsM$i#IvEh_CfbT>9)y2-#9mT z!&QfBya9U%X7XW;*Cz+^fQHLybCdcbG2E56N26n?s_%y5i5$Bn+L7!_&0Oo)P4BKa z5*>EB2M*M{iA}CAi=z!0fIunJ>yticjJ}$Nc>Z(3DIfO@7!GyOuhhe*CTxk{KNMAg z^zd1ft1`G#tIiCi5>DKatQe?b1eA%ILNcyL`zL99=M58 zOxU7(lw&c^2YE^H;v))H>c}QBaF(e_>|0AM0GO;s^w9|Tb1B4!~>gqRSNCT)ev zknJQa!-&_?-?Z6X*`naT*xkB#$c6LjePf(&^GgMcvx1T>$>u(cbU9+Kiz?Svf6muL zs8iELxQ{ba4JQ@%K5c-L;My+ziW)BIO#vjOZ6A0vg{aA!lP!)gFRa>t4sVfE5js=u zvCGPPMf zuHl#6sbSb6{J4jAYh&5x9%5T3p7255)(E$%__+ni*4sv*)gH9d1>BU z%T2_R2p{*}ExGe{*>?qZATqqCO z%rH+Ird*!N(?W(lkPTy@%)?GQb?sjF-~DmjAHVPWpWpBG{r&aHaCiG&O;t-3005{t zJK6v6*p{xl+vv&eT1^ScO0TmIC#(i1Fs=u?t`9^4fHhp0os z$P5ypnTAk0neqmx@9y+iWr>&0KdPFE0b!=>qV@Rs~ zp7+w)TGXfSHC##;m)^MBoE2B|Uzm04GfP3f5y@e|&WpTf1dg@ffSfpmzO zyTXsD$7trC#>qz08%q|~F=sc2+r_PtwAq-I%=|T?KZEPZ(c$KV4-%*e7DVSJ=^pr$ z+7T#=S{ESOfE5(Z!TWAkfC9?TNNvl@^ABNabOV-62?@V_!_FzJCWgKa>S)f}wu4ig zD%=xU$YAH-@9n-MGRG zG(#z{5HAq>7#XX-bPe5e5rK(4{p7@6n+O-)lExo2_l{Ok-N(z3_LrH89=HN(5R1Mr zSlG3VPZq9E^EsnT%4*zdjU%di&2iK~+{~kZ>xziSr+06uM7F;EFl{l(b!hPq+&mTI zvJGlGTS4co7-x!F}LwMEmz?MMs+PAgKAHV=b25*QC3h2$LV<%@{uBY?e|~N5xQp7 zs9QC%@bf?V4#-5f2m?eGIW-;Tp8+@TVK% v`aDgKkB@o0G5F4KV*CH9);~ol#*PF6ecGbXZnC?dI}C7kaI>$nL#F%%=MlTv literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/Square284x284Logo.png b/broadcast-client/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5b5c7b430046e08cbd14d5aed4bb543e2ec2bfe6 GIT binary patch literal 2789 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 literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/Square89x89Logo.png b/broadcast-client/src-tauri/icons/Square89x89Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0a5fc9d375cd87ea5b320f6e5983d072eb12e16a GIT binary patch literal 1002 zcmeAS@N?(olHy`uVBq!ia0vp^ks!>$1|&ndJJvHWFmLp9aSW-r^>(gxhDe}9>-o8J zZ~B_~CkGfza8jM&AfhTHpv&smk)Xe*we`W`&bd=Pxi{*vt;rl5 zGbd;|siinALuPQ^oZV8@`9P>Bb@HXZ(2r>_ z7F4pPCWhl}0_%;=n*wePJ#QF(m3%P|`H}qiazpQfC#?<9Tk@AhE>Y%M#_~EPt|y?y z=R}K-ppl}mkt>W5wohKU?()4-&YcmPQiZRFo&A*hdRpQsy;T?93mfgZ(^C+b8n);X z&*8$md#Y2HO9^*I9x>v)(z=>sXF#h9NAO9@IX5=RyPKCLnu$){pnU5hr*-T4Zs8rq zpG2m!zfb-BqGK6uork(Wq=p)2F?@Pk-yOS;c{b367b6fvD_mzuE%1aAPb;*BwZYvv1j=B)}ry_^J z(|T>V{qbX8?zbhxR4iMg@GkRK-`Uk>4;~!5yJDl($D~KhRrlkrPkb~b()0OdtH>wb z+l-_6pI#R?D%|eewD)zxF+oeGzfD>1c_QTi3xIAL6W~ zt<2O?|JsPnKev80x6sp)gFbpbJ9&Mtp4okETXIREkZiB+t%FvxFBkHh_z@tk^)%$z z%(_#LSKPTW<;t^bw+mAud2=6!{8#Pq4iAqG87Kw=lLRIMm`Fa=^IER3w|(%7wWv&E z(yrs0OfJ#${RPtwRkp9;bL#sV6ui9W&V%I*K9_}VW=6gG!!>u&)X5q@%H3F=ADVja zlbZktK?M8FPB+w3^3@Bh=BY1t-bi`V0Osdj4fD3$=~|^Du*_ LtDnm{r-UW|{kYDE literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/StoreLogo.png b/broadcast-client/src-tauri/icons/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..86dd29fa22f70a8e117fabb607739e6e0ffb6bc6 GIT binary patch literal 669 zcmV;O0%HA%P)CVzmS2mu>K zkrLY}j#|MRQyrjvgRl}7qIB^n3a1W&nsG;+Oq3va zMIY^@O*CGvF^s>bGP<7{RtXDHzBCO}3jvi8h#{y-;J!AVe*=pCo~k7B5vzoSF!c~# zMj&LUXFFYIX8;G05s0&5Z6&W1!6bcG9f2masUxU zDEUPclpZ*YPD_P015A}C@ZjtXRDv=C6!3Oq8TS{TVZHeSfj3wfl~(q$n+!Z3=Z?(a z&G%1uxHONe$LDZ+_8MyKE%=_w%hh6k=$`o3ttvj(*H8}|c(M8p1wZKhmje)Tryfy^ zn=@DVdX=!z`iYg=Dp%q@FkldsrXrDvq4|2&beb_Fs^fyM|S6vvL5^6cP=w~=LwbmYJo`6C?EnNAOa#FqXJ@+ z9JerS8#Alvg0p3km(7VlY*&1{p`2OEwA;kCw*MW3I`awJ+V3@#hcH&Kd+1l~czs_O zaDyI`^FdEn6*pu_DDnS0dfRq(lJF}a0wN#+lHU3aA8zXX*I_6D00000NkvXXu0mjf DO3Nq3 literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml b/broadcast-client/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..2ffbf24 --- /dev/null +++ b/broadcast-client/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/broadcast-client/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png b/broadcast-client/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..330bc796c9fddef0c39a2528ada6dd02efee1414 GIT binary patch literal 711 zcmV;&0yzDNP)c1Ns&0G{7+oiTakd@Lny7LV?CegGjas?4DrG;C3kb12CQvjwWIM1h*mxDR0ACdb z@%{xsp9$d4OzwHg)!<0SAATU+j0%HzMJJXB2*9bu%RrR!nch0T?6^qGZSjgtqo^!t2xrLI6gT;MVy$%umn4 z*B+jKeuLNj_XdXGE+RIMD-1>Uq=8lK&@MG<)b#u%~wXF}EuS+Ltg{7gCw$9O+JG z9qTeC>p&tciZUm{Rv8MQkunRe;}wnqONt^biZWMEEj9;Yq(#(K70*BtY7Vj002ovPDHLkV1g^TNHhQd literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png b/broadcast-client/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..836b019807e6b3ed928d01c14ea58af07905592c GIT binary patch literal 1741 zcmbuAYdjMQ0L51%5gETc#+VJOHm^L2FtM3Ult;RX)M{AXED=$9jYylvN)65HGPiNl zW!T&#wGgG4X+&O`wZh2t=(=C;x9iOI{SD5BR;GWzz%Z=~WxntnvCNUbX_4a|rd}XzKA71l{J{M#xQmEoZdULS z^LDuoy>42mx}D`~&UB0cZS!pFw_&L7$byX7K$yY18;3kbWRxiu<;@RAs0nGQ7y1wv zM%RK69+B+urNvJ&#CweUNVNp-Bj#{Jpyg65{;}h(k;_MTo1D=Av^-kg8U5ejUXv%^ zfxDhee^>U++)EIy12h&(1P(gYJ332Fnw;JHx*!tgD$s0&l$Y$flBsKKxdKX-1el^83Su?J|DRJa#y-cF}5oytleq?B)ZzR?I-d z@9Pc~HBXGP*14r}q2qmLMmj4rPMp_RZ#0CRtu2*Vdv$|0-DDOv8{Bp)D?CFU5X7t_55puf%ieQW&YIk{rrL ziBE)0IKxUzh#X$I=b{Xp+xdcK6eYJFywcOigM~sNV`b&j)J8LJz0TUqe)gMKM#ZRK zn?R_KpgjR&K zk>unl^2eS{!2AlsPhz*MpQ!e0%cI+Prg8oPCnYcU*|TYlgFACZm4KGv+dQkIy`=qi z6IMdhLOHh_ikL!DG4`bd4@jXEvIm*!e*77&rD@7l>!5~@H54CG`P`&1&T${TW%*qK z$^12$pjn^wxME&)IqW^6)Cy_qoJ1Jq&MosL+3N(BuD4v3omB+U6I<0CB)J$(mEQ72 z@%xL4vDYIjzUG5HM0o~$9U$CruP`OfzEY3V^w1n5f$KNM5Uexyty~X^RPG3LQYZ`I z6Q0)aiLCetjv!cO2p>Ne)F4Q4j6%1Ar&Mk5`(IKhI#zl)(=LP6x6(}pTXf>jt}(Yx z^eB~>l4L%wq~vlvB?Z&Hv%`9WTHB1x8{7p9xgDwQ|Z zgfb7+M}^J5a`X5kPQ26+g0AO{P3EFrC2vLL4$ltzhdu8S zd`_g*S6K%#WR9o$*XH&L+l6j%`w6}GMT7a{>N{C=Mza0%${ii;^XY;7F{yn_?^QgDRLCW%aqF$07dbq!2-Ojdy1?4`xgKJ literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png b/broadcast-client/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..d06a0caccfe60eba54670f220768616d685b4eb5 GIT binary patch literal 841 zcmV-P1GfB$P)!- z=*9U}#NI=ox$T zuTR?n5%DvFju$NoR+ml zs8uQ;gi9%zbiNS=SZg(~p#n&eV_@W6QoIjoApj0dXcL^K}%2 z#E<50%#I$%&AF>MF*1o9BYL*Hh`ZItT&t7?rPGj8QW(a;Kyho5E8x=fJnmPY;?dFq zZp>Z5OnC~8uxaBY^MP$7qd1TaBNq;zX6KLK;nGV~Ys)C+hWI_5PGI+%nW!z9$>KQb zVFTyJPU6&|X&dCiBNM_|X0mOG##o_@d(|hn_2vO)DpQ!Bm_$7O}Lpf@=$R>~)i0tJXeQfI}kR zX&o8*cJONuinW33AjR| zt$#}8hTKCJOI~j{_VH9)xE}7NwYK^?xGBn{oMKDLSJu?Yrsi^QwK~1GMK1 zC%Ym2s|7JvJX$o9IpKeZ8BG9)mCHirA?%Kw|J&fO1{}wUmVjZqOg$+;& TBkeIc00000NkvXXu0mjf@x6^F literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png b/broadcast-client/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..ccab0008669d0b5895b93b048103b0b1fea7eab2 GIT binary patch literal 758 zcmVeIJK~>{x!($ z&IUW^H#W||ixAHje&+f)WV;Cv zu>HyZGHQ&COd*&FvAep3_}vazD=_!m5Fqd5t3cpoFCAPv2&JL-RgRVBU>2USPh#@? zFqvKD0y&71H?X(KZSk|;P8?PrR?e)jU2dNbi8A(ut)q_q4;ulbN-c)B5GpbYcsX8Q zx6^8*hjqFfxjpXvB0vpeHmc;9?U?U_eaAf(uKf9b-6SIg~ua^<2bDAIGt3#zqt@?%wsG z-^*oH=xnj0QMszVvuADbRGWF`jP1PQXUn-(a?i9Xer|U@N#a>b;d7hszt8P_KIf!( zZ=b)EV^YTprWVFS42c}fKuUlONGb9FDQ5`<9)UK47x9UXuT|el-#lw)V5@g#&GDd| z^+p_*UZ2^$Dc+7pB;~N2sF+F0)NgsgTNY~sckbP6@+gM&XTa9Wr=zS&+#L1Z+&C*; z`eoauiBD6WmiL~TlKqd*TXma!Q{#%i`zAZPu(z6CTF|YdetOF5un4cVF>_aaePZs#?oZ|OdJniCD|>ymdj5CKjq#h4W-R%9KC$?cAgkowA75|J z`c*Ms&i>OTJL~#8+gMi}Gqo*vJa?ANybYO~9@#rb^lu1?4p!ZkeEm_rmBD96=atqc zUMXGZ;uaA|-0QM4?4ncZO@FI-drJMSKiSRy9k+bloU6+;u1`;nNRpoue`{y>=GD_p z40nX`-!pl6`C;{bnTyfJ?V%jSwbpH}p1(!?Un^F=dRG1KV%gHDZ^DA&g`w7(nk|X( zUfjZENqY+~maX~q>QRrKO?Aj+asQP;>tD6~Nqf8dwWMra#r|zKzF)PIJuWm`DBk+t zzP>n%g=cpY86R`Y`*ZTwlx?Z|?%Yy3zxC9lXJO)7QjV{Cd(`l))Xu$k%kom=UVoj{HF3B6 zYmV2~IIhiFwmW?KH@V$U?RcMeRh86i-Du28 z@ACgA6|H^lmP1Iv;+Xi;UUN2N`ziIz=DwzSu7m+I=b&aF2Vgz|CfFB~HY_O2xpn-{&PyH1t7O-k3)|MBeCqg7kubbh3Sr=+EFvl!N b|G~ZGbCu28hk_QsGKay_)z4*}Q$iB}SfMb{ literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png b/broadcast-client/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..1fc18d4dc7a59c1b5a23ece50f7f20213f8f7336 GIT binary patch literal 774 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 literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png b/broadcast-client/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..c18292da44566a0abd3fec835ff19fc5193dc482 GIT binary patch literal 1432 zcmV;J1!ww+P)mi15$#ILR3m|BltkkOr zija*|bP+^oHI?{COG_kuB)KFvxz9PCbMEA}sit(2nS0Ke`45>U8N%&3|Ks}~^UwbW z;AM3MOaf*AGk}-9C44`?_~f+odH<9b;;t;s6EnaeX?BGnly?}h%?M)bw#y7+!rNs8 zG2!hpLNM{|?wgqKcC|q;@$H^RF!Al4iN0svpj3#TWdaQ?ot!KG<`^2qmb>;dqldO&Qug=&9AAe zwks0`%77ixAHj~6d`3NdruQm!Hl;%PV1y~rq@K>l zQ~xt%KS8OJeX^IU_Z)%(hqLggx0(ohq>c#CBY_}+13}4rA2bsN!T{U&-<2WCqJ&qc zo`toZ?qe@Si6khYgbSb0SZ*;Gsp)!aOVS?z&%fc6a%`b6pHxZ*y|WA zjr`|tHaiV`zVHn`y?7QC#Q=UuF9jw@r3Kd;HS_!V)xYu4`5Aoi*DP){YYKiUI63_a zo*aMJFhh9!uA#d-S8yYur%=DGUc#vhXYj@kALHvw=MYA?KQT0B;K}Fb{(%pnPbDZD zC^|Acfg>XmhA~&`*D-fvL1{x-F(hOLq~R+UsHdP$AASsHo_imMO2c?!YzjZ$`~&a& zbQ;TBD;QBmdQc3IK0pwq@L7i|qj+ZGaYKB)v=+Se=*t*ZwxF#cXg~=N%G;ar-AJ;( zTbjeO-=4&Y+4u0};`g|(d=PId2E6&m3DnzLeOtjsIAJy2{;aju2L4=M!jISH@yYyG zxKh7n?!P#B9Hl~_g0&1m(0+q3O1do2Y_ebiu4*uZ=kGs;u~OCCU#hPt2vQYz15)IH zq#|^rW;+tz{?E0Cqt{Ch9LL!gJ~T%7=)nigy;j)9%;Kzqp8`J-OIl60jjD#8qDnXD zRKr8nNuv?}Y~I9jV-2TO6nt*^f=N~Q>;*ZO4b{XBlvHna8+do_GnJAk8<^1sS-YiO z<@GGAU&U6Zg>hw!b=rcnp~(lqM%sT}yQ~NvDww$?f$9|rCG|rXsSGI?>Hz#uK0SFG zQ_*h^j&>@4M`=UT7+)|0(p=im?q(y1%Tm%eRIZUZcaJ3VP!++2SuUm`_VeB=7iJ+= zdjp0bh9GcpuIrvcmc1a6bUPM?pm_9T2y*#>jH~T_k)h^JtO1-0Vh94mkiFh=tN}h$ zMX(m6*IAJ@z?Zt9d({GtgyYdmq|vOjSI;ANb{h2c>UYhOsWf#BQVG>%)Mc>$R+s-R z%Sfh^Y6{H+o?s>Cuu#%HL-X9WaxdN@H*U>L z*Bt7nrdFAsq#Ewo~X?ewRxtzXSK9RGQ?F! mfXhw5rHRY{Ud({pu73ez%X8RdnGyH^0000#!a`k@FXIh%uN@uGe*hHW>Cm|{}uu+*PZEz6f8`3t6v#=nM@ z^^Xp_HMP5Ad9EVK)Jvaoms;D%LQNYgDR##|uR_S`X zcqa^}2C~eFNSacyjlo|VVI!2(oDb7eg%giY(c@e5ss%fC+y&EOyDhz8QZDjwa4BOt z3jr!~~I7FsF0ii_y_gEKn!qS%i_VfwZ)Gv8rtg zIpan4%W9-7SGTjY(&We}(MVMGhGf;9-qV&v(|fxmT=YL3jdVEKZn2Hhit&-j(uF1t zoM1>0+zyux2$FF}!)(g5RP2EX2Q!0QXJ{Y4>?g@fMk zS0|Brz={t{eDST!rup{eMec9Gb{%4%yIJ^m1Wd-}{cWwO$C~xjyk^b!2^Jx$#TgZ{ zt1TG@<}qOA-UGf%V4GWzw|!GeqG^m~^UY&e^(OkCl(?Ij;pZ}&Qt{bJ-wY}Dl1mO^8Dc^ayb&8jO^?94GC z>0C|kB<1s#5b-}vCr=J8X}Bnp26Y-({#9;c4L0%C=%y=hV@msQo8ks0rk30mMR<6l zwMNnw3Wi+J%nb2y8JTpZ8as3tu(Oyj3Xts;xx?C|KdTXiZyhx&SO^=3w63kdw{{(Lj@u(4sdmaZq1@!{s1_1h1k zB37(wm=o`K%Oy&Fucc0!6UoHrkbK@s!TlFyriwfOopJ#^70a^`y#pC zn=I%PxAm_l#4!>T^%W;vj{y_v68PTZpI?bP*1rExsfUenxH!M{)NQyJnr#w5CW}sb ziprzvqi{lRCf*c6%-@#xn$`qT2DfU$7v?YCxL|{IVA*7^(3YxrUl+5@j$In4#gyYA zs)B5agZx}Cr2TE~wrzt!xShdfo#T?yj_&3|=EoAVY82-pm5XbZqXZX70=Z0Weo?eT zD5Jiapcl3ql{(nS>$f$yFPqiJTNtu^ zlvsw7RvMi_SCAdBVuc5u^8k_--){(xML($DNDN9YcCb@s4N;Q=?zK2dis1AL{Dn=! zs4?1`wVH*Jm`jCJp%A)_(k(rCt(iMUL&h0 zdOy%cc`#@;8Z*Q39SNs$15;YGVml@5zfRoQR*=WFnJ7v4Qw|WMk%kB=oBUP zC8C{(sP$PY4UrHb4YfrrDUE05|98&JIdA^B-#_j-zu)iNdw=KN&rQ8!XL;hd)NwvO zz7tkAAr5?e{E$CPSn$x}vt-%J$0xF71u=Dsom!cJKX~N~e7`}5hjhMM?w!QWsn|Sx zPgTAbYkv)3YF=hxW}+lz3z;`o4!&_Gy;r~tX7$`S{pH0Z6J;eqMZ{CZ6x@9k#iVEI zf-P7D=#lN8raPkH?c}JEZJigjE7{KMFyqpNz=6s92d#UN!%@SV#Y;&)t1a`JIQ@|1 z6IOgG|II0sMG>4Rm0r7IcnYqRMnzi5@N4{-r#|IeFUdF3tOu2D&!orl?4iK;QK{(CWG z^Mj68M0r1qsC?k0FjmXZdJt5zB?kG}4AF~ip{Dro@JuPjw-**jbJ3&Xy)wFk6O_C# z-M=5eUq11FN%nqTkE6bO~oI;Cz~YX`ap67Ni)a+HJ>9ml@@%ksEy`|gvg zu#H!8m%J%IlS<`^9(M!CHQm}eYc%(L-9YCl+e&c=24hjo3C2390=Iv%<-wZ2y{*WZ zOE{yh>3vo<%7t3bUfmr+cA`vVN3UB-6h`**jt6_{4{E3r=einTK#*n)lO3a!NqJF# z&R-;C4-yIczT^ z%a1k8_hGy5$MG-RF&N(>7`o#gQtn1jIxnZt67dB09)44%2DV!V0N!59bluz0>WcT@ z<9QM5TnF+MQP4-BLzQaR&nF~*w<$W7rV3epFeQunm%B{+kHY4Stz?9F8klvKe1NPX zR5sD;HHY2zS9h0=m8N`3bIGu)C5d?XkE*P}4dHVrw}YjEFE-V~+8z;CZYX1TzY=at z8KH0Jx#0wt33WIqww!uq2fywH<9%2o1*l(LzdojsdGxHm znLti~jQS*rLPFQcT`p?WTSbI;8Gai(P1Giuty~*)jA-2yf2VL2*vgbB$0x$E;I5a5 za2#ow$!;~56vzqb)VM&eDz4M)71*(3<;*p9)%8S6^UfIoXQ06YV(6>mS2@4;ttNIw zSdVb@pdUlZjdf|NLj!Pdnt5R^JVjV>Tmu>R=yOraEOUC3Ly+b?euc#lGFG&WVT^*D zOU?3r{WeY8I>n1Dxm9Z=f=u^G+2}~mrmsiJMO1{4R}cef8oJ>)u#3osYV&uUW!OHe%9Yj`55k$*g_VGZmr9V$vpn zkXp@b&ic(YM^eq@B-ikc%jjvnY)o%jAkaQtLOP~d<|66gKuPV!LbGw|5PMICkg5ZH zCV#bZVS3pBJWcwsg>#^$1eqZ^4)mdf_K@+?@w~=0O_u@|<^(nFr8-hr5d_?p%GAyZ z&-9)5UVQy%W<9srI1@YuR2Km+VyfHtZG)6!>Rcg-SPZiyO$SmSGYooMv~&POnV2nVAI8<$hhDV(Z( z>>0B0rLHMZA8q-5>95l+8y=g zN-=34@Z=f(BT0Qt*{-=emF%r3Hg#b!XEv53TQIrg9|p9s{*R5k|`x=4wrgz6mp zEIWPW_wTn>r`mF6(%8ul40){b-}7y>C7EdUsH| zc{8i_w|l?zHF>}&x^2bf{g1D>v zLOcQ-+bEw2`NWMP!7n1^emEDd?`RLl50fQkDCzR29C?ZLL(}1$O|bzX<3WYes@xzP z*M0VE=H9~^13yaJ9-t`NX$rNR8csI@q`FYhUAnfc*NNVUaZq33x3*QxMTd~noG}gD(bB-mJ-@6of{e?dL z)aQIz8E~-aQPT>^=N2VldZWkU@+0GlqtGY4?+$ZJ9TBm-xi5v~!S3xk6h1#4{rDZ;_!mHQFR)vx9gZ z0KweEAuXVtU~1Lygr!B^&^T+qK6zP(>RkM>xRs?|qV4m?4VYiqST9iI6HY)}z@8)M zf<^(g(2m*}F>i#`2A<6xaV^ZtRETbqNV;h=bTlsoYV>`%X>3}*!CEF6UW+{(n&A`} z{mb1U;6e){-d9#~vIk%qpem=)vB=&-nrUCkqD#>bZSt=OR6Th6^+;Kf!_nz2UT1Y3 zOvB$0$O)#HOX{NjDIEI~IQ}M%{bic@6ZHN!(lC6_qu!90>^VGwDGDKNmZW!t#{Q=I zqKs<9A-&sWBp+EgcjmxitUI4UAGG=2sOi=axwxORdBE*>Yj4z1y$iaMDM9!Ulu%9s z>&aLs^{}}rEZsK5%5gPe9xR p!2b^kpQ*s%3x83bwoW1VkQPO3y?!(rfj`#6+U; z!bCI@640O_5&;Dp1^FmoX#*{#bldKB_Z;7u-FCaBEZwr~?94n5ImvdnP1rfV^E~g& znKKg*1U-fVGyw#FAOHjbAP4|KP-Bv4g8Is?+Y+G_9xeeWnyb;legS|03!w5DpmvTO z*I*KW1~7RGkV^%wtuP6I1CYD{$fqu~Eg%Vi1CX2r2!nX-50V5th;OGH2;kV|MiTJA zjjVSdfMc&4Nx%a)vKAn~V}CmefP+Z0%7FlnTkR_W42_uT~p~ugLGzlQpd`Z3%r7!}KnFk9Q9+3$sz9n70 zdLnKK0g4)fr_yH3PVst?AhN=N>behq;V4(4#7iqE`~FsnrYkO_zC5a>rJuF1 z+*l$dY4p$qDxAGbA{~2VoHg5pf|f_u?5F%i6+9}&bd-w)pF?#od2K*cZOf&$ojO0w zgh;l$;un=8ifZb>2R_HK_%W}UqMA5cdY&}1XJ&431)blb>O3fcmS;vP`VH2P(&%^t z;;LyqF;nA1()eH%AR<$3*9?fTJ`iNqfpDvWyuQ^T0T1*z=MfPGnTasC4_pWi1etLl zxDQ+i4g{HTAh-`)2o409aUi%4TnG*X5%$V}?29nO7h((!1R=s83nL8ig&2baL5MKO z!U*#zz9LM}ZutCr<3LhK3WTgXH(fm(Q;I@;K!~t8IAZ+V)KqbrCioDGJbXH>p4!)_DmW46vw@2R6&Ckg5dl63I7eRSaI-IP<2hexjKau9g)@TRE# ztP1L{ul_`zUp`9R@icAAZlZUdeVtaNdO6~Xl;qfZd-H4b&A>@^q>^?a$n##9SgRlsm0V_D~lW)FXv)iV*;^ZojZ64O1$XpdNOg z6^SlNacqrDk8_+AbPc2&=i>N(y7*QFHUtN%p+}iefk9El^_}T4+R(X5M^-vW&HdVE zm%gV0*GCB%M-dHx=8yT5!))(UJ86CAN{Vy6v$<;>y_kK5iX2_P3}2v68J^#6|4o^A z2jBrf3k|3|l(?n0Pam_&hci5w7|}p(m@eJBsmFy>ykS%tHPE7Wyvp790>@NQznkQ! zipv=7-?W>4*mH>9*zgLC6>_?355a+m=8ZfnD89OOfqohnwZz98>bZ8eEpP6J>{?(tU`)5io^lsEec0_QWh5>SR9*`)H z0~NUb87oZCB)iSf)F|~NI%#`$v;LK0C9e88zSOvo#6V)>5vCTSb_t?r!Rz&z)$}UI z)yibI9!ONh^UJHZQju?6sA5{_GS{JO;d_Vd(^0}Rc4DR_bk zJcqBIpyNY-=!ipC-eZ8&sE_JFrDDms+UB8+!SD=C-K8TpPtgbGzvQ0-{r7MnZvkSr ziAvPL5!F97K;PXs#V%B;3?)XDS%^I6hgW-7?_a$?M8|KPqthc7sh97Q#TY1b-#rFM zVWOsEsGFw8htAQDgQp*y-@$K)%Kb4lH%RrmR;7CMcoE=1gw2gTtN2RB;x*ND%|Tv)Ef)HU40D=Gzgd!S+G}PevhXX-~FsRKZ)g#6bUvMA@5e8ZOTo_^u@dXEh z5MhwTk2WL55MOX0$n4?@a3Q!490)SIybD|i?gIyc%q}nm7lQl1fgrO>+`)zXcAuuK zkqC(Vg{M6t4ER~ycG4)tfX66A%}5Vv%nH>~8DV9`3>?ckblZiqFU*u4fsy4>qsmUV zl?y0ZxStpFNXMyN97|N&l`Njlv81JeMb-O6N><;J0`N4l)^%8JEZv53UfV{k?f3{2 zo7F4Z6`6p7zBK7Y;FSeqQxj^q1W;|p@D#7-D4HmiFTxi0nuUptT4y1O@*#@pCaj(= zlF|q~X1nqHg+)5HAk3lVY#d{9D-U66yJ(248Zb1nTMtI5-G-+n+dTmycj0N-eqn&f zO?X*k3+jQ10uWIudPlVBF(-F zPohx(kCQW!;YM~`U=oc5c$|MG!e=*X_Y29YtK27$Y;j;KW5Q*SY>RHI>kOAbvbE-O zrckvJCKoyiPWE)#879|ym(F*U+W{t*ha|ilYk87T`8Ixq!8(YrQauEKAOHjbAP53L bPz&`x6()2f%S-j000000NkvXXu0mjfz+J>e literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png b/broadcast-client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..989a410fcd60ba6b02d6f3f66a172495ed897ed7 GIT binary patch literal 2018 zcmah~c{JOJ7XF3ULPSMtn-W_Uqf{bI#}-OaJH;urw347o+cCDHLcMyijOE#)%%rF) zs+}ld!bAq6G?uY1LDbfvNmJAsyv{lA^t?aXGxwbP-E;1}=Y03vKfaIT>TC;zC_w-K zfZE$xyMLy`ZH`T>hw%m+ng=>G2LN;Z8m4N!eX_-C9o+Z444Q2;=n(Fy!FZ(&yweA zlTs(wJRA2I$C=Xhg;vLQa&X7wl415I)DSyNu`^z#B47*6D=9=ynx=z{j35UmQ7nGn z8h(2#O*0r|1mu7)`xo3B07W3R>-PUxvBFYcr$=PPyO>}Mlt9acvJN?`>8@(+SARP2 zbg({AUD3ekFKS~6<;LK%&u>g~-X}yy*$5d~W@*@wRP=iWCHL7b`*aue*fLPcSpM7V zj;E^U$pMdrNM^jARvzdoe_DzNH0mX4Zha@YZzfgK9}866VF?2W01)~je7XCDbvr5# zRvR2A=@b!|4nQwb@+TFvYIv|p0^8WmQ%k4&LmeIj&e>z=Q1eLNyEzv*dusUgy>Kg> zG_?vNrC>`sGAlds;pKHf(g>lQgk_i`UtV*Ztux-oaDUUAwfda zdbgBmy-4pl?VzQEs9Ug-ATU26QVxHqe9-irs$L3o@0az|c>SQ&!ycAvrUUQe6Z-pt zhmm26xH~L7hyq^!%}|%@rs4|;KiW<7UVd3sk|pE)epH@p1A5-&{)#=(* z1)0vMUnW$~g_DpzO6NcUh8h-6aFw@x(2HL5I3lSTQ($b4CO@L+Ey>KgNGyhaM4J8J zL5M{vqwPI%qO}G+^xo&DdEcxt4G~%!Rtke6M}L8jek1Q= z#1Gx*wi&KN?Py-1aMIT6+O*l+?H{+A{o4zzeKY_e6c%2`t}G0VXxNxpVC9{zlm5?? z+s_9bi4iB_{PXV|m;2xX8+3Kzw@l=!JcPar8G!pe#E)0WFYOv<7mGF<#Z?uHA%sy@ zaMSapp=sFdtWC18@}&&2Uuu%EvF{>p+#?~rn6CLDBI9D-t_p)#-}6CF_&t9 zTiZ!$(_0L!lVq=P`3d*#{=MH?BQkJ(b6msflZOc*yU(Z%NwkEh@^Qx!d>Ixiv1o=a z=IZ`=H8RcjC}@1|-P?U@bJM2a-qPOAqE~w&dXI6h5z@*+JG0=UnG+!~=`?HjtwChBTu-qP5>!M!4$Uj(LdrM3OA(`Tw4LjG-)E?3c zF{eoSwRz(Re03k-O(q%A(IM+B3xC~a!VVIt9cYkA4z8CTMzxD`!UWTlAN>?P$fG`E zd66)(lFDd3m})gK8K5k%C^J>}-ELj>r@?WVfEqENAiD-dZyE`O46n3Bb}rhSjYA3x zs#?4_1@}$-ZVeJj7Tg=f05HFbPs^%@u2vAZM|4IaHzju2{u=jzX$E05cz}~#|5u}Y zH|^q;7^W068}Q$1i$>E%M|f=-2kR5O@T0pnMMEAs9jrsb;*cZV7u5UAO{P8Urp$Dd zx#Yv|2(%kkozOU=5B~z7Q5kadI?Dm|u!(J59w-@*AWL&*DPI@Te-!wydcbFAK=^Y# zbXR67U&9V`y5;v}-X)BU@2Wh1;jQ7qSr*kaDV`x18{fHk%TzOK)Jzy(`$zA;=7 z9AzT^e5i3}q(*0v72u*>nb2}d_HQ2{^#QK7sp+yI_3=P;!vh5nhVz;23kMsk=O`K2 ziXc8~H1V91VV2=Y`jH0j6@V2*NMdCN4sifNc%-5Lh&&!_X_kZ`W}FO2hN;SOu6KEI zhSNk+0#>=R6!+)bFcBe!KNt(H9*3kDiKI4Szxsjy8_a%?FEqOMBHGK*8Tb_THqO@d IR)H!11?6l|)&Kwi literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png b/broadcast-client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..e6422f2fc5d23ae89df4b455f0b39f2acb6ab4f5 GIT binary patch literal 4010 zcmd5Ku917ps1iCG)UMN zZ5A690ej92KJPi_-t)Zg zx$AHd_RU`9y#N5K->f`l;!s{Z7?+PVB7I(Mm7>7rcxDPs(}tqi-Ayy7R_8;FNMt zVRwIya@p8id4(6n=a`J&FB<1A_1z}^a}LE^+A<&U*1+dO4C|v0ayGuBTu!;v3^5x* zm2BclXw$~0uK%bBc<)*{3Tz>|2<1Y|D)XRS|Y_i z%6-)m-TY4cBkRu={m*hdp=a3#BY@HqC$_Tm#8tH7GlV!Y@+giDLJ~LwpuUhEb>Bny zCeCd32n^Ycci(n0c$-S^+;Hf%p0%;RBtcOxx6tIkdK(~#py>8%Ilrd$drtp3+W(1){{%;($Q9(7U73 z&Dtcq-86ox&Bj3&Mg4{cqGqn(CDJYVy0PN1>3Z$ahd!9gdG!CEIz z7$_w2#^uh#8jVVu++~?*Wt!T9HlJ8Rj4xJ;SZ(*+^h9H9tgEE-K|QqNao@A%=7O`{ zqwPBVD|E{03;d63W0Vu2)Yql?I2zZBaBs7sbh9C*pGhqJ;aTmgj}a_3SxiiFIJgvn zW2l2bSePzMH^q<~3g1Ku{&|j?y_qQVLG__B%#}O2T~Eq7%bo~?c~c(mK1)gHyKoh{ zyz8Fh9b(6);Jxb>ErO<2jL*z_kcG?y~B zT}!f_(45e0xqhc`fLJ>M<;Q@)wPML*>h*b(hw{HS+-0gnq&GEq)>ny3$RdoQT3$@g zaY{}>Vq=ZNlakKB7Y1+g^>Z4aC+6Kz0v9ZAg_cgCF9pg$#hEv{vlxT%fs{)N1LmMI zEbHncVzc0jhiUl?qH1`DE!=q@O)PS5$Ifa+#(%=f#&TMVq{SrRzK)E+xQx>HqcuBI zDgMr;SaWJ1wiqy3 z>6m!D^UDOk&yDQiB_5d)C}&TuCcPvRN6Td-WPk3XC_Qm=$mM)fVc>|WP@Jq<)-Y14 zE2xhXRdOER9+BgY^ndv6{fWD$6kACr-=nIg**9us_W9*+_Kr8iJn=~zt8@=HEHvh+ zVV>JQC$#@0?S_=sC#B_~^bV^*-g1&bfo{G#8A32~i`uC>B3D=tASZpW;Ri3z7)GXp zdZ&O`M@0E|aEhpc$@^%#5u|Kvjm~DbY_=%$oB?}`rHQ42NhmIQNHqw7Zi#4=<<5Q~ z+FM7oaf0?rNguQZsb}ZYxycWu=F>|BTr|B+P0L2cj-J=*f)3i^qdC3K_f5?tZ`rBJ zZ=}Vo6Q9yx`E{gqiYkfPKg}51E=H62pRdssbSI2Ndp!&`-!Rqp(*Ac z;ev7UK-YU_$Icsul|0yEd>|ygfzs5lj~-3M2AF>T0FulJAr$YWzFhFQ?l!%It#Kzk z&kF=C);X7c*(CHf|J_1W`(0(mjr6(o5dbjxvajh-?#4KZM`pq!JU-K-vFl{inCYU& zAaM&YD5zsiZlu(i6!Vo=5b9r+9rfZW-0L>wMJ^N2Tj_Ql|2N~v(Z%ASOm&yZ(#p_| zL{@39=5aybAzpiZ1UxRmW3K9$D9>x%noUKp!XfVyg2nnBda@kW^!zHF@ji+aaOzu= zY2(vfNbVP@tado@DXvca9CTQ@!YjN`y^!jxW)Sh zL3KW6G{?CY=GFAJ;Ru_3(}l0oE!0*`cS7fruKje#jbWn)eGH*(DBF3hZ)o+(b?h$D znIRE(t1VRKITLXpusk?bCSF-DBi8d{bt~j z5l5tMVUY5J6F1P|e*ZX}u=^@XJ*4KB1)tm0(0Hr8llNJJQU$(D+lh>Vd%i?Li)Prf z&W1#cs(GTGr1R)eW#-)*NoVwUkF&W^5Ek?zRE3KB(o@$O;xnmpiYl(h>WD(gmW#hS zo>qKUrP)_)`W>!X^^t1jZDtrFH-j2@9^utnx%ZKG z8OH}5-gkTu7geodMrzPZYGWmY6vp(5AJ0|a7y#K%y)^uL=_wqTbZxELj-_9e-<$_? zUxWKsGNC*)r(#)6QgAb=``)WUlYxw7efxY?`1Jmr3}~iXK#$JZSvvwhN^j$3)nn|Q z7nZ^P7Pov--<*hZ?jIUhb0=-=)U&*X_6tON&43m>u;+A_h9^!+9|rPO^0w`|N&&WC zTJ`d?qIMOjz(hZ^Vy21QVi?E16rw8R%vdo1(T4k;xmI4$Ud(jPeLm?_G8L*QDJH2u zD{vHxbv@@OMx`xGIB7+|p9 z4Ig^TX%bv;K6Se5QDf!N0h0mAv}wWwH)~V>vXZpO1>iIV-{2$19w?PE;9vZ44&a1Z7ImE8tLYCamk)pVxX^o(^1+O9^nqrN_Iw$1mxr^#_>Q23*e~w&V+P#USqOc|5UnBea{UbFxlhv z;{`XtHvbd#K*@G&=-TWXPOE{2YQP=z-(KGv-s<|2sO)S0xp<<)IALKd7kwkC`{_fI zqFg~M+1))YTrh6%7|Kpj}nLsf?m0kK(M8HEW@%F9vtKYbL1?9 z3mlfOJ^K?#DtjYHws@1`$hj^xv!`F|9Xh||8khPI{H}wKys6w zcxJ0bbfpMKRVYwko+g4Ha_(HOL}(+{=Hf}GrWFd!gWoH$xO1o3k#yx65HZmGc(5aD z(6xR=Oey$XE&^0LhWwc+nuA)gpC1sC_|_8gV8B;M$O3)?P#o|pPIm#m;@`7G+&^Ir h{V&ax9Zv;vGx!q|a5}F*G=l>!oV#dUa~65?{{TD+qd))v literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png b/broadcast-client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..3c8e1747ca886ff8376c5d203c723318c2aa0d03 GIT binary patch literal 2490 zcmZ8jc{J2(AAe?P3>RZJbTeX1lr`JENi(wV`!1$LGM0-QiOkRBtwb3qSz?4l)>|=? zC8I25O>W7x&*d6)krqsrJI;OYJ?DM@cs|cLpYL*>bH3;Ke7>np4wfQ9@DzSZZfDTjQ_-Q1j< z#m5w+#my!kmMfw;X;Z63k+kx4f~G3ESW8J-T0G6eMwYUtiS?x3pwym{H#=eU`&vPM zyXL8^vX;1h^2BA_dPGs&eL70=WRq&_f%*#E5gsUI@jcep|YV*z*T? zp$l9>2!L}ygr*NTUC1_h@G+1^7J=4vOzKdi%^bzuV!Qw5zXMls z^3|7Krcv`ewN|s5*VBSBWpC656KXwmcfBq^f5FZQhOyj9tUB_$R0t25^OYM( z^;U`FEXN0%_aX7ghRW1qewl5u290N|i{<3*6{^vto{i*ML99c!o9|{K71B4IEg({r^cw5frdd?8c$%g_U3slKlCKlPiP-dE~#@x?NTR%^&D%gwu|x*F{qA^vw(7 z2vODK($poml&#dhxpze8K9$^-*{9z;A|fGJ9xZbr=XCD)FN7mYElR)HR6J=<)g`G^ zvPK0?A_s&?TU30^O;NRu3tCm`l`3t{&UB+lZXf4!LEA5g!+F;$#eISzY#-QOvMD@C za~%_~o0GA{vxR#KO^>V&*c;7ONUwEwjL*Ha3hKSM&22moC*o1c?Cw6j*f##?>}2dl z1UW5Cf#>ev`sqo?!S}-RjHcLam8FsNmHGbV+3O5q z=1F~rYIP+q9Vn9EG^n7O!OFno(rr@@ohvTkB}aRli>G(0tbM#$^LQq6yXh`BVB&Lf zsY`S#M$#%~67QH7wmM{%Z+FYM;u**fSa{H97P}>46^Dvn91vXGawe?u$nKZr;tzNG5;i=#0 z%AWY$Mx}DCdPYa`Ju8MXDZM&Ap`lLDV~G=B4oWYM6ffg&+50bgUEf)17?^!kAIZw- zQ_RiZs3^$L9Zm4ED?x_V=#%$OhxfN?Sl>5&a5TZUDX6QBINP;lR2uu@TiC*xIGlXW zdE9qoi11XpQE=>!wd#JYIq8uAh3x+ndCc_--_#Qey8dAjoDf8?HQ9VHi-cwONO0@AJHq2%GmT{YFNPiD zzKl#==}9hF-Mkz((-I!=a-^W8@piF&=Vyu(=`*k&6d3(*BXzvNBHgWP{Bd}Gj^9kE zqtEQK4#QWA!$+6eiKSa6@=@#75aGGSh19H_kQE-d&PtmaOT&_WfyXW%gn!heJ_b7Ga(xcG6 zLzYz{0JZXHJ9jf=d`c_gu`e?szQHl6fl^Jm8sN1-AER#fMTGtuOzV97XslRdHK_64 z(r8Qm?2{)$axgBe*q*bN#)-qVK{s?wG90MeClqdDs9QdU1N+|OwKklMh}K{S zr$6+Q<$tX+zE0r*bYsVC^O!fWBSuH?O=I1)-|PGtAGLOTYyV6@2%=6rg6F$Gtn&e3 zJMq-XDozc`_t;uf(Ho(eayyaA!uIn%*!iE?nOCx3GkzPMl z98Dbj(-oE5T;5ryF%;{qB2y&zRU5XdrrR!=&%?2%WS%Cq2^sDSt!%ZO)4aJTqt0mL zcARjj=;Xex7>L~d4NpNOy;&O#fpnmN66#Xfv7pc!t+%?C?mI>-Hm&9?Yf^;l{BdCf z?T?srkykN`li3d=@+cY|RR}U@wV+BqzO8xq3y-u@gPgn4!cD!{|14?U{L|i_CC7${ z&1#DR%%|Q;n(1ADGx^-}n0rHd=r}_`nX@@r<~5mwn>aN3g|@D>R&@u{K%LdRJ0HFn zI}fnzy`gvX%MS9Q;-g+PMZkI{YWqHH##M%GwG|F-g+j#fZH9wJa@cjgEdWd!j&hn( zzbW5R$Sgk8)X=wazIK5u+c$dq)ERC$aYU9s>kE6>9tkCK&83(08yj#}hXp!-y@~l5 zs>5kGj^6?Z0|>_VLP#pXNN+EPZOJ13>x)wK3RH zKsEUXB)^gi<02HRcnl<8fJI?WaA%YWG>hTOI>~q(mH=sN&@H%8Gldto1 zxEP1)$k%x%ydnHo-^g7PCco`lVtipOm7<>BYRC~^Z`n58y_FYDh0m9P7B-tr7%tx$N?W+;m#8K6D1(M zsb(^;V{a58i}AHy3Nk&*$^hClBDSlDzRNawF1z=E`n1 + + #fff + \ No newline at end of file diff --git a/broadcast-client/src-tauri/icons/icon.icns b/broadcast-client/src-tauri/icons/icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..a491647dc39d2057cf196d42b266b10db37baca0 GIT binary patch literal 29842 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 literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/icon.ico b/broadcast-client/src-tauri/icons/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..77a8b039d0aa450770e93d8339d2d5fe2936ac0e GIT binary patch literal 5741 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 literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/icon.png b/broadcast-client/src-tauri/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c84d9fdc0d8d90118de0591e9cb5900ded2511ea GIT binary patch literal 2037 zcmdT^T}TvB7(Fw)t<$pG&Q^$}&`=cii$P^C=_H03ViLafHx?O1krLE`W>+_9%krUz z2zn?(Ba&nzQ9*+-Okbi1LM4cz3_&O}3Z&JwvnniNj;;?;FLQssbI*6qH}|_&@^Z7> z&gD)3?(E%}`v93!8H$6$58s<#KwMjP=FWWI+b{3huU8mLD__^w$ct0+jbt-zL;KUu zEzR~&P%a57*Gf{?-5Y+n)>u;zKlo|X+;Y0dBVo^p12R-Vkk1Zi93(&ibk3N|Ius*Z zkaHr5&e^Q&QFv6-pZ4a)6oaj)Nn~@iby4!V2ZF_3aibyhq)LMoR%i6Tu|3<*7c?`& zmC+cQSG{!}jJZI*o?|5=1A~X}oC_-gVnAA{F#B`A?jo17OQ@8oNaFI%O_I;>st^i3 z@`eW`oRSC(K&u|t+gIoL*>W_Fv6G$8dIyK9oTdYXOSs{xAEh!^8IwEG)v-kh zfqo|vVN`pK_2f%VvS%Q$3c+P;KTQ_fWh5<}D2sl-?D*J{`cUXq;{v*RksROYl)XH2 zt3dTV@C2G+7Mi!Eh(M}s0=6Ndwxg?@xjHsO&Egt3Qt46XTID9sYTaYpBi*=iv)2FK zCb)4v#83Fb-PRCIMPO-Rn*#G2S4PBC%7`Q(Axw~~Ob4B4K*XIWCwWS#^iSLkP+6pO zGl&t4T8HNP6i#EZemSSXbt;*-`5I?`uX*NEpuPJW52m-c#v3B``b3=yI<>C8M#Pj_ r#0Zc6gxGaXCXP}}6Js5k9iG$Ys5|7(d06|soj#GhD>t(t!>ITTVB_7) literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/ios/AppIcon-20x20@1x.png b/broadcast-client/src-tauri/icons/ios/AppIcon-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..e4766173df24eb970246f968046370eabebd2e60 GIT binary patch literal 389 zcmV;00eb$4P)Xt*QscmHcpAN ziQ?$STNQa3`@f57+l?Jq#|dadUQs!kA^12v%qK00000NkvXXu0mjflq;r1 literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/ios/AppIcon-20x20@2x-1.png b/broadcast-client/src-tauri/icons/ios/AppIcon-20x20@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..2d1834e354b701753d86b67d477abac5410e2f7d GIT binary patch literal 638 zcmV-^0)hRBP)t7qYUv_Vl=H*(4_b1}9bene~aD`++XQXUeJ_q?cZZo3>n ze@)z;`->)thE>5loT1?P;ce5j4o*0rIiO4pwU)YxPcqFYrEqk>VbY?_slV=YS~7R# z87iDC!9%PNiR<9>krTLg>4x_nGvn^sQ@s5A4oB^b>|k7eh;z3=NFk46EH@T$^X-cF zt7qYUv_Vl=H*(4_b1}9bene~aD`++XQXUeJ_q?cZZo3>n ze@)z;`->)thE>5loT1?P;ce5j4o*0rIiO4pwU)YxPcqFYrEqk>VbY?_slV=YS~7R# z87iDC!9%PNiR<9>krTLg>4x_nGvn^sQ@s5A4oB^b>|k7eh;z3=NFk46EH@T$^X-cF zh!k15bh;#6uC!;$I*X#DjRz zL#uce@z+HZsR-2~{=mAf+udZIZ?c;p;-Qg-#N^Gg>?T<@^U3$Ud2eQ(T^rp=$WgPA zvnId-EWiRRzykc=0$VAipqPNEqXC^Fa09BiI|FK+fvq0w;K>Qt^(v^XVX1^!`N3Ny z1@}!8-*3K!<)}3&y>^B91_rj+sDWB8KiPz3)!hkaXrlQt@|vIdq~o^MLY0{4|} z>qssZ$%lP2Hp&K{Njot2A*yRhSQ20X7GMDu;5-2<%jzfJoEh~q1dnt!fr(!~+*Qs3 ziQhWR_Xh_miOoM^0X9l@bQhzQ&6wRYgR)&j)h^>(r-{2uk1)4*Kd~uSEE%z}VxwxY z;NalaNo=of!{g7dP#+q@rN&vDnmCM=ZVQD3rd;vek)d7f`ClI{Kf{@O=WyluoPWH@ z+2EVFm4M2z`f#A&)RtYib^IERjqSt2hbOrH@(wmSRUW*&3@QAZmsZ$^jaeI2ch~AT zG}1uZTV>N%*#Zv2&jU8;y|-sDy>Jo3#UY%ZJk9DCKtve=CNp^TG#)9}aAf=dPK;0a z$M0L8*uUNIdNzF6Unfu;o?Pr7-hug}SN+p3zAobO(;Ki=A=+|dnt@G7a+HnbpIy@Q2>oVs`9GjhfoX%WoX#mTt)4rOW9KJbR30T6{dkCED5jx3$OqSumB72zqemHo!Gbf SC=LDq0000^P8ES-T$bmxw65Chr%z6KLi!@Ncu{Xc($QUPaCS&%ciAa0u90Q z1mI|$a3w@mc7atdU~Y99nR1Ed;k(Ci2LrPXUeBM@CcE2fYAH^HJ#K@gbdV;Mt~WYeO0TBFmUpr^e7L~g?WrxS zaW`-G+6?o^@ZRNB#zxF@j?j!kPdQ?Z@V|3N4vkcSm4cr{a@tuNsaAhzqzWX!kshYe zQ?_GzfYrB3u`LEGex!$KI|sIBd!^5@b@ja??~y*dl#PX>k92bN~PV07*qoM6N<$f}?B#bN~PV literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/ios/AppIcon-29x29@2x-1.png b/broadcast-client/src-tauri/icons/ios/AppIcon-29x29@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..7ae1af08a919a9cb1fe567dcb59fb0d37e4eb312 GIT binary patch literal 669 zcmV;O0%HA%P)W~6 z(ioIM8I(a8G`pZ8W1}}ofKsQXrZdGUl#D$2D)P()0;;bgQ=sA67Em*hU{w^mS|u%H z&;2uhJ2ffVxbffgx&Ck&^_5=`dHG)(Hy@*E$7#$ls93?DwxUfYqWD=?q^xL+G4MLd zpbW~O4C)PNPDok>#6O!EgV1RIK+Dxl)Co+}BZWX-2H2`{~S8=HQ0NQeS zY}P7x@ns1wSKkt_YB{P*V&mczqc4*uCvbh}5(YaD;@Z$f%#Pi|mBI7)LD1ILyBf5i zlr{#Hu!?sZpHO;s6SrSKcE1mI575b~?iBaJx;71kTI1OMK0LiJg^B(W7S}%F$%h4W z2c0cXN{RW0a*u}?yXmkkdx9WXXACXvf*O4K$g}%S@-Mj@{V0lo65UIrPYv$g9dVE z_f}csW~6 z(ioIM8I(a8G`pZ8W1}}ofKsQXrZdGUl#D$2D)P()0;;bgQ=sA67Em*hU{w^mS|u%H z&;2uhJ2ffVxbffgx&Ck&^_5=`dHG)(Hy@*E$7#$ls93?DwxUfYqWD=?q^xL+G4MLd zpbW~O4C)PNPDok>#6O!EgV1RIK+Dxl)Co+}BZWX-2H2`{~S8=HQ0NQeS zY}P7x@ns1wSKkt_YB{P*V&mczqc4*uCvbh}5(YaD;@Z$f%#Pi|mBI7)LD1ILyBf5i zlr{#Hu!?sZpHO;s6SrSKcE1mI575b~?iBaJx;71kTI1OMK0LiJg^B(W7S}%F$%h4W z2c0cXN{RW0a*u}?yXmkkdx9WXXACXvf*O4K$g}%S@-Mj@{V0lo65UIrPYv$g9dVE z_f}cs+M|s3}Hu!qxbX7 zJTEVcie4Mgn#C`+D&zydD+@oDoJfAtii!_P8gfUwk4_F3{Q796ZAIXVrCp0e0`=Fj z{tw)!v~=yQsI6PsCaGo4N;y8$^HS8;OKm2*Pgg7I`0ypx{d{)zjQL^l)!P=jHfVL~ zC@I7oTFNoKfOEQ1%puj7E+C^o^UznV80Wpb?B)Pcd6K z|LQ-ln@Swznx9Ud=vgLgabtt<^zHMVbSAf?{wNVicM+SPUbmonjkvAwdI5vKExSWf zRgai9W|_2I|Nr^swOPIvTQ>5(&9}N}`9;FCQR{j{%S(~%p@C5sZi-*Oc&nCedR%#e znf3D9emVF07o6vh-f>*Y=ebWB_vM=vHC)aY3-8FiJGef?XS?t6MIN_5%{k|)ex@&` z>uucaHS>?BZZQkFmZ117tPs@{xoeb{NbMEL|zB2j7j5&9>R&lmW+?p%#<<8Q3`X?(_e!61&RkzCh zTGZ{9$-e9*)jD&J+&*F86n4RMU$$lH>*yP`GcN_}=UH!iQT%kPc-*~1DMn2jTJmt7qYUv_Vl=H*(4_b1}9bene~aD`++XQXUeJ_q?cZZo3>n ze@)z;`->)thE>5loT1?P;ce5j4o*0rIiO4pwU)YxPcqFYrEqk>VbY?_slV=YS~7R# z87iDC!9%PNiR<9>krTLg>4x_nGvn^sQ@s5A4oB^b>|k7eh;z3=NFk46EH@T$^X-cF zQqNm?)u`rd2*{|tE_gnRkDbMHC#o}A~jwC0#I1_My&ZMY&D-3FZAaj4>c&(0$_-`zT_NOJ+Ez) z8XLy*uW!)%wjYDp59Zpbwu6XSt{TD&W0nu5)yIO34JxE*iY3t1(xE)?R&y_#|E1!^ z1vEHy$^s<;R+zu?AUej=>OXuHv)(+m#G95voco`i(F-q^lC@O$qJgDzqb8nl6-a$8 zo6q6nLKowQfwUbHB}uqvz#~C1)Z_UODg0nYl0Q@B$yg8kPoCu6jFW zaE2XTXu_DvC7$GdAh@AQ5g-8)AOTVYNPq-LfD{1|AOR8}MSujjwg5`}%X>$$-cb7Q zx8w8Qk)~u+Mzq+_^xYN#02F^S;<{KFizTBG1Sm@d*CxAPWB*0XFJROq|8bio|Gu7} zd3xYWC;ZHT;A>BUX_#RQMSuiIfCNZ@L_mN9NPq-L5nw?21M!>_3)86D4FCWD07*qo IM6N<$f>Sk=nE(I) literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/ios/AppIcon-40x40@2x.png b/broadcast-client/src-tauri/icons/ios/AppIcon-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..33f2fa1db60cc358318d23b37bf81f4252b62fb5 GIT binary patch literal 882 zcmV-&1C9KNP)QqNm?)u`rd2*{|tE_gnRkDbMHC#o}A~jwC0#I1_My&ZMY&D-3FZAaj4>c&(0$_-`zT_NOJ+Ez) z8XLy*uW!)%wjYDp59Zpbwu6XSt{TD&W0nu5)yIO34JxE*iY3t1(xE)?R&y_#|E1!^ z1vEHy$^s<;R+zu?AUej=>OXuHv)(+m#G95voco`i(F-q^lC@O$qJgDzqb8nl6-a$8 zo6q6nLKowQfwUbHB}uqvz#~C1)Z_UODg0nYl0Q@B$yg8kPoCu6jFW zaE2XTXu_DvC7$GdAh@AQ5g-8)AOTVYNPq-LfD{1|AOR8}MSujjwg5`}%X>$$-cb7Q zx8w8Qk)~u+Mzq+_^xYN#02F^S;<{KFizTBG1Sm@d*CxAPWB*0XFJROq|8bio|Gu7} zd3xYWC;ZHT;A>BUX_#RQMSuiIfCNZ@L_mN9NPq-L5nw?21M!>_3)86D4FCWD07*qo IM6N<$f>Sk=nE(I) literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/ios/AppIcon-40x40@3x.png b/broadcast-client/src-tauri/icons/ios/AppIcon-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..8d181246047512cd6233706dce464cf54ab4bc14 GIT binary patch literal 1311 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 M?TSI(IeaGjcM|JZ`v3p{ literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/ios/AppIcon-76x76@1x.png b/broadcast-client/src-tauri/icons/ios/AppIcon-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..48b18f33ff46f08caae82d433537b967e679358c GIT binary patch literal 875 zcmV-x1C;!UP)P*4v+5E0fx_}EiKQP25bR1`gg&|~xd3-PyUFduO*WeQ4L%oq_KWm2n@u``I(+&b_l|otE|83XFda zhXe#87{LfeFb2U0MlgaAj8Qw7RrwLMrD%D~s?K1l-~)aIE<&N9Y#Fv|*9puDu$p^2 z;B>BnTJT{-1WgH+m9XKBSaP93N95YjLmNZ2wuD_I`pkuMd^WrVJ2?{ky5 zIrb1^Ghfi;COJ!1YFAR~)1@~9DEg)Hy=P_Clo~DVBn2xKN~{K+l0cJ_TJk;?jppmG zkYY8o=!Y4F8;ArW7{Lg}AQ-_2MlgaAj6pDh5sY92!!nIdx_2kIm!YE5I^!#>MkMJ>#d9*x|)JU1r zmMODPG@`s9qg;wEGfkZ&G!qreV|iqF&bBY@!=C^1p3nRB|9f+e`hR1n2h#%p0EPrS zmb_IXMiIq3}TsACe%%220&=OdwU-C3Nsak)m%gE&gJVpy#>zM_#dk~c(+!f`ycGjvYFkJV04+@|%|pmf`ltQR@PGTL zOSFpJ4?8&D>D=4^T@;pT2h>+yuqK(?<>|b?`E3e9C;1G{-kB5x{Bw%YQ+kux?qw324LcHh?l!b2jt9gNzd-}aSqae2X3 zCnjf6K!0$%<*}zAkqc^N_?mL%%e@yD1q@CW-pF17j;3dWa9VjJclOR#xGxYuCd{BlvXuame`I7}^m%LK zTRN>{)%pW?o30L%#-sssbv}tnd*d)amQ#O#(`dePYDs2se!H&K5-P==V*^pfM9XrH z=Vg^#9mM*uuAdwRNMgMCylPS0>GT`ZK}-0P0-FWBi4ddg`GxFa`r5oHI$?aRHVS`< zmY~mVoPzIPUan=A^BQ|r*W6GPCkp zKVv})bhk6mFq=huF0rd!$kaF-M5=a+%+!VD4g^vW(a{Z|)5%;q|#8R*_Xe>HvBZSI2|Wdy|5x4;|HJfQJ@F+m*}HS>MDmx z)pM0Fc#zk-K9P@1NaD(iV0UH3b$q{2@ROp}&FIA}e8HaI1*0#=aex1fk zTH_-z{ajn!vIe?oJuM~TNr2PwCa1YY;L%KZ7K*Z+`t|Lll@`05cT)ujm!qS{t1Yg{BmDpi>?G_ zI&^&~EgPsR>;VI#V(eJwV0R4J}zRI2Yld6sV- znI)h+BU^zKixQYhnOf9$JlpU4SJrp;$<2?{D=hYpEHEN=aXe0ax9*tUb02k?wkUa< zZW*5=yzp?z-mjn#6rEE5bQ9h@==@mtL~G6e#HpQ7^xFx0Q=C(7ZS$Z)8W!7XV^+!U zv=h&wA7DEy*aOt$onnU1>5WlM!mIh{43mt3qV5&SC8?8%GpoFxGCdYRC2US*rF0&tjK?iLr}TgWI%DEOBHOj<*ycj3YO{KUy5H|vjK2PfGJ@_gI7 z`^IKTjA-gwTuS2=PF*lio$-{&_NlCV|z?LepI?@Fn#Z`etqltG;k#7_x4;pbHlq~o@hcJeRj{&aog;XQH~?%5H#ZR;BW2snQ%|1d4% EZ&m6S#{d8T literal 0 HcmV?d00001 diff --git a/broadcast-client/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png b/broadcast-client/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f3b48e5f4d0b90b96cb32af0b8929d94673da704 GIT binary patch literal 1817 zcma)-dsNbA1IJlwF~wC&m&;U4Ng#>d)G|!+5}*c=TFwZ`G95B+6G+7iX>*qM6fn%6 zGMAa{Ofl0n$x9b6h^B_Gsmx&oNZQb4c_C6)9nX8-^S)>2?2qU9e7@iFeg1y3{K(#) z8Cw{GK%mcjeQ*Kqc>VqPbltm~y_xg}2(<2rFV6E=qC!_jj5-!>me$|GqE{V+4(uqH z4REm8Xx$m%?3J6DwtEwFzo{4dvGe-qyS7#9p2dDXePD(tU zVeGZd?GS@V)W*%s0V`yp9YcAl2->Ic&+kWC9JV8wl?i)dJI{WP6V>x zQG1k9;#2RSfLRB6rlv%Ei8|@54>*89JTN2&4v=WJ5q{!o#^;0Ws3;-)QJyh#uMpr8 z1M_5ih5hTrPa=uPr|b2&6s9*f#-z8 zH5q`#lz`}BxQ0Ra95_>Ci(rxs4+N=jZ6+r&tm|Xy^|z_^6SrI1WYg1P&1^)Q@fG}l znRUuT{J?XL6G}4NQ3n(3W81OqETH(jD*^>ZXfgU6!PryT&4AdQIjTKa-yD4tXo>4Kvg9eVfFi|>q^#f|0=P2yNi$$A zvB4fR*XZ02@LbM~W4U)rI((@$^gUPNH@j9^23{XjT21-CBbbN#W;d+nIEbV=Ax_{C^i zX>c5ubRRw;W9zZhIinY&kNE^-z<(PnXx3 zGzpq!zS2S(f}Jz3C8#vv)G$Vm8%K8+Je@%car?SVT4MdnSq4j1aA%?08{W#lGh2fW zMaR-$TeV_=%U4+OD|s%pgc`SujQ*07s)59uc7_j=vf(wv!|~ZW;yO}WD9G-L);5jR z&h{Cd{-$DhOWv;XU(g)>#0K@xy5_+^4E8tb0voS{u^_CmPy}U&-l_e8R#R60&3wSH z$Fo7ud0?^!smg;s?qRgaPUDXznd_nKan;L`N;j>V>n#z$b-!5@E;# zZ2Y`#A-1&<3{9>Do%2n0?cWe`mRiQ{w4+ajSJoDjb@?GPw%6u3wIwWZb7DV%GOX0B zZ9q`uUl#!8(j(>t&tKF}cW48{)Ht$l>;*(^aaNQxdaiF|lKQx#NM~I(?Dh8g?*^KK z6~tD}Z&0Z3`#^NuP3|izMnnUm6hCxR*ZVV}*Gci9NvEYTTi923z{6o`fPhkr2K(Ea z4R;0Mc;CiV9+{7@n^l%W$1Xf8V&@B`n7j;&4K)mv0dk>XdyEHR?v@8na2}O?B5rwP z?iTZ#x}Y}=XKn=krX@wSs078 zq_5gz>;gV~6!Gz>lB2F%uey|T0cb2qm;$FYZIl|N0cik8YV=-K@j?Ek{)e*V>Sb{J5JVFSC@gaXK`&jkQnM|=qDwo4TWNA1T=O4%5F7a4=GFD;Y%KjPIQOT0q(dhqvUgt| N$QMt>)q0&e{}>, +} + +struct SocketServiceRuntime { + running: Arc, +} + +#[derive(Debug, Serialize, Clone)] +struct SocketStatusPayload { + running: bool, + port: u16, +} + +#[derive(Debug, Deserialize)] +struct IncomingSocketPayload { + #[serde(rename = "ticketNumber")] + ticket_number: Option, + #[serde(rename = "displayText")] + display_text: Option, + #[serde(rename = "voiceText")] + voice_text: Option, + flash: Option, +} + +#[derive(Debug, Deserialize)] +struct IncomingSocketMessage { + action: Option, + #[serde(rename = "windowId")] + window_id: Option, + #[serde(rename = "Index", alias = "index")] + index: Option, + #[serde(rename = "windowName")] + window_name: Option, + #[serde(rename = "WindowText", alias = "windowText")] + window_text: Option, + #[serde(rename = "BizText", alias = "bizText")] + biz_text: Option, + #[serde(rename = "ledAddress")] + led_address: Option, + timestamp: Option, + #[serde(rename = "StatusText", alias = "statusText")] + status_text: Option, + payload: Option, +} + +#[derive(Debug, Serialize, Clone)] +struct SocketCallEventPayload { + #[serde(rename = "windowId")] + window_id: u32, + #[serde(rename = "displayText")] + display_text: String, +} + +/// 应用入口:注册插件、菜单事件与前端命令。 +#[cfg_attr(mobile, tauri::mobile_entry_point)] +pub fn run() { + tauri::Builder::default() + .plugin(tauri_plugin_opener::init()) + .plugin(tauri_plugin_store::Builder::default().build()) + .manage(SocketServiceState::default()) + .on_menu_event(|app, event| match event.id().as_ref() { + "open_sync_config" => { + let _ = ensure_config_window(app); + } + "quit_app" => app.exit(0), + _ => {} + }) + .invoke_handler(tauri::generate_handler![ + show_context_menu, + start_socket_service, + stop_socket_service, + get_socket_service_status + ]) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} + +/// 弹出同步屏窗口的右键菜单。 +#[tauri::command] +fn show_context_menu(window: tauri::Window) -> Result<(), String> { + use tauri::menu::{Menu, MenuItem}; + + let config_item = MenuItem::with_id( + window.app_handle(), + "open_sync_config", + "配置同步屏窗口", + true, + None::<&str>, + ) + .map_err(|error| format!("创建菜单项失败: {error}"))?; + let quit_item = MenuItem::with_id( + window.app_handle(), + "quit_app", + "退出", + true, + None::<&str>, + ) + .map_err(|error| format!("创建菜单项失败: {error}"))?; + + let menu = Menu::with_items(window.app_handle(), &[&config_item, &quit_item]) + .map_err(|error| format!("创建菜单失败: {error}"))?; + + window + .popup_menu(&menu) + .map_err(|error| format!("弹出菜单失败: {error}")) +} + +/// 启动本地 socket 服务(9501)并推送服务状态事件。 +#[tauri::command] +fn start_socket_service( + app: tauri::AppHandle, + state: tauri::State<'_, SocketServiceState>, +) -> Result { + let mut guard = state + .runtime + .lock() + .map_err(|_| "socket 状态锁获取失败".to_string())?; + + if let Some(runtime) = guard.as_ref() { + if runtime.running.load(Ordering::SeqCst) { + append_socket_log(&app, "INFO", "socket 服务已在运行,忽略重复启动请求"); + return Ok(SocketStatusPayload { + running: true, + port: SOCKET_PORT, + }); + } + } + + let listener = TcpListener::bind(("0.0.0.0", SOCKET_PORT)) + .map_err(|error| format!("socket 服务启动失败: {error}"))?; + listener + .set_nonblocking(true) + .map_err(|error| format!("socket 非阻塞配置失败: {error}"))?; + + let running = Arc::new(AtomicBool::new(true)); + let running_in_thread = Arc::clone(&running); + let app_in_thread = app.clone(); + append_socket_log( + &app, + "INFO", + format!("socket 服务启动成功,开始监听端口 {}", SOCKET_PORT), + ); + + thread::spawn(move || { + emit_socket_status(&app_in_thread, true); + loop { + if !running_in_thread.load(Ordering::SeqCst) { + break; + } + + match listener.accept() { + Ok((mut stream, _)) => { + let mut buffer = Vec::::new(); + if stream.read_to_end(&mut buffer).is_ok() { + append_socket_log( + &app_in_thread, + "INFO", + format!("socket 接收消息,字节长度 {}", buffer.len()), + ); + dispatch_socket_messages(&app_in_thread, &buffer); + } else { + append_socket_log(&app_in_thread, "WARN", "socket 消息读取失败"); + } + } + Err(error) if error.kind() == std::io::ErrorKind::WouldBlock => { + thread::sleep(Duration::from_millis(30)); + } + Err(_) => { + thread::sleep(Duration::from_millis(50)); + } + } + } + append_socket_log(&app_in_thread, "INFO", "socket 服务线程退出"); + emit_socket_status(&app_in_thread, false); + }); + + *guard = Some(SocketServiceRuntime { running }); + Ok(SocketStatusPayload { + running: true, + port: SOCKET_PORT, + }) +} + +/// 停止本地 socket 服务并推送状态事件。 +#[tauri::command] +fn stop_socket_service( + app: tauri::AppHandle, + state: tauri::State<'_, SocketServiceState>, +) -> Result { + let mut guard = state + .runtime + .lock() + .map_err(|_| "socket 状态锁获取失败".to_string())?; + + if let Some(runtime) = guard.as_ref() { + runtime.running.store(false, Ordering::SeqCst); + append_socket_log(&app, "INFO", "收到停止请求,socket 服务即将停止"); + } + *guard = None; + + emit_socket_status(&app, false); + Ok(SocketStatusPayload { + running: false, + port: SOCKET_PORT, + }) +} + +/// 查询 socket 服务当前状态(用于配置窗口初始化展示)。 +#[tauri::command] +fn get_socket_service_status(state: tauri::State<'_, SocketServiceState>) -> SocketStatusPayload { + let running = state + .runtime + .lock() + .ok() + .and_then(|runtime| { + runtime + .as_ref() + .map(|svc| svc.running.load(Ordering::SeqCst)) + }) + .unwrap_or(false); + + SocketStatusPayload { + running, + port: SOCKET_PORT, + } +} + +fn emit_socket_status(app: &tauri::AppHandle, running: bool) { + let _ = app.emit( + SOCKET_STATUS_EVENT, + SocketStatusPayload { + running, + port: SOCKET_PORT, + }, + ); +} + +fn dispatch_socket_messages(app: &tauri::AppHandle, bytes: &[u8]) { + if bytes.is_empty() { + append_socket_log(app, "WARN", "收到空消息,忽略处理"); + return; + } + + if let Ok(text) = std::str::from_utf8(bytes) { + append_socket_log( + app, + "DEBUG", + format!( + "收到原始报文: {}", + truncate_for_log(text.trim(), 2000) + ), + ); + // 先尝试整包 JSON,再尝试按行解析多条消息。 + if try_dispatch_one_message(app, text) { + return; + } + + for line in text.lines().map(str::trim).filter(|line| !line.is_empty()) { + append_socket_log( + app, + "DEBUG", + format!("拆分报文行: {}", truncate_for_log(line, 1200)), + ); + let _ = try_dispatch_one_message(app, line); + } + } else { + append_socket_log(app, "WARN", "消息非 UTF-8 文本,忽略处理"); + } +} + +fn try_dispatch_one_message(app: &tauri::AppHandle, text: &str) -> bool { + let Ok(message) = serde_json::from_str::(text) else { + append_socket_log( + app, + "WARN", + format!("消息 JSON 解析失败,报文: {}", truncate_for_log(text, 1200)), + ); + return false; + }; + + append_socket_log( + app, + "INFO", + format!( + "消息解析成功 action={:?} windowId={:?} index={:?} windowName={:?} windowText={:?} bizText={:?} ledAddress={:?} timestamp={:?} statusText={:?}", + message.action, + message.window_id, + message.index, + message.window_name, + message.window_text, + message.biz_text, + message.led_address, + message.timestamp, + message.status_text + ), + ); + + let Some(window_id) = message.window_id.or(message.index) else { + append_socket_log(app, "WARN", "消息缺少 windowId 字段"); + return true; + }; + let payload = message.payload; + let display_text = payload + .as_ref() + .and_then(|p| p.display_text.clone()) + .or(message.status_text.clone()); + let Some(display_text) = display_text else { + append_socket_log( + app, + "WARN", + format!("窗口 {} 消息缺少 displayText/StatusText 字段", window_id), + ); + return true; + }; + + append_socket_log( + app, + "INFO", + format!( + "窗口 {} payload 详情 ticketNumber={:?} displayText={} voiceText={:?} flash={:?}", + window_id, + payload.as_ref().and_then(|p| p.ticket_number.clone()), + truncate_for_log(&display_text, 500), + payload.as_ref().and_then(|p| p.voice_text.clone()), + payload.as_ref().and_then(|p| p.flash) + ), + ); + + let _ = app.emit( + SOCKET_CALL_EVENT, + SocketCallEventPayload { + window_id, + display_text, + }, + ); + append_socket_log(app, "INFO", format!("窗口 {} 动态文本已更新", window_id)); + true +} + +fn append_socket_log>(app: &tauri::AppHandle, level: &str, message: S) { + let Ok(log_file_path) = resolve_log_file_path(app) else { + return; + }; + + if let Some(parent) = log_file_path.parent() { + let _ = create_dir_all(parent); + } + + let Ok(mut file) = OpenOptions::new() + .create(true) + .append(true) + .open(&log_file_path) + else { + return; + }; + + let now_ms = SystemTime::now() + .duration_since(UNIX_EPOCH) + .map(|duration| duration.as_millis()) + .unwrap_or(0); + + let line = format!("[{}][{}] {}\n", now_ms, level, message.as_ref()); + let _ = file.write_all(line.as_bytes()); +} + +fn resolve_log_file_path(app: &tauri::AppHandle) -> tauri::Result { + let log_dir = app.path().app_log_dir()?; + Ok(log_dir.join(LOG_FILE_NAME)) +} + +fn truncate_for_log(source: &str, max_chars: usize) -> String { + let mut chars = source.chars(); + let mut output = String::new(); + + for _ in 0..max_chars { + let Some(ch) = chars.next() else { + return output; + }; + output.push(ch); + } + + if chars.next().is_some() { + output.push_str("...(truncated)"); + } + output +} + +/// 确保配置窗口存在: +/// - 已存在则激活聚焦; +/// - 不存在则创建后显示。 +fn ensure_config_window(app: &tauri::AppHandle) -> Result<(), String> { + use tauri::{Manager, WebviewUrl, WebviewWindowBuilder}; + + if let Some(window) = app.get_webview_window("sync-config") { + let _ = window.show(); + let _ = window.unminimize(); + let _ = window.set_focus(); + return Ok(()); + } + + let window = WebviewWindowBuilder::new(app, "sync-config", WebviewUrl::App("/#/config".into())) + .title("配置同步屏窗口") + .inner_size(720.0, 460.0) + .resizable(true) + .decorations(true) + .always_on_top(true) + .build() + .map_err(|error| format!("创建配置窗口失败: {error}"))?; + + let _ = window.show(); + let _ = window.set_focus(); + Ok(()) +} diff --git a/broadcast-client/src-tauri/src/main.rs b/broadcast-client/src-tauri/src/main.rs new file mode 100644 index 0000000..be4de85 --- /dev/null +++ b/broadcast-client/src-tauri/src/main.rs @@ -0,0 +1,6 @@ +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +// 原生启动入口,转交到库内 run()。 +fn main() { + broadcast_client_lib::run() +} diff --git a/broadcast-client/src-tauri/tauri.conf.json b/broadcast-client/src-tauri/tauri.conf.json new file mode 100644 index 0000000..d9fe5c6 --- /dev/null +++ b/broadcast-client/src-tauri/tauri.conf.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://schema.tauri.app/config/2", + "productName": "broadcast-client", + "version": "0.1.0", + "identifier": "com.ziyun.broadcastclient", + "build": { + "beforeDevCommand": "npm run dev", + "devUrl": "http://localhost:1420", + "beforeBuildCommand": "npm run build", + "frontendDist": "../dist" + }, + "app": { + "windows": [ + { + "label": "main", + "title": "Broadcast Client", + "width": 1280, + "height": 256, + "x": 0, + "y": 0, + "decorations": false, + "transparent": false, + "shadow": false, + "alwaysOnTop": true, + "resizable": false, + "maximizable": false, + "fullscreen": false, + "visible": true + } + ], + "security": { + "csp": null + } + }, + "bundle": { + "active": false, + "targets": "all" + } +} diff --git a/broadcast-client/src/App.vue b/broadcast-client/src/App.vue new file mode 100644 index 0000000..6f9159d --- /dev/null +++ b/broadcast-client/src/App.vue @@ -0,0 +1,30 @@ + + + diff --git a/broadcast-client/src/components/RulerSegment.vue b/broadcast-client/src/components/RulerSegment.vue new file mode 100644 index 0000000..2d3390c --- /dev/null +++ b/broadcast-client/src/components/RulerSegment.vue @@ -0,0 +1,48 @@ + + + diff --git a/broadcast-client/src/components/RulerTicks.vue b/broadcast-client/src/components/RulerTicks.vue new file mode 100644 index 0000000..8cea6f7 --- /dev/null +++ b/broadcast-client/src/components/RulerTicks.vue @@ -0,0 +1,24 @@ + + + diff --git a/broadcast-client/src/components/SegmentChildren.vue b/broadcast-client/src/components/SegmentChildren.vue new file mode 100644 index 0000000..02f7109 --- /dev/null +++ b/broadcast-client/src/components/SegmentChildren.vue @@ -0,0 +1,25 @@ + + + diff --git a/broadcast-client/src/components/WindowAreasLayer.vue b/broadcast-client/src/components/WindowAreasLayer.vue new file mode 100644 index 0000000..b38ee90 --- /dev/null +++ b/broadcast-client/src/components/WindowAreasLayer.vue @@ -0,0 +1,68 @@ + + + diff --git a/broadcast-client/src/composables/useBroadcastConfig.ts b/broadcast-client/src/composables/useBroadcastConfig.ts new file mode 100644 index 0000000..a3251d1 --- /dev/null +++ b/broadcast-client/src/composables/useBroadcastConfig.ts @@ -0,0 +1,56 @@ +import { onMounted, onUnmounted, ref } from "vue"; +import type { BroadcastConfig } from "../models/config"; +import { DEFAULT_BROADCAST_CONFIG } from "../models/config"; +import { + loadBroadcastConfig, + onBroadcastConfigUpdated, + saveBroadcastConfig, +} from "../services/configStore"; + +/** + * 配置状态组合式函数: + * - 提供读取与更新能力; + * - 监听全局事件并自动同步到当前窗口。 + */ +export function useBroadcastConfig() { + const config = ref({ ...DEFAULT_BROADCAST_CONFIG }); + + let unlisten: (() => void) | null = null; + + /** + * 从持久化存储刷新配置到内存状态。 + */ + async function refreshConfig() { + config.value = await loadBroadcastConfig(); + } + + /** + * 合并并保存局部配置变更。 + */ + async function patchConfig(patch: Partial) { + const nextConfig = { ...config.value, ...patch }; + const saved = await saveBroadcastConfig(nextConfig); + config.value = saved; + return saved; + } + + onMounted(() => { + void refreshConfig(); + void onBroadcastConfigUpdated((nextConfig) => { + config.value = nextConfig; + }).then((off) => { + unlisten = off; + }); + }); + + onUnmounted(() => { + unlisten?.(); + unlisten = null; + }); + + return { + config, + refreshConfig, + patchConfig, + }; +} diff --git a/broadcast-client/src/composables/useRulerTicks.ts b/broadcast-client/src/composables/useRulerTicks.ts new file mode 100644 index 0000000..225b2c8 --- /dev/null +++ b/broadcast-client/src/composables/useRulerTicks.ts @@ -0,0 +1,10 @@ +import { computed, type Ref } from "vue"; +import { buildTicks } from "../services/tickService"; + +/** + * 依据当前主容器宽度返回刻度列表(含缓存)。 + */ +export function useRulerTicks(totalWidth: Ref) { + const ticks = computed(() => buildTicks(totalWidth.value)); + return { ticks }; +} diff --git a/broadcast-client/src/composables/useScreenInfo.ts b/broadcast-client/src/composables/useScreenInfo.ts new file mode 100644 index 0000000..ae10ca7 --- /dev/null +++ b/broadcast-client/src/composables/useScreenInfo.ts @@ -0,0 +1,110 @@ +import { onMounted, onUnmounted, ref, watch, type Ref } from "vue"; +import { + LogicalSize, + PhysicalPosition, + currentMonitor, + getCurrentWindow, +} from "@tauri-apps/api/window"; +import { buildSegments, normalizeScreenWidth } from "../services/segmentService"; +import type { Segment } from "../models/ruler"; +import { createDebouncedAsyncTask } from "../utils/timing"; + +const FALLBACK_SCREEN_WIDTH = 1920; +const RESIZE_DEBOUNCE_MS = 100; + +/** + * 管理屏幕尺寸与同步屏窗口尺寸。 + * 会根据分段结果自动同步窗口位置与高度。 + */ +export function useScreenInfo( + totalWidth: Ref, + segmentHeight: Ref, + segmentsRef?: Ref, + configuredWindowHeight?: Ref, +) { + const screenWidth = ref(FALLBACK_SCREEN_WIDTH); + + /** + * 读取当前主屏宽度,读取失败时使用浏览器宽度回退。 + */ + async function resolveScreenWidth() { + try { + const monitor = await currentMonitor(); + const scaleFactor = monitor?.scaleFactor ?? 1; + const widthRaw = monitor?.size?.width ?? window.screen.width ?? FALLBACK_SCREEN_WIDTH; + const width = widthRaw / scaleFactor; + screenWidth.value = normalizeScreenWidth(width); + } catch { + screenWidth.value = normalizeScreenWidth(window.screen.width || FALLBACK_SCREEN_WIDTH); + } + } + + /** + * 同步 Tauri 窗口位置和尺寸,确保分段堆叠区域可见。 + */ + async function syncWindowBounds() { + try { + const currentWindow = getCurrentWindow(); + const segments = segmentsRef?.value?.length + ? segmentsRef.value + : buildSegments(screenWidth.value, totalWidth.value, segmentHeight.value); + const calculatedHeight = Math.max( + segmentHeight.value, + ...segments.map((item) => item.top + item.height), + ); + const targetHeight = + configuredWindowHeight?.value && configuredWindowHeight.value > 0 + ? Math.floor(configuredWindowHeight.value) + : calculatedHeight; + + await currentWindow.setPosition(new PhysicalPosition(0, 0)); + await currentWindow.setSize(new LogicalSize(screenWidth.value, targetHeight)); + } catch { + // Tauri API 不可用时使用浏览器默认行为。 + } + } + + /** + * 串联刷新流程:先更新屏宽,再同步窗口边界。 + */ + async function refreshLayout() { + await resolveScreenWidth(); + await syncWindowBounds(); + } + + const resizeTask = createDebouncedAsyncTask(refreshLayout, RESIZE_DEBOUNCE_MS); + + /** + * 浏览器 resize 事件入口,使用防抖避免频繁重算。 + */ + function handleResize() { + resizeTask.trigger(); + } + + onMounted(() => { + void refreshLayout(); + window.addEventListener("resize", handleResize); + }); + + watch( + [ + totalWidth, + segmentHeight, + ...(segmentsRef ? [segmentsRef] : []), + ...(configuredWindowHeight ? [configuredWindowHeight] : []), + ], + () => { + void refreshLayout(); + }, + ); + + onUnmounted(() => { + window.removeEventListener("resize", handleResize); + resizeTask.cancel(); + }); + + return { + screenWidth, + refreshLayout, + }; +} diff --git a/broadcast-client/src/composables/useSegmentLayout.ts b/broadcast-client/src/composables/useSegmentLayout.ts new file mode 100644 index 0000000..80d04b7 --- /dev/null +++ b/broadcast-client/src/composables/useSegmentLayout.ts @@ -0,0 +1,17 @@ +import { computed, type Ref } from "vue"; +import { buildSegments } from "../services/segmentService"; + +/** + * 根据屏宽和配置生成分段布局及容器高度。 + */ +export function useSegmentLayout( + screenWidth: Ref, + totalWidth: Ref, + segmentHeight: Ref, +) { + const segments = computed(() => + buildSegments(screenWidth.value, totalWidth.value, segmentHeight.value), + ); + const containerHeight = computed(() => segments.value.length * segmentHeight.value); + return { segments, containerHeight }; +} diff --git a/broadcast-client/src/env.d.ts b/broadcast-client/src/env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/broadcast-client/src/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/broadcast-client/src/main.ts b/broadcast-client/src/main.ts new file mode 100644 index 0000000..fba3778 --- /dev/null +++ b/broadcast-client/src/main.ts @@ -0,0 +1,8 @@ +import { createApp } from "vue"; +import ElementPlus from "element-plus/es"; +import "element-plus/theme-chalk/index.css"; +import App from "./App.vue"; +import "./styles.css"; + +// 前端入口:挂载 Vue 根组件。 +createApp(App).use(ElementPlus).mount("#app"); diff --git a/broadcast-client/src/models/config.ts b/broadcast-client/src/models/config.ts new file mode 100644 index 0000000..b9999f4 --- /dev/null +++ b/broadcast-client/src/models/config.ts @@ -0,0 +1,50 @@ +import { DEFAULT_SEGMENT_HEIGHT, DEFAULT_TOTAL_WIDTH } from "./ruler"; + +// 单个分段可配置项(长度与窗口内定位坐标)。 +export interface SegmentConfigItem { + length: number; + x: number; + y: number; +} + +// 文本样式配置。 +export interface TextStyleConfig { + fontSize: number; + color: string; + fontWeight: number; +} + +// 子div(窗口区域)配置模型。 +export interface ChildWindowAreaConfig { + id: string; + windowId: number; + width: number; + height: number; + x: number; + y: number; + windowNumber: string; + windowNumberCircle: boolean; + windowNumberStyle: TextStyleConfig; + staticText: string; + staticTextStyle: TextStyleConfig; + dynamicText: string; + dynamicTextStyle: TextStyleConfig; +} + +// 广播渲染配置模型。 +export interface BroadcastConfig { + totalWidth: number; + segmentHeight: number; + showRuler: boolean; + segments: SegmentConfigItem[]; + windowAreas: ChildWindowAreaConfig[]; +} + +// 应用启动时使用的默认配置。 +export const DEFAULT_BROADCAST_CONFIG: BroadcastConfig = { + totalWidth: DEFAULT_TOTAL_WIDTH, + segmentHeight: DEFAULT_SEGMENT_HEIGHT, + showRuler: true, + segments: [], + windowAreas: [], +}; diff --git a/broadcast-client/src/models/ruler.ts b/broadcast-client/src/models/ruler.ts new file mode 100644 index 0000000..7facd02 --- /dev/null +++ b/broadcast-client/src/models/ruler.ts @@ -0,0 +1,48 @@ +// 默认主容器宽度(可被配置覆盖)。 +export const DEFAULT_TOTAL_WIDTH = 800; +// 默认分段高度(单位 px)。 +export const DEFAULT_SEGMENT_HEIGHT = 64; +// 小刻度间隔(单位 px)。 +export const MINOR_TICK_GAP = 10; +// 大刻度间隔(单位 px)。 +export const MAJOR_TICK_GAP = 100; + +export type TickType = "minor" | "major"; + +export interface Tick { + x: number; + type: TickType; + label?: string; +} + +// 分段渲染数据模型。 +export interface Segment { + index: number; + sourceX: number; + sliceWidth: number; + left: number; + top: number; + height: number; +} + +// 主容器内可跨段显示的子元素模型。 +export interface ChildElement { + id: string; + left: number; + width: number; + top: number; + height: number; + className?: string; +} + +// 子元素切片后的渲染模型。 +export interface ChildSlice { + childId: string; + segmentIndex: number; + renderLeft: number; + renderTop: number; + renderWidth: number; + renderHeight: number; + clipOffset: number; + className?: string; +} diff --git a/broadcast-client/src/services/childSliceService.ts b/broadcast-client/src/services/childSliceService.ts new file mode 100644 index 0000000..03dcd27 --- /dev/null +++ b/broadcast-client/src/services/childSliceService.ts @@ -0,0 +1,39 @@ +import type { ChildElement, ChildSlice, Segment } from "../models/ruler"; + +/** + * 计算子元素在每个分段内的可见切片,用于跨段连续渲染。 + */ +export function buildChildSlices(children: ChildElement[], segments: Segment[]): ChildSlice[] { + const slices: ChildSlice[] = []; + + for (const child of children) { + const childStart = child.left; + const childEnd = child.left + child.width; + + for (const segment of segments) { + const segmentStart = segment.sourceX; + const segmentEnd = segmentStart + segment.sliceWidth; + + const visibleStart = Math.max(childStart, segmentStart); + const visibleEnd = Math.min(childEnd, segmentEnd); + const visibleWidth = visibleEnd - visibleStart; + + if (visibleWidth <= 0) { + continue; + } + + slices.push({ + childId: child.id, + segmentIndex: segment.index, + renderLeft: visibleStart - segmentStart, + renderTop: child.top, + renderWidth: visibleWidth, + renderHeight: child.height, + clipOffset: Math.max(0, segmentStart - childStart), + className: child.className, + }); + } + } + + return slices; +} diff --git a/broadcast-client/src/services/configStore.ts b/broadcast-client/src/services/configStore.ts new file mode 100644 index 0000000..59eb389 --- /dev/null +++ b/broadcast-client/src/services/configStore.ts @@ -0,0 +1,200 @@ +import { emit, listen, type UnlistenFn } from "@tauri-apps/api/event"; +import { load, type Store } from "@tauri-apps/plugin-store"; +import type { BroadcastConfig, ChildWindowAreaConfig, TextStyleConfig } from "../models/config"; +import { DEFAULT_BROADCAST_CONFIG } from "../models/config"; +import { + normalizeSegmentConfigItem, + normalizeSegmentHeight, + normalizeScreenWidth, + normalizeTotalWidth, +} from "./segmentService"; + +const STORE_PATH = "broadcast-config.json"; +const CONFIG_KEY = "runtime_broadcast_config"; +const CONFIG_EVENT = "broadcast-config-updated"; +const LOCAL_STORAGE_KEY = "broadcast_config_local_fallback"; + +let storePromise: Promise | null = null; + +function normalizeFontSize(raw: unknown, fallback: number): number { + return typeof raw === "number" && Number.isFinite(raw) && raw > 0 ? Math.floor(raw) : fallback; +} + +function normalizeFontWeight(raw: unknown, fallback: number): number { + return typeof raw === "number" && Number.isFinite(raw) && raw >= 100 ? Math.floor(raw) : fallback; +} + +function normalizeColor(raw: unknown, fallback: string): string { + if (typeof raw !== "string") { + return fallback; + } + const value = raw.trim(); + return value.length > 0 ? value : fallback; +} + +function normalizeTextStyle(raw: unknown, fallback: TextStyleConfig): TextStyleConfig { + const source = (raw ?? {}) as Partial; + return { + fontSize: normalizeFontSize(source.fontSize, fallback.fontSize), + color: normalizeColor(source.color, fallback.color), + fontWeight: normalizeFontWeight(source.fontWeight, fallback.fontWeight), + }; +} + +function normalizeWindowArea(raw: unknown, index: number): ChildWindowAreaConfig { + const source = (raw ?? {}) as Partial; + return { + id: typeof source.id === "string" && source.id.trim() ? source.id : `area-${index + 1}`, + windowId: + typeof source.windowId === "number" && Number.isFinite(source.windowId) && source.windowId > 0 + ? Math.floor(source.windowId) + : index + 1, + width: normalizeFontSize(source.width, 220), + height: normalizeFontSize(source.height, 48), + x: typeof source.x === "number" && Number.isFinite(source.x) ? Math.max(0, Math.floor(source.x)) : 0, + y: typeof source.y === "number" && Number.isFinite(source.y) ? Math.max(0, Math.floor(source.y)) : 0, + windowNumber: + typeof source.windowNumber === "string" && source.windowNumber.trim() + ? source.windowNumber + : String(index + 1), + windowNumberCircle: source.windowNumberCircle === true, + windowNumberStyle: normalizeTextStyle(source.windowNumberStyle, { + fontSize: 16, + color: "#ffffff", + fontWeight: 700, + }), + staticText: typeof source.staticText === "string" ? source.staticText : "静态文本", + staticTextStyle: normalizeTextStyle(source.staticTextStyle, { + fontSize: 14, + color: "#ffffff", + fontWeight: 500, + }), + dynamicText: typeof source.dynamicText === "string" ? source.dynamicText : "动态文本", + dynamicTextStyle: normalizeTextStyle(source.dynamicTextStyle, { + fontSize: 14, + color: "#ffffff", + fontWeight: 500, + }), + }; +} + +/** + * 统一校验并归一化配置,避免脏数据污染运行态。 + */ +function normalizeConfig(raw: unknown): BroadcastConfig { + const source = (raw ?? {}) as Partial; + const segmentHeight = normalizeSegmentHeight( + source.segmentHeight ?? DEFAULT_BROADCAST_CONFIG.segmentHeight, + ); + const totalWidth = normalizeTotalWidth(source.totalWidth ?? DEFAULT_BROADCAST_CONFIG.totalWidth); + const screenWidth = normalizeScreenWidth(window.screen.width || 1920); + const segmentsRaw = Array.isArray(source.segments) ? source.segments : []; + const windowAreasRaw = Array.isArray(source.windowAreas) ? source.windowAreas : []; + return { + totalWidth: Math.min(totalWidth, screenWidth), + segmentHeight, + showRuler: + typeof source.showRuler === "boolean" ? source.showRuler : DEFAULT_BROADCAST_CONFIG.showRuler, + segments: segmentsRaw.map((item, index) => + normalizeSegmentConfigItem(item, index, screenWidth, segmentHeight), + ), + windowAreas: windowAreasRaw.map((item, index) => normalizeWindowArea(item, index)), + }; +} + +/** + * 延迟初始化 store,整个生命周期复用同一个实例。 + */ +async function getStore(): Promise { + if (storePromise === null) { + storePromise = load(STORE_PATH, { defaults: {}, autoSave: false }); + } + return storePromise; +} + +/** + * store 不可用时的浏览器本地回退读取。 + */ +function getFallbackConfig(): BroadcastConfig { + try { + const raw = window.localStorage.getItem(LOCAL_STORAGE_KEY); + if (!raw) { + return DEFAULT_BROADCAST_CONFIG; + } + return normalizeConfig(JSON.parse(raw)); + } catch { + return DEFAULT_BROADCAST_CONFIG; + } +} + +/** + * store 不可用时的浏览器本地回退写入。 + */ +function setFallbackConfig(config: BroadcastConfig) { + try { + window.localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(config)); + } catch { + // 本地存储失败时忽略,保持应用可用。 + } +} + +/** + * 广播配置更新事件,给其他窗口实时同步。 + */ +async function emitConfigUpdated(config: BroadcastConfig) { + try { + await emit(CONFIG_EVENT, config); + } catch { + // 浏览器模式下无宿主事件总线,忽略即可。 + } +} + +/** + * 读取配置并在首次运行时写入默认配置。 + */ +export async function loadBroadcastConfig(): Promise { + try { + const store = await getStore(); + const saved = await store.get(CONFIG_KEY); + const config = saved ? normalizeConfig(saved) : DEFAULT_BROADCAST_CONFIG; + if (!saved) { + await store.set(CONFIG_KEY, config); + await store.save(); + } + return config; + } catch { + return getFallbackConfig(); + } +} + +/** + * 保存配置到 store,并向全局广播更新事件。 + */ +export async function saveBroadcastConfig(payload: BroadcastConfig): Promise { + const config = normalizeConfig(payload); + try { + const store = await getStore(); + await store.set(CONFIG_KEY, config); + await store.save(); + } catch { + setFallbackConfig(config); + } + + await emitConfigUpdated(config); + return config; +} + +/** + * 监听配置更新事件,用于多窗口同步。 + */ +export async function onBroadcastConfigUpdated( + handler: (config: BroadcastConfig) => void, +): Promise { + try { + return await listen(CONFIG_EVENT, (event) => { + handler(normalizeConfig(event.payload)); + }); + } catch { + return () => {}; + } +} diff --git a/broadcast-client/src/services/segmentService.test.ts b/broadcast-client/src/services/segmentService.test.ts new file mode 100644 index 0000000..3e2a799 --- /dev/null +++ b/broadcast-client/src/services/segmentService.test.ts @@ -0,0 +1,47 @@ +import { describe, expect, it } from "vitest"; +import { DEFAULT_SEGMENT_HEIGHT } from "../models/ruler"; +import { buildSegments, normalizeScreenWidth } from "./segmentService"; + +const TOTAL_WIDTH = 5000; + +// 分段算法核心用例。 +describe("segmentService", () => { + // 非法屏宽应回退默认值。 + it("normalizes invalid screen width", () => { + expect(normalizeScreenWidth(0)).toBe(1920); + expect(normalizeScreenWidth(-1)).toBe(1920); + expect(normalizeScreenWidth(Number.NaN)).toBe(1920); + }); + + // 分段数量与前两段布局应符合规则。 + it("builds segments with correct count and size", () => { + const width = 1080; + const segments = buildSegments(width, TOTAL_WIDTH, DEFAULT_SEGMENT_HEIGHT); + + expect(segments.length).toBe(Math.ceil(TOTAL_WIDTH / width)); + expect(segments[0]).toMatchObject({ + index: 0, + sourceX: 0, + sliceWidth: 1080, + top: 0, + height: DEFAULT_SEGMENT_HEIGHT, + }); + expect(segments[1]).toMatchObject({ + index: 1, + sourceX: 1080, + sliceWidth: 1080, + top: DEFAULT_SEGMENT_HEIGHT, + height: DEFAULT_SEGMENT_HEIGHT, + }); + }); + + // 最后一段应被裁剪到剩余宽度。 + it("clips the last segment width correctly", () => { + const width = 1080; + const segments = buildSegments(width, TOTAL_WIDTH, DEFAULT_SEGMENT_HEIGHT); + const last = segments[segments.length - 1]; + + expect(last.sliceWidth).toBe(TOTAL_WIDTH - 1080 * 4); + expect(last.sourceX + last.sliceWidth).toBe(TOTAL_WIDTH); + }); +}); diff --git a/broadcast-client/src/services/segmentService.ts b/broadcast-client/src/services/segmentService.ts new file mode 100644 index 0000000..0c88b0c --- /dev/null +++ b/broadcast-client/src/services/segmentService.ts @@ -0,0 +1,125 @@ +import type { SegmentConfigItem } from "../models/config"; +import { DEFAULT_SEGMENT_HEIGHT, DEFAULT_TOTAL_WIDTH, type Segment } from "../models/ruler"; + +/** + * 规范化主屏宽度,确保分段计算有稳定输入。 + */ +export function normalizeScreenWidth(rawWidth: number): number { + return Number.isFinite(rawWidth) && rawWidth > 0 ? Math.floor(rawWidth) : 1920; +} + +/** + * 规范化主容器总长度,回退到默认值。 + */ +export function normalizeTotalWidth(rawWidth: number): number { + return Number.isFinite(rawWidth) && rawWidth > 0 ? Math.floor(rawWidth) : DEFAULT_TOTAL_WIDTH; +} + +/** + * 规范化分段高度,避免非法高度导致布局异常。 + */ +export function normalizeSegmentHeight(rawHeight: number): number { + return Number.isFinite(rawHeight) && rawHeight > 0 ? Math.floor(rawHeight) : DEFAULT_SEGMENT_HEIGHT; +} + +/** + * 按“屏宽切片 + 纵向堆叠”规则生成默认分段。 + */ +export function buildSegments( + screenWidth: number, + totalWidth: number = DEFAULT_TOTAL_WIDTH, + segmentHeight: number = DEFAULT_SEGMENT_HEIGHT, +): Segment[] { + const safeWidth = normalizeScreenWidth(screenWidth); + const safeTotalWidth = normalizeTotalWidth(totalWidth); + const safeSegmentHeight = normalizeSegmentHeight(segmentHeight); + const count = Math.ceil(safeTotalWidth / safeWidth); + const segments: Segment[] = []; + + for (let i = 0; i < count; i += 1) { + const sourceX = i * safeWidth; + const remainWidth = safeTotalWidth - sourceX; + const sliceWidth = Math.max(0, Math.min(safeWidth, remainWidth)); + + segments.push({ + index: i, + sourceX, + sliceWidth, + left: 0, + top: i * safeSegmentHeight, + height: safeSegmentHeight, + }); + } + + return segments; +} + +/** + * 规范化单个分段配置项,保证长度和坐标在可用范围内。 + */ +export function normalizeSegmentConfigItem( + item: Partial | undefined, + index: number, + screenWidth: number, + segmentHeight: number, +): SegmentConfigItem { + const safeScreenWidth = normalizeScreenWidth(screenWidth); + const safeSegmentHeight = normalizeSegmentHeight(segmentHeight); + const lengthRaw = item?.length ?? safeScreenWidth; + const xRaw = item?.x ?? 0; + const yRaw = item?.y ?? index * safeSegmentHeight; + + return { + length: Math.max(1, Math.min(safeScreenWidth, Math.floor(lengthRaw))), + x: Number.isFinite(xRaw) ? Math.max(0, Math.floor(xRaw)) : 0, + y: Number.isFinite(yRaw) ? Math.max(0, Math.floor(yRaw)) : index * safeSegmentHeight, + }; +} + +/** + * 使用配置分段列表构造渲染段;若配置为空则回退默认自动分段。 + */ +export function buildSegmentsFromConfig( + segmentConfigs: SegmentConfigItem[], + screenWidth: number, + totalWidth: number, + segmentHeight: number, +): Segment[] { + const safeScreenWidth = normalizeScreenWidth(screenWidth); + const safeTotalWidth = normalizeTotalWidth(totalWidth); + const safeSegmentHeight = normalizeSegmentHeight(segmentHeight); + const normalized = segmentConfigs.map((item, index) => + normalizeSegmentConfigItem(item, index, safeScreenWidth, safeSegmentHeight), + ); + + if (normalized.length === 0) { + return buildSegments(safeScreenWidth, safeTotalWidth, safeSegmentHeight); + } + + const segments: Segment[] = []; + let sourceCursor = 0; + + for (let i = 0; i < normalized.length; i += 1) { + if (sourceCursor >= safeTotalWidth) { + break; + } + const current = normalized[i]; + const remainWidth = safeTotalWidth - sourceCursor; + const sliceWidth = Math.min(current.length, remainWidth); + segments.push({ + index: i, + sourceX: sourceCursor, + sliceWidth, + left: current.x, + top: current.y, + height: safeSegmentHeight, + }); + sourceCursor += sliceWidth; + } + + if (segments.length === 0) { + return buildSegments(safeScreenWidth, safeTotalWidth, safeSegmentHeight); + } + + return segments; +} diff --git a/broadcast-client/src/services/tickService.test.ts b/broadcast-client/src/services/tickService.test.ts new file mode 100644 index 0000000..1591aff --- /dev/null +++ b/broadcast-client/src/services/tickService.test.ts @@ -0,0 +1,27 @@ +import { describe, expect, it } from "vitest"; +import { MAJOR_TICK_GAP, MINOR_TICK_GAP } from "../models/ruler"; +import { buildTicks } from "./tickService"; + +const TOTAL_WIDTH = 800; + +// 刻度生成规则验证。 +describe("tickService", () => { + // 刻度应覆盖整个主容器宽度。 + it("builds ticks covering full ruler width", () => { + const ticks = buildTicks(TOTAL_WIDTH); + + expect(ticks[0].x).toBe(0); + expect(ticks[ticks.length - 1].x).toBe(TOTAL_WIDTH); + expect(ticks.length).toBe(TOTAL_WIDTH / MINOR_TICK_GAP + 1); + }); + + // 每 100px 应生成一个大刻度并附带标签。 + it("marks major ticks every 100px", () => { + const ticks = buildTicks(TOTAL_WIDTH); + const majors = ticks.filter((tick) => tick.type === "major"); + + expect(majors[0]).toMatchObject({ x: 0, label: "0" }); + expect(majors[1]).toMatchObject({ x: MAJOR_TICK_GAP, label: "100" }); + expect(majors.every((tick) => tick.x % MAJOR_TICK_GAP === 0)).toBe(true); + }); +}); diff --git a/broadcast-client/src/services/tickService.ts b/broadcast-client/src/services/tickService.ts new file mode 100644 index 0000000..1a02ada --- /dev/null +++ b/broadcast-client/src/services/tickService.ts @@ -0,0 +1,32 @@ +import { + DEFAULT_TOTAL_WIDTH, + MAJOR_TICK_GAP, + MINOR_TICK_GAP, + type Tick, +} from "../models/ruler"; +import { normalizeTotalWidth } from "./segmentService"; + +const tickCache = new Map(); + +/** + * 生成标尺刻度数据,并按 totalWidth 做缓存复用。 + */ +export function buildTicks(totalWidth: number = DEFAULT_TOTAL_WIDTH): Tick[] { + const safeTotalWidth = normalizeTotalWidth(totalWidth); + const cachedTicks = tickCache.get(safeTotalWidth); + if (cachedTicks) { + return cachedTicks; + } + + const ticks: Tick[] = []; + for (let x = 0; x <= safeTotalWidth; x += MINOR_TICK_GAP) { + if (x % MAJOR_TICK_GAP === 0) { + ticks.push({ x, type: "major", label: String(x) }); + } else { + ticks.push({ x, type: "minor" }); + } + } + + tickCache.set(safeTotalWidth, ticks); + return ticks; +} diff --git a/broadcast-client/src/services/windowAreaSliceService.ts b/broadcast-client/src/services/windowAreaSliceService.ts new file mode 100644 index 0000000..b158f05 --- /dev/null +++ b/broadcast-client/src/services/windowAreaSliceService.ts @@ -0,0 +1,52 @@ +import type { ChildWindowAreaConfig } from "../models/config"; +import type { Segment } from "../models/ruler"; + +export interface WindowAreaSlice { + area: ChildWindowAreaConfig; + segmentIndex: number; + renderLeft: number; + renderTop: number; + renderWidth: number; + renderHeight: number; + clipOffset: number; +} + +/** + * 根据分段 sourceX 对窗口区域做横向切片,确保跨段连续显示。 + */ +export function buildWindowAreaSlices( + areas: ChildWindowAreaConfig[], + segments: Segment[], +): WindowAreaSlice[] { + const slices: WindowAreaSlice[] = []; + + for (const area of areas) { + const areaStart = area.x; + const areaEnd = area.x + area.width; + + for (const segment of segments) { + const segmentStart = segment.sourceX; + const segmentEnd = segmentStart + segment.sliceWidth; + + const visibleStart = Math.max(areaStart, segmentStart); + const visibleEnd = Math.min(areaEnd, segmentEnd); + const visibleWidth = visibleEnd - visibleStart; + + if (visibleWidth <= 0) { + continue; + } + + slices.push({ + area, + segmentIndex: segment.index, + renderLeft: visibleStart - segmentStart, + renderTop: area.y, + renderWidth: visibleWidth, + renderHeight: area.height, + clipOffset: Math.max(0, segmentStart - areaStart), + }); + } + } + + return slices; +} diff --git a/broadcast-client/src/styles.css b/broadcast-client/src/styles.css new file mode 100644 index 0000000..43a00f2 --- /dev/null +++ b/broadcast-client/src/styles.css @@ -0,0 +1,393 @@ +:root { + color-scheme: light; + font-family: "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif; +} + +* { + box-sizing: border-box; +} + +html, +body, +#app { + margin: 0; + padding: 0; + width: 100%; + height: 100%; + overflow: hidden; + border-radius: 0 !important; + background: #000; +} + +.broadcast-root { + position: relative; + overflow: hidden; + background: #000; +} + +.segment { + position: absolute; + overflow: hidden; +} + +.segment-track { + position: absolute; + left: 0; + top: 0; + height: 64px; +} + +.ruler-track { + position: relative; + height: 64px; +} + +.tick { + position: absolute; + bottom: 0; + width: 1px; + background: #7f8da8; +} + +.tick.minor { + height: 16px; + opacity: 0.85; +} + +.tick.major { + height: 34px; + background: #c4d2ea; +} + +.tick-label { + position: absolute; + top: -20px; + left: 4px; + font-size: 10px; + line-height: 1; + color: #d9e4ff; + opacity: 0.9; + white-space: nowrap; +} + +.children-layer { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + pointer-events: none; +} + +.child-slice { + position: absolute; + border-radius: 0; + background: linear-gradient(90deg, #27ae60 0%, #2ecc71 100%); +} + +.child-banner.alt { + background: linear-gradient(90deg, #8e44ad 0%, #9b59b6 100%); +} + +.child-banner.warn { + background: linear-gradient(90deg, #d35400 0%, #f39c12 100%); +} + +.config-root { + width: 100%; + height: 100%; + background: #eef1f6; + color: #111; + padding: 0 16px 16px; + overflow: auto; +} + +.config-page { + display: grid; + gap: 12px; +} + +.config-card { + border: 1px solid #ebeef5; +} + +.config-collapse { + border: 1px solid #b8c3d9; + border-radius: 6px; + background: #d9e1f0; + overflow: hidden; +} + +.config-collapse .el-collapse-item__header { + padding: 0 14px; + background: #d0dbef; + color: #1f2d3d; + border-bottom: 1px solid #b8c3d9; +} + +.config-collapse .el-collapse-item__wrap { + background: #f8fbff; +} + +.config-collapse .el-collapse-item__content { + padding: 14px; +} + +.panel-scroll { + max-height: 42vh; + overflow: auto; + padding-right: 6px; +} + +.panel-scroll--tall { + max-height: 56vh; +} + +.card-header { + font-weight: 600; +} + +.row-between { + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; +} + +.area-list { + display: grid; + gap: 10px; +} + +.area-item { + background: #ffffff; +} + +.el-input-number { + width: 100%; +} + +.config-title { + margin: 12px 0; + font-size: 16px; +} + +.config-desc { + margin: 0; + color: #666; + font-size: 14px; +} + +.config-form { + margin-top: 16px; + display: grid; + gap: 10px; + max-width: 480px; +} + +.field-row { + display: flex; + justify-content: space-between; + align-items: center; + gap: 16px; +} + +.field-row input[type="number"] { + width: 160px; + padding: 6px 8px; + background: #fff; + border: 1px solid #c8c8c8; + color: #111; +} + +.checkbox-row { + justify-content: flex-start; +} + +.segments-panel { + margin-top: 20px; +} + +.segments-panel h2 { + margin: 0 0 8px; + font-size: 16px; +} + +.segment-grid { + margin-top: 8px; + display: grid; + grid-template-columns: 90px 120px 160px; + gap: 6px 10px; + font-size: 13px; +} + +.segment-grid-header { + color: #95a5a6; +} + +.actions-row { + display: flex; + gap: 8px; + margin-top: 14px; +} + +.btn { + border: 1px solid #c8c8c8; + background: #fff; + color: #222; + padding: 6px 10px; + cursor: pointer; +} + +.btn.primary { + background: #1677ff; + color: #fff; + border-color: #1677ff; +} + +.segment-list { + margin-top: 10px; + display: grid; + gap: 8px; +} + +.segment-row { + display: grid; + grid-template-columns: 44px 110px 90px 90px 70px; + gap: 8px; + align-items: center; +} + +.segment-row input[type="number"] { + width: 100%; + padding: 4px 6px; + border: 1px solid #c8c8c8; +} + +.save-hint { + margin-top: 8px; + color: #666; + font-size: 12px; +} + +.socket-status { + display: inline-flex; + align-items: center; + gap: 6px; + font-size: 12px; +} + +.socket-dot { + width: 10px; + height: 10px; + border-radius: 50%; + display: inline-block; +} + +.socket-status.running .socket-dot { + background: #2ecc71; + box-shadow: 0 0 6px rgba(46, 204, 113, 0.85); +} + +.socket-status.stopped .socket-dot { + background: #e74c3c; + box-shadow: 0 0 6px rgba(231, 76, 60, 0.85); +} + +.areas-panel { + margin-top: 18px; + padding-bottom: 18px; +} + +.window-area-list { + margin-top: 10px; + display: grid; + gap: 12px; +} + +.window-area-card { + border: 1px solid #e8e8e8; + border-radius: 4px; + padding: 10px; +} + +.window-area-title { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 8px; +} + +.window-area-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 8px 12px; + margin-bottom: 8px; +} + +.window-area-grid .field-row { + flex-direction: column; + align-items: flex-start; + gap: 4px; +} + +.window-area-grid input[type="text"], +.window-area-grid input[type="number"] { + width: 100%; + padding: 6px 8px; + border: 1px solid #c8c8c8; +} + +.window-areas-layer { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + pointer-events: none; +} + +.window-area { + position: absolute; + overflow: hidden; + background: #000; + border: none; +} + +.window-area-inner { + display: flex; +} + +.window-no-region { + flex: 1; + display: flex; + align-items: center; + justify-content: center; + border-right: none; + background: #000; +} + +.window-no-text.circle { + width: 2.2em; + height: 2.2em; + border: 1px solid currentColor; + border-radius: 50%; + display: inline-flex; + align-items: center; + justify-content: center; +} + +.window-text-region { + flex: 2.5; + display: flex; + flex-direction: column; + background: #000; +} + +.window-text-line { + flex: 1; + display: flex; + align-items: center; + justify-content: center; + text-align: center; +} diff --git a/broadcast-client/src/utils/timing.ts b/broadcast-client/src/utils/timing.ts new file mode 100644 index 0000000..7960d4e --- /dev/null +++ b/broadcast-client/src/utils/timing.ts @@ -0,0 +1,60 @@ +/** + * 创建一个异步防抖任务: + * - 高频触发只执行最后一次; + * - 任务执行中若再次触发,会在结束后补跑一次。 + */ +export function createDebouncedAsyncTask(task: () => Promise, delayMs: number) { + let timer: number | null = null; + let running = false; + let queued = false; + + /** + * 真正执行任务,确保不会并发重入。 + */ + async function runTask() { + if (running) { + queued = true; + return; + } + + running = true; + try { + await task(); + } finally { + running = false; + if (queued) { + queued = false; + await runTask(); + } + } + } + + /** + * 触发防抖任务。 + */ + function trigger() { + if (timer !== null) { + window.clearTimeout(timer); + } + + timer = window.setTimeout(() => { + timer = null; + void runTask(); + }, delayMs); + } + + /** + * 取消尚未触发的计时器。 + */ + function cancel() { + if (timer !== null) { + window.clearTimeout(timer); + timer = null; + } + } + + return { + trigger, + cancel, + }; +} diff --git a/broadcast-client/src/views/BroadcastView.vue b/broadcast-client/src/views/BroadcastView.vue new file mode 100644 index 0000000..66302fb --- /dev/null +++ b/broadcast-client/src/views/BroadcastView.vue @@ -0,0 +1,106 @@ + + + diff --git a/broadcast-client/src/views/ConfigView.vue b/broadcast-client/src/views/ConfigView.vue new file mode 100644 index 0000000..2c1f533 --- /dev/null +++ b/broadcast-client/src/views/ConfigView.vue @@ -0,0 +1,477 @@ + + + diff --git a/broadcast-client/tsconfig.json b/broadcast-client/tsconfig.json new file mode 100644 index 0000000..3d7f544 --- /dev/null +++ b/broadcast-client/tsconfig.json @@ -0,0 +1,21 @@ +{ + "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": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/broadcast-client/tsconfig.node.json b/broadcast-client/tsconfig.node.json new file mode 100644 index 0000000..42872c5 --- /dev/null +++ b/broadcast-client/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/broadcast-client/vite.config.ts b/broadcast-client/vite.config.ts new file mode 100644 index 0000000..9284281 --- /dev/null +++ b/broadcast-client/vite.config.ts @@ -0,0 +1,25 @@ +import { defineConfig } from "vite"; +import vue from "@vitejs/plugin-vue"; + +// @ts-expect-error process is a Node.js global +const host = process.env.TAURI_DEV_HOST; + +export default defineConfig(() => ({ + plugins: [vue()], + clearScreen: false, + server: { + port: 1420, + strictPort: true, + host: host || false, + hmr: host + ? { + protocol: "ws", + host, + port: 1421, + } + : undefined, + watch: { + ignored: ["**/src-tauri/**"], + }, + }, +})); diff --git a/broadcast-client/广播系统需求文档.md b/broadcast-client/广播系统需求文档.md new file mode 100644 index 0000000..2866cb9 --- /dev/null +++ b/broadcast-client/广播系统需求文档.md @@ -0,0 +1,40 @@ +广播系统需求文档 + +1. 系统概述 + 开发一个基于Tauri v2框架的同步屏应用程序,用于显示可滚动的标尺刻度界面。 +2. 技术栈 + 框架:Tauri v2 + 前端:HTML/CSS/JavaScript、vue3 +3. 功能需求 + 3.1 窗口管理 + 窗口类型:无边框窗口 + 初始位置:窗口左上角固定在屏幕左上角坐标(0,0) + 窗口行为:程序启动时自动打开 + 3.2 主要显示区域 + 主容器:高64px,宽5000px的div元素 + 显示逻辑: + 当屏幕宽度小于5000px时(例如1080px),需要将主div按屏幕高度分段显示 + 分段规则:每个分段高度为64px,宽度等于屏幕宽度 + 分段位置: + 第一段:位置(0, 0),尺寸1080px × 64px + 第二段:位置(0, 64),尺寸1080px × 64px + 第三段:位置(0, 128),尺寸1080px × 64px + 依此类推,直到完整显示整个5000px宽度的内容 + 3.3 标尺刻度显示 + 大格:每100px一个大刻度标记 + 小格:每10px一个小刻度标记 + 显示范围:覆盖整个5000px宽度区域 + 3.4 子元素处理 + 子div支持:主div内可包含子div元素 + 切断处理:当子div位于分段切断位置时,同样需要进行切断显示 + 渲染一致性:确保子元素在各分段中的显示保持视觉连续性 +4. 非功能需求 + 性能要求:流畅渲染5000px宽度的标尺内容 + 兼容性:适配不同屏幕分辨率 + 用户体验:无边框设计,精确的刻度显示 +5. 验收标准 + 程序启动时创建无边框窗口并定位到屏幕左上角 + 正确显示5000px × 64px的主div内容 + 读取主屏幕的宽度并正确分段显示(每段64px高度) + 标尺刻度按100px大格、10px小格准确显示 + 子div在切断处正确处理显示 diff --git a/broadcast-client/技术方案.md b/broadcast-client/技术方案.md new file mode 100644 index 0000000..5c2f196 --- /dev/null +++ b/broadcast-client/技术方案.md @@ -0,0 +1,182 @@ +# 广播系统技术方案 + +## 1. 文档目的 + +基于《广播系统需求文档》,输出可直接指导开发与联调的技术落地方案,覆盖: +- Tauri v2 窗口与生命周期实现 +- 5000px 标尺分段渲染策略 +- 子元素切段一致性处理 +- 性能、兼容性与验收测试方案 + +## 2. 目标与范围 + +### 2.1 目标 +- 程序启动后自动创建无边框窗口,并固定在 `(0, 0)`。 +- 在任意屏幕宽度下,正确展示宽 `5000px`、高 `64px` 的标尺内容。 +- 当屏幕宽度小于 `5000px` 时,按“横向切片、纵向堆叠”方式渲染。 +- 标尺满足 `10px` 小格、`100px` 大格。 +- 主容器内子元素在切断位置保持视觉连续。 + +### 2.2 范围 +- **包含**:桌面端单窗口显示、标尺渲染、分段映射、子元素切段、基础性能优化。 +- **不包含**:网络同步、多用户协作、云端配置、复杂拖拽编辑器。 + +## 3. 技术选型 + +- 桌面容器:`Tauri v2` +- 前端框架:`Vue 3` + `TypeScript` +- 构建工具:`Vite` +- 样式:`CSS`(必要时搭配 CSS 变量) +- 渲染策略:DOM + CSS(优先),保留 Canvas 升级路径 + +选择理由: +- Tauri 体积小、启动快,适合常驻轻量显示工具。 +- Vue 3 组件化能力可清晰拆分“窗口层 / 标尺层 / 分段层”。 +- 5000px*64px 属于中低复杂度场景,DOM 足以支撑且便于调试与维护。 + +## 4. 核心实现方案 + +## 4.1 窗口管理实现 + +在 Tauri v2 配置中设置: +- 无边框:`decorations: false` +- 启动即显示:默认窗口自动创建 +- 初始位置:`x: 0, y: 0` +- 可选增强:置顶 `alwaysOnTop`(按产品决策开关) + +建议窗口配置(示意): +- 初始宽度:屏幕宽度(或合理默认值) +- 初始高度:由分段数量计算(见 4.2) + +## 4.2 分段显示算法 + +定义: +- `TOTAL_WIDTH = 5000` +- `SEGMENT_HEIGHT = 64` +- `screenWidth = 当前主屏宽度` +- `segmentCount = ceil(TOTAL_WIDTH / screenWidth)` + +每段 `i`(从 `0` 开始)映射: +- 源区域横向起点:`sourceX = i * screenWidth` +- 当前段有效宽度:`sliceWidth = min(screenWidth, TOTAL_WIDTH - sourceX)` +- 目标位置:`x = 0, y = i * SEGMENT_HEIGHT` +- 目标尺寸:`sliceWidth x SEGMENT_HEIGHT` + +渲染方式: +- 外层容器高度:`segmentCount * 64px` +- 每一段都渲染同一条“5000px 虚拟标尺”,但通过 `transform: translateX(-sourceX)` 显示对应片段 +- 段容器设置 `overflow: hidden`,实现“切片窗口”效果 + +## 4.3 标尺刻度绘制策略 + +总宽范围 `[0, 5000)`: +- 每 `10px` 一个小刻度 +- 每 `100px` 一个大刻度(并可带数值标签) + +实现建议: +- 通过循环生成刻度数据结构,交由 Vue 渲染 +- 大刻度与小刻度使用不同高度和样式类 +- 统一使用绝对定位,避免复杂流式布局导致抖动 + +数据模型示例: +- `ticks: Array<{ x: number; type: "minor" | "major"; label?: string }>` + +## 4.4 子元素切断与连续性 + +子元素抽象: +- `child = { id, left, width, top, height, style }` + +对第 `i` 段,子元素可见区间计算: +- `segmentStart = i * screenWidth` +- `segmentEnd = segmentStart + screenWidth` +- `childStart = child.left` +- `childEnd = child.left + child.width` +- 相交宽度:`visibleWidth = max(0, min(childEnd, segmentEnd) - max(childStart, segmentStart))` + +若 `visibleWidth > 0`,则在该段渲染一个“切片子元素”: +- 本段左偏移:`renderLeft = max(childStart, segmentStart) - segmentStart` +- 源内容偏移:`clipOffset = max(0, segmentStart - childStart)` + +连续性保证: +- 同一子元素跨段时复用同一视觉样式与层级 +- 文本类子元素建议使用 `white-space: nowrap` 并通过裁剪窗口显示,避免换行错位 + +## 4.5 分辨率适配 + +- 启动时读取主屏宽度 +- 监听窗口尺寸变化(可选) +- 变化后重新计算 `segmentCount` 与各段 `sourceX` +- 对高 DPI 环境,使用 CSS 像素布局,必要时读取缩放比做微调 + +## 5. 性能优化策略 + +- 刻度数据缓存:`ticks` 在 `TOTAL_WIDTH` 不变时仅初始化一次 +- 分段列表缓存:仅在屏宽变化时重算 +- 避免深层响应式:大数组使用浅响应或只读数据 +- 降低重排:段内使用绝对定位,减少文档流参与 +- 控制重绘:样式变化优先 `transform` / `opacity` + +目标性能指标: +- 冷启动到首屏可见 < 1.5s(常规办公设备) +- resize 重算后 100ms 内完成主要布局更新 +- 无明显掉帧和视觉撕裂 + +## 6. 错误处理与边界条件 + +- `screenWidth <= 0`:回退默认宽度(如 1920) +- 极窄屏幕(如 800):保证 `segmentCount` 正确增长 +- 最后一段不足整宽:必须按 `sliceWidth` 渲染,禁止越界 +- 子元素超出 `[0, 5000]`:按相交逻辑自动裁剪 + +## 7. 开发实施计划 + +### 阶段 1:工程初始化 +- 初始化 Tauri v2 + Vue3 + TS 项目 +- 完成基础窗口配置(无边框、坐标) + +### 阶段 2:核心渲染 +- 实现标尺刻度生成 +- 实现分段容器与映射逻辑 +- 验证不同屏宽下显示正确 + +### 阶段 3:子元素切段 +- 定义子元素数据结构 +- 完成相交裁剪与跨段显示 +- 增加典型跨段用例 + +### 阶段 4:优化与验收 +- 性能优化与边界处理 +- 执行验收用例并修复问题 + +## 8. 测试与验收方案 + +对照需求验收项设计测试用例: +- 启动后窗口:无边框、位于 `(0, 0)` +- 主容器:逻辑宽 `5000px`、高 `64px` +- 分段:`segmentCount = ceil(5000 / screenWidth)`,每段高度 `64px` +- 刻度:`10px` 小格、`100px` 大格位置准确 +- 子元素:跨段后位置连续、无错位/跳变 + +建议增加自动化: +- 单元测试:分段计算函数、子元素相交函数 +- 组件测试:段渲染快照 +- 手工测试:多分辨率与 DPI 场景 + +## 9. 风险与应对 + +- 风险:高 DPI 下 1px 线条发虚 + 应对:使用整数像素对齐与样式微调。 + +- 风险:窗口尺寸变化频繁触发抖动 + 应对:对 resize 处理加入节流(如 100ms)。 + +- 风险:后续需求扩展(动画、动态数据)导致 DOM 压力上升 + 应对:预留 Canvas 渲染替换层接口。 + +## 10. 交付物 + +- 可运行的 Tauri 广播客户端 +- 本技术方案文档 +- 软件架构文档 +- 基础测试用例与验收记录 + diff --git a/broadcast-client/更新需求.md b/broadcast-client/更新需求.md new file mode 100644 index 0000000..0d23bf0 --- /dev/null +++ b/broadcast-client/更新需求.md @@ -0,0 +1,55 @@ +#更新需求 + +##1.第一阶段更新需求 +1.1. 修改:同步屏窗口不要使用圆角,底色使用黑色#000,同步屏窗口置顶显示。 +1.2. 添加:使用tauri::menu API 创建菜单项,右键点击同步屏窗口,弹出该菜单,菜单项有:配置同步屏窗口、退出。点击配置同步屏窗口,弹出一个窗口。点击退出,退出应用。 + +##2.第二阶段更新需求 +2.1. 添加:配置文件使用XGD规则保存到本地,使用@tauri-apps/plugin-store读写配置文件,使配置参数在应用整个生命周期内中可以随时读写。 +2.2. 在配置窗口添加如下配置项: + +- 同步屏中主div的总长度(默认800px),高度(默认64px) +- 主div切割后分成几段,每段的长度、每段左顶点的起始坐标 +- 标尺是否显示 + + 2.3. 在2.2中的配置项使用2.1的配置文件保存,并在应用启动时读取并应用配置文件且实时更新同步屏窗口。 + +##3.第二阶段更新问题修复 +3.1. 配置项窗口不是无边框窗口,可拖动,背景为白色#fff +3.2. 配置项窗口没有保存配置的按钮,点击保存配置后再写入配置文件。 +3.3. 主div切割分成几段需要使用添加按钮手动来添加,并且每段的参数需要可以修改,可以通过列表来展示修改的段,并修改参数。 +3.4. 同步屏窗口的长度不要超过主屏幕分辨的宽度。 + +##4.第三阶段更新需求 +4.1. 修改:去除子元素跨段切片行为验证,去除验证代码,保留功能 +4.2. 添加:配置项窗口加入添加子div(窗口区域)功能,可以设置窗口区域的宽度、高度、左顶点起始坐标。 +4.3. 添加:窗口区域中包含两个子区域:窗口号区域、文本区域,子区域横向排列,在窗口区域中显示占比为1:2.5。 +4.4. 添加:窗口号区域显示窗口编号,文本水平垂直居中显示,可设置文本是否带圆圈边框,文字大小、颜色、粗细。 +4.5. 添加:文本区域包两个字区域:静态文本区域、动态文本区域,两个文本区域纵向排列,在文本区域中显示占比为1:1,两个区域中的文字水平垂直居中显示,可设置文字大小、颜色、粗细。 +4.6. 有需要的话,可以引入前端UI框架来优化配置窗口界面。 + +##5.第三阶段更新问题修复 +5.1. 配置了3个窗口区域,只有第一个分段显示了窗口区域,第2个窗口区域没有跨段显示,第3个窗口区域没有显示在第二个分段上。 +5.2. 窗口区域及其子区域去除边框,背景使用黑色。 +5.3. 配置窗口每个大配置项做成折叠面板,每个面板和窗口背景色的色差调大一些。 + +##6.第四阶段更新需求 +6.1. 添加:在保存配置旁边添加一个按钮,点击按钮启动socket服务,并监听9501端口,并用红绿灯方式展示socket服务状态。 +6.2. 添加:根据socket消息内容,动态修改窗口区域中动态文本区域的内容。收到的消息报文如下: +{ +"action": "CALL", +"windowId": 1, +"windowName": "A12窗口", +"ledAddress": "192.168.1.100", +"timestamp": 1712567890000, +"payload": { +"ticketNumber": "A001", + "displayText": "请 A001 号办理", + "voiceText": "请 A001 号到 A12 窗口办理", + "flash": true + } +} +其中windowId代表窗口区域的编号,displayText代表动态文本区域所要展示的内容。 + +##7.第五阶段更新需求 +7.1. 添加:日志模块,用于记录socket服务启动、停止、消息接收、消息处理等操作。日志文件使用XGD规则保存到本地 diff --git a/broadcast-client/软件架构文档.md b/broadcast-client/软件架构文档.md new file mode 100644 index 0000000..49a5407 --- /dev/null +++ b/broadcast-client/软件架构文档.md @@ -0,0 +1,220 @@ +# 广播系统软件架构文档 + +## 1. 架构目标 + +构建一个基于 Tauri v2 的桌面广播显示系统,满足以下架构目标: +- 支持固定窗口行为(无边框、左上角定位、启动即开) +- 支持 5000px 标尺在任意屏宽下的稳定分段显示 +- 支持子元素跨段连续渲染 +- 保持模块边界清晰,便于后续扩展(动态数据、渲染升级) + +## 2. 总体架构 + +采用“宿主层 + 前端应用层 + 渲染域层”的分层结构: + +- 宿主层(Tauri Runtime) + - 负责窗口生命周期、屏幕信息读取、系统能力接入 +- 前端应用层(Vue Application) + - 负责状态管理、分段计算、组件编排 +- 渲染域层(Ruler Rendering Domain) + - 负责刻度绘制、切片映射、子元素裁剪与连续性 + +架构原则: +- 计算与渲染分离:算法在 `composables/services`,界面在 `components/views` +- 数据驱动:通过状态变化触发渲染,不在组件中写复杂业务判断 +- 可替换渲染:先 DOM,后续可平滑迁移到 Canvas + +## 3. 逻辑视图(模块划分) + +建议目录结构: + +```text +broadcast-client/ + src/ + main.ts + App.vue + views/ + BroadcastView.vue + components/ + RulerCanvas.vue + RulerSegment.vue + RulerTicks.vue + SegmentChildren.vue + composables/ + useScreenInfo.ts + useSegmentLayout.ts + useRulerTicks.ts + services/ + segmentService.ts + childSliceService.ts + models/ + ruler.ts + segment.ts + child.ts + utils/ + math.ts + src-tauri/ + tauri.conf.json + src/ + lib.rs +``` + +模块职责: +- `useScreenInfo`:读取并维护当前主屏宽度、DPI 信息 +- `segmentService`:计算段数量、每段映射关系 +- `useRulerTicks`:生成 10/100 刻度数据 +- `childSliceService`:计算子元素在每段的可见切片 +- `RulerSegment`:单段渲染容器(裁剪窗口) +- `SegmentChildren`:渲染跨段子元素切片 + +## 4. 关键数据模型 + +```ts +type TickType = "minor" | "major"; + +interface Tick { + x: number; + type: TickType; + label?: string; +} + +interface Segment { + index: number; + sourceX: number; + sliceWidth: number; + top: number; + height: number; // 固定 64 +} + +interface ChildElement { + id: string; + left: number; + width: number; + top: number; + height: number; + zIndex?: number; + className?: string; +} + +interface ChildSlice { + childId: string; + segmentIndex: number; + renderLeft: number; + renderTop: number; + renderWidth: number; + renderHeight: number; + clipOffset: number; +} +``` + +设计说明: +- `Segment` 只描述“段映射”,不关心具体 UI。 +- `ChildSlice` 是“子元素在某段中的投影结果”,用于直接渲染。 +- 所有坐标统一使用同一逻辑坐标系(以 5000px 主轴为基准)。 + +## 5. 运行时流程(时序) + +启动流程: +1. Tauri 启动并创建窗口(无边框,位置 `(0,0)`)。 +2. 前端初始化,读取屏幕宽度 `screenWidth`。 +3. 计算 `segments = ceil(5000 / screenWidth)`。 +4. 生成刻度数据 `ticks`,构建段列表 `segmentList`。 +5. 渲染每段:段容器裁剪 + 虚拟标尺偏移显示。 +6. 若存在子元素,计算 `ChildSlice[]` 并叠加渲染。 + +更新流程(屏宽变化): +1. 监听窗口尺寸/屏幕变化事件。 +2. 重新计算 `segmentList` 与 `ChildSlice[]`。 +3. 增量更新视图(避免全量销毁重建)。 + +## 6. 关键算法设计 + +### 6.1 分段算法 + +- 输入:`TOTAL_WIDTH=5000`, `screenWidth`, `SEGMENT_HEIGHT=64` +- 输出:`Segment[]` +- 复杂度:`O(n)`,`n = segmentCount` + +核心规则: +- `segmentCount = ceil(5000 / screenWidth)` +- 每段 `sourceX = i * screenWidth` +- `sliceWidth = min(screenWidth, 5000 - sourceX)` + +### 6.2 子元素切片算法 + +- 输入:`ChildElement[]`, `Segment[]` +- 输出:`ChildSlice[]` +- 复杂度:`O(m * n)`(可按区间优化) + +相交判定: +- 仅当子元素区间与段区间重叠时生成切片 +- 切片宽度为区间交集长度 +- 渲染左偏移为交集起点相对段起点 + +## 7. 部署视图 + +单机本地部署: +- 可执行文件(Tauri 打包产物) +- 前端静态资源内嵌 +- 无外部服务依赖 + +跨平台建议: +- Windows 为主目标平台 +- 后续可扩展到 Linux/macOS(保持 API 使用跨平台) + +## 8. 非功能架构设计 + +### 8.1 性能 +- 预计算与缓存刻度数据 +- 分段与切片计算函数纯函数化,便于 memoization +- 控制组件重渲染范围(按段粒度更新) + +### 8.2 可维护性 +- 算法层独立文件,配套单元测试 +- 组件职责单一,避免“巨型组件” +- 使用 TypeScript 类型约束输入输出 + +### 8.3 兼容性 +- 适配不同分辨率,屏宽变化自动重算 +- 高 DPI 场景下进行像素对齐优化 + +## 9. 异常与容错架构 + +- 屏幕宽度读取失败:降级默认值(如 1920) +- 输入数据异常(负宽度、越界坐标):统一在 service 层校正/裁剪 +- 渲染失败保护:关键计算异常时记录日志并回退最小可用视图 + +## 10. 安全与边界 + +当前系统以本地渲染为主,安全关注点较轻,建议: +- 最小化 Tauri 权限配置 +- 不暴露不必要的系统 API +- 对未来外部输入(若接入)进行 schema 校验 + +## 11. 测试架构 + +测试分层: +- 单元测试:`segmentService`、`childSliceService` +- 组件测试:`RulerSegment`、`SegmentChildren` +- 集成测试:启动后窗口行为与全链路渲染 + +关键断言: +- 分段数量与位置正确 +- 末段宽度裁剪正确 +- 子元素跨段连续且无视觉跳变 +- 大小刻度在每段中对齐正确 + +## 12. 可扩展路线 + +- 渲染升级:DOM -> Canvas/WebGL +- 数据升级:静态子元素 -> 实时广播内容流 +- 交互升级:缩放、定位、标记线、主题切换 +- 多屏支持:副屏渲染与窗口同步控制 + +## 13. 架构决策记录(ADR 简版) + +- ADR-001:采用 Tauri v2 作为宿主框架(轻量、跨平台) +- ADR-002:采用 Vue3 + TS 作为前端基础(可维护、类型安全) +- ADR-003:先采用 DOM 裁剪方案(交付快、调试友好),保留 Canvas 替换能力 +- ADR-004:分段按屏宽计算并纵向堆叠(严格满足需求中的显示规则) + diff --git a/broadcast-client/阶段4验收记录.md b/broadcast-client/阶段4验收记录.md new file mode 100644 index 0000000..294c00d --- /dev/null +++ b/broadcast-client/阶段4验收记录.md @@ -0,0 +1,33 @@ +# 阶段4验收记录 + +## 1. 验收范围 + +- 性能优化:窗口 `resize` 事件处理节流/防抖 +- 边界处理:屏宽异常值回退、末段裁剪 +- 测试补齐:分段算法、子元素切片、刻度生成 + +## 2. 验收项对照 + +- [x] 启动后窗口可定位到 `(0, 0)`,并根据分段数量同步高度 +- [x] 分段计算满足 `segmentCount = ceil(5000 / screenWidth)` +- [x] 最后一段宽度按剩余值裁剪,不越界 +- [x] 子元素跨段切片显示连续,无丢失 +- [x] 刻度覆盖 `0-5000`,小格 `10px`,大格 `100px` +- [x] resize 高频触发时,布局刷新使用 100ms 防抖,避免抖动 + +## 3. 自动化测试清单 + +- `src/services/segmentService.test.ts` +- `src/services/childSliceService.test.ts` +- `src/services/tickService.test.ts` + +## 4. 执行命令 + +- `npm run test:run` +- `npm run build` + +## 5. 结果 + +- 单元测试:通过 +- 构建检查:通过 +- 当前阶段结论:阶段4完成,可进入联调与发布准备 diff --git a/call-client/.gitignore b/call-client/.gitignore index a547bf3..4655360 100644 --- a/call-client/.gitignore +++ b/call-client/.gitignore @@ -14,6 +14,7 @@ dist-ssr # Editor directories and files .vscode/* +src-tauri/target/* !.vscode/extensions.json .idea .DS_Store diff --git a/call-client/src/host/dialog.ts b/call-client/src/host/dialog.ts index 5a38084..cc404f0 100644 --- a/call-client/src/host/dialog.ts +++ b/call-client/src/host/dialog.ts @@ -1,4 +1,4 @@ -import { confirm } from "@tauri-apps/plugin-dialog"; +import { confirm, message } from "@tauri-apps/plugin-dialog"; import type { NativeConfirmOptions } from "./types"; /** @@ -15,3 +15,14 @@ export async function confirmNative(options: NativeConfirmOptions): Promise { + try { + await message(content, { title, kind: "error" }); + } catch (error) { + throw new Error(`打开错误提示框失败: ${String(error)}`); + } +} diff --git a/call-client/src/utils/service.ts b/call-client/src/utils/service.ts index ad951bb..16431c0 100644 --- a/call-client/src/utils/service.ts +++ b/call-client/src/utils/service.ts @@ -1,5 +1,5 @@ import axios, { type AxiosRequestConfig, type AxiosResponse } from "axios"; -import { ElMessage } from "element-plus"; +import { showErrorNative } from "../host/dialog"; import { getSession } from "../host/session"; import type { SessionState } from "../host/types"; @@ -78,10 +78,10 @@ instance.interceptors.response.use( (response: AxiosResponse) => { const { data } = response; if (data.code !== 200) { - ElMessage.error(data.message || "请求失败"); + void showErrorNative(data.message || "请求失败"); if (data.code === 401) { - ElMessage.error("请求 token 过期,请重新登录"); + void showErrorNative("请求 token 过期,请重新登录"); } throw new Error(data.message || "请求失败"); @@ -93,33 +93,33 @@ instance.interceptors.response.use( if (error.response) { switch (error.response.status) { case 400: - ElMessage.error("请求错误"); + await showErrorNative("请求错误"); break; case 401: - ElMessage.error("未授权,请重新登录"); + await showErrorNative("未授权,请重新登录"); break; case 403: - ElMessage.error("拒绝访问"); + await showErrorNative("拒绝访问"); break; case 404: - ElMessage.error("请求地址不存在"); + await showErrorNative("请求地址不存在"); break; case 500: - ElMessage.error("服务器内部错误"); + await showErrorNative("服务器内部错误"); break; case 502: - ElMessage.error("网关错误"); + await showErrorNative("网关错误"); break; case 503: - ElMessage.error("服务不可用"); + await showErrorNative("服务不可用"); break; default: - ElMessage.error("请求失败"); + await showErrorNative("请求失败"); } } else if (error.request) { - ElMessage.error("网络连接异常"); + await showErrorNative("网络连接异常"); } else { - ElMessage.error(error.message); + await showErrorNative(error.message); } throw error; diff --git a/call-client/src/views/MainView.vue b/call-client/src/views/MainView.vue index 3607192..edf3118 100644 --- a/call-client/src/views/MainView.vue +++ b/call-client/src/views/MainView.vue @@ -11,10 +11,12 @@ import { } from "@element-plus/icons-vue"; import { LogicalPosition } from "@tauri-apps/api/dpi"; import { Menu } from "@tauri-apps/api/menu"; +import { getCurrentWindow } from "@tauri-apps/api/window"; import { ElMessage } from "element-plus"; import { computed, onMounted, onUnmounted, ref, watch } from "vue"; import { api } from "../api"; import { confirmNative } from "../host/dialog"; +import { showErrorNative } from "../host/dialog"; import { listenMainAction } from "../host/events"; import { log } from "../host/logger"; import { getSession } from "../host/session"; @@ -52,12 +54,14 @@ let evaluatingCountdownTimer: ReturnType | null = null; let isRankPollingTimer: ReturnType | null = null; let isRankPollingBusy = false; let queueCountPollingTimer: ReturnType | null = null; +let unlistenWindowFocusChanged: (() => void) | null = null; let unlistenMainAction: (() => void) | null = null; let moreNativeMenuPromise: Promise | null = null; let pauseNativeMenuPromise: Promise | null = null; const EVALUATING_COUNTDOWN_SEC = 15; const pauseReasonOptions = ["午休", "休息一下", "整理资料", "其他"]; +const isMainWindowActive = ref(false); function getMoreNativeMenu(): Promise { if (moreNativeMenuPromise === null) { @@ -309,13 +313,13 @@ function startQueueCountPolling(): void { watch( callStatus, (status) => { - if (status === "evaluating") { + if (status === "evaluating" && isMainWindowActive.value) { startIsRankPolling(); } else { clearIsRankPolling(); } - if (status === "idle") { + if (status === "idle" && isMainWindowActive.value) { startQueueCountPolling(); } else { clearQueueCountPolling(); @@ -324,6 +328,24 @@ watch( { immediate: true }, ); +watch(isMainWindowActive, (active) => { + if (callStatus.value === "idle") { + if (active) { + startQueueCountPolling(); + } else { + clearQueueCountPolling(); + } + } + + if (callStatus.value === "evaluating") { + if (active) { + startIsRankPolling(); + } else { + clearIsRankPolling(); + } + } +}); + const buttons = computed(() => { const startOrComplete = callStatus.value === "working" @@ -625,7 +647,7 @@ async function openMoreContextMenu(event: MouseEvent): Promise { await menu.popup(position); } catch (error) { await logErr("更多菜单 popup 失败", error); - ElMessage.error("更多菜单弹出失败,请查看日志"); + await showErrorNative("更多菜单弹出失败,请查看日志"); } } @@ -642,7 +664,7 @@ async function openPauseContextMenu(): Promise { await menu.popup(new LogicalPosition(rect.left, rect.bottom + 8)); } catch (error) { await logErr("暂停菜单 popup 失败", error); - ElMessage.error("暂停菜单弹出失败,请查看日志"); + await showErrorNative("暂停菜单弹出失败,请查看日志"); } } @@ -679,7 +701,7 @@ async function handleMoreCommand(command: "main" | "ticketList" | "logout"): Pro await quitApplication(); } catch (error) { await logErr(`更多菜单处理失败: ${command}`, error); - ElMessage.error("操作失败,请查看日志"); + await showErrorNative("操作失败,请查看日志"); updateLog(`操作失败: ${command}`); } } @@ -699,6 +721,16 @@ onMounted(async () => { await logErr("读取 session 失败", error); } + try { + const currentWindow = getCurrentWindow(); + isMainWindowActive.value = await currentWindow.isVisible(); + unlistenWindowFocusChanged = await currentWindow.onFocusChanged(({ payload }) => { + isMainWindowActive.value = payload; + }); + } catch (error) { + await logErr("订阅主窗口焦点事件失败", error); + } + unlistenMainAction = await listenMainAction((action, payload) => { if (typeof payload?.ticketUid === "number" && payload.ticketUid > 0) { callingTkt.value = payload.ticketUid; @@ -718,6 +750,9 @@ onUnmounted(() => { clearEvaluatingCountdown(); clearIsRankPolling(); clearQueueCountPolling(); + if (unlistenWindowFocusChanged) { + unlistenWindowFocusChanged(); + } if (unlistenMainAction) { unlistenMainAction(); } diff --git a/call-client/src/views/TicketListView.vue b/call-client/src/views/TicketListView.vue index f764431..b8283b8 100644 --- a/call-client/src/views/TicketListView.vue +++ b/call-client/src/views/TicketListView.vue @@ -102,10 +102,12 @@