this repo has no description

Compare changes

Choose any two refs to compare.

Changed files
+6788 -1942
.vscode
public
src
src-tauri
+5 -1
.gitignore
··· 1 1 node_modules 2 2 dist 3 - build 3 + builds 4 + target 5 + 6 + .vscode/ 7 + .idea/
-3
.vscode/extensions.json
··· 1 - { 2 - "recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer"] 3 - }
-7
README.md
··· 1 - # Tauri + Solid + Typescript 2 - 3 - This template should help get you started developing with Tauri, Solid and Typescript in Vite. 4 - 5 - ## Recommended IDE Setup 6 - 7 - - [VS Code](https://code.visualstudio.com/) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer)
+11 -8
package.json
··· 12 12 }, 13 13 "license": "MIT", 14 14 "dependencies": { 15 - "@tauri-apps/api": "^2", 16 - "@tauri-apps/plugin-opener": "^2", 17 - "animejs": "^4.1.2", 18 - "solid-js": "^1.9.3" 15 + "@tauri-apps/api": "^2.9.0", 16 + "@tauri-apps/plugin-clipboard-manager": "~2", 17 + "@tauri-apps/plugin-dialog": "~2.4.2", 18 + "@tauri-apps/plugin-opener": "^2.5.2", 19 + "@tauri-apps/plugin-os": "~2", 20 + "animejs": "^4.2.2", 21 + "solid-js": "^1.9.10" 19 22 }, 20 23 "devDependencies": { 21 - "@tauri-apps/cli": "^2", 24 + "@tauri-apps/cli": "^2.9.3", 22 25 "@types/animejs": "^3.1.13", 23 - "typescript": "~5.6.2", 24 - "vite": "^6.0.3", 25 - "vite-plugin-solid": "^2.11.0" 26 + "typescript": "~5.6.3", 27 + "vite": "^6.4.1", 28 + "vite-plugin-solid": "^2.11.10" 26 29 } 27 30 }
+483 -428
pnpm-lock.yaml
··· 9 9 .: 10 10 dependencies: 11 11 '@tauri-apps/api': 12 - specifier: ^2 13 - version: 2.7.0 12 + specifier: ^2.9.0 13 + version: 2.9.0 14 + '@tauri-apps/plugin-clipboard-manager': 15 + specifier: ~2 16 + version: 2.3.2 17 + '@tauri-apps/plugin-dialog': 18 + specifier: ~2.4.2 19 + version: 2.4.2 14 20 '@tauri-apps/plugin-opener': 15 - specifier: ^2 16 - version: 2.4.0 21 + specifier: ^2.5.2 22 + version: 2.5.2 23 + '@tauri-apps/plugin-os': 24 + specifier: ~2 25 + version: 2.3.2 17 26 animejs: 18 - specifier: ^4.1.2 19 - version: 4.1.2 27 + specifier: ^4.2.2 28 + version: 4.2.2 20 29 solid-js: 21 - specifier: ^1.9.3 22 - version: 1.9.7 30 + specifier: ^1.9.10 31 + version: 1.9.10 23 32 devDependencies: 24 33 '@tauri-apps/cli': 25 - specifier: ^2 26 - version: 2.7.1 34 + specifier: ^2.9.3 35 + version: 2.9.3 27 36 '@types/animejs': 28 37 specifier: ^3.1.13 29 38 version: 3.1.13 30 39 typescript: 31 - specifier: ~5.6.2 40 + specifier: ~5.6.3 32 41 version: 5.6.3 33 42 vite: 34 - specifier: ^6.0.3 35 - version: 6.3.5 43 + specifier: ^6.4.1 44 + version: 6.4.1 36 45 vite-plugin-solid: 37 - specifier: ^2.11.0 38 - version: 2.11.8(solid-js@1.9.7)(vite@6.3.5) 46 + specifier: ^2.11.10 47 + version: 2.11.10(solid-js@1.9.10)(vite@6.4.1) 39 48 40 49 packages: 41 - 42 - '@ampproject/remapping@2.3.0': 43 - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 44 - engines: {node: '>=6.0.0'} 45 50 46 51 '@babel/code-frame@7.27.1': 47 52 resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 48 53 engines: {node: '>=6.9.0'} 49 54 50 - '@babel/compat-data@7.28.0': 51 - resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} 55 + '@babel/compat-data@7.28.5': 56 + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} 52 57 engines: {node: '>=6.9.0'} 53 58 54 - '@babel/core@7.28.0': 55 - resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} 59 + '@babel/core@7.28.5': 60 + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} 56 61 engines: {node: '>=6.9.0'} 57 62 58 - '@babel/generator@7.28.0': 59 - resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} 63 + '@babel/generator@7.28.5': 64 + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} 60 65 engines: {node: '>=6.9.0'} 61 66 62 67 '@babel/helper-compilation-targets@7.27.2': ··· 75 80 resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} 76 81 engines: {node: '>=6.9.0'} 77 82 78 - '@babel/helper-module-transforms@7.27.3': 79 - resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} 83 + '@babel/helper-module-transforms@7.28.3': 84 + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} 80 85 engines: {node: '>=6.9.0'} 81 86 peerDependencies: 82 87 '@babel/core': ^7.0.0 ··· 89 94 resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 90 95 engines: {node: '>=6.9.0'} 91 96 92 - '@babel/helper-validator-identifier@7.27.1': 93 - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 97 + '@babel/helper-validator-identifier@7.28.5': 98 + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} 94 99 engines: {node: '>=6.9.0'} 95 100 96 101 '@babel/helper-validator-option@7.27.1': 97 102 resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} 98 103 engines: {node: '>=6.9.0'} 99 104 100 - '@babel/helpers@7.28.2': 101 - resolution: {integrity: sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==} 105 + '@babel/helpers@7.28.4': 106 + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} 102 107 engines: {node: '>=6.9.0'} 103 108 104 - '@babel/parser@7.28.0': 105 - resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} 109 + '@babel/parser@7.28.5': 110 + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} 106 111 engines: {node: '>=6.0.0'} 107 112 hasBin: true 108 113 ··· 116 121 resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} 117 122 engines: {node: '>=6.9.0'} 118 123 119 - '@babel/traverse@7.28.0': 120 - resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} 124 + '@babel/traverse@7.28.5': 125 + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} 121 126 engines: {node: '>=6.9.0'} 122 127 123 - '@babel/types@7.28.2': 124 - resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} 128 + '@babel/types@7.28.5': 129 + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} 125 130 engines: {node: '>=6.9.0'} 126 131 127 - '@esbuild/aix-ppc64@0.25.8': 128 - resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} 132 + '@esbuild/aix-ppc64@0.25.12': 133 + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} 129 134 engines: {node: '>=18'} 130 135 cpu: [ppc64] 131 136 os: [aix] 132 137 133 - '@esbuild/android-arm64@0.25.8': 134 - resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} 138 + '@esbuild/android-arm64@0.25.12': 139 + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} 135 140 engines: {node: '>=18'} 136 141 cpu: [arm64] 137 142 os: [android] 138 143 139 - '@esbuild/android-arm@0.25.8': 140 - resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} 144 + '@esbuild/android-arm@0.25.12': 145 + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} 141 146 engines: {node: '>=18'} 142 147 cpu: [arm] 143 148 os: [android] 144 149 145 - '@esbuild/android-x64@0.25.8': 146 - resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} 150 + '@esbuild/android-x64@0.25.12': 151 + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} 147 152 engines: {node: '>=18'} 148 153 cpu: [x64] 149 154 os: [android] 150 155 151 - '@esbuild/darwin-arm64@0.25.8': 152 - resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} 156 + '@esbuild/darwin-arm64@0.25.12': 157 + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} 153 158 engines: {node: '>=18'} 154 159 cpu: [arm64] 155 160 os: [darwin] 156 161 157 - '@esbuild/darwin-x64@0.25.8': 158 - resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} 162 + '@esbuild/darwin-x64@0.25.12': 163 + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} 159 164 engines: {node: '>=18'} 160 165 cpu: [x64] 161 166 os: [darwin] 162 167 163 - '@esbuild/freebsd-arm64@0.25.8': 164 - resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} 168 + '@esbuild/freebsd-arm64@0.25.12': 169 + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} 165 170 engines: {node: '>=18'} 166 171 cpu: [arm64] 167 172 os: [freebsd] 168 173 169 - '@esbuild/freebsd-x64@0.25.8': 170 - resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} 174 + '@esbuild/freebsd-x64@0.25.12': 175 + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} 171 176 engines: {node: '>=18'} 172 177 cpu: [x64] 173 178 os: [freebsd] 174 179 175 - '@esbuild/linux-arm64@0.25.8': 176 - resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} 180 + '@esbuild/linux-arm64@0.25.12': 181 + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} 177 182 engines: {node: '>=18'} 178 183 cpu: [arm64] 179 184 os: [linux] 180 185 181 - '@esbuild/linux-arm@0.25.8': 182 - resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} 186 + '@esbuild/linux-arm@0.25.12': 187 + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} 183 188 engines: {node: '>=18'} 184 189 cpu: [arm] 185 190 os: [linux] 186 191 187 - '@esbuild/linux-ia32@0.25.8': 188 - resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} 192 + '@esbuild/linux-ia32@0.25.12': 193 + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} 189 194 engines: {node: '>=18'} 190 195 cpu: [ia32] 191 196 os: [linux] 192 197 193 - '@esbuild/linux-loong64@0.25.8': 194 - resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} 198 + '@esbuild/linux-loong64@0.25.12': 199 + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} 195 200 engines: {node: '>=18'} 196 201 cpu: [loong64] 197 202 os: [linux] 198 203 199 - '@esbuild/linux-mips64el@0.25.8': 200 - resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} 204 + '@esbuild/linux-mips64el@0.25.12': 205 + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} 201 206 engines: {node: '>=18'} 202 207 cpu: [mips64el] 203 208 os: [linux] 204 209 205 - '@esbuild/linux-ppc64@0.25.8': 206 - resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} 210 + '@esbuild/linux-ppc64@0.25.12': 211 + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} 207 212 engines: {node: '>=18'} 208 213 cpu: [ppc64] 209 214 os: [linux] 210 215 211 - '@esbuild/linux-riscv64@0.25.8': 212 - resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} 216 + '@esbuild/linux-riscv64@0.25.12': 217 + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} 213 218 engines: {node: '>=18'} 214 219 cpu: [riscv64] 215 220 os: [linux] 216 221 217 - '@esbuild/linux-s390x@0.25.8': 218 - resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} 222 + '@esbuild/linux-s390x@0.25.12': 223 + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} 219 224 engines: {node: '>=18'} 220 225 cpu: [s390x] 221 226 os: [linux] 222 227 223 - '@esbuild/linux-x64@0.25.8': 224 - resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} 228 + '@esbuild/linux-x64@0.25.12': 229 + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} 225 230 engines: {node: '>=18'} 226 231 cpu: [x64] 227 232 os: [linux] 228 233 229 - '@esbuild/netbsd-arm64@0.25.8': 230 - resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} 234 + '@esbuild/netbsd-arm64@0.25.12': 235 + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} 231 236 engines: {node: '>=18'} 232 237 cpu: [arm64] 233 238 os: [netbsd] 234 239 235 - '@esbuild/netbsd-x64@0.25.8': 236 - resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} 240 + '@esbuild/netbsd-x64@0.25.12': 241 + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} 237 242 engines: {node: '>=18'} 238 243 cpu: [x64] 239 244 os: [netbsd] 240 245 241 - '@esbuild/openbsd-arm64@0.25.8': 242 - resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} 246 + '@esbuild/openbsd-arm64@0.25.12': 247 + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} 243 248 engines: {node: '>=18'} 244 249 cpu: [arm64] 245 250 os: [openbsd] 246 251 247 - '@esbuild/openbsd-x64@0.25.8': 248 - resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} 252 + '@esbuild/openbsd-x64@0.25.12': 253 + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} 249 254 engines: {node: '>=18'} 250 255 cpu: [x64] 251 256 os: [openbsd] 252 257 253 - '@esbuild/openharmony-arm64@0.25.8': 254 - resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} 258 + '@esbuild/openharmony-arm64@0.25.12': 259 + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} 255 260 engines: {node: '>=18'} 256 261 cpu: [arm64] 257 262 os: [openharmony] 258 263 259 - '@esbuild/sunos-x64@0.25.8': 260 - resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} 264 + '@esbuild/sunos-x64@0.25.12': 265 + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} 261 266 engines: {node: '>=18'} 262 267 cpu: [x64] 263 268 os: [sunos] 264 269 265 - '@esbuild/win32-arm64@0.25.8': 266 - resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} 270 + '@esbuild/win32-arm64@0.25.12': 271 + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} 267 272 engines: {node: '>=18'} 268 273 cpu: [arm64] 269 274 os: [win32] 270 275 271 - '@esbuild/win32-ia32@0.25.8': 272 - resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} 276 + '@esbuild/win32-ia32@0.25.12': 277 + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} 273 278 engines: {node: '>=18'} 274 279 cpu: [ia32] 275 280 os: [win32] 276 281 277 - '@esbuild/win32-x64@0.25.8': 278 - resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} 282 + '@esbuild/win32-x64@0.25.12': 283 + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} 279 284 engines: {node: '>=18'} 280 285 cpu: [x64] 281 286 os: [win32] 282 287 283 - '@jridgewell/gen-mapping@0.3.12': 284 - 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==} 285 293 286 294 '@jridgewell/resolve-uri@3.1.2': 287 295 resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 288 296 engines: {node: '>=6.0.0'} 289 297 290 - '@jridgewell/sourcemap-codec@1.5.4': 291 - resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} 298 + '@jridgewell/sourcemap-codec@1.5.5': 299 + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 292 300 293 - '@jridgewell/trace-mapping@0.3.29': 294 - resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} 301 + '@jridgewell/trace-mapping@0.3.31': 302 + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} 295 303 296 - '@rollup/rollup-android-arm-eabi@4.46.1': 297 - resolution: {integrity: sha512-oENme6QxtLCqjChRUUo3S6X8hjCXnWmJWnedD7VbGML5GUtaOtAyx+fEEXnBXVf0CBZApMQU0Idwi0FmyxzQhw==} 304 + '@rollup/rollup-android-arm-eabi@4.53.0': 305 + resolution: {integrity: sha512-MX3DD/o2W36nlgQb8KA5QtUw/bK5aR9YDzNmX1PRHZAa6LF/MQCWMN477CgBMg8gH1vEiEZsjWRIZeL/7ttUVA==} 298 306 cpu: [arm] 299 307 os: [android] 300 308 301 - '@rollup/rollup-android-arm64@4.46.1': 302 - resolution: {integrity: sha512-OikvNT3qYTl9+4qQ9Bpn6+XHM+ogtFadRLuT2EXiFQMiNkXFLQfNVppi5o28wvYdHL2s3fM0D/MZJ8UkNFZWsw==} 309 + '@rollup/rollup-android-arm64@4.53.0': 310 + resolution: {integrity: sha512-U4/R8ZvikDYLkl+hyAGP23SRHp3LwYSRy9SvJqsnva7TYLhVMy39RTVCYn1DdRNxXl1CyCQgE/mXKm9jaQT4ig==} 303 311 cpu: [arm64] 304 312 os: [android] 305 313 306 - '@rollup/rollup-darwin-arm64@4.46.1': 307 - resolution: {integrity: sha512-EFYNNGij2WllnzljQDQnlFTXzSJw87cpAs4TVBAWLdkvic5Uh5tISrIL6NRcxoh/b2EFBG/TK8hgRrGx94zD4A==} 314 + '@rollup/rollup-darwin-arm64@4.53.0': 315 + resolution: {integrity: sha512-nBG2BXRU3ifdK0HdqBKaT5VI6ScoIpABYZ+dWwQkIOYd8Suo4iykgPikjhsTd7NeHgJJ3OqlKYCcNkZtB1iLVQ==} 308 316 cpu: [arm64] 309 317 os: [darwin] 310 318 311 - '@rollup/rollup-darwin-x64@4.46.1': 312 - resolution: {integrity: sha512-ZaNH06O1KeTug9WI2+GRBE5Ujt9kZw4a1+OIwnBHal92I8PxSsl5KpsrPvthRynkhMck4XPdvY0z26Cym/b7oA==} 319 + '@rollup/rollup-darwin-x64@4.53.0': 320 + resolution: {integrity: sha512-QuZ5hYStB/vW7b8zQYtdIPpIfNNlUXtGk8zVTkoTMKzMhE2/6tVvcCWqdWqCVhx6eguJJjKjtZ9lAAG/D3yNeA==} 313 321 cpu: [x64] 314 322 os: [darwin] 315 323 316 - '@rollup/rollup-freebsd-arm64@4.46.1': 317 - resolution: {integrity: sha512-n4SLVebZP8uUlJ2r04+g2U/xFeiQlw09Me5UFqny8HGbARl503LNH5CqFTb5U5jNxTouhRjai6qPT0CR5c/Iig==} 324 + '@rollup/rollup-freebsd-arm64@4.53.0': 325 + resolution: {integrity: sha512-4yYPm1PJwK/HKI4FzElAPj2EAAFaaLUWzXV3S3edKy71JcEVzBCpgaXyEcDh3blBIjLml+aMkj6HEVGSuzpz+g==} 318 326 cpu: [arm64] 319 327 os: [freebsd] 320 328 321 - '@rollup/rollup-freebsd-x64@4.46.1': 322 - resolution: {integrity: sha512-8vu9c02F16heTqpvo3yeiu7Vi1REDEC/yES/dIfq3tSXe6mLndiwvYr3AAvd1tMNUqE9yeGYa5w7PRbI5QUV+w==} 329 + '@rollup/rollup-freebsd-x64@4.53.0': 330 + resolution: {integrity: sha512-1SvE5euwWV8JqFc4zEAqHbJbf2yJl00EoHVcnlFqLzjrIExYttLxfZeMDIXY6Yx+bskphrQakpChZKzE2JECEg==} 323 331 cpu: [x64] 324 332 os: [freebsd] 325 333 326 - '@rollup/rollup-linux-arm-gnueabihf@4.46.1': 327 - resolution: {integrity: sha512-K4ncpWl7sQuyp6rWiGUvb6Q18ba8mzM0rjWJ5JgYKlIXAau1db7hZnR0ldJvqKWWJDxqzSLwGUhA4jp+KqgDtQ==} 334 + '@rollup/rollup-linux-arm-gnueabihf@4.53.0': 335 + resolution: {integrity: sha512-9tS4QyfU5NF5CdUugEi7kWbcGD7pbu6Fm8SunuePH6beeQgtcRZ9K9KVwKHEgfBHeeyrr5OvfV1qWs7PMDOf5w==} 328 336 cpu: [arm] 329 337 os: [linux] 330 338 331 - '@rollup/rollup-linux-arm-musleabihf@4.46.1': 332 - resolution: {integrity: sha512-YykPnXsjUjmXE6j6k2QBBGAn1YsJUix7pYaPLK3RVE0bQL2jfdbfykPxfF8AgBlqtYbfEnYHmLXNa6QETjdOjQ==} 339 + '@rollup/rollup-linux-arm-musleabihf@4.53.0': 340 + resolution: {integrity: sha512-U+0ovxGU9bVJIHfW+oALpHd0ho1YDwhj0yHASDzIj+bOeo+VzEpNtHxcjhFab0YcHUorIMoqyxckC98+81oTJw==} 333 341 cpu: [arm] 334 342 os: [linux] 335 343 336 - '@rollup/rollup-linux-arm64-gnu@4.46.1': 337 - resolution: {integrity: sha512-kKvqBGbZ8i9pCGW3a1FH3HNIVg49dXXTsChGFsHGXQaVJPLA4f/O+XmTxfklhccxdF5FefUn2hvkoGJH0ScWOA==} 344 + '@rollup/rollup-linux-arm64-gnu@4.53.0': 345 + resolution: {integrity: sha512-Cp/TQ+wLjRTqTuiVwLz4XPZMo3ROl7EJYMF8HhMp8Uf+9kOOATB3/p4gGZPpuQ4BP7qEXG29ET24u9+F0ERYkQ==} 338 346 cpu: [arm64] 339 347 os: [linux] 340 348 341 - '@rollup/rollup-linux-arm64-musl@4.46.1': 342 - resolution: {integrity: sha512-zzX5nTw1N1plmqC9RGC9vZHFuiM7ZP7oSWQGqpbmfjK7p947D518cVK1/MQudsBdcD84t6k70WNczJOct6+hdg==} 349 + '@rollup/rollup-linux-arm64-musl@4.53.0': 350 + resolution: {integrity: sha512-SuGoAwhsSonrSTEZTiQOGC3+XZfq7rc/qAdAOBrYYIp8pu+Wh4EFFXl6+QYYNbNrHL3DnVoWACLwnfwlTa0neA==} 343 351 cpu: [arm64] 344 352 os: [linux] 345 353 346 - '@rollup/rollup-linux-loongarch64-gnu@4.46.1': 347 - resolution: {integrity: sha512-O8CwgSBo6ewPpktFfSDgB6SJN9XDcPSvuwxfejiddbIC/hn9Tg6Ai0f0eYDf3XvB/+PIWzOQL+7+TZoB8p9Yuw==} 354 + '@rollup/rollup-linux-loong64-gnu@4.53.0': 355 + resolution: {integrity: sha512-EOKej1x0WoePnJWfg7ZbnUqiuiQunshzsKZSIfTHFDiCY9pnsr3Weit1GjcpGnun7H5HuRREqkT2c9CcKxNwSg==} 348 356 cpu: [loong64] 349 357 os: [linux] 350 358 351 - '@rollup/rollup-linux-ppc64-gnu@4.46.1': 352 - resolution: {integrity: sha512-JnCfFVEKeq6G3h3z8e60kAp8Rd7QVnWCtPm7cxx+5OtP80g/3nmPtfdCXbVl063e3KsRnGSKDHUQMydmzc/wBA==} 359 + '@rollup/rollup-linux-ppc64-gnu@4.53.0': 360 + resolution: {integrity: sha512-YAvv2aMFlfiawJ97lutomuehG2Yowd4YgsAqI85XNiMK9eBA1vEMZHt3BShg8cUvak71BM+VFRHddqc+OrRdVA==} 353 361 cpu: [ppc64] 354 362 os: [linux] 355 363 356 - '@rollup/rollup-linux-riscv64-gnu@4.46.1': 357 - resolution: {integrity: sha512-dVxuDqS237eQXkbYzQQfdf/njgeNw6LZuVyEdUaWwRpKHhsLI+y4H/NJV8xJGU19vnOJCVwaBFgr936FHOnJsQ==} 364 + '@rollup/rollup-linux-riscv64-gnu@4.53.0': 365 + resolution: {integrity: sha512-DxZe/sMVaqN+s5kVk3Iq619Rgyl1JCTob7xOLSNC84mbzg3NYTSheqqrtVllYjLYo4wm9YyqjVS57miuzNyXbQ==} 358 366 cpu: [riscv64] 359 367 os: [linux] 360 368 361 - '@rollup/rollup-linux-riscv64-musl@4.46.1': 362 - resolution: {integrity: sha512-CvvgNl2hrZrTR9jXK1ye0Go0HQRT6ohQdDfWR47/KFKiLd5oN5T14jRdUVGF4tnsN8y9oSfMOqH6RuHh+ck8+w==} 369 + '@rollup/rollup-linux-riscv64-musl@4.53.0': 370 + resolution: {integrity: sha512-N7+iZ0jEhwLY1FEsjbCR9lAxIZP0k+3Cghx9vSQWn+rcW8SgN8VcCmwJDoPDaGKTzWWB791U1s79BSLnEhUa0Q==} 363 371 cpu: [riscv64] 364 372 os: [linux] 365 373 366 - '@rollup/rollup-linux-s390x-gnu@4.46.1': 367 - resolution: {integrity: sha512-x7ANt2VOg2565oGHJ6rIuuAon+A8sfe1IeUx25IKqi49OjSr/K3awoNqr9gCwGEJo9OuXlOn+H2p1VJKx1psxA==} 374 + '@rollup/rollup-linux-s390x-gnu@4.53.0': 375 + resolution: {integrity: sha512-MA/NVneZyIskjvXdh2NR9YcPi7eHWBlQOWP2X8OymzyeUEB0JfUpmbKQZngHmOlyleV2IoR5nHIgMSRjLskOnA==} 368 376 cpu: [s390x] 369 377 os: [linux] 370 378 371 - '@rollup/rollup-linux-x64-gnu@4.46.1': 372 - resolution: {integrity: sha512-9OADZYryz/7E8/qt0vnaHQgmia2Y0wrjSSn1V/uL+zw/i7NUhxbX4cHXdEQ7dnJgzYDS81d8+tf6nbIdRFZQoQ==} 379 + '@rollup/rollup-linux-x64-gnu@4.53.0': 380 + resolution: {integrity: sha512-iYEYzYpfaSCkunVD0LOYrD9OMc357be7+rBuCxW1qvsjCGl+95iWnYAFfyEoxAm6koasNN3tFxFYze5MKl5S3A==} 373 381 cpu: [x64] 374 382 os: [linux] 375 383 376 - '@rollup/rollup-linux-x64-musl@4.46.1': 377 - resolution: {integrity: sha512-NuvSCbXEKY+NGWHyivzbjSVJi68Xfq1VnIvGmsuXs6TCtveeoDRKutI5vf2ntmNnVq64Q4zInet0UDQ+yMB6tA==} 384 + '@rollup/rollup-linux-x64-musl@4.53.0': 385 + resolution: {integrity: sha512-FoRekOqhRUKbJMsB5LvhQchDeFeNlS6UGUwi0p3860sxE4zE+lp07FnkuR+yQH0rSn6iLXsnr44jnorgl8mGlQ==} 378 386 cpu: [x64] 379 387 os: [linux] 380 388 381 - '@rollup/rollup-win32-arm64-msvc@4.46.1': 382 - resolution: {integrity: sha512-mWz+6FSRb82xuUMMV1X3NGiaPFqbLN9aIueHleTZCc46cJvwTlvIh7reQLk4p97dv0nddyewBhwzryBHH7wtPw==} 389 + '@rollup/rollup-openharmony-arm64@4.53.0': 390 + resolution: {integrity: sha512-mEN2k1zKO5PUzW8W15hKpLh+zZI2by1onX2GfI93OekGbKN5aTjWGo7yAjwRZLjhAgs2UQcXmEWbIw0R5B4RnQ==} 391 + cpu: [arm64] 392 + os: [openharmony] 393 + 394 + '@rollup/rollup-win32-arm64-msvc@4.53.0': 395 + resolution: {integrity: sha512-V1dEKUXqevG0wxo6ysGrL7g2T6tndmo6Uqw5vzOqCXv+DHc8m0RRgcCm+96iigDniwpvV6o4HZtkRUnuTz9XiA==} 383 396 cpu: [arm64] 384 397 os: [win32] 385 398 386 - '@rollup/rollup-win32-ia32-msvc@4.46.1': 387 - resolution: {integrity: sha512-7Thzy9TMXDw9AU4f4vsLNBxh7/VOKuXi73VH3d/kHGr0tZ3x/ewgL9uC7ojUKmH1/zvmZe2tLapYcZllk3SO8Q==} 399 + '@rollup/rollup-win32-ia32-msvc@4.53.0': 400 + resolution: {integrity: sha512-93mJ8Hm9+vbhtu+A1VtmwptSqCYojtMQkBGDjLytCWC8muxmZLGo/MA/4CMAWf6+QpKlxTTMDAHdTC+kxn9ZcQ==} 388 401 cpu: [ia32] 389 402 os: [win32] 390 403 391 - '@rollup/rollup-win32-x64-msvc@4.46.1': 392 - resolution: {integrity: sha512-7GVB4luhFmGUNXXJhH2jJwZCFB3pIOixv2E3s17GQHBFUOQaISlt7aGcQgqvCaDSxTZJUzlK/QJ1FN8S94MrzQ==} 404 + '@rollup/rollup-win32-x64-gnu@4.53.0': 405 + resolution: {integrity: sha512-1OrYs0p/deXEFLUW1gvyjIabmsJKY3I/9fCUA1K6demaNc4iEhXDW6RnyPv/BWqb7NRmQ9+i+SKoi1HgJxWcwg==} 393 406 cpu: [x64] 394 407 os: [win32] 395 408 396 - '@tauri-apps/api@2.7.0': 397 - resolution: {integrity: sha512-v7fVE8jqBl8xJFOcBafDzXFc8FnicoH3j8o8DNNs0tHuEBmXUDqrCOAzMRX0UkfpwqZLqvrvK0GNQ45DfnoVDg==} 409 + '@rollup/rollup-win32-x64-msvc@4.53.0': 410 + resolution: {integrity: sha512-xtSei8paPcLy3GzeeOjoRrllJn6EN8PB+/bXnhZ4R0AaviJsRwtKxFZRVnfFXNZTTp0nLeDo+BcEuIfdZS14/A==} 411 + cpu: [x64] 412 + os: [win32] 398 413 399 - '@tauri-apps/cli-darwin-arm64@2.7.1': 400 - resolution: {integrity: sha512-j2NXQN6+08G03xYiyKDKqbCV2Txt+hUKg0a8hYr92AmoCU8fgCjHyva/p16lGFGUG3P2Yu0xiNe1hXL9ZuRMzA==} 414 + '@tauri-apps/api@2.9.0': 415 + resolution: {integrity: sha512-qD5tMjh7utwBk9/5PrTA/aGr3i5QaJ/Mlt7p8NilQ45WgbifUNPyKWsA63iQ8YfQq6R8ajMapU+/Q8nMcPRLNw==} 416 + 417 + '@tauri-apps/cli-darwin-arm64@2.9.3': 418 + resolution: {integrity: sha512-W8FQXZXQmQ0Fmj9UJXNrm2mLdIaLLriKVY7o/FzmizyIKTPIvHjfZALTNybbpTQRbJvKoGHLrW1DNzAWVDWJYg==} 401 419 engines: {node: '>= 10'} 402 420 cpu: [arm64] 403 421 os: [darwin] 404 422 405 - '@tauri-apps/cli-darwin-x64@2.7.1': 406 - resolution: {integrity: sha512-CdYAefeM35zKsc91qIyKzbaO7FhzTyWKsE8hj7tEJ1INYpoh1NeNNyL/NSEA3Nebi5ilugioJ5tRK8ZXG8y3gw==} 423 + '@tauri-apps/cli-darwin-x64@2.9.3': 424 + resolution: {integrity: sha512-zDwu40rlshijt3TU6aRvzPUyVpapsx1sNfOlreDMTaMelQLHl6YoQzSRpLHYwrHrhimxyX2uDqnKIiuGel0Lhg==} 407 425 engines: {node: '>= 10'} 408 426 cpu: [x64] 409 427 os: [darwin] 410 428 411 - '@tauri-apps/cli-linux-arm-gnueabihf@2.7.1': 412 - resolution: {integrity: sha512-dnvyJrTA1UJxJjQ8q1N/gWomjP8Twij1BUQu2fdcT3OPpqlrbOk5R1yT0oD/721xoKNjroB5BXCsmmlykllxNg==} 429 + '@tauri-apps/cli-linux-arm-gnueabihf@2.9.3': 430 + resolution: {integrity: sha512-+Oc2OfcTRwYtW93VJqd/HOk77buORwC9IToj/qsEvM7bTMq6Kda4alpZprzwrCHYANSw+zD8PgjJdljTpe4p+g==} 413 431 engines: {node: '>= 10'} 414 432 cpu: [arm] 415 433 os: [linux] 416 434 417 - '@tauri-apps/cli-linux-arm64-gnu@2.7.1': 418 - resolution: {integrity: sha512-FtBW6LJPNRTws3qyUc294AqCWU91l/H0SsFKq6q4Q45MSS4x6wxLxou8zB53tLDGEPx3JSoPLcDaSfPlSbyujQ==} 435 + '@tauri-apps/cli-linux-arm64-gnu@2.9.3': 436 + resolution: {integrity: sha512-59GqU/J1n9wFyAtleoQOaU0oVIo+kwQynEw4meFDoKRXszKGor6lTsbsS3r0QKLSPbc0o/yYGJhqqCtkYjb/eg==} 419 437 engines: {node: '>= 10'} 420 438 cpu: [arm64] 421 439 os: [linux] 422 440 423 - '@tauri-apps/cli-linux-arm64-musl@2.7.1': 424 - resolution: {integrity: sha512-/HXY0t4FHkpFzjeYS5c16mlA6z0kzn5uKLWptTLTdFSnYpr8FCnOP4Sdkvm2TDQPF2ERxXtNCd+WR/jQugbGnA==} 441 + '@tauri-apps/cli-linux-arm64-musl@2.9.3': 442 + resolution: {integrity: sha512-fzvG+jEn5/iYGNH6Z2IRMheYFC4pJdXa19BR9fFm6Bdn2cuajRLDKdUcEME/DCtwqclphXtFZTrT4oezY5vI/A==} 425 443 engines: {node: '>= 10'} 426 444 cpu: [arm64] 427 445 os: [linux] 428 446 429 - '@tauri-apps/cli-linux-riscv64-gnu@2.7.1': 430 - resolution: {integrity: sha512-GeW5lVI2GhhnaYckiDzstG2j2Jwlud5d2XefRGwlOK+C/bVGLT1le8MNPYK8wgRlpeK8fG1WnJJYD6Ke7YQ8bg==} 447 + '@tauri-apps/cli-linux-riscv64-gnu@2.9.3': 448 + resolution: {integrity: sha512-qV8DZXI/fZwawk6T3Th1g6smiNC2KeQTk7XFgKvqZ6btC01z3UTsQmNGvI602zwm3Ld1TBZb4+rEWu2QmQimmw==} 431 449 engines: {node: '>= 10'} 432 450 cpu: [riscv64] 433 451 os: [linux] 434 452 435 - '@tauri-apps/cli-linux-x64-gnu@2.7.1': 436 - resolution: {integrity: sha512-DprxKQkPxIPYwUgg+cscpv2lcIUhn2nxEPlk0UeaiV9vATxCXyytxr1gLcj3xgjGyNPlM0MlJyYaPy1JmRg1cA==} 453 + '@tauri-apps/cli-linux-x64-gnu@2.9.3': 454 + resolution: {integrity: sha512-tquyEONCNRfqEBWEe4eAHnxFN5yY5lFkCuD4w79XLIovUxVftQ684+xLp7zkhntkt4y20SMj2AgJa/+MOlx4Kg==} 437 455 engines: {node: '>= 10'} 438 456 cpu: [x64] 439 457 os: [linux] 440 458 441 - '@tauri-apps/cli-linux-x64-musl@2.7.1': 442 - resolution: {integrity: sha512-KLlq3kOK7OUyDR757c0zQjPULpGZpLhNB0lZmZpHXvoOUcqZoCXJHh4dT/mryWZJp5ilrem5l8o9ngrDo0X1AA==} 459 + '@tauri-apps/cli-linux-x64-musl@2.9.3': 460 + resolution: {integrity: sha512-v2cBIB/6ji8DL+aiL5QUykU3ZO8OoJGyx50/qv2HQVzkf85KdaYSis3D/oVRemN/pcDz+vyCnnL3XnzFnDl4JQ==} 443 461 engines: {node: '>= 10'} 444 462 cpu: [x64] 445 463 os: [linux] 446 464 447 - '@tauri-apps/cli-win32-arm64-msvc@2.7.1': 448 - resolution: {integrity: sha512-dH7KUjKkSypCeWPiainHyXoES3obS+JIZVoSwSZfKq2gWgs48FY3oT0hQNYrWveE+VR4VoR3b/F3CPGbgFvksA==} 465 + '@tauri-apps/cli-win32-arm64-msvc@2.9.3': 466 + resolution: {integrity: sha512-ZGvBy7nvrHPbE0HeKp/ioaiw8bNgAHxWnb7JRZ4/G0A+oFj0SeSFxl9k5uU6FKnM7bHM23Gd1oeaDex9g5Fceg==} 449 467 engines: {node: '>= 10'} 450 468 cpu: [arm64] 451 469 os: [win32] 452 470 453 - '@tauri-apps/cli-win32-ia32-msvc@2.7.1': 454 - resolution: {integrity: sha512-1oeibfyWQPVcijOrTg709qhbXArjX3x1MPjrmA5anlygwrbByxLBcLXvotcOeULFcnH2FYUMMLLant8kgvwE5A==} 471 + '@tauri-apps/cli-win32-ia32-msvc@2.9.3': 472 + resolution: {integrity: sha512-UsgIwOnpCoY9NK9/65QiwgmWVIE80LE7SwRYVblGtmlY9RYfsYvpbItwsovA/AcHMTiO+OCvS/q9yLeqS3m6Sg==} 455 473 engines: {node: '>= 10'} 456 474 cpu: [ia32] 457 475 os: [win32] 458 476 459 - '@tauri-apps/cli-win32-x64-msvc@2.7.1': 460 - resolution: {integrity: sha512-D7Q9kDObutuirCNLxYQ7KAg2Xxg99AjcdYz/KuMw5HvyEPbkC9Q7JL0vOrQOrHEHxIQ2lYzFOZvKKoC2yyqXcg==} 477 + '@tauri-apps/cli-win32-x64-msvc@2.9.3': 478 + resolution: {integrity: sha512-fmw7NrrHE5m49idCvJAx9T9bsupjdJ0a3p3DPCNCZRGANU6R1tA1L+KTlVuUtdAldX2NqU/9UPo2SCslYKgJHQ==} 461 479 engines: {node: '>= 10'} 462 480 cpu: [x64] 463 481 os: [win32] 464 482 465 - '@tauri-apps/cli@2.7.1': 466 - resolution: {integrity: sha512-RcGWR4jOUEl92w3uvI0h61Llkfj9lwGD1iwvDRD2isMrDhOzjeeeVn9aGzeW1jubQ/kAbMYfydcA4BA0Cy733Q==} 483 + '@tauri-apps/cli@2.9.3': 484 + resolution: {integrity: sha512-BQ7iLUXTQcyG1PpzLWeVSmBCedYDpnA/6Cm/kRFGtqjTf/eVUlyYO5S2ee07tLum3nWwDBWTGFZeruO8yEukfA==} 467 485 engines: {node: '>= 10'} 468 486 hasBin: true 469 487 470 - '@tauri-apps/plugin-opener@2.4.0': 471 - resolution: {integrity: sha512-43VyN8JJtvKWJY72WI/KNZszTpDpzHULFxQs0CJBIYUdCRowQ6Q1feWTDb979N7nldqSuDOaBupZ6wz2nvuWwQ==} 488 + '@tauri-apps/plugin-clipboard-manager@2.3.2': 489 + resolution: {integrity: sha512-CUlb5Hqi2oZbcZf4VUyUH53XWPPdtpw43EUpCza5HWZJwxEoDowFzNUDt1tRUXA8Uq+XPn17Ysfptip33sG4eQ==} 490 + 491 + '@tauri-apps/plugin-dialog@2.4.2': 492 + resolution: {integrity: sha512-lNIn5CZuw8WZOn8zHzmFmDSzg5zfohWoa3mdULP0YFh/VogVdMVWZPcWSHlydsiJhRQYaTNSYKN7RmZKE2lCYQ==} 493 + 494 + '@tauri-apps/plugin-opener@2.5.2': 495 + resolution: {integrity: sha512-ei/yRRoCklWHImwpCcDK3VhNXx+QXM9793aQ64YxpqVF0BDuuIlXhZgiAkc15wnPVav+IbkYhmDJIv5R326Mew==} 496 + 497 + '@tauri-apps/plugin-os@2.3.2': 498 + resolution: {integrity: sha512-n+nXWeuSeF9wcEsSPmRnBEGrRgOy6jjkSU+UVCOV8YUGKb2erhDOxis7IqRXiRVHhY8XMKks00BJ0OAdkpf6+A==} 472 499 473 500 '@types/animejs@3.1.13': 474 501 resolution: {integrity: sha512-yWg9l1z7CAv/TKpty4/vupEh24jDGUZXv4r26StRkpUPQm04ztJaftgpto8vwdFs8SiTq6XfaPKCSI+wjzNMvQ==} ··· 482 509 '@types/babel__template@7.4.4': 483 510 resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 484 511 485 - '@types/babel__traverse@7.20.7': 486 - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} 512 + '@types/babel__traverse@7.28.0': 513 + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} 487 514 488 515 '@types/estree@1.0.8': 489 516 resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 490 517 491 - animejs@4.1.2: 492 - resolution: {integrity: sha512-QojQzHzN4ZCOGk4Seir5CWPHGKFPpMAsen3KEj/BHsIKDceH0xKd3FBWflyKiNefKG2fn3+ofpY9jD/UXhpY6A==} 518 + animejs@4.2.2: 519 + resolution: {integrity: sha512-Ys3RuvLdAeI14fsdKCQy7ytu4057QX6Bb7m4jwmfd6iKmUmLquTwk1ut0e4NtRQgCeq/s2Lv5+oMBjz6c7ZuIg==} 493 520 494 - babel-plugin-jsx-dom-expressions@0.39.8: 495 - 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==} 496 523 peerDependencies: 497 524 '@babel/core': ^7.20.12 498 525 499 - babel-preset-solid@1.9.6: 500 - resolution: {integrity: sha512-HXTK9f93QxoH8dYn1M2mJdOlWgMsR88Lg/ul6QCZGkNTktjTE5HAf93YxQumHoCudLEtZrU1cFCMFOVho6GqFg==} 526 + babel-preset-solid@1.9.10: 527 + resolution: {integrity: sha512-HCelrgua/Y+kqO8RyL04JBWS/cVdrtUv/h45GntgQY+cJl4eBcKkCDV3TdMjtKx1nXwRaR9QXslM/Npm1dxdZQ==} 501 528 peerDependencies: 502 529 '@babel/core': ^7.0.0 530 + solid-js: ^1.9.10 531 + peerDependenciesMeta: 532 + solid-js: 533 + optional: true 503 534 504 - browserslist@4.25.1: 505 - 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==} 506 541 engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 507 542 hasBin: true 508 543 509 - caniuse-lite@1.0.30001731: 510 - resolution: {integrity: sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==} 544 + caniuse-lite@1.0.30001754: 545 + resolution: {integrity: sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==} 511 546 512 547 convert-source-map@2.0.0: 513 548 resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} ··· 515 550 csstype@3.1.3: 516 551 resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 517 552 518 - debug@4.4.1: 519 - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 553 + debug@4.4.3: 554 + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 520 555 engines: {node: '>=6.0'} 521 556 peerDependencies: 522 557 supports-color: '*' ··· 524 559 supports-color: 525 560 optional: true 526 561 527 - electron-to-chromium@1.5.192: 528 - resolution: {integrity: sha512-rP8Ez0w7UNw/9j5eSXCe10o1g/8B1P5SM90PCCMVkIRQn2R0LEHWz4Eh9RnxkniuDe1W0cTSOB3MLlkTGDcuCg==} 562 + electron-to-chromium@1.5.248: 563 + resolution: {integrity: sha512-zsur2yunphlyAO4gIubdJEXCK6KOVvtpiuDfCIqbM9FjcnMYiyn0ICa3hWfPr0nc41zcLWobgy1iL7VvoOyA2Q==} 529 564 530 565 entities@6.0.1: 531 566 resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} 532 567 engines: {node: '>=0.12'} 533 568 534 - esbuild@0.25.8: 535 - resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} 569 + esbuild@0.25.12: 570 + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} 536 571 engines: {node: '>=18'} 537 572 hasBin: true 538 573 ··· 540 575 resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 541 576 engines: {node: '>=6'} 542 577 543 - fdir@6.4.6: 544 - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} 578 + fdir@6.5.0: 579 + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 580 + engines: {node: '>=12.0.0'} 545 581 peerDependencies: 546 582 picomatch: ^3 || ^4 547 583 peerDependenciesMeta: ··· 592 628 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 593 629 hasBin: true 594 630 595 - node-releases@2.0.19: 596 - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 631 + node-releases@2.0.27: 632 + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} 597 633 598 634 parse5@7.3.0: 599 635 resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} ··· 609 645 resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 610 646 engines: {node: ^10 || ^12 || >=14} 611 647 612 - rollup@4.46.1: 613 - resolution: {integrity: sha512-33xGNBsDJAkzt0PvninskHlWnTIPgDtTwhg0U38CUoNP/7H6wI2Cz6dUeoNPbjdTdsYTGuiFFASuUOWovH0SyQ==} 648 + rollup@4.53.0: 649 + resolution: {integrity: sha512-43Z5T+4YTdfYkkA6CStU2DUYh7Ha9dLtvK+K3n0yEE/QS+4i28vSxrQsM59KqpvmT4tbOwJsFnRGMj/tvmQwWw==} 614 650 engines: {node: '>=18.0.0', npm: '>=8.0.0'} 615 651 hasBin: true 616 652 ··· 618 654 resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 619 655 hasBin: true 620 656 621 - seroval-plugins@1.3.2: 622 - resolution: {integrity: sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==} 657 + seroval-plugins@1.3.3: 658 + resolution: {integrity: sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==} 623 659 engines: {node: '>=10'} 624 660 peerDependencies: 625 661 seroval: ^1.0 ··· 628 664 resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} 629 665 engines: {node: '>=10'} 630 666 631 - solid-js@1.9.7: 632 - resolution: {integrity: sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw==} 667 + solid-js@1.9.10: 668 + resolution: {integrity: sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew==} 633 669 634 670 solid-refresh@0.6.3: 635 671 resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} ··· 640 676 resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 641 677 engines: {node: '>=0.10.0'} 642 678 643 - tinyglobby@0.2.14: 644 - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} 679 + tinyglobby@0.2.15: 680 + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 645 681 engines: {node: '>=12.0.0'} 646 682 647 683 typescript@5.6.3: ··· 649 685 engines: {node: '>=14.17'} 650 686 hasBin: true 651 687 652 - update-browserslist-db@1.1.3: 653 - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 688 + update-browserslist-db@1.1.4: 689 + resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} 654 690 hasBin: true 655 691 peerDependencies: 656 692 browserslist: '>= 4.21.0' 657 693 658 - validate-html-nesting@1.2.3: 659 - resolution: {integrity: sha512-kdkWdCl6eCeLlRShJKbjVOU2kFKxMF8Ghu50n+crEoyx+VKm3FxAxF9z4DCy6+bbTOqNW0+jcIYRnjoIRzigRw==} 660 - 661 - vite-plugin-solid@2.11.8: 662 - resolution: {integrity: sha512-hFrCxBfv3B1BmFqnJF4JOCYpjrmi/zwyeKjcomQ0khh8HFyQ8SbuBWQ7zGojfrz6HUOBFrJBNySDi/JgAHytWg==} 694 + vite-plugin-solid@2.11.10: 695 + resolution: {integrity: sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw==} 663 696 peerDependencies: 664 697 '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* 665 698 solid-js: ^1.7.2 ··· 668 701 '@testing-library/jest-dom': 669 702 optional: true 670 703 671 - vite@6.3.5: 672 - resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} 704 + vite@6.4.1: 705 + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} 673 706 engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 674 707 hasBin: true 675 708 peerDependencies: ··· 721 754 722 755 snapshots: 723 756 724 - '@ampproject/remapping@2.3.0': 725 - dependencies: 726 - '@jridgewell/gen-mapping': 0.3.12 727 - '@jridgewell/trace-mapping': 0.3.29 728 - 729 757 '@babel/code-frame@7.27.1': 730 758 dependencies: 731 - '@babel/helper-validator-identifier': 7.27.1 759 + '@babel/helper-validator-identifier': 7.28.5 732 760 js-tokens: 4.0.0 733 761 picocolors: 1.1.1 734 762 735 - '@babel/compat-data@7.28.0': {} 763 + '@babel/compat-data@7.28.5': {} 736 764 737 - '@babel/core@7.28.0': 765 + '@babel/core@7.28.5': 738 766 dependencies: 739 - '@ampproject/remapping': 2.3.0 740 767 '@babel/code-frame': 7.27.1 741 - '@babel/generator': 7.28.0 768 + '@babel/generator': 7.28.5 742 769 '@babel/helper-compilation-targets': 7.27.2 743 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) 744 - '@babel/helpers': 7.28.2 745 - '@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 746 773 '@babel/template': 7.27.2 747 - '@babel/traverse': 7.28.0 748 - '@babel/types': 7.28.2 774 + '@babel/traverse': 7.28.5 775 + '@babel/types': 7.28.5 776 + '@jridgewell/remapping': 2.3.5 749 777 convert-source-map: 2.0.0 750 - debug: 4.4.1 778 + debug: 4.4.3 751 779 gensync: 1.0.0-beta.2 752 780 json5: 2.2.3 753 781 semver: 6.3.1 754 782 transitivePeerDependencies: 755 783 - supports-color 756 784 757 - '@babel/generator@7.28.0': 785 + '@babel/generator@7.28.5': 758 786 dependencies: 759 - '@babel/parser': 7.28.0 760 - '@babel/types': 7.28.2 761 - '@jridgewell/gen-mapping': 0.3.12 762 - '@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 763 791 jsesc: 3.1.0 764 792 765 793 '@babel/helper-compilation-targets@7.27.2': 766 794 dependencies: 767 - '@babel/compat-data': 7.28.0 795 + '@babel/compat-data': 7.28.5 768 796 '@babel/helper-validator-option': 7.27.1 769 - browserslist: 4.25.1 797 + browserslist: 4.27.0 770 798 lru-cache: 5.1.1 771 799 semver: 6.3.1 772 800 ··· 774 802 775 803 '@babel/helper-module-imports@7.18.6': 776 804 dependencies: 777 - '@babel/types': 7.28.2 805 + '@babel/types': 7.28.5 778 806 779 807 '@babel/helper-module-imports@7.27.1': 780 808 dependencies: 781 - '@babel/traverse': 7.28.0 782 - '@babel/types': 7.28.2 809 + '@babel/traverse': 7.28.5 810 + '@babel/types': 7.28.5 783 811 transitivePeerDependencies: 784 812 - supports-color 785 813 786 - '@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)': 787 815 dependencies: 788 - '@babel/core': 7.28.0 816 + '@babel/core': 7.28.5 789 817 '@babel/helper-module-imports': 7.27.1 790 - '@babel/helper-validator-identifier': 7.27.1 791 - '@babel/traverse': 7.28.0 818 + '@babel/helper-validator-identifier': 7.28.5 819 + '@babel/traverse': 7.28.5 792 820 transitivePeerDependencies: 793 821 - supports-color 794 822 ··· 796 824 797 825 '@babel/helper-string-parser@7.27.1': {} 798 826 799 - '@babel/helper-validator-identifier@7.27.1': {} 827 + '@babel/helper-validator-identifier@7.28.5': {} 800 828 801 829 '@babel/helper-validator-option@7.27.1': {} 802 830 803 - '@babel/helpers@7.28.2': 831 + '@babel/helpers@7.28.4': 804 832 dependencies: 805 833 '@babel/template': 7.27.2 806 - '@babel/types': 7.28.2 834 + '@babel/types': 7.28.5 807 835 808 - '@babel/parser@7.28.0': 836 + '@babel/parser@7.28.5': 809 837 dependencies: 810 - '@babel/types': 7.28.2 838 + '@babel/types': 7.28.5 811 839 812 - '@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)': 813 841 dependencies: 814 - '@babel/core': 7.28.0 842 + '@babel/core': 7.28.5 815 843 '@babel/helper-plugin-utils': 7.27.1 816 844 817 845 '@babel/template@7.27.2': 818 846 dependencies: 819 847 '@babel/code-frame': 7.27.1 820 - '@babel/parser': 7.28.0 821 - '@babel/types': 7.28.2 848 + '@babel/parser': 7.28.5 849 + '@babel/types': 7.28.5 822 850 823 - '@babel/traverse@7.28.0': 851 + '@babel/traverse@7.28.5': 824 852 dependencies: 825 853 '@babel/code-frame': 7.27.1 826 - '@babel/generator': 7.28.0 854 + '@babel/generator': 7.28.5 827 855 '@babel/helper-globals': 7.28.0 828 - '@babel/parser': 7.28.0 856 + '@babel/parser': 7.28.5 829 857 '@babel/template': 7.27.2 830 - '@babel/types': 7.28.2 831 - debug: 4.4.1 858 + '@babel/types': 7.28.5 859 + debug: 4.4.3 832 860 transitivePeerDependencies: 833 861 - supports-color 834 862 835 - '@babel/types@7.28.2': 863 + '@babel/types@7.28.5': 836 864 dependencies: 837 865 '@babel/helper-string-parser': 7.27.1 838 - '@babel/helper-validator-identifier': 7.27.1 866 + '@babel/helper-validator-identifier': 7.28.5 839 867 840 - '@esbuild/aix-ppc64@0.25.8': 868 + '@esbuild/aix-ppc64@0.25.12': 841 869 optional: true 842 870 843 - '@esbuild/android-arm64@0.25.8': 871 + '@esbuild/android-arm64@0.25.12': 844 872 optional: true 845 873 846 - '@esbuild/android-arm@0.25.8': 874 + '@esbuild/android-arm@0.25.12': 847 875 optional: true 848 876 849 - '@esbuild/android-x64@0.25.8': 877 + '@esbuild/android-x64@0.25.12': 850 878 optional: true 851 879 852 - '@esbuild/darwin-arm64@0.25.8': 880 + '@esbuild/darwin-arm64@0.25.12': 853 881 optional: true 854 882 855 - '@esbuild/darwin-x64@0.25.8': 883 + '@esbuild/darwin-x64@0.25.12': 856 884 optional: true 857 885 858 - '@esbuild/freebsd-arm64@0.25.8': 886 + '@esbuild/freebsd-arm64@0.25.12': 859 887 optional: true 860 888 861 - '@esbuild/freebsd-x64@0.25.8': 889 + '@esbuild/freebsd-x64@0.25.12': 862 890 optional: true 863 891 864 - '@esbuild/linux-arm64@0.25.8': 892 + '@esbuild/linux-arm64@0.25.12': 865 893 optional: true 866 894 867 - '@esbuild/linux-arm@0.25.8': 895 + '@esbuild/linux-arm@0.25.12': 868 896 optional: true 869 897 870 - '@esbuild/linux-ia32@0.25.8': 898 + '@esbuild/linux-ia32@0.25.12': 871 899 optional: true 872 900 873 - '@esbuild/linux-loong64@0.25.8': 901 + '@esbuild/linux-loong64@0.25.12': 874 902 optional: true 875 903 876 - '@esbuild/linux-mips64el@0.25.8': 904 + '@esbuild/linux-mips64el@0.25.12': 877 905 optional: true 878 906 879 - '@esbuild/linux-ppc64@0.25.8': 907 + '@esbuild/linux-ppc64@0.25.12': 880 908 optional: true 881 909 882 - '@esbuild/linux-riscv64@0.25.8': 910 + '@esbuild/linux-riscv64@0.25.12': 883 911 optional: true 884 912 885 - '@esbuild/linux-s390x@0.25.8': 913 + '@esbuild/linux-s390x@0.25.12': 886 914 optional: true 887 915 888 - '@esbuild/linux-x64@0.25.8': 916 + '@esbuild/linux-x64@0.25.12': 889 917 optional: true 890 918 891 - '@esbuild/netbsd-arm64@0.25.8': 919 + '@esbuild/netbsd-arm64@0.25.12': 892 920 optional: true 893 921 894 - '@esbuild/netbsd-x64@0.25.8': 922 + '@esbuild/netbsd-x64@0.25.12': 895 923 optional: true 896 924 897 - '@esbuild/openbsd-arm64@0.25.8': 925 + '@esbuild/openbsd-arm64@0.25.12': 898 926 optional: true 899 927 900 - '@esbuild/openbsd-x64@0.25.8': 928 + '@esbuild/openbsd-x64@0.25.12': 901 929 optional: true 902 930 903 - '@esbuild/openharmony-arm64@0.25.8': 931 + '@esbuild/openharmony-arm64@0.25.12': 904 932 optional: true 905 933 906 - '@esbuild/sunos-x64@0.25.8': 934 + '@esbuild/sunos-x64@0.25.12': 907 935 optional: true 908 936 909 - '@esbuild/win32-arm64@0.25.8': 937 + '@esbuild/win32-arm64@0.25.12': 910 938 optional: true 911 939 912 - '@esbuild/win32-ia32@0.25.8': 940 + '@esbuild/win32-ia32@0.25.12': 913 941 optional: true 914 942 915 - '@esbuild/win32-x64@0.25.8': 943 + '@esbuild/win32-x64@0.25.12': 916 944 optional: true 917 945 918 - '@jridgewell/gen-mapping@0.3.12': 946 + '@jridgewell/gen-mapping@0.3.13': 947 + dependencies: 948 + '@jridgewell/sourcemap-codec': 1.5.5 949 + '@jridgewell/trace-mapping': 0.3.31 950 + 951 + '@jridgewell/remapping@2.3.5': 919 952 dependencies: 920 - '@jridgewell/sourcemap-codec': 1.5.4 921 - '@jridgewell/trace-mapping': 0.3.29 953 + '@jridgewell/gen-mapping': 0.3.13 954 + '@jridgewell/trace-mapping': 0.3.31 922 955 923 956 '@jridgewell/resolve-uri@3.1.2': {} 924 957 925 - '@jridgewell/sourcemap-codec@1.5.4': {} 958 + '@jridgewell/sourcemap-codec@1.5.5': {} 926 959 927 - '@jridgewell/trace-mapping@0.3.29': 960 + '@jridgewell/trace-mapping@0.3.31': 928 961 dependencies: 929 962 '@jridgewell/resolve-uri': 3.1.2 930 - '@jridgewell/sourcemap-codec': 1.5.4 963 + '@jridgewell/sourcemap-codec': 1.5.5 931 964 932 - '@rollup/rollup-android-arm-eabi@4.46.1': 965 + '@rollup/rollup-android-arm-eabi@4.53.0': 933 966 optional: true 934 967 935 - '@rollup/rollup-android-arm64@4.46.1': 968 + '@rollup/rollup-android-arm64@4.53.0': 936 969 optional: true 937 970 938 - '@rollup/rollup-darwin-arm64@4.46.1': 971 + '@rollup/rollup-darwin-arm64@4.53.0': 939 972 optional: true 940 973 941 - '@rollup/rollup-darwin-x64@4.46.1': 974 + '@rollup/rollup-darwin-x64@4.53.0': 942 975 optional: true 943 976 944 - '@rollup/rollup-freebsd-arm64@4.46.1': 977 + '@rollup/rollup-freebsd-arm64@4.53.0': 945 978 optional: true 946 979 947 - '@rollup/rollup-freebsd-x64@4.46.1': 980 + '@rollup/rollup-freebsd-x64@4.53.0': 948 981 optional: true 949 982 950 - '@rollup/rollup-linux-arm-gnueabihf@4.46.1': 983 + '@rollup/rollup-linux-arm-gnueabihf@4.53.0': 951 984 optional: true 952 985 953 - '@rollup/rollup-linux-arm-musleabihf@4.46.1': 986 + '@rollup/rollup-linux-arm-musleabihf@4.53.0': 954 987 optional: true 955 988 956 - '@rollup/rollup-linux-arm64-gnu@4.46.1': 989 + '@rollup/rollup-linux-arm64-gnu@4.53.0': 957 990 optional: true 958 991 959 - '@rollup/rollup-linux-arm64-musl@4.46.1': 992 + '@rollup/rollup-linux-arm64-musl@4.53.0': 960 993 optional: true 961 994 962 - '@rollup/rollup-linux-loongarch64-gnu@4.46.1': 995 + '@rollup/rollup-linux-loong64-gnu@4.53.0': 963 996 optional: true 964 997 965 - '@rollup/rollup-linux-ppc64-gnu@4.46.1': 998 + '@rollup/rollup-linux-ppc64-gnu@4.53.0': 966 999 optional: true 967 1000 968 - '@rollup/rollup-linux-riscv64-gnu@4.46.1': 1001 + '@rollup/rollup-linux-riscv64-gnu@4.53.0': 969 1002 optional: true 970 1003 971 - '@rollup/rollup-linux-riscv64-musl@4.46.1': 1004 + '@rollup/rollup-linux-riscv64-musl@4.53.0': 972 1005 optional: true 973 1006 974 - '@rollup/rollup-linux-s390x-gnu@4.46.1': 1007 + '@rollup/rollup-linux-s390x-gnu@4.53.0': 975 1008 optional: true 976 1009 977 - '@rollup/rollup-linux-x64-gnu@4.46.1': 1010 + '@rollup/rollup-linux-x64-gnu@4.53.0': 978 1011 optional: true 979 1012 980 - '@rollup/rollup-linux-x64-musl@4.46.1': 1013 + '@rollup/rollup-linux-x64-musl@4.53.0': 981 1014 optional: true 982 1015 983 - '@rollup/rollup-win32-arm64-msvc@4.46.1': 1016 + '@rollup/rollup-openharmony-arm64@4.53.0': 1017 + optional: true 1018 + 1019 + '@rollup/rollup-win32-arm64-msvc@4.53.0': 1020 + optional: true 1021 + 1022 + '@rollup/rollup-win32-ia32-msvc@4.53.0': 984 1023 optional: true 985 1024 986 - '@rollup/rollup-win32-ia32-msvc@4.46.1': 1025 + '@rollup/rollup-win32-x64-gnu@4.53.0': 987 1026 optional: true 988 1027 989 - '@rollup/rollup-win32-x64-msvc@4.46.1': 1028 + '@rollup/rollup-win32-x64-msvc@4.53.0': 990 1029 optional: true 991 1030 992 - '@tauri-apps/api@2.7.0': {} 1031 + '@tauri-apps/api@2.9.0': {} 993 1032 994 - '@tauri-apps/cli-darwin-arm64@2.7.1': 1033 + '@tauri-apps/cli-darwin-arm64@2.9.3': 995 1034 optional: true 996 1035 997 - '@tauri-apps/cli-darwin-x64@2.7.1': 1036 + '@tauri-apps/cli-darwin-x64@2.9.3': 998 1037 optional: true 999 1038 1000 - '@tauri-apps/cli-linux-arm-gnueabihf@2.7.1': 1039 + '@tauri-apps/cli-linux-arm-gnueabihf@2.9.3': 1001 1040 optional: true 1002 1041 1003 - '@tauri-apps/cli-linux-arm64-gnu@2.7.1': 1042 + '@tauri-apps/cli-linux-arm64-gnu@2.9.3': 1004 1043 optional: true 1005 1044 1006 - '@tauri-apps/cli-linux-arm64-musl@2.7.1': 1045 + '@tauri-apps/cli-linux-arm64-musl@2.9.3': 1007 1046 optional: true 1008 1047 1009 - '@tauri-apps/cli-linux-riscv64-gnu@2.7.1': 1048 + '@tauri-apps/cli-linux-riscv64-gnu@2.9.3': 1010 1049 optional: true 1011 1050 1012 - '@tauri-apps/cli-linux-x64-gnu@2.7.1': 1051 + '@tauri-apps/cli-linux-x64-gnu@2.9.3': 1013 1052 optional: true 1014 1053 1015 - '@tauri-apps/cli-linux-x64-musl@2.7.1': 1054 + '@tauri-apps/cli-linux-x64-musl@2.9.3': 1016 1055 optional: true 1017 1056 1018 - '@tauri-apps/cli-win32-arm64-msvc@2.7.1': 1057 + '@tauri-apps/cli-win32-arm64-msvc@2.9.3': 1019 1058 optional: true 1020 1059 1021 - '@tauri-apps/cli-win32-ia32-msvc@2.7.1': 1060 + '@tauri-apps/cli-win32-ia32-msvc@2.9.3': 1022 1061 optional: true 1023 1062 1024 - '@tauri-apps/cli-win32-x64-msvc@2.7.1': 1063 + '@tauri-apps/cli-win32-x64-msvc@2.9.3': 1025 1064 optional: true 1026 1065 1027 - '@tauri-apps/cli@2.7.1': 1066 + '@tauri-apps/cli@2.9.3': 1028 1067 optionalDependencies: 1029 - '@tauri-apps/cli-darwin-arm64': 2.7.1 1030 - '@tauri-apps/cli-darwin-x64': 2.7.1 1031 - '@tauri-apps/cli-linux-arm-gnueabihf': 2.7.1 1032 - '@tauri-apps/cli-linux-arm64-gnu': 2.7.1 1033 - '@tauri-apps/cli-linux-arm64-musl': 2.7.1 1034 - '@tauri-apps/cli-linux-riscv64-gnu': 2.7.1 1035 - '@tauri-apps/cli-linux-x64-gnu': 2.7.1 1036 - '@tauri-apps/cli-linux-x64-musl': 2.7.1 1037 - '@tauri-apps/cli-win32-arm64-msvc': 2.7.1 1038 - '@tauri-apps/cli-win32-ia32-msvc': 2.7.1 1039 - '@tauri-apps/cli-win32-x64-msvc': 2.7.1 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 1079 + 1080 + '@tauri-apps/plugin-clipboard-manager@2.3.2': 1081 + dependencies: 1082 + '@tauri-apps/api': 2.9.0 1083 + 1084 + '@tauri-apps/plugin-dialog@2.4.2': 1085 + dependencies: 1086 + '@tauri-apps/api': 2.9.0 1087 + 1088 + '@tauri-apps/plugin-opener@2.5.2': 1089 + dependencies: 1090 + '@tauri-apps/api': 2.9.0 1040 1091 1041 - '@tauri-apps/plugin-opener@2.4.0': 1092 + '@tauri-apps/plugin-os@2.3.2': 1042 1093 dependencies: 1043 - '@tauri-apps/api': 2.7.0 1094 + '@tauri-apps/api': 2.9.0 1044 1095 1045 1096 '@types/animejs@3.1.13': {} 1046 1097 1047 1098 '@types/babel__core@7.20.5': 1048 1099 dependencies: 1049 - '@babel/parser': 7.28.0 1050 - '@babel/types': 7.28.2 1100 + '@babel/parser': 7.28.5 1101 + '@babel/types': 7.28.5 1051 1102 '@types/babel__generator': 7.27.0 1052 1103 '@types/babel__template': 7.4.4 1053 - '@types/babel__traverse': 7.20.7 1104 + '@types/babel__traverse': 7.28.0 1054 1105 1055 1106 '@types/babel__generator@7.27.0': 1056 1107 dependencies: 1057 - '@babel/types': 7.28.2 1108 + '@babel/types': 7.28.5 1058 1109 1059 1110 '@types/babel__template@7.4.4': 1060 1111 dependencies: 1061 - '@babel/parser': 7.28.0 1062 - '@babel/types': 7.28.2 1112 + '@babel/parser': 7.28.5 1113 + '@babel/types': 7.28.5 1063 1114 1064 - '@types/babel__traverse@7.20.7': 1115 + '@types/babel__traverse@7.28.0': 1065 1116 dependencies: 1066 - '@babel/types': 7.28.2 1117 + '@babel/types': 7.28.5 1067 1118 1068 1119 '@types/estree@1.0.8': {} 1069 1120 1070 - animejs@4.1.2: {} 1121 + animejs@4.2.2: {} 1071 1122 1072 - 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): 1073 1124 dependencies: 1074 - '@babel/core': 7.28.0 1125 + '@babel/core': 7.28.5 1075 1126 '@babel/helper-module-imports': 7.18.6 1076 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) 1077 - '@babel/types': 7.28.2 1127 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) 1128 + '@babel/types': 7.28.5 1078 1129 html-entities: 2.3.3 1079 1130 parse5: 7.3.0 1080 - validate-html-nesting: 1.2.3 1081 1131 1082 - 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): 1083 1133 dependencies: 1084 - '@babel/core': 7.28.0 1085 - 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 1086 1138 1087 - browserslist@4.25.1: 1139 + baseline-browser-mapping@2.8.25: {} 1140 + 1141 + browserslist@4.27.0: 1088 1142 dependencies: 1089 - caniuse-lite: 1.0.30001731 1090 - electron-to-chromium: 1.5.192 1091 - node-releases: 2.0.19 1092 - 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) 1093 1148 1094 - caniuse-lite@1.0.30001731: {} 1149 + caniuse-lite@1.0.30001754: {} 1095 1150 1096 1151 convert-source-map@2.0.0: {} 1097 1152 1098 1153 csstype@3.1.3: {} 1099 1154 1100 - debug@4.4.1: 1155 + debug@4.4.3: 1101 1156 dependencies: 1102 1157 ms: 2.1.3 1103 1158 1104 - electron-to-chromium@1.5.192: {} 1159 + electron-to-chromium@1.5.248: {} 1105 1160 1106 1161 entities@6.0.1: {} 1107 1162 1108 - esbuild@0.25.8: 1163 + esbuild@0.25.12: 1109 1164 optionalDependencies: 1110 - '@esbuild/aix-ppc64': 0.25.8 1111 - '@esbuild/android-arm': 0.25.8 1112 - '@esbuild/android-arm64': 0.25.8 1113 - '@esbuild/android-x64': 0.25.8 1114 - '@esbuild/darwin-arm64': 0.25.8 1115 - '@esbuild/darwin-x64': 0.25.8 1116 - '@esbuild/freebsd-arm64': 0.25.8 1117 - '@esbuild/freebsd-x64': 0.25.8 1118 - '@esbuild/linux-arm': 0.25.8 1119 - '@esbuild/linux-arm64': 0.25.8 1120 - '@esbuild/linux-ia32': 0.25.8 1121 - '@esbuild/linux-loong64': 0.25.8 1122 - '@esbuild/linux-mips64el': 0.25.8 1123 - '@esbuild/linux-ppc64': 0.25.8 1124 - '@esbuild/linux-riscv64': 0.25.8 1125 - '@esbuild/linux-s390x': 0.25.8 1126 - '@esbuild/linux-x64': 0.25.8 1127 - '@esbuild/netbsd-arm64': 0.25.8 1128 - '@esbuild/netbsd-x64': 0.25.8 1129 - '@esbuild/openbsd-arm64': 0.25.8 1130 - '@esbuild/openbsd-x64': 0.25.8 1131 - '@esbuild/openharmony-arm64': 0.25.8 1132 - '@esbuild/sunos-x64': 0.25.8 1133 - '@esbuild/win32-arm64': 0.25.8 1134 - '@esbuild/win32-ia32': 0.25.8 1135 - '@esbuild/win32-x64': 0.25.8 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 1136 1191 1137 1192 escalade@3.2.0: {} 1138 1193 1139 - fdir@6.4.6(picomatch@4.0.3): 1194 + fdir@6.5.0(picomatch@4.0.3): 1140 1195 optionalDependencies: 1141 1196 picomatch: 4.0.3 1142 1197 ··· 1167 1222 1168 1223 nanoid@3.3.11: {} 1169 1224 1170 - node-releases@2.0.19: {} 1225 + node-releases@2.0.27: {} 1171 1226 1172 1227 parse5@7.3.0: 1173 1228 dependencies: ··· 1183 1238 picocolors: 1.1.1 1184 1239 source-map-js: 1.2.1 1185 1240 1186 - rollup@4.46.1: 1241 + rollup@4.53.0: 1187 1242 dependencies: 1188 1243 '@types/estree': 1.0.8 1189 1244 optionalDependencies: 1190 - '@rollup/rollup-android-arm-eabi': 4.46.1 1191 - '@rollup/rollup-android-arm64': 4.46.1 1192 - '@rollup/rollup-darwin-arm64': 4.46.1 1193 - '@rollup/rollup-darwin-x64': 4.46.1 1194 - '@rollup/rollup-freebsd-arm64': 4.46.1 1195 - '@rollup/rollup-freebsd-x64': 4.46.1 1196 - '@rollup/rollup-linux-arm-gnueabihf': 4.46.1 1197 - '@rollup/rollup-linux-arm-musleabihf': 4.46.1 1198 - '@rollup/rollup-linux-arm64-gnu': 4.46.1 1199 - '@rollup/rollup-linux-arm64-musl': 4.46.1 1200 - '@rollup/rollup-linux-loongarch64-gnu': 4.46.1 1201 - '@rollup/rollup-linux-ppc64-gnu': 4.46.1 1202 - '@rollup/rollup-linux-riscv64-gnu': 4.46.1 1203 - '@rollup/rollup-linux-riscv64-musl': 4.46.1 1204 - '@rollup/rollup-linux-s390x-gnu': 4.46.1 1205 - '@rollup/rollup-linux-x64-gnu': 4.46.1 1206 - '@rollup/rollup-linux-x64-musl': 4.46.1 1207 - '@rollup/rollup-win32-arm64-msvc': 4.46.1 1208 - '@rollup/rollup-win32-ia32-msvc': 4.46.1 1209 - '@rollup/rollup-win32-x64-msvc': 4.46.1 1245 + '@rollup/rollup-android-arm-eabi': 4.53.0 1246 + '@rollup/rollup-android-arm64': 4.53.0 1247 + '@rollup/rollup-darwin-arm64': 4.53.0 1248 + '@rollup/rollup-darwin-x64': 4.53.0 1249 + '@rollup/rollup-freebsd-arm64': 4.53.0 1250 + '@rollup/rollup-freebsd-x64': 4.53.0 1251 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.0 1252 + '@rollup/rollup-linux-arm-musleabihf': 4.53.0 1253 + '@rollup/rollup-linux-arm64-gnu': 4.53.0 1254 + '@rollup/rollup-linux-arm64-musl': 4.53.0 1255 + '@rollup/rollup-linux-loong64-gnu': 4.53.0 1256 + '@rollup/rollup-linux-ppc64-gnu': 4.53.0 1257 + '@rollup/rollup-linux-riscv64-gnu': 4.53.0 1258 + '@rollup/rollup-linux-riscv64-musl': 4.53.0 1259 + '@rollup/rollup-linux-s390x-gnu': 4.53.0 1260 + '@rollup/rollup-linux-x64-gnu': 4.53.0 1261 + '@rollup/rollup-linux-x64-musl': 4.53.0 1262 + '@rollup/rollup-openharmony-arm64': 4.53.0 1263 + '@rollup/rollup-win32-arm64-msvc': 4.53.0 1264 + '@rollup/rollup-win32-ia32-msvc': 4.53.0 1265 + '@rollup/rollup-win32-x64-gnu': 4.53.0 1266 + '@rollup/rollup-win32-x64-msvc': 4.53.0 1210 1267 fsevents: 2.3.3 1211 1268 1212 1269 semver@6.3.1: {} 1213 1270 1214 - seroval-plugins@1.3.2(seroval@1.3.2): 1271 + seroval-plugins@1.3.3(seroval@1.3.2): 1215 1272 dependencies: 1216 1273 seroval: 1.3.2 1217 1274 1218 1275 seroval@1.3.2: {} 1219 1276 1220 - solid-js@1.9.7: 1277 + solid-js@1.9.10: 1221 1278 dependencies: 1222 1279 csstype: 3.1.3 1223 1280 seroval: 1.3.2 1224 - seroval-plugins: 1.3.2(seroval@1.3.2) 1281 + seroval-plugins: 1.3.3(seroval@1.3.2) 1225 1282 1226 - solid-refresh@0.6.3(solid-js@1.9.7): 1283 + solid-refresh@0.6.3(solid-js@1.9.10): 1227 1284 dependencies: 1228 - '@babel/generator': 7.28.0 1285 + '@babel/generator': 7.28.5 1229 1286 '@babel/helper-module-imports': 7.27.1 1230 - '@babel/types': 7.28.2 1231 - solid-js: 1.9.7 1287 + '@babel/types': 7.28.5 1288 + solid-js: 1.9.10 1232 1289 transitivePeerDependencies: 1233 1290 - supports-color 1234 1291 1235 1292 source-map-js@1.2.1: {} 1236 1293 1237 - tinyglobby@0.2.14: 1294 + tinyglobby@0.2.15: 1238 1295 dependencies: 1239 - fdir: 6.4.6(picomatch@4.0.3) 1296 + fdir: 6.5.0(picomatch@4.0.3) 1240 1297 picomatch: 4.0.3 1241 1298 1242 1299 typescript@5.6.3: {} 1243 1300 1244 - update-browserslist-db@1.1.3(browserslist@4.25.1): 1301 + update-browserslist-db@1.1.4(browserslist@4.27.0): 1245 1302 dependencies: 1246 - browserslist: 4.25.1 1303 + browserslist: 4.27.0 1247 1304 escalade: 3.2.0 1248 1305 picocolors: 1.1.1 1249 1306 1250 - validate-html-nesting@1.2.3: {} 1251 - 1252 - vite-plugin-solid@2.11.8(solid-js@1.9.7)(vite@6.3.5): 1307 + vite-plugin-solid@2.11.10(solid-js@1.9.10)(vite@6.4.1): 1253 1308 dependencies: 1254 - '@babel/core': 7.28.0 1309 + '@babel/core': 7.28.5 1255 1310 '@types/babel__core': 7.20.5 1256 - 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) 1257 1312 merge-anything: 5.1.7 1258 - solid-js: 1.9.7 1259 - solid-refresh: 0.6.3(solid-js@1.9.7) 1260 - vite: 6.3.5 1261 - vitefu: 1.1.1(vite@6.3.5) 1313 + solid-js: 1.9.10 1314 + solid-refresh: 0.6.3(solid-js@1.9.10) 1315 + vite: 6.4.1 1316 + vitefu: 1.1.1(vite@6.4.1) 1262 1317 transitivePeerDependencies: 1263 1318 - supports-color 1264 1319 1265 - vite@6.3.5: 1320 + vite@6.4.1: 1266 1321 dependencies: 1267 - esbuild: 0.25.8 1268 - fdir: 6.4.6(picomatch@4.0.3) 1322 + esbuild: 0.25.12 1323 + fdir: 6.5.0(picomatch@4.0.3) 1269 1324 picomatch: 4.0.3 1270 1325 postcss: 8.5.6 1271 - rollup: 4.46.1 1272 - tinyglobby: 0.2.14 1326 + rollup: 4.53.0 1327 + tinyglobby: 0.2.15 1273 1328 optionalDependencies: 1274 1329 fsevents: 2.3.3 1275 1330 1276 - vitefu@1.1.1(vite@6.3.5): 1331 + vitefu@1.1.1(vite@6.4.1): 1277 1332 optionalDependencies: 1278 - vite: 6.3.5 1333 + vite: 6.4.1 1279 1334 1280 1335 yallist@3.1.1: {}
+1
pnpm-workspace.yaml
··· 1 1 onlyBuiltDependencies: 2 2 - esbuild 3 + - rollup
-1
public/assets/icons/arrow-right-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="#ffffff" d="M566.6 342.6C579.1 330.1 579.1 309.8 566.6 297.3L406.6 137.3C394.1 124.8 373.8 124.8 361.3 137.3C348.8 149.8 348.8 170.1 361.3 182.6L466.7 288L96 288C78.3 288 64 302.3 64 320C64 337.7 78.3 352 96 352L466.7 352L361.3 457.4C348.8 469.9 348.8 490.2 361.3 502.7C373.8 515.2 394.1 515.2 406.6 502.7L566.6 342.7z"/></svg>
+1
public/assets/icons/circle-info-solid-full.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path fill="#fff" d="M320 576C461.4 576 576 461.4 576 320C576 178.6 461.4 64 320 64C178.6 64 64 178.6 64 320C64 461.4 178.6 576 320 576zM288 224C288 206.3 302.3 192 320 192C337.7 192 352 206.3 352 224C352 241.7 337.7 256 320 256C302.3 256 288 241.7 288 224zM280 288L328 288C341.3 288 352 298.7 352 312L352 400L360 400C373.3 400 384 410.7 384 424C384 437.3 373.3 448 360 448L280 448C266.7 448 256 437.3 256 424C256 410.7 266.7 400 280 400L304 400L304 336L280 336C266.7 336 256 325.3 256 312C256 298.7 266.7 288 280 288z"/></svg>
+1
public/assets/icons/floppy-disk-solid-full.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path fill="#fff" d="M160 96C124.7 96 96 124.7 96 160L96 480C96 515.3 124.7 544 160 544L480 544C515.3 544 544 515.3 544 480L544 237.3C544 220.3 537.3 204 525.3 192L448 114.7C436 102.7 419.7 96 402.7 96L160 96zM192 192C192 174.3 206.3 160 224 160L384 160C401.7 160 416 174.3 416 192L416 256C416 273.7 401.7 288 384 288L224 288C206.3 288 192 273.7 192 256L192 192zM320 352C355.3 352 384 380.7 384 416C384 451.3 355.3 480 320 480C284.7 480 256 451.3 256 416C256 380.7 284.7 352 320 352z"/></svg>
+1
public/assets/icons/gear-solid-full.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.1.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/assets/icons/pen-to-square-regular-full.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path fill="#cfcfcf" d="M505 122.9L517.1 135C526.5 144.4 526.5 159.6 517.1 168.9L488 198.1L441.9 152L471 122.9C480.4 113.5 495.6 113.5 504.9 122.9zM273.8 320.2L408 185.9L454.1 232L319.8 366.2C316.9 369.1 313.3 371.2 309.4 372.3L250.9 389L267.6 330.5C268.7 326.6 270.8 323 273.7 320.1zM437.1 89L239.8 286.2C231.1 294.9 224.8 305.6 221.5 317.3L192.9 417.3C190.5 425.7 192.8 434.7 199 440.9C205.2 447.1 214.2 449.4 222.6 447L322.6 418.4C334.4 415 345.1 408.7 353.7 400.1L551 202.9C579.1 174.8 579.1 129.2 551 101.1L538.9 89C510.8 60.9 465.2 60.9 437.1 89zM152 128C103.4 128 64 167.4 64 216L64 488C64 536.6 103.4 576 152 576L424 576C472.6 576 512 536.6 512 488L512 376C512 362.7 501.3 352 488 352C474.7 352 464 362.7 464 376L464 488C464 510.1 446.1 528 424 528L152 528C129.9 528 112 510.1 112 488L112 216C112 193.9 129.9 176 152 176L264 176C277.3 176 288 165.3 288 152C288 138.7 277.3 128 264 128L152 128z"/></svg>
+1
public/assets/icons/plus-solid-full.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path fill="#cfcfcf" d="M352 128C352 110.3 337.7 96 320 96C302.3 96 288 110.3 288 128L288 288L128 288C110.3 288 96 302.3 96 320C96 337.7 110.3 352 128 352L288 352L288 512C288 529.7 302.3 544 320 544C337.7 544 352 529.7 352 512L352 352L512 352C529.7 352 544 337.7 544 320C544 302.3 529.7 288 512 288L352 288L352 128z"/></svg>
+1
public/assets/icons/trash-can-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="#ffffff" d="M232.7 69.9C237.1 56.8 249.3 48 263.1 48L377 48C390.8 48 403 56.8 407.4 69.9L416 96L512 96C529.7 96 544 110.3 544 128C544 145.7 529.7 160 512 160L128 160C110.3 160 96 145.7 96 128C96 110.3 110.3 96 128 96L224 96L232.7 69.9zM128 208L512 208L512 512C512 547.3 483.3 576 448 576L192 576C156.7 576 128 547.3 128 512L128 208zM216 272C202.7 272 192 282.7 192 296L192 488C192 501.3 202.7 512 216 512C229.3 512 240 501.3 240 488L240 296C240 282.7 229.3 272 216 272zM320 272C306.7 272 296 282.7 296 296L296 488C296 501.3 306.7 512 320 512C333.3 512 344 501.3 344 488L344 296C344 282.7 333.3 272 320 272zM424 272C410.7 272 400 282.7 400 296L400 488C400 501.3 410.7 512 424 512C437.3 512 448 501.3 448 488L448 296C448 282.7 437.3 272 424 272z"/></svg>
+1
public/assets/icons/xmark-solid-full.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path fill="#fff" d="M183.1 137.4C170.6 124.9 150.3 124.9 137.8 137.4C125.3 149.9 125.3 170.2 137.8 182.7L275.2 320L137.9 457.4C125.4 469.9 125.4 490.2 137.9 502.7C150.4 515.2 170.7 515.2 183.2 502.7L320.5 365.3L457.9 502.6C470.4 515.1 490.7 515.1 503.2 502.6C515.7 490.1 515.7 469.8 503.2 457.3L365.8 320L503.1 182.6C515.6 170.1 515.6 149.8 503.1 137.3C490.6 124.8 470.3 124.8 457.8 137.3L320.5 274.7L183.1 137.4z"/></svg>
+11 -57
src/App.css
··· 1 - @font-face { 1 + @font-face{ 2 2 font-family: Rubik; 3 - src: url('/assets/fonts/Rubik-VariableFont_wght.ttf'); 4 - } 5 - 6 - * { 7 - box-sizing: border-box; 3 + src: url("/assets/fonts/Rubik-VariableFont_wght.ttf"); 8 4 } 9 5 10 6 body{ 11 - background: linear-gradient(-45deg, 12 - #12141a 0%, #12141a 10%, 13 - #22262e 10%, #22262e 20%, 14 - #272e44 20%, #272e44 22%, 15 - #1f2129 22% 16 - ); 7 + background: #1f2129; 17 8 background-attachment: fixed; 18 9 color: #fff; 19 10 font-family: Rubik, 'Courier New'; 20 11 margin: 0; 21 12 } 22 13 23 - h1, h2, h3, h4, h5, h6, p{ 24 - margin: 0; 25 - } 26 - 27 - div[app-centre]{ 28 - position: fixed; 29 - top: 50%; 30 - left: 50%; 31 - transform: translate(-50%, -50%); 32 - text-align: center; 33 - } 34 - 35 - div[app-button]{ 36 - display: inline-block; 37 - background: #2a3452; 38 - padding: 10px 25px; 39 - cursor: pointer; 40 - user-select: none; 41 - border-radius: 5px; 42 - transition: 0.25s; 43 - min-width: 100px; 44 - text-align: center; 45 - } 46 - 47 - div[app-button]:hover{ 48 - background: #151a29; 49 - } 50 - 51 - div[app-button-minimal]{ 52 - display: inline-block; 53 - background: #424242; 54 - padding: 10px 25px; 55 - cursor: pointer; 56 - user-select: none; 57 - border-radius: 5px; 58 - transition: 0.25s; 59 - min-width: 100px; 60 - text-align: center; 61 - opacity: 0.5; 14 + * { 15 + box-sizing: border-box; 62 16 } 63 17 64 - div[app-button-minimal]:hover{ 65 - background: #525252; 18 + p, h1, h2, h3, h4, h5, h6{ 19 + margin: 0; 66 20 } 67 21 68 - div[app-col]{ 69 - display: flex; 70 - justify-content: center; 71 - align-items: center; 22 + canvas{ 23 + position: fixed; 24 + top: 0; 25 + left: 0; 72 26 }
+460 -3
src/App.tsx
··· 1 - import { onMount } from "solid-js"; 1 + import { createEffect, createSignal, onCleanup, onMount } from "solid-js"; 2 2 import "./App.css"; 3 + import { renderBackgroundGrid, renderContextMenu, renderNodes, renderNullTab, renderTempDrawing } from "./renderer"; 4 + import { lerp } from "./utils/lerp"; 5 + import { Node, NodeIO, NodeIOCanCast, NodeIOResolveAnyTypes } from "./structs/node"; 6 + import { isPointInRect, isPointInRectApplyOffset, screenToWorldSpace } from "./utils/interections"; 7 + import { ControlBar } from "./components/ControlBar"; 8 + import { CanvasContextMenu } from "./ContextMenu/Canvas"; 9 + import { NodeContextMenu } from "./ContextMenu/Node"; 10 + import { ContextMenu } from "./structs/ContextMenu"; 11 + import { NodeManager } from "./Mangers/NodeManager"; 12 + import { TabMenu } from "./components/TabMenu"; 13 + import { ConfirmationPopup } from "./components/ConfirmationPopup"; 14 + 15 + import * as keybinds from './keybinds'; 16 + import { listen } from "@tauri-apps/api/event"; 17 + 18 + // TODO: Only allow one node to input on non-flow inputs 3 19 4 20 let App = () => { 5 - onMount(() => { 21 + let [ selectedNodes, setSelectedNodes ] = createSignal<Node[]>([], { equals: false }); 22 + let [ mousePos, setMousePos ] = createSignal<[ number, number ]>([ 0, 0 ]); 23 + 24 + let canvas!: HTMLCanvasElement; 25 + let ctx: CanvasRenderingContext2D; 26 + 27 + let stopRender = false; 28 + 29 + let scale = 0.25; 30 + let targetScale = 1; 31 + 32 + let offset = [ 0, 0 ]; 33 + let offsetTarget = [ 0, 0 ]; 34 + 35 + let movingNode: Node | null = null; 36 + 37 + let isDrawing = false; 38 + let drawingFrom: NodeIO | null = null; 39 + let drawingTo: [ number, number ] = [ 0, 0 ]; 40 + 41 + let lockMovement = false; 42 + 43 + { 44 + let loadedScale = localStorage.getItem('scale'); 45 + if(loadedScale)targetScale = parseFloat(loadedScale); 46 + 47 + let loadedOffsetX = localStorage.getItem('offsetX'); 48 + if(loadedOffsetX)offsetTarget[0] = parseFloat(loadedOffsetX); 49 + 50 + let loadedOffsetY = localStorage.getItem('offsetY'); 51 + if(loadedOffsetY)offsetTarget[1] = parseFloat(loadedOffsetY); 52 + }; 53 + 54 + let screenMoved = false; 55 + 56 + let contextMenu: ContextMenu = { 57 + items: [], 58 + position: [ 0, 0 ], 59 + size: [ 0, 0 ], 60 + visible: false 61 + } 62 + 63 + createEffect(() => { 64 + let snodes = selectedNodes(); 65 + 66 + let anodes = NodeManager.Instance.GetNodes(); 67 + if(!anodes)return; 68 + 69 + for(let node of anodes)node.selected = false; 70 + for(let node of snodes)node.selected = true; 71 + }) 72 + 73 + onMount(async () => { 74 + NodeManager.Instance.HookTabChange(() => setSelectedNodes([])); 75 + 76 + ctx = canvas.getContext('2d')!; 77 + 78 + canvas.width = window.innerWidth; 79 + canvas.height = window.innerHeight; 80 + ctx.translate(canvas.width / 2, canvas.height / 2); 81 + 82 + window.onresize = () => { 83 + canvas.width = window.innerWidth; 84 + canvas.height = window.innerHeight; 85 + 86 + ctx.translate(canvas.width / 2, canvas.height / 2); 87 + } 88 + 89 + canvas.onwheel = ( e ) => { 90 + targetScale += e.deltaY * -(Math.sqrt(targetScale) * 0.001); 91 + 92 + if(targetScale < 0.25)targetScale = 0.25 93 + else if(targetScale > 5)targetScale = 5; 94 + 95 + screenMoved = true; 96 + } 97 + 98 + canvas.oncontextmenu = ( e ) => { 99 + e.preventDefault(); 100 + 101 + let clickedNode: Node | null = null 102 + let nodes = NodeManager.Instance.GetNodes(); 103 + 104 + if(nodes){ 105 + nodes.map(node => { 106 + if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 107 + e.clientX, e.clientY, 108 + node.x, node.y, node.w, node.h 109 + )){ 110 + clickedNode = node; 111 + return; 112 + } 113 + }) 114 + } 115 + 116 + if(clickedNode){ 117 + contextMenu.items = NodeContextMenu(clickedNode, selectedNodes, setSelectedNodes); 118 + } else{ 119 + contextMenu.items = CanvasContextMenu; 120 + } 121 + 122 + contextMenu.position = [ e.clientX - 10 - canvas.width / 2, e.clientY - 10 - canvas.height / 2 ]; 123 + contextMenu.visible = true; 124 + } 125 + 126 + let isShiftClick = false; 127 + canvas.onmousedown = ( e ) => { 128 + isShiftClick = e.shiftKey; 129 + 130 + if( 131 + e.clientY < 60 || 132 + e.clientX < 220 || 133 + lockMovement 134 + )return; 135 + 136 + if(e.button !== 0){ 137 + contextMenu.visible = false; 138 + return; 139 + } 140 + 141 + if(contextMenu.visible){ 142 + let submenus: ContextMenu[] = []; 143 + contextMenu.items.map(x => x.menu ? submenus.push(x.menu): null); 144 + 145 + submenus.map(x => { 146 + if(!x.visible)return; 147 + if(isPointInRect(canvas, e.clientX, e.clientY, 148 + x.position[0], x.position[1], 149 + x.size[0], x.size[1] 150 + )){ 151 + let item = x.items.filter(x => x.hovered)[0]; 152 + if(item && item.clicked)item.clicked(e, canvas, { x: offset[0], y: offset[1], scale }); 153 + } 154 + }); 155 + 156 + if(isPointInRect(canvas, e.clientX, e.clientY, 157 + contextMenu.position[0], contextMenu.position[1], 158 + contextMenu.size[0], contextMenu.size[1] 159 + )){ 160 + let item = contextMenu.items.filter(x => x.hovered)[0]; 161 + if(item && item.clicked)item.clicked(e, canvas, { x: offset[0], y: offset[1], scale }); 162 + } 163 + } 164 + 165 + contextMenu.visible = false; 166 + 167 + let clickedNode: any = null; 168 + isDrawing = false; 169 + 170 + let clickedInput: any = null; 171 + let nodes = NodeManager.Instance.GetNodes(); 172 + 173 + if(nodes){ 174 + nodes.map(node => { 175 + if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 176 + e.clientX, e.clientY, 177 + node.x - 20, node.y, node.w + 40, node.h 178 + )){ 179 + node.outputs.map(( output, i ) => { 180 + if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 181 + e.clientX, e.clientY, 182 + node.x + (node.w - 10), 183 + node.y + 50 + (30 * i), 184 + 20, 20 185 + )){ 186 + output.index = i; 187 + 188 + drawingTo = [ 189 + node.x + (node.w - 10), 190 + node.y + 50 + (30 * i) 191 + ]; 192 + drawingFrom = output; 193 + 194 + isDrawing = true; 195 + return; 196 + } 197 + }) 198 + 199 + node.inputs.map(( input, i ) => { 200 + if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 201 + e.clientX, e.clientY, 202 + node.x - 10, 203 + node.y + 50 + (30 * i), 204 + 20, 20 205 + )){ 206 + clickedInput = input; 207 + } 208 + }) 209 + 210 + clickedNode = node; 211 + return; 212 + } 213 + }) 214 + } 215 + 216 + if(clickedInput){ 217 + let partner = clickedInput.connections.pop(); 218 + if(!partner)return; 219 + 220 + partner.connections = partner.connections.filter(( x: any ) => x !== clickedInput); 221 + 222 + isDrawing = true; 223 + isMouseDown = true; 224 + 225 + drawingFrom = partner; 226 + drawingTo = screenToWorldSpace(canvas, { x: offset[0], y: offset[1], scale }, e.clientX - 10 * scale, e.clientY - 10 * scale) as [ number, number ];; 227 + 228 + return; 229 + } 230 + 231 + movingNode = clickedNode; 232 + 233 + isMouseDown = true; 234 + mouseStartPos = [ e.clientX, e.clientY ]; 235 + mouseMovePos = [ e.clientX, e.clientY ]; 236 + } 237 + 238 + canvas.onmousemove = ( e ) => { 239 + setMousePos([ e.clientX, e.clientY ]); 240 + 241 + if(e.shiftKey && isMouseDown){ 242 + let nodes = NodeManager.Instance.GetNodes(); 243 + let hoveredNode: Node | null = null; 244 + 245 + if(nodes){ 246 + nodes.map(node => { 247 + if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 248 + e.clientX, e.clientY, 249 + node.x - 20, node.y, node.w + 40, node.h 250 + )){ 251 + hoveredNode = node; 252 + return; 253 + } 254 + }) 255 + } 256 + 257 + if(hoveredNode !== null){ 258 + let snodes = selectedNodes(); 259 + if(!snodes.find(x => x.id === hoveredNode!.id)){ 260 + snodes.push(hoveredNode); 261 + 262 + // @ts-ignore 263 + hoveredNode.x = Math.round(hoveredNode.x / 10) * 10; 264 + // @ts-ignore 265 + hoveredNode.y = Math.round(hoveredNode.y / 10) * 10; 266 + 267 + setSelectedNodes(snodes); 268 + } 269 + } 270 + 271 + return; 272 + } else if(isShiftClick)return; 273 + 274 + if(isMouseDown){ 275 + if(isDrawing){ 276 + drawingTo = screenToWorldSpace(canvas, { x: offset[0], y: offset[1], scale }, e.clientX - 10 * scale, e.clientY - 10 * scale) as [ number, number ]; 277 + } else if(movingNode){ 278 + let nodes = selectedNodes(); 279 + 280 + for(let node of nodes){ 281 + node.x = node.x - (mouseMovePos[0] - e.clientX) / scale; 282 + node.y = node.y - (mouseMovePos[1] - e.clientY) / scale; 283 + } 284 + 285 + mouseMovePos = [ e.clientX, e.clientY ]; 286 + NodeManager.Instance.UpdateConfig(); 287 + } else{ 288 + offsetTarget = [ offsetTarget[0] - (mouseMovePos[0] - e.clientX) / scale, offsetTarget[1] - (mouseMovePos[1] - e.clientY) / scale ]; 289 + mouseMovePos = [ e.clientX, e.clientY ]; 290 + 291 + screenMoved = true; 292 + } 293 + } 294 + 295 + // TODO: Fix this shit lmao please 296 + if(contextMenu.visible){ 297 + let submenus: ContextMenu[] = []; 298 + contextMenu.items.map(x => x.menu ? submenus.push(x.menu): null); 299 + 300 + submenus.map(x => { 301 + if(!x.visible)return; 302 + if(isPointInRect(canvas, e.clientX, e.clientY, 303 + x.position[0], x.position[1], 304 + x.size[0], x.size[1] 305 + )){ 306 + x.items.map((y, i) => { 307 + y.hovered = isPointInRect(canvas, e.clientX, e.clientY, 308 + x.position[0], x.position[1] + 10 + 25 * i, 309 + x.size[0], 25 310 + ) 311 + }); 312 + } 313 + }); 314 + 315 + if(isPointInRect(canvas, e.clientX, e.clientY, 316 + contextMenu.position[0], contextMenu.position[1], 317 + contextMenu.size[0], contextMenu.size[1] 318 + )){ 319 + contextMenu.items.map((x, i) => { 320 + x.hovered = isPointInRect(canvas, e.clientX, e.clientY, 321 + contextMenu.position[0], contextMenu.position[1] + 10 + 25 * i, 322 + contextMenu.size[0], 25 323 + ) 324 + 325 + if(x.menu)x.menu.visible = x.hovered; 326 + }); 327 + } 328 + } 329 + } 330 + 331 + canvas.onmouseup = ( e ) => { 332 + let nodes = NodeManager.Instance.GetNodes(); 333 + let clickedNode; 334 + 335 + if(nodes){ 336 + nodes.map(node => { 337 + if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 338 + e.clientX, e.clientY, 339 + node.x - 20, node.y, node.w + 40, node.h 340 + )){ 341 + clickedNode = node; 342 + 343 + node.inputs.map(( input, i ) => { 344 + if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 345 + e.clientX, e.clientY, 346 + node.x - 10, 347 + node.y + 50 + (30 * i), 348 + 20, 20 349 + )){ 350 + if(isDrawing){ 351 + let fromType = NodeIOResolveAnyTypes(drawingFrom!); 352 + let toType = NodeIOResolveAnyTypes(input); 353 + 354 + if( 355 + drawingFrom!.connections.indexOf(input) === -1 && 356 + ( 357 + toType === null || 358 + NodeIOCanCast(fromType, toType) 359 + ) 360 + ){ 361 + drawingFrom!.connections.push(input); 362 + input.connections.push(drawingFrom!); 363 + 364 + NodeManager.Instance.UpdateConfig(); 365 + } 366 + } 367 + } 368 + }) 369 + } 370 + }) 371 + } 372 + 373 + let diffX = mouseStartPos[0] - e.clientX; 374 + let diffY = mouseStartPos[1] - e.clientY; 375 + 376 + let dist = Math.sqrt(diffX * diffX + diffY * diffY); 377 + 378 + if(dist < 10){ 379 + if(clickedNode){ 380 + if(e.shiftKey){ 381 + let snodes = selectedNodes(); 382 + if(snodes.indexOf(clickedNode) === -1)snodes.push(clickedNode); 383 + 384 + // @ts-ignore 385 + clickedNode.x = Math.round(clickedNode.x / 10) * 10; 386 + // @ts-ignore 387 + clickedNode.y = Math.round(clickedNode.y / 10) * 10; 388 + 389 + setSelectedNodes(snodes); 390 + } else{ 391 + // @ts-ignore 392 + clickedNode.x = Math.round(clickedNode.x / 10) * 10; 393 + // @ts-ignore 394 + clickedNode.y = Math.round(clickedNode.y / 10) * 10; 395 + 396 + setSelectedNodes([ clickedNode ]); 397 + } 398 + } else { 399 + setSelectedNodes([]); 400 + } 401 + } 402 + 403 + isDrawing = false; 404 + isMouseDown = false; 405 + } 406 + 407 + keybinds.load(canvas, mousePos, selectedNodes, setSelectedNodes); 408 + requestAnimationFrame(update); 409 + 410 + let unlisten_0 = await listen('hide-window', () => { 411 + stopRender = true; 412 + }) 413 + 414 + let unlisten_1 = await listen('show-window', () => { 415 + if(stopRender)window.location.reload(); 416 + }) 417 + 418 + onCleanup(() => { 419 + stopRender = true; 420 + window.clearInterval(interval); 6 421 422 + unlisten_0(); 423 + unlisten_1(); 424 + }); 7 425 }); 8 426 427 + let update = () => { 428 + if(stopRender)return; 429 + scale = lerp(scale, targetScale, 0.25); 430 + 431 + offset[0] = lerp(offset[0], offsetTarget[0], 0.5); 432 + offset[1] = lerp(offset[1], offsetTarget[1], 0.5); 433 + 434 + ctx.clearRect(canvas.width / -2, canvas.height / -2, canvas.width, canvas.height); 435 + 436 + let nodes = NodeManager.Instance.GetNodes(); 437 + 438 + renderBackgroundGrid(canvas, ctx, { x: offset[0], y: offset[1], scale }); 439 + 440 + if(nodes) 441 + renderNodes(canvas, ctx, nodes, { x: offset[0], y: offset[1], scale }); 442 + else 443 + renderNullTab(canvas, ctx); 444 + 445 + if(isDrawing)renderTempDrawing(canvas, ctx, drawingTo, drawingFrom!, { x: offset[0], y: offset[1], scale }); 446 + renderContextMenu(ctx, contextMenu); 447 + 448 + requestAnimationFrame(update); 449 + } 450 + 451 + let isMouseDown = false; 452 + let mouseStartPos = [ 0, 0 ]; 453 + let mouseMovePos = [ 0, 0 ]; 454 + 455 + let interval = setInterval(() => { 456 + if(screenMoved){ 457 + localStorage.setItem('scale', targetScale.toFixed(4)); 458 + localStorage.setItem('offsetX', offset[0].toFixed(4)); 459 + localStorage.setItem('offsetY', offset[1].toFixed(4)); 460 + } 461 + }, 1000); 462 + 9 463 return ( 10 464 <> 11 - 465 + <ConfirmationPopup /> 466 + <TabMenu /> 467 + <ControlBar node={selectedNodes} lockMovement={( lock ) => lockMovement = lock} /> 468 + <canvas ref={canvas}/> 12 469 </> 13 470 ); 14 471 }
+43
src/ContextMenu/Canvas.tsx
··· 1 + import { PositionInfo } from "../renderer"; 2 + import { Node } from "../structs/node"; 3 + import { screenToWorldSpace } from "../utils/interections"; 4 + import { NodeManager } from "../Mangers/NodeManager"; 5 + import { ContextMenuItem } from "../structs/ContextMenu"; 6 + import { Nodes } from "../Nodes/Nodes"; 7 + 8 + export let CanvasContextMenu: ContextMenuItem[] = Nodes.map(( node ) => { 9 + if(node.isSingle){ 10 + return { 11 + text: node.name, 12 + clicked: async ( e: MouseEvent, canvas: HTMLCanvasElement, position: PositionInfo ) => { 13 + let pos = screenToWorldSpace(canvas, position, e.clientX, e.clientY); 14 + let id = await NodeManager.Instance.GetNewNodeId(); 15 + 16 + NodeManager.Instance.AddNode(new Node(pos, node, id)); 17 + }, 18 + hovered: false 19 + } 20 + } else{ 21 + return { 22 + text: node.name, 23 + menu: { 24 + items: node.items!.map(x => { 25 + return { 26 + text: x.name, 27 + clicked: async ( e: MouseEvent, canvas: HTMLCanvasElement, position: PositionInfo ) => { 28 + let pos = screenToWorldSpace(canvas, position, e.clientX, e.clientY); 29 + let id = await NodeManager.Instance.GetNewNodeId(); 30 + 31 + NodeManager.Instance.AddNode(new Node(pos, x, id)); 32 + }, 33 + hovered: false 34 + } 35 + }), 36 + position: [ 0, 0 ], 37 + size: [ 0, 0 ], 38 + visible: true 39 + }, 40 + hovered: false 41 + } 42 + } 43 + });
+38
src/ContextMenu/Node.tsx
··· 1 + import { Accessor, Setter } from "solid-js"; 2 + import { NodeManager } from "../Mangers/NodeManager"; 3 + import { PositionInfo } from "../renderer"; 4 + import { Node } from "../structs/node"; 5 + 6 + export let NodeContextMenu = ( clickedNode: Node, selectedNode: Accessor<Node[]>, setSelectedNode: Setter<Node[]> ) => [ 7 + { 8 + text: "Delete Node", 9 + clicked: ( _e: MouseEvent, _canvas: HTMLCanvasElement, _position: PositionInfo ) => { 10 + clickedNode!.inputs.map(input => { 11 + input.connections.map(partner => { 12 + partner.connections = partner.connections.filter(x => x != input); 13 + }) 14 + }) 15 + 16 + clickedNode!.outputs.map(output => { 17 + output.connections.map(partner => { 18 + partner.connections = partner.connections.filter(x => x != output); 19 + }) 20 + }) 21 + 22 + let selected = selectedNode(); 23 + for (let i = 0; i < selected.length; i++) { 24 + let node = selected[i]; 25 + 26 + if(node.id === clickedNode.id){ 27 + selected.splice(i, 1); 28 + setSelectedNode(selected); 29 + 30 + break; 31 + } 32 + } 33 + 34 + NodeManager.Instance.RemoveNode(clickedNode!) 35 + }, 36 + hovered: false 37 + } 38 + ]
+47
src/Mangers/ConfirmationManager.tsx
··· 1 + import { Accessor, createSignal, Setter } from "solid-js"; 2 + 3 + export interface ConfirmationPopupButton{ 4 + text: string, 5 + callback: () => void 6 + } 7 + 8 + export class ConfirmationManager{ 9 + public static Instance: ConfirmationManager; 10 + 11 + private _setText: Setter<string>; 12 + public Text: Accessor<string>; 13 + 14 + private _setBody: Setter<string>; 15 + public Body: Accessor<string>; 16 + 17 + private _setButtons: Setter<ConfirmationPopupButton[]>; 18 + public Buttons: Accessor<ConfirmationPopupButton[]>; 19 + 20 + private _setShown: Setter<boolean>; 21 + public Shown: Accessor<boolean>; 22 + 23 + constructor(){ 24 + ConfirmationManager.Instance = this; 25 + 26 + [ this.Text, this._setText ] = createSignal(''); 27 + [ this.Body, this._setBody ] = createSignal(''); 28 + [ this.Buttons, this._setButtons ] = createSignal<ConfirmationPopupButton[]>([]); 29 + [ this.Shown, this._setShown ] = createSignal(false); 30 + } 31 + 32 + public ShowConfirmation( text: string, body: string, buttons: ConfirmationPopupButton[] ): boolean{ 33 + if(this.Shown())return false; 34 + 35 + this._setShown(true); 36 + 37 + this._setText(text); 38 + this._setBody(body); 39 + this._setButtons(buttons); 40 + 41 + return true; 42 + } 43 + 44 + public CancelConfirmation(){ 45 + this._setShown(false); 46 + } 47 + }
+423
src/Mangers/NodeManager.tsx
··· 1 + import { invoke } from "@tauri-apps/api/core"; 2 + import { Node } from "../structs/node"; 3 + import { Tab } from "../structs/Tab"; 4 + import { createSignal } from "solid-js"; 5 + import { listen } from "@tauri-apps/api/event"; 6 + import { getVersion } from "@tauri-apps/api/app"; 7 + import { NodesByID } from "../Nodes/Nodes"; 8 + import { save } from "@tauri-apps/plugin-dialog"; 9 + import { ConfirmationManager } from "./ConfirmationManager"; 10 + import { platform } from "@tauri-apps/plugin-os"; 11 + 12 + export interface TabHashMap { 13 + [details: string] : Tab; 14 + } 15 + 16 + export class NodeManager{ 17 + public static Instance: NodeManager; 18 + 19 + private _selectedTab: string | null = null; 20 + private _tabs: TabHashMap = {}; 21 + 22 + private _nodes: Node[] = []; 23 + 24 + constructor(){ 25 + NodeManager.Instance = this; 26 + 27 + setInterval(() => { 28 + let tabs = Object.values(this._tabs).filter(x => x.needSync); 29 + for(let tab of tabs){ 30 + invoke('sync_tab', { 31 + graph: this._generateTabGraph(tab.id)[0], 32 + id: tab.id, 33 + name: tab.name, 34 + location: tab.saveLocation, 35 + saveState: tab.needsSave() 36 + }); 37 + 38 + tab.needSync = false; 39 + } 40 + }, 1000); 41 + 42 + listen('load_new_tab', ( ev: any ) => { 43 + this._loadFromConfig(ev.payload.path, null, ev.payload.graph); 44 + }); 45 + 46 + invoke('load_previous_tabs').then(async ( tabs: any ) => { 47 + let version = await getVersion(); 48 + 49 + for(let tab of Object.entries<any>(tabs)){ 50 + let loaded_tab = await this._loadFromConfig(tab[1][2], tab[0], JSON.stringify({ 51 + tab_name: tab[1][1], 52 + version, 53 + graph: tab[1][0] 54 + })); 55 + 56 + if(loaded_tab) 57 + loaded_tab.setNeedsSave(tab[1][3]); 58 + }; 59 + 60 + this.UpdateConfig(); 61 + }); 62 + 63 + listen('prompt_to_close', async _ => { 64 + let tabs = Object.values(this._tabs); 65 + let tabsNeedingSaving = tabs.filter(x => x.needsSave()); 66 + 67 + for(let tab of tabsNeedingSaving){ 68 + await new Promise<void>(res => { 69 + ConfirmationManager.Instance.ShowConfirmation( 70 + `Discard Changes in ${tab.name}?`, 71 + 'If you close this tab without saving you will lose all changes.', 72 + [ 73 + { 74 + text: 'Save', 75 + callback: async () => { 76 + await this.SaveTab(tab); 77 + res(); 78 + } 79 + }, 80 + { 81 + text: 'Don\'t Save', 82 + callback: async () => { 83 + res(); 84 + } 85 + } 86 + ] 87 + ) 88 + }); 89 + } 90 + 91 + invoke('close_app'); 92 + }); 93 + } 94 + 95 + 96 + private _tabUpdateHook: ( tabs: TabHashMap ) => void = () => {}; 97 + private _tabChangeHook: () => void = () => {}; 98 + 99 + public CurrentTab(): Tab | null{ 100 + if(!this._selectedTab)return null 101 + return this._tabs[this._selectedTab] || null; 102 + } 103 + 104 + public async AddTab( name: string, id: string | null = null ): Promise<Tab>{ 105 + let [ selected, setSelected ] = createSignal(false); 106 + let [ needsSave, setNeedsSave ] = createSignal(false); 107 + 108 + let tab: Tab = { 109 + name: name, 110 + id: id || await NodeManager.Instance.GetNewNodeId(), 111 + nodes: [], 112 + saveLocation: null, 113 + 114 + selected, 115 + setSelected, 116 + 117 + needsSave, 118 + setNeedsSave, 119 + 120 + needSync: false 121 + }; 122 + 123 + this._tabs[tab.id] = tab; 124 + 125 + this.SelectTab(tab.id); 126 + this._tabUpdateHook(this._tabs); 127 + 128 + return tab; 129 + } 130 + 131 + public CloseTab( id: string ){ 132 + let tab = this._tabs[id]; 133 + 134 + let closeCB = () => { 135 + if(this._selectedTab === id){ 136 + let tabs = Object.values(this._tabs); 137 + 138 + if(tabs.length === 1){ 139 + this.SelectTab(null); 140 + } else{ 141 + let index = tabs.indexOf(tab); 142 + let nextTab = tabs[index + 1]; 143 + 144 + if(nextTab) 145 + this.SelectTab(nextTab.id); 146 + else 147 + this.SelectTab(tabs[0].id); 148 + } 149 + } 150 + 151 + invoke('discard_tab', { id: id }); 152 + 153 + delete this._tabs[id]; 154 + this._tabUpdateHook(this._tabs); 155 + } 156 + 157 + if(tab.needsSave()){ 158 + ConfirmationManager.Instance.ShowConfirmation( 159 + 'Discard Changes?', 160 + 'If you close this tab without saving you will lose all changes.', 161 + [ 162 + { 163 + text: 'Save', 164 + callback: async () => { 165 + await this.SaveTab(tab); 166 + closeCB(); 167 + } 168 + }, 169 + { 170 + text: 'Don\'t Save', 171 + callback: () => { 172 + closeCB(); 173 + } 174 + } 175 + ] 176 + ) 177 + } else{ 178 + closeCB(); 179 + } 180 + } 181 + 182 + public RenameTab( id: string, name: string ){ 183 + let tab = this._tabs[id]; 184 + if(!tab)return; 185 + 186 + tab.name = name; 187 + this._tabUpdateHook(this._tabs); 188 + } 189 + 190 + public SelectTab( id: string | null ){ 191 + if(this._selectedTab && this._tabs[this._selectedTab]){ 192 + let tab = this._tabs[this._selectedTab]; 193 + 194 + tab.setSelected(false); 195 + tab.nodes = this._nodes; 196 + } 197 + 198 + this._selectedTab = id; 199 + this._tabChangeHook(); 200 + 201 + if(this._selectedTab){ 202 + let tab = this._tabs[this._selectedTab]; 203 + if(!tab){ 204 + this._selectedTab = null; 205 + return this._nodes = []; 206 + } 207 + 208 + tab.setSelected(true); 209 + this._nodes = tab.nodes; 210 + } else{ 211 + this._nodes = []; 212 + } 213 + } 214 + 215 + public async SaveTab( tab: Tab, ignoreSaveLocation: boolean = false ){ 216 + let path = 217 + tab.saveLocation && !ignoreSaveLocation ? 218 + tab.saveLocation : 219 + await save({ defaultPath: tab.name + '.macro', filters: [ { name: 'Macro Files', extensions: [ 'macro' ] } ] }); 220 + 221 + if(!path)throw new Error("Cannot save"); 222 + 223 + tab.saveLocation = path; 224 + tab.setNeedsSave(false); 225 + 226 + this._saveConfigToDisk(path, tab.id); 227 + } 228 + 229 + public HookTabUpdate( cb: ( tabs: TabHashMap ) => void ){ 230 + this._tabUpdateHook = cb; 231 + } 232 + 233 + public HookTabChange( cb: () => void ){ 234 + this._tabChangeHook = cb; 235 + } 236 + 237 + 238 + public AddNode( node: Node ){ 239 + if(!this._selectedTab)return; 240 + 241 + this._nodes.push(node); 242 + this.UpdateConfig(); 243 + } 244 + 245 + public RemoveNode( node: Node ){ 246 + if(!this._selectedTab)return; 247 + 248 + this._nodes = this._nodes.filter(x => x !== node); 249 + this.UpdateConfig(); 250 + } 251 + 252 + public GetNodes(): Node[] | null{ 253 + if(this._selectedTab) 254 + return this._nodes; 255 + else 256 + return null; 257 + } 258 + 259 + public async GetNewNodeId(){ 260 + let encoder = new TextEncoder(); 261 + let data = encoder.encode(Date.now().toString() + Math.random().toString()); 262 + let hash = await window.crypto.subtle.digest("SHA-256", data); // Probably should get a better ID implementation 263 + 264 + return btoa(String.fromCharCode(...new Uint8Array(hash))); 265 + } 266 + 267 + 268 + public UpdateConfig( needsSave = true ){ 269 + if(!this._selectedTab)return; 270 + let tab = this._tabs[this._selectedTab]; 271 + if(!tab)return; 272 + 273 + tab.nodes = this._nodes; 274 + tab.needSync = true; 275 + 276 + if(needsSave)tab.setNeedsSave(true); 277 + } 278 + 279 + private async _loadFromConfig( path: string | null, id: string | null, config: string ){ 280 + let json = JSON.parse(config); 281 + 282 + if( 283 + !json.tab_name || 284 + !json.version || 285 + !json.graph 286 + )return; 287 + 288 + let tab = await this.AddTab(json.tab_name, id); 289 + tab.needSync = false; 290 + tab.saveLocation = path; 291 + 292 + this._nodes = []; 293 + 294 + let graph = json.graph; 295 + 296 + // Populate nodes 297 + for (let i = 0; i < graph.length; i++) { 298 + let node = graph[i]; 299 + 300 + let nod = new Node(node.pos, NodesByID[node.typeId], node.id); 301 + 302 + nod.statics = node.statics; 303 + await nod.onStaticsUpdate(nod); 304 + 305 + this._nodes.push(nod); 306 + } 307 + 308 + // Populate node inputs 309 + for (let i = 0; i < graph.length; i++) { 310 + let configNode = graph[i]; 311 + let outputParentNode = this._nodes[i]; 312 + 313 + for (let j = 0; j < configNode.outputs.length; j++) { 314 + let output = configNode.outputs[j]; 315 + 316 + for (let k = 0; k < output.connections.length; k++) { 317 + let input = output.connections[k]; 318 + let node = this._nodes.find(x => x.id === input.node)!; 319 + 320 + if(!node)continue; 321 + 322 + let realInput = node.inputs.find(x => x.index === input.index); 323 + let realOutput = outputParentNode.outputs[j]; 324 + 325 + if(realInput){ 326 + realInput.connections.push(realOutput); 327 + realOutput.connections.push(realInput); 328 + } else{ 329 + let realInput = { 330 + name: input.name, 331 + type: input.type, 332 + parent: node, 333 + connections: [ realOutput ], 334 + index: input.index 335 + }; 336 + 337 + node.inputs.push(realInput); 338 + realOutput.connections.push(realInput); 339 + } 340 + } 341 + } 342 + } 343 + 344 + tab.setNeedsSave(false); 345 + tab.nodes = this._nodes; 346 + 347 + tab.needSync = false; 348 + if(!id)this.UpdateConfig(false); 349 + 350 + return tab; 351 + } 352 + 353 + private _generateTabGraph( tabId: string | null ): [ any, Tab | null ]{ 354 + // Convert it into a structure we can actually save... 355 + 356 + if(!tabId)return [ null, null ]; 357 + let tab = this._tabs[tabId]; 358 + if(!tab)return [ null, null ]; 359 + 360 + let nodesToSave = []; 361 + 362 + for (let i = 0; i < tab.nodes.length; i++) { 363 + let node = tab.nodes[i]; 364 + 365 + let nodeOutputs = []; 366 + let nodeInputs = []; 367 + 368 + for (let j = 0; j < node.outputs.length; j++) { 369 + let output = node.outputs[j]; 370 + 371 + nodeOutputs.push({ 372 + name: output.name, 373 + type: output.type, 374 + connections: output.connections.map(x => { return { 375 + name: x.name, 376 + node: x.parent.id, 377 + index: x.index, 378 + type: x.type 379 + }}) 380 + }) 381 + } 382 + 383 + for (let j = 0; j < node.inputs.length; j++) { 384 + let input = node.inputs[j]; 385 + 386 + nodeInputs.push({ 387 + name: input.name, 388 + type: input.type, 389 + connections: input.connections.map(x => { return { 390 + name: x.name, 391 + node: x.parent.id, 392 + index: x.index, 393 + type: x.type 394 + }}) 395 + }) 396 + } 397 + 398 + nodesToSave.push({ 399 + name: node.name, 400 + id: node.id, 401 + typeId: node.typeId, 402 + pos: [ node.x, node.y ], 403 + outputs: nodeOutputs, 404 + inputs: nodeInputs, 405 + statics: node.statics 406 + }) 407 + } 408 + 409 + return [ nodesToSave, tab ]; 410 + } 411 + 412 + private async _saveConfigToDisk( path: string, tabId: string | null ){ 413 + let [ nodesToSave, tab ] = this._generateTabGraph(tabId); 414 + if(!tab)return; 415 + 416 + invoke('save_graph', { graph: JSON.stringify({ 417 + tab_name: tab.name, 418 + version: await getVersion(), 419 + platform: platform(), 420 + graph: nodesToSave 421 + }), path }); 422 + } 423 + }
+31
src/Nodes/Conditional/IfEqual.tsx
··· 1 + import { Node, NodeType } from "../../structs/node"; 2 + import { NodeDefinition } from "../Nodes"; 3 + 4 + export let NodeConditionalIfEqual: NodeDefinition = { 5 + os: 'any', 6 + 7 + isSingle: true, 8 + name: 'If Equal', 9 + typeId: 'ifequal', 10 + 11 + w: 220, 12 + 13 + statics: [{ 14 + type: NodeType.Label, 15 + name: 'If Equal', 16 + value: null 17 + }], 18 + 19 + inputs: [ 20 + { name: "Flow", type: NodeType.Flow }, 21 + { name: "Input 1", type: NodeType.AnyTypeA }, 22 + { name: "Input 2", type: NodeType.AnyTypeA }, 23 + ], 24 + 25 + outputs: [ 26 + { name: "Equal", type: NodeType.Flow }, 27 + { name: "Not Equal", type: NodeType.Flow }, 28 + ], 29 + 30 + onStaticsUpdate: async ( _node: Node ) => {} 31 + }
+30
src/Nodes/Conditional/IfFalse.tsx
··· 1 + import { Node, NodeType } from "../../structs/node"; 2 + import { NodeDefinition } from "../Nodes"; 3 + 4 + export let NodeConditionalIfFalse: NodeDefinition = { 5 + os: 'any', 6 + 7 + isSingle: true, 8 + name: 'If False', 9 + typeId: 'iffalse', 10 + 11 + w: 220, 12 + 13 + statics: [{ 14 + type: NodeType.Label, 15 + name: 'If False', 16 + value: null 17 + }], 18 + 19 + inputs: [ 20 + { name: "Flow", type: NodeType.Flow }, 21 + { name: "Input", type: NodeType.Boolean }, 22 + ], 23 + 24 + outputs: [ 25 + { name: "Is False", type: NodeType.Flow }, 26 + { name: "Not False", type: NodeType.Flow }, 27 + ], 28 + 29 + onStaticsUpdate: async ( _node: Node ) => {} 30 + }
+30
src/Nodes/Conditional/IfTrue.tsx
··· 1 + import { Node, NodeType } from "../../structs/node"; 2 + import { NodeDefinition } from "../Nodes"; 3 + 4 + export let NodeConditionalIfTrue: NodeDefinition = { 5 + os: 'any', 6 + 7 + isSingle: true, 8 + name: 'If True', 9 + typeId: 'iftrue', 10 + 11 + w: 220, 12 + 13 + statics: [{ 14 + type: NodeType.Label, 15 + name: 'If True', 16 + value: null 17 + }], 18 + 19 + inputs: [ 20 + { name: "Flow", type: NodeType.Flow }, 21 + { name: "Input", type: NodeType.Boolean }, 22 + ], 23 + 24 + outputs: [ 25 + { name: "Is True", type: NodeType.Flow }, 26 + { name: "Not True", type: NodeType.Flow }, 27 + ], 28 + 29 + onStaticsUpdate: async ( _node: Node ) => { } 30 + }
+17
src/Nodes/Conditional.tsx
··· 1 + import { NodeDefinition } from "./Nodes"; 2 + 3 + import { NodeConditionalIfEqual } from "./Conditional/IfEqual"; 4 + import { NodeConditionalIfTrue } from "./Conditional/IfTrue"; 5 + import { NodeConditionalIfFalse } from "./Conditional/IfFalse"; 6 + 7 + export let NodeConditional: NodeDefinition = { 8 + os: 'any', 9 + 10 + isSingle: false, 11 + name: 'Conditional', 12 + items: [ 13 + NodeConditionalIfEqual, 14 + NodeConditionalIfTrue, 15 + NodeConditionalIfFalse 16 + ] 17 + }
+33
src/Nodes/Debug.tsx
··· 1 + import { Node, NodeType } from "../structs/node"; 2 + import { NodeDefinition } from "./Nodes"; 3 + 4 + export let NodeDebug: NodeDefinition = { 5 + os: 'any', 6 + 7 + isSingle: true, 8 + name: 'Debug', 9 + typeId: 'debug', 10 + 11 + w: 200, 12 + 13 + statics: [ 14 + { 15 + name: "Debug", 16 + type: NodeType.Label, 17 + value: null 18 + } 19 + ], 20 + 21 + inputs: [ 22 + { 23 + name: "Flow", 24 + type: NodeType.Flow, 25 + }, 26 + { 27 + name: "Value", 28 + type: NodeType.AnyTypeA, 29 + } 30 + ], 31 + 32 + onStaticsUpdate: async ( _node: Node ) => {} 33 + };
+69
src/Nodes/Nodes.tsx
··· 1 + import { Node, NodeStatic, NodeType } from "../structs/node"; 2 + import { platform } from '@tauri-apps/plugin-os'; 3 + 4 + import { NodeConditional } from "./Conditional"; 5 + import { NodeDebug } from "./Debug"; 6 + import { NodeOSCActions } from "./OSCActions"; 7 + import { NodeOSCTrigger } from "./OSCTrigger"; 8 + import { NodePressKey } from "./PressKey"; 9 + import { NodeStatics } from "./Statics"; 10 + import { NodeShellCommand } from "./Shell"; 11 + 12 + export interface NodeDefinition{ 13 + os: string, 14 + isSingle: boolean, 15 + name: string, 16 + typeId?: string, 17 + onStaticsUpdate?: ( node: Node ) => Promise<void>, 18 + // build?: ( pos: [ number, number ], onStaticsUpdate: ( node: Node ) => void ) => Promise<Node>, 19 + w?: number, 20 + statics?: NodeStatic[], 21 + inputs?: { name: string, type: NodeType }[], 22 + outputs?: { name: string, type: NodeType }[], 23 + 24 + items?: NodeDefinition[] 25 + } 26 + 27 + export interface NodeDefinitionHashMap { 28 + [details: string] : NodeDefinition; 29 + } 30 + 31 + // TODO: (Node Additions) Pressing keyboard keys (like to do linux, but has extra steps) 32 + // TODO: (Node Additions) Getting media state from os 33 + // TODO: (Node Additions) Sending custom OSC messages 34 + // TODO: (Node Additions) Sending HTTP requests? 35 + // TODO: (Node Additions) Voicemeeter integrations (win only) 36 + // TODO: (Node Additions) Voicemod integrations (win only) 37 + // TODO: (Node Additions) Executing shell commands? (probably need some kinda popup warning when these are imported about dangerous usage) 38 + 39 + export let Nodes: NodeDefinition[] = []; 40 + let nodes = [ 41 + NodeOSCTrigger, 42 + NodeConditional, 43 + NodeStatics, 44 + NodeOSCActions, 45 + NodeDebug, 46 + NodePressKey, 47 + NodeShellCommand 48 + ] 49 + 50 + let os = platform(); 51 + 52 + for (let i = 0; i < nodes.length; i++) { 53 + let node = nodes[i]; 54 + if(node.os === 'any' || node.os === os)Nodes.push(node); 55 + } 56 + 57 + export let NodesByID: NodeDefinitionHashMap = {} 58 + 59 + Nodes.forEach(node => { 60 + if(node.isSingle){ 61 + NodesByID[node.typeId!] = node; 62 + } else{ 63 + node.items!.forEach(node => { 64 + NodesByID[node.typeId!] = node; 65 + }) 66 + } 67 + }) 68 + 69 + console.log(NodesByID);
+25
src/Nodes/OSCActions/Send Chatbox.tsx
··· 1 + import { Node, NodeType } from "../../structs/node"; 2 + import { NodeDefinition } from "../Nodes"; 3 + 4 + export let NodeOSCActionsSendChatbox: NodeDefinition = { 5 + os: 'any', 6 + 7 + isSingle: true, 8 + name: 'Send Chatbox', 9 + typeId: 'oscsendchatbox', 10 + 11 + w: 200, 12 + 13 + statics: [{ 14 + type: NodeType.Label, 15 + name: 'Send Chatbox', 16 + value: null 17 + }], 18 + 19 + inputs: [ 20 + { name: "Flow", type: NodeType.Flow }, 21 + { name: "Value", type: NodeType.String } 22 + ], 23 + 24 + onStaticsUpdate: async ( _node: Node ) => {} 25 + }
+12
src/Nodes/OSCActions.tsx
··· 1 + import { NodeDefinition } from "./Nodes"; 2 + import { NodeOSCActionsSendChatbox } from "./OSCActions/Send Chatbox"; 3 + 4 + export let NodeOSCActions: NodeDefinition = { 5 + os: 'any', 6 + 7 + isSingle: false, 8 + name: 'OSC Actions', 9 + items: [ 10 + NodeOSCActionsSendChatbox 11 + ] 12 + }
+106
src/Nodes/OSCTrigger.tsx
··· 1 + import { invoke } from "@tauri-apps/api/core"; 2 + import { Node, NodeType } from "../structs/node"; 3 + import { OSCMessage } from "../structs/OscMessage"; 4 + import { NodeManager } from "../Mangers/NodeManager"; 5 + import { NodeDefinition } from "./Nodes"; 6 + 7 + export let NodeOSCTrigger: NodeDefinition = { 8 + os: 'any', 9 + 10 + isSingle: true, 11 + name: 'OSC Trigger', 12 + typeId: 'osctrigger', 13 + 14 + w: 200, 15 + 16 + statics: [ 17 + { 18 + name: "OSC Trigger", 19 + type: NodeType.OSCAddress, 20 + value: null 21 + }, 22 + { 23 + name: "Parameter List", 24 + type: NodeType.ParameterList, 25 + value: [] 26 + } 27 + ], 28 + 29 + onStaticsUpdate: async ( node: Node ) => { 30 + let address = node.statics[0].value; 31 + let parameters = node.statics[1].value; 32 + 33 + if(address){ 34 + let addresses = await invoke<OSCMessage[]>('get_addresses'); 35 + let msgDat = addresses.find(x => x.address == address); 36 + 37 + if(msgDat){ 38 + parameters = msgDat.values.map(x => { return { type: x.key, desc: '' }}); 39 + node.statics[1].value = parameters; 40 + } 41 + } 42 + 43 + let tempOutputs = []; 44 + 45 + tempOutputs.push({ 46 + name: 'Flow', 47 + type: NodeType.Flow, 48 + connections: [], 49 + parent: node, 50 + index: 0 51 + }) 52 + 53 + parameters.forEach(( dat: any, indx: number ) => { 54 + let type: NodeType | null = null; 55 + 56 + switch(dat.type){ 57 + case 'Int': 58 + type = NodeType.Int; 59 + break; 60 + case 'Float': 61 + type = NodeType.Float; 62 + break; 63 + case 'String': 64 + type = NodeType.String; 65 + break; 66 + case 'Boolean': 67 + type = NodeType.Boolean; 68 + break; 69 + } 70 + 71 + if(type){ 72 + tempOutputs.push({ 73 + name: dat.desc === '' ? dat.type : dat.desc, 74 + type: type, 75 + connections: [], 76 + parent: node, 77 + index: indx + 1 78 + }) 79 + } 80 + }); 81 + 82 + let hasChanged = false; 83 + 84 + for(let i in tempOutputs){ 85 + if( 86 + node.outputs[i] === undefined || 87 + tempOutputs[i].type != node.outputs[i].type 88 + ){ 89 + hasChanged = true; 90 + } 91 + } 92 + 93 + if(hasChanged){ 94 + node.outputs.map(output => { 95 + output.connections.map(partner => { 96 + partner.connections = partner.connections.filter(x => x != output); 97 + }) 98 + }) 99 + 100 + node.outputs = tempOutputs; 101 + node.updateSize(); 102 + } 103 + 104 + NodeManager.Instance.UpdateConfig(); 105 + } 106 + };
+29
src/Nodes/PressKey.tsx
··· 1 + import { Node, NodeType } from "../structs/node"; 2 + import { NodeDefinition } from "./Nodes"; 3 + 4 + export let NodePressKey: NodeDefinition = { 5 + os: 'windows', 6 + 7 + isSingle: true, 8 + name: 'Press Key', 9 + typeId: 'presskey', 10 + 11 + w: 200, 12 + 13 + statics: [ 14 + { 15 + name: "Key", 16 + type: NodeType.String, 17 + value: "" 18 + } 19 + ], 20 + 21 + inputs: [ 22 + { 23 + name: "Flow", 24 + type: NodeType.Flow, 25 + } 26 + ], 27 + 28 + onStaticsUpdate: async ( _node: Node ) => {} 29 + };
+38
src/Nodes/Shell.tsx
··· 1 + import { Node, NodeType } from "../structs/node"; 2 + import { NodeDefinition } from "./Nodes"; 3 + 4 + export let NodeShellCommand: NodeDefinition = { 5 + os: 'any', 6 + 7 + isSingle: true, 8 + name: 'Shell Command', 9 + typeId: 'shellcommand', 10 + 11 + w: 200, 12 + 13 + statics: [], 14 + 15 + inputs: [ 16 + { 17 + name: "Flow", 18 + type: NodeType.Flow, 19 + }, 20 + { 21 + name: "Command", 22 + type: NodeType.String, 23 + }, 24 + ], 25 + 26 + outputs: [ 27 + { 28 + name: "Flow", 29 + type: NodeType.Flow, 30 + }, 31 + { 32 + name: "Output", 33 + type: NodeType.String, 34 + }, 35 + ], 36 + 37 + onStaticsUpdate: async ( _node: Node ) => {} 38 + };
+22
src/Nodes/Statics/Float.tsx
··· 1 + import { Node, NodeType } from "../../structs/node"; 2 + import { NodeDefinition } from "../Nodes"; 3 + 4 + export let NodeStaticsFloat: NodeDefinition = { 5 + os: 'any', 6 + 7 + isSingle: true, 8 + name: 'Float', 9 + typeId: 'staticfloat', 10 + 11 + w: 200, 12 + 13 + statics: [{ 14 + type: NodeType.Float, 15 + name: 'Value', 16 + value: 0.0 17 + }], 18 + 19 + outputs: [{ name: "Float", type: NodeType.Float }], 20 + 21 + onStaticsUpdate: async ( _node: Node ) => {} 22 + }
+22
src/Nodes/Statics/Int.tsx
··· 1 + import { Node, NodeType } from "../../structs/node"; 2 + import { NodeDefinition } from "../Nodes"; 3 + 4 + export let NodeStaticsInt: NodeDefinition = { 5 + os: 'any', 6 + 7 + isSingle: true, 8 + name: 'Int', 9 + typeId: 'staticint', 10 + 11 + w: 200, 12 + 13 + statics: [{ 14 + type: NodeType.Int, 15 + name: 'Value', 16 + value: 0 17 + }], 18 + 19 + outputs: [{ name: "Int", type: NodeType.Int }], 20 + 21 + onStaticsUpdate: async ( _node: Node ) => {} 22 + }
+22
src/Nodes/Statics/String.tsx
··· 1 + import { Node, NodeType } from "../../structs/node"; 2 + import { NodeDefinition } from "../Nodes"; 3 + 4 + export let NodeStaticsString: NodeDefinition = { 5 + os: 'any', 6 + 7 + isSingle: true, 8 + name: 'String', 9 + typeId: 'staticstring', 10 + 11 + w: 200, 12 + 13 + statics: [{ 14 + type: NodeType.String, 15 + name: 'Value', 16 + value: 'Hello World!' 17 + }], 18 + 19 + outputs: [{ name: "String", type: NodeType.String }], 20 + 21 + onStaticsUpdate: async ( _node: Node ) => {} 22 + }
+17
src/Nodes/Statics.tsx
··· 1 + import { NodeDefinition } from "./Nodes"; 2 + import { NodeStaticsFloat } from "./Statics/Float"; 3 + 4 + import { NodeStaticsInt } from "./Statics/Int"; 5 + import { NodeStaticsString } from "./Statics/String"; 6 + 7 + export let NodeStatics: NodeDefinition = { 8 + os: 'any', 9 + 10 + isSingle: false, 11 + name: 'Statics', 12 + items: [ 13 + NodeStaticsInt, 14 + NodeStaticsString, 15 + NodeStaticsFloat 16 + ] 17 + }
+42
src/components/ConfirmationPopup.css
··· 1 + .confirmation-blackout{ 2 + position: fixed; 3 + top: 0; 4 + left: 0; 5 + width: 100vw; 6 + height: 100vh; 7 + z-index: 150; 8 + background: #000A; 9 + } 10 + 11 + .confirmation-popup{ 12 + position: fixed; 13 + top: 50%; 14 + left: 50%; 15 + transform: translate(-50%, -50%); 16 + background: #272e44; 17 + border-radius: 20px; 18 + padding: 10px 20px; 19 + text-align: center; 20 + } 21 + 22 + .confirmation-buttons{ 23 + display: flex; 24 + margin-top: 30px; 25 + } 26 + 27 + .confirmation-button{ 28 + cursor: pointer; 29 + user-select: none; 30 + -webkit-user-select: none; 31 + 32 + width: 100%; 33 + padding: 2px 10px; 34 + border: 1px solid #fff; 35 + border-radius: 5px; 36 + transition: 0.1s; 37 + margin: 0 5px; 38 + } 39 + 40 + .confirmation-button:hover{ 41 + background: #fff2; 42 + }
+41
src/components/ConfirmationPopup.tsx
··· 1 + import { For, Show } from 'solid-js'; 2 + import './ConfirmationPopup.css'; 3 + import { ConfirmationManager } from '../Mangers/ConfirmationManager'; 4 + 5 + export let ConfirmationPopup = () => { 6 + return ( 7 + <> 8 + <Show when={ConfirmationManager.Instance.Shown()}> 9 + <div class="confirmation-blackout"> 10 + <div class="confirmation-popup"> 11 + <h2>{ConfirmationManager.Instance.Text()}</h2> 12 + <p>{ConfirmationManager.Instance.Body()}</p> 13 + 14 + <div class="confirmation-buttons"> 15 + <For each={ConfirmationManager.Instance.Buttons()}> 16 + { item => 17 + <div 18 + class="confirmation-button" 19 + onClick={() => { 20 + ConfirmationManager.Instance.CancelConfirmation(); 21 + item.callback(); 22 + }} 23 + > 24 + { item.text } 25 + </div> 26 + } 27 + </For> 28 + 29 + <div 30 + class="confirmation-button" 31 + onClick={() => ConfirmationManager.Instance.CancelConfirmation()} 32 + > 33 + Cancel 34 + </div> 35 + </div> 36 + </div> 37 + </div> 38 + </Show> 39 + </> 40 + ) 41 + }
+29
src/components/ControlBar.css
··· 1 + .control-bar{ 2 + position: fixed; 3 + top: 20px; 4 + left: 20px; 5 + height: 40px; 6 + z-index: 100; 7 + width: calc(100vw - 40px); 8 + background: #272e44; 9 + border-radius: 20px; 10 + display: flex; 11 + padding: 10px 20px; 12 + align-items: center; 13 + } 14 + 15 + .button{ 16 + padding: 5px 10px; 17 + margin: 0 10px; 18 + background: #445077; 19 + border-radius: 5px; 20 + transition: 0.1s; 21 + cursor: pointer; 22 + user-select: none; 23 + -webkit-user-select: none; 24 + width: fit-content; 25 + } 26 + 27 + .button:hover{ 28 + background: #363f5e; 29 + }
+133
src/components/ControlBar.tsx
··· 1 + import './ControlBar.css'; 2 + 3 + import { Accessor, createSignal, For, Match, Show, Switch } from 'solid-js'; 4 + import { Node, NodeType } from '../structs/node'; 5 + import { TextInput } from './TextInput'; 6 + import { invoke } from '@tauri-apps/api/core'; 7 + import { OSCMessage } from '../structs/OscMessage'; 8 + import { ParameterList } from './ParameterList'; 9 + import { NodeManager } from '../Mangers/NodeManager'; 10 + 11 + export interface ControlBarProps{ 12 + node: Accessor<Node[]>, 13 + lockMovement: ( lock: boolean ) => void 14 + } 15 + 16 + export let ControlBar = ( props: ControlBarProps ) => { 17 + return ( 18 + <div class="control-bar"> 19 + <For each={props.node()[0]?.statics}> 20 + { ( item ) => { 21 + let [ popupOpen, setPopupOpen ] = createSignal(false); 22 + 23 + return ( 24 + <div> 25 + <Switch> 26 + <Match when={item.type == NodeType.String}> 27 + { item.name } 28 + <div style={{ display: 'inline-block', 'margin-left': '10px' }}> 29 + <input 30 + type="text" 31 + placeholder='Enter Value...' 32 + value={item.value || ''} 33 + onChange={( el ) => { 34 + let value = el.target.value; 35 + let node = props.node()[0]!; 36 + 37 + item.value = value; 38 + node.onStaticsUpdate(node); 39 + 40 + NodeManager.Instance.UpdateConfig(); 41 + }} /> 42 + </div> 43 + </Match> 44 + <Match when={item.type == NodeType.Int}> 45 + { item.name } 46 + <div style={{ display: 'inline-block', 'margin-left': '10px' }}> 47 + <input 48 + type="number" 49 + placeholder='Enter Value...' 50 + value={item.value !== undefined ? item.value : ''} 51 + onChange={( el ) => { 52 + let value = el.target.value; 53 + let node = props.node()[0]!; 54 + 55 + item.value = parseInt(value); 56 + node.onStaticsUpdate(node); 57 + 58 + NodeManager.Instance.UpdateConfig(); 59 + }} /> 60 + </div> 61 + </Match> 62 + <Match when={item.type == NodeType.Float}> 63 + { item.name } 64 + <div style={{ display: 'inline-block', 'margin-left': '10px' }}> 65 + <input 66 + type="number" 67 + placeholder='Enter Value...' 68 + value={item.value !== undefined ? item.value : ''} 69 + onChange={( el ) => { 70 + let value = el.target.value; 71 + let node = props.node()[0]!; 72 + 73 + item.value = parseFloat(value); 74 + node.onStaticsUpdate(node); 75 + 76 + NodeManager.Instance.UpdateConfig(); 77 + }} /> 78 + </div> 79 + </Match> 80 + <Match when={item.type == NodeType.OSCAddress}> 81 + { item.name } 82 + <div style={{ display: 'inline-block', 'margin-left': '10px', width: '300px' }}> 83 + <TextInput 84 + placeholder='Enter OSC Address...' 85 + value={item.value || ''} 86 + requestSuggestions={async ( text: string ): Promise<string[]> => { 87 + let addresses = await invoke<OSCMessage[]>('get_addresses'); 88 + return addresses.map(x => x.address).filter(x => x.toLowerCase().includes(text.toLowerCase())); 89 + }} 90 + change={( text ) => { 91 + let node = props.node()[0]!; 92 + 93 + item.value = text; 94 + node.onStaticsUpdate(node); 95 + 96 + NodeManager.Instance.UpdateConfig(); 97 + }} /> 98 + </div> 99 + </Match> 100 + <Match when={item.type == NodeType.ParameterList}> 101 + <div class="button" onClick={() => { 102 + let popup = !popupOpen(); 103 + 104 + props.lockMovement(popup); 105 + setPopupOpen(popup); 106 + }}> 107 + { item.name } 108 + </div> 109 + <Show when={popupOpen()}> 110 + <ParameterList 111 + setPopupOpen={( open: boolean ) => { 112 + setPopupOpen(open); 113 + props.lockMovement(open); 114 + }} 115 + value={item.value} 116 + changed={( value ) => { 117 + let node = props.node()[0]!; 118 + 119 + item.value = value; 120 + node.onStaticsUpdate(node); 121 + 122 + NodeManager.Instance.UpdateConfig(); 123 + }} /> 124 + </Show> 125 + </Match> 126 + </Switch> 127 + </div> 128 + ) 129 + }} 130 + </For> 131 + </div> 132 + ) 133 + }
+85
src/components/ParameterList.css
··· 1 + .parameter-list{ 2 + position: fixed; 3 + z-index: 100; 4 + top: 0; 5 + left: 0; 6 + width: 100vw; 7 + height: 100vh; 8 + background: rgba(0, 0, 0, 0.75); 9 + } 10 + 11 + .parameter-list-inner{ 12 + position: fixed; 13 + top: 50%; 14 + left: 50%; 15 + transform: translate(-50%, -50%); 16 + padding: 10px; 17 + background: #373738; 18 + border-radius: 10px; 19 + width: 40%; 20 + height: 80%; 21 + } 22 + 23 + .parameter-list-close{ 24 + width: 25px; 25 + height: 43px; 26 + display: flex; 27 + justify-content: center; 28 + align-items: center; 29 + } 30 + 31 + .parameter-list-header{ 32 + width: 100%; 33 + height: 50px; 34 + } 35 + 36 + .parameter-list-content{ 37 + width: 100%; 38 + height: calc(100% - 50px); 39 + overflow-x: hidden; 40 + overflow-y: auto; 41 + } 42 + 43 + .parameter-list-button-dropdown{ 44 + position: fixed; 45 + padding: 5px 10px; 46 + margin: 0 10px; 47 + background: #445077; 48 + border-radius: 5px; 49 + transition: 0.1s; 50 + cursor: pointer; 51 + user-select: none; 52 + transform: translate(0, 5px); 53 + -webkit-user-select: none; 54 + } 55 + 56 + .parameter-list-button-dropdown > div{ 57 + transition: 0.1s; 58 + } 59 + 60 + .parameter-list-button-dropdown > div:hover{ 61 + color: #aaa; 62 + } 63 + 64 + .parameter-list-parameter{ 65 + display: inline-block; 66 + padding: 5px 10px; 67 + margin: 5px 0px 5px 10px; 68 + background: #445077; 69 + border-radius: 5px; 70 + transition: 0.1s; 71 + cursor: pointer; 72 + user-select: none; 73 + -webkit-user-select: none; 74 + } 75 + 76 + .parameter-list-parameter:hover{ 77 + background: #363f5e; 78 + } 79 + 80 + .parameter-list-parameter-delete{ 81 + padding: 0px 5px; 82 + display: flex; 83 + justify-content: center; 84 + align-items: center; 85 + }
+74
src/components/ParameterList.tsx
··· 1 + import { createSignal, For, Show } from 'solid-js'; 2 + import './ParameterList.css'; 3 + 4 + export interface ParameterListProps{ 5 + setPopupOpen: ( open: boolean ) => void 6 + value: { type: string, desc: string }[], 7 + changed: ( value: { type: string, desc: string }[] ) => void 8 + } 9 + 10 + export let ParameterList = ( props: ParameterListProps ) => { 11 + let [ parameters, setParameters ] = createSignal<{ type: string, desc: string }[]>(props.value, { equals: false }); 12 + let [ addParametersOpen, setAddParametersOpen ] = createSignal(false); 13 + 14 + return ( 15 + <div class="parameter-list"> 16 + <div class="parameter-list-inner"> 17 + <div class="parameter-list-header"> 18 + <h1 style={{ float: 'left' }}>Parameter List</h1> 19 + <div style={{ float: 'right' }} class="parameter-list-close"> 20 + <div style={{ background: 'red', width: '25px', height: '25px', cursor: 'pointer' }} onClick={() => props.setPopupOpen(false)}></div> 21 + </div> 22 + </div> 23 + <div class="parameter-list-content"> 24 + <For each={parameters()}> 25 + { ( i, index ) => <div style={{ display: 'flex' }}> 26 + <div class="parameter-list-parameter">{ i.desc === "" ? i.type : i.desc + ` ${i.type}` }</div> 27 + <div class="parameter-list-parameter parameter-list-parameter-delete" onClick={() => { 28 + let params = parameters(); 29 + params.splice(index(), 1); 30 + 31 + setParameters(params); 32 + props.changed(params); 33 + }}> 34 + <img src="/assets/icons/trash-can-solid-full.svg" width="20" /> 35 + </div> 36 + </div>} 37 + </For> 38 + <div class="button" onClick={() => { setAddParametersOpen(!addParametersOpen()) }}>Add Parameter + </div> 39 + <Show when={addParametersOpen()}> 40 + <div class="parameter-list-button-dropdown"> 41 + <div onClick={() => { 42 + setAddParametersOpen(false); 43 + 44 + let params = parameters(); 45 + params.push({ type: 'Float', desc: '' }); 46 + 47 + setParameters(params); 48 + props.changed(params); 49 + }}>Float Parameter</div> 50 + <div onClick={() => { 51 + setAddParametersOpen(false); 52 + 53 + let params = parameters(); 54 + params.push({ type: 'Int', desc: '' }); 55 + 56 + setParameters(params); 57 + props.changed(params); 58 + }}>Integer Parameter</div> 59 + <div onClick={() => { 60 + setAddParametersOpen(false); 61 + 62 + let params = parameters(); 63 + params.push({ type: 'Boolean', desc: '' }); 64 + 65 + setParameters(params); 66 + props.changed(params); 67 + }}>Boolean Parameter</div> 68 + </div> 69 + </Show> 70 + </div> 71 + </div> 72 + </div> 73 + ) 74 + }
+41
src/components/SettingsMenu.css
··· 1 + .settings-menu{ 2 + position: fixed; 3 + z-index: 110; 4 + top: 0; 5 + left: 0; 6 + width: 100vw; 7 + height: 100vh; 8 + background: rgba(0, 0, 0, 0.75); 9 + } 10 + 11 + .settings-menu-inner{ 12 + position: fixed; 13 + top: 50%; 14 + left: 50%; 15 + transform: translate(-50%, -50%); 16 + padding: 10px; 17 + background: #373738; 18 + border-radius: 10px; 19 + width: 40%; 20 + height: 80%; 21 + } 22 + 23 + .settings-menu-close{ 24 + width: 25px; 25 + height: 43px; 26 + display: flex; 27 + justify-content: center; 28 + align-items: center; 29 + } 30 + 31 + .settings-menu-header{ 32 + width: 100%; 33 + height: 50px; 34 + } 35 + 36 + .settings-menu-content{ 37 + width: 100%; 38 + height: calc(100% - 50px); 39 + overflow-x: hidden; 40 + overflow-y: auto; 41 + }
+35
src/components/SettingsMenu.tsx
··· 1 + import { invoke } from '@tauri-apps/api/core'; 2 + import './SettingsMenu.css'; 3 + 4 + export interface SettingsMenuProps{ 5 + close: () => void 6 + } 7 + 8 + export let SettingsMenu = ( props: SettingsMenuProps ) => { 9 + // TODO: Changable OSC Ports 10 + // TODO: Changable keybinds 11 + 12 + return ( 13 + <> 14 + <div class="settings-menu"> 15 + <div class="settings-menu-inner"> 16 + <div class="settings-menu-header"> 17 + <h1 style={{ float: 'left' }}>Options</h1> 18 + <div style={{ float: 'right' }} class="settings-menu-close"> 19 + <div style={{ background: 'red', width: '25px', height: '25px', cursor: 'pointer' }} onClick={() => props.close()}></div> 20 + </div> 21 + </div> 22 + 23 + <div class="settings-menu-content"> 24 + Hide editor on app start: 25 + <input 26 + ref={async ( el ) => el.checked = await invoke('get_hide_editor_on_app_start')} 27 + onChange={( el ) => invoke('set_hide_editor_on_app_start', { value: el.target.checked })} 28 + type="checkbox" 29 + style={{ width: '15px', height: '15px' }} /> 30 + </div> 31 + </div> 32 + </div> 33 + </> 34 + ) 35 + }
+127
src/components/TabMenu.css
··· 1 + .tab-menu{ 2 + position: fixed; 3 + top: 70px; 4 + left: 20px; 5 + width: 200px; 6 + z-index: 100; 7 + height: calc(100vh - 100px); 8 + background: #272e44; 9 + border-radius: 20px; 10 + padding: 5px; 11 + overflow-x: hidden; 12 + overflow-y: auto; 13 + } 14 + 15 + .tab-container{ 16 + height: calc(100% - 35px); 17 + overflow: auto; 18 + mask-image: linear-gradient(to bottom, #000 90%, #0000); 19 + padding-bottom: 25px; 20 + } 21 + 22 + .tab{ 23 + border-radius: 10px; 24 + padding: 8px 10px; 25 + background: #fff0; 26 + margin: 5px; 27 + font-size: 14px; 28 + transition: 0.5s; 29 + user-select: none; 30 + -webkit-user-select: none; 31 + display: flex; 32 + color: #cfcfcf; 33 + } 34 + 35 + .tab:hover{ 36 + background: #fff1; 37 + } 38 + 39 + .tab-selected{ 40 + border-radius: 10px; 41 + padding: 8px 10px; 42 + margin: 5px; 43 + font-size: 14px; 44 + transition: 0.5s; 45 + user-select: none; 46 + -webkit-user-select: none; 47 + display: flex; 48 + color: #cfcfcf; 49 + background: #fff4; 50 + } 51 + 52 + .tab-selected > .tab-close{ 53 + opacity: 1; 54 + } 55 + 56 + .tab:hover > .tab-close{ 57 + opacity: 1; 58 + } 59 + 60 + .tab-meta{ 61 + width: calc(100% - 40px); 62 + transform: translateY(1px); 63 + display: flex; 64 + align-items: center; 65 + } 66 + 67 + .tab-meta-input{ 68 + color: #cfcfcf; 69 + font-size: 14px; 70 + width: 120px; 71 + background: none; 72 + outline: none; 73 + border: none; 74 + transform: translateY(-1px); 75 + } 76 + 77 + .tab-close{ 78 + opacity: 0; 79 + width: 20px; 80 + height: 20px; 81 + display: flex; 82 + align-items: center; 83 + justify-content: center; 84 + border-radius: 5px; 85 + } 86 + 87 + .tab-close:hover{ 88 + background: #fff3; 89 + } 90 + 91 + .tab-icon{ 92 + width: 20px; 93 + height: 20px; 94 + display: flex; 95 + align-items: center; 96 + justify-content: left; 97 + } 98 + 99 + .tab-new-dropdown{ 100 + position: absolute; 101 + width: 180px; 102 + transform: translate(-10px, 35px); 103 + border-radius: 10px; 104 + background: #fff1; 105 + } 106 + 107 + .tab-icon-bar{ 108 + height: 30px; 109 + margin: 0 5px; 110 + display: flex; 111 + justify-content: left; 112 + align-items: center; 113 + } 114 + 115 + .tab-icon-bar img{ 116 + padding: 3px; 117 + border-radius: 5px; 118 + transition: 0.1s; 119 + background: transparent; 120 + cursor: pointer; 121 + user-select: none; 122 + -webkit-user-select: none; 123 + } 124 + 125 + .tab-icon-bar img:hover{ 126 + background: #fff2; 127 + }
+96
src/components/TabMenu.tsx
··· 1 + import './TabMenu.css'; 2 + 3 + import { createSignal, For, onMount, Show } from 'solid-js'; 4 + import { NodeManager } from '../Mangers/NodeManager'; 5 + import { Tab } from '../structs/Tab'; 6 + import { SettingsMenu } from './SettingsMenu'; 7 + import { openUrl } from '@tauri-apps/plugin-opener'; 8 + 9 + export let TabMenu = () => { 10 + let [ tabImportOpen, setTabImportOpen ] = createSignal(false); 11 + let [ tabs, setTabs ] = createSignal<Tab[]>([], { equals: false }); 12 + 13 + let [ settingsOpen, setSettingsOpen ] = createSignal(false); 14 + 15 + let closeTabImportMenu = () => { 16 + window.removeEventListener('click', closeTabImportMenu); 17 + setTabImportOpen(false); 18 + } 19 + 20 + onMount(() => { 21 + NodeManager.Instance.HookTabUpdate(setTabs); 22 + }); 23 + 24 + return ( 25 + <> 26 + <Show when={settingsOpen()}> 27 + <SettingsMenu close={() => setSettingsOpen(false)} /> 28 + </Show> 29 + 30 + <div class="tab-menu"> 31 + <div class="tab-container"> 32 + <For each={Object.values(tabs())}> 33 + { 34 + tab => 35 + <div class={ tab.selected() ? 'tab-selected ' : 'tab' } onClick={() => { 36 + NodeManager.Instance.SelectTab(tab.id); 37 + }}> 38 + <div class="tab-icon" onClick={async () => { 39 + if(tab.selected()){ 40 + NodeManager.Instance.SaveTab(tab); 41 + } 42 + }}> 43 + <Show when={tab.selected() && tab.needsSave()} fallback={ 44 + <img src="/assets/icons/pen-to-square-regular-full.svg" width="15" /> 45 + }> 46 + <img src="/assets/icons/floppy-disk-solid-full.svg" width="15" /> 47 + </Show> 48 + 49 + </div> 50 + <div class="tab-meta" onDblClick={( e ) => { 51 + let input = <input class="tab-meta-input" value={ e.target.innerHTML } /> as HTMLInputElement; 52 + 53 + e.target.innerHTML = ''; 54 + e.target.appendChild(input); 55 + 56 + input.select(); 57 + input.onchange = () => { 58 + NodeManager.Instance.RenameTab(tab.id, input.value); 59 + e.target.innerHTML = input.value; 60 + } 61 + }}>{ tab.name }</div> 62 + <div class="tab-close" onClick={() => { 63 + setTimeout(() => { 64 + NodeManager.Instance.CloseTab(tab.id); 65 + }, 50) 66 + }}><img src="/assets/icons/xmark-solid-full.svg" width="12" /></div> 67 + </div> 68 + } 69 + </For> 70 + 71 + <div class="tab" onClick={() => { 72 + NodeManager.Instance.AddTab("Untitled"); 73 + }} onContextMenu={( e ) => { 74 + e.preventDefault(); 75 + setTabImportOpen(true); 76 + 77 + window.addEventListener('click', closeTabImportMenu); 78 + }}> 79 + <div class="tab-new-dropdown" style={{ display: tabImportOpen() ? 'block' : 'none' }}> 80 + <div class="tab">Import from file</div> 81 + <div class="tab">Import from URL</div> 82 + </div> 83 + <div class="tab-icon"><img src="/assets/icons/plus-solid-full.svg" width="15" /></div> 84 + <div class="tab-meta">New Tab</div> 85 + </div> 86 + </div> 87 + 88 + <div class="tab-icon-bar"> 89 + <img src="/assets/icons/gear-solid-full.svg" width="25" onClick={() => setSettingsOpen(true)} /> 90 + <div style={{ width: 'calc(100% - 50px)' }}></div> 91 + <img src="/assets/icons/circle-info-solid-full.svg" width="25" onClick={() => openUrl('https://github.com/phaze-the-dumb/VRCMacros/wiki')} /> 92 + </div> 93 + </div> 94 + </> 95 + ) 96 + }
+49
src/components/TextInput.css
··· 1 + input[type="text"]{ 2 + outline: none; 3 + background: none; 4 + border: none; 5 + border-bottom: 2px solid #525252; 6 + font-size: 15px; 7 + font-family: Rubik, 'Courier New'; 8 + color: #fff; 9 + width: 400px; 10 + } 11 + 12 + input[type="number"]{ 13 + outline: none; 14 + background: none; 15 + border: none; 16 + border-bottom: 2px solid #525252; 17 + font-size: 15px; 18 + font-family: Rubik, 'Courier New'; 19 + color: #fff; 20 + width: 400px; 21 + } 22 + 23 + div[input-dropdown]{ 24 + position: absolute; 25 + width: fit-content; 26 + 27 + margin-top: 5px; 28 + padding: 10px; 29 + float: left; 30 + border-radius: 5px; 31 + 32 + max-height: 300px; 33 + overflow-y: auto; 34 + 35 + background: #525252; 36 + z-index: 50; 37 + } 38 + 39 + div[input-dropdown] > div{ 40 + transition: 0.25s; 41 + } 42 + 43 + div[input-dropdown] > div:hover{ 44 + color: #aaa; 45 + } 46 + 47 + .suggestion-selected{ 48 + color: #aaa; 49 + }
+110
src/components/TextInput.tsx
··· 1 + import './TextInput.css'; 2 + 3 + import { createSignal, For, Show } from "solid-js" 4 + 5 + export interface TextInputProps{ 6 + placeholder: string, 7 + value?: string, 8 + requestSuggestions?: ( text: string ) => Promise<string[]>, 9 + change?: ( text: string ) => void 10 + } 11 + 12 + export let TextInput = ( props: TextInputProps ) => { 13 + let [ suggestionsOpen, setSuggestionsOpen ] = createSignal(false); 14 + let [ suggestions, setSuggestions ] = createSignal<string[]>([]) 15 + 16 + let input!: HTMLInputElement; 17 + 18 + let suggestionsContainer!: HTMLDivElement; 19 + let suggestionsIndex = 0; 20 + 21 + let onInput = async () => { 22 + let s = null; 23 + 24 + if(props.requestSuggestions){ 25 + s = await props.requestSuggestions(input.value); 26 + 27 + if(s != suggestions()){ 28 + setSuggestions(s); 29 + 30 + let open = s !== null && s.length > 0 && input.value.length > 0; 31 + 32 + setSuggestionsOpen(open); 33 + if(open)changeSelection(() => { suggestionsIndex = 0; }); 34 + } 35 + } 36 + } 37 + 38 + let onKeyDown = ( ev: KeyboardEvent ) => { 39 + switch(ev.key){ 40 + case 'ArrowDown': 41 + changeSelection(() => { 42 + suggestionsIndex++; 43 + if(suggestionsIndex >= suggestionsContainer.children.length)suggestionsIndex = suggestionsContainer.children.length - 1; 44 + }); 45 + break; 46 + case 'ArrowUp': 47 + changeSelection(() => { 48 + suggestionsIndex--; 49 + if(suggestionsIndex < 0)suggestionsIndex = 0; 50 + }); 51 + break; 52 + case 'Enter': 53 + let currentDiv = suggestionsContainer.children[suggestionsIndex]; 54 + if(currentDiv)input.value = currentDiv.innerHTML; 55 + 56 + props.change ? props.change(input.value) : null 57 + setSuggestionsOpen(false); 58 + break; 59 + } 60 + } 61 + 62 + let changeSelection = ( cb: () => void ) => { 63 + for(let child of suggestionsContainer.children) 64 + child.classList.remove('suggestion-selected'); 65 + 66 + cb(); 67 + 68 + let height = suggestionsIndex * 19; 69 + suggestionsContainer.scrollTo(0, height - 150); 70 + 71 + let currentDiv = suggestionsContainer.children[suggestionsIndex]; 72 + if(currentDiv)currentDiv.classList.add('suggestion-selected'); 73 + } 74 + 75 + return ( 76 + <> 77 + <div style={{ width: '100%' }}> 78 + <input 79 + style={{ width: '100%' }} 80 + type="text" 81 + placeholder={ props.placeholder } 82 + value={ props.value || "" } 83 + onChange={() => props.change ? props.change(input.value) : null} 84 + onInput={onInput} 85 + onKeyDown={onKeyDown} 86 + onFocusOut={() => setTimeout(() => { 87 + setSuggestionsOpen(false); 88 + suggestionsIndex = -1; 89 + }, 100)} 90 + ref={input} /> 91 + 92 + <Show when={suggestionsOpen()}> 93 + <div input-dropdown ref={suggestionsContainer}> 94 + <For each={suggestions()}> 95 + { item => <div onClick={( el ) => { 96 + let thisEl = el.target; 97 + 98 + input.value = thisEl.innerHTML; 99 + setSuggestionsOpen(false); 100 + 101 + props.change ? props.change(input.value) : null 102 + suggestionsIndex = -1; 103 + }}>{ item }</div> } 104 + </For> 105 + </div> 106 + </Show> 107 + </div> 108 + </> 109 + ) 110 + }
+7 -1
src/index.tsx
··· 2 2 import { render } from "solid-js/web"; 3 3 import App from "./App"; 4 4 5 - render(() => <App />, document.getElementById("root") as HTMLElement); 5 + import { NodeManager } from "./Mangers/NodeManager"; 6 + import { ConfirmationManager } from "./Mangers/ConfirmationManager"; 7 + 8 + new NodeManager(); 9 + new ConfirmationManager(); 10 + 11 + render(() => <App />, document.getElementById("root") as HTMLElement);
+94
src/keybinds.ts
··· 1 + import { Accessor, Setter } from "solid-js"; 2 + import { NodeManager } from "./Mangers/NodeManager"; 3 + import { Node } from "./structs/node"; 4 + import { readText, writeText } from "@tauri-apps/plugin-clipboard-manager"; 5 + import { decodeNodeList, encodeNodeList } from "./utils/clipboard"; 6 + 7 + let isKeyDown: any = {}; 8 + 9 + export let load = ( canvas: HTMLCanvasElement, mousePos: Accessor<[ number, number ]>, selectedNode: Accessor<Node[]>, setSelectedNode: Setter<Node[]> ) => { 10 + // TODO: Add undo / redo -ing 11 + 12 + canvas.onkeydown = async ( e ) => { 13 + switch(e.key){ 14 + case 'Delete': 15 + let nodes = selectedNode(); 16 + for(let node of nodes){ 17 + node.inputs.map(input => { 18 + input.connections.map(partner => { 19 + partner.connections = partner.connections.filter(x => x != input); 20 + }) 21 + }) 22 + 23 + node.outputs.map(output => { 24 + output.connections.map(partner => { 25 + partner.connections = partner.connections.filter(x => x != output); 26 + }) 27 + }) 28 + 29 + NodeManager.Instance.RemoveNode(node); 30 + } 31 + 32 + setSelectedNode([]); 33 + break; 34 + } 35 + } 36 + 37 + window.onkeydown = async ( e ) => { 38 + isKeyDown[e.key] = true; 39 + 40 + switch(e.key){ 41 + case 's': 42 + if(e.ctrlKey){ 43 + let currentTab = NodeManager.Instance.CurrentTab(); 44 + if(!currentTab)return; 45 + 46 + // Save 47 + NodeManager.Instance.SaveTab(currentTab); 48 + } 49 + break; 50 + case 'S': 51 + if(e.ctrlKey){ 52 + let currentTab = NodeManager.Instance.CurrentTab(); 53 + if(!currentTab)return; 54 + 55 + // Save 56 + NodeManager.Instance.SaveTab(currentTab, true); 57 + } 58 + break; 59 + case 'c': 60 + if(e.ctrlKey){ 61 + let nodes = selectedNode(); 62 + await writeText(encodeNodeList(nodes, mousePos())); 63 + } 64 + break; 65 + case 'v': 66 + if(e.ctrlKey){ 67 + let text = await readText(); 68 + 69 + let nodes = await decodeNodeList(text, mousePos()); 70 + if(!nodes)return; 71 + 72 + for(let node of nodes) 73 + NodeManager.Instance.AddNode(node); 74 + 75 + setSelectedNode(nodes); 76 + } 77 + break; 78 + case 'z': 79 + if(e.ctrlKey){ 80 + console.log('undo'); 81 + } 82 + break; 83 + case 'y': 84 + if(e.ctrlKey){ 85 + console.log('redo'); 86 + } 87 + break; 88 + } 89 + } 90 + 91 + window.onkeyup = ( e ) => { 92 + isKeyDown[e.key] = false; 93 + } 94 + }
+295
src/renderer.ts
··· 1 + import { ContextMenu } from "./structs/ContextMenu"; 2 + import { Node, NodeIO, NodeIOLinkColours } from "./structs/node"; 3 + import { lerp } from "./utils/lerp"; 4 + 5 + export interface PositionInfo{ 6 + x: number, 7 + y: number, 8 + scale: number 9 + } 10 + 11 + const GRID_SIZE = 50; 12 + 13 + export let renderBackgroundGrid = ( 14 + canvas: HTMLCanvasElement, 15 + ctx: CanvasRenderingContext2D, 16 + position: PositionInfo 17 + ) => { 18 + let offsetX = position.x % 50; 19 + let offsetY = position.y % 50; 20 + 21 + let gridAmountX = canvas.width / (GRID_SIZE * position.scale); 22 + let gridAmountY = canvas.height / (GRID_SIZE * position.scale); 23 + 24 + ctx.fillStyle = '#fff1'; 25 + 26 + for (let x = 0; x < gridAmountX / 2; x++) { 27 + for (let y = 0; y < gridAmountY / 2; y++) { 28 + ctx.fillRect( 29 + ((x * GRID_SIZE) + offsetX) * position.scale, 30 + ((y * GRID_SIZE) + offsetY) * position.scale, 31 + 5 * position.scale, 5 * position.scale); 32 + 33 + ctx.fillRect( 34 + (((x + 1) * GRID_SIZE) - offsetX) * -position.scale, 35 + ((y * GRID_SIZE) + offsetY) * position.scale, 36 + 5 * position.scale, 5 * position.scale); 37 + 38 + ctx.fillRect( 39 + ((x * GRID_SIZE) + offsetX) * position.scale, 40 + (((y + 1) * GRID_SIZE) - offsetY) * -position.scale, 41 + 5 * position.scale, 5 * position.scale); 42 + 43 + ctx.fillRect( 44 + (((x + 1) * GRID_SIZE) - offsetX) * -position.scale, 45 + (((y + 1) * GRID_SIZE) - offsetY) * -position.scale, 46 + 5 * position.scale, 5 * position.scale); 47 + } 48 + } 49 + } 50 + 51 + export let renderNodes = ( 52 + canvas: HTMLCanvasElement, 53 + ctx: CanvasRenderingContext2D, 54 + nodes: Node[], 55 + position: PositionInfo 56 + ) => { 57 + let startX = canvas.width / -2; 58 + let startY = canvas.height / -2; 59 + 60 + ctx.textBaseline = 'top'; 61 + 62 + nodes.map(node => { 63 + let nodeX = Math.round(node.x / 10) * 10; 64 + let nodeY = Math.round(node.y / 10) * 10; 65 + 66 + ctx.fillStyle = '#343742ff'; 67 + ctx.strokeStyle = node.selected ? '#004696ff' : '#fff0'; 68 + ctx.lineWidth = 5 * position.scale; 69 + 70 + // Draw Node Box 71 + drawRoundedRect(ctx, 72 + (nodeX + startX + position.x) * position.scale, 73 + (nodeY + startY + position.y) * position.scale, 74 + node.w * position.scale, 75 + node.h * position.scale, 76 + 10 * position.scale); 77 + 78 + ctx.shadowColor = '#0005'; 79 + ctx.shadowBlur = 10; 80 + 81 + ctx.stroke(); 82 + ctx.fill(); 83 + 84 + ctx.shadowBlur = 0; 85 + 86 + // Draw Node Name 87 + ctx.fillStyle = '#fff'; 88 + ctx.font = (25 * position.scale) + 'px Rubik'; 89 + ctx.textAlign = 'center'; 90 + 91 + ctx.fillText(node.name, 92 + (nodeX + (node.w * 0.5) + startX + position.x) * position.scale, 93 + (nodeY + 10 + startY + position.y) * position.scale 94 + ); 95 + 96 + // Draw Inputs 97 + ctx.font = (15 * position.scale) + 'px Rubik'; 98 + ctx.textAlign = 'left'; 99 + 100 + node.inputs.map(( input, i ) => { 101 + ctx.fillStyle = NodeIOLinkColours(input); 102 + 103 + ctx.beginPath(); 104 + ctx.arc( 105 + (nodeX - 10 + startX + 10 + position.x) * position.scale, 106 + (nodeY + 50 + (30 * i) + startY + 10 + position.y) * position.scale, 107 + 7 * position.scale, 108 + 0, 109 + Math.PI * 2, 110 + ); 111 + ctx.fill(); 112 + 113 + ctx.fillText(input.name, 114 + (nodeX + 15 + startX + position.x) * position.scale, 115 + (nodeY + 53 + (30 * i) + startY + position.y) * position.scale, 116 + ) 117 + }) 118 + 119 + // Draw Outputs 120 + ctx.textAlign = 'right'; 121 + 122 + node.outputs.map(( output, i ) => { 123 + ctx.fillStyle = NodeIOLinkColours(output); 124 + 125 + ctx.beginPath(); 126 + ctx.arc( 127 + (nodeX + (node.w - 10) + startX + 10 + position.x) * position.scale, 128 + (nodeY + 50 + (30 * i) + startY + 10 + position.y) * position.scale, 129 + 7 * position.scale, 130 + 0, 131 + Math.PI * 2, 132 + ); 133 + ctx.fill(); 134 + 135 + ctx.fillText(output.name, 136 + (nodeX + (node.w - 15) + startX + position.x) * position.scale, 137 + (nodeY + 53 + (30 * i) + startY + position.y) * position.scale, 138 + ) 139 + }) 140 + }) 141 + 142 + nodes.map(node => { 143 + let nodeX = Math.round(node.x / 10) * 10; 144 + let nodeY = Math.round(node.y / 10) * 10; 145 + 146 + node.outputs.map(( output, i ) => { 147 + output.connections.map(partner => { 148 + let x0 = (nodeX + (node.w - 10) + 10 + startX + position.x) * position.scale; 149 + let y0 = (nodeY + 50 + (30 * i) + 10 + startY + position.y) * position.scale; 150 + let x1 = ((Math.round(partner.parent.x / 10) * 10) + startX + position.x) * position.scale; 151 + let y1 = ((Math.round(partner.parent.y / 10) * 10) + 60 + (30 * partner.index) + startY + position.y) * position.scale; 152 + 153 + let colours = NodeIOLinkColours(output, partner); 154 + let grad = ctx.createLinearGradient(x0, y0, x1, y1); 155 + 156 + grad.addColorStop(0, colours[0]); 157 + grad.addColorStop(1, colours[1]); 158 + 159 + ctx.strokeStyle = grad; 160 + ctx.lineWidth = 3 * position.scale; 161 + 162 + drawCurve(ctx, x0, y0, x1, y1); 163 + ctx.stroke(); 164 + }) 165 + }) 166 + }) 167 + } 168 + 169 + export let renderContextMenu = ( 170 + ctx: CanvasRenderingContext2D, 171 + contextMenu: ContextMenu 172 + ) => { 173 + if(contextMenu.visible){ 174 + ctx.font = '20px Rubik'; 175 + ctx.textBaseline = 'top'; 176 + ctx.textAlign = 'left'; 177 + 178 + let widestItem = 0; 179 + contextMenu.items.map(x => { 180 + let width = ctx.measureText(x.text).width; 181 + if(widestItem < width)widestItem = width; 182 + }); 183 + 184 + contextMenu.size = [ widestItem + 20, 25 * contextMenu.items.length + 20 ] 185 + 186 + drawRoundedRect(ctx, contextMenu.position[0], contextMenu.position[1], contextMenu.size[0], contextMenu.size[1], 10); 187 + ctx.fillStyle = '#444'; 188 + ctx.fill(); 189 + 190 + let submenuToRender: any = null; 191 + 192 + contextMenu.items.map((x, i) => { 193 + ctx.fillStyle = x.hovered ? '#aaa' : '#fff'; 194 + ctx.fillText(x.text, contextMenu.position[0] + 10, contextMenu.position[1] + 10 + 25 * i); 195 + 196 + if(x.hovered && x.menu){ 197 + submenuToRender = x.menu; 198 + submenuToRender.position = [ contextMenu.position[0] + contextMenu.size[0] + 5, contextMenu.position[1] + 25 * i ]; 199 + } 200 + }); 201 + 202 + if(submenuToRender){ 203 + renderContextMenu(ctx, submenuToRender); 204 + } 205 + } 206 + } 207 + 208 + export let renderTempDrawing = ( 209 + canvas: HTMLCanvasElement, 210 + ctx: CanvasRenderingContext2D, 211 + drawingTo: [ number, number ], 212 + drawingFrom: NodeIO, 213 + position: PositionInfo 214 + ) => { 215 + let startX = canvas.width / -2; 216 + let startY = canvas.height / -2; 217 + 218 + // DEBUG STUFF 219 + // ctx.fillStyle = '#f00'; 220 + 221 + // ctx.fillRect( 222 + // (drawingTo[0] + 10 + startX + position.x) * position.scale, 223 + // (drawingTo[1] + 10 + startY + position.y) * position.scale, 224 + // 10, 10 225 + // ); 226 + 227 + // ctx.fillRect( 228 + // (drawingFrom.parent.x + (drawingFrom.parent.w - 10) + 10 + startX + position.x) * position.scale, 229 + // (drawingFrom.parent.y + 50 + (30 * drawingFrom.index) + 10 + startY + position.y) * position.scale, 230 + // 10, 10 231 + // ); 232 + 233 + ctx.strokeStyle = NodeIOLinkColours(drawingFrom); 234 + ctx.lineWidth = 3 * position.scale; 235 + 236 + let nodeX = Math.round(drawingFrom.parent.x / 10) * 10; 237 + let nodeY = Math.round(drawingFrom.parent.y / 10) * 10; 238 + 239 + drawCurve(ctx, 240 + (nodeX + (drawingFrom.parent.w - 10) + 10 + startX + position.x) * position.scale, 241 + (nodeY + 50 + (30 * drawingFrom.index) + 10 + startY + position.y) * position.scale, 242 + (drawingTo[0] + 10 + startX + position.x) * position.scale, 243 + (drawingTo[1] + 10 + startY + position.y) * position.scale, 244 + ); 245 + ctx.stroke(); 246 + } 247 + 248 + let drawCurve = ( ctx: CanvasRenderingContext2D, fromX: number, fromY: number, toX: number, toY: number ) => { 249 + ctx.beginPath(); 250 + 251 + let bias = Math.sqrt(( fromX - toX ) * ( fromX - toX ) + ( fromY - toY ) * ( fromY - toY )) / 3; 252 + 253 + let start = [ fromX + bias, fromY ]; 254 + let end = [ toX - bias, toY ]; 255 + 256 + let midpoint = [ 257 + lerp(start[0], end[0], 0.5), 258 + lerp(start[1], end[1], 0.5) 259 + ]; 260 + 261 + ctx.bezierCurveTo(fromX, fromY, start[0], start[1], midpoint[0], midpoint[1]); 262 + ctx.bezierCurveTo(midpoint[0], midpoint[1], end[0], end[1], toX, toY); 263 + } 264 + 265 + export let renderNullTab = ( 266 + canvas: HTMLCanvasElement, 267 + ctx: CanvasRenderingContext2D, 268 + ) => { 269 + ctx.fillStyle = '#fff'; 270 + 271 + ctx.font = '20px Rubik'; 272 + ctx.textBaseline = 'middle'; 273 + ctx.textAlign = 'center'; 274 + 275 + let textX = lerp((canvas.width / -2) + 200, canvas.width / 2, 0.5); 276 + let textY = lerp((canvas.height / -2) + 40, canvas.height / 2, 0.5); 277 + 278 + ctx.font = '40px Rubik'; 279 + ctx.fillText('Welcome to VRCMacros', textX, textY); 280 + 281 + ctx.font = '20px Rubik'; 282 + ctx.fillText('Create a new tab to get started!', textX, textY + 40); 283 + } 284 + 285 + let drawRoundedRect = ( ctx: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, radius: number ) => { 286 + ctx.beginPath(); 287 + ctx.arc(x + radius, y + radius, radius, Math.PI, Math.PI * 1.5); 288 + ctx.lineTo(x + w - radius, y); 289 + ctx.arc(x + w - radius, y + radius, radius, Math.PI * 1.5, 0); 290 + ctx.lineTo(x + w, y + h - radius); 291 + ctx.arc(x + w - radius, y + h - radius, radius, 0, Math.PI * 0.5); 292 + ctx.lineTo(x + radius, y + h); 293 + ctx.arc(x + radius, y + h - radius, radius, Math.PI * 0.5, Math.PI); 294 + ctx.closePath(); 295 + }
+16
src/structs/ContextMenu.ts
··· 1 + import { PositionInfo } from "../renderer"; 2 + import { Node } from "./node"; 3 + 4 + export interface ContextMenuItem{ 5 + text: string, 6 + hovered: boolean, 7 + clicked?: ( e: MouseEvent, canvas: HTMLCanvasElement, pos: PositionInfo, clickedNode?: Node ) => void, 8 + menu?: ContextMenu 9 + } 10 + 11 + export interface ContextMenu{ 12 + items: ContextMenuItem[]; 13 + position: [ number, number ]; 14 + size: [ number, number ]; 15 + visible: boolean; 16 + }
+9
src/structs/OscMessage.ts
··· 1 + export interface OSCMessage{ 2 + address: string, 3 + values: OSCValue[] 4 + } 5 + 6 + export interface OSCValue{ 7 + key: string, 8 + value: any 9 + }
+17
src/structs/Tab.ts
··· 1 + import { Accessor, Setter } from "solid-js"; 2 + import { Node } from "./node"; 3 + 4 + export interface Tab{ 5 + name: string, 6 + id: string, 7 + nodes: Node[], 8 + saveLocation: string | null, 9 + 10 + selected: Accessor<boolean>, 11 + setSelected: Setter<boolean> 12 + 13 + needsSave: Accessor<boolean>, 14 + setNeedsSave: Setter<boolean>, 15 + 16 + needSync: boolean 17 + }
+163
src/structs/node.ts
··· 1 + import { NodeDefinition } from "../Nodes/Nodes"; 2 + 3 + export class Node{ 4 + name: string; 5 + id: string; 6 + typeId: string; 7 + x: number; 8 + y: number; 9 + w: number; 10 + h: number; 11 + inputs: NodeIO[]; 12 + outputs: NodeIO[]; 13 + selected: boolean; 14 + statics: NodeStatic[]; 15 + onStaticsUpdate: ( node: Node ) => Promise<void>; 16 + 17 + constructor( pos: [ number, number ], node: NodeDefinition, id: string ){ 18 + this.name = node.name; 19 + this.id = id; 20 + this.typeId = node.typeId!; 21 + this.x = pos[0]; 22 + this.y = pos[1]; 23 + 24 + this.inputs = node.inputs ? node.inputs.map(( x, indx ) => { 25 + return { 26 + name: x.name, 27 + type: x.type, 28 + connections: [], 29 + parent: this, 30 + index: indx 31 + } 32 + }) : []; 33 + 34 + this.outputs = node.outputs ? node.outputs.map(( x, indx ) => { 35 + return { 36 + name: x.name, 37 + type: x.type, 38 + connections: [], 39 + parent: this, 40 + index: indx 41 + } 42 + }) : []; 43 + 44 + this.w = node.w || 200; 45 + this.h = 50 + Math.max(this.outputs.length, this.inputs.length) * 30; 46 + 47 + this.selected = false; 48 + this.statics = node.statics!, 49 + this.onStaticsUpdate = node.onStaticsUpdate!; 50 + } 51 + 52 + updateSize(){ 53 + this.h = 50 + Math.max(this.outputs.length, this.inputs.length) * 30; 54 + } 55 + } 56 + 57 + export interface NodeIO{ 58 + name: string, 59 + type: NodeType, 60 + connections: NodeIO[], 61 + parent: Node, 62 + index: number 63 + } 64 + 65 + export enum NodeType{ 66 + Label = 0, 67 + 68 + String = 1, 69 + Float = 2, 70 + Int = 3, 71 + Boolean = 4, 72 + Flow = 5, 73 + 74 + AnyTypeA = 6, 75 + AnyTypeB = 7, 76 + AnyTypeC = 8, 77 + 78 + OSCAddress = 9, 79 + ParameterList = 10 80 + } 81 + 82 + let NodeIOCastTable: any = { 83 + 1: { 2: true, 3: true, 4: true }, // Strings -> Floats, Ints, Bools 84 + 2: { 1: true, 3: true }, // Floats -> Strings, Ints 85 + 3: { 1: true, 2: true, 4: true }, // Ints -> Strings, Floats, Bools 86 + 4: { 1: true, 2: true, 3: true } // Bools -> Strings, Ints, Floats 87 + }; 88 + 89 + export let NodeIOCanCast = ( input: NodeType | null, output: NodeType | null ): boolean => { 90 + if(input === output)return true; 91 + if(!input || !output)return false; 92 + 93 + let CastFrom = NodeIOCastTable[input]; 94 + if(!CastFrom)return false; 95 + 96 + let CastTo = CastFrom[output]; 97 + if(!CastTo)return false; 98 + 99 + return true; 100 + } 101 + 102 + export let NodeIOResolveAnyTypes = ( nodeio: NodeIO ): NodeType | null => { 103 + if(nodeio.type > 0 && nodeio.type < 6){ 104 + // It's a base type 105 + return nodeio.type; 106 + } 107 + 108 + // It's an "AnyType" value and we should resolve it, 109 + // it also means it's an input as "AnyType" is not valid on outputs 110 + let type = nodeio.type; 111 + 112 + // Check if we have any connections 113 + if(nodeio.connections.length > 0){ 114 + // We do, lets copy the type of the first input 115 + return nodeio.connections[0].type; 116 + } 117 + 118 + // Check if there are any others of the same "AnyType" 119 + let other = nodeio.parent.inputs.filter(x => x !== nodeio).find(x => x.type === type); 120 + if(other){ 121 + // There are others with the same type, lets copy that type 122 + // Does other have any connections 123 + 124 + if(other.connections.length > 0){ 125 + return other.connections[0].type; 126 + } 127 + } 128 + 129 + // We can't resolve it yet 130 + return null; 131 + } 132 + 133 + export let NodeIOLinkColours = ( nodeio: NodeIO, output?: NodeIO ) => { 134 + let cols: any = { 135 + 1: '#ffff9f', 136 + 2: '#cda0cb', 137 + 3: '#7ecaca', 138 + 4: '#8bc0a2', 139 + 5: '#edeae3' 140 + } 141 + 142 + let type = NodeIOResolveAnyTypes(nodeio); 143 + if(output){ 144 + let outputType = NodeIOResolveAnyTypes(output); 145 + let startType = type ? cols[type] : '#fff5'; 146 + 147 + if(type !== outputType){ 148 + let endType = outputType ? cols[outputType] : '#fff5'; 149 + 150 + return [ startType, endType ]; 151 + } else{ 152 + return [ startType, startType ]; 153 + } 154 + } 155 + 156 + return type ? cols[type] : '#fff5'; 157 + } 158 + 159 + export interface NodeStatic{ 160 + name: string, 161 + type: NodeType, 162 + value: any 163 + }
+80
src/utils/clipboard.ts
··· 1 + import { NodeManager } from "../Mangers/NodeManager"; 2 + import { NodesByID } from "../Nodes/Nodes"; 3 + import { Node } from "../structs/node"; 4 + 5 + export let encodeNodeList = ( selectedNodes: Node[], mousePos: [ number, number ] ): string => { 6 + let arr: any[] = []; 7 + 8 + for(let node of selectedNodes){ 9 + arr.push({ 10 + id: node.id, 11 + type_id: node.typeId, 12 + statics: node.statics, 13 + x: node.x - mousePos[0], 14 + y: node.y - mousePos[1], 15 + outputs: node.outputs.map(x => { 16 + return x.connections.map(x => { 17 + return { node: x.parent.id, index: x.index } }) }) 18 + }) 19 + } 20 + 21 + for(let node of arr){ 22 + for(let output of node.outputs){ 23 + for(let i in output){ 24 + let indx = arr.findIndex(x => x.id === output[i].node); 25 + if(indx === -1) 26 + delete output[i]; 27 + else 28 + output[i].node = indx; 29 + } 30 + } 31 + } 32 + 33 + for(let node of arr)delete node.id; 34 + 35 + console.log(arr); 36 + return 'VRCMACRO' + btoa(JSON.stringify(arr)); 37 + } 38 + 39 + export let decodeNodeList = async ( text: string, mousePos: [ number, number ] ): Promise<Node[] | null> => { 40 + if(!text.startsWith("VRCMACRO"))return null; 41 + 42 + let data = text.slice(8); 43 + let json = JSON.parse(atob(data)); 44 + 45 + let nodes: Node[] = []; 46 + for(let node of json){ 47 + let n = new Node( 48 + [ node.x + mousePos[0] + 10, node.y + mousePos[1] + 10 ], 49 + NodesByID[node.type_id], 50 + await NodeManager.Instance.GetNewNodeId() 51 + ); 52 + 53 + n.statics = node.statics; 54 + await n.onStaticsUpdate(n); 55 + 56 + nodes.push(n); 57 + } 58 + 59 + for(let i in nodes){ 60 + let outputs: { node: number, index: number }[][] = json[i].outputs; 61 + let node = nodes[i]; 62 + 63 + for(let j in outputs){ 64 + let output = node.outputs[j]; 65 + 66 + for(let k in outputs[j]){ 67 + let connection = outputs[j][k]; 68 + if(!connection)continue; 69 + 70 + let peerNode = nodes[connection.node]; 71 + let input = peerNode.inputs[connection.index]; 72 + 73 + output.connections.push(input); 74 + input.connections.push(output); 75 + } 76 + } 77 + } 78 + 79 + return nodes; 80 + }
+40
src/utils/interections.ts
··· 1 + import { PositionInfo } from "../renderer"; 2 + 3 + export let screenToWorldSpace = ( canvas: HTMLCanvasElement, position: PositionInfo, pointX: number, pointY: number ): [ number, number ] => { 4 + let startX = canvas.width / -2; 5 + let startY = canvas.height / -2; 6 + 7 + let worldX = ((pointX + startX) / position.scale) - position.x - startX; 8 + let worldY = ((pointY + startY) / position.scale) - position.y - startY; 9 + 10 + return [ worldX, worldY ]; 11 + } 12 + 13 + export let isPointInRectApplyOffset = ( canvas: HTMLCanvasElement, position: PositionInfo, pointX: number, pointY: number, rectX: number, rectY: number, rectW: number, rectH: number ): boolean => { 14 + let startX = canvas.width / -2; 15 + let startY = canvas.height / -2; 16 + 17 + let screenPointX = (pointX + startX); 18 + let screenPointY = (pointY + startY); 19 + 20 + let rectScreenX = (rectX + startX + position.x) * position.scale; 21 + let rectScreenY = (rectY + startY + position.y) * position.scale; 22 + let rectScreenW = rectW * position.scale; 23 + let rectScreenH = rectH * position.scale; 24 + 25 + return ( 26 + screenPointX > rectScreenX && 27 + screenPointX < rectScreenX + rectScreenW && 28 + screenPointY > rectScreenY && 29 + screenPointY < rectScreenY + rectScreenH 30 + ) 31 + } 32 + 33 + export let isPointInRect = ( canvas: HTMLCanvasElement, pointX: number, pointY: number, rectX: number, rectY: number, rectW: number, rectH: number ): boolean => { 34 + return ( 35 + pointX > canvas.width / 2 + rectX && 36 + pointX < canvas.width / 2 + rectX + rectW && 37 + pointY > canvas.height / 2 + rectY && 38 + pointY < canvas.height / 2 + rectY + rectH 39 + ) 40 + }
+1
src/utils/lerp.ts
··· 1 + export let lerp = ( a: number, b: number, t: number ): number => a + ( b - a ) * t;
+1372 -1309
src-tauri/Cargo.lock
··· 6 6 name = "VRCMacros" 7 7 version = "0.1.0" 8 8 dependencies = [ 9 + "anyhow", 10 + "chrono", 11 + "crossbeam-channel", 9 12 "dirs", 13 + "enigo", 14 + "flate2", 10 15 "serde", 11 16 "serde_json", 12 - "sqlx", 13 17 "tauri", 14 18 "tauri-build", 19 + "tauri-plugin-clipboard-manager", 20 + "tauri-plugin-dialog", 15 21 "tauri-plugin-opener", 22 + "tauri-plugin-os", 16 23 "tokio", 17 24 ] 18 25 19 26 [[package]] 20 - name = "addr2line" 21 - version = "0.24.2" 22 - source = "registry+https://github.com/rust-lang/crates.io-index" 23 - checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 24 - dependencies = [ 25 - "gimli", 26 - ] 27 - 28 - [[package]] 29 27 name = "adler2" 30 28 version = "2.0.1" 31 29 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 33 31 34 32 [[package]] 35 33 name = "aho-corasick" 36 - version = "1.1.3" 34 + version = "1.1.4" 37 35 source = "registry+https://github.com/rust-lang/crates.io-index" 38 - checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 36 + checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" 39 37 dependencies = [ 40 38 "memchr", 41 39 ] ··· 56 54 ] 57 55 58 56 [[package]] 59 - name = "allocator-api2" 60 - version = "0.2.21" 57 + name = "android_system_properties" 58 + version = "0.1.5" 61 59 source = "registry+https://github.com/rust-lang/crates.io-index" 62 - checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 60 + checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 61 + dependencies = [ 62 + "libc", 63 + ] 63 64 64 65 [[package]] 65 - name = "android-tzdata" 66 - version = "0.1.1" 66 + name = "anyhow" 67 + version = "1.0.100" 67 68 source = "registry+https://github.com/rust-lang/crates.io-index" 68 - checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 69 + checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" 69 70 70 71 [[package]] 71 - name = "android_system_properties" 72 - version = "0.1.5" 72 + name = "arboard" 73 + version = "3.6.1" 73 74 source = "registry+https://github.com/rust-lang/crates.io-index" 74 - checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 75 + checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf" 75 76 dependencies = [ 76 - "libc", 77 + "clipboard-win", 78 + "image", 79 + "log", 80 + "objc2 0.6.3", 81 + "objc2-app-kit", 82 + "objc2-core-foundation", 83 + "objc2-core-graphics", 84 + "objc2-foundation 0.3.2", 85 + "parking_lot", 86 + "percent-encoding", 87 + "windows-sys 0.60.2", 88 + "wl-clipboard-rs", 89 + "x11rb", 77 90 ] 78 91 79 92 [[package]] 80 - name = "anyhow" 81 - version = "1.0.98" 93 + name = "ashpd" 94 + version = "0.11.0" 82 95 source = "registry+https://github.com/rust-lang/crates.io-index" 83 - checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" 96 + checksum = "6cbdf310d77fd3aaee6ea2093db7011dc2d35d2eb3481e5607f1f8d942ed99df" 97 + dependencies = [ 98 + "enumflags2", 99 + "futures-channel", 100 + "futures-util", 101 + "rand 0.9.2", 102 + "raw-window-handle", 103 + "serde", 104 + "serde_repr", 105 + "tokio", 106 + "url", 107 + "wayland-backend", 108 + "wayland-client", 109 + "wayland-protocols", 110 + "zbus", 111 + ] 84 112 85 113 [[package]] 86 114 name = "async-broadcast" ··· 108 136 109 137 [[package]] 110 138 name = "async-executor" 111 - version = "1.13.2" 139 + version = "1.13.3" 112 140 source = "registry+https://github.com/rust-lang/crates.io-index" 113 - checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" 141 + checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" 114 142 dependencies = [ 115 143 "async-task", 116 144 "concurrent-queue", ··· 122 150 123 151 [[package]] 124 152 name = "async-io" 125 - version = "2.5.0" 153 + version = "2.6.0" 126 154 source = "registry+https://github.com/rust-lang/crates.io-index" 127 - checksum = "19634d6336019ef220f09fd31168ce5c184b295cbf80345437cc36094ef223ca" 155 + checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" 128 156 dependencies = [ 129 - "async-lock", 157 + "autocfg", 130 158 "cfg-if", 131 159 "concurrent-queue", 132 160 "futures-io", 133 161 "futures-lite", 134 162 "parking", 135 163 "polling", 136 - "rustix", 164 + "rustix 1.1.2", 137 165 "slab", 138 - "windows-sys 0.60.2", 166 + "windows-sys 0.61.2", 139 167 ] 140 168 141 169 [[package]] 142 170 name = "async-lock" 143 - version = "3.4.0" 171 + version = "3.4.1" 144 172 source = "registry+https://github.com/rust-lang/crates.io-index" 145 - checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" 173 + checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" 146 174 dependencies = [ 147 175 "event-listener", 148 176 "event-listener-strategy", ··· 151 179 152 180 [[package]] 153 181 name = "async-process" 154 - version = "2.4.0" 182 + version = "2.5.0" 155 183 source = "registry+https://github.com/rust-lang/crates.io-index" 156 - checksum = "65daa13722ad51e6ab1a1b9c01299142bc75135b337923cfa10e79bbbd669f00" 184 + checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" 157 185 dependencies = [ 158 186 "async-channel", 159 187 "async-io", ··· 164 192 "cfg-if", 165 193 "event-listener", 166 194 "futures-lite", 167 - "rustix", 195 + "rustix 1.1.2", 168 196 ] 169 197 170 198 [[package]] ··· 175 203 dependencies = [ 176 204 "proc-macro2", 177 205 "quote", 178 - "syn 2.0.104", 206 + "syn 2.0.109", 179 207 ] 180 208 181 209 [[package]] 182 210 name = "async-signal" 183 - version = "0.2.12" 211 + version = "0.2.13" 184 212 source = "registry+https://github.com/rust-lang/crates.io-index" 185 - checksum = "f567af260ef69e1d52c2b560ce0ea230763e6fbb9214a85d768760a920e3e3c1" 213 + checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" 186 214 dependencies = [ 187 215 "async-io", 188 216 "async-lock", ··· 190 218 "cfg-if", 191 219 "futures-core", 192 220 "futures-io", 193 - "rustix", 221 + "rustix 1.1.2", 194 222 "signal-hook-registry", 195 223 "slab", 196 - "windows-sys 0.60.2", 224 + "windows-sys 0.61.2", 197 225 ] 198 226 199 227 [[package]] ··· 204 232 205 233 [[package]] 206 234 name = "async-trait" 207 - version = "0.1.88" 235 + version = "0.1.89" 208 236 source = "registry+https://github.com/rust-lang/crates.io-index" 209 - checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" 237 + checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" 210 238 dependencies = [ 211 239 "proc-macro2", 212 240 "quote", 213 - "syn 2.0.104", 241 + "syn 2.0.109", 214 242 ] 215 243 216 244 [[package]] ··· 237 265 ] 238 266 239 267 [[package]] 240 - name = "atoi" 241 - version = "2.0.0" 242 - source = "registry+https://github.com/rust-lang/crates.io-index" 243 - checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 244 - dependencies = [ 245 - "num-traits", 246 - ] 247 - 248 - [[package]] 249 268 name = "atomic-waker" 250 269 version = "1.1.2" 251 270 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 258 277 checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 259 278 260 279 [[package]] 261 - name = "backtrace" 262 - version = "0.3.75" 263 - source = "registry+https://github.com/rust-lang/crates.io-index" 264 - checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" 265 - dependencies = [ 266 - "addr2line", 267 - "cfg-if", 268 - "libc", 269 - "miniz_oxide", 270 - "object", 271 - "rustc-demangle", 272 - "windows-targets 0.52.6", 273 - ] 274 - 275 - [[package]] 276 280 name = "base64" 277 281 version = "0.21.7" 278 282 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 285 289 checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 286 290 287 291 [[package]] 288 - name = "base64ct" 289 - version = "1.8.0" 290 - source = "registry+https://github.com/rust-lang/crates.io-index" 291 - checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" 292 - 293 - [[package]] 294 292 name = "bitflags" 295 293 version = "1.3.2" 296 294 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 298 296 299 297 [[package]] 300 298 name = "bitflags" 301 - version = "2.9.1" 299 + version = "2.10.0" 302 300 source = "registry+https://github.com/rust-lang/crates.io-index" 303 - checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" 301 + checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" 304 302 dependencies = [ 305 - "serde", 303 + "serde_core", 306 304 ] 307 305 308 306 [[package]] ··· 325 323 326 324 [[package]] 327 325 name = "block2" 328 - version = "0.6.1" 326 + version = "0.6.2" 329 327 source = "registry+https://github.com/rust-lang/crates.io-index" 330 - checksum = "340d2f0bdb2a43c1d3cd40513185b2bd7def0aa1052f956455114bc98f82dcf2" 328 + checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" 331 329 dependencies = [ 332 - "objc2 0.6.1", 330 + "objc2 0.6.3", 333 331 ] 334 332 335 333 [[package]] ··· 347 345 348 346 [[package]] 349 347 name = "brotli" 350 - version = "8.0.1" 348 + version = "8.0.2" 351 349 source = "registry+https://github.com/rust-lang/crates.io-index" 352 - checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" 350 + checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" 353 351 dependencies = [ 354 352 "alloc-no-stdlib", 355 353 "alloc-stdlib", ··· 374 372 375 373 [[package]] 376 374 name = "bytemuck" 377 - version = "1.23.1" 375 + version = "1.24.0" 378 376 source = "registry+https://github.com/rust-lang/crates.io-index" 379 - checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" 377 + checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" 380 378 381 379 [[package]] 382 380 name = "byteorder" ··· 385 383 checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 386 384 387 385 [[package]] 386 + name = "byteorder-lite" 387 + version = "0.1.0" 388 + source = "registry+https://github.com/rust-lang/crates.io-index" 389 + checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" 390 + 391 + [[package]] 388 392 name = "bytes" 389 393 version = "1.10.1" 390 394 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 399 403 source = "registry+https://github.com/rust-lang/crates.io-index" 400 404 checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" 401 405 dependencies = [ 402 - "bitflags 2.9.1", 406 + "bitflags 2.10.0", 403 407 "cairo-sys-rs", 404 408 "glib", 405 409 "libc", ··· 420 424 421 425 [[package]] 422 426 name = "camino" 423 - version = "1.1.10" 427 + version = "1.2.1" 424 428 source = "registry+https://github.com/rust-lang/crates.io-index" 425 - checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" 429 + checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" 426 430 dependencies = [ 427 - "serde", 431 + "serde_core", 428 432 ] 429 433 430 434 [[package]] ··· 447 451 "semver", 448 452 "serde", 449 453 "serde_json", 450 - "thiserror 2.0.12", 454 + "thiserror 2.0.17", 451 455 ] 452 456 453 457 [[package]] ··· 457 461 checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" 458 462 dependencies = [ 459 463 "serde", 460 - "toml 0.9.3", 464 + "toml 0.9.8", 461 465 ] 462 466 463 467 [[package]] 464 468 name = "cc" 465 - version = "1.2.30" 469 + version = "1.2.45" 466 470 source = "registry+https://github.com/rust-lang/crates.io-index" 467 - checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" 471 + checksum = "35900b6c8d709fb1d854671ae27aeaa9eec2f8b01b364e1619a40da3e6fe2afe" 468 472 dependencies = [ 473 + "find-msvc-tools", 469 474 "shlex", 470 475 ] 471 476 ··· 498 503 499 504 [[package]] 500 505 name = "cfg-if" 501 - version = "1.0.1" 506 + version = "1.0.4" 502 507 source = "registry+https://github.com/rust-lang/crates.io-index" 503 - checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" 508 + checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" 504 509 505 510 [[package]] 506 511 name = "cfg_aliases" ··· 510 515 511 516 [[package]] 512 517 name = "chrono" 513 - version = "0.4.41" 518 + version = "0.4.42" 514 519 source = "registry+https://github.com/rust-lang/crates.io-index" 515 - checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" 520 + checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" 516 521 dependencies = [ 517 - "android-tzdata", 518 522 "iana-time-zone", 523 + "js-sys", 519 524 "num-traits", 520 525 "serde", 521 - "windows-link", 526 + "wasm-bindgen", 527 + "windows-link 0.2.1", 528 + ] 529 + 530 + [[package]] 531 + name = "clipboard-win" 532 + version = "5.4.1" 533 + source = "registry+https://github.com/rust-lang/crates.io-index" 534 + checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" 535 + dependencies = [ 536 + "error-code", 522 537 ] 523 538 524 539 [[package]] ··· 539 554 dependencies = [ 540 555 "crossbeam-utils", 541 556 ] 542 - 543 - [[package]] 544 - name = "const-oid" 545 - version = "0.9.6" 546 - source = "registry+https://github.com/rust-lang/crates.io-index" 547 - checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 548 557 549 558 [[package]] 550 559 name = "convert_case" ··· 584 593 source = "registry+https://github.com/rust-lang/crates.io-index" 585 594 checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" 586 595 dependencies = [ 587 - "bitflags 2.9.1", 596 + "bitflags 2.10.0", 597 + "core-foundation", 598 + "core-graphics-types", 599 + "foreign-types", 600 + "libc", 601 + ] 602 + 603 + [[package]] 604 + name = "core-graphics" 605 + version = "0.25.0" 606 + source = "registry+https://github.com/rust-lang/crates.io-index" 607 + checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" 608 + dependencies = [ 609 + "bitflags 2.10.0", 588 610 "core-foundation", 589 611 "core-graphics-types", 590 612 "foreign-types", ··· 597 619 source = "registry+https://github.com/rust-lang/crates.io-index" 598 620 checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" 599 621 dependencies = [ 600 - "bitflags 2.9.1", 622 + "bitflags 2.10.0", 601 623 "core-foundation", 602 624 "libc", 603 625 ] ··· 612 634 ] 613 635 614 636 [[package]] 615 - name = "crc" 616 - version = "3.3.0" 617 - source = "registry+https://github.com/rust-lang/crates.io-index" 618 - checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" 619 - dependencies = [ 620 - "crc-catalog", 621 - ] 622 - 623 - [[package]] 624 - name = "crc-catalog" 625 - version = "2.4.0" 626 - source = "registry+https://github.com/rust-lang/crates.io-index" 627 - checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" 628 - 629 - [[package]] 630 637 name = "crc32fast" 631 638 version = "1.5.0" 632 639 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 645 652 ] 646 653 647 654 [[package]] 648 - name = "crossbeam-queue" 649 - version = "0.3.12" 650 - source = "registry+https://github.com/rust-lang/crates.io-index" 651 - checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" 652 - dependencies = [ 653 - "crossbeam-utils", 654 - ] 655 - 656 - [[package]] 657 655 name = "crossbeam-utils" 658 656 version = "0.8.21" 659 657 source = "registry+https://github.com/rust-lang/crates.io-index" 660 658 checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 659 + 660 + [[package]] 661 + name = "crunchy" 662 + version = "0.2.4" 663 + source = "registry+https://github.com/rust-lang/crates.io-index" 664 + checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" 661 665 662 666 [[package]] 663 667 name = "crypto-common" ··· 693 697 checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" 694 698 dependencies = [ 695 699 "quote", 696 - "syn 2.0.104", 700 + "syn 2.0.109", 697 701 ] 698 702 699 703 [[package]] ··· 703 707 checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" 704 708 dependencies = [ 705 709 "quote", 706 - "syn 2.0.104", 710 + "syn 2.0.109", 707 711 ] 708 712 709 713 [[package]] 710 714 name = "darling" 711 - version = "0.20.11" 715 + version = "0.21.3" 712 716 source = "registry+https://github.com/rust-lang/crates.io-index" 713 - checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" 717 + checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" 714 718 dependencies = [ 715 719 "darling_core", 716 720 "darling_macro", ··· 718 722 719 723 [[package]] 720 724 name = "darling_core" 721 - version = "0.20.11" 725 + version = "0.21.3" 722 726 source = "registry+https://github.com/rust-lang/crates.io-index" 723 - checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" 727 + checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" 724 728 dependencies = [ 725 729 "fnv", 726 730 "ident_case", 727 731 "proc-macro2", 728 732 "quote", 729 733 "strsim", 730 - "syn 2.0.104", 734 + "syn 2.0.109", 731 735 ] 732 736 733 737 [[package]] 734 738 name = "darling_macro" 735 - version = "0.20.11" 739 + version = "0.21.3" 736 740 source = "registry+https://github.com/rust-lang/crates.io-index" 737 - checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" 741 + checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" 738 742 dependencies = [ 739 743 "darling_core", 740 744 "quote", 741 - "syn 2.0.104", 742 - ] 743 - 744 - [[package]] 745 - name = "der" 746 - version = "0.7.10" 747 - source = "registry+https://github.com/rust-lang/crates.io-index" 748 - checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" 749 - dependencies = [ 750 - "const-oid", 751 - "pem-rfc7468", 752 - "zeroize", 745 + "syn 2.0.109", 753 746 ] 754 747 755 748 [[package]] 756 749 name = "deranged" 757 - version = "0.4.0" 750 + version = "0.5.5" 758 751 source = "registry+https://github.com/rust-lang/crates.io-index" 759 - checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" 752 + checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" 760 753 dependencies = [ 761 754 "powerfmt", 762 - "serde", 755 + "serde_core", 763 756 ] 764 757 765 758 [[package]] ··· 772 765 "proc-macro2", 773 766 "quote", 774 767 "rustc_version", 775 - "syn 2.0.104", 768 + "syn 2.0.109", 776 769 ] 777 770 778 771 [[package]] ··· 782 775 checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 783 776 dependencies = [ 784 777 "block-buffer", 785 - "const-oid", 786 778 "crypto-common", 787 - "subtle", 788 779 ] 789 780 790 781 [[package]] ··· 805 796 "libc", 806 797 "option-ext", 807 798 "redox_users", 808 - "windows-sys 0.60.2", 799 + "windows-sys 0.61.2", 809 800 ] 810 801 811 802 [[package]] ··· 820 811 source = "registry+https://github.com/rust-lang/crates.io-index" 821 812 checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" 822 813 dependencies = [ 823 - "bitflags 2.9.1", 824 - "objc2 0.6.1", 814 + "bitflags 2.10.0", 815 + "block2 0.6.2", 816 + "libc", 817 + "objc2 0.6.3", 825 818 ] 826 819 827 820 [[package]] ··· 832 825 dependencies = [ 833 826 "proc-macro2", 834 827 "quote", 835 - "syn 2.0.104", 828 + "syn 2.0.109", 829 + ] 830 + 831 + [[package]] 832 + name = "dlib" 833 + version = "0.5.2" 834 + source = "registry+https://github.com/rust-lang/crates.io-index" 835 + checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" 836 + dependencies = [ 837 + "libloading 0.8.9", 836 838 ] 837 839 838 840 [[package]] 839 841 name = "dlopen2" 840 - version = "0.7.0" 842 + version = "0.8.0" 841 843 source = "registry+https://github.com/rust-lang/crates.io-index" 842 - checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6" 844 + checksum = "b54f373ccf864bf587a89e880fb7610f8d73f3045f13580948ccbcaff26febff" 843 845 dependencies = [ 844 846 "dlopen2_derive", 845 847 "libc", ··· 855 857 dependencies = [ 856 858 "proc-macro2", 857 859 "quote", 858 - "syn 2.0.104", 860 + "syn 2.0.109", 859 861 ] 860 862 861 863 [[package]] 862 - name = "dotenvy" 863 - version = "0.15.7" 864 + name = "downcast-rs" 865 + version = "1.2.1" 864 866 source = "registry+https://github.com/rust-lang/crates.io-index" 865 - checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" 867 + checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" 866 868 867 869 [[package]] 868 870 name = "dpi" ··· 901 903 checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" 902 904 903 905 [[package]] 904 - name = "either" 905 - version = "1.15.0" 906 - source = "registry+https://github.com/rust-lang/crates.io-index" 907 - checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 908 - dependencies = [ 909 - "serde", 910 - ] 911 - 912 - [[package]] 913 906 name = "embed-resource" 914 - version = "3.0.5" 907 + version = "3.0.6" 915 908 source = "registry+https://github.com/rust-lang/crates.io-index" 916 - checksum = "4c6d81016d6c977deefb2ef8d8290da019e27cc26167e102185da528e6c0ab38" 909 + checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" 917 910 dependencies = [ 918 911 "cc", 919 912 "memchr", 920 913 "rustc_version", 921 - "toml 0.9.3", 914 + "toml 0.9.8", 922 915 "vswhom", 923 916 "winreg", 924 917 ] ··· 936 929 checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" 937 930 938 931 [[package]] 932 + name = "enigo" 933 + version = "0.6.1" 934 + source = "registry+https://github.com/rust-lang/crates.io-index" 935 + checksum = "71c6c56e50f7acae2906a0dcbb34529ca647e40421119ad5d12e7f8ba6e50010" 936 + dependencies = [ 937 + "core-foundation", 938 + "core-graphics 0.25.0", 939 + "foreign-types-shared", 940 + "libc", 941 + "log", 942 + "nom 8.0.0", 943 + "objc2 0.6.3", 944 + "objc2-app-kit", 945 + "objc2-foundation 0.3.2", 946 + "windows", 947 + "x11rb", 948 + "xkbcommon", 949 + "xkeysym", 950 + ] 951 + 952 + [[package]] 939 953 name = "enumflags2" 940 954 version = "0.7.12" 941 955 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 953 967 dependencies = [ 954 968 "proc-macro2", 955 969 "quote", 956 - "syn 2.0.104", 970 + "syn 2.0.109", 957 971 ] 958 972 959 973 [[package]] ··· 964 978 965 979 [[package]] 966 980 name = "erased-serde" 967 - version = "0.4.6" 981 + version = "0.4.9" 968 982 source = "registry+https://github.com/rust-lang/crates.io-index" 969 - checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" 983 + checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" 970 984 dependencies = [ 971 985 "serde", 986 + "serde_core", 972 987 "typeid", 973 988 ] 974 989 975 990 [[package]] 976 991 name = "errno" 977 - version = "0.3.13" 992 + version = "0.3.14" 978 993 source = "registry+https://github.com/rust-lang/crates.io-index" 979 - checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" 994 + checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" 980 995 dependencies = [ 981 996 "libc", 982 - "windows-sys 0.60.2", 997 + "windows-sys 0.61.2", 983 998 ] 984 999 985 1000 [[package]] 986 - name = "etcetera" 987 - version = "0.8.0" 1001 + name = "error-code" 1002 + version = "3.3.2" 988 1003 source = "registry+https://github.com/rust-lang/crates.io-index" 989 - checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" 990 - dependencies = [ 991 - "cfg-if", 992 - "home", 993 - "windows-sys 0.48.0", 994 - ] 1004 + checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" 995 1005 996 1006 [[package]] 997 1007 name = "event-listener" 998 - version = "5.4.0" 1008 + version = "5.4.1" 999 1009 source = "registry+https://github.com/rust-lang/crates.io-index" 1000 - checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 1010 + checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" 1001 1011 dependencies = [ 1002 1012 "concurrent-queue", 1003 1013 "parking", ··· 1021 1031 checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 1022 1032 1023 1033 [[package]] 1034 + name = "fax" 1035 + version = "0.2.6" 1036 + source = "registry+https://github.com/rust-lang/crates.io-index" 1037 + checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab" 1038 + dependencies = [ 1039 + "fax_derive", 1040 + ] 1041 + 1042 + [[package]] 1043 + name = "fax_derive" 1044 + version = "0.2.0" 1045 + source = "registry+https://github.com/rust-lang/crates.io-index" 1046 + checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" 1047 + dependencies = [ 1048 + "proc-macro2", 1049 + "quote", 1050 + "syn 2.0.109", 1051 + ] 1052 + 1053 + [[package]] 1024 1054 name = "fdeflate" 1025 1055 version = "0.3.7" 1026 1056 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1040 1070 ] 1041 1071 1042 1072 [[package]] 1043 - name = "flate2" 1044 - version = "1.1.2" 1073 + name = "find-msvc-tools" 1074 + version = "0.1.4" 1045 1075 source = "registry+https://github.com/rust-lang/crates.io-index" 1046 - checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" 1047 - dependencies = [ 1048 - "crc32fast", 1049 - "miniz_oxide", 1050 - ] 1076 + checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" 1051 1077 1052 1078 [[package]] 1053 - name = "flume" 1054 - version = "0.11.1" 1079 + name = "fixedbitset" 1080 + version = "0.5.7" 1055 1081 source = "registry+https://github.com/rust-lang/crates.io-index" 1056 - checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" 1082 + checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" 1083 + 1084 + [[package]] 1085 + name = "flate2" 1086 + version = "1.1.5" 1087 + source = "registry+https://github.com/rust-lang/crates.io-index" 1088 + checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" 1057 1089 dependencies = [ 1058 - "futures-core", 1059 - "futures-sink", 1060 - "spin", 1090 + "crc32fast", 1091 + "miniz_oxide", 1061 1092 ] 1062 1093 1063 1094 [[package]] ··· 1090 1121 dependencies = [ 1091 1122 "proc-macro2", 1092 1123 "quote", 1093 - "syn 2.0.104", 1124 + "syn 2.0.109", 1094 1125 ] 1095 1126 1096 1127 [[package]] ··· 1101 1132 1102 1133 [[package]] 1103 1134 name = "form_urlencoded" 1104 - version = "1.2.1" 1135 + version = "1.2.2" 1105 1136 source = "registry+https://github.com/rust-lang/crates.io-index" 1106 - checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 1137 + checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 1107 1138 dependencies = [ 1108 1139 "percent-encoding", 1109 1140 ] ··· 1125 1156 checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 1126 1157 dependencies = [ 1127 1158 "futures-core", 1128 - "futures-sink", 1129 1159 ] 1130 1160 1131 1161 [[package]] ··· 1146 1176 ] 1147 1177 1148 1178 [[package]] 1149 - name = "futures-intrusive" 1150 - version = "0.5.0" 1151 - source = "registry+https://github.com/rust-lang/crates.io-index" 1152 - checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" 1153 - dependencies = [ 1154 - "futures-core", 1155 - "lock_api", 1156 - "parking_lot", 1157 - ] 1158 - 1159 - [[package]] 1160 1179 name = "futures-io" 1161 1180 version = "0.3.31" 1162 1181 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1164 1183 1165 1184 [[package]] 1166 1185 name = "futures-lite" 1167 - version = "2.6.0" 1186 + version = "2.6.1" 1168 1187 source = "registry+https://github.com/rust-lang/crates.io-index" 1169 - checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" 1188 + checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" 1170 1189 dependencies = [ 1171 1190 "fastrand", 1172 1191 "futures-core", ··· 1183 1202 dependencies = [ 1184 1203 "proc-macro2", 1185 1204 "quote", 1186 - "syn 2.0.104", 1205 + "syn 2.0.109", 1187 1206 ] 1188 1207 1189 1208 [[package]] ··· 1325 1344 1326 1345 [[package]] 1327 1346 name = "generic-array" 1328 - version = "0.14.7" 1347 + version = "0.14.9" 1329 1348 source = "registry+https://github.com/rust-lang/crates.io-index" 1330 - checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 1349 + checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" 1331 1350 dependencies = [ 1332 1351 "typenum", 1333 1352 "version_check", 1334 1353 ] 1335 1354 1336 1355 [[package]] 1356 + name = "gethostname" 1357 + version = "1.1.0" 1358 + source = "registry+https://github.com/rust-lang/crates.io-index" 1359 + checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" 1360 + dependencies = [ 1361 + "rustix 1.1.2", 1362 + "windows-link 0.2.1", 1363 + ] 1364 + 1365 + [[package]] 1337 1366 name = "getrandom" 1338 1367 version = "0.1.16" 1339 1368 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1357 1386 1358 1387 [[package]] 1359 1388 name = "getrandom" 1360 - version = "0.3.3" 1389 + version = "0.3.4" 1361 1390 source = "registry+https://github.com/rust-lang/crates.io-index" 1362 - checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 1391 + checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" 1363 1392 dependencies = [ 1364 1393 "cfg-if", 1365 1394 "libc", 1366 1395 "r-efi", 1367 - "wasi 0.14.2+wasi-0.2.4", 1396 + "wasip2", 1368 1397 ] 1369 1398 1370 1399 [[package]] 1371 - name = "gimli" 1372 - version = "0.31.1" 1373 - source = "registry+https://github.com/rust-lang/crates.io-index" 1374 - checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 1375 - 1376 - [[package]] 1377 1400 name = "gio" 1378 1401 version = "0.18.4" 1379 1402 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1411 1434 source = "registry+https://github.com/rust-lang/crates.io-index" 1412 1435 checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" 1413 1436 dependencies = [ 1414 - "bitflags 2.9.1", 1437 + "bitflags 2.10.0", 1415 1438 "futures-channel", 1416 1439 "futures-core", 1417 1440 "futures-executor", ··· 1435 1458 checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" 1436 1459 dependencies = [ 1437 1460 "heck 0.4.1", 1438 - "proc-macro-crate 2.0.0", 1461 + "proc-macro-crate 2.0.2", 1439 1462 "proc-macro-error", 1440 1463 "proc-macro2", 1441 1464 "quote", 1442 - "syn 2.0.104", 1465 + "syn 2.0.109", 1443 1466 ] 1444 1467 1445 1468 [[package]] ··· 1454 1477 1455 1478 [[package]] 1456 1479 name = "glob" 1457 - version = "0.3.2" 1480 + version = "0.3.3" 1458 1481 source = "registry+https://github.com/rust-lang/crates.io-index" 1459 - checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 1482 + checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" 1460 1483 1461 1484 [[package]] 1462 1485 name = "gobject-sys" ··· 1518 1541 "proc-macro-error", 1519 1542 "proc-macro2", 1520 1543 "quote", 1521 - "syn 2.0.104", 1544 + "syn 2.0.109", 1545 + ] 1546 + 1547 + [[package]] 1548 + name = "half" 1549 + version = "2.7.1" 1550 + source = "registry+https://github.com/rust-lang/crates.io-index" 1551 + checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" 1552 + dependencies = [ 1553 + "cfg-if", 1554 + "crunchy", 1555 + "zerocopy", 1522 1556 ] 1523 1557 1524 1558 [[package]] ··· 1529 1563 1530 1564 [[package]] 1531 1565 name = "hashbrown" 1532 - version = "0.15.4" 1566 + version = "0.15.5" 1533 1567 source = "registry+https://github.com/rust-lang/crates.io-index" 1534 - checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" 1568 + checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 1535 1569 dependencies = [ 1536 - "allocator-api2", 1537 - "equivalent", 1538 1570 "foldhash", 1539 1571 ] 1540 1572 1541 1573 [[package]] 1542 - name = "hashlink" 1543 - version = "0.10.0" 1574 + name = "hashbrown" 1575 + version = "0.16.0" 1544 1576 source = "registry+https://github.com/rust-lang/crates.io-index" 1545 - checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" 1546 - dependencies = [ 1547 - "hashbrown 0.15.4", 1548 - ] 1577 + checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" 1549 1578 1550 1579 [[package]] 1551 1580 name = "heck" ··· 1572 1601 checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 1573 1602 1574 1603 [[package]] 1575 - name = "hkdf" 1576 - version = "0.12.4" 1577 - source = "registry+https://github.com/rust-lang/crates.io-index" 1578 - checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" 1579 - dependencies = [ 1580 - "hmac", 1581 - ] 1582 - 1583 - [[package]] 1584 - name = "hmac" 1585 - version = "0.12.1" 1586 - source = "registry+https://github.com/rust-lang/crates.io-index" 1587 - checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 1588 - dependencies = [ 1589 - "digest", 1590 - ] 1591 - 1592 - [[package]] 1593 - name = "home" 1594 - version = "0.5.11" 1595 - source = "registry+https://github.com/rust-lang/crates.io-index" 1596 - checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" 1597 - dependencies = [ 1598 - "windows-sys 0.59.0", 1599 - ] 1600 - 1601 - [[package]] 1602 1604 name = "html5ever" 1603 1605 version = "0.29.1" 1604 1606 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1652 1654 1653 1655 [[package]] 1654 1656 name = "hyper" 1655 - version = "1.6.0" 1657 + version = "1.7.0" 1656 1658 source = "registry+https://github.com/rust-lang/crates.io-index" 1657 - checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 1659 + checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" 1658 1660 dependencies = [ 1661 + "atomic-waker", 1659 1662 "bytes", 1660 1663 "futures-channel", 1661 - "futures-util", 1664 + "futures-core", 1662 1665 "http", 1663 1666 "http-body", 1664 1667 "httparse", 1665 1668 "itoa", 1666 1669 "pin-project-lite", 1670 + "pin-utils", 1667 1671 "smallvec", 1668 1672 "tokio", 1669 1673 "want", ··· 1671 1675 1672 1676 [[package]] 1673 1677 name = "hyper-util" 1674 - version = "0.1.16" 1678 + version = "0.1.17" 1675 1679 source = "registry+https://github.com/rust-lang/crates.io-index" 1676 - checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" 1680 + checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" 1677 1681 dependencies = [ 1678 1682 "base64 0.22.1", 1679 1683 "bytes", ··· 1695 1699 1696 1700 [[package]] 1697 1701 name = "iana-time-zone" 1698 - version = "0.1.63" 1702 + version = "0.1.64" 1699 1703 source = "registry+https://github.com/rust-lang/crates.io-index" 1700 - checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" 1704 + checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" 1701 1705 dependencies = [ 1702 1706 "android_system_properties", 1703 1707 "core-foundation-sys", ··· 1705 1709 "js-sys", 1706 1710 "log", 1707 1711 "wasm-bindgen", 1708 - "windows-core", 1712 + "windows-core 0.62.2", 1709 1713 ] 1710 1714 1711 1715 [[package]] ··· 1724 1728 checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" 1725 1729 dependencies = [ 1726 1730 "byteorder", 1727 - "png", 1731 + "png 0.17.16", 1728 1732 ] 1729 1733 1730 1734 [[package]] 1731 1735 name = "icu_collections" 1732 - version = "2.0.0" 1736 + version = "2.1.1" 1733 1737 source = "registry+https://github.com/rust-lang/crates.io-index" 1734 - checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 1738 + checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" 1735 1739 dependencies = [ 1736 1740 "displaydoc", 1737 1741 "potential_utf", ··· 1742 1746 1743 1747 [[package]] 1744 1748 name = "icu_locale_core" 1745 - version = "2.0.0" 1749 + version = "2.1.1" 1746 1750 source = "registry+https://github.com/rust-lang/crates.io-index" 1747 - checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 1751 + checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" 1748 1752 dependencies = [ 1749 1753 "displaydoc", 1750 1754 "litemap", ··· 1755 1759 1756 1760 [[package]] 1757 1761 name = "icu_normalizer" 1758 - version = "2.0.0" 1762 + version = "2.1.1" 1759 1763 source = "registry+https://github.com/rust-lang/crates.io-index" 1760 - checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 1764 + checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" 1761 1765 dependencies = [ 1762 - "displaydoc", 1763 1766 "icu_collections", 1764 1767 "icu_normalizer_data", 1765 1768 "icu_properties", ··· 1770 1773 1771 1774 [[package]] 1772 1775 name = "icu_normalizer_data" 1773 - version = "2.0.0" 1776 + version = "2.1.1" 1774 1777 source = "registry+https://github.com/rust-lang/crates.io-index" 1775 - checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 1778 + checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" 1776 1779 1777 1780 [[package]] 1778 1781 name = "icu_properties" 1779 - version = "2.0.1" 1782 + version = "2.1.1" 1780 1783 source = "registry+https://github.com/rust-lang/crates.io-index" 1781 - checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 1784 + checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" 1782 1785 dependencies = [ 1783 - "displaydoc", 1784 1786 "icu_collections", 1785 1787 "icu_locale_core", 1786 1788 "icu_properties_data", 1787 1789 "icu_provider", 1788 - "potential_utf", 1789 1790 "zerotrie", 1790 1791 "zerovec", 1791 1792 ] 1792 1793 1793 1794 [[package]] 1794 1795 name = "icu_properties_data" 1795 - version = "2.0.1" 1796 + version = "2.1.1" 1796 1797 source = "registry+https://github.com/rust-lang/crates.io-index" 1797 - checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 1798 + checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" 1798 1799 1799 1800 [[package]] 1800 1801 name = "icu_provider" 1801 - version = "2.0.0" 1802 + version = "2.1.1" 1802 1803 source = "registry+https://github.com/rust-lang/crates.io-index" 1803 - checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 1804 + checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" 1804 1805 dependencies = [ 1805 1806 "displaydoc", 1806 1807 "icu_locale_core", 1807 - "stable_deref_trait", 1808 - "tinystr", 1809 1808 "writeable", 1810 1809 "yoke", 1811 1810 "zerofrom", ··· 1821 1820 1822 1821 [[package]] 1823 1822 name = "idna" 1824 - version = "1.0.3" 1823 + version = "1.1.0" 1825 1824 source = "registry+https://github.com/rust-lang/crates.io-index" 1826 - checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 1825 + checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 1827 1826 dependencies = [ 1828 1827 "idna_adapter", 1829 1828 "smallvec", ··· 1841 1840 ] 1842 1841 1843 1842 [[package]] 1843 + name = "image" 1844 + version = "0.25.8" 1845 + source = "registry+https://github.com/rust-lang/crates.io-index" 1846 + checksum = "529feb3e6769d234375c4cf1ee2ce713682b8e76538cb13f9fc23e1400a591e7" 1847 + dependencies = [ 1848 + "bytemuck", 1849 + "byteorder-lite", 1850 + "moxcms", 1851 + "num-traits", 1852 + "png 0.18.0", 1853 + "tiff", 1854 + ] 1855 + 1856 + [[package]] 1844 1857 name = "indexmap" 1845 1858 version = "1.9.3" 1846 1859 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1853 1866 1854 1867 [[package]] 1855 1868 name = "indexmap" 1856 - version = "2.10.0" 1869 + version = "2.12.0" 1857 1870 source = "registry+https://github.com/rust-lang/crates.io-index" 1858 - checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" 1871 + checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" 1859 1872 dependencies = [ 1860 1873 "equivalent", 1861 - "hashbrown 0.15.4", 1874 + "hashbrown 0.16.0", 1862 1875 "serde", 1876 + "serde_core", 1863 1877 ] 1864 1878 1865 1879 [[package]] ··· 1872 1886 ] 1873 1887 1874 1888 [[package]] 1875 - name = "io-uring" 1876 - version = "0.7.9" 1877 - source = "registry+https://github.com/rust-lang/crates.io-index" 1878 - checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" 1879 - dependencies = [ 1880 - "bitflags 2.9.1", 1881 - "cfg-if", 1882 - "libc", 1883 - ] 1884 - 1885 - [[package]] 1886 1889 name = "ipnet" 1887 1890 version = "2.11.0" 1888 1891 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1890 1893 1891 1894 [[package]] 1892 1895 name = "iri-string" 1893 - version = "0.7.8" 1896 + version = "0.7.9" 1894 1897 source = "registry+https://github.com/rust-lang/crates.io-index" 1895 - checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" 1898 + checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" 1896 1899 dependencies = [ 1897 1900 "memchr", 1898 1901 "serde", ··· 1970 1973 1971 1974 [[package]] 1972 1975 name = "js-sys" 1973 - version = "0.3.77" 1976 + version = "0.3.82" 1974 1977 source = "registry+https://github.com/rust-lang/crates.io-index" 1975 - checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 1978 + checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" 1976 1979 dependencies = [ 1977 1980 "once_cell", 1978 1981 "wasm-bindgen", ··· 2006 2009 source = "registry+https://github.com/rust-lang/crates.io-index" 2007 2010 checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" 2008 2011 dependencies = [ 2009 - "bitflags 2.9.1", 2012 + "bitflags 2.10.0", 2010 2013 "serde", 2011 2014 "unicode-segmentation", 2012 2015 ] ··· 2019 2022 dependencies = [ 2020 2023 "cssparser", 2021 2024 "html5ever", 2022 - "indexmap 2.10.0", 2025 + "indexmap 2.12.0", 2023 2026 "selectors", 2024 2027 ] 2025 2028 ··· 2028 2031 version = "1.5.0" 2029 2032 source = "registry+https://github.com/rust-lang/crates.io-index" 2030 2033 checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 2031 - dependencies = [ 2032 - "spin", 2033 - ] 2034 2034 2035 2035 [[package]] 2036 2036 name = "libappindicator" ··· 2052 2052 checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" 2053 2053 dependencies = [ 2054 2054 "gtk-sys", 2055 - "libloading", 2055 + "libloading 0.7.4", 2056 2056 "once_cell", 2057 2057 ] 2058 2058 2059 2059 [[package]] 2060 2060 name = "libc" 2061 - version = "0.2.174" 2061 + version = "0.2.177" 2062 2062 source = "registry+https://github.com/rust-lang/crates.io-index" 2063 - checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" 2063 + checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" 2064 2064 2065 2065 [[package]] 2066 2066 name = "libloading" ··· 2073 2073 ] 2074 2074 2075 2075 [[package]] 2076 - name = "libm" 2077 - version = "0.2.15" 2076 + name = "libloading" 2077 + version = "0.8.9" 2078 2078 source = "registry+https://github.com/rust-lang/crates.io-index" 2079 - checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" 2079 + checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" 2080 + dependencies = [ 2081 + "cfg-if", 2082 + "windows-link 0.2.1", 2083 + ] 2080 2084 2081 2085 [[package]] 2082 2086 name = "libredox" 2083 - version = "0.1.8" 2087 + version = "0.1.10" 2084 2088 source = "registry+https://github.com/rust-lang/crates.io-index" 2085 - checksum = "360e552c93fa0e8152ab463bc4c4837fce76a225df11dfaeea66c313de5e61f7" 2089 + checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" 2086 2090 dependencies = [ 2087 - "bitflags 2.9.1", 2091 + "bitflags 2.10.0", 2088 2092 "libc", 2089 2093 ] 2090 2094 2091 2095 [[package]] 2092 - name = "libsqlite3-sys" 2093 - version = "0.30.1" 2096 + name = "linux-raw-sys" 2097 + version = "0.4.15" 2094 2098 source = "registry+https://github.com/rust-lang/crates.io-index" 2095 - checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" 2096 - dependencies = [ 2097 - "cc", 2098 - "pkg-config", 2099 - "vcpkg", 2100 - ] 2099 + checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 2101 2100 2102 2101 [[package]] 2103 2102 name = "linux-raw-sys" 2104 - version = "0.9.4" 2103 + version = "0.11.0" 2105 2104 source = "registry+https://github.com/rust-lang/crates.io-index" 2106 - checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 2105 + checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" 2107 2106 2108 2107 [[package]] 2109 2108 name = "litemap" 2110 - version = "0.8.0" 2109 + version = "0.8.1" 2111 2110 source = "registry+https://github.com/rust-lang/crates.io-index" 2112 - checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 2111 + checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" 2113 2112 2114 2113 [[package]] 2115 2114 name = "lock_api" 2116 - version = "0.4.13" 2115 + version = "0.4.14" 2117 2116 source = "registry+https://github.com/rust-lang/crates.io-index" 2118 - checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" 2117 + checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" 2119 2118 dependencies = [ 2120 - "autocfg", 2121 2119 "scopeguard", 2122 2120 ] 2123 2121 2124 2122 [[package]] 2125 2123 name = "log" 2126 - version = "0.4.27" 2124 + version = "0.4.28" 2127 2125 source = "registry+https://github.com/rust-lang/crates.io-index" 2128 - checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 2126 + checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" 2129 2127 2130 2128 [[package]] 2131 2129 name = "mac" ··· 2155 2153 dependencies = [ 2156 2154 "proc-macro2", 2157 2155 "quote", 2158 - "syn 2.0.104", 2156 + "syn 2.0.109", 2159 2157 ] 2160 2158 2161 2159 [[package]] ··· 2165 2163 checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" 2166 2164 2167 2165 [[package]] 2168 - name = "md-5" 2169 - version = "0.10.6" 2166 + name = "memchr" 2167 + version = "2.7.6" 2170 2168 source = "registry+https://github.com/rust-lang/crates.io-index" 2171 - checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" 2172 - dependencies = [ 2173 - "cfg-if", 2174 - "digest", 2175 - ] 2169 + checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" 2176 2170 2177 2171 [[package]] 2178 - name = "memchr" 2179 - version = "2.7.5" 2172 + name = "memmap2" 2173 + version = "0.9.9" 2180 2174 source = "registry+https://github.com/rust-lang/crates.io-index" 2181 - checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" 2175 + checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" 2176 + dependencies = [ 2177 + "libc", 2178 + ] 2182 2179 2183 2180 [[package]] 2184 2181 name = "memoffset" ··· 2194 2191 version = "0.3.17" 2195 2192 source = "registry+https://github.com/rust-lang/crates.io-index" 2196 2193 checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 2194 + 2195 + [[package]] 2196 + name = "minimal-lexical" 2197 + version = "0.2.1" 2198 + source = "registry+https://github.com/rust-lang/crates.io-index" 2199 + checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 2197 2200 2198 2201 [[package]] 2199 2202 name = "miniz_oxide" ··· 2207 2210 2208 2211 [[package]] 2209 2212 name = "mio" 2210 - version = "1.0.4" 2213 + version = "1.1.0" 2211 2214 source = "registry+https://github.com/rust-lang/crates.io-index" 2212 - checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 2215 + checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" 2213 2216 dependencies = [ 2214 2217 "libc", 2215 2218 "wasi 0.11.1+wasi-snapshot-preview1", 2216 - "windows-sys 0.59.0", 2219 + "windows-sys 0.61.2", 2220 + ] 2221 + 2222 + [[package]] 2223 + name = "moxcms" 2224 + version = "0.7.9" 2225 + source = "registry+https://github.com/rust-lang/crates.io-index" 2226 + checksum = "0fbdd3d7436f8b5e892b8b7ea114271ff0fa00bc5acae845d53b07d498616ef6" 2227 + dependencies = [ 2228 + "num-traits", 2229 + "pxfm", 2217 2230 ] 2218 2231 2219 2232 [[package]] 2220 2233 name = "muda" 2221 - version = "0.17.0" 2234 + version = "0.17.1" 2222 2235 source = "registry+https://github.com/rust-lang/crates.io-index" 2223 - checksum = "58b89bf91c19bf036347f1ab85a81c560f08c0667c8601bece664d860a600988" 2236 + checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" 2224 2237 dependencies = [ 2225 2238 "crossbeam-channel", 2226 2239 "dpi", 2227 2240 "gtk", 2228 2241 "keyboard-types", 2229 - "objc2 0.6.1", 2242 + "objc2 0.6.3", 2230 2243 "objc2-app-kit", 2231 2244 "objc2-core-foundation", 2232 - "objc2-foundation 0.3.1", 2245 + "objc2-foundation 0.3.2", 2233 2246 "once_cell", 2234 - "png", 2247 + "png 0.17.16", 2235 2248 "serde", 2236 - "thiserror 2.0.12", 2237 - "windows-sys 0.59.0", 2249 + "thiserror 2.0.17", 2250 + "windows-sys 0.60.2", 2238 2251 ] 2239 2252 2240 2253 [[package]] ··· 2243 2256 source = "registry+https://github.com/rust-lang/crates.io-index" 2244 2257 checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" 2245 2258 dependencies = [ 2246 - "bitflags 2.9.1", 2259 + "bitflags 2.10.0", 2247 2260 "jni-sys", 2248 2261 "log", 2249 2262 "ndk-sys", ··· 2279 2292 source = "registry+https://github.com/rust-lang/crates.io-index" 2280 2293 checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" 2281 2294 dependencies = [ 2282 - "bitflags 2.9.1", 2295 + "bitflags 2.10.0", 2283 2296 "cfg-if", 2284 2297 "cfg_aliases", 2285 2298 "libc", ··· 2293 2306 checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" 2294 2307 2295 2308 [[package]] 2296 - name = "num-bigint-dig" 2297 - version = "0.8.4" 2309 + name = "nom" 2310 + version = "7.1.3" 2298 2311 source = "registry+https://github.com/rust-lang/crates.io-index" 2299 - checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" 2312 + checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 2300 2313 dependencies = [ 2301 - "byteorder", 2302 - "lazy_static", 2303 - "libm", 2304 - "num-integer", 2305 - "num-iter", 2306 - "num-traits", 2307 - "rand 0.8.5", 2308 - "smallvec", 2309 - "zeroize", 2314 + "memchr", 2315 + "minimal-lexical", 2310 2316 ] 2311 2317 2312 2318 [[package]] 2313 - name = "num-conv" 2314 - version = "0.1.0" 2319 + name = "nom" 2320 + version = "8.0.0" 2315 2321 source = "registry+https://github.com/rust-lang/crates.io-index" 2316 - checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 2317 - 2318 - [[package]] 2319 - name = "num-integer" 2320 - version = "0.1.46" 2321 - source = "registry+https://github.com/rust-lang/crates.io-index" 2322 - checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 2322 + checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" 2323 2323 dependencies = [ 2324 - "num-traits", 2324 + "memchr", 2325 2325 ] 2326 2326 2327 2327 [[package]] 2328 - name = "num-iter" 2329 - version = "0.1.45" 2328 + name = "num-conv" 2329 + version = "0.1.0" 2330 2330 source = "registry+https://github.com/rust-lang/crates.io-index" 2331 - checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" 2332 - dependencies = [ 2333 - "autocfg", 2334 - "num-integer", 2335 - "num-traits", 2336 - ] 2331 + checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 2337 2332 2338 2333 [[package]] 2339 2334 name = "num-traits" ··· 2342 2337 checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 2343 2338 dependencies = [ 2344 2339 "autocfg", 2345 - "libm", 2346 2340 ] 2347 2341 2348 2342 [[package]] 2349 2343 name = "num_enum" 2350 - version = "0.7.4" 2344 + version = "0.7.5" 2351 2345 source = "registry+https://github.com/rust-lang/crates.io-index" 2352 - checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" 2346 + checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" 2353 2347 dependencies = [ 2354 2348 "num_enum_derive", 2355 2349 "rustversion", ··· 2357 2351 2358 2352 [[package]] 2359 2353 name = "num_enum_derive" 2360 - version = "0.7.4" 2354 + version = "0.7.5" 2361 2355 source = "registry+https://github.com/rust-lang/crates.io-index" 2362 - checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" 2356 + checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" 2363 2357 dependencies = [ 2364 - "proc-macro-crate 3.3.0", 2358 + "proc-macro-crate 3.4.0", 2365 2359 "proc-macro2", 2366 2360 "quote", 2367 - "syn 2.0.104", 2361 + "syn 2.0.109", 2368 2362 ] 2369 2363 2370 2364 [[package]] ··· 2385 2379 2386 2380 [[package]] 2387 2381 name = "objc2" 2388 - version = "0.6.1" 2382 + version = "0.6.3" 2389 2383 source = "registry+https://github.com/rust-lang/crates.io-index" 2390 - checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" 2384 + checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" 2391 2385 dependencies = [ 2392 2386 "objc2-encode", 2393 2387 "objc2-exception-helper", ··· 2395 2389 2396 2390 [[package]] 2397 2391 name = "objc2-app-kit" 2398 - version = "0.3.1" 2392 + version = "0.3.2" 2399 2393 source = "registry+https://github.com/rust-lang/crates.io-index" 2400 - checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" 2394 + checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" 2401 2395 dependencies = [ 2402 - "bitflags 2.9.1", 2403 - "block2 0.6.1", 2396 + "bitflags 2.10.0", 2397 + "block2 0.6.2", 2404 2398 "libc", 2405 - "objc2 0.6.1", 2399 + "objc2 0.6.3", 2406 2400 "objc2-cloud-kit", 2407 2401 "objc2-core-data", 2408 2402 "objc2-core-foundation", 2409 2403 "objc2-core-graphics", 2410 2404 "objc2-core-image", 2411 - "objc2-foundation 0.3.1", 2412 - "objc2-quartz-core 0.3.1", 2405 + "objc2-core-text", 2406 + "objc2-core-video", 2407 + "objc2-foundation 0.3.2", 2408 + "objc2-quartz-core 0.3.2", 2413 2409 ] 2414 2410 2415 2411 [[package]] 2416 2412 name = "objc2-cloud-kit" 2417 - version = "0.3.1" 2413 + version = "0.3.2" 2418 2414 source = "registry+https://github.com/rust-lang/crates.io-index" 2419 - checksum = "17614fdcd9b411e6ff1117dfb1d0150f908ba83a7df81b1f118005fe0a8ea15d" 2415 + checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" 2420 2416 dependencies = [ 2421 - "bitflags 2.9.1", 2422 - "objc2 0.6.1", 2423 - "objc2-foundation 0.3.1", 2417 + "bitflags 2.10.0", 2418 + "objc2 0.6.3", 2419 + "objc2-foundation 0.3.2", 2424 2420 ] 2425 2421 2426 2422 [[package]] 2427 2423 name = "objc2-core-data" 2428 - version = "0.3.1" 2424 + version = "0.3.2" 2429 2425 source = "registry+https://github.com/rust-lang/crates.io-index" 2430 - checksum = "291fbbf7d29287518e8686417cf7239c74700fd4b607623140a7d4a3c834329d" 2426 + checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" 2431 2427 dependencies = [ 2432 - "bitflags 2.9.1", 2433 - "objc2 0.6.1", 2434 - "objc2-foundation 0.3.1", 2428 + "bitflags 2.10.0", 2429 + "objc2 0.6.3", 2430 + "objc2-foundation 0.3.2", 2435 2431 ] 2436 2432 2437 2433 [[package]] 2438 2434 name = "objc2-core-foundation" 2439 - version = "0.3.1" 2435 + version = "0.3.2" 2440 2436 source = "registry+https://github.com/rust-lang/crates.io-index" 2441 - checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" 2437 + checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" 2442 2438 dependencies = [ 2443 - "bitflags 2.9.1", 2439 + "bitflags 2.10.0", 2444 2440 "dispatch2", 2445 - "objc2 0.6.1", 2441 + "objc2 0.6.3", 2446 2442 ] 2447 2443 2448 2444 [[package]] 2449 2445 name = "objc2-core-graphics" 2450 - version = "0.3.1" 2446 + version = "0.3.2" 2451 2447 source = "registry+https://github.com/rust-lang/crates.io-index" 2452 - checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" 2448 + checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" 2453 2449 dependencies = [ 2454 - "bitflags 2.9.1", 2450 + "bitflags 2.10.0", 2455 2451 "dispatch2", 2456 - "objc2 0.6.1", 2452 + "objc2 0.6.3", 2457 2453 "objc2-core-foundation", 2458 2454 "objc2-io-surface", 2459 2455 ] 2460 2456 2461 2457 [[package]] 2462 2458 name = "objc2-core-image" 2463 - version = "0.3.1" 2459 + version = "0.3.2" 2460 + source = "registry+https://github.com/rust-lang/crates.io-index" 2461 + checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" 2462 + dependencies = [ 2463 + "objc2 0.6.3", 2464 + "objc2-foundation 0.3.2", 2465 + ] 2466 + 2467 + [[package]] 2468 + name = "objc2-core-location" 2469 + version = "0.3.2" 2470 + source = "registry+https://github.com/rust-lang/crates.io-index" 2471 + checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" 2472 + dependencies = [ 2473 + "objc2 0.6.3", 2474 + "objc2-foundation 0.3.2", 2475 + ] 2476 + 2477 + [[package]] 2478 + name = "objc2-core-text" 2479 + version = "0.3.2" 2480 + source = "registry+https://github.com/rust-lang/crates.io-index" 2481 + checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" 2482 + dependencies = [ 2483 + "bitflags 2.10.0", 2484 + "objc2 0.6.3", 2485 + "objc2-core-foundation", 2486 + "objc2-core-graphics", 2487 + ] 2488 + 2489 + [[package]] 2490 + name = "objc2-core-video" 2491 + version = "0.3.2" 2464 2492 source = "registry+https://github.com/rust-lang/crates.io-index" 2465 - checksum = "79b3dc0cc4386b6ccf21c157591b34a7f44c8e75b064f85502901ab2188c007e" 2493 + checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" 2466 2494 dependencies = [ 2467 - "objc2 0.6.1", 2468 - "objc2-foundation 0.3.1", 2495 + "bitflags 2.10.0", 2496 + "objc2 0.6.3", 2497 + "objc2-core-foundation", 2498 + "objc2-core-graphics", 2499 + "objc2-io-surface", 2469 2500 ] 2470 2501 2471 2502 [[package]] ··· 2489 2520 source = "registry+https://github.com/rust-lang/crates.io-index" 2490 2521 checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" 2491 2522 dependencies = [ 2492 - "bitflags 2.9.1", 2523 + "bitflags 2.10.0", 2493 2524 "block2 0.5.1", 2494 2525 "libc", 2495 2526 "objc2 0.5.2", ··· 2497 2528 2498 2529 [[package]] 2499 2530 name = "objc2-foundation" 2500 - version = "0.3.1" 2531 + version = "0.3.2" 2501 2532 source = "registry+https://github.com/rust-lang/crates.io-index" 2502 - checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" 2533 + checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" 2503 2534 dependencies = [ 2504 - "bitflags 2.9.1", 2505 - "block2 0.6.1", 2535 + "bitflags 2.10.0", 2536 + "block2 0.6.2", 2506 2537 "libc", 2507 - "objc2 0.6.1", 2538 + "objc2 0.6.3", 2508 2539 "objc2-core-foundation", 2509 2540 ] 2510 2541 2511 2542 [[package]] 2512 2543 name = "objc2-io-surface" 2513 - version = "0.3.1" 2544 + version = "0.3.2" 2545 + source = "registry+https://github.com/rust-lang/crates.io-index" 2546 + checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" 2547 + dependencies = [ 2548 + "bitflags 2.10.0", 2549 + "objc2 0.6.3", 2550 + "objc2-core-foundation", 2551 + ] 2552 + 2553 + [[package]] 2554 + name = "objc2-javascript-core" 2555 + version = "0.3.2" 2514 2556 source = "registry+https://github.com/rust-lang/crates.io-index" 2515 - checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" 2557 + checksum = "2a1e6550c4caed348956ce3370c9ffeca70bb1dbed4fa96112e7c6170e074586" 2516 2558 dependencies = [ 2517 - "bitflags 2.9.1", 2518 - "objc2 0.6.1", 2559 + "objc2 0.6.3", 2519 2560 "objc2-core-foundation", 2520 2561 ] 2521 2562 ··· 2525 2566 source = "registry+https://github.com/rust-lang/crates.io-index" 2526 2567 checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" 2527 2568 dependencies = [ 2528 - "bitflags 2.9.1", 2569 + "bitflags 2.10.0", 2529 2570 "block2 0.5.1", 2530 2571 "objc2 0.5.2", 2531 2572 "objc2-foundation 0.2.2", ··· 2537 2578 source = "registry+https://github.com/rust-lang/crates.io-index" 2538 2579 checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" 2539 2580 dependencies = [ 2540 - "bitflags 2.9.1", 2581 + "bitflags 2.10.0", 2541 2582 "block2 0.5.1", 2542 2583 "objc2 0.5.2", 2543 2584 "objc2-foundation 0.2.2", ··· 2546 2587 2547 2588 [[package]] 2548 2589 name = "objc2-quartz-core" 2549 - version = "0.3.1" 2590 + version = "0.3.2" 2550 2591 source = "registry+https://github.com/rust-lang/crates.io-index" 2551 - checksum = "90ffb6a0cd5f182dc964334388560b12a57f7b74b3e2dec5e2722aa2dfb2ccd5" 2592 + checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" 2552 2593 dependencies = [ 2553 - "bitflags 2.9.1", 2554 - "objc2 0.6.1", 2555 - "objc2-foundation 0.3.1", 2594 + "bitflags 2.10.0", 2595 + "objc2 0.6.3", 2596 + "objc2-core-foundation", 2597 + "objc2-foundation 0.3.2", 2556 2598 ] 2557 2599 2558 2600 [[package]] 2559 - name = "objc2-ui-kit" 2560 - version = "0.3.1" 2601 + name = "objc2-security" 2602 + version = "0.3.2" 2561 2603 source = "registry+https://github.com/rust-lang/crates.io-index" 2562 - checksum = "25b1312ad7bc8a0e92adae17aa10f90aae1fb618832f9b993b022b591027daed" 2604 + checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" 2563 2605 dependencies = [ 2564 - "bitflags 2.9.1", 2565 - "objc2 0.6.1", 2606 + "bitflags 2.10.0", 2607 + "objc2 0.6.3", 2566 2608 "objc2-core-foundation", 2567 - "objc2-foundation 0.3.1", 2568 2609 ] 2569 2610 2570 2611 [[package]] 2571 - name = "objc2-web-kit" 2572 - version = "0.3.1" 2612 + name = "objc2-ui-kit" 2613 + version = "0.3.2" 2573 2614 source = "registry+https://github.com/rust-lang/crates.io-index" 2574 - checksum = "91672909de8b1ce1c2252e95bbee8c1649c9ad9d14b9248b3d7b4c47903c47ad" 2615 + checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" 2575 2616 dependencies = [ 2576 - "bitflags 2.9.1", 2577 - "block2 0.6.1", 2578 - "objc2 0.6.1", 2579 - "objc2-app-kit", 2617 + "bitflags 2.10.0", 2618 + "block2 0.6.2", 2619 + "objc2 0.6.3", 2620 + "objc2-cloud-kit", 2621 + "objc2-core-data", 2580 2622 "objc2-core-foundation", 2581 - "objc2-foundation 0.3.1", 2623 + "objc2-core-graphics", 2624 + "objc2-core-image", 2625 + "objc2-core-location", 2626 + "objc2-core-text", 2627 + "objc2-foundation 0.3.2", 2628 + "objc2-quartz-core 0.3.2", 2629 + "objc2-user-notifications", 2582 2630 ] 2583 2631 2584 2632 [[package]] 2585 - name = "object" 2586 - version = "0.36.7" 2633 + name = "objc2-user-notifications" 2634 + version = "0.3.2" 2587 2635 source = "registry+https://github.com/rust-lang/crates.io-index" 2588 - checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 2636 + checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" 2589 2637 dependencies = [ 2590 - "memchr", 2638 + "objc2 0.6.3", 2639 + "objc2-foundation 0.3.2", 2640 + ] 2641 + 2642 + [[package]] 2643 + name = "objc2-web-kit" 2644 + version = "0.3.2" 2645 + source = "registry+https://github.com/rust-lang/crates.io-index" 2646 + checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" 2647 + dependencies = [ 2648 + "bitflags 2.10.0", 2649 + "block2 0.6.2", 2650 + "objc2 0.6.3", 2651 + "objc2-app-kit", 2652 + "objc2-core-foundation", 2653 + "objc2-foundation 0.3.2", 2654 + "objc2-javascript-core", 2655 + "objc2-security", 2591 2656 ] 2592 2657 2593 2658 [[package]] ··· 2625 2690 ] 2626 2691 2627 2692 [[package]] 2693 + name = "os_info" 2694 + version = "3.13.0" 2695 + source = "registry+https://github.com/rust-lang/crates.io-index" 2696 + checksum = "7c39b5918402d564846d5aba164c09a66cc88d232179dfd3e3c619a25a268392" 2697 + dependencies = [ 2698 + "android_system_properties", 2699 + "log", 2700 + "nix", 2701 + "objc2 0.6.3", 2702 + "objc2-foundation 0.3.2", 2703 + "objc2-ui-kit", 2704 + "serde", 2705 + "windows-sys 0.61.2", 2706 + ] 2707 + 2708 + [[package]] 2709 + name = "os_pipe" 2710 + version = "1.2.3" 2711 + source = "registry+https://github.com/rust-lang/crates.io-index" 2712 + checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" 2713 + dependencies = [ 2714 + "libc", 2715 + "windows-sys 0.61.2", 2716 + ] 2717 + 2718 + [[package]] 2628 2719 name = "pango" 2629 2720 version = "0.18.3" 2630 2721 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2657 2748 2658 2749 [[package]] 2659 2750 name = "parking_lot" 2660 - version = "0.12.4" 2751 + version = "0.12.5" 2661 2752 source = "registry+https://github.com/rust-lang/crates.io-index" 2662 - checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" 2753 + checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" 2663 2754 dependencies = [ 2664 2755 "lock_api", 2665 2756 "parking_lot_core", ··· 2667 2758 2668 2759 [[package]] 2669 2760 name = "parking_lot_core" 2670 - version = "0.9.11" 2761 + version = "0.9.12" 2671 2762 source = "registry+https://github.com/rust-lang/crates.io-index" 2672 - checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" 2763 + checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" 2673 2764 dependencies = [ 2674 2765 "cfg-if", 2675 2766 "libc", 2676 2767 "redox_syscall", 2677 2768 "smallvec", 2678 - "windows-targets 0.52.6", 2769 + "windows-link 0.2.1", 2679 2770 ] 2680 2771 2681 2772 [[package]] ··· 2685 2776 checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" 2686 2777 2687 2778 [[package]] 2688 - name = "pem-rfc7468" 2689 - version = "0.7.0" 2779 + name = "percent-encoding" 2780 + version = "2.3.2" 2690 2781 source = "registry+https://github.com/rust-lang/crates.io-index" 2691 - checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" 2692 - dependencies = [ 2693 - "base64ct", 2694 - ] 2782 + checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 2695 2783 2696 2784 [[package]] 2697 - name = "percent-encoding" 2698 - version = "2.3.1" 2785 + name = "petgraph" 2786 + version = "0.8.3" 2699 2787 source = "registry+https://github.com/rust-lang/crates.io-index" 2700 - checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 2788 + checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" 2789 + dependencies = [ 2790 + "fixedbitset", 2791 + "hashbrown 0.15.5", 2792 + "indexmap 2.12.0", 2793 + ] 2701 2794 2702 2795 [[package]] 2703 2796 name = "phf" ··· 2803 2896 "phf_shared 0.11.3", 2804 2897 "proc-macro2", 2805 2898 "quote", 2806 - "syn 2.0.104", 2899 + "syn 2.0.109", 2807 2900 ] 2808 2901 2809 2902 [[package]] ··· 2857 2950 ] 2858 2951 2859 2952 [[package]] 2860 - name = "pkcs1" 2861 - version = "0.7.5" 2862 - source = "registry+https://github.com/rust-lang/crates.io-index" 2863 - checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" 2864 - dependencies = [ 2865 - "der", 2866 - "pkcs8", 2867 - "spki", 2868 - ] 2869 - 2870 - [[package]] 2871 - name = "pkcs8" 2872 - version = "0.10.2" 2873 - source = "registry+https://github.com/rust-lang/crates.io-index" 2874 - checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" 2875 - dependencies = [ 2876 - "der", 2877 - "spki", 2878 - ] 2879 - 2880 - [[package]] 2881 2953 name = "pkg-config" 2882 2954 version = "0.3.32" 2883 2955 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2885 2957 2886 2958 [[package]] 2887 2959 name = "plist" 2888 - version = "1.7.4" 2960 + version = "1.8.0" 2889 2961 source = "registry+https://github.com/rust-lang/crates.io-index" 2890 - checksum = "3af6b589e163c5a788fab00ce0c0366f6efbb9959c2f9874b224936af7fce7e1" 2962 + checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" 2891 2963 dependencies = [ 2892 2964 "base64 0.22.1", 2893 - "indexmap 2.10.0", 2894 - "quick-xml", 2965 + "indexmap 2.12.0", 2966 + "quick-xml 0.38.3", 2895 2967 "serde", 2896 2968 "time", 2897 2969 ] ··· 2910 2982 ] 2911 2983 2912 2984 [[package]] 2985 + name = "png" 2986 + version = "0.18.0" 2987 + source = "registry+https://github.com/rust-lang/crates.io-index" 2988 + checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" 2989 + dependencies = [ 2990 + "bitflags 2.10.0", 2991 + "crc32fast", 2992 + "fdeflate", 2993 + "flate2", 2994 + "miniz_oxide", 2995 + ] 2996 + 2997 + [[package]] 2913 2998 name = "polling" 2914 - version = "3.9.0" 2999 + version = "3.11.0" 2915 3000 source = "registry+https://github.com/rust-lang/crates.io-index" 2916 - checksum = "8ee9b2fa7a4517d2c91ff5bc6c297a427a96749d15f98fcdbb22c05571a4d4b7" 3001 + checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" 2917 3002 dependencies = [ 2918 3003 "cfg-if", 2919 3004 "concurrent-queue", 2920 3005 "hermit-abi", 2921 3006 "pin-project-lite", 2922 - "rustix", 2923 - "windows-sys 0.60.2", 3007 + "rustix 1.1.2", 3008 + "windows-sys 0.61.2", 2924 3009 ] 2925 3010 2926 3011 [[package]] 2927 3012 name = "potential_utf" 2928 - version = "0.1.2" 3013 + version = "0.1.4" 2929 3014 source = "registry+https://github.com/rust-lang/crates.io-index" 2930 - checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" 3015 + checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" 2931 3016 dependencies = [ 2932 3017 "zerovec", 2933 3018 ] ··· 2965 3050 2966 3051 [[package]] 2967 3052 name = "proc-macro-crate" 2968 - version = "2.0.0" 3053 + version = "2.0.2" 2969 3054 source = "registry+https://github.com/rust-lang/crates.io-index" 2970 - checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" 3055 + checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" 2971 3056 dependencies = [ 2972 - "toml_edit 0.20.7", 3057 + "toml_datetime 0.6.3", 3058 + "toml_edit 0.20.2", 2973 3059 ] 2974 3060 2975 3061 [[package]] 2976 3062 name = "proc-macro-crate" 2977 - version = "3.3.0" 3063 + version = "3.4.0" 2978 3064 source = "registry+https://github.com/rust-lang/crates.io-index" 2979 - checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" 3065 + checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" 2980 3066 dependencies = [ 2981 - "toml_edit 0.22.27", 3067 + "toml_edit 0.23.7", 2982 3068 ] 2983 3069 2984 3070 [[package]] ··· 3013 3099 3014 3100 [[package]] 3015 3101 name = "proc-macro2" 3016 - version = "1.0.95" 3102 + version = "1.0.103" 3017 3103 source = "registry+https://github.com/rust-lang/crates.io-index" 3018 - checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 3104 + checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" 3019 3105 dependencies = [ 3020 3106 "unicode-ident", 3021 3107 ] 3022 3108 3023 3109 [[package]] 3110 + name = "pxfm" 3111 + version = "0.1.25" 3112 + source = "registry+https://github.com/rust-lang/crates.io-index" 3113 + checksum = "a3cbdf373972bf78df4d3b518d07003938e2c7d1fb5891e55f9cb6df57009d84" 3114 + dependencies = [ 3115 + "num-traits", 3116 + ] 3117 + 3118 + [[package]] 3119 + name = "quick-error" 3120 + version = "2.0.1" 3121 + source = "registry+https://github.com/rust-lang/crates.io-index" 3122 + checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" 3123 + 3124 + [[package]] 3024 3125 name = "quick-xml" 3025 - version = "0.38.0" 3126 + version = "0.37.5" 3127 + source = "registry+https://github.com/rust-lang/crates.io-index" 3128 + checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" 3129 + dependencies = [ 3130 + "memchr", 3131 + ] 3132 + 3133 + [[package]] 3134 + name = "quick-xml" 3135 + version = "0.38.3" 3026 3136 source = "registry+https://github.com/rust-lang/crates.io-index" 3027 - checksum = "8927b0664f5c5a98265138b7e3f90aa19a6b21353182469ace36d4ac527b7b1b" 3137 + checksum = "42a232e7487fc2ef313d96dde7948e7a3c05101870d8985e4fd8d26aedd27b89" 3028 3138 dependencies = [ 3029 3139 "memchr", 3030 3140 ] 3031 3141 3032 3142 [[package]] 3033 3143 name = "quote" 3034 - version = "1.0.40" 3144 + version = "1.0.42" 3035 3145 source = "registry+https://github.com/rust-lang/crates.io-index" 3036 - checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 3146 + checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" 3037 3147 dependencies = [ 3038 3148 "proc-macro2", 3039 3149 ] ··· 3070 3180 ] 3071 3181 3072 3182 [[package]] 3183 + name = "rand" 3184 + version = "0.9.2" 3185 + source = "registry+https://github.com/rust-lang/crates.io-index" 3186 + checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" 3187 + dependencies = [ 3188 + "rand_chacha 0.9.0", 3189 + "rand_core 0.9.3", 3190 + ] 3191 + 3192 + [[package]] 3073 3193 name = "rand_chacha" 3074 3194 version = "0.2.2" 3075 3195 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3090 3210 ] 3091 3211 3092 3212 [[package]] 3213 + name = "rand_chacha" 3214 + version = "0.9.0" 3215 + source = "registry+https://github.com/rust-lang/crates.io-index" 3216 + checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 3217 + dependencies = [ 3218 + "ppv-lite86", 3219 + "rand_core 0.9.3", 3220 + ] 3221 + 3222 + [[package]] 3093 3223 name = "rand_core" 3094 3224 version = "0.5.1" 3095 3225 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3105 3235 checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 3106 3236 dependencies = [ 3107 3237 "getrandom 0.2.16", 3238 + ] 3239 + 3240 + [[package]] 3241 + name = "rand_core" 3242 + version = "0.9.3" 3243 + source = "registry+https://github.com/rust-lang/crates.io-index" 3244 + checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 3245 + dependencies = [ 3246 + "getrandom 0.3.4", 3108 3247 ] 3109 3248 3110 3249 [[package]] ··· 3133 3272 3134 3273 [[package]] 3135 3274 name = "redox_syscall" 3136 - version = "0.5.17" 3275 + version = "0.5.18" 3137 3276 source = "registry+https://github.com/rust-lang/crates.io-index" 3138 - checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" 3277 + checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" 3139 3278 dependencies = [ 3140 - "bitflags 2.9.1", 3279 + "bitflags 2.10.0", 3141 3280 ] 3142 3281 3143 3282 [[package]] 3144 3283 name = "redox_users" 3145 - version = "0.5.0" 3284 + version = "0.5.2" 3146 3285 source = "registry+https://github.com/rust-lang/crates.io-index" 3147 - checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" 3286 + checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" 3148 3287 dependencies = [ 3149 3288 "getrandom 0.2.16", 3150 3289 "libredox", 3151 - "thiserror 2.0.12", 3290 + "thiserror 2.0.17", 3152 3291 ] 3153 3292 3154 3293 [[package]] 3155 3294 name = "ref-cast" 3156 - version = "1.0.24" 3295 + version = "1.0.25" 3157 3296 source = "registry+https://github.com/rust-lang/crates.io-index" 3158 - checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" 3297 + checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" 3159 3298 dependencies = [ 3160 3299 "ref-cast-impl", 3161 3300 ] 3162 3301 3163 3302 [[package]] 3164 3303 name = "ref-cast-impl" 3165 - version = "1.0.24" 3304 + version = "1.0.25" 3166 3305 source = "registry+https://github.com/rust-lang/crates.io-index" 3167 - checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" 3306 + checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" 3168 3307 dependencies = [ 3169 3308 "proc-macro2", 3170 3309 "quote", 3171 - "syn 2.0.104", 3310 + "syn 2.0.109", 3172 3311 ] 3173 3312 3174 3313 [[package]] 3175 3314 name = "regex" 3176 - version = "1.11.1" 3315 + version = "1.12.2" 3177 3316 source = "registry+https://github.com/rust-lang/crates.io-index" 3178 - checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 3317 + checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" 3179 3318 dependencies = [ 3180 3319 "aho-corasick", 3181 3320 "memchr", ··· 3185 3324 3186 3325 [[package]] 3187 3326 name = "regex-automata" 3188 - version = "0.4.9" 3327 + version = "0.4.13" 3189 3328 source = "registry+https://github.com/rust-lang/crates.io-index" 3190 - checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 3329 + checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" 3191 3330 dependencies = [ 3192 3331 "aho-corasick", 3193 3332 "memchr", ··· 3196 3335 3197 3336 [[package]] 3198 3337 name = "regex-syntax" 3199 - version = "0.8.5" 3338 + version = "0.8.8" 3200 3339 source = "registry+https://github.com/rust-lang/crates.io-index" 3201 - checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 3340 + checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" 3202 3341 3203 3342 [[package]] 3204 3343 name = "reqwest" 3205 - version = "0.12.22" 3344 + version = "0.12.24" 3206 3345 source = "registry+https://github.com/rust-lang/crates.io-index" 3207 - checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" 3346 + checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" 3208 3347 dependencies = [ 3209 3348 "base64 0.22.1", 3210 3349 "bytes", ··· 3236 3375 ] 3237 3376 3238 3377 [[package]] 3239 - name = "rsa" 3240 - version = "0.9.8" 3378 + name = "rfd" 3379 + version = "0.15.4" 3241 3380 source = "registry+https://github.com/rust-lang/crates.io-index" 3242 - checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" 3381 + checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" 3243 3382 dependencies = [ 3244 - "const-oid", 3245 - "digest", 3246 - "num-bigint-dig", 3247 - "num-integer", 3248 - "num-traits", 3249 - "pkcs1", 3250 - "pkcs8", 3251 - "rand_core 0.6.4", 3252 - "signature", 3253 - "spki", 3254 - "subtle", 3255 - "zeroize", 3383 + "ashpd", 3384 + "block2 0.6.2", 3385 + "dispatch2", 3386 + "glib-sys", 3387 + "gobject-sys", 3388 + "gtk-sys", 3389 + "js-sys", 3390 + "log", 3391 + "objc2 0.6.3", 3392 + "objc2-app-kit", 3393 + "objc2-core-foundation", 3394 + "objc2-foundation 0.3.2", 3395 + "raw-window-handle", 3396 + "wasm-bindgen", 3397 + "wasm-bindgen-futures", 3398 + "web-sys", 3399 + "windows-sys 0.59.0", 3256 3400 ] 3257 3401 3258 3402 [[package]] 3259 - name = "rustc-demangle" 3260 - version = "0.1.26" 3261 - source = "registry+https://github.com/rust-lang/crates.io-index" 3262 - checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" 3263 - 3264 - [[package]] 3265 3403 name = "rustc_version" 3266 3404 version = "0.4.1" 3267 3405 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3272 3410 3273 3411 [[package]] 3274 3412 name = "rustix" 3275 - version = "1.0.8" 3413 + version = "0.38.44" 3414 + source = "registry+https://github.com/rust-lang/crates.io-index" 3415 + checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 3416 + dependencies = [ 3417 + "bitflags 2.10.0", 3418 + "errno", 3419 + "libc", 3420 + "linux-raw-sys 0.4.15", 3421 + "windows-sys 0.59.0", 3422 + ] 3423 + 3424 + [[package]] 3425 + name = "rustix" 3426 + version = "1.1.2" 3276 3427 source = "registry+https://github.com/rust-lang/crates.io-index" 3277 - checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" 3428 + checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" 3278 3429 dependencies = [ 3279 - "bitflags 2.9.1", 3430 + "bitflags 2.10.0", 3280 3431 "errno", 3281 3432 "libc", 3282 - "linux-raw-sys", 3283 - "windows-sys 0.60.2", 3433 + "linux-raw-sys 0.11.0", 3434 + "windows-sys 0.61.2", 3284 3435 ] 3285 3436 3286 3437 [[package]] 3287 3438 name = "rustversion" 3288 - version = "1.0.21" 3439 + version = "1.0.22" 3289 3440 source = "registry+https://github.com/rust-lang/crates.io-index" 3290 - checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" 3441 + checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 3291 3442 3292 3443 [[package]] 3293 3444 name = "ryu" ··· 3333 3484 3334 3485 [[package]] 3335 3486 name = "schemars" 3336 - version = "1.0.4" 3487 + version = "1.1.0" 3337 3488 source = "registry+https://github.com/rust-lang/crates.io-index" 3338 - checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" 3489 + checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" 3339 3490 dependencies = [ 3340 3491 "dyn-clone", 3341 3492 "ref-cast", ··· 3352 3503 "proc-macro2", 3353 3504 "quote", 3354 3505 "serde_derive_internals", 3355 - "syn 2.0.104", 3506 + "syn 2.0.109", 3356 3507 ] 3357 3508 3358 3509 [[package]] 3510 + name = "scoped-tls" 3511 + version = "1.0.1" 3512 + source = "registry+https://github.com/rust-lang/crates.io-index" 3513 + checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 3514 + 3515 + [[package]] 3359 3516 name = "scopeguard" 3360 3517 version = "1.2.0" 3361 3518 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3381 3538 3382 3539 [[package]] 3383 3540 name = "semver" 3384 - version = "1.0.26" 3541 + version = "1.0.27" 3385 3542 source = "registry+https://github.com/rust-lang/crates.io-index" 3386 - checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" 3543 + checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" 3387 3544 dependencies = [ 3388 3545 "serde", 3546 + "serde_core", 3389 3547 ] 3390 3548 3391 3549 [[package]] 3392 3550 name = "serde" 3393 - version = "1.0.219" 3551 + version = "1.0.228" 3394 3552 source = "registry+https://github.com/rust-lang/crates.io-index" 3395 - checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 3553 + checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 3396 3554 dependencies = [ 3555 + "serde_core", 3397 3556 "serde_derive", 3398 3557 ] 3399 3558 3400 3559 [[package]] 3401 3560 name = "serde-untagged" 3402 - version = "0.1.7" 3561 + version = "0.1.9" 3403 3562 source = "registry+https://github.com/rust-lang/crates.io-index" 3404 - checksum = "299d9c19d7d466db4ab10addd5703e4c615dec2a5a16dbbafe191045e87ee66e" 3563 + checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" 3405 3564 dependencies = [ 3406 3565 "erased-serde", 3407 3566 "serde", 3567 + "serde_core", 3408 3568 "typeid", 3409 3569 ] 3410 3570 3411 3571 [[package]] 3572 + name = "serde_core" 3573 + version = "1.0.228" 3574 + source = "registry+https://github.com/rust-lang/crates.io-index" 3575 + checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" 3576 + dependencies = [ 3577 + "serde_derive", 3578 + ] 3579 + 3580 + [[package]] 3412 3581 name = "serde_derive" 3413 - version = "1.0.219" 3582 + version = "1.0.228" 3414 3583 source = "registry+https://github.com/rust-lang/crates.io-index" 3415 - checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 3584 + checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 3416 3585 dependencies = [ 3417 3586 "proc-macro2", 3418 3587 "quote", 3419 - "syn 2.0.104", 3588 + "syn 2.0.109", 3420 3589 ] 3421 3590 3422 3591 [[package]] ··· 3427 3596 dependencies = [ 3428 3597 "proc-macro2", 3429 3598 "quote", 3430 - "syn 2.0.104", 3599 + "syn 2.0.109", 3431 3600 ] 3432 3601 3433 3602 [[package]] 3434 3603 name = "serde_json" 3435 - version = "1.0.141" 3604 + version = "1.0.145" 3436 3605 source = "registry+https://github.com/rust-lang/crates.io-index" 3437 - checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" 3606 + checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" 3438 3607 dependencies = [ 3439 3608 "itoa", 3440 3609 "memchr", 3441 3610 "ryu", 3442 3611 "serde", 3612 + "serde_core", 3443 3613 ] 3444 3614 3445 3615 [[package]] ··· 3450 3620 dependencies = [ 3451 3621 "proc-macro2", 3452 3622 "quote", 3453 - "syn 2.0.104", 3623 + "syn 2.0.109", 3454 3624 ] 3455 3625 3456 3626 [[package]] ··· 3464 3634 3465 3635 [[package]] 3466 3636 name = "serde_spanned" 3467 - version = "1.0.0" 3637 + version = "1.0.3" 3468 3638 source = "registry+https://github.com/rust-lang/crates.io-index" 3469 - checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" 3639 + checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" 3470 3640 dependencies = [ 3471 - "serde", 3641 + "serde_core", 3472 3642 ] 3473 3643 3474 3644 [[package]] ··· 3485 3655 3486 3656 [[package]] 3487 3657 name = "serde_with" 3488 - version = "3.14.0" 3658 + version = "3.15.1" 3489 3659 source = "registry+https://github.com/rust-lang/crates.io-index" 3490 - checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" 3660 + checksum = "aa66c845eee442168b2c8134fec70ac50dc20e760769c8ba0ad1319ca1959b04" 3491 3661 dependencies = [ 3492 3662 "base64 0.22.1", 3493 3663 "chrono", 3494 3664 "hex", 3495 3665 "indexmap 1.9.3", 3496 - "indexmap 2.10.0", 3666 + "indexmap 2.12.0", 3497 3667 "schemars 0.9.0", 3498 - "schemars 1.0.4", 3499 - "serde", 3500 - "serde_derive", 3668 + "schemars 1.1.0", 3669 + "serde_core", 3501 3670 "serde_json", 3502 3671 "serde_with_macros", 3503 3672 "time", ··· 3505 3674 3506 3675 [[package]] 3507 3676 name = "serde_with_macros" 3508 - version = "3.14.0" 3677 + version = "3.15.1" 3509 3678 source = "registry+https://github.com/rust-lang/crates.io-index" 3510 - checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" 3679 + checksum = "b91a903660542fced4e99881aa481bdbaec1634568ee02e0b8bd57c64cb38955" 3511 3680 dependencies = [ 3512 3681 "darling", 3513 3682 "proc-macro2", 3514 3683 "quote", 3515 - "syn 2.0.104", 3684 + "syn 2.0.109", 3516 3685 ] 3517 3686 3518 3687 [[package]] 3519 3688 name = "serialize-to-javascript" 3520 - version = "0.1.1" 3689 + version = "0.1.2" 3521 3690 source = "registry+https://github.com/rust-lang/crates.io-index" 3522 - checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" 3691 + checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" 3523 3692 dependencies = [ 3524 3693 "serde", 3525 3694 "serde_json", ··· 3528 3697 3529 3698 [[package]] 3530 3699 name = "serialize-to-javascript-impl" 3531 - version = "0.1.1" 3700 + version = "0.1.2" 3532 3701 source = "registry+https://github.com/rust-lang/crates.io-index" 3533 - checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" 3702 + checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" 3534 3703 dependencies = [ 3535 3704 "proc-macro2", 3536 3705 "quote", 3537 - "syn 1.0.109", 3706 + "syn 2.0.109", 3538 3707 ] 3539 3708 3540 3709 [[package]] ··· 3548 3717 ] 3549 3718 3550 3719 [[package]] 3551 - name = "sha1" 3552 - version = "0.10.6" 3553 - source = "registry+https://github.com/rust-lang/crates.io-index" 3554 - checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 3555 - dependencies = [ 3556 - "cfg-if", 3557 - "cpufeatures", 3558 - "digest", 3559 - ] 3560 - 3561 - [[package]] 3562 3720 name = "sha2" 3563 3721 version = "0.10.9" 3564 3722 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3577 3735 3578 3736 [[package]] 3579 3737 name = "signal-hook-registry" 3580 - version = "1.4.5" 3738 + version = "1.4.6" 3581 3739 source = "registry+https://github.com/rust-lang/crates.io-index" 3582 - checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" 3740 + checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" 3583 3741 dependencies = [ 3584 3742 "libc", 3585 3743 ] 3586 3744 3587 3745 [[package]] 3588 - name = "signature" 3589 - version = "2.2.0" 3590 - source = "registry+https://github.com/rust-lang/crates.io-index" 3591 - checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 3592 - dependencies = [ 3593 - "digest", 3594 - "rand_core 0.6.4", 3595 - ] 3596 - 3597 - [[package]] 3598 3746 name = "simd-adler32" 3599 3747 version = "0.3.7" 3600 3748 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3614 3762 3615 3763 [[package]] 3616 3764 name = "slab" 3617 - version = "0.4.10" 3765 + version = "0.4.11" 3618 3766 source = "registry+https://github.com/rust-lang/crates.io-index" 3619 - checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" 3767 + checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" 3620 3768 3621 3769 [[package]] 3622 3770 name = "smallvec" 3623 3771 version = "1.15.1" 3624 3772 source = "registry+https://github.com/rust-lang/crates.io-index" 3625 3773 checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 3626 - dependencies = [ 3627 - "serde", 3628 - ] 3629 3774 3630 3775 [[package]] 3631 3776 name = "socket2" 3632 - version = "0.6.0" 3777 + version = "0.6.1" 3633 3778 source = "registry+https://github.com/rust-lang/crates.io-index" 3634 - checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" 3779 + checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" 3635 3780 dependencies = [ 3636 3781 "libc", 3637 - "windows-sys 0.59.0", 3782 + "windows-sys 0.60.2", 3638 3783 ] 3639 3784 3640 3785 [[package]] ··· 3645 3790 dependencies = [ 3646 3791 "bytemuck", 3647 3792 "cfg_aliases", 3648 - "core-graphics", 3793 + "core-graphics 0.24.0", 3649 3794 "foreign-types", 3650 3795 "js-sys", 3651 3796 "log", ··· 3686 3831 ] 3687 3832 3688 3833 [[package]] 3689 - name = "spin" 3690 - version = "0.9.8" 3691 - source = "registry+https://github.com/rust-lang/crates.io-index" 3692 - checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 3693 - dependencies = [ 3694 - "lock_api", 3695 - ] 3696 - 3697 - [[package]] 3698 - name = "spki" 3699 - version = "0.7.3" 3700 - source = "registry+https://github.com/rust-lang/crates.io-index" 3701 - checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" 3702 - dependencies = [ 3703 - "base64ct", 3704 - "der", 3705 - ] 3706 - 3707 - [[package]] 3708 - name = "sqlx" 3709 - version = "0.8.6" 3710 - source = "registry+https://github.com/rust-lang/crates.io-index" 3711 - checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" 3712 - dependencies = [ 3713 - "sqlx-core", 3714 - "sqlx-macros", 3715 - "sqlx-mysql", 3716 - "sqlx-postgres", 3717 - "sqlx-sqlite", 3718 - ] 3719 - 3720 - [[package]] 3721 - name = "sqlx-core" 3722 - version = "0.8.6" 3723 - source = "registry+https://github.com/rust-lang/crates.io-index" 3724 - checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" 3725 - dependencies = [ 3726 - "base64 0.22.1", 3727 - "bytes", 3728 - "crc", 3729 - "crossbeam-queue", 3730 - "either", 3731 - "event-listener", 3732 - "futures-core", 3733 - "futures-intrusive", 3734 - "futures-io", 3735 - "futures-util", 3736 - "hashbrown 0.15.4", 3737 - "hashlink", 3738 - "indexmap 2.10.0", 3739 - "log", 3740 - "memchr", 3741 - "once_cell", 3742 - "percent-encoding", 3743 - "serde", 3744 - "serde_json", 3745 - "sha2", 3746 - "smallvec", 3747 - "thiserror 2.0.12", 3748 - "tokio", 3749 - "tokio-stream", 3750 - "tracing", 3751 - "url", 3752 - ] 3753 - 3754 - [[package]] 3755 - name = "sqlx-macros" 3756 - version = "0.8.6" 3757 - source = "registry+https://github.com/rust-lang/crates.io-index" 3758 - checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" 3759 - dependencies = [ 3760 - "proc-macro2", 3761 - "quote", 3762 - "sqlx-core", 3763 - "sqlx-macros-core", 3764 - "syn 2.0.104", 3765 - ] 3766 - 3767 - [[package]] 3768 - name = "sqlx-macros-core" 3769 - version = "0.8.6" 3770 - source = "registry+https://github.com/rust-lang/crates.io-index" 3771 - checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" 3772 - dependencies = [ 3773 - "dotenvy", 3774 - "either", 3775 - "heck 0.5.0", 3776 - "hex", 3777 - "once_cell", 3778 - "proc-macro2", 3779 - "quote", 3780 - "serde", 3781 - "serde_json", 3782 - "sha2", 3783 - "sqlx-core", 3784 - "sqlx-mysql", 3785 - "sqlx-postgres", 3786 - "sqlx-sqlite", 3787 - "syn 2.0.104", 3788 - "tokio", 3789 - "url", 3790 - ] 3791 - 3792 - [[package]] 3793 - name = "sqlx-mysql" 3794 - version = "0.8.6" 3795 - source = "registry+https://github.com/rust-lang/crates.io-index" 3796 - checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" 3797 - dependencies = [ 3798 - "atoi", 3799 - "base64 0.22.1", 3800 - "bitflags 2.9.1", 3801 - "byteorder", 3802 - "bytes", 3803 - "crc", 3804 - "digest", 3805 - "dotenvy", 3806 - "either", 3807 - "futures-channel", 3808 - "futures-core", 3809 - "futures-io", 3810 - "futures-util", 3811 - "generic-array", 3812 - "hex", 3813 - "hkdf", 3814 - "hmac", 3815 - "itoa", 3816 - "log", 3817 - "md-5", 3818 - "memchr", 3819 - "once_cell", 3820 - "percent-encoding", 3821 - "rand 0.8.5", 3822 - "rsa", 3823 - "serde", 3824 - "sha1", 3825 - "sha2", 3826 - "smallvec", 3827 - "sqlx-core", 3828 - "stringprep", 3829 - "thiserror 2.0.12", 3830 - "tracing", 3831 - "whoami", 3832 - ] 3833 - 3834 - [[package]] 3835 - name = "sqlx-postgres" 3836 - version = "0.8.6" 3837 - source = "registry+https://github.com/rust-lang/crates.io-index" 3838 - checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" 3839 - dependencies = [ 3840 - "atoi", 3841 - "base64 0.22.1", 3842 - "bitflags 2.9.1", 3843 - "byteorder", 3844 - "crc", 3845 - "dotenvy", 3846 - "etcetera", 3847 - "futures-channel", 3848 - "futures-core", 3849 - "futures-util", 3850 - "hex", 3851 - "hkdf", 3852 - "hmac", 3853 - "home", 3854 - "itoa", 3855 - "log", 3856 - "md-5", 3857 - "memchr", 3858 - "once_cell", 3859 - "rand 0.8.5", 3860 - "serde", 3861 - "serde_json", 3862 - "sha2", 3863 - "smallvec", 3864 - "sqlx-core", 3865 - "stringprep", 3866 - "thiserror 2.0.12", 3867 - "tracing", 3868 - "whoami", 3869 - ] 3870 - 3871 - [[package]] 3872 - name = "sqlx-sqlite" 3873 - version = "0.8.6" 3874 - source = "registry+https://github.com/rust-lang/crates.io-index" 3875 - checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" 3876 - dependencies = [ 3877 - "atoi", 3878 - "flume", 3879 - "futures-channel", 3880 - "futures-core", 3881 - "futures-executor", 3882 - "futures-intrusive", 3883 - "futures-util", 3884 - "libsqlite3-sys", 3885 - "log", 3886 - "percent-encoding", 3887 - "serde", 3888 - "serde_urlencoded", 3889 - "sqlx-core", 3890 - "thiserror 2.0.12", 3891 - "tracing", 3892 - "url", 3893 - ] 3894 - 3895 - [[package]] 3896 3834 name = "stable_deref_trait" 3897 - version = "1.2.0" 3835 + version = "1.2.1" 3898 3836 source = "registry+https://github.com/rust-lang/crates.io-index" 3899 - checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 3837 + checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" 3900 3838 3901 3839 [[package]] 3902 3840 name = "static_assertions" ··· 3930 3868 ] 3931 3869 3932 3870 [[package]] 3933 - name = "stringprep" 3934 - version = "0.1.5" 3935 - source = "registry+https://github.com/rust-lang/crates.io-index" 3936 - checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" 3937 - dependencies = [ 3938 - "unicode-bidi", 3939 - "unicode-normalization", 3940 - "unicode-properties", 3941 - ] 3942 - 3943 - [[package]] 3944 3871 name = "strsim" 3945 3872 version = "0.11.1" 3946 3873 source = "registry+https://github.com/rust-lang/crates.io-index" 3947 3874 checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 3948 - 3949 - [[package]] 3950 - name = "subtle" 3951 - version = "2.6.1" 3952 - source = "registry+https://github.com/rust-lang/crates.io-index" 3953 - checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 3954 3875 3955 3876 [[package]] 3956 3877 name = "swift-rs" ··· 3976 3897 3977 3898 [[package]] 3978 3899 name = "syn" 3979 - version = "2.0.104" 3900 + version = "2.0.109" 3980 3901 source = "registry+https://github.com/rust-lang/crates.io-index" 3981 - checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" 3902 + checksum = "2f17c7e013e88258aa9543dcbe81aca68a667a9ac37cd69c9fbc07858bfe0e2f" 3982 3903 dependencies = [ 3983 3904 "proc-macro2", 3984 3905 "quote", ··· 4002 3923 dependencies = [ 4003 3924 "proc-macro2", 4004 3925 "quote", 4005 - "syn 2.0.104", 3926 + "syn 2.0.109", 3927 + ] 3928 + 3929 + [[package]] 3930 + name = "sys-locale" 3931 + version = "0.3.2" 3932 + source = "registry+https://github.com/rust-lang/crates.io-index" 3933 + checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" 3934 + dependencies = [ 3935 + "libc", 4006 3936 ] 4007 3937 4008 3938 [[package]] ··· 4014 3944 "cfg-expr", 4015 3945 "heck 0.5.0", 4016 3946 "pkg-config", 4017 - "toml 0.8.23", 3947 + "toml 0.8.2", 4018 3948 "version-compare", 4019 3949 ] 4020 3950 4021 3951 [[package]] 4022 3952 name = "tao" 4023 - version = "0.34.0" 3953 + version = "0.34.5" 4024 3954 source = "registry+https://github.com/rust-lang/crates.io-index" 4025 - checksum = "49c380ca75a231b87b6c9dd86948f035012e7171d1a7c40a9c2890489a7ffd8a" 3955 + checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" 4026 3956 dependencies = [ 4027 - "bitflags 2.9.1", 3957 + "bitflags 2.10.0", 3958 + "block2 0.6.2", 4028 3959 "core-foundation", 4029 - "core-graphics", 3960 + "core-graphics 0.24.0", 4030 3961 "crossbeam-channel", 4031 3962 "dispatch", 4032 3963 "dlopen2", ··· 4041 3972 "ndk", 4042 3973 "ndk-context", 4043 3974 "ndk-sys", 4044 - "objc2 0.6.1", 3975 + "objc2 0.6.3", 4045 3976 "objc2-app-kit", 4046 - "objc2-foundation 0.3.1", 3977 + "objc2-foundation 0.3.2", 4047 3978 "once_cell", 4048 3979 "parking_lot", 4049 3980 "raw-window-handle", ··· 4052 3983 "unicode-segmentation", 4053 3984 "url", 4054 3985 "windows", 4055 - "windows-core", 3986 + "windows-core 0.61.2", 4056 3987 "windows-version", 4057 3988 "x11-dl", 4058 3989 ] ··· 4065 3996 dependencies = [ 4066 3997 "proc-macro2", 4067 3998 "quote", 4068 - "syn 2.0.104", 3999 + "syn 2.0.109", 4069 4000 ] 4070 4001 4071 4002 [[package]] ··· 4076 4007 4077 4008 [[package]] 4078 4009 name = "tauri" 4079 - version = "2.7.0" 4010 + version = "2.9.2" 4080 4011 source = "registry+https://github.com/rust-lang/crates.io-index" 4081 - checksum = "352a4bc7bf6c25f5624227e3641adf475a6535707451b09bb83271df8b7a6ac7" 4012 + checksum = "8bceb52453e507c505b330afe3398510e87f428ea42b6e76ecb6bd63b15965b5" 4082 4013 dependencies = [ 4083 4014 "anyhow", 4084 4015 "bytes", 4016 + "cookie", 4085 4017 "dirs", 4086 4018 "dunce", 4087 4019 "embed_plist", 4088 - "getrandom 0.3.3", 4020 + "getrandom 0.3.4", 4089 4021 "glob", 4090 4022 "gtk", 4091 4023 "heck 0.5.0", 4092 4024 "http", 4025 + "image", 4093 4026 "jni", 4094 4027 "libc", 4095 4028 "log", 4096 4029 "mime", 4097 4030 "muda", 4098 - "objc2 0.6.1", 4031 + "objc2 0.6.3", 4099 4032 "objc2-app-kit", 4100 - "objc2-foundation 0.3.1", 4033 + "objc2-foundation 0.3.2", 4101 4034 "objc2-ui-kit", 4035 + "objc2-web-kit", 4102 4036 "percent-encoding", 4103 4037 "plist", 4104 4038 "raw-window-handle", ··· 4113 4047 "tauri-runtime", 4114 4048 "tauri-runtime-wry", 4115 4049 "tauri-utils", 4116 - "thiserror 2.0.12", 4050 + "thiserror 2.0.17", 4117 4051 "tokio", 4118 4052 "tray-icon", 4119 4053 "url", 4120 - "urlpattern", 4121 4054 "webkit2gtk", 4122 4055 "webview2-com", 4123 4056 "window-vibrancy", ··· 4126 4059 4127 4060 [[package]] 4128 4061 name = "tauri-build" 4129 - version = "2.3.1" 4062 + version = "2.5.1" 4130 4063 source = "registry+https://github.com/rust-lang/crates.io-index" 4131 - checksum = "182d688496c06bf08ea896459bf483eb29cdff35c1c4c115fb14053514303064" 4064 + checksum = "a924b6c50fe83193f0f8b14072afa7c25b7a72752a2a73d9549b463f5fe91a38" 4132 4065 dependencies = [ 4133 4066 "anyhow", 4134 4067 "cargo_toml", ··· 4142 4075 "serde_json", 4143 4076 "tauri-utils", 4144 4077 "tauri-winres", 4145 - "toml 0.8.23", 4078 + "toml 0.9.8", 4146 4079 "walkdir", 4147 4080 ] 4148 4081 4149 4082 [[package]] 4150 4083 name = "tauri-codegen" 4151 - version = "2.3.1" 4084 + version = "2.5.0" 4152 4085 source = "registry+https://github.com/rust-lang/crates.io-index" 4153 - checksum = "b54a99a6cd8e01abcfa61508177e6096a4fe2681efecee9214e962f2f073ae4a" 4086 + checksum = "6c1fe64c74cc40f90848281a90058a6db931eb400b60205840e09801ee30f190" 4154 4087 dependencies = [ 4155 4088 "base64 0.22.1", 4156 4089 "brotli", 4157 4090 "ico", 4158 4091 "json-patch", 4159 4092 "plist", 4160 - "png", 4093 + "png 0.17.16", 4161 4094 "proc-macro2", 4162 4095 "quote", 4163 4096 "semver", 4164 4097 "serde", 4165 4098 "serde_json", 4166 4099 "sha2", 4167 - "syn 2.0.104", 4100 + "syn 2.0.109", 4168 4101 "tauri-utils", 4169 - "thiserror 2.0.12", 4102 + "thiserror 2.0.17", 4170 4103 "time", 4171 4104 "url", 4172 4105 "uuid", ··· 4175 4108 4176 4109 [[package]] 4177 4110 name = "tauri-macros" 4178 - version = "2.3.2" 4111 + version = "2.5.0" 4179 4112 source = "registry+https://github.com/rust-lang/crates.io-index" 4180 - checksum = "7945b14dc45e23532f2ded6e120170bbdd4af5ceaa45784a6b33d250fbce3f9e" 4113 + checksum = "260c5d2eb036b76206b9fca20b7be3614cfd21046c5396f7959e0e64a4b07f2f" 4181 4114 dependencies = [ 4182 4115 "heck 0.5.0", 4183 4116 "proc-macro2", 4184 4117 "quote", 4185 - "syn 2.0.104", 4118 + "syn 2.0.109", 4186 4119 "tauri-codegen", 4187 4120 "tauri-utils", 4188 4121 ] 4189 4122 4190 4123 [[package]] 4191 4124 name = "tauri-plugin" 4192 - version = "2.3.1" 4125 + version = "2.5.1" 4193 4126 source = "registry+https://github.com/rust-lang/crates.io-index" 4194 - checksum = "5bd5c1e56990c70a906ef67a9851bbdba9136d26075ee9a2b19c8b46986b3e02" 4127 + checksum = "076c78a474a7247c90cad0b6e87e593c4c620ed4efdb79cbe0214f0021f6c39d" 4195 4128 dependencies = [ 4196 4129 "anyhow", 4197 4130 "glob", ··· 4200 4133 "serde", 4201 4134 "serde_json", 4202 4135 "tauri-utils", 4203 - "toml 0.8.23", 4136 + "toml 0.9.8", 4204 4137 "walkdir", 4205 4138 ] 4206 4139 4207 4140 [[package]] 4141 + name = "tauri-plugin-clipboard-manager" 4142 + version = "2.3.2" 4143 + source = "registry+https://github.com/rust-lang/crates.io-index" 4144 + checksum = "206dc20af4ed210748ba945c2774e60fd0acd52b9a73a028402caf809e9b6ecf" 4145 + dependencies = [ 4146 + "arboard", 4147 + "log", 4148 + "serde", 4149 + "serde_json", 4150 + "tauri", 4151 + "tauri-plugin", 4152 + "thiserror 2.0.17", 4153 + ] 4154 + 4155 + [[package]] 4156 + name = "tauri-plugin-dialog" 4157 + version = "2.4.2" 4158 + source = "registry+https://github.com/rust-lang/crates.io-index" 4159 + checksum = "313f8138692ddc4a2127c4c9607d616a46f5c042e77b3722450866da0aad2f19" 4160 + dependencies = [ 4161 + "log", 4162 + "raw-window-handle", 4163 + "rfd", 4164 + "serde", 4165 + "serde_json", 4166 + "tauri", 4167 + "tauri-plugin", 4168 + "tauri-plugin-fs", 4169 + "thiserror 2.0.17", 4170 + "url", 4171 + ] 4172 + 4173 + [[package]] 4174 + name = "tauri-plugin-fs" 4175 + version = "2.4.4" 4176 + source = "registry+https://github.com/rust-lang/crates.io-index" 4177 + checksum = "47df422695255ecbe7bac7012440eddaeefd026656171eac9559f5243d3230d9" 4178 + dependencies = [ 4179 + "anyhow", 4180 + "dunce", 4181 + "glob", 4182 + "percent-encoding", 4183 + "schemars 0.8.22", 4184 + "serde", 4185 + "serde_json", 4186 + "serde_repr", 4187 + "tauri", 4188 + "tauri-plugin", 4189 + "tauri-utils", 4190 + "thiserror 2.0.17", 4191 + "toml 0.9.8", 4192 + "url", 4193 + ] 4194 + 4195 + [[package]] 4208 4196 name = "tauri-plugin-opener" 4209 - version = "2.4.0" 4197 + version = "2.5.2" 4210 4198 source = "registry+https://github.com/rust-lang/crates.io-index" 4211 - checksum = "ecee219f11cdac713ab32959db5d0cceec4810ba4f4458da992292ecf9660321" 4199 + checksum = "c26b72571d25dee25667940027114e60f569fc3974f8cefbe50c2cbc5fd65e3b" 4212 4200 dependencies = [ 4213 4201 "dunce", 4214 4202 "glob", 4215 4203 "objc2-app-kit", 4216 - "objc2-foundation 0.3.1", 4204 + "objc2-foundation 0.3.2", 4217 4205 "open", 4218 4206 "schemars 0.8.22", 4219 4207 "serde", 4220 4208 "serde_json", 4221 4209 "tauri", 4222 4210 "tauri-plugin", 4223 - "thiserror 2.0.12", 4211 + "thiserror 2.0.17", 4224 4212 "url", 4225 4213 "windows", 4226 4214 "zbus", 4215 + ] 4216 + 4217 + [[package]] 4218 + name = "tauri-plugin-os" 4219 + version = "2.3.2" 4220 + source = "registry+https://github.com/rust-lang/crates.io-index" 4221 + checksum = "d8f08346c8deb39e96f86973da0e2d76cbb933d7ac9b750f6dc4daf955a6f997" 4222 + dependencies = [ 4223 + "gethostname", 4224 + "log", 4225 + "os_info", 4226 + "serde", 4227 + "serde_json", 4228 + "serialize-to-javascript", 4229 + "sys-locale", 4230 + "tauri", 4231 + "tauri-plugin", 4232 + "thiserror 2.0.17", 4227 4233 ] 4228 4234 4229 4235 [[package]] 4230 4236 name = "tauri-runtime" 4231 - version = "2.7.1" 4237 + version = "2.9.1" 4232 4238 source = "registry+https://github.com/rust-lang/crates.io-index" 4233 - checksum = "2b1cc885be806ea15ff7b0eb47098a7b16323d9228876afda329e34e2d6c4676" 4239 + checksum = "9368f09358496f2229313fccb37682ad116b7f46fa76981efe116994a0628926" 4234 4240 dependencies = [ 4235 4241 "cookie", 4236 4242 "dpi", 4237 4243 "gtk", 4238 4244 "http", 4239 4245 "jni", 4240 - "objc2 0.6.1", 4246 + "objc2 0.6.3", 4241 4247 "objc2-ui-kit", 4248 + "objc2-web-kit", 4242 4249 "raw-window-handle", 4243 4250 "serde", 4244 4251 "serde_json", 4245 4252 "tauri-utils", 4246 - "thiserror 2.0.12", 4253 + "thiserror 2.0.17", 4247 4254 "url", 4255 + "webkit2gtk", 4256 + "webview2-com", 4248 4257 "windows", 4249 4258 ] 4250 4259 4251 4260 [[package]] 4252 4261 name = "tauri-runtime-wry" 4253 - version = "2.7.2" 4262 + version = "2.9.1" 4254 4263 source = "registry+https://github.com/rust-lang/crates.io-index" 4255 - checksum = "fe653a2fbbef19fe898efc774bc52c8742576342a33d3d028c189b57eb1d2439" 4264 + checksum = "929f5df216f5c02a9e894554401bcdab6eec3e39ec6a4a7731c7067fc8688a93" 4256 4265 dependencies = [ 4257 4266 "gtk", 4258 4267 "http", 4259 4268 "jni", 4260 4269 "log", 4261 - "objc2 0.6.1", 4270 + "objc2 0.6.3", 4262 4271 "objc2-app-kit", 4263 - "objc2-foundation 0.3.1", 4272 + "objc2-foundation 0.3.2", 4264 4273 "once_cell", 4265 4274 "percent-encoding", 4266 4275 "raw-window-handle", ··· 4277 4286 4278 4287 [[package]] 4279 4288 name = "tauri-utils" 4280 - version = "2.6.0" 4289 + version = "2.8.0" 4281 4290 source = "registry+https://github.com/rust-lang/crates.io-index" 4282 - checksum = "9330c15cabfe1d9f213478c9e8ec2b0c76dab26bb6f314b8ad1c8a568c1d186e" 4291 + checksum = "f6b8bbe426abdbf52d050e52ed693130dbd68375b9ad82a3fb17efb4c8d85673" 4283 4292 dependencies = [ 4284 4293 "anyhow", 4285 4294 "brotli", ··· 4305 4314 "serde_json", 4306 4315 "serde_with", 4307 4316 "swift-rs", 4308 - "thiserror 2.0.12", 4309 - "toml 0.8.23", 4317 + "thiserror 2.0.17", 4318 + "toml 0.9.8", 4310 4319 "url", 4311 4320 "urlpattern", 4312 4321 "uuid", ··· 4315 4324 4316 4325 [[package]] 4317 4326 name = "tauri-winres" 4318 - version = "0.3.1" 4327 + version = "0.3.3" 4319 4328 source = "registry+https://github.com/rust-lang/crates.io-index" 4320 - checksum = "e8d321dbc6f998d825ab3f0d62673e810c861aac2d0de2cc2c395328f1d113b4" 4329 + checksum = "fd21509dd1fa9bd355dc29894a6ff10635880732396aa38c0066c1e6c1ab8074" 4321 4330 dependencies = [ 4322 4331 "embed-resource", 4323 - "indexmap 2.10.0", 4324 - "toml 0.8.23", 4332 + "toml 0.9.8", 4325 4333 ] 4326 4334 4327 4335 [[package]] 4328 4336 name = "tempfile" 4329 - version = "3.20.0" 4337 + version = "3.23.0" 4330 4338 source = "registry+https://github.com/rust-lang/crates.io-index" 4331 - checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" 4339 + checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" 4332 4340 dependencies = [ 4333 4341 "fastrand", 4334 - "getrandom 0.3.3", 4342 + "getrandom 0.3.4", 4335 4343 "once_cell", 4336 - "rustix", 4337 - "windows-sys 0.59.0", 4344 + "rustix 1.1.2", 4345 + "windows-sys 0.61.2", 4338 4346 ] 4339 4347 4340 4348 [[package]] ··· 4359 4367 4360 4368 [[package]] 4361 4369 name = "thiserror" 4362 - version = "2.0.12" 4370 + version = "2.0.17" 4363 4371 source = "registry+https://github.com/rust-lang/crates.io-index" 4364 - checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 4372 + checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" 4365 4373 dependencies = [ 4366 - "thiserror-impl 2.0.12", 4374 + "thiserror-impl 2.0.17", 4367 4375 ] 4368 4376 4369 4377 [[package]] ··· 4374 4382 dependencies = [ 4375 4383 "proc-macro2", 4376 4384 "quote", 4377 - "syn 2.0.104", 4385 + "syn 2.0.109", 4378 4386 ] 4379 4387 4380 4388 [[package]] 4381 4389 name = "thiserror-impl" 4382 - version = "2.0.12" 4390 + version = "2.0.17" 4383 4391 source = "registry+https://github.com/rust-lang/crates.io-index" 4384 - checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 4392 + checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" 4385 4393 dependencies = [ 4386 4394 "proc-macro2", 4387 4395 "quote", 4388 - "syn 2.0.104", 4396 + "syn 2.0.109", 4397 + ] 4398 + 4399 + [[package]] 4400 + name = "tiff" 4401 + version = "0.10.3" 4402 + source = "registry+https://github.com/rust-lang/crates.io-index" 4403 + checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f" 4404 + dependencies = [ 4405 + "fax", 4406 + "flate2", 4407 + "half", 4408 + "quick-error", 4409 + "weezl", 4410 + "zune-jpeg", 4389 4411 ] 4390 4412 4391 4413 [[package]] 4392 4414 name = "time" 4393 - version = "0.3.41" 4415 + version = "0.3.44" 4394 4416 source = "registry+https://github.com/rust-lang/crates.io-index" 4395 - checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" 4417 + checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" 4396 4418 dependencies = [ 4397 4419 "deranged", 4398 4420 "itoa", ··· 4405 4427 4406 4428 [[package]] 4407 4429 name = "time-core" 4408 - version = "0.1.4" 4430 + version = "0.1.6" 4409 4431 source = "registry+https://github.com/rust-lang/crates.io-index" 4410 - checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" 4432 + checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" 4411 4433 4412 4434 [[package]] 4413 4435 name = "time-macros" 4414 - version = "0.2.22" 4436 + version = "0.2.24" 4415 4437 source = "registry+https://github.com/rust-lang/crates.io-index" 4416 - checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" 4438 + checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" 4417 4439 dependencies = [ 4418 4440 "num-conv", 4419 4441 "time-core", ··· 4421 4443 4422 4444 [[package]] 4423 4445 name = "tinystr" 4424 - version = "0.8.1" 4446 + version = "0.8.2" 4425 4447 source = "registry+https://github.com/rust-lang/crates.io-index" 4426 - checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 4448 + checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" 4427 4449 dependencies = [ 4428 4450 "displaydoc", 4429 4451 "zerovec", 4430 4452 ] 4431 4453 4432 4454 [[package]] 4433 - name = "tinyvec" 4434 - version = "1.9.0" 4435 - source = "registry+https://github.com/rust-lang/crates.io-index" 4436 - checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" 4437 - dependencies = [ 4438 - "tinyvec_macros", 4439 - ] 4440 - 4441 - [[package]] 4442 - name = "tinyvec_macros" 4443 - version = "0.1.1" 4444 - source = "registry+https://github.com/rust-lang/crates.io-index" 4445 - checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 4446 - 4447 - [[package]] 4448 4455 name = "tokio" 4449 - version = "1.47.0" 4456 + version = "1.48.0" 4450 4457 source = "registry+https://github.com/rust-lang/crates.io-index" 4451 - checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35" 4458 + checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" 4452 4459 dependencies = [ 4453 - "backtrace", 4454 4460 "bytes", 4455 - "io-uring", 4456 4461 "libc", 4457 4462 "mio", 4458 4463 "pin-project-lite", 4459 - "slab", 4464 + "signal-hook-registry", 4460 4465 "socket2", 4461 4466 "tokio-macros", 4462 - "windows-sys 0.59.0", 4467 + "tracing", 4468 + "windows-sys 0.61.2", 4463 4469 ] 4464 4470 4465 4471 [[package]] 4466 4472 name = "tokio-macros" 4467 - version = "2.5.0" 4473 + version = "2.6.0" 4468 4474 source = "registry+https://github.com/rust-lang/crates.io-index" 4469 - checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 4475 + checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" 4470 4476 dependencies = [ 4471 4477 "proc-macro2", 4472 4478 "quote", 4473 - "syn 2.0.104", 4474 - ] 4475 - 4476 - [[package]] 4477 - name = "tokio-stream" 4478 - version = "0.1.17" 4479 - source = "registry+https://github.com/rust-lang/crates.io-index" 4480 - checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" 4481 - dependencies = [ 4482 - "futures-core", 4483 - "pin-project-lite", 4484 - "tokio", 4479 + "syn 2.0.109", 4485 4480 ] 4486 4481 4487 4482 [[package]] 4488 4483 name = "tokio-util" 4489 - version = "0.7.15" 4484 + version = "0.7.17" 4490 4485 source = "registry+https://github.com/rust-lang/crates.io-index" 4491 - checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" 4486 + checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" 4492 4487 dependencies = [ 4493 4488 "bytes", 4494 4489 "futures-core", ··· 4499 4494 4500 4495 [[package]] 4501 4496 name = "toml" 4502 - version = "0.8.23" 4497 + version = "0.8.2" 4503 4498 source = "registry+https://github.com/rust-lang/crates.io-index" 4504 - checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" 4499 + checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" 4505 4500 dependencies = [ 4506 4501 "serde", 4507 4502 "serde_spanned 0.6.9", 4508 - "toml_datetime 0.6.11", 4509 - "toml_edit 0.22.27", 4503 + "toml_datetime 0.6.3", 4504 + "toml_edit 0.20.2", 4510 4505 ] 4511 4506 4512 4507 [[package]] 4513 4508 name = "toml" 4514 - version = "0.9.3" 4509 + version = "0.9.8" 4515 4510 source = "registry+https://github.com/rust-lang/crates.io-index" 4516 - checksum = "e06723639aaded957e5a80be250c1f82f274b9d23ebb4d94163668470623461c" 4511 + checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" 4517 4512 dependencies = [ 4518 - "indexmap 2.10.0", 4519 - "serde", 4520 - "serde_spanned 1.0.0", 4521 - "toml_datetime 0.7.0", 4513 + "indexmap 2.12.0", 4514 + "serde_core", 4515 + "serde_spanned 1.0.3", 4516 + "toml_datetime 0.7.3", 4522 4517 "toml_parser", 4523 4518 "toml_writer", 4524 - "winnow 0.7.12", 4519 + "winnow 0.7.13", 4525 4520 ] 4526 4521 4527 4522 [[package]] 4528 4523 name = "toml_datetime" 4529 - version = "0.6.11" 4524 + version = "0.6.3" 4530 4525 source = "registry+https://github.com/rust-lang/crates.io-index" 4531 - checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" 4526 + checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" 4532 4527 dependencies = [ 4533 4528 "serde", 4534 4529 ] 4535 4530 4536 4531 [[package]] 4537 4532 name = "toml_datetime" 4538 - version = "0.7.0" 4533 + version = "0.7.3" 4539 4534 source = "registry+https://github.com/rust-lang/crates.io-index" 4540 - checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" 4535 + checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" 4541 4536 dependencies = [ 4542 - "serde", 4537 + "serde_core", 4543 4538 ] 4544 4539 4545 4540 [[package]] ··· 4548 4543 source = "registry+https://github.com/rust-lang/crates.io-index" 4549 4544 checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" 4550 4545 dependencies = [ 4551 - "indexmap 2.10.0", 4552 - "toml_datetime 0.6.11", 4546 + "indexmap 2.12.0", 4547 + "toml_datetime 0.6.3", 4553 4548 "winnow 0.5.40", 4554 4549 ] 4555 4550 4556 4551 [[package]] 4557 4552 name = "toml_edit" 4558 - version = "0.20.7" 4553 + version = "0.20.2" 4559 4554 source = "registry+https://github.com/rust-lang/crates.io-index" 4560 - checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" 4555 + checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" 4561 4556 dependencies = [ 4562 - "indexmap 2.10.0", 4563 - "toml_datetime 0.6.11", 4557 + "indexmap 2.12.0", 4558 + "serde", 4559 + "serde_spanned 0.6.9", 4560 + "toml_datetime 0.6.3", 4564 4561 "winnow 0.5.40", 4565 4562 ] 4566 4563 4567 4564 [[package]] 4568 4565 name = "toml_edit" 4569 - version = "0.22.27" 4566 + version = "0.23.7" 4570 4567 source = "registry+https://github.com/rust-lang/crates.io-index" 4571 - checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" 4568 + checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" 4572 4569 dependencies = [ 4573 - "indexmap 2.10.0", 4574 - "serde", 4575 - "serde_spanned 0.6.9", 4576 - "toml_datetime 0.6.11", 4577 - "toml_write", 4578 - "winnow 0.7.12", 4570 + "indexmap 2.12.0", 4571 + "toml_datetime 0.7.3", 4572 + "toml_parser", 4573 + "winnow 0.7.13", 4579 4574 ] 4580 4575 4581 4576 [[package]] 4582 4577 name = "toml_parser" 4583 - version = "1.0.1" 4578 + version = "1.0.4" 4584 4579 source = "registry+https://github.com/rust-lang/crates.io-index" 4585 - checksum = "97200572db069e74c512a14117b296ba0a80a30123fbbb5aa1f4a348f639ca30" 4580 + checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" 4586 4581 dependencies = [ 4587 - "winnow 0.7.12", 4582 + "winnow 0.7.13", 4588 4583 ] 4589 4584 4590 4585 [[package]] 4591 - name = "toml_write" 4592 - version = "0.1.2" 4593 - source = "registry+https://github.com/rust-lang/crates.io-index" 4594 - checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" 4595 - 4596 - [[package]] 4597 4586 name = "toml_writer" 4598 - version = "1.0.2" 4587 + version = "1.0.4" 4599 4588 source = "registry+https://github.com/rust-lang/crates.io-index" 4600 - checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" 4589 + checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" 4601 4590 4602 4591 [[package]] 4603 4592 name = "tower" ··· 4620 4609 source = "registry+https://github.com/rust-lang/crates.io-index" 4621 4610 checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" 4622 4611 dependencies = [ 4623 - "bitflags 2.9.1", 4612 + "bitflags 2.10.0", 4624 4613 "bytes", 4625 4614 "futures-util", 4626 4615 "http", ··· 4650 4639 source = "registry+https://github.com/rust-lang/crates.io-index" 4651 4640 checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 4652 4641 dependencies = [ 4653 - "log", 4654 4642 "pin-project-lite", 4655 4643 "tracing-attributes", 4656 4644 "tracing-core", ··· 4664 4652 dependencies = [ 4665 4653 "proc-macro2", 4666 4654 "quote", 4667 - "syn 2.0.104", 4655 + "syn 2.0.109", 4668 4656 ] 4669 4657 4670 4658 [[package]] ··· 4678 4666 4679 4667 [[package]] 4680 4668 name = "tray-icon" 4681 - version = "0.21.0" 4669 + version = "0.21.2" 4682 4670 source = "registry+https://github.com/rust-lang/crates.io-index" 4683 - checksum = "2da75ec677957aa21f6e0b361df0daab972f13a5bee3606de0638fd4ee1c666a" 4671 + checksum = "e3d5572781bee8e3f994d7467084e1b1fd7a93ce66bd480f8156ba89dee55a2b" 4684 4672 dependencies = [ 4685 4673 "crossbeam-channel", 4686 4674 "dirs", 4687 4675 "libappindicator", 4688 4676 "muda", 4689 - "objc2 0.6.1", 4677 + "objc2 0.6.3", 4690 4678 "objc2-app-kit", 4691 4679 "objc2-core-foundation", 4692 4680 "objc2-core-graphics", 4693 - "objc2-foundation 0.3.1", 4681 + "objc2-foundation 0.3.2", 4694 4682 "once_cell", 4695 - "png", 4683 + "png 0.17.16", 4696 4684 "serde", 4697 - "thiserror 2.0.12", 4698 - "windows-sys 0.59.0", 4685 + "thiserror 2.0.17", 4686 + "windows-sys 0.60.2", 4687 + ] 4688 + 4689 + [[package]] 4690 + name = "tree_magic_mini" 4691 + version = "3.2.1" 4692 + source = "registry+https://github.com/rust-lang/crates.io-index" 4693 + checksum = "52fac5f7d176f7f7f7e827299ead28ef98de642c5d93a97e0cd0816d17557f19" 4694 + dependencies = [ 4695 + "memchr", 4696 + "nom 7.1.3", 4697 + "petgraph", 4699 4698 ] 4700 4699 4701 4700 [[package]] ··· 4712 4711 4713 4712 [[package]] 4714 4713 name = "typenum" 4715 - version = "1.18.0" 4714 + version = "1.19.0" 4716 4715 source = "registry+https://github.com/rust-lang/crates.io-index" 4717 - checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 4716 + checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" 4718 4717 4719 4718 [[package]] 4720 4719 name = "uds_windows" ··· 4767 4766 dependencies = [ 4768 4767 "unic-common", 4769 4768 ] 4770 - 4771 - [[package]] 4772 - name = "unicode-bidi" 4773 - version = "0.3.18" 4774 - source = "registry+https://github.com/rust-lang/crates.io-index" 4775 - checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" 4776 4769 4777 4770 [[package]] 4778 4771 name = "unicode-ident" 4779 - version = "1.0.18" 4772 + version = "1.0.22" 4780 4773 source = "registry+https://github.com/rust-lang/crates.io-index" 4781 - checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 4782 - 4783 - [[package]] 4784 - name = "unicode-normalization" 4785 - version = "0.1.24" 4786 - source = "registry+https://github.com/rust-lang/crates.io-index" 4787 - checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" 4788 - dependencies = [ 4789 - "tinyvec", 4790 - ] 4791 - 4792 - [[package]] 4793 - name = "unicode-properties" 4794 - version = "0.1.3" 4795 - source = "registry+https://github.com/rust-lang/crates.io-index" 4796 - checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" 4774 + checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" 4797 4775 4798 4776 [[package]] 4799 4777 name = "unicode-segmentation" ··· 4803 4781 4804 4782 [[package]] 4805 4783 name = "url" 4806 - version = "2.5.4" 4784 + version = "2.5.7" 4807 4785 source = "registry+https://github.com/rust-lang/crates.io-index" 4808 - checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 4786 + checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" 4809 4787 dependencies = [ 4810 4788 "form_urlencoded", 4811 4789 "idna", ··· 4839 4817 4840 4818 [[package]] 4841 4819 name = "uuid" 4842 - version = "1.17.0" 4820 + version = "1.18.1" 4843 4821 source = "registry+https://github.com/rust-lang/crates.io-index" 4844 - checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" 4822 + checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" 4845 4823 dependencies = [ 4846 - "getrandom 0.3.3", 4824 + "getrandom 0.3.4", 4847 4825 "js-sys", 4848 4826 "serde", 4849 4827 "wasm-bindgen", 4850 4828 ] 4851 4829 4852 4830 [[package]] 4853 - name = "vcpkg" 4854 - version = "0.2.15" 4855 - source = "registry+https://github.com/rust-lang/crates.io-index" 4856 - checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 4857 - 4858 - [[package]] 4859 4831 name = "version-compare" 4860 - version = "0.2.0" 4832 + version = "0.2.1" 4861 4833 source = "registry+https://github.com/rust-lang/crates.io-index" 4862 - checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" 4834 + checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" 4863 4835 4864 4836 [[package]] 4865 4837 name = "version_check" ··· 4919 4891 checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 4920 4892 4921 4893 [[package]] 4922 - name = "wasi" 4923 - version = "0.14.2+wasi-0.2.4" 4894 + name = "wasip2" 4895 + version = "1.0.1+wasi-0.2.4" 4924 4896 source = "registry+https://github.com/rust-lang/crates.io-index" 4925 - checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 4897 + checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" 4926 4898 dependencies = [ 4927 - "wit-bindgen-rt", 4899 + "wit-bindgen", 4928 4900 ] 4929 - 4930 - [[package]] 4931 - name = "wasite" 4932 - version = "0.1.0" 4933 - source = "registry+https://github.com/rust-lang/crates.io-index" 4934 - checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" 4935 4901 4936 4902 [[package]] 4937 4903 name = "wasm-bindgen" 4938 - version = "0.2.100" 4904 + version = "0.2.105" 4939 4905 source = "registry+https://github.com/rust-lang/crates.io-index" 4940 - checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 4906 + checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" 4941 4907 dependencies = [ 4942 4908 "cfg-if", 4943 4909 "once_cell", 4944 4910 "rustversion", 4945 4911 "wasm-bindgen-macro", 4946 - ] 4947 - 4948 - [[package]] 4949 - name = "wasm-bindgen-backend" 4950 - version = "0.2.100" 4951 - source = "registry+https://github.com/rust-lang/crates.io-index" 4952 - checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 4953 - dependencies = [ 4954 - "bumpalo", 4955 - "log", 4956 - "proc-macro2", 4957 - "quote", 4958 - "syn 2.0.104", 4959 4912 "wasm-bindgen-shared", 4960 4913 ] 4961 4914 4962 4915 [[package]] 4963 4916 name = "wasm-bindgen-futures" 4964 - version = "0.4.50" 4917 + version = "0.4.55" 4965 4918 source = "registry+https://github.com/rust-lang/crates.io-index" 4966 - checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 4919 + checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" 4967 4920 dependencies = [ 4968 4921 "cfg-if", 4969 4922 "js-sys", ··· 4974 4927 4975 4928 [[package]] 4976 4929 name = "wasm-bindgen-macro" 4977 - version = "0.2.100" 4930 + version = "0.2.105" 4978 4931 source = "registry+https://github.com/rust-lang/crates.io-index" 4979 - checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 4932 + checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" 4980 4933 dependencies = [ 4981 4934 "quote", 4982 4935 "wasm-bindgen-macro-support", ··· 4984 4937 4985 4938 [[package]] 4986 4939 name = "wasm-bindgen-macro-support" 4987 - version = "0.2.100" 4940 + version = "0.2.105" 4988 4941 source = "registry+https://github.com/rust-lang/crates.io-index" 4989 - checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 4942 + checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" 4990 4943 dependencies = [ 4944 + "bumpalo", 4991 4945 "proc-macro2", 4992 4946 "quote", 4993 - "syn 2.0.104", 4994 - "wasm-bindgen-backend", 4947 + "syn 2.0.109", 4995 4948 "wasm-bindgen-shared", 4996 4949 ] 4997 4950 4998 4951 [[package]] 4999 4952 name = "wasm-bindgen-shared" 5000 - version = "0.2.100" 4953 + version = "0.2.105" 5001 4954 source = "registry+https://github.com/rust-lang/crates.io-index" 5002 - checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 4955 + checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" 5003 4956 dependencies = [ 5004 4957 "unicode-ident", 5005 4958 ] ··· 5018 4971 ] 5019 4972 5020 4973 [[package]] 4974 + name = "wayland-backend" 4975 + version = "0.3.11" 4976 + source = "registry+https://github.com/rust-lang/crates.io-index" 4977 + checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" 4978 + dependencies = [ 4979 + "cc", 4980 + "downcast-rs", 4981 + "rustix 1.1.2", 4982 + "scoped-tls", 4983 + "smallvec", 4984 + "wayland-sys", 4985 + ] 4986 + 4987 + [[package]] 4988 + name = "wayland-client" 4989 + version = "0.31.11" 4990 + source = "registry+https://github.com/rust-lang/crates.io-index" 4991 + checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" 4992 + dependencies = [ 4993 + "bitflags 2.10.0", 4994 + "rustix 1.1.2", 4995 + "wayland-backend", 4996 + "wayland-scanner", 4997 + ] 4998 + 4999 + [[package]] 5000 + name = "wayland-protocols" 5001 + version = "0.32.9" 5002 + source = "registry+https://github.com/rust-lang/crates.io-index" 5003 + checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" 5004 + dependencies = [ 5005 + "bitflags 2.10.0", 5006 + "wayland-backend", 5007 + "wayland-client", 5008 + "wayland-scanner", 5009 + ] 5010 + 5011 + [[package]] 5012 + name = "wayland-protocols-wlr" 5013 + version = "0.3.9" 5014 + source = "registry+https://github.com/rust-lang/crates.io-index" 5015 + checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec" 5016 + dependencies = [ 5017 + "bitflags 2.10.0", 5018 + "wayland-backend", 5019 + "wayland-client", 5020 + "wayland-protocols", 5021 + "wayland-scanner", 5022 + ] 5023 + 5024 + [[package]] 5025 + name = "wayland-scanner" 5026 + version = "0.31.7" 5027 + source = "registry+https://github.com/rust-lang/crates.io-index" 5028 + checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" 5029 + dependencies = [ 5030 + "proc-macro2", 5031 + "quick-xml 0.37.5", 5032 + "quote", 5033 + ] 5034 + 5035 + [[package]] 5036 + name = "wayland-sys" 5037 + version = "0.31.7" 5038 + source = "registry+https://github.com/rust-lang/crates.io-index" 5039 + checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" 5040 + dependencies = [ 5041 + "dlib", 5042 + "log", 5043 + "pkg-config", 5044 + ] 5045 + 5046 + [[package]] 5021 5047 name = "web-sys" 5022 - version = "0.3.77" 5048 + version = "0.3.82" 5023 5049 source = "registry+https://github.com/rust-lang/crates.io-index" 5024 - checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 5050 + checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" 5025 5051 dependencies = [ 5026 5052 "js-sys", 5027 5053 "wasm-bindgen", ··· 5080 5106 "webview2-com-macros", 5081 5107 "webview2-com-sys", 5082 5108 "windows", 5083 - "windows-core", 5109 + "windows-core 0.61.2", 5084 5110 "windows-implement", 5085 5111 "windows-interface", 5086 5112 ] ··· 5093 5119 dependencies = [ 5094 5120 "proc-macro2", 5095 5121 "quote", 5096 - "syn 2.0.104", 5122 + "syn 2.0.109", 5097 5123 ] 5098 5124 5099 5125 [[package]] ··· 5102 5128 source = "registry+https://github.com/rust-lang/crates.io-index" 5103 5129 checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" 5104 5130 dependencies = [ 5105 - "thiserror 2.0.12", 5131 + "thiserror 2.0.17", 5106 5132 "windows", 5107 - "windows-core", 5133 + "windows-core 0.61.2", 5108 5134 ] 5109 5135 5110 5136 [[package]] 5111 - name = "whoami" 5112 - version = "1.6.0" 5137 + name = "weezl" 5138 + version = "0.1.12" 5113 5139 source = "registry+https://github.com/rust-lang/crates.io-index" 5114 - checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7" 5115 - dependencies = [ 5116 - "redox_syscall", 5117 - "wasite", 5118 - ] 5140 + checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" 5119 5141 5120 5142 [[package]] 5121 5143 name = "winapi" ··· 5135 5157 5136 5158 [[package]] 5137 5159 name = "winapi-util" 5138 - version = "0.1.9" 5160 + version = "0.1.11" 5139 5161 source = "registry+https://github.com/rust-lang/crates.io-index" 5140 - checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 5162 + checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" 5141 5163 dependencies = [ 5142 - "windows-sys 0.59.0", 5164 + "windows-sys 0.61.2", 5143 5165 ] 5144 5166 5145 5167 [[package]] ··· 5154 5176 source = "registry+https://github.com/rust-lang/crates.io-index" 5155 5177 checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" 5156 5178 dependencies = [ 5157 - "objc2 0.6.1", 5179 + "objc2 0.6.3", 5158 5180 "objc2-app-kit", 5159 5181 "objc2-core-foundation", 5160 - "objc2-foundation 0.3.1", 5182 + "objc2-foundation 0.3.2", 5161 5183 "raw-window-handle", 5162 5184 "windows-sys 0.59.0", 5163 5185 "windows-version", ··· 5170 5192 checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" 5171 5193 dependencies = [ 5172 5194 "windows-collections", 5173 - "windows-core", 5195 + "windows-core 0.61.2", 5174 5196 "windows-future", 5175 - "windows-link", 5197 + "windows-link 0.1.3", 5176 5198 "windows-numerics", 5177 5199 ] 5178 5200 ··· 5182 5204 source = "registry+https://github.com/rust-lang/crates.io-index" 5183 5205 checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" 5184 5206 dependencies = [ 5185 - "windows-core", 5207 + "windows-core 0.61.2", 5186 5208 ] 5187 5209 5188 5210 [[package]] ··· 5193 5215 dependencies = [ 5194 5216 "windows-implement", 5195 5217 "windows-interface", 5196 - "windows-link", 5197 - "windows-result", 5198 - "windows-strings", 5218 + "windows-link 0.1.3", 5219 + "windows-result 0.3.4", 5220 + "windows-strings 0.4.2", 5221 + ] 5222 + 5223 + [[package]] 5224 + name = "windows-core" 5225 + version = "0.62.2" 5226 + source = "registry+https://github.com/rust-lang/crates.io-index" 5227 + checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" 5228 + dependencies = [ 5229 + "windows-implement", 5230 + "windows-interface", 5231 + "windows-link 0.2.1", 5232 + "windows-result 0.4.1", 5233 + "windows-strings 0.5.1", 5199 5234 ] 5200 5235 5201 5236 [[package]] ··· 5204 5239 source = "registry+https://github.com/rust-lang/crates.io-index" 5205 5240 checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" 5206 5241 dependencies = [ 5207 - "windows-core", 5208 - "windows-link", 5242 + "windows-core 0.61.2", 5243 + "windows-link 0.1.3", 5209 5244 "windows-threading", 5210 5245 ] 5211 5246 5212 5247 [[package]] 5213 5248 name = "windows-implement" 5214 - version = "0.60.0" 5249 + version = "0.60.2" 5215 5250 source = "registry+https://github.com/rust-lang/crates.io-index" 5216 - checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" 5251 + checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" 5217 5252 dependencies = [ 5218 5253 "proc-macro2", 5219 5254 "quote", 5220 - "syn 2.0.104", 5255 + "syn 2.0.109", 5221 5256 ] 5222 5257 5223 5258 [[package]] 5224 5259 name = "windows-interface" 5225 - version = "0.59.1" 5260 + version = "0.59.3" 5226 5261 source = "registry+https://github.com/rust-lang/crates.io-index" 5227 - checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" 5262 + checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" 5228 5263 dependencies = [ 5229 5264 "proc-macro2", 5230 5265 "quote", 5231 - "syn 2.0.104", 5266 + "syn 2.0.109", 5232 5267 ] 5233 5268 5234 5269 [[package]] ··· 5238 5273 checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 5239 5274 5240 5275 [[package]] 5276 + name = "windows-link" 5277 + version = "0.2.1" 5278 + source = "registry+https://github.com/rust-lang/crates.io-index" 5279 + checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" 5280 + 5281 + [[package]] 5241 5282 name = "windows-numerics" 5242 5283 version = "0.2.0" 5243 5284 source = "registry+https://github.com/rust-lang/crates.io-index" 5244 5285 checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" 5245 5286 dependencies = [ 5246 - "windows-core", 5247 - "windows-link", 5287 + "windows-core 0.61.2", 5288 + "windows-link 0.1.3", 5248 5289 ] 5249 5290 5250 5291 [[package]] ··· 5253 5294 source = "registry+https://github.com/rust-lang/crates.io-index" 5254 5295 checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" 5255 5296 dependencies = [ 5256 - "windows-link", 5297 + "windows-link 0.1.3", 5298 + ] 5299 + 5300 + [[package]] 5301 + name = "windows-result" 5302 + version = "0.4.1" 5303 + source = "registry+https://github.com/rust-lang/crates.io-index" 5304 + checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" 5305 + dependencies = [ 5306 + "windows-link 0.2.1", 5257 5307 ] 5258 5308 5259 5309 [[package]] ··· 5262 5312 source = "registry+https://github.com/rust-lang/crates.io-index" 5263 5313 checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" 5264 5314 dependencies = [ 5265 - "windows-link", 5315 + "windows-link 0.1.3", 5266 5316 ] 5267 5317 5268 5318 [[package]] 5269 - name = "windows-sys" 5270 - version = "0.45.0" 5319 + name = "windows-strings" 5320 + version = "0.5.1" 5271 5321 source = "registry+https://github.com/rust-lang/crates.io-index" 5272 - checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 5322 + checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" 5273 5323 dependencies = [ 5274 - "windows-targets 0.42.2", 5324 + "windows-link 0.2.1", 5275 5325 ] 5276 5326 5277 5327 [[package]] 5278 5328 name = "windows-sys" 5279 - version = "0.48.0" 5329 + version = "0.45.0" 5280 5330 source = "registry+https://github.com/rust-lang/crates.io-index" 5281 - checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 5331 + checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 5282 5332 dependencies = [ 5283 - "windows-targets 0.48.5", 5333 + "windows-targets 0.42.2", 5284 5334 ] 5285 5335 5286 5336 [[package]] ··· 5298 5348 source = "registry+https://github.com/rust-lang/crates.io-index" 5299 5349 checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 5300 5350 dependencies = [ 5301 - "windows-targets 0.53.3", 5351 + "windows-targets 0.53.5", 5352 + ] 5353 + 5354 + [[package]] 5355 + name = "windows-sys" 5356 + version = "0.61.2" 5357 + source = "registry+https://github.com/rust-lang/crates.io-index" 5358 + checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" 5359 + dependencies = [ 5360 + "windows-link 0.2.1", 5302 5361 ] 5303 5362 5304 5363 [[package]] ··· 5318 5377 5319 5378 [[package]] 5320 5379 name = "windows-targets" 5321 - version = "0.48.5" 5322 - source = "registry+https://github.com/rust-lang/crates.io-index" 5323 - checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 5324 - dependencies = [ 5325 - "windows_aarch64_gnullvm 0.48.5", 5326 - "windows_aarch64_msvc 0.48.5", 5327 - "windows_i686_gnu 0.48.5", 5328 - "windows_i686_msvc 0.48.5", 5329 - "windows_x86_64_gnu 0.48.5", 5330 - "windows_x86_64_gnullvm 0.48.5", 5331 - "windows_x86_64_msvc 0.48.5", 5332 - ] 5333 - 5334 - [[package]] 5335 - name = "windows-targets" 5336 5380 version = "0.52.6" 5337 5381 source = "registry+https://github.com/rust-lang/crates.io-index" 5338 5382 checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" ··· 5349 5393 5350 5394 [[package]] 5351 5395 name = "windows-targets" 5352 - version = "0.53.3" 5396 + version = "0.53.5" 5353 5397 source = "registry+https://github.com/rust-lang/crates.io-index" 5354 - checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" 5398 + checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" 5355 5399 dependencies = [ 5356 - "windows-link", 5357 - "windows_aarch64_gnullvm 0.53.0", 5358 - "windows_aarch64_msvc 0.53.0", 5359 - "windows_i686_gnu 0.53.0", 5360 - "windows_i686_gnullvm 0.53.0", 5361 - "windows_i686_msvc 0.53.0", 5362 - "windows_x86_64_gnu 0.53.0", 5363 - "windows_x86_64_gnullvm 0.53.0", 5364 - "windows_x86_64_msvc 0.53.0", 5400 + "windows-link 0.2.1", 5401 + "windows_aarch64_gnullvm 0.53.1", 5402 + "windows_aarch64_msvc 0.53.1", 5403 + "windows_i686_gnu 0.53.1", 5404 + "windows_i686_gnullvm 0.53.1", 5405 + "windows_i686_msvc 0.53.1", 5406 + "windows_x86_64_gnu 0.53.1", 5407 + "windows_x86_64_gnullvm 0.53.1", 5408 + "windows_x86_64_msvc 0.53.1", 5365 5409 ] 5366 5410 5367 5411 [[package]] ··· 5370 5414 source = "registry+https://github.com/rust-lang/crates.io-index" 5371 5415 checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" 5372 5416 dependencies = [ 5373 - "windows-link", 5417 + "windows-link 0.1.3", 5374 5418 ] 5375 5419 5376 5420 [[package]] 5377 5421 name = "windows-version" 5378 - version = "0.1.4" 5422 + version = "0.1.7" 5379 5423 source = "registry+https://github.com/rust-lang/crates.io-index" 5380 - checksum = "e04a5c6627e310a23ad2358483286c7df260c964eb2d003d8efd6d0f4e79265c" 5424 + checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" 5381 5425 dependencies = [ 5382 - "windows-link", 5426 + "windows-link 0.2.1", 5383 5427 ] 5384 5428 5385 5429 [[package]] ··· 5387 5431 version = "0.42.2" 5388 5432 source = "registry+https://github.com/rust-lang/crates.io-index" 5389 5433 checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 5390 - 5391 - [[package]] 5392 - name = "windows_aarch64_gnullvm" 5393 - version = "0.48.5" 5394 - source = "registry+https://github.com/rust-lang/crates.io-index" 5395 - checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 5396 5434 5397 5435 [[package]] 5398 5436 name = "windows_aarch64_gnullvm" ··· 5402 5440 5403 5441 [[package]] 5404 5442 name = "windows_aarch64_gnullvm" 5405 - version = "0.53.0" 5443 + version = "0.53.1" 5406 5444 source = "registry+https://github.com/rust-lang/crates.io-index" 5407 - checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 5445 + checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" 5408 5446 5409 5447 [[package]] 5410 5448 name = "windows_aarch64_msvc" ··· 5414 5452 5415 5453 [[package]] 5416 5454 name = "windows_aarch64_msvc" 5417 - version = "0.48.5" 5418 - source = "registry+https://github.com/rust-lang/crates.io-index" 5419 - checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 5420 - 5421 - [[package]] 5422 - name = "windows_aarch64_msvc" 5423 5455 version = "0.52.6" 5424 5456 source = "registry+https://github.com/rust-lang/crates.io-index" 5425 5457 checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 5426 5458 5427 5459 [[package]] 5428 5460 name = "windows_aarch64_msvc" 5429 - version = "0.53.0" 5461 + version = "0.53.1" 5430 5462 source = "registry+https://github.com/rust-lang/crates.io-index" 5431 - checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 5463 + checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" 5432 5464 5433 5465 [[package]] 5434 5466 name = "windows_i686_gnu" ··· 5438 5470 5439 5471 [[package]] 5440 5472 name = "windows_i686_gnu" 5441 - version = "0.48.5" 5442 - source = "registry+https://github.com/rust-lang/crates.io-index" 5443 - checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 5444 - 5445 - [[package]] 5446 - name = "windows_i686_gnu" 5447 5473 version = "0.52.6" 5448 5474 source = "registry+https://github.com/rust-lang/crates.io-index" 5449 5475 checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 5450 5476 5451 5477 [[package]] 5452 5478 name = "windows_i686_gnu" 5453 - version = "0.53.0" 5479 + version = "0.53.1" 5454 5480 source = "registry+https://github.com/rust-lang/crates.io-index" 5455 - checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 5481 + checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" 5456 5482 5457 5483 [[package]] 5458 5484 name = "windows_i686_gnullvm" ··· 5462 5488 5463 5489 [[package]] 5464 5490 name = "windows_i686_gnullvm" 5465 - version = "0.53.0" 5491 + version = "0.53.1" 5466 5492 source = "registry+https://github.com/rust-lang/crates.io-index" 5467 - checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 5493 + checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" 5468 5494 5469 5495 [[package]] 5470 5496 name = "windows_i686_msvc" ··· 5474 5500 5475 5501 [[package]] 5476 5502 name = "windows_i686_msvc" 5477 - version = "0.48.5" 5478 - source = "registry+https://github.com/rust-lang/crates.io-index" 5479 - checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 5480 - 5481 - [[package]] 5482 - name = "windows_i686_msvc" 5483 5503 version = "0.52.6" 5484 5504 source = "registry+https://github.com/rust-lang/crates.io-index" 5485 5505 checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 5486 5506 5487 5507 [[package]] 5488 5508 name = "windows_i686_msvc" 5489 - version = "0.53.0" 5509 + version = "0.53.1" 5490 5510 source = "registry+https://github.com/rust-lang/crates.io-index" 5491 - checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 5511 + checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" 5492 5512 5493 5513 [[package]] 5494 5514 name = "windows_x86_64_gnu" ··· 5498 5518 5499 5519 [[package]] 5500 5520 name = "windows_x86_64_gnu" 5501 - version = "0.48.5" 5502 - source = "registry+https://github.com/rust-lang/crates.io-index" 5503 - checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 5504 - 5505 - [[package]] 5506 - name = "windows_x86_64_gnu" 5507 5521 version = "0.52.6" 5508 5522 source = "registry+https://github.com/rust-lang/crates.io-index" 5509 5523 checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 5510 5524 5511 5525 [[package]] 5512 5526 name = "windows_x86_64_gnu" 5513 - version = "0.53.0" 5527 + version = "0.53.1" 5514 5528 source = "registry+https://github.com/rust-lang/crates.io-index" 5515 - checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 5529 + checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" 5516 5530 5517 5531 [[package]] 5518 5532 name = "windows_x86_64_gnullvm" ··· 5522 5536 5523 5537 [[package]] 5524 5538 name = "windows_x86_64_gnullvm" 5525 - version = "0.48.5" 5526 - source = "registry+https://github.com/rust-lang/crates.io-index" 5527 - checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 5528 - 5529 - [[package]] 5530 - name = "windows_x86_64_gnullvm" 5531 5539 version = "0.52.6" 5532 5540 source = "registry+https://github.com/rust-lang/crates.io-index" 5533 5541 checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 5534 5542 5535 5543 [[package]] 5536 5544 name = "windows_x86_64_gnullvm" 5537 - version = "0.53.0" 5545 + version = "0.53.1" 5538 5546 source = "registry+https://github.com/rust-lang/crates.io-index" 5539 - checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 5547 + checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" 5540 5548 5541 5549 [[package]] 5542 5550 name = "windows_x86_64_msvc" ··· 5546 5554 5547 5555 [[package]] 5548 5556 name = "windows_x86_64_msvc" 5549 - version = "0.48.5" 5550 - source = "registry+https://github.com/rust-lang/crates.io-index" 5551 - checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 5552 - 5553 - [[package]] 5554 - name = "windows_x86_64_msvc" 5555 5557 version = "0.52.6" 5556 5558 source = "registry+https://github.com/rust-lang/crates.io-index" 5557 5559 checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 5558 5560 5559 5561 [[package]] 5560 5562 name = "windows_x86_64_msvc" 5561 - version = "0.53.0" 5563 + version = "0.53.1" 5562 5564 source = "registry+https://github.com/rust-lang/crates.io-index" 5563 - checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 5565 + checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" 5564 5566 5565 5567 [[package]] 5566 5568 name = "winnow" ··· 5573 5575 5574 5576 [[package]] 5575 5577 name = "winnow" 5576 - version = "0.7.12" 5578 + version = "0.7.13" 5577 5579 source = "registry+https://github.com/rust-lang/crates.io-index" 5578 - checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" 5580 + checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" 5579 5581 dependencies = [ 5580 5582 "memchr", 5581 5583 ] ··· 5591 5593 ] 5592 5594 5593 5595 [[package]] 5594 - name = "wit-bindgen-rt" 5595 - version = "0.39.0" 5596 + name = "wit-bindgen" 5597 + version = "0.46.0" 5596 5598 source = "registry+https://github.com/rust-lang/crates.io-index" 5597 - checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 5599 + checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" 5600 + 5601 + [[package]] 5602 + name = "wl-clipboard-rs" 5603 + version = "0.9.2" 5604 + source = "registry+https://github.com/rust-lang/crates.io-index" 5605 + checksum = "8e5ff8d0e60065f549fafd9d6cb626203ea64a798186c80d8e7df4f8af56baeb" 5598 5606 dependencies = [ 5599 - "bitflags 2.9.1", 5607 + "libc", 5608 + "log", 5609 + "os_pipe", 5610 + "rustix 0.38.44", 5611 + "tempfile", 5612 + "thiserror 2.0.17", 5613 + "tree_magic_mini", 5614 + "wayland-backend", 5615 + "wayland-client", 5616 + "wayland-protocols", 5617 + "wayland-protocols-wlr", 5600 5618 ] 5601 5619 5602 5620 [[package]] 5603 5621 name = "writeable" 5604 - version = "0.6.1" 5622 + version = "0.6.2" 5605 5623 source = "registry+https://github.com/rust-lang/crates.io-index" 5606 - checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 5624 + checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" 5607 5625 5608 5626 [[package]] 5609 5627 name = "wry" 5610 - version = "0.52.1" 5628 + version = "0.53.5" 5611 5629 source = "registry+https://github.com/rust-lang/crates.io-index" 5612 - checksum = "12a714d9ba7075aae04a6e50229d6109e3d584774b99a6a8c60de1698ca111b9" 5630 + checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2" 5613 5631 dependencies = [ 5614 5632 "base64 0.22.1", 5615 - "block2 0.6.1", 5633 + "block2 0.6.2", 5616 5634 "cookie", 5617 5635 "crossbeam-channel", 5636 + "dirs", 5618 5637 "dpi", 5619 5638 "dunce", 5620 5639 "gdkx11", ··· 5626 5645 "kuchikiki", 5627 5646 "libc", 5628 5647 "ndk", 5629 - "objc2 0.6.1", 5648 + "objc2 0.6.3", 5630 5649 "objc2-app-kit", 5631 5650 "objc2-core-foundation", 5632 - "objc2-foundation 0.3.1", 5651 + "objc2-foundation 0.3.2", 5633 5652 "objc2-ui-kit", 5634 5653 "objc2-web-kit", 5635 5654 "once_cell", ··· 5638 5657 "sha2", 5639 5658 "soup3", 5640 5659 "tao-macros", 5641 - "thiserror 2.0.12", 5660 + "thiserror 2.0.17", 5642 5661 "url", 5643 5662 "webkit2gtk", 5644 5663 "webkit2gtk-sys", 5645 5664 "webview2-com", 5646 5665 "windows", 5647 - "windows-core", 5666 + "windows-core 0.61.2", 5648 5667 "windows-version", 5649 5668 "x11-dl", 5650 5669 ] ··· 5671 5690 ] 5672 5691 5673 5692 [[package]] 5693 + name = "x11rb" 5694 + version = "0.13.2" 5695 + source = "registry+https://github.com/rust-lang/crates.io-index" 5696 + checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" 5697 + dependencies = [ 5698 + "gethostname", 5699 + "rustix 1.1.2", 5700 + "x11rb-protocol", 5701 + ] 5702 + 5703 + [[package]] 5704 + name = "x11rb-protocol" 5705 + version = "0.13.2" 5706 + source = "registry+https://github.com/rust-lang/crates.io-index" 5707 + checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" 5708 + 5709 + [[package]] 5710 + name = "xkbcommon" 5711 + version = "0.9.0" 5712 + source = "registry+https://github.com/rust-lang/crates.io-index" 5713 + checksum = "a7a974f48060a14e95705c01f24ad9c3345022f4d97441b8a36beb7ed5c4a02d" 5714 + dependencies = [ 5715 + "libc", 5716 + "memmap2", 5717 + "xkeysym", 5718 + ] 5719 + 5720 + [[package]] 5721 + name = "xkeysym" 5722 + version = "0.2.1" 5723 + source = "registry+https://github.com/rust-lang/crates.io-index" 5724 + checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" 5725 + 5726 + [[package]] 5674 5727 name = "yoke" 5675 - version = "0.8.0" 5728 + version = "0.8.1" 5676 5729 source = "registry+https://github.com/rust-lang/crates.io-index" 5677 - checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 5730 + checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" 5678 5731 dependencies = [ 5679 - "serde", 5680 5732 "stable_deref_trait", 5681 5733 "yoke-derive", 5682 5734 "zerofrom", ··· 5684 5736 5685 5737 [[package]] 5686 5738 name = "yoke-derive" 5687 - version = "0.8.0" 5739 + version = "0.8.1" 5688 5740 source = "registry+https://github.com/rust-lang/crates.io-index" 5689 - checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 5741 + checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" 5690 5742 dependencies = [ 5691 5743 "proc-macro2", 5692 5744 "quote", 5693 - "syn 2.0.104", 5745 + "syn 2.0.109", 5694 5746 "synstructure", 5695 5747 ] 5696 5748 5697 5749 [[package]] 5698 5750 name = "zbus" 5699 - version = "5.9.0" 5751 + version = "5.12.0" 5700 5752 source = "registry+https://github.com/rust-lang/crates.io-index" 5701 - checksum = "4bb4f9a464286d42851d18a605f7193b8febaf5b0919d71c6399b7b26e5b0aad" 5753 + checksum = "b622b18155f7a93d1cd2dc8c01d2d6a44e08fb9ebb7b3f9e6ed101488bad6c91" 5702 5754 dependencies = [ 5703 5755 "async-broadcast", 5704 5756 "async-executor", ··· 5718 5770 "ordered-stream", 5719 5771 "serde", 5720 5772 "serde_repr", 5773 + "tokio", 5721 5774 "tracing", 5722 5775 "uds_windows", 5723 - "windows-sys 0.59.0", 5724 - "winnow 0.7.12", 5776 + "uuid", 5777 + "windows-sys 0.61.2", 5778 + "winnow 0.7.13", 5725 5779 "zbus_macros", 5726 5780 "zbus_names", 5727 5781 "zvariant", ··· 5729 5783 5730 5784 [[package]] 5731 5785 name = "zbus_macros" 5732 - version = "5.9.0" 5786 + version = "5.12.0" 5733 5787 source = "registry+https://github.com/rust-lang/crates.io-index" 5734 - checksum = "ef9859f68ee0c4ee2e8cde84737c78e3f4c54f946f2a38645d0d4c7a95327659" 5788 + checksum = "1cdb94821ca8a87ca9c298b5d1cbd80e2a8b67115d99f6e4551ac49e42b6a314" 5735 5789 dependencies = [ 5736 - "proc-macro-crate 3.3.0", 5790 + "proc-macro-crate 3.4.0", 5737 5791 "proc-macro2", 5738 5792 "quote", 5739 - "syn 2.0.104", 5793 + "syn 2.0.109", 5740 5794 "zbus_names", 5741 5795 "zvariant", 5742 5796 "zvariant_utils", ··· 5750 5804 dependencies = [ 5751 5805 "serde", 5752 5806 "static_assertions", 5753 - "winnow 0.7.12", 5807 + "winnow 0.7.13", 5754 5808 "zvariant", 5755 5809 ] 5756 5810 5757 5811 [[package]] 5758 5812 name = "zerocopy" 5759 - version = "0.8.26" 5813 + version = "0.8.27" 5760 5814 source = "registry+https://github.com/rust-lang/crates.io-index" 5761 - checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" 5815 + checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" 5762 5816 dependencies = [ 5763 5817 "zerocopy-derive", 5764 5818 ] 5765 5819 5766 5820 [[package]] 5767 5821 name = "zerocopy-derive" 5768 - version = "0.8.26" 5822 + version = "0.8.27" 5769 5823 source = "registry+https://github.com/rust-lang/crates.io-index" 5770 - checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" 5824 + checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" 5771 5825 dependencies = [ 5772 5826 "proc-macro2", 5773 5827 "quote", 5774 - "syn 2.0.104", 5828 + "syn 2.0.109", 5775 5829 ] 5776 5830 5777 5831 [[package]] ··· 5791 5845 dependencies = [ 5792 5846 "proc-macro2", 5793 5847 "quote", 5794 - "syn 2.0.104", 5848 + "syn 2.0.109", 5795 5849 "synstructure", 5796 5850 ] 5797 5851 5798 5852 [[package]] 5799 - name = "zeroize" 5800 - version = "1.8.1" 5801 - source = "registry+https://github.com/rust-lang/crates.io-index" 5802 - checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 5803 - 5804 - [[package]] 5805 5853 name = "zerotrie" 5806 - version = "0.2.2" 5854 + version = "0.2.3" 5807 5855 source = "registry+https://github.com/rust-lang/crates.io-index" 5808 - checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 5856 + checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" 5809 5857 dependencies = [ 5810 5858 "displaydoc", 5811 5859 "yoke", ··· 5814 5862 5815 5863 [[package]] 5816 5864 name = "zerovec" 5817 - version = "0.11.2" 5865 + version = "0.11.5" 5818 5866 source = "registry+https://github.com/rust-lang/crates.io-index" 5819 - checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" 5867 + checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" 5820 5868 dependencies = [ 5821 5869 "yoke", 5822 5870 "zerofrom", ··· 5825 5873 5826 5874 [[package]] 5827 5875 name = "zerovec-derive" 5828 - version = "0.11.1" 5876 + version = "0.11.2" 5829 5877 source = "registry+https://github.com/rust-lang/crates.io-index" 5830 - checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 5878 + checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" 5831 5879 dependencies = [ 5832 5880 "proc-macro2", 5833 5881 "quote", 5834 - "syn 2.0.104", 5882 + "syn 2.0.109", 5883 + ] 5884 + 5885 + [[package]] 5886 + name = "zune-core" 5887 + version = "0.4.12" 5888 + source = "registry+https://github.com/rust-lang/crates.io-index" 5889 + checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" 5890 + 5891 + [[package]] 5892 + name = "zune-jpeg" 5893 + version = "0.4.21" 5894 + source = "registry+https://github.com/rust-lang/crates.io-index" 5895 + checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" 5896 + dependencies = [ 5897 + "zune-core", 5835 5898 ] 5836 5899 5837 5900 [[package]] 5838 5901 name = "zvariant" 5839 - version = "5.6.0" 5902 + version = "5.8.0" 5840 5903 source = "registry+https://github.com/rust-lang/crates.io-index" 5841 - checksum = "d91b3680bb339216abd84714172b5138a4edac677e641ef17e1d8cb1b3ca6e6f" 5904 + checksum = "2be61892e4f2b1772727be11630a62664a1826b62efa43a6fe7449521cb8744c" 5842 5905 dependencies = [ 5843 5906 "endi", 5844 5907 "enumflags2", 5845 5908 "serde", 5846 - "winnow 0.7.12", 5909 + "url", 5910 + "winnow 0.7.13", 5847 5911 "zvariant_derive", 5848 5912 "zvariant_utils", 5849 5913 ] 5850 5914 5851 5915 [[package]] 5852 5916 name = "zvariant_derive" 5853 - version = "5.6.0" 5917 + version = "5.8.0" 5854 5918 source = "registry+https://github.com/rust-lang/crates.io-index" 5855 - checksum = "3a8c68501be459a8dbfffbe5d792acdd23b4959940fc87785fb013b32edbc208" 5919 + checksum = "da58575a1b2b20766513b1ec59d8e2e68db2745379f961f86650655e862d2006" 5856 5920 dependencies = [ 5857 - "proc-macro-crate 3.3.0", 5921 + "proc-macro-crate 3.4.0", 5858 5922 "proc-macro2", 5859 5923 "quote", 5860 - "syn 2.0.104", 5924 + "syn 2.0.109", 5861 5925 "zvariant_utils", 5862 5926 ] 5863 5927 5864 5928 [[package]] 5865 5929 name = "zvariant_utils" 5866 - version = "3.2.0" 5930 + version = "3.2.1" 5867 5931 source = "registry+https://github.com/rust-lang/crates.io-index" 5868 - checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" 5932 + checksum = "c6949d142f89f6916deca2232cf26a8afacf2b9fdc35ce766105e104478be599" 5869 5933 dependencies = [ 5870 5934 "proc-macro2", 5871 5935 "quote", 5872 5936 "serde", 5873 - "static_assertions", 5874 - "syn 2.0.104", 5875 - "winnow 0.7.12", 5937 + "syn 2.0.109", 5938 + "winnow 0.7.13", 5876 5939 ]
+13 -4
src-tauri/Cargo.toml
··· 18 18 tauri-build = { version = "2", features = [] } 19 19 20 20 [dependencies] 21 - tauri = { version = "2", features = [] } 21 + tauri = { version = "2", features = [ 'tray-icon', 'image-png' ] } 22 22 tauri-plugin-opener = "2" 23 23 serde = { version = "1", features = ["derive"] } 24 24 serde_json = "1" 25 - sqlx = { version = "0.8.6", features = [ "sqlite", "runtime-tokio" ] } 26 - tokio = { version = "1.47.0", features = [ "macros" ] } 27 - dirs = "6.0.0" 25 + tokio = { version = "1.47", features = [ "macros" ] } 26 + dirs = "6.0" 27 + anyhow = "1.0" 28 + flate2 = "1.1" 29 + tauri-plugin-dialog = "2" 30 + crossbeam-channel = "0.5" 31 + tauri-plugin-clipboard-manager = "2" 32 + tauri-plugin-os = "2" 33 + 34 + # [target.'cfg(windows)'.dependencies] 35 + enigo = { version = "0.6.1" } 36 + chrono = "0.4.42" 28 37
+1 -1
src-tauri/build.rs
··· 1 1 fn main() { 2 - tauri_build::build() 2 + tauri_build::build() 3 3 }
+10 -3
src-tauri/capabilities/default.json
··· 2 2 "$schema": "../gen/schemas/desktop-schema.json", 3 3 "identifier": "default", 4 4 "description": "Capability for the main window", 5 - "windows": ["main"], 5 + "windows": [ 6 + "main" 7 + ], 6 8 "permissions": [ 7 9 "core:default", 8 - "opener:default" 10 + "core:window:allow-destroy", 11 + "opener:default", 12 + "dialog:default", 13 + "clipboard-manager:allow-read-text", 14 + "clipboard-manager:allow-write-text", 15 + "os:default" 9 16 ] 10 - } 17 + }
+9
src-tauri/src/frontend_calls/close_app.rs
··· 1 + use tauri::State; 2 + 3 + use crate::utils::config::Config; 4 + 5 + #[tauri::command] 6 + pub fn close_app(conf: State<Config>) { 7 + conf.save(); 8 + std::process::exit(0); 9 + }
+11
src-tauri/src/frontend_calls/get_addresses.rs
··· 1 + use std::sync::Mutex; 2 + 3 + use tauri::State; 4 + 5 + use crate::osc::OSCMessage; 6 + 7 + #[tauri::command] 8 + pub fn get_addresses(addresses: State<&Mutex<Vec<OSCMessage>>>) -> Vec<OSCMessage> { 9 + let addresses = addresses.lock().unwrap(); 10 + addresses.clone() 11 + }
+20
src-tauri/src/frontend_calls/load_previous_tabs.rs
··· 1 + use std::collections::HashMap; 2 + 3 + use tauri::{State, Window}; 4 + 5 + use crate::{structs::nodes::Node, utils::config::Config}; 6 + 7 + #[tauri::command] 8 + pub fn load_previous_tabs( 9 + window: Window, 10 + conf: State<Config>, 11 + ) -> HashMap<String, (Vec<Node>, String, Option<String>, bool)> { 12 + let config = conf.store.lock().unwrap(); 13 + 14 + if !config.hide_editor_on_start { 15 + window.show().unwrap(); 16 + } 17 + 18 + let tabs = config.loaded_tabs.clone(); 19 + tabs 20 + }
+6
src-tauri/src/frontend_calls/mod.rs
··· 1 + pub mod close_app; 2 + pub mod get_addresses; 3 + pub mod load_previous_tabs; 4 + pub mod save_graph; 5 + pub mod settings; 6 + pub mod sync_tab;
+17
src-tauri/src/frontend_calls/save_graph.rs
··· 1 + use std::{fs::File, io::Write, path::PathBuf}; 2 + 3 + use flate2::{write::GzEncoder, Compression}; 4 + use tauri::State; 5 + 6 + use crate::utils::config::Config; 7 + 8 + #[tauri::command] 9 + pub fn save_graph(graph: String, path: PathBuf, conf: State<Config>) { 10 + let file = File::create(&path).unwrap(); 11 + let mut encoder = GzEncoder::new(file, Compression::default()); 12 + 13 + encoder.write_all(graph.as_bytes()).unwrap(); 14 + encoder.finish().unwrap(); 15 + 16 + conf.save(); 17 + }
+15
src-tauri/src/frontend_calls/settings.rs
··· 1 + use tauri::State; 2 + 3 + use crate::utils::config::Config; 4 + 5 + #[tauri::command] 6 + pub fn set_hide_editor_on_app_start(value: bool, conf: State<Config>) { 7 + let mut config = conf.store.lock().unwrap(); 8 + config.hide_editor_on_start = value; 9 + } 10 + 11 + #[tauri::command] 12 + pub fn get_hide_editor_on_app_start(conf: State<Config>) -> bool { 13 + let config = conf.store.lock().unwrap(); 14 + config.hide_editor_on_start 15 + }
+34
src-tauri/src/frontend_calls/sync_tab.rs
··· 1 + use chrono::Utc; 2 + use crossbeam_channel::Sender; 3 + 4 + use tauri::State; 5 + 6 + use crate::{runtime::commands::RuntimeCommand, structs::nodes::Node, utils::config::Config}; 7 + 8 + #[tauri::command] 9 + pub fn sync_tab( 10 + graph: Vec<Node>, 11 + id: String, 12 + name: String, 13 + save_state: bool, 14 + location: Option<String>, 15 + cmd: State<Sender<RuntimeCommand>>, 16 + conf: State<Config>, 17 + ) { 18 + cmd 19 + .send(RuntimeCommand::AddTab(graph.clone(), id.clone())) 20 + .unwrap(); 21 + 22 + let mut config = conf.store.lock().unwrap(); 23 + config.loaded_tabs.insert(id, (graph, name, location, save_state)); 24 + 25 + conf.save_prelocked(config); 26 + } 27 + 28 + #[tauri::command] 29 + pub fn discard_tab(id: String, cmd: State<Sender<RuntimeCommand>>, conf: State<Config>) { 30 + cmd.send(RuntimeCommand::RemoveTab(id.clone())).unwrap(); 31 + 32 + let mut config = conf.store.lock().unwrap(); 33 + config.loaded_tabs.remove(&id); 34 + }
+40 -15
src-tauri/src/lib.rs
··· 1 - use std::fs; 1 + use std::{fs, sync::Mutex}; 2 2 3 - use sqlx::{migrate::MigrateDatabase, Sqlite, SqlitePool}; 3 + use crossbeam_channel::bounded; 4 + use frontend_calls::*; 4 5 5 - use crate::utils::config::Config; 6 + use crate::{osc::OSCMessage, setup::setup, utils::{config::Config, vrchat_builtin_parameters}}; 6 7 8 + mod frontend_calls; 9 + mod osc; 10 + mod runtime; 11 + mod setup; 12 + mod structs; 7 13 mod utils; 8 14 9 15 #[cfg_attr(mobile, tauri::mobile_entry_point)] ··· 11 17 pub async fn run() { 12 18 let container_folder = dirs::config_dir().unwrap().join("VRCMacros"); 13 19 14 - match fs ::metadata(&container_folder){ 20 + match fs::metadata(&container_folder) { 15 21 Ok(meta) => { 16 - if meta.is_file(){ 17 - panic!("document.write('Cannot launch app as the container path is a file not a directory')"); 22 + if meta.is_file() { 23 + panic!("Cannot launch app as the container path is a file not a directory"); 18 24 } 19 25 } 20 26 Err(_) => { ··· 22 28 } 23 29 } 24 30 25 - let db_file = container_folder.join("VRCMacros.db"); 26 - if !db_file.exists(){ Sqlite::create_database(db_file.to_str().unwrap()).await.unwrap(); } 31 + let conf_file = container_folder.join("conf"); 32 + let conf = Config::new(conf_file); 27 33 28 - let conf_file = container_folder.join("VRCMacros.json"); 29 - if !conf_file.exists(){ fs::write(&conf_file, "{ \"setup_complete\": false }").unwrap() } 34 + static ADDRESSES: Mutex<Vec<OSCMessage>> = Mutex::new(Vec::new()); 35 + 36 + let mut addresses = ADDRESSES.lock().unwrap(); 37 + addresses.append(&mut vrchat_builtin_parameters::get_read_addresses()); 38 + drop(addresses); 30 39 31 - let pool = SqlitePool::connect(db_file.to_str().unwrap()).await.unwrap(); 32 - let conf = Config::new(conf_file); 40 + let (runtime_sender, runtime_receiver) = bounded(1024); 33 41 34 42 tauri::Builder::default() 43 + .plugin(tauri_plugin_os::init()) 44 + .plugin(tauri_plugin_clipboard_manager::init()) 45 + .plugin(tauri_plugin_dialog::init()) 35 46 .plugin(tauri_plugin_opener::init()) 36 - .invoke_handler(tauri::generate_handler![]) 37 - .manage(pool) 47 + .invoke_handler(tauri::generate_handler![ 48 + get_addresses::get_addresses, 49 + save_graph::save_graph, 50 + sync_tab::sync_tab, 51 + sync_tab::discard_tab, 52 + load_previous_tabs::load_previous_tabs, 53 + close_app::close_app, 54 + settings::set_hide_editor_on_app_start, 55 + settings::get_hide_editor_on_app_start, 56 + ]) 38 57 .manage(conf) 58 + .manage(&ADDRESSES) 59 + .manage(runtime_sender) 60 + .setup(|app| { 61 + setup(app, &ADDRESSES, runtime_receiver); 62 + Ok(()) 63 + }) 39 64 .run(tauri::generate_context!()) 40 65 .expect("error while running tauri application"); 41 - } 66 + }
+3 -1
src-tauri/src/main.rs
··· 3 3 4 4 fn main() { 5 5 #[cfg(target_os = "linux")] 6 - std::env::set_var("WEBKIT_DISABLE_DMABUF_RENDERER", "1"); // Fix webkit being shit 6 + unsafe{ 7 + std::env::set_var("WEBKIT_DISABLE_DMABUF_RENDERER", "1"); // Fix webkit being shit 8 + } 7 9 8 10 vrcmacros_lib::run() 9 11 }
+60 -42
src-tauri/src/osc.rs
··· 1 1 // https://gist.github.com/phaze-the-dumb/634daacb5141eae2f846e20987dba7a8 2 + use std::net::UdpSocket; 3 + 4 + use crossbeam_channel::Sender; 5 + use serde::Serialize; 2 6 3 - use std::{ net::UdpSocket, sync::mpsc::Sender }; 7 + use crate::structs::parameter_types::ParameterType; 4 8 5 - #[derive(Debug, Clone)] 6 - pub enum OSCValue{ 7 - Int(i32), 8 - Float(f32), 9 - Boolean(bool), 10 - String(String), 9 + #[derive(Debug, Clone, Serialize)] 10 + pub struct OSCMessage { 11 + pub address: String, 12 + pub values: Vec<ParameterType>, 11 13 } 12 14 13 - #[derive(Debug)] 14 - pub struct OSCMessage{ 15 - pub address: String, 16 - pub values: Vec<OSCValue> 15 + impl PartialEq for OSCMessage { 16 + // Technically this isn't exactly equal, but the only time i'm checking if OSCMessage's are equal 17 + // Is when i'm checking for the "address" value 18 + 19 + fn eq(&self, other: &Self) -> bool { 20 + self.address == other.address 21 + } 22 + 23 + fn ne(&self, other: &Self) -> bool { 24 + self.address != other.address 25 + } 17 26 } 18 27 19 - pub fn start_server( sender: Sender<OSCMessage>, addr: &str ) { 28 + // TODO: Implement osc bundles 29 + pub fn start_server(sender: Sender<OSCMessage>, addr: &str) { 20 30 let socket = UdpSocket::bind(addr).unwrap(); 21 31 22 32 loop { ··· 24 34 let (amt, _src) = socket.recv_from(&mut buf).unwrap(); 25 35 26 36 let buf = &mut buf[..amt]; 27 - if buf[0] != 0x2F { panic!("Packet is not an OSC Message"); } 37 + if buf[0] != 0x2F { 38 + panic!("Packet is not an OSC Message"); 39 + } 28 40 29 41 let mut addr: Vec<u8> = Vec::new(); 30 42 let mut value_start = 0; 31 43 32 - loop{ 44 + loop { 33 45 let byte = buf[value_start]; 34 - if byte == 0x00{ break; } 46 + if byte == 0x00 { 47 + break; 48 + } 35 49 36 50 value_start += 1; 37 51 addr.push(byte); 38 52 } 39 53 40 - loop{ 54 + loop { 41 55 let byte = buf[value_start]; 42 56 value_start += 1; 43 57 44 - if byte == 0x2C{ break; } 58 + if byte == 0x2C { 59 + break; 60 + } 45 61 } 46 62 47 63 let mut types: Vec<u8> = Vec::new(); 48 64 49 - loop{ 65 + loop { 50 66 let byte = buf[value_start]; 51 - if byte == 0x00{ break; } 67 + if byte == 0x00 { 68 + break; 69 + } 52 70 53 71 types.push(byte); 54 72 value_start += 1; ··· 57 75 value_start = ((value_start as f32 / 4.0).ceil() * 4.0) as usize; 58 76 let mut values = Vec::new(); 59 77 60 - for tp in types{ 61 - match tp{ 78 + for tp in types { 79 + match tp { 62 80 0x69 => { 63 81 let val_buf = &buf[value_start..value_start + 4]; 64 82 65 83 let bytes = <&[u8; 4]>::try_from(val_buf).unwrap().clone(); 66 84 let int = i32::from_be_bytes(bytes); 67 85 68 - values.push(OSCValue::Int(int)); 86 + values.push(ParameterType::Int(int)); 69 87 value_start += 4; 70 - }, 88 + } 71 89 0x66 => { 72 90 let val_buf = &buf[value_start..value_start + 4]; 73 91 74 92 let bytes = <&[u8; 4]>::try_from(val_buf).unwrap().clone(); 75 93 let float = f32::from_be_bytes(bytes); 76 94 77 - values.push(OSCValue::Float(float)); 95 + values.push(ParameterType::Float(float)); 78 96 value_start += 4; 79 - }, 80 - 0x54 => values.push(OSCValue::Boolean(true)), 81 - 0x46 => values.push(OSCValue::Boolean(false)), 97 + } 98 + 0x54 => values.push(ParameterType::Boolean(true)), 99 + 0x46 => values.push(ParameterType::Boolean(false)), 82 100 _ => {} 83 101 } 84 102 } 85 103 86 104 let message = OSCMessage { 87 105 address: String::from_utf8(addr.clone()).unwrap(), 88 - values: values 106 + values: values, 89 107 }; 90 108 91 109 sender.send(message).unwrap(); 92 110 } 93 111 } 94 112 95 - pub fn send_message( address: &str, values: Vec<OSCValue>, ip_addr: &str ){ 113 + pub fn send_message(address: &str, values: Vec<ParameterType>, ip_addr: &str) { 96 114 let socket = UdpSocket::bind("127.0.0.1:0").unwrap(); 97 115 let mut buf: Vec<u8> = Vec::new(); 98 116 ··· 110 128 let mut value_count = 1; 111 129 for value in values.clone() { 112 130 match value { 113 - OSCValue::Boolean( val ) => buf.push(if val { 0x54 } else { 0x46 }), 114 - OSCValue::Float(_) => buf.push(0x66), 115 - OSCValue::Int(_) => buf.push(0x69), 116 - OSCValue::String(_) => buf.push(0x73) 131 + ParameterType::Boolean(val) => buf.push(if val { 0x54 } else { 0x46 }), 132 + ParameterType::Float(_) => buf.push(0x66), 133 + ParameterType::Int(_) => buf.push(0x69), 134 + ParameterType::String(_) => buf.push(0x73), 135 + _ => {} 117 136 }; 118 137 119 138 value_count += 1; 120 139 } 121 140 122 - for _i in 0..4 - (value_count % 4) { 141 + for _i in 0..4 - (value_count % 4) { 123 142 buf.push(0); 124 143 } 125 144 126 - for value in values{ 127 - match value{ 128 - OSCValue::Float( val ) => buf.append(&mut val.to_be_bytes().to_vec()), 129 - OSCValue::Int( val ) => buf.append(&mut val.to_be_bytes().to_vec()), 130 - OSCValue::String( val ) => { 145 + for value in values { 146 + match value { 147 + ParameterType::Float(val) => buf.append(&mut val.to_be_bytes().to_vec()), 148 + ParameterType::Int(val) => buf.append(&mut val.to_be_bytes().to_vec()), 149 + ParameterType::String(val) => { 131 150 let mut str_buf = val.as_bytes().to_vec(); 132 151 let buf_len = str_buf.len().clone(); 133 152 134 153 buf.append(&mut str_buf); 135 154 136 - for _i in 0..4 - (buf_len % 4) { 155 + for _i in 0..4 - (buf_len % 4) { 137 156 buf.push(0); 138 157 } 139 158 } ··· 141 160 } 142 161 } 143 162 144 - println!("{:X?}", &buf); 145 163 socket.send_to(&buf, ip_addr).unwrap(); 146 - } 164 + }
+9
src-tauri/src/runtime/commands.rs
··· 1 + use crate::{osc::OSCMessage, structs::nodes::Node}; 2 + 3 + #[derive(Debug)] 4 + pub enum RuntimeCommand { 5 + OSCMessage(OSCMessage), 6 + 7 + AddTab(Vec<Node>, String), 8 + RemoveTab(String), 9 + }
+51
src-tauri/src/runtime/nodes/conditional/ifequal.rs
··· 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 5 + 6 + pub struct ConditionalIfEqual { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 9 + } 10 + 11 + impl ConditionalIfEqual { 12 + pub fn new(node: Node) -> Box<Self> { 13 + Box::new(Self { 14 + outputs: node.outputs.iter().map(|x| { 15 + x.connections.iter() 16 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 17 + 18 + inputs: node.inputs.iter().map(|x| { 19 + let y = x.connections.get(0); 20 + if let Some(y) = y{ 21 + Some((y.node.clone(), y.index, y.value_type)) 22 + } else{ 23 + None 24 + } 25 + }).collect(), 26 + }) 27 + } 28 + } 29 + 30 + impl RuntimeNode for ConditionalIfEqual { 31 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 32 + self.outputs.clone() 33 + } 34 + 35 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 36 + self.inputs.clone() 37 + } 38 + 39 + fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType> { 40 + let is_equal = args[1] == args[2]; 41 + 42 + vec![ 43 + ParameterType::Flow(is_equal), 44 + ParameterType::Flow(!is_equal), 45 + ] 46 + } 47 + 48 + fn is_entrypoint(&self) -> bool { 49 + false 50 + } 51 + }
+51
src-tauri/src/runtime/nodes/conditional/iffalse.rs
··· 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 5 + 6 + pub struct ConditionalIfFalse { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 9 + } 10 + 11 + impl ConditionalIfFalse { 12 + pub fn new(node: Node) -> Box<Self> { 13 + Box::new(Self { 14 + outputs: node.outputs.iter().map(|x| { 15 + x.connections.iter() 16 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 17 + 18 + inputs: node.inputs.iter().map(|x| { 19 + let y = x.connections.get(0); 20 + if let Some(y) = y{ 21 + Some((y.node.clone(), y.index, y.value_type)) 22 + } else{ 23 + None 24 + } 25 + }).collect(), 26 + }) 27 + } 28 + } 29 + 30 + impl RuntimeNode for ConditionalIfFalse { 31 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 32 + self.outputs.clone() 33 + } 34 + 35 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 36 + self.inputs.clone() 37 + } 38 + 39 + fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType> { 40 + let is_false = !args[1].as_bool().unwrap(); 41 + 42 + vec![ 43 + ParameterType::Flow(is_false), 44 + ParameterType::Flow(!is_false), 45 + ] 46 + } 47 + 48 + fn is_entrypoint(&self) -> bool { 49 + false 50 + } 51 + }
+51
src-tauri/src/runtime/nodes/conditional/iftrue.rs
··· 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 5 + 6 + pub struct ConditionalIfTrue { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 9 + } 10 + 11 + impl ConditionalIfTrue { 12 + pub fn new(node: Node) -> Box<Self> { 13 + Box::new(Self { 14 + outputs: node.outputs.iter().map(|x| { 15 + x.connections.iter() 16 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 17 + 18 + inputs: node.inputs.iter().map(|x| { 19 + let y = x.connections.get(0); 20 + if let Some(y) = y{ 21 + Some((y.node.clone(), y.index, y.value_type)) 22 + } else{ 23 + None 24 + } 25 + }).collect(), 26 + }) 27 + } 28 + } 29 + 30 + impl RuntimeNode for ConditionalIfTrue { 31 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 32 + self.outputs.clone() 33 + } 34 + 35 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 36 + self.inputs.clone() 37 + } 38 + 39 + fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType> { 40 + let is_true = args[1].as_bool().unwrap(); 41 + 42 + vec![ 43 + ParameterType::Flow(is_true), 44 + ParameterType::Flow(!is_true), 45 + ] 46 + } 47 + 48 + fn is_entrypoint(&self) -> bool { 49 + false 50 + } 51 + }
+3
src-tauri/src/runtime/nodes/conditional/mod.rs
··· 1 + pub mod ifequal; 2 + pub mod iffalse; 3 + pub mod iftrue;
+47
src-tauri/src/runtime/nodes/debug.rs
··· 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 5 + 6 + pub struct Debug { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>> 9 + } 10 + 11 + impl Debug { 12 + pub fn new(node: Node) -> Box<Self> { 13 + Box::new(Self { 14 + outputs: node.outputs.iter().map(|x| { 15 + x.connections.iter() 16 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 17 + 18 + inputs: node.inputs.iter().map(|x| { 19 + let y = x.connections.get(0); 20 + if let Some(y) = y{ 21 + Some((y.node.clone(), y.index, y.value_type)) 22 + } else{ 23 + None 24 + } 25 + }).collect(), 26 + }) 27 + } 28 + } 29 + 30 + impl RuntimeNode for Debug { 31 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 32 + self.outputs.clone() 33 + } 34 + 35 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 36 + self.inputs.clone() 37 + } 38 + 39 + fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType> { 40 + dbg!(&args); // TODO: Debug to actual UI instead of console 41 + vec![] 42 + } 43 + 44 + fn is_entrypoint(&self) -> bool { 45 + false 46 + } 47 + }
+1
src-tauri/src/runtime/nodes/oscactions/mod.rs
··· 1 + pub mod sendchatbox;
+61
src-tauri/src/runtime/nodes/oscactions/sendchatbox.rs
··· 1 + use std::vec; 2 + 3 + use crate::{ 4 + osc, 5 + runtime::nodes::RuntimeNode, 6 + structs::{nodes::Node, parameter_types::ParameterType}, 7 + }; 8 + 9 + pub struct OSCActionsSendChatbox { 10 + outputs: Vec<Vec<(String, isize, isize)>>, 11 + inputs: Vec<Option<(String, isize, isize)>>, 12 + } 13 + 14 + impl OSCActionsSendChatbox { 15 + pub fn new(node: Node) -> Box<Self> { 16 + Box::new(Self { 17 + outputs: node.outputs.iter().map(|x| { 18 + x.connections.iter() 19 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 20 + 21 + inputs: node.inputs.iter().map(|x| { 22 + let y = x.connections.get(0); 23 + if let Some(y) = y{ 24 + Some((y.node.clone(), y.index, y.value_type)) 25 + } else{ 26 + None 27 + } 28 + }).collect(), 29 + }) 30 + } 31 + } 32 + 33 + impl RuntimeNode for OSCActionsSendChatbox { 34 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 35 + self.outputs.clone() 36 + } 37 + 38 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 39 + self.inputs.clone() 40 + } 41 + 42 + fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType> { 43 + if let Ok(msg) = args[1].as_string(){ 44 + osc::send_message( 45 + "/chatbox/input", 46 + vec![ 47 + ParameterType::String(msg.clone()), 48 + ParameterType::Boolean(true), 49 + ParameterType::Boolean(false), 50 + ], 51 + "127.0.0.1:9000", 52 + ); 53 + } 54 + 55 + vec![] 56 + } 57 + 58 + fn is_entrypoint(&self) -> bool { 59 + false 60 + } 61 + }
+69
src-tauri/src/runtime/nodes/osctrigger.rs
··· 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 5 + 6 + pub struct OSCTrigger { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 9 + 10 + address: Option<String> 11 + } 12 + 13 + impl OSCTrigger { 14 + pub fn new(node: Node) -> Box<Self> { 15 + let value = &node.statics[0].value; 16 + 17 + Box::new(Self { 18 + outputs: node.outputs.iter().map(|x| { 19 + x.connections.iter() 20 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 21 + 22 + inputs: node.inputs.iter().map(|x| { 23 + let y = x.connections.get(0); 24 + if let Some(y) = y{ 25 + Some((y.node.clone(), y.index, y.value_type)) 26 + } else{ 27 + None 28 + } 29 + }).collect(), 30 + 31 + address: if value.is_null() { 32 + None 33 + } else { 34 + Some(value.as_str().unwrap().to_owned()) 35 + }, 36 + }) 37 + } 38 + } 39 + 40 + impl RuntimeNode for OSCTrigger { 41 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 42 + self.outputs.clone() 43 + } 44 + 45 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 46 + self.inputs.clone() 47 + } 48 + 49 + fn execute(&mut self, mut args: Vec<ParameterType>) -> Vec<ParameterType> { 50 + if args.len() == 0{ return args } 51 + 52 + let execute = if let Some(internal_address) = &self.address { 53 + if let Ok(address) = args[0].as_string() { 54 + address == *internal_address 55 + } else{ 56 + false 57 + } 58 + } else{ 59 + false 60 + }; 61 + 62 + args[0] = ParameterType::Flow(execute); 63 + args 64 + } 65 + 66 + fn is_entrypoint(&self) -> bool { 67 + true 68 + } 69 + }
+73
src-tauri/src/runtime/nodes/press_key.rs
··· 1 + use std::sync::{Arc, Mutex}; 2 + 3 + use enigo::{Direction, Enigo, Key, Keyboard}; 4 + 5 + use crate::{ 6 + runtime::nodes::RuntimeNode, 7 + structs::{nodes::Node, parameter_types::ParameterType}, 8 + }; 9 + 10 + pub struct PressKey { 11 + outputs: Vec<Vec<(String, isize, isize)>>, 12 + inputs: Vec<Option<(String, isize, isize)>>, 13 + 14 + key: Option<char>, 15 + enigo: Arc<Mutex<Enigo>>, 16 + } 17 + 18 + impl PressKey { 19 + pub fn new(node: Node, enigo: Arc<Mutex<Enigo>>) -> Box<Self> { 20 + let value = &node.statics[0].value; 21 + 22 + Box::new(Self { 23 + outputs: node.outputs.iter().map(|x| { 24 + x.connections.iter() 25 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 26 + 27 + inputs: node.inputs.iter().map(|x| { 28 + let y = x.connections.get(0); 29 + if let Some(y) = y{ 30 + Some((y.node.clone(), y.index, y.value_type)) 31 + } else{ 32 + None 33 + } 34 + }).collect(), 35 + 36 + enigo, 37 + key: if value.is_null() { 38 + None 39 + } else { 40 + let string = value.as_str().unwrap().to_owned(); 41 + 42 + if string.len() == 1 { 43 + Some(string.chars().nth(0).unwrap()) 44 + } else { 45 + None 46 + } 47 + }, 48 + }) 49 + } 50 + } 51 + 52 + impl RuntimeNode for PressKey { 53 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 54 + self.outputs.clone() 55 + } 56 + 57 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 58 + self.inputs.clone() 59 + } 60 + 61 + fn execute(&mut self, _: Vec<ParameterType>) -> Vec<ParameterType> { 62 + if self.key.is_some() { 63 + let mut enigo = self.enigo.lock().unwrap(); 64 + enigo.key(Key::MediaPlayPause, Direction::Click).unwrap(); 65 + } 66 + 67 + vec![] 68 + } 69 + 70 + fn is_entrypoint(&self) -> bool { 71 + false 72 + } 73 + }
+70
src-tauri/src/runtime/nodes/shell.rs
··· 1 + use std::{io::Stdin, process::{Command, Stdio}}; 2 + 3 + use crate::{ 4 + runtime::nodes::RuntimeNode, 5 + structs::{nodes::Node, parameter_types::ParameterType}, 6 + }; 7 + 8 + pub struct ShellCommand { 9 + outputs: Vec<Vec<(String, isize, isize)>>, 10 + inputs: Vec<Option<(String, isize, isize)>> 11 + } 12 + 13 + impl ShellCommand { 14 + pub fn new(node: Node) -> Box<Self> { 15 + Box::new(Self { 16 + outputs: node.outputs.iter().map(|x| { 17 + x.connections.iter() 18 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 19 + 20 + inputs: node.inputs.iter().map(|x| { 21 + let y = x.connections.get(0); 22 + if let Some(y) = y{ 23 + Some((y.node.clone(), y.index, y.value_type)) 24 + } else{ 25 + None 26 + } 27 + }).collect() 28 + }) 29 + } 30 + } 31 + 32 + impl RuntimeNode for ShellCommand { 33 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 34 + self.outputs.clone() 35 + } 36 + 37 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 38 + self.inputs.clone() 39 + } 40 + 41 + fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType> { 42 + if let Ok(cmd) = args[1].as_string(){ 43 + if cmd != ""{ 44 + let mut split_cmd = cmd.split(" "); 45 + 46 + let mut cmd = Command::new(split_cmd.nth(0).unwrap()); 47 + if split_cmd.clone().count() > 0{ cmd.args(split_cmd); } 48 + 49 + cmd.stdout(Stdio::piped()); 50 + cmd.stderr(Stdio::piped()); 51 + 52 + let child = cmd.spawn().unwrap(); 53 + let output = child.wait_with_output().unwrap(); 54 + 55 + vec![ 56 + ParameterType::Flow(true), 57 + ParameterType::String(str::from_utf8(&output.stdout).unwrap().to_owned()) 58 + ] 59 + } else{ 60 + vec![ ParameterType::Flow(false) ] 61 + } 62 + } else{ 63 + vec![ ParameterType::Flow(false) ] 64 + } 65 + } 66 + 67 + fn is_entrypoint(&self) -> bool { 68 + false 69 + } 70 + }
+60
src-tauri/src/runtime/nodes/statics/float.rs
··· 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 5 + 6 + pub struct StaticFloat { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 9 + 10 + value: Option<f32>, 11 + } 12 + 13 + impl StaticFloat { 14 + pub fn new(node: Node) -> Box<Self> { 15 + let value = &node.statics[0].value; 16 + 17 + Box::new(Self { 18 + outputs: node.outputs.iter().map(|x| { 19 + x.connections.iter() 20 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 21 + 22 + inputs: node.inputs.iter().map(|x| { 23 + let y = x.connections.get(0); 24 + if let Some(y) = y{ 25 + Some((y.node.clone(), y.index, y.value_type)) 26 + } else{ 27 + None 28 + } 29 + }).collect(), 30 + 31 + value: if value.is_null() { 32 + None 33 + } else { 34 + Some(value.as_f64().unwrap() as f32) 35 + } 36 + }) 37 + } 38 + } 39 + 40 + impl RuntimeNode for StaticFloat { 41 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 42 + self.outputs.clone() 43 + } 44 + 45 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 46 + self.inputs.clone() 47 + } 48 + 49 + fn execute(&mut self, _: Vec<ParameterType>) -> Vec<ParameterType> { 50 + if self.value.is_some() { 51 + vec![ParameterType::Float(self.value.clone().unwrap())] 52 + } else { 53 + vec![ParameterType::Float(0.0)] 54 + } 55 + } 56 + 57 + fn is_entrypoint(&self) -> bool { 58 + false 59 + } 60 + }
+60
src-tauri/src/runtime/nodes/statics/int.rs
··· 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 5 + 6 + pub struct StaticInt { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 9 + 10 + value: Option<i32>, 11 + } 12 + 13 + impl StaticInt { 14 + pub fn new(node: Node) -> Box<Self> { 15 + let value = &node.statics[0].value; 16 + 17 + Box::new(Self { 18 + outputs: node.outputs.iter().map(|x| { 19 + x.connections.iter() 20 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 21 + 22 + inputs: node.inputs.iter().map(|x| { 23 + let y = x.connections.get(0); 24 + if let Some(y) = y{ 25 + Some((y.node.clone(), y.index, y.value_type)) 26 + } else{ 27 + None 28 + } 29 + }).collect(), 30 + 31 + value: if value.is_null() { 32 + None 33 + } else { 34 + Some(value.as_i64().unwrap() as i32) 35 + } 36 + }) 37 + } 38 + } 39 + 40 + impl RuntimeNode for StaticInt { 41 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 42 + self.outputs.clone() 43 + } 44 + 45 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 46 + self.inputs.clone() 47 + } 48 + 49 + fn execute(&mut self, _: Vec<ParameterType>) -> Vec<ParameterType> { 50 + if self.value.is_some() { 51 + vec![ParameterType::Int(self.value.clone().unwrap())] 52 + } else { 53 + vec![ParameterType::Int(0)] 54 + } 55 + } 56 + 57 + fn is_entrypoint(&self) -> bool { 58 + false 59 + } 60 + }
+3
src-tauri/src/runtime/nodes/statics/mod.rs
··· 1 + pub mod float; 2 + pub mod int; 3 + pub mod string;
+60
src-tauri/src/runtime/nodes/statics/string.rs
··· 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 5 + 6 + pub struct StaticString { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 9 + 10 + value: Option<String>, 11 + } 12 + 13 + impl StaticString { 14 + pub fn new(node: Node) -> Box<Self> { 15 + let value = &node.statics[0].value; 16 + 17 + Box::new(Self { 18 + outputs: node.outputs.iter().map(|x| { 19 + x.connections.iter() 20 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 21 + 22 + inputs: node.inputs.iter().map(|x| { 23 + let y = x.connections.get(0); 24 + if let Some(y) = y{ 25 + Some((y.node.clone(), y.index, y.value_type)) 26 + } else{ 27 + None 28 + } 29 + }).collect(), 30 + 31 + value: if value.is_null() { 32 + None 33 + } else { 34 + Some(value.as_str().unwrap().to_owned()) 35 + } 36 + }) 37 + } 38 + } 39 + 40 + impl RuntimeNode for StaticString { 41 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 42 + self.outputs.clone() 43 + } 44 + 45 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 46 + self.inputs.clone() 47 + } 48 + 49 + fn execute(&mut self, _: Vec<ParameterType>) -> Vec<ParameterType> { 50 + if self.value.is_some() { 51 + vec![ParameterType::String(self.value.clone().unwrap())] 52 + } else { 53 + vec![ParameterType::String("".to_owned())] 54 + } 55 + } 56 + 57 + fn is_entrypoint(&self) -> bool { 58 + false 59 + } 60 + }
+99
src-tauri/src/runtime/nodes.rs
··· 1 + use std::{ 2 + collections::HashMap, 3 + sync::{Arc, Mutex}, 4 + }; 5 + 6 + // #[cfg(target_os = "windows")] 7 + use enigo::Enigo; 8 + 9 + use crate::{ 10 + runtime::nodes::{ 11 + conditional::{ 12 + ifequal::ConditionalIfEqual, iffalse::ConditionalIfFalse, iftrue::ConditionalIfTrue, 13 + }, debug::Debug, oscactions::sendchatbox::OSCActionsSendChatbox, osctrigger::OSCTrigger, shell::ShellCommand, statics::{float::StaticFloat, int::StaticInt, string::StaticString} 14 + }, 15 + structs::{nodes::Node, parameter_types::ParameterType}, 16 + }; 17 + 18 + // #[cfg(target_os = "windows")] 19 + use crate::runtime::nodes::press_key::PressKey; 20 + 21 + mod conditional; 22 + mod debug; 23 + mod oscactions; 24 + mod osctrigger; 25 + mod statics; 26 + mod shell; 27 + 28 + // #[cfg(target_os = "windows")] 29 + mod press_key; 30 + 31 + pub struct RuntimeNodeTree { 32 + pub nodes: HashMap<String, Box<dyn RuntimeNode>>, 33 + } 34 + 35 + unsafe impl Send for RuntimeNodeTree {} 36 + 37 + impl RuntimeNodeTree { 38 + pub fn from(tree: Vec<Node>, /*#[cfg(target_os = "windows")]*/ enigo: Arc<Mutex<Enigo>>) -> Self { 39 + let mut runtime_nodes: HashMap<String, Box<dyn RuntimeNode>> = HashMap::new(); 40 + for node in tree { 41 + match node.type_id.as_str() { 42 + "osctrigger" => { 43 + runtime_nodes.insert(node.id.clone(), OSCTrigger::new(node)); 44 + } 45 + 46 + "staticstring" => { 47 + runtime_nodes.insert(node.id.clone(), StaticString::new(node)); 48 + } 49 + "staticint" => { 50 + runtime_nodes.insert(node.id.clone(), StaticInt::new(node)); 51 + } 52 + "staticfloat" => { 53 + runtime_nodes.insert(node.id.clone(), StaticFloat::new(node)); 54 + } 55 + 56 + "iftrue" => { 57 + runtime_nodes.insert(node.id.clone(), ConditionalIfTrue::new(node)); 58 + } 59 + "iffalse" => { 60 + runtime_nodes.insert(node.id.clone(), ConditionalIfFalse::new(node)); 61 + } 62 + "ifequal" => { 63 + runtime_nodes.insert(node.id.clone(), ConditionalIfEqual::new(node)); 64 + } 65 + 66 + "oscsendchatbox" => { 67 + runtime_nodes.insert(node.id.clone(), OSCActionsSendChatbox::new(node)); 68 + } 69 + 70 + "debug" => { 71 + runtime_nodes.insert(node.id.clone(), Debug::new(node)); 72 + } 73 + 74 + // #[cfg(target_os = "windows")] 75 + "presskey" => { 76 + runtime_nodes.insert(node.id.clone(), PressKey::new(node, enigo.clone())); 77 + } 78 + 79 + "shellcommand" => { 80 + runtime_nodes.insert(node.id.clone(), ShellCommand::new(node)); 81 + } 82 + 83 + _ => {} 84 + } 85 + } 86 + 87 + Self { 88 + nodes: runtime_nodes, 89 + } 90 + } 91 + } 92 + 93 + pub trait RuntimeNode { 94 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>>; // Node ID, input index, output value type 95 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>>; // Node ID, input index, output value type 96 + 97 + fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType>; // Then call functions on the second loop 98 + fn is_entrypoint(&self) -> bool; 99 + }
+97
src-tauri/src/runtime.rs
··· 1 + use std::collections::HashMap; 2 + 3 + use anyhow::{bail, Result}; 4 + 5 + use crate::{runtime::nodes::RuntimeNodeTree, structs::parameter_types::ParameterType}; 6 + 7 + pub mod commands; 8 + pub mod nodes; 9 + 10 + // TODO: Variables 11 + 12 + pub fn recurse_runtime(entry: String, tab: &mut RuntimeNodeTree, args: Vec<ParameterType>) -> Result<()>{ 13 + let ( out_args, output_map ) = runtime(entry, tab, args)?; 14 + 15 + let mut next_node_args: HashMap<String, Vec<ParameterType>> = HashMap::new(); 16 + 17 + for i in 0..out_args.len(){ 18 + if output_map.len() <= i { break; } 19 + let links = &output_map[i]; 20 + 21 + for ( id, link_index, _ ) in links{ 22 + let link_index = link_index.clone() as usize; 23 + 24 + if next_node_args.contains_key(id){ 25 + let args: &mut _ = next_node_args.get_mut(id).unwrap(); 26 + while args.len() < link_index{ args.push(ParameterType::None); } 27 + 28 + args.push(out_args[i].clone()); 29 + } else{ 30 + let mut args = vec![ParameterType::None; link_index]; 31 + args.push(out_args[i].clone()); 32 + 33 + next_node_args.insert(id.clone(), args); 34 + } 35 + } 36 + } 37 + 38 + for i in 0..out_args.len(){ 39 + if let ParameterType::Flow(next) = out_args[i]{ 40 + if next{ 41 + let links = &output_map[i]; 42 + 43 + for ( id, _, _ ) in links{ 44 + let args = next_node_args.remove(id).unwrap(); 45 + recurse_runtime(id.clone(), tab, args)?; 46 + } 47 + } 48 + } 49 + } 50 + 51 + Ok(()) 52 + } 53 + 54 + pub fn runtime(entry: String, tab: &mut RuntimeNodeTree, mut args: Vec<ParameterType>) -> Result<(Vec<ParameterType>, Vec<Vec<(String, isize, isize)>>)> { 55 + let node = tab.nodes.get_mut(&entry); 56 + if node.is_none() { bail!("Cannot find node"); } 57 + 58 + let node = node.unwrap(); 59 + let inputs = node.inputs(); 60 + 61 + let mut needed_input_nodes = HashMap::new(); 62 + 63 + for i in 0..inputs.len(){ 64 + if i >= args.len() || args[i] == ParameterType::None{ 65 + if let Some(input) = &inputs[i]{ 66 + if !needed_input_nodes.contains_key(&input.0){ 67 + needed_input_nodes.insert(input.0.clone(), vec![(input.1.clone(), i.clone())]); 68 + } else{ 69 + needed_input_nodes.get_mut(&input.0).unwrap().push((input.1.clone(), i.clone())); 70 + } 71 + } 72 + } 73 + } 74 + 75 + for ( id, needed ) in needed_input_nodes{ 76 + let (out_args, _) = runtime(id, tab, vec![]).unwrap(); 77 + 78 + for ( output, input ) in needed{ 79 + let arg = &out_args[output as usize]; 80 + 81 + if args.len() >= input{ 82 + while args.len() < input{ args.push(ParameterType::None); } 83 + args.push(arg.clone()); 84 + } else{ 85 + args[input] = arg.clone(); 86 + } 87 + } 88 + } 89 + 90 + let node = tab.nodes.get_mut(&entry); // TODO: Find a way to only do this lookup once 91 + if node.is_none() { bail!("Cannot find node"); } 92 + 93 + let node = node.unwrap(); 94 + 95 + let output = node.execute(args); 96 + Ok((output, node.outputs())) 97 + }
+147
src-tauri/src/setup.rs
··· 1 + use crossbeam_channel::{bounded, Receiver}; 2 + use std::{ 3 + collections::HashMap, 4 + fs::File, 5 + io::Read, 6 + sync::{Arc, Mutex}, 7 + }; 8 + 9 + use flate2::read::GzDecoder; 10 + use serde_json::{Map, Value}; 11 + use tauri::{App, Emitter, Listener, Manager, WindowEvent}; 12 + 13 + use crate::{ 14 + osc::{self, OSCMessage}, runtime::{commands::RuntimeCommand, nodes::RuntimeNodeTree, recurse_runtime}, structs::parameter_types::ParameterType, utils::{setup_traymenu::setup_traymenu, vrchat_builtin_parameters} 15 + }; 16 + 17 + pub fn setup( 18 + app: &mut App, 19 + addresses: &'static Mutex<Vec<OSCMessage>>, 20 + runtime_command_receiver: Receiver<RuntimeCommand>, 21 + ) { 22 + let window = app.get_webview_window("main").unwrap(); 23 + window.hide().unwrap(); 24 + 25 + let win_handle = window.clone(); 26 + 27 + window.on_window_event(move |event| match event { 28 + WindowEvent::CloseRequested { api, .. } => { 29 + api.prevent_close(); 30 + win_handle.emit("prompt_to_close", ()).unwrap(); 31 + } 32 + WindowEvent::Resized(_) => { 33 + let minimised = win_handle.is_minimized().unwrap(); 34 + if minimised{ 35 + win_handle.hide().unwrap(); 36 + win_handle.emit("hide-window", ()).unwrap(); 37 + win_handle.unminimize().unwrap(); 38 + } 39 + } 40 + _ => {} 41 + }); 42 + 43 + setup_traymenu(app.handle()); 44 + 45 + let handle = window.clone(); 46 + window.listen("tauri://drag-drop", move |ev| { 47 + let path: Value = serde_json::from_str(ev.payload()).unwrap(); 48 + let path = path["paths"][0].as_str().unwrap(); 49 + 50 + let file = File::open(&path).unwrap(); 51 + let mut decoder = GzDecoder::new(file); 52 + let mut string = String::new(); 53 + 54 + decoder.read_to_string(&mut string).unwrap(); 55 + 56 + let mut map = Map::new(); 57 + 58 + map.insert("path".to_owned(), Value::String(path.to_owned())); 59 + map.insert("graph".to_owned(), Value::String(string)); 60 + 61 + handle.emit("load_new_tab", Value::Object(map)).unwrap(); 62 + }); 63 + 64 + let (sender, receiver) = bounded(1024); 65 + 66 + tokio::spawn(async move { 67 + osc::start_server(sender, "127.0.0.1:9001"); 68 + }); 69 + 70 + let (runtime_sender, runtime_receiver) = bounded(1024); 71 + 72 + let runtime_sender_1 = runtime_sender.clone(); 73 + tokio::spawn(async move { 74 + loop { 75 + let cmd = runtime_command_receiver.recv().unwrap(); 76 + runtime_sender_1.send(cmd).unwrap(); 77 + } 78 + }); 79 + 80 + tokio::spawn(async move { 81 + loop { 82 + let message = receiver.recv().unwrap(); 83 + 84 + window.emit("osc-message", &message).unwrap(); 85 + 86 + let msg = message.clone(); 87 + let mut addrs = addresses.lock().unwrap(); 88 + if !addrs.contains(&msg) { 89 + addrs.push(msg); 90 + } 91 + 92 + if message.address == "/avatar/change".to_owned(){ 93 + *addrs = vrchat_builtin_parameters::get_read_addresses(); 94 + 95 + // TODO: Read avatar paramaters from file 96 + } 97 + 98 + runtime_sender 99 + .send(RuntimeCommand::OSCMessage(message)) 100 + .unwrap(); 101 + } 102 + }); 103 + 104 + // TODO: Run tabs in seperate threads (really not looking forward to this... thanks rust) 105 + 106 + tokio::spawn(async move { 107 + let mut tabs: HashMap<String, RuntimeNodeTree> = HashMap::new(); 108 + 109 + // #[cfg(target_os = "windows")] 110 + let enigo = Arc::new(Mutex::new(enigo::Enigo::new(&enigo::Settings::default()).unwrap())); 111 + 112 + loop { 113 + let cmd = runtime_receiver.recv().unwrap(); 114 + 115 + match cmd { 116 + RuntimeCommand::OSCMessage(msg) => { 117 + for (_, mut tab) in &mut tabs { 118 + let keys: Vec<String> = tab.nodes.keys().map(|x| x.clone()).collect(); 119 + 120 + for id in keys { 121 + let entry = tab.nodes[&id].is_entrypoint(); 122 + 123 + if entry { 124 + let mut args = vec![ ParameterType::String(msg.address.clone())]; 125 + let mut values = msg.values.clone(); 126 + 127 + args.append(&mut values); 128 + let _ = recurse_runtime(id.clone(), &mut tab, args); 129 + } 130 + } 131 + } 132 + } 133 + 134 + RuntimeCommand::AddTab(graph, id) => { 135 + // #[cfg(target_os = "windows")] 136 + tabs.insert(id, RuntimeNodeTree::from(graph, enigo.clone())); 137 + 138 + // #[cfg(target_os = "linux")] 139 + // tabs.insert(id, RuntimeNodeTree::from(graph)); 140 + } 141 + RuntimeCommand::RemoveTab(id) => { 142 + tabs.remove(&id); 143 + } 144 + } 145 + } 146 + }); 147 + }
+2
src-tauri/src/structs/mod.rs
··· 1 + pub mod nodes; 2 + pub mod parameter_types;
+43
src-tauri/src/structs/nodes.rs
··· 1 + use serde::{Deserialize, Serialize}; 2 + use serde_json::Value; 3 + 4 + #[derive(Serialize, Deserialize, Debug, Clone)] 5 + pub struct Node { 6 + pub id: String, 7 + pub name: String, 8 + pub outputs: Vec<NodeIO>, 9 + pub inputs: Vec<NodeIO>, 10 + pub pos: [f32; 2], 11 + pub statics: Vec<NodeStatic>, 12 + 13 + #[serde(rename = "typeId")] 14 + pub type_id: String, 15 + } 16 + 17 + #[derive(Serialize, Deserialize, Debug, Clone)] 18 + pub struct NodeStatic { 19 + pub name: String, 20 + 21 + #[serde(rename = "type")] 22 + pub value_type: isize, 23 + pub value: Value, 24 + } 25 + 26 + #[derive(Serialize, Deserialize, Debug, Clone)] 27 + pub struct NodeIO { 28 + pub name: String, 29 + 30 + #[serde(rename = "type")] 31 + pub value_type: isize, 32 + pub connections: Vec<NodeOutputConnections>, 33 + } 34 + 35 + #[derive(Serialize, Deserialize, Debug, Clone)] 36 + pub struct NodeOutputConnections { 37 + pub name: String, 38 + pub node: String, 39 + pub index: isize, 40 + 41 + #[serde(rename = "type")] 42 + pub value_type: isize, 43 + }
+68
src-tauri/src/structs/parameter_types.rs
··· 1 + use anyhow::{bail, Result}; 2 + use serde::Serialize; 3 + 4 + #[derive(Serialize, Clone, Debug, PartialEq)] 5 + #[serde(tag = "key", content = "value")] 6 + pub enum ParameterType { 7 + AnyType(String), 8 + Label(&'static str), 9 + 10 + Int(i32), 11 + Float(f32), 12 + Boolean(bool), 13 + String(String), 14 + Flow(bool), 15 + 16 + None, 17 + } 18 + 19 + impl ParameterType { 20 + pub fn as_bool(&self) -> Result<bool> { 21 + match self { 22 + ParameterType::Boolean(val) => Ok(val.clone()), 23 + ParameterType::Int(val) => { 24 + if *val == 0 { 25 + Ok(false) 26 + } else { 27 + Ok(true) 28 + } 29 + } 30 + _ => bail!("Cannot cast to bool."), 31 + } 32 + } 33 + 34 + pub fn as_int(&self) -> Result<i32> { 35 + match self { 36 + ParameterType::Boolean(val) => { 37 + if *val { 38 + Ok(1) 39 + } else { 40 + Ok(0) 41 + } 42 + } 43 + ParameterType::Int(val) => Ok(val.clone()), 44 + ParameterType::Float(val) => Ok(val.round().clone() as i32), 45 + ParameterType::String(val) => Ok(val.clone().parse()?), 46 + _ => bail!("Cannot cast to int."), 47 + } 48 + } 49 + 50 + pub fn as_float(&self) -> Result<f32> { 51 + match self { 52 + ParameterType::Int(val) => Ok(val.clone() as f32), 53 + ParameterType::Float(val) => Ok(val.clone()), 54 + ParameterType::String(val) => Ok(val.clone().parse()?), 55 + _ => bail!("Cannot cast to float."), 56 + } 57 + } 58 + 59 + pub fn as_string(&self) -> Result<String> { 60 + match self { 61 + ParameterType::Boolean(val) => Ok(val.clone().to_string()), 62 + ParameterType::Int(val) => Ok(val.clone().to_string()), 63 + ParameterType::Float(val) => Ok(val.clone().to_string()), 64 + ParameterType::String(val) => Ok(val.clone()), 65 + _ => bail!("Cannot cast to string."), 66 + } 67 + } 68 + }
+70 -54
src-tauri/src/utils/config.rs
··· 1 - use std::{ collections::HashMap, fs, path::PathBuf, sync::Mutex }; 2 - 3 - use serde::{ Deserialize, Serialize }; 4 - use serde_json::{json, Value}; 5 - 6 - #[derive(Clone, Deserialize, Serialize)] 7 - pub enum ConfigValue{ 8 - Bool(bool), 9 - String(String), 10 - Number(f64), 11 - Null 12 - } 13 - 14 - pub struct Config{ 15 - store: Mutex<HashMap<String, ConfigValue>>, 16 - } 17 - 18 - impl Config{ 19 - pub fn new( path: PathBuf ) -> Self{ 20 - let json_string = fs::read_to_string(path).unwrap(); 21 - let json: Value = serde_json::from_str(&json_string).unwrap(); 22 - 23 - let mut hashmap = HashMap::new(); 24 - 25 - let obj = json.as_object().unwrap(); 26 - for ( key, val ) in obj{ 27 - hashmap.insert(key.clone(), if val.is_boolean(){ ConfigValue::Bool(val.as_bool().unwrap()) } else if val.is_number(){ ConfigValue::Number(val.as_f64().unwrap()) } else if val.is_string(){ ConfigValue::String(val.as_str().unwrap().to_owned()) } else { ConfigValue::Null }); 28 - } 29 - 30 - Config { 31 - store: Mutex::new(hashmap) 32 - } 33 - } 34 - 35 - pub fn set( &self, key: &str, value: ConfigValue ){ 36 - self.store.lock().unwrap().insert(key.to_owned(), value); 37 - } 38 - 39 - pub fn get( &self, key: &str ) -> Option<ConfigValue>{ 40 - let store = self.store.lock().unwrap(); 41 - let val = store.get(&key.to_owned()); 42 - 43 - if val.is_none(){ 44 - None 45 - } else{ 46 - Some(val.unwrap().clone()) 47 - } 48 - } 49 - 50 - pub fn save( &self ){ 51 - let dat = serde_json::to_string(&self.store.lock().unwrap().clone()).unwrap(); 52 - fs::write(dirs::config_dir().unwrap().join("VRCMacros").join("VRCMacros.json"), dat).unwrap(); 53 - } 54 - } 1 + use std::{ 2 + collections::HashMap, 3 + fs::File, 4 + io::{Read, Write}, 5 + path::PathBuf, 6 + sync::{Mutex, MutexGuard}, 7 + }; 8 + 9 + use chrono::Utc; 10 + use flate2::{read::GzDecoder, write::GzEncoder, Compression}; 11 + use serde::{Deserialize, Serialize}; 12 + 13 + use crate::structs::nodes::Node; 14 + 15 + #[derive(Clone, Serialize, Deserialize, Debug)] 16 + pub struct ConfigValues { 17 + #[serde(default)] 18 + pub loaded_tabs: HashMap<String, (Vec<Node>, String, Option<String>, bool)>, 19 + 20 + #[serde(default)] 21 + pub hide_editor_on_start: bool, 22 + } 23 + 24 + pub struct Config { 25 + pub store: Mutex<ConfigValues>, 26 + path: PathBuf, 27 + } 28 + 29 + impl Config { 30 + pub fn new(path: PathBuf) -> Self { 31 + let json_string = if path.exists() { 32 + let mut decoder = GzDecoder::new(File::open(&path).unwrap()); 33 + let mut string = String::new(); 34 + 35 + decoder.read_to_string(&mut string).unwrap(); 36 + string 37 + } else { 38 + "{}".into() 39 + }; 40 + 41 + let json: ConfigValues = serde_json::from_str(&json_string).unwrap(); 42 + 43 + Config { 44 + store: Mutex::new(json), 45 + path: path, 46 + } 47 + } 48 + 49 + pub fn save(&self) { 50 + let mut dat = self.store.lock().unwrap(); 51 + 52 + let dat = serde_json::to_string(&*dat).unwrap(); 53 + 54 + let file = File::create(&self.path).unwrap(); 55 + let mut encoder = GzEncoder::new(file, Compression::default()); 56 + 57 + encoder.write_all(dat.as_bytes()).unwrap(); 58 + encoder.finish().unwrap(); 59 + } 60 + 61 + pub fn save_prelocked(&self, mut dat: MutexGuard<'_, ConfigValues>) { 62 + let dat = serde_json::to_string(&*dat).unwrap(); 63 + 64 + let file = File::create(&self.path).unwrap(); 65 + let mut encoder = GzEncoder::new(file, Compression::default()); 66 + 67 + encoder.write_all(dat.as_bytes()).unwrap(); 68 + encoder.finish().unwrap(); 69 + } 70 + }
+3 -1
src-tauri/src/utils/mod.rs
··· 1 - pub mod config; 1 + pub mod config; 2 + pub mod setup_traymenu; 3 + pub mod vrchat_builtin_parameters;
+45
src-tauri/src/utils/setup_traymenu.rs
··· 1 + use tauri::{ 2 + menu::{MenuBuilder, MenuItemBuilder}, 3 + tray::TrayIconBuilder, 4 + AppHandle, Emitter, Manager, 5 + }; 6 + 7 + pub fn setup_traymenu(handle: &AppHandle) { 8 + // Setup the tray icon and menu buttons 9 + let quit = MenuItemBuilder::new("Quit") 10 + .id("quit") 11 + .build(handle) 12 + .unwrap(); 13 + 14 + let show = MenuItemBuilder::new("Show Editor") 15 + .id("show") 16 + .build(handle) 17 + .unwrap(); 18 + 19 + let tray_menu = MenuBuilder::new(handle) 20 + .items(&[&quit, &show]) 21 + .build() 22 + .unwrap(); 23 + 24 + TrayIconBuilder::with_id("main") 25 + .icon(tauri::image::Image::from_bytes(include_bytes!("../../icons/32x32.png")).unwrap()) 26 + .menu(&tray_menu) 27 + .title("VRCMacros") 28 + .tooltip("VRCMacros") 29 + .on_menu_event(move |app: &AppHandle, event| match event.id().as_ref() { 30 + "quit" => { 31 + app.emit("prompt_to_close", ()).unwrap(); 32 + } 33 + "show" => { 34 + let window = app.get_webview_window("main").unwrap(); 35 + 36 + window.show().unwrap(); 37 + window.set_focus().unwrap(); 38 + 39 + window.emit("show-window", ()).unwrap(); 40 + } 41 + _ => {} 42 + }) 43 + .build(handle) 44 + .unwrap(); 45 + }
+315
src-tauri/src/utils/vrchat_builtin_parameters.rs
··· 1 + use crate::{osc::OSCMessage, structs::parameter_types::ParameterType}; 2 + 3 + pub fn get_read_addresses() -> Vec<OSCMessage>{ 4 + vec![ 5 + // Avatar Parameters 6 + OSCMessage { 7 + address: "/avatar/change".into(), 8 + values: vec![ ParameterType::String("".into()) ] 9 + }, 10 + 11 + OSCMessage { 12 + address: "/avatar/parameters/VRCEmote".into(), 13 + values: vec![ ParameterType::Int(0) ] 14 + }, 15 + OSCMessage { 16 + address: "/avatar/parameters/VRCFaceBlendV".into(), 17 + values: vec![ ParameterType::Float(0.0) ] 18 + }, 19 + OSCMessage { 20 + address: "/avatar/parameters/VRCFaceBlendH".into(), 21 + values: vec![ ParameterType::Float(0.0) ] 22 + }, 23 + OSCMessage { 24 + address: "/avatar/parameters/PreviewMode".into(), 25 + values: vec![ ParameterType::Int(0) ] 26 + }, 27 + OSCMessage { 28 + address: "/avatar/parameters/IsAnimatorEnabled".into(), 29 + values: vec![ ParameterType::Boolean(true) ] 30 + }, 31 + 32 + OSCMessage { 33 + address: "/avatar/parameters/GestureRightWeight".into(), 34 + values: vec![ ParameterType::Float(0.0) ] 35 + }, 36 + OSCMessage { 37 + address: "/avatar/parameters/GestureLeftWeight".into(), 38 + values: vec![ ParameterType::Float(0.0) ] 39 + }, 40 + OSCMessage { 41 + address: "/avatar/parameters/GestureRight".into(), 42 + values: vec![ ParameterType::Int(0) ] 43 + }, 44 + OSCMessage { 45 + address: "/avatar/parameters/GestureLeft".into(), 46 + values: vec![ ParameterType::Int(0) ] 47 + }, 48 + 49 + OSCMessage { 50 + address: "/avatar/parameters/ScaleModified".into(), 51 + values: vec![ ParameterType::Boolean(true) ] 52 + }, 53 + OSCMessage { 54 + address: "/avatar/parameters/ScaleFactor".into(), 55 + values: vec![ ParameterType::Float(1.0) ] 56 + }, 57 + OSCMessage { 58 + address: "/avatar/parameters/ScaleFactorInverse".into(), 59 + values: vec![ ParameterType::Float(1.0) ] 60 + }, 61 + OSCMessage { 62 + address: "/avatar/parameters/EyeHeightAsPercent".into(), 63 + values: vec![ ParameterType::Float(1.0) ] 64 + }, 65 + 66 + OSCMessage { 67 + address: "/avatar/parameters/Viseme".into(), 68 + values: vec![ ParameterType::Int(0) ] 69 + }, 70 + OSCMessage { 71 + address: "/avatar/parameters/Voice".into(), 72 + values: vec![ ParameterType::Float(0.0) ] 73 + }, 74 + OSCMessage { 75 + address: "/avatar/parameters/Earmuffs".into(), 76 + values: vec![ ParameterType::Boolean(true) ] 77 + }, 78 + OSCMessage { 79 + address: "/avatar/parameters/MuteSelf".into(), 80 + values: vec![ ParameterType::Boolean(true) ] 81 + }, 82 + 83 + OSCMessage { 84 + address: "/avatar/parameters/AFK".into(), 85 + values: vec![ ParameterType::Boolean(true) ] 86 + }, 87 + OSCMessage { 88 + address: "/avatar/parameters/InStation".into(), 89 + values: vec![ ParameterType::Boolean(true) ] 90 + }, 91 + OSCMessage { 92 + address: "/avatar/parameters/Seated".into(), 93 + values: vec![ ParameterType::Boolean(true) ] 94 + }, 95 + OSCMessage { 96 + address: "/avatar/parameters/VRMode".into(), 97 + values: vec![ ParameterType::Int(0) ] 98 + }, 99 + OSCMessage { 100 + address: "/avatar/parameters/TrackingType".into(), 101 + values: vec![ ParameterType::Int(0) ] 102 + }, 103 + 104 + OSCMessage { 105 + address: "/avatar/parameters/Grounded".into(), 106 + values: vec![ ParameterType::Boolean(true) ] 107 + }, 108 + OSCMessage { 109 + address: "/avatar/parameters/Upright".into(), 110 + values: vec![ ParameterType::Float(1.0) ] 111 + }, 112 + OSCMessage { 113 + address: "/avatar/parameters/AngularY".into(), 114 + values: vec![ ParameterType::Float(1.0) ] 115 + }, 116 + OSCMessage { 117 + address: "/avatar/parameters/VelocityX".into(), 118 + values: vec![ ParameterType::Float(1.0) ] 119 + }, 120 + OSCMessage { 121 + address: "/avatar/parameters/VelocityY".into(), 122 + values: vec![ ParameterType::Float(1.0) ] 123 + }, 124 + OSCMessage { 125 + address: "/avatar/parameters/VelocityZ".into(), 126 + values: vec![ ParameterType::Float(1.0) ] 127 + }, 128 + OSCMessage { 129 + address: "/avatar/parameters/VelocityMagnitude".into(), 130 + values: vec![ ParameterType::Float(1.0) ] 131 + }, 132 + 133 + // User Camera 134 + OSCMessage { 135 + address: "/usercamera/Mode".into(), 136 + values: vec![ ParameterType::Int(0) ] 137 + }, 138 + OSCMessage { 139 + address: "/usercamera/Pose".into(), 140 + values: vec![ 141 + ParameterType::Float(0.0), 142 + ParameterType::Float(0.0), 143 + ParameterType::Float(0.0), 144 + 145 + ParameterType::Float(0.0), 146 + ParameterType::Float(0.0), 147 + ParameterType::Float(0.0) 148 + ] 149 + }, 150 + 151 + OSCMessage { 152 + address: "/usercamera/ShowUIInCamera".into(), 153 + values: vec![ ParameterType::Boolean(true) ] 154 + }, 155 + OSCMessage { 156 + address: "/usercamera/LocalPlayer".into(), 157 + values: vec![ ParameterType::Boolean(true) ] 158 + }, 159 + OSCMessage { 160 + address: "/usercamera/RemotePlayer".into(), 161 + values: vec![ ParameterType::Boolean(true) ] 162 + }, 163 + OSCMessage { 164 + address: "/usercamera/Environment".into(), 165 + values: vec![ ParameterType::Boolean(true) ] 166 + }, 167 + OSCMessage { 168 + address: "/usercamera/GreenScreen".into(), 169 + values: vec![ ParameterType::Boolean(true) ] 170 + }, 171 + OSCMessage { 172 + address: "/usercamera/Lock".into(), 173 + values: vec![ ParameterType::Boolean(true) ] 174 + }, 175 + OSCMessage { 176 + address: "/usercamera/SmoothMovement".into(), 177 + values: vec![ ParameterType::Boolean(true) ] 178 + }, 179 + OSCMessage { 180 + address: "/usercamera/LookAtMe".into(), 181 + values: vec![ ParameterType::Boolean(true) ] 182 + }, 183 + OSCMessage { 184 + address: "/usercamera/AutoLevelRoll".into(), 185 + values: vec![ ParameterType::Boolean(true) ] 186 + }, 187 + OSCMessage { 188 + address: "/usercamera/AutoLevelPitch".into(), 189 + values: vec![ ParameterType::Boolean(true) ] 190 + }, 191 + OSCMessage { 192 + address: "/usercamera/Flying".into(), 193 + values: vec![ ParameterType::Boolean(true) ] 194 + }, 195 + OSCMessage { 196 + address: "/usercamera/TriggerTakesPhotos".into(), 197 + values: vec![ ParameterType::Boolean(true) ] 198 + }, 199 + OSCMessage { 200 + address: "/usercamera/DollyPathsStayVisible".into(), 201 + values: vec![ ParameterType::Boolean(true) ] 202 + }, 203 + OSCMessage { 204 + address: "/usercamera/AudioFromCamera".into(), 205 + values: vec![ ParameterType::Boolean(true) ] 206 + }, 207 + OSCMessage { 208 + address: "/usercamera/ShowFocus".into(), 209 + values: vec![ ParameterType::Boolean(true) ] 210 + }, 211 + OSCMessage { 212 + address: "/usercamera/Streaming".into(), 213 + values: vec![ ParameterType::Boolean(true) ] 214 + }, 215 + OSCMessage { 216 + address: "/usercamera/RollWhileFlying".into(), 217 + values: vec![ ParameterType::Boolean(true) ] 218 + }, 219 + OSCMessage { 220 + address: "/usercamera/OrientationIsLandscape".into(), 221 + values: vec![ ParameterType::Boolean(true) ] 222 + }, 223 + 224 + OSCMessage { 225 + address: "/usercamera/Zoom".into(), 226 + values: vec![ ParameterType::Float(0.0) ] 227 + }, 228 + OSCMessage { 229 + address: "/usercamera/Exposure".into(), 230 + values: vec![ ParameterType::Float(0.0) ] 231 + }, 232 + OSCMessage { 233 + address: "/usercamera/Aperture".into(), 234 + values: vec![ ParameterType::Float(0.0) ] 235 + }, 236 + OSCMessage { 237 + address: "/usercamera/Hue".into(), 238 + values: vec![ ParameterType::Float(0.0) ] 239 + }, 240 + OSCMessage { 241 + address: "/usercamera/Saturation".into(), 242 + values: vec![ ParameterType::Float(0.0) ] 243 + }, 244 + OSCMessage { 245 + address: "/usercamera/Lightness".into(), 246 + values: vec![ ParameterType::Float(0.0) ] 247 + }, 248 + OSCMessage { 249 + address: "/usercamera/LookAtMeXOffset".into(), 250 + values: vec![ ParameterType::Float(0.0) ] 251 + }, 252 + OSCMessage { 253 + address: "/usercamera/LookAtMeYOffset".into(), 254 + values: vec![ ParameterType::Float(0.0) ] 255 + }, 256 + OSCMessage { 257 + address: "/usercamera/FlySpeed".into(), 258 + values: vec![ ParameterType::Float(0.0) ] 259 + }, 260 + OSCMessage { 261 + address: "/usercamera/TurnSpeed".into(), 262 + values: vec![ ParameterType::Float(0.0) ] 263 + }, 264 + OSCMessage { 265 + address: "/usercamera/SmoothStrength".into(), 266 + values: vec![ ParameterType::Float(0.0) ] 267 + }, 268 + OSCMessage { 269 + address: "/usercamera/PhotoRate".into(), 270 + values: vec![ ParameterType::Float(0.0) ] 271 + }, 272 + OSCMessage { 273 + address: "/usercamera/Duration".into(), 274 + values: vec![ ParameterType::Float(0.0) ] 275 + }, 276 + 277 + // Trackers 278 + OSCMessage { 279 + address: "/tracking/vrsystem/head/pose".into(), 280 + values: vec![ 281 + ParameterType::Float(0.0), 282 + ParameterType::Float(0.0), 283 + ParameterType::Float(0.0), 284 + 285 + ParameterType::Float(0.0), 286 + ParameterType::Float(0.0), 287 + ParameterType::Float(0.0), 288 + ] 289 + }, 290 + OSCMessage { 291 + address: "/tracking/vrsystem/rightwrist/pose".into(), 292 + values: vec![ 293 + ParameterType::Float(0.0), 294 + ParameterType::Float(0.0), 295 + ParameterType::Float(0.0), 296 + 297 + ParameterType::Float(0.0), 298 + ParameterType::Float(0.0), 299 + ParameterType::Float(0.0), 300 + ] 301 + }, 302 + OSCMessage { 303 + address: "/tracking/vrsystem/leftwrist/pose".into(), 304 + values: vec![ 305 + ParameterType::Float(0.0), 306 + ParameterType::Float(0.0), 307 + ParameterType::Float(0.0), 308 + 309 + ParameterType::Float(0.0), 310 + ParameterType::Float(0.0), 311 + ParameterType::Float(0.0), 312 + ] 313 + }, 314 + ] 315 + }
+2 -2
src-tauri/tauri.conf.json
··· 13 13 "windows": [ 14 14 { 15 15 "title": "vrcmacros", 16 - "width": 1000, 17 - "height": 500 16 + "width": 1400, 17 + "height": 700 18 18 } 19 19 ], 20 20 "security": {
+1 -1
vite.config.ts
··· 6 6 7 7 // https://vitejs.dev/config/ 8 8 export default defineConfig(async () => ({ 9 - plugins: [solid()], 9 + plugins: [ solid() ], 10 10 11 11 // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` 12 12 //