this repo has no description

Compare changes

Choose any two refs to compare.

+5 -2
.gitignore
··· 1 node_modules 2 dist 3 - build 4 - target
··· 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>
+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
+86 -40
src/Mangers/NodeManager.tsx
··· 7 import { NodesByID } from "../Nodes/Nodes"; 8 import { save } from "@tauri-apps/plugin-dialog"; 9 import { ConfirmationManager } from "./ConfirmationManager"; 10 - import { getCurrentWindow } from "@tauri-apps/api/window"; 11 12 export interface TabHashMap { 13 [details: string] : Tab; ··· 24 constructor(){ 25 NodeManager.Instance = this; 26 27 listen('load_new_tab', ( ev: any ) => { 28 this._loadFromConfig(ev.payload.path, null, ev.payload.graph); 29 }); ··· 32 let version = await getVersion(); 33 34 for(let tab of Object.entries<any>(tabs)){ 35 - console.log(tab); 36 - 37 - await this._loadFromConfig(tab[1][2], tab[0], JSON.stringify({ 38 tab_name: tab[1][1], 39 version, 40 graph: tab[1][0] 41 })); 42 }; 43 }); 44 45 - (async () => { 46 - let window = await getCurrentWindow(); 47 48 - window.onCloseRequested(async _ => { 49 - let tabs = Object.values(this._tabs); 50 - let tabsNeedingSaving = tabs.filter(x => x.needsSave()); 51 - 52 - for(let tab of tabsNeedingSaving){ 53 - await new Promise<void>(res => { 54 - ConfirmationManager.Instance.ShowConfirmation( 55 - `Discard Changes in ${tab.name}?`, 56 - 'If you close this tab without saving you will lose all changes.', 57 - [ 58 - { 59 - text: 'Save', 60 - callback: async () => { 61 - await this.SaveTab(tab); 62 - res(); 63 - } 64 - }, 65 - { 66 - text: 'Don\'t Save', 67 - callback: () => { res(); } 68 } 69 - ] 70 - ) 71 - }); 72 - } 73 - }); 74 - })(); 75 } 76 77 78 private _tabUpdateHook: ( tabs: TabHashMap ) => void = () => {}; 79 private _tabChangeHook: () => void = () => {}; 80 81 public async AddTab( name: string, id: string | null = null ): Promise<Tab>{ 82 let [ selected, setSelected ] = createSignal(false); ··· 94 needsSave, 95 setNeedsSave, 96 97 - refuseSync: false 98 }; 99 100 this._tabs[tab.id] = tab; ··· 189 } 190 } 191 192 - public async SaveTab( tab: Tab ){ 193 let path = 194 - tab.saveLocation || 195 await save({ defaultPath: tab.name + '.macro', filters: [ { name: 'Macro Files', extensions: [ 'macro' ] } ] }); 196 197 if(!path)throw new Error("Cannot save"); ··· 246 let tab = this._tabs[this._selectedTab]; 247 if(!tab)return; 248 249 - if(tab.refuseSync)return; 250 - invoke('sync_tab', { graph: this._generateTabGraph(tab.id)[0], id: tab.id, name: tab.name, location: tab.saveLocation }); 251 252 if(needsSave)tab.setNeedsSave(true); 253 } ··· 262 )return; 263 264 let tab = await this.AddTab(json.tab_name, id); 265 - tab.refuseSync = true; 266 tab.saveLocation = path; 267 268 this._nodes = []; ··· 293 let input = output.connections[k]; 294 let node = this._nodes.find(x => x.id === input.node)!; 295 296 let realInput = node.inputs.find(x => x.index === input.index); 297 let realOutput = outputParentNode.outputs[j]; 298 ··· 318 tab.setNeedsSave(false); 319 tab.nodes = this._nodes; 320 321 - tab.refuseSync = false; 322 - this.UpdateConfig(false); 323 } 324 325 private _generateTabGraph( tabId: string | null ): [ any, Tab | null ]{ ··· 335 let node = tab.nodes[i]; 336 337 let nodeOutputs = []; 338 339 for (let j = 0; j < node.outputs.length; j++) { 340 let output = node.outputs[j]; ··· 351 }) 352 } 353 354 nodesToSave.push({ 355 name: node.name, 356 id: node.id, 357 typeId: node.typeId, 358 pos: [ node.x, node.y ], 359 outputs: nodeOutputs, 360 statics: node.statics 361 }) 362 } ··· 371 invoke('save_graph', { graph: JSON.stringify({ 372 tab_name: tab.name, 373 version: await getVersion(), 374 graph: nodesToSave 375 }), path }); 376 }
··· 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; ··· 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 }); ··· 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); ··· 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"); ··· 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 } ··· 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 + };
+3 -2
src/Nodes/Statics/Float.tsx
··· 2 import { NodeDefinition } from "../Nodes"; 3 4 export let NodeStaticsFloat: NodeDefinition = { 5 isSingle: true, 6 name: 'Float', 7 typeId: 'staticfloat', 8 9 w: 200, 10 - h: 85, 11 12 statics: [{ 13 type: NodeType.Float, 14 name: 'Value', 15 - value: null 16 }], 17 18 outputs: [{ name: "Float", type: NodeType.Float }],
··· 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 }],
+3 -2
src/Nodes/Statics/Int.tsx
··· 2 import { NodeDefinition } from "../Nodes"; 3 4 export let NodeStaticsInt: NodeDefinition = { 5 isSingle: true, 6 name: 'Int', 7 typeId: 'staticint', 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 }],
+2
src/Nodes/Statics.tsx
··· 5 import { NodeStaticsString } from "./Statics/String"; 6 7 export let NodeStatics: NodeDefinition = { 8 isSingle: false, 9 name: 'Statics', 10 items: [
··· 5 import { NodeStaticsString } from "./Statics/String"; 6 7 export let NodeStatics: NodeDefinition = { 8 + os: 'any', 9 + 10 isSingle: false, 11 name: 'Statics', 12 items: [
+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 =>
+8 -12
src/components/ControlBar.tsx
··· 1 import './ControlBar.css'; 2 3 - import { Accessor, createEffect, createSignal, For, Match, Show, Switch } from 'solid-js'; 4 import { Node, NodeType } from '../structs/node'; 5 import { TextInput } from './TextInput'; 6 import { invoke } from '@tauri-apps/api/core'; ··· 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 - createEffect(() => { 18 - console.log(props.node()); 19 - }) 20 - 21 return ( 22 <div class="control-bar"> 23 - <For each={props.node()?.statics}> 24 { ( item ) => { 25 let [ popupOpen, setPopupOpen ] = createSignal(false); 26 ··· 36 value={item.value || ''} 37 onChange={( el ) => { 38 let value = el.target.value; 39 - let node = props.node()!; 40 41 item.value = value; 42 node.onStaticsUpdate(node); ··· 54 value={item.value !== undefined ? item.value : ''} 55 onChange={( el ) => { 56 let value = el.target.value; 57 - let node = props.node()!; 58 59 item.value = parseInt(value); 60 node.onStaticsUpdate(node); ··· 72 value={item.value !== undefined ? item.value : ''} 73 onChange={( el ) => { 74 let value = el.target.value; 75 - let node = props.node()!; 76 77 item.value = parseFloat(value); 78 node.onStaticsUpdate(node); ··· 92 return addresses.map(x => x.address).filter(x => x.toLowerCase().includes(text.toLowerCase())); 93 }} 94 change={( text ) => { 95 - let node = props.node()!; 96 97 item.value = text; 98 node.onStaticsUpdate(node); ··· 118 }} 119 value={item.value} 120 changed={( value ) => { 121 - let node = props.node()!; 122 123 item.value = value; 124 node.onStaticsUpdate(node);
··· 1 import './ControlBar.css'; 2 3 + import { Accessor, createSignal, For, Match, Show, Switch } from 'solid-js'; 4 import { Node, NodeType } from '../structs/node'; 5 import { TextInput } from './TextInput'; 6 import { invoke } from '@tauri-apps/api/core'; ··· 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 ··· 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); ··· 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); ··· 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); ··· 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 + }
+29
src/components/TabMenu.css
··· 12 overflow-y: auto; 13 } 14 15 .tab{ 16 border-radius: 10px; 17 padding: 8px 10px; ··· 95 transform: translate(-10px, 35px); 96 border-radius: 10px; 97 background: #fff1; 98 }
··· 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; ··· 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 }
+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 + }
+1220 -703
src-tauri/Cargo.lock
··· 7 version = "0.1.0" 8 dependencies = [ 9 "anyhow", 10 "crossbeam-channel", 11 "dirs", 12 "flate2", 13 "serde", 14 "serde_json", 15 "tauri", 16 "tauri-build", 17 "tauri-plugin-dialog", 18 "tauri-plugin-opener", 19 "tokio", 20 ] 21 22 [[package]] 23 - name = "addr2line" 24 - version = "0.24.2" 25 - source = "registry+https://github.com/rust-lang/crates.io-index" 26 - checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 27 - dependencies = [ 28 - "gimli", 29 - ] 30 - 31 - [[package]] 32 name = "adler2" 33 version = "2.0.1" 34 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 36 37 [[package]] 38 name = "aho-corasick" 39 - version = "1.1.3" 40 source = "registry+https://github.com/rust-lang/crates.io-index" 41 - checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 42 dependencies = [ 43 "memchr", 44 ] ··· 59 ] 60 61 [[package]] 62 - name = "android-tzdata" 63 - version = "0.1.1" 64 - source = "registry+https://github.com/rust-lang/crates.io-index" 65 - checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 66 - 67 - [[package]] 68 name = "android_system_properties" 69 version = "0.1.5" 70 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 75 76 [[package]] 77 name = "anyhow" 78 - version = "1.0.99" 79 source = "registry+https://github.com/rust-lang/crates.io-index" 80 - checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" 81 82 [[package]] 83 name = "ashpd" ··· 126 127 [[package]] 128 name = "async-executor" 129 - version = "1.13.2" 130 source = "registry+https://github.com/rust-lang/crates.io-index" 131 - checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" 132 dependencies = [ 133 "async-task", 134 "concurrent-queue", ··· 140 141 [[package]] 142 name = "async-io" 143 - version = "2.5.0" 144 source = "registry+https://github.com/rust-lang/crates.io-index" 145 - checksum = "19634d6336019ef220f09fd31168ce5c184b295cbf80345437cc36094ef223ca" 146 dependencies = [ 147 - "async-lock", 148 "cfg-if", 149 "concurrent-queue", 150 "futures-io", 151 "futures-lite", 152 "parking", 153 "polling", 154 - "rustix", 155 "slab", 156 - "windows-sys 0.60.2", 157 ] 158 159 [[package]] 160 name = "async-lock" 161 - version = "3.4.0" 162 source = "registry+https://github.com/rust-lang/crates.io-index" 163 - checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" 164 dependencies = [ 165 "event-listener", 166 "event-listener-strategy", ··· 169 170 [[package]] 171 name = "async-process" 172 - version = "2.4.0" 173 source = "registry+https://github.com/rust-lang/crates.io-index" 174 - checksum = "65daa13722ad51e6ab1a1b9c01299142bc75135b337923cfa10e79bbbd669f00" 175 dependencies = [ 176 "async-channel", 177 "async-io", ··· 182 "cfg-if", 183 "event-listener", 184 "futures-lite", 185 - "rustix", 186 ] 187 188 [[package]] ··· 193 dependencies = [ 194 "proc-macro2", 195 "quote", 196 - "syn 2.0.104", 197 ] 198 199 [[package]] 200 name = "async-signal" 201 - version = "0.2.12" 202 source = "registry+https://github.com/rust-lang/crates.io-index" 203 - checksum = "f567af260ef69e1d52c2b560ce0ea230763e6fbb9214a85d768760a920e3e3c1" 204 dependencies = [ 205 "async-io", 206 "async-lock", ··· 208 "cfg-if", 209 "futures-core", 210 "futures-io", 211 - "rustix", 212 "signal-hook-registry", 213 "slab", 214 - "windows-sys 0.60.2", 215 ] 216 217 [[package]] ··· 222 223 [[package]] 224 name = "async-trait" 225 - version = "0.1.88" 226 source = "registry+https://github.com/rust-lang/crates.io-index" 227 - checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" 228 dependencies = [ 229 "proc-macro2", 230 "quote", 231 - "syn 2.0.104", 232 ] 233 234 [[package]] ··· 267 checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 268 269 [[package]] 270 - name = "backtrace" 271 - version = "0.3.75" 272 - source = "registry+https://github.com/rust-lang/crates.io-index" 273 - checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" 274 - dependencies = [ 275 - "addr2line", 276 - "cfg-if", 277 - "libc", 278 - "miniz_oxide", 279 - "object", 280 - "rustc-demangle", 281 - "windows-targets 0.52.6", 282 - ] 283 - 284 - [[package]] 285 name = "base64" 286 version = "0.21.7" 287 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 301 302 [[package]] 303 name = "bitflags" 304 - version = "2.9.1" 305 source = "registry+https://github.com/rust-lang/crates.io-index" 306 - checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" 307 dependencies = [ 308 - "serde", 309 ] 310 311 [[package]] ··· 328 329 [[package]] 330 name = "block2" 331 - version = "0.6.1" 332 source = "registry+https://github.com/rust-lang/crates.io-index" 333 - checksum = "340d2f0bdb2a43c1d3cd40513185b2bd7def0aa1052f956455114bc98f82dcf2" 334 dependencies = [ 335 - "objc2 0.6.1", 336 ] 337 338 [[package]] ··· 350 351 [[package]] 352 name = "brotli" 353 - version = "8.0.1" 354 source = "registry+https://github.com/rust-lang/crates.io-index" 355 - checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" 356 dependencies = [ 357 "alloc-no-stdlib", 358 "alloc-stdlib", ··· 377 378 [[package]] 379 name = "bytemuck" 380 - version = "1.23.1" 381 source = "registry+https://github.com/rust-lang/crates.io-index" 382 - checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" 383 384 [[package]] 385 name = "byteorder" 386 version = "1.5.0" 387 source = "registry+https://github.com/rust-lang/crates.io-index" 388 checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 389 390 [[package]] 391 name = "bytes" ··· 402 source = "registry+https://github.com/rust-lang/crates.io-index" 403 checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" 404 dependencies = [ 405 - "bitflags 2.9.1", 406 "cairo-sys-rs", 407 "glib", 408 "libc", ··· 423 424 [[package]] 425 name = "camino" 426 - version = "1.1.10" 427 source = "registry+https://github.com/rust-lang/crates.io-index" 428 - checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" 429 dependencies = [ 430 - "serde", 431 ] 432 433 [[package]] ··· 450 "semver", 451 "serde", 452 "serde_json", 453 - "thiserror 2.0.12", 454 ] 455 456 [[package]] ··· 460 checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" 461 dependencies = [ 462 "serde", 463 - "toml 0.9.3", 464 ] 465 466 [[package]] 467 name = "cc" 468 - version = "1.2.30" 469 source = "registry+https://github.com/rust-lang/crates.io-index" 470 - checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" 471 dependencies = [ 472 "shlex", 473 ] 474 ··· 501 502 [[package]] 503 name = "cfg-if" 504 - version = "1.0.1" 505 source = "registry+https://github.com/rust-lang/crates.io-index" 506 - checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" 507 508 [[package]] 509 name = "cfg_aliases" ··· 513 514 [[package]] 515 name = "chrono" 516 - version = "0.4.41" 517 source = "registry+https://github.com/rust-lang/crates.io-index" 518 - checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" 519 dependencies = [ 520 - "android-tzdata", 521 "iana-time-zone", 522 "num-traits", 523 "serde", 524 - "windows-link", 525 ] 526 527 [[package]] ··· 581 source = "registry+https://github.com/rust-lang/crates.io-index" 582 checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" 583 dependencies = [ 584 - "bitflags 2.9.1", 585 "core-foundation", 586 "core-graphics-types", 587 "foreign-types", ··· 594 source = "registry+https://github.com/rust-lang/crates.io-index" 595 checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" 596 dependencies = [ 597 - "bitflags 2.9.1", 598 "core-foundation", 599 "libc", 600 ] ··· 633 checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 634 635 [[package]] 636 name = "crypto-common" 637 version = "0.1.6" 638 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 666 checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" 667 dependencies = [ 668 "quote", 669 - "syn 2.0.104", 670 ] 671 672 [[package]] ··· 676 checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" 677 dependencies = [ 678 "quote", 679 - "syn 2.0.104", 680 ] 681 682 [[package]] 683 name = "darling" 684 - version = "0.20.11" 685 source = "registry+https://github.com/rust-lang/crates.io-index" 686 - checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" 687 dependencies = [ 688 "darling_core", 689 "darling_macro", ··· 691 692 [[package]] 693 name = "darling_core" 694 - version = "0.20.11" 695 source = "registry+https://github.com/rust-lang/crates.io-index" 696 - checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" 697 dependencies = [ 698 "fnv", 699 "ident_case", 700 "proc-macro2", 701 "quote", 702 "strsim", 703 - "syn 2.0.104", 704 ] 705 706 [[package]] 707 name = "darling_macro" 708 - version = "0.20.11" 709 source = "registry+https://github.com/rust-lang/crates.io-index" 710 - checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" 711 dependencies = [ 712 "darling_core", 713 "quote", 714 - "syn 2.0.104", 715 ] 716 717 [[package]] 718 name = "deranged" 719 - version = "0.4.0" 720 source = "registry+https://github.com/rust-lang/crates.io-index" 721 - checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" 722 dependencies = [ 723 "powerfmt", 724 - "serde", 725 ] 726 727 [[package]] ··· 734 "proc-macro2", 735 "quote", 736 "rustc_version", 737 - "syn 2.0.104", 738 ] 739 740 [[package]] ··· 765 "libc", 766 "option-ext", 767 "redox_users", 768 - "windows-sys 0.60.2", 769 ] 770 771 [[package]] ··· 780 source = "registry+https://github.com/rust-lang/crates.io-index" 781 checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" 782 dependencies = [ 783 - "bitflags 2.9.1", 784 - "block2 0.6.1", 785 "libc", 786 - "objc2 0.6.1", 787 ] 788 789 [[package]] ··· 794 dependencies = [ 795 "proc-macro2", 796 "quote", 797 - "syn 2.0.104", 798 ] 799 800 [[package]] ··· 803 source = "registry+https://github.com/rust-lang/crates.io-index" 804 checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" 805 dependencies = [ 806 - "libloading", 807 ] 808 809 [[package]] 810 name = "dlopen2" 811 - version = "0.7.0" 812 source = "registry+https://github.com/rust-lang/crates.io-index" 813 - checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6" 814 dependencies = [ 815 "dlopen2_derive", 816 "libc", ··· 826 dependencies = [ 827 "proc-macro2", 828 "quote", 829 - "syn 2.0.104", 830 ] 831 832 [[package]] ··· 873 874 [[package]] 875 name = "embed-resource" 876 - version = "3.0.5" 877 source = "registry+https://github.com/rust-lang/crates.io-index" 878 - checksum = "4c6d81016d6c977deefb2ef8d8290da019e27cc26167e102185da528e6c0ab38" 879 dependencies = [ 880 "cc", 881 "memchr", 882 "rustc_version", 883 - "toml 0.9.3", 884 "vswhom", 885 "winreg", 886 ] ··· 898 checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" 899 900 [[package]] 901 name = "enumflags2" 902 version = "0.7.12" 903 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 915 dependencies = [ 916 "proc-macro2", 917 "quote", 918 - "syn 2.0.104", 919 ] 920 921 [[package]] ··· 926 927 [[package]] 928 name = "erased-serde" 929 - version = "0.4.6" 930 source = "registry+https://github.com/rust-lang/crates.io-index" 931 - checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" 932 dependencies = [ 933 "serde", 934 "typeid", 935 ] 936 937 [[package]] 938 name = "errno" 939 - version = "0.3.13" 940 source = "registry+https://github.com/rust-lang/crates.io-index" 941 - checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" 942 dependencies = [ 943 "libc", 944 - "windows-sys 0.60.2", 945 ] 946 947 [[package]] 948 name = "event-listener" 949 - version = "5.4.0" 950 source = "registry+https://github.com/rust-lang/crates.io-index" 951 - checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 952 dependencies = [ 953 "concurrent-queue", 954 "parking", ··· 972 checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 973 974 [[package]] 975 name = "fdeflate" 976 version = "0.3.7" 977 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 991 ] 992 993 [[package]] 994 name = "flate2" 995 - version = "1.1.2" 996 source = "registry+https://github.com/rust-lang/crates.io-index" 997 - checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" 998 dependencies = [ 999 "crc32fast", 1000 "miniz_oxide", ··· 1007 checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 1008 1009 [[package]] 1010 name = "foreign-types" 1011 version = "0.5.0" 1012 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1024 dependencies = [ 1025 "proc-macro2", 1026 "quote", 1027 - "syn 2.0.104", 1028 ] 1029 1030 [[package]] ··· 1035 1036 [[package]] 1037 name = "form_urlencoded" 1038 - version = "1.2.1" 1039 source = "registry+https://github.com/rust-lang/crates.io-index" 1040 - checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 1041 dependencies = [ 1042 "percent-encoding", 1043 ] ··· 1086 1087 [[package]] 1088 name = "futures-lite" 1089 - version = "2.6.0" 1090 source = "registry+https://github.com/rust-lang/crates.io-index" 1091 - checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" 1092 dependencies = [ 1093 "fastrand", 1094 "futures-core", ··· 1105 dependencies = [ 1106 "proc-macro2", 1107 "quote", 1108 - "syn 2.0.104", 1109 ] 1110 1111 [[package]] ··· 1247 1248 [[package]] 1249 name = "generic-array" 1250 - version = "0.14.7" 1251 source = "registry+https://github.com/rust-lang/crates.io-index" 1252 - checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 1253 dependencies = [ 1254 "typenum", 1255 "version_check", 1256 ] 1257 1258 [[package]] ··· 1279 1280 [[package]] 1281 name = "getrandom" 1282 - version = "0.3.3" 1283 source = "registry+https://github.com/rust-lang/crates.io-index" 1284 - checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 1285 dependencies = [ 1286 "cfg-if", 1287 "libc", 1288 "r-efi", 1289 - "wasi 0.14.2+wasi-0.2.4", 1290 ] 1291 1292 [[package]] 1293 - name = "gimli" 1294 - version = "0.31.1" 1295 - source = "registry+https://github.com/rust-lang/crates.io-index" 1296 - checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 1297 - 1298 - [[package]] 1299 name = "gio" 1300 version = "0.18.4" 1301 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1333 source = "registry+https://github.com/rust-lang/crates.io-index" 1334 checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" 1335 dependencies = [ 1336 - "bitflags 2.9.1", 1337 "futures-channel", 1338 "futures-core", 1339 "futures-executor", ··· 1357 checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" 1358 dependencies = [ 1359 "heck 0.4.1", 1360 - "proc-macro-crate 2.0.0", 1361 "proc-macro-error", 1362 "proc-macro2", 1363 "quote", 1364 - "syn 2.0.104", 1365 ] 1366 1367 [[package]] ··· 1376 1377 [[package]] 1378 name = "glob" 1379 - version = "0.3.2" 1380 source = "registry+https://github.com/rust-lang/crates.io-index" 1381 - checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 1382 1383 [[package]] 1384 name = "gobject-sys" ··· 1440 "proc-macro-error", 1441 "proc-macro2", 1442 "quote", 1443 - "syn 2.0.104", 1444 ] 1445 1446 [[package]] ··· 1451 1452 [[package]] 1453 name = "hashbrown" 1454 - version = "0.15.4" 1455 source = "registry+https://github.com/rust-lang/crates.io-index" 1456 - checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" 1457 1458 [[package]] 1459 name = "heck" ··· 1533 1534 [[package]] 1535 name = "hyper" 1536 - version = "1.6.0" 1537 source = "registry+https://github.com/rust-lang/crates.io-index" 1538 - checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 1539 dependencies = [ 1540 "bytes", 1541 "futures-channel", 1542 - "futures-util", 1543 "http", 1544 "http-body", 1545 "httparse", 1546 "itoa", 1547 "pin-project-lite", 1548 "smallvec", 1549 "tokio", 1550 "want", ··· 1552 1553 [[package]] 1554 name = "hyper-util" 1555 - version = "0.1.16" 1556 source = "registry+https://github.com/rust-lang/crates.io-index" 1557 - checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" 1558 dependencies = [ 1559 "base64 0.22.1", 1560 "bytes", ··· 1576 1577 [[package]] 1578 name = "iana-time-zone" 1579 - version = "0.1.63" 1580 source = "registry+https://github.com/rust-lang/crates.io-index" 1581 - checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" 1582 dependencies = [ 1583 "android_system_properties", 1584 "core-foundation-sys", ··· 1586 "js-sys", 1587 "log", 1588 "wasm-bindgen", 1589 - "windows-core", 1590 ] 1591 1592 [[package]] ··· 1605 checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" 1606 dependencies = [ 1607 "byteorder", 1608 - "png", 1609 ] 1610 1611 [[package]] 1612 name = "icu_collections" 1613 - version = "2.0.0" 1614 source = "registry+https://github.com/rust-lang/crates.io-index" 1615 - checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 1616 dependencies = [ 1617 "displaydoc", 1618 "potential_utf", ··· 1623 1624 [[package]] 1625 name = "icu_locale_core" 1626 - version = "2.0.0" 1627 source = "registry+https://github.com/rust-lang/crates.io-index" 1628 - checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 1629 dependencies = [ 1630 "displaydoc", 1631 "litemap", ··· 1636 1637 [[package]] 1638 name = "icu_normalizer" 1639 - version = "2.0.0" 1640 source = "registry+https://github.com/rust-lang/crates.io-index" 1641 - checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 1642 dependencies = [ 1643 - "displaydoc", 1644 "icu_collections", 1645 "icu_normalizer_data", 1646 "icu_properties", ··· 1651 1652 [[package]] 1653 name = "icu_normalizer_data" 1654 - version = "2.0.0" 1655 source = "registry+https://github.com/rust-lang/crates.io-index" 1656 - checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 1657 1658 [[package]] 1659 name = "icu_properties" 1660 - version = "2.0.1" 1661 source = "registry+https://github.com/rust-lang/crates.io-index" 1662 - checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 1663 dependencies = [ 1664 - "displaydoc", 1665 "icu_collections", 1666 "icu_locale_core", 1667 "icu_properties_data", 1668 "icu_provider", 1669 - "potential_utf", 1670 "zerotrie", 1671 "zerovec", 1672 ] 1673 1674 [[package]] 1675 name = "icu_properties_data" 1676 - version = "2.0.1" 1677 source = "registry+https://github.com/rust-lang/crates.io-index" 1678 - checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 1679 1680 [[package]] 1681 name = "icu_provider" 1682 - version = "2.0.0" 1683 source = "registry+https://github.com/rust-lang/crates.io-index" 1684 - checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 1685 dependencies = [ 1686 "displaydoc", 1687 "icu_locale_core", 1688 - "stable_deref_trait", 1689 - "tinystr", 1690 "writeable", 1691 "yoke", 1692 "zerofrom", ··· 1702 1703 [[package]] 1704 name = "idna" 1705 - version = "1.0.3" 1706 source = "registry+https://github.com/rust-lang/crates.io-index" 1707 - checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 1708 dependencies = [ 1709 "idna_adapter", 1710 "smallvec", ··· 1722 ] 1723 1724 [[package]] 1725 name = "indexmap" 1726 version = "1.9.3" 1727 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1734 1735 [[package]] 1736 name = "indexmap" 1737 - version = "2.10.0" 1738 source = "registry+https://github.com/rust-lang/crates.io-index" 1739 - checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" 1740 dependencies = [ 1741 "equivalent", 1742 - "hashbrown 0.15.4", 1743 "serde", 1744 ] 1745 1746 [[package]] ··· 1753 ] 1754 1755 [[package]] 1756 - name = "io-uring" 1757 - version = "0.7.9" 1758 - source = "registry+https://github.com/rust-lang/crates.io-index" 1759 - checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" 1760 - dependencies = [ 1761 - "bitflags 2.9.1", 1762 - "cfg-if", 1763 - "libc", 1764 - ] 1765 - 1766 - [[package]] 1767 name = "ipnet" 1768 version = "2.11.0" 1769 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1771 1772 [[package]] 1773 name = "iri-string" 1774 - version = "0.7.8" 1775 source = "registry+https://github.com/rust-lang/crates.io-index" 1776 - checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" 1777 dependencies = [ 1778 "memchr", 1779 "serde", ··· 1851 1852 [[package]] 1853 name = "js-sys" 1854 - version = "0.3.77" 1855 source = "registry+https://github.com/rust-lang/crates.io-index" 1856 - checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 1857 dependencies = [ 1858 "once_cell", 1859 "wasm-bindgen", ··· 1887 source = "registry+https://github.com/rust-lang/crates.io-index" 1888 checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" 1889 dependencies = [ 1890 - "bitflags 2.9.1", 1891 "serde", 1892 "unicode-segmentation", 1893 ] ··· 1900 dependencies = [ 1901 "cssparser", 1902 "html5ever", 1903 - "indexmap 2.10.0", 1904 "selectors", 1905 ] 1906 ··· 1930 checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" 1931 dependencies = [ 1932 "gtk-sys", 1933 - "libloading", 1934 "once_cell", 1935 ] 1936 1937 [[package]] 1938 name = "libc" 1939 - version = "0.2.174" 1940 source = "registry+https://github.com/rust-lang/crates.io-index" 1941 - checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" 1942 1943 [[package]] 1944 name = "libloading" ··· 1951 ] 1952 1953 [[package]] 1954 name = "libredox" 1955 - version = "0.1.8" 1956 source = "registry+https://github.com/rust-lang/crates.io-index" 1957 - checksum = "360e552c93fa0e8152ab463bc4c4837fce76a225df11dfaeea66c313de5e61f7" 1958 dependencies = [ 1959 - "bitflags 2.9.1", 1960 "libc", 1961 ] 1962 1963 [[package]] 1964 name = "linux-raw-sys" 1965 - version = "0.9.4" 1966 source = "registry+https://github.com/rust-lang/crates.io-index" 1967 - checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 1968 1969 [[package]] 1970 name = "litemap" 1971 - version = "0.8.0" 1972 source = "registry+https://github.com/rust-lang/crates.io-index" 1973 - checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 1974 1975 [[package]] 1976 name = "lock_api" 1977 - version = "0.4.13" 1978 source = "registry+https://github.com/rust-lang/crates.io-index" 1979 - checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" 1980 dependencies = [ 1981 - "autocfg", 1982 "scopeguard", 1983 ] 1984 1985 [[package]] 1986 name = "log" 1987 - version = "0.4.27" 1988 source = "registry+https://github.com/rust-lang/crates.io-index" 1989 - checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 1990 1991 [[package]] 1992 name = "mac" ··· 2016 dependencies = [ 2017 "proc-macro2", 2018 "quote", 2019 - "syn 2.0.104", 2020 ] 2021 2022 [[package]] ··· 2027 2028 [[package]] 2029 name = "memchr" 2030 - version = "2.7.5" 2031 source = "registry+https://github.com/rust-lang/crates.io-index" 2032 - checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" 2033 2034 [[package]] 2035 name = "memoffset" ··· 2047 checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 2048 2049 [[package]] 2050 name = "miniz_oxide" 2051 version = "0.8.9" 2052 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2058 2059 [[package]] 2060 name = "mio" 2061 - version = "1.0.4" 2062 source = "registry+https://github.com/rust-lang/crates.io-index" 2063 - checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 2064 dependencies = [ 2065 "libc", 2066 "wasi 0.11.1+wasi-snapshot-preview1", 2067 - "windows-sys 0.59.0", 2068 ] 2069 2070 [[package]] 2071 name = "muda" 2072 - version = "0.17.0" 2073 source = "registry+https://github.com/rust-lang/crates.io-index" 2074 - checksum = "58b89bf91c19bf036347f1ab85a81c560f08c0667c8601bece664d860a600988" 2075 dependencies = [ 2076 "crossbeam-channel", 2077 "dpi", 2078 "gtk", 2079 "keyboard-types", 2080 - "objc2 0.6.1", 2081 "objc2-app-kit", 2082 "objc2-core-foundation", 2083 - "objc2-foundation 0.3.1", 2084 "once_cell", 2085 - "png", 2086 "serde", 2087 - "thiserror 2.0.12", 2088 - "windows-sys 0.59.0", 2089 ] 2090 2091 [[package]] ··· 2094 source = "registry+https://github.com/rust-lang/crates.io-index" 2095 checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" 2096 dependencies = [ 2097 - "bitflags 2.9.1", 2098 "jni-sys", 2099 "log", 2100 "ndk-sys", ··· 2130 source = "registry+https://github.com/rust-lang/crates.io-index" 2131 checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" 2132 dependencies = [ 2133 - "bitflags 2.9.1", 2134 "cfg-if", 2135 "cfg_aliases", 2136 "libc", ··· 2144 checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" 2145 2146 [[package]] 2147 name = "num-conv" 2148 version = "0.1.0" 2149 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2160 2161 [[package]] 2162 name = "num_enum" 2163 - version = "0.7.4" 2164 source = "registry+https://github.com/rust-lang/crates.io-index" 2165 - checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" 2166 dependencies = [ 2167 "num_enum_derive", 2168 "rustversion", ··· 2170 2171 [[package]] 2172 name = "num_enum_derive" 2173 - version = "0.7.4" 2174 source = "registry+https://github.com/rust-lang/crates.io-index" 2175 - checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" 2176 dependencies = [ 2177 - "proc-macro-crate 3.3.0", 2178 "proc-macro2", 2179 "quote", 2180 - "syn 2.0.104", 2181 ] 2182 2183 [[package]] ··· 2198 2199 [[package]] 2200 name = "objc2" 2201 - version = "0.6.1" 2202 source = "registry+https://github.com/rust-lang/crates.io-index" 2203 - checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" 2204 dependencies = [ 2205 "objc2-encode", 2206 "objc2-exception-helper", ··· 2208 2209 [[package]] 2210 name = "objc2-app-kit" 2211 - version = "0.3.1" 2212 source = "registry+https://github.com/rust-lang/crates.io-index" 2213 - checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" 2214 dependencies = [ 2215 - "bitflags 2.9.1", 2216 - "block2 0.6.1", 2217 "libc", 2218 - "objc2 0.6.1", 2219 "objc2-cloud-kit", 2220 "objc2-core-data", 2221 "objc2-core-foundation", 2222 "objc2-core-graphics", 2223 "objc2-core-image", 2224 - "objc2-foundation 0.3.1", 2225 - "objc2-quartz-core 0.3.1", 2226 ] 2227 2228 [[package]] 2229 name = "objc2-cloud-kit" 2230 - version = "0.3.1" 2231 source = "registry+https://github.com/rust-lang/crates.io-index" 2232 - checksum = "17614fdcd9b411e6ff1117dfb1d0150f908ba83a7df81b1f118005fe0a8ea15d" 2233 dependencies = [ 2234 - "bitflags 2.9.1", 2235 - "objc2 0.6.1", 2236 - "objc2-foundation 0.3.1", 2237 ] 2238 2239 [[package]] 2240 name = "objc2-core-data" 2241 - version = "0.3.1" 2242 source = "registry+https://github.com/rust-lang/crates.io-index" 2243 - checksum = "291fbbf7d29287518e8686417cf7239c74700fd4b607623140a7d4a3c834329d" 2244 dependencies = [ 2245 - "bitflags 2.9.1", 2246 - "objc2 0.6.1", 2247 - "objc2-foundation 0.3.1", 2248 ] 2249 2250 [[package]] 2251 name = "objc2-core-foundation" 2252 - version = "0.3.1" 2253 source = "registry+https://github.com/rust-lang/crates.io-index" 2254 - checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" 2255 dependencies = [ 2256 - "bitflags 2.9.1", 2257 "dispatch2", 2258 - "objc2 0.6.1", 2259 ] 2260 2261 [[package]] 2262 name = "objc2-core-graphics" 2263 - version = "0.3.1" 2264 source = "registry+https://github.com/rust-lang/crates.io-index" 2265 - checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" 2266 dependencies = [ 2267 - "bitflags 2.9.1", 2268 "dispatch2", 2269 - "objc2 0.6.1", 2270 "objc2-core-foundation", 2271 "objc2-io-surface", 2272 ] 2273 2274 [[package]] 2275 name = "objc2-core-image" 2276 - version = "0.3.1" 2277 source = "registry+https://github.com/rust-lang/crates.io-index" 2278 - checksum = "79b3dc0cc4386b6ccf21c157591b34a7f44c8e75b064f85502901ab2188c007e" 2279 dependencies = [ 2280 - "objc2 0.6.1", 2281 - "objc2-foundation 0.3.1", 2282 ] 2283 2284 [[package]] ··· 2302 source = "registry+https://github.com/rust-lang/crates.io-index" 2303 checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" 2304 dependencies = [ 2305 - "bitflags 2.9.1", 2306 "block2 0.5.1", 2307 "libc", 2308 "objc2 0.5.2", ··· 2310 2311 [[package]] 2312 name = "objc2-foundation" 2313 - version = "0.3.1" 2314 source = "registry+https://github.com/rust-lang/crates.io-index" 2315 - checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" 2316 dependencies = [ 2317 - "bitflags 2.9.1", 2318 - "block2 0.6.1", 2319 "libc", 2320 - "objc2 0.6.1", 2321 "objc2-core-foundation", 2322 ] 2323 2324 [[package]] 2325 name = "objc2-io-surface" 2326 - version = "0.3.1" 2327 source = "registry+https://github.com/rust-lang/crates.io-index" 2328 - checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" 2329 dependencies = [ 2330 - "bitflags 2.9.1", 2331 - "objc2 0.6.1", 2332 "objc2-core-foundation", 2333 ] 2334 ··· 2338 source = "registry+https://github.com/rust-lang/crates.io-index" 2339 checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" 2340 dependencies = [ 2341 - "bitflags 2.9.1", 2342 "block2 0.5.1", 2343 "objc2 0.5.2", 2344 "objc2-foundation 0.2.2", ··· 2350 source = "registry+https://github.com/rust-lang/crates.io-index" 2351 checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" 2352 dependencies = [ 2353 - "bitflags 2.9.1", 2354 "block2 0.5.1", 2355 "objc2 0.5.2", 2356 "objc2-foundation 0.2.2", ··· 2359 2360 [[package]] 2361 name = "objc2-quartz-core" 2362 - version = "0.3.1" 2363 source = "registry+https://github.com/rust-lang/crates.io-index" 2364 - checksum = "90ffb6a0cd5f182dc964334388560b12a57f7b74b3e2dec5e2722aa2dfb2ccd5" 2365 dependencies = [ 2366 - "bitflags 2.9.1", 2367 - "objc2 0.6.1", 2368 - "objc2-foundation 0.3.1", 2369 ] 2370 2371 [[package]] 2372 - name = "objc2-ui-kit" 2373 - version = "0.3.1" 2374 source = "registry+https://github.com/rust-lang/crates.io-index" 2375 - checksum = "25b1312ad7bc8a0e92adae17aa10f90aae1fb618832f9b993b022b591027daed" 2376 dependencies = [ 2377 - "bitflags 2.9.1", 2378 - "objc2 0.6.1", 2379 "objc2-core-foundation", 2380 - "objc2-foundation 0.3.1", 2381 ] 2382 2383 [[package]] 2384 - name = "objc2-web-kit" 2385 - version = "0.3.1" 2386 source = "registry+https://github.com/rust-lang/crates.io-index" 2387 - checksum = "91672909de8b1ce1c2252e95bbee8c1649c9ad9d14b9248b3d7b4c47903c47ad" 2388 dependencies = [ 2389 - "bitflags 2.9.1", 2390 - "block2 0.6.1", 2391 - "objc2 0.6.1", 2392 - "objc2-app-kit", 2393 "objc2-core-foundation", 2394 - "objc2-foundation 0.3.1", 2395 ] 2396 2397 [[package]] 2398 - name = "object" 2399 - version = "0.36.7" 2400 source = "registry+https://github.com/rust-lang/crates.io-index" 2401 - checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 2402 dependencies = [ 2403 - "memchr", 2404 ] 2405 2406 [[package]] ··· 2438 ] 2439 2440 [[package]] 2441 name = "pango" 2442 version = "0.18.3" 2443 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2470 2471 [[package]] 2472 name = "parking_lot" 2473 - version = "0.12.4" 2474 source = "registry+https://github.com/rust-lang/crates.io-index" 2475 - checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" 2476 dependencies = [ 2477 "lock_api", 2478 "parking_lot_core", ··· 2480 2481 [[package]] 2482 name = "parking_lot_core" 2483 - version = "0.9.11" 2484 source = "registry+https://github.com/rust-lang/crates.io-index" 2485 - checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" 2486 dependencies = [ 2487 "cfg-if", 2488 "libc", 2489 "redox_syscall", 2490 "smallvec", 2491 - "windows-targets 0.52.6", 2492 ] 2493 2494 [[package]] ··· 2499 2500 [[package]] 2501 name = "percent-encoding" 2502 - version = "2.3.1" 2503 source = "registry+https://github.com/rust-lang/crates.io-index" 2504 - checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 2505 2506 [[package]] 2507 name = "phf" ··· 2607 "phf_shared 0.11.3", 2608 "proc-macro2", 2609 "quote", 2610 - "syn 2.0.104", 2611 ] 2612 2613 [[package]] ··· 2668 2669 [[package]] 2670 name = "plist" 2671 - version = "1.7.4" 2672 source = "registry+https://github.com/rust-lang/crates.io-index" 2673 - checksum = "3af6b589e163c5a788fab00ce0c0366f6efbb9959c2f9874b224936af7fce7e1" 2674 dependencies = [ 2675 "base64 0.22.1", 2676 - "indexmap 2.10.0", 2677 - "quick-xml 0.38.0", 2678 "serde", 2679 "time", 2680 ] ··· 2693 ] 2694 2695 [[package]] 2696 name = "polling" 2697 - version = "3.9.0" 2698 source = "registry+https://github.com/rust-lang/crates.io-index" 2699 - checksum = "8ee9b2fa7a4517d2c91ff5bc6c297a427a96749d15f98fcdbb22c05571a4d4b7" 2700 dependencies = [ 2701 "cfg-if", 2702 "concurrent-queue", 2703 "hermit-abi", 2704 "pin-project-lite", 2705 - "rustix", 2706 - "windows-sys 0.60.2", 2707 ] 2708 2709 [[package]] 2710 name = "potential_utf" 2711 - version = "0.1.2" 2712 source = "registry+https://github.com/rust-lang/crates.io-index" 2713 - checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" 2714 dependencies = [ 2715 "zerovec", 2716 ] ··· 2748 2749 [[package]] 2750 name = "proc-macro-crate" 2751 - version = "2.0.0" 2752 source = "registry+https://github.com/rust-lang/crates.io-index" 2753 - checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" 2754 dependencies = [ 2755 - "toml_edit 0.20.7", 2756 ] 2757 2758 [[package]] 2759 name = "proc-macro-crate" 2760 - version = "3.3.0" 2761 source = "registry+https://github.com/rust-lang/crates.io-index" 2762 - checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" 2763 dependencies = [ 2764 - "toml_edit 0.22.27", 2765 ] 2766 2767 [[package]] ··· 2796 2797 [[package]] 2798 name = "proc-macro2" 2799 - version = "1.0.95" 2800 source = "registry+https://github.com/rust-lang/crates.io-index" 2801 - checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 2802 dependencies = [ 2803 "unicode-ident", 2804 ] 2805 2806 [[package]] 2807 name = "quick-xml" 2808 version = "0.37.5" 2809 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2814 2815 [[package]] 2816 name = "quick-xml" 2817 - version = "0.38.0" 2818 source = "registry+https://github.com/rust-lang/crates.io-index" 2819 - checksum = "8927b0664f5c5a98265138b7e3f90aa19a6b21353182469ace36d4ac527b7b1b" 2820 dependencies = [ 2821 "memchr", 2822 ] 2823 2824 [[package]] 2825 name = "quote" 2826 - version = "1.0.40" 2827 source = "registry+https://github.com/rust-lang/crates.io-index" 2828 - checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 2829 dependencies = [ 2830 "proc-macro2", 2831 ] ··· 2925 source = "registry+https://github.com/rust-lang/crates.io-index" 2926 checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 2927 dependencies = [ 2928 - "getrandom 0.3.3", 2929 ] 2930 2931 [[package]] ··· 2954 2955 [[package]] 2956 name = "redox_syscall" 2957 - version = "0.5.17" 2958 source = "registry+https://github.com/rust-lang/crates.io-index" 2959 - checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" 2960 dependencies = [ 2961 - "bitflags 2.9.1", 2962 ] 2963 2964 [[package]] 2965 name = "redox_users" 2966 - version = "0.5.0" 2967 source = "registry+https://github.com/rust-lang/crates.io-index" 2968 - checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" 2969 dependencies = [ 2970 "getrandom 0.2.16", 2971 "libredox", 2972 - "thiserror 2.0.12", 2973 ] 2974 2975 [[package]] 2976 name = "ref-cast" 2977 - version = "1.0.24" 2978 source = "registry+https://github.com/rust-lang/crates.io-index" 2979 - checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" 2980 dependencies = [ 2981 "ref-cast-impl", 2982 ] 2983 2984 [[package]] 2985 name = "ref-cast-impl" 2986 - version = "1.0.24" 2987 source = "registry+https://github.com/rust-lang/crates.io-index" 2988 - checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" 2989 dependencies = [ 2990 "proc-macro2", 2991 "quote", 2992 - "syn 2.0.104", 2993 ] 2994 2995 [[package]] 2996 name = "regex" 2997 - version = "1.11.1" 2998 source = "registry+https://github.com/rust-lang/crates.io-index" 2999 - checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 3000 dependencies = [ 3001 "aho-corasick", 3002 "memchr", ··· 3006 3007 [[package]] 3008 name = "regex-automata" 3009 - version = "0.4.9" 3010 source = "registry+https://github.com/rust-lang/crates.io-index" 3011 - checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 3012 dependencies = [ 3013 "aho-corasick", 3014 "memchr", ··· 3017 3018 [[package]] 3019 name = "regex-syntax" 3020 - version = "0.8.5" 3021 source = "registry+https://github.com/rust-lang/crates.io-index" 3022 - checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 3023 3024 [[package]] 3025 name = "reqwest" 3026 - version = "0.12.22" 3027 source = "registry+https://github.com/rust-lang/crates.io-index" 3028 - checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" 3029 dependencies = [ 3030 "base64 0.22.1", 3031 "bytes", ··· 3063 checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" 3064 dependencies = [ 3065 "ashpd", 3066 - "block2 0.6.1", 3067 "dispatch2", 3068 "glib-sys", 3069 "gobject-sys", 3070 "gtk-sys", 3071 "js-sys", 3072 "log", 3073 - "objc2 0.6.1", 3074 "objc2-app-kit", 3075 "objc2-core-foundation", 3076 - "objc2-foundation 0.3.1", 3077 "raw-window-handle", 3078 "wasm-bindgen", 3079 "wasm-bindgen-futures", 3080 "web-sys", 3081 "windows-sys 0.59.0", 3082 ] 3083 - 3084 - [[package]] 3085 - name = "rustc-demangle" 3086 - version = "0.1.26" 3087 - source = "registry+https://github.com/rust-lang/crates.io-index" 3088 - checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" 3089 3090 [[package]] 3091 name = "rustc_version" ··· 3098 3099 [[package]] 3100 name = "rustix" 3101 - version = "1.0.8" 3102 source = "registry+https://github.com/rust-lang/crates.io-index" 3103 - checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" 3104 dependencies = [ 3105 - "bitflags 2.9.1", 3106 "errno", 3107 "libc", 3108 - "linux-raw-sys", 3109 - "windows-sys 0.60.2", 3110 ] 3111 3112 [[package]] 3113 name = "rustversion" 3114 - version = "1.0.21" 3115 source = "registry+https://github.com/rust-lang/crates.io-index" 3116 - checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" 3117 3118 [[package]] 3119 name = "ryu" ··· 3159 3160 [[package]] 3161 name = "schemars" 3162 - version = "1.0.4" 3163 source = "registry+https://github.com/rust-lang/crates.io-index" 3164 - checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" 3165 dependencies = [ 3166 "dyn-clone", 3167 "ref-cast", ··· 3178 "proc-macro2", 3179 "quote", 3180 "serde_derive_internals", 3181 - "syn 2.0.104", 3182 ] 3183 3184 [[package]] ··· 3213 3214 [[package]] 3215 name = "semver" 3216 - version = "1.0.26" 3217 source = "registry+https://github.com/rust-lang/crates.io-index" 3218 - checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" 3219 dependencies = [ 3220 "serde", 3221 ] 3222 3223 [[package]] 3224 name = "serde" 3225 - version = "1.0.219" 3226 source = "registry+https://github.com/rust-lang/crates.io-index" 3227 - checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 3228 dependencies = [ 3229 "serde_derive", 3230 ] 3231 3232 [[package]] 3233 name = "serde-untagged" 3234 - version = "0.1.7" 3235 source = "registry+https://github.com/rust-lang/crates.io-index" 3236 - checksum = "299d9c19d7d466db4ab10addd5703e4c615dec2a5a16dbbafe191045e87ee66e" 3237 dependencies = [ 3238 "erased-serde", 3239 "serde", 3240 "typeid", 3241 ] 3242 3243 [[package]] 3244 name = "serde_derive" 3245 - version = "1.0.219" 3246 source = "registry+https://github.com/rust-lang/crates.io-index" 3247 - checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 3248 dependencies = [ 3249 "proc-macro2", 3250 "quote", 3251 - "syn 2.0.104", 3252 ] 3253 3254 [[package]] ··· 3259 dependencies = [ 3260 "proc-macro2", 3261 "quote", 3262 - "syn 2.0.104", 3263 ] 3264 3265 [[package]] 3266 name = "serde_json" 3267 - version = "1.0.141" 3268 source = "registry+https://github.com/rust-lang/crates.io-index" 3269 - checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" 3270 dependencies = [ 3271 "itoa", 3272 "memchr", 3273 "ryu", 3274 "serde", 3275 ] 3276 3277 [[package]] ··· 3282 dependencies = [ 3283 "proc-macro2", 3284 "quote", 3285 - "syn 2.0.104", 3286 ] 3287 3288 [[package]] ··· 3296 3297 [[package]] 3298 name = "serde_spanned" 3299 - version = "1.0.0" 3300 source = "registry+https://github.com/rust-lang/crates.io-index" 3301 - checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" 3302 dependencies = [ 3303 - "serde", 3304 ] 3305 3306 [[package]] ··· 3317 3318 [[package]] 3319 name = "serde_with" 3320 - version = "3.14.0" 3321 source = "registry+https://github.com/rust-lang/crates.io-index" 3322 - checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" 3323 dependencies = [ 3324 "base64 0.22.1", 3325 "chrono", 3326 "hex", 3327 "indexmap 1.9.3", 3328 - "indexmap 2.10.0", 3329 "schemars 0.9.0", 3330 - "schemars 1.0.4", 3331 - "serde", 3332 - "serde_derive", 3333 "serde_json", 3334 "serde_with_macros", 3335 "time", ··· 3337 3338 [[package]] 3339 name = "serde_with_macros" 3340 - version = "3.14.0" 3341 source = "registry+https://github.com/rust-lang/crates.io-index" 3342 - checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" 3343 dependencies = [ 3344 "darling", 3345 "proc-macro2", 3346 "quote", 3347 - "syn 2.0.104", 3348 ] 3349 3350 [[package]] 3351 name = "serialize-to-javascript" 3352 - version = "0.1.1" 3353 source = "registry+https://github.com/rust-lang/crates.io-index" 3354 - checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" 3355 dependencies = [ 3356 "serde", 3357 "serde_json", ··· 3360 3361 [[package]] 3362 name = "serialize-to-javascript-impl" 3363 - version = "0.1.1" 3364 source = "registry+https://github.com/rust-lang/crates.io-index" 3365 - checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" 3366 dependencies = [ 3367 "proc-macro2", 3368 "quote", 3369 - "syn 1.0.109", 3370 ] 3371 3372 [[package]] ··· 3398 3399 [[package]] 3400 name = "signal-hook-registry" 3401 - version = "1.4.5" 3402 source = "registry+https://github.com/rust-lang/crates.io-index" 3403 - checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" 3404 dependencies = [ 3405 "libc", 3406 ] ··· 3425 3426 [[package]] 3427 name = "slab" 3428 - version = "0.4.10" 3429 source = "registry+https://github.com/rust-lang/crates.io-index" 3430 - checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" 3431 3432 [[package]] 3433 name = "smallvec" ··· 3437 3438 [[package]] 3439 name = "socket2" 3440 - version = "0.6.0" 3441 source = "registry+https://github.com/rust-lang/crates.io-index" 3442 - checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" 3443 dependencies = [ 3444 "libc", 3445 - "windows-sys 0.59.0", 3446 ] 3447 3448 [[package]] ··· 3453 dependencies = [ 3454 "bytemuck", 3455 "cfg_aliases", 3456 - "core-graphics", 3457 "foreign-types", 3458 "js-sys", 3459 "log", ··· 3495 3496 [[package]] 3497 name = "stable_deref_trait" 3498 - version = "1.2.0" 3499 source = "registry+https://github.com/rust-lang/crates.io-index" 3500 - checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 3501 3502 [[package]] 3503 name = "static_assertions" ··· 3560 3561 [[package]] 3562 name = "syn" 3563 - version = "2.0.104" 3564 source = "registry+https://github.com/rust-lang/crates.io-index" 3565 - checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" 3566 dependencies = [ 3567 "proc-macro2", 3568 "quote", ··· 3586 dependencies = [ 3587 "proc-macro2", 3588 "quote", 3589 - "syn 2.0.104", 3590 ] 3591 3592 [[package]] ··· 3598 "cfg-expr", 3599 "heck 0.5.0", 3600 "pkg-config", 3601 - "toml 0.8.23", 3602 "version-compare", 3603 ] 3604 3605 [[package]] 3606 name = "tao" 3607 - version = "0.34.0" 3608 source = "registry+https://github.com/rust-lang/crates.io-index" 3609 - checksum = "49c380ca75a231b87b6c9dd86948f035012e7171d1a7c40a9c2890489a7ffd8a" 3610 dependencies = [ 3611 - "bitflags 2.9.1", 3612 "core-foundation", 3613 - "core-graphics", 3614 "crossbeam-channel", 3615 "dispatch", 3616 "dlopen2", ··· 3625 "ndk", 3626 "ndk-context", 3627 "ndk-sys", 3628 - "objc2 0.6.1", 3629 "objc2-app-kit", 3630 - "objc2-foundation 0.3.1", 3631 "once_cell", 3632 "parking_lot", 3633 "raw-window-handle", ··· 3636 "unicode-segmentation", 3637 "url", 3638 "windows", 3639 - "windows-core", 3640 "windows-version", 3641 "x11-dl", 3642 ] ··· 3649 dependencies = [ 3650 "proc-macro2", 3651 "quote", 3652 - "syn 2.0.104", 3653 ] 3654 3655 [[package]] ··· 3660 3661 [[package]] 3662 name = "tauri" 3663 - version = "2.7.0" 3664 source = "registry+https://github.com/rust-lang/crates.io-index" 3665 - checksum = "352a4bc7bf6c25f5624227e3641adf475a6535707451b09bb83271df8b7a6ac7" 3666 dependencies = [ 3667 "anyhow", 3668 "bytes", 3669 "dirs", 3670 "dunce", 3671 "embed_plist", 3672 - "getrandom 0.3.3", 3673 "glob", 3674 "gtk", 3675 "heck 0.5.0", 3676 "http", 3677 "jni", 3678 "libc", 3679 "log", 3680 "mime", 3681 "muda", 3682 - "objc2 0.6.1", 3683 "objc2-app-kit", 3684 - "objc2-foundation 0.3.1", 3685 "objc2-ui-kit", 3686 "percent-encoding", 3687 "plist", 3688 "raw-window-handle", ··· 3697 "tauri-runtime", 3698 "tauri-runtime-wry", 3699 "tauri-utils", 3700 - "thiserror 2.0.12", 3701 "tokio", 3702 "tray-icon", 3703 "url", 3704 - "urlpattern", 3705 "webkit2gtk", 3706 "webview2-com", 3707 "window-vibrancy", ··· 3710 3711 [[package]] 3712 name = "tauri-build" 3713 - version = "2.3.1" 3714 source = "registry+https://github.com/rust-lang/crates.io-index" 3715 - checksum = "182d688496c06bf08ea896459bf483eb29cdff35c1c4c115fb14053514303064" 3716 dependencies = [ 3717 "anyhow", 3718 "cargo_toml", ··· 3726 "serde_json", 3727 "tauri-utils", 3728 "tauri-winres", 3729 - "toml 0.8.23", 3730 "walkdir", 3731 ] 3732 3733 [[package]] 3734 name = "tauri-codegen" 3735 - version = "2.3.1" 3736 source = "registry+https://github.com/rust-lang/crates.io-index" 3737 - checksum = "b54a99a6cd8e01abcfa61508177e6096a4fe2681efecee9214e962f2f073ae4a" 3738 dependencies = [ 3739 "base64 0.22.1", 3740 "brotli", 3741 "ico", 3742 "json-patch", 3743 "plist", 3744 - "png", 3745 "proc-macro2", 3746 "quote", 3747 "semver", 3748 "serde", 3749 "serde_json", 3750 "sha2", 3751 - "syn 2.0.104", 3752 "tauri-utils", 3753 - "thiserror 2.0.12", 3754 "time", 3755 "url", 3756 "uuid", ··· 3759 3760 [[package]] 3761 name = "tauri-macros" 3762 - version = "2.3.2" 3763 source = "registry+https://github.com/rust-lang/crates.io-index" 3764 - checksum = "7945b14dc45e23532f2ded6e120170bbdd4af5ceaa45784a6b33d250fbce3f9e" 3765 dependencies = [ 3766 "heck 0.5.0", 3767 "proc-macro2", 3768 "quote", 3769 - "syn 2.0.104", 3770 "tauri-codegen", 3771 "tauri-utils", 3772 ] 3773 3774 [[package]] 3775 name = "tauri-plugin" 3776 - version = "2.3.1" 3777 source = "registry+https://github.com/rust-lang/crates.io-index" 3778 - checksum = "5bd5c1e56990c70a906ef67a9851bbdba9136d26075ee9a2b19c8b46986b3e02" 3779 dependencies = [ 3780 "anyhow", 3781 "glob", ··· 3784 "serde", 3785 "serde_json", 3786 "tauri-utils", 3787 - "toml 0.8.23", 3788 "walkdir", 3789 ] 3790 3791 [[package]] 3792 - name = "tauri-plugin-dialog" 3793 version = "2.3.2" 3794 source = "registry+https://github.com/rust-lang/crates.io-index" 3795 - checksum = "37e5858cc7b455a73ab4ea2ebc08b5be33682c00ff1bf4cad5537d4fb62499d9" 3796 dependencies = [ 3797 "log", 3798 "raw-window-handle", ··· 3802 "tauri", 3803 "tauri-plugin", 3804 "tauri-plugin-fs", 3805 - "thiserror 2.0.12", 3806 "url", 3807 ] 3808 3809 [[package]] 3810 name = "tauri-plugin-fs" 3811 - version = "2.4.1" 3812 source = "registry+https://github.com/rust-lang/crates.io-index" 3813 - checksum = "8c6ef84ee2f2094ce093e55106d90d763ba343fad57566992962e8f76d113f99" 3814 dependencies = [ 3815 "anyhow", 3816 "dunce", ··· 3823 "tauri", 3824 "tauri-plugin", 3825 "tauri-utils", 3826 - "thiserror 2.0.12", 3827 - "toml 0.8.23", 3828 "url", 3829 ] 3830 3831 [[package]] 3832 name = "tauri-plugin-opener" 3833 - version = "2.4.0" 3834 source = "registry+https://github.com/rust-lang/crates.io-index" 3835 - checksum = "ecee219f11cdac713ab32959db5d0cceec4810ba4f4458da992292ecf9660321" 3836 dependencies = [ 3837 "dunce", 3838 "glob", 3839 "objc2-app-kit", 3840 - "objc2-foundation 0.3.1", 3841 "open", 3842 "schemars 0.8.22", 3843 "serde", 3844 "serde_json", 3845 "tauri", 3846 "tauri-plugin", 3847 - "thiserror 2.0.12", 3848 "url", 3849 "windows", 3850 "zbus", 3851 ] 3852 3853 [[package]] 3854 name = "tauri-runtime" 3855 - version = "2.7.1" 3856 source = "registry+https://github.com/rust-lang/crates.io-index" 3857 - checksum = "2b1cc885be806ea15ff7b0eb47098a7b16323d9228876afda329e34e2d6c4676" 3858 dependencies = [ 3859 "cookie", 3860 "dpi", 3861 "gtk", 3862 "http", 3863 "jni", 3864 - "objc2 0.6.1", 3865 "objc2-ui-kit", 3866 "raw-window-handle", 3867 "serde", 3868 "serde_json", 3869 "tauri-utils", 3870 - "thiserror 2.0.12", 3871 "url", 3872 "windows", 3873 ] 3874 3875 [[package]] 3876 name = "tauri-runtime-wry" 3877 - version = "2.7.2" 3878 source = "registry+https://github.com/rust-lang/crates.io-index" 3879 - checksum = "fe653a2fbbef19fe898efc774bc52c8742576342a33d3d028c189b57eb1d2439" 3880 dependencies = [ 3881 "gtk", 3882 "http", 3883 "jni", 3884 "log", 3885 - "objc2 0.6.1", 3886 "objc2-app-kit", 3887 - "objc2-foundation 0.3.1", 3888 "once_cell", 3889 "percent-encoding", 3890 "raw-window-handle", ··· 3901 3902 [[package]] 3903 name = "tauri-utils" 3904 - version = "2.6.0" 3905 source = "registry+https://github.com/rust-lang/crates.io-index" 3906 - checksum = "9330c15cabfe1d9f213478c9e8ec2b0c76dab26bb6f314b8ad1c8a568c1d186e" 3907 dependencies = [ 3908 "anyhow", 3909 "brotli", ··· 3929 "serde_json", 3930 "serde_with", 3931 "swift-rs", 3932 - "thiserror 2.0.12", 3933 - "toml 0.8.23", 3934 "url", 3935 "urlpattern", 3936 "uuid", ··· 3939 3940 [[package]] 3941 name = "tauri-winres" 3942 - version = "0.3.1" 3943 source = "registry+https://github.com/rust-lang/crates.io-index" 3944 - checksum = "e8d321dbc6f998d825ab3f0d62673e810c861aac2d0de2cc2c395328f1d113b4" 3945 dependencies = [ 3946 "embed-resource", 3947 - "indexmap 2.10.0", 3948 - "toml 0.8.23", 3949 ] 3950 3951 [[package]] 3952 name = "tempfile" 3953 - version = "3.20.0" 3954 source = "registry+https://github.com/rust-lang/crates.io-index" 3955 - checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" 3956 dependencies = [ 3957 "fastrand", 3958 - "getrandom 0.3.3", 3959 "once_cell", 3960 - "rustix", 3961 - "windows-sys 0.59.0", 3962 ] 3963 3964 [[package]] ··· 3983 3984 [[package]] 3985 name = "thiserror" 3986 - version = "2.0.12" 3987 source = "registry+https://github.com/rust-lang/crates.io-index" 3988 - checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 3989 dependencies = [ 3990 - "thiserror-impl 2.0.12", 3991 ] 3992 3993 [[package]] ··· 3998 dependencies = [ 3999 "proc-macro2", 4000 "quote", 4001 - "syn 2.0.104", 4002 ] 4003 4004 [[package]] 4005 name = "thiserror-impl" 4006 - version = "2.0.12" 4007 source = "registry+https://github.com/rust-lang/crates.io-index" 4008 - checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 4009 dependencies = [ 4010 "proc-macro2", 4011 "quote", 4012 - "syn 2.0.104", 4013 ] 4014 4015 [[package]] 4016 name = "time" 4017 - version = "0.3.41" 4018 source = "registry+https://github.com/rust-lang/crates.io-index" 4019 - checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" 4020 dependencies = [ 4021 "deranged", 4022 "itoa", ··· 4029 4030 [[package]] 4031 name = "time-core" 4032 - version = "0.1.4" 4033 source = "registry+https://github.com/rust-lang/crates.io-index" 4034 - checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" 4035 4036 [[package]] 4037 name = "time-macros" 4038 - version = "0.2.22" 4039 source = "registry+https://github.com/rust-lang/crates.io-index" 4040 - checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" 4041 dependencies = [ 4042 "num-conv", 4043 "time-core", ··· 4045 4046 [[package]] 4047 name = "tinystr" 4048 - version = "0.8.1" 4049 source = "registry+https://github.com/rust-lang/crates.io-index" 4050 - checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 4051 dependencies = [ 4052 "displaydoc", 4053 "zerovec", ··· 4055 4056 [[package]] 4057 name = "tokio" 4058 - version = "1.47.0" 4059 source = "registry+https://github.com/rust-lang/crates.io-index" 4060 - checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35" 4061 dependencies = [ 4062 - "backtrace", 4063 "bytes", 4064 - "io-uring", 4065 "libc", 4066 "mio", 4067 "pin-project-lite", 4068 "signal-hook-registry", 4069 - "slab", 4070 "socket2", 4071 "tokio-macros", 4072 "tracing", 4073 - "windows-sys 0.59.0", 4074 ] 4075 4076 [[package]] 4077 name = "tokio-macros" 4078 - version = "2.5.0" 4079 source = "registry+https://github.com/rust-lang/crates.io-index" 4080 - checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 4081 dependencies = [ 4082 "proc-macro2", 4083 "quote", 4084 - "syn 2.0.104", 4085 ] 4086 4087 [[package]] 4088 name = "tokio-util" 4089 - version = "0.7.15" 4090 source = "registry+https://github.com/rust-lang/crates.io-index" 4091 - checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" 4092 dependencies = [ 4093 "bytes", 4094 "futures-core", ··· 4099 4100 [[package]] 4101 name = "toml" 4102 - version = "0.8.23" 4103 source = "registry+https://github.com/rust-lang/crates.io-index" 4104 - checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" 4105 dependencies = [ 4106 "serde", 4107 "serde_spanned 0.6.9", 4108 - "toml_datetime 0.6.11", 4109 - "toml_edit 0.22.27", 4110 ] 4111 4112 [[package]] 4113 name = "toml" 4114 - version = "0.9.3" 4115 source = "registry+https://github.com/rust-lang/crates.io-index" 4116 - checksum = "e06723639aaded957e5a80be250c1f82f274b9d23ebb4d94163668470623461c" 4117 dependencies = [ 4118 - "indexmap 2.10.0", 4119 - "serde", 4120 - "serde_spanned 1.0.0", 4121 - "toml_datetime 0.7.0", 4122 "toml_parser", 4123 "toml_writer", 4124 - "winnow 0.7.12", 4125 ] 4126 4127 [[package]] 4128 name = "toml_datetime" 4129 - version = "0.6.11" 4130 source = "registry+https://github.com/rust-lang/crates.io-index" 4131 - checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" 4132 dependencies = [ 4133 "serde", 4134 ] 4135 4136 [[package]] 4137 name = "toml_datetime" 4138 - version = "0.7.0" 4139 source = "registry+https://github.com/rust-lang/crates.io-index" 4140 - checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" 4141 dependencies = [ 4142 - "serde", 4143 ] 4144 4145 [[package]] ··· 4148 source = "registry+https://github.com/rust-lang/crates.io-index" 4149 checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" 4150 dependencies = [ 4151 - "indexmap 2.10.0", 4152 - "toml_datetime 0.6.11", 4153 "winnow 0.5.40", 4154 ] 4155 4156 [[package]] 4157 name = "toml_edit" 4158 - version = "0.20.7" 4159 source = "registry+https://github.com/rust-lang/crates.io-index" 4160 - checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" 4161 dependencies = [ 4162 - "indexmap 2.10.0", 4163 - "toml_datetime 0.6.11", 4164 "winnow 0.5.40", 4165 ] 4166 4167 [[package]] 4168 name = "toml_edit" 4169 - version = "0.22.27" 4170 source = "registry+https://github.com/rust-lang/crates.io-index" 4171 - checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" 4172 dependencies = [ 4173 - "indexmap 2.10.0", 4174 - "serde", 4175 - "serde_spanned 0.6.9", 4176 - "toml_datetime 0.6.11", 4177 - "toml_write", 4178 - "winnow 0.7.12", 4179 ] 4180 4181 [[package]] 4182 name = "toml_parser" 4183 - version = "1.0.1" 4184 source = "registry+https://github.com/rust-lang/crates.io-index" 4185 - checksum = "97200572db069e74c512a14117b296ba0a80a30123fbbb5aa1f4a348f639ca30" 4186 dependencies = [ 4187 - "winnow 0.7.12", 4188 ] 4189 4190 [[package]] 4191 - name = "toml_write" 4192 - version = "0.1.2" 4193 - source = "registry+https://github.com/rust-lang/crates.io-index" 4194 - checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" 4195 - 4196 - [[package]] 4197 name = "toml_writer" 4198 - version = "1.0.2" 4199 source = "registry+https://github.com/rust-lang/crates.io-index" 4200 - checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" 4201 4202 [[package]] 4203 name = "tower" ··· 4220 source = "registry+https://github.com/rust-lang/crates.io-index" 4221 checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" 4222 dependencies = [ 4223 - "bitflags 2.9.1", 4224 "bytes", 4225 "futures-util", 4226 "http", ··· 4263 dependencies = [ 4264 "proc-macro2", 4265 "quote", 4266 - "syn 2.0.104", 4267 ] 4268 4269 [[package]] ··· 4277 4278 [[package]] 4279 name = "tray-icon" 4280 - version = "0.21.0" 4281 source = "registry+https://github.com/rust-lang/crates.io-index" 4282 - checksum = "2da75ec677957aa21f6e0b361df0daab972f13a5bee3606de0638fd4ee1c666a" 4283 dependencies = [ 4284 "crossbeam-channel", 4285 "dirs", 4286 "libappindicator", 4287 "muda", 4288 - "objc2 0.6.1", 4289 "objc2-app-kit", 4290 "objc2-core-foundation", 4291 "objc2-core-graphics", 4292 - "objc2-foundation 0.3.1", 4293 "once_cell", 4294 - "png", 4295 "serde", 4296 - "thiserror 2.0.12", 4297 - "windows-sys 0.59.0", 4298 ] 4299 4300 [[package]] ··· 4311 4312 [[package]] 4313 name = "typenum" 4314 - version = "1.18.0" 4315 source = "registry+https://github.com/rust-lang/crates.io-index" 4316 - checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 4317 4318 [[package]] 4319 name = "uds_windows" ··· 4369 4370 [[package]] 4371 name = "unicode-ident" 4372 - version = "1.0.18" 4373 source = "registry+https://github.com/rust-lang/crates.io-index" 4374 - checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 4375 4376 [[package]] 4377 name = "unicode-segmentation" ··· 4381 4382 [[package]] 4383 name = "url" 4384 - version = "2.5.4" 4385 source = "registry+https://github.com/rust-lang/crates.io-index" 4386 - checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 4387 dependencies = [ 4388 "form_urlencoded", 4389 "idna", ··· 4417 4418 [[package]] 4419 name = "uuid" 4420 - version = "1.17.0" 4421 source = "registry+https://github.com/rust-lang/crates.io-index" 4422 - checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" 4423 dependencies = [ 4424 - "getrandom 0.3.3", 4425 "js-sys", 4426 "serde", 4427 "wasm-bindgen", ··· 4429 4430 [[package]] 4431 name = "version-compare" 4432 - version = "0.2.0" 4433 source = "registry+https://github.com/rust-lang/crates.io-index" 4434 - checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" 4435 4436 [[package]] 4437 name = "version_check" ··· 4491 checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 4492 4493 [[package]] 4494 - name = "wasi" 4495 - version = "0.14.2+wasi-0.2.4" 4496 source = "registry+https://github.com/rust-lang/crates.io-index" 4497 - checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 4498 dependencies = [ 4499 - "wit-bindgen-rt", 4500 ] 4501 4502 [[package]] 4503 name = "wasm-bindgen" 4504 - version = "0.2.100" 4505 source = "registry+https://github.com/rust-lang/crates.io-index" 4506 - checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 4507 dependencies = [ 4508 "cfg-if", 4509 "once_cell", 4510 "rustversion", 4511 "wasm-bindgen-macro", 4512 - ] 4513 - 4514 - [[package]] 4515 - name = "wasm-bindgen-backend" 4516 - version = "0.2.100" 4517 - source = "registry+https://github.com/rust-lang/crates.io-index" 4518 - checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 4519 - dependencies = [ 4520 - "bumpalo", 4521 - "log", 4522 - "proc-macro2", 4523 - "quote", 4524 - "syn 2.0.104", 4525 "wasm-bindgen-shared", 4526 ] 4527 4528 [[package]] 4529 name = "wasm-bindgen-futures" 4530 - version = "0.4.50" 4531 source = "registry+https://github.com/rust-lang/crates.io-index" 4532 - checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 4533 dependencies = [ 4534 "cfg-if", 4535 "js-sys", ··· 4540 4541 [[package]] 4542 name = "wasm-bindgen-macro" 4543 - version = "0.2.100" 4544 source = "registry+https://github.com/rust-lang/crates.io-index" 4545 - checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 4546 dependencies = [ 4547 "quote", 4548 "wasm-bindgen-macro-support", ··· 4550 4551 [[package]] 4552 name = "wasm-bindgen-macro-support" 4553 - version = "0.2.100" 4554 source = "registry+https://github.com/rust-lang/crates.io-index" 4555 - checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 4556 dependencies = [ 4557 "proc-macro2", 4558 "quote", 4559 - "syn 2.0.104", 4560 - "wasm-bindgen-backend", 4561 "wasm-bindgen-shared", 4562 ] 4563 4564 [[package]] 4565 name = "wasm-bindgen-shared" 4566 - version = "0.2.100" 4567 source = "registry+https://github.com/rust-lang/crates.io-index" 4568 - checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 4569 dependencies = [ 4570 "unicode-ident", 4571 ] ··· 4591 dependencies = [ 4592 "cc", 4593 "downcast-rs", 4594 - "rustix", 4595 "scoped-tls", 4596 "smallvec", 4597 "wayland-sys", ··· 4603 source = "registry+https://github.com/rust-lang/crates.io-index" 4604 checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" 4605 dependencies = [ 4606 - "bitflags 2.9.1", 4607 - "rustix", 4608 "wayland-backend", 4609 "wayland-scanner", 4610 ] ··· 4615 source = "registry+https://github.com/rust-lang/crates.io-index" 4616 checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" 4617 dependencies = [ 4618 - "bitflags 2.9.1", 4619 "wayland-backend", 4620 "wayland-client", 4621 "wayland-scanner", 4622 ] 4623 4624 [[package]] 4625 name = "wayland-scanner" 4626 version = "0.31.7" 4627 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4645 4646 [[package]] 4647 name = "web-sys" 4648 - version = "0.3.77" 4649 source = "registry+https://github.com/rust-lang/crates.io-index" 4650 - checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 4651 dependencies = [ 4652 "js-sys", 4653 "wasm-bindgen", ··· 4706 "webview2-com-macros", 4707 "webview2-com-sys", 4708 "windows", 4709 - "windows-core", 4710 "windows-implement", 4711 "windows-interface", 4712 ] ··· 4719 dependencies = [ 4720 "proc-macro2", 4721 "quote", 4722 - "syn 2.0.104", 4723 ] 4724 4725 [[package]] ··· 4728 source = "registry+https://github.com/rust-lang/crates.io-index" 4729 checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" 4730 dependencies = [ 4731 - "thiserror 2.0.12", 4732 "windows", 4733 - "windows-core", 4734 ] 4735 4736 [[package]] 4737 name = "winapi" 4738 version = "0.3.9" 4739 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4751 4752 [[package]] 4753 name = "winapi-util" 4754 - version = "0.1.9" 4755 source = "registry+https://github.com/rust-lang/crates.io-index" 4756 - checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 4757 dependencies = [ 4758 - "windows-sys 0.59.0", 4759 ] 4760 4761 [[package]] ··· 4770 source = "registry+https://github.com/rust-lang/crates.io-index" 4771 checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" 4772 dependencies = [ 4773 - "objc2 0.6.1", 4774 "objc2-app-kit", 4775 "objc2-core-foundation", 4776 - "objc2-foundation 0.3.1", 4777 "raw-window-handle", 4778 "windows-sys 0.59.0", 4779 "windows-version", ··· 4786 checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" 4787 dependencies = [ 4788 "windows-collections", 4789 - "windows-core", 4790 "windows-future", 4791 - "windows-link", 4792 "windows-numerics", 4793 ] 4794 ··· 4798 source = "registry+https://github.com/rust-lang/crates.io-index" 4799 checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" 4800 dependencies = [ 4801 - "windows-core", 4802 ] 4803 4804 [[package]] ··· 4809 dependencies = [ 4810 "windows-implement", 4811 "windows-interface", 4812 - "windows-link", 4813 - "windows-result", 4814 - "windows-strings", 4815 ] 4816 4817 [[package]] ··· 4820 source = "registry+https://github.com/rust-lang/crates.io-index" 4821 checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" 4822 dependencies = [ 4823 - "windows-core", 4824 - "windows-link", 4825 "windows-threading", 4826 ] 4827 4828 [[package]] 4829 name = "windows-implement" 4830 - version = "0.60.0" 4831 source = "registry+https://github.com/rust-lang/crates.io-index" 4832 - checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" 4833 dependencies = [ 4834 "proc-macro2", 4835 "quote", 4836 - "syn 2.0.104", 4837 ] 4838 4839 [[package]] 4840 name = "windows-interface" 4841 - version = "0.59.1" 4842 source = "registry+https://github.com/rust-lang/crates.io-index" 4843 - checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" 4844 dependencies = [ 4845 "proc-macro2", 4846 "quote", 4847 - "syn 2.0.104", 4848 ] 4849 4850 [[package]] ··· 4854 checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 4855 4856 [[package]] 4857 name = "windows-numerics" 4858 version = "0.2.0" 4859 source = "registry+https://github.com/rust-lang/crates.io-index" 4860 checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" 4861 dependencies = [ 4862 - "windows-core", 4863 - "windows-link", 4864 ] 4865 4866 [[package]] ··· 4869 source = "registry+https://github.com/rust-lang/crates.io-index" 4870 checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" 4871 dependencies = [ 4872 - "windows-link", 4873 ] 4874 4875 [[package]] ··· 4878 source = "registry+https://github.com/rust-lang/crates.io-index" 4879 checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" 4880 dependencies = [ 4881 - "windows-link", 4882 ] 4883 4884 [[package]] ··· 4905 source = "registry+https://github.com/rust-lang/crates.io-index" 4906 checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 4907 dependencies = [ 4908 - "windows-targets 0.53.3", 4909 ] 4910 4911 [[package]] ··· 4941 4942 [[package]] 4943 name = "windows-targets" 4944 - version = "0.53.3" 4945 source = "registry+https://github.com/rust-lang/crates.io-index" 4946 - checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" 4947 dependencies = [ 4948 - "windows-link", 4949 - "windows_aarch64_gnullvm 0.53.0", 4950 - "windows_aarch64_msvc 0.53.0", 4951 - "windows_i686_gnu 0.53.0", 4952 - "windows_i686_gnullvm 0.53.0", 4953 - "windows_i686_msvc 0.53.0", 4954 - "windows_x86_64_gnu 0.53.0", 4955 - "windows_x86_64_gnullvm 0.53.0", 4956 - "windows_x86_64_msvc 0.53.0", 4957 ] 4958 4959 [[package]] ··· 4962 source = "registry+https://github.com/rust-lang/crates.io-index" 4963 checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" 4964 dependencies = [ 4965 - "windows-link", 4966 ] 4967 4968 [[package]] 4969 name = "windows-version" 4970 - version = "0.1.4" 4971 source = "registry+https://github.com/rust-lang/crates.io-index" 4972 - checksum = "e04a5c6627e310a23ad2358483286c7df260c964eb2d003d8efd6d0f4e79265c" 4973 dependencies = [ 4974 - "windows-link", 4975 ] 4976 4977 [[package]] ··· 4988 4989 [[package]] 4990 name = "windows_aarch64_gnullvm" 4991 - version = "0.53.0" 4992 source = "registry+https://github.com/rust-lang/crates.io-index" 4993 - checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 4994 4995 [[package]] 4996 name = "windows_aarch64_msvc" ··· 5006 5007 [[package]] 5008 name = "windows_aarch64_msvc" 5009 - version = "0.53.0" 5010 source = "registry+https://github.com/rust-lang/crates.io-index" 5011 - checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 5012 5013 [[package]] 5014 name = "windows_i686_gnu" ··· 5024 5025 [[package]] 5026 name = "windows_i686_gnu" 5027 - version = "0.53.0" 5028 source = "registry+https://github.com/rust-lang/crates.io-index" 5029 - checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 5030 5031 [[package]] 5032 name = "windows_i686_gnullvm" ··· 5036 5037 [[package]] 5038 name = "windows_i686_gnullvm" 5039 - version = "0.53.0" 5040 source = "registry+https://github.com/rust-lang/crates.io-index" 5041 - checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 5042 5043 [[package]] 5044 name = "windows_i686_msvc" ··· 5054 5055 [[package]] 5056 name = "windows_i686_msvc" 5057 - version = "0.53.0" 5058 source = "registry+https://github.com/rust-lang/crates.io-index" 5059 - checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 5060 5061 [[package]] 5062 name = "windows_x86_64_gnu" ··· 5072 5073 [[package]] 5074 name = "windows_x86_64_gnu" 5075 - version = "0.53.0" 5076 source = "registry+https://github.com/rust-lang/crates.io-index" 5077 - checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 5078 5079 [[package]] 5080 name = "windows_x86_64_gnullvm" ··· 5090 5091 [[package]] 5092 name = "windows_x86_64_gnullvm" 5093 - version = "0.53.0" 5094 source = "registry+https://github.com/rust-lang/crates.io-index" 5095 - checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 5096 5097 [[package]] 5098 name = "windows_x86_64_msvc" ··· 5108 5109 [[package]] 5110 name = "windows_x86_64_msvc" 5111 - version = "0.53.0" 5112 source = "registry+https://github.com/rust-lang/crates.io-index" 5113 - checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 5114 5115 [[package]] 5116 name = "winnow" ··· 5123 5124 [[package]] 5125 name = "winnow" 5126 - version = "0.7.12" 5127 source = "registry+https://github.com/rust-lang/crates.io-index" 5128 - checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" 5129 dependencies = [ 5130 "memchr", 5131 ] ··· 5141 ] 5142 5143 [[package]] 5144 - name = "wit-bindgen-rt" 5145 - version = "0.39.0" 5146 source = "registry+https://github.com/rust-lang/crates.io-index" 5147 - checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 5148 dependencies = [ 5149 - "bitflags 2.9.1", 5150 ] 5151 5152 [[package]] 5153 name = "writeable" 5154 - version = "0.6.1" 5155 source = "registry+https://github.com/rust-lang/crates.io-index" 5156 - checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 5157 5158 [[package]] 5159 name = "wry" 5160 - version = "0.52.1" 5161 source = "registry+https://github.com/rust-lang/crates.io-index" 5162 - checksum = "12a714d9ba7075aae04a6e50229d6109e3d584774b99a6a8c60de1698ca111b9" 5163 dependencies = [ 5164 "base64 0.22.1", 5165 - "block2 0.6.1", 5166 "cookie", 5167 "crossbeam-channel", 5168 "dpi", 5169 "dunce", 5170 "gdkx11", ··· 5176 "kuchikiki", 5177 "libc", 5178 "ndk", 5179 - "objc2 0.6.1", 5180 "objc2-app-kit", 5181 "objc2-core-foundation", 5182 - "objc2-foundation 0.3.1", 5183 "objc2-ui-kit", 5184 "objc2-web-kit", 5185 "once_cell", ··· 5188 "sha2", 5189 "soup3", 5190 "tao-macros", 5191 - "thiserror 2.0.12", 5192 "url", 5193 "webkit2gtk", 5194 "webkit2gtk-sys", 5195 "webview2-com", 5196 "windows", 5197 - "windows-core", 5198 "windows-version", 5199 "x11-dl", 5200 ] ··· 5221 ] 5222 5223 [[package]] 5224 name = "yoke" 5225 - version = "0.8.0" 5226 source = "registry+https://github.com/rust-lang/crates.io-index" 5227 - checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 5228 dependencies = [ 5229 - "serde", 5230 "stable_deref_trait", 5231 "yoke-derive", 5232 "zerofrom", ··· 5234 5235 [[package]] 5236 name = "yoke-derive" 5237 - version = "0.8.0" 5238 source = "registry+https://github.com/rust-lang/crates.io-index" 5239 - checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 5240 dependencies = [ 5241 "proc-macro2", 5242 "quote", 5243 - "syn 2.0.104", 5244 "synstructure", 5245 ] 5246 5247 [[package]] 5248 name = "zbus" 5249 - version = "5.9.0" 5250 source = "registry+https://github.com/rust-lang/crates.io-index" 5251 - checksum = "4bb4f9a464286d42851d18a605f7193b8febaf5b0919d71c6399b7b26e5b0aad" 5252 dependencies = [ 5253 "async-broadcast", 5254 "async-executor", ··· 5271 "tokio", 5272 "tracing", 5273 "uds_windows", 5274 - "windows-sys 0.59.0", 5275 - "winnow 0.7.12", 5276 "zbus_macros", 5277 "zbus_names", 5278 "zvariant", ··· 5280 5281 [[package]] 5282 name = "zbus_macros" 5283 - version = "5.9.0" 5284 source = "registry+https://github.com/rust-lang/crates.io-index" 5285 - checksum = "ef9859f68ee0c4ee2e8cde84737c78e3f4c54f946f2a38645d0d4c7a95327659" 5286 dependencies = [ 5287 - "proc-macro-crate 3.3.0", 5288 "proc-macro2", 5289 "quote", 5290 - "syn 2.0.104", 5291 "zbus_names", 5292 "zvariant", 5293 "zvariant_utils", ··· 5301 dependencies = [ 5302 "serde", 5303 "static_assertions", 5304 - "winnow 0.7.12", 5305 "zvariant", 5306 ] 5307 5308 [[package]] 5309 name = "zerocopy" 5310 - version = "0.8.26" 5311 source = "registry+https://github.com/rust-lang/crates.io-index" 5312 - checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" 5313 dependencies = [ 5314 "zerocopy-derive", 5315 ] 5316 5317 [[package]] 5318 name = "zerocopy-derive" 5319 - version = "0.8.26" 5320 source = "registry+https://github.com/rust-lang/crates.io-index" 5321 - checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" 5322 dependencies = [ 5323 "proc-macro2", 5324 "quote", 5325 - "syn 2.0.104", 5326 ] 5327 5328 [[package]] ··· 5342 dependencies = [ 5343 "proc-macro2", 5344 "quote", 5345 - "syn 2.0.104", 5346 "synstructure", 5347 ] 5348 5349 [[package]] 5350 name = "zerotrie" 5351 - version = "0.2.2" 5352 source = "registry+https://github.com/rust-lang/crates.io-index" 5353 - checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 5354 dependencies = [ 5355 "displaydoc", 5356 "yoke", ··· 5359 5360 [[package]] 5361 name = "zerovec" 5362 - version = "0.11.2" 5363 source = "registry+https://github.com/rust-lang/crates.io-index" 5364 - checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" 5365 dependencies = [ 5366 "yoke", 5367 "zerofrom", ··· 5370 5371 [[package]] 5372 name = "zerovec-derive" 5373 - version = "0.11.1" 5374 source = "registry+https://github.com/rust-lang/crates.io-index" 5375 - checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 5376 dependencies = [ 5377 "proc-macro2", 5378 "quote", 5379 - "syn 2.0.104", 5380 ] 5381 5382 [[package]] 5383 name = "zvariant" 5384 - version = "5.6.0" 5385 source = "registry+https://github.com/rust-lang/crates.io-index" 5386 - checksum = "d91b3680bb339216abd84714172b5138a4edac677e641ef17e1d8cb1b3ca6e6f" 5387 dependencies = [ 5388 "endi", 5389 "enumflags2", 5390 "serde", 5391 "url", 5392 - "winnow 0.7.12", 5393 "zvariant_derive", 5394 "zvariant_utils", 5395 ] 5396 5397 [[package]] 5398 name = "zvariant_derive" 5399 - version = "5.6.0" 5400 source = "registry+https://github.com/rust-lang/crates.io-index" 5401 - checksum = "3a8c68501be459a8dbfffbe5d792acdd23b4959940fc87785fb013b32edbc208" 5402 dependencies = [ 5403 - "proc-macro-crate 3.3.0", 5404 "proc-macro2", 5405 "quote", 5406 - "syn 2.0.104", 5407 "zvariant_utils", 5408 ] 5409 5410 [[package]] 5411 name = "zvariant_utils" 5412 - version = "3.2.0" 5413 source = "registry+https://github.com/rust-lang/crates.io-index" 5414 - checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" 5415 dependencies = [ 5416 "proc-macro2", 5417 "quote", 5418 "serde", 5419 - "static_assertions", 5420 - "syn 2.0.104", 5421 - "winnow 0.7.12", 5422 ]
··· 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" 381 version = "1.5.0" 382 source = "registry+https://github.com/rust-lang/crates.io-index" 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" ··· 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" 1401 version = "0.18.4" 1402 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1434 source = "registry+https://github.com/rust-lang/crates.io-index" 1435 checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" 1436 dependencies = [ 1437 + "bitflags 2.10.0", 1438 "futures-channel", 1439 "futures-core", 1440 "futures-executor", ··· 1458 checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" 1459 dependencies = [ 1460 "heck 0.4.1", 1461 + "proc-macro-crate 2.0.2", 1462 "proc-macro-error", 1463 "proc-macro2", 1464 "quote", 1465 + "syn 2.0.109", 1466 ] 1467 1468 [[package]] ··· 1477 1478 [[package]] 1479 name = "glob" 1480 + version = "0.3.3" 1481 source = "registry+https://github.com/rust-lang/crates.io-index" 1482 + checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" 1483 1484 [[package]] 1485 name = "gobject-sys" ··· 1541 "proc-macro-error", 1542 "proc-macro2", 1543 "quote", 1544 + "syn 2.0.109", 1545 + ] 1546 + 1547 + [[package]] 1548 + name = "half" 1549 + version = "2.7.1" 1550 + source = "registry+https://github.com/rust-lang/crates.io-index" 1551 + checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" 1552 + dependencies = [ 1553 + "cfg-if", 1554 + "crunchy", 1555 + "zerocopy", 1556 ] 1557 1558 [[package]] ··· 1563 1564 [[package]] 1565 name = "hashbrown" 1566 + version = "0.15.5" 1567 source = "registry+https://github.com/rust-lang/crates.io-index" 1568 + checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 1569 + dependencies = [ 1570 + "foldhash", 1571 + ] 1572 + 1573 + [[package]] 1574 + name = "hashbrown" 1575 + version = "0.16.0" 1576 + source = "registry+https://github.com/rust-lang/crates.io-index" 1577 + checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" 1578 1579 [[package]] 1580 name = "heck" ··· 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", 3398 "web-sys", 3399 "windows-sys 0.59.0", 3400 ] 3401 3402 [[package]] 3403 name = "rustc_version" ··· 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 + 5024 + [[package]] 5025 name = "wayland-scanner" 5026 version = "0.31.7" 5027 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 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 -6
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 - crossbeam-channel = "0.5.15" 31
··· 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
+4 -1
src-tauri/capabilities/default.json
··· 9 "core:default", 10 "core:window:allow-destroy", 11 "opener:default", 12 - "dialog:default" 13 ] 14 }
··· 9 "core:default", 10 "core:window:allow-destroy", 11 "opener:default", 12 + "dialog:default", 13 + "clipboard-manager:allow-read-text", 14 + "clipboard-manager:allow-write-text", 15 + "os:default" 16 ] 17 }
+9
src-tauri/src/frontend_calls/close_app.rs
···
··· 1 + use tauri::State; 2 + 3 + use crate::utils::config::Config; 4 + 5 + #[tauri::command] 6 + pub fn close_app(conf: State<Config>) { 7 + conf.save(); 8 + std::process::exit(0); 9 + }
+11 -4
src-tauri/src/frontend_calls/load_previous_tabs.rs
··· 1 use std::collections::HashMap; 2 3 - use tauri::State; 4 5 - use crate::{ structs::nodes::Node, utils::config::Config }; 6 7 #[tauri::command] 8 - pub fn load_previous_tabs( conf: State<Config> ) -> HashMap<String, ( Vec<Node>, String, Option<String> )> { 9 let config = conf.store.lock().unwrap(); 10 11 let tabs = config.loaded_tabs.clone(); 12 tabs 13 - }
··· 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 + }
+3 -1
src-tauri/src/frontend_calls/mod.rs
··· 1 pub mod get_addresses; 2 pub mod save_graph; 3 pub mod sync_tab; 4 - pub mod load_previous_tabs;
··· 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 + }
+18 -11
src-tauri/src/frontend_calls/sync_tab.rs
··· 1 use crossbeam_channel::Sender; 2 3 use tauri::State; 4 5 - use crate::{ runtime::commands::RuntimeCommand, structs::nodes::Node, utils::config::Config }; 6 7 #[tauri::command] 8 - pub fn sync_tab( graph: Vec<Node>, id: String, name: String, location: Option<String>, cmd: State<Sender<RuntimeCommand>>, conf: State<Config> ){ 9 - cmd.send(RuntimeCommand::AddTab(graph.clone(), id.clone())).unwrap(); 10 11 let mut config = conf.store.lock().unwrap(); 12 - config.loaded_tabs.insert(id, ( graph, name, location )); 13 - drop(config); 14 15 - conf.save(); 16 } 17 18 #[tauri::command] 19 - pub fn discard_tab( id: String, cmd: State<Sender<RuntimeCommand>>, conf: State<Config> ){ 20 cmd.send(RuntimeCommand::RemoveTab(id.clone())).unwrap(); 21 22 let mut config = conf.store.lock().unwrap(); 23 config.loaded_tabs.remove(&id); 24 - drop(config); 25 - 26 - conf.save(); 27 - }
··· 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 + }
+15 -10
src-tauri/src/lib.rs
··· 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 }; 7 8 mod frontend_calls; 9 mod osc; 10 mod setup; 11 mod structs; 12 mod utils; 13 - mod runtime; 14 15 #[cfg_attr(mobile, tauri::mobile_entry_point)] 16 #[tokio::main] 17 pub async fn run() { 18 - // TODO: Impl background running by default 19 - 20 let container_folder = dirs::config_dir().unwrap().join("VRCMacros"); 21 22 match fs::metadata(&container_folder) { 23 Ok(meta) => { 24 if meta.is_file() { 25 - panic!( 26 - "document.write('Cannot launch app as the container path is a file not a directory')" 27 - ); 28 } 29 } 30 Err(_) => { ··· 37 38 static ADDRESSES: Mutex<Vec<OSCMessage>> = Mutex::new(Vec::new()); 39 40 - let ( runtime_sender, runtime_receiver ) = bounded(1024); 41 42 tauri::Builder::default() 43 .plugin(tauri_plugin_dialog::init()) 44 .plugin(tauri_plugin_opener::init()) 45 .invoke_handler(tauri::generate_handler![ ··· 47 save_graph::save_graph, 48 sync_tab::sync_tab, 49 sync_tab::discard_tab, 50 - load_previous_tabs::load_previous_tabs 51 ]) 52 .manage(conf) 53 .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] 17 pub async fn run() { 18 let container_folder = dirs::config_dir().unwrap().join("VRCMacros"); 19 20 match fs::metadata(&container_folder) { 21 Ok(meta) => { 22 if meta.is_file() { 23 + panic!("Cannot launch app as the container path is a file not a directory"); 24 } 25 } 26 Err(_) => { ··· 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![ ··· 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 }
-1
src-tauri/src/osc.rs
··· 160 } 161 } 162 163 - println!("{:X?}", &buf); 164 socket.send_to(&buf, ip_addr).unwrap(); 165 }
··· 160 } 161 } 162 163 socket.send_to(&buf, ip_addr).unwrap(); 164 }
+4 -4
src-tauri/src/runtime/commands.rs
··· 1 - use crate::{ osc::OSCMessage, structs::nodes::Node }; 2 3 #[derive(Debug)] 4 - pub enum RuntimeCommand{ 5 OSCMessage(OSCMessage), 6 7 AddTab(Vec<Node>, String), 8 - RemoveTab(String) 9 - }
··· 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 + }
+37 -38
src-tauri/src/runtime/nodes/conditional/ifequal.rs
··· 1 - use crate::{ runtime::nodes::RuntimeNode, structs::{ nodes::Node, parameter_types::ParameterType } }; 2 3 - pub struct ConditionalIfEqual{ 4 - outputs: Vec<Vec<( String, isize, isize )>>, 5 - value1: ParameterType, 6 - value2: ParameterType 7 } 8 9 - impl ConditionalIfEqual{ 10 - pub fn new( node: Node ) -> Box<Self>{ 11 - dbg!(&node); 12 - 13 Box::new(Self { 14 - outputs: node.outputs.iter() 15 - .map(| x | { 16 - x.connections.iter().map(| x | { ( x.node.clone(), x.index, x.value_type ) }).collect() 17 - }).collect(), 18 - value1: ParameterType::None, 19 - value2: ParameterType::None, 20 }) 21 } 22 } 23 24 - impl RuntimeNode for ConditionalIfEqual{ 25 - fn outputs( &self ) -> Vec<Vec<( String, isize, isize )>> { self.outputs.clone() } 26 - fn execute_dry( &mut self, _: &Vec<ParameterType> ) -> Option<Vec<ParameterType>> { Some(vec![]) } 27 28 - fn execute( &mut self ) -> Option<Vec<ParameterType>> { 29 - if self.value1 == ParameterType::None && self.value2 == ParameterType::None{ 30 - None 31 - } else{ 32 - let equal = self.value1 == self.value2; 33 - Some(vec![ ParameterType::Flow(equal), ParameterType::Flow(!equal) ]) 34 - } 35 } 36 37 - fn update_arg( &mut self, index: usize, arg: ParameterType ) -> bool { 38 - match index{ 39 - 1 => { 40 - self.value1 = arg; 41 - } 42 - 2 => { 43 - self.value2 = arg; 44 - } 45 - _ => {} 46 - } 47 48 false 49 } 50 - 51 - fn is_entrypoint( &self ) -> bool { false } 52 - }
··· 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 + }
+38 -33
src-tauri/src/runtime/nodes/conditional/iffalse.rs
··· 1 - use crate::{ runtime::nodes::RuntimeNode, structs::{ nodes::Node, parameter_types::ParameterType } }; 2 3 - pub struct ConditionalIfFalse{ 4 - outputs: Vec<Vec<( String, isize, isize )>>, 5 - runtime_active: bool 6 } 7 8 - impl ConditionalIfFalse{ 9 - pub fn new( node: Node ) -> Box<Self>{ 10 - dbg!(&node); 11 - 12 Box::new(Self { 13 - outputs: node.outputs.iter() 14 - .map(| x | { 15 - x.connections.iter().map(| x | { ( x.node.clone(), x.index, x.value_type ) }).collect() 16 - }).collect(), 17 - runtime_active: false 18 }) 19 } 20 } 21 22 - impl RuntimeNode for ConditionalIfFalse{ 23 - fn outputs( &self ) -> Vec<Vec<( String, isize, isize )>> { self.outputs.clone() } 24 - fn execute_dry( &mut self, _: &Vec<ParameterType> ) -> Option<Vec<ParameterType>> { Some(vec![]) } 25 26 - fn execute( &mut self ) -> Option<Vec<ParameterType>> { 27 - Some(vec![ ParameterType::Flow(!self.runtime_active), ParameterType::Flow(self.runtime_active) ]) 28 } 29 30 - fn update_arg( &mut self, _: usize, arg: ParameterType ) -> bool { 31 - if let ParameterType::Boolean(boolean) = arg{ 32 - if boolean{ 33 - self.runtime_active = true; 34 - true 35 - } else{ 36 - self.runtime_active = false; 37 - false 38 - } 39 - } else{ 40 - self.runtime_active = false; 41 - false 42 - } 43 } 44 45 - fn is_entrypoint( &self ) -> bool { false } 46 - }
··· 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 + }
+38 -33
src-tauri/src/runtime/nodes/conditional/iftrue.rs
··· 1 - use crate::{ runtime::nodes::RuntimeNode, structs::{ nodes::Node, parameter_types::ParameterType } }; 2 3 - pub struct ConditionalIfTrue{ 4 - outputs: Vec<Vec<( String, isize, isize )>>, 5 - runtime_active: bool 6 } 7 8 - impl ConditionalIfTrue{ 9 - pub fn new( node: Node ) -> Box<Self>{ 10 - dbg!(&node); 11 - 12 Box::new(Self { 13 - outputs: node.outputs.iter() 14 - .map(| x | { 15 - x.connections.iter().map(| x | { ( x.node.clone(), x.index, x.value_type ) }).collect() 16 - }).collect(), 17 - runtime_active: false 18 }) 19 } 20 } 21 22 - impl RuntimeNode for ConditionalIfTrue{ 23 - fn outputs( &self ) -> Vec<Vec<( String, isize, isize )>> { self.outputs.clone() } 24 - fn execute_dry( &mut self, _: &Vec<ParameterType> ) -> Option<Vec<ParameterType>> { Some(vec![]) } 25 26 - fn execute( &mut self ) -> Option<Vec<ParameterType>> { 27 - Some(vec![ ParameterType::Flow(self.runtime_active), ParameterType::Flow(!self.runtime_active) ]) 28 } 29 30 - fn update_arg( &mut self, _: usize, arg: ParameterType ) -> bool { 31 - if let ParameterType::Boolean(boolean) = arg{ 32 - if boolean{ 33 - self.runtime_active = true; 34 - true 35 - } else{ 36 - self.runtime_active = false; 37 - false 38 - } 39 - } else{ 40 - self.runtime_active = false; 41 - false 42 - } 43 } 44 45 - fn is_entrypoint( &self ) -> bool { false } 46 - }
··· 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 + }
+2 -2
src-tauri/src/runtime/nodes/conditional/mod.rs
··· 1 - pub mod iftrue; 2 pub mod iffalse; 3 - pub mod ifequal;
··· 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 ) -> 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 ) -> Option<Vec<ParameterType>> { 18 - dbg!(&self.to_log); 19 - self.to_log = None; 20 21 - None 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 + }
+49 -44
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: Option<String>, 6 - runtime_active: bool 7 - } 8 9 - impl OSCTrigger{ 10 - pub fn new( node: Node ) -> Box<Self>{ 11 - dbg!(&node); 12 13 let value = &node.statics[0].value; 14 15 Box::new(Self { 16 - address: if value.is_null(){ None } else { Some(value.as_str().unwrap().to_owned()) }, 17 - outputs: node.outputs.iter() 18 - .map(| x | { 19 - x.connections.iter().map(| x | { ( x.node.clone(), x.index, x.value_type ) }).collect() 20 - }).collect(), 21 - runtime_active: false 22 }) 23 } 24 } 25 26 - impl RuntimeNode for OSCTrigger{ 27 - fn outputs( &self ) -> Vec<Vec<( String, isize, isize )>> { 28 self.outputs.clone() 29 } 30 31 - fn execute_dry( &mut self, msg: &Vec<ParameterType> ) -> Option<Vec<ParameterType>> { 32 - if self.address.is_none(){ 33 - self.runtime_active = false; 34 - return None 35 - } 36 37 - if let ParameterType::String(address) = &msg[0]{ 38 - if *address == *self.address.as_ref().unwrap(){ 39 - self.runtime_active = true; 40 - Some(msg.clone()) 41 - // The first value is technically the address value, 42 - // but this value gets ignored as the first output of 43 - // the osctrigger node is a flow output which gets ignored 44 - // on dry runs. 45 } else{ 46 - self.runtime_active = false; 47 - None 48 } 49 } else{ 50 - self.runtime_active = false; 51 - None 52 - } 53 } 54 55 - fn execute( &mut self ) -> Option<Vec<ParameterType>> { 56 - let execute = self.runtime_active; 57 - self.runtime_active = false; 58 - 59 - Some(vec![ ParameterType::Flow(execute) ]) 60 } 61 - 62 - fn update_arg( &mut self, _: usize, _: ParameterType ) -> bool { false } 63 - fn is_entrypoint( &self ) -> bool { true } 64 - }
··· 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 + }
+44 -25
src-tauri/src/runtime/nodes/statics/float.rs
··· 1 - use crate::{ runtime::nodes::RuntimeNode, structs::{ nodes::Node, parameter_types::ParameterType } }; 2 3 - pub struct StaticFloat{ 4 - outputs: Vec<Vec<( String, isize, isize )>>, 5 - value: Option<f32> 6 } 7 8 - impl StaticFloat{ 9 - pub fn new( node: Node ) -> Box<Self>{ 10 - dbg!(&node); 11 - 12 let value = &node.statics[0].value; 13 14 Box::new(Self { 15 - value: if value.is_null(){ None } else { Some(value.as_f64().unwrap() as f32) }, 16 - outputs: node.outputs.iter() 17 - .map(| x | { 18 - x.connections.iter().map(| x | { ( x.node.clone(), x.index, x.value_type ) }).collect() 19 - }).collect(), 20 }) 21 } 22 } 23 24 - impl RuntimeNode for StaticFloat{ 25 - fn outputs( &self ) -> Vec<Vec<( String, isize, isize )>> { 26 self.outputs.clone() 27 } 28 29 - fn execute_dry( &mut self, _: &Vec<ParameterType> ) -> Option<Vec<ParameterType>> { 30 - if self.value.is_some(){ 31 - Some(vec![ ParameterType::Float(self.value.clone().unwrap()) ]) 32 - } else{ 33 - None 34 - } 35 } 36 37 - fn execute( &mut self ) -> Option<Vec<ParameterType>> { None } 38 39 - fn update_arg( &mut self, _: usize, _: ParameterType ) -> bool { false } 40 - fn is_entrypoint( &self ) -> bool { true } 41 - }
··· 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 + }
+44 -25
src-tauri/src/runtime/nodes/statics/int.rs
··· 1 - use crate::{ runtime::nodes::RuntimeNode, structs::{ nodes::Node, parameter_types::ParameterType } }; 2 3 - pub struct StaticInt{ 4 - outputs: Vec<Vec<( String, isize, isize )>>, 5 - value: Option<i32> 6 } 7 8 - impl StaticInt{ 9 - pub fn new( node: Node ) -> Box<Self>{ 10 - dbg!(&node); 11 - 12 let value = &node.statics[0].value; 13 14 Box::new(Self { 15 - value: if value.is_null(){ None } else { Some(value.as_i64().unwrap() as i32) }, 16 - outputs: node.outputs.iter() 17 - .map(| x | { 18 - x.connections.iter().map(| x | { ( x.node.clone(), x.index, x.value_type ) }).collect() 19 - }).collect(), 20 }) 21 } 22 } 23 24 - impl RuntimeNode for StaticInt{ 25 - fn outputs( &self ) -> Vec<Vec<( String, isize, isize )>> { 26 self.outputs.clone() 27 } 28 29 - fn execute_dry( &mut self, _: &Vec<ParameterType> ) -> Option<Vec<ParameterType>> { 30 - if self.value.is_some(){ 31 - Some(vec![ ParameterType::Int(self.value.clone().unwrap()) ]) 32 - } else{ 33 - None 34 - } 35 } 36 37 - fn execute( &mut self ) -> Option<Vec<ParameterType>> { None } 38 39 - fn update_arg( &mut self, _: usize, _: ParameterType ) -> bool { false } 40 - fn is_entrypoint( &self ) -> bool { true } 41 - }
··· 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 + }
+2 -2
src-tauri/src/runtime/nodes/statics/mod.rs
··· 1 - pub mod string; 2 pub mod int; 3 - pub mod float;
··· 1 + pub mod float; 2 pub mod int; 3 + pub mod string;
+44 -25
src-tauri/src/runtime/nodes/statics/string.rs
··· 1 - use crate::{ runtime::nodes::RuntimeNode, structs::{ nodes::Node, parameter_types::ParameterType } }; 2 3 - pub struct StaticString{ 4 - outputs: Vec<Vec<( String, isize, isize )>>, 5 - value: Option<String> 6 } 7 8 - impl StaticString{ 9 - pub fn new( node: Node ) -> Box<Self>{ 10 - dbg!(&node); 11 - 12 let value = &node.statics[0].value; 13 14 Box::new(Self { 15 - value: if value.is_null(){ None } else { Some(value.as_str().unwrap().to_owned()) }, 16 - outputs: node.outputs.iter() 17 - .map(| x | { 18 - x.connections.iter().map(| x | { ( x.node.clone(), x.index, x.value_type ) }).collect() 19 - }).collect(), 20 }) 21 } 22 } 23 24 - impl RuntimeNode for StaticString{ 25 - fn outputs( &self ) -> Vec<Vec<( String, isize, isize )>> { 26 self.outputs.clone() 27 } 28 29 - fn execute_dry( &mut self, _: &Vec<ParameterType> ) -> Option<Vec<ParameterType>> { 30 - if self.value.is_some(){ 31 - Some(vec![ ParameterType::String(self.value.clone().unwrap()) ]) 32 - } else{ 33 - None 34 - } 35 } 36 37 - fn execute( &mut self ) -> Option<Vec<ParameterType>> { None } 38 39 - fn update_arg( &mut self, _: usize, _: ParameterType ) -> bool { false } 40 - fn is_entrypoint( &self ) -> bool { true } 41 - }
··· 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 + }
+79 -26
src-tauri/src/runtime/nodes.rs
··· 1 - use std::collections::HashMap; 2 3 - use crate::{ runtime::nodes::{ conditional::{ ifequal::ConditionalIfEqual, iffalse::ConditionalIfFalse, iftrue::ConditionalIfTrue }, debug::Debug, osctrigger::OSCTrigger, statics::{ float::StaticFloat, int::StaticInt, string::StaticString } }, structs::{ nodes::Node, parameter_types::ParameterType } }; 4 5 mod osctrigger; 6 - mod debug; 7 mod statics; 8 - mod conditional; 9 10 - pub struct RuntimeNodeTree{ 11 - pub nodes: HashMap<String, Box<dyn RuntimeNode>> 12 } 13 14 - unsafe impl Send for RuntimeNodeTree{} 15 16 - impl RuntimeNodeTree{ 17 - pub fn from( tree: Vec<Node> ) -> Self{ 18 let mut runtime_nodes: HashMap<String, Box<dyn RuntimeNode>> = HashMap::new(); 19 - for node in tree{ 20 - match node.type_id.as_str(){ 21 - "osctrigger" => { runtime_nodes.insert(node.id.clone(), OSCTrigger::new(node)); } 22 23 - "staticstring" => { runtime_nodes.insert(node.id.clone(), StaticString::new(node)); } 24 - "staticint" => { runtime_nodes.insert(node.id.clone(), StaticInt::new(node)); } 25 - "staticfloat" => { runtime_nodes.insert(node.id.clone(), StaticFloat::new(node)); } 26 27 - "iftrue" => { runtime_nodes.insert(node.id.clone(), ConditionalIfTrue::new(node)); } 28 - "iffalse" => { runtime_nodes.insert(node.id.clone(), ConditionalIfFalse::new(node)); } 29 - "ifequal" => { runtime_nodes.insert(node.id.clone(), ConditionalIfEqual::new(node)); } 30 31 - "debug" => { runtime_nodes.insert(node.id.clone(), Debug::new(node)); } 32 _ => {} 33 } 34 } 35 36 - Self { nodes: runtime_nodes } 37 } 38 } 39 40 - pub trait RuntimeNode{ 41 - fn outputs( &self ) -> Vec<Vec<( String, isize, isize )>>; // Node ID, input index, output value type 42 - fn execute_dry( &mut self, msg: &Vec<ParameterType> ) -> Option<Vec<ParameterType>>; // Only update values on the first loop through 43 - fn execute( &mut self ) -> Option<Vec<ParameterType>>; // Then call functions on the second loop 44 - fn update_arg( &mut self, index: usize, value: ParameterType ) -> bool; 45 - fn is_entrypoint( &self ) -> bool; 46 }
··· 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 }
+65 -40
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: &mut RuntimeNodeTree ) -> Result<()>{ 11 - let node = tab.nodes.get_mut(&entry); 12 - if node.is_none(){ bail!("Cannot find node"); } 13 14 - let node = node.unwrap(); 15 16 - let output_map = node.outputs(); 17 - let args = node.execute_dry(parameters); 18 19 - if args.is_some(){ 20 - let args = args.unwrap(); 21 22 - for i in 0..args.len(){ 23 - let arg = &args[i]; 24 25 - for output in &output_map[i]{ 26 - if output.2 == 5{ break; } // Ignore flow outputs 27 28 - let next_node = tab.nodes.get_mut(&output.0); 29 - if next_node.is_none(){ bail!("Cannot find node {}", output.0) } 30 31 - let next_node = next_node.unwrap(); 32 - let can_update = next_node.update_arg(output.1 as usize, arg.clone()); 33 34 - if can_update{ 35 - runtime_dry(output.0.clone(), &vec![], tab)?; 36 } 37 } 38 } ··· 41 Ok(()) 42 } 43 44 - pub fn runtime( entry: String, tab: &mut RuntimeNodeTree ) -> Result<()>{ 45 let node = tab.nodes.get_mut(&entry); 46 - if node.is_none(){ bail!("Cannot find node"); } 47 48 let node = node.unwrap(); 49 50 - let next = node.execute(); 51 - if next.is_some(){ 52 - let next = next.unwrap(); 53 54 - let outputs = node.outputs(); 55 56 - for i in 0..next.len(){ 57 - let arg = &next[i]; 58 - if i >= outputs.len() { break; } 59 60 - for output in &outputs[i]{ 61 - if let ParameterType::Flow(next) = arg{ 62 - if *next{ 63 - // This is a flow output, continue 64 - runtime(output.0.clone(), tab)?; 65 - } 66 - } 67 } 68 } 69 } 70 71 - Ok(()) 72 - }
··· 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 - }
···
+73 -34
src-tauri/src/setup.rs
··· 1 - use std::{ collections::HashMap, fs::File, io::Read, sync::Mutex }; 2 - use crossbeam_channel::{ Receiver, bounded }; 3 4 use flate2::read::GzDecoder; 5 - use serde_json::{ Map, Value }; 6 - use tauri::{ App, Emitter, Listener, Manager, State }; 7 8 - use crate::{ osc::{ self, OSCMessage }, runtime::{ commands::RuntimeCommand, nodes::RuntimeNodeTree, runtime, runtime_dry }, structs::parameter_types::ParameterType, utils::config::Config }; 9 10 pub fn setup( 11 app: &mut App, 12 addresses: &'static Mutex<Vec<OSCMessage>>, 13 - mut runtime_command_receiver: Receiver<RuntimeCommand> 14 ) { 15 let window = app.get_webview_window("main").unwrap(); 16 17 let handle = window.clone(); 18 window.listen("tauri://drag-drop", move |ev| { ··· 33 handle.emit("load_new_tab", Value::Object(map)).unwrap(); 34 }); 35 36 - let ( sender, receiver ) = bounded(1024); 37 38 tokio::spawn(async move { 39 osc::start_server(sender, "127.0.0.1:9001"); 40 }); 41 42 - let ( runtime_sender, runtime_receiver ) = bounded(1024); 43 44 let runtime_sender_1 = runtime_sender.clone(); 45 tokio::spawn(async move { ··· 57 58 let msg = message.clone(); 59 let mut addrs = addresses.lock().unwrap(); 60 - if !addrs.contains(&msg) { addrs.push(msg); } 61 62 - runtime_sender.send(RuntimeCommand::OSCMessage(message)).unwrap(); 63 } 64 }); 65 66 tokio::spawn(async move { 67 let mut tabs: HashMap<String, RuntimeNodeTree> = HashMap::new(); 68 69 loop { 70 let cmd = runtime_receiver.recv().unwrap(); 71 72 - match cmd{ 73 - RuntimeCommand::OSCMessage( msg ) => { 74 - for ( _, mut tab ) in &mut tabs{ 75 - let keys: Vec<String> = tab.nodes.keys().map(| x | { x.clone() }).collect(); 76 77 - for id in keys.clone(){ 78 let entry = tab.nodes[&id].is_entrypoint(); 79 80 - if entry{ 81 - let args = vec![ 82 - vec![ ParameterType::String(msg.address.clone()) ], msg.values.clone() 83 - ].concat(); 84 85 - runtime_dry(id.clone(), &args, &mut tab).unwrap(); 86 - } 87 - } 88 - 89 - for id in keys{ 90 - let entry = tab.nodes[&id].is_entrypoint(); 91 - 92 - if entry{ 93 - let _ = runtime(id.clone(), &mut tab); 94 } 95 } 96 } 97 - }, 98 99 - RuntimeCommand::AddTab( graph, id ) => { 100 - tabs.insert(id, RuntimeNodeTree::from(graph)); 101 - }, 102 - RuntimeCommand::RemoveTab( id ) => { 103 tabs.remove(&id); 104 } 105 } 106 } 107 }); 108 - }
··· 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 { ··· 85 86 let msg = message.clone(); 87 let mut addrs = addresses.lock().unwrap(); 88 + if !addrs.contains(&msg) { 89 + addrs.push(msg); 90 + } 91 + 92 + if message.address == "/avatar/change".to_owned(){ 93 + *addrs = vrchat_builtin_parameters::get_read_addresses(); 94 + 95 + // TODO: Read avatar paramaters from file 96 + } 97 98 + runtime_sender 99 + .send(RuntimeCommand::OSCMessage(message)) 100 + .unwrap(); 101 } 102 }); 103 104 + // TODO: Run tabs in seperate threads (really not looking forward to this... thanks rust) 105 + 106 tokio::spawn(async move { 107 let mut tabs: HashMap<String, RuntimeNodeTree> = HashMap::new(); 108 109 + // #[cfg(target_os = "windows")] 110 + let enigo = Arc::new(Mutex::new(enigo::Enigo::new(&enigo::Settings::default()).unwrap())); 111 + 112 loop { 113 let cmd = runtime_receiver.recv().unwrap(); 114 115 + match cmd { 116 + RuntimeCommand::OSCMessage(msg) => { 117 + for (_, mut tab) in &mut tabs { 118 + let keys: Vec<String> = tab.nodes.keys().map(|x| x.clone()).collect(); 119 120 + for id in keys { 121 let entry = tab.nodes[&id].is_entrypoint(); 122 123 + if entry { 124 + let mut args = vec![ ParameterType::String(msg.address.clone())]; 125 + let mut values = msg.values.clone(); 126 127 + args.append(&mut values); 128 + let _ = recurse_runtime(id.clone(), &mut tab, args); 129 } 130 } 131 } 132 + } 133 134 + RuntimeCommand::AddTab(graph, id) => { 135 + // #[cfg(target_os = "windows")] 136 + tabs.insert(id, RuntimeNodeTree::from(graph, enigo.clone())); 137 + 138 + // #[cfg(target_os = "linux")] 139 + // tabs.insert(id, RuntimeNodeTree::from(graph)); 140 + } 141 + RuntimeCommand::RemoveTab(id) => { 142 tabs.remove(&id); 143 } 144 } 145 } 146 }); 147 + }
+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;
+13 -12
src-tauri/src/structs/nodes.rs
··· 1 - use serde::{ Deserialize, Serialize }; 2 use serde_json::Value; 3 4 #[derive(Serialize, Deserialize, Debug, Clone)] 5 - pub struct Node{ 6 pub id: String, 7 pub name: String, 8 - pub outputs: Vec<NodeOutput>, 9 - pub pos: [ f32; 2 ], 10 pub statics: Vec<NodeStatic>, 11 12 #[serde(rename = "typeId")] 13 - pub type_id: String 14 } 15 16 #[derive(Serialize, Deserialize, Debug, Clone)] 17 - pub struct NodeStatic{ 18 pub name: String, 19 20 #[serde(rename = "type")] 21 pub value_type: isize, 22 - pub value: Value 23 } 24 25 #[derive(Serialize, Deserialize, Debug, Clone)] 26 - pub struct NodeOutput{ 27 pub name: String, 28 29 #[serde(rename = "type")] 30 pub value_type: isize, 31 - pub connections: Vec<NodeOutputConnections> 32 } 33 34 #[derive(Serialize, Deserialize, Debug, Clone)] 35 - pub struct NodeOutputConnections{ 36 pub name: String, 37 pub node: String, 38 pub index: isize, 39 40 #[serde(rename = "type")] 41 - pub value_type: isize 42 - }
··· 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 + }
+53 -1
src-tauri/src/structs/parameter_types.rs
··· 1 use serde::Serialize; 2 3 #[derive(Serialize, Clone, Debug, PartialEq)] ··· 12 String(String), 13 Flow(bool), 14 15 - None 16 }
··· 1 + use anyhow::{bail, Result}; 2 use serde::Serialize; 3 4 #[derive(Serialize, Clone, Debug, PartialEq)] ··· 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 }
+28 -7
src-tauri/src/utils/config.rs
··· 1 - use std::{ collections::HashMap, fs::File, io::{ Read, Write }, path::PathBuf, sync::Mutex }; 2 3 - use flate2::{ read::GzDecoder, write::GzEncoder, Compression }; 4 - use serde::{ Deserialize, Serialize }; 5 6 use crate::structs::nodes::Node; 7 8 #[derive(Clone, Serialize, Deserialize, Debug)] 9 - pub struct ConfigValues{ 10 #[serde(default)] 11 - pub loaded_tabs: HashMap<String, ( Vec<Node>, String, Option<String> )> 12 } 13 14 pub struct Config { ··· 37 } 38 39 pub fn save(&self) { 40 - let dat = serde_json::to_string(&self.store.lock().unwrap().clone()).unwrap(); 41 - dbg!(&dat); 42 43 let file = File::create(&self.path).unwrap(); 44 let mut encoder = GzEncoder::new(file, Compression::default());
··· 1 + use std::{ 2 + collections::HashMap, 3 + fs::File, 4 + io::{Read, Write}, 5 + path::PathBuf, 6 + sync::{Mutex, MutexGuard}, 7 + }; 8 9 + use chrono::Utc; 10 + use flate2::{read::GzDecoder, write::GzEncoder, Compression}; 11 + use serde::{Deserialize, Serialize}; 12 13 use crate::structs::nodes::Node; 14 15 #[derive(Clone, Serialize, Deserialize, Debug)] 16 + pub struct ConfigValues { 17 + #[serde(default)] 18 + pub loaded_tabs: HashMap<String, (Vec<Node>, String, Option<String>, bool)>, 19 + 20 #[serde(default)] 21 + pub hide_editor_on_start: bool, 22 } 23 24 pub struct Config { ··· 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 //