this repo has no description

Compare changes

Choose any two refs to compare.

+5 -2
.gitignore
··· 1 1 node_modules 2 2 dist 3 - build 4 - target 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 12 }, 13 13 "license": "MIT", 14 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" 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" 20 22 }, 21 23 "devDependencies": { 22 - "@tauri-apps/cli": "^2", 24 + "@tauri-apps/cli": "^2.9.3", 23 25 "@types/animejs": "^3.1.13", 24 - "typescript": "~5.6.2", 25 - "vite": "^6.0.3", 26 - "vite-plugin-solid": "^2.11.0" 26 + "typescript": "~5.6.3", 27 + "vite": "^6.4.1", 28 + "vite-plugin-solid": "^2.11.10" 27 29 } 28 30 }
+477 -437
pnpm-lock.yaml
··· 9 9 .: 10 10 dependencies: 11 11 '@tauri-apps/api': 12 - specifier: ^2 13 - version: 2.7.0 12 + specifier: ^2.9.0 13 + version: 2.9.0 14 + '@tauri-apps/plugin-clipboard-manager': 15 + specifier: ~2 16 + version: 2.3.2 14 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': 15 24 specifier: ~2 16 - version: 2.4.0 17 - '@tauri-apps/plugin-opener': 18 - specifier: ^2 19 - version: 2.4.0 25 + version: 2.3.2 20 26 animejs: 21 - specifier: ^4.1.2 22 - version: 4.1.2 27 + specifier: ^4.2.2 28 + version: 4.2.2 23 29 solid-js: 24 - specifier: ^1.9.3 25 - version: 1.9.7 30 + specifier: ^1.9.10 31 + version: 1.9.10 26 32 devDependencies: 27 33 '@tauri-apps/cli': 28 - specifier: ^2 29 - version: 2.7.1 34 + specifier: ^2.9.3 35 + version: 2.9.3 30 36 '@types/animejs': 31 37 specifier: ^3.1.13 32 38 version: 3.1.13 33 39 typescript: 34 - specifier: ~5.6.2 40 + specifier: ~5.6.3 35 41 version: 5.6.3 36 42 vite: 37 - specifier: ^6.0.3 38 - version: 6.3.5 43 + specifier: ^6.4.1 44 + version: 6.4.1 39 45 vite-plugin-solid: 40 - specifier: ^2.11.0 41 - version: 2.11.8(solid-js@1.9.7)(vite@6.3.5) 46 + specifier: ^2.11.10 47 + version: 2.11.10(solid-js@1.9.10)(vite@6.4.1) 42 48 43 49 packages: 44 - 45 - '@ampproject/remapping@2.3.0': 46 - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 47 - engines: {node: '>=6.0.0'} 48 50 49 51 '@babel/code-frame@7.27.1': 50 52 resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 51 53 engines: {node: '>=6.9.0'} 52 54 53 - '@babel/compat-data@7.28.0': 54 - resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} 55 + '@babel/compat-data@7.28.5': 56 + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} 55 57 engines: {node: '>=6.9.0'} 56 58 57 - '@babel/core@7.28.0': 58 - resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} 59 + '@babel/core@7.28.5': 60 + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} 59 61 engines: {node: '>=6.9.0'} 60 62 61 - '@babel/generator@7.28.0': 62 - resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} 63 + '@babel/generator@7.28.5': 64 + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} 63 65 engines: {node: '>=6.9.0'} 64 66 65 67 '@babel/helper-compilation-targets@7.27.2': ··· 78 80 resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} 79 81 engines: {node: '>=6.9.0'} 80 82 81 - '@babel/helper-module-transforms@7.27.3': 82 - resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} 83 + '@babel/helper-module-transforms@7.28.3': 84 + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} 83 85 engines: {node: '>=6.9.0'} 84 86 peerDependencies: 85 87 '@babel/core': ^7.0.0 ··· 92 94 resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 93 95 engines: {node: '>=6.9.0'} 94 96 95 - '@babel/helper-validator-identifier@7.27.1': 96 - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 97 + '@babel/helper-validator-identifier@7.28.5': 98 + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} 97 99 engines: {node: '>=6.9.0'} 98 100 99 101 '@babel/helper-validator-option@7.27.1': 100 102 resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} 101 103 engines: {node: '>=6.9.0'} 102 104 103 - '@babel/helpers@7.28.2': 104 - resolution: {integrity: sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==} 105 + '@babel/helpers@7.28.4': 106 + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} 105 107 engines: {node: '>=6.9.0'} 106 108 107 - '@babel/parser@7.28.0': 108 - resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} 109 + '@babel/parser@7.28.5': 110 + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} 109 111 engines: {node: '>=6.0.0'} 110 112 hasBin: true 111 113 ··· 119 121 resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} 120 122 engines: {node: '>=6.9.0'} 121 123 122 - '@babel/traverse@7.28.0': 123 - resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} 124 + '@babel/traverse@7.28.5': 125 + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} 124 126 engines: {node: '>=6.9.0'} 125 127 126 - '@babel/types@7.28.2': 127 - resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} 128 + '@babel/types@7.28.5': 129 + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} 128 130 engines: {node: '>=6.9.0'} 129 131 130 - '@esbuild/aix-ppc64@0.25.8': 131 - resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} 132 + '@esbuild/aix-ppc64@0.25.12': 133 + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} 132 134 engines: {node: '>=18'} 133 135 cpu: [ppc64] 134 136 os: [aix] 135 137 136 - '@esbuild/android-arm64@0.25.8': 137 - resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} 138 + '@esbuild/android-arm64@0.25.12': 139 + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} 138 140 engines: {node: '>=18'} 139 141 cpu: [arm64] 140 142 os: [android] 141 143 142 - '@esbuild/android-arm@0.25.8': 143 - resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} 144 + '@esbuild/android-arm@0.25.12': 145 + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} 144 146 engines: {node: '>=18'} 145 147 cpu: [arm] 146 148 os: [android] 147 149 148 - '@esbuild/android-x64@0.25.8': 149 - resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} 150 + '@esbuild/android-x64@0.25.12': 151 + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} 150 152 engines: {node: '>=18'} 151 153 cpu: [x64] 152 154 os: [android] 153 155 154 - '@esbuild/darwin-arm64@0.25.8': 155 - resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} 156 + '@esbuild/darwin-arm64@0.25.12': 157 + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} 156 158 engines: {node: '>=18'} 157 159 cpu: [arm64] 158 160 os: [darwin] 159 161 160 - '@esbuild/darwin-x64@0.25.8': 161 - resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} 162 + '@esbuild/darwin-x64@0.25.12': 163 + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} 162 164 engines: {node: '>=18'} 163 165 cpu: [x64] 164 166 os: [darwin] 165 167 166 - '@esbuild/freebsd-arm64@0.25.8': 167 - resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} 168 + '@esbuild/freebsd-arm64@0.25.12': 169 + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} 168 170 engines: {node: '>=18'} 169 171 cpu: [arm64] 170 172 os: [freebsd] 171 173 172 - '@esbuild/freebsd-x64@0.25.8': 173 - resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} 174 + '@esbuild/freebsd-x64@0.25.12': 175 + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} 174 176 engines: {node: '>=18'} 175 177 cpu: [x64] 176 178 os: [freebsd] 177 179 178 - '@esbuild/linux-arm64@0.25.8': 179 - resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} 180 + '@esbuild/linux-arm64@0.25.12': 181 + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} 180 182 engines: {node: '>=18'} 181 183 cpu: [arm64] 182 184 os: [linux] 183 185 184 - '@esbuild/linux-arm@0.25.8': 185 - resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} 186 + '@esbuild/linux-arm@0.25.12': 187 + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} 186 188 engines: {node: '>=18'} 187 189 cpu: [arm] 188 190 os: [linux] 189 191 190 - '@esbuild/linux-ia32@0.25.8': 191 - resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} 192 + '@esbuild/linux-ia32@0.25.12': 193 + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} 192 194 engines: {node: '>=18'} 193 195 cpu: [ia32] 194 196 os: [linux] 195 197 196 - '@esbuild/linux-loong64@0.25.8': 197 - resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} 198 + '@esbuild/linux-loong64@0.25.12': 199 + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} 198 200 engines: {node: '>=18'} 199 201 cpu: [loong64] 200 202 os: [linux] 201 203 202 - '@esbuild/linux-mips64el@0.25.8': 203 - resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} 204 + '@esbuild/linux-mips64el@0.25.12': 205 + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} 204 206 engines: {node: '>=18'} 205 207 cpu: [mips64el] 206 208 os: [linux] 207 209 208 - '@esbuild/linux-ppc64@0.25.8': 209 - resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} 210 + '@esbuild/linux-ppc64@0.25.12': 211 + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} 210 212 engines: {node: '>=18'} 211 213 cpu: [ppc64] 212 214 os: [linux] 213 215 214 - '@esbuild/linux-riscv64@0.25.8': 215 - resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} 216 + '@esbuild/linux-riscv64@0.25.12': 217 + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} 216 218 engines: {node: '>=18'} 217 219 cpu: [riscv64] 218 220 os: [linux] 219 221 220 - '@esbuild/linux-s390x@0.25.8': 221 - resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} 222 + '@esbuild/linux-s390x@0.25.12': 223 + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} 222 224 engines: {node: '>=18'} 223 225 cpu: [s390x] 224 226 os: [linux] 225 227 226 - '@esbuild/linux-x64@0.25.8': 227 - resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} 228 + '@esbuild/linux-x64@0.25.12': 229 + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} 228 230 engines: {node: '>=18'} 229 231 cpu: [x64] 230 232 os: [linux] 231 233 232 - '@esbuild/netbsd-arm64@0.25.8': 233 - resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} 234 + '@esbuild/netbsd-arm64@0.25.12': 235 + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} 234 236 engines: {node: '>=18'} 235 237 cpu: [arm64] 236 238 os: [netbsd] 237 239 238 - '@esbuild/netbsd-x64@0.25.8': 239 - resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} 240 + '@esbuild/netbsd-x64@0.25.12': 241 + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} 240 242 engines: {node: '>=18'} 241 243 cpu: [x64] 242 244 os: [netbsd] 243 245 244 - '@esbuild/openbsd-arm64@0.25.8': 245 - resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} 246 + '@esbuild/openbsd-arm64@0.25.12': 247 + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} 246 248 engines: {node: '>=18'} 247 249 cpu: [arm64] 248 250 os: [openbsd] 249 251 250 - '@esbuild/openbsd-x64@0.25.8': 251 - resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} 252 + '@esbuild/openbsd-x64@0.25.12': 253 + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} 252 254 engines: {node: '>=18'} 253 255 cpu: [x64] 254 256 os: [openbsd] 255 257 256 - '@esbuild/openharmony-arm64@0.25.8': 257 - resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} 258 + '@esbuild/openharmony-arm64@0.25.12': 259 + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} 258 260 engines: {node: '>=18'} 259 261 cpu: [arm64] 260 262 os: [openharmony] 261 263 262 - '@esbuild/sunos-x64@0.25.8': 263 - resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} 264 + '@esbuild/sunos-x64@0.25.12': 265 + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} 264 266 engines: {node: '>=18'} 265 267 cpu: [x64] 266 268 os: [sunos] 267 269 268 - '@esbuild/win32-arm64@0.25.8': 269 - resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} 270 + '@esbuild/win32-arm64@0.25.12': 271 + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} 270 272 engines: {node: '>=18'} 271 273 cpu: [arm64] 272 274 os: [win32] 273 275 274 - '@esbuild/win32-ia32@0.25.8': 275 - resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} 276 + '@esbuild/win32-ia32@0.25.12': 277 + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} 276 278 engines: {node: '>=18'} 277 279 cpu: [ia32] 278 280 os: [win32] 279 281 280 - '@esbuild/win32-x64@0.25.8': 281 - resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} 282 + '@esbuild/win32-x64@0.25.12': 283 + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} 282 284 engines: {node: '>=18'} 283 285 cpu: [x64] 284 286 os: [win32] 285 287 286 - '@jridgewell/gen-mapping@0.3.12': 287 - resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} 288 + '@jridgewell/gen-mapping@0.3.13': 289 + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 290 + 291 + '@jridgewell/remapping@2.3.5': 292 + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} 288 293 289 294 '@jridgewell/resolve-uri@3.1.2': 290 295 resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 291 296 engines: {node: '>=6.0.0'} 292 297 293 - '@jridgewell/sourcemap-codec@1.5.4': 294 - resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} 298 + '@jridgewell/sourcemap-codec@1.5.5': 299 + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 295 300 296 - '@jridgewell/trace-mapping@0.3.29': 297 - resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} 301 + '@jridgewell/trace-mapping@0.3.31': 302 + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} 298 303 299 - '@rollup/rollup-android-arm-eabi@4.46.1': 300 - resolution: {integrity: sha512-oENme6QxtLCqjChRUUo3S6X8hjCXnWmJWnedD7VbGML5GUtaOtAyx+fEEXnBXVf0CBZApMQU0Idwi0FmyxzQhw==} 304 + '@rollup/rollup-android-arm-eabi@4.53.0': 305 + resolution: {integrity: sha512-MX3DD/o2W36nlgQb8KA5QtUw/bK5aR9YDzNmX1PRHZAa6LF/MQCWMN477CgBMg8gH1vEiEZsjWRIZeL/7ttUVA==} 301 306 cpu: [arm] 302 307 os: [android] 303 308 304 - '@rollup/rollup-android-arm64@4.46.1': 305 - resolution: {integrity: sha512-OikvNT3qYTl9+4qQ9Bpn6+XHM+ogtFadRLuT2EXiFQMiNkXFLQfNVppi5o28wvYdHL2s3fM0D/MZJ8UkNFZWsw==} 309 + '@rollup/rollup-android-arm64@4.53.0': 310 + resolution: {integrity: sha512-U4/R8ZvikDYLkl+hyAGP23SRHp3LwYSRy9SvJqsnva7TYLhVMy39RTVCYn1DdRNxXl1CyCQgE/mXKm9jaQT4ig==} 306 311 cpu: [arm64] 307 312 os: [android] 308 313 309 - '@rollup/rollup-darwin-arm64@4.46.1': 310 - resolution: {integrity: sha512-EFYNNGij2WllnzljQDQnlFTXzSJw87cpAs4TVBAWLdkvic5Uh5tISrIL6NRcxoh/b2EFBG/TK8hgRrGx94zD4A==} 314 + '@rollup/rollup-darwin-arm64@4.53.0': 315 + resolution: {integrity: sha512-nBG2BXRU3ifdK0HdqBKaT5VI6ScoIpABYZ+dWwQkIOYd8Suo4iykgPikjhsTd7NeHgJJ3OqlKYCcNkZtB1iLVQ==} 311 316 cpu: [arm64] 312 317 os: [darwin] 313 318 314 - '@rollup/rollup-darwin-x64@4.46.1': 315 - resolution: {integrity: sha512-ZaNH06O1KeTug9WI2+GRBE5Ujt9kZw4a1+OIwnBHal92I8PxSsl5KpsrPvthRynkhMck4XPdvY0z26Cym/b7oA==} 319 + '@rollup/rollup-darwin-x64@4.53.0': 320 + resolution: {integrity: sha512-QuZ5hYStB/vW7b8zQYtdIPpIfNNlUXtGk8zVTkoTMKzMhE2/6tVvcCWqdWqCVhx6eguJJjKjtZ9lAAG/D3yNeA==} 316 321 cpu: [x64] 317 322 os: [darwin] 318 323 319 - '@rollup/rollup-freebsd-arm64@4.46.1': 320 - resolution: {integrity: sha512-n4SLVebZP8uUlJ2r04+g2U/xFeiQlw09Me5UFqny8HGbARl503LNH5CqFTb5U5jNxTouhRjai6qPT0CR5c/Iig==} 324 + '@rollup/rollup-freebsd-arm64@4.53.0': 325 + resolution: {integrity: sha512-4yYPm1PJwK/HKI4FzElAPj2EAAFaaLUWzXV3S3edKy71JcEVzBCpgaXyEcDh3blBIjLml+aMkj6HEVGSuzpz+g==} 321 326 cpu: [arm64] 322 327 os: [freebsd] 323 328 324 - '@rollup/rollup-freebsd-x64@4.46.1': 325 - resolution: {integrity: sha512-8vu9c02F16heTqpvo3yeiu7Vi1REDEC/yES/dIfq3tSXe6mLndiwvYr3AAvd1tMNUqE9yeGYa5w7PRbI5QUV+w==} 329 + '@rollup/rollup-freebsd-x64@4.53.0': 330 + resolution: {integrity: sha512-1SvE5euwWV8JqFc4zEAqHbJbf2yJl00EoHVcnlFqLzjrIExYttLxfZeMDIXY6Yx+bskphrQakpChZKzE2JECEg==} 326 331 cpu: [x64] 327 332 os: [freebsd] 328 333 329 - '@rollup/rollup-linux-arm-gnueabihf@4.46.1': 330 - resolution: {integrity: sha512-K4ncpWl7sQuyp6rWiGUvb6Q18ba8mzM0rjWJ5JgYKlIXAau1db7hZnR0ldJvqKWWJDxqzSLwGUhA4jp+KqgDtQ==} 334 + '@rollup/rollup-linux-arm-gnueabihf@4.53.0': 335 + resolution: {integrity: sha512-9tS4QyfU5NF5CdUugEi7kWbcGD7pbu6Fm8SunuePH6beeQgtcRZ9K9KVwKHEgfBHeeyrr5OvfV1qWs7PMDOf5w==} 331 336 cpu: [arm] 332 337 os: [linux] 333 338 334 - '@rollup/rollup-linux-arm-musleabihf@4.46.1': 335 - resolution: {integrity: sha512-YykPnXsjUjmXE6j6k2QBBGAn1YsJUix7pYaPLK3RVE0bQL2jfdbfykPxfF8AgBlqtYbfEnYHmLXNa6QETjdOjQ==} 339 + '@rollup/rollup-linux-arm-musleabihf@4.53.0': 340 + resolution: {integrity: sha512-U+0ovxGU9bVJIHfW+oALpHd0ho1YDwhj0yHASDzIj+bOeo+VzEpNtHxcjhFab0YcHUorIMoqyxckC98+81oTJw==} 336 341 cpu: [arm] 337 342 os: [linux] 338 343 339 - '@rollup/rollup-linux-arm64-gnu@4.46.1': 340 - resolution: {integrity: sha512-kKvqBGbZ8i9pCGW3a1FH3HNIVg49dXXTsChGFsHGXQaVJPLA4f/O+XmTxfklhccxdF5FefUn2hvkoGJH0ScWOA==} 344 + '@rollup/rollup-linux-arm64-gnu@4.53.0': 345 + resolution: {integrity: sha512-Cp/TQ+wLjRTqTuiVwLz4XPZMo3ROl7EJYMF8HhMp8Uf+9kOOATB3/p4gGZPpuQ4BP7qEXG29ET24u9+F0ERYkQ==} 341 346 cpu: [arm64] 342 347 os: [linux] 343 348 344 - '@rollup/rollup-linux-arm64-musl@4.46.1': 345 - resolution: {integrity: sha512-zzX5nTw1N1plmqC9RGC9vZHFuiM7ZP7oSWQGqpbmfjK7p947D518cVK1/MQudsBdcD84t6k70WNczJOct6+hdg==} 349 + '@rollup/rollup-linux-arm64-musl@4.53.0': 350 + resolution: {integrity: sha512-SuGoAwhsSonrSTEZTiQOGC3+XZfq7rc/qAdAOBrYYIp8pu+Wh4EFFXl6+QYYNbNrHL3DnVoWACLwnfwlTa0neA==} 346 351 cpu: [arm64] 347 352 os: [linux] 348 353 349 - '@rollup/rollup-linux-loongarch64-gnu@4.46.1': 350 - resolution: {integrity: sha512-O8CwgSBo6ewPpktFfSDgB6SJN9XDcPSvuwxfejiddbIC/hn9Tg6Ai0f0eYDf3XvB/+PIWzOQL+7+TZoB8p9Yuw==} 354 + '@rollup/rollup-linux-loong64-gnu@4.53.0': 355 + resolution: {integrity: sha512-EOKej1x0WoePnJWfg7ZbnUqiuiQunshzsKZSIfTHFDiCY9pnsr3Weit1GjcpGnun7H5HuRREqkT2c9CcKxNwSg==} 351 356 cpu: [loong64] 352 357 os: [linux] 353 358 354 - '@rollup/rollup-linux-ppc64-gnu@4.46.1': 355 - resolution: {integrity: sha512-JnCfFVEKeq6G3h3z8e60kAp8Rd7QVnWCtPm7cxx+5OtP80g/3nmPtfdCXbVl063e3KsRnGSKDHUQMydmzc/wBA==} 359 + '@rollup/rollup-linux-ppc64-gnu@4.53.0': 360 + resolution: {integrity: sha512-YAvv2aMFlfiawJ97lutomuehG2Yowd4YgsAqI85XNiMK9eBA1vEMZHt3BShg8cUvak71BM+VFRHddqc+OrRdVA==} 356 361 cpu: [ppc64] 357 362 os: [linux] 358 363 359 - '@rollup/rollup-linux-riscv64-gnu@4.46.1': 360 - resolution: {integrity: sha512-dVxuDqS237eQXkbYzQQfdf/njgeNw6LZuVyEdUaWwRpKHhsLI+y4H/NJV8xJGU19vnOJCVwaBFgr936FHOnJsQ==} 364 + '@rollup/rollup-linux-riscv64-gnu@4.53.0': 365 + resolution: {integrity: sha512-DxZe/sMVaqN+s5kVk3Iq619Rgyl1JCTob7xOLSNC84mbzg3NYTSheqqrtVllYjLYo4wm9YyqjVS57miuzNyXbQ==} 361 366 cpu: [riscv64] 362 367 os: [linux] 363 368 364 - '@rollup/rollup-linux-riscv64-musl@4.46.1': 365 - resolution: {integrity: sha512-CvvgNl2hrZrTR9jXK1ye0Go0HQRT6ohQdDfWR47/KFKiLd5oN5T14jRdUVGF4tnsN8y9oSfMOqH6RuHh+ck8+w==} 369 + '@rollup/rollup-linux-riscv64-musl@4.53.0': 370 + resolution: {integrity: sha512-N7+iZ0jEhwLY1FEsjbCR9lAxIZP0k+3Cghx9vSQWn+rcW8SgN8VcCmwJDoPDaGKTzWWB791U1s79BSLnEhUa0Q==} 366 371 cpu: [riscv64] 367 372 os: [linux] 368 373 369 - '@rollup/rollup-linux-s390x-gnu@4.46.1': 370 - resolution: {integrity: sha512-x7ANt2VOg2565oGHJ6rIuuAon+A8sfe1IeUx25IKqi49OjSr/K3awoNqr9gCwGEJo9OuXlOn+H2p1VJKx1psxA==} 374 + '@rollup/rollup-linux-s390x-gnu@4.53.0': 375 + resolution: {integrity: sha512-MA/NVneZyIskjvXdh2NR9YcPi7eHWBlQOWP2X8OymzyeUEB0JfUpmbKQZngHmOlyleV2IoR5nHIgMSRjLskOnA==} 371 376 cpu: [s390x] 372 377 os: [linux] 373 378 374 - '@rollup/rollup-linux-x64-gnu@4.46.1': 375 - resolution: {integrity: sha512-9OADZYryz/7E8/qt0vnaHQgmia2Y0wrjSSn1V/uL+zw/i7NUhxbX4cHXdEQ7dnJgzYDS81d8+tf6nbIdRFZQoQ==} 379 + '@rollup/rollup-linux-x64-gnu@4.53.0': 380 + resolution: {integrity: sha512-iYEYzYpfaSCkunVD0LOYrD9OMc357be7+rBuCxW1qvsjCGl+95iWnYAFfyEoxAm6koasNN3tFxFYze5MKl5S3A==} 376 381 cpu: [x64] 377 382 os: [linux] 378 383 379 - '@rollup/rollup-linux-x64-musl@4.46.1': 380 - resolution: {integrity: sha512-NuvSCbXEKY+NGWHyivzbjSVJi68Xfq1VnIvGmsuXs6TCtveeoDRKutI5vf2ntmNnVq64Q4zInet0UDQ+yMB6tA==} 384 + '@rollup/rollup-linux-x64-musl@4.53.0': 385 + resolution: {integrity: sha512-FoRekOqhRUKbJMsB5LvhQchDeFeNlS6UGUwi0p3860sxE4zE+lp07FnkuR+yQH0rSn6iLXsnr44jnorgl8mGlQ==} 381 386 cpu: [x64] 382 387 os: [linux] 383 388 384 - '@rollup/rollup-win32-arm64-msvc@4.46.1': 385 - resolution: {integrity: sha512-mWz+6FSRb82xuUMMV1X3NGiaPFqbLN9aIueHleTZCc46cJvwTlvIh7reQLk4p97dv0nddyewBhwzryBHH7wtPw==} 389 + '@rollup/rollup-openharmony-arm64@4.53.0': 390 + resolution: {integrity: sha512-mEN2k1zKO5PUzW8W15hKpLh+zZI2by1onX2GfI93OekGbKN5aTjWGo7yAjwRZLjhAgs2UQcXmEWbIw0R5B4RnQ==} 391 + cpu: [arm64] 392 + os: [openharmony] 393 + 394 + '@rollup/rollup-win32-arm64-msvc@4.53.0': 395 + resolution: {integrity: sha512-V1dEKUXqevG0wxo6ysGrL7g2T6tndmo6Uqw5vzOqCXv+DHc8m0RRgcCm+96iigDniwpvV6o4HZtkRUnuTz9XiA==} 386 396 cpu: [arm64] 387 397 os: [win32] 388 398 389 - '@rollup/rollup-win32-ia32-msvc@4.46.1': 390 - resolution: {integrity: sha512-7Thzy9TMXDw9AU4f4vsLNBxh7/VOKuXi73VH3d/kHGr0tZ3x/ewgL9uC7ojUKmH1/zvmZe2tLapYcZllk3SO8Q==} 399 + '@rollup/rollup-win32-ia32-msvc@4.53.0': 400 + resolution: {integrity: sha512-93mJ8Hm9+vbhtu+A1VtmwptSqCYojtMQkBGDjLytCWC8muxmZLGo/MA/4CMAWf6+QpKlxTTMDAHdTC+kxn9ZcQ==} 391 401 cpu: [ia32] 392 402 os: [win32] 393 403 394 - '@rollup/rollup-win32-x64-msvc@4.46.1': 395 - resolution: {integrity: sha512-7GVB4luhFmGUNXXJhH2jJwZCFB3pIOixv2E3s17GQHBFUOQaISlt7aGcQgqvCaDSxTZJUzlK/QJ1FN8S94MrzQ==} 404 + '@rollup/rollup-win32-x64-gnu@4.53.0': 405 + resolution: {integrity: sha512-1OrYs0p/deXEFLUW1gvyjIabmsJKY3I/9fCUA1K6demaNc4iEhXDW6RnyPv/BWqb7NRmQ9+i+SKoi1HgJxWcwg==} 396 406 cpu: [x64] 397 407 os: [win32] 398 408 399 - '@tauri-apps/api@2.7.0': 400 - resolution: {integrity: sha512-v7fVE8jqBl8xJFOcBafDzXFc8FnicoH3j8o8DNNs0tHuEBmXUDqrCOAzMRX0UkfpwqZLqvrvK0GNQ45DfnoVDg==} 409 + '@rollup/rollup-win32-x64-msvc@4.53.0': 410 + resolution: {integrity: sha512-xtSei8paPcLy3GzeeOjoRrllJn6EN8PB+/bXnhZ4R0AaviJsRwtKxFZRVnfFXNZTTp0nLeDo+BcEuIfdZS14/A==} 411 + cpu: [x64] 412 + os: [win32] 401 413 402 - '@tauri-apps/api@2.8.0': 403 - resolution: {integrity: sha512-ga7zdhbS2GXOMTIZRT0mYjKJtR9fivsXzsyq5U3vjDL0s6DTMwYRm0UHNjzTY5dh4+LSC68Sm/7WEiimbQNYlw==} 414 + '@tauri-apps/api@2.9.0': 415 + resolution: {integrity: sha512-qD5tMjh7utwBk9/5PrTA/aGr3i5QaJ/Mlt7p8NilQ45WgbifUNPyKWsA63iQ8YfQq6R8ajMapU+/Q8nMcPRLNw==} 404 416 405 - '@tauri-apps/cli-darwin-arm64@2.7.1': 406 - resolution: {integrity: sha512-j2NXQN6+08G03xYiyKDKqbCV2Txt+hUKg0a8hYr92AmoCU8fgCjHyva/p16lGFGUG3P2Yu0xiNe1hXL9ZuRMzA==} 417 + '@tauri-apps/cli-darwin-arm64@2.9.3': 418 + resolution: {integrity: sha512-W8FQXZXQmQ0Fmj9UJXNrm2mLdIaLLriKVY7o/FzmizyIKTPIvHjfZALTNybbpTQRbJvKoGHLrW1DNzAWVDWJYg==} 407 419 engines: {node: '>= 10'} 408 420 cpu: [arm64] 409 421 os: [darwin] 410 422 411 - '@tauri-apps/cli-darwin-x64@2.7.1': 412 - resolution: {integrity: sha512-CdYAefeM35zKsc91qIyKzbaO7FhzTyWKsE8hj7tEJ1INYpoh1NeNNyL/NSEA3Nebi5ilugioJ5tRK8ZXG8y3gw==} 423 + '@tauri-apps/cli-darwin-x64@2.9.3': 424 + resolution: {integrity: sha512-zDwu40rlshijt3TU6aRvzPUyVpapsx1sNfOlreDMTaMelQLHl6YoQzSRpLHYwrHrhimxyX2uDqnKIiuGel0Lhg==} 413 425 engines: {node: '>= 10'} 414 426 cpu: [x64] 415 427 os: [darwin] 416 428 417 - '@tauri-apps/cli-linux-arm-gnueabihf@2.7.1': 418 - resolution: {integrity: sha512-dnvyJrTA1UJxJjQ8q1N/gWomjP8Twij1BUQu2fdcT3OPpqlrbOk5R1yT0oD/721xoKNjroB5BXCsmmlykllxNg==} 429 + '@tauri-apps/cli-linux-arm-gnueabihf@2.9.3': 430 + resolution: {integrity: sha512-+Oc2OfcTRwYtW93VJqd/HOk77buORwC9IToj/qsEvM7bTMq6Kda4alpZprzwrCHYANSw+zD8PgjJdljTpe4p+g==} 419 431 engines: {node: '>= 10'} 420 432 cpu: [arm] 421 433 os: [linux] 422 434 423 - '@tauri-apps/cli-linux-arm64-gnu@2.7.1': 424 - resolution: {integrity: sha512-FtBW6LJPNRTws3qyUc294AqCWU91l/H0SsFKq6q4Q45MSS4x6wxLxou8zB53tLDGEPx3JSoPLcDaSfPlSbyujQ==} 435 + '@tauri-apps/cli-linux-arm64-gnu@2.9.3': 436 + resolution: {integrity: sha512-59GqU/J1n9wFyAtleoQOaU0oVIo+kwQynEw4meFDoKRXszKGor6lTsbsS3r0QKLSPbc0o/yYGJhqqCtkYjb/eg==} 425 437 engines: {node: '>= 10'} 426 438 cpu: [arm64] 427 439 os: [linux] 428 440 429 - '@tauri-apps/cli-linux-arm64-musl@2.7.1': 430 - resolution: {integrity: sha512-/HXY0t4FHkpFzjeYS5c16mlA6z0kzn5uKLWptTLTdFSnYpr8FCnOP4Sdkvm2TDQPF2ERxXtNCd+WR/jQugbGnA==} 441 + '@tauri-apps/cli-linux-arm64-musl@2.9.3': 442 + resolution: {integrity: sha512-fzvG+jEn5/iYGNH6Z2IRMheYFC4pJdXa19BR9fFm6Bdn2cuajRLDKdUcEME/DCtwqclphXtFZTrT4oezY5vI/A==} 431 443 engines: {node: '>= 10'} 432 444 cpu: [arm64] 433 445 os: [linux] 434 446 435 - '@tauri-apps/cli-linux-riscv64-gnu@2.7.1': 436 - resolution: {integrity: sha512-GeW5lVI2GhhnaYckiDzstG2j2Jwlud5d2XefRGwlOK+C/bVGLT1le8MNPYK8wgRlpeK8fG1WnJJYD6Ke7YQ8bg==} 447 + '@tauri-apps/cli-linux-riscv64-gnu@2.9.3': 448 + resolution: {integrity: sha512-qV8DZXI/fZwawk6T3Th1g6smiNC2KeQTk7XFgKvqZ6btC01z3UTsQmNGvI602zwm3Ld1TBZb4+rEWu2QmQimmw==} 437 449 engines: {node: '>= 10'} 438 450 cpu: [riscv64] 439 451 os: [linux] 440 452 441 - '@tauri-apps/cli-linux-x64-gnu@2.7.1': 442 - resolution: {integrity: sha512-DprxKQkPxIPYwUgg+cscpv2lcIUhn2nxEPlk0UeaiV9vATxCXyytxr1gLcj3xgjGyNPlM0MlJyYaPy1JmRg1cA==} 453 + '@tauri-apps/cli-linux-x64-gnu@2.9.3': 454 + resolution: {integrity: sha512-tquyEONCNRfqEBWEe4eAHnxFN5yY5lFkCuD4w79XLIovUxVftQ684+xLp7zkhntkt4y20SMj2AgJa/+MOlx4Kg==} 443 455 engines: {node: '>= 10'} 444 456 cpu: [x64] 445 457 os: [linux] 446 458 447 - '@tauri-apps/cli-linux-x64-musl@2.7.1': 448 - resolution: {integrity: sha512-KLlq3kOK7OUyDR757c0zQjPULpGZpLhNB0lZmZpHXvoOUcqZoCXJHh4dT/mryWZJp5ilrem5l8o9ngrDo0X1AA==} 459 + '@tauri-apps/cli-linux-x64-musl@2.9.3': 460 + resolution: {integrity: sha512-v2cBIB/6ji8DL+aiL5QUykU3ZO8OoJGyx50/qv2HQVzkf85KdaYSis3D/oVRemN/pcDz+vyCnnL3XnzFnDl4JQ==} 449 461 engines: {node: '>= 10'} 450 462 cpu: [x64] 451 463 os: [linux] 452 464 453 - '@tauri-apps/cli-win32-arm64-msvc@2.7.1': 454 - resolution: {integrity: sha512-dH7KUjKkSypCeWPiainHyXoES3obS+JIZVoSwSZfKq2gWgs48FY3oT0hQNYrWveE+VR4VoR3b/F3CPGbgFvksA==} 465 + '@tauri-apps/cli-win32-arm64-msvc@2.9.3': 466 + resolution: {integrity: sha512-ZGvBy7nvrHPbE0HeKp/ioaiw8bNgAHxWnb7JRZ4/G0A+oFj0SeSFxl9k5uU6FKnM7bHM23Gd1oeaDex9g5Fceg==} 455 467 engines: {node: '>= 10'} 456 468 cpu: [arm64] 457 469 os: [win32] 458 470 459 - '@tauri-apps/cli-win32-ia32-msvc@2.7.1': 460 - resolution: {integrity: sha512-1oeibfyWQPVcijOrTg709qhbXArjX3x1MPjrmA5anlygwrbByxLBcLXvotcOeULFcnH2FYUMMLLant8kgvwE5A==} 471 + '@tauri-apps/cli-win32-ia32-msvc@2.9.3': 472 + resolution: {integrity: sha512-UsgIwOnpCoY9NK9/65QiwgmWVIE80LE7SwRYVblGtmlY9RYfsYvpbItwsovA/AcHMTiO+OCvS/q9yLeqS3m6Sg==} 461 473 engines: {node: '>= 10'} 462 474 cpu: [ia32] 463 475 os: [win32] 464 476 465 - '@tauri-apps/cli-win32-x64-msvc@2.7.1': 466 - resolution: {integrity: sha512-D7Q9kDObutuirCNLxYQ7KAg2Xxg99AjcdYz/KuMw5HvyEPbkC9Q7JL0vOrQOrHEHxIQ2lYzFOZvKKoC2yyqXcg==} 477 + '@tauri-apps/cli-win32-x64-msvc@2.9.3': 478 + resolution: {integrity: sha512-fmw7NrrHE5m49idCvJAx9T9bsupjdJ0a3p3DPCNCZRGANU6R1tA1L+KTlVuUtdAldX2NqU/9UPo2SCslYKgJHQ==} 467 479 engines: {node: '>= 10'} 468 480 cpu: [x64] 469 481 os: [win32] 470 482 471 - '@tauri-apps/cli@2.7.1': 472 - resolution: {integrity: sha512-RcGWR4jOUEl92w3uvI0h61Llkfj9lwGD1iwvDRD2isMrDhOzjeeeVn9aGzeW1jubQ/kAbMYfydcA4BA0Cy733Q==} 483 + '@tauri-apps/cli@2.9.3': 484 + resolution: {integrity: sha512-BQ7iLUXTQcyG1PpzLWeVSmBCedYDpnA/6Cm/kRFGtqjTf/eVUlyYO5S2ee07tLum3nWwDBWTGFZeruO8yEukfA==} 473 485 engines: {node: '>= 10'} 474 486 hasBin: true 475 487 476 - '@tauri-apps/plugin-dialog@2.4.0': 477 - resolution: {integrity: sha512-OvXkrEBfWwtd8tzVCEXIvRfNEX87qs2jv6SqmVPiHcJjBhSF/GUvjqUNIDmKByb5N8nvDqVUM7+g1sXwdC/S9w==} 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==} 478 496 479 - '@tauri-apps/plugin-opener@2.4.0': 480 - resolution: {integrity: sha512-43VyN8JJtvKWJY72WI/KNZszTpDpzHULFxQs0CJBIYUdCRowQ6Q1feWTDb979N7nldqSuDOaBupZ6wz2nvuWwQ==} 497 + '@tauri-apps/plugin-os@2.3.2': 498 + resolution: {integrity: sha512-n+nXWeuSeF9wcEsSPmRnBEGrRgOy6jjkSU+UVCOV8YUGKb2erhDOxis7IqRXiRVHhY8XMKks00BJ0OAdkpf6+A==} 481 499 482 500 '@types/animejs@3.1.13': 483 501 resolution: {integrity: sha512-yWg9l1z7CAv/TKpty4/vupEh24jDGUZXv4r26StRkpUPQm04ztJaftgpto8vwdFs8SiTq6XfaPKCSI+wjzNMvQ==} ··· 491 509 '@types/babel__template@7.4.4': 492 510 resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 493 511 494 - '@types/babel__traverse@7.20.7': 495 - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} 512 + '@types/babel__traverse@7.28.0': 513 + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} 496 514 497 515 '@types/estree@1.0.8': 498 516 resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 499 517 500 - animejs@4.1.2: 501 - resolution: {integrity: sha512-QojQzHzN4ZCOGk4Seir5CWPHGKFPpMAsen3KEj/BHsIKDceH0xKd3FBWflyKiNefKG2fn3+ofpY9jD/UXhpY6A==} 518 + animejs@4.2.2: 519 + resolution: {integrity: sha512-Ys3RuvLdAeI14fsdKCQy7ytu4057QX6Bb7m4jwmfd6iKmUmLquTwk1ut0e4NtRQgCeq/s2Lv5+oMBjz6c7ZuIg==} 502 520 503 - babel-plugin-jsx-dom-expressions@0.39.8: 504 - resolution: {integrity: sha512-/MVOIIjonylDXnrWmG23ZX82m9mtKATsVHB7zYlPfDR9Vdd/NBE48if+wv27bSkBtyO7EPMUlcUc4J63QwuACQ==} 521 + babel-plugin-jsx-dom-expressions@0.40.3: 522 + resolution: {integrity: sha512-5HOwwt0BYiv/zxl7j8Pf2bGL6rDXfV6nUhLs8ygBX+EFJXzBPHM/euj9j/6deMZ6wa52Wb2PBaAV5U/jKwIY1w==} 505 523 peerDependencies: 506 524 '@babel/core': ^7.20.12 507 525 508 - babel-preset-solid@1.9.6: 509 - resolution: {integrity: sha512-HXTK9f93QxoH8dYn1M2mJdOlWgMsR88Lg/ul6QCZGkNTktjTE5HAf93YxQumHoCudLEtZrU1cFCMFOVho6GqFg==} 526 + babel-preset-solid@1.9.10: 527 + resolution: {integrity: sha512-HCelrgua/Y+kqO8RyL04JBWS/cVdrtUv/h45GntgQY+cJl4eBcKkCDV3TdMjtKx1nXwRaR9QXslM/Npm1dxdZQ==} 510 528 peerDependencies: 511 529 '@babel/core': ^7.0.0 530 + solid-js: ^1.9.10 531 + peerDependenciesMeta: 532 + solid-js: 533 + optional: true 512 534 513 - browserslist@4.25.1: 514 - resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} 535 + baseline-browser-mapping@2.8.25: 536 + resolution: {integrity: sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==} 537 + hasBin: true 538 + 539 + browserslist@4.27.0: 540 + resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==} 515 541 engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 516 542 hasBin: true 517 543 518 - caniuse-lite@1.0.30001731: 519 - resolution: {integrity: sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==} 544 + caniuse-lite@1.0.30001754: 545 + resolution: {integrity: sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==} 520 546 521 547 convert-source-map@2.0.0: 522 548 resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} ··· 524 550 csstype@3.1.3: 525 551 resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 526 552 527 - debug@4.4.1: 528 - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 553 + debug@4.4.3: 554 + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 529 555 engines: {node: '>=6.0'} 530 556 peerDependencies: 531 557 supports-color: '*' ··· 533 559 supports-color: 534 560 optional: true 535 561 536 - electron-to-chromium@1.5.192: 537 - resolution: {integrity: sha512-rP8Ez0w7UNw/9j5eSXCe10o1g/8B1P5SM90PCCMVkIRQn2R0LEHWz4Eh9RnxkniuDe1W0cTSOB3MLlkTGDcuCg==} 562 + electron-to-chromium@1.5.248: 563 + resolution: {integrity: sha512-zsur2yunphlyAO4gIubdJEXCK6KOVvtpiuDfCIqbM9FjcnMYiyn0ICa3hWfPr0nc41zcLWobgy1iL7VvoOyA2Q==} 538 564 539 565 entities@6.0.1: 540 566 resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} 541 567 engines: {node: '>=0.12'} 542 568 543 - esbuild@0.25.8: 544 - resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} 569 + esbuild@0.25.12: 570 + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} 545 571 engines: {node: '>=18'} 546 572 hasBin: true 547 573 ··· 549 575 resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 550 576 engines: {node: '>=6'} 551 577 552 - fdir@6.4.6: 553 - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} 578 + fdir@6.5.0: 579 + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 580 + engines: {node: '>=12.0.0'} 554 581 peerDependencies: 555 582 picomatch: ^3 || ^4 556 583 peerDependenciesMeta: ··· 601 628 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 602 629 hasBin: true 603 630 604 - node-releases@2.0.19: 605 - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 631 + node-releases@2.0.27: 632 + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} 606 633 607 634 parse5@7.3.0: 608 635 resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} ··· 618 645 resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 619 646 engines: {node: ^10 || ^12 || >=14} 620 647 621 - rollup@4.46.1: 622 - resolution: {integrity: sha512-33xGNBsDJAkzt0PvninskHlWnTIPgDtTwhg0U38CUoNP/7H6wI2Cz6dUeoNPbjdTdsYTGuiFFASuUOWovH0SyQ==} 648 + rollup@4.53.0: 649 + resolution: {integrity: sha512-43Z5T+4YTdfYkkA6CStU2DUYh7Ha9dLtvK+K3n0yEE/QS+4i28vSxrQsM59KqpvmT4tbOwJsFnRGMj/tvmQwWw==} 623 650 engines: {node: '>=18.0.0', npm: '>=8.0.0'} 624 651 hasBin: true 625 652 ··· 627 654 resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 628 655 hasBin: true 629 656 630 - seroval-plugins@1.3.2: 631 - resolution: {integrity: sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==} 657 + seroval-plugins@1.3.3: 658 + resolution: {integrity: sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==} 632 659 engines: {node: '>=10'} 633 660 peerDependencies: 634 661 seroval: ^1.0 ··· 637 664 resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} 638 665 engines: {node: '>=10'} 639 666 640 - solid-js@1.9.7: 641 - resolution: {integrity: sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw==} 667 + solid-js@1.9.10: 668 + resolution: {integrity: sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew==} 642 669 643 670 solid-refresh@0.6.3: 644 671 resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} ··· 649 676 resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 650 677 engines: {node: '>=0.10.0'} 651 678 652 - tinyglobby@0.2.14: 653 - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} 679 + tinyglobby@0.2.15: 680 + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 654 681 engines: {node: '>=12.0.0'} 655 682 656 683 typescript@5.6.3: ··· 658 685 engines: {node: '>=14.17'} 659 686 hasBin: true 660 687 661 - update-browserslist-db@1.1.3: 662 - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 688 + update-browserslist-db@1.1.4: 689 + resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} 663 690 hasBin: true 664 691 peerDependencies: 665 692 browserslist: '>= 4.21.0' 666 693 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==} 694 + vite-plugin-solid@2.11.10: 695 + resolution: {integrity: sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw==} 672 696 peerDependencies: 673 697 '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* 674 698 solid-js: ^1.7.2 ··· 677 701 '@testing-library/jest-dom': 678 702 optional: true 679 703 680 - vite@6.3.5: 681 - resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} 704 + vite@6.4.1: 705 + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} 682 706 engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 683 707 hasBin: true 684 708 peerDependencies: ··· 730 754 731 755 snapshots: 732 756 733 - '@ampproject/remapping@2.3.0': 734 - dependencies: 735 - '@jridgewell/gen-mapping': 0.3.12 736 - '@jridgewell/trace-mapping': 0.3.29 737 - 738 757 '@babel/code-frame@7.27.1': 739 758 dependencies: 740 - '@babel/helper-validator-identifier': 7.27.1 759 + '@babel/helper-validator-identifier': 7.28.5 741 760 js-tokens: 4.0.0 742 761 picocolors: 1.1.1 743 762 744 - '@babel/compat-data@7.28.0': {} 763 + '@babel/compat-data@7.28.5': {} 745 764 746 - '@babel/core@7.28.0': 765 + '@babel/core@7.28.5': 747 766 dependencies: 748 - '@ampproject/remapping': 2.3.0 749 767 '@babel/code-frame': 7.27.1 750 - '@babel/generator': 7.28.0 768 + '@babel/generator': 7.28.5 751 769 '@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 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 755 773 '@babel/template': 7.27.2 756 - '@babel/traverse': 7.28.0 757 - '@babel/types': 7.28.2 774 + '@babel/traverse': 7.28.5 775 + '@babel/types': 7.28.5 776 + '@jridgewell/remapping': 2.3.5 758 777 convert-source-map: 2.0.0 759 - debug: 4.4.1 778 + debug: 4.4.3 760 779 gensync: 1.0.0-beta.2 761 780 json5: 2.2.3 762 781 semver: 6.3.1 763 782 transitivePeerDependencies: 764 783 - supports-color 765 784 766 - '@babel/generator@7.28.0': 785 + '@babel/generator@7.28.5': 767 786 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 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 772 791 jsesc: 3.1.0 773 792 774 793 '@babel/helper-compilation-targets@7.27.2': 775 794 dependencies: 776 - '@babel/compat-data': 7.28.0 795 + '@babel/compat-data': 7.28.5 777 796 '@babel/helper-validator-option': 7.27.1 778 - browserslist: 4.25.1 797 + browserslist: 4.27.0 779 798 lru-cache: 5.1.1 780 799 semver: 6.3.1 781 800 ··· 783 802 784 803 '@babel/helper-module-imports@7.18.6': 785 804 dependencies: 786 - '@babel/types': 7.28.2 805 + '@babel/types': 7.28.5 787 806 788 807 '@babel/helper-module-imports@7.27.1': 789 808 dependencies: 790 - '@babel/traverse': 7.28.0 791 - '@babel/types': 7.28.2 809 + '@babel/traverse': 7.28.5 810 + '@babel/types': 7.28.5 792 811 transitivePeerDependencies: 793 812 - supports-color 794 813 795 - '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': 814 + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': 796 815 dependencies: 797 - '@babel/core': 7.28.0 816 + '@babel/core': 7.28.5 798 817 '@babel/helper-module-imports': 7.27.1 799 - '@babel/helper-validator-identifier': 7.27.1 800 - '@babel/traverse': 7.28.0 818 + '@babel/helper-validator-identifier': 7.28.5 819 + '@babel/traverse': 7.28.5 801 820 transitivePeerDependencies: 802 821 - supports-color 803 822 ··· 805 824 806 825 '@babel/helper-string-parser@7.27.1': {} 807 826 808 - '@babel/helper-validator-identifier@7.27.1': {} 827 + '@babel/helper-validator-identifier@7.28.5': {} 809 828 810 829 '@babel/helper-validator-option@7.27.1': {} 811 830 812 - '@babel/helpers@7.28.2': 831 + '@babel/helpers@7.28.4': 813 832 dependencies: 814 833 '@babel/template': 7.27.2 815 - '@babel/types': 7.28.2 834 + '@babel/types': 7.28.5 816 835 817 - '@babel/parser@7.28.0': 836 + '@babel/parser@7.28.5': 818 837 dependencies: 819 - '@babel/types': 7.28.2 838 + '@babel/types': 7.28.5 820 839 821 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': 840 + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)': 822 841 dependencies: 823 - '@babel/core': 7.28.0 842 + '@babel/core': 7.28.5 824 843 '@babel/helper-plugin-utils': 7.27.1 825 844 826 845 '@babel/template@7.27.2': 827 846 dependencies: 828 847 '@babel/code-frame': 7.27.1 829 - '@babel/parser': 7.28.0 830 - '@babel/types': 7.28.2 848 + '@babel/parser': 7.28.5 849 + '@babel/types': 7.28.5 831 850 832 - '@babel/traverse@7.28.0': 851 + '@babel/traverse@7.28.5': 833 852 dependencies: 834 853 '@babel/code-frame': 7.27.1 835 - '@babel/generator': 7.28.0 854 + '@babel/generator': 7.28.5 836 855 '@babel/helper-globals': 7.28.0 837 - '@babel/parser': 7.28.0 856 + '@babel/parser': 7.28.5 838 857 '@babel/template': 7.27.2 839 - '@babel/types': 7.28.2 840 - debug: 4.4.1 858 + '@babel/types': 7.28.5 859 + debug: 4.4.3 841 860 transitivePeerDependencies: 842 861 - supports-color 843 862 844 - '@babel/types@7.28.2': 863 + '@babel/types@7.28.5': 845 864 dependencies: 846 865 '@babel/helper-string-parser': 7.27.1 847 - '@babel/helper-validator-identifier': 7.27.1 866 + '@babel/helper-validator-identifier': 7.28.5 848 867 849 - '@esbuild/aix-ppc64@0.25.8': 868 + '@esbuild/aix-ppc64@0.25.12': 850 869 optional: true 851 870 852 - '@esbuild/android-arm64@0.25.8': 871 + '@esbuild/android-arm64@0.25.12': 853 872 optional: true 854 873 855 - '@esbuild/android-arm@0.25.8': 874 + '@esbuild/android-arm@0.25.12': 856 875 optional: true 857 876 858 - '@esbuild/android-x64@0.25.8': 877 + '@esbuild/android-x64@0.25.12': 859 878 optional: true 860 879 861 - '@esbuild/darwin-arm64@0.25.8': 880 + '@esbuild/darwin-arm64@0.25.12': 862 881 optional: true 863 882 864 - '@esbuild/darwin-x64@0.25.8': 883 + '@esbuild/darwin-x64@0.25.12': 865 884 optional: true 866 885 867 - '@esbuild/freebsd-arm64@0.25.8': 886 + '@esbuild/freebsd-arm64@0.25.12': 868 887 optional: true 869 888 870 - '@esbuild/freebsd-x64@0.25.8': 889 + '@esbuild/freebsd-x64@0.25.12': 871 890 optional: true 872 891 873 - '@esbuild/linux-arm64@0.25.8': 892 + '@esbuild/linux-arm64@0.25.12': 874 893 optional: true 875 894 876 - '@esbuild/linux-arm@0.25.8': 895 + '@esbuild/linux-arm@0.25.12': 877 896 optional: true 878 897 879 - '@esbuild/linux-ia32@0.25.8': 898 + '@esbuild/linux-ia32@0.25.12': 880 899 optional: true 881 900 882 - '@esbuild/linux-loong64@0.25.8': 901 + '@esbuild/linux-loong64@0.25.12': 883 902 optional: true 884 903 885 - '@esbuild/linux-mips64el@0.25.8': 904 + '@esbuild/linux-mips64el@0.25.12': 886 905 optional: true 887 906 888 - '@esbuild/linux-ppc64@0.25.8': 907 + '@esbuild/linux-ppc64@0.25.12': 889 908 optional: true 890 909 891 - '@esbuild/linux-riscv64@0.25.8': 910 + '@esbuild/linux-riscv64@0.25.12': 892 911 optional: true 893 912 894 - '@esbuild/linux-s390x@0.25.8': 913 + '@esbuild/linux-s390x@0.25.12': 895 914 optional: true 896 915 897 - '@esbuild/linux-x64@0.25.8': 916 + '@esbuild/linux-x64@0.25.12': 898 917 optional: true 899 918 900 - '@esbuild/netbsd-arm64@0.25.8': 919 + '@esbuild/netbsd-arm64@0.25.12': 901 920 optional: true 902 921 903 - '@esbuild/netbsd-x64@0.25.8': 922 + '@esbuild/netbsd-x64@0.25.12': 904 923 optional: true 905 924 906 - '@esbuild/openbsd-arm64@0.25.8': 925 + '@esbuild/openbsd-arm64@0.25.12': 907 926 optional: true 908 927 909 - '@esbuild/openbsd-x64@0.25.8': 928 + '@esbuild/openbsd-x64@0.25.12': 910 929 optional: true 911 930 912 - '@esbuild/openharmony-arm64@0.25.8': 931 + '@esbuild/openharmony-arm64@0.25.12': 913 932 optional: true 914 933 915 - '@esbuild/sunos-x64@0.25.8': 934 + '@esbuild/sunos-x64@0.25.12': 916 935 optional: true 917 936 918 - '@esbuild/win32-arm64@0.25.8': 937 + '@esbuild/win32-arm64@0.25.12': 919 938 optional: true 920 939 921 - '@esbuild/win32-ia32@0.25.8': 940 + '@esbuild/win32-ia32@0.25.12': 922 941 optional: true 923 942 924 - '@esbuild/win32-x64@0.25.8': 943 + '@esbuild/win32-x64@0.25.12': 925 944 optional: true 926 945 927 - '@jridgewell/gen-mapping@0.3.12': 946 + '@jridgewell/gen-mapping@0.3.13': 947 + dependencies: 948 + '@jridgewell/sourcemap-codec': 1.5.5 949 + '@jridgewell/trace-mapping': 0.3.31 950 + 951 + '@jridgewell/remapping@2.3.5': 928 952 dependencies: 929 - '@jridgewell/sourcemap-codec': 1.5.4 930 - '@jridgewell/trace-mapping': 0.3.29 953 + '@jridgewell/gen-mapping': 0.3.13 954 + '@jridgewell/trace-mapping': 0.3.31 931 955 932 956 '@jridgewell/resolve-uri@3.1.2': {} 933 957 934 - '@jridgewell/sourcemap-codec@1.5.4': {} 958 + '@jridgewell/sourcemap-codec@1.5.5': {} 935 959 936 - '@jridgewell/trace-mapping@0.3.29': 960 + '@jridgewell/trace-mapping@0.3.31': 937 961 dependencies: 938 962 '@jridgewell/resolve-uri': 3.1.2 939 - '@jridgewell/sourcemap-codec': 1.5.4 963 + '@jridgewell/sourcemap-codec': 1.5.5 940 964 941 - '@rollup/rollup-android-arm-eabi@4.46.1': 965 + '@rollup/rollup-android-arm-eabi@4.53.0': 942 966 optional: true 943 967 944 - '@rollup/rollup-android-arm64@4.46.1': 968 + '@rollup/rollup-android-arm64@4.53.0': 945 969 optional: true 946 970 947 - '@rollup/rollup-darwin-arm64@4.46.1': 971 + '@rollup/rollup-darwin-arm64@4.53.0': 948 972 optional: true 949 973 950 - '@rollup/rollup-darwin-x64@4.46.1': 974 + '@rollup/rollup-darwin-x64@4.53.0': 951 975 optional: true 952 976 953 - '@rollup/rollup-freebsd-arm64@4.46.1': 977 + '@rollup/rollup-freebsd-arm64@4.53.0': 954 978 optional: true 955 979 956 - '@rollup/rollup-freebsd-x64@4.46.1': 980 + '@rollup/rollup-freebsd-x64@4.53.0': 957 981 optional: true 958 982 959 - '@rollup/rollup-linux-arm-gnueabihf@4.46.1': 983 + '@rollup/rollup-linux-arm-gnueabihf@4.53.0': 960 984 optional: true 961 985 962 - '@rollup/rollup-linux-arm-musleabihf@4.46.1': 986 + '@rollup/rollup-linux-arm-musleabihf@4.53.0': 963 987 optional: true 964 988 965 - '@rollup/rollup-linux-arm64-gnu@4.46.1': 989 + '@rollup/rollup-linux-arm64-gnu@4.53.0': 966 990 optional: true 967 991 968 - '@rollup/rollup-linux-arm64-musl@4.46.1': 992 + '@rollup/rollup-linux-arm64-musl@4.53.0': 969 993 optional: true 970 994 971 - '@rollup/rollup-linux-loongarch64-gnu@4.46.1': 995 + '@rollup/rollup-linux-loong64-gnu@4.53.0': 972 996 optional: true 973 997 974 - '@rollup/rollup-linux-ppc64-gnu@4.46.1': 998 + '@rollup/rollup-linux-ppc64-gnu@4.53.0': 975 999 optional: true 976 1000 977 - '@rollup/rollup-linux-riscv64-gnu@4.46.1': 1001 + '@rollup/rollup-linux-riscv64-gnu@4.53.0': 978 1002 optional: true 979 1003 980 - '@rollup/rollup-linux-riscv64-musl@4.46.1': 1004 + '@rollup/rollup-linux-riscv64-musl@4.53.0': 981 1005 optional: true 982 1006 983 - '@rollup/rollup-linux-s390x-gnu@4.46.1': 1007 + '@rollup/rollup-linux-s390x-gnu@4.53.0': 984 1008 optional: true 985 1009 986 - '@rollup/rollup-linux-x64-gnu@4.46.1': 1010 + '@rollup/rollup-linux-x64-gnu@4.53.0': 987 1011 optional: true 988 1012 989 - '@rollup/rollup-linux-x64-musl@4.46.1': 1013 + '@rollup/rollup-linux-x64-musl@4.53.0': 990 1014 optional: true 991 1015 992 - '@rollup/rollup-win32-arm64-msvc@4.46.1': 1016 + '@rollup/rollup-openharmony-arm64@4.53.0': 993 1017 optional: true 994 1018 995 - '@rollup/rollup-win32-ia32-msvc@4.46.1': 1019 + '@rollup/rollup-win32-arm64-msvc@4.53.0': 1020 + optional: true 1021 + 1022 + '@rollup/rollup-win32-ia32-msvc@4.53.0': 996 1023 optional: true 997 1024 998 - '@rollup/rollup-win32-x64-msvc@4.46.1': 1025 + '@rollup/rollup-win32-x64-gnu@4.53.0': 999 1026 optional: true 1000 1027 1001 - '@tauri-apps/api@2.7.0': {} 1028 + '@rollup/rollup-win32-x64-msvc@4.53.0': 1029 + optional: true 1002 1030 1003 - '@tauri-apps/api@2.8.0': {} 1031 + '@tauri-apps/api@2.9.0': {} 1004 1032 1005 - '@tauri-apps/cli-darwin-arm64@2.7.1': 1033 + '@tauri-apps/cli-darwin-arm64@2.9.3': 1006 1034 optional: true 1007 1035 1008 - '@tauri-apps/cli-darwin-x64@2.7.1': 1036 + '@tauri-apps/cli-darwin-x64@2.9.3': 1009 1037 optional: true 1010 1038 1011 - '@tauri-apps/cli-linux-arm-gnueabihf@2.7.1': 1039 + '@tauri-apps/cli-linux-arm-gnueabihf@2.9.3': 1012 1040 optional: true 1013 1041 1014 - '@tauri-apps/cli-linux-arm64-gnu@2.7.1': 1042 + '@tauri-apps/cli-linux-arm64-gnu@2.9.3': 1015 1043 optional: true 1016 1044 1017 - '@tauri-apps/cli-linux-arm64-musl@2.7.1': 1045 + '@tauri-apps/cli-linux-arm64-musl@2.9.3': 1018 1046 optional: true 1019 1047 1020 - '@tauri-apps/cli-linux-riscv64-gnu@2.7.1': 1048 + '@tauri-apps/cli-linux-riscv64-gnu@2.9.3': 1021 1049 optional: true 1022 1050 1023 - '@tauri-apps/cli-linux-x64-gnu@2.7.1': 1051 + '@tauri-apps/cli-linux-x64-gnu@2.9.3': 1024 1052 optional: true 1025 1053 1026 - '@tauri-apps/cli-linux-x64-musl@2.7.1': 1054 + '@tauri-apps/cli-linux-x64-musl@2.9.3': 1027 1055 optional: true 1028 1056 1029 - '@tauri-apps/cli-win32-arm64-msvc@2.7.1': 1057 + '@tauri-apps/cli-win32-arm64-msvc@2.9.3': 1030 1058 optional: true 1031 1059 1032 - '@tauri-apps/cli-win32-ia32-msvc@2.7.1': 1060 + '@tauri-apps/cli-win32-ia32-msvc@2.9.3': 1033 1061 optional: true 1034 1062 1035 - '@tauri-apps/cli-win32-x64-msvc@2.7.1': 1063 + '@tauri-apps/cli-win32-x64-msvc@2.9.3': 1036 1064 optional: true 1037 1065 1038 - '@tauri-apps/cli@2.7.1': 1066 + '@tauri-apps/cli@2.9.3': 1039 1067 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 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 1051 1087 1052 - '@tauri-apps/plugin-dialog@2.4.0': 1088 + '@tauri-apps/plugin-opener@2.5.2': 1053 1089 dependencies: 1054 - '@tauri-apps/api': 2.8.0 1090 + '@tauri-apps/api': 2.9.0 1055 1091 1056 - '@tauri-apps/plugin-opener@2.4.0': 1092 + '@tauri-apps/plugin-os@2.3.2': 1057 1093 dependencies: 1058 - '@tauri-apps/api': 2.7.0 1094 + '@tauri-apps/api': 2.9.0 1059 1095 1060 1096 '@types/animejs@3.1.13': {} 1061 1097 1062 1098 '@types/babel__core@7.20.5': 1063 1099 dependencies: 1064 - '@babel/parser': 7.28.0 1065 - '@babel/types': 7.28.2 1100 + '@babel/parser': 7.28.5 1101 + '@babel/types': 7.28.5 1066 1102 '@types/babel__generator': 7.27.0 1067 1103 '@types/babel__template': 7.4.4 1068 - '@types/babel__traverse': 7.20.7 1104 + '@types/babel__traverse': 7.28.0 1069 1105 1070 1106 '@types/babel__generator@7.27.0': 1071 1107 dependencies: 1072 - '@babel/types': 7.28.2 1108 + '@babel/types': 7.28.5 1073 1109 1074 1110 '@types/babel__template@7.4.4': 1075 1111 dependencies: 1076 - '@babel/parser': 7.28.0 1077 - '@babel/types': 7.28.2 1112 + '@babel/parser': 7.28.5 1113 + '@babel/types': 7.28.5 1078 1114 1079 - '@types/babel__traverse@7.20.7': 1115 + '@types/babel__traverse@7.28.0': 1080 1116 dependencies: 1081 - '@babel/types': 7.28.2 1117 + '@babel/types': 7.28.5 1082 1118 1083 1119 '@types/estree@1.0.8': {} 1084 1120 1085 - animejs@4.1.2: {} 1121 + animejs@4.2.2: {} 1086 1122 1087 - babel-plugin-jsx-dom-expressions@0.39.8(@babel/core@7.28.0): 1123 + babel-plugin-jsx-dom-expressions@0.40.3(@babel/core@7.28.5): 1088 1124 dependencies: 1089 - '@babel/core': 7.28.0 1125 + '@babel/core': 7.28.5 1090 1126 '@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 1127 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) 1128 + '@babel/types': 7.28.5 1093 1129 html-entities: 2.3.3 1094 1130 parse5: 7.3.0 1095 - validate-html-nesting: 1.2.3 1096 1131 1097 - babel-preset-solid@1.9.6(@babel/core@7.28.0): 1132 + babel-preset-solid@1.9.10(@babel/core@7.28.5)(solid-js@1.9.10): 1098 1133 dependencies: 1099 - '@babel/core': 7.28.0 1100 - babel-plugin-jsx-dom-expressions: 0.39.8(@babel/core@7.28.0) 1134 + '@babel/core': 7.28.5 1135 + babel-plugin-jsx-dom-expressions: 0.40.3(@babel/core@7.28.5) 1136 + optionalDependencies: 1137 + solid-js: 1.9.10 1101 1138 1102 - browserslist@4.25.1: 1139 + baseline-browser-mapping@2.8.25: {} 1140 + 1141 + browserslist@4.27.0: 1103 1142 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) 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) 1108 1148 1109 - caniuse-lite@1.0.30001731: {} 1149 + caniuse-lite@1.0.30001754: {} 1110 1150 1111 1151 convert-source-map@2.0.0: {} 1112 1152 1113 1153 csstype@3.1.3: {} 1114 1154 1115 - debug@4.4.1: 1155 + debug@4.4.3: 1116 1156 dependencies: 1117 1157 ms: 2.1.3 1118 1158 1119 - electron-to-chromium@1.5.192: {} 1159 + electron-to-chromium@1.5.248: {} 1120 1160 1121 1161 entities@6.0.1: {} 1122 1162 1123 - esbuild@0.25.8: 1163 + esbuild@0.25.12: 1124 1164 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 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 1151 1191 1152 1192 escalade@3.2.0: {} 1153 1193 1154 - fdir@6.4.6(picomatch@4.0.3): 1194 + fdir@6.5.0(picomatch@4.0.3): 1155 1195 optionalDependencies: 1156 1196 picomatch: 4.0.3 1157 1197 ··· 1182 1222 1183 1223 nanoid@3.3.11: {} 1184 1224 1185 - node-releases@2.0.19: {} 1225 + node-releases@2.0.27: {} 1186 1226 1187 1227 parse5@7.3.0: 1188 1228 dependencies: ··· 1198 1238 picocolors: 1.1.1 1199 1239 source-map-js: 1.2.1 1200 1240 1201 - rollup@4.46.1: 1241 + rollup@4.53.0: 1202 1242 dependencies: 1203 1243 '@types/estree': 1.0.8 1204 1244 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 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 1225 1267 fsevents: 2.3.3 1226 1268 1227 1269 semver@6.3.1: {} 1228 1270 1229 - seroval-plugins@1.3.2(seroval@1.3.2): 1271 + seroval-plugins@1.3.3(seroval@1.3.2): 1230 1272 dependencies: 1231 1273 seroval: 1.3.2 1232 1274 1233 1275 seroval@1.3.2: {} 1234 1276 1235 - solid-js@1.9.7: 1277 + solid-js@1.9.10: 1236 1278 dependencies: 1237 1279 csstype: 3.1.3 1238 1280 seroval: 1.3.2 1239 - seroval-plugins: 1.3.2(seroval@1.3.2) 1281 + seroval-plugins: 1.3.3(seroval@1.3.2) 1240 1282 1241 - solid-refresh@0.6.3(solid-js@1.9.7): 1283 + solid-refresh@0.6.3(solid-js@1.9.10): 1242 1284 dependencies: 1243 - '@babel/generator': 7.28.0 1285 + '@babel/generator': 7.28.5 1244 1286 '@babel/helper-module-imports': 7.27.1 1245 - '@babel/types': 7.28.2 1246 - solid-js: 1.9.7 1287 + '@babel/types': 7.28.5 1288 + solid-js: 1.9.10 1247 1289 transitivePeerDependencies: 1248 1290 - supports-color 1249 1291 1250 1292 source-map-js@1.2.1: {} 1251 1293 1252 - tinyglobby@0.2.14: 1294 + tinyglobby@0.2.15: 1253 1295 dependencies: 1254 - fdir: 6.4.6(picomatch@4.0.3) 1296 + fdir: 6.5.0(picomatch@4.0.3) 1255 1297 picomatch: 4.0.3 1256 1298 1257 1299 typescript@5.6.3: {} 1258 1300 1259 - update-browserslist-db@1.1.3(browserslist@4.25.1): 1301 + update-browserslist-db@1.1.4(browserslist@4.27.0): 1260 1302 dependencies: 1261 - browserslist: 4.25.1 1303 + browserslist: 4.27.0 1262 1304 escalade: 3.2.0 1263 1305 picocolors: 1.1.1 1264 1306 1265 - validate-html-nesting@1.2.3: {} 1266 - 1267 - vite-plugin-solid@2.11.8(solid-js@1.9.7)(vite@6.3.5): 1307 + vite-plugin-solid@2.11.10(solid-js@1.9.10)(vite@6.4.1): 1268 1308 dependencies: 1269 - '@babel/core': 7.28.0 1309 + '@babel/core': 7.28.5 1270 1310 '@types/babel__core': 7.20.5 1271 - babel-preset-solid: 1.9.6(@babel/core@7.28.0) 1311 + babel-preset-solid: 1.9.10(@babel/core@7.28.5)(solid-js@1.9.10) 1272 1312 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) 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) 1277 1317 transitivePeerDependencies: 1278 1318 - supports-color 1279 1319 1280 - vite@6.3.5: 1320 + vite@6.4.1: 1281 1321 dependencies: 1282 - esbuild: 0.25.8 1283 - fdir: 6.4.6(picomatch@4.0.3) 1322 + esbuild: 0.25.12 1323 + fdir: 6.5.0(picomatch@4.0.3) 1284 1324 picomatch: 4.0.3 1285 1325 postcss: 8.5.6 1286 - rollup: 4.46.1 1287 - tinyglobby: 0.2.14 1326 + rollup: 4.53.0 1327 + tinyglobby: 0.2.15 1288 1328 optionalDependencies: 1289 1329 fsevents: 2.3.3 1290 1330 1291 - vitefu@1.1.1(vite@6.3.5): 1331 + vitefu@1.1.1(vite@6.4.1): 1292 1332 optionalDependencies: 1293 - vite: 6.3.5 1333 + vite: 6.4.1 1294 1334 1295 1335 yallist@3.1.1: {}
+1
pnpm-workspace.yaml
··· 1 1 onlyBuiltDependencies: 2 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"; 1 + import { createEffect, createSignal, onCleanup, onMount } from "solid-js"; 2 2 import "./App.css"; 3 3 import { renderBackgroundGrid, renderContextMenu, renderNodes, renderNullTab, renderTempDrawing } from "./renderer"; 4 4 import { lerp } from "./utils/lerp"; 5 - import { Node, NodeIO, NodeIOResolveAnyTypes } from "./structs/node"; 5 + import { Node, NodeIO, NodeIOCanCast, NodeIOResolveAnyTypes } from "./structs/node"; 6 6 import { isPointInRect, isPointInRectApplyOffset, screenToWorldSpace } from "./utils/interections"; 7 7 import { ControlBar } from "./components/ControlBar"; 8 8 import { CanvasContextMenu } from "./ContextMenu/Canvas"; ··· 12 12 import { TabMenu } from "./components/TabMenu"; 13 13 import { ConfirmationPopup } from "./components/ConfirmationPopup"; 14 14 15 - let App = () => { 16 - // TODO: Delete selected node when delete key is pressed 17 - // TODO: Keybind system 18 - // TODO: Add undo / redo -ing 15 + import * as keybinds from './keybinds'; 16 + import { listen } from "@tauri-apps/api/event"; 19 17 20 - let [ selectedNode, setSelectedNode ] = createSignal<Node | null>(null); 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 ]); 21 23 22 24 let canvas!: HTMLCanvasElement; 23 25 let ctx: CanvasRenderingContext2D; ··· 58 60 visible: false 59 61 } 60 62 61 - onMount(() => { 62 - NodeManager.Instance.HookTabChange(() => setSelectedNode(null)); 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([])); 63 75 64 76 ctx = canvas.getContext('2d')!; 65 77 ··· 102 114 } 103 115 104 116 if(clickedNode){ 105 - contextMenu.items = NodeContextMenu(clickedNode); 117 + contextMenu.items = NodeContextMenu(clickedNode, selectedNodes, setSelectedNodes); 106 118 } else{ 107 119 contextMenu.items = CanvasContextMenu; 108 120 } ··· 111 123 contextMenu.visible = true; 112 124 } 113 125 126 + let isShiftClick = false; 114 127 canvas.onmousedown = ( e ) => { 128 + isShiftClick = e.shiftKey; 129 + 115 130 if( 116 131 e.clientY < 60 || 117 132 e.clientX < 220 || ··· 157 172 158 173 if(nodes){ 159 174 nodes.map(node => { 160 - node.selected = false; 161 - 162 175 if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 163 176 e.clientX, e.clientY, 164 - node.x, node.y, node.w, node.h 177 + node.x - 20, node.y, node.w + 40, node.h 165 178 )){ 166 179 node.outputs.map(( output, i ) => { 167 180 if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 168 181 e.clientX, e.clientY, 169 - node.x + (node.w - 30), 182 + node.x + (node.w - 10), 170 183 node.y + 50 + (30 * i), 171 184 20, 20 172 185 )){ 173 186 output.index = i; 174 187 175 - drawingTo = [ node.x + (node.w - 30), node.y + 50 + (30 * i) ]; 188 + drawingTo = [ 189 + node.x + (node.w - 10), 190 + node.y + 50 + (30 * i) 191 + ]; 176 192 drawingFrom = output; 177 193 178 194 isDrawing = true; ··· 183 199 node.inputs.map(( input, i ) => { 184 200 if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 185 201 e.clientX, e.clientY, 186 - node.x + 10, 202 + node.x - 10, 187 203 node.y + 50 + (30 * i), 188 204 20, 20 189 205 )){ ··· 213 229 } 214 230 215 231 movingNode = clickedNode; 216 - 217 - if(clickedNode){ 218 - clickedNode.selected = true; 219 - setSelectedNode(clickedNode); 220 - } 221 232 222 233 isMouseDown = true; 223 234 mouseStartPos = [ e.clientX, e.clientY ]; 235 + mouseMovePos = [ e.clientX, e.clientY ]; 224 236 } 225 237 226 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 + 227 274 if(isMouseDown){ 228 275 if(isDrawing){ 229 276 drawingTo = screenToWorldSpace(canvas, { x: offset[0], y: offset[1], scale }, e.clientX - 10 * scale, e.clientY - 10 * scale) as [ number, number ]; 230 277 } else if(movingNode){ 231 - movingNode.x = movingNode.x - (mouseStartPos[0] - e.clientX) / scale; 232 - movingNode.y = movingNode.y - (mouseStartPos[1] - e.clientY) / scale; 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 + } 233 284 234 - mouseStartPos = [ e.clientX, e.clientY ]; 285 + mouseMovePos = [ e.clientX, e.clientY ]; 235 286 NodeManager.Instance.UpdateConfig(); 236 287 } else{ 237 - offsetTarget = [ offsetTarget[0] - (mouseStartPos[0] - e.clientX) / scale, offsetTarget[1] - (mouseStartPos[1] - e.clientY) / scale ]; 238 - mouseStartPos = [ e.clientX, e.clientY ]; 288 + offsetTarget = [ offsetTarget[0] - (mouseMovePos[0] - e.clientX) / scale, offsetTarget[1] - (mouseMovePos[1] - e.clientY) / scale ]; 289 + mouseMovePos = [ e.clientX, e.clientY ]; 239 290 240 291 screenMoved = true; 241 292 } ··· 279 330 280 331 canvas.onmouseup = ( e ) => { 281 332 let nodes = NodeManager.Instance.GetNodes(); 333 + let clickedNode; 282 334 283 335 if(nodes){ 284 336 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); 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); 295 353 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!); 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!); 305 363 306 - NodeManager.Instance.UpdateConfig(); 364 + NodeManager.Instance.UpdateConfig(); 365 + } 307 366 } 308 367 } 309 - } 310 - }) 368 + }) 369 + } 311 370 }) 312 371 } 313 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 + 314 403 isDrawing = false; 315 404 isMouseDown = false; 316 405 } 317 406 407 + keybinds.load(canvas, mousePos, selectedNodes, setSelectedNodes); 318 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 + }); 319 425 }); 320 426 321 427 let update = () => { 322 428 if(stopRender)return; 323 - 324 429 scale = lerp(scale, targetScale, 0.25); 325 430 326 431 offset[0] = lerp(offset[0], offsetTarget[0], 0.5); ··· 345 450 346 451 let isMouseDown = false; 347 452 let mouseStartPos = [ 0, 0 ]; 453 + let mouseMovePos = [ 0, 0 ]; 348 454 349 455 let interval = setInterval(() => { 350 456 if(screenMoved){ ··· 354 460 } 355 461 }, 1000); 356 462 357 - onCleanup(() => { 358 - stopRender = true; 359 - window.clearInterval(interval); 360 - }); 361 - 362 463 return ( 363 464 <> 364 465 <ConfirmationPopup /> 365 466 <TabMenu /> 366 - <ControlBar node={selectedNode} lockMovement={( lock ) => lockMovement = lock} /> 467 + <ControlBar node={selectedNodes} lockMovement={( lock ) => lockMovement = lock} /> 367 468 <canvas ref={canvas}/> 368 469 </> 369 470 );
+14 -2
src/ContextMenu/Node.tsx
··· 1 + import { Accessor, Setter } from "solid-js"; 1 2 import { NodeManager } from "../Mangers/NodeManager"; 2 3 import { PositionInfo } from "../renderer"; 3 4 import { Node } from "../structs/node"; 4 5 5 - export let NodeContextMenu = ( clickedNode: Node ) => [ 6 + export let NodeContextMenu = ( clickedNode: Node, selectedNode: Accessor<Node[]>, setSelectedNode: Setter<Node[]> ) => [ 6 7 { 7 8 text: "Delete Node", 8 9 clicked: ( _e: MouseEvent, _canvas: HTMLCanvasElement, _position: PositionInfo ) => { ··· 18 19 }) 19 20 }) 20 21 21 - // TODO: If node is currently selected, deselect it. 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 + 22 34 NodeManager.Instance.RemoveNode(clickedNode!) 23 35 }, 24 36 hovered: false
+86 -40
src/Mangers/NodeManager.tsx
··· 7 7 import { NodesByID } from "../Nodes/Nodes"; 8 8 import { save } from "@tauri-apps/plugin-dialog"; 9 9 import { ConfirmationManager } from "./ConfirmationManager"; 10 - import { getCurrentWindow } from "@tauri-apps/api/window"; 10 + import { platform } from "@tauri-apps/plugin-os"; 11 11 12 12 export interface TabHashMap { 13 13 [details: string] : Tab; ··· 24 24 constructor(){ 25 25 NodeManager.Instance = this; 26 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 + 27 42 listen('load_new_tab', ( ev: any ) => { 28 43 this._loadFromConfig(ev.payload.path, null, ev.payload.graph); 29 44 }); ··· 32 47 let version = await getVersion(); 33 48 34 49 for(let tab of Object.entries<any>(tabs)){ 35 - console.log(tab); 36 - 37 - await this._loadFromConfig(tab[1][2], tab[0], JSON.stringify({ 50 + let loaded_tab = await this._loadFromConfig(tab[1][2], tab[0], JSON.stringify({ 38 51 tab_name: tab[1][1], 39 52 version, 40 53 graph: tab[1][0] 41 54 })); 55 + 56 + if(loaded_tab) 57 + loaded_tab.setNeedsSave(tab[1][3]); 42 58 }; 59 + 60 + this.UpdateConfig(); 43 61 }); 44 62 45 - (async () => { 46 - let window = await getCurrentWindow(); 63 + listen('prompt_to_close', async _ => { 64 + let tabs = Object.values(this._tabs); 65 + let tabsNeedingSaving = tabs.filter(x => x.needsSave()); 47 66 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(); } 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(); 68 78 } 69 - ] 70 - ) 71 - }); 72 - } 73 - }); 74 - })(); 79 + }, 80 + { 81 + text: 'Don\'t Save', 82 + callback: async () => { 83 + res(); 84 + } 85 + } 86 + ] 87 + ) 88 + }); 89 + } 90 + 91 + invoke('close_app'); 92 + }); 75 93 } 76 94 77 95 78 96 private _tabUpdateHook: ( tabs: TabHashMap ) => void = () => {}; 79 97 private _tabChangeHook: () => void = () => {}; 98 + 99 + public CurrentTab(): Tab | null{ 100 + if(!this._selectedTab)return null 101 + return this._tabs[this._selectedTab] || null; 102 + } 80 103 81 104 public async AddTab( name: string, id: string | null = null ): Promise<Tab>{ 82 105 let [ selected, setSelected ] = createSignal(false); ··· 94 117 needsSave, 95 118 setNeedsSave, 96 119 97 - refuseSync: false 120 + needSync: false 98 121 }; 99 122 100 123 this._tabs[tab.id] = tab; ··· 189 212 } 190 213 } 191 214 192 - public async SaveTab( tab: Tab ){ 215 + public async SaveTab( tab: Tab, ignoreSaveLocation: boolean = false ){ 193 216 let path = 194 - tab.saveLocation || 217 + tab.saveLocation && !ignoreSaveLocation ? 218 + tab.saveLocation : 195 219 await save({ defaultPath: tab.name + '.macro', filters: [ { name: 'Macro Files', extensions: [ 'macro' ] } ] }); 196 220 197 221 if(!path)throw new Error("Cannot save"); ··· 246 270 let tab = this._tabs[this._selectedTab]; 247 271 if(!tab)return; 248 272 249 - if(tab.refuseSync)return; 250 - invoke('sync_tab', { graph: this._generateTabGraph(tab.id)[0], id: tab.id, name: tab.name, location: tab.saveLocation }); 273 + tab.nodes = this._nodes; 274 + tab.needSync = true; 251 275 252 276 if(needsSave)tab.setNeedsSave(true); 253 277 } ··· 262 286 )return; 263 287 264 288 let tab = await this.AddTab(json.tab_name, id); 265 - tab.refuseSync = true; 289 + tab.needSync = false; 266 290 tab.saveLocation = path; 267 291 268 292 this._nodes = []; ··· 293 317 let input = output.connections[k]; 294 318 let node = this._nodes.find(x => x.id === input.node)!; 295 319 320 + if(!node)continue; 321 + 296 322 let realInput = node.inputs.find(x => x.index === input.index); 297 323 let realOutput = outputParentNode.outputs[j]; 298 324 ··· 318 344 tab.setNeedsSave(false); 319 345 tab.nodes = this._nodes; 320 346 321 - tab.refuseSync = false; 322 - this.UpdateConfig(false); 347 + tab.needSync = false; 348 + if(!id)this.UpdateConfig(false); 349 + 350 + return tab; 323 351 } 324 352 325 353 private _generateTabGraph( tabId: string | null ): [ any, Tab | null ]{ ··· 335 363 let node = tab.nodes[i]; 336 364 337 365 let nodeOutputs = []; 366 + let nodeInputs = []; 338 367 339 368 for (let j = 0; j < node.outputs.length; j++) { 340 369 let output = node.outputs[j]; ··· 351 380 }) 352 381 } 353 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 + 354 398 nodesToSave.push({ 355 399 name: node.name, 356 400 id: node.id, 357 401 typeId: node.typeId, 358 402 pos: [ node.x, node.y ], 359 403 outputs: nodeOutputs, 404 + inputs: nodeInputs, 360 405 statics: node.statics 361 406 }) 362 407 } ··· 371 416 invoke('save_graph', { graph: JSON.stringify({ 372 417 tab_name: tab.name, 373 418 version: await getVersion(), 419 + platform: platform(), 374 420 graph: nodesToSave 375 421 }), path }); 376 422 }
+2 -1
src/Nodes/Conditional/IfEqual.tsx
··· 2 2 import { NodeDefinition } from "../Nodes"; 3 3 4 4 export let NodeConditionalIfEqual: NodeDefinition = { 5 + os: 'any', 6 + 5 7 isSingle: true, 6 8 name: 'If Equal', 7 9 typeId: 'ifequal', 8 10 9 11 w: 220, 10 - h: 150, 11 12 12 13 statics: [{ 13 14 type: NodeType.Label,
+2 -1
src/Nodes/Conditional/IfFalse.tsx
··· 2 2 import { NodeDefinition } from "../Nodes"; 3 3 4 4 export let NodeConditionalIfFalse: NodeDefinition = { 5 + os: 'any', 6 + 5 7 isSingle: true, 6 8 name: 'If False', 7 9 typeId: 'iffalse', 8 10 9 11 w: 220, 10 - h: 150, 11 12 12 13 statics: [{ 13 14 type: NodeType.Label,
+2 -1
src/Nodes/Conditional/IfTrue.tsx
··· 2 2 import { NodeDefinition } from "../Nodes"; 3 3 4 4 export let NodeConditionalIfTrue: NodeDefinition = { 5 + os: 'any', 6 + 5 7 isSingle: true, 6 8 name: 'If True', 7 9 typeId: 'iftrue', 8 10 9 11 w: 220, 10 - h: 150, 11 12 12 13 statics: [{ 13 14 type: NodeType.Label,
+2
src/Nodes/Conditional.tsx
··· 5 5 import { NodeConditionalIfFalse } from "./Conditional/IfFalse"; 6 6 7 7 export let NodeConditional: NodeDefinition = { 8 + os: 'any', 9 + 8 10 isSingle: false, 9 11 name: 'Conditional', 10 12 items: [
+2 -1
src/Nodes/Debug.tsx
··· 2 2 import { NodeDefinition } from "./Nodes"; 3 3 4 4 export let NodeDebug: NodeDefinition = { 5 + os: 'any', 6 + 5 7 isSingle: true, 6 8 name: 'Debug', 7 9 typeId: 'debug', 8 10 9 11 w: 200, 10 - h: 110, 11 12 12 13 statics: [ 13 14 {
+24 -3
src/Nodes/Nodes.tsx
··· 1 1 import { Node, NodeStatic, NodeType } from "../structs/node"; 2 + import { platform } from '@tauri-apps/plugin-os'; 2 3 3 4 import { NodeConditional } from "./Conditional"; 4 5 import { NodeDebug } from "./Debug"; 5 6 import { NodeOSCActions } from "./OSCActions"; 6 7 import { NodeOSCTrigger } from "./OSCTrigger"; 8 + import { NodePressKey } from "./PressKey"; 7 9 import { NodeStatics } from "./Statics"; 10 + import { NodeShellCommand } from "./Shell"; 8 11 9 12 export interface NodeDefinition{ 13 + os: string, 10 14 isSingle: boolean, 11 15 name: string, 12 16 typeId?: string, 13 17 onStaticsUpdate?: ( node: Node ) => Promise<void>, 14 18 // build?: ( pos: [ number, number ], onStaticsUpdate: ( node: Node ) => void ) => Promise<Node>, 15 19 w?: number, 16 - h?: number, 17 20 statics?: NodeStatic[], 18 21 inputs?: { name: string, type: NodeType }[], 19 22 outputs?: { name: string, type: NodeType }[], ··· 25 28 [details: string] : NodeDefinition; 26 29 } 27 30 28 - export let Nodes: NodeDefinition[] = [ 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 = [ 29 41 NodeOSCTrigger, 30 42 NodeConditional, 31 43 NodeStatics, 32 44 NodeOSCActions, 33 - NodeDebug 45 + NodeDebug, 46 + NodePressKey, 47 + NodeShellCommand 34 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 + } 35 56 36 57 export let NodesByID: NodeDefinitionHashMap = {} 37 58
+2 -1
src/Nodes/OSCActions/Send Chatbox.tsx
··· 2 2 import { NodeDefinition } from "../Nodes"; 3 3 4 4 export let NodeOSCActionsSendChatbox: NodeDefinition = { 5 + os: 'any', 6 + 5 7 isSingle: true, 6 8 name: 'Send Chatbox', 7 9 typeId: 'oscsendchatbox', 8 10 9 11 w: 200, 10 - h: 120, 11 12 12 13 statics: [{ 13 14 type: NodeType.Label,
+2
src/Nodes/OSCActions.tsx
··· 2 2 import { NodeOSCActionsSendChatbox } from "./OSCActions/Send Chatbox"; 3 3 4 4 export let NodeOSCActions: NodeDefinition = { 5 + os: 'any', 6 + 5 7 isSingle: false, 6 8 name: 'OSC Actions', 7 9 items: [
+27 -10
src/Nodes/OSCTrigger.tsx
··· 5 5 import { NodeDefinition } from "./Nodes"; 6 6 7 7 export let NodeOSCTrigger: NodeDefinition = { 8 + os: 'any', 9 + 8 10 isSingle: true, 9 11 name: 'OSC Trigger', 10 12 typeId: 'osctrigger', 11 13 12 14 w: 200, 13 - h: 50, 14 15 15 16 statics: [ 16 17 { ··· 39 40 } 40 41 } 41 42 42 - node.outputs.map(output => { 43 - output.connections.map(partner => { 44 - partner.connections = partner.connections.filter(x => x != output); 45 - }) 46 - }) 47 - node.outputs = []; 43 + let tempOutputs = []; 48 44 49 - node.outputs.push({ 45 + tempOutputs.push({ 50 46 name: 'Flow', 51 47 type: NodeType.Flow, 52 48 connections: [], ··· 73 69 } 74 70 75 71 if(type){ 76 - node.outputs.push({ 72 + tempOutputs.push({ 77 73 name: dat.desc === '' ? dat.type : dat.desc, 78 74 type: type, 79 75 connections: [], ··· 83 79 } 84 80 }); 85 81 86 - node.h = 60 + (parameters.length + 1) * 30; 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 + 87 104 NodeManager.Instance.UpdateConfig(); 88 105 } 89 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 2 import { NodeDefinition } from "../Nodes"; 3 3 4 4 export let NodeStaticsFloat: NodeDefinition = { 5 + os: 'any', 6 + 5 7 isSingle: true, 6 8 name: 'Float', 7 9 typeId: 'staticfloat', 8 10 9 11 w: 200, 10 - h: 85, 11 12 12 13 statics: [{ 13 14 type: NodeType.Float, 14 15 name: 'Value', 15 - value: null 16 + value: 0.0 16 17 }], 17 18 18 19 outputs: [{ name: "Float", type: NodeType.Float }],
+3 -2
src/Nodes/Statics/Int.tsx
··· 2 2 import { NodeDefinition } from "../Nodes"; 3 3 4 4 export let NodeStaticsInt: NodeDefinition = { 5 + os: 'any', 6 + 5 7 isSingle: true, 6 8 name: 'Int', 7 9 typeId: 'staticint', 8 10 9 11 w: 200, 10 - h: 85, 11 12 12 13 statics: [{ 13 14 type: NodeType.Int, 14 15 name: 'Value', 15 - value: null 16 + value: 0 16 17 }], 17 18 18 19 outputs: [{ name: "Int", type: NodeType.Int }],
+3 -2
src/Nodes/Statics/String.tsx
··· 2 2 import { NodeDefinition } from "../Nodes"; 3 3 4 4 export let NodeStaticsString: NodeDefinition = { 5 + os: 'any', 6 + 5 7 isSingle: true, 6 8 name: 'String', 7 9 typeId: 'staticstring', 8 10 9 11 w: 200, 10 - h: 85, 11 12 12 13 statics: [{ 13 14 type: NodeType.String, 14 15 name: 'Value', 15 - value: null 16 + value: 'Hello World!' 16 17 }], 17 18 18 19 outputs: [{ name: "String", type: NodeType.String }],
+2
src/Nodes/Statics.tsx
··· 5 5 import { NodeStaticsString } from "./Statics/String"; 6 6 7 7 export let NodeStatics: NodeDefinition = { 8 + os: 'any', 9 + 8 10 isSingle: false, 9 11 name: 'Statics', 10 12 items: [
+1 -1
src/components/ConfirmationPopup.tsx
··· 10 10 <div class="confirmation-popup"> 11 11 <h2>{ConfirmationManager.Instance.Text()}</h2> 12 12 <p>{ConfirmationManager.Instance.Body()}</p> 13 - 13 + 14 14 <div class="confirmation-buttons"> 15 15 <For each={ConfirmationManager.Instance.Buttons()}> 16 16 { item =>
+8 -12
src/components/ControlBar.tsx
··· 1 1 import './ControlBar.css'; 2 2 3 - import { Accessor, createEffect, createSignal, For, Match, Show, Switch } from 'solid-js'; 3 + import { Accessor, createSignal, For, Match, Show, Switch } from 'solid-js'; 4 4 import { Node, NodeType } from '../structs/node'; 5 5 import { TextInput } from './TextInput'; 6 6 import { invoke } from '@tauri-apps/api/core'; ··· 9 9 import { NodeManager } from '../Mangers/NodeManager'; 10 10 11 11 export interface ControlBarProps{ 12 - node: Accessor<Node | null>, 12 + node: Accessor<Node[]>, 13 13 lockMovement: ( lock: boolean ) => void 14 14 } 15 15 16 16 export let ControlBar = ( props: ControlBarProps ) => { 17 - createEffect(() => { 18 - console.log(props.node()); 19 - }) 20 - 21 17 return ( 22 18 <div class="control-bar"> 23 - <For each={props.node()?.statics}> 19 + <For each={props.node()[0]?.statics}> 24 20 { ( item ) => { 25 21 let [ popupOpen, setPopupOpen ] = createSignal(false); 26 22 ··· 36 32 value={item.value || ''} 37 33 onChange={( el ) => { 38 34 let value = el.target.value; 39 - let node = props.node()!; 35 + let node = props.node()[0]!; 40 36 41 37 item.value = value; 42 38 node.onStaticsUpdate(node); ··· 54 50 value={item.value !== undefined ? item.value : ''} 55 51 onChange={( el ) => { 56 52 let value = el.target.value; 57 - let node = props.node()!; 53 + let node = props.node()[0]!; 58 54 59 55 item.value = parseInt(value); 60 56 node.onStaticsUpdate(node); ··· 72 68 value={item.value !== undefined ? item.value : ''} 73 69 onChange={( el ) => { 74 70 let value = el.target.value; 75 - let node = props.node()!; 71 + let node = props.node()[0]!; 76 72 77 73 item.value = parseFloat(value); 78 74 node.onStaticsUpdate(node); ··· 92 88 return addresses.map(x => x.address).filter(x => x.toLowerCase().includes(text.toLowerCase())); 93 89 }} 94 90 change={( text ) => { 95 - let node = props.node()!; 91 + let node = props.node()[0]!; 96 92 97 93 item.value = text; 98 94 node.onStaticsUpdate(node); ··· 118 114 }} 119 115 value={item.value} 120 116 changed={( value ) => { 121 - let node = props.node()!; 117 + let node = props.node()[0]!; 122 118 123 119 item.value = value; 124 120 node.onStaticsUpdate(node);
+23
src/components/ParameterList.css
··· 59 59 60 60 .parameter-list-button-dropdown > div:hover{ 61 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; 62 85 }
+12 -1
src/components/ParameterList.tsx
··· 22 22 </div> 23 23 <div class="parameter-list-content"> 24 24 <For each={parameters()}> 25 - { i => <div>{ JSON.stringify(i) }</div>} 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>} 26 37 </For> 27 38 <div class="button" onClick={() => { setAddParametersOpen(!addParametersOpen()) }}>Add Parameter + </div> 28 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 12 overflow-y: auto; 13 13 } 14 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 + 15 22 .tab{ 16 23 border-radius: 10px; 17 24 padding: 8px 10px; ··· 95 102 transform: translate(-10px, 35px); 96 103 border-radius: 10px; 97 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; 98 127 }
+69 -50
src/components/TabMenu.tsx
··· 1 - import { createSignal, For, onMount, Show } from 'solid-js'; 2 1 import './TabMenu.css'; 2 + 3 + import { createSignal, For, onMount, Show } from 'solid-js'; 3 4 import { NodeManager } from '../Mangers/NodeManager'; 4 5 import { Tab } from '../structs/Tab'; 6 + import { SettingsMenu } from './SettingsMenu'; 7 + import { openUrl } from '@tauri-apps/plugin-opener'; 5 8 6 9 export let TabMenu = () => { 7 10 let [ tabImportOpen, setTabImportOpen ] = createSignal(false); 8 11 let [ tabs, setTabs ] = createSignal<Tab[]>([], { equals: false }); 12 + 13 + let [ settingsOpen, setSettingsOpen ] = createSignal(false); 9 14 10 15 let closeTabImportMenu = () => { 11 16 window.removeEventListener('click', closeTabImportMenu); ··· 17 22 }); 18 23 19 24 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> 25 + <> 26 + <Show when={settingsOpen()}> 27 + <SettingsMenu close={() => setSettingsOpen(false)} /> 28 + </Show> 37 29 38 - </div> 39 - <div class="tab-meta" onDblClick={( e ) => { 40 - let input = <input class="tab-meta-input" value={ e.target.innerHTML } /> as HTMLInputElement; 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> 41 70 42 - e.target.innerHTML = ''; 43 - e.target.appendChild(input); 71 + <div class="tab" onClick={() => { 72 + NodeManager.Instance.AddTab("Untitled"); 73 + }} onContextMenu={( e ) => { 74 + e.preventDefault(); 75 + setTabImportOpen(true); 44 76 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> 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> 56 85 </div> 57 - } 58 - </For> 86 + </div> 59 87 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> 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')} /> 71 92 </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 93 </div> 75 - </div> 94 + </> 76 95 ) 77 96 }
+1 -1
src/index.tsx
··· 8 8 new NodeManager(); 9 9 new ConfirmationManager(); 10 10 11 - render(() => <App />, document.getElementById("root") as HTMLElement); 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 63 let nodeX = Math.round(node.x / 10) * 10; 64 64 let nodeY = Math.round(node.y / 10) * 10; 65 65 66 - ctx.fillStyle = '#1f2129'; 67 - ctx.strokeStyle = node.selected ? '#004696ff' : '#fff5'; 66 + ctx.fillStyle = '#343742ff'; 67 + ctx.strokeStyle = node.selected ? '#004696ff' : '#fff0'; 68 68 ctx.lineWidth = 5 * position.scale; 69 69 70 70 // Draw Node Box ··· 74 74 node.w * position.scale, 75 75 node.h * position.scale, 76 76 10 * position.scale); 77 + 78 + ctx.shadowColor = '#0005'; 79 + ctx.shadowBlur = 10; 77 80 78 81 ctx.stroke(); 79 82 ctx.fill(); 80 83 84 + ctx.shadowBlur = 0; 85 + 81 86 // Draw Node Name 82 87 ctx.fillStyle = '#fff'; 83 - ctx.font = (25 * position.scale) + 'px Comic Mono'; 88 + ctx.font = (25 * position.scale) + 'px Rubik'; 84 89 ctx.textAlign = 'center'; 85 90 86 91 ctx.fillText(node.name, ··· 89 94 ); 90 95 91 96 // Draw Inputs 92 - ctx.font = (15 * position.scale) + 'px Comic Mono'; 97 + ctx.font = (15 * position.scale) + 'px Rubik'; 93 98 ctx.textAlign = 'left'; 94 99 95 100 node.inputs.map(( input, i ) => { 96 101 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.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(); 102 112 103 113 ctx.fillText(input.name, 104 - (nodeX + 35 + startX + position.x) * position.scale, 114 + (nodeX + 15 + startX + position.x) * position.scale, 105 115 (nodeY + 53 + (30 * i) + startY + position.y) * position.scale, 106 116 ) 107 117 }) ··· 111 121 112 122 node.outputs.map(( output, i ) => { 113 123 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 - ) 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(); 119 134 120 135 ctx.fillText(output.name, 121 - (nodeX + (node.w - 35) + startX + position.x) * position.scale, 136 + (nodeX + (node.w - 15) + startX + position.x) * position.scale, 122 137 (nodeY + 53 + (30 * i) + startY + position.y) * position.scale, 123 138 ) 124 139 }) ··· 130 145 131 146 node.outputs.map(( output, i ) => { 132 147 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 - ); 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); 140 163 ctx.stroke(); 141 164 }) 142 165 }) ··· 148 171 contextMenu: ContextMenu 149 172 ) => { 150 173 if(contextMenu.visible){ 151 - ctx.font = '20px Arial'; 174 + ctx.font = '20px Rubik'; 152 175 ctx.textBaseline = 'top'; 153 176 ctx.textAlign = 'left'; 154 177 ··· 192 215 let startX = canvas.width / -2; 193 216 let startY = canvas.height / -2; 194 217 195 - ctx.fillStyle = '#f00'; 218 + // DEBUG STUFF 219 + // ctx.fillStyle = '#f00'; 196 220 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 - ); 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 + // ); 202 226 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 - ); 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 + // ); 208 232 209 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 + 210 239 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, 240 + (nodeX + (drawingFrom.parent.w - 10) + 10 + startX + position.x) * position.scale, 241 + (nodeY + 50 + (30 * drawingFrom.index) + 10 + startY + position.y) * position.scale, 213 242 (drawingTo[0] + 10 + startX + position.x) * position.scale, 214 243 (drawingTo[1] + 10 + startY + position.y) * position.scale, 215 244 ); ··· 239 268 ) => { 240 269 ctx.fillStyle = '#fff'; 241 270 242 - ctx.font = '20px Arial'; 271 + ctx.font = '20px Rubik'; 243 272 ctx.textBaseline = 'middle'; 244 273 ctx.textAlign = 'center'; 245 274 246 275 let textX = lerp((canvas.width / -2) + 200, canvas.width / 2, 0.5); 247 276 let textY = lerp((canvas.height / -2) + 40, canvas.height / 2, 0.5); 248 277 249 - ctx.font = '40px Arial'; 278 + ctx.font = '40px Rubik'; 250 279 ctx.fillText('Welcome to VRCMacros', textX, textY); 251 280 252 - ctx.font = '20px Arial'; 281 + ctx.font = '20px Rubik'; 253 282 ctx.fillText('Create a new tab to get started!', textX, textY + 40); 254 283 } 255 284
+1 -1
src/structs/Tab.ts
··· 13 13 needsSave: Accessor<boolean>, 14 14 setNeedsSave: Setter<boolean>, 15 15 16 - refuseSync: boolean 16 + needSync: boolean 17 17 }
+41 -3
src/structs/node.ts
··· 20 20 this.typeId = node.typeId!; 21 21 this.x = pos[0]; 22 22 this.y = pos[1]; 23 - this.w = node.w!; 24 - this.h = node.h!; 25 23 26 24 this.inputs = node.inputs ? node.inputs.map(( x, indx ) => { 27 25 return { ··· 43 41 } 44 42 }) : []; 45 43 44 + this.w = node.w || 200; 45 + this.h = 50 + Math.max(this.outputs.length, this.inputs.length) * 30; 46 + 46 47 this.selected = false; 47 48 this.statics = node.statics!, 48 49 this.onStaticsUpdate = node.onStaticsUpdate!; 49 50 } 51 + 52 + updateSize(){ 53 + this.h = 50 + Math.max(this.outputs.length, this.inputs.length) * 30; 54 + } 50 55 } 51 56 52 57 export interface NodeIO{ ··· 74 79 ParameterList = 10 75 80 } 76 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 + 77 102 export let NodeIOResolveAnyTypes = ( nodeio: NodeIO ): NodeType | null => { 78 103 if(nodeio.type > 0 && nodeio.type < 6){ 79 104 // It's a base type ··· 105 130 return null; 106 131 } 107 132 108 - export let NodeIOLinkColours = ( nodeio: NodeIO ) => { 133 + export let NodeIOLinkColours = ( nodeio: NodeIO, output?: NodeIO ) => { 109 134 let cols: any = { 110 135 1: '#ffff9f', 111 136 2: '#cda0cb', ··· 115 140 } 116 141 117 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 + 118 156 return type ? cols[type] : '#fff5'; 119 157 } 120 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 7 version = "0.1.0" 8 8 dependencies = [ 9 9 "anyhow", 10 + "chrono", 10 11 "crossbeam-channel", 11 12 "dirs", 13 + "enigo", 12 14 "flate2", 13 15 "serde", 14 16 "serde_json", 15 17 "tauri", 16 18 "tauri-build", 19 + "tauri-plugin-clipboard-manager", 17 20 "tauri-plugin-dialog", 18 21 "tauri-plugin-opener", 22 + "tauri-plugin-os", 19 23 "tokio", 20 24 ] 21 25 22 26 [[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 27 name = "adler2" 33 28 version = "2.0.1" 34 29 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 36 31 37 32 [[package]] 38 33 name = "aho-corasick" 39 - version = "1.1.3" 34 + version = "1.1.4" 40 35 source = "registry+https://github.com/rust-lang/crates.io-index" 41 - checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 36 + checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" 42 37 dependencies = [ 43 38 "memchr", 44 39 ] ··· 59 54 ] 60 55 61 56 [[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 57 name = "android_system_properties" 69 58 version = "0.1.5" 70 59 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 75 64 76 65 [[package]] 77 66 name = "anyhow" 78 - version = "1.0.99" 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" 79 74 source = "registry+https://github.com/rust-lang/crates.io-index" 80 - checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" 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 + ] 81 91 82 92 [[package]] 83 93 name = "ashpd" ··· 126 136 127 137 [[package]] 128 138 name = "async-executor" 129 - version = "1.13.2" 139 + version = "1.13.3" 130 140 source = "registry+https://github.com/rust-lang/crates.io-index" 131 - checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" 141 + checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" 132 142 dependencies = [ 133 143 "async-task", 134 144 "concurrent-queue", ··· 140 150 141 151 [[package]] 142 152 name = "async-io" 143 - version = "2.5.0" 153 + version = "2.6.0" 144 154 source = "registry+https://github.com/rust-lang/crates.io-index" 145 - checksum = "19634d6336019ef220f09fd31168ce5c184b295cbf80345437cc36094ef223ca" 155 + checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" 146 156 dependencies = [ 147 - "async-lock", 157 + "autocfg", 148 158 "cfg-if", 149 159 "concurrent-queue", 150 160 "futures-io", 151 161 "futures-lite", 152 162 "parking", 153 163 "polling", 154 - "rustix", 164 + "rustix 1.1.2", 155 165 "slab", 156 - "windows-sys 0.60.2", 166 + "windows-sys 0.61.2", 157 167 ] 158 168 159 169 [[package]] 160 170 name = "async-lock" 161 - version = "3.4.0" 171 + version = "3.4.1" 162 172 source = "registry+https://github.com/rust-lang/crates.io-index" 163 - checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" 173 + checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" 164 174 dependencies = [ 165 175 "event-listener", 166 176 "event-listener-strategy", ··· 169 179 170 180 [[package]] 171 181 name = "async-process" 172 - version = "2.4.0" 182 + version = "2.5.0" 173 183 source = "registry+https://github.com/rust-lang/crates.io-index" 174 - checksum = "65daa13722ad51e6ab1a1b9c01299142bc75135b337923cfa10e79bbbd669f00" 184 + checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" 175 185 dependencies = [ 176 186 "async-channel", 177 187 "async-io", ··· 182 192 "cfg-if", 183 193 "event-listener", 184 194 "futures-lite", 185 - "rustix", 195 + "rustix 1.1.2", 186 196 ] 187 197 188 198 [[package]] ··· 193 203 dependencies = [ 194 204 "proc-macro2", 195 205 "quote", 196 - "syn 2.0.104", 206 + "syn 2.0.109", 197 207 ] 198 208 199 209 [[package]] 200 210 name = "async-signal" 201 - version = "0.2.12" 211 + version = "0.2.13" 202 212 source = "registry+https://github.com/rust-lang/crates.io-index" 203 - checksum = "f567af260ef69e1d52c2b560ce0ea230763e6fbb9214a85d768760a920e3e3c1" 213 + checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" 204 214 dependencies = [ 205 215 "async-io", 206 216 "async-lock", ··· 208 218 "cfg-if", 209 219 "futures-core", 210 220 "futures-io", 211 - "rustix", 221 + "rustix 1.1.2", 212 222 "signal-hook-registry", 213 223 "slab", 214 - "windows-sys 0.60.2", 224 + "windows-sys 0.61.2", 215 225 ] 216 226 217 227 [[package]] ··· 222 232 223 233 [[package]] 224 234 name = "async-trait" 225 - version = "0.1.88" 235 + version = "0.1.89" 226 236 source = "registry+https://github.com/rust-lang/crates.io-index" 227 - checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" 237 + checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" 228 238 dependencies = [ 229 239 "proc-macro2", 230 240 "quote", 231 - "syn 2.0.104", 241 + "syn 2.0.109", 232 242 ] 233 243 234 244 [[package]] ··· 267 277 checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 268 278 269 279 [[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 280 name = "base64" 286 281 version = "0.21.7" 287 282 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 301 296 302 297 [[package]] 303 298 name = "bitflags" 304 - version = "2.9.1" 299 + version = "2.10.0" 305 300 source = "registry+https://github.com/rust-lang/crates.io-index" 306 - checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" 301 + checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" 307 302 dependencies = [ 308 - "serde", 303 + "serde_core", 309 304 ] 310 305 311 306 [[package]] ··· 328 323 329 324 [[package]] 330 325 name = "block2" 331 - version = "0.6.1" 326 + version = "0.6.2" 332 327 source = "registry+https://github.com/rust-lang/crates.io-index" 333 - checksum = "340d2f0bdb2a43c1d3cd40513185b2bd7def0aa1052f956455114bc98f82dcf2" 328 + checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" 334 329 dependencies = [ 335 - "objc2 0.6.1", 330 + "objc2 0.6.3", 336 331 ] 337 332 338 333 [[package]] ··· 350 345 351 346 [[package]] 352 347 name = "brotli" 353 - version = "8.0.1" 348 + version = "8.0.2" 354 349 source = "registry+https://github.com/rust-lang/crates.io-index" 355 - checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" 350 + checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" 356 351 dependencies = [ 357 352 "alloc-no-stdlib", 358 353 "alloc-stdlib", ··· 377 372 378 373 [[package]] 379 374 name = "bytemuck" 380 - version = "1.23.1" 375 + version = "1.24.0" 381 376 source = "registry+https://github.com/rust-lang/crates.io-index" 382 - checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" 377 + checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" 383 378 384 379 [[package]] 385 380 name = "byteorder" 386 381 version = "1.5.0" 387 382 source = "registry+https://github.com/rust-lang/crates.io-index" 388 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" 389 390 390 391 [[package]] 391 392 name = "bytes" ··· 402 403 source = "registry+https://github.com/rust-lang/crates.io-index" 403 404 checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" 404 405 dependencies = [ 405 - "bitflags 2.9.1", 406 + "bitflags 2.10.0", 406 407 "cairo-sys-rs", 407 408 "glib", 408 409 "libc", ··· 423 424 424 425 [[package]] 425 426 name = "camino" 426 - version = "1.1.10" 427 + version = "1.2.1" 427 428 source = "registry+https://github.com/rust-lang/crates.io-index" 428 - checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" 429 + checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" 429 430 dependencies = [ 430 - "serde", 431 + "serde_core", 431 432 ] 432 433 433 434 [[package]] ··· 450 451 "semver", 451 452 "serde", 452 453 "serde_json", 453 - "thiserror 2.0.12", 454 + "thiserror 2.0.17", 454 455 ] 455 456 456 457 [[package]] ··· 460 461 checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" 461 462 dependencies = [ 462 463 "serde", 463 - "toml 0.9.3", 464 + "toml 0.9.8", 464 465 ] 465 466 466 467 [[package]] 467 468 name = "cc" 468 - version = "1.2.30" 469 + version = "1.2.45" 469 470 source = "registry+https://github.com/rust-lang/crates.io-index" 470 - checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" 471 + checksum = "35900b6c8d709fb1d854671ae27aeaa9eec2f8b01b364e1619a40da3e6fe2afe" 471 472 dependencies = [ 473 + "find-msvc-tools", 472 474 "shlex", 473 475 ] 474 476 ··· 501 503 502 504 [[package]] 503 505 name = "cfg-if" 504 - version = "1.0.1" 506 + version = "1.0.4" 505 507 source = "registry+https://github.com/rust-lang/crates.io-index" 506 - checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" 508 + checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" 507 509 508 510 [[package]] 509 511 name = "cfg_aliases" ··· 513 515 514 516 [[package]] 515 517 name = "chrono" 516 - version = "0.4.41" 518 + version = "0.4.42" 517 519 source = "registry+https://github.com/rust-lang/crates.io-index" 518 - checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" 520 + checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" 519 521 dependencies = [ 520 - "android-tzdata", 521 522 "iana-time-zone", 523 + "js-sys", 522 524 "num-traits", 523 525 "serde", 524 - "windows-link", 526 + "wasm-bindgen", 527 + "windows-link 0.2.1", 528 + ] 529 + 530 + [[package]] 531 + name = "clipboard-win" 532 + version = "5.4.1" 533 + source = "registry+https://github.com/rust-lang/crates.io-index" 534 + checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" 535 + dependencies = [ 536 + "error-code", 525 537 ] 526 538 527 539 [[package]] ··· 581 593 source = "registry+https://github.com/rust-lang/crates.io-index" 582 594 checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" 583 595 dependencies = [ 584 - "bitflags 2.9.1", 596 + "bitflags 2.10.0", 597 + "core-foundation", 598 + "core-graphics-types", 599 + "foreign-types", 600 + "libc", 601 + ] 602 + 603 + [[package]] 604 + name = "core-graphics" 605 + version = "0.25.0" 606 + source = "registry+https://github.com/rust-lang/crates.io-index" 607 + checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" 608 + dependencies = [ 609 + "bitflags 2.10.0", 585 610 "core-foundation", 586 611 "core-graphics-types", 587 612 "foreign-types", ··· 594 619 source = "registry+https://github.com/rust-lang/crates.io-index" 595 620 checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" 596 621 dependencies = [ 597 - "bitflags 2.9.1", 622 + "bitflags 2.10.0", 598 623 "core-foundation", 599 624 "libc", 600 625 ] ··· 633 658 checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 634 659 635 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]] 636 667 name = "crypto-common" 637 668 version = "0.1.6" 638 669 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 666 697 checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" 667 698 dependencies = [ 668 699 "quote", 669 - "syn 2.0.104", 700 + "syn 2.0.109", 670 701 ] 671 702 672 703 [[package]] ··· 676 707 checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" 677 708 dependencies = [ 678 709 "quote", 679 - "syn 2.0.104", 710 + "syn 2.0.109", 680 711 ] 681 712 682 713 [[package]] 683 714 name = "darling" 684 - version = "0.20.11" 715 + version = "0.21.3" 685 716 source = "registry+https://github.com/rust-lang/crates.io-index" 686 - checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" 717 + checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" 687 718 dependencies = [ 688 719 "darling_core", 689 720 "darling_macro", ··· 691 722 692 723 [[package]] 693 724 name = "darling_core" 694 - version = "0.20.11" 725 + version = "0.21.3" 695 726 source = "registry+https://github.com/rust-lang/crates.io-index" 696 - checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" 727 + checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" 697 728 dependencies = [ 698 729 "fnv", 699 730 "ident_case", 700 731 "proc-macro2", 701 732 "quote", 702 733 "strsim", 703 - "syn 2.0.104", 734 + "syn 2.0.109", 704 735 ] 705 736 706 737 [[package]] 707 738 name = "darling_macro" 708 - version = "0.20.11" 739 + version = "0.21.3" 709 740 source = "registry+https://github.com/rust-lang/crates.io-index" 710 - checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" 741 + checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" 711 742 dependencies = [ 712 743 "darling_core", 713 744 "quote", 714 - "syn 2.0.104", 745 + "syn 2.0.109", 715 746 ] 716 747 717 748 [[package]] 718 749 name = "deranged" 719 - version = "0.4.0" 750 + version = "0.5.5" 720 751 source = "registry+https://github.com/rust-lang/crates.io-index" 721 - checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" 752 + checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" 722 753 dependencies = [ 723 754 "powerfmt", 724 - "serde", 755 + "serde_core", 725 756 ] 726 757 727 758 [[package]] ··· 734 765 "proc-macro2", 735 766 "quote", 736 767 "rustc_version", 737 - "syn 2.0.104", 768 + "syn 2.0.109", 738 769 ] 739 770 740 771 [[package]] ··· 765 796 "libc", 766 797 "option-ext", 767 798 "redox_users", 768 - "windows-sys 0.60.2", 799 + "windows-sys 0.61.2", 769 800 ] 770 801 771 802 [[package]] ··· 780 811 source = "registry+https://github.com/rust-lang/crates.io-index" 781 812 checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" 782 813 dependencies = [ 783 - "bitflags 2.9.1", 784 - "block2 0.6.1", 814 + "bitflags 2.10.0", 815 + "block2 0.6.2", 785 816 "libc", 786 - "objc2 0.6.1", 817 + "objc2 0.6.3", 787 818 ] 788 819 789 820 [[package]] ··· 794 825 dependencies = [ 795 826 "proc-macro2", 796 827 "quote", 797 - "syn 2.0.104", 828 + "syn 2.0.109", 798 829 ] 799 830 800 831 [[package]] ··· 803 834 source = "registry+https://github.com/rust-lang/crates.io-index" 804 835 checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" 805 836 dependencies = [ 806 - "libloading", 837 + "libloading 0.8.9", 807 838 ] 808 839 809 840 [[package]] 810 841 name = "dlopen2" 811 - version = "0.7.0" 842 + version = "0.8.0" 812 843 source = "registry+https://github.com/rust-lang/crates.io-index" 813 - checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6" 844 + checksum = "b54f373ccf864bf587a89e880fb7610f8d73f3045f13580948ccbcaff26febff" 814 845 dependencies = [ 815 846 "dlopen2_derive", 816 847 "libc", ··· 826 857 dependencies = [ 827 858 "proc-macro2", 828 859 "quote", 829 - "syn 2.0.104", 860 + "syn 2.0.109", 830 861 ] 831 862 832 863 [[package]] ··· 873 904 874 905 [[package]] 875 906 name = "embed-resource" 876 - version = "3.0.5" 907 + version = "3.0.6" 877 908 source = "registry+https://github.com/rust-lang/crates.io-index" 878 - checksum = "4c6d81016d6c977deefb2ef8d8290da019e27cc26167e102185da528e6c0ab38" 909 + checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" 879 910 dependencies = [ 880 911 "cc", 881 912 "memchr", 882 913 "rustc_version", 883 - "toml 0.9.3", 914 + "toml 0.9.8", 884 915 "vswhom", 885 916 "winreg", 886 917 ] ··· 898 929 checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" 899 930 900 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]] 901 953 name = "enumflags2" 902 954 version = "0.7.12" 903 955 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 915 967 dependencies = [ 916 968 "proc-macro2", 917 969 "quote", 918 - "syn 2.0.104", 970 + "syn 2.0.109", 919 971 ] 920 972 921 973 [[package]] ··· 926 978 927 979 [[package]] 928 980 name = "erased-serde" 929 - version = "0.4.6" 981 + version = "0.4.9" 930 982 source = "registry+https://github.com/rust-lang/crates.io-index" 931 - checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" 983 + checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" 932 984 dependencies = [ 933 985 "serde", 986 + "serde_core", 934 987 "typeid", 935 988 ] 936 989 937 990 [[package]] 938 991 name = "errno" 939 - version = "0.3.13" 992 + version = "0.3.14" 940 993 source = "registry+https://github.com/rust-lang/crates.io-index" 941 - checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" 994 + checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" 942 995 dependencies = [ 943 996 "libc", 944 - "windows-sys 0.60.2", 997 + "windows-sys 0.61.2", 945 998 ] 946 999 947 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]] 948 1007 name = "event-listener" 949 - version = "5.4.0" 1008 + version = "5.4.1" 950 1009 source = "registry+https://github.com/rust-lang/crates.io-index" 951 - checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 1010 + checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" 952 1011 dependencies = [ 953 1012 "concurrent-queue", 954 1013 "parking", ··· 972 1031 checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 973 1032 974 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]] 975 1054 name = "fdeflate" 976 1055 version = "0.3.7" 977 1056 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 991 1070 ] 992 1071 993 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]] 994 1085 name = "flate2" 995 - version = "1.1.2" 1086 + version = "1.1.5" 996 1087 source = "registry+https://github.com/rust-lang/crates.io-index" 997 - checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" 1088 + checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" 998 1089 dependencies = [ 999 1090 "crc32fast", 1000 1091 "miniz_oxide", ··· 1007 1098 checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 1008 1099 1009 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]] 1010 1107 name = "foreign-types" 1011 1108 version = "0.5.0" 1012 1109 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1024 1121 dependencies = [ 1025 1122 "proc-macro2", 1026 1123 "quote", 1027 - "syn 2.0.104", 1124 + "syn 2.0.109", 1028 1125 ] 1029 1126 1030 1127 [[package]] ··· 1035 1132 1036 1133 [[package]] 1037 1134 name = "form_urlencoded" 1038 - version = "1.2.1" 1135 + version = "1.2.2" 1039 1136 source = "registry+https://github.com/rust-lang/crates.io-index" 1040 - checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 1137 + checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 1041 1138 dependencies = [ 1042 1139 "percent-encoding", 1043 1140 ] ··· 1086 1183 1087 1184 [[package]] 1088 1185 name = "futures-lite" 1089 - version = "2.6.0" 1186 + version = "2.6.1" 1090 1187 source = "registry+https://github.com/rust-lang/crates.io-index" 1091 - checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" 1188 + checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" 1092 1189 dependencies = [ 1093 1190 "fastrand", 1094 1191 "futures-core", ··· 1105 1202 dependencies = [ 1106 1203 "proc-macro2", 1107 1204 "quote", 1108 - "syn 2.0.104", 1205 + "syn 2.0.109", 1109 1206 ] 1110 1207 1111 1208 [[package]] ··· 1247 1344 1248 1345 [[package]] 1249 1346 name = "generic-array" 1250 - version = "0.14.7" 1347 + version = "0.14.9" 1251 1348 source = "registry+https://github.com/rust-lang/crates.io-index" 1252 - checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 1349 + checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" 1253 1350 dependencies = [ 1254 1351 "typenum", 1255 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", 1256 1363 ] 1257 1364 1258 1365 [[package]] ··· 1279 1386 1280 1387 [[package]] 1281 1388 name = "getrandom" 1282 - version = "0.3.3" 1389 + version = "0.3.4" 1283 1390 source = "registry+https://github.com/rust-lang/crates.io-index" 1284 - checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 1391 + checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" 1285 1392 dependencies = [ 1286 1393 "cfg-if", 1287 1394 "libc", 1288 1395 "r-efi", 1289 - "wasi 0.14.2+wasi-0.2.4", 1396 + "wasip2", 1290 1397 ] 1291 1398 1292 1399 [[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 1400 name = "gio" 1300 1401 version = "0.18.4" 1301 1402 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1333 1434 source = "registry+https://github.com/rust-lang/crates.io-index" 1334 1435 checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" 1335 1436 dependencies = [ 1336 - "bitflags 2.9.1", 1437 + "bitflags 2.10.0", 1337 1438 "futures-channel", 1338 1439 "futures-core", 1339 1440 "futures-executor", ··· 1357 1458 checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" 1358 1459 dependencies = [ 1359 1460 "heck 0.4.1", 1360 - "proc-macro-crate 2.0.0", 1461 + "proc-macro-crate 2.0.2", 1361 1462 "proc-macro-error", 1362 1463 "proc-macro2", 1363 1464 "quote", 1364 - "syn 2.0.104", 1465 + "syn 2.0.109", 1365 1466 ] 1366 1467 1367 1468 [[package]] ··· 1376 1477 1377 1478 [[package]] 1378 1479 name = "glob" 1379 - version = "0.3.2" 1480 + version = "0.3.3" 1380 1481 source = "registry+https://github.com/rust-lang/crates.io-index" 1381 - checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 1482 + checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" 1382 1483 1383 1484 [[package]] 1384 1485 name = "gobject-sys" ··· 1440 1541 "proc-macro-error", 1441 1542 "proc-macro2", 1442 1543 "quote", 1443 - "syn 2.0.104", 1544 + "syn 2.0.109", 1545 + ] 1546 + 1547 + [[package]] 1548 + name = "half" 1549 + version = "2.7.1" 1550 + source = "registry+https://github.com/rust-lang/crates.io-index" 1551 + checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" 1552 + dependencies = [ 1553 + "cfg-if", 1554 + "crunchy", 1555 + "zerocopy", 1444 1556 ] 1445 1557 1446 1558 [[package]] ··· 1451 1563 1452 1564 [[package]] 1453 1565 name = "hashbrown" 1454 - version = "0.15.4" 1566 + version = "0.15.5" 1455 1567 source = "registry+https://github.com/rust-lang/crates.io-index" 1456 - checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" 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" 1457 1578 1458 1579 [[package]] 1459 1580 name = "heck" ··· 1533 1654 1534 1655 [[package]] 1535 1656 name = "hyper" 1536 - version = "1.6.0" 1657 + version = "1.7.0" 1537 1658 source = "registry+https://github.com/rust-lang/crates.io-index" 1538 - checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 1659 + checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" 1539 1660 dependencies = [ 1661 + "atomic-waker", 1540 1662 "bytes", 1541 1663 "futures-channel", 1542 - "futures-util", 1664 + "futures-core", 1543 1665 "http", 1544 1666 "http-body", 1545 1667 "httparse", 1546 1668 "itoa", 1547 1669 "pin-project-lite", 1670 + "pin-utils", 1548 1671 "smallvec", 1549 1672 "tokio", 1550 1673 "want", ··· 1552 1675 1553 1676 [[package]] 1554 1677 name = "hyper-util" 1555 - version = "0.1.16" 1678 + version = "0.1.17" 1556 1679 source = "registry+https://github.com/rust-lang/crates.io-index" 1557 - checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" 1680 + checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" 1558 1681 dependencies = [ 1559 1682 "base64 0.22.1", 1560 1683 "bytes", ··· 1576 1699 1577 1700 [[package]] 1578 1701 name = "iana-time-zone" 1579 - version = "0.1.63" 1702 + version = "0.1.64" 1580 1703 source = "registry+https://github.com/rust-lang/crates.io-index" 1581 - checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" 1704 + checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" 1582 1705 dependencies = [ 1583 1706 "android_system_properties", 1584 1707 "core-foundation-sys", ··· 1586 1709 "js-sys", 1587 1710 "log", 1588 1711 "wasm-bindgen", 1589 - "windows-core", 1712 + "windows-core 0.62.2", 1590 1713 ] 1591 1714 1592 1715 [[package]] ··· 1605 1728 checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" 1606 1729 dependencies = [ 1607 1730 "byteorder", 1608 - "png", 1731 + "png 0.17.16", 1609 1732 ] 1610 1733 1611 1734 [[package]] 1612 1735 name = "icu_collections" 1613 - version = "2.0.0" 1736 + version = "2.1.1" 1614 1737 source = "registry+https://github.com/rust-lang/crates.io-index" 1615 - checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 1738 + checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" 1616 1739 dependencies = [ 1617 1740 "displaydoc", 1618 1741 "potential_utf", ··· 1623 1746 1624 1747 [[package]] 1625 1748 name = "icu_locale_core" 1626 - version = "2.0.0" 1749 + version = "2.1.1" 1627 1750 source = "registry+https://github.com/rust-lang/crates.io-index" 1628 - checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 1751 + checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" 1629 1752 dependencies = [ 1630 1753 "displaydoc", 1631 1754 "litemap", ··· 1636 1759 1637 1760 [[package]] 1638 1761 name = "icu_normalizer" 1639 - version = "2.0.0" 1762 + version = "2.1.1" 1640 1763 source = "registry+https://github.com/rust-lang/crates.io-index" 1641 - checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 1764 + checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" 1642 1765 dependencies = [ 1643 - "displaydoc", 1644 1766 "icu_collections", 1645 1767 "icu_normalizer_data", 1646 1768 "icu_properties", ··· 1651 1773 1652 1774 [[package]] 1653 1775 name = "icu_normalizer_data" 1654 - version = "2.0.0" 1776 + version = "2.1.1" 1655 1777 source = "registry+https://github.com/rust-lang/crates.io-index" 1656 - checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 1778 + checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" 1657 1779 1658 1780 [[package]] 1659 1781 name = "icu_properties" 1660 - version = "2.0.1" 1782 + version = "2.1.1" 1661 1783 source = "registry+https://github.com/rust-lang/crates.io-index" 1662 - checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 1784 + checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" 1663 1785 dependencies = [ 1664 - "displaydoc", 1665 1786 "icu_collections", 1666 1787 "icu_locale_core", 1667 1788 "icu_properties_data", 1668 1789 "icu_provider", 1669 - "potential_utf", 1670 1790 "zerotrie", 1671 1791 "zerovec", 1672 1792 ] 1673 1793 1674 1794 [[package]] 1675 1795 name = "icu_properties_data" 1676 - version = "2.0.1" 1796 + version = "2.1.1" 1677 1797 source = "registry+https://github.com/rust-lang/crates.io-index" 1678 - checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 1798 + checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" 1679 1799 1680 1800 [[package]] 1681 1801 name = "icu_provider" 1682 - version = "2.0.0" 1802 + version = "2.1.1" 1683 1803 source = "registry+https://github.com/rust-lang/crates.io-index" 1684 - checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 1804 + checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" 1685 1805 dependencies = [ 1686 1806 "displaydoc", 1687 1807 "icu_locale_core", 1688 - "stable_deref_trait", 1689 - "tinystr", 1690 1808 "writeable", 1691 1809 "yoke", 1692 1810 "zerofrom", ··· 1702 1820 1703 1821 [[package]] 1704 1822 name = "idna" 1705 - version = "1.0.3" 1823 + version = "1.1.0" 1706 1824 source = "registry+https://github.com/rust-lang/crates.io-index" 1707 - checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 1825 + checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 1708 1826 dependencies = [ 1709 1827 "idna_adapter", 1710 1828 "smallvec", ··· 1722 1840 ] 1723 1841 1724 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]] 1725 1857 name = "indexmap" 1726 1858 version = "1.9.3" 1727 1859 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1734 1866 1735 1867 [[package]] 1736 1868 name = "indexmap" 1737 - version = "2.10.0" 1869 + version = "2.12.0" 1738 1870 source = "registry+https://github.com/rust-lang/crates.io-index" 1739 - checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" 1871 + checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" 1740 1872 dependencies = [ 1741 1873 "equivalent", 1742 - "hashbrown 0.15.4", 1874 + "hashbrown 0.16.0", 1743 1875 "serde", 1876 + "serde_core", 1744 1877 ] 1745 1878 1746 1879 [[package]] ··· 1753 1886 ] 1754 1887 1755 1888 [[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 1889 name = "ipnet" 1768 1890 version = "2.11.0" 1769 1891 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1771 1893 1772 1894 [[package]] 1773 1895 name = "iri-string" 1774 - version = "0.7.8" 1896 + version = "0.7.9" 1775 1897 source = "registry+https://github.com/rust-lang/crates.io-index" 1776 - checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" 1898 + checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" 1777 1899 dependencies = [ 1778 1900 "memchr", 1779 1901 "serde", ··· 1851 1973 1852 1974 [[package]] 1853 1975 name = "js-sys" 1854 - version = "0.3.77" 1976 + version = "0.3.82" 1855 1977 source = "registry+https://github.com/rust-lang/crates.io-index" 1856 - checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 1978 + checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" 1857 1979 dependencies = [ 1858 1980 "once_cell", 1859 1981 "wasm-bindgen", ··· 1887 2009 source = "registry+https://github.com/rust-lang/crates.io-index" 1888 2010 checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" 1889 2011 dependencies = [ 1890 - "bitflags 2.9.1", 2012 + "bitflags 2.10.0", 1891 2013 "serde", 1892 2014 "unicode-segmentation", 1893 2015 ] ··· 1900 2022 dependencies = [ 1901 2023 "cssparser", 1902 2024 "html5ever", 1903 - "indexmap 2.10.0", 2025 + "indexmap 2.12.0", 1904 2026 "selectors", 1905 2027 ] 1906 2028 ··· 1930 2052 checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" 1931 2053 dependencies = [ 1932 2054 "gtk-sys", 1933 - "libloading", 2055 + "libloading 0.7.4", 1934 2056 "once_cell", 1935 2057 ] 1936 2058 1937 2059 [[package]] 1938 2060 name = "libc" 1939 - version = "0.2.174" 2061 + version = "0.2.177" 1940 2062 source = "registry+https://github.com/rust-lang/crates.io-index" 1941 - checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" 2063 + checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" 1942 2064 1943 2065 [[package]] 1944 2066 name = "libloading" ··· 1951 2073 ] 1952 2074 1953 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]] 1954 2086 name = "libredox" 1955 - version = "0.1.8" 2087 + version = "0.1.10" 1956 2088 source = "registry+https://github.com/rust-lang/crates.io-index" 1957 - checksum = "360e552c93fa0e8152ab463bc4c4837fce76a225df11dfaeea66c313de5e61f7" 2089 + checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" 1958 2090 dependencies = [ 1959 - "bitflags 2.9.1", 2091 + "bitflags 2.10.0", 1960 2092 "libc", 1961 2093 ] 1962 2094 1963 2095 [[package]] 1964 2096 name = "linux-raw-sys" 1965 - version = "0.9.4" 2097 + version = "0.4.15" 1966 2098 source = "registry+https://github.com/rust-lang/crates.io-index" 1967 - checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 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" 1968 2106 1969 2107 [[package]] 1970 2108 name = "litemap" 1971 - version = "0.8.0" 2109 + version = "0.8.1" 1972 2110 source = "registry+https://github.com/rust-lang/crates.io-index" 1973 - checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 2111 + checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" 1974 2112 1975 2113 [[package]] 1976 2114 name = "lock_api" 1977 - version = "0.4.13" 2115 + version = "0.4.14" 1978 2116 source = "registry+https://github.com/rust-lang/crates.io-index" 1979 - checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" 2117 + checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" 1980 2118 dependencies = [ 1981 - "autocfg", 1982 2119 "scopeguard", 1983 2120 ] 1984 2121 1985 2122 [[package]] 1986 2123 name = "log" 1987 - version = "0.4.27" 2124 + version = "0.4.28" 1988 2125 source = "registry+https://github.com/rust-lang/crates.io-index" 1989 - checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 2126 + checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" 1990 2127 1991 2128 [[package]] 1992 2129 name = "mac" ··· 2016 2153 dependencies = [ 2017 2154 "proc-macro2", 2018 2155 "quote", 2019 - "syn 2.0.104", 2156 + "syn 2.0.109", 2020 2157 ] 2021 2158 2022 2159 [[package]] ··· 2027 2164 2028 2165 [[package]] 2029 2166 name = "memchr" 2030 - version = "2.7.5" 2167 + version = "2.7.6" 2031 2168 source = "registry+https://github.com/rust-lang/crates.io-index" 2032 - checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" 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 + ] 2033 2179 2034 2180 [[package]] 2035 2181 name = "memoffset" ··· 2047 2193 checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 2048 2194 2049 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]] 2050 2202 name = "miniz_oxide" 2051 2203 version = "0.8.9" 2052 2204 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2058 2210 2059 2211 [[package]] 2060 2212 name = "mio" 2061 - version = "1.0.4" 2213 + version = "1.1.0" 2062 2214 source = "registry+https://github.com/rust-lang/crates.io-index" 2063 - checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 2215 + checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" 2064 2216 dependencies = [ 2065 2217 "libc", 2066 2218 "wasi 0.11.1+wasi-snapshot-preview1", 2067 - "windows-sys 0.59.0", 2219 + "windows-sys 0.61.2", 2220 + ] 2221 + 2222 + [[package]] 2223 + name = "moxcms" 2224 + version = "0.7.9" 2225 + source = "registry+https://github.com/rust-lang/crates.io-index" 2226 + checksum = "0fbdd3d7436f8b5e892b8b7ea114271ff0fa00bc5acae845d53b07d498616ef6" 2227 + dependencies = [ 2228 + "num-traits", 2229 + "pxfm", 2068 2230 ] 2069 2231 2070 2232 [[package]] 2071 2233 name = "muda" 2072 - version = "0.17.0" 2234 + version = "0.17.1" 2073 2235 source = "registry+https://github.com/rust-lang/crates.io-index" 2074 - checksum = "58b89bf91c19bf036347f1ab85a81c560f08c0667c8601bece664d860a600988" 2236 + checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" 2075 2237 dependencies = [ 2076 2238 "crossbeam-channel", 2077 2239 "dpi", 2078 2240 "gtk", 2079 2241 "keyboard-types", 2080 - "objc2 0.6.1", 2242 + "objc2 0.6.3", 2081 2243 "objc2-app-kit", 2082 2244 "objc2-core-foundation", 2083 - "objc2-foundation 0.3.1", 2245 + "objc2-foundation 0.3.2", 2084 2246 "once_cell", 2085 - "png", 2247 + "png 0.17.16", 2086 2248 "serde", 2087 - "thiserror 2.0.12", 2088 - "windows-sys 0.59.0", 2249 + "thiserror 2.0.17", 2250 + "windows-sys 0.60.2", 2089 2251 ] 2090 2252 2091 2253 [[package]] ··· 2094 2256 source = "registry+https://github.com/rust-lang/crates.io-index" 2095 2257 checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" 2096 2258 dependencies = [ 2097 - "bitflags 2.9.1", 2259 + "bitflags 2.10.0", 2098 2260 "jni-sys", 2099 2261 "log", 2100 2262 "ndk-sys", ··· 2130 2292 source = "registry+https://github.com/rust-lang/crates.io-index" 2131 2293 checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" 2132 2294 dependencies = [ 2133 - "bitflags 2.9.1", 2295 + "bitflags 2.10.0", 2134 2296 "cfg-if", 2135 2297 "cfg_aliases", 2136 2298 "libc", ··· 2144 2306 checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" 2145 2307 2146 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]] 2147 2328 name = "num-conv" 2148 2329 version = "0.1.0" 2149 2330 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2160 2341 2161 2342 [[package]] 2162 2343 name = "num_enum" 2163 - version = "0.7.4" 2344 + version = "0.7.5" 2164 2345 source = "registry+https://github.com/rust-lang/crates.io-index" 2165 - checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" 2346 + checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" 2166 2347 dependencies = [ 2167 2348 "num_enum_derive", 2168 2349 "rustversion", ··· 2170 2351 2171 2352 [[package]] 2172 2353 name = "num_enum_derive" 2173 - version = "0.7.4" 2354 + version = "0.7.5" 2174 2355 source = "registry+https://github.com/rust-lang/crates.io-index" 2175 - checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" 2356 + checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" 2176 2357 dependencies = [ 2177 - "proc-macro-crate 3.3.0", 2358 + "proc-macro-crate 3.4.0", 2178 2359 "proc-macro2", 2179 2360 "quote", 2180 - "syn 2.0.104", 2361 + "syn 2.0.109", 2181 2362 ] 2182 2363 2183 2364 [[package]] ··· 2198 2379 2199 2380 [[package]] 2200 2381 name = "objc2" 2201 - version = "0.6.1" 2382 + version = "0.6.3" 2202 2383 source = "registry+https://github.com/rust-lang/crates.io-index" 2203 - checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" 2384 + checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" 2204 2385 dependencies = [ 2205 2386 "objc2-encode", 2206 2387 "objc2-exception-helper", ··· 2208 2389 2209 2390 [[package]] 2210 2391 name = "objc2-app-kit" 2211 - version = "0.3.1" 2392 + version = "0.3.2" 2212 2393 source = "registry+https://github.com/rust-lang/crates.io-index" 2213 - checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" 2394 + checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" 2214 2395 dependencies = [ 2215 - "bitflags 2.9.1", 2216 - "block2 0.6.1", 2396 + "bitflags 2.10.0", 2397 + "block2 0.6.2", 2217 2398 "libc", 2218 - "objc2 0.6.1", 2399 + "objc2 0.6.3", 2219 2400 "objc2-cloud-kit", 2220 2401 "objc2-core-data", 2221 2402 "objc2-core-foundation", 2222 2403 "objc2-core-graphics", 2223 2404 "objc2-core-image", 2224 - "objc2-foundation 0.3.1", 2225 - "objc2-quartz-core 0.3.1", 2405 + "objc2-core-text", 2406 + "objc2-core-video", 2407 + "objc2-foundation 0.3.2", 2408 + "objc2-quartz-core 0.3.2", 2226 2409 ] 2227 2410 2228 2411 [[package]] 2229 2412 name = "objc2-cloud-kit" 2230 - version = "0.3.1" 2413 + version = "0.3.2" 2231 2414 source = "registry+https://github.com/rust-lang/crates.io-index" 2232 - checksum = "17614fdcd9b411e6ff1117dfb1d0150f908ba83a7df81b1f118005fe0a8ea15d" 2415 + checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" 2233 2416 dependencies = [ 2234 - "bitflags 2.9.1", 2235 - "objc2 0.6.1", 2236 - "objc2-foundation 0.3.1", 2417 + "bitflags 2.10.0", 2418 + "objc2 0.6.3", 2419 + "objc2-foundation 0.3.2", 2237 2420 ] 2238 2421 2239 2422 [[package]] 2240 2423 name = "objc2-core-data" 2241 - version = "0.3.1" 2424 + version = "0.3.2" 2242 2425 source = "registry+https://github.com/rust-lang/crates.io-index" 2243 - checksum = "291fbbf7d29287518e8686417cf7239c74700fd4b607623140a7d4a3c834329d" 2426 + checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" 2244 2427 dependencies = [ 2245 - "bitflags 2.9.1", 2246 - "objc2 0.6.1", 2247 - "objc2-foundation 0.3.1", 2428 + "bitflags 2.10.0", 2429 + "objc2 0.6.3", 2430 + "objc2-foundation 0.3.2", 2248 2431 ] 2249 2432 2250 2433 [[package]] 2251 2434 name = "objc2-core-foundation" 2252 - version = "0.3.1" 2435 + version = "0.3.2" 2253 2436 source = "registry+https://github.com/rust-lang/crates.io-index" 2254 - checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" 2437 + checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" 2255 2438 dependencies = [ 2256 - "bitflags 2.9.1", 2439 + "bitflags 2.10.0", 2257 2440 "dispatch2", 2258 - "objc2 0.6.1", 2441 + "objc2 0.6.3", 2259 2442 ] 2260 2443 2261 2444 [[package]] 2262 2445 name = "objc2-core-graphics" 2263 - version = "0.3.1" 2446 + version = "0.3.2" 2264 2447 source = "registry+https://github.com/rust-lang/crates.io-index" 2265 - checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" 2448 + checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" 2266 2449 dependencies = [ 2267 - "bitflags 2.9.1", 2450 + "bitflags 2.10.0", 2268 2451 "dispatch2", 2269 - "objc2 0.6.1", 2452 + "objc2 0.6.3", 2270 2453 "objc2-core-foundation", 2271 2454 "objc2-io-surface", 2272 2455 ] 2273 2456 2274 2457 [[package]] 2275 2458 name = "objc2-core-image" 2276 - version = "0.3.1" 2459 + version = "0.3.2" 2460 + source = "registry+https://github.com/rust-lang/crates.io-index" 2461 + checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" 2462 + dependencies = [ 2463 + "objc2 0.6.3", 2464 + "objc2-foundation 0.3.2", 2465 + ] 2466 + 2467 + [[package]] 2468 + name = "objc2-core-location" 2469 + version = "0.3.2" 2470 + source = "registry+https://github.com/rust-lang/crates.io-index" 2471 + checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" 2472 + dependencies = [ 2473 + "objc2 0.6.3", 2474 + "objc2-foundation 0.3.2", 2475 + ] 2476 + 2477 + [[package]] 2478 + name = "objc2-core-text" 2479 + version = "0.3.2" 2480 + source = "registry+https://github.com/rust-lang/crates.io-index" 2481 + checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" 2482 + dependencies = [ 2483 + "bitflags 2.10.0", 2484 + "objc2 0.6.3", 2485 + "objc2-core-foundation", 2486 + "objc2-core-graphics", 2487 + ] 2488 + 2489 + [[package]] 2490 + name = "objc2-core-video" 2491 + version = "0.3.2" 2277 2492 source = "registry+https://github.com/rust-lang/crates.io-index" 2278 - checksum = "79b3dc0cc4386b6ccf21c157591b34a7f44c8e75b064f85502901ab2188c007e" 2493 + checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" 2279 2494 dependencies = [ 2280 - "objc2 0.6.1", 2281 - "objc2-foundation 0.3.1", 2495 + "bitflags 2.10.0", 2496 + "objc2 0.6.3", 2497 + "objc2-core-foundation", 2498 + "objc2-core-graphics", 2499 + "objc2-io-surface", 2282 2500 ] 2283 2501 2284 2502 [[package]] ··· 2302 2520 source = "registry+https://github.com/rust-lang/crates.io-index" 2303 2521 checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" 2304 2522 dependencies = [ 2305 - "bitflags 2.9.1", 2523 + "bitflags 2.10.0", 2306 2524 "block2 0.5.1", 2307 2525 "libc", 2308 2526 "objc2 0.5.2", ··· 2310 2528 2311 2529 [[package]] 2312 2530 name = "objc2-foundation" 2313 - version = "0.3.1" 2531 + version = "0.3.2" 2314 2532 source = "registry+https://github.com/rust-lang/crates.io-index" 2315 - checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" 2533 + checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" 2316 2534 dependencies = [ 2317 - "bitflags 2.9.1", 2318 - "block2 0.6.1", 2535 + "bitflags 2.10.0", 2536 + "block2 0.6.2", 2319 2537 "libc", 2320 - "objc2 0.6.1", 2538 + "objc2 0.6.3", 2321 2539 "objc2-core-foundation", 2322 2540 ] 2323 2541 2324 2542 [[package]] 2325 2543 name = "objc2-io-surface" 2326 - version = "0.3.1" 2544 + version = "0.3.2" 2327 2545 source = "registry+https://github.com/rust-lang/crates.io-index" 2328 - checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" 2546 + checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" 2329 2547 dependencies = [ 2330 - "bitflags 2.9.1", 2331 - "objc2 0.6.1", 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", 2332 2560 "objc2-core-foundation", 2333 2561 ] 2334 2562 ··· 2338 2566 source = "registry+https://github.com/rust-lang/crates.io-index" 2339 2567 checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" 2340 2568 dependencies = [ 2341 - "bitflags 2.9.1", 2569 + "bitflags 2.10.0", 2342 2570 "block2 0.5.1", 2343 2571 "objc2 0.5.2", 2344 2572 "objc2-foundation 0.2.2", ··· 2350 2578 source = "registry+https://github.com/rust-lang/crates.io-index" 2351 2579 checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" 2352 2580 dependencies = [ 2353 - "bitflags 2.9.1", 2581 + "bitflags 2.10.0", 2354 2582 "block2 0.5.1", 2355 2583 "objc2 0.5.2", 2356 2584 "objc2-foundation 0.2.2", ··· 2359 2587 2360 2588 [[package]] 2361 2589 name = "objc2-quartz-core" 2362 - version = "0.3.1" 2590 + version = "0.3.2" 2363 2591 source = "registry+https://github.com/rust-lang/crates.io-index" 2364 - checksum = "90ffb6a0cd5f182dc964334388560b12a57f7b74b3e2dec5e2722aa2dfb2ccd5" 2592 + checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" 2365 2593 dependencies = [ 2366 - "bitflags 2.9.1", 2367 - "objc2 0.6.1", 2368 - "objc2-foundation 0.3.1", 2594 + "bitflags 2.10.0", 2595 + "objc2 0.6.3", 2596 + "objc2-core-foundation", 2597 + "objc2-foundation 0.3.2", 2369 2598 ] 2370 2599 2371 2600 [[package]] 2372 - name = "objc2-ui-kit" 2373 - version = "0.3.1" 2601 + name = "objc2-security" 2602 + version = "0.3.2" 2374 2603 source = "registry+https://github.com/rust-lang/crates.io-index" 2375 - checksum = "25b1312ad7bc8a0e92adae17aa10f90aae1fb618832f9b993b022b591027daed" 2604 + checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" 2376 2605 dependencies = [ 2377 - "bitflags 2.9.1", 2378 - "objc2 0.6.1", 2606 + "bitflags 2.10.0", 2607 + "objc2 0.6.3", 2379 2608 "objc2-core-foundation", 2380 - "objc2-foundation 0.3.1", 2381 2609 ] 2382 2610 2383 2611 [[package]] 2384 - name = "objc2-web-kit" 2385 - version = "0.3.1" 2612 + name = "objc2-ui-kit" 2613 + version = "0.3.2" 2386 2614 source = "registry+https://github.com/rust-lang/crates.io-index" 2387 - checksum = "91672909de8b1ce1c2252e95bbee8c1649c9ad9d14b9248b3d7b4c47903c47ad" 2615 + checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" 2388 2616 dependencies = [ 2389 - "bitflags 2.9.1", 2390 - "block2 0.6.1", 2391 - "objc2 0.6.1", 2392 - "objc2-app-kit", 2617 + "bitflags 2.10.0", 2618 + "block2 0.6.2", 2619 + "objc2 0.6.3", 2620 + "objc2-cloud-kit", 2621 + "objc2-core-data", 2393 2622 "objc2-core-foundation", 2394 - "objc2-foundation 0.3.1", 2623 + "objc2-core-graphics", 2624 + "objc2-core-image", 2625 + "objc2-core-location", 2626 + "objc2-core-text", 2627 + "objc2-foundation 0.3.2", 2628 + "objc2-quartz-core 0.3.2", 2629 + "objc2-user-notifications", 2395 2630 ] 2396 2631 2397 2632 [[package]] 2398 - name = "object" 2399 - version = "0.36.7" 2633 + name = "objc2-user-notifications" 2634 + version = "0.3.2" 2400 2635 source = "registry+https://github.com/rust-lang/crates.io-index" 2401 - checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 2636 + checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" 2402 2637 dependencies = [ 2403 - "memchr", 2638 + "objc2 0.6.3", 2639 + "objc2-foundation 0.3.2", 2640 + ] 2641 + 2642 + [[package]] 2643 + name = "objc2-web-kit" 2644 + version = "0.3.2" 2645 + source = "registry+https://github.com/rust-lang/crates.io-index" 2646 + checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" 2647 + dependencies = [ 2648 + "bitflags 2.10.0", 2649 + "block2 0.6.2", 2650 + "objc2 0.6.3", 2651 + "objc2-app-kit", 2652 + "objc2-core-foundation", 2653 + "objc2-foundation 0.3.2", 2654 + "objc2-javascript-core", 2655 + "objc2-security", 2404 2656 ] 2405 2657 2406 2658 [[package]] ··· 2438 2690 ] 2439 2691 2440 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]] 2441 2719 name = "pango" 2442 2720 version = "0.18.3" 2443 2721 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2470 2748 2471 2749 [[package]] 2472 2750 name = "parking_lot" 2473 - version = "0.12.4" 2751 + version = "0.12.5" 2474 2752 source = "registry+https://github.com/rust-lang/crates.io-index" 2475 - checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" 2753 + checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" 2476 2754 dependencies = [ 2477 2755 "lock_api", 2478 2756 "parking_lot_core", ··· 2480 2758 2481 2759 [[package]] 2482 2760 name = "parking_lot_core" 2483 - version = "0.9.11" 2761 + version = "0.9.12" 2484 2762 source = "registry+https://github.com/rust-lang/crates.io-index" 2485 - checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" 2763 + checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" 2486 2764 dependencies = [ 2487 2765 "cfg-if", 2488 2766 "libc", 2489 2767 "redox_syscall", 2490 2768 "smallvec", 2491 - "windows-targets 0.52.6", 2769 + "windows-link 0.2.1", 2492 2770 ] 2493 2771 2494 2772 [[package]] ··· 2499 2777 2500 2778 [[package]] 2501 2779 name = "percent-encoding" 2502 - version = "2.3.1" 2780 + version = "2.3.2" 2503 2781 source = "registry+https://github.com/rust-lang/crates.io-index" 2504 - checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 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 + ] 2505 2794 2506 2795 [[package]] 2507 2796 name = "phf" ··· 2607 2896 "phf_shared 0.11.3", 2608 2897 "proc-macro2", 2609 2898 "quote", 2610 - "syn 2.0.104", 2899 + "syn 2.0.109", 2611 2900 ] 2612 2901 2613 2902 [[package]] ··· 2668 2957 2669 2958 [[package]] 2670 2959 name = "plist" 2671 - version = "1.7.4" 2960 + version = "1.8.0" 2672 2961 source = "registry+https://github.com/rust-lang/crates.io-index" 2673 - checksum = "3af6b589e163c5a788fab00ce0c0366f6efbb9959c2f9874b224936af7fce7e1" 2962 + checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" 2674 2963 dependencies = [ 2675 2964 "base64 0.22.1", 2676 - "indexmap 2.10.0", 2677 - "quick-xml 0.38.0", 2965 + "indexmap 2.12.0", 2966 + "quick-xml 0.38.3", 2678 2967 "serde", 2679 2968 "time", 2680 2969 ] ··· 2693 2982 ] 2694 2983 2695 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]] 2696 2998 name = "polling" 2697 - version = "3.9.0" 2999 + version = "3.11.0" 2698 3000 source = "registry+https://github.com/rust-lang/crates.io-index" 2699 - checksum = "8ee9b2fa7a4517d2c91ff5bc6c297a427a96749d15f98fcdbb22c05571a4d4b7" 3001 + checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" 2700 3002 dependencies = [ 2701 3003 "cfg-if", 2702 3004 "concurrent-queue", 2703 3005 "hermit-abi", 2704 3006 "pin-project-lite", 2705 - "rustix", 2706 - "windows-sys 0.60.2", 3007 + "rustix 1.1.2", 3008 + "windows-sys 0.61.2", 2707 3009 ] 2708 3010 2709 3011 [[package]] 2710 3012 name = "potential_utf" 2711 - version = "0.1.2" 3013 + version = "0.1.4" 2712 3014 source = "registry+https://github.com/rust-lang/crates.io-index" 2713 - checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" 3015 + checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" 2714 3016 dependencies = [ 2715 3017 "zerovec", 2716 3018 ] ··· 2748 3050 2749 3051 [[package]] 2750 3052 name = "proc-macro-crate" 2751 - version = "2.0.0" 3053 + version = "2.0.2" 2752 3054 source = "registry+https://github.com/rust-lang/crates.io-index" 2753 - checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" 3055 + checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" 2754 3056 dependencies = [ 2755 - "toml_edit 0.20.7", 3057 + "toml_datetime 0.6.3", 3058 + "toml_edit 0.20.2", 2756 3059 ] 2757 3060 2758 3061 [[package]] 2759 3062 name = "proc-macro-crate" 2760 - version = "3.3.0" 3063 + version = "3.4.0" 2761 3064 source = "registry+https://github.com/rust-lang/crates.io-index" 2762 - checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" 3065 + checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" 2763 3066 dependencies = [ 2764 - "toml_edit 0.22.27", 3067 + "toml_edit 0.23.7", 2765 3068 ] 2766 3069 2767 3070 [[package]] ··· 2796 3099 2797 3100 [[package]] 2798 3101 name = "proc-macro2" 2799 - version = "1.0.95" 3102 + version = "1.0.103" 2800 3103 source = "registry+https://github.com/rust-lang/crates.io-index" 2801 - checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 3104 + checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" 2802 3105 dependencies = [ 2803 3106 "unicode-ident", 2804 3107 ] 2805 3108 2806 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]] 2807 3125 name = "quick-xml" 2808 3126 version = "0.37.5" 2809 3127 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2814 3132 2815 3133 [[package]] 2816 3134 name = "quick-xml" 2817 - version = "0.38.0" 3135 + version = "0.38.3" 2818 3136 source = "registry+https://github.com/rust-lang/crates.io-index" 2819 - checksum = "8927b0664f5c5a98265138b7e3f90aa19a6b21353182469ace36d4ac527b7b1b" 3137 + checksum = "42a232e7487fc2ef313d96dde7948e7a3c05101870d8985e4fd8d26aedd27b89" 2820 3138 dependencies = [ 2821 3139 "memchr", 2822 3140 ] 2823 3141 2824 3142 [[package]] 2825 3143 name = "quote" 2826 - version = "1.0.40" 3144 + version = "1.0.42" 2827 3145 source = "registry+https://github.com/rust-lang/crates.io-index" 2828 - checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 3146 + checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" 2829 3147 dependencies = [ 2830 3148 "proc-macro2", 2831 3149 ] ··· 2925 3243 source = "registry+https://github.com/rust-lang/crates.io-index" 2926 3244 checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 2927 3245 dependencies = [ 2928 - "getrandom 0.3.3", 3246 + "getrandom 0.3.4", 2929 3247 ] 2930 3248 2931 3249 [[package]] ··· 2954 3272 2955 3273 [[package]] 2956 3274 name = "redox_syscall" 2957 - version = "0.5.17" 3275 + version = "0.5.18" 2958 3276 source = "registry+https://github.com/rust-lang/crates.io-index" 2959 - checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" 3277 + checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" 2960 3278 dependencies = [ 2961 - "bitflags 2.9.1", 3279 + "bitflags 2.10.0", 2962 3280 ] 2963 3281 2964 3282 [[package]] 2965 3283 name = "redox_users" 2966 - version = "0.5.0" 3284 + version = "0.5.2" 2967 3285 source = "registry+https://github.com/rust-lang/crates.io-index" 2968 - checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" 3286 + checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" 2969 3287 dependencies = [ 2970 3288 "getrandom 0.2.16", 2971 3289 "libredox", 2972 - "thiserror 2.0.12", 3290 + "thiserror 2.0.17", 2973 3291 ] 2974 3292 2975 3293 [[package]] 2976 3294 name = "ref-cast" 2977 - version = "1.0.24" 3295 + version = "1.0.25" 2978 3296 source = "registry+https://github.com/rust-lang/crates.io-index" 2979 - checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" 3297 + checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" 2980 3298 dependencies = [ 2981 3299 "ref-cast-impl", 2982 3300 ] 2983 3301 2984 3302 [[package]] 2985 3303 name = "ref-cast-impl" 2986 - version = "1.0.24" 3304 + version = "1.0.25" 2987 3305 source = "registry+https://github.com/rust-lang/crates.io-index" 2988 - checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" 3306 + checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" 2989 3307 dependencies = [ 2990 3308 "proc-macro2", 2991 3309 "quote", 2992 - "syn 2.0.104", 3310 + "syn 2.0.109", 2993 3311 ] 2994 3312 2995 3313 [[package]] 2996 3314 name = "regex" 2997 - version = "1.11.1" 3315 + version = "1.12.2" 2998 3316 source = "registry+https://github.com/rust-lang/crates.io-index" 2999 - checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 3317 + checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" 3000 3318 dependencies = [ 3001 3319 "aho-corasick", 3002 3320 "memchr", ··· 3006 3324 3007 3325 [[package]] 3008 3326 name = "regex-automata" 3009 - version = "0.4.9" 3327 + version = "0.4.13" 3010 3328 source = "registry+https://github.com/rust-lang/crates.io-index" 3011 - checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 3329 + checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" 3012 3330 dependencies = [ 3013 3331 "aho-corasick", 3014 3332 "memchr", ··· 3017 3335 3018 3336 [[package]] 3019 3337 name = "regex-syntax" 3020 - version = "0.8.5" 3338 + version = "0.8.8" 3021 3339 source = "registry+https://github.com/rust-lang/crates.io-index" 3022 - checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 3340 + checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" 3023 3341 3024 3342 [[package]] 3025 3343 name = "reqwest" 3026 - version = "0.12.22" 3344 + version = "0.12.24" 3027 3345 source = "registry+https://github.com/rust-lang/crates.io-index" 3028 - checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" 3346 + checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" 3029 3347 dependencies = [ 3030 3348 "base64 0.22.1", 3031 3349 "bytes", ··· 3063 3381 checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" 3064 3382 dependencies = [ 3065 3383 "ashpd", 3066 - "block2 0.6.1", 3384 + "block2 0.6.2", 3067 3385 "dispatch2", 3068 3386 "glib-sys", 3069 3387 "gobject-sys", 3070 3388 "gtk-sys", 3071 3389 "js-sys", 3072 3390 "log", 3073 - "objc2 0.6.1", 3391 + "objc2 0.6.3", 3074 3392 "objc2-app-kit", 3075 3393 "objc2-core-foundation", 3076 - "objc2-foundation 0.3.1", 3394 + "objc2-foundation 0.3.2", 3077 3395 "raw-window-handle", 3078 3396 "wasm-bindgen", 3079 3397 "wasm-bindgen-futures", 3080 3398 "web-sys", 3081 3399 "windows-sys 0.59.0", 3082 3400 ] 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 3401 3090 3402 [[package]] 3091 3403 name = "rustc_version" ··· 3098 3410 3099 3411 [[package]] 3100 3412 name = "rustix" 3101 - version = "1.0.8" 3413 + version = "0.38.44" 3414 + source = "registry+https://github.com/rust-lang/crates.io-index" 3415 + checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 3416 + dependencies = [ 3417 + "bitflags 2.10.0", 3418 + "errno", 3419 + "libc", 3420 + "linux-raw-sys 0.4.15", 3421 + "windows-sys 0.59.0", 3422 + ] 3423 + 3424 + [[package]] 3425 + name = "rustix" 3426 + version = "1.1.2" 3102 3427 source = "registry+https://github.com/rust-lang/crates.io-index" 3103 - checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" 3428 + checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" 3104 3429 dependencies = [ 3105 - "bitflags 2.9.1", 3430 + "bitflags 2.10.0", 3106 3431 "errno", 3107 3432 "libc", 3108 - "linux-raw-sys", 3109 - "windows-sys 0.60.2", 3433 + "linux-raw-sys 0.11.0", 3434 + "windows-sys 0.61.2", 3110 3435 ] 3111 3436 3112 3437 [[package]] 3113 3438 name = "rustversion" 3114 - version = "1.0.21" 3439 + version = "1.0.22" 3115 3440 source = "registry+https://github.com/rust-lang/crates.io-index" 3116 - checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" 3441 + checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 3117 3442 3118 3443 [[package]] 3119 3444 name = "ryu" ··· 3159 3484 3160 3485 [[package]] 3161 3486 name = "schemars" 3162 - version = "1.0.4" 3487 + version = "1.1.0" 3163 3488 source = "registry+https://github.com/rust-lang/crates.io-index" 3164 - checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" 3489 + checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" 3165 3490 dependencies = [ 3166 3491 "dyn-clone", 3167 3492 "ref-cast", ··· 3178 3503 "proc-macro2", 3179 3504 "quote", 3180 3505 "serde_derive_internals", 3181 - "syn 2.0.104", 3506 + "syn 2.0.109", 3182 3507 ] 3183 3508 3184 3509 [[package]] ··· 3213 3538 3214 3539 [[package]] 3215 3540 name = "semver" 3216 - version = "1.0.26" 3541 + version = "1.0.27" 3217 3542 source = "registry+https://github.com/rust-lang/crates.io-index" 3218 - checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" 3543 + checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" 3219 3544 dependencies = [ 3220 3545 "serde", 3546 + "serde_core", 3221 3547 ] 3222 3548 3223 3549 [[package]] 3224 3550 name = "serde" 3225 - version = "1.0.219" 3551 + version = "1.0.228" 3226 3552 source = "registry+https://github.com/rust-lang/crates.io-index" 3227 - checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 3553 + checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 3228 3554 dependencies = [ 3555 + "serde_core", 3229 3556 "serde_derive", 3230 3557 ] 3231 3558 3232 3559 [[package]] 3233 3560 name = "serde-untagged" 3234 - version = "0.1.7" 3561 + version = "0.1.9" 3235 3562 source = "registry+https://github.com/rust-lang/crates.io-index" 3236 - checksum = "299d9c19d7d466db4ab10addd5703e4c615dec2a5a16dbbafe191045e87ee66e" 3563 + checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" 3237 3564 dependencies = [ 3238 3565 "erased-serde", 3239 3566 "serde", 3567 + "serde_core", 3240 3568 "typeid", 3241 3569 ] 3242 3570 3243 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]] 3244 3581 name = "serde_derive" 3245 - version = "1.0.219" 3582 + version = "1.0.228" 3246 3583 source = "registry+https://github.com/rust-lang/crates.io-index" 3247 - checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 3584 + checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 3248 3585 dependencies = [ 3249 3586 "proc-macro2", 3250 3587 "quote", 3251 - "syn 2.0.104", 3588 + "syn 2.0.109", 3252 3589 ] 3253 3590 3254 3591 [[package]] ··· 3259 3596 dependencies = [ 3260 3597 "proc-macro2", 3261 3598 "quote", 3262 - "syn 2.0.104", 3599 + "syn 2.0.109", 3263 3600 ] 3264 3601 3265 3602 [[package]] 3266 3603 name = "serde_json" 3267 - version = "1.0.141" 3604 + version = "1.0.145" 3268 3605 source = "registry+https://github.com/rust-lang/crates.io-index" 3269 - checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" 3606 + checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" 3270 3607 dependencies = [ 3271 3608 "itoa", 3272 3609 "memchr", 3273 3610 "ryu", 3274 3611 "serde", 3612 + "serde_core", 3275 3613 ] 3276 3614 3277 3615 [[package]] ··· 3282 3620 dependencies = [ 3283 3621 "proc-macro2", 3284 3622 "quote", 3285 - "syn 2.0.104", 3623 + "syn 2.0.109", 3286 3624 ] 3287 3625 3288 3626 [[package]] ··· 3296 3634 3297 3635 [[package]] 3298 3636 name = "serde_spanned" 3299 - version = "1.0.0" 3637 + version = "1.0.3" 3300 3638 source = "registry+https://github.com/rust-lang/crates.io-index" 3301 - checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" 3639 + checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" 3302 3640 dependencies = [ 3303 - "serde", 3641 + "serde_core", 3304 3642 ] 3305 3643 3306 3644 [[package]] ··· 3317 3655 3318 3656 [[package]] 3319 3657 name = "serde_with" 3320 - version = "3.14.0" 3658 + version = "3.15.1" 3321 3659 source = "registry+https://github.com/rust-lang/crates.io-index" 3322 - checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" 3660 + checksum = "aa66c845eee442168b2c8134fec70ac50dc20e760769c8ba0ad1319ca1959b04" 3323 3661 dependencies = [ 3324 3662 "base64 0.22.1", 3325 3663 "chrono", 3326 3664 "hex", 3327 3665 "indexmap 1.9.3", 3328 - "indexmap 2.10.0", 3666 + "indexmap 2.12.0", 3329 3667 "schemars 0.9.0", 3330 - "schemars 1.0.4", 3331 - "serde", 3332 - "serde_derive", 3668 + "schemars 1.1.0", 3669 + "serde_core", 3333 3670 "serde_json", 3334 3671 "serde_with_macros", 3335 3672 "time", ··· 3337 3674 3338 3675 [[package]] 3339 3676 name = "serde_with_macros" 3340 - version = "3.14.0" 3677 + version = "3.15.1" 3341 3678 source = "registry+https://github.com/rust-lang/crates.io-index" 3342 - checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" 3679 + checksum = "b91a903660542fced4e99881aa481bdbaec1634568ee02e0b8bd57c64cb38955" 3343 3680 dependencies = [ 3344 3681 "darling", 3345 3682 "proc-macro2", 3346 3683 "quote", 3347 - "syn 2.0.104", 3684 + "syn 2.0.109", 3348 3685 ] 3349 3686 3350 3687 [[package]] 3351 3688 name = "serialize-to-javascript" 3352 - version = "0.1.1" 3689 + version = "0.1.2" 3353 3690 source = "registry+https://github.com/rust-lang/crates.io-index" 3354 - checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" 3691 + checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" 3355 3692 dependencies = [ 3356 3693 "serde", 3357 3694 "serde_json", ··· 3360 3697 3361 3698 [[package]] 3362 3699 name = "serialize-to-javascript-impl" 3363 - version = "0.1.1" 3700 + version = "0.1.2" 3364 3701 source = "registry+https://github.com/rust-lang/crates.io-index" 3365 - checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" 3702 + checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" 3366 3703 dependencies = [ 3367 3704 "proc-macro2", 3368 3705 "quote", 3369 - "syn 1.0.109", 3706 + "syn 2.0.109", 3370 3707 ] 3371 3708 3372 3709 [[package]] ··· 3398 3735 3399 3736 [[package]] 3400 3737 name = "signal-hook-registry" 3401 - version = "1.4.5" 3738 + version = "1.4.6" 3402 3739 source = "registry+https://github.com/rust-lang/crates.io-index" 3403 - checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" 3740 + checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" 3404 3741 dependencies = [ 3405 3742 "libc", 3406 3743 ] ··· 3425 3762 3426 3763 [[package]] 3427 3764 name = "slab" 3428 - version = "0.4.10" 3765 + version = "0.4.11" 3429 3766 source = "registry+https://github.com/rust-lang/crates.io-index" 3430 - checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" 3767 + checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" 3431 3768 3432 3769 [[package]] 3433 3770 name = "smallvec" ··· 3437 3774 3438 3775 [[package]] 3439 3776 name = "socket2" 3440 - version = "0.6.0" 3777 + version = "0.6.1" 3441 3778 source = "registry+https://github.com/rust-lang/crates.io-index" 3442 - checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" 3779 + checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" 3443 3780 dependencies = [ 3444 3781 "libc", 3445 - "windows-sys 0.59.0", 3782 + "windows-sys 0.60.2", 3446 3783 ] 3447 3784 3448 3785 [[package]] ··· 3453 3790 dependencies = [ 3454 3791 "bytemuck", 3455 3792 "cfg_aliases", 3456 - "core-graphics", 3793 + "core-graphics 0.24.0", 3457 3794 "foreign-types", 3458 3795 "js-sys", 3459 3796 "log", ··· 3495 3832 3496 3833 [[package]] 3497 3834 name = "stable_deref_trait" 3498 - version = "1.2.0" 3835 + version = "1.2.1" 3499 3836 source = "registry+https://github.com/rust-lang/crates.io-index" 3500 - checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 3837 + checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" 3501 3838 3502 3839 [[package]] 3503 3840 name = "static_assertions" ··· 3560 3897 3561 3898 [[package]] 3562 3899 name = "syn" 3563 - version = "2.0.104" 3900 + version = "2.0.109" 3564 3901 source = "registry+https://github.com/rust-lang/crates.io-index" 3565 - checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" 3902 + checksum = "2f17c7e013e88258aa9543dcbe81aca68a667a9ac37cd69c9fbc07858bfe0e2f" 3566 3903 dependencies = [ 3567 3904 "proc-macro2", 3568 3905 "quote", ··· 3586 3923 dependencies = [ 3587 3924 "proc-macro2", 3588 3925 "quote", 3589 - "syn 2.0.104", 3926 + "syn 2.0.109", 3927 + ] 3928 + 3929 + [[package]] 3930 + name = "sys-locale" 3931 + version = "0.3.2" 3932 + source = "registry+https://github.com/rust-lang/crates.io-index" 3933 + checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" 3934 + dependencies = [ 3935 + "libc", 3590 3936 ] 3591 3937 3592 3938 [[package]] ··· 3598 3944 "cfg-expr", 3599 3945 "heck 0.5.0", 3600 3946 "pkg-config", 3601 - "toml 0.8.23", 3947 + "toml 0.8.2", 3602 3948 "version-compare", 3603 3949 ] 3604 3950 3605 3951 [[package]] 3606 3952 name = "tao" 3607 - version = "0.34.0" 3953 + version = "0.34.5" 3608 3954 source = "registry+https://github.com/rust-lang/crates.io-index" 3609 - checksum = "49c380ca75a231b87b6c9dd86948f035012e7171d1a7c40a9c2890489a7ffd8a" 3955 + checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" 3610 3956 dependencies = [ 3611 - "bitflags 2.9.1", 3957 + "bitflags 2.10.0", 3958 + "block2 0.6.2", 3612 3959 "core-foundation", 3613 - "core-graphics", 3960 + "core-graphics 0.24.0", 3614 3961 "crossbeam-channel", 3615 3962 "dispatch", 3616 3963 "dlopen2", ··· 3625 3972 "ndk", 3626 3973 "ndk-context", 3627 3974 "ndk-sys", 3628 - "objc2 0.6.1", 3975 + "objc2 0.6.3", 3629 3976 "objc2-app-kit", 3630 - "objc2-foundation 0.3.1", 3977 + "objc2-foundation 0.3.2", 3631 3978 "once_cell", 3632 3979 "parking_lot", 3633 3980 "raw-window-handle", ··· 3636 3983 "unicode-segmentation", 3637 3984 "url", 3638 3985 "windows", 3639 - "windows-core", 3986 + "windows-core 0.61.2", 3640 3987 "windows-version", 3641 3988 "x11-dl", 3642 3989 ] ··· 3649 3996 dependencies = [ 3650 3997 "proc-macro2", 3651 3998 "quote", 3652 - "syn 2.0.104", 3999 + "syn 2.0.109", 3653 4000 ] 3654 4001 3655 4002 [[package]] ··· 3660 4007 3661 4008 [[package]] 3662 4009 name = "tauri" 3663 - version = "2.7.0" 4010 + version = "2.9.2" 3664 4011 source = "registry+https://github.com/rust-lang/crates.io-index" 3665 - checksum = "352a4bc7bf6c25f5624227e3641adf475a6535707451b09bb83271df8b7a6ac7" 4012 + checksum = "8bceb52453e507c505b330afe3398510e87f428ea42b6e76ecb6bd63b15965b5" 3666 4013 dependencies = [ 3667 4014 "anyhow", 3668 4015 "bytes", 4016 + "cookie", 3669 4017 "dirs", 3670 4018 "dunce", 3671 4019 "embed_plist", 3672 - "getrandom 0.3.3", 4020 + "getrandom 0.3.4", 3673 4021 "glob", 3674 4022 "gtk", 3675 4023 "heck 0.5.0", 3676 4024 "http", 4025 + "image", 3677 4026 "jni", 3678 4027 "libc", 3679 4028 "log", 3680 4029 "mime", 3681 4030 "muda", 3682 - "objc2 0.6.1", 4031 + "objc2 0.6.3", 3683 4032 "objc2-app-kit", 3684 - "objc2-foundation 0.3.1", 4033 + "objc2-foundation 0.3.2", 3685 4034 "objc2-ui-kit", 4035 + "objc2-web-kit", 3686 4036 "percent-encoding", 3687 4037 "plist", 3688 4038 "raw-window-handle", ··· 3697 4047 "tauri-runtime", 3698 4048 "tauri-runtime-wry", 3699 4049 "tauri-utils", 3700 - "thiserror 2.0.12", 4050 + "thiserror 2.0.17", 3701 4051 "tokio", 3702 4052 "tray-icon", 3703 4053 "url", 3704 - "urlpattern", 3705 4054 "webkit2gtk", 3706 4055 "webview2-com", 3707 4056 "window-vibrancy", ··· 3710 4059 3711 4060 [[package]] 3712 4061 name = "tauri-build" 3713 - version = "2.3.1" 4062 + version = "2.5.1" 3714 4063 source = "registry+https://github.com/rust-lang/crates.io-index" 3715 - checksum = "182d688496c06bf08ea896459bf483eb29cdff35c1c4c115fb14053514303064" 4064 + checksum = "a924b6c50fe83193f0f8b14072afa7c25b7a72752a2a73d9549b463f5fe91a38" 3716 4065 dependencies = [ 3717 4066 "anyhow", 3718 4067 "cargo_toml", ··· 3726 4075 "serde_json", 3727 4076 "tauri-utils", 3728 4077 "tauri-winres", 3729 - "toml 0.8.23", 4078 + "toml 0.9.8", 3730 4079 "walkdir", 3731 4080 ] 3732 4081 3733 4082 [[package]] 3734 4083 name = "tauri-codegen" 3735 - version = "2.3.1" 4084 + version = "2.5.0" 3736 4085 source = "registry+https://github.com/rust-lang/crates.io-index" 3737 - checksum = "b54a99a6cd8e01abcfa61508177e6096a4fe2681efecee9214e962f2f073ae4a" 4086 + checksum = "6c1fe64c74cc40f90848281a90058a6db931eb400b60205840e09801ee30f190" 3738 4087 dependencies = [ 3739 4088 "base64 0.22.1", 3740 4089 "brotli", 3741 4090 "ico", 3742 4091 "json-patch", 3743 4092 "plist", 3744 - "png", 4093 + "png 0.17.16", 3745 4094 "proc-macro2", 3746 4095 "quote", 3747 4096 "semver", 3748 4097 "serde", 3749 4098 "serde_json", 3750 4099 "sha2", 3751 - "syn 2.0.104", 4100 + "syn 2.0.109", 3752 4101 "tauri-utils", 3753 - "thiserror 2.0.12", 4102 + "thiserror 2.0.17", 3754 4103 "time", 3755 4104 "url", 3756 4105 "uuid", ··· 3759 4108 3760 4109 [[package]] 3761 4110 name = "tauri-macros" 3762 - version = "2.3.2" 4111 + version = "2.5.0" 3763 4112 source = "registry+https://github.com/rust-lang/crates.io-index" 3764 - checksum = "7945b14dc45e23532f2ded6e120170bbdd4af5ceaa45784a6b33d250fbce3f9e" 4113 + checksum = "260c5d2eb036b76206b9fca20b7be3614cfd21046c5396f7959e0e64a4b07f2f" 3765 4114 dependencies = [ 3766 4115 "heck 0.5.0", 3767 4116 "proc-macro2", 3768 4117 "quote", 3769 - "syn 2.0.104", 4118 + "syn 2.0.109", 3770 4119 "tauri-codegen", 3771 4120 "tauri-utils", 3772 4121 ] 3773 4122 3774 4123 [[package]] 3775 4124 name = "tauri-plugin" 3776 - version = "2.3.1" 4125 + version = "2.5.1" 3777 4126 source = "registry+https://github.com/rust-lang/crates.io-index" 3778 - checksum = "5bd5c1e56990c70a906ef67a9851bbdba9136d26075ee9a2b19c8b46986b3e02" 4127 + checksum = "076c78a474a7247c90cad0b6e87e593c4c620ed4efdb79cbe0214f0021f6c39d" 3779 4128 dependencies = [ 3780 4129 "anyhow", 3781 4130 "glob", ··· 3784 4133 "serde", 3785 4134 "serde_json", 3786 4135 "tauri-utils", 3787 - "toml 0.8.23", 4136 + "toml 0.9.8", 3788 4137 "walkdir", 3789 4138 ] 3790 4139 3791 4140 [[package]] 3792 - name = "tauri-plugin-dialog" 4141 + name = "tauri-plugin-clipboard-manager" 3793 4142 version = "2.3.2" 3794 4143 source = "registry+https://github.com/rust-lang/crates.io-index" 3795 - checksum = "37e5858cc7b455a73ab4ea2ebc08b5be33682c00ff1bf4cad5537d4fb62499d9" 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" 3796 4160 dependencies = [ 3797 4161 "log", 3798 4162 "raw-window-handle", ··· 3802 4166 "tauri", 3803 4167 "tauri-plugin", 3804 4168 "tauri-plugin-fs", 3805 - "thiserror 2.0.12", 4169 + "thiserror 2.0.17", 3806 4170 "url", 3807 4171 ] 3808 4172 3809 4173 [[package]] 3810 4174 name = "tauri-plugin-fs" 3811 - version = "2.4.1" 4175 + version = "2.4.4" 3812 4176 source = "registry+https://github.com/rust-lang/crates.io-index" 3813 - checksum = "8c6ef84ee2f2094ce093e55106d90d763ba343fad57566992962e8f76d113f99" 4177 + checksum = "47df422695255ecbe7bac7012440eddaeefd026656171eac9559f5243d3230d9" 3814 4178 dependencies = [ 3815 4179 "anyhow", 3816 4180 "dunce", ··· 3823 4187 "tauri", 3824 4188 "tauri-plugin", 3825 4189 "tauri-utils", 3826 - "thiserror 2.0.12", 3827 - "toml 0.8.23", 4190 + "thiserror 2.0.17", 4191 + "toml 0.9.8", 3828 4192 "url", 3829 4193 ] 3830 4194 3831 4195 [[package]] 3832 4196 name = "tauri-plugin-opener" 3833 - version = "2.4.0" 4197 + version = "2.5.2" 3834 4198 source = "registry+https://github.com/rust-lang/crates.io-index" 3835 - checksum = "ecee219f11cdac713ab32959db5d0cceec4810ba4f4458da992292ecf9660321" 4199 + checksum = "c26b72571d25dee25667940027114e60f569fc3974f8cefbe50c2cbc5fd65e3b" 3836 4200 dependencies = [ 3837 4201 "dunce", 3838 4202 "glob", 3839 4203 "objc2-app-kit", 3840 - "objc2-foundation 0.3.1", 4204 + "objc2-foundation 0.3.2", 3841 4205 "open", 3842 4206 "schemars 0.8.22", 3843 4207 "serde", 3844 4208 "serde_json", 3845 4209 "tauri", 3846 4210 "tauri-plugin", 3847 - "thiserror 2.0.12", 4211 + "thiserror 2.0.17", 3848 4212 "url", 3849 4213 "windows", 3850 4214 "zbus", 3851 4215 ] 3852 4216 3853 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]] 3854 4236 name = "tauri-runtime" 3855 - version = "2.7.1" 4237 + version = "2.9.1" 3856 4238 source = "registry+https://github.com/rust-lang/crates.io-index" 3857 - checksum = "2b1cc885be806ea15ff7b0eb47098a7b16323d9228876afda329e34e2d6c4676" 4239 + checksum = "9368f09358496f2229313fccb37682ad116b7f46fa76981efe116994a0628926" 3858 4240 dependencies = [ 3859 4241 "cookie", 3860 4242 "dpi", 3861 4243 "gtk", 3862 4244 "http", 3863 4245 "jni", 3864 - "objc2 0.6.1", 4246 + "objc2 0.6.3", 3865 4247 "objc2-ui-kit", 4248 + "objc2-web-kit", 3866 4249 "raw-window-handle", 3867 4250 "serde", 3868 4251 "serde_json", 3869 4252 "tauri-utils", 3870 - "thiserror 2.0.12", 4253 + "thiserror 2.0.17", 3871 4254 "url", 4255 + "webkit2gtk", 4256 + "webview2-com", 3872 4257 "windows", 3873 4258 ] 3874 4259 3875 4260 [[package]] 3876 4261 name = "tauri-runtime-wry" 3877 - version = "2.7.2" 4262 + version = "2.9.1" 3878 4263 source = "registry+https://github.com/rust-lang/crates.io-index" 3879 - checksum = "fe653a2fbbef19fe898efc774bc52c8742576342a33d3d028c189b57eb1d2439" 4264 + checksum = "929f5df216f5c02a9e894554401bcdab6eec3e39ec6a4a7731c7067fc8688a93" 3880 4265 dependencies = [ 3881 4266 "gtk", 3882 4267 "http", 3883 4268 "jni", 3884 4269 "log", 3885 - "objc2 0.6.1", 4270 + "objc2 0.6.3", 3886 4271 "objc2-app-kit", 3887 - "objc2-foundation 0.3.1", 4272 + "objc2-foundation 0.3.2", 3888 4273 "once_cell", 3889 4274 "percent-encoding", 3890 4275 "raw-window-handle", ··· 3901 4286 3902 4287 [[package]] 3903 4288 name = "tauri-utils" 3904 - version = "2.6.0" 4289 + version = "2.8.0" 3905 4290 source = "registry+https://github.com/rust-lang/crates.io-index" 3906 - checksum = "9330c15cabfe1d9f213478c9e8ec2b0c76dab26bb6f314b8ad1c8a568c1d186e" 4291 + checksum = "f6b8bbe426abdbf52d050e52ed693130dbd68375b9ad82a3fb17efb4c8d85673" 3907 4292 dependencies = [ 3908 4293 "anyhow", 3909 4294 "brotli", ··· 3929 4314 "serde_json", 3930 4315 "serde_with", 3931 4316 "swift-rs", 3932 - "thiserror 2.0.12", 3933 - "toml 0.8.23", 4317 + "thiserror 2.0.17", 4318 + "toml 0.9.8", 3934 4319 "url", 3935 4320 "urlpattern", 3936 4321 "uuid", ··· 3939 4324 3940 4325 [[package]] 3941 4326 name = "tauri-winres" 3942 - version = "0.3.1" 4327 + version = "0.3.3" 3943 4328 source = "registry+https://github.com/rust-lang/crates.io-index" 3944 - checksum = "e8d321dbc6f998d825ab3f0d62673e810c861aac2d0de2cc2c395328f1d113b4" 4329 + checksum = "fd21509dd1fa9bd355dc29894a6ff10635880732396aa38c0066c1e6c1ab8074" 3945 4330 dependencies = [ 3946 4331 "embed-resource", 3947 - "indexmap 2.10.0", 3948 - "toml 0.8.23", 4332 + "toml 0.9.8", 3949 4333 ] 3950 4334 3951 4335 [[package]] 3952 4336 name = "tempfile" 3953 - version = "3.20.0" 4337 + version = "3.23.0" 3954 4338 source = "registry+https://github.com/rust-lang/crates.io-index" 3955 - checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" 4339 + checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" 3956 4340 dependencies = [ 3957 4341 "fastrand", 3958 - "getrandom 0.3.3", 4342 + "getrandom 0.3.4", 3959 4343 "once_cell", 3960 - "rustix", 3961 - "windows-sys 0.59.0", 4344 + "rustix 1.1.2", 4345 + "windows-sys 0.61.2", 3962 4346 ] 3963 4347 3964 4348 [[package]] ··· 3983 4367 3984 4368 [[package]] 3985 4369 name = "thiserror" 3986 - version = "2.0.12" 4370 + version = "2.0.17" 3987 4371 source = "registry+https://github.com/rust-lang/crates.io-index" 3988 - checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 4372 + checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" 3989 4373 dependencies = [ 3990 - "thiserror-impl 2.0.12", 4374 + "thiserror-impl 2.0.17", 3991 4375 ] 3992 4376 3993 4377 [[package]] ··· 3998 4382 dependencies = [ 3999 4383 "proc-macro2", 4000 4384 "quote", 4001 - "syn 2.0.104", 4385 + "syn 2.0.109", 4002 4386 ] 4003 4387 4004 4388 [[package]] 4005 4389 name = "thiserror-impl" 4006 - version = "2.0.12" 4390 + version = "2.0.17" 4007 4391 source = "registry+https://github.com/rust-lang/crates.io-index" 4008 - checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 4392 + checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" 4009 4393 dependencies = [ 4010 4394 "proc-macro2", 4011 4395 "quote", 4012 - "syn 2.0.104", 4396 + "syn 2.0.109", 4397 + ] 4398 + 4399 + [[package]] 4400 + name = "tiff" 4401 + version = "0.10.3" 4402 + source = "registry+https://github.com/rust-lang/crates.io-index" 4403 + checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f" 4404 + dependencies = [ 4405 + "fax", 4406 + "flate2", 4407 + "half", 4408 + "quick-error", 4409 + "weezl", 4410 + "zune-jpeg", 4013 4411 ] 4014 4412 4015 4413 [[package]] 4016 4414 name = "time" 4017 - version = "0.3.41" 4415 + version = "0.3.44" 4018 4416 source = "registry+https://github.com/rust-lang/crates.io-index" 4019 - checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" 4417 + checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" 4020 4418 dependencies = [ 4021 4419 "deranged", 4022 4420 "itoa", ··· 4029 4427 4030 4428 [[package]] 4031 4429 name = "time-core" 4032 - version = "0.1.4" 4430 + version = "0.1.6" 4033 4431 source = "registry+https://github.com/rust-lang/crates.io-index" 4034 - checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" 4432 + checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" 4035 4433 4036 4434 [[package]] 4037 4435 name = "time-macros" 4038 - version = "0.2.22" 4436 + version = "0.2.24" 4039 4437 source = "registry+https://github.com/rust-lang/crates.io-index" 4040 - checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" 4438 + checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" 4041 4439 dependencies = [ 4042 4440 "num-conv", 4043 4441 "time-core", ··· 4045 4443 4046 4444 [[package]] 4047 4445 name = "tinystr" 4048 - version = "0.8.1" 4446 + version = "0.8.2" 4049 4447 source = "registry+https://github.com/rust-lang/crates.io-index" 4050 - checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 4448 + checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" 4051 4449 dependencies = [ 4052 4450 "displaydoc", 4053 4451 "zerovec", ··· 4055 4453 4056 4454 [[package]] 4057 4455 name = "tokio" 4058 - version = "1.47.0" 4456 + version = "1.48.0" 4059 4457 source = "registry+https://github.com/rust-lang/crates.io-index" 4060 - checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35" 4458 + checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" 4061 4459 dependencies = [ 4062 - "backtrace", 4063 4460 "bytes", 4064 - "io-uring", 4065 4461 "libc", 4066 4462 "mio", 4067 4463 "pin-project-lite", 4068 4464 "signal-hook-registry", 4069 - "slab", 4070 4465 "socket2", 4071 4466 "tokio-macros", 4072 4467 "tracing", 4073 - "windows-sys 0.59.0", 4468 + "windows-sys 0.61.2", 4074 4469 ] 4075 4470 4076 4471 [[package]] 4077 4472 name = "tokio-macros" 4078 - version = "2.5.0" 4473 + version = "2.6.0" 4079 4474 source = "registry+https://github.com/rust-lang/crates.io-index" 4080 - checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 4475 + checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" 4081 4476 dependencies = [ 4082 4477 "proc-macro2", 4083 4478 "quote", 4084 - "syn 2.0.104", 4479 + "syn 2.0.109", 4085 4480 ] 4086 4481 4087 4482 [[package]] 4088 4483 name = "tokio-util" 4089 - version = "0.7.15" 4484 + version = "0.7.17" 4090 4485 source = "registry+https://github.com/rust-lang/crates.io-index" 4091 - checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" 4486 + checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" 4092 4487 dependencies = [ 4093 4488 "bytes", 4094 4489 "futures-core", ··· 4099 4494 4100 4495 [[package]] 4101 4496 name = "toml" 4102 - version = "0.8.23" 4497 + version = "0.8.2" 4103 4498 source = "registry+https://github.com/rust-lang/crates.io-index" 4104 - checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" 4499 + checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" 4105 4500 dependencies = [ 4106 4501 "serde", 4107 4502 "serde_spanned 0.6.9", 4108 - "toml_datetime 0.6.11", 4109 - "toml_edit 0.22.27", 4503 + "toml_datetime 0.6.3", 4504 + "toml_edit 0.20.2", 4110 4505 ] 4111 4506 4112 4507 [[package]] 4113 4508 name = "toml" 4114 - version = "0.9.3" 4509 + version = "0.9.8" 4115 4510 source = "registry+https://github.com/rust-lang/crates.io-index" 4116 - checksum = "e06723639aaded957e5a80be250c1f82f274b9d23ebb4d94163668470623461c" 4511 + checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" 4117 4512 dependencies = [ 4118 - "indexmap 2.10.0", 4119 - "serde", 4120 - "serde_spanned 1.0.0", 4121 - "toml_datetime 0.7.0", 4513 + "indexmap 2.12.0", 4514 + "serde_core", 4515 + "serde_spanned 1.0.3", 4516 + "toml_datetime 0.7.3", 4122 4517 "toml_parser", 4123 4518 "toml_writer", 4124 - "winnow 0.7.12", 4519 + "winnow 0.7.13", 4125 4520 ] 4126 4521 4127 4522 [[package]] 4128 4523 name = "toml_datetime" 4129 - version = "0.6.11" 4524 + version = "0.6.3" 4130 4525 source = "registry+https://github.com/rust-lang/crates.io-index" 4131 - checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" 4526 + checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" 4132 4527 dependencies = [ 4133 4528 "serde", 4134 4529 ] 4135 4530 4136 4531 [[package]] 4137 4532 name = "toml_datetime" 4138 - version = "0.7.0" 4533 + version = "0.7.3" 4139 4534 source = "registry+https://github.com/rust-lang/crates.io-index" 4140 - checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" 4535 + checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" 4141 4536 dependencies = [ 4142 - "serde", 4537 + "serde_core", 4143 4538 ] 4144 4539 4145 4540 [[package]] ··· 4148 4543 source = "registry+https://github.com/rust-lang/crates.io-index" 4149 4544 checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" 4150 4545 dependencies = [ 4151 - "indexmap 2.10.0", 4152 - "toml_datetime 0.6.11", 4546 + "indexmap 2.12.0", 4547 + "toml_datetime 0.6.3", 4153 4548 "winnow 0.5.40", 4154 4549 ] 4155 4550 4156 4551 [[package]] 4157 4552 name = "toml_edit" 4158 - version = "0.20.7" 4553 + version = "0.20.2" 4159 4554 source = "registry+https://github.com/rust-lang/crates.io-index" 4160 - checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" 4555 + checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" 4161 4556 dependencies = [ 4162 - "indexmap 2.10.0", 4163 - "toml_datetime 0.6.11", 4557 + "indexmap 2.12.0", 4558 + "serde", 4559 + "serde_spanned 0.6.9", 4560 + "toml_datetime 0.6.3", 4164 4561 "winnow 0.5.40", 4165 4562 ] 4166 4563 4167 4564 [[package]] 4168 4565 name = "toml_edit" 4169 - version = "0.22.27" 4566 + version = "0.23.7" 4170 4567 source = "registry+https://github.com/rust-lang/crates.io-index" 4171 - checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" 4568 + checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" 4172 4569 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", 4570 + "indexmap 2.12.0", 4571 + "toml_datetime 0.7.3", 4572 + "toml_parser", 4573 + "winnow 0.7.13", 4179 4574 ] 4180 4575 4181 4576 [[package]] 4182 4577 name = "toml_parser" 4183 - version = "1.0.1" 4578 + version = "1.0.4" 4184 4579 source = "registry+https://github.com/rust-lang/crates.io-index" 4185 - checksum = "97200572db069e74c512a14117b296ba0a80a30123fbbb5aa1f4a348f639ca30" 4580 + checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" 4186 4581 dependencies = [ 4187 - "winnow 0.7.12", 4582 + "winnow 0.7.13", 4188 4583 ] 4189 4584 4190 4585 [[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 4586 name = "toml_writer" 4198 - version = "1.0.2" 4587 + version = "1.0.4" 4199 4588 source = "registry+https://github.com/rust-lang/crates.io-index" 4200 - checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" 4589 + checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" 4201 4590 4202 4591 [[package]] 4203 4592 name = "tower" ··· 4220 4609 source = "registry+https://github.com/rust-lang/crates.io-index" 4221 4610 checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" 4222 4611 dependencies = [ 4223 - "bitflags 2.9.1", 4612 + "bitflags 2.10.0", 4224 4613 "bytes", 4225 4614 "futures-util", 4226 4615 "http", ··· 4263 4652 dependencies = [ 4264 4653 "proc-macro2", 4265 4654 "quote", 4266 - "syn 2.0.104", 4655 + "syn 2.0.109", 4267 4656 ] 4268 4657 4269 4658 [[package]] ··· 4277 4666 4278 4667 [[package]] 4279 4668 name = "tray-icon" 4280 - version = "0.21.0" 4669 + version = "0.21.2" 4281 4670 source = "registry+https://github.com/rust-lang/crates.io-index" 4282 - checksum = "2da75ec677957aa21f6e0b361df0daab972f13a5bee3606de0638fd4ee1c666a" 4671 + checksum = "e3d5572781bee8e3f994d7467084e1b1fd7a93ce66bd480f8156ba89dee55a2b" 4283 4672 dependencies = [ 4284 4673 "crossbeam-channel", 4285 4674 "dirs", 4286 4675 "libappindicator", 4287 4676 "muda", 4288 - "objc2 0.6.1", 4677 + "objc2 0.6.3", 4289 4678 "objc2-app-kit", 4290 4679 "objc2-core-foundation", 4291 4680 "objc2-core-graphics", 4292 - "objc2-foundation 0.3.1", 4681 + "objc2-foundation 0.3.2", 4293 4682 "once_cell", 4294 - "png", 4683 + "png 0.17.16", 4295 4684 "serde", 4296 - "thiserror 2.0.12", 4297 - "windows-sys 0.59.0", 4685 + "thiserror 2.0.17", 4686 + "windows-sys 0.60.2", 4687 + ] 4688 + 4689 + [[package]] 4690 + name = "tree_magic_mini" 4691 + version = "3.2.1" 4692 + source = "registry+https://github.com/rust-lang/crates.io-index" 4693 + checksum = "52fac5f7d176f7f7f7e827299ead28ef98de642c5d93a97e0cd0816d17557f19" 4694 + dependencies = [ 4695 + "memchr", 4696 + "nom 7.1.3", 4697 + "petgraph", 4298 4698 ] 4299 4699 4300 4700 [[package]] ··· 4311 4711 4312 4712 [[package]] 4313 4713 name = "typenum" 4314 - version = "1.18.0" 4714 + version = "1.19.0" 4315 4715 source = "registry+https://github.com/rust-lang/crates.io-index" 4316 - checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 4716 + checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" 4317 4717 4318 4718 [[package]] 4319 4719 name = "uds_windows" ··· 4369 4769 4370 4770 [[package]] 4371 4771 name = "unicode-ident" 4372 - version = "1.0.18" 4772 + version = "1.0.22" 4373 4773 source = "registry+https://github.com/rust-lang/crates.io-index" 4374 - checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 4774 + checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" 4375 4775 4376 4776 [[package]] 4377 4777 name = "unicode-segmentation" ··· 4381 4781 4382 4782 [[package]] 4383 4783 name = "url" 4384 - version = "2.5.4" 4784 + version = "2.5.7" 4385 4785 source = "registry+https://github.com/rust-lang/crates.io-index" 4386 - checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 4786 + checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" 4387 4787 dependencies = [ 4388 4788 "form_urlencoded", 4389 4789 "idna", ··· 4417 4817 4418 4818 [[package]] 4419 4819 name = "uuid" 4420 - version = "1.17.0" 4820 + version = "1.18.1" 4421 4821 source = "registry+https://github.com/rust-lang/crates.io-index" 4422 - checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" 4822 + checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" 4423 4823 dependencies = [ 4424 - "getrandom 0.3.3", 4824 + "getrandom 0.3.4", 4425 4825 "js-sys", 4426 4826 "serde", 4427 4827 "wasm-bindgen", ··· 4429 4829 4430 4830 [[package]] 4431 4831 name = "version-compare" 4432 - version = "0.2.0" 4832 + version = "0.2.1" 4433 4833 source = "registry+https://github.com/rust-lang/crates.io-index" 4434 - checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" 4834 + checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" 4435 4835 4436 4836 [[package]] 4437 4837 name = "version_check" ··· 4491 4891 checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 4492 4892 4493 4893 [[package]] 4494 - name = "wasi" 4495 - version = "0.14.2+wasi-0.2.4" 4894 + name = "wasip2" 4895 + version = "1.0.1+wasi-0.2.4" 4496 4896 source = "registry+https://github.com/rust-lang/crates.io-index" 4497 - checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 4897 + checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" 4498 4898 dependencies = [ 4499 - "wit-bindgen-rt", 4899 + "wit-bindgen", 4500 4900 ] 4501 4901 4502 4902 [[package]] 4503 4903 name = "wasm-bindgen" 4504 - version = "0.2.100" 4904 + version = "0.2.105" 4505 4905 source = "registry+https://github.com/rust-lang/crates.io-index" 4506 - checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 4906 + checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" 4507 4907 dependencies = [ 4508 4908 "cfg-if", 4509 4909 "once_cell", 4510 4910 "rustversion", 4511 4911 "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 4912 "wasm-bindgen-shared", 4526 4913 ] 4527 4914 4528 4915 [[package]] 4529 4916 name = "wasm-bindgen-futures" 4530 - version = "0.4.50" 4917 + version = "0.4.55" 4531 4918 source = "registry+https://github.com/rust-lang/crates.io-index" 4532 - checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 4919 + checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" 4533 4920 dependencies = [ 4534 4921 "cfg-if", 4535 4922 "js-sys", ··· 4540 4927 4541 4928 [[package]] 4542 4929 name = "wasm-bindgen-macro" 4543 - version = "0.2.100" 4930 + version = "0.2.105" 4544 4931 source = "registry+https://github.com/rust-lang/crates.io-index" 4545 - checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 4932 + checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" 4546 4933 dependencies = [ 4547 4934 "quote", 4548 4935 "wasm-bindgen-macro-support", ··· 4550 4937 4551 4938 [[package]] 4552 4939 name = "wasm-bindgen-macro-support" 4553 - version = "0.2.100" 4940 + version = "0.2.105" 4554 4941 source = "registry+https://github.com/rust-lang/crates.io-index" 4555 - checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 4942 + checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" 4556 4943 dependencies = [ 4944 + "bumpalo", 4557 4945 "proc-macro2", 4558 4946 "quote", 4559 - "syn 2.0.104", 4560 - "wasm-bindgen-backend", 4947 + "syn 2.0.109", 4561 4948 "wasm-bindgen-shared", 4562 4949 ] 4563 4950 4564 4951 [[package]] 4565 4952 name = "wasm-bindgen-shared" 4566 - version = "0.2.100" 4953 + version = "0.2.105" 4567 4954 source = "registry+https://github.com/rust-lang/crates.io-index" 4568 - checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 4955 + checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" 4569 4956 dependencies = [ 4570 4957 "unicode-ident", 4571 4958 ] ··· 4591 4978 dependencies = [ 4592 4979 "cc", 4593 4980 "downcast-rs", 4594 - "rustix", 4981 + "rustix 1.1.2", 4595 4982 "scoped-tls", 4596 4983 "smallvec", 4597 4984 "wayland-sys", ··· 4603 4990 source = "registry+https://github.com/rust-lang/crates.io-index" 4604 4991 checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" 4605 4992 dependencies = [ 4606 - "bitflags 2.9.1", 4607 - "rustix", 4993 + "bitflags 2.10.0", 4994 + "rustix 1.1.2", 4608 4995 "wayland-backend", 4609 4996 "wayland-scanner", 4610 4997 ] ··· 4615 5002 source = "registry+https://github.com/rust-lang/crates.io-index" 4616 5003 checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" 4617 5004 dependencies = [ 4618 - "bitflags 2.9.1", 5005 + "bitflags 2.10.0", 4619 5006 "wayland-backend", 4620 5007 "wayland-client", 4621 5008 "wayland-scanner", 4622 5009 ] 4623 5010 4624 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]] 4625 5025 name = "wayland-scanner" 4626 5026 version = "0.31.7" 4627 5027 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4645 5045 4646 5046 [[package]] 4647 5047 name = "web-sys" 4648 - version = "0.3.77" 5048 + version = "0.3.82" 4649 5049 source = "registry+https://github.com/rust-lang/crates.io-index" 4650 - checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 5050 + checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" 4651 5051 dependencies = [ 4652 5052 "js-sys", 4653 5053 "wasm-bindgen", ··· 4706 5106 "webview2-com-macros", 4707 5107 "webview2-com-sys", 4708 5108 "windows", 4709 - "windows-core", 5109 + "windows-core 0.61.2", 4710 5110 "windows-implement", 4711 5111 "windows-interface", 4712 5112 ] ··· 4719 5119 dependencies = [ 4720 5120 "proc-macro2", 4721 5121 "quote", 4722 - "syn 2.0.104", 5122 + "syn 2.0.109", 4723 5123 ] 4724 5124 4725 5125 [[package]] ··· 4728 5128 source = "registry+https://github.com/rust-lang/crates.io-index" 4729 5129 checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" 4730 5130 dependencies = [ 4731 - "thiserror 2.0.12", 5131 + "thiserror 2.0.17", 4732 5132 "windows", 4733 - "windows-core", 5133 + "windows-core 0.61.2", 4734 5134 ] 4735 5135 4736 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]] 4737 5143 name = "winapi" 4738 5144 version = "0.3.9" 4739 5145 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4751 5157 4752 5158 [[package]] 4753 5159 name = "winapi-util" 4754 - version = "0.1.9" 5160 + version = "0.1.11" 4755 5161 source = "registry+https://github.com/rust-lang/crates.io-index" 4756 - checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 5162 + checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" 4757 5163 dependencies = [ 4758 - "windows-sys 0.59.0", 5164 + "windows-sys 0.61.2", 4759 5165 ] 4760 5166 4761 5167 [[package]] ··· 4770 5176 source = "registry+https://github.com/rust-lang/crates.io-index" 4771 5177 checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" 4772 5178 dependencies = [ 4773 - "objc2 0.6.1", 5179 + "objc2 0.6.3", 4774 5180 "objc2-app-kit", 4775 5181 "objc2-core-foundation", 4776 - "objc2-foundation 0.3.1", 5182 + "objc2-foundation 0.3.2", 4777 5183 "raw-window-handle", 4778 5184 "windows-sys 0.59.0", 4779 5185 "windows-version", ··· 4786 5192 checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" 4787 5193 dependencies = [ 4788 5194 "windows-collections", 4789 - "windows-core", 5195 + "windows-core 0.61.2", 4790 5196 "windows-future", 4791 - "windows-link", 5197 + "windows-link 0.1.3", 4792 5198 "windows-numerics", 4793 5199 ] 4794 5200 ··· 4798 5204 source = "registry+https://github.com/rust-lang/crates.io-index" 4799 5205 checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" 4800 5206 dependencies = [ 4801 - "windows-core", 5207 + "windows-core 0.61.2", 4802 5208 ] 4803 5209 4804 5210 [[package]] ··· 4809 5215 dependencies = [ 4810 5216 "windows-implement", 4811 5217 "windows-interface", 4812 - "windows-link", 4813 - "windows-result", 4814 - "windows-strings", 5218 + "windows-link 0.1.3", 5219 + "windows-result 0.3.4", 5220 + "windows-strings 0.4.2", 5221 + ] 5222 + 5223 + [[package]] 5224 + name = "windows-core" 5225 + version = "0.62.2" 5226 + source = "registry+https://github.com/rust-lang/crates.io-index" 5227 + checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" 5228 + dependencies = [ 5229 + "windows-implement", 5230 + "windows-interface", 5231 + "windows-link 0.2.1", 5232 + "windows-result 0.4.1", 5233 + "windows-strings 0.5.1", 4815 5234 ] 4816 5235 4817 5236 [[package]] ··· 4820 5239 source = "registry+https://github.com/rust-lang/crates.io-index" 4821 5240 checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" 4822 5241 dependencies = [ 4823 - "windows-core", 4824 - "windows-link", 5242 + "windows-core 0.61.2", 5243 + "windows-link 0.1.3", 4825 5244 "windows-threading", 4826 5245 ] 4827 5246 4828 5247 [[package]] 4829 5248 name = "windows-implement" 4830 - version = "0.60.0" 5249 + version = "0.60.2" 4831 5250 source = "registry+https://github.com/rust-lang/crates.io-index" 4832 - checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" 5251 + checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" 4833 5252 dependencies = [ 4834 5253 "proc-macro2", 4835 5254 "quote", 4836 - "syn 2.0.104", 5255 + "syn 2.0.109", 4837 5256 ] 4838 5257 4839 5258 [[package]] 4840 5259 name = "windows-interface" 4841 - version = "0.59.1" 5260 + version = "0.59.3" 4842 5261 source = "registry+https://github.com/rust-lang/crates.io-index" 4843 - checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" 5262 + checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" 4844 5263 dependencies = [ 4845 5264 "proc-macro2", 4846 5265 "quote", 4847 - "syn 2.0.104", 5266 + "syn 2.0.109", 4848 5267 ] 4849 5268 4850 5269 [[package]] ··· 4854 5273 checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 4855 5274 4856 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]] 4857 5282 name = "windows-numerics" 4858 5283 version = "0.2.0" 4859 5284 source = "registry+https://github.com/rust-lang/crates.io-index" 4860 5285 checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" 4861 5286 dependencies = [ 4862 - "windows-core", 4863 - "windows-link", 5287 + "windows-core 0.61.2", 5288 + "windows-link 0.1.3", 4864 5289 ] 4865 5290 4866 5291 [[package]] ··· 4869 5294 source = "registry+https://github.com/rust-lang/crates.io-index" 4870 5295 checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" 4871 5296 dependencies = [ 4872 - "windows-link", 5297 + "windows-link 0.1.3", 5298 + ] 5299 + 5300 + [[package]] 5301 + name = "windows-result" 5302 + version = "0.4.1" 5303 + source = "registry+https://github.com/rust-lang/crates.io-index" 5304 + checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" 5305 + dependencies = [ 5306 + "windows-link 0.2.1", 4873 5307 ] 4874 5308 4875 5309 [[package]] ··· 4878 5312 source = "registry+https://github.com/rust-lang/crates.io-index" 4879 5313 checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" 4880 5314 dependencies = [ 4881 - "windows-link", 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", 4882 5325 ] 4883 5326 4884 5327 [[package]] ··· 4905 5348 source = "registry+https://github.com/rust-lang/crates.io-index" 4906 5349 checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 4907 5350 dependencies = [ 4908 - "windows-targets 0.53.3", 5351 + "windows-targets 0.53.5", 5352 + ] 5353 + 5354 + [[package]] 5355 + name = "windows-sys" 5356 + version = "0.61.2" 5357 + source = "registry+https://github.com/rust-lang/crates.io-index" 5358 + checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" 5359 + dependencies = [ 5360 + "windows-link 0.2.1", 4909 5361 ] 4910 5362 4911 5363 [[package]] ··· 4941 5393 4942 5394 [[package]] 4943 5395 name = "windows-targets" 4944 - version = "0.53.3" 5396 + version = "0.53.5" 4945 5397 source = "registry+https://github.com/rust-lang/crates.io-index" 4946 - checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" 5398 + checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" 4947 5399 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", 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", 4957 5409 ] 4958 5410 4959 5411 [[package]] ··· 4962 5414 source = "registry+https://github.com/rust-lang/crates.io-index" 4963 5415 checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" 4964 5416 dependencies = [ 4965 - "windows-link", 5417 + "windows-link 0.1.3", 4966 5418 ] 4967 5419 4968 5420 [[package]] 4969 5421 name = "windows-version" 4970 - version = "0.1.4" 5422 + version = "0.1.7" 4971 5423 source = "registry+https://github.com/rust-lang/crates.io-index" 4972 - checksum = "e04a5c6627e310a23ad2358483286c7df260c964eb2d003d8efd6d0f4e79265c" 5424 + checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" 4973 5425 dependencies = [ 4974 - "windows-link", 5426 + "windows-link 0.2.1", 4975 5427 ] 4976 5428 4977 5429 [[package]] ··· 4988 5440 4989 5441 [[package]] 4990 5442 name = "windows_aarch64_gnullvm" 4991 - version = "0.53.0" 5443 + version = "0.53.1" 4992 5444 source = "registry+https://github.com/rust-lang/crates.io-index" 4993 - checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 5445 + checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" 4994 5446 4995 5447 [[package]] 4996 5448 name = "windows_aarch64_msvc" ··· 5006 5458 5007 5459 [[package]] 5008 5460 name = "windows_aarch64_msvc" 5009 - version = "0.53.0" 5461 + version = "0.53.1" 5010 5462 source = "registry+https://github.com/rust-lang/crates.io-index" 5011 - checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 5463 + checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" 5012 5464 5013 5465 [[package]] 5014 5466 name = "windows_i686_gnu" ··· 5024 5476 5025 5477 [[package]] 5026 5478 name = "windows_i686_gnu" 5027 - version = "0.53.0" 5479 + version = "0.53.1" 5028 5480 source = "registry+https://github.com/rust-lang/crates.io-index" 5029 - checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 5481 + checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" 5030 5482 5031 5483 [[package]] 5032 5484 name = "windows_i686_gnullvm" ··· 5036 5488 5037 5489 [[package]] 5038 5490 name = "windows_i686_gnullvm" 5039 - version = "0.53.0" 5491 + version = "0.53.1" 5040 5492 source = "registry+https://github.com/rust-lang/crates.io-index" 5041 - checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 5493 + checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" 5042 5494 5043 5495 [[package]] 5044 5496 name = "windows_i686_msvc" ··· 5054 5506 5055 5507 [[package]] 5056 5508 name = "windows_i686_msvc" 5057 - version = "0.53.0" 5509 + version = "0.53.1" 5058 5510 source = "registry+https://github.com/rust-lang/crates.io-index" 5059 - checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 5511 + checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" 5060 5512 5061 5513 [[package]] 5062 5514 name = "windows_x86_64_gnu" ··· 5072 5524 5073 5525 [[package]] 5074 5526 name = "windows_x86_64_gnu" 5075 - version = "0.53.0" 5527 + version = "0.53.1" 5076 5528 source = "registry+https://github.com/rust-lang/crates.io-index" 5077 - checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 5529 + checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" 5078 5530 5079 5531 [[package]] 5080 5532 name = "windows_x86_64_gnullvm" ··· 5090 5542 5091 5543 [[package]] 5092 5544 name = "windows_x86_64_gnullvm" 5093 - version = "0.53.0" 5545 + version = "0.53.1" 5094 5546 source = "registry+https://github.com/rust-lang/crates.io-index" 5095 - checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 5547 + checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" 5096 5548 5097 5549 [[package]] 5098 5550 name = "windows_x86_64_msvc" ··· 5108 5560 5109 5561 [[package]] 5110 5562 name = "windows_x86_64_msvc" 5111 - version = "0.53.0" 5563 + version = "0.53.1" 5112 5564 source = "registry+https://github.com/rust-lang/crates.io-index" 5113 - checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 5565 + checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" 5114 5566 5115 5567 [[package]] 5116 5568 name = "winnow" ··· 5123 5575 5124 5576 [[package]] 5125 5577 name = "winnow" 5126 - version = "0.7.12" 5578 + version = "0.7.13" 5127 5579 source = "registry+https://github.com/rust-lang/crates.io-index" 5128 - checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" 5580 + checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" 5129 5581 dependencies = [ 5130 5582 "memchr", 5131 5583 ] ··· 5141 5593 ] 5142 5594 5143 5595 [[package]] 5144 - name = "wit-bindgen-rt" 5145 - version = "0.39.0" 5596 + name = "wit-bindgen" 5597 + version = "0.46.0" 5146 5598 source = "registry+https://github.com/rust-lang/crates.io-index" 5147 - checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 5599 + checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" 5600 + 5601 + [[package]] 5602 + name = "wl-clipboard-rs" 5603 + version = "0.9.2" 5604 + source = "registry+https://github.com/rust-lang/crates.io-index" 5605 + checksum = "8e5ff8d0e60065f549fafd9d6cb626203ea64a798186c80d8e7df4f8af56baeb" 5148 5606 dependencies = [ 5149 - "bitflags 2.9.1", 5607 + "libc", 5608 + "log", 5609 + "os_pipe", 5610 + "rustix 0.38.44", 5611 + "tempfile", 5612 + "thiserror 2.0.17", 5613 + "tree_magic_mini", 5614 + "wayland-backend", 5615 + "wayland-client", 5616 + "wayland-protocols", 5617 + "wayland-protocols-wlr", 5150 5618 ] 5151 5619 5152 5620 [[package]] 5153 5621 name = "writeable" 5154 - version = "0.6.1" 5622 + version = "0.6.2" 5155 5623 source = "registry+https://github.com/rust-lang/crates.io-index" 5156 - checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 5624 + checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" 5157 5625 5158 5626 [[package]] 5159 5627 name = "wry" 5160 - version = "0.52.1" 5628 + version = "0.53.5" 5161 5629 source = "registry+https://github.com/rust-lang/crates.io-index" 5162 - checksum = "12a714d9ba7075aae04a6e50229d6109e3d584774b99a6a8c60de1698ca111b9" 5630 + checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2" 5163 5631 dependencies = [ 5164 5632 "base64 0.22.1", 5165 - "block2 0.6.1", 5633 + "block2 0.6.2", 5166 5634 "cookie", 5167 5635 "crossbeam-channel", 5636 + "dirs", 5168 5637 "dpi", 5169 5638 "dunce", 5170 5639 "gdkx11", ··· 5176 5645 "kuchikiki", 5177 5646 "libc", 5178 5647 "ndk", 5179 - "objc2 0.6.1", 5648 + "objc2 0.6.3", 5180 5649 "objc2-app-kit", 5181 5650 "objc2-core-foundation", 5182 - "objc2-foundation 0.3.1", 5651 + "objc2-foundation 0.3.2", 5183 5652 "objc2-ui-kit", 5184 5653 "objc2-web-kit", 5185 5654 "once_cell", ··· 5188 5657 "sha2", 5189 5658 "soup3", 5190 5659 "tao-macros", 5191 - "thiserror 2.0.12", 5660 + "thiserror 2.0.17", 5192 5661 "url", 5193 5662 "webkit2gtk", 5194 5663 "webkit2gtk-sys", 5195 5664 "webview2-com", 5196 5665 "windows", 5197 - "windows-core", 5666 + "windows-core 0.61.2", 5198 5667 "windows-version", 5199 5668 "x11-dl", 5200 5669 ] ··· 5221 5690 ] 5222 5691 5223 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]] 5224 5727 name = "yoke" 5225 - version = "0.8.0" 5728 + version = "0.8.1" 5226 5729 source = "registry+https://github.com/rust-lang/crates.io-index" 5227 - checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 5730 + checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" 5228 5731 dependencies = [ 5229 - "serde", 5230 5732 "stable_deref_trait", 5231 5733 "yoke-derive", 5232 5734 "zerofrom", ··· 5234 5736 5235 5737 [[package]] 5236 5738 name = "yoke-derive" 5237 - version = "0.8.0" 5739 + version = "0.8.1" 5238 5740 source = "registry+https://github.com/rust-lang/crates.io-index" 5239 - checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 5741 + checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" 5240 5742 dependencies = [ 5241 5743 "proc-macro2", 5242 5744 "quote", 5243 - "syn 2.0.104", 5745 + "syn 2.0.109", 5244 5746 "synstructure", 5245 5747 ] 5246 5748 5247 5749 [[package]] 5248 5750 name = "zbus" 5249 - version = "5.9.0" 5751 + version = "5.12.0" 5250 5752 source = "registry+https://github.com/rust-lang/crates.io-index" 5251 - checksum = "4bb4f9a464286d42851d18a605f7193b8febaf5b0919d71c6399b7b26e5b0aad" 5753 + checksum = "b622b18155f7a93d1cd2dc8c01d2d6a44e08fb9ebb7b3f9e6ed101488bad6c91" 5252 5754 dependencies = [ 5253 5755 "async-broadcast", 5254 5756 "async-executor", ··· 5271 5773 "tokio", 5272 5774 "tracing", 5273 5775 "uds_windows", 5274 - "windows-sys 0.59.0", 5275 - "winnow 0.7.12", 5776 + "uuid", 5777 + "windows-sys 0.61.2", 5778 + "winnow 0.7.13", 5276 5779 "zbus_macros", 5277 5780 "zbus_names", 5278 5781 "zvariant", ··· 5280 5783 5281 5784 [[package]] 5282 5785 name = "zbus_macros" 5283 - version = "5.9.0" 5786 + version = "5.12.0" 5284 5787 source = "registry+https://github.com/rust-lang/crates.io-index" 5285 - checksum = "ef9859f68ee0c4ee2e8cde84737c78e3f4c54f946f2a38645d0d4c7a95327659" 5788 + checksum = "1cdb94821ca8a87ca9c298b5d1cbd80e2a8b67115d99f6e4551ac49e42b6a314" 5286 5789 dependencies = [ 5287 - "proc-macro-crate 3.3.0", 5790 + "proc-macro-crate 3.4.0", 5288 5791 "proc-macro2", 5289 5792 "quote", 5290 - "syn 2.0.104", 5793 + "syn 2.0.109", 5291 5794 "zbus_names", 5292 5795 "zvariant", 5293 5796 "zvariant_utils", ··· 5301 5804 dependencies = [ 5302 5805 "serde", 5303 5806 "static_assertions", 5304 - "winnow 0.7.12", 5807 + "winnow 0.7.13", 5305 5808 "zvariant", 5306 5809 ] 5307 5810 5308 5811 [[package]] 5309 5812 name = "zerocopy" 5310 - version = "0.8.26" 5813 + version = "0.8.27" 5311 5814 source = "registry+https://github.com/rust-lang/crates.io-index" 5312 - checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" 5815 + checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" 5313 5816 dependencies = [ 5314 5817 "zerocopy-derive", 5315 5818 ] 5316 5819 5317 5820 [[package]] 5318 5821 name = "zerocopy-derive" 5319 - version = "0.8.26" 5822 + version = "0.8.27" 5320 5823 source = "registry+https://github.com/rust-lang/crates.io-index" 5321 - checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" 5824 + checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" 5322 5825 dependencies = [ 5323 5826 "proc-macro2", 5324 5827 "quote", 5325 - "syn 2.0.104", 5828 + "syn 2.0.109", 5326 5829 ] 5327 5830 5328 5831 [[package]] ··· 5342 5845 dependencies = [ 5343 5846 "proc-macro2", 5344 5847 "quote", 5345 - "syn 2.0.104", 5848 + "syn 2.0.109", 5346 5849 "synstructure", 5347 5850 ] 5348 5851 5349 5852 [[package]] 5350 5853 name = "zerotrie" 5351 - version = "0.2.2" 5854 + version = "0.2.3" 5352 5855 source = "registry+https://github.com/rust-lang/crates.io-index" 5353 - checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 5856 + checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" 5354 5857 dependencies = [ 5355 5858 "displaydoc", 5356 5859 "yoke", ··· 5359 5862 5360 5863 [[package]] 5361 5864 name = "zerovec" 5362 - version = "0.11.2" 5865 + version = "0.11.5" 5363 5866 source = "registry+https://github.com/rust-lang/crates.io-index" 5364 - checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" 5867 + checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" 5365 5868 dependencies = [ 5366 5869 "yoke", 5367 5870 "zerofrom", ··· 5370 5873 5371 5874 [[package]] 5372 5875 name = "zerovec-derive" 5373 - version = "0.11.1" 5876 + version = "0.11.2" 5374 5877 source = "registry+https://github.com/rust-lang/crates.io-index" 5375 - checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 5878 + checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" 5376 5879 dependencies = [ 5377 5880 "proc-macro2", 5378 5881 "quote", 5379 - "syn 2.0.104", 5882 + "syn 2.0.109", 5883 + ] 5884 + 5885 + [[package]] 5886 + name = "zune-core" 5887 + version = "0.4.12" 5888 + source = "registry+https://github.com/rust-lang/crates.io-index" 5889 + checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" 5890 + 5891 + [[package]] 5892 + name = "zune-jpeg" 5893 + version = "0.4.21" 5894 + source = "registry+https://github.com/rust-lang/crates.io-index" 5895 + checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" 5896 + dependencies = [ 5897 + "zune-core", 5380 5898 ] 5381 5899 5382 5900 [[package]] 5383 5901 name = "zvariant" 5384 - version = "5.6.0" 5902 + version = "5.8.0" 5385 5903 source = "registry+https://github.com/rust-lang/crates.io-index" 5386 - checksum = "d91b3680bb339216abd84714172b5138a4edac677e641ef17e1d8cb1b3ca6e6f" 5904 + checksum = "2be61892e4f2b1772727be11630a62664a1826b62efa43a6fe7449521cb8744c" 5387 5905 dependencies = [ 5388 5906 "endi", 5389 5907 "enumflags2", 5390 5908 "serde", 5391 5909 "url", 5392 - "winnow 0.7.12", 5910 + "winnow 0.7.13", 5393 5911 "zvariant_derive", 5394 5912 "zvariant_utils", 5395 5913 ] 5396 5914 5397 5915 [[package]] 5398 5916 name = "zvariant_derive" 5399 - version = "5.6.0" 5917 + version = "5.8.0" 5400 5918 source = "registry+https://github.com/rust-lang/crates.io-index" 5401 - checksum = "3a8c68501be459a8dbfffbe5d792acdd23b4959940fc87785fb013b32edbc208" 5919 + checksum = "da58575a1b2b20766513b1ec59d8e2e68db2745379f961f86650655e862d2006" 5402 5920 dependencies = [ 5403 - "proc-macro-crate 3.3.0", 5921 + "proc-macro-crate 3.4.0", 5404 5922 "proc-macro2", 5405 5923 "quote", 5406 - "syn 2.0.104", 5924 + "syn 2.0.109", 5407 5925 "zvariant_utils", 5408 5926 ] 5409 5927 5410 5928 [[package]] 5411 5929 name = "zvariant_utils" 5412 - version = "3.2.0" 5930 + version = "3.2.1" 5413 5931 source = "registry+https://github.com/rust-lang/crates.io-index" 5414 - checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" 5932 + checksum = "c6949d142f89f6916deca2232cf26a8afacf2b9fdc35ce766105e104478be599" 5415 5933 dependencies = [ 5416 5934 "proc-macro2", 5417 5935 "quote", 5418 5936 "serde", 5419 - "static_assertions", 5420 - "syn 2.0.104", 5421 - "winnow 0.7.12", 5937 + "syn 2.0.109", 5938 + "winnow 0.7.13", 5422 5939 ]
+12 -6
src-tauri/Cargo.toml
··· 18 18 tauri-build = { version = "2", features = [] } 19 19 20 20 [dependencies] 21 - tauri = { version = "2", features = [] } 21 + tauri = { version = "2", features = [ 'tray-icon', 'image-png' ] } 22 22 tauri-plugin-opener = "2" 23 23 serde = { version = "1", features = ["derive"] } 24 24 serde_json = "1" 25 - tokio = { version = "1.47.0", features = [ "macros" ] } 26 - dirs = "6.0.0" 27 - anyhow = "1.0.99" 28 - flate2 = "1.1.2" 25 + tokio = { version = "1.47", features = [ "macros" ] } 26 + dirs = "6.0" 27 + anyhow = "1.0" 28 + flate2 = "1.1" 29 29 tauri-plugin-dialog = "2" 30 - crossbeam-channel = "0.5.15" 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" 31 37
+4 -1
src-tauri/capabilities/default.json
··· 9 9 "core:default", 10 10 "core:window:allow-destroy", 11 11 "opener:default", 12 - "dialog:default" 12 + "dialog:default", 13 + "clipboard-manager:allow-read-text", 14 + "clipboard-manager:allow-write-text", 15 + "os:default" 13 16 ] 14 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 1 use std::collections::HashMap; 2 2 3 - use tauri::State; 3 + use tauri::{State, Window}; 4 4 5 - use crate::{ structs::nodes::Node, utils::config::Config }; 5 + use crate::{structs::nodes::Node, utils::config::Config}; 6 6 7 7 #[tauri::command] 8 - pub fn load_previous_tabs( conf: State<Config> ) -> HashMap<String, ( Vec<Node>, String, Option<String> )> { 8 + pub fn load_previous_tabs( 9 + window: Window, 10 + conf: State<Config>, 11 + ) -> HashMap<String, (Vec<Node>, String, Option<String>, bool)> { 9 12 let config = conf.store.lock().unwrap(); 10 13 14 + if !config.hide_editor_on_start { 15 + window.show().unwrap(); 16 + } 17 + 11 18 let tabs = config.loaded_tabs.clone(); 12 19 tabs 13 - } 20 + }
+3 -1
src-tauri/src/frontend_calls/mod.rs
··· 1 + pub mod close_app; 1 2 pub mod get_addresses; 3 + pub mod load_previous_tabs; 2 4 pub mod save_graph; 5 + pub mod settings; 3 6 pub mod sync_tab; 4 - pub mod load_previous_tabs;
+6 -3
src-tauri/src/frontend_calls/save_graph.rs
··· 1 1 use std::{fs::File, io::Write, path::PathBuf}; 2 2 3 3 use flate2::{write::GzEncoder, Compression}; 4 + use tauri::State; 5 + 6 + use crate::utils::config::Config; 4 7 5 8 #[tauri::command] 6 - pub fn save_graph( graph: String, path: PathBuf ) { 7 - dbg!(&graph, &path); 8 - 9 + pub fn save_graph(graph: String, path: PathBuf, conf: State<Config>) { 9 10 let file = File::create(&path).unwrap(); 10 11 let mut encoder = GzEncoder::new(file, Compression::default()); 11 12 12 13 encoder.write_all(graph.as_bytes()).unwrap(); 13 14 encoder.finish().unwrap(); 15 + 16 + conf.save(); 14 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 chrono::Utc; 1 2 use crossbeam_channel::Sender; 2 3 3 4 use tauri::State; 4 5 5 - use crate::{ runtime::commands::RuntimeCommand, structs::nodes::Node, utils::config::Config }; 6 + use crate::{runtime::commands::RuntimeCommand, structs::nodes::Node, utils::config::Config}; 6 7 7 8 #[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(); 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(); 10 21 11 22 let mut config = conf.store.lock().unwrap(); 12 - config.loaded_tabs.insert(id, ( graph, name, location )); 13 - drop(config); 23 + config.loaded_tabs.insert(id, (graph, name, location, save_state)); 14 24 15 - conf.save(); 25 + conf.save_prelocked(config); 16 26 } 17 27 18 28 #[tauri::command] 19 - pub fn discard_tab( id: String, cmd: State<Sender<RuntimeCommand>>, conf: State<Config> ){ 29 + pub fn discard_tab(id: String, cmd: State<Sender<RuntimeCommand>>, conf: State<Config>) { 20 30 cmd.send(RuntimeCommand::RemoveTab(id.clone())).unwrap(); 21 31 22 32 let mut config = conf.store.lock().unwrap(); 23 33 config.loaded_tabs.remove(&id); 24 - drop(config); 25 - 26 - conf.save(); 27 - } 34 + }
+15 -10
src-tauri/src/lib.rs
··· 1 - use std::{ fs, sync::Mutex }; 1 + use std::{fs, sync::Mutex}; 2 2 3 3 use crossbeam_channel::bounded; 4 4 use frontend_calls::*; 5 5 6 - use crate::{ osc::OSCMessage, setup::setup, utils::config::Config }; 6 + use crate::{osc::OSCMessage, setup::setup, utils::{config::Config, vrchat_builtin_parameters}}; 7 7 8 8 mod frontend_calls; 9 9 mod osc; 10 + mod runtime; 10 11 mod setup; 11 12 mod structs; 12 13 mod utils; 13 - mod runtime; 14 14 15 15 #[cfg_attr(mobile, tauri::mobile_entry_point)] 16 16 #[tokio::main] 17 17 pub async fn run() { 18 - // TODO: Impl background running by default 19 - 20 18 let container_folder = dirs::config_dir().unwrap().join("VRCMacros"); 21 19 22 20 match fs::metadata(&container_folder) { 23 21 Ok(meta) => { 24 22 if meta.is_file() { 25 - panic!( 26 - "document.write('Cannot launch app as the container path is a file not a directory')" 27 - ); 23 + panic!("Cannot launch app as the container path is a file not a directory"); 28 24 } 29 25 } 30 26 Err(_) => { ··· 37 33 38 34 static ADDRESSES: Mutex<Vec<OSCMessage>> = Mutex::new(Vec::new()); 39 35 40 - let ( runtime_sender, runtime_receiver ) = bounded(1024); 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 41 42 42 tauri::Builder::default() 43 + .plugin(tauri_plugin_os::init()) 44 + .plugin(tauri_plugin_clipboard_manager::init()) 43 45 .plugin(tauri_plugin_dialog::init()) 44 46 .plugin(tauri_plugin_opener::init()) 45 47 .invoke_handler(tauri::generate_handler![ ··· 47 49 save_graph::save_graph, 48 50 sync_tab::sync_tab, 49 51 sync_tab::discard_tab, 50 - load_previous_tabs::load_previous_tabs 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, 51 56 ]) 52 57 .manage(conf) 53 58 .manage(&ADDRESSES)
+3 -1
src-tauri/src/main.rs
··· 3 3 4 4 fn main() { 5 5 #[cfg(target_os = "linux")] 6 - std::env::set_var("WEBKIT_DISABLE_DMABUF_RENDERER", "1"); // Fix webkit being shit 6 + unsafe{ 7 + std::env::set_var("WEBKIT_DISABLE_DMABUF_RENDERER", "1"); // Fix webkit being shit 8 + } 7 9 8 10 vrcmacros_lib::run() 9 11 }
-1
src-tauri/src/osc.rs
··· 160 160 } 161 161 } 162 162 163 - println!("{:X?}", &buf); 164 163 socket.send_to(&buf, ip_addr).unwrap(); 165 164 }
+4 -4
src-tauri/src/runtime/commands.rs
··· 1 - use crate::{ osc::OSCMessage, structs::nodes::Node }; 1 + use crate::{osc::OSCMessage, structs::nodes::Node}; 2 2 3 3 #[derive(Debug)] 4 - pub enum RuntimeCommand{ 4 + pub enum RuntimeCommand { 5 5 OSCMessage(OSCMessage), 6 6 7 7 AddTab(Vec<Node>, String), 8 - RemoveTab(String) 9 - } 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 } }; 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 2 5 3 - pub struct ConditionalIfEqual{ 4 - outputs: Vec<Vec<( String, isize, isize )>>, 5 - value1: ParameterType, 6 - value2: ParameterType 6 + pub struct ConditionalIfEqual { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 7 9 } 8 10 9 - impl ConditionalIfEqual{ 10 - pub fn new( node: Node ) -> Box<Self>{ 11 - dbg!(&node); 12 - 11 + impl ConditionalIfEqual { 12 + pub fn new(node: Node) -> Box<Self> { 13 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, 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(), 20 26 }) 21 27 } 22 28 } 23 29 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![]) } 30 + impl RuntimeNode for ConditionalIfEqual { 31 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 32 + self.outputs.clone() 33 + } 27 34 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 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 36 + self.inputs.clone() 35 37 } 36 38 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 - } 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 47 48 + fn is_entrypoint(&self) -> bool { 48 49 false 49 50 } 50 - 51 - fn is_entrypoint( &self ) -> bool { false } 52 - } 51 + }
+38 -33
src-tauri/src/runtime/nodes/conditional/iffalse.rs
··· 1 - use crate::{ runtime::nodes::RuntimeNode, structs::{ nodes::Node, parameter_types::ParameterType } }; 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 2 5 3 - pub struct ConditionalIfFalse{ 4 - outputs: Vec<Vec<( String, isize, isize )>>, 5 - runtime_active: bool 6 + pub struct ConditionalIfFalse { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 6 9 } 7 10 8 - impl ConditionalIfFalse{ 9 - pub fn new( node: Node ) -> Box<Self>{ 10 - dbg!(&node); 11 - 11 + impl ConditionalIfFalse { 12 + pub fn new(node: Node) -> Box<Self> { 12 13 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 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(), 18 26 }) 19 27 } 20 28 } 21 29 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![]) } 30 + impl RuntimeNode for ConditionalIfFalse { 31 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 32 + self.outputs.clone() 33 + } 25 34 26 - fn execute( &mut self ) -> Option<Vec<ParameterType>> { 27 - Some(vec![ ParameterType::Flow(!self.runtime_active), ParameterType::Flow(self.runtime_active) ]) 35 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 36 + self.inputs.clone() 28 37 } 29 38 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 - } 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 + ] 43 46 } 44 47 45 - fn is_entrypoint( &self ) -> bool { false } 46 - } 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 } }; 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 2 5 3 - pub struct ConditionalIfTrue{ 4 - outputs: Vec<Vec<( String, isize, isize )>>, 5 - runtime_active: bool 6 + pub struct ConditionalIfTrue { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 6 9 } 7 10 8 - impl ConditionalIfTrue{ 9 - pub fn new( node: Node ) -> Box<Self>{ 10 - dbg!(&node); 11 - 11 + impl ConditionalIfTrue { 12 + pub fn new(node: Node) -> Box<Self> { 12 13 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 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(), 18 26 }) 19 27 } 20 28 } 21 29 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![]) } 30 + impl RuntimeNode for ConditionalIfTrue { 31 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 32 + self.outputs.clone() 33 + } 25 34 26 - fn execute( &mut self ) -> Option<Vec<ParameterType>> { 27 - Some(vec![ ParameterType::Flow(self.runtime_active), ParameterType::Flow(!self.runtime_active) ]) 35 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 36 + self.inputs.clone() 28 37 } 29 38 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 - } 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 + ] 43 46 } 44 47 45 - fn is_entrypoint( &self ) -> bool { false } 46 - } 48 + fn is_entrypoint(&self) -> bool { 49 + false 50 + } 51 + }
+2 -2
src-tauri/src/runtime/nodes/conditional/mod.rs
··· 1 - pub mod iftrue; 1 + pub mod ifequal; 2 2 pub mod iffalse; 3 - pub mod ifequal; 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 } }; 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 2 5 3 - pub struct Debug{ 4 - to_log: Option<ParameterType> 6 + pub struct Debug { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>> 5 9 } 6 10 7 - impl Debug{ 8 - pub fn new( _: Node ) -> Box<Self>{ 9 - Box::new(Self { to_log: None }) 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 + }) 10 27 } 11 28 } 12 29 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![]) } 30 + impl RuntimeNode for Debug { 31 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 32 + self.outputs.clone() 33 + } 16 34 17 - fn execute( &mut self ) -> Option<Vec<ParameterType>> { 18 - dbg!(&self.to_log); 19 - self.to_log = None; 35 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 36 + self.inputs.clone() 37 + } 20 38 21 - None 39 + fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType> { 40 + dbg!(&args); // TODO: Debug to actual UI instead of console 41 + vec![] 22 42 } 23 43 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 - } 44 + fn is_entrypoint(&self) -> bool { 45 + false 31 46 } 32 - 33 - fn is_entrypoint( &self ) -> bool { false } 34 - } 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 } }; 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 2 5 3 - pub struct OSCTrigger{ 4 - outputs: Vec<Vec<( String, isize, isize )>>, 5 - address: Option<String>, 6 - runtime_active: bool 7 - } 6 + pub struct OSCTrigger { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 8 9 9 - impl OSCTrigger{ 10 - pub fn new( node: Node ) -> Box<Self>{ 11 - dbg!(&node); 10 + address: Option<String> 11 + } 12 12 13 + impl OSCTrigger { 14 + pub fn new(node: Node) -> Box<Self> { 13 15 let value = &node.statics[0].value; 14 16 15 17 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 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 + }, 22 36 }) 23 37 } 24 38 } 25 39 26 - impl RuntimeNode for OSCTrigger{ 27 - fn outputs( &self ) -> Vec<Vec<( String, isize, isize )>> { 40 + impl RuntimeNode for OSCTrigger { 41 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 28 42 self.outputs.clone() 29 43 } 30 44 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 - } 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 } 36 51 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. 52 + let execute = if let Some(internal_address) = &self.address { 53 + if let Ok(address) = args[0].as_string() { 54 + address == *internal_address 45 55 } else{ 46 - self.runtime_active = false; 47 - None 56 + false 48 57 } 49 58 } else{ 50 - self.runtime_active = false; 51 - None 52 - } 59 + false 60 + }; 61 + 62 + args[0] = ParameterType::Flow(execute); 63 + args 53 64 } 54 65 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) ]) 66 + fn is_entrypoint(&self) -> bool { 67 + true 60 68 } 61 - 62 - fn update_arg( &mut self, _: usize, _: ParameterType ) -> bool { false } 63 - fn is_entrypoint( &self ) -> bool { true } 64 - } 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 } }; 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 2 5 3 - pub struct StaticFloat{ 4 - outputs: Vec<Vec<( String, isize, isize )>>, 5 - value: Option<f32> 6 + pub struct StaticFloat { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 9 + 10 + value: Option<f32>, 6 11 } 7 12 8 - impl StaticFloat{ 9 - pub fn new( node: Node ) -> Box<Self>{ 10 - dbg!(&node); 11 - 13 + impl StaticFloat { 14 + pub fn new(node: Node) -> Box<Self> { 12 15 let value = &node.statics[0].value; 13 16 14 17 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(), 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 + } 20 36 }) 21 37 } 22 38 } 23 39 24 - impl RuntimeNode for StaticFloat{ 25 - fn outputs( &self ) -> Vec<Vec<( String, isize, isize )>> { 40 + impl RuntimeNode for StaticFloat { 41 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 26 42 self.outputs.clone() 27 43 } 28 44 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 - } 45 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 46 + self.inputs.clone() 35 47 } 36 48 37 - fn execute( &mut self ) -> Option<Vec<ParameterType>> { None } 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 + } 38 56 39 - fn update_arg( &mut self, _: usize, _: ParameterType ) -> bool { false } 40 - fn is_entrypoint( &self ) -> bool { true } 41 - } 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 } }; 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 2 5 3 - pub struct StaticInt{ 4 - outputs: Vec<Vec<( String, isize, isize )>>, 5 - value: Option<i32> 6 + pub struct StaticInt { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 9 + 10 + value: Option<i32>, 6 11 } 7 12 8 - impl StaticInt{ 9 - pub fn new( node: Node ) -> Box<Self>{ 10 - dbg!(&node); 11 - 13 + impl StaticInt { 14 + pub fn new(node: Node) -> Box<Self> { 12 15 let value = &node.statics[0].value; 13 16 14 17 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(), 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 + } 20 36 }) 21 37 } 22 38 } 23 39 24 - impl RuntimeNode for StaticInt{ 25 - fn outputs( &self ) -> Vec<Vec<( String, isize, isize )>> { 40 + impl RuntimeNode for StaticInt { 41 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 26 42 self.outputs.clone() 27 43 } 28 44 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 - } 45 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 46 + self.inputs.clone() 35 47 } 36 48 37 - fn execute( &mut self ) -> Option<Vec<ParameterType>> { None } 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 + } 38 56 39 - fn update_arg( &mut self, _: usize, _: ParameterType ) -> bool { false } 40 - fn is_entrypoint( &self ) -> bool { true } 41 - } 57 + fn is_entrypoint(&self) -> bool { 58 + false 59 + } 60 + }
+2 -2
src-tauri/src/runtime/nodes/statics/mod.rs
··· 1 - pub mod string; 1 + pub mod float; 2 2 pub mod int; 3 - pub mod float; 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 } }; 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 2 5 3 - pub struct StaticString{ 4 - outputs: Vec<Vec<( String, isize, isize )>>, 5 - value: Option<String> 6 + pub struct StaticString { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 9 + 10 + value: Option<String>, 6 11 } 7 12 8 - impl StaticString{ 9 - pub fn new( node: Node ) -> Box<Self>{ 10 - dbg!(&node); 11 - 13 + impl StaticString { 14 + pub fn new(node: Node) -> Box<Self> { 12 15 let value = &node.statics[0].value; 13 16 14 17 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(), 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 + } 20 36 }) 21 37 } 22 38 } 23 39 24 - impl RuntimeNode for StaticString{ 25 - fn outputs( &self ) -> Vec<Vec<( String, isize, isize )>> { 40 + impl RuntimeNode for StaticString { 41 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 26 42 self.outputs.clone() 27 43 } 28 44 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 - } 45 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 46 + self.inputs.clone() 35 47 } 36 48 37 - fn execute( &mut self ) -> Option<Vec<ParameterType>> { None } 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 + } 38 56 39 - fn update_arg( &mut self, _: usize, _: ParameterType ) -> bool { false } 40 - fn is_entrypoint( &self ) -> bool { true } 41 - } 57 + fn is_entrypoint(&self) -> bool { 58 + false 59 + } 60 + }
+79 -26
src-tauri/src/runtime/nodes.rs
··· 1 - use std::collections::HashMap; 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 + }; 2 17 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 } }; 18 + // #[cfg(target_os = "windows")] 19 + use crate::runtime::nodes::press_key::PressKey; 4 20 21 + mod conditional; 22 + mod debug; 23 + mod oscactions; 5 24 mod osctrigger; 6 - mod debug; 7 25 mod statics; 8 - mod conditional; 26 + mod shell; 27 + 28 + // #[cfg(target_os = "windows")] 29 + mod press_key; 9 30 10 - pub struct RuntimeNodeTree{ 11 - pub nodes: HashMap<String, Box<dyn RuntimeNode>> 31 + pub struct RuntimeNodeTree { 32 + pub nodes: HashMap<String, Box<dyn RuntimeNode>>, 12 33 } 13 34 14 - unsafe impl Send for RuntimeNodeTree{} 35 + unsafe impl Send for RuntimeNodeTree {} 15 36 16 - impl RuntimeNodeTree{ 17 - pub fn from( tree: Vec<Node> ) -> Self{ 37 + impl RuntimeNodeTree { 38 + pub fn from(tree: Vec<Node>, /*#[cfg(target_os = "windows")]*/ enigo: Arc<Mutex<Enigo>>) -> Self { 18 39 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)); } 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 + } 22 55 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)); } 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 + } 26 65 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)); } 66 + "oscsendchatbox" => { 67 + runtime_nodes.insert(node.id.clone(), OSCActionsSendChatbox::new(node)); 68 + } 30 69 31 - "debug" => { runtime_nodes.insert(node.id.clone(), Debug::new(node)); } 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 + 32 83 _ => {} 33 84 } 34 85 } 35 86 36 - Self { nodes: runtime_nodes } 87 + Self { 88 + nodes: runtime_nodes, 89 + } 37 90 } 38 91 } 39 92 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; 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; 46 99 }
+65 -40
src-tauri/src/runtime.rs
··· 1 - use anyhow::{ bail, Result }; 1 + use std::collections::HashMap; 2 + 3 + use anyhow::{bail, Result}; 2 4 3 - use crate::{ runtime::nodes::RuntimeNodeTree, structs::parameter_types::ParameterType }; 5 + use crate::{runtime::nodes::RuntimeNodeTree, structs::parameter_types::ParameterType}; 4 6 5 - pub mod nodes; 6 7 pub mod commands; 8 + pub mod nodes; 7 9 8 - // This is horrible. I know, I'm sorry. 10 + // TODO: Variables 9 11 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"); } 12 + pub fn recurse_runtime(entry: String, tab: &mut RuntimeNodeTree, args: Vec<ParameterType>) -> Result<()>{ 13 + let ( out_args, output_map ) = runtime(entry, tab, args)?; 13 14 14 - let node = node.unwrap(); 15 + let mut next_node_args: HashMap<String, Vec<ParameterType>> = HashMap::new(); 15 16 16 - let output_map = node.outputs(); 17 - let args = node.execute_dry(parameters); 17 + for i in 0..out_args.len(){ 18 + if output_map.len() <= i { break; } 19 + let links = &output_map[i]; 18 20 19 - if args.is_some(){ 20 - let args = args.unwrap(); 21 + for ( id, link_index, _ ) in links{ 22 + let link_index = link_index.clone() as usize; 21 23 22 - for i in 0..args.len(){ 23 - let arg = &args[i]; 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); } 24 27 25 - for output in &output_map[i]{ 26 - if output.2 == 5{ break; } // Ignore flow outputs 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()); 27 32 28 - let next_node = tab.nodes.get_mut(&output.0); 29 - if next_node.is_none(){ bail!("Cannot find node {}", output.0) } 33 + next_node_args.insert(id.clone(), args); 34 + } 35 + } 36 + } 30 37 31 - let next_node = next_node.unwrap(); 32 - let can_update = next_node.update_arg(output.1 as usize, arg.clone()); 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]; 33 42 34 - if can_update{ 35 - runtime_dry(output.0.clone(), &vec![], tab)?; 43 + for ( id, _, _ ) in links{ 44 + let args = next_node_args.remove(id).unwrap(); 45 + recurse_runtime(id.clone(), tab, args)?; 36 46 } 37 47 } 38 48 } ··· 41 51 Ok(()) 42 52 } 43 53 44 - pub fn runtime( entry: String, tab: &mut RuntimeNodeTree ) -> Result<()>{ 54 + pub fn runtime(entry: String, tab: &mut RuntimeNodeTree, mut args: Vec<ParameterType>) -> Result<(Vec<ParameterType>, Vec<Vec<(String, isize, isize)>>)> { 45 55 let node = tab.nodes.get_mut(&entry); 46 - if node.is_none(){ bail!("Cannot find node"); } 56 + if node.is_none() { bail!("Cannot find node"); } 47 57 48 58 let node = node.unwrap(); 59 + let inputs = node.inputs(); 49 60 50 - let next = node.execute(); 51 - if next.is_some(){ 52 - let next = next.unwrap(); 61 + let mut needed_input_nodes = HashMap::new(); 53 62 54 - let outputs = node.outputs(); 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 + } 55 74 56 - for i in 0..next.len(){ 57 - let arg = &next[i]; 58 - if i >= outputs.len() { break; } 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]; 59 80 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 - } 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(); 67 86 } 68 87 } 69 88 } 70 89 71 - Ok(()) 72 - } 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 }; 1 + use crossbeam_channel::{bounded, Receiver}; 2 + use std::{ 3 + collections::HashMap, 4 + fs::File, 5 + io::Read, 6 + sync::{Arc, Mutex}, 7 + }; 3 8 4 9 use flate2::read::GzDecoder; 5 - use serde_json::{ Map, Value }; 6 - use tauri::{ App, Emitter, Listener, Manager, State }; 10 + use serde_json::{Map, Value}; 11 + use tauri::{App, Emitter, Listener, Manager, WindowEvent}; 7 12 8 - use crate::{ osc::{ self, OSCMessage }, runtime::{ commands::RuntimeCommand, nodes::RuntimeNodeTree, runtime, runtime_dry }, structs::parameter_types::ParameterType, utils::config::Config }; 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 + }; 9 16 10 17 pub fn setup( 11 18 app: &mut App, 12 19 addresses: &'static Mutex<Vec<OSCMessage>>, 13 - mut runtime_command_receiver: Receiver<RuntimeCommand> 20 + runtime_command_receiver: Receiver<RuntimeCommand>, 14 21 ) { 15 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()); 16 44 17 45 let handle = window.clone(); 18 46 window.listen("tauri://drag-drop", move |ev| { ··· 33 61 handle.emit("load_new_tab", Value::Object(map)).unwrap(); 34 62 }); 35 63 36 - let ( sender, receiver ) = bounded(1024); 64 + let (sender, receiver) = bounded(1024); 37 65 38 66 tokio::spawn(async move { 39 67 osc::start_server(sender, "127.0.0.1:9001"); 40 68 }); 41 69 42 - let ( runtime_sender, runtime_receiver ) = bounded(1024); 70 + let (runtime_sender, runtime_receiver) = bounded(1024); 43 71 44 72 let runtime_sender_1 = runtime_sender.clone(); 45 73 tokio::spawn(async move { ··· 57 85 58 86 let msg = message.clone(); 59 87 let mut addrs = addresses.lock().unwrap(); 60 - if !addrs.contains(&msg) { addrs.push(msg); } 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 + } 61 97 62 - runtime_sender.send(RuntimeCommand::OSCMessage(message)).unwrap(); 98 + runtime_sender 99 + .send(RuntimeCommand::OSCMessage(message)) 100 + .unwrap(); 63 101 } 64 102 }); 65 103 104 + // TODO: Run tabs in seperate threads (really not looking forward to this... thanks rust) 105 + 66 106 tokio::spawn(async move { 67 107 let mut tabs: HashMap<String, RuntimeNodeTree> = HashMap::new(); 68 108 109 + // #[cfg(target_os = "windows")] 110 + let enigo = Arc::new(Mutex::new(enigo::Enigo::new(&enigo::Settings::default()).unwrap())); 111 + 69 112 loop { 70 113 let cmd = runtime_receiver.recv().unwrap(); 71 114 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(); 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(); 76 119 77 - for id in keys.clone(){ 120 + for id in keys { 78 121 let entry = tab.nodes[&id].is_entrypoint(); 79 122 80 - if entry{ 81 - let args = vec![ 82 - vec![ ParameterType::String(msg.address.clone()) ], msg.values.clone() 83 - ].concat(); 123 + if entry { 124 + let mut args = vec![ ParameterType::String(msg.address.clone())]; 125 + let mut values = msg.values.clone(); 84 126 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); 127 + args.append(&mut values); 128 + let _ = recurse_runtime(id.clone(), &mut tab, args); 94 129 } 95 130 } 96 131 } 97 - }, 132 + } 98 133 99 - RuntimeCommand::AddTab( graph, id ) => { 100 - tabs.insert(id, RuntimeNodeTree::from(graph)); 101 - }, 102 - RuntimeCommand::RemoveTab( id ) => { 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) => { 103 142 tabs.remove(&id); 104 143 } 105 144 } 106 145 } 107 146 }); 108 - } 147 + }
+1 -1
src-tauri/src/structs/mod.rs
··· 1 + pub mod nodes; 1 2 pub mod parameter_types; 2 - pub mod nodes;
+13 -12
src-tauri/src/structs/nodes.rs
··· 1 - use serde::{ Deserialize, Serialize }; 1 + use serde::{Deserialize, Serialize}; 2 2 use serde_json::Value; 3 3 4 4 #[derive(Serialize, Deserialize, Debug, Clone)] 5 - pub struct Node{ 5 + pub struct Node { 6 6 pub id: String, 7 7 pub name: String, 8 - pub outputs: Vec<NodeOutput>, 9 - pub pos: [ f32; 2 ], 8 + pub outputs: Vec<NodeIO>, 9 + pub inputs: Vec<NodeIO>, 10 + pub pos: [f32; 2], 10 11 pub statics: Vec<NodeStatic>, 11 12 12 13 #[serde(rename = "typeId")] 13 - pub type_id: String 14 + pub type_id: String, 14 15 } 15 16 16 17 #[derive(Serialize, Deserialize, Debug, Clone)] 17 - pub struct NodeStatic{ 18 + pub struct NodeStatic { 18 19 pub name: String, 19 20 20 21 #[serde(rename = "type")] 21 22 pub value_type: isize, 22 - pub value: Value 23 + pub value: Value, 23 24 } 24 25 25 26 #[derive(Serialize, Deserialize, Debug, Clone)] 26 - pub struct NodeOutput{ 27 + pub struct NodeIO { 27 28 pub name: String, 28 29 29 30 #[serde(rename = "type")] 30 31 pub value_type: isize, 31 - pub connections: Vec<NodeOutputConnections> 32 + pub connections: Vec<NodeOutputConnections>, 32 33 } 33 34 34 35 #[derive(Serialize, Deserialize, Debug, Clone)] 35 - pub struct NodeOutputConnections{ 36 + pub struct NodeOutputConnections { 36 37 pub name: String, 37 38 pub node: String, 38 39 pub index: isize, 39 40 40 41 #[serde(rename = "type")] 41 - pub value_type: isize 42 - } 42 + pub value_type: isize, 43 + }
+53 -1
src-tauri/src/structs/parameter_types.rs
··· 1 + use anyhow::{bail, Result}; 1 2 use serde::Serialize; 2 3 3 4 #[derive(Serialize, Clone, Debug, PartialEq)] ··· 12 13 String(String), 13 14 Flow(bool), 14 15 15 - None 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 + } 16 68 }
+28 -7
src-tauri/src/utils/config.rs
··· 1 - use std::{ collections::HashMap, fs::File, io::{ Read, Write }, path::PathBuf, sync::Mutex }; 1 + use std::{ 2 + collections::HashMap, 3 + fs::File, 4 + io::{Read, Write}, 5 + path::PathBuf, 6 + sync::{Mutex, MutexGuard}, 7 + }; 2 8 3 - use flate2::{ read::GzDecoder, write::GzEncoder, Compression }; 4 - use serde::{ Deserialize, Serialize }; 9 + use chrono::Utc; 10 + use flate2::{read::GzDecoder, write::GzEncoder, Compression}; 11 + use serde::{Deserialize, Serialize}; 5 12 6 13 use crate::structs::nodes::Node; 7 14 8 15 #[derive(Clone, Serialize, Deserialize, Debug)] 9 - pub struct ConfigValues{ 16 + pub struct ConfigValues { 17 + #[serde(default)] 18 + pub loaded_tabs: HashMap<String, (Vec<Node>, String, Option<String>, bool)>, 19 + 10 20 #[serde(default)] 11 - pub loaded_tabs: HashMap<String, ( Vec<Node>, String, Option<String> )> 21 + pub hide_editor_on_start: bool, 12 22 } 13 23 14 24 pub struct Config { ··· 37 47 } 38 48 39 49 pub fn save(&self) { 40 - let dat = serde_json::to_string(&self.store.lock().unwrap().clone()).unwrap(); 41 - dbg!(&dat); 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(); 42 63 43 64 let file = File::create(&self.path).unwrap(); 44 65 let mut encoder = GzEncoder::new(file, Compression::default());
+2
src-tauri/src/utils/mod.rs
··· 1 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 6 7 7 // https://vitejs.dev/config/ 8 8 export default defineConfig(async () => ({ 9 - plugins: [solid()], 9 + plugins: [ solid() ], 10 10 11 11 // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` 12 12 //