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 -8
package.json
··· 12 12 }, 13 13 "license": "MIT", 14 14 "dependencies": { 15 - "@tauri-apps/api": "^2", 16 - "@tauri-apps/plugin-opener": "^2", 17 - "animejs": "^4.1.2", 18 - "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" 19 22 }, 20 23 "devDependencies": { 21 - "@tauri-apps/cli": "^2", 24 + "@tauri-apps/cli": "^2.9.3", 22 25 "@types/animejs": "^3.1.13", 23 - "typescript": "~5.6.2", 24 - "vite": "^6.0.3", 25 - "vite-plugin-solid": "^2.11.0" 26 + "typescript": "~5.6.3", 27 + "vite": "^6.4.1", 28 + "vite-plugin-solid": "^2.11.10" 26 29 } 27 30 }
+483 -428
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 17 + '@tauri-apps/plugin-dialog': 18 + specifier: ~2.4.2 19 + version: 2.4.2 14 20 '@tauri-apps/plugin-opener': 15 - specifier: ^2 16 - version: 2.4.0 21 + specifier: ^2.5.2 22 + version: 2.5.2 23 + '@tauri-apps/plugin-os': 24 + specifier: ~2 25 + version: 2.3.2 17 26 animejs: 18 - specifier: ^4.1.2 19 - version: 4.1.2 27 + specifier: ^4.2.2 28 + version: 4.2.2 20 29 solid-js: 21 - specifier: ^1.9.3 22 - version: 1.9.7 30 + specifier: ^1.9.10 31 + version: 1.9.10 23 32 devDependencies: 24 33 '@tauri-apps/cli': 25 - specifier: ^2 26 - version: 2.7.1 34 + specifier: ^2.9.3 35 + version: 2.9.3 27 36 '@types/animejs': 28 37 specifier: ^3.1.13 29 38 version: 3.1.13 30 39 typescript: 31 - specifier: ~5.6.2 40 + specifier: ~5.6.3 32 41 version: 5.6.3 33 42 vite: 34 - specifier: ^6.0.3 35 - version: 6.3.5 43 + specifier: ^6.4.1 44 + version: 6.4.1 36 45 vite-plugin-solid: 37 - specifier: ^2.11.0 38 - 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) 39 48 40 49 packages: 41 - 42 - '@ampproject/remapping@2.3.0': 43 - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 44 - engines: {node: '>=6.0.0'} 45 50 46 51 '@babel/code-frame@7.27.1': 47 52 resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 48 53 engines: {node: '>=6.9.0'} 49 54 50 - '@babel/compat-data@7.28.0': 51 - resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} 55 + '@babel/compat-data@7.28.5': 56 + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} 52 57 engines: {node: '>=6.9.0'} 53 58 54 - '@babel/core@7.28.0': 55 - resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} 59 + '@babel/core@7.28.5': 60 + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} 56 61 engines: {node: '>=6.9.0'} 57 62 58 - '@babel/generator@7.28.0': 59 - resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} 63 + '@babel/generator@7.28.5': 64 + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} 60 65 engines: {node: '>=6.9.0'} 61 66 62 67 '@babel/helper-compilation-targets@7.27.2': ··· 75 80 resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} 76 81 engines: {node: '>=6.9.0'} 77 82 78 - '@babel/helper-module-transforms@7.27.3': 79 - resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} 83 + '@babel/helper-module-transforms@7.28.3': 84 + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} 80 85 engines: {node: '>=6.9.0'} 81 86 peerDependencies: 82 87 '@babel/core': ^7.0.0 ··· 89 94 resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 90 95 engines: {node: '>=6.9.0'} 91 96 92 - '@babel/helper-validator-identifier@7.27.1': 93 - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 97 + '@babel/helper-validator-identifier@7.28.5': 98 + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} 94 99 engines: {node: '>=6.9.0'} 95 100 96 101 '@babel/helper-validator-option@7.27.1': 97 102 resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} 98 103 engines: {node: '>=6.9.0'} 99 104 100 - '@babel/helpers@7.28.2': 101 - resolution: {integrity: sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==} 105 + '@babel/helpers@7.28.4': 106 + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} 102 107 engines: {node: '>=6.9.0'} 103 108 104 - '@babel/parser@7.28.0': 105 - resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} 109 + '@babel/parser@7.28.5': 110 + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} 106 111 engines: {node: '>=6.0.0'} 107 112 hasBin: true 108 113 ··· 116 121 resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} 117 122 engines: {node: '>=6.9.0'} 118 123 119 - '@babel/traverse@7.28.0': 120 - resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} 124 + '@babel/traverse@7.28.5': 125 + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} 121 126 engines: {node: '>=6.9.0'} 122 127 123 - '@babel/types@7.28.2': 124 - resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} 128 + '@babel/types@7.28.5': 129 + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} 125 130 engines: {node: '>=6.9.0'} 126 131 127 - '@esbuild/aix-ppc64@0.25.8': 128 - resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} 132 + '@esbuild/aix-ppc64@0.25.12': 133 + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} 129 134 engines: {node: '>=18'} 130 135 cpu: [ppc64] 131 136 os: [aix] 132 137 133 - '@esbuild/android-arm64@0.25.8': 134 - 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==} 135 140 engines: {node: '>=18'} 136 141 cpu: [arm64] 137 142 os: [android] 138 143 139 - '@esbuild/android-arm@0.25.8': 140 - resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} 144 + '@esbuild/android-arm@0.25.12': 145 + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} 141 146 engines: {node: '>=18'} 142 147 cpu: [arm] 143 148 os: [android] 144 149 145 - '@esbuild/android-x64@0.25.8': 146 - 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==} 147 152 engines: {node: '>=18'} 148 153 cpu: [x64] 149 154 os: [android] 150 155 151 - '@esbuild/darwin-arm64@0.25.8': 152 - resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} 156 + '@esbuild/darwin-arm64@0.25.12': 157 + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} 153 158 engines: {node: '>=18'} 154 159 cpu: [arm64] 155 160 os: [darwin] 156 161 157 - '@esbuild/darwin-x64@0.25.8': 158 - resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} 162 + '@esbuild/darwin-x64@0.25.12': 163 + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} 159 164 engines: {node: '>=18'} 160 165 cpu: [x64] 161 166 os: [darwin] 162 167 163 - '@esbuild/freebsd-arm64@0.25.8': 164 - resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} 168 + '@esbuild/freebsd-arm64@0.25.12': 169 + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} 165 170 engines: {node: '>=18'} 166 171 cpu: [arm64] 167 172 os: [freebsd] 168 173 169 - '@esbuild/freebsd-x64@0.25.8': 170 - resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} 174 + '@esbuild/freebsd-x64@0.25.12': 175 + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} 171 176 engines: {node: '>=18'} 172 177 cpu: [x64] 173 178 os: [freebsd] 174 179 175 - '@esbuild/linux-arm64@0.25.8': 176 - resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} 180 + '@esbuild/linux-arm64@0.25.12': 181 + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} 177 182 engines: {node: '>=18'} 178 183 cpu: [arm64] 179 184 os: [linux] 180 185 181 - '@esbuild/linux-arm@0.25.8': 182 - resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} 186 + '@esbuild/linux-arm@0.25.12': 187 + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} 183 188 engines: {node: '>=18'} 184 189 cpu: [arm] 185 190 os: [linux] 186 191 187 - '@esbuild/linux-ia32@0.25.8': 188 - resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} 192 + '@esbuild/linux-ia32@0.25.12': 193 + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} 189 194 engines: {node: '>=18'} 190 195 cpu: [ia32] 191 196 os: [linux] 192 197 193 - '@esbuild/linux-loong64@0.25.8': 194 - resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} 198 + '@esbuild/linux-loong64@0.25.12': 199 + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} 195 200 engines: {node: '>=18'} 196 201 cpu: [loong64] 197 202 os: [linux] 198 203 199 - '@esbuild/linux-mips64el@0.25.8': 200 - resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} 204 + '@esbuild/linux-mips64el@0.25.12': 205 + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} 201 206 engines: {node: '>=18'} 202 207 cpu: [mips64el] 203 208 os: [linux] 204 209 205 - '@esbuild/linux-ppc64@0.25.8': 206 - resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} 210 + '@esbuild/linux-ppc64@0.25.12': 211 + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} 207 212 engines: {node: '>=18'} 208 213 cpu: [ppc64] 209 214 os: [linux] 210 215 211 - '@esbuild/linux-riscv64@0.25.8': 212 - resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} 216 + '@esbuild/linux-riscv64@0.25.12': 217 + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} 213 218 engines: {node: '>=18'} 214 219 cpu: [riscv64] 215 220 os: [linux] 216 221 217 - '@esbuild/linux-s390x@0.25.8': 218 - resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} 222 + '@esbuild/linux-s390x@0.25.12': 223 + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} 219 224 engines: {node: '>=18'} 220 225 cpu: [s390x] 221 226 os: [linux] 222 227 223 - '@esbuild/linux-x64@0.25.8': 224 - resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} 228 + '@esbuild/linux-x64@0.25.12': 229 + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} 225 230 engines: {node: '>=18'} 226 231 cpu: [x64] 227 232 os: [linux] 228 233 229 - '@esbuild/netbsd-arm64@0.25.8': 230 - resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} 234 + '@esbuild/netbsd-arm64@0.25.12': 235 + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} 231 236 engines: {node: '>=18'} 232 237 cpu: [arm64] 233 238 os: [netbsd] 234 239 235 - '@esbuild/netbsd-x64@0.25.8': 236 - resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} 240 + '@esbuild/netbsd-x64@0.25.12': 241 + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} 237 242 engines: {node: '>=18'} 238 243 cpu: [x64] 239 244 os: [netbsd] 240 245 241 - '@esbuild/openbsd-arm64@0.25.8': 242 - resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} 246 + '@esbuild/openbsd-arm64@0.25.12': 247 + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} 243 248 engines: {node: '>=18'} 244 249 cpu: [arm64] 245 250 os: [openbsd] 246 251 247 - '@esbuild/openbsd-x64@0.25.8': 248 - resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} 252 + '@esbuild/openbsd-x64@0.25.12': 253 + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} 249 254 engines: {node: '>=18'} 250 255 cpu: [x64] 251 256 os: [openbsd] 252 257 253 - '@esbuild/openharmony-arm64@0.25.8': 254 - resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} 258 + '@esbuild/openharmony-arm64@0.25.12': 259 + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} 255 260 engines: {node: '>=18'} 256 261 cpu: [arm64] 257 262 os: [openharmony] 258 263 259 - '@esbuild/sunos-x64@0.25.8': 260 - resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} 264 + '@esbuild/sunos-x64@0.25.12': 265 + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} 261 266 engines: {node: '>=18'} 262 267 cpu: [x64] 263 268 os: [sunos] 264 269 265 - '@esbuild/win32-arm64@0.25.8': 266 - resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} 270 + '@esbuild/win32-arm64@0.25.12': 271 + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} 267 272 engines: {node: '>=18'} 268 273 cpu: [arm64] 269 274 os: [win32] 270 275 271 - '@esbuild/win32-ia32@0.25.8': 272 - resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} 276 + '@esbuild/win32-ia32@0.25.12': 277 + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} 273 278 engines: {node: '>=18'} 274 279 cpu: [ia32] 275 280 os: [win32] 276 281 277 - '@esbuild/win32-x64@0.25.8': 278 - resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} 282 + '@esbuild/win32-x64@0.25.12': 283 + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} 279 284 engines: {node: '>=18'} 280 285 cpu: [x64] 281 286 os: [win32] 282 287 283 - '@jridgewell/gen-mapping@0.3.12': 284 - 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==} 285 293 286 294 '@jridgewell/resolve-uri@3.1.2': 287 295 resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 288 296 engines: {node: '>=6.0.0'} 289 297 290 - '@jridgewell/sourcemap-codec@1.5.4': 291 - resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} 298 + '@jridgewell/sourcemap-codec@1.5.5': 299 + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 292 300 293 - '@jridgewell/trace-mapping@0.3.29': 294 - resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} 301 + '@jridgewell/trace-mapping@0.3.31': 302 + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} 295 303 296 - '@rollup/rollup-android-arm-eabi@4.46.1': 297 - resolution: {integrity: sha512-oENme6QxtLCqjChRUUo3S6X8hjCXnWmJWnedD7VbGML5GUtaOtAyx+fEEXnBXVf0CBZApMQU0Idwi0FmyxzQhw==} 304 + '@rollup/rollup-android-arm-eabi@4.53.0': 305 + resolution: {integrity: sha512-MX3DD/o2W36nlgQb8KA5QtUw/bK5aR9YDzNmX1PRHZAa6LF/MQCWMN477CgBMg8gH1vEiEZsjWRIZeL/7ttUVA==} 298 306 cpu: [arm] 299 307 os: [android] 300 308 301 - '@rollup/rollup-android-arm64@4.46.1': 302 - resolution: {integrity: sha512-OikvNT3qYTl9+4qQ9Bpn6+XHM+ogtFadRLuT2EXiFQMiNkXFLQfNVppi5o28wvYdHL2s3fM0D/MZJ8UkNFZWsw==} 309 + '@rollup/rollup-android-arm64@4.53.0': 310 + resolution: {integrity: sha512-U4/R8ZvikDYLkl+hyAGP23SRHp3LwYSRy9SvJqsnva7TYLhVMy39RTVCYn1DdRNxXl1CyCQgE/mXKm9jaQT4ig==} 303 311 cpu: [arm64] 304 312 os: [android] 305 313 306 - '@rollup/rollup-darwin-arm64@4.46.1': 307 - resolution: {integrity: sha512-EFYNNGij2WllnzljQDQnlFTXzSJw87cpAs4TVBAWLdkvic5Uh5tISrIL6NRcxoh/b2EFBG/TK8hgRrGx94zD4A==} 314 + '@rollup/rollup-darwin-arm64@4.53.0': 315 + resolution: {integrity: sha512-nBG2BXRU3ifdK0HdqBKaT5VI6ScoIpABYZ+dWwQkIOYd8Suo4iykgPikjhsTd7NeHgJJ3OqlKYCcNkZtB1iLVQ==} 308 316 cpu: [arm64] 309 317 os: [darwin] 310 318 311 - '@rollup/rollup-darwin-x64@4.46.1': 312 - resolution: {integrity: sha512-ZaNH06O1KeTug9WI2+GRBE5Ujt9kZw4a1+OIwnBHal92I8PxSsl5KpsrPvthRynkhMck4XPdvY0z26Cym/b7oA==} 319 + '@rollup/rollup-darwin-x64@4.53.0': 320 + resolution: {integrity: sha512-QuZ5hYStB/vW7b8zQYtdIPpIfNNlUXtGk8zVTkoTMKzMhE2/6tVvcCWqdWqCVhx6eguJJjKjtZ9lAAG/D3yNeA==} 313 321 cpu: [x64] 314 322 os: [darwin] 315 323 316 - '@rollup/rollup-freebsd-arm64@4.46.1': 317 - resolution: {integrity: sha512-n4SLVebZP8uUlJ2r04+g2U/xFeiQlw09Me5UFqny8HGbARl503LNH5CqFTb5U5jNxTouhRjai6qPT0CR5c/Iig==} 324 + '@rollup/rollup-freebsd-arm64@4.53.0': 325 + resolution: {integrity: sha512-4yYPm1PJwK/HKI4FzElAPj2EAAFaaLUWzXV3S3edKy71JcEVzBCpgaXyEcDh3blBIjLml+aMkj6HEVGSuzpz+g==} 318 326 cpu: [arm64] 319 327 os: [freebsd] 320 328 321 - '@rollup/rollup-freebsd-x64@4.46.1': 322 - resolution: {integrity: sha512-8vu9c02F16heTqpvo3yeiu7Vi1REDEC/yES/dIfq3tSXe6mLndiwvYr3AAvd1tMNUqE9yeGYa5w7PRbI5QUV+w==} 329 + '@rollup/rollup-freebsd-x64@4.53.0': 330 + resolution: {integrity: sha512-1SvE5euwWV8JqFc4zEAqHbJbf2yJl00EoHVcnlFqLzjrIExYttLxfZeMDIXY6Yx+bskphrQakpChZKzE2JECEg==} 323 331 cpu: [x64] 324 332 os: [freebsd] 325 333 326 - '@rollup/rollup-linux-arm-gnueabihf@4.46.1': 327 - resolution: {integrity: sha512-K4ncpWl7sQuyp6rWiGUvb6Q18ba8mzM0rjWJ5JgYKlIXAau1db7hZnR0ldJvqKWWJDxqzSLwGUhA4jp+KqgDtQ==} 334 + '@rollup/rollup-linux-arm-gnueabihf@4.53.0': 335 + resolution: {integrity: sha512-9tS4QyfU5NF5CdUugEi7kWbcGD7pbu6Fm8SunuePH6beeQgtcRZ9K9KVwKHEgfBHeeyrr5OvfV1qWs7PMDOf5w==} 328 336 cpu: [arm] 329 337 os: [linux] 330 338 331 - '@rollup/rollup-linux-arm-musleabihf@4.46.1': 332 - resolution: {integrity: sha512-YykPnXsjUjmXE6j6k2QBBGAn1YsJUix7pYaPLK3RVE0bQL2jfdbfykPxfF8AgBlqtYbfEnYHmLXNa6QETjdOjQ==} 339 + '@rollup/rollup-linux-arm-musleabihf@4.53.0': 340 + resolution: {integrity: sha512-U+0ovxGU9bVJIHfW+oALpHd0ho1YDwhj0yHASDzIj+bOeo+VzEpNtHxcjhFab0YcHUorIMoqyxckC98+81oTJw==} 333 341 cpu: [arm] 334 342 os: [linux] 335 343 336 - '@rollup/rollup-linux-arm64-gnu@4.46.1': 337 - 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==} 338 346 cpu: [arm64] 339 347 os: [linux] 340 348 341 - '@rollup/rollup-linux-arm64-musl@4.46.1': 342 - resolution: {integrity: sha512-zzX5nTw1N1plmqC9RGC9vZHFuiM7ZP7oSWQGqpbmfjK7p947D518cVK1/MQudsBdcD84t6k70WNczJOct6+hdg==} 349 + '@rollup/rollup-linux-arm64-musl@4.53.0': 350 + resolution: {integrity: sha512-SuGoAwhsSonrSTEZTiQOGC3+XZfq7rc/qAdAOBrYYIp8pu+Wh4EFFXl6+QYYNbNrHL3DnVoWACLwnfwlTa0neA==} 343 351 cpu: [arm64] 344 352 os: [linux] 345 353 346 - '@rollup/rollup-linux-loongarch64-gnu@4.46.1': 347 - resolution: {integrity: sha512-O8CwgSBo6ewPpktFfSDgB6SJN9XDcPSvuwxfejiddbIC/hn9Tg6Ai0f0eYDf3XvB/+PIWzOQL+7+TZoB8p9Yuw==} 354 + '@rollup/rollup-linux-loong64-gnu@4.53.0': 355 + resolution: {integrity: sha512-EOKej1x0WoePnJWfg7ZbnUqiuiQunshzsKZSIfTHFDiCY9pnsr3Weit1GjcpGnun7H5HuRREqkT2c9CcKxNwSg==} 348 356 cpu: [loong64] 349 357 os: [linux] 350 358 351 - '@rollup/rollup-linux-ppc64-gnu@4.46.1': 352 - resolution: {integrity: sha512-JnCfFVEKeq6G3h3z8e60kAp8Rd7QVnWCtPm7cxx+5OtP80g/3nmPtfdCXbVl063e3KsRnGSKDHUQMydmzc/wBA==} 359 + '@rollup/rollup-linux-ppc64-gnu@4.53.0': 360 + resolution: {integrity: sha512-YAvv2aMFlfiawJ97lutomuehG2Yowd4YgsAqI85XNiMK9eBA1vEMZHt3BShg8cUvak71BM+VFRHddqc+OrRdVA==} 353 361 cpu: [ppc64] 354 362 os: [linux] 355 363 356 - '@rollup/rollup-linux-riscv64-gnu@4.46.1': 357 - resolution: {integrity: sha512-dVxuDqS237eQXkbYzQQfdf/njgeNw6LZuVyEdUaWwRpKHhsLI+y4H/NJV8xJGU19vnOJCVwaBFgr936FHOnJsQ==} 364 + '@rollup/rollup-linux-riscv64-gnu@4.53.0': 365 + resolution: {integrity: sha512-DxZe/sMVaqN+s5kVk3Iq619Rgyl1JCTob7xOLSNC84mbzg3NYTSheqqrtVllYjLYo4wm9YyqjVS57miuzNyXbQ==} 358 366 cpu: [riscv64] 359 367 os: [linux] 360 368 361 - '@rollup/rollup-linux-riscv64-musl@4.46.1': 362 - resolution: {integrity: sha512-CvvgNl2hrZrTR9jXK1ye0Go0HQRT6ohQdDfWR47/KFKiLd5oN5T14jRdUVGF4tnsN8y9oSfMOqH6RuHh+ck8+w==} 369 + '@rollup/rollup-linux-riscv64-musl@4.53.0': 370 + resolution: {integrity: sha512-N7+iZ0jEhwLY1FEsjbCR9lAxIZP0k+3Cghx9vSQWn+rcW8SgN8VcCmwJDoPDaGKTzWWB791U1s79BSLnEhUa0Q==} 363 371 cpu: [riscv64] 364 372 os: [linux] 365 373 366 - '@rollup/rollup-linux-s390x-gnu@4.46.1': 367 - resolution: {integrity: sha512-x7ANt2VOg2565oGHJ6rIuuAon+A8sfe1IeUx25IKqi49OjSr/K3awoNqr9gCwGEJo9OuXlOn+H2p1VJKx1psxA==} 374 + '@rollup/rollup-linux-s390x-gnu@4.53.0': 375 + resolution: {integrity: sha512-MA/NVneZyIskjvXdh2NR9YcPi7eHWBlQOWP2X8OymzyeUEB0JfUpmbKQZngHmOlyleV2IoR5nHIgMSRjLskOnA==} 368 376 cpu: [s390x] 369 377 os: [linux] 370 378 371 - '@rollup/rollup-linux-x64-gnu@4.46.1': 372 - 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==} 373 381 cpu: [x64] 374 382 os: [linux] 375 383 376 - '@rollup/rollup-linux-x64-musl@4.46.1': 377 - resolution: {integrity: sha512-NuvSCbXEKY+NGWHyivzbjSVJi68Xfq1VnIvGmsuXs6TCtveeoDRKutI5vf2ntmNnVq64Q4zInet0UDQ+yMB6tA==} 384 + '@rollup/rollup-linux-x64-musl@4.53.0': 385 + resolution: {integrity: sha512-FoRekOqhRUKbJMsB5LvhQchDeFeNlS6UGUwi0p3860sxE4zE+lp07FnkuR+yQH0rSn6iLXsnr44jnorgl8mGlQ==} 378 386 cpu: [x64] 379 387 os: [linux] 380 388 381 - '@rollup/rollup-win32-arm64-msvc@4.46.1': 382 - 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==} 383 396 cpu: [arm64] 384 397 os: [win32] 385 398 386 - '@rollup/rollup-win32-ia32-msvc@4.46.1': 387 - 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==} 388 401 cpu: [ia32] 389 402 os: [win32] 390 403 391 - '@rollup/rollup-win32-x64-msvc@4.46.1': 392 - resolution: {integrity: sha512-7GVB4luhFmGUNXXJhH2jJwZCFB3pIOixv2E3s17GQHBFUOQaISlt7aGcQgqvCaDSxTZJUzlK/QJ1FN8S94MrzQ==} 404 + '@rollup/rollup-win32-x64-gnu@4.53.0': 405 + resolution: {integrity: sha512-1OrYs0p/deXEFLUW1gvyjIabmsJKY3I/9fCUA1K6demaNc4iEhXDW6RnyPv/BWqb7NRmQ9+i+SKoi1HgJxWcwg==} 393 406 cpu: [x64] 394 407 os: [win32] 395 408 396 - '@tauri-apps/api@2.7.0': 397 - 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] 398 413 399 - '@tauri-apps/cli-darwin-arm64@2.7.1': 400 - resolution: {integrity: sha512-j2NXQN6+08G03xYiyKDKqbCV2Txt+hUKg0a8hYr92AmoCU8fgCjHyva/p16lGFGUG3P2Yu0xiNe1hXL9ZuRMzA==} 414 + '@tauri-apps/api@2.9.0': 415 + resolution: {integrity: sha512-qD5tMjh7utwBk9/5PrTA/aGr3i5QaJ/Mlt7p8NilQ45WgbifUNPyKWsA63iQ8YfQq6R8ajMapU+/Q8nMcPRLNw==} 416 + 417 + '@tauri-apps/cli-darwin-arm64@2.9.3': 418 + resolution: {integrity: sha512-W8FQXZXQmQ0Fmj9UJXNrm2mLdIaLLriKVY7o/FzmizyIKTPIvHjfZALTNybbpTQRbJvKoGHLrW1DNzAWVDWJYg==} 401 419 engines: {node: '>= 10'} 402 420 cpu: [arm64] 403 421 os: [darwin] 404 422 405 - '@tauri-apps/cli-darwin-x64@2.7.1': 406 - resolution: {integrity: sha512-CdYAefeM35zKsc91qIyKzbaO7FhzTyWKsE8hj7tEJ1INYpoh1NeNNyL/NSEA3Nebi5ilugioJ5tRK8ZXG8y3gw==} 423 + '@tauri-apps/cli-darwin-x64@2.9.3': 424 + resolution: {integrity: sha512-zDwu40rlshijt3TU6aRvzPUyVpapsx1sNfOlreDMTaMelQLHl6YoQzSRpLHYwrHrhimxyX2uDqnKIiuGel0Lhg==} 407 425 engines: {node: '>= 10'} 408 426 cpu: [x64] 409 427 os: [darwin] 410 428 411 - '@tauri-apps/cli-linux-arm-gnueabihf@2.7.1': 412 - 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==} 413 431 engines: {node: '>= 10'} 414 432 cpu: [arm] 415 433 os: [linux] 416 434 417 - '@tauri-apps/cli-linux-arm64-gnu@2.7.1': 418 - resolution: {integrity: sha512-FtBW6LJPNRTws3qyUc294AqCWU91l/H0SsFKq6q4Q45MSS4x6wxLxou8zB53tLDGEPx3JSoPLcDaSfPlSbyujQ==} 435 + '@tauri-apps/cli-linux-arm64-gnu@2.9.3': 436 + resolution: {integrity: sha512-59GqU/J1n9wFyAtleoQOaU0oVIo+kwQynEw4meFDoKRXszKGor6lTsbsS3r0QKLSPbc0o/yYGJhqqCtkYjb/eg==} 419 437 engines: {node: '>= 10'} 420 438 cpu: [arm64] 421 439 os: [linux] 422 440 423 - '@tauri-apps/cli-linux-arm64-musl@2.7.1': 424 - 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==} 425 443 engines: {node: '>= 10'} 426 444 cpu: [arm64] 427 445 os: [linux] 428 446 429 - '@tauri-apps/cli-linux-riscv64-gnu@2.7.1': 430 - resolution: {integrity: sha512-GeW5lVI2GhhnaYckiDzstG2j2Jwlud5d2XefRGwlOK+C/bVGLT1le8MNPYK8wgRlpeK8fG1WnJJYD6Ke7YQ8bg==} 447 + '@tauri-apps/cli-linux-riscv64-gnu@2.9.3': 448 + resolution: {integrity: sha512-qV8DZXI/fZwawk6T3Th1g6smiNC2KeQTk7XFgKvqZ6btC01z3UTsQmNGvI602zwm3Ld1TBZb4+rEWu2QmQimmw==} 431 449 engines: {node: '>= 10'} 432 450 cpu: [riscv64] 433 451 os: [linux] 434 452 435 - '@tauri-apps/cli-linux-x64-gnu@2.7.1': 436 - resolution: {integrity: sha512-DprxKQkPxIPYwUgg+cscpv2lcIUhn2nxEPlk0UeaiV9vATxCXyytxr1gLcj3xgjGyNPlM0MlJyYaPy1JmRg1cA==} 453 + '@tauri-apps/cli-linux-x64-gnu@2.9.3': 454 + resolution: {integrity: sha512-tquyEONCNRfqEBWEe4eAHnxFN5yY5lFkCuD4w79XLIovUxVftQ684+xLp7zkhntkt4y20SMj2AgJa/+MOlx4Kg==} 437 455 engines: {node: '>= 10'} 438 456 cpu: [x64] 439 457 os: [linux] 440 458 441 - '@tauri-apps/cli-linux-x64-musl@2.7.1': 442 - 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==} 443 461 engines: {node: '>= 10'} 444 462 cpu: [x64] 445 463 os: [linux] 446 464 447 - '@tauri-apps/cli-win32-arm64-msvc@2.7.1': 448 - 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==} 449 467 engines: {node: '>= 10'} 450 468 cpu: [arm64] 451 469 os: [win32] 452 470 453 - '@tauri-apps/cli-win32-ia32-msvc@2.7.1': 454 - resolution: {integrity: sha512-1oeibfyWQPVcijOrTg709qhbXArjX3x1MPjrmA5anlygwrbByxLBcLXvotcOeULFcnH2FYUMMLLant8kgvwE5A==} 471 + '@tauri-apps/cli-win32-ia32-msvc@2.9.3': 472 + resolution: {integrity: sha512-UsgIwOnpCoY9NK9/65QiwgmWVIE80LE7SwRYVblGtmlY9RYfsYvpbItwsovA/AcHMTiO+OCvS/q9yLeqS3m6Sg==} 455 473 engines: {node: '>= 10'} 456 474 cpu: [ia32] 457 475 os: [win32] 458 476 459 - '@tauri-apps/cli-win32-x64-msvc@2.7.1': 460 - resolution: {integrity: sha512-D7Q9kDObutuirCNLxYQ7KAg2Xxg99AjcdYz/KuMw5HvyEPbkC9Q7JL0vOrQOrHEHxIQ2lYzFOZvKKoC2yyqXcg==} 477 + '@tauri-apps/cli-win32-x64-msvc@2.9.3': 478 + resolution: {integrity: sha512-fmw7NrrHE5m49idCvJAx9T9bsupjdJ0a3p3DPCNCZRGANU6R1tA1L+KTlVuUtdAldX2NqU/9UPo2SCslYKgJHQ==} 461 479 engines: {node: '>= 10'} 462 480 cpu: [x64] 463 481 os: [win32] 464 482 465 - '@tauri-apps/cli@2.7.1': 466 - resolution: {integrity: sha512-RcGWR4jOUEl92w3uvI0h61Llkfj9lwGD1iwvDRD2isMrDhOzjeeeVn9aGzeW1jubQ/kAbMYfydcA4BA0Cy733Q==} 483 + '@tauri-apps/cli@2.9.3': 484 + resolution: {integrity: sha512-BQ7iLUXTQcyG1PpzLWeVSmBCedYDpnA/6Cm/kRFGtqjTf/eVUlyYO5S2ee07tLum3nWwDBWTGFZeruO8yEukfA==} 467 485 engines: {node: '>= 10'} 468 486 hasBin: true 469 487 470 - '@tauri-apps/plugin-opener@2.4.0': 471 - resolution: {integrity: sha512-43VyN8JJtvKWJY72WI/KNZszTpDpzHULFxQs0CJBIYUdCRowQ6Q1feWTDb979N7nldqSuDOaBupZ6wz2nvuWwQ==} 488 + '@tauri-apps/plugin-clipboard-manager@2.3.2': 489 + resolution: {integrity: sha512-CUlb5Hqi2oZbcZf4VUyUH53XWPPdtpw43EUpCza5HWZJwxEoDowFzNUDt1tRUXA8Uq+XPn17Ysfptip33sG4eQ==} 490 + 491 + '@tauri-apps/plugin-dialog@2.4.2': 492 + resolution: {integrity: sha512-lNIn5CZuw8WZOn8zHzmFmDSzg5zfohWoa3mdULP0YFh/VogVdMVWZPcWSHlydsiJhRQYaTNSYKN7RmZKE2lCYQ==} 493 + 494 + '@tauri-apps/plugin-opener@2.5.2': 495 + resolution: {integrity: sha512-ei/yRRoCklWHImwpCcDK3VhNXx+QXM9793aQ64YxpqVF0BDuuIlXhZgiAkc15wnPVav+IbkYhmDJIv5R326Mew==} 496 + 497 + '@tauri-apps/plugin-os@2.3.2': 498 + resolution: {integrity: sha512-n+nXWeuSeF9wcEsSPmRnBEGrRgOy6jjkSU+UVCOV8YUGKb2erhDOxis7IqRXiRVHhY8XMKks00BJ0OAdkpf6+A==} 472 499 473 500 '@types/animejs@3.1.13': 474 501 resolution: {integrity: sha512-yWg9l1z7CAv/TKpty4/vupEh24jDGUZXv4r26StRkpUPQm04ztJaftgpto8vwdFs8SiTq6XfaPKCSI+wjzNMvQ==} ··· 482 509 '@types/babel__template@7.4.4': 483 510 resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 484 511 485 - '@types/babel__traverse@7.20.7': 486 - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} 512 + '@types/babel__traverse@7.28.0': 513 + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} 487 514 488 515 '@types/estree@1.0.8': 489 516 resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 490 517 491 - animejs@4.1.2: 492 - resolution: {integrity: sha512-QojQzHzN4ZCOGk4Seir5CWPHGKFPpMAsen3KEj/BHsIKDceH0xKd3FBWflyKiNefKG2fn3+ofpY9jD/UXhpY6A==} 518 + animejs@4.2.2: 519 + resolution: {integrity: sha512-Ys3RuvLdAeI14fsdKCQy7ytu4057QX6Bb7m4jwmfd6iKmUmLquTwk1ut0e4NtRQgCeq/s2Lv5+oMBjz6c7ZuIg==} 493 520 494 - babel-plugin-jsx-dom-expressions@0.39.8: 495 - 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==} 496 523 peerDependencies: 497 524 '@babel/core': ^7.20.12 498 525 499 - babel-preset-solid@1.9.6: 500 - resolution: {integrity: sha512-HXTK9f93QxoH8dYn1M2mJdOlWgMsR88Lg/ul6QCZGkNTktjTE5HAf93YxQumHoCudLEtZrU1cFCMFOVho6GqFg==} 526 + babel-preset-solid@1.9.10: 527 + resolution: {integrity: sha512-HCelrgua/Y+kqO8RyL04JBWS/cVdrtUv/h45GntgQY+cJl4eBcKkCDV3TdMjtKx1nXwRaR9QXslM/Npm1dxdZQ==} 501 528 peerDependencies: 502 529 '@babel/core': ^7.0.0 530 + solid-js: ^1.9.10 531 + peerDependenciesMeta: 532 + solid-js: 533 + optional: true 503 534 504 - browserslist@4.25.1: 505 - 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==} 506 541 engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 507 542 hasBin: true 508 543 509 - caniuse-lite@1.0.30001731: 510 - resolution: {integrity: sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==} 544 + caniuse-lite@1.0.30001754: 545 + resolution: {integrity: sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==} 511 546 512 547 convert-source-map@2.0.0: 513 548 resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} ··· 515 550 csstype@3.1.3: 516 551 resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 517 552 518 - debug@4.4.1: 519 - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 553 + debug@4.4.3: 554 + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 520 555 engines: {node: '>=6.0'} 521 556 peerDependencies: 522 557 supports-color: '*' ··· 524 559 supports-color: 525 560 optional: true 526 561 527 - electron-to-chromium@1.5.192: 528 - resolution: {integrity: sha512-rP8Ez0w7UNw/9j5eSXCe10o1g/8B1P5SM90PCCMVkIRQn2R0LEHWz4Eh9RnxkniuDe1W0cTSOB3MLlkTGDcuCg==} 562 + electron-to-chromium@1.5.248: 563 + resolution: {integrity: sha512-zsur2yunphlyAO4gIubdJEXCK6KOVvtpiuDfCIqbM9FjcnMYiyn0ICa3hWfPr0nc41zcLWobgy1iL7VvoOyA2Q==} 529 564 530 565 entities@6.0.1: 531 566 resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} 532 567 engines: {node: '>=0.12'} 533 568 534 - esbuild@0.25.8: 535 - resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} 569 + esbuild@0.25.12: 570 + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} 536 571 engines: {node: '>=18'} 537 572 hasBin: true 538 573 ··· 540 575 resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 541 576 engines: {node: '>=6'} 542 577 543 - fdir@6.4.6: 544 - 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'} 545 581 peerDependencies: 546 582 picomatch: ^3 || ^4 547 583 peerDependenciesMeta: ··· 592 628 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 593 629 hasBin: true 594 630 595 - node-releases@2.0.19: 596 - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 631 + node-releases@2.0.27: 632 + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} 597 633 598 634 parse5@7.3.0: 599 635 resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} ··· 609 645 resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 610 646 engines: {node: ^10 || ^12 || >=14} 611 647 612 - rollup@4.46.1: 613 - resolution: {integrity: sha512-33xGNBsDJAkzt0PvninskHlWnTIPgDtTwhg0U38CUoNP/7H6wI2Cz6dUeoNPbjdTdsYTGuiFFASuUOWovH0SyQ==} 648 + rollup@4.53.0: 649 + resolution: {integrity: sha512-43Z5T+4YTdfYkkA6CStU2DUYh7Ha9dLtvK+K3n0yEE/QS+4i28vSxrQsM59KqpvmT4tbOwJsFnRGMj/tvmQwWw==} 614 650 engines: {node: '>=18.0.0', npm: '>=8.0.0'} 615 651 hasBin: true 616 652 ··· 618 654 resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 619 655 hasBin: true 620 656 621 - seroval-plugins@1.3.2: 622 - resolution: {integrity: sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==} 657 + seroval-plugins@1.3.3: 658 + resolution: {integrity: sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==} 623 659 engines: {node: '>=10'} 624 660 peerDependencies: 625 661 seroval: ^1.0 ··· 628 664 resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} 629 665 engines: {node: '>=10'} 630 666 631 - solid-js@1.9.7: 632 - resolution: {integrity: sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw==} 667 + solid-js@1.9.10: 668 + resolution: {integrity: sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew==} 633 669 634 670 solid-refresh@0.6.3: 635 671 resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} ··· 640 676 resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 641 677 engines: {node: '>=0.10.0'} 642 678 643 - tinyglobby@0.2.14: 644 - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} 679 + tinyglobby@0.2.15: 680 + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 645 681 engines: {node: '>=12.0.0'} 646 682 647 683 typescript@5.6.3: ··· 649 685 engines: {node: '>=14.17'} 650 686 hasBin: true 651 687 652 - update-browserslist-db@1.1.3: 653 - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 688 + update-browserslist-db@1.1.4: 689 + resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} 654 690 hasBin: true 655 691 peerDependencies: 656 692 browserslist: '>= 4.21.0' 657 693 658 - validate-html-nesting@1.2.3: 659 - resolution: {integrity: sha512-kdkWdCl6eCeLlRShJKbjVOU2kFKxMF8Ghu50n+crEoyx+VKm3FxAxF9z4DCy6+bbTOqNW0+jcIYRnjoIRzigRw==} 660 - 661 - vite-plugin-solid@2.11.8: 662 - resolution: {integrity: sha512-hFrCxBfv3B1BmFqnJF4JOCYpjrmi/zwyeKjcomQ0khh8HFyQ8SbuBWQ7zGojfrz6HUOBFrJBNySDi/JgAHytWg==} 694 + vite-plugin-solid@2.11.10: 695 + resolution: {integrity: sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw==} 663 696 peerDependencies: 664 697 '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* 665 698 solid-js: ^1.7.2 ··· 668 701 '@testing-library/jest-dom': 669 702 optional: true 670 703 671 - vite@6.3.5: 672 - resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} 704 + vite@6.4.1: 705 + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} 673 706 engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 674 707 hasBin: true 675 708 peerDependencies: ··· 721 754 722 755 snapshots: 723 756 724 - '@ampproject/remapping@2.3.0': 725 - dependencies: 726 - '@jridgewell/gen-mapping': 0.3.12 727 - '@jridgewell/trace-mapping': 0.3.29 728 - 729 757 '@babel/code-frame@7.27.1': 730 758 dependencies: 731 - '@babel/helper-validator-identifier': 7.27.1 759 + '@babel/helper-validator-identifier': 7.28.5 732 760 js-tokens: 4.0.0 733 761 picocolors: 1.1.1 734 762 735 - '@babel/compat-data@7.28.0': {} 763 + '@babel/compat-data@7.28.5': {} 736 764 737 - '@babel/core@7.28.0': 765 + '@babel/core@7.28.5': 738 766 dependencies: 739 - '@ampproject/remapping': 2.3.0 740 767 '@babel/code-frame': 7.27.1 741 - '@babel/generator': 7.28.0 768 + '@babel/generator': 7.28.5 742 769 '@babel/helper-compilation-targets': 7.27.2 743 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) 744 - '@babel/helpers': 7.28.2 745 - '@babel/parser': 7.28.0 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 746 773 '@babel/template': 7.27.2 747 - '@babel/traverse': 7.28.0 748 - '@babel/types': 7.28.2 774 + '@babel/traverse': 7.28.5 775 + '@babel/types': 7.28.5 776 + '@jridgewell/remapping': 2.3.5 749 777 convert-source-map: 2.0.0 750 - debug: 4.4.1 778 + debug: 4.4.3 751 779 gensync: 1.0.0-beta.2 752 780 json5: 2.2.3 753 781 semver: 6.3.1 754 782 transitivePeerDependencies: 755 783 - supports-color 756 784 757 - '@babel/generator@7.28.0': 785 + '@babel/generator@7.28.5': 758 786 dependencies: 759 - '@babel/parser': 7.28.0 760 - '@babel/types': 7.28.2 761 - '@jridgewell/gen-mapping': 0.3.12 762 - '@jridgewell/trace-mapping': 0.3.29 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 763 791 jsesc: 3.1.0 764 792 765 793 '@babel/helper-compilation-targets@7.27.2': 766 794 dependencies: 767 - '@babel/compat-data': 7.28.0 795 + '@babel/compat-data': 7.28.5 768 796 '@babel/helper-validator-option': 7.27.1 769 - browserslist: 4.25.1 797 + browserslist: 4.27.0 770 798 lru-cache: 5.1.1 771 799 semver: 6.3.1 772 800 ··· 774 802 775 803 '@babel/helper-module-imports@7.18.6': 776 804 dependencies: 777 - '@babel/types': 7.28.2 805 + '@babel/types': 7.28.5 778 806 779 807 '@babel/helper-module-imports@7.27.1': 780 808 dependencies: 781 - '@babel/traverse': 7.28.0 782 - '@babel/types': 7.28.2 809 + '@babel/traverse': 7.28.5 810 + '@babel/types': 7.28.5 783 811 transitivePeerDependencies: 784 812 - supports-color 785 813 786 - '@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)': 787 815 dependencies: 788 - '@babel/core': 7.28.0 816 + '@babel/core': 7.28.5 789 817 '@babel/helper-module-imports': 7.27.1 790 - '@babel/helper-validator-identifier': 7.27.1 791 - '@babel/traverse': 7.28.0 818 + '@babel/helper-validator-identifier': 7.28.5 819 + '@babel/traverse': 7.28.5 792 820 transitivePeerDependencies: 793 821 - supports-color 794 822 ··· 796 824 797 825 '@babel/helper-string-parser@7.27.1': {} 798 826 799 - '@babel/helper-validator-identifier@7.27.1': {} 827 + '@babel/helper-validator-identifier@7.28.5': {} 800 828 801 829 '@babel/helper-validator-option@7.27.1': {} 802 830 803 - '@babel/helpers@7.28.2': 831 + '@babel/helpers@7.28.4': 804 832 dependencies: 805 833 '@babel/template': 7.27.2 806 - '@babel/types': 7.28.2 834 + '@babel/types': 7.28.5 807 835 808 - '@babel/parser@7.28.0': 836 + '@babel/parser@7.28.5': 809 837 dependencies: 810 - '@babel/types': 7.28.2 838 + '@babel/types': 7.28.5 811 839 812 - '@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)': 813 841 dependencies: 814 - '@babel/core': 7.28.0 842 + '@babel/core': 7.28.5 815 843 '@babel/helper-plugin-utils': 7.27.1 816 844 817 845 '@babel/template@7.27.2': 818 846 dependencies: 819 847 '@babel/code-frame': 7.27.1 820 - '@babel/parser': 7.28.0 821 - '@babel/types': 7.28.2 848 + '@babel/parser': 7.28.5 849 + '@babel/types': 7.28.5 822 850 823 - '@babel/traverse@7.28.0': 851 + '@babel/traverse@7.28.5': 824 852 dependencies: 825 853 '@babel/code-frame': 7.27.1 826 - '@babel/generator': 7.28.0 854 + '@babel/generator': 7.28.5 827 855 '@babel/helper-globals': 7.28.0 828 - '@babel/parser': 7.28.0 856 + '@babel/parser': 7.28.5 829 857 '@babel/template': 7.27.2 830 - '@babel/types': 7.28.2 831 - debug: 4.4.1 858 + '@babel/types': 7.28.5 859 + debug: 4.4.3 832 860 transitivePeerDependencies: 833 861 - supports-color 834 862 835 - '@babel/types@7.28.2': 863 + '@babel/types@7.28.5': 836 864 dependencies: 837 865 '@babel/helper-string-parser': 7.27.1 838 - '@babel/helper-validator-identifier': 7.27.1 866 + '@babel/helper-validator-identifier': 7.28.5 839 867 840 - '@esbuild/aix-ppc64@0.25.8': 868 + '@esbuild/aix-ppc64@0.25.12': 841 869 optional: true 842 870 843 - '@esbuild/android-arm64@0.25.8': 871 + '@esbuild/android-arm64@0.25.12': 844 872 optional: true 845 873 846 - '@esbuild/android-arm@0.25.8': 874 + '@esbuild/android-arm@0.25.12': 847 875 optional: true 848 876 849 - '@esbuild/android-x64@0.25.8': 877 + '@esbuild/android-x64@0.25.12': 850 878 optional: true 851 879 852 - '@esbuild/darwin-arm64@0.25.8': 880 + '@esbuild/darwin-arm64@0.25.12': 853 881 optional: true 854 882 855 - '@esbuild/darwin-x64@0.25.8': 883 + '@esbuild/darwin-x64@0.25.12': 856 884 optional: true 857 885 858 - '@esbuild/freebsd-arm64@0.25.8': 886 + '@esbuild/freebsd-arm64@0.25.12': 859 887 optional: true 860 888 861 - '@esbuild/freebsd-x64@0.25.8': 889 + '@esbuild/freebsd-x64@0.25.12': 862 890 optional: true 863 891 864 - '@esbuild/linux-arm64@0.25.8': 892 + '@esbuild/linux-arm64@0.25.12': 865 893 optional: true 866 894 867 - '@esbuild/linux-arm@0.25.8': 895 + '@esbuild/linux-arm@0.25.12': 868 896 optional: true 869 897 870 - '@esbuild/linux-ia32@0.25.8': 898 + '@esbuild/linux-ia32@0.25.12': 871 899 optional: true 872 900 873 - '@esbuild/linux-loong64@0.25.8': 901 + '@esbuild/linux-loong64@0.25.12': 874 902 optional: true 875 903 876 - '@esbuild/linux-mips64el@0.25.8': 904 + '@esbuild/linux-mips64el@0.25.12': 877 905 optional: true 878 906 879 - '@esbuild/linux-ppc64@0.25.8': 907 + '@esbuild/linux-ppc64@0.25.12': 880 908 optional: true 881 909 882 - '@esbuild/linux-riscv64@0.25.8': 910 + '@esbuild/linux-riscv64@0.25.12': 883 911 optional: true 884 912 885 - '@esbuild/linux-s390x@0.25.8': 913 + '@esbuild/linux-s390x@0.25.12': 886 914 optional: true 887 915 888 - '@esbuild/linux-x64@0.25.8': 916 + '@esbuild/linux-x64@0.25.12': 889 917 optional: true 890 918 891 - '@esbuild/netbsd-arm64@0.25.8': 919 + '@esbuild/netbsd-arm64@0.25.12': 892 920 optional: true 893 921 894 - '@esbuild/netbsd-x64@0.25.8': 922 + '@esbuild/netbsd-x64@0.25.12': 895 923 optional: true 896 924 897 - '@esbuild/openbsd-arm64@0.25.8': 925 + '@esbuild/openbsd-arm64@0.25.12': 898 926 optional: true 899 927 900 - '@esbuild/openbsd-x64@0.25.8': 928 + '@esbuild/openbsd-x64@0.25.12': 901 929 optional: true 902 930 903 - '@esbuild/openharmony-arm64@0.25.8': 931 + '@esbuild/openharmony-arm64@0.25.12': 904 932 optional: true 905 933 906 - '@esbuild/sunos-x64@0.25.8': 934 + '@esbuild/sunos-x64@0.25.12': 907 935 optional: true 908 936 909 - '@esbuild/win32-arm64@0.25.8': 937 + '@esbuild/win32-arm64@0.25.12': 910 938 optional: true 911 939 912 - '@esbuild/win32-ia32@0.25.8': 940 + '@esbuild/win32-ia32@0.25.12': 913 941 optional: true 914 942 915 - '@esbuild/win32-x64@0.25.8': 943 + '@esbuild/win32-x64@0.25.12': 916 944 optional: true 917 945 918 - '@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': 919 952 dependencies: 920 - '@jridgewell/sourcemap-codec': 1.5.4 921 - '@jridgewell/trace-mapping': 0.3.29 953 + '@jridgewell/gen-mapping': 0.3.13 954 + '@jridgewell/trace-mapping': 0.3.31 922 955 923 956 '@jridgewell/resolve-uri@3.1.2': {} 924 957 925 - '@jridgewell/sourcemap-codec@1.5.4': {} 958 + '@jridgewell/sourcemap-codec@1.5.5': {} 926 959 927 - '@jridgewell/trace-mapping@0.3.29': 960 + '@jridgewell/trace-mapping@0.3.31': 928 961 dependencies: 929 962 '@jridgewell/resolve-uri': 3.1.2 930 - '@jridgewell/sourcemap-codec': 1.5.4 963 + '@jridgewell/sourcemap-codec': 1.5.5 931 964 932 - '@rollup/rollup-android-arm-eabi@4.46.1': 965 + '@rollup/rollup-android-arm-eabi@4.53.0': 933 966 optional: true 934 967 935 - '@rollup/rollup-android-arm64@4.46.1': 968 + '@rollup/rollup-android-arm64@4.53.0': 936 969 optional: true 937 970 938 - '@rollup/rollup-darwin-arm64@4.46.1': 971 + '@rollup/rollup-darwin-arm64@4.53.0': 939 972 optional: true 940 973 941 - '@rollup/rollup-darwin-x64@4.46.1': 974 + '@rollup/rollup-darwin-x64@4.53.0': 942 975 optional: true 943 976 944 - '@rollup/rollup-freebsd-arm64@4.46.1': 977 + '@rollup/rollup-freebsd-arm64@4.53.0': 945 978 optional: true 946 979 947 - '@rollup/rollup-freebsd-x64@4.46.1': 980 + '@rollup/rollup-freebsd-x64@4.53.0': 948 981 optional: true 949 982 950 - '@rollup/rollup-linux-arm-gnueabihf@4.46.1': 983 + '@rollup/rollup-linux-arm-gnueabihf@4.53.0': 951 984 optional: true 952 985 953 - '@rollup/rollup-linux-arm-musleabihf@4.46.1': 986 + '@rollup/rollup-linux-arm-musleabihf@4.53.0': 954 987 optional: true 955 988 956 - '@rollup/rollup-linux-arm64-gnu@4.46.1': 989 + '@rollup/rollup-linux-arm64-gnu@4.53.0': 957 990 optional: true 958 991 959 - '@rollup/rollup-linux-arm64-musl@4.46.1': 992 + '@rollup/rollup-linux-arm64-musl@4.53.0': 960 993 optional: true 961 994 962 - '@rollup/rollup-linux-loongarch64-gnu@4.46.1': 995 + '@rollup/rollup-linux-loong64-gnu@4.53.0': 963 996 optional: true 964 997 965 - '@rollup/rollup-linux-ppc64-gnu@4.46.1': 998 + '@rollup/rollup-linux-ppc64-gnu@4.53.0': 966 999 optional: true 967 1000 968 - '@rollup/rollup-linux-riscv64-gnu@4.46.1': 1001 + '@rollup/rollup-linux-riscv64-gnu@4.53.0': 969 1002 optional: true 970 1003 971 - '@rollup/rollup-linux-riscv64-musl@4.46.1': 1004 + '@rollup/rollup-linux-riscv64-musl@4.53.0': 972 1005 optional: true 973 1006 974 - '@rollup/rollup-linux-s390x-gnu@4.46.1': 1007 + '@rollup/rollup-linux-s390x-gnu@4.53.0': 975 1008 optional: true 976 1009 977 - '@rollup/rollup-linux-x64-gnu@4.46.1': 1010 + '@rollup/rollup-linux-x64-gnu@4.53.0': 978 1011 optional: true 979 1012 980 - '@rollup/rollup-linux-x64-musl@4.46.1': 1013 + '@rollup/rollup-linux-x64-musl@4.53.0': 981 1014 optional: true 982 1015 983 - '@rollup/rollup-win32-arm64-msvc@4.46.1': 1016 + '@rollup/rollup-openharmony-arm64@4.53.0': 1017 + optional: true 1018 + 1019 + '@rollup/rollup-win32-arm64-msvc@4.53.0': 1020 + optional: true 1021 + 1022 + '@rollup/rollup-win32-ia32-msvc@4.53.0': 984 1023 optional: true 985 1024 986 - '@rollup/rollup-win32-ia32-msvc@4.46.1': 1025 + '@rollup/rollup-win32-x64-gnu@4.53.0': 987 1026 optional: true 988 1027 989 - '@rollup/rollup-win32-x64-msvc@4.46.1': 1028 + '@rollup/rollup-win32-x64-msvc@4.53.0': 990 1029 optional: true 991 1030 992 - '@tauri-apps/api@2.7.0': {} 1031 + '@tauri-apps/api@2.9.0': {} 993 1032 994 - '@tauri-apps/cli-darwin-arm64@2.7.1': 1033 + '@tauri-apps/cli-darwin-arm64@2.9.3': 995 1034 optional: true 996 1035 997 - '@tauri-apps/cli-darwin-x64@2.7.1': 1036 + '@tauri-apps/cli-darwin-x64@2.9.3': 998 1037 optional: true 999 1038 1000 - '@tauri-apps/cli-linux-arm-gnueabihf@2.7.1': 1039 + '@tauri-apps/cli-linux-arm-gnueabihf@2.9.3': 1001 1040 optional: true 1002 1041 1003 - '@tauri-apps/cli-linux-arm64-gnu@2.7.1': 1042 + '@tauri-apps/cli-linux-arm64-gnu@2.9.3': 1004 1043 optional: true 1005 1044 1006 - '@tauri-apps/cli-linux-arm64-musl@2.7.1': 1045 + '@tauri-apps/cli-linux-arm64-musl@2.9.3': 1007 1046 optional: true 1008 1047 1009 - '@tauri-apps/cli-linux-riscv64-gnu@2.7.1': 1048 + '@tauri-apps/cli-linux-riscv64-gnu@2.9.3': 1010 1049 optional: true 1011 1050 1012 - '@tauri-apps/cli-linux-x64-gnu@2.7.1': 1051 + '@tauri-apps/cli-linux-x64-gnu@2.9.3': 1013 1052 optional: true 1014 1053 1015 - '@tauri-apps/cli-linux-x64-musl@2.7.1': 1054 + '@tauri-apps/cli-linux-x64-musl@2.9.3': 1016 1055 optional: true 1017 1056 1018 - '@tauri-apps/cli-win32-arm64-msvc@2.7.1': 1057 + '@tauri-apps/cli-win32-arm64-msvc@2.9.3': 1019 1058 optional: true 1020 1059 1021 - '@tauri-apps/cli-win32-ia32-msvc@2.7.1': 1060 + '@tauri-apps/cli-win32-ia32-msvc@2.9.3': 1022 1061 optional: true 1023 1062 1024 - '@tauri-apps/cli-win32-x64-msvc@2.7.1': 1063 + '@tauri-apps/cli-win32-x64-msvc@2.9.3': 1025 1064 optional: true 1026 1065 1027 - '@tauri-apps/cli@2.7.1': 1066 + '@tauri-apps/cli@2.9.3': 1028 1067 optionalDependencies: 1029 - '@tauri-apps/cli-darwin-arm64': 2.7.1 1030 - '@tauri-apps/cli-darwin-x64': 2.7.1 1031 - '@tauri-apps/cli-linux-arm-gnueabihf': 2.7.1 1032 - '@tauri-apps/cli-linux-arm64-gnu': 2.7.1 1033 - '@tauri-apps/cli-linux-arm64-musl': 2.7.1 1034 - '@tauri-apps/cli-linux-riscv64-gnu': 2.7.1 1035 - '@tauri-apps/cli-linux-x64-gnu': 2.7.1 1036 - '@tauri-apps/cli-linux-x64-musl': 2.7.1 1037 - '@tauri-apps/cli-win32-arm64-msvc': 2.7.1 1038 - '@tauri-apps/cli-win32-ia32-msvc': 2.7.1 1039 - '@tauri-apps/cli-win32-x64-msvc': 2.7.1 1068 + '@tauri-apps/cli-darwin-arm64': 2.9.3 1069 + '@tauri-apps/cli-darwin-x64': 2.9.3 1070 + '@tauri-apps/cli-linux-arm-gnueabihf': 2.9.3 1071 + '@tauri-apps/cli-linux-arm64-gnu': 2.9.3 1072 + '@tauri-apps/cli-linux-arm64-musl': 2.9.3 1073 + '@tauri-apps/cli-linux-riscv64-gnu': 2.9.3 1074 + '@tauri-apps/cli-linux-x64-gnu': 2.9.3 1075 + '@tauri-apps/cli-linux-x64-musl': 2.9.3 1076 + '@tauri-apps/cli-win32-arm64-msvc': 2.9.3 1077 + '@tauri-apps/cli-win32-ia32-msvc': 2.9.3 1078 + '@tauri-apps/cli-win32-x64-msvc': 2.9.3 1079 + 1080 + '@tauri-apps/plugin-clipboard-manager@2.3.2': 1081 + dependencies: 1082 + '@tauri-apps/api': 2.9.0 1083 + 1084 + '@tauri-apps/plugin-dialog@2.4.2': 1085 + dependencies: 1086 + '@tauri-apps/api': 2.9.0 1087 + 1088 + '@tauri-apps/plugin-opener@2.5.2': 1089 + dependencies: 1090 + '@tauri-apps/api': 2.9.0 1040 1091 1041 - '@tauri-apps/plugin-opener@2.4.0': 1092 + '@tauri-apps/plugin-os@2.3.2': 1042 1093 dependencies: 1043 - '@tauri-apps/api': 2.7.0 1094 + '@tauri-apps/api': 2.9.0 1044 1095 1045 1096 '@types/animejs@3.1.13': {} 1046 1097 1047 1098 '@types/babel__core@7.20.5': 1048 1099 dependencies: 1049 - '@babel/parser': 7.28.0 1050 - '@babel/types': 7.28.2 1100 + '@babel/parser': 7.28.5 1101 + '@babel/types': 7.28.5 1051 1102 '@types/babel__generator': 7.27.0 1052 1103 '@types/babel__template': 7.4.4 1053 - '@types/babel__traverse': 7.20.7 1104 + '@types/babel__traverse': 7.28.0 1054 1105 1055 1106 '@types/babel__generator@7.27.0': 1056 1107 dependencies: 1057 - '@babel/types': 7.28.2 1108 + '@babel/types': 7.28.5 1058 1109 1059 1110 '@types/babel__template@7.4.4': 1060 1111 dependencies: 1061 - '@babel/parser': 7.28.0 1062 - '@babel/types': 7.28.2 1112 + '@babel/parser': 7.28.5 1113 + '@babel/types': 7.28.5 1063 1114 1064 - '@types/babel__traverse@7.20.7': 1115 + '@types/babel__traverse@7.28.0': 1065 1116 dependencies: 1066 - '@babel/types': 7.28.2 1117 + '@babel/types': 7.28.5 1067 1118 1068 1119 '@types/estree@1.0.8': {} 1069 1120 1070 - animejs@4.1.2: {} 1121 + animejs@4.2.2: {} 1071 1122 1072 - 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): 1073 1124 dependencies: 1074 - '@babel/core': 7.28.0 1125 + '@babel/core': 7.28.5 1075 1126 '@babel/helper-module-imports': 7.18.6 1076 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) 1077 - '@babel/types': 7.28.2 1127 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) 1128 + '@babel/types': 7.28.5 1078 1129 html-entities: 2.3.3 1079 1130 parse5: 7.3.0 1080 - validate-html-nesting: 1.2.3 1081 1131 1082 - 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): 1083 1133 dependencies: 1084 - '@babel/core': 7.28.0 1085 - 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 1086 1138 1087 - browserslist@4.25.1: 1139 + baseline-browser-mapping@2.8.25: {} 1140 + 1141 + browserslist@4.27.0: 1088 1142 dependencies: 1089 - caniuse-lite: 1.0.30001731 1090 - electron-to-chromium: 1.5.192 1091 - node-releases: 2.0.19 1092 - update-browserslist-db: 1.1.3(browserslist@4.25.1) 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) 1093 1148 1094 - caniuse-lite@1.0.30001731: {} 1149 + caniuse-lite@1.0.30001754: {} 1095 1150 1096 1151 convert-source-map@2.0.0: {} 1097 1152 1098 1153 csstype@3.1.3: {} 1099 1154 1100 - debug@4.4.1: 1155 + debug@4.4.3: 1101 1156 dependencies: 1102 1157 ms: 2.1.3 1103 1158 1104 - electron-to-chromium@1.5.192: {} 1159 + electron-to-chromium@1.5.248: {} 1105 1160 1106 1161 entities@6.0.1: {} 1107 1162 1108 - esbuild@0.25.8: 1163 + esbuild@0.25.12: 1109 1164 optionalDependencies: 1110 - '@esbuild/aix-ppc64': 0.25.8 1111 - '@esbuild/android-arm': 0.25.8 1112 - '@esbuild/android-arm64': 0.25.8 1113 - '@esbuild/android-x64': 0.25.8 1114 - '@esbuild/darwin-arm64': 0.25.8 1115 - '@esbuild/darwin-x64': 0.25.8 1116 - '@esbuild/freebsd-arm64': 0.25.8 1117 - '@esbuild/freebsd-x64': 0.25.8 1118 - '@esbuild/linux-arm': 0.25.8 1119 - '@esbuild/linux-arm64': 0.25.8 1120 - '@esbuild/linux-ia32': 0.25.8 1121 - '@esbuild/linux-loong64': 0.25.8 1122 - '@esbuild/linux-mips64el': 0.25.8 1123 - '@esbuild/linux-ppc64': 0.25.8 1124 - '@esbuild/linux-riscv64': 0.25.8 1125 - '@esbuild/linux-s390x': 0.25.8 1126 - '@esbuild/linux-x64': 0.25.8 1127 - '@esbuild/netbsd-arm64': 0.25.8 1128 - '@esbuild/netbsd-x64': 0.25.8 1129 - '@esbuild/openbsd-arm64': 0.25.8 1130 - '@esbuild/openbsd-x64': 0.25.8 1131 - '@esbuild/openharmony-arm64': 0.25.8 1132 - '@esbuild/sunos-x64': 0.25.8 1133 - '@esbuild/win32-arm64': 0.25.8 1134 - '@esbuild/win32-ia32': 0.25.8 1135 - '@esbuild/win32-x64': 0.25.8 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 1136 1191 1137 1192 escalade@3.2.0: {} 1138 1193 1139 - fdir@6.4.6(picomatch@4.0.3): 1194 + fdir@6.5.0(picomatch@4.0.3): 1140 1195 optionalDependencies: 1141 1196 picomatch: 4.0.3 1142 1197 ··· 1167 1222 1168 1223 nanoid@3.3.11: {} 1169 1224 1170 - node-releases@2.0.19: {} 1225 + node-releases@2.0.27: {} 1171 1226 1172 1227 parse5@7.3.0: 1173 1228 dependencies: ··· 1183 1238 picocolors: 1.1.1 1184 1239 source-map-js: 1.2.1 1185 1240 1186 - rollup@4.46.1: 1241 + rollup@4.53.0: 1187 1242 dependencies: 1188 1243 '@types/estree': 1.0.8 1189 1244 optionalDependencies: 1190 - '@rollup/rollup-android-arm-eabi': 4.46.1 1191 - '@rollup/rollup-android-arm64': 4.46.1 1192 - '@rollup/rollup-darwin-arm64': 4.46.1 1193 - '@rollup/rollup-darwin-x64': 4.46.1 1194 - '@rollup/rollup-freebsd-arm64': 4.46.1 1195 - '@rollup/rollup-freebsd-x64': 4.46.1 1196 - '@rollup/rollup-linux-arm-gnueabihf': 4.46.1 1197 - '@rollup/rollup-linux-arm-musleabihf': 4.46.1 1198 - '@rollup/rollup-linux-arm64-gnu': 4.46.1 1199 - '@rollup/rollup-linux-arm64-musl': 4.46.1 1200 - '@rollup/rollup-linux-loongarch64-gnu': 4.46.1 1201 - '@rollup/rollup-linux-ppc64-gnu': 4.46.1 1202 - '@rollup/rollup-linux-riscv64-gnu': 4.46.1 1203 - '@rollup/rollup-linux-riscv64-musl': 4.46.1 1204 - '@rollup/rollup-linux-s390x-gnu': 4.46.1 1205 - '@rollup/rollup-linux-x64-gnu': 4.46.1 1206 - '@rollup/rollup-linux-x64-musl': 4.46.1 1207 - '@rollup/rollup-win32-arm64-msvc': 4.46.1 1208 - '@rollup/rollup-win32-ia32-msvc': 4.46.1 1209 - '@rollup/rollup-win32-x64-msvc': 4.46.1 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 1210 1267 fsevents: 2.3.3 1211 1268 1212 1269 semver@6.3.1: {} 1213 1270 1214 - seroval-plugins@1.3.2(seroval@1.3.2): 1271 + seroval-plugins@1.3.3(seroval@1.3.2): 1215 1272 dependencies: 1216 1273 seroval: 1.3.2 1217 1274 1218 1275 seroval@1.3.2: {} 1219 1276 1220 - solid-js@1.9.7: 1277 + solid-js@1.9.10: 1221 1278 dependencies: 1222 1279 csstype: 3.1.3 1223 1280 seroval: 1.3.2 1224 - seroval-plugins: 1.3.2(seroval@1.3.2) 1281 + seroval-plugins: 1.3.3(seroval@1.3.2) 1225 1282 1226 - solid-refresh@0.6.3(solid-js@1.9.7): 1283 + solid-refresh@0.6.3(solid-js@1.9.10): 1227 1284 dependencies: 1228 - '@babel/generator': 7.28.0 1285 + '@babel/generator': 7.28.5 1229 1286 '@babel/helper-module-imports': 7.27.1 1230 - '@babel/types': 7.28.2 1231 - solid-js: 1.9.7 1287 + '@babel/types': 7.28.5 1288 + solid-js: 1.9.10 1232 1289 transitivePeerDependencies: 1233 1290 - supports-color 1234 1291 1235 1292 source-map-js@1.2.1: {} 1236 1293 1237 - tinyglobby@0.2.14: 1294 + tinyglobby@0.2.15: 1238 1295 dependencies: 1239 - fdir: 6.4.6(picomatch@4.0.3) 1296 + fdir: 6.5.0(picomatch@4.0.3) 1240 1297 picomatch: 4.0.3 1241 1298 1242 1299 typescript@5.6.3: {} 1243 1300 1244 - update-browserslist-db@1.1.3(browserslist@4.25.1): 1301 + update-browserslist-db@1.1.4(browserslist@4.27.0): 1245 1302 dependencies: 1246 - browserslist: 4.25.1 1303 + browserslist: 4.27.0 1247 1304 escalade: 3.2.0 1248 1305 picocolors: 1.1.1 1249 1306 1250 - validate-html-nesting@1.2.3: {} 1251 - 1252 - 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): 1253 1308 dependencies: 1254 - '@babel/core': 7.28.0 1309 + '@babel/core': 7.28.5 1255 1310 '@types/babel__core': 7.20.5 1256 - 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) 1257 1312 merge-anything: 5.1.7 1258 - solid-js: 1.9.7 1259 - solid-refresh: 0.6.3(solid-js@1.9.7) 1260 - vite: 6.3.5 1261 - vitefu: 1.1.1(vite@6.3.5) 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) 1262 1317 transitivePeerDependencies: 1263 1318 - supports-color 1264 1319 1265 - vite@6.3.5: 1320 + vite@6.4.1: 1266 1321 dependencies: 1267 - esbuild: 0.25.8 1268 - fdir: 6.4.6(picomatch@4.0.3) 1322 + esbuild: 0.25.12 1323 + fdir: 6.5.0(picomatch@4.0.3) 1269 1324 picomatch: 4.0.3 1270 1325 postcss: 8.5.6 1271 - rollup: 4.46.1 1272 - tinyglobby: 0.2.14 1326 + rollup: 4.53.0 1327 + tinyglobby: 0.2.15 1273 1328 optionalDependencies: 1274 1329 fsevents: 2.3.3 1275 1330 1276 - vitefu@1.1.1(vite@6.3.5): 1331 + vitefu@1.1.1(vite@6.4.1): 1277 1332 optionalDependencies: 1278 - vite: 6.3.5 1333 + vite: 6.4.1 1279 1334 1280 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/floppy-disk-solid-full.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path fill="#fff" d="M160 96C124.7 96 96 124.7 96 160L96 480C96 515.3 124.7 544 160 544L480 544C515.3 544 544 515.3 544 480L544 237.3C544 220.3 537.3 204 525.3 192L448 114.7C436 102.7 419.7 96 402.7 96L160 96zM192 192C192 174.3 206.3 160 224 160L384 160C401.7 160 416 174.3 416 192L416 256C416 273.7 401.7 288 384 288L224 288C206.3 288 192 273.7 192 256L192 192zM320 352C355.3 352 384 380.7 384 416C384 451.3 355.3 480 320 480C284.7 480 256 451.3 256 416C256 380.7 284.7 352 320 352z"/></svg>
+1
public/assets/icons/gear-solid-full.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path fill="#fff" d="M259.1 73.5C262.1 58.7 275.2 48 290.4 48L350.2 48C365.4 48 378.5 58.7 381.5 73.5L396 143.5C410.1 149.5 423.3 157.2 435.3 166.3L503.1 143.8C517.5 139 533.3 145 540.9 158.2L570.8 210C578.4 223.2 575.7 239.8 564.3 249.9L511 297.3C511.9 304.7 512.3 312.3 512.3 320C512.3 327.7 511.8 335.3 511 342.7L564.4 390.2C575.8 400.3 578.4 417 570.9 430.1L541 481.9C533.4 495 517.6 501.1 503.2 496.3L435.4 473.8C423.3 482.9 410.1 490.5 396.1 496.6L381.7 566.5C378.6 581.4 365.5 592 350.4 592L290.6 592C275.4 592 262.3 581.3 259.3 566.5L244.9 496.6C230.8 490.6 217.7 482.9 205.6 473.8L137.5 496.3C123.1 501.1 107.3 495.1 99.7 481.9L69.8 430.1C62.2 416.9 64.9 400.3 76.3 390.2L129.7 342.7C128.8 335.3 128.4 327.7 128.4 320C128.4 312.3 128.9 304.7 129.7 297.3L76.3 249.8C64.9 239.7 62.3 223 69.8 209.9L99.7 158.1C107.3 144.9 123.1 138.9 137.5 143.7L205.3 166.2C217.4 157.1 230.6 149.5 244.6 143.4L259.1 73.5zM320.3 400C364.5 399.8 400.2 363.9 400 319.7C399.8 275.5 363.9 239.8 319.7 240C275.5 240.2 239.8 276.1 240 320.3C240.2 364.5 276.1 400.2 320.3 400z"/></svg>
+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;
+158 -53
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"; ··· 10 10 import { ContextMenu } from "./structs/ContextMenu"; 11 11 import { NodeManager } from "./Mangers/NodeManager"; 12 12 import { TabMenu } from "./components/TabMenu"; 13 + import { ConfirmationPopup } from "./components/ConfirmationPopup"; 14 + 15 + import * as keybinds from './keybinds'; 16 + import { listen } from "@tauri-apps/api/event"; 17 + 18 + // TODO: Only allow one node to input on non-flow inputs 13 19 14 20 let App = () => { 15 - // TODO: Delete selected node when delete key is pressed 16 - // TODO: Add undo / redo -ing 17 - let [ selectedNode, setSelectedNode ] = createSignal<Node | null>(null); 21 + let [ selectedNodes, setSelectedNodes ] = createSignal<Node[]>([], { equals: false }); 22 + let [ mousePos, setMousePos ] = createSignal<[ number, number ]>([ 0, 0 ]); 18 23 19 24 let canvas!: HTMLCanvasElement; 20 25 let ctx: CanvasRenderingContext2D; ··· 55 60 visible: false 56 61 } 57 62 58 - onMount(() => { 59 - 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([])); 60 75 61 76 ctx = canvas.getContext('2d')!; 62 77 ··· 99 114 } 100 115 101 116 if(clickedNode){ 102 - contextMenu.items = NodeContextMenu(clickedNode); 117 + contextMenu.items = NodeContextMenu(clickedNode, selectedNodes, setSelectedNodes); 103 118 } else{ 104 119 contextMenu.items = CanvasContextMenu; 105 120 } ··· 108 123 contextMenu.visible = true; 109 124 } 110 125 126 + let isShiftClick = false; 111 127 canvas.onmousedown = ( e ) => { 128 + isShiftClick = e.shiftKey; 129 + 112 130 if( 113 131 e.clientY < 60 || 114 132 e.clientX < 220 || ··· 154 172 155 173 if(nodes){ 156 174 nodes.map(node => { 157 - node.selected = false; 158 - 159 175 if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 160 176 e.clientX, e.clientY, 161 - node.x, node.y, node.w, node.h 177 + node.x - 20, node.y, node.w + 40, node.h 162 178 )){ 163 179 node.outputs.map(( output, i ) => { 164 180 if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 165 181 e.clientX, e.clientY, 166 - node.x + (node.w - 30), 182 + node.x + (node.w - 10), 167 183 node.y + 50 + (30 * i), 168 184 20, 20 169 185 )){ 170 186 output.index = i; 171 187 172 - 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 + ]; 173 192 drawingFrom = output; 174 193 175 194 isDrawing = true; ··· 180 199 node.inputs.map(( input, i ) => { 181 200 if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 182 201 e.clientX, e.clientY, 183 - node.x + 10, 202 + node.x - 10, 184 203 node.y + 50 + (30 * i), 185 204 20, 20 186 205 )){ ··· 211 230 212 231 movingNode = clickedNode; 213 232 214 - if(clickedNode){ 215 - clickedNode.selected = true; 216 - setSelectedNode(clickedNode); 217 - } 218 - 219 233 isMouseDown = true; 220 234 mouseStartPos = [ e.clientX, e.clientY ]; 235 + mouseMovePos = [ e.clientX, e.clientY ]; 221 236 } 222 237 223 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 + 224 274 if(isMouseDown){ 225 275 if(isDrawing){ 226 276 drawingTo = screenToWorldSpace(canvas, { x: offset[0], y: offset[1], scale }, e.clientX - 10 * scale, e.clientY - 10 * scale) as [ number, number ]; 227 277 } else if(movingNode){ 228 - movingNode.x = movingNode.x - (mouseStartPos[0] - e.clientX) / scale; 229 - movingNode.y = movingNode.y - (mouseStartPos[1] - e.clientY) / scale; 278 + let nodes = selectedNodes(); 230 279 231 - mouseStartPos = [ e.clientX, e.clientY ]; 280 + for(let node of nodes){ 281 + node.x = node.x - (mouseMovePos[0] - e.clientX) / scale; 282 + node.y = node.y - (mouseMovePos[1] - e.clientY) / scale; 283 + } 284 + 285 + mouseMovePos = [ e.clientX, e.clientY ]; 232 286 NodeManager.Instance.UpdateConfig(); 233 287 } else{ 234 - offsetTarget = [ offsetTarget[0] - (mouseStartPos[0] - e.clientX) / scale, offsetTarget[1] - (mouseStartPos[1] - e.clientY) / scale ]; 235 - 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 ]; 236 290 237 291 screenMoved = true; 238 292 } ··· 276 330 277 331 canvas.onmouseup = ( e ) => { 278 332 let nodes = NodeManager.Instance.GetNodes(); 333 + let clickedNode; 279 334 280 335 if(nodes){ 281 336 nodes.map(node => { 282 - node.inputs.map(( input, i ) => { 283 - if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 284 - e.clientX, e.clientY, 285 - node.x + 10, 286 - node.y + 50 + (30 * i), 287 - 20, 20 288 - )){ 289 - if(isDrawing){ 290 - let fromType = NodeIOResolveAnyTypes(drawingFrom!); 291 - 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); 292 353 293 - if( 294 - drawingFrom!.connections.indexOf(input) === -1 && 295 - ( 296 - toType === null || 297 - fromType === toType 298 - ) 299 - ){ 300 - drawingFrom!.connections.push(input); 301 - 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!); 302 363 303 - NodeManager.Instance.UpdateConfig(); 364 + NodeManager.Instance.UpdateConfig(); 365 + } 304 366 } 305 367 } 306 - } 307 - }) 368 + }) 369 + } 308 370 }) 309 371 } 310 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 + 311 403 isDrawing = false; 312 404 isMouseDown = false; 313 405 } 314 406 407 + keybinds.load(canvas, mousePos, selectedNodes, setSelectedNodes); 315 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 + }); 316 425 }); 317 426 318 427 let update = () => { 319 428 if(stopRender)return; 320 - 321 429 scale = lerp(scale, targetScale, 0.25); 322 430 323 431 offset[0] = lerp(offset[0], offsetTarget[0], 0.5); ··· 342 450 343 451 let isMouseDown = false; 344 452 let mouseStartPos = [ 0, 0 ]; 453 + let mouseMovePos = [ 0, 0 ]; 345 454 346 455 let interval = setInterval(() => { 347 456 if(screenMoved){ ··· 351 460 } 352 461 }, 1000); 353 462 354 - onCleanup(() => { 355 - stopRender = true; 356 - window.clearInterval(interval); 357 - }); 358 - 359 463 return ( 360 464 <> 465 + <ConfirmationPopup /> 361 466 <TabMenu /> 362 - <ControlBar node={selectedNode} lockMovement={( lock ) => lockMovement = lock} /> 467 + <ControlBar node={selectedNodes} lockMovement={( lock ) => lockMovement = lock} /> 363 468 <canvas ref={canvas}/> 364 469 </> 365 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
+47
src/Mangers/ConfirmationManager.tsx
··· 1 + import { Accessor, createSignal, Setter } from "solid-js"; 2 + 3 + export interface ConfirmationPopupButton{ 4 + text: string, 5 + callback: () => void 6 + } 7 + 8 + export class ConfirmationManager{ 9 + public static Instance: ConfirmationManager; 10 + 11 + private _setText: Setter<string>; 12 + public Text: Accessor<string>; 13 + 14 + private _setBody: Setter<string>; 15 + public Body: Accessor<string>; 16 + 17 + private _setButtons: Setter<ConfirmationPopupButton[]>; 18 + public Buttons: Accessor<ConfirmationPopupButton[]>; 19 + 20 + private _setShown: Setter<boolean>; 21 + public Shown: Accessor<boolean>; 22 + 23 + constructor(){ 24 + ConfirmationManager.Instance = this; 25 + 26 + [ this.Text, this._setText ] = createSignal(''); 27 + [ this.Body, this._setBody ] = createSignal(''); 28 + [ this.Buttons, this._setButtons ] = createSignal<ConfirmationPopupButton[]>([]); 29 + [ this.Shown, this._setShown ] = createSignal(false); 30 + } 31 + 32 + public ShowConfirmation( text: string, body: string, buttons: ConfirmationPopupButton[] ): boolean{ 33 + if(this.Shown())return false; 34 + 35 + this._setShown(true); 36 + 37 + this._setText(text); 38 + this._setBody(body); 39 + this._setButtons(buttons); 40 + 41 + return true; 42 + } 43 + 44 + public CancelConfirmation(){ 45 + this._setShown(false); 46 + } 47 + }
+200 -40
src/Mangers/NodeManager.tsx
··· 5 5 import { listen } from "@tauri-apps/api/event"; 6 6 import { getVersion } from "@tauri-apps/api/app"; 7 7 import { NodesByID } from "../Nodes/Nodes"; 8 + import { save } from "@tauri-apps/plugin-dialog"; 9 + import { ConfirmationManager } from "./ConfirmationManager"; 10 + import { platform } from "@tauri-apps/plugin-os"; 8 11 9 12 export interface TabHashMap { 10 13 [details: string] : Tab; ··· 17 20 private _tabs: TabHashMap = {}; 18 21 19 22 private _nodes: Node[] = []; 20 - private _needsSave = false; 21 23 22 24 constructor(){ 23 25 NodeManager.Instance = this; 24 26 25 27 setInterval(() => { 26 - // Save config every 1 second 27 - if(this._needsSave)this._saveConfigToDisk(); 28 - }, 1_000); 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); 29 41 30 42 listen('load_new_tab', ( ev: any ) => { 31 - this._loadFromConfig(ev.payload); 32 - }) 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 + }); 33 93 } 34 94 35 95 36 96 private _tabUpdateHook: ( tabs: TabHashMap ) => void = () => {}; 37 97 private _tabChangeHook: () => void = () => {}; 38 98 39 - public async AddTab( name: string ){ 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>{ 40 105 let [ selected, setSelected ] = createSignal(false); 106 + let [ needsSave, setNeedsSave ] = createSignal(false); 41 107 42 108 let tab: Tab = { 43 109 name: name, 44 - id: await NodeManager.Instance.GetNewNodeId(), 110 + id: id || await NodeManager.Instance.GetNewNodeId(), 45 111 nodes: [], 46 - selected: selected, 47 - setSelected: setSelected 112 + saveLocation: null, 113 + 114 + selected, 115 + setSelected, 116 + 117 + needsSave, 118 + setNeedsSave, 119 + 120 + needSync: false 48 121 }; 49 122 50 123 this._tabs[tab.id] = tab; 51 124 52 125 this.SelectTab(tab.id); 53 126 this._tabUpdateHook(this._tabs); 127 + 128 + return tab; 54 129 } 55 130 56 - public CloseTab( id: string ){ // TODO: Add confirmation to close tab 57 - console.log(id === this._selectedTab); 58 - if(this._selectedTab === id){ 59 - let tabs = Object.values(this._tabs); 131 + public CloseTab( id: string ){ 132 + let tab = this._tabs[id]; 60 133 61 - if(tabs.length === 1){ 62 - this.SelectTab(null); 63 - } else{ 64 - let tabToDelete = this._tabs[id]; 134 + let closeCB = () => { 135 + if(this._selectedTab === id){ 136 + let tabs = Object.values(this._tabs); 65 137 66 - let index = tabs.indexOf(tabToDelete); 67 - let nextTab = tabs[index + 1]; 138 + if(tabs.length === 1){ 139 + this.SelectTab(null); 140 + } else{ 141 + let index = tabs.indexOf(tab); 142 + let nextTab = tabs[index + 1]; 68 143 69 - if(nextTab) 70 - this.SelectTab(nextTab.id); 71 - else 72 - this.SelectTab(tabs[0].id); 144 + if(nextTab) 145 + this.SelectTab(nextTab.id); 146 + else 147 + this.SelectTab(tabs[0].id); 148 + } 73 149 } 150 + 151 + invoke('discard_tab', { id: id }); 152 + 153 + delete this._tabs[id]; 154 + this._tabUpdateHook(this._tabs); 74 155 } 75 156 76 - delete this._tabs[id]; 77 - this._tabUpdateHook(this._tabs); 157 + if(tab.needsSave()){ 158 + ConfirmationManager.Instance.ShowConfirmation( 159 + 'Discard Changes?', 160 + 'If you close this tab without saving you will lose all changes.', 161 + [ 162 + { 163 + text: 'Save', 164 + callback: async () => { 165 + await this.SaveTab(tab); 166 + closeCB(); 167 + } 168 + }, 169 + { 170 + text: 'Don\'t Save', 171 + callback: () => { 172 + closeCB(); 173 + } 174 + } 175 + ] 176 + ) 177 + } else{ 178 + closeCB(); 179 + } 78 180 } 79 181 80 182 public RenameTab( id: string, name: string ){ ··· 110 212 } 111 213 } 112 214 215 + public async SaveTab( tab: Tab, ignoreSaveLocation: boolean = false ){ 216 + let path = 217 + tab.saveLocation && !ignoreSaveLocation ? 218 + tab.saveLocation : 219 + await save({ defaultPath: tab.name + '.macro', filters: [ { name: 'Macro Files', extensions: [ 'macro' ] } ] }); 220 + 221 + if(!path)throw new Error("Cannot save"); 222 + 223 + tab.saveLocation = path; 224 + tab.setNeedsSave(false); 225 + 226 + this._saveConfigToDisk(path, tab.id); 227 + } 228 + 113 229 public HookTabUpdate( cb: ( tabs: TabHashMap ) => void ){ 114 230 this._tabUpdateHook = cb; 115 231 } ··· 149 265 } 150 266 151 267 152 - public UpdateConfig(){ 153 - this._needsSave = true; 268 + public UpdateConfig( needsSave = true ){ 269 + if(!this._selectedTab)return; 270 + let tab = this._tabs[this._selectedTab]; 271 + if(!tab)return; 272 + 273 + tab.nodes = this._nodes; 274 + tab.needSync = true; 275 + 276 + if(needsSave)tab.setNeedsSave(true); 154 277 } 155 278 156 - private async _loadFromConfig( config: string ){ 279 + private async _loadFromConfig( path: string | null, id: string | null, config: string ){ 157 280 let json = JSON.parse(config); 158 281 159 282 if( ··· 162 285 !json.graph 163 286 )return; 164 287 165 - await this.AddTab(json.tab_name); 288 + let tab = await this.AddTab(json.tab_name, id); 289 + tab.needSync = false; 290 + tab.saveLocation = path; 291 + 166 292 this._nodes = []; 167 293 168 294 let graph = json.graph; ··· 174 300 let nod = new Node(node.pos, NodesByID[node.typeId], node.id); 175 301 176 302 nod.statics = node.statics; 177 - nod.onStaticsUpdate(nod); 303 + await nod.onStaticsUpdate(nod); 178 304 179 305 this._nodes.push(nod); 180 306 } ··· 191 317 let input = output.connections[k]; 192 318 let node = this._nodes.find(x => x.id === input.node)!; 193 319 320 + if(!node)continue; 321 + 194 322 let realInput = node.inputs.find(x => x.index === input.index); 195 323 let realOutput = outputParentNode.outputs[j]; 196 324 ··· 212 340 } 213 341 } 214 342 } 343 + 344 + tab.setNeedsSave(false); 345 + tab.nodes = this._nodes; 346 + 347 + tab.needSync = false; 348 + if(!id)this.UpdateConfig(false); 349 + 350 + return tab; 215 351 } 216 352 217 - private async _saveConfigToDisk(){ 218 - this._needsSave = false; 353 + private _generateTabGraph( tabId: string | null ): [ any, Tab | null ]{ 219 354 // Convert it into a structure we can actually save... 220 355 221 - if(!this._selectedTab)return; 222 - let tab = this._tabs[this._selectedTab]; 223 - if(!tab)return; 356 + if(!tabId)return [ null, null ]; 357 + let tab = this._tabs[tabId]; 358 + if(!tab)return [ null, null ]; 224 359 225 360 let nodesToSave = []; 226 361 227 - for (let i = 0; i < this._nodes.length; i++) { 228 - let node = this._nodes[i]; 362 + for (let i = 0; i < tab.nodes.length; i++) { 363 + let node = tab.nodes[i]; 229 364 230 365 let nodeOutputs = []; 366 + let nodeInputs = []; 231 367 232 368 for (let j = 0; j < node.outputs.length; j++) { 233 369 let output = node.outputs[j]; ··· 244 380 }) 245 381 } 246 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 + 247 398 nodesToSave.push({ 248 399 name: node.name, 249 400 id: node.id, 250 401 typeId: node.typeId, 251 402 pos: [ node.x, node.y ], 252 403 outputs: nodeOutputs, 404 + inputs: nodeInputs, 253 405 statics: node.statics 254 406 }) 255 407 } 256 408 257 - invoke('save_graph', { tabName: tab.name, graph: JSON.stringify({ 409 + return [ nodesToSave, tab ]; 410 + } 411 + 412 + private async _saveConfigToDisk( path: string, tabId: string | null ){ 413 + let [ nodesToSave, tab ] = this._generateTabGraph(tabId); 414 + if(!tab)return; 415 + 416 + invoke('save_graph', { graph: JSON.stringify({ 258 417 tab_name: tab.name, 259 418 version: await getVersion(), 419 + platform: platform(), 260 420 graph: nodesToSave 261 - }) }); 421 + }), path }); 262 422 } 263 423 }
+3 -2
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, ··· 26 27 { name: "Not Equal", type: NodeType.Flow }, 27 28 ], 28 29 29 - onStaticsUpdate: ( _node: Node ) => {} 30 + onStaticsUpdate: async ( _node: Node ) => {} 30 31 }
+3 -2
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, ··· 25 26 { name: "Not False", type: NodeType.Flow }, 26 27 ], 27 28 28 - onStaticsUpdate: ( _node: Node ) => {} 29 + onStaticsUpdate: async ( _node: Node ) => {} 29 30 }
+3 -2
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, ··· 25 26 { name: "Not True", type: NodeType.Flow }, 26 27 ], 27 28 28 - onStaticsUpdate: (_node: Node) => { } 29 + onStaticsUpdate: async ( _node: Node ) => { } 29 30 }
+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: [
+33
src/Nodes/Debug.tsx
··· 1 + import { Node, NodeType } from "../structs/node"; 2 + import { NodeDefinition } from "./Nodes"; 3 + 4 + export let NodeDebug: NodeDefinition = { 5 + os: 'any', 6 + 7 + isSingle: true, 8 + name: 'Debug', 9 + typeId: 'debug', 10 + 11 + w: 200, 12 + 13 + statics: [ 14 + { 15 + name: "Debug", 16 + type: NodeType.Label, 17 + value: null 18 + } 19 + ], 20 + 21 + inputs: [ 22 + { 23 + name: "Flow", 24 + type: NodeType.Flow, 25 + }, 26 + { 27 + name: "Value", 28 + type: NodeType.AnyTypeA, 29 + } 30 + ], 31 + 32 + onStaticsUpdate: async ( _node: Node ) => {} 33 + };
+27 -4
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"; 5 + import { NodeDebug } from "./Debug"; 4 6 import { NodeOSCActions } from "./OSCActions"; 5 7 import { NodeOSCTrigger } from "./OSCTrigger"; 8 + import { NodePressKey } from "./PressKey"; 6 9 import { NodeStatics } from "./Statics"; 10 + import { NodeShellCommand } from "./Shell"; 7 11 8 12 export interface NodeDefinition{ 13 + os: string, 9 14 isSingle: boolean, 10 15 name: string, 11 16 typeId?: string, 12 - onStaticsUpdate?: ( node: Node ) => void, 17 + onStaticsUpdate?: ( node: Node ) => Promise<void>, 13 18 // build?: ( pos: [ number, number ], onStaticsUpdate: ( node: Node ) => void ) => Promise<Node>, 14 19 w?: number, 15 - h?: number, 16 20 statics?: NodeStatic[], 17 21 inputs?: { name: string, type: NodeType }[], 18 22 outputs?: { name: string, type: NodeType }[], ··· 24 28 [details: string] : NodeDefinition; 25 29 } 26 30 27 - 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 = [ 28 41 NodeOSCTrigger, 29 42 NodeConditional, 30 43 NodeStatics, 31 - NodeOSCActions 44 + NodeOSCActions, 45 + NodeDebug, 46 + NodePressKey, 47 + NodeShellCommand 32 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 + } 33 56 34 57 export let NodesByID: NodeDefinitionHashMap = {} 35 58
+3 -2
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, ··· 20 21 { name: "Value", type: NodeType.String } 21 22 ], 22 23 23 - onStaticsUpdate: ( _node: Node ) => {} 24 + onStaticsUpdate: async ( _node: Node ) => {} 24 25 }
+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: [
+63 -48
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 { ··· 25 26 } 26 27 ], 27 28 28 - onStaticsUpdate: ( node: Node ) => { 29 + onStaticsUpdate: async ( node: Node ) => { 29 30 let address = node.statics[0].value; 30 31 let parameters = node.statics[1].value; 31 32 32 - (async () => { 33 - if(address){ 34 - let addresses = await invoke<OSCMessage[]>('get_addresses'); 35 - let msgDat = addresses.find(x => x.address == address); 36 - 37 - if(!msgDat)return; 33 + if(address){ 34 + let addresses = await invoke<OSCMessage[]>('get_addresses'); 35 + let msgDat = addresses.find(x => x.address == address); 38 36 37 + if(msgDat){ 39 38 parameters = msgDat.values.map(x => { return { type: x.key, desc: '' }}); 40 39 node.statics[1].value = parameters; 41 40 } 41 + } 42 + 43 + let tempOutputs = []; 42 44 45 + tempOutputs.push({ 46 + name: 'Flow', 47 + type: NodeType.Flow, 48 + connections: [], 49 + parent: node, 50 + index: 0 51 + }) 52 + 53 + parameters.forEach(( dat: any, indx: number ) => { 54 + let type: NodeType | null = null; 55 + 56 + switch(dat.type){ 57 + case 'Int': 58 + type = NodeType.Int; 59 + break; 60 + case 'Float': 61 + type = NodeType.Float; 62 + break; 63 + case 'String': 64 + type = NodeType.String; 65 + break; 66 + case 'Boolean': 67 + type = NodeType.Boolean; 68 + break; 69 + } 70 + 71 + if(type){ 72 + tempOutputs.push({ 73 + name: dat.desc === '' ? dat.type : dat.desc, 74 + type: type, 75 + connections: [], 76 + parent: node, 77 + index: indx + 1 78 + }) 79 + } 80 + }); 81 + 82 + let hasChanged = false; 83 + 84 + for(let i in tempOutputs){ 85 + if( 86 + node.outputs[i] === undefined || 87 + tempOutputs[i].type != node.outputs[i].type 88 + ){ 89 + hasChanged = true; 90 + } 91 + } 92 + 93 + if(hasChanged){ 43 94 node.outputs.map(output => { 44 95 output.connections.map(partner => { 45 96 partner.connections = partner.connections.filter(x => x != output); 46 97 }) 47 98 }) 48 - node.outputs = []; 49 99 50 - node.outputs.push({ 51 - name: 'Flow', 52 - type: NodeType.Flow, 53 - connections: [], 54 - parent: node, 55 - index: 0 56 - }) 57 - 58 - parameters.forEach(( dat: any, indx: number ) => { 59 - let type: NodeType | null = null; 100 + node.outputs = tempOutputs; 101 + node.updateSize(); 102 + } 60 103 61 - switch(dat.type){ 62 - case 'Int': 63 - type = NodeType.Int; 64 - break; 65 - case 'Float': 66 - type = NodeType.Float; 67 - break; 68 - case 'String': 69 - type = NodeType.String; 70 - break; 71 - case 'Boolean': 72 - type = NodeType.Boolean; 73 - break; 74 - } 75 - 76 - if(type){ 77 - node.outputs.push({ 78 - name: dat.desc === '' ? dat.type : dat.desc, 79 - type: type, 80 - connections: [], 81 - parent: node, 82 - index: indx + 1 83 - }) 84 - } 85 - }); 86 - 87 - node.h = 60 + (parameters.length + 1) * 30; 88 - NodeManager.Instance.UpdateConfig(); 89 - })(); 104 + NodeManager.Instance.UpdateConfig(); 90 105 } 91 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 + }
+5 -4
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 }], 19 20 20 - onStaticsUpdate: ( _node: Node ) => {} 21 + onStaticsUpdate: async ( _node: Node ) => {} 21 22 }
+4 -3
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 }], 19 20 20 - onStaticsUpdate: ( _node: Node ) => {} 21 + onStaticsUpdate: async ( _node: Node ) => {} 21 22 }
+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 }
+42
src/components/ConfirmationPopup.css
··· 1 + .confirmation-blackout{ 2 + position: fixed; 3 + top: 0; 4 + left: 0; 5 + width: 100vw; 6 + height: 100vh; 7 + z-index: 150; 8 + background: #000A; 9 + } 10 + 11 + .confirmation-popup{ 12 + position: fixed; 13 + top: 50%; 14 + left: 50%; 15 + transform: translate(-50%, -50%); 16 + background: #272e44; 17 + border-radius: 20px; 18 + padding: 10px 20px; 19 + text-align: center; 20 + } 21 + 22 + .confirmation-buttons{ 23 + display: flex; 24 + margin-top: 30px; 25 + } 26 + 27 + .confirmation-button{ 28 + cursor: pointer; 29 + user-select: none; 30 + -webkit-user-select: none; 31 + 32 + width: 100%; 33 + padding: 2px 10px; 34 + border: 1px solid #fff; 35 + border-radius: 5px; 36 + transition: 0.1s; 37 + margin: 0 5px; 38 + } 39 + 40 + .confirmation-button:hover{ 41 + background: #fff2; 42 + }
+41
src/components/ConfirmationPopup.tsx
··· 1 + import { For, Show } from 'solid-js'; 2 + import './ConfirmationPopup.css'; 3 + import { ConfirmationManager } from '../Mangers/ConfirmationManager'; 4 + 5 + export let ConfirmationPopup = () => { 6 + return ( 7 + <> 8 + <Show when={ConfirmationManager.Instance.Shown()}> 9 + <div class="confirmation-blackout"> 10 + <div class="confirmation-popup"> 11 + <h2>{ConfirmationManager.Instance.Text()}</h2> 12 + <p>{ConfirmationManager.Instance.Body()}</p> 13 + 14 + <div class="confirmation-buttons"> 15 + <For each={ConfirmationManager.Instance.Buttons()}> 16 + { item => 17 + <div 18 + class="confirmation-button" 19 + onClick={() => { 20 + ConfirmationManager.Instance.CancelConfirmation(); 21 + item.callback(); 22 + }} 23 + > 24 + { item.text } 25 + </div> 26 + } 27 + </For> 28 + 29 + <div 30 + class="confirmation-button" 31 + onClick={() => ConfirmationManager.Instance.CancelConfirmation()} 32 + > 33 + Cancel 34 + </div> 35 + </div> 36 + </div> 37 + </div> 38 + </Show> 39 + </> 40 + ) 41 + }
+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 + }
+30 -1
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{ ··· 88 97 } 89 98 90 99 .tab-new-dropdown{ 91 - opacity: 0; 92 100 position: absolute; 93 101 width: 180px; 94 102 transform: translate(-10px, 35px); 95 103 border-radius: 10px; 96 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; 97 118 transition: 0.1s; 119 + background: transparent; 120 + cursor: pointer; 121 + user-select: none; 122 + -webkit-user-select: none; 123 + } 124 + 125 + .tab-icon-bar img:hover{ 126 + background: #fff2; 98 127 }
+70 -40
src/components/TabMenu.tsx
··· 1 - import { createSignal, For, onMount } 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' }> 25 - <div class="tab-icon" onClick={() => { 26 - NodeManager.Instance.SelectTab(tab.id); 27 - }}><img src="/assets/icons/pen-to-square-regular-full.svg" width="15" /></div> 28 - <div class="tab-meta" onClick={() => { 29 - NodeManager.Instance.SelectTab(tab.id); 30 - }} onDblClick={( e ) => { 31 - let input = <input class="tab-meta-input" value={ e.target.innerHTML } /> as HTMLInputElement; 25 + <> 26 + <Show when={settingsOpen()}> 27 + <SettingsMenu close={() => setSettingsOpen(false)} /> 28 + </Show> 32 29 33 - e.target.innerHTML = ''; 34 - e.target.appendChild(input); 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> 35 48 36 - input.select(); 37 - input.onchange = () => { 38 - NodeManager.Instance.RenameTab(tab.id, input.value); 39 - e.target.innerHTML = input.value; 40 - } 41 - }}>{ tab.name }</div> 42 - <div class="tab-close" onClick={() => { 43 - NodeManager.Instance.CloseTab(tab.id); 44 - }}><img src="/assets/icons/xmark-solid-full.svg" width="12" /></div> 45 - </div> 46 - } 47 - </For> 49 + </div> 50 + <div class="tab-meta" onDblClick={( e ) => { 51 + let input = <input class="tab-meta-input" value={ e.target.innerHTML } /> as HTMLInputElement; 48 52 49 - <div class="tab" onClick={() => { 50 - NodeManager.Instance.AddTab("Untitled"); 51 - }} onContextMenu={( e ) => { 52 - e.preventDefault(); 53 - setTabImportOpen(true); 53 + e.target.innerHTML = ''; 54 + e.target.appendChild(input); 55 + 56 + input.select(); 57 + input.onchange = () => { 58 + NodeManager.Instance.RenameTab(tab.id, input.value); 59 + e.target.innerHTML = input.value; 60 + } 61 + }}>{ tab.name }</div> 62 + <div class="tab-close" onClick={() => { 63 + setTimeout(() => { 64 + NodeManager.Instance.CloseTab(tab.id); 65 + }, 50) 66 + }}><img src="/assets/icons/xmark-solid-full.svg" width="12" /></div> 67 + </div> 68 + } 69 + </For> 70 + 71 + <div class="tab" onClick={() => { 72 + NodeManager.Instance.AddTab("Untitled"); 73 + }} onContextMenu={( e ) => { 74 + e.preventDefault(); 75 + setTabImportOpen(true); 76 + 77 + window.addEventListener('click', closeTabImportMenu); 78 + }}> 79 + <div class="tab-new-dropdown" style={{ display: tabImportOpen() ? 'block' : 'none' }}> 80 + <div class="tab">Import from file</div> 81 + <div class="tab">Import from URL</div> 82 + </div> 83 + <div class="tab-icon"><img src="/assets/icons/plus-solid-full.svg" width="15" /></div> 84 + <div class="tab-meta">New Tab</div> 85 + </div> 86 + </div> 54 87 55 - window.addEventListener('click', closeTabImportMenu); 56 - }}> 57 - <div class="tab-new-dropdown" style={{ opacity: tabImportOpen() ? 1 : 0 }}> 58 - <div class="tab">Import from file</div> 59 - <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')} /> 60 92 </div> 61 - <div class="tab-icon"><img src="/assets/icons/plus-solid-full.svg" width="15" /></div> 62 - <div class="tab-meta">New Tab</div> 63 93 </div> 64 - </div> 94 + </> 65 95 ) 66 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;
+4 -1
src/index.tsx
··· 3 3 import App from "./App"; 4 4 5 5 import { NodeManager } from "./Mangers/NodeManager"; 6 + import { ConfirmationManager } from "./Mangers/ConfirmationManager"; 7 + 6 8 new NodeManager(); 9 + new ConfirmationManager(); 7 10 8 - 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
+7
src/structs/Tab.ts
··· 5 5 name: string, 6 6 id: string, 7 7 nodes: Node[], 8 + saveLocation: string | null, 9 + 8 10 selected: Accessor<boolean>, 9 11 setSelected: Setter<boolean> 12 + 13 + needsSave: Accessor<boolean>, 14 + setNeedsSave: Setter<boolean>, 15 + 16 + needSync: boolean 10 17 }
+42 -4
src/structs/node.ts
··· 12 12 outputs: NodeIO[]; 13 13 selected: boolean; 14 14 statics: NodeStatic[]; 15 - onStaticsUpdate: ( node: Node ) => void; 15 + onStaticsUpdate: ( node: Node ) => Promise<void>; 16 16 17 17 constructor( pos: [ number, number ], node: NodeDefinition, id: string ){ 18 18 this.name = node.name; ··· 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!; 50 + } 51 + 52 + updateSize(){ 53 + this.h = 50 + Math.max(this.outputs.length, this.inputs.length) * 30; 49 54 } 50 55 } 51 56 ··· 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 + }
+1413 -683
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", 20 + "tauri-plugin-dialog", 16 21 "tauri-plugin-opener", 22 + "tauri-plugin-os", 17 23 "tokio", 18 24 ] 19 25 20 26 [[package]] 21 - name = "addr2line" 22 - version = "0.24.2" 23 - source = "registry+https://github.com/rust-lang/crates.io-index" 24 - checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 25 - dependencies = [ 26 - "gimli", 27 - ] 28 - 29 - [[package]] 30 27 name = "adler2" 31 28 version = "2.0.1" 32 29 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 34 31 35 32 [[package]] 36 33 name = "aho-corasick" 37 - version = "1.1.3" 34 + version = "1.1.4" 38 35 source = "registry+https://github.com/rust-lang/crates.io-index" 39 - checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 36 + checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" 40 37 dependencies = [ 41 38 "memchr", 42 39 ] ··· 57 54 ] 58 55 59 56 [[package]] 60 - name = "android-tzdata" 61 - version = "0.1.1" 62 - source = "registry+https://github.com/rust-lang/crates.io-index" 63 - checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 64 - 65 - [[package]] 66 57 name = "android_system_properties" 67 58 version = "0.1.5" 68 59 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 73 64 74 65 [[package]] 75 66 name = "anyhow" 76 - 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" 77 74 source = "registry+https://github.com/rust-lang/crates.io-index" 78 - 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 + ] 91 + 92 + [[package]] 93 + name = "ashpd" 94 + version = "0.11.0" 95 + source = "registry+https://github.com/rust-lang/crates.io-index" 96 + checksum = "6cbdf310d77fd3aaee6ea2093db7011dc2d35d2eb3481e5607f1f8d942ed99df" 97 + dependencies = [ 98 + "enumflags2", 99 + "futures-channel", 100 + "futures-util", 101 + "rand 0.9.2", 102 + "raw-window-handle", 103 + "serde", 104 + "serde_repr", 105 + "tokio", 106 + "url", 107 + "wayland-backend", 108 + "wayland-client", 109 + "wayland-protocols", 110 + "zbus", 111 + ] 79 112 80 113 [[package]] 81 114 name = "async-broadcast" ··· 103 136 104 137 [[package]] 105 138 name = "async-executor" 106 - version = "1.13.2" 139 + version = "1.13.3" 107 140 source = "registry+https://github.com/rust-lang/crates.io-index" 108 - checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" 141 + checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" 109 142 dependencies = [ 110 143 "async-task", 111 144 "concurrent-queue", ··· 117 150 118 151 [[package]] 119 152 name = "async-io" 120 - version = "2.5.0" 153 + version = "2.6.0" 121 154 source = "registry+https://github.com/rust-lang/crates.io-index" 122 - checksum = "19634d6336019ef220f09fd31168ce5c184b295cbf80345437cc36094ef223ca" 155 + checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" 123 156 dependencies = [ 124 - "async-lock", 157 + "autocfg", 125 158 "cfg-if", 126 159 "concurrent-queue", 127 160 "futures-io", 128 161 "futures-lite", 129 162 "parking", 130 163 "polling", 131 - "rustix", 164 + "rustix 1.1.2", 132 165 "slab", 133 - "windows-sys 0.60.2", 166 + "windows-sys 0.61.2", 134 167 ] 135 168 136 169 [[package]] 137 170 name = "async-lock" 138 - version = "3.4.0" 171 + version = "3.4.1" 139 172 source = "registry+https://github.com/rust-lang/crates.io-index" 140 - checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" 173 + checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" 141 174 dependencies = [ 142 175 "event-listener", 143 176 "event-listener-strategy", ··· 146 179 147 180 [[package]] 148 181 name = "async-process" 149 - version = "2.4.0" 182 + version = "2.5.0" 150 183 source = "registry+https://github.com/rust-lang/crates.io-index" 151 - checksum = "65daa13722ad51e6ab1a1b9c01299142bc75135b337923cfa10e79bbbd669f00" 184 + checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" 152 185 dependencies = [ 153 186 "async-channel", 154 187 "async-io", ··· 159 192 "cfg-if", 160 193 "event-listener", 161 194 "futures-lite", 162 - "rustix", 195 + "rustix 1.1.2", 163 196 ] 164 197 165 198 [[package]] ··· 170 203 dependencies = [ 171 204 "proc-macro2", 172 205 "quote", 173 - "syn 2.0.104", 206 + "syn 2.0.109", 174 207 ] 175 208 176 209 [[package]] 177 210 name = "async-signal" 178 - version = "0.2.12" 211 + version = "0.2.13" 179 212 source = "registry+https://github.com/rust-lang/crates.io-index" 180 - checksum = "f567af260ef69e1d52c2b560ce0ea230763e6fbb9214a85d768760a920e3e3c1" 213 + checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" 181 214 dependencies = [ 182 215 "async-io", 183 216 "async-lock", ··· 185 218 "cfg-if", 186 219 "futures-core", 187 220 "futures-io", 188 - "rustix", 221 + "rustix 1.1.2", 189 222 "signal-hook-registry", 190 223 "slab", 191 - "windows-sys 0.60.2", 224 + "windows-sys 0.61.2", 192 225 ] 193 226 194 227 [[package]] ··· 199 232 200 233 [[package]] 201 234 name = "async-trait" 202 - version = "0.1.88" 235 + version = "0.1.89" 203 236 source = "registry+https://github.com/rust-lang/crates.io-index" 204 - checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" 237 + checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" 205 238 dependencies = [ 206 239 "proc-macro2", 207 240 "quote", 208 - "syn 2.0.104", 241 + "syn 2.0.109", 209 242 ] 210 243 211 244 [[package]] ··· 244 277 checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 245 278 246 279 [[package]] 247 - name = "backtrace" 248 - version = "0.3.75" 249 - source = "registry+https://github.com/rust-lang/crates.io-index" 250 - checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" 251 - dependencies = [ 252 - "addr2line", 253 - "cfg-if", 254 - "libc", 255 - "miniz_oxide", 256 - "object", 257 - "rustc-demangle", 258 - "windows-targets 0.52.6", 259 - ] 260 - 261 - [[package]] 262 280 name = "base64" 263 281 version = "0.21.7" 264 282 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 278 296 279 297 [[package]] 280 298 name = "bitflags" 281 - version = "2.9.1" 299 + version = "2.10.0" 282 300 source = "registry+https://github.com/rust-lang/crates.io-index" 283 - checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" 301 + checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" 284 302 dependencies = [ 285 - "serde", 303 + "serde_core", 286 304 ] 287 305 288 306 [[package]] ··· 305 323 306 324 [[package]] 307 325 name = "block2" 308 - version = "0.6.1" 326 + version = "0.6.2" 309 327 source = "registry+https://github.com/rust-lang/crates.io-index" 310 - checksum = "340d2f0bdb2a43c1d3cd40513185b2bd7def0aa1052f956455114bc98f82dcf2" 328 + checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" 311 329 dependencies = [ 312 - "objc2 0.6.1", 330 + "objc2 0.6.3", 313 331 ] 314 332 315 333 [[package]] ··· 327 345 328 346 [[package]] 329 347 name = "brotli" 330 - version = "8.0.1" 348 + version = "8.0.2" 331 349 source = "registry+https://github.com/rust-lang/crates.io-index" 332 - checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" 350 + checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" 333 351 dependencies = [ 334 352 "alloc-no-stdlib", 335 353 "alloc-stdlib", ··· 354 372 355 373 [[package]] 356 374 name = "bytemuck" 357 - version = "1.23.1" 375 + version = "1.24.0" 358 376 source = "registry+https://github.com/rust-lang/crates.io-index" 359 - checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" 377 + checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" 360 378 361 379 [[package]] 362 380 name = "byteorder" ··· 365 383 checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 366 384 367 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]] 368 392 name = "bytes" 369 393 version = "1.10.1" 370 394 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 379 403 source = "registry+https://github.com/rust-lang/crates.io-index" 380 404 checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" 381 405 dependencies = [ 382 - "bitflags 2.9.1", 406 + "bitflags 2.10.0", 383 407 "cairo-sys-rs", 384 408 "glib", 385 409 "libc", ··· 400 424 401 425 [[package]] 402 426 name = "camino" 403 - version = "1.1.10" 427 + version = "1.2.1" 404 428 source = "registry+https://github.com/rust-lang/crates.io-index" 405 - checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" 429 + checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" 406 430 dependencies = [ 407 - "serde", 431 + "serde_core", 408 432 ] 409 433 410 434 [[package]] ··· 427 451 "semver", 428 452 "serde", 429 453 "serde_json", 430 - "thiserror 2.0.12", 454 + "thiserror 2.0.17", 431 455 ] 432 456 433 457 [[package]] ··· 437 461 checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" 438 462 dependencies = [ 439 463 "serde", 440 - "toml 0.9.3", 464 + "toml 0.9.8", 441 465 ] 442 466 443 467 [[package]] 444 468 name = "cc" 445 - version = "1.2.30" 469 + version = "1.2.45" 446 470 source = "registry+https://github.com/rust-lang/crates.io-index" 447 - checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" 471 + checksum = "35900b6c8d709fb1d854671ae27aeaa9eec2f8b01b364e1619a40da3e6fe2afe" 448 472 dependencies = [ 473 + "find-msvc-tools", 449 474 "shlex", 450 475 ] 451 476 ··· 478 503 479 504 [[package]] 480 505 name = "cfg-if" 481 - version = "1.0.1" 506 + version = "1.0.4" 482 507 source = "registry+https://github.com/rust-lang/crates.io-index" 483 - checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" 508 + checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" 484 509 485 510 [[package]] 486 511 name = "cfg_aliases" ··· 490 515 491 516 [[package]] 492 517 name = "chrono" 493 - version = "0.4.41" 518 + version = "0.4.42" 494 519 source = "registry+https://github.com/rust-lang/crates.io-index" 495 - checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" 520 + checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" 496 521 dependencies = [ 497 - "android-tzdata", 498 522 "iana-time-zone", 523 + "js-sys", 499 524 "num-traits", 500 525 "serde", 501 - "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", 502 537 ] 503 538 504 539 [[package]] ··· 558 593 source = "registry+https://github.com/rust-lang/crates.io-index" 559 594 checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" 560 595 dependencies = [ 561 - "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", 562 610 "core-foundation", 563 611 "core-graphics-types", 564 612 "foreign-types", ··· 571 619 source = "registry+https://github.com/rust-lang/crates.io-index" 572 620 checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" 573 621 dependencies = [ 574 - "bitflags 2.9.1", 622 + "bitflags 2.10.0", 575 623 "core-foundation", 576 624 "libc", 577 625 ] ··· 608 656 version = "0.8.21" 609 657 source = "registry+https://github.com/rust-lang/crates.io-index" 610 658 checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 659 + 660 + [[package]] 661 + name = "crunchy" 662 + version = "0.2.4" 663 + source = "registry+https://github.com/rust-lang/crates.io-index" 664 + checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" 611 665 612 666 [[package]] 613 667 name = "crypto-common" ··· 643 697 checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" 644 698 dependencies = [ 645 699 "quote", 646 - "syn 2.0.104", 700 + "syn 2.0.109", 647 701 ] 648 702 649 703 [[package]] ··· 653 707 checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" 654 708 dependencies = [ 655 709 "quote", 656 - "syn 2.0.104", 710 + "syn 2.0.109", 657 711 ] 658 712 659 713 [[package]] 660 714 name = "darling" 661 - version = "0.20.11" 715 + version = "0.21.3" 662 716 source = "registry+https://github.com/rust-lang/crates.io-index" 663 - checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" 717 + checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" 664 718 dependencies = [ 665 719 "darling_core", 666 720 "darling_macro", ··· 668 722 669 723 [[package]] 670 724 name = "darling_core" 671 - version = "0.20.11" 725 + version = "0.21.3" 672 726 source = "registry+https://github.com/rust-lang/crates.io-index" 673 - checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" 727 + checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" 674 728 dependencies = [ 675 729 "fnv", 676 730 "ident_case", 677 731 "proc-macro2", 678 732 "quote", 679 733 "strsim", 680 - "syn 2.0.104", 734 + "syn 2.0.109", 681 735 ] 682 736 683 737 [[package]] 684 738 name = "darling_macro" 685 - version = "0.20.11" 739 + version = "0.21.3" 686 740 source = "registry+https://github.com/rust-lang/crates.io-index" 687 - checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" 741 + checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" 688 742 dependencies = [ 689 743 "darling_core", 690 744 "quote", 691 - "syn 2.0.104", 745 + "syn 2.0.109", 692 746 ] 693 747 694 748 [[package]] 695 749 name = "deranged" 696 - version = "0.4.0" 750 + version = "0.5.5" 697 751 source = "registry+https://github.com/rust-lang/crates.io-index" 698 - checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" 752 + checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" 699 753 dependencies = [ 700 754 "powerfmt", 701 - "serde", 755 + "serde_core", 702 756 ] 703 757 704 758 [[package]] ··· 711 765 "proc-macro2", 712 766 "quote", 713 767 "rustc_version", 714 - "syn 2.0.104", 768 + "syn 2.0.109", 715 769 ] 716 770 717 771 [[package]] ··· 742 796 "libc", 743 797 "option-ext", 744 798 "redox_users", 745 - "windows-sys 0.60.2", 799 + "windows-sys 0.61.2", 746 800 ] 747 801 748 802 [[package]] ··· 757 811 source = "registry+https://github.com/rust-lang/crates.io-index" 758 812 checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" 759 813 dependencies = [ 760 - "bitflags 2.9.1", 761 - "objc2 0.6.1", 814 + "bitflags 2.10.0", 815 + "block2 0.6.2", 816 + "libc", 817 + "objc2 0.6.3", 762 818 ] 763 819 764 820 [[package]] ··· 769 825 dependencies = [ 770 826 "proc-macro2", 771 827 "quote", 772 - "syn 2.0.104", 828 + "syn 2.0.109", 829 + ] 830 + 831 + [[package]] 832 + name = "dlib" 833 + version = "0.5.2" 834 + source = "registry+https://github.com/rust-lang/crates.io-index" 835 + checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" 836 + dependencies = [ 837 + "libloading 0.8.9", 773 838 ] 774 839 775 840 [[package]] 776 841 name = "dlopen2" 777 - version = "0.7.0" 842 + version = "0.8.0" 778 843 source = "registry+https://github.com/rust-lang/crates.io-index" 779 - checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6" 844 + checksum = "b54f373ccf864bf587a89e880fb7610f8d73f3045f13580948ccbcaff26febff" 780 845 dependencies = [ 781 846 "dlopen2_derive", 782 847 "libc", ··· 792 857 dependencies = [ 793 858 "proc-macro2", 794 859 "quote", 795 - "syn 2.0.104", 860 + "syn 2.0.109", 796 861 ] 862 + 863 + [[package]] 864 + name = "downcast-rs" 865 + version = "1.2.1" 866 + source = "registry+https://github.com/rust-lang/crates.io-index" 867 + checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" 797 868 798 869 [[package]] 799 870 name = "dpi" ··· 833 904 834 905 [[package]] 835 906 name = "embed-resource" 836 - version = "3.0.5" 907 + version = "3.0.6" 837 908 source = "registry+https://github.com/rust-lang/crates.io-index" 838 - checksum = "4c6d81016d6c977deefb2ef8d8290da019e27cc26167e102185da528e6c0ab38" 909 + checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" 839 910 dependencies = [ 840 911 "cc", 841 912 "memchr", 842 913 "rustc_version", 843 - "toml 0.9.3", 914 + "toml 0.9.8", 844 915 "vswhom", 845 916 "winreg", 846 917 ] ··· 858 929 checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" 859 930 860 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]] 861 953 name = "enumflags2" 862 954 version = "0.7.12" 863 955 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 875 967 dependencies = [ 876 968 "proc-macro2", 877 969 "quote", 878 - "syn 2.0.104", 970 + "syn 2.0.109", 879 971 ] 880 972 881 973 [[package]] ··· 886 978 887 979 [[package]] 888 980 name = "erased-serde" 889 - version = "0.4.6" 981 + version = "0.4.9" 890 982 source = "registry+https://github.com/rust-lang/crates.io-index" 891 - checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" 983 + checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" 892 984 dependencies = [ 893 985 "serde", 986 + "serde_core", 894 987 "typeid", 895 988 ] 896 989 897 990 [[package]] 898 991 name = "errno" 899 - version = "0.3.13" 992 + version = "0.3.14" 900 993 source = "registry+https://github.com/rust-lang/crates.io-index" 901 - checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" 994 + checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" 902 995 dependencies = [ 903 996 "libc", 904 - "windows-sys 0.60.2", 997 + "windows-sys 0.61.2", 905 998 ] 906 999 907 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]] 908 1007 name = "event-listener" 909 - version = "5.4.0" 1008 + version = "5.4.1" 910 1009 source = "registry+https://github.com/rust-lang/crates.io-index" 911 - checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 1010 + checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" 912 1011 dependencies = [ 913 1012 "concurrent-queue", 914 1013 "parking", ··· 932 1031 checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 933 1032 934 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]] 935 1054 name = "fdeflate" 936 1055 version = "0.3.7" 937 1056 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 951 1070 ] 952 1071 953 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]] 954 1085 name = "flate2" 955 - version = "1.1.2" 1086 + version = "1.1.5" 956 1087 source = "registry+https://github.com/rust-lang/crates.io-index" 957 - checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" 1088 + checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" 958 1089 dependencies = [ 959 1090 "crc32fast", 960 1091 "miniz_oxide", ··· 967 1098 checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 968 1099 969 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]] 970 1107 name = "foreign-types" 971 1108 version = "0.5.0" 972 1109 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 984 1121 dependencies = [ 985 1122 "proc-macro2", 986 1123 "quote", 987 - "syn 2.0.104", 1124 + "syn 2.0.109", 988 1125 ] 989 1126 990 1127 [[package]] ··· 995 1132 996 1133 [[package]] 997 1134 name = "form_urlencoded" 998 - version = "1.2.1" 1135 + version = "1.2.2" 999 1136 source = "registry+https://github.com/rust-lang/crates.io-index" 1000 - checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 1137 + checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 1001 1138 dependencies = [ 1002 1139 "percent-encoding", 1003 1140 ] ··· 1046 1183 1047 1184 [[package]] 1048 1185 name = "futures-lite" 1049 - version = "2.6.0" 1186 + version = "2.6.1" 1050 1187 source = "registry+https://github.com/rust-lang/crates.io-index" 1051 - checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" 1188 + checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" 1052 1189 dependencies = [ 1053 1190 "fastrand", 1054 1191 "futures-core", ··· 1065 1202 dependencies = [ 1066 1203 "proc-macro2", 1067 1204 "quote", 1068 - "syn 2.0.104", 1205 + "syn 2.0.109", 1069 1206 ] 1070 1207 1071 1208 [[package]] ··· 1207 1344 1208 1345 [[package]] 1209 1346 name = "generic-array" 1210 - version = "0.14.7" 1347 + version = "0.14.9" 1211 1348 source = "registry+https://github.com/rust-lang/crates.io-index" 1212 - checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 1349 + checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" 1213 1350 dependencies = [ 1214 1351 "typenum", 1215 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", 1216 1363 ] 1217 1364 1218 1365 [[package]] ··· 1239 1386 1240 1387 [[package]] 1241 1388 name = "getrandom" 1242 - version = "0.3.3" 1389 + version = "0.3.4" 1243 1390 source = "registry+https://github.com/rust-lang/crates.io-index" 1244 - checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 1391 + checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" 1245 1392 dependencies = [ 1246 1393 "cfg-if", 1247 1394 "libc", 1248 1395 "r-efi", 1249 - "wasi 0.14.2+wasi-0.2.4", 1396 + "wasip2", 1250 1397 ] 1251 1398 1252 1399 [[package]] 1253 - name = "gimli" 1254 - version = "0.31.1" 1255 - source = "registry+https://github.com/rust-lang/crates.io-index" 1256 - checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 1257 - 1258 - [[package]] 1259 1400 name = "gio" 1260 1401 version = "0.18.4" 1261 1402 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1293 1434 source = "registry+https://github.com/rust-lang/crates.io-index" 1294 1435 checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" 1295 1436 dependencies = [ 1296 - "bitflags 2.9.1", 1437 + "bitflags 2.10.0", 1297 1438 "futures-channel", 1298 1439 "futures-core", 1299 1440 "futures-executor", ··· 1317 1458 checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" 1318 1459 dependencies = [ 1319 1460 "heck 0.4.1", 1320 - "proc-macro-crate 2.0.0", 1461 + "proc-macro-crate 2.0.2", 1321 1462 "proc-macro-error", 1322 1463 "proc-macro2", 1323 1464 "quote", 1324 - "syn 2.0.104", 1465 + "syn 2.0.109", 1325 1466 ] 1326 1467 1327 1468 [[package]] ··· 1336 1477 1337 1478 [[package]] 1338 1479 name = "glob" 1339 - version = "0.3.2" 1480 + version = "0.3.3" 1340 1481 source = "registry+https://github.com/rust-lang/crates.io-index" 1341 - checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 1482 + checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" 1342 1483 1343 1484 [[package]] 1344 1485 name = "gobject-sys" ··· 1400 1541 "proc-macro-error", 1401 1542 "proc-macro2", 1402 1543 "quote", 1403 - "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", 1404 1556 ] 1405 1557 1406 1558 [[package]] ··· 1411 1563 1412 1564 [[package]] 1413 1565 name = "hashbrown" 1414 - 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" 1415 1576 source = "registry+https://github.com/rust-lang/crates.io-index" 1416 - checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" 1577 + checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" 1417 1578 1418 1579 [[package]] 1419 1580 name = "heck" ··· 1493 1654 1494 1655 [[package]] 1495 1656 name = "hyper" 1496 - version = "1.6.0" 1657 + version = "1.7.0" 1497 1658 source = "registry+https://github.com/rust-lang/crates.io-index" 1498 - checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 1659 + checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" 1499 1660 dependencies = [ 1661 + "atomic-waker", 1500 1662 "bytes", 1501 1663 "futures-channel", 1502 - "futures-util", 1664 + "futures-core", 1503 1665 "http", 1504 1666 "http-body", 1505 1667 "httparse", 1506 1668 "itoa", 1507 1669 "pin-project-lite", 1670 + "pin-utils", 1508 1671 "smallvec", 1509 1672 "tokio", 1510 1673 "want", ··· 1512 1675 1513 1676 [[package]] 1514 1677 name = "hyper-util" 1515 - version = "0.1.16" 1678 + version = "0.1.17" 1516 1679 source = "registry+https://github.com/rust-lang/crates.io-index" 1517 - checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" 1680 + checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" 1518 1681 dependencies = [ 1519 1682 "base64 0.22.1", 1520 1683 "bytes", ··· 1536 1699 1537 1700 [[package]] 1538 1701 name = "iana-time-zone" 1539 - version = "0.1.63" 1702 + version = "0.1.64" 1540 1703 source = "registry+https://github.com/rust-lang/crates.io-index" 1541 - checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" 1704 + checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" 1542 1705 dependencies = [ 1543 1706 "android_system_properties", 1544 1707 "core-foundation-sys", ··· 1546 1709 "js-sys", 1547 1710 "log", 1548 1711 "wasm-bindgen", 1549 - "windows-core", 1712 + "windows-core 0.62.2", 1550 1713 ] 1551 1714 1552 1715 [[package]] ··· 1565 1728 checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" 1566 1729 dependencies = [ 1567 1730 "byteorder", 1568 - "png", 1731 + "png 0.17.16", 1569 1732 ] 1570 1733 1571 1734 [[package]] 1572 1735 name = "icu_collections" 1573 - version = "2.0.0" 1736 + version = "2.1.1" 1574 1737 source = "registry+https://github.com/rust-lang/crates.io-index" 1575 - checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 1738 + checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" 1576 1739 dependencies = [ 1577 1740 "displaydoc", 1578 1741 "potential_utf", ··· 1583 1746 1584 1747 [[package]] 1585 1748 name = "icu_locale_core" 1586 - version = "2.0.0" 1749 + version = "2.1.1" 1587 1750 source = "registry+https://github.com/rust-lang/crates.io-index" 1588 - checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 1751 + checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" 1589 1752 dependencies = [ 1590 1753 "displaydoc", 1591 1754 "litemap", ··· 1596 1759 1597 1760 [[package]] 1598 1761 name = "icu_normalizer" 1599 - version = "2.0.0" 1762 + version = "2.1.1" 1600 1763 source = "registry+https://github.com/rust-lang/crates.io-index" 1601 - checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 1764 + checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" 1602 1765 dependencies = [ 1603 - "displaydoc", 1604 1766 "icu_collections", 1605 1767 "icu_normalizer_data", 1606 1768 "icu_properties", ··· 1611 1773 1612 1774 [[package]] 1613 1775 name = "icu_normalizer_data" 1614 - version = "2.0.0" 1776 + version = "2.1.1" 1615 1777 source = "registry+https://github.com/rust-lang/crates.io-index" 1616 - checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 1778 + checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" 1617 1779 1618 1780 [[package]] 1619 1781 name = "icu_properties" 1620 - version = "2.0.1" 1782 + version = "2.1.1" 1621 1783 source = "registry+https://github.com/rust-lang/crates.io-index" 1622 - checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 1784 + checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" 1623 1785 dependencies = [ 1624 - "displaydoc", 1625 1786 "icu_collections", 1626 1787 "icu_locale_core", 1627 1788 "icu_properties_data", 1628 1789 "icu_provider", 1629 - "potential_utf", 1630 1790 "zerotrie", 1631 1791 "zerovec", 1632 1792 ] 1633 1793 1634 1794 [[package]] 1635 1795 name = "icu_properties_data" 1636 - version = "2.0.1" 1796 + version = "2.1.1" 1637 1797 source = "registry+https://github.com/rust-lang/crates.io-index" 1638 - checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 1798 + checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" 1639 1799 1640 1800 [[package]] 1641 1801 name = "icu_provider" 1642 - version = "2.0.0" 1802 + version = "2.1.1" 1643 1803 source = "registry+https://github.com/rust-lang/crates.io-index" 1644 - checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 1804 + checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" 1645 1805 dependencies = [ 1646 1806 "displaydoc", 1647 1807 "icu_locale_core", 1648 - "stable_deref_trait", 1649 - "tinystr", 1650 1808 "writeable", 1651 1809 "yoke", 1652 1810 "zerofrom", ··· 1662 1820 1663 1821 [[package]] 1664 1822 name = "idna" 1665 - version = "1.0.3" 1823 + version = "1.1.0" 1666 1824 source = "registry+https://github.com/rust-lang/crates.io-index" 1667 - checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 1825 + checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 1668 1826 dependencies = [ 1669 1827 "idna_adapter", 1670 1828 "smallvec", ··· 1682 1840 ] 1683 1841 1684 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]] 1685 1857 name = "indexmap" 1686 1858 version = "1.9.3" 1687 1859 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1694 1866 1695 1867 [[package]] 1696 1868 name = "indexmap" 1697 - version = "2.10.0" 1869 + version = "2.12.0" 1698 1870 source = "registry+https://github.com/rust-lang/crates.io-index" 1699 - checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" 1871 + checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" 1700 1872 dependencies = [ 1701 1873 "equivalent", 1702 - "hashbrown 0.15.4", 1874 + "hashbrown 0.16.0", 1703 1875 "serde", 1876 + "serde_core", 1704 1877 ] 1705 1878 1706 1879 [[package]] ··· 1713 1886 ] 1714 1887 1715 1888 [[package]] 1716 - name = "io-uring" 1717 - version = "0.7.9" 1718 - source = "registry+https://github.com/rust-lang/crates.io-index" 1719 - checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" 1720 - dependencies = [ 1721 - "bitflags 2.9.1", 1722 - "cfg-if", 1723 - "libc", 1724 - ] 1725 - 1726 - [[package]] 1727 1889 name = "ipnet" 1728 1890 version = "2.11.0" 1729 1891 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1731 1893 1732 1894 [[package]] 1733 1895 name = "iri-string" 1734 - version = "0.7.8" 1896 + version = "0.7.9" 1735 1897 source = "registry+https://github.com/rust-lang/crates.io-index" 1736 - checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" 1898 + checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" 1737 1899 dependencies = [ 1738 1900 "memchr", 1739 1901 "serde", ··· 1811 1973 1812 1974 [[package]] 1813 1975 name = "js-sys" 1814 - version = "0.3.77" 1976 + version = "0.3.82" 1815 1977 source = "registry+https://github.com/rust-lang/crates.io-index" 1816 - checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 1978 + checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" 1817 1979 dependencies = [ 1818 1980 "once_cell", 1819 1981 "wasm-bindgen", ··· 1847 2009 source = "registry+https://github.com/rust-lang/crates.io-index" 1848 2010 checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" 1849 2011 dependencies = [ 1850 - "bitflags 2.9.1", 2012 + "bitflags 2.10.0", 1851 2013 "serde", 1852 2014 "unicode-segmentation", 1853 2015 ] ··· 1860 2022 dependencies = [ 1861 2023 "cssparser", 1862 2024 "html5ever", 1863 - "indexmap 2.10.0", 2025 + "indexmap 2.12.0", 1864 2026 "selectors", 1865 2027 ] 1866 2028 ··· 1890 2052 checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" 1891 2053 dependencies = [ 1892 2054 "gtk-sys", 1893 - "libloading", 2055 + "libloading 0.7.4", 1894 2056 "once_cell", 1895 2057 ] 1896 2058 1897 2059 [[package]] 1898 2060 name = "libc" 1899 - version = "0.2.174" 2061 + version = "0.2.177" 1900 2062 source = "registry+https://github.com/rust-lang/crates.io-index" 1901 - checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" 2063 + checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" 1902 2064 1903 2065 [[package]] 1904 2066 name = "libloading" ··· 1911 2073 ] 1912 2074 1913 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]] 1914 2086 name = "libredox" 1915 - version = "0.1.8" 2087 + version = "0.1.10" 1916 2088 source = "registry+https://github.com/rust-lang/crates.io-index" 1917 - checksum = "360e552c93fa0e8152ab463bc4c4837fce76a225df11dfaeea66c313de5e61f7" 2089 + checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" 1918 2090 dependencies = [ 1919 - "bitflags 2.9.1", 2091 + "bitflags 2.10.0", 1920 2092 "libc", 1921 2093 ] 1922 2094 1923 2095 [[package]] 1924 2096 name = "linux-raw-sys" 1925 - 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" 1926 2104 source = "registry+https://github.com/rust-lang/crates.io-index" 1927 - checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 2105 + checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" 1928 2106 1929 2107 [[package]] 1930 2108 name = "litemap" 1931 - version = "0.8.0" 2109 + version = "0.8.1" 1932 2110 source = "registry+https://github.com/rust-lang/crates.io-index" 1933 - checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 2111 + checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" 1934 2112 1935 2113 [[package]] 1936 2114 name = "lock_api" 1937 - version = "0.4.13" 2115 + version = "0.4.14" 1938 2116 source = "registry+https://github.com/rust-lang/crates.io-index" 1939 - checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" 2117 + checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" 1940 2118 dependencies = [ 1941 - "autocfg", 1942 2119 "scopeguard", 1943 2120 ] 1944 2121 1945 2122 [[package]] 1946 2123 name = "log" 1947 - version = "0.4.27" 2124 + version = "0.4.28" 1948 2125 source = "registry+https://github.com/rust-lang/crates.io-index" 1949 - checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 2126 + checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" 1950 2127 1951 2128 [[package]] 1952 2129 name = "mac" ··· 1976 2153 dependencies = [ 1977 2154 "proc-macro2", 1978 2155 "quote", 1979 - "syn 2.0.104", 2156 + "syn 2.0.109", 1980 2157 ] 1981 2158 1982 2159 [[package]] ··· 1987 2164 1988 2165 [[package]] 1989 2166 name = "memchr" 1990 - version = "2.7.5" 2167 + version = "2.7.6" 2168 + source = "registry+https://github.com/rust-lang/crates.io-index" 2169 + checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" 2170 + 2171 + [[package]] 2172 + name = "memmap2" 2173 + version = "0.9.9" 1991 2174 source = "registry+https://github.com/rust-lang/crates.io-index" 1992 - checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" 2175 + checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" 2176 + dependencies = [ 2177 + "libc", 2178 + ] 1993 2179 1994 2180 [[package]] 1995 2181 name = "memoffset" ··· 2007 2193 checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 2008 2194 2009 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]] 2010 2202 name = "miniz_oxide" 2011 2203 version = "0.8.9" 2012 2204 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2018 2210 2019 2211 [[package]] 2020 2212 name = "mio" 2021 - version = "1.0.4" 2213 + version = "1.1.0" 2022 2214 source = "registry+https://github.com/rust-lang/crates.io-index" 2023 - checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 2215 + checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" 2024 2216 dependencies = [ 2025 2217 "libc", 2026 2218 "wasi 0.11.1+wasi-snapshot-preview1", 2027 - "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", 2028 2230 ] 2029 2231 2030 2232 [[package]] 2031 2233 name = "muda" 2032 - version = "0.17.0" 2234 + version = "0.17.1" 2033 2235 source = "registry+https://github.com/rust-lang/crates.io-index" 2034 - checksum = "58b89bf91c19bf036347f1ab85a81c560f08c0667c8601bece664d860a600988" 2236 + checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" 2035 2237 dependencies = [ 2036 2238 "crossbeam-channel", 2037 2239 "dpi", 2038 2240 "gtk", 2039 2241 "keyboard-types", 2040 - "objc2 0.6.1", 2242 + "objc2 0.6.3", 2041 2243 "objc2-app-kit", 2042 2244 "objc2-core-foundation", 2043 - "objc2-foundation 0.3.1", 2245 + "objc2-foundation 0.3.2", 2044 2246 "once_cell", 2045 - "png", 2247 + "png 0.17.16", 2046 2248 "serde", 2047 - "thiserror 2.0.12", 2048 - "windows-sys 0.59.0", 2249 + "thiserror 2.0.17", 2250 + "windows-sys 0.60.2", 2049 2251 ] 2050 2252 2051 2253 [[package]] ··· 2054 2256 source = "registry+https://github.com/rust-lang/crates.io-index" 2055 2257 checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" 2056 2258 dependencies = [ 2057 - "bitflags 2.9.1", 2259 + "bitflags 2.10.0", 2058 2260 "jni-sys", 2059 2261 "log", 2060 2262 "ndk-sys", ··· 2090 2292 source = "registry+https://github.com/rust-lang/crates.io-index" 2091 2293 checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" 2092 2294 dependencies = [ 2093 - "bitflags 2.9.1", 2295 + "bitflags 2.10.0", 2094 2296 "cfg-if", 2095 2297 "cfg_aliases", 2096 2298 "libc", ··· 2104 2306 checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" 2105 2307 2106 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]] 2107 2328 name = "num-conv" 2108 2329 version = "0.1.0" 2109 2330 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2120 2341 2121 2342 [[package]] 2122 2343 name = "num_enum" 2123 - version = "0.7.4" 2344 + version = "0.7.5" 2124 2345 source = "registry+https://github.com/rust-lang/crates.io-index" 2125 - checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" 2346 + checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" 2126 2347 dependencies = [ 2127 2348 "num_enum_derive", 2128 2349 "rustversion", ··· 2130 2351 2131 2352 [[package]] 2132 2353 name = "num_enum_derive" 2133 - version = "0.7.4" 2354 + version = "0.7.5" 2134 2355 source = "registry+https://github.com/rust-lang/crates.io-index" 2135 - checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" 2356 + checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" 2136 2357 dependencies = [ 2137 - "proc-macro-crate 3.3.0", 2358 + "proc-macro-crate 3.4.0", 2138 2359 "proc-macro2", 2139 2360 "quote", 2140 - "syn 2.0.104", 2361 + "syn 2.0.109", 2141 2362 ] 2142 2363 2143 2364 [[package]] ··· 2158 2379 2159 2380 [[package]] 2160 2381 name = "objc2" 2161 - version = "0.6.1" 2382 + version = "0.6.3" 2162 2383 source = "registry+https://github.com/rust-lang/crates.io-index" 2163 - checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" 2384 + checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" 2164 2385 dependencies = [ 2165 2386 "objc2-encode", 2166 2387 "objc2-exception-helper", ··· 2168 2389 2169 2390 [[package]] 2170 2391 name = "objc2-app-kit" 2171 - version = "0.3.1" 2392 + version = "0.3.2" 2172 2393 source = "registry+https://github.com/rust-lang/crates.io-index" 2173 - checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" 2394 + checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" 2174 2395 dependencies = [ 2175 - "bitflags 2.9.1", 2176 - "block2 0.6.1", 2396 + "bitflags 2.10.0", 2397 + "block2 0.6.2", 2177 2398 "libc", 2178 - "objc2 0.6.1", 2399 + "objc2 0.6.3", 2179 2400 "objc2-cloud-kit", 2180 2401 "objc2-core-data", 2181 2402 "objc2-core-foundation", 2182 2403 "objc2-core-graphics", 2183 2404 "objc2-core-image", 2184 - "objc2-foundation 0.3.1", 2185 - "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", 2186 2409 ] 2187 2410 2188 2411 [[package]] 2189 2412 name = "objc2-cloud-kit" 2190 - version = "0.3.1" 2413 + version = "0.3.2" 2191 2414 source = "registry+https://github.com/rust-lang/crates.io-index" 2192 - checksum = "17614fdcd9b411e6ff1117dfb1d0150f908ba83a7df81b1f118005fe0a8ea15d" 2415 + checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" 2193 2416 dependencies = [ 2194 - "bitflags 2.9.1", 2195 - "objc2 0.6.1", 2196 - "objc2-foundation 0.3.1", 2417 + "bitflags 2.10.0", 2418 + "objc2 0.6.3", 2419 + "objc2-foundation 0.3.2", 2197 2420 ] 2198 2421 2199 2422 [[package]] 2200 2423 name = "objc2-core-data" 2201 - version = "0.3.1" 2424 + version = "0.3.2" 2202 2425 source = "registry+https://github.com/rust-lang/crates.io-index" 2203 - checksum = "291fbbf7d29287518e8686417cf7239c74700fd4b607623140a7d4a3c834329d" 2426 + checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" 2204 2427 dependencies = [ 2205 - "bitflags 2.9.1", 2206 - "objc2 0.6.1", 2207 - "objc2-foundation 0.3.1", 2428 + "bitflags 2.10.0", 2429 + "objc2 0.6.3", 2430 + "objc2-foundation 0.3.2", 2208 2431 ] 2209 2432 2210 2433 [[package]] 2211 2434 name = "objc2-core-foundation" 2212 - version = "0.3.1" 2435 + version = "0.3.2" 2213 2436 source = "registry+https://github.com/rust-lang/crates.io-index" 2214 - checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" 2437 + checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" 2215 2438 dependencies = [ 2216 - "bitflags 2.9.1", 2439 + "bitflags 2.10.0", 2217 2440 "dispatch2", 2218 - "objc2 0.6.1", 2441 + "objc2 0.6.3", 2219 2442 ] 2220 2443 2221 2444 [[package]] 2222 2445 name = "objc2-core-graphics" 2223 - version = "0.3.1" 2446 + version = "0.3.2" 2224 2447 source = "registry+https://github.com/rust-lang/crates.io-index" 2225 - checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" 2448 + checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" 2226 2449 dependencies = [ 2227 - "bitflags 2.9.1", 2450 + "bitflags 2.10.0", 2228 2451 "dispatch2", 2229 - "objc2 0.6.1", 2452 + "objc2 0.6.3", 2230 2453 "objc2-core-foundation", 2231 2454 "objc2-io-surface", 2232 2455 ] 2233 2456 2234 2457 [[package]] 2235 2458 name = "objc2-core-image" 2236 - 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" 2237 2492 source = "registry+https://github.com/rust-lang/crates.io-index" 2238 - checksum = "79b3dc0cc4386b6ccf21c157591b34a7f44c8e75b064f85502901ab2188c007e" 2493 + checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" 2239 2494 dependencies = [ 2240 - "objc2 0.6.1", 2241 - "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", 2242 2500 ] 2243 2501 2244 2502 [[package]] ··· 2262 2520 source = "registry+https://github.com/rust-lang/crates.io-index" 2263 2521 checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" 2264 2522 dependencies = [ 2265 - "bitflags 2.9.1", 2523 + "bitflags 2.10.0", 2266 2524 "block2 0.5.1", 2267 2525 "libc", 2268 2526 "objc2 0.5.2", ··· 2270 2528 2271 2529 [[package]] 2272 2530 name = "objc2-foundation" 2273 - version = "0.3.1" 2531 + version = "0.3.2" 2274 2532 source = "registry+https://github.com/rust-lang/crates.io-index" 2275 - checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" 2533 + checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" 2276 2534 dependencies = [ 2277 - "bitflags 2.9.1", 2278 - "block2 0.6.1", 2535 + "bitflags 2.10.0", 2536 + "block2 0.6.2", 2279 2537 "libc", 2280 - "objc2 0.6.1", 2538 + "objc2 0.6.3", 2281 2539 "objc2-core-foundation", 2282 2540 ] 2283 2541 2284 2542 [[package]] 2285 2543 name = "objc2-io-surface" 2286 - version = "0.3.1" 2544 + version = "0.3.2" 2287 2545 source = "registry+https://github.com/rust-lang/crates.io-index" 2288 - checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" 2546 + checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" 2289 2547 dependencies = [ 2290 - "bitflags 2.9.1", 2291 - "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", 2292 2560 "objc2-core-foundation", 2293 2561 ] 2294 2562 ··· 2298 2566 source = "registry+https://github.com/rust-lang/crates.io-index" 2299 2567 checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" 2300 2568 dependencies = [ 2301 - "bitflags 2.9.1", 2569 + "bitflags 2.10.0", 2302 2570 "block2 0.5.1", 2303 2571 "objc2 0.5.2", 2304 2572 "objc2-foundation 0.2.2", ··· 2310 2578 source = "registry+https://github.com/rust-lang/crates.io-index" 2311 2579 checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" 2312 2580 dependencies = [ 2313 - "bitflags 2.9.1", 2581 + "bitflags 2.10.0", 2314 2582 "block2 0.5.1", 2315 2583 "objc2 0.5.2", 2316 2584 "objc2-foundation 0.2.2", ··· 2319 2587 2320 2588 [[package]] 2321 2589 name = "objc2-quartz-core" 2322 - version = "0.3.1" 2590 + version = "0.3.2" 2323 2591 source = "registry+https://github.com/rust-lang/crates.io-index" 2324 - checksum = "90ffb6a0cd5f182dc964334388560b12a57f7b74b3e2dec5e2722aa2dfb2ccd5" 2592 + checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" 2325 2593 dependencies = [ 2326 - "bitflags 2.9.1", 2327 - "objc2 0.6.1", 2328 - "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", 2598 + ] 2599 + 2600 + [[package]] 2601 + name = "objc2-security" 2602 + version = "0.3.2" 2603 + source = "registry+https://github.com/rust-lang/crates.io-index" 2604 + checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" 2605 + dependencies = [ 2606 + "bitflags 2.10.0", 2607 + "objc2 0.6.3", 2608 + "objc2-core-foundation", 2329 2609 ] 2330 2610 2331 2611 [[package]] 2332 2612 name = "objc2-ui-kit" 2333 - version = "0.3.1" 2613 + version = "0.3.2" 2334 2614 source = "registry+https://github.com/rust-lang/crates.io-index" 2335 - checksum = "25b1312ad7bc8a0e92adae17aa10f90aae1fb618832f9b993b022b591027daed" 2615 + checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" 2336 2616 dependencies = [ 2337 - "bitflags 2.9.1", 2338 - "objc2 0.6.1", 2617 + "bitflags 2.10.0", 2618 + "block2 0.6.2", 2619 + "objc2 0.6.3", 2620 + "objc2-cloud-kit", 2621 + "objc2-core-data", 2339 2622 "objc2-core-foundation", 2340 - "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", 2341 2630 ] 2342 2631 2343 2632 [[package]] 2344 - name = "objc2-web-kit" 2345 - version = "0.3.1" 2633 + name = "objc2-user-notifications" 2634 + version = "0.3.2" 2346 2635 source = "registry+https://github.com/rust-lang/crates.io-index" 2347 - checksum = "91672909de8b1ce1c2252e95bbee8c1649c9ad9d14b9248b3d7b4c47903c47ad" 2636 + checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" 2348 2637 dependencies = [ 2349 - "bitflags 2.9.1", 2350 - "block2 0.6.1", 2351 - "objc2 0.6.1", 2352 - "objc2-app-kit", 2353 - "objc2-core-foundation", 2354 - "objc2-foundation 0.3.1", 2638 + "objc2 0.6.3", 2639 + "objc2-foundation 0.3.2", 2355 2640 ] 2356 2641 2357 2642 [[package]] 2358 - name = "object" 2359 - version = "0.36.7" 2643 + name = "objc2-web-kit" 2644 + version = "0.3.2" 2360 2645 source = "registry+https://github.com/rust-lang/crates.io-index" 2361 - checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 2646 + checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" 2362 2647 dependencies = [ 2363 - "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", 2364 2656 ] 2365 2657 2366 2658 [[package]] ··· 2398 2690 ] 2399 2691 2400 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]] 2401 2719 name = "pango" 2402 2720 version = "0.18.3" 2403 2721 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2430 2748 2431 2749 [[package]] 2432 2750 name = "parking_lot" 2433 - version = "0.12.4" 2751 + version = "0.12.5" 2434 2752 source = "registry+https://github.com/rust-lang/crates.io-index" 2435 - checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" 2753 + checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" 2436 2754 dependencies = [ 2437 2755 "lock_api", 2438 2756 "parking_lot_core", ··· 2440 2758 2441 2759 [[package]] 2442 2760 name = "parking_lot_core" 2443 - version = "0.9.11" 2761 + version = "0.9.12" 2444 2762 source = "registry+https://github.com/rust-lang/crates.io-index" 2445 - checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" 2763 + checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" 2446 2764 dependencies = [ 2447 2765 "cfg-if", 2448 2766 "libc", 2449 2767 "redox_syscall", 2450 2768 "smallvec", 2451 - "windows-targets 0.52.6", 2769 + "windows-link 0.2.1", 2452 2770 ] 2453 2771 2454 2772 [[package]] ··· 2459 2777 2460 2778 [[package]] 2461 2779 name = "percent-encoding" 2462 - version = "2.3.1" 2780 + version = "2.3.2" 2463 2781 source = "registry+https://github.com/rust-lang/crates.io-index" 2464 - 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 + ] 2465 2794 2466 2795 [[package]] 2467 2796 name = "phf" ··· 2567 2896 "phf_shared 0.11.3", 2568 2897 "proc-macro2", 2569 2898 "quote", 2570 - "syn 2.0.104", 2899 + "syn 2.0.109", 2571 2900 ] 2572 2901 2573 2902 [[package]] ··· 2628 2957 2629 2958 [[package]] 2630 2959 name = "plist" 2631 - version = "1.7.4" 2960 + version = "1.8.0" 2632 2961 source = "registry+https://github.com/rust-lang/crates.io-index" 2633 - checksum = "3af6b589e163c5a788fab00ce0c0366f6efbb9959c2f9874b224936af7fce7e1" 2962 + checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" 2634 2963 dependencies = [ 2635 2964 "base64 0.22.1", 2636 - "indexmap 2.10.0", 2637 - "quick-xml", 2965 + "indexmap 2.12.0", 2966 + "quick-xml 0.38.3", 2638 2967 "serde", 2639 2968 "time", 2640 2969 ] ··· 2653 2982 ] 2654 2983 2655 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]] 2656 2998 name = "polling" 2657 - version = "3.9.0" 2999 + version = "3.11.0" 2658 3000 source = "registry+https://github.com/rust-lang/crates.io-index" 2659 - checksum = "8ee9b2fa7a4517d2c91ff5bc6c297a427a96749d15f98fcdbb22c05571a4d4b7" 3001 + checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" 2660 3002 dependencies = [ 2661 3003 "cfg-if", 2662 3004 "concurrent-queue", 2663 3005 "hermit-abi", 2664 3006 "pin-project-lite", 2665 - "rustix", 2666 - "windows-sys 0.60.2", 3007 + "rustix 1.1.2", 3008 + "windows-sys 0.61.2", 2667 3009 ] 2668 3010 2669 3011 [[package]] 2670 3012 name = "potential_utf" 2671 - version = "0.1.2" 3013 + version = "0.1.4" 2672 3014 source = "registry+https://github.com/rust-lang/crates.io-index" 2673 - checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" 3015 + checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" 2674 3016 dependencies = [ 2675 3017 "zerovec", 2676 3018 ] ··· 2708 3050 2709 3051 [[package]] 2710 3052 name = "proc-macro-crate" 2711 - version = "2.0.0" 3053 + version = "2.0.2" 2712 3054 source = "registry+https://github.com/rust-lang/crates.io-index" 2713 - checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" 3055 + checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" 2714 3056 dependencies = [ 2715 - "toml_edit 0.20.7", 3057 + "toml_datetime 0.6.3", 3058 + "toml_edit 0.20.2", 2716 3059 ] 2717 3060 2718 3061 [[package]] 2719 3062 name = "proc-macro-crate" 2720 - version = "3.3.0" 3063 + version = "3.4.0" 2721 3064 source = "registry+https://github.com/rust-lang/crates.io-index" 2722 - checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" 3065 + checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" 2723 3066 dependencies = [ 2724 - "toml_edit 0.22.27", 3067 + "toml_edit 0.23.7", 2725 3068 ] 2726 3069 2727 3070 [[package]] ··· 2756 3099 2757 3100 [[package]] 2758 3101 name = "proc-macro2" 2759 - version = "1.0.95" 3102 + version = "1.0.103" 2760 3103 source = "registry+https://github.com/rust-lang/crates.io-index" 2761 - checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 3104 + checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" 2762 3105 dependencies = [ 2763 3106 "unicode-ident", 2764 3107 ] 2765 3108 2766 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]] 2767 3125 name = "quick-xml" 2768 - version = "0.38.0" 3126 + version = "0.37.5" 3127 + source = "registry+https://github.com/rust-lang/crates.io-index" 3128 + checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" 3129 + dependencies = [ 3130 + "memchr", 3131 + ] 3132 + 3133 + [[package]] 3134 + name = "quick-xml" 3135 + version = "0.38.3" 2769 3136 source = "registry+https://github.com/rust-lang/crates.io-index" 2770 - checksum = "8927b0664f5c5a98265138b7e3f90aa19a6b21353182469ace36d4ac527b7b1b" 3137 + checksum = "42a232e7487fc2ef313d96dde7948e7a3c05101870d8985e4fd8d26aedd27b89" 2771 3138 dependencies = [ 2772 3139 "memchr", 2773 3140 ] 2774 3141 2775 3142 [[package]] 2776 3143 name = "quote" 2777 - version = "1.0.40" 3144 + version = "1.0.42" 2778 3145 source = "registry+https://github.com/rust-lang/crates.io-index" 2779 - checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 3146 + checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" 2780 3147 dependencies = [ 2781 3148 "proc-macro2", 2782 3149 ] ··· 2813 3180 ] 2814 3181 2815 3182 [[package]] 3183 + name = "rand" 3184 + version = "0.9.2" 3185 + source = "registry+https://github.com/rust-lang/crates.io-index" 3186 + checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" 3187 + dependencies = [ 3188 + "rand_chacha 0.9.0", 3189 + "rand_core 0.9.3", 3190 + ] 3191 + 3192 + [[package]] 2816 3193 name = "rand_chacha" 2817 3194 version = "0.2.2" 2818 3195 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2833 3210 ] 2834 3211 2835 3212 [[package]] 3213 + name = "rand_chacha" 3214 + version = "0.9.0" 3215 + source = "registry+https://github.com/rust-lang/crates.io-index" 3216 + checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 3217 + dependencies = [ 3218 + "ppv-lite86", 3219 + "rand_core 0.9.3", 3220 + ] 3221 + 3222 + [[package]] 2836 3223 name = "rand_core" 2837 3224 version = "0.5.1" 2838 3225 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2851 3238 ] 2852 3239 2853 3240 [[package]] 3241 + name = "rand_core" 3242 + version = "0.9.3" 3243 + source = "registry+https://github.com/rust-lang/crates.io-index" 3244 + checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 3245 + dependencies = [ 3246 + "getrandom 0.3.4", 3247 + ] 3248 + 3249 + [[package]] 2854 3250 name = "rand_hc" 2855 3251 version = "0.2.0" 2856 3252 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2876 3272 2877 3273 [[package]] 2878 3274 name = "redox_syscall" 2879 - version = "0.5.17" 3275 + version = "0.5.18" 2880 3276 source = "registry+https://github.com/rust-lang/crates.io-index" 2881 - checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" 3277 + checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" 2882 3278 dependencies = [ 2883 - "bitflags 2.9.1", 3279 + "bitflags 2.10.0", 2884 3280 ] 2885 3281 2886 3282 [[package]] 2887 3283 name = "redox_users" 2888 - version = "0.5.0" 3284 + version = "0.5.2" 2889 3285 source = "registry+https://github.com/rust-lang/crates.io-index" 2890 - checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" 3286 + checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" 2891 3287 dependencies = [ 2892 3288 "getrandom 0.2.16", 2893 3289 "libredox", 2894 - "thiserror 2.0.12", 3290 + "thiserror 2.0.17", 2895 3291 ] 2896 3292 2897 3293 [[package]] 2898 3294 name = "ref-cast" 2899 - version = "1.0.24" 3295 + version = "1.0.25" 2900 3296 source = "registry+https://github.com/rust-lang/crates.io-index" 2901 - checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" 3297 + checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" 2902 3298 dependencies = [ 2903 3299 "ref-cast-impl", 2904 3300 ] 2905 3301 2906 3302 [[package]] 2907 3303 name = "ref-cast-impl" 2908 - version = "1.0.24" 3304 + version = "1.0.25" 2909 3305 source = "registry+https://github.com/rust-lang/crates.io-index" 2910 - checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" 3306 + checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" 2911 3307 dependencies = [ 2912 3308 "proc-macro2", 2913 3309 "quote", 2914 - "syn 2.0.104", 3310 + "syn 2.0.109", 2915 3311 ] 2916 3312 2917 3313 [[package]] 2918 3314 name = "regex" 2919 - version = "1.11.1" 3315 + version = "1.12.2" 2920 3316 source = "registry+https://github.com/rust-lang/crates.io-index" 2921 - checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 3317 + checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" 2922 3318 dependencies = [ 2923 3319 "aho-corasick", 2924 3320 "memchr", ··· 2928 3324 2929 3325 [[package]] 2930 3326 name = "regex-automata" 2931 - version = "0.4.9" 3327 + version = "0.4.13" 2932 3328 source = "registry+https://github.com/rust-lang/crates.io-index" 2933 - checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 3329 + checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" 2934 3330 dependencies = [ 2935 3331 "aho-corasick", 2936 3332 "memchr", ··· 2939 3335 2940 3336 [[package]] 2941 3337 name = "regex-syntax" 2942 - version = "0.8.5" 3338 + version = "0.8.8" 2943 3339 source = "registry+https://github.com/rust-lang/crates.io-index" 2944 - checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 3340 + checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" 2945 3341 2946 3342 [[package]] 2947 3343 name = "reqwest" 2948 - version = "0.12.22" 3344 + version = "0.12.24" 2949 3345 source = "registry+https://github.com/rust-lang/crates.io-index" 2950 - checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" 3346 + checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" 2951 3347 dependencies = [ 2952 3348 "base64 0.22.1", 2953 3349 "bytes", ··· 2979 3375 ] 2980 3376 2981 3377 [[package]] 2982 - name = "rustc-demangle" 2983 - version = "0.1.26" 3378 + name = "rfd" 3379 + version = "0.15.4" 2984 3380 source = "registry+https://github.com/rust-lang/crates.io-index" 2985 - checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" 3381 + checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" 3382 + dependencies = [ 3383 + "ashpd", 3384 + "block2 0.6.2", 3385 + "dispatch2", 3386 + "glib-sys", 3387 + "gobject-sys", 3388 + "gtk-sys", 3389 + "js-sys", 3390 + "log", 3391 + "objc2 0.6.3", 3392 + "objc2-app-kit", 3393 + "objc2-core-foundation", 3394 + "objc2-foundation 0.3.2", 3395 + "raw-window-handle", 3396 + "wasm-bindgen", 3397 + "wasm-bindgen-futures", 3398 + "web-sys", 3399 + "windows-sys 0.59.0", 3400 + ] 2986 3401 2987 3402 [[package]] 2988 3403 name = "rustc_version" ··· 2995 3410 2996 3411 [[package]] 2997 3412 name = "rustix" 2998 - 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" 2999 3427 source = "registry+https://github.com/rust-lang/crates.io-index" 3000 - checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" 3428 + checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" 3001 3429 dependencies = [ 3002 - "bitflags 2.9.1", 3430 + "bitflags 2.10.0", 3003 3431 "errno", 3004 3432 "libc", 3005 - "linux-raw-sys", 3006 - "windows-sys 0.60.2", 3433 + "linux-raw-sys 0.11.0", 3434 + "windows-sys 0.61.2", 3007 3435 ] 3008 3436 3009 3437 [[package]] 3010 3438 name = "rustversion" 3011 - version = "1.0.21" 3439 + version = "1.0.22" 3012 3440 source = "registry+https://github.com/rust-lang/crates.io-index" 3013 - checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" 3441 + checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 3014 3442 3015 3443 [[package]] 3016 3444 name = "ryu" ··· 3056 3484 3057 3485 [[package]] 3058 3486 name = "schemars" 3059 - version = "1.0.4" 3487 + version = "1.1.0" 3060 3488 source = "registry+https://github.com/rust-lang/crates.io-index" 3061 - checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" 3489 + checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" 3062 3490 dependencies = [ 3063 3491 "dyn-clone", 3064 3492 "ref-cast", ··· 3075 3503 "proc-macro2", 3076 3504 "quote", 3077 3505 "serde_derive_internals", 3078 - "syn 2.0.104", 3506 + "syn 2.0.109", 3079 3507 ] 3080 3508 3081 3509 [[package]] 3510 + name = "scoped-tls" 3511 + version = "1.0.1" 3512 + source = "registry+https://github.com/rust-lang/crates.io-index" 3513 + checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 3514 + 3515 + [[package]] 3082 3516 name = "scopeguard" 3083 3517 version = "1.2.0" 3084 3518 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3104 3538 3105 3539 [[package]] 3106 3540 name = "semver" 3107 - version = "1.0.26" 3541 + version = "1.0.27" 3108 3542 source = "registry+https://github.com/rust-lang/crates.io-index" 3109 - checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" 3543 + checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" 3110 3544 dependencies = [ 3111 3545 "serde", 3546 + "serde_core", 3112 3547 ] 3113 3548 3114 3549 [[package]] 3115 3550 name = "serde" 3116 - version = "1.0.219" 3551 + version = "1.0.228" 3117 3552 source = "registry+https://github.com/rust-lang/crates.io-index" 3118 - checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 3553 + checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 3119 3554 dependencies = [ 3555 + "serde_core", 3120 3556 "serde_derive", 3121 3557 ] 3122 3558 3123 3559 [[package]] 3124 3560 name = "serde-untagged" 3125 - version = "0.1.7" 3561 + version = "0.1.9" 3126 3562 source = "registry+https://github.com/rust-lang/crates.io-index" 3127 - checksum = "299d9c19d7d466db4ab10addd5703e4c615dec2a5a16dbbafe191045e87ee66e" 3563 + checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" 3128 3564 dependencies = [ 3129 3565 "erased-serde", 3130 3566 "serde", 3567 + "serde_core", 3131 3568 "typeid", 3132 3569 ] 3133 3570 3134 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]] 3135 3581 name = "serde_derive" 3136 - version = "1.0.219" 3582 + version = "1.0.228" 3137 3583 source = "registry+https://github.com/rust-lang/crates.io-index" 3138 - checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 3584 + checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 3139 3585 dependencies = [ 3140 3586 "proc-macro2", 3141 3587 "quote", 3142 - "syn 2.0.104", 3588 + "syn 2.0.109", 3143 3589 ] 3144 3590 3145 3591 [[package]] ··· 3150 3596 dependencies = [ 3151 3597 "proc-macro2", 3152 3598 "quote", 3153 - "syn 2.0.104", 3599 + "syn 2.0.109", 3154 3600 ] 3155 3601 3156 3602 [[package]] 3157 3603 name = "serde_json" 3158 - version = "1.0.141" 3604 + version = "1.0.145" 3159 3605 source = "registry+https://github.com/rust-lang/crates.io-index" 3160 - checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" 3606 + checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" 3161 3607 dependencies = [ 3162 3608 "itoa", 3163 3609 "memchr", 3164 3610 "ryu", 3165 3611 "serde", 3612 + "serde_core", 3166 3613 ] 3167 3614 3168 3615 [[package]] ··· 3173 3620 dependencies = [ 3174 3621 "proc-macro2", 3175 3622 "quote", 3176 - "syn 2.0.104", 3623 + "syn 2.0.109", 3177 3624 ] 3178 3625 3179 3626 [[package]] ··· 3187 3634 3188 3635 [[package]] 3189 3636 name = "serde_spanned" 3190 - version = "1.0.0" 3637 + version = "1.0.3" 3191 3638 source = "registry+https://github.com/rust-lang/crates.io-index" 3192 - checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" 3639 + checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" 3193 3640 dependencies = [ 3194 - "serde", 3641 + "serde_core", 3195 3642 ] 3196 3643 3197 3644 [[package]] ··· 3208 3655 3209 3656 [[package]] 3210 3657 name = "serde_with" 3211 - version = "3.14.0" 3658 + version = "3.15.1" 3212 3659 source = "registry+https://github.com/rust-lang/crates.io-index" 3213 - checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" 3660 + checksum = "aa66c845eee442168b2c8134fec70ac50dc20e760769c8ba0ad1319ca1959b04" 3214 3661 dependencies = [ 3215 3662 "base64 0.22.1", 3216 3663 "chrono", 3217 3664 "hex", 3218 3665 "indexmap 1.9.3", 3219 - "indexmap 2.10.0", 3666 + "indexmap 2.12.0", 3220 3667 "schemars 0.9.0", 3221 - "schemars 1.0.4", 3222 - "serde", 3223 - "serde_derive", 3668 + "schemars 1.1.0", 3669 + "serde_core", 3224 3670 "serde_json", 3225 3671 "serde_with_macros", 3226 3672 "time", ··· 3228 3674 3229 3675 [[package]] 3230 3676 name = "serde_with_macros" 3231 - version = "3.14.0" 3677 + version = "3.15.1" 3232 3678 source = "registry+https://github.com/rust-lang/crates.io-index" 3233 - checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" 3679 + checksum = "b91a903660542fced4e99881aa481bdbaec1634568ee02e0b8bd57c64cb38955" 3234 3680 dependencies = [ 3235 3681 "darling", 3236 3682 "proc-macro2", 3237 3683 "quote", 3238 - "syn 2.0.104", 3684 + "syn 2.0.109", 3239 3685 ] 3240 3686 3241 3687 [[package]] 3242 3688 name = "serialize-to-javascript" 3243 - version = "0.1.1" 3689 + version = "0.1.2" 3244 3690 source = "registry+https://github.com/rust-lang/crates.io-index" 3245 - checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" 3691 + checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" 3246 3692 dependencies = [ 3247 3693 "serde", 3248 3694 "serde_json", ··· 3251 3697 3252 3698 [[package]] 3253 3699 name = "serialize-to-javascript-impl" 3254 - version = "0.1.1" 3700 + version = "0.1.2" 3255 3701 source = "registry+https://github.com/rust-lang/crates.io-index" 3256 - checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" 3702 + checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" 3257 3703 dependencies = [ 3258 3704 "proc-macro2", 3259 3705 "quote", 3260 - "syn 1.0.109", 3706 + "syn 2.0.109", 3261 3707 ] 3262 3708 3263 3709 [[package]] ··· 3289 3735 3290 3736 [[package]] 3291 3737 name = "signal-hook-registry" 3292 - version = "1.4.5" 3738 + version = "1.4.6" 3293 3739 source = "registry+https://github.com/rust-lang/crates.io-index" 3294 - checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" 3740 + checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" 3295 3741 dependencies = [ 3296 3742 "libc", 3297 3743 ] ··· 3316 3762 3317 3763 [[package]] 3318 3764 name = "slab" 3319 - version = "0.4.10" 3765 + version = "0.4.11" 3320 3766 source = "registry+https://github.com/rust-lang/crates.io-index" 3321 - checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" 3767 + checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" 3322 3768 3323 3769 [[package]] 3324 3770 name = "smallvec" ··· 3328 3774 3329 3775 [[package]] 3330 3776 name = "socket2" 3331 - version = "0.6.0" 3777 + version = "0.6.1" 3332 3778 source = "registry+https://github.com/rust-lang/crates.io-index" 3333 - checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" 3779 + checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" 3334 3780 dependencies = [ 3335 3781 "libc", 3336 - "windows-sys 0.59.0", 3782 + "windows-sys 0.60.2", 3337 3783 ] 3338 3784 3339 3785 [[package]] ··· 3344 3790 dependencies = [ 3345 3791 "bytemuck", 3346 3792 "cfg_aliases", 3347 - "core-graphics", 3793 + "core-graphics 0.24.0", 3348 3794 "foreign-types", 3349 3795 "js-sys", 3350 3796 "log", ··· 3386 3832 3387 3833 [[package]] 3388 3834 name = "stable_deref_trait" 3389 - version = "1.2.0" 3835 + version = "1.2.1" 3390 3836 source = "registry+https://github.com/rust-lang/crates.io-index" 3391 - checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 3837 + checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" 3392 3838 3393 3839 [[package]] 3394 3840 name = "static_assertions" ··· 3451 3897 3452 3898 [[package]] 3453 3899 name = "syn" 3454 - version = "2.0.104" 3900 + version = "2.0.109" 3455 3901 source = "registry+https://github.com/rust-lang/crates.io-index" 3456 - checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" 3902 + checksum = "2f17c7e013e88258aa9543dcbe81aca68a667a9ac37cd69c9fbc07858bfe0e2f" 3457 3903 dependencies = [ 3458 3904 "proc-macro2", 3459 3905 "quote", ··· 3477 3923 dependencies = [ 3478 3924 "proc-macro2", 3479 3925 "quote", 3480 - "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", 3481 3936 ] 3482 3937 3483 3938 [[package]] ··· 3489 3944 "cfg-expr", 3490 3945 "heck 0.5.0", 3491 3946 "pkg-config", 3492 - "toml 0.8.23", 3947 + "toml 0.8.2", 3493 3948 "version-compare", 3494 3949 ] 3495 3950 3496 3951 [[package]] 3497 3952 name = "tao" 3498 - version = "0.34.0" 3953 + version = "0.34.5" 3499 3954 source = "registry+https://github.com/rust-lang/crates.io-index" 3500 - checksum = "49c380ca75a231b87b6c9dd86948f035012e7171d1a7c40a9c2890489a7ffd8a" 3955 + checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" 3501 3956 dependencies = [ 3502 - "bitflags 2.9.1", 3957 + "bitflags 2.10.0", 3958 + "block2 0.6.2", 3503 3959 "core-foundation", 3504 - "core-graphics", 3960 + "core-graphics 0.24.0", 3505 3961 "crossbeam-channel", 3506 3962 "dispatch", 3507 3963 "dlopen2", ··· 3516 3972 "ndk", 3517 3973 "ndk-context", 3518 3974 "ndk-sys", 3519 - "objc2 0.6.1", 3975 + "objc2 0.6.3", 3520 3976 "objc2-app-kit", 3521 - "objc2-foundation 0.3.1", 3977 + "objc2-foundation 0.3.2", 3522 3978 "once_cell", 3523 3979 "parking_lot", 3524 3980 "raw-window-handle", ··· 3527 3983 "unicode-segmentation", 3528 3984 "url", 3529 3985 "windows", 3530 - "windows-core", 3986 + "windows-core 0.61.2", 3531 3987 "windows-version", 3532 3988 "x11-dl", 3533 3989 ] ··· 3540 3996 dependencies = [ 3541 3997 "proc-macro2", 3542 3998 "quote", 3543 - "syn 2.0.104", 3999 + "syn 2.0.109", 3544 4000 ] 3545 4001 3546 4002 [[package]] ··· 3551 4007 3552 4008 [[package]] 3553 4009 name = "tauri" 3554 - version = "2.7.0" 4010 + version = "2.9.2" 3555 4011 source = "registry+https://github.com/rust-lang/crates.io-index" 3556 - checksum = "352a4bc7bf6c25f5624227e3641adf475a6535707451b09bb83271df8b7a6ac7" 4012 + checksum = "8bceb52453e507c505b330afe3398510e87f428ea42b6e76ecb6bd63b15965b5" 3557 4013 dependencies = [ 3558 4014 "anyhow", 3559 4015 "bytes", 4016 + "cookie", 3560 4017 "dirs", 3561 4018 "dunce", 3562 4019 "embed_plist", 3563 - "getrandom 0.3.3", 4020 + "getrandom 0.3.4", 3564 4021 "glob", 3565 4022 "gtk", 3566 4023 "heck 0.5.0", 3567 4024 "http", 4025 + "image", 3568 4026 "jni", 3569 4027 "libc", 3570 4028 "log", 3571 4029 "mime", 3572 4030 "muda", 3573 - "objc2 0.6.1", 4031 + "objc2 0.6.3", 3574 4032 "objc2-app-kit", 3575 - "objc2-foundation 0.3.1", 4033 + "objc2-foundation 0.3.2", 3576 4034 "objc2-ui-kit", 4035 + "objc2-web-kit", 3577 4036 "percent-encoding", 3578 4037 "plist", 3579 4038 "raw-window-handle", ··· 3588 4047 "tauri-runtime", 3589 4048 "tauri-runtime-wry", 3590 4049 "tauri-utils", 3591 - "thiserror 2.0.12", 4050 + "thiserror 2.0.17", 3592 4051 "tokio", 3593 4052 "tray-icon", 3594 4053 "url", 3595 - "urlpattern", 3596 4054 "webkit2gtk", 3597 4055 "webview2-com", 3598 4056 "window-vibrancy", ··· 3601 4059 3602 4060 [[package]] 3603 4061 name = "tauri-build" 3604 - version = "2.3.1" 4062 + version = "2.5.1" 3605 4063 source = "registry+https://github.com/rust-lang/crates.io-index" 3606 - checksum = "182d688496c06bf08ea896459bf483eb29cdff35c1c4c115fb14053514303064" 4064 + checksum = "a924b6c50fe83193f0f8b14072afa7c25b7a72752a2a73d9549b463f5fe91a38" 3607 4065 dependencies = [ 3608 4066 "anyhow", 3609 4067 "cargo_toml", ··· 3617 4075 "serde_json", 3618 4076 "tauri-utils", 3619 4077 "tauri-winres", 3620 - "toml 0.8.23", 4078 + "toml 0.9.8", 3621 4079 "walkdir", 3622 4080 ] 3623 4081 3624 4082 [[package]] 3625 4083 name = "tauri-codegen" 3626 - version = "2.3.1" 4084 + version = "2.5.0" 3627 4085 source = "registry+https://github.com/rust-lang/crates.io-index" 3628 - checksum = "b54a99a6cd8e01abcfa61508177e6096a4fe2681efecee9214e962f2f073ae4a" 4086 + checksum = "6c1fe64c74cc40f90848281a90058a6db931eb400b60205840e09801ee30f190" 3629 4087 dependencies = [ 3630 4088 "base64 0.22.1", 3631 4089 "brotli", 3632 4090 "ico", 3633 4091 "json-patch", 3634 4092 "plist", 3635 - "png", 4093 + "png 0.17.16", 3636 4094 "proc-macro2", 3637 4095 "quote", 3638 4096 "semver", 3639 4097 "serde", 3640 4098 "serde_json", 3641 4099 "sha2", 3642 - "syn 2.0.104", 4100 + "syn 2.0.109", 3643 4101 "tauri-utils", 3644 - "thiserror 2.0.12", 4102 + "thiserror 2.0.17", 3645 4103 "time", 3646 4104 "url", 3647 4105 "uuid", ··· 3650 4108 3651 4109 [[package]] 3652 4110 name = "tauri-macros" 3653 - version = "2.3.2" 4111 + version = "2.5.0" 3654 4112 source = "registry+https://github.com/rust-lang/crates.io-index" 3655 - checksum = "7945b14dc45e23532f2ded6e120170bbdd4af5ceaa45784a6b33d250fbce3f9e" 4113 + checksum = "260c5d2eb036b76206b9fca20b7be3614cfd21046c5396f7959e0e64a4b07f2f" 3656 4114 dependencies = [ 3657 4115 "heck 0.5.0", 3658 4116 "proc-macro2", 3659 4117 "quote", 3660 - "syn 2.0.104", 4118 + "syn 2.0.109", 3661 4119 "tauri-codegen", 3662 4120 "tauri-utils", 3663 4121 ] 3664 4122 3665 4123 [[package]] 3666 4124 name = "tauri-plugin" 3667 - version = "2.3.1" 4125 + version = "2.5.1" 3668 4126 source = "registry+https://github.com/rust-lang/crates.io-index" 3669 - checksum = "5bd5c1e56990c70a906ef67a9851bbdba9136d26075ee9a2b19c8b46986b3e02" 4127 + checksum = "076c78a474a7247c90cad0b6e87e593c4c620ed4efdb79cbe0214f0021f6c39d" 3670 4128 dependencies = [ 3671 4129 "anyhow", 3672 4130 "glob", ··· 3675 4133 "serde", 3676 4134 "serde_json", 3677 4135 "tauri-utils", 3678 - "toml 0.8.23", 4136 + "toml 0.9.8", 3679 4137 "walkdir", 3680 4138 ] 3681 4139 3682 4140 [[package]] 4141 + name = "tauri-plugin-clipboard-manager" 4142 + version = "2.3.2" 4143 + source = "registry+https://github.com/rust-lang/crates.io-index" 4144 + checksum = "206dc20af4ed210748ba945c2774e60fd0acd52b9a73a028402caf809e9b6ecf" 4145 + dependencies = [ 4146 + "arboard", 4147 + "log", 4148 + "serde", 4149 + "serde_json", 4150 + "tauri", 4151 + "tauri-plugin", 4152 + "thiserror 2.0.17", 4153 + ] 4154 + 4155 + [[package]] 4156 + name = "tauri-plugin-dialog" 4157 + version = "2.4.2" 4158 + source = "registry+https://github.com/rust-lang/crates.io-index" 4159 + checksum = "313f8138692ddc4a2127c4c9607d616a46f5c042e77b3722450866da0aad2f19" 4160 + dependencies = [ 4161 + "log", 4162 + "raw-window-handle", 4163 + "rfd", 4164 + "serde", 4165 + "serde_json", 4166 + "tauri", 4167 + "tauri-plugin", 4168 + "tauri-plugin-fs", 4169 + "thiserror 2.0.17", 4170 + "url", 4171 + ] 4172 + 4173 + [[package]] 4174 + name = "tauri-plugin-fs" 4175 + version = "2.4.4" 4176 + source = "registry+https://github.com/rust-lang/crates.io-index" 4177 + checksum = "47df422695255ecbe7bac7012440eddaeefd026656171eac9559f5243d3230d9" 4178 + dependencies = [ 4179 + "anyhow", 4180 + "dunce", 4181 + "glob", 4182 + "percent-encoding", 4183 + "schemars 0.8.22", 4184 + "serde", 4185 + "serde_json", 4186 + "serde_repr", 4187 + "tauri", 4188 + "tauri-plugin", 4189 + "tauri-utils", 4190 + "thiserror 2.0.17", 4191 + "toml 0.9.8", 4192 + "url", 4193 + ] 4194 + 4195 + [[package]] 3683 4196 name = "tauri-plugin-opener" 3684 - version = "2.4.0" 4197 + version = "2.5.2" 3685 4198 source = "registry+https://github.com/rust-lang/crates.io-index" 3686 - checksum = "ecee219f11cdac713ab32959db5d0cceec4810ba4f4458da992292ecf9660321" 4199 + checksum = "c26b72571d25dee25667940027114e60f569fc3974f8cefbe50c2cbc5fd65e3b" 3687 4200 dependencies = [ 3688 4201 "dunce", 3689 4202 "glob", 3690 4203 "objc2-app-kit", 3691 - "objc2-foundation 0.3.1", 4204 + "objc2-foundation 0.3.2", 3692 4205 "open", 3693 4206 "schemars 0.8.22", 3694 4207 "serde", 3695 4208 "serde_json", 3696 4209 "tauri", 3697 4210 "tauri-plugin", 3698 - "thiserror 2.0.12", 4211 + "thiserror 2.0.17", 3699 4212 "url", 3700 4213 "windows", 3701 4214 "zbus", 3702 4215 ] 3703 4216 3704 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]] 3705 4236 name = "tauri-runtime" 3706 - version = "2.7.1" 4237 + version = "2.9.1" 3707 4238 source = "registry+https://github.com/rust-lang/crates.io-index" 3708 - checksum = "2b1cc885be806ea15ff7b0eb47098a7b16323d9228876afda329e34e2d6c4676" 4239 + checksum = "9368f09358496f2229313fccb37682ad116b7f46fa76981efe116994a0628926" 3709 4240 dependencies = [ 3710 4241 "cookie", 3711 4242 "dpi", 3712 4243 "gtk", 3713 4244 "http", 3714 4245 "jni", 3715 - "objc2 0.6.1", 4246 + "objc2 0.6.3", 3716 4247 "objc2-ui-kit", 4248 + "objc2-web-kit", 3717 4249 "raw-window-handle", 3718 4250 "serde", 3719 4251 "serde_json", 3720 4252 "tauri-utils", 3721 - "thiserror 2.0.12", 4253 + "thiserror 2.0.17", 3722 4254 "url", 4255 + "webkit2gtk", 4256 + "webview2-com", 3723 4257 "windows", 3724 4258 ] 3725 4259 3726 4260 [[package]] 3727 4261 name = "tauri-runtime-wry" 3728 - version = "2.7.2" 4262 + version = "2.9.1" 3729 4263 source = "registry+https://github.com/rust-lang/crates.io-index" 3730 - checksum = "fe653a2fbbef19fe898efc774bc52c8742576342a33d3d028c189b57eb1d2439" 4264 + checksum = "929f5df216f5c02a9e894554401bcdab6eec3e39ec6a4a7731c7067fc8688a93" 3731 4265 dependencies = [ 3732 4266 "gtk", 3733 4267 "http", 3734 4268 "jni", 3735 4269 "log", 3736 - "objc2 0.6.1", 4270 + "objc2 0.6.3", 3737 4271 "objc2-app-kit", 3738 - "objc2-foundation 0.3.1", 4272 + "objc2-foundation 0.3.2", 3739 4273 "once_cell", 3740 4274 "percent-encoding", 3741 4275 "raw-window-handle", ··· 3752 4286 3753 4287 [[package]] 3754 4288 name = "tauri-utils" 3755 - version = "2.6.0" 4289 + version = "2.8.0" 3756 4290 source = "registry+https://github.com/rust-lang/crates.io-index" 3757 - checksum = "9330c15cabfe1d9f213478c9e8ec2b0c76dab26bb6f314b8ad1c8a568c1d186e" 4291 + checksum = "f6b8bbe426abdbf52d050e52ed693130dbd68375b9ad82a3fb17efb4c8d85673" 3758 4292 dependencies = [ 3759 4293 "anyhow", 3760 4294 "brotli", ··· 3780 4314 "serde_json", 3781 4315 "serde_with", 3782 4316 "swift-rs", 3783 - "thiserror 2.0.12", 3784 - "toml 0.8.23", 4317 + "thiserror 2.0.17", 4318 + "toml 0.9.8", 3785 4319 "url", 3786 4320 "urlpattern", 3787 4321 "uuid", ··· 3790 4324 3791 4325 [[package]] 3792 4326 name = "tauri-winres" 3793 - version = "0.3.1" 4327 + version = "0.3.3" 3794 4328 source = "registry+https://github.com/rust-lang/crates.io-index" 3795 - checksum = "e8d321dbc6f998d825ab3f0d62673e810c861aac2d0de2cc2c395328f1d113b4" 4329 + checksum = "fd21509dd1fa9bd355dc29894a6ff10635880732396aa38c0066c1e6c1ab8074" 3796 4330 dependencies = [ 3797 4331 "embed-resource", 3798 - "indexmap 2.10.0", 3799 - "toml 0.8.23", 4332 + "toml 0.9.8", 3800 4333 ] 3801 4334 3802 4335 [[package]] 3803 4336 name = "tempfile" 3804 - version = "3.20.0" 4337 + version = "3.23.0" 3805 4338 source = "registry+https://github.com/rust-lang/crates.io-index" 3806 - checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" 4339 + checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" 3807 4340 dependencies = [ 3808 4341 "fastrand", 3809 - "getrandom 0.3.3", 4342 + "getrandom 0.3.4", 3810 4343 "once_cell", 3811 - "rustix", 3812 - "windows-sys 0.59.0", 4344 + "rustix 1.1.2", 4345 + "windows-sys 0.61.2", 3813 4346 ] 3814 4347 3815 4348 [[package]] ··· 3834 4367 3835 4368 [[package]] 3836 4369 name = "thiserror" 3837 - version = "2.0.12" 4370 + version = "2.0.17" 3838 4371 source = "registry+https://github.com/rust-lang/crates.io-index" 3839 - checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 4372 + checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" 3840 4373 dependencies = [ 3841 - "thiserror-impl 2.0.12", 4374 + "thiserror-impl 2.0.17", 3842 4375 ] 3843 4376 3844 4377 [[package]] ··· 3849 4382 dependencies = [ 3850 4383 "proc-macro2", 3851 4384 "quote", 3852 - "syn 2.0.104", 4385 + "syn 2.0.109", 3853 4386 ] 3854 4387 3855 4388 [[package]] 3856 4389 name = "thiserror-impl" 3857 - version = "2.0.12" 4390 + version = "2.0.17" 3858 4391 source = "registry+https://github.com/rust-lang/crates.io-index" 3859 - checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 4392 + checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" 3860 4393 dependencies = [ 3861 4394 "proc-macro2", 3862 4395 "quote", 3863 - "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", 3864 4411 ] 3865 4412 3866 4413 [[package]] 3867 4414 name = "time" 3868 - version = "0.3.41" 4415 + version = "0.3.44" 3869 4416 source = "registry+https://github.com/rust-lang/crates.io-index" 3870 - checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" 4417 + checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" 3871 4418 dependencies = [ 3872 4419 "deranged", 3873 4420 "itoa", ··· 3880 4427 3881 4428 [[package]] 3882 4429 name = "time-core" 3883 - version = "0.1.4" 4430 + version = "0.1.6" 3884 4431 source = "registry+https://github.com/rust-lang/crates.io-index" 3885 - checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" 4432 + checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" 3886 4433 3887 4434 [[package]] 3888 4435 name = "time-macros" 3889 - version = "0.2.22" 4436 + version = "0.2.24" 3890 4437 source = "registry+https://github.com/rust-lang/crates.io-index" 3891 - checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" 4438 + checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" 3892 4439 dependencies = [ 3893 4440 "num-conv", 3894 4441 "time-core", ··· 3896 4443 3897 4444 [[package]] 3898 4445 name = "tinystr" 3899 - version = "0.8.1" 4446 + version = "0.8.2" 3900 4447 source = "registry+https://github.com/rust-lang/crates.io-index" 3901 - checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 4448 + checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" 3902 4449 dependencies = [ 3903 4450 "displaydoc", 3904 4451 "zerovec", ··· 3906 4453 3907 4454 [[package]] 3908 4455 name = "tokio" 3909 - version = "1.47.0" 4456 + version = "1.48.0" 3910 4457 source = "registry+https://github.com/rust-lang/crates.io-index" 3911 - checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35" 4458 + checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" 3912 4459 dependencies = [ 3913 - "backtrace", 3914 4460 "bytes", 3915 - "io-uring", 3916 4461 "libc", 3917 4462 "mio", 3918 4463 "pin-project-lite", 3919 - "slab", 4464 + "signal-hook-registry", 3920 4465 "socket2", 3921 4466 "tokio-macros", 3922 - "windows-sys 0.59.0", 4467 + "tracing", 4468 + "windows-sys 0.61.2", 3923 4469 ] 3924 4470 3925 4471 [[package]] 3926 4472 name = "tokio-macros" 3927 - version = "2.5.0" 4473 + version = "2.6.0" 3928 4474 source = "registry+https://github.com/rust-lang/crates.io-index" 3929 - checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 4475 + checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" 3930 4476 dependencies = [ 3931 4477 "proc-macro2", 3932 4478 "quote", 3933 - "syn 2.0.104", 4479 + "syn 2.0.109", 3934 4480 ] 3935 4481 3936 4482 [[package]] 3937 4483 name = "tokio-util" 3938 - version = "0.7.15" 4484 + version = "0.7.17" 3939 4485 source = "registry+https://github.com/rust-lang/crates.io-index" 3940 - checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" 4486 + checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" 3941 4487 dependencies = [ 3942 4488 "bytes", 3943 4489 "futures-core", ··· 3948 4494 3949 4495 [[package]] 3950 4496 name = "toml" 3951 - version = "0.8.23" 4497 + version = "0.8.2" 3952 4498 source = "registry+https://github.com/rust-lang/crates.io-index" 3953 - checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" 4499 + checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" 3954 4500 dependencies = [ 3955 4501 "serde", 3956 4502 "serde_spanned 0.6.9", 3957 - "toml_datetime 0.6.11", 3958 - "toml_edit 0.22.27", 4503 + "toml_datetime 0.6.3", 4504 + "toml_edit 0.20.2", 3959 4505 ] 3960 4506 3961 4507 [[package]] 3962 4508 name = "toml" 3963 - version = "0.9.3" 4509 + version = "0.9.8" 3964 4510 source = "registry+https://github.com/rust-lang/crates.io-index" 3965 - checksum = "e06723639aaded957e5a80be250c1f82f274b9d23ebb4d94163668470623461c" 4511 + checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" 3966 4512 dependencies = [ 3967 - "indexmap 2.10.0", 3968 - "serde", 3969 - "serde_spanned 1.0.0", 3970 - "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", 3971 4517 "toml_parser", 3972 4518 "toml_writer", 3973 - "winnow 0.7.12", 4519 + "winnow 0.7.13", 3974 4520 ] 3975 4521 3976 4522 [[package]] 3977 4523 name = "toml_datetime" 3978 - version = "0.6.11" 4524 + version = "0.6.3" 3979 4525 source = "registry+https://github.com/rust-lang/crates.io-index" 3980 - checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" 4526 + checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" 3981 4527 dependencies = [ 3982 4528 "serde", 3983 4529 ] 3984 4530 3985 4531 [[package]] 3986 4532 name = "toml_datetime" 3987 - version = "0.7.0" 4533 + version = "0.7.3" 3988 4534 source = "registry+https://github.com/rust-lang/crates.io-index" 3989 - checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" 4535 + checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" 3990 4536 dependencies = [ 3991 - "serde", 4537 + "serde_core", 3992 4538 ] 3993 4539 3994 4540 [[package]] ··· 3997 4543 source = "registry+https://github.com/rust-lang/crates.io-index" 3998 4544 checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" 3999 4545 dependencies = [ 4000 - "indexmap 2.10.0", 4001 - "toml_datetime 0.6.11", 4546 + "indexmap 2.12.0", 4547 + "toml_datetime 0.6.3", 4002 4548 "winnow 0.5.40", 4003 4549 ] 4004 4550 4005 4551 [[package]] 4006 4552 name = "toml_edit" 4007 - version = "0.20.7" 4553 + version = "0.20.2" 4008 4554 source = "registry+https://github.com/rust-lang/crates.io-index" 4009 - checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" 4555 + checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" 4010 4556 dependencies = [ 4011 - "indexmap 2.10.0", 4012 - "toml_datetime 0.6.11", 4557 + "indexmap 2.12.0", 4558 + "serde", 4559 + "serde_spanned 0.6.9", 4560 + "toml_datetime 0.6.3", 4013 4561 "winnow 0.5.40", 4014 4562 ] 4015 4563 4016 4564 [[package]] 4017 4565 name = "toml_edit" 4018 - version = "0.22.27" 4566 + version = "0.23.7" 4019 4567 source = "registry+https://github.com/rust-lang/crates.io-index" 4020 - checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" 4568 + checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" 4021 4569 dependencies = [ 4022 - "indexmap 2.10.0", 4023 - "serde", 4024 - "serde_spanned 0.6.9", 4025 - "toml_datetime 0.6.11", 4026 - "toml_write", 4027 - "winnow 0.7.12", 4570 + "indexmap 2.12.0", 4571 + "toml_datetime 0.7.3", 4572 + "toml_parser", 4573 + "winnow 0.7.13", 4028 4574 ] 4029 4575 4030 4576 [[package]] 4031 4577 name = "toml_parser" 4032 - version = "1.0.1" 4578 + version = "1.0.4" 4033 4579 source = "registry+https://github.com/rust-lang/crates.io-index" 4034 - checksum = "97200572db069e74c512a14117b296ba0a80a30123fbbb5aa1f4a348f639ca30" 4580 + checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" 4035 4581 dependencies = [ 4036 - "winnow 0.7.12", 4582 + "winnow 0.7.13", 4037 4583 ] 4038 - 4039 - [[package]] 4040 - name = "toml_write" 4041 - version = "0.1.2" 4042 - source = "registry+https://github.com/rust-lang/crates.io-index" 4043 - checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" 4044 4584 4045 4585 [[package]] 4046 4586 name = "toml_writer" 4047 - version = "1.0.2" 4587 + version = "1.0.4" 4048 4588 source = "registry+https://github.com/rust-lang/crates.io-index" 4049 - checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" 4589 + checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" 4050 4590 4051 4591 [[package]] 4052 4592 name = "tower" ··· 4069 4609 source = "registry+https://github.com/rust-lang/crates.io-index" 4070 4610 checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" 4071 4611 dependencies = [ 4072 - "bitflags 2.9.1", 4612 + "bitflags 2.10.0", 4073 4613 "bytes", 4074 4614 "futures-util", 4075 4615 "http", ··· 4112 4652 dependencies = [ 4113 4653 "proc-macro2", 4114 4654 "quote", 4115 - "syn 2.0.104", 4655 + "syn 2.0.109", 4116 4656 ] 4117 4657 4118 4658 [[package]] ··· 4126 4666 4127 4667 [[package]] 4128 4668 name = "tray-icon" 4129 - version = "0.21.0" 4669 + version = "0.21.2" 4130 4670 source = "registry+https://github.com/rust-lang/crates.io-index" 4131 - checksum = "2da75ec677957aa21f6e0b361df0daab972f13a5bee3606de0638fd4ee1c666a" 4671 + checksum = "e3d5572781bee8e3f994d7467084e1b1fd7a93ce66bd480f8156ba89dee55a2b" 4132 4672 dependencies = [ 4133 4673 "crossbeam-channel", 4134 4674 "dirs", 4135 4675 "libappindicator", 4136 4676 "muda", 4137 - "objc2 0.6.1", 4677 + "objc2 0.6.3", 4138 4678 "objc2-app-kit", 4139 4679 "objc2-core-foundation", 4140 4680 "objc2-core-graphics", 4141 - "objc2-foundation 0.3.1", 4681 + "objc2-foundation 0.3.2", 4142 4682 "once_cell", 4143 - "png", 4683 + "png 0.17.16", 4144 4684 "serde", 4145 - "thiserror 2.0.12", 4146 - "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", 4147 4698 ] 4148 4699 4149 4700 [[package]] ··· 4160 4711 4161 4712 [[package]] 4162 4713 name = "typenum" 4163 - version = "1.18.0" 4714 + version = "1.19.0" 4164 4715 source = "registry+https://github.com/rust-lang/crates.io-index" 4165 - checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 4716 + checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" 4166 4717 4167 4718 [[package]] 4168 4719 name = "uds_windows" ··· 4218 4769 4219 4770 [[package]] 4220 4771 name = "unicode-ident" 4221 - version = "1.0.18" 4772 + version = "1.0.22" 4222 4773 source = "registry+https://github.com/rust-lang/crates.io-index" 4223 - checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 4774 + checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" 4224 4775 4225 4776 [[package]] 4226 4777 name = "unicode-segmentation" ··· 4230 4781 4231 4782 [[package]] 4232 4783 name = "url" 4233 - version = "2.5.4" 4784 + version = "2.5.7" 4234 4785 source = "registry+https://github.com/rust-lang/crates.io-index" 4235 - checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 4786 + checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" 4236 4787 dependencies = [ 4237 4788 "form_urlencoded", 4238 4789 "idna", ··· 4266 4817 4267 4818 [[package]] 4268 4819 name = "uuid" 4269 - version = "1.17.0" 4820 + version = "1.18.1" 4270 4821 source = "registry+https://github.com/rust-lang/crates.io-index" 4271 - checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" 4822 + checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" 4272 4823 dependencies = [ 4273 - "getrandom 0.3.3", 4824 + "getrandom 0.3.4", 4274 4825 "js-sys", 4275 4826 "serde", 4276 4827 "wasm-bindgen", ··· 4278 4829 4279 4830 [[package]] 4280 4831 name = "version-compare" 4281 - version = "0.2.0" 4832 + version = "0.2.1" 4282 4833 source = "registry+https://github.com/rust-lang/crates.io-index" 4283 - checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" 4834 + checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" 4284 4835 4285 4836 [[package]] 4286 4837 name = "version_check" ··· 4340 4891 checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 4341 4892 4342 4893 [[package]] 4343 - name = "wasi" 4344 - version = "0.14.2+wasi-0.2.4" 4894 + name = "wasip2" 4895 + version = "1.0.1+wasi-0.2.4" 4345 4896 source = "registry+https://github.com/rust-lang/crates.io-index" 4346 - checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 4897 + checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" 4347 4898 dependencies = [ 4348 - "wit-bindgen-rt", 4899 + "wit-bindgen", 4349 4900 ] 4350 4901 4351 4902 [[package]] 4352 4903 name = "wasm-bindgen" 4353 - version = "0.2.100" 4904 + version = "0.2.105" 4354 4905 source = "registry+https://github.com/rust-lang/crates.io-index" 4355 - checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 4906 + checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" 4356 4907 dependencies = [ 4357 4908 "cfg-if", 4358 4909 "once_cell", 4359 4910 "rustversion", 4360 4911 "wasm-bindgen-macro", 4361 - ] 4362 - 4363 - [[package]] 4364 - name = "wasm-bindgen-backend" 4365 - version = "0.2.100" 4366 - source = "registry+https://github.com/rust-lang/crates.io-index" 4367 - checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 4368 - dependencies = [ 4369 - "bumpalo", 4370 - "log", 4371 - "proc-macro2", 4372 - "quote", 4373 - "syn 2.0.104", 4374 4912 "wasm-bindgen-shared", 4375 4913 ] 4376 4914 4377 4915 [[package]] 4378 4916 name = "wasm-bindgen-futures" 4379 - version = "0.4.50" 4917 + version = "0.4.55" 4380 4918 source = "registry+https://github.com/rust-lang/crates.io-index" 4381 - checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 4919 + checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" 4382 4920 dependencies = [ 4383 4921 "cfg-if", 4384 4922 "js-sys", ··· 4389 4927 4390 4928 [[package]] 4391 4929 name = "wasm-bindgen-macro" 4392 - version = "0.2.100" 4930 + version = "0.2.105" 4393 4931 source = "registry+https://github.com/rust-lang/crates.io-index" 4394 - checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 4932 + checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" 4395 4933 dependencies = [ 4396 4934 "quote", 4397 4935 "wasm-bindgen-macro-support", ··· 4399 4937 4400 4938 [[package]] 4401 4939 name = "wasm-bindgen-macro-support" 4402 - version = "0.2.100" 4940 + version = "0.2.105" 4403 4941 source = "registry+https://github.com/rust-lang/crates.io-index" 4404 - checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 4942 + checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" 4405 4943 dependencies = [ 4944 + "bumpalo", 4406 4945 "proc-macro2", 4407 4946 "quote", 4408 - "syn 2.0.104", 4409 - "wasm-bindgen-backend", 4947 + "syn 2.0.109", 4410 4948 "wasm-bindgen-shared", 4411 4949 ] 4412 4950 4413 4951 [[package]] 4414 4952 name = "wasm-bindgen-shared" 4415 - version = "0.2.100" 4953 + version = "0.2.105" 4416 4954 source = "registry+https://github.com/rust-lang/crates.io-index" 4417 - checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 4955 + checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" 4418 4956 dependencies = [ 4419 4957 "unicode-ident", 4420 4958 ] ··· 4433 4971 ] 4434 4972 4435 4973 [[package]] 4974 + name = "wayland-backend" 4975 + version = "0.3.11" 4976 + source = "registry+https://github.com/rust-lang/crates.io-index" 4977 + checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" 4978 + dependencies = [ 4979 + "cc", 4980 + "downcast-rs", 4981 + "rustix 1.1.2", 4982 + "scoped-tls", 4983 + "smallvec", 4984 + "wayland-sys", 4985 + ] 4986 + 4987 + [[package]] 4988 + name = "wayland-client" 4989 + version = "0.31.11" 4990 + source = "registry+https://github.com/rust-lang/crates.io-index" 4991 + checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" 4992 + dependencies = [ 4993 + "bitflags 2.10.0", 4994 + "rustix 1.1.2", 4995 + "wayland-backend", 4996 + "wayland-scanner", 4997 + ] 4998 + 4999 + [[package]] 5000 + name = "wayland-protocols" 5001 + version = "0.32.9" 5002 + source = "registry+https://github.com/rust-lang/crates.io-index" 5003 + checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" 5004 + dependencies = [ 5005 + "bitflags 2.10.0", 5006 + "wayland-backend", 5007 + "wayland-client", 5008 + "wayland-scanner", 5009 + ] 5010 + 5011 + [[package]] 5012 + name = "wayland-protocols-wlr" 5013 + version = "0.3.9" 5014 + source = "registry+https://github.com/rust-lang/crates.io-index" 5015 + checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec" 5016 + dependencies = [ 5017 + "bitflags 2.10.0", 5018 + "wayland-backend", 5019 + "wayland-client", 5020 + "wayland-protocols", 5021 + "wayland-scanner", 5022 + ] 5023 + 5024 + [[package]] 5025 + name = "wayland-scanner" 5026 + version = "0.31.7" 5027 + source = "registry+https://github.com/rust-lang/crates.io-index" 5028 + checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" 5029 + dependencies = [ 5030 + "proc-macro2", 5031 + "quick-xml 0.37.5", 5032 + "quote", 5033 + ] 5034 + 5035 + [[package]] 5036 + name = "wayland-sys" 5037 + version = "0.31.7" 5038 + source = "registry+https://github.com/rust-lang/crates.io-index" 5039 + checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" 5040 + dependencies = [ 5041 + "dlib", 5042 + "log", 5043 + "pkg-config", 5044 + ] 5045 + 5046 + [[package]] 4436 5047 name = "web-sys" 4437 - version = "0.3.77" 5048 + version = "0.3.82" 4438 5049 source = "registry+https://github.com/rust-lang/crates.io-index" 4439 - checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 5050 + checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" 4440 5051 dependencies = [ 4441 5052 "js-sys", 4442 5053 "wasm-bindgen", ··· 4495 5106 "webview2-com-macros", 4496 5107 "webview2-com-sys", 4497 5108 "windows", 4498 - "windows-core", 5109 + "windows-core 0.61.2", 4499 5110 "windows-implement", 4500 5111 "windows-interface", 4501 5112 ] ··· 4508 5119 dependencies = [ 4509 5120 "proc-macro2", 4510 5121 "quote", 4511 - "syn 2.0.104", 5122 + "syn 2.0.109", 4512 5123 ] 4513 5124 4514 5125 [[package]] ··· 4517 5128 source = "registry+https://github.com/rust-lang/crates.io-index" 4518 5129 checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" 4519 5130 dependencies = [ 4520 - "thiserror 2.0.12", 5131 + "thiserror 2.0.17", 4521 5132 "windows", 4522 - "windows-core", 5133 + "windows-core 0.61.2", 4523 5134 ] 5135 + 5136 + [[package]] 5137 + name = "weezl" 5138 + version = "0.1.12" 5139 + source = "registry+https://github.com/rust-lang/crates.io-index" 5140 + checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" 4524 5141 4525 5142 [[package]] 4526 5143 name = "winapi" ··· 4540 5157 4541 5158 [[package]] 4542 5159 name = "winapi-util" 4543 - version = "0.1.9" 5160 + version = "0.1.11" 4544 5161 source = "registry+https://github.com/rust-lang/crates.io-index" 4545 - checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 5162 + checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" 4546 5163 dependencies = [ 4547 - "windows-sys 0.59.0", 5164 + "windows-sys 0.61.2", 4548 5165 ] 4549 5166 4550 5167 [[package]] ··· 4559 5176 source = "registry+https://github.com/rust-lang/crates.io-index" 4560 5177 checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" 4561 5178 dependencies = [ 4562 - "objc2 0.6.1", 5179 + "objc2 0.6.3", 4563 5180 "objc2-app-kit", 4564 5181 "objc2-core-foundation", 4565 - "objc2-foundation 0.3.1", 5182 + "objc2-foundation 0.3.2", 4566 5183 "raw-window-handle", 4567 5184 "windows-sys 0.59.0", 4568 5185 "windows-version", ··· 4575 5192 checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" 4576 5193 dependencies = [ 4577 5194 "windows-collections", 4578 - "windows-core", 5195 + "windows-core 0.61.2", 4579 5196 "windows-future", 4580 - "windows-link", 5197 + "windows-link 0.1.3", 4581 5198 "windows-numerics", 4582 5199 ] 4583 5200 ··· 4587 5204 source = "registry+https://github.com/rust-lang/crates.io-index" 4588 5205 checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" 4589 5206 dependencies = [ 4590 - "windows-core", 5207 + "windows-core 0.61.2", 4591 5208 ] 4592 5209 4593 5210 [[package]] ··· 4598 5215 dependencies = [ 4599 5216 "windows-implement", 4600 5217 "windows-interface", 4601 - "windows-link", 4602 - "windows-result", 4603 - "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", 4604 5234 ] 4605 5235 4606 5236 [[package]] ··· 4609 5239 source = "registry+https://github.com/rust-lang/crates.io-index" 4610 5240 checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" 4611 5241 dependencies = [ 4612 - "windows-core", 4613 - "windows-link", 5242 + "windows-core 0.61.2", 5243 + "windows-link 0.1.3", 4614 5244 "windows-threading", 4615 5245 ] 4616 5246 4617 5247 [[package]] 4618 5248 name = "windows-implement" 4619 - version = "0.60.0" 5249 + version = "0.60.2" 4620 5250 source = "registry+https://github.com/rust-lang/crates.io-index" 4621 - checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" 5251 + checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" 4622 5252 dependencies = [ 4623 5253 "proc-macro2", 4624 5254 "quote", 4625 - "syn 2.0.104", 5255 + "syn 2.0.109", 4626 5256 ] 4627 5257 4628 5258 [[package]] 4629 5259 name = "windows-interface" 4630 - version = "0.59.1" 5260 + version = "0.59.3" 4631 5261 source = "registry+https://github.com/rust-lang/crates.io-index" 4632 - checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" 5262 + checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" 4633 5263 dependencies = [ 4634 5264 "proc-macro2", 4635 5265 "quote", 4636 - "syn 2.0.104", 5266 + "syn 2.0.109", 4637 5267 ] 4638 5268 4639 5269 [[package]] ··· 4643 5273 checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 4644 5274 4645 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]] 4646 5282 name = "windows-numerics" 4647 5283 version = "0.2.0" 4648 5284 source = "registry+https://github.com/rust-lang/crates.io-index" 4649 5285 checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" 4650 5286 dependencies = [ 4651 - "windows-core", 4652 - "windows-link", 5287 + "windows-core 0.61.2", 5288 + "windows-link 0.1.3", 4653 5289 ] 4654 5290 4655 5291 [[package]] ··· 4658 5294 source = "registry+https://github.com/rust-lang/crates.io-index" 4659 5295 checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" 4660 5296 dependencies = [ 4661 - "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", 4662 5307 ] 4663 5308 4664 5309 [[package]] ··· 4667 5312 source = "registry+https://github.com/rust-lang/crates.io-index" 4668 5313 checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" 4669 5314 dependencies = [ 4670 - "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", 4671 5325 ] 4672 5326 4673 5327 [[package]] ··· 4694 5348 source = "registry+https://github.com/rust-lang/crates.io-index" 4695 5349 checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 4696 5350 dependencies = [ 4697 - "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", 4698 5361 ] 4699 5362 4700 5363 [[package]] ··· 4730 5393 4731 5394 [[package]] 4732 5395 name = "windows-targets" 4733 - version = "0.53.3" 5396 + version = "0.53.5" 4734 5397 source = "registry+https://github.com/rust-lang/crates.io-index" 4735 - checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" 5398 + checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" 4736 5399 dependencies = [ 4737 - "windows-link", 4738 - "windows_aarch64_gnullvm 0.53.0", 4739 - "windows_aarch64_msvc 0.53.0", 4740 - "windows_i686_gnu 0.53.0", 4741 - "windows_i686_gnullvm 0.53.0", 4742 - "windows_i686_msvc 0.53.0", 4743 - "windows_x86_64_gnu 0.53.0", 4744 - "windows_x86_64_gnullvm 0.53.0", 4745 - "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", 4746 5409 ] 4747 5410 4748 5411 [[package]] ··· 4751 5414 source = "registry+https://github.com/rust-lang/crates.io-index" 4752 5415 checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" 4753 5416 dependencies = [ 4754 - "windows-link", 5417 + "windows-link 0.1.3", 4755 5418 ] 4756 5419 4757 5420 [[package]] 4758 5421 name = "windows-version" 4759 - version = "0.1.4" 5422 + version = "0.1.7" 4760 5423 source = "registry+https://github.com/rust-lang/crates.io-index" 4761 - checksum = "e04a5c6627e310a23ad2358483286c7df260c964eb2d003d8efd6d0f4e79265c" 5424 + checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" 4762 5425 dependencies = [ 4763 - "windows-link", 5426 + "windows-link 0.2.1", 4764 5427 ] 4765 5428 4766 5429 [[package]] ··· 4777 5440 4778 5441 [[package]] 4779 5442 name = "windows_aarch64_gnullvm" 4780 - version = "0.53.0" 5443 + version = "0.53.1" 4781 5444 source = "registry+https://github.com/rust-lang/crates.io-index" 4782 - checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 5445 + checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" 4783 5446 4784 5447 [[package]] 4785 5448 name = "windows_aarch64_msvc" ··· 4795 5458 4796 5459 [[package]] 4797 5460 name = "windows_aarch64_msvc" 4798 - version = "0.53.0" 5461 + version = "0.53.1" 4799 5462 source = "registry+https://github.com/rust-lang/crates.io-index" 4800 - checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 5463 + checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" 4801 5464 4802 5465 [[package]] 4803 5466 name = "windows_i686_gnu" ··· 4813 5476 4814 5477 [[package]] 4815 5478 name = "windows_i686_gnu" 4816 - version = "0.53.0" 5479 + version = "0.53.1" 4817 5480 source = "registry+https://github.com/rust-lang/crates.io-index" 4818 - checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 5481 + checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" 4819 5482 4820 5483 [[package]] 4821 5484 name = "windows_i686_gnullvm" ··· 4825 5488 4826 5489 [[package]] 4827 5490 name = "windows_i686_gnullvm" 4828 - version = "0.53.0" 5491 + version = "0.53.1" 4829 5492 source = "registry+https://github.com/rust-lang/crates.io-index" 4830 - checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 5493 + checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" 4831 5494 4832 5495 [[package]] 4833 5496 name = "windows_i686_msvc" ··· 4843 5506 4844 5507 [[package]] 4845 5508 name = "windows_i686_msvc" 4846 - version = "0.53.0" 5509 + version = "0.53.1" 4847 5510 source = "registry+https://github.com/rust-lang/crates.io-index" 4848 - checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 5511 + checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" 4849 5512 4850 5513 [[package]] 4851 5514 name = "windows_x86_64_gnu" ··· 4861 5524 4862 5525 [[package]] 4863 5526 name = "windows_x86_64_gnu" 4864 - version = "0.53.0" 5527 + version = "0.53.1" 4865 5528 source = "registry+https://github.com/rust-lang/crates.io-index" 4866 - checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 5529 + checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" 4867 5530 4868 5531 [[package]] 4869 5532 name = "windows_x86_64_gnullvm" ··· 4879 5542 4880 5543 [[package]] 4881 5544 name = "windows_x86_64_gnullvm" 4882 - version = "0.53.0" 5545 + version = "0.53.1" 4883 5546 source = "registry+https://github.com/rust-lang/crates.io-index" 4884 - checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 5547 + checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" 4885 5548 4886 5549 [[package]] 4887 5550 name = "windows_x86_64_msvc" ··· 4897 5560 4898 5561 [[package]] 4899 5562 name = "windows_x86_64_msvc" 4900 - version = "0.53.0" 5563 + version = "0.53.1" 4901 5564 source = "registry+https://github.com/rust-lang/crates.io-index" 4902 - checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 5565 + checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" 4903 5566 4904 5567 [[package]] 4905 5568 name = "winnow" ··· 4912 5575 4913 5576 [[package]] 4914 5577 name = "winnow" 4915 - version = "0.7.12" 5578 + version = "0.7.13" 4916 5579 source = "registry+https://github.com/rust-lang/crates.io-index" 4917 - checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" 5580 + checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" 4918 5581 dependencies = [ 4919 5582 "memchr", 4920 5583 ] ··· 4930 5593 ] 4931 5594 4932 5595 [[package]] 4933 - name = "wit-bindgen-rt" 4934 - version = "0.39.0" 5596 + name = "wit-bindgen" 5597 + version = "0.46.0" 5598 + source = "registry+https://github.com/rust-lang/crates.io-index" 5599 + checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" 5600 + 5601 + [[package]] 5602 + name = "wl-clipboard-rs" 5603 + version = "0.9.2" 4935 5604 source = "registry+https://github.com/rust-lang/crates.io-index" 4936 - checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 5605 + checksum = "8e5ff8d0e60065f549fafd9d6cb626203ea64a798186c80d8e7df4f8af56baeb" 4937 5606 dependencies = [ 4938 - "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", 4939 5618 ] 4940 5619 4941 5620 [[package]] 4942 5621 name = "writeable" 4943 - version = "0.6.1" 5622 + version = "0.6.2" 4944 5623 source = "registry+https://github.com/rust-lang/crates.io-index" 4945 - checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 5624 + checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" 4946 5625 4947 5626 [[package]] 4948 5627 name = "wry" 4949 - version = "0.52.1" 5628 + version = "0.53.5" 4950 5629 source = "registry+https://github.com/rust-lang/crates.io-index" 4951 - checksum = "12a714d9ba7075aae04a6e50229d6109e3d584774b99a6a8c60de1698ca111b9" 5630 + checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2" 4952 5631 dependencies = [ 4953 5632 "base64 0.22.1", 4954 - "block2 0.6.1", 5633 + "block2 0.6.2", 4955 5634 "cookie", 4956 5635 "crossbeam-channel", 5636 + "dirs", 4957 5637 "dpi", 4958 5638 "dunce", 4959 5639 "gdkx11", ··· 4965 5645 "kuchikiki", 4966 5646 "libc", 4967 5647 "ndk", 4968 - "objc2 0.6.1", 5648 + "objc2 0.6.3", 4969 5649 "objc2-app-kit", 4970 5650 "objc2-core-foundation", 4971 - "objc2-foundation 0.3.1", 5651 + "objc2-foundation 0.3.2", 4972 5652 "objc2-ui-kit", 4973 5653 "objc2-web-kit", 4974 5654 "once_cell", ··· 4977 5657 "sha2", 4978 5658 "soup3", 4979 5659 "tao-macros", 4980 - "thiserror 2.0.12", 5660 + "thiserror 2.0.17", 4981 5661 "url", 4982 5662 "webkit2gtk", 4983 5663 "webkit2gtk-sys", 4984 5664 "webview2-com", 4985 5665 "windows", 4986 - "windows-core", 5666 + "windows-core 0.61.2", 4987 5667 "windows-version", 4988 5668 "x11-dl", 4989 5669 ] ··· 5010 5690 ] 5011 5691 5012 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]] 5013 5727 name = "yoke" 5014 - version = "0.8.0" 5728 + version = "0.8.1" 5015 5729 source = "registry+https://github.com/rust-lang/crates.io-index" 5016 - checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 5730 + checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" 5017 5731 dependencies = [ 5018 - "serde", 5019 5732 "stable_deref_trait", 5020 5733 "yoke-derive", 5021 5734 "zerofrom", ··· 5023 5736 5024 5737 [[package]] 5025 5738 name = "yoke-derive" 5026 - version = "0.8.0" 5739 + version = "0.8.1" 5027 5740 source = "registry+https://github.com/rust-lang/crates.io-index" 5028 - checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 5741 + checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" 5029 5742 dependencies = [ 5030 5743 "proc-macro2", 5031 5744 "quote", 5032 - "syn 2.0.104", 5745 + "syn 2.0.109", 5033 5746 "synstructure", 5034 5747 ] 5035 5748 5036 5749 [[package]] 5037 5750 name = "zbus" 5038 - version = "5.9.0" 5751 + version = "5.12.0" 5039 5752 source = "registry+https://github.com/rust-lang/crates.io-index" 5040 - checksum = "4bb4f9a464286d42851d18a605f7193b8febaf5b0919d71c6399b7b26e5b0aad" 5753 + checksum = "b622b18155f7a93d1cd2dc8c01d2d6a44e08fb9ebb7b3f9e6ed101488bad6c91" 5041 5754 dependencies = [ 5042 5755 "async-broadcast", 5043 5756 "async-executor", ··· 5057 5770 "ordered-stream", 5058 5771 "serde", 5059 5772 "serde_repr", 5773 + "tokio", 5060 5774 "tracing", 5061 5775 "uds_windows", 5062 - "windows-sys 0.59.0", 5063 - "winnow 0.7.12", 5776 + "uuid", 5777 + "windows-sys 0.61.2", 5778 + "winnow 0.7.13", 5064 5779 "zbus_macros", 5065 5780 "zbus_names", 5066 5781 "zvariant", ··· 5068 5783 5069 5784 [[package]] 5070 5785 name = "zbus_macros" 5071 - version = "5.9.0" 5786 + version = "5.12.0" 5072 5787 source = "registry+https://github.com/rust-lang/crates.io-index" 5073 - checksum = "ef9859f68ee0c4ee2e8cde84737c78e3f4c54f946f2a38645d0d4c7a95327659" 5788 + checksum = "1cdb94821ca8a87ca9c298b5d1cbd80e2a8b67115d99f6e4551ac49e42b6a314" 5074 5789 dependencies = [ 5075 - "proc-macro-crate 3.3.0", 5790 + "proc-macro-crate 3.4.0", 5076 5791 "proc-macro2", 5077 5792 "quote", 5078 - "syn 2.0.104", 5793 + "syn 2.0.109", 5079 5794 "zbus_names", 5080 5795 "zvariant", 5081 5796 "zvariant_utils", ··· 5089 5804 dependencies = [ 5090 5805 "serde", 5091 5806 "static_assertions", 5092 - "winnow 0.7.12", 5807 + "winnow 0.7.13", 5093 5808 "zvariant", 5094 5809 ] 5095 5810 5096 5811 [[package]] 5097 5812 name = "zerocopy" 5098 - version = "0.8.26" 5813 + version = "0.8.27" 5099 5814 source = "registry+https://github.com/rust-lang/crates.io-index" 5100 - checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" 5815 + checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" 5101 5816 dependencies = [ 5102 5817 "zerocopy-derive", 5103 5818 ] 5104 5819 5105 5820 [[package]] 5106 5821 name = "zerocopy-derive" 5107 - version = "0.8.26" 5822 + version = "0.8.27" 5108 5823 source = "registry+https://github.com/rust-lang/crates.io-index" 5109 - checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" 5824 + checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" 5110 5825 dependencies = [ 5111 5826 "proc-macro2", 5112 5827 "quote", 5113 - "syn 2.0.104", 5828 + "syn 2.0.109", 5114 5829 ] 5115 5830 5116 5831 [[package]] ··· 5130 5845 dependencies = [ 5131 5846 "proc-macro2", 5132 5847 "quote", 5133 - "syn 2.0.104", 5848 + "syn 2.0.109", 5134 5849 "synstructure", 5135 5850 ] 5136 5851 5137 5852 [[package]] 5138 5853 name = "zerotrie" 5139 - version = "0.2.2" 5854 + version = "0.2.3" 5140 5855 source = "registry+https://github.com/rust-lang/crates.io-index" 5141 - checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 5856 + checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" 5142 5857 dependencies = [ 5143 5858 "displaydoc", 5144 5859 "yoke", ··· 5147 5862 5148 5863 [[package]] 5149 5864 name = "zerovec" 5150 - version = "0.11.2" 5865 + version = "0.11.5" 5151 5866 source = "registry+https://github.com/rust-lang/crates.io-index" 5152 - checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" 5867 + checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" 5153 5868 dependencies = [ 5154 5869 "yoke", 5155 5870 "zerofrom", ··· 5158 5873 5159 5874 [[package]] 5160 5875 name = "zerovec-derive" 5161 - version = "0.11.1" 5876 + version = "0.11.2" 5162 5877 source = "registry+https://github.com/rust-lang/crates.io-index" 5163 - checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 5878 + checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" 5164 5879 dependencies = [ 5165 5880 "proc-macro2", 5166 5881 "quote", 5167 - "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", 5168 5898 ] 5169 5899 5170 5900 [[package]] 5171 5901 name = "zvariant" 5172 - version = "5.6.0" 5902 + version = "5.8.0" 5173 5903 source = "registry+https://github.com/rust-lang/crates.io-index" 5174 - checksum = "d91b3680bb339216abd84714172b5138a4edac677e641ef17e1d8cb1b3ca6e6f" 5904 + checksum = "2be61892e4f2b1772727be11630a62664a1826b62efa43a6fe7449521cb8744c" 5175 5905 dependencies = [ 5176 5906 "endi", 5177 5907 "enumflags2", 5178 5908 "serde", 5179 - "winnow 0.7.12", 5909 + "url", 5910 + "winnow 0.7.13", 5180 5911 "zvariant_derive", 5181 5912 "zvariant_utils", 5182 5913 ] 5183 5914 5184 5915 [[package]] 5185 5916 name = "zvariant_derive" 5186 - version = "5.6.0" 5917 + version = "5.8.0" 5187 5918 source = "registry+https://github.com/rust-lang/crates.io-index" 5188 - checksum = "3a8c68501be459a8dbfffbe5d792acdd23b4959940fc87785fb013b32edbc208" 5919 + checksum = "da58575a1b2b20766513b1ec59d8e2e68db2745379f961f86650655e862d2006" 5189 5920 dependencies = [ 5190 - "proc-macro-crate 3.3.0", 5921 + "proc-macro-crate 3.4.0", 5191 5922 "proc-macro2", 5192 5923 "quote", 5193 - "syn 2.0.104", 5924 + "syn 2.0.109", 5194 5925 "zvariant_utils", 5195 5926 ] 5196 5927 5197 5928 [[package]] 5198 5929 name = "zvariant_utils" 5199 - version = "3.2.0" 5930 + version = "3.2.1" 5200 5931 source = "registry+https://github.com/rust-lang/crates.io-index" 5201 - checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" 5932 + checksum = "c6949d142f89f6916deca2232cf26a8afacf2b9fdc35ce766105e104478be599" 5202 5933 dependencies = [ 5203 5934 "proc-macro2", 5204 5935 "quote", 5205 5936 "serde", 5206 - "static_assertions", 5207 - "syn 2.0.104", 5208 - "winnow 0.7.12", 5937 + "syn 2.0.109", 5938 + "winnow 0.7.13", 5209 5939 ]
+13 -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 + 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" 29 37
+1 -1
src-tauri/build.rs
··· 1 1 fn main() { 2 - tauri_build::build() 2 + tauri_build::build() 3 3 }
+10 -3
src-tauri/capabilities/default.json
··· 2 2 "$schema": "../gen/schemas/desktop-schema.json", 3 3 "identifier": "default", 4 4 "description": "Capability for the main window", 5 - "windows": ["main"], 5 + "windows": [ 6 + "main" 7 + ], 6 8 "permissions": [ 7 9 "core:default", 8 - "opener:default" 10 + "core:window:allow-destroy", 11 + "opener:default", 12 + "dialog:default", 13 + "clipboard-manager:allow-read-text", 14 + "clipboard-manager:allow-write-text", 15 + "os:default" 9 16 ] 10 - } 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 + }
+2 -2
src-tauri/src/frontend_calls/get_addresses.rs
··· 5 5 use crate::osc::OSCMessage; 6 6 7 7 #[tauri::command] 8 - pub fn get_addresses( addresses: State<&Mutex<Vec<OSCMessage>>> ) -> Vec<OSCMessage> { 8 + pub fn get_addresses(addresses: State<&Mutex<Vec<OSCMessage>>>) -> Vec<OSCMessage> { 9 9 let addresses = addresses.lock().unwrap(); 10 10 addresses.clone() 11 - } 11 + }
+20
src-tauri/src/frontend_calls/load_previous_tabs.rs
··· 1 + use std::collections::HashMap; 2 + 3 + use tauri::{State, Window}; 4 + 5 + use crate::{structs::nodes::Node, utils::config::Config}; 6 + 7 + #[tauri::command] 8 + pub fn load_previous_tabs( 9 + window: Window, 10 + conf: State<Config>, 11 + ) -> HashMap<String, (Vec<Node>, String, Option<String>, bool)> { 12 + let config = conf.store.lock().unwrap(); 13 + 14 + if !config.hide_editor_on_start { 15 + window.show().unwrap(); 16 + } 17 + 18 + let tabs = config.loaded_tabs.clone(); 19 + tabs 20 + }
+5 -1
src-tauri/src/frontend_calls/mod.rs
··· 1 + pub mod close_app; 1 2 pub mod get_addresses; 2 - pub mod save_graph; 3 + pub mod load_previous_tabs; 4 + pub mod save_graph; 5 + pub mod settings; 6 + pub mod sync_tab;
+9 -8
src-tauri/src/frontend_calls/save_graph.rs
··· 1 - use std::{ fs::File, io::Write }; 1 + use std::{fs::File, io::Write, path::PathBuf}; 2 + 3 + use flate2::{write::GzEncoder, Compression}; 4 + use tauri::State; 2 5 3 - use flate2::{ write::GzEncoder, Compression }; 6 + use crate::utils::config::Config; 4 7 5 8 #[tauri::command] 6 - pub fn save_graph( tab_name: String, graph: String ) { 7 - dbg!(&graph); 8 - 9 - let path = dirs::config_dir().unwrap().join("VRCMacros").join(format!("{}.macro", tab_name)); 10 - 9 + pub fn save_graph(graph: String, path: PathBuf, conf: State<Config>) { 11 10 let file = File::create(&path).unwrap(); 12 11 let mut encoder = GzEncoder::new(file, Compression::default()); 13 12 14 13 encoder.write_all(graph.as_bytes()).unwrap(); 15 14 encoder.finish().unwrap(); 16 - } 15 + 16 + conf.save(); 17 + }
+15
src-tauri/src/frontend_calls/settings.rs
··· 1 + use tauri::State; 2 + 3 + use crate::utils::config::Config; 4 + 5 + #[tauri::command] 6 + pub fn set_hide_editor_on_app_start(value: bool, conf: State<Config>) { 7 + let mut config = conf.store.lock().unwrap(); 8 + config.hide_editor_on_start = value; 9 + } 10 + 11 + #[tauri::command] 12 + pub fn get_hide_editor_on_app_start(conf: State<Config>) -> bool { 13 + let config = conf.store.lock().unwrap(); 14 + config.hide_editor_on_start 15 + }
+34
src-tauri/src/frontend_calls/sync_tab.rs
··· 1 + use chrono::Utc; 2 + use crossbeam_channel::Sender; 3 + 4 + use tauri::State; 5 + 6 + use crate::{runtime::commands::RuntimeCommand, structs::nodes::Node, utils::config::Config}; 7 + 8 + #[tauri::command] 9 + pub fn sync_tab( 10 + graph: Vec<Node>, 11 + id: String, 12 + name: String, 13 + save_state: bool, 14 + location: Option<String>, 15 + cmd: State<Sender<RuntimeCommand>>, 16 + conf: State<Config>, 17 + ) { 18 + cmd 19 + .send(RuntimeCommand::AddTab(graph.clone(), id.clone())) 20 + .unwrap(); 21 + 22 + let mut config = conf.store.lock().unwrap(); 23 + config.loaded_tabs.insert(id, (graph, name, location, save_state)); 24 + 25 + conf.save_prelocked(config); 26 + } 27 + 28 + #[tauri::command] 29 + pub fn discard_tab(id: String, cmd: State<Sender<RuntimeCommand>>, conf: State<Config>) { 30 + cmd.send(RuntimeCommand::RemoveTab(id.clone())).unwrap(); 31 + 32 + let mut config = conf.store.lock().unwrap(); 33 + config.loaded_tabs.remove(&id); 34 + }
+29 -12
src-tauri/src/lib.rs
··· 1 - use std::{ fs, sync::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, 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 - mod structs; 9 + mod osc; 10 + mod runtime; 9 11 mod setup; 12 + mod structs; 10 13 mod utils; 11 - mod osc; 12 14 13 15 #[cfg_attr(mobile, tauri::mobile_entry_point)] 14 16 #[tokio::main] 15 17 pub async fn run() { 16 18 let container_folder = dirs::config_dir().unwrap().join("VRCMacros"); 17 19 18 - match fs ::metadata(&container_folder){ 20 + match fs::metadata(&container_folder) { 19 21 Ok(meta) => { 20 - if meta.is_file(){ 21 - panic!("document.write('Cannot launch app as the container path is a file not a directory')"); 22 + if meta.is_file() { 23 + panic!("Cannot launch app as the container path is a file not a directory"); 22 24 } 23 25 } 24 26 Err(_) => { ··· 31 33 32 34 static ADDRESSES: Mutex<Vec<OSCMessage>> = Mutex::new(Vec::new()); 33 35 36 + let mut addresses = ADDRESSES.lock().unwrap(); 37 + addresses.append(&mut vrchat_builtin_parameters::get_read_addresses()); 38 + drop(addresses); 39 + 40 + let (runtime_sender, runtime_receiver) = bounded(1024); 41 + 34 42 tauri::Builder::default() 43 + .plugin(tauri_plugin_os::init()) 44 + .plugin(tauri_plugin_clipboard_manager::init()) 45 + .plugin(tauri_plugin_dialog::init()) 35 46 .plugin(tauri_plugin_opener::init()) 36 47 .invoke_handler(tauri::generate_handler![ 37 48 get_addresses::get_addresses, 38 - 39 - save_graph::save_graph 49 + save_graph::save_graph, 50 + sync_tab::sync_tab, 51 + sync_tab::discard_tab, 52 + load_previous_tabs::load_previous_tabs, 53 + close_app::close_app, 54 + settings::set_hide_editor_on_app_start, 55 + settings::get_hide_editor_on_app_start, 40 56 ]) 41 57 .manage(conf) 42 58 .manage(&ADDRESSES) 43 - .setup(| app | { 44 - setup(app, &ADDRESSES); 59 + .manage(runtime_sender) 60 + .setup(|app| { 61 + setup(app, &ADDRESSES, runtime_receiver); 45 62 Ok(()) 46 63 }) 47 64 .run(tauri::generate_context!()) 48 65 .expect("error while running tauri application"); 49 - } 66 + }
+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 }
+36 -29
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; 8 8 9 9 #[derive(Debug, Clone, Serialize)] 10 - pub struct OSCMessage{ 10 + pub struct OSCMessage { 11 11 pub address: String, 12 - pub values: Vec<ParameterType> 12 + pub values: Vec<ParameterType>, 13 13 } 14 14 15 - impl PartialEq for OSCMessage{ 15 + impl PartialEq for OSCMessage { 16 16 // Technically this isn't exactly equal, but the only time i'm checking if OSCMessage's are equal 17 17 // Is when i'm checking for the "address" value 18 18 ··· 26 26 } 27 27 28 28 // TODO: Implement osc bundles 29 - pub fn start_server( sender: Sender<OSCMessage>, addr: &str ) { 29 + pub fn start_server(sender: Sender<OSCMessage>, addr: &str) { 30 30 let socket = UdpSocket::bind(addr).unwrap(); 31 31 32 32 loop { ··· 34 34 let (amt, _src) = socket.recv_from(&mut buf).unwrap(); 35 35 36 36 let buf = &mut buf[..amt]; 37 - if buf[0] != 0x2F { panic!("Packet is not an OSC Message"); } 37 + if buf[0] != 0x2F { 38 + panic!("Packet is not an OSC Message"); 39 + } 38 40 39 41 let mut addr: Vec<u8> = Vec::new(); 40 42 let mut value_start = 0; 41 43 42 - loop{ 44 + loop { 43 45 let byte = buf[value_start]; 44 - if byte == 0x00{ break; } 46 + if byte == 0x00 { 47 + break; 48 + } 45 49 46 50 value_start += 1; 47 51 addr.push(byte); 48 52 } 49 53 50 - loop{ 54 + loop { 51 55 let byte = buf[value_start]; 52 56 value_start += 1; 53 57 54 - if byte == 0x2C{ break; } 58 + if byte == 0x2C { 59 + break; 60 + } 55 61 } 56 62 57 63 let mut types: Vec<u8> = Vec::new(); 58 64 59 - loop{ 65 + loop { 60 66 let byte = buf[value_start]; 61 - if byte == 0x00{ break; } 67 + if byte == 0x00 { 68 + break; 69 + } 62 70 63 71 types.push(byte); 64 72 value_start += 1; ··· 67 75 value_start = ((value_start as f32 / 4.0).ceil() * 4.0) as usize; 68 76 let mut values = Vec::new(); 69 77 70 - for tp in types{ 71 - match tp{ 78 + for tp in types { 79 + match tp { 72 80 0x69 => { 73 81 let val_buf = &buf[value_start..value_start + 4]; 74 82 ··· 77 85 78 86 values.push(ParameterType::Int(int)); 79 87 value_start += 4; 80 - }, 88 + } 81 89 0x66 => { 82 90 let val_buf = &buf[value_start..value_start + 4]; 83 91 ··· 86 94 87 95 values.push(ParameterType::Float(float)); 88 96 value_start += 4; 89 - }, 97 + } 90 98 0x54 => values.push(ParameterType::Boolean(true)), 91 99 0x46 => values.push(ParameterType::Boolean(false)), 92 100 _ => {} ··· 95 103 96 104 let message = OSCMessage { 97 105 address: String::from_utf8(addr.clone()).unwrap(), 98 - values: values 106 + values: values, 99 107 }; 100 108 101 109 sender.send(message).unwrap(); 102 110 } 103 111 } 104 112 105 - pub fn send_message( address: &str, values: Vec<ParameterType>, ip_addr: &str ){ 113 + pub fn send_message(address: &str, values: Vec<ParameterType>, ip_addr: &str) { 106 114 let socket = UdpSocket::bind("127.0.0.1:0").unwrap(); 107 115 let mut buf: Vec<u8> = Vec::new(); 108 116 ··· 120 128 let mut value_count = 1; 121 129 for value in values.clone() { 122 130 match value { 123 - ParameterType::Boolean( val ) => buf.push(if val { 0x54 } else { 0x46 }), 131 + ParameterType::Boolean(val) => buf.push(if val { 0x54 } else { 0x46 }), 124 132 ParameterType::Float(_) => buf.push(0x66), 125 133 ParameterType::Int(_) => buf.push(0x69), 126 134 ParameterType::String(_) => buf.push(0x73), ··· 130 138 value_count += 1; 131 139 } 132 140 133 - for _i in 0..4 - (value_count % 4) { 141 + for _i in 0..4 - (value_count % 4) { 134 142 buf.push(0); 135 143 } 136 144 137 - for value in values{ 138 - match value{ 139 - ParameterType::Float( val ) => buf.append(&mut val.to_be_bytes().to_vec()), 140 - ParameterType::Int( val ) => buf.append(&mut val.to_be_bytes().to_vec()), 141 - ParameterType::String( val ) => { 145 + for value in values { 146 + match value { 147 + ParameterType::Float(val) => buf.append(&mut val.to_be_bytes().to_vec()), 148 + ParameterType::Int(val) => buf.append(&mut val.to_be_bytes().to_vec()), 149 + ParameterType::String(val) => { 142 150 let mut str_buf = val.as_bytes().to_vec(); 143 151 let buf_len = str_buf.len().clone(); 144 152 145 153 buf.append(&mut str_buf); 146 154 147 - for _i in 0..4 - (buf_len % 4) { 155 + for _i in 0..4 - (buf_len % 4) { 148 156 buf.push(0); 149 157 } 150 158 } ··· 152 160 } 153 161 } 154 162 155 - println!("{:X?}", &buf); 156 163 socket.send_to(&buf, ip_addr).unwrap(); 157 - } 164 + }
+9
src-tauri/src/runtime/commands.rs
··· 1 + use crate::{osc::OSCMessage, structs::nodes::Node}; 2 + 3 + #[derive(Debug)] 4 + pub enum RuntimeCommand { 5 + OSCMessage(OSCMessage), 6 + 7 + AddTab(Vec<Node>, String), 8 + RemoveTab(String), 9 + }
+51
src-tauri/src/runtime/nodes/conditional/ifequal.rs
··· 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 5 + 6 + pub struct ConditionalIfEqual { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 9 + } 10 + 11 + impl ConditionalIfEqual { 12 + pub fn new(node: Node) -> Box<Self> { 13 + Box::new(Self { 14 + outputs: node.outputs.iter().map(|x| { 15 + x.connections.iter() 16 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 17 + 18 + inputs: node.inputs.iter().map(|x| { 19 + let y = x.connections.get(0); 20 + if let Some(y) = y{ 21 + Some((y.node.clone(), y.index, y.value_type)) 22 + } else{ 23 + None 24 + } 25 + }).collect(), 26 + }) 27 + } 28 + } 29 + 30 + impl RuntimeNode for ConditionalIfEqual { 31 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 32 + self.outputs.clone() 33 + } 34 + 35 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 36 + self.inputs.clone() 37 + } 38 + 39 + fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType> { 40 + let is_equal = args[1] == args[2]; 41 + 42 + vec![ 43 + ParameterType::Flow(is_equal), 44 + ParameterType::Flow(!is_equal), 45 + ] 46 + } 47 + 48 + fn is_entrypoint(&self) -> bool { 49 + false 50 + } 51 + }
+51
src-tauri/src/runtime/nodes/conditional/iffalse.rs
··· 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 5 + 6 + pub struct ConditionalIfFalse { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 9 + } 10 + 11 + impl ConditionalIfFalse { 12 + pub fn new(node: Node) -> Box<Self> { 13 + Box::new(Self { 14 + outputs: node.outputs.iter().map(|x| { 15 + x.connections.iter() 16 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 17 + 18 + inputs: node.inputs.iter().map(|x| { 19 + let y = x.connections.get(0); 20 + if let Some(y) = y{ 21 + Some((y.node.clone(), y.index, y.value_type)) 22 + } else{ 23 + None 24 + } 25 + }).collect(), 26 + }) 27 + } 28 + } 29 + 30 + impl RuntimeNode for ConditionalIfFalse { 31 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 32 + self.outputs.clone() 33 + } 34 + 35 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 36 + self.inputs.clone() 37 + } 38 + 39 + fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType> { 40 + let is_false = !args[1].as_bool().unwrap(); 41 + 42 + vec![ 43 + ParameterType::Flow(is_false), 44 + ParameterType::Flow(!is_false), 45 + ] 46 + } 47 + 48 + fn is_entrypoint(&self) -> bool { 49 + false 50 + } 51 + }
+51
src-tauri/src/runtime/nodes/conditional/iftrue.rs
··· 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 5 + 6 + pub struct ConditionalIfTrue { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 9 + } 10 + 11 + impl ConditionalIfTrue { 12 + pub fn new(node: Node) -> Box<Self> { 13 + Box::new(Self { 14 + outputs: node.outputs.iter().map(|x| { 15 + x.connections.iter() 16 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 17 + 18 + inputs: node.inputs.iter().map(|x| { 19 + let y = x.connections.get(0); 20 + if let Some(y) = y{ 21 + Some((y.node.clone(), y.index, y.value_type)) 22 + } else{ 23 + None 24 + } 25 + }).collect(), 26 + }) 27 + } 28 + } 29 + 30 + impl RuntimeNode for ConditionalIfTrue { 31 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 32 + self.outputs.clone() 33 + } 34 + 35 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 36 + self.inputs.clone() 37 + } 38 + 39 + fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType> { 40 + let is_true = args[1].as_bool().unwrap(); 41 + 42 + vec![ 43 + ParameterType::Flow(is_true), 44 + ParameterType::Flow(!is_true), 45 + ] 46 + } 47 + 48 + fn is_entrypoint(&self) -> bool { 49 + false 50 + } 51 + }
+3
src-tauri/src/runtime/nodes/conditional/mod.rs
··· 1 + pub mod ifequal; 2 + pub mod iffalse; 3 + pub mod iftrue;
+47
src-tauri/src/runtime/nodes/debug.rs
··· 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 5 + 6 + pub struct Debug { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>> 9 + } 10 + 11 + impl Debug { 12 + pub fn new(node: Node) -> Box<Self> { 13 + Box::new(Self { 14 + outputs: node.outputs.iter().map(|x| { 15 + x.connections.iter() 16 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 17 + 18 + inputs: node.inputs.iter().map(|x| { 19 + let y = x.connections.get(0); 20 + if let Some(y) = y{ 21 + Some((y.node.clone(), y.index, y.value_type)) 22 + } else{ 23 + None 24 + } 25 + }).collect(), 26 + }) 27 + } 28 + } 29 + 30 + impl RuntimeNode for Debug { 31 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 32 + self.outputs.clone() 33 + } 34 + 35 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 36 + self.inputs.clone() 37 + } 38 + 39 + fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType> { 40 + dbg!(&args); // TODO: Debug to actual UI instead of console 41 + vec![] 42 + } 43 + 44 + fn is_entrypoint(&self) -> bool { 45 + false 46 + } 47 + }
+1
src-tauri/src/runtime/nodes/oscactions/mod.rs
··· 1 + pub mod sendchatbox;
+61
src-tauri/src/runtime/nodes/oscactions/sendchatbox.rs
··· 1 + use std::vec; 2 + 3 + use crate::{ 4 + osc, 5 + runtime::nodes::RuntimeNode, 6 + structs::{nodes::Node, parameter_types::ParameterType}, 7 + }; 8 + 9 + pub struct OSCActionsSendChatbox { 10 + outputs: Vec<Vec<(String, isize, isize)>>, 11 + inputs: Vec<Option<(String, isize, isize)>>, 12 + } 13 + 14 + impl OSCActionsSendChatbox { 15 + pub fn new(node: Node) -> Box<Self> { 16 + Box::new(Self { 17 + outputs: node.outputs.iter().map(|x| { 18 + x.connections.iter() 19 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 20 + 21 + inputs: node.inputs.iter().map(|x| { 22 + let y = x.connections.get(0); 23 + if let Some(y) = y{ 24 + Some((y.node.clone(), y.index, y.value_type)) 25 + } else{ 26 + None 27 + } 28 + }).collect(), 29 + }) 30 + } 31 + } 32 + 33 + impl RuntimeNode for OSCActionsSendChatbox { 34 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 35 + self.outputs.clone() 36 + } 37 + 38 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 39 + self.inputs.clone() 40 + } 41 + 42 + fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType> { 43 + if let Ok(msg) = args[1].as_string(){ 44 + osc::send_message( 45 + "/chatbox/input", 46 + vec![ 47 + ParameterType::String(msg.clone()), 48 + ParameterType::Boolean(true), 49 + ParameterType::Boolean(false), 50 + ], 51 + "127.0.0.1:9000", 52 + ); 53 + } 54 + 55 + vec![] 56 + } 57 + 58 + fn is_entrypoint(&self) -> bool { 59 + false 60 + } 61 + }
+69
src-tauri/src/runtime/nodes/osctrigger.rs
··· 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 5 + 6 + pub struct OSCTrigger { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 9 + 10 + address: Option<String> 11 + } 12 + 13 + impl OSCTrigger { 14 + pub fn new(node: Node) -> Box<Self> { 15 + let value = &node.statics[0].value; 16 + 17 + Box::new(Self { 18 + outputs: node.outputs.iter().map(|x| { 19 + x.connections.iter() 20 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 21 + 22 + inputs: node.inputs.iter().map(|x| { 23 + let y = x.connections.get(0); 24 + if let Some(y) = y{ 25 + Some((y.node.clone(), y.index, y.value_type)) 26 + } else{ 27 + None 28 + } 29 + }).collect(), 30 + 31 + address: if value.is_null() { 32 + None 33 + } else { 34 + Some(value.as_str().unwrap().to_owned()) 35 + }, 36 + }) 37 + } 38 + } 39 + 40 + impl RuntimeNode for OSCTrigger { 41 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 42 + self.outputs.clone() 43 + } 44 + 45 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 46 + self.inputs.clone() 47 + } 48 + 49 + fn execute(&mut self, mut args: Vec<ParameterType>) -> Vec<ParameterType> { 50 + if args.len() == 0{ return args } 51 + 52 + let execute = if let Some(internal_address) = &self.address { 53 + if let Ok(address) = args[0].as_string() { 54 + address == *internal_address 55 + } else{ 56 + false 57 + } 58 + } else{ 59 + false 60 + }; 61 + 62 + args[0] = ParameterType::Flow(execute); 63 + args 64 + } 65 + 66 + fn is_entrypoint(&self) -> bool { 67 + true 68 + } 69 + }
+73
src-tauri/src/runtime/nodes/press_key.rs
··· 1 + use std::sync::{Arc, Mutex}; 2 + 3 + use enigo::{Direction, Enigo, Key, Keyboard}; 4 + 5 + use crate::{ 6 + runtime::nodes::RuntimeNode, 7 + structs::{nodes::Node, parameter_types::ParameterType}, 8 + }; 9 + 10 + pub struct PressKey { 11 + outputs: Vec<Vec<(String, isize, isize)>>, 12 + inputs: Vec<Option<(String, isize, isize)>>, 13 + 14 + key: Option<char>, 15 + enigo: Arc<Mutex<Enigo>>, 16 + } 17 + 18 + impl PressKey { 19 + pub fn new(node: Node, enigo: Arc<Mutex<Enigo>>) -> Box<Self> { 20 + let value = &node.statics[0].value; 21 + 22 + Box::new(Self { 23 + outputs: node.outputs.iter().map(|x| { 24 + x.connections.iter() 25 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 26 + 27 + inputs: node.inputs.iter().map(|x| { 28 + let y = x.connections.get(0); 29 + if let Some(y) = y{ 30 + Some((y.node.clone(), y.index, y.value_type)) 31 + } else{ 32 + None 33 + } 34 + }).collect(), 35 + 36 + enigo, 37 + key: if value.is_null() { 38 + None 39 + } else { 40 + let string = value.as_str().unwrap().to_owned(); 41 + 42 + if string.len() == 1 { 43 + Some(string.chars().nth(0).unwrap()) 44 + } else { 45 + None 46 + } 47 + }, 48 + }) 49 + } 50 + } 51 + 52 + impl RuntimeNode for PressKey { 53 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 54 + self.outputs.clone() 55 + } 56 + 57 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 58 + self.inputs.clone() 59 + } 60 + 61 + fn execute(&mut self, _: Vec<ParameterType>) -> Vec<ParameterType> { 62 + if self.key.is_some() { 63 + let mut enigo = self.enigo.lock().unwrap(); 64 + enigo.key(Key::MediaPlayPause, Direction::Click).unwrap(); 65 + } 66 + 67 + vec![] 68 + } 69 + 70 + fn is_entrypoint(&self) -> bool { 71 + false 72 + } 73 + }
+70
src-tauri/src/runtime/nodes/shell.rs
··· 1 + use std::{io::Stdin, process::{Command, Stdio}}; 2 + 3 + use crate::{ 4 + runtime::nodes::RuntimeNode, 5 + structs::{nodes::Node, parameter_types::ParameterType}, 6 + }; 7 + 8 + pub struct ShellCommand { 9 + outputs: Vec<Vec<(String, isize, isize)>>, 10 + inputs: Vec<Option<(String, isize, isize)>> 11 + } 12 + 13 + impl ShellCommand { 14 + pub fn new(node: Node) -> Box<Self> { 15 + Box::new(Self { 16 + outputs: node.outputs.iter().map(|x| { 17 + x.connections.iter() 18 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 19 + 20 + inputs: node.inputs.iter().map(|x| { 21 + let y = x.connections.get(0); 22 + if let Some(y) = y{ 23 + Some((y.node.clone(), y.index, y.value_type)) 24 + } else{ 25 + None 26 + } 27 + }).collect() 28 + }) 29 + } 30 + } 31 + 32 + impl RuntimeNode for ShellCommand { 33 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 34 + self.outputs.clone() 35 + } 36 + 37 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 38 + self.inputs.clone() 39 + } 40 + 41 + fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType> { 42 + if let Ok(cmd) = args[1].as_string(){ 43 + if cmd != ""{ 44 + let mut split_cmd = cmd.split(" "); 45 + 46 + let mut cmd = Command::new(split_cmd.nth(0).unwrap()); 47 + if split_cmd.clone().count() > 0{ cmd.args(split_cmd); } 48 + 49 + cmd.stdout(Stdio::piped()); 50 + cmd.stderr(Stdio::piped()); 51 + 52 + let child = cmd.spawn().unwrap(); 53 + let output = child.wait_with_output().unwrap(); 54 + 55 + vec![ 56 + ParameterType::Flow(true), 57 + ParameterType::String(str::from_utf8(&output.stdout).unwrap().to_owned()) 58 + ] 59 + } else{ 60 + vec![ ParameterType::Flow(false) ] 61 + } 62 + } else{ 63 + vec![ ParameterType::Flow(false) ] 64 + } 65 + } 66 + 67 + fn is_entrypoint(&self) -> bool { 68 + false 69 + } 70 + }
+60
src-tauri/src/runtime/nodes/statics/float.rs
··· 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 5 + 6 + pub struct StaticFloat { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 9 + 10 + value: Option<f32>, 11 + } 12 + 13 + impl StaticFloat { 14 + pub fn new(node: Node) -> Box<Self> { 15 + let value = &node.statics[0].value; 16 + 17 + Box::new(Self { 18 + outputs: node.outputs.iter().map(|x| { 19 + x.connections.iter() 20 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 21 + 22 + inputs: node.inputs.iter().map(|x| { 23 + let y = x.connections.get(0); 24 + if let Some(y) = y{ 25 + Some((y.node.clone(), y.index, y.value_type)) 26 + } else{ 27 + None 28 + } 29 + }).collect(), 30 + 31 + value: if value.is_null() { 32 + None 33 + } else { 34 + Some(value.as_f64().unwrap() as f32) 35 + } 36 + }) 37 + } 38 + } 39 + 40 + impl RuntimeNode for StaticFloat { 41 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 42 + self.outputs.clone() 43 + } 44 + 45 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 46 + self.inputs.clone() 47 + } 48 + 49 + fn execute(&mut self, _: Vec<ParameterType>) -> Vec<ParameterType> { 50 + if self.value.is_some() { 51 + vec![ParameterType::Float(self.value.clone().unwrap())] 52 + } else { 53 + vec![ParameterType::Float(0.0)] 54 + } 55 + } 56 + 57 + fn is_entrypoint(&self) -> bool { 58 + false 59 + } 60 + }
+60
src-tauri/src/runtime/nodes/statics/int.rs
··· 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 5 + 6 + pub struct StaticInt { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 9 + 10 + value: Option<i32>, 11 + } 12 + 13 + impl StaticInt { 14 + pub fn new(node: Node) -> Box<Self> { 15 + let value = &node.statics[0].value; 16 + 17 + Box::new(Self { 18 + outputs: node.outputs.iter().map(|x| { 19 + x.connections.iter() 20 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 21 + 22 + inputs: node.inputs.iter().map(|x| { 23 + let y = x.connections.get(0); 24 + if let Some(y) = y{ 25 + Some((y.node.clone(), y.index, y.value_type)) 26 + } else{ 27 + None 28 + } 29 + }).collect(), 30 + 31 + value: if value.is_null() { 32 + None 33 + } else { 34 + Some(value.as_i64().unwrap() as i32) 35 + } 36 + }) 37 + } 38 + } 39 + 40 + impl RuntimeNode for StaticInt { 41 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 42 + self.outputs.clone() 43 + } 44 + 45 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 46 + self.inputs.clone() 47 + } 48 + 49 + fn execute(&mut self, _: Vec<ParameterType>) -> Vec<ParameterType> { 50 + if self.value.is_some() { 51 + vec![ParameterType::Int(self.value.clone().unwrap())] 52 + } else { 53 + vec![ParameterType::Int(0)] 54 + } 55 + } 56 + 57 + fn is_entrypoint(&self) -> bool { 58 + false 59 + } 60 + }
+3
src-tauri/src/runtime/nodes/statics/mod.rs
··· 1 + pub mod float; 2 + pub mod int; 3 + pub mod string;
+60
src-tauri/src/runtime/nodes/statics/string.rs
··· 1 + use crate::{ 2 + runtime::nodes::RuntimeNode, 3 + structs::{nodes::Node, parameter_types::ParameterType}, 4 + }; 5 + 6 + pub struct StaticString { 7 + outputs: Vec<Vec<(String, isize, isize)>>, 8 + inputs: Vec<Option<(String, isize, isize)>>, 9 + 10 + value: Option<String>, 11 + } 12 + 13 + impl StaticString { 14 + pub fn new(node: Node) -> Box<Self> { 15 + let value = &node.statics[0].value; 16 + 17 + Box::new(Self { 18 + outputs: node.outputs.iter().map(|x| { 19 + x.connections.iter() 20 + .map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(), 21 + 22 + inputs: node.inputs.iter().map(|x| { 23 + let y = x.connections.get(0); 24 + if let Some(y) = y{ 25 + Some((y.node.clone(), y.index, y.value_type)) 26 + } else{ 27 + None 28 + } 29 + }).collect(), 30 + 31 + value: if value.is_null() { 32 + None 33 + } else { 34 + Some(value.as_str().unwrap().to_owned()) 35 + } 36 + }) 37 + } 38 + } 39 + 40 + impl RuntimeNode for StaticString { 41 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 42 + self.outputs.clone() 43 + } 44 + 45 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>> { 46 + self.inputs.clone() 47 + } 48 + 49 + fn execute(&mut self, _: Vec<ParameterType>) -> Vec<ParameterType> { 50 + if self.value.is_some() { 51 + vec![ParameterType::String(self.value.clone().unwrap())] 52 + } else { 53 + vec![ParameterType::String("".to_owned())] 54 + } 55 + } 56 + 57 + fn is_entrypoint(&self) -> bool { 58 + false 59 + } 60 + }
+99
src-tauri/src/runtime/nodes.rs
··· 1 + use std::{ 2 + collections::HashMap, 3 + sync::{Arc, Mutex}, 4 + }; 5 + 6 + // #[cfg(target_os = "windows")] 7 + use enigo::Enigo; 8 + 9 + use crate::{ 10 + runtime::nodes::{ 11 + conditional::{ 12 + ifequal::ConditionalIfEqual, iffalse::ConditionalIfFalse, iftrue::ConditionalIfTrue, 13 + }, debug::Debug, oscactions::sendchatbox::OSCActionsSendChatbox, osctrigger::OSCTrigger, shell::ShellCommand, statics::{float::StaticFloat, int::StaticInt, string::StaticString} 14 + }, 15 + structs::{nodes::Node, parameter_types::ParameterType}, 16 + }; 17 + 18 + // #[cfg(target_os = "windows")] 19 + use crate::runtime::nodes::press_key::PressKey; 20 + 21 + mod conditional; 22 + mod debug; 23 + mod oscactions; 24 + mod osctrigger; 25 + mod statics; 26 + mod shell; 27 + 28 + // #[cfg(target_os = "windows")] 29 + mod press_key; 30 + 31 + pub struct RuntimeNodeTree { 32 + pub nodes: HashMap<String, Box<dyn RuntimeNode>>, 33 + } 34 + 35 + unsafe impl Send for RuntimeNodeTree {} 36 + 37 + impl RuntimeNodeTree { 38 + pub fn from(tree: Vec<Node>, /*#[cfg(target_os = "windows")]*/ enigo: Arc<Mutex<Enigo>>) -> Self { 39 + let mut runtime_nodes: HashMap<String, Box<dyn RuntimeNode>> = HashMap::new(); 40 + for node in tree { 41 + match node.type_id.as_str() { 42 + "osctrigger" => { 43 + runtime_nodes.insert(node.id.clone(), OSCTrigger::new(node)); 44 + } 45 + 46 + "staticstring" => { 47 + runtime_nodes.insert(node.id.clone(), StaticString::new(node)); 48 + } 49 + "staticint" => { 50 + runtime_nodes.insert(node.id.clone(), StaticInt::new(node)); 51 + } 52 + "staticfloat" => { 53 + runtime_nodes.insert(node.id.clone(), StaticFloat::new(node)); 54 + } 55 + 56 + "iftrue" => { 57 + runtime_nodes.insert(node.id.clone(), ConditionalIfTrue::new(node)); 58 + } 59 + "iffalse" => { 60 + runtime_nodes.insert(node.id.clone(), ConditionalIfFalse::new(node)); 61 + } 62 + "ifequal" => { 63 + runtime_nodes.insert(node.id.clone(), ConditionalIfEqual::new(node)); 64 + } 65 + 66 + "oscsendchatbox" => { 67 + runtime_nodes.insert(node.id.clone(), OSCActionsSendChatbox::new(node)); 68 + } 69 + 70 + "debug" => { 71 + runtime_nodes.insert(node.id.clone(), Debug::new(node)); 72 + } 73 + 74 + // #[cfg(target_os = "windows")] 75 + "presskey" => { 76 + runtime_nodes.insert(node.id.clone(), PressKey::new(node, enigo.clone())); 77 + } 78 + 79 + "shellcommand" => { 80 + runtime_nodes.insert(node.id.clone(), ShellCommand::new(node)); 81 + } 82 + 83 + _ => {} 84 + } 85 + } 86 + 87 + Self { 88 + nodes: runtime_nodes, 89 + } 90 + } 91 + } 92 + 93 + pub trait RuntimeNode { 94 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>>; // Node ID, input index, output value type 95 + fn inputs(&self) -> Vec<Option<(String, isize, isize)>>; // Node ID, input index, output value type 96 + 97 + fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType>; // Then call functions on the second loop 98 + fn is_entrypoint(&self) -> bool; 99 + }
+97
src-tauri/src/runtime.rs
··· 1 + use std::collections::HashMap; 2 + 3 + use anyhow::{bail, Result}; 4 + 5 + use crate::{runtime::nodes::RuntimeNodeTree, structs::parameter_types::ParameterType}; 6 + 7 + pub mod commands; 8 + pub mod nodes; 9 + 10 + // TODO: Variables 11 + 12 + pub fn recurse_runtime(entry: String, tab: &mut RuntimeNodeTree, args: Vec<ParameterType>) -> Result<()>{ 13 + let ( out_args, output_map ) = runtime(entry, tab, args)?; 14 + 15 + let mut next_node_args: HashMap<String, Vec<ParameterType>> = HashMap::new(); 16 + 17 + for i in 0..out_args.len(){ 18 + if output_map.len() <= i { break; } 19 + let links = &output_map[i]; 20 + 21 + for ( id, link_index, _ ) in links{ 22 + let link_index = link_index.clone() as usize; 23 + 24 + if next_node_args.contains_key(id){ 25 + let args: &mut _ = next_node_args.get_mut(id).unwrap(); 26 + while args.len() < link_index{ args.push(ParameterType::None); } 27 + 28 + args.push(out_args[i].clone()); 29 + } else{ 30 + let mut args = vec![ParameterType::None; link_index]; 31 + args.push(out_args[i].clone()); 32 + 33 + next_node_args.insert(id.clone(), args); 34 + } 35 + } 36 + } 37 + 38 + for i in 0..out_args.len(){ 39 + if let ParameterType::Flow(next) = out_args[i]{ 40 + if next{ 41 + let links = &output_map[i]; 42 + 43 + for ( id, _, _ ) in links{ 44 + let args = next_node_args.remove(id).unwrap(); 45 + recurse_runtime(id.clone(), tab, args)?; 46 + } 47 + } 48 + } 49 + } 50 + 51 + Ok(()) 52 + } 53 + 54 + pub fn runtime(entry: String, tab: &mut RuntimeNodeTree, mut args: Vec<ParameterType>) -> Result<(Vec<ParameterType>, Vec<Vec<(String, isize, isize)>>)> { 55 + let node = tab.nodes.get_mut(&entry); 56 + if node.is_none() { bail!("Cannot find node"); } 57 + 58 + let node = node.unwrap(); 59 + let inputs = node.inputs(); 60 + 61 + let mut needed_input_nodes = HashMap::new(); 62 + 63 + for i in 0..inputs.len(){ 64 + if i >= args.len() || args[i] == ParameterType::None{ 65 + if let Some(input) = &inputs[i]{ 66 + if !needed_input_nodes.contains_key(&input.0){ 67 + needed_input_nodes.insert(input.0.clone(), vec![(input.1.clone(), i.clone())]); 68 + } else{ 69 + needed_input_nodes.get_mut(&input.0).unwrap().push((input.1.clone(), i.clone())); 70 + } 71 + } 72 + } 73 + } 74 + 75 + for ( id, needed ) in needed_input_nodes{ 76 + let (out_args, _) = runtime(id, tab, vec![]).unwrap(); 77 + 78 + for ( output, input ) in needed{ 79 + let arg = &out_args[output as usize]; 80 + 81 + if args.len() >= input{ 82 + while args.len() < input{ args.push(ParameterType::None); } 83 + args.push(arg.clone()); 84 + } else{ 85 + args[input] = arg.clone(); 86 + } 87 + } 88 + } 89 + 90 + let node = tab.nodes.get_mut(&entry); // TODO: Find a way to only do this lookup once 91 + if node.is_none() { bail!("Cannot find node"); } 92 + 93 + let node = node.unwrap(); 94 + 95 + let output = node.execute(args); 96 + Ok((output, node.outputs())) 97 + }
+116 -12
src-tauri/src/setup.rs
··· 1 - use std::{ fs::File, io::Read, sync::{ self, 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::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 }; 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 - pub fn setup( app: &mut App, addresses: &'static Mutex<Vec<OSCMessage>> ){ 17 + pub fn setup( 18 + app: &mut App, 19 + addresses: &'static Mutex<Vec<OSCMessage>>, 20 + runtime_command_receiver: Receiver<RuntimeCommand>, 21 + ) { 10 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()); 11 44 12 45 let handle = window.clone(); 13 - window.listen("tauri://drag-drop", move | ev | { 46 + window.listen("tauri://drag-drop", move |ev| { 14 47 let path: Value = serde_json::from_str(ev.payload()).unwrap(); 15 48 let path = path["paths"][0].as_str().unwrap(); 16 49 17 - let file = File::open(path).unwrap(); 50 + let file = File::open(&path).unwrap(); 18 51 let mut decoder = GzDecoder::new(file); 19 52 let mut string = String::new(); 20 53 21 54 decoder.read_to_string(&mut string).unwrap(); 22 55 23 - handle.emit("load_new_tab", Value::String(string)).unwrap(); 56 + let mut map = Map::new(); 57 + 58 + map.insert("path".to_owned(), Value::String(path.to_owned())); 59 + map.insert("graph".to_owned(), Value::String(string)); 60 + 61 + handle.emit("load_new_tab", Value::Object(map)).unwrap(); 24 62 }); 25 63 26 - let ( sender, receiver ) = sync::mpsc::channel(); 64 + let (sender, receiver) = bounded(1024); 27 65 28 66 tokio::spawn(async move { 29 67 osc::start_server(sender, "127.0.0.1:9001"); 30 68 }); 31 69 70 + let (runtime_sender, runtime_receiver) = bounded(1024); 71 + 72 + let runtime_sender_1 = runtime_sender.clone(); 73 + tokio::spawn(async move { 74 + loop { 75 + let cmd = runtime_command_receiver.recv().unwrap(); 76 + runtime_sender_1.send(cmd).unwrap(); 77 + } 78 + }); 79 + 32 80 tokio::spawn(async move { 33 81 loop { 34 82 let message = receiver.recv().unwrap(); ··· 36 84 window.emit("osc-message", &message).unwrap(); 37 85 38 86 let msg = message.clone(); 39 - let mut addresses = addresses.lock().unwrap(); 40 - if !addresses.contains(&msg){ addresses.push(msg); } 87 + let mut addrs = addresses.lock().unwrap(); 88 + if !addrs.contains(&msg) { 89 + addrs.push(msg); 90 + } 91 + 92 + if message.address == "/avatar/change".to_owned(){ 93 + *addrs = vrchat_builtin_parameters::get_read_addresses(); 94 + 95 + // TODO: Read avatar paramaters from file 96 + } 97 + 98 + runtime_sender 99 + .send(RuntimeCommand::OSCMessage(message)) 100 + .unwrap(); 41 101 } 42 102 }); 43 - } 103 + 104 + // TODO: Run tabs in seperate threads (really not looking forward to this... thanks rust) 105 + 106 + tokio::spawn(async move { 107 + let mut tabs: HashMap<String, RuntimeNodeTree> = HashMap::new(); 108 + 109 + // #[cfg(target_os = "windows")] 110 + let enigo = Arc::new(Mutex::new(enigo::Enigo::new(&enigo::Settings::default()).unwrap())); 111 + 112 + loop { 113 + let cmd = runtime_receiver.recv().unwrap(); 114 + 115 + match cmd { 116 + RuntimeCommand::OSCMessage(msg) => { 117 + for (_, mut tab) in &mut tabs { 118 + let keys: Vec<String> = tab.nodes.keys().map(|x| x.clone()).collect(); 119 + 120 + for id in keys { 121 + let entry = tab.nodes[&id].is_entrypoint(); 122 + 123 + if entry { 124 + let mut args = vec![ ParameterType::String(msg.address.clone())]; 125 + let mut values = msg.values.clone(); 126 + 127 + args.append(&mut values); 128 + let _ = recurse_runtime(id.clone(), &mut tab, args); 129 + } 130 + } 131 + } 132 + } 133 + 134 + RuntimeCommand::AddTab(graph, id) => { 135 + // #[cfg(target_os = "windows")] 136 + tabs.insert(id, RuntimeNodeTree::from(graph, enigo.clone())); 137 + 138 + // #[cfg(target_os = "linux")] 139 + // tabs.insert(id, RuntimeNodeTree::from(graph)); 140 + } 141 + RuntimeCommand::RemoveTab(id) => { 142 + tabs.remove(&id); 143 + } 144 + } 145 + } 146 + }); 147 + }
+2 -1
src-tauri/src/structs/mod.rs
··· 1 - pub mod parameter_types; 1 + pub mod nodes; 2 + pub mod parameter_types;
+43
src-tauri/src/structs/nodes.rs
··· 1 + use serde::{Deserialize, Serialize}; 2 + use serde_json::Value; 3 + 4 + #[derive(Serialize, Deserialize, Debug, Clone)] 5 + pub struct Node { 6 + pub id: String, 7 + pub name: String, 8 + pub outputs: Vec<NodeIO>, 9 + pub inputs: Vec<NodeIO>, 10 + pub pos: [f32; 2], 11 + pub statics: Vec<NodeStatic>, 12 + 13 + #[serde(rename = "typeId")] 14 + pub type_id: String, 15 + } 16 + 17 + #[derive(Serialize, Deserialize, Debug, Clone)] 18 + pub struct NodeStatic { 19 + pub name: String, 20 + 21 + #[serde(rename = "type")] 22 + pub value_type: isize, 23 + pub value: Value, 24 + } 25 + 26 + #[derive(Serialize, Deserialize, Debug, Clone)] 27 + pub struct NodeIO { 28 + pub name: String, 29 + 30 + #[serde(rename = "type")] 31 + pub value_type: isize, 32 + pub connections: Vec<NodeOutputConnections>, 33 + } 34 + 35 + #[derive(Serialize, Deserialize, Debug, Clone)] 36 + pub struct NodeOutputConnections { 37 + pub name: String, 38 + pub node: String, 39 + pub index: isize, 40 + 41 + #[serde(rename = "type")] 42 + pub value_type: isize, 43 + }
+58 -3
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 - pub enum ParameterType{ 6 + pub enum ParameterType { 6 7 AnyType(String), 7 8 Label(&'static str), 8 9 ··· 10 11 Float(f32), 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 + } 68 + }
+70 -63
src-tauri/src/utils/config.rs
··· 1 - use std::{ collections::HashMap, fs::File, io::{ Read, Write }, path::PathBuf, sync::Mutex }; 2 - 3 - use flate2::{ read::GzDecoder, write::GzEncoder, Compression }; 4 - use serde_json::Value; 5 - 6 - pub struct Config{ 7 - store: Mutex<HashMap<String, Value>>, 8 - path: PathBuf 9 - } 10 - 11 - impl Config{ 12 - pub fn new( path: PathBuf ) -> Self{ 13 - let json_string = if path.exists(){ 14 - let mut decoder = GzDecoder::new(File::open(&path).unwrap()); 15 - let mut string = String::new(); 16 - 17 - decoder.read_to_string(&mut string).unwrap(); 18 - string 19 - } else{ 20 - "{}".into() 21 - }; 22 - 23 - let json: Value = serde_json::from_str(&json_string).unwrap(); 24 - 25 - let mut hashmap = HashMap::new(); 26 - 27 - let obj = json.as_object().unwrap(); 28 - for ( key, val ) in obj{ 29 - hashmap.insert(key.clone(), val.clone()); 30 - } 31 - 32 - Config { 33 - store: Mutex::new(hashmap), 34 - path: path 35 - } 36 - } 37 - 38 - pub fn set( &self, key: &str, value: Value ){ 39 - self.store.lock().unwrap().insert(key.to_owned(), value); 40 - } 41 - 42 - pub fn get( &self, key: &str ) -> Option<Value>{ 43 - let store = self.store.lock().unwrap(); 44 - let val = store.get(&key.to_owned()); 45 - 46 - if val.is_none(){ 47 - None 48 - } else{ 49 - Some(val.unwrap().clone()) 50 - } 51 - } 52 - 53 - pub fn save( &self ){ 54 - let dat = serde_json::to_string(&self.store.lock().unwrap().clone()).unwrap(); 55 - dbg!(&dat); 56 - 57 - let file = File::create(&self.path).unwrap(); 58 - let mut encoder = GzEncoder::new(file, Compression::default()); 59 - 60 - encoder.write_all(dat.as_bytes()).unwrap(); 61 - encoder.finish().unwrap(); 62 - } 63 - } 1 + use std::{ 2 + collections::HashMap, 3 + fs::File, 4 + io::{Read, Write}, 5 + path::PathBuf, 6 + sync::{Mutex, MutexGuard}, 7 + }; 8 + 9 + use chrono::Utc; 10 + use flate2::{read::GzDecoder, write::GzEncoder, Compression}; 11 + use serde::{Deserialize, Serialize}; 12 + 13 + use crate::structs::nodes::Node; 14 + 15 + #[derive(Clone, Serialize, Deserialize, Debug)] 16 + pub struct ConfigValues { 17 + #[serde(default)] 18 + pub loaded_tabs: HashMap<String, (Vec<Node>, String, Option<String>, bool)>, 19 + 20 + #[serde(default)] 21 + pub hide_editor_on_start: bool, 22 + } 23 + 24 + pub struct Config { 25 + pub store: Mutex<ConfigValues>, 26 + path: PathBuf, 27 + } 28 + 29 + impl Config { 30 + pub fn new(path: PathBuf) -> Self { 31 + let json_string = if path.exists() { 32 + let mut decoder = GzDecoder::new(File::open(&path).unwrap()); 33 + let mut string = String::new(); 34 + 35 + decoder.read_to_string(&mut string).unwrap(); 36 + string 37 + } else { 38 + "{}".into() 39 + }; 40 + 41 + let json: ConfigValues = serde_json::from_str(&json_string).unwrap(); 42 + 43 + Config { 44 + store: Mutex::new(json), 45 + path: path, 46 + } 47 + } 48 + 49 + pub fn save(&self) { 50 + let mut dat = self.store.lock().unwrap(); 51 + 52 + let dat = serde_json::to_string(&*dat).unwrap(); 53 + 54 + let file = File::create(&self.path).unwrap(); 55 + let mut encoder = GzEncoder::new(file, Compression::default()); 56 + 57 + encoder.write_all(dat.as_bytes()).unwrap(); 58 + encoder.finish().unwrap(); 59 + } 60 + 61 + pub fn save_prelocked(&self, mut dat: MutexGuard<'_, ConfigValues>) { 62 + let dat = serde_json::to_string(&*dat).unwrap(); 63 + 64 + let file = File::create(&self.path).unwrap(); 65 + let mut encoder = GzEncoder::new(file, Compression::default()); 66 + 67 + encoder.write_all(dat.as_bytes()).unwrap(); 68 + encoder.finish().unwrap(); 69 + } 70 + }
+3 -1
src-tauri/src/utils/mod.rs
··· 1 - pub mod config; 1 + pub mod config; 2 + pub mod setup_traymenu; 3 + pub mod vrchat_builtin_parameters;
+45
src-tauri/src/utils/setup_traymenu.rs
··· 1 + use tauri::{ 2 + menu::{MenuBuilder, MenuItemBuilder}, 3 + tray::TrayIconBuilder, 4 + AppHandle, Emitter, Manager, 5 + }; 6 + 7 + pub fn setup_traymenu(handle: &AppHandle) { 8 + // Setup the tray icon and menu buttons 9 + let quit = MenuItemBuilder::new("Quit") 10 + .id("quit") 11 + .build(handle) 12 + .unwrap(); 13 + 14 + let show = MenuItemBuilder::new("Show Editor") 15 + .id("show") 16 + .build(handle) 17 + .unwrap(); 18 + 19 + let tray_menu = MenuBuilder::new(handle) 20 + .items(&[&quit, &show]) 21 + .build() 22 + .unwrap(); 23 + 24 + TrayIconBuilder::with_id("main") 25 + .icon(tauri::image::Image::from_bytes(include_bytes!("../../icons/32x32.png")).unwrap()) 26 + .menu(&tray_menu) 27 + .title("VRCMacros") 28 + .tooltip("VRCMacros") 29 + .on_menu_event(move |app: &AppHandle, event| match event.id().as_ref() { 30 + "quit" => { 31 + app.emit("prompt_to_close", ()).unwrap(); 32 + } 33 + "show" => { 34 + let window = app.get_webview_window("main").unwrap(); 35 + 36 + window.show().unwrap(); 37 + window.set_focus().unwrap(); 38 + 39 + window.emit("show-window", ()).unwrap(); 40 + } 41 + _ => {} 42 + }) 43 + .build(handle) 44 + .unwrap(); 45 + }
+315
src-tauri/src/utils/vrchat_builtin_parameters.rs
··· 1 + use crate::{osc::OSCMessage, structs::parameter_types::ParameterType}; 2 + 3 + pub fn get_read_addresses() -> Vec<OSCMessage>{ 4 + vec![ 5 + // Avatar Parameters 6 + OSCMessage { 7 + address: "/avatar/change".into(), 8 + values: vec![ ParameterType::String("".into()) ] 9 + }, 10 + 11 + OSCMessage { 12 + address: "/avatar/parameters/VRCEmote".into(), 13 + values: vec![ ParameterType::Int(0) ] 14 + }, 15 + OSCMessage { 16 + address: "/avatar/parameters/VRCFaceBlendV".into(), 17 + values: vec![ ParameterType::Float(0.0) ] 18 + }, 19 + OSCMessage { 20 + address: "/avatar/parameters/VRCFaceBlendH".into(), 21 + values: vec![ ParameterType::Float(0.0) ] 22 + }, 23 + OSCMessage { 24 + address: "/avatar/parameters/PreviewMode".into(), 25 + values: vec![ ParameterType::Int(0) ] 26 + }, 27 + OSCMessage { 28 + address: "/avatar/parameters/IsAnimatorEnabled".into(), 29 + values: vec![ ParameterType::Boolean(true) ] 30 + }, 31 + 32 + OSCMessage { 33 + address: "/avatar/parameters/GestureRightWeight".into(), 34 + values: vec![ ParameterType::Float(0.0) ] 35 + }, 36 + OSCMessage { 37 + address: "/avatar/parameters/GestureLeftWeight".into(), 38 + values: vec![ ParameterType::Float(0.0) ] 39 + }, 40 + OSCMessage { 41 + address: "/avatar/parameters/GestureRight".into(), 42 + values: vec![ ParameterType::Int(0) ] 43 + }, 44 + OSCMessage { 45 + address: "/avatar/parameters/GestureLeft".into(), 46 + values: vec![ ParameterType::Int(0) ] 47 + }, 48 + 49 + OSCMessage { 50 + address: "/avatar/parameters/ScaleModified".into(), 51 + values: vec![ ParameterType::Boolean(true) ] 52 + }, 53 + OSCMessage { 54 + address: "/avatar/parameters/ScaleFactor".into(), 55 + values: vec![ ParameterType::Float(1.0) ] 56 + }, 57 + OSCMessage { 58 + address: "/avatar/parameters/ScaleFactorInverse".into(), 59 + values: vec![ ParameterType::Float(1.0) ] 60 + }, 61 + OSCMessage { 62 + address: "/avatar/parameters/EyeHeightAsPercent".into(), 63 + values: vec![ ParameterType::Float(1.0) ] 64 + }, 65 + 66 + OSCMessage { 67 + address: "/avatar/parameters/Viseme".into(), 68 + values: vec![ ParameterType::Int(0) ] 69 + }, 70 + OSCMessage { 71 + address: "/avatar/parameters/Voice".into(), 72 + values: vec![ ParameterType::Float(0.0) ] 73 + }, 74 + OSCMessage { 75 + address: "/avatar/parameters/Earmuffs".into(), 76 + values: vec![ ParameterType::Boolean(true) ] 77 + }, 78 + OSCMessage { 79 + address: "/avatar/parameters/MuteSelf".into(), 80 + values: vec![ ParameterType::Boolean(true) ] 81 + }, 82 + 83 + OSCMessage { 84 + address: "/avatar/parameters/AFK".into(), 85 + values: vec![ ParameterType::Boolean(true) ] 86 + }, 87 + OSCMessage { 88 + address: "/avatar/parameters/InStation".into(), 89 + values: vec![ ParameterType::Boolean(true) ] 90 + }, 91 + OSCMessage { 92 + address: "/avatar/parameters/Seated".into(), 93 + values: vec![ ParameterType::Boolean(true) ] 94 + }, 95 + OSCMessage { 96 + address: "/avatar/parameters/VRMode".into(), 97 + values: vec![ ParameterType::Int(0) ] 98 + }, 99 + OSCMessage { 100 + address: "/avatar/parameters/TrackingType".into(), 101 + values: vec![ ParameterType::Int(0) ] 102 + }, 103 + 104 + OSCMessage { 105 + address: "/avatar/parameters/Grounded".into(), 106 + values: vec![ ParameterType::Boolean(true) ] 107 + }, 108 + OSCMessage { 109 + address: "/avatar/parameters/Upright".into(), 110 + values: vec![ ParameterType::Float(1.0) ] 111 + }, 112 + OSCMessage { 113 + address: "/avatar/parameters/AngularY".into(), 114 + values: vec![ ParameterType::Float(1.0) ] 115 + }, 116 + OSCMessage { 117 + address: "/avatar/parameters/VelocityX".into(), 118 + values: vec![ ParameterType::Float(1.0) ] 119 + }, 120 + OSCMessage { 121 + address: "/avatar/parameters/VelocityY".into(), 122 + values: vec![ ParameterType::Float(1.0) ] 123 + }, 124 + OSCMessage { 125 + address: "/avatar/parameters/VelocityZ".into(), 126 + values: vec![ ParameterType::Float(1.0) ] 127 + }, 128 + OSCMessage { 129 + address: "/avatar/parameters/VelocityMagnitude".into(), 130 + values: vec![ ParameterType::Float(1.0) ] 131 + }, 132 + 133 + // User Camera 134 + OSCMessage { 135 + address: "/usercamera/Mode".into(), 136 + values: vec![ ParameterType::Int(0) ] 137 + }, 138 + OSCMessage { 139 + address: "/usercamera/Pose".into(), 140 + values: vec![ 141 + ParameterType::Float(0.0), 142 + ParameterType::Float(0.0), 143 + ParameterType::Float(0.0), 144 + 145 + ParameterType::Float(0.0), 146 + ParameterType::Float(0.0), 147 + ParameterType::Float(0.0) 148 + ] 149 + }, 150 + 151 + OSCMessage { 152 + address: "/usercamera/ShowUIInCamera".into(), 153 + values: vec![ ParameterType::Boolean(true) ] 154 + }, 155 + OSCMessage { 156 + address: "/usercamera/LocalPlayer".into(), 157 + values: vec![ ParameterType::Boolean(true) ] 158 + }, 159 + OSCMessage { 160 + address: "/usercamera/RemotePlayer".into(), 161 + values: vec![ ParameterType::Boolean(true) ] 162 + }, 163 + OSCMessage { 164 + address: "/usercamera/Environment".into(), 165 + values: vec![ ParameterType::Boolean(true) ] 166 + }, 167 + OSCMessage { 168 + address: "/usercamera/GreenScreen".into(), 169 + values: vec![ ParameterType::Boolean(true) ] 170 + }, 171 + OSCMessage { 172 + address: "/usercamera/Lock".into(), 173 + values: vec![ ParameterType::Boolean(true) ] 174 + }, 175 + OSCMessage { 176 + address: "/usercamera/SmoothMovement".into(), 177 + values: vec![ ParameterType::Boolean(true) ] 178 + }, 179 + OSCMessage { 180 + address: "/usercamera/LookAtMe".into(), 181 + values: vec![ ParameterType::Boolean(true) ] 182 + }, 183 + OSCMessage { 184 + address: "/usercamera/AutoLevelRoll".into(), 185 + values: vec![ ParameterType::Boolean(true) ] 186 + }, 187 + OSCMessage { 188 + address: "/usercamera/AutoLevelPitch".into(), 189 + values: vec![ ParameterType::Boolean(true) ] 190 + }, 191 + OSCMessage { 192 + address: "/usercamera/Flying".into(), 193 + values: vec![ ParameterType::Boolean(true) ] 194 + }, 195 + OSCMessage { 196 + address: "/usercamera/TriggerTakesPhotos".into(), 197 + values: vec![ ParameterType::Boolean(true) ] 198 + }, 199 + OSCMessage { 200 + address: "/usercamera/DollyPathsStayVisible".into(), 201 + values: vec![ ParameterType::Boolean(true) ] 202 + }, 203 + OSCMessage { 204 + address: "/usercamera/AudioFromCamera".into(), 205 + values: vec![ ParameterType::Boolean(true) ] 206 + }, 207 + OSCMessage { 208 + address: "/usercamera/ShowFocus".into(), 209 + values: vec![ ParameterType::Boolean(true) ] 210 + }, 211 + OSCMessage { 212 + address: "/usercamera/Streaming".into(), 213 + values: vec![ ParameterType::Boolean(true) ] 214 + }, 215 + OSCMessage { 216 + address: "/usercamera/RollWhileFlying".into(), 217 + values: vec![ ParameterType::Boolean(true) ] 218 + }, 219 + OSCMessage { 220 + address: "/usercamera/OrientationIsLandscape".into(), 221 + values: vec![ ParameterType::Boolean(true) ] 222 + }, 223 + 224 + OSCMessage { 225 + address: "/usercamera/Zoom".into(), 226 + values: vec![ ParameterType::Float(0.0) ] 227 + }, 228 + OSCMessage { 229 + address: "/usercamera/Exposure".into(), 230 + values: vec![ ParameterType::Float(0.0) ] 231 + }, 232 + OSCMessage { 233 + address: "/usercamera/Aperture".into(), 234 + values: vec![ ParameterType::Float(0.0) ] 235 + }, 236 + OSCMessage { 237 + address: "/usercamera/Hue".into(), 238 + values: vec![ ParameterType::Float(0.0) ] 239 + }, 240 + OSCMessage { 241 + address: "/usercamera/Saturation".into(), 242 + values: vec![ ParameterType::Float(0.0) ] 243 + }, 244 + OSCMessage { 245 + address: "/usercamera/Lightness".into(), 246 + values: vec![ ParameterType::Float(0.0) ] 247 + }, 248 + OSCMessage { 249 + address: "/usercamera/LookAtMeXOffset".into(), 250 + values: vec![ ParameterType::Float(0.0) ] 251 + }, 252 + OSCMessage { 253 + address: "/usercamera/LookAtMeYOffset".into(), 254 + values: vec![ ParameterType::Float(0.0) ] 255 + }, 256 + OSCMessage { 257 + address: "/usercamera/FlySpeed".into(), 258 + values: vec![ ParameterType::Float(0.0) ] 259 + }, 260 + OSCMessage { 261 + address: "/usercamera/TurnSpeed".into(), 262 + values: vec![ ParameterType::Float(0.0) ] 263 + }, 264 + OSCMessage { 265 + address: "/usercamera/SmoothStrength".into(), 266 + values: vec![ ParameterType::Float(0.0) ] 267 + }, 268 + OSCMessage { 269 + address: "/usercamera/PhotoRate".into(), 270 + values: vec![ ParameterType::Float(0.0) ] 271 + }, 272 + OSCMessage { 273 + address: "/usercamera/Duration".into(), 274 + values: vec![ ParameterType::Float(0.0) ] 275 + }, 276 + 277 + // Trackers 278 + OSCMessage { 279 + address: "/tracking/vrsystem/head/pose".into(), 280 + values: vec![ 281 + ParameterType::Float(0.0), 282 + ParameterType::Float(0.0), 283 + ParameterType::Float(0.0), 284 + 285 + ParameterType::Float(0.0), 286 + ParameterType::Float(0.0), 287 + ParameterType::Float(0.0), 288 + ] 289 + }, 290 + OSCMessage { 291 + address: "/tracking/vrsystem/rightwrist/pose".into(), 292 + values: vec![ 293 + ParameterType::Float(0.0), 294 + ParameterType::Float(0.0), 295 + ParameterType::Float(0.0), 296 + 297 + ParameterType::Float(0.0), 298 + ParameterType::Float(0.0), 299 + ParameterType::Float(0.0), 300 + ] 301 + }, 302 + OSCMessage { 303 + address: "/tracking/vrsystem/leftwrist/pose".into(), 304 + values: vec![ 305 + ParameterType::Float(0.0), 306 + ParameterType::Float(0.0), 307 + ParameterType::Float(0.0), 308 + 309 + ParameterType::Float(0.0), 310 + ParameterType::Float(0.0), 311 + ParameterType::Float(0.0), 312 + ] 313 + }, 314 + ] 315 + }
+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 //