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 node_modules 2 dist 3 - build
··· 1 node_modules 2 dist 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 }, 13 "license": "MIT", 14 "dependencies": { 15 - "@tauri-apps/api": "^2", 16 - "@tauri-apps/plugin-opener": "^2", 17 - "animejs": "^4.1.2", 18 - "solid-js": "^1.9.3" 19 }, 20 "devDependencies": { 21 - "@tauri-apps/cli": "^2", 22 "@types/animejs": "^3.1.13", 23 - "typescript": "~5.6.2", 24 - "vite": "^6.0.3", 25 - "vite-plugin-solid": "^2.11.0" 26 } 27 }
··· 12 }, 13 "license": "MIT", 14 "dependencies": { 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" 22 }, 23 "devDependencies": { 24 + "@tauri-apps/cli": "^2.9.3", 25 "@types/animejs": "^3.1.13", 26 + "typescript": "~5.6.3", 27 + "vite": "^6.4.1", 28 + "vite-plugin-solid": "^2.11.10" 29 } 30 }
+483 -428
pnpm-lock.yaml
··· 9 .: 10 dependencies: 11 '@tauri-apps/api': 12 - specifier: ^2 13 - version: 2.7.0 14 '@tauri-apps/plugin-opener': 15 - specifier: ^2 16 - version: 2.4.0 17 animejs: 18 - specifier: ^4.1.2 19 - version: 4.1.2 20 solid-js: 21 - specifier: ^1.9.3 22 - version: 1.9.7 23 devDependencies: 24 '@tauri-apps/cli': 25 - specifier: ^2 26 - version: 2.7.1 27 '@types/animejs': 28 specifier: ^3.1.13 29 version: 3.1.13 30 typescript: 31 - specifier: ~5.6.2 32 version: 5.6.3 33 vite: 34 - specifier: ^6.0.3 35 - version: 6.3.5 36 vite-plugin-solid: 37 - specifier: ^2.11.0 38 - version: 2.11.8(solid-js@1.9.7)(vite@6.3.5) 39 40 packages: 41 - 42 - '@ampproject/remapping@2.3.0': 43 - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 44 - engines: {node: '>=6.0.0'} 45 46 '@babel/code-frame@7.27.1': 47 resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 48 engines: {node: '>=6.9.0'} 49 50 - '@babel/compat-data@7.28.0': 51 - resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} 52 engines: {node: '>=6.9.0'} 53 54 - '@babel/core@7.28.0': 55 - resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} 56 engines: {node: '>=6.9.0'} 57 58 - '@babel/generator@7.28.0': 59 - resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} 60 engines: {node: '>=6.9.0'} 61 62 '@babel/helper-compilation-targets@7.27.2': ··· 75 resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} 76 engines: {node: '>=6.9.0'} 77 78 - '@babel/helper-module-transforms@7.27.3': 79 - resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} 80 engines: {node: '>=6.9.0'} 81 peerDependencies: 82 '@babel/core': ^7.0.0 ··· 89 resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 90 engines: {node: '>=6.9.0'} 91 92 - '@babel/helper-validator-identifier@7.27.1': 93 - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 94 engines: {node: '>=6.9.0'} 95 96 '@babel/helper-validator-option@7.27.1': 97 resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} 98 engines: {node: '>=6.9.0'} 99 100 - '@babel/helpers@7.28.2': 101 - resolution: {integrity: sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==} 102 engines: {node: '>=6.9.0'} 103 104 - '@babel/parser@7.28.0': 105 - resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} 106 engines: {node: '>=6.0.0'} 107 hasBin: true 108 ··· 116 resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} 117 engines: {node: '>=6.9.0'} 118 119 - '@babel/traverse@7.28.0': 120 - resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} 121 engines: {node: '>=6.9.0'} 122 123 - '@babel/types@7.28.2': 124 - resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} 125 engines: {node: '>=6.9.0'} 126 127 - '@esbuild/aix-ppc64@0.25.8': 128 - resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} 129 engines: {node: '>=18'} 130 cpu: [ppc64] 131 os: [aix] 132 133 - '@esbuild/android-arm64@0.25.8': 134 - resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} 135 engines: {node: '>=18'} 136 cpu: [arm64] 137 os: [android] 138 139 - '@esbuild/android-arm@0.25.8': 140 - resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} 141 engines: {node: '>=18'} 142 cpu: [arm] 143 os: [android] 144 145 - '@esbuild/android-x64@0.25.8': 146 - resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} 147 engines: {node: '>=18'} 148 cpu: [x64] 149 os: [android] 150 151 - '@esbuild/darwin-arm64@0.25.8': 152 - resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} 153 engines: {node: '>=18'} 154 cpu: [arm64] 155 os: [darwin] 156 157 - '@esbuild/darwin-x64@0.25.8': 158 - resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} 159 engines: {node: '>=18'} 160 cpu: [x64] 161 os: [darwin] 162 163 - '@esbuild/freebsd-arm64@0.25.8': 164 - resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} 165 engines: {node: '>=18'} 166 cpu: [arm64] 167 os: [freebsd] 168 169 - '@esbuild/freebsd-x64@0.25.8': 170 - resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} 171 engines: {node: '>=18'} 172 cpu: [x64] 173 os: [freebsd] 174 175 - '@esbuild/linux-arm64@0.25.8': 176 - resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} 177 engines: {node: '>=18'} 178 cpu: [arm64] 179 os: [linux] 180 181 - '@esbuild/linux-arm@0.25.8': 182 - resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} 183 engines: {node: '>=18'} 184 cpu: [arm] 185 os: [linux] 186 187 - '@esbuild/linux-ia32@0.25.8': 188 - resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} 189 engines: {node: '>=18'} 190 cpu: [ia32] 191 os: [linux] 192 193 - '@esbuild/linux-loong64@0.25.8': 194 - resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} 195 engines: {node: '>=18'} 196 cpu: [loong64] 197 os: [linux] 198 199 - '@esbuild/linux-mips64el@0.25.8': 200 - resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} 201 engines: {node: '>=18'} 202 cpu: [mips64el] 203 os: [linux] 204 205 - '@esbuild/linux-ppc64@0.25.8': 206 - resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} 207 engines: {node: '>=18'} 208 cpu: [ppc64] 209 os: [linux] 210 211 - '@esbuild/linux-riscv64@0.25.8': 212 - resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} 213 engines: {node: '>=18'} 214 cpu: [riscv64] 215 os: [linux] 216 217 - '@esbuild/linux-s390x@0.25.8': 218 - resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} 219 engines: {node: '>=18'} 220 cpu: [s390x] 221 os: [linux] 222 223 - '@esbuild/linux-x64@0.25.8': 224 - resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} 225 engines: {node: '>=18'} 226 cpu: [x64] 227 os: [linux] 228 229 - '@esbuild/netbsd-arm64@0.25.8': 230 - resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} 231 engines: {node: '>=18'} 232 cpu: [arm64] 233 os: [netbsd] 234 235 - '@esbuild/netbsd-x64@0.25.8': 236 - resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} 237 engines: {node: '>=18'} 238 cpu: [x64] 239 os: [netbsd] 240 241 - '@esbuild/openbsd-arm64@0.25.8': 242 - resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} 243 engines: {node: '>=18'} 244 cpu: [arm64] 245 os: [openbsd] 246 247 - '@esbuild/openbsd-x64@0.25.8': 248 - resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} 249 engines: {node: '>=18'} 250 cpu: [x64] 251 os: [openbsd] 252 253 - '@esbuild/openharmony-arm64@0.25.8': 254 - resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} 255 engines: {node: '>=18'} 256 cpu: [arm64] 257 os: [openharmony] 258 259 - '@esbuild/sunos-x64@0.25.8': 260 - resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} 261 engines: {node: '>=18'} 262 cpu: [x64] 263 os: [sunos] 264 265 - '@esbuild/win32-arm64@0.25.8': 266 - resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} 267 engines: {node: '>=18'} 268 cpu: [arm64] 269 os: [win32] 270 271 - '@esbuild/win32-ia32@0.25.8': 272 - resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} 273 engines: {node: '>=18'} 274 cpu: [ia32] 275 os: [win32] 276 277 - '@esbuild/win32-x64@0.25.8': 278 - resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} 279 engines: {node: '>=18'} 280 cpu: [x64] 281 os: [win32] 282 283 - '@jridgewell/gen-mapping@0.3.12': 284 - resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} 285 286 '@jridgewell/resolve-uri@3.1.2': 287 resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 288 engines: {node: '>=6.0.0'} 289 290 - '@jridgewell/sourcemap-codec@1.5.4': 291 - resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} 292 293 - '@jridgewell/trace-mapping@0.3.29': 294 - resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} 295 296 - '@rollup/rollup-android-arm-eabi@4.46.1': 297 - resolution: {integrity: sha512-oENme6QxtLCqjChRUUo3S6X8hjCXnWmJWnedD7VbGML5GUtaOtAyx+fEEXnBXVf0CBZApMQU0Idwi0FmyxzQhw==} 298 cpu: [arm] 299 os: [android] 300 301 - '@rollup/rollup-android-arm64@4.46.1': 302 - resolution: {integrity: sha512-OikvNT3qYTl9+4qQ9Bpn6+XHM+ogtFadRLuT2EXiFQMiNkXFLQfNVppi5o28wvYdHL2s3fM0D/MZJ8UkNFZWsw==} 303 cpu: [arm64] 304 os: [android] 305 306 - '@rollup/rollup-darwin-arm64@4.46.1': 307 - resolution: {integrity: sha512-EFYNNGij2WllnzljQDQnlFTXzSJw87cpAs4TVBAWLdkvic5Uh5tISrIL6NRcxoh/b2EFBG/TK8hgRrGx94zD4A==} 308 cpu: [arm64] 309 os: [darwin] 310 311 - '@rollup/rollup-darwin-x64@4.46.1': 312 - resolution: {integrity: sha512-ZaNH06O1KeTug9WI2+GRBE5Ujt9kZw4a1+OIwnBHal92I8PxSsl5KpsrPvthRynkhMck4XPdvY0z26Cym/b7oA==} 313 cpu: [x64] 314 os: [darwin] 315 316 - '@rollup/rollup-freebsd-arm64@4.46.1': 317 - resolution: {integrity: sha512-n4SLVebZP8uUlJ2r04+g2U/xFeiQlw09Me5UFqny8HGbARl503LNH5CqFTb5U5jNxTouhRjai6qPT0CR5c/Iig==} 318 cpu: [arm64] 319 os: [freebsd] 320 321 - '@rollup/rollup-freebsd-x64@4.46.1': 322 - resolution: {integrity: sha512-8vu9c02F16heTqpvo3yeiu7Vi1REDEC/yES/dIfq3tSXe6mLndiwvYr3AAvd1tMNUqE9yeGYa5w7PRbI5QUV+w==} 323 cpu: [x64] 324 os: [freebsd] 325 326 - '@rollup/rollup-linux-arm-gnueabihf@4.46.1': 327 - resolution: {integrity: sha512-K4ncpWl7sQuyp6rWiGUvb6Q18ba8mzM0rjWJ5JgYKlIXAau1db7hZnR0ldJvqKWWJDxqzSLwGUhA4jp+KqgDtQ==} 328 cpu: [arm] 329 os: [linux] 330 331 - '@rollup/rollup-linux-arm-musleabihf@4.46.1': 332 - resolution: {integrity: sha512-YykPnXsjUjmXE6j6k2QBBGAn1YsJUix7pYaPLK3RVE0bQL2jfdbfykPxfF8AgBlqtYbfEnYHmLXNa6QETjdOjQ==} 333 cpu: [arm] 334 os: [linux] 335 336 - '@rollup/rollup-linux-arm64-gnu@4.46.1': 337 - resolution: {integrity: sha512-kKvqBGbZ8i9pCGW3a1FH3HNIVg49dXXTsChGFsHGXQaVJPLA4f/O+XmTxfklhccxdF5FefUn2hvkoGJH0ScWOA==} 338 cpu: [arm64] 339 os: [linux] 340 341 - '@rollup/rollup-linux-arm64-musl@4.46.1': 342 - resolution: {integrity: sha512-zzX5nTw1N1plmqC9RGC9vZHFuiM7ZP7oSWQGqpbmfjK7p947D518cVK1/MQudsBdcD84t6k70WNczJOct6+hdg==} 343 cpu: [arm64] 344 os: [linux] 345 346 - '@rollup/rollup-linux-loongarch64-gnu@4.46.1': 347 - resolution: {integrity: sha512-O8CwgSBo6ewPpktFfSDgB6SJN9XDcPSvuwxfejiddbIC/hn9Tg6Ai0f0eYDf3XvB/+PIWzOQL+7+TZoB8p9Yuw==} 348 cpu: [loong64] 349 os: [linux] 350 351 - '@rollup/rollup-linux-ppc64-gnu@4.46.1': 352 - resolution: {integrity: sha512-JnCfFVEKeq6G3h3z8e60kAp8Rd7QVnWCtPm7cxx+5OtP80g/3nmPtfdCXbVl063e3KsRnGSKDHUQMydmzc/wBA==} 353 cpu: [ppc64] 354 os: [linux] 355 356 - '@rollup/rollup-linux-riscv64-gnu@4.46.1': 357 - resolution: {integrity: sha512-dVxuDqS237eQXkbYzQQfdf/njgeNw6LZuVyEdUaWwRpKHhsLI+y4H/NJV8xJGU19vnOJCVwaBFgr936FHOnJsQ==} 358 cpu: [riscv64] 359 os: [linux] 360 361 - '@rollup/rollup-linux-riscv64-musl@4.46.1': 362 - resolution: {integrity: sha512-CvvgNl2hrZrTR9jXK1ye0Go0HQRT6ohQdDfWR47/KFKiLd5oN5T14jRdUVGF4tnsN8y9oSfMOqH6RuHh+ck8+w==} 363 cpu: [riscv64] 364 os: [linux] 365 366 - '@rollup/rollup-linux-s390x-gnu@4.46.1': 367 - resolution: {integrity: sha512-x7ANt2VOg2565oGHJ6rIuuAon+A8sfe1IeUx25IKqi49OjSr/K3awoNqr9gCwGEJo9OuXlOn+H2p1VJKx1psxA==} 368 cpu: [s390x] 369 os: [linux] 370 371 - '@rollup/rollup-linux-x64-gnu@4.46.1': 372 - resolution: {integrity: sha512-9OADZYryz/7E8/qt0vnaHQgmia2Y0wrjSSn1V/uL+zw/i7NUhxbX4cHXdEQ7dnJgzYDS81d8+tf6nbIdRFZQoQ==} 373 cpu: [x64] 374 os: [linux] 375 376 - '@rollup/rollup-linux-x64-musl@4.46.1': 377 - resolution: {integrity: sha512-NuvSCbXEKY+NGWHyivzbjSVJi68Xfq1VnIvGmsuXs6TCtveeoDRKutI5vf2ntmNnVq64Q4zInet0UDQ+yMB6tA==} 378 cpu: [x64] 379 os: [linux] 380 381 - '@rollup/rollup-win32-arm64-msvc@4.46.1': 382 - resolution: {integrity: sha512-mWz+6FSRb82xuUMMV1X3NGiaPFqbLN9aIueHleTZCc46cJvwTlvIh7reQLk4p97dv0nddyewBhwzryBHH7wtPw==} 383 cpu: [arm64] 384 os: [win32] 385 386 - '@rollup/rollup-win32-ia32-msvc@4.46.1': 387 - resolution: {integrity: sha512-7Thzy9TMXDw9AU4f4vsLNBxh7/VOKuXi73VH3d/kHGr0tZ3x/ewgL9uC7ojUKmH1/zvmZe2tLapYcZllk3SO8Q==} 388 cpu: [ia32] 389 os: [win32] 390 391 - '@rollup/rollup-win32-x64-msvc@4.46.1': 392 - resolution: {integrity: sha512-7GVB4luhFmGUNXXJhH2jJwZCFB3pIOixv2E3s17GQHBFUOQaISlt7aGcQgqvCaDSxTZJUzlK/QJ1FN8S94MrzQ==} 393 cpu: [x64] 394 os: [win32] 395 396 - '@tauri-apps/api@2.7.0': 397 - resolution: {integrity: sha512-v7fVE8jqBl8xJFOcBafDzXFc8FnicoH3j8o8DNNs0tHuEBmXUDqrCOAzMRX0UkfpwqZLqvrvK0GNQ45DfnoVDg==} 398 399 - '@tauri-apps/cli-darwin-arm64@2.7.1': 400 - resolution: {integrity: sha512-j2NXQN6+08G03xYiyKDKqbCV2Txt+hUKg0a8hYr92AmoCU8fgCjHyva/p16lGFGUG3P2Yu0xiNe1hXL9ZuRMzA==} 401 engines: {node: '>= 10'} 402 cpu: [arm64] 403 os: [darwin] 404 405 - '@tauri-apps/cli-darwin-x64@2.7.1': 406 - resolution: {integrity: sha512-CdYAefeM35zKsc91qIyKzbaO7FhzTyWKsE8hj7tEJ1INYpoh1NeNNyL/NSEA3Nebi5ilugioJ5tRK8ZXG8y3gw==} 407 engines: {node: '>= 10'} 408 cpu: [x64] 409 os: [darwin] 410 411 - '@tauri-apps/cli-linux-arm-gnueabihf@2.7.1': 412 - resolution: {integrity: sha512-dnvyJrTA1UJxJjQ8q1N/gWomjP8Twij1BUQu2fdcT3OPpqlrbOk5R1yT0oD/721xoKNjroB5BXCsmmlykllxNg==} 413 engines: {node: '>= 10'} 414 cpu: [arm] 415 os: [linux] 416 417 - '@tauri-apps/cli-linux-arm64-gnu@2.7.1': 418 - resolution: {integrity: sha512-FtBW6LJPNRTws3qyUc294AqCWU91l/H0SsFKq6q4Q45MSS4x6wxLxou8zB53tLDGEPx3JSoPLcDaSfPlSbyujQ==} 419 engines: {node: '>= 10'} 420 cpu: [arm64] 421 os: [linux] 422 423 - '@tauri-apps/cli-linux-arm64-musl@2.7.1': 424 - resolution: {integrity: sha512-/HXY0t4FHkpFzjeYS5c16mlA6z0kzn5uKLWptTLTdFSnYpr8FCnOP4Sdkvm2TDQPF2ERxXtNCd+WR/jQugbGnA==} 425 engines: {node: '>= 10'} 426 cpu: [arm64] 427 os: [linux] 428 429 - '@tauri-apps/cli-linux-riscv64-gnu@2.7.1': 430 - resolution: {integrity: sha512-GeW5lVI2GhhnaYckiDzstG2j2Jwlud5d2XefRGwlOK+C/bVGLT1le8MNPYK8wgRlpeK8fG1WnJJYD6Ke7YQ8bg==} 431 engines: {node: '>= 10'} 432 cpu: [riscv64] 433 os: [linux] 434 435 - '@tauri-apps/cli-linux-x64-gnu@2.7.1': 436 - resolution: {integrity: sha512-DprxKQkPxIPYwUgg+cscpv2lcIUhn2nxEPlk0UeaiV9vATxCXyytxr1gLcj3xgjGyNPlM0MlJyYaPy1JmRg1cA==} 437 engines: {node: '>= 10'} 438 cpu: [x64] 439 os: [linux] 440 441 - '@tauri-apps/cli-linux-x64-musl@2.7.1': 442 - resolution: {integrity: sha512-KLlq3kOK7OUyDR757c0zQjPULpGZpLhNB0lZmZpHXvoOUcqZoCXJHh4dT/mryWZJp5ilrem5l8o9ngrDo0X1AA==} 443 engines: {node: '>= 10'} 444 cpu: [x64] 445 os: [linux] 446 447 - '@tauri-apps/cli-win32-arm64-msvc@2.7.1': 448 - resolution: {integrity: sha512-dH7KUjKkSypCeWPiainHyXoES3obS+JIZVoSwSZfKq2gWgs48FY3oT0hQNYrWveE+VR4VoR3b/F3CPGbgFvksA==} 449 engines: {node: '>= 10'} 450 cpu: [arm64] 451 os: [win32] 452 453 - '@tauri-apps/cli-win32-ia32-msvc@2.7.1': 454 - resolution: {integrity: sha512-1oeibfyWQPVcijOrTg709qhbXArjX3x1MPjrmA5anlygwrbByxLBcLXvotcOeULFcnH2FYUMMLLant8kgvwE5A==} 455 engines: {node: '>= 10'} 456 cpu: [ia32] 457 os: [win32] 458 459 - '@tauri-apps/cli-win32-x64-msvc@2.7.1': 460 - resolution: {integrity: sha512-D7Q9kDObutuirCNLxYQ7KAg2Xxg99AjcdYz/KuMw5HvyEPbkC9Q7JL0vOrQOrHEHxIQ2lYzFOZvKKoC2yyqXcg==} 461 engines: {node: '>= 10'} 462 cpu: [x64] 463 os: [win32] 464 465 - '@tauri-apps/cli@2.7.1': 466 - resolution: {integrity: sha512-RcGWR4jOUEl92w3uvI0h61Llkfj9lwGD1iwvDRD2isMrDhOzjeeeVn9aGzeW1jubQ/kAbMYfydcA4BA0Cy733Q==} 467 engines: {node: '>= 10'} 468 hasBin: true 469 470 - '@tauri-apps/plugin-opener@2.4.0': 471 - resolution: {integrity: sha512-43VyN8JJtvKWJY72WI/KNZszTpDpzHULFxQs0CJBIYUdCRowQ6Q1feWTDb979N7nldqSuDOaBupZ6wz2nvuWwQ==} 472 473 '@types/animejs@3.1.13': 474 resolution: {integrity: sha512-yWg9l1z7CAv/TKpty4/vupEh24jDGUZXv4r26StRkpUPQm04ztJaftgpto8vwdFs8SiTq6XfaPKCSI+wjzNMvQ==} ··· 482 '@types/babel__template@7.4.4': 483 resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 484 485 - '@types/babel__traverse@7.20.7': 486 - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} 487 488 '@types/estree@1.0.8': 489 resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 490 491 - animejs@4.1.2: 492 - resolution: {integrity: sha512-QojQzHzN4ZCOGk4Seir5CWPHGKFPpMAsen3KEj/BHsIKDceH0xKd3FBWflyKiNefKG2fn3+ofpY9jD/UXhpY6A==} 493 494 - babel-plugin-jsx-dom-expressions@0.39.8: 495 - resolution: {integrity: sha512-/MVOIIjonylDXnrWmG23ZX82m9mtKATsVHB7zYlPfDR9Vdd/NBE48if+wv27bSkBtyO7EPMUlcUc4J63QwuACQ==} 496 peerDependencies: 497 '@babel/core': ^7.20.12 498 499 - babel-preset-solid@1.9.6: 500 - resolution: {integrity: sha512-HXTK9f93QxoH8dYn1M2mJdOlWgMsR88Lg/ul6QCZGkNTktjTE5HAf93YxQumHoCudLEtZrU1cFCMFOVho6GqFg==} 501 peerDependencies: 502 '@babel/core': ^7.0.0 503 504 - browserslist@4.25.1: 505 - resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} 506 engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 507 hasBin: true 508 509 - caniuse-lite@1.0.30001731: 510 - resolution: {integrity: sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==} 511 512 convert-source-map@2.0.0: 513 resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} ··· 515 csstype@3.1.3: 516 resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 517 518 - debug@4.4.1: 519 - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 520 engines: {node: '>=6.0'} 521 peerDependencies: 522 supports-color: '*' ··· 524 supports-color: 525 optional: true 526 527 - electron-to-chromium@1.5.192: 528 - resolution: {integrity: sha512-rP8Ez0w7UNw/9j5eSXCe10o1g/8B1P5SM90PCCMVkIRQn2R0LEHWz4Eh9RnxkniuDe1W0cTSOB3MLlkTGDcuCg==} 529 530 entities@6.0.1: 531 resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} 532 engines: {node: '>=0.12'} 533 534 - esbuild@0.25.8: 535 - resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} 536 engines: {node: '>=18'} 537 hasBin: true 538 ··· 540 resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 541 engines: {node: '>=6'} 542 543 - fdir@6.4.6: 544 - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} 545 peerDependencies: 546 picomatch: ^3 || ^4 547 peerDependenciesMeta: ··· 592 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 593 hasBin: true 594 595 - node-releases@2.0.19: 596 - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 597 598 parse5@7.3.0: 599 resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} ··· 609 resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 610 engines: {node: ^10 || ^12 || >=14} 611 612 - rollup@4.46.1: 613 - resolution: {integrity: sha512-33xGNBsDJAkzt0PvninskHlWnTIPgDtTwhg0U38CUoNP/7H6wI2Cz6dUeoNPbjdTdsYTGuiFFASuUOWovH0SyQ==} 614 engines: {node: '>=18.0.0', npm: '>=8.0.0'} 615 hasBin: true 616 ··· 618 resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 619 hasBin: true 620 621 - seroval-plugins@1.3.2: 622 - resolution: {integrity: sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==} 623 engines: {node: '>=10'} 624 peerDependencies: 625 seroval: ^1.0 ··· 628 resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} 629 engines: {node: '>=10'} 630 631 - solid-js@1.9.7: 632 - resolution: {integrity: sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw==} 633 634 solid-refresh@0.6.3: 635 resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} ··· 640 resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 641 engines: {node: '>=0.10.0'} 642 643 - tinyglobby@0.2.14: 644 - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} 645 engines: {node: '>=12.0.0'} 646 647 typescript@5.6.3: ··· 649 engines: {node: '>=14.17'} 650 hasBin: true 651 652 - update-browserslist-db@1.1.3: 653 - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 654 hasBin: true 655 peerDependencies: 656 browserslist: '>= 4.21.0' 657 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==} 663 peerDependencies: 664 '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* 665 solid-js: ^1.7.2 ··· 668 '@testing-library/jest-dom': 669 optional: true 670 671 - vite@6.3.5: 672 - resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} 673 engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 674 hasBin: true 675 peerDependencies: ··· 721 722 snapshots: 723 724 - '@ampproject/remapping@2.3.0': 725 - dependencies: 726 - '@jridgewell/gen-mapping': 0.3.12 727 - '@jridgewell/trace-mapping': 0.3.29 728 - 729 '@babel/code-frame@7.27.1': 730 dependencies: 731 - '@babel/helper-validator-identifier': 7.27.1 732 js-tokens: 4.0.0 733 picocolors: 1.1.1 734 735 - '@babel/compat-data@7.28.0': {} 736 737 - '@babel/core@7.28.0': 738 dependencies: 739 - '@ampproject/remapping': 2.3.0 740 '@babel/code-frame': 7.27.1 741 - '@babel/generator': 7.28.0 742 '@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 746 '@babel/template': 7.27.2 747 - '@babel/traverse': 7.28.0 748 - '@babel/types': 7.28.2 749 convert-source-map: 2.0.0 750 - debug: 4.4.1 751 gensync: 1.0.0-beta.2 752 json5: 2.2.3 753 semver: 6.3.1 754 transitivePeerDependencies: 755 - supports-color 756 757 - '@babel/generator@7.28.0': 758 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 763 jsesc: 3.1.0 764 765 '@babel/helper-compilation-targets@7.27.2': 766 dependencies: 767 - '@babel/compat-data': 7.28.0 768 '@babel/helper-validator-option': 7.27.1 769 - browserslist: 4.25.1 770 lru-cache: 5.1.1 771 semver: 6.3.1 772 ··· 774 775 '@babel/helper-module-imports@7.18.6': 776 dependencies: 777 - '@babel/types': 7.28.2 778 779 '@babel/helper-module-imports@7.27.1': 780 dependencies: 781 - '@babel/traverse': 7.28.0 782 - '@babel/types': 7.28.2 783 transitivePeerDependencies: 784 - supports-color 785 786 - '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': 787 dependencies: 788 - '@babel/core': 7.28.0 789 '@babel/helper-module-imports': 7.27.1 790 - '@babel/helper-validator-identifier': 7.27.1 791 - '@babel/traverse': 7.28.0 792 transitivePeerDependencies: 793 - supports-color 794 ··· 796 797 '@babel/helper-string-parser@7.27.1': {} 798 799 - '@babel/helper-validator-identifier@7.27.1': {} 800 801 '@babel/helper-validator-option@7.27.1': {} 802 803 - '@babel/helpers@7.28.2': 804 dependencies: 805 '@babel/template': 7.27.2 806 - '@babel/types': 7.28.2 807 808 - '@babel/parser@7.28.0': 809 dependencies: 810 - '@babel/types': 7.28.2 811 812 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': 813 dependencies: 814 - '@babel/core': 7.28.0 815 '@babel/helper-plugin-utils': 7.27.1 816 817 '@babel/template@7.27.2': 818 dependencies: 819 '@babel/code-frame': 7.27.1 820 - '@babel/parser': 7.28.0 821 - '@babel/types': 7.28.2 822 823 - '@babel/traverse@7.28.0': 824 dependencies: 825 '@babel/code-frame': 7.27.1 826 - '@babel/generator': 7.28.0 827 '@babel/helper-globals': 7.28.0 828 - '@babel/parser': 7.28.0 829 '@babel/template': 7.27.2 830 - '@babel/types': 7.28.2 831 - debug: 4.4.1 832 transitivePeerDependencies: 833 - supports-color 834 835 - '@babel/types@7.28.2': 836 dependencies: 837 '@babel/helper-string-parser': 7.27.1 838 - '@babel/helper-validator-identifier': 7.27.1 839 840 - '@esbuild/aix-ppc64@0.25.8': 841 optional: true 842 843 - '@esbuild/android-arm64@0.25.8': 844 optional: true 845 846 - '@esbuild/android-arm@0.25.8': 847 optional: true 848 849 - '@esbuild/android-x64@0.25.8': 850 optional: true 851 852 - '@esbuild/darwin-arm64@0.25.8': 853 optional: true 854 855 - '@esbuild/darwin-x64@0.25.8': 856 optional: true 857 858 - '@esbuild/freebsd-arm64@0.25.8': 859 optional: true 860 861 - '@esbuild/freebsd-x64@0.25.8': 862 optional: true 863 864 - '@esbuild/linux-arm64@0.25.8': 865 optional: true 866 867 - '@esbuild/linux-arm@0.25.8': 868 optional: true 869 870 - '@esbuild/linux-ia32@0.25.8': 871 optional: true 872 873 - '@esbuild/linux-loong64@0.25.8': 874 optional: true 875 876 - '@esbuild/linux-mips64el@0.25.8': 877 optional: true 878 879 - '@esbuild/linux-ppc64@0.25.8': 880 optional: true 881 882 - '@esbuild/linux-riscv64@0.25.8': 883 optional: true 884 885 - '@esbuild/linux-s390x@0.25.8': 886 optional: true 887 888 - '@esbuild/linux-x64@0.25.8': 889 optional: true 890 891 - '@esbuild/netbsd-arm64@0.25.8': 892 optional: true 893 894 - '@esbuild/netbsd-x64@0.25.8': 895 optional: true 896 897 - '@esbuild/openbsd-arm64@0.25.8': 898 optional: true 899 900 - '@esbuild/openbsd-x64@0.25.8': 901 optional: true 902 903 - '@esbuild/openharmony-arm64@0.25.8': 904 optional: true 905 906 - '@esbuild/sunos-x64@0.25.8': 907 optional: true 908 909 - '@esbuild/win32-arm64@0.25.8': 910 optional: true 911 912 - '@esbuild/win32-ia32@0.25.8': 913 optional: true 914 915 - '@esbuild/win32-x64@0.25.8': 916 optional: true 917 918 - '@jridgewell/gen-mapping@0.3.12': 919 dependencies: 920 - '@jridgewell/sourcemap-codec': 1.5.4 921 - '@jridgewell/trace-mapping': 0.3.29 922 923 '@jridgewell/resolve-uri@3.1.2': {} 924 925 - '@jridgewell/sourcemap-codec@1.5.4': {} 926 927 - '@jridgewell/trace-mapping@0.3.29': 928 dependencies: 929 '@jridgewell/resolve-uri': 3.1.2 930 - '@jridgewell/sourcemap-codec': 1.5.4 931 932 - '@rollup/rollup-android-arm-eabi@4.46.1': 933 optional: true 934 935 - '@rollup/rollup-android-arm64@4.46.1': 936 optional: true 937 938 - '@rollup/rollup-darwin-arm64@4.46.1': 939 optional: true 940 941 - '@rollup/rollup-darwin-x64@4.46.1': 942 optional: true 943 944 - '@rollup/rollup-freebsd-arm64@4.46.1': 945 optional: true 946 947 - '@rollup/rollup-freebsd-x64@4.46.1': 948 optional: true 949 950 - '@rollup/rollup-linux-arm-gnueabihf@4.46.1': 951 optional: true 952 953 - '@rollup/rollup-linux-arm-musleabihf@4.46.1': 954 optional: true 955 956 - '@rollup/rollup-linux-arm64-gnu@4.46.1': 957 optional: true 958 959 - '@rollup/rollup-linux-arm64-musl@4.46.1': 960 optional: true 961 962 - '@rollup/rollup-linux-loongarch64-gnu@4.46.1': 963 optional: true 964 965 - '@rollup/rollup-linux-ppc64-gnu@4.46.1': 966 optional: true 967 968 - '@rollup/rollup-linux-riscv64-gnu@4.46.1': 969 optional: true 970 971 - '@rollup/rollup-linux-riscv64-musl@4.46.1': 972 optional: true 973 974 - '@rollup/rollup-linux-s390x-gnu@4.46.1': 975 optional: true 976 977 - '@rollup/rollup-linux-x64-gnu@4.46.1': 978 optional: true 979 980 - '@rollup/rollup-linux-x64-musl@4.46.1': 981 optional: true 982 983 - '@rollup/rollup-win32-arm64-msvc@4.46.1': 984 optional: true 985 986 - '@rollup/rollup-win32-ia32-msvc@4.46.1': 987 optional: true 988 989 - '@rollup/rollup-win32-x64-msvc@4.46.1': 990 optional: true 991 992 - '@tauri-apps/api@2.7.0': {} 993 994 - '@tauri-apps/cli-darwin-arm64@2.7.1': 995 optional: true 996 997 - '@tauri-apps/cli-darwin-x64@2.7.1': 998 optional: true 999 1000 - '@tauri-apps/cli-linux-arm-gnueabihf@2.7.1': 1001 optional: true 1002 1003 - '@tauri-apps/cli-linux-arm64-gnu@2.7.1': 1004 optional: true 1005 1006 - '@tauri-apps/cli-linux-arm64-musl@2.7.1': 1007 optional: true 1008 1009 - '@tauri-apps/cli-linux-riscv64-gnu@2.7.1': 1010 optional: true 1011 1012 - '@tauri-apps/cli-linux-x64-gnu@2.7.1': 1013 optional: true 1014 1015 - '@tauri-apps/cli-linux-x64-musl@2.7.1': 1016 optional: true 1017 1018 - '@tauri-apps/cli-win32-arm64-msvc@2.7.1': 1019 optional: true 1020 1021 - '@tauri-apps/cli-win32-ia32-msvc@2.7.1': 1022 optional: true 1023 1024 - '@tauri-apps/cli-win32-x64-msvc@2.7.1': 1025 optional: true 1026 1027 - '@tauri-apps/cli@2.7.1': 1028 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 1040 1041 - '@tauri-apps/plugin-opener@2.4.0': 1042 dependencies: 1043 - '@tauri-apps/api': 2.7.0 1044 1045 '@types/animejs@3.1.13': {} 1046 1047 '@types/babel__core@7.20.5': 1048 dependencies: 1049 - '@babel/parser': 7.28.0 1050 - '@babel/types': 7.28.2 1051 '@types/babel__generator': 7.27.0 1052 '@types/babel__template': 7.4.4 1053 - '@types/babel__traverse': 7.20.7 1054 1055 '@types/babel__generator@7.27.0': 1056 dependencies: 1057 - '@babel/types': 7.28.2 1058 1059 '@types/babel__template@7.4.4': 1060 dependencies: 1061 - '@babel/parser': 7.28.0 1062 - '@babel/types': 7.28.2 1063 1064 - '@types/babel__traverse@7.20.7': 1065 dependencies: 1066 - '@babel/types': 7.28.2 1067 1068 '@types/estree@1.0.8': {} 1069 1070 - animejs@4.1.2: {} 1071 1072 - babel-plugin-jsx-dom-expressions@0.39.8(@babel/core@7.28.0): 1073 dependencies: 1074 - '@babel/core': 7.28.0 1075 '@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 1078 html-entities: 2.3.3 1079 parse5: 7.3.0 1080 - validate-html-nesting: 1.2.3 1081 1082 - babel-preset-solid@1.9.6(@babel/core@7.28.0): 1083 dependencies: 1084 - '@babel/core': 7.28.0 1085 - babel-plugin-jsx-dom-expressions: 0.39.8(@babel/core@7.28.0) 1086 1087 - browserslist@4.25.1: 1088 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) 1093 1094 - caniuse-lite@1.0.30001731: {} 1095 1096 convert-source-map@2.0.0: {} 1097 1098 csstype@3.1.3: {} 1099 1100 - debug@4.4.1: 1101 dependencies: 1102 ms: 2.1.3 1103 1104 - electron-to-chromium@1.5.192: {} 1105 1106 entities@6.0.1: {} 1107 1108 - esbuild@0.25.8: 1109 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 1136 1137 escalade@3.2.0: {} 1138 1139 - fdir@6.4.6(picomatch@4.0.3): 1140 optionalDependencies: 1141 picomatch: 4.0.3 1142 ··· 1167 1168 nanoid@3.3.11: {} 1169 1170 - node-releases@2.0.19: {} 1171 1172 parse5@7.3.0: 1173 dependencies: ··· 1183 picocolors: 1.1.1 1184 source-map-js: 1.2.1 1185 1186 - rollup@4.46.1: 1187 dependencies: 1188 '@types/estree': 1.0.8 1189 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 1210 fsevents: 2.3.3 1211 1212 semver@6.3.1: {} 1213 1214 - seroval-plugins@1.3.2(seroval@1.3.2): 1215 dependencies: 1216 seroval: 1.3.2 1217 1218 seroval@1.3.2: {} 1219 1220 - solid-js@1.9.7: 1221 dependencies: 1222 csstype: 3.1.3 1223 seroval: 1.3.2 1224 - seroval-plugins: 1.3.2(seroval@1.3.2) 1225 1226 - solid-refresh@0.6.3(solid-js@1.9.7): 1227 dependencies: 1228 - '@babel/generator': 7.28.0 1229 '@babel/helper-module-imports': 7.27.1 1230 - '@babel/types': 7.28.2 1231 - solid-js: 1.9.7 1232 transitivePeerDependencies: 1233 - supports-color 1234 1235 source-map-js@1.2.1: {} 1236 1237 - tinyglobby@0.2.14: 1238 dependencies: 1239 - fdir: 6.4.6(picomatch@4.0.3) 1240 picomatch: 4.0.3 1241 1242 typescript@5.6.3: {} 1243 1244 - update-browserslist-db@1.1.3(browserslist@4.25.1): 1245 dependencies: 1246 - browserslist: 4.25.1 1247 escalade: 3.2.0 1248 picocolors: 1.1.1 1249 1250 - validate-html-nesting@1.2.3: {} 1251 - 1252 - vite-plugin-solid@2.11.8(solid-js@1.9.7)(vite@6.3.5): 1253 dependencies: 1254 - '@babel/core': 7.28.0 1255 '@types/babel__core': 7.20.5 1256 - babel-preset-solid: 1.9.6(@babel/core@7.28.0) 1257 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) 1262 transitivePeerDependencies: 1263 - supports-color 1264 1265 - vite@6.3.5: 1266 dependencies: 1267 - esbuild: 0.25.8 1268 - fdir: 6.4.6(picomatch@4.0.3) 1269 picomatch: 4.0.3 1270 postcss: 8.5.6 1271 - rollup: 4.46.1 1272 - tinyglobby: 0.2.14 1273 optionalDependencies: 1274 fsevents: 2.3.3 1275 1276 - vitefu@1.1.1(vite@6.3.5): 1277 optionalDependencies: 1278 - vite: 6.3.5 1279 1280 yallist@3.1.1: {}
··· 9 .: 10 dependencies: 11 '@tauri-apps/api': 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 20 '@tauri-apps/plugin-opener': 21 + specifier: ^2.5.2 22 + version: 2.5.2 23 + '@tauri-apps/plugin-os': 24 + specifier: ~2 25 + version: 2.3.2 26 animejs: 27 + specifier: ^4.2.2 28 + version: 4.2.2 29 solid-js: 30 + specifier: ^1.9.10 31 + version: 1.9.10 32 devDependencies: 33 '@tauri-apps/cli': 34 + specifier: ^2.9.3 35 + version: 2.9.3 36 '@types/animejs': 37 specifier: ^3.1.13 38 version: 3.1.13 39 typescript: 40 + specifier: ~5.6.3 41 version: 5.6.3 42 vite: 43 + specifier: ^6.4.1 44 + version: 6.4.1 45 vite-plugin-solid: 46 + specifier: ^2.11.10 47 + version: 2.11.10(solid-js@1.9.10)(vite@6.4.1) 48 49 packages: 50 51 '@babel/code-frame@7.27.1': 52 resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 53 engines: {node: '>=6.9.0'} 54 55 + '@babel/compat-data@7.28.5': 56 + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} 57 engines: {node: '>=6.9.0'} 58 59 + '@babel/core@7.28.5': 60 + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} 61 engines: {node: '>=6.9.0'} 62 63 + '@babel/generator@7.28.5': 64 + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} 65 engines: {node: '>=6.9.0'} 66 67 '@babel/helper-compilation-targets@7.27.2': ··· 80 resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} 81 engines: {node: '>=6.9.0'} 82 83 + '@babel/helper-module-transforms@7.28.3': 84 + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} 85 engines: {node: '>=6.9.0'} 86 peerDependencies: 87 '@babel/core': ^7.0.0 ··· 94 resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 95 engines: {node: '>=6.9.0'} 96 97 + '@babel/helper-validator-identifier@7.28.5': 98 + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} 99 engines: {node: '>=6.9.0'} 100 101 '@babel/helper-validator-option@7.27.1': 102 resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} 103 engines: {node: '>=6.9.0'} 104 105 + '@babel/helpers@7.28.4': 106 + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} 107 engines: {node: '>=6.9.0'} 108 109 + '@babel/parser@7.28.5': 110 + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} 111 engines: {node: '>=6.0.0'} 112 hasBin: true 113 ··· 121 resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} 122 engines: {node: '>=6.9.0'} 123 124 + '@babel/traverse@7.28.5': 125 + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} 126 engines: {node: '>=6.9.0'} 127 128 + '@babel/types@7.28.5': 129 + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} 130 engines: {node: '>=6.9.0'} 131 132 + '@esbuild/aix-ppc64@0.25.12': 133 + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} 134 engines: {node: '>=18'} 135 cpu: [ppc64] 136 os: [aix] 137 138 + '@esbuild/android-arm64@0.25.12': 139 + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} 140 engines: {node: '>=18'} 141 cpu: [arm64] 142 os: [android] 143 144 + '@esbuild/android-arm@0.25.12': 145 + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} 146 engines: {node: '>=18'} 147 cpu: [arm] 148 os: [android] 149 150 + '@esbuild/android-x64@0.25.12': 151 + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} 152 engines: {node: '>=18'} 153 cpu: [x64] 154 os: [android] 155 156 + '@esbuild/darwin-arm64@0.25.12': 157 + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} 158 engines: {node: '>=18'} 159 cpu: [arm64] 160 os: [darwin] 161 162 + '@esbuild/darwin-x64@0.25.12': 163 + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} 164 engines: {node: '>=18'} 165 cpu: [x64] 166 os: [darwin] 167 168 + '@esbuild/freebsd-arm64@0.25.12': 169 + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} 170 engines: {node: '>=18'} 171 cpu: [arm64] 172 os: [freebsd] 173 174 + '@esbuild/freebsd-x64@0.25.12': 175 + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} 176 engines: {node: '>=18'} 177 cpu: [x64] 178 os: [freebsd] 179 180 + '@esbuild/linux-arm64@0.25.12': 181 + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} 182 engines: {node: '>=18'} 183 cpu: [arm64] 184 os: [linux] 185 186 + '@esbuild/linux-arm@0.25.12': 187 + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} 188 engines: {node: '>=18'} 189 cpu: [arm] 190 os: [linux] 191 192 + '@esbuild/linux-ia32@0.25.12': 193 + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} 194 engines: {node: '>=18'} 195 cpu: [ia32] 196 os: [linux] 197 198 + '@esbuild/linux-loong64@0.25.12': 199 + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} 200 engines: {node: '>=18'} 201 cpu: [loong64] 202 os: [linux] 203 204 + '@esbuild/linux-mips64el@0.25.12': 205 + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} 206 engines: {node: '>=18'} 207 cpu: [mips64el] 208 os: [linux] 209 210 + '@esbuild/linux-ppc64@0.25.12': 211 + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} 212 engines: {node: '>=18'} 213 cpu: [ppc64] 214 os: [linux] 215 216 + '@esbuild/linux-riscv64@0.25.12': 217 + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} 218 engines: {node: '>=18'} 219 cpu: [riscv64] 220 os: [linux] 221 222 + '@esbuild/linux-s390x@0.25.12': 223 + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} 224 engines: {node: '>=18'} 225 cpu: [s390x] 226 os: [linux] 227 228 + '@esbuild/linux-x64@0.25.12': 229 + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} 230 engines: {node: '>=18'} 231 cpu: [x64] 232 os: [linux] 233 234 + '@esbuild/netbsd-arm64@0.25.12': 235 + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} 236 engines: {node: '>=18'} 237 cpu: [arm64] 238 os: [netbsd] 239 240 + '@esbuild/netbsd-x64@0.25.12': 241 + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} 242 engines: {node: '>=18'} 243 cpu: [x64] 244 os: [netbsd] 245 246 + '@esbuild/openbsd-arm64@0.25.12': 247 + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} 248 engines: {node: '>=18'} 249 cpu: [arm64] 250 os: [openbsd] 251 252 + '@esbuild/openbsd-x64@0.25.12': 253 + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} 254 engines: {node: '>=18'} 255 cpu: [x64] 256 os: [openbsd] 257 258 + '@esbuild/openharmony-arm64@0.25.12': 259 + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} 260 engines: {node: '>=18'} 261 cpu: [arm64] 262 os: [openharmony] 263 264 + '@esbuild/sunos-x64@0.25.12': 265 + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} 266 engines: {node: '>=18'} 267 cpu: [x64] 268 os: [sunos] 269 270 + '@esbuild/win32-arm64@0.25.12': 271 + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} 272 engines: {node: '>=18'} 273 cpu: [arm64] 274 os: [win32] 275 276 + '@esbuild/win32-ia32@0.25.12': 277 + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} 278 engines: {node: '>=18'} 279 cpu: [ia32] 280 os: [win32] 281 282 + '@esbuild/win32-x64@0.25.12': 283 + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} 284 engines: {node: '>=18'} 285 cpu: [x64] 286 os: [win32] 287 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==} 293 294 '@jridgewell/resolve-uri@3.1.2': 295 resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 296 engines: {node: '>=6.0.0'} 297 298 + '@jridgewell/sourcemap-codec@1.5.5': 299 + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 300 301 + '@jridgewell/trace-mapping@0.3.31': 302 + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} 303 304 + '@rollup/rollup-android-arm-eabi@4.53.0': 305 + resolution: {integrity: sha512-MX3DD/o2W36nlgQb8KA5QtUw/bK5aR9YDzNmX1PRHZAa6LF/MQCWMN477CgBMg8gH1vEiEZsjWRIZeL/7ttUVA==} 306 cpu: [arm] 307 os: [android] 308 309 + '@rollup/rollup-android-arm64@4.53.0': 310 + resolution: {integrity: sha512-U4/R8ZvikDYLkl+hyAGP23SRHp3LwYSRy9SvJqsnva7TYLhVMy39RTVCYn1DdRNxXl1CyCQgE/mXKm9jaQT4ig==} 311 cpu: [arm64] 312 os: [android] 313 314 + '@rollup/rollup-darwin-arm64@4.53.0': 315 + resolution: {integrity: sha512-nBG2BXRU3ifdK0HdqBKaT5VI6ScoIpABYZ+dWwQkIOYd8Suo4iykgPikjhsTd7NeHgJJ3OqlKYCcNkZtB1iLVQ==} 316 cpu: [arm64] 317 os: [darwin] 318 319 + '@rollup/rollup-darwin-x64@4.53.0': 320 + resolution: {integrity: sha512-QuZ5hYStB/vW7b8zQYtdIPpIfNNlUXtGk8zVTkoTMKzMhE2/6tVvcCWqdWqCVhx6eguJJjKjtZ9lAAG/D3yNeA==} 321 cpu: [x64] 322 os: [darwin] 323 324 + '@rollup/rollup-freebsd-arm64@4.53.0': 325 + resolution: {integrity: sha512-4yYPm1PJwK/HKI4FzElAPj2EAAFaaLUWzXV3S3edKy71JcEVzBCpgaXyEcDh3blBIjLml+aMkj6HEVGSuzpz+g==} 326 cpu: [arm64] 327 os: [freebsd] 328 329 + '@rollup/rollup-freebsd-x64@4.53.0': 330 + resolution: {integrity: sha512-1SvE5euwWV8JqFc4zEAqHbJbf2yJl00EoHVcnlFqLzjrIExYttLxfZeMDIXY6Yx+bskphrQakpChZKzE2JECEg==} 331 cpu: [x64] 332 os: [freebsd] 333 334 + '@rollup/rollup-linux-arm-gnueabihf@4.53.0': 335 + resolution: {integrity: sha512-9tS4QyfU5NF5CdUugEi7kWbcGD7pbu6Fm8SunuePH6beeQgtcRZ9K9KVwKHEgfBHeeyrr5OvfV1qWs7PMDOf5w==} 336 cpu: [arm] 337 os: [linux] 338 339 + '@rollup/rollup-linux-arm-musleabihf@4.53.0': 340 + resolution: {integrity: sha512-U+0ovxGU9bVJIHfW+oALpHd0ho1YDwhj0yHASDzIj+bOeo+VzEpNtHxcjhFab0YcHUorIMoqyxckC98+81oTJw==} 341 cpu: [arm] 342 os: [linux] 343 344 + '@rollup/rollup-linux-arm64-gnu@4.53.0': 345 + resolution: {integrity: sha512-Cp/TQ+wLjRTqTuiVwLz4XPZMo3ROl7EJYMF8HhMp8Uf+9kOOATB3/p4gGZPpuQ4BP7qEXG29ET24u9+F0ERYkQ==} 346 cpu: [arm64] 347 os: [linux] 348 349 + '@rollup/rollup-linux-arm64-musl@4.53.0': 350 + resolution: {integrity: sha512-SuGoAwhsSonrSTEZTiQOGC3+XZfq7rc/qAdAOBrYYIp8pu+Wh4EFFXl6+QYYNbNrHL3DnVoWACLwnfwlTa0neA==} 351 cpu: [arm64] 352 os: [linux] 353 354 + '@rollup/rollup-linux-loong64-gnu@4.53.0': 355 + resolution: {integrity: sha512-EOKej1x0WoePnJWfg7ZbnUqiuiQunshzsKZSIfTHFDiCY9pnsr3Weit1GjcpGnun7H5HuRREqkT2c9CcKxNwSg==} 356 cpu: [loong64] 357 os: [linux] 358 359 + '@rollup/rollup-linux-ppc64-gnu@4.53.0': 360 + resolution: {integrity: sha512-YAvv2aMFlfiawJ97lutomuehG2Yowd4YgsAqI85XNiMK9eBA1vEMZHt3BShg8cUvak71BM+VFRHddqc+OrRdVA==} 361 cpu: [ppc64] 362 os: [linux] 363 364 + '@rollup/rollup-linux-riscv64-gnu@4.53.0': 365 + resolution: {integrity: sha512-DxZe/sMVaqN+s5kVk3Iq619Rgyl1JCTob7xOLSNC84mbzg3NYTSheqqrtVllYjLYo4wm9YyqjVS57miuzNyXbQ==} 366 cpu: [riscv64] 367 os: [linux] 368 369 + '@rollup/rollup-linux-riscv64-musl@4.53.0': 370 + resolution: {integrity: sha512-N7+iZ0jEhwLY1FEsjbCR9lAxIZP0k+3Cghx9vSQWn+rcW8SgN8VcCmwJDoPDaGKTzWWB791U1s79BSLnEhUa0Q==} 371 cpu: [riscv64] 372 os: [linux] 373 374 + '@rollup/rollup-linux-s390x-gnu@4.53.0': 375 + resolution: {integrity: sha512-MA/NVneZyIskjvXdh2NR9YcPi7eHWBlQOWP2X8OymzyeUEB0JfUpmbKQZngHmOlyleV2IoR5nHIgMSRjLskOnA==} 376 cpu: [s390x] 377 os: [linux] 378 379 + '@rollup/rollup-linux-x64-gnu@4.53.0': 380 + resolution: {integrity: sha512-iYEYzYpfaSCkunVD0LOYrD9OMc357be7+rBuCxW1qvsjCGl+95iWnYAFfyEoxAm6koasNN3tFxFYze5MKl5S3A==} 381 cpu: [x64] 382 os: [linux] 383 384 + '@rollup/rollup-linux-x64-musl@4.53.0': 385 + resolution: {integrity: sha512-FoRekOqhRUKbJMsB5LvhQchDeFeNlS6UGUwi0p3860sxE4zE+lp07FnkuR+yQH0rSn6iLXsnr44jnorgl8mGlQ==} 386 cpu: [x64] 387 os: [linux] 388 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==} 396 cpu: [arm64] 397 os: [win32] 398 399 + '@rollup/rollup-win32-ia32-msvc@4.53.0': 400 + resolution: {integrity: sha512-93mJ8Hm9+vbhtu+A1VtmwptSqCYojtMQkBGDjLytCWC8muxmZLGo/MA/4CMAWf6+QpKlxTTMDAHdTC+kxn9ZcQ==} 401 cpu: [ia32] 402 os: [win32] 403 404 + '@rollup/rollup-win32-x64-gnu@4.53.0': 405 + resolution: {integrity: sha512-1OrYs0p/deXEFLUW1gvyjIabmsJKY3I/9fCUA1K6demaNc4iEhXDW6RnyPv/BWqb7NRmQ9+i+SKoi1HgJxWcwg==} 406 cpu: [x64] 407 os: [win32] 408 409 + '@rollup/rollup-win32-x64-msvc@4.53.0': 410 + resolution: {integrity: sha512-xtSei8paPcLy3GzeeOjoRrllJn6EN8PB+/bXnhZ4R0AaviJsRwtKxFZRVnfFXNZTTp0nLeDo+BcEuIfdZS14/A==} 411 + cpu: [x64] 412 + os: [win32] 413 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==} 419 engines: {node: '>= 10'} 420 cpu: [arm64] 421 os: [darwin] 422 423 + '@tauri-apps/cli-darwin-x64@2.9.3': 424 + resolution: {integrity: sha512-zDwu40rlshijt3TU6aRvzPUyVpapsx1sNfOlreDMTaMelQLHl6YoQzSRpLHYwrHrhimxyX2uDqnKIiuGel0Lhg==} 425 engines: {node: '>= 10'} 426 cpu: [x64] 427 os: [darwin] 428 429 + '@tauri-apps/cli-linux-arm-gnueabihf@2.9.3': 430 + resolution: {integrity: sha512-+Oc2OfcTRwYtW93VJqd/HOk77buORwC9IToj/qsEvM7bTMq6Kda4alpZprzwrCHYANSw+zD8PgjJdljTpe4p+g==} 431 engines: {node: '>= 10'} 432 cpu: [arm] 433 os: [linux] 434 435 + '@tauri-apps/cli-linux-arm64-gnu@2.9.3': 436 + resolution: {integrity: sha512-59GqU/J1n9wFyAtleoQOaU0oVIo+kwQynEw4meFDoKRXszKGor6lTsbsS3r0QKLSPbc0o/yYGJhqqCtkYjb/eg==} 437 engines: {node: '>= 10'} 438 cpu: [arm64] 439 os: [linux] 440 441 + '@tauri-apps/cli-linux-arm64-musl@2.9.3': 442 + resolution: {integrity: sha512-fzvG+jEn5/iYGNH6Z2IRMheYFC4pJdXa19BR9fFm6Bdn2cuajRLDKdUcEME/DCtwqclphXtFZTrT4oezY5vI/A==} 443 engines: {node: '>= 10'} 444 cpu: [arm64] 445 os: [linux] 446 447 + '@tauri-apps/cli-linux-riscv64-gnu@2.9.3': 448 + resolution: {integrity: sha512-qV8DZXI/fZwawk6T3Th1g6smiNC2KeQTk7XFgKvqZ6btC01z3UTsQmNGvI602zwm3Ld1TBZb4+rEWu2QmQimmw==} 449 engines: {node: '>= 10'} 450 cpu: [riscv64] 451 os: [linux] 452 453 + '@tauri-apps/cli-linux-x64-gnu@2.9.3': 454 + resolution: {integrity: sha512-tquyEONCNRfqEBWEe4eAHnxFN5yY5lFkCuD4w79XLIovUxVftQ684+xLp7zkhntkt4y20SMj2AgJa/+MOlx4Kg==} 455 engines: {node: '>= 10'} 456 cpu: [x64] 457 os: [linux] 458 459 + '@tauri-apps/cli-linux-x64-musl@2.9.3': 460 + resolution: {integrity: sha512-v2cBIB/6ji8DL+aiL5QUykU3ZO8OoJGyx50/qv2HQVzkf85KdaYSis3D/oVRemN/pcDz+vyCnnL3XnzFnDl4JQ==} 461 engines: {node: '>= 10'} 462 cpu: [x64] 463 os: [linux] 464 465 + '@tauri-apps/cli-win32-arm64-msvc@2.9.3': 466 + resolution: {integrity: sha512-ZGvBy7nvrHPbE0HeKp/ioaiw8bNgAHxWnb7JRZ4/G0A+oFj0SeSFxl9k5uU6FKnM7bHM23Gd1oeaDex9g5Fceg==} 467 engines: {node: '>= 10'} 468 cpu: [arm64] 469 os: [win32] 470 471 + '@tauri-apps/cli-win32-ia32-msvc@2.9.3': 472 + resolution: {integrity: sha512-UsgIwOnpCoY9NK9/65QiwgmWVIE80LE7SwRYVblGtmlY9RYfsYvpbItwsovA/AcHMTiO+OCvS/q9yLeqS3m6Sg==} 473 engines: {node: '>= 10'} 474 cpu: [ia32] 475 os: [win32] 476 477 + '@tauri-apps/cli-win32-x64-msvc@2.9.3': 478 + resolution: {integrity: sha512-fmw7NrrHE5m49idCvJAx9T9bsupjdJ0a3p3DPCNCZRGANU6R1tA1L+KTlVuUtdAldX2NqU/9UPo2SCslYKgJHQ==} 479 engines: {node: '>= 10'} 480 cpu: [x64] 481 os: [win32] 482 483 + '@tauri-apps/cli@2.9.3': 484 + resolution: {integrity: sha512-BQ7iLUXTQcyG1PpzLWeVSmBCedYDpnA/6Cm/kRFGtqjTf/eVUlyYO5S2ee07tLum3nWwDBWTGFZeruO8yEukfA==} 485 engines: {node: '>= 10'} 486 hasBin: true 487 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==} 499 500 '@types/animejs@3.1.13': 501 resolution: {integrity: sha512-yWg9l1z7CAv/TKpty4/vupEh24jDGUZXv4r26StRkpUPQm04ztJaftgpto8vwdFs8SiTq6XfaPKCSI+wjzNMvQ==} ··· 509 '@types/babel__template@7.4.4': 510 resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 511 512 + '@types/babel__traverse@7.28.0': 513 + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} 514 515 '@types/estree@1.0.8': 516 resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 517 518 + animejs@4.2.2: 519 + resolution: {integrity: sha512-Ys3RuvLdAeI14fsdKCQy7ytu4057QX6Bb7m4jwmfd6iKmUmLquTwk1ut0e4NtRQgCeq/s2Lv5+oMBjz6c7ZuIg==} 520 521 + babel-plugin-jsx-dom-expressions@0.40.3: 522 + resolution: {integrity: sha512-5HOwwt0BYiv/zxl7j8Pf2bGL6rDXfV6nUhLs8ygBX+EFJXzBPHM/euj9j/6deMZ6wa52Wb2PBaAV5U/jKwIY1w==} 523 peerDependencies: 524 '@babel/core': ^7.20.12 525 526 + babel-preset-solid@1.9.10: 527 + resolution: {integrity: sha512-HCelrgua/Y+kqO8RyL04JBWS/cVdrtUv/h45GntgQY+cJl4eBcKkCDV3TdMjtKx1nXwRaR9QXslM/Npm1dxdZQ==} 528 peerDependencies: 529 '@babel/core': ^7.0.0 530 + solid-js: ^1.9.10 531 + peerDependenciesMeta: 532 + solid-js: 533 + optional: true 534 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==} 541 engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 542 hasBin: true 543 544 + caniuse-lite@1.0.30001754: 545 + resolution: {integrity: sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==} 546 547 convert-source-map@2.0.0: 548 resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} ··· 550 csstype@3.1.3: 551 resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 552 553 + debug@4.4.3: 554 + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 555 engines: {node: '>=6.0'} 556 peerDependencies: 557 supports-color: '*' ··· 559 supports-color: 560 optional: true 561 562 + electron-to-chromium@1.5.248: 563 + resolution: {integrity: sha512-zsur2yunphlyAO4gIubdJEXCK6KOVvtpiuDfCIqbM9FjcnMYiyn0ICa3hWfPr0nc41zcLWobgy1iL7VvoOyA2Q==} 564 565 entities@6.0.1: 566 resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} 567 engines: {node: '>=0.12'} 568 569 + esbuild@0.25.12: 570 + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} 571 engines: {node: '>=18'} 572 hasBin: true 573 ··· 575 resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 576 engines: {node: '>=6'} 577 578 + fdir@6.5.0: 579 + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 580 + engines: {node: '>=12.0.0'} 581 peerDependencies: 582 picomatch: ^3 || ^4 583 peerDependenciesMeta: ··· 628 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 629 hasBin: true 630 631 + node-releases@2.0.27: 632 + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} 633 634 parse5@7.3.0: 635 resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} ··· 645 resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 646 engines: {node: ^10 || ^12 || >=14} 647 648 + rollup@4.53.0: 649 + resolution: {integrity: sha512-43Z5T+4YTdfYkkA6CStU2DUYh7Ha9dLtvK+K3n0yEE/QS+4i28vSxrQsM59KqpvmT4tbOwJsFnRGMj/tvmQwWw==} 650 engines: {node: '>=18.0.0', npm: '>=8.0.0'} 651 hasBin: true 652 ··· 654 resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 655 hasBin: true 656 657 + seroval-plugins@1.3.3: 658 + resolution: {integrity: sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==} 659 engines: {node: '>=10'} 660 peerDependencies: 661 seroval: ^1.0 ··· 664 resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} 665 engines: {node: '>=10'} 666 667 + solid-js@1.9.10: 668 + resolution: {integrity: sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew==} 669 670 solid-refresh@0.6.3: 671 resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} ··· 676 resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 677 engines: {node: '>=0.10.0'} 678 679 + tinyglobby@0.2.15: 680 + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 681 engines: {node: '>=12.0.0'} 682 683 typescript@5.6.3: ··· 685 engines: {node: '>=14.17'} 686 hasBin: true 687 688 + update-browserslist-db@1.1.4: 689 + resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} 690 hasBin: true 691 peerDependencies: 692 browserslist: '>= 4.21.0' 693 694 + vite-plugin-solid@2.11.10: 695 + resolution: {integrity: sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw==} 696 peerDependencies: 697 '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* 698 solid-js: ^1.7.2 ··· 701 '@testing-library/jest-dom': 702 optional: true 703 704 + vite@6.4.1: 705 + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} 706 engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 707 hasBin: true 708 peerDependencies: ··· 754 755 snapshots: 756 757 '@babel/code-frame@7.27.1': 758 dependencies: 759 + '@babel/helper-validator-identifier': 7.28.5 760 js-tokens: 4.0.0 761 picocolors: 1.1.1 762 763 + '@babel/compat-data@7.28.5': {} 764 765 + '@babel/core@7.28.5': 766 dependencies: 767 '@babel/code-frame': 7.27.1 768 + '@babel/generator': 7.28.5 769 '@babel/helper-compilation-targets': 7.27.2 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 773 '@babel/template': 7.27.2 774 + '@babel/traverse': 7.28.5 775 + '@babel/types': 7.28.5 776 + '@jridgewell/remapping': 2.3.5 777 convert-source-map: 2.0.0 778 + debug: 4.4.3 779 gensync: 1.0.0-beta.2 780 json5: 2.2.3 781 semver: 6.3.1 782 transitivePeerDependencies: 783 - supports-color 784 785 + '@babel/generator@7.28.5': 786 dependencies: 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 791 jsesc: 3.1.0 792 793 '@babel/helper-compilation-targets@7.27.2': 794 dependencies: 795 + '@babel/compat-data': 7.28.5 796 '@babel/helper-validator-option': 7.27.1 797 + browserslist: 4.27.0 798 lru-cache: 5.1.1 799 semver: 6.3.1 800 ··· 802 803 '@babel/helper-module-imports@7.18.6': 804 dependencies: 805 + '@babel/types': 7.28.5 806 807 '@babel/helper-module-imports@7.27.1': 808 dependencies: 809 + '@babel/traverse': 7.28.5 810 + '@babel/types': 7.28.5 811 transitivePeerDependencies: 812 - supports-color 813 814 + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': 815 dependencies: 816 + '@babel/core': 7.28.5 817 '@babel/helper-module-imports': 7.27.1 818 + '@babel/helper-validator-identifier': 7.28.5 819 + '@babel/traverse': 7.28.5 820 transitivePeerDependencies: 821 - supports-color 822 ··· 824 825 '@babel/helper-string-parser@7.27.1': {} 826 827 + '@babel/helper-validator-identifier@7.28.5': {} 828 829 '@babel/helper-validator-option@7.27.1': {} 830 831 + '@babel/helpers@7.28.4': 832 dependencies: 833 '@babel/template': 7.27.2 834 + '@babel/types': 7.28.5 835 836 + '@babel/parser@7.28.5': 837 dependencies: 838 + '@babel/types': 7.28.5 839 840 + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)': 841 dependencies: 842 + '@babel/core': 7.28.5 843 '@babel/helper-plugin-utils': 7.27.1 844 845 '@babel/template@7.27.2': 846 dependencies: 847 '@babel/code-frame': 7.27.1 848 + '@babel/parser': 7.28.5 849 + '@babel/types': 7.28.5 850 851 + '@babel/traverse@7.28.5': 852 dependencies: 853 '@babel/code-frame': 7.27.1 854 + '@babel/generator': 7.28.5 855 '@babel/helper-globals': 7.28.0 856 + '@babel/parser': 7.28.5 857 '@babel/template': 7.27.2 858 + '@babel/types': 7.28.5 859 + debug: 4.4.3 860 transitivePeerDependencies: 861 - supports-color 862 863 + '@babel/types@7.28.5': 864 dependencies: 865 '@babel/helper-string-parser': 7.27.1 866 + '@babel/helper-validator-identifier': 7.28.5 867 868 + '@esbuild/aix-ppc64@0.25.12': 869 optional: true 870 871 + '@esbuild/android-arm64@0.25.12': 872 optional: true 873 874 + '@esbuild/android-arm@0.25.12': 875 optional: true 876 877 + '@esbuild/android-x64@0.25.12': 878 optional: true 879 880 + '@esbuild/darwin-arm64@0.25.12': 881 optional: true 882 883 + '@esbuild/darwin-x64@0.25.12': 884 optional: true 885 886 + '@esbuild/freebsd-arm64@0.25.12': 887 optional: true 888 889 + '@esbuild/freebsd-x64@0.25.12': 890 optional: true 891 892 + '@esbuild/linux-arm64@0.25.12': 893 optional: true 894 895 + '@esbuild/linux-arm@0.25.12': 896 optional: true 897 898 + '@esbuild/linux-ia32@0.25.12': 899 optional: true 900 901 + '@esbuild/linux-loong64@0.25.12': 902 optional: true 903 904 + '@esbuild/linux-mips64el@0.25.12': 905 optional: true 906 907 + '@esbuild/linux-ppc64@0.25.12': 908 optional: true 909 910 + '@esbuild/linux-riscv64@0.25.12': 911 optional: true 912 913 + '@esbuild/linux-s390x@0.25.12': 914 optional: true 915 916 + '@esbuild/linux-x64@0.25.12': 917 optional: true 918 919 + '@esbuild/netbsd-arm64@0.25.12': 920 optional: true 921 922 + '@esbuild/netbsd-x64@0.25.12': 923 optional: true 924 925 + '@esbuild/openbsd-arm64@0.25.12': 926 optional: true 927 928 + '@esbuild/openbsd-x64@0.25.12': 929 optional: true 930 931 + '@esbuild/openharmony-arm64@0.25.12': 932 optional: true 933 934 + '@esbuild/sunos-x64@0.25.12': 935 optional: true 936 937 + '@esbuild/win32-arm64@0.25.12': 938 optional: true 939 940 + '@esbuild/win32-ia32@0.25.12': 941 optional: true 942 943 + '@esbuild/win32-x64@0.25.12': 944 optional: true 945 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': 952 dependencies: 953 + '@jridgewell/gen-mapping': 0.3.13 954 + '@jridgewell/trace-mapping': 0.3.31 955 956 '@jridgewell/resolve-uri@3.1.2': {} 957 958 + '@jridgewell/sourcemap-codec@1.5.5': {} 959 960 + '@jridgewell/trace-mapping@0.3.31': 961 dependencies: 962 '@jridgewell/resolve-uri': 3.1.2 963 + '@jridgewell/sourcemap-codec': 1.5.5 964 965 + '@rollup/rollup-android-arm-eabi@4.53.0': 966 optional: true 967 968 + '@rollup/rollup-android-arm64@4.53.0': 969 optional: true 970 971 + '@rollup/rollup-darwin-arm64@4.53.0': 972 optional: true 973 974 + '@rollup/rollup-darwin-x64@4.53.0': 975 optional: true 976 977 + '@rollup/rollup-freebsd-arm64@4.53.0': 978 optional: true 979 980 + '@rollup/rollup-freebsd-x64@4.53.0': 981 optional: true 982 983 + '@rollup/rollup-linux-arm-gnueabihf@4.53.0': 984 optional: true 985 986 + '@rollup/rollup-linux-arm-musleabihf@4.53.0': 987 optional: true 988 989 + '@rollup/rollup-linux-arm64-gnu@4.53.0': 990 optional: true 991 992 + '@rollup/rollup-linux-arm64-musl@4.53.0': 993 optional: true 994 995 + '@rollup/rollup-linux-loong64-gnu@4.53.0': 996 optional: true 997 998 + '@rollup/rollup-linux-ppc64-gnu@4.53.0': 999 optional: true 1000 1001 + '@rollup/rollup-linux-riscv64-gnu@4.53.0': 1002 optional: true 1003 1004 + '@rollup/rollup-linux-riscv64-musl@4.53.0': 1005 optional: true 1006 1007 + '@rollup/rollup-linux-s390x-gnu@4.53.0': 1008 optional: true 1009 1010 + '@rollup/rollup-linux-x64-gnu@4.53.0': 1011 optional: true 1012 1013 + '@rollup/rollup-linux-x64-musl@4.53.0': 1014 optional: true 1015 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': 1023 optional: true 1024 1025 + '@rollup/rollup-win32-x64-gnu@4.53.0': 1026 optional: true 1027 1028 + '@rollup/rollup-win32-x64-msvc@4.53.0': 1029 optional: true 1030 1031 + '@tauri-apps/api@2.9.0': {} 1032 1033 + '@tauri-apps/cli-darwin-arm64@2.9.3': 1034 optional: true 1035 1036 + '@tauri-apps/cli-darwin-x64@2.9.3': 1037 optional: true 1038 1039 + '@tauri-apps/cli-linux-arm-gnueabihf@2.9.3': 1040 optional: true 1041 1042 + '@tauri-apps/cli-linux-arm64-gnu@2.9.3': 1043 optional: true 1044 1045 + '@tauri-apps/cli-linux-arm64-musl@2.9.3': 1046 optional: true 1047 1048 + '@tauri-apps/cli-linux-riscv64-gnu@2.9.3': 1049 optional: true 1050 1051 + '@tauri-apps/cli-linux-x64-gnu@2.9.3': 1052 optional: true 1053 1054 + '@tauri-apps/cli-linux-x64-musl@2.9.3': 1055 optional: true 1056 1057 + '@tauri-apps/cli-win32-arm64-msvc@2.9.3': 1058 optional: true 1059 1060 + '@tauri-apps/cli-win32-ia32-msvc@2.9.3': 1061 optional: true 1062 1063 + '@tauri-apps/cli-win32-x64-msvc@2.9.3': 1064 optional: true 1065 1066 + '@tauri-apps/cli@2.9.3': 1067 optionalDependencies: 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 1091 1092 + '@tauri-apps/plugin-os@2.3.2': 1093 dependencies: 1094 + '@tauri-apps/api': 2.9.0 1095 1096 '@types/animejs@3.1.13': {} 1097 1098 '@types/babel__core@7.20.5': 1099 dependencies: 1100 + '@babel/parser': 7.28.5 1101 + '@babel/types': 7.28.5 1102 '@types/babel__generator': 7.27.0 1103 '@types/babel__template': 7.4.4 1104 + '@types/babel__traverse': 7.28.0 1105 1106 '@types/babel__generator@7.27.0': 1107 dependencies: 1108 + '@babel/types': 7.28.5 1109 1110 '@types/babel__template@7.4.4': 1111 dependencies: 1112 + '@babel/parser': 7.28.5 1113 + '@babel/types': 7.28.5 1114 1115 + '@types/babel__traverse@7.28.0': 1116 dependencies: 1117 + '@babel/types': 7.28.5 1118 1119 '@types/estree@1.0.8': {} 1120 1121 + animejs@4.2.2: {} 1122 1123 + babel-plugin-jsx-dom-expressions@0.40.3(@babel/core@7.28.5): 1124 dependencies: 1125 + '@babel/core': 7.28.5 1126 '@babel/helper-module-imports': 7.18.6 1127 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) 1128 + '@babel/types': 7.28.5 1129 html-entities: 2.3.3 1130 parse5: 7.3.0 1131 1132 + babel-preset-solid@1.9.10(@babel/core@7.28.5)(solid-js@1.9.10): 1133 dependencies: 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 1138 1139 + baseline-browser-mapping@2.8.25: {} 1140 + 1141 + browserslist@4.27.0: 1142 dependencies: 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) 1148 1149 + caniuse-lite@1.0.30001754: {} 1150 1151 convert-source-map@2.0.0: {} 1152 1153 csstype@3.1.3: {} 1154 1155 + debug@4.4.3: 1156 dependencies: 1157 ms: 2.1.3 1158 1159 + electron-to-chromium@1.5.248: {} 1160 1161 entities@6.0.1: {} 1162 1163 + esbuild@0.25.12: 1164 optionalDependencies: 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 1191 1192 escalade@3.2.0: {} 1193 1194 + fdir@6.5.0(picomatch@4.0.3): 1195 optionalDependencies: 1196 picomatch: 4.0.3 1197 ··· 1222 1223 nanoid@3.3.11: {} 1224 1225 + node-releases@2.0.27: {} 1226 1227 parse5@7.3.0: 1228 dependencies: ··· 1238 picocolors: 1.1.1 1239 source-map-js: 1.2.1 1240 1241 + rollup@4.53.0: 1242 dependencies: 1243 '@types/estree': 1.0.8 1244 optionalDependencies: 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 1267 fsevents: 2.3.3 1268 1269 semver@6.3.1: {} 1270 1271 + seroval-plugins@1.3.3(seroval@1.3.2): 1272 dependencies: 1273 seroval: 1.3.2 1274 1275 seroval@1.3.2: {} 1276 1277 + solid-js@1.9.10: 1278 dependencies: 1279 csstype: 3.1.3 1280 seroval: 1.3.2 1281 + seroval-plugins: 1.3.3(seroval@1.3.2) 1282 1283 + solid-refresh@0.6.3(solid-js@1.9.10): 1284 dependencies: 1285 + '@babel/generator': 7.28.5 1286 '@babel/helper-module-imports': 7.27.1 1287 + '@babel/types': 7.28.5 1288 + solid-js: 1.9.10 1289 transitivePeerDependencies: 1290 - supports-color 1291 1292 source-map-js@1.2.1: {} 1293 1294 + tinyglobby@0.2.15: 1295 dependencies: 1296 + fdir: 6.5.0(picomatch@4.0.3) 1297 picomatch: 4.0.3 1298 1299 typescript@5.6.3: {} 1300 1301 + update-browserslist-db@1.1.4(browserslist@4.27.0): 1302 dependencies: 1303 + browserslist: 4.27.0 1304 escalade: 3.2.0 1305 picocolors: 1.1.1 1306 1307 + vite-plugin-solid@2.11.10(solid-js@1.9.10)(vite@6.4.1): 1308 dependencies: 1309 + '@babel/core': 7.28.5 1310 '@types/babel__core': 7.20.5 1311 + babel-preset-solid: 1.9.10(@babel/core@7.28.5)(solid-js@1.9.10) 1312 merge-anything: 5.1.7 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) 1317 transitivePeerDependencies: 1318 - supports-color 1319 1320 + vite@6.4.1: 1321 dependencies: 1322 + esbuild: 0.25.12 1323 + fdir: 6.5.0(picomatch@4.0.3) 1324 picomatch: 4.0.3 1325 postcss: 8.5.6 1326 + rollup: 4.53.0 1327 + tinyglobby: 0.2.15 1328 optionalDependencies: 1329 fsevents: 2.3.3 1330 1331 + vitefu@1.1.1(vite@6.4.1): 1332 optionalDependencies: 1333 + vite: 6.4.1 1334 1335 yallist@3.1.1: {}
+1
pnpm-workspace.yaml
··· 1 onlyBuiltDependencies: 2 - esbuild
··· 1 onlyBuiltDependencies: 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 { 2 font-family: Rubik; 3 - src: url('/assets/fonts/Rubik-VariableFont_wght.ttf'); 4 - } 5 - 6 - * { 7 - box-sizing: border-box; 8 } 9 10 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 - ); 17 background-attachment: fixed; 18 color: #fff; 19 font-family: Rubik, 'Courier New'; 20 margin: 0; 21 } 22 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; 62 } 63 64 - div[app-button-minimal]:hover{ 65 - background: #525252; 66 } 67 68 - div[app-col]{ 69 - display: flex; 70 - justify-content: center; 71 - align-items: center; 72 }
··· 1 + @font-face{ 2 font-family: Rubik; 3 + src: url("/assets/fonts/Rubik-VariableFont_wght.ttf"); 4 } 5 6 body{ 7 + background: #1f2129; 8 background-attachment: fixed; 9 color: #fff; 10 font-family: Rubik, 'Courier New'; 11 margin: 0; 12 } 13 14 + * { 15 + box-sizing: border-box; 16 } 17 18 + p, h1, h2, h3, h4, h5, h6{ 19 + margin: 0; 20 } 21 22 + canvas{ 23 + position: fixed; 24 + top: 0; 25 + left: 0; 26 }
+460 -3
src/App.tsx
··· 1 - import { onMount } from "solid-js"; 2 import "./App.css"; 3 4 let App = () => { 5 - onMount(() => { 6 7 }); 8 9 return ( 10 <> 11 - 12 </> 13 ); 14 }
··· 1 + import { createEffect, createSignal, onCleanup, onMount } from "solid-js"; 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 19 20 let App = () => { 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); 421 422 + unlisten_0(); 423 + unlisten_1(); 424 + }); 425 }); 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 + 463 return ( 464 <> 465 + <ConfirmationPopup /> 466 + <TabMenu /> 467 + <ControlBar node={selectedNodes} lockMovement={( lock ) => lockMovement = lock} /> 468 + <canvas ref={canvas}/> 469 </> 470 ); 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 import { render } from "solid-js/web"; 3 import App from "./App"; 4 5 - render(() => <App />, document.getElementById("root") as HTMLElement);
··· 2 import { render } from "solid-js/web"; 3 import App from "./App"; 4 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 name = "VRCMacros" 7 version = "0.1.0" 8 dependencies = [ 9 "dirs", 10 "serde", 11 "serde_json", 12 - "sqlx", 13 "tauri", 14 "tauri-build", 15 "tauri-plugin-opener", 16 "tokio", 17 ] 18 19 [[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 name = "adler2" 30 version = "2.0.1" 31 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 33 34 [[package]] 35 name = "aho-corasick" 36 - version = "1.1.3" 37 source = "registry+https://github.com/rust-lang/crates.io-index" 38 - checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 39 dependencies = [ 40 "memchr", 41 ] ··· 56 ] 57 58 [[package]] 59 - name = "allocator-api2" 60 - version = "0.2.21" 61 source = "registry+https://github.com/rust-lang/crates.io-index" 62 - checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 63 64 [[package]] 65 - name = "android-tzdata" 66 - version = "0.1.1" 67 source = "registry+https://github.com/rust-lang/crates.io-index" 68 - checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 69 70 [[package]] 71 - name = "android_system_properties" 72 - version = "0.1.5" 73 source = "registry+https://github.com/rust-lang/crates.io-index" 74 - checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 75 dependencies = [ 76 - "libc", 77 ] 78 79 [[package]] 80 - name = "anyhow" 81 - version = "1.0.98" 82 source = "registry+https://github.com/rust-lang/crates.io-index" 83 - checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" 84 85 [[package]] 86 name = "async-broadcast" ··· 108 109 [[package]] 110 name = "async-executor" 111 - version = "1.13.2" 112 source = "registry+https://github.com/rust-lang/crates.io-index" 113 - checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" 114 dependencies = [ 115 "async-task", 116 "concurrent-queue", ··· 122 123 [[package]] 124 name = "async-io" 125 - version = "2.5.0" 126 source = "registry+https://github.com/rust-lang/crates.io-index" 127 - checksum = "19634d6336019ef220f09fd31168ce5c184b295cbf80345437cc36094ef223ca" 128 dependencies = [ 129 - "async-lock", 130 "cfg-if", 131 "concurrent-queue", 132 "futures-io", 133 "futures-lite", 134 "parking", 135 "polling", 136 - "rustix", 137 "slab", 138 - "windows-sys 0.60.2", 139 ] 140 141 [[package]] 142 name = "async-lock" 143 - version = "3.4.0" 144 source = "registry+https://github.com/rust-lang/crates.io-index" 145 - checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" 146 dependencies = [ 147 "event-listener", 148 "event-listener-strategy", ··· 151 152 [[package]] 153 name = "async-process" 154 - version = "2.4.0" 155 source = "registry+https://github.com/rust-lang/crates.io-index" 156 - checksum = "65daa13722ad51e6ab1a1b9c01299142bc75135b337923cfa10e79bbbd669f00" 157 dependencies = [ 158 "async-channel", 159 "async-io", ··· 164 "cfg-if", 165 "event-listener", 166 "futures-lite", 167 - "rustix", 168 ] 169 170 [[package]] ··· 175 dependencies = [ 176 "proc-macro2", 177 "quote", 178 - "syn 2.0.104", 179 ] 180 181 [[package]] 182 name = "async-signal" 183 - version = "0.2.12" 184 source = "registry+https://github.com/rust-lang/crates.io-index" 185 - checksum = "f567af260ef69e1d52c2b560ce0ea230763e6fbb9214a85d768760a920e3e3c1" 186 dependencies = [ 187 "async-io", 188 "async-lock", ··· 190 "cfg-if", 191 "futures-core", 192 "futures-io", 193 - "rustix", 194 "signal-hook-registry", 195 "slab", 196 - "windows-sys 0.60.2", 197 ] 198 199 [[package]] ··· 204 205 [[package]] 206 name = "async-trait" 207 - version = "0.1.88" 208 source = "registry+https://github.com/rust-lang/crates.io-index" 209 - checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" 210 dependencies = [ 211 "proc-macro2", 212 "quote", 213 - "syn 2.0.104", 214 ] 215 216 [[package]] ··· 237 ] 238 239 [[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 name = "atomic-waker" 250 version = "1.1.2" 251 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 258 checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 259 260 [[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 name = "base64" 277 version = "0.21.7" 278 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 285 checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 286 287 [[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 name = "bitflags" 295 version = "1.3.2" 296 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 298 299 [[package]] 300 name = "bitflags" 301 - version = "2.9.1" 302 source = "registry+https://github.com/rust-lang/crates.io-index" 303 - checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" 304 dependencies = [ 305 - "serde", 306 ] 307 308 [[package]] ··· 325 326 [[package]] 327 name = "block2" 328 - version = "0.6.1" 329 source = "registry+https://github.com/rust-lang/crates.io-index" 330 - checksum = "340d2f0bdb2a43c1d3cd40513185b2bd7def0aa1052f956455114bc98f82dcf2" 331 dependencies = [ 332 - "objc2 0.6.1", 333 ] 334 335 [[package]] ··· 347 348 [[package]] 349 name = "brotli" 350 - version = "8.0.1" 351 source = "registry+https://github.com/rust-lang/crates.io-index" 352 - checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" 353 dependencies = [ 354 "alloc-no-stdlib", 355 "alloc-stdlib", ··· 374 375 [[package]] 376 name = "bytemuck" 377 - version = "1.23.1" 378 source = "registry+https://github.com/rust-lang/crates.io-index" 379 - checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" 380 381 [[package]] 382 name = "byteorder" ··· 385 checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 386 387 [[package]] 388 name = "bytes" 389 version = "1.10.1" 390 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 399 source = "registry+https://github.com/rust-lang/crates.io-index" 400 checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" 401 dependencies = [ 402 - "bitflags 2.9.1", 403 "cairo-sys-rs", 404 "glib", 405 "libc", ··· 420 421 [[package]] 422 name = "camino" 423 - version = "1.1.10" 424 source = "registry+https://github.com/rust-lang/crates.io-index" 425 - checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" 426 dependencies = [ 427 - "serde", 428 ] 429 430 [[package]] ··· 447 "semver", 448 "serde", 449 "serde_json", 450 - "thiserror 2.0.12", 451 ] 452 453 [[package]] ··· 457 checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" 458 dependencies = [ 459 "serde", 460 - "toml 0.9.3", 461 ] 462 463 [[package]] 464 name = "cc" 465 - version = "1.2.30" 466 source = "registry+https://github.com/rust-lang/crates.io-index" 467 - checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" 468 dependencies = [ 469 "shlex", 470 ] 471 ··· 498 499 [[package]] 500 name = "cfg-if" 501 - version = "1.0.1" 502 source = "registry+https://github.com/rust-lang/crates.io-index" 503 - checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" 504 505 [[package]] 506 name = "cfg_aliases" ··· 510 511 [[package]] 512 name = "chrono" 513 - version = "0.4.41" 514 source = "registry+https://github.com/rust-lang/crates.io-index" 515 - checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" 516 dependencies = [ 517 - "android-tzdata", 518 "iana-time-zone", 519 "num-traits", 520 "serde", 521 - "windows-link", 522 ] 523 524 [[package]] ··· 539 dependencies = [ 540 "crossbeam-utils", 541 ] 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 549 [[package]] 550 name = "convert_case" ··· 584 source = "registry+https://github.com/rust-lang/crates.io-index" 585 checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" 586 dependencies = [ 587 - "bitflags 2.9.1", 588 "core-foundation", 589 "core-graphics-types", 590 "foreign-types", ··· 597 source = "registry+https://github.com/rust-lang/crates.io-index" 598 checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" 599 dependencies = [ 600 - "bitflags 2.9.1", 601 "core-foundation", 602 "libc", 603 ] ··· 612 ] 613 614 [[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 name = "crc32fast" 631 version = "1.5.0" 632 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 645 ] 646 647 [[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 name = "crossbeam-utils" 658 version = "0.8.21" 659 source = "registry+https://github.com/rust-lang/crates.io-index" 660 checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 661 662 [[package]] 663 name = "crypto-common" ··· 693 checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" 694 dependencies = [ 695 "quote", 696 - "syn 2.0.104", 697 ] 698 699 [[package]] ··· 703 checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" 704 dependencies = [ 705 "quote", 706 - "syn 2.0.104", 707 ] 708 709 [[package]] 710 name = "darling" 711 - version = "0.20.11" 712 source = "registry+https://github.com/rust-lang/crates.io-index" 713 - checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" 714 dependencies = [ 715 "darling_core", 716 "darling_macro", ··· 718 719 [[package]] 720 name = "darling_core" 721 - version = "0.20.11" 722 source = "registry+https://github.com/rust-lang/crates.io-index" 723 - checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" 724 dependencies = [ 725 "fnv", 726 "ident_case", 727 "proc-macro2", 728 "quote", 729 "strsim", 730 - "syn 2.0.104", 731 ] 732 733 [[package]] 734 name = "darling_macro" 735 - version = "0.20.11" 736 source = "registry+https://github.com/rust-lang/crates.io-index" 737 - checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" 738 dependencies = [ 739 "darling_core", 740 "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", 753 ] 754 755 [[package]] 756 name = "deranged" 757 - version = "0.4.0" 758 source = "registry+https://github.com/rust-lang/crates.io-index" 759 - checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" 760 dependencies = [ 761 "powerfmt", 762 - "serde", 763 ] 764 765 [[package]] ··· 772 "proc-macro2", 773 "quote", 774 "rustc_version", 775 - "syn 2.0.104", 776 ] 777 778 [[package]] ··· 782 checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 783 dependencies = [ 784 "block-buffer", 785 - "const-oid", 786 "crypto-common", 787 - "subtle", 788 ] 789 790 [[package]] ··· 805 "libc", 806 "option-ext", 807 "redox_users", 808 - "windows-sys 0.60.2", 809 ] 810 811 [[package]] ··· 820 source = "registry+https://github.com/rust-lang/crates.io-index" 821 checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" 822 dependencies = [ 823 - "bitflags 2.9.1", 824 - "objc2 0.6.1", 825 ] 826 827 [[package]] ··· 832 dependencies = [ 833 "proc-macro2", 834 "quote", 835 - "syn 2.0.104", 836 ] 837 838 [[package]] 839 name = "dlopen2" 840 - version = "0.7.0" 841 source = "registry+https://github.com/rust-lang/crates.io-index" 842 - checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6" 843 dependencies = [ 844 "dlopen2_derive", 845 "libc", ··· 855 dependencies = [ 856 "proc-macro2", 857 "quote", 858 - "syn 2.0.104", 859 ] 860 861 [[package]] 862 - name = "dotenvy" 863 - version = "0.15.7" 864 source = "registry+https://github.com/rust-lang/crates.io-index" 865 - checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" 866 867 [[package]] 868 name = "dpi" ··· 901 checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" 902 903 [[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 name = "embed-resource" 914 - version = "3.0.5" 915 source = "registry+https://github.com/rust-lang/crates.io-index" 916 - checksum = "4c6d81016d6c977deefb2ef8d8290da019e27cc26167e102185da528e6c0ab38" 917 dependencies = [ 918 "cc", 919 "memchr", 920 "rustc_version", 921 - "toml 0.9.3", 922 "vswhom", 923 "winreg", 924 ] ··· 936 checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" 937 938 [[package]] 939 name = "enumflags2" 940 version = "0.7.12" 941 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 953 dependencies = [ 954 "proc-macro2", 955 "quote", 956 - "syn 2.0.104", 957 ] 958 959 [[package]] ··· 964 965 [[package]] 966 name = "erased-serde" 967 - version = "0.4.6" 968 source = "registry+https://github.com/rust-lang/crates.io-index" 969 - checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" 970 dependencies = [ 971 "serde", 972 "typeid", 973 ] 974 975 [[package]] 976 name = "errno" 977 - version = "0.3.13" 978 source = "registry+https://github.com/rust-lang/crates.io-index" 979 - checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" 980 dependencies = [ 981 "libc", 982 - "windows-sys 0.60.2", 983 ] 984 985 [[package]] 986 - name = "etcetera" 987 - version = "0.8.0" 988 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 - ] 995 996 [[package]] 997 name = "event-listener" 998 - version = "5.4.0" 999 source = "registry+https://github.com/rust-lang/crates.io-index" 1000 - checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 1001 dependencies = [ 1002 "concurrent-queue", 1003 "parking", ··· 1021 checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 1022 1023 [[package]] 1024 name = "fdeflate" 1025 version = "0.3.7" 1026 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1040 ] 1041 1042 [[package]] 1043 - name = "flate2" 1044 - version = "1.1.2" 1045 source = "registry+https://github.com/rust-lang/crates.io-index" 1046 - checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" 1047 - dependencies = [ 1048 - "crc32fast", 1049 - "miniz_oxide", 1050 - ] 1051 1052 [[package]] 1053 - name = "flume" 1054 - version = "0.11.1" 1055 source = "registry+https://github.com/rust-lang/crates.io-index" 1056 - checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" 1057 dependencies = [ 1058 - "futures-core", 1059 - "futures-sink", 1060 - "spin", 1061 ] 1062 1063 [[package]] ··· 1090 dependencies = [ 1091 "proc-macro2", 1092 "quote", 1093 - "syn 2.0.104", 1094 ] 1095 1096 [[package]] ··· 1101 1102 [[package]] 1103 name = "form_urlencoded" 1104 - version = "1.2.1" 1105 source = "registry+https://github.com/rust-lang/crates.io-index" 1106 - checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 1107 dependencies = [ 1108 "percent-encoding", 1109 ] ··· 1125 checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 1126 dependencies = [ 1127 "futures-core", 1128 - "futures-sink", 1129 ] 1130 1131 [[package]] ··· 1146 ] 1147 1148 [[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 name = "futures-io" 1161 version = "0.3.31" 1162 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1164 1165 [[package]] 1166 name = "futures-lite" 1167 - version = "2.6.0" 1168 source = "registry+https://github.com/rust-lang/crates.io-index" 1169 - checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" 1170 dependencies = [ 1171 "fastrand", 1172 "futures-core", ··· 1183 dependencies = [ 1184 "proc-macro2", 1185 "quote", 1186 - "syn 2.0.104", 1187 ] 1188 1189 [[package]] ··· 1325 1326 [[package]] 1327 name = "generic-array" 1328 - version = "0.14.7" 1329 source = "registry+https://github.com/rust-lang/crates.io-index" 1330 - checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 1331 dependencies = [ 1332 "typenum", 1333 "version_check", 1334 ] 1335 1336 [[package]] 1337 name = "getrandom" 1338 version = "0.1.16" 1339 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1357 1358 [[package]] 1359 name = "getrandom" 1360 - version = "0.3.3" 1361 source = "registry+https://github.com/rust-lang/crates.io-index" 1362 - checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 1363 dependencies = [ 1364 "cfg-if", 1365 "libc", 1366 "r-efi", 1367 - "wasi 0.14.2+wasi-0.2.4", 1368 ] 1369 1370 [[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 name = "gio" 1378 version = "0.18.4" 1379 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1411 source = "registry+https://github.com/rust-lang/crates.io-index" 1412 checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" 1413 dependencies = [ 1414 - "bitflags 2.9.1", 1415 "futures-channel", 1416 "futures-core", 1417 "futures-executor", ··· 1435 checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" 1436 dependencies = [ 1437 "heck 0.4.1", 1438 - "proc-macro-crate 2.0.0", 1439 "proc-macro-error", 1440 "proc-macro2", 1441 "quote", 1442 - "syn 2.0.104", 1443 ] 1444 1445 [[package]] ··· 1454 1455 [[package]] 1456 name = "glob" 1457 - version = "0.3.2" 1458 source = "registry+https://github.com/rust-lang/crates.io-index" 1459 - checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 1460 1461 [[package]] 1462 name = "gobject-sys" ··· 1518 "proc-macro-error", 1519 "proc-macro2", 1520 "quote", 1521 - "syn 2.0.104", 1522 ] 1523 1524 [[package]] ··· 1529 1530 [[package]] 1531 name = "hashbrown" 1532 - version = "0.15.4" 1533 source = "registry+https://github.com/rust-lang/crates.io-index" 1534 - checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" 1535 dependencies = [ 1536 - "allocator-api2", 1537 - "equivalent", 1538 "foldhash", 1539 ] 1540 1541 [[package]] 1542 - name = "hashlink" 1543 - version = "0.10.0" 1544 source = "registry+https://github.com/rust-lang/crates.io-index" 1545 - checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" 1546 - dependencies = [ 1547 - "hashbrown 0.15.4", 1548 - ] 1549 1550 [[package]] 1551 name = "heck" ··· 1572 checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 1573 1574 [[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 name = "html5ever" 1603 version = "0.29.1" 1604 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1652 1653 [[package]] 1654 name = "hyper" 1655 - version = "1.6.0" 1656 source = "registry+https://github.com/rust-lang/crates.io-index" 1657 - checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 1658 dependencies = [ 1659 "bytes", 1660 "futures-channel", 1661 - "futures-util", 1662 "http", 1663 "http-body", 1664 "httparse", 1665 "itoa", 1666 "pin-project-lite", 1667 "smallvec", 1668 "tokio", 1669 "want", ··· 1671 1672 [[package]] 1673 name = "hyper-util" 1674 - version = "0.1.16" 1675 source = "registry+https://github.com/rust-lang/crates.io-index" 1676 - checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" 1677 dependencies = [ 1678 "base64 0.22.1", 1679 "bytes", ··· 1695 1696 [[package]] 1697 name = "iana-time-zone" 1698 - version = "0.1.63" 1699 source = "registry+https://github.com/rust-lang/crates.io-index" 1700 - checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" 1701 dependencies = [ 1702 "android_system_properties", 1703 "core-foundation-sys", ··· 1705 "js-sys", 1706 "log", 1707 "wasm-bindgen", 1708 - "windows-core", 1709 ] 1710 1711 [[package]] ··· 1724 checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" 1725 dependencies = [ 1726 "byteorder", 1727 - "png", 1728 ] 1729 1730 [[package]] 1731 name = "icu_collections" 1732 - version = "2.0.0" 1733 source = "registry+https://github.com/rust-lang/crates.io-index" 1734 - checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 1735 dependencies = [ 1736 "displaydoc", 1737 "potential_utf", ··· 1742 1743 [[package]] 1744 name = "icu_locale_core" 1745 - version = "2.0.0" 1746 source = "registry+https://github.com/rust-lang/crates.io-index" 1747 - checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 1748 dependencies = [ 1749 "displaydoc", 1750 "litemap", ··· 1755 1756 [[package]] 1757 name = "icu_normalizer" 1758 - version = "2.0.0" 1759 source = "registry+https://github.com/rust-lang/crates.io-index" 1760 - checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 1761 dependencies = [ 1762 - "displaydoc", 1763 "icu_collections", 1764 "icu_normalizer_data", 1765 "icu_properties", ··· 1770 1771 [[package]] 1772 name = "icu_normalizer_data" 1773 - version = "2.0.0" 1774 source = "registry+https://github.com/rust-lang/crates.io-index" 1775 - checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 1776 1777 [[package]] 1778 name = "icu_properties" 1779 - version = "2.0.1" 1780 source = "registry+https://github.com/rust-lang/crates.io-index" 1781 - checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 1782 dependencies = [ 1783 - "displaydoc", 1784 "icu_collections", 1785 "icu_locale_core", 1786 "icu_properties_data", 1787 "icu_provider", 1788 - "potential_utf", 1789 "zerotrie", 1790 "zerovec", 1791 ] 1792 1793 [[package]] 1794 name = "icu_properties_data" 1795 - version = "2.0.1" 1796 source = "registry+https://github.com/rust-lang/crates.io-index" 1797 - checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 1798 1799 [[package]] 1800 name = "icu_provider" 1801 - version = "2.0.0" 1802 source = "registry+https://github.com/rust-lang/crates.io-index" 1803 - checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 1804 dependencies = [ 1805 "displaydoc", 1806 "icu_locale_core", 1807 - "stable_deref_trait", 1808 - "tinystr", 1809 "writeable", 1810 "yoke", 1811 "zerofrom", ··· 1821 1822 [[package]] 1823 name = "idna" 1824 - version = "1.0.3" 1825 source = "registry+https://github.com/rust-lang/crates.io-index" 1826 - checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 1827 dependencies = [ 1828 "idna_adapter", 1829 "smallvec", ··· 1841 ] 1842 1843 [[package]] 1844 name = "indexmap" 1845 version = "1.9.3" 1846 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1853 1854 [[package]] 1855 name = "indexmap" 1856 - version = "2.10.0" 1857 source = "registry+https://github.com/rust-lang/crates.io-index" 1858 - checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" 1859 dependencies = [ 1860 "equivalent", 1861 - "hashbrown 0.15.4", 1862 "serde", 1863 ] 1864 1865 [[package]] ··· 1872 ] 1873 1874 [[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 name = "ipnet" 1887 version = "2.11.0" 1888 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1890 1891 [[package]] 1892 name = "iri-string" 1893 - version = "0.7.8" 1894 source = "registry+https://github.com/rust-lang/crates.io-index" 1895 - checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" 1896 dependencies = [ 1897 "memchr", 1898 "serde", ··· 1970 1971 [[package]] 1972 name = "js-sys" 1973 - version = "0.3.77" 1974 source = "registry+https://github.com/rust-lang/crates.io-index" 1975 - checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 1976 dependencies = [ 1977 "once_cell", 1978 "wasm-bindgen", ··· 2006 source = "registry+https://github.com/rust-lang/crates.io-index" 2007 checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" 2008 dependencies = [ 2009 - "bitflags 2.9.1", 2010 "serde", 2011 "unicode-segmentation", 2012 ] ··· 2019 dependencies = [ 2020 "cssparser", 2021 "html5ever", 2022 - "indexmap 2.10.0", 2023 "selectors", 2024 ] 2025 ··· 2028 version = "1.5.0" 2029 source = "registry+https://github.com/rust-lang/crates.io-index" 2030 checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 2031 - dependencies = [ 2032 - "spin", 2033 - ] 2034 2035 [[package]] 2036 name = "libappindicator" ··· 2052 checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" 2053 dependencies = [ 2054 "gtk-sys", 2055 - "libloading", 2056 "once_cell", 2057 ] 2058 2059 [[package]] 2060 name = "libc" 2061 - version = "0.2.174" 2062 source = "registry+https://github.com/rust-lang/crates.io-index" 2063 - checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" 2064 2065 [[package]] 2066 name = "libloading" ··· 2073 ] 2074 2075 [[package]] 2076 - name = "libm" 2077 - version = "0.2.15" 2078 source = "registry+https://github.com/rust-lang/crates.io-index" 2079 - checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" 2080 2081 [[package]] 2082 name = "libredox" 2083 - version = "0.1.8" 2084 source = "registry+https://github.com/rust-lang/crates.io-index" 2085 - checksum = "360e552c93fa0e8152ab463bc4c4837fce76a225df11dfaeea66c313de5e61f7" 2086 dependencies = [ 2087 - "bitflags 2.9.1", 2088 "libc", 2089 ] 2090 2091 [[package]] 2092 - name = "libsqlite3-sys" 2093 - version = "0.30.1" 2094 source = "registry+https://github.com/rust-lang/crates.io-index" 2095 - checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" 2096 - dependencies = [ 2097 - "cc", 2098 - "pkg-config", 2099 - "vcpkg", 2100 - ] 2101 2102 [[package]] 2103 name = "linux-raw-sys" 2104 - version = "0.9.4" 2105 source = "registry+https://github.com/rust-lang/crates.io-index" 2106 - checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 2107 2108 [[package]] 2109 name = "litemap" 2110 - version = "0.8.0" 2111 source = "registry+https://github.com/rust-lang/crates.io-index" 2112 - checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 2113 2114 [[package]] 2115 name = "lock_api" 2116 - version = "0.4.13" 2117 source = "registry+https://github.com/rust-lang/crates.io-index" 2118 - checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" 2119 dependencies = [ 2120 - "autocfg", 2121 "scopeguard", 2122 ] 2123 2124 [[package]] 2125 name = "log" 2126 - version = "0.4.27" 2127 source = "registry+https://github.com/rust-lang/crates.io-index" 2128 - checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 2129 2130 [[package]] 2131 name = "mac" ··· 2155 dependencies = [ 2156 "proc-macro2", 2157 "quote", 2158 - "syn 2.0.104", 2159 ] 2160 2161 [[package]] ··· 2165 checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" 2166 2167 [[package]] 2168 - name = "md-5" 2169 - version = "0.10.6" 2170 source = "registry+https://github.com/rust-lang/crates.io-index" 2171 - checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" 2172 - dependencies = [ 2173 - "cfg-if", 2174 - "digest", 2175 - ] 2176 2177 [[package]] 2178 - name = "memchr" 2179 - version = "2.7.5" 2180 source = "registry+https://github.com/rust-lang/crates.io-index" 2181 - checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" 2182 2183 [[package]] 2184 name = "memoffset" ··· 2194 version = "0.3.17" 2195 source = "registry+https://github.com/rust-lang/crates.io-index" 2196 checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 2197 2198 [[package]] 2199 name = "miniz_oxide" ··· 2207 2208 [[package]] 2209 name = "mio" 2210 - version = "1.0.4" 2211 source = "registry+https://github.com/rust-lang/crates.io-index" 2212 - checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 2213 dependencies = [ 2214 "libc", 2215 "wasi 0.11.1+wasi-snapshot-preview1", 2216 - "windows-sys 0.59.0", 2217 ] 2218 2219 [[package]] 2220 name = "muda" 2221 - version = "0.17.0" 2222 source = "registry+https://github.com/rust-lang/crates.io-index" 2223 - checksum = "58b89bf91c19bf036347f1ab85a81c560f08c0667c8601bece664d860a600988" 2224 dependencies = [ 2225 "crossbeam-channel", 2226 "dpi", 2227 "gtk", 2228 "keyboard-types", 2229 - "objc2 0.6.1", 2230 "objc2-app-kit", 2231 "objc2-core-foundation", 2232 - "objc2-foundation 0.3.1", 2233 "once_cell", 2234 - "png", 2235 "serde", 2236 - "thiserror 2.0.12", 2237 - "windows-sys 0.59.0", 2238 ] 2239 2240 [[package]] ··· 2243 source = "registry+https://github.com/rust-lang/crates.io-index" 2244 checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" 2245 dependencies = [ 2246 - "bitflags 2.9.1", 2247 "jni-sys", 2248 "log", 2249 "ndk-sys", ··· 2279 source = "registry+https://github.com/rust-lang/crates.io-index" 2280 checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" 2281 dependencies = [ 2282 - "bitflags 2.9.1", 2283 "cfg-if", 2284 "cfg_aliases", 2285 "libc", ··· 2293 checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" 2294 2295 [[package]] 2296 - name = "num-bigint-dig" 2297 - version = "0.8.4" 2298 source = "registry+https://github.com/rust-lang/crates.io-index" 2299 - checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" 2300 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", 2310 ] 2311 2312 [[package]] 2313 - name = "num-conv" 2314 - version = "0.1.0" 2315 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" 2323 dependencies = [ 2324 - "num-traits", 2325 ] 2326 2327 [[package]] 2328 - name = "num-iter" 2329 - version = "0.1.45" 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 - ] 2337 2338 [[package]] 2339 name = "num-traits" ··· 2342 checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 2343 dependencies = [ 2344 "autocfg", 2345 - "libm", 2346 ] 2347 2348 [[package]] 2349 name = "num_enum" 2350 - version = "0.7.4" 2351 source = "registry+https://github.com/rust-lang/crates.io-index" 2352 - checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" 2353 dependencies = [ 2354 "num_enum_derive", 2355 "rustversion", ··· 2357 2358 [[package]] 2359 name = "num_enum_derive" 2360 - version = "0.7.4" 2361 source = "registry+https://github.com/rust-lang/crates.io-index" 2362 - checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" 2363 dependencies = [ 2364 - "proc-macro-crate 3.3.0", 2365 "proc-macro2", 2366 "quote", 2367 - "syn 2.0.104", 2368 ] 2369 2370 [[package]] ··· 2385 2386 [[package]] 2387 name = "objc2" 2388 - version = "0.6.1" 2389 source = "registry+https://github.com/rust-lang/crates.io-index" 2390 - checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" 2391 dependencies = [ 2392 "objc2-encode", 2393 "objc2-exception-helper", ··· 2395 2396 [[package]] 2397 name = "objc2-app-kit" 2398 - version = "0.3.1" 2399 source = "registry+https://github.com/rust-lang/crates.io-index" 2400 - checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" 2401 dependencies = [ 2402 - "bitflags 2.9.1", 2403 - "block2 0.6.1", 2404 "libc", 2405 - "objc2 0.6.1", 2406 "objc2-cloud-kit", 2407 "objc2-core-data", 2408 "objc2-core-foundation", 2409 "objc2-core-graphics", 2410 "objc2-core-image", 2411 - "objc2-foundation 0.3.1", 2412 - "objc2-quartz-core 0.3.1", 2413 ] 2414 2415 [[package]] 2416 name = "objc2-cloud-kit" 2417 - version = "0.3.1" 2418 source = "registry+https://github.com/rust-lang/crates.io-index" 2419 - checksum = "17614fdcd9b411e6ff1117dfb1d0150f908ba83a7df81b1f118005fe0a8ea15d" 2420 dependencies = [ 2421 - "bitflags 2.9.1", 2422 - "objc2 0.6.1", 2423 - "objc2-foundation 0.3.1", 2424 ] 2425 2426 [[package]] 2427 name = "objc2-core-data" 2428 - version = "0.3.1" 2429 source = "registry+https://github.com/rust-lang/crates.io-index" 2430 - checksum = "291fbbf7d29287518e8686417cf7239c74700fd4b607623140a7d4a3c834329d" 2431 dependencies = [ 2432 - "bitflags 2.9.1", 2433 - "objc2 0.6.1", 2434 - "objc2-foundation 0.3.1", 2435 ] 2436 2437 [[package]] 2438 name = "objc2-core-foundation" 2439 - version = "0.3.1" 2440 source = "registry+https://github.com/rust-lang/crates.io-index" 2441 - checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" 2442 dependencies = [ 2443 - "bitflags 2.9.1", 2444 "dispatch2", 2445 - "objc2 0.6.1", 2446 ] 2447 2448 [[package]] 2449 name = "objc2-core-graphics" 2450 - version = "0.3.1" 2451 source = "registry+https://github.com/rust-lang/crates.io-index" 2452 - checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" 2453 dependencies = [ 2454 - "bitflags 2.9.1", 2455 "dispatch2", 2456 - "objc2 0.6.1", 2457 "objc2-core-foundation", 2458 "objc2-io-surface", 2459 ] 2460 2461 [[package]] 2462 name = "objc2-core-image" 2463 - version = "0.3.1" 2464 source = "registry+https://github.com/rust-lang/crates.io-index" 2465 - checksum = "79b3dc0cc4386b6ccf21c157591b34a7f44c8e75b064f85502901ab2188c007e" 2466 dependencies = [ 2467 - "objc2 0.6.1", 2468 - "objc2-foundation 0.3.1", 2469 ] 2470 2471 [[package]] ··· 2489 source = "registry+https://github.com/rust-lang/crates.io-index" 2490 checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" 2491 dependencies = [ 2492 - "bitflags 2.9.1", 2493 "block2 0.5.1", 2494 "libc", 2495 "objc2 0.5.2", ··· 2497 2498 [[package]] 2499 name = "objc2-foundation" 2500 - version = "0.3.1" 2501 source = "registry+https://github.com/rust-lang/crates.io-index" 2502 - checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" 2503 dependencies = [ 2504 - "bitflags 2.9.1", 2505 - "block2 0.6.1", 2506 "libc", 2507 - "objc2 0.6.1", 2508 "objc2-core-foundation", 2509 ] 2510 2511 [[package]] 2512 name = "objc2-io-surface" 2513 - version = "0.3.1" 2514 source = "registry+https://github.com/rust-lang/crates.io-index" 2515 - checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" 2516 dependencies = [ 2517 - "bitflags 2.9.1", 2518 - "objc2 0.6.1", 2519 "objc2-core-foundation", 2520 ] 2521 ··· 2525 source = "registry+https://github.com/rust-lang/crates.io-index" 2526 checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" 2527 dependencies = [ 2528 - "bitflags 2.9.1", 2529 "block2 0.5.1", 2530 "objc2 0.5.2", 2531 "objc2-foundation 0.2.2", ··· 2537 source = "registry+https://github.com/rust-lang/crates.io-index" 2538 checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" 2539 dependencies = [ 2540 - "bitflags 2.9.1", 2541 "block2 0.5.1", 2542 "objc2 0.5.2", 2543 "objc2-foundation 0.2.2", ··· 2546 2547 [[package]] 2548 name = "objc2-quartz-core" 2549 - version = "0.3.1" 2550 source = "registry+https://github.com/rust-lang/crates.io-index" 2551 - checksum = "90ffb6a0cd5f182dc964334388560b12a57f7b74b3e2dec5e2722aa2dfb2ccd5" 2552 dependencies = [ 2553 - "bitflags 2.9.1", 2554 - "objc2 0.6.1", 2555 - "objc2-foundation 0.3.1", 2556 ] 2557 2558 [[package]] 2559 - name = "objc2-ui-kit" 2560 - version = "0.3.1" 2561 source = "registry+https://github.com/rust-lang/crates.io-index" 2562 - checksum = "25b1312ad7bc8a0e92adae17aa10f90aae1fb618832f9b993b022b591027daed" 2563 dependencies = [ 2564 - "bitflags 2.9.1", 2565 - "objc2 0.6.1", 2566 "objc2-core-foundation", 2567 - "objc2-foundation 0.3.1", 2568 ] 2569 2570 [[package]] 2571 - name = "objc2-web-kit" 2572 - version = "0.3.1" 2573 source = "registry+https://github.com/rust-lang/crates.io-index" 2574 - checksum = "91672909de8b1ce1c2252e95bbee8c1649c9ad9d14b9248b3d7b4c47903c47ad" 2575 dependencies = [ 2576 - "bitflags 2.9.1", 2577 - "block2 0.6.1", 2578 - "objc2 0.6.1", 2579 - "objc2-app-kit", 2580 "objc2-core-foundation", 2581 - "objc2-foundation 0.3.1", 2582 ] 2583 2584 [[package]] 2585 - name = "object" 2586 - version = "0.36.7" 2587 source = "registry+https://github.com/rust-lang/crates.io-index" 2588 - checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 2589 dependencies = [ 2590 - "memchr", 2591 ] 2592 2593 [[package]] ··· 2625 ] 2626 2627 [[package]] 2628 name = "pango" 2629 version = "0.18.3" 2630 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2657 2658 [[package]] 2659 name = "parking_lot" 2660 - version = "0.12.4" 2661 source = "registry+https://github.com/rust-lang/crates.io-index" 2662 - checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" 2663 dependencies = [ 2664 "lock_api", 2665 "parking_lot_core", ··· 2667 2668 [[package]] 2669 name = "parking_lot_core" 2670 - version = "0.9.11" 2671 source = "registry+https://github.com/rust-lang/crates.io-index" 2672 - checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" 2673 dependencies = [ 2674 "cfg-if", 2675 "libc", 2676 "redox_syscall", 2677 "smallvec", 2678 - "windows-targets 0.52.6", 2679 ] 2680 2681 [[package]] ··· 2685 checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" 2686 2687 [[package]] 2688 - name = "pem-rfc7468" 2689 - version = "0.7.0" 2690 source = "registry+https://github.com/rust-lang/crates.io-index" 2691 - checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" 2692 - dependencies = [ 2693 - "base64ct", 2694 - ] 2695 2696 [[package]] 2697 - name = "percent-encoding" 2698 - version = "2.3.1" 2699 source = "registry+https://github.com/rust-lang/crates.io-index" 2700 - checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 2701 2702 [[package]] 2703 name = "phf" ··· 2803 "phf_shared 0.11.3", 2804 "proc-macro2", 2805 "quote", 2806 - "syn 2.0.104", 2807 ] 2808 2809 [[package]] ··· 2857 ] 2858 2859 [[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 name = "pkg-config" 2882 version = "0.3.32" 2883 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2885 2886 [[package]] 2887 name = "plist" 2888 - version = "1.7.4" 2889 source = "registry+https://github.com/rust-lang/crates.io-index" 2890 - checksum = "3af6b589e163c5a788fab00ce0c0366f6efbb9959c2f9874b224936af7fce7e1" 2891 dependencies = [ 2892 "base64 0.22.1", 2893 - "indexmap 2.10.0", 2894 - "quick-xml", 2895 "serde", 2896 "time", 2897 ] ··· 2910 ] 2911 2912 [[package]] 2913 name = "polling" 2914 - version = "3.9.0" 2915 source = "registry+https://github.com/rust-lang/crates.io-index" 2916 - checksum = "8ee9b2fa7a4517d2c91ff5bc6c297a427a96749d15f98fcdbb22c05571a4d4b7" 2917 dependencies = [ 2918 "cfg-if", 2919 "concurrent-queue", 2920 "hermit-abi", 2921 "pin-project-lite", 2922 - "rustix", 2923 - "windows-sys 0.60.2", 2924 ] 2925 2926 [[package]] 2927 name = "potential_utf" 2928 - version = "0.1.2" 2929 source = "registry+https://github.com/rust-lang/crates.io-index" 2930 - checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" 2931 dependencies = [ 2932 "zerovec", 2933 ] ··· 2965 2966 [[package]] 2967 name = "proc-macro-crate" 2968 - version = "2.0.0" 2969 source = "registry+https://github.com/rust-lang/crates.io-index" 2970 - checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" 2971 dependencies = [ 2972 - "toml_edit 0.20.7", 2973 ] 2974 2975 [[package]] 2976 name = "proc-macro-crate" 2977 - version = "3.3.0" 2978 source = "registry+https://github.com/rust-lang/crates.io-index" 2979 - checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" 2980 dependencies = [ 2981 - "toml_edit 0.22.27", 2982 ] 2983 2984 [[package]] ··· 3013 3014 [[package]] 3015 name = "proc-macro2" 3016 - version = "1.0.95" 3017 source = "registry+https://github.com/rust-lang/crates.io-index" 3018 - checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 3019 dependencies = [ 3020 "unicode-ident", 3021 ] 3022 3023 [[package]] 3024 name = "quick-xml" 3025 - version = "0.38.0" 3026 source = "registry+https://github.com/rust-lang/crates.io-index" 3027 - checksum = "8927b0664f5c5a98265138b7e3f90aa19a6b21353182469ace36d4ac527b7b1b" 3028 dependencies = [ 3029 "memchr", 3030 ] 3031 3032 [[package]] 3033 name = "quote" 3034 - version = "1.0.40" 3035 source = "registry+https://github.com/rust-lang/crates.io-index" 3036 - checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 3037 dependencies = [ 3038 "proc-macro2", 3039 ] ··· 3070 ] 3071 3072 [[package]] 3073 name = "rand_chacha" 3074 version = "0.2.2" 3075 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3090 ] 3091 3092 [[package]] 3093 name = "rand_core" 3094 version = "0.5.1" 3095 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3105 checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 3106 dependencies = [ 3107 "getrandom 0.2.16", 3108 ] 3109 3110 [[package]] ··· 3133 3134 [[package]] 3135 name = "redox_syscall" 3136 - version = "0.5.17" 3137 source = "registry+https://github.com/rust-lang/crates.io-index" 3138 - checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" 3139 dependencies = [ 3140 - "bitflags 2.9.1", 3141 ] 3142 3143 [[package]] 3144 name = "redox_users" 3145 - version = "0.5.0" 3146 source = "registry+https://github.com/rust-lang/crates.io-index" 3147 - checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" 3148 dependencies = [ 3149 "getrandom 0.2.16", 3150 "libredox", 3151 - "thiserror 2.0.12", 3152 ] 3153 3154 [[package]] 3155 name = "ref-cast" 3156 - version = "1.0.24" 3157 source = "registry+https://github.com/rust-lang/crates.io-index" 3158 - checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" 3159 dependencies = [ 3160 "ref-cast-impl", 3161 ] 3162 3163 [[package]] 3164 name = "ref-cast-impl" 3165 - version = "1.0.24" 3166 source = "registry+https://github.com/rust-lang/crates.io-index" 3167 - checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" 3168 dependencies = [ 3169 "proc-macro2", 3170 "quote", 3171 - "syn 2.0.104", 3172 ] 3173 3174 [[package]] 3175 name = "regex" 3176 - version = "1.11.1" 3177 source = "registry+https://github.com/rust-lang/crates.io-index" 3178 - checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 3179 dependencies = [ 3180 "aho-corasick", 3181 "memchr", ··· 3185 3186 [[package]] 3187 name = "regex-automata" 3188 - version = "0.4.9" 3189 source = "registry+https://github.com/rust-lang/crates.io-index" 3190 - checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 3191 dependencies = [ 3192 "aho-corasick", 3193 "memchr", ··· 3196 3197 [[package]] 3198 name = "regex-syntax" 3199 - version = "0.8.5" 3200 source = "registry+https://github.com/rust-lang/crates.io-index" 3201 - checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 3202 3203 [[package]] 3204 name = "reqwest" 3205 - version = "0.12.22" 3206 source = "registry+https://github.com/rust-lang/crates.io-index" 3207 - checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" 3208 dependencies = [ 3209 "base64 0.22.1", 3210 "bytes", ··· 3236 ] 3237 3238 [[package]] 3239 - name = "rsa" 3240 - version = "0.9.8" 3241 source = "registry+https://github.com/rust-lang/crates.io-index" 3242 - checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" 3243 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", 3256 ] 3257 3258 [[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 name = "rustc_version" 3266 version = "0.4.1" 3267 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3272 3273 [[package]] 3274 name = "rustix" 3275 - version = "1.0.8" 3276 source = "registry+https://github.com/rust-lang/crates.io-index" 3277 - checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" 3278 dependencies = [ 3279 - "bitflags 2.9.1", 3280 "errno", 3281 "libc", 3282 - "linux-raw-sys", 3283 - "windows-sys 0.60.2", 3284 ] 3285 3286 [[package]] 3287 name = "rustversion" 3288 - version = "1.0.21" 3289 source = "registry+https://github.com/rust-lang/crates.io-index" 3290 - checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" 3291 3292 [[package]] 3293 name = "ryu" ··· 3333 3334 [[package]] 3335 name = "schemars" 3336 - version = "1.0.4" 3337 source = "registry+https://github.com/rust-lang/crates.io-index" 3338 - checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" 3339 dependencies = [ 3340 "dyn-clone", 3341 "ref-cast", ··· 3352 "proc-macro2", 3353 "quote", 3354 "serde_derive_internals", 3355 - "syn 2.0.104", 3356 ] 3357 3358 [[package]] 3359 name = "scopeguard" 3360 version = "1.2.0" 3361 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3381 3382 [[package]] 3383 name = "semver" 3384 - version = "1.0.26" 3385 source = "registry+https://github.com/rust-lang/crates.io-index" 3386 - checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" 3387 dependencies = [ 3388 "serde", 3389 ] 3390 3391 [[package]] 3392 name = "serde" 3393 - version = "1.0.219" 3394 source = "registry+https://github.com/rust-lang/crates.io-index" 3395 - checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 3396 dependencies = [ 3397 "serde_derive", 3398 ] 3399 3400 [[package]] 3401 name = "serde-untagged" 3402 - version = "0.1.7" 3403 source = "registry+https://github.com/rust-lang/crates.io-index" 3404 - checksum = "299d9c19d7d466db4ab10addd5703e4c615dec2a5a16dbbafe191045e87ee66e" 3405 dependencies = [ 3406 "erased-serde", 3407 "serde", 3408 "typeid", 3409 ] 3410 3411 [[package]] 3412 name = "serde_derive" 3413 - version = "1.0.219" 3414 source = "registry+https://github.com/rust-lang/crates.io-index" 3415 - checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 3416 dependencies = [ 3417 "proc-macro2", 3418 "quote", 3419 - "syn 2.0.104", 3420 ] 3421 3422 [[package]] ··· 3427 dependencies = [ 3428 "proc-macro2", 3429 "quote", 3430 - "syn 2.0.104", 3431 ] 3432 3433 [[package]] 3434 name = "serde_json" 3435 - version = "1.0.141" 3436 source = "registry+https://github.com/rust-lang/crates.io-index" 3437 - checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" 3438 dependencies = [ 3439 "itoa", 3440 "memchr", 3441 "ryu", 3442 "serde", 3443 ] 3444 3445 [[package]] ··· 3450 dependencies = [ 3451 "proc-macro2", 3452 "quote", 3453 - "syn 2.0.104", 3454 ] 3455 3456 [[package]] ··· 3464 3465 [[package]] 3466 name = "serde_spanned" 3467 - version = "1.0.0" 3468 source = "registry+https://github.com/rust-lang/crates.io-index" 3469 - checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" 3470 dependencies = [ 3471 - "serde", 3472 ] 3473 3474 [[package]] ··· 3485 3486 [[package]] 3487 name = "serde_with" 3488 - version = "3.14.0" 3489 source = "registry+https://github.com/rust-lang/crates.io-index" 3490 - checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" 3491 dependencies = [ 3492 "base64 0.22.1", 3493 "chrono", 3494 "hex", 3495 "indexmap 1.9.3", 3496 - "indexmap 2.10.0", 3497 "schemars 0.9.0", 3498 - "schemars 1.0.4", 3499 - "serde", 3500 - "serde_derive", 3501 "serde_json", 3502 "serde_with_macros", 3503 "time", ··· 3505 3506 [[package]] 3507 name = "serde_with_macros" 3508 - version = "3.14.0" 3509 source = "registry+https://github.com/rust-lang/crates.io-index" 3510 - checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" 3511 dependencies = [ 3512 "darling", 3513 "proc-macro2", 3514 "quote", 3515 - "syn 2.0.104", 3516 ] 3517 3518 [[package]] 3519 name = "serialize-to-javascript" 3520 - version = "0.1.1" 3521 source = "registry+https://github.com/rust-lang/crates.io-index" 3522 - checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" 3523 dependencies = [ 3524 "serde", 3525 "serde_json", ··· 3528 3529 [[package]] 3530 name = "serialize-to-javascript-impl" 3531 - version = "0.1.1" 3532 source = "registry+https://github.com/rust-lang/crates.io-index" 3533 - checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" 3534 dependencies = [ 3535 "proc-macro2", 3536 "quote", 3537 - "syn 1.0.109", 3538 ] 3539 3540 [[package]] ··· 3548 ] 3549 3550 [[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 name = "sha2" 3563 version = "0.10.9" 3564 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3577 3578 [[package]] 3579 name = "signal-hook-registry" 3580 - version = "1.4.5" 3581 source = "registry+https://github.com/rust-lang/crates.io-index" 3582 - checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" 3583 dependencies = [ 3584 "libc", 3585 ] 3586 3587 [[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 name = "simd-adler32" 3599 version = "0.3.7" 3600 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3614 3615 [[package]] 3616 name = "slab" 3617 - version = "0.4.10" 3618 source = "registry+https://github.com/rust-lang/crates.io-index" 3619 - checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" 3620 3621 [[package]] 3622 name = "smallvec" 3623 version = "1.15.1" 3624 source = "registry+https://github.com/rust-lang/crates.io-index" 3625 checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 3626 - dependencies = [ 3627 - "serde", 3628 - ] 3629 3630 [[package]] 3631 name = "socket2" 3632 - version = "0.6.0" 3633 source = "registry+https://github.com/rust-lang/crates.io-index" 3634 - checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" 3635 dependencies = [ 3636 "libc", 3637 - "windows-sys 0.59.0", 3638 ] 3639 3640 [[package]] ··· 3645 dependencies = [ 3646 "bytemuck", 3647 "cfg_aliases", 3648 - "core-graphics", 3649 "foreign-types", 3650 "js-sys", 3651 "log", ··· 3686 ] 3687 3688 [[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 name = "stable_deref_trait" 3897 - version = "1.2.0" 3898 source = "registry+https://github.com/rust-lang/crates.io-index" 3899 - checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 3900 3901 [[package]] 3902 name = "static_assertions" ··· 3930 ] 3931 3932 [[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 name = "strsim" 3945 version = "0.11.1" 3946 source = "registry+https://github.com/rust-lang/crates.io-index" 3947 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 3955 [[package]] 3956 name = "swift-rs" ··· 3976 3977 [[package]] 3978 name = "syn" 3979 - version = "2.0.104" 3980 source = "registry+https://github.com/rust-lang/crates.io-index" 3981 - checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" 3982 dependencies = [ 3983 "proc-macro2", 3984 "quote", ··· 4002 dependencies = [ 4003 "proc-macro2", 4004 "quote", 4005 - "syn 2.0.104", 4006 ] 4007 4008 [[package]] ··· 4014 "cfg-expr", 4015 "heck 0.5.0", 4016 "pkg-config", 4017 - "toml 0.8.23", 4018 "version-compare", 4019 ] 4020 4021 [[package]] 4022 name = "tao" 4023 - version = "0.34.0" 4024 source = "registry+https://github.com/rust-lang/crates.io-index" 4025 - checksum = "49c380ca75a231b87b6c9dd86948f035012e7171d1a7c40a9c2890489a7ffd8a" 4026 dependencies = [ 4027 - "bitflags 2.9.1", 4028 "core-foundation", 4029 - "core-graphics", 4030 "crossbeam-channel", 4031 "dispatch", 4032 "dlopen2", ··· 4041 "ndk", 4042 "ndk-context", 4043 "ndk-sys", 4044 - "objc2 0.6.1", 4045 "objc2-app-kit", 4046 - "objc2-foundation 0.3.1", 4047 "once_cell", 4048 "parking_lot", 4049 "raw-window-handle", ··· 4052 "unicode-segmentation", 4053 "url", 4054 "windows", 4055 - "windows-core", 4056 "windows-version", 4057 "x11-dl", 4058 ] ··· 4065 dependencies = [ 4066 "proc-macro2", 4067 "quote", 4068 - "syn 2.0.104", 4069 ] 4070 4071 [[package]] ··· 4076 4077 [[package]] 4078 name = "tauri" 4079 - version = "2.7.0" 4080 source = "registry+https://github.com/rust-lang/crates.io-index" 4081 - checksum = "352a4bc7bf6c25f5624227e3641adf475a6535707451b09bb83271df8b7a6ac7" 4082 dependencies = [ 4083 "anyhow", 4084 "bytes", 4085 "dirs", 4086 "dunce", 4087 "embed_plist", 4088 - "getrandom 0.3.3", 4089 "glob", 4090 "gtk", 4091 "heck 0.5.0", 4092 "http", 4093 "jni", 4094 "libc", 4095 "log", 4096 "mime", 4097 "muda", 4098 - "objc2 0.6.1", 4099 "objc2-app-kit", 4100 - "objc2-foundation 0.3.1", 4101 "objc2-ui-kit", 4102 "percent-encoding", 4103 "plist", 4104 "raw-window-handle", ··· 4113 "tauri-runtime", 4114 "tauri-runtime-wry", 4115 "tauri-utils", 4116 - "thiserror 2.0.12", 4117 "tokio", 4118 "tray-icon", 4119 "url", 4120 - "urlpattern", 4121 "webkit2gtk", 4122 "webview2-com", 4123 "window-vibrancy", ··· 4126 4127 [[package]] 4128 name = "tauri-build" 4129 - version = "2.3.1" 4130 source = "registry+https://github.com/rust-lang/crates.io-index" 4131 - checksum = "182d688496c06bf08ea896459bf483eb29cdff35c1c4c115fb14053514303064" 4132 dependencies = [ 4133 "anyhow", 4134 "cargo_toml", ··· 4142 "serde_json", 4143 "tauri-utils", 4144 "tauri-winres", 4145 - "toml 0.8.23", 4146 "walkdir", 4147 ] 4148 4149 [[package]] 4150 name = "tauri-codegen" 4151 - version = "2.3.1" 4152 source = "registry+https://github.com/rust-lang/crates.io-index" 4153 - checksum = "b54a99a6cd8e01abcfa61508177e6096a4fe2681efecee9214e962f2f073ae4a" 4154 dependencies = [ 4155 "base64 0.22.1", 4156 "brotli", 4157 "ico", 4158 "json-patch", 4159 "plist", 4160 - "png", 4161 "proc-macro2", 4162 "quote", 4163 "semver", 4164 "serde", 4165 "serde_json", 4166 "sha2", 4167 - "syn 2.0.104", 4168 "tauri-utils", 4169 - "thiserror 2.0.12", 4170 "time", 4171 "url", 4172 "uuid", ··· 4175 4176 [[package]] 4177 name = "tauri-macros" 4178 - version = "2.3.2" 4179 source = "registry+https://github.com/rust-lang/crates.io-index" 4180 - checksum = "7945b14dc45e23532f2ded6e120170bbdd4af5ceaa45784a6b33d250fbce3f9e" 4181 dependencies = [ 4182 "heck 0.5.0", 4183 "proc-macro2", 4184 "quote", 4185 - "syn 2.0.104", 4186 "tauri-codegen", 4187 "tauri-utils", 4188 ] 4189 4190 [[package]] 4191 name = "tauri-plugin" 4192 - version = "2.3.1" 4193 source = "registry+https://github.com/rust-lang/crates.io-index" 4194 - checksum = "5bd5c1e56990c70a906ef67a9851bbdba9136d26075ee9a2b19c8b46986b3e02" 4195 dependencies = [ 4196 "anyhow", 4197 "glob", ··· 4200 "serde", 4201 "serde_json", 4202 "tauri-utils", 4203 - "toml 0.8.23", 4204 "walkdir", 4205 ] 4206 4207 [[package]] 4208 name = "tauri-plugin-opener" 4209 - version = "2.4.0" 4210 source = "registry+https://github.com/rust-lang/crates.io-index" 4211 - checksum = "ecee219f11cdac713ab32959db5d0cceec4810ba4f4458da992292ecf9660321" 4212 dependencies = [ 4213 "dunce", 4214 "glob", 4215 "objc2-app-kit", 4216 - "objc2-foundation 0.3.1", 4217 "open", 4218 "schemars 0.8.22", 4219 "serde", 4220 "serde_json", 4221 "tauri", 4222 "tauri-plugin", 4223 - "thiserror 2.0.12", 4224 "url", 4225 "windows", 4226 "zbus", 4227 ] 4228 4229 [[package]] 4230 name = "tauri-runtime" 4231 - version = "2.7.1" 4232 source = "registry+https://github.com/rust-lang/crates.io-index" 4233 - checksum = "2b1cc885be806ea15ff7b0eb47098a7b16323d9228876afda329e34e2d6c4676" 4234 dependencies = [ 4235 "cookie", 4236 "dpi", 4237 "gtk", 4238 "http", 4239 "jni", 4240 - "objc2 0.6.1", 4241 "objc2-ui-kit", 4242 "raw-window-handle", 4243 "serde", 4244 "serde_json", 4245 "tauri-utils", 4246 - "thiserror 2.0.12", 4247 "url", 4248 "windows", 4249 ] 4250 4251 [[package]] 4252 name = "tauri-runtime-wry" 4253 - version = "2.7.2" 4254 source = "registry+https://github.com/rust-lang/crates.io-index" 4255 - checksum = "fe653a2fbbef19fe898efc774bc52c8742576342a33d3d028c189b57eb1d2439" 4256 dependencies = [ 4257 "gtk", 4258 "http", 4259 "jni", 4260 "log", 4261 - "objc2 0.6.1", 4262 "objc2-app-kit", 4263 - "objc2-foundation 0.3.1", 4264 "once_cell", 4265 "percent-encoding", 4266 "raw-window-handle", ··· 4277 4278 [[package]] 4279 name = "tauri-utils" 4280 - version = "2.6.0" 4281 source = "registry+https://github.com/rust-lang/crates.io-index" 4282 - checksum = "9330c15cabfe1d9f213478c9e8ec2b0c76dab26bb6f314b8ad1c8a568c1d186e" 4283 dependencies = [ 4284 "anyhow", 4285 "brotli", ··· 4305 "serde_json", 4306 "serde_with", 4307 "swift-rs", 4308 - "thiserror 2.0.12", 4309 - "toml 0.8.23", 4310 "url", 4311 "urlpattern", 4312 "uuid", ··· 4315 4316 [[package]] 4317 name = "tauri-winres" 4318 - version = "0.3.1" 4319 source = "registry+https://github.com/rust-lang/crates.io-index" 4320 - checksum = "e8d321dbc6f998d825ab3f0d62673e810c861aac2d0de2cc2c395328f1d113b4" 4321 dependencies = [ 4322 "embed-resource", 4323 - "indexmap 2.10.0", 4324 - "toml 0.8.23", 4325 ] 4326 4327 [[package]] 4328 name = "tempfile" 4329 - version = "3.20.0" 4330 source = "registry+https://github.com/rust-lang/crates.io-index" 4331 - checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" 4332 dependencies = [ 4333 "fastrand", 4334 - "getrandom 0.3.3", 4335 "once_cell", 4336 - "rustix", 4337 - "windows-sys 0.59.0", 4338 ] 4339 4340 [[package]] ··· 4359 4360 [[package]] 4361 name = "thiserror" 4362 - version = "2.0.12" 4363 source = "registry+https://github.com/rust-lang/crates.io-index" 4364 - checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 4365 dependencies = [ 4366 - "thiserror-impl 2.0.12", 4367 ] 4368 4369 [[package]] ··· 4374 dependencies = [ 4375 "proc-macro2", 4376 "quote", 4377 - "syn 2.0.104", 4378 ] 4379 4380 [[package]] 4381 name = "thiserror-impl" 4382 - version = "2.0.12" 4383 source = "registry+https://github.com/rust-lang/crates.io-index" 4384 - checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 4385 dependencies = [ 4386 "proc-macro2", 4387 "quote", 4388 - "syn 2.0.104", 4389 ] 4390 4391 [[package]] 4392 name = "time" 4393 - version = "0.3.41" 4394 source = "registry+https://github.com/rust-lang/crates.io-index" 4395 - checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" 4396 dependencies = [ 4397 "deranged", 4398 "itoa", ··· 4405 4406 [[package]] 4407 name = "time-core" 4408 - version = "0.1.4" 4409 source = "registry+https://github.com/rust-lang/crates.io-index" 4410 - checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" 4411 4412 [[package]] 4413 name = "time-macros" 4414 - version = "0.2.22" 4415 source = "registry+https://github.com/rust-lang/crates.io-index" 4416 - checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" 4417 dependencies = [ 4418 "num-conv", 4419 "time-core", ··· 4421 4422 [[package]] 4423 name = "tinystr" 4424 - version = "0.8.1" 4425 source = "registry+https://github.com/rust-lang/crates.io-index" 4426 - checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 4427 dependencies = [ 4428 "displaydoc", 4429 "zerovec", 4430 ] 4431 4432 [[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 name = "tokio" 4449 - version = "1.47.0" 4450 source = "registry+https://github.com/rust-lang/crates.io-index" 4451 - checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35" 4452 dependencies = [ 4453 - "backtrace", 4454 "bytes", 4455 - "io-uring", 4456 "libc", 4457 "mio", 4458 "pin-project-lite", 4459 - "slab", 4460 "socket2", 4461 "tokio-macros", 4462 - "windows-sys 0.59.0", 4463 ] 4464 4465 [[package]] 4466 name = "tokio-macros" 4467 - version = "2.5.0" 4468 source = "registry+https://github.com/rust-lang/crates.io-index" 4469 - checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 4470 dependencies = [ 4471 "proc-macro2", 4472 "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", 4485 ] 4486 4487 [[package]] 4488 name = "tokio-util" 4489 - version = "0.7.15" 4490 source = "registry+https://github.com/rust-lang/crates.io-index" 4491 - checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" 4492 dependencies = [ 4493 "bytes", 4494 "futures-core", ··· 4499 4500 [[package]] 4501 name = "toml" 4502 - version = "0.8.23" 4503 source = "registry+https://github.com/rust-lang/crates.io-index" 4504 - checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" 4505 dependencies = [ 4506 "serde", 4507 "serde_spanned 0.6.9", 4508 - "toml_datetime 0.6.11", 4509 - "toml_edit 0.22.27", 4510 ] 4511 4512 [[package]] 4513 name = "toml" 4514 - version = "0.9.3" 4515 source = "registry+https://github.com/rust-lang/crates.io-index" 4516 - checksum = "e06723639aaded957e5a80be250c1f82f274b9d23ebb4d94163668470623461c" 4517 dependencies = [ 4518 - "indexmap 2.10.0", 4519 - "serde", 4520 - "serde_spanned 1.0.0", 4521 - "toml_datetime 0.7.0", 4522 "toml_parser", 4523 "toml_writer", 4524 - "winnow 0.7.12", 4525 ] 4526 4527 [[package]] 4528 name = "toml_datetime" 4529 - version = "0.6.11" 4530 source = "registry+https://github.com/rust-lang/crates.io-index" 4531 - checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" 4532 dependencies = [ 4533 "serde", 4534 ] 4535 4536 [[package]] 4537 name = "toml_datetime" 4538 - version = "0.7.0" 4539 source = "registry+https://github.com/rust-lang/crates.io-index" 4540 - checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" 4541 dependencies = [ 4542 - "serde", 4543 ] 4544 4545 [[package]] ··· 4548 source = "registry+https://github.com/rust-lang/crates.io-index" 4549 checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" 4550 dependencies = [ 4551 - "indexmap 2.10.0", 4552 - "toml_datetime 0.6.11", 4553 "winnow 0.5.40", 4554 ] 4555 4556 [[package]] 4557 name = "toml_edit" 4558 - version = "0.20.7" 4559 source = "registry+https://github.com/rust-lang/crates.io-index" 4560 - checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" 4561 dependencies = [ 4562 - "indexmap 2.10.0", 4563 - "toml_datetime 0.6.11", 4564 "winnow 0.5.40", 4565 ] 4566 4567 [[package]] 4568 name = "toml_edit" 4569 - version = "0.22.27" 4570 source = "registry+https://github.com/rust-lang/crates.io-index" 4571 - checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" 4572 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", 4579 ] 4580 4581 [[package]] 4582 name = "toml_parser" 4583 - version = "1.0.1" 4584 source = "registry+https://github.com/rust-lang/crates.io-index" 4585 - checksum = "97200572db069e74c512a14117b296ba0a80a30123fbbb5aa1f4a348f639ca30" 4586 dependencies = [ 4587 - "winnow 0.7.12", 4588 ] 4589 4590 [[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 name = "toml_writer" 4598 - version = "1.0.2" 4599 source = "registry+https://github.com/rust-lang/crates.io-index" 4600 - checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" 4601 4602 [[package]] 4603 name = "tower" ··· 4620 source = "registry+https://github.com/rust-lang/crates.io-index" 4621 checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" 4622 dependencies = [ 4623 - "bitflags 2.9.1", 4624 "bytes", 4625 "futures-util", 4626 "http", ··· 4650 source = "registry+https://github.com/rust-lang/crates.io-index" 4651 checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 4652 dependencies = [ 4653 - "log", 4654 "pin-project-lite", 4655 "tracing-attributes", 4656 "tracing-core", ··· 4664 dependencies = [ 4665 "proc-macro2", 4666 "quote", 4667 - "syn 2.0.104", 4668 ] 4669 4670 [[package]] ··· 4678 4679 [[package]] 4680 name = "tray-icon" 4681 - version = "0.21.0" 4682 source = "registry+https://github.com/rust-lang/crates.io-index" 4683 - checksum = "2da75ec677957aa21f6e0b361df0daab972f13a5bee3606de0638fd4ee1c666a" 4684 dependencies = [ 4685 "crossbeam-channel", 4686 "dirs", 4687 "libappindicator", 4688 "muda", 4689 - "objc2 0.6.1", 4690 "objc2-app-kit", 4691 "objc2-core-foundation", 4692 "objc2-core-graphics", 4693 - "objc2-foundation 0.3.1", 4694 "once_cell", 4695 - "png", 4696 "serde", 4697 - "thiserror 2.0.12", 4698 - "windows-sys 0.59.0", 4699 ] 4700 4701 [[package]] ··· 4712 4713 [[package]] 4714 name = "typenum" 4715 - version = "1.18.0" 4716 source = "registry+https://github.com/rust-lang/crates.io-index" 4717 - checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 4718 4719 [[package]] 4720 name = "uds_windows" ··· 4767 dependencies = [ 4768 "unic-common", 4769 ] 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 4777 [[package]] 4778 name = "unicode-ident" 4779 - version = "1.0.18" 4780 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" 4797 4798 [[package]] 4799 name = "unicode-segmentation" ··· 4803 4804 [[package]] 4805 name = "url" 4806 - version = "2.5.4" 4807 source = "registry+https://github.com/rust-lang/crates.io-index" 4808 - checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 4809 dependencies = [ 4810 "form_urlencoded", 4811 "idna", ··· 4839 4840 [[package]] 4841 name = "uuid" 4842 - version = "1.17.0" 4843 source = "registry+https://github.com/rust-lang/crates.io-index" 4844 - checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" 4845 dependencies = [ 4846 - "getrandom 0.3.3", 4847 "js-sys", 4848 "serde", 4849 "wasm-bindgen", 4850 ] 4851 4852 [[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 name = "version-compare" 4860 - version = "0.2.0" 4861 source = "registry+https://github.com/rust-lang/crates.io-index" 4862 - checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" 4863 4864 [[package]] 4865 name = "version_check" ··· 4919 checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 4920 4921 [[package]] 4922 - name = "wasi" 4923 - version = "0.14.2+wasi-0.2.4" 4924 source = "registry+https://github.com/rust-lang/crates.io-index" 4925 - checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 4926 dependencies = [ 4927 - "wit-bindgen-rt", 4928 ] 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 4936 [[package]] 4937 name = "wasm-bindgen" 4938 - version = "0.2.100" 4939 source = "registry+https://github.com/rust-lang/crates.io-index" 4940 - checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 4941 dependencies = [ 4942 "cfg-if", 4943 "once_cell", 4944 "rustversion", 4945 "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 "wasm-bindgen-shared", 4960 ] 4961 4962 [[package]] 4963 name = "wasm-bindgen-futures" 4964 - version = "0.4.50" 4965 source = "registry+https://github.com/rust-lang/crates.io-index" 4966 - checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 4967 dependencies = [ 4968 "cfg-if", 4969 "js-sys", ··· 4974 4975 [[package]] 4976 name = "wasm-bindgen-macro" 4977 - version = "0.2.100" 4978 source = "registry+https://github.com/rust-lang/crates.io-index" 4979 - checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 4980 dependencies = [ 4981 "quote", 4982 "wasm-bindgen-macro-support", ··· 4984 4985 [[package]] 4986 name = "wasm-bindgen-macro-support" 4987 - version = "0.2.100" 4988 source = "registry+https://github.com/rust-lang/crates.io-index" 4989 - checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 4990 dependencies = [ 4991 "proc-macro2", 4992 "quote", 4993 - "syn 2.0.104", 4994 - "wasm-bindgen-backend", 4995 "wasm-bindgen-shared", 4996 ] 4997 4998 [[package]] 4999 name = "wasm-bindgen-shared" 5000 - version = "0.2.100" 5001 source = "registry+https://github.com/rust-lang/crates.io-index" 5002 - checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 5003 dependencies = [ 5004 "unicode-ident", 5005 ] ··· 5018 ] 5019 5020 [[package]] 5021 name = "web-sys" 5022 - version = "0.3.77" 5023 source = "registry+https://github.com/rust-lang/crates.io-index" 5024 - checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 5025 dependencies = [ 5026 "js-sys", 5027 "wasm-bindgen", ··· 5080 "webview2-com-macros", 5081 "webview2-com-sys", 5082 "windows", 5083 - "windows-core", 5084 "windows-implement", 5085 "windows-interface", 5086 ] ··· 5093 dependencies = [ 5094 "proc-macro2", 5095 "quote", 5096 - "syn 2.0.104", 5097 ] 5098 5099 [[package]] ··· 5102 source = "registry+https://github.com/rust-lang/crates.io-index" 5103 checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" 5104 dependencies = [ 5105 - "thiserror 2.0.12", 5106 "windows", 5107 - "windows-core", 5108 ] 5109 5110 [[package]] 5111 - name = "whoami" 5112 - version = "1.6.0" 5113 source = "registry+https://github.com/rust-lang/crates.io-index" 5114 - checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7" 5115 - dependencies = [ 5116 - "redox_syscall", 5117 - "wasite", 5118 - ] 5119 5120 [[package]] 5121 name = "winapi" ··· 5135 5136 [[package]] 5137 name = "winapi-util" 5138 - version = "0.1.9" 5139 source = "registry+https://github.com/rust-lang/crates.io-index" 5140 - checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 5141 dependencies = [ 5142 - "windows-sys 0.59.0", 5143 ] 5144 5145 [[package]] ··· 5154 source = "registry+https://github.com/rust-lang/crates.io-index" 5155 checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" 5156 dependencies = [ 5157 - "objc2 0.6.1", 5158 "objc2-app-kit", 5159 "objc2-core-foundation", 5160 - "objc2-foundation 0.3.1", 5161 "raw-window-handle", 5162 "windows-sys 0.59.0", 5163 "windows-version", ··· 5170 checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" 5171 dependencies = [ 5172 "windows-collections", 5173 - "windows-core", 5174 "windows-future", 5175 - "windows-link", 5176 "windows-numerics", 5177 ] 5178 ··· 5182 source = "registry+https://github.com/rust-lang/crates.io-index" 5183 checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" 5184 dependencies = [ 5185 - "windows-core", 5186 ] 5187 5188 [[package]] ··· 5193 dependencies = [ 5194 "windows-implement", 5195 "windows-interface", 5196 - "windows-link", 5197 - "windows-result", 5198 - "windows-strings", 5199 ] 5200 5201 [[package]] ··· 5204 source = "registry+https://github.com/rust-lang/crates.io-index" 5205 checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" 5206 dependencies = [ 5207 - "windows-core", 5208 - "windows-link", 5209 "windows-threading", 5210 ] 5211 5212 [[package]] 5213 name = "windows-implement" 5214 - version = "0.60.0" 5215 source = "registry+https://github.com/rust-lang/crates.io-index" 5216 - checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" 5217 dependencies = [ 5218 "proc-macro2", 5219 "quote", 5220 - "syn 2.0.104", 5221 ] 5222 5223 [[package]] 5224 name = "windows-interface" 5225 - version = "0.59.1" 5226 source = "registry+https://github.com/rust-lang/crates.io-index" 5227 - checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" 5228 dependencies = [ 5229 "proc-macro2", 5230 "quote", 5231 - "syn 2.0.104", 5232 ] 5233 5234 [[package]] ··· 5238 checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 5239 5240 [[package]] 5241 name = "windows-numerics" 5242 version = "0.2.0" 5243 source = "registry+https://github.com/rust-lang/crates.io-index" 5244 checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" 5245 dependencies = [ 5246 - "windows-core", 5247 - "windows-link", 5248 ] 5249 5250 [[package]] ··· 5253 source = "registry+https://github.com/rust-lang/crates.io-index" 5254 checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" 5255 dependencies = [ 5256 - "windows-link", 5257 ] 5258 5259 [[package]] ··· 5262 source = "registry+https://github.com/rust-lang/crates.io-index" 5263 checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" 5264 dependencies = [ 5265 - "windows-link", 5266 ] 5267 5268 [[package]] 5269 - name = "windows-sys" 5270 - version = "0.45.0" 5271 source = "registry+https://github.com/rust-lang/crates.io-index" 5272 - checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 5273 dependencies = [ 5274 - "windows-targets 0.42.2", 5275 ] 5276 5277 [[package]] 5278 name = "windows-sys" 5279 - version = "0.48.0" 5280 source = "registry+https://github.com/rust-lang/crates.io-index" 5281 - checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 5282 dependencies = [ 5283 - "windows-targets 0.48.5", 5284 ] 5285 5286 [[package]] ··· 5298 source = "registry+https://github.com/rust-lang/crates.io-index" 5299 checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 5300 dependencies = [ 5301 - "windows-targets 0.53.3", 5302 ] 5303 5304 [[package]] ··· 5318 5319 [[package]] 5320 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 version = "0.52.6" 5337 source = "registry+https://github.com/rust-lang/crates.io-index" 5338 checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" ··· 5349 5350 [[package]] 5351 name = "windows-targets" 5352 - version = "0.53.3" 5353 source = "registry+https://github.com/rust-lang/crates.io-index" 5354 - checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" 5355 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", 5365 ] 5366 5367 [[package]] ··· 5370 source = "registry+https://github.com/rust-lang/crates.io-index" 5371 checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" 5372 dependencies = [ 5373 - "windows-link", 5374 ] 5375 5376 [[package]] 5377 name = "windows-version" 5378 - version = "0.1.4" 5379 source = "registry+https://github.com/rust-lang/crates.io-index" 5380 - checksum = "e04a5c6627e310a23ad2358483286c7df260c964eb2d003d8efd6d0f4e79265c" 5381 dependencies = [ 5382 - "windows-link", 5383 ] 5384 5385 [[package]] ··· 5387 version = "0.42.2" 5388 source = "registry+https://github.com/rust-lang/crates.io-index" 5389 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 5397 [[package]] 5398 name = "windows_aarch64_gnullvm" ··· 5402 5403 [[package]] 5404 name = "windows_aarch64_gnullvm" 5405 - version = "0.53.0" 5406 source = "registry+https://github.com/rust-lang/crates.io-index" 5407 - checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 5408 5409 [[package]] 5410 name = "windows_aarch64_msvc" ··· 5414 5415 [[package]] 5416 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 version = "0.52.6" 5424 source = "registry+https://github.com/rust-lang/crates.io-index" 5425 checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 5426 5427 [[package]] 5428 name = "windows_aarch64_msvc" 5429 - version = "0.53.0" 5430 source = "registry+https://github.com/rust-lang/crates.io-index" 5431 - checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 5432 5433 [[package]] 5434 name = "windows_i686_gnu" ··· 5438 5439 [[package]] 5440 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 version = "0.52.6" 5448 source = "registry+https://github.com/rust-lang/crates.io-index" 5449 checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 5450 5451 [[package]] 5452 name = "windows_i686_gnu" 5453 - version = "0.53.0" 5454 source = "registry+https://github.com/rust-lang/crates.io-index" 5455 - checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 5456 5457 [[package]] 5458 name = "windows_i686_gnullvm" ··· 5462 5463 [[package]] 5464 name = "windows_i686_gnullvm" 5465 - version = "0.53.0" 5466 source = "registry+https://github.com/rust-lang/crates.io-index" 5467 - checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 5468 5469 [[package]] 5470 name = "windows_i686_msvc" ··· 5474 5475 [[package]] 5476 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 version = "0.52.6" 5484 source = "registry+https://github.com/rust-lang/crates.io-index" 5485 checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 5486 5487 [[package]] 5488 name = "windows_i686_msvc" 5489 - version = "0.53.0" 5490 source = "registry+https://github.com/rust-lang/crates.io-index" 5491 - checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 5492 5493 [[package]] 5494 name = "windows_x86_64_gnu" ··· 5498 5499 [[package]] 5500 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 version = "0.52.6" 5508 source = "registry+https://github.com/rust-lang/crates.io-index" 5509 checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 5510 5511 [[package]] 5512 name = "windows_x86_64_gnu" 5513 - version = "0.53.0" 5514 source = "registry+https://github.com/rust-lang/crates.io-index" 5515 - checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 5516 5517 [[package]] 5518 name = "windows_x86_64_gnullvm" ··· 5522 5523 [[package]] 5524 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 version = "0.52.6" 5532 source = "registry+https://github.com/rust-lang/crates.io-index" 5533 checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 5534 5535 [[package]] 5536 name = "windows_x86_64_gnullvm" 5537 - version = "0.53.0" 5538 source = "registry+https://github.com/rust-lang/crates.io-index" 5539 - checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 5540 5541 [[package]] 5542 name = "windows_x86_64_msvc" ··· 5546 5547 [[package]] 5548 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 version = "0.52.6" 5556 source = "registry+https://github.com/rust-lang/crates.io-index" 5557 checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 5558 5559 [[package]] 5560 name = "windows_x86_64_msvc" 5561 - version = "0.53.0" 5562 source = "registry+https://github.com/rust-lang/crates.io-index" 5563 - checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 5564 5565 [[package]] 5566 name = "winnow" ··· 5573 5574 [[package]] 5575 name = "winnow" 5576 - version = "0.7.12" 5577 source = "registry+https://github.com/rust-lang/crates.io-index" 5578 - checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" 5579 dependencies = [ 5580 "memchr", 5581 ] ··· 5591 ] 5592 5593 [[package]] 5594 - name = "wit-bindgen-rt" 5595 - version = "0.39.0" 5596 source = "registry+https://github.com/rust-lang/crates.io-index" 5597 - checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 5598 dependencies = [ 5599 - "bitflags 2.9.1", 5600 ] 5601 5602 [[package]] 5603 name = "writeable" 5604 - version = "0.6.1" 5605 source = "registry+https://github.com/rust-lang/crates.io-index" 5606 - checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 5607 5608 [[package]] 5609 name = "wry" 5610 - version = "0.52.1" 5611 source = "registry+https://github.com/rust-lang/crates.io-index" 5612 - checksum = "12a714d9ba7075aae04a6e50229d6109e3d584774b99a6a8c60de1698ca111b9" 5613 dependencies = [ 5614 "base64 0.22.1", 5615 - "block2 0.6.1", 5616 "cookie", 5617 "crossbeam-channel", 5618 "dpi", 5619 "dunce", 5620 "gdkx11", ··· 5626 "kuchikiki", 5627 "libc", 5628 "ndk", 5629 - "objc2 0.6.1", 5630 "objc2-app-kit", 5631 "objc2-core-foundation", 5632 - "objc2-foundation 0.3.1", 5633 "objc2-ui-kit", 5634 "objc2-web-kit", 5635 "once_cell", ··· 5638 "sha2", 5639 "soup3", 5640 "tao-macros", 5641 - "thiserror 2.0.12", 5642 "url", 5643 "webkit2gtk", 5644 "webkit2gtk-sys", 5645 "webview2-com", 5646 "windows", 5647 - "windows-core", 5648 "windows-version", 5649 "x11-dl", 5650 ] ··· 5671 ] 5672 5673 [[package]] 5674 name = "yoke" 5675 - version = "0.8.0" 5676 source = "registry+https://github.com/rust-lang/crates.io-index" 5677 - checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 5678 dependencies = [ 5679 - "serde", 5680 "stable_deref_trait", 5681 "yoke-derive", 5682 "zerofrom", ··· 5684 5685 [[package]] 5686 name = "yoke-derive" 5687 - version = "0.8.0" 5688 source = "registry+https://github.com/rust-lang/crates.io-index" 5689 - checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 5690 dependencies = [ 5691 "proc-macro2", 5692 "quote", 5693 - "syn 2.0.104", 5694 "synstructure", 5695 ] 5696 5697 [[package]] 5698 name = "zbus" 5699 - version = "5.9.0" 5700 source = "registry+https://github.com/rust-lang/crates.io-index" 5701 - checksum = "4bb4f9a464286d42851d18a605f7193b8febaf5b0919d71c6399b7b26e5b0aad" 5702 dependencies = [ 5703 "async-broadcast", 5704 "async-executor", ··· 5718 "ordered-stream", 5719 "serde", 5720 "serde_repr", 5721 "tracing", 5722 "uds_windows", 5723 - "windows-sys 0.59.0", 5724 - "winnow 0.7.12", 5725 "zbus_macros", 5726 "zbus_names", 5727 "zvariant", ··· 5729 5730 [[package]] 5731 name = "zbus_macros" 5732 - version = "5.9.0" 5733 source = "registry+https://github.com/rust-lang/crates.io-index" 5734 - checksum = "ef9859f68ee0c4ee2e8cde84737c78e3f4c54f946f2a38645d0d4c7a95327659" 5735 dependencies = [ 5736 - "proc-macro-crate 3.3.0", 5737 "proc-macro2", 5738 "quote", 5739 - "syn 2.0.104", 5740 "zbus_names", 5741 "zvariant", 5742 "zvariant_utils", ··· 5750 dependencies = [ 5751 "serde", 5752 "static_assertions", 5753 - "winnow 0.7.12", 5754 "zvariant", 5755 ] 5756 5757 [[package]] 5758 name = "zerocopy" 5759 - version = "0.8.26" 5760 source = "registry+https://github.com/rust-lang/crates.io-index" 5761 - checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" 5762 dependencies = [ 5763 "zerocopy-derive", 5764 ] 5765 5766 [[package]] 5767 name = "zerocopy-derive" 5768 - version = "0.8.26" 5769 source = "registry+https://github.com/rust-lang/crates.io-index" 5770 - checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" 5771 dependencies = [ 5772 "proc-macro2", 5773 "quote", 5774 - "syn 2.0.104", 5775 ] 5776 5777 [[package]] ··· 5791 dependencies = [ 5792 "proc-macro2", 5793 "quote", 5794 - "syn 2.0.104", 5795 "synstructure", 5796 ] 5797 5798 [[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 name = "zerotrie" 5806 - version = "0.2.2" 5807 source = "registry+https://github.com/rust-lang/crates.io-index" 5808 - checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 5809 dependencies = [ 5810 "displaydoc", 5811 "yoke", ··· 5814 5815 [[package]] 5816 name = "zerovec" 5817 - version = "0.11.2" 5818 source = "registry+https://github.com/rust-lang/crates.io-index" 5819 - checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" 5820 dependencies = [ 5821 "yoke", 5822 "zerofrom", ··· 5825 5826 [[package]] 5827 name = "zerovec-derive" 5828 - version = "0.11.1" 5829 source = "registry+https://github.com/rust-lang/crates.io-index" 5830 - checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 5831 dependencies = [ 5832 "proc-macro2", 5833 "quote", 5834 - "syn 2.0.104", 5835 ] 5836 5837 [[package]] 5838 name = "zvariant" 5839 - version = "5.6.0" 5840 source = "registry+https://github.com/rust-lang/crates.io-index" 5841 - checksum = "d91b3680bb339216abd84714172b5138a4edac677e641ef17e1d8cb1b3ca6e6f" 5842 dependencies = [ 5843 "endi", 5844 "enumflags2", 5845 "serde", 5846 - "winnow 0.7.12", 5847 "zvariant_derive", 5848 "zvariant_utils", 5849 ] 5850 5851 [[package]] 5852 name = "zvariant_derive" 5853 - version = "5.6.0" 5854 source = "registry+https://github.com/rust-lang/crates.io-index" 5855 - checksum = "3a8c68501be459a8dbfffbe5d792acdd23b4959940fc87785fb013b32edbc208" 5856 dependencies = [ 5857 - "proc-macro-crate 3.3.0", 5858 "proc-macro2", 5859 "quote", 5860 - "syn 2.0.104", 5861 "zvariant_utils", 5862 ] 5863 5864 [[package]] 5865 name = "zvariant_utils" 5866 - version = "3.2.0" 5867 source = "registry+https://github.com/rust-lang/crates.io-index" 5868 - checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" 5869 dependencies = [ 5870 "proc-macro2", 5871 "quote", 5872 "serde", 5873 - "static_assertions", 5874 - "syn 2.0.104", 5875 - "winnow 0.7.12", 5876 ]
··· 6 name = "VRCMacros" 7 version = "0.1.0" 8 dependencies = [ 9 + "anyhow", 10 + "chrono", 11 + "crossbeam-channel", 12 "dirs", 13 + "enigo", 14 + "flate2", 15 "serde", 16 "serde_json", 17 "tauri", 18 "tauri-build", 19 + "tauri-plugin-clipboard-manager", 20 + "tauri-plugin-dialog", 21 "tauri-plugin-opener", 22 + "tauri-plugin-os", 23 "tokio", 24 ] 25 26 [[package]] 27 name = "adler2" 28 version = "2.0.1" 29 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 31 32 [[package]] 33 name = "aho-corasick" 34 + version = "1.1.4" 35 source = "registry+https://github.com/rust-lang/crates.io-index" 36 + checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" 37 dependencies = [ 38 "memchr", 39 ] ··· 54 ] 55 56 [[package]] 57 + name = "android_system_properties" 58 + version = "0.1.5" 59 source = "registry+https://github.com/rust-lang/crates.io-index" 60 + checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 61 + dependencies = [ 62 + "libc", 63 + ] 64 65 [[package]] 66 + name = "anyhow" 67 + version = "1.0.100" 68 source = "registry+https://github.com/rust-lang/crates.io-index" 69 + checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" 70 71 [[package]] 72 + name = "arboard" 73 + version = "3.6.1" 74 source = "registry+https://github.com/rust-lang/crates.io-index" 75 + checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf" 76 dependencies = [ 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", 90 ] 91 92 [[package]] 93 + name = "ashpd" 94 + version = "0.11.0" 95 source = "registry+https://github.com/rust-lang/crates.io-index" 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 + ] 112 113 [[package]] 114 name = "async-broadcast" ··· 136 137 [[package]] 138 name = "async-executor" 139 + version = "1.13.3" 140 source = "registry+https://github.com/rust-lang/crates.io-index" 141 + checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" 142 dependencies = [ 143 "async-task", 144 "concurrent-queue", ··· 150 151 [[package]] 152 name = "async-io" 153 + version = "2.6.0" 154 source = "registry+https://github.com/rust-lang/crates.io-index" 155 + checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" 156 dependencies = [ 157 + "autocfg", 158 "cfg-if", 159 "concurrent-queue", 160 "futures-io", 161 "futures-lite", 162 "parking", 163 "polling", 164 + "rustix 1.1.2", 165 "slab", 166 + "windows-sys 0.61.2", 167 ] 168 169 [[package]] 170 name = "async-lock" 171 + version = "3.4.1" 172 source = "registry+https://github.com/rust-lang/crates.io-index" 173 + checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" 174 dependencies = [ 175 "event-listener", 176 "event-listener-strategy", ··· 179 180 [[package]] 181 name = "async-process" 182 + version = "2.5.0" 183 source = "registry+https://github.com/rust-lang/crates.io-index" 184 + checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" 185 dependencies = [ 186 "async-channel", 187 "async-io", ··· 192 "cfg-if", 193 "event-listener", 194 "futures-lite", 195 + "rustix 1.1.2", 196 ] 197 198 [[package]] ··· 203 dependencies = [ 204 "proc-macro2", 205 "quote", 206 + "syn 2.0.109", 207 ] 208 209 [[package]] 210 name = "async-signal" 211 + version = "0.2.13" 212 source = "registry+https://github.com/rust-lang/crates.io-index" 213 + checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" 214 dependencies = [ 215 "async-io", 216 "async-lock", ··· 218 "cfg-if", 219 "futures-core", 220 "futures-io", 221 + "rustix 1.1.2", 222 "signal-hook-registry", 223 "slab", 224 + "windows-sys 0.61.2", 225 ] 226 227 [[package]] ··· 232 233 [[package]] 234 name = "async-trait" 235 + version = "0.1.89" 236 source = "registry+https://github.com/rust-lang/crates.io-index" 237 + checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" 238 dependencies = [ 239 "proc-macro2", 240 "quote", 241 + "syn 2.0.109", 242 ] 243 244 [[package]] ··· 265 ] 266 267 [[package]] 268 name = "atomic-waker" 269 version = "1.1.2" 270 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 277 checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 278 279 [[package]] 280 name = "base64" 281 version = "0.21.7" 282 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 289 checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 290 291 [[package]] 292 name = "bitflags" 293 version = "1.3.2" 294 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 296 297 [[package]] 298 name = "bitflags" 299 + version = "2.10.0" 300 source = "registry+https://github.com/rust-lang/crates.io-index" 301 + checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" 302 dependencies = [ 303 + "serde_core", 304 ] 305 306 [[package]] ··· 323 324 [[package]] 325 name = "block2" 326 + version = "0.6.2" 327 source = "registry+https://github.com/rust-lang/crates.io-index" 328 + checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" 329 dependencies = [ 330 + "objc2 0.6.3", 331 ] 332 333 [[package]] ··· 345 346 [[package]] 347 name = "brotli" 348 + version = "8.0.2" 349 source = "registry+https://github.com/rust-lang/crates.io-index" 350 + checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" 351 dependencies = [ 352 "alloc-no-stdlib", 353 "alloc-stdlib", ··· 372 373 [[package]] 374 name = "bytemuck" 375 + version = "1.24.0" 376 source = "registry+https://github.com/rust-lang/crates.io-index" 377 + checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" 378 379 [[package]] 380 name = "byteorder" ··· 383 checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 384 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]] 392 name = "bytes" 393 version = "1.10.1" 394 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 403 source = "registry+https://github.com/rust-lang/crates.io-index" 404 checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" 405 dependencies = [ 406 + "bitflags 2.10.0", 407 "cairo-sys-rs", 408 "glib", 409 "libc", ··· 424 425 [[package]] 426 name = "camino" 427 + version = "1.2.1" 428 source = "registry+https://github.com/rust-lang/crates.io-index" 429 + checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" 430 dependencies = [ 431 + "serde_core", 432 ] 433 434 [[package]] ··· 451 "semver", 452 "serde", 453 "serde_json", 454 + "thiserror 2.0.17", 455 ] 456 457 [[package]] ··· 461 checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" 462 dependencies = [ 463 "serde", 464 + "toml 0.9.8", 465 ] 466 467 [[package]] 468 name = "cc" 469 + version = "1.2.45" 470 source = "registry+https://github.com/rust-lang/crates.io-index" 471 + checksum = "35900b6c8d709fb1d854671ae27aeaa9eec2f8b01b364e1619a40da3e6fe2afe" 472 dependencies = [ 473 + "find-msvc-tools", 474 "shlex", 475 ] 476 ··· 503 504 [[package]] 505 name = "cfg-if" 506 + version = "1.0.4" 507 source = "registry+https://github.com/rust-lang/crates.io-index" 508 + checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" 509 510 [[package]] 511 name = "cfg_aliases" ··· 515 516 [[package]] 517 name = "chrono" 518 + version = "0.4.42" 519 source = "registry+https://github.com/rust-lang/crates.io-index" 520 + checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" 521 dependencies = [ 522 "iana-time-zone", 523 + "js-sys", 524 "num-traits", 525 "serde", 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", 537 ] 538 539 [[package]] ··· 554 dependencies = [ 555 "crossbeam-utils", 556 ] 557 558 [[package]] 559 name = "convert_case" ··· 593 source = "registry+https://github.com/rust-lang/crates.io-index" 594 checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" 595 dependencies = [ 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", 610 "core-foundation", 611 "core-graphics-types", 612 "foreign-types", ··· 619 source = "registry+https://github.com/rust-lang/crates.io-index" 620 checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" 621 dependencies = [ 622 + "bitflags 2.10.0", 623 "core-foundation", 624 "libc", 625 ] ··· 634 ] 635 636 [[package]] 637 name = "crc32fast" 638 version = "1.5.0" 639 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 652 ] 653 654 [[package]] 655 name = "crossbeam-utils" 656 version = "0.8.21" 657 source = "registry+https://github.com/rust-lang/crates.io-index" 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" 665 666 [[package]] 667 name = "crypto-common" ··· 697 checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" 698 dependencies = [ 699 "quote", 700 + "syn 2.0.109", 701 ] 702 703 [[package]] ··· 707 checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" 708 dependencies = [ 709 "quote", 710 + "syn 2.0.109", 711 ] 712 713 [[package]] 714 name = "darling" 715 + version = "0.21.3" 716 source = "registry+https://github.com/rust-lang/crates.io-index" 717 + checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" 718 dependencies = [ 719 "darling_core", 720 "darling_macro", ··· 722 723 [[package]] 724 name = "darling_core" 725 + version = "0.21.3" 726 source = "registry+https://github.com/rust-lang/crates.io-index" 727 + checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" 728 dependencies = [ 729 "fnv", 730 "ident_case", 731 "proc-macro2", 732 "quote", 733 "strsim", 734 + "syn 2.0.109", 735 ] 736 737 [[package]] 738 name = "darling_macro" 739 + version = "0.21.3" 740 source = "registry+https://github.com/rust-lang/crates.io-index" 741 + checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" 742 dependencies = [ 743 "darling_core", 744 "quote", 745 + "syn 2.0.109", 746 ] 747 748 [[package]] 749 name = "deranged" 750 + version = "0.5.5" 751 source = "registry+https://github.com/rust-lang/crates.io-index" 752 + checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" 753 dependencies = [ 754 "powerfmt", 755 + "serde_core", 756 ] 757 758 [[package]] ··· 765 "proc-macro2", 766 "quote", 767 "rustc_version", 768 + "syn 2.0.109", 769 ] 770 771 [[package]] ··· 775 checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 776 dependencies = [ 777 "block-buffer", 778 "crypto-common", 779 ] 780 781 [[package]] ··· 796 "libc", 797 "option-ext", 798 "redox_users", 799 + "windows-sys 0.61.2", 800 ] 801 802 [[package]] ··· 811 source = "registry+https://github.com/rust-lang/crates.io-index" 812 checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" 813 dependencies = [ 814 + "bitflags 2.10.0", 815 + "block2 0.6.2", 816 + "libc", 817 + "objc2 0.6.3", 818 ] 819 820 [[package]] ··· 825 dependencies = [ 826 "proc-macro2", 827 "quote", 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", 838 ] 839 840 [[package]] 841 name = "dlopen2" 842 + version = "0.8.0" 843 source = "registry+https://github.com/rust-lang/crates.io-index" 844 + checksum = "b54f373ccf864bf587a89e880fb7610f8d73f3045f13580948ccbcaff26febff" 845 dependencies = [ 846 "dlopen2_derive", 847 "libc", ··· 857 dependencies = [ 858 "proc-macro2", 859 "quote", 860 + "syn 2.0.109", 861 ] 862 863 [[package]] 864 + name = "downcast-rs" 865 + version = "1.2.1" 866 source = "registry+https://github.com/rust-lang/crates.io-index" 867 + checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" 868 869 [[package]] 870 name = "dpi" ··· 903 checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" 904 905 [[package]] 906 name = "embed-resource" 907 + version = "3.0.6" 908 source = "registry+https://github.com/rust-lang/crates.io-index" 909 + checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" 910 dependencies = [ 911 "cc", 912 "memchr", 913 "rustc_version", 914 + "toml 0.9.8", 915 "vswhom", 916 "winreg", 917 ] ··· 929 checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" 930 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]] 953 name = "enumflags2" 954 version = "0.7.12" 955 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 967 dependencies = [ 968 "proc-macro2", 969 "quote", 970 + "syn 2.0.109", 971 ] 972 973 [[package]] ··· 978 979 [[package]] 980 name = "erased-serde" 981 + version = "0.4.9" 982 source = "registry+https://github.com/rust-lang/crates.io-index" 983 + checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" 984 dependencies = [ 985 "serde", 986 + "serde_core", 987 "typeid", 988 ] 989 990 [[package]] 991 name = "errno" 992 + version = "0.3.14" 993 source = "registry+https://github.com/rust-lang/crates.io-index" 994 + checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" 995 dependencies = [ 996 "libc", 997 + "windows-sys 0.61.2", 998 ] 999 1000 [[package]] 1001 + name = "error-code" 1002 + version = "3.3.2" 1003 source = "registry+https://github.com/rust-lang/crates.io-index" 1004 + checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" 1005 1006 [[package]] 1007 name = "event-listener" 1008 + version = "5.4.1" 1009 source = "registry+https://github.com/rust-lang/crates.io-index" 1010 + checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" 1011 dependencies = [ 1012 "concurrent-queue", 1013 "parking", ··· 1031 checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 1032 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]] 1054 name = "fdeflate" 1055 version = "0.3.7" 1056 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1070 ] 1071 1072 [[package]] 1073 + name = "find-msvc-tools" 1074 + version = "0.1.4" 1075 source = "registry+https://github.com/rust-lang/crates.io-index" 1076 + checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" 1077 1078 [[package]] 1079 + name = "fixedbitset" 1080 + version = "0.5.7" 1081 source = "registry+https://github.com/rust-lang/crates.io-index" 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" 1089 dependencies = [ 1090 + "crc32fast", 1091 + "miniz_oxide", 1092 ] 1093 1094 [[package]] ··· 1121 dependencies = [ 1122 "proc-macro2", 1123 "quote", 1124 + "syn 2.0.109", 1125 ] 1126 1127 [[package]] ··· 1132 1133 [[package]] 1134 name = "form_urlencoded" 1135 + version = "1.2.2" 1136 source = "registry+https://github.com/rust-lang/crates.io-index" 1137 + checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 1138 dependencies = [ 1139 "percent-encoding", 1140 ] ··· 1156 checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 1157 dependencies = [ 1158 "futures-core", 1159 ] 1160 1161 [[package]] ··· 1176 ] 1177 1178 [[package]] 1179 name = "futures-io" 1180 version = "0.3.31" 1181 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1183 1184 [[package]] 1185 name = "futures-lite" 1186 + version = "2.6.1" 1187 source = "registry+https://github.com/rust-lang/crates.io-index" 1188 + checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" 1189 dependencies = [ 1190 "fastrand", 1191 "futures-core", ··· 1202 dependencies = [ 1203 "proc-macro2", 1204 "quote", 1205 + "syn 2.0.109", 1206 ] 1207 1208 [[package]] ··· 1344 1345 [[package]] 1346 name = "generic-array" 1347 + version = "0.14.9" 1348 source = "registry+https://github.com/rust-lang/crates.io-index" 1349 + checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" 1350 dependencies = [ 1351 "typenum", 1352 "version_check", 1353 ] 1354 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]] 1366 name = "getrandom" 1367 version = "0.1.16" 1368 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1386 1387 [[package]] 1388 name = "getrandom" 1389 + version = "0.3.4" 1390 source = "registry+https://github.com/rust-lang/crates.io-index" 1391 + checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" 1392 dependencies = [ 1393 "cfg-if", 1394 "libc", 1395 "r-efi", 1396 + "wasip2", 1397 ] 1398 1399 [[package]] 1400 name = "gio" 1401 version = "0.18.4" 1402 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1434 source = "registry+https://github.com/rust-lang/crates.io-index" 1435 checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" 1436 dependencies = [ 1437 + "bitflags 2.10.0", 1438 "futures-channel", 1439 "futures-core", 1440 "futures-executor", ··· 1458 checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" 1459 dependencies = [ 1460 "heck 0.4.1", 1461 + "proc-macro-crate 2.0.2", 1462 "proc-macro-error", 1463 "proc-macro2", 1464 "quote", 1465 + "syn 2.0.109", 1466 ] 1467 1468 [[package]] ··· 1477 1478 [[package]] 1479 name = "glob" 1480 + version = "0.3.3" 1481 source = "registry+https://github.com/rust-lang/crates.io-index" 1482 + checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" 1483 1484 [[package]] 1485 name = "gobject-sys" ··· 1541 "proc-macro-error", 1542 "proc-macro2", 1543 "quote", 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", 1556 ] 1557 1558 [[package]] ··· 1563 1564 [[package]] 1565 name = "hashbrown" 1566 + version = "0.15.5" 1567 source = "registry+https://github.com/rust-lang/crates.io-index" 1568 + checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 1569 dependencies = [ 1570 "foldhash", 1571 ] 1572 1573 [[package]] 1574 + name = "hashbrown" 1575 + version = "0.16.0" 1576 source = "registry+https://github.com/rust-lang/crates.io-index" 1577 + checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" 1578 1579 [[package]] 1580 name = "heck" ··· 1601 checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 1602 1603 [[package]] 1604 name = "html5ever" 1605 version = "0.29.1" 1606 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1654 1655 [[package]] 1656 name = "hyper" 1657 + version = "1.7.0" 1658 source = "registry+https://github.com/rust-lang/crates.io-index" 1659 + checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" 1660 dependencies = [ 1661 + "atomic-waker", 1662 "bytes", 1663 "futures-channel", 1664 + "futures-core", 1665 "http", 1666 "http-body", 1667 "httparse", 1668 "itoa", 1669 "pin-project-lite", 1670 + "pin-utils", 1671 "smallvec", 1672 "tokio", 1673 "want", ··· 1675 1676 [[package]] 1677 name = "hyper-util" 1678 + version = "0.1.17" 1679 source = "registry+https://github.com/rust-lang/crates.io-index" 1680 + checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" 1681 dependencies = [ 1682 "base64 0.22.1", 1683 "bytes", ··· 1699 1700 [[package]] 1701 name = "iana-time-zone" 1702 + version = "0.1.64" 1703 source = "registry+https://github.com/rust-lang/crates.io-index" 1704 + checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" 1705 dependencies = [ 1706 "android_system_properties", 1707 "core-foundation-sys", ··· 1709 "js-sys", 1710 "log", 1711 "wasm-bindgen", 1712 + "windows-core 0.62.2", 1713 ] 1714 1715 [[package]] ··· 1728 checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" 1729 dependencies = [ 1730 "byteorder", 1731 + "png 0.17.16", 1732 ] 1733 1734 [[package]] 1735 name = "icu_collections" 1736 + version = "2.1.1" 1737 source = "registry+https://github.com/rust-lang/crates.io-index" 1738 + checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" 1739 dependencies = [ 1740 "displaydoc", 1741 "potential_utf", ··· 1746 1747 [[package]] 1748 name = "icu_locale_core" 1749 + version = "2.1.1" 1750 source = "registry+https://github.com/rust-lang/crates.io-index" 1751 + checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" 1752 dependencies = [ 1753 "displaydoc", 1754 "litemap", ··· 1759 1760 [[package]] 1761 name = "icu_normalizer" 1762 + version = "2.1.1" 1763 source = "registry+https://github.com/rust-lang/crates.io-index" 1764 + checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" 1765 dependencies = [ 1766 "icu_collections", 1767 "icu_normalizer_data", 1768 "icu_properties", ··· 1773 1774 [[package]] 1775 name = "icu_normalizer_data" 1776 + version = "2.1.1" 1777 source = "registry+https://github.com/rust-lang/crates.io-index" 1778 + checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" 1779 1780 [[package]] 1781 name = "icu_properties" 1782 + version = "2.1.1" 1783 source = "registry+https://github.com/rust-lang/crates.io-index" 1784 + checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" 1785 dependencies = [ 1786 "icu_collections", 1787 "icu_locale_core", 1788 "icu_properties_data", 1789 "icu_provider", 1790 "zerotrie", 1791 "zerovec", 1792 ] 1793 1794 [[package]] 1795 name = "icu_properties_data" 1796 + version = "2.1.1" 1797 source = "registry+https://github.com/rust-lang/crates.io-index" 1798 + checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" 1799 1800 [[package]] 1801 name = "icu_provider" 1802 + version = "2.1.1" 1803 source = "registry+https://github.com/rust-lang/crates.io-index" 1804 + checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" 1805 dependencies = [ 1806 "displaydoc", 1807 "icu_locale_core", 1808 "writeable", 1809 "yoke", 1810 "zerofrom", ··· 1820 1821 [[package]] 1822 name = "idna" 1823 + version = "1.1.0" 1824 source = "registry+https://github.com/rust-lang/crates.io-index" 1825 + checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 1826 dependencies = [ 1827 "idna_adapter", 1828 "smallvec", ··· 1840 ] 1841 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]] 1857 name = "indexmap" 1858 version = "1.9.3" 1859 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1866 1867 [[package]] 1868 name = "indexmap" 1869 + version = "2.12.0" 1870 source = "registry+https://github.com/rust-lang/crates.io-index" 1871 + checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" 1872 dependencies = [ 1873 "equivalent", 1874 + "hashbrown 0.16.0", 1875 "serde", 1876 + "serde_core", 1877 ] 1878 1879 [[package]] ··· 1886 ] 1887 1888 [[package]] 1889 name = "ipnet" 1890 version = "2.11.0" 1891 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1893 1894 [[package]] 1895 name = "iri-string" 1896 + version = "0.7.9" 1897 source = "registry+https://github.com/rust-lang/crates.io-index" 1898 + checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" 1899 dependencies = [ 1900 "memchr", 1901 "serde", ··· 1973 1974 [[package]] 1975 name = "js-sys" 1976 + version = "0.3.82" 1977 source = "registry+https://github.com/rust-lang/crates.io-index" 1978 + checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" 1979 dependencies = [ 1980 "once_cell", 1981 "wasm-bindgen", ··· 2009 source = "registry+https://github.com/rust-lang/crates.io-index" 2010 checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" 2011 dependencies = [ 2012 + "bitflags 2.10.0", 2013 "serde", 2014 "unicode-segmentation", 2015 ] ··· 2022 dependencies = [ 2023 "cssparser", 2024 "html5ever", 2025 + "indexmap 2.12.0", 2026 "selectors", 2027 ] 2028 ··· 2031 version = "1.5.0" 2032 source = "registry+https://github.com/rust-lang/crates.io-index" 2033 checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 2034 2035 [[package]] 2036 name = "libappindicator" ··· 2052 checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" 2053 dependencies = [ 2054 "gtk-sys", 2055 + "libloading 0.7.4", 2056 "once_cell", 2057 ] 2058 2059 [[package]] 2060 name = "libc" 2061 + version = "0.2.177" 2062 source = "registry+https://github.com/rust-lang/crates.io-index" 2063 + checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" 2064 2065 [[package]] 2066 name = "libloading" ··· 2073 ] 2074 2075 [[package]] 2076 + name = "libloading" 2077 + version = "0.8.9" 2078 source = "registry+https://github.com/rust-lang/crates.io-index" 2079 + checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" 2080 + dependencies = [ 2081 + "cfg-if", 2082 + "windows-link 0.2.1", 2083 + ] 2084 2085 [[package]] 2086 name = "libredox" 2087 + version = "0.1.10" 2088 source = "registry+https://github.com/rust-lang/crates.io-index" 2089 + checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" 2090 dependencies = [ 2091 + "bitflags 2.10.0", 2092 "libc", 2093 ] 2094 2095 [[package]] 2096 + name = "linux-raw-sys" 2097 + version = "0.4.15" 2098 source = "registry+https://github.com/rust-lang/crates.io-index" 2099 + checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 2100 2101 [[package]] 2102 name = "linux-raw-sys" 2103 + version = "0.11.0" 2104 source = "registry+https://github.com/rust-lang/crates.io-index" 2105 + checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" 2106 2107 [[package]] 2108 name = "litemap" 2109 + version = "0.8.1" 2110 source = "registry+https://github.com/rust-lang/crates.io-index" 2111 + checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" 2112 2113 [[package]] 2114 name = "lock_api" 2115 + version = "0.4.14" 2116 source = "registry+https://github.com/rust-lang/crates.io-index" 2117 + checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" 2118 dependencies = [ 2119 "scopeguard", 2120 ] 2121 2122 [[package]] 2123 name = "log" 2124 + version = "0.4.28" 2125 source = "registry+https://github.com/rust-lang/crates.io-index" 2126 + checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" 2127 2128 [[package]] 2129 name = "mac" ··· 2153 dependencies = [ 2154 "proc-macro2", 2155 "quote", 2156 + "syn 2.0.109", 2157 ] 2158 2159 [[package]] ··· 2163 checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" 2164 2165 [[package]] 2166 + name = "memchr" 2167 + version = "2.7.6" 2168 source = "registry+https://github.com/rust-lang/crates.io-index" 2169 + checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" 2170 2171 [[package]] 2172 + name = "memmap2" 2173 + version = "0.9.9" 2174 source = "registry+https://github.com/rust-lang/crates.io-index" 2175 + checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" 2176 + dependencies = [ 2177 + "libc", 2178 + ] 2179 2180 [[package]] 2181 name = "memoffset" ··· 2191 version = "0.3.17" 2192 source = "registry+https://github.com/rust-lang/crates.io-index" 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" 2200 2201 [[package]] 2202 name = "miniz_oxide" ··· 2210 2211 [[package]] 2212 name = "mio" 2213 + version = "1.1.0" 2214 source = "registry+https://github.com/rust-lang/crates.io-index" 2215 + checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" 2216 dependencies = [ 2217 "libc", 2218 "wasi 0.11.1+wasi-snapshot-preview1", 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", 2230 ] 2231 2232 [[package]] 2233 name = "muda" 2234 + version = "0.17.1" 2235 source = "registry+https://github.com/rust-lang/crates.io-index" 2236 + checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" 2237 dependencies = [ 2238 "crossbeam-channel", 2239 "dpi", 2240 "gtk", 2241 "keyboard-types", 2242 + "objc2 0.6.3", 2243 "objc2-app-kit", 2244 "objc2-core-foundation", 2245 + "objc2-foundation 0.3.2", 2246 "once_cell", 2247 + "png 0.17.16", 2248 "serde", 2249 + "thiserror 2.0.17", 2250 + "windows-sys 0.60.2", 2251 ] 2252 2253 [[package]] ··· 2256 source = "registry+https://github.com/rust-lang/crates.io-index" 2257 checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" 2258 dependencies = [ 2259 + "bitflags 2.10.0", 2260 "jni-sys", 2261 "log", 2262 "ndk-sys", ··· 2292 source = "registry+https://github.com/rust-lang/crates.io-index" 2293 checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" 2294 dependencies = [ 2295 + "bitflags 2.10.0", 2296 "cfg-if", 2297 "cfg_aliases", 2298 "libc", ··· 2306 checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" 2307 2308 [[package]] 2309 + name = "nom" 2310 + version = "7.1.3" 2311 source = "registry+https://github.com/rust-lang/crates.io-index" 2312 + checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 2313 dependencies = [ 2314 + "memchr", 2315 + "minimal-lexical", 2316 ] 2317 2318 [[package]] 2319 + name = "nom" 2320 + version = "8.0.0" 2321 source = "registry+https://github.com/rust-lang/crates.io-index" 2322 + checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" 2323 dependencies = [ 2324 + "memchr", 2325 ] 2326 2327 [[package]] 2328 + name = "num-conv" 2329 + version = "0.1.0" 2330 source = "registry+https://github.com/rust-lang/crates.io-index" 2331 + checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 2332 2333 [[package]] 2334 name = "num-traits" ··· 2337 checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 2338 dependencies = [ 2339 "autocfg", 2340 ] 2341 2342 [[package]] 2343 name = "num_enum" 2344 + version = "0.7.5" 2345 source = "registry+https://github.com/rust-lang/crates.io-index" 2346 + checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" 2347 dependencies = [ 2348 "num_enum_derive", 2349 "rustversion", ··· 2351 2352 [[package]] 2353 name = "num_enum_derive" 2354 + version = "0.7.5" 2355 source = "registry+https://github.com/rust-lang/crates.io-index" 2356 + checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" 2357 dependencies = [ 2358 + "proc-macro-crate 3.4.0", 2359 "proc-macro2", 2360 "quote", 2361 + "syn 2.0.109", 2362 ] 2363 2364 [[package]] ··· 2379 2380 [[package]] 2381 name = "objc2" 2382 + version = "0.6.3" 2383 source = "registry+https://github.com/rust-lang/crates.io-index" 2384 + checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" 2385 dependencies = [ 2386 "objc2-encode", 2387 "objc2-exception-helper", ··· 2389 2390 [[package]] 2391 name = "objc2-app-kit" 2392 + version = "0.3.2" 2393 source = "registry+https://github.com/rust-lang/crates.io-index" 2394 + checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" 2395 dependencies = [ 2396 + "bitflags 2.10.0", 2397 + "block2 0.6.2", 2398 "libc", 2399 + "objc2 0.6.3", 2400 "objc2-cloud-kit", 2401 "objc2-core-data", 2402 "objc2-core-foundation", 2403 "objc2-core-graphics", 2404 "objc2-core-image", 2405 + "objc2-core-text", 2406 + "objc2-core-video", 2407 + "objc2-foundation 0.3.2", 2408 + "objc2-quartz-core 0.3.2", 2409 ] 2410 2411 [[package]] 2412 name = "objc2-cloud-kit" 2413 + version = "0.3.2" 2414 source = "registry+https://github.com/rust-lang/crates.io-index" 2415 + checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" 2416 dependencies = [ 2417 + "bitflags 2.10.0", 2418 + "objc2 0.6.3", 2419 + "objc2-foundation 0.3.2", 2420 ] 2421 2422 [[package]] 2423 name = "objc2-core-data" 2424 + version = "0.3.2" 2425 source = "registry+https://github.com/rust-lang/crates.io-index" 2426 + checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" 2427 dependencies = [ 2428 + "bitflags 2.10.0", 2429 + "objc2 0.6.3", 2430 + "objc2-foundation 0.3.2", 2431 ] 2432 2433 [[package]] 2434 name = "objc2-core-foundation" 2435 + version = "0.3.2" 2436 source = "registry+https://github.com/rust-lang/crates.io-index" 2437 + checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" 2438 dependencies = [ 2439 + "bitflags 2.10.0", 2440 "dispatch2", 2441 + "objc2 0.6.3", 2442 ] 2443 2444 [[package]] 2445 name = "objc2-core-graphics" 2446 + version = "0.3.2" 2447 source = "registry+https://github.com/rust-lang/crates.io-index" 2448 + checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" 2449 dependencies = [ 2450 + "bitflags 2.10.0", 2451 "dispatch2", 2452 + "objc2 0.6.3", 2453 "objc2-core-foundation", 2454 "objc2-io-surface", 2455 ] 2456 2457 [[package]] 2458 name = "objc2-core-image" 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" 2492 source = "registry+https://github.com/rust-lang/crates.io-index" 2493 + checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" 2494 dependencies = [ 2495 + "bitflags 2.10.0", 2496 + "objc2 0.6.3", 2497 + "objc2-core-foundation", 2498 + "objc2-core-graphics", 2499 + "objc2-io-surface", 2500 ] 2501 2502 [[package]] ··· 2520 source = "registry+https://github.com/rust-lang/crates.io-index" 2521 checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" 2522 dependencies = [ 2523 + "bitflags 2.10.0", 2524 "block2 0.5.1", 2525 "libc", 2526 "objc2 0.5.2", ··· 2528 2529 [[package]] 2530 name = "objc2-foundation" 2531 + version = "0.3.2" 2532 source = "registry+https://github.com/rust-lang/crates.io-index" 2533 + checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" 2534 dependencies = [ 2535 + "bitflags 2.10.0", 2536 + "block2 0.6.2", 2537 "libc", 2538 + "objc2 0.6.3", 2539 "objc2-core-foundation", 2540 ] 2541 2542 [[package]] 2543 name = "objc2-io-surface" 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" 2556 source = "registry+https://github.com/rust-lang/crates.io-index" 2557 + checksum = "2a1e6550c4caed348956ce3370c9ffeca70bb1dbed4fa96112e7c6170e074586" 2558 dependencies = [ 2559 + "objc2 0.6.3", 2560 "objc2-core-foundation", 2561 ] 2562 ··· 2566 source = "registry+https://github.com/rust-lang/crates.io-index" 2567 checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" 2568 dependencies = [ 2569 + "bitflags 2.10.0", 2570 "block2 0.5.1", 2571 "objc2 0.5.2", 2572 "objc2-foundation 0.2.2", ··· 2578 source = "registry+https://github.com/rust-lang/crates.io-index" 2579 checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" 2580 dependencies = [ 2581 + "bitflags 2.10.0", 2582 "block2 0.5.1", 2583 "objc2 0.5.2", 2584 "objc2-foundation 0.2.2", ··· 2587 2588 [[package]] 2589 name = "objc2-quartz-core" 2590 + version = "0.3.2" 2591 source = "registry+https://github.com/rust-lang/crates.io-index" 2592 + checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" 2593 dependencies = [ 2594 + "bitflags 2.10.0", 2595 + "objc2 0.6.3", 2596 + "objc2-core-foundation", 2597 + "objc2-foundation 0.3.2", 2598 ] 2599 2600 [[package]] 2601 + name = "objc2-security" 2602 + version = "0.3.2" 2603 source = "registry+https://github.com/rust-lang/crates.io-index" 2604 + checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" 2605 dependencies = [ 2606 + "bitflags 2.10.0", 2607 + "objc2 0.6.3", 2608 "objc2-core-foundation", 2609 ] 2610 2611 [[package]] 2612 + name = "objc2-ui-kit" 2613 + version = "0.3.2" 2614 source = "registry+https://github.com/rust-lang/crates.io-index" 2615 + checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" 2616 dependencies = [ 2617 + "bitflags 2.10.0", 2618 + "block2 0.6.2", 2619 + "objc2 0.6.3", 2620 + "objc2-cloud-kit", 2621 + "objc2-core-data", 2622 "objc2-core-foundation", 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", 2630 ] 2631 2632 [[package]] 2633 + name = "objc2-user-notifications" 2634 + version = "0.3.2" 2635 source = "registry+https://github.com/rust-lang/crates.io-index" 2636 + checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" 2637 dependencies = [ 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", 2656 ] 2657 2658 [[package]] ··· 2690 ] 2691 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]] 2719 name = "pango" 2720 version = "0.18.3" 2721 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2748 2749 [[package]] 2750 name = "parking_lot" 2751 + version = "0.12.5" 2752 source = "registry+https://github.com/rust-lang/crates.io-index" 2753 + checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" 2754 dependencies = [ 2755 "lock_api", 2756 "parking_lot_core", ··· 2758 2759 [[package]] 2760 name = "parking_lot_core" 2761 + version = "0.9.12" 2762 source = "registry+https://github.com/rust-lang/crates.io-index" 2763 + checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" 2764 dependencies = [ 2765 "cfg-if", 2766 "libc", 2767 "redox_syscall", 2768 "smallvec", 2769 + "windows-link 0.2.1", 2770 ] 2771 2772 [[package]] ··· 2776 checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" 2777 2778 [[package]] 2779 + name = "percent-encoding" 2780 + version = "2.3.2" 2781 source = "registry+https://github.com/rust-lang/crates.io-index" 2782 + checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 2783 2784 [[package]] 2785 + name = "petgraph" 2786 + version = "0.8.3" 2787 source = "registry+https://github.com/rust-lang/crates.io-index" 2788 + checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" 2789 + dependencies = [ 2790 + "fixedbitset", 2791 + "hashbrown 0.15.5", 2792 + "indexmap 2.12.0", 2793 + ] 2794 2795 [[package]] 2796 name = "phf" ··· 2896 "phf_shared 0.11.3", 2897 "proc-macro2", 2898 "quote", 2899 + "syn 2.0.109", 2900 ] 2901 2902 [[package]] ··· 2950 ] 2951 2952 [[package]] 2953 name = "pkg-config" 2954 version = "0.3.32" 2955 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2957 2958 [[package]] 2959 name = "plist" 2960 + version = "1.8.0" 2961 source = "registry+https://github.com/rust-lang/crates.io-index" 2962 + checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" 2963 dependencies = [ 2964 "base64 0.22.1", 2965 + "indexmap 2.12.0", 2966 + "quick-xml 0.38.3", 2967 "serde", 2968 "time", 2969 ] ··· 2982 ] 2983 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]] 2998 name = "polling" 2999 + version = "3.11.0" 3000 source = "registry+https://github.com/rust-lang/crates.io-index" 3001 + checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" 3002 dependencies = [ 3003 "cfg-if", 3004 "concurrent-queue", 3005 "hermit-abi", 3006 "pin-project-lite", 3007 + "rustix 1.1.2", 3008 + "windows-sys 0.61.2", 3009 ] 3010 3011 [[package]] 3012 name = "potential_utf" 3013 + version = "0.1.4" 3014 source = "registry+https://github.com/rust-lang/crates.io-index" 3015 + checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" 3016 dependencies = [ 3017 "zerovec", 3018 ] ··· 3050 3051 [[package]] 3052 name = "proc-macro-crate" 3053 + version = "2.0.2" 3054 source = "registry+https://github.com/rust-lang/crates.io-index" 3055 + checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" 3056 dependencies = [ 3057 + "toml_datetime 0.6.3", 3058 + "toml_edit 0.20.2", 3059 ] 3060 3061 [[package]] 3062 name = "proc-macro-crate" 3063 + version = "3.4.0" 3064 source = "registry+https://github.com/rust-lang/crates.io-index" 3065 + checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" 3066 dependencies = [ 3067 + "toml_edit 0.23.7", 3068 ] 3069 3070 [[package]] ··· 3099 3100 [[package]] 3101 name = "proc-macro2" 3102 + version = "1.0.103" 3103 source = "registry+https://github.com/rust-lang/crates.io-index" 3104 + checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" 3105 dependencies = [ 3106 "unicode-ident", 3107 ] 3108 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]] 3125 name = "quick-xml" 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" 3136 source = "registry+https://github.com/rust-lang/crates.io-index" 3137 + checksum = "42a232e7487fc2ef313d96dde7948e7a3c05101870d8985e4fd8d26aedd27b89" 3138 dependencies = [ 3139 "memchr", 3140 ] 3141 3142 [[package]] 3143 name = "quote" 3144 + version = "1.0.42" 3145 source = "registry+https://github.com/rust-lang/crates.io-index" 3146 + checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" 3147 dependencies = [ 3148 "proc-macro2", 3149 ] ··· 3180 ] 3181 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]] 3193 name = "rand_chacha" 3194 version = "0.2.2" 3195 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3210 ] 3211 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]] 3223 name = "rand_core" 3224 version = "0.5.1" 3225 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3235 checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 3236 dependencies = [ 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", 3247 ] 3248 3249 [[package]] ··· 3272 3273 [[package]] 3274 name = "redox_syscall" 3275 + version = "0.5.18" 3276 source = "registry+https://github.com/rust-lang/crates.io-index" 3277 + checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" 3278 dependencies = [ 3279 + "bitflags 2.10.0", 3280 ] 3281 3282 [[package]] 3283 name = "redox_users" 3284 + version = "0.5.2" 3285 source = "registry+https://github.com/rust-lang/crates.io-index" 3286 + checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" 3287 dependencies = [ 3288 "getrandom 0.2.16", 3289 "libredox", 3290 + "thiserror 2.0.17", 3291 ] 3292 3293 [[package]] 3294 name = "ref-cast" 3295 + version = "1.0.25" 3296 source = "registry+https://github.com/rust-lang/crates.io-index" 3297 + checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" 3298 dependencies = [ 3299 "ref-cast-impl", 3300 ] 3301 3302 [[package]] 3303 name = "ref-cast-impl" 3304 + version = "1.0.25" 3305 source = "registry+https://github.com/rust-lang/crates.io-index" 3306 + checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" 3307 dependencies = [ 3308 "proc-macro2", 3309 "quote", 3310 + "syn 2.0.109", 3311 ] 3312 3313 [[package]] 3314 name = "regex" 3315 + version = "1.12.2" 3316 source = "registry+https://github.com/rust-lang/crates.io-index" 3317 + checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" 3318 dependencies = [ 3319 "aho-corasick", 3320 "memchr", ··· 3324 3325 [[package]] 3326 name = "regex-automata" 3327 + version = "0.4.13" 3328 source = "registry+https://github.com/rust-lang/crates.io-index" 3329 + checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" 3330 dependencies = [ 3331 "aho-corasick", 3332 "memchr", ··· 3335 3336 [[package]] 3337 name = "regex-syntax" 3338 + version = "0.8.8" 3339 source = "registry+https://github.com/rust-lang/crates.io-index" 3340 + checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" 3341 3342 [[package]] 3343 name = "reqwest" 3344 + version = "0.12.24" 3345 source = "registry+https://github.com/rust-lang/crates.io-index" 3346 + checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" 3347 dependencies = [ 3348 "base64 0.22.1", 3349 "bytes", ··· 3375 ] 3376 3377 [[package]] 3378 + name = "rfd" 3379 + version = "0.15.4" 3380 source = "registry+https://github.com/rust-lang/crates.io-index" 3381 + checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" 3382 dependencies = [ 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", 3400 ] 3401 3402 [[package]] 3403 name = "rustc_version" 3404 version = "0.4.1" 3405 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3410 3411 [[package]] 3412 name = "rustix" 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" 3427 source = "registry+https://github.com/rust-lang/crates.io-index" 3428 + checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" 3429 dependencies = [ 3430 + "bitflags 2.10.0", 3431 "errno", 3432 "libc", 3433 + "linux-raw-sys 0.11.0", 3434 + "windows-sys 0.61.2", 3435 ] 3436 3437 [[package]] 3438 name = "rustversion" 3439 + version = "1.0.22" 3440 source = "registry+https://github.com/rust-lang/crates.io-index" 3441 + checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 3442 3443 [[package]] 3444 name = "ryu" ··· 3484 3485 [[package]] 3486 name = "schemars" 3487 + version = "1.1.0" 3488 source = "registry+https://github.com/rust-lang/crates.io-index" 3489 + checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" 3490 dependencies = [ 3491 "dyn-clone", 3492 "ref-cast", ··· 3503 "proc-macro2", 3504 "quote", 3505 "serde_derive_internals", 3506 + "syn 2.0.109", 3507 ] 3508 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]] 3516 name = "scopeguard" 3517 version = "1.2.0" 3518 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3538 3539 [[package]] 3540 name = "semver" 3541 + version = "1.0.27" 3542 source = "registry+https://github.com/rust-lang/crates.io-index" 3543 + checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" 3544 dependencies = [ 3545 "serde", 3546 + "serde_core", 3547 ] 3548 3549 [[package]] 3550 name = "serde" 3551 + version = "1.0.228" 3552 source = "registry+https://github.com/rust-lang/crates.io-index" 3553 + checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 3554 dependencies = [ 3555 + "serde_core", 3556 "serde_derive", 3557 ] 3558 3559 [[package]] 3560 name = "serde-untagged" 3561 + version = "0.1.9" 3562 source = "registry+https://github.com/rust-lang/crates.io-index" 3563 + checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" 3564 dependencies = [ 3565 "erased-serde", 3566 "serde", 3567 + "serde_core", 3568 "typeid", 3569 ] 3570 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]] 3581 name = "serde_derive" 3582 + version = "1.0.228" 3583 source = "registry+https://github.com/rust-lang/crates.io-index" 3584 + checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 3585 dependencies = [ 3586 "proc-macro2", 3587 "quote", 3588 + "syn 2.0.109", 3589 ] 3590 3591 [[package]] ··· 3596 dependencies = [ 3597 "proc-macro2", 3598 "quote", 3599 + "syn 2.0.109", 3600 ] 3601 3602 [[package]] 3603 name = "serde_json" 3604 + version = "1.0.145" 3605 source = "registry+https://github.com/rust-lang/crates.io-index" 3606 + checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" 3607 dependencies = [ 3608 "itoa", 3609 "memchr", 3610 "ryu", 3611 "serde", 3612 + "serde_core", 3613 ] 3614 3615 [[package]] ··· 3620 dependencies = [ 3621 "proc-macro2", 3622 "quote", 3623 + "syn 2.0.109", 3624 ] 3625 3626 [[package]] ··· 3634 3635 [[package]] 3636 name = "serde_spanned" 3637 + version = "1.0.3" 3638 source = "registry+https://github.com/rust-lang/crates.io-index" 3639 + checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" 3640 dependencies = [ 3641 + "serde_core", 3642 ] 3643 3644 [[package]] ··· 3655 3656 [[package]] 3657 name = "serde_with" 3658 + version = "3.15.1" 3659 source = "registry+https://github.com/rust-lang/crates.io-index" 3660 + checksum = "aa66c845eee442168b2c8134fec70ac50dc20e760769c8ba0ad1319ca1959b04" 3661 dependencies = [ 3662 "base64 0.22.1", 3663 "chrono", 3664 "hex", 3665 "indexmap 1.9.3", 3666 + "indexmap 2.12.0", 3667 "schemars 0.9.0", 3668 + "schemars 1.1.0", 3669 + "serde_core", 3670 "serde_json", 3671 "serde_with_macros", 3672 "time", ··· 3674 3675 [[package]] 3676 name = "serde_with_macros" 3677 + version = "3.15.1" 3678 source = "registry+https://github.com/rust-lang/crates.io-index" 3679 + checksum = "b91a903660542fced4e99881aa481bdbaec1634568ee02e0b8bd57c64cb38955" 3680 dependencies = [ 3681 "darling", 3682 "proc-macro2", 3683 "quote", 3684 + "syn 2.0.109", 3685 ] 3686 3687 [[package]] 3688 name = "serialize-to-javascript" 3689 + version = "0.1.2" 3690 source = "registry+https://github.com/rust-lang/crates.io-index" 3691 + checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" 3692 dependencies = [ 3693 "serde", 3694 "serde_json", ··· 3697 3698 [[package]] 3699 name = "serialize-to-javascript-impl" 3700 + version = "0.1.2" 3701 source = "registry+https://github.com/rust-lang/crates.io-index" 3702 + checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" 3703 dependencies = [ 3704 "proc-macro2", 3705 "quote", 3706 + "syn 2.0.109", 3707 ] 3708 3709 [[package]] ··· 3717 ] 3718 3719 [[package]] 3720 name = "sha2" 3721 version = "0.10.9" 3722 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3735 3736 [[package]] 3737 name = "signal-hook-registry" 3738 + version = "1.4.6" 3739 source = "registry+https://github.com/rust-lang/crates.io-index" 3740 + checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" 3741 dependencies = [ 3742 "libc", 3743 ] 3744 3745 [[package]] 3746 name = "simd-adler32" 3747 version = "0.3.7" 3748 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3762 3763 [[package]] 3764 name = "slab" 3765 + version = "0.4.11" 3766 source = "registry+https://github.com/rust-lang/crates.io-index" 3767 + checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" 3768 3769 [[package]] 3770 name = "smallvec" 3771 version = "1.15.1" 3772 source = "registry+https://github.com/rust-lang/crates.io-index" 3773 checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 3774 3775 [[package]] 3776 name = "socket2" 3777 + version = "0.6.1" 3778 source = "registry+https://github.com/rust-lang/crates.io-index" 3779 + checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" 3780 dependencies = [ 3781 "libc", 3782 + "windows-sys 0.60.2", 3783 ] 3784 3785 [[package]] ··· 3790 dependencies = [ 3791 "bytemuck", 3792 "cfg_aliases", 3793 + "core-graphics 0.24.0", 3794 "foreign-types", 3795 "js-sys", 3796 "log", ··· 3831 ] 3832 3833 [[package]] 3834 name = "stable_deref_trait" 3835 + version = "1.2.1" 3836 source = "registry+https://github.com/rust-lang/crates.io-index" 3837 + checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" 3838 3839 [[package]] 3840 name = "static_assertions" ··· 3868 ] 3869 3870 [[package]] 3871 name = "strsim" 3872 version = "0.11.1" 3873 source = "registry+https://github.com/rust-lang/crates.io-index" 3874 checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 3875 3876 [[package]] 3877 name = "swift-rs" ··· 3897 3898 [[package]] 3899 name = "syn" 3900 + version = "2.0.109" 3901 source = "registry+https://github.com/rust-lang/crates.io-index" 3902 + checksum = "2f17c7e013e88258aa9543dcbe81aca68a667a9ac37cd69c9fbc07858bfe0e2f" 3903 dependencies = [ 3904 "proc-macro2", 3905 "quote", ··· 3923 dependencies = [ 3924 "proc-macro2", 3925 "quote", 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", 3936 ] 3937 3938 [[package]] ··· 3944 "cfg-expr", 3945 "heck 0.5.0", 3946 "pkg-config", 3947 + "toml 0.8.2", 3948 "version-compare", 3949 ] 3950 3951 [[package]] 3952 name = "tao" 3953 + version = "0.34.5" 3954 source = "registry+https://github.com/rust-lang/crates.io-index" 3955 + checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" 3956 dependencies = [ 3957 + "bitflags 2.10.0", 3958 + "block2 0.6.2", 3959 "core-foundation", 3960 + "core-graphics 0.24.0", 3961 "crossbeam-channel", 3962 "dispatch", 3963 "dlopen2", ··· 3972 "ndk", 3973 "ndk-context", 3974 "ndk-sys", 3975 + "objc2 0.6.3", 3976 "objc2-app-kit", 3977 + "objc2-foundation 0.3.2", 3978 "once_cell", 3979 "parking_lot", 3980 "raw-window-handle", ··· 3983 "unicode-segmentation", 3984 "url", 3985 "windows", 3986 + "windows-core 0.61.2", 3987 "windows-version", 3988 "x11-dl", 3989 ] ··· 3996 dependencies = [ 3997 "proc-macro2", 3998 "quote", 3999 + "syn 2.0.109", 4000 ] 4001 4002 [[package]] ··· 4007 4008 [[package]] 4009 name = "tauri" 4010 + version = "2.9.2" 4011 source = "registry+https://github.com/rust-lang/crates.io-index" 4012 + checksum = "8bceb52453e507c505b330afe3398510e87f428ea42b6e76ecb6bd63b15965b5" 4013 dependencies = [ 4014 "anyhow", 4015 "bytes", 4016 + "cookie", 4017 "dirs", 4018 "dunce", 4019 "embed_plist", 4020 + "getrandom 0.3.4", 4021 "glob", 4022 "gtk", 4023 "heck 0.5.0", 4024 "http", 4025 + "image", 4026 "jni", 4027 "libc", 4028 "log", 4029 "mime", 4030 "muda", 4031 + "objc2 0.6.3", 4032 "objc2-app-kit", 4033 + "objc2-foundation 0.3.2", 4034 "objc2-ui-kit", 4035 + "objc2-web-kit", 4036 "percent-encoding", 4037 "plist", 4038 "raw-window-handle", ··· 4047 "tauri-runtime", 4048 "tauri-runtime-wry", 4049 "tauri-utils", 4050 + "thiserror 2.0.17", 4051 "tokio", 4052 "tray-icon", 4053 "url", 4054 "webkit2gtk", 4055 "webview2-com", 4056 "window-vibrancy", ··· 4059 4060 [[package]] 4061 name = "tauri-build" 4062 + version = "2.5.1" 4063 source = "registry+https://github.com/rust-lang/crates.io-index" 4064 + checksum = "a924b6c50fe83193f0f8b14072afa7c25b7a72752a2a73d9549b463f5fe91a38" 4065 dependencies = [ 4066 "anyhow", 4067 "cargo_toml", ··· 4075 "serde_json", 4076 "tauri-utils", 4077 "tauri-winres", 4078 + "toml 0.9.8", 4079 "walkdir", 4080 ] 4081 4082 [[package]] 4083 name = "tauri-codegen" 4084 + version = "2.5.0" 4085 source = "registry+https://github.com/rust-lang/crates.io-index" 4086 + checksum = "6c1fe64c74cc40f90848281a90058a6db931eb400b60205840e09801ee30f190" 4087 dependencies = [ 4088 "base64 0.22.1", 4089 "brotli", 4090 "ico", 4091 "json-patch", 4092 "plist", 4093 + "png 0.17.16", 4094 "proc-macro2", 4095 "quote", 4096 "semver", 4097 "serde", 4098 "serde_json", 4099 "sha2", 4100 + "syn 2.0.109", 4101 "tauri-utils", 4102 + "thiserror 2.0.17", 4103 "time", 4104 "url", 4105 "uuid", ··· 4108 4109 [[package]] 4110 name = "tauri-macros" 4111 + version = "2.5.0" 4112 source = "registry+https://github.com/rust-lang/crates.io-index" 4113 + checksum = "260c5d2eb036b76206b9fca20b7be3614cfd21046c5396f7959e0e64a4b07f2f" 4114 dependencies = [ 4115 "heck 0.5.0", 4116 "proc-macro2", 4117 "quote", 4118 + "syn 2.0.109", 4119 "tauri-codegen", 4120 "tauri-utils", 4121 ] 4122 4123 [[package]] 4124 name = "tauri-plugin" 4125 + version = "2.5.1" 4126 source = "registry+https://github.com/rust-lang/crates.io-index" 4127 + checksum = "076c78a474a7247c90cad0b6e87e593c4c620ed4efdb79cbe0214f0021f6c39d" 4128 dependencies = [ 4129 "anyhow", 4130 "glob", ··· 4133 "serde", 4134 "serde_json", 4135 "tauri-utils", 4136 + "toml 0.9.8", 4137 "walkdir", 4138 ] 4139 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]] 4196 name = "tauri-plugin-opener" 4197 + version = "2.5.2" 4198 source = "registry+https://github.com/rust-lang/crates.io-index" 4199 + checksum = "c26b72571d25dee25667940027114e60f569fc3974f8cefbe50c2cbc5fd65e3b" 4200 dependencies = [ 4201 "dunce", 4202 "glob", 4203 "objc2-app-kit", 4204 + "objc2-foundation 0.3.2", 4205 "open", 4206 "schemars 0.8.22", 4207 "serde", 4208 "serde_json", 4209 "tauri", 4210 "tauri-plugin", 4211 + "thiserror 2.0.17", 4212 "url", 4213 "windows", 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", 4233 ] 4234 4235 [[package]] 4236 name = "tauri-runtime" 4237 + version = "2.9.1" 4238 source = "registry+https://github.com/rust-lang/crates.io-index" 4239 + checksum = "9368f09358496f2229313fccb37682ad116b7f46fa76981efe116994a0628926" 4240 dependencies = [ 4241 "cookie", 4242 "dpi", 4243 "gtk", 4244 "http", 4245 "jni", 4246 + "objc2 0.6.3", 4247 "objc2-ui-kit", 4248 + "objc2-web-kit", 4249 "raw-window-handle", 4250 "serde", 4251 "serde_json", 4252 "tauri-utils", 4253 + "thiserror 2.0.17", 4254 "url", 4255 + "webkit2gtk", 4256 + "webview2-com", 4257 "windows", 4258 ] 4259 4260 [[package]] 4261 name = "tauri-runtime-wry" 4262 + version = "2.9.1" 4263 source = "registry+https://github.com/rust-lang/crates.io-index" 4264 + checksum = "929f5df216f5c02a9e894554401bcdab6eec3e39ec6a4a7731c7067fc8688a93" 4265 dependencies = [ 4266 "gtk", 4267 "http", 4268 "jni", 4269 "log", 4270 + "objc2 0.6.3", 4271 "objc2-app-kit", 4272 + "objc2-foundation 0.3.2", 4273 "once_cell", 4274 "percent-encoding", 4275 "raw-window-handle", ··· 4286 4287 [[package]] 4288 name = "tauri-utils" 4289 + version = "2.8.0" 4290 source = "registry+https://github.com/rust-lang/crates.io-index" 4291 + checksum = "f6b8bbe426abdbf52d050e52ed693130dbd68375b9ad82a3fb17efb4c8d85673" 4292 dependencies = [ 4293 "anyhow", 4294 "brotli", ··· 4314 "serde_json", 4315 "serde_with", 4316 "swift-rs", 4317 + "thiserror 2.0.17", 4318 + "toml 0.9.8", 4319 "url", 4320 "urlpattern", 4321 "uuid", ··· 4324 4325 [[package]] 4326 name = "tauri-winres" 4327 + version = "0.3.3" 4328 source = "registry+https://github.com/rust-lang/crates.io-index" 4329 + checksum = "fd21509dd1fa9bd355dc29894a6ff10635880732396aa38c0066c1e6c1ab8074" 4330 dependencies = [ 4331 "embed-resource", 4332 + "toml 0.9.8", 4333 ] 4334 4335 [[package]] 4336 name = "tempfile" 4337 + version = "3.23.0" 4338 source = "registry+https://github.com/rust-lang/crates.io-index" 4339 + checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" 4340 dependencies = [ 4341 "fastrand", 4342 + "getrandom 0.3.4", 4343 "once_cell", 4344 + "rustix 1.1.2", 4345 + "windows-sys 0.61.2", 4346 ] 4347 4348 [[package]] ··· 4367 4368 [[package]] 4369 name = "thiserror" 4370 + version = "2.0.17" 4371 source = "registry+https://github.com/rust-lang/crates.io-index" 4372 + checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" 4373 dependencies = [ 4374 + "thiserror-impl 2.0.17", 4375 ] 4376 4377 [[package]] ··· 4382 dependencies = [ 4383 "proc-macro2", 4384 "quote", 4385 + "syn 2.0.109", 4386 ] 4387 4388 [[package]] 4389 name = "thiserror-impl" 4390 + version = "2.0.17" 4391 source = "registry+https://github.com/rust-lang/crates.io-index" 4392 + checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" 4393 dependencies = [ 4394 "proc-macro2", 4395 "quote", 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", 4411 ] 4412 4413 [[package]] 4414 name = "time" 4415 + version = "0.3.44" 4416 source = "registry+https://github.com/rust-lang/crates.io-index" 4417 + checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" 4418 dependencies = [ 4419 "deranged", 4420 "itoa", ··· 4427 4428 [[package]] 4429 name = "time-core" 4430 + version = "0.1.6" 4431 source = "registry+https://github.com/rust-lang/crates.io-index" 4432 + checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" 4433 4434 [[package]] 4435 name = "time-macros" 4436 + version = "0.2.24" 4437 source = "registry+https://github.com/rust-lang/crates.io-index" 4438 + checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" 4439 dependencies = [ 4440 "num-conv", 4441 "time-core", ··· 4443 4444 [[package]] 4445 name = "tinystr" 4446 + version = "0.8.2" 4447 source = "registry+https://github.com/rust-lang/crates.io-index" 4448 + checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" 4449 dependencies = [ 4450 "displaydoc", 4451 "zerovec", 4452 ] 4453 4454 [[package]] 4455 name = "tokio" 4456 + version = "1.48.0" 4457 source = "registry+https://github.com/rust-lang/crates.io-index" 4458 + checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" 4459 dependencies = [ 4460 "bytes", 4461 "libc", 4462 "mio", 4463 "pin-project-lite", 4464 + "signal-hook-registry", 4465 "socket2", 4466 "tokio-macros", 4467 + "tracing", 4468 + "windows-sys 0.61.2", 4469 ] 4470 4471 [[package]] 4472 name = "tokio-macros" 4473 + version = "2.6.0" 4474 source = "registry+https://github.com/rust-lang/crates.io-index" 4475 + checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" 4476 dependencies = [ 4477 "proc-macro2", 4478 "quote", 4479 + "syn 2.0.109", 4480 ] 4481 4482 [[package]] 4483 name = "tokio-util" 4484 + version = "0.7.17" 4485 source = "registry+https://github.com/rust-lang/crates.io-index" 4486 + checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" 4487 dependencies = [ 4488 "bytes", 4489 "futures-core", ··· 4494 4495 [[package]] 4496 name = "toml" 4497 + version = "0.8.2" 4498 source = "registry+https://github.com/rust-lang/crates.io-index" 4499 + checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" 4500 dependencies = [ 4501 "serde", 4502 "serde_spanned 0.6.9", 4503 + "toml_datetime 0.6.3", 4504 + "toml_edit 0.20.2", 4505 ] 4506 4507 [[package]] 4508 name = "toml" 4509 + version = "0.9.8" 4510 source = "registry+https://github.com/rust-lang/crates.io-index" 4511 + checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" 4512 dependencies = [ 4513 + "indexmap 2.12.0", 4514 + "serde_core", 4515 + "serde_spanned 1.0.3", 4516 + "toml_datetime 0.7.3", 4517 "toml_parser", 4518 "toml_writer", 4519 + "winnow 0.7.13", 4520 ] 4521 4522 [[package]] 4523 name = "toml_datetime" 4524 + version = "0.6.3" 4525 source = "registry+https://github.com/rust-lang/crates.io-index" 4526 + checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" 4527 dependencies = [ 4528 "serde", 4529 ] 4530 4531 [[package]] 4532 name = "toml_datetime" 4533 + version = "0.7.3" 4534 source = "registry+https://github.com/rust-lang/crates.io-index" 4535 + checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" 4536 dependencies = [ 4537 + "serde_core", 4538 ] 4539 4540 [[package]] ··· 4543 source = "registry+https://github.com/rust-lang/crates.io-index" 4544 checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" 4545 dependencies = [ 4546 + "indexmap 2.12.0", 4547 + "toml_datetime 0.6.3", 4548 "winnow 0.5.40", 4549 ] 4550 4551 [[package]] 4552 name = "toml_edit" 4553 + version = "0.20.2" 4554 source = "registry+https://github.com/rust-lang/crates.io-index" 4555 + checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" 4556 dependencies = [ 4557 + "indexmap 2.12.0", 4558 + "serde", 4559 + "serde_spanned 0.6.9", 4560 + "toml_datetime 0.6.3", 4561 "winnow 0.5.40", 4562 ] 4563 4564 [[package]] 4565 name = "toml_edit" 4566 + version = "0.23.7" 4567 source = "registry+https://github.com/rust-lang/crates.io-index" 4568 + checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" 4569 dependencies = [ 4570 + "indexmap 2.12.0", 4571 + "toml_datetime 0.7.3", 4572 + "toml_parser", 4573 + "winnow 0.7.13", 4574 ] 4575 4576 [[package]] 4577 name = "toml_parser" 4578 + version = "1.0.4" 4579 source = "registry+https://github.com/rust-lang/crates.io-index" 4580 + checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" 4581 dependencies = [ 4582 + "winnow 0.7.13", 4583 ] 4584 4585 [[package]] 4586 name = "toml_writer" 4587 + version = "1.0.4" 4588 source = "registry+https://github.com/rust-lang/crates.io-index" 4589 + checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" 4590 4591 [[package]] 4592 name = "tower" ··· 4609 source = "registry+https://github.com/rust-lang/crates.io-index" 4610 checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" 4611 dependencies = [ 4612 + "bitflags 2.10.0", 4613 "bytes", 4614 "futures-util", 4615 "http", ··· 4639 source = "registry+https://github.com/rust-lang/crates.io-index" 4640 checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 4641 dependencies = [ 4642 "pin-project-lite", 4643 "tracing-attributes", 4644 "tracing-core", ··· 4652 dependencies = [ 4653 "proc-macro2", 4654 "quote", 4655 + "syn 2.0.109", 4656 ] 4657 4658 [[package]] ··· 4666 4667 [[package]] 4668 name = "tray-icon" 4669 + version = "0.21.2" 4670 source = "registry+https://github.com/rust-lang/crates.io-index" 4671 + checksum = "e3d5572781bee8e3f994d7467084e1b1fd7a93ce66bd480f8156ba89dee55a2b" 4672 dependencies = [ 4673 "crossbeam-channel", 4674 "dirs", 4675 "libappindicator", 4676 "muda", 4677 + "objc2 0.6.3", 4678 "objc2-app-kit", 4679 "objc2-core-foundation", 4680 "objc2-core-graphics", 4681 + "objc2-foundation 0.3.2", 4682 "once_cell", 4683 + "png 0.17.16", 4684 "serde", 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", 4698 ] 4699 4700 [[package]] ··· 4711 4712 [[package]] 4713 name = "typenum" 4714 + version = "1.19.0" 4715 source = "registry+https://github.com/rust-lang/crates.io-index" 4716 + checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" 4717 4718 [[package]] 4719 name = "uds_windows" ··· 4766 dependencies = [ 4767 "unic-common", 4768 ] 4769 4770 [[package]] 4771 name = "unicode-ident" 4772 + version = "1.0.22" 4773 source = "registry+https://github.com/rust-lang/crates.io-index" 4774 + checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" 4775 4776 [[package]] 4777 name = "unicode-segmentation" ··· 4781 4782 [[package]] 4783 name = "url" 4784 + version = "2.5.7" 4785 source = "registry+https://github.com/rust-lang/crates.io-index" 4786 + checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" 4787 dependencies = [ 4788 "form_urlencoded", 4789 "idna", ··· 4817 4818 [[package]] 4819 name = "uuid" 4820 + version = "1.18.1" 4821 source = "registry+https://github.com/rust-lang/crates.io-index" 4822 + checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" 4823 dependencies = [ 4824 + "getrandom 0.3.4", 4825 "js-sys", 4826 "serde", 4827 "wasm-bindgen", 4828 ] 4829 4830 [[package]] 4831 name = "version-compare" 4832 + version = "0.2.1" 4833 source = "registry+https://github.com/rust-lang/crates.io-index" 4834 + checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" 4835 4836 [[package]] 4837 name = "version_check" ··· 4891 checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 4892 4893 [[package]] 4894 + name = "wasip2" 4895 + version = "1.0.1+wasi-0.2.4" 4896 source = "registry+https://github.com/rust-lang/crates.io-index" 4897 + checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" 4898 dependencies = [ 4899 + "wit-bindgen", 4900 ] 4901 4902 [[package]] 4903 name = "wasm-bindgen" 4904 + version = "0.2.105" 4905 source = "registry+https://github.com/rust-lang/crates.io-index" 4906 + checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" 4907 dependencies = [ 4908 "cfg-if", 4909 "once_cell", 4910 "rustversion", 4911 "wasm-bindgen-macro", 4912 "wasm-bindgen-shared", 4913 ] 4914 4915 [[package]] 4916 name = "wasm-bindgen-futures" 4917 + version = "0.4.55" 4918 source = "registry+https://github.com/rust-lang/crates.io-index" 4919 + checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" 4920 dependencies = [ 4921 "cfg-if", 4922 "js-sys", ··· 4927 4928 [[package]] 4929 name = "wasm-bindgen-macro" 4930 + version = "0.2.105" 4931 source = "registry+https://github.com/rust-lang/crates.io-index" 4932 + checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" 4933 dependencies = [ 4934 "quote", 4935 "wasm-bindgen-macro-support", ··· 4937 4938 [[package]] 4939 name = "wasm-bindgen-macro-support" 4940 + version = "0.2.105" 4941 source = "registry+https://github.com/rust-lang/crates.io-index" 4942 + checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" 4943 dependencies = [ 4944 + "bumpalo", 4945 "proc-macro2", 4946 "quote", 4947 + "syn 2.0.109", 4948 "wasm-bindgen-shared", 4949 ] 4950 4951 [[package]] 4952 name = "wasm-bindgen-shared" 4953 + version = "0.2.105" 4954 source = "registry+https://github.com/rust-lang/crates.io-index" 4955 + checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" 4956 dependencies = [ 4957 "unicode-ident", 4958 ] ··· 4971 ] 4972 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]] 5047 name = "web-sys" 5048 + version = "0.3.82" 5049 source = "registry+https://github.com/rust-lang/crates.io-index" 5050 + checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" 5051 dependencies = [ 5052 "js-sys", 5053 "wasm-bindgen", ··· 5106 "webview2-com-macros", 5107 "webview2-com-sys", 5108 "windows", 5109 + "windows-core 0.61.2", 5110 "windows-implement", 5111 "windows-interface", 5112 ] ··· 5119 dependencies = [ 5120 "proc-macro2", 5121 "quote", 5122 + "syn 2.0.109", 5123 ] 5124 5125 [[package]] ··· 5128 source = "registry+https://github.com/rust-lang/crates.io-index" 5129 checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" 5130 dependencies = [ 5131 + "thiserror 2.0.17", 5132 "windows", 5133 + "windows-core 0.61.2", 5134 ] 5135 5136 [[package]] 5137 + name = "weezl" 5138 + version = "0.1.12" 5139 source = "registry+https://github.com/rust-lang/crates.io-index" 5140 + checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" 5141 5142 [[package]] 5143 name = "winapi" ··· 5157 5158 [[package]] 5159 name = "winapi-util" 5160 + version = "0.1.11" 5161 source = "registry+https://github.com/rust-lang/crates.io-index" 5162 + checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" 5163 dependencies = [ 5164 + "windows-sys 0.61.2", 5165 ] 5166 5167 [[package]] ··· 5176 source = "registry+https://github.com/rust-lang/crates.io-index" 5177 checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" 5178 dependencies = [ 5179 + "objc2 0.6.3", 5180 "objc2-app-kit", 5181 "objc2-core-foundation", 5182 + "objc2-foundation 0.3.2", 5183 "raw-window-handle", 5184 "windows-sys 0.59.0", 5185 "windows-version", ··· 5192 checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" 5193 dependencies = [ 5194 "windows-collections", 5195 + "windows-core 0.61.2", 5196 "windows-future", 5197 + "windows-link 0.1.3", 5198 "windows-numerics", 5199 ] 5200 ··· 5204 source = "registry+https://github.com/rust-lang/crates.io-index" 5205 checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" 5206 dependencies = [ 5207 + "windows-core 0.61.2", 5208 ] 5209 5210 [[package]] ··· 5215 dependencies = [ 5216 "windows-implement", 5217 "windows-interface", 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", 5234 ] 5235 5236 [[package]] ··· 5239 source = "registry+https://github.com/rust-lang/crates.io-index" 5240 checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" 5241 dependencies = [ 5242 + "windows-core 0.61.2", 5243 + "windows-link 0.1.3", 5244 "windows-threading", 5245 ] 5246 5247 [[package]] 5248 name = "windows-implement" 5249 + version = "0.60.2" 5250 source = "registry+https://github.com/rust-lang/crates.io-index" 5251 + checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" 5252 dependencies = [ 5253 "proc-macro2", 5254 "quote", 5255 + "syn 2.0.109", 5256 ] 5257 5258 [[package]] 5259 name = "windows-interface" 5260 + version = "0.59.3" 5261 source = "registry+https://github.com/rust-lang/crates.io-index" 5262 + checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" 5263 dependencies = [ 5264 "proc-macro2", 5265 "quote", 5266 + "syn 2.0.109", 5267 ] 5268 5269 [[package]] ··· 5273 checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 5274 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]] 5282 name = "windows-numerics" 5283 version = "0.2.0" 5284 source = "registry+https://github.com/rust-lang/crates.io-index" 5285 checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" 5286 dependencies = [ 5287 + "windows-core 0.61.2", 5288 + "windows-link 0.1.3", 5289 ] 5290 5291 [[package]] ··· 5294 source = "registry+https://github.com/rust-lang/crates.io-index" 5295 checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" 5296 dependencies = [ 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", 5307 ] 5308 5309 [[package]] ··· 5312 source = "registry+https://github.com/rust-lang/crates.io-index" 5313 checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" 5314 dependencies = [ 5315 + "windows-link 0.1.3", 5316 ] 5317 5318 [[package]] 5319 + name = "windows-strings" 5320 + version = "0.5.1" 5321 source = "registry+https://github.com/rust-lang/crates.io-index" 5322 + checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" 5323 dependencies = [ 5324 + "windows-link 0.2.1", 5325 ] 5326 5327 [[package]] 5328 name = "windows-sys" 5329 + version = "0.45.0" 5330 source = "registry+https://github.com/rust-lang/crates.io-index" 5331 + checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 5332 dependencies = [ 5333 + "windows-targets 0.42.2", 5334 ] 5335 5336 [[package]] ··· 5348 source = "registry+https://github.com/rust-lang/crates.io-index" 5349 checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 5350 dependencies = [ 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", 5361 ] 5362 5363 [[package]] ··· 5377 5378 [[package]] 5379 name = "windows-targets" 5380 version = "0.52.6" 5381 source = "registry+https://github.com/rust-lang/crates.io-index" 5382 checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" ··· 5393 5394 [[package]] 5395 name = "windows-targets" 5396 + version = "0.53.5" 5397 source = "registry+https://github.com/rust-lang/crates.io-index" 5398 + checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" 5399 dependencies = [ 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", 5409 ] 5410 5411 [[package]] ··· 5414 source = "registry+https://github.com/rust-lang/crates.io-index" 5415 checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" 5416 dependencies = [ 5417 + "windows-link 0.1.3", 5418 ] 5419 5420 [[package]] 5421 name = "windows-version" 5422 + version = "0.1.7" 5423 source = "registry+https://github.com/rust-lang/crates.io-index" 5424 + checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" 5425 dependencies = [ 5426 + "windows-link 0.2.1", 5427 ] 5428 5429 [[package]] ··· 5431 version = "0.42.2" 5432 source = "registry+https://github.com/rust-lang/crates.io-index" 5433 checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 5434 5435 [[package]] 5436 name = "windows_aarch64_gnullvm" ··· 5440 5441 [[package]] 5442 name = "windows_aarch64_gnullvm" 5443 + version = "0.53.1" 5444 source = "registry+https://github.com/rust-lang/crates.io-index" 5445 + checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" 5446 5447 [[package]] 5448 name = "windows_aarch64_msvc" ··· 5452 5453 [[package]] 5454 name = "windows_aarch64_msvc" 5455 version = "0.52.6" 5456 source = "registry+https://github.com/rust-lang/crates.io-index" 5457 checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 5458 5459 [[package]] 5460 name = "windows_aarch64_msvc" 5461 + version = "0.53.1" 5462 source = "registry+https://github.com/rust-lang/crates.io-index" 5463 + checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" 5464 5465 [[package]] 5466 name = "windows_i686_gnu" ··· 5470 5471 [[package]] 5472 name = "windows_i686_gnu" 5473 version = "0.52.6" 5474 source = "registry+https://github.com/rust-lang/crates.io-index" 5475 checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 5476 5477 [[package]] 5478 name = "windows_i686_gnu" 5479 + version = "0.53.1" 5480 source = "registry+https://github.com/rust-lang/crates.io-index" 5481 + checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" 5482 5483 [[package]] 5484 name = "windows_i686_gnullvm" ··· 5488 5489 [[package]] 5490 name = "windows_i686_gnullvm" 5491 + version = "0.53.1" 5492 source = "registry+https://github.com/rust-lang/crates.io-index" 5493 + checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" 5494 5495 [[package]] 5496 name = "windows_i686_msvc" ··· 5500 5501 [[package]] 5502 name = "windows_i686_msvc" 5503 version = "0.52.6" 5504 source = "registry+https://github.com/rust-lang/crates.io-index" 5505 checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 5506 5507 [[package]] 5508 name = "windows_i686_msvc" 5509 + version = "0.53.1" 5510 source = "registry+https://github.com/rust-lang/crates.io-index" 5511 + checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" 5512 5513 [[package]] 5514 name = "windows_x86_64_gnu" ··· 5518 5519 [[package]] 5520 name = "windows_x86_64_gnu" 5521 version = "0.52.6" 5522 source = "registry+https://github.com/rust-lang/crates.io-index" 5523 checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 5524 5525 [[package]] 5526 name = "windows_x86_64_gnu" 5527 + version = "0.53.1" 5528 source = "registry+https://github.com/rust-lang/crates.io-index" 5529 + checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" 5530 5531 [[package]] 5532 name = "windows_x86_64_gnullvm" ··· 5536 5537 [[package]] 5538 name = "windows_x86_64_gnullvm" 5539 version = "0.52.6" 5540 source = "registry+https://github.com/rust-lang/crates.io-index" 5541 checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 5542 5543 [[package]] 5544 name = "windows_x86_64_gnullvm" 5545 + version = "0.53.1" 5546 source = "registry+https://github.com/rust-lang/crates.io-index" 5547 + checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" 5548 5549 [[package]] 5550 name = "windows_x86_64_msvc" ··· 5554 5555 [[package]] 5556 name = "windows_x86_64_msvc" 5557 version = "0.52.6" 5558 source = "registry+https://github.com/rust-lang/crates.io-index" 5559 checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 5560 5561 [[package]] 5562 name = "windows_x86_64_msvc" 5563 + version = "0.53.1" 5564 source = "registry+https://github.com/rust-lang/crates.io-index" 5565 + checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" 5566 5567 [[package]] 5568 name = "winnow" ··· 5575 5576 [[package]] 5577 name = "winnow" 5578 + version = "0.7.13" 5579 source = "registry+https://github.com/rust-lang/crates.io-index" 5580 + checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" 5581 dependencies = [ 5582 "memchr", 5583 ] ··· 5593 ] 5594 5595 [[package]] 5596 + name = "wit-bindgen" 5597 + version = "0.46.0" 5598 source = "registry+https://github.com/rust-lang/crates.io-index" 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" 5606 dependencies = [ 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", 5618 ] 5619 5620 [[package]] 5621 name = "writeable" 5622 + version = "0.6.2" 5623 source = "registry+https://github.com/rust-lang/crates.io-index" 5624 + checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" 5625 5626 [[package]] 5627 name = "wry" 5628 + version = "0.53.5" 5629 source = "registry+https://github.com/rust-lang/crates.io-index" 5630 + checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2" 5631 dependencies = [ 5632 "base64 0.22.1", 5633 + "block2 0.6.2", 5634 "cookie", 5635 "crossbeam-channel", 5636 + "dirs", 5637 "dpi", 5638 "dunce", 5639 "gdkx11", ··· 5645 "kuchikiki", 5646 "libc", 5647 "ndk", 5648 + "objc2 0.6.3", 5649 "objc2-app-kit", 5650 "objc2-core-foundation", 5651 + "objc2-foundation 0.3.2", 5652 "objc2-ui-kit", 5653 "objc2-web-kit", 5654 "once_cell", ··· 5657 "sha2", 5658 "soup3", 5659 "tao-macros", 5660 + "thiserror 2.0.17", 5661 "url", 5662 "webkit2gtk", 5663 "webkit2gtk-sys", 5664 "webview2-com", 5665 "windows", 5666 + "windows-core 0.61.2", 5667 "windows-version", 5668 "x11-dl", 5669 ] ··· 5690 ] 5691 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]] 5727 name = "yoke" 5728 + version = "0.8.1" 5729 source = "registry+https://github.com/rust-lang/crates.io-index" 5730 + checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" 5731 dependencies = [ 5732 "stable_deref_trait", 5733 "yoke-derive", 5734 "zerofrom", ··· 5736 5737 [[package]] 5738 name = "yoke-derive" 5739 + version = "0.8.1" 5740 source = "registry+https://github.com/rust-lang/crates.io-index" 5741 + checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" 5742 dependencies = [ 5743 "proc-macro2", 5744 "quote", 5745 + "syn 2.0.109", 5746 "synstructure", 5747 ] 5748 5749 [[package]] 5750 name = "zbus" 5751 + version = "5.12.0" 5752 source = "registry+https://github.com/rust-lang/crates.io-index" 5753 + checksum = "b622b18155f7a93d1cd2dc8c01d2d6a44e08fb9ebb7b3f9e6ed101488bad6c91" 5754 dependencies = [ 5755 "async-broadcast", 5756 "async-executor", ··· 5770 "ordered-stream", 5771 "serde", 5772 "serde_repr", 5773 + "tokio", 5774 "tracing", 5775 "uds_windows", 5776 + "uuid", 5777 + "windows-sys 0.61.2", 5778 + "winnow 0.7.13", 5779 "zbus_macros", 5780 "zbus_names", 5781 "zvariant", ··· 5783 5784 [[package]] 5785 name = "zbus_macros" 5786 + version = "5.12.0" 5787 source = "registry+https://github.com/rust-lang/crates.io-index" 5788 + checksum = "1cdb94821ca8a87ca9c298b5d1cbd80e2a8b67115d99f6e4551ac49e42b6a314" 5789 dependencies = [ 5790 + "proc-macro-crate 3.4.0", 5791 "proc-macro2", 5792 "quote", 5793 + "syn 2.0.109", 5794 "zbus_names", 5795 "zvariant", 5796 "zvariant_utils", ··· 5804 dependencies = [ 5805 "serde", 5806 "static_assertions", 5807 + "winnow 0.7.13", 5808 "zvariant", 5809 ] 5810 5811 [[package]] 5812 name = "zerocopy" 5813 + version = "0.8.27" 5814 source = "registry+https://github.com/rust-lang/crates.io-index" 5815 + checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" 5816 dependencies = [ 5817 "zerocopy-derive", 5818 ] 5819 5820 [[package]] 5821 name = "zerocopy-derive" 5822 + version = "0.8.27" 5823 source = "registry+https://github.com/rust-lang/crates.io-index" 5824 + checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" 5825 dependencies = [ 5826 "proc-macro2", 5827 "quote", 5828 + "syn 2.0.109", 5829 ] 5830 5831 [[package]] ··· 5845 dependencies = [ 5846 "proc-macro2", 5847 "quote", 5848 + "syn 2.0.109", 5849 "synstructure", 5850 ] 5851 5852 [[package]] 5853 name = "zerotrie" 5854 + version = "0.2.3" 5855 source = "registry+https://github.com/rust-lang/crates.io-index" 5856 + checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" 5857 dependencies = [ 5858 "displaydoc", 5859 "yoke", ··· 5862 5863 [[package]] 5864 name = "zerovec" 5865 + version = "0.11.5" 5866 source = "registry+https://github.com/rust-lang/crates.io-index" 5867 + checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" 5868 dependencies = [ 5869 "yoke", 5870 "zerofrom", ··· 5873 5874 [[package]] 5875 name = "zerovec-derive" 5876 + version = "0.11.2" 5877 source = "registry+https://github.com/rust-lang/crates.io-index" 5878 + checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" 5879 dependencies = [ 5880 "proc-macro2", 5881 "quote", 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", 5898 ] 5899 5900 [[package]] 5901 name = "zvariant" 5902 + version = "5.8.0" 5903 source = "registry+https://github.com/rust-lang/crates.io-index" 5904 + checksum = "2be61892e4f2b1772727be11630a62664a1826b62efa43a6fe7449521cb8744c" 5905 dependencies = [ 5906 "endi", 5907 "enumflags2", 5908 "serde", 5909 + "url", 5910 + "winnow 0.7.13", 5911 "zvariant_derive", 5912 "zvariant_utils", 5913 ] 5914 5915 [[package]] 5916 name = "zvariant_derive" 5917 + version = "5.8.0" 5918 source = "registry+https://github.com/rust-lang/crates.io-index" 5919 + checksum = "da58575a1b2b20766513b1ec59d8e2e68db2745379f961f86650655e862d2006" 5920 dependencies = [ 5921 + "proc-macro-crate 3.4.0", 5922 "proc-macro2", 5923 "quote", 5924 + "syn 2.0.109", 5925 "zvariant_utils", 5926 ] 5927 5928 [[package]] 5929 name = "zvariant_utils" 5930 + version = "3.2.1" 5931 source = "registry+https://github.com/rust-lang/crates.io-index" 5932 + checksum = "c6949d142f89f6916deca2232cf26a8afacf2b9fdc35ce766105e104478be599" 5933 dependencies = [ 5934 "proc-macro2", 5935 "quote", 5936 "serde", 5937 + "syn 2.0.109", 5938 + "winnow 0.7.13", 5939 ]
+13 -4
src-tauri/Cargo.toml
··· 18 tauri-build = { version = "2", features = [] } 19 20 [dependencies] 21 - tauri = { version = "2", features = [] } 22 tauri-plugin-opener = "2" 23 serde = { version = "1", features = ["derive"] } 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" 28
··· 18 tauri-build = { version = "2", features = [] } 19 20 [dependencies] 21 + tauri = { version = "2", features = [ 'tray-icon', 'image-png' ] } 22 tauri-plugin-opener = "2" 23 serde = { version = "1", features = ["derive"] } 24 serde_json = "1" 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" 37
+1 -1
src-tauri/build.rs
··· 1 fn main() { 2 - tauri_build::build() 3 }
··· 1 fn main() { 2 + tauri_build::build() 3 }
+10 -3
src-tauri/capabilities/default.json
··· 2 "$schema": "../gen/schemas/desktop-schema.json", 3 "identifier": "default", 4 "description": "Capability for the main window", 5 - "windows": ["main"], 6 "permissions": [ 7 "core:default", 8 - "opener:default" 9 ] 10 - }
··· 2 "$schema": "../gen/schemas/desktop-schema.json", 3 "identifier": "default", 4 "description": "Capability for the main window", 5 + "windows": [ 6 + "main" 7 + ], 8 "permissions": [ 9 "core: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" 16 ] 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; 2 3 - use sqlx::{migrate::MigrateDatabase, Sqlite, SqlitePool}; 4 5 - use crate::utils::config::Config; 6 7 mod utils; 8 9 #[cfg_attr(mobile, tauri::mobile_entry_point)] ··· 11 pub async fn run() { 12 let container_folder = dirs::config_dir().unwrap().join("VRCMacros"); 13 14 - match fs ::metadata(&container_folder){ 15 Ok(meta) => { 16 - if meta.is_file(){ 17 - panic!("document.write('Cannot launch app as the container path is a file not a directory')"); 18 } 19 } 20 Err(_) => { ··· 22 } 23 } 24 25 - let db_file = container_folder.join("VRCMacros.db"); 26 - if !db_file.exists(){ Sqlite::create_database(db_file.to_str().unwrap()).await.unwrap(); } 27 28 - let conf_file = container_folder.join("VRCMacros.json"); 29 - if !conf_file.exists(){ fs::write(&conf_file, "{ \"setup_complete\": false }").unwrap() } 30 31 - let pool = SqlitePool::connect(db_file.to_str().unwrap()).await.unwrap(); 32 - let conf = Config::new(conf_file); 33 34 tauri::Builder::default() 35 .plugin(tauri_plugin_opener::init()) 36 - .invoke_handler(tauri::generate_handler![]) 37 - .manage(pool) 38 .manage(conf) 39 .run(tauri::generate_context!()) 40 .expect("error while running tauri application"); 41 - }
··· 1 + use std::{fs, sync::Mutex}; 2 3 + use crossbeam_channel::bounded; 4 + use frontend_calls::*; 5 6 + use crate::{osc::OSCMessage, setup::setup, utils::{config::Config, vrchat_builtin_parameters}}; 7 8 + mod frontend_calls; 9 + mod osc; 10 + mod runtime; 11 + mod setup; 12 + mod structs; 13 mod utils; 14 15 #[cfg_attr(mobile, tauri::mobile_entry_point)] ··· 17 pub async fn run() { 18 let container_folder = dirs::config_dir().unwrap().join("VRCMacros"); 19 20 + match fs::metadata(&container_folder) { 21 Ok(meta) => { 22 + if meta.is_file() { 23 + panic!("Cannot launch app as the container path is a file not a directory"); 24 } 25 } 26 Err(_) => { ··· 28 } 29 } 30 31 + let conf_file = container_folder.join("conf"); 32 + let conf = Config::new(conf_file); 33 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); 39 40 + let (runtime_sender, runtime_receiver) = bounded(1024); 41 42 tauri::Builder::default() 43 + .plugin(tauri_plugin_os::init()) 44 + .plugin(tauri_plugin_clipboard_manager::init()) 45 + .plugin(tauri_plugin_dialog::init()) 46 .plugin(tauri_plugin_opener::init()) 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 + ]) 57 .manage(conf) 58 + .manage(&ADDRESSES) 59 + .manage(runtime_sender) 60 + .setup(|app| { 61 + setup(app, &ADDRESSES, runtime_receiver); 62 + Ok(()) 63 + }) 64 .run(tauri::generate_context!()) 65 .expect("error while running tauri application"); 66 + }
+3 -1
src-tauri/src/main.rs
··· 3 4 fn main() { 5 #[cfg(target_os = "linux")] 6 - std::env::set_var("WEBKIT_DISABLE_DMABUF_RENDERER", "1"); // Fix webkit being shit 7 8 vrcmacros_lib::run() 9 }
··· 3 4 fn main() { 5 #[cfg(target_os = "linux")] 6 + unsafe{ 7 + std::env::set_var("WEBKIT_DISABLE_DMABUF_RENDERER", "1"); // Fix webkit being shit 8 + } 9 10 vrcmacros_lib::run() 11 }
+60 -42
src-tauri/src/osc.rs
··· 1 // https://gist.github.com/phaze-the-dumb/634daacb5141eae2f846e20987dba7a8 2 3 - use std::{ net::UdpSocket, sync::mpsc::Sender }; 4 5 - #[derive(Debug, Clone)] 6 - pub enum OSCValue{ 7 - Int(i32), 8 - Float(f32), 9 - Boolean(bool), 10 - String(String), 11 } 12 13 - #[derive(Debug)] 14 - pub struct OSCMessage{ 15 - pub address: String, 16 - pub values: Vec<OSCValue> 17 } 18 19 - pub fn start_server( sender: Sender<OSCMessage>, addr: &str ) { 20 let socket = UdpSocket::bind(addr).unwrap(); 21 22 loop { ··· 24 let (amt, _src) = socket.recv_from(&mut buf).unwrap(); 25 26 let buf = &mut buf[..amt]; 27 - if buf[0] != 0x2F { panic!("Packet is not an OSC Message"); } 28 29 let mut addr: Vec<u8> = Vec::new(); 30 let mut value_start = 0; 31 32 - loop{ 33 let byte = buf[value_start]; 34 - if byte == 0x00{ break; } 35 36 value_start += 1; 37 addr.push(byte); 38 } 39 40 - loop{ 41 let byte = buf[value_start]; 42 value_start += 1; 43 44 - if byte == 0x2C{ break; } 45 } 46 47 let mut types: Vec<u8> = Vec::new(); 48 49 - loop{ 50 let byte = buf[value_start]; 51 - if byte == 0x00{ break; } 52 53 types.push(byte); 54 value_start += 1; ··· 57 value_start = ((value_start as f32 / 4.0).ceil() * 4.0) as usize; 58 let mut values = Vec::new(); 59 60 - for tp in types{ 61 - match tp{ 62 0x69 => { 63 let val_buf = &buf[value_start..value_start + 4]; 64 65 let bytes = <&[u8; 4]>::try_from(val_buf).unwrap().clone(); 66 let int = i32::from_be_bytes(bytes); 67 68 - values.push(OSCValue::Int(int)); 69 value_start += 4; 70 - }, 71 0x66 => { 72 let val_buf = &buf[value_start..value_start + 4]; 73 74 let bytes = <&[u8; 4]>::try_from(val_buf).unwrap().clone(); 75 let float = f32::from_be_bytes(bytes); 76 77 - values.push(OSCValue::Float(float)); 78 value_start += 4; 79 - }, 80 - 0x54 => values.push(OSCValue::Boolean(true)), 81 - 0x46 => values.push(OSCValue::Boolean(false)), 82 _ => {} 83 } 84 } 85 86 let message = OSCMessage { 87 address: String::from_utf8(addr.clone()).unwrap(), 88 - values: values 89 }; 90 91 sender.send(message).unwrap(); 92 } 93 } 94 95 - pub fn send_message( address: &str, values: Vec<OSCValue>, ip_addr: &str ){ 96 let socket = UdpSocket::bind("127.0.0.1:0").unwrap(); 97 let mut buf: Vec<u8> = Vec::new(); 98 ··· 110 let mut value_count = 1; 111 for value in values.clone() { 112 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) 117 }; 118 119 value_count += 1; 120 } 121 122 - for _i in 0..4 - (value_count % 4) { 123 buf.push(0); 124 } 125 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 ) => { 131 let mut str_buf = val.as_bytes().to_vec(); 132 let buf_len = str_buf.len().clone(); 133 134 buf.append(&mut str_buf); 135 136 - for _i in 0..4 - (buf_len % 4) { 137 buf.push(0); 138 } 139 } ··· 141 } 142 } 143 144 - println!("{:X?}", &buf); 145 socket.send_to(&buf, ip_addr).unwrap(); 146 - }
··· 1 // https://gist.github.com/phaze-the-dumb/634daacb5141eae2f846e20987dba7a8 2 + use std::net::UdpSocket; 3 + 4 + use crossbeam_channel::Sender; 5 + use serde::Serialize; 6 7 + use crate::structs::parameter_types::ParameterType; 8 9 + #[derive(Debug, Clone, Serialize)] 10 + pub struct OSCMessage { 11 + pub address: String, 12 + pub values: Vec<ParameterType>, 13 } 14 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 + } 26 } 27 28 + // TODO: Implement osc bundles 29 + pub fn start_server(sender: Sender<OSCMessage>, addr: &str) { 30 let socket = UdpSocket::bind(addr).unwrap(); 31 32 loop { ··· 34 let (amt, _src) = socket.recv_from(&mut buf).unwrap(); 35 36 let buf = &mut buf[..amt]; 37 + if buf[0] != 0x2F { 38 + panic!("Packet is not an OSC Message"); 39 + } 40 41 let mut addr: Vec<u8> = Vec::new(); 42 let mut value_start = 0; 43 44 + loop { 45 let byte = buf[value_start]; 46 + if byte == 0x00 { 47 + break; 48 + } 49 50 value_start += 1; 51 addr.push(byte); 52 } 53 54 + loop { 55 let byte = buf[value_start]; 56 value_start += 1; 57 58 + if byte == 0x2C { 59 + break; 60 + } 61 } 62 63 let mut types: Vec<u8> = Vec::new(); 64 65 + loop { 66 let byte = buf[value_start]; 67 + if byte == 0x00 { 68 + break; 69 + } 70 71 types.push(byte); 72 value_start += 1; ··· 75 value_start = ((value_start as f32 / 4.0).ceil() * 4.0) as usize; 76 let mut values = Vec::new(); 77 78 + for tp in types { 79 + match tp { 80 0x69 => { 81 let val_buf = &buf[value_start..value_start + 4]; 82 83 let bytes = <&[u8; 4]>::try_from(val_buf).unwrap().clone(); 84 let int = i32::from_be_bytes(bytes); 85 86 + values.push(ParameterType::Int(int)); 87 value_start += 4; 88 + } 89 0x66 => { 90 let val_buf = &buf[value_start..value_start + 4]; 91 92 let bytes = <&[u8; 4]>::try_from(val_buf).unwrap().clone(); 93 let float = f32::from_be_bytes(bytes); 94 95 + values.push(ParameterType::Float(float)); 96 value_start += 4; 97 + } 98 + 0x54 => values.push(ParameterType::Boolean(true)), 99 + 0x46 => values.push(ParameterType::Boolean(false)), 100 _ => {} 101 } 102 } 103 104 let message = OSCMessage { 105 address: String::from_utf8(addr.clone()).unwrap(), 106 + values: values, 107 }; 108 109 sender.send(message).unwrap(); 110 } 111 } 112 113 + pub fn send_message(address: &str, values: Vec<ParameterType>, ip_addr: &str) { 114 let socket = UdpSocket::bind("127.0.0.1:0").unwrap(); 115 let mut buf: Vec<u8> = Vec::new(); 116 ··· 128 let mut value_count = 1; 129 for value in values.clone() { 130 match value { 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 + _ => {} 136 }; 137 138 value_count += 1; 139 } 140 141 + for _i in 0..4 - (value_count % 4) { 142 buf.push(0); 143 } 144 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) => { 150 let mut str_buf = val.as_bytes().to_vec(); 151 let buf_len = str_buf.len().clone(); 152 153 buf.append(&mut str_buf); 154 155 + for _i in 0..4 - (buf_len % 4) { 156 buf.push(0); 157 } 158 } ··· 160 } 161 } 162 163 socket.send_to(&buf, ip_addr).unwrap(); 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 "windows": [ 14 { 15 "title": "vrcmacros", 16 - "width": 1000, 17 - "height": 500 18 } 19 ], 20 "security": {
··· 13 "windows": [ 14 { 15 "title": "vrcmacros", 16 + "width": 1400, 17 + "height": 700 18 } 19 ], 20 "security": {
+1 -1
vite.config.ts
··· 6 7 // https://vitejs.dev/config/ 8 export default defineConfig(async () => ({ 9 - plugins: [solid()], 10 11 // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` 12 //
··· 6 7 // https://vitejs.dev/config/ 8 export default defineConfig(async () => ({ 9 + plugins: [ solid() ], 10 11 // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` 12 //