A photo manager for VRChat.

Compare changes

Choose any two refs to compare.

+2 -1
.gitignore
··· 1 1 node_modules 2 - dist 2 + dist 3 + builds/
+10 -13
README.md
··· 1 1 # VRChat Photo Manager (BETA) 2 2 3 - Install [here](https://cdn.phaz.uk/vrcpm/vrcpm-installer.exe) (Windows) 3 + Windows users: Download the setup.exe file [here](https://github.com/phaze-the-dumb/VRChat-Photo-Manager/releases/latest) 4 + 5 + Linux Users: 6 + - I publish .deb, .rpm and .AppImage files [here](https://github.com/phaze-the-dumb/VRChat-Photo-Manager/releases/latest) 7 + - I also publish an [AUR](https://aur.archlinux.org/packages/vrchat-photo-manager) package 4 8 5 9 ## Feedback / Bug Reports 6 10 ··· 8 12 9 13 Also for bug reports if you can, please try replicating the issue with a debug variant of the app and sending the logs along with your issue 10 14 11 - You can download the debug EXEs using this url format: 12 - 13 - - https://cdn.phaz.uk/vrcpm/builds/debug/vrcpm-[YOUR-APP-VERSION]-debug.exe (Windows) 14 - - https://cdn.phaz.uk/vrcpm/builds/debug/vrcpm-[YOUR-APP-VERSION]-debug (Linux) 15 + You can download the debug EXEs [here](https://github.com/phaze-the-dumb/VRChat-Photo-Manager/releases) 15 16 16 17 You can find your app version under appllication settings. 17 18 18 - (Please note that there are not debug releases for versions: 0.1.0, 0.1.1, 0.1.2, 0.1.3) 19 - 20 19 ## A photo manager for VRChat. 21 20 22 - ![image](https://github.com/phaze-the-dumb/VRChat-Photo-Manager-Rust/assets/57566773/c573e27f-52e6-4608-a8ea-a8a83336fbb9) 21 + <img width="1352" height="739" alt="image" src="https://github.com/user-attachments/assets/bc702ee6-8891-463d-a987-c2db1dc24678" /> 23 22 24 - Files with VRCX metadata: 23 + Files with VRCX metadata + Fetches world information from VRChat: 25 24 26 - ![image](https://github.com/phaze-the-dumb/VRChat-Photo-Manager-Rust/assets/57566773/06f44b67-083f-487e-b8b4-84c87d07604f) 27 - 28 - Fetches world information from VRChat: 25 + <img width="1352" height="739" alt="image" src="https://github.com/user-attachments/assets/aae88c53-aab6-4520-bb89-d6f2bca1c51a" /> 29 26 30 27 Searching for photos taken in specific worlds / with specific users: 31 28 32 - ![image](https://github.com/user-attachments/assets/ea67c4ef-c7e8-4f93-a29a-74aff5f35903) 29 + <img width="1352" height="739" alt="image" src="https://github.com/user-attachments/assets/f9af1724-5bb2-4276-bc32-e818dab31750" />
+24
build-release.sh
··· 1 + #!/bin/bash 2 + 3 + VERSION=0.2.7-hot1 4 + 5 + # Linux builds 6 + NO_STRIP=true pnpm tauri build 7 + 8 + # Windows builds 9 + pnpm tauri build --runner cargo-xwin --target x86_64-pc-windows-msvc 10 + pnpm tauri build --debug --runner cargo-xwin --target x86_64-pc-windows-msvc 11 + 12 + # Move Files 13 + 14 + mkdir builds 15 + mkdir builds/$VERSION 16 + 17 + mv "src-tauri/target/release/bundle/appimage/VRChat Photo Manager_0.0.1_amd64.AppImage" builds/$VERSION/vrcpm-$VERSION.AppImage 18 + mv "src-tauri/target/release/bundle/deb/VRChat Photo Manager_0.0.1_amd64.deb" builds/$VERSION/vrcpm-$VERSION.deb 19 + mv "src-tauri/target/release/bundle/rpm/VRChat Photo Manager-0.0.1-1.x86_64.rpm" builds/$VERSION/vrcpm-$VERSION.rpm 20 + 21 + mv src-tauri/target/x86_64-pc-windows-msvc/release/VRChatPhotoManager.exe builds/$VERSION/vrcpm-$VERSION.exe 22 + mv src-tauri/target/x86_64-pc-windows-msvc/debug/VRChatPhotoManager.exe builds/$VERSION/vrcpm-$VERSION-debug.exe 23 + 24 + mv "src-tauri/target/x86_64-pc-windows-msvc/release/bundle/nsis/VRChat Photo Manager_0.0.1_x64-setup.exe" builds/$VERSION/vrcpm-$VERSION-setup.exe
+42 -1
changelog
··· 89 89 - Fixed render being called multiple times per frame when using webkitgtk 90 90 91 91 Dev Stuff: 92 - - Implemented a view transition handler, should help with transitions when the app is scaled 92 + - Implemented a view transition handler, should help with transitions when the app is scaled 93 + 94 + v0.2.5: 95 + - Fixed the "Start with windows" button appearing on linux 96 + - Fixed linux tray icon title 97 + - Fixed build-release.sh script outputting the wrong names for windows builds 98 + - Fixed clipboard on linux ( and sped it up on windows ) 99 + - Fixed some icons not fading out when moving to the settings menu 100 + - Removed the auto updater 101 + - Removed account login stuff 102 + - Fixed app name on windows 103 + - Update styles 104 + - Fixed filters removing photos without metadata 105 + 106 + v0.2.6: 107 + - Fixed photos not being loaded if they're too low resolution 108 + - Fixed "Open in folder" not selecting files on linux 109 + - Fixed scroll to top button not animating out 110 + - Fixed scroll to top button being ontop of filters menu 111 + - Fixed photo ordering 112 + - Fixed broken legacy named photos 113 + - Fixed photos being loaded with the wrong resolution 114 + 115 + - Added support for multilayer photos 116 + - Added close to tray toggle 117 + - Added update available prompt 118 + 119 + - Remove all sync stuff 120 + - Removed automatic updates 121 + 122 + Hotfix 1: 123 + - Fixed loading when an image file is corrupted 124 + - Fixed update prompt when not connected to internet 125 + 126 + v0.2.7: 127 + - Fixed image resizing when window is thinner than image 128 + - Fixed closing settings with keybinds 129 + - Fixed the behaviour of changing the photo path 130 + - Fixed loading photos in folders that aren't VRChat folders 131 + 132 + Hotfix 1: 133 + - Fixed resizing images (again)
+12 -12
package.json
··· 12 12 }, 13 13 "license": "MIT", 14 14 "dependencies": { 15 - "@tauri-apps/api": "2.0.0-rc.0", 16 - "@tauri-apps/plugin-deep-link": "^2.4.1", 17 - "@tauri-apps/plugin-http": "2.0.0-rc.1", 18 - "@tauri-apps/plugin-process": "2.0.0-rc.0", 19 - "@tauri-apps/plugin-shell": "2.0.0-rc.0", 20 - "@types/animejs": "^3.1.13", 21 - "animejs": "^3.2.2", 22 - "solid-js": "^1.9.7" 15 + "@tauri-apps/api": "2.9.0", 16 + "@tauri-apps/plugin-deep-link": "^2.4.5", 17 + "@tauri-apps/plugin-http": "2.5.4", 18 + "@tauri-apps/plugin-process": "2.3.1", 19 + "@tauri-apps/plugin-shell": "2.3.3", 20 + "animejs": "^4.2.2", 21 + "solid-js": "^1.9.10" 23 22 }, 24 23 "devDependencies": { 25 - "@tauri-apps/cli": "2.0.0-rc.5", 26 - "typescript": "^5.8.3", 27 - "vite": "^5.4.19", 28 - "vite-plugin-solid": "^2.11.8" 24 + "@tauri-apps/cli": "2.9.3", 25 + "@types/animejs": "^3.1.13", 26 + "typescript": "^5.9.3", 27 + "vite": "^7.2.2", 28 + "vite-plugin-solid": "^2.11.10" 29 29 } 30 30 }
+562 -464
pnpm-lock.yaml
··· 9 9 .: 10 10 dependencies: 11 11 '@tauri-apps/api': 12 - specifier: 2.0.0-rc.0 13 - version: 2.0.0-rc.0 12 + specifier: 2.9.0 13 + version: 2.9.0 14 14 '@tauri-apps/plugin-deep-link': 15 - specifier: ^2.4.1 16 - version: 2.4.1 15 + specifier: ^2.4.5 16 + version: 2.4.5 17 17 '@tauri-apps/plugin-http': 18 - specifier: 2.0.0-rc.1 19 - version: 2.0.0-rc.1 18 + specifier: 2.5.4 19 + version: 2.5.4 20 20 '@tauri-apps/plugin-process': 21 - specifier: 2.0.0-rc.0 22 - version: 2.0.0-rc.0 21 + specifier: 2.3.1 22 + version: 2.3.1 23 23 '@tauri-apps/plugin-shell': 24 - specifier: 2.0.0-rc.0 25 - version: 2.0.0-rc.0 26 - '@types/animejs': 27 - specifier: ^3.1.13 28 - version: 3.1.13 24 + specifier: 2.3.3 25 + version: 2.3.3 29 26 animejs: 30 - specifier: ^3.2.2 31 - version: 3.2.2 27 + specifier: ^4.2.2 28 + version: 4.2.2 32 29 solid-js: 33 - specifier: ^1.9.7 34 - version: 1.9.7 30 + specifier: ^1.9.10 31 + version: 1.9.10 35 32 devDependencies: 36 33 '@tauri-apps/cli': 37 - specifier: 2.0.0-rc.5 38 - version: 2.0.0-rc.5 34 + specifier: 2.9.3 35 + version: 2.9.3 36 + '@types/animejs': 37 + specifier: ^3.1.13 38 + version: 3.1.13 39 39 typescript: 40 - specifier: ^5.8.3 41 - version: 5.8.3 40 + specifier: ^5.9.3 41 + version: 5.9.3 42 42 vite: 43 - specifier: ^5.4.19 44 - version: 5.4.19 43 + specifier: ^7.2.2 44 + version: 7.2.2 45 45 vite-plugin-solid: 46 - specifier: ^2.11.8 47 - version: 2.11.8(solid-js@1.9.7)(vite@5.4.19) 46 + specifier: ^2.11.10 47 + version: 2.11.10(solid-js@1.9.10)(vite@7.2.2) 48 48 49 49 packages: 50 50 51 - '@ampproject/remapping@2.3.0': 52 - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 53 - engines: {node: '>=6.0.0'} 54 - 55 51 '@babel/code-frame@7.27.1': 56 52 resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 57 53 engines: {node: '>=6.9.0'} 58 54 59 - '@babel/compat-data@7.28.0': 60 - resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} 55 + '@babel/compat-data@7.28.5': 56 + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} 61 57 engines: {node: '>=6.9.0'} 62 58 63 - '@babel/core@7.28.0': 64 - resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} 59 + '@babel/core@7.28.5': 60 + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} 65 61 engines: {node: '>=6.9.0'} 66 62 67 - '@babel/generator@7.28.0': 68 - resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} 63 + '@babel/generator@7.28.5': 64 + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} 69 65 engines: {node: '>=6.9.0'} 70 66 71 67 '@babel/helper-compilation-targets@7.27.2': ··· 84 80 resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} 85 81 engines: {node: '>=6.9.0'} 86 82 87 - '@babel/helper-module-transforms@7.27.3': 88 - resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} 83 + '@babel/helper-module-transforms@7.28.3': 84 + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} 89 85 engines: {node: '>=6.9.0'} 90 86 peerDependencies: 91 87 '@babel/core': ^7.0.0 ··· 98 94 resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 99 95 engines: {node: '>=6.9.0'} 100 96 101 - '@babel/helper-validator-identifier@7.27.1': 102 - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 97 + '@babel/helper-validator-identifier@7.28.5': 98 + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} 103 99 engines: {node: '>=6.9.0'} 104 100 105 101 '@babel/helper-validator-option@7.27.1': 106 102 resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} 107 103 engines: {node: '>=6.9.0'} 108 104 109 - '@babel/helpers@7.28.2': 110 - resolution: {integrity: sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==} 105 + '@babel/helpers@7.28.4': 106 + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} 111 107 engines: {node: '>=6.9.0'} 112 108 113 - '@babel/parser@7.28.0': 114 - resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} 109 + '@babel/parser@7.28.5': 110 + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} 115 111 engines: {node: '>=6.0.0'} 116 112 hasBin: true 117 113 ··· 125 121 resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} 126 122 engines: {node: '>=6.9.0'} 127 123 128 - '@babel/traverse@7.28.0': 129 - resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} 124 + '@babel/traverse@7.28.5': 125 + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} 130 126 engines: {node: '>=6.9.0'} 131 127 132 - '@babel/types@7.28.2': 133 - resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} 128 + '@babel/types@7.28.5': 129 + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} 134 130 engines: {node: '>=6.9.0'} 135 131 136 - '@esbuild/aix-ppc64@0.21.5': 137 - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} 138 - engines: {node: '>=12'} 132 + '@esbuild/aix-ppc64@0.25.12': 133 + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} 134 + engines: {node: '>=18'} 139 135 cpu: [ppc64] 140 136 os: [aix] 141 137 142 - '@esbuild/android-arm64@0.21.5': 143 - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} 144 - engines: {node: '>=12'} 138 + '@esbuild/android-arm64@0.25.12': 139 + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} 140 + engines: {node: '>=18'} 145 141 cpu: [arm64] 146 142 os: [android] 147 143 148 - '@esbuild/android-arm@0.21.5': 149 - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} 150 - engines: {node: '>=12'} 144 + '@esbuild/android-arm@0.25.12': 145 + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} 146 + engines: {node: '>=18'} 151 147 cpu: [arm] 152 148 os: [android] 153 149 154 - '@esbuild/android-x64@0.21.5': 155 - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} 156 - engines: {node: '>=12'} 150 + '@esbuild/android-x64@0.25.12': 151 + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} 152 + engines: {node: '>=18'} 157 153 cpu: [x64] 158 154 os: [android] 159 155 160 - '@esbuild/darwin-arm64@0.21.5': 161 - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} 162 - engines: {node: '>=12'} 156 + '@esbuild/darwin-arm64@0.25.12': 157 + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} 158 + engines: {node: '>=18'} 163 159 cpu: [arm64] 164 160 os: [darwin] 165 161 166 - '@esbuild/darwin-x64@0.21.5': 167 - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} 168 - engines: {node: '>=12'} 162 + '@esbuild/darwin-x64@0.25.12': 163 + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} 164 + engines: {node: '>=18'} 169 165 cpu: [x64] 170 166 os: [darwin] 171 167 172 - '@esbuild/freebsd-arm64@0.21.5': 173 - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} 174 - engines: {node: '>=12'} 168 + '@esbuild/freebsd-arm64@0.25.12': 169 + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} 170 + engines: {node: '>=18'} 175 171 cpu: [arm64] 176 172 os: [freebsd] 177 173 178 - '@esbuild/freebsd-x64@0.21.5': 179 - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} 180 - engines: {node: '>=12'} 174 + '@esbuild/freebsd-x64@0.25.12': 175 + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} 176 + engines: {node: '>=18'} 181 177 cpu: [x64] 182 178 os: [freebsd] 183 179 184 - '@esbuild/linux-arm64@0.21.5': 185 - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} 186 - engines: {node: '>=12'} 180 + '@esbuild/linux-arm64@0.25.12': 181 + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} 182 + engines: {node: '>=18'} 187 183 cpu: [arm64] 188 184 os: [linux] 189 185 190 - '@esbuild/linux-arm@0.21.5': 191 - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} 192 - engines: {node: '>=12'} 186 + '@esbuild/linux-arm@0.25.12': 187 + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} 188 + engines: {node: '>=18'} 193 189 cpu: [arm] 194 190 os: [linux] 195 191 196 - '@esbuild/linux-ia32@0.21.5': 197 - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} 198 - engines: {node: '>=12'} 192 + '@esbuild/linux-ia32@0.25.12': 193 + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} 194 + engines: {node: '>=18'} 199 195 cpu: [ia32] 200 196 os: [linux] 201 197 202 - '@esbuild/linux-loong64@0.21.5': 203 - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} 204 - engines: {node: '>=12'} 198 + '@esbuild/linux-loong64@0.25.12': 199 + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} 200 + engines: {node: '>=18'} 205 201 cpu: [loong64] 206 202 os: [linux] 207 203 208 - '@esbuild/linux-mips64el@0.21.5': 209 - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} 210 - engines: {node: '>=12'} 204 + '@esbuild/linux-mips64el@0.25.12': 205 + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} 206 + engines: {node: '>=18'} 211 207 cpu: [mips64el] 212 208 os: [linux] 213 209 214 - '@esbuild/linux-ppc64@0.21.5': 215 - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} 216 - engines: {node: '>=12'} 210 + '@esbuild/linux-ppc64@0.25.12': 211 + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} 212 + engines: {node: '>=18'} 217 213 cpu: [ppc64] 218 214 os: [linux] 219 215 220 - '@esbuild/linux-riscv64@0.21.5': 221 - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} 222 - engines: {node: '>=12'} 216 + '@esbuild/linux-riscv64@0.25.12': 217 + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} 218 + engines: {node: '>=18'} 223 219 cpu: [riscv64] 224 220 os: [linux] 225 221 226 - '@esbuild/linux-s390x@0.21.5': 227 - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} 228 - engines: {node: '>=12'} 222 + '@esbuild/linux-s390x@0.25.12': 223 + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} 224 + engines: {node: '>=18'} 229 225 cpu: [s390x] 230 226 os: [linux] 231 227 232 - '@esbuild/linux-x64@0.21.5': 233 - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} 234 - engines: {node: '>=12'} 228 + '@esbuild/linux-x64@0.25.12': 229 + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} 230 + engines: {node: '>=18'} 235 231 cpu: [x64] 236 232 os: [linux] 237 233 238 - '@esbuild/netbsd-x64@0.21.5': 239 - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} 240 - engines: {node: '>=12'} 234 + '@esbuild/netbsd-arm64@0.25.12': 235 + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} 236 + engines: {node: '>=18'} 237 + cpu: [arm64] 238 + os: [netbsd] 239 + 240 + '@esbuild/netbsd-x64@0.25.12': 241 + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} 242 + engines: {node: '>=18'} 241 243 cpu: [x64] 242 244 os: [netbsd] 243 245 244 - '@esbuild/openbsd-x64@0.21.5': 245 - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} 246 - engines: {node: '>=12'} 246 + '@esbuild/openbsd-arm64@0.25.12': 247 + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} 248 + engines: {node: '>=18'} 249 + cpu: [arm64] 250 + os: [openbsd] 251 + 252 + '@esbuild/openbsd-x64@0.25.12': 253 + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} 254 + engines: {node: '>=18'} 247 255 cpu: [x64] 248 256 os: [openbsd] 249 257 250 - '@esbuild/sunos-x64@0.21.5': 251 - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} 252 - engines: {node: '>=12'} 258 + '@esbuild/openharmony-arm64@0.25.12': 259 + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} 260 + engines: {node: '>=18'} 261 + cpu: [arm64] 262 + os: [openharmony] 263 + 264 + '@esbuild/sunos-x64@0.25.12': 265 + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} 266 + engines: {node: '>=18'} 253 267 cpu: [x64] 254 268 os: [sunos] 255 269 256 - '@esbuild/win32-arm64@0.21.5': 257 - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} 258 - engines: {node: '>=12'} 270 + '@esbuild/win32-arm64@0.25.12': 271 + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} 272 + engines: {node: '>=18'} 259 273 cpu: [arm64] 260 274 os: [win32] 261 275 262 - '@esbuild/win32-ia32@0.21.5': 263 - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} 264 - engines: {node: '>=12'} 276 + '@esbuild/win32-ia32@0.25.12': 277 + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} 278 + engines: {node: '>=18'} 265 279 cpu: [ia32] 266 280 os: [win32] 267 281 268 - '@esbuild/win32-x64@0.21.5': 269 - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} 270 - engines: {node: '>=12'} 282 + '@esbuild/win32-x64@0.25.12': 283 + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} 284 + engines: {node: '>=18'} 271 285 cpu: [x64] 272 286 os: [win32] 273 287 274 - '@jridgewell/gen-mapping@0.3.12': 275 - resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} 288 + '@jridgewell/gen-mapping@0.3.13': 289 + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 290 + 291 + '@jridgewell/remapping@2.3.5': 292 + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} 276 293 277 294 '@jridgewell/resolve-uri@3.1.2': 278 295 resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 279 296 engines: {node: '>=6.0.0'} 280 297 281 - '@jridgewell/sourcemap-codec@1.5.4': 282 - resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} 298 + '@jridgewell/sourcemap-codec@1.5.5': 299 + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 283 300 284 - '@jridgewell/trace-mapping@0.3.29': 285 - resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} 301 + '@jridgewell/trace-mapping@0.3.31': 302 + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} 286 303 287 - '@rollup/rollup-android-arm-eabi@4.46.2': 288 - resolution: {integrity: sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==} 304 + '@rollup/rollup-android-arm-eabi@4.52.5': 305 + resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} 289 306 cpu: [arm] 290 307 os: [android] 291 308 292 - '@rollup/rollup-android-arm64@4.46.2': 293 - resolution: {integrity: sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==} 309 + '@rollup/rollup-android-arm64@4.52.5': 310 + resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} 294 311 cpu: [arm64] 295 312 os: [android] 296 313 297 - '@rollup/rollup-darwin-arm64@4.46.2': 298 - resolution: {integrity: sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==} 314 + '@rollup/rollup-darwin-arm64@4.52.5': 315 + resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} 299 316 cpu: [arm64] 300 317 os: [darwin] 301 318 302 - '@rollup/rollup-darwin-x64@4.46.2': 303 - resolution: {integrity: sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==} 319 + '@rollup/rollup-darwin-x64@4.52.5': 320 + resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} 304 321 cpu: [x64] 305 322 os: [darwin] 306 323 307 - '@rollup/rollup-freebsd-arm64@4.46.2': 308 - resolution: {integrity: sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==} 324 + '@rollup/rollup-freebsd-arm64@4.52.5': 325 + resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} 309 326 cpu: [arm64] 310 327 os: [freebsd] 311 328 312 - '@rollup/rollup-freebsd-x64@4.46.2': 313 - resolution: {integrity: sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==} 329 + '@rollup/rollup-freebsd-x64@4.52.5': 330 + resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} 314 331 cpu: [x64] 315 332 os: [freebsd] 316 333 317 - '@rollup/rollup-linux-arm-gnueabihf@4.46.2': 318 - resolution: {integrity: sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==} 334 + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': 335 + resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} 319 336 cpu: [arm] 320 337 os: [linux] 321 338 322 - '@rollup/rollup-linux-arm-musleabihf@4.46.2': 323 - resolution: {integrity: sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==} 339 + '@rollup/rollup-linux-arm-musleabihf@4.52.5': 340 + resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} 324 341 cpu: [arm] 325 342 os: [linux] 326 343 327 - '@rollup/rollup-linux-arm64-gnu@4.46.2': 328 - resolution: {integrity: sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==} 344 + '@rollup/rollup-linux-arm64-gnu@4.52.5': 345 + resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} 329 346 cpu: [arm64] 330 347 os: [linux] 331 348 332 - '@rollup/rollup-linux-arm64-musl@4.46.2': 333 - resolution: {integrity: sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==} 349 + '@rollup/rollup-linux-arm64-musl@4.52.5': 350 + resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} 334 351 cpu: [arm64] 335 352 os: [linux] 336 353 337 - '@rollup/rollup-linux-loongarch64-gnu@4.46.2': 338 - resolution: {integrity: sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==} 354 + '@rollup/rollup-linux-loong64-gnu@4.52.5': 355 + resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} 339 356 cpu: [loong64] 340 357 os: [linux] 341 358 342 - '@rollup/rollup-linux-ppc64-gnu@4.46.2': 343 - resolution: {integrity: sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==} 359 + '@rollup/rollup-linux-ppc64-gnu@4.52.5': 360 + resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} 344 361 cpu: [ppc64] 345 362 os: [linux] 346 363 347 - '@rollup/rollup-linux-riscv64-gnu@4.46.2': 348 - resolution: {integrity: sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==} 364 + '@rollup/rollup-linux-riscv64-gnu@4.52.5': 365 + resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} 349 366 cpu: [riscv64] 350 367 os: [linux] 351 368 352 - '@rollup/rollup-linux-riscv64-musl@4.46.2': 353 - resolution: {integrity: sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==} 369 + '@rollup/rollup-linux-riscv64-musl@4.52.5': 370 + resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} 354 371 cpu: [riscv64] 355 372 os: [linux] 356 373 357 - '@rollup/rollup-linux-s390x-gnu@4.46.2': 358 - resolution: {integrity: sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==} 374 + '@rollup/rollup-linux-s390x-gnu@4.52.5': 375 + resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} 359 376 cpu: [s390x] 360 377 os: [linux] 361 378 362 - '@rollup/rollup-linux-x64-gnu@4.46.2': 363 - resolution: {integrity: sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==} 379 + '@rollup/rollup-linux-x64-gnu@4.52.5': 380 + resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} 364 381 cpu: [x64] 365 382 os: [linux] 366 383 367 - '@rollup/rollup-linux-x64-musl@4.46.2': 368 - resolution: {integrity: sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==} 384 + '@rollup/rollup-linux-x64-musl@4.52.5': 385 + resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} 369 386 cpu: [x64] 370 387 os: [linux] 371 388 372 - '@rollup/rollup-win32-arm64-msvc@4.46.2': 373 - resolution: {integrity: sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==} 389 + '@rollup/rollup-openharmony-arm64@4.52.5': 390 + resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} 391 + cpu: [arm64] 392 + os: [openharmony] 393 + 394 + '@rollup/rollup-win32-arm64-msvc@4.52.5': 395 + resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} 374 396 cpu: [arm64] 375 397 os: [win32] 376 398 377 - '@rollup/rollup-win32-ia32-msvc@4.46.2': 378 - resolution: {integrity: sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==} 399 + '@rollup/rollup-win32-ia32-msvc@4.52.5': 400 + resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} 379 401 cpu: [ia32] 380 402 os: [win32] 381 403 382 - '@rollup/rollup-win32-x64-msvc@4.46.2': 383 - resolution: {integrity: sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==} 404 + '@rollup/rollup-win32-x64-gnu@4.52.5': 405 + resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} 384 406 cpu: [x64] 385 407 os: [win32] 386 408 387 - '@tauri-apps/api@2.0.0-rc.0': 388 - resolution: {integrity: sha512-v454Qs3REHc3Za59U+/eSmBsdmF+3NE5+76+lFDaitVqN4ZglDHENDaMARYKGJVZuxiSkzyqG0SeG7lLQjVkPA==} 389 - engines: {node: '>= 18.18', npm: '>= 6.6.0', yarn: '>= 1.19.1'} 409 + '@rollup/rollup-win32-x64-msvc@4.52.5': 410 + resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} 411 + cpu: [x64] 412 + os: [win32] 390 413 391 - '@tauri-apps/api@2.7.0': 392 - resolution: {integrity: sha512-v7fVE8jqBl8xJFOcBafDzXFc8FnicoH3j8o8DNNs0tHuEBmXUDqrCOAzMRX0UkfpwqZLqvrvK0GNQ45DfnoVDg==} 414 + '@tauri-apps/api@2.9.0': 415 + resolution: {integrity: sha512-qD5tMjh7utwBk9/5PrTA/aGr3i5QaJ/Mlt7p8NilQ45WgbifUNPyKWsA63iQ8YfQq6R8ajMapU+/Q8nMcPRLNw==} 393 416 394 - '@tauri-apps/cli-darwin-arm64@2.0.0-rc.5': 395 - resolution: {integrity: sha512-EoduJ5SeMfBKCe7I291JBH+lkrf2E0+mQF1rP+Jq4CjWPer11OeEcUSFtHURB3Z3ItzObQ7ALPulMGhMe6E9rg==} 417 + '@tauri-apps/cli-darwin-arm64@2.9.3': 418 + resolution: {integrity: sha512-W8FQXZXQmQ0Fmj9UJXNrm2mLdIaLLriKVY7o/FzmizyIKTPIvHjfZALTNybbpTQRbJvKoGHLrW1DNzAWVDWJYg==} 396 419 engines: {node: '>= 10'} 397 420 cpu: [arm64] 398 421 os: [darwin] 399 422 400 - '@tauri-apps/cli-darwin-x64@2.0.0-rc.5': 401 - resolution: {integrity: sha512-GdphvNgQWAbVGoD6e2Z5auWFXBcmmbhiwf9UNoKpBQPLfFO6EEJHjXbACr/hAZsqT0nNpZLRoh/5v5HGTmU0XQ==} 423 + '@tauri-apps/cli-darwin-x64@2.9.3': 424 + resolution: {integrity: sha512-zDwu40rlshijt3TU6aRvzPUyVpapsx1sNfOlreDMTaMelQLHl6YoQzSRpLHYwrHrhimxyX2uDqnKIiuGel0Lhg==} 402 425 engines: {node: '>= 10'} 403 426 cpu: [x64] 404 427 os: [darwin] 405 428 406 - '@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.5': 407 - resolution: {integrity: sha512-S47KwAfyRsO2qTqSoadHP4a1cjO9kfQi4QWkoaDjb0BEETdrhPM94qp43cnKP7QWW+msOToMTdlks9HYlhRUww==} 429 + '@tauri-apps/cli-linux-arm-gnueabihf@2.9.3': 430 + resolution: {integrity: sha512-+Oc2OfcTRwYtW93VJqd/HOk77buORwC9IToj/qsEvM7bTMq6Kda4alpZprzwrCHYANSw+zD8PgjJdljTpe4p+g==} 408 431 engines: {node: '>= 10'} 409 432 cpu: [arm] 410 433 os: [linux] 411 434 412 - '@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.5': 413 - resolution: {integrity: sha512-Ii9aP/24Rtlci5MaeSaqb6JOLt3cUBA4z4XmGz5VOLLZ+ntRxpfd3xNpLki04V2MOgbAu9BxLAp5UTzELc1/Rg==} 435 + '@tauri-apps/cli-linux-arm64-gnu@2.9.3': 436 + resolution: {integrity: sha512-59GqU/J1n9wFyAtleoQOaU0oVIo+kwQynEw4meFDoKRXszKGor6lTsbsS3r0QKLSPbc0o/yYGJhqqCtkYjb/eg==} 414 437 engines: {node: '>= 10'} 415 438 cpu: [arm64] 416 439 os: [linux] 417 440 418 - '@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.5': 419 - resolution: {integrity: sha512-noV2sDusI+DsEHl0uMOZ04sQmj65Jo9yjfSg2iv1fnfjBYVbwi6Qj/MaCqyApXESQrpv1XZB3kYI+CkyPnjj2Q==} 441 + '@tauri-apps/cli-linux-arm64-musl@2.9.3': 442 + resolution: {integrity: sha512-fzvG+jEn5/iYGNH6Z2IRMheYFC4pJdXa19BR9fFm6Bdn2cuajRLDKdUcEME/DCtwqclphXtFZTrT4oezY5vI/A==} 420 443 engines: {node: '>= 10'} 421 444 cpu: [arm64] 422 445 os: [linux] 423 446 424 - '@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.5': 425 - resolution: {integrity: sha512-iTe9gKO+qgFRjU1sxBvbI8bIRbkOedWvFm/yh8RFi1iJcFwbVnsHWQ8z7BwoNMJLnL2dseZgrGntmS5n9/xSSQ==} 447 + '@tauri-apps/cli-linux-riscv64-gnu@2.9.3': 448 + resolution: {integrity: sha512-qV8DZXI/fZwawk6T3Th1g6smiNC2KeQTk7XFgKvqZ6btC01z3UTsQmNGvI602zwm3Ld1TBZb4+rEWu2QmQimmw==} 449 + engines: {node: '>= 10'} 450 + cpu: [riscv64] 451 + os: [linux] 452 + 453 + '@tauri-apps/cli-linux-x64-gnu@2.9.3': 454 + resolution: {integrity: sha512-tquyEONCNRfqEBWEe4eAHnxFN5yY5lFkCuD4w79XLIovUxVftQ684+xLp7zkhntkt4y20SMj2AgJa/+MOlx4Kg==} 426 455 engines: {node: '>= 10'} 427 456 cpu: [x64] 428 457 os: [linux] 429 458 430 - '@tauri-apps/cli-linux-x64-musl@2.0.0-rc.5': 431 - resolution: {integrity: sha512-R7EyfvfdMtRAKC3QxPn5jVGEH56R4g6hSnR5xXkFnEpioND7SNru5UMBGgseGJ22h/hdjFfqS2vc19291gkVsg==} 459 + '@tauri-apps/cli-linux-x64-musl@2.9.3': 460 + resolution: {integrity: sha512-v2cBIB/6ji8DL+aiL5QUykU3ZO8OoJGyx50/qv2HQVzkf85KdaYSis3D/oVRemN/pcDz+vyCnnL3XnzFnDl4JQ==} 432 461 engines: {node: '>= 10'} 433 462 cpu: [x64] 434 463 os: [linux] 435 464 436 - '@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.5': 437 - resolution: {integrity: sha512-EE7CF//hMWsVZpu9IWXGLDDdMhAiNfHwfLnW4Na1INHKBBb/ynhOd4gKRC3Mi/kgcMfXJAq0nBJFw1mal1q7jg==} 465 + '@tauri-apps/cli-win32-arm64-msvc@2.9.3': 466 + resolution: {integrity: sha512-ZGvBy7nvrHPbE0HeKp/ioaiw8bNgAHxWnb7JRZ4/G0A+oFj0SeSFxl9k5uU6FKnM7bHM23Gd1oeaDex9g5Fceg==} 438 467 engines: {node: '>= 10'} 439 468 cpu: [arm64] 440 469 os: [win32] 441 470 442 - '@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.5': 443 - resolution: {integrity: sha512-zJosPEw1X1H9nTNsrYVSypRLdMLOiLAY8hlBrgsmw7dmN61lOMLyItWsbiAezYeKIpaFeADurR+5qMHHwzbqeg==} 471 + '@tauri-apps/cli-win32-ia32-msvc@2.9.3': 472 + resolution: {integrity: sha512-UsgIwOnpCoY9NK9/65QiwgmWVIE80LE7SwRYVblGtmlY9RYfsYvpbItwsovA/AcHMTiO+OCvS/q9yLeqS3m6Sg==} 444 473 engines: {node: '>= 10'} 445 474 cpu: [ia32] 446 475 os: [win32] 447 476 448 - '@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.5': 449 - resolution: {integrity: sha512-PqxbL/e6GraazdwEKN1oX33gYCRf0ns6yuaxHafHM5+Zsv0MZpyPTPLDot/JLKvNBefk6QXZn5fKAIETVtQaGg==} 477 + '@tauri-apps/cli-win32-x64-msvc@2.9.3': 478 + resolution: {integrity: sha512-fmw7NrrHE5m49idCvJAx9T9bsupjdJ0a3p3DPCNCZRGANU6R1tA1L+KTlVuUtdAldX2NqU/9UPo2SCslYKgJHQ==} 450 479 engines: {node: '>= 10'} 451 480 cpu: [x64] 452 481 os: [win32] 453 482 454 - '@tauri-apps/cli@2.0.0-rc.5': 455 - resolution: {integrity: sha512-JtFfJg8ZNOrj+S+8RKpcrNIcU5hw0X8JSNs2tUjQq0OZgqIGnRSILYjg7BaZDPEakQXUKsDEufbjbYVNJDIp8g==} 483 + '@tauri-apps/cli@2.9.3': 484 + resolution: {integrity: sha512-BQ7iLUXTQcyG1PpzLWeVSmBCedYDpnA/6Cm/kRFGtqjTf/eVUlyYO5S2ee07tLum3nWwDBWTGFZeruO8yEukfA==} 456 485 engines: {node: '>= 10'} 457 486 hasBin: true 458 487 459 - '@tauri-apps/plugin-deep-link@2.4.1': 460 - resolution: {integrity: sha512-I8Bo+spcAKGhIIJ1qN/gapp/Ot3mosQL98znxr975Zn2ODAkUZ++BQ9FnTpR7PDwfIl5ANSGdIW/YU01zVTcJw==} 488 + '@tauri-apps/plugin-deep-link@2.4.5': 489 + resolution: {integrity: sha512-Zf2RTj1D9IQQ45/jqW8XTKvql24HqlPjcpv0mV/O2jHQkNe11HOTZBVj6IK37qs+MWV7xZzcmazx/QVZnhAwaQ==} 461 490 462 - '@tauri-apps/plugin-http@2.0.0-rc.1': 463 - resolution: {integrity: sha512-j4WdTEKx0CFa6u8ubke0mo75pCrnu6XtrFtvjsh+zjuNYgMG/l0+A1woWXHm73f2Levskhs+KbKcLQA/nr8k2w==} 491 + '@tauri-apps/plugin-http@2.5.4': 492 + resolution: {integrity: sha512-/i4U/9za3mrytTgfRn5RHneKubZE/dwRmshYwyMvNRlkWjvu1m4Ma72kcbVJMZFGXpkbl+qLyWMGrihtWB76Zg==} 464 493 465 - '@tauri-apps/plugin-process@2.0.0-rc.0': 466 - resolution: {integrity: sha512-Z12D/kmQzG1vCVf+jLXPhPDUA0pEjFrsg4p0uwO2sotVLM9287IuTM+aIz9cuAYOxFLKcsnDG7amSCL9IfA1gw==} 494 + '@tauri-apps/plugin-process@2.3.1': 495 + resolution: {integrity: sha512-nCa4fGVaDL/B9ai03VyPOjfAHRHSBz5v6F/ObsB73r/dA3MHHhZtldaDMIc0V/pnUw9ehzr2iEG+XkSEyC0JJA==} 467 496 468 - '@tauri-apps/plugin-shell@2.0.0-rc.0': 469 - resolution: {integrity: sha512-bhUcQcrqZoK8H1DFXapr5r1Z75oh6Kd5Tltz97XpZFLREEqp+KhN2Fvyh8r/fKAyenYsTYUIsDsyGdjdueuF9g==} 497 + '@tauri-apps/plugin-shell@2.3.3': 498 + resolution: {integrity: sha512-Xod+pRcFxmOWFWEnqH5yZcA7qwAMuaaDkMR1Sply+F8VfBj++CGnj2xf5UoialmjZ2Cvd8qrvSCbU+7GgNVsKQ==} 470 499 471 500 '@types/animejs@3.1.13': 472 501 resolution: {integrity: sha512-yWg9l1z7CAv/TKpty4/vupEh24jDGUZXv4r26StRkpUPQm04ztJaftgpto8vwdFs8SiTq6XfaPKCSI+wjzNMvQ==} ··· 480 509 '@types/babel__template@7.4.4': 481 510 resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 482 511 483 - '@types/babel__traverse@7.20.7': 484 - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} 512 + '@types/babel__traverse@7.28.0': 513 + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} 485 514 486 515 '@types/estree@1.0.8': 487 516 resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 488 517 489 - animejs@3.2.2: 490 - resolution: {integrity: sha512-Ao95qWLpDPXXM+WrmwcKbl6uNlC5tjnowlaRYtuVDHHoygjtIPfDUoK9NthrlZsQSKjZXlmji2TrBUAVbiH0LQ==} 518 + animejs@4.2.2: 519 + resolution: {integrity: sha512-Ys3RuvLdAeI14fsdKCQy7ytu4057QX6Bb7m4jwmfd6iKmUmLquTwk1ut0e4NtRQgCeq/s2Lv5+oMBjz6c7ZuIg==} 491 520 492 - babel-plugin-jsx-dom-expressions@0.39.8: 493 - resolution: {integrity: sha512-/MVOIIjonylDXnrWmG23ZX82m9mtKATsVHB7zYlPfDR9Vdd/NBE48if+wv27bSkBtyO7EPMUlcUc4J63QwuACQ==} 521 + babel-plugin-jsx-dom-expressions@0.40.3: 522 + resolution: {integrity: sha512-5HOwwt0BYiv/zxl7j8Pf2bGL6rDXfV6nUhLs8ygBX+EFJXzBPHM/euj9j/6deMZ6wa52Wb2PBaAV5U/jKwIY1w==} 494 523 peerDependencies: 495 524 '@babel/core': ^7.20.12 496 525 497 - babel-preset-solid@1.9.6: 498 - resolution: {integrity: sha512-HXTK9f93QxoH8dYn1M2mJdOlWgMsR88Lg/ul6QCZGkNTktjTE5HAf93YxQumHoCudLEtZrU1cFCMFOVho6GqFg==} 526 + babel-preset-solid@1.9.10: 527 + resolution: {integrity: sha512-HCelrgua/Y+kqO8RyL04JBWS/cVdrtUv/h45GntgQY+cJl4eBcKkCDV3TdMjtKx1nXwRaR9QXslM/Npm1dxdZQ==} 499 528 peerDependencies: 500 529 '@babel/core': ^7.0.0 530 + solid-js: ^1.9.10 531 + peerDependenciesMeta: 532 + solid-js: 533 + optional: true 501 534 502 - browserslist@4.25.1: 503 - resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} 535 + baseline-browser-mapping@2.8.25: 536 + resolution: {integrity: sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==} 537 + hasBin: true 538 + 539 + browserslist@4.27.0: 540 + resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==} 504 541 engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 505 542 hasBin: true 506 543 507 - caniuse-lite@1.0.30001731: 508 - resolution: {integrity: sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==} 544 + caniuse-lite@1.0.30001754: 545 + resolution: {integrity: sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==} 509 546 510 547 convert-source-map@2.0.0: 511 548 resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} ··· 513 550 csstype@3.1.3: 514 551 resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 515 552 516 - debug@4.4.1: 517 - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 553 + debug@4.4.3: 554 + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 518 555 engines: {node: '>=6.0'} 519 556 peerDependencies: 520 557 supports-color: '*' ··· 522 559 supports-color: 523 560 optional: true 524 561 525 - electron-to-chromium@1.5.193: 526 - resolution: {integrity: sha512-eePuBZXM9OVCwfYUhd2OzESeNGnWmLyeu0XAEjf7xjijNjHFdeJSzuRUGN4ueT2tEYo5YqjHramKEFxz67p3XA==} 562 + electron-to-chromium@1.5.248: 563 + resolution: {integrity: sha512-zsur2yunphlyAO4gIubdJEXCK6KOVvtpiuDfCIqbM9FjcnMYiyn0ICa3hWfPr0nc41zcLWobgy1iL7VvoOyA2Q==} 527 564 528 565 entities@6.0.1: 529 566 resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} 530 567 engines: {node: '>=0.12'} 531 568 532 - esbuild@0.21.5: 533 - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} 534 - engines: {node: '>=12'} 569 + esbuild@0.25.12: 570 + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} 571 + engines: {node: '>=18'} 535 572 hasBin: true 536 573 537 574 escalade@3.2.0: 538 575 resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 539 576 engines: {node: '>=6'} 577 + 578 + fdir@6.5.0: 579 + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 580 + engines: {node: '>=12.0.0'} 581 + peerDependencies: 582 + picomatch: ^3 || ^4 583 + peerDependenciesMeta: 584 + picomatch: 585 + optional: true 540 586 541 587 fsevents@2.3.3: 542 588 resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} ··· 582 628 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 583 629 hasBin: true 584 630 585 - node-releases@2.0.19: 586 - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 631 + node-releases@2.0.27: 632 + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} 587 633 588 634 parse5@7.3.0: 589 635 resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} ··· 591 637 picocolors@1.1.1: 592 638 resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 593 639 640 + picomatch@4.0.3: 641 + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 642 + engines: {node: '>=12'} 643 + 594 644 postcss@8.5.6: 595 645 resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 596 646 engines: {node: ^10 || ^12 || >=14} 597 647 598 - rollup@4.46.2: 599 - resolution: {integrity: sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==} 648 + rollup@4.52.5: 649 + resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} 600 650 engines: {node: '>=18.0.0', npm: '>=8.0.0'} 601 651 hasBin: true 602 652 ··· 604 654 resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 605 655 hasBin: true 606 656 607 - seroval-plugins@1.3.2: 608 - resolution: {integrity: sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==} 657 + seroval-plugins@1.3.3: 658 + resolution: {integrity: sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==} 609 659 engines: {node: '>=10'} 610 660 peerDependencies: 611 661 seroval: ^1.0 ··· 614 664 resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} 615 665 engines: {node: '>=10'} 616 666 617 - solid-js@1.9.7: 618 - resolution: {integrity: sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw==} 667 + solid-js@1.9.10: 668 + resolution: {integrity: sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew==} 619 669 620 670 solid-refresh@0.6.3: 621 671 resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} ··· 626 676 resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 627 677 engines: {node: '>=0.10.0'} 628 678 629 - typescript@5.8.3: 630 - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 679 + tinyglobby@0.2.15: 680 + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 681 + engines: {node: '>=12.0.0'} 682 + 683 + typescript@5.9.3: 684 + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 631 685 engines: {node: '>=14.17'} 632 686 hasBin: true 633 687 634 - update-browserslist-db@1.1.3: 635 - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 688 + update-browserslist-db@1.1.4: 689 + resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} 636 690 hasBin: true 637 691 peerDependencies: 638 692 browserslist: '>= 4.21.0' 639 693 640 - validate-html-nesting@1.2.3: 641 - resolution: {integrity: sha512-kdkWdCl6eCeLlRShJKbjVOU2kFKxMF8Ghu50n+crEoyx+VKm3FxAxF9z4DCy6+bbTOqNW0+jcIYRnjoIRzigRw==} 642 - 643 - vite-plugin-solid@2.11.8: 644 - resolution: {integrity: sha512-hFrCxBfv3B1BmFqnJF4JOCYpjrmi/zwyeKjcomQ0khh8HFyQ8SbuBWQ7zGojfrz6HUOBFrJBNySDi/JgAHytWg==} 694 + vite-plugin-solid@2.11.10: 695 + resolution: {integrity: sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw==} 645 696 peerDependencies: 646 697 '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* 647 698 solid-js: ^1.7.2 ··· 650 701 '@testing-library/jest-dom': 651 702 optional: true 652 703 653 - vite@5.4.19: 654 - resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} 655 - engines: {node: ^18.0.0 || >=20.0.0} 704 + vite@7.2.2: 705 + resolution: {integrity: sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==} 706 + engines: {node: ^20.19.0 || >=22.12.0} 656 707 hasBin: true 657 708 peerDependencies: 658 - '@types/node': ^18.0.0 || >=20.0.0 659 - less: '*' 709 + '@types/node': ^20.19.0 || >=22.12.0 710 + jiti: '>=1.21.0' 711 + less: ^4.0.0 660 712 lightningcss: ^1.21.0 661 - sass: '*' 662 - sass-embedded: '*' 663 - stylus: '*' 664 - sugarss: '*' 665 - terser: ^5.4.0 713 + sass: ^1.70.0 714 + sass-embedded: ^1.70.0 715 + stylus: '>=0.54.8' 716 + sugarss: ^5.0.0 717 + terser: ^5.16.0 718 + tsx: ^4.8.1 719 + yaml: ^2.4.2 666 720 peerDependenciesMeta: 667 721 '@types/node': 722 + optional: true 723 + jiti: 668 724 optional: true 669 725 less: 670 726 optional: true ··· 679 735 sugarss: 680 736 optional: true 681 737 terser: 738 + optional: true 739 + tsx: 740 + optional: true 741 + yaml: 682 742 optional: true 683 743 684 744 vitefu@1.1.1: ··· 694 754 695 755 snapshots: 696 756 697 - '@ampproject/remapping@2.3.0': 698 - dependencies: 699 - '@jridgewell/gen-mapping': 0.3.12 700 - '@jridgewell/trace-mapping': 0.3.29 701 - 702 757 '@babel/code-frame@7.27.1': 703 758 dependencies: 704 - '@babel/helper-validator-identifier': 7.27.1 759 + '@babel/helper-validator-identifier': 7.28.5 705 760 js-tokens: 4.0.0 706 761 picocolors: 1.1.1 707 762 708 - '@babel/compat-data@7.28.0': {} 763 + '@babel/compat-data@7.28.5': {} 709 764 710 - '@babel/core@7.28.0': 765 + '@babel/core@7.28.5': 711 766 dependencies: 712 - '@ampproject/remapping': 2.3.0 713 767 '@babel/code-frame': 7.27.1 714 - '@babel/generator': 7.28.0 768 + '@babel/generator': 7.28.5 715 769 '@babel/helper-compilation-targets': 7.27.2 716 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) 717 - '@babel/helpers': 7.28.2 718 - '@babel/parser': 7.28.0 770 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) 771 + '@babel/helpers': 7.28.4 772 + '@babel/parser': 7.28.5 719 773 '@babel/template': 7.27.2 720 - '@babel/traverse': 7.28.0 721 - '@babel/types': 7.28.2 774 + '@babel/traverse': 7.28.5 775 + '@babel/types': 7.28.5 776 + '@jridgewell/remapping': 2.3.5 722 777 convert-source-map: 2.0.0 723 - debug: 4.4.1 778 + debug: 4.4.3 724 779 gensync: 1.0.0-beta.2 725 780 json5: 2.2.3 726 781 semver: 6.3.1 727 782 transitivePeerDependencies: 728 783 - supports-color 729 784 730 - '@babel/generator@7.28.0': 785 + '@babel/generator@7.28.5': 731 786 dependencies: 732 - '@babel/parser': 7.28.0 733 - '@babel/types': 7.28.2 734 - '@jridgewell/gen-mapping': 0.3.12 735 - '@jridgewell/trace-mapping': 0.3.29 787 + '@babel/parser': 7.28.5 788 + '@babel/types': 7.28.5 789 + '@jridgewell/gen-mapping': 0.3.13 790 + '@jridgewell/trace-mapping': 0.3.31 736 791 jsesc: 3.1.0 737 792 738 793 '@babel/helper-compilation-targets@7.27.2': 739 794 dependencies: 740 - '@babel/compat-data': 7.28.0 795 + '@babel/compat-data': 7.28.5 741 796 '@babel/helper-validator-option': 7.27.1 742 - browserslist: 4.25.1 797 + browserslist: 4.27.0 743 798 lru-cache: 5.1.1 744 799 semver: 6.3.1 745 800 ··· 747 802 748 803 '@babel/helper-module-imports@7.18.6': 749 804 dependencies: 750 - '@babel/types': 7.28.2 805 + '@babel/types': 7.28.5 751 806 752 807 '@babel/helper-module-imports@7.27.1': 753 808 dependencies: 754 - '@babel/traverse': 7.28.0 755 - '@babel/types': 7.28.2 809 + '@babel/traverse': 7.28.5 810 + '@babel/types': 7.28.5 756 811 transitivePeerDependencies: 757 812 - supports-color 758 813 759 - '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': 814 + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': 760 815 dependencies: 761 - '@babel/core': 7.28.0 816 + '@babel/core': 7.28.5 762 817 '@babel/helper-module-imports': 7.27.1 763 - '@babel/helper-validator-identifier': 7.27.1 764 - '@babel/traverse': 7.28.0 818 + '@babel/helper-validator-identifier': 7.28.5 819 + '@babel/traverse': 7.28.5 765 820 transitivePeerDependencies: 766 821 - supports-color 767 822 ··· 769 824 770 825 '@babel/helper-string-parser@7.27.1': {} 771 826 772 - '@babel/helper-validator-identifier@7.27.1': {} 827 + '@babel/helper-validator-identifier@7.28.5': {} 773 828 774 829 '@babel/helper-validator-option@7.27.1': {} 775 830 776 - '@babel/helpers@7.28.2': 831 + '@babel/helpers@7.28.4': 777 832 dependencies: 778 833 '@babel/template': 7.27.2 779 - '@babel/types': 7.28.2 834 + '@babel/types': 7.28.5 780 835 781 - '@babel/parser@7.28.0': 836 + '@babel/parser@7.28.5': 782 837 dependencies: 783 - '@babel/types': 7.28.2 838 + '@babel/types': 7.28.5 784 839 785 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': 840 + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)': 786 841 dependencies: 787 - '@babel/core': 7.28.0 842 + '@babel/core': 7.28.5 788 843 '@babel/helper-plugin-utils': 7.27.1 789 844 790 845 '@babel/template@7.27.2': 791 846 dependencies: 792 847 '@babel/code-frame': 7.27.1 793 - '@babel/parser': 7.28.0 794 - '@babel/types': 7.28.2 848 + '@babel/parser': 7.28.5 849 + '@babel/types': 7.28.5 795 850 796 - '@babel/traverse@7.28.0': 851 + '@babel/traverse@7.28.5': 797 852 dependencies: 798 853 '@babel/code-frame': 7.27.1 799 - '@babel/generator': 7.28.0 854 + '@babel/generator': 7.28.5 800 855 '@babel/helper-globals': 7.28.0 801 - '@babel/parser': 7.28.0 856 + '@babel/parser': 7.28.5 802 857 '@babel/template': 7.27.2 803 - '@babel/types': 7.28.2 804 - debug: 4.4.1 858 + '@babel/types': 7.28.5 859 + debug: 4.4.3 805 860 transitivePeerDependencies: 806 861 - supports-color 807 862 808 - '@babel/types@7.28.2': 863 + '@babel/types@7.28.5': 809 864 dependencies: 810 865 '@babel/helper-string-parser': 7.27.1 811 - '@babel/helper-validator-identifier': 7.27.1 866 + '@babel/helper-validator-identifier': 7.28.5 867 + 868 + '@esbuild/aix-ppc64@0.25.12': 869 + optional: true 870 + 871 + '@esbuild/android-arm64@0.25.12': 872 + optional: true 873 + 874 + '@esbuild/android-arm@0.25.12': 875 + optional: true 812 876 813 - '@esbuild/aix-ppc64@0.21.5': 877 + '@esbuild/android-x64@0.25.12': 814 878 optional: true 815 879 816 - '@esbuild/android-arm64@0.21.5': 880 + '@esbuild/darwin-arm64@0.25.12': 817 881 optional: true 818 882 819 - '@esbuild/android-arm@0.21.5': 883 + '@esbuild/darwin-x64@0.25.12': 820 884 optional: true 821 885 822 - '@esbuild/android-x64@0.21.5': 886 + '@esbuild/freebsd-arm64@0.25.12': 823 887 optional: true 824 888 825 - '@esbuild/darwin-arm64@0.21.5': 889 + '@esbuild/freebsd-x64@0.25.12': 826 890 optional: true 827 891 828 - '@esbuild/darwin-x64@0.21.5': 892 + '@esbuild/linux-arm64@0.25.12': 829 893 optional: true 830 894 831 - '@esbuild/freebsd-arm64@0.21.5': 895 + '@esbuild/linux-arm@0.25.12': 832 896 optional: true 833 897 834 - '@esbuild/freebsd-x64@0.21.5': 898 + '@esbuild/linux-ia32@0.25.12': 835 899 optional: true 836 900 837 - '@esbuild/linux-arm64@0.21.5': 901 + '@esbuild/linux-loong64@0.25.12': 838 902 optional: true 839 903 840 - '@esbuild/linux-arm@0.21.5': 904 + '@esbuild/linux-mips64el@0.25.12': 841 905 optional: true 842 906 843 - '@esbuild/linux-ia32@0.21.5': 907 + '@esbuild/linux-ppc64@0.25.12': 844 908 optional: true 845 909 846 - '@esbuild/linux-loong64@0.21.5': 910 + '@esbuild/linux-riscv64@0.25.12': 847 911 optional: true 848 912 849 - '@esbuild/linux-mips64el@0.21.5': 913 + '@esbuild/linux-s390x@0.25.12': 850 914 optional: true 851 915 852 - '@esbuild/linux-ppc64@0.21.5': 916 + '@esbuild/linux-x64@0.25.12': 853 917 optional: true 854 918 855 - '@esbuild/linux-riscv64@0.21.5': 919 + '@esbuild/netbsd-arm64@0.25.12': 856 920 optional: true 857 921 858 - '@esbuild/linux-s390x@0.21.5': 922 + '@esbuild/netbsd-x64@0.25.12': 859 923 optional: true 860 924 861 - '@esbuild/linux-x64@0.21.5': 925 + '@esbuild/openbsd-arm64@0.25.12': 862 926 optional: true 863 927 864 - '@esbuild/netbsd-x64@0.21.5': 928 + '@esbuild/openbsd-x64@0.25.12': 865 929 optional: true 866 930 867 - '@esbuild/openbsd-x64@0.21.5': 931 + '@esbuild/openharmony-arm64@0.25.12': 868 932 optional: true 869 933 870 - '@esbuild/sunos-x64@0.21.5': 934 + '@esbuild/sunos-x64@0.25.12': 871 935 optional: true 872 936 873 - '@esbuild/win32-arm64@0.21.5': 937 + '@esbuild/win32-arm64@0.25.12': 874 938 optional: true 875 939 876 - '@esbuild/win32-ia32@0.21.5': 940 + '@esbuild/win32-ia32@0.25.12': 877 941 optional: true 878 942 879 - '@esbuild/win32-x64@0.21.5': 943 + '@esbuild/win32-x64@0.25.12': 880 944 optional: true 881 945 882 - '@jridgewell/gen-mapping@0.3.12': 946 + '@jridgewell/gen-mapping@0.3.13': 883 947 dependencies: 884 - '@jridgewell/sourcemap-codec': 1.5.4 885 - '@jridgewell/trace-mapping': 0.3.29 948 + '@jridgewell/sourcemap-codec': 1.5.5 949 + '@jridgewell/trace-mapping': 0.3.31 950 + 951 + '@jridgewell/remapping@2.3.5': 952 + dependencies: 953 + '@jridgewell/gen-mapping': 0.3.13 954 + '@jridgewell/trace-mapping': 0.3.31 886 955 887 956 '@jridgewell/resolve-uri@3.1.2': {} 888 957 889 - '@jridgewell/sourcemap-codec@1.5.4': {} 958 + '@jridgewell/sourcemap-codec@1.5.5': {} 890 959 891 - '@jridgewell/trace-mapping@0.3.29': 960 + '@jridgewell/trace-mapping@0.3.31': 892 961 dependencies: 893 962 '@jridgewell/resolve-uri': 3.1.2 894 - '@jridgewell/sourcemap-codec': 1.5.4 963 + '@jridgewell/sourcemap-codec': 1.5.5 895 964 896 - '@rollup/rollup-android-arm-eabi@4.46.2': 965 + '@rollup/rollup-android-arm-eabi@4.52.5': 897 966 optional: true 898 967 899 - '@rollup/rollup-android-arm64@4.46.2': 968 + '@rollup/rollup-android-arm64@4.52.5': 900 969 optional: true 901 970 902 - '@rollup/rollup-darwin-arm64@4.46.2': 971 + '@rollup/rollup-darwin-arm64@4.52.5': 903 972 optional: true 904 973 905 - '@rollup/rollup-darwin-x64@4.46.2': 974 + '@rollup/rollup-darwin-x64@4.52.5': 906 975 optional: true 907 976 908 - '@rollup/rollup-freebsd-arm64@4.46.2': 977 + '@rollup/rollup-freebsd-arm64@4.52.5': 909 978 optional: true 910 979 911 - '@rollup/rollup-freebsd-x64@4.46.2': 980 + '@rollup/rollup-freebsd-x64@4.52.5': 912 981 optional: true 913 982 914 - '@rollup/rollup-linux-arm-gnueabihf@4.46.2': 983 + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': 915 984 optional: true 916 985 917 - '@rollup/rollup-linux-arm-musleabihf@4.46.2': 986 + '@rollup/rollup-linux-arm-musleabihf@4.52.5': 918 987 optional: true 919 988 920 - '@rollup/rollup-linux-arm64-gnu@4.46.2': 989 + '@rollup/rollup-linux-arm64-gnu@4.52.5': 921 990 optional: true 922 991 923 - '@rollup/rollup-linux-arm64-musl@4.46.2': 992 + '@rollup/rollup-linux-arm64-musl@4.52.5': 924 993 optional: true 925 994 926 - '@rollup/rollup-linux-loongarch64-gnu@4.46.2': 995 + '@rollup/rollup-linux-loong64-gnu@4.52.5': 927 996 optional: true 928 997 929 - '@rollup/rollup-linux-ppc64-gnu@4.46.2': 998 + '@rollup/rollup-linux-ppc64-gnu@4.52.5': 930 999 optional: true 931 1000 932 - '@rollup/rollup-linux-riscv64-gnu@4.46.2': 1001 + '@rollup/rollup-linux-riscv64-gnu@4.52.5': 933 1002 optional: true 934 1003 935 - '@rollup/rollup-linux-riscv64-musl@4.46.2': 1004 + '@rollup/rollup-linux-riscv64-musl@4.52.5': 936 1005 optional: true 937 1006 938 - '@rollup/rollup-linux-s390x-gnu@4.46.2': 1007 + '@rollup/rollup-linux-s390x-gnu@4.52.5': 939 1008 optional: true 940 1009 941 - '@rollup/rollup-linux-x64-gnu@4.46.2': 1010 + '@rollup/rollup-linux-x64-gnu@4.52.5': 942 1011 optional: true 943 1012 944 - '@rollup/rollup-linux-x64-musl@4.46.2': 1013 + '@rollup/rollup-linux-x64-musl@4.52.5': 945 1014 optional: true 946 1015 947 - '@rollup/rollup-win32-arm64-msvc@4.46.2': 1016 + '@rollup/rollup-openharmony-arm64@4.52.5': 948 1017 optional: true 949 1018 950 - '@rollup/rollup-win32-ia32-msvc@4.46.2': 1019 + '@rollup/rollup-win32-arm64-msvc@4.52.5': 951 1020 optional: true 952 1021 953 - '@rollup/rollup-win32-x64-msvc@4.46.2': 1022 + '@rollup/rollup-win32-ia32-msvc@4.52.5': 954 1023 optional: true 955 1024 956 - '@tauri-apps/api@2.0.0-rc.0': {} 1025 + '@rollup/rollup-win32-x64-gnu@4.52.5': 1026 + optional: true 957 1027 958 - '@tauri-apps/api@2.7.0': {} 1028 + '@rollup/rollup-win32-x64-msvc@4.52.5': 1029 + optional: true 959 1030 960 - '@tauri-apps/cli-darwin-arm64@2.0.0-rc.5': 1031 + '@tauri-apps/api@2.9.0': {} 1032 + 1033 + '@tauri-apps/cli-darwin-arm64@2.9.3': 961 1034 optional: true 962 1035 963 - '@tauri-apps/cli-darwin-x64@2.0.0-rc.5': 1036 + '@tauri-apps/cli-darwin-x64@2.9.3': 964 1037 optional: true 965 1038 966 - '@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.5': 1039 + '@tauri-apps/cli-linux-arm-gnueabihf@2.9.3': 967 1040 optional: true 968 1041 969 - '@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.5': 1042 + '@tauri-apps/cli-linux-arm64-gnu@2.9.3': 970 1043 optional: true 971 1044 972 - '@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.5': 1045 + '@tauri-apps/cli-linux-arm64-musl@2.9.3': 973 1046 optional: true 974 1047 975 - '@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.5': 1048 + '@tauri-apps/cli-linux-riscv64-gnu@2.9.3': 976 1049 optional: true 977 1050 978 - '@tauri-apps/cli-linux-x64-musl@2.0.0-rc.5': 1051 + '@tauri-apps/cli-linux-x64-gnu@2.9.3': 1052 + optional: true 1053 + 1054 + '@tauri-apps/cli-linux-x64-musl@2.9.3': 979 1055 optional: true 980 1056 981 - '@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.5': 1057 + '@tauri-apps/cli-win32-arm64-msvc@2.9.3': 982 1058 optional: true 983 1059 984 - '@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.5': 1060 + '@tauri-apps/cli-win32-ia32-msvc@2.9.3': 985 1061 optional: true 986 1062 987 - '@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.5': 1063 + '@tauri-apps/cli-win32-x64-msvc@2.9.3': 988 1064 optional: true 989 1065 990 - '@tauri-apps/cli@2.0.0-rc.5': 1066 + '@tauri-apps/cli@2.9.3': 991 1067 optionalDependencies: 992 - '@tauri-apps/cli-darwin-arm64': 2.0.0-rc.5 993 - '@tauri-apps/cli-darwin-x64': 2.0.0-rc.5 994 - '@tauri-apps/cli-linux-arm-gnueabihf': 2.0.0-rc.5 995 - '@tauri-apps/cli-linux-arm64-gnu': 2.0.0-rc.5 996 - '@tauri-apps/cli-linux-arm64-musl': 2.0.0-rc.5 997 - '@tauri-apps/cli-linux-x64-gnu': 2.0.0-rc.5 998 - '@tauri-apps/cli-linux-x64-musl': 2.0.0-rc.5 999 - '@tauri-apps/cli-win32-arm64-msvc': 2.0.0-rc.5 1000 - '@tauri-apps/cli-win32-ia32-msvc': 2.0.0-rc.5 1001 - '@tauri-apps/cli-win32-x64-msvc': 2.0.0-rc.5 1068 + '@tauri-apps/cli-darwin-arm64': 2.9.3 1069 + '@tauri-apps/cli-darwin-x64': 2.9.3 1070 + '@tauri-apps/cli-linux-arm-gnueabihf': 2.9.3 1071 + '@tauri-apps/cli-linux-arm64-gnu': 2.9.3 1072 + '@tauri-apps/cli-linux-arm64-musl': 2.9.3 1073 + '@tauri-apps/cli-linux-riscv64-gnu': 2.9.3 1074 + '@tauri-apps/cli-linux-x64-gnu': 2.9.3 1075 + '@tauri-apps/cli-linux-x64-musl': 2.9.3 1076 + '@tauri-apps/cli-win32-arm64-msvc': 2.9.3 1077 + '@tauri-apps/cli-win32-ia32-msvc': 2.9.3 1078 + '@tauri-apps/cli-win32-x64-msvc': 2.9.3 1002 1079 1003 - '@tauri-apps/plugin-deep-link@2.4.1': 1080 + '@tauri-apps/plugin-deep-link@2.4.5': 1004 1081 dependencies: 1005 - '@tauri-apps/api': 2.7.0 1082 + '@tauri-apps/api': 2.9.0 1006 1083 1007 - '@tauri-apps/plugin-http@2.0.0-rc.1': 1084 + '@tauri-apps/plugin-http@2.5.4': 1008 1085 dependencies: 1009 - '@tauri-apps/api': 2.7.0 1086 + '@tauri-apps/api': 2.9.0 1010 1087 1011 - '@tauri-apps/plugin-process@2.0.0-rc.0': 1088 + '@tauri-apps/plugin-process@2.3.1': 1012 1089 dependencies: 1013 - '@tauri-apps/api': 2.0.0-rc.0 1090 + '@tauri-apps/api': 2.9.0 1014 1091 1015 - '@tauri-apps/plugin-shell@2.0.0-rc.0': 1092 + '@tauri-apps/plugin-shell@2.3.3': 1016 1093 dependencies: 1017 - '@tauri-apps/api': 2.0.0-rc.0 1094 + '@tauri-apps/api': 2.9.0 1018 1095 1019 1096 '@types/animejs@3.1.13': {} 1020 1097 1021 1098 '@types/babel__core@7.20.5': 1022 1099 dependencies: 1023 - '@babel/parser': 7.28.0 1024 - '@babel/types': 7.28.2 1100 + '@babel/parser': 7.28.5 1101 + '@babel/types': 7.28.5 1025 1102 '@types/babel__generator': 7.27.0 1026 1103 '@types/babel__template': 7.4.4 1027 - '@types/babel__traverse': 7.20.7 1104 + '@types/babel__traverse': 7.28.0 1028 1105 1029 1106 '@types/babel__generator@7.27.0': 1030 1107 dependencies: 1031 - '@babel/types': 7.28.2 1108 + '@babel/types': 7.28.5 1032 1109 1033 1110 '@types/babel__template@7.4.4': 1034 1111 dependencies: 1035 - '@babel/parser': 7.28.0 1036 - '@babel/types': 7.28.2 1112 + '@babel/parser': 7.28.5 1113 + '@babel/types': 7.28.5 1037 1114 1038 - '@types/babel__traverse@7.20.7': 1115 + '@types/babel__traverse@7.28.0': 1039 1116 dependencies: 1040 - '@babel/types': 7.28.2 1117 + '@babel/types': 7.28.5 1041 1118 1042 1119 '@types/estree@1.0.8': {} 1043 1120 1044 - animejs@3.2.2: {} 1121 + animejs@4.2.2: {} 1045 1122 1046 - babel-plugin-jsx-dom-expressions@0.39.8(@babel/core@7.28.0): 1123 + babel-plugin-jsx-dom-expressions@0.40.3(@babel/core@7.28.5): 1047 1124 dependencies: 1048 - '@babel/core': 7.28.0 1125 + '@babel/core': 7.28.5 1049 1126 '@babel/helper-module-imports': 7.18.6 1050 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) 1051 - '@babel/types': 7.28.2 1127 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) 1128 + '@babel/types': 7.28.5 1052 1129 html-entities: 2.3.3 1053 1130 parse5: 7.3.0 1054 - validate-html-nesting: 1.2.3 1055 1131 1056 - babel-preset-solid@1.9.6(@babel/core@7.28.0): 1132 + babel-preset-solid@1.9.10(@babel/core@7.28.5)(solid-js@1.9.10): 1057 1133 dependencies: 1058 - '@babel/core': 7.28.0 1059 - babel-plugin-jsx-dom-expressions: 0.39.8(@babel/core@7.28.0) 1134 + '@babel/core': 7.28.5 1135 + babel-plugin-jsx-dom-expressions: 0.40.3(@babel/core@7.28.5) 1136 + optionalDependencies: 1137 + solid-js: 1.9.10 1060 1138 1061 - browserslist@4.25.1: 1139 + baseline-browser-mapping@2.8.25: {} 1140 + 1141 + browserslist@4.27.0: 1062 1142 dependencies: 1063 - caniuse-lite: 1.0.30001731 1064 - electron-to-chromium: 1.5.193 1065 - node-releases: 2.0.19 1066 - update-browserslist-db: 1.1.3(browserslist@4.25.1) 1143 + baseline-browser-mapping: 2.8.25 1144 + caniuse-lite: 1.0.30001754 1145 + electron-to-chromium: 1.5.248 1146 + node-releases: 2.0.27 1147 + update-browserslist-db: 1.1.4(browserslist@4.27.0) 1067 1148 1068 - caniuse-lite@1.0.30001731: {} 1149 + caniuse-lite@1.0.30001754: {} 1069 1150 1070 1151 convert-source-map@2.0.0: {} 1071 1152 1072 1153 csstype@3.1.3: {} 1073 1154 1074 - debug@4.4.1: 1155 + debug@4.4.3: 1075 1156 dependencies: 1076 1157 ms: 2.1.3 1077 1158 1078 - electron-to-chromium@1.5.193: {} 1159 + electron-to-chromium@1.5.248: {} 1079 1160 1080 1161 entities@6.0.1: {} 1081 1162 1082 - esbuild@0.21.5: 1163 + esbuild@0.25.12: 1083 1164 optionalDependencies: 1084 - '@esbuild/aix-ppc64': 0.21.5 1085 - '@esbuild/android-arm': 0.21.5 1086 - '@esbuild/android-arm64': 0.21.5 1087 - '@esbuild/android-x64': 0.21.5 1088 - '@esbuild/darwin-arm64': 0.21.5 1089 - '@esbuild/darwin-x64': 0.21.5 1090 - '@esbuild/freebsd-arm64': 0.21.5 1091 - '@esbuild/freebsd-x64': 0.21.5 1092 - '@esbuild/linux-arm': 0.21.5 1093 - '@esbuild/linux-arm64': 0.21.5 1094 - '@esbuild/linux-ia32': 0.21.5 1095 - '@esbuild/linux-loong64': 0.21.5 1096 - '@esbuild/linux-mips64el': 0.21.5 1097 - '@esbuild/linux-ppc64': 0.21.5 1098 - '@esbuild/linux-riscv64': 0.21.5 1099 - '@esbuild/linux-s390x': 0.21.5 1100 - '@esbuild/linux-x64': 0.21.5 1101 - '@esbuild/netbsd-x64': 0.21.5 1102 - '@esbuild/openbsd-x64': 0.21.5 1103 - '@esbuild/sunos-x64': 0.21.5 1104 - '@esbuild/win32-arm64': 0.21.5 1105 - '@esbuild/win32-ia32': 0.21.5 1106 - '@esbuild/win32-x64': 0.21.5 1165 + '@esbuild/aix-ppc64': 0.25.12 1166 + '@esbuild/android-arm': 0.25.12 1167 + '@esbuild/android-arm64': 0.25.12 1168 + '@esbuild/android-x64': 0.25.12 1169 + '@esbuild/darwin-arm64': 0.25.12 1170 + '@esbuild/darwin-x64': 0.25.12 1171 + '@esbuild/freebsd-arm64': 0.25.12 1172 + '@esbuild/freebsd-x64': 0.25.12 1173 + '@esbuild/linux-arm': 0.25.12 1174 + '@esbuild/linux-arm64': 0.25.12 1175 + '@esbuild/linux-ia32': 0.25.12 1176 + '@esbuild/linux-loong64': 0.25.12 1177 + '@esbuild/linux-mips64el': 0.25.12 1178 + '@esbuild/linux-ppc64': 0.25.12 1179 + '@esbuild/linux-riscv64': 0.25.12 1180 + '@esbuild/linux-s390x': 0.25.12 1181 + '@esbuild/linux-x64': 0.25.12 1182 + '@esbuild/netbsd-arm64': 0.25.12 1183 + '@esbuild/netbsd-x64': 0.25.12 1184 + '@esbuild/openbsd-arm64': 0.25.12 1185 + '@esbuild/openbsd-x64': 0.25.12 1186 + '@esbuild/openharmony-arm64': 0.25.12 1187 + '@esbuild/sunos-x64': 0.25.12 1188 + '@esbuild/win32-arm64': 0.25.12 1189 + '@esbuild/win32-ia32': 0.25.12 1190 + '@esbuild/win32-x64': 0.25.12 1107 1191 1108 1192 escalade@3.2.0: {} 1109 1193 1194 + fdir@6.5.0(picomatch@4.0.3): 1195 + optionalDependencies: 1196 + picomatch: 4.0.3 1197 + 1110 1198 fsevents@2.3.3: 1111 1199 optional: true 1112 1200 ··· 1134 1222 1135 1223 nanoid@3.3.11: {} 1136 1224 1137 - node-releases@2.0.19: {} 1225 + node-releases@2.0.27: {} 1138 1226 1139 1227 parse5@7.3.0: 1140 1228 dependencies: ··· 1142 1230 1143 1231 picocolors@1.1.1: {} 1144 1232 1233 + picomatch@4.0.3: {} 1234 + 1145 1235 postcss@8.5.6: 1146 1236 dependencies: 1147 1237 nanoid: 3.3.11 1148 1238 picocolors: 1.1.1 1149 1239 source-map-js: 1.2.1 1150 1240 1151 - rollup@4.46.2: 1241 + rollup@4.52.5: 1152 1242 dependencies: 1153 1243 '@types/estree': 1.0.8 1154 1244 optionalDependencies: 1155 - '@rollup/rollup-android-arm-eabi': 4.46.2 1156 - '@rollup/rollup-android-arm64': 4.46.2 1157 - '@rollup/rollup-darwin-arm64': 4.46.2 1158 - '@rollup/rollup-darwin-x64': 4.46.2 1159 - '@rollup/rollup-freebsd-arm64': 4.46.2 1160 - '@rollup/rollup-freebsd-x64': 4.46.2 1161 - '@rollup/rollup-linux-arm-gnueabihf': 4.46.2 1162 - '@rollup/rollup-linux-arm-musleabihf': 4.46.2 1163 - '@rollup/rollup-linux-arm64-gnu': 4.46.2 1164 - '@rollup/rollup-linux-arm64-musl': 4.46.2 1165 - '@rollup/rollup-linux-loongarch64-gnu': 4.46.2 1166 - '@rollup/rollup-linux-ppc64-gnu': 4.46.2 1167 - '@rollup/rollup-linux-riscv64-gnu': 4.46.2 1168 - '@rollup/rollup-linux-riscv64-musl': 4.46.2 1169 - '@rollup/rollup-linux-s390x-gnu': 4.46.2 1170 - '@rollup/rollup-linux-x64-gnu': 4.46.2 1171 - '@rollup/rollup-linux-x64-musl': 4.46.2 1172 - '@rollup/rollup-win32-arm64-msvc': 4.46.2 1173 - '@rollup/rollup-win32-ia32-msvc': 4.46.2 1174 - '@rollup/rollup-win32-x64-msvc': 4.46.2 1245 + '@rollup/rollup-android-arm-eabi': 4.52.5 1246 + '@rollup/rollup-android-arm64': 4.52.5 1247 + '@rollup/rollup-darwin-arm64': 4.52.5 1248 + '@rollup/rollup-darwin-x64': 4.52.5 1249 + '@rollup/rollup-freebsd-arm64': 4.52.5 1250 + '@rollup/rollup-freebsd-x64': 4.52.5 1251 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 1252 + '@rollup/rollup-linux-arm-musleabihf': 4.52.5 1253 + '@rollup/rollup-linux-arm64-gnu': 4.52.5 1254 + '@rollup/rollup-linux-arm64-musl': 4.52.5 1255 + '@rollup/rollup-linux-loong64-gnu': 4.52.5 1256 + '@rollup/rollup-linux-ppc64-gnu': 4.52.5 1257 + '@rollup/rollup-linux-riscv64-gnu': 4.52.5 1258 + '@rollup/rollup-linux-riscv64-musl': 4.52.5 1259 + '@rollup/rollup-linux-s390x-gnu': 4.52.5 1260 + '@rollup/rollup-linux-x64-gnu': 4.52.5 1261 + '@rollup/rollup-linux-x64-musl': 4.52.5 1262 + '@rollup/rollup-openharmony-arm64': 4.52.5 1263 + '@rollup/rollup-win32-arm64-msvc': 4.52.5 1264 + '@rollup/rollup-win32-ia32-msvc': 4.52.5 1265 + '@rollup/rollup-win32-x64-gnu': 4.52.5 1266 + '@rollup/rollup-win32-x64-msvc': 4.52.5 1175 1267 fsevents: 2.3.3 1176 1268 1177 1269 semver@6.3.1: {} 1178 1270 1179 - seroval-plugins@1.3.2(seroval@1.3.2): 1271 + seroval-plugins@1.3.3(seroval@1.3.2): 1180 1272 dependencies: 1181 1273 seroval: 1.3.2 1182 1274 1183 1275 seroval@1.3.2: {} 1184 1276 1185 - solid-js@1.9.7: 1277 + solid-js@1.9.10: 1186 1278 dependencies: 1187 1279 csstype: 3.1.3 1188 1280 seroval: 1.3.2 1189 - seroval-plugins: 1.3.2(seroval@1.3.2) 1281 + seroval-plugins: 1.3.3(seroval@1.3.2) 1190 1282 1191 - solid-refresh@0.6.3(solid-js@1.9.7): 1283 + solid-refresh@0.6.3(solid-js@1.9.10): 1192 1284 dependencies: 1193 - '@babel/generator': 7.28.0 1285 + '@babel/generator': 7.28.5 1194 1286 '@babel/helper-module-imports': 7.27.1 1195 - '@babel/types': 7.28.2 1196 - solid-js: 1.9.7 1287 + '@babel/types': 7.28.5 1288 + solid-js: 1.9.10 1197 1289 transitivePeerDependencies: 1198 1290 - supports-color 1199 1291 1200 1292 source-map-js@1.2.1: {} 1201 1293 1202 - typescript@5.8.3: {} 1294 + tinyglobby@0.2.15: 1295 + dependencies: 1296 + fdir: 6.5.0(picomatch@4.0.3) 1297 + picomatch: 4.0.3 1203 1298 1204 - update-browserslist-db@1.1.3(browserslist@4.25.1): 1299 + typescript@5.9.3: {} 1300 + 1301 + update-browserslist-db@1.1.4(browserslist@4.27.0): 1205 1302 dependencies: 1206 - browserslist: 4.25.1 1303 + browserslist: 4.27.0 1207 1304 escalade: 3.2.0 1208 1305 picocolors: 1.1.1 1209 1306 1210 - validate-html-nesting@1.2.3: {} 1211 - 1212 - vite-plugin-solid@2.11.8(solid-js@1.9.7)(vite@5.4.19): 1307 + vite-plugin-solid@2.11.10(solid-js@1.9.10)(vite@7.2.2): 1213 1308 dependencies: 1214 - '@babel/core': 7.28.0 1309 + '@babel/core': 7.28.5 1215 1310 '@types/babel__core': 7.20.5 1216 - babel-preset-solid: 1.9.6(@babel/core@7.28.0) 1311 + babel-preset-solid: 1.9.10(@babel/core@7.28.5)(solid-js@1.9.10) 1217 1312 merge-anything: 5.1.7 1218 - solid-js: 1.9.7 1219 - solid-refresh: 0.6.3(solid-js@1.9.7) 1220 - vite: 5.4.19 1221 - vitefu: 1.1.1(vite@5.4.19) 1313 + solid-js: 1.9.10 1314 + solid-refresh: 0.6.3(solid-js@1.9.10) 1315 + vite: 7.2.2 1316 + vitefu: 1.1.1(vite@7.2.2) 1222 1317 transitivePeerDependencies: 1223 1318 - supports-color 1224 1319 1225 - vite@5.4.19: 1320 + vite@7.2.2: 1226 1321 dependencies: 1227 - esbuild: 0.21.5 1322 + esbuild: 0.25.12 1323 + fdir: 6.5.0(picomatch@4.0.3) 1324 + picomatch: 4.0.3 1228 1325 postcss: 8.5.6 1229 - rollup: 4.46.2 1326 + rollup: 4.52.5 1327 + tinyglobby: 0.2.15 1230 1328 optionalDependencies: 1231 1329 fsevents: 2.3.3 1232 1330 1233 - vitefu@1.1.1(vite@5.4.19): 1331 + vitefu@1.1.1(vite@7.2.2): 1234 1332 optionalDependencies: 1235 - vite: 5.4.19 1333 + vite: 7.2.2 1236 1334 1237 1335 yallist@3.1.1: {}
+1 -1
public/icon/angle-down-solid.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M201.4 374.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 306.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z"/></svg> 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#fff" d="M201.4 374.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 306.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z"/></svg>
+1 -1
public/icon/angle-up-solid.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M201.4 137.4c12.5-12.5 32.8-12.5 45.3 0l160 160c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L224 205.3 86.6 342.6c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3l160-160z"/></svg> 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#fff" d="M201.4 137.4c12.5-12.5 32.8-12.5 45.3 0l160 160c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L224 205.3 86.6 342.6c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3l160-160z"/></svg>
+1 -1
public/icon/arrow-left-solid.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M9.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.2 288 416 288c17.7 0 32-14.3 32-32s-14.3-32-32-32l-306.7 0L214.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg> 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#fff" d="M9.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.2 288 416 288c17.7 0 32-14.3 32-32s-14.3-32-32-32l-306.7 0L214.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg>
+1 -1
public/icon/arrow-right-solid.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M438.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-160-160c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.8 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l306.7 0L233.4 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l160-160z"/></svg> 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#fff" d="M438.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-160-160c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.8 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l306.7 0L233.4 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l160-160z"/></svg>
+1 -1
public/icon/arrows-rotate-solid.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M105.1 202.6c7.7-21.8 20.2-42.3 37.8-59.8c62.5-62.5 163.8-62.5 226.3 0L386.3 160H352c-17.7 0-32 14.3-32 32s14.3 32 32 32H463.5c0 0 0 0 0 0h.4c17.7 0 32-14.3 32-32V80c0-17.7-14.3-32-32-32s-32 14.3-32 32v35.2L414.4 97.6c-87.5-87.5-229.3-87.5-316.8 0C73.2 122 55.6 150.7 44.8 181.4c-5.9 16.7 2.9 34.9 19.5 40.8s34.9-2.9 40.8-19.5zM39 289.3c-5 1.5-9.8 4.2-13.7 8.2c-4 4-6.7 8.8-8.1 14c-.3 1.2-.6 2.5-.8 3.8c-.3 1.7-.4 3.4-.4 5.1V432c0 17.7 14.3 32 32 32s32-14.3 32-32V396.9l17.6 17.5 0 0c87.5 87.4 229.3 87.4 316.7 0c24.4-24.4 42.1-53.1 52.9-83.7c5.9-16.7-2.9-34.9-19.5-40.8s-34.9 2.9-40.8 19.5c-7.7 21.8-20.2 42.3-37.8 59.8c-62.5 62.5-163.8 62.5-226.3 0l-.1-.1L125.6 352H160c17.7 0 32-14.3 32-32s-14.3-32-32-32H48.4c-1.6 0-3.2 .1-4.8 .3s-3.1 .5-4.6 1z"/></svg> 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#fff" d="M105.1 202.6c7.7-21.8 20.2-42.3 37.8-59.8c62.5-62.5 163.8-62.5 226.3 0L386.3 160H352c-17.7 0-32 14.3-32 32s14.3 32 32 32H463.5c0 0 0 0 0 0h.4c17.7 0 32-14.3 32-32V80c0-17.7-14.3-32-32-32s-32 14.3-32 32v35.2L414.4 97.6c-87.5-87.5-229.3-87.5-316.8 0C73.2 122 55.6 150.7 44.8 181.4c-5.9 16.7 2.9 34.9 19.5 40.8s34.9-2.9 40.8-19.5zM39 289.3c-5 1.5-9.8 4.2-13.7 8.2c-4 4-6.7 8.8-8.1 14c-.3 1.2-.6 2.5-.8 3.8c-.3 1.7-.4 3.4-.4 5.1V432c0 17.7 14.3 32 32 32s32-14.3 32-32V396.9l17.6 17.5 0 0c87.5 87.4 229.3 87.4 316.7 0c24.4-24.4 42.1-53.1 52.9-83.7c5.9-16.7-2.9-34.9-19.5-40.8s-34.9 2.9-40.8 19.5c-7.7 21.8-20.2 42.3-37.8 59.8c-62.5 62.5-163.8 62.5-226.3 0l-.1-.1L125.6 352H160c17.7 0 32-14.3 32-32s-14.3-32-32-32H48.4c-1.6 0-3.2 .1-4.8 .3s-3.1 .5-4.6 1z"/></svg>
+1 -1
public/icon/caret-down-solid.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M137.4 374.6c12.5 12.5 32.8 12.5 45.3 0l128-128c9.2-9.2 11.9-22.9 6.9-34.9s-16.6-19.8-29.6-19.8L32 192c-12.9 0-24.6 7.8-29.6 19.8s-2.2 25.7 6.9 34.9l128 128z"/></svg> 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#fff" d="M137.4 374.6c12.5 12.5 32.8 12.5 45.3 0l128-128c9.2-9.2 11.9-22.9 6.9-34.9s-16.6-19.8-29.6-19.8L32 192c-12.9 0-24.6 7.8-29.6 19.8s-2.2 25.7 6.9 34.9l128 128z"/></svg>
+1 -1
public/icon/check-solid.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M438.6 105.4c12.5 12.5 12.5 32.8 0 45.3l-256 256c-12.5 12.5-32.8 12.5-45.3 0l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L160 338.7 393.4 105.4c12.5-12.5 32.8-12.5 45.3 0z"/></svg> 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#fff" d="M438.6 105.4c12.5 12.5 12.5 32.8 0 45.3l-256 256c-12.5 12.5-32.8 12.5-45.3 0l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L160 338.7 393.4 105.4c12.5-12.5 32.8-12.5 45.3 0z"/></svg>
+1 -1
public/icon/clock-regular.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M464 256A208 208 0 1 1 48 256a208 208 0 1 1 416 0zM0 256a256 256 0 1 0 512 0A256 256 0 1 0 0 256zM232 120l0 136c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2 280 120c0-13.3-10.7-24-24-24s-24 10.7-24 24z"/></svg> 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#fff" d="M464 256A208 208 0 1 1 48 256a208 208 0 1 1 416 0zM0 256a256 256 0 1 0 512 0A256 256 0 1 0 0 256zM232 120l0 136c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2 280 120c0-13.3-10.7-24-24-24s-24 10.7-24 24z"/></svg>
+1 -1
public/icon/copy-solid.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M208 0H332.1c12.7 0 24.9 5.1 33.9 14.1l67.9 67.9c9 9 14.1 21.2 14.1 33.9V336c0 26.5-21.5 48-48 48H208c-26.5 0-48-21.5-48-48V48c0-26.5 21.5-48 48-48zM48 128h80v64H64V448H256V416h64v48c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V176c0-26.5 21.5-48 48-48z"/></svg> 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#fff" d="M208 0H332.1c12.7 0 24.9 5.1 33.9 14.1l67.9 67.9c9 9 14.1 21.2 14.1 33.9V336c0 26.5-21.5 48-48 48H208c-26.5 0-48-21.5-48-48V48c0-26.5 21.5-48 48-48zM48 128h80v64H64V448H256V416h64v48c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V176c0-26.5 21.5-48 48-48z"/></svg>
+1
public/icon/download-solid-full.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path fill="#fff" d="M352 96C352 78.3 337.7 64 320 64C302.3 64 288 78.3 288 96L288 306.7L246.6 265.3C234.1 252.8 213.8 252.8 201.3 265.3C188.8 277.8 188.8 298.1 201.3 310.6L297.3 406.6C309.8 419.1 330.1 419.1 342.6 406.6L438.6 310.6C451.1 298.1 451.1 277.8 438.6 265.3C426.1 252.8 405.8 252.8 393.3 265.3L352 306.7L352 96zM160 384C124.7 384 96 412.7 96 448L96 480C96 515.3 124.7 544 160 544L480 544C515.3 544 544 515.3 544 480L544 448C544 412.7 515.3 384 480 384L433.1 384L376.5 440.6C345.3 471.8 294.6 471.8 263.4 440.6L206.9 384L160 384zM464 440C477.3 440 488 450.7 488 464C488 477.3 477.3 488 464 488C450.7 488 440 477.3 440 464C440 450.7 450.7 440 464 440z"/></svg>
+1
public/icon/gear-solid-full.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path fill="#fff" d="M259.1 73.5C262.1 58.7 275.2 48 290.4 48L350.2 48C365.4 48 378.5 58.7 381.5 73.5L396 143.5C410.1 149.5 423.3 157.2 435.3 166.3L503.1 143.8C517.5 139 533.3 145 540.9 158.2L570.8 210C578.4 223.2 575.7 239.8 564.3 249.9L511 297.3C511.9 304.7 512.3 312.3 512.3 320C512.3 327.7 511.8 335.3 511 342.7L564.4 390.2C575.8 400.3 578.4 417 570.9 430.1L541 481.9C533.4 495 517.6 501.1 503.2 496.3L435.4 473.8C423.3 482.9 410.1 490.5 396.1 496.6L381.7 566.5C378.6 581.4 365.5 592 350.4 592L290.6 592C275.4 592 262.3 581.3 259.3 566.5L244.9 496.6C230.8 490.6 217.7 482.9 205.6 473.8L137.5 496.3C123.1 501.1 107.3 495.1 99.7 481.9L69.8 430.1C62.2 416.9 64.9 400.3 76.3 390.2L129.7 342.7C128.8 335.3 128.4 327.7 128.4 320C128.4 312.3 128.9 304.7 129.7 297.3L76.3 249.8C64.9 239.7 62.3 223 69.8 209.9L99.7 158.1C107.3 144.9 123.1 138.9 137.5 143.7L205.3 166.2C217.4 157.1 230.6 149.5 244.6 143.4L259.1 73.5zM320.3 400C364.5 399.8 400.2 363.9 400 319.7C399.8 275.5 363.9 239.8 319.7 240C275.5 240.2 239.8 276.1 240 320.3C240.2 364.5 276.1 400.2 320.3 400z"/></svg>
+1
public/icon/layer-group-solid-full.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path fill="#fff" d="M296.5 69.2C311.4 62.3 328.6 62.3 343.5 69.2L562.1 170.2C570.6 174.1 576 182.6 576 192C576 201.4 570.6 209.9 562.1 213.8L343.5 314.8C328.6 321.7 311.4 321.7 296.5 314.8L77.9 213.8C69.4 209.8 64 201.3 64 192C64 182.7 69.4 174.1 77.9 170.2L296.5 69.2zM112.1 282.4L276.4 358.3C304.1 371.1 336 371.1 363.7 358.3L528 282.4L562.1 298.2C570.6 302.1 576 310.6 576 320C576 329.4 570.6 337.9 562.1 341.8L343.5 442.8C328.6 449.7 311.4 449.7 296.5 442.8L77.9 341.8C69.4 337.8 64 329.3 64 320C64 310.7 69.4 302.1 77.9 298.2L112 282.4zM77.9 426.2L112 410.4L276.3 486.3C304 499.1 335.9 499.1 363.6 486.3L527.9 410.4L562 426.2C570.5 430.1 575.9 438.6 575.9 448C575.9 457.4 570.5 465.9 562 469.8L343.4 570.8C328.5 577.7 311.3 577.7 296.4 570.8L77.9 469.8C69.4 465.8 64 457.3 64 448C64 438.7 69.4 430.1 77.9 426.2z"/></svg>
+1 -1
public/icon/minus-solid.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M432 256c0 17.7-14.3 32-32 32L48 288c-17.7 0-32-14.3-32-32s14.3-32 32-32l352 0c17.7 0 32 14.3 32 32z"/></svg> 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#fff" d="M432 256c0 17.7-14.3 32-32 32L48 288c-17.7 0-32-14.3-32-32s14.3-32 32-32l352 0c17.7 0 32 14.3 32 32z"/></svg>
+1 -1
public/icon/sliders-solid.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M0 416c0 17.7 14.3 32 32 32l54.7 0c12.3 28.3 40.5 48 73.3 48s61-19.7 73.3-48L480 448c17.7 0 32-14.3 32-32s-14.3-32-32-32l-246.7 0c-12.3-28.3-40.5-48-73.3-48s-61 19.7-73.3 48L32 384c-17.7 0-32 14.3-32 32zm128 0a32 32 0 1 1 64 0 32 32 0 1 1 -64 0zM320 256a32 32 0 1 1 64 0 32 32 0 1 1 -64 0zm32-80c-32.8 0-61 19.7-73.3 48L32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l246.7 0c12.3 28.3 40.5 48 73.3 48s61-19.7 73.3-48l54.7 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-54.7 0c-12.3-28.3-40.5-48-73.3-48zM192 128a32 32 0 1 1 0-64 32 32 0 1 1 0 64zm73.3-64C253 35.7 224.8 16 192 16s-61 19.7-73.3 48L32 64C14.3 64 0 78.3 0 96s14.3 32 32 32l86.7 0c12.3 28.3 40.5 48 73.3 48s61-19.7 73.3-48L480 128c17.7 0 32-14.3 32-32s-14.3-32-32-32L265.3 64z"/></svg> 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#fff" d="M0 416c0 17.7 14.3 32 32 32l54.7 0c12.3 28.3 40.5 48 73.3 48s61-19.7 73.3-48L480 448c17.7 0 32-14.3 32-32s-14.3-32-32-32l-246.7 0c-12.3-28.3-40.5-48-73.3-48s-61 19.7-73.3 48L32 384c-17.7 0-32 14.3-32 32zm128 0a32 32 0 1 1 64 0 32 32 0 1 1 -64 0zM320 256a32 32 0 1 1 64 0 32 32 0 1 1 -64 0zm32-80c-32.8 0-61 19.7-73.3 48L32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l246.7 0c12.3 28.3 40.5 48 73.3 48s61-19.7 73.3-48l54.7 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-54.7 0c-12.3-28.3-40.5-48-73.3-48zM192 128a32 32 0 1 1 0-64 32 32 0 1 1 0 64zm73.3-64C253 35.7 224.8 16 192 16s-61 19.7-73.3 48L32 64C14.3 64 0 78.3 0 96s14.3 32 32 32l86.7 0c12.3 28.3 40.5 48 73.3 48s61-19.7 73.3-48L480 128c17.7 0 32-14.3 32-32s-14.3-32-32-32L265.3 64z"/></svg>
+1 -1
public/icon/square-regular.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M384 80c8.8 0 16 7.2 16 16V416c0 8.8-7.2 16-16 16H64c-8.8 0-16-7.2-16-16V96c0-8.8 7.2-16 16-16H384zM64 32C28.7 32 0 60.7 0 96V416c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V96c0-35.3-28.7-64-64-64H64z"/></svg> 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#fff" d="M384 80c8.8 0 16 7.2 16 16V416c0 8.8-7.2 16-16 16H64c-8.8 0-16-7.2-16-16V96c0-8.8 7.2-16 16-16H384zM64 32C28.7 32 0 60.7 0 96V416c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V96c0-35.3-28.7-64-64-64H64z"/></svg>
+1 -1
public/icon/trash-solid.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M135.2 17.7L128 32H32C14.3 32 0 46.3 0 64S14.3 96 32 96H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H320l-7.2-14.3C307.4 6.8 296.3 0 284.2 0H163.8c-12.1 0-23.2 6.8-28.6 17.7zM416 128H32L53.2 467c1.6 25.3 22.6 45 47.9 45H346.9c25.3 0 46.3-19.7 47.9-45L416 128z"/></svg> 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#fff" d="M135.2 17.7L128 32H32C14.3 32 0 46.3 0 64S14.3 96 32 96H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H320l-7.2-14.3C307.4 6.8 296.3 0 284.2 0H163.8c-12.1 0-23.2 6.8-28.6 17.7zM416 128H32L53.2 467c1.6 25.3 22.6 45 47.9 45H346.9c25.3 0 46.3-19.7 47.9-45L416 128z"/></svg>
+1 -1
public/icon/user-solid.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d="M224 256A128 128 0 1 0 224 0a128 128 0 1 0 0 256zm-45.7 48C79.8 304 0 383.8 0 482.3C0 498.7 13.3 512 29.7 512l388.6 0c16.4 0 29.7-13.3 29.7-29.7C448 383.8 368.2 304 269.7 304l-91.4 0z"/></svg> 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path fill="#fff" d="M224 256A128 128 0 1 0 224 0a128 128 0 1 0 0 256zm-45.7 48C79.8 304 0 383.8 0 482.3C0 498.7 13.3 512 29.7 512l388.6 0c16.4 0 29.7-13.3 29.7-29.7C448 383.8 368.2 304 269.7 304l-91.4 0z"/></svg>
+1 -1
public/icon/x-solid.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M376.6 84.5c11.3-13.6 9.5-33.8-4.1-45.1s-33.8-9.5-45.1 4.1L192 206 56.6 43.5C45.3 29.9 25.1 28.1 11.5 39.4S-3.9 70.9 7.4 84.5L150.3 256 7.4 427.5c-11.3 13.6-9.5 33.8 4.1 45.1s33.8 9.5 45.1-4.1L192 306 327.4 468.5c11.3 13.6 31.5 15.4 45.1 4.1s15.4-31.5 4.1-45.1L233.7 256 376.6 84.5z"/></svg> 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path fill="#fff" d="M376.6 84.5c11.3-13.6 9.5-33.8-4.1-45.1s-33.8-9.5-45.1 4.1L192 206 56.6 43.5C45.3 29.9 25.1 28.1 11.5 39.4S-3.9 70.9 7.4 84.5L150.3 256 7.4 427.5c-11.3 13.6-9.5 33.8 4.1 45.1s33.8 9.5 45.1-4.1L192 306 327.4 468.5c11.3 13.6 31.5 15.4 45.1 4.1s15.4-31.5 4.1-45.1L233.7 256 376.6 84.5z"/></svg>
+26 -6
src/Components/App.tsx
··· 1 - import { onMount } from "solid-js"; 2 - import anime from "animejs"; 1 + import { createSignal, onMount } from "solid-js"; 3 2 4 - import NavBar from "./NavBar"; 5 3 import PhotoList from "./PhotoList"; 6 4 import PhotoViewer from "./PhotoViewer"; 7 5 import SettingsMenu from "./SettingsMenu"; 6 + import { animate, utils } from "animejs"; 7 + import { listen } from "@tauri-apps/api/event"; 8 8 9 9 let App = () => { 10 + let [ errorText, setErrorText ] = createSignal(''); 11 + 10 12 onMount(() => { 11 - anime.set('.settings', 13 + utils.set('.settings', 12 14 { 13 15 display: 'none', 14 16 opacity: 0, 15 17 translateX: '500px' 16 18 }) 19 + 20 + listen<string>('vrcpm-error', ( ev ) => { 21 + setErrorText(ev.payload); 22 + 23 + utils.set('.error-notif', { translateX: '-50%', translateY: '-100px' }); 24 + animate('.error-notif', { 25 + ease: 'outElastic', 26 + opacity: 1, 27 + translateY: '0px' 28 + }); 29 + 30 + setTimeout(() => { 31 + animate('.error-notif', { 32 + ease: 'outElastic', 33 + opacity: 0, 34 + translateY: '-100px' 35 + }); 36 + }, 2000); 37 + }); 17 38 }) 18 39 19 40 return ( 20 41 <div class="container"> 21 - <NavBar /> 22 - 23 42 <PhotoList /> 24 43 <PhotoViewer /> 25 44 26 45 <SettingsMenu /> 27 46 28 47 <div class="copy-notif">Image Copied!</div> 48 + <div class="error-notif">{ errorText() }</div> 29 49 </div> 30 50 ); 31 51 }
-133
src/Components/Managers/AccountManager.tsx
··· 1 - import { invoke } from "@tauri-apps/api/core"; 2 - 3 - import { ProfileData } from "../Structs/ProfileData"; 4 - import { StorageData } from "../Structs/StorageData"; 5 - import { Accessor, createSignal, Setter } from "solid-js"; 6 - 7 - import { listen } from "@tauri-apps/api/event"; 8 - import { fetch } from "@tauri-apps/plugin-http"; 9 - 10 - export class AccountManager{ 11 - public Profile: Accessor<ProfileData | null>; 12 - public Storage: Accessor<StorageData | null>; 13 - 14 - public hasAccount: Accessor<boolean>; 15 - public isLoading: Accessor<boolean>; 16 - 17 - private _setProfile: Setter<ProfileData | null>; 18 - private _setStorage: Setter<StorageData | null>; 19 - 20 - private _setHasAccount: Setter<boolean>; 21 - private _setIsLoading: Setter<boolean>; 22 - 23 - private _loginEventCallbacks: Array<() => void> = []; 24 - 25 - private _emitLoginCallbacks(){ 26 - this._loginEventCallbacks.forEach(e => e()); 27 - } 28 - 29 - constructor(){ 30 - let [ hasAccount, setHasAccount ] = createSignal(false); 31 - let [ isLoading, setIsLoading ] = createSignal(true); 32 - 33 - let [ profile, setProfile ] = createSignal<ProfileData | null>(null); 34 - let [ storage, setStorage ] = createSignal<StorageData | null>(null); 35 - 36 - this.Profile = profile; 37 - this.Storage = storage; 38 - 39 - this.hasAccount = hasAccount; 40 - this.isLoading = isLoading; 41 - 42 - this._setProfile = setProfile; 43 - this._setStorage = setStorage; 44 - 45 - this._setHasAccount = setHasAccount; 46 - this._setIsLoading = setIsLoading; 47 - 48 - invoke('get_config_value_string', { key: 'token' }) 49 - .then(( token: any ) => { 50 - this.verifyToken(token); 51 - }) 52 - 53 - listen('auth-callback', ( event: any ) => { 54 - window.LoadingManager.SetLoading(""); 55 - 56 - let token = event.payload; 57 - this.verifyToken(token); 58 - }) 59 - 60 - listen('auth-denied', () => { 61 - window.LoadingManager.SetLoading(""); 62 - console.warn('Authetication Denied'); 63 - }) 64 - } 65 - 66 - private async verifyToken( token: string ){ 67 - if(!token){ 68 - this._setHasAccount(false); 69 - this._setIsLoading(false); 70 - 71 - return this._emitLoginCallbacks(); 72 - } 73 - 74 - let dat = await fetch('https://photos.phazed.xyz/api/v1/account?token='+token); 75 - if(dat.status !== 200){ 76 - this._setHasAccount(false); 77 - this._setIsLoading(false); 78 - 79 - return this._emitLoginCallbacks(); 80 - } 81 - 82 - let json = await dat.json(); 83 - 84 - let profile = new ProfileData(); 85 - let storage = new StorageData(); 86 - 87 - profile.id = json.user._id; 88 - profile.username = json.user.username; 89 - profile.avatar = json.user.avatar; 90 - profile.serverVersion = json.user.serverVersion; 91 - 92 - storage.used = json.user.used; 93 - storage.total = json.user.storage; 94 - storage.isSyncing = json.user.settings.enableSync; 95 - 96 - this._setProfile(profile); 97 - this._setStorage(storage); 98 - 99 - this._setHasAccount(true); 100 - this._setIsLoading(false); 101 - 102 - this._emitLoginCallbacks(); 103 - } 104 - 105 - public login(){ 106 - window.LoadingManager.SetLoading("Waiting for Authentication"); 107 - invoke('start_user_auth'); 108 - } 109 - 110 - public async logout(){ 111 - let dat = await fetch('https://photos.phazed.xyz/api/v1/deauth?token='+(await invoke('get_config_value_string', { key: 'token' }))!) 112 - if(dat.status !== 200) 113 - throw new Error(dat.statusText); 114 - 115 - let json = await dat.json(); 116 - if(!json.ok) 117 - throw new Error(json.error); 118 - 119 - invoke('set_config_value_string', { key: 'token', value: '' }); 120 - window.location.reload(); 121 - 122 - return json; 123 - } 124 - 125 - public async Refresh(){ 126 - let token: string = await invoke('get_config_value_string', { key: 'token' }); 127 - await this.verifyToken(token); 128 - } 129 - 130 - public onLoginFinish( cb: () => void ){ 131 - this._loginEventCallbacks.push(cb); 132 - } 133 - }
+19 -3
src/Components/Managers/PhotoListRenderingManager.tsx
··· 5 5 6 6 const MONTHS = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; 7 7 8 + let multilayerIcon = new Image(); 9 + multilayerIcon.src = '/icon/layer-group-solid-full.svg'; 10 + 8 11 export class PhotoListRenderingManager{ 9 12 private _layout: PhotoListRow[] = []; 10 13 private _canvas!: HTMLCanvasElement; ··· 22 25 23 26 let lastDateString = null; 24 27 let row = new PhotoListRow(); 25 - row.Height = 100; 28 + row.Height = 0; 26 29 27 30 for (let i = 0; i < window.PhotoManager.FilteredPhotos.length; i++) { 28 31 let photo = window.PhotoManager.FilteredPhotos[i]; ··· 60 63 61 64 public Render( ctx: CanvasRenderingContext2D, canvas: HTMLCanvasElement, scroll: number ){ 62 65 let currentY = 0; 63 - 66 + 64 67 // Loop through each row 65 68 for (let i = 0; i < this._layout.length; i++) { 66 69 let row = this._layout[i]; ··· 124 127 // ctx.strokeStyle = '#f00'; 125 128 // ctx.strokeRect((rowXPos - row.Width / 2) + canvas.width / 2, currentY - scroll, photo.scaledWidth!, row.Height); 126 129 127 - if(!photo.loaded) 130 + if(photo.error){ 131 + ctx.fillStyle = '#fff'; 132 + ctx.textAlign = 'center'; 133 + ctx.textBaseline = 'middle'; 134 + 135 + photo.x = (rowXPos - row.Width / 2) + canvas.width / 2; 136 + photo.y = currentY - scroll; 137 + 138 + ctx.font = '18px Rubik' 139 + ctx.fillText('Error loading image.', photo.x + photo.scaledWidth! / 2, photo.y + photo.scaledHeight! / 2); 140 + } else if(!photo.loaded) 128 141 // If the photo is not loaded, start a new task and load it in that task 129 142 setTimeout(() => photo.loadImage(), 1); 130 143 else{ ··· 136 149 // Photo is already loaded so we should draw it on the application 137 150 ctx.globalAlpha = photo.frames / 100; 138 151 ctx.drawImage(photo.image!, (rowXPos - row.Width / 2) + canvas.width / 2, currentY - scroll, photo.scaledWidth!, photo.scaledHeight!); 152 + 153 + if(photo.isMultiLayer) 154 + ctx.drawImage(multilayerIcon, ((rowXPos - row.Width / 2) + canvas.width / 2) + 5, (currentY - scroll) + 5, 20, 20); 139 155 140 156 if(photo.frames < 100) 141 157 photo.frames += 10;
+84 -16
src/Components/Managers/PhotoManager.tsx
··· 46 46 if(photoPaths.length <= Vars.MAX_PHOTOS_BULK_LOAD) 47 47 setHasBeenIndexed(true); 48 48 49 + let photoLayers: Photo[] = []; 50 + 49 51 photoPaths.forEach(( path: string, i: number ) => { 50 52 let photo 51 53 ··· 54 56 else 55 57 photo = new Photo(path, false, i); 56 58 57 - this.Photos.push(photo); 59 + if(!photo.legacy && photo.splitPath[4]){ 60 + photoLayers.push(photo); 61 + } else 62 + this.Photos.push(photo); 58 63 59 64 if(photoPaths.length <= Vars.MAX_PHOTOS_BULK_LOAD) 60 65 photo.loadMeta(); 61 66 }) 62 67 68 + photoLayers.forEach(photo => { 69 + let type = photo.splitPath[4]; 70 + photo.splitPath.pop(); 71 + 72 + let mainPhotoPath = photo.splitPath.join('_') + '.png'; 73 + let mainPhoto = this.Photos.find(x => x.path === mainPhotoPath); 74 + 75 + if(!mainPhoto) 76 + this.Photos.push(photo); 77 + else{ 78 + mainPhoto.isMultiLayer = true; 79 + 80 + switch(type){ 81 + case 'Player.png': 82 + mainPhoto.playerLayer = photo; 83 + break; 84 + case 'Environment.png': 85 + mainPhoto.environmentLayer = photo; 86 + break; 87 + } 88 + } 89 + }); 90 + 63 91 this.Photos = MergeSort(this.Photos); 92 + console.log(this.Photos[0]); 64 93 65 94 console.log(this.Photos.length + ' Photos found.'); 95 + 66 96 if(this.Photos.length === 0 || photoPaths.length > Vars.MAX_PHOTOS_BULK_LOAD){ 67 97 console.log('No photos found or over bulk load limit, Skipping loading stage.'); 68 98 ··· 75 105 76 106 listen('photo_meta_loaded', ( event: any ) => { 77 107 let data: PhotoMetadata = event.payload; 78 - 108 + 79 109 let photo = this.Photos.find(x => x.path === data.path); 80 110 if(!photo)return console.error('Cannot find photo.', data); 111 + // NOTE: this is triggered by multilayer photo layers loading their metadata 112 + // we don't need to store metadata of those photos as they inherit this 113 + // data from the main photo. 81 114 115 + photo.error = data.error; 82 116 this._lastLoaded = photo.index; 83 117 84 118 if(this._onLoadedMeta[photo.index]){ ··· 96 130 97 131 photo.metadata = data.metadata.split('\u0000').filter(x => x !== '')[1]; 98 132 this._amountLoaded++; 99 - 133 + 134 + photo.loadingMeta = false; 100 135 photo.metaLoaded = true; 101 136 photo.onMetaLoaded(); 137 + 138 + window.PhotoListRenderingManager.ComputeLayout(); 102 139 103 140 if(this._amountLoaded === this.Photos.length - 1 && !this.HasFirstLoaded){ 104 141 this.FilteredPhotos = this.Photos; ··· 110 147 111 148 listen('photo_create', async ( event: any ) => { 112 149 let photo = new Photo(event.payload, false, 0); 113 - 114 - this.Photos.forEach(p => p.index++); // Probably a really dumb way of doing this 115 - this.Photos.splice(0, 0, photo); 150 + 151 + if(photo.splitPath[4]){ 152 + let type = photo.splitPath[4]; 153 + photo.splitPath.pop(); 154 + 155 + let mainPhotoPath = photo.splitPath.join('_') + '.png'; 156 + let mainPhoto = this.Photos.find(x => x.path === mainPhotoPath); 157 + 158 + if(!mainPhoto){ 159 + this.Photos.forEach(p => p.index++); // Probably a really dumb way of doing this 160 + this.Photos.splice(0, 0, photo); 161 + } else{ 162 + mainPhoto.isMultiLayer = true; 163 + 164 + switch(type){ 165 + case 'Player.png': 166 + mainPhoto.playerLayer = photo; 167 + break; 168 + case 'Environment.png': 169 + mainPhoto.environmentLayer = photo; 170 + break; 171 + } 172 + } 173 + } else{ 174 + this.Photos.forEach(p => p.index++); // Probably a really dumb way of doing this 175 + this.Photos.splice(0, 0, photo); 176 + } 116 177 117 178 photo.onMetaLoaded = () => this.ReloadFilters(); 118 179 photo.loadMeta(); 119 - 120 - if(!window.SyncManager.IsSyncing() && window.AccountManager.Storage()?.isSyncing){ 121 - window.SyncManager.TriggerSync(); 122 - } 123 180 }) 124 - 181 + 125 182 listen('photo_remove', ( event: any ) => { 126 183 this.Photos = this.Photos.filter(x => x.path !== event.payload); 127 - this.FilteredPhotos = this.FilteredPhotos.filter(x => x.path !== event.payload); 128 - 184 + 129 185 if(event.payload === window.PhotoViewerManager.CurrentPhoto()?.path) 130 186 window.PhotoViewerManager.Close() 131 187 ··· 168 224 public ReloadFilters(){ 169 225 this.FilteredPhotos = []; 170 226 227 + if(this._filter === ''){ 228 + this.FilteredPhotos = this.Photos; 229 + window.PhotoListRenderingManager.ComputeLayout(); 230 + 231 + return; 232 + } 233 + 171 234 switch(this._filterType){ 172 235 case FilterType.USER: 173 236 this.Photos.map(p => { 174 237 if(p.metadata){ 175 238 try{ 176 239 let meta = JSON.parse(p.metadata); 177 - let photo = meta.players.find(( y: any ) => y.displayName.toLowerCase().includes(this._filter) || y.id === this._filter); 240 + let photo = meta.players.find(( y: any ) => 241 + y.displayName.toLowerCase().includes(this._filter) || 242 + y.id === this._filter 243 + ); 178 244 179 245 if(photo)this.FilteredPhotos.push(p); 180 246 } catch(e){} ··· 186 252 if(p.metadata){ 187 253 try{ 188 254 let meta = JSON.parse(p.metadata); 189 - let photo = meta.world.name.toLowerCase().includes(this._filter) || meta.world.id === this._filter; 190 - 255 + let photo = 256 + meta.world.name.toLowerCase().includes(this._filter) || 257 + meta.world.id === this._filter; 258 + 191 259 if(photo)this.FilteredPhotos.push(p); 192 260 } catch(e){} 193 261 }
-56
src/Components/Managers/SyncManager.tsx
··· 1 - import { invoke } from "@tauri-apps/api/core"; 2 - import { listen } from "@tauri-apps/api/event"; 3 - import { Accessor, createSignal, Setter } from "solid-js"; 4 - 5 - export class SyncManager{ 6 - private _setIsSyncing: Setter<boolean>; 7 - private _setSyncPhotoTotal: Setter<number>; 8 - private _setSyncPhotoTransfers: Setter<number>; 9 - private _setSyncType: Setter<string>; 10 - private _setSyncError: Setter<string>; 11 - 12 - public IsSyncing: Accessor<boolean>; 13 - public SyncPhotoTotal: Accessor<number>; 14 - public SyncPhotoTransfers: Accessor<number> 15 - public SyncType: Accessor<string>; 16 - public SyncError: Accessor<string>; 17 - 18 - constructor(){ 19 - [ this.IsSyncing, this._setIsSyncing ] = createSignal(false); 20 - [ this.SyncPhotoTotal, this._setSyncPhotoTotal ] = createSignal(-1); 21 - [ this.SyncPhotoTransfers, this._setSyncPhotoTransfers ] = createSignal(-1); 22 - [ this.SyncType, this._setSyncType ] = createSignal(""); 23 - [ this.SyncError, this._setSyncError ] = createSignal(""); 24 - 25 - listen('photos-upload-meta', ( e: any ) => { 26 - this._setIsSyncing(true); 27 - this._setSyncPhotoTotal(e.payload.photos_total); 28 - this._setSyncPhotoTransfers(e.payload.photos_total - e.payload.photos_uploading); 29 - this._setSyncType('Upload'); 30 - 31 - console.log(e.payload) 32 - }) 33 - 34 - listen('photos-download-meta', ( e: any ) => { 35 - this._setIsSyncing(true); 36 - this._setSyncPhotoTotal(e.payload.photos_total); 37 - this._setSyncPhotoTransfers(e.payload.photos_total - e.payload.photos_uploading); 38 - this._setSyncType('Download'); 39 - 40 - console.log(e.payload) 41 - }) 42 - 43 - listen('sync-finished', () => { 44 - this._setIsSyncing(false); 45 - }) 46 - 47 - listen('sync-failed', ( e: any ) => { 48 - this._setSyncError(e.payload); 49 - }) 50 - } 51 - 52 - public async TriggerSync(){ 53 - this._setIsSyncing(true); 54 - invoke('sync_photos', { token: (await invoke('get_config_value_string', { key: 'token' })) }); 55 - } 56 - }
+1
src/Components/Managers/ViewManager.tsx
··· 9 9 private _eventListeners: { from: ViewState, to: ViewState, cb: () => void }[] = []; 10 10 11 11 public ChangeState( state: ViewState ){ 12 + console.log('From: ' + this._state + ' To: ' + state); 12 13 this._eventListeners.filter(x => x.from === this._state && x.to === state).forEach(c => c.cb()); 13 14 this._state = state; 14 15 }
-153
src/Components/NavBar.tsx
··· 1 - import { invoke } from '@tauri-apps/api/core'; 2 - import { emit } from '@tauri-apps/api/event'; 3 - import { getCurrentWebviewWindow } from '@tauri-apps/api/webviewWindow'; 4 - import anime from 'animejs'; 5 - import { Show, onMount } from 'solid-js'; 6 - import { ViewState } from './Managers/ViewManager'; 7 - 8 - const appWindow = getCurrentWebviewWindow(); 9 - 10 - let NavBar = () => { 11 - let dropdownVisible = false; 12 - let inAnimation = false; 13 - let dropdown: HTMLElement; 14 - 15 - onMount(() => { 16 - anime.set(dropdown, { opacity: 0, translateX: -10 }); 17 - dropdown.style.display = 'none'; 18 - }) 19 - 20 - let setDropdownVisibility = ( visible: boolean ) => { 21 - if(inAnimation)return; 22 - 23 - if(dropdownVisible !== visible){ 24 - dropdownVisible = visible; 25 - inAnimation = true; 26 - 27 - if(visible){ 28 - dropdown.style.display = 'block'; 29 - 30 - anime({ 31 - targets: dropdown, 32 - opacity: 1, 33 - translateX: 0, 34 - easing: 'easeInOutQuad', 35 - duration: 250, 36 - complete: () => { 37 - inAnimation = false; 38 - } 39 - }) 40 - } else{ 41 - anime({ 42 - targets: dropdown, 43 - opacity: 0, 44 - translateX: -10, 45 - easing: 'easeInOutQuad', 46 - duration: 250, 47 - complete: () => { 48 - inAnimation = false; 49 - dropdown.style.display = 'none'; 50 - } 51 - }) 52 - } 53 - } 54 - } 55 - 56 - window.CloseAllPopups.push(() => setDropdownVisibility(false)); 57 - 58 - return ( 59 - <> 60 - <div class="navbar" data-tauri-drag-region> 61 - <div class="tabs" data-tauri-drag-region> 62 - <div class="nav-tab" onClick={() => { 63 - window.ViewManager.ChangeState(ViewState.PHOTO_LIST); 64 - anime( 65 - { 66 - targets: '.settings', 67 - opacity: 0, 68 - translateX: '500px', 69 - easing: 'easeInOutQuad', 70 - duration: 250, 71 - complete: () => { 72 - anime.set('.settings', { display: 'none' }); 73 - } 74 - }) 75 - }}>Photos</div> 76 - </div> 77 - <div class="nav-tab" style={{ width: '200px', "text-align": 'center', background: 'transparent' }} data-tauri-drag-region> 78 - <Show when={window.SyncManager.IsSyncing()}> 79 - <Show when={ window.SyncManager.SyncError() == "" } fallback={ "Error: " + window.SyncManager.SyncError() }> 80 - <div style={{ width: '100%', "text-align": 'center', 'font-size': '14px' }}> 81 - { window.SyncManager.SyncType() }ing: { window.SyncManager.SyncPhotoTransfers () } / { window.SyncManager.SyncPhotoTotal() }<br /> 82 - <div style={{ width: '80%', height: '2px', margin: 'auto', "margin-top": '5px', background: '#111' }}> 83 - <div style={{ height: '2px', width: (window.SyncManager.SyncPhotoTransfers() / window.SyncManager.SyncPhotoTotal()) * 100 + '%', background: '#00ccff' }}></div> 84 - </div> 85 - </div> 86 - </Show> 87 - </Show> 88 - </div> 89 - <div class="account" onClick={() => setDropdownVisibility(!dropdownVisible)}> 90 - <Show when={window.AccountManager.hasAccount()}> 91 - <div class="user-pfp" style={{ background: 92 - `url('https://cdn.phazed.xyz/id/avatars/${window.AccountManager.Profile()?.id}/${window.AccountManager.Profile()?.avatar}.png')` }}></div> 93 - </Show> 94 - <div class="icon"> 95 - <img draggable="false" width="24" height="24" src="/icon/caret-down-solid.svg"></img> 96 - </div> 97 - </div> 98 - <div class="control-lights"> 99 - <div class="light" onClick={() => appWindow.minimize()}> 100 - <img draggable="false" width="24" height="24" src="/icon/minus-solid.svg"></img> 101 - </div> 102 - <div class="light" onClick={() => appWindow.toggleMaximize()}> 103 - <img draggable="false" width="24" height="24" src="/icon/square-regular.svg"></img> 104 - </div> 105 - <div class="light" onClick={() => { appWindow.hide(); emit('hide-window'); } }> 106 - <img draggable="false" width="24" height="24" src="/icon/x-solid.svg"></img> 107 - </div> 108 - </div> 109 - </div> 110 - 111 - <div class="dropdown" ref={( el ) => dropdown = el}> 112 - <div class="dropdown-button" onClick={async () => { 113 - anime.set('.settings', { display: 'block' }); 114 - anime({ 115 - targets: '.settings', 116 - opacity: 1, 117 - translateX: '0px', 118 - easing: 'easeInOutQuad', 119 - duration: 250 120 - }) 121 - 122 - window.ViewManager.ChangeState(ViewState.SETTINGS); 123 - setDropdownVisibility(false); 124 - }}>Settings</div> 125 - 126 - <Show when={!window.AccountManager.hasAccount()} fallback={ 127 - <div class="dropdown-button" onClick={async () => { 128 - window.AccountManager.logout() 129 - .then(data => { 130 - console.log(data); 131 - setDropdownVisibility(false); 132 - }) 133 - .catch(e => { 134 - console.error(e); 135 - 136 - invoke('set_config_value_string', { key: 'token', value: '' }); 137 - window.location.reload(); 138 - 139 - setDropdownVisibility(false); 140 - }) 141 - }}>Sign Out</div> 142 - }> 143 - <div class="dropdown-button" onClick={() => { 144 - window.AccountManager.login(); 145 - setDropdownVisibility(false); 146 - }}>Sign In</div> 147 - </Show> 148 - </div> 149 - </> 150 - ) 151 - } 152 - 153 - export default NavBar;
+84 -66
src/Components/PhotoList.tsx
··· 1 - import { onCleanup, onMount } from "solid-js"; 1 + import { createSignal, onCleanup, onMount, Show } from "solid-js"; 2 2 import { listen } from '@tauri-apps/api/event'; 3 3 import { Window } from "@tauri-apps/api/window"; 4 4 5 - import anime from "animejs"; 6 5 import FilterMenu from "./FilterMenu"; 7 6 import { ViewState } from "./Managers/ViewManager"; 8 7 import { invoke } from "@tauri-apps/api/core"; 8 + import { animate, utils } from "animejs"; 9 9 10 10 enum ListPopup{ 11 11 FILTERS, ··· 13 13 } 14 14 15 15 let PhotoList = () => { 16 - let photoTreeLoadingContainer: HTMLElement; 17 - 18 16 let scrollToTop: HTMLElement; 19 17 let scrollToTopActive = false; 20 18 21 19 let photoContainer: HTMLCanvasElement; 22 - let photoContainerBG: HTMLCanvasElement; 23 20 24 21 let filterContainer: HTMLDivElement; 25 22 26 23 let ctx: CanvasRenderingContext2D; 27 - let ctxBG: CanvasRenderingContext2D; 28 24 29 25 let scroll: number = 0; 30 26 let targetScroll: number = 0; ··· 32 28 let quitRender: boolean = true; 33 29 34 30 let currentPopup = ListPopup.NONE; 31 + 32 + let [ updateAvailable, setUpdateAvailable ] = createSignal(false); 35 33 36 34 Window.getCurrent().isVisible().then(visible => { 37 35 quitRender = !visible; ··· 39 37 40 38 41 39 window.ViewManager.OnStateTransition(ViewState.PHOTO_LIST, ViewState.SETTINGS, () => { 42 - anime({ targets: photoContainer, opacity: 0, easing: 'easeInOutQuad', duration: 100 }); 40 + animate(photoContainer, { opacity: 0.5, filter: 'blur(10px)', easing: 'easeInOutQuad', duration: 100 }); 41 + animate('.filter-options', { opacity: 0, easing: 'easeInOutQuad', duration: 100 }); 42 + animate('.scroll-to-top', { opacity: 0, easing: 'easeInOutQuad', duration: 100 }); 43 43 }); 44 44 45 45 window.ViewManager.OnStateTransition(ViewState.SETTINGS, ViewState.PHOTO_LIST, () => { 46 - anime({ targets: photoContainer, opacity: 1, easing: 'easeInOutQuad', duration: 100 }); 46 + animate(photoContainer, { opacity: 1, filter: 'blur(0px)', easing: 'easeInOutQuad', duration: 100, onComplete: () => photoContainer.style.filter = '' }); 47 + animate('.filter-options', { opacity: 1, easing: 'easeInOutQuad', duration: 100 }); 48 + animate('.scroll-to-top', { opacity: 1, easing: 'easeInOutQuad', duration: 100 }); 47 49 }); 48 50 49 51 50 52 window.ViewManager.OnStateTransition(ViewState.PHOTO_LIST, ViewState.PHOTO_VIEWER, () => { 51 - anime({ targets: photoContainer, opacity: 0, easing: 'easeInOutQuad', duration: 100 }); 52 - anime({ targets: '.filter-options', opacity: 0, easing: 'easeInOutQuad', duration: 100 }); 53 - anime({ targets: '.reload-photos', opacity: 0, easing: 'easeInOutQuad', duration: 100 }); 53 + animate(photoContainer, { opacity: 0.5, filter: 'blur(10px)', easing: 'easeInOutQuad', duration: 100 }); 54 + animate('.filter-options', { opacity: 0, easing: 'easeInOutQuad', duration: 100 }); 55 + animate('.scroll-to-top', { opacity: 0, easing: 'easeInOutQuad', duration: 100 }); 54 56 }); 55 57 56 58 window.ViewManager.OnStateTransition(ViewState.PHOTO_VIEWER, ViewState.PHOTO_LIST, () => { 57 - anime({ targets: photoContainer, opacity: 1, easing: 'easeInOutQuad', duration: 100 }); 58 - anime({ targets: '.filter-options', opacity: 1, easing: 'easeInOutQuad', duration: 100 }); 59 - anime({ targets: '.reload-photos', opacity: 1, easing: 'easeInOutQuad', duration: 100 }); 59 + animate(photoContainer, { opacity: 1, filter: 'blur(0px)', easing: 'easeInOutQuad', duration: 100, onComplete: () => photoContainer.style.filter = '' }); 60 + animate('.filter-options', { opacity: 1, easing: 'easeInOutQuad', duration: 100 }); 61 + animate('.scroll-to-top', { opacity: 1, easing: 'easeInOutQuad', duration: 100 }); 60 62 }); 61 63 62 64 ··· 70 72 photoContainer.width = window.innerWidth; 71 73 photoContainer.height = window.innerHeight; 72 74 73 - photoContainerBG.width = window.innerWidth; 74 - photoContainerBG.height = window.innerHeight; 75 - 76 75 window.PhotoListRenderingManager.ComputeLayout(); 77 76 } 78 77 79 78 let closeCurrentPopup = () => { 80 79 switch(currentPopup){ 81 80 case ListPopup.FILTERS: 82 - anime({ 83 - targets: filterContainer!, 81 + animate(filterContainer!, { 84 82 opacity: 0, 83 + translateY: '10px', 85 84 easing: 'easeInOutQuad', 86 85 duration: 100, 87 - complete: () => { 86 + onComplete: () => { 88 87 filterContainer!.style.display = 'none'; 89 88 currentPopup = ListPopup.NONE; 90 89 } ··· 102 101 103 102 if(!scrollToTopActive && scroll > photoContainer.height){ 104 103 scrollToTop.style.display = 'flex'; 105 - anime({ targets: scrollToTop, opacity: 1, translateY: '0px', easing: 'easeInOutQuad', duration: 100 }); 104 + animate(scrollToTop, { opacity: 1, translateY: '0px', easing: 'easeInOutQuad', duration: 100 }); 106 105 107 106 scrollToTopActive = true; 108 107 } else if(scrollToTopActive && scroll < photoContainer.height){ 109 - anime({ targets: scrollToTop, opacity: 0, translateY: '-10px', complete: () => scrollToTop.style.display = 'none', easing: 'easeInOutQuad', duration: 100 }); 108 + animate(scrollToTop, { opacity: 0, translateY: '-10px', onComplete: () => scrollToTop.style.display = 'none', easing: 'easeInOutQuad', duration: 100 }); 109 + 110 110 scrollToTopActive = false; 111 111 } 112 112 113 - if(!ctx || !ctxBG)return; 113 + if(!ctx)return; 114 114 ctx.clearRect(0, 0, photoContainer.width, photoContainer.height); 115 - ctxBG.clearRect(0, 0, photoContainerBG.width, photoContainerBG.height); 116 115 117 - scroll = scroll + (targetScroll - scroll) * 0.2; 116 + scroll = scroll + (targetScroll - scroll) * 0.1; 118 117 119 118 window.PhotoListRenderingManager.Render(ctx, photoContainer!, scroll); 120 119 ··· 127 126 128 127 ctx.fillText("It's looking empty in here! You have no photos :O", photoContainer.width / 2, photoContainer.height / 2); 129 128 } 130 - 131 - ctxBG.drawImage(photoContainer, 0, 0); 132 129 } 133 130 134 131 listen('hide-window', () => { ··· 143 140 photoContainer.width = window.innerWidth; 144 141 photoContainer.height = window.innerHeight; 145 142 146 - photoContainerBG.width = window.innerWidth; 147 - photoContainerBG.height = window.innerHeight; 148 - 149 143 if(window.PhotoManager.HasFirstLoaded){ 150 144 requestAnimationFrame(render); 151 145 window.PhotoManager.HasFirstLoaded = false; ··· 155 149 window.PhotoManager.OnLoadingFinished(() => { 156 150 invoke('close_splashscreen'); 157 151 158 - anime({ 159 - targets: photoTreeLoadingContainer, 160 - height: 0, 161 - easing: 'easeInOutQuad', 162 - duration: 500, 163 - opacity: 0, 164 - complete: () => { 165 - photoTreeLoadingContainer.style.display = 'none'; 166 - } 167 - }) 168 - 169 - anime({ 170 - targets: '.reload-photos', 152 + animate('.reload-photos', { 171 153 opacity: 1, 172 154 duration: 150, 173 155 easing: 'easeInOutQuad' 174 156 }) 175 157 176 158 window.PhotoListRenderingManager.SetCanvas(photoContainer!); 177 - window.PhotoListRenderingManager.ComputeLayout(); 178 - 179 159 render(); 180 160 }); 181 161 182 162 onMount(() => { 163 + // Update Stuff 164 + fetch('https://api.github.com/repos/phaze-the-dumb/VRChat-Photo-Manager/releases/latest') 165 + .then(data => { 166 + if(data.status !== 200)return; 167 + 168 + data.json().then(async data => { 169 + let currentVersion = await invoke('get_version'); 170 + setUpdateAvailable(data.tag_name !== currentVersion); 171 + }) 172 + }) 173 + .catch(e => { 174 + console.error(e); 175 + setUpdateAvailable(false); 176 + }) 177 + 178 + // Other Stuff 183 179 ctx = photoContainer.getContext('2d')!; 184 - ctxBG = photoContainerBG.getContext('2d')!; 185 180 186 181 window.PhotoManager.Load(); 187 182 188 - anime.set(scrollToTop, { opacity: 0, translateY: '-10px', display: 'none' }); 183 + utils.set(scrollToTop, { opacity: 0, translateY: '-10px', display: 'none' }); 189 184 190 185 photoContainer.onwheel = ( e: WheelEvent ) => { 191 - targetScroll += e.deltaY; 186 + targetScroll += e.deltaY * 2; 192 187 193 188 if(targetScroll < 0) 194 189 targetScroll = 0; ··· 199 194 200 195 photoContainer.width = window.innerWidth; 201 196 photoContainer.height = window.innerHeight; 202 - 203 - photoContainerBG.width = window.innerWidth; 204 - photoContainerBG.height = window.innerHeight; 205 197 206 198 photoContainer.onclick = ( e: MouseEvent ) => { 207 199 let photo = window.PhotoManager.FilteredPhotos.find(x => ··· 229 221 230 222 return ( 231 223 <div class="photo-list"> 232 - <div ref={filterContainer!} class="filter-container" style={{ 233 - height: window.PhotoManager.HasBeenIndexed() ? '83px' : '110px', 234 - width: window.PhotoManager.HasBeenIndexed() ? '600px' : '650px' 235 - }}> 224 + <div ref={filterContainer!} class="filter-container"> 236 225 <FilterMenu /> 237 226 </div> 238 227 239 - <div class="photo-tree-loading" ref={( el ) => photoTreeLoadingContainer = el}>Scanning Photo Tree...</div> 240 - 241 228 <div class="scroll-to-top" ref={( el ) => scrollToTop = el} onClick={() => targetScroll = 0}> 242 229 <div class="icon"> 243 230 <img draggable="false" src="/icon/angle-up-solid.svg"></img> 244 231 </div> 245 232 </div> 246 - <div class="reload-photos" onClick={() => window.ConfirmationBoxManager.SetConfirmationBox("Are you sure you want to reload all photos? This can cause the application to slow down while it is loading...", () => window.location.reload())}> 247 - <div class="icon" style={{ width: '17px' }}> 248 - <img draggable="false" width="17" height="17" src="/icon/arrows-rotate-solid.svg"></img> 249 - </div> 250 - </div> 251 233 252 234 <div class="filter-options"> 253 235 <div> ··· 257 239 258 240 filterContainer!.style.display = 'block'; 259 241 260 - anime({ 261 - targets: filterContainer!, 242 + animate(filterContainer!, { 262 243 opacity: 1, 244 + translateY: 0, 263 245 easing: 'easeInOutQuad', 264 246 duration: 100 265 247 }); 266 - }} class="icon" style={{ width: '20px', height: '20px', padding: '20px' }}> 248 + }} class="icon"> 267 249 <img draggable="false" style={{ width: "20px", height: "20px" }} src="/icon/sliders-solid.svg"></img> 268 250 </div> 269 251 <div class="icon-label">Filters</div> 270 252 </div> 253 + 254 + <div> 255 + <div onClick={() => { 256 + window.location.reload(); 257 + }} class="icon"> 258 + <img draggable="false" style={{ width: "20px", height: "20px" }} src="/icon/arrows-rotate-solid.svg"></img> 259 + </div> 260 + <div class="icon-label">Reload Photos</div> 261 + </div> 262 + 263 + <div> 264 + <div onClick={() => { 265 + utils.set('.settings', { display: 'block' }); 266 + animate('.settings', { 267 + opacity: 1, 268 + translateX: '0px', 269 + easing: 'easeInOutQuad', 270 + duration: 250 271 + }) 272 + 273 + window.ViewManager.ChangeState(ViewState.SETTINGS); 274 + }} class="icon"> 275 + <img draggable="false" style={{ width: "20px", height: "20px" }} src="/icon/gear-solid-full.svg"></img> 276 + </div> 277 + <div class="icon-label">Settings</div> 278 + </div> 279 + 280 + <Show when={updateAvailable()}> 281 + <div> 282 + <div onClick={() => { 283 + invoke('open_url', { url: 'https://github.com/phaze-the-dumb/VRChat-Photo-Manager/releases/latest' }); 284 + }} class="icon"> 285 + <img draggable="false" style={{ width: "20px", height: "20px" }} src="/icon/download-solid-full.svg"></img> 286 + </div> 287 + <div class="icon-label">Update Available</div> 288 + </div> 289 + </Show> 271 290 </div> 272 291 273 292 <canvas class="photo-container" ref={( el ) => photoContainer = el}></canvas> 274 - <canvas class="photo-container-bg" ref={( el ) => photoContainerBG = el}></canvas> 275 293 </div> 276 294 ) 277 295 }
+218 -110
src/Components/PhotoViewer.tsx
··· 1 1 import { For, Show, createEffect, onCleanup, onMount } from "solid-js"; 2 2 import { invoke } from '@tauri-apps/api/core'; 3 - import anime from 'animejs'; 4 3 import { WorldCache } from "./Structs/WorldCache"; 4 + import { animate, JSAnimation, utils } from "animejs"; 5 5 6 6 let PhotoViewer = () => { 7 7 let viewer: HTMLElement; ··· 21 21 let viewerContextMenuButtons: HTMLElement[] = []; 22 22 23 23 let allowedToOpenTray = false; 24 - let trayInAnimation = false; 25 24 26 25 let authorProfileButton: HTMLDivElement; 26 + 27 + let photoLayerManager!: HTMLDivElement; 27 28 28 29 let switchPhotoWithKey = ( e: KeyboardEvent ) => { 29 30 switch(e.key){ ··· 52 53 } 53 54 } 54 55 56 + let trayAnimation: JSAnimation[] = []; 57 + 55 58 let openTray = () => { 56 - if(trayOpen || trayInAnimation)return; 59 + if(trayOpen)return; 60 + trayOpen = true; 57 61 58 - trayOpen = true; 59 - trayInAnimation = true; 62 + trayAnimation.forEach(anim => anim.cancel()); 60 63 61 64 window.CloseAllPopups.forEach(p => p()); 62 - anime({ targets: photoTray, bottom: '0px', duration: 500 }); 65 + trayAnimation[0] = animate(photoTray, { bottom: '-150px', duration: 500, ease: 'outElastic' }); 63 66 64 - anime({ 65 - targets: photoControls, 67 + trayAnimation[1] = animate(photoControls, { 66 68 bottom: '160px', 69 + ease: 'outElastic', 67 70 scale: '0.75', 68 71 opacity: 0, 69 72 duration: 500, 70 - complete: () => { 73 + onComplete: () => { 71 74 photoControls.style.display = 'none'; 72 - trayInAnimation = false; 73 75 } 74 76 }); 75 77 76 78 photoTrayCloseBtn.style.display = 'flex'; 77 - anime({ 78 - targets: photoTrayCloseBtn, 79 + trayAnimation[2] = animate(photoTrayCloseBtn, { 79 80 bottom: '160px', 81 + ease: 'outElastic', 80 82 opacity: 1, 81 83 scale: 1, 82 84 duration: 500 ··· 84 86 } 85 87 86 88 let copyImage = () => { 87 - let canvas = document.createElement('canvas'); 88 - let ctx = canvas.getContext('2d')!; 89 - 90 - canvas.width = window.PhotoViewerManager.CurrentPhoto()?.width || 0; 91 - canvas.height = window.PhotoViewerManager.CurrentPhoto()?.height || 0; 92 - 93 - ctx.drawImage(imageViewer, 0, 0); 94 - 95 - canvas.toBlob(( blob ) => { 96 - navigator.clipboard.write([ 97 - new ClipboardItem({ 98 - 'image/png': blob! 99 - }) 100 - ]); 101 - 102 - canvas.remove(); 89 + let path; 90 + let photo = window.PhotoViewerManager.CurrentPhoto()!; 103 91 104 - anime.set('.copy-notif', { translateX: '-50%', translateY: '-100px' }); 105 - anime({ 106 - targets: '.copy-notif', 107 - opacity: 1, 108 - translateY: '0px' 109 - }); 92 + switch(layerManagerViewing){ 93 + case LayerManagerView.DEFAULT: 94 + path = photo.path; 95 + break; 96 + case LayerManagerView.ENVIRONMENT: 97 + path = photo.environmentLayer!.path; 98 + break; 99 + case LayerManagerView.PLAYER: 100 + path = photo.playerLayer!.path; 101 + break; 102 + } 110 103 111 - setTimeout(() => { 112 - anime({ 113 - targets: '.copy-notif', 114 - opacity: 0, 115 - translateY: '-100px' 104 + invoke('copy_image', { path }) 105 + .then(() => { 106 + utils.set('.copy-notif', { translateX: '-50%', translateY: '-100px' }); 107 + animate('.copy-notif', { 108 + ease: 'outElastic', 109 + opacity: 1, 110 + translateY: '0px' 116 111 }); 117 - }, 2000); 118 - }); 112 + 113 + setTimeout(() => { 114 + animate('.copy-notif', { 115 + ease: 'outElastic', 116 + opacity: 0, 117 + translateY: '-100px' 118 + }); 119 + }, 2000); 120 + }) 119 121 } 120 122 121 123 let closeTray = () => { 122 - if(!trayOpen || trayInAnimation)return; 123 - trayInAnimation = true; 124 + if(!trayOpen)return; 125 + trayOpen = false; 126 + 127 + trayAnimation.forEach(anim => anim.cancel()); 124 128 125 129 window.CloseAllPopups.forEach(p => p()); 126 - anime({ targets: photoTray, bottom: '-150px', duration: 500 }); 130 + trayAnimation[0] = animate(photoTray, { bottom: '-300px', duration: 500, ease: 'outElastic' }); 127 131 128 - anime({ 129 - targets: photoTrayCloseBtn, 132 + trayAnimation[2] = animate(photoTrayCloseBtn, { 130 133 bottom: '10px', 131 134 scale: '0.75', 135 + ease: 'outElastic', 132 136 opacity: 0, 133 137 duration: 500, 134 - complete: () => { 138 + onComplete: () => { 135 139 photoTrayCloseBtn.style.display = 'none'; 136 - trayOpen = false; 137 - trayInAnimation = false; 138 140 } 139 141 }); 140 142 141 143 photoControls.style.display = 'flex'; 142 - anime({ 143 - targets: photoControls, 144 + trayAnimation[1] = animate(photoControls, { 144 145 bottom: '10px', 146 + ease: 'outElastic', 145 147 opacity: 1, 146 148 scale: 1, 147 149 duration: 500, 148 150 }) 149 151 } 150 152 153 + let resizeImage = () => { 154 + let dstWidth; 155 + let dstHeight; 156 + 157 + let imgHeight = imageViewer.naturalHeight; 158 + let imgWidth = imageViewer.naturalWidth; 159 + 160 + if( 161 + imgWidth / window.innerWidth < 162 + imgHeight / window.innerHeight 163 + ) { 164 + dstWidth = imgWidth * (window.innerHeight / imgHeight); 165 + dstHeight = window.innerHeight; 166 + } else{ 167 + dstWidth = window.innerWidth; 168 + dstHeight = imgHeight * (window.innerWidth / imgWidth); 169 + } 170 + 171 + imageViewer.style.width = dstWidth + 'px'; 172 + imageViewer.style.height = dstHeight + 'px'; 173 + } 174 + 151 175 onMount(() => { 152 - anime.set(photoControls, { translateX: '-50%' }); 153 - anime.set(photoTrayCloseBtn, { translateX: '-50%', opacity: 0, scale: '0.75', bottom: '10px' }); 176 + utils.set(photoControls, { translateX: '-50%' }); 177 + utils.set(photoTrayCloseBtn, { translateX: '-50%', opacity: 0, scale: '0.75', bottom: '10px' }); 178 + utils.set(photoLayerManager, { translateY: '20px', opacity: 0, display: 'none' }); 154 179 155 180 window.addEventListener('keyup', switchPhotoWithKey); 181 + window.addEventListener('resize', () => resizeImage()); 156 182 157 183 let contextMenuOpen = false; 158 184 window.CloseAllPopups.push(() => { 159 185 contextMenuOpen = false; 160 - anime.set(viewerContextMenu, { opacity: 1, rotate: '0deg' }); 186 + utils.set(viewerContextMenu, { opacity: 1, rotate: '0deg' }); 161 187 162 - anime({ 163 - targets: viewerContextMenu, 188 + animate(viewerContextMenu, { 164 189 opacity: 0, 165 190 easing: 'easeInOutQuad', 166 191 rotate: '30deg', 167 192 duration: 100, 168 - complete: () => { 193 + onComplete: () => { 169 194 viewerContextMenu.style.display = 'none'; 170 195 } 171 196 }) 172 197 }); 173 198 199 + window.CloseAllPopups.push(() => { 200 + layerManagerOpen = false; 201 + if(layerManagerAnimation)layerManagerAnimation.cancel(); 202 + 203 + layerManagerAnimation = animate(photoLayerManager, { translateY: '20px', opacity: 0, duration: 100, onComplete: () => utils.set(photoLayerManager, { display: 'none' }) }); 204 + }); 205 + 174 206 viewerContextMenuButtons[0].onclick = async () => { 175 207 window.CloseAllPopups.forEach(p => p()); 176 208 // Context Menu -> Open file location ··· 189 221 if(contextMenuOpen){ 190 222 contextMenuOpen = false; 191 223 192 - anime.set(viewerContextMenu, { opacity: 1, rotate: '0deg' }); 224 + utils.set(viewerContextMenu, { opacity: 1, rotate: '0deg' }); 193 225 194 - anime({ 195 - targets: viewerContextMenu, 226 + animate(viewerContextMenu, { 196 227 opacity: 0, 197 228 rotate: '30deg', 198 229 easing: 'easeInOutQuad', 199 230 duration: 100, 200 - complete: () => { 231 + onComplete: () => { 201 232 viewerContextMenu.style.display = 'none'; 202 233 } 203 234 }) ··· 208 239 viewerContextMenu.style.left = e.clientX + 'px'; 209 240 viewerContextMenu.style.display = 'block'; 210 241 211 - anime.set(viewerContextMenu, { opacity: 0, rotate: '-30deg' }); 242 + utils.set(viewerContextMenu, { opacity: 0, rotate: '-30deg' }); 212 243 213 - anime({ 214 - targets: viewerContextMenu, 244 + animate(viewerContextMenu, { 215 245 opacity: 1, 216 246 rotate: '0deg', 217 247 easing: 'easeInOutQuad', ··· 230 260 imageViewer.src = (window.OS === "windows" ? "http://photo.localhost/" : 'photo://localhost/') + window.PhotoViewerManager.CurrentPhoto()?.path.split('\\').join('/') + "?full"; 231 261 imageViewer.crossOrigin = 'anonymous'; 232 262 233 - anime({ 234 - targets: imageViewer, 263 + imageViewer.onload = () => { resizeImage(); } 264 + 265 + animate(imageViewer, { 235 266 opacity: 1, 236 267 delay: 50, 237 268 duration: 150, ··· 291 322 let id = doc.getElementsByTagName('xmp:Author')[0]!.innerHTML; 292 323 293 324 authorProfileButton!.style.display = 'flex'; 294 - authorProfileButton!.onclick = () => 325 + authorProfileButton!.onclick = () => { 326 + console.log(id); 295 327 invoke('open_url', { url: 'https://vrchat.com/home/user/' + id }); 328 + } 296 329 } catch(e){ 297 330 console.error(e); 298 331 console.log('Couldn\'t decode metadata') ··· 305 338 } 306 339 } else{ 307 340 trayButton.style.display = 'none'; 341 + authorProfileButton!.style.display = 'none'; 342 + 308 343 closeTray(); 309 344 } 310 345 } ··· 315 350 if(photo && !isOpen){ 316 351 viewer.style.display = 'flex'; 317 352 318 - anime({ 319 - targets: viewer, 353 + animate(viewer, { 320 354 opacity: 1, 321 355 easing: 'easeInOutQuad', 322 356 duration: 150 323 357 }); 324 - 325 - anime({ 326 - targets: '.navbar', 327 - top: '-50px' 328 - }) 329 358 330 - anime.set('.prev-button', { left: '-50px', top: '50%' }); 331 - anime.set('.next-button', { right: '-50px', top: '50%' }); 359 + utils.set('.prev-button', { left: '-50px', top: '50%' }); 360 + utils.set('.next-button', { right: '-50px', top: '50%' }); 332 361 333 - anime({ targets: '.prev-button', left: '0', easing: 'easeInOutQuad', duration: 100 }); 334 - anime({ targets: '.next-button', right: '0', easing: 'easeInOutQuad', duration: 100 }); 362 + animate('.prev-button', { left: '0', easing: 'easeInOutQuad', duration: 100 }); 363 + animate('.next-button', { right: '0', easing: 'easeInOutQuad', duration: 100 }); 335 364 336 365 window.CloseAllPopups.forEach(p => p()); 337 366 } else if(!photo && isOpen){ 338 - anime({ 339 - targets: viewer, 367 + animate(viewer, { 340 368 opacity: 0, 341 369 easing: 'easeInOutQuad', 342 370 duration: 150, 343 - complete: () => { 371 + onComplete: () => { 344 372 viewer.style.display = 'none'; 345 373 } 346 374 }); 347 - 348 - anime({ 349 - targets: '.navbar', 350 - top: '0px' 351 - }) 352 375 353 376 window.CloseAllPopups.forEach(p => p()); 354 377 355 - anime({ targets: '.prev-button', top: '75%', easing: 'easeInOutQuad', duration: 100 }); 356 - anime({ targets: '.next-button', top: '75%', easing: 'easeInOutQuad', duration: 100 }); 378 + animate('.prev-button', { top: '75%', easing: 'easeInOutQuad', duration: 100 }); 379 + animate('.next-button', { top: '75%', easing: 'easeInOutQuad', duration: 100 }); 357 380 } 358 381 359 382 isOpen = photo != null; ··· 394 417 ) 395 418 } 396 419 420 + enum LayerManagerView{ 421 + DEFAULT, 422 + PLAYER, 423 + ENVIRONMENT 424 + } 425 + 426 + let layerManagerOpen = false; 427 + let layerManagerAnimation: null | JSAnimation = null; 428 + let layerManagerViewing = LayerManagerView.DEFAULT; 429 + 430 + let toggleLayerManager = () => { 431 + if(layerManagerOpen){ 432 + // Close 433 + layerManagerOpen = false; 434 + if(layerManagerAnimation)layerManagerAnimation.cancel(); 435 + 436 + layerManagerAnimation = animate(photoLayerManager, { translateY: '20px', opacity: 0, duration: 100, onComplete: () => utils.set(photoLayerManager, { display: 'none' }) }); 437 + } else{ 438 + // Open 439 + layerManagerOpen = true; 440 + if(layerManagerAnimation)layerManagerAnimation.cancel(); 441 + 442 + utils.set(photoLayerManager, { display: 'block' }); 443 + layerManagerAnimation = animate(photoLayerManager, { translateY: '0px', opacity: 1, duration: 100 }); 444 + } 445 + } 446 + 397 447 return ( 398 448 <div class="photo-viewer" ref={( el ) => viewer = el}> 449 + <div class="photo-layer-manager" ref={photoLayerManager}> 450 + <Show when={window.PhotoViewerManager.CurrentPhoto()?.playerLayer}> 451 + <div class="photo-layer-manager-layer" onClick={() => { 452 + let photo = window.PhotoViewerManager.CurrentPhoto()?.playerLayer; 453 + if(!photo)return; 454 + 455 + layerManagerViewing = LayerManagerView.PLAYER; 456 + 457 + imageViewer.src = (window.OS === "windows" ? "http://photo.localhost/" : 'photo://localhost/') + photo.path.split('\\').join('/') + "?full"; 458 + imageViewer.crossOrigin = 'anonymous'; 459 + }}>Player Layer</div> 460 + </Show> 461 + <Show when={window.PhotoViewerManager.CurrentPhoto()?.environmentLayer}> 462 + <div class="photo-layer-manager-layer" onClick={() => { 463 + let photo = window.PhotoViewerManager.CurrentPhoto()?.environmentLayer; 464 + if(!photo)return; 465 + 466 + layerManagerViewing = LayerManagerView.ENVIRONMENT; 467 + 468 + imageViewer.src = (window.OS === "windows" ? "http://photo.localhost/" : 'photo://localhost/') + photo.path.split('\\').join('/') + "?full"; 469 + imageViewer.crossOrigin = 'anonymous'; 470 + }}>Environment Layer</div> 471 + </Show> 472 + <div class="photo-layer-manager-layer" onClick={() => { 473 + let photo = window.PhotoViewerManager.CurrentPhoto(); 474 + if(!photo)return; 475 + 476 + layerManagerViewing = LayerManagerView.DEFAULT; 477 + 478 + imageViewer.src = (window.OS === "windows" ? "http://photo.localhost/" : 'photo://localhost/') + photo.path.split('\\').join('/') + "?full"; 479 + imageViewer.crossOrigin = 'anonymous'; 480 + }}>Default Layer</div> 481 + </div> 482 + 399 483 <div class="photo-context-menu" ref={( el ) => viewerContextMenu = el}> 400 484 <div ref={( el ) => viewerContextMenuButtons.push(el)}>Open file location</div> 401 485 <div ref={( el ) => viewerContextMenuButtons.push(el)}>Copy image</div> 402 486 </div> 403 487 404 488 <div class="viewer-close viewer-button" onClick={() => window.PhotoViewerManager.Close()}> 405 - <div class="icon" style={{ width: '10px', margin: '0' }}> 489 + <div class="icon-small" style={{ width: '10px', margin: '0' }}> 406 490 <img draggable="false" src="/icon/x-solid.svg"></img> 407 491 </div> 408 492 </div> 409 - <img class="image-container" ref={( el ) => imageViewer = el} /> 493 + 494 + <div style={{ 495 + width: '100%', 496 + height: '100%', 497 + display: 'flex', 498 + "justify-content": 'center', 499 + 'align-items': 'center' 500 + }}> 501 + <img class="image-container" ref={( el ) => imageViewer = el} /> 502 + </div> 410 503 411 504 <div class="prev-button" onClick={() => { 412 505 window.CloseAllPopups.forEach(p => p()); 413 506 window.PhotoViewerManager.PreviousPhoto(); 414 507 }}> 415 - <div class="icon" style={{ width: '15px', margin: '0' }}> 508 + <div class="icon-small" style={{ width: '15px', margin: '0' }}> 416 509 <img draggable="false" src="/icon/arrow-left-solid.svg"></img> 417 510 </div> 418 511 </div> ··· 421 514 window.CloseAllPopups.forEach(p => p()); 422 515 window.PhotoViewerManager.NextPhoto(); 423 516 }}> 424 - <div class="icon" style={{ width: '15px', margin: '0' }}> 517 + <div class="icon-small" style={{ width: '15px', margin: '0' }}> 425 518 <img draggable="false" src="/icon/arrow-right-solid.svg"></img> 426 519 </div> 427 520 </div> ··· 432 525 onClick={() => closeTray()} 433 526 ref={( el ) => photoTrayCloseBtn = el} 434 527 > 435 - <div class="icon" style={{ width: '12px', margin: '0' }}> 528 + <div class="icon-small" style={{ width: '12px', margin: '0' }}> 436 529 <img draggable="false" src="/icon/angle-down-solid.svg"></img> 437 530 </div> 438 531 </div> 439 532 440 533 <div class="control-buttons" ref={( el ) => photoControls = el}> 441 534 <div class="viewer-button" 442 - onMouseOver={( el ) => anime({ targets: el.currentTarget, width: '40px', height: '40px', 'margin-left': '15px', 'margin-right': '15px', 'margin-top': '-10px' })} 443 - onMouseLeave={( el ) => anime({ targets: el.currentTarget, width: '30px', height: '30px', 'margin-left': '20px', 'margin-right': '20px', 'margin-top': '0px' })} 535 + onMouseOver={( el ) => animate(el.currentTarget, { width: '40px', height: '40px', 'margin-left': '15px', 'margin-right': '15px', 'margin-top': '-10px' })} 536 + onMouseLeave={( el ) => animate(el.currentTarget, { width: '30px', height: '30px', 'margin-left': '20px', 'margin-right': '20px', 'margin-top': '0px' })} 444 537 onClick={() => { copyImage(); }}> 445 - <div class="icon" style={{ width: '12px', margin: '0' }}> 538 + <div class="icon-small" style={{ width: '12px', margin: '0' }}> 446 539 <img draggable="false" src="/icon/copy-solid.svg"></img> 447 540 </div> 448 541 </div> 449 542 <div class="viewer-button" style={{ width: '50px' }} 450 - onMouseOver={( el ) => anime({ targets: el.currentTarget, width: '70px', height: '30px', 'margin-left': '10px', 'margin-right': '10px' })} 451 - onMouseLeave={( el ) => anime({ targets: el.currentTarget, width: '50px', height: '30px', 'margin-left': '20px', 'margin-right': '20px' })} 543 + onMouseOver={( el ) => animate(el.currentTarget, { width: '70px', height: '30px', 'margin-left': '10px', 'margin-right': '10px' })} 544 + onMouseLeave={( el ) => animate(el.currentTarget, { width: '50px', height: '30px', 'margin-left': '20px', 'margin-right': '20px' })} 452 545 ref={( el ) => trayButton = el} 453 546 onClick={() => openTray()} 454 547 > 455 - <div class="icon" style={{ width: '12px', margin: '0' }}> 548 + <div class="icon-small" style={{ width: '12px', margin: '0' }}> 456 549 <img draggable="false" src="/icon/angle-up-solid.svg"></img> 457 550 </div> 458 551 </div> 459 552 460 553 <div class="viewer-button" 461 554 ref={authorProfileButton!} 462 - onMouseOver={( el ) => anime({ targets: el.currentTarget, width: '40px', height: '40px', 'margin-left': '15px', 'margin-right': '15px', 'margin-top': '-10px' })} 463 - onMouseLeave={( el ) => anime({ targets: el.currentTarget, width: '30px', height: '30px', 'margin-left': '20px', 'margin-right': '20px', 'margin-top': '0px' })} 555 + onMouseOver={( el ) => animate(el.currentTarget, { width: '40px', height: '40px', 'margin-left': '15px', 'margin-right': '15px', 'margin-top': '-10px' })} 556 + onMouseLeave={( el ) => animate(el.currentTarget, { width: '30px', height: '30px', 'margin-left': '20px', 'margin-right': '20px', 'margin-top': '0px' })} 464 557 > 465 - <div class="icon" style={{ width: '12px', margin: '0' }}> 558 + <div class="icon-small" style={{ width: '12px', margin: '0' }}> 466 559 <img draggable="false" src="/icon/user-solid.svg"></img> 467 560 </div> 468 561 </div> 469 562 563 + <Show when={window.PhotoViewerManager.CurrentPhoto()?.isMultiLayer}> 564 + <div class="viewer-button" 565 + onClick={toggleLayerManager} 566 + onMouseOver={( el ) => animate(el.currentTarget, { width: '40px', height: '40px', 'margin-left': '15px', 'margin-right': '15px', 'margin-top': '-10px' })} 567 + onMouseLeave={( el ) => animate(el.currentTarget, { width: '30px', height: '30px', 'margin-left': '20px', 'margin-right': '20px', 'margin-top': '0px' })} 568 + > 569 + <div class="icon-small" style={{ width: '17px', margin: '0' }}> 570 + <img draggable="false" src="/icon/layer-group-solid-full.svg"></img> 571 + </div> 572 + </div> 573 + </Show> 574 + 470 575 <div class="viewer-button" 471 - onMouseOver={( el ) => anime({ targets: el.currentTarget, width: '40px', height: '40px', 'margin-left': '15px', 'margin-right': '15px', 'margin-top': '-10px' })} 472 - onMouseLeave={( el ) => anime({ targets: el.currentTarget, width: '30px', height: '30px', 'margin-left': '20px', 'margin-right': '20px', 'margin-top': '0px' })} 473 - onClick={() => window.ConfirmationBoxManager.SetConfirmationBox("Are you sure you want to delete this photo?", async () => { invoke("delete_photo", { 474 - path: window.PhotoViewerManager.CurrentPhoto()?.path, 475 - token: (await invoke('get_config_value_string', { key: 'token' })) || "none", 476 - isSyncing: window.AccountManager.hasAccount() ? window.AccountManager.Storage()?.isSyncing : false 477 - }); 576 + onMouseOver={( el ) => animate(el.currentTarget, { width: '40px', height: '40px', 'margin-left': '15px', 'margin-right': '15px', 'margin-top': '-10px' })} 577 + onMouseLeave={( el ) => animate(el.currentTarget, { width: '30px', height: '30px', 'margin-left': '20px', 'margin-right': '20px', 'margin-top': '0px' })} 578 + onClick={() => window.ConfirmationBoxManager.SetConfirmationBox("Are you sure you want to delete this photo?", async () => { 579 + let photo = window.PhotoViewerManager.CurrentPhoto(); 580 + if(!photo)return; 581 + 582 + invoke("delete_photo", { path: photo.path }); 583 + 584 + if(photo.playerLayer)invoke("delete_photo", { path: photo.playerLayer.path }); 585 + if(photo.environmentLayer)invoke("delete_photo", { path: photo.environmentLayer.path }); 478 586 })}> 479 - <div class="icon" style={{ width: '12px', margin: '0' }}> 587 + <div class="icon-small" style={{ width: '12px', margin: '0' }}> 480 588 <img draggable="false" src="/icon/trash-solid.svg"></img> 481 589 </div> 482 590 </div>
+191 -208
src/Components/SettingsMenu.tsx
··· 1 1 import { onCleanup, onMount, Show } from "solid-js"; 2 2 import { bytesToFormatted } from "../utils"; 3 3 import { invoke } from '@tauri-apps/api/core'; 4 - import anime from "animejs"; 5 4 import { ViewState } from "./Managers/ViewManager"; 5 + import { animate, utils } from "animejs"; 6 6 7 7 let SettingsMenu = () => { 8 - let sliderBar: HTMLElement; 9 - let settingsContainer: HTMLElement; 10 - let currentButton = 0; 11 - let lastClickedButton = -1; 8 + // let sliderBar: HTMLElement; 9 + // let settingsContainer: HTMLElement; 10 + // let currentButton = 0; 11 + // let lastClickedButton = -1; 12 12 let finalPathConfirm: HTMLElement; 13 13 let finalPathInput: HTMLElement; 14 14 let finalPathData: string; ··· 17 17 let closeWithKey = ( e: KeyboardEvent ) => { 18 18 if(e.key === 'Escape'){ 19 19 window.ViewManager.ChangeState(ViewState.PHOTO_LIST); 20 - anime({ 21 - targets: '.settings', 20 + console.log('h'); 21 + animate('.settings',{ 22 22 opacity: 0, 23 23 translateX: '500px', 24 24 easing: 'easeInOutQuad', 25 25 duration: 250, 26 - complete: () => { 27 - anime.set('.settings', { display: 'none' }); 26 + onComplete: () => { 27 + console.log('h'); 28 + utils.set('.settings', { display: 'none' }); 28 29 } 29 30 }) 30 31 } ··· 34 35 if(await invoke('get_config_value_string', { key: 'transparent' }) === "true"){ 35 36 invoke('set_config_value_string', { key: 'transparent', value: 'true' }); 36 37 37 - anime({ targets: document.body, background: 'rgba(0, 0, 0, 0.5)', easing: 'linear', duration: 100 }); 38 - anime({ targets: '.settings', background: 'rgba(0, 0, 0, 0.5)', easing: 'linear', duration: 100 }); 38 + animate(document.body, { background: 'rgba(0, 0, 0, 0.5)', easing: 'linear', duration: 100 }); 39 + animate('.settings', { background: 'rgba(0, 0, 0, 0.5)', easing: 'linear', duration: 100 }); 39 40 } else{ 40 41 invoke('set_config_value_string', { key: 'transparent', value: 'false' }); 41 42 42 - anime({ targets: document.body, background: 'rgba(0, 0, 0, 1)', easing: 'linear', duration: 100 }); 43 - anime({ targets: '.settings', background: 'rgba(0, 0, 0, 0)', easing: 'linear', duration: 100 }); 43 + animate(document.body, { background: 'rgba(0, 0, 0, 1)', easing: 'linear', duration: 100 }); 44 + animate('.settings', { background: 'rgba(0, 0, 0, 0)', easing: 'linear', duration: 100 }); 44 45 } 45 46 46 - let sliderMouseDown = false; 47 - let mouseStartX = 0; 47 + // let sliderMouseDown = false; 48 + // let mouseStartX = 0; 48 49 49 - let width = window.innerWidth; 50 - let buttons = [ 370, 680 ]; 50 + // let width = window.innerWidth; 51 + // let buttons = [ 370, 680 ]; 51 52 52 - let sliderPos = width / 2 - buttons[currentButton]; 53 - let sliderScale = width / (buttons[1] - buttons[0]); 53 + // let sliderPos = width / 2 - buttons[currentButton]; 54 + // let sliderScale = width / (buttons[1] - buttons[0]); 54 55 55 - let render = () => { 56 - requestAnimationFrame(render); 56 + // let render = () => { 57 + // requestAnimationFrame(render); 57 58 58 - if(!sliderMouseDown){ 59 - sliderPos = sliderPos + (width / 2 - buttons[currentButton] - sliderPos) * 0.25; 60 - anime.set(sliderBar, { translateX: sliderPos }); 59 + // if(!sliderMouseDown){ 60 + // sliderPos = sliderPos + (width / 2 - buttons[currentButton] - sliderPos) * 0.25; 61 + // utils.set(sliderBar, { translateX: sliderPos }); 61 62 62 - settingsContainer.style.left = (sliderPos - (width / 2 - buttons[0])) * sliderScale + 'px'; 63 - } 64 - } 63 + // settingsContainer.style.left = (sliderPos - (width / 2 - buttons[0])) * sliderScale + 'px'; 64 + // } 65 + // } 65 66 66 - render(); 67 - anime.set(sliderBar, { translateX: sliderPos }); 67 + // render(); 68 + // utils.set(sliderBar, { translateX: sliderPos }); 68 69 69 - sliderBar.addEventListener('touchstart', ( e: TouchEvent ) => { 70 - sliderMouseDown = true; 71 - mouseStartX = e.touches[0].clientX; 72 - }) 70 + // sliderBar.addEventListener('touchstart', ( e: TouchEvent ) => { 71 + // sliderMouseDown = true; 72 + // mouseStartX = e.touches[0].clientX; 73 + // }) 73 74 74 - window.addEventListener('touchmove', ( e: TouchEvent ) => { 75 - if(sliderMouseDown){ 76 - anime.set(sliderBar, { translateX: sliderPos - (mouseStartX - e.touches[0].clientX) }); 77 - settingsContainer.style.left = (sliderPos - (mouseStartX - e.touches[0].clientX) - (width / 2 - buttons[0])) * sliderScale + 'px'; 78 - } 79 - }) 75 + // window.addEventListener('touchmove', ( e: TouchEvent ) => { 76 + // if(sliderMouseDown){ 77 + // utils.set(sliderBar, { translateX: sliderPos - (mouseStartX - e.touches[0].clientX) }); 78 + // settingsContainer.style.left = (sliderPos - (mouseStartX - e.touches[0].clientX) - (width / 2 - buttons[0])) * sliderScale + 'px'; 79 + // } 80 + // }) 80 81 81 82 window.addEventListener('keyup', closeWithKey); 82 83 83 - window.addEventListener('touchend', ( e: TouchEvent ) => { 84 - if(sliderMouseDown){ 85 - sliderPos = sliderPos - (mouseStartX - e.touches[0].clientX); 84 + // window.addEventListener('touchend', ( e: TouchEvent ) => { 85 + // if(sliderMouseDown){ 86 + // sliderPos = sliderPos - (mouseStartX - e.touches[0].clientX); 86 87 87 - anime.set(sliderBar, { translateX: sliderPos - (mouseStartX - e.touches[0].clientX) }); 88 - sliderMouseDown = false; 88 + // utils.set(sliderBar, { translateX: sliderPos - (mouseStartX - e.touches[0].clientX) }); 89 + // sliderMouseDown = false; 89 90 90 - if(Math.abs(mouseStartX - e.touches[0].clientX) > 50){ 91 - let shortestDistance = 0; 92 - let selectedButton = -1; 91 + // if(Math.abs(mouseStartX - e.touches[0].clientX) > 50){ 92 + // let shortestDistance = 0; 93 + // let selectedButton = -1; 93 94 94 - buttons.forEach(( pos, indx ) => { 95 - let dis = Math.abs(sliderPos - (width / 2 - pos)); 95 + // buttons.forEach(( pos, indx ) => { 96 + // let dis = Math.abs(sliderPos - (width / 2 - pos)); 96 97 97 - if(selectedButton === -1){ 98 - shortestDistance = dis; 99 - selectedButton = indx; 100 - } else if(shortestDistance > dis){ 101 - shortestDistance = dis; 102 - selectedButton = indx; 103 - } 104 - }) 98 + // if(selectedButton === -1){ 99 + // shortestDistance = dis; 100 + // selectedButton = indx; 101 + // } else if(shortestDistance > dis){ 102 + // shortestDistance = dis; 103 + // selectedButton = indx; 104 + // } 105 + // }) 105 106 106 - currentButton = selectedButton; 107 - } else if(lastClickedButton != -1){ 108 - currentButton = lastClickedButton; 109 - lastClickedButton = -1 110 - } 111 - } 112 - }) 107 + // currentButton = selectedButton; 108 + // } else if(lastClickedButton != -1){ 109 + // currentButton = lastClickedButton; 110 + // lastClickedButton = -1 111 + // } 112 + // } 113 + // }) 113 114 114 - sliderBar.addEventListener('mousedown', ( e: MouseEvent ) => { 115 - sliderMouseDown = true; 116 - mouseStartX = e.clientX; 117 - }); 115 + // sliderBar.addEventListener('mousedown', ( e: MouseEvent ) => { 116 + // sliderMouseDown = true; 117 + // mouseStartX = e.clientX; 118 + // }); 118 119 119 - window.addEventListener('mousemove', ( e: MouseEvent ) => { 120 - if(sliderMouseDown){ 121 - anime.set(sliderBar, { translateX: sliderPos - (mouseStartX - e.clientX) }); 122 - settingsContainer.style.left = sliderPos - (mouseStartX - e.clientX) + 'px'; 123 - settingsContainer.style.left = (sliderPos - (mouseStartX - e.clientX) - (width / 2 - buttons[0])) * sliderScale + 'px'; 124 - } 125 - }) 120 + // window.addEventListener('mousemove', ( e: MouseEvent ) => { 121 + // if(sliderMouseDown){ 122 + // utils.set(sliderBar, { translateX: sliderPos - (mouseStartX - e.clientX) }); 123 + // settingsContainer.style.left = sliderPos - (mouseStartX - e.clientX) + 'px'; 124 + // settingsContainer.style.left = (sliderPos - (mouseStartX - e.clientX) - (width / 2 - buttons[0])) * sliderScale + 'px'; 125 + // } 126 + // }) 126 127 127 - window.addEventListener('mouseup', ( e: MouseEvent ) => { 128 - if(sliderMouseDown){ 129 - sliderPos = sliderPos - (mouseStartX - e.clientX); 128 + // window.addEventListener('mouseup', ( e: MouseEvent ) => { 129 + // if(sliderMouseDown){ 130 + // sliderPos = sliderPos - (mouseStartX - e.clientX); 130 131 131 - anime.set(sliderBar, { translateX: sliderPos - (mouseStartX - e.clientX) }); 132 - sliderMouseDown = false; 132 + // utils.set(sliderBar, { translateX: sliderPos - (mouseStartX - e.clientX) }); 133 + // sliderMouseDown = false; 133 134 134 - if(Math.abs(mouseStartX - e.clientX) > 50){ 135 - let shortestDistance = 0; 136 - let selectedButton = -1; 135 + // if(Math.abs(mouseStartX - e.clientX) > 50){ 136 + // let shortestDistance = 0; 137 + // let selectedButton = -1; 137 138 138 - buttons.forEach(( pos, indx ) => { 139 - let dis = Math.abs(sliderPos - (width / 2 - pos)); 139 + // buttons.forEach(( pos, indx ) => { 140 + // let dis = Math.abs(sliderPos - (width / 2 - pos)); 140 141 141 - if(selectedButton === -1){ 142 - shortestDistance = dis; 143 - selectedButton = indx; 144 - } else if(shortestDistance > dis){ 145 - shortestDistance = dis; 146 - selectedButton = indx; 147 - } 148 - }) 142 + // if(selectedButton === -1){ 143 + // shortestDistance = dis; 144 + // selectedButton = indx; 145 + // } else if(shortestDistance > dis){ 146 + // shortestDistance = dis; 147 + // selectedButton = indx; 148 + // } 149 + // }) 149 150 150 - currentButton = selectedButton; 151 - } else if(lastClickedButton != -1){ 152 - currentButton = lastClickedButton; 153 - lastClickedButton = -1 154 - } 155 - } 156 - }) 151 + // currentButton = selectedButton; 152 + // } else if(lastClickedButton != -1){ 153 + // currentButton = lastClickedButton; 154 + // lastClickedButton = -1 155 + // } 156 + // } 157 + // }) 157 158 158 - window.addEventListener('resize', () => { 159 - width = window.innerWidth; 160 - sliderPos = width / 2 - buttons[currentButton]; 161 - sliderScale = width / (buttons[1] - buttons[0]); 159 + // window.addEventListener('resize', () => { 160 + // width = window.innerWidth; 161 + // sliderPos = width / 2 - buttons[currentButton]; 162 + // sliderScale = width / (buttons[1] - buttons[0]); 162 163 163 - anime.set(sliderBar, { translateX: sliderPos }); 164 - }) 164 + // utils.set(sliderBar, { translateX: sliderPos }); 165 + // }) 165 166 166 - sliderBar.addEventListener('wheel', ( e: WheelEvent ) => { 167 - if(e.deltaY > 0){ 168 - if(buttons[currentButton + 1]) 169 - currentButton++; 170 - } else{ 171 - if(buttons[currentButton - 1]) 172 - currentButton--; 173 - } 174 - }) 167 + // sliderBar.addEventListener('wheel', ( e: WheelEvent ) => { 168 + // if(e.deltaY > 0){ 169 + // if(buttons[currentButton + 1]) 170 + // currentButton++; 171 + // } else{ 172 + // if(buttons[currentButton - 1]) 173 + // currentButton--; 174 + // } 175 + // }) 175 176 }) 176 177 177 178 onCleanup(() => { ··· 180 181 181 182 return ( 182 183 <div class="settings"> 183 - <div class="settings-container" ref={( el ) => settingsContainer = el}> 184 + <div class="settings-close" onClick={() => { 185 + window.ViewManager.ChangeState(ViewState.PHOTO_LIST); 186 + animate('.settings', 187 + { 188 + opacity: 0, 189 + translateX: '500px', 190 + easing: 'easeInOutQuad', 191 + duration: 250, 192 + onComplete: () => { 193 + utils.set('.settings', { display: 'none' }); 194 + } 195 + }) 196 + }}> 197 + <div class="icon"><img draggable="false" src="/icon/x-solid.svg"></img></div> 198 + </div> 199 + {/* <div class="settings-container" ref={( el ) => settingsContainer = el}> */} 200 + <div class="settings-container"> 184 201 <div class="settings-block"> 185 202 <h1>Storage Settings</h1> 186 203 <p>{ window.PhotoManager.PhotoCount() } Photos ({ bytesToFormatted(window.PhotoManager.PhotoSize(), 0) })</p> ··· 199 216 200 217 <label for="start-in-bg-check"> 201 218 <div class="selection-box"> 202 - <div class="icon" style={{ width: '10px', margin: '0', display: 'inline-flex' }}> 219 + <div class="icon-small" style={{ margin: '0', display: 'inline-flex' }}> 203 220 <img draggable="false" width="10" height="10" src="/icon/check-solid.svg"></img> 204 221 </div> 205 222 </div> ··· 207 224 </div> 208 225 209 226 <div class="selector"> 210 - <input type="checkbox" id="start-with-win-check" ref={async ( el ) => { 211 - el.checked = await invoke('get_config_value_string', { key: 'start-with-win' }) === "true" ? true : false; 227 + <input type="checkbox" id="close-to-tray-check" ref={async ( el ) => { 228 + el.checked = await invoke('get_config_value_string', { key: 'close-to-tray' }) === "true" ? true : false; 212 229 }} onChange={( el ) => { 213 230 if(el.target.checked){ 214 - invoke('set_config_value_string', { key: 'start-with-win', value: 'true' }); 215 - invoke("start_with_win", { start: true }); 231 + invoke('set_config_value_string', { key: 'close-to-tray', value: 'true' }); 216 232 } else{ 217 - invoke('set_config_value_string', { key: 'start-with-win', value: 'false' }); 218 - invoke("start_with_win", { start: false }); 233 + invoke('set_config_value_string', { key: 'close-to-tray', value: 'false' }); 219 234 } 220 235 }} /> 221 - Start with windows 236 + Close to tray 222 237 223 - <label for="start-with-win-check"> 238 + <label for="close-to-tray-check"> 224 239 <div class="selection-box"> 225 - <div class="icon" style={{ width: '10px', margin: '0', display: 'inline-flex' }}> 240 + <div class="icon-small" style={{ margin: '0', display: 'inline-flex' }}> 226 241 <img draggable="false" width="10" height="10" src="/icon/check-solid.svg"></img> 227 242 </div> 228 243 </div> 229 244 </label> 230 245 </div> 231 246 247 + <Show when={window.OS === 'windows'}> 248 + <div class="selector"> 249 + <input type="checkbox" id="start-with-win-check" ref={async ( el ) => { 250 + el.checked = await invoke('get_config_value_string', { key: 'start-with-win' }) === "true" ? true : false; 251 + }} onChange={( el ) => { 252 + if(el.target.checked){ 253 + invoke('set_config_value_string', { key: 'start-with-win', value: 'true' }); 254 + invoke("start_with_win", { start: true }); 255 + } else{ 256 + invoke('set_config_value_string', { key: 'start-with-win', value: 'false' }); 257 + invoke("start_with_win", { start: false }); 258 + } 259 + }} /> 260 + Start with windows 261 + 262 + <label for="start-with-win-check"> 263 + <div class="selection-box"> 264 + <div class="icon-small" style={{ margin: '0', display: 'inline-flex' }}> 265 + <img draggable="false" width="10" height="10" src="/icon/check-solid.svg"></img> 266 + </div> 267 + </div> 268 + </label> 269 + </div> 270 + </Show> 271 + 232 272 <div class="selector"> 233 273 <input type="checkbox" id="transparent-check" ref={async ( el ) => { 234 274 el.checked = await invoke('get_config_value_string', { key: 'transparent' }) === "true" ? true : false; ··· 236 276 if(el.target.checked){ 237 277 invoke('set_config_value_string', { key: 'transparent', value: 'true' }); 238 278 239 - anime({ targets: document.body, background: 'rgba(0, 0, 0, 0.5)', easing: 'linear', duration: 100 }); 240 - anime({ targets: '.settings', background: 'rgba(0, 0, 0, 0.5)', easing: 'linear', duration: 100 }); 279 + animate(document.body, { background: 'rgba(0, 0, 0, 0.5)', easing: 'linear', duration: 100 }); 280 + animate('.settings', { background: 'rgba(0, 0, 0, 0.5)', easing: 'linear', duration: 100 }); 241 281 } else{ 242 282 invoke('set_config_value_string', { key: 'transparent', value: 'false' }); 243 283 244 - anime({ targets: document.body, background: 'rgba(0, 0, 0, 1)', easing: 'linear', duration: 100 }); 245 - anime({ targets: '.settings', background: 'rgba(0, 0, 0, 0)', easing: 'linear', duration: 100 }); 284 + animate(document.body, { background: 'rgba(0, 0, 0, 1)', easing: 'linear', duration: 100 }); 285 + animate('.settings', { background: 'rgba(0, 0, 0, 0)', easing: 'linear', duration: 100 }); 246 286 } 247 287 }} /> 248 288 Window Transparency 249 289 250 290 <label for="transparent-check"> 251 291 <div class="selection-box"> 252 - <div class="icon" style={{ width: '10px', margin: '0', display: 'inline-flex' }}> 292 + <div class="icon-small" style={{ margin: '0', display: 'inline-flex' }}> 253 293 <img draggable="false" width="10" height="10" src="/icon/check-solid.svg"></img> 254 294 </div> 255 295 </div> ··· 274 314 </span> 275 315 <span style={{ display: 'none' }} ref={( el ) => finalPathConfirm = el}> 276 316 <span class="path" style={{ color: 'green' }} onClick={async () => { 277 - finalPathPreviousData = finalPathData; 278 - finalPathConfirm.style.display = 'none'; 317 + let changed = await invoke('change_final_path', { newPath: finalPathData }); 279 318 280 - await invoke('change_final_path', { newPath: finalPathData }); 281 - await invoke('relaunch'); 319 + if(changed){ 320 + finalPathPreviousData = finalPathData; 321 + finalPathConfirm.style.display = 'none'; 282 322 283 - anime({ 284 - targets: '.settings', 285 - opacity: 0, 286 - translateX: '500px', 287 - easing: 'easeInOutQuad', 288 - duration: 250, 289 - complete: () => { 290 - anime.set('.settings', { display: 'none' }); 291 - } 292 - }) 323 + window.location.reload(); 293 324 294 - window.location.reload(); 325 + animate('.settings', { 326 + opacity: 0, 327 + translateX: '500px', 328 + easing: 'easeInOutQuad', 329 + duration: 250, 330 + onComplete: () => { 331 + utils.set('.settings', { display: 'none' }); 332 + } 333 + }) 334 + 335 + window.location.reload(); 336 + } 295 337 }}> 296 338 Save 297 339 </span> ··· 314 356 <br /> 315 357 <p>VRChat Photo Manager supports photos with extra metadata provided by VRCX.</p> 316 358 </div> 317 - <div class="settings-block"> 318 - <h1>Account Settings</h1> 319 - 320 - <Show when={window.AccountManager.hasAccount()} fallback={ 321 - <div> 322 - You aren't logged in. To enable cloud sync and sharing features you need to login to your PhazeID.<br /><br /> 323 - <div class="button" onClick={() => { 324 - window.AccountManager.login(); 325 - }}>Login</div> 326 - </div> 327 - }> 328 - <div class="account-profile"> 329 - <div class="account-pfp" style={{ background: `url('https://cdn.phazed.xyz/id/avatars/${window.AccountManager.Profile()?.id}/${window.AccountManager.Profile()?.avatar}.png')` }}></div> 330 - <div class="account-desc"> 331 - <div class="reload-photos" onClick={() => window.AccountManager.Refresh()} style={{ opacity: 1 }}> 332 - <div class="icon" style={{ width: '17px' }}> 333 - <img draggable="false" width="17" height="17" src="/icon/arrows-rotate-solid.svg"></img> 334 - </div> 335 - </div> 336 - <h2>{ window.AccountManager.Profile()?.username }</h2> 337 - 338 - <Show when={window.AccountManager.Storage()?.isSyncing}> 339 - <div class="storage-bar"> 340 - <div class="storage-bar-inner" style={{ width: ((window.AccountManager.Storage()!.used / window.AccountManager.Storage()!.total) * 100) + '%' }}></div> 341 - </div> 342 - 343 - <div> 344 - { bytesToFormatted(window.AccountManager.Storage()!.used, 0) } / { bytesToFormatted(window.AccountManager.Storage()!.total, 0) }<br /><br /> 345 - 346 - <span style={{ 'font-size': '10px' }}>Server Version: { window.AccountManager.Profile()?.serverVersion }</span> 347 - </div> 348 - </Show> 349 - </div> 350 - </div> 351 - 352 - <div class="account-notice">To enable cloud storage or get more storage please contact "_phaz" on discord</div> 353 - 354 - <div class="account-notice" style={{ display: 'flex' }}> 355 - <Show when={false} fallback={ "We are deleting your photos, please leave this window open while we delete them." }> 356 - <div class="button-danger" onClick={() => window.ConfirmationBoxManager.SetConfirmationBox("You are about to delete all your photos from the cloud, and disable syncing. This will NOT delete any local files.", async () => { 357 - // TODO: Rework all of this 358 - 359 - // props.setStorageInfo({ used: 0, storage: 0, sync: false }); 360 - // setDeletingPhotos(true); 361 - 362 - // fetch('https://photos-cdn.phazed.xyz/api/v1/allphotos', { 363 - // method: 'DELETE', 364 - // headers: { auth: (await invoke('get_config_value_string', { key: 'token' }))! } 365 - // }) 366 - // .then(data => data.json()) 367 - // .then(data => { 368 - // console.log(data); 369 - // setDeletingPhotos(false); 370 - // }) 371 - })}>Delete All Photos.</div> <div>This deletes all photos stored in the cloud and disables syncing.</div> 372 - </Show> 373 - </div> 374 - </Show> 375 - </div> 376 359 </div> 377 360 378 - <div class="slide-bar-tri"></div> 361 + {/* <div class="slide-bar-tri"></div> 379 362 <div class="slide-bar"> 380 363 <div class="inner-slide-bar" ref={( el ) => sliderBar = el}> 381 364 <div class="slider-dot"></div> ··· 386 369 <div class="slider-text" onMouseDown={() => lastClickedButton = 0}>Program Settings</div> 387 370 <div class="slider-dot"></div> 388 371 <div class="slider-dot"></div> 389 - <div class="slider-text" onMouseDown={() => lastClickedButton = 1}>Account Settings</div> 372 + <div class="slider-text" onMouseDown={() => lastClickedButton = 1}>Sync Settings</div> 390 373 <div class="slider-dot"></div> 391 374 <div class="slider-dot"></div> 392 375 <div class="slider-dot"></div> 393 376 <div class="slider-dot"></div> 394 377 <div class="slider-dot"></div> 395 378 </div> 396 - </div> 379 + </div> */} 397 380 </div> 398 381 ) 399 382 }
+43 -16
src/Components/Structs/Photo.ts
··· 6 6 export class Photo{ 7 7 path: string; 8 8 loaded: boolean = false; 9 + loadingMeta: boolean = false; 9 10 loading: boolean = false; 10 11 metaLoaded: boolean = false; 11 12 image?: HTMLCanvasElement; ··· 14 15 height?: number; 15 16 loadingRotate: number = 0; 16 17 metadata: any; 18 + 19 + error: boolean = false; 17 20 18 21 frames: number = 0; 19 22 shown: boolean = false; ··· 29 32 legacy: boolean = false; 30 33 index: number = 0; 31 34 35 + splitPath: string[]; 36 + 37 + playerLayer: Photo | null = null; 38 + environmentLayer: Photo | null = null; 39 + isMultiLayer = false; 40 + 32 41 public onMetaLoaded: () => void = () => {}; 33 42 34 43 constructor( path: string, isLegacy: boolean = false, i: number ){ ··· 37 46 this.index = i; 38 47 39 48 let split = this.path.split('_'); 49 + this.splitPath = split; 40 50 41 51 if(this.legacy) 42 52 this.dateString = split[2]; 43 53 else 44 54 this.dateString = split[1]; 45 55 56 + let timeString; 57 + if(this.legacy) 58 + timeString = split[3]; 59 + else 60 + timeString = split[2]; 61 + 46 62 let splitDateString = this.dateString.split('-'); 63 + let splitTimeString = timeString.split('-'); 47 64 48 65 this.date = new Date(); 49 66 ··· 51 68 this.date.setMonth(parseInt(splitDateString[1])); 52 69 this.date.setDate(parseInt(splitDateString[2])); 53 70 54 - let resSplit = split[3].split('x'); 71 + this.date.setHours(parseInt(splitTimeString[0])); 72 + this.date.setMinutes(parseInt(splitTimeString[1])); 73 + this.date.setSeconds(parseInt(splitTimeString[2])); 74 + 75 + let resSplit; 76 + if(this.legacy) 77 + resSplit = split[0].split('x') 78 + else 79 + resSplit = split[3].split('x') 80 + 81 + // let width = parseInt(resSplit[0]); 82 + // let height = parseInt(resSplit[1]); 83 + 84 + // if(!isNaN(width) || !isNaN(height)){ 85 + // this.width = width; 86 + // this.height = height; 55 87 56 - let width = parseInt(resSplit[0]); 57 - let height = parseInt(resSplit[1]); 88 + // let scale = Vars.PHOTO_HEIGHT / this.height; 58 89 59 - if(!isNaN(width) || !isNaN(height)){ 60 - this.width = width; 61 - this.height = height; 62 - 63 - let scale = Vars.PHOTO_HEIGHT / this.height; 64 - 65 - this.scaledWidth = this.width * scale; 66 - this.scaledHeight = Vars.PHOTO_HEIGHT; 67 - } 90 + // this.scaledWidth = this.width * scale; 91 + // this.scaledHeight = Vars.PHOTO_HEIGHT; 92 + // } 68 93 } 69 94 70 95 loadMeta(){ 96 + this.loadingMeta = true; 71 97 invoke('load_photo_meta', { photo: this.path }); 72 98 } 73 99 74 100 loadImage(){ 75 - if(this.loading || this.loaded || imagesLoading >= Vars.MAX_IMAGE_LOAD)return; 76 - 77 - // this.loadMeta(); 101 + if(this.loadingMeta || this.loading || this.loaded || imagesLoading >= Vars.MAX_IMAGE_LOAD)return; 78 102 if(!this.metaLoaded)return this.loadMeta(); 79 103 80 104 this.loading = true; 81 - 82 105 imagesLoading++; 83 106 84 107 this.image = document.createElement('canvas'); ··· 98 121 this.loading = false; 99 122 100 123 imagesLoading--; 124 + } 125 + 126 + this.imageEl.onerror = () => { 127 + console.log('Cannot load image'); 101 128 } 102 129 } 103 130 }
+1
src/Components/Structs/PhotoMetadata.ts
··· 3 3 height!: number; 4 4 metadata!: string; 5 5 path!: string; 6 + error!: boolean; 6 7 }
+72
src/css/filters.css
··· 1 + 2 + .filter-options{ 3 + position: fixed; 4 + top: 10px; 5 + left: 10px; 6 + } 7 + 8 + .filter-container{ 9 + display: none; 10 + position: fixed; 11 + bottom: 0; 12 + left: 0; 13 + width: 100vw; 14 + padding: 10px 200px; 15 + background: rgba(85, 85, 85, 0.904); 16 + transform: translateY(10px); 17 + color: #fff; 18 + text-align: center; 19 + box-shadow: #0005 0 0 10px; 20 + opacity: 0; 21 + z-index: 150; 22 + } 23 + 24 + .filter-container > .filter-title{ 25 + font-size: 30px; 26 + } 27 + 28 + .filter-type-select{ 29 + display: flex; 30 + justify-content: center; 31 + align-items: center; 32 + width: 75%; 33 + margin: auto; 34 + } 35 + 36 + .filter-type-select > div{ 37 + width: 100%; 38 + border: #fff 4px solid; 39 + border-left: #fff 2px solid; 40 + border-right: #fff 2px solid; 41 + padding: 5px 0; 42 + cursor: pointer; 43 + user-select: none; 44 + -webkit-user-select: none; 45 + } 46 + 47 + .filter-type-select > div:first-child{ 48 + border-left: #fff 4px solid; 49 + border-radius: 10px 0 0 10px; 50 + } 51 + 52 + .filter-type-select > div:last-child{ 53 + border-right: #fff 4px solid; 54 + border-radius: 0 10px 10px 0; 55 + } 56 + 57 + .filter-type-select > .selected-filter{ 58 + background: #00ccff55; 59 + } 60 + 61 + .filter-search{ 62 + margin-top: 10px; 63 + padding: 5px; 64 + border: #fff 4px solid; 65 + border-radius: 10px; 66 + background: #0008; 67 + outline: none; 68 + color: white; 69 + font-size: 15px; 70 + font-family: 'Rubik'; 71 + width: calc(75% - 18px); 72 + }
+38
src/css/icons.css
··· 1 + .icon{ 2 + width: 40px; 3 + height: 40px; 4 + padding: 10px; 5 + display: flex; 6 + align-items: center; 7 + justify-content: center; 8 + height: 100%; 9 + cursor: pointer; 10 + user-select: none; 11 + -webkit-user-select: none; 12 + } 13 + 14 + .icon-small{ 15 + display: flex; 16 + align-items: center; 17 + justify-content: center; 18 + height: 100%; 19 + } 20 + 21 + .icon-label{ 22 + margin-top: -20px; 23 + margin-right: -200px; 24 + width: 200px; 25 + color: white; 26 + pointer-events: none; 27 + transform: translate(20px, -9px); 28 + opacity: 0; 29 + transition: 0.25s; 30 + user-select: none; 31 + -webkit-user-select: none; 32 + } 33 + 34 + .icon:hover ~ .icon-label{ 35 + opacity: 1; 36 + transform: translate(40px, -9px); 37 + } 38 +
+24
src/css/list.css
··· 1 + .photo-list{ 2 + width: 100%; 3 + height: 100%; 4 + position: fixed; 5 + top: 0; 6 + left: 0; 7 + overflow: hidden; 8 + } 9 + 10 + .scroll-to-top{ 11 + position: fixed; 12 + bottom: 10px; 13 + right: 10px; 14 + color: white; 15 + width: 40px; 16 + height: 40px; 17 + cursor: pointer; 18 + border-radius: 50%; 19 + border: 2px solid white; 20 + display: flex; 21 + justify-content: center; 22 + align-items: center; 23 + z-index: 100; 24 + }
+84
src/css/settings.css
··· 1 + .settings{ 2 + position: fixed; 3 + top: 0; 4 + left: 0; 5 + width: 100%; 6 + height: 100%; 7 + background: rgba(0, 0, 0, 0.4); 8 + } 9 + 10 + .settings-container{ 11 + position: fixed; 12 + top: 50px; 13 + left: 0px; 14 + width: 200%; 15 + height: calc(100% - 100px); 16 + display: flex; 17 + } 18 + 19 + .settings-close{ 20 + position: absolute; 21 + top: 10px; 22 + left: 10px; 23 + z-index: 100; 24 + cursor: pointer; 25 + user-select: none; 26 + width: 40px; 27 + height: 40px; 28 + } 29 + 30 + .settings-block{ 31 + width: 50%; 32 + height: 100%; 33 + color: white; 34 + text-align: center; 35 + } 36 + 37 + .selector{ 38 + padding: 10px 20px; 39 + border-radius: 10px; 40 + background: #000a; 41 + display: inline-block; 42 + margin: 10px; 43 + } 44 + 45 + .selector .selection-box{ 46 + height: 20px; 47 + background: #777a; 48 + margin: 5px -10px 0 -10px; 49 + border-radius: 8px; 50 + user-select: none; 51 + -webkit-user-select: none; 52 + cursor: pointer; 53 + transition: 0.25s; 54 + color: #fff1; 55 + } 56 + 57 + .selector .selection-box:hover{ 58 + height: 20px; 59 + background: #777a; 60 + margin: 5px -10px 0 -10px; 61 + border-radius: 8px; 62 + user-select: none; 63 + -webkit-user-select: none; 64 + cursor: pointer; 65 + transition: 0.25s; 66 + color: #fff5; 67 + } 68 + 69 + .selector input{ 70 + display: none; 71 + } 72 + 73 + .selector input:checked ~ label .selection-box{ 74 + background: rgba(0, 146, 204, 0.705); 75 + color: #fff; 76 + } 77 + 78 + .path{ 79 + padding: 5px 10px; 80 + background: #000a; 81 + border-radius: 5px; 82 + margin-left: 5px; 83 + cursor: pointer; 84 + }
+55
src/css/slide-bar.css
··· 1 + .slide-bar{ 2 + position: fixed; 3 + bottom: 0; 4 + left: 0; 5 + width: 100%; 6 + height: 50px; 7 + border-top: #aaa 1px solid; 8 + mask-image: linear-gradient(to left, #0000 0%, #000 20%, #000 80%, #0000 100%); 9 + background: #aaa2; 10 + box-shadow: #000 0 0 10px; 11 + overflow: hidden; 12 + } 13 + 14 + .inner-slide-bar{ 15 + display: flex; 16 + height: 50px; 17 + width: 200%; 18 + color: white; 19 + align-items: center; 20 + cursor: pointer; 21 + user-select: none; 22 + -webkit-user-select: none; 23 + } 24 + 25 + .slider-dot{ 26 + width: 5px; 27 + height: 5px; 28 + border-radius: 5px; 29 + background: #aaa; 30 + margin: auto 25px; 31 + } 32 + 33 + .slider-text{ 34 + width: 200px; 35 + text-align: center; 36 + height: 50px; 37 + display: flex; 38 + justify-content: center; 39 + align-items: center; 40 + color: #aaa; 41 + transition: 0.25s; 42 + } 43 + 44 + .slider-text:hover{ 45 + color: #fff; 46 + } 47 + 48 + .slide-bar-tri{ 49 + position: fixed; 50 + bottom: 40px; 51 + left: 50%; 52 + transform: translateX(-50%); 53 + border: transparent solid 5px; 54 + border-top: #fff solid 5px; 55 + }
+82
src/css/tray.css
··· 1 + .photo-tray{ 2 + position: fixed; 3 + bottom: -300px; 4 + left: 0; 5 + width: 100%; 6 + height: 300px; 7 + background: rgba(43, 43, 43, 0.76); 8 + backdrop-filter: blur(10px); 9 + -webkit-backdrop-filter: blur(10px); 10 + box-shadow: #0008 0 0 10px; 11 + padding-bottom: 150px; 12 + } 13 + 14 + .photo-tray-close{ 15 + position: fixed; 16 + bottom: 160px; 17 + left: 50%; 18 + transform: translate(-50%); 19 + color: white; 20 + background: rgba(43, 43, 43, 0.76); 21 + backdrop-filter: blur(10px); 22 + -webkit-backdrop-filter: blur(10px); 23 + box-shadow: #0008 0 0 10px; 24 + display: flex; 25 + justify-content: center; 26 + align-items: center; 27 + height: 30px; 28 + width: 50px; 29 + border-radius: 50px; 30 + cursor: pointer; 31 + font-size: 12px; 32 + user-select: none; 33 + -webkit-user-select: none; 34 + transition: 0.25s width; 35 + } 36 + 37 + .photo-tray-close:hover{ 38 + width: 70px; 39 + } 40 + 41 + .photo-tray-columns{ 42 + width: 100%; 43 + height: 100%; 44 + display: flex; 45 + color: white; 46 + text-align: center; 47 + } 48 + 49 + .photo-tray-column{ 50 + height: 100%; 51 + width: 100%; 52 + scrollbar-width: thin; 53 + overflow-y: auto; 54 + overflow-x: hidden; 55 + mask-image: linear-gradient(to bottom, #0000 0%, #000 10%, #000 90%, #0000 100%); 56 + } 57 + 58 + .tray-heading{ 59 + font-weight: bold; 60 + font-size: 20px; 61 + } 62 + 63 + .world-tags{ 64 + display: flex; 65 + width: 100%; 66 + justify-content: center; 67 + align-items: center; 68 + } 69 + 70 + .world-tags div{ 71 + padding: 0 10px; 72 + color: #bbb; 73 + transition: 0.25s; 74 + } 75 + 76 + .world-tags div:hover{ 77 + color: #ddd; 78 + } 79 + 80 + .world-name{ 81 + font-size: 17px; 82 + }
+193
src/css/viewer.css
··· 1 + 2 + .photo-container{ 3 + width: 100%; 4 + height: 100%; 5 + } 6 + 7 + .photo-container-bg{ 8 + width: 100%; 9 + height: 100%; 10 + position: fixed; 11 + top: 0; 12 + left: 0; 13 + z-index: -1; 14 + /* filter: blur(100px); */ 15 + } 16 + 17 + .single-photo-container{ 18 + margin: 10px; 19 + display: inline-block; 20 + } 21 + 22 + .photo-viewer{ 23 + justify-content: center; 24 + width: 100%; 25 + height: 100%; 26 + position: fixed; 27 + top: 0; 28 + left: 0; 29 + z-index: 5; 30 + background: #0009; 31 + opacity: 0; 32 + display: none; 33 + } 34 + 35 + .photo-context-menu{ 36 + position: fixed; 37 + top: 0; 38 + left: 0; 39 + padding: 10px; 40 + border-radius: 5px; 41 + background: rgba(43, 43, 43, 0.76); 42 + color: #aaa; 43 + box-shadow: #0005 0 0 10px; 44 + opacity: 0; 45 + } 46 + 47 + .photo-context-menu > div{ 48 + padding: 2px 10px; 49 + width: 100; 50 + text-align: center; 51 + transition: 0.1s; 52 + } 53 + 54 + .photo-context-menu > div:hover{ 55 + color: #fff; 56 + cursor: pointer; 57 + user-select: none; 58 + -webkit-user-select: none; 59 + } 60 + 61 + .image-container{ 62 + max-width: none; 63 + max-height: none; 64 + background-size: contain !important; 65 + background-repeat: no-repeat !important; 66 + background-position: center !important; 67 + opacity: 0; 68 + } 69 + 70 + .viewer-button{ 71 + color: white; 72 + width: 30px; 73 + height: 30px; 74 + display: flex; 75 + justify-content: center; 76 + align-items: center; 77 + border-radius: 50px; 78 + font-size: 12px; 79 + background: #8885; 80 + user-select: none; 81 + -webkit-user-select: none; 82 + cursor: pointer; 83 + z-index: 7; 84 + background: rgba(43, 43, 43, 0.76); 85 + } 86 + 87 + .viewer-close{ 88 + position: fixed; 89 + top: 10px; 90 + right: 10px; 91 + width: 35px; 92 + height: 35px; 93 + } 94 + 95 + .prev-button{ 96 + transition: 0.25s; 97 + position: fixed; 98 + top: 50%; 99 + left: 0; 100 + color: white; 101 + width: 50px; 102 + height: 150px; 103 + display: flex; 104 + justify-content: center; 105 + align-items: center; 106 + transform: translateY(-50%); 107 + background: rgba(255, 255, 255, 0.144); 108 + border-radius: 0 15px 15px 0; 109 + cursor: pointer; 110 + user-select: none; 111 + -webkit-user-select: none; 112 + box-shadow: #000 0 0 10px; 113 + } 114 + 115 + .prev-button:hover{ 116 + background: rgba(255, 255, 255, 0.349); 117 + } 118 + 119 + .next-button{ 120 + transition: 0.25s; 121 + position: fixed; 122 + top: 50%; 123 + right: 0; 124 + color: white; 125 + width: 50px; 126 + height: 150px; 127 + display: flex; 128 + justify-content: center; 129 + align-items: center; 130 + transform: translateY(-50%); 131 + background: rgba(255, 255, 255, 0.144); 132 + border-radius: 15px 0 0 15px; 133 + cursor: pointer; 134 + user-select: none; 135 + -webkit-user-select: none; 136 + box-shadow: #000 0 0 10px; 137 + } 138 + 139 + .next-button:hover{ 140 + background: rgba(255, 255, 255, 0.349); 141 + } 142 + 143 + .control-buttons{ 144 + position: fixed; 145 + bottom: 10px; 146 + left: 50%; 147 + transform: translateX(-50%); 148 + display: flex; 149 + } 150 + 151 + .control-buttons div{ 152 + margin: 0 20px; 153 + } 154 + 155 + .copy-notif{ 156 + position: fixed; 157 + top: 40px; 158 + left: 50%; 159 + color: white; 160 + transform: translateX(-50%) translateY(-100px); 161 + background: rgba(43, 43, 43, 0.76); 162 + padding: 10px 40px; 163 + backdrop-filter: blur(10px); 164 + -webkit-backdrop-filter: blur(10px); 165 + border-radius: 50px; 166 + box-shadow: #000 0 0 10px; 167 + z-index: 12; 168 + opacity: 0; 169 + pointer-events: none; 170 + } 171 + 172 + .photo-layer-manager{ 173 + background: rgba(43, 43, 43, 0.76); 174 + color: #fff; 175 + padding: 10px; 176 + backdrop-filter: blur(10px); 177 + position: fixed; 178 + bottom: 10px; 179 + left: 10px; 180 + border-radius: 10px; 181 + } 182 + 183 + .photo-layer-manager-layer{ 184 + cursor: pointer; 185 + -webkit-user-select: none; 186 + user-select: none; 187 + padding: 5px 20px; 188 + transition: 0.1s; 189 + } 190 + 191 + .photo-layer-manager-layer:hover{ 192 + color: #bbb; 193 + }
+9 -6
src/index.tsx
··· 3 3 4 4 declare global{ 5 5 interface Window { 6 - AccountManager: AccountManager; 7 6 LoadingManager: LoadingManager; 8 7 PhotoManager: PhotoManager; 9 8 ConfirmationBoxManager: ConfirmationBoxManager; 10 9 PhotoViewerManager: PhotoViewerManager; 11 10 WorldCacheManager: WorldCacheManager; 12 11 PhotoListRenderingManager: PhotoListRenderingManager; 13 - SyncManager: SyncManager; 14 12 ViewManager: ViewManager; 15 13 16 14 CloseAllPopups: (() => void)[]; ··· 23 21 24 22 window.oncontextmenu = ( e ) => e.preventDefault(); 25 23 24 + import './css/icons.css'; 25 + import './css/tray.css'; 26 + import './css/settings.css'; 27 + import './css/slide-bar.css'; 28 + import './css/viewer.css'; 29 + import './css/filters.css'; 30 + import './css/list.css'; 31 + 26 32 import "./styles.css"; 33 + 27 34 import App from "./Components/App"; 28 35 import { invoke } from "@tauri-apps/api/core"; 29 36 30 - import { AccountManager } from "./Components/Managers/AccountManager"; 31 37 import { LoadingManager } from "./Components/Managers/LoadingManager"; 32 38 import { PhotoManager } from "./Components/Managers/PhotoManager"; 33 39 import { ConfirmationBoxManager } from "./Components/Managers/ConfirmationBoxManager"; 34 40 import { PhotoViewerManager } from "./Components/Managers/PhotoViewerManager"; 35 41 import { WorldCacheManager } from "./Components/Managers/WorldCacheManager"; 36 42 import { PhotoListRenderingManager } from "./Components/Managers/PhotoListRenderingManager"; 37 - import { SyncManager } from "./Components/Managers/SyncManager"; 38 43 import { ViewManager } from "./Components/Managers/ViewManager"; 39 44 40 - window.AccountManager = new AccountManager(); 41 45 window.LoadingManager = new LoadingManager(); 42 46 window.PhotoManager = new PhotoManager(); 43 47 window.ConfirmationBoxManager = new ConfirmationBoxManager(); 44 48 window.PhotoViewerManager = new PhotoViewerManager(); 45 49 window.WorldCacheManager = new WorldCacheManager(); 46 50 window.PhotoListRenderingManager = new PhotoListRenderingManager(); 47 - window.SyncManager = new SyncManager(); 48 51 window.ViewManager = new ViewManager(); 49 52 50 53 (async () => {
+11 -768
src/styles.css
··· 7 7 background: #000; 8 8 margin: 0; 9 9 font-family: Rubik, 'Courier New'; 10 + overflow: hidden; 11 + } 12 + 13 + * { 14 + box-sizing: border-box; 10 15 } 11 16 12 17 .loading{ ··· 24 29 align-items: center; 25 30 } 26 31 27 - .navbar{ 28 - background: #555a; 29 - position: fixed; 30 - top: 0; 31 - left: 0; 32 - width: 100%; 33 - margin-top: -50px; 34 - padding-top: 50px; 35 - height: 50px; 36 - display: flex; 37 - backdrop-filter: blur(10px); 38 - -webkit-backdrop-filter: blur(10px); 39 - z-index: 10; 40 - box-shadow: #000 0 0 10px; 41 - } 42 - 43 - .navbar .tabs{ 44 - width: calc(100% - 450px); 45 - height: 100%; 46 - display: flex; 47 - } 48 - 49 - .navbar .account{ 50 - width: 100px; 51 - height: 100%; 52 - display: flex; 53 - justify-content: center; 54 - align-items: center; 55 - transition: 0.1s; 56 - cursor: pointer; 57 - user-select: none; 58 - -webkit-user-select: none; 59 - } 60 - 61 - .navbar .account:hover{ 62 - background: #0005; 63 - } 64 - 65 - .navbar .control-lights{ 66 - width: 150px; 67 - height: 50px; 68 - display: flex; 69 - justify-content: center; 70 - align-items: center; 71 - } 72 - 73 - .control-lights .light{ 74 - user-select: none; 75 - -webkit-user-select: none; 76 - font-size: 20px; 77 - text-align: center; 78 - color: white; 79 - width: 100%; 80 - cursor: pointer; 81 - display: flex; 82 - justify-content: center; 83 - align-items: center; 84 - height: 50px; 85 - filter: invert(100%); 86 - } 87 - 88 - .control-lights .light:hover{ 89 - background: #fff5; 90 - } 91 - 92 - .control-lights .light img{ 93 - width: 25%; 94 - } 95 - 96 - .icon{ 97 - width: 15px; 98 - filter: invert(100%); 99 - display: flex; 100 - align-items: center; 101 - justify-content: center; 102 - height: 100%; 103 - } 104 - 105 - .icon-label{ 106 - margin-top: -20px; 107 - margin-right: -200px; 108 - width: 200px; 109 - color: white; 110 - pointer-events: none; 111 - transform: translate(40px, -19px); 112 - opacity: 0; 113 - transition: 0.25s; 114 - user-select: none; 115 - -webkit-user-select: none; 116 - } 117 - 118 - .icon:hover ~ .icon-label{ 119 - opacity: 1; 120 - transform: translate(60px, -19px); 121 - } 122 - 123 - .user-pfp{ 124 - width: 35px; 125 - height: 35px; 126 - background-size: cover !important; 127 - background-position: center !important; 128 - border-radius: 50%; 129 - margin-right: 10px; 130 - } 131 - 132 - .account-dropdown{ 133 - font-size: 20px; 134 - color: white; 135 - } 136 - 137 - .nav-tab{ 138 - color: white; 139 - width: 150px; 140 - height: 100%; 141 - transition: 0.1s; 142 - cursor: pointer; 143 - user-select: none; 144 - -webkit-user-select: none; 145 - justify-content: center; 146 - align-items: center; 147 - display: flex; 148 - } 149 - 150 - .nav-tab:hover{ 151 - background: #0005; 152 - } 153 - 154 - .dropdown{ 155 - position: fixed; 156 - right: 125px; 157 - top: 60px; 158 - background: #555a; 159 - height: 60px; 160 - width: 150px; 161 - border-radius: 5px; 162 - backdrop-filter: blur(5px); 163 - z-index: 10; 164 - } 165 - 166 - .dropdown-button{ 167 - width: 100%; 168 - text-align: center; 169 - padding: 5.5px 0; 170 - color: #aaa; 171 - cursor: pointer; 172 - user-select: none; 173 - -webkit-user-select: none; 174 - transition: 0.1s; 175 - } 176 - 177 - .dropdown-button:hover{ 178 - color: #fff; 179 - } 180 - 181 - .photo-list{ 182 - width: 100%; 183 - height: 100%; 184 - position: fixed; 185 - top: 0; 186 - left: 0; 187 - overflow: hidden; 188 - } 189 - 190 - .filter-options{ 191 - position: fixed; 192 - top: 55px; 193 - left: 5px; 194 - width: 40px; 195 - height: 50px; 196 - } 197 - 198 - .filter-options img{ 199 - cursor: pointer; 200 - user-select: none; 201 - -webkit-user-select: none; 202 - } 203 - 204 - .filter-container{ 205 - display: none; 206 - position: fixed; 207 - bottom: 0; 208 - left: 50%; 209 - width: 600px; 210 - height: 83px; 211 - transform: translate(-50%); 212 - padding: 10px; 213 - border-radius: 5px 5px 0 0; 214 - backdrop-filter: blur(5px); 215 - -webkit-backdrop-filter: blur(5px); 216 - background: #555a; 217 - color: #fff; 218 - text-align: center; 219 - box-shadow: #0005 0 0 10px; 220 - opacity: 0; 221 - } 222 - 223 - .filter-container > .filter-title{ 224 - font-size: 30px; 225 - } 226 - 227 - .filter-type-select{ 228 - display: flex; 229 - justify-content: center; 230 - align-items: center; 231 - width: 75%; 232 - margin: auto; 233 - } 234 - 235 - .filter-type-select > div{ 236 - width: 100%; 237 - border: #fff 4px solid; 238 - border-left: #fff 2px solid; 239 - border-right: #fff 2px solid; 240 - padding: 5px 0; 241 - cursor: pointer; 242 - user-select: none; 243 - -webkit-user-select: none; 244 - } 245 - 246 - .filter-type-select > div:first-child{ 247 - border-left: #fff 4px solid; 248 - border-radius: 10px 0 0 10px; 249 - } 250 - 251 - .filter-type-select > div:last-child{ 252 - border-right: #fff 4px solid; 253 - border-radius: 0 10px 10px 0; 254 - } 255 - 256 - .filter-type-select > .selected-filter{ 257 - background: #00ccff55; 258 - } 259 - 260 - .filter-search{ 261 - margin-top: 10px; 262 - padding: 5px; 263 - border: #fff 4px solid; 264 - border-radius: 10px; 265 - background: #0008; 266 - outline: none; 267 - color: white; 268 - font-size: 15px; 269 - font-family: 'Rubik'; 270 - width: calc(75% - 18px); 271 - } 272 - 273 - .date-list{ 274 - mask-image: linear-gradient(to bottom, #0000, #000, #0000); 275 - overflow: auto; 276 - scrollbar-width: thin; 277 - height: calc(100% - 100px); 278 - padding: 50px 0; 279 - } 280 - 281 - .date-list-date{ 282 - padding: 10px; 283 - user-select: none; 284 - -webkit-user-select: none; 285 - cursor: pointer; 286 - transition: 0.1s; 287 - border-radius: 10px; 288 - } 289 - 290 - .date-list-date:hover{ 291 - background: #0005; 292 - box-shadow: inset #0005 0 0 10px; 293 - } 294 - 295 - .photo-tree-loading{ 296 - position: fixed; 297 - top: 0; 298 - left: 0; 299 - width: 100%; 300 - height: 100%; 301 - display: flex; 302 - justify-content: center; 303 - align-items: center; 304 - color: white; 305 - font-size: 20px; 306 - } 307 - 308 - .loading-bar{ 309 - width: 500px; 310 - height: 8px; 311 - border-radius: 12px; 312 - background: #333; 313 - margin-top: 10px; 314 - padding: 2px; 315 - } 316 - 317 - .loading-bar-inner{ 318 - width: 0%; 319 - height: 8px; 320 - border-radius: 18px; 321 - background: #00ccff; 322 - } 323 - 324 - .photo-container{ 325 - width: 100%; 326 - height: 100%; 327 - } 328 - 329 - .photo-container-bg{ 330 - width: 100%; 331 - height: 100%; 332 - position: fixed; 333 - top: 0; 334 - left: 0; 335 - z-index: -1; 336 - filter: blur(100px); 337 - -webkit-filter: blur(100px); 338 - } 339 - 340 - .single-photo-container{ 341 - margin: 10px; 342 - display: inline-block; 343 - } 344 - 345 - .photo-viewer{ 346 - justify-content: center; 347 - width: 100%; 348 - height: 100%; 349 - position: fixed; 350 - top: 0; 351 - left: 0; 352 - z-index: 5; 353 - background: #0009; 354 - backdrop-filter: blur(75px); 355 - -webkit-backdrop-filter: blur(75px); 356 - opacity: 0; 357 - display: none; 358 - } 359 - 360 - .photo-context-menu{ 361 - position: fixed; 362 - top: 0; 363 - left: 0; 364 - padding: 10px; 365 - border-radius: 5px; 366 - backdrop-filter: blur(5px); 367 - -webkit-backdrop-filter: blur(5px); 368 - background: #555a; 369 - color: #aaa; 370 - box-shadow: #0005 0 0 10px; 371 - opacity: 0; 372 - } 373 - 374 - .photo-context-menu > div{ 375 - padding: 2px 10px; 376 - width: calc(100% - 10px); 377 - text-align: center; 378 - transition: 0.1s; 379 - } 380 - 381 - .photo-context-menu > div:hover{ 382 - color: #fff; 383 - cursor: pointer; 384 - user-select: none; 385 - -webkit-user-select: none; 386 - } 387 - 388 - .image-container{ 389 - height: 100%; 390 - background-size: contain !important; 391 - background-repeat: no-repeat !important; 392 - background-position: center !important; 393 - opacity: 0; 394 - } 395 - 396 - .viewer-button{ 397 - color: white; 398 - width: 30px; 399 - height: 30px; 400 - display: flex; 401 - justify-content: center; 402 - align-items: center; 403 - border-radius: 50px; 404 - font-size: 12px; 405 - background: #8885; 406 - backdrop-filter: blur(10px); 407 - -webkit-backdrop-filter: blur(10px); 408 - user-select: none; 409 - -webkit-user-select: none; 410 - cursor: pointer; 411 - z-index: 7; 412 - box-shadow: #0008 0 0 10px; 413 - } 414 - 415 - .viewer-close{ 416 - position: fixed; 417 - top: 10px; 418 - right: 10px; 419 - width: 35px; 420 - height: 35px; 421 - } 422 - 423 - .prev-button{ 424 - transition: 0.25s; 425 - position: fixed; 426 - top: 50%; 427 - left: 0; 428 - color: white; 429 - width: 50px; 430 - height: 150px; 431 - display: flex; 432 - justify-content: center; 433 - align-items: center; 434 - transform: translateY(-50%); 435 - background: rgba(255, 255, 255, 0.144); 436 - backdrop-filter: blur(50px); 437 - -webkit-backdrop-filter: blur(50px); 438 - border-radius: 0 15px 15px 0; 439 - cursor: pointer; 440 - user-select: none; 441 - -webkit-user-select: none; 442 - box-shadow: #000 0 0 10px; 443 - } 444 - 445 - .prev-button:hover{ 446 - background: rgba(255, 255, 255, 0.349); 447 - } 448 - 449 - .next-button{ 450 - transition: 0.25s; 451 - position: fixed; 452 - top: 50%; 453 - right: 0; 454 - color: white; 455 - width: 50px; 456 - height: 150px; 457 - display: flex; 458 - justify-content: center; 459 - align-items: center; 460 - transform: translateY(-50%); 461 - background: rgba(255, 255, 255, 0.144); 462 - backdrop-filter: blur(50px); 463 - -webkit-backdrop-filter: blur(50px); 464 - border-radius: 15px 0 0 15px; 465 - cursor: pointer; 466 - user-select: none; 467 - -webkit-user-select: none; 468 - box-shadow: #000 0 0 10px; 469 - } 470 - 471 - .next-button:hover{ 472 - background: rgba(255, 255, 255, 0.349); 473 - } 474 - 475 - .reload-photos{ 476 - position: fixed; 477 - top: 70px; 478 - right: 20px; 479 - color: white; 480 - user-select: none; 481 - -webkit-user-select: none; 482 - cursor: pointer; 483 - opacity: 0; 484 - } 485 - 486 32 .confirmation-box{ 487 33 position: fixed; 488 34 top: 0; ··· 490 36 width: 100%; 491 37 height: 100%; 492 38 z-index: 15; 493 - background: #0005; 39 + background: rgba(0, 0, 0, 0.76); 494 40 transition: 0.25s; 495 - backdrop-filter: blur(10px); 496 - -webkit-backdrop-filter: blur(10px); 497 41 } 498 42 499 43 .confirmation-box-container{ ··· 553 97 box-shadow: #000a inset 0 0 10px; 554 98 } 555 99 556 - .control-buttons{ 557 - position: fixed; 558 - bottom: 10px; 559 - left: 50%; 560 - transform: translateX(-50%); 561 - display: flex; 562 - } 563 - 564 - .control-buttons div{ 565 - margin: 0 20px; 100 + img{ 101 + max-width: 100%; 102 + max-height: 100%; 566 103 } 567 104 568 - .copy-notif{ 105 + .error-notif{ 569 106 position: fixed; 570 107 top: 40px; 571 108 left: 50%; 572 109 color: white; 573 110 transform: translateX(-50%) translateY(-100px); 574 - background: #8885; 111 + background: rgba(43, 43, 43, 0.76); 575 112 padding: 10px 40px; 576 113 backdrop-filter: blur(10px); 577 114 -webkit-backdrop-filter: blur(10px); ··· 580 117 z-index: 12; 581 118 opacity: 0; 582 119 pointer-events: none; 583 - } 584 - 585 - .photo-tray{ 586 - position: fixed; 587 - bottom: -150px; 588 - left: 0; 589 - width: 100%; 590 - height: 150px; 591 - background: #7778; 592 - backdrop-filter: blur(10px); 593 - -webkit-backdrop-filter: blur(10px); 594 - box-shadow: #0008 0 0 10px; 595 - padding-bottom: 150px; 596 - margin-bottom: -150px; 597 - } 598 - 599 - .photo-tray-close{ 600 - position: fixed; 601 - bottom: 160px; 602 - left: 50%; 603 - transform: translate(-50%); 604 - color: white; 605 - background: #8885; 606 - backdrop-filter: blur(10px); 607 - -webkit-backdrop-filter: blur(10px); 608 - box-shadow: #0008 0 0 10px; 609 - display: flex; 610 - justify-content: center; 611 - align-items: center; 612 - height: 30px; 613 - width: 50px; 614 - border-radius: 50px; 615 - cursor: pointer; 616 - font-size: 12px; 617 - user-select: none; 618 - -webkit-user-select: none; 619 - transition: 0.25s width; 620 - } 621 - 622 - .photo-tray-close:hover{ 623 - width: 70px; 624 - } 625 - 626 - .photo-tray-columns{ 627 - width: 100%; 628 - height: 100%; 629 - display: flex; 630 - color: white; 631 - text-align: center; 632 - } 633 - 634 - .photo-tray-column{ 635 - height: 100%; 636 - width: 100%; 637 - scrollbar-width: thin; 638 - overflow-y: auto; 639 - overflow-x: hidden; 640 - mask-image: linear-gradient(to bottom, #0000 0%, #000 10%, #000 90%, #0000 100%); 641 - } 642 - 643 - .tray-heading{ 644 - font-weight: bold; 645 - font-size: 20px; 646 - } 647 - 648 - .world-tags{ 649 - display: flex; 650 - width: 100%; 651 - justify-content: center; 652 - align-items: center; 653 - } 654 - 655 - .world-tags div{ 656 - padding: 0 10px; 657 - color: #bbb; 658 - transition: 0.25s; 659 - } 660 - 661 - .world-tags div:hover{ 662 - color: #ddd; 663 - } 664 - 665 - .world-name{ 666 - font-size: 17px; 667 - } 668 - 669 - .settings{ 670 - position: fixed; 671 - top: 0; 672 - left: 0; 673 - width: 100%; 674 - height: 100%; 675 - background: rgba(0, 0, 0, 0.4); 676 - backdrop-filter: blur(100px); 677 - -webkit-backdrop-filter: blur(100px); 678 - } 679 - 680 - .slide-bar{ 681 - position: fixed; 682 - bottom: 0; 683 - left: 0; 684 - width: 100%; 685 - height: 50px; 686 - border-top: #aaa 1px solid; 687 - overflow-x: hidden; 688 - mask-image: linear-gradient(to left, #0000 0%, #000 20%, #000 80%, #0000 100%); 689 - background: #aaa2; 690 - box-shadow: #000 0 0 10px; 691 - } 692 - 693 - .inner-slide-bar{ 694 - display: flex; 695 - height: 50px; 696 - width: 200%; 697 - color: white; 698 - align-items: center; 699 - cursor: pointer; 700 - user-select: none; 701 - -webkit-user-select: none; 702 - } 703 - 704 - .slider-dot{ 705 - width: 5px; 706 - height: 5px; 707 - border-radius: 5px; 708 - background: #aaa; 709 - margin: auto 25px; 710 - } 711 - 712 - .slider-text{ 713 - width: 200px; 714 - text-align: center; 715 - height: 50px; 716 - display: flex; 717 - justify-content: center; 718 - align-items: center; 719 - color: #aaa; 720 - transition: 0.25s; 721 - } 722 - 723 - .slider-text:hover{ 724 - color: #fff; 725 - } 726 - 727 - .slide-bar-tri{ 728 - position: fixed; 729 - bottom: 40px; 730 - left: 50%; 731 - transform: translateX(-50%); 732 - border: transparent solid 5px; 733 - border-top: #fff solid 5px; 734 - } 735 - 736 - .settings-container{ 737 - position: fixed; 738 - top: 50px; 739 - left: 0px; 740 - width: 200%; 741 - height: calc(100% - 100px); 742 - display: flex; 743 - } 744 - 745 - .settings-block{ 746 - width: 50%; 747 - height: 100%; 748 - color: white; 749 - text-align: center; 750 - } 751 - 752 - .selector{ 753 - padding: 10px 20px; 754 - border-radius: 10px; 755 - background: #000a; 756 - display: inline-block; 757 - margin: 10px; 758 - } 759 - 760 - .selector .selection-box{ 761 - height: 20px; 762 - background: #777a; 763 - margin: 5px -10px 0 -10px; 764 - border-radius: 8px; 765 - user-select: none; 766 - -webkit-user-select: none; 767 - cursor: pointer; 768 - transition: 0.25s; 769 - color: #fff1; 770 - } 771 - 772 - .selector .selection-box:hover{ 773 - height: 20px; 774 - background: #777a; 775 - margin: 5px -10px 0 -10px; 776 - border-radius: 8px; 777 - user-select: none; 778 - -webkit-user-select: none; 779 - cursor: pointer; 780 - transition: 0.25s; 781 - color: #fff5; 782 - } 783 - 784 - .selector input{ 785 - display: none; 786 - } 787 - 788 - .selector input:checked ~ label .selection-box{ 789 - background: rgba(0, 146, 204, 0.705); 790 - color: #fff; 791 - } 792 - 793 - .path{ 794 - padding: 5px 10px; 795 - background: #000a; 796 - border-radius: 5px; 797 - margin-left: 5px; 798 - cursor: pointer; 799 - } 800 - 801 - .scroll-to-top{ 802 - position: fixed; 803 - bottom: 10px; 804 - right: 10px; 805 - color: white; 806 - width: 40px; 807 - height: 40px; 808 - cursor: pointer; 809 - border-radius: 50%; 810 - border: 2px solid white; 811 - display: flex; 812 - justify-content: center; 813 - align-items: center; 814 - } 815 - 816 - .account-profile{ 817 - margin: auto; 818 - width: 50%; 819 - height: 200px; 820 - display: flex; 821 - } 822 - 823 - .account-pfp{ 824 - width: 200px; 825 - height: 200px; 826 - background-position: center !important; 827 - background-size: cover !important; 828 - border-radius: 50%; 829 - box-shadow: #0005 0 0 10px; 830 - position: relative; 831 - z-index: 10; 832 - } 833 - 834 - .account-desc{ 835 - width: calc(100% - 200px); 836 - padding-left: 100px; 837 - height: 150px; 838 - margin: 25px 0; 839 - margin-left: -100px; 840 - background: #0009; 841 - border-radius: 10px; 842 - box-shadow: #0005 0 0 10px; 843 - } 844 - 845 - .storage-bar{ 846 - width: calc(100% - 20px); 847 - height: 10px; 848 - margin-left: 10px; 849 - background: #555; 850 - border-radius: 10px; 851 - display: flex; 852 - justify-content: left; 853 - align-items: center; 854 - margin-bottom: 2px; 855 - } 856 - 857 - .storage-bar-inner{ 858 - margin: 2px; 859 - height: 6px; 860 - background: #00ccff; 861 - border-radius: 10px; 862 - } 863 - 864 - .account-notice{ 865 - background: #0007; 866 - border-radius: 5px; 867 - box-shadow: #0005 0 0 10px; 868 - padding: 10px; 869 - margin: auto; 870 - width: calc(50% - 20px); 871 - margin-top: 25px; 872 - } 873 - 874 - img{ 875 - max-width: 100%; 876 - max-height: 100%; 877 120 }
+971 -974
src-tauri/Cargo.lock
··· 3 3 version = 4 4 4 5 5 [[package]] 6 - name = "addr2line" 7 - version = "0.24.2" 8 - source = "registry+https://github.com/rust-lang/crates.io-index" 9 - checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 6 + name = "VRChatPhotoManager" 7 + version = "0.2.7" 10 8 dependencies = [ 11 - "gimli", 9 + "arboard", 10 + "dirs", 11 + "fast_image_resize", 12 + "image", 13 + "mslnk", 14 + "notify", 15 + "open", 16 + "regex", 17 + "reqwest", 18 + "serde", 19 + "serde_json", 20 + "tauri", 21 + "tauri-build", 22 + "tauri-plugin-http", 23 + "tauri-plugin-process", 24 + "tauri-plugin-shell", 25 + "tauri-plugin-single-instance", 12 26 ] 13 27 14 28 [[package]] ··· 19 33 20 34 [[package]] 21 35 name = "aho-corasick" 22 - version = "1.1.3" 36 + version = "1.1.4" 23 37 source = "registry+https://github.com/rust-lang/crates.io-index" 24 - checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 38 + checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" 25 39 dependencies = [ 26 40 "memchr", 27 41 ] ··· 51 65 ] 52 66 53 67 [[package]] 54 - name = "android-tzdata" 55 - version = "0.1.1" 56 - source = "registry+https://github.com/rust-lang/crates.io-index" 57 - checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 58 - 59 - [[package]] 60 68 name = "android_system_properties" 61 69 version = "0.1.5" 62 70 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 67 75 68 76 [[package]] 69 77 name = "anyhow" 70 - version = "1.0.98" 78 + version = "1.0.100" 71 79 source = "registry+https://github.com/rust-lang/crates.io-index" 72 - checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" 80 + checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" 73 81 74 82 [[package]] 75 83 name = "arbitrary" 76 - version = "1.4.1" 84 + version = "1.4.2" 77 85 source = "registry+https://github.com/rust-lang/crates.io-index" 78 - checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" 86 + checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" 87 + 88 + [[package]] 89 + name = "arboard" 90 + version = "3.6.1" 91 + source = "registry+https://github.com/rust-lang/crates.io-index" 92 + checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf" 93 + dependencies = [ 94 + "clipboard-win", 95 + "image", 96 + "log", 97 + "objc2 0.6.3", 98 + "objc2-app-kit", 99 + "objc2-core-foundation", 100 + "objc2-core-graphics", 101 + "objc2-foundation 0.3.2", 102 + "parking_lot", 103 + "percent-encoding", 104 + "windows-sys 0.60.2", 105 + "x11rb", 106 + ] 79 107 80 108 [[package]] 81 109 name = "arg_enum_proc_macro" ··· 85 113 dependencies = [ 86 114 "proc-macro2", 87 115 "quote", 88 - "syn 2.0.104", 116 + "syn 2.0.109", 89 117 ] 90 118 91 119 [[package]] ··· 120 148 121 149 [[package]] 122 150 name = "async-executor" 123 - version = "1.13.2" 151 + version = "1.13.3" 124 152 source = "registry+https://github.com/rust-lang/crates.io-index" 125 - checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" 153 + checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" 126 154 dependencies = [ 127 155 "async-task", 128 156 "concurrent-queue", ··· 133 161 ] 134 162 135 163 [[package]] 136 - name = "async-fs" 137 - version = "2.1.3" 138 - source = "registry+https://github.com/rust-lang/crates.io-index" 139 - checksum = "09f7e37c0ed80b2a977691c47dae8625cfb21e205827106c64f7c588766b2e50" 140 - dependencies = [ 141 - "async-lock", 142 - "blocking", 143 - "futures-lite", 144 - ] 145 - 146 - [[package]] 147 164 name = "async-io" 148 - version = "2.5.0" 165 + version = "2.6.0" 149 166 source = "registry+https://github.com/rust-lang/crates.io-index" 150 - checksum = "19634d6336019ef220f09fd31168ce5c184b295cbf80345437cc36094ef223ca" 167 + checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" 151 168 dependencies = [ 152 - "async-lock", 169 + "autocfg", 153 170 "cfg-if", 154 171 "concurrent-queue", 155 172 "futures-io", ··· 158 175 "polling", 159 176 "rustix", 160 177 "slab", 161 - "windows-sys 0.60.2", 178 + "windows-sys 0.61.2", 162 179 ] 163 180 164 181 [[package]] 165 182 name = "async-lock" 166 - version = "3.4.0" 183 + version = "3.4.1" 167 184 source = "registry+https://github.com/rust-lang/crates.io-index" 168 - checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" 185 + checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" 169 186 dependencies = [ 170 187 "event-listener", 171 188 "event-listener-strategy", ··· 174 191 175 192 [[package]] 176 193 name = "async-process" 177 - version = "2.4.0" 194 + version = "2.5.0" 178 195 source = "registry+https://github.com/rust-lang/crates.io-index" 179 - checksum = "65daa13722ad51e6ab1a1b9c01299142bc75135b337923cfa10e79bbbd669f00" 196 + checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" 180 197 dependencies = [ 181 198 "async-channel", 182 199 "async-io", ··· 198 215 dependencies = [ 199 216 "proc-macro2", 200 217 "quote", 201 - "syn 2.0.104", 218 + "syn 2.0.109", 202 219 ] 203 220 204 221 [[package]] 205 222 name = "async-signal" 206 - version = "0.2.12" 223 + version = "0.2.13" 207 224 source = "registry+https://github.com/rust-lang/crates.io-index" 208 - checksum = "f567af260ef69e1d52c2b560ce0ea230763e6fbb9214a85d768760a920e3e3c1" 225 + checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" 209 226 dependencies = [ 210 227 "async-io", 211 228 "async-lock", ··· 216 233 "rustix", 217 234 "signal-hook-registry", 218 235 "slab", 219 - "windows-sys 0.60.2", 236 + "windows-sys 0.61.2", 220 237 ] 221 238 222 239 [[package]] ··· 227 244 228 245 [[package]] 229 246 name = "async-trait" 230 - version = "0.1.88" 247 + version = "0.1.89" 231 248 source = "registry+https://github.com/rust-lang/crates.io-index" 232 - checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" 249 + checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" 233 250 dependencies = [ 234 251 "proc-macro2", 235 252 "quote", 236 - "syn 2.0.104", 253 + "syn 2.0.109", 237 254 ] 238 255 239 256 [[package]] ··· 273 290 274 291 [[package]] 275 292 name = "av1-grain" 276 - version = "0.2.4" 293 + version = "0.2.5" 277 294 source = "registry+https://github.com/rust-lang/crates.io-index" 278 - checksum = "4f3efb2ca85bc610acfa917b5aaa36f3fcbebed5b3182d7f877b02531c4b80c8" 295 + checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" 279 296 dependencies = [ 280 297 "anyhow", 281 298 "arrayvec", ··· 287 304 288 305 [[package]] 289 306 name = "avif-serialize" 290 - version = "0.8.5" 307 + version = "0.8.6" 291 308 source = "registry+https://github.com/rust-lang/crates.io-index" 292 - checksum = "2ea8ef51aced2b9191c08197f55450d830876d9933f8f48a429b354f1d496b42" 309 + checksum = "47c8fbc0f831f4519fe8b810b6a7a91410ec83031b8233f730a0480029f6a23f" 293 310 dependencies = [ 294 311 "arrayvec", 295 312 ] 296 313 297 314 [[package]] 298 - name = "backtrace" 299 - version = "0.3.75" 300 - source = "registry+https://github.com/rust-lang/crates.io-index" 301 - checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" 302 - dependencies = [ 303 - "addr2line", 304 - "cfg-if", 305 - "libc", 306 - "miniz_oxide", 307 - "object", 308 - "rustc-demangle", 309 - "windows-targets 0.52.6", 310 - ] 311 - 312 - [[package]] 313 315 name = "base64" 314 316 version = "0.21.7" 315 317 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 323 325 324 326 [[package]] 325 327 name = "bit_field" 326 - version = "0.10.2" 328 + version = "0.10.3" 327 329 source = "registry+https://github.com/rust-lang/crates.io-index" 328 - checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" 330 + checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" 329 331 330 332 [[package]] 331 333 name = "bitflags" ··· 335 337 336 338 [[package]] 337 339 name = "bitflags" 338 - version = "2.9.1" 340 + version = "2.10.0" 339 341 source = "registry+https://github.com/rust-lang/crates.io-index" 340 - checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" 342 + checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" 341 343 dependencies = [ 342 - "serde", 344 + "serde_core", 343 345 ] 344 346 345 347 [[package]] ··· 368 370 369 371 [[package]] 370 372 name = "block2" 371 - version = "0.6.1" 373 + version = "0.6.2" 372 374 source = "registry+https://github.com/rust-lang/crates.io-index" 373 - checksum = "340d2f0bdb2a43c1d3cd40513185b2bd7def0aa1052f956455114bc98f82dcf2" 375 + checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" 374 376 dependencies = [ 375 - "objc2 0.6.1", 377 + "objc2 0.6.3", 376 378 ] 377 379 378 380 [[package]] ··· 390 392 391 393 [[package]] 392 394 name = "brotli" 393 - version = "8.0.1" 395 + version = "8.0.2" 394 396 source = "registry+https://github.com/rust-lang/crates.io-index" 395 - checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" 397 + checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" 396 398 dependencies = [ 397 399 "alloc-no-stdlib", 398 400 "alloc-stdlib", ··· 423 425 424 426 [[package]] 425 427 name = "bytemuck" 426 - version = "1.23.1" 428 + version = "1.24.0" 427 429 source = "registry+https://github.com/rust-lang/crates.io-index" 428 - checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" 430 + checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" 429 431 430 432 [[package]] 431 433 name = "byteorder" ··· 454 456 source = "registry+https://github.com/rust-lang/crates.io-index" 455 457 checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" 456 458 dependencies = [ 457 - "bitflags 2.9.1", 459 + "bitflags 2.10.0", 458 460 "cairo-sys-rs", 459 461 "glib", 460 462 "libc", ··· 475 477 476 478 [[package]] 477 479 name = "camino" 478 - version = "1.1.10" 480 + version = "1.2.1" 479 481 source = "registry+https://github.com/rust-lang/crates.io-index" 480 - checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" 482 + checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" 481 483 dependencies = [ 482 - "serde", 484 + "serde_core", 483 485 ] 484 486 485 487 [[package]] ··· 502 504 "semver", 503 505 "serde", 504 506 "serde_json", 505 - "thiserror 2.0.12", 507 + "thiserror 2.0.17", 506 508 ] 507 509 508 510 [[package]] ··· 512 514 checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" 513 515 dependencies = [ 514 516 "serde", 515 - "toml 0.9.4", 517 + "toml 0.9.8", 516 518 ] 517 519 518 520 [[package]] 519 521 name = "cc" 520 - version = "1.2.30" 522 + version = "1.2.45" 521 523 source = "registry+https://github.com/rust-lang/crates.io-index" 522 - checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" 524 + checksum = "35900b6c8d709fb1d854671ae27aeaa9eec2f8b01b364e1619a40da3e6fe2afe" 523 525 dependencies = [ 526 + "find-msvc-tools", 524 527 "jobserver", 525 528 "libc", 526 529 "shlex", ··· 555 558 556 559 [[package]] 557 560 name = "cfg-if" 558 - version = "1.0.1" 561 + version = "1.0.4" 559 562 source = "registry+https://github.com/rust-lang/crates.io-index" 560 - checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" 563 + checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" 561 564 562 565 [[package]] 563 566 name = "cfg_aliases" ··· 567 570 568 571 [[package]] 569 572 name = "chrono" 570 - version = "0.4.41" 573 + version = "0.4.42" 571 574 source = "registry+https://github.com/rust-lang/crates.io-index" 572 - checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" 575 + checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" 573 576 dependencies = [ 574 - "android-tzdata", 575 577 "iana-time-zone", 576 578 "num-traits", 577 579 "serde", 578 - "windows-link", 580 + "windows-link 0.2.1", 581 + ] 582 + 583 + [[package]] 584 + name = "clipboard-win" 585 + version = "5.4.1" 586 + source = "registry+https://github.com/rust-lang/crates.io-index" 587 + checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" 588 + dependencies = [ 589 + "error-code", 579 590 ] 580 591 581 592 [[package]] ··· 690 701 source = "registry+https://github.com/rust-lang/crates.io-index" 691 702 checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" 692 703 dependencies = [ 693 - "bitflags 2.9.1", 704 + "bitflags 2.10.0", 694 705 "core-foundation 0.10.1", 695 706 "core-graphics-types", 696 707 "foreign-types 0.5.0", ··· 703 714 source = "registry+https://github.com/rust-lang/crates.io-index" 704 715 checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" 705 716 dependencies = [ 706 - "bitflags 2.9.1", 717 + "bitflags 2.10.0", 707 718 "core-foundation 0.10.1", 708 719 "libc", 709 720 ] ··· 800 811 checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" 801 812 dependencies = [ 802 813 "quote", 803 - "syn 2.0.104", 814 + "syn 2.0.109", 804 815 ] 805 816 806 817 [[package]] ··· 810 821 checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" 811 822 dependencies = [ 812 823 "quote", 813 - "syn 2.0.104", 824 + "syn 2.0.109", 814 825 ] 815 826 816 827 [[package]] 817 828 name = "darling" 818 - version = "0.20.11" 829 + version = "0.21.3" 819 830 source = "registry+https://github.com/rust-lang/crates.io-index" 820 - checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" 831 + checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" 821 832 dependencies = [ 822 833 "darling_core", 823 834 "darling_macro", ··· 825 836 826 837 [[package]] 827 838 name = "darling_core" 828 - version = "0.20.11" 839 + version = "0.21.3" 829 840 source = "registry+https://github.com/rust-lang/crates.io-index" 830 - checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" 841 + checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" 831 842 dependencies = [ 832 843 "fnv", 833 844 "ident_case", 834 845 "proc-macro2", 835 846 "quote", 836 847 "strsim", 837 - "syn 2.0.104", 848 + "syn 2.0.109", 838 849 ] 839 850 840 851 [[package]] 841 852 name = "darling_macro" 842 - version = "0.20.11" 853 + version = "0.21.3" 843 854 source = "registry+https://github.com/rust-lang/crates.io-index" 844 - checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" 855 + checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" 845 856 dependencies = [ 846 857 "darling_core", 847 858 "quote", 848 - "syn 2.0.104", 859 + "syn 2.0.109", 849 860 ] 850 861 851 862 [[package]] 852 863 name = "data-url" 853 - version = "0.3.1" 864 + version = "0.3.2" 854 865 source = "registry+https://github.com/rust-lang/crates.io-index" 855 - checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a" 866 + checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" 856 867 857 868 [[package]] 858 869 name = "deranged" 859 - version = "0.4.0" 870 + version = "0.5.5" 860 871 source = "registry+https://github.com/rust-lang/crates.io-index" 861 - checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" 872 + checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" 862 873 dependencies = [ 863 874 "powerfmt", 864 - "serde", 865 - ] 866 - 867 - [[package]] 868 - name = "derivative" 869 - version = "2.2.0" 870 - source = "registry+https://github.com/rust-lang/crates.io-index" 871 - checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" 872 - dependencies = [ 873 - "proc-macro2", 874 - "quote", 875 - "syn 1.0.109", 875 + "serde_core", 876 876 ] 877 877 878 878 [[package]] ··· 885 885 "proc-macro2", 886 886 "quote", 887 887 "rustc_version", 888 - "syn 2.0.104", 888 + "syn 2.0.109", 889 889 ] 890 890 891 891 [[package]] ··· 900 900 901 901 [[package]] 902 902 name = "dirs" 903 - version = "5.0.1" 904 - source = "registry+https://github.com/rust-lang/crates.io-index" 905 - checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" 906 - dependencies = [ 907 - "dirs-sys 0.4.1", 908 - ] 909 - 910 - [[package]] 911 - name = "dirs" 912 903 version = "6.0.0" 913 904 source = "registry+https://github.com/rust-lang/crates.io-index" 914 905 checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" 915 906 dependencies = [ 916 - "dirs-sys 0.5.0", 917 - ] 918 - 919 - [[package]] 920 - name = "dirs-sys" 921 - version = "0.4.1" 922 - source = "registry+https://github.com/rust-lang/crates.io-index" 923 - checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" 924 - dependencies = [ 925 - "libc", 926 - "option-ext", 927 - "redox_users 0.4.6", 928 - "windows-sys 0.48.0", 907 + "dirs-sys", 929 908 ] 930 909 931 910 [[package]] ··· 936 915 dependencies = [ 937 916 "libc", 938 917 "option-ext", 939 - "redox_users 0.5.2", 940 - "windows-sys 0.60.2", 918 + "redox_users", 919 + "windows-sys 0.61.2", 941 920 ] 942 921 943 922 [[package]] ··· 952 931 source = "registry+https://github.com/rust-lang/crates.io-index" 953 932 checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" 954 933 dependencies = [ 955 - "bitflags 2.9.1", 956 - "objc2 0.6.1", 934 + "bitflags 2.10.0", 935 + "objc2 0.6.3", 957 936 ] 958 937 959 938 [[package]] ··· 964 943 dependencies = [ 965 944 "proc-macro2", 966 945 "quote", 967 - "syn 2.0.104", 946 + "syn 2.0.109", 968 947 ] 969 948 970 949 [[package]] 971 950 name = "dlopen2" 972 - version = "0.7.0" 951 + version = "0.8.0" 973 952 source = "registry+https://github.com/rust-lang/crates.io-index" 974 - checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6" 953 + checksum = "b54f373ccf864bf587a89e880fb7610f8d73f3045f13580948ccbcaff26febff" 975 954 dependencies = [ 976 955 "dlopen2_derive", 977 956 "libc", ··· 987 966 dependencies = [ 988 967 "proc-macro2", 989 968 "quote", 990 - "syn 2.0.104", 969 + "syn 2.0.109", 991 970 ] 992 971 993 972 [[package]] ··· 1001 980 1002 981 [[package]] 1003 982 name = "document-features" 1004 - version = "0.2.11" 983 + version = "0.2.12" 1005 984 source = "registry+https://github.com/rust-lang/crates.io-index" 1006 - checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" 985 + checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" 1007 986 dependencies = [ 1008 987 "litrs", 1009 988 ] ··· 1052 1031 1053 1032 [[package]] 1054 1033 name = "embed-resource" 1055 - version = "3.0.5" 1034 + version = "3.0.6" 1056 1035 source = "registry+https://github.com/rust-lang/crates.io-index" 1057 - checksum = "4c6d81016d6c977deefb2ef8d8290da019e27cc26167e102185da528e6c0ab38" 1036 + checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" 1058 1037 dependencies = [ 1059 1038 "cc", 1060 1039 "memchr", 1061 1040 "rustc_version", 1062 - "toml 0.9.4", 1041 + "toml 0.9.8", 1063 1042 "vswhom", 1064 1043 "winreg", 1065 1044 ] ··· 1103 1082 dependencies = [ 1104 1083 "proc-macro2", 1105 1084 "quote", 1106 - "syn 2.0.104", 1085 + "syn 2.0.109", 1107 1086 ] 1108 1087 1109 1088 [[package]] ··· 1123 1102 dependencies = [ 1124 1103 "proc-macro2", 1125 1104 "quote", 1126 - "syn 2.0.104", 1105 + "syn 2.0.109", 1127 1106 ] 1128 1107 1129 1108 [[package]] ··· 1134 1113 1135 1114 [[package]] 1136 1115 name = "erased-serde" 1137 - version = "0.4.6" 1116 + version = "0.4.9" 1138 1117 source = "registry+https://github.com/rust-lang/crates.io-index" 1139 - checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" 1118 + checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" 1140 1119 dependencies = [ 1141 1120 "serde", 1121 + "serde_core", 1142 1122 "typeid", 1143 1123 ] 1144 1124 1145 1125 [[package]] 1146 1126 name = "errno" 1147 - version = "0.3.13" 1127 + version = "0.3.14" 1148 1128 source = "registry+https://github.com/rust-lang/crates.io-index" 1149 - checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" 1129 + checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" 1150 1130 dependencies = [ 1151 1131 "libc", 1152 - "windows-sys 0.60.2", 1132 + "windows-sys 0.61.2", 1153 1133 ] 1154 1134 1155 1135 [[package]] 1136 + name = "error-code" 1137 + version = "3.3.2" 1138 + source = "registry+https://github.com/rust-lang/crates.io-index" 1139 + checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" 1140 + 1141 + [[package]] 1156 1142 name = "event-listener" 1157 - version = "5.4.0" 1143 + version = "5.4.1" 1158 1144 source = "registry+https://github.com/rust-lang/crates.io-index" 1159 - checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 1145 + checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" 1160 1146 dependencies = [ 1161 1147 "concurrent-queue", 1162 1148 "parking", ··· 1190 1176 1191 1177 [[package]] 1192 1178 name = "fast_image_resize" 1193 - version = "4.2.3" 1179 + version = "5.3.0" 1194 1180 source = "registry+https://github.com/rust-lang/crates.io-index" 1195 - checksum = "43e5ce628b529e9bd2e2f378c1193215104b526fd494a572aa23414adc4e5553" 1181 + checksum = "1bd1eda71e8af93f8b00e189404235d82f4de77ea4a0d182b44a7f03994d647c" 1196 1182 dependencies = [ 1197 1183 "bytemuck", 1198 1184 "cfg-if", 1199 1185 "document-features", 1200 1186 "image", 1201 1187 "num-traits", 1202 - "thiserror 1.0.69", 1188 + "thiserror 2.0.17", 1203 1189 ] 1204 1190 1205 1191 [[package]] ··· 1209 1195 checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 1210 1196 1211 1197 [[package]] 1198 + name = "fax" 1199 + version = "0.2.6" 1200 + source = "registry+https://github.com/rust-lang/crates.io-index" 1201 + checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab" 1202 + dependencies = [ 1203 + "fax_derive", 1204 + ] 1205 + 1206 + [[package]] 1207 + name = "fax_derive" 1208 + version = "0.2.0" 1209 + source = "registry+https://github.com/rust-lang/crates.io-index" 1210 + checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" 1211 + dependencies = [ 1212 + "proc-macro2", 1213 + "quote", 1214 + "syn 2.0.109", 1215 + ] 1216 + 1217 + [[package]] 1212 1218 name = "fdeflate" 1213 1219 version = "0.3.7" 1214 1220 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1228 1234 ] 1229 1235 1230 1236 [[package]] 1231 - name = "filetime" 1232 - version = "0.2.25" 1237 + name = "find-msvc-tools" 1238 + version = "0.1.4" 1233 1239 source = "registry+https://github.com/rust-lang/crates.io-index" 1234 - checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" 1235 - dependencies = [ 1236 - "cfg-if", 1237 - "libc", 1238 - "libredox", 1239 - "windows-sys 0.59.0", 1240 - ] 1240 + checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" 1241 1241 1242 1242 [[package]] 1243 1243 name = "flate2" 1244 - version = "1.1.2" 1244 + version = "1.1.5" 1245 1245 source = "registry+https://github.com/rust-lang/crates.io-index" 1246 - checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" 1246 + checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" 1247 1247 dependencies = [ 1248 1248 "crc32fast", 1249 1249 "miniz_oxide", ··· 1282 1282 dependencies = [ 1283 1283 "proc-macro2", 1284 1284 "quote", 1285 - "syn 2.0.104", 1285 + "syn 2.0.109", 1286 1286 ] 1287 1287 1288 1288 [[package]] ··· 1299 1299 1300 1300 [[package]] 1301 1301 name = "form_urlencoded" 1302 - version = "1.2.1" 1302 + version = "1.2.2" 1303 1303 source = "registry+https://github.com/rust-lang/crates.io-index" 1304 - checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 1304 + checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 1305 1305 dependencies = [ 1306 1306 "percent-encoding", 1307 1307 ] ··· 1360 1360 1361 1361 [[package]] 1362 1362 name = "futures-lite" 1363 - version = "2.6.0" 1363 + version = "2.6.1" 1364 1364 source = "registry+https://github.com/rust-lang/crates.io-index" 1365 - checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" 1365 + checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" 1366 1366 dependencies = [ 1367 1367 "fastrand", 1368 1368 "futures-core", ··· 1379 1379 dependencies = [ 1380 1380 "proc-macro2", 1381 1381 "quote", 1382 - "syn 2.0.104", 1382 + "syn 2.0.109", 1383 1383 ] 1384 1384 1385 1385 [[package]] ··· 1521 1521 1522 1522 [[package]] 1523 1523 name = "generic-array" 1524 - version = "0.14.7" 1524 + version = "0.14.9" 1525 1525 source = "registry+https://github.com/rust-lang/crates.io-index" 1526 - checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 1526 + checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" 1527 1527 dependencies = [ 1528 1528 "typenum", 1529 1529 "version_check", 1530 + ] 1531 + 1532 + [[package]] 1533 + name = "gethostname" 1534 + version = "1.1.0" 1535 + source = "registry+https://github.com/rust-lang/crates.io-index" 1536 + checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" 1537 + dependencies = [ 1538 + "rustix", 1539 + "windows-link 0.2.1", 1530 1540 ] 1531 1541 1532 1542 [[package]] ··· 1555 1565 1556 1566 [[package]] 1557 1567 name = "getrandom" 1558 - version = "0.3.3" 1568 + version = "0.3.4" 1559 1569 source = "registry+https://github.com/rust-lang/crates.io-index" 1560 - checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 1570 + checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" 1561 1571 dependencies = [ 1562 1572 "cfg-if", 1563 1573 "js-sys", 1564 1574 "libc", 1565 1575 "r-efi", 1566 - "wasi 0.14.2+wasi-0.2.4", 1576 + "wasip2", 1567 1577 "wasm-bindgen", 1568 1578 ] 1569 1579 ··· 1578 1588 ] 1579 1589 1580 1590 [[package]] 1581 - name = "gimli" 1582 - version = "0.31.1" 1583 - source = "registry+https://github.com/rust-lang/crates.io-index" 1584 - checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 1585 - 1586 - [[package]] 1587 1591 name = "gio" 1588 1592 version = "0.18.4" 1589 1593 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1621 1625 source = "registry+https://github.com/rust-lang/crates.io-index" 1622 1626 checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" 1623 1627 dependencies = [ 1624 - "bitflags 2.9.1", 1628 + "bitflags 2.10.0", 1625 1629 "futures-channel", 1626 1630 "futures-core", 1627 1631 "futures-executor", ··· 1649 1653 "proc-macro-error", 1650 1654 "proc-macro2", 1651 1655 "quote", 1652 - "syn 2.0.104", 1656 + "syn 2.0.109", 1653 1657 ] 1654 1658 1655 1659 [[package]] ··· 1664 1668 1665 1669 [[package]] 1666 1670 name = "glob" 1667 - version = "0.3.2" 1671 + version = "0.3.3" 1668 1672 source = "registry+https://github.com/rust-lang/crates.io-index" 1669 - checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 1673 + checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" 1670 1674 1671 1675 [[package]] 1672 1676 name = "gobject-sys" ··· 1728 1732 "proc-macro-error", 1729 1733 "proc-macro2", 1730 1734 "quote", 1731 - "syn 2.0.104", 1735 + "syn 2.0.109", 1732 1736 ] 1733 1737 1734 1738 [[package]] 1735 1739 name = "h2" 1736 - version = "0.4.11" 1740 + version = "0.4.12" 1737 1741 source = "registry+https://github.com/rust-lang/crates.io-index" 1738 - checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" 1742 + checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" 1739 1743 dependencies = [ 1740 1744 "atomic-waker", 1741 1745 "bytes", ··· 1743 1747 "futures-core", 1744 1748 "futures-sink", 1745 1749 "http", 1746 - "indexmap 2.10.0", 1750 + "indexmap 2.12.0", 1747 1751 "slab", 1748 1752 "tokio", 1749 1753 "tokio-util", ··· 1752 1756 1753 1757 [[package]] 1754 1758 name = "half" 1755 - version = "2.6.0" 1759 + version = "2.7.1" 1756 1760 source = "registry+https://github.com/rust-lang/crates.io-index" 1757 - checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" 1761 + checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" 1758 1762 dependencies = [ 1759 1763 "cfg-if", 1760 1764 "crunchy", 1765 + "zerocopy", 1761 1766 ] 1762 1767 1763 1768 [[package]] ··· 1774 1779 1775 1780 [[package]] 1776 1781 name = "hashbrown" 1777 - version = "0.15.4" 1782 + version = "0.16.0" 1778 1783 source = "registry+https://github.com/rust-lang/crates.io-index" 1779 - checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" 1784 + checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" 1780 1785 1781 1786 [[package]] 1782 1787 name = "heck" ··· 1856 1861 1857 1862 [[package]] 1858 1863 name = "hyper" 1859 - version = "1.6.0" 1864 + version = "1.7.0" 1860 1865 source = "registry+https://github.com/rust-lang/crates.io-index" 1861 - checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 1866 + checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" 1862 1867 dependencies = [ 1868 + "atomic-waker", 1863 1869 "bytes", 1864 1870 "futures-channel", 1865 - "futures-util", 1871 + "futures-core", 1866 1872 "h2", 1867 1873 "http", 1868 1874 "http-body", 1869 1875 "httparse", 1870 1876 "itoa", 1871 1877 "pin-project-lite", 1878 + "pin-utils", 1872 1879 "smallvec", 1873 1880 "tokio", 1874 1881 "want", ··· 1909 1916 1910 1917 [[package]] 1911 1918 name = "hyper-util" 1912 - version = "0.1.16" 1919 + version = "0.1.17" 1913 1920 source = "registry+https://github.com/rust-lang/crates.io-index" 1914 - checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" 1921 + checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" 1915 1922 dependencies = [ 1916 1923 "base64 0.22.1", 1917 1924 "bytes", ··· 1925 1932 "libc", 1926 1933 "percent-encoding", 1927 1934 "pin-project-lite", 1928 - "socket2 0.6.0", 1935 + "socket2", 1929 1936 "system-configuration", 1930 1937 "tokio", 1931 1938 "tower-service", ··· 1935 1942 1936 1943 [[package]] 1937 1944 name = "iana-time-zone" 1938 - version = "0.1.63" 1945 + version = "0.1.64" 1939 1946 source = "registry+https://github.com/rust-lang/crates.io-index" 1940 - checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" 1947 + checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" 1941 1948 dependencies = [ 1942 1949 "android_system_properties", 1943 1950 "core-foundation-sys", ··· 1945 1952 "js-sys", 1946 1953 "log", 1947 1954 "wasm-bindgen", 1948 - "windows-core", 1955 + "windows-core 0.62.2", 1949 1956 ] 1950 1957 1951 1958 [[package]] ··· 1964 1971 checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" 1965 1972 dependencies = [ 1966 1973 "byteorder", 1967 - "png", 1974 + "png 0.17.16", 1968 1975 ] 1969 1976 1970 1977 [[package]] 1971 1978 name = "icu_collections" 1972 - version = "2.0.0" 1979 + version = "2.1.1" 1973 1980 source = "registry+https://github.com/rust-lang/crates.io-index" 1974 - checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 1981 + checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" 1975 1982 dependencies = [ 1976 1983 "displaydoc", 1977 1984 "potential_utf", ··· 1982 1989 1983 1990 [[package]] 1984 1991 name = "icu_locale_core" 1985 - version = "2.0.0" 1992 + version = "2.1.1" 1986 1993 source = "registry+https://github.com/rust-lang/crates.io-index" 1987 - checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 1994 + checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" 1988 1995 dependencies = [ 1989 1996 "displaydoc", 1990 1997 "litemap", ··· 1995 2002 1996 2003 [[package]] 1997 2004 name = "icu_normalizer" 1998 - version = "2.0.0" 2005 + version = "2.1.1" 1999 2006 source = "registry+https://github.com/rust-lang/crates.io-index" 2000 - checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 2007 + checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" 2001 2008 dependencies = [ 2002 - "displaydoc", 2003 2009 "icu_collections", 2004 2010 "icu_normalizer_data", 2005 2011 "icu_properties", ··· 2010 2016 2011 2017 [[package]] 2012 2018 name = "icu_normalizer_data" 2013 - version = "2.0.0" 2019 + version = "2.1.1" 2014 2020 source = "registry+https://github.com/rust-lang/crates.io-index" 2015 - checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 2021 + checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" 2016 2022 2017 2023 [[package]] 2018 2024 name = "icu_properties" 2019 - version = "2.0.1" 2025 + version = "2.1.1" 2020 2026 source = "registry+https://github.com/rust-lang/crates.io-index" 2021 - checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 2027 + checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" 2022 2028 dependencies = [ 2023 - "displaydoc", 2024 2029 "icu_collections", 2025 2030 "icu_locale_core", 2026 2031 "icu_properties_data", 2027 2032 "icu_provider", 2028 - "potential_utf", 2029 2033 "zerotrie", 2030 2034 "zerovec", 2031 2035 ] 2032 2036 2033 2037 [[package]] 2034 2038 name = "icu_properties_data" 2035 - version = "2.0.1" 2039 + version = "2.1.1" 2036 2040 source = "registry+https://github.com/rust-lang/crates.io-index" 2037 - checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 2041 + checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" 2038 2042 2039 2043 [[package]] 2040 2044 name = "icu_provider" 2041 - version = "2.0.0" 2045 + version = "2.1.1" 2042 2046 source = "registry+https://github.com/rust-lang/crates.io-index" 2043 - checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 2047 + checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" 2044 2048 dependencies = [ 2045 2049 "displaydoc", 2046 2050 "icu_locale_core", 2047 - "stable_deref_trait", 2048 - "tinystr", 2049 2051 "writeable", 2050 2052 "yoke", 2051 2053 "zerofrom", ··· 2061 2063 2062 2064 [[package]] 2063 2065 name = "idna" 2064 - version = "1.0.3" 2066 + version = "1.1.0" 2065 2067 source = "registry+https://github.com/rust-lang/crates.io-index" 2066 - checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 2068 + checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 2067 2069 dependencies = [ 2068 2070 "idna_adapter", 2069 2071 "smallvec", ··· 2082 2084 2083 2085 [[package]] 2084 2086 name = "image" 2085 - version = "0.25.6" 2087 + version = "0.25.8" 2086 2088 source = "registry+https://github.com/rust-lang/crates.io-index" 2087 - checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" 2089 + checksum = "529feb3e6769d234375c4cf1ee2ce713682b8e76538cb13f9fc23e1400a591e7" 2088 2090 dependencies = [ 2089 2091 "bytemuck", 2090 2092 "byteorder-lite", ··· 2092 2094 "exr", 2093 2095 "gif", 2094 2096 "image-webp", 2097 + "moxcms", 2095 2098 "num-traits", 2096 - "png", 2099 + "png 0.18.0", 2097 2100 "qoi", 2098 2101 "ravif", 2099 2102 "rayon", ··· 2105 2108 2106 2109 [[package]] 2107 2110 name = "image-webp" 2108 - version = "0.2.3" 2111 + version = "0.2.4" 2109 2112 source = "registry+https://github.com/rust-lang/crates.io-index" 2110 - checksum = "f6970fe7a5300b4b42e62c52efa0187540a5bef546c60edaf554ef595d2e6f0b" 2113 + checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" 2111 2114 dependencies = [ 2112 2115 "byteorder-lite", 2113 2116 "quick-error", ··· 2115 2118 2116 2119 [[package]] 2117 2120 name = "imgref" 2118 - version = "1.11.0" 2121 + version = "1.12.0" 2119 2122 source = "registry+https://github.com/rust-lang/crates.io-index" 2120 - checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" 2123 + checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8" 2121 2124 2122 2125 [[package]] 2123 2126 name = "indexmap" ··· 2132 2135 2133 2136 [[package]] 2134 2137 name = "indexmap" 2135 - version = "2.10.0" 2138 + version = "2.12.0" 2136 2139 source = "registry+https://github.com/rust-lang/crates.io-index" 2137 - checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" 2140 + checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" 2138 2141 dependencies = [ 2139 2142 "equivalent", 2140 - "hashbrown 0.15.4", 2143 + "hashbrown 0.16.0", 2141 2144 "serde", 2145 + "serde_core", 2142 2146 ] 2143 2147 2144 2148 [[package]] ··· 2152 2156 2153 2157 [[package]] 2154 2158 name = "inotify" 2155 - version = "0.9.6" 2159 + version = "0.11.0" 2156 2160 source = "registry+https://github.com/rust-lang/crates.io-index" 2157 - checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" 2161 + checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" 2158 2162 dependencies = [ 2159 - "bitflags 1.3.2", 2163 + "bitflags 2.10.0", 2160 2164 "inotify-sys", 2161 2165 "libc", 2162 2166 ] ··· 2178 2182 dependencies = [ 2179 2183 "proc-macro2", 2180 2184 "quote", 2181 - "syn 2.0.104", 2182 - ] 2183 - 2184 - [[package]] 2185 - name = "io-uring" 2186 - version = "0.7.9" 2187 - source = "registry+https://github.com/rust-lang/crates.io-index" 2188 - checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" 2189 - dependencies = [ 2190 - "bitflags 2.9.1", 2191 - "cfg-if", 2192 - "libc", 2185 + "syn 2.0.109", 2193 2186 ] 2194 2187 2195 2188 [[package]] ··· 2200 2193 2201 2194 [[package]] 2202 2195 name = "iri-string" 2203 - version = "0.7.8" 2196 + version = "0.7.9" 2204 2197 source = "registry+https://github.com/rust-lang/crates.io-index" 2205 - checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" 2198 + checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" 2206 2199 dependencies = [ 2207 2200 "memchr", 2208 2201 "serde", ··· 2289 2282 2290 2283 [[package]] 2291 2284 name = "jobserver" 2292 - version = "0.1.33" 2285 + version = "0.1.34" 2293 2286 source = "registry+https://github.com/rust-lang/crates.io-index" 2294 - checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" 2287 + checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" 2295 2288 dependencies = [ 2296 - "getrandom 0.3.3", 2289 + "getrandom 0.3.4", 2297 2290 "libc", 2298 2291 ] 2299 2292 2300 2293 [[package]] 2301 - name = "jpeg-decoder" 2302 - version = "0.3.2" 2303 - source = "registry+https://github.com/rust-lang/crates.io-index" 2304 - checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" 2305 - 2306 - [[package]] 2307 2294 name = "js-sys" 2308 - version = "0.3.77" 2295 + version = "0.3.82" 2309 2296 source = "registry+https://github.com/rust-lang/crates.io-index" 2310 - checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 2297 + checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" 2311 2298 dependencies = [ 2312 2299 "once_cell", 2313 2300 "wasm-bindgen", ··· 2341 2328 source = "registry+https://github.com/rust-lang/crates.io-index" 2342 2329 checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" 2343 2330 dependencies = [ 2344 - "bitflags 2.9.1", 2331 + "bitflags 2.10.0", 2345 2332 "serde", 2346 2333 "unicode-segmentation", 2347 2334 ] ··· 2374 2361 dependencies = [ 2375 2362 "cssparser", 2376 2363 "html5ever", 2377 - "indexmap 2.10.0", 2364 + "indexmap 2.12.0", 2378 2365 "selectors", 2379 2366 ] 2380 2367 ··· 2386 2373 2387 2374 [[package]] 2388 2375 name = "lebe" 2389 - version = "0.5.2" 2376 + version = "0.5.3" 2390 2377 source = "registry+https://github.com/rust-lang/crates.io-index" 2391 - checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" 2378 + checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" 2392 2379 2393 2380 [[package]] 2394 2381 name = "libappindicator" ··· 2416 2403 2417 2404 [[package]] 2418 2405 name = "libc" 2419 - version = "0.2.174" 2406 + version = "0.2.177" 2420 2407 source = "registry+https://github.com/rust-lang/crates.io-index" 2421 - checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" 2408 + checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" 2422 2409 2423 2410 [[package]] 2424 2411 name = "libfuzzer-sys" ··· 2442 2429 2443 2430 [[package]] 2444 2431 name = "libredox" 2445 - version = "0.1.9" 2432 + version = "0.1.10" 2446 2433 source = "registry+https://github.com/rust-lang/crates.io-index" 2447 - checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" 2434 + checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" 2448 2435 dependencies = [ 2449 - "bitflags 2.9.1", 2436 + "bitflags 2.10.0", 2450 2437 "libc", 2451 - "redox_syscall", 2452 2438 ] 2453 2439 2454 2440 [[package]] 2455 2441 name = "linux-raw-sys" 2456 - version = "0.9.4" 2442 + version = "0.11.0" 2457 2443 source = "registry+https://github.com/rust-lang/crates.io-index" 2458 - checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 2444 + checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" 2459 2445 2460 2446 [[package]] 2461 2447 name = "litemap" 2462 - version = "0.8.0" 2448 + version = "0.8.1" 2463 2449 source = "registry+https://github.com/rust-lang/crates.io-index" 2464 - checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 2450 + checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" 2465 2451 2466 2452 [[package]] 2467 2453 name = "litrs" 2468 - version = "0.4.2" 2454 + version = "1.0.0" 2469 2455 source = "registry+https://github.com/rust-lang/crates.io-index" 2470 - checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed" 2456 + checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" 2471 2457 2472 2458 [[package]] 2473 2459 name = "lock_api" 2474 - version = "0.4.13" 2460 + version = "0.4.14" 2475 2461 source = "registry+https://github.com/rust-lang/crates.io-index" 2476 - checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" 2462 + checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" 2477 2463 dependencies = [ 2478 - "autocfg", 2479 2464 "scopeguard", 2480 2465 ] 2481 2466 2482 2467 [[package]] 2483 2468 name = "log" 2484 - version = "0.4.27" 2469 + version = "0.4.28" 2485 2470 source = "registry+https://github.com/rust-lang/crates.io-index" 2486 - checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 2471 + checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" 2487 2472 2488 2473 [[package]] 2489 2474 name = "loop9" ··· 2528 2513 dependencies = [ 2529 2514 "proc-macro2", 2530 2515 "quote", 2531 - "syn 2.0.104", 2516 + "syn 2.0.109", 2532 2517 ] 2533 2518 2534 2519 [[package]] ··· 2549 2534 2550 2535 [[package]] 2551 2536 name = "memchr" 2552 - version = "2.7.5" 2537 + version = "2.7.6" 2553 2538 source = "registry+https://github.com/rust-lang/crates.io-index" 2554 - checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" 2539 + checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" 2555 2540 2556 2541 [[package]] 2557 2542 name = "memoffset" ··· 2569 2554 checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 2570 2555 2571 2556 [[package]] 2572 - name = "minimal-lexical" 2573 - version = "0.2.1" 2574 - source = "registry+https://github.com/rust-lang/crates.io-index" 2575 - checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 2576 - 2577 - [[package]] 2578 2557 name = "miniz_oxide" 2579 2558 version = "0.8.9" 2580 2559 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2586 2565 2587 2566 [[package]] 2588 2567 name = "mio" 2589 - version = "0.8.11" 2568 + version = "1.1.0" 2590 2569 source = "registry+https://github.com/rust-lang/crates.io-index" 2591 - checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" 2570 + checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" 2592 2571 dependencies = [ 2593 2572 "libc", 2594 2573 "log", 2595 2574 "wasi 0.11.1+wasi-snapshot-preview1", 2596 - "windows-sys 0.48.0", 2575 + "windows-sys 0.61.2", 2597 2576 ] 2598 2577 2599 2578 [[package]] 2600 - name = "mio" 2601 - version = "1.0.4" 2579 + name = "moxcms" 2580 + version = "0.7.9" 2602 2581 source = "registry+https://github.com/rust-lang/crates.io-index" 2603 - checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 2582 + checksum = "0fbdd3d7436f8b5e892b8b7ea114271ff0fa00bc5acae845d53b07d498616ef6" 2604 2583 dependencies = [ 2605 - "libc", 2606 - "wasi 0.11.1+wasi-snapshot-preview1", 2607 - "windows-sys 0.59.0", 2584 + "num-traits", 2585 + "pxfm", 2608 2586 ] 2609 2587 2610 2588 [[package]] ··· 2628 2606 "dpi", 2629 2607 "gtk", 2630 2608 "keyboard-types", 2631 - "objc2 0.6.1", 2609 + "objc2 0.6.3", 2632 2610 "objc2-app-kit", 2633 2611 "objc2-core-foundation", 2634 - "objc2-foundation 0.3.1", 2612 + "objc2-foundation 0.3.2", 2635 2613 "once_cell", 2636 - "png", 2614 + "png 0.17.16", 2637 2615 "serde", 2638 - "thiserror 2.0.12", 2616 + "thiserror 2.0.17", 2639 2617 "windows-sys 0.60.2", 2640 2618 ] 2641 2619 ··· 2662 2640 source = "registry+https://github.com/rust-lang/crates.io-index" 2663 2641 checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" 2664 2642 dependencies = [ 2665 - "bitflags 2.9.1", 2643 + "bitflags 2.10.0", 2666 2644 "jni-sys", 2667 2645 "log", 2668 2646 "ndk-sys", ··· 2694 2672 2695 2673 [[package]] 2696 2674 name = "nix" 2697 - version = "0.27.1" 2675 + version = "0.30.1" 2698 2676 source = "registry+https://github.com/rust-lang/crates.io-index" 2699 - checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" 2677 + checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" 2700 2678 dependencies = [ 2701 - "bitflags 2.9.1", 2679 + "bitflags 2.10.0", 2702 2680 "cfg-if", 2681 + "cfg_aliases", 2703 2682 "libc", 2704 2683 "memoffset", 2705 2684 ] ··· 2712 2691 2713 2692 [[package]] 2714 2693 name = "nom" 2715 - version = "7.1.3" 2694 + version = "8.0.0" 2716 2695 source = "registry+https://github.com/rust-lang/crates.io-index" 2717 - checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 2696 + checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" 2718 2697 dependencies = [ 2719 2698 "memchr", 2720 - "minimal-lexical", 2721 2699 ] 2722 2700 2723 2701 [[package]] ··· 2728 2706 2729 2707 [[package]] 2730 2708 name = "notify" 2731 - version = "6.1.1" 2709 + version = "8.2.0" 2732 2710 source = "registry+https://github.com/rust-lang/crates.io-index" 2733 - checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" 2711 + checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" 2734 2712 dependencies = [ 2735 - "bitflags 2.9.1", 2736 - "crossbeam-channel", 2737 - "filetime", 2713 + "bitflags 2.10.0", 2738 2714 "fsevent-sys", 2739 2715 "inotify", 2740 2716 "kqueue", 2741 2717 "libc", 2742 2718 "log", 2743 - "mio 0.8.11", 2719 + "mio", 2720 + "notify-types", 2744 2721 "walkdir", 2745 - "windows-sys 0.48.0", 2722 + "windows-sys 0.60.2", 2746 2723 ] 2747 2724 2748 2725 [[package]] 2726 + name = "notify-types" 2727 + version = "2.0.0" 2728 + source = "registry+https://github.com/rust-lang/crates.io-index" 2729 + checksum = "5e0826a989adedc2a244799e823aece04662b66609d96af8dff7ac6df9a8925d" 2730 + 2731 + [[package]] 2749 2732 name = "num-bigint" 2750 2733 version = "0.4.6" 2751 2734 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2769 2752 dependencies = [ 2770 2753 "proc-macro2", 2771 2754 "quote", 2772 - "syn 2.0.104", 2755 + "syn 2.0.109", 2773 2756 ] 2774 2757 2775 2758 [[package]] ··· 2803 2786 2804 2787 [[package]] 2805 2788 name = "num_enum" 2806 - version = "0.7.4" 2789 + version = "0.7.5" 2807 2790 source = "registry+https://github.com/rust-lang/crates.io-index" 2808 - checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" 2791 + checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" 2809 2792 dependencies = [ 2810 2793 "num_enum_derive", 2811 2794 "rustversion", ··· 2813 2796 2814 2797 [[package]] 2815 2798 name = "num_enum_derive" 2816 - version = "0.7.4" 2799 + version = "0.7.5" 2817 2800 source = "registry+https://github.com/rust-lang/crates.io-index" 2818 - checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" 2801 + checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" 2819 2802 dependencies = [ 2820 - "proc-macro-crate 2.0.2", 2803 + "proc-macro-crate 3.4.0", 2821 2804 "proc-macro2", 2822 2805 "quote", 2823 - "syn 2.0.104", 2806 + "syn 2.0.109", 2824 2807 ] 2825 2808 2826 2809 [[package]] ··· 2841 2824 2842 2825 [[package]] 2843 2826 name = "objc2" 2844 - version = "0.6.1" 2827 + version = "0.6.3" 2845 2828 source = "registry+https://github.com/rust-lang/crates.io-index" 2846 - checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" 2829 + checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" 2847 2830 dependencies = [ 2848 2831 "objc2-encode", 2849 2832 "objc2-exception-helper", ··· 2851 2834 2852 2835 [[package]] 2853 2836 name = "objc2-app-kit" 2854 - version = "0.3.1" 2837 + version = "0.3.2" 2855 2838 source = "registry+https://github.com/rust-lang/crates.io-index" 2856 - checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" 2839 + checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" 2857 2840 dependencies = [ 2858 - "bitflags 2.9.1", 2859 - "block2 0.6.1", 2841 + "bitflags 2.10.0", 2842 + "block2 0.6.2", 2860 2843 "libc", 2861 - "objc2 0.6.1", 2844 + "objc2 0.6.3", 2862 2845 "objc2-cloud-kit", 2863 2846 "objc2-core-data", 2864 2847 "objc2-core-foundation", 2865 2848 "objc2-core-graphics", 2866 2849 "objc2-core-image", 2867 - "objc2-foundation 0.3.1", 2868 - "objc2-quartz-core 0.3.1", 2850 + "objc2-core-text", 2851 + "objc2-core-video", 2852 + "objc2-foundation 0.3.2", 2853 + "objc2-quartz-core 0.3.2", 2869 2854 ] 2870 2855 2871 2856 [[package]] 2872 2857 name = "objc2-cloud-kit" 2873 - version = "0.3.1" 2858 + version = "0.3.2" 2874 2859 source = "registry+https://github.com/rust-lang/crates.io-index" 2875 - checksum = "17614fdcd9b411e6ff1117dfb1d0150f908ba83a7df81b1f118005fe0a8ea15d" 2860 + checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" 2876 2861 dependencies = [ 2877 - "bitflags 2.9.1", 2878 - "objc2 0.6.1", 2879 - "objc2-foundation 0.3.1", 2862 + "bitflags 2.10.0", 2863 + "objc2 0.6.3", 2864 + "objc2-foundation 0.3.2", 2880 2865 ] 2881 2866 2882 2867 [[package]] 2883 2868 name = "objc2-core-data" 2884 - version = "0.3.1" 2869 + version = "0.3.2" 2885 2870 source = "registry+https://github.com/rust-lang/crates.io-index" 2886 - checksum = "291fbbf7d29287518e8686417cf7239c74700fd4b607623140a7d4a3c834329d" 2871 + checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" 2887 2872 dependencies = [ 2888 - "bitflags 2.9.1", 2889 - "objc2 0.6.1", 2890 - "objc2-foundation 0.3.1", 2873 + "bitflags 2.10.0", 2874 + "objc2 0.6.3", 2875 + "objc2-foundation 0.3.2", 2891 2876 ] 2892 2877 2893 2878 [[package]] 2894 2879 name = "objc2-core-foundation" 2895 - version = "0.3.1" 2880 + version = "0.3.2" 2896 2881 source = "registry+https://github.com/rust-lang/crates.io-index" 2897 - checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" 2882 + checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" 2898 2883 dependencies = [ 2899 - "bitflags 2.9.1", 2884 + "bitflags 2.10.0", 2900 2885 "dispatch2", 2901 - "objc2 0.6.1", 2886 + "objc2 0.6.3", 2902 2887 ] 2903 2888 2904 2889 [[package]] 2905 2890 name = "objc2-core-graphics" 2906 - version = "0.3.1" 2891 + version = "0.3.2" 2907 2892 source = "registry+https://github.com/rust-lang/crates.io-index" 2908 - checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" 2893 + checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" 2909 2894 dependencies = [ 2910 - "bitflags 2.9.1", 2895 + "bitflags 2.10.0", 2911 2896 "dispatch2", 2912 - "objc2 0.6.1", 2897 + "objc2 0.6.3", 2913 2898 "objc2-core-foundation", 2914 2899 "objc2-io-surface", 2915 2900 ] 2916 2901 2917 2902 [[package]] 2918 2903 name = "objc2-core-image" 2919 - version = "0.3.1" 2904 + version = "0.3.2" 2920 2905 source = "registry+https://github.com/rust-lang/crates.io-index" 2921 - checksum = "79b3dc0cc4386b6ccf21c157591b34a7f44c8e75b064f85502901ab2188c007e" 2906 + checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" 2922 2907 dependencies = [ 2923 - "objc2 0.6.1", 2924 - "objc2-foundation 0.3.1", 2908 + "objc2 0.6.3", 2909 + "objc2-foundation 0.3.2", 2910 + ] 2911 + 2912 + [[package]] 2913 + name = "objc2-core-text" 2914 + version = "0.3.2" 2915 + source = "registry+https://github.com/rust-lang/crates.io-index" 2916 + checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" 2917 + dependencies = [ 2918 + "bitflags 2.10.0", 2919 + "objc2 0.6.3", 2920 + "objc2-core-foundation", 2921 + "objc2-core-graphics", 2922 + ] 2923 + 2924 + [[package]] 2925 + name = "objc2-core-video" 2926 + version = "0.3.2" 2927 + source = "registry+https://github.com/rust-lang/crates.io-index" 2928 + checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" 2929 + dependencies = [ 2930 + "bitflags 2.10.0", 2931 + "objc2 0.6.3", 2932 + "objc2-core-foundation", 2933 + "objc2-core-graphics", 2934 + "objc2-io-surface", 2925 2935 ] 2926 2936 2927 2937 [[package]] ··· 2945 2955 source = "registry+https://github.com/rust-lang/crates.io-index" 2946 2956 checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" 2947 2957 dependencies = [ 2948 - "bitflags 2.9.1", 2958 + "bitflags 2.10.0", 2949 2959 "block2 0.5.1", 2950 2960 "libc", 2951 2961 "objc2 0.5.2", ··· 2953 2963 2954 2964 [[package]] 2955 2965 name = "objc2-foundation" 2956 - version = "0.3.1" 2966 + version = "0.3.2" 2957 2967 source = "registry+https://github.com/rust-lang/crates.io-index" 2958 - checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" 2968 + checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" 2959 2969 dependencies = [ 2960 - "bitflags 2.9.1", 2961 - "block2 0.6.1", 2970 + "bitflags 2.10.0", 2971 + "block2 0.6.2", 2962 2972 "libc", 2963 - "objc2 0.6.1", 2973 + "objc2 0.6.3", 2964 2974 "objc2-core-foundation", 2965 2975 ] 2966 2976 2967 2977 [[package]] 2968 2978 name = "objc2-io-surface" 2969 - version = "0.3.1" 2979 + version = "0.3.2" 2970 2980 source = "registry+https://github.com/rust-lang/crates.io-index" 2971 - checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" 2981 + checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" 2972 2982 dependencies = [ 2973 - "bitflags 2.9.1", 2974 - "objc2 0.6.1", 2983 + "bitflags 2.10.0", 2984 + "objc2 0.6.3", 2985 + "objc2-core-foundation", 2986 + ] 2987 + 2988 + [[package]] 2989 + name = "objc2-javascript-core" 2990 + version = "0.3.2" 2991 + source = "registry+https://github.com/rust-lang/crates.io-index" 2992 + checksum = "2a1e6550c4caed348956ce3370c9ffeca70bb1dbed4fa96112e7c6170e074586" 2993 + dependencies = [ 2994 + "objc2 0.6.3", 2975 2995 "objc2-core-foundation", 2976 2996 ] 2977 2997 ··· 2981 3001 source = "registry+https://github.com/rust-lang/crates.io-index" 2982 3002 checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" 2983 3003 dependencies = [ 2984 - "bitflags 2.9.1", 3004 + "bitflags 2.10.0", 2985 3005 "block2 0.5.1", 2986 3006 "objc2 0.5.2", 2987 3007 "objc2-foundation 0.2.2", ··· 2993 3013 source = "registry+https://github.com/rust-lang/crates.io-index" 2994 3014 checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" 2995 3015 dependencies = [ 2996 - "bitflags 2.9.1", 3016 + "bitflags 2.10.0", 2997 3017 "block2 0.5.1", 2998 3018 "objc2 0.5.2", 2999 3019 "objc2-foundation 0.2.2", ··· 3002 3022 3003 3023 [[package]] 3004 3024 name = "objc2-quartz-core" 3005 - version = "0.3.1" 3025 + version = "0.3.2" 3006 3026 source = "registry+https://github.com/rust-lang/crates.io-index" 3007 - checksum = "90ffb6a0cd5f182dc964334388560b12a57f7b74b3e2dec5e2722aa2dfb2ccd5" 3027 + checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" 3008 3028 dependencies = [ 3009 - "bitflags 2.9.1", 3010 - "objc2 0.6.1", 3011 - "objc2-foundation 0.3.1", 3029 + "bitflags 2.10.0", 3030 + "objc2 0.6.3", 3031 + "objc2-foundation 0.3.2", 3012 3032 ] 3013 3033 3014 3034 [[package]] 3015 - name = "objc2-ui-kit" 3016 - version = "0.3.1" 3035 + name = "objc2-security" 3036 + version = "0.3.2" 3017 3037 source = "registry+https://github.com/rust-lang/crates.io-index" 3018 - checksum = "25b1312ad7bc8a0e92adae17aa10f90aae1fb618832f9b993b022b591027daed" 3038 + checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" 3019 3039 dependencies = [ 3020 - "bitflags 2.9.1", 3021 - "objc2 0.6.1", 3040 + "bitflags 2.10.0", 3041 + "objc2 0.6.3", 3022 3042 "objc2-core-foundation", 3023 - "objc2-foundation 0.3.1", 3024 3043 ] 3025 3044 3026 3045 [[package]] 3027 - name = "objc2-web-kit" 3028 - version = "0.3.1" 3046 + name = "objc2-ui-kit" 3047 + version = "0.3.2" 3029 3048 source = "registry+https://github.com/rust-lang/crates.io-index" 3030 - checksum = "91672909de8b1ce1c2252e95bbee8c1649c9ad9d14b9248b3d7b4c47903c47ad" 3049 + checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" 3031 3050 dependencies = [ 3032 - "bitflags 2.9.1", 3033 - "block2 0.6.1", 3034 - "objc2 0.6.1", 3035 - "objc2-app-kit", 3051 + "bitflags 2.10.0", 3052 + "objc2 0.6.3", 3036 3053 "objc2-core-foundation", 3037 - "objc2-foundation 0.3.1", 3054 + "objc2-foundation 0.3.2", 3038 3055 ] 3039 3056 3040 3057 [[package]] 3041 - name = "object" 3042 - version = "0.36.7" 3058 + name = "objc2-web-kit" 3059 + version = "0.3.2" 3043 3060 source = "registry+https://github.com/rust-lang/crates.io-index" 3044 - checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 3061 + checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" 3045 3062 dependencies = [ 3046 - "memchr", 3063 + "bitflags 2.10.0", 3064 + "block2 0.6.2", 3065 + "objc2 0.6.3", 3066 + "objc2-app-kit", 3067 + "objc2-core-foundation", 3068 + "objc2-foundation 0.3.2", 3069 + "objc2-javascript-core", 3070 + "objc2-security", 3047 3071 ] 3048 3072 3049 3073 [[package]] ··· 3066 3090 3067 3091 [[package]] 3068 3092 name = "openssl" 3069 - version = "0.10.73" 3093 + version = "0.10.74" 3070 3094 source = "registry+https://github.com/rust-lang/crates.io-index" 3071 - checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" 3095 + checksum = "24ad14dd45412269e1a30f52ad8f0664f0f4f4a89ee8fe28c3b3527021ebb654" 3072 3096 dependencies = [ 3073 - "bitflags 2.9.1", 3097 + "bitflags 2.10.0", 3074 3098 "cfg-if", 3075 3099 "foreign-types 0.3.2", 3076 3100 "libc", ··· 3087 3111 dependencies = [ 3088 3112 "proc-macro2", 3089 3113 "quote", 3090 - "syn 2.0.104", 3114 + "syn 2.0.109", 3091 3115 ] 3092 3116 3093 3117 [[package]] ··· 3098 3122 3099 3123 [[package]] 3100 3124 name = "openssl-sys" 3101 - version = "0.9.109" 3125 + version = "0.9.110" 3102 3126 source = "registry+https://github.com/rust-lang/crates.io-index" 3103 - checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" 3127 + checksum = "0a9f0075ba3c21b09f8e8b2026584b1d18d49388648f2fbbf3c97ea8deced8e2" 3104 3128 dependencies = [ 3105 3129 "cc", 3106 3130 "libc", ··· 3136 3160 3137 3161 [[package]] 3138 3162 name = "os_pipe" 3139 - version = "1.2.2" 3163 + version = "1.2.3" 3140 3164 source = "registry+https://github.com/rust-lang/crates.io-index" 3141 - checksum = "db335f4760b14ead6290116f2427bf33a14d4f0617d49f78a246de10c1831224" 3165 + checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" 3142 3166 dependencies = [ 3143 3167 "libc", 3144 - "windows-sys 0.59.0", 3168 + "windows-sys 0.61.2", 3145 3169 ] 3146 3170 3147 3171 [[package]] ··· 3177 3201 3178 3202 [[package]] 3179 3203 name = "parking_lot" 3180 - version = "0.12.4" 3204 + version = "0.12.5" 3181 3205 source = "registry+https://github.com/rust-lang/crates.io-index" 3182 - checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" 3206 + checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" 3183 3207 dependencies = [ 3184 3208 "lock_api", 3185 3209 "parking_lot_core", ··· 3187 3211 3188 3212 [[package]] 3189 3213 name = "parking_lot_core" 3190 - version = "0.9.11" 3214 + version = "0.9.12" 3191 3215 source = "registry+https://github.com/rust-lang/crates.io-index" 3192 - checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" 3216 + checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" 3193 3217 dependencies = [ 3194 3218 "cfg-if", 3195 3219 "libc", 3196 3220 "redox_syscall", 3197 3221 "smallvec", 3198 - "windows-targets 0.52.6", 3222 + "windows-link 0.2.1", 3199 3223 ] 3200 3224 3201 3225 [[package]] ··· 3212 3236 3213 3237 [[package]] 3214 3238 name = "percent-encoding" 3215 - version = "2.3.1" 3239 + version = "2.3.2" 3216 3240 source = "registry+https://github.com/rust-lang/crates.io-index" 3217 - checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 3241 + checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 3218 3242 3219 3243 [[package]] 3220 3244 name = "phf" ··· 3320 3344 "phf_shared 0.11.3", 3321 3345 "proc-macro2", 3322 3346 "quote", 3323 - "syn 2.0.104", 3347 + "syn 2.0.109", 3324 3348 ] 3325 3349 3326 3350 [[package]] ··· 3381 3405 3382 3406 [[package]] 3383 3407 name = "plist" 3384 - version = "1.7.4" 3408 + version = "1.8.0" 3385 3409 source = "registry+https://github.com/rust-lang/crates.io-index" 3386 - checksum = "3af6b589e163c5a788fab00ce0c0366f6efbb9959c2f9874b224936af7fce7e1" 3410 + checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" 3387 3411 dependencies = [ 3388 3412 "base64 0.22.1", 3389 - "indexmap 2.10.0", 3413 + "indexmap 2.12.0", 3390 3414 "quick-xml", 3391 3415 "serde", 3392 3416 "time", ··· 3406 3430 ] 3407 3431 3408 3432 [[package]] 3433 + name = "png" 3434 + version = "0.18.0" 3435 + source = "registry+https://github.com/rust-lang/crates.io-index" 3436 + checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" 3437 + dependencies = [ 3438 + "bitflags 2.10.0", 3439 + "crc32fast", 3440 + "fdeflate", 3441 + "flate2", 3442 + "miniz_oxide", 3443 + ] 3444 + 3445 + [[package]] 3409 3446 name = "polling" 3410 - version = "3.9.0" 3447 + version = "3.11.0" 3411 3448 source = "registry+https://github.com/rust-lang/crates.io-index" 3412 - checksum = "8ee9b2fa7a4517d2c91ff5bc6c297a427a96749d15f98fcdbb22c05571a4d4b7" 3449 + checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" 3413 3450 dependencies = [ 3414 3451 "cfg-if", 3415 3452 "concurrent-queue", 3416 3453 "hermit-abi", 3417 3454 "pin-project-lite", 3418 3455 "rustix", 3419 - "windows-sys 0.60.2", 3456 + "windows-sys 0.61.2", 3420 3457 ] 3421 3458 3422 3459 [[package]] 3423 3460 name = "potential_utf" 3424 - version = "0.1.2" 3461 + version = "0.1.4" 3425 3462 source = "registry+https://github.com/rust-lang/crates.io-index" 3426 - checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" 3463 + checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" 3427 3464 dependencies = [ 3428 3465 "zerovec", 3429 3466 ] ··· 3470 3507 ] 3471 3508 3472 3509 [[package]] 3510 + name = "proc-macro-crate" 3511 + version = "3.4.0" 3512 + source = "registry+https://github.com/rust-lang/crates.io-index" 3513 + checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" 3514 + dependencies = [ 3515 + "toml_edit 0.23.7", 3516 + ] 3517 + 3518 + [[package]] 3473 3519 name = "proc-macro-error" 3474 3520 version = "1.0.4" 3475 3521 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3501 3547 3502 3548 [[package]] 3503 3549 name = "proc-macro2" 3504 - version = "1.0.95" 3550 + version = "1.0.103" 3505 3551 source = "registry+https://github.com/rust-lang/crates.io-index" 3506 - checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 3552 + checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" 3507 3553 dependencies = [ 3508 3554 "unicode-ident", 3509 3555 ] ··· 3524 3570 checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" 3525 3571 dependencies = [ 3526 3572 "quote", 3527 - "syn 2.0.104", 3573 + "syn 2.0.109", 3528 3574 ] 3529 3575 3530 3576 [[package]] ··· 3544 3590 ] 3545 3591 3546 3592 [[package]] 3593 + name = "pxfm" 3594 + version = "0.1.25" 3595 + source = "registry+https://github.com/rust-lang/crates.io-index" 3596 + checksum = "a3cbdf373972bf78df4d3b518d07003938e2c7d1fb5891e55f9cb6df57009d84" 3597 + dependencies = [ 3598 + "num-traits", 3599 + ] 3600 + 3601 + [[package]] 3547 3602 name = "qoi" 3548 3603 version = "0.4.1" 3549 3604 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3560 3615 3561 3616 [[package]] 3562 3617 name = "quick-xml" 3563 - version = "0.38.0" 3618 + version = "0.38.3" 3564 3619 source = "registry+https://github.com/rust-lang/crates.io-index" 3565 - checksum = "8927b0664f5c5a98265138b7e3f90aa19a6b21353182469ace36d4ac527b7b1b" 3620 + checksum = "42a232e7487fc2ef313d96dde7948e7a3c05101870d8985e4fd8d26aedd27b89" 3566 3621 dependencies = [ 3567 3622 "memchr", 3568 3623 ] 3569 3624 3570 3625 [[package]] 3571 3626 name = "quinn" 3572 - version = "0.11.8" 3627 + version = "0.11.9" 3573 3628 source = "registry+https://github.com/rust-lang/crates.io-index" 3574 - checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" 3629 + checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" 3575 3630 dependencies = [ 3576 3631 "bytes", 3577 3632 "cfg_aliases", ··· 3580 3635 "quinn-udp", 3581 3636 "rustc-hash", 3582 3637 "rustls", 3583 - "socket2 0.5.10", 3584 - "thiserror 2.0.12", 3638 + "socket2", 3639 + "thiserror 2.0.17", 3585 3640 "tokio", 3586 3641 "tracing", 3587 3642 "web-time", ··· 3589 3644 3590 3645 [[package]] 3591 3646 name = "quinn-proto" 3592 - version = "0.11.12" 3647 + version = "0.11.13" 3593 3648 source = "registry+https://github.com/rust-lang/crates.io-index" 3594 - checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" 3649 + checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" 3595 3650 dependencies = [ 3596 3651 "bytes", 3597 - "getrandom 0.3.3", 3652 + "getrandom 0.3.4", 3598 3653 "lru-slab", 3599 3654 "rand 0.9.2", 3600 3655 "ring", ··· 3602 3657 "rustls", 3603 3658 "rustls-pki-types", 3604 3659 "slab", 3605 - "thiserror 2.0.12", 3660 + "thiserror 2.0.17", 3606 3661 "tinyvec", 3607 3662 "tracing", 3608 3663 "web-time", ··· 3610 3665 3611 3666 [[package]] 3612 3667 name = "quinn-udp" 3613 - version = "0.5.13" 3668 + version = "0.5.14" 3614 3669 source = "registry+https://github.com/rust-lang/crates.io-index" 3615 - checksum = "fcebb1209ee276352ef14ff8732e24cc2b02bbac986cd74a4c81bcb2f9881970" 3670 + checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" 3616 3671 dependencies = [ 3617 3672 "cfg_aliases", 3618 3673 "libc", 3619 3674 "once_cell", 3620 - "socket2 0.5.10", 3675 + "socket2", 3621 3676 "tracing", 3622 - "windows-sys 0.59.0", 3677 + "windows-sys 0.60.2", 3623 3678 ] 3624 3679 3625 3680 [[package]] 3626 3681 name = "quote" 3627 - version = "1.0.40" 3682 + version = "1.0.42" 3628 3683 source = "registry+https://github.com/rust-lang/crates.io-index" 3629 - checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 3684 + checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" 3630 3685 dependencies = [ 3631 3686 "proc-macro2", 3632 3687 ] ··· 3726 3781 source = "registry+https://github.com/rust-lang/crates.io-index" 3727 3782 checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 3728 3783 dependencies = [ 3729 - "getrandom 0.3.3", 3784 + "getrandom 0.3.4", 3730 3785 ] 3731 3786 3732 3787 [[package]] ··· 3805 3860 3806 3861 [[package]] 3807 3862 name = "rayon" 3808 - version = "1.10.0" 3863 + version = "1.11.0" 3809 3864 source = "registry+https://github.com/rust-lang/crates.io-index" 3810 - checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" 3865 + checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" 3811 3866 dependencies = [ 3812 3867 "either", 3813 3868 "rayon-core", ··· 3815 3870 3816 3871 [[package]] 3817 3872 name = "rayon-core" 3818 - version = "1.12.1" 3873 + version = "1.13.0" 3819 3874 source = "registry+https://github.com/rust-lang/crates.io-index" 3820 - checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 3875 + checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" 3821 3876 dependencies = [ 3822 3877 "crossbeam-deque", 3823 3878 "crossbeam-utils", ··· 3825 3880 3826 3881 [[package]] 3827 3882 name = "redox_syscall" 3828 - version = "0.5.17" 3883 + version = "0.5.18" 3829 3884 source = "registry+https://github.com/rust-lang/crates.io-index" 3830 - checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" 3885 + checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" 3831 3886 dependencies = [ 3832 - "bitflags 2.9.1", 3833 - ] 3834 - 3835 - [[package]] 3836 - name = "redox_users" 3837 - version = "0.4.6" 3838 - source = "registry+https://github.com/rust-lang/crates.io-index" 3839 - checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" 3840 - dependencies = [ 3841 - "getrandom 0.2.16", 3842 - "libredox", 3843 - "thiserror 1.0.69", 3887 + "bitflags 2.10.0", 3844 3888 ] 3845 3889 3846 3890 [[package]] ··· 3851 3895 dependencies = [ 3852 3896 "getrandom 0.2.16", 3853 3897 "libredox", 3854 - "thiserror 2.0.12", 3898 + "thiserror 2.0.17", 3855 3899 ] 3856 3900 3857 3901 [[package]] 3858 3902 name = "ref-cast" 3859 - version = "1.0.24" 3903 + version = "1.0.25" 3860 3904 source = "registry+https://github.com/rust-lang/crates.io-index" 3861 - checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" 3905 + checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" 3862 3906 dependencies = [ 3863 3907 "ref-cast-impl", 3864 3908 ] 3865 3909 3866 3910 [[package]] 3867 3911 name = "ref-cast-impl" 3868 - version = "1.0.24" 3912 + version = "1.0.25" 3869 3913 source = "registry+https://github.com/rust-lang/crates.io-index" 3870 - checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" 3914 + checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" 3871 3915 dependencies = [ 3872 3916 "proc-macro2", 3873 3917 "quote", 3874 - "syn 2.0.104", 3918 + "syn 2.0.109", 3875 3919 ] 3876 3920 3877 3921 [[package]] 3878 3922 name = "regex" 3879 - version = "1.11.1" 3923 + version = "1.12.2" 3880 3924 source = "registry+https://github.com/rust-lang/crates.io-index" 3881 - checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 3925 + checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" 3882 3926 dependencies = [ 3883 3927 "aho-corasick", 3884 3928 "memchr", ··· 3888 3932 3889 3933 [[package]] 3890 3934 name = "regex-automata" 3891 - version = "0.4.9" 3935 + version = "0.4.13" 3892 3936 source = "registry+https://github.com/rust-lang/crates.io-index" 3893 - checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 3937 + checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" 3894 3938 dependencies = [ 3895 3939 "aho-corasick", 3896 3940 "memchr", ··· 3899 3943 3900 3944 [[package]] 3901 3945 name = "regex-syntax" 3902 - version = "0.8.5" 3946 + version = "0.8.8" 3903 3947 source = "registry+https://github.com/rust-lang/crates.io-index" 3904 - checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 3948 + checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" 3905 3949 3906 3950 [[package]] 3907 3951 name = "reqwest" 3908 - version = "0.12.22" 3952 + version = "0.12.24" 3909 3953 source = "registry+https://github.com/rust-lang/crates.io-index" 3910 - checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" 3954 + checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" 3911 3955 dependencies = [ 3912 3956 "base64 0.22.1", 3913 3957 "bytes", ··· 3975 4019 3976 4020 [[package]] 3977 4021 name = "rust-ini" 3978 - version = "0.21.2" 4022 + version = "0.21.3" 3979 4023 source = "registry+https://github.com/rust-lang/crates.io-index" 3980 - checksum = "e7295b7ce3bf4806b419dc3420745998b447178b7005e2011947b38fc5aa6791" 4024 + checksum = "796e8d2b6696392a43bea58116b667fb4c29727dc5abd27d6acf338bb4f688c7" 3981 4025 dependencies = [ 3982 4026 "cfg-if", 3983 4027 "ordered-multimap", 3984 4028 ] 3985 - 3986 - [[package]] 3987 - name = "rustc-demangle" 3988 - version = "0.1.26" 3989 - source = "registry+https://github.com/rust-lang/crates.io-index" 3990 - checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" 3991 4029 3992 4030 [[package]] 3993 4031 name = "rustc-hash" ··· 4006 4044 4007 4045 [[package]] 4008 4046 name = "rustix" 4009 - version = "1.0.8" 4047 + version = "1.1.2" 4010 4048 source = "registry+https://github.com/rust-lang/crates.io-index" 4011 - checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" 4049 + checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" 4012 4050 dependencies = [ 4013 - "bitflags 2.9.1", 4051 + "bitflags 2.10.0", 4014 4052 "errno", 4015 4053 "libc", 4016 4054 "linux-raw-sys", 4017 - "windows-sys 0.60.2", 4055 + "windows-sys 0.61.2", 4018 4056 ] 4019 4057 4020 4058 [[package]] 4021 4059 name = "rustls" 4022 - version = "0.23.31" 4060 + version = "0.23.35" 4023 4061 source = "registry+https://github.com/rust-lang/crates.io-index" 4024 - checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" 4062 + checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" 4025 4063 dependencies = [ 4026 4064 "once_cell", 4027 4065 "ring", ··· 4033 4071 4034 4072 [[package]] 4035 4073 name = "rustls-pki-types" 4036 - version = "1.12.0" 4074 + version = "1.13.0" 4037 4075 source = "registry+https://github.com/rust-lang/crates.io-index" 4038 - checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" 4076 + checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" 4039 4077 dependencies = [ 4040 4078 "web-time", 4041 4079 "zeroize", ··· 4043 4081 4044 4082 [[package]] 4045 4083 name = "rustls-webpki" 4046 - version = "0.103.4" 4084 + version = "0.103.8" 4047 4085 source = "registry+https://github.com/rust-lang/crates.io-index" 4048 - checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" 4086 + checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" 4049 4087 dependencies = [ 4050 4088 "ring", 4051 4089 "rustls-pki-types", ··· 4054 4092 4055 4093 [[package]] 4056 4094 name = "rustversion" 4057 - version = "1.0.21" 4095 + version = "1.0.22" 4058 4096 source = "registry+https://github.com/rust-lang/crates.io-index" 4059 - checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" 4097 + checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 4060 4098 4061 4099 [[package]] 4062 4100 name = "ryu" ··· 4075 4113 4076 4114 [[package]] 4077 4115 name = "schannel" 4078 - version = "0.1.27" 4116 + version = "0.1.28" 4079 4117 source = "registry+https://github.com/rust-lang/crates.io-index" 4080 - checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" 4118 + checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" 4081 4119 dependencies = [ 4082 - "windows-sys 0.59.0", 4120 + "windows-sys 0.61.2", 4083 4121 ] 4084 4122 4085 4123 [[package]] ··· 4111 4149 4112 4150 [[package]] 4113 4151 name = "schemars" 4114 - version = "1.0.4" 4152 + version = "1.1.0" 4115 4153 source = "registry+https://github.com/rust-lang/crates.io-index" 4116 - checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" 4154 + checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" 4117 4155 dependencies = [ 4118 4156 "dyn-clone", 4119 4157 "ref-cast", ··· 4130 4168 "proc-macro2", 4131 4169 "quote", 4132 4170 "serde_derive_internals", 4133 - "syn 2.0.104", 4171 + "syn 2.0.109", 4134 4172 ] 4135 4173 4136 4174 [[package]] ··· 4145 4183 source = "registry+https://github.com/rust-lang/crates.io-index" 4146 4184 checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 4147 4185 dependencies = [ 4148 - "bitflags 2.9.1", 4186 + "bitflags 2.10.0", 4149 4187 "core-foundation 0.9.4", 4150 4188 "core-foundation-sys", 4151 4189 "libc", ··· 4154 4192 4155 4193 [[package]] 4156 4194 name = "security-framework-sys" 4157 - version = "2.14.0" 4195 + version = "2.15.0" 4158 4196 source = "registry+https://github.com/rust-lang/crates.io-index" 4159 - checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" 4197 + checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" 4160 4198 dependencies = [ 4161 4199 "core-foundation-sys", 4162 4200 "libc", ··· 4182 4220 4183 4221 [[package]] 4184 4222 name = "semver" 4185 - version = "1.0.26" 4223 + version = "1.0.27" 4186 4224 source = "registry+https://github.com/rust-lang/crates.io-index" 4187 - checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" 4225 + checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" 4188 4226 dependencies = [ 4189 4227 "serde", 4228 + "serde_core", 4190 4229 ] 4191 4230 4192 4231 [[package]] 4193 4232 name = "serde" 4194 - version = "1.0.219" 4233 + version = "1.0.228" 4195 4234 source = "registry+https://github.com/rust-lang/crates.io-index" 4196 - checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 4235 + checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 4197 4236 dependencies = [ 4237 + "serde_core", 4198 4238 "serde_derive", 4199 4239 ] 4200 4240 4201 4241 [[package]] 4202 4242 name = "serde-untagged" 4203 - version = "0.1.7" 4243 + version = "0.1.9" 4204 4244 source = "registry+https://github.com/rust-lang/crates.io-index" 4205 - checksum = "299d9c19d7d466db4ab10addd5703e4c615dec2a5a16dbbafe191045e87ee66e" 4245 + checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" 4206 4246 dependencies = [ 4207 4247 "erased-serde", 4208 4248 "serde", 4249 + "serde_core", 4209 4250 "typeid", 4210 4251 ] 4211 4252 4212 4253 [[package]] 4254 + name = "serde_core" 4255 + version = "1.0.228" 4256 + source = "registry+https://github.com/rust-lang/crates.io-index" 4257 + checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" 4258 + dependencies = [ 4259 + "serde_derive", 4260 + ] 4261 + 4262 + [[package]] 4213 4263 name = "serde_derive" 4214 - version = "1.0.219" 4264 + version = "1.0.228" 4215 4265 source = "registry+https://github.com/rust-lang/crates.io-index" 4216 - checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 4266 + checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 4217 4267 dependencies = [ 4218 4268 "proc-macro2", 4219 4269 "quote", 4220 - "syn 2.0.104", 4270 + "syn 2.0.109", 4221 4271 ] 4222 4272 4223 4273 [[package]] ··· 4228 4278 dependencies = [ 4229 4279 "proc-macro2", 4230 4280 "quote", 4231 - "syn 2.0.104", 4281 + "syn 2.0.109", 4232 4282 ] 4233 4283 4234 4284 [[package]] 4235 4285 name = "serde_json" 4236 - version = "1.0.141" 4286 + version = "1.0.145" 4237 4287 source = "registry+https://github.com/rust-lang/crates.io-index" 4238 - checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" 4288 + checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" 4239 4289 dependencies = [ 4240 4290 "itoa", 4241 4291 "memchr", 4242 4292 "ryu", 4243 4293 "serde", 4294 + "serde_core", 4244 4295 ] 4245 4296 4246 4297 [[package]] ··· 4251 4302 dependencies = [ 4252 4303 "proc-macro2", 4253 4304 "quote", 4254 - "syn 2.0.104", 4305 + "syn 2.0.109", 4255 4306 ] 4256 4307 4257 4308 [[package]] ··· 4265 4316 4266 4317 [[package]] 4267 4318 name = "serde_spanned" 4268 - version = "1.0.0" 4319 + version = "1.0.3" 4269 4320 source = "registry+https://github.com/rust-lang/crates.io-index" 4270 - checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" 4321 + checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" 4271 4322 dependencies = [ 4272 - "serde", 4323 + "serde_core", 4273 4324 ] 4274 4325 4275 4326 [[package]] ··· 4286 4337 4287 4338 [[package]] 4288 4339 name = "serde_with" 4289 - version = "3.14.0" 4340 + version = "3.15.1" 4290 4341 source = "registry+https://github.com/rust-lang/crates.io-index" 4291 - checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" 4342 + checksum = "aa66c845eee442168b2c8134fec70ac50dc20e760769c8ba0ad1319ca1959b04" 4292 4343 dependencies = [ 4293 4344 "base64 0.22.1", 4294 4345 "chrono", 4295 4346 "hex", 4296 4347 "indexmap 1.9.3", 4297 - "indexmap 2.10.0", 4348 + "indexmap 2.12.0", 4298 4349 "schemars 0.9.0", 4299 - "schemars 1.0.4", 4300 - "serde", 4301 - "serde_derive", 4350 + "schemars 1.1.0", 4351 + "serde_core", 4302 4352 "serde_json", 4303 4353 "serde_with_macros", 4304 4354 "time", ··· 4306 4356 4307 4357 [[package]] 4308 4358 name = "serde_with_macros" 4309 - version = "3.14.0" 4359 + version = "3.15.1" 4310 4360 source = "registry+https://github.com/rust-lang/crates.io-index" 4311 - checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" 4361 + checksum = "b91a903660542fced4e99881aa481bdbaec1634568ee02e0b8bd57c64cb38955" 4312 4362 dependencies = [ 4313 4363 "darling", 4314 4364 "proc-macro2", 4315 4365 "quote", 4316 - "syn 2.0.104", 4366 + "syn 2.0.109", 4317 4367 ] 4318 4368 4319 4369 [[package]] 4320 4370 name = "serialize-to-javascript" 4321 - version = "0.1.1" 4371 + version = "0.1.2" 4322 4372 source = "registry+https://github.com/rust-lang/crates.io-index" 4323 - checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" 4373 + checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" 4324 4374 dependencies = [ 4325 4375 "serde", 4326 4376 "serde_json", ··· 4329 4379 4330 4380 [[package]] 4331 4381 name = "serialize-to-javascript-impl" 4332 - version = "0.1.1" 4382 + version = "0.1.2" 4333 4383 source = "registry+https://github.com/rust-lang/crates.io-index" 4334 - checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" 4384 + checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" 4335 4385 dependencies = [ 4336 4386 "proc-macro2", 4337 4387 "quote", 4338 - "syn 1.0.109", 4388 + "syn 2.0.109", 4339 4389 ] 4340 4390 4341 4391 [[package]] ··· 4349 4399 ] 4350 4400 4351 4401 [[package]] 4352 - name = "sha1" 4353 - version = "0.10.6" 4354 - source = "registry+https://github.com/rust-lang/crates.io-index" 4355 - checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 4356 - dependencies = [ 4357 - "cfg-if", 4358 - "cpufeatures", 4359 - "digest", 4360 - ] 4361 - 4362 - [[package]] 4363 4402 name = "sha2" 4364 4403 version = "0.10.9" 4365 4404 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4410 4449 4411 4450 [[package]] 4412 4451 name = "signal-hook-registry" 4413 - version = "1.4.5" 4452 + version = "1.4.6" 4414 4453 source = "registry+https://github.com/rust-lang/crates.io-index" 4415 - checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" 4454 + checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" 4416 4455 dependencies = [ 4417 4456 "libc", 4418 4457 ] ··· 4446 4485 4447 4486 [[package]] 4448 4487 name = "slab" 4449 - version = "0.4.10" 4488 + version = "0.4.11" 4450 4489 source = "registry+https://github.com/rust-lang/crates.io-index" 4451 - checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" 4490 + checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" 4452 4491 4453 4492 [[package]] 4454 4493 name = "smallvec" ··· 4458 4497 4459 4498 [[package]] 4460 4499 name = "socket2" 4461 - version = "0.5.10" 4500 + version = "0.6.1" 4462 4501 source = "registry+https://github.com/rust-lang/crates.io-index" 4463 - checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" 4502 + checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" 4464 4503 dependencies = [ 4465 4504 "libc", 4466 - "windows-sys 0.52.0", 4467 - ] 4468 - 4469 - [[package]] 4470 - name = "socket2" 4471 - version = "0.6.0" 4472 - source = "registry+https://github.com/rust-lang/crates.io-index" 4473 - checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" 4474 - dependencies = [ 4475 - "libc", 4476 - "windows-sys 0.59.0", 4505 + "windows-sys 0.60.2", 4477 4506 ] 4478 4507 4479 4508 [[package]] ··· 4526 4555 4527 4556 [[package]] 4528 4557 name = "stable_deref_trait" 4529 - version = "1.2.0" 4558 + version = "1.2.1" 4530 4559 source = "registry+https://github.com/rust-lang/crates.io-index" 4531 - checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 4560 + checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" 4532 4561 4533 4562 [[package]] 4534 4563 name = "static_assertions" ··· 4597 4626 4598 4627 [[package]] 4599 4628 name = "syn" 4600 - version = "2.0.104" 4629 + version = "2.0.109" 4601 4630 source = "registry+https://github.com/rust-lang/crates.io-index" 4602 - checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" 4631 + checksum = "2f17c7e013e88258aa9543dcbe81aca68a667a9ac37cd69c9fbc07858bfe0e2f" 4603 4632 dependencies = [ 4604 4633 "proc-macro2", 4605 4634 "quote", ··· 4623 4652 dependencies = [ 4624 4653 "proc-macro2", 4625 4654 "quote", 4626 - "syn 2.0.104", 4655 + "syn 2.0.109", 4627 4656 ] 4628 4657 4629 4658 [[package]] ··· 4632 4661 source = "registry+https://github.com/rust-lang/crates.io-index" 4633 4662 checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" 4634 4663 dependencies = [ 4635 - "bitflags 2.9.1", 4664 + "bitflags 2.10.0", 4636 4665 "core-foundation 0.9.4", 4637 4666 "system-configuration-sys", 4638 4667 ] ··· 4662 4691 4663 4692 [[package]] 4664 4693 name = "tao" 4665 - version = "0.34.0" 4694 + version = "0.34.5" 4666 4695 source = "registry+https://github.com/rust-lang/crates.io-index" 4667 - checksum = "49c380ca75a231b87b6c9dd86948f035012e7171d1a7c40a9c2890489a7ffd8a" 4696 + checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" 4668 4697 dependencies = [ 4669 - "bitflags 2.9.1", 4698 + "bitflags 2.10.0", 4699 + "block2 0.6.2", 4670 4700 "core-foundation 0.10.1", 4671 4701 "core-graphics", 4672 4702 "crossbeam-channel", ··· 4683 4713 "ndk", 4684 4714 "ndk-context", 4685 4715 "ndk-sys", 4686 - "objc2 0.6.1", 4716 + "objc2 0.6.3", 4687 4717 "objc2-app-kit", 4688 - "objc2-foundation 0.3.1", 4718 + "objc2-foundation 0.3.2", 4689 4719 "once_cell", 4690 4720 "parking_lot", 4691 4721 "raw-window-handle", ··· 4694 4724 "unicode-segmentation", 4695 4725 "url", 4696 4726 "windows", 4697 - "windows-core", 4727 + "windows-core 0.61.2", 4698 4728 "windows-version", 4699 4729 "x11-dl", 4700 4730 ] ··· 4707 4737 dependencies = [ 4708 4738 "proc-macro2", 4709 4739 "quote", 4710 - "syn 2.0.104", 4740 + "syn 2.0.109", 4711 4741 ] 4712 4742 4713 4743 [[package]] ··· 4718 4748 4719 4749 [[package]] 4720 4750 name = "tauri" 4721 - version = "2.7.0" 4751 + version = "2.9.2" 4722 4752 source = "registry+https://github.com/rust-lang/crates.io-index" 4723 - checksum = "352a4bc7bf6c25f5624227e3641adf475a6535707451b09bb83271df8b7a6ac7" 4753 + checksum = "8bceb52453e507c505b330afe3398510e87f428ea42b6e76ecb6bd63b15965b5" 4724 4754 dependencies = [ 4725 4755 "anyhow", 4726 4756 "bytes", 4727 - "dirs 6.0.0", 4757 + "cookie", 4758 + "dirs", 4728 4759 "dunce", 4729 4760 "embed_plist", 4730 - "getrandom 0.3.3", 4761 + "getrandom 0.3.4", 4731 4762 "glob", 4732 4763 "gtk", 4733 4764 "heck 0.5.0", ··· 4738 4769 "log", 4739 4770 "mime", 4740 4771 "muda", 4741 - "objc2 0.6.1", 4772 + "objc2 0.6.3", 4742 4773 "objc2-app-kit", 4743 - "objc2-foundation 0.3.1", 4774 + "objc2-foundation 0.3.2", 4744 4775 "objc2-ui-kit", 4776 + "objc2-web-kit", 4745 4777 "percent-encoding", 4746 4778 "plist", 4747 4779 "raw-window-handle", ··· 4756 4788 "tauri-runtime", 4757 4789 "tauri-runtime-wry", 4758 4790 "tauri-utils", 4759 - "thiserror 2.0.12", 4791 + "thiserror 2.0.17", 4760 4792 "tokio", 4761 4793 "tray-icon", 4762 4794 "url", 4763 - "urlpattern", 4764 4795 "webkit2gtk", 4765 4796 "webview2-com", 4766 4797 "window-vibrancy", ··· 4769 4800 4770 4801 [[package]] 4771 4802 name = "tauri-build" 4772 - version = "2.3.1" 4803 + version = "2.5.1" 4773 4804 source = "registry+https://github.com/rust-lang/crates.io-index" 4774 - checksum = "182d688496c06bf08ea896459bf483eb29cdff35c1c4c115fb14053514303064" 4805 + checksum = "a924b6c50fe83193f0f8b14072afa7c25b7a72752a2a73d9549b463f5fe91a38" 4775 4806 dependencies = [ 4776 4807 "anyhow", 4777 4808 "cargo_toml", 4778 - "dirs 6.0.0", 4809 + "dirs", 4779 4810 "glob", 4780 4811 "heck 0.5.0", 4781 4812 "json-patch", ··· 4785 4816 "serde_json", 4786 4817 "tauri-utils", 4787 4818 "tauri-winres", 4788 - "toml 0.8.2", 4819 + "toml 0.9.8", 4789 4820 "walkdir", 4790 4821 ] 4791 4822 4792 4823 [[package]] 4793 4824 name = "tauri-codegen" 4794 - version = "2.3.1" 4825 + version = "2.5.0" 4795 4826 source = "registry+https://github.com/rust-lang/crates.io-index" 4796 - checksum = "b54a99a6cd8e01abcfa61508177e6096a4fe2681efecee9214e962f2f073ae4a" 4827 + checksum = "6c1fe64c74cc40f90848281a90058a6db931eb400b60205840e09801ee30f190" 4797 4828 dependencies = [ 4798 4829 "base64 0.22.1", 4799 4830 "brotli", 4800 4831 "ico", 4801 4832 "json-patch", 4802 4833 "plist", 4803 - "png", 4834 + "png 0.17.16", 4804 4835 "proc-macro2", 4805 4836 "quote", 4806 4837 "semver", 4807 4838 "serde", 4808 4839 "serde_json", 4809 4840 "sha2", 4810 - "syn 2.0.104", 4841 + "syn 2.0.109", 4811 4842 "tauri-utils", 4812 - "thiserror 2.0.12", 4843 + "thiserror 2.0.17", 4813 4844 "time", 4814 4845 "url", 4815 4846 "uuid", ··· 4818 4849 4819 4850 [[package]] 4820 4851 name = "tauri-macros" 4821 - version = "2.3.2" 4852 + version = "2.5.0" 4822 4853 source = "registry+https://github.com/rust-lang/crates.io-index" 4823 - checksum = "7945b14dc45e23532f2ded6e120170bbdd4af5ceaa45784a6b33d250fbce3f9e" 4854 + checksum = "260c5d2eb036b76206b9fca20b7be3614cfd21046c5396f7959e0e64a4b07f2f" 4824 4855 dependencies = [ 4825 4856 "heck 0.5.0", 4826 4857 "proc-macro2", 4827 4858 "quote", 4828 - "syn 2.0.104", 4859 + "syn 2.0.109", 4829 4860 "tauri-codegen", 4830 4861 "tauri-utils", 4831 4862 ] 4832 4863 4833 4864 [[package]] 4834 4865 name = "tauri-plugin" 4835 - version = "2.3.1" 4866 + version = "2.5.1" 4836 4867 source = "registry+https://github.com/rust-lang/crates.io-index" 4837 - checksum = "5bd5c1e56990c70a906ef67a9851bbdba9136d26075ee9a2b19c8b46986b3e02" 4868 + checksum = "076c78a474a7247c90cad0b6e87e593c4c620ed4efdb79cbe0214f0021f6c39d" 4838 4869 dependencies = [ 4839 4870 "anyhow", 4840 4871 "glob", ··· 4843 4874 "serde", 4844 4875 "serde_json", 4845 4876 "tauri-utils", 4846 - "toml 0.8.2", 4877 + "toml 0.9.8", 4847 4878 "walkdir", 4848 4879 ] 4849 4880 4850 4881 [[package]] 4851 4882 name = "tauri-plugin-deep-link" 4852 - version = "2.4.1" 4883 + version = "2.4.5" 4853 4884 source = "registry+https://github.com/rust-lang/crates.io-index" 4854 - checksum = "1fec67f32d7a06d80bd3dc009fdb678c35a66116d9cb8cd2bb32e406c2b5bbd2" 4885 + checksum = "6e82759f7c7d51de3cbde51c04b3f2332de52436ed84541182cd8944b04e9e73" 4855 4886 dependencies = [ 4856 4887 "dunce", 4888 + "plist", 4857 4889 "rust-ini", 4858 4890 "serde", 4859 4891 "serde_json", 4860 4892 "tauri", 4861 4893 "tauri-plugin", 4862 4894 "tauri-utils", 4863 - "thiserror 2.0.12", 4895 + "thiserror 2.0.17", 4864 4896 "tracing", 4865 4897 "url", 4866 4898 "windows-registry", 4867 - "windows-result", 4899 + "windows-result 0.3.4", 4868 4900 ] 4869 4901 4870 4902 [[package]] 4871 4903 name = "tauri-plugin-fs" 4872 - version = "2.4.1" 4904 + version = "2.4.4" 4873 4905 source = "registry+https://github.com/rust-lang/crates.io-index" 4874 - checksum = "8c6ef84ee2f2094ce093e55106d90d763ba343fad57566992962e8f76d113f99" 4906 + checksum = "47df422695255ecbe7bac7012440eddaeefd026656171eac9559f5243d3230d9" 4875 4907 dependencies = [ 4876 4908 "anyhow", 4877 4909 "dunce", ··· 4884 4916 "tauri", 4885 4917 "tauri-plugin", 4886 4918 "tauri-utils", 4887 - "thiserror 2.0.12", 4888 - "toml 0.8.2", 4919 + "thiserror 2.0.17", 4920 + "toml 0.9.8", 4889 4921 "url", 4890 4922 ] 4891 4923 4892 4924 [[package]] 4893 4925 name = "tauri-plugin-http" 4894 - version = "2.5.1" 4926 + version = "2.5.4" 4895 4927 source = "registry+https://github.com/rust-lang/crates.io-index" 4896 - checksum = "fcde333d97e565a7765aad82f32d8672458f7bd77b6ee653830d5dded9d7b5c2" 4928 + checksum = "c00685aceab12643cf024f712ab0448ba8fcadf86f2391d49d2e5aa732aacc70" 4897 4929 dependencies = [ 4898 4930 "bytes", 4899 4931 "cookie_store", ··· 4907 4939 "tauri", 4908 4940 "tauri-plugin", 4909 4941 "tauri-plugin-fs", 4910 - "thiserror 2.0.12", 4942 + "thiserror 2.0.17", 4911 4943 "tokio", 4912 4944 "url", 4913 4945 "urlpattern", ··· 4915 4947 4916 4948 [[package]] 4917 4949 name = "tauri-plugin-process" 4918 - version = "2.3.0" 4950 + version = "2.3.1" 4919 4951 source = "registry+https://github.com/rust-lang/crates.io-index" 4920 - checksum = "7461c622a5ea00eb9cd9f7a08dbd3bf79484499fd5c21aa2964677f64ca651ab" 4952 + checksum = "d55511a7bf6cd70c8767b02c97bf8134fa434daf3926cfc1be0a0f94132d165a" 4921 4953 dependencies = [ 4922 4954 "tauri", 4923 4955 "tauri-plugin", ··· 4925 4957 4926 4958 [[package]] 4927 4959 name = "tauri-plugin-shell" 4928 - version = "2.3.0" 4960 + version = "2.3.3" 4929 4961 source = "registry+https://github.com/rust-lang/crates.io-index" 4930 - checksum = "2b9ffadec5c3523f11e8273465cacb3d86ea7652a28e6e2a2e9b5c182f791d25" 4962 + checksum = "c374b6db45f2a8a304f0273a15080d98c70cde86178855fc24653ba657a1144c" 4931 4963 dependencies = [ 4932 4964 "encoding_rs", 4933 4965 "log", ··· 4940 4972 "shared_child", 4941 4973 "tauri", 4942 4974 "tauri-plugin", 4943 - "thiserror 2.0.12", 4975 + "thiserror 2.0.17", 4944 4976 "tokio", 4945 4977 ] 4946 4978 4947 4979 [[package]] 4948 4980 name = "tauri-plugin-single-instance" 4949 - version = "2.2.0" 4981 + version = "2.3.6" 4950 4982 source = "registry+https://github.com/rust-lang/crates.io-index" 4951 - checksum = "0f36019ee9832dc99e4450bb55a21cfad8633b19c2c18bd17c7741939b070ede" 4983 + checksum = "dd707f8c86b4e3004e2c141fa24351f1909ba40ce1b8437e30d5ed5277dd3710" 4952 4984 dependencies = [ 4953 4985 "serde", 4954 4986 "serde_json", 4955 4987 "tauri", 4956 4988 "tauri-plugin-deep-link", 4957 - "thiserror 2.0.12", 4989 + "thiserror 2.0.17", 4958 4990 "tracing", 4959 - "windows-sys 0.59.0", 4991 + "windows-sys 0.60.2", 4960 4992 "zbus", 4961 4993 ] 4962 4994 4963 4995 [[package]] 4964 4996 name = "tauri-runtime" 4965 - version = "2.7.1" 4997 + version = "2.9.1" 4966 4998 source = "registry+https://github.com/rust-lang/crates.io-index" 4967 - checksum = "2b1cc885be806ea15ff7b0eb47098a7b16323d9228876afda329e34e2d6c4676" 4999 + checksum = "9368f09358496f2229313fccb37682ad116b7f46fa76981efe116994a0628926" 4968 5000 dependencies = [ 4969 5001 "cookie", 4970 5002 "dpi", 4971 5003 "gtk", 4972 5004 "http", 4973 5005 "jni", 4974 - "objc2 0.6.1", 5006 + "objc2 0.6.3", 4975 5007 "objc2-ui-kit", 5008 + "objc2-web-kit", 4976 5009 "raw-window-handle", 4977 5010 "serde", 4978 5011 "serde_json", 4979 5012 "tauri-utils", 4980 - "thiserror 2.0.12", 5013 + "thiserror 2.0.17", 4981 5014 "url", 5015 + "webkit2gtk", 5016 + "webview2-com", 4982 5017 "windows", 4983 5018 ] 4984 5019 4985 5020 [[package]] 4986 5021 name = "tauri-runtime-wry" 4987 - version = "2.7.2" 5022 + version = "2.9.1" 4988 5023 source = "registry+https://github.com/rust-lang/crates.io-index" 4989 - checksum = "fe653a2fbbef19fe898efc774bc52c8742576342a33d3d028c189b57eb1d2439" 5024 + checksum = "929f5df216f5c02a9e894554401bcdab6eec3e39ec6a4a7731c7067fc8688a93" 4990 5025 dependencies = [ 4991 5026 "gtk", 4992 5027 "http", 4993 5028 "jni", 4994 5029 "log", 4995 - "objc2 0.6.1", 5030 + "objc2 0.6.3", 4996 5031 "objc2-app-kit", 4997 - "objc2-foundation 0.3.1", 5032 + "objc2-foundation 0.3.2", 4998 5033 "once_cell", 4999 5034 "percent-encoding", 5000 5035 "raw-window-handle", ··· 5011 5046 5012 5047 [[package]] 5013 5048 name = "tauri-utils" 5014 - version = "2.6.0" 5049 + version = "2.8.0" 5015 5050 source = "registry+https://github.com/rust-lang/crates.io-index" 5016 - checksum = "9330c15cabfe1d9f213478c9e8ec2b0c76dab26bb6f314b8ad1c8a568c1d186e" 5051 + checksum = "f6b8bbe426abdbf52d050e52ed693130dbd68375b9ad82a3fb17efb4c8d85673" 5017 5052 dependencies = [ 5018 5053 "anyhow", 5019 5054 "brotli", ··· 5039 5074 "serde_json", 5040 5075 "serde_with", 5041 5076 "swift-rs", 5042 - "thiserror 2.0.12", 5043 - "toml 0.8.2", 5077 + "thiserror 2.0.17", 5078 + "toml 0.9.8", 5044 5079 "url", 5045 5080 "urlpattern", 5046 5081 "uuid", ··· 5049 5084 5050 5085 [[package]] 5051 5086 name = "tauri-winres" 5052 - version = "0.3.2" 5087 + version = "0.3.3" 5053 5088 source = "registry+https://github.com/rust-lang/crates.io-index" 5054 - checksum = "7c6d9028d41d4de835e3c482c677a8cb88137ac435d6ff9a71f392d4421576c9" 5089 + checksum = "fd21509dd1fa9bd355dc29894a6ff10635880732396aa38c0066c1e6c1ab8074" 5055 5090 dependencies = [ 5056 5091 "embed-resource", 5057 - "indexmap 2.10.0", 5058 - "toml 0.9.4", 5092 + "toml 0.9.8", 5059 5093 ] 5060 5094 5061 5095 [[package]] 5062 5096 name = "tempfile" 5063 - version = "3.20.0" 5097 + version = "3.23.0" 5064 5098 source = "registry+https://github.com/rust-lang/crates.io-index" 5065 - checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" 5099 + checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" 5066 5100 dependencies = [ 5067 5101 "fastrand", 5068 - "getrandom 0.3.3", 5102 + "getrandom 0.3.4", 5069 5103 "once_cell", 5070 5104 "rustix", 5071 - "windows-sys 0.59.0", 5105 + "windows-sys 0.61.2", 5072 5106 ] 5073 5107 5074 5108 [[package]] ··· 5093 5127 5094 5128 [[package]] 5095 5129 name = "thiserror" 5096 - version = "2.0.12" 5130 + version = "2.0.17" 5097 5131 source = "registry+https://github.com/rust-lang/crates.io-index" 5098 - checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 5132 + checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" 5099 5133 dependencies = [ 5100 - "thiserror-impl 2.0.12", 5134 + "thiserror-impl 2.0.17", 5101 5135 ] 5102 5136 5103 5137 [[package]] ··· 5108 5142 dependencies = [ 5109 5143 "proc-macro2", 5110 5144 "quote", 5111 - "syn 2.0.104", 5145 + "syn 2.0.109", 5112 5146 ] 5113 5147 5114 5148 [[package]] 5115 5149 name = "thiserror-impl" 5116 - version = "2.0.12" 5150 + version = "2.0.17" 5117 5151 source = "registry+https://github.com/rust-lang/crates.io-index" 5118 - checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 5152 + checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" 5119 5153 dependencies = [ 5120 5154 "proc-macro2", 5121 5155 "quote", 5122 - "syn 2.0.104", 5156 + "syn 2.0.109", 5123 5157 ] 5124 5158 5125 5159 [[package]] 5126 5160 name = "tiff" 5127 - version = "0.9.1" 5161 + version = "0.10.3" 5128 5162 source = "registry+https://github.com/rust-lang/crates.io-index" 5129 - checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" 5163 + checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f" 5130 5164 dependencies = [ 5165 + "fax", 5131 5166 "flate2", 5132 - "jpeg-decoder", 5167 + "half", 5168 + "quick-error", 5133 5169 "weezl", 5170 + "zune-jpeg", 5134 5171 ] 5135 5172 5136 5173 [[package]] 5137 5174 name = "time" 5138 - version = "0.3.41" 5175 + version = "0.3.44" 5139 5176 source = "registry+https://github.com/rust-lang/crates.io-index" 5140 - checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" 5177 + checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" 5141 5178 dependencies = [ 5142 5179 "deranged", 5143 5180 "itoa", ··· 5150 5187 5151 5188 [[package]] 5152 5189 name = "time-core" 5153 - version = "0.1.4" 5190 + version = "0.1.6" 5154 5191 source = "registry+https://github.com/rust-lang/crates.io-index" 5155 - checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" 5192 + checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" 5156 5193 5157 5194 [[package]] 5158 5195 name = "time-macros" 5159 - version = "0.2.22" 5196 + version = "0.2.24" 5160 5197 source = "registry+https://github.com/rust-lang/crates.io-index" 5161 - checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" 5198 + checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" 5162 5199 dependencies = [ 5163 5200 "num-conv", 5164 5201 "time-core", ··· 5175 5212 5176 5213 [[package]] 5177 5214 name = "tinystr" 5178 - version = "0.8.1" 5215 + version = "0.8.2" 5179 5216 source = "registry+https://github.com/rust-lang/crates.io-index" 5180 - checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 5217 + checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" 5181 5218 dependencies = [ 5182 5219 "displaydoc", 5183 5220 "zerovec", ··· 5185 5222 5186 5223 [[package]] 5187 5224 name = "tinyvec" 5188 - version = "1.9.0" 5225 + version = "1.10.0" 5189 5226 source = "registry+https://github.com/rust-lang/crates.io-index" 5190 - checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" 5227 + checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" 5191 5228 dependencies = [ 5192 5229 "tinyvec_macros", 5193 5230 ] ··· 5200 5237 5201 5238 [[package]] 5202 5239 name = "tokio" 5203 - version = "1.47.0" 5240 + version = "1.48.0" 5204 5241 source = "registry+https://github.com/rust-lang/crates.io-index" 5205 - checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35" 5242 + checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" 5206 5243 dependencies = [ 5207 - "backtrace", 5208 5244 "bytes", 5209 - "io-uring", 5210 5245 "libc", 5211 - "mio 1.0.4", 5246 + "mio", 5212 5247 "pin-project-lite", 5213 - "slab", 5214 - "socket2 0.6.0", 5248 + "socket2", 5215 5249 "tokio-macros", 5216 - "windows-sys 0.59.0", 5250 + "windows-sys 0.61.2", 5217 5251 ] 5218 5252 5219 5253 [[package]] 5220 5254 name = "tokio-macros" 5221 - version = "2.5.0" 5255 + version = "2.6.0" 5222 5256 source = "registry+https://github.com/rust-lang/crates.io-index" 5223 - checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 5257 + checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" 5224 5258 dependencies = [ 5225 5259 "proc-macro2", 5226 5260 "quote", 5227 - "syn 2.0.104", 5261 + "syn 2.0.109", 5228 5262 ] 5229 5263 5230 5264 [[package]] ··· 5239 5273 5240 5274 [[package]] 5241 5275 name = "tokio-rustls" 5242 - version = "0.26.2" 5276 + version = "0.26.4" 5243 5277 source = "registry+https://github.com/rust-lang/crates.io-index" 5244 - checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" 5278 + checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" 5245 5279 dependencies = [ 5246 5280 "rustls", 5247 5281 "tokio", ··· 5249 5283 5250 5284 [[package]] 5251 5285 name = "tokio-util" 5252 - version = "0.7.15" 5286 + version = "0.7.17" 5253 5287 source = "registry+https://github.com/rust-lang/crates.io-index" 5254 - checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" 5288 + checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" 5255 5289 dependencies = [ 5256 5290 "bytes", 5257 5291 "futures-core", ··· 5274 5308 5275 5309 [[package]] 5276 5310 name = "toml" 5277 - version = "0.9.4" 5311 + version = "0.9.8" 5278 5312 source = "registry+https://github.com/rust-lang/crates.io-index" 5279 - checksum = "41ae868b5a0f67631c14589f7e250c1ea2c574ee5ba21c6c8dd4b1485705a5a1" 5313 + checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" 5280 5314 dependencies = [ 5281 - "indexmap 2.10.0", 5282 - "serde", 5283 - "serde_spanned 1.0.0", 5284 - "toml_datetime 0.7.0", 5315 + "indexmap 2.12.0", 5316 + "serde_core", 5317 + "serde_spanned 1.0.3", 5318 + "toml_datetime 0.7.3", 5285 5319 "toml_parser", 5286 5320 "toml_writer", 5287 - "winnow 0.7.12", 5321 + "winnow 0.7.13", 5288 5322 ] 5289 5323 5290 5324 [[package]] ··· 5298 5332 5299 5333 [[package]] 5300 5334 name = "toml_datetime" 5301 - version = "0.7.0" 5335 + version = "0.7.3" 5302 5336 source = "registry+https://github.com/rust-lang/crates.io-index" 5303 - checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" 5337 + checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" 5304 5338 dependencies = [ 5305 - "serde", 5339 + "serde_core", 5306 5340 ] 5307 5341 5308 5342 [[package]] ··· 5311 5345 source = "registry+https://github.com/rust-lang/crates.io-index" 5312 5346 checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" 5313 5347 dependencies = [ 5314 - "indexmap 2.10.0", 5348 + "indexmap 2.12.0", 5315 5349 "toml_datetime 0.6.3", 5316 5350 "winnow 0.5.40", 5317 5351 ] ··· 5322 5356 source = "registry+https://github.com/rust-lang/crates.io-index" 5323 5357 checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" 5324 5358 dependencies = [ 5325 - "indexmap 2.10.0", 5359 + "indexmap 2.12.0", 5326 5360 "serde", 5327 5361 "serde_spanned 0.6.9", 5328 5362 "toml_datetime 0.6.3", ··· 5330 5364 ] 5331 5365 5332 5366 [[package]] 5367 + name = "toml_edit" 5368 + version = "0.23.7" 5369 + source = "registry+https://github.com/rust-lang/crates.io-index" 5370 + checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" 5371 + dependencies = [ 5372 + "indexmap 2.12.0", 5373 + "toml_datetime 0.7.3", 5374 + "toml_parser", 5375 + "winnow 0.7.13", 5376 + ] 5377 + 5378 + [[package]] 5333 5379 name = "toml_parser" 5334 - version = "1.0.1" 5380 + version = "1.0.4" 5335 5381 source = "registry+https://github.com/rust-lang/crates.io-index" 5336 - checksum = "97200572db069e74c512a14117b296ba0a80a30123fbbb5aa1f4a348f639ca30" 5382 + checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" 5337 5383 dependencies = [ 5338 - "winnow 0.7.12", 5384 + "winnow 0.7.13", 5339 5385 ] 5340 5386 5341 5387 [[package]] 5342 5388 name = "toml_writer" 5343 - version = "1.0.2" 5389 + version = "1.0.4" 5344 5390 source = "registry+https://github.com/rust-lang/crates.io-index" 5345 - checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" 5391 + checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" 5346 5392 5347 5393 [[package]] 5348 5394 name = "tower" ··· 5365 5411 source = "registry+https://github.com/rust-lang/crates.io-index" 5366 5412 checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" 5367 5413 dependencies = [ 5368 - "bitflags 2.9.1", 5414 + "bitflags 2.10.0", 5369 5415 "bytes", 5370 5416 "futures-util", 5371 5417 "http", ··· 5408 5454 dependencies = [ 5409 5455 "proc-macro2", 5410 5456 "quote", 5411 - "syn 2.0.104", 5457 + "syn 2.0.109", 5412 5458 ] 5413 5459 5414 5460 [[package]] ··· 5422 5468 5423 5469 [[package]] 5424 5470 name = "tray-icon" 5425 - version = "0.21.1" 5471 + version = "0.21.2" 5426 5472 source = "registry+https://github.com/rust-lang/crates.io-index" 5427 - checksum = "a0d92153331e7d02ec09137538996a7786fe679c629c279e82a6be762b7e6fe2" 5473 + checksum = "e3d5572781bee8e3f994d7467084e1b1fd7a93ce66bd480f8156ba89dee55a2b" 5428 5474 dependencies = [ 5429 5475 "crossbeam-channel", 5430 - "dirs 6.0.0", 5476 + "dirs", 5431 5477 "libappindicator", 5432 5478 "muda", 5433 - "objc2 0.6.1", 5479 + "objc2 0.6.3", 5434 5480 "objc2-app-kit", 5435 5481 "objc2-core-foundation", 5436 5482 "objc2-core-graphics", 5437 - "objc2-foundation 0.3.1", 5483 + "objc2-foundation 0.3.2", 5438 5484 "once_cell", 5439 - "png", 5485 + "png 0.17.16", 5440 5486 "serde", 5441 - "thiserror 2.0.12", 5442 - "windows-sys 0.59.0", 5487 + "thiserror 2.0.17", 5488 + "windows-sys 0.60.2", 5443 5489 ] 5444 5490 5445 5491 [[package]] ··· 5456 5502 5457 5503 [[package]] 5458 5504 name = "typenum" 5459 - version = "1.18.0" 5505 + version = "1.19.0" 5460 5506 source = "registry+https://github.com/rust-lang/crates.io-index" 5461 - checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 5507 + checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" 5462 5508 5463 5509 [[package]] 5464 5510 name = "uds_windows" ··· 5514 5560 5515 5561 [[package]] 5516 5562 name = "unicode-ident" 5517 - version = "1.0.18" 5563 + version = "1.0.22" 5518 5564 source = "registry+https://github.com/rust-lang/crates.io-index" 5519 - checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 5565 + checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" 5520 5566 5521 5567 [[package]] 5522 5568 name = "unicode-segmentation" ··· 5532 5578 5533 5579 [[package]] 5534 5580 name = "url" 5535 - version = "2.5.4" 5581 + version = "2.5.7" 5536 5582 source = "registry+https://github.com/rust-lang/crates.io-index" 5537 - checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 5583 + checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" 5538 5584 dependencies = [ 5539 5585 "form_urlencoded", 5540 5586 "idna", ··· 5568 5614 5569 5615 [[package]] 5570 5616 name = "uuid" 5571 - version = "1.17.0" 5617 + version = "1.18.1" 5572 5618 source = "registry+https://github.com/rust-lang/crates.io-index" 5573 - checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" 5619 + checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" 5574 5620 dependencies = [ 5575 - "getrandom 0.3.3", 5621 + "getrandom 0.3.4", 5576 5622 "js-sys", 5577 5623 "serde", 5578 5624 "wasm-bindgen", ··· 5597 5643 5598 5644 [[package]] 5599 5645 name = "version-compare" 5600 - version = "0.2.0" 5646 + version = "0.2.1" 5601 5647 source = "registry+https://github.com/rust-lang/crates.io-index" 5602 - checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" 5648 + checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" 5603 5649 5604 5650 [[package]] 5605 5651 name = "version_check" ··· 5608 5654 checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 5609 5655 5610 5656 [[package]] 5611 - name = "vrcpm-rs" 5612 - version = "0.2.4" 5613 - dependencies = [ 5614 - "dirs 5.0.1", 5615 - "fast_image_resize", 5616 - "image", 5617 - "mslnk", 5618 - "notify", 5619 - "open", 5620 - "regex", 5621 - "reqwest", 5622 - "serde", 5623 - "serde_json", 5624 - "tauri", 5625 - "tauri-build", 5626 - "tauri-plugin-deep-link", 5627 - "tauri-plugin-http", 5628 - "tauri-plugin-process", 5629 - "tauri-plugin-shell", 5630 - "tauri-plugin-single-instance", 5631 - ] 5632 - 5633 - [[package]] 5634 5657 name = "vswhom" 5635 5658 version = "0.1.0" 5636 5659 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 5682 5705 checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 5683 5706 5684 5707 [[package]] 5685 - name = "wasi" 5686 - version = "0.14.2+wasi-0.2.4" 5708 + name = "wasip2" 5709 + version = "1.0.1+wasi-0.2.4" 5687 5710 source = "registry+https://github.com/rust-lang/crates.io-index" 5688 - checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 5711 + checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" 5689 5712 dependencies = [ 5690 - "wit-bindgen-rt", 5713 + "wit-bindgen", 5691 5714 ] 5692 5715 5693 5716 [[package]] 5694 5717 name = "wasm-bindgen" 5695 - version = "0.2.100" 5718 + version = "0.2.105" 5696 5719 source = "registry+https://github.com/rust-lang/crates.io-index" 5697 - checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 5720 + checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" 5698 5721 dependencies = [ 5699 5722 "cfg-if", 5700 5723 "once_cell", 5701 5724 "rustversion", 5702 5725 "wasm-bindgen-macro", 5703 - ] 5704 - 5705 - [[package]] 5706 - name = "wasm-bindgen-backend" 5707 - version = "0.2.100" 5708 - source = "registry+https://github.com/rust-lang/crates.io-index" 5709 - checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 5710 - dependencies = [ 5711 - "bumpalo", 5712 - "log", 5713 - "proc-macro2", 5714 - "quote", 5715 - "syn 2.0.104", 5716 5726 "wasm-bindgen-shared", 5717 5727 ] 5718 5728 5719 5729 [[package]] 5720 5730 name = "wasm-bindgen-futures" 5721 - version = "0.4.50" 5731 + version = "0.4.55" 5722 5732 source = "registry+https://github.com/rust-lang/crates.io-index" 5723 - checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 5733 + checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" 5724 5734 dependencies = [ 5725 5735 "cfg-if", 5726 5736 "js-sys", ··· 5731 5741 5732 5742 [[package]] 5733 5743 name = "wasm-bindgen-macro" 5734 - version = "0.2.100" 5744 + version = "0.2.105" 5735 5745 source = "registry+https://github.com/rust-lang/crates.io-index" 5736 - checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 5746 + checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" 5737 5747 dependencies = [ 5738 5748 "quote", 5739 5749 "wasm-bindgen-macro-support", ··· 5741 5751 5742 5752 [[package]] 5743 5753 name = "wasm-bindgen-macro-support" 5744 - version = "0.2.100" 5754 + version = "0.2.105" 5745 5755 source = "registry+https://github.com/rust-lang/crates.io-index" 5746 - checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 5756 + checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" 5747 5757 dependencies = [ 5758 + "bumpalo", 5748 5759 "proc-macro2", 5749 5760 "quote", 5750 - "syn 2.0.104", 5751 - "wasm-bindgen-backend", 5761 + "syn 2.0.109", 5752 5762 "wasm-bindgen-shared", 5753 5763 ] 5754 5764 5755 5765 [[package]] 5756 5766 name = "wasm-bindgen-shared" 5757 - version = "0.2.100" 5767 + version = "0.2.105" 5758 5768 source = "registry+https://github.com/rust-lang/crates.io-index" 5759 - checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 5769 + checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" 5760 5770 dependencies = [ 5761 5771 "unicode-ident", 5762 5772 ] ··· 5776 5786 5777 5787 [[package]] 5778 5788 name = "web-sys" 5779 - version = "0.3.77" 5789 + version = "0.3.82" 5780 5790 source = "registry+https://github.com/rust-lang/crates.io-index" 5781 - checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 5791 + checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" 5782 5792 dependencies = [ 5783 5793 "js-sys", 5784 5794 "wasm-bindgen", ··· 5840 5850 5841 5851 [[package]] 5842 5852 name = "webpki-roots" 5843 - version = "1.0.2" 5853 + version = "1.0.4" 5844 5854 source = "registry+https://github.com/rust-lang/crates.io-index" 5845 - checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" 5855 + checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" 5846 5856 dependencies = [ 5847 5857 "rustls-pki-types", 5848 5858 ] ··· 5856 5866 "webview2-com-macros", 5857 5867 "webview2-com-sys", 5858 5868 "windows", 5859 - "windows-core", 5869 + "windows-core 0.61.2", 5860 5870 "windows-implement", 5861 5871 "windows-interface", 5862 5872 ] ··· 5869 5879 dependencies = [ 5870 5880 "proc-macro2", 5871 5881 "quote", 5872 - "syn 2.0.104", 5882 + "syn 2.0.109", 5873 5883 ] 5874 5884 5875 5885 [[package]] ··· 5878 5888 source = "registry+https://github.com/rust-lang/crates.io-index" 5879 5889 checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" 5880 5890 dependencies = [ 5881 - "thiserror 2.0.12", 5891 + "thiserror 2.0.17", 5882 5892 "windows", 5883 - "windows-core", 5893 + "windows-core 0.61.2", 5884 5894 ] 5885 5895 5886 5896 [[package]] ··· 5907 5917 5908 5918 [[package]] 5909 5919 name = "winapi-util" 5910 - version = "0.1.9" 5920 + version = "0.1.11" 5911 5921 source = "registry+https://github.com/rust-lang/crates.io-index" 5912 - checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 5922 + checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" 5913 5923 dependencies = [ 5914 - "windows-sys 0.59.0", 5924 + "windows-sys 0.61.2", 5915 5925 ] 5916 5926 5917 5927 [[package]] ··· 5926 5936 source = "registry+https://github.com/rust-lang/crates.io-index" 5927 5937 checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" 5928 5938 dependencies = [ 5929 - "objc2 0.6.1", 5939 + "objc2 0.6.3", 5930 5940 "objc2-app-kit", 5931 5941 "objc2-core-foundation", 5932 - "objc2-foundation 0.3.1", 5942 + "objc2-foundation 0.3.2", 5933 5943 "raw-window-handle", 5934 5944 "windows-sys 0.59.0", 5935 5945 "windows-version", ··· 5942 5952 checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" 5943 5953 dependencies = [ 5944 5954 "windows-collections", 5945 - "windows-core", 5955 + "windows-core 0.61.2", 5946 5956 "windows-future", 5947 - "windows-link", 5957 + "windows-link 0.1.3", 5948 5958 "windows-numerics", 5949 5959 ] 5950 5960 ··· 5954 5964 source = "registry+https://github.com/rust-lang/crates.io-index" 5955 5965 checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" 5956 5966 dependencies = [ 5957 - "windows-core", 5967 + "windows-core 0.61.2", 5958 5968 ] 5959 5969 5960 5970 [[package]] ··· 5965 5975 dependencies = [ 5966 5976 "windows-implement", 5967 5977 "windows-interface", 5968 - "windows-link", 5969 - "windows-result", 5970 - "windows-strings", 5978 + "windows-link 0.1.3", 5979 + "windows-result 0.3.4", 5980 + "windows-strings 0.4.2", 5981 + ] 5982 + 5983 + [[package]] 5984 + name = "windows-core" 5985 + version = "0.62.2" 5986 + source = "registry+https://github.com/rust-lang/crates.io-index" 5987 + checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" 5988 + dependencies = [ 5989 + "windows-implement", 5990 + "windows-interface", 5991 + "windows-link 0.2.1", 5992 + "windows-result 0.4.1", 5993 + "windows-strings 0.5.1", 5971 5994 ] 5972 5995 5973 5996 [[package]] ··· 5976 5999 source = "registry+https://github.com/rust-lang/crates.io-index" 5977 6000 checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" 5978 6001 dependencies = [ 5979 - "windows-core", 5980 - "windows-link", 6002 + "windows-core 0.61.2", 6003 + "windows-link 0.1.3", 5981 6004 "windows-threading", 5982 6005 ] 5983 6006 5984 6007 [[package]] 5985 6008 name = "windows-implement" 5986 - version = "0.60.0" 6009 + version = "0.60.2" 5987 6010 source = "registry+https://github.com/rust-lang/crates.io-index" 5988 - checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" 6011 + checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" 5989 6012 dependencies = [ 5990 6013 "proc-macro2", 5991 6014 "quote", 5992 - "syn 2.0.104", 6015 + "syn 2.0.109", 5993 6016 ] 5994 6017 5995 6018 [[package]] 5996 6019 name = "windows-interface" 5997 - version = "0.59.1" 6020 + version = "0.59.3" 5998 6021 source = "registry+https://github.com/rust-lang/crates.io-index" 5999 - checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" 6022 + checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" 6000 6023 dependencies = [ 6001 6024 "proc-macro2", 6002 6025 "quote", 6003 - "syn 2.0.104", 6026 + "syn 2.0.109", 6004 6027 ] 6005 6028 6006 6029 [[package]] ··· 6010 6033 checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 6011 6034 6012 6035 [[package]] 6036 + name = "windows-link" 6037 + version = "0.2.1" 6038 + source = "registry+https://github.com/rust-lang/crates.io-index" 6039 + checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" 6040 + 6041 + [[package]] 6013 6042 name = "windows-numerics" 6014 6043 version = "0.2.0" 6015 6044 source = "registry+https://github.com/rust-lang/crates.io-index" 6016 6045 checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" 6017 6046 dependencies = [ 6018 - "windows-core", 6019 - "windows-link", 6047 + "windows-core 0.61.2", 6048 + "windows-link 0.1.3", 6020 6049 ] 6021 6050 6022 6051 [[package]] ··· 6025 6054 source = "registry+https://github.com/rust-lang/crates.io-index" 6026 6055 checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" 6027 6056 dependencies = [ 6028 - "windows-link", 6029 - "windows-result", 6030 - "windows-strings", 6057 + "windows-link 0.1.3", 6058 + "windows-result 0.3.4", 6059 + "windows-strings 0.4.2", 6031 6060 ] 6032 6061 6033 6062 [[package]] ··· 6036 6065 source = "registry+https://github.com/rust-lang/crates.io-index" 6037 6066 checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" 6038 6067 dependencies = [ 6039 - "windows-link", 6068 + "windows-link 0.1.3", 6069 + ] 6070 + 6071 + [[package]] 6072 + name = "windows-result" 6073 + version = "0.4.1" 6074 + source = "registry+https://github.com/rust-lang/crates.io-index" 6075 + checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" 6076 + dependencies = [ 6077 + "windows-link 0.2.1", 6040 6078 ] 6041 6079 6042 6080 [[package]] ··· 6045 6083 source = "registry+https://github.com/rust-lang/crates.io-index" 6046 6084 checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" 6047 6085 dependencies = [ 6048 - "windows-link", 6086 + "windows-link 0.1.3", 6049 6087 ] 6050 6088 6051 6089 [[package]] 6052 - name = "windows-sys" 6053 - version = "0.45.0" 6090 + name = "windows-strings" 6091 + version = "0.5.1" 6054 6092 source = "registry+https://github.com/rust-lang/crates.io-index" 6055 - checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 6093 + checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" 6056 6094 dependencies = [ 6057 - "windows-targets 0.42.2", 6095 + "windows-link 0.2.1", 6058 6096 ] 6059 6097 6060 6098 [[package]] 6061 6099 name = "windows-sys" 6062 - version = "0.48.0" 6100 + version = "0.45.0" 6063 6101 source = "registry+https://github.com/rust-lang/crates.io-index" 6064 - checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 6102 + checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 6065 6103 dependencies = [ 6066 - "windows-targets 0.48.5", 6104 + "windows-targets 0.42.2", 6067 6105 ] 6068 6106 6069 6107 [[package]] ··· 6090 6128 source = "registry+https://github.com/rust-lang/crates.io-index" 6091 6129 checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 6092 6130 dependencies = [ 6093 - "windows-targets 0.53.3", 6131 + "windows-targets 0.53.5", 6132 + ] 6133 + 6134 + [[package]] 6135 + name = "windows-sys" 6136 + version = "0.61.2" 6137 + source = "registry+https://github.com/rust-lang/crates.io-index" 6138 + checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" 6139 + dependencies = [ 6140 + "windows-link 0.2.1", 6094 6141 ] 6095 6142 6096 6143 [[package]] ··· 6110 6157 6111 6158 [[package]] 6112 6159 name = "windows-targets" 6113 - version = "0.48.5" 6114 - source = "registry+https://github.com/rust-lang/crates.io-index" 6115 - checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 6116 - dependencies = [ 6117 - "windows_aarch64_gnullvm 0.48.5", 6118 - "windows_aarch64_msvc 0.48.5", 6119 - "windows_i686_gnu 0.48.5", 6120 - "windows_i686_msvc 0.48.5", 6121 - "windows_x86_64_gnu 0.48.5", 6122 - "windows_x86_64_gnullvm 0.48.5", 6123 - "windows_x86_64_msvc 0.48.5", 6124 - ] 6125 - 6126 - [[package]] 6127 - name = "windows-targets" 6128 6160 version = "0.52.6" 6129 6161 source = "registry+https://github.com/rust-lang/crates.io-index" 6130 6162 checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" ··· 6141 6173 6142 6174 [[package]] 6143 6175 name = "windows-targets" 6144 - version = "0.53.3" 6176 + version = "0.53.5" 6145 6177 source = "registry+https://github.com/rust-lang/crates.io-index" 6146 - checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" 6178 + checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" 6147 6179 dependencies = [ 6148 - "windows-link", 6149 - "windows_aarch64_gnullvm 0.53.0", 6150 - "windows_aarch64_msvc 0.53.0", 6151 - "windows_i686_gnu 0.53.0", 6152 - "windows_i686_gnullvm 0.53.0", 6153 - "windows_i686_msvc 0.53.0", 6154 - "windows_x86_64_gnu 0.53.0", 6155 - "windows_x86_64_gnullvm 0.53.0", 6156 - "windows_x86_64_msvc 0.53.0", 6180 + "windows-link 0.2.1", 6181 + "windows_aarch64_gnullvm 0.53.1", 6182 + "windows_aarch64_msvc 0.53.1", 6183 + "windows_i686_gnu 0.53.1", 6184 + "windows_i686_gnullvm 0.53.1", 6185 + "windows_i686_msvc 0.53.1", 6186 + "windows_x86_64_gnu 0.53.1", 6187 + "windows_x86_64_gnullvm 0.53.1", 6188 + "windows_x86_64_msvc 0.53.1", 6157 6189 ] 6158 6190 6159 6191 [[package]] ··· 6162 6194 source = "registry+https://github.com/rust-lang/crates.io-index" 6163 6195 checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" 6164 6196 dependencies = [ 6165 - "windows-link", 6197 + "windows-link 0.1.3", 6166 6198 ] 6167 6199 6168 6200 [[package]] 6169 6201 name = "windows-version" 6170 - version = "0.1.4" 6202 + version = "0.1.7" 6171 6203 source = "registry+https://github.com/rust-lang/crates.io-index" 6172 - checksum = "e04a5c6627e310a23ad2358483286c7df260c964eb2d003d8efd6d0f4e79265c" 6204 + checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" 6173 6205 dependencies = [ 6174 - "windows-link", 6206 + "windows-link 0.2.1", 6175 6207 ] 6176 6208 6177 6209 [[package]] ··· 6182 6214 6183 6215 [[package]] 6184 6216 name = "windows_aarch64_gnullvm" 6185 - version = "0.48.5" 6186 - source = "registry+https://github.com/rust-lang/crates.io-index" 6187 - checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 6188 - 6189 - [[package]] 6190 - name = "windows_aarch64_gnullvm" 6191 6217 version = "0.52.6" 6192 6218 source = "registry+https://github.com/rust-lang/crates.io-index" 6193 6219 checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 6194 6220 6195 6221 [[package]] 6196 6222 name = "windows_aarch64_gnullvm" 6197 - version = "0.53.0" 6223 + version = "0.53.1" 6198 6224 source = "registry+https://github.com/rust-lang/crates.io-index" 6199 - checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 6225 + checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" 6200 6226 6201 6227 [[package]] 6202 6228 name = "windows_aarch64_msvc" ··· 6206 6232 6207 6233 [[package]] 6208 6234 name = "windows_aarch64_msvc" 6209 - version = "0.48.5" 6210 - source = "registry+https://github.com/rust-lang/crates.io-index" 6211 - checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 6212 - 6213 - [[package]] 6214 - name = "windows_aarch64_msvc" 6215 6235 version = "0.52.6" 6216 6236 source = "registry+https://github.com/rust-lang/crates.io-index" 6217 6237 checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 6218 6238 6219 6239 [[package]] 6220 6240 name = "windows_aarch64_msvc" 6221 - version = "0.53.0" 6241 + version = "0.53.1" 6222 6242 source = "registry+https://github.com/rust-lang/crates.io-index" 6223 - checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 6243 + checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" 6224 6244 6225 6245 [[package]] 6226 6246 name = "windows_i686_gnu" ··· 6230 6250 6231 6251 [[package]] 6232 6252 name = "windows_i686_gnu" 6233 - version = "0.48.5" 6234 - source = "registry+https://github.com/rust-lang/crates.io-index" 6235 - checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 6236 - 6237 - [[package]] 6238 - name = "windows_i686_gnu" 6239 6253 version = "0.52.6" 6240 6254 source = "registry+https://github.com/rust-lang/crates.io-index" 6241 6255 checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 6242 6256 6243 6257 [[package]] 6244 6258 name = "windows_i686_gnu" 6245 - version = "0.53.0" 6259 + version = "0.53.1" 6246 6260 source = "registry+https://github.com/rust-lang/crates.io-index" 6247 - checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 6261 + checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" 6248 6262 6249 6263 [[package]] 6250 6264 name = "windows_i686_gnullvm" ··· 6254 6268 6255 6269 [[package]] 6256 6270 name = "windows_i686_gnullvm" 6257 - version = "0.53.0" 6271 + version = "0.53.1" 6258 6272 source = "registry+https://github.com/rust-lang/crates.io-index" 6259 - checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 6273 + checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" 6260 6274 6261 6275 [[package]] 6262 6276 name = "windows_i686_msvc" ··· 6266 6280 6267 6281 [[package]] 6268 6282 name = "windows_i686_msvc" 6269 - version = "0.48.5" 6270 - source = "registry+https://github.com/rust-lang/crates.io-index" 6271 - checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 6272 - 6273 - [[package]] 6274 - name = "windows_i686_msvc" 6275 6283 version = "0.52.6" 6276 6284 source = "registry+https://github.com/rust-lang/crates.io-index" 6277 6285 checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 6278 6286 6279 6287 [[package]] 6280 6288 name = "windows_i686_msvc" 6281 - version = "0.53.0" 6289 + version = "0.53.1" 6282 6290 source = "registry+https://github.com/rust-lang/crates.io-index" 6283 - checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 6291 + checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" 6284 6292 6285 6293 [[package]] 6286 6294 name = "windows_x86_64_gnu" ··· 6290 6298 6291 6299 [[package]] 6292 6300 name = "windows_x86_64_gnu" 6293 - version = "0.48.5" 6294 - source = "registry+https://github.com/rust-lang/crates.io-index" 6295 - checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 6296 - 6297 - [[package]] 6298 - name = "windows_x86_64_gnu" 6299 6301 version = "0.52.6" 6300 6302 source = "registry+https://github.com/rust-lang/crates.io-index" 6301 6303 checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 6302 6304 6303 6305 [[package]] 6304 6306 name = "windows_x86_64_gnu" 6305 - version = "0.53.0" 6307 + version = "0.53.1" 6306 6308 source = "registry+https://github.com/rust-lang/crates.io-index" 6307 - checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 6309 + checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" 6308 6310 6309 6311 [[package]] 6310 6312 name = "windows_x86_64_gnullvm" ··· 6314 6316 6315 6317 [[package]] 6316 6318 name = "windows_x86_64_gnullvm" 6317 - version = "0.48.5" 6318 - source = "registry+https://github.com/rust-lang/crates.io-index" 6319 - checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 6320 - 6321 - [[package]] 6322 - name = "windows_x86_64_gnullvm" 6323 6319 version = "0.52.6" 6324 6320 source = "registry+https://github.com/rust-lang/crates.io-index" 6325 6321 checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 6326 6322 6327 6323 [[package]] 6328 6324 name = "windows_x86_64_gnullvm" 6329 - version = "0.53.0" 6325 + version = "0.53.1" 6330 6326 source = "registry+https://github.com/rust-lang/crates.io-index" 6331 - checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 6327 + checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" 6332 6328 6333 6329 [[package]] 6334 6330 name = "windows_x86_64_msvc" ··· 6338 6334 6339 6335 [[package]] 6340 6336 name = "windows_x86_64_msvc" 6341 - version = "0.48.5" 6342 - source = "registry+https://github.com/rust-lang/crates.io-index" 6343 - checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 6344 - 6345 - [[package]] 6346 - name = "windows_x86_64_msvc" 6347 6337 version = "0.52.6" 6348 6338 source = "registry+https://github.com/rust-lang/crates.io-index" 6349 6339 checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 6350 6340 6351 6341 [[package]] 6352 6342 name = "windows_x86_64_msvc" 6353 - version = "0.53.0" 6343 + version = "0.53.1" 6354 6344 source = "registry+https://github.com/rust-lang/crates.io-index" 6355 - checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 6345 + checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" 6356 6346 6357 6347 [[package]] 6358 6348 name = "winnow" ··· 6365 6355 6366 6356 [[package]] 6367 6357 name = "winnow" 6368 - version = "0.7.12" 6358 + version = "0.7.13" 6369 6359 source = "registry+https://github.com/rust-lang/crates.io-index" 6370 - checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" 6360 + checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" 6361 + dependencies = [ 6362 + "memchr", 6363 + ] 6371 6364 6372 6365 [[package]] 6373 6366 name = "winreg" ··· 6380 6373 ] 6381 6374 6382 6375 [[package]] 6383 - name = "wit-bindgen-rt" 6384 - version = "0.39.0" 6376 + name = "wit-bindgen" 6377 + version = "0.46.0" 6385 6378 source = "registry+https://github.com/rust-lang/crates.io-index" 6386 - checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 6387 - dependencies = [ 6388 - "bitflags 2.9.1", 6389 - ] 6379 + checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" 6390 6380 6391 6381 [[package]] 6392 6382 name = "writeable" 6393 - version = "0.6.1" 6383 + version = "0.6.2" 6394 6384 source = "registry+https://github.com/rust-lang/crates.io-index" 6395 - checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 6385 + checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" 6396 6386 6397 6387 [[package]] 6398 6388 name = "wry" 6399 - version = "0.52.1" 6389 + version = "0.53.5" 6400 6390 source = "registry+https://github.com/rust-lang/crates.io-index" 6401 - checksum = "12a714d9ba7075aae04a6e50229d6109e3d584774b99a6a8c60de1698ca111b9" 6391 + checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2" 6402 6392 dependencies = [ 6403 6393 "base64 0.22.1", 6404 - "block2 0.6.1", 6394 + "block2 0.6.2", 6405 6395 "cookie", 6406 6396 "crossbeam-channel", 6397 + "dirs", 6407 6398 "dpi", 6408 6399 "dunce", 6409 6400 "gdkx11", ··· 6415 6406 "kuchikiki", 6416 6407 "libc", 6417 6408 "ndk", 6418 - "objc2 0.6.1", 6409 + "objc2 0.6.3", 6419 6410 "objc2-app-kit", 6420 6411 "objc2-core-foundation", 6421 - "objc2-foundation 0.3.1", 6412 + "objc2-foundation 0.3.2", 6422 6413 "objc2-ui-kit", 6423 6414 "objc2-web-kit", 6424 6415 "once_cell", ··· 6427 6418 "sha2", 6428 6419 "soup3", 6429 6420 "tao-macros", 6430 - "thiserror 2.0.12", 6421 + "thiserror 2.0.17", 6431 6422 "url", 6432 6423 "webkit2gtk", 6433 6424 "webkit2gtk-sys", 6434 6425 "webview2-com", 6435 6426 "windows", 6436 - "windows-core", 6427 + "windows-core 0.61.2", 6437 6428 "windows-version", 6438 6429 "x11-dl", 6439 6430 ] ··· 6460 6451 ] 6461 6452 6462 6453 [[package]] 6463 - name = "xdg-home" 6464 - version = "1.3.0" 6454 + name = "x11rb" 6455 + version = "0.13.2" 6465 6456 source = "registry+https://github.com/rust-lang/crates.io-index" 6466 - checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" 6457 + checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" 6467 6458 dependencies = [ 6468 - "libc", 6469 - "windows-sys 0.59.0", 6459 + "gethostname", 6460 + "rustix", 6461 + "x11rb-protocol", 6470 6462 ] 6471 6463 6472 6464 [[package]] 6465 + name = "x11rb-protocol" 6466 + version = "0.13.2" 6467 + source = "registry+https://github.com/rust-lang/crates.io-index" 6468 + checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" 6469 + 6470 + [[package]] 6473 6471 name = "yoke" 6474 - version = "0.8.0" 6472 + version = "0.8.1" 6475 6473 source = "registry+https://github.com/rust-lang/crates.io-index" 6476 - checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 6474 + checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" 6477 6475 dependencies = [ 6478 - "serde", 6479 6476 "stable_deref_trait", 6480 6477 "yoke-derive", 6481 6478 "zerofrom", ··· 6483 6480 6484 6481 [[package]] 6485 6482 name = "yoke-derive" 6486 - version = "0.8.0" 6483 + version = "0.8.1" 6487 6484 source = "registry+https://github.com/rust-lang/crates.io-index" 6488 - checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 6485 + checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" 6489 6486 dependencies = [ 6490 6487 "proc-macro2", 6491 6488 "quote", 6492 - "syn 2.0.104", 6489 + "syn 2.0.109", 6493 6490 "synstructure", 6494 6491 ] 6495 6492 6496 6493 [[package]] 6497 6494 name = "zbus" 6498 - version = "4.0.1" 6495 + version = "5.12.0" 6499 6496 source = "registry+https://github.com/rust-lang/crates.io-index" 6500 - checksum = "7b8e3d6ae3342792a6cc2340e4394334c7402f3d793b390d2c5494a4032b3030" 6497 + checksum = "b622b18155f7a93d1cd2dc8c01d2d6a44e08fb9ebb7b3f9e6ed101488bad6c91" 6501 6498 dependencies = [ 6502 6499 "async-broadcast", 6503 6500 "async-executor", 6504 - "async-fs", 6505 6501 "async-io", 6506 6502 "async-lock", 6507 6503 "async-process", ··· 6509 6505 "async-task", 6510 6506 "async-trait", 6511 6507 "blocking", 6512 - "derivative", 6513 6508 "enumflags2", 6514 6509 "event-listener", 6515 6510 "futures-core", 6516 - "futures-sink", 6517 - "futures-util", 6511 + "futures-lite", 6518 6512 "hex", 6519 6513 "nix", 6520 6514 "ordered-stream", 6521 - "rand 0.8.5", 6522 6515 "serde", 6523 6516 "serde_repr", 6524 - "sha1", 6525 - "static_assertions", 6526 6517 "tracing", 6527 6518 "uds_windows", 6528 - "windows-sys 0.52.0", 6529 - "xdg-home", 6519 + "uuid", 6520 + "windows-sys 0.61.2", 6521 + "winnow 0.7.13", 6530 6522 "zbus_macros", 6531 6523 "zbus_names", 6532 6524 "zvariant", ··· 6534 6526 6535 6527 [[package]] 6536 6528 name = "zbus_macros" 6537 - version = "4.0.1" 6529 + version = "5.12.0" 6538 6530 source = "registry+https://github.com/rust-lang/crates.io-index" 6539 - checksum = "b7a3e850ff1e7217a3b7a07eba90d37fe9bb9e89a310f718afcde5885ca9b6d7" 6531 + checksum = "1cdb94821ca8a87ca9c298b5d1cbd80e2a8b67115d99f6e4551ac49e42b6a314" 6540 6532 dependencies = [ 6541 - "proc-macro-crate 1.3.1", 6533 + "proc-macro-crate 3.4.0", 6542 6534 "proc-macro2", 6543 6535 "quote", 6544 - "regex", 6545 - "syn 1.0.109", 6536 + "syn 2.0.109", 6537 + "zbus_names", 6538 + "zvariant", 6546 6539 "zvariant_utils", 6547 6540 ] 6548 6541 6549 6542 [[package]] 6550 6543 name = "zbus_names" 6551 - version = "3.0.0" 6544 + version = "4.2.0" 6552 6545 source = "registry+https://github.com/rust-lang/crates.io-index" 6553 - checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" 6546 + checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" 6554 6547 dependencies = [ 6555 6548 "serde", 6556 6549 "static_assertions", 6550 + "winnow 0.7.13", 6557 6551 "zvariant", 6558 6552 ] 6559 6553 6560 6554 [[package]] 6561 6555 name = "zerocopy" 6562 - version = "0.8.26" 6556 + version = "0.8.27" 6563 6557 source = "registry+https://github.com/rust-lang/crates.io-index" 6564 - checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" 6558 + checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" 6565 6559 dependencies = [ 6566 6560 "zerocopy-derive", 6567 6561 ] 6568 6562 6569 6563 [[package]] 6570 6564 name = "zerocopy-derive" 6571 - version = "0.8.26" 6565 + version = "0.8.27" 6572 6566 source = "registry+https://github.com/rust-lang/crates.io-index" 6573 - checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" 6567 + checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" 6574 6568 dependencies = [ 6575 6569 "proc-macro2", 6576 6570 "quote", 6577 - "syn 2.0.104", 6571 + "syn 2.0.109", 6578 6572 ] 6579 6573 6580 6574 [[package]] ··· 6594 6588 dependencies = [ 6595 6589 "proc-macro2", 6596 6590 "quote", 6597 - "syn 2.0.104", 6591 + "syn 2.0.109", 6598 6592 "synstructure", 6599 6593 ] 6600 6594 6601 6595 [[package]] 6602 6596 name = "zeroize" 6603 - version = "1.8.1" 6597 + version = "1.8.2" 6604 6598 source = "registry+https://github.com/rust-lang/crates.io-index" 6605 - checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 6599 + checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" 6606 6600 6607 6601 [[package]] 6608 6602 name = "zerotrie" 6609 - version = "0.2.2" 6603 + version = "0.2.3" 6610 6604 source = "registry+https://github.com/rust-lang/crates.io-index" 6611 - checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 6605 + checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" 6612 6606 dependencies = [ 6613 6607 "displaydoc", 6614 6608 "yoke", ··· 6617 6611 6618 6612 [[package]] 6619 6613 name = "zerovec" 6620 - version = "0.11.2" 6614 + version = "0.11.5" 6621 6615 source = "registry+https://github.com/rust-lang/crates.io-index" 6622 - checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" 6616 + checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" 6623 6617 dependencies = [ 6624 6618 "yoke", 6625 6619 "zerofrom", ··· 6628 6622 6629 6623 [[package]] 6630 6624 name = "zerovec-derive" 6631 - version = "0.11.1" 6625 + version = "0.11.2" 6632 6626 source = "registry+https://github.com/rust-lang/crates.io-index" 6633 - checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 6627 + checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" 6634 6628 dependencies = [ 6635 6629 "proc-macro2", 6636 6630 "quote", 6637 - "syn 2.0.104", 6631 + "syn 2.0.109", 6638 6632 ] 6639 6633 6640 6634 [[package]] ··· 6654 6648 6655 6649 [[package]] 6656 6650 name = "zune-jpeg" 6657 - version = "0.4.20" 6651 + version = "0.4.21" 6658 6652 source = "registry+https://github.com/rust-lang/crates.io-index" 6659 - checksum = "fc1f7e205ce79eb2da3cd71c5f55f3589785cb7c79f6a03d1c8d1491bda5d089" 6653 + checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" 6660 6654 dependencies = [ 6661 6655 "zune-core", 6662 6656 ] 6663 6657 6664 6658 [[package]] 6665 6659 name = "zvariant" 6666 - version = "4.0.0" 6660 + version = "5.8.0" 6667 6661 source = "registry+https://github.com/rust-lang/crates.io-index" 6668 - checksum = "4e09e8be97d44eeab994d752f341e67b3b0d80512a8b315a0671d47232ef1b65" 6662 + checksum = "2be61892e4f2b1772727be11630a62664a1826b62efa43a6fe7449521cb8744c" 6669 6663 dependencies = [ 6670 6664 "endi", 6671 6665 "enumflags2", 6672 6666 "serde", 6673 - "static_assertions", 6667 + "winnow 0.7.13", 6674 6668 "zvariant_derive", 6669 + "zvariant_utils", 6675 6670 ] 6676 6671 6677 6672 [[package]] 6678 6673 name = "zvariant_derive" 6679 - version = "4.0.0" 6674 + version = "5.8.0" 6680 6675 source = "registry+https://github.com/rust-lang/crates.io-index" 6681 - checksum = "72a5857e2856435331636a9fbb415b09243df4521a267c5bedcd5289b4d5799e" 6676 + checksum = "da58575a1b2b20766513b1ec59d8e2e68db2745379f961f86650655e862d2006" 6682 6677 dependencies = [ 6683 - "proc-macro-crate 1.3.1", 6678 + "proc-macro-crate 3.4.0", 6684 6679 "proc-macro2", 6685 6680 "quote", 6686 - "syn 1.0.109", 6681 + "syn 2.0.109", 6687 6682 "zvariant_utils", 6688 6683 ] 6689 6684 6690 6685 [[package]] 6691 6686 name = "zvariant_utils" 6692 - version = "1.1.0" 6687 + version = "3.2.1" 6693 6688 source = "registry+https://github.com/rust-lang/crates.io-index" 6694 - checksum = "00bedb16a193cc12451873fee2a1bc6550225acece0e36f333e68326c73c8172" 6689 + checksum = "c6949d142f89f6916deca2232cf26a8afacf2b9fdc35ce766105e104478be599" 6695 6690 dependencies = [ 6696 6691 "proc-macro2", 6697 6692 "quote", 6698 - "syn 1.0.109", 6693 + "serde", 6694 + "syn 2.0.109", 6695 + "winnow 0.7.13", 6699 6696 ]
+15 -16
src-tauri/Cargo.toml
··· 1 1 [package] 2 - name = "vrcpm-rs" 3 - version = "0.2.4" 2 + name = "VRChatPhotoManager" 3 + version = "0.2.7-hot1" 4 4 description = "VRChat Photo Manager" 5 5 authors = ["_phaz"] 6 6 edition = "2021" ··· 11 11 tauri-build = { version = "2.0.0-rc", features = [] } 12 12 13 13 [dependencies] 14 - tauri = { version = "2.0.0-rc", features = ["tray-icon", "image-png", "devtools"] } 14 + tauri = { version = "2.9", features = [ "tray-icon", "image-png", "devtools" ] } 15 15 serde = { version = "1.0", features = ["derive"] } 16 16 serde_json = "1.0" 17 - open = "5.1.2" 18 - tauri-plugin-deep-link = "2.0.1" 19 - dirs = "5.0.1" 20 - notify = "6.1.1" 21 - regex = "1.10.4" 17 + open = "5.3" 18 + dirs = "6.0" 19 + notify = "8.2" 20 + regex = "1.12" 22 21 reqwest = { version = "0.12", features = ["blocking"] } 23 - tauri-plugin-single-instance = { version = "2.0.0", features = ["deep-link"] } 24 - tauri-plugin-shell = "2.0.0-rc.2" 25 - tauri-plugin-http = "2.0.0-rc.0" 26 - tauri-plugin-process = "2.0.0-rc.0" 27 - image = "0.25.2" 28 - fast_image_resize = { version = "4.2.1", features = [ "image" ] } 29 - 22 + image = "0.25" 23 + fast_image_resize = { version = "5.3", features = [ "image" ] } 24 + arboard = "3.6" 25 + tauri-plugin-single-instance = { version = "2.3", features = ["deep-link"] } 26 + tauri-plugin-shell = "2.3" 27 + tauri-plugin-http = "2.5" 28 + tauri-plugin-process = "2.3" 30 29 [target.'cfg(windows)'.dependencies] 31 - mslnk = { version = "0.1.8" } 30 + mslnk = { version = "0.1" } 32 31 33 32 [features] 34 33 # this feature is used for production builds or when `devPath` points to the filesystem
+1 -1
src-tauri/gen/schemas/acl-manifests.json
··· 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"]},"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-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-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-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-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-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-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-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-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},"deep-link":{"default_permission":{"identifier":"default","description":"Allows reading the opened deep link via the get_current command","permissions":["allow-get-current"]},"permissions":{"allow-get-current":{"identifier":"allow-get-current","description":"Enables the get_current command without any pre-configured scope.","commands":{"allow":["get_current"],"deny":[]}},"allow-is-registered":{"identifier":"allow-is-registered","description":"Enables the is_registered command without any pre-configured scope.","commands":{"allow":["is_registered"],"deny":[]}},"allow-register":{"identifier":"allow-register","description":"Enables the register command without any pre-configured scope.","commands":{"allow":["register"],"deny":[]}},"allow-unregister":{"identifier":"allow-unregister","description":"Enables the unregister command without any pre-configured scope.","commands":{"allow":["unregister"],"deny":[]}},"deny-get-current":{"identifier":"deny-get-current","description":"Denies the get_current command without any pre-configured scope.","commands":{"allow":[],"deny":["get_current"]}},"deny-is-registered":{"identifier":"deny-is-registered","description":"Denies the is_registered command without any pre-configured scope.","commands":{"allow":[],"deny":["is_registered"]}},"deny-register":{"identifier":"deny-register","description":"Denies the register command without any pre-configured scope.","commands":{"allow":[],"deny":["register"]}},"deny-unregister":{"identifier":"deny-unregister","description":"Denies the unregister command without any pre-configured scope.","commands":{"allow":[],"deny":["unregister"]}}},"permission_sets":{},"global_scope_schema":null},"http":{"default_permission":{"identifier":"default","description":"This permission set configures what kind of\nfetch operations are available from the http plugin.\n\nThis enables all fetch operations but does not\nallow explicitly any origins to be fetched. This needs to\nbe manually configured before usage.\n\n#### Granted Permissions\n\nAll fetch operations are enabled.\n\n","permissions":["allow-fetch","allow-fetch-cancel","allow-fetch-read-body","allow-fetch-send"]},"permissions":{"allow-fetch":{"identifier":"allow-fetch","description":"Enables the fetch command without any pre-configured scope.","commands":{"allow":["fetch"],"deny":[]}},"allow-fetch-cancel":{"identifier":"allow-fetch-cancel","description":"Enables the fetch_cancel command without any pre-configured scope.","commands":{"allow":["fetch_cancel"],"deny":[]}},"allow-fetch-read-body":{"identifier":"allow-fetch-read-body","description":"Enables the fetch_read_body command without any pre-configured scope.","commands":{"allow":["fetch_read_body"],"deny":[]}},"allow-fetch-send":{"identifier":"allow-fetch-send","description":"Enables the fetch_send command without any pre-configured scope.","commands":{"allow":["fetch_send"],"deny":[]}},"deny-fetch":{"identifier":"deny-fetch","description":"Denies the fetch command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch"]}},"deny-fetch-cancel":{"identifier":"deny-fetch-cancel","description":"Denies the fetch_cancel command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_cancel"]}},"deny-fetch-read-body":{"identifier":"deny-fetch-read-body","description":"Denies the fetch_read_body command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_read_body"]}},"deny-fetch-send":{"identifier":"deny-fetch-send","description":"Denies the fetch_send command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_send"]}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"description":"A URL that can be accessed by the webview when using the HTTP APIs. Wildcards can be used following the URL pattern standard.\n\nSee [the URL Pattern spec](https://urlpattern.spec.whatwg.org/) for more information.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin on port 443\n\n- \"https://*:*\" : allows all HTTPS origin on any port\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"},{"properties":{"url":{"description":"A URL that can be accessed by the webview when using the HTTP APIs. Wildcards can be used following the URL pattern standard.\n\nSee [the URL Pattern spec](https://urlpattern.spec.whatwg.org/) for more information.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin on port 443\n\n- \"https://*:*\" : allows all HTTPS origin on any port\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"}],"description":"HTTP scope entry.","title":"HttpScopeEntry"}},"process":{"default_permission":{"identifier":"default","description":"This permission set configures which\nprocess features are by default exposed.\n\n#### Granted Permissions\n\nThis enables to quit via `allow-exit` and restart via `allow-restart`\nthe application.\n","permissions":["allow-exit","allow-restart"]},"permissions":{"allow-exit":{"identifier":"allow-exit","description":"Enables the exit command without any pre-configured scope.","commands":{"allow":["exit"],"deny":[]}},"allow-restart":{"identifier":"allow-restart","description":"Enables the restart command without any pre-configured scope.","commands":{"allow":["restart"],"deny":[]}},"deny-exit":{"identifier":"deny-exit","description":"Denies the exit command without any pre-configured scope.","commands":{"allow":[],"deny":["exit"]}},"deny-restart":{"identifier":"deny-restart","description":"Denies the restart command without any pre-configured scope.","commands":{"allow":[],"deny":["restart"]}}},"permission_sets":{},"global_scope_schema":null},"shell":{"default_permission":{"identifier":"default","description":"This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n","permissions":["allow-open"]},"permissions":{"allow-execute":{"identifier":"allow-execute","description":"Enables the execute command without any pre-configured scope.","commands":{"allow":["execute"],"deny":[]}},"allow-kill":{"identifier":"allow-kill","description":"Enables the kill command without any pre-configured scope.","commands":{"allow":["kill"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-spawn":{"identifier":"allow-spawn","description":"Enables the spawn command without any pre-configured scope.","commands":{"allow":["spawn"],"deny":[]}},"allow-stdin-write":{"identifier":"allow-stdin-write","description":"Enables the stdin_write command without any pre-configured scope.","commands":{"allow":["stdin_write"],"deny":[]}},"deny-execute":{"identifier":"deny-execute","description":"Denies the execute command without any pre-configured scope.","commands":{"allow":[],"deny":["execute"]}},"deny-kill":{"identifier":"deny-kill","description":"Denies the kill command without any pre-configured scope.","commands":{"allow":[],"deny":["kill"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-spawn":{"identifier":"deny-spawn","description":"Denies the spawn command without any pre-configured scope.","commands":{"allow":[],"deny":["spawn"]}},"deny-stdin-write":{"identifier":"deny-stdin-write","description":"Denies the stdin_write command without any pre-configured scope.","commands":{"allow":[],"deny":["stdin_write"]}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"additionalProperties":false,"properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}],"description":"The allowed arguments for the command execution."},"cmd":{"description":"The command name. It 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`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"}},"required":["cmd","name"],"type":"object"},{"additionalProperties":false,"properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}],"description":"The allowed arguments for the command execution."},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"},"sidecar":{"description":"If this command is a sidecar command.","type":"boolean"}},"required":["name","sidecar"],"type":"object"}],"definitions":{"ShellScopeEntryAllowedArg":{"anyOf":[{"description":"A non-configurable argument that is passed to the command in the order it was specified.","type":"string"},{"additionalProperties":false,"description":"A variable that is set while calling the command from the webview API.","properties":{"raw":{"default":false,"description":"Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.","type":"boolean"},"validator":{"description":"[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: <https://docs.rs/regex/latest/regex/#syntax>","type":"string"}},"required":["validator"],"type":"object"}],"description":"A command argument allowed to be executed by the webview API."},"ShellScopeEntryAllowedArgs":{"anyOf":[{"description":"Use a simple boolean to allow all or disable all arguments to this command configuration.","type":"boolean"},{"description":"A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.","items":{"$ref":"#/definitions/ShellScopeEntryAllowedArg"},"type":"array"}],"description":"A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration."}},"description":"Shell scope entry.","title":"ShellScopeEntry"}}} 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},"http":{"default_permission":{"identifier":"default","description":"This permission set configures what kind of\nfetch operations are available from the http plugin.\n\nThis enables all fetch operations but does not\nallow explicitly any origins to be fetched. This needs to\nbe manually configured before usage.\n\n#### Granted Permissions\n\nAll fetch operations are enabled.\n\n","permissions":["allow-fetch","allow-fetch-cancel","allow-fetch-read-body","allow-fetch-send"]},"permissions":{"allow-fetch":{"identifier":"allow-fetch","description":"Enables the fetch command without any pre-configured scope.","commands":{"allow":["fetch"],"deny":[]}},"allow-fetch-cancel":{"identifier":"allow-fetch-cancel","description":"Enables the fetch_cancel command without any pre-configured scope.","commands":{"allow":["fetch_cancel"],"deny":[]}},"allow-fetch-read-body":{"identifier":"allow-fetch-read-body","description":"Enables the fetch_read_body command without any pre-configured scope.","commands":{"allow":["fetch_read_body"],"deny":[]}},"allow-fetch-send":{"identifier":"allow-fetch-send","description":"Enables the fetch_send command without any pre-configured scope.","commands":{"allow":["fetch_send"],"deny":[]}},"deny-fetch":{"identifier":"deny-fetch","description":"Denies the fetch command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch"]}},"deny-fetch-cancel":{"identifier":"deny-fetch-cancel","description":"Denies the fetch_cancel command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_cancel"]}},"deny-fetch-read-body":{"identifier":"deny-fetch-read-body","description":"Denies the fetch_read_body command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_read_body"]}},"deny-fetch-send":{"identifier":"deny-fetch-send","description":"Denies the fetch_send command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_send"]}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"description":"A URL that can be accessed by the webview when using the HTTP APIs. Wildcards can be used following the URL pattern standard.\n\nSee [the URL Pattern spec](https://urlpattern.spec.whatwg.org/) for more information.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin on port 443\n\n- \"https://*:*\" : allows all HTTPS origin on any port\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"},{"properties":{"url":{"description":"A URL that can be accessed by the webview when using the HTTP APIs. Wildcards can be used following the URL pattern standard.\n\nSee [the URL Pattern spec](https://urlpattern.spec.whatwg.org/) for more information.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin on port 443\n\n- \"https://*:*\" : allows all HTTPS origin on any port\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"}],"description":"HTTP scope entry.","title":"HttpScopeEntry"}},"process":{"default_permission":{"identifier":"default","description":"This permission set configures which\nprocess features are by default exposed.\n\n#### Granted Permissions\n\nThis enables to quit via `allow-exit` and restart via `allow-restart`\nthe application.\n","permissions":["allow-exit","allow-restart"]},"permissions":{"allow-exit":{"identifier":"allow-exit","description":"Enables the exit command without any pre-configured scope.","commands":{"allow":["exit"],"deny":[]}},"allow-restart":{"identifier":"allow-restart","description":"Enables the restart command without any pre-configured scope.","commands":{"allow":["restart"],"deny":[]}},"deny-exit":{"identifier":"deny-exit","description":"Denies the exit command without any pre-configured scope.","commands":{"allow":[],"deny":["exit"]}},"deny-restart":{"identifier":"deny-restart","description":"Denies the restart command without any pre-configured scope.","commands":{"allow":[],"deny":["restart"]}}},"permission_sets":{},"global_scope_schema":null},"shell":{"default_permission":{"identifier":"default","description":"This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n","permissions":["allow-open"]},"permissions":{"allow-execute":{"identifier":"allow-execute","description":"Enables the execute command without any pre-configured scope.","commands":{"allow":["execute"],"deny":[]}},"allow-kill":{"identifier":"allow-kill","description":"Enables the kill command without any pre-configured scope.","commands":{"allow":["kill"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-spawn":{"identifier":"allow-spawn","description":"Enables the spawn command without any pre-configured scope.","commands":{"allow":["spawn"],"deny":[]}},"allow-stdin-write":{"identifier":"allow-stdin-write","description":"Enables the stdin_write command without any pre-configured scope.","commands":{"allow":["stdin_write"],"deny":[]}},"deny-execute":{"identifier":"deny-execute","description":"Denies the execute command without any pre-configured scope.","commands":{"allow":[],"deny":["execute"]}},"deny-kill":{"identifier":"deny-kill","description":"Denies the kill command without any pre-configured scope.","commands":{"allow":[],"deny":["kill"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-spawn":{"identifier":"deny-spawn","description":"Denies the spawn command without any pre-configured scope.","commands":{"allow":[],"deny":["spawn"]}},"deny-stdin-write":{"identifier":"deny-stdin-write","description":"Denies the stdin_write command without any pre-configured scope.","commands":{"allow":[],"deny":["stdin_write"]}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"additionalProperties":false,"properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}],"description":"The allowed arguments for the command execution."},"cmd":{"description":"The command name. It 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`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"}},"required":["cmd","name"],"type":"object"},{"additionalProperties":false,"properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}],"description":"The allowed arguments for the command execution."},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"},"sidecar":{"description":"If this command is a sidecar command.","type":"boolean"}},"required":["name","sidecar"],"type":"object"}],"definitions":{"ShellScopeEntryAllowedArg":{"anyOf":[{"description":"A non-configurable argument that is passed to the command in the order it was specified.","type":"string"},{"additionalProperties":false,"description":"A variable that is set while calling the command from the webview API.","properties":{"raw":{"default":false,"description":"Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.","type":"boolean"},"validator":{"description":"[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: <https://docs.rs/regex/latest/regex/#syntax>","type":"string"}},"required":["validator"],"type":"object"}],"description":"A command argument allowed to be executed by the webview API."},"ShellScopeEntryAllowedArgs":{"anyOf":[{"description":"Use a simple boolean to allow all or disable all arguments to this command configuration.","type":"boolean"},{"description":"A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.","items":{"$ref":"#/definitions/ShellScopeEntryAllowedArg"},"type":"array"}],"description":"A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration."}},"description":"Shell scope entry.","title":"ShellScopeEntry"}}}
+50 -56
src-tauri/gen/schemas/desktop-schema.json
··· 519 519 "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`" 520 520 }, 521 521 { 522 - "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`", 522 + "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`", 523 523 "type": "string", 524 524 "const": "core:app:default", 525 - "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`" 525 + "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`" 526 526 }, 527 527 { 528 528 "description": "Enables the app_hide command without any pre-configured scope.", ··· 567 567 "markdownDescription": "Enables the name command without any pre-configured scope." 568 568 }, 569 569 { 570 + "description": "Enables the register_listener command without any pre-configured scope.", 571 + "type": "string", 572 + "const": "core:app:allow-register-listener", 573 + "markdownDescription": "Enables the register_listener command without any pre-configured scope." 574 + }, 575 + { 570 576 "description": "Enables the remove_data_store command without any pre-configured scope.", 571 577 "type": "string", 572 578 "const": "core:app:allow-remove-data-store", 573 579 "markdownDescription": "Enables the remove_data_store command without any pre-configured scope." 574 580 }, 575 581 { 582 + "description": "Enables the remove_listener command without any pre-configured scope.", 583 + "type": "string", 584 + "const": "core:app:allow-remove-listener", 585 + "markdownDescription": "Enables the remove_listener command without any pre-configured scope." 586 + }, 587 + { 576 588 "description": "Enables the set_app_theme command without any pre-configured scope.", 577 589 "type": "string", 578 590 "const": "core:app:allow-set-app-theme", ··· 639 651 "markdownDescription": "Denies the name command without any pre-configured scope." 640 652 }, 641 653 { 654 + "description": "Denies the register_listener command without any pre-configured scope.", 655 + "type": "string", 656 + "const": "core:app:deny-register-listener", 657 + "markdownDescription": "Denies the register_listener command without any pre-configured scope." 658 + }, 659 + { 642 660 "description": "Denies the remove_data_store command without any pre-configured scope.", 643 661 "type": "string", 644 662 "const": "core:app:deny-remove-data-store", 645 663 "markdownDescription": "Denies the remove_data_store command without any pre-configured scope." 664 + }, 665 + { 666 + "description": "Denies the remove_listener command without any pre-configured scope.", 667 + "type": "string", 668 + "const": "core:app:deny-remove-listener", 669 + "markdownDescription": "Denies the remove_listener command without any pre-configured scope." 646 670 }, 647 671 { 648 672 "description": "Denies the set_app_theme command without any pre-configured scope.", ··· 1827 1851 "markdownDescription": "Enables the set_focus command without any pre-configured scope." 1828 1852 }, 1829 1853 { 1854 + "description": "Enables the set_focusable command without any pre-configured scope.", 1855 + "type": "string", 1856 + "const": "core:window:allow-set-focusable", 1857 + "markdownDescription": "Enables the set_focusable command without any pre-configured scope." 1858 + }, 1859 + { 1830 1860 "description": "Enables the set_fullscreen command without any pre-configured scope.", 1831 1861 "type": "string", 1832 1862 "const": "core:window:allow-set-fullscreen", ··· 1897 1927 "type": "string", 1898 1928 "const": "core:window:allow-set-shadow", 1899 1929 "markdownDescription": "Enables the set_shadow command without any pre-configured scope." 1930 + }, 1931 + { 1932 + "description": "Enables the set_simple_fullscreen command without any pre-configured scope.", 1933 + "type": "string", 1934 + "const": "core:window:allow-set-simple-fullscreen", 1935 + "markdownDescription": "Enables the set_simple_fullscreen command without any pre-configured scope." 1900 1936 }, 1901 1937 { 1902 1938 "description": "Enables the set_size command without any pre-configured scope.", ··· 2271 2307 "markdownDescription": "Denies the set_focus command without any pre-configured scope." 2272 2308 }, 2273 2309 { 2310 + "description": "Denies the set_focusable command without any pre-configured scope.", 2311 + "type": "string", 2312 + "const": "core:window:deny-set-focusable", 2313 + "markdownDescription": "Denies the set_focusable command without any pre-configured scope." 2314 + }, 2315 + { 2274 2316 "description": "Denies the set_fullscreen command without any pre-configured scope.", 2275 2317 "type": "string", 2276 2318 "const": "core:window:deny-set-fullscreen", ··· 2341 2383 "type": "string", 2342 2384 "const": "core:window:deny-set-shadow", 2343 2385 "markdownDescription": "Denies the set_shadow command without any pre-configured scope." 2386 + }, 2387 + { 2388 + "description": "Denies the set_simple_fullscreen command without any pre-configured scope.", 2389 + "type": "string", 2390 + "const": "core:window:deny-set-simple-fullscreen", 2391 + "markdownDescription": "Denies the set_simple_fullscreen command without any pre-configured scope." 2344 2392 }, 2345 2393 { 2346 2394 "description": "Denies the set_size command without any pre-configured scope.", ··· 2431 2479 "type": "string", 2432 2480 "const": "core:window:deny-unminimize", 2433 2481 "markdownDescription": "Denies the unminimize command without any pre-configured scope." 2434 - }, 2435 - { 2436 - "description": "Allows reading the opened deep link via the get_current command\n#### This default permission set includes:\n\n- `allow-get-current`", 2437 - "type": "string", 2438 - "const": "deep-link:default", 2439 - "markdownDescription": "Allows reading the opened deep link via the get_current command\n#### This default permission set includes:\n\n- `allow-get-current`" 2440 - }, 2441 - { 2442 - "description": "Enables the get_current command without any pre-configured scope.", 2443 - "type": "string", 2444 - "const": "deep-link:allow-get-current", 2445 - "markdownDescription": "Enables the get_current command without any pre-configured scope." 2446 - }, 2447 - { 2448 - "description": "Enables the is_registered command without any pre-configured scope.", 2449 - "type": "string", 2450 - "const": "deep-link:allow-is-registered", 2451 - "markdownDescription": "Enables the is_registered command without any pre-configured scope." 2452 - }, 2453 - { 2454 - "description": "Enables the register command without any pre-configured scope.", 2455 - "type": "string", 2456 - "const": "deep-link:allow-register", 2457 - "markdownDescription": "Enables the register command without any pre-configured scope." 2458 - }, 2459 - { 2460 - "description": "Enables the unregister command without any pre-configured scope.", 2461 - "type": "string", 2462 - "const": "deep-link:allow-unregister", 2463 - "markdownDescription": "Enables the unregister command without any pre-configured scope." 2464 - }, 2465 - { 2466 - "description": "Denies the get_current command without any pre-configured scope.", 2467 - "type": "string", 2468 - "const": "deep-link:deny-get-current", 2469 - "markdownDescription": "Denies the get_current command without any pre-configured scope." 2470 - }, 2471 - { 2472 - "description": "Denies the is_registered command without any pre-configured scope.", 2473 - "type": "string", 2474 - "const": "deep-link:deny-is-registered", 2475 - "markdownDescription": "Denies the is_registered command without any pre-configured scope." 2476 - }, 2477 - { 2478 - "description": "Denies the register command without any pre-configured scope.", 2479 - "type": "string", 2480 - "const": "deep-link:deny-register", 2481 - "markdownDescription": "Denies the register command without any pre-configured scope." 2482 - }, 2483 - { 2484 - "description": "Denies the unregister command without any pre-configured scope.", 2485 - "type": "string", 2486 - "const": "deep-link:deny-unregister", 2487 - "markdownDescription": "Denies the unregister command without any pre-configured scope." 2488 2482 }, 2489 2483 { 2490 2484 "description": "This permission set configures what kind of\nfetch operations are available from the http plugin.\n\nThis enables all fetch operations but does not\nallow explicitly any origins to be fetched. This needs to\nbe manually configured before usage.\n\n#### Granted Permissions\n\nAll fetch operations are enabled.\n\n\n#### This default permission set includes:\n\n- `allow-fetch`\n- `allow-fetch-cancel`\n- `allow-fetch-read-body`\n- `allow-fetch-send`",
+50 -56
src-tauri/gen/schemas/linux-schema.json
··· 519 519 "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`" 520 520 }, 521 521 { 522 - "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`", 522 + "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`", 523 523 "type": "string", 524 524 "const": "core:app:default", 525 - "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`" 525 + "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`" 526 526 }, 527 527 { 528 528 "description": "Enables the app_hide command without any pre-configured scope.", ··· 567 567 "markdownDescription": "Enables the name command without any pre-configured scope." 568 568 }, 569 569 { 570 + "description": "Enables the register_listener command without any pre-configured scope.", 571 + "type": "string", 572 + "const": "core:app:allow-register-listener", 573 + "markdownDescription": "Enables the register_listener command without any pre-configured scope." 574 + }, 575 + { 570 576 "description": "Enables the remove_data_store command without any pre-configured scope.", 571 577 "type": "string", 572 578 "const": "core:app:allow-remove-data-store", 573 579 "markdownDescription": "Enables the remove_data_store command without any pre-configured scope." 574 580 }, 575 581 { 582 + "description": "Enables the remove_listener command without any pre-configured scope.", 583 + "type": "string", 584 + "const": "core:app:allow-remove-listener", 585 + "markdownDescription": "Enables the remove_listener command without any pre-configured scope." 586 + }, 587 + { 576 588 "description": "Enables the set_app_theme command without any pre-configured scope.", 577 589 "type": "string", 578 590 "const": "core:app:allow-set-app-theme", ··· 639 651 "markdownDescription": "Denies the name command without any pre-configured scope." 640 652 }, 641 653 { 654 + "description": "Denies the register_listener command without any pre-configured scope.", 655 + "type": "string", 656 + "const": "core:app:deny-register-listener", 657 + "markdownDescription": "Denies the register_listener command without any pre-configured scope." 658 + }, 659 + { 642 660 "description": "Denies the remove_data_store command without any pre-configured scope.", 643 661 "type": "string", 644 662 "const": "core:app:deny-remove-data-store", 645 663 "markdownDescription": "Denies the remove_data_store command without any pre-configured scope." 664 + }, 665 + { 666 + "description": "Denies the remove_listener command without any pre-configured scope.", 667 + "type": "string", 668 + "const": "core:app:deny-remove-listener", 669 + "markdownDescription": "Denies the remove_listener command without any pre-configured scope." 646 670 }, 647 671 { 648 672 "description": "Denies the set_app_theme command without any pre-configured scope.", ··· 1827 1851 "markdownDescription": "Enables the set_focus command without any pre-configured scope." 1828 1852 }, 1829 1853 { 1854 + "description": "Enables the set_focusable command without any pre-configured scope.", 1855 + "type": "string", 1856 + "const": "core:window:allow-set-focusable", 1857 + "markdownDescription": "Enables the set_focusable command without any pre-configured scope." 1858 + }, 1859 + { 1830 1860 "description": "Enables the set_fullscreen command without any pre-configured scope.", 1831 1861 "type": "string", 1832 1862 "const": "core:window:allow-set-fullscreen", ··· 1897 1927 "type": "string", 1898 1928 "const": "core:window:allow-set-shadow", 1899 1929 "markdownDescription": "Enables the set_shadow command without any pre-configured scope." 1930 + }, 1931 + { 1932 + "description": "Enables the set_simple_fullscreen command without any pre-configured scope.", 1933 + "type": "string", 1934 + "const": "core:window:allow-set-simple-fullscreen", 1935 + "markdownDescription": "Enables the set_simple_fullscreen command without any pre-configured scope." 1900 1936 }, 1901 1937 { 1902 1938 "description": "Enables the set_size command without any pre-configured scope.", ··· 2271 2307 "markdownDescription": "Denies the set_focus command without any pre-configured scope." 2272 2308 }, 2273 2309 { 2310 + "description": "Denies the set_focusable command without any pre-configured scope.", 2311 + "type": "string", 2312 + "const": "core:window:deny-set-focusable", 2313 + "markdownDescription": "Denies the set_focusable command without any pre-configured scope." 2314 + }, 2315 + { 2274 2316 "description": "Denies the set_fullscreen command without any pre-configured scope.", 2275 2317 "type": "string", 2276 2318 "const": "core:window:deny-set-fullscreen", ··· 2341 2383 "type": "string", 2342 2384 "const": "core:window:deny-set-shadow", 2343 2385 "markdownDescription": "Denies the set_shadow command without any pre-configured scope." 2386 + }, 2387 + { 2388 + "description": "Denies the set_simple_fullscreen command without any pre-configured scope.", 2389 + "type": "string", 2390 + "const": "core:window:deny-set-simple-fullscreen", 2391 + "markdownDescription": "Denies the set_simple_fullscreen command without any pre-configured scope." 2344 2392 }, 2345 2393 { 2346 2394 "description": "Denies the set_size command without any pre-configured scope.", ··· 2431 2479 "type": "string", 2432 2480 "const": "core:window:deny-unminimize", 2433 2481 "markdownDescription": "Denies the unminimize command without any pre-configured scope." 2434 - }, 2435 - { 2436 - "description": "Allows reading the opened deep link via the get_current command\n#### This default permission set includes:\n\n- `allow-get-current`", 2437 - "type": "string", 2438 - "const": "deep-link:default", 2439 - "markdownDescription": "Allows reading the opened deep link via the get_current command\n#### This default permission set includes:\n\n- `allow-get-current`" 2440 - }, 2441 - { 2442 - "description": "Enables the get_current command without any pre-configured scope.", 2443 - "type": "string", 2444 - "const": "deep-link:allow-get-current", 2445 - "markdownDescription": "Enables the get_current command without any pre-configured scope." 2446 - }, 2447 - { 2448 - "description": "Enables the is_registered command without any pre-configured scope.", 2449 - "type": "string", 2450 - "const": "deep-link:allow-is-registered", 2451 - "markdownDescription": "Enables the is_registered command without any pre-configured scope." 2452 - }, 2453 - { 2454 - "description": "Enables the register command without any pre-configured scope.", 2455 - "type": "string", 2456 - "const": "deep-link:allow-register", 2457 - "markdownDescription": "Enables the register command without any pre-configured scope." 2458 - }, 2459 - { 2460 - "description": "Enables the unregister command without any pre-configured scope.", 2461 - "type": "string", 2462 - "const": "deep-link:allow-unregister", 2463 - "markdownDescription": "Enables the unregister command without any pre-configured scope." 2464 - }, 2465 - { 2466 - "description": "Denies the get_current command without any pre-configured scope.", 2467 - "type": "string", 2468 - "const": "deep-link:deny-get-current", 2469 - "markdownDescription": "Denies the get_current command without any pre-configured scope." 2470 - }, 2471 - { 2472 - "description": "Denies the is_registered command without any pre-configured scope.", 2473 - "type": "string", 2474 - "const": "deep-link:deny-is-registered", 2475 - "markdownDescription": "Denies the is_registered command without any pre-configured scope." 2476 - }, 2477 - { 2478 - "description": "Denies the register command without any pre-configured scope.", 2479 - "type": "string", 2480 - "const": "deep-link:deny-register", 2481 - "markdownDescription": "Denies the register command without any pre-configured scope." 2482 - }, 2483 - { 2484 - "description": "Denies the unregister command without any pre-configured scope.", 2485 - "type": "string", 2486 - "const": "deep-link:deny-unregister", 2487 - "markdownDescription": "Denies the unregister command without any pre-configured scope." 2488 2482 }, 2489 2483 { 2490 2484 "description": "This permission set configures what kind of\nfetch operations are available from the http plugin.\n\nThis enables all fetch operations but does not\nallow explicitly any origins to be fetched. This needs to\nbe manually configured before usage.\n\n#### Granted Permissions\n\nAll fetch operations are enabled.\n\n\n#### This default permission set includes:\n\n- `allow-fetch`\n- `allow-fetch-cancel`\n- `allow-fetch-read-body`\n- `allow-fetch-send`",
+50 -56
src-tauri/gen/schemas/windows-schema.json
··· 519 519 "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`" 520 520 }, 521 521 { 522 - "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`", 522 + "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`", 523 523 "type": "string", 524 524 "const": "core:app:default", 525 - "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`" 525 + "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`" 526 526 }, 527 527 { 528 528 "description": "Enables the app_hide command without any pre-configured scope.", ··· 567 567 "markdownDescription": "Enables the name command without any pre-configured scope." 568 568 }, 569 569 { 570 + "description": "Enables the register_listener command without any pre-configured scope.", 571 + "type": "string", 572 + "const": "core:app:allow-register-listener", 573 + "markdownDescription": "Enables the register_listener command without any pre-configured scope." 574 + }, 575 + { 570 576 "description": "Enables the remove_data_store command without any pre-configured scope.", 571 577 "type": "string", 572 578 "const": "core:app:allow-remove-data-store", 573 579 "markdownDescription": "Enables the remove_data_store command without any pre-configured scope." 574 580 }, 575 581 { 582 + "description": "Enables the remove_listener command without any pre-configured scope.", 583 + "type": "string", 584 + "const": "core:app:allow-remove-listener", 585 + "markdownDescription": "Enables the remove_listener command without any pre-configured scope." 586 + }, 587 + { 576 588 "description": "Enables the set_app_theme command without any pre-configured scope.", 577 589 "type": "string", 578 590 "const": "core:app:allow-set-app-theme", ··· 639 651 "markdownDescription": "Denies the name command without any pre-configured scope." 640 652 }, 641 653 { 654 + "description": "Denies the register_listener command without any pre-configured scope.", 655 + "type": "string", 656 + "const": "core:app:deny-register-listener", 657 + "markdownDescription": "Denies the register_listener command without any pre-configured scope." 658 + }, 659 + { 642 660 "description": "Denies the remove_data_store command without any pre-configured scope.", 643 661 "type": "string", 644 662 "const": "core:app:deny-remove-data-store", 645 663 "markdownDescription": "Denies the remove_data_store command without any pre-configured scope." 664 + }, 665 + { 666 + "description": "Denies the remove_listener command without any pre-configured scope.", 667 + "type": "string", 668 + "const": "core:app:deny-remove-listener", 669 + "markdownDescription": "Denies the remove_listener command without any pre-configured scope." 646 670 }, 647 671 { 648 672 "description": "Denies the set_app_theme command without any pre-configured scope.", ··· 1827 1851 "markdownDescription": "Enables the set_focus command without any pre-configured scope." 1828 1852 }, 1829 1853 { 1854 + "description": "Enables the set_focusable command without any pre-configured scope.", 1855 + "type": "string", 1856 + "const": "core:window:allow-set-focusable", 1857 + "markdownDescription": "Enables the set_focusable command without any pre-configured scope." 1858 + }, 1859 + { 1830 1860 "description": "Enables the set_fullscreen command without any pre-configured scope.", 1831 1861 "type": "string", 1832 1862 "const": "core:window:allow-set-fullscreen", ··· 1897 1927 "type": "string", 1898 1928 "const": "core:window:allow-set-shadow", 1899 1929 "markdownDescription": "Enables the set_shadow command without any pre-configured scope." 1930 + }, 1931 + { 1932 + "description": "Enables the set_simple_fullscreen command without any pre-configured scope.", 1933 + "type": "string", 1934 + "const": "core:window:allow-set-simple-fullscreen", 1935 + "markdownDescription": "Enables the set_simple_fullscreen command without any pre-configured scope." 1900 1936 }, 1901 1937 { 1902 1938 "description": "Enables the set_size command without any pre-configured scope.", ··· 2271 2307 "markdownDescription": "Denies the set_focus command without any pre-configured scope." 2272 2308 }, 2273 2309 { 2310 + "description": "Denies the set_focusable command without any pre-configured scope.", 2311 + "type": "string", 2312 + "const": "core:window:deny-set-focusable", 2313 + "markdownDescription": "Denies the set_focusable command without any pre-configured scope." 2314 + }, 2315 + { 2274 2316 "description": "Denies the set_fullscreen command without any pre-configured scope.", 2275 2317 "type": "string", 2276 2318 "const": "core:window:deny-set-fullscreen", ··· 2341 2383 "type": "string", 2342 2384 "const": "core:window:deny-set-shadow", 2343 2385 "markdownDescription": "Denies the set_shadow command without any pre-configured scope." 2386 + }, 2387 + { 2388 + "description": "Denies the set_simple_fullscreen command without any pre-configured scope.", 2389 + "type": "string", 2390 + "const": "core:window:deny-set-simple-fullscreen", 2391 + "markdownDescription": "Denies the set_simple_fullscreen command without any pre-configured scope." 2344 2392 }, 2345 2393 { 2346 2394 "description": "Denies the set_size command without any pre-configured scope.", ··· 2431 2479 "type": "string", 2432 2480 "const": "core:window:deny-unminimize", 2433 2481 "markdownDescription": "Denies the unminimize command without any pre-configured scope." 2434 - }, 2435 - { 2436 - "description": "Allows reading the opened deep link via the get_current command\n#### This default permission set includes:\n\n- `allow-get-current`", 2437 - "type": "string", 2438 - "const": "deep-link:default", 2439 - "markdownDescription": "Allows reading the opened deep link via the get_current command\n#### This default permission set includes:\n\n- `allow-get-current`" 2440 - }, 2441 - { 2442 - "description": "Enables the get_current command without any pre-configured scope.", 2443 - "type": "string", 2444 - "const": "deep-link:allow-get-current", 2445 - "markdownDescription": "Enables the get_current command without any pre-configured scope." 2446 - }, 2447 - { 2448 - "description": "Enables the is_registered command without any pre-configured scope.", 2449 - "type": "string", 2450 - "const": "deep-link:allow-is-registered", 2451 - "markdownDescription": "Enables the is_registered command without any pre-configured scope." 2452 - }, 2453 - { 2454 - "description": "Enables the register command without any pre-configured scope.", 2455 - "type": "string", 2456 - "const": "deep-link:allow-register", 2457 - "markdownDescription": "Enables the register command without any pre-configured scope." 2458 - }, 2459 - { 2460 - "description": "Enables the unregister command without any pre-configured scope.", 2461 - "type": "string", 2462 - "const": "deep-link:allow-unregister", 2463 - "markdownDescription": "Enables the unregister command without any pre-configured scope." 2464 - }, 2465 - { 2466 - "description": "Denies the get_current command without any pre-configured scope.", 2467 - "type": "string", 2468 - "const": "deep-link:deny-get-current", 2469 - "markdownDescription": "Denies the get_current command without any pre-configured scope." 2470 - }, 2471 - { 2472 - "description": "Denies the is_registered command without any pre-configured scope.", 2473 - "type": "string", 2474 - "const": "deep-link:deny-is-registered", 2475 - "markdownDescription": "Denies the is_registered command without any pre-configured scope." 2476 - }, 2477 - { 2478 - "description": "Denies the register command without any pre-configured scope.", 2479 - "type": "string", 2480 - "const": "deep-link:deny-register", 2481 - "markdownDescription": "Denies the register command without any pre-configured scope." 2482 - }, 2483 - { 2484 - "description": "Denies the unregister command without any pre-configured scope.", 2485 - "type": "string", 2486 - "const": "deep-link:deny-unregister", 2487 - "markdownDescription": "Denies the unregister command without any pre-configured scope." 2488 2482 }, 2489 2483 { 2490 2484 "description": "This permission set configures what kind of\nfetch operations are available from the http plugin.\n\nThis enables all fetch operations but does not\nallow explicitly any origins to be fetched. This needs to\nbe manually configured before usage.\n\n#### Granted Permissions\n\nAll fetch operations are enabled.\n\n\n#### This default permission set includes:\n\n- `allow-fetch`\n- `allow-fetch-cancel`\n- `allow-fetch-read-body`\n- `allow-fetch-send`",
+17 -9
src-tauri/src/frontend_calls/change_final_path.rs
··· 1 1 use std::fs; 2 2 3 - #[tauri::command] 4 - pub fn change_final_path(new_path: &str) { 5 - let config_path = dirs::config_dir() 6 - .unwrap() 7 - .join("PhazeDev/VRChatPhotoManager/.photos_path"); 3 + use tauri::{Emitter, State, Window}; 8 4 9 - fs::write(&config_path, new_path.as_bytes()).unwrap(); 5 + use crate::util::cache::Cache; 10 6 7 + #[tauri::command] 8 + pub fn change_final_path(new_path: &str, window: Window, cache: State<Cache>) -> bool { 11 9 match fs::metadata(&new_path) { 12 - Ok(_) => {} 10 + Ok(_) => { 11 + let config_path = dirs::config_dir() 12 + .unwrap() 13 + .join("PhazeDev/VRChatPhotoManager/.photos_path"); 14 + 15 + fs::write(&config_path, new_path.as_bytes()).unwrap(); 16 + cache.insert("photo-path".into(), new_path.to_owned()); 17 + 18 + true 19 + } 13 20 Err(_) => { 14 - fs::create_dir(&new_path).unwrap(); 21 + window.emit("vrcpm-error", "Error Changing Path: Path does not exist.").unwrap(); 22 + false 15 23 } 16 - }; 24 + } 17 25 }
+5 -3
src-tauri/src/frontend_calls/close_splashscreen.rs
··· 1 1 use std::env; 2 - use tauri::{ Emitter, Manager }; 2 + use tauri::{ Emitter, Manager, State }; 3 + 4 + use crate::frontend_calls::config::Config; 3 5 4 6 use super::config::get_config_value_string; 5 7 6 8 #[tauri::command] 7 - pub fn close_splashscreen( window: tauri::Window ) { 9 + pub fn close_splashscreen( window: tauri::Window, config: State<Config> ) { 8 10 let args: Vec<String> = env::args().collect(); 9 11 10 12 let mut show = true; ··· 14 16 } 15 17 } 16 18 17 - let value: String = match get_config_value_string("start-in-bg".to_owned()) { Some(val) => val, None => "false".to_owned() }; 19 + let value: String = match get_config_value_string("start-in-bg".to_owned(), config) { Some(val) => val, None => "false".to_owned() }; 18 20 if value == "true"{ 19 21 show = false; 20 22 }
+43 -22
src-tauri/src/frontend_calls/config.rs
··· 1 - use std::{fs, path::PathBuf}; 1 + use std::{fs, path::PathBuf, sync::Mutex}; 2 2 3 3 use serde_json::Value; 4 + use tauri::State; 4 5 5 6 pub fn get_config_path() -> PathBuf { 6 7 let path = dirs::config_dir() ··· 17 18 path 18 19 } 19 20 20 - #[tauri::command] 21 - pub fn set_config_value_string(key: String, value: String) { 22 - let path = get_config_path(); 21 + pub struct Config{ 22 + config: Mutex<Value> 23 + } 24 + 25 + impl Config{ 26 + pub fn new() -> Config{ 27 + let path = get_config_path(); 28 + let config: Value = serde_json::from_str(&fs::read_to_string(&path).unwrap()).unwrap(); 29 + 30 + Config { 31 + config: Mutex::new(config) 32 + } 33 + } 34 + 35 + pub fn set( &self, key: String, value: Value ){ 36 + let mut lock = self.config.lock().unwrap(); 37 + lock[key] = value; 38 + } 39 + 40 + pub fn get( &self, key: String ) -> Value{ 41 + let lock = self.config.lock().unwrap(); 42 + lock[key].clone() 43 + } 44 + 45 + pub fn save( &self ){ 46 + let path = get_config_path(); 47 + let string = serde_json::to_string(&self.config).unwrap(); 23 48 24 - let mut config: Value = serde_json::from_str(&fs::read_to_string(&path).unwrap()).unwrap(); 25 - config[key] = Value::from(value); 49 + fs::write(path, string).unwrap(); 50 + } 51 + } 26 52 27 - fs::write(path, config.to_string()).unwrap(); 53 + #[tauri::command] 54 + pub fn set_config_value_string( key: String, value: String, config: State<Config> ) { 55 + config.set(key, Value::from(value)); 28 56 } 29 57 30 58 #[tauri::command] 31 - pub fn get_config_value_string(key: String) -> Option<String> { 32 - let config: Value = 33 - serde_json::from_str(&fs::read_to_string(get_config_path()).unwrap()).unwrap(); 34 - let string = config[key].as_str(); 59 + pub fn get_config_value_string( key: String, config: State<Config> ) -> Option<String> { 60 + let string = config.get(key); 61 + let string = string.as_str(); 35 62 36 63 if string.is_some() { 37 64 Some(string.unwrap().to_owned()) ··· 41 68 } 42 69 43 70 #[tauri::command] 44 - pub fn set_config_value_int(key: String, value: i64) { 45 - let path = get_config_path(); 46 - 47 - let mut config: Value = serde_json::from_str(&fs::read_to_string(&path).unwrap()).unwrap(); 48 - config[key] = Value::from(value); 49 - 50 - fs::write(path, config.to_string()).unwrap(); 71 + pub fn set_config_value_int( key: String, value: i64, config: State<Config> ) { 72 + config.set(key, Value::from(value)); 51 73 } 52 74 53 75 #[tauri::command] 54 - pub fn get_config_value_int(key: String) -> Option<i64> { 55 - let config: Value = 56 - serde_json::from_str(&fs::read_to_string(get_config_path()).unwrap()).unwrap(); 57 - config[key].as_i64() 76 + pub fn get_config_value_int( key: String, config: State<Config> ) -> Option<i64> { 77 + let string = config.get(key); 78 + string.as_i64() 58 79 }
+25
src-tauri/src/frontend_calls/copy_image.rs
··· 1 + use std::{ borrow::Cow, sync::Mutex }; 2 + 3 + use arboard::{ Clipboard, ImageData }; 4 + use image::GenericImageView; 5 + use tauri::State; 6 + 7 + use crate::{ frontend_calls::get_user_photos_path::get_user_photos_path, util::cache::Cache }; 8 + 9 + #[tauri::command] 10 + pub fn copy_image( path: String, clipboard: State<Mutex<Clipboard>>, cache: State<Cache> ) { 11 + let path = format!("{}/{}", get_user_photos_path(cache), path); 12 + println!("Copying Image: {}", &path); 13 + 14 + let img = image::open(path).unwrap(); 15 + let size = img.dimensions(); 16 + 17 + let img_data = ImageData { 18 + width: size.0 as usize, 19 + height: size.1 as usize, 20 + bytes: Cow::from(img.into_rgba8().to_vec()) 21 + }; 22 + 23 + let mut lock = clipboard.lock().unwrap(); 24 + lock.set_image(img_data).unwrap(); 25 + }
+2 -16
src-tauri/src/frontend_calls/delete_photo.rs
··· 1 1 use tauri::State; 2 2 3 3 use crate::util::cache::Cache; 4 - use std::{ fs, thread, time::Duration }; 4 + use std::{ fs, thread }; 5 5 6 6 // Delete a photo when the users confirms the prompt in the ui 7 7 #[tauri::command] 8 - pub fn delete_photo(path: String, token: String, is_syncing: bool, cache: State<Cache>) { 8 + pub fn delete_photo(path: String, cache: State<Cache>) { 9 9 let photo_path = cache.get("photo-path".into()); 10 10 11 11 thread::spawn(move || { 12 12 let p = photo_path.unwrap() + "/" + &path; 13 13 fs::remove_file(p).unwrap(); 14 - 15 - let photo = path.split("/").last().unwrap(); 16 - 17 - if is_syncing { 18 - let client = reqwest::blocking::Client::new(); 19 - client 20 - .delete(format!( 21 - "https://photos-cdn.phazed.xyz/api/v1/photos?token={}&photo={}", 22 - token, photo 23 - )) 24 - .timeout(Duration::from_secs(120)) 25 - .send() 26 - .unwrap(); 27 - } 28 14 }); 29 15 }
+21 -3
src-tauri/src/frontend_calls/load_photo_meta.rs
··· 20 20 let mut buffer = Vec::new(); 21 21 22 22 let _out = file.read_to_end(&mut buffer); 23 - window 24 - .emit("photo_meta_loaded", PNGImage::new(buffer, photo)) 25 - .unwrap(); 23 + let png = PNGImage::new(buffer, photo.clone()); 24 + 25 + if png.is_err(){ 26 + println!("Failed to load: {} => {}", base_dir, png.unwrap_err()); 27 + 28 + window.emit("photo_meta_loaded", PNGImage { 29 + width: 1920, 30 + height: 1080, 31 + bit_depth: 0, 32 + colour_type: 0, 33 + compression_method: 0, 34 + filter_method: 0, 35 + interlace_method: 0, 36 + metadata: "".into(), 37 + error: true, 38 + path: photo 39 + }).unwrap(); 40 + } else{ 41 + println!("Loaded: {}", base_dir); 42 + window.emit("photo_meta_loaded", png.unwrap()).unwrap(); 43 + } 26 44 } 27 45 Err(_) => { 28 46 println!("Cannot read image file: {:?}", base_dir);
+14 -8
src-tauri/src/frontend_calls/load_photos.rs
··· 16 16 let base_dir = cache.get("photo-path".into()).unwrap(); 17 17 18 18 thread::spawn(move || { 19 - 20 19 let mut photos: Vec<path::PathBuf> = Vec::new(); 21 20 let mut size: usize = 0; 22 21 22 + let re = Regex::new(r"^[0-9]{4}-[0-9]{2}$").unwrap(); 23 + 23 24 for folder in fs::read_dir(&base_dir).unwrap() { 24 25 let f = folder.unwrap(); 26 + if !re.is_match(f.file_name().to_str().unwrap()){ continue; } 25 27 26 28 if f.metadata().unwrap().is_dir() { 27 29 for photo in fs::read_dir(f.path()).unwrap() { ··· 30 32 if p.metadata().unwrap().is_file() { 31 33 let fname = p.path(); 32 34 33 - let re1 = Regex::new(r"(?m)VRChat_[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2}.[0-9]{3}_[0-9]{4}x[0-9]{4}.png").unwrap(); 34 - let re2 = Regex::new( 35 - r"(?m)VRChat_[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2}.[0-9]{3}_[0-9]{4}x[0-9]{4}_wrld_[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}.png").unwrap(); 36 - let re3 = Regex::new("VRChat_[0-9]{4}x[0-9]{4}_[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2}.[0-9]{3}.png").unwrap(); 37 - 38 35 let name = p.file_name(); 39 36 let name = name.to_str().unwrap(); 40 37 41 - let re3_match = re3.is_match(name); 38 + let re1_match = // This is the current format used by VRChat 39 + Regex::new(r"(?m)VRChat_[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2}.[0-9]{3}_[0-9]{3,4}x[0-9]{3,4}.png").unwrap().is_match(name) || 40 + Regex::new(r"(?m)VRChat_[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2}.[0-9]{3}_[0-9]{3,4}x[0-9]{3,4}_Player.png").unwrap().is_match(name) || 41 + Regex::new(r"(?m)VRChat_[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2}.[0-9]{3}_[0-9]{3,4}x[0-9]{3,4}_Environment.png").unwrap().is_match(name); 42 + 43 + let re2_match = // This is the format VRCX uses if you enable renaming photos 44 + Regex::new(r"(?m)VRChat_[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2}.[0-9]{3}_[0-9]{3,4}x[0-9]{3,4}_wrld_[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}.png").unwrap().is_match(name); 42 45 43 - if re1.is_match(name) || re2.is_match(name) || re3_match { 46 + let re3_match = // This is an old format VRChat used for naming photos 47 + Regex::new(r"(?m)VRChat_[0-9]{3,4}x[0-9]{3,4}_[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2}.[0-9]{3}.png").unwrap().is_match(name); 48 + 49 + if re1_match || re2_match || re3_match { 44 50 let path = fname.to_path_buf().clone(); 45 51 let metadata = fs::metadata(&path).unwrap(); 46 52
+1 -3
src-tauri/src/frontend_calls/mod.rs
··· 9 9 pub mod load_photos; 10 10 pub mod open_folder; 11 11 pub mod open_url; 12 - pub mod relaunch; 13 - pub mod start_user_auth; 14 12 pub mod start_with_win; 15 - pub mod sync_photos; 13 + pub mod copy_image;
+19 -4
src-tauri/src/frontend_calls/open_folder.rs
··· 7 7 8 8 #[cfg(target_os = "linux")] 9 9 { 10 - let url = url.replace("\\", "/"); 11 - let mut path: Vec<&str> = url.split("/").collect(); 10 + let path = url.replace("\\", "/"); 11 + 12 + let mut dir_path: Vec<_> = path.split("/").collect(); 13 + dir_path.pop(); 14 + let dir_path = dir_path.join("/"); 15 + 16 + let commands = vec![ 17 + ( "nautilus", vec![ path.clone() ] ), 18 + ( "nemo", vec![ path.clone() ] ), 19 + ( "thunar", vec![ path.clone() ] ), 20 + ( "caja", vec![ "--select".into(), path.clone() ] ), 21 + ( "pcmanfm-qt", vec![ dir_path.clone() ] ), 22 + ( "pcmanfm", vec![ dir_path.clone() ] ), 23 + ( "dolphin", vec![ "--select".into(), path.clone() ] ), 24 + ( "konqueror", vec![ "--select".into(), path.clone() ] ), 25 + ( "xdg-open", vec![ dir_path.clone() ] ) 26 + ]; 12 27 13 - path.pop(); 14 - Command::new("xdg-open").arg(path.join("/")).spawn().unwrap(); 28 + for command in commands{ 29 + if Command::new(command.0).args(command.1).spawn().is_ok() { break; } } 15 30 } 16 31 }
-17
src-tauri/src/frontend_calls/relaunch.rs
··· 1 - use std::process::{ self, Command }; 2 - 3 - #[tauri::command] 4 - pub fn relaunch() { 5 - #[cfg(windows)] 6 - { 7 - let container_folder = dirs::config_dir() 8 - .unwrap() 9 - .join("PhazeDev/VRChatPhotoManager"); 10 - 11 - let mut cmd = Command::new(&container_folder.join("./vrchat-photo-manager.exe")); 12 - cmd.current_dir(container_folder); 13 - cmd.spawn().expect("Cannot run updater"); 14 - 15 - process::exit(0); 16 - } 17 - }
-4
src-tauri/src/frontend_calls/start_user_auth.rs
··· 1 - #[tauri::command] 2 - pub fn start_user_auth() { 3 - open::that("https://photos.phazed.xyz/api/v1/auth").unwrap(); 4 - }
-11
src-tauri/src/frontend_calls/sync_photos.rs
··· 1 - use crate::photosync; 2 - use crate::util::get_photo_path::get_photo_path; 3 - use std::thread; 4 - 5 - // On requested sync the photos to the cloud 6 - #[tauri::command] 7 - pub fn sync_photos(token: String, window: tauri::Window) { 8 - thread::spawn(move || { 9 - photosync::sync_photos(token, get_photo_path(), window); 10 - }); 11 - }
+37 -31
src-tauri/src/main.rs
··· 1 1 #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] 2 2 3 3 mod frontend_calls; 4 - mod photosync; 5 4 mod pngmeta; 6 5 mod util; 7 6 mod worldscraper; 8 7 9 8 use core::time; 9 + use arboard::Clipboard; 10 10 use frontend_calls::*; 11 11 12 12 use notify::{ EventKind, RecursiveMode, Watcher }; 13 13 use pngmeta::PNGImage; 14 14 use regex::Regex; 15 15 use util::{ cache::Cache, get_photo_path::get_photo_path }; 16 - use std::{ env, fs, thread }; 16 + use std::{ env, fs, sync::Mutex, thread }; 17 17 use tauri::{ Emitter, Manager, State, WindowEvent }; 18 - use tauri_plugin_deep_link::DeepLinkExt; 19 18 20 - // TODO: Linux support 19 + use crate::frontend_calls::config::{get_config_value_string, Config}; 21 20 22 21 fn main() { 23 22 #[cfg(target_os = "linux")] 24 - std::env::set_var("WEBKIT_DISABLE_DMABUF_RENDERER", "1"); // Fix webkit being shit 23 + std::env::set_var("WEBKIT_DISABLE_DMABUF_RENDERER", "1"); // Fix webkitgtk being shit 25 24 26 25 let cache = Cache::new(); 27 26 ··· 78 77 79 78 println!("Loading App..."); 80 79 let photos_path = util::get_photo_path::get_photo_path(); 80 + println!("Loading photos from: {:#?}", &photos_path); 81 81 82 82 cache.insert("photo-path".into(), photos_path.to_str().unwrap().to_owned()); 83 83 ··· 88 88 } 89 89 }; 90 90 91 - // Updater only supports windows, so don't update if on linux 92 - #[cfg(windows)] 93 - util::check_updates::check_updates(container_folder); 94 - 95 91 // Listen for file updates, store each update in an mpsc channel and send to the frontend 96 92 let (sender, receiver) = std::sync::mpsc::channel(); 97 93 let mut watcher = notify::recommended_watcher(move | res: Result<notify::Event, notify::Error> | { ··· 102 98 let path = event.paths.first().unwrap(); 103 99 let name = path.file_name().unwrap().to_str().unwrap().to_owned(); 104 100 105 - let re1 = Regex::new(r"(?m)VRChat_[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2}.[0-9]{3}_[0-9]{4}x[0-9]{4}.png").unwrap(); 106 - let re2 = Regex::new(r"(?m)/VRChat_[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2}.[0-9]{3}_[0-9]{4}x[0-9]{4}_wrld_[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}.png/gm").unwrap(); 101 + let re1_match = // This is the current format used by VRChat 102 + Regex::new(r"(?m)VRChat_[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2}.[0-9]{3}_[0-9]{3,4}x[0-9]{3,4}.png").unwrap().is_match(&name) || 103 + Regex::new(r"(?m)VRChat_[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2}.[0-9]{3}_[0-9]{3,4}x[0-9]{3,4}_Player.png").unwrap().is_match(&name) || 104 + Regex::new(r"(?m)VRChat_[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2}.[0-9]{3}_[0-9]{3,4}x[0-9]{3,4}_Environment.png").unwrap().is_match(&name); 107 105 108 - if 109 - re1.is_match(&name) || 110 - re2.is_match(&name) 111 - { 106 + let re2_match = // This is the format VRCX uses if you enable renaming photos 107 + Regex::new(r"(?m)VRChat_[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2}.[0-9]{3}_[0-9]{3,4}x[0-9]{3,4}_wrld_[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}.png").unwrap().is_match(&name); 108 + 109 + if re1_match || re2_match{ 112 110 sender.send((2, path.strip_prefix(get_photo_path()).unwrap().to_str().unwrap().to_owned())).unwrap(); 113 111 } 114 112 }, ··· 116 114 let path = event.paths.first().unwrap(); 117 115 let name = path.file_name().unwrap().to_str().unwrap().to_owned(); 118 116 119 - let re1 = Regex::new(r"(?m)VRChat_[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2}.[0-9]{3}_[0-9]{4}x[0-9]{4}.png").unwrap(); 120 - let re2 = Regex::new(r"(?m)/VRChat_[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2}.[0-9]{3}_[0-9]{4}x[0-9]{4}_wrld_[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}.png/gm").unwrap(); 117 + let re1_match = // This is the current format used by VRChat 118 + Regex::new(r"(?m)VRChat_[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2}.[0-9]{3}_[0-9]{3,4}x[0-9]{3,4}.png").unwrap().is_match(&name) || 119 + Regex::new(r"(?m)VRChat_[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2}.[0-9]{3}_[0-9]{3,4}x[0-9]{3,4}_Player.png").unwrap().is_match(&name) || 120 + Regex::new(r"(?m)VRChat_[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2}.[0-9]{3}_[0-9]{3,4}x[0-9]{3,4}_Environment.png").unwrap().is_match(&name); 121 121 122 - if 123 - re1.is_match(&name) || 124 - re2.is_match(&name) 125 - { 122 + let re2_match = // This is the format VRCX uses if you enable renaming photos 123 + Regex::new(r"(?m)VRChat_[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2}.[0-9]{3}_[0-9]{3,4}x[0-9]{3,4}_wrld_[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}.png").unwrap().is_match(&name); 124 + 125 + if re1_match || re2_match{ 126 126 thread::sleep(time::Duration::from_millis(1000)); 127 127 sender.send((1, path.strip_prefix(get_photo_path()).unwrap().to_str().unwrap().to_owned())).unwrap(); 128 128 } ··· 142 142 ) 143 143 .unwrap(); 144 144 145 + let clipboard = Clipboard::new().unwrap(); 146 + 145 147 tauri::Builder::default() 146 - .plugin(tauri_plugin_single_instance::init(| app, argv, _cwd | { 148 + .plugin(tauri_plugin_single_instance::init(| app, _argv, _cwd | { 147 149 app.get_webview_window("main").unwrap().show().unwrap(); 148 - util::handle_deeplink::handle_deeplink(argv[1].clone(), app); 149 150 })) 150 - .plugin(tauri_plugin_deep_link::init()) 151 151 .plugin(tauri_plugin_process::init()) 152 152 .plugin(tauri_plugin_http::init()) 153 153 .plugin(tauri_plugin_shell::init()) ··· 156 156 util::handle_uri_proto::handle_uri_proto(req, res, cache); 157 157 }) 158 158 .on_window_event(|window, event| match event { 159 - WindowEvent::CloseRequested { api, .. } => { 159 + WindowEvent::CloseRequested { api, .. } => { 160 + let config: State<Config> = window.state(); 161 + 162 + let val = get_config_value_string("close-to-tray".into(), config.clone()); 163 + if val.is_none() || val.unwrap() != "true"{ 164 + config.save(); 165 + return; 166 + } 167 + 160 168 window.hide().unwrap(); 161 169 api.prevent_close(); 162 170 } 163 171 _ => {} 164 172 }) 173 + .manage(Config::new()) 165 174 .manage(cache) 175 + .manage(Mutex::new(clipboard)) 166 176 .setup(|app| { 167 177 let handle = app.handle(); 168 - 169 - app.deep_link().register("vrcpm").unwrap(); 170 178 util::setup_traymenu::setup_traymenu(handle); 171 179 172 180 // reads the file update mpsc channel and sends the events to the frontend ··· 190 198 Ok(()) 191 199 }) 192 200 .invoke_handler(tauri::generate_handler![ 193 - start_user_auth::start_user_auth, 194 201 load_photos::load_photos, 195 202 close_splashscreen::close_splashscreen, 196 203 load_photo_meta::load_photo_meta, ··· 202 209 start_with_win::start_with_win, 203 210 get_user_photos_path::get_user_photos_path, 204 211 change_final_path::change_final_path, 205 - sync_photos::sync_photos, 206 212 util::get_version::get_version, 207 - relaunch::relaunch, 208 213 config::set_config_value_string, 209 214 config::get_config_value_string, 210 215 config::set_config_value_int, 211 216 config::get_config_value_int, 212 - get_os::get_os 217 + get_os::get_os, 218 + copy_image::copy_image 213 219 ]) 214 220 .run(tauri::generate_context!()) 215 221 .expect("error while running tauri application");
-261
src-tauri/src/photosync.rs
··· 1 - use regex::Regex; 2 - use reqwest; 3 - use serde::Serialize; 4 - use serde_json::{Error, Value}; 5 - use std::{fs, io::Write, path, time::Duration}; 6 - use tauri::Emitter; 7 - 8 - #[derive(Clone, Serialize)] 9 - struct PhotoUploadMeta { 10 - photos_uploading: usize, 11 - photos_total: usize, 12 - } 13 - 14 - pub fn sync_photos(token: String, path: path::PathBuf, window: tauri::Window) { 15 - let sync_lock_path = dirs::config_dir() 16 - .unwrap() 17 - .join("PhazeDev/VRChatPhotoManager/.sync_lock"); 18 - 19 - match fs::metadata(&sync_lock_path) { 20 - Ok(_) => { 21 - return; 22 - } 23 - Err(_) => {} 24 - } 25 - 26 - fs::write(&sync_lock_path, "Currently Syncing").unwrap(); 27 - 28 - match fs::metadata(&path) { 29 - Ok(_) => {} 30 - Err(_) => { 31 - fs::create_dir(&path).unwrap(); 32 - } 33 - }; 34 - 35 - let mut photos: Vec<String> = Vec::new(); 36 - 37 - for folder in fs::read_dir(&path).unwrap() { 38 - let f = folder.unwrap(); 39 - 40 - if f.metadata().unwrap().is_dir() { 41 - match fs::read_dir(f.path()) { 42 - Ok(dir) => { 43 - for photo in dir { 44 - let p = photo.unwrap(); 45 - 46 - let re1 = Regex::new(r"(?m)VRChat_[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2}.[0-9]{3}_[0-9]{4}x[0-9]{4}.png").unwrap(); 47 - let re2 = Regex::new( 48 - r"(?m)VRChat_[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2}.[0-9]{3}_[0-9]{4}x[0-9]{4}_wrld_[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}.png").unwrap(); 49 - 50 - if re1.is_match(p.file_name().to_str().unwrap()) 51 - || re2.is_match(p.file_name().to_str().unwrap()) 52 - { 53 - photos.push(p.file_name().into_string().unwrap()); 54 - } 55 - } 56 - } 57 - Err(_) => {} 58 - } 59 - } 60 - } 61 - 62 - let body = reqwest::blocking::get(format!( 63 - "https://photos-cdn.phazed.xyz/api/v1/photos/exists?token={}", 64 - &token 65 - )) 66 - .unwrap() 67 - .text() 68 - .unwrap(); 69 - 70 - let body: Value = serde_json::from_str(&body).unwrap(); 71 - 72 - let mut photos_to_upload: Vec<String> = Vec::new(); 73 - let uploaded_photos = body["files"].as_array().unwrap(); 74 - 75 - let photos_len = photos.len(); 76 - 77 - for photo in &photos { 78 - let mut found_photo = false; 79 - 80 - for uploaded_photo in uploaded_photos { 81 - if photo == uploaded_photo.as_str().unwrap() { 82 - found_photo = true; 83 - break; 84 - } 85 - } 86 - 87 - if !found_photo { 88 - photos_to_upload.push(photo.clone()); 89 - } 90 - } 91 - 92 - window 93 - .emit( 94 - "photos-upload-meta", 95 - PhotoUploadMeta { 96 - photos_uploading: photos_to_upload.len(), 97 - photos_total: photos_len, 98 - }, 99 - ) 100 - .unwrap(); 101 - 102 - let mut photos_left = photos_to_upload.len(); 103 - 104 - let client = reqwest::blocking::Client::new(); 105 - 106 - loop { 107 - match photos_to_upload.pop() { 108 - Some(photo) => { 109 - let folder_name = photo.clone().replace("VRChat_", ""); 110 - let mut folder_name = folder_name.split("-"); 111 - let folder_name = format!( 112 - "{}-{}", 113 - folder_name.nth(0).unwrap(), 114 - folder_name.nth(0).unwrap() 115 - ); 116 - 117 - let full_path = format!("{}\\{}\\{}", path.to_str().unwrap(), folder_name, photo); 118 - let file = fs::File::open(full_path); 119 - 120 - match file { 121 - Ok(file) => { 122 - let res = client 123 - .put(format!( 124 - "https://photos-cdn.phazed.xyz/api/v1/photos?token={}", 125 - &token 126 - )) 127 - .header("Content-Type", "image/png") 128 - .header("filename", photo) 129 - .body(file) 130 - .timeout(Duration::from_secs(120)) 131 - .send() 132 - .unwrap() 133 - .text() 134 - .unwrap(); 135 - 136 - let res: Result<Value, Error> = serde_json::from_str(&res); 137 - 138 - match res { 139 - Ok(res) => { 140 - if !res["ok"].as_bool().unwrap() { 141 - println!("Failed to upload: {}", res["error"].as_str().unwrap()); 142 - 143 - window 144 - .emit("sync-failed", res["error"].as_str().unwrap()) 145 - .unwrap(); 146 - 147 - break; 148 - } 149 - } 150 - Err(err) => { 151 - dbg!(err); 152 - } 153 - } 154 - } 155 - Err(_) => {} 156 - } 157 - 158 - photos_left -= 1; 159 - window 160 - .emit( 161 - "photos-upload-meta", 162 - PhotoUploadMeta { 163 - photos_uploading: photos_left, 164 - photos_total: photos_len, 165 - }, 166 - ) 167 - .unwrap(); 168 - } 169 - None => { 170 - break; 171 - } 172 - } 173 - } 174 - 175 - println!("Finished Uploading."); 176 - let mut photos_to_download: Vec<String> = Vec::new(); 177 - 178 - for photo in uploaded_photos { 179 - let mut found_photo = false; 180 - let photo = photo.as_str().unwrap().to_string(); 181 - 182 - for uploaded_photo in &photos { 183 - if &photo == uploaded_photo { 184 - found_photo = true; 185 - break; 186 - } 187 - } 188 - 189 - if !found_photo { 190 - photos_to_download.push(photo); 191 - } 192 - } 193 - 194 - photos_to_download.reverse(); 195 - 196 - let photos_len = photos_to_download.len(); 197 - let mut photos_left = photos_to_download.len(); 198 - 199 - loop { 200 - match photos_to_download.pop() { 201 - Some(photo) => { 202 - let folder_name = photo.clone().replace("VRChat_", ""); 203 - let mut folder_name = folder_name.split("-"); 204 - let folder_name = format!( 205 - "{}-{}", 206 - folder_name.nth(0).unwrap(), 207 - folder_name.nth(0).unwrap() 208 - ); 209 - 210 - let full_path = format!("{}/{}/{}", path.to_str().unwrap(), folder_name, photo); 211 - 212 - let res = client 213 - .get(format!( 214 - "https://photos-cdn.phazed.xyz/api/v1/photos?token={}&photo={}", 215 - &token, &photo 216 - )) 217 - .timeout(Duration::from_secs(120)) 218 - .send() 219 - .unwrap() 220 - .bytes(); 221 - 222 - match res { 223 - Ok(res) => { 224 - let folder_path = format!("{}/{}", path.to_str().unwrap(), folder_name); 225 - match fs::metadata(&folder_path) { 226 - Ok(_) => {} 227 - Err(_) => { 228 - fs::create_dir(folder_path).unwrap(); 229 - } 230 - } 231 - 232 - let mut file = fs::File::create(full_path).unwrap(); 233 - file.write_all(&res).unwrap(); 234 - } 235 - Err(err) => { 236 - dbg!(err); 237 - } 238 - } 239 - 240 - photos_left -= 1; 241 - window 242 - .emit( 243 - "photos-download-meta", 244 - PhotoUploadMeta { 245 - photos_uploading: photos_left, 246 - photos_total: photos_len, 247 - }, 248 - ) 249 - .unwrap(); 250 - } 251 - None => { 252 - break; 253 - } 254 - } 255 - } 256 - 257 - println!("Finished Downloading."); 258 - 259 - fs::remove_file(&sync_lock_path).unwrap(); 260 - window.emit("sync-finished", "h").unwrap(); 261 - }
+17 -33
src-tauri/src/pngmeta.rs
··· 1 - use serde::ser::{Serialize, SerializeStruct, Serializer}; 2 1 use std::str; 3 2 4 - #[derive(Clone)] 3 + use serde::Serialize; 4 + 5 + #[derive(Clone, Debug, Serialize)] 5 6 pub struct PNGImage { 6 - width: u32, 7 - height: u32, 8 - bit_depth: u8, 9 - colour_type: u8, 10 - compression_method: u8, 11 - filter_method: u8, 12 - interlace_method: u8, 13 - metadata: String, 14 - path: String, 7 + pub width: u32, 8 + pub height: u32, 9 + pub bit_depth: u8, 10 + pub colour_type: u8, 11 + pub compression_method: u8, 12 + pub filter_method: u8, 13 + pub interlace_method: u8, 14 + pub metadata: String, 15 + pub path: String, 16 + pub error: bool 15 17 } 16 18 17 19 impl PNGImage { 18 - pub fn new(buff: Vec<u8>, path: String) -> PNGImage { 20 + pub fn new(buff: Vec<u8>, path: String) -> Result<PNGImage, &'static str> { 19 21 if buff[0] != 0x89 20 22 || buff[1] != 0x50 21 23 || buff[2] != 0x4E ··· 26 28 || buff[7] != 0x0A 27 29 { 28 30 dbg!(path); 29 - panic!("Image is not a PNG file"); 31 + return Err("Image is not a PNG file"); 30 32 } 31 33 32 34 let mut img = PNGImage { ··· 39 41 interlace_method: 0, 40 42 metadata: "".to_string(), 41 43 path: path, 44 + error: false 42 45 }; 43 46 44 47 img.read_png_chunk(8, buff); 45 - img 48 + Ok(img) 46 49 } 47 50 48 51 fn read_png_chunk(&mut self, start_byte: usize, buff: Vec<u8>) { ··· 82 85 } 83 86 } 84 87 } 85 - 86 - impl Serialize for PNGImage { 87 - fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> 88 - where 89 - S: Serializer, 90 - { 91 - let mut s = serializer.serialize_struct("PNGImage", 7)?; 92 - s.serialize_field("width", &self.width)?; 93 - s.serialize_field("height", &self.height)?; 94 - s.serialize_field("bit_depth", &self.bit_depth)?; 95 - s.serialize_field("colour_type", &self.colour_type)?; 96 - s.serialize_field("compression_method", &self.compression_method)?; 97 - s.serialize_field("filter_method", &self.filter_method)?; 98 - s.serialize_field("interlace_method", &self.interlace_method)?; 99 - s.serialize_field("metadata", &self.metadata)?; 100 - s.serialize_field("path", &self.path)?; 101 - s.end() 102 - } 103 - }
+1 -1
src-tauri/src/util/cache.rs
··· 1 - use std::{collections::HashMap, sync::Mutex}; 1 + use std::{ collections::HashMap, sync::Mutex }; 2 2 3 3 pub struct Cache{ 4 4 store: Mutex<HashMap<String, String>>,
-55
src-tauri/src/util/check_updates.rs
··· 1 - use crate::util; 2 - use std::{ 3 - env, fs, path, 4 - process::{ self, Command }, 5 - thread, 6 - time::Duration, 7 - }; 8 - 9 - pub fn check_updates(container_folder: path::PathBuf) { 10 - let args: Vec<String> = env::args().collect(); 11 - 12 - let mut update = true; 13 - for arg in args { 14 - if arg == "--no-update" { 15 - update = false; 16 - } 17 - } 18 - 19 - if update { 20 - // Auto update 21 - thread::spawn(move || { 22 - let client = reqwest::blocking::Client::new(); 23 - 24 - let latest_version = client 25 - .get("https://cdn.phaz.uk/vrcpm/latest") 26 - .send() 27 - .unwrap() 28 - .text() 29 - .unwrap(); 30 - 31 - if latest_version != util::get_version::get_version() { 32 - match fs::metadata(&container_folder.join("./updater.exe")) { 33 - Ok(_) => {} 34 - Err(_) => { 35 - let latest_installer = client 36 - .get("https://cdn.phaz.uk/vrcpm/vrcpm-installer.exe") 37 - .timeout(Duration::from_secs(120)) 38 - .send() 39 - .unwrap() 40 - .bytes() 41 - .unwrap(); 42 - 43 - fs::write(&container_folder.join("./updater.exe"), latest_installer).unwrap(); 44 - } 45 - } 46 - 47 - let mut cmd = Command::new(&container_folder.join("./updater.exe")); 48 - cmd.current_dir(container_folder); 49 - cmd.spawn().expect("Cannot run updater"); 50 - 51 - process::exit(0); 52 - } 53 - }); 54 - } 55 - }
+7 -1
src-tauri/src/util/get_photo_path.rs
··· 7 7 8 8 match fs::read_to_string(config_path) { 9 9 Ok(path) => { 10 - path::PathBuf::from(path) 10 + let p = path::PathBuf::from(path); 11 + 12 + if fs::exists(&p).unwrap(){ 13 + p 14 + } else{ 15 + dirs::picture_dir().unwrap().join("VRChat") 16 + } 11 17 }, 12 18 Err(_) => { 13 19 let p = dirs::picture_dir().unwrap().join("VRChat");
-22
src-tauri/src/util/handle_deeplink.rs
··· 1 - use tauri::{ AppHandle, Emitter }; 2 - 3 - pub fn handle_deeplink( url: String, handle: &AppHandle ) { 4 - let mut command: u8 = 0; 5 - let mut index: u8 = 0; 6 - 7 - for part in url.split('/').into_iter() { 8 - index += 1; 9 - 10 - if index == 3 && part == "auth-callback" { 11 - command = 1; 12 - } 13 - 14 - if index == 3 && part == "auth-denied" { 15 - handle.emit("auth-denied", "null").unwrap(); 16 - } 17 - 18 - if index == 4 && command == 1 { 19 - handle.emit("auth-callback", part).unwrap(); 20 - } 21 - } 22 - }
-6
src-tauri/src/util/handle_uri_proto.rs
··· 33 33 return; 34 34 } 35 35 36 - // TODO: Only accept files that are in the vrchat photos folder 37 - // Slightly more complex than originally thought, need to find a way to cache the VRC photos path 38 - // since i need to be able to load lots of photos very quickly. This shouldn't be a security issue 39 - // because tauri should only let the frontend of VRCPhotoManager read files throught this. Only 40 - // becomes a potential issue if the frontend gets modified or there's an issue with tauri. 41 - 42 36 #[cfg(windows)] 43 37 let path = uri.path().split_at(1).1; 44 38
-2
src-tauri/src/util/mod.rs
··· 1 - pub mod check_updates; 2 1 pub mod get_photo_path; 3 2 pub mod get_version; 4 3 pub mod handle_uri_proto; 5 - pub mod handle_deeplink; 6 4 pub mod setup_traymenu; 7 5 pub mod cache;
+8 -1
src-tauri/src/util/setup_traymenu.rs
··· 1 1 use tauri::{ 2 2 menu::{MenuBuilder, MenuItemBuilder}, 3 3 tray::{MouseButton, MouseButtonState, TrayIconBuilder, TrayIconEvent}, 4 - AppHandle, Emitter, Manager, 4 + AppHandle, Emitter, Manager, State, 5 5 }; 6 + 7 + use crate::frontend_calls::config::Config; 6 8 7 9 #[derive(serde::Serialize, Clone)] 8 10 struct EmptyEvent {} ··· 27 29 TrayIconBuilder::with_id("main") 28 30 .icon(tauri::image::Image::from_bytes(include_bytes!("../../icons/32x32.png")).unwrap()) 29 31 .menu(&tray_menu) 32 + .title("VRChat Photo Manager") 33 + .tooltip("VRChat Photo Manager") 30 34 .on_menu_event(move |app: &AppHandle, event| match event.id().as_ref() { 31 35 "quit" => { 36 + let config: State<Config> = app.state(); 37 + config.save(); 38 + 32 39 std::process::exit(0); 33 40 } 34 41 "hide" => {
+4 -5
src-tauri/tauri.conf.json
··· 15 15 "icons/icon.ico" 16 16 ] 17 17 }, 18 - "productName": "vrchat-photo-manager", 18 + "productName": "VRChat Photo Manager", 19 19 "version": "0.0.1", 20 20 "identifier": "uk.phaz.vrcpm", 21 21 "plugins": { ··· 23 23 }, 24 24 "app": { 25 25 "security": { 26 - "csp": "https://photos.phazed.xyz; connect-src ipc: http://ipc.localhost" 26 + "csp": "connect-src https://api.github.com ipc: http://ipc.localhost" 27 27 }, 28 28 "windows": [ 29 29 { ··· 35 35 "minWidth": 600, 36 36 "minHeight": 400, 37 37 "visible": false, 38 - "decorations": false, 39 - "transparent": true, 40 - "titleBarStyle": "Transparent" 38 + "decorations": true, 39 + "transparent": true 41 40 } 42 41 ] 43 42 }
+1 -1
vite.config.ts
··· 11 11 12 12 // https://vitejs.dev/config/ 13 13 export default defineConfig(async () => ({ 14 - plugins: [solid(),], //fullReloadAlways], 14 + plugins: [solid(), fullReloadAlways], 15 15 16 16 // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` 17 17 //