this repo has no description

Compare changes

Choose any two refs to compare.

+5 -1
.gitignore
··· 1 1 node_modules 2 2 dist 3 - build 3 + builds 4 + target 5 + 6 + .vscode/ 7 + .idea/
-3
.vscode/extensions.json
··· 1 - { 2 - "recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer"] 3 - }
+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>
+5
src/App.css
··· 1 + @font-face{ 2 + font-family: Rubik; 3 + src: url("/assets/fonts/Rubik-VariableFont_wght.ttf"); 4 + } 5 + 1 6 body{ 2 7 background: #1f2129; 3 8 background-attachment: fixed;
+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
+109 -17
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 { platform } from "@tauri-apps/plugin-os"; 10 11 11 12 export interface TabHashMap { 12 13 [details: string] : Tab; ··· 22 23 23 24 constructor(){ 24 25 NodeManager.Instance = this; 26 + 27 + setInterval(() => { 28 + let tabs = Object.values(this._tabs).filter(x => x.needSync); 29 + for(let tab of tabs){ 30 + invoke('sync_tab', { 31 + graph: this._generateTabGraph(tab.id)[0], 32 + id: tab.id, 33 + name: tab.name, 34 + location: tab.saveLocation, 35 + saveState: tab.needsSave() 36 + }); 37 + 38 + tab.needSync = false; 39 + } 40 + }, 1000); 25 41 26 42 listen('load_new_tab', ( ev: any ) => { 27 - this._loadFromConfig(ev.payload.path, ev.payload.graph); 28 - }) 43 + this._loadFromConfig(ev.payload.path, null, ev.payload.graph); 44 + }); 45 + 46 + invoke('load_previous_tabs').then(async ( tabs: any ) => { 47 + let version = await getVersion(); 48 + 49 + for(let tab of Object.entries<any>(tabs)){ 50 + let loaded_tab = await this._loadFromConfig(tab[1][2], tab[0], JSON.stringify({ 51 + tab_name: tab[1][1], 52 + version, 53 + graph: tab[1][0] 54 + })); 55 + 56 + if(loaded_tab) 57 + loaded_tab.setNeedsSave(tab[1][3]); 58 + }; 59 + 60 + this.UpdateConfig(); 61 + }); 62 + 63 + listen('prompt_to_close', async _ => { 64 + let tabs = Object.values(this._tabs); 65 + let tabsNeedingSaving = tabs.filter(x => x.needsSave()); 66 + 67 + for(let tab of tabsNeedingSaving){ 68 + await new Promise<void>(res => { 69 + ConfirmationManager.Instance.ShowConfirmation( 70 + `Discard Changes in ${tab.name}?`, 71 + 'If you close this tab without saving you will lose all changes.', 72 + [ 73 + { 74 + text: 'Save', 75 + callback: async () => { 76 + await this.SaveTab(tab); 77 + res(); 78 + } 79 + }, 80 + { 81 + text: 'Don\'t Save', 82 + callback: async () => { 83 + res(); 84 + } 85 + } 86 + ] 87 + ) 88 + }); 89 + } 90 + 91 + invoke('close_app'); 92 + }); 29 93 } 30 94 31 95 32 96 private _tabUpdateHook: ( tabs: TabHashMap ) => void = () => {}; 33 97 private _tabChangeHook: () => void = () => {}; 34 98 35 - public async AddTab( name: string ): Promise<Tab>{ 99 + public CurrentTab(): Tab | null{ 100 + if(!this._selectedTab)return null 101 + return this._tabs[this._selectedTab] || null; 102 + } 103 + 104 + public async AddTab( name: string, id: string | null = null ): Promise<Tab>{ 36 105 let [ selected, setSelected ] = createSignal(false); 37 106 let [ needsSave, setNeedsSave ] = createSignal(false); 38 107 39 108 let tab: Tab = { 40 109 name: name, 41 - id: await NodeManager.Instance.GetNewNodeId(), 110 + id: id || await NodeManager.Instance.GetNewNodeId(), 42 111 nodes: [], 43 112 saveLocation: null, 44 113 ··· 48 117 needsSave, 49 118 setNeedsSave, 50 119 51 - refuseSync: false 120 + needSync: false 52 121 }; 53 122 54 123 this._tabs[tab.id] = tab; ··· 143 212 } 144 213 } 145 214 146 - public async SaveTab( tab: Tab ){ 215 + public async SaveTab( tab: Tab, ignoreSaveLocation: boolean = false ){ 147 216 let path = 148 - tab.saveLocation || 217 + tab.saveLocation && !ignoreSaveLocation ? 218 + tab.saveLocation : 149 219 await save({ defaultPath: tab.name + '.macro', filters: [ { name: 'Macro Files', extensions: [ 'macro' ] } ] }); 150 220 151 - if(!path)return; 221 + if(!path)throw new Error("Cannot save"); 152 222 153 223 tab.saveLocation = path; 154 224 tab.setNeedsSave(false); ··· 195 265 } 196 266 197 267 198 - public UpdateConfig(){ 268 + public UpdateConfig( needsSave = true ){ 199 269 if(!this._selectedTab)return; 200 270 let tab = this._tabs[this._selectedTab]; 201 271 if(!tab)return; 202 272 203 - if(tab.refuseSync)return; 204 - invoke('sync_tab', { graph: this._generateTabGraph(tab.id)[0], id: tab.id }); 273 + tab.nodes = this._nodes; 274 + tab.needSync = true; 205 275 206 - tab.setNeedsSave(true); 276 + if(needsSave)tab.setNeedsSave(true); 207 277 } 208 278 209 - private async _loadFromConfig( path: string, config: string ){ 279 + private async _loadFromConfig( path: string | null, id: string | null, config: string ){ 210 280 let json = JSON.parse(config); 211 281 212 282 if( ··· 215 285 !json.graph 216 286 )return; 217 287 218 - let tab = await this.AddTab(json.tab_name); 219 - tab.refuseSync = true; 288 + let tab = await this.AddTab(json.tab_name, id); 289 + tab.needSync = false; 220 290 tab.saveLocation = path; 221 291 222 292 this._nodes = []; ··· 247 317 let input = output.connections[k]; 248 318 let node = this._nodes.find(x => x.id === input.node)!; 249 319 320 + if(!node)continue; 321 + 250 322 let realInput = node.inputs.find(x => x.index === input.index); 251 323 let realOutput = outputParentNode.outputs[j]; 252 324 ··· 272 344 tab.setNeedsSave(false); 273 345 tab.nodes = this._nodes; 274 346 275 - tab.refuseSync = false; 276 - this.UpdateConfig(); 347 + tab.needSync = false; 348 + if(!id)this.UpdateConfig(false); 349 + 350 + return tab; 277 351 } 278 352 279 353 private _generateTabGraph( tabId: string | null ): [ any, Tab | null ]{ ··· 289 363 let node = tab.nodes[i]; 290 364 291 365 let nodeOutputs = []; 366 + let nodeInputs = []; 292 367 293 368 for (let j = 0; j < node.outputs.length; j++) { 294 369 let output = node.outputs[j]; ··· 305 380 }) 306 381 } 307 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 + 308 398 nodesToSave.push({ 309 399 name: node.name, 310 400 id: node.id, 311 401 typeId: node.typeId, 312 402 pos: [ node.x, node.y ], 313 403 outputs: nodeOutputs, 404 + inputs: nodeInputs, 314 405 statics: node.statics 315 406 }) 316 407 } ··· 325 416 invoke('save_graph', { graph: JSON.stringify({ 326 417 tab_name: tab.name, 327 418 version: await getVersion(), 419 + platform: platform(), 328 420 graph: nodesToSave 329 421 }), path }); 330 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 + };
+22
src/Nodes/Statics/Float.tsx
··· 1 + import { Node, NodeType } from "../../structs/node"; 2 + import { NodeDefinition } from "../Nodes"; 3 + 4 + export let NodeStaticsFloat: NodeDefinition = { 5 + os: 'any', 6 + 7 + isSingle: true, 8 + name: 'Float', 9 + typeId: 'staticfloat', 10 + 11 + w: 200, 12 + 13 + statics: [{ 14 + type: NodeType.Float, 15 + name: 'Value', 16 + value: 0.0 17 + }], 18 + 19 + outputs: [{ name: "Float", type: NodeType.Float }], 20 + 21 + onStaticsUpdate: async ( _node: Node ) => {} 22 + }
+4 -3
src/Nodes/Statics/Int.tsx
··· 2 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 - typeId: 'ifelse', 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 }],
+5 -1
src/Nodes/Statics.tsx
··· 1 1 import { NodeDefinition } from "./Nodes"; 2 + import { NodeStaticsFloat } from "./Statics/Float"; 2 3 3 4 import { NodeStaticsInt } from "./Statics/Int"; 4 5 import { NodeStaticsString } from "./Statics/String"; 5 6 6 7 export let NodeStatics: NodeDefinition = { 8 + os: 'any', 9 + 7 10 isSingle: false, 8 11 name: 'Statics', 9 12 items: [ 10 13 NodeStaticsInt, 11 - NodeStaticsString 14 + NodeStaticsString, 15 + NodeStaticsFloat 12 16 ] 13 17 }
+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 =>
+40 -4
src/components/ControlBar.tsx
··· 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 17 return ( 18 18 <div class="control-bar"> 19 - <For each={props.node()?.statics}> 19 + <For each={props.node()[0]?.statics}> 20 20 { ( item ) => { 21 21 let [ popupOpen, setPopupOpen ] = createSignal(false); 22 22 ··· 26 26 <Match when={item.type == NodeType.String}> 27 27 { item.name } 28 28 <div style={{ display: 'inline-block', 'margin-left': '10px' }}> 29 + <input 30 + type="text" 31 + placeholder='Enter Value...' 32 + value={item.value || ''} 33 + onChange={( el ) => { 34 + let value = el.target.value; 35 + let node = props.node()[0]!; 29 36 37 + item.value = value; 38 + node.onStaticsUpdate(node); 39 + 40 + NodeManager.Instance.UpdateConfig(); 41 + }} /> 30 42 </div> 31 43 </Match> 32 44 <Match when={item.type == NodeType.Int}> 33 45 { item.name } 34 46 <div style={{ display: 'inline-block', 'margin-left': '10px' }}> 47 + <input 48 + type="number" 49 + placeholder='Enter Value...' 50 + value={item.value !== undefined ? item.value : ''} 51 + onChange={( el ) => { 52 + let value = el.target.value; 53 + let node = props.node()[0]!; 35 54 55 + item.value = parseInt(value); 56 + node.onStaticsUpdate(node); 57 + 58 + NodeManager.Instance.UpdateConfig(); 59 + }} /> 36 60 </div> 37 61 </Match> 38 62 <Match when={item.type == NodeType.Float}> 39 63 { item.name } 40 64 <div style={{ display: 'inline-block', 'margin-left': '10px' }}> 65 + <input 66 + type="number" 67 + placeholder='Enter Value...' 68 + value={item.value !== undefined ? item.value : ''} 69 + onChange={( el ) => { 70 + let value = el.target.value; 71 + let node = props.node()[0]!; 41 72 73 + item.value = parseFloat(value); 74 + node.onStaticsUpdate(node); 75 + 76 + NodeManager.Instance.UpdateConfig(); 77 + }} /> 42 78 </div> 43 79 </Match> 44 80 <Match when={item.type == NodeType.OSCAddress}> ··· 52 88 return addresses.map(x => x.address).filter(x => x.toLowerCase().includes(text.toLowerCase())); 53 89 }} 54 90 change={( text ) => { 55 - let node = props.node()!; 91 + let node = props.node()[0]!; 56 92 57 93 item.value = text; 58 94 node.onStaticsUpdate(node); ··· 78 114 }} 79 115 value={item.value} 80 116 changed={( value ) => { 81 - let node = props.node()!; 117 + let node = props.node()[0]!; 82 118 83 119 item.value = value; 84 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 + }
+31
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; ··· 53 60 .tab-meta{ 54 61 width: calc(100% - 40px); 55 62 transform: translateY(1px); 63 + display: flex; 64 + align-items: center; 56 65 } 57 66 58 67 .tab-meta-input{ ··· 93 102 transform: translate(-10px, 35px); 94 103 border-radius: 10px; 95 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; 96 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 }
+11
src/components/TextInput.css
··· 9 9 width: 400px; 10 10 } 11 11 12 + input[type="number"]{ 13 + outline: none; 14 + background: none; 15 + border: none; 16 + border-bottom: 2px solid #525252; 17 + font-size: 15px; 18 + font-family: Rubik, 'Courier New'; 19 + color: #fff; 20 + width: 400px; 21 + } 22 + 12 23 div[input-dropdown]{ 13 24 position: absolute; 14 25 width: fit-content;
+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 + }
+1221 -703
src-tauri/Cargo.lock
··· 7 7 version = "0.1.0" 8 8 dependencies = [ 9 9 "anyhow", 10 + "chrono", 11 + "crossbeam-channel", 10 12 "dirs", 13 + "enigo", 11 14 "flate2", 12 15 "serde", 13 16 "serde_json", 14 17 "tauri", 15 18 "tauri-build", 19 + "tauri-plugin-clipboard-manager", 16 20 "tauri-plugin-dialog", 17 21 "tauri-plugin-opener", 22 + "tauri-plugin-os", 18 23 "tokio", 19 24 ] 20 25 21 26 [[package]] 22 - name = "addr2line" 23 - version = "0.24.2" 24 - source = "registry+https://github.com/rust-lang/crates.io-index" 25 - checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 26 - dependencies = [ 27 - "gimli", 28 - ] 29 - 30 - [[package]] 31 27 name = "adler2" 32 28 version = "2.0.1" 33 29 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 35 31 36 32 [[package]] 37 33 name = "aho-corasick" 38 - version = "1.1.3" 34 + version = "1.1.4" 39 35 source = "registry+https://github.com/rust-lang/crates.io-index" 40 - checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 36 + checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" 41 37 dependencies = [ 42 38 "memchr", 43 39 ] ··· 58 54 ] 59 55 60 56 [[package]] 61 - name = "android-tzdata" 62 - version = "0.1.1" 63 - source = "registry+https://github.com/rust-lang/crates.io-index" 64 - checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 65 - 66 - [[package]] 67 57 name = "android_system_properties" 68 58 version = "0.1.5" 69 59 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 74 64 75 65 [[package]] 76 66 name = "anyhow" 77 - 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" 78 74 source = "registry+https://github.com/rust-lang/crates.io-index" 79 - 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 + ] 80 91 81 92 [[package]] 82 93 name = "ashpd" ··· 125 136 126 137 [[package]] 127 138 name = "async-executor" 128 - version = "1.13.2" 139 + version = "1.13.3" 129 140 source = "registry+https://github.com/rust-lang/crates.io-index" 130 - checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" 141 + checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" 131 142 dependencies = [ 132 143 "async-task", 133 144 "concurrent-queue", ··· 139 150 140 151 [[package]] 141 152 name = "async-io" 142 - version = "2.5.0" 153 + version = "2.6.0" 143 154 source = "registry+https://github.com/rust-lang/crates.io-index" 144 - checksum = "19634d6336019ef220f09fd31168ce5c184b295cbf80345437cc36094ef223ca" 155 + checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" 145 156 dependencies = [ 146 - "async-lock", 157 + "autocfg", 147 158 "cfg-if", 148 159 "concurrent-queue", 149 160 "futures-io", 150 161 "futures-lite", 151 162 "parking", 152 163 "polling", 153 - "rustix", 164 + "rustix 1.1.2", 154 165 "slab", 155 - "windows-sys 0.60.2", 166 + "windows-sys 0.61.2", 156 167 ] 157 168 158 169 [[package]] 159 170 name = "async-lock" 160 - version = "3.4.0" 171 + version = "3.4.1" 161 172 source = "registry+https://github.com/rust-lang/crates.io-index" 162 - checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" 173 + checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" 163 174 dependencies = [ 164 175 "event-listener", 165 176 "event-listener-strategy", ··· 168 179 169 180 [[package]] 170 181 name = "async-process" 171 - version = "2.4.0" 182 + version = "2.5.0" 172 183 source = "registry+https://github.com/rust-lang/crates.io-index" 173 - checksum = "65daa13722ad51e6ab1a1b9c01299142bc75135b337923cfa10e79bbbd669f00" 184 + checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" 174 185 dependencies = [ 175 186 "async-channel", 176 187 "async-io", ··· 181 192 "cfg-if", 182 193 "event-listener", 183 194 "futures-lite", 184 - "rustix", 195 + "rustix 1.1.2", 185 196 ] 186 197 187 198 [[package]] ··· 192 203 dependencies = [ 193 204 "proc-macro2", 194 205 "quote", 195 - "syn 2.0.104", 206 + "syn 2.0.109", 196 207 ] 197 208 198 209 [[package]] 199 210 name = "async-signal" 200 - version = "0.2.12" 211 + version = "0.2.13" 201 212 source = "registry+https://github.com/rust-lang/crates.io-index" 202 - checksum = "f567af260ef69e1d52c2b560ce0ea230763e6fbb9214a85d768760a920e3e3c1" 213 + checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" 203 214 dependencies = [ 204 215 "async-io", 205 216 "async-lock", ··· 207 218 "cfg-if", 208 219 "futures-core", 209 220 "futures-io", 210 - "rustix", 221 + "rustix 1.1.2", 211 222 "signal-hook-registry", 212 223 "slab", 213 - "windows-sys 0.60.2", 224 + "windows-sys 0.61.2", 214 225 ] 215 226 216 227 [[package]] ··· 221 232 222 233 [[package]] 223 234 name = "async-trait" 224 - version = "0.1.88" 235 + version = "0.1.89" 225 236 source = "registry+https://github.com/rust-lang/crates.io-index" 226 - checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" 237 + checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" 227 238 dependencies = [ 228 239 "proc-macro2", 229 240 "quote", 230 - "syn 2.0.104", 241 + "syn 2.0.109", 231 242 ] 232 243 233 244 [[package]] ··· 266 277 checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 267 278 268 279 [[package]] 269 - name = "backtrace" 270 - version = "0.3.75" 271 - source = "registry+https://github.com/rust-lang/crates.io-index" 272 - checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" 273 - dependencies = [ 274 - "addr2line", 275 - "cfg-if", 276 - "libc", 277 - "miniz_oxide", 278 - "object", 279 - "rustc-demangle", 280 - "windows-targets 0.52.6", 281 - ] 282 - 283 - [[package]] 284 280 name = "base64" 285 281 version = "0.21.7" 286 282 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 300 296 301 297 [[package]] 302 298 name = "bitflags" 303 - version = "2.9.1" 299 + version = "2.10.0" 304 300 source = "registry+https://github.com/rust-lang/crates.io-index" 305 - checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" 301 + checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" 306 302 dependencies = [ 307 - "serde", 303 + "serde_core", 308 304 ] 309 305 310 306 [[package]] ··· 327 323 328 324 [[package]] 329 325 name = "block2" 330 - version = "0.6.1" 326 + version = "0.6.2" 331 327 source = "registry+https://github.com/rust-lang/crates.io-index" 332 - checksum = "340d2f0bdb2a43c1d3cd40513185b2bd7def0aa1052f956455114bc98f82dcf2" 328 + checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" 333 329 dependencies = [ 334 - "objc2 0.6.1", 330 + "objc2 0.6.3", 335 331 ] 336 332 337 333 [[package]] ··· 349 345 350 346 [[package]] 351 347 name = "brotli" 352 - version = "8.0.1" 348 + version = "8.0.2" 353 349 source = "registry+https://github.com/rust-lang/crates.io-index" 354 - checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" 350 + checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" 355 351 dependencies = [ 356 352 "alloc-no-stdlib", 357 353 "alloc-stdlib", ··· 376 372 377 373 [[package]] 378 374 name = "bytemuck" 379 - version = "1.23.1" 375 + version = "1.24.0" 380 376 source = "registry+https://github.com/rust-lang/crates.io-index" 381 - checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" 377 + checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" 382 378 383 379 [[package]] 384 380 name = "byteorder" ··· 387 383 checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 388 384 389 385 [[package]] 386 + name = "byteorder-lite" 387 + version = "0.1.0" 388 + source = "registry+https://github.com/rust-lang/crates.io-index" 389 + checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" 390 + 391 + [[package]] 390 392 name = "bytes" 391 393 version = "1.10.1" 392 394 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 401 403 source = "registry+https://github.com/rust-lang/crates.io-index" 402 404 checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" 403 405 dependencies = [ 404 - "bitflags 2.9.1", 406 + "bitflags 2.10.0", 405 407 "cairo-sys-rs", 406 408 "glib", 407 409 "libc", ··· 422 424 423 425 [[package]] 424 426 name = "camino" 425 - version = "1.1.10" 427 + version = "1.2.1" 426 428 source = "registry+https://github.com/rust-lang/crates.io-index" 427 - checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" 429 + checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" 428 430 dependencies = [ 429 - "serde", 431 + "serde_core", 430 432 ] 431 433 432 434 [[package]] ··· 449 451 "semver", 450 452 "serde", 451 453 "serde_json", 452 - "thiserror 2.0.12", 454 + "thiserror 2.0.17", 453 455 ] 454 456 455 457 [[package]] ··· 459 461 checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" 460 462 dependencies = [ 461 463 "serde", 462 - "toml 0.9.3", 464 + "toml 0.9.8", 463 465 ] 464 466 465 467 [[package]] 466 468 name = "cc" 467 - version = "1.2.30" 469 + version = "1.2.45" 468 470 source = "registry+https://github.com/rust-lang/crates.io-index" 469 - checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" 471 + checksum = "35900b6c8d709fb1d854671ae27aeaa9eec2f8b01b364e1619a40da3e6fe2afe" 470 472 dependencies = [ 473 + "find-msvc-tools", 471 474 "shlex", 472 475 ] 473 476 ··· 500 503 501 504 [[package]] 502 505 name = "cfg-if" 503 - version = "1.0.1" 506 + version = "1.0.4" 504 507 source = "registry+https://github.com/rust-lang/crates.io-index" 505 - checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" 508 + checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" 506 509 507 510 [[package]] 508 511 name = "cfg_aliases" ··· 512 515 513 516 [[package]] 514 517 name = "chrono" 515 - version = "0.4.41" 518 + version = "0.4.42" 516 519 source = "registry+https://github.com/rust-lang/crates.io-index" 517 - checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" 520 + checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" 518 521 dependencies = [ 519 - "android-tzdata", 520 522 "iana-time-zone", 523 + "js-sys", 521 524 "num-traits", 522 525 "serde", 523 - "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", 524 537 ] 525 538 526 539 [[package]] ··· 580 593 source = "registry+https://github.com/rust-lang/crates.io-index" 581 594 checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" 582 595 dependencies = [ 583 - "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", 584 610 "core-foundation", 585 611 "core-graphics-types", 586 612 "foreign-types", ··· 593 619 source = "registry+https://github.com/rust-lang/crates.io-index" 594 620 checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" 595 621 dependencies = [ 596 - "bitflags 2.9.1", 622 + "bitflags 2.10.0", 597 623 "core-foundation", 598 624 "libc", 599 625 ] ··· 632 658 checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 633 659 634 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]] 635 667 name = "crypto-common" 636 668 version = "0.1.6" 637 669 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 665 697 checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" 666 698 dependencies = [ 667 699 "quote", 668 - "syn 2.0.104", 700 + "syn 2.0.109", 669 701 ] 670 702 671 703 [[package]] ··· 675 707 checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" 676 708 dependencies = [ 677 709 "quote", 678 - "syn 2.0.104", 710 + "syn 2.0.109", 679 711 ] 680 712 681 713 [[package]] 682 714 name = "darling" 683 - version = "0.20.11" 715 + version = "0.21.3" 684 716 source = "registry+https://github.com/rust-lang/crates.io-index" 685 - checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" 717 + checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" 686 718 dependencies = [ 687 719 "darling_core", 688 720 "darling_macro", ··· 690 722 691 723 [[package]] 692 724 name = "darling_core" 693 - version = "0.20.11" 725 + version = "0.21.3" 694 726 source = "registry+https://github.com/rust-lang/crates.io-index" 695 - checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" 727 + checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" 696 728 dependencies = [ 697 729 "fnv", 698 730 "ident_case", 699 731 "proc-macro2", 700 732 "quote", 701 733 "strsim", 702 - "syn 2.0.104", 734 + "syn 2.0.109", 703 735 ] 704 736 705 737 [[package]] 706 738 name = "darling_macro" 707 - version = "0.20.11" 739 + version = "0.21.3" 708 740 source = "registry+https://github.com/rust-lang/crates.io-index" 709 - checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" 741 + checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" 710 742 dependencies = [ 711 743 "darling_core", 712 744 "quote", 713 - "syn 2.0.104", 745 + "syn 2.0.109", 714 746 ] 715 747 716 748 [[package]] 717 749 name = "deranged" 718 - version = "0.4.0" 750 + version = "0.5.5" 719 751 source = "registry+https://github.com/rust-lang/crates.io-index" 720 - checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" 752 + checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" 721 753 dependencies = [ 722 754 "powerfmt", 723 - "serde", 755 + "serde_core", 724 756 ] 725 757 726 758 [[package]] ··· 733 765 "proc-macro2", 734 766 "quote", 735 767 "rustc_version", 736 - "syn 2.0.104", 768 + "syn 2.0.109", 737 769 ] 738 770 739 771 [[package]] ··· 764 796 "libc", 765 797 "option-ext", 766 798 "redox_users", 767 - "windows-sys 0.60.2", 799 + "windows-sys 0.61.2", 768 800 ] 769 801 770 802 [[package]] ··· 779 811 source = "registry+https://github.com/rust-lang/crates.io-index" 780 812 checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" 781 813 dependencies = [ 782 - "bitflags 2.9.1", 783 - "block2 0.6.1", 814 + "bitflags 2.10.0", 815 + "block2 0.6.2", 784 816 "libc", 785 - "objc2 0.6.1", 817 + "objc2 0.6.3", 786 818 ] 787 819 788 820 [[package]] ··· 793 825 dependencies = [ 794 826 "proc-macro2", 795 827 "quote", 796 - "syn 2.0.104", 828 + "syn 2.0.109", 797 829 ] 798 830 799 831 [[package]] ··· 802 834 source = "registry+https://github.com/rust-lang/crates.io-index" 803 835 checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" 804 836 dependencies = [ 805 - "libloading", 837 + "libloading 0.8.9", 806 838 ] 807 839 808 840 [[package]] 809 841 name = "dlopen2" 810 - version = "0.7.0" 842 + version = "0.8.0" 811 843 source = "registry+https://github.com/rust-lang/crates.io-index" 812 - checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6" 844 + checksum = "b54f373ccf864bf587a89e880fb7610f8d73f3045f13580948ccbcaff26febff" 813 845 dependencies = [ 814 846 "dlopen2_derive", 815 847 "libc", ··· 825 857 dependencies = [ 826 858 "proc-macro2", 827 859 "quote", 828 - "syn 2.0.104", 860 + "syn 2.0.109", 829 861 ] 830 862 831 863 [[package]] ··· 872 904 873 905 [[package]] 874 906 name = "embed-resource" 875 - version = "3.0.5" 907 + version = "3.0.6" 876 908 source = "registry+https://github.com/rust-lang/crates.io-index" 877 - checksum = "4c6d81016d6c977deefb2ef8d8290da019e27cc26167e102185da528e6c0ab38" 909 + checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" 878 910 dependencies = [ 879 911 "cc", 880 912 "memchr", 881 913 "rustc_version", 882 - "toml 0.9.3", 914 + "toml 0.9.8", 883 915 "vswhom", 884 916 "winreg", 885 917 ] ··· 897 929 checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" 898 930 899 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]] 900 953 name = "enumflags2" 901 954 version = "0.7.12" 902 955 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 914 967 dependencies = [ 915 968 "proc-macro2", 916 969 "quote", 917 - "syn 2.0.104", 970 + "syn 2.0.109", 918 971 ] 919 972 920 973 [[package]] ··· 925 978 926 979 [[package]] 927 980 name = "erased-serde" 928 - version = "0.4.6" 981 + version = "0.4.9" 929 982 source = "registry+https://github.com/rust-lang/crates.io-index" 930 - checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" 983 + checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" 931 984 dependencies = [ 932 985 "serde", 986 + "serde_core", 933 987 "typeid", 934 988 ] 935 989 936 990 [[package]] 937 991 name = "errno" 938 - version = "0.3.13" 992 + version = "0.3.14" 939 993 source = "registry+https://github.com/rust-lang/crates.io-index" 940 - checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" 994 + checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" 941 995 dependencies = [ 942 996 "libc", 943 - "windows-sys 0.60.2", 997 + "windows-sys 0.61.2", 944 998 ] 945 999 946 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]] 947 1007 name = "event-listener" 948 - version = "5.4.0" 1008 + version = "5.4.1" 949 1009 source = "registry+https://github.com/rust-lang/crates.io-index" 950 - checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 1010 + checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" 951 1011 dependencies = [ 952 1012 "concurrent-queue", 953 1013 "parking", ··· 971 1031 checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 972 1032 973 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]] 974 1054 name = "fdeflate" 975 1055 version = "0.3.7" 976 1056 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 990 1070 ] 991 1071 992 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]] 993 1085 name = "flate2" 994 - version = "1.1.2" 1086 + version = "1.1.5" 995 1087 source = "registry+https://github.com/rust-lang/crates.io-index" 996 - checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" 1088 + checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" 997 1089 dependencies = [ 998 1090 "crc32fast", 999 1091 "miniz_oxide", ··· 1006 1098 checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 1007 1099 1008 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]] 1009 1107 name = "foreign-types" 1010 1108 version = "0.5.0" 1011 1109 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1023 1121 dependencies = [ 1024 1122 "proc-macro2", 1025 1123 "quote", 1026 - "syn 2.0.104", 1124 + "syn 2.0.109", 1027 1125 ] 1028 1126 1029 1127 [[package]] ··· 1034 1132 1035 1133 [[package]] 1036 1134 name = "form_urlencoded" 1037 - version = "1.2.1" 1135 + version = "1.2.2" 1038 1136 source = "registry+https://github.com/rust-lang/crates.io-index" 1039 - checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 1137 + checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 1040 1138 dependencies = [ 1041 1139 "percent-encoding", 1042 1140 ] ··· 1085 1183 1086 1184 [[package]] 1087 1185 name = "futures-lite" 1088 - version = "2.6.0" 1186 + version = "2.6.1" 1089 1187 source = "registry+https://github.com/rust-lang/crates.io-index" 1090 - checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" 1188 + checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" 1091 1189 dependencies = [ 1092 1190 "fastrand", 1093 1191 "futures-core", ··· 1104 1202 dependencies = [ 1105 1203 "proc-macro2", 1106 1204 "quote", 1107 - "syn 2.0.104", 1205 + "syn 2.0.109", 1108 1206 ] 1109 1207 1110 1208 [[package]] ··· 1246 1344 1247 1345 [[package]] 1248 1346 name = "generic-array" 1249 - version = "0.14.7" 1347 + version = "0.14.9" 1250 1348 source = "registry+https://github.com/rust-lang/crates.io-index" 1251 - checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 1349 + checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" 1252 1350 dependencies = [ 1253 1351 "typenum", 1254 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", 1255 1363 ] 1256 1364 1257 1365 [[package]] ··· 1278 1386 1279 1387 [[package]] 1280 1388 name = "getrandom" 1281 - version = "0.3.3" 1389 + version = "0.3.4" 1282 1390 source = "registry+https://github.com/rust-lang/crates.io-index" 1283 - checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 1391 + checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" 1284 1392 dependencies = [ 1285 1393 "cfg-if", 1286 1394 "libc", 1287 1395 "r-efi", 1288 - "wasi 0.14.2+wasi-0.2.4", 1396 + "wasip2", 1289 1397 ] 1290 - 1291 - [[package]] 1292 - name = "gimli" 1293 - version = "0.31.1" 1294 - source = "registry+https://github.com/rust-lang/crates.io-index" 1295 - checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 1296 1398 1297 1399 [[package]] 1298 1400 name = "gio" ··· 1332 1434 source = "registry+https://github.com/rust-lang/crates.io-index" 1333 1435 checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" 1334 1436 dependencies = [ 1335 - "bitflags 2.9.1", 1437 + "bitflags 2.10.0", 1336 1438 "futures-channel", 1337 1439 "futures-core", 1338 1440 "futures-executor", ··· 1356 1458 checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" 1357 1459 dependencies = [ 1358 1460 "heck 0.4.1", 1359 - "proc-macro-crate 2.0.0", 1461 + "proc-macro-crate 2.0.2", 1360 1462 "proc-macro-error", 1361 1463 "proc-macro2", 1362 1464 "quote", 1363 - "syn 2.0.104", 1465 + "syn 2.0.109", 1364 1466 ] 1365 1467 1366 1468 [[package]] ··· 1375 1477 1376 1478 [[package]] 1377 1479 name = "glob" 1378 - version = "0.3.2" 1480 + version = "0.3.3" 1379 1481 source = "registry+https://github.com/rust-lang/crates.io-index" 1380 - checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 1482 + checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" 1381 1483 1382 1484 [[package]] 1383 1485 name = "gobject-sys" ··· 1439 1541 "proc-macro-error", 1440 1542 "proc-macro2", 1441 1543 "quote", 1442 - "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", 1443 1556 ] 1444 1557 1445 1558 [[package]] ··· 1450 1563 1451 1564 [[package]] 1452 1565 name = "hashbrown" 1453 - version = "0.15.4" 1566 + version = "0.15.5" 1567 + source = "registry+https://github.com/rust-lang/crates.io-index" 1568 + checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 1569 + dependencies = [ 1570 + "foldhash", 1571 + ] 1572 + 1573 + [[package]] 1574 + name = "hashbrown" 1575 + version = "0.16.0" 1454 1576 source = "registry+https://github.com/rust-lang/crates.io-index" 1455 - checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" 1577 + checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" 1456 1578 1457 1579 [[package]] 1458 1580 name = "heck" ··· 1532 1654 1533 1655 [[package]] 1534 1656 name = "hyper" 1535 - version = "1.6.0" 1657 + version = "1.7.0" 1536 1658 source = "registry+https://github.com/rust-lang/crates.io-index" 1537 - checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 1659 + checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" 1538 1660 dependencies = [ 1661 + "atomic-waker", 1539 1662 "bytes", 1540 1663 "futures-channel", 1541 - "futures-util", 1664 + "futures-core", 1542 1665 "http", 1543 1666 "http-body", 1544 1667 "httparse", 1545 1668 "itoa", 1546 1669 "pin-project-lite", 1670 + "pin-utils", 1547 1671 "smallvec", 1548 1672 "tokio", 1549 1673 "want", ··· 1551 1675 1552 1676 [[package]] 1553 1677 name = "hyper-util" 1554 - version = "0.1.16" 1678 + version = "0.1.17" 1555 1679 source = "registry+https://github.com/rust-lang/crates.io-index" 1556 - checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" 1680 + checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" 1557 1681 dependencies = [ 1558 1682 "base64 0.22.1", 1559 1683 "bytes", ··· 1575 1699 1576 1700 [[package]] 1577 1701 name = "iana-time-zone" 1578 - version = "0.1.63" 1702 + version = "0.1.64" 1579 1703 source = "registry+https://github.com/rust-lang/crates.io-index" 1580 - checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" 1704 + checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" 1581 1705 dependencies = [ 1582 1706 "android_system_properties", 1583 1707 "core-foundation-sys", ··· 1585 1709 "js-sys", 1586 1710 "log", 1587 1711 "wasm-bindgen", 1588 - "windows-core", 1712 + "windows-core 0.62.2", 1589 1713 ] 1590 1714 1591 1715 [[package]] ··· 1604 1728 checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" 1605 1729 dependencies = [ 1606 1730 "byteorder", 1607 - "png", 1731 + "png 0.17.16", 1608 1732 ] 1609 1733 1610 1734 [[package]] 1611 1735 name = "icu_collections" 1612 - version = "2.0.0" 1736 + version = "2.1.1" 1613 1737 source = "registry+https://github.com/rust-lang/crates.io-index" 1614 - checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 1738 + checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" 1615 1739 dependencies = [ 1616 1740 "displaydoc", 1617 1741 "potential_utf", ··· 1622 1746 1623 1747 [[package]] 1624 1748 name = "icu_locale_core" 1625 - version = "2.0.0" 1749 + version = "2.1.1" 1626 1750 source = "registry+https://github.com/rust-lang/crates.io-index" 1627 - checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 1751 + checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" 1628 1752 dependencies = [ 1629 1753 "displaydoc", 1630 1754 "litemap", ··· 1635 1759 1636 1760 [[package]] 1637 1761 name = "icu_normalizer" 1638 - version = "2.0.0" 1762 + version = "2.1.1" 1639 1763 source = "registry+https://github.com/rust-lang/crates.io-index" 1640 - checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 1764 + checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" 1641 1765 dependencies = [ 1642 - "displaydoc", 1643 1766 "icu_collections", 1644 1767 "icu_normalizer_data", 1645 1768 "icu_properties", ··· 1650 1773 1651 1774 [[package]] 1652 1775 name = "icu_normalizer_data" 1653 - version = "2.0.0" 1776 + version = "2.1.1" 1654 1777 source = "registry+https://github.com/rust-lang/crates.io-index" 1655 - checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 1778 + checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" 1656 1779 1657 1780 [[package]] 1658 1781 name = "icu_properties" 1659 - version = "2.0.1" 1782 + version = "2.1.1" 1660 1783 source = "registry+https://github.com/rust-lang/crates.io-index" 1661 - checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 1784 + checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" 1662 1785 dependencies = [ 1663 - "displaydoc", 1664 1786 "icu_collections", 1665 1787 "icu_locale_core", 1666 1788 "icu_properties_data", 1667 1789 "icu_provider", 1668 - "potential_utf", 1669 1790 "zerotrie", 1670 1791 "zerovec", 1671 1792 ] 1672 1793 1673 1794 [[package]] 1674 1795 name = "icu_properties_data" 1675 - version = "2.0.1" 1796 + version = "2.1.1" 1676 1797 source = "registry+https://github.com/rust-lang/crates.io-index" 1677 - checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 1798 + checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" 1678 1799 1679 1800 [[package]] 1680 1801 name = "icu_provider" 1681 - version = "2.0.0" 1802 + version = "2.1.1" 1682 1803 source = "registry+https://github.com/rust-lang/crates.io-index" 1683 - checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 1804 + checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" 1684 1805 dependencies = [ 1685 1806 "displaydoc", 1686 1807 "icu_locale_core", 1687 - "stable_deref_trait", 1688 - "tinystr", 1689 1808 "writeable", 1690 1809 "yoke", 1691 1810 "zerofrom", ··· 1701 1820 1702 1821 [[package]] 1703 1822 name = "idna" 1704 - version = "1.0.3" 1823 + version = "1.1.0" 1705 1824 source = "registry+https://github.com/rust-lang/crates.io-index" 1706 - checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 1825 + checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 1707 1826 dependencies = [ 1708 1827 "idna_adapter", 1709 1828 "smallvec", ··· 1721 1840 ] 1722 1841 1723 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]] 1724 1857 name = "indexmap" 1725 1858 version = "1.9.3" 1726 1859 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1733 1866 1734 1867 [[package]] 1735 1868 name = "indexmap" 1736 - version = "2.10.0" 1869 + version = "2.12.0" 1737 1870 source = "registry+https://github.com/rust-lang/crates.io-index" 1738 - checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" 1871 + checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" 1739 1872 dependencies = [ 1740 1873 "equivalent", 1741 - "hashbrown 0.15.4", 1874 + "hashbrown 0.16.0", 1742 1875 "serde", 1876 + "serde_core", 1743 1877 ] 1744 1878 1745 1879 [[package]] ··· 1752 1886 ] 1753 1887 1754 1888 [[package]] 1755 - name = "io-uring" 1756 - version = "0.7.9" 1757 - source = "registry+https://github.com/rust-lang/crates.io-index" 1758 - checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" 1759 - dependencies = [ 1760 - "bitflags 2.9.1", 1761 - "cfg-if", 1762 - "libc", 1763 - ] 1764 - 1765 - [[package]] 1766 1889 name = "ipnet" 1767 1890 version = "2.11.0" 1768 1891 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1770 1893 1771 1894 [[package]] 1772 1895 name = "iri-string" 1773 - version = "0.7.8" 1896 + version = "0.7.9" 1774 1897 source = "registry+https://github.com/rust-lang/crates.io-index" 1775 - checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" 1898 + checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" 1776 1899 dependencies = [ 1777 1900 "memchr", 1778 1901 "serde", ··· 1850 1973 1851 1974 [[package]] 1852 1975 name = "js-sys" 1853 - version = "0.3.77" 1976 + version = "0.3.82" 1854 1977 source = "registry+https://github.com/rust-lang/crates.io-index" 1855 - checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 1978 + checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" 1856 1979 dependencies = [ 1857 1980 "once_cell", 1858 1981 "wasm-bindgen", ··· 1886 2009 source = "registry+https://github.com/rust-lang/crates.io-index" 1887 2010 checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" 1888 2011 dependencies = [ 1889 - "bitflags 2.9.1", 2012 + "bitflags 2.10.0", 1890 2013 "serde", 1891 2014 "unicode-segmentation", 1892 2015 ] ··· 1899 2022 dependencies = [ 1900 2023 "cssparser", 1901 2024 "html5ever", 1902 - "indexmap 2.10.0", 2025 + "indexmap 2.12.0", 1903 2026 "selectors", 1904 2027 ] 1905 2028 ··· 1929 2052 checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" 1930 2053 dependencies = [ 1931 2054 "gtk-sys", 1932 - "libloading", 2055 + "libloading 0.7.4", 1933 2056 "once_cell", 1934 2057 ] 1935 2058 1936 2059 [[package]] 1937 2060 name = "libc" 1938 - version = "0.2.174" 2061 + version = "0.2.177" 1939 2062 source = "registry+https://github.com/rust-lang/crates.io-index" 1940 - checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" 2063 + checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" 1941 2064 1942 2065 [[package]] 1943 2066 name = "libloading" ··· 1950 2073 ] 1951 2074 1952 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]] 1953 2086 name = "libredox" 1954 - version = "0.1.8" 2087 + version = "0.1.10" 1955 2088 source = "registry+https://github.com/rust-lang/crates.io-index" 1956 - checksum = "360e552c93fa0e8152ab463bc4c4837fce76a225df11dfaeea66c313de5e61f7" 2089 + checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" 1957 2090 dependencies = [ 1958 - "bitflags 2.9.1", 2091 + "bitflags 2.10.0", 1959 2092 "libc", 1960 2093 ] 1961 2094 1962 2095 [[package]] 1963 2096 name = "linux-raw-sys" 1964 - version = "0.9.4" 2097 + version = "0.4.15" 2098 + source = "registry+https://github.com/rust-lang/crates.io-index" 2099 + checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 2100 + 2101 + [[package]] 2102 + name = "linux-raw-sys" 2103 + version = "0.11.0" 1965 2104 source = "registry+https://github.com/rust-lang/crates.io-index" 1966 - checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 2105 + checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" 1967 2106 1968 2107 [[package]] 1969 2108 name = "litemap" 1970 - version = "0.8.0" 2109 + version = "0.8.1" 1971 2110 source = "registry+https://github.com/rust-lang/crates.io-index" 1972 - checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 2111 + checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" 1973 2112 1974 2113 [[package]] 1975 2114 name = "lock_api" 1976 - version = "0.4.13" 2115 + version = "0.4.14" 1977 2116 source = "registry+https://github.com/rust-lang/crates.io-index" 1978 - checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" 2117 + checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" 1979 2118 dependencies = [ 1980 - "autocfg", 1981 2119 "scopeguard", 1982 2120 ] 1983 2121 1984 2122 [[package]] 1985 2123 name = "log" 1986 - version = "0.4.27" 2124 + version = "0.4.28" 1987 2125 source = "registry+https://github.com/rust-lang/crates.io-index" 1988 - checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 2126 + checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" 1989 2127 1990 2128 [[package]] 1991 2129 name = "mac" ··· 2015 2153 dependencies = [ 2016 2154 "proc-macro2", 2017 2155 "quote", 2018 - "syn 2.0.104", 2156 + "syn 2.0.109", 2019 2157 ] 2020 2158 2021 2159 [[package]] ··· 2026 2164 2027 2165 [[package]] 2028 2166 name = "memchr" 2029 - version = "2.7.5" 2167 + version = "2.7.6" 2030 2168 source = "registry+https://github.com/rust-lang/crates.io-index" 2031 - 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 + ] 2032 2179 2033 2180 [[package]] 2034 2181 name = "memoffset" ··· 2046 2193 checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 2047 2194 2048 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]] 2049 2202 name = "miniz_oxide" 2050 2203 version = "0.8.9" 2051 2204 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2057 2210 2058 2211 [[package]] 2059 2212 name = "mio" 2060 - version = "1.0.4" 2213 + version = "1.1.0" 2061 2214 source = "registry+https://github.com/rust-lang/crates.io-index" 2062 - checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 2215 + checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" 2063 2216 dependencies = [ 2064 2217 "libc", 2065 2218 "wasi 0.11.1+wasi-snapshot-preview1", 2066 - "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", 2067 2230 ] 2068 2231 2069 2232 [[package]] 2070 2233 name = "muda" 2071 - version = "0.17.0" 2234 + version = "0.17.1" 2072 2235 source = "registry+https://github.com/rust-lang/crates.io-index" 2073 - checksum = "58b89bf91c19bf036347f1ab85a81c560f08c0667c8601bece664d860a600988" 2236 + checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" 2074 2237 dependencies = [ 2075 2238 "crossbeam-channel", 2076 2239 "dpi", 2077 2240 "gtk", 2078 2241 "keyboard-types", 2079 - "objc2 0.6.1", 2242 + "objc2 0.6.3", 2080 2243 "objc2-app-kit", 2081 2244 "objc2-core-foundation", 2082 - "objc2-foundation 0.3.1", 2245 + "objc2-foundation 0.3.2", 2083 2246 "once_cell", 2084 - "png", 2247 + "png 0.17.16", 2085 2248 "serde", 2086 - "thiserror 2.0.12", 2087 - "windows-sys 0.59.0", 2249 + "thiserror 2.0.17", 2250 + "windows-sys 0.60.2", 2088 2251 ] 2089 2252 2090 2253 [[package]] ··· 2093 2256 source = "registry+https://github.com/rust-lang/crates.io-index" 2094 2257 checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" 2095 2258 dependencies = [ 2096 - "bitflags 2.9.1", 2259 + "bitflags 2.10.0", 2097 2260 "jni-sys", 2098 2261 "log", 2099 2262 "ndk-sys", ··· 2129 2292 source = "registry+https://github.com/rust-lang/crates.io-index" 2130 2293 checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" 2131 2294 dependencies = [ 2132 - "bitflags 2.9.1", 2295 + "bitflags 2.10.0", 2133 2296 "cfg-if", 2134 2297 "cfg_aliases", 2135 2298 "libc", ··· 2143 2306 checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" 2144 2307 2145 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]] 2146 2328 name = "num-conv" 2147 2329 version = "0.1.0" 2148 2330 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2159 2341 2160 2342 [[package]] 2161 2343 name = "num_enum" 2162 - version = "0.7.4" 2344 + version = "0.7.5" 2163 2345 source = "registry+https://github.com/rust-lang/crates.io-index" 2164 - checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" 2346 + checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" 2165 2347 dependencies = [ 2166 2348 "num_enum_derive", 2167 2349 "rustversion", ··· 2169 2351 2170 2352 [[package]] 2171 2353 name = "num_enum_derive" 2172 - version = "0.7.4" 2354 + version = "0.7.5" 2173 2355 source = "registry+https://github.com/rust-lang/crates.io-index" 2174 - checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" 2356 + checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" 2175 2357 dependencies = [ 2176 - "proc-macro-crate 3.3.0", 2358 + "proc-macro-crate 3.4.0", 2177 2359 "proc-macro2", 2178 2360 "quote", 2179 - "syn 2.0.104", 2361 + "syn 2.0.109", 2180 2362 ] 2181 2363 2182 2364 [[package]] ··· 2197 2379 2198 2380 [[package]] 2199 2381 name = "objc2" 2200 - version = "0.6.1" 2382 + version = "0.6.3" 2201 2383 source = "registry+https://github.com/rust-lang/crates.io-index" 2202 - checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" 2384 + checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" 2203 2385 dependencies = [ 2204 2386 "objc2-encode", 2205 2387 "objc2-exception-helper", ··· 2207 2389 2208 2390 [[package]] 2209 2391 name = "objc2-app-kit" 2210 - version = "0.3.1" 2392 + version = "0.3.2" 2211 2393 source = "registry+https://github.com/rust-lang/crates.io-index" 2212 - checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" 2394 + checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" 2213 2395 dependencies = [ 2214 - "bitflags 2.9.1", 2215 - "block2 0.6.1", 2396 + "bitflags 2.10.0", 2397 + "block2 0.6.2", 2216 2398 "libc", 2217 - "objc2 0.6.1", 2399 + "objc2 0.6.3", 2218 2400 "objc2-cloud-kit", 2219 2401 "objc2-core-data", 2220 2402 "objc2-core-foundation", 2221 2403 "objc2-core-graphics", 2222 2404 "objc2-core-image", 2223 - "objc2-foundation 0.3.1", 2224 - "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", 2225 2409 ] 2226 2410 2227 2411 [[package]] 2228 2412 name = "objc2-cloud-kit" 2229 - version = "0.3.1" 2413 + version = "0.3.2" 2230 2414 source = "registry+https://github.com/rust-lang/crates.io-index" 2231 - checksum = "17614fdcd9b411e6ff1117dfb1d0150f908ba83a7df81b1f118005fe0a8ea15d" 2415 + checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" 2232 2416 dependencies = [ 2233 - "bitflags 2.9.1", 2234 - "objc2 0.6.1", 2235 - "objc2-foundation 0.3.1", 2417 + "bitflags 2.10.0", 2418 + "objc2 0.6.3", 2419 + "objc2-foundation 0.3.2", 2236 2420 ] 2237 2421 2238 2422 [[package]] 2239 2423 name = "objc2-core-data" 2240 - version = "0.3.1" 2424 + version = "0.3.2" 2241 2425 source = "registry+https://github.com/rust-lang/crates.io-index" 2242 - checksum = "291fbbf7d29287518e8686417cf7239c74700fd4b607623140a7d4a3c834329d" 2426 + checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" 2243 2427 dependencies = [ 2244 - "bitflags 2.9.1", 2245 - "objc2 0.6.1", 2246 - "objc2-foundation 0.3.1", 2428 + "bitflags 2.10.0", 2429 + "objc2 0.6.3", 2430 + "objc2-foundation 0.3.2", 2247 2431 ] 2248 2432 2249 2433 [[package]] 2250 2434 name = "objc2-core-foundation" 2251 - version = "0.3.1" 2435 + version = "0.3.2" 2252 2436 source = "registry+https://github.com/rust-lang/crates.io-index" 2253 - checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" 2437 + checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" 2254 2438 dependencies = [ 2255 - "bitflags 2.9.1", 2439 + "bitflags 2.10.0", 2256 2440 "dispatch2", 2257 - "objc2 0.6.1", 2441 + "objc2 0.6.3", 2258 2442 ] 2259 2443 2260 2444 [[package]] 2261 2445 name = "objc2-core-graphics" 2262 - version = "0.3.1" 2446 + version = "0.3.2" 2263 2447 source = "registry+https://github.com/rust-lang/crates.io-index" 2264 - checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" 2448 + checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" 2265 2449 dependencies = [ 2266 - "bitflags 2.9.1", 2450 + "bitflags 2.10.0", 2267 2451 "dispatch2", 2268 - "objc2 0.6.1", 2452 + "objc2 0.6.3", 2269 2453 "objc2-core-foundation", 2270 2454 "objc2-io-surface", 2271 2455 ] 2272 2456 2273 2457 [[package]] 2274 2458 name = "objc2-core-image" 2275 - 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" 2276 2492 source = "registry+https://github.com/rust-lang/crates.io-index" 2277 - checksum = "79b3dc0cc4386b6ccf21c157591b34a7f44c8e75b064f85502901ab2188c007e" 2493 + checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" 2278 2494 dependencies = [ 2279 - "objc2 0.6.1", 2280 - "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", 2281 2500 ] 2282 2501 2283 2502 [[package]] ··· 2301 2520 source = "registry+https://github.com/rust-lang/crates.io-index" 2302 2521 checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" 2303 2522 dependencies = [ 2304 - "bitflags 2.9.1", 2523 + "bitflags 2.10.0", 2305 2524 "block2 0.5.1", 2306 2525 "libc", 2307 2526 "objc2 0.5.2", ··· 2309 2528 2310 2529 [[package]] 2311 2530 name = "objc2-foundation" 2312 - version = "0.3.1" 2531 + version = "0.3.2" 2313 2532 source = "registry+https://github.com/rust-lang/crates.io-index" 2314 - checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" 2533 + checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" 2315 2534 dependencies = [ 2316 - "bitflags 2.9.1", 2317 - "block2 0.6.1", 2535 + "bitflags 2.10.0", 2536 + "block2 0.6.2", 2318 2537 "libc", 2319 - "objc2 0.6.1", 2538 + "objc2 0.6.3", 2320 2539 "objc2-core-foundation", 2321 2540 ] 2322 2541 2323 2542 [[package]] 2324 2543 name = "objc2-io-surface" 2325 - version = "0.3.1" 2544 + version = "0.3.2" 2326 2545 source = "registry+https://github.com/rust-lang/crates.io-index" 2327 - checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" 2546 + checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" 2328 2547 dependencies = [ 2329 - "bitflags 2.9.1", 2330 - "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", 2331 2560 "objc2-core-foundation", 2332 2561 ] 2333 2562 ··· 2337 2566 source = "registry+https://github.com/rust-lang/crates.io-index" 2338 2567 checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" 2339 2568 dependencies = [ 2340 - "bitflags 2.9.1", 2569 + "bitflags 2.10.0", 2341 2570 "block2 0.5.1", 2342 2571 "objc2 0.5.2", 2343 2572 "objc2-foundation 0.2.2", ··· 2349 2578 source = "registry+https://github.com/rust-lang/crates.io-index" 2350 2579 checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" 2351 2580 dependencies = [ 2352 - "bitflags 2.9.1", 2581 + "bitflags 2.10.0", 2353 2582 "block2 0.5.1", 2354 2583 "objc2 0.5.2", 2355 2584 "objc2-foundation 0.2.2", ··· 2358 2587 2359 2588 [[package]] 2360 2589 name = "objc2-quartz-core" 2361 - version = "0.3.1" 2590 + version = "0.3.2" 2362 2591 source = "registry+https://github.com/rust-lang/crates.io-index" 2363 - checksum = "90ffb6a0cd5f182dc964334388560b12a57f7b74b3e2dec5e2722aa2dfb2ccd5" 2592 + checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" 2364 2593 dependencies = [ 2365 - "bitflags 2.9.1", 2366 - "objc2 0.6.1", 2367 - "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", 2368 2598 ] 2369 2599 2370 2600 [[package]] 2371 - name = "objc2-ui-kit" 2372 - version = "0.3.1" 2601 + name = "objc2-security" 2602 + version = "0.3.2" 2373 2603 source = "registry+https://github.com/rust-lang/crates.io-index" 2374 - checksum = "25b1312ad7bc8a0e92adae17aa10f90aae1fb618832f9b993b022b591027daed" 2604 + checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" 2375 2605 dependencies = [ 2376 - "bitflags 2.9.1", 2377 - "objc2 0.6.1", 2606 + "bitflags 2.10.0", 2607 + "objc2 0.6.3", 2378 2608 "objc2-core-foundation", 2379 - "objc2-foundation 0.3.1", 2380 2609 ] 2381 2610 2382 2611 [[package]] 2383 - name = "objc2-web-kit" 2384 - version = "0.3.1" 2612 + name = "objc2-ui-kit" 2613 + version = "0.3.2" 2385 2614 source = "registry+https://github.com/rust-lang/crates.io-index" 2386 - checksum = "91672909de8b1ce1c2252e95bbee8c1649c9ad9d14b9248b3d7b4c47903c47ad" 2615 + checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" 2387 2616 dependencies = [ 2388 - "bitflags 2.9.1", 2389 - "block2 0.6.1", 2390 - "objc2 0.6.1", 2391 - "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", 2392 2622 "objc2-core-foundation", 2393 - "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", 2394 2630 ] 2395 2631 2396 2632 [[package]] 2397 - name = "object" 2398 - version = "0.36.7" 2633 + name = "objc2-user-notifications" 2634 + version = "0.3.2" 2635 + source = "registry+https://github.com/rust-lang/crates.io-index" 2636 + checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" 2637 + dependencies = [ 2638 + "objc2 0.6.3", 2639 + "objc2-foundation 0.3.2", 2640 + ] 2641 + 2642 + [[package]] 2643 + name = "objc2-web-kit" 2644 + version = "0.3.2" 2399 2645 source = "registry+https://github.com/rust-lang/crates.io-index" 2400 - checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 2646 + checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" 2401 2647 dependencies = [ 2402 - "memchr", 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", 2403 2656 ] 2404 2657 2405 2658 [[package]] ··· 2437 2690 ] 2438 2691 2439 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]] 2440 2719 name = "pango" 2441 2720 version = "0.18.3" 2442 2721 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2469 2748 2470 2749 [[package]] 2471 2750 name = "parking_lot" 2472 - version = "0.12.4" 2751 + version = "0.12.5" 2473 2752 source = "registry+https://github.com/rust-lang/crates.io-index" 2474 - checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" 2753 + checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" 2475 2754 dependencies = [ 2476 2755 "lock_api", 2477 2756 "parking_lot_core", ··· 2479 2758 2480 2759 [[package]] 2481 2760 name = "parking_lot_core" 2482 - version = "0.9.11" 2761 + version = "0.9.12" 2483 2762 source = "registry+https://github.com/rust-lang/crates.io-index" 2484 - checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" 2763 + checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" 2485 2764 dependencies = [ 2486 2765 "cfg-if", 2487 2766 "libc", 2488 2767 "redox_syscall", 2489 2768 "smallvec", 2490 - "windows-targets 0.52.6", 2769 + "windows-link 0.2.1", 2491 2770 ] 2492 2771 2493 2772 [[package]] ··· 2498 2777 2499 2778 [[package]] 2500 2779 name = "percent-encoding" 2501 - version = "2.3.1" 2780 + version = "2.3.2" 2502 2781 source = "registry+https://github.com/rust-lang/crates.io-index" 2503 - 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 + ] 2504 2794 2505 2795 [[package]] 2506 2796 name = "phf" ··· 2606 2896 "phf_shared 0.11.3", 2607 2897 "proc-macro2", 2608 2898 "quote", 2609 - "syn 2.0.104", 2899 + "syn 2.0.109", 2610 2900 ] 2611 2901 2612 2902 [[package]] ··· 2667 2957 2668 2958 [[package]] 2669 2959 name = "plist" 2670 - version = "1.7.4" 2960 + version = "1.8.0" 2671 2961 source = "registry+https://github.com/rust-lang/crates.io-index" 2672 - checksum = "3af6b589e163c5a788fab00ce0c0366f6efbb9959c2f9874b224936af7fce7e1" 2962 + checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" 2673 2963 dependencies = [ 2674 2964 "base64 0.22.1", 2675 - "indexmap 2.10.0", 2676 - "quick-xml 0.38.0", 2965 + "indexmap 2.12.0", 2966 + "quick-xml 0.38.3", 2677 2967 "serde", 2678 2968 "time", 2679 2969 ] ··· 2692 2982 ] 2693 2983 2694 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]] 2695 2998 name = "polling" 2696 - version = "3.9.0" 2999 + version = "3.11.0" 2697 3000 source = "registry+https://github.com/rust-lang/crates.io-index" 2698 - checksum = "8ee9b2fa7a4517d2c91ff5bc6c297a427a96749d15f98fcdbb22c05571a4d4b7" 3001 + checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" 2699 3002 dependencies = [ 2700 3003 "cfg-if", 2701 3004 "concurrent-queue", 2702 3005 "hermit-abi", 2703 3006 "pin-project-lite", 2704 - "rustix", 2705 - "windows-sys 0.60.2", 3007 + "rustix 1.1.2", 3008 + "windows-sys 0.61.2", 2706 3009 ] 2707 3010 2708 3011 [[package]] 2709 3012 name = "potential_utf" 2710 - version = "0.1.2" 3013 + version = "0.1.4" 2711 3014 source = "registry+https://github.com/rust-lang/crates.io-index" 2712 - checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" 3015 + checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" 2713 3016 dependencies = [ 2714 3017 "zerovec", 2715 3018 ] ··· 2747 3050 2748 3051 [[package]] 2749 3052 name = "proc-macro-crate" 2750 - version = "2.0.0" 3053 + version = "2.0.2" 2751 3054 source = "registry+https://github.com/rust-lang/crates.io-index" 2752 - checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" 3055 + checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" 2753 3056 dependencies = [ 2754 - "toml_edit 0.20.7", 3057 + "toml_datetime 0.6.3", 3058 + "toml_edit 0.20.2", 2755 3059 ] 2756 3060 2757 3061 [[package]] 2758 3062 name = "proc-macro-crate" 2759 - version = "3.3.0" 3063 + version = "3.4.0" 2760 3064 source = "registry+https://github.com/rust-lang/crates.io-index" 2761 - checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" 3065 + checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" 2762 3066 dependencies = [ 2763 - "toml_edit 0.22.27", 3067 + "toml_edit 0.23.7", 2764 3068 ] 2765 3069 2766 3070 [[package]] ··· 2795 3099 2796 3100 [[package]] 2797 3101 name = "proc-macro2" 2798 - version = "1.0.95" 3102 + version = "1.0.103" 2799 3103 source = "registry+https://github.com/rust-lang/crates.io-index" 2800 - checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 3104 + checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" 2801 3105 dependencies = [ 2802 3106 "unicode-ident", 2803 3107 ] 2804 3108 2805 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]] 2806 3125 name = "quick-xml" 2807 3126 version = "0.37.5" 2808 3127 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2813 3132 2814 3133 [[package]] 2815 3134 name = "quick-xml" 2816 - version = "0.38.0" 3135 + version = "0.38.3" 2817 3136 source = "registry+https://github.com/rust-lang/crates.io-index" 2818 - checksum = "8927b0664f5c5a98265138b7e3f90aa19a6b21353182469ace36d4ac527b7b1b" 3137 + checksum = "42a232e7487fc2ef313d96dde7948e7a3c05101870d8985e4fd8d26aedd27b89" 2819 3138 dependencies = [ 2820 3139 "memchr", 2821 3140 ] 2822 3141 2823 3142 [[package]] 2824 3143 name = "quote" 2825 - version = "1.0.40" 3144 + version = "1.0.42" 2826 3145 source = "registry+https://github.com/rust-lang/crates.io-index" 2827 - checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 3146 + checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" 2828 3147 dependencies = [ 2829 3148 "proc-macro2", 2830 3149 ] ··· 2924 3243 source = "registry+https://github.com/rust-lang/crates.io-index" 2925 3244 checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 2926 3245 dependencies = [ 2927 - "getrandom 0.3.3", 3246 + "getrandom 0.3.4", 2928 3247 ] 2929 3248 2930 3249 [[package]] ··· 2953 3272 2954 3273 [[package]] 2955 3274 name = "redox_syscall" 2956 - version = "0.5.17" 3275 + version = "0.5.18" 2957 3276 source = "registry+https://github.com/rust-lang/crates.io-index" 2958 - checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" 3277 + checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" 2959 3278 dependencies = [ 2960 - "bitflags 2.9.1", 3279 + "bitflags 2.10.0", 2961 3280 ] 2962 3281 2963 3282 [[package]] 2964 3283 name = "redox_users" 2965 - version = "0.5.0" 3284 + version = "0.5.2" 2966 3285 source = "registry+https://github.com/rust-lang/crates.io-index" 2967 - checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" 3286 + checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" 2968 3287 dependencies = [ 2969 3288 "getrandom 0.2.16", 2970 3289 "libredox", 2971 - "thiserror 2.0.12", 3290 + "thiserror 2.0.17", 2972 3291 ] 2973 3292 2974 3293 [[package]] 2975 3294 name = "ref-cast" 2976 - version = "1.0.24" 3295 + version = "1.0.25" 2977 3296 source = "registry+https://github.com/rust-lang/crates.io-index" 2978 - checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" 3297 + checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" 2979 3298 dependencies = [ 2980 3299 "ref-cast-impl", 2981 3300 ] 2982 3301 2983 3302 [[package]] 2984 3303 name = "ref-cast-impl" 2985 - version = "1.0.24" 3304 + version = "1.0.25" 2986 3305 source = "registry+https://github.com/rust-lang/crates.io-index" 2987 - checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" 3306 + checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" 2988 3307 dependencies = [ 2989 3308 "proc-macro2", 2990 3309 "quote", 2991 - "syn 2.0.104", 3310 + "syn 2.0.109", 2992 3311 ] 2993 3312 2994 3313 [[package]] 2995 3314 name = "regex" 2996 - version = "1.11.1" 3315 + version = "1.12.2" 2997 3316 source = "registry+https://github.com/rust-lang/crates.io-index" 2998 - checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 3317 + checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" 2999 3318 dependencies = [ 3000 3319 "aho-corasick", 3001 3320 "memchr", ··· 3005 3324 3006 3325 [[package]] 3007 3326 name = "regex-automata" 3008 - version = "0.4.9" 3327 + version = "0.4.13" 3009 3328 source = "registry+https://github.com/rust-lang/crates.io-index" 3010 - checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 3329 + checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" 3011 3330 dependencies = [ 3012 3331 "aho-corasick", 3013 3332 "memchr", ··· 3016 3335 3017 3336 [[package]] 3018 3337 name = "regex-syntax" 3019 - version = "0.8.5" 3338 + version = "0.8.8" 3020 3339 source = "registry+https://github.com/rust-lang/crates.io-index" 3021 - checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 3340 + checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" 3022 3341 3023 3342 [[package]] 3024 3343 name = "reqwest" 3025 - version = "0.12.22" 3344 + version = "0.12.24" 3026 3345 source = "registry+https://github.com/rust-lang/crates.io-index" 3027 - checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" 3346 + checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" 3028 3347 dependencies = [ 3029 3348 "base64 0.22.1", 3030 3349 "bytes", ··· 3062 3381 checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" 3063 3382 dependencies = [ 3064 3383 "ashpd", 3065 - "block2 0.6.1", 3384 + "block2 0.6.2", 3066 3385 "dispatch2", 3067 3386 "glib-sys", 3068 3387 "gobject-sys", 3069 3388 "gtk-sys", 3070 3389 "js-sys", 3071 3390 "log", 3072 - "objc2 0.6.1", 3391 + "objc2 0.6.3", 3073 3392 "objc2-app-kit", 3074 3393 "objc2-core-foundation", 3075 - "objc2-foundation 0.3.1", 3394 + "objc2-foundation 0.3.2", 3076 3395 "raw-window-handle", 3077 3396 "wasm-bindgen", 3078 3397 "wasm-bindgen-futures", ··· 3081 3400 ] 3082 3401 3083 3402 [[package]] 3084 - name = "rustc-demangle" 3085 - version = "0.1.26" 3086 - source = "registry+https://github.com/rust-lang/crates.io-index" 3087 - checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" 3088 - 3089 - [[package]] 3090 3403 name = "rustc_version" 3091 3404 version = "0.4.1" 3092 3405 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3097 3410 3098 3411 [[package]] 3099 3412 name = "rustix" 3100 - 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" 3101 3427 source = "registry+https://github.com/rust-lang/crates.io-index" 3102 - checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" 3428 + checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" 3103 3429 dependencies = [ 3104 - "bitflags 2.9.1", 3430 + "bitflags 2.10.0", 3105 3431 "errno", 3106 3432 "libc", 3107 - "linux-raw-sys", 3108 - "windows-sys 0.60.2", 3433 + "linux-raw-sys 0.11.0", 3434 + "windows-sys 0.61.2", 3109 3435 ] 3110 3436 3111 3437 [[package]] 3112 3438 name = "rustversion" 3113 - version = "1.0.21" 3439 + version = "1.0.22" 3114 3440 source = "registry+https://github.com/rust-lang/crates.io-index" 3115 - checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" 3441 + checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 3116 3442 3117 3443 [[package]] 3118 3444 name = "ryu" ··· 3158 3484 3159 3485 [[package]] 3160 3486 name = "schemars" 3161 - version = "1.0.4" 3487 + version = "1.1.0" 3162 3488 source = "registry+https://github.com/rust-lang/crates.io-index" 3163 - checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" 3489 + checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" 3164 3490 dependencies = [ 3165 3491 "dyn-clone", 3166 3492 "ref-cast", ··· 3177 3503 "proc-macro2", 3178 3504 "quote", 3179 3505 "serde_derive_internals", 3180 - "syn 2.0.104", 3506 + "syn 2.0.109", 3181 3507 ] 3182 3508 3183 3509 [[package]] ··· 3212 3538 3213 3539 [[package]] 3214 3540 name = "semver" 3215 - version = "1.0.26" 3541 + version = "1.0.27" 3216 3542 source = "registry+https://github.com/rust-lang/crates.io-index" 3217 - checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" 3543 + checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" 3218 3544 dependencies = [ 3219 3545 "serde", 3546 + "serde_core", 3220 3547 ] 3221 3548 3222 3549 [[package]] 3223 3550 name = "serde" 3224 - version = "1.0.219" 3551 + version = "1.0.228" 3225 3552 source = "registry+https://github.com/rust-lang/crates.io-index" 3226 - checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 3553 + checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 3227 3554 dependencies = [ 3555 + "serde_core", 3228 3556 "serde_derive", 3229 3557 ] 3230 3558 3231 3559 [[package]] 3232 3560 name = "serde-untagged" 3233 - version = "0.1.7" 3561 + version = "0.1.9" 3234 3562 source = "registry+https://github.com/rust-lang/crates.io-index" 3235 - checksum = "299d9c19d7d466db4ab10addd5703e4c615dec2a5a16dbbafe191045e87ee66e" 3563 + checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" 3236 3564 dependencies = [ 3237 3565 "erased-serde", 3238 3566 "serde", 3567 + "serde_core", 3239 3568 "typeid", 3240 3569 ] 3241 3570 3242 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]] 3243 3581 name = "serde_derive" 3244 - version = "1.0.219" 3582 + version = "1.0.228" 3245 3583 source = "registry+https://github.com/rust-lang/crates.io-index" 3246 - checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 3584 + checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 3247 3585 dependencies = [ 3248 3586 "proc-macro2", 3249 3587 "quote", 3250 - "syn 2.0.104", 3588 + "syn 2.0.109", 3251 3589 ] 3252 3590 3253 3591 [[package]] ··· 3258 3596 dependencies = [ 3259 3597 "proc-macro2", 3260 3598 "quote", 3261 - "syn 2.0.104", 3599 + "syn 2.0.109", 3262 3600 ] 3263 3601 3264 3602 [[package]] 3265 3603 name = "serde_json" 3266 - version = "1.0.141" 3604 + version = "1.0.145" 3267 3605 source = "registry+https://github.com/rust-lang/crates.io-index" 3268 - checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" 3606 + checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" 3269 3607 dependencies = [ 3270 3608 "itoa", 3271 3609 "memchr", 3272 3610 "ryu", 3273 3611 "serde", 3612 + "serde_core", 3274 3613 ] 3275 3614 3276 3615 [[package]] ··· 3281 3620 dependencies = [ 3282 3621 "proc-macro2", 3283 3622 "quote", 3284 - "syn 2.0.104", 3623 + "syn 2.0.109", 3285 3624 ] 3286 3625 3287 3626 [[package]] ··· 3295 3634 3296 3635 [[package]] 3297 3636 name = "serde_spanned" 3298 - version = "1.0.0" 3637 + version = "1.0.3" 3299 3638 source = "registry+https://github.com/rust-lang/crates.io-index" 3300 - checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" 3639 + checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" 3301 3640 dependencies = [ 3302 - "serde", 3641 + "serde_core", 3303 3642 ] 3304 3643 3305 3644 [[package]] ··· 3316 3655 3317 3656 [[package]] 3318 3657 name = "serde_with" 3319 - version = "3.14.0" 3658 + version = "3.15.1" 3320 3659 source = "registry+https://github.com/rust-lang/crates.io-index" 3321 - checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" 3660 + checksum = "aa66c845eee442168b2c8134fec70ac50dc20e760769c8ba0ad1319ca1959b04" 3322 3661 dependencies = [ 3323 3662 "base64 0.22.1", 3324 3663 "chrono", 3325 3664 "hex", 3326 3665 "indexmap 1.9.3", 3327 - "indexmap 2.10.0", 3666 + "indexmap 2.12.0", 3328 3667 "schemars 0.9.0", 3329 - "schemars 1.0.4", 3330 - "serde", 3331 - "serde_derive", 3668 + "schemars 1.1.0", 3669 + "serde_core", 3332 3670 "serde_json", 3333 3671 "serde_with_macros", 3334 3672 "time", ··· 3336 3674 3337 3675 [[package]] 3338 3676 name = "serde_with_macros" 3339 - version = "3.14.0" 3677 + version = "3.15.1" 3340 3678 source = "registry+https://github.com/rust-lang/crates.io-index" 3341 - checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" 3679 + checksum = "b91a903660542fced4e99881aa481bdbaec1634568ee02e0b8bd57c64cb38955" 3342 3680 dependencies = [ 3343 3681 "darling", 3344 3682 "proc-macro2", 3345 3683 "quote", 3346 - "syn 2.0.104", 3684 + "syn 2.0.109", 3347 3685 ] 3348 3686 3349 3687 [[package]] 3350 3688 name = "serialize-to-javascript" 3351 - version = "0.1.1" 3689 + version = "0.1.2" 3352 3690 source = "registry+https://github.com/rust-lang/crates.io-index" 3353 - checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" 3691 + checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" 3354 3692 dependencies = [ 3355 3693 "serde", 3356 3694 "serde_json", ··· 3359 3697 3360 3698 [[package]] 3361 3699 name = "serialize-to-javascript-impl" 3362 - version = "0.1.1" 3700 + version = "0.1.2" 3363 3701 source = "registry+https://github.com/rust-lang/crates.io-index" 3364 - checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" 3702 + checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" 3365 3703 dependencies = [ 3366 3704 "proc-macro2", 3367 3705 "quote", 3368 - "syn 1.0.109", 3706 + "syn 2.0.109", 3369 3707 ] 3370 3708 3371 3709 [[package]] ··· 3397 3735 3398 3736 [[package]] 3399 3737 name = "signal-hook-registry" 3400 - version = "1.4.5" 3738 + version = "1.4.6" 3401 3739 source = "registry+https://github.com/rust-lang/crates.io-index" 3402 - checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" 3740 + checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" 3403 3741 dependencies = [ 3404 3742 "libc", 3405 3743 ] ··· 3424 3762 3425 3763 [[package]] 3426 3764 name = "slab" 3427 - version = "0.4.10" 3765 + version = "0.4.11" 3428 3766 source = "registry+https://github.com/rust-lang/crates.io-index" 3429 - checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" 3767 + checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" 3430 3768 3431 3769 [[package]] 3432 3770 name = "smallvec" ··· 3436 3774 3437 3775 [[package]] 3438 3776 name = "socket2" 3439 - version = "0.6.0" 3777 + version = "0.6.1" 3440 3778 source = "registry+https://github.com/rust-lang/crates.io-index" 3441 - checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" 3779 + checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" 3442 3780 dependencies = [ 3443 3781 "libc", 3444 - "windows-sys 0.59.0", 3782 + "windows-sys 0.60.2", 3445 3783 ] 3446 3784 3447 3785 [[package]] ··· 3452 3790 dependencies = [ 3453 3791 "bytemuck", 3454 3792 "cfg_aliases", 3455 - "core-graphics", 3793 + "core-graphics 0.24.0", 3456 3794 "foreign-types", 3457 3795 "js-sys", 3458 3796 "log", ··· 3494 3832 3495 3833 [[package]] 3496 3834 name = "stable_deref_trait" 3497 - version = "1.2.0" 3835 + version = "1.2.1" 3498 3836 source = "registry+https://github.com/rust-lang/crates.io-index" 3499 - checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 3837 + checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" 3500 3838 3501 3839 [[package]] 3502 3840 name = "static_assertions" ··· 3559 3897 3560 3898 [[package]] 3561 3899 name = "syn" 3562 - version = "2.0.104" 3900 + version = "2.0.109" 3563 3901 source = "registry+https://github.com/rust-lang/crates.io-index" 3564 - checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" 3902 + checksum = "2f17c7e013e88258aa9543dcbe81aca68a667a9ac37cd69c9fbc07858bfe0e2f" 3565 3903 dependencies = [ 3566 3904 "proc-macro2", 3567 3905 "quote", ··· 3585 3923 dependencies = [ 3586 3924 "proc-macro2", 3587 3925 "quote", 3588 - "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", 3589 3936 ] 3590 3937 3591 3938 [[package]] ··· 3597 3944 "cfg-expr", 3598 3945 "heck 0.5.0", 3599 3946 "pkg-config", 3600 - "toml 0.8.23", 3947 + "toml 0.8.2", 3601 3948 "version-compare", 3602 3949 ] 3603 3950 3604 3951 [[package]] 3605 3952 name = "tao" 3606 - version = "0.34.0" 3953 + version = "0.34.5" 3607 3954 source = "registry+https://github.com/rust-lang/crates.io-index" 3608 - checksum = "49c380ca75a231b87b6c9dd86948f035012e7171d1a7c40a9c2890489a7ffd8a" 3955 + checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" 3609 3956 dependencies = [ 3610 - "bitflags 2.9.1", 3957 + "bitflags 2.10.0", 3958 + "block2 0.6.2", 3611 3959 "core-foundation", 3612 - "core-graphics", 3960 + "core-graphics 0.24.0", 3613 3961 "crossbeam-channel", 3614 3962 "dispatch", 3615 3963 "dlopen2", ··· 3624 3972 "ndk", 3625 3973 "ndk-context", 3626 3974 "ndk-sys", 3627 - "objc2 0.6.1", 3975 + "objc2 0.6.3", 3628 3976 "objc2-app-kit", 3629 - "objc2-foundation 0.3.1", 3977 + "objc2-foundation 0.3.2", 3630 3978 "once_cell", 3631 3979 "parking_lot", 3632 3980 "raw-window-handle", ··· 3635 3983 "unicode-segmentation", 3636 3984 "url", 3637 3985 "windows", 3638 - "windows-core", 3986 + "windows-core 0.61.2", 3639 3987 "windows-version", 3640 3988 "x11-dl", 3641 3989 ] ··· 3648 3996 dependencies = [ 3649 3997 "proc-macro2", 3650 3998 "quote", 3651 - "syn 2.0.104", 3999 + "syn 2.0.109", 3652 4000 ] 3653 4001 3654 4002 [[package]] ··· 3659 4007 3660 4008 [[package]] 3661 4009 name = "tauri" 3662 - version = "2.7.0" 4010 + version = "2.9.2" 3663 4011 source = "registry+https://github.com/rust-lang/crates.io-index" 3664 - checksum = "352a4bc7bf6c25f5624227e3641adf475a6535707451b09bb83271df8b7a6ac7" 4012 + checksum = "8bceb52453e507c505b330afe3398510e87f428ea42b6e76ecb6bd63b15965b5" 3665 4013 dependencies = [ 3666 4014 "anyhow", 3667 4015 "bytes", 4016 + "cookie", 3668 4017 "dirs", 3669 4018 "dunce", 3670 4019 "embed_plist", 3671 - "getrandom 0.3.3", 4020 + "getrandom 0.3.4", 3672 4021 "glob", 3673 4022 "gtk", 3674 4023 "heck 0.5.0", 3675 4024 "http", 4025 + "image", 3676 4026 "jni", 3677 4027 "libc", 3678 4028 "log", 3679 4029 "mime", 3680 4030 "muda", 3681 - "objc2 0.6.1", 4031 + "objc2 0.6.3", 3682 4032 "objc2-app-kit", 3683 - "objc2-foundation 0.3.1", 4033 + "objc2-foundation 0.3.2", 3684 4034 "objc2-ui-kit", 4035 + "objc2-web-kit", 3685 4036 "percent-encoding", 3686 4037 "plist", 3687 4038 "raw-window-handle", ··· 3696 4047 "tauri-runtime", 3697 4048 "tauri-runtime-wry", 3698 4049 "tauri-utils", 3699 - "thiserror 2.0.12", 4050 + "thiserror 2.0.17", 3700 4051 "tokio", 3701 4052 "tray-icon", 3702 4053 "url", 3703 - "urlpattern", 3704 4054 "webkit2gtk", 3705 4055 "webview2-com", 3706 4056 "window-vibrancy", ··· 3709 4059 3710 4060 [[package]] 3711 4061 name = "tauri-build" 3712 - version = "2.3.1" 4062 + version = "2.5.1" 3713 4063 source = "registry+https://github.com/rust-lang/crates.io-index" 3714 - checksum = "182d688496c06bf08ea896459bf483eb29cdff35c1c4c115fb14053514303064" 4064 + checksum = "a924b6c50fe83193f0f8b14072afa7c25b7a72752a2a73d9549b463f5fe91a38" 3715 4065 dependencies = [ 3716 4066 "anyhow", 3717 4067 "cargo_toml", ··· 3725 4075 "serde_json", 3726 4076 "tauri-utils", 3727 4077 "tauri-winres", 3728 - "toml 0.8.23", 4078 + "toml 0.9.8", 3729 4079 "walkdir", 3730 4080 ] 3731 4081 3732 4082 [[package]] 3733 4083 name = "tauri-codegen" 3734 - version = "2.3.1" 4084 + version = "2.5.0" 3735 4085 source = "registry+https://github.com/rust-lang/crates.io-index" 3736 - checksum = "b54a99a6cd8e01abcfa61508177e6096a4fe2681efecee9214e962f2f073ae4a" 4086 + checksum = "6c1fe64c74cc40f90848281a90058a6db931eb400b60205840e09801ee30f190" 3737 4087 dependencies = [ 3738 4088 "base64 0.22.1", 3739 4089 "brotli", 3740 4090 "ico", 3741 4091 "json-patch", 3742 4092 "plist", 3743 - "png", 4093 + "png 0.17.16", 3744 4094 "proc-macro2", 3745 4095 "quote", 3746 4096 "semver", 3747 4097 "serde", 3748 4098 "serde_json", 3749 4099 "sha2", 3750 - "syn 2.0.104", 4100 + "syn 2.0.109", 3751 4101 "tauri-utils", 3752 - "thiserror 2.0.12", 4102 + "thiserror 2.0.17", 3753 4103 "time", 3754 4104 "url", 3755 4105 "uuid", ··· 3758 4108 3759 4109 [[package]] 3760 4110 name = "tauri-macros" 3761 - version = "2.3.2" 4111 + version = "2.5.0" 3762 4112 source = "registry+https://github.com/rust-lang/crates.io-index" 3763 - checksum = "7945b14dc45e23532f2ded6e120170bbdd4af5ceaa45784a6b33d250fbce3f9e" 4113 + checksum = "260c5d2eb036b76206b9fca20b7be3614cfd21046c5396f7959e0e64a4b07f2f" 3764 4114 dependencies = [ 3765 4115 "heck 0.5.0", 3766 4116 "proc-macro2", 3767 4117 "quote", 3768 - "syn 2.0.104", 4118 + "syn 2.0.109", 3769 4119 "tauri-codegen", 3770 4120 "tauri-utils", 3771 4121 ] 3772 4122 3773 4123 [[package]] 3774 4124 name = "tauri-plugin" 3775 - version = "2.3.1" 4125 + version = "2.5.1" 3776 4126 source = "registry+https://github.com/rust-lang/crates.io-index" 3777 - checksum = "5bd5c1e56990c70a906ef67a9851bbdba9136d26075ee9a2b19c8b46986b3e02" 4127 + checksum = "076c78a474a7247c90cad0b6e87e593c4c620ed4efdb79cbe0214f0021f6c39d" 3778 4128 dependencies = [ 3779 4129 "anyhow", 3780 4130 "glob", ··· 3783 4133 "serde", 3784 4134 "serde_json", 3785 4135 "tauri-utils", 3786 - "toml 0.8.23", 4136 + "toml 0.9.8", 3787 4137 "walkdir", 3788 4138 ] 3789 4139 3790 4140 [[package]] 3791 - name = "tauri-plugin-dialog" 4141 + name = "tauri-plugin-clipboard-manager" 3792 4142 version = "2.3.2" 3793 4143 source = "registry+https://github.com/rust-lang/crates.io-index" 3794 - 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" 3795 4160 dependencies = [ 3796 4161 "log", 3797 4162 "raw-window-handle", ··· 3801 4166 "tauri", 3802 4167 "tauri-plugin", 3803 4168 "tauri-plugin-fs", 3804 - "thiserror 2.0.12", 4169 + "thiserror 2.0.17", 3805 4170 "url", 3806 4171 ] 3807 4172 3808 4173 [[package]] 3809 4174 name = "tauri-plugin-fs" 3810 - version = "2.4.1" 4175 + version = "2.4.4" 3811 4176 source = "registry+https://github.com/rust-lang/crates.io-index" 3812 - checksum = "8c6ef84ee2f2094ce093e55106d90d763ba343fad57566992962e8f76d113f99" 4177 + checksum = "47df422695255ecbe7bac7012440eddaeefd026656171eac9559f5243d3230d9" 3813 4178 dependencies = [ 3814 4179 "anyhow", 3815 4180 "dunce", ··· 3822 4187 "tauri", 3823 4188 "tauri-plugin", 3824 4189 "tauri-utils", 3825 - "thiserror 2.0.12", 3826 - "toml 0.8.23", 4190 + "thiserror 2.0.17", 4191 + "toml 0.9.8", 3827 4192 "url", 3828 4193 ] 3829 4194 3830 4195 [[package]] 3831 4196 name = "tauri-plugin-opener" 3832 - version = "2.4.0" 4197 + version = "2.5.2" 3833 4198 source = "registry+https://github.com/rust-lang/crates.io-index" 3834 - checksum = "ecee219f11cdac713ab32959db5d0cceec4810ba4f4458da992292ecf9660321" 4199 + checksum = "c26b72571d25dee25667940027114e60f569fc3974f8cefbe50c2cbc5fd65e3b" 3835 4200 dependencies = [ 3836 4201 "dunce", 3837 4202 "glob", 3838 4203 "objc2-app-kit", 3839 - "objc2-foundation 0.3.1", 4204 + "objc2-foundation 0.3.2", 3840 4205 "open", 3841 4206 "schemars 0.8.22", 3842 4207 "serde", 3843 4208 "serde_json", 3844 4209 "tauri", 3845 4210 "tauri-plugin", 3846 - "thiserror 2.0.12", 4211 + "thiserror 2.0.17", 3847 4212 "url", 3848 4213 "windows", 3849 4214 "zbus", 3850 4215 ] 3851 4216 3852 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]] 3853 4236 name = "tauri-runtime" 3854 - version = "2.7.1" 4237 + version = "2.9.1" 3855 4238 source = "registry+https://github.com/rust-lang/crates.io-index" 3856 - checksum = "2b1cc885be806ea15ff7b0eb47098a7b16323d9228876afda329e34e2d6c4676" 4239 + checksum = "9368f09358496f2229313fccb37682ad116b7f46fa76981efe116994a0628926" 3857 4240 dependencies = [ 3858 4241 "cookie", 3859 4242 "dpi", 3860 4243 "gtk", 3861 4244 "http", 3862 4245 "jni", 3863 - "objc2 0.6.1", 4246 + "objc2 0.6.3", 3864 4247 "objc2-ui-kit", 4248 + "objc2-web-kit", 3865 4249 "raw-window-handle", 3866 4250 "serde", 3867 4251 "serde_json", 3868 4252 "tauri-utils", 3869 - "thiserror 2.0.12", 4253 + "thiserror 2.0.17", 3870 4254 "url", 4255 + "webkit2gtk", 4256 + "webview2-com", 3871 4257 "windows", 3872 4258 ] 3873 4259 3874 4260 [[package]] 3875 4261 name = "tauri-runtime-wry" 3876 - version = "2.7.2" 4262 + version = "2.9.1" 3877 4263 source = "registry+https://github.com/rust-lang/crates.io-index" 3878 - checksum = "fe653a2fbbef19fe898efc774bc52c8742576342a33d3d028c189b57eb1d2439" 4264 + checksum = "929f5df216f5c02a9e894554401bcdab6eec3e39ec6a4a7731c7067fc8688a93" 3879 4265 dependencies = [ 3880 4266 "gtk", 3881 4267 "http", 3882 4268 "jni", 3883 4269 "log", 3884 - "objc2 0.6.1", 4270 + "objc2 0.6.3", 3885 4271 "objc2-app-kit", 3886 - "objc2-foundation 0.3.1", 4272 + "objc2-foundation 0.3.2", 3887 4273 "once_cell", 3888 4274 "percent-encoding", 3889 4275 "raw-window-handle", ··· 3900 4286 3901 4287 [[package]] 3902 4288 name = "tauri-utils" 3903 - version = "2.6.0" 4289 + version = "2.8.0" 3904 4290 source = "registry+https://github.com/rust-lang/crates.io-index" 3905 - checksum = "9330c15cabfe1d9f213478c9e8ec2b0c76dab26bb6f314b8ad1c8a568c1d186e" 4291 + checksum = "f6b8bbe426abdbf52d050e52ed693130dbd68375b9ad82a3fb17efb4c8d85673" 3906 4292 dependencies = [ 3907 4293 "anyhow", 3908 4294 "brotli", ··· 3928 4314 "serde_json", 3929 4315 "serde_with", 3930 4316 "swift-rs", 3931 - "thiserror 2.0.12", 3932 - "toml 0.8.23", 4317 + "thiserror 2.0.17", 4318 + "toml 0.9.8", 3933 4319 "url", 3934 4320 "urlpattern", 3935 4321 "uuid", ··· 3938 4324 3939 4325 [[package]] 3940 4326 name = "tauri-winres" 3941 - version = "0.3.1" 4327 + version = "0.3.3" 3942 4328 source = "registry+https://github.com/rust-lang/crates.io-index" 3943 - checksum = "e8d321dbc6f998d825ab3f0d62673e810c861aac2d0de2cc2c395328f1d113b4" 4329 + checksum = "fd21509dd1fa9bd355dc29894a6ff10635880732396aa38c0066c1e6c1ab8074" 3944 4330 dependencies = [ 3945 4331 "embed-resource", 3946 - "indexmap 2.10.0", 3947 - "toml 0.8.23", 4332 + "toml 0.9.8", 3948 4333 ] 3949 4334 3950 4335 [[package]] 3951 4336 name = "tempfile" 3952 - version = "3.20.0" 4337 + version = "3.23.0" 3953 4338 source = "registry+https://github.com/rust-lang/crates.io-index" 3954 - checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" 4339 + checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" 3955 4340 dependencies = [ 3956 4341 "fastrand", 3957 - "getrandom 0.3.3", 4342 + "getrandom 0.3.4", 3958 4343 "once_cell", 3959 - "rustix", 3960 - "windows-sys 0.59.0", 4344 + "rustix 1.1.2", 4345 + "windows-sys 0.61.2", 3961 4346 ] 3962 4347 3963 4348 [[package]] ··· 3982 4367 3983 4368 [[package]] 3984 4369 name = "thiserror" 3985 - version = "2.0.12" 4370 + version = "2.0.17" 3986 4371 source = "registry+https://github.com/rust-lang/crates.io-index" 3987 - checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 4372 + checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" 3988 4373 dependencies = [ 3989 - "thiserror-impl 2.0.12", 4374 + "thiserror-impl 2.0.17", 3990 4375 ] 3991 4376 3992 4377 [[package]] ··· 3997 4382 dependencies = [ 3998 4383 "proc-macro2", 3999 4384 "quote", 4000 - "syn 2.0.104", 4385 + "syn 2.0.109", 4001 4386 ] 4002 4387 4003 4388 [[package]] 4004 4389 name = "thiserror-impl" 4005 - version = "2.0.12" 4390 + version = "2.0.17" 4006 4391 source = "registry+https://github.com/rust-lang/crates.io-index" 4007 - checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 4392 + checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" 4008 4393 dependencies = [ 4009 4394 "proc-macro2", 4010 4395 "quote", 4011 - "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", 4012 4411 ] 4013 4412 4014 4413 [[package]] 4015 4414 name = "time" 4016 - version = "0.3.41" 4415 + version = "0.3.44" 4017 4416 source = "registry+https://github.com/rust-lang/crates.io-index" 4018 - checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" 4417 + checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" 4019 4418 dependencies = [ 4020 4419 "deranged", 4021 4420 "itoa", ··· 4028 4427 4029 4428 [[package]] 4030 4429 name = "time-core" 4031 - version = "0.1.4" 4430 + version = "0.1.6" 4032 4431 source = "registry+https://github.com/rust-lang/crates.io-index" 4033 - checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" 4432 + checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" 4034 4433 4035 4434 [[package]] 4036 4435 name = "time-macros" 4037 - version = "0.2.22" 4436 + version = "0.2.24" 4038 4437 source = "registry+https://github.com/rust-lang/crates.io-index" 4039 - checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" 4438 + checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" 4040 4439 dependencies = [ 4041 4440 "num-conv", 4042 4441 "time-core", ··· 4044 4443 4045 4444 [[package]] 4046 4445 name = "tinystr" 4047 - version = "0.8.1" 4446 + version = "0.8.2" 4048 4447 source = "registry+https://github.com/rust-lang/crates.io-index" 4049 - checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 4448 + checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" 4050 4449 dependencies = [ 4051 4450 "displaydoc", 4052 4451 "zerovec", ··· 4054 4453 4055 4454 [[package]] 4056 4455 name = "tokio" 4057 - version = "1.47.0" 4456 + version = "1.48.0" 4058 4457 source = "registry+https://github.com/rust-lang/crates.io-index" 4059 - checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35" 4458 + checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" 4060 4459 dependencies = [ 4061 - "backtrace", 4062 4460 "bytes", 4063 - "io-uring", 4064 4461 "libc", 4065 4462 "mio", 4066 4463 "pin-project-lite", 4067 4464 "signal-hook-registry", 4068 - "slab", 4069 4465 "socket2", 4070 4466 "tokio-macros", 4071 4467 "tracing", 4072 - "windows-sys 0.59.0", 4468 + "windows-sys 0.61.2", 4073 4469 ] 4074 4470 4075 4471 [[package]] 4076 4472 name = "tokio-macros" 4077 - version = "2.5.0" 4473 + version = "2.6.0" 4078 4474 source = "registry+https://github.com/rust-lang/crates.io-index" 4079 - checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 4475 + checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" 4080 4476 dependencies = [ 4081 4477 "proc-macro2", 4082 4478 "quote", 4083 - "syn 2.0.104", 4479 + "syn 2.0.109", 4084 4480 ] 4085 4481 4086 4482 [[package]] 4087 4483 name = "tokio-util" 4088 - version = "0.7.15" 4484 + version = "0.7.17" 4089 4485 source = "registry+https://github.com/rust-lang/crates.io-index" 4090 - checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" 4486 + checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" 4091 4487 dependencies = [ 4092 4488 "bytes", 4093 4489 "futures-core", ··· 4098 4494 4099 4495 [[package]] 4100 4496 name = "toml" 4101 - version = "0.8.23" 4497 + version = "0.8.2" 4102 4498 source = "registry+https://github.com/rust-lang/crates.io-index" 4103 - checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" 4499 + checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" 4104 4500 dependencies = [ 4105 4501 "serde", 4106 4502 "serde_spanned 0.6.9", 4107 - "toml_datetime 0.6.11", 4108 - "toml_edit 0.22.27", 4503 + "toml_datetime 0.6.3", 4504 + "toml_edit 0.20.2", 4109 4505 ] 4110 4506 4111 4507 [[package]] 4112 4508 name = "toml" 4113 - version = "0.9.3" 4509 + version = "0.9.8" 4114 4510 source = "registry+https://github.com/rust-lang/crates.io-index" 4115 - checksum = "e06723639aaded957e5a80be250c1f82f274b9d23ebb4d94163668470623461c" 4511 + checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" 4116 4512 dependencies = [ 4117 - "indexmap 2.10.0", 4118 - "serde", 4119 - "serde_spanned 1.0.0", 4120 - "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", 4121 4517 "toml_parser", 4122 4518 "toml_writer", 4123 - "winnow 0.7.12", 4519 + "winnow 0.7.13", 4124 4520 ] 4125 4521 4126 4522 [[package]] 4127 4523 name = "toml_datetime" 4128 - version = "0.6.11" 4524 + version = "0.6.3" 4129 4525 source = "registry+https://github.com/rust-lang/crates.io-index" 4130 - checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" 4526 + checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" 4131 4527 dependencies = [ 4132 4528 "serde", 4133 4529 ] 4134 4530 4135 4531 [[package]] 4136 4532 name = "toml_datetime" 4137 - version = "0.7.0" 4533 + version = "0.7.3" 4138 4534 source = "registry+https://github.com/rust-lang/crates.io-index" 4139 - checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" 4535 + checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" 4140 4536 dependencies = [ 4141 - "serde", 4537 + "serde_core", 4142 4538 ] 4143 4539 4144 4540 [[package]] ··· 4147 4543 source = "registry+https://github.com/rust-lang/crates.io-index" 4148 4544 checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" 4149 4545 dependencies = [ 4150 - "indexmap 2.10.0", 4151 - "toml_datetime 0.6.11", 4546 + "indexmap 2.12.0", 4547 + "toml_datetime 0.6.3", 4152 4548 "winnow 0.5.40", 4153 4549 ] 4154 4550 4155 4551 [[package]] 4156 4552 name = "toml_edit" 4157 - version = "0.20.7" 4553 + version = "0.20.2" 4158 4554 source = "registry+https://github.com/rust-lang/crates.io-index" 4159 - checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" 4555 + checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" 4160 4556 dependencies = [ 4161 - "indexmap 2.10.0", 4162 - "toml_datetime 0.6.11", 4557 + "indexmap 2.12.0", 4558 + "serde", 4559 + "serde_spanned 0.6.9", 4560 + "toml_datetime 0.6.3", 4163 4561 "winnow 0.5.40", 4164 4562 ] 4165 4563 4166 4564 [[package]] 4167 4565 name = "toml_edit" 4168 - version = "0.22.27" 4566 + version = "0.23.7" 4169 4567 source = "registry+https://github.com/rust-lang/crates.io-index" 4170 - checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" 4568 + checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" 4171 4569 dependencies = [ 4172 - "indexmap 2.10.0", 4173 - "serde", 4174 - "serde_spanned 0.6.9", 4175 - "toml_datetime 0.6.11", 4176 - "toml_write", 4177 - "winnow 0.7.12", 4570 + "indexmap 2.12.0", 4571 + "toml_datetime 0.7.3", 4572 + "toml_parser", 4573 + "winnow 0.7.13", 4178 4574 ] 4179 4575 4180 4576 [[package]] 4181 4577 name = "toml_parser" 4182 - version = "1.0.1" 4578 + version = "1.0.4" 4183 4579 source = "registry+https://github.com/rust-lang/crates.io-index" 4184 - checksum = "97200572db069e74c512a14117b296ba0a80a30123fbbb5aa1f4a348f639ca30" 4580 + checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" 4185 4581 dependencies = [ 4186 - "winnow 0.7.12", 4582 + "winnow 0.7.13", 4187 4583 ] 4188 4584 4189 4585 [[package]] 4190 - name = "toml_write" 4191 - version = "0.1.2" 4192 - source = "registry+https://github.com/rust-lang/crates.io-index" 4193 - checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" 4194 - 4195 - [[package]] 4196 4586 name = "toml_writer" 4197 - version = "1.0.2" 4587 + version = "1.0.4" 4198 4588 source = "registry+https://github.com/rust-lang/crates.io-index" 4199 - checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" 4589 + checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" 4200 4590 4201 4591 [[package]] 4202 4592 name = "tower" ··· 4219 4609 source = "registry+https://github.com/rust-lang/crates.io-index" 4220 4610 checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" 4221 4611 dependencies = [ 4222 - "bitflags 2.9.1", 4612 + "bitflags 2.10.0", 4223 4613 "bytes", 4224 4614 "futures-util", 4225 4615 "http", ··· 4262 4652 dependencies = [ 4263 4653 "proc-macro2", 4264 4654 "quote", 4265 - "syn 2.0.104", 4655 + "syn 2.0.109", 4266 4656 ] 4267 4657 4268 4658 [[package]] ··· 4276 4666 4277 4667 [[package]] 4278 4668 name = "tray-icon" 4279 - version = "0.21.0" 4669 + version = "0.21.2" 4280 4670 source = "registry+https://github.com/rust-lang/crates.io-index" 4281 - checksum = "2da75ec677957aa21f6e0b361df0daab972f13a5bee3606de0638fd4ee1c666a" 4671 + checksum = "e3d5572781bee8e3f994d7467084e1b1fd7a93ce66bd480f8156ba89dee55a2b" 4282 4672 dependencies = [ 4283 4673 "crossbeam-channel", 4284 4674 "dirs", 4285 4675 "libappindicator", 4286 4676 "muda", 4287 - "objc2 0.6.1", 4677 + "objc2 0.6.3", 4288 4678 "objc2-app-kit", 4289 4679 "objc2-core-foundation", 4290 4680 "objc2-core-graphics", 4291 - "objc2-foundation 0.3.1", 4681 + "objc2-foundation 0.3.2", 4292 4682 "once_cell", 4293 - "png", 4683 + "png 0.17.16", 4294 4684 "serde", 4295 - "thiserror 2.0.12", 4296 - "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", 4297 4698 ] 4298 4699 4299 4700 [[package]] ··· 4310 4711 4311 4712 [[package]] 4312 4713 name = "typenum" 4313 - version = "1.18.0" 4714 + version = "1.19.0" 4314 4715 source = "registry+https://github.com/rust-lang/crates.io-index" 4315 - checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 4716 + checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" 4316 4717 4317 4718 [[package]] 4318 4719 name = "uds_windows" ··· 4368 4769 4369 4770 [[package]] 4370 4771 name = "unicode-ident" 4371 - version = "1.0.18" 4772 + version = "1.0.22" 4372 4773 source = "registry+https://github.com/rust-lang/crates.io-index" 4373 - checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 4774 + checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" 4374 4775 4375 4776 [[package]] 4376 4777 name = "unicode-segmentation" ··· 4380 4781 4381 4782 [[package]] 4382 4783 name = "url" 4383 - version = "2.5.4" 4784 + version = "2.5.7" 4384 4785 source = "registry+https://github.com/rust-lang/crates.io-index" 4385 - checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 4786 + checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" 4386 4787 dependencies = [ 4387 4788 "form_urlencoded", 4388 4789 "idna", ··· 4416 4817 4417 4818 [[package]] 4418 4819 name = "uuid" 4419 - version = "1.17.0" 4820 + version = "1.18.1" 4420 4821 source = "registry+https://github.com/rust-lang/crates.io-index" 4421 - checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" 4822 + checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" 4422 4823 dependencies = [ 4423 - "getrandom 0.3.3", 4824 + "getrandom 0.3.4", 4424 4825 "js-sys", 4425 4826 "serde", 4426 4827 "wasm-bindgen", ··· 4428 4829 4429 4830 [[package]] 4430 4831 name = "version-compare" 4431 - version = "0.2.0" 4832 + version = "0.2.1" 4432 4833 source = "registry+https://github.com/rust-lang/crates.io-index" 4433 - checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" 4834 + checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" 4434 4835 4435 4836 [[package]] 4436 4837 name = "version_check" ··· 4490 4891 checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 4491 4892 4492 4893 [[package]] 4493 - name = "wasi" 4494 - version = "0.14.2+wasi-0.2.4" 4894 + name = "wasip2" 4895 + version = "1.0.1+wasi-0.2.4" 4495 4896 source = "registry+https://github.com/rust-lang/crates.io-index" 4496 - checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 4897 + checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" 4497 4898 dependencies = [ 4498 - "wit-bindgen-rt", 4899 + "wit-bindgen", 4499 4900 ] 4500 4901 4501 4902 [[package]] 4502 4903 name = "wasm-bindgen" 4503 - version = "0.2.100" 4904 + version = "0.2.105" 4504 4905 source = "registry+https://github.com/rust-lang/crates.io-index" 4505 - checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 4906 + checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" 4506 4907 dependencies = [ 4507 4908 "cfg-if", 4508 4909 "once_cell", 4509 4910 "rustversion", 4510 4911 "wasm-bindgen-macro", 4511 - ] 4512 - 4513 - [[package]] 4514 - name = "wasm-bindgen-backend" 4515 - version = "0.2.100" 4516 - source = "registry+https://github.com/rust-lang/crates.io-index" 4517 - checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 4518 - dependencies = [ 4519 - "bumpalo", 4520 - "log", 4521 - "proc-macro2", 4522 - "quote", 4523 - "syn 2.0.104", 4524 4912 "wasm-bindgen-shared", 4525 4913 ] 4526 4914 4527 4915 [[package]] 4528 4916 name = "wasm-bindgen-futures" 4529 - version = "0.4.50" 4917 + version = "0.4.55" 4530 4918 source = "registry+https://github.com/rust-lang/crates.io-index" 4531 - checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 4919 + checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" 4532 4920 dependencies = [ 4533 4921 "cfg-if", 4534 4922 "js-sys", ··· 4539 4927 4540 4928 [[package]] 4541 4929 name = "wasm-bindgen-macro" 4542 - version = "0.2.100" 4930 + version = "0.2.105" 4543 4931 source = "registry+https://github.com/rust-lang/crates.io-index" 4544 - checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 4932 + checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" 4545 4933 dependencies = [ 4546 4934 "quote", 4547 4935 "wasm-bindgen-macro-support", ··· 4549 4937 4550 4938 [[package]] 4551 4939 name = "wasm-bindgen-macro-support" 4552 - version = "0.2.100" 4940 + version = "0.2.105" 4553 4941 source = "registry+https://github.com/rust-lang/crates.io-index" 4554 - checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 4942 + checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" 4555 4943 dependencies = [ 4944 + "bumpalo", 4556 4945 "proc-macro2", 4557 4946 "quote", 4558 - "syn 2.0.104", 4559 - "wasm-bindgen-backend", 4947 + "syn 2.0.109", 4560 4948 "wasm-bindgen-shared", 4561 4949 ] 4562 4950 4563 4951 [[package]] 4564 4952 name = "wasm-bindgen-shared" 4565 - version = "0.2.100" 4953 + version = "0.2.105" 4566 4954 source = "registry+https://github.com/rust-lang/crates.io-index" 4567 - checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 4955 + checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" 4568 4956 dependencies = [ 4569 4957 "unicode-ident", 4570 4958 ] ··· 4590 4978 dependencies = [ 4591 4979 "cc", 4592 4980 "downcast-rs", 4593 - "rustix", 4981 + "rustix 1.1.2", 4594 4982 "scoped-tls", 4595 4983 "smallvec", 4596 4984 "wayland-sys", ··· 4602 4990 source = "registry+https://github.com/rust-lang/crates.io-index" 4603 4991 checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" 4604 4992 dependencies = [ 4605 - "bitflags 2.9.1", 4606 - "rustix", 4993 + "bitflags 2.10.0", 4994 + "rustix 1.1.2", 4607 4995 "wayland-backend", 4608 4996 "wayland-scanner", 4609 4997 ] ··· 4614 5002 source = "registry+https://github.com/rust-lang/crates.io-index" 4615 5003 checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" 4616 5004 dependencies = [ 4617 - "bitflags 2.9.1", 5005 + "bitflags 2.10.0", 5006 + "wayland-backend", 5007 + "wayland-client", 5008 + "wayland-scanner", 5009 + ] 5010 + 5011 + [[package]] 5012 + name = "wayland-protocols-wlr" 5013 + version = "0.3.9" 5014 + source = "registry+https://github.com/rust-lang/crates.io-index" 5015 + checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec" 5016 + dependencies = [ 5017 + "bitflags 2.10.0", 4618 5018 "wayland-backend", 4619 5019 "wayland-client", 5020 + "wayland-protocols", 4620 5021 "wayland-scanner", 4621 5022 ] 4622 5023 ··· 4644 5045 4645 5046 [[package]] 4646 5047 name = "web-sys" 4647 - version = "0.3.77" 5048 + version = "0.3.82" 4648 5049 source = "registry+https://github.com/rust-lang/crates.io-index" 4649 - checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 5050 + checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" 4650 5051 dependencies = [ 4651 5052 "js-sys", 4652 5053 "wasm-bindgen", ··· 4705 5106 "webview2-com-macros", 4706 5107 "webview2-com-sys", 4707 5108 "windows", 4708 - "windows-core", 5109 + "windows-core 0.61.2", 4709 5110 "windows-implement", 4710 5111 "windows-interface", 4711 5112 ] ··· 4718 5119 dependencies = [ 4719 5120 "proc-macro2", 4720 5121 "quote", 4721 - "syn 2.0.104", 5122 + "syn 2.0.109", 4722 5123 ] 4723 5124 4724 5125 [[package]] ··· 4727 5128 source = "registry+https://github.com/rust-lang/crates.io-index" 4728 5129 checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" 4729 5130 dependencies = [ 4730 - "thiserror 2.0.12", 5131 + "thiserror 2.0.17", 4731 5132 "windows", 4732 - "windows-core", 5133 + "windows-core 0.61.2", 4733 5134 ] 4734 5135 4735 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]] 4736 5143 name = "winapi" 4737 5144 version = "0.3.9" 4738 5145 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4750 5157 4751 5158 [[package]] 4752 5159 name = "winapi-util" 4753 - version = "0.1.9" 5160 + version = "0.1.11" 4754 5161 source = "registry+https://github.com/rust-lang/crates.io-index" 4755 - checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 5162 + checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" 4756 5163 dependencies = [ 4757 - "windows-sys 0.59.0", 5164 + "windows-sys 0.61.2", 4758 5165 ] 4759 5166 4760 5167 [[package]] ··· 4769 5176 source = "registry+https://github.com/rust-lang/crates.io-index" 4770 5177 checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" 4771 5178 dependencies = [ 4772 - "objc2 0.6.1", 5179 + "objc2 0.6.3", 4773 5180 "objc2-app-kit", 4774 5181 "objc2-core-foundation", 4775 - "objc2-foundation 0.3.1", 5182 + "objc2-foundation 0.3.2", 4776 5183 "raw-window-handle", 4777 5184 "windows-sys 0.59.0", 4778 5185 "windows-version", ··· 4785 5192 checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" 4786 5193 dependencies = [ 4787 5194 "windows-collections", 4788 - "windows-core", 5195 + "windows-core 0.61.2", 4789 5196 "windows-future", 4790 - "windows-link", 5197 + "windows-link 0.1.3", 4791 5198 "windows-numerics", 4792 5199 ] 4793 5200 ··· 4797 5204 source = "registry+https://github.com/rust-lang/crates.io-index" 4798 5205 checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" 4799 5206 dependencies = [ 4800 - "windows-core", 5207 + "windows-core 0.61.2", 4801 5208 ] 4802 5209 4803 5210 [[package]] ··· 4808 5215 dependencies = [ 4809 5216 "windows-implement", 4810 5217 "windows-interface", 4811 - "windows-link", 4812 - "windows-result", 4813 - "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", 4814 5234 ] 4815 5235 4816 5236 [[package]] ··· 4819 5239 source = "registry+https://github.com/rust-lang/crates.io-index" 4820 5240 checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" 4821 5241 dependencies = [ 4822 - "windows-core", 4823 - "windows-link", 5242 + "windows-core 0.61.2", 5243 + "windows-link 0.1.3", 4824 5244 "windows-threading", 4825 5245 ] 4826 5246 4827 5247 [[package]] 4828 5248 name = "windows-implement" 4829 - version = "0.60.0" 5249 + version = "0.60.2" 4830 5250 source = "registry+https://github.com/rust-lang/crates.io-index" 4831 - checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" 5251 + checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" 4832 5252 dependencies = [ 4833 5253 "proc-macro2", 4834 5254 "quote", 4835 - "syn 2.0.104", 5255 + "syn 2.0.109", 4836 5256 ] 4837 5257 4838 5258 [[package]] 4839 5259 name = "windows-interface" 4840 - version = "0.59.1" 5260 + version = "0.59.3" 4841 5261 source = "registry+https://github.com/rust-lang/crates.io-index" 4842 - checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" 5262 + checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" 4843 5263 dependencies = [ 4844 5264 "proc-macro2", 4845 5265 "quote", 4846 - "syn 2.0.104", 5266 + "syn 2.0.109", 4847 5267 ] 4848 5268 4849 5269 [[package]] ··· 4853 5273 checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 4854 5274 4855 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]] 4856 5282 name = "windows-numerics" 4857 5283 version = "0.2.0" 4858 5284 source = "registry+https://github.com/rust-lang/crates.io-index" 4859 5285 checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" 4860 5286 dependencies = [ 4861 - "windows-core", 4862 - "windows-link", 5287 + "windows-core 0.61.2", 5288 + "windows-link 0.1.3", 4863 5289 ] 4864 5290 4865 5291 [[package]] ··· 4868 5294 source = "registry+https://github.com/rust-lang/crates.io-index" 4869 5295 checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" 4870 5296 dependencies = [ 4871 - "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", 4872 5307 ] 4873 5308 4874 5309 [[package]] ··· 4877 5312 source = "registry+https://github.com/rust-lang/crates.io-index" 4878 5313 checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" 4879 5314 dependencies = [ 4880 - "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", 4881 5325 ] 4882 5326 4883 5327 [[package]] ··· 4904 5348 source = "registry+https://github.com/rust-lang/crates.io-index" 4905 5349 checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 4906 5350 dependencies = [ 4907 - "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", 4908 5361 ] 4909 5362 4910 5363 [[package]] ··· 4940 5393 4941 5394 [[package]] 4942 5395 name = "windows-targets" 4943 - version = "0.53.3" 5396 + version = "0.53.5" 4944 5397 source = "registry+https://github.com/rust-lang/crates.io-index" 4945 - checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" 5398 + checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" 4946 5399 dependencies = [ 4947 - "windows-link", 4948 - "windows_aarch64_gnullvm 0.53.0", 4949 - "windows_aarch64_msvc 0.53.0", 4950 - "windows_i686_gnu 0.53.0", 4951 - "windows_i686_gnullvm 0.53.0", 4952 - "windows_i686_msvc 0.53.0", 4953 - "windows_x86_64_gnu 0.53.0", 4954 - "windows_x86_64_gnullvm 0.53.0", 4955 - "windows_x86_64_msvc 0.53.0", 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", 4956 5409 ] 4957 5410 4958 5411 [[package]] ··· 4961 5414 source = "registry+https://github.com/rust-lang/crates.io-index" 4962 5415 checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" 4963 5416 dependencies = [ 4964 - "windows-link", 5417 + "windows-link 0.1.3", 4965 5418 ] 4966 5419 4967 5420 [[package]] 4968 5421 name = "windows-version" 4969 - version = "0.1.4" 5422 + version = "0.1.7" 4970 5423 source = "registry+https://github.com/rust-lang/crates.io-index" 4971 - checksum = "e04a5c6627e310a23ad2358483286c7df260c964eb2d003d8efd6d0f4e79265c" 5424 + checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" 4972 5425 dependencies = [ 4973 - "windows-link", 5426 + "windows-link 0.2.1", 4974 5427 ] 4975 5428 4976 5429 [[package]] ··· 4987 5440 4988 5441 [[package]] 4989 5442 name = "windows_aarch64_gnullvm" 4990 - version = "0.53.0" 5443 + version = "0.53.1" 4991 5444 source = "registry+https://github.com/rust-lang/crates.io-index" 4992 - checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 5445 + checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" 4993 5446 4994 5447 [[package]] 4995 5448 name = "windows_aarch64_msvc" ··· 5005 5458 5006 5459 [[package]] 5007 5460 name = "windows_aarch64_msvc" 5008 - version = "0.53.0" 5461 + version = "0.53.1" 5009 5462 source = "registry+https://github.com/rust-lang/crates.io-index" 5010 - checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 5463 + checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" 5011 5464 5012 5465 [[package]] 5013 5466 name = "windows_i686_gnu" ··· 5023 5476 5024 5477 [[package]] 5025 5478 name = "windows_i686_gnu" 5026 - version = "0.53.0" 5479 + version = "0.53.1" 5027 5480 source = "registry+https://github.com/rust-lang/crates.io-index" 5028 - checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 5481 + checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" 5029 5482 5030 5483 [[package]] 5031 5484 name = "windows_i686_gnullvm" ··· 5035 5488 5036 5489 [[package]] 5037 5490 name = "windows_i686_gnullvm" 5038 - version = "0.53.0" 5491 + version = "0.53.1" 5039 5492 source = "registry+https://github.com/rust-lang/crates.io-index" 5040 - checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 5493 + checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" 5041 5494 5042 5495 [[package]] 5043 5496 name = "windows_i686_msvc" ··· 5053 5506 5054 5507 [[package]] 5055 5508 name = "windows_i686_msvc" 5056 - version = "0.53.0" 5509 + version = "0.53.1" 5057 5510 source = "registry+https://github.com/rust-lang/crates.io-index" 5058 - checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 5511 + checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" 5059 5512 5060 5513 [[package]] 5061 5514 name = "windows_x86_64_gnu" ··· 5071 5524 5072 5525 [[package]] 5073 5526 name = "windows_x86_64_gnu" 5074 - version = "0.53.0" 5527 + version = "0.53.1" 5075 5528 source = "registry+https://github.com/rust-lang/crates.io-index" 5076 - checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 5529 + checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" 5077 5530 5078 5531 [[package]] 5079 5532 name = "windows_x86_64_gnullvm" ··· 5089 5542 5090 5543 [[package]] 5091 5544 name = "windows_x86_64_gnullvm" 5092 - version = "0.53.0" 5545 + version = "0.53.1" 5093 5546 source = "registry+https://github.com/rust-lang/crates.io-index" 5094 - checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 5547 + checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" 5095 5548 5096 5549 [[package]] 5097 5550 name = "windows_x86_64_msvc" ··· 5107 5560 5108 5561 [[package]] 5109 5562 name = "windows_x86_64_msvc" 5110 - version = "0.53.0" 5563 + version = "0.53.1" 5111 5564 source = "registry+https://github.com/rust-lang/crates.io-index" 5112 - checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 5565 + checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" 5113 5566 5114 5567 [[package]] 5115 5568 name = "winnow" ··· 5122 5575 5123 5576 [[package]] 5124 5577 name = "winnow" 5125 - version = "0.7.12" 5578 + version = "0.7.13" 5126 5579 source = "registry+https://github.com/rust-lang/crates.io-index" 5127 - checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" 5580 + checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" 5128 5581 dependencies = [ 5129 5582 "memchr", 5130 5583 ] ··· 5140 5593 ] 5141 5594 5142 5595 [[package]] 5143 - name = "wit-bindgen-rt" 5144 - version = "0.39.0" 5596 + name = "wit-bindgen" 5597 + version = "0.46.0" 5145 5598 source = "registry+https://github.com/rust-lang/crates.io-index" 5146 - 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" 5147 5606 dependencies = [ 5148 - "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", 5149 5618 ] 5150 5619 5151 5620 [[package]] 5152 5621 name = "writeable" 5153 - version = "0.6.1" 5622 + version = "0.6.2" 5154 5623 source = "registry+https://github.com/rust-lang/crates.io-index" 5155 - checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 5624 + checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" 5156 5625 5157 5626 [[package]] 5158 5627 name = "wry" 5159 - version = "0.52.1" 5628 + version = "0.53.5" 5160 5629 source = "registry+https://github.com/rust-lang/crates.io-index" 5161 - checksum = "12a714d9ba7075aae04a6e50229d6109e3d584774b99a6a8c60de1698ca111b9" 5630 + checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2" 5162 5631 dependencies = [ 5163 5632 "base64 0.22.1", 5164 - "block2 0.6.1", 5633 + "block2 0.6.2", 5165 5634 "cookie", 5166 5635 "crossbeam-channel", 5636 + "dirs", 5167 5637 "dpi", 5168 5638 "dunce", 5169 5639 "gdkx11", ··· 5175 5645 "kuchikiki", 5176 5646 "libc", 5177 5647 "ndk", 5178 - "objc2 0.6.1", 5648 + "objc2 0.6.3", 5179 5649 "objc2-app-kit", 5180 5650 "objc2-core-foundation", 5181 - "objc2-foundation 0.3.1", 5651 + "objc2-foundation 0.3.2", 5182 5652 "objc2-ui-kit", 5183 5653 "objc2-web-kit", 5184 5654 "once_cell", ··· 5187 5657 "sha2", 5188 5658 "soup3", 5189 5659 "tao-macros", 5190 - "thiserror 2.0.12", 5660 + "thiserror 2.0.17", 5191 5661 "url", 5192 5662 "webkit2gtk", 5193 5663 "webkit2gtk-sys", 5194 5664 "webview2-com", 5195 5665 "windows", 5196 - "windows-core", 5666 + "windows-core 0.61.2", 5197 5667 "windows-version", 5198 5668 "x11-dl", 5199 5669 ] ··· 5220 5690 ] 5221 5691 5222 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]] 5223 5727 name = "yoke" 5224 - version = "0.8.0" 5728 + version = "0.8.1" 5225 5729 source = "registry+https://github.com/rust-lang/crates.io-index" 5226 - checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 5730 + checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" 5227 5731 dependencies = [ 5228 - "serde", 5229 5732 "stable_deref_trait", 5230 5733 "yoke-derive", 5231 5734 "zerofrom", ··· 5233 5736 5234 5737 [[package]] 5235 5738 name = "yoke-derive" 5236 - version = "0.8.0" 5739 + version = "0.8.1" 5237 5740 source = "registry+https://github.com/rust-lang/crates.io-index" 5238 - checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 5741 + checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" 5239 5742 dependencies = [ 5240 5743 "proc-macro2", 5241 5744 "quote", 5242 - "syn 2.0.104", 5745 + "syn 2.0.109", 5243 5746 "synstructure", 5244 5747 ] 5245 5748 5246 5749 [[package]] 5247 5750 name = "zbus" 5248 - version = "5.9.0" 5751 + version = "5.12.0" 5249 5752 source = "registry+https://github.com/rust-lang/crates.io-index" 5250 - checksum = "4bb4f9a464286d42851d18a605f7193b8febaf5b0919d71c6399b7b26e5b0aad" 5753 + checksum = "b622b18155f7a93d1cd2dc8c01d2d6a44e08fb9ebb7b3f9e6ed101488bad6c91" 5251 5754 dependencies = [ 5252 5755 "async-broadcast", 5253 5756 "async-executor", ··· 5270 5773 "tokio", 5271 5774 "tracing", 5272 5775 "uds_windows", 5273 - "windows-sys 0.59.0", 5274 - "winnow 0.7.12", 5776 + "uuid", 5777 + "windows-sys 0.61.2", 5778 + "winnow 0.7.13", 5275 5779 "zbus_macros", 5276 5780 "zbus_names", 5277 5781 "zvariant", ··· 5279 5783 5280 5784 [[package]] 5281 5785 name = "zbus_macros" 5282 - version = "5.9.0" 5786 + version = "5.12.0" 5283 5787 source = "registry+https://github.com/rust-lang/crates.io-index" 5284 - checksum = "ef9859f68ee0c4ee2e8cde84737c78e3f4c54f946f2a38645d0d4c7a95327659" 5788 + checksum = "1cdb94821ca8a87ca9c298b5d1cbd80e2a8b67115d99f6e4551ac49e42b6a314" 5285 5789 dependencies = [ 5286 - "proc-macro-crate 3.3.0", 5790 + "proc-macro-crate 3.4.0", 5287 5791 "proc-macro2", 5288 5792 "quote", 5289 - "syn 2.0.104", 5793 + "syn 2.0.109", 5290 5794 "zbus_names", 5291 5795 "zvariant", 5292 5796 "zvariant_utils", ··· 5300 5804 dependencies = [ 5301 5805 "serde", 5302 5806 "static_assertions", 5303 - "winnow 0.7.12", 5807 + "winnow 0.7.13", 5304 5808 "zvariant", 5305 5809 ] 5306 5810 5307 5811 [[package]] 5308 5812 name = "zerocopy" 5309 - version = "0.8.26" 5813 + version = "0.8.27" 5310 5814 source = "registry+https://github.com/rust-lang/crates.io-index" 5311 - checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" 5815 + checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" 5312 5816 dependencies = [ 5313 5817 "zerocopy-derive", 5314 5818 ] 5315 5819 5316 5820 [[package]] 5317 5821 name = "zerocopy-derive" 5318 - version = "0.8.26" 5822 + version = "0.8.27" 5319 5823 source = "registry+https://github.com/rust-lang/crates.io-index" 5320 - checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" 5824 + checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" 5321 5825 dependencies = [ 5322 5826 "proc-macro2", 5323 5827 "quote", 5324 - "syn 2.0.104", 5828 + "syn 2.0.109", 5325 5829 ] 5326 5830 5327 5831 [[package]] ··· 5341 5845 dependencies = [ 5342 5846 "proc-macro2", 5343 5847 "quote", 5344 - "syn 2.0.104", 5848 + "syn 2.0.109", 5345 5849 "synstructure", 5346 5850 ] 5347 5851 5348 5852 [[package]] 5349 5853 name = "zerotrie" 5350 - version = "0.2.2" 5854 + version = "0.2.3" 5351 5855 source = "registry+https://github.com/rust-lang/crates.io-index" 5352 - checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 5856 + checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" 5353 5857 dependencies = [ 5354 5858 "displaydoc", 5355 5859 "yoke", ··· 5358 5862 5359 5863 [[package]] 5360 5864 name = "zerovec" 5361 - version = "0.11.2" 5865 + version = "0.11.5" 5362 5866 source = "registry+https://github.com/rust-lang/crates.io-index" 5363 - checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" 5867 + checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" 5364 5868 dependencies = [ 5365 5869 "yoke", 5366 5870 "zerofrom", ··· 5369 5873 5370 5874 [[package]] 5371 5875 name = "zerovec-derive" 5372 - version = "0.11.1" 5876 + version = "0.11.2" 5373 5877 source = "registry+https://github.com/rust-lang/crates.io-index" 5374 - checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 5878 + checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" 5375 5879 dependencies = [ 5376 5880 "proc-macro2", 5377 5881 "quote", 5378 - "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", 5379 5898 ] 5380 5899 5381 5900 [[package]] 5382 5901 name = "zvariant" 5383 - version = "5.6.0" 5902 + version = "5.8.0" 5384 5903 source = "registry+https://github.com/rust-lang/crates.io-index" 5385 - checksum = "d91b3680bb339216abd84714172b5138a4edac677e641ef17e1d8cb1b3ca6e6f" 5904 + checksum = "2be61892e4f2b1772727be11630a62664a1826b62efa43a6fe7449521cb8744c" 5386 5905 dependencies = [ 5387 5906 "endi", 5388 5907 "enumflags2", 5389 5908 "serde", 5390 5909 "url", 5391 - "winnow 0.7.12", 5910 + "winnow 0.7.13", 5392 5911 "zvariant_derive", 5393 5912 "zvariant_utils", 5394 5913 ] 5395 5914 5396 5915 [[package]] 5397 5916 name = "zvariant_derive" 5398 - version = "5.6.0" 5917 + version = "5.8.0" 5399 5918 source = "registry+https://github.com/rust-lang/crates.io-index" 5400 - checksum = "3a8c68501be459a8dbfffbe5d792acdd23b4959940fc87785fb013b32edbc208" 5919 + checksum = "da58575a1b2b20766513b1ec59d8e2e68db2745379f961f86650655e862d2006" 5401 5920 dependencies = [ 5402 - "proc-macro-crate 3.3.0", 5921 + "proc-macro-crate 3.4.0", 5403 5922 "proc-macro2", 5404 5923 "quote", 5405 - "syn 2.0.104", 5924 + "syn 2.0.109", 5406 5925 "zvariant_utils", 5407 5926 ] 5408 5927 5409 5928 [[package]] 5410 5929 name = "zvariant_utils" 5411 - version = "3.2.0" 5930 + version = "3.2.1" 5412 5931 source = "registry+https://github.com/rust-lang/crates.io-index" 5413 - checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" 5932 + checksum = "c6949d142f89f6916deca2232cf26a8afacf2b9fdc35ce766105e104478be599" 5414 5933 dependencies = [ 5415 5934 "proc-macro2", 5416 5935 "quote", 5417 5936 "serde", 5418 - "static_assertions", 5419 - "syn 2.0.104", 5420 - "winnow 0.7.12", 5937 + "syn 2.0.109", 5938 + "winnow 0.7.13", 5421 5939 ]
+12 -5
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" 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" 30 37
+5 -1
src-tauri/capabilities/default.json
··· 7 7 ], 8 8 "permissions": [ 9 9 "core:default", 10 + "core:window:allow-destroy", 10 11 "opener:default", 11 - "dialog:default" 12 + "dialog:default", 13 + "clipboard-manager:allow-read-text", 14 + "clipboard-manager:allow-write-text", 15 + "os:default" 12 16 ] 13 17 }
+9
src-tauri/src/frontend_calls/close_app.rs
··· 1 + use tauri::State; 2 + 3 + use crate::utils::config::Config; 4 + 5 + #[tauri::command] 6 + pub fn close_app(conf: State<Config>) { 7 + conf.save(); 8 + std::process::exit(0); 9 + }
+20
src-tauri/src/frontend_calls/load_previous_tabs.rs
··· 1 + use std::collections::HashMap; 2 + 3 + use tauri::{State, Window}; 4 + 5 + use crate::{structs::nodes::Node, utils::config::Config}; 6 + 7 + #[tauri::command] 8 + pub fn load_previous_tabs( 9 + window: Window, 10 + conf: State<Config>, 11 + ) -> HashMap<String, (Vec<Node>, String, Option<String>, bool)> { 12 + let config = conf.store.lock().unwrap(); 13 + 14 + if !config.hide_editor_on_start { 15 + window.show().unwrap(); 16 + } 17 + 18 + let tabs = config.loaded_tabs.clone(); 19 + tabs 20 + }
+4 -1
src-tauri/src/frontend_calls/mod.rs
··· 1 + pub mod close_app; 1 2 pub mod get_addresses; 3 + pub mod load_previous_tabs; 2 4 pub mod save_graph; 3 - pub mod sync_tab; 5 + pub mod settings; 6 + pub mod sync_tab;
+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 + }
+26 -7
src-tauri/src/frontend_calls/sync_tab.rs
··· 1 - use std::sync::mpsc::Sender; 1 + use chrono::Utc; 2 + use crossbeam_channel::Sender; 2 3 3 4 use tauri::State; 4 5 5 - use crate::{ runtime::commands::RuntimeCommand, structs::nodes::Node }; 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, cmd: State<Sender<RuntimeCommand>> ) { 9 - cmd.send(RuntimeCommand::AddTab(graph, id)).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(); 21 + 22 + let mut config = conf.store.lock().unwrap(); 23 + config.loaded_tabs.insert(id, (graph, name, location, save_state)); 24 + 25 + conf.save_prelocked(config); 10 26 } 11 27 12 28 #[tauri::command] 13 - pub fn discard_tab( id: String, cmd: State<Sender<RuntimeCommand>> ) { 14 - cmd.send(RuntimeCommand::RemoveTab(id)).unwrap(); 15 - } 29 + pub fn discard_tab(id: String, cmd: State<Sender<RuntimeCommand>>, conf: State<Config>) { 30 + cmd.send(RuntimeCommand::RemoveTab(id.clone())).unwrap(); 31 + 32 + let mut config = conf.store.lock().unwrap(); 33 + config.loaded_tabs.remove(&id); 34 + }
+17 -8
src-tauri/src/lib.rs
··· 1 - use std::{collections::HashMap, fs, sync::{self, Arc, Mutex}}; 1 + use std::{fs, sync::Mutex}; 2 2 3 + use crossbeam_channel::bounded; 3 4 use frontend_calls::*; 4 5 5 - use crate::{ osc::OSCMessage, runtime::nodes::RuntimeNodeTree, setup::setup, utils::config::Config }; 6 + use crate::{osc::OSCMessage, setup::setup, utils::{config::Config, vrchat_builtin_parameters}}; 6 7 7 8 mod frontend_calls; 8 9 mod osc; 10 + mod runtime; 9 11 mod setup; 10 12 mod structs; 11 13 mod utils; 12 - mod runtime; 13 14 14 15 #[cfg_attr(mobile, tauri::mobile_entry_point)] 15 16 #[tokio::main] ··· 19 20 match fs::metadata(&container_folder) { 20 21 Ok(meta) => { 21 22 if meta.is_file() { 22 - panic!( 23 - "document.write('Cannot launch app as the container path is a file not a directory')" 24 - ); 23 + panic!("Cannot launch app as the container path is a file not a directory"); 25 24 } 26 25 } 27 26 Err(_) => { ··· 34 33 35 34 static ADDRESSES: Mutex<Vec<OSCMessage>> = Mutex::new(Vec::new()); 36 35 37 - let ( runtime_sender, runtime_receiver ) = sync::mpsc::channel(); 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); 38 41 39 42 tauri::Builder::default() 43 + .plugin(tauri_plugin_os::init()) 44 + .plugin(tauri_plugin_clipboard_manager::init()) 40 45 .plugin(tauri_plugin_dialog::init()) 41 46 .plugin(tauri_plugin_opener::init()) 42 47 .invoke_handler(tauri::generate_handler![ 43 48 get_addresses::get_addresses, 44 49 save_graph::save_graph, 45 50 sync_tab::sync_tab, 46 - sync_tab::discard_tab 51 + sync_tab::discard_tab, 52 + load_previous_tabs::load_previous_tabs, 53 + close_app::close_app, 54 + settings::set_hide_editor_on_app_start, 55 + settings::get_hide_editor_on_app_start, 47 56 ]) 48 57 .manage(conf) 49 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 }
+2 -3
src-tauri/src/osc.rs
··· 1 1 // https://gist.github.com/phaze-the-dumb/634daacb5141eae2f846e20987dba7a8 2 - 3 - use std::{net::UdpSocket, sync::mpsc::Sender}; 2 + use std::net::UdpSocket; 4 3 4 + use crossbeam_channel::Sender; 5 5 use serde::Serialize; 6 6 7 7 use crate::structs::parameter_types::ParameterType; ··· 160 160 } 161 161 } 162 162 163 - println!("{:X?}", &buf); 164 163 socket.send_to(&buf, ip_addr).unwrap(); 165 164 }
+5 -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 - pub enum RuntimeCommand{ 3 + #[derive(Debug)] 4 + pub enum RuntimeCommand { 4 5 OSCMessage(OSCMessage), 5 6 6 7 AddTab(Vec<Node>, String), 7 - RemoveTab(String) 8 - } 8 + RemoveTab(String), 9 + }
+51
src-tauri/src/runtime/nodes/conditional/ifequal.rs
··· 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 5 + 6 + pub struct ConditionalIfEqual { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 9 + } 10 + 11 + impl ConditionalIfEqual { 12 + pub fn new(node: Node) -> Box<Self> { 13 + Box::new(Self { 14 + outputs: node.outputs.iter().map(|x| { 15 + x.connections.iter() 16 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 17 + 18 + inputs: node.inputs.iter().map(|x| { 19 + let y = x.connections.get(0); 20 + if let Some(y) = y{ 21 + Some((y.node.clone(), y.index, y.value_type)) 22 + } else{ 23 + None 24 + } 25 + }).collect(), 26 + }) 27 + } 28 + } 29 + 30 + impl RuntimeNode for ConditionalIfEqual { 31 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 32 + self.outputs.clone() 33 + } 34 + 35 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 36 + self.inputs.clone() 37 + } 38 + 39 + fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType> { 40 + let is_equal = args[1] == args[2]; 41 + 42 + vec![ 43 + ParameterType::Flow(is_equal), 44 + ParameterType::Flow(!is_equal), 45 + ] 46 + } 47 + 48 + fn is_entrypoint(&self) -> bool { 49 + false 50 + } 51 + }
+51
src-tauri/src/runtime/nodes/conditional/iffalse.rs
··· 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 5 + 6 + pub struct ConditionalIfFalse { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 9 + } 10 + 11 + impl ConditionalIfFalse { 12 + pub fn new(node: Node) -> Box<Self> { 13 + Box::new(Self { 14 + outputs: node.outputs.iter().map(|x| { 15 + x.connections.iter() 16 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 17 + 18 + inputs: node.inputs.iter().map(|x| { 19 + let y = x.connections.get(0); 20 + if let Some(y) = y{ 21 + Some((y.node.clone(), y.index, y.value_type)) 22 + } else{ 23 + None 24 + } 25 + }).collect(), 26 + }) 27 + } 28 + } 29 + 30 + impl RuntimeNode for ConditionalIfFalse { 31 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 32 + self.outputs.clone() 33 + } 34 + 35 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 36 + self.inputs.clone() 37 + } 38 + 39 + fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType> { 40 + let is_false = !args[1].as_bool().unwrap(); 41 + 42 + vec![ 43 + ParameterType::Flow(is_false), 44 + ParameterType::Flow(!is_false), 45 + ] 46 + } 47 + 48 + fn is_entrypoint(&self) -> bool { 49 + false 50 + } 51 + }
+51
src-tauri/src/runtime/nodes/conditional/iftrue.rs
··· 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 5 + 6 + pub struct ConditionalIfTrue { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 9 + } 10 + 11 + impl ConditionalIfTrue { 12 + pub fn new(node: Node) -> Box<Self> { 13 + Box::new(Self { 14 + outputs: node.outputs.iter().map(|x| { 15 + x.connections.iter() 16 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 17 + 18 + inputs: node.inputs.iter().map(|x| { 19 + let y = x.connections.get(0); 20 + if let Some(y) = y{ 21 + Some((y.node.clone(), y.index, y.value_type)) 22 + } else{ 23 + None 24 + } 25 + }).collect(), 26 + }) 27 + } 28 + } 29 + 30 + impl RuntimeNode for ConditionalIfTrue { 31 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 32 + self.outputs.clone() 33 + } 34 + 35 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 36 + self.inputs.clone() 37 + } 38 + 39 + fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType> { 40 + let is_true = args[1].as_bool().unwrap(); 41 + 42 + vec![ 43 + ParameterType::Flow(is_true), 44 + ParameterType::Flow(!is_true), 45 + ] 46 + } 47 + 48 + fn is_entrypoint(&self) -> bool { 49 + false 50 + } 51 + }
+3
src-tauri/src/runtime/nodes/conditional/mod.rs
··· 1 + pub mod ifequal; 2 + pub mod iffalse; 3 + pub mod iftrue;
+36 -23
src-tauri/src/runtime/nodes/debug.rs
··· 1 - use crate::{ runtime::nodes::RuntimeNode, structs::{ nodes::Node, parameter_types::ParameterType } }; 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: 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 ) -> bool { 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 - false 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 + }
+51 -39
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: String, 6 - runtime_active: bool 6 + pub struct OSCTrigger { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 9 + 10 + address: Option<String> 7 11 } 8 12 9 - impl OSCTrigger{ 10 - pub fn new( node: Node ) -> Box<Self>{ 11 - dbg!(&node); 13 + impl OSCTrigger { 14 + pub fn new(node: Node) -> Box<Self> { 15 + let value = &node.statics[0].value; 12 16 13 17 Box::new(Self { 14 - address: node.statics[0].value.as_str().unwrap().to_owned(), 15 - outputs: node.outputs.iter() 16 - .map(| x | { 17 - x.connections.iter().map(| x | { ( x.node.clone(), x.index, x.value_type ) }).collect() 18 - }).collect(), 19 - runtime_active: false 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 + }, 20 36 }) 21 37 } 22 38 } 23 39 24 - impl RuntimeNode for OSCTrigger{ 25 - fn outputs( &self ) -> Vec<Vec<( String, isize, isize )>> { 40 + impl RuntimeNode for OSCTrigger { 41 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 26 42 self.outputs.clone() 27 43 } 28 44 29 - fn execute_dry( &mut self, msg: &Vec<ParameterType> ) -> Option<Vec<ParameterType>> { 30 - if let ParameterType::String(address) = &msg[0]{ 31 - if *address == self.address{ 32 - self.runtime_active = true; 33 - Some(msg.clone()) 34 - // The first value is technically the address value, 35 - // but this value gets ignored as the first output of 36 - // the osctrigger node is a flow output which gets ignored 37 - // on dry runs. 45 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 46 + self.inputs.clone() 47 + } 48 + 49 + fn execute(&mut self, mut args: Vec<ParameterType>) -> Vec<ParameterType> { 50 + if args.len() == 0{ return args } 51 + 52 + let execute = if let Some(internal_address) = &self.address { 53 + if let Ok(address) = args[0].as_string() { 54 + address == *internal_address 38 55 } else{ 39 - self.runtime_active = false; 40 - None 56 + false 41 57 } 42 58 } else{ 43 - self.runtime_active = false; 44 - None 45 - } 46 - } 47 - 48 - fn execute( &mut self ) -> bool { 49 - let execute = self.runtime_active; 50 - self.runtime_active = false; 59 + false 60 + }; 51 61 52 - execute 62 + args[0] = ParameterType::Flow(execute); 63 + args 53 64 } 54 65 55 - fn update_arg( &mut self, _: usize, _: ParameterType ) -> bool { false } 56 - fn is_entrypoint( &self ) -> bool { true } 57 - } 66 + fn is_entrypoint(&self) -> bool { 67 + true 68 + } 69 + }
+73
src-tauri/src/runtime/nodes/press_key.rs
··· 1 + use std::sync::{Arc, Mutex}; 2 + 3 + use enigo::{Direction, Enigo, Key, Keyboard}; 4 + 5 + use crate::{ 6 + runtime::nodes::RuntimeNode, 7 + structs::{nodes::Node, parameter_types::ParameterType}, 8 + }; 9 + 10 + pub struct PressKey { 11 + outputs: Vec<Vec<(String, isize, isize)>>, 12 + inputs: Vec<Option<(String, isize, isize)>>, 13 + 14 + key: Option<char>, 15 + enigo: Arc<Mutex<Enigo>>, 16 + } 17 + 18 + impl PressKey { 19 + pub fn new(node: Node, enigo: Arc<Mutex<Enigo>>) -> Box<Self> { 20 + let value = &node.statics[0].value; 21 + 22 + Box::new(Self { 23 + outputs: node.outputs.iter().map(|x| { 24 + x.connections.iter() 25 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 26 + 27 + inputs: node.inputs.iter().map(|x| { 28 + let y = x.connections.get(0); 29 + if let Some(y) = y{ 30 + Some((y.node.clone(), y.index, y.value_type)) 31 + } else{ 32 + None 33 + } 34 + }).collect(), 35 + 36 + enigo, 37 + key: if value.is_null() { 38 + None 39 + } else { 40 + let string = value.as_str().unwrap().to_owned(); 41 + 42 + if string.len() == 1 { 43 + Some(string.chars().nth(0).unwrap()) 44 + } else { 45 + None 46 + } 47 + }, 48 + }) 49 + } 50 + } 51 + 52 + impl RuntimeNode for PressKey { 53 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 54 + self.outputs.clone() 55 + } 56 + 57 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 58 + self.inputs.clone() 59 + } 60 + 61 + fn execute(&mut self, _: Vec<ParameterType>) -> Vec<ParameterType> { 62 + if self.key.is_some() { 63 + let mut enigo = self.enigo.lock().unwrap(); 64 + enigo.key(Key::MediaPlayPause, Direction::Click).unwrap(); 65 + } 66 + 67 + vec![] 68 + } 69 + 70 + fn is_entrypoint(&self) -> bool { 71 + false 72 + } 73 + }
+70
src-tauri/src/runtime/nodes/shell.rs
··· 1 + use std::{io::Stdin, process::{Command, Stdio}}; 2 + 3 + use crate::{ 4 + runtime::nodes::RuntimeNode, 5 + structs::{nodes::Node, parameter_types::ParameterType}, 6 + }; 7 + 8 + pub struct ShellCommand { 9 + outputs: Vec<Vec<(String, isize, isize)>>, 10 + inputs: Vec<Option<(String, isize, isize)>> 11 + } 12 + 13 + impl ShellCommand { 14 + pub fn new(node: Node) -> Box<Self> { 15 + Box::new(Self { 16 + outputs: node.outputs.iter().map(|x| { 17 + x.connections.iter() 18 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 19 + 20 + inputs: node.inputs.iter().map(|x| { 21 + let y = x.connections.get(0); 22 + if let Some(y) = y{ 23 + Some((y.node.clone(), y.index, y.value_type)) 24 + } else{ 25 + None 26 + } 27 + }).collect() 28 + }) 29 + } 30 + } 31 + 32 + impl RuntimeNode for ShellCommand { 33 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 34 + self.outputs.clone() 35 + } 36 + 37 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 38 + self.inputs.clone() 39 + } 40 + 41 + fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType> { 42 + if let Ok(cmd) = args[1].as_string(){ 43 + if cmd != ""{ 44 + let mut split_cmd = cmd.split(" "); 45 + 46 + let mut cmd = Command::new(split_cmd.nth(0).unwrap()); 47 + if split_cmd.clone().count() > 0{ cmd.args(split_cmd); } 48 + 49 + cmd.stdout(Stdio::piped()); 50 + cmd.stderr(Stdio::piped()); 51 + 52 + let child = cmd.spawn().unwrap(); 53 + let output = child.wait_with_output().unwrap(); 54 + 55 + vec![ 56 + ParameterType::Flow(true), 57 + ParameterType::String(str::from_utf8(&output.stdout).unwrap().to_owned()) 58 + ] 59 + } else{ 60 + vec![ ParameterType::Flow(false) ] 61 + } 62 + } else{ 63 + vec![ ParameterType::Flow(false) ] 64 + } 65 + } 66 + 67 + fn is_entrypoint(&self) -> bool { 68 + false 69 + } 70 + }
+60
src-tauri/src/runtime/nodes/statics/float.rs
··· 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 5 + 6 + pub struct StaticFloat { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 9 + 10 + value: Option<f32>, 11 + } 12 + 13 + impl StaticFloat { 14 + pub fn new(node: Node) -> Box<Self> { 15 + let value = &node.statics[0].value; 16 + 17 + Box::new(Self { 18 + outputs: node.outputs.iter().map(|x| { 19 + x.connections.iter() 20 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 21 + 22 + inputs: node.inputs.iter().map(|x| { 23 + let y = x.connections.get(0); 24 + if let Some(y) = y{ 25 + Some((y.node.clone(), y.index, y.value_type)) 26 + } else{ 27 + None 28 + } 29 + }).collect(), 30 + 31 + value: if value.is_null() { 32 + None 33 + } else { 34 + Some(value.as_f64().unwrap() as f32) 35 + } 36 + }) 37 + } 38 + } 39 + 40 + impl RuntimeNode for StaticFloat { 41 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 42 + self.outputs.clone() 43 + } 44 + 45 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 46 + self.inputs.clone() 47 + } 48 + 49 + fn execute(&mut self, _: Vec<ParameterType>) -> Vec<ParameterType> { 50 + if self.value.is_some() { 51 + vec![ParameterType::Float(self.value.clone().unwrap())] 52 + } else { 53 + vec![ParameterType::Float(0.0)] 54 + } 55 + } 56 + 57 + fn is_entrypoint(&self) -> bool { 58 + false 59 + } 60 + }
+60
src-tauri/src/runtime/nodes/statics/int.rs
··· 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 5 + 6 + pub struct StaticInt { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 9 + 10 + value: Option<i32>, 11 + } 12 + 13 + impl StaticInt { 14 + pub fn new(node: Node) -> Box<Self> { 15 + let value = &node.statics[0].value; 16 + 17 + Box::new(Self { 18 + outputs: node.outputs.iter().map(|x| { 19 + x.connections.iter() 20 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 21 + 22 + inputs: node.inputs.iter().map(|x| { 23 + let y = x.connections.get(0); 24 + if let Some(y) = y{ 25 + Some((y.node.clone(), y.index, y.value_type)) 26 + } else{ 27 + None 28 + } 29 + }).collect(), 30 + 31 + value: if value.is_null() { 32 + None 33 + } else { 34 + Some(value.as_i64().unwrap() as i32) 35 + } 36 + }) 37 + } 38 + } 39 + 40 + impl RuntimeNode for StaticInt { 41 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 42 + self.outputs.clone() 43 + } 44 + 45 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 46 + self.inputs.clone() 47 + } 48 + 49 + fn execute(&mut self, _: Vec<ParameterType>) -> Vec<ParameterType> { 50 + if self.value.is_some() { 51 + vec![ParameterType::Int(self.value.clone().unwrap())] 52 + } else { 53 + vec![ParameterType::Int(0)] 54 + } 55 + } 56 + 57 + fn is_entrypoint(&self) -> bool { 58 + false 59 + } 60 + }
+3
src-tauri/src/runtime/nodes/statics/mod.rs
··· 1 + pub mod float; 2 + pub mod int; 3 + pub mod string;
+60
src-tauri/src/runtime/nodes/statics/string.rs
··· 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 5 + 6 + pub struct StaticString { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 9 + 10 + value: Option<String>, 11 + } 12 + 13 + impl StaticString { 14 + pub fn new(node: Node) -> Box<Self> { 15 + let value = &node.statics[0].value; 16 + 17 + Box::new(Self { 18 + outputs: node.outputs.iter().map(|x| { 19 + x.connections.iter() 20 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 21 + 22 + inputs: node.inputs.iter().map(|x| { 23 + let y = x.connections.get(0); 24 + if let Some(y) = y{ 25 + Some((y.node.clone(), y.index, y.value_type)) 26 + } else{ 27 + None 28 + } 29 + }).collect(), 30 + 31 + value: if value.is_null() { 32 + None 33 + } else { 34 + Some(value.as_str().unwrap().to_owned()) 35 + } 36 + }) 37 + } 38 + } 39 + 40 + impl RuntimeNode for StaticString { 41 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 42 + self.outputs.clone() 43 + } 44 + 45 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 46 + self.inputs.clone() 47 + } 48 + 49 + fn execute(&mut self, _: Vec<ParameterType>) -> Vec<ParameterType> { 50 + if self.value.is_some() { 51 + vec![ParameterType::String(self.value.clone().unwrap())] 52 + } else { 53 + vec![ParameterType::String("".to_owned())] 54 + } 55 + } 56 + 57 + fn is_entrypoint(&self) -> bool { 58 + false 59 + } 60 + }
+85 -19
src-tauri/src/runtime/nodes.rs
··· 1 - use std::{collections::HashMap, sync::Mutex}; 1 + use std::{ 2 + collections::HashMap, 3 + sync::{Arc, Mutex}, 4 + }; 2 5 3 - use crate::{ runtime::nodes::{ debug::Debug, osctrigger::OSCTrigger }, structs::{ nodes::Node, parameter_types::ParameterType } }; 6 + // #[cfg(target_os = "windows")] 7 + use enigo::Enigo; 4 8 5 - mod osctrigger; 9 + use crate::{ 10 + runtime::nodes::{ 11 + conditional::{ 12 + ifequal::ConditionalIfEqual, iffalse::ConditionalIfFalse, iftrue::ConditionalIfTrue, 13 + }, debug::Debug, oscactions::sendchatbox::OSCActionsSendChatbox, osctrigger::OSCTrigger, shell::ShellCommand, statics::{float::StaticFloat, int::StaticInt, string::StaticString} 14 + }, 15 + structs::{nodes::Node, parameter_types::ParameterType}, 16 + }; 17 + 18 + // #[cfg(target_os = "windows")] 19 + use crate::runtime::nodes::press_key::PressKey; 20 + 21 + mod conditional; 6 22 mod debug; 23 + mod oscactions; 24 + mod osctrigger; 25 + mod statics; 26 + mod shell; 7 27 8 - pub struct RuntimeNodeTree{ 9 - pub nodes: HashMap<String, Mutex<Box<dyn RuntimeNode>>> 28 + // #[cfg(target_os = "windows")] 29 + mod press_key; 30 + 31 + pub struct RuntimeNodeTree { 32 + pub nodes: HashMap<String, Box<dyn RuntimeNode>>, 10 33 } 11 34 12 - impl RuntimeNodeTree{ 13 - pub fn from( tree: Vec<Node> ) -> Self{ 14 - let mut runtime_nodes: HashMap<String, Mutex<Box<dyn RuntimeNode>>> = HashMap::new(); 15 - for node in tree{ 16 - match node.type_id.as_str(){ 17 - "osctrigger" => { runtime_nodes.insert(node.id.clone(), Mutex::new(OSCTrigger::new(node))); } 18 - "debug" => { runtime_nodes.insert(node.id.clone(), Mutex::new(Debug::new(node))); } 35 + unsafe impl Send for RuntimeNodeTree {} 36 + 37 + impl RuntimeNodeTree { 38 + pub fn from(tree: Vec<Node>, /*#[cfg(target_os = "windows")]*/ enigo: Arc<Mutex<Enigo>>) -> Self { 39 + let mut runtime_nodes: HashMap<String, Box<dyn RuntimeNode>> = HashMap::new(); 40 + for node in tree { 41 + match node.type_id.as_str() { 42 + "osctrigger" => { 43 + runtime_nodes.insert(node.id.clone(), OSCTrigger::new(node)); 44 + } 45 + 46 + "staticstring" => { 47 + runtime_nodes.insert(node.id.clone(), StaticString::new(node)); 48 + } 49 + "staticint" => { 50 + runtime_nodes.insert(node.id.clone(), StaticInt::new(node)); 51 + } 52 + "staticfloat" => { 53 + runtime_nodes.insert(node.id.clone(), StaticFloat::new(node)); 54 + } 55 + 56 + "iftrue" => { 57 + runtime_nodes.insert(node.id.clone(), ConditionalIfTrue::new(node)); 58 + } 59 + "iffalse" => { 60 + runtime_nodes.insert(node.id.clone(), ConditionalIfFalse::new(node)); 61 + } 62 + "ifequal" => { 63 + runtime_nodes.insert(node.id.clone(), ConditionalIfEqual::new(node)); 64 + } 65 + 66 + "oscsendchatbox" => { 67 + runtime_nodes.insert(node.id.clone(), OSCActionsSendChatbox::new(node)); 68 + } 69 + 70 + "debug" => { 71 + runtime_nodes.insert(node.id.clone(), Debug::new(node)); 72 + } 73 + 74 + // #[cfg(target_os = "windows")] 75 + "presskey" => { 76 + runtime_nodes.insert(node.id.clone(), PressKey::new(node, enigo.clone())); 77 + } 78 + 79 + "shellcommand" => { 80 + runtime_nodes.insert(node.id.clone(), ShellCommand::new(node)); 81 + } 82 + 19 83 _ => {} 20 84 } 21 85 } 22 86 23 - Self { nodes: runtime_nodes } 87 + Self { 88 + nodes: runtime_nodes, 89 + } 24 90 } 25 91 } 26 92 27 - pub trait RuntimeNode{ 28 - fn outputs( &self ) -> Vec<Vec<( String, isize, isize )>>; // Node ID, input index, output value type 29 - fn execute_dry( &mut self, msg: &Vec<ParameterType> ) -> Option<Vec<ParameterType>>; // Only update values on the first loop through 30 - fn execute( &mut self ) -> bool; // Then call functions on the second loop 31 - fn update_arg( &mut self, index: usize, value: ParameterType ) -> bool; 32 - fn is_entrypoint( &self ) -> bool; 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; 33 99 }
+67 -45
src-tauri/src/runtime.rs
··· 1 - use anyhow::{ bail, Result }; 1 + use std::collections::HashMap; 2 2 3 - use crate::{ runtime::nodes::RuntimeNodeTree, structs::parameter_types::ParameterType }; 4 - 5 - pub mod nodes; 6 - pub mod commands; 3 + use anyhow::{bail, Result}; 7 4 8 - // This is horrible. I know, I'm sorry. 5 + use crate::{runtime::nodes::RuntimeNodeTree, structs::parameter_types::ParameterType}; 9 6 10 - pub fn runtime_dry( entry: String, parameters: &Vec<ParameterType>, tab: &RuntimeNodeTree ) -> Result<()>{ 11 - let node = tab.nodes.get(&entry); 12 - if node.is_none(){ bail!("Cannot find node"); } 7 + pub mod commands; 8 + pub mod nodes; 13 9 14 - let mut node = node.unwrap().lock().unwrap(); 10 + // TODO: Variables 15 11 16 - let output_map = node.outputs(); 17 - let args = node.execute_dry(parameters); 12 + pub fn recurse_runtime(entry: String, tab: &mut RuntimeNodeTree, args: Vec<ParameterType>) -> Result<()>{ 13 + let ( out_args, output_map ) = runtime(entry, tab, args)?; 18 14 19 - drop(node); 15 + let mut next_node_args: HashMap<String, Vec<ParameterType>> = HashMap::new(); 20 16 21 - if args.is_some(){ 22 - let args = args.unwrap(); 17 + for i in 0..out_args.len(){ 18 + if output_map.len() <= i { break; } 19 + let links = &output_map[i]; 23 20 24 - for i in 0..args.len(){ 25 - let arg = &args[i]; 21 + for ( id, link_index, _ ) in links{ 22 + let link_index = link_index.clone() as usize; 26 23 27 - for output in &output_map[i]{ 28 - if output.2 == 5{ break; } // Ignore flow outputs 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); } 29 27 30 - let next_node = tab.nodes.get(&output.0); 31 - if next_node.is_none(){ bail!("Cannot find node {}", output.0) } 28 + args.push(out_args[i].clone()); 29 + } else{ 30 + let mut args = vec![ParameterType::None; link_index]; 31 + args.push(out_args[i].clone()); 32 32 33 - let mut next_node = next_node.unwrap().lock().unwrap(); 34 - let can_update = next_node.update_arg(output.1 as usize, arg.clone()); 33 + next_node_args.insert(id.clone(), args); 34 + } 35 + } 36 + } 35 37 36 - if can_update{ 37 - drop(next_node); 38 - // ^^ Drop this MutexGuard before we enter the runtime, 39 - // as it blocks the runtime for gaining a lock on the node 40 - // TODO: Please find a better way of making it mutable 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]; 41 42 42 - 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)?; 43 46 } 44 47 } 45 48 } ··· 48 51 Ok(()) 49 52 } 50 53 54 + pub fn runtime(entry: String, tab: &mut RuntimeNodeTree, mut args: Vec<ParameterType>) -> Result<(Vec<ParameterType>, Vec<Vec<(String, isize, isize)>>)> { 55 + let node = tab.nodes.get_mut(&entry); 56 + if node.is_none() { bail!("Cannot find node"); } 51 57 52 - pub fn runtime( entry: String, tab: &RuntimeNodeTree ) -> Result<()>{ 53 - let node = tab.nodes.get(&entry); 54 - if node.is_none(){ bail!("Cannot find node"); } 58 + let node = node.unwrap(); 59 + let inputs = node.inputs(); 55 60 56 - let mut node = node.unwrap().lock().unwrap(); 61 + let mut needed_input_nodes = HashMap::new(); 57 62 58 - let next = node.execute(); 59 - if next{ 60 - 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 + } 61 74 62 - drop(node); 75 + for ( id, needed ) in needed_input_nodes{ 76 + let (out_args, _) = runtime(id, tab, vec![]).unwrap(); 63 77 64 - for outputs in outputs{ 65 - for output in outputs{ 66 - if output.2 == 5{ 67 - // This is a flow output, continue 68 - runtime(output.0, &tab)?; 69 - } 78 + for ( output, input ) in needed{ 79 + let arg = &out_args[output as usize]; 80 + 81 + if args.len() >= input{ 82 + while args.len() < input{ args.push(ParameterType::None); } 83 + args.push(arg.clone()); 84 + } else{ 85 + args[input] = arg.clone(); 70 86 } 71 87 } 72 88 } 73 89 74 - Ok(()) 75 - } 90 + let node = tab.nodes.get_mut(&entry); // TODO: Find a way to only do this lookup once 91 + if node.is_none() { bail!("Cannot find node"); } 92 + 93 + let node = node.unwrap(); 94 + 95 + let output = node.execute(args); 96 + Ok((output, node.outputs())) 97 + }
-97
src-tauri/src/runtime.rs.old
··· 1 - use std::collections::HashMap; 2 - 3 - use anyhow::bail; 4 - 5 - use crate::{ osc::OSCMessage, structs::{ nodes::{ Node, Tab }, parameter_types::ParameterType } }; 6 - 7 - pub fn start_runtime( 8 - tab: &Tab, 9 - msg: &OSCMessage, 10 - node_execution_table: 11 - &HashMap<String, Box<dyn Fn(&Node, &OSCMessage, Vec<ParameterType>) -> Vec<ParameterType>>> 12 - ) -> anyhow::Result<()>{ 13 - for i in 0..tab.nodes.len(){ 14 - let node = &tab.nodes[i]; 15 - 16 - if node.type_id == "osctrigger"{ 17 - runtime(&tab.nodes, i, msg, node_execution_table)?; 18 - } 19 - } 20 - 21 - Ok(()) 22 - } 23 - 24 - fn runtime( 25 - nodes: &Vec<Node>, 26 - index: usize, 27 - msg: &OSCMessage, 28 - node_execution_table: 29 - &HashMap<String, Box<dyn Fn(&Node, &OSCMessage, Vec<ParameterType>) -> Vec<ParameterType>>> 30 - ) -> anyhow::Result<()>{ 31 - let node = &nodes[index]; 32 - 33 - let execute_node = node_execution_table.get(&node.type_id); 34 - if execute_node.is_none(){ bail!("Cannot find node in execution table."); } 35 - 36 - let res = execute_node.unwrap()(node, msg, vec![]); 37 - if res.len() == 0{ return Ok(()); } 38 - 39 - let nodes_length = (&nodes).len(); 40 - 41 - for i in 0..res.len(){ 42 - let output = &node.outputs[i]; 43 - if output.value_type == 5 { // 5 - Flow Type 44 - 45 - if let ParameterType::Flow(run) = res[i]{ 46 - 47 - if run{ 48 - let connections = &output.connections; 49 - for connection in connections{ 50 - let mut found_node = None; 51 - 52 - for i in 0..nodes_length{ 53 - let node = &nodes[i]; 54 - 55 - if node.id == connection.node{ 56 - found_node = Some(i); 57 - break; 58 - } 59 - } 60 - 61 - if found_node.is_some(){ 62 - runtime(nodes, found_node.unwrap(), msg, node_execution_table)?; 63 - } 64 - } 65 - } 66 - } 67 - } 68 - } 69 - 70 - Ok(()) 71 - } 72 - 73 - pub fn load_excecution_table( 74 - node_execution_table: 75 - &mut HashMap<String, Box<dyn Fn(&Node, &OSCMessage, Vec<ParameterType>) -> Vec<ParameterType>>> 76 - ){ 77 - node_execution_table.insert("osctrigger".into(), Box::new(| node, msg, _ |{ 78 - if node.statics[0].value.is_null(){ return vec![ ParameterType::Flow(false) ] } 79 - 80 - let node_addr = node.statics[0].value.as_str().unwrap().to_owned(); 81 - if node_addr == msg.address{ 82 - let mut dat = vec![ 83 - ParameterType::Flow(true) 84 - ]; 85 - 86 - dat.extend(msg.values.clone()); 87 - dat 88 - } else{ 89 - vec![ ParameterType::Flow(false) ] 90 - } 91 - })); 92 - 93 - node_execution_table.insert("debug".into(), Box::new(| _, _, args |{ 94 - dbg!(&args[1]); 95 - vec![] 96 - })); 97 - }
+74 -42
src-tauri/src/setup.rs
··· 1 - use std::{ collections::HashMap, fs::File, io::Read, sync::{ self, mpsc::Receiver, Mutex } }; 1 + use crossbeam_channel::{bounded, Receiver}; 2 + use std::{ 3 + collections::HashMap, 4 + fs::File, 5 + io::Read, 6 + sync::{Arc, Mutex}, 7 + }; 2 8 3 9 use flate2::read::GzDecoder; 4 - use serde_json::{ Map, Value }; 5 - use tauri::{ App, Emitter, Listener, Manager }; 10 + use serde_json::{Map, Value}; 11 + use tauri::{App, Emitter, Listener, Manager, WindowEvent}; 6 12 7 - use crate::{ osc::{ self, OSCMessage }, runtime::{ commands::RuntimeCommand, nodes::RuntimeNodeTree, runtime, runtime_dry }, structs::parameter_types::ParameterType }; 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 + }; 8 16 9 17 pub fn setup( 10 18 app: &mut App, 11 19 addresses: &'static Mutex<Vec<OSCMessage>>, 12 - runtime_command_receiver: Receiver<RuntimeCommand> 20 + runtime_command_receiver: Receiver<RuntimeCommand>, 13 21 ) { 14 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()); 15 44 16 45 let handle = window.clone(); 17 46 window.listen("tauri://drag-drop", move |ev| { ··· 32 61 handle.emit("load_new_tab", Value::Object(map)).unwrap(); 33 62 }); 34 63 35 - let ( sender, receiver ) = sync::mpsc::channel(); 64 + let (sender, receiver) = bounded(1024); 36 65 37 66 tokio::spawn(async move { 38 67 osc::start_server(sender, "127.0.0.1:9001"); 39 68 }); 40 69 41 - let ( runtime_sender, runtime_receiver ) = sync::mpsc::channel(); 70 + let (runtime_sender, runtime_receiver) = bounded(1024); 42 71 43 72 let runtime_sender_1 = runtime_sender.clone(); 44 73 tokio::spawn(async move { ··· 55 84 window.emit("osc-message", &message).unwrap(); 56 85 57 86 let msg = message.clone(); 58 - let mut addresses = addresses.lock().unwrap(); 59 - if !addresses.contains(&msg) { addresses.push(msg); } 87 + let mut addrs = addresses.lock().unwrap(); 88 + if !addrs.contains(&msg) { 89 + addrs.push(msg); 90 + } 60 91 61 - runtime_sender.send(RuntimeCommand::OSCMessage(message)).unwrap(); 92 + if message.address == "/avatar/change".to_owned(){ 93 + *addrs = vrchat_builtin_parameters::get_read_addresses(); 94 + 95 + // TODO: Read avatar paramaters from file 96 + } 97 + 98 + runtime_sender 99 + .send(RuntimeCommand::OSCMessage(message)) 100 + .unwrap(); 62 101 } 63 102 }); 64 103 104 + // TODO: Run tabs in seperate threads (really not looking forward to this... thanks rust) 105 + 65 106 tokio::spawn(async move { 66 107 let mut tabs: HashMap<String, RuntimeNodeTree> = HashMap::new(); 67 108 109 + // #[cfg(target_os = "windows")] 110 + let enigo = Arc::new(Mutex::new(enigo::Enigo::new(&enigo::Settings::default()).unwrap())); 111 + 68 112 loop { 69 113 let cmd = runtime_receiver.recv().unwrap(); 70 114 71 - match cmd{ 72 - RuntimeCommand::OSCMessage( msg ) => { 73 - for ( _, tab ) in &mut tabs{ 74 - for ( id, node ) in &tab.nodes{ 75 - let node = node.lock().unwrap(); 76 - 77 - if node.is_entrypoint(){ 78 - let args = vec![ 79 - vec![ ParameterType::String(msg.address.clone()) ], msg.values.clone() 80 - ].concat(); 81 - 82 - drop(node); 83 - // ^^ Drop this MutexGuard before we enter the runtime, 84 - // as it blocks the runtime for gaining a lock on the node 85 - // TODO: Please find a better way of making it mutable 86 - 87 - runtime_dry(id.clone(), &args, tab).unwrap(); 88 - } 89 - } 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(); 90 119 91 - for ( id, node ) in &tab.nodes{ 92 - let node = node.lock().unwrap(); 120 + for id in keys { 121 + let entry = tab.nodes[&id].is_entrypoint(); 93 122 94 - if node.is_entrypoint(){ 95 - drop(node); 96 - // ^^ Drop this MutexGuard before we enter the runtime, 97 - // as it blocks the runtime for gaining a lock on the node 98 - // TODO: Please find a better way of making it mutable 123 + if entry { 124 + let mut args = vec![ ParameterType::String(msg.address.clone())]; 125 + let mut values = msg.values.clone(); 99 126 100 - runtime(id.clone(), tab).unwrap(); 127 + args.append(&mut values); 128 + let _ = recurse_runtime(id.clone(), &mut tab, args); 101 129 } 102 130 } 103 131 } 104 - }, 132 + } 105 133 106 - RuntimeCommand::AddTab( graph, id ) => { 107 - tabs.insert(id, RuntimeNodeTree::from(graph)); 108 - }, 109 - 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) => { 110 142 tabs.remove(&id); 111 143 } 112 144 }
+1 -1
src-tauri/src/structs/mod.rs
··· 1 + pub mod nodes; 1 2 pub mod parameter_types; 2 - pub mod nodes;
+17 -20
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 - #[derive(Serialize, Deserialize, Debug)] 5 - pub struct Node{ 4 + #[derive(Serialize, Deserialize, Debug, Clone)] 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 - impl Node{ 17 - 18 - } 19 - 20 - #[derive(Serialize, Deserialize, Debug)] 21 - pub struct NodeStatic{ 17 + #[derive(Serialize, Deserialize, Debug, Clone)] 18 + pub struct NodeStatic { 22 19 pub name: String, 23 20 24 21 #[serde(rename = "type")] 25 22 pub value_type: isize, 26 - pub value: Value 23 + pub value: Value, 27 24 } 28 25 29 - #[derive(Serialize, Deserialize, Debug)] 30 - pub struct NodeOutput{ 26 + #[derive(Serialize, Deserialize, Debug, Clone)] 27 + pub struct NodeIO { 31 28 pub name: String, 32 29 33 30 #[serde(rename = "type")] 34 31 pub value_type: isize, 35 - pub connections: Vec<NodeOutputConnections> 32 + pub connections: Vec<NodeOutputConnections>, 36 33 } 37 34 38 - #[derive(Serialize, Deserialize, Debug)] 39 - pub struct NodeOutputConnections{ 35 + #[derive(Serialize, Deserialize, Debug, Clone)] 36 + pub struct NodeOutputConnections { 40 37 pub name: String, 41 38 pub node: String, 42 39 pub index: isize, 43 40 44 41 #[serde(rename = "type")] 45 - pub value_type: isize 46 - } 42 + pub value_type: isize, 43 + }
+55 -1
src-tauri/src/structs/parameter_types.rs
··· 1 + use anyhow::{bail, Result}; 1 2 use serde::Serialize; 2 3 3 - #[derive(Serialize, Clone, Debug)] 4 + #[derive(Serialize, Clone, Debug, PartialEq)] 4 5 #[serde(tag = "key", content = "value")] 5 6 pub enum ParameterType { 6 7 AnyType(String), ··· 11 12 Boolean(bool), 12 13 String(String), 13 14 Flow(bool), 15 + 16 + None, 17 + } 18 + 19 + impl ParameterType { 20 + pub fn as_bool(&self) -> Result<bool> { 21 + match self { 22 + ParameterType::Boolean(val) => Ok(val.clone()), 23 + ParameterType::Int(val) => { 24 + if *val == 0 { 25 + Ok(false) 26 + } else { 27 + Ok(true) 28 + } 29 + } 30 + _ => bail!("Cannot cast to bool."), 31 + } 32 + } 33 + 34 + pub fn as_int(&self) -> Result<i32> { 35 + match self { 36 + ParameterType::Boolean(val) => { 37 + if *val { 38 + Ok(1) 39 + } else { 40 + Ok(0) 41 + } 42 + } 43 + ParameterType::Int(val) => Ok(val.clone()), 44 + ParameterType::Float(val) => Ok(val.round().clone() as i32), 45 + ParameterType::String(val) => Ok(val.clone().parse()?), 46 + _ => bail!("Cannot cast to int."), 47 + } 48 + } 49 + 50 + pub fn as_float(&self) -> Result<f32> { 51 + match self { 52 + ParameterType::Int(val) => Ok(val.clone() as f32), 53 + ParameterType::Float(val) => Ok(val.clone()), 54 + ParameterType::String(val) => Ok(val.clone().parse()?), 55 + _ => bail!("Cannot cast to float."), 56 + } 57 + } 58 + 59 + pub fn as_string(&self) -> Result<String> { 60 + match self { 61 + ParameterType::Boolean(val) => Ok(val.clone().to_string()), 62 + ParameterType::Int(val) => Ok(val.clone().to_string()), 63 + ParameterType::Float(val) => Ok(val.clone().to_string()), 64 + ParameterType::String(val) => Ok(val.clone()), 65 + _ => bail!("Cannot cast to string."), 66 + } 67 + } 14 68 }
+27 -26
src-tauri/src/utils/config.rs
··· 3 3 fs::File, 4 4 io::{Read, Write}, 5 5 path::PathBuf, 6 - sync::Mutex, 6 + sync::{Mutex, MutexGuard}, 7 7 }; 8 8 9 + use chrono::Utc; 9 10 use flate2::{read::GzDecoder, write::GzEncoder, Compression}; 10 - use serde_json::Value; 11 + use serde::{Deserialize, Serialize}; 12 + 13 + use crate::structs::nodes::Node; 14 + 15 + #[derive(Clone, Serialize, Deserialize, Debug)] 16 + pub struct ConfigValues { 17 + #[serde(default)] 18 + pub loaded_tabs: HashMap<String, (Vec<Node>, String, Option<String>, bool)>, 19 + 20 + #[serde(default)] 21 + pub hide_editor_on_start: bool, 22 + } 11 23 12 24 pub struct Config { 13 - store: Mutex<HashMap<String, Value>>, 25 + pub store: Mutex<ConfigValues>, 14 26 path: PathBuf, 15 27 } 16 28 ··· 26 38 "{}".into() 27 39 }; 28 40 29 - let json: Value = serde_json::from_str(&json_string).unwrap(); 30 - 31 - let mut hashmap = HashMap::new(); 32 - 33 - let obj = json.as_object().unwrap(); 34 - for (key, val) in obj { 35 - hashmap.insert(key.clone(), val.clone()); 36 - } 41 + let json: ConfigValues = serde_json::from_str(&json_string).unwrap(); 37 42 38 43 Config { 39 - store: Mutex::new(hashmap), 44 + store: Mutex::new(json), 40 45 path: path, 41 46 } 42 47 } 43 48 44 - pub fn set(&self, key: &str, value: Value) { 45 - self.store.lock().unwrap().insert(key.to_owned(), value); 46 - } 49 + pub fn save(&self) { 50 + let mut dat = self.store.lock().unwrap(); 47 51 48 - pub fn get(&self, key: &str) -> Option<Value> { 49 - let store = self.store.lock().unwrap(); 50 - let val = store.get(&key.to_owned()); 52 + let dat = serde_json::to_string(&*dat).unwrap(); 51 53 52 - if val.is_none() { 53 - None 54 - } else { 55 - Some(val.unwrap().clone()) 56 - } 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(); 57 59 } 58 60 59 - pub fn save(&self) { 60 - let dat = serde_json::to_string(&self.store.lock().unwrap().clone()).unwrap(); 61 - dbg!(&dat); 61 + pub fn save_prelocked(&self, mut dat: MutexGuard<'_, ConfigValues>) { 62 + let dat = serde_json::to_string(&*dat).unwrap(); 62 63 63 64 let file = File::create(&self.path).unwrap(); 64 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 //