this repo has no description

Compare changes

Choose any two refs to compare.

+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 - }
···
+11 -9
package.json
··· 12 }, 13 "license": "MIT", 14 "dependencies": { 15 - "@tauri-apps/api": "^2", 16 - "@tauri-apps/plugin-dialog": "~2", 17 - "@tauri-apps/plugin-opener": "^2", 18 - "animejs": "^4.1.2", 19 - "solid-js": "^1.9.3" 20 }, 21 "devDependencies": { 22 - "@tauri-apps/cli": "^2", 23 "@types/animejs": "^3.1.13", 24 - "typescript": "~5.6.2", 25 - "vite": "^6.0.3", 26 - "vite-plugin-solid": "^2.11.0" 27 } 28 }
··· 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 }
+477 -437
pnpm-lock.yaml
··· 9 .: 10 dependencies: 11 '@tauri-apps/api': 12 - specifier: ^2 13 - version: 2.7.0 14 '@tauri-apps/plugin-dialog': 15 specifier: ~2 16 - version: 2.4.0 17 - '@tauri-apps/plugin-opener': 18 - specifier: ^2 19 - version: 2.4.0 20 animejs: 21 - specifier: ^4.1.2 22 - version: 4.1.2 23 solid-js: 24 - specifier: ^1.9.3 25 - version: 1.9.7 26 devDependencies: 27 '@tauri-apps/cli': 28 - specifier: ^2 29 - version: 2.7.1 30 '@types/animejs': 31 specifier: ^3.1.13 32 version: 3.1.13 33 typescript: 34 - specifier: ~5.6.2 35 version: 5.6.3 36 vite: 37 - specifier: ^6.0.3 38 - version: 6.3.5 39 vite-plugin-solid: 40 - specifier: ^2.11.0 41 - version: 2.11.8(solid-js@1.9.7)(vite@6.3.5) 42 43 packages: 44 - 45 - '@ampproject/remapping@2.3.0': 46 - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 47 - engines: {node: '>=6.0.0'} 48 49 '@babel/code-frame@7.27.1': 50 resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 51 engines: {node: '>=6.9.0'} 52 53 - '@babel/compat-data@7.28.0': 54 - resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} 55 engines: {node: '>=6.9.0'} 56 57 - '@babel/core@7.28.0': 58 - resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} 59 engines: {node: '>=6.9.0'} 60 61 - '@babel/generator@7.28.0': 62 - resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} 63 engines: {node: '>=6.9.0'} 64 65 '@babel/helper-compilation-targets@7.27.2': ··· 78 resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} 79 engines: {node: '>=6.9.0'} 80 81 - '@babel/helper-module-transforms@7.27.3': 82 - resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} 83 engines: {node: '>=6.9.0'} 84 peerDependencies: 85 '@babel/core': ^7.0.0 ··· 92 resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 93 engines: {node: '>=6.9.0'} 94 95 - '@babel/helper-validator-identifier@7.27.1': 96 - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 97 engines: {node: '>=6.9.0'} 98 99 '@babel/helper-validator-option@7.27.1': 100 resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} 101 engines: {node: '>=6.9.0'} 102 103 - '@babel/helpers@7.28.2': 104 - resolution: {integrity: sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==} 105 engines: {node: '>=6.9.0'} 106 107 - '@babel/parser@7.28.0': 108 - resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} 109 engines: {node: '>=6.0.0'} 110 hasBin: true 111 ··· 119 resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} 120 engines: {node: '>=6.9.0'} 121 122 - '@babel/traverse@7.28.0': 123 - resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} 124 engines: {node: '>=6.9.0'} 125 126 - '@babel/types@7.28.2': 127 - resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} 128 engines: {node: '>=6.9.0'} 129 130 - '@esbuild/aix-ppc64@0.25.8': 131 - resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} 132 engines: {node: '>=18'} 133 cpu: [ppc64] 134 os: [aix] 135 136 - '@esbuild/android-arm64@0.25.8': 137 - resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} 138 engines: {node: '>=18'} 139 cpu: [arm64] 140 os: [android] 141 142 - '@esbuild/android-arm@0.25.8': 143 - resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} 144 engines: {node: '>=18'} 145 cpu: [arm] 146 os: [android] 147 148 - '@esbuild/android-x64@0.25.8': 149 - resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} 150 engines: {node: '>=18'} 151 cpu: [x64] 152 os: [android] 153 154 - '@esbuild/darwin-arm64@0.25.8': 155 - resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} 156 engines: {node: '>=18'} 157 cpu: [arm64] 158 os: [darwin] 159 160 - '@esbuild/darwin-x64@0.25.8': 161 - resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} 162 engines: {node: '>=18'} 163 cpu: [x64] 164 os: [darwin] 165 166 - '@esbuild/freebsd-arm64@0.25.8': 167 - resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} 168 engines: {node: '>=18'} 169 cpu: [arm64] 170 os: [freebsd] 171 172 - '@esbuild/freebsd-x64@0.25.8': 173 - resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} 174 engines: {node: '>=18'} 175 cpu: [x64] 176 os: [freebsd] 177 178 - '@esbuild/linux-arm64@0.25.8': 179 - resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} 180 engines: {node: '>=18'} 181 cpu: [arm64] 182 os: [linux] 183 184 - '@esbuild/linux-arm@0.25.8': 185 - resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} 186 engines: {node: '>=18'} 187 cpu: [arm] 188 os: [linux] 189 190 - '@esbuild/linux-ia32@0.25.8': 191 - resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} 192 engines: {node: '>=18'} 193 cpu: [ia32] 194 os: [linux] 195 196 - '@esbuild/linux-loong64@0.25.8': 197 - resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} 198 engines: {node: '>=18'} 199 cpu: [loong64] 200 os: [linux] 201 202 - '@esbuild/linux-mips64el@0.25.8': 203 - resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} 204 engines: {node: '>=18'} 205 cpu: [mips64el] 206 os: [linux] 207 208 - '@esbuild/linux-ppc64@0.25.8': 209 - resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} 210 engines: {node: '>=18'} 211 cpu: [ppc64] 212 os: [linux] 213 214 - '@esbuild/linux-riscv64@0.25.8': 215 - resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} 216 engines: {node: '>=18'} 217 cpu: [riscv64] 218 os: [linux] 219 220 - '@esbuild/linux-s390x@0.25.8': 221 - resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} 222 engines: {node: '>=18'} 223 cpu: [s390x] 224 os: [linux] 225 226 - '@esbuild/linux-x64@0.25.8': 227 - resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} 228 engines: {node: '>=18'} 229 cpu: [x64] 230 os: [linux] 231 232 - '@esbuild/netbsd-arm64@0.25.8': 233 - resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} 234 engines: {node: '>=18'} 235 cpu: [arm64] 236 os: [netbsd] 237 238 - '@esbuild/netbsd-x64@0.25.8': 239 - resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} 240 engines: {node: '>=18'} 241 cpu: [x64] 242 os: [netbsd] 243 244 - '@esbuild/openbsd-arm64@0.25.8': 245 - resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} 246 engines: {node: '>=18'} 247 cpu: [arm64] 248 os: [openbsd] 249 250 - '@esbuild/openbsd-x64@0.25.8': 251 - resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} 252 engines: {node: '>=18'} 253 cpu: [x64] 254 os: [openbsd] 255 256 - '@esbuild/openharmony-arm64@0.25.8': 257 - resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} 258 engines: {node: '>=18'} 259 cpu: [arm64] 260 os: [openharmony] 261 262 - '@esbuild/sunos-x64@0.25.8': 263 - resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} 264 engines: {node: '>=18'} 265 cpu: [x64] 266 os: [sunos] 267 268 - '@esbuild/win32-arm64@0.25.8': 269 - resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} 270 engines: {node: '>=18'} 271 cpu: [arm64] 272 os: [win32] 273 274 - '@esbuild/win32-ia32@0.25.8': 275 - resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} 276 engines: {node: '>=18'} 277 cpu: [ia32] 278 os: [win32] 279 280 - '@esbuild/win32-x64@0.25.8': 281 - resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} 282 engines: {node: '>=18'} 283 cpu: [x64] 284 os: [win32] 285 286 - '@jridgewell/gen-mapping@0.3.12': 287 - resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} 288 289 '@jridgewell/resolve-uri@3.1.2': 290 resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 291 engines: {node: '>=6.0.0'} 292 293 - '@jridgewell/sourcemap-codec@1.5.4': 294 - resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} 295 296 - '@jridgewell/trace-mapping@0.3.29': 297 - resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} 298 299 - '@rollup/rollup-android-arm-eabi@4.46.1': 300 - resolution: {integrity: sha512-oENme6QxtLCqjChRUUo3S6X8hjCXnWmJWnedD7VbGML5GUtaOtAyx+fEEXnBXVf0CBZApMQU0Idwi0FmyxzQhw==} 301 cpu: [arm] 302 os: [android] 303 304 - '@rollup/rollup-android-arm64@4.46.1': 305 - resolution: {integrity: sha512-OikvNT3qYTl9+4qQ9Bpn6+XHM+ogtFadRLuT2EXiFQMiNkXFLQfNVppi5o28wvYdHL2s3fM0D/MZJ8UkNFZWsw==} 306 cpu: [arm64] 307 os: [android] 308 309 - '@rollup/rollup-darwin-arm64@4.46.1': 310 - resolution: {integrity: sha512-EFYNNGij2WllnzljQDQnlFTXzSJw87cpAs4TVBAWLdkvic5Uh5tISrIL6NRcxoh/b2EFBG/TK8hgRrGx94zD4A==} 311 cpu: [arm64] 312 os: [darwin] 313 314 - '@rollup/rollup-darwin-x64@4.46.1': 315 - resolution: {integrity: sha512-ZaNH06O1KeTug9WI2+GRBE5Ujt9kZw4a1+OIwnBHal92I8PxSsl5KpsrPvthRynkhMck4XPdvY0z26Cym/b7oA==} 316 cpu: [x64] 317 os: [darwin] 318 319 - '@rollup/rollup-freebsd-arm64@4.46.1': 320 - resolution: {integrity: sha512-n4SLVebZP8uUlJ2r04+g2U/xFeiQlw09Me5UFqny8HGbARl503LNH5CqFTb5U5jNxTouhRjai6qPT0CR5c/Iig==} 321 cpu: [arm64] 322 os: [freebsd] 323 324 - '@rollup/rollup-freebsd-x64@4.46.1': 325 - resolution: {integrity: sha512-8vu9c02F16heTqpvo3yeiu7Vi1REDEC/yES/dIfq3tSXe6mLndiwvYr3AAvd1tMNUqE9yeGYa5w7PRbI5QUV+w==} 326 cpu: [x64] 327 os: [freebsd] 328 329 - '@rollup/rollup-linux-arm-gnueabihf@4.46.1': 330 - resolution: {integrity: sha512-K4ncpWl7sQuyp6rWiGUvb6Q18ba8mzM0rjWJ5JgYKlIXAau1db7hZnR0ldJvqKWWJDxqzSLwGUhA4jp+KqgDtQ==} 331 cpu: [arm] 332 os: [linux] 333 334 - '@rollup/rollup-linux-arm-musleabihf@4.46.1': 335 - resolution: {integrity: sha512-YykPnXsjUjmXE6j6k2QBBGAn1YsJUix7pYaPLK3RVE0bQL2jfdbfykPxfF8AgBlqtYbfEnYHmLXNa6QETjdOjQ==} 336 cpu: [arm] 337 os: [linux] 338 339 - '@rollup/rollup-linux-arm64-gnu@4.46.1': 340 - resolution: {integrity: sha512-kKvqBGbZ8i9pCGW3a1FH3HNIVg49dXXTsChGFsHGXQaVJPLA4f/O+XmTxfklhccxdF5FefUn2hvkoGJH0ScWOA==} 341 cpu: [arm64] 342 os: [linux] 343 344 - '@rollup/rollup-linux-arm64-musl@4.46.1': 345 - resolution: {integrity: sha512-zzX5nTw1N1plmqC9RGC9vZHFuiM7ZP7oSWQGqpbmfjK7p947D518cVK1/MQudsBdcD84t6k70WNczJOct6+hdg==} 346 cpu: [arm64] 347 os: [linux] 348 349 - '@rollup/rollup-linux-loongarch64-gnu@4.46.1': 350 - resolution: {integrity: sha512-O8CwgSBo6ewPpktFfSDgB6SJN9XDcPSvuwxfejiddbIC/hn9Tg6Ai0f0eYDf3XvB/+PIWzOQL+7+TZoB8p9Yuw==} 351 cpu: [loong64] 352 os: [linux] 353 354 - '@rollup/rollup-linux-ppc64-gnu@4.46.1': 355 - resolution: {integrity: sha512-JnCfFVEKeq6G3h3z8e60kAp8Rd7QVnWCtPm7cxx+5OtP80g/3nmPtfdCXbVl063e3KsRnGSKDHUQMydmzc/wBA==} 356 cpu: [ppc64] 357 os: [linux] 358 359 - '@rollup/rollup-linux-riscv64-gnu@4.46.1': 360 - resolution: {integrity: sha512-dVxuDqS237eQXkbYzQQfdf/njgeNw6LZuVyEdUaWwRpKHhsLI+y4H/NJV8xJGU19vnOJCVwaBFgr936FHOnJsQ==} 361 cpu: [riscv64] 362 os: [linux] 363 364 - '@rollup/rollup-linux-riscv64-musl@4.46.1': 365 - resolution: {integrity: sha512-CvvgNl2hrZrTR9jXK1ye0Go0HQRT6ohQdDfWR47/KFKiLd5oN5T14jRdUVGF4tnsN8y9oSfMOqH6RuHh+ck8+w==} 366 cpu: [riscv64] 367 os: [linux] 368 369 - '@rollup/rollup-linux-s390x-gnu@4.46.1': 370 - resolution: {integrity: sha512-x7ANt2VOg2565oGHJ6rIuuAon+A8sfe1IeUx25IKqi49OjSr/K3awoNqr9gCwGEJo9OuXlOn+H2p1VJKx1psxA==} 371 cpu: [s390x] 372 os: [linux] 373 374 - '@rollup/rollup-linux-x64-gnu@4.46.1': 375 - resolution: {integrity: sha512-9OADZYryz/7E8/qt0vnaHQgmia2Y0wrjSSn1V/uL+zw/i7NUhxbX4cHXdEQ7dnJgzYDS81d8+tf6nbIdRFZQoQ==} 376 cpu: [x64] 377 os: [linux] 378 379 - '@rollup/rollup-linux-x64-musl@4.46.1': 380 - resolution: {integrity: sha512-NuvSCbXEKY+NGWHyivzbjSVJi68Xfq1VnIvGmsuXs6TCtveeoDRKutI5vf2ntmNnVq64Q4zInet0UDQ+yMB6tA==} 381 cpu: [x64] 382 os: [linux] 383 384 - '@rollup/rollup-win32-arm64-msvc@4.46.1': 385 - resolution: {integrity: sha512-mWz+6FSRb82xuUMMV1X3NGiaPFqbLN9aIueHleTZCc46cJvwTlvIh7reQLk4p97dv0nddyewBhwzryBHH7wtPw==} 386 cpu: [arm64] 387 os: [win32] 388 389 - '@rollup/rollup-win32-ia32-msvc@4.46.1': 390 - resolution: {integrity: sha512-7Thzy9TMXDw9AU4f4vsLNBxh7/VOKuXi73VH3d/kHGr0tZ3x/ewgL9uC7ojUKmH1/zvmZe2tLapYcZllk3SO8Q==} 391 cpu: [ia32] 392 os: [win32] 393 394 - '@rollup/rollup-win32-x64-msvc@4.46.1': 395 - resolution: {integrity: sha512-7GVB4luhFmGUNXXJhH2jJwZCFB3pIOixv2E3s17GQHBFUOQaISlt7aGcQgqvCaDSxTZJUzlK/QJ1FN8S94MrzQ==} 396 cpu: [x64] 397 os: [win32] 398 399 - '@tauri-apps/api@2.7.0': 400 - resolution: {integrity: sha512-v7fVE8jqBl8xJFOcBafDzXFc8FnicoH3j8o8DNNs0tHuEBmXUDqrCOAzMRX0UkfpwqZLqvrvK0GNQ45DfnoVDg==} 401 402 - '@tauri-apps/api@2.8.0': 403 - resolution: {integrity: sha512-ga7zdhbS2GXOMTIZRT0mYjKJtR9fivsXzsyq5U3vjDL0s6DTMwYRm0UHNjzTY5dh4+LSC68Sm/7WEiimbQNYlw==} 404 405 - '@tauri-apps/cli-darwin-arm64@2.7.1': 406 - resolution: {integrity: sha512-j2NXQN6+08G03xYiyKDKqbCV2Txt+hUKg0a8hYr92AmoCU8fgCjHyva/p16lGFGUG3P2Yu0xiNe1hXL9ZuRMzA==} 407 engines: {node: '>= 10'} 408 cpu: [arm64] 409 os: [darwin] 410 411 - '@tauri-apps/cli-darwin-x64@2.7.1': 412 - resolution: {integrity: sha512-CdYAefeM35zKsc91qIyKzbaO7FhzTyWKsE8hj7tEJ1INYpoh1NeNNyL/NSEA3Nebi5ilugioJ5tRK8ZXG8y3gw==} 413 engines: {node: '>= 10'} 414 cpu: [x64] 415 os: [darwin] 416 417 - '@tauri-apps/cli-linux-arm-gnueabihf@2.7.1': 418 - resolution: {integrity: sha512-dnvyJrTA1UJxJjQ8q1N/gWomjP8Twij1BUQu2fdcT3OPpqlrbOk5R1yT0oD/721xoKNjroB5BXCsmmlykllxNg==} 419 engines: {node: '>= 10'} 420 cpu: [arm] 421 os: [linux] 422 423 - '@tauri-apps/cli-linux-arm64-gnu@2.7.1': 424 - resolution: {integrity: sha512-FtBW6LJPNRTws3qyUc294AqCWU91l/H0SsFKq6q4Q45MSS4x6wxLxou8zB53tLDGEPx3JSoPLcDaSfPlSbyujQ==} 425 engines: {node: '>= 10'} 426 cpu: [arm64] 427 os: [linux] 428 429 - '@tauri-apps/cli-linux-arm64-musl@2.7.1': 430 - resolution: {integrity: sha512-/HXY0t4FHkpFzjeYS5c16mlA6z0kzn5uKLWptTLTdFSnYpr8FCnOP4Sdkvm2TDQPF2ERxXtNCd+WR/jQugbGnA==} 431 engines: {node: '>= 10'} 432 cpu: [arm64] 433 os: [linux] 434 435 - '@tauri-apps/cli-linux-riscv64-gnu@2.7.1': 436 - resolution: {integrity: sha512-GeW5lVI2GhhnaYckiDzstG2j2Jwlud5d2XefRGwlOK+C/bVGLT1le8MNPYK8wgRlpeK8fG1WnJJYD6Ke7YQ8bg==} 437 engines: {node: '>= 10'} 438 cpu: [riscv64] 439 os: [linux] 440 441 - '@tauri-apps/cli-linux-x64-gnu@2.7.1': 442 - resolution: {integrity: sha512-DprxKQkPxIPYwUgg+cscpv2lcIUhn2nxEPlk0UeaiV9vATxCXyytxr1gLcj3xgjGyNPlM0MlJyYaPy1JmRg1cA==} 443 engines: {node: '>= 10'} 444 cpu: [x64] 445 os: [linux] 446 447 - '@tauri-apps/cli-linux-x64-musl@2.7.1': 448 - resolution: {integrity: sha512-KLlq3kOK7OUyDR757c0zQjPULpGZpLhNB0lZmZpHXvoOUcqZoCXJHh4dT/mryWZJp5ilrem5l8o9ngrDo0X1AA==} 449 engines: {node: '>= 10'} 450 cpu: [x64] 451 os: [linux] 452 453 - '@tauri-apps/cli-win32-arm64-msvc@2.7.1': 454 - resolution: {integrity: sha512-dH7KUjKkSypCeWPiainHyXoES3obS+JIZVoSwSZfKq2gWgs48FY3oT0hQNYrWveE+VR4VoR3b/F3CPGbgFvksA==} 455 engines: {node: '>= 10'} 456 cpu: [arm64] 457 os: [win32] 458 459 - '@tauri-apps/cli-win32-ia32-msvc@2.7.1': 460 - resolution: {integrity: sha512-1oeibfyWQPVcijOrTg709qhbXArjX3x1MPjrmA5anlygwrbByxLBcLXvotcOeULFcnH2FYUMMLLant8kgvwE5A==} 461 engines: {node: '>= 10'} 462 cpu: [ia32] 463 os: [win32] 464 465 - '@tauri-apps/cli-win32-x64-msvc@2.7.1': 466 - resolution: {integrity: sha512-D7Q9kDObutuirCNLxYQ7KAg2Xxg99AjcdYz/KuMw5HvyEPbkC9Q7JL0vOrQOrHEHxIQ2lYzFOZvKKoC2yyqXcg==} 467 engines: {node: '>= 10'} 468 cpu: [x64] 469 os: [win32] 470 471 - '@tauri-apps/cli@2.7.1': 472 - resolution: {integrity: sha512-RcGWR4jOUEl92w3uvI0h61Llkfj9lwGD1iwvDRD2isMrDhOzjeeeVn9aGzeW1jubQ/kAbMYfydcA4BA0Cy733Q==} 473 engines: {node: '>= 10'} 474 hasBin: true 475 476 - '@tauri-apps/plugin-dialog@2.4.0': 477 - resolution: {integrity: sha512-OvXkrEBfWwtd8tzVCEXIvRfNEX87qs2jv6SqmVPiHcJjBhSF/GUvjqUNIDmKByb5N8nvDqVUM7+g1sXwdC/S9w==} 478 479 - '@tauri-apps/plugin-opener@2.4.0': 480 - resolution: {integrity: sha512-43VyN8JJtvKWJY72WI/KNZszTpDpzHULFxQs0CJBIYUdCRowQ6Q1feWTDb979N7nldqSuDOaBupZ6wz2nvuWwQ==} 481 482 '@types/animejs@3.1.13': 483 resolution: {integrity: sha512-yWg9l1z7CAv/TKpty4/vupEh24jDGUZXv4r26StRkpUPQm04ztJaftgpto8vwdFs8SiTq6XfaPKCSI+wjzNMvQ==} ··· 491 '@types/babel__template@7.4.4': 492 resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 493 494 - '@types/babel__traverse@7.20.7': 495 - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} 496 497 '@types/estree@1.0.8': 498 resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 499 500 - animejs@4.1.2: 501 - resolution: {integrity: sha512-QojQzHzN4ZCOGk4Seir5CWPHGKFPpMAsen3KEj/BHsIKDceH0xKd3FBWflyKiNefKG2fn3+ofpY9jD/UXhpY6A==} 502 503 - babel-plugin-jsx-dom-expressions@0.39.8: 504 - resolution: {integrity: sha512-/MVOIIjonylDXnrWmG23ZX82m9mtKATsVHB7zYlPfDR9Vdd/NBE48if+wv27bSkBtyO7EPMUlcUc4J63QwuACQ==} 505 peerDependencies: 506 '@babel/core': ^7.20.12 507 508 - babel-preset-solid@1.9.6: 509 - resolution: {integrity: sha512-HXTK9f93QxoH8dYn1M2mJdOlWgMsR88Lg/ul6QCZGkNTktjTE5HAf93YxQumHoCudLEtZrU1cFCMFOVho6GqFg==} 510 peerDependencies: 511 '@babel/core': ^7.0.0 512 513 - browserslist@4.25.1: 514 - resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} 515 engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 516 hasBin: true 517 518 - caniuse-lite@1.0.30001731: 519 - resolution: {integrity: sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==} 520 521 convert-source-map@2.0.0: 522 resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} ··· 524 csstype@3.1.3: 525 resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 526 527 - debug@4.4.1: 528 - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 529 engines: {node: '>=6.0'} 530 peerDependencies: 531 supports-color: '*' ··· 533 supports-color: 534 optional: true 535 536 - electron-to-chromium@1.5.192: 537 - resolution: {integrity: sha512-rP8Ez0w7UNw/9j5eSXCe10o1g/8B1P5SM90PCCMVkIRQn2R0LEHWz4Eh9RnxkniuDe1W0cTSOB3MLlkTGDcuCg==} 538 539 entities@6.0.1: 540 resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} 541 engines: {node: '>=0.12'} 542 543 - esbuild@0.25.8: 544 - resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} 545 engines: {node: '>=18'} 546 hasBin: true 547 ··· 549 resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 550 engines: {node: '>=6'} 551 552 - fdir@6.4.6: 553 - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} 554 peerDependencies: 555 picomatch: ^3 || ^4 556 peerDependenciesMeta: ··· 601 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 602 hasBin: true 603 604 - node-releases@2.0.19: 605 - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 606 607 parse5@7.3.0: 608 resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} ··· 618 resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 619 engines: {node: ^10 || ^12 || >=14} 620 621 - rollup@4.46.1: 622 - resolution: {integrity: sha512-33xGNBsDJAkzt0PvninskHlWnTIPgDtTwhg0U38CUoNP/7H6wI2Cz6dUeoNPbjdTdsYTGuiFFASuUOWovH0SyQ==} 623 engines: {node: '>=18.0.0', npm: '>=8.0.0'} 624 hasBin: true 625 ··· 627 resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 628 hasBin: true 629 630 - seroval-plugins@1.3.2: 631 - resolution: {integrity: sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==} 632 engines: {node: '>=10'} 633 peerDependencies: 634 seroval: ^1.0 ··· 637 resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} 638 engines: {node: '>=10'} 639 640 - solid-js@1.9.7: 641 - resolution: {integrity: sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw==} 642 643 solid-refresh@0.6.3: 644 resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} ··· 649 resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 650 engines: {node: '>=0.10.0'} 651 652 - tinyglobby@0.2.14: 653 - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} 654 engines: {node: '>=12.0.0'} 655 656 typescript@5.6.3: ··· 658 engines: {node: '>=14.17'} 659 hasBin: true 660 661 - update-browserslist-db@1.1.3: 662 - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 663 hasBin: true 664 peerDependencies: 665 browserslist: '>= 4.21.0' 666 667 - validate-html-nesting@1.2.3: 668 - resolution: {integrity: sha512-kdkWdCl6eCeLlRShJKbjVOU2kFKxMF8Ghu50n+crEoyx+VKm3FxAxF9z4DCy6+bbTOqNW0+jcIYRnjoIRzigRw==} 669 - 670 - vite-plugin-solid@2.11.8: 671 - resolution: {integrity: sha512-hFrCxBfv3B1BmFqnJF4JOCYpjrmi/zwyeKjcomQ0khh8HFyQ8SbuBWQ7zGojfrz6HUOBFrJBNySDi/JgAHytWg==} 672 peerDependencies: 673 '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* 674 solid-js: ^1.7.2 ··· 677 '@testing-library/jest-dom': 678 optional: true 679 680 - vite@6.3.5: 681 - resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} 682 engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 683 hasBin: true 684 peerDependencies: ··· 730 731 snapshots: 732 733 - '@ampproject/remapping@2.3.0': 734 - dependencies: 735 - '@jridgewell/gen-mapping': 0.3.12 736 - '@jridgewell/trace-mapping': 0.3.29 737 - 738 '@babel/code-frame@7.27.1': 739 dependencies: 740 - '@babel/helper-validator-identifier': 7.27.1 741 js-tokens: 4.0.0 742 picocolors: 1.1.1 743 744 - '@babel/compat-data@7.28.0': {} 745 746 - '@babel/core@7.28.0': 747 dependencies: 748 - '@ampproject/remapping': 2.3.0 749 '@babel/code-frame': 7.27.1 750 - '@babel/generator': 7.28.0 751 '@babel/helper-compilation-targets': 7.27.2 752 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) 753 - '@babel/helpers': 7.28.2 754 - '@babel/parser': 7.28.0 755 '@babel/template': 7.27.2 756 - '@babel/traverse': 7.28.0 757 - '@babel/types': 7.28.2 758 convert-source-map: 2.0.0 759 - debug: 4.4.1 760 gensync: 1.0.0-beta.2 761 json5: 2.2.3 762 semver: 6.3.1 763 transitivePeerDependencies: 764 - supports-color 765 766 - '@babel/generator@7.28.0': 767 dependencies: 768 - '@babel/parser': 7.28.0 769 - '@babel/types': 7.28.2 770 - '@jridgewell/gen-mapping': 0.3.12 771 - '@jridgewell/trace-mapping': 0.3.29 772 jsesc: 3.1.0 773 774 '@babel/helper-compilation-targets@7.27.2': 775 dependencies: 776 - '@babel/compat-data': 7.28.0 777 '@babel/helper-validator-option': 7.27.1 778 - browserslist: 4.25.1 779 lru-cache: 5.1.1 780 semver: 6.3.1 781 ··· 783 784 '@babel/helper-module-imports@7.18.6': 785 dependencies: 786 - '@babel/types': 7.28.2 787 788 '@babel/helper-module-imports@7.27.1': 789 dependencies: 790 - '@babel/traverse': 7.28.0 791 - '@babel/types': 7.28.2 792 transitivePeerDependencies: 793 - supports-color 794 795 - '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': 796 dependencies: 797 - '@babel/core': 7.28.0 798 '@babel/helper-module-imports': 7.27.1 799 - '@babel/helper-validator-identifier': 7.27.1 800 - '@babel/traverse': 7.28.0 801 transitivePeerDependencies: 802 - supports-color 803 ··· 805 806 '@babel/helper-string-parser@7.27.1': {} 807 808 - '@babel/helper-validator-identifier@7.27.1': {} 809 810 '@babel/helper-validator-option@7.27.1': {} 811 812 - '@babel/helpers@7.28.2': 813 dependencies: 814 '@babel/template': 7.27.2 815 - '@babel/types': 7.28.2 816 817 - '@babel/parser@7.28.0': 818 dependencies: 819 - '@babel/types': 7.28.2 820 821 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': 822 dependencies: 823 - '@babel/core': 7.28.0 824 '@babel/helper-plugin-utils': 7.27.1 825 826 '@babel/template@7.27.2': 827 dependencies: 828 '@babel/code-frame': 7.27.1 829 - '@babel/parser': 7.28.0 830 - '@babel/types': 7.28.2 831 832 - '@babel/traverse@7.28.0': 833 dependencies: 834 '@babel/code-frame': 7.27.1 835 - '@babel/generator': 7.28.0 836 '@babel/helper-globals': 7.28.0 837 - '@babel/parser': 7.28.0 838 '@babel/template': 7.27.2 839 - '@babel/types': 7.28.2 840 - debug: 4.4.1 841 transitivePeerDependencies: 842 - supports-color 843 844 - '@babel/types@7.28.2': 845 dependencies: 846 '@babel/helper-string-parser': 7.27.1 847 - '@babel/helper-validator-identifier': 7.27.1 848 849 - '@esbuild/aix-ppc64@0.25.8': 850 optional: true 851 852 - '@esbuild/android-arm64@0.25.8': 853 optional: true 854 855 - '@esbuild/android-arm@0.25.8': 856 optional: true 857 858 - '@esbuild/android-x64@0.25.8': 859 optional: true 860 861 - '@esbuild/darwin-arm64@0.25.8': 862 optional: true 863 864 - '@esbuild/darwin-x64@0.25.8': 865 optional: true 866 867 - '@esbuild/freebsd-arm64@0.25.8': 868 optional: true 869 870 - '@esbuild/freebsd-x64@0.25.8': 871 optional: true 872 873 - '@esbuild/linux-arm64@0.25.8': 874 optional: true 875 876 - '@esbuild/linux-arm@0.25.8': 877 optional: true 878 879 - '@esbuild/linux-ia32@0.25.8': 880 optional: true 881 882 - '@esbuild/linux-loong64@0.25.8': 883 optional: true 884 885 - '@esbuild/linux-mips64el@0.25.8': 886 optional: true 887 888 - '@esbuild/linux-ppc64@0.25.8': 889 optional: true 890 891 - '@esbuild/linux-riscv64@0.25.8': 892 optional: true 893 894 - '@esbuild/linux-s390x@0.25.8': 895 optional: true 896 897 - '@esbuild/linux-x64@0.25.8': 898 optional: true 899 900 - '@esbuild/netbsd-arm64@0.25.8': 901 optional: true 902 903 - '@esbuild/netbsd-x64@0.25.8': 904 optional: true 905 906 - '@esbuild/openbsd-arm64@0.25.8': 907 optional: true 908 909 - '@esbuild/openbsd-x64@0.25.8': 910 optional: true 911 912 - '@esbuild/openharmony-arm64@0.25.8': 913 optional: true 914 915 - '@esbuild/sunos-x64@0.25.8': 916 optional: true 917 918 - '@esbuild/win32-arm64@0.25.8': 919 optional: true 920 921 - '@esbuild/win32-ia32@0.25.8': 922 optional: true 923 924 - '@esbuild/win32-x64@0.25.8': 925 optional: true 926 927 - '@jridgewell/gen-mapping@0.3.12': 928 dependencies: 929 - '@jridgewell/sourcemap-codec': 1.5.4 930 - '@jridgewell/trace-mapping': 0.3.29 931 932 '@jridgewell/resolve-uri@3.1.2': {} 933 934 - '@jridgewell/sourcemap-codec@1.5.4': {} 935 936 - '@jridgewell/trace-mapping@0.3.29': 937 dependencies: 938 '@jridgewell/resolve-uri': 3.1.2 939 - '@jridgewell/sourcemap-codec': 1.5.4 940 941 - '@rollup/rollup-android-arm-eabi@4.46.1': 942 optional: true 943 944 - '@rollup/rollup-android-arm64@4.46.1': 945 optional: true 946 947 - '@rollup/rollup-darwin-arm64@4.46.1': 948 optional: true 949 950 - '@rollup/rollup-darwin-x64@4.46.1': 951 optional: true 952 953 - '@rollup/rollup-freebsd-arm64@4.46.1': 954 optional: true 955 956 - '@rollup/rollup-freebsd-x64@4.46.1': 957 optional: true 958 959 - '@rollup/rollup-linux-arm-gnueabihf@4.46.1': 960 optional: true 961 962 - '@rollup/rollup-linux-arm-musleabihf@4.46.1': 963 optional: true 964 965 - '@rollup/rollup-linux-arm64-gnu@4.46.1': 966 optional: true 967 968 - '@rollup/rollup-linux-arm64-musl@4.46.1': 969 optional: true 970 971 - '@rollup/rollup-linux-loongarch64-gnu@4.46.1': 972 optional: true 973 974 - '@rollup/rollup-linux-ppc64-gnu@4.46.1': 975 optional: true 976 977 - '@rollup/rollup-linux-riscv64-gnu@4.46.1': 978 optional: true 979 980 - '@rollup/rollup-linux-riscv64-musl@4.46.1': 981 optional: true 982 983 - '@rollup/rollup-linux-s390x-gnu@4.46.1': 984 optional: true 985 986 - '@rollup/rollup-linux-x64-gnu@4.46.1': 987 optional: true 988 989 - '@rollup/rollup-linux-x64-musl@4.46.1': 990 optional: true 991 992 - '@rollup/rollup-win32-arm64-msvc@4.46.1': 993 optional: true 994 995 - '@rollup/rollup-win32-ia32-msvc@4.46.1': 996 optional: true 997 998 - '@rollup/rollup-win32-x64-msvc@4.46.1': 999 optional: true 1000 1001 - '@tauri-apps/api@2.7.0': {} 1002 1003 - '@tauri-apps/api@2.8.0': {} 1004 1005 - '@tauri-apps/cli-darwin-arm64@2.7.1': 1006 optional: true 1007 1008 - '@tauri-apps/cli-darwin-x64@2.7.1': 1009 optional: true 1010 1011 - '@tauri-apps/cli-linux-arm-gnueabihf@2.7.1': 1012 optional: true 1013 1014 - '@tauri-apps/cli-linux-arm64-gnu@2.7.1': 1015 optional: true 1016 1017 - '@tauri-apps/cli-linux-arm64-musl@2.7.1': 1018 optional: true 1019 1020 - '@tauri-apps/cli-linux-riscv64-gnu@2.7.1': 1021 optional: true 1022 1023 - '@tauri-apps/cli-linux-x64-gnu@2.7.1': 1024 optional: true 1025 1026 - '@tauri-apps/cli-linux-x64-musl@2.7.1': 1027 optional: true 1028 1029 - '@tauri-apps/cli-win32-arm64-msvc@2.7.1': 1030 optional: true 1031 1032 - '@tauri-apps/cli-win32-ia32-msvc@2.7.1': 1033 optional: true 1034 1035 - '@tauri-apps/cli-win32-x64-msvc@2.7.1': 1036 optional: true 1037 1038 - '@tauri-apps/cli@2.7.1': 1039 optionalDependencies: 1040 - '@tauri-apps/cli-darwin-arm64': 2.7.1 1041 - '@tauri-apps/cli-darwin-x64': 2.7.1 1042 - '@tauri-apps/cli-linux-arm-gnueabihf': 2.7.1 1043 - '@tauri-apps/cli-linux-arm64-gnu': 2.7.1 1044 - '@tauri-apps/cli-linux-arm64-musl': 2.7.1 1045 - '@tauri-apps/cli-linux-riscv64-gnu': 2.7.1 1046 - '@tauri-apps/cli-linux-x64-gnu': 2.7.1 1047 - '@tauri-apps/cli-linux-x64-musl': 2.7.1 1048 - '@tauri-apps/cli-win32-arm64-msvc': 2.7.1 1049 - '@tauri-apps/cli-win32-ia32-msvc': 2.7.1 1050 - '@tauri-apps/cli-win32-x64-msvc': 2.7.1 1051 1052 - '@tauri-apps/plugin-dialog@2.4.0': 1053 dependencies: 1054 - '@tauri-apps/api': 2.8.0 1055 1056 - '@tauri-apps/plugin-opener@2.4.0': 1057 dependencies: 1058 - '@tauri-apps/api': 2.7.0 1059 1060 '@types/animejs@3.1.13': {} 1061 1062 '@types/babel__core@7.20.5': 1063 dependencies: 1064 - '@babel/parser': 7.28.0 1065 - '@babel/types': 7.28.2 1066 '@types/babel__generator': 7.27.0 1067 '@types/babel__template': 7.4.4 1068 - '@types/babel__traverse': 7.20.7 1069 1070 '@types/babel__generator@7.27.0': 1071 dependencies: 1072 - '@babel/types': 7.28.2 1073 1074 '@types/babel__template@7.4.4': 1075 dependencies: 1076 - '@babel/parser': 7.28.0 1077 - '@babel/types': 7.28.2 1078 1079 - '@types/babel__traverse@7.20.7': 1080 dependencies: 1081 - '@babel/types': 7.28.2 1082 1083 '@types/estree@1.0.8': {} 1084 1085 - animejs@4.1.2: {} 1086 1087 - babel-plugin-jsx-dom-expressions@0.39.8(@babel/core@7.28.0): 1088 dependencies: 1089 - '@babel/core': 7.28.0 1090 '@babel/helper-module-imports': 7.18.6 1091 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) 1092 - '@babel/types': 7.28.2 1093 html-entities: 2.3.3 1094 parse5: 7.3.0 1095 - validate-html-nesting: 1.2.3 1096 1097 - babel-preset-solid@1.9.6(@babel/core@7.28.0): 1098 dependencies: 1099 - '@babel/core': 7.28.0 1100 - babel-plugin-jsx-dom-expressions: 0.39.8(@babel/core@7.28.0) 1101 1102 - browserslist@4.25.1: 1103 dependencies: 1104 - caniuse-lite: 1.0.30001731 1105 - electron-to-chromium: 1.5.192 1106 - node-releases: 2.0.19 1107 - update-browserslist-db: 1.1.3(browserslist@4.25.1) 1108 1109 - caniuse-lite@1.0.30001731: {} 1110 1111 convert-source-map@2.0.0: {} 1112 1113 csstype@3.1.3: {} 1114 1115 - debug@4.4.1: 1116 dependencies: 1117 ms: 2.1.3 1118 1119 - electron-to-chromium@1.5.192: {} 1120 1121 entities@6.0.1: {} 1122 1123 - esbuild@0.25.8: 1124 optionalDependencies: 1125 - '@esbuild/aix-ppc64': 0.25.8 1126 - '@esbuild/android-arm': 0.25.8 1127 - '@esbuild/android-arm64': 0.25.8 1128 - '@esbuild/android-x64': 0.25.8 1129 - '@esbuild/darwin-arm64': 0.25.8 1130 - '@esbuild/darwin-x64': 0.25.8 1131 - '@esbuild/freebsd-arm64': 0.25.8 1132 - '@esbuild/freebsd-x64': 0.25.8 1133 - '@esbuild/linux-arm': 0.25.8 1134 - '@esbuild/linux-arm64': 0.25.8 1135 - '@esbuild/linux-ia32': 0.25.8 1136 - '@esbuild/linux-loong64': 0.25.8 1137 - '@esbuild/linux-mips64el': 0.25.8 1138 - '@esbuild/linux-ppc64': 0.25.8 1139 - '@esbuild/linux-riscv64': 0.25.8 1140 - '@esbuild/linux-s390x': 0.25.8 1141 - '@esbuild/linux-x64': 0.25.8 1142 - '@esbuild/netbsd-arm64': 0.25.8 1143 - '@esbuild/netbsd-x64': 0.25.8 1144 - '@esbuild/openbsd-arm64': 0.25.8 1145 - '@esbuild/openbsd-x64': 0.25.8 1146 - '@esbuild/openharmony-arm64': 0.25.8 1147 - '@esbuild/sunos-x64': 0.25.8 1148 - '@esbuild/win32-arm64': 0.25.8 1149 - '@esbuild/win32-ia32': 0.25.8 1150 - '@esbuild/win32-x64': 0.25.8 1151 1152 escalade@3.2.0: {} 1153 1154 - fdir@6.4.6(picomatch@4.0.3): 1155 optionalDependencies: 1156 picomatch: 4.0.3 1157 ··· 1182 1183 nanoid@3.3.11: {} 1184 1185 - node-releases@2.0.19: {} 1186 1187 parse5@7.3.0: 1188 dependencies: ··· 1198 picocolors: 1.1.1 1199 source-map-js: 1.2.1 1200 1201 - rollup@4.46.1: 1202 dependencies: 1203 '@types/estree': 1.0.8 1204 optionalDependencies: 1205 - '@rollup/rollup-android-arm-eabi': 4.46.1 1206 - '@rollup/rollup-android-arm64': 4.46.1 1207 - '@rollup/rollup-darwin-arm64': 4.46.1 1208 - '@rollup/rollup-darwin-x64': 4.46.1 1209 - '@rollup/rollup-freebsd-arm64': 4.46.1 1210 - '@rollup/rollup-freebsd-x64': 4.46.1 1211 - '@rollup/rollup-linux-arm-gnueabihf': 4.46.1 1212 - '@rollup/rollup-linux-arm-musleabihf': 4.46.1 1213 - '@rollup/rollup-linux-arm64-gnu': 4.46.1 1214 - '@rollup/rollup-linux-arm64-musl': 4.46.1 1215 - '@rollup/rollup-linux-loongarch64-gnu': 4.46.1 1216 - '@rollup/rollup-linux-ppc64-gnu': 4.46.1 1217 - '@rollup/rollup-linux-riscv64-gnu': 4.46.1 1218 - '@rollup/rollup-linux-riscv64-musl': 4.46.1 1219 - '@rollup/rollup-linux-s390x-gnu': 4.46.1 1220 - '@rollup/rollup-linux-x64-gnu': 4.46.1 1221 - '@rollup/rollup-linux-x64-musl': 4.46.1 1222 - '@rollup/rollup-win32-arm64-msvc': 4.46.1 1223 - '@rollup/rollup-win32-ia32-msvc': 4.46.1 1224 - '@rollup/rollup-win32-x64-msvc': 4.46.1 1225 fsevents: 2.3.3 1226 1227 semver@6.3.1: {} 1228 1229 - seroval-plugins@1.3.2(seroval@1.3.2): 1230 dependencies: 1231 seroval: 1.3.2 1232 1233 seroval@1.3.2: {} 1234 1235 - solid-js@1.9.7: 1236 dependencies: 1237 csstype: 3.1.3 1238 seroval: 1.3.2 1239 - seroval-plugins: 1.3.2(seroval@1.3.2) 1240 1241 - solid-refresh@0.6.3(solid-js@1.9.7): 1242 dependencies: 1243 - '@babel/generator': 7.28.0 1244 '@babel/helper-module-imports': 7.27.1 1245 - '@babel/types': 7.28.2 1246 - solid-js: 1.9.7 1247 transitivePeerDependencies: 1248 - supports-color 1249 1250 source-map-js@1.2.1: {} 1251 1252 - tinyglobby@0.2.14: 1253 dependencies: 1254 - fdir: 6.4.6(picomatch@4.0.3) 1255 picomatch: 4.0.3 1256 1257 typescript@5.6.3: {} 1258 1259 - update-browserslist-db@1.1.3(browserslist@4.25.1): 1260 dependencies: 1261 - browserslist: 4.25.1 1262 escalade: 3.2.0 1263 picocolors: 1.1.1 1264 1265 - validate-html-nesting@1.2.3: {} 1266 - 1267 - vite-plugin-solid@2.11.8(solid-js@1.9.7)(vite@6.3.5): 1268 dependencies: 1269 - '@babel/core': 7.28.0 1270 '@types/babel__core': 7.20.5 1271 - babel-preset-solid: 1.9.6(@babel/core@7.28.0) 1272 merge-anything: 5.1.7 1273 - solid-js: 1.9.7 1274 - solid-refresh: 0.6.3(solid-js@1.9.7) 1275 - vite: 6.3.5 1276 - vitefu: 1.1.1(vite@6.3.5) 1277 transitivePeerDependencies: 1278 - supports-color 1279 1280 - vite@6.3.5: 1281 dependencies: 1282 - esbuild: 0.25.8 1283 - fdir: 6.4.6(picomatch@4.0.3) 1284 picomatch: 4.0.3 1285 postcss: 8.5.6 1286 - rollup: 4.46.1 1287 - tinyglobby: 0.2.14 1288 optionalDependencies: 1289 fsevents: 2.3.3 1290 1291 - vitefu@1.1.1(vite@6.3.5): 1292 optionalDependencies: 1293 - vite: 6.3.5 1294 1295 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/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/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>
+5
src/App.css
··· 1 body{ 2 background: #1f2129; 3 background-attachment: fixed;
··· 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;
+156 -55
src/App.tsx
··· 1 - import { 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, NodeIOResolveAnyTypes } from "./structs/node"; 6 import { isPointInRect, isPointInRectApplyOffset, screenToWorldSpace } from "./utils/interections"; 7 import { ControlBar } from "./components/ControlBar"; 8 import { CanvasContextMenu } from "./ContextMenu/Canvas"; ··· 12 import { TabMenu } from "./components/TabMenu"; 13 import { ConfirmationPopup } from "./components/ConfirmationPopup"; 14 15 - let App = () => { 16 - // TODO: Delete selected node when delete key is pressed 17 - // TODO: Keybind system 18 - // TODO: Add undo / redo -ing 19 20 - let [ selectedNode, setSelectedNode ] = createSignal<Node | null>(null); 21 22 let canvas!: HTMLCanvasElement; 23 let ctx: CanvasRenderingContext2D; ··· 58 visible: false 59 } 60 61 - onMount(() => { 62 - NodeManager.Instance.HookTabChange(() => setSelectedNode(null)); 63 64 ctx = canvas.getContext('2d')!; 65 ··· 102 } 103 104 if(clickedNode){ 105 - contextMenu.items = NodeContextMenu(clickedNode); 106 } else{ 107 contextMenu.items = CanvasContextMenu; 108 } ··· 111 contextMenu.visible = true; 112 } 113 114 canvas.onmousedown = ( e ) => { 115 if( 116 e.clientY < 60 || 117 e.clientX < 220 || ··· 157 158 if(nodes){ 159 nodes.map(node => { 160 - node.selected = false; 161 - 162 if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 163 e.clientX, e.clientY, 164 - node.x, node.y, node.w, node.h 165 )){ 166 node.outputs.map(( output, i ) => { 167 if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 168 e.clientX, e.clientY, 169 - node.x + (node.w - 30), 170 node.y + 50 + (30 * i), 171 20, 20 172 )){ 173 output.index = i; 174 175 - drawingTo = [ node.x + (node.w - 30), node.y + 50 + (30 * i) ]; 176 drawingFrom = output; 177 178 isDrawing = true; ··· 183 node.inputs.map(( input, i ) => { 184 if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 185 e.clientX, e.clientY, 186 - node.x + 10, 187 node.y + 50 + (30 * i), 188 20, 20 189 )){ ··· 213 } 214 215 movingNode = clickedNode; 216 - 217 - if(clickedNode){ 218 - clickedNode.selected = true; 219 - setSelectedNode(clickedNode); 220 - } 221 222 isMouseDown = true; 223 mouseStartPos = [ e.clientX, e.clientY ]; 224 } 225 226 canvas.onmousemove = ( e ) => { 227 if(isMouseDown){ 228 if(isDrawing){ 229 drawingTo = screenToWorldSpace(canvas, { x: offset[0], y: offset[1], scale }, e.clientX - 10 * scale, e.clientY - 10 * scale) as [ number, number ]; 230 } else if(movingNode){ 231 - movingNode.x = movingNode.x - (mouseStartPos[0] - e.clientX) / scale; 232 - movingNode.y = movingNode.y - (mouseStartPos[1] - e.clientY) / scale; 233 234 - mouseStartPos = [ e.clientX, e.clientY ]; 235 NodeManager.Instance.UpdateConfig(); 236 } else{ 237 - offsetTarget = [ offsetTarget[0] - (mouseStartPos[0] - e.clientX) / scale, offsetTarget[1] - (mouseStartPos[1] - e.clientY) / scale ]; 238 - mouseStartPos = [ e.clientX, e.clientY ]; 239 240 screenMoved = true; 241 } ··· 279 280 canvas.onmouseup = ( e ) => { 281 let nodes = NodeManager.Instance.GetNodes(); 282 283 if(nodes){ 284 nodes.map(node => { 285 - node.inputs.map(( input, i ) => { 286 - if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 287 - e.clientX, e.clientY, 288 - node.x + 10, 289 - node.y + 50 + (30 * i), 290 - 20, 20 291 - )){ 292 - if(isDrawing){ 293 - let fromType = NodeIOResolveAnyTypes(drawingFrom!); 294 - let toType = NodeIOResolveAnyTypes(input); 295 296 - if( 297 - drawingFrom!.connections.indexOf(input) === -1 && 298 - ( 299 - toType === null || 300 - fromType === toType 301 - ) 302 - ){ 303 - drawingFrom!.connections.push(input); 304 - input.connections.push(drawingFrom!); 305 306 - NodeManager.Instance.UpdateConfig(); 307 } 308 } 309 - } 310 - }) 311 }) 312 } 313 314 isDrawing = false; 315 isMouseDown = false; 316 } 317 318 requestAnimationFrame(update); 319 }); 320 321 let update = () => { 322 if(stopRender)return; 323 - 324 scale = lerp(scale, targetScale, 0.25); 325 326 offset[0] = lerp(offset[0], offsetTarget[0], 0.5); ··· 345 346 let isMouseDown = false; 347 let mouseStartPos = [ 0, 0 ]; 348 349 let interval = setInterval(() => { 350 if(screenMoved){ ··· 354 } 355 }, 1000); 356 357 - onCleanup(() => { 358 - stopRender = true; 359 - window.clearInterval(interval); 360 - }); 361 - 362 return ( 363 <> 364 <ConfirmationPopup /> 365 <TabMenu /> 366 - <ControlBar node={selectedNode} lockMovement={( lock ) => lockMovement = lock} /> 367 <canvas ref={canvas}/> 368 </> 369 );
··· 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"; ··· 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; ··· 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 ··· 114 } 115 116 if(clickedNode){ 117 + contextMenu.items = NodeContextMenu(clickedNode, selectedNodes, setSelectedNodes); 118 } else{ 119 contextMenu.items = CanvasContextMenu; 120 } ··· 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 || ··· 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; ··· 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 )){ ··· 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 } ··· 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); ··· 450 451 let isMouseDown = false; 452 let mouseStartPos = [ 0, 0 ]; 453 + let mouseMovePos = [ 0, 0 ]; 454 455 let interval = setInterval(() => { 456 if(screenMoved){ ··· 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 );
+14 -2
src/ContextMenu/Node.tsx
··· 1 import { NodeManager } from "../Mangers/NodeManager"; 2 import { PositionInfo } from "../renderer"; 3 import { Node } from "../structs/node"; 4 5 - export let NodeContextMenu = ( clickedNode: Node ) => [ 6 { 7 text: "Delete Node", 8 clicked: ( _e: MouseEvent, _canvas: HTMLCanvasElement, _position: PositionInfo ) => { ··· 18 }) 19 }) 20 21 - // TODO: If node is currently selected, deselect it. 22 NodeManager.Instance.RemoveNode(clickedNode!) 23 }, 24 hovered: false
··· 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 ) => { ··· 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
+109 -17
src/Mangers/NodeManager.tsx
··· 7 import { NodesByID } from "../Nodes/Nodes"; 8 import { save } from "@tauri-apps/plugin-dialog"; 9 import { ConfirmationManager } from "./ConfirmationManager"; 10 11 export interface TabHashMap { 12 [details: string] : Tab; ··· 22 23 constructor(){ 24 NodeManager.Instance = this; 25 26 listen('load_new_tab', ( ev: any ) => { 27 - this._loadFromConfig(ev.payload.path, ev.payload.graph); 28 - }) 29 } 30 31 32 private _tabUpdateHook: ( tabs: TabHashMap ) => void = () => {}; 33 private _tabChangeHook: () => void = () => {}; 34 35 - public async AddTab( name: string ): Promise<Tab>{ 36 let [ selected, setSelected ] = createSignal(false); 37 let [ needsSave, setNeedsSave ] = createSignal(false); 38 39 let tab: Tab = { 40 name: name, 41 - id: await NodeManager.Instance.GetNewNodeId(), 42 nodes: [], 43 saveLocation: null, 44 ··· 48 needsSave, 49 setNeedsSave, 50 51 - refuseSync: false 52 }; 53 54 this._tabs[tab.id] = tab; ··· 143 } 144 } 145 146 - public async SaveTab( tab: Tab ){ 147 let path = 148 - tab.saveLocation || 149 await save({ defaultPath: tab.name + '.macro', filters: [ { name: 'Macro Files', extensions: [ 'macro' ] } ] }); 150 151 - if(!path)return; 152 153 tab.saveLocation = path; 154 tab.setNeedsSave(false); ··· 195 } 196 197 198 - public UpdateConfig(){ 199 if(!this._selectedTab)return; 200 let tab = this._tabs[this._selectedTab]; 201 if(!tab)return; 202 203 - if(tab.refuseSync)return; 204 - invoke('sync_tab', { graph: this._generateTabGraph(tab.id)[0], id: tab.id }); 205 206 - tab.setNeedsSave(true); 207 } 208 209 - private async _loadFromConfig( path: string, config: string ){ 210 let json = JSON.parse(config); 211 212 if( ··· 215 !json.graph 216 )return; 217 218 - let tab = await this.AddTab(json.tab_name); 219 - tab.refuseSync = true; 220 tab.saveLocation = path; 221 222 this._nodes = []; ··· 247 let input = output.connections[k]; 248 let node = this._nodes.find(x => x.id === input.node)!; 249 250 let realInput = node.inputs.find(x => x.index === input.index); 251 let realOutput = outputParentNode.outputs[j]; 252 ··· 272 tab.setNeedsSave(false); 273 tab.nodes = this._nodes; 274 275 - tab.refuseSync = false; 276 - this.UpdateConfig(); 277 } 278 279 private _generateTabGraph( tabId: string | null ): [ any, Tab | null ]{ ··· 289 let node = tab.nodes[i]; 290 291 let nodeOutputs = []; 292 293 for (let j = 0; j < node.outputs.length; j++) { 294 let output = node.outputs[j]; ··· 305 }) 306 } 307 308 nodesToSave.push({ 309 name: node.name, 310 id: node.id, 311 typeId: node.typeId, 312 pos: [ node.x, node.y ], 313 outputs: nodeOutputs, 314 statics: node.statics 315 }) 316 } ··· 325 invoke('save_graph', { graph: JSON.stringify({ 326 tab_name: tab.name, 327 version: await getVersion(), 328 graph: nodesToSave 329 }), path }); 330 }
··· 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; ··· 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 ··· 117 needsSave, 118 setNeedsSave, 119 120 + needSync: false 121 }; 122 123 this._tabs[tab.id] = tab; ··· 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); ··· 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( ··· 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 = []; ··· 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 ··· 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 ]{ ··· 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]; ··· 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 } ··· 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 }
+2 -1
src/Nodes/Conditional/IfEqual.tsx
··· 2 import { NodeDefinition } from "../Nodes"; 3 4 export let NodeConditionalIfEqual: NodeDefinition = { 5 isSingle: true, 6 name: 'If Equal', 7 typeId: 'ifequal', 8 9 w: 220, 10 - h: 150, 11 12 statics: [{ 13 type: NodeType.Label,
··· 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,
+2 -1
src/Nodes/Conditional/IfFalse.tsx
··· 2 import { NodeDefinition } from "../Nodes"; 3 4 export let NodeConditionalIfFalse: NodeDefinition = { 5 isSingle: true, 6 name: 'If False', 7 typeId: 'iffalse', 8 9 w: 220, 10 - h: 150, 11 12 statics: [{ 13 type: NodeType.Label,
··· 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,
+2 -1
src/Nodes/Conditional/IfTrue.tsx
··· 2 import { NodeDefinition } from "../Nodes"; 3 4 export let NodeConditionalIfTrue: NodeDefinition = { 5 isSingle: true, 6 name: 'If True', 7 typeId: 'iftrue', 8 9 w: 220, 10 - h: 150, 11 12 statics: [{ 13 type: NodeType.Label,
··· 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,
+2
src/Nodes/Conditional.tsx
··· 5 import { NodeConditionalIfFalse } from "./Conditional/IfFalse"; 6 7 export let NodeConditional: NodeDefinition = { 8 isSingle: false, 9 name: 'Conditional', 10 items: [
··· 5 import { NodeConditionalIfFalse } from "./Conditional/IfFalse"; 6 7 export let NodeConditional: NodeDefinition = { 8 + os: 'any', 9 + 10 isSingle: false, 11 name: 'Conditional', 12 items: [
+2 -1
src/Nodes/Debug.tsx
··· 2 import { NodeDefinition } from "./Nodes"; 3 4 export let NodeDebug: NodeDefinition = { 5 isSingle: true, 6 name: 'Debug', 7 typeId: 'debug', 8 9 w: 200, 10 - h: 110, 11 12 statics: [ 13 {
··· 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 {
+24 -3
src/Nodes/Nodes.tsx
··· 1 import { Node, NodeStatic, NodeType } from "../structs/node"; 2 3 import { NodeConditional } from "./Conditional"; 4 import { NodeDebug } from "./Debug"; 5 import { NodeOSCActions } from "./OSCActions"; 6 import { NodeOSCTrigger } from "./OSCTrigger"; 7 import { NodeStatics } from "./Statics"; 8 9 export interface NodeDefinition{ 10 isSingle: boolean, 11 name: string, 12 typeId?: string, 13 onStaticsUpdate?: ( node: Node ) => Promise<void>, 14 // build?: ( pos: [ number, number ], onStaticsUpdate: ( node: Node ) => void ) => Promise<Node>, 15 w?: number, 16 - h?: number, 17 statics?: NodeStatic[], 18 inputs?: { name: string, type: NodeType }[], 19 outputs?: { name: string, type: NodeType }[], ··· 25 [details: string] : NodeDefinition; 26 } 27 28 - export let Nodes: NodeDefinition[] = [ 29 NodeOSCTrigger, 30 NodeConditional, 31 NodeStatics, 32 NodeOSCActions, 33 - NodeDebug 34 ] 35 36 export let NodesByID: NodeDefinitionHashMap = {} 37
··· 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 }[], ··· 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
+2 -1
src/Nodes/OSCActions/Send Chatbox.tsx
··· 2 import { NodeDefinition } from "../Nodes"; 3 4 export let NodeOSCActionsSendChatbox: NodeDefinition = { 5 isSingle: true, 6 name: 'Send Chatbox', 7 typeId: 'oscsendchatbox', 8 9 w: 200, 10 - h: 120, 11 12 statics: [{ 13 type: NodeType.Label,
··· 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,
+2
src/Nodes/OSCActions.tsx
··· 2 import { NodeOSCActionsSendChatbox } from "./OSCActions/Send Chatbox"; 3 4 export let NodeOSCActions: NodeDefinition = { 5 isSingle: false, 6 name: 'OSC Actions', 7 items: [
··· 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: [
+27 -10
src/Nodes/OSCTrigger.tsx
··· 5 import { NodeDefinition } from "./Nodes"; 6 7 export let NodeOSCTrigger: NodeDefinition = { 8 isSingle: true, 9 name: 'OSC Trigger', 10 typeId: 'osctrigger', 11 12 w: 200, 13 - h: 50, 14 15 statics: [ 16 { ··· 39 } 40 } 41 42 - node.outputs.map(output => { 43 - output.connections.map(partner => { 44 - partner.connections = partner.connections.filter(x => x != output); 45 - }) 46 - }) 47 - node.outputs = []; 48 49 - node.outputs.push({ 50 name: 'Flow', 51 type: NodeType.Flow, 52 connections: [], ··· 73 } 74 75 if(type){ 76 - node.outputs.push({ 77 name: dat.desc === '' ? dat.type : dat.desc, 78 type: type, 79 connections: [], ··· 83 } 84 }); 85 86 - node.h = 60 + (parameters.length + 1) * 30; 87 NodeManager.Instance.UpdateConfig(); 88 } 89 };
··· 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 { ··· 40 } 41 } 42 43 + let tempOutputs = []; 44 45 + tempOutputs.push({ 46 name: 'Flow', 47 type: NodeType.Flow, 48 connections: [], ··· 69 } 70 71 if(type){ 72 + tempOutputs.push({ 73 name: dat.desc === '' ? dat.type : dat.desc, 74 type: type, 75 connections: [], ··· 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 + }
+4 -3
src/Nodes/Statics/Int.tsx
··· 2 import { NodeDefinition } from "../Nodes"; 3 4 export let NodeStaticsInt: NodeDefinition = { 5 isSingle: true, 6 name: 'Int', 7 - typeId: 'ifelse', 8 9 w: 200, 10 - h: 85, 11 12 statics: [{ 13 type: NodeType.Int, 14 name: 'Value', 15 - value: null 16 }], 17 18 outputs: [{ name: "Int", type: NodeType.Int }],
··· 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 }],
+3 -2
src/Nodes/Statics/String.tsx
··· 2 import { NodeDefinition } from "../Nodes"; 3 4 export let NodeStaticsString: NodeDefinition = { 5 isSingle: true, 6 name: 'String', 7 typeId: 'staticstring', 8 9 w: 200, 10 - h: 85, 11 12 statics: [{ 13 type: NodeType.String, 14 name: 'Value', 15 - value: null 16 }], 17 18 outputs: [{ name: "String", type: NodeType.String }],
··· 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 }],
+5 -1
src/Nodes/Statics.tsx
··· 1 import { NodeDefinition } from "./Nodes"; 2 3 import { NodeStaticsInt } from "./Statics/Int"; 4 import { NodeStaticsString } from "./Statics/String"; 5 6 export let NodeStatics: NodeDefinition = { 7 isSingle: false, 8 name: 'Statics', 9 items: [ 10 NodeStaticsInt, 11 - NodeStaticsString 12 ] 13 }
··· 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 }
+1 -1
src/components/ConfirmationPopup.tsx
··· 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 =>
··· 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 =>
+40 -4
src/components/ControlBar.tsx
··· 9 import { NodeManager } from '../Mangers/NodeManager'; 10 11 export interface ControlBarProps{ 12 - node: Accessor<Node | null>, 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()?.statics}> 20 { ( item ) => { 21 let [ popupOpen, setPopupOpen ] = createSignal(false); 22 ··· 26 <Match when={item.type == NodeType.String}> 27 { item.name } 28 <div style={{ display: 'inline-block', 'margin-left': '10px' }}> 29 30 </div> 31 </Match> 32 <Match when={item.type == NodeType.Int}> 33 { item.name } 34 <div style={{ display: 'inline-block', 'margin-left': '10px' }}> 35 36 </div> 37 </Match> 38 <Match when={item.type == NodeType.Float}> 39 { item.name } 40 <div style={{ display: 'inline-block', 'margin-left': '10px' }}> 41 42 </div> 43 </Match> 44 <Match when={item.type == NodeType.OSCAddress}> ··· 52 return addresses.map(x => x.address).filter(x => x.toLowerCase().includes(text.toLowerCase())); 53 }} 54 change={( text ) => { 55 - let node = props.node()!; 56 57 item.value = text; 58 node.onStaticsUpdate(node); ··· 78 }} 79 value={item.value} 80 changed={( value ) => { 81 - let node = props.node()!; 82 83 item.value = value; 84 node.onStaticsUpdate(node);
··· 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 ··· 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}> ··· 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); ··· 114 }} 115 value={item.value} 116 changed={( value ) => { 117 + let node = props.node()[0]!; 118 119 item.value = value; 120 node.onStaticsUpdate(node);
+23
src/components/ParameterList.css
··· 59 60 .parameter-list-button-dropdown > div:hover{ 61 color: #aaa; 62 }
··· 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 }
+12 -1
src/components/ParameterList.tsx
··· 22 </div> 23 <div class="parameter-list-content"> 24 <For each={parameters()}> 25 - { i => <div>{ JSON.stringify(i) }</div>} 26 </For> 27 <div class="button" onClick={() => { setAddParametersOpen(!addParametersOpen()) }}>Add Parameter + </div> 28 <Show when={addParametersOpen()}>
··· 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()}>
+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 + }
+31
src/components/TabMenu.css
··· 12 overflow-y: auto; 13 } 14 15 .tab{ 16 border-radius: 10px; 17 padding: 8px 10px; ··· 53 .tab-meta{ 54 width: calc(100% - 40px); 55 transform: translateY(1px); 56 } 57 58 .tab-meta-input{ ··· 93 transform: translate(-10px, 35px); 94 border-radius: 10px; 95 background: #fff1; 96 }
··· 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; ··· 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{ ··· 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 }
+69 -50
src/components/TabMenu.tsx
··· 1 - import { createSignal, For, onMount, Show } from 'solid-js'; 2 import './TabMenu.css'; 3 import { NodeManager } from '../Mangers/NodeManager'; 4 import { Tab } from '../structs/Tab'; 5 6 export let TabMenu = () => { 7 let [ tabImportOpen, setTabImportOpen ] = createSignal(false); 8 let [ tabs, setTabs ] = createSignal<Tab[]>([], { equals: false }); 9 10 let closeTabImportMenu = () => { 11 window.removeEventListener('click', closeTabImportMenu); ··· 17 }); 18 19 return ( 20 - <div class="tab-menu"> 21 - <For each={Object.values(tabs())}> 22 - { 23 - tab => 24 - <div class={ tab.selected() ? 'tab-selected ' : 'tab' } onClick={() => { 25 - NodeManager.Instance.SelectTab(tab.id); 26 - }}> 27 - <div class="tab-icon" onClick={async () => { 28 - if(tab.selected()){ 29 - NodeManager.Instance.SaveTab(tab); 30 - } 31 - }}> 32 - <Show when={tab.selected() && tab.needsSave()} fallback={ 33 - <img src="/assets/icons/pen-to-square-regular-full.svg" width="15" /> 34 - }> 35 - <img src="/assets/icons/floppy-disk-solid-full.svg" width="15" /> 36 - </Show> 37 38 - </div> 39 - <div class="tab-meta" onDblClick={( e ) => { 40 - let input = <input class="tab-meta-input" value={ e.target.innerHTML } /> as HTMLInputElement; 41 42 - e.target.innerHTML = ''; 43 - e.target.appendChild(input); 44 45 - input.select(); 46 - input.onchange = () => { 47 - NodeManager.Instance.RenameTab(tab.id, input.value); 48 - e.target.innerHTML = input.value; 49 - } 50 - }}>{ tab.name }</div> 51 - <div class="tab-close" onClick={() => { 52 - setTimeout(() => { 53 - NodeManager.Instance.CloseTab(tab.id); 54 - }, 50) 55 - }}><img src="/assets/icons/xmark-solid-full.svg" width="12" /></div> 56 </div> 57 - } 58 - </For> 59 60 - <div class="tab" onClick={() => { 61 - NodeManager.Instance.AddTab("Untitled"); 62 - }} onContextMenu={( e ) => { 63 - e.preventDefault(); 64 - setTabImportOpen(true); 65 - 66 - window.addEventListener('click', closeTabImportMenu); 67 - }}> 68 - <div class="tab-new-dropdown" style={{ display: tabImportOpen() ? 'block' : 'none' }}> 69 - <div class="tab">Import from file</div> 70 - <div class="tab">Import from URL</div> 71 </div> 72 - <div class="tab-icon"><img src="/assets/icons/plus-solid-full.svg" width="15" /></div> 73 - <div class="tab-meta">New Tab</div> 74 </div> 75 - </div> 76 ) 77 }
··· 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); ··· 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 }
+11
src/components/TextInput.css
··· 9 width: 400px; 10 } 11 12 div[input-dropdown]{ 13 position: absolute; 14 width: fit-content;
··· 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;
+1 -1
src/index.tsx
··· 8 new NodeManager(); 9 new ConfirmationManager(); 10 11 - render(() => <App />, document.getElementById("root") as HTMLElement);
··· 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 + }
+69 -40
src/renderer.ts
··· 63 let nodeX = Math.round(node.x / 10) * 10; 64 let nodeY = Math.round(node.y / 10) * 10; 65 66 - ctx.fillStyle = '#1f2129'; 67 - ctx.strokeStyle = node.selected ? '#004696ff' : '#fff5'; 68 ctx.lineWidth = 5 * position.scale; 69 70 // Draw Node Box ··· 74 node.w * position.scale, 75 node.h * position.scale, 76 10 * position.scale); 77 78 ctx.stroke(); 79 ctx.fill(); 80 81 // Draw Node Name 82 ctx.fillStyle = '#fff'; 83 - ctx.font = (25 * position.scale) + 'px Comic Mono'; 84 ctx.textAlign = 'center'; 85 86 ctx.fillText(node.name, ··· 89 ); 90 91 // Draw Inputs 92 - ctx.font = (15 * position.scale) + 'px Comic Mono'; 93 ctx.textAlign = 'left'; 94 95 node.inputs.map(( input, i ) => { 96 ctx.fillStyle = NodeIOLinkColours(input); 97 - ctx.fillRect( 98 - (nodeX + 10 + startX + position.x) * position.scale, 99 - (nodeY + 50 + (30 * i) + startY + position.y) * position.scale, 100 - 20 * position.scale, 20 * position.scale 101 - ) 102 103 ctx.fillText(input.name, 104 - (nodeX + 35 + startX + position.x) * position.scale, 105 (nodeY + 53 + (30 * i) + startY + position.y) * position.scale, 106 ) 107 }) ··· 111 112 node.outputs.map(( output, i ) => { 113 ctx.fillStyle = NodeIOLinkColours(output); 114 - ctx.fillRect( 115 - (nodeX + (node.w - 30) + startX + position.x) * position.scale, 116 - (nodeY + 50 + (30 * i) + startY + position.y) * position.scale, 117 - 20 * position.scale, 20 * position.scale 118 - ) 119 120 ctx.fillText(output.name, 121 - (nodeX + (node.w - 35) + startX + position.x) * position.scale, 122 (nodeY + 53 + (30 * i) + startY + position.y) * position.scale, 123 ) 124 }) ··· 130 131 node.outputs.map(( output, i ) => { 132 output.connections.map(partner => { 133 - ctx.strokeStyle = NodeIOLinkColours(output); 134 - drawCurve(ctx, 135 - (nodeX + (node.w - 30) + 10 + startX + position.x) * position.scale, 136 - (nodeY + 50 + (30 * i) + 10 + startY + position.y) * position.scale, 137 - ((Math.round(partner.parent.x / 10) * 10) + 20 + startX + position.x) * position.scale, 138 - ((Math.round(partner.parent.y / 10) * 10) + 60 + (30 * partner.index) + startY + position.y) * position.scale, 139 - ); 140 ctx.stroke(); 141 }) 142 }) ··· 148 contextMenu: ContextMenu 149 ) => { 150 if(contextMenu.visible){ 151 - ctx.font = '20px Arial'; 152 ctx.textBaseline = 'top'; 153 ctx.textAlign = 'left'; 154 ··· 192 let startX = canvas.width / -2; 193 let startY = canvas.height / -2; 194 195 - ctx.fillStyle = '#f00'; 196 197 - ctx.fillRect( 198 - (drawingTo[0] + 10 + startX + position.x) * position.scale, 199 - (drawingTo[1] + 10 + startY + position.y) * position.scale, 200 - 10, 10 201 - ); 202 203 - ctx.fillRect( 204 - (drawingFrom.parent.x + (drawingFrom.parent.w - 30) + 10 + startX + position.x) * position.scale, 205 - (drawingFrom.parent.y + 50 + (30 * drawingFrom.index) + 10 + startY + position.y) * position.scale, 206 - 10, 10 207 - ); 208 209 ctx.strokeStyle = NodeIOLinkColours(drawingFrom); 210 drawCurve(ctx, 211 - (drawingFrom.parent.x + (drawingFrom.parent.w - 30) + 10 + startX + position.x) * position.scale, 212 - (drawingFrom.parent.y + 50 + (30 * drawingFrom.index) + 10 + startY + position.y) * position.scale, 213 (drawingTo[0] + 10 + startX + position.x) * position.scale, 214 (drawingTo[1] + 10 + startY + position.y) * position.scale, 215 ); ··· 239 ) => { 240 ctx.fillStyle = '#fff'; 241 242 - ctx.font = '20px Arial'; 243 ctx.textBaseline = 'middle'; 244 ctx.textAlign = 'center'; 245 246 let textX = lerp((canvas.width / -2) + 200, canvas.width / 2, 0.5); 247 let textY = lerp((canvas.height / -2) + 40, canvas.height / 2, 0.5); 248 249 - ctx.font = '40px Arial'; 250 ctx.fillText('Welcome to VRCMacros', textX, textY); 251 252 - ctx.font = '20px Arial'; 253 ctx.fillText('Create a new tab to get started!', textX, textY + 40); 254 } 255
··· 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 ··· 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, ··· 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 }) ··· 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 }) ··· 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 }) ··· 171 contextMenu: ContextMenu 172 ) => { 173 if(contextMenu.visible){ 174 + ctx.font = '20px Rubik'; 175 ctx.textBaseline = 'top'; 176 ctx.textAlign = 'left'; 177 ··· 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 ); ··· 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
+1 -1
src/structs/Tab.ts
··· 13 needsSave: Accessor<boolean>, 14 setNeedsSave: Setter<boolean>, 15 16 - refuseSync: boolean 17 }
··· 13 needsSave: Accessor<boolean>, 14 setNeedsSave: Setter<boolean>, 15 16 + needSync: boolean 17 }
+41 -3
src/structs/node.ts
··· 20 this.typeId = node.typeId!; 21 this.x = pos[0]; 22 this.y = pos[1]; 23 - this.w = node.w!; 24 - this.h = node.h!; 25 26 this.inputs = node.inputs ? node.inputs.map(( x, indx ) => { 27 return { ··· 43 } 44 }) : []; 45 46 this.selected = false; 47 this.statics = node.statics!, 48 this.onStaticsUpdate = node.onStaticsUpdate!; 49 } 50 } 51 52 export interface NodeIO{ ··· 74 ParameterList = 10 75 } 76 77 export let NodeIOResolveAnyTypes = ( nodeio: NodeIO ): NodeType | null => { 78 if(nodeio.type > 0 && nodeio.type < 6){ 79 // It's a base type ··· 105 return null; 106 } 107 108 - export let NodeIOLinkColours = ( nodeio: NodeIO ) => { 109 let cols: any = { 110 1: '#ffff9f', 111 2: '#cda0cb', ··· 115 } 116 117 let type = NodeIOResolveAnyTypes(nodeio); 118 return type ? cols[type] : '#fff5'; 119 } 120
··· 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 { ··· 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{ ··· 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 ··· 130 return null; 131 } 132 133 + export let NodeIOLinkColours = ( nodeio: NodeIO, output?: NodeIO ) => { 134 let cols: any = { 135 1: '#ffff9f', 136 2: '#cda0cb', ··· 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
+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 + }
+1221 -703
src-tauri/Cargo.lock
··· 7 version = "0.1.0" 8 dependencies = [ 9 "anyhow", 10 "dirs", 11 "flate2", 12 "serde", 13 "serde_json", 14 "tauri", 15 "tauri-build", 16 "tauri-plugin-dialog", 17 "tauri-plugin-opener", 18 "tokio", 19 ] 20 21 [[package]] 22 - name = "addr2line" 23 - version = "0.24.2" 24 - source = "registry+https://github.com/rust-lang/crates.io-index" 25 - checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 26 - dependencies = [ 27 - "gimli", 28 - ] 29 - 30 - [[package]] 31 name = "adler2" 32 version = "2.0.1" 33 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 35 36 [[package]] 37 name = "aho-corasick" 38 - version = "1.1.3" 39 source = "registry+https://github.com/rust-lang/crates.io-index" 40 - checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 41 dependencies = [ 42 "memchr", 43 ] ··· 58 ] 59 60 [[package]] 61 - name = "android-tzdata" 62 - version = "0.1.1" 63 - source = "registry+https://github.com/rust-lang/crates.io-index" 64 - checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 65 - 66 - [[package]] 67 name = "android_system_properties" 68 version = "0.1.5" 69 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 74 75 [[package]] 76 name = "anyhow" 77 - version = "1.0.99" 78 source = "registry+https://github.com/rust-lang/crates.io-index" 79 - checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" 80 81 [[package]] 82 name = "ashpd" ··· 125 126 [[package]] 127 name = "async-executor" 128 - version = "1.13.2" 129 source = "registry+https://github.com/rust-lang/crates.io-index" 130 - checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" 131 dependencies = [ 132 "async-task", 133 "concurrent-queue", ··· 139 140 [[package]] 141 name = "async-io" 142 - version = "2.5.0" 143 source = "registry+https://github.com/rust-lang/crates.io-index" 144 - checksum = "19634d6336019ef220f09fd31168ce5c184b295cbf80345437cc36094ef223ca" 145 dependencies = [ 146 - "async-lock", 147 "cfg-if", 148 "concurrent-queue", 149 "futures-io", 150 "futures-lite", 151 "parking", 152 "polling", 153 - "rustix", 154 "slab", 155 - "windows-sys 0.60.2", 156 ] 157 158 [[package]] 159 name = "async-lock" 160 - version = "3.4.0" 161 source = "registry+https://github.com/rust-lang/crates.io-index" 162 - checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" 163 dependencies = [ 164 "event-listener", 165 "event-listener-strategy", ··· 168 169 [[package]] 170 name = "async-process" 171 - version = "2.4.0" 172 source = "registry+https://github.com/rust-lang/crates.io-index" 173 - checksum = "65daa13722ad51e6ab1a1b9c01299142bc75135b337923cfa10e79bbbd669f00" 174 dependencies = [ 175 "async-channel", 176 "async-io", ··· 181 "cfg-if", 182 "event-listener", 183 "futures-lite", 184 - "rustix", 185 ] 186 187 [[package]] ··· 192 dependencies = [ 193 "proc-macro2", 194 "quote", 195 - "syn 2.0.104", 196 ] 197 198 [[package]] 199 name = "async-signal" 200 - version = "0.2.12" 201 source = "registry+https://github.com/rust-lang/crates.io-index" 202 - checksum = "f567af260ef69e1d52c2b560ce0ea230763e6fbb9214a85d768760a920e3e3c1" 203 dependencies = [ 204 "async-io", 205 "async-lock", ··· 207 "cfg-if", 208 "futures-core", 209 "futures-io", 210 - "rustix", 211 "signal-hook-registry", 212 "slab", 213 - "windows-sys 0.60.2", 214 ] 215 216 [[package]] ··· 221 222 [[package]] 223 name = "async-trait" 224 - version = "0.1.88" 225 source = "registry+https://github.com/rust-lang/crates.io-index" 226 - checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" 227 dependencies = [ 228 "proc-macro2", 229 "quote", 230 - "syn 2.0.104", 231 ] 232 233 [[package]] ··· 266 checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 267 268 [[package]] 269 - name = "backtrace" 270 - version = "0.3.75" 271 - source = "registry+https://github.com/rust-lang/crates.io-index" 272 - checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" 273 - dependencies = [ 274 - "addr2line", 275 - "cfg-if", 276 - "libc", 277 - "miniz_oxide", 278 - "object", 279 - "rustc-demangle", 280 - "windows-targets 0.52.6", 281 - ] 282 - 283 - [[package]] 284 name = "base64" 285 version = "0.21.7" 286 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 300 301 [[package]] 302 name = "bitflags" 303 - version = "2.9.1" 304 source = "registry+https://github.com/rust-lang/crates.io-index" 305 - checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" 306 dependencies = [ 307 - "serde", 308 ] 309 310 [[package]] ··· 327 328 [[package]] 329 name = "block2" 330 - version = "0.6.1" 331 source = "registry+https://github.com/rust-lang/crates.io-index" 332 - checksum = "340d2f0bdb2a43c1d3cd40513185b2bd7def0aa1052f956455114bc98f82dcf2" 333 dependencies = [ 334 - "objc2 0.6.1", 335 ] 336 337 [[package]] ··· 349 350 [[package]] 351 name = "brotli" 352 - version = "8.0.1" 353 source = "registry+https://github.com/rust-lang/crates.io-index" 354 - checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" 355 dependencies = [ 356 "alloc-no-stdlib", 357 "alloc-stdlib", ··· 376 377 [[package]] 378 name = "bytemuck" 379 - version = "1.23.1" 380 source = "registry+https://github.com/rust-lang/crates.io-index" 381 - checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" 382 383 [[package]] 384 name = "byteorder" ··· 387 checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 388 389 [[package]] 390 name = "bytes" 391 version = "1.10.1" 392 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 401 source = "registry+https://github.com/rust-lang/crates.io-index" 402 checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" 403 dependencies = [ 404 - "bitflags 2.9.1", 405 "cairo-sys-rs", 406 "glib", 407 "libc", ··· 422 423 [[package]] 424 name = "camino" 425 - version = "1.1.10" 426 source = "registry+https://github.com/rust-lang/crates.io-index" 427 - checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" 428 dependencies = [ 429 - "serde", 430 ] 431 432 [[package]] ··· 449 "semver", 450 "serde", 451 "serde_json", 452 - "thiserror 2.0.12", 453 ] 454 455 [[package]] ··· 459 checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" 460 dependencies = [ 461 "serde", 462 - "toml 0.9.3", 463 ] 464 465 [[package]] 466 name = "cc" 467 - version = "1.2.30" 468 source = "registry+https://github.com/rust-lang/crates.io-index" 469 - checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" 470 dependencies = [ 471 "shlex", 472 ] 473 ··· 500 501 [[package]] 502 name = "cfg-if" 503 - version = "1.0.1" 504 source = "registry+https://github.com/rust-lang/crates.io-index" 505 - checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" 506 507 [[package]] 508 name = "cfg_aliases" ··· 512 513 [[package]] 514 name = "chrono" 515 - version = "0.4.41" 516 source = "registry+https://github.com/rust-lang/crates.io-index" 517 - checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" 518 dependencies = [ 519 - "android-tzdata", 520 "iana-time-zone", 521 "num-traits", 522 "serde", 523 - "windows-link", 524 ] 525 526 [[package]] ··· 580 source = "registry+https://github.com/rust-lang/crates.io-index" 581 checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" 582 dependencies = [ 583 - "bitflags 2.9.1", 584 "core-foundation", 585 "core-graphics-types", 586 "foreign-types", ··· 593 source = "registry+https://github.com/rust-lang/crates.io-index" 594 checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" 595 dependencies = [ 596 - "bitflags 2.9.1", 597 "core-foundation", 598 "libc", 599 ] ··· 632 checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 633 634 [[package]] 635 name = "crypto-common" 636 version = "0.1.6" 637 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 665 checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" 666 dependencies = [ 667 "quote", 668 - "syn 2.0.104", 669 ] 670 671 [[package]] ··· 675 checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" 676 dependencies = [ 677 "quote", 678 - "syn 2.0.104", 679 ] 680 681 [[package]] 682 name = "darling" 683 - version = "0.20.11" 684 source = "registry+https://github.com/rust-lang/crates.io-index" 685 - checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" 686 dependencies = [ 687 "darling_core", 688 "darling_macro", ··· 690 691 [[package]] 692 name = "darling_core" 693 - version = "0.20.11" 694 source = "registry+https://github.com/rust-lang/crates.io-index" 695 - checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" 696 dependencies = [ 697 "fnv", 698 "ident_case", 699 "proc-macro2", 700 "quote", 701 "strsim", 702 - "syn 2.0.104", 703 ] 704 705 [[package]] 706 name = "darling_macro" 707 - version = "0.20.11" 708 source = "registry+https://github.com/rust-lang/crates.io-index" 709 - checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" 710 dependencies = [ 711 "darling_core", 712 "quote", 713 - "syn 2.0.104", 714 ] 715 716 [[package]] 717 name = "deranged" 718 - version = "0.4.0" 719 source = "registry+https://github.com/rust-lang/crates.io-index" 720 - checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" 721 dependencies = [ 722 "powerfmt", 723 - "serde", 724 ] 725 726 [[package]] ··· 733 "proc-macro2", 734 "quote", 735 "rustc_version", 736 - "syn 2.0.104", 737 ] 738 739 [[package]] ··· 764 "libc", 765 "option-ext", 766 "redox_users", 767 - "windows-sys 0.60.2", 768 ] 769 770 [[package]] ··· 779 source = "registry+https://github.com/rust-lang/crates.io-index" 780 checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" 781 dependencies = [ 782 - "bitflags 2.9.1", 783 - "block2 0.6.1", 784 "libc", 785 - "objc2 0.6.1", 786 ] 787 788 [[package]] ··· 793 dependencies = [ 794 "proc-macro2", 795 "quote", 796 - "syn 2.0.104", 797 ] 798 799 [[package]] ··· 802 source = "registry+https://github.com/rust-lang/crates.io-index" 803 checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" 804 dependencies = [ 805 - "libloading", 806 ] 807 808 [[package]] 809 name = "dlopen2" 810 - version = "0.7.0" 811 source = "registry+https://github.com/rust-lang/crates.io-index" 812 - checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6" 813 dependencies = [ 814 "dlopen2_derive", 815 "libc", ··· 825 dependencies = [ 826 "proc-macro2", 827 "quote", 828 - "syn 2.0.104", 829 ] 830 831 [[package]] ··· 872 873 [[package]] 874 name = "embed-resource" 875 - version = "3.0.5" 876 source = "registry+https://github.com/rust-lang/crates.io-index" 877 - checksum = "4c6d81016d6c977deefb2ef8d8290da019e27cc26167e102185da528e6c0ab38" 878 dependencies = [ 879 "cc", 880 "memchr", 881 "rustc_version", 882 - "toml 0.9.3", 883 "vswhom", 884 "winreg", 885 ] ··· 897 checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" 898 899 [[package]] 900 name = "enumflags2" 901 version = "0.7.12" 902 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 914 dependencies = [ 915 "proc-macro2", 916 "quote", 917 - "syn 2.0.104", 918 ] 919 920 [[package]] ··· 925 926 [[package]] 927 name = "erased-serde" 928 - version = "0.4.6" 929 source = "registry+https://github.com/rust-lang/crates.io-index" 930 - checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" 931 dependencies = [ 932 "serde", 933 "typeid", 934 ] 935 936 [[package]] 937 name = "errno" 938 - version = "0.3.13" 939 source = "registry+https://github.com/rust-lang/crates.io-index" 940 - checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" 941 dependencies = [ 942 "libc", 943 - "windows-sys 0.60.2", 944 ] 945 946 [[package]] 947 name = "event-listener" 948 - version = "5.4.0" 949 source = "registry+https://github.com/rust-lang/crates.io-index" 950 - checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 951 dependencies = [ 952 "concurrent-queue", 953 "parking", ··· 971 checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 972 973 [[package]] 974 name = "fdeflate" 975 version = "0.3.7" 976 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 990 ] 991 992 [[package]] 993 name = "flate2" 994 - version = "1.1.2" 995 source = "registry+https://github.com/rust-lang/crates.io-index" 996 - checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" 997 dependencies = [ 998 "crc32fast", 999 "miniz_oxide", ··· 1006 checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 1007 1008 [[package]] 1009 name = "foreign-types" 1010 version = "0.5.0" 1011 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1023 dependencies = [ 1024 "proc-macro2", 1025 "quote", 1026 - "syn 2.0.104", 1027 ] 1028 1029 [[package]] ··· 1034 1035 [[package]] 1036 name = "form_urlencoded" 1037 - version = "1.2.1" 1038 source = "registry+https://github.com/rust-lang/crates.io-index" 1039 - checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 1040 dependencies = [ 1041 "percent-encoding", 1042 ] ··· 1085 1086 [[package]] 1087 name = "futures-lite" 1088 - version = "2.6.0" 1089 source = "registry+https://github.com/rust-lang/crates.io-index" 1090 - checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" 1091 dependencies = [ 1092 "fastrand", 1093 "futures-core", ··· 1104 dependencies = [ 1105 "proc-macro2", 1106 "quote", 1107 - "syn 2.0.104", 1108 ] 1109 1110 [[package]] ··· 1246 1247 [[package]] 1248 name = "generic-array" 1249 - version = "0.14.7" 1250 source = "registry+https://github.com/rust-lang/crates.io-index" 1251 - checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 1252 dependencies = [ 1253 "typenum", 1254 "version_check", 1255 ] 1256 1257 [[package]] ··· 1278 1279 [[package]] 1280 name = "getrandom" 1281 - version = "0.3.3" 1282 source = "registry+https://github.com/rust-lang/crates.io-index" 1283 - checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 1284 dependencies = [ 1285 "cfg-if", 1286 "libc", 1287 "r-efi", 1288 - "wasi 0.14.2+wasi-0.2.4", 1289 ] 1290 - 1291 - [[package]] 1292 - name = "gimli" 1293 - version = "0.31.1" 1294 - source = "registry+https://github.com/rust-lang/crates.io-index" 1295 - checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 1296 1297 [[package]] 1298 name = "gio" ··· 1332 source = "registry+https://github.com/rust-lang/crates.io-index" 1333 checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" 1334 dependencies = [ 1335 - "bitflags 2.9.1", 1336 "futures-channel", 1337 "futures-core", 1338 "futures-executor", ··· 1356 checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" 1357 dependencies = [ 1358 "heck 0.4.1", 1359 - "proc-macro-crate 2.0.0", 1360 "proc-macro-error", 1361 "proc-macro2", 1362 "quote", 1363 - "syn 2.0.104", 1364 ] 1365 1366 [[package]] ··· 1375 1376 [[package]] 1377 name = "glob" 1378 - version = "0.3.2" 1379 source = "registry+https://github.com/rust-lang/crates.io-index" 1380 - checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 1381 1382 [[package]] 1383 name = "gobject-sys" ··· 1439 "proc-macro-error", 1440 "proc-macro2", 1441 "quote", 1442 - "syn 2.0.104", 1443 ] 1444 1445 [[package]] ··· 1450 1451 [[package]] 1452 name = "hashbrown" 1453 - version = "0.15.4" 1454 source = "registry+https://github.com/rust-lang/crates.io-index" 1455 - checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" 1456 1457 [[package]] 1458 name = "heck" ··· 1532 1533 [[package]] 1534 name = "hyper" 1535 - version = "1.6.0" 1536 source = "registry+https://github.com/rust-lang/crates.io-index" 1537 - checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 1538 dependencies = [ 1539 "bytes", 1540 "futures-channel", 1541 - "futures-util", 1542 "http", 1543 "http-body", 1544 "httparse", 1545 "itoa", 1546 "pin-project-lite", 1547 "smallvec", 1548 "tokio", 1549 "want", ··· 1551 1552 [[package]] 1553 name = "hyper-util" 1554 - version = "0.1.16" 1555 source = "registry+https://github.com/rust-lang/crates.io-index" 1556 - checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" 1557 dependencies = [ 1558 "base64 0.22.1", 1559 "bytes", ··· 1575 1576 [[package]] 1577 name = "iana-time-zone" 1578 - version = "0.1.63" 1579 source = "registry+https://github.com/rust-lang/crates.io-index" 1580 - checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" 1581 dependencies = [ 1582 "android_system_properties", 1583 "core-foundation-sys", ··· 1585 "js-sys", 1586 "log", 1587 "wasm-bindgen", 1588 - "windows-core", 1589 ] 1590 1591 [[package]] ··· 1604 checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" 1605 dependencies = [ 1606 "byteorder", 1607 - "png", 1608 ] 1609 1610 [[package]] 1611 name = "icu_collections" 1612 - version = "2.0.0" 1613 source = "registry+https://github.com/rust-lang/crates.io-index" 1614 - checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 1615 dependencies = [ 1616 "displaydoc", 1617 "potential_utf", ··· 1622 1623 [[package]] 1624 name = "icu_locale_core" 1625 - version = "2.0.0" 1626 source = "registry+https://github.com/rust-lang/crates.io-index" 1627 - checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 1628 dependencies = [ 1629 "displaydoc", 1630 "litemap", ··· 1635 1636 [[package]] 1637 name = "icu_normalizer" 1638 - version = "2.0.0" 1639 source = "registry+https://github.com/rust-lang/crates.io-index" 1640 - checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 1641 dependencies = [ 1642 - "displaydoc", 1643 "icu_collections", 1644 "icu_normalizer_data", 1645 "icu_properties", ··· 1650 1651 [[package]] 1652 name = "icu_normalizer_data" 1653 - version = "2.0.0" 1654 source = "registry+https://github.com/rust-lang/crates.io-index" 1655 - checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 1656 1657 [[package]] 1658 name = "icu_properties" 1659 - version = "2.0.1" 1660 source = "registry+https://github.com/rust-lang/crates.io-index" 1661 - checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 1662 dependencies = [ 1663 - "displaydoc", 1664 "icu_collections", 1665 "icu_locale_core", 1666 "icu_properties_data", 1667 "icu_provider", 1668 - "potential_utf", 1669 "zerotrie", 1670 "zerovec", 1671 ] 1672 1673 [[package]] 1674 name = "icu_properties_data" 1675 - version = "2.0.1" 1676 source = "registry+https://github.com/rust-lang/crates.io-index" 1677 - checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 1678 1679 [[package]] 1680 name = "icu_provider" 1681 - version = "2.0.0" 1682 source = "registry+https://github.com/rust-lang/crates.io-index" 1683 - checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 1684 dependencies = [ 1685 "displaydoc", 1686 "icu_locale_core", 1687 - "stable_deref_trait", 1688 - "tinystr", 1689 "writeable", 1690 "yoke", 1691 "zerofrom", ··· 1701 1702 [[package]] 1703 name = "idna" 1704 - version = "1.0.3" 1705 source = "registry+https://github.com/rust-lang/crates.io-index" 1706 - checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 1707 dependencies = [ 1708 "idna_adapter", 1709 "smallvec", ··· 1721 ] 1722 1723 [[package]] 1724 name = "indexmap" 1725 version = "1.9.3" 1726 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1733 1734 [[package]] 1735 name = "indexmap" 1736 - version = "2.10.0" 1737 source = "registry+https://github.com/rust-lang/crates.io-index" 1738 - checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" 1739 dependencies = [ 1740 "equivalent", 1741 - "hashbrown 0.15.4", 1742 "serde", 1743 ] 1744 1745 [[package]] ··· 1752 ] 1753 1754 [[package]] 1755 - name = "io-uring" 1756 - version = "0.7.9" 1757 - source = "registry+https://github.com/rust-lang/crates.io-index" 1758 - checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" 1759 - dependencies = [ 1760 - "bitflags 2.9.1", 1761 - "cfg-if", 1762 - "libc", 1763 - ] 1764 - 1765 - [[package]] 1766 name = "ipnet" 1767 version = "2.11.0" 1768 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1770 1771 [[package]] 1772 name = "iri-string" 1773 - version = "0.7.8" 1774 source = "registry+https://github.com/rust-lang/crates.io-index" 1775 - checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" 1776 dependencies = [ 1777 "memchr", 1778 "serde", ··· 1850 1851 [[package]] 1852 name = "js-sys" 1853 - version = "0.3.77" 1854 source = "registry+https://github.com/rust-lang/crates.io-index" 1855 - checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 1856 dependencies = [ 1857 "once_cell", 1858 "wasm-bindgen", ··· 1886 source = "registry+https://github.com/rust-lang/crates.io-index" 1887 checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" 1888 dependencies = [ 1889 - "bitflags 2.9.1", 1890 "serde", 1891 "unicode-segmentation", 1892 ] ··· 1899 dependencies = [ 1900 "cssparser", 1901 "html5ever", 1902 - "indexmap 2.10.0", 1903 "selectors", 1904 ] 1905 ··· 1929 checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" 1930 dependencies = [ 1931 "gtk-sys", 1932 - "libloading", 1933 "once_cell", 1934 ] 1935 1936 [[package]] 1937 name = "libc" 1938 - version = "0.2.174" 1939 source = "registry+https://github.com/rust-lang/crates.io-index" 1940 - checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" 1941 1942 [[package]] 1943 name = "libloading" ··· 1950 ] 1951 1952 [[package]] 1953 name = "libredox" 1954 - version = "0.1.8" 1955 source = "registry+https://github.com/rust-lang/crates.io-index" 1956 - checksum = "360e552c93fa0e8152ab463bc4c4837fce76a225df11dfaeea66c313de5e61f7" 1957 dependencies = [ 1958 - "bitflags 2.9.1", 1959 "libc", 1960 ] 1961 1962 [[package]] 1963 name = "linux-raw-sys" 1964 - version = "0.9.4" 1965 source = "registry+https://github.com/rust-lang/crates.io-index" 1966 - checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 1967 1968 [[package]] 1969 name = "litemap" 1970 - version = "0.8.0" 1971 source = "registry+https://github.com/rust-lang/crates.io-index" 1972 - checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 1973 1974 [[package]] 1975 name = "lock_api" 1976 - version = "0.4.13" 1977 source = "registry+https://github.com/rust-lang/crates.io-index" 1978 - checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" 1979 dependencies = [ 1980 - "autocfg", 1981 "scopeguard", 1982 ] 1983 1984 [[package]] 1985 name = "log" 1986 - version = "0.4.27" 1987 source = "registry+https://github.com/rust-lang/crates.io-index" 1988 - checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 1989 1990 [[package]] 1991 name = "mac" ··· 2015 dependencies = [ 2016 "proc-macro2", 2017 "quote", 2018 - "syn 2.0.104", 2019 ] 2020 2021 [[package]] ··· 2026 2027 [[package]] 2028 name = "memchr" 2029 - version = "2.7.5" 2030 source = "registry+https://github.com/rust-lang/crates.io-index" 2031 - checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" 2032 2033 [[package]] 2034 name = "memoffset" ··· 2046 checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 2047 2048 [[package]] 2049 name = "miniz_oxide" 2050 version = "0.8.9" 2051 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2057 2058 [[package]] 2059 name = "mio" 2060 - version = "1.0.4" 2061 source = "registry+https://github.com/rust-lang/crates.io-index" 2062 - checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 2063 dependencies = [ 2064 "libc", 2065 "wasi 0.11.1+wasi-snapshot-preview1", 2066 - "windows-sys 0.59.0", 2067 ] 2068 2069 [[package]] 2070 name = "muda" 2071 - version = "0.17.0" 2072 source = "registry+https://github.com/rust-lang/crates.io-index" 2073 - checksum = "58b89bf91c19bf036347f1ab85a81c560f08c0667c8601bece664d860a600988" 2074 dependencies = [ 2075 "crossbeam-channel", 2076 "dpi", 2077 "gtk", 2078 "keyboard-types", 2079 - "objc2 0.6.1", 2080 "objc2-app-kit", 2081 "objc2-core-foundation", 2082 - "objc2-foundation 0.3.1", 2083 "once_cell", 2084 - "png", 2085 "serde", 2086 - "thiserror 2.0.12", 2087 - "windows-sys 0.59.0", 2088 ] 2089 2090 [[package]] ··· 2093 source = "registry+https://github.com/rust-lang/crates.io-index" 2094 checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" 2095 dependencies = [ 2096 - "bitflags 2.9.1", 2097 "jni-sys", 2098 "log", 2099 "ndk-sys", ··· 2129 source = "registry+https://github.com/rust-lang/crates.io-index" 2130 checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" 2131 dependencies = [ 2132 - "bitflags 2.9.1", 2133 "cfg-if", 2134 "cfg_aliases", 2135 "libc", ··· 2143 checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" 2144 2145 [[package]] 2146 name = "num-conv" 2147 version = "0.1.0" 2148 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2159 2160 [[package]] 2161 name = "num_enum" 2162 - version = "0.7.4" 2163 source = "registry+https://github.com/rust-lang/crates.io-index" 2164 - checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" 2165 dependencies = [ 2166 "num_enum_derive", 2167 "rustversion", ··· 2169 2170 [[package]] 2171 name = "num_enum_derive" 2172 - version = "0.7.4" 2173 source = "registry+https://github.com/rust-lang/crates.io-index" 2174 - checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" 2175 dependencies = [ 2176 - "proc-macro-crate 3.3.0", 2177 "proc-macro2", 2178 "quote", 2179 - "syn 2.0.104", 2180 ] 2181 2182 [[package]] ··· 2197 2198 [[package]] 2199 name = "objc2" 2200 - version = "0.6.1" 2201 source = "registry+https://github.com/rust-lang/crates.io-index" 2202 - checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" 2203 dependencies = [ 2204 "objc2-encode", 2205 "objc2-exception-helper", ··· 2207 2208 [[package]] 2209 name = "objc2-app-kit" 2210 - version = "0.3.1" 2211 source = "registry+https://github.com/rust-lang/crates.io-index" 2212 - checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" 2213 dependencies = [ 2214 - "bitflags 2.9.1", 2215 - "block2 0.6.1", 2216 "libc", 2217 - "objc2 0.6.1", 2218 "objc2-cloud-kit", 2219 "objc2-core-data", 2220 "objc2-core-foundation", 2221 "objc2-core-graphics", 2222 "objc2-core-image", 2223 - "objc2-foundation 0.3.1", 2224 - "objc2-quartz-core 0.3.1", 2225 ] 2226 2227 [[package]] 2228 name = "objc2-cloud-kit" 2229 - version = "0.3.1" 2230 source = "registry+https://github.com/rust-lang/crates.io-index" 2231 - checksum = "17614fdcd9b411e6ff1117dfb1d0150f908ba83a7df81b1f118005fe0a8ea15d" 2232 dependencies = [ 2233 - "bitflags 2.9.1", 2234 - "objc2 0.6.1", 2235 - "objc2-foundation 0.3.1", 2236 ] 2237 2238 [[package]] 2239 name = "objc2-core-data" 2240 - version = "0.3.1" 2241 source = "registry+https://github.com/rust-lang/crates.io-index" 2242 - checksum = "291fbbf7d29287518e8686417cf7239c74700fd4b607623140a7d4a3c834329d" 2243 dependencies = [ 2244 - "bitflags 2.9.1", 2245 - "objc2 0.6.1", 2246 - "objc2-foundation 0.3.1", 2247 ] 2248 2249 [[package]] 2250 name = "objc2-core-foundation" 2251 - version = "0.3.1" 2252 source = "registry+https://github.com/rust-lang/crates.io-index" 2253 - checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" 2254 dependencies = [ 2255 - "bitflags 2.9.1", 2256 "dispatch2", 2257 - "objc2 0.6.1", 2258 ] 2259 2260 [[package]] 2261 name = "objc2-core-graphics" 2262 - version = "0.3.1" 2263 source = "registry+https://github.com/rust-lang/crates.io-index" 2264 - checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" 2265 dependencies = [ 2266 - "bitflags 2.9.1", 2267 "dispatch2", 2268 - "objc2 0.6.1", 2269 "objc2-core-foundation", 2270 "objc2-io-surface", 2271 ] 2272 2273 [[package]] 2274 name = "objc2-core-image" 2275 - version = "0.3.1" 2276 source = "registry+https://github.com/rust-lang/crates.io-index" 2277 - checksum = "79b3dc0cc4386b6ccf21c157591b34a7f44c8e75b064f85502901ab2188c007e" 2278 dependencies = [ 2279 - "objc2 0.6.1", 2280 - "objc2-foundation 0.3.1", 2281 ] 2282 2283 [[package]] ··· 2301 source = "registry+https://github.com/rust-lang/crates.io-index" 2302 checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" 2303 dependencies = [ 2304 - "bitflags 2.9.1", 2305 "block2 0.5.1", 2306 "libc", 2307 "objc2 0.5.2", ··· 2309 2310 [[package]] 2311 name = "objc2-foundation" 2312 - version = "0.3.1" 2313 source = "registry+https://github.com/rust-lang/crates.io-index" 2314 - checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" 2315 dependencies = [ 2316 - "bitflags 2.9.1", 2317 - "block2 0.6.1", 2318 "libc", 2319 - "objc2 0.6.1", 2320 "objc2-core-foundation", 2321 ] 2322 2323 [[package]] 2324 name = "objc2-io-surface" 2325 - version = "0.3.1" 2326 source = "registry+https://github.com/rust-lang/crates.io-index" 2327 - checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" 2328 dependencies = [ 2329 - "bitflags 2.9.1", 2330 - "objc2 0.6.1", 2331 "objc2-core-foundation", 2332 ] 2333 ··· 2337 source = "registry+https://github.com/rust-lang/crates.io-index" 2338 checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" 2339 dependencies = [ 2340 - "bitflags 2.9.1", 2341 "block2 0.5.1", 2342 "objc2 0.5.2", 2343 "objc2-foundation 0.2.2", ··· 2349 source = "registry+https://github.com/rust-lang/crates.io-index" 2350 checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" 2351 dependencies = [ 2352 - "bitflags 2.9.1", 2353 "block2 0.5.1", 2354 "objc2 0.5.2", 2355 "objc2-foundation 0.2.2", ··· 2358 2359 [[package]] 2360 name = "objc2-quartz-core" 2361 - version = "0.3.1" 2362 source = "registry+https://github.com/rust-lang/crates.io-index" 2363 - checksum = "90ffb6a0cd5f182dc964334388560b12a57f7b74b3e2dec5e2722aa2dfb2ccd5" 2364 dependencies = [ 2365 - "bitflags 2.9.1", 2366 - "objc2 0.6.1", 2367 - "objc2-foundation 0.3.1", 2368 ] 2369 2370 [[package]] 2371 - name = "objc2-ui-kit" 2372 - version = "0.3.1" 2373 source = "registry+https://github.com/rust-lang/crates.io-index" 2374 - checksum = "25b1312ad7bc8a0e92adae17aa10f90aae1fb618832f9b993b022b591027daed" 2375 dependencies = [ 2376 - "bitflags 2.9.1", 2377 - "objc2 0.6.1", 2378 "objc2-core-foundation", 2379 - "objc2-foundation 0.3.1", 2380 ] 2381 2382 [[package]] 2383 - name = "objc2-web-kit" 2384 - version = "0.3.1" 2385 source = "registry+https://github.com/rust-lang/crates.io-index" 2386 - checksum = "91672909de8b1ce1c2252e95bbee8c1649c9ad9d14b9248b3d7b4c47903c47ad" 2387 dependencies = [ 2388 - "bitflags 2.9.1", 2389 - "block2 0.6.1", 2390 - "objc2 0.6.1", 2391 - "objc2-app-kit", 2392 "objc2-core-foundation", 2393 - "objc2-foundation 0.3.1", 2394 ] 2395 2396 [[package]] 2397 - name = "object" 2398 - version = "0.36.7" 2399 source = "registry+https://github.com/rust-lang/crates.io-index" 2400 - checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 2401 dependencies = [ 2402 - "memchr", 2403 ] 2404 2405 [[package]] ··· 2437 ] 2438 2439 [[package]] 2440 name = "pango" 2441 version = "0.18.3" 2442 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2469 2470 [[package]] 2471 name = "parking_lot" 2472 - version = "0.12.4" 2473 source = "registry+https://github.com/rust-lang/crates.io-index" 2474 - checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" 2475 dependencies = [ 2476 "lock_api", 2477 "parking_lot_core", ··· 2479 2480 [[package]] 2481 name = "parking_lot_core" 2482 - version = "0.9.11" 2483 source = "registry+https://github.com/rust-lang/crates.io-index" 2484 - checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" 2485 dependencies = [ 2486 "cfg-if", 2487 "libc", 2488 "redox_syscall", 2489 "smallvec", 2490 - "windows-targets 0.52.6", 2491 ] 2492 2493 [[package]] ··· 2498 2499 [[package]] 2500 name = "percent-encoding" 2501 - version = "2.3.1" 2502 source = "registry+https://github.com/rust-lang/crates.io-index" 2503 - checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 2504 2505 [[package]] 2506 name = "phf" ··· 2606 "phf_shared 0.11.3", 2607 "proc-macro2", 2608 "quote", 2609 - "syn 2.0.104", 2610 ] 2611 2612 [[package]] ··· 2667 2668 [[package]] 2669 name = "plist" 2670 - version = "1.7.4" 2671 source = "registry+https://github.com/rust-lang/crates.io-index" 2672 - checksum = "3af6b589e163c5a788fab00ce0c0366f6efbb9959c2f9874b224936af7fce7e1" 2673 dependencies = [ 2674 "base64 0.22.1", 2675 - "indexmap 2.10.0", 2676 - "quick-xml 0.38.0", 2677 "serde", 2678 "time", 2679 ] ··· 2692 ] 2693 2694 [[package]] 2695 name = "polling" 2696 - version = "3.9.0" 2697 source = "registry+https://github.com/rust-lang/crates.io-index" 2698 - checksum = "8ee9b2fa7a4517d2c91ff5bc6c297a427a96749d15f98fcdbb22c05571a4d4b7" 2699 dependencies = [ 2700 "cfg-if", 2701 "concurrent-queue", 2702 "hermit-abi", 2703 "pin-project-lite", 2704 - "rustix", 2705 - "windows-sys 0.60.2", 2706 ] 2707 2708 [[package]] 2709 name = "potential_utf" 2710 - version = "0.1.2" 2711 source = "registry+https://github.com/rust-lang/crates.io-index" 2712 - checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" 2713 dependencies = [ 2714 "zerovec", 2715 ] ··· 2747 2748 [[package]] 2749 name = "proc-macro-crate" 2750 - version = "2.0.0" 2751 source = "registry+https://github.com/rust-lang/crates.io-index" 2752 - checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" 2753 dependencies = [ 2754 - "toml_edit 0.20.7", 2755 ] 2756 2757 [[package]] 2758 name = "proc-macro-crate" 2759 - version = "3.3.0" 2760 source = "registry+https://github.com/rust-lang/crates.io-index" 2761 - checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" 2762 dependencies = [ 2763 - "toml_edit 0.22.27", 2764 ] 2765 2766 [[package]] ··· 2795 2796 [[package]] 2797 name = "proc-macro2" 2798 - version = "1.0.95" 2799 source = "registry+https://github.com/rust-lang/crates.io-index" 2800 - checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 2801 dependencies = [ 2802 "unicode-ident", 2803 ] 2804 2805 [[package]] 2806 name = "quick-xml" 2807 version = "0.37.5" 2808 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2813 2814 [[package]] 2815 name = "quick-xml" 2816 - version = "0.38.0" 2817 source = "registry+https://github.com/rust-lang/crates.io-index" 2818 - checksum = "8927b0664f5c5a98265138b7e3f90aa19a6b21353182469ace36d4ac527b7b1b" 2819 dependencies = [ 2820 "memchr", 2821 ] 2822 2823 [[package]] 2824 name = "quote" 2825 - version = "1.0.40" 2826 source = "registry+https://github.com/rust-lang/crates.io-index" 2827 - checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 2828 dependencies = [ 2829 "proc-macro2", 2830 ] ··· 2924 source = "registry+https://github.com/rust-lang/crates.io-index" 2925 checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 2926 dependencies = [ 2927 - "getrandom 0.3.3", 2928 ] 2929 2930 [[package]] ··· 2953 2954 [[package]] 2955 name = "redox_syscall" 2956 - version = "0.5.17" 2957 source = "registry+https://github.com/rust-lang/crates.io-index" 2958 - checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" 2959 dependencies = [ 2960 - "bitflags 2.9.1", 2961 ] 2962 2963 [[package]] 2964 name = "redox_users" 2965 - version = "0.5.0" 2966 source = "registry+https://github.com/rust-lang/crates.io-index" 2967 - checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" 2968 dependencies = [ 2969 "getrandom 0.2.16", 2970 "libredox", 2971 - "thiserror 2.0.12", 2972 ] 2973 2974 [[package]] 2975 name = "ref-cast" 2976 - version = "1.0.24" 2977 source = "registry+https://github.com/rust-lang/crates.io-index" 2978 - checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" 2979 dependencies = [ 2980 "ref-cast-impl", 2981 ] 2982 2983 [[package]] 2984 name = "ref-cast-impl" 2985 - version = "1.0.24" 2986 source = "registry+https://github.com/rust-lang/crates.io-index" 2987 - checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" 2988 dependencies = [ 2989 "proc-macro2", 2990 "quote", 2991 - "syn 2.0.104", 2992 ] 2993 2994 [[package]] 2995 name = "regex" 2996 - version = "1.11.1" 2997 source = "registry+https://github.com/rust-lang/crates.io-index" 2998 - checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 2999 dependencies = [ 3000 "aho-corasick", 3001 "memchr", ··· 3005 3006 [[package]] 3007 name = "regex-automata" 3008 - version = "0.4.9" 3009 source = "registry+https://github.com/rust-lang/crates.io-index" 3010 - checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 3011 dependencies = [ 3012 "aho-corasick", 3013 "memchr", ··· 3016 3017 [[package]] 3018 name = "regex-syntax" 3019 - version = "0.8.5" 3020 source = "registry+https://github.com/rust-lang/crates.io-index" 3021 - checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 3022 3023 [[package]] 3024 name = "reqwest" 3025 - version = "0.12.22" 3026 source = "registry+https://github.com/rust-lang/crates.io-index" 3027 - checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" 3028 dependencies = [ 3029 "base64 0.22.1", 3030 "bytes", ··· 3062 checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" 3063 dependencies = [ 3064 "ashpd", 3065 - "block2 0.6.1", 3066 "dispatch2", 3067 "glib-sys", 3068 "gobject-sys", 3069 "gtk-sys", 3070 "js-sys", 3071 "log", 3072 - "objc2 0.6.1", 3073 "objc2-app-kit", 3074 "objc2-core-foundation", 3075 - "objc2-foundation 0.3.1", 3076 "raw-window-handle", 3077 "wasm-bindgen", 3078 "wasm-bindgen-futures", ··· 3081 ] 3082 3083 [[package]] 3084 - name = "rustc-demangle" 3085 - version = "0.1.26" 3086 - source = "registry+https://github.com/rust-lang/crates.io-index" 3087 - checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" 3088 - 3089 - [[package]] 3090 name = "rustc_version" 3091 version = "0.4.1" 3092 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3097 3098 [[package]] 3099 name = "rustix" 3100 - version = "1.0.8" 3101 source = "registry+https://github.com/rust-lang/crates.io-index" 3102 - checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" 3103 dependencies = [ 3104 - "bitflags 2.9.1", 3105 "errno", 3106 "libc", 3107 - "linux-raw-sys", 3108 - "windows-sys 0.60.2", 3109 ] 3110 3111 [[package]] 3112 name = "rustversion" 3113 - version = "1.0.21" 3114 source = "registry+https://github.com/rust-lang/crates.io-index" 3115 - checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" 3116 3117 [[package]] 3118 name = "ryu" ··· 3158 3159 [[package]] 3160 name = "schemars" 3161 - version = "1.0.4" 3162 source = "registry+https://github.com/rust-lang/crates.io-index" 3163 - checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" 3164 dependencies = [ 3165 "dyn-clone", 3166 "ref-cast", ··· 3177 "proc-macro2", 3178 "quote", 3179 "serde_derive_internals", 3180 - "syn 2.0.104", 3181 ] 3182 3183 [[package]] ··· 3212 3213 [[package]] 3214 name = "semver" 3215 - version = "1.0.26" 3216 source = "registry+https://github.com/rust-lang/crates.io-index" 3217 - checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" 3218 dependencies = [ 3219 "serde", 3220 ] 3221 3222 [[package]] 3223 name = "serde" 3224 - version = "1.0.219" 3225 source = "registry+https://github.com/rust-lang/crates.io-index" 3226 - checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 3227 dependencies = [ 3228 "serde_derive", 3229 ] 3230 3231 [[package]] 3232 name = "serde-untagged" 3233 - version = "0.1.7" 3234 source = "registry+https://github.com/rust-lang/crates.io-index" 3235 - checksum = "299d9c19d7d466db4ab10addd5703e4c615dec2a5a16dbbafe191045e87ee66e" 3236 dependencies = [ 3237 "erased-serde", 3238 "serde", 3239 "typeid", 3240 ] 3241 3242 [[package]] 3243 name = "serde_derive" 3244 - version = "1.0.219" 3245 source = "registry+https://github.com/rust-lang/crates.io-index" 3246 - checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 3247 dependencies = [ 3248 "proc-macro2", 3249 "quote", 3250 - "syn 2.0.104", 3251 ] 3252 3253 [[package]] ··· 3258 dependencies = [ 3259 "proc-macro2", 3260 "quote", 3261 - "syn 2.0.104", 3262 ] 3263 3264 [[package]] 3265 name = "serde_json" 3266 - version = "1.0.141" 3267 source = "registry+https://github.com/rust-lang/crates.io-index" 3268 - checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" 3269 dependencies = [ 3270 "itoa", 3271 "memchr", 3272 "ryu", 3273 "serde", 3274 ] 3275 3276 [[package]] ··· 3281 dependencies = [ 3282 "proc-macro2", 3283 "quote", 3284 - "syn 2.0.104", 3285 ] 3286 3287 [[package]] ··· 3295 3296 [[package]] 3297 name = "serde_spanned" 3298 - version = "1.0.0" 3299 source = "registry+https://github.com/rust-lang/crates.io-index" 3300 - checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" 3301 dependencies = [ 3302 - "serde", 3303 ] 3304 3305 [[package]] ··· 3316 3317 [[package]] 3318 name = "serde_with" 3319 - version = "3.14.0" 3320 source = "registry+https://github.com/rust-lang/crates.io-index" 3321 - checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" 3322 dependencies = [ 3323 "base64 0.22.1", 3324 "chrono", 3325 "hex", 3326 "indexmap 1.9.3", 3327 - "indexmap 2.10.0", 3328 "schemars 0.9.0", 3329 - "schemars 1.0.4", 3330 - "serde", 3331 - "serde_derive", 3332 "serde_json", 3333 "serde_with_macros", 3334 "time", ··· 3336 3337 [[package]] 3338 name = "serde_with_macros" 3339 - version = "3.14.0" 3340 source = "registry+https://github.com/rust-lang/crates.io-index" 3341 - checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" 3342 dependencies = [ 3343 "darling", 3344 "proc-macro2", 3345 "quote", 3346 - "syn 2.0.104", 3347 ] 3348 3349 [[package]] 3350 name = "serialize-to-javascript" 3351 - version = "0.1.1" 3352 source = "registry+https://github.com/rust-lang/crates.io-index" 3353 - checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" 3354 dependencies = [ 3355 "serde", 3356 "serde_json", ··· 3359 3360 [[package]] 3361 name = "serialize-to-javascript-impl" 3362 - version = "0.1.1" 3363 source = "registry+https://github.com/rust-lang/crates.io-index" 3364 - checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" 3365 dependencies = [ 3366 "proc-macro2", 3367 "quote", 3368 - "syn 1.0.109", 3369 ] 3370 3371 [[package]] ··· 3397 3398 [[package]] 3399 name = "signal-hook-registry" 3400 - version = "1.4.5" 3401 source = "registry+https://github.com/rust-lang/crates.io-index" 3402 - checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" 3403 dependencies = [ 3404 "libc", 3405 ] ··· 3424 3425 [[package]] 3426 name = "slab" 3427 - version = "0.4.10" 3428 source = "registry+https://github.com/rust-lang/crates.io-index" 3429 - checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" 3430 3431 [[package]] 3432 name = "smallvec" ··· 3436 3437 [[package]] 3438 name = "socket2" 3439 - version = "0.6.0" 3440 source = "registry+https://github.com/rust-lang/crates.io-index" 3441 - checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" 3442 dependencies = [ 3443 "libc", 3444 - "windows-sys 0.59.0", 3445 ] 3446 3447 [[package]] ··· 3452 dependencies = [ 3453 "bytemuck", 3454 "cfg_aliases", 3455 - "core-graphics", 3456 "foreign-types", 3457 "js-sys", 3458 "log", ··· 3494 3495 [[package]] 3496 name = "stable_deref_trait" 3497 - version = "1.2.0" 3498 source = "registry+https://github.com/rust-lang/crates.io-index" 3499 - checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 3500 3501 [[package]] 3502 name = "static_assertions" ··· 3559 3560 [[package]] 3561 name = "syn" 3562 - version = "2.0.104" 3563 source = "registry+https://github.com/rust-lang/crates.io-index" 3564 - checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" 3565 dependencies = [ 3566 "proc-macro2", 3567 "quote", ··· 3585 dependencies = [ 3586 "proc-macro2", 3587 "quote", 3588 - "syn 2.0.104", 3589 ] 3590 3591 [[package]] ··· 3597 "cfg-expr", 3598 "heck 0.5.0", 3599 "pkg-config", 3600 - "toml 0.8.23", 3601 "version-compare", 3602 ] 3603 3604 [[package]] 3605 name = "tao" 3606 - version = "0.34.0" 3607 source = "registry+https://github.com/rust-lang/crates.io-index" 3608 - checksum = "49c380ca75a231b87b6c9dd86948f035012e7171d1a7c40a9c2890489a7ffd8a" 3609 dependencies = [ 3610 - "bitflags 2.9.1", 3611 "core-foundation", 3612 - "core-graphics", 3613 "crossbeam-channel", 3614 "dispatch", 3615 "dlopen2", ··· 3624 "ndk", 3625 "ndk-context", 3626 "ndk-sys", 3627 - "objc2 0.6.1", 3628 "objc2-app-kit", 3629 - "objc2-foundation 0.3.1", 3630 "once_cell", 3631 "parking_lot", 3632 "raw-window-handle", ··· 3635 "unicode-segmentation", 3636 "url", 3637 "windows", 3638 - "windows-core", 3639 "windows-version", 3640 "x11-dl", 3641 ] ··· 3648 dependencies = [ 3649 "proc-macro2", 3650 "quote", 3651 - "syn 2.0.104", 3652 ] 3653 3654 [[package]] ··· 3659 3660 [[package]] 3661 name = "tauri" 3662 - version = "2.7.0" 3663 source = "registry+https://github.com/rust-lang/crates.io-index" 3664 - checksum = "352a4bc7bf6c25f5624227e3641adf475a6535707451b09bb83271df8b7a6ac7" 3665 dependencies = [ 3666 "anyhow", 3667 "bytes", 3668 "dirs", 3669 "dunce", 3670 "embed_plist", 3671 - "getrandom 0.3.3", 3672 "glob", 3673 "gtk", 3674 "heck 0.5.0", 3675 "http", 3676 "jni", 3677 "libc", 3678 "log", 3679 "mime", 3680 "muda", 3681 - "objc2 0.6.1", 3682 "objc2-app-kit", 3683 - "objc2-foundation 0.3.1", 3684 "objc2-ui-kit", 3685 "percent-encoding", 3686 "plist", 3687 "raw-window-handle", ··· 3696 "tauri-runtime", 3697 "tauri-runtime-wry", 3698 "tauri-utils", 3699 - "thiserror 2.0.12", 3700 "tokio", 3701 "tray-icon", 3702 "url", 3703 - "urlpattern", 3704 "webkit2gtk", 3705 "webview2-com", 3706 "window-vibrancy", ··· 3709 3710 [[package]] 3711 name = "tauri-build" 3712 - version = "2.3.1" 3713 source = "registry+https://github.com/rust-lang/crates.io-index" 3714 - checksum = "182d688496c06bf08ea896459bf483eb29cdff35c1c4c115fb14053514303064" 3715 dependencies = [ 3716 "anyhow", 3717 "cargo_toml", ··· 3725 "serde_json", 3726 "tauri-utils", 3727 "tauri-winres", 3728 - "toml 0.8.23", 3729 "walkdir", 3730 ] 3731 3732 [[package]] 3733 name = "tauri-codegen" 3734 - version = "2.3.1" 3735 source = "registry+https://github.com/rust-lang/crates.io-index" 3736 - checksum = "b54a99a6cd8e01abcfa61508177e6096a4fe2681efecee9214e962f2f073ae4a" 3737 dependencies = [ 3738 "base64 0.22.1", 3739 "brotli", 3740 "ico", 3741 "json-patch", 3742 "plist", 3743 - "png", 3744 "proc-macro2", 3745 "quote", 3746 "semver", 3747 "serde", 3748 "serde_json", 3749 "sha2", 3750 - "syn 2.0.104", 3751 "tauri-utils", 3752 - "thiserror 2.0.12", 3753 "time", 3754 "url", 3755 "uuid", ··· 3758 3759 [[package]] 3760 name = "tauri-macros" 3761 - version = "2.3.2" 3762 source = "registry+https://github.com/rust-lang/crates.io-index" 3763 - checksum = "7945b14dc45e23532f2ded6e120170bbdd4af5ceaa45784a6b33d250fbce3f9e" 3764 dependencies = [ 3765 "heck 0.5.0", 3766 "proc-macro2", 3767 "quote", 3768 - "syn 2.0.104", 3769 "tauri-codegen", 3770 "tauri-utils", 3771 ] 3772 3773 [[package]] 3774 name = "tauri-plugin" 3775 - version = "2.3.1" 3776 source = "registry+https://github.com/rust-lang/crates.io-index" 3777 - checksum = "5bd5c1e56990c70a906ef67a9851bbdba9136d26075ee9a2b19c8b46986b3e02" 3778 dependencies = [ 3779 "anyhow", 3780 "glob", ··· 3783 "serde", 3784 "serde_json", 3785 "tauri-utils", 3786 - "toml 0.8.23", 3787 "walkdir", 3788 ] 3789 3790 [[package]] 3791 - name = "tauri-plugin-dialog" 3792 version = "2.3.2" 3793 source = "registry+https://github.com/rust-lang/crates.io-index" 3794 - checksum = "37e5858cc7b455a73ab4ea2ebc08b5be33682c00ff1bf4cad5537d4fb62499d9" 3795 dependencies = [ 3796 "log", 3797 "raw-window-handle", ··· 3801 "tauri", 3802 "tauri-plugin", 3803 "tauri-plugin-fs", 3804 - "thiserror 2.0.12", 3805 "url", 3806 ] 3807 3808 [[package]] 3809 name = "tauri-plugin-fs" 3810 - version = "2.4.1" 3811 source = "registry+https://github.com/rust-lang/crates.io-index" 3812 - checksum = "8c6ef84ee2f2094ce093e55106d90d763ba343fad57566992962e8f76d113f99" 3813 dependencies = [ 3814 "anyhow", 3815 "dunce", ··· 3822 "tauri", 3823 "tauri-plugin", 3824 "tauri-utils", 3825 - "thiserror 2.0.12", 3826 - "toml 0.8.23", 3827 "url", 3828 ] 3829 3830 [[package]] 3831 name = "tauri-plugin-opener" 3832 - version = "2.4.0" 3833 source = "registry+https://github.com/rust-lang/crates.io-index" 3834 - checksum = "ecee219f11cdac713ab32959db5d0cceec4810ba4f4458da992292ecf9660321" 3835 dependencies = [ 3836 "dunce", 3837 "glob", 3838 "objc2-app-kit", 3839 - "objc2-foundation 0.3.1", 3840 "open", 3841 "schemars 0.8.22", 3842 "serde", 3843 "serde_json", 3844 "tauri", 3845 "tauri-plugin", 3846 - "thiserror 2.0.12", 3847 "url", 3848 "windows", 3849 "zbus", 3850 ] 3851 3852 [[package]] 3853 name = "tauri-runtime" 3854 - version = "2.7.1" 3855 source = "registry+https://github.com/rust-lang/crates.io-index" 3856 - checksum = "2b1cc885be806ea15ff7b0eb47098a7b16323d9228876afda329e34e2d6c4676" 3857 dependencies = [ 3858 "cookie", 3859 "dpi", 3860 "gtk", 3861 "http", 3862 "jni", 3863 - "objc2 0.6.1", 3864 "objc2-ui-kit", 3865 "raw-window-handle", 3866 "serde", 3867 "serde_json", 3868 "tauri-utils", 3869 - "thiserror 2.0.12", 3870 "url", 3871 "windows", 3872 ] 3873 3874 [[package]] 3875 name = "tauri-runtime-wry" 3876 - version = "2.7.2" 3877 source = "registry+https://github.com/rust-lang/crates.io-index" 3878 - checksum = "fe653a2fbbef19fe898efc774bc52c8742576342a33d3d028c189b57eb1d2439" 3879 dependencies = [ 3880 "gtk", 3881 "http", 3882 "jni", 3883 "log", 3884 - "objc2 0.6.1", 3885 "objc2-app-kit", 3886 - "objc2-foundation 0.3.1", 3887 "once_cell", 3888 "percent-encoding", 3889 "raw-window-handle", ··· 3900 3901 [[package]] 3902 name = "tauri-utils" 3903 - version = "2.6.0" 3904 source = "registry+https://github.com/rust-lang/crates.io-index" 3905 - checksum = "9330c15cabfe1d9f213478c9e8ec2b0c76dab26bb6f314b8ad1c8a568c1d186e" 3906 dependencies = [ 3907 "anyhow", 3908 "brotli", ··· 3928 "serde_json", 3929 "serde_with", 3930 "swift-rs", 3931 - "thiserror 2.0.12", 3932 - "toml 0.8.23", 3933 "url", 3934 "urlpattern", 3935 "uuid", ··· 3938 3939 [[package]] 3940 name = "tauri-winres" 3941 - version = "0.3.1" 3942 source = "registry+https://github.com/rust-lang/crates.io-index" 3943 - checksum = "e8d321dbc6f998d825ab3f0d62673e810c861aac2d0de2cc2c395328f1d113b4" 3944 dependencies = [ 3945 "embed-resource", 3946 - "indexmap 2.10.0", 3947 - "toml 0.8.23", 3948 ] 3949 3950 [[package]] 3951 name = "tempfile" 3952 - version = "3.20.0" 3953 source = "registry+https://github.com/rust-lang/crates.io-index" 3954 - checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" 3955 dependencies = [ 3956 "fastrand", 3957 - "getrandom 0.3.3", 3958 "once_cell", 3959 - "rustix", 3960 - "windows-sys 0.59.0", 3961 ] 3962 3963 [[package]] ··· 3982 3983 [[package]] 3984 name = "thiserror" 3985 - version = "2.0.12" 3986 source = "registry+https://github.com/rust-lang/crates.io-index" 3987 - checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 3988 dependencies = [ 3989 - "thiserror-impl 2.0.12", 3990 ] 3991 3992 [[package]] ··· 3997 dependencies = [ 3998 "proc-macro2", 3999 "quote", 4000 - "syn 2.0.104", 4001 ] 4002 4003 [[package]] 4004 name = "thiserror-impl" 4005 - version = "2.0.12" 4006 source = "registry+https://github.com/rust-lang/crates.io-index" 4007 - checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 4008 dependencies = [ 4009 "proc-macro2", 4010 "quote", 4011 - "syn 2.0.104", 4012 ] 4013 4014 [[package]] 4015 name = "time" 4016 - version = "0.3.41" 4017 source = "registry+https://github.com/rust-lang/crates.io-index" 4018 - checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" 4019 dependencies = [ 4020 "deranged", 4021 "itoa", ··· 4028 4029 [[package]] 4030 name = "time-core" 4031 - version = "0.1.4" 4032 source = "registry+https://github.com/rust-lang/crates.io-index" 4033 - checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" 4034 4035 [[package]] 4036 name = "time-macros" 4037 - version = "0.2.22" 4038 source = "registry+https://github.com/rust-lang/crates.io-index" 4039 - checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" 4040 dependencies = [ 4041 "num-conv", 4042 "time-core", ··· 4044 4045 [[package]] 4046 name = "tinystr" 4047 - version = "0.8.1" 4048 source = "registry+https://github.com/rust-lang/crates.io-index" 4049 - checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 4050 dependencies = [ 4051 "displaydoc", 4052 "zerovec", ··· 4054 4055 [[package]] 4056 name = "tokio" 4057 - version = "1.47.0" 4058 source = "registry+https://github.com/rust-lang/crates.io-index" 4059 - checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35" 4060 dependencies = [ 4061 - "backtrace", 4062 "bytes", 4063 - "io-uring", 4064 "libc", 4065 "mio", 4066 "pin-project-lite", 4067 "signal-hook-registry", 4068 - "slab", 4069 "socket2", 4070 "tokio-macros", 4071 "tracing", 4072 - "windows-sys 0.59.0", 4073 ] 4074 4075 [[package]] 4076 name = "tokio-macros" 4077 - version = "2.5.0" 4078 source = "registry+https://github.com/rust-lang/crates.io-index" 4079 - checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 4080 dependencies = [ 4081 "proc-macro2", 4082 "quote", 4083 - "syn 2.0.104", 4084 ] 4085 4086 [[package]] 4087 name = "tokio-util" 4088 - version = "0.7.15" 4089 source = "registry+https://github.com/rust-lang/crates.io-index" 4090 - checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" 4091 dependencies = [ 4092 "bytes", 4093 "futures-core", ··· 4098 4099 [[package]] 4100 name = "toml" 4101 - version = "0.8.23" 4102 source = "registry+https://github.com/rust-lang/crates.io-index" 4103 - checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" 4104 dependencies = [ 4105 "serde", 4106 "serde_spanned 0.6.9", 4107 - "toml_datetime 0.6.11", 4108 - "toml_edit 0.22.27", 4109 ] 4110 4111 [[package]] 4112 name = "toml" 4113 - version = "0.9.3" 4114 source = "registry+https://github.com/rust-lang/crates.io-index" 4115 - checksum = "e06723639aaded957e5a80be250c1f82f274b9d23ebb4d94163668470623461c" 4116 dependencies = [ 4117 - "indexmap 2.10.0", 4118 - "serde", 4119 - "serde_spanned 1.0.0", 4120 - "toml_datetime 0.7.0", 4121 "toml_parser", 4122 "toml_writer", 4123 - "winnow 0.7.12", 4124 ] 4125 4126 [[package]] 4127 name = "toml_datetime" 4128 - version = "0.6.11" 4129 source = "registry+https://github.com/rust-lang/crates.io-index" 4130 - checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" 4131 dependencies = [ 4132 "serde", 4133 ] 4134 4135 [[package]] 4136 name = "toml_datetime" 4137 - version = "0.7.0" 4138 source = "registry+https://github.com/rust-lang/crates.io-index" 4139 - checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" 4140 dependencies = [ 4141 - "serde", 4142 ] 4143 4144 [[package]] ··· 4147 source = "registry+https://github.com/rust-lang/crates.io-index" 4148 checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" 4149 dependencies = [ 4150 - "indexmap 2.10.0", 4151 - "toml_datetime 0.6.11", 4152 "winnow 0.5.40", 4153 ] 4154 4155 [[package]] 4156 name = "toml_edit" 4157 - version = "0.20.7" 4158 source = "registry+https://github.com/rust-lang/crates.io-index" 4159 - checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" 4160 dependencies = [ 4161 - "indexmap 2.10.0", 4162 - "toml_datetime 0.6.11", 4163 "winnow 0.5.40", 4164 ] 4165 4166 [[package]] 4167 name = "toml_edit" 4168 - version = "0.22.27" 4169 source = "registry+https://github.com/rust-lang/crates.io-index" 4170 - checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" 4171 dependencies = [ 4172 - "indexmap 2.10.0", 4173 - "serde", 4174 - "serde_spanned 0.6.9", 4175 - "toml_datetime 0.6.11", 4176 - "toml_write", 4177 - "winnow 0.7.12", 4178 ] 4179 4180 [[package]] 4181 name = "toml_parser" 4182 - version = "1.0.1" 4183 source = "registry+https://github.com/rust-lang/crates.io-index" 4184 - checksum = "97200572db069e74c512a14117b296ba0a80a30123fbbb5aa1f4a348f639ca30" 4185 dependencies = [ 4186 - "winnow 0.7.12", 4187 ] 4188 4189 [[package]] 4190 - name = "toml_write" 4191 - version = "0.1.2" 4192 - source = "registry+https://github.com/rust-lang/crates.io-index" 4193 - checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" 4194 - 4195 - [[package]] 4196 name = "toml_writer" 4197 - version = "1.0.2" 4198 source = "registry+https://github.com/rust-lang/crates.io-index" 4199 - checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" 4200 4201 [[package]] 4202 name = "tower" ··· 4219 source = "registry+https://github.com/rust-lang/crates.io-index" 4220 checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" 4221 dependencies = [ 4222 - "bitflags 2.9.1", 4223 "bytes", 4224 "futures-util", 4225 "http", ··· 4262 dependencies = [ 4263 "proc-macro2", 4264 "quote", 4265 - "syn 2.0.104", 4266 ] 4267 4268 [[package]] ··· 4276 4277 [[package]] 4278 name = "tray-icon" 4279 - version = "0.21.0" 4280 source = "registry+https://github.com/rust-lang/crates.io-index" 4281 - checksum = "2da75ec677957aa21f6e0b361df0daab972f13a5bee3606de0638fd4ee1c666a" 4282 dependencies = [ 4283 "crossbeam-channel", 4284 "dirs", 4285 "libappindicator", 4286 "muda", 4287 - "objc2 0.6.1", 4288 "objc2-app-kit", 4289 "objc2-core-foundation", 4290 "objc2-core-graphics", 4291 - "objc2-foundation 0.3.1", 4292 "once_cell", 4293 - "png", 4294 "serde", 4295 - "thiserror 2.0.12", 4296 - "windows-sys 0.59.0", 4297 ] 4298 4299 [[package]] ··· 4310 4311 [[package]] 4312 name = "typenum" 4313 - version = "1.18.0" 4314 source = "registry+https://github.com/rust-lang/crates.io-index" 4315 - checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 4316 4317 [[package]] 4318 name = "uds_windows" ··· 4368 4369 [[package]] 4370 name = "unicode-ident" 4371 - version = "1.0.18" 4372 source = "registry+https://github.com/rust-lang/crates.io-index" 4373 - checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 4374 4375 [[package]] 4376 name = "unicode-segmentation" ··· 4380 4381 [[package]] 4382 name = "url" 4383 - version = "2.5.4" 4384 source = "registry+https://github.com/rust-lang/crates.io-index" 4385 - checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 4386 dependencies = [ 4387 "form_urlencoded", 4388 "idna", ··· 4416 4417 [[package]] 4418 name = "uuid" 4419 - version = "1.17.0" 4420 source = "registry+https://github.com/rust-lang/crates.io-index" 4421 - checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" 4422 dependencies = [ 4423 - "getrandom 0.3.3", 4424 "js-sys", 4425 "serde", 4426 "wasm-bindgen", ··· 4428 4429 [[package]] 4430 name = "version-compare" 4431 - version = "0.2.0" 4432 source = "registry+https://github.com/rust-lang/crates.io-index" 4433 - checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" 4434 4435 [[package]] 4436 name = "version_check" ··· 4490 checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 4491 4492 [[package]] 4493 - name = "wasi" 4494 - version = "0.14.2+wasi-0.2.4" 4495 source = "registry+https://github.com/rust-lang/crates.io-index" 4496 - checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 4497 dependencies = [ 4498 - "wit-bindgen-rt", 4499 ] 4500 4501 [[package]] 4502 name = "wasm-bindgen" 4503 - version = "0.2.100" 4504 source = "registry+https://github.com/rust-lang/crates.io-index" 4505 - checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 4506 dependencies = [ 4507 "cfg-if", 4508 "once_cell", 4509 "rustversion", 4510 "wasm-bindgen-macro", 4511 - ] 4512 - 4513 - [[package]] 4514 - name = "wasm-bindgen-backend" 4515 - version = "0.2.100" 4516 - source = "registry+https://github.com/rust-lang/crates.io-index" 4517 - checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 4518 - dependencies = [ 4519 - "bumpalo", 4520 - "log", 4521 - "proc-macro2", 4522 - "quote", 4523 - "syn 2.0.104", 4524 "wasm-bindgen-shared", 4525 ] 4526 4527 [[package]] 4528 name = "wasm-bindgen-futures" 4529 - version = "0.4.50" 4530 source = "registry+https://github.com/rust-lang/crates.io-index" 4531 - checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 4532 dependencies = [ 4533 "cfg-if", 4534 "js-sys", ··· 4539 4540 [[package]] 4541 name = "wasm-bindgen-macro" 4542 - version = "0.2.100" 4543 source = "registry+https://github.com/rust-lang/crates.io-index" 4544 - checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 4545 dependencies = [ 4546 "quote", 4547 "wasm-bindgen-macro-support", ··· 4549 4550 [[package]] 4551 name = "wasm-bindgen-macro-support" 4552 - version = "0.2.100" 4553 source = "registry+https://github.com/rust-lang/crates.io-index" 4554 - checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 4555 dependencies = [ 4556 "proc-macro2", 4557 "quote", 4558 - "syn 2.0.104", 4559 - "wasm-bindgen-backend", 4560 "wasm-bindgen-shared", 4561 ] 4562 4563 [[package]] 4564 name = "wasm-bindgen-shared" 4565 - version = "0.2.100" 4566 source = "registry+https://github.com/rust-lang/crates.io-index" 4567 - checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 4568 dependencies = [ 4569 "unicode-ident", 4570 ] ··· 4590 dependencies = [ 4591 "cc", 4592 "downcast-rs", 4593 - "rustix", 4594 "scoped-tls", 4595 "smallvec", 4596 "wayland-sys", ··· 4602 source = "registry+https://github.com/rust-lang/crates.io-index" 4603 checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" 4604 dependencies = [ 4605 - "bitflags 2.9.1", 4606 - "rustix", 4607 "wayland-backend", 4608 "wayland-scanner", 4609 ] ··· 4614 source = "registry+https://github.com/rust-lang/crates.io-index" 4615 checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" 4616 dependencies = [ 4617 - "bitflags 2.9.1", 4618 "wayland-backend", 4619 "wayland-client", 4620 "wayland-scanner", 4621 ] 4622 ··· 4644 4645 [[package]] 4646 name = "web-sys" 4647 - version = "0.3.77" 4648 source = "registry+https://github.com/rust-lang/crates.io-index" 4649 - checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 4650 dependencies = [ 4651 "js-sys", 4652 "wasm-bindgen", ··· 4705 "webview2-com-macros", 4706 "webview2-com-sys", 4707 "windows", 4708 - "windows-core", 4709 "windows-implement", 4710 "windows-interface", 4711 ] ··· 4718 dependencies = [ 4719 "proc-macro2", 4720 "quote", 4721 - "syn 2.0.104", 4722 ] 4723 4724 [[package]] ··· 4727 source = "registry+https://github.com/rust-lang/crates.io-index" 4728 checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" 4729 dependencies = [ 4730 - "thiserror 2.0.12", 4731 "windows", 4732 - "windows-core", 4733 ] 4734 4735 [[package]] 4736 name = "winapi" 4737 version = "0.3.9" 4738 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4750 4751 [[package]] 4752 name = "winapi-util" 4753 - version = "0.1.9" 4754 source = "registry+https://github.com/rust-lang/crates.io-index" 4755 - checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 4756 dependencies = [ 4757 - "windows-sys 0.59.0", 4758 ] 4759 4760 [[package]] ··· 4769 source = "registry+https://github.com/rust-lang/crates.io-index" 4770 checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" 4771 dependencies = [ 4772 - "objc2 0.6.1", 4773 "objc2-app-kit", 4774 "objc2-core-foundation", 4775 - "objc2-foundation 0.3.1", 4776 "raw-window-handle", 4777 "windows-sys 0.59.0", 4778 "windows-version", ··· 4785 checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" 4786 dependencies = [ 4787 "windows-collections", 4788 - "windows-core", 4789 "windows-future", 4790 - "windows-link", 4791 "windows-numerics", 4792 ] 4793 ··· 4797 source = "registry+https://github.com/rust-lang/crates.io-index" 4798 checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" 4799 dependencies = [ 4800 - "windows-core", 4801 ] 4802 4803 [[package]] ··· 4808 dependencies = [ 4809 "windows-implement", 4810 "windows-interface", 4811 - "windows-link", 4812 - "windows-result", 4813 - "windows-strings", 4814 ] 4815 4816 [[package]] ··· 4819 source = "registry+https://github.com/rust-lang/crates.io-index" 4820 checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" 4821 dependencies = [ 4822 - "windows-core", 4823 - "windows-link", 4824 "windows-threading", 4825 ] 4826 4827 [[package]] 4828 name = "windows-implement" 4829 - version = "0.60.0" 4830 source = "registry+https://github.com/rust-lang/crates.io-index" 4831 - checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" 4832 dependencies = [ 4833 "proc-macro2", 4834 "quote", 4835 - "syn 2.0.104", 4836 ] 4837 4838 [[package]] 4839 name = "windows-interface" 4840 - version = "0.59.1" 4841 source = "registry+https://github.com/rust-lang/crates.io-index" 4842 - checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" 4843 dependencies = [ 4844 "proc-macro2", 4845 "quote", 4846 - "syn 2.0.104", 4847 ] 4848 4849 [[package]] ··· 4853 checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 4854 4855 [[package]] 4856 name = "windows-numerics" 4857 version = "0.2.0" 4858 source = "registry+https://github.com/rust-lang/crates.io-index" 4859 checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" 4860 dependencies = [ 4861 - "windows-core", 4862 - "windows-link", 4863 ] 4864 4865 [[package]] ··· 4868 source = "registry+https://github.com/rust-lang/crates.io-index" 4869 checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" 4870 dependencies = [ 4871 - "windows-link", 4872 ] 4873 4874 [[package]] ··· 4877 source = "registry+https://github.com/rust-lang/crates.io-index" 4878 checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" 4879 dependencies = [ 4880 - "windows-link", 4881 ] 4882 4883 [[package]] ··· 4904 source = "registry+https://github.com/rust-lang/crates.io-index" 4905 checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 4906 dependencies = [ 4907 - "windows-targets 0.53.3", 4908 ] 4909 4910 [[package]] ··· 4940 4941 [[package]] 4942 name = "windows-targets" 4943 - version = "0.53.3" 4944 source = "registry+https://github.com/rust-lang/crates.io-index" 4945 - checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" 4946 dependencies = [ 4947 - "windows-link", 4948 - "windows_aarch64_gnullvm 0.53.0", 4949 - "windows_aarch64_msvc 0.53.0", 4950 - "windows_i686_gnu 0.53.0", 4951 - "windows_i686_gnullvm 0.53.0", 4952 - "windows_i686_msvc 0.53.0", 4953 - "windows_x86_64_gnu 0.53.0", 4954 - "windows_x86_64_gnullvm 0.53.0", 4955 - "windows_x86_64_msvc 0.53.0", 4956 ] 4957 4958 [[package]] ··· 4961 source = "registry+https://github.com/rust-lang/crates.io-index" 4962 checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" 4963 dependencies = [ 4964 - "windows-link", 4965 ] 4966 4967 [[package]] 4968 name = "windows-version" 4969 - version = "0.1.4" 4970 source = "registry+https://github.com/rust-lang/crates.io-index" 4971 - checksum = "e04a5c6627e310a23ad2358483286c7df260c964eb2d003d8efd6d0f4e79265c" 4972 dependencies = [ 4973 - "windows-link", 4974 ] 4975 4976 [[package]] ··· 4987 4988 [[package]] 4989 name = "windows_aarch64_gnullvm" 4990 - version = "0.53.0" 4991 source = "registry+https://github.com/rust-lang/crates.io-index" 4992 - checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 4993 4994 [[package]] 4995 name = "windows_aarch64_msvc" ··· 5005 5006 [[package]] 5007 name = "windows_aarch64_msvc" 5008 - version = "0.53.0" 5009 source = "registry+https://github.com/rust-lang/crates.io-index" 5010 - checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 5011 5012 [[package]] 5013 name = "windows_i686_gnu" ··· 5023 5024 [[package]] 5025 name = "windows_i686_gnu" 5026 - version = "0.53.0" 5027 source = "registry+https://github.com/rust-lang/crates.io-index" 5028 - checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 5029 5030 [[package]] 5031 name = "windows_i686_gnullvm" ··· 5035 5036 [[package]] 5037 name = "windows_i686_gnullvm" 5038 - version = "0.53.0" 5039 source = "registry+https://github.com/rust-lang/crates.io-index" 5040 - checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 5041 5042 [[package]] 5043 name = "windows_i686_msvc" ··· 5053 5054 [[package]] 5055 name = "windows_i686_msvc" 5056 - version = "0.53.0" 5057 source = "registry+https://github.com/rust-lang/crates.io-index" 5058 - checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 5059 5060 [[package]] 5061 name = "windows_x86_64_gnu" ··· 5071 5072 [[package]] 5073 name = "windows_x86_64_gnu" 5074 - version = "0.53.0" 5075 source = "registry+https://github.com/rust-lang/crates.io-index" 5076 - checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 5077 5078 [[package]] 5079 name = "windows_x86_64_gnullvm" ··· 5089 5090 [[package]] 5091 name = "windows_x86_64_gnullvm" 5092 - version = "0.53.0" 5093 source = "registry+https://github.com/rust-lang/crates.io-index" 5094 - checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 5095 5096 [[package]] 5097 name = "windows_x86_64_msvc" ··· 5107 5108 [[package]] 5109 name = "windows_x86_64_msvc" 5110 - version = "0.53.0" 5111 source = "registry+https://github.com/rust-lang/crates.io-index" 5112 - checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 5113 5114 [[package]] 5115 name = "winnow" ··· 5122 5123 [[package]] 5124 name = "winnow" 5125 - version = "0.7.12" 5126 source = "registry+https://github.com/rust-lang/crates.io-index" 5127 - checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" 5128 dependencies = [ 5129 "memchr", 5130 ] ··· 5140 ] 5141 5142 [[package]] 5143 - name = "wit-bindgen-rt" 5144 - version = "0.39.0" 5145 source = "registry+https://github.com/rust-lang/crates.io-index" 5146 - checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 5147 dependencies = [ 5148 - "bitflags 2.9.1", 5149 ] 5150 5151 [[package]] 5152 name = "writeable" 5153 - version = "0.6.1" 5154 source = "registry+https://github.com/rust-lang/crates.io-index" 5155 - checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 5156 5157 [[package]] 5158 name = "wry" 5159 - version = "0.52.1" 5160 source = "registry+https://github.com/rust-lang/crates.io-index" 5161 - checksum = "12a714d9ba7075aae04a6e50229d6109e3d584774b99a6a8c60de1698ca111b9" 5162 dependencies = [ 5163 "base64 0.22.1", 5164 - "block2 0.6.1", 5165 "cookie", 5166 "crossbeam-channel", 5167 "dpi", 5168 "dunce", 5169 "gdkx11", ··· 5175 "kuchikiki", 5176 "libc", 5177 "ndk", 5178 - "objc2 0.6.1", 5179 "objc2-app-kit", 5180 "objc2-core-foundation", 5181 - "objc2-foundation 0.3.1", 5182 "objc2-ui-kit", 5183 "objc2-web-kit", 5184 "once_cell", ··· 5187 "sha2", 5188 "soup3", 5189 "tao-macros", 5190 - "thiserror 2.0.12", 5191 "url", 5192 "webkit2gtk", 5193 "webkit2gtk-sys", 5194 "webview2-com", 5195 "windows", 5196 - "windows-core", 5197 "windows-version", 5198 "x11-dl", 5199 ] ··· 5220 ] 5221 5222 [[package]] 5223 name = "yoke" 5224 - version = "0.8.0" 5225 source = "registry+https://github.com/rust-lang/crates.io-index" 5226 - checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 5227 dependencies = [ 5228 - "serde", 5229 "stable_deref_trait", 5230 "yoke-derive", 5231 "zerofrom", ··· 5233 5234 [[package]] 5235 name = "yoke-derive" 5236 - version = "0.8.0" 5237 source = "registry+https://github.com/rust-lang/crates.io-index" 5238 - checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 5239 dependencies = [ 5240 "proc-macro2", 5241 "quote", 5242 - "syn 2.0.104", 5243 "synstructure", 5244 ] 5245 5246 [[package]] 5247 name = "zbus" 5248 - version = "5.9.0" 5249 source = "registry+https://github.com/rust-lang/crates.io-index" 5250 - checksum = "4bb4f9a464286d42851d18a605f7193b8febaf5b0919d71c6399b7b26e5b0aad" 5251 dependencies = [ 5252 "async-broadcast", 5253 "async-executor", ··· 5270 "tokio", 5271 "tracing", 5272 "uds_windows", 5273 - "windows-sys 0.59.0", 5274 - "winnow 0.7.12", 5275 "zbus_macros", 5276 "zbus_names", 5277 "zvariant", ··· 5279 5280 [[package]] 5281 name = "zbus_macros" 5282 - version = "5.9.0" 5283 source = "registry+https://github.com/rust-lang/crates.io-index" 5284 - checksum = "ef9859f68ee0c4ee2e8cde84737c78e3f4c54f946f2a38645d0d4c7a95327659" 5285 dependencies = [ 5286 - "proc-macro-crate 3.3.0", 5287 "proc-macro2", 5288 "quote", 5289 - "syn 2.0.104", 5290 "zbus_names", 5291 "zvariant", 5292 "zvariant_utils", ··· 5300 dependencies = [ 5301 "serde", 5302 "static_assertions", 5303 - "winnow 0.7.12", 5304 "zvariant", 5305 ] 5306 5307 [[package]] 5308 name = "zerocopy" 5309 - version = "0.8.26" 5310 source = "registry+https://github.com/rust-lang/crates.io-index" 5311 - checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" 5312 dependencies = [ 5313 "zerocopy-derive", 5314 ] 5315 5316 [[package]] 5317 name = "zerocopy-derive" 5318 - version = "0.8.26" 5319 source = "registry+https://github.com/rust-lang/crates.io-index" 5320 - checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" 5321 dependencies = [ 5322 "proc-macro2", 5323 "quote", 5324 - "syn 2.0.104", 5325 ] 5326 5327 [[package]] ··· 5341 dependencies = [ 5342 "proc-macro2", 5343 "quote", 5344 - "syn 2.0.104", 5345 "synstructure", 5346 ] 5347 5348 [[package]] 5349 name = "zerotrie" 5350 - version = "0.2.2" 5351 source = "registry+https://github.com/rust-lang/crates.io-index" 5352 - checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 5353 dependencies = [ 5354 "displaydoc", 5355 "yoke", ··· 5358 5359 [[package]] 5360 name = "zerovec" 5361 - version = "0.11.2" 5362 source = "registry+https://github.com/rust-lang/crates.io-index" 5363 - checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" 5364 dependencies = [ 5365 "yoke", 5366 "zerofrom", ··· 5369 5370 [[package]] 5371 name = "zerovec-derive" 5372 - version = "0.11.1" 5373 source = "registry+https://github.com/rust-lang/crates.io-index" 5374 - checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 5375 dependencies = [ 5376 "proc-macro2", 5377 "quote", 5378 - "syn 2.0.104", 5379 ] 5380 5381 [[package]] 5382 name = "zvariant" 5383 - version = "5.6.0" 5384 source = "registry+https://github.com/rust-lang/crates.io-index" 5385 - checksum = "d91b3680bb339216abd84714172b5138a4edac677e641ef17e1d8cb1b3ca6e6f" 5386 dependencies = [ 5387 "endi", 5388 "enumflags2", 5389 "serde", 5390 "url", 5391 - "winnow 0.7.12", 5392 "zvariant_derive", 5393 "zvariant_utils", 5394 ] 5395 5396 [[package]] 5397 name = "zvariant_derive" 5398 - version = "5.6.0" 5399 source = "registry+https://github.com/rust-lang/crates.io-index" 5400 - checksum = "3a8c68501be459a8dbfffbe5d792acdd23b4959940fc87785fb013b32edbc208" 5401 dependencies = [ 5402 - "proc-macro-crate 3.3.0", 5403 "proc-macro2", 5404 "quote", 5405 - "syn 2.0.104", 5406 "zvariant_utils", 5407 ] 5408 5409 [[package]] 5410 name = "zvariant_utils" 5411 - version = "3.2.0" 5412 source = "registry+https://github.com/rust-lang/crates.io-index" 5413 - checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" 5414 dependencies = [ 5415 "proc-macro2", 5416 "quote", 5417 "serde", 5418 - "static_assertions", 5419 - "syn 2.0.104", 5420 - "winnow 0.7.12", 5421 ]
··· 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" ··· 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" ··· 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]] ··· 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" ··· 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]] ··· 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 ] ··· 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" 668 version = "0.1.6" 669 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 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]] ··· 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]] ··· 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]] ··· 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", ··· 1098 checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 1099 1100 [[package]] 1101 + name = "foldhash" 1102 + version = "0.1.5" 1103 + source = "registry+https://github.com/rust-lang/crates.io-index" 1104 + checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 1105 + 1106 + [[package]] 1107 name = "foreign-types" 1108 version = "0.5.0" 1109 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 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 ] ··· 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]] ··· 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" ··· 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" ··· 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 ··· 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]] ··· 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" ··· 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" 2203 version = "0.8.9" 2204 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 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" ··· 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]] ··· 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]] ··· 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" ··· 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 ] ··· 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", ··· 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", ··· 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]] ··· 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]] ··· 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 ] ··· 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" ··· 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", ··· 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" ··· 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", ··· 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", ··· 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", ··· 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", ··· 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" ··· 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", ··· 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 ] ··· 4978 dependencies = [ 4979 "cc", 4980 "downcast-rs", 4981 + "rustix 1.1.2", 4982 "scoped-tls", 4983 "smallvec", 4984 "wayland-sys", ··· 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 ] ··· 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 ··· 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" 5144 version = "0.3.9" 5145 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 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]] ··· 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]] ··· 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]] ··· 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" ··· 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" ··· 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" ··· 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" ··· 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" ··· 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" ··· 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", ··· 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 ]
+12 -5
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 - tokio = { version = "1.47.0", features = [ "macros" ] } 26 - dirs = "6.0.0" 27 - anyhow = "1.0.99" 28 - flate2 = "1.1.2" 29 tauri-plugin-dialog = "2" 30
··· 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
+5 -1
src-tauri/capabilities/default.json
··· 7 ], 8 "permissions": [ 9 "core:default", 10 "opener:default", 11 - "dialog:default" 12 ] 13 }
··· 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 + }
+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 + }
+4 -1
src-tauri/src/frontend_calls/mod.rs
··· 1 pub mod get_addresses; 2 pub mod save_graph; 3 - pub mod sync_tab;
··· 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;
+6 -3
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 5 #[tauri::command] 6 - pub fn save_graph( graph: String, path: PathBuf ) { 7 - dbg!(&graph, &path); 8 - 9 let file = File::create(&path).unwrap(); 10 let mut encoder = GzEncoder::new(file, Compression::default()); 11 12 encoder.write_all(graph.as_bytes()).unwrap(); 13 encoder.finish().unwrap(); 14 }
··· 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 + }
+26 -7
src-tauri/src/frontend_calls/sync_tab.rs
··· 1 - use std::sync::mpsc::Sender; 2 3 use tauri::State; 4 5 - use crate::{ runtime::commands::RuntimeCommand, structs::nodes::Node }; 6 7 #[tauri::command] 8 - pub fn sync_tab( graph: Vec<Node>, id: String, cmd: State<Sender<RuntimeCommand>> ) { 9 - cmd.send(RuntimeCommand::AddTab(graph, id)).unwrap(); 10 } 11 12 #[tauri::command] 13 - pub fn discard_tab( id: String, cmd: State<Sender<RuntimeCommand>> ) { 14 - cmd.send(RuntimeCommand::RemoveTab(id)).unwrap(); 15 - }
··· 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 + }
+17 -8
src-tauri/src/lib.rs
··· 1 - use std::{collections::HashMap, fs, sync::{self, Arc, Mutex}}; 2 3 use frontend_calls::*; 4 5 - use crate::{ osc::OSCMessage, runtime::nodes::RuntimeNodeTree, setup::setup, utils::config::Config }; 6 7 mod frontend_calls; 8 mod osc; 9 mod setup; 10 mod structs; 11 mod utils; 12 - mod runtime; 13 14 #[cfg_attr(mobile, tauri::mobile_entry_point)] 15 #[tokio::main] ··· 19 match fs::metadata(&container_folder) { 20 Ok(meta) => { 21 if meta.is_file() { 22 - panic!( 23 - "document.write('Cannot launch app as the container path is a file not a directory')" 24 - ); 25 } 26 } 27 Err(_) => { ··· 34 35 static ADDRESSES: Mutex<Vec<OSCMessage>> = Mutex::new(Vec::new()); 36 37 - let ( runtime_sender, runtime_receiver ) = sync::mpsc::channel(); 38 39 tauri::Builder::default() 40 .plugin(tauri_plugin_dialog::init()) 41 .plugin(tauri_plugin_opener::init()) 42 .invoke_handler(tauri::generate_handler![ 43 get_addresses::get_addresses, 44 save_graph::save_graph, 45 sync_tab::sync_tab, 46 - sync_tab::discard_tab 47 ]) 48 .manage(conf) 49 .manage(&ADDRESSES)
··· 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)] 16 #[tokio::main] ··· 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(_) => { ··· 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)
+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 }
+2 -3
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 use serde::Serialize; 6 7 use crate::structs::parameter_types::ParameterType; ··· 160 } 161 } 162 163 - println!("{:X?}", &buf); 164 socket.send_to(&buf, ip_addr).unwrap(); 165 }
··· 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; ··· 160 } 161 } 162 163 socket.send_to(&buf, ip_addr).unwrap(); 164 }
+5 -4
src-tauri/src/runtime/commands.rs
··· 1 - use crate::{ osc::OSCMessage, structs::nodes::Node }; 2 3 - pub enum RuntimeCommand{ 4 OSCMessage(OSCMessage), 5 6 AddTab(Vec<Node>, String), 7 - RemoveTab(String) 8 - }
··· 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;
+36 -23
src-tauri/src/runtime/nodes/debug.rs
··· 1 - use crate::{ runtime::nodes::RuntimeNode, structs::{ nodes::Node, parameter_types::ParameterType } }; 2 3 - pub struct Debug{ 4 - to_log: Option<ParameterType> 5 } 6 7 - impl Debug{ 8 - pub fn new( node: Node ) -> Box<Self>{ 9 - Box::new(Self { to_log: None }) 10 } 11 } 12 13 - impl RuntimeNode for Debug{ 14 - fn outputs( &self ) -> Vec<Vec<( String, isize, isize )>> { vec![] } 15 - fn execute_dry( &mut self, _: &Vec<ParameterType> ) -> Option<Vec<ParameterType>> { Some(vec![]) } 16 17 - fn execute( &mut self ) -> bool { 18 - dbg!(&self.to_log); 19 - self.to_log = None; 20 21 - false 22 } 23 24 - fn update_arg( &mut self, index: usize, value: ParameterType ) -> bool { 25 - if index == 1{ 26 - self.to_log = Some(value); 27 - true 28 - } else{ 29 - false 30 - } 31 } 32 - 33 - fn is_entrypoint( &self ) -> bool { false } 34 - }
··· 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 + }
+51 -39
src-tauri/src/runtime/nodes/osctrigger.rs
··· 1 - use crate::{ runtime::nodes::RuntimeNode, structs::{ nodes::Node, parameter_types::ParameterType } }; 2 3 - pub struct OSCTrigger{ 4 - outputs: Vec<Vec<( String, isize, isize )>>, 5 - address: String, 6 - runtime_active: bool 7 } 8 9 - impl OSCTrigger{ 10 - pub fn new( node: Node ) -> Box<Self>{ 11 - dbg!(&node); 12 13 Box::new(Self { 14 - address: node.statics[0].value.as_str().unwrap().to_owned(), 15 - outputs: node.outputs.iter() 16 - .map(| x | { 17 - x.connections.iter().map(| x | { ( x.node.clone(), x.index, x.value_type ) }).collect() 18 - }).collect(), 19 - runtime_active: false 20 }) 21 } 22 } 23 24 - impl RuntimeNode for OSCTrigger{ 25 - fn outputs( &self ) -> Vec<Vec<( String, isize, isize )>> { 26 self.outputs.clone() 27 } 28 29 - fn execute_dry( &mut self, msg: &Vec<ParameterType> ) -> Option<Vec<ParameterType>> { 30 - if let ParameterType::String(address) = &msg[0]{ 31 - if *address == self.address{ 32 - self.runtime_active = true; 33 - Some(msg.clone()) 34 - // The first value is technically the address value, 35 - // but this value gets ignored as the first output of 36 - // the osctrigger node is a flow output which gets ignored 37 - // on dry runs. 38 } else{ 39 - self.runtime_active = false; 40 - None 41 } 42 } else{ 43 - self.runtime_active = false; 44 - None 45 - } 46 - } 47 - 48 - fn execute( &mut self ) -> bool { 49 - let execute = self.runtime_active; 50 - self.runtime_active = false; 51 52 - execute 53 } 54 55 - fn update_arg( &mut self, _: usize, _: ParameterType ) -> bool { false } 56 - fn is_entrypoint( &self ) -> bool { true } 57 - }
··· 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 + }
+85 -19
src-tauri/src/runtime/nodes.rs
··· 1 - use std::{collections::HashMap, sync::Mutex}; 2 3 - use crate::{ runtime::nodes::{ debug::Debug, osctrigger::OSCTrigger }, structs::{ nodes::Node, parameter_types::ParameterType } }; 4 5 - mod osctrigger; 6 mod debug; 7 8 - pub struct RuntimeNodeTree{ 9 - pub nodes: HashMap<String, Mutex<Box<dyn RuntimeNode>>> 10 } 11 12 - impl RuntimeNodeTree{ 13 - pub fn from( tree: Vec<Node> ) -> Self{ 14 - let mut runtime_nodes: HashMap<String, Mutex<Box<dyn RuntimeNode>>> = HashMap::new(); 15 - for node in tree{ 16 - match node.type_id.as_str(){ 17 - "osctrigger" => { runtime_nodes.insert(node.id.clone(), Mutex::new(OSCTrigger::new(node))); } 18 - "debug" => { runtime_nodes.insert(node.id.clone(), Mutex::new(Debug::new(node))); } 19 _ => {} 20 } 21 } 22 23 - Self { nodes: runtime_nodes } 24 } 25 } 26 27 - pub trait RuntimeNode{ 28 - fn outputs( &self ) -> Vec<Vec<( String, isize, isize )>>; // Node ID, input index, output value type 29 - fn execute_dry( &mut self, msg: &Vec<ParameterType> ) -> Option<Vec<ParameterType>>; // Only update values on the first loop through 30 - fn execute( &mut self ) -> bool; // Then call functions on the second loop 31 - fn update_arg( &mut self, index: usize, value: ParameterType ) -> bool; 32 - fn is_entrypoint( &self ) -> bool; 33 }
··· 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 }
+67 -45
src-tauri/src/runtime.rs
··· 1 - use anyhow::{ bail, Result }; 2 3 - use crate::{ runtime::nodes::RuntimeNodeTree, structs::parameter_types::ParameterType }; 4 - 5 - pub mod nodes; 6 - pub mod commands; 7 8 - // This is horrible. I know, I'm sorry. 9 10 - pub fn runtime_dry( entry: String, parameters: &Vec<ParameterType>, tab: &RuntimeNodeTree ) -> Result<()>{ 11 - let node = tab.nodes.get(&entry); 12 - if node.is_none(){ bail!("Cannot find node"); } 13 14 - let mut node = node.unwrap().lock().unwrap(); 15 16 - let output_map = node.outputs(); 17 - let args = node.execute_dry(parameters); 18 19 - drop(node); 20 21 - if args.is_some(){ 22 - let args = args.unwrap(); 23 24 - for i in 0..args.len(){ 25 - let arg = &args[i]; 26 27 - for output in &output_map[i]{ 28 - if output.2 == 5{ break; } // Ignore flow outputs 29 30 - let next_node = tab.nodes.get(&output.0); 31 - if next_node.is_none(){ bail!("Cannot find node {}", output.0) } 32 33 - let mut next_node = next_node.unwrap().lock().unwrap(); 34 - let can_update = next_node.update_arg(output.1 as usize, arg.clone()); 35 36 - if can_update{ 37 - drop(next_node); 38 - // ^^ Drop this MutexGuard before we enter the runtime, 39 - // as it blocks the runtime for gaining a lock on the node 40 - // TODO: Please find a better way of making it mutable 41 42 - runtime_dry(output.0.clone(), &vec![], &tab)?; 43 } 44 } 45 } ··· 48 Ok(()) 49 } 50 51 52 - pub fn runtime( entry: String, tab: &RuntimeNodeTree ) -> Result<()>{ 53 - let node = tab.nodes.get(&entry); 54 - if node.is_none(){ bail!("Cannot find node"); } 55 56 - let mut node = node.unwrap().lock().unwrap(); 57 58 - let next = node.execute(); 59 - if next{ 60 - let outputs = node.outputs(); 61 62 - drop(node); 63 64 - for outputs in outputs{ 65 - for output in outputs{ 66 - if output.2 == 5{ 67 - // This is a flow output, continue 68 - runtime(output.0, &tab)?; 69 - } 70 } 71 } 72 } 73 74 - Ok(()) 75 - }
··· 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 } ··· 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 + }
-97
src-tauri/src/runtime.rs.old
··· 1 - use std::collections::HashMap; 2 - 3 - use anyhow::bail; 4 - 5 - use crate::{ osc::OSCMessage, structs::{ nodes::{ Node, Tab }, parameter_types::ParameterType } }; 6 - 7 - pub fn start_runtime( 8 - tab: &Tab, 9 - msg: &OSCMessage, 10 - node_execution_table: 11 - &HashMap<String, Box<dyn Fn(&Node, &OSCMessage, Vec<ParameterType>) -> Vec<ParameterType>>> 12 - ) -> anyhow::Result<()>{ 13 - for i in 0..tab.nodes.len(){ 14 - let node = &tab.nodes[i]; 15 - 16 - if node.type_id == "osctrigger"{ 17 - runtime(&tab.nodes, i, msg, node_execution_table)?; 18 - } 19 - } 20 - 21 - Ok(()) 22 - } 23 - 24 - fn runtime( 25 - nodes: &Vec<Node>, 26 - index: usize, 27 - msg: &OSCMessage, 28 - node_execution_table: 29 - &HashMap<String, Box<dyn Fn(&Node, &OSCMessage, Vec<ParameterType>) -> Vec<ParameterType>>> 30 - ) -> anyhow::Result<()>{ 31 - let node = &nodes[index]; 32 - 33 - let execute_node = node_execution_table.get(&node.type_id); 34 - if execute_node.is_none(){ bail!("Cannot find node in execution table."); } 35 - 36 - let res = execute_node.unwrap()(node, msg, vec![]); 37 - if res.len() == 0{ return Ok(()); } 38 - 39 - let nodes_length = (&nodes).len(); 40 - 41 - for i in 0..res.len(){ 42 - let output = &node.outputs[i]; 43 - if output.value_type == 5 { // 5 - Flow Type 44 - 45 - if let ParameterType::Flow(run) = res[i]{ 46 - 47 - if run{ 48 - let connections = &output.connections; 49 - for connection in connections{ 50 - let mut found_node = None; 51 - 52 - for i in 0..nodes_length{ 53 - let node = &nodes[i]; 54 - 55 - if node.id == connection.node{ 56 - found_node = Some(i); 57 - break; 58 - } 59 - } 60 - 61 - if found_node.is_some(){ 62 - runtime(nodes, found_node.unwrap(), msg, node_execution_table)?; 63 - } 64 - } 65 - } 66 - } 67 - } 68 - } 69 - 70 - Ok(()) 71 - } 72 - 73 - pub fn load_excecution_table( 74 - node_execution_table: 75 - &mut HashMap<String, Box<dyn Fn(&Node, &OSCMessage, Vec<ParameterType>) -> Vec<ParameterType>>> 76 - ){ 77 - node_execution_table.insert("osctrigger".into(), Box::new(| node, msg, _ |{ 78 - if node.statics[0].value.is_null(){ return vec![ ParameterType::Flow(false) ] } 79 - 80 - let node_addr = node.statics[0].value.as_str().unwrap().to_owned(); 81 - if node_addr == msg.address{ 82 - let mut dat = vec![ 83 - ParameterType::Flow(true) 84 - ]; 85 - 86 - dat.extend(msg.values.clone()); 87 - dat 88 - } else{ 89 - vec![ ParameterType::Flow(false) ] 90 - } 91 - })); 92 - 93 - node_execution_table.insert("debug".into(), Box::new(| _, _, args |{ 94 - dbg!(&args[1]); 95 - vec![] 96 - })); 97 - }
···
+74 -42
src-tauri/src/setup.rs
··· 1 - use std::{ collections::HashMap, fs::File, io::Read, sync::{ self, mpsc::Receiver, Mutex } }; 2 3 use flate2::read::GzDecoder; 4 - use serde_json::{ Map, Value }; 5 - use tauri::{ App, Emitter, Listener, Manager }; 6 7 - use crate::{ osc::{ self, OSCMessage }, runtime::{ commands::RuntimeCommand, nodes::RuntimeNodeTree, runtime, runtime_dry }, structs::parameter_types::ParameterType }; 8 9 pub fn setup( 10 app: &mut App, 11 addresses: &'static Mutex<Vec<OSCMessage>>, 12 - runtime_command_receiver: Receiver<RuntimeCommand> 13 ) { 14 let window = app.get_webview_window("main").unwrap(); 15 16 let handle = window.clone(); 17 window.listen("tauri://drag-drop", move |ev| { ··· 32 handle.emit("load_new_tab", Value::Object(map)).unwrap(); 33 }); 34 35 - let ( sender, receiver ) = sync::mpsc::channel(); 36 37 tokio::spawn(async move { 38 osc::start_server(sender, "127.0.0.1:9001"); 39 }); 40 41 - let ( runtime_sender, runtime_receiver ) = sync::mpsc::channel(); 42 43 let runtime_sender_1 = runtime_sender.clone(); 44 tokio::spawn(async move { ··· 55 window.emit("osc-message", &message).unwrap(); 56 57 let msg = message.clone(); 58 - let mut addresses = addresses.lock().unwrap(); 59 - if !addresses.contains(&msg) { addresses.push(msg); } 60 61 - runtime_sender.send(RuntimeCommand::OSCMessage(message)).unwrap(); 62 } 63 }); 64 65 tokio::spawn(async move { 66 let mut tabs: HashMap<String, RuntimeNodeTree> = HashMap::new(); 67 68 loop { 69 let cmd = runtime_receiver.recv().unwrap(); 70 71 - match cmd{ 72 - RuntimeCommand::OSCMessage( msg ) => { 73 - for ( _, tab ) in &mut tabs{ 74 - for ( id, node ) in &tab.nodes{ 75 - let node = node.lock().unwrap(); 76 - 77 - if node.is_entrypoint(){ 78 - let args = vec![ 79 - vec![ ParameterType::String(msg.address.clone()) ], msg.values.clone() 80 - ].concat(); 81 - 82 - drop(node); 83 - // ^^ Drop this MutexGuard before we enter the runtime, 84 - // as it blocks the runtime for gaining a lock on the node 85 - // TODO: Please find a better way of making it mutable 86 - 87 - runtime_dry(id.clone(), &args, tab).unwrap(); 88 - } 89 - } 90 91 - for ( id, node ) in &tab.nodes{ 92 - let node = node.lock().unwrap(); 93 94 - if node.is_entrypoint(){ 95 - drop(node); 96 - // ^^ Drop this MutexGuard before we enter the runtime, 97 - // as it blocks the runtime for gaining a lock on the node 98 - // TODO: Please find a better way of making it mutable 99 100 - runtime(id.clone(), tab).unwrap(); 101 } 102 } 103 } 104 - }, 105 106 - RuntimeCommand::AddTab( graph, id ) => { 107 - tabs.insert(id, RuntimeNodeTree::from(graph)); 108 - }, 109 - RuntimeCommand::RemoveTab( id ) => { 110 tabs.remove(&id); 111 } 112 }
··· 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| { ··· 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 { ··· 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 }
+1 -1
src-tauri/src/structs/mod.rs
··· 1 pub mod parameter_types; 2 - pub mod nodes;
··· 1 + pub mod nodes; 2 pub mod parameter_types;
+17 -20
src-tauri/src/structs/nodes.rs
··· 1 - use serde::{ Deserialize, Serialize }; 2 use serde_json::Value; 3 4 - #[derive(Serialize, Deserialize, Debug)] 5 - pub struct Node{ 6 pub id: String, 7 pub name: String, 8 - pub outputs: Vec<NodeOutput>, 9 - pub pos: [ f32; 2 ], 10 pub statics: Vec<NodeStatic>, 11 12 #[serde(rename = "typeId")] 13 - pub type_id: String 14 } 15 16 - impl Node{ 17 - 18 - } 19 - 20 - #[derive(Serialize, Deserialize, Debug)] 21 - pub struct NodeStatic{ 22 pub name: String, 23 24 #[serde(rename = "type")] 25 pub value_type: isize, 26 - pub value: Value 27 } 28 29 - #[derive(Serialize, Deserialize, Debug)] 30 - pub struct NodeOutput{ 31 pub name: String, 32 33 #[serde(rename = "type")] 34 pub value_type: isize, 35 - pub connections: Vec<NodeOutputConnections> 36 } 37 38 - #[derive(Serialize, Deserialize, Debug)] 39 - pub struct NodeOutputConnections{ 40 pub name: String, 41 pub node: String, 42 pub index: isize, 43 44 #[serde(rename = "type")] 45 - pub value_type: isize 46 - }
··· 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 + }
+55 -1
src-tauri/src/structs/parameter_types.rs
··· 1 use serde::Serialize; 2 3 - #[derive(Serialize, Clone, Debug)] 4 #[serde(tag = "key", content = "value")] 5 pub enum ParameterType { 6 AnyType(String), ··· 11 Boolean(bool), 12 String(String), 13 Flow(bool), 14 }
··· 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), ··· 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 }
+27 -26
src-tauri/src/utils/config.rs
··· 3 fs::File, 4 io::{Read, Write}, 5 path::PathBuf, 6 - sync::Mutex, 7 }; 8 9 use flate2::{read::GzDecoder, write::GzEncoder, Compression}; 10 - use serde_json::Value; 11 12 pub struct Config { 13 - store: Mutex<HashMap<String, Value>>, 14 path: PathBuf, 15 } 16 ··· 26 "{}".into() 27 }; 28 29 - let json: Value = serde_json::from_str(&json_string).unwrap(); 30 - 31 - let mut hashmap = HashMap::new(); 32 - 33 - let obj = json.as_object().unwrap(); 34 - for (key, val) in obj { 35 - hashmap.insert(key.clone(), val.clone()); 36 - } 37 38 Config { 39 - store: Mutex::new(hashmap), 40 path: path, 41 } 42 } 43 44 - pub fn set(&self, key: &str, value: Value) { 45 - self.store.lock().unwrap().insert(key.to_owned(), value); 46 - } 47 48 - pub fn get(&self, key: &str) -> Option<Value> { 49 - let store = self.store.lock().unwrap(); 50 - let val = store.get(&key.to_owned()); 51 52 - if val.is_none() { 53 - None 54 - } else { 55 - Some(val.unwrap().clone()) 56 - } 57 } 58 59 - pub fn save(&self) { 60 - let dat = serde_json::to_string(&self.store.lock().unwrap().clone()).unwrap(); 61 - dbg!(&dat); 62 63 let file = File::create(&self.path).unwrap(); 64 let mut encoder = GzEncoder::new(file, Compression::default());
··· 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 ··· 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());
+2
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 + }
+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 //