this repo has no description

Compare changes

Choose any two refs to compare.

Changed files
+6758 -2170
.vscode
public
src
src-tauri
+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/arrow-right-solid-full.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path fill="#ffffff" d="M566.6 342.6C579.1 330.1 579.1 309.8 566.6 297.3L406.6 137.3C394.1 124.8 373.8 124.8 361.3 137.3C348.8 149.8 348.8 170.1 361.3 182.6L466.7 288L96 288C78.3 288 64 302.3 64 320C64 337.7 78.3 352 96 352L466.7 352L361.3 457.4C348.8 469.9 348.8 490.2 361.3 502.7C373.8 515.2 394.1 515.2 406.6 502.7L566.6 342.7z"/></svg>
+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>
+1
public/assets/icons/pen-to-square-regular-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="#cfcfcf" d="M505 122.9L517.1 135C526.5 144.4 526.5 159.6 517.1 168.9L488 198.1L441.9 152L471 122.9C480.4 113.5 495.6 113.5 504.9 122.9zM273.8 320.2L408 185.9L454.1 232L319.8 366.2C316.9 369.1 313.3 371.2 309.4 372.3L250.9 389L267.6 330.5C268.7 326.6 270.8 323 273.7 320.1zM437.1 89L239.8 286.2C231.1 294.9 224.8 305.6 221.5 317.3L192.9 417.3C190.5 425.7 192.8 434.7 199 440.9C205.2 447.1 214.2 449.4 222.6 447L322.6 418.4C334.4 415 345.1 408.7 353.7 400.1L551 202.9C579.1 174.8 579.1 129.2 551 101.1L538.9 89C510.8 60.9 465.2 60.9 437.1 89zM152 128C103.4 128 64 167.4 64 216L64 488C64 536.6 103.4 576 152 576L424 576C472.6 576 512 536.6 512 488L512 376C512 362.7 501.3 352 488 352C474.7 352 464 362.7 464 376L464 488C464 510.1 446.1 528 424 528L152 528C129.9 528 112 510.1 112 488L112 216C112 193.9 129.9 176 152 176L264 176C277.3 176 288 165.3 288 152C288 138.7 277.3 128 264 128L152 128z"/></svg>
+1
public/assets/icons/plus-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="#cfcfcf" d="M352 128C352 110.3 337.7 96 320 96C302.3 96 288 110.3 288 128L288 288L128 288C110.3 288 96 302.3 96 320C96 337.7 110.3 352 128 352L288 352L288 512C288 529.7 302.3 544 320 544C337.7 544 352 529.7 352 512L352 352L512 352C529.7 352 544 337.7 544 320C544 302.3 529.7 288 512 288L352 288L352 128z"/></svg>
+1
public/assets/icons/trash-can-solid-full.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path fill="#ffffff" d="M232.7 69.9C237.1 56.8 249.3 48 263.1 48L377 48C390.8 48 403 56.8 407.4 69.9L416 96L512 96C529.7 96 544 110.3 544 128C544 145.7 529.7 160 512 160L128 160C110.3 160 96 145.7 96 128C96 110.3 110.3 96 128 96L224 96L232.7 69.9zM128 208L512 208L512 512C512 547.3 483.3 576 448 576L192 576C156.7 576 128 547.3 128 512L128 208zM216 272C202.7 272 192 282.7 192 296L192 488C192 501.3 202.7 512 216 512C229.3 512 240 501.3 240 488L240 296C240 282.7 229.3 272 216 272zM320 272C306.7 272 296 282.7 296 296L296 488C296 501.3 306.7 512 320 512C333.3 512 344 501.3 344 488L344 296C344 282.7 333.3 272 320 272zM424 272C410.7 272 400 282.7 400 296L400 488C400 501.3 410.7 512 424 512C437.3 512 448 501.3 448 488L448 296C448 282.7 437.3 272 424 272z"/></svg>
+1
public/assets/icons/xmark-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="M183.1 137.4C170.6 124.9 150.3 124.9 137.8 137.4C125.3 149.9 125.3 170.2 137.8 182.7L275.2 320L137.9 457.4C125.4 469.9 125.4 490.2 137.9 502.7C150.4 515.2 170.7 515.2 183.2 502.7L320.5 365.3L457.9 502.6C470.4 515.1 490.7 515.1 503.2 502.6C515.7 490.1 515.7 469.8 503.2 457.3L365.8 320L503.1 182.6C515.6 170.1 515.6 149.8 503.1 137.3C490.6 124.8 470.3 124.8 457.8 137.3L320.5 274.7L183.1 137.4z"/></svg>
+11 -68
src/App.css
··· 1 - @font-face { 1 + @font-face{ 2 2 font-family: Rubik; 3 - src: url('/assets/fonts/Rubik-VariableFont_wght.ttf'); 4 - } 5 - 6 - * { 7 - box-sizing: border-box; 3 + src: url("/assets/fonts/Rubik-VariableFont_wght.ttf"); 8 4 } 9 5 10 6 body{ 11 - background: linear-gradient(-45deg, 12 - #12141a 0%, #12141a 10%, 13 - #22262e 10%, #22262e 20%, 14 - #272e44 20%, #272e44 22%, 15 - #1f2129 22% 16 - ); 7 + background: #1f2129; 17 8 background-attachment: fixed; 18 9 color: #fff; 19 10 font-family: Rubik, 'Courier New'; 20 11 margin: 0; 21 12 } 22 13 23 - h1, h2, h3, h4, h5, h6, p{ 24 - margin: 0; 25 - font-weight: 500; 26 - } 27 - 28 - div[app-carousel]{ 29 - position: fixed; 30 - top: 10px; 31 - left: 220px; 32 - width: calc(100vw - 230px); 33 - height: calc(100vh - 20px); 34 - overflow: hidden; 14 + * { 15 + box-sizing: border-box; 35 16 } 36 17 37 - div[app-page]{ 38 - width: calc(100vw - 230px); 39 - height: calc(100vh - 20px); 40 - overflow-y: auto; 41 - overflow-x: hidden; 18 + p, h1, h2, h3, h4, h5, h6{ 19 + margin: 0; 42 20 } 43 21 44 - div[app-button]{ 45 - display: inline-block; 46 - background: #2a3452; 47 - padding: 10px 25px; 48 - cursor: pointer; 49 - user-select: none; 50 - border-radius: 5px; 51 - transition: 0.25s; 52 - min-width: 100px; 53 - text-align: center; 54 - } 55 - 56 - div[app-button]:hover{ 57 - background: #151a29; 58 - } 59 - 60 - div[app-button-minimal]{ 61 - display: inline-block; 62 - background: #424242; 63 - padding: 10px 25px; 64 - cursor: pointer; 65 - user-select: none; 66 - border-radius: 5px; 67 - transition: 0.25s; 68 - min-width: 100px; 69 - text-align: center; 70 - opacity: 0.5; 71 - } 72 - 73 - div[app-button-minimal]:hover{ 74 - background: #525252; 75 - } 76 - 77 - div[app-col]{ 78 - display: flex; 79 - } 80 - 81 - div[app-col] > div{ 82 - width: 50%; 22 + canvas{ 23 + position: fixed; 24 + top: 0; 25 + left: 0; 83 26 }
+454 -21
src/App.tsx
··· 1 + import { createEffect, createSignal, onCleanup, onMount } from "solid-js"; 1 2 import "./App.css"; 3 + import { renderBackgroundGrid, renderContextMenu, renderNodes, renderNullTab, renderTempDrawing } from "./renderer"; 4 + import { lerp } from "./utils/lerp"; 5 + import { Node, NodeIO, NodeIOCanCast, NodeIOResolveAnyTypes } from "./structs/node"; 6 + import { isPointInRect, isPointInRectApplyOffset, screenToWorldSpace } from "./utils/interections"; 7 + import { ControlBar } from "./components/ControlBar"; 8 + import { CanvasContextMenu } from "./ContextMenu/Canvas"; 9 + import { NodeContextMenu } from "./ContextMenu/Node"; 10 + import { ContextMenu } from "./structs/ContextMenu"; 11 + import { NodeManager } from "./Mangers/NodeManager"; 12 + import { TabMenu } from "./components/TabMenu"; 13 + import { ConfirmationPopup } from "./components/ConfirmationPopup"; 2 14 3 - import { createEffect, createSignal, onCleanup, onMount } from "solid-js"; 15 + import * as keybinds from './keybinds'; 4 16 import { listen } from "@tauri-apps/api/event"; 5 17 6 - import { Sidebar } from "./Components/Sidebar"; 7 - import { Actions } from "./Components/Actions"; 8 - import { Relays } from "./Components/Relays"; 9 - import { animate } from "animejs"; 10 - import { Settings } from "./Components/Settings"; 11 - import { Debug } from "./Components/Debug"; 18 + // TODO: Only allow one node to input on non-flow inputs 12 19 13 20 let App = () => { 14 - let [ page, setPage ] = createSignal(0); 15 - let carousel!: HTMLDivElement; 21 + let [ selectedNodes, setSelectedNodes ] = createSignal<Node[]>([], { equals: false }); 22 + let [ mousePos, setMousePos ] = createSignal<[ number, number ]>([ 0, 0 ]); 23 + 24 + let canvas!: HTMLCanvasElement; 25 + let ctx: CanvasRenderingContext2D; 26 + 27 + let stopRender = false; 28 + 29 + let scale = 0.25; 30 + let targetScale = 1; 31 + 32 + let offset = [ 0, 0 ]; 33 + let offsetTarget = [ 0, 0 ]; 34 + 35 + let movingNode: Node | null = null; 36 + 37 + let isDrawing = false; 38 + let drawingFrom: NodeIO | null = null; 39 + let drawingTo: [ number, number ] = [ 0, 0 ]; 40 + 41 + let lockMovement = false; 42 + 43 + { 44 + let loadedScale = localStorage.getItem('scale'); 45 + if(loadedScale)targetScale = parseFloat(loadedScale); 46 + 47 + let loadedOffsetX = localStorage.getItem('offsetX'); 48 + if(loadedOffsetX)offsetTarget[0] = parseFloat(loadedOffsetX); 49 + 50 + let loadedOffsetY = localStorage.getItem('offsetY'); 51 + if(loadedOffsetY)offsetTarget[1] = parseFloat(loadedOffsetY); 52 + }; 53 + 54 + let screenMoved = false; 55 + 56 + let contextMenu: ContextMenu = { 57 + items: [], 58 + position: [ 0, 0 ], 59 + size: [ 0, 0 ], 60 + visible: false 61 + } 62 + 63 + createEffect(() => { 64 + let snodes = selectedNodes(); 65 + 66 + let anodes = NodeManager.Instance.GetNodes(); 67 + if(!anodes)return; 68 + 69 + for(let node of anodes)node.selected = false; 70 + for(let node of snodes)node.selected = true; 71 + }) 16 72 17 73 onMount(async () => { 74 + NodeManager.Instance.HookTabChange(() => setSelectedNodes([])); 18 75 76 + ctx = canvas.getContext('2d')!; 77 + 78 + canvas.width = window.innerWidth; 79 + canvas.height = window.innerHeight; 80 + ctx.translate(canvas.width / 2, canvas.height / 2); 81 + 82 + window.onresize = () => { 83 + canvas.width = window.innerWidth; 84 + canvas.height = window.innerHeight; 85 + 86 + ctx.translate(canvas.width / 2, canvas.height / 2); 87 + } 88 + 89 + canvas.onwheel = ( e ) => { 90 + targetScale += e.deltaY * -(Math.sqrt(targetScale) * 0.001); 91 + 92 + if(targetScale < 0.25)targetScale = 0.25 93 + else if(targetScale > 5)targetScale = 5; 94 + 95 + screenMoved = true; 96 + } 97 + 98 + canvas.oncontextmenu = ( e ) => { 99 + e.preventDefault(); 100 + 101 + let clickedNode: Node | null = null 102 + let nodes = NodeManager.Instance.GetNodes(); 103 + 104 + if(nodes){ 105 + nodes.map(node => { 106 + if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 107 + e.clientX, e.clientY, 108 + node.x, node.y, node.w, node.h 109 + )){ 110 + clickedNode = node; 111 + return; 112 + } 113 + }) 114 + } 115 + 116 + if(clickedNode){ 117 + contextMenu.items = NodeContextMenu(clickedNode, selectedNodes, setSelectedNodes); 118 + } else{ 119 + contextMenu.items = CanvasContextMenu; 120 + } 121 + 122 + contextMenu.position = [ e.clientX - 10 - canvas.width / 2, e.clientY - 10 - canvas.height / 2 ]; 123 + contextMenu.visible = true; 124 + } 125 + 126 + let isShiftClick = false; 127 + canvas.onmousedown = ( e ) => { 128 + isShiftClick = e.shiftKey; 129 + 130 + if( 131 + e.clientY < 60 || 132 + e.clientX < 220 || 133 + lockMovement 134 + )return; 135 + 136 + if(e.button !== 0){ 137 + contextMenu.visible = false; 138 + return; 139 + } 140 + 141 + if(contextMenu.visible){ 142 + let submenus: ContextMenu[] = []; 143 + contextMenu.items.map(x => x.menu ? submenus.push(x.menu): null); 144 + 145 + submenus.map(x => { 146 + if(!x.visible)return; 147 + if(isPointInRect(canvas, e.clientX, e.clientY, 148 + x.position[0], x.position[1], 149 + x.size[0], x.size[1] 150 + )){ 151 + let item = x.items.filter(x => x.hovered)[0]; 152 + if(item && item.clicked)item.clicked(e, canvas, { x: offset[0], y: offset[1], scale }); 153 + } 154 + }); 155 + 156 + if(isPointInRect(canvas, e.clientX, e.clientY, 157 + contextMenu.position[0], contextMenu.position[1], 158 + contextMenu.size[0], contextMenu.size[1] 159 + )){ 160 + let item = contextMenu.items.filter(x => x.hovered)[0]; 161 + if(item && item.clicked)item.clicked(e, canvas, { x: offset[0], y: offset[1], scale }); 162 + } 163 + } 164 + 165 + contextMenu.visible = false; 166 + 167 + let clickedNode: any = null; 168 + isDrawing = false; 169 + 170 + let clickedInput: any = null; 171 + let nodes = NodeManager.Instance.GetNodes(); 172 + 173 + if(nodes){ 174 + nodes.map(node => { 175 + if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 176 + e.clientX, e.clientY, 177 + node.x - 20, node.y, node.w + 40, node.h 178 + )){ 179 + node.outputs.map(( output, i ) => { 180 + if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 181 + e.clientX, e.clientY, 182 + node.x + (node.w - 10), 183 + node.y + 50 + (30 * i), 184 + 20, 20 185 + )){ 186 + output.index = i; 187 + 188 + drawingTo = [ 189 + node.x + (node.w - 10), 190 + node.y + 50 + (30 * i) 191 + ]; 192 + drawingFrom = output; 193 + 194 + isDrawing = true; 195 + return; 196 + } 197 + }) 198 + 199 + node.inputs.map(( input, i ) => { 200 + if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 201 + e.clientX, e.clientY, 202 + node.x - 10, 203 + node.y + 50 + (30 * i), 204 + 20, 20 205 + )){ 206 + clickedInput = input; 207 + } 208 + }) 209 + 210 + clickedNode = node; 211 + return; 212 + } 213 + }) 214 + } 215 + 216 + if(clickedInput){ 217 + let partner = clickedInput.connections.pop(); 218 + if(!partner)return; 219 + 220 + partner.connections = partner.connections.filter(( x: any ) => x !== clickedInput); 221 + 222 + isDrawing = true; 223 + isMouseDown = true; 224 + 225 + drawingFrom = partner; 226 + drawingTo = screenToWorldSpace(canvas, { x: offset[0], y: offset[1], scale }, e.clientX - 10 * scale, e.clientY - 10 * scale) as [ number, number ];; 227 + 228 + return; 229 + } 230 + 231 + movingNode = clickedNode; 232 + 233 + isMouseDown = true; 234 + mouseStartPos = [ e.clientX, e.clientY ]; 235 + mouseMovePos = [ e.clientX, e.clientY ]; 236 + } 237 + 238 + canvas.onmousemove = ( e ) => { 239 + setMousePos([ e.clientX, e.clientY ]); 240 + 241 + if(e.shiftKey && isMouseDown){ 242 + let nodes = NodeManager.Instance.GetNodes(); 243 + let hoveredNode: Node | null = null; 244 + 245 + if(nodes){ 246 + nodes.map(node => { 247 + if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 248 + e.clientX, e.clientY, 249 + node.x - 20, node.y, node.w + 40, node.h 250 + )){ 251 + hoveredNode = node; 252 + return; 253 + } 254 + }) 255 + } 256 + 257 + if(hoveredNode !== null){ 258 + let snodes = selectedNodes(); 259 + if(!snodes.find(x => x.id === hoveredNode!.id)){ 260 + snodes.push(hoveredNode); 261 + 262 + // @ts-ignore 263 + hoveredNode.x = Math.round(hoveredNode.x / 10) * 10; 264 + // @ts-ignore 265 + hoveredNode.y = Math.round(hoveredNode.y / 10) * 10; 266 + 267 + setSelectedNodes(snodes); 268 + } 269 + } 270 + 271 + return; 272 + } else if(isShiftClick)return; 273 + 274 + if(isMouseDown){ 275 + if(isDrawing){ 276 + drawingTo = screenToWorldSpace(canvas, { x: offset[0], y: offset[1], scale }, e.clientX - 10 * scale, e.clientY - 10 * scale) as [ number, number ]; 277 + } else if(movingNode){ 278 + let nodes = selectedNodes(); 279 + 280 + for(let node of nodes){ 281 + node.x = node.x - (mouseMovePos[0] - e.clientX) / scale; 282 + node.y = node.y - (mouseMovePos[1] - e.clientY) / scale; 283 + } 284 + 285 + mouseMovePos = [ e.clientX, e.clientY ]; 286 + NodeManager.Instance.UpdateConfig(); 287 + } else{ 288 + offsetTarget = [ offsetTarget[0] - (mouseMovePos[0] - e.clientX) / scale, offsetTarget[1] - (mouseMovePos[1] - e.clientY) / scale ]; 289 + mouseMovePos = [ e.clientX, e.clientY ]; 290 + 291 + screenMoved = true; 292 + } 293 + } 294 + 295 + // TODO: Fix this shit lmao please 296 + if(contextMenu.visible){ 297 + let submenus: ContextMenu[] = []; 298 + contextMenu.items.map(x => x.menu ? submenus.push(x.menu): null); 299 + 300 + submenus.map(x => { 301 + if(!x.visible)return; 302 + if(isPointInRect(canvas, e.clientX, e.clientY, 303 + x.position[0], x.position[1], 304 + x.size[0], x.size[1] 305 + )){ 306 + x.items.map((y, i) => { 307 + y.hovered = isPointInRect(canvas, e.clientX, e.clientY, 308 + x.position[0], x.position[1] + 10 + 25 * i, 309 + x.size[0], 25 310 + ) 311 + }); 312 + } 313 + }); 314 + 315 + if(isPointInRect(canvas, e.clientX, e.clientY, 316 + contextMenu.position[0], contextMenu.position[1], 317 + contextMenu.size[0], contextMenu.size[1] 318 + )){ 319 + contextMenu.items.map((x, i) => { 320 + x.hovered = isPointInRect(canvas, e.clientX, e.clientY, 321 + contextMenu.position[0], contextMenu.position[1] + 10 + 25 * i, 322 + contextMenu.size[0], 25 323 + ) 324 + 325 + if(x.menu)x.menu.visible = x.hovered; 326 + }); 327 + } 328 + } 329 + } 330 + 331 + canvas.onmouseup = ( e ) => { 332 + let nodes = NodeManager.Instance.GetNodes(); 333 + let clickedNode; 334 + 335 + if(nodes){ 336 + nodes.map(node => { 337 + if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 338 + e.clientX, e.clientY, 339 + node.x - 20, node.y, node.w + 40, node.h 340 + )){ 341 + clickedNode = node; 342 + 343 + node.inputs.map(( input, i ) => { 344 + if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale }, 345 + e.clientX, e.clientY, 346 + node.x - 10, 347 + node.y + 50 + (30 * i), 348 + 20, 20 349 + )){ 350 + if(isDrawing){ 351 + let fromType = NodeIOResolveAnyTypes(drawingFrom!); 352 + let toType = NodeIOResolveAnyTypes(input); 353 + 354 + if( 355 + drawingFrom!.connections.indexOf(input) === -1 && 356 + ( 357 + toType === null || 358 + NodeIOCanCast(fromType, toType) 359 + ) 360 + ){ 361 + drawingFrom!.connections.push(input); 362 + input.connections.push(drawingFrom!); 363 + 364 + NodeManager.Instance.UpdateConfig(); 365 + } 366 + } 367 + } 368 + }) 369 + } 370 + }) 371 + } 372 + 373 + let diffX = mouseStartPos[0] - e.clientX; 374 + let diffY = mouseStartPos[1] - e.clientY; 375 + 376 + let dist = Math.sqrt(diffX * diffX + diffY * diffY); 377 + 378 + if(dist < 10){ 379 + if(clickedNode){ 380 + if(e.shiftKey){ 381 + let snodes = selectedNodes(); 382 + if(snodes.indexOf(clickedNode) === -1)snodes.push(clickedNode); 383 + 384 + // @ts-ignore 385 + clickedNode.x = Math.round(clickedNode.x / 10) * 10; 386 + // @ts-ignore 387 + clickedNode.y = Math.round(clickedNode.y / 10) * 10; 388 + 389 + setSelectedNodes(snodes); 390 + } else{ 391 + // @ts-ignore 392 + clickedNode.x = Math.round(clickedNode.x / 10) * 10; 393 + // @ts-ignore 394 + clickedNode.y = Math.round(clickedNode.y / 10) * 10; 395 + 396 + setSelectedNodes([ clickedNode ]); 397 + } 398 + } else { 399 + setSelectedNodes([]); 400 + } 401 + } 402 + 403 + isDrawing = false; 404 + isMouseDown = false; 405 + } 406 + 407 + keybinds.load(canvas, mousePos, selectedNodes, setSelectedNodes); 408 + requestAnimationFrame(update); 409 + 410 + let unlisten_0 = await listen('hide-window', () => { 411 + stopRender = true; 412 + }) 413 + 414 + let unlisten_1 = await listen('show-window', () => { 415 + if(stopRender)window.location.reload(); 416 + }) 417 + 418 + onCleanup(() => { 419 + stopRender = true; 420 + window.clearInterval(interval); 421 + 422 + unlisten_0(); 423 + unlisten_1(); 424 + }); 19 425 }); 20 426 21 - createEffect(() => { 22 - let pagenum = page(); 23 - animate(carousel.children, { translateY: '-' + ( 100 * pagenum ) + '%', ease: 'outElastic(.1, .7)', duration: 500 }); 24 - }) 427 + let update = () => { 428 + if(stopRender)return; 429 + scale = lerp(scale, targetScale, 0.25); 430 + 431 + offset[0] = lerp(offset[0], offsetTarget[0], 0.5); 432 + offset[1] = lerp(offset[1], offsetTarget[1], 0.5); 433 + 434 + ctx.clearRect(canvas.width / -2, canvas.height / -2, canvas.width, canvas.height); 435 + 436 + let nodes = NodeManager.Instance.GetNodes(); 437 + 438 + renderBackgroundGrid(canvas, ctx, { x: offset[0], y: offset[1], scale }); 439 + 440 + if(nodes) 441 + renderNodes(canvas, ctx, nodes, { x: offset[0], y: offset[1], scale }); 442 + else 443 + renderNullTab(canvas, ctx); 444 + 445 + if(isDrawing)renderTempDrawing(canvas, ctx, drawingTo, drawingFrom!, { x: offset[0], y: offset[1], scale }); 446 + renderContextMenu(ctx, contextMenu); 447 + 448 + requestAnimationFrame(update); 449 + } 450 + 451 + let isMouseDown = false; 452 + let mouseStartPos = [ 0, 0 ]; 453 + let mouseMovePos = [ 0, 0 ]; 454 + 455 + let interval = setInterval(() => { 456 + if(screenMoved){ 457 + localStorage.setItem('scale', targetScale.toFixed(4)); 458 + localStorage.setItem('offsetX', offset[0].toFixed(4)); 459 + localStorage.setItem('offsetY', offset[1].toFixed(4)); 460 + } 461 + }, 1000); 25 462 26 463 return ( 27 464 <> 28 - <Sidebar setPage={setPage} /> 29 - 30 - <div app-carousel ref={carousel}> 31 - <Actions /> 32 - <Relays /> 33 - <Debug page={page} /> 34 - <Settings /> 35 - </div> 465 + <ConfirmationPopup /> 466 + <TabMenu /> 467 + <ControlBar node={selectedNodes} lockMovement={( lock ) => lockMovement = lock} /> 468 + <canvas ref={canvas}/> 36 469 </> 37 470 ); 38 471 }
src/Components/Actions.css

This is a binary file and will not be displayed.

-16
src/Components/Actions.tsx
··· 1 - import './Actions.css'; 2 - 3 - export let Actions = () => { 4 - return ( 5 - <div app-page> 6 - <div app-col> 7 - <div><h1>Actions</h1></div> 8 - <div app-button style={{ width: 'fit-content', "margin-left": '50%' }}>+</div> 9 - </div> 10 - 11 - <div> 12 - 13 - </div> 14 - </div> 15 - ) 16 - }
-8
src/Components/Debug.css
··· 1 - div[app-debug-el]{ 2 - padding: 10px; 3 - background: #272e44; 4 - margin: 10px; 5 - border-radius: 5px; 6 - box-shadow: #00ccff 0 0 10px; 7 - transition: 0.5s; 8 - }
-89
src/Components/Debug.tsx
··· 1 - import './Debug.css'; 2 - 3 - import { createEffect, onCleanup, onMount } from 'solid-js'; 4 - import { listen, UnlistenFn } from '@tauri-apps/api/event'; 5 - import { OSCMessage, OSCValue } from '../Structs/OSCMessage'; 6 - 7 - let formatValuesForDebug = ( values: OSCValue[] ): string => { 8 - let text = ''; 9 - 10 - for(let value of values){ 11 - if(value.Boolean !== undefined) 12 - text += ' Boolean: ' + value.Boolean; 13 - else if(value.Float !== undefined) 14 - text += ' Float: ' + value.Float.toFixed(6); 15 - else if(value.Int !== undefined) 16 - text += ' Int: ' + value.Int; 17 - else if(value.String !== undefined) 18 - text += ' String: ' + value.String; 19 - } 20 - 21 - return text.trimStart(); 22 - } 23 - 24 - export interface DebugProps{ 25 - page: () => number 26 - } 27 - 28 - export let Debug = ( props: DebugProps ) => { 29 - let debugContainer!: HTMLDivElement; 30 - 31 - let debugEls: any = {}; 32 - 33 - let isListening = false; 34 - let unlisten: UnlistenFn; 35 - 36 - let stopListening = () => { 37 - if(!isListening)return; 38 - isListening = false; 39 - 40 - unlisten(); 41 - } 42 - 43 - let startListening = async () => { 44 - if(isListening)return; 45 - isListening = true; 46 - 47 - unlisten = await listen<OSCMessage>('osc-message', ( ev ) => { 48 - let el = debugEls[ev.payload.address]; 49 - if(el){ 50 - el.style.boxShadow = '#00ccff 0 0 10px'; 51 - debugContainer.insertBefore(el, debugContainer.firstChild); 52 - 53 - el.innerHTML = `<div>${ ev.payload.address }</div><div>${ formatValuesForDebug(ev.payload.values) }</div>`; 54 - setTimeout(() => { el.style.boxShadow = '#00ccff 0 0 0px'; }) 55 - } else{ 56 - el = <div app-debug-el app-col><div>{ ev.payload.address }</div><div>{ formatValuesForDebug(ev.payload.values) }</div></div> as Node; 57 - 58 - el.style.boxShadow = '#00ccff 0 0 10px'; 59 - debugContainer.insertBefore(el, debugContainer.firstChild); 60 - 61 - setTimeout(() => { el.style.boxShadow = '#00ccff 0 0 0px'; }) 62 - debugEls[ev.payload.address] = el; 63 - } 64 - }) 65 - } 66 - 67 - onMount(() => { 68 - createEffect(() => { 69 - if(props.page() === 2) 70 - startListening(); 71 - else 72 - stopListening(); 73 - }); 74 - }); 75 - 76 - onCleanup(() => { 77 - stopListening(); 78 - }); 79 - 80 - return ( 81 - <div app-page> 82 - <h1>Debug</h1> 83 - 84 - <div ref={debugContainer}> 85 - 86 - </div> 87 - </div> 88 - ) 89 - }
src/Components/Relays.css

This is a binary file and will not be displayed.

-9
src/Components/Relays.tsx
··· 1 - import './Relays.css'; 2 - 3 - export let Relays = () => { 4 - return ( 5 - <div app-page> 6 - <h1>Relays</h1> 7 - </div> 8 - ) 9 - }
src/Components/Settings.css

This is a binary file and will not be displayed.

-9
src/Components/Settings.tsx
··· 1 - import './Settings.css'; 2 - 3 - export let Settings = () => { 4 - return ( 5 - <div app-page> 6 - <h1>Settings</h1> 7 - </div> 8 - ) 9 - }
-32
src/Components/Sidebar.css
··· 1 - div[app-sidebar]{ 2 - position: fixed; 3 - top: 10px; 4 - left: 10px; 5 - 6 - height: calc(100vh - 20px); 7 - width: 200px; 8 - padding: 0px; 9 - 10 - background: #272e44; 11 - border-radius: 5px; 12 - } 13 - 14 - div[app-sidebar-tab]{ 15 - padding: 10px; 16 - cursor: pointer; 17 - user-select: none; 18 - -webkit-user-select: none; 19 - transition: 0.1s; 20 - margin: 10px; 21 - border-radius: 5px; 22 - } 23 - 24 - div[app-sidebar-tab]:hover{ 25 - background: #5b6ca5; 26 - } 27 - 28 - div[app-sidebar-tab-dropped]{ 29 - position: absolute; 30 - width: calc(100% - 20px); 31 - bottom: 0px; 32 - }
-19
src/Components/Sidebar.tsx
··· 1 - import './Sidebar.css' 2 - 3 - export interface SidebarProps{ 4 - setPage: ( page: number ) => number 5 - } 6 - 7 - export let Sidebar = ( props: SidebarProps ) => { 8 - return ( 9 - <> 10 - <div app-sidebar> 11 - <div app-sidebar-tab onClick={() => props.setPage(0)}>Actions</div> 12 - <div app-sidebar-tab onClick={() => props.setPage(1)}>Relays</div> 13 - <div app-sidebar-tab onClick={() => props.setPage(2)}>Debug</div> 14 - 15 - <div app-sidebar-tab app-sidebar-tab-dropped onClick={() => props.setPage(3)}>Settings</div> 16 - </div> 17 - </> 18 - ) 19 - }
+43
src/ContextMenu/Canvas.tsx
··· 1 + import { PositionInfo } from "../renderer"; 2 + import { Node } from "../structs/node"; 3 + import { screenToWorldSpace } from "../utils/interections"; 4 + import { NodeManager } from "../Mangers/NodeManager"; 5 + import { ContextMenuItem } from "../structs/ContextMenu"; 6 + import { Nodes } from "../Nodes/Nodes"; 7 + 8 + export let CanvasContextMenu: ContextMenuItem[] = Nodes.map(( node ) => { 9 + if(node.isSingle){ 10 + return { 11 + text: node.name, 12 + clicked: async ( e: MouseEvent, canvas: HTMLCanvasElement, position: PositionInfo ) => { 13 + let pos = screenToWorldSpace(canvas, position, e.clientX, e.clientY); 14 + let id = await NodeManager.Instance.GetNewNodeId(); 15 + 16 + NodeManager.Instance.AddNode(new Node(pos, node, id)); 17 + }, 18 + hovered: false 19 + } 20 + } else{ 21 + return { 22 + text: node.name, 23 + menu: { 24 + items: node.items!.map(x => { 25 + return { 26 + text: x.name, 27 + clicked: async ( e: MouseEvent, canvas: HTMLCanvasElement, position: PositionInfo ) => { 28 + let pos = screenToWorldSpace(canvas, position, e.clientX, e.clientY); 29 + let id = await NodeManager.Instance.GetNewNodeId(); 30 + 31 + NodeManager.Instance.AddNode(new Node(pos, x, id)); 32 + }, 33 + hovered: false 34 + } 35 + }), 36 + position: [ 0, 0 ], 37 + size: [ 0, 0 ], 38 + visible: true 39 + }, 40 + hovered: false 41 + } 42 + } 43 + });
+38
src/ContextMenu/Node.tsx
··· 1 + import { Accessor, Setter } from "solid-js"; 2 + import { NodeManager } from "../Mangers/NodeManager"; 3 + import { PositionInfo } from "../renderer"; 4 + import { Node } from "../structs/node"; 5 + 6 + export let NodeContextMenu = ( clickedNode: Node, selectedNode: Accessor<Node[]>, setSelectedNode: Setter<Node[]> ) => [ 7 + { 8 + text: "Delete Node", 9 + clicked: ( _e: MouseEvent, _canvas: HTMLCanvasElement, _position: PositionInfo ) => { 10 + clickedNode!.inputs.map(input => { 11 + input.connections.map(partner => { 12 + partner.connections = partner.connections.filter(x => x != input); 13 + }) 14 + }) 15 + 16 + clickedNode!.outputs.map(output => { 17 + output.connections.map(partner => { 18 + partner.connections = partner.connections.filter(x => x != output); 19 + }) 20 + }) 21 + 22 + let selected = selectedNode(); 23 + for (let i = 0; i < selected.length; i++) { 24 + let node = selected[i]; 25 + 26 + if(node.id === clickedNode.id){ 27 + selected.splice(i, 1); 28 + setSelectedNode(selected); 29 + 30 + break; 31 + } 32 + } 33 + 34 + NodeManager.Instance.RemoveNode(clickedNode!) 35 + }, 36 + hovered: false 37 + } 38 + ]
+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 + }
+423
src/Mangers/NodeManager.tsx
··· 1 + import { invoke } from "@tauri-apps/api/core"; 2 + import { Node } from "../structs/node"; 3 + import { Tab } from "../structs/Tab"; 4 + import { createSignal } from "solid-js"; 5 + import { listen } from "@tauri-apps/api/event"; 6 + import { getVersion } from "@tauri-apps/api/app"; 7 + import { NodesByID } from "../Nodes/Nodes"; 8 + import { save } from "@tauri-apps/plugin-dialog"; 9 + import { ConfirmationManager } from "./ConfirmationManager"; 10 + import { platform } from "@tauri-apps/plugin-os"; 11 + 12 + export interface TabHashMap { 13 + [details: string] : Tab; 14 + } 15 + 16 + export class NodeManager{ 17 + public static Instance: NodeManager; 18 + 19 + private _selectedTab: string | null = null; 20 + private _tabs: TabHashMap = {}; 21 + 22 + private _nodes: Node[] = []; 23 + 24 + constructor(){ 25 + NodeManager.Instance = this; 26 + 27 + setInterval(() => { 28 + let tabs = Object.values(this._tabs).filter(x => x.needSync); 29 + for(let tab of tabs){ 30 + invoke('sync_tab', { 31 + graph: this._generateTabGraph(tab.id)[0], 32 + id: tab.id, 33 + name: tab.name, 34 + location: tab.saveLocation, 35 + saveState: tab.needsSave() 36 + }); 37 + 38 + tab.needSync = false; 39 + } 40 + }, 1000); 41 + 42 + listen('load_new_tab', ( ev: any ) => { 43 + this._loadFromConfig(ev.payload.path, null, ev.payload.graph); 44 + }); 45 + 46 + invoke('load_previous_tabs').then(async ( tabs: any ) => { 47 + let version = await getVersion(); 48 + 49 + for(let tab of Object.entries<any>(tabs)){ 50 + let loaded_tab = await this._loadFromConfig(tab[1][2], tab[0], JSON.stringify({ 51 + tab_name: tab[1][1], 52 + version, 53 + graph: tab[1][0] 54 + })); 55 + 56 + if(loaded_tab) 57 + loaded_tab.setNeedsSave(tab[1][3]); 58 + }; 59 + 60 + this.UpdateConfig(); 61 + }); 62 + 63 + listen('prompt_to_close', async _ => { 64 + let tabs = Object.values(this._tabs); 65 + let tabsNeedingSaving = tabs.filter(x => x.needsSave()); 66 + 67 + for(let tab of tabsNeedingSaving){ 68 + await new Promise<void>(res => { 69 + ConfirmationManager.Instance.ShowConfirmation( 70 + `Discard Changes in ${tab.name}?`, 71 + 'If you close this tab without saving you will lose all changes.', 72 + [ 73 + { 74 + text: 'Save', 75 + callback: async () => { 76 + await this.SaveTab(tab); 77 + res(); 78 + } 79 + }, 80 + { 81 + text: 'Don\'t Save', 82 + callback: async () => { 83 + res(); 84 + } 85 + } 86 + ] 87 + ) 88 + }); 89 + } 90 + 91 + invoke('close_app'); 92 + }); 93 + } 94 + 95 + 96 + private _tabUpdateHook: ( tabs: TabHashMap ) => void = () => {}; 97 + private _tabChangeHook: () => void = () => {}; 98 + 99 + public CurrentTab(): Tab | null{ 100 + if(!this._selectedTab)return null 101 + return this._tabs[this._selectedTab] || null; 102 + } 103 + 104 + public async AddTab( name: string, id: string | null = null ): Promise<Tab>{ 105 + let [ selected, setSelected ] = createSignal(false); 106 + let [ needsSave, setNeedsSave ] = createSignal(false); 107 + 108 + let tab: Tab = { 109 + name: name, 110 + id: id || await NodeManager.Instance.GetNewNodeId(), 111 + nodes: [], 112 + saveLocation: null, 113 + 114 + selected, 115 + setSelected, 116 + 117 + needsSave, 118 + setNeedsSave, 119 + 120 + needSync: false 121 + }; 122 + 123 + this._tabs[tab.id] = tab; 124 + 125 + this.SelectTab(tab.id); 126 + this._tabUpdateHook(this._tabs); 127 + 128 + return tab; 129 + } 130 + 131 + public CloseTab( id: string ){ 132 + let tab = this._tabs[id]; 133 + 134 + let closeCB = () => { 135 + if(this._selectedTab === id){ 136 + let tabs = Object.values(this._tabs); 137 + 138 + if(tabs.length === 1){ 139 + this.SelectTab(null); 140 + } else{ 141 + let index = tabs.indexOf(tab); 142 + let nextTab = tabs[index + 1]; 143 + 144 + if(nextTab) 145 + this.SelectTab(nextTab.id); 146 + else 147 + this.SelectTab(tabs[0].id); 148 + } 149 + } 150 + 151 + invoke('discard_tab', { id: id }); 152 + 153 + delete this._tabs[id]; 154 + this._tabUpdateHook(this._tabs); 155 + } 156 + 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 + } 180 + } 181 + 182 + public RenameTab( id: string, name: string ){ 183 + let tab = this._tabs[id]; 184 + if(!tab)return; 185 + 186 + tab.name = name; 187 + this._tabUpdateHook(this._tabs); 188 + } 189 + 190 + public SelectTab( id: string | null ){ 191 + if(this._selectedTab && this._tabs[this._selectedTab]){ 192 + let tab = this._tabs[this._selectedTab]; 193 + 194 + tab.setSelected(false); 195 + tab.nodes = this._nodes; 196 + } 197 + 198 + this._selectedTab = id; 199 + this._tabChangeHook(); 200 + 201 + if(this._selectedTab){ 202 + let tab = this._tabs[this._selectedTab]; 203 + if(!tab){ 204 + this._selectedTab = null; 205 + return this._nodes = []; 206 + } 207 + 208 + tab.setSelected(true); 209 + this._nodes = tab.nodes; 210 + } else{ 211 + this._nodes = []; 212 + } 213 + } 214 + 215 + public async SaveTab( tab: Tab, ignoreSaveLocation: boolean = false ){ 216 + let path = 217 + tab.saveLocation && !ignoreSaveLocation ? 218 + tab.saveLocation : 219 + await save({ defaultPath: tab.name + '.macro', filters: [ { name: 'Macro Files', extensions: [ 'macro' ] } ] }); 220 + 221 + if(!path)throw new Error("Cannot save"); 222 + 223 + tab.saveLocation = path; 224 + tab.setNeedsSave(false); 225 + 226 + this._saveConfigToDisk(path, tab.id); 227 + } 228 + 229 + public HookTabUpdate( cb: ( tabs: TabHashMap ) => void ){ 230 + this._tabUpdateHook = cb; 231 + } 232 + 233 + public HookTabChange( cb: () => void ){ 234 + this._tabChangeHook = cb; 235 + } 236 + 237 + 238 + public AddNode( node: Node ){ 239 + if(!this._selectedTab)return; 240 + 241 + this._nodes.push(node); 242 + this.UpdateConfig(); 243 + } 244 + 245 + public RemoveNode( node: Node ){ 246 + if(!this._selectedTab)return; 247 + 248 + this._nodes = this._nodes.filter(x => x !== node); 249 + this.UpdateConfig(); 250 + } 251 + 252 + public GetNodes(): Node[] | null{ 253 + if(this._selectedTab) 254 + return this._nodes; 255 + else 256 + return null; 257 + } 258 + 259 + public async GetNewNodeId(){ 260 + let encoder = new TextEncoder(); 261 + let data = encoder.encode(Date.now().toString() + Math.random().toString()); 262 + let hash = await window.crypto.subtle.digest("SHA-256", data); // Probably should get a better ID implementation 263 + 264 + return btoa(String.fromCharCode(...new Uint8Array(hash))); 265 + } 266 + 267 + 268 + public UpdateConfig( needsSave = true ){ 269 + if(!this._selectedTab)return; 270 + let tab = this._tabs[this._selectedTab]; 271 + if(!tab)return; 272 + 273 + tab.nodes = this._nodes; 274 + tab.needSync = true; 275 + 276 + if(needsSave)tab.setNeedsSave(true); 277 + } 278 + 279 + private async _loadFromConfig( path: string | null, id: string | null, config: string ){ 280 + let json = JSON.parse(config); 281 + 282 + if( 283 + !json.tab_name || 284 + !json.version || 285 + !json.graph 286 + )return; 287 + 288 + let tab = await this.AddTab(json.tab_name, id); 289 + tab.needSync = false; 290 + tab.saveLocation = path; 291 + 292 + this._nodes = []; 293 + 294 + let graph = json.graph; 295 + 296 + // Populate nodes 297 + for (let i = 0; i < graph.length; i++) { 298 + let node = graph[i]; 299 + 300 + let nod = new Node(node.pos, NodesByID[node.typeId], node.id); 301 + 302 + nod.statics = node.statics; 303 + await nod.onStaticsUpdate(nod); 304 + 305 + this._nodes.push(nod); 306 + } 307 + 308 + // Populate node inputs 309 + for (let i = 0; i < graph.length; i++) { 310 + let configNode = graph[i]; 311 + let outputParentNode = this._nodes[i]; 312 + 313 + for (let j = 0; j < configNode.outputs.length; j++) { 314 + let output = configNode.outputs[j]; 315 + 316 + for (let k = 0; k < output.connections.length; k++) { 317 + let input = output.connections[k]; 318 + let node = this._nodes.find(x => x.id === input.node)!; 319 + 320 + if(!node)continue; 321 + 322 + let realInput = node.inputs.find(x => x.index === input.index); 323 + let realOutput = outputParentNode.outputs[j]; 324 + 325 + if(realInput){ 326 + realInput.connections.push(realOutput); 327 + realOutput.connections.push(realInput); 328 + } else{ 329 + let realInput = { 330 + name: input.name, 331 + type: input.type, 332 + parent: node, 333 + connections: [ realOutput ], 334 + index: input.index 335 + }; 336 + 337 + node.inputs.push(realInput); 338 + realOutput.connections.push(realInput); 339 + } 340 + } 341 + } 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; 351 + } 352 + 353 + private _generateTabGraph( tabId: string | null ): [ any, Tab | null ]{ 354 + // Convert it into a structure we can actually save... 355 + 356 + if(!tabId)return [ null, null ]; 357 + let tab = this._tabs[tabId]; 358 + if(!tab)return [ null, null ]; 359 + 360 + let nodesToSave = []; 361 + 362 + for (let i = 0; i < tab.nodes.length; i++) { 363 + let node = tab.nodes[i]; 364 + 365 + let nodeOutputs = []; 366 + let nodeInputs = []; 367 + 368 + for (let j = 0; j < node.outputs.length; j++) { 369 + let output = node.outputs[j]; 370 + 371 + nodeOutputs.push({ 372 + name: output.name, 373 + type: output.type, 374 + connections: output.connections.map(x => { return { 375 + name: x.name, 376 + node: x.parent.id, 377 + index: x.index, 378 + type: x.type 379 + }}) 380 + }) 381 + } 382 + 383 + for (let j = 0; j < node.inputs.length; j++) { 384 + let input = node.inputs[j]; 385 + 386 + nodeInputs.push({ 387 + name: input.name, 388 + type: input.type, 389 + connections: input.connections.map(x => { return { 390 + name: x.name, 391 + node: x.parent.id, 392 + index: x.index, 393 + type: x.type 394 + }}) 395 + }) 396 + } 397 + 398 + nodesToSave.push({ 399 + name: node.name, 400 + id: node.id, 401 + typeId: node.typeId, 402 + pos: [ node.x, node.y ], 403 + outputs: nodeOutputs, 404 + inputs: nodeInputs, 405 + statics: node.statics 406 + }) 407 + } 408 + 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({ 417 + tab_name: tab.name, 418 + version: await getVersion(), 419 + platform: platform(), 420 + graph: nodesToSave 421 + }), path }); 422 + } 423 + }
+31
src/Nodes/Conditional/IfEqual.tsx
··· 1 + import { Node, NodeType } from "../../structs/node"; 2 + import { NodeDefinition } from "../Nodes"; 3 + 4 + export let NodeConditionalIfEqual: NodeDefinition = { 5 + os: 'any', 6 + 7 + isSingle: true, 8 + name: 'If Equal', 9 + typeId: 'ifequal', 10 + 11 + w: 220, 12 + 13 + statics: [{ 14 + type: NodeType.Label, 15 + name: 'If Equal', 16 + value: null 17 + }], 18 + 19 + inputs: [ 20 + { name: "Flow", type: NodeType.Flow }, 21 + { name: "Input 1", type: NodeType.AnyTypeA }, 22 + { name: "Input 2", type: NodeType.AnyTypeA }, 23 + ], 24 + 25 + outputs: [ 26 + { name: "Equal", type: NodeType.Flow }, 27 + { name: "Not Equal", type: NodeType.Flow }, 28 + ], 29 + 30 + onStaticsUpdate: async ( _node: Node ) => {} 31 + }
+30
src/Nodes/Conditional/IfFalse.tsx
··· 1 + import { Node, NodeType } from "../../structs/node"; 2 + import { NodeDefinition } from "../Nodes"; 3 + 4 + export let NodeConditionalIfFalse: NodeDefinition = { 5 + os: 'any', 6 + 7 + isSingle: true, 8 + name: 'If False', 9 + typeId: 'iffalse', 10 + 11 + w: 220, 12 + 13 + statics: [{ 14 + type: NodeType.Label, 15 + name: 'If False', 16 + value: null 17 + }], 18 + 19 + inputs: [ 20 + { name: "Flow", type: NodeType.Flow }, 21 + { name: "Input", type: NodeType.Boolean }, 22 + ], 23 + 24 + outputs: [ 25 + { name: "Is False", type: NodeType.Flow }, 26 + { name: "Not False", type: NodeType.Flow }, 27 + ], 28 + 29 + onStaticsUpdate: async ( _node: Node ) => {} 30 + }
+30
src/Nodes/Conditional/IfTrue.tsx
··· 1 + import { Node, NodeType } from "../../structs/node"; 2 + import { NodeDefinition } from "../Nodes"; 3 + 4 + export let NodeConditionalIfTrue: NodeDefinition = { 5 + os: 'any', 6 + 7 + isSingle: true, 8 + name: 'If True', 9 + typeId: 'iftrue', 10 + 11 + w: 220, 12 + 13 + statics: [{ 14 + type: NodeType.Label, 15 + name: 'If True', 16 + value: null 17 + }], 18 + 19 + inputs: [ 20 + { name: "Flow", type: NodeType.Flow }, 21 + { name: "Input", type: NodeType.Boolean }, 22 + ], 23 + 24 + outputs: [ 25 + { name: "Is True", type: NodeType.Flow }, 26 + { name: "Not True", type: NodeType.Flow }, 27 + ], 28 + 29 + onStaticsUpdate: async ( _node: Node ) => { } 30 + }
+17
src/Nodes/Conditional.tsx
··· 1 + import { NodeDefinition } from "./Nodes"; 2 + 3 + import { NodeConditionalIfEqual } from "./Conditional/IfEqual"; 4 + import { NodeConditionalIfTrue } from "./Conditional/IfTrue"; 5 + import { NodeConditionalIfFalse } from "./Conditional/IfFalse"; 6 + 7 + export let NodeConditional: NodeDefinition = { 8 + os: 'any', 9 + 10 + isSingle: false, 11 + name: 'Conditional', 12 + items: [ 13 + NodeConditionalIfEqual, 14 + NodeConditionalIfTrue, 15 + NodeConditionalIfFalse 16 + ] 17 + }
+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 + };
+69
src/Nodes/Nodes.tsx
··· 1 + import { Node, NodeStatic, NodeType } from "../structs/node"; 2 + import { platform } from '@tauri-apps/plugin-os'; 3 + 4 + import { NodeConditional } from "./Conditional"; 5 + import { NodeDebug } from "./Debug"; 6 + import { NodeOSCActions } from "./OSCActions"; 7 + import { NodeOSCTrigger } from "./OSCTrigger"; 8 + import { NodePressKey } from "./PressKey"; 9 + import { NodeStatics } from "./Statics"; 10 + import { NodeShellCommand } from "./Shell"; 11 + 12 + export interface NodeDefinition{ 13 + os: string, 14 + isSingle: boolean, 15 + name: string, 16 + typeId?: string, 17 + onStaticsUpdate?: ( node: Node ) => Promise<void>, 18 + // build?: ( pos: [ number, number ], onStaticsUpdate: ( node: Node ) => void ) => Promise<Node>, 19 + w?: number, 20 + statics?: NodeStatic[], 21 + inputs?: { name: string, type: NodeType }[], 22 + outputs?: { name: string, type: NodeType }[], 23 + 24 + items?: NodeDefinition[] 25 + } 26 + 27 + export interface NodeDefinitionHashMap { 28 + [details: string] : NodeDefinition; 29 + } 30 + 31 + // TODO: (Node Additions) Pressing keyboard keys (like to do linux, but has extra steps) 32 + // TODO: (Node Additions) Getting media state from os 33 + // TODO: (Node Additions) Sending custom OSC messages 34 + // TODO: (Node Additions) Sending HTTP requests? 35 + // TODO: (Node Additions) Voicemeeter integrations (win only) 36 + // TODO: (Node Additions) Voicemod integrations (win only) 37 + // TODO: (Node Additions) Executing shell commands? (probably need some kinda popup warning when these are imported about dangerous usage) 38 + 39 + export let Nodes: NodeDefinition[] = []; 40 + let nodes = [ 41 + NodeOSCTrigger, 42 + NodeConditional, 43 + NodeStatics, 44 + NodeOSCActions, 45 + NodeDebug, 46 + NodePressKey, 47 + NodeShellCommand 48 + ] 49 + 50 + let os = platform(); 51 + 52 + for (let i = 0; i < nodes.length; i++) { 53 + let node = nodes[i]; 54 + if(node.os === 'any' || node.os === os)Nodes.push(node); 55 + } 56 + 57 + export let NodesByID: NodeDefinitionHashMap = {} 58 + 59 + Nodes.forEach(node => { 60 + if(node.isSingle){ 61 + NodesByID[node.typeId!] = node; 62 + } else{ 63 + node.items!.forEach(node => { 64 + NodesByID[node.typeId!] = node; 65 + }) 66 + } 67 + }) 68 + 69 + console.log(NodesByID);
+25
src/Nodes/OSCActions/Send Chatbox.tsx
··· 1 + import { Node, NodeType } from "../../structs/node"; 2 + import { NodeDefinition } from "../Nodes"; 3 + 4 + export let NodeOSCActionsSendChatbox: NodeDefinition = { 5 + os: 'any', 6 + 7 + isSingle: true, 8 + name: 'Send Chatbox', 9 + typeId: 'oscsendchatbox', 10 + 11 + w: 200, 12 + 13 + statics: [{ 14 + type: NodeType.Label, 15 + name: 'Send Chatbox', 16 + value: null 17 + }], 18 + 19 + inputs: [ 20 + { name: "Flow", type: NodeType.Flow }, 21 + { name: "Value", type: NodeType.String } 22 + ], 23 + 24 + onStaticsUpdate: async ( _node: Node ) => {} 25 + }
+12
src/Nodes/OSCActions.tsx
··· 1 + import { NodeDefinition } from "./Nodes"; 2 + import { NodeOSCActionsSendChatbox } from "./OSCActions/Send Chatbox"; 3 + 4 + export let NodeOSCActions: NodeDefinition = { 5 + os: 'any', 6 + 7 + isSingle: false, 8 + name: 'OSC Actions', 9 + items: [ 10 + NodeOSCActionsSendChatbox 11 + ] 12 + }
+106
src/Nodes/OSCTrigger.tsx
··· 1 + import { invoke } from "@tauri-apps/api/core"; 2 + import { Node, NodeType } from "../structs/node"; 3 + import { OSCMessage } from "../structs/OscMessage"; 4 + import { NodeManager } from "../Mangers/NodeManager"; 5 + import { NodeDefinition } from "./Nodes"; 6 + 7 + export let NodeOSCTrigger: NodeDefinition = { 8 + os: 'any', 9 + 10 + isSingle: true, 11 + name: 'OSC Trigger', 12 + typeId: 'osctrigger', 13 + 14 + w: 200, 15 + 16 + statics: [ 17 + { 18 + name: "OSC Trigger", 19 + type: NodeType.OSCAddress, 20 + value: null 21 + }, 22 + { 23 + name: "Parameter List", 24 + type: NodeType.ParameterList, 25 + value: [] 26 + } 27 + ], 28 + 29 + onStaticsUpdate: async ( node: Node ) => { 30 + let address = node.statics[0].value; 31 + let parameters = node.statics[1].value; 32 + 33 + if(address){ 34 + let addresses = await invoke<OSCMessage[]>('get_addresses'); 35 + let msgDat = addresses.find(x => x.address == address); 36 + 37 + if(msgDat){ 38 + parameters = msgDat.values.map(x => { return { type: x.key, desc: '' }}); 39 + node.statics[1].value = parameters; 40 + } 41 + } 42 + 43 + let tempOutputs = []; 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){ 94 + node.outputs.map(output => { 95 + output.connections.map(partner => { 96 + partner.connections = partner.connections.filter(x => x != output); 97 + }) 98 + }) 99 + 100 + node.outputs = tempOutputs; 101 + node.updateSize(); 102 + } 103 + 104 + NodeManager.Instance.UpdateConfig(); 105 + } 106 + };
+29
src/Nodes/PressKey.tsx
··· 1 + import { Node, NodeType } from "../structs/node"; 2 + import { NodeDefinition } from "./Nodes"; 3 + 4 + export let NodePressKey: NodeDefinition = { 5 + os: 'windows', 6 + 7 + isSingle: true, 8 + name: 'Press Key', 9 + typeId: 'presskey', 10 + 11 + w: 200, 12 + 13 + statics: [ 14 + { 15 + name: "Key", 16 + type: NodeType.String, 17 + value: "" 18 + } 19 + ], 20 + 21 + inputs: [ 22 + { 23 + name: "Flow", 24 + type: NodeType.Flow, 25 + } 26 + ], 27 + 28 + onStaticsUpdate: async ( _node: Node ) => {} 29 + };
+38
src/Nodes/Shell.tsx
··· 1 + import { Node, NodeType } from "../structs/node"; 2 + import { NodeDefinition } from "./Nodes"; 3 + 4 + export let NodeShellCommand: NodeDefinition = { 5 + os: 'any', 6 + 7 + isSingle: true, 8 + name: 'Shell Command', 9 + typeId: 'shellcommand', 10 + 11 + w: 200, 12 + 13 + statics: [], 14 + 15 + inputs: [ 16 + { 17 + name: "Flow", 18 + type: NodeType.Flow, 19 + }, 20 + { 21 + name: "Command", 22 + type: NodeType.String, 23 + }, 24 + ], 25 + 26 + outputs: [ 27 + { 28 + name: "Flow", 29 + type: NodeType.Flow, 30 + }, 31 + { 32 + name: "Output", 33 + type: NodeType.String, 34 + }, 35 + ], 36 + 37 + onStaticsUpdate: async ( _node: Node ) => {} 38 + };
+22
src/Nodes/Statics/Float.tsx
··· 1 + import { Node, NodeType } from "../../structs/node"; 2 + import { NodeDefinition } from "../Nodes"; 3 + 4 + export let NodeStaticsFloat: NodeDefinition = { 5 + os: 'any', 6 + 7 + isSingle: true, 8 + name: 'Float', 9 + typeId: 'staticfloat', 10 + 11 + w: 200, 12 + 13 + statics: [{ 14 + type: NodeType.Float, 15 + name: 'Value', 16 + value: 0.0 17 + }], 18 + 19 + outputs: [{ name: "Float", type: NodeType.Float }], 20 + 21 + onStaticsUpdate: async ( _node: Node ) => {} 22 + }
+22
src/Nodes/Statics/Int.tsx
··· 1 + import { Node, NodeType } from "../../structs/node"; 2 + import { NodeDefinition } from "../Nodes"; 3 + 4 + export let NodeStaticsInt: NodeDefinition = { 5 + os: 'any', 6 + 7 + isSingle: true, 8 + name: 'Int', 9 + typeId: 'staticint', 10 + 11 + w: 200, 12 + 13 + statics: [{ 14 + type: NodeType.Int, 15 + name: 'Value', 16 + value: 0 17 + }], 18 + 19 + outputs: [{ name: "Int", type: NodeType.Int }], 20 + 21 + onStaticsUpdate: async ( _node: Node ) => {} 22 + }
+22
src/Nodes/Statics/String.tsx
··· 1 + import { Node, NodeType } from "../../structs/node"; 2 + import { NodeDefinition } from "../Nodes"; 3 + 4 + export let NodeStaticsString: NodeDefinition = { 5 + os: 'any', 6 + 7 + isSingle: true, 8 + name: 'String', 9 + typeId: 'staticstring', 10 + 11 + w: 200, 12 + 13 + statics: [{ 14 + type: NodeType.String, 15 + name: 'Value', 16 + value: 'Hello World!' 17 + }], 18 + 19 + outputs: [{ name: "String", type: NodeType.String }], 20 + 21 + onStaticsUpdate: async ( _node: Node ) => {} 22 + }
+17
src/Nodes/Statics.tsx
··· 1 + import { NodeDefinition } from "./Nodes"; 2 + import { NodeStaticsFloat } from "./Statics/Float"; 3 + 4 + import { NodeStaticsInt } from "./Statics/Int"; 5 + import { NodeStaticsString } from "./Statics/String"; 6 + 7 + export let NodeStatics: NodeDefinition = { 8 + os: 'any', 9 + 10 + isSingle: false, 11 + name: 'Statics', 12 + items: [ 13 + NodeStaticsInt, 14 + NodeStaticsString, 15 + NodeStaticsFloat 16 + ] 17 + }
-11
src/Structs/OSCMessage.ts
··· 1 - export interface OSCMessage{ 2 - address: string, 3 - values: OSCValue[] 4 - } 5 - 6 - export interface OSCValue{ 7 - Float?: number, 8 - Int?: number, 9 - Boolean?: boolean, 10 - String?: string 11 - }
+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 + }
+29
src/components/ControlBar.css
··· 1 + .control-bar{ 2 + position: fixed; 3 + top: 20px; 4 + left: 20px; 5 + height: 40px; 6 + z-index: 100; 7 + width: calc(100vw - 40px); 8 + background: #272e44; 9 + border-radius: 20px; 10 + display: flex; 11 + padding: 10px 20px; 12 + align-items: center; 13 + } 14 + 15 + .button{ 16 + padding: 5px 10px; 17 + margin: 0 10px; 18 + background: #445077; 19 + border-radius: 5px; 20 + transition: 0.1s; 21 + cursor: pointer; 22 + user-select: none; 23 + -webkit-user-select: none; 24 + width: fit-content; 25 + } 26 + 27 + .button:hover{ 28 + background: #363f5e; 29 + }
+133
src/components/ControlBar.tsx
··· 1 + import './ControlBar.css'; 2 + 3 + import { Accessor, createSignal, For, Match, Show, Switch } from 'solid-js'; 4 + import { Node, NodeType } from '../structs/node'; 5 + import { TextInput } from './TextInput'; 6 + import { invoke } from '@tauri-apps/api/core'; 7 + import { OSCMessage } from '../structs/OscMessage'; 8 + import { ParameterList } from './ParameterList'; 9 + import { NodeManager } from '../Mangers/NodeManager'; 10 + 11 + export interface ControlBarProps{ 12 + node: Accessor<Node[]>, 13 + lockMovement: ( lock: boolean ) => void 14 + } 15 + 16 + export let ControlBar = ( props: ControlBarProps ) => { 17 + return ( 18 + <div class="control-bar"> 19 + <For each={props.node()[0]?.statics}> 20 + { ( item ) => { 21 + let [ popupOpen, setPopupOpen ] = createSignal(false); 22 + 23 + return ( 24 + <div> 25 + <Switch> 26 + <Match when={item.type == NodeType.String}> 27 + { item.name } 28 + <div style={{ display: 'inline-block', 'margin-left': '10px' }}> 29 + <input 30 + type="text" 31 + placeholder='Enter Value...' 32 + value={item.value || ''} 33 + onChange={( el ) => { 34 + let value = el.target.value; 35 + let node = props.node()[0]!; 36 + 37 + item.value = value; 38 + node.onStaticsUpdate(node); 39 + 40 + NodeManager.Instance.UpdateConfig(); 41 + }} /> 42 + </div> 43 + </Match> 44 + <Match when={item.type == NodeType.Int}> 45 + { item.name } 46 + <div style={{ display: 'inline-block', 'margin-left': '10px' }}> 47 + <input 48 + type="number" 49 + placeholder='Enter Value...' 50 + value={item.value !== undefined ? item.value : ''} 51 + onChange={( el ) => { 52 + let value = el.target.value; 53 + let node = props.node()[0]!; 54 + 55 + item.value = parseInt(value); 56 + node.onStaticsUpdate(node); 57 + 58 + NodeManager.Instance.UpdateConfig(); 59 + }} /> 60 + </div> 61 + </Match> 62 + <Match when={item.type == NodeType.Float}> 63 + { item.name } 64 + <div style={{ display: 'inline-block', 'margin-left': '10px' }}> 65 + <input 66 + type="number" 67 + placeholder='Enter Value...' 68 + value={item.value !== undefined ? item.value : ''} 69 + onChange={( el ) => { 70 + let value = el.target.value; 71 + let node = props.node()[0]!; 72 + 73 + item.value = parseFloat(value); 74 + node.onStaticsUpdate(node); 75 + 76 + NodeManager.Instance.UpdateConfig(); 77 + }} /> 78 + </div> 79 + </Match> 80 + <Match when={item.type == NodeType.OSCAddress}> 81 + { item.name } 82 + <div style={{ display: 'inline-block', 'margin-left': '10px', width: '300px' }}> 83 + <TextInput 84 + placeholder='Enter OSC Address...' 85 + value={item.value || ''} 86 + requestSuggestions={async ( text: string ): Promise<string[]> => { 87 + let addresses = await invoke<OSCMessage[]>('get_addresses'); 88 + return addresses.map(x => x.address).filter(x => x.toLowerCase().includes(text.toLowerCase())); 89 + }} 90 + change={( text ) => { 91 + let node = props.node()[0]!; 92 + 93 + item.value = text; 94 + node.onStaticsUpdate(node); 95 + 96 + NodeManager.Instance.UpdateConfig(); 97 + }} /> 98 + </div> 99 + </Match> 100 + <Match when={item.type == NodeType.ParameterList}> 101 + <div class="button" onClick={() => { 102 + let popup = !popupOpen(); 103 + 104 + props.lockMovement(popup); 105 + setPopupOpen(popup); 106 + }}> 107 + { item.name } 108 + </div> 109 + <Show when={popupOpen()}> 110 + <ParameterList 111 + setPopupOpen={( open: boolean ) => { 112 + setPopupOpen(open); 113 + props.lockMovement(open); 114 + }} 115 + value={item.value} 116 + changed={( value ) => { 117 + let node = props.node()[0]!; 118 + 119 + item.value = value; 120 + node.onStaticsUpdate(node); 121 + 122 + NodeManager.Instance.UpdateConfig(); 123 + }} /> 124 + </Show> 125 + </Match> 126 + </Switch> 127 + </div> 128 + ) 129 + }} 130 + </For> 131 + </div> 132 + ) 133 + }
+85
src/components/ParameterList.css
··· 1 + .parameter-list{ 2 + position: fixed; 3 + z-index: 100; 4 + top: 0; 5 + left: 0; 6 + width: 100vw; 7 + height: 100vh; 8 + background: rgba(0, 0, 0, 0.75); 9 + } 10 + 11 + .parameter-list-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 + .parameter-list-close{ 24 + width: 25px; 25 + height: 43px; 26 + display: flex; 27 + justify-content: center; 28 + align-items: center; 29 + } 30 + 31 + .parameter-list-header{ 32 + width: 100%; 33 + height: 50px; 34 + } 35 + 36 + .parameter-list-content{ 37 + width: 100%; 38 + height: calc(100% - 50px); 39 + overflow-x: hidden; 40 + overflow-y: auto; 41 + } 42 + 43 + .parameter-list-button-dropdown{ 44 + position: fixed; 45 + padding: 5px 10px; 46 + margin: 0 10px; 47 + background: #445077; 48 + border-radius: 5px; 49 + transition: 0.1s; 50 + cursor: pointer; 51 + user-select: none; 52 + transform: translate(0, 5px); 53 + -webkit-user-select: none; 54 + } 55 + 56 + .parameter-list-button-dropdown > div{ 57 + transition: 0.1s; 58 + } 59 + 60 + .parameter-list-button-dropdown > div:hover{ 61 + color: #aaa; 62 + } 63 + 64 + .parameter-list-parameter{ 65 + display: inline-block; 66 + padding: 5px 10px; 67 + margin: 5px 0px 5px 10px; 68 + background: #445077; 69 + border-radius: 5px; 70 + transition: 0.1s; 71 + cursor: pointer; 72 + user-select: none; 73 + -webkit-user-select: none; 74 + } 75 + 76 + .parameter-list-parameter:hover{ 77 + background: #363f5e; 78 + } 79 + 80 + .parameter-list-parameter-delete{ 81 + padding: 0px 5px; 82 + display: flex; 83 + justify-content: center; 84 + align-items: center; 85 + }
+74
src/components/ParameterList.tsx
··· 1 + import { createSignal, For, Show } from 'solid-js'; 2 + import './ParameterList.css'; 3 + 4 + export interface ParameterListProps{ 5 + setPopupOpen: ( open: boolean ) => void 6 + value: { type: string, desc: string }[], 7 + changed: ( value: { type: string, desc: string }[] ) => void 8 + } 9 + 10 + export let ParameterList = ( props: ParameterListProps ) => { 11 + let [ parameters, setParameters ] = createSignal<{ type: string, desc: string }[]>(props.value, { equals: false }); 12 + let [ addParametersOpen, setAddParametersOpen ] = createSignal(false); 13 + 14 + return ( 15 + <div class="parameter-list"> 16 + <div class="parameter-list-inner"> 17 + <div class="parameter-list-header"> 18 + <h1 style={{ float: 'left' }}>Parameter List</h1> 19 + <div style={{ float: 'right' }} class="parameter-list-close"> 20 + <div style={{ background: 'red', width: '25px', height: '25px', cursor: 'pointer' }} onClick={() => props.setPopupOpen(false)}></div> 21 + </div> 22 + </div> 23 + <div class="parameter-list-content"> 24 + <For each={parameters()}> 25 + { ( i, index ) => <div style={{ display: 'flex' }}> 26 + <div class="parameter-list-parameter">{ i.desc === "" ? i.type : i.desc + ` ${i.type}` }</div> 27 + <div class="parameter-list-parameter parameter-list-parameter-delete" onClick={() => { 28 + let params = parameters(); 29 + params.splice(index(), 1); 30 + 31 + setParameters(params); 32 + props.changed(params); 33 + }}> 34 + <img src="/assets/icons/trash-can-solid-full.svg" width="20" /> 35 + </div> 36 + </div>} 37 + </For> 38 + <div class="button" onClick={() => { setAddParametersOpen(!addParametersOpen()) }}>Add Parameter + </div> 39 + <Show when={addParametersOpen()}> 40 + <div class="parameter-list-button-dropdown"> 41 + <div onClick={() => { 42 + setAddParametersOpen(false); 43 + 44 + let params = parameters(); 45 + params.push({ type: 'Float', desc: '' }); 46 + 47 + setParameters(params); 48 + props.changed(params); 49 + }}>Float Parameter</div> 50 + <div onClick={() => { 51 + setAddParametersOpen(false); 52 + 53 + let params = parameters(); 54 + params.push({ type: 'Int', desc: '' }); 55 + 56 + setParameters(params); 57 + props.changed(params); 58 + }}>Integer Parameter</div> 59 + <div onClick={() => { 60 + setAddParametersOpen(false); 61 + 62 + let params = parameters(); 63 + params.push({ type: 'Boolean', desc: '' }); 64 + 65 + setParameters(params); 66 + props.changed(params); 67 + }}>Boolean Parameter</div> 68 + </div> 69 + </Show> 70 + </div> 71 + </div> 72 + </div> 73 + ) 74 + }
+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 + }
+127
src/components/TabMenu.css
··· 1 + .tab-menu{ 2 + position: fixed; 3 + top: 70px; 4 + left: 20px; 5 + width: 200px; 6 + z-index: 100; 7 + height: calc(100vh - 100px); 8 + background: #272e44; 9 + border-radius: 20px; 10 + padding: 5px; 11 + overflow-x: hidden; 12 + overflow-y: auto; 13 + } 14 + 15 + .tab-container{ 16 + height: calc(100% - 35px); 17 + overflow: auto; 18 + mask-image: linear-gradient(to bottom, #000 90%, #0000); 19 + padding-bottom: 25px; 20 + } 21 + 22 + .tab{ 23 + border-radius: 10px; 24 + padding: 8px 10px; 25 + background: #fff0; 26 + margin: 5px; 27 + font-size: 14px; 28 + transition: 0.5s; 29 + user-select: none; 30 + -webkit-user-select: none; 31 + display: flex; 32 + color: #cfcfcf; 33 + } 34 + 35 + .tab:hover{ 36 + background: #fff1; 37 + } 38 + 39 + .tab-selected{ 40 + border-radius: 10px; 41 + padding: 8px 10px; 42 + margin: 5px; 43 + font-size: 14px; 44 + transition: 0.5s; 45 + user-select: none; 46 + -webkit-user-select: none; 47 + display: flex; 48 + color: #cfcfcf; 49 + background: #fff4; 50 + } 51 + 52 + .tab-selected > .tab-close{ 53 + opacity: 1; 54 + } 55 + 56 + .tab:hover > .tab-close{ 57 + opacity: 1; 58 + } 59 + 60 + .tab-meta{ 61 + width: calc(100% - 40px); 62 + transform: translateY(1px); 63 + display: flex; 64 + align-items: center; 65 + } 66 + 67 + .tab-meta-input{ 68 + color: #cfcfcf; 69 + font-size: 14px; 70 + width: 120px; 71 + background: none; 72 + outline: none; 73 + border: none; 74 + transform: translateY(-1px); 75 + } 76 + 77 + .tab-close{ 78 + opacity: 0; 79 + width: 20px; 80 + height: 20px; 81 + display: flex; 82 + align-items: center; 83 + justify-content: center; 84 + border-radius: 5px; 85 + } 86 + 87 + .tab-close:hover{ 88 + background: #fff3; 89 + } 90 + 91 + .tab-icon{ 92 + width: 20px; 93 + height: 20px; 94 + display: flex; 95 + align-items: center; 96 + justify-content: left; 97 + } 98 + 99 + .tab-new-dropdown{ 100 + position: absolute; 101 + width: 180px; 102 + transform: translate(-10px, 35px); 103 + border-radius: 10px; 104 + background: #fff1; 105 + } 106 + 107 + .tab-icon-bar{ 108 + height: 30px; 109 + margin: 0 5px; 110 + display: flex; 111 + justify-content: left; 112 + align-items: center; 113 + } 114 + 115 + .tab-icon-bar img{ 116 + padding: 3px; 117 + border-radius: 5px; 118 + transition: 0.1s; 119 + background: transparent; 120 + cursor: pointer; 121 + user-select: none; 122 + -webkit-user-select: none; 123 + } 124 + 125 + .tab-icon-bar img:hover{ 126 + background: #fff2; 127 + }
+96
src/components/TabMenu.tsx
··· 1 + import './TabMenu.css'; 2 + 3 + import { createSignal, For, onMount, Show } from 'solid-js'; 4 + import { NodeManager } from '../Mangers/NodeManager'; 5 + import { Tab } from '../structs/Tab'; 6 + import { SettingsMenu } from './SettingsMenu'; 7 + import { openUrl } from '@tauri-apps/plugin-opener'; 8 + 9 + export let TabMenu = () => { 10 + let [ tabImportOpen, setTabImportOpen ] = createSignal(false); 11 + let [ tabs, setTabs ] = createSignal<Tab[]>([], { equals: false }); 12 + 13 + let [ settingsOpen, setSettingsOpen ] = createSignal(false); 14 + 15 + let closeTabImportMenu = () => { 16 + window.removeEventListener('click', closeTabImportMenu); 17 + setTabImportOpen(false); 18 + } 19 + 20 + onMount(() => { 21 + NodeManager.Instance.HookTabUpdate(setTabs); 22 + }); 23 + 24 + return ( 25 + <> 26 + <Show when={settingsOpen()}> 27 + <SettingsMenu close={() => setSettingsOpen(false)} /> 28 + </Show> 29 + 30 + <div class="tab-menu"> 31 + <div class="tab-container"> 32 + <For each={Object.values(tabs())}> 33 + { 34 + tab => 35 + <div class={ tab.selected() ? 'tab-selected ' : 'tab' } onClick={() => { 36 + NodeManager.Instance.SelectTab(tab.id); 37 + }}> 38 + <div class="tab-icon" onClick={async () => { 39 + if(tab.selected()){ 40 + NodeManager.Instance.SaveTab(tab); 41 + } 42 + }}> 43 + <Show when={tab.selected() && tab.needsSave()} fallback={ 44 + <img src="/assets/icons/pen-to-square-regular-full.svg" width="15" /> 45 + }> 46 + <img src="/assets/icons/floppy-disk-solid-full.svg" width="15" /> 47 + </Show> 48 + 49 + </div> 50 + <div class="tab-meta" onDblClick={( e ) => { 51 + let input = <input class="tab-meta-input" value={ e.target.innerHTML } /> as HTMLInputElement; 52 + 53 + e.target.innerHTML = ''; 54 + e.target.appendChild(input); 55 + 56 + input.select(); 57 + input.onchange = () => { 58 + NodeManager.Instance.RenameTab(tab.id, input.value); 59 + e.target.innerHTML = input.value; 60 + } 61 + }}>{ tab.name }</div> 62 + <div class="tab-close" onClick={() => { 63 + setTimeout(() => { 64 + NodeManager.Instance.CloseTab(tab.id); 65 + }, 50) 66 + }}><img src="/assets/icons/xmark-solid-full.svg" width="12" /></div> 67 + </div> 68 + } 69 + </For> 70 + 71 + <div class="tab" onClick={() => { 72 + NodeManager.Instance.AddTab("Untitled"); 73 + }} onContextMenu={( e ) => { 74 + e.preventDefault(); 75 + setTabImportOpen(true); 76 + 77 + window.addEventListener('click', closeTabImportMenu); 78 + }}> 79 + <div class="tab-new-dropdown" style={{ display: tabImportOpen() ? 'block' : 'none' }}> 80 + <div class="tab">Import from file</div> 81 + <div class="tab">Import from URL</div> 82 + </div> 83 + <div class="tab-icon"><img src="/assets/icons/plus-solid-full.svg" width="15" /></div> 84 + <div class="tab-meta">New Tab</div> 85 + </div> 86 + </div> 87 + 88 + <div class="tab-icon-bar"> 89 + <img src="/assets/icons/gear-solid-full.svg" width="25" onClick={() => setSettingsOpen(true)} /> 90 + <div style={{ width: 'calc(100% - 50px)' }}></div> 91 + <img src="/assets/icons/circle-info-solid-full.svg" width="25" onClick={() => openUrl('https://github.com/phaze-the-dumb/VRCMacros/wiki')} /> 92 + </div> 93 + </div> 94 + </> 95 + ) 96 + }
+49
src/components/TextInput.css
··· 1 + input[type="text"]{ 2 + outline: none; 3 + background: none; 4 + border: none; 5 + border-bottom: 2px solid #525252; 6 + font-size: 15px; 7 + font-family: Rubik, 'Courier New'; 8 + color: #fff; 9 + width: 400px; 10 + } 11 + 12 + input[type="number"]{ 13 + outline: none; 14 + background: none; 15 + border: none; 16 + border-bottom: 2px solid #525252; 17 + font-size: 15px; 18 + font-family: Rubik, 'Courier New'; 19 + color: #fff; 20 + width: 400px; 21 + } 22 + 23 + div[input-dropdown]{ 24 + position: absolute; 25 + width: fit-content; 26 + 27 + margin-top: 5px; 28 + padding: 10px; 29 + float: left; 30 + border-radius: 5px; 31 + 32 + max-height: 300px; 33 + overflow-y: auto; 34 + 35 + background: #525252; 36 + z-index: 50; 37 + } 38 + 39 + div[input-dropdown] > div{ 40 + transition: 0.25s; 41 + } 42 + 43 + div[input-dropdown] > div:hover{ 44 + color: #aaa; 45 + } 46 + 47 + .suggestion-selected{ 48 + color: #aaa; 49 + }
+110
src/components/TextInput.tsx
··· 1 + import './TextInput.css'; 2 + 3 + import { createSignal, For, Show } from "solid-js" 4 + 5 + export interface TextInputProps{ 6 + placeholder: string, 7 + value?: string, 8 + requestSuggestions?: ( text: string ) => Promise<string[]>, 9 + change?: ( text: string ) => void 10 + } 11 + 12 + export let TextInput = ( props: TextInputProps ) => { 13 + let [ suggestionsOpen, setSuggestionsOpen ] = createSignal(false); 14 + let [ suggestions, setSuggestions ] = createSignal<string[]>([]) 15 + 16 + let input!: HTMLInputElement; 17 + 18 + let suggestionsContainer!: HTMLDivElement; 19 + let suggestionsIndex = 0; 20 + 21 + let onInput = async () => { 22 + let s = null; 23 + 24 + if(props.requestSuggestions){ 25 + s = await props.requestSuggestions(input.value); 26 + 27 + if(s != suggestions()){ 28 + setSuggestions(s); 29 + 30 + let open = s !== null && s.length > 0 && input.value.length > 0; 31 + 32 + setSuggestionsOpen(open); 33 + if(open)changeSelection(() => { suggestionsIndex = 0; }); 34 + } 35 + } 36 + } 37 + 38 + let onKeyDown = ( ev: KeyboardEvent ) => { 39 + switch(ev.key){ 40 + case 'ArrowDown': 41 + changeSelection(() => { 42 + suggestionsIndex++; 43 + if(suggestionsIndex >= suggestionsContainer.children.length)suggestionsIndex = suggestionsContainer.children.length - 1; 44 + }); 45 + break; 46 + case 'ArrowUp': 47 + changeSelection(() => { 48 + suggestionsIndex--; 49 + if(suggestionsIndex < 0)suggestionsIndex = 0; 50 + }); 51 + break; 52 + case 'Enter': 53 + let currentDiv = suggestionsContainer.children[suggestionsIndex]; 54 + if(currentDiv)input.value = currentDiv.innerHTML; 55 + 56 + props.change ? props.change(input.value) : null 57 + setSuggestionsOpen(false); 58 + break; 59 + } 60 + } 61 + 62 + let changeSelection = ( cb: () => void ) => { 63 + for(let child of suggestionsContainer.children) 64 + child.classList.remove('suggestion-selected'); 65 + 66 + cb(); 67 + 68 + let height = suggestionsIndex * 19; 69 + suggestionsContainer.scrollTo(0, height - 150); 70 + 71 + let currentDiv = suggestionsContainer.children[suggestionsIndex]; 72 + if(currentDiv)currentDiv.classList.add('suggestion-selected'); 73 + } 74 + 75 + return ( 76 + <> 77 + <div style={{ width: '100%' }}> 78 + <input 79 + style={{ width: '100%' }} 80 + type="text" 81 + placeholder={ props.placeholder } 82 + value={ props.value || "" } 83 + onChange={() => props.change ? props.change(input.value) : null} 84 + onInput={onInput} 85 + onKeyDown={onKeyDown} 86 + onFocusOut={() => setTimeout(() => { 87 + setSuggestionsOpen(false); 88 + suggestionsIndex = -1; 89 + }, 100)} 90 + ref={input} /> 91 + 92 + <Show when={suggestionsOpen()}> 93 + <div input-dropdown ref={suggestionsContainer}> 94 + <For each={suggestions()}> 95 + { item => <div onClick={( el ) => { 96 + let thisEl = el.target; 97 + 98 + input.value = thisEl.innerHTML; 99 + setSuggestionsOpen(false); 100 + 101 + props.change ? props.change(input.value) : null 102 + suggestionsIndex = -1; 103 + }}>{ item }</div> } 104 + </For> 105 + </div> 106 + </Show> 107 + </div> 108 + </> 109 + ) 110 + }
+7 -1
src/index.tsx
··· 2 2 import { render } from "solid-js/web"; 3 3 import App from "./App"; 4 4 5 - render(() => <App />, document.getElementById("root") as HTMLElement); 5 + import { NodeManager } from "./Mangers/NodeManager"; 6 + import { ConfirmationManager } from "./Mangers/ConfirmationManager"; 7 + 8 + new NodeManager(); 9 + new ConfirmationManager(); 10 + 11 + render(() => <App />, document.getElementById("root") as HTMLElement);
+94
src/keybinds.ts
··· 1 + import { Accessor, Setter } from "solid-js"; 2 + import { NodeManager } from "./Mangers/NodeManager"; 3 + import { Node } from "./structs/node"; 4 + import { readText, writeText } from "@tauri-apps/plugin-clipboard-manager"; 5 + import { decodeNodeList, encodeNodeList } from "./utils/clipboard"; 6 + 7 + let isKeyDown: any = {}; 8 + 9 + export let load = ( canvas: HTMLCanvasElement, mousePos: Accessor<[ number, number ]>, selectedNode: Accessor<Node[]>, setSelectedNode: Setter<Node[]> ) => { 10 + // TODO: Add undo / redo -ing 11 + 12 + canvas.onkeydown = async ( e ) => { 13 + switch(e.key){ 14 + case 'Delete': 15 + let nodes = selectedNode(); 16 + for(let node of nodes){ 17 + node.inputs.map(input => { 18 + input.connections.map(partner => { 19 + partner.connections = partner.connections.filter(x => x != input); 20 + }) 21 + }) 22 + 23 + node.outputs.map(output => { 24 + output.connections.map(partner => { 25 + partner.connections = partner.connections.filter(x => x != output); 26 + }) 27 + }) 28 + 29 + NodeManager.Instance.RemoveNode(node); 30 + } 31 + 32 + setSelectedNode([]); 33 + break; 34 + } 35 + } 36 + 37 + window.onkeydown = async ( e ) => { 38 + isKeyDown[e.key] = true; 39 + 40 + switch(e.key){ 41 + case 's': 42 + if(e.ctrlKey){ 43 + let currentTab = NodeManager.Instance.CurrentTab(); 44 + if(!currentTab)return; 45 + 46 + // Save 47 + NodeManager.Instance.SaveTab(currentTab); 48 + } 49 + break; 50 + case 'S': 51 + if(e.ctrlKey){ 52 + let currentTab = NodeManager.Instance.CurrentTab(); 53 + if(!currentTab)return; 54 + 55 + // Save 56 + NodeManager.Instance.SaveTab(currentTab, true); 57 + } 58 + break; 59 + case 'c': 60 + if(e.ctrlKey){ 61 + let nodes = selectedNode(); 62 + await writeText(encodeNodeList(nodes, mousePos())); 63 + } 64 + break; 65 + case 'v': 66 + if(e.ctrlKey){ 67 + let text = await readText(); 68 + 69 + let nodes = await decodeNodeList(text, mousePos()); 70 + if(!nodes)return; 71 + 72 + for(let node of nodes) 73 + NodeManager.Instance.AddNode(node); 74 + 75 + setSelectedNode(nodes); 76 + } 77 + break; 78 + case 'z': 79 + if(e.ctrlKey){ 80 + console.log('undo'); 81 + } 82 + break; 83 + case 'y': 84 + if(e.ctrlKey){ 85 + console.log('redo'); 86 + } 87 + break; 88 + } 89 + } 90 + 91 + window.onkeyup = ( e ) => { 92 + isKeyDown[e.key] = false; 93 + } 94 + }
+295
src/renderer.ts
··· 1 + import { ContextMenu } from "./structs/ContextMenu"; 2 + import { Node, NodeIO, NodeIOLinkColours } from "./structs/node"; 3 + import { lerp } from "./utils/lerp"; 4 + 5 + export interface PositionInfo{ 6 + x: number, 7 + y: number, 8 + scale: number 9 + } 10 + 11 + const GRID_SIZE = 50; 12 + 13 + export let renderBackgroundGrid = ( 14 + canvas: HTMLCanvasElement, 15 + ctx: CanvasRenderingContext2D, 16 + position: PositionInfo 17 + ) => { 18 + let offsetX = position.x % 50; 19 + let offsetY = position.y % 50; 20 + 21 + let gridAmountX = canvas.width / (GRID_SIZE * position.scale); 22 + let gridAmountY = canvas.height / (GRID_SIZE * position.scale); 23 + 24 + ctx.fillStyle = '#fff1'; 25 + 26 + for (let x = 0; x < gridAmountX / 2; x++) { 27 + for (let y = 0; y < gridAmountY / 2; y++) { 28 + ctx.fillRect( 29 + ((x * GRID_SIZE) + offsetX) * position.scale, 30 + ((y * GRID_SIZE) + offsetY) * position.scale, 31 + 5 * position.scale, 5 * position.scale); 32 + 33 + ctx.fillRect( 34 + (((x + 1) * GRID_SIZE) - offsetX) * -position.scale, 35 + ((y * GRID_SIZE) + offsetY) * position.scale, 36 + 5 * position.scale, 5 * position.scale); 37 + 38 + ctx.fillRect( 39 + ((x * GRID_SIZE) + offsetX) * position.scale, 40 + (((y + 1) * GRID_SIZE) - offsetY) * -position.scale, 41 + 5 * position.scale, 5 * position.scale); 42 + 43 + ctx.fillRect( 44 + (((x + 1) * GRID_SIZE) - offsetX) * -position.scale, 45 + (((y + 1) * GRID_SIZE) - offsetY) * -position.scale, 46 + 5 * position.scale, 5 * position.scale); 47 + } 48 + } 49 + } 50 + 51 + export let renderNodes = ( 52 + canvas: HTMLCanvasElement, 53 + ctx: CanvasRenderingContext2D, 54 + nodes: Node[], 55 + position: PositionInfo 56 + ) => { 57 + let startX = canvas.width / -2; 58 + let startY = canvas.height / -2; 59 + 60 + ctx.textBaseline = 'top'; 61 + 62 + nodes.map(node => { 63 + let nodeX = Math.round(node.x / 10) * 10; 64 + let nodeY = Math.round(node.y / 10) * 10; 65 + 66 + ctx.fillStyle = '#343742ff'; 67 + ctx.strokeStyle = node.selected ? '#004696ff' : '#fff0'; 68 + ctx.lineWidth = 5 * position.scale; 69 + 70 + // Draw Node Box 71 + drawRoundedRect(ctx, 72 + (nodeX + startX + position.x) * position.scale, 73 + (nodeY + startY + position.y) * position.scale, 74 + node.w * position.scale, 75 + node.h * position.scale, 76 + 10 * position.scale); 77 + 78 + ctx.shadowColor = '#0005'; 79 + ctx.shadowBlur = 10; 80 + 81 + ctx.stroke(); 82 + ctx.fill(); 83 + 84 + ctx.shadowBlur = 0; 85 + 86 + // Draw Node Name 87 + ctx.fillStyle = '#fff'; 88 + ctx.font = (25 * position.scale) + 'px Rubik'; 89 + ctx.textAlign = 'center'; 90 + 91 + ctx.fillText(node.name, 92 + (nodeX + (node.w * 0.5) + startX + position.x) * position.scale, 93 + (nodeY + 10 + startY + position.y) * position.scale 94 + ); 95 + 96 + // Draw Inputs 97 + ctx.font = (15 * position.scale) + 'px Rubik'; 98 + ctx.textAlign = 'left'; 99 + 100 + node.inputs.map(( input, i ) => { 101 + ctx.fillStyle = NodeIOLinkColours(input); 102 + 103 + ctx.beginPath(); 104 + ctx.arc( 105 + (nodeX - 10 + startX + 10 + position.x) * position.scale, 106 + (nodeY + 50 + (30 * i) + startY + 10 + position.y) * position.scale, 107 + 7 * position.scale, 108 + 0, 109 + Math.PI * 2, 110 + ); 111 + ctx.fill(); 112 + 113 + ctx.fillText(input.name, 114 + (nodeX + 15 + startX + position.x) * position.scale, 115 + (nodeY + 53 + (30 * i) + startY + position.y) * position.scale, 116 + ) 117 + }) 118 + 119 + // Draw Outputs 120 + ctx.textAlign = 'right'; 121 + 122 + node.outputs.map(( output, i ) => { 123 + ctx.fillStyle = NodeIOLinkColours(output); 124 + 125 + ctx.beginPath(); 126 + ctx.arc( 127 + (nodeX + (node.w - 10) + startX + 10 + position.x) * position.scale, 128 + (nodeY + 50 + (30 * i) + startY + 10 + position.y) * position.scale, 129 + 7 * position.scale, 130 + 0, 131 + Math.PI * 2, 132 + ); 133 + ctx.fill(); 134 + 135 + ctx.fillText(output.name, 136 + (nodeX + (node.w - 15) + startX + position.x) * position.scale, 137 + (nodeY + 53 + (30 * i) + startY + position.y) * position.scale, 138 + ) 139 + }) 140 + }) 141 + 142 + nodes.map(node => { 143 + let nodeX = Math.round(node.x / 10) * 10; 144 + let nodeY = Math.round(node.y / 10) * 10; 145 + 146 + node.outputs.map(( output, i ) => { 147 + output.connections.map(partner => { 148 + let x0 = (nodeX + (node.w - 10) + 10 + startX + position.x) * position.scale; 149 + let y0 = (nodeY + 50 + (30 * i) + 10 + startY + position.y) * position.scale; 150 + let x1 = ((Math.round(partner.parent.x / 10) * 10) + startX + position.x) * position.scale; 151 + let y1 = ((Math.round(partner.parent.y / 10) * 10) + 60 + (30 * partner.index) + startY + position.y) * position.scale; 152 + 153 + let colours = NodeIOLinkColours(output, partner); 154 + let grad = ctx.createLinearGradient(x0, y0, x1, y1); 155 + 156 + grad.addColorStop(0, colours[0]); 157 + grad.addColorStop(1, colours[1]); 158 + 159 + ctx.strokeStyle = grad; 160 + ctx.lineWidth = 3 * position.scale; 161 + 162 + drawCurve(ctx, x0, y0, x1, y1); 163 + ctx.stroke(); 164 + }) 165 + }) 166 + }) 167 + } 168 + 169 + export let renderContextMenu = ( 170 + ctx: CanvasRenderingContext2D, 171 + contextMenu: ContextMenu 172 + ) => { 173 + if(contextMenu.visible){ 174 + ctx.font = '20px Rubik'; 175 + ctx.textBaseline = 'top'; 176 + ctx.textAlign = 'left'; 177 + 178 + let widestItem = 0; 179 + contextMenu.items.map(x => { 180 + let width = ctx.measureText(x.text).width; 181 + if(widestItem < width)widestItem = width; 182 + }); 183 + 184 + contextMenu.size = [ widestItem + 20, 25 * contextMenu.items.length + 20 ] 185 + 186 + drawRoundedRect(ctx, contextMenu.position[0], contextMenu.position[1], contextMenu.size[0], contextMenu.size[1], 10); 187 + ctx.fillStyle = '#444'; 188 + ctx.fill(); 189 + 190 + let submenuToRender: any = null; 191 + 192 + contextMenu.items.map((x, i) => { 193 + ctx.fillStyle = x.hovered ? '#aaa' : '#fff'; 194 + ctx.fillText(x.text, contextMenu.position[0] + 10, contextMenu.position[1] + 10 + 25 * i); 195 + 196 + if(x.hovered && x.menu){ 197 + submenuToRender = x.menu; 198 + submenuToRender.position = [ contextMenu.position[0] + contextMenu.size[0] + 5, contextMenu.position[1] + 25 * i ]; 199 + } 200 + }); 201 + 202 + if(submenuToRender){ 203 + renderContextMenu(ctx, submenuToRender); 204 + } 205 + } 206 + } 207 + 208 + export let renderTempDrawing = ( 209 + canvas: HTMLCanvasElement, 210 + ctx: CanvasRenderingContext2D, 211 + drawingTo: [ number, number ], 212 + drawingFrom: NodeIO, 213 + position: PositionInfo 214 + ) => { 215 + let startX = canvas.width / -2; 216 + let startY = canvas.height / -2; 217 + 218 + // DEBUG STUFF 219 + // ctx.fillStyle = '#f00'; 220 + 221 + // ctx.fillRect( 222 + // (drawingTo[0] + 10 + startX + position.x) * position.scale, 223 + // (drawingTo[1] + 10 + startY + position.y) * position.scale, 224 + // 10, 10 225 + // ); 226 + 227 + // ctx.fillRect( 228 + // (drawingFrom.parent.x + (drawingFrom.parent.w - 10) + 10 + startX + position.x) * position.scale, 229 + // (drawingFrom.parent.y + 50 + (30 * drawingFrom.index) + 10 + startY + position.y) * position.scale, 230 + // 10, 10 231 + // ); 232 + 233 + ctx.strokeStyle = NodeIOLinkColours(drawingFrom); 234 + ctx.lineWidth = 3 * position.scale; 235 + 236 + let nodeX = Math.round(drawingFrom.parent.x / 10) * 10; 237 + let nodeY = Math.round(drawingFrom.parent.y / 10) * 10; 238 + 239 + drawCurve(ctx, 240 + (nodeX + (drawingFrom.parent.w - 10) + 10 + startX + position.x) * position.scale, 241 + (nodeY + 50 + (30 * drawingFrom.index) + 10 + startY + position.y) * position.scale, 242 + (drawingTo[0] + 10 + startX + position.x) * position.scale, 243 + (drawingTo[1] + 10 + startY + position.y) * position.scale, 244 + ); 245 + ctx.stroke(); 246 + } 247 + 248 + let drawCurve = ( ctx: CanvasRenderingContext2D, fromX: number, fromY: number, toX: number, toY: number ) => { 249 + ctx.beginPath(); 250 + 251 + let bias = Math.sqrt(( fromX - toX ) * ( fromX - toX ) + ( fromY - toY ) * ( fromY - toY )) / 3; 252 + 253 + let start = [ fromX + bias, fromY ]; 254 + let end = [ toX - bias, toY ]; 255 + 256 + let midpoint = [ 257 + lerp(start[0], end[0], 0.5), 258 + lerp(start[1], end[1], 0.5) 259 + ]; 260 + 261 + ctx.bezierCurveTo(fromX, fromY, start[0], start[1], midpoint[0], midpoint[1]); 262 + ctx.bezierCurveTo(midpoint[0], midpoint[1], end[0], end[1], toX, toY); 263 + } 264 + 265 + export let renderNullTab = ( 266 + canvas: HTMLCanvasElement, 267 + ctx: CanvasRenderingContext2D, 268 + ) => { 269 + ctx.fillStyle = '#fff'; 270 + 271 + ctx.font = '20px Rubik'; 272 + ctx.textBaseline = 'middle'; 273 + ctx.textAlign = 'center'; 274 + 275 + let textX = lerp((canvas.width / -2) + 200, canvas.width / 2, 0.5); 276 + let textY = lerp((canvas.height / -2) + 40, canvas.height / 2, 0.5); 277 + 278 + ctx.font = '40px Rubik'; 279 + ctx.fillText('Welcome to VRCMacros', textX, textY); 280 + 281 + ctx.font = '20px Rubik'; 282 + ctx.fillText('Create a new tab to get started!', textX, textY + 40); 283 + } 284 + 285 + let drawRoundedRect = ( ctx: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, radius: number ) => { 286 + ctx.beginPath(); 287 + ctx.arc(x + radius, y + radius, radius, Math.PI, Math.PI * 1.5); 288 + ctx.lineTo(x + w - radius, y); 289 + ctx.arc(x + w - radius, y + radius, radius, Math.PI * 1.5, 0); 290 + ctx.lineTo(x + w, y + h - radius); 291 + ctx.arc(x + w - radius, y + h - radius, radius, 0, Math.PI * 0.5); 292 + ctx.lineTo(x + radius, y + h); 293 + ctx.arc(x + radius, y + h - radius, radius, Math.PI * 0.5, Math.PI); 294 + ctx.closePath(); 295 + }
+16
src/structs/ContextMenu.ts
··· 1 + import { PositionInfo } from "../renderer"; 2 + import { Node } from "./node"; 3 + 4 + export interface ContextMenuItem{ 5 + text: string, 6 + hovered: boolean, 7 + clicked?: ( e: MouseEvent, canvas: HTMLCanvasElement, pos: PositionInfo, clickedNode?: Node ) => void, 8 + menu?: ContextMenu 9 + } 10 + 11 + export interface ContextMenu{ 12 + items: ContextMenuItem[]; 13 + position: [ number, number ]; 14 + size: [ number, number ]; 15 + visible: boolean; 16 + }
+9
src/structs/OscMessage.ts
··· 1 + export interface OSCMessage{ 2 + address: string, 3 + values: OSCValue[] 4 + } 5 + 6 + export interface OSCValue{ 7 + key: string, 8 + value: any 9 + }
+17
src/structs/Tab.ts
··· 1 + import { Accessor, Setter } from "solid-js"; 2 + import { Node } from "./node"; 3 + 4 + export interface Tab{ 5 + name: string, 6 + id: string, 7 + nodes: Node[], 8 + saveLocation: string | null, 9 + 10 + selected: Accessor<boolean>, 11 + setSelected: Setter<boolean> 12 + 13 + needsSave: Accessor<boolean>, 14 + setNeedsSave: Setter<boolean>, 15 + 16 + needSync: boolean 17 + }
+163
src/structs/node.ts
··· 1 + import { NodeDefinition } from "../Nodes/Nodes"; 2 + 3 + export class Node{ 4 + name: string; 5 + id: string; 6 + typeId: string; 7 + x: number; 8 + y: number; 9 + w: number; 10 + h: number; 11 + inputs: NodeIO[]; 12 + outputs: NodeIO[]; 13 + selected: boolean; 14 + statics: NodeStatic[]; 15 + onStaticsUpdate: ( node: Node ) => Promise<void>; 16 + 17 + constructor( pos: [ number, number ], node: NodeDefinition, id: string ){ 18 + this.name = node.name; 19 + this.id = id; 20 + this.typeId = node.typeId!; 21 + this.x = pos[0]; 22 + this.y = pos[1]; 23 + 24 + this.inputs = node.inputs ? node.inputs.map(( x, indx ) => { 25 + return { 26 + name: x.name, 27 + type: x.type, 28 + connections: [], 29 + parent: this, 30 + index: indx 31 + } 32 + }) : []; 33 + 34 + this.outputs = node.outputs ? node.outputs.map(( x, indx ) => { 35 + return { 36 + name: x.name, 37 + type: x.type, 38 + connections: [], 39 + parent: this, 40 + index: indx 41 + } 42 + }) : []; 43 + 44 + this.w = node.w || 200; 45 + this.h = 50 + Math.max(this.outputs.length, this.inputs.length) * 30; 46 + 47 + this.selected = false; 48 + this.statics = node.statics!, 49 + this.onStaticsUpdate = node.onStaticsUpdate!; 50 + } 51 + 52 + updateSize(){ 53 + this.h = 50 + Math.max(this.outputs.length, this.inputs.length) * 30; 54 + } 55 + } 56 + 57 + export interface NodeIO{ 58 + name: string, 59 + type: NodeType, 60 + connections: NodeIO[], 61 + parent: Node, 62 + index: number 63 + } 64 + 65 + export enum NodeType{ 66 + Label = 0, 67 + 68 + String = 1, 69 + Float = 2, 70 + Int = 3, 71 + Boolean = 4, 72 + Flow = 5, 73 + 74 + AnyTypeA = 6, 75 + AnyTypeB = 7, 76 + AnyTypeC = 8, 77 + 78 + OSCAddress = 9, 79 + ParameterList = 10 80 + } 81 + 82 + let NodeIOCastTable: any = { 83 + 1: { 2: true, 3: true, 4: true }, // Strings -> Floats, Ints, Bools 84 + 2: { 1: true, 3: true }, // Floats -> Strings, Ints 85 + 3: { 1: true, 2: true, 4: true }, // Ints -> Strings, Floats, Bools 86 + 4: { 1: true, 2: true, 3: true } // Bools -> Strings, Ints, Floats 87 + }; 88 + 89 + export let NodeIOCanCast = ( input: NodeType | null, output: NodeType | null ): boolean => { 90 + if(input === output)return true; 91 + if(!input || !output)return false; 92 + 93 + let CastFrom = NodeIOCastTable[input]; 94 + if(!CastFrom)return false; 95 + 96 + let CastTo = CastFrom[output]; 97 + if(!CastTo)return false; 98 + 99 + return true; 100 + } 101 + 102 + export let NodeIOResolveAnyTypes = ( nodeio: NodeIO ): NodeType | null => { 103 + if(nodeio.type > 0 && nodeio.type < 6){ 104 + // It's a base type 105 + return nodeio.type; 106 + } 107 + 108 + // It's an "AnyType" value and we should resolve it, 109 + // it also means it's an input as "AnyType" is not valid on outputs 110 + let type = nodeio.type; 111 + 112 + // Check if we have any connections 113 + if(nodeio.connections.length > 0){ 114 + // We do, lets copy the type of the first input 115 + return nodeio.connections[0].type; 116 + } 117 + 118 + // Check if there are any others of the same "AnyType" 119 + let other = nodeio.parent.inputs.filter(x => x !== nodeio).find(x => x.type === type); 120 + if(other){ 121 + // There are others with the same type, lets copy that type 122 + // Does other have any connections 123 + 124 + if(other.connections.length > 0){ 125 + return other.connections[0].type; 126 + } 127 + } 128 + 129 + // We can't resolve it yet 130 + return null; 131 + } 132 + 133 + export let NodeIOLinkColours = ( nodeio: NodeIO, output?: NodeIO ) => { 134 + let cols: any = { 135 + 1: '#ffff9f', 136 + 2: '#cda0cb', 137 + 3: '#7ecaca', 138 + 4: '#8bc0a2', 139 + 5: '#edeae3' 140 + } 141 + 142 + let type = NodeIOResolveAnyTypes(nodeio); 143 + if(output){ 144 + let outputType = NodeIOResolveAnyTypes(output); 145 + let startType = type ? cols[type] : '#fff5'; 146 + 147 + if(type !== outputType){ 148 + let endType = outputType ? cols[outputType] : '#fff5'; 149 + 150 + return [ startType, endType ]; 151 + } else{ 152 + return [ startType, startType ]; 153 + } 154 + } 155 + 156 + return type ? cols[type] : '#fff5'; 157 + } 158 + 159 + export interface NodeStatic{ 160 + name: string, 161 + type: NodeType, 162 + value: any 163 + }
+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 + }
+40
src/utils/interections.ts
··· 1 + import { PositionInfo } from "../renderer"; 2 + 3 + export let screenToWorldSpace = ( canvas: HTMLCanvasElement, position: PositionInfo, pointX: number, pointY: number ): [ number, number ] => { 4 + let startX = canvas.width / -2; 5 + let startY = canvas.height / -2; 6 + 7 + let worldX = ((pointX + startX) / position.scale) - position.x - startX; 8 + let worldY = ((pointY + startY) / position.scale) - position.y - startY; 9 + 10 + return [ worldX, worldY ]; 11 + } 12 + 13 + export let isPointInRectApplyOffset = ( canvas: HTMLCanvasElement, position: PositionInfo, pointX: number, pointY: number, rectX: number, rectY: number, rectW: number, rectH: number ): boolean => { 14 + let startX = canvas.width / -2; 15 + let startY = canvas.height / -2; 16 + 17 + let screenPointX = (pointX + startX); 18 + let screenPointY = (pointY + startY); 19 + 20 + let rectScreenX = (rectX + startX + position.x) * position.scale; 21 + let rectScreenY = (rectY + startY + position.y) * position.scale; 22 + let rectScreenW = rectW * position.scale; 23 + let rectScreenH = rectH * position.scale; 24 + 25 + return ( 26 + screenPointX > rectScreenX && 27 + screenPointX < rectScreenX + rectScreenW && 28 + screenPointY > rectScreenY && 29 + screenPointY < rectScreenY + rectScreenH 30 + ) 31 + } 32 + 33 + export let isPointInRect = ( canvas: HTMLCanvasElement, pointX: number, pointY: number, rectX: number, rectY: number, rectW: number, rectH: number ): boolean => { 34 + return ( 35 + pointX > canvas.width / 2 + rectX && 36 + pointX < canvas.width / 2 + rectX + rectW && 37 + pointY > canvas.height / 2 + rectY && 38 + pointY < canvas.height / 2 + rectY + rectH 39 + ) 40 + }
+1
src/utils/lerp.ts
··· 1 + export let lerp = ( a: number, b: number, t: number ): number => a + ( b - a ) * t;
+1371 -1309
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", 14 + "flate2", 11 15 "serde", 12 16 "serde_json", 13 - "sqlx", 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 = "allocator-api2" 61 - version = "0.2.21" 57 + name = "android_system_properties" 58 + version = "0.1.5" 62 59 source = "registry+https://github.com/rust-lang/crates.io-index" 63 - checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 60 + checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 61 + dependencies = [ 62 + "libc", 63 + ] 64 64 65 65 [[package]] 66 - name = "android-tzdata" 67 - version = "0.1.1" 66 + name = "anyhow" 67 + version = "1.0.100" 68 68 source = "registry+https://github.com/rust-lang/crates.io-index" 69 - checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 69 + checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" 70 70 71 71 [[package]] 72 - name = "android_system_properties" 73 - version = "0.1.5" 72 + name = "arboard" 73 + version = "3.6.1" 74 74 source = "registry+https://github.com/rust-lang/crates.io-index" 75 - checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 75 + checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf" 76 76 dependencies = [ 77 - "libc", 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", 78 90 ] 79 91 80 92 [[package]] 81 - name = "anyhow" 82 - version = "1.0.99" 93 + name = "ashpd" 94 + version = "0.11.0" 83 95 source = "registry+https://github.com/rust-lang/crates.io-index" 84 - checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" 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 + ] 85 112 86 113 [[package]] 87 114 name = "async-broadcast" ··· 109 136 110 137 [[package]] 111 138 name = "async-executor" 112 - version = "1.13.2" 139 + version = "1.13.3" 113 140 source = "registry+https://github.com/rust-lang/crates.io-index" 114 - checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" 141 + checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" 115 142 dependencies = [ 116 143 "async-task", 117 144 "concurrent-queue", ··· 123 150 124 151 [[package]] 125 152 name = "async-io" 126 - version = "2.5.0" 153 + version = "2.6.0" 127 154 source = "registry+https://github.com/rust-lang/crates.io-index" 128 - checksum = "19634d6336019ef220f09fd31168ce5c184b295cbf80345437cc36094ef223ca" 155 + checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" 129 156 dependencies = [ 130 - "async-lock", 157 + "autocfg", 131 158 "cfg-if", 132 159 "concurrent-queue", 133 160 "futures-io", 134 161 "futures-lite", 135 162 "parking", 136 163 "polling", 137 - "rustix", 164 + "rustix 1.1.2", 138 165 "slab", 139 - "windows-sys 0.60.2", 166 + "windows-sys 0.61.2", 140 167 ] 141 168 142 169 [[package]] 143 170 name = "async-lock" 144 - version = "3.4.0" 171 + version = "3.4.1" 145 172 source = "registry+https://github.com/rust-lang/crates.io-index" 146 - checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" 173 + checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" 147 174 dependencies = [ 148 175 "event-listener", 149 176 "event-listener-strategy", ··· 152 179 153 180 [[package]] 154 181 name = "async-process" 155 - version = "2.4.0" 182 + version = "2.5.0" 156 183 source = "registry+https://github.com/rust-lang/crates.io-index" 157 - checksum = "65daa13722ad51e6ab1a1b9c01299142bc75135b337923cfa10e79bbbd669f00" 184 + checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" 158 185 dependencies = [ 159 186 "async-channel", 160 187 "async-io", ··· 165 192 "cfg-if", 166 193 "event-listener", 167 194 "futures-lite", 168 - "rustix", 195 + "rustix 1.1.2", 169 196 ] 170 197 171 198 [[package]] ··· 176 203 dependencies = [ 177 204 "proc-macro2", 178 205 "quote", 179 - "syn 2.0.104", 206 + "syn 2.0.109", 180 207 ] 181 208 182 209 [[package]] 183 210 name = "async-signal" 184 - version = "0.2.12" 211 + version = "0.2.13" 185 212 source = "registry+https://github.com/rust-lang/crates.io-index" 186 - checksum = "f567af260ef69e1d52c2b560ce0ea230763e6fbb9214a85d768760a920e3e3c1" 213 + checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" 187 214 dependencies = [ 188 215 "async-io", 189 216 "async-lock", ··· 191 218 "cfg-if", 192 219 "futures-core", 193 220 "futures-io", 194 - "rustix", 221 + "rustix 1.1.2", 195 222 "signal-hook-registry", 196 223 "slab", 197 - "windows-sys 0.60.2", 224 + "windows-sys 0.61.2", 198 225 ] 199 226 200 227 [[package]] ··· 205 232 206 233 [[package]] 207 234 name = "async-trait" 208 - version = "0.1.88" 235 + version = "0.1.89" 209 236 source = "registry+https://github.com/rust-lang/crates.io-index" 210 - checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" 237 + checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" 211 238 dependencies = [ 212 239 "proc-macro2", 213 240 "quote", 214 - "syn 2.0.104", 241 + "syn 2.0.109", 215 242 ] 216 243 217 244 [[package]] ··· 235 262 "gobject-sys", 236 263 "libc", 237 264 "system-deps", 238 - ] 239 - 240 - [[package]] 241 - name = "atoi" 242 - version = "2.0.0" 243 - source = "registry+https://github.com/rust-lang/crates.io-index" 244 - checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 245 - dependencies = [ 246 - "num-traits", 247 265 ] 248 266 249 267 [[package]] ··· 259 277 checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 260 278 261 279 [[package]] 262 - name = "backtrace" 263 - version = "0.3.75" 264 - source = "registry+https://github.com/rust-lang/crates.io-index" 265 - checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" 266 - dependencies = [ 267 - "addr2line", 268 - "cfg-if", 269 - "libc", 270 - "miniz_oxide", 271 - "object", 272 - "rustc-demangle", 273 - "windows-targets 0.52.6", 274 - ] 275 - 276 - [[package]] 277 280 name = "base64" 278 281 version = "0.21.7" 279 282 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 284 287 version = "0.22.1" 285 288 source = "registry+https://github.com/rust-lang/crates.io-index" 286 289 checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 287 - 288 - [[package]] 289 - name = "base64ct" 290 - version = "1.8.0" 291 - source = "registry+https://github.com/rust-lang/crates.io-index" 292 - checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" 293 290 294 291 [[package]] 295 292 name = "bitflags" ··· 299 296 300 297 [[package]] 301 298 name = "bitflags" 302 - version = "2.9.1" 299 + version = "2.10.0" 303 300 source = "registry+https://github.com/rust-lang/crates.io-index" 304 - checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" 301 + checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" 305 302 dependencies = [ 306 - "serde", 303 + "serde_core", 307 304 ] 308 305 309 306 [[package]] ··· 326 323 327 324 [[package]] 328 325 name = "block2" 329 - version = "0.6.1" 326 + version = "0.6.2" 330 327 source = "registry+https://github.com/rust-lang/crates.io-index" 331 - checksum = "340d2f0bdb2a43c1d3cd40513185b2bd7def0aa1052f956455114bc98f82dcf2" 328 + checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" 332 329 dependencies = [ 333 - "objc2 0.6.1", 330 + "objc2 0.6.3", 334 331 ] 335 332 336 333 [[package]] ··· 348 345 349 346 [[package]] 350 347 name = "brotli" 351 - version = "8.0.1" 348 + version = "8.0.2" 352 349 source = "registry+https://github.com/rust-lang/crates.io-index" 353 - checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" 350 + checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" 354 351 dependencies = [ 355 352 "alloc-no-stdlib", 356 353 "alloc-stdlib", ··· 375 372 376 373 [[package]] 377 374 name = "bytemuck" 378 - version = "1.23.1" 375 + version = "1.24.0" 379 376 source = "registry+https://github.com/rust-lang/crates.io-index" 380 - checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" 377 + checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" 381 378 382 379 [[package]] 383 380 name = "byteorder" ··· 386 383 checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 387 384 388 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]] 389 392 name = "bytes" 390 393 version = "1.10.1" 391 394 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 400 403 source = "registry+https://github.com/rust-lang/crates.io-index" 401 404 checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" 402 405 dependencies = [ 403 - "bitflags 2.9.1", 406 + "bitflags 2.10.0", 404 407 "cairo-sys-rs", 405 408 "glib", 406 409 "libc", ··· 421 424 422 425 [[package]] 423 426 name = "camino" 424 - version = "1.1.10" 427 + version = "1.2.1" 425 428 source = "registry+https://github.com/rust-lang/crates.io-index" 426 - checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" 429 + checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" 427 430 dependencies = [ 428 - "serde", 431 + "serde_core", 429 432 ] 430 433 431 434 [[package]] ··· 448 451 "semver", 449 452 "serde", 450 453 "serde_json", 451 - "thiserror 2.0.12", 454 + "thiserror 2.0.17", 452 455 ] 453 456 454 457 [[package]] ··· 458 461 checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" 459 462 dependencies = [ 460 463 "serde", 461 - "toml 0.9.3", 464 + "toml 0.9.8", 462 465 ] 463 466 464 467 [[package]] 465 468 name = "cc" 466 - version = "1.2.30" 469 + version = "1.2.45" 467 470 source = "registry+https://github.com/rust-lang/crates.io-index" 468 - checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" 471 + checksum = "35900b6c8d709fb1d854671ae27aeaa9eec2f8b01b364e1619a40da3e6fe2afe" 469 472 dependencies = [ 473 + "find-msvc-tools", 470 474 "shlex", 471 475 ] 472 476 ··· 499 503 500 504 [[package]] 501 505 name = "cfg-if" 502 - version = "1.0.1" 506 + version = "1.0.4" 503 507 source = "registry+https://github.com/rust-lang/crates.io-index" 504 - checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" 508 + checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" 505 509 506 510 [[package]] 507 511 name = "cfg_aliases" ··· 511 515 512 516 [[package]] 513 517 name = "chrono" 514 - version = "0.4.41" 518 + version = "0.4.42" 515 519 source = "registry+https://github.com/rust-lang/crates.io-index" 516 - checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" 520 + checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" 517 521 dependencies = [ 518 - "android-tzdata", 519 522 "iana-time-zone", 523 + "js-sys", 520 524 "num-traits", 521 525 "serde", 522 - "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", 523 537 ] 524 538 525 539 [[package]] ··· 540 554 dependencies = [ 541 555 "crossbeam-utils", 542 556 ] 543 - 544 - [[package]] 545 - name = "const-oid" 546 - version = "0.9.6" 547 - source = "registry+https://github.com/rust-lang/crates.io-index" 548 - checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 549 557 550 558 [[package]] 551 559 name = "convert_case" ··· 585 593 source = "registry+https://github.com/rust-lang/crates.io-index" 586 594 checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" 587 595 dependencies = [ 588 - "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", 589 610 "core-foundation", 590 611 "core-graphics-types", 591 612 "foreign-types", ··· 598 619 source = "registry+https://github.com/rust-lang/crates.io-index" 599 620 checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" 600 621 dependencies = [ 601 - "bitflags 2.9.1", 622 + "bitflags 2.10.0", 602 623 "core-foundation", 603 624 "libc", 604 625 ] ··· 613 634 ] 614 635 615 636 [[package]] 616 - name = "crc" 617 - version = "3.3.0" 618 - source = "registry+https://github.com/rust-lang/crates.io-index" 619 - checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" 620 - dependencies = [ 621 - "crc-catalog", 622 - ] 623 - 624 - [[package]] 625 - name = "crc-catalog" 626 - version = "2.4.0" 627 - source = "registry+https://github.com/rust-lang/crates.io-index" 628 - checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" 629 - 630 - [[package]] 631 637 name = "crc32fast" 632 638 version = "1.5.0" 633 639 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 646 652 ] 647 653 648 654 [[package]] 649 - name = "crossbeam-queue" 650 - version = "0.3.12" 655 + name = "crossbeam-utils" 656 + version = "0.8.21" 651 657 source = "registry+https://github.com/rust-lang/crates.io-index" 652 - checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" 653 - dependencies = [ 654 - "crossbeam-utils", 655 - ] 658 + checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 656 659 657 660 [[package]] 658 - name = "crossbeam-utils" 659 - version = "0.8.21" 661 + name = "crunchy" 662 + version = "0.2.4" 660 663 source = "registry+https://github.com/rust-lang/crates.io-index" 661 - checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 664 + checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" 662 665 663 666 [[package]] 664 667 name = "crypto-common" ··· 694 697 checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" 695 698 dependencies = [ 696 699 "quote", 697 - "syn 2.0.104", 700 + "syn 2.0.109", 698 701 ] 699 702 700 703 [[package]] ··· 704 707 checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" 705 708 dependencies = [ 706 709 "quote", 707 - "syn 2.0.104", 710 + "syn 2.0.109", 708 711 ] 709 712 710 713 [[package]] 711 714 name = "darling" 712 - version = "0.20.11" 715 + version = "0.21.3" 713 716 source = "registry+https://github.com/rust-lang/crates.io-index" 714 - checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" 717 + checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" 715 718 dependencies = [ 716 719 "darling_core", 717 720 "darling_macro", ··· 719 722 720 723 [[package]] 721 724 name = "darling_core" 722 - version = "0.20.11" 725 + version = "0.21.3" 723 726 source = "registry+https://github.com/rust-lang/crates.io-index" 724 - checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" 727 + checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" 725 728 dependencies = [ 726 729 "fnv", 727 730 "ident_case", 728 731 "proc-macro2", 729 732 "quote", 730 733 "strsim", 731 - "syn 2.0.104", 734 + "syn 2.0.109", 732 735 ] 733 736 734 737 [[package]] 735 738 name = "darling_macro" 736 - version = "0.20.11" 739 + version = "0.21.3" 737 740 source = "registry+https://github.com/rust-lang/crates.io-index" 738 - checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" 741 + checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" 739 742 dependencies = [ 740 743 "darling_core", 741 744 "quote", 742 - "syn 2.0.104", 743 - ] 744 - 745 - [[package]] 746 - name = "der" 747 - version = "0.7.10" 748 - source = "registry+https://github.com/rust-lang/crates.io-index" 749 - checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" 750 - dependencies = [ 751 - "const-oid", 752 - "pem-rfc7468", 753 - "zeroize", 745 + "syn 2.0.109", 754 746 ] 755 747 756 748 [[package]] 757 749 name = "deranged" 758 - version = "0.4.0" 750 + version = "0.5.5" 759 751 source = "registry+https://github.com/rust-lang/crates.io-index" 760 - checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" 752 + checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" 761 753 dependencies = [ 762 754 "powerfmt", 763 - "serde", 755 + "serde_core", 764 756 ] 765 757 766 758 [[package]] ··· 773 765 "proc-macro2", 774 766 "quote", 775 767 "rustc_version", 776 - "syn 2.0.104", 768 + "syn 2.0.109", 777 769 ] 778 770 779 771 [[package]] ··· 783 775 checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 784 776 dependencies = [ 785 777 "block-buffer", 786 - "const-oid", 787 778 "crypto-common", 788 - "subtle", 789 779 ] 790 780 791 781 [[package]] ··· 806 796 "libc", 807 797 "option-ext", 808 798 "redox_users", 809 - "windows-sys 0.60.2", 799 + "windows-sys 0.61.2", 810 800 ] 811 801 812 802 [[package]] ··· 821 811 source = "registry+https://github.com/rust-lang/crates.io-index" 822 812 checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" 823 813 dependencies = [ 824 - "bitflags 2.9.1", 825 - "objc2 0.6.1", 814 + "bitflags 2.10.0", 815 + "block2 0.6.2", 816 + "libc", 817 + "objc2 0.6.3", 826 818 ] 827 819 828 820 [[package]] ··· 833 825 dependencies = [ 834 826 "proc-macro2", 835 827 "quote", 836 - "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", 837 838 ] 838 839 839 840 [[package]] 840 841 name = "dlopen2" 841 - version = "0.7.0" 842 + version = "0.8.0" 842 843 source = "registry+https://github.com/rust-lang/crates.io-index" 843 - checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6" 844 + checksum = "b54f373ccf864bf587a89e880fb7610f8d73f3045f13580948ccbcaff26febff" 844 845 dependencies = [ 845 846 "dlopen2_derive", 846 847 "libc", ··· 856 857 dependencies = [ 857 858 "proc-macro2", 858 859 "quote", 859 - "syn 2.0.104", 860 + "syn 2.0.109", 860 861 ] 861 862 862 863 [[package]] 863 - name = "dotenvy" 864 - version = "0.15.7" 864 + name = "downcast-rs" 865 + version = "1.2.1" 865 866 source = "registry+https://github.com/rust-lang/crates.io-index" 866 - checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" 867 + checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" 867 868 868 869 [[package]] 869 870 name = "dpi" ··· 902 903 checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" 903 904 904 905 [[package]] 905 - name = "either" 906 - version = "1.15.0" 907 - source = "registry+https://github.com/rust-lang/crates.io-index" 908 - checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 909 - dependencies = [ 910 - "serde", 911 - ] 912 - 913 - [[package]] 914 906 name = "embed-resource" 915 - version = "3.0.5" 907 + version = "3.0.6" 916 908 source = "registry+https://github.com/rust-lang/crates.io-index" 917 - checksum = "4c6d81016d6c977deefb2ef8d8290da019e27cc26167e102185da528e6c0ab38" 909 + checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" 918 910 dependencies = [ 919 911 "cc", 920 912 "memchr", 921 913 "rustc_version", 922 - "toml 0.9.3", 914 + "toml 0.9.8", 923 915 "vswhom", 924 916 "winreg", 925 917 ] ··· 937 929 checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" 938 930 939 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]] 940 953 name = "enumflags2" 941 954 version = "0.7.12" 942 955 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 954 967 dependencies = [ 955 968 "proc-macro2", 956 969 "quote", 957 - "syn 2.0.104", 970 + "syn 2.0.109", 958 971 ] 959 972 960 973 [[package]] ··· 965 978 966 979 [[package]] 967 980 name = "erased-serde" 968 - version = "0.4.6" 981 + version = "0.4.9" 969 982 source = "registry+https://github.com/rust-lang/crates.io-index" 970 - checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" 983 + checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" 971 984 dependencies = [ 972 985 "serde", 986 + "serde_core", 973 987 "typeid", 974 988 ] 975 989 976 990 [[package]] 977 991 name = "errno" 978 - version = "0.3.13" 992 + version = "0.3.14" 979 993 source = "registry+https://github.com/rust-lang/crates.io-index" 980 - checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" 994 + checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" 981 995 dependencies = [ 982 996 "libc", 983 - "windows-sys 0.60.2", 997 + "windows-sys 0.61.2", 984 998 ] 985 999 986 1000 [[package]] 987 - name = "etcetera" 988 - version = "0.8.0" 1001 + name = "error-code" 1002 + version = "3.3.2" 989 1003 source = "registry+https://github.com/rust-lang/crates.io-index" 990 - checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" 991 - dependencies = [ 992 - "cfg-if", 993 - "home", 994 - "windows-sys 0.48.0", 995 - ] 1004 + checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" 996 1005 997 1006 [[package]] 998 1007 name = "event-listener" 999 - version = "5.4.0" 1008 + version = "5.4.1" 1000 1009 source = "registry+https://github.com/rust-lang/crates.io-index" 1001 - checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 1010 + checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" 1002 1011 dependencies = [ 1003 1012 "concurrent-queue", 1004 1013 "parking", ··· 1022 1031 checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 1023 1032 1024 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]] 1025 1054 name = "fdeflate" 1026 1055 version = "0.3.7" 1027 1056 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1041 1070 ] 1042 1071 1043 1072 [[package]] 1044 - name = "flate2" 1045 - version = "1.1.2" 1073 + name = "find-msvc-tools" 1074 + version = "0.1.4" 1046 1075 source = "registry+https://github.com/rust-lang/crates.io-index" 1047 - checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" 1048 - dependencies = [ 1049 - "crc32fast", 1050 - "miniz_oxide", 1051 - ] 1076 + checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" 1052 1077 1053 1078 [[package]] 1054 - name = "flume" 1055 - version = "0.11.1" 1079 + name = "fixedbitset" 1080 + version = "0.5.7" 1056 1081 source = "registry+https://github.com/rust-lang/crates.io-index" 1057 - checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" 1082 + checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" 1083 + 1084 + [[package]] 1085 + name = "flate2" 1086 + version = "1.1.5" 1087 + source = "registry+https://github.com/rust-lang/crates.io-index" 1088 + checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" 1058 1089 dependencies = [ 1059 - "futures-core", 1060 - "futures-sink", 1061 - "spin", 1090 + "crc32fast", 1091 + "miniz_oxide", 1062 1092 ] 1063 1093 1064 1094 [[package]] ··· 1091 1121 dependencies = [ 1092 1122 "proc-macro2", 1093 1123 "quote", 1094 - "syn 2.0.104", 1124 + "syn 2.0.109", 1095 1125 ] 1096 1126 1097 1127 [[package]] ··· 1102 1132 1103 1133 [[package]] 1104 1134 name = "form_urlencoded" 1105 - version = "1.2.1" 1135 + version = "1.2.2" 1106 1136 source = "registry+https://github.com/rust-lang/crates.io-index" 1107 - checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 1137 + checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 1108 1138 dependencies = [ 1109 1139 "percent-encoding", 1110 1140 ] ··· 1126 1156 checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 1127 1157 dependencies = [ 1128 1158 "futures-core", 1129 - "futures-sink", 1130 1159 ] 1131 1160 1132 1161 [[package]] ··· 1147 1176 ] 1148 1177 1149 1178 [[package]] 1150 - name = "futures-intrusive" 1151 - version = "0.5.0" 1152 - source = "registry+https://github.com/rust-lang/crates.io-index" 1153 - checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" 1154 - dependencies = [ 1155 - "futures-core", 1156 - "lock_api", 1157 - "parking_lot", 1158 - ] 1159 - 1160 - [[package]] 1161 1179 name = "futures-io" 1162 1180 version = "0.3.31" 1163 1181 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1165 1183 1166 1184 [[package]] 1167 1185 name = "futures-lite" 1168 - version = "2.6.0" 1186 + version = "2.6.1" 1169 1187 source = "registry+https://github.com/rust-lang/crates.io-index" 1170 - checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" 1188 + checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" 1171 1189 dependencies = [ 1172 1190 "fastrand", 1173 1191 "futures-core", ··· 1184 1202 dependencies = [ 1185 1203 "proc-macro2", 1186 1204 "quote", 1187 - "syn 2.0.104", 1205 + "syn 2.0.109", 1188 1206 ] 1189 1207 1190 1208 [[package]] ··· 1326 1344 1327 1345 [[package]] 1328 1346 name = "generic-array" 1329 - version = "0.14.7" 1347 + version = "0.14.9" 1330 1348 source = "registry+https://github.com/rust-lang/crates.io-index" 1331 - checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 1349 + checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" 1332 1350 dependencies = [ 1333 1351 "typenum", 1334 1352 "version_check", 1335 1353 ] 1336 1354 1337 1355 [[package]] 1356 + name = "gethostname" 1357 + version = "1.1.0" 1358 + source = "registry+https://github.com/rust-lang/crates.io-index" 1359 + checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" 1360 + dependencies = [ 1361 + "rustix 1.1.2", 1362 + "windows-link 0.2.1", 1363 + ] 1364 + 1365 + [[package]] 1338 1366 name = "getrandom" 1339 1367 version = "0.1.16" 1340 1368 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1358 1386 1359 1387 [[package]] 1360 1388 name = "getrandom" 1361 - version = "0.3.3" 1389 + version = "0.3.4" 1362 1390 source = "registry+https://github.com/rust-lang/crates.io-index" 1363 - checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 1391 + checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" 1364 1392 dependencies = [ 1365 1393 "cfg-if", 1366 1394 "libc", 1367 1395 "r-efi", 1368 - "wasi 0.14.2+wasi-0.2.4", 1396 + "wasip2", 1369 1397 ] 1370 1398 1371 1399 [[package]] 1372 - name = "gimli" 1373 - version = "0.31.1" 1374 - source = "registry+https://github.com/rust-lang/crates.io-index" 1375 - checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 1376 - 1377 - [[package]] 1378 1400 name = "gio" 1379 1401 version = "0.18.4" 1380 1402 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1412 1434 source = "registry+https://github.com/rust-lang/crates.io-index" 1413 1435 checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" 1414 1436 dependencies = [ 1415 - "bitflags 2.9.1", 1437 + "bitflags 2.10.0", 1416 1438 "futures-channel", 1417 1439 "futures-core", 1418 1440 "futures-executor", ··· 1436 1458 checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" 1437 1459 dependencies = [ 1438 1460 "heck 0.4.1", 1439 - "proc-macro-crate 2.0.0", 1461 + "proc-macro-crate 2.0.2", 1440 1462 "proc-macro-error", 1441 1463 "proc-macro2", 1442 1464 "quote", 1443 - "syn 2.0.104", 1465 + "syn 2.0.109", 1444 1466 ] 1445 1467 1446 1468 [[package]] ··· 1455 1477 1456 1478 [[package]] 1457 1479 name = "glob" 1458 - version = "0.3.2" 1480 + version = "0.3.3" 1459 1481 source = "registry+https://github.com/rust-lang/crates.io-index" 1460 - checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 1482 + checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" 1461 1483 1462 1484 [[package]] 1463 1485 name = "gobject-sys" ··· 1519 1541 "proc-macro-error", 1520 1542 "proc-macro2", 1521 1543 "quote", 1522 - "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", 1523 1556 ] 1524 1557 1525 1558 [[package]] ··· 1530 1563 1531 1564 [[package]] 1532 1565 name = "hashbrown" 1533 - version = "0.15.4" 1566 + version = "0.15.5" 1534 1567 source = "registry+https://github.com/rust-lang/crates.io-index" 1535 - checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" 1568 + checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 1536 1569 dependencies = [ 1537 - "allocator-api2", 1538 - "equivalent", 1539 1570 "foldhash", 1540 1571 ] 1541 1572 1542 1573 [[package]] 1543 - name = "hashlink" 1544 - version = "0.10.0" 1574 + name = "hashbrown" 1575 + version = "0.16.0" 1545 1576 source = "registry+https://github.com/rust-lang/crates.io-index" 1546 - checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" 1547 - dependencies = [ 1548 - "hashbrown 0.15.4", 1549 - ] 1577 + checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" 1550 1578 1551 1579 [[package]] 1552 1580 name = "heck" ··· 1573 1601 checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 1574 1602 1575 1603 [[package]] 1576 - name = "hkdf" 1577 - version = "0.12.4" 1578 - source = "registry+https://github.com/rust-lang/crates.io-index" 1579 - checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" 1580 - dependencies = [ 1581 - "hmac", 1582 - ] 1583 - 1584 - [[package]] 1585 - name = "hmac" 1586 - version = "0.12.1" 1587 - source = "registry+https://github.com/rust-lang/crates.io-index" 1588 - checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 1589 - dependencies = [ 1590 - "digest", 1591 - ] 1592 - 1593 - [[package]] 1594 - name = "home" 1595 - version = "0.5.11" 1596 - source = "registry+https://github.com/rust-lang/crates.io-index" 1597 - checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" 1598 - dependencies = [ 1599 - "windows-sys 0.59.0", 1600 - ] 1601 - 1602 - [[package]] 1603 1604 name = "html5ever" 1604 1605 version = "0.29.1" 1605 1606 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1653 1654 1654 1655 [[package]] 1655 1656 name = "hyper" 1656 - version = "1.6.0" 1657 + version = "1.7.0" 1657 1658 source = "registry+https://github.com/rust-lang/crates.io-index" 1658 - checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 1659 + checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" 1659 1660 dependencies = [ 1661 + "atomic-waker", 1660 1662 "bytes", 1661 1663 "futures-channel", 1662 - "futures-util", 1664 + "futures-core", 1663 1665 "http", 1664 1666 "http-body", 1665 1667 "httparse", 1666 1668 "itoa", 1667 1669 "pin-project-lite", 1670 + "pin-utils", 1668 1671 "smallvec", 1669 1672 "tokio", 1670 1673 "want", ··· 1672 1675 1673 1676 [[package]] 1674 1677 name = "hyper-util" 1675 - version = "0.1.16" 1678 + version = "0.1.17" 1676 1679 source = "registry+https://github.com/rust-lang/crates.io-index" 1677 - checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" 1680 + checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" 1678 1681 dependencies = [ 1679 1682 "base64 0.22.1", 1680 1683 "bytes", ··· 1696 1699 1697 1700 [[package]] 1698 1701 name = "iana-time-zone" 1699 - version = "0.1.63" 1702 + version = "0.1.64" 1700 1703 source = "registry+https://github.com/rust-lang/crates.io-index" 1701 - checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" 1704 + checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" 1702 1705 dependencies = [ 1703 1706 "android_system_properties", 1704 1707 "core-foundation-sys", ··· 1706 1709 "js-sys", 1707 1710 "log", 1708 1711 "wasm-bindgen", 1709 - "windows-core", 1712 + "windows-core 0.62.2", 1710 1713 ] 1711 1714 1712 1715 [[package]] ··· 1725 1728 checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" 1726 1729 dependencies = [ 1727 1730 "byteorder", 1728 - "png", 1731 + "png 0.17.16", 1729 1732 ] 1730 1733 1731 1734 [[package]] 1732 1735 name = "icu_collections" 1733 - version = "2.0.0" 1736 + version = "2.1.1" 1734 1737 source = "registry+https://github.com/rust-lang/crates.io-index" 1735 - checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 1738 + checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" 1736 1739 dependencies = [ 1737 1740 "displaydoc", 1738 1741 "potential_utf", ··· 1743 1746 1744 1747 [[package]] 1745 1748 name = "icu_locale_core" 1746 - version = "2.0.0" 1749 + version = "2.1.1" 1747 1750 source = "registry+https://github.com/rust-lang/crates.io-index" 1748 - checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 1751 + checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" 1749 1752 dependencies = [ 1750 1753 "displaydoc", 1751 1754 "litemap", ··· 1756 1759 1757 1760 [[package]] 1758 1761 name = "icu_normalizer" 1759 - version = "2.0.0" 1762 + version = "2.1.1" 1760 1763 source = "registry+https://github.com/rust-lang/crates.io-index" 1761 - checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 1764 + checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" 1762 1765 dependencies = [ 1763 - "displaydoc", 1764 1766 "icu_collections", 1765 1767 "icu_normalizer_data", 1766 1768 "icu_properties", ··· 1771 1773 1772 1774 [[package]] 1773 1775 name = "icu_normalizer_data" 1774 - version = "2.0.0" 1776 + version = "2.1.1" 1775 1777 source = "registry+https://github.com/rust-lang/crates.io-index" 1776 - checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 1778 + checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" 1777 1779 1778 1780 [[package]] 1779 1781 name = "icu_properties" 1780 - version = "2.0.1" 1782 + version = "2.1.1" 1781 1783 source = "registry+https://github.com/rust-lang/crates.io-index" 1782 - checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 1784 + checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" 1783 1785 dependencies = [ 1784 - "displaydoc", 1785 1786 "icu_collections", 1786 1787 "icu_locale_core", 1787 1788 "icu_properties_data", 1788 1789 "icu_provider", 1789 - "potential_utf", 1790 1790 "zerotrie", 1791 1791 "zerovec", 1792 1792 ] 1793 1793 1794 1794 [[package]] 1795 1795 name = "icu_properties_data" 1796 - version = "2.0.1" 1796 + version = "2.1.1" 1797 1797 source = "registry+https://github.com/rust-lang/crates.io-index" 1798 - checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 1798 + checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" 1799 1799 1800 1800 [[package]] 1801 1801 name = "icu_provider" 1802 - version = "2.0.0" 1802 + version = "2.1.1" 1803 1803 source = "registry+https://github.com/rust-lang/crates.io-index" 1804 - checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 1804 + checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" 1805 1805 dependencies = [ 1806 1806 "displaydoc", 1807 1807 "icu_locale_core", 1808 - "stable_deref_trait", 1809 - "tinystr", 1810 1808 "writeable", 1811 1809 "yoke", 1812 1810 "zerofrom", ··· 1822 1820 1823 1821 [[package]] 1824 1822 name = "idna" 1825 - version = "1.0.3" 1823 + version = "1.1.0" 1826 1824 source = "registry+https://github.com/rust-lang/crates.io-index" 1827 - checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 1825 + checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 1828 1826 dependencies = [ 1829 1827 "idna_adapter", 1830 1828 "smallvec", ··· 1842 1840 ] 1843 1841 1844 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]] 1845 1857 name = "indexmap" 1846 1858 version = "1.9.3" 1847 1859 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1854 1866 1855 1867 [[package]] 1856 1868 name = "indexmap" 1857 - version = "2.10.0" 1869 + version = "2.12.0" 1858 1870 source = "registry+https://github.com/rust-lang/crates.io-index" 1859 - checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" 1871 + checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" 1860 1872 dependencies = [ 1861 1873 "equivalent", 1862 - "hashbrown 0.15.4", 1874 + "hashbrown 0.16.0", 1863 1875 "serde", 1876 + "serde_core", 1864 1877 ] 1865 1878 1866 1879 [[package]] ··· 1873 1886 ] 1874 1887 1875 1888 [[package]] 1876 - name = "io-uring" 1877 - version = "0.7.9" 1878 - source = "registry+https://github.com/rust-lang/crates.io-index" 1879 - checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" 1880 - dependencies = [ 1881 - "bitflags 2.9.1", 1882 - "cfg-if", 1883 - "libc", 1884 - ] 1885 - 1886 - [[package]] 1887 1889 name = "ipnet" 1888 1890 version = "2.11.0" 1889 1891 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1891 1893 1892 1894 [[package]] 1893 1895 name = "iri-string" 1894 - version = "0.7.8" 1896 + version = "0.7.9" 1895 1897 source = "registry+https://github.com/rust-lang/crates.io-index" 1896 - checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" 1898 + checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" 1897 1899 dependencies = [ 1898 1900 "memchr", 1899 1901 "serde", ··· 1971 1973 1972 1974 [[package]] 1973 1975 name = "js-sys" 1974 - version = "0.3.77" 1976 + version = "0.3.82" 1975 1977 source = "registry+https://github.com/rust-lang/crates.io-index" 1976 - checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 1978 + checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" 1977 1979 dependencies = [ 1978 1980 "once_cell", 1979 1981 "wasm-bindgen", ··· 2007 2009 source = "registry+https://github.com/rust-lang/crates.io-index" 2008 2010 checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" 2009 2011 dependencies = [ 2010 - "bitflags 2.9.1", 2012 + "bitflags 2.10.0", 2011 2013 "serde", 2012 2014 "unicode-segmentation", 2013 2015 ] ··· 2020 2022 dependencies = [ 2021 2023 "cssparser", 2022 2024 "html5ever", 2023 - "indexmap 2.10.0", 2025 + "indexmap 2.12.0", 2024 2026 "selectors", 2025 2027 ] 2026 2028 ··· 2029 2031 version = "1.5.0" 2030 2032 source = "registry+https://github.com/rust-lang/crates.io-index" 2031 2033 checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 2032 - dependencies = [ 2033 - "spin", 2034 - ] 2035 2034 2036 2035 [[package]] 2037 2036 name = "libappindicator" ··· 2053 2052 checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" 2054 2053 dependencies = [ 2055 2054 "gtk-sys", 2056 - "libloading", 2055 + "libloading 0.7.4", 2057 2056 "once_cell", 2058 2057 ] 2059 2058 2060 2059 [[package]] 2061 2060 name = "libc" 2062 - version = "0.2.174" 2061 + version = "0.2.177" 2063 2062 source = "registry+https://github.com/rust-lang/crates.io-index" 2064 - checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" 2063 + checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" 2065 2064 2066 2065 [[package]] 2067 2066 name = "libloading" ··· 2074 2073 ] 2075 2074 2076 2075 [[package]] 2077 - name = "libm" 2078 - version = "0.2.15" 2076 + name = "libloading" 2077 + version = "0.8.9" 2079 2078 source = "registry+https://github.com/rust-lang/crates.io-index" 2080 - checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" 2079 + checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" 2080 + dependencies = [ 2081 + "cfg-if", 2082 + "windows-link 0.2.1", 2083 + ] 2081 2084 2082 2085 [[package]] 2083 2086 name = "libredox" 2084 - version = "0.1.8" 2087 + version = "0.1.10" 2085 2088 source = "registry+https://github.com/rust-lang/crates.io-index" 2086 - checksum = "360e552c93fa0e8152ab463bc4c4837fce76a225df11dfaeea66c313de5e61f7" 2089 + checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" 2087 2090 dependencies = [ 2088 - "bitflags 2.9.1", 2091 + "bitflags 2.10.0", 2089 2092 "libc", 2090 2093 ] 2091 2094 2092 2095 [[package]] 2093 - name = "libsqlite3-sys" 2094 - version = "0.30.1" 2096 + name = "linux-raw-sys" 2097 + version = "0.4.15" 2095 2098 source = "registry+https://github.com/rust-lang/crates.io-index" 2096 - checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" 2097 - dependencies = [ 2098 - "cc", 2099 - "pkg-config", 2100 - "vcpkg", 2101 - ] 2099 + checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 2102 2100 2103 2101 [[package]] 2104 2102 name = "linux-raw-sys" 2105 - version = "0.9.4" 2103 + version = "0.11.0" 2106 2104 source = "registry+https://github.com/rust-lang/crates.io-index" 2107 - checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 2105 + checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" 2108 2106 2109 2107 [[package]] 2110 2108 name = "litemap" 2111 - version = "0.8.0" 2109 + version = "0.8.1" 2112 2110 source = "registry+https://github.com/rust-lang/crates.io-index" 2113 - checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 2111 + checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" 2114 2112 2115 2113 [[package]] 2116 2114 name = "lock_api" 2117 - version = "0.4.13" 2115 + version = "0.4.14" 2118 2116 source = "registry+https://github.com/rust-lang/crates.io-index" 2119 - checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" 2117 + checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" 2120 2118 dependencies = [ 2121 - "autocfg", 2122 2119 "scopeguard", 2123 2120 ] 2124 2121 2125 2122 [[package]] 2126 2123 name = "log" 2127 - version = "0.4.27" 2124 + version = "0.4.28" 2128 2125 source = "registry+https://github.com/rust-lang/crates.io-index" 2129 - checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 2126 + checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" 2130 2127 2131 2128 [[package]] 2132 2129 name = "mac" ··· 2156 2153 dependencies = [ 2157 2154 "proc-macro2", 2158 2155 "quote", 2159 - "syn 2.0.104", 2156 + "syn 2.0.109", 2160 2157 ] 2161 2158 2162 2159 [[package]] ··· 2166 2163 checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" 2167 2164 2168 2165 [[package]] 2169 - name = "md-5" 2170 - version = "0.10.6" 2166 + name = "memchr" 2167 + version = "2.7.6" 2171 2168 source = "registry+https://github.com/rust-lang/crates.io-index" 2172 - checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" 2173 - dependencies = [ 2174 - "cfg-if", 2175 - "digest", 2176 - ] 2169 + checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" 2177 2170 2178 2171 [[package]] 2179 - name = "memchr" 2180 - version = "2.7.5" 2172 + name = "memmap2" 2173 + version = "0.9.9" 2181 2174 source = "registry+https://github.com/rust-lang/crates.io-index" 2182 - checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" 2175 + checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" 2176 + dependencies = [ 2177 + "libc", 2178 + ] 2183 2179 2184 2180 [[package]] 2185 2181 name = "memoffset" ··· 2195 2191 version = "0.3.17" 2196 2192 source = "registry+https://github.com/rust-lang/crates.io-index" 2197 2193 checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 2194 + 2195 + [[package]] 2196 + name = "minimal-lexical" 2197 + version = "0.2.1" 2198 + source = "registry+https://github.com/rust-lang/crates.io-index" 2199 + checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 2198 2200 2199 2201 [[package]] 2200 2202 name = "miniz_oxide" ··· 2208 2210 2209 2211 [[package]] 2210 2212 name = "mio" 2211 - version = "1.0.4" 2213 + version = "1.1.0" 2212 2214 source = "registry+https://github.com/rust-lang/crates.io-index" 2213 - checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 2215 + checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" 2214 2216 dependencies = [ 2215 2217 "libc", 2216 2218 "wasi 0.11.1+wasi-snapshot-preview1", 2217 - "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", 2218 2230 ] 2219 2231 2220 2232 [[package]] 2221 2233 name = "muda" 2222 - version = "0.17.0" 2234 + version = "0.17.1" 2223 2235 source = "registry+https://github.com/rust-lang/crates.io-index" 2224 - checksum = "58b89bf91c19bf036347f1ab85a81c560f08c0667c8601bece664d860a600988" 2236 + checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" 2225 2237 dependencies = [ 2226 2238 "crossbeam-channel", 2227 2239 "dpi", 2228 2240 "gtk", 2229 2241 "keyboard-types", 2230 - "objc2 0.6.1", 2242 + "objc2 0.6.3", 2231 2243 "objc2-app-kit", 2232 2244 "objc2-core-foundation", 2233 - "objc2-foundation 0.3.1", 2245 + "objc2-foundation 0.3.2", 2234 2246 "once_cell", 2235 - "png", 2247 + "png 0.17.16", 2236 2248 "serde", 2237 - "thiserror 2.0.12", 2238 - "windows-sys 0.59.0", 2249 + "thiserror 2.0.17", 2250 + "windows-sys 0.60.2", 2239 2251 ] 2240 2252 2241 2253 [[package]] ··· 2244 2256 source = "registry+https://github.com/rust-lang/crates.io-index" 2245 2257 checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" 2246 2258 dependencies = [ 2247 - "bitflags 2.9.1", 2259 + "bitflags 2.10.0", 2248 2260 "jni-sys", 2249 2261 "log", 2250 2262 "ndk-sys", ··· 2280 2292 source = "registry+https://github.com/rust-lang/crates.io-index" 2281 2293 checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" 2282 2294 dependencies = [ 2283 - "bitflags 2.9.1", 2295 + "bitflags 2.10.0", 2284 2296 "cfg-if", 2285 2297 "cfg_aliases", 2286 2298 "libc", ··· 2294 2306 checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" 2295 2307 2296 2308 [[package]] 2297 - name = "num-bigint-dig" 2298 - version = "0.8.4" 2309 + name = "nom" 2310 + version = "7.1.3" 2299 2311 source = "registry+https://github.com/rust-lang/crates.io-index" 2300 - checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" 2312 + checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 2301 2313 dependencies = [ 2302 - "byteorder", 2303 - "lazy_static", 2304 - "libm", 2305 - "num-integer", 2306 - "num-iter", 2307 - "num-traits", 2308 - "rand 0.8.5", 2309 - "smallvec", 2310 - "zeroize", 2314 + "memchr", 2315 + "minimal-lexical", 2311 2316 ] 2312 2317 2313 2318 [[package]] 2314 - name = "num-conv" 2315 - version = "0.1.0" 2319 + name = "nom" 2320 + version = "8.0.0" 2316 2321 source = "registry+https://github.com/rust-lang/crates.io-index" 2317 - checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 2318 - 2319 - [[package]] 2320 - name = "num-integer" 2321 - version = "0.1.46" 2322 - source = "registry+https://github.com/rust-lang/crates.io-index" 2323 - checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 2322 + checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" 2324 2323 dependencies = [ 2325 - "num-traits", 2324 + "memchr", 2326 2325 ] 2327 2326 2328 2327 [[package]] 2329 - name = "num-iter" 2330 - version = "0.1.45" 2328 + name = "num-conv" 2329 + version = "0.1.0" 2331 2330 source = "registry+https://github.com/rust-lang/crates.io-index" 2332 - checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" 2333 - dependencies = [ 2334 - "autocfg", 2335 - "num-integer", 2336 - "num-traits", 2337 - ] 2331 + checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 2338 2332 2339 2333 [[package]] 2340 2334 name = "num-traits" ··· 2343 2337 checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 2344 2338 dependencies = [ 2345 2339 "autocfg", 2346 - "libm", 2347 2340 ] 2348 2341 2349 2342 [[package]] 2350 2343 name = "num_enum" 2351 - version = "0.7.4" 2344 + version = "0.7.5" 2352 2345 source = "registry+https://github.com/rust-lang/crates.io-index" 2353 - checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" 2346 + checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" 2354 2347 dependencies = [ 2355 2348 "num_enum_derive", 2356 2349 "rustversion", ··· 2358 2351 2359 2352 [[package]] 2360 2353 name = "num_enum_derive" 2361 - version = "0.7.4" 2354 + version = "0.7.5" 2362 2355 source = "registry+https://github.com/rust-lang/crates.io-index" 2363 - checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" 2356 + checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" 2364 2357 dependencies = [ 2365 - "proc-macro-crate 3.3.0", 2358 + "proc-macro-crate 3.4.0", 2366 2359 "proc-macro2", 2367 2360 "quote", 2368 - "syn 2.0.104", 2361 + "syn 2.0.109", 2369 2362 ] 2370 2363 2371 2364 [[package]] ··· 2386 2379 2387 2380 [[package]] 2388 2381 name = "objc2" 2389 - version = "0.6.1" 2382 + version = "0.6.3" 2390 2383 source = "registry+https://github.com/rust-lang/crates.io-index" 2391 - checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" 2384 + checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" 2392 2385 dependencies = [ 2393 2386 "objc2-encode", 2394 2387 "objc2-exception-helper", ··· 2396 2389 2397 2390 [[package]] 2398 2391 name = "objc2-app-kit" 2399 - version = "0.3.1" 2392 + version = "0.3.2" 2400 2393 source = "registry+https://github.com/rust-lang/crates.io-index" 2401 - checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" 2394 + checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" 2402 2395 dependencies = [ 2403 - "bitflags 2.9.1", 2404 - "block2 0.6.1", 2396 + "bitflags 2.10.0", 2397 + "block2 0.6.2", 2405 2398 "libc", 2406 - "objc2 0.6.1", 2399 + "objc2 0.6.3", 2407 2400 "objc2-cloud-kit", 2408 2401 "objc2-core-data", 2409 2402 "objc2-core-foundation", 2410 2403 "objc2-core-graphics", 2411 2404 "objc2-core-image", 2412 - "objc2-foundation 0.3.1", 2413 - "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", 2414 2409 ] 2415 2410 2416 2411 [[package]] 2417 2412 name = "objc2-cloud-kit" 2418 - version = "0.3.1" 2413 + version = "0.3.2" 2419 2414 source = "registry+https://github.com/rust-lang/crates.io-index" 2420 - checksum = "17614fdcd9b411e6ff1117dfb1d0150f908ba83a7df81b1f118005fe0a8ea15d" 2415 + checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" 2421 2416 dependencies = [ 2422 - "bitflags 2.9.1", 2423 - "objc2 0.6.1", 2424 - "objc2-foundation 0.3.1", 2417 + "bitflags 2.10.0", 2418 + "objc2 0.6.3", 2419 + "objc2-foundation 0.3.2", 2425 2420 ] 2426 2421 2427 2422 [[package]] 2428 2423 name = "objc2-core-data" 2429 - version = "0.3.1" 2424 + version = "0.3.2" 2430 2425 source = "registry+https://github.com/rust-lang/crates.io-index" 2431 - checksum = "291fbbf7d29287518e8686417cf7239c74700fd4b607623140a7d4a3c834329d" 2426 + checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" 2432 2427 dependencies = [ 2433 - "bitflags 2.9.1", 2434 - "objc2 0.6.1", 2435 - "objc2-foundation 0.3.1", 2428 + "bitflags 2.10.0", 2429 + "objc2 0.6.3", 2430 + "objc2-foundation 0.3.2", 2436 2431 ] 2437 2432 2438 2433 [[package]] 2439 2434 name = "objc2-core-foundation" 2440 - version = "0.3.1" 2435 + version = "0.3.2" 2441 2436 source = "registry+https://github.com/rust-lang/crates.io-index" 2442 - checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" 2437 + checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" 2443 2438 dependencies = [ 2444 - "bitflags 2.9.1", 2439 + "bitflags 2.10.0", 2445 2440 "dispatch2", 2446 - "objc2 0.6.1", 2441 + "objc2 0.6.3", 2447 2442 ] 2448 2443 2449 2444 [[package]] 2450 2445 name = "objc2-core-graphics" 2451 - version = "0.3.1" 2446 + version = "0.3.2" 2452 2447 source = "registry+https://github.com/rust-lang/crates.io-index" 2453 - checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" 2448 + checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" 2454 2449 dependencies = [ 2455 - "bitflags 2.9.1", 2450 + "bitflags 2.10.0", 2456 2451 "dispatch2", 2457 - "objc2 0.6.1", 2452 + "objc2 0.6.3", 2458 2453 "objc2-core-foundation", 2459 2454 "objc2-io-surface", 2460 2455 ] 2461 2456 2462 2457 [[package]] 2463 2458 name = "objc2-core-image" 2464 - 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" 2465 2492 source = "registry+https://github.com/rust-lang/crates.io-index" 2466 - checksum = "79b3dc0cc4386b6ccf21c157591b34a7f44c8e75b064f85502901ab2188c007e" 2493 + checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" 2467 2494 dependencies = [ 2468 - "objc2 0.6.1", 2469 - "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", 2470 2500 ] 2471 2501 2472 2502 [[package]] ··· 2490 2520 source = "registry+https://github.com/rust-lang/crates.io-index" 2491 2521 checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" 2492 2522 dependencies = [ 2493 - "bitflags 2.9.1", 2523 + "bitflags 2.10.0", 2494 2524 "block2 0.5.1", 2495 2525 "libc", 2496 2526 "objc2 0.5.2", ··· 2498 2528 2499 2529 [[package]] 2500 2530 name = "objc2-foundation" 2501 - version = "0.3.1" 2531 + version = "0.3.2" 2502 2532 source = "registry+https://github.com/rust-lang/crates.io-index" 2503 - checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" 2533 + checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" 2504 2534 dependencies = [ 2505 - "bitflags 2.9.1", 2506 - "block2 0.6.1", 2535 + "bitflags 2.10.0", 2536 + "block2 0.6.2", 2507 2537 "libc", 2508 - "objc2 0.6.1", 2538 + "objc2 0.6.3", 2509 2539 "objc2-core-foundation", 2510 2540 ] 2511 2541 2512 2542 [[package]] 2513 2543 name = "objc2-io-surface" 2514 - version = "0.3.1" 2544 + version = "0.3.2" 2545 + source = "registry+https://github.com/rust-lang/crates.io-index" 2546 + checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" 2547 + dependencies = [ 2548 + "bitflags 2.10.0", 2549 + "objc2 0.6.3", 2550 + "objc2-core-foundation", 2551 + ] 2552 + 2553 + [[package]] 2554 + name = "objc2-javascript-core" 2555 + version = "0.3.2" 2515 2556 source = "registry+https://github.com/rust-lang/crates.io-index" 2516 - checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" 2557 + checksum = "2a1e6550c4caed348956ce3370c9ffeca70bb1dbed4fa96112e7c6170e074586" 2517 2558 dependencies = [ 2518 - "bitflags 2.9.1", 2519 - "objc2 0.6.1", 2559 + "objc2 0.6.3", 2520 2560 "objc2-core-foundation", 2521 2561 ] 2522 2562 ··· 2526 2566 source = "registry+https://github.com/rust-lang/crates.io-index" 2527 2567 checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" 2528 2568 dependencies = [ 2529 - "bitflags 2.9.1", 2569 + "bitflags 2.10.0", 2530 2570 "block2 0.5.1", 2531 2571 "objc2 0.5.2", 2532 2572 "objc2-foundation 0.2.2", ··· 2538 2578 source = "registry+https://github.com/rust-lang/crates.io-index" 2539 2579 checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" 2540 2580 dependencies = [ 2541 - "bitflags 2.9.1", 2581 + "bitflags 2.10.0", 2542 2582 "block2 0.5.1", 2543 2583 "objc2 0.5.2", 2544 2584 "objc2-foundation 0.2.2", ··· 2547 2587 2548 2588 [[package]] 2549 2589 name = "objc2-quartz-core" 2550 - version = "0.3.1" 2590 + version = "0.3.2" 2551 2591 source = "registry+https://github.com/rust-lang/crates.io-index" 2552 - checksum = "90ffb6a0cd5f182dc964334388560b12a57f7b74b3e2dec5e2722aa2dfb2ccd5" 2592 + checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" 2553 2593 dependencies = [ 2554 - "bitflags 2.9.1", 2555 - "objc2 0.6.1", 2556 - "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", 2557 2598 ] 2558 2599 2559 2600 [[package]] 2560 - name = "objc2-ui-kit" 2561 - version = "0.3.1" 2601 + name = "objc2-security" 2602 + version = "0.3.2" 2562 2603 source = "registry+https://github.com/rust-lang/crates.io-index" 2563 - checksum = "25b1312ad7bc8a0e92adae17aa10f90aae1fb618832f9b993b022b591027daed" 2604 + checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" 2564 2605 dependencies = [ 2565 - "bitflags 2.9.1", 2566 - "objc2 0.6.1", 2606 + "bitflags 2.10.0", 2607 + "objc2 0.6.3", 2567 2608 "objc2-core-foundation", 2568 - "objc2-foundation 0.3.1", 2569 2609 ] 2570 2610 2571 2611 [[package]] 2572 - name = "objc2-web-kit" 2573 - version = "0.3.1" 2612 + name = "objc2-ui-kit" 2613 + version = "0.3.2" 2574 2614 source = "registry+https://github.com/rust-lang/crates.io-index" 2575 - checksum = "91672909de8b1ce1c2252e95bbee8c1649c9ad9d14b9248b3d7b4c47903c47ad" 2615 + checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" 2576 2616 dependencies = [ 2577 - "bitflags 2.9.1", 2578 - "block2 0.6.1", 2579 - "objc2 0.6.1", 2580 - "objc2-app-kit", 2617 + "bitflags 2.10.0", 2618 + "block2 0.6.2", 2619 + "objc2 0.6.3", 2620 + "objc2-cloud-kit", 2621 + "objc2-core-data", 2581 2622 "objc2-core-foundation", 2582 - "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", 2583 2630 ] 2584 2631 2585 2632 [[package]] 2586 - name = "object" 2587 - version = "0.36.7" 2633 + name = "objc2-user-notifications" 2634 + version = "0.3.2" 2588 2635 source = "registry+https://github.com/rust-lang/crates.io-index" 2589 - checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 2636 + checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" 2590 2637 dependencies = [ 2591 - "memchr", 2638 + "objc2 0.6.3", 2639 + "objc2-foundation 0.3.2", 2640 + ] 2641 + 2642 + [[package]] 2643 + name = "objc2-web-kit" 2644 + version = "0.3.2" 2645 + source = "registry+https://github.com/rust-lang/crates.io-index" 2646 + checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" 2647 + dependencies = [ 2648 + "bitflags 2.10.0", 2649 + "block2 0.6.2", 2650 + "objc2 0.6.3", 2651 + "objc2-app-kit", 2652 + "objc2-core-foundation", 2653 + "objc2-foundation 0.3.2", 2654 + "objc2-javascript-core", 2655 + "objc2-security", 2592 2656 ] 2593 2657 2594 2658 [[package]] ··· 2626 2690 ] 2627 2691 2628 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]] 2629 2719 name = "pango" 2630 2720 version = "0.18.3" 2631 2721 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2658 2748 2659 2749 [[package]] 2660 2750 name = "parking_lot" 2661 - version = "0.12.4" 2751 + version = "0.12.5" 2662 2752 source = "registry+https://github.com/rust-lang/crates.io-index" 2663 - checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" 2753 + checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" 2664 2754 dependencies = [ 2665 2755 "lock_api", 2666 2756 "parking_lot_core", ··· 2668 2758 2669 2759 [[package]] 2670 2760 name = "parking_lot_core" 2671 - version = "0.9.11" 2761 + version = "0.9.12" 2672 2762 source = "registry+https://github.com/rust-lang/crates.io-index" 2673 - checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" 2763 + checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" 2674 2764 dependencies = [ 2675 2765 "cfg-if", 2676 2766 "libc", 2677 2767 "redox_syscall", 2678 2768 "smallvec", 2679 - "windows-targets 0.52.6", 2769 + "windows-link 0.2.1", 2680 2770 ] 2681 2771 2682 2772 [[package]] ··· 2686 2776 checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" 2687 2777 2688 2778 [[package]] 2689 - name = "pem-rfc7468" 2690 - version = "0.7.0" 2779 + name = "percent-encoding" 2780 + version = "2.3.2" 2691 2781 source = "registry+https://github.com/rust-lang/crates.io-index" 2692 - checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" 2693 - dependencies = [ 2694 - "base64ct", 2695 - ] 2782 + checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 2696 2783 2697 2784 [[package]] 2698 - name = "percent-encoding" 2699 - version = "2.3.1" 2785 + name = "petgraph" 2786 + version = "0.8.3" 2700 2787 source = "registry+https://github.com/rust-lang/crates.io-index" 2701 - checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 2788 + checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" 2789 + dependencies = [ 2790 + "fixedbitset", 2791 + "hashbrown 0.15.5", 2792 + "indexmap 2.12.0", 2793 + ] 2702 2794 2703 2795 [[package]] 2704 2796 name = "phf" ··· 2804 2896 "phf_shared 0.11.3", 2805 2897 "proc-macro2", 2806 2898 "quote", 2807 - "syn 2.0.104", 2899 + "syn 2.0.109", 2808 2900 ] 2809 2901 2810 2902 [[package]] ··· 2858 2950 ] 2859 2951 2860 2952 [[package]] 2861 - name = "pkcs1" 2862 - version = "0.7.5" 2863 - source = "registry+https://github.com/rust-lang/crates.io-index" 2864 - checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" 2865 - dependencies = [ 2866 - "der", 2867 - "pkcs8", 2868 - "spki", 2869 - ] 2870 - 2871 - [[package]] 2872 - name = "pkcs8" 2873 - version = "0.10.2" 2874 - source = "registry+https://github.com/rust-lang/crates.io-index" 2875 - checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" 2876 - dependencies = [ 2877 - "der", 2878 - "spki", 2879 - ] 2880 - 2881 - [[package]] 2882 2953 name = "pkg-config" 2883 2954 version = "0.3.32" 2884 2955 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2886 2957 2887 2958 [[package]] 2888 2959 name = "plist" 2889 - version = "1.7.4" 2960 + version = "1.8.0" 2890 2961 source = "registry+https://github.com/rust-lang/crates.io-index" 2891 - checksum = "3af6b589e163c5a788fab00ce0c0366f6efbb9959c2f9874b224936af7fce7e1" 2962 + checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" 2892 2963 dependencies = [ 2893 2964 "base64 0.22.1", 2894 - "indexmap 2.10.0", 2895 - "quick-xml", 2965 + "indexmap 2.12.0", 2966 + "quick-xml 0.38.3", 2896 2967 "serde", 2897 2968 "time", 2898 2969 ] ··· 2911 2982 ] 2912 2983 2913 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]] 2914 2998 name = "polling" 2915 - version = "3.9.0" 2999 + version = "3.11.0" 2916 3000 source = "registry+https://github.com/rust-lang/crates.io-index" 2917 - checksum = "8ee9b2fa7a4517d2c91ff5bc6c297a427a96749d15f98fcdbb22c05571a4d4b7" 3001 + checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" 2918 3002 dependencies = [ 2919 3003 "cfg-if", 2920 3004 "concurrent-queue", 2921 3005 "hermit-abi", 2922 3006 "pin-project-lite", 2923 - "rustix", 2924 - "windows-sys 0.60.2", 3007 + "rustix 1.1.2", 3008 + "windows-sys 0.61.2", 2925 3009 ] 2926 3010 2927 3011 [[package]] 2928 3012 name = "potential_utf" 2929 - version = "0.1.2" 3013 + version = "0.1.4" 2930 3014 source = "registry+https://github.com/rust-lang/crates.io-index" 2931 - checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" 3015 + checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" 2932 3016 dependencies = [ 2933 3017 "zerovec", 2934 3018 ] ··· 2966 3050 2967 3051 [[package]] 2968 3052 name = "proc-macro-crate" 2969 - version = "2.0.0" 3053 + version = "2.0.2" 2970 3054 source = "registry+https://github.com/rust-lang/crates.io-index" 2971 - checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" 3055 + checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" 2972 3056 dependencies = [ 2973 - "toml_edit 0.20.7", 3057 + "toml_datetime 0.6.3", 3058 + "toml_edit 0.20.2", 2974 3059 ] 2975 3060 2976 3061 [[package]] 2977 3062 name = "proc-macro-crate" 2978 - version = "3.3.0" 3063 + version = "3.4.0" 2979 3064 source = "registry+https://github.com/rust-lang/crates.io-index" 2980 - checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" 3065 + checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" 2981 3066 dependencies = [ 2982 - "toml_edit 0.22.27", 3067 + "toml_edit 0.23.7", 2983 3068 ] 2984 3069 2985 3070 [[package]] ··· 3014 3099 3015 3100 [[package]] 3016 3101 name = "proc-macro2" 3017 - version = "1.0.95" 3102 + version = "1.0.103" 3018 3103 source = "registry+https://github.com/rust-lang/crates.io-index" 3019 - checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 3104 + checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" 3020 3105 dependencies = [ 3021 3106 "unicode-ident", 3022 3107 ] 3023 3108 3024 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]] 3025 3125 name = "quick-xml" 3026 - 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" 3027 3136 source = "registry+https://github.com/rust-lang/crates.io-index" 3028 - checksum = "8927b0664f5c5a98265138b7e3f90aa19a6b21353182469ace36d4ac527b7b1b" 3137 + checksum = "42a232e7487fc2ef313d96dde7948e7a3c05101870d8985e4fd8d26aedd27b89" 3029 3138 dependencies = [ 3030 3139 "memchr", 3031 3140 ] 3032 3141 3033 3142 [[package]] 3034 3143 name = "quote" 3035 - version = "1.0.40" 3144 + version = "1.0.42" 3036 3145 source = "registry+https://github.com/rust-lang/crates.io-index" 3037 - checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 3146 + checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" 3038 3147 dependencies = [ 3039 3148 "proc-macro2", 3040 3149 ] ··· 3071 3180 ] 3072 3181 3073 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]] 3074 3193 name = "rand_chacha" 3075 3194 version = "0.2.2" 3076 3195 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3091 3210 ] 3092 3211 3093 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]] 3094 3223 name = "rand_core" 3095 3224 version = "0.5.1" 3096 3225 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3106 3235 checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 3107 3236 dependencies = [ 3108 3237 "getrandom 0.2.16", 3238 + ] 3239 + 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", 3109 3247 ] 3110 3248 3111 3249 [[package]] ··· 3134 3272 3135 3273 [[package]] 3136 3274 name = "redox_syscall" 3137 - version = "0.5.17" 3275 + version = "0.5.18" 3138 3276 source = "registry+https://github.com/rust-lang/crates.io-index" 3139 - checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" 3277 + checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" 3140 3278 dependencies = [ 3141 - "bitflags 2.9.1", 3279 + "bitflags 2.10.0", 3142 3280 ] 3143 3281 3144 3282 [[package]] 3145 3283 name = "redox_users" 3146 - version = "0.5.0" 3284 + version = "0.5.2" 3147 3285 source = "registry+https://github.com/rust-lang/crates.io-index" 3148 - checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" 3286 + checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" 3149 3287 dependencies = [ 3150 3288 "getrandom 0.2.16", 3151 3289 "libredox", 3152 - "thiserror 2.0.12", 3290 + "thiserror 2.0.17", 3153 3291 ] 3154 3292 3155 3293 [[package]] 3156 3294 name = "ref-cast" 3157 - version = "1.0.24" 3295 + version = "1.0.25" 3158 3296 source = "registry+https://github.com/rust-lang/crates.io-index" 3159 - checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" 3297 + checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" 3160 3298 dependencies = [ 3161 3299 "ref-cast-impl", 3162 3300 ] 3163 3301 3164 3302 [[package]] 3165 3303 name = "ref-cast-impl" 3166 - version = "1.0.24" 3304 + version = "1.0.25" 3167 3305 source = "registry+https://github.com/rust-lang/crates.io-index" 3168 - checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" 3306 + checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" 3169 3307 dependencies = [ 3170 3308 "proc-macro2", 3171 3309 "quote", 3172 - "syn 2.0.104", 3310 + "syn 2.0.109", 3173 3311 ] 3174 3312 3175 3313 [[package]] 3176 3314 name = "regex" 3177 - version = "1.11.1" 3315 + version = "1.12.2" 3178 3316 source = "registry+https://github.com/rust-lang/crates.io-index" 3179 - checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 3317 + checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" 3180 3318 dependencies = [ 3181 3319 "aho-corasick", 3182 3320 "memchr", ··· 3186 3324 3187 3325 [[package]] 3188 3326 name = "regex-automata" 3189 - version = "0.4.9" 3327 + version = "0.4.13" 3190 3328 source = "registry+https://github.com/rust-lang/crates.io-index" 3191 - checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 3329 + checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" 3192 3330 dependencies = [ 3193 3331 "aho-corasick", 3194 3332 "memchr", ··· 3197 3335 3198 3336 [[package]] 3199 3337 name = "regex-syntax" 3200 - version = "0.8.5" 3338 + version = "0.8.8" 3201 3339 source = "registry+https://github.com/rust-lang/crates.io-index" 3202 - checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 3340 + checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" 3203 3341 3204 3342 [[package]] 3205 3343 name = "reqwest" 3206 - version = "0.12.22" 3344 + version = "0.12.24" 3207 3345 source = "registry+https://github.com/rust-lang/crates.io-index" 3208 - checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" 3346 + checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" 3209 3347 dependencies = [ 3210 3348 "base64 0.22.1", 3211 3349 "bytes", ··· 3237 3375 ] 3238 3376 3239 3377 [[package]] 3240 - name = "rsa" 3241 - version = "0.9.8" 3378 + name = "rfd" 3379 + version = "0.15.4" 3242 3380 source = "registry+https://github.com/rust-lang/crates.io-index" 3243 - checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" 3381 + checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" 3244 3382 dependencies = [ 3245 - "const-oid", 3246 - "digest", 3247 - "num-bigint-dig", 3248 - "num-integer", 3249 - "num-traits", 3250 - "pkcs1", 3251 - "pkcs8", 3252 - "rand_core 0.6.4", 3253 - "signature", 3254 - "spki", 3255 - "subtle", 3256 - "zeroize", 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", 3257 3400 ] 3258 3401 3259 3402 [[package]] 3260 - name = "rustc-demangle" 3261 - version = "0.1.26" 3262 - source = "registry+https://github.com/rust-lang/crates.io-index" 3263 - checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" 3264 - 3265 - [[package]] 3266 3403 name = "rustc_version" 3267 3404 version = "0.4.1" 3268 3405 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3273 3410 3274 3411 [[package]] 3275 3412 name = "rustix" 3276 - 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" 3277 3427 source = "registry+https://github.com/rust-lang/crates.io-index" 3278 - checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" 3428 + checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" 3279 3429 dependencies = [ 3280 - "bitflags 2.9.1", 3430 + "bitflags 2.10.0", 3281 3431 "errno", 3282 3432 "libc", 3283 - "linux-raw-sys", 3284 - "windows-sys 0.60.2", 3433 + "linux-raw-sys 0.11.0", 3434 + "windows-sys 0.61.2", 3285 3435 ] 3286 3436 3287 3437 [[package]] 3288 3438 name = "rustversion" 3289 - version = "1.0.21" 3439 + version = "1.0.22" 3290 3440 source = "registry+https://github.com/rust-lang/crates.io-index" 3291 - checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" 3441 + checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 3292 3442 3293 3443 [[package]] 3294 3444 name = "ryu" ··· 3334 3484 3335 3485 [[package]] 3336 3486 name = "schemars" 3337 - version = "1.0.4" 3487 + version = "1.1.0" 3338 3488 source = "registry+https://github.com/rust-lang/crates.io-index" 3339 - checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" 3489 + checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" 3340 3490 dependencies = [ 3341 3491 "dyn-clone", 3342 3492 "ref-cast", ··· 3353 3503 "proc-macro2", 3354 3504 "quote", 3355 3505 "serde_derive_internals", 3356 - "syn 2.0.104", 3506 + "syn 2.0.109", 3357 3507 ] 3358 3508 3359 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]] 3360 3516 name = "scopeguard" 3361 3517 version = "1.2.0" 3362 3518 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3382 3538 3383 3539 [[package]] 3384 3540 name = "semver" 3385 - version = "1.0.26" 3541 + version = "1.0.27" 3386 3542 source = "registry+https://github.com/rust-lang/crates.io-index" 3387 - checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" 3543 + checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" 3388 3544 dependencies = [ 3389 3545 "serde", 3546 + "serde_core", 3390 3547 ] 3391 3548 3392 3549 [[package]] 3393 3550 name = "serde" 3394 - version = "1.0.219" 3551 + version = "1.0.228" 3395 3552 source = "registry+https://github.com/rust-lang/crates.io-index" 3396 - checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 3553 + checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 3397 3554 dependencies = [ 3555 + "serde_core", 3398 3556 "serde_derive", 3399 3557 ] 3400 3558 3401 3559 [[package]] 3402 3560 name = "serde-untagged" 3403 - version = "0.1.7" 3561 + version = "0.1.9" 3404 3562 source = "registry+https://github.com/rust-lang/crates.io-index" 3405 - checksum = "299d9c19d7d466db4ab10addd5703e4c615dec2a5a16dbbafe191045e87ee66e" 3563 + checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" 3406 3564 dependencies = [ 3407 3565 "erased-serde", 3408 3566 "serde", 3567 + "serde_core", 3409 3568 "typeid", 3410 3569 ] 3411 3570 3412 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]] 3413 3581 name = "serde_derive" 3414 - version = "1.0.219" 3582 + version = "1.0.228" 3415 3583 source = "registry+https://github.com/rust-lang/crates.io-index" 3416 - checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 3584 + checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 3417 3585 dependencies = [ 3418 3586 "proc-macro2", 3419 3587 "quote", 3420 - "syn 2.0.104", 3588 + "syn 2.0.109", 3421 3589 ] 3422 3590 3423 3591 [[package]] ··· 3428 3596 dependencies = [ 3429 3597 "proc-macro2", 3430 3598 "quote", 3431 - "syn 2.0.104", 3599 + "syn 2.0.109", 3432 3600 ] 3433 3601 3434 3602 [[package]] 3435 3603 name = "serde_json" 3436 - version = "1.0.141" 3604 + version = "1.0.145" 3437 3605 source = "registry+https://github.com/rust-lang/crates.io-index" 3438 - checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" 3606 + checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" 3439 3607 dependencies = [ 3440 3608 "itoa", 3441 3609 "memchr", 3442 3610 "ryu", 3443 3611 "serde", 3612 + "serde_core", 3444 3613 ] 3445 3614 3446 3615 [[package]] ··· 3451 3620 dependencies = [ 3452 3621 "proc-macro2", 3453 3622 "quote", 3454 - "syn 2.0.104", 3623 + "syn 2.0.109", 3455 3624 ] 3456 3625 3457 3626 [[package]] ··· 3465 3634 3466 3635 [[package]] 3467 3636 name = "serde_spanned" 3468 - version = "1.0.0" 3637 + version = "1.0.3" 3469 3638 source = "registry+https://github.com/rust-lang/crates.io-index" 3470 - checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" 3639 + checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" 3471 3640 dependencies = [ 3472 - "serde", 3641 + "serde_core", 3473 3642 ] 3474 3643 3475 3644 [[package]] ··· 3486 3655 3487 3656 [[package]] 3488 3657 name = "serde_with" 3489 - version = "3.14.0" 3658 + version = "3.15.1" 3490 3659 source = "registry+https://github.com/rust-lang/crates.io-index" 3491 - checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" 3660 + checksum = "aa66c845eee442168b2c8134fec70ac50dc20e760769c8ba0ad1319ca1959b04" 3492 3661 dependencies = [ 3493 3662 "base64 0.22.1", 3494 3663 "chrono", 3495 3664 "hex", 3496 3665 "indexmap 1.9.3", 3497 - "indexmap 2.10.0", 3666 + "indexmap 2.12.0", 3498 3667 "schemars 0.9.0", 3499 - "schemars 1.0.4", 3500 - "serde", 3501 - "serde_derive", 3668 + "schemars 1.1.0", 3669 + "serde_core", 3502 3670 "serde_json", 3503 3671 "serde_with_macros", 3504 3672 "time", ··· 3506 3674 3507 3675 [[package]] 3508 3676 name = "serde_with_macros" 3509 - version = "3.14.0" 3677 + version = "3.15.1" 3510 3678 source = "registry+https://github.com/rust-lang/crates.io-index" 3511 - checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" 3679 + checksum = "b91a903660542fced4e99881aa481bdbaec1634568ee02e0b8bd57c64cb38955" 3512 3680 dependencies = [ 3513 3681 "darling", 3514 3682 "proc-macro2", 3515 3683 "quote", 3516 - "syn 2.0.104", 3684 + "syn 2.0.109", 3517 3685 ] 3518 3686 3519 3687 [[package]] 3520 3688 name = "serialize-to-javascript" 3521 - version = "0.1.1" 3689 + version = "0.1.2" 3522 3690 source = "registry+https://github.com/rust-lang/crates.io-index" 3523 - checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" 3691 + checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" 3524 3692 dependencies = [ 3525 3693 "serde", 3526 3694 "serde_json", ··· 3529 3697 3530 3698 [[package]] 3531 3699 name = "serialize-to-javascript-impl" 3532 - version = "0.1.1" 3700 + version = "0.1.2" 3533 3701 source = "registry+https://github.com/rust-lang/crates.io-index" 3534 - checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" 3702 + checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" 3535 3703 dependencies = [ 3536 3704 "proc-macro2", 3537 3705 "quote", 3538 - "syn 1.0.109", 3706 + "syn 2.0.109", 3539 3707 ] 3540 3708 3541 3709 [[package]] ··· 3549 3717 ] 3550 3718 3551 3719 [[package]] 3552 - name = "sha1" 3553 - version = "0.10.6" 3554 - source = "registry+https://github.com/rust-lang/crates.io-index" 3555 - checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 3556 - dependencies = [ 3557 - "cfg-if", 3558 - "cpufeatures", 3559 - "digest", 3560 - ] 3561 - 3562 - [[package]] 3563 3720 name = "sha2" 3564 3721 version = "0.10.9" 3565 3722 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3578 3735 3579 3736 [[package]] 3580 3737 name = "signal-hook-registry" 3581 - version = "1.4.5" 3738 + version = "1.4.6" 3582 3739 source = "registry+https://github.com/rust-lang/crates.io-index" 3583 - checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" 3740 + checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" 3584 3741 dependencies = [ 3585 3742 "libc", 3586 3743 ] 3587 3744 3588 3745 [[package]] 3589 - name = "signature" 3590 - version = "2.2.0" 3591 - source = "registry+https://github.com/rust-lang/crates.io-index" 3592 - checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 3593 - dependencies = [ 3594 - "digest", 3595 - "rand_core 0.6.4", 3596 - ] 3597 - 3598 - [[package]] 3599 3746 name = "simd-adler32" 3600 3747 version = "0.3.7" 3601 3748 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3615 3762 3616 3763 [[package]] 3617 3764 name = "slab" 3618 - version = "0.4.10" 3765 + version = "0.4.11" 3619 3766 source = "registry+https://github.com/rust-lang/crates.io-index" 3620 - checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" 3767 + checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" 3621 3768 3622 3769 [[package]] 3623 3770 name = "smallvec" 3624 3771 version = "1.15.1" 3625 3772 source = "registry+https://github.com/rust-lang/crates.io-index" 3626 3773 checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 3627 - dependencies = [ 3628 - "serde", 3629 - ] 3630 3774 3631 3775 [[package]] 3632 3776 name = "socket2" 3633 - version = "0.6.0" 3777 + version = "0.6.1" 3634 3778 source = "registry+https://github.com/rust-lang/crates.io-index" 3635 - checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" 3779 + checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" 3636 3780 dependencies = [ 3637 3781 "libc", 3638 - "windows-sys 0.59.0", 3782 + "windows-sys 0.60.2", 3639 3783 ] 3640 3784 3641 3785 [[package]] ··· 3646 3790 dependencies = [ 3647 3791 "bytemuck", 3648 3792 "cfg_aliases", 3649 - "core-graphics", 3793 + "core-graphics 0.24.0", 3650 3794 "foreign-types", 3651 3795 "js-sys", 3652 3796 "log", ··· 3687 3831 ] 3688 3832 3689 3833 [[package]] 3690 - name = "spin" 3691 - version = "0.9.8" 3692 - source = "registry+https://github.com/rust-lang/crates.io-index" 3693 - checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 3694 - dependencies = [ 3695 - "lock_api", 3696 - ] 3697 - 3698 - [[package]] 3699 - name = "spki" 3700 - version = "0.7.3" 3701 - source = "registry+https://github.com/rust-lang/crates.io-index" 3702 - checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" 3703 - dependencies = [ 3704 - "base64ct", 3705 - "der", 3706 - ] 3707 - 3708 - [[package]] 3709 - name = "sqlx" 3710 - version = "0.8.6" 3711 - source = "registry+https://github.com/rust-lang/crates.io-index" 3712 - checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" 3713 - dependencies = [ 3714 - "sqlx-core", 3715 - "sqlx-macros", 3716 - "sqlx-mysql", 3717 - "sqlx-postgres", 3718 - "sqlx-sqlite", 3719 - ] 3720 - 3721 - [[package]] 3722 - name = "sqlx-core" 3723 - version = "0.8.6" 3724 - source = "registry+https://github.com/rust-lang/crates.io-index" 3725 - checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" 3726 - dependencies = [ 3727 - "base64 0.22.1", 3728 - "bytes", 3729 - "crc", 3730 - "crossbeam-queue", 3731 - "either", 3732 - "event-listener", 3733 - "futures-core", 3734 - "futures-intrusive", 3735 - "futures-io", 3736 - "futures-util", 3737 - "hashbrown 0.15.4", 3738 - "hashlink", 3739 - "indexmap 2.10.0", 3740 - "log", 3741 - "memchr", 3742 - "once_cell", 3743 - "percent-encoding", 3744 - "serde", 3745 - "serde_json", 3746 - "sha2", 3747 - "smallvec", 3748 - "thiserror 2.0.12", 3749 - "tokio", 3750 - "tokio-stream", 3751 - "tracing", 3752 - "url", 3753 - ] 3754 - 3755 - [[package]] 3756 - name = "sqlx-macros" 3757 - version = "0.8.6" 3758 - source = "registry+https://github.com/rust-lang/crates.io-index" 3759 - checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" 3760 - dependencies = [ 3761 - "proc-macro2", 3762 - "quote", 3763 - "sqlx-core", 3764 - "sqlx-macros-core", 3765 - "syn 2.0.104", 3766 - ] 3767 - 3768 - [[package]] 3769 - name = "sqlx-macros-core" 3770 - version = "0.8.6" 3771 - source = "registry+https://github.com/rust-lang/crates.io-index" 3772 - checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" 3773 - dependencies = [ 3774 - "dotenvy", 3775 - "either", 3776 - "heck 0.5.0", 3777 - "hex", 3778 - "once_cell", 3779 - "proc-macro2", 3780 - "quote", 3781 - "serde", 3782 - "serde_json", 3783 - "sha2", 3784 - "sqlx-core", 3785 - "sqlx-mysql", 3786 - "sqlx-postgres", 3787 - "sqlx-sqlite", 3788 - "syn 2.0.104", 3789 - "tokio", 3790 - "url", 3791 - ] 3792 - 3793 - [[package]] 3794 - name = "sqlx-mysql" 3795 - version = "0.8.6" 3796 - source = "registry+https://github.com/rust-lang/crates.io-index" 3797 - checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" 3798 - dependencies = [ 3799 - "atoi", 3800 - "base64 0.22.1", 3801 - "bitflags 2.9.1", 3802 - "byteorder", 3803 - "bytes", 3804 - "crc", 3805 - "digest", 3806 - "dotenvy", 3807 - "either", 3808 - "futures-channel", 3809 - "futures-core", 3810 - "futures-io", 3811 - "futures-util", 3812 - "generic-array", 3813 - "hex", 3814 - "hkdf", 3815 - "hmac", 3816 - "itoa", 3817 - "log", 3818 - "md-5", 3819 - "memchr", 3820 - "once_cell", 3821 - "percent-encoding", 3822 - "rand 0.8.5", 3823 - "rsa", 3824 - "serde", 3825 - "sha1", 3826 - "sha2", 3827 - "smallvec", 3828 - "sqlx-core", 3829 - "stringprep", 3830 - "thiserror 2.0.12", 3831 - "tracing", 3832 - "whoami", 3833 - ] 3834 - 3835 - [[package]] 3836 - name = "sqlx-postgres" 3837 - version = "0.8.6" 3838 - source = "registry+https://github.com/rust-lang/crates.io-index" 3839 - checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" 3840 - dependencies = [ 3841 - "atoi", 3842 - "base64 0.22.1", 3843 - "bitflags 2.9.1", 3844 - "byteorder", 3845 - "crc", 3846 - "dotenvy", 3847 - "etcetera", 3848 - "futures-channel", 3849 - "futures-core", 3850 - "futures-util", 3851 - "hex", 3852 - "hkdf", 3853 - "hmac", 3854 - "home", 3855 - "itoa", 3856 - "log", 3857 - "md-5", 3858 - "memchr", 3859 - "once_cell", 3860 - "rand 0.8.5", 3861 - "serde", 3862 - "serde_json", 3863 - "sha2", 3864 - "smallvec", 3865 - "sqlx-core", 3866 - "stringprep", 3867 - "thiserror 2.0.12", 3868 - "tracing", 3869 - "whoami", 3870 - ] 3871 - 3872 - [[package]] 3873 - name = "sqlx-sqlite" 3874 - version = "0.8.6" 3875 - source = "registry+https://github.com/rust-lang/crates.io-index" 3876 - checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" 3877 - dependencies = [ 3878 - "atoi", 3879 - "flume", 3880 - "futures-channel", 3881 - "futures-core", 3882 - "futures-executor", 3883 - "futures-intrusive", 3884 - "futures-util", 3885 - "libsqlite3-sys", 3886 - "log", 3887 - "percent-encoding", 3888 - "serde", 3889 - "serde_urlencoded", 3890 - "sqlx-core", 3891 - "thiserror 2.0.12", 3892 - "tracing", 3893 - "url", 3894 - ] 3895 - 3896 - [[package]] 3897 3834 name = "stable_deref_trait" 3898 - version = "1.2.0" 3835 + version = "1.2.1" 3899 3836 source = "registry+https://github.com/rust-lang/crates.io-index" 3900 - checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 3837 + checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" 3901 3838 3902 3839 [[package]] 3903 3840 name = "static_assertions" ··· 3931 3868 ] 3932 3869 3933 3870 [[package]] 3934 - name = "stringprep" 3935 - version = "0.1.5" 3936 - source = "registry+https://github.com/rust-lang/crates.io-index" 3937 - checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" 3938 - dependencies = [ 3939 - "unicode-bidi", 3940 - "unicode-normalization", 3941 - "unicode-properties", 3942 - ] 3943 - 3944 - [[package]] 3945 3871 name = "strsim" 3946 3872 version = "0.11.1" 3947 3873 source = "registry+https://github.com/rust-lang/crates.io-index" 3948 3874 checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 3949 - 3950 - [[package]] 3951 - name = "subtle" 3952 - version = "2.6.1" 3953 - source = "registry+https://github.com/rust-lang/crates.io-index" 3954 - checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 3955 3875 3956 3876 [[package]] 3957 3877 name = "swift-rs" ··· 3977 3897 3978 3898 [[package]] 3979 3899 name = "syn" 3980 - version = "2.0.104" 3900 + version = "2.0.109" 3981 3901 source = "registry+https://github.com/rust-lang/crates.io-index" 3982 - checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" 3902 + checksum = "2f17c7e013e88258aa9543dcbe81aca68a667a9ac37cd69c9fbc07858bfe0e2f" 3983 3903 dependencies = [ 3984 3904 "proc-macro2", 3985 3905 "quote", ··· 4003 3923 dependencies = [ 4004 3924 "proc-macro2", 4005 3925 "quote", 4006 - "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", 4007 3936 ] 4008 3937 4009 3938 [[package]] ··· 4015 3944 "cfg-expr", 4016 3945 "heck 0.5.0", 4017 3946 "pkg-config", 4018 - "toml 0.8.23", 3947 + "toml 0.8.2", 4019 3948 "version-compare", 4020 3949 ] 4021 3950 4022 3951 [[package]] 4023 3952 name = "tao" 4024 - version = "0.34.0" 3953 + version = "0.34.5" 4025 3954 source = "registry+https://github.com/rust-lang/crates.io-index" 4026 - checksum = "49c380ca75a231b87b6c9dd86948f035012e7171d1a7c40a9c2890489a7ffd8a" 3955 + checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" 4027 3956 dependencies = [ 4028 - "bitflags 2.9.1", 3957 + "bitflags 2.10.0", 3958 + "block2 0.6.2", 4029 3959 "core-foundation", 4030 - "core-graphics", 3960 + "core-graphics 0.24.0", 4031 3961 "crossbeam-channel", 4032 3962 "dispatch", 4033 3963 "dlopen2", ··· 4042 3972 "ndk", 4043 3973 "ndk-context", 4044 3974 "ndk-sys", 4045 - "objc2 0.6.1", 3975 + "objc2 0.6.3", 4046 3976 "objc2-app-kit", 4047 - "objc2-foundation 0.3.1", 3977 + "objc2-foundation 0.3.2", 4048 3978 "once_cell", 4049 3979 "parking_lot", 4050 3980 "raw-window-handle", ··· 4053 3983 "unicode-segmentation", 4054 3984 "url", 4055 3985 "windows", 4056 - "windows-core", 3986 + "windows-core 0.61.2", 4057 3987 "windows-version", 4058 3988 "x11-dl", 4059 3989 ] ··· 4066 3996 dependencies = [ 4067 3997 "proc-macro2", 4068 3998 "quote", 4069 - "syn 2.0.104", 3999 + "syn 2.0.109", 4070 4000 ] 4071 4001 4072 4002 [[package]] ··· 4077 4007 4078 4008 [[package]] 4079 4009 name = "tauri" 4080 - version = "2.7.0" 4010 + version = "2.9.2" 4081 4011 source = "registry+https://github.com/rust-lang/crates.io-index" 4082 - checksum = "352a4bc7bf6c25f5624227e3641adf475a6535707451b09bb83271df8b7a6ac7" 4012 + checksum = "8bceb52453e507c505b330afe3398510e87f428ea42b6e76ecb6bd63b15965b5" 4083 4013 dependencies = [ 4084 4014 "anyhow", 4085 4015 "bytes", 4016 + "cookie", 4086 4017 "dirs", 4087 4018 "dunce", 4088 4019 "embed_plist", 4089 - "getrandom 0.3.3", 4020 + "getrandom 0.3.4", 4090 4021 "glob", 4091 4022 "gtk", 4092 4023 "heck 0.5.0", 4093 4024 "http", 4025 + "image", 4094 4026 "jni", 4095 4027 "libc", 4096 4028 "log", 4097 4029 "mime", 4098 4030 "muda", 4099 - "objc2 0.6.1", 4031 + "objc2 0.6.3", 4100 4032 "objc2-app-kit", 4101 - "objc2-foundation 0.3.1", 4033 + "objc2-foundation 0.3.2", 4102 4034 "objc2-ui-kit", 4035 + "objc2-web-kit", 4103 4036 "percent-encoding", 4104 4037 "plist", 4105 4038 "raw-window-handle", ··· 4114 4047 "tauri-runtime", 4115 4048 "tauri-runtime-wry", 4116 4049 "tauri-utils", 4117 - "thiserror 2.0.12", 4050 + "thiserror 2.0.17", 4118 4051 "tokio", 4119 4052 "tray-icon", 4120 4053 "url", 4121 - "urlpattern", 4122 4054 "webkit2gtk", 4123 4055 "webview2-com", 4124 4056 "window-vibrancy", ··· 4127 4059 4128 4060 [[package]] 4129 4061 name = "tauri-build" 4130 - version = "2.3.1" 4062 + version = "2.5.1" 4131 4063 source = "registry+https://github.com/rust-lang/crates.io-index" 4132 - checksum = "182d688496c06bf08ea896459bf483eb29cdff35c1c4c115fb14053514303064" 4064 + checksum = "a924b6c50fe83193f0f8b14072afa7c25b7a72752a2a73d9549b463f5fe91a38" 4133 4065 dependencies = [ 4134 4066 "anyhow", 4135 4067 "cargo_toml", ··· 4143 4075 "serde_json", 4144 4076 "tauri-utils", 4145 4077 "tauri-winres", 4146 - "toml 0.8.23", 4078 + "toml 0.9.8", 4147 4079 "walkdir", 4148 4080 ] 4149 4081 4150 4082 [[package]] 4151 4083 name = "tauri-codegen" 4152 - version = "2.3.1" 4084 + version = "2.5.0" 4153 4085 source = "registry+https://github.com/rust-lang/crates.io-index" 4154 - checksum = "b54a99a6cd8e01abcfa61508177e6096a4fe2681efecee9214e962f2f073ae4a" 4086 + checksum = "6c1fe64c74cc40f90848281a90058a6db931eb400b60205840e09801ee30f190" 4155 4087 dependencies = [ 4156 4088 "base64 0.22.1", 4157 4089 "brotli", 4158 4090 "ico", 4159 4091 "json-patch", 4160 4092 "plist", 4161 - "png", 4093 + "png 0.17.16", 4162 4094 "proc-macro2", 4163 4095 "quote", 4164 4096 "semver", 4165 4097 "serde", 4166 4098 "serde_json", 4167 4099 "sha2", 4168 - "syn 2.0.104", 4100 + "syn 2.0.109", 4169 4101 "tauri-utils", 4170 - "thiserror 2.0.12", 4102 + "thiserror 2.0.17", 4171 4103 "time", 4172 4104 "url", 4173 4105 "uuid", ··· 4176 4108 4177 4109 [[package]] 4178 4110 name = "tauri-macros" 4179 - version = "2.3.2" 4111 + version = "2.5.0" 4180 4112 source = "registry+https://github.com/rust-lang/crates.io-index" 4181 - checksum = "7945b14dc45e23532f2ded6e120170bbdd4af5ceaa45784a6b33d250fbce3f9e" 4113 + checksum = "260c5d2eb036b76206b9fca20b7be3614cfd21046c5396f7959e0e64a4b07f2f" 4182 4114 dependencies = [ 4183 4115 "heck 0.5.0", 4184 4116 "proc-macro2", 4185 4117 "quote", 4186 - "syn 2.0.104", 4118 + "syn 2.0.109", 4187 4119 "tauri-codegen", 4188 4120 "tauri-utils", 4189 4121 ] 4190 4122 4191 4123 [[package]] 4192 4124 name = "tauri-plugin" 4193 - version = "2.3.1" 4125 + version = "2.5.1" 4194 4126 source = "registry+https://github.com/rust-lang/crates.io-index" 4195 - checksum = "5bd5c1e56990c70a906ef67a9851bbdba9136d26075ee9a2b19c8b46986b3e02" 4127 + checksum = "076c78a474a7247c90cad0b6e87e593c4c620ed4efdb79cbe0214f0021f6c39d" 4196 4128 dependencies = [ 4197 4129 "anyhow", 4198 4130 "glob", ··· 4201 4133 "serde", 4202 4134 "serde_json", 4203 4135 "tauri-utils", 4204 - "toml 0.8.23", 4136 + "toml 0.9.8", 4205 4137 "walkdir", 4206 4138 ] 4207 4139 4208 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]] 4209 4196 name = "tauri-plugin-opener" 4210 - version = "2.4.0" 4197 + version = "2.5.2" 4211 4198 source = "registry+https://github.com/rust-lang/crates.io-index" 4212 - checksum = "ecee219f11cdac713ab32959db5d0cceec4810ba4f4458da992292ecf9660321" 4199 + checksum = "c26b72571d25dee25667940027114e60f569fc3974f8cefbe50c2cbc5fd65e3b" 4213 4200 dependencies = [ 4214 4201 "dunce", 4215 4202 "glob", 4216 4203 "objc2-app-kit", 4217 - "objc2-foundation 0.3.1", 4204 + "objc2-foundation 0.3.2", 4218 4205 "open", 4219 4206 "schemars 0.8.22", 4220 4207 "serde", 4221 4208 "serde_json", 4222 4209 "tauri", 4223 4210 "tauri-plugin", 4224 - "thiserror 2.0.12", 4211 + "thiserror 2.0.17", 4225 4212 "url", 4226 4213 "windows", 4227 4214 "zbus", 4215 + ] 4216 + 4217 + [[package]] 4218 + name = "tauri-plugin-os" 4219 + version = "2.3.2" 4220 + source = "registry+https://github.com/rust-lang/crates.io-index" 4221 + checksum = "d8f08346c8deb39e96f86973da0e2d76cbb933d7ac9b750f6dc4daf955a6f997" 4222 + dependencies = [ 4223 + "gethostname", 4224 + "log", 4225 + "os_info", 4226 + "serde", 4227 + "serde_json", 4228 + "serialize-to-javascript", 4229 + "sys-locale", 4230 + "tauri", 4231 + "tauri-plugin", 4232 + "thiserror 2.0.17", 4228 4233 ] 4229 4234 4230 4235 [[package]] 4231 4236 name = "tauri-runtime" 4232 - version = "2.7.1" 4237 + version = "2.9.1" 4233 4238 source = "registry+https://github.com/rust-lang/crates.io-index" 4234 - checksum = "2b1cc885be806ea15ff7b0eb47098a7b16323d9228876afda329e34e2d6c4676" 4239 + checksum = "9368f09358496f2229313fccb37682ad116b7f46fa76981efe116994a0628926" 4235 4240 dependencies = [ 4236 4241 "cookie", 4237 4242 "dpi", 4238 4243 "gtk", 4239 4244 "http", 4240 4245 "jni", 4241 - "objc2 0.6.1", 4246 + "objc2 0.6.3", 4242 4247 "objc2-ui-kit", 4248 + "objc2-web-kit", 4243 4249 "raw-window-handle", 4244 4250 "serde", 4245 4251 "serde_json", 4246 4252 "tauri-utils", 4247 - "thiserror 2.0.12", 4253 + "thiserror 2.0.17", 4248 4254 "url", 4255 + "webkit2gtk", 4256 + "webview2-com", 4249 4257 "windows", 4250 4258 ] 4251 4259 4252 4260 [[package]] 4253 4261 name = "tauri-runtime-wry" 4254 - version = "2.7.2" 4262 + version = "2.9.1" 4255 4263 source = "registry+https://github.com/rust-lang/crates.io-index" 4256 - checksum = "fe653a2fbbef19fe898efc774bc52c8742576342a33d3d028c189b57eb1d2439" 4264 + checksum = "929f5df216f5c02a9e894554401bcdab6eec3e39ec6a4a7731c7067fc8688a93" 4257 4265 dependencies = [ 4258 4266 "gtk", 4259 4267 "http", 4260 4268 "jni", 4261 4269 "log", 4262 - "objc2 0.6.1", 4270 + "objc2 0.6.3", 4263 4271 "objc2-app-kit", 4264 - "objc2-foundation 0.3.1", 4272 + "objc2-foundation 0.3.2", 4265 4273 "once_cell", 4266 4274 "percent-encoding", 4267 4275 "raw-window-handle", ··· 4278 4286 4279 4287 [[package]] 4280 4288 name = "tauri-utils" 4281 - version = "2.6.0" 4289 + version = "2.8.0" 4282 4290 source = "registry+https://github.com/rust-lang/crates.io-index" 4283 - checksum = "9330c15cabfe1d9f213478c9e8ec2b0c76dab26bb6f314b8ad1c8a568c1d186e" 4291 + checksum = "f6b8bbe426abdbf52d050e52ed693130dbd68375b9ad82a3fb17efb4c8d85673" 4284 4292 dependencies = [ 4285 4293 "anyhow", 4286 4294 "brotli", ··· 4306 4314 "serde_json", 4307 4315 "serde_with", 4308 4316 "swift-rs", 4309 - "thiserror 2.0.12", 4310 - "toml 0.8.23", 4317 + "thiserror 2.0.17", 4318 + "toml 0.9.8", 4311 4319 "url", 4312 4320 "urlpattern", 4313 4321 "uuid", ··· 4316 4324 4317 4325 [[package]] 4318 4326 name = "tauri-winres" 4319 - version = "0.3.1" 4327 + version = "0.3.3" 4320 4328 source = "registry+https://github.com/rust-lang/crates.io-index" 4321 - checksum = "e8d321dbc6f998d825ab3f0d62673e810c861aac2d0de2cc2c395328f1d113b4" 4329 + checksum = "fd21509dd1fa9bd355dc29894a6ff10635880732396aa38c0066c1e6c1ab8074" 4322 4330 dependencies = [ 4323 4331 "embed-resource", 4324 - "indexmap 2.10.0", 4325 - "toml 0.8.23", 4332 + "toml 0.9.8", 4326 4333 ] 4327 4334 4328 4335 [[package]] 4329 4336 name = "tempfile" 4330 - version = "3.20.0" 4337 + version = "3.23.0" 4331 4338 source = "registry+https://github.com/rust-lang/crates.io-index" 4332 - checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" 4339 + checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" 4333 4340 dependencies = [ 4334 4341 "fastrand", 4335 - "getrandom 0.3.3", 4342 + "getrandom 0.3.4", 4336 4343 "once_cell", 4337 - "rustix", 4338 - "windows-sys 0.59.0", 4344 + "rustix 1.1.2", 4345 + "windows-sys 0.61.2", 4339 4346 ] 4340 4347 4341 4348 [[package]] ··· 4360 4367 4361 4368 [[package]] 4362 4369 name = "thiserror" 4363 - version = "2.0.12" 4370 + version = "2.0.17" 4364 4371 source = "registry+https://github.com/rust-lang/crates.io-index" 4365 - checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 4372 + checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" 4366 4373 dependencies = [ 4367 - "thiserror-impl 2.0.12", 4374 + "thiserror-impl 2.0.17", 4368 4375 ] 4369 4376 4370 4377 [[package]] ··· 4375 4382 dependencies = [ 4376 4383 "proc-macro2", 4377 4384 "quote", 4378 - "syn 2.0.104", 4385 + "syn 2.0.109", 4379 4386 ] 4380 4387 4381 4388 [[package]] 4382 4389 name = "thiserror-impl" 4383 - version = "2.0.12" 4390 + version = "2.0.17" 4384 4391 source = "registry+https://github.com/rust-lang/crates.io-index" 4385 - checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 4392 + checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" 4386 4393 dependencies = [ 4387 4394 "proc-macro2", 4388 4395 "quote", 4389 - "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", 4390 4411 ] 4391 4412 4392 4413 [[package]] 4393 4414 name = "time" 4394 - version = "0.3.41" 4415 + version = "0.3.44" 4395 4416 source = "registry+https://github.com/rust-lang/crates.io-index" 4396 - checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" 4417 + checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" 4397 4418 dependencies = [ 4398 4419 "deranged", 4399 4420 "itoa", ··· 4406 4427 4407 4428 [[package]] 4408 4429 name = "time-core" 4409 - version = "0.1.4" 4430 + version = "0.1.6" 4410 4431 source = "registry+https://github.com/rust-lang/crates.io-index" 4411 - checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" 4432 + checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" 4412 4433 4413 4434 [[package]] 4414 4435 name = "time-macros" 4415 - version = "0.2.22" 4436 + version = "0.2.24" 4416 4437 source = "registry+https://github.com/rust-lang/crates.io-index" 4417 - checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" 4438 + checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" 4418 4439 dependencies = [ 4419 4440 "num-conv", 4420 4441 "time-core", ··· 4422 4443 4423 4444 [[package]] 4424 4445 name = "tinystr" 4425 - version = "0.8.1" 4446 + version = "0.8.2" 4426 4447 source = "registry+https://github.com/rust-lang/crates.io-index" 4427 - checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 4448 + checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" 4428 4449 dependencies = [ 4429 4450 "displaydoc", 4430 4451 "zerovec", 4431 4452 ] 4432 4453 4433 4454 [[package]] 4434 - name = "tinyvec" 4435 - version = "1.9.0" 4436 - source = "registry+https://github.com/rust-lang/crates.io-index" 4437 - checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" 4438 - dependencies = [ 4439 - "tinyvec_macros", 4440 - ] 4441 - 4442 - [[package]] 4443 - name = "tinyvec_macros" 4444 - version = "0.1.1" 4445 - source = "registry+https://github.com/rust-lang/crates.io-index" 4446 - checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 4447 - 4448 - [[package]] 4449 4455 name = "tokio" 4450 - version = "1.47.0" 4456 + version = "1.48.0" 4451 4457 source = "registry+https://github.com/rust-lang/crates.io-index" 4452 - checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35" 4458 + checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" 4453 4459 dependencies = [ 4454 - "backtrace", 4455 4460 "bytes", 4456 - "io-uring", 4457 4461 "libc", 4458 4462 "mio", 4459 4463 "pin-project-lite", 4460 - "slab", 4464 + "signal-hook-registry", 4461 4465 "socket2", 4462 4466 "tokio-macros", 4463 - "windows-sys 0.59.0", 4467 + "tracing", 4468 + "windows-sys 0.61.2", 4464 4469 ] 4465 4470 4466 4471 [[package]] 4467 4472 name = "tokio-macros" 4468 - version = "2.5.0" 4473 + version = "2.6.0" 4469 4474 source = "registry+https://github.com/rust-lang/crates.io-index" 4470 - checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 4475 + checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" 4471 4476 dependencies = [ 4472 4477 "proc-macro2", 4473 4478 "quote", 4474 - "syn 2.0.104", 4475 - ] 4476 - 4477 - [[package]] 4478 - name = "tokio-stream" 4479 - version = "0.1.17" 4480 - source = "registry+https://github.com/rust-lang/crates.io-index" 4481 - checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" 4482 - dependencies = [ 4483 - "futures-core", 4484 - "pin-project-lite", 4485 - "tokio", 4479 + "syn 2.0.109", 4486 4480 ] 4487 4481 4488 4482 [[package]] 4489 4483 name = "tokio-util" 4490 - version = "0.7.15" 4484 + version = "0.7.17" 4491 4485 source = "registry+https://github.com/rust-lang/crates.io-index" 4492 - checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" 4486 + checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" 4493 4487 dependencies = [ 4494 4488 "bytes", 4495 4489 "futures-core", ··· 4500 4494 4501 4495 [[package]] 4502 4496 name = "toml" 4503 - version = "0.8.23" 4497 + version = "0.8.2" 4504 4498 source = "registry+https://github.com/rust-lang/crates.io-index" 4505 - checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" 4499 + checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" 4506 4500 dependencies = [ 4507 4501 "serde", 4508 4502 "serde_spanned 0.6.9", 4509 - "toml_datetime 0.6.11", 4510 - "toml_edit 0.22.27", 4503 + "toml_datetime 0.6.3", 4504 + "toml_edit 0.20.2", 4511 4505 ] 4512 4506 4513 4507 [[package]] 4514 4508 name = "toml" 4515 - version = "0.9.3" 4509 + version = "0.9.8" 4516 4510 source = "registry+https://github.com/rust-lang/crates.io-index" 4517 - checksum = "e06723639aaded957e5a80be250c1f82f274b9d23ebb4d94163668470623461c" 4511 + checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" 4518 4512 dependencies = [ 4519 - "indexmap 2.10.0", 4520 - "serde", 4521 - "serde_spanned 1.0.0", 4522 - "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", 4523 4517 "toml_parser", 4524 4518 "toml_writer", 4525 - "winnow 0.7.12", 4519 + "winnow 0.7.13", 4526 4520 ] 4527 4521 4528 4522 [[package]] 4529 4523 name = "toml_datetime" 4530 - version = "0.6.11" 4524 + version = "0.6.3" 4531 4525 source = "registry+https://github.com/rust-lang/crates.io-index" 4532 - checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" 4526 + checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" 4533 4527 dependencies = [ 4534 4528 "serde", 4535 4529 ] 4536 4530 4537 4531 [[package]] 4538 4532 name = "toml_datetime" 4539 - version = "0.7.0" 4533 + version = "0.7.3" 4540 4534 source = "registry+https://github.com/rust-lang/crates.io-index" 4541 - checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" 4535 + checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" 4542 4536 dependencies = [ 4543 - "serde", 4537 + "serde_core", 4544 4538 ] 4545 4539 4546 4540 [[package]] ··· 4549 4543 source = "registry+https://github.com/rust-lang/crates.io-index" 4550 4544 checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" 4551 4545 dependencies = [ 4552 - "indexmap 2.10.0", 4553 - "toml_datetime 0.6.11", 4546 + "indexmap 2.12.0", 4547 + "toml_datetime 0.6.3", 4554 4548 "winnow 0.5.40", 4555 4549 ] 4556 4550 4557 4551 [[package]] 4558 4552 name = "toml_edit" 4559 - version = "0.20.7" 4553 + version = "0.20.2" 4560 4554 source = "registry+https://github.com/rust-lang/crates.io-index" 4561 - checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" 4555 + checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" 4562 4556 dependencies = [ 4563 - "indexmap 2.10.0", 4564 - "toml_datetime 0.6.11", 4557 + "indexmap 2.12.0", 4558 + "serde", 4559 + "serde_spanned 0.6.9", 4560 + "toml_datetime 0.6.3", 4565 4561 "winnow 0.5.40", 4566 4562 ] 4567 4563 4568 4564 [[package]] 4569 4565 name = "toml_edit" 4570 - version = "0.22.27" 4566 + version = "0.23.7" 4571 4567 source = "registry+https://github.com/rust-lang/crates.io-index" 4572 - checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" 4568 + checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" 4573 4569 dependencies = [ 4574 - "indexmap 2.10.0", 4575 - "serde", 4576 - "serde_spanned 0.6.9", 4577 - "toml_datetime 0.6.11", 4578 - "toml_write", 4579 - "winnow 0.7.12", 4570 + "indexmap 2.12.0", 4571 + "toml_datetime 0.7.3", 4572 + "toml_parser", 4573 + "winnow 0.7.13", 4580 4574 ] 4581 4575 4582 4576 [[package]] 4583 4577 name = "toml_parser" 4584 - version = "1.0.1" 4578 + version = "1.0.4" 4585 4579 source = "registry+https://github.com/rust-lang/crates.io-index" 4586 - checksum = "97200572db069e74c512a14117b296ba0a80a30123fbbb5aa1f4a348f639ca30" 4580 + checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" 4587 4581 dependencies = [ 4588 - "winnow 0.7.12", 4582 + "winnow 0.7.13", 4589 4583 ] 4590 4584 4591 4585 [[package]] 4592 - name = "toml_write" 4593 - version = "0.1.2" 4594 - source = "registry+https://github.com/rust-lang/crates.io-index" 4595 - checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" 4596 - 4597 - [[package]] 4598 4586 name = "toml_writer" 4599 - version = "1.0.2" 4587 + version = "1.0.4" 4600 4588 source = "registry+https://github.com/rust-lang/crates.io-index" 4601 - checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" 4589 + checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" 4602 4590 4603 4591 [[package]] 4604 4592 name = "tower" ··· 4621 4609 source = "registry+https://github.com/rust-lang/crates.io-index" 4622 4610 checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" 4623 4611 dependencies = [ 4624 - "bitflags 2.9.1", 4612 + "bitflags 2.10.0", 4625 4613 "bytes", 4626 4614 "futures-util", 4627 4615 "http", ··· 4651 4639 source = "registry+https://github.com/rust-lang/crates.io-index" 4652 4640 checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 4653 4641 dependencies = [ 4654 - "log", 4655 4642 "pin-project-lite", 4656 4643 "tracing-attributes", 4657 4644 "tracing-core", ··· 4665 4652 dependencies = [ 4666 4653 "proc-macro2", 4667 4654 "quote", 4668 - "syn 2.0.104", 4655 + "syn 2.0.109", 4669 4656 ] 4670 4657 4671 4658 [[package]] ··· 4679 4666 4680 4667 [[package]] 4681 4668 name = "tray-icon" 4682 - version = "0.21.0" 4669 + version = "0.21.2" 4683 4670 source = "registry+https://github.com/rust-lang/crates.io-index" 4684 - checksum = "2da75ec677957aa21f6e0b361df0daab972f13a5bee3606de0638fd4ee1c666a" 4671 + checksum = "e3d5572781bee8e3f994d7467084e1b1fd7a93ce66bd480f8156ba89dee55a2b" 4685 4672 dependencies = [ 4686 4673 "crossbeam-channel", 4687 4674 "dirs", 4688 4675 "libappindicator", 4689 4676 "muda", 4690 - "objc2 0.6.1", 4677 + "objc2 0.6.3", 4691 4678 "objc2-app-kit", 4692 4679 "objc2-core-foundation", 4693 4680 "objc2-core-graphics", 4694 - "objc2-foundation 0.3.1", 4681 + "objc2-foundation 0.3.2", 4695 4682 "once_cell", 4696 - "png", 4683 + "png 0.17.16", 4697 4684 "serde", 4698 - "thiserror 2.0.12", 4699 - "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", 4700 4698 ] 4701 4699 4702 4700 [[package]] ··· 4713 4711 4714 4712 [[package]] 4715 4713 name = "typenum" 4716 - version = "1.18.0" 4714 + version = "1.19.0" 4717 4715 source = "registry+https://github.com/rust-lang/crates.io-index" 4718 - checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 4716 + checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" 4719 4717 4720 4718 [[package]] 4721 4719 name = "uds_windows" ··· 4768 4766 dependencies = [ 4769 4767 "unic-common", 4770 4768 ] 4771 - 4772 - [[package]] 4773 - name = "unicode-bidi" 4774 - version = "0.3.18" 4775 - source = "registry+https://github.com/rust-lang/crates.io-index" 4776 - checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" 4777 4769 4778 4770 [[package]] 4779 4771 name = "unicode-ident" 4780 - version = "1.0.18" 4772 + version = "1.0.22" 4781 4773 source = "registry+https://github.com/rust-lang/crates.io-index" 4782 - checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 4783 - 4784 - [[package]] 4785 - name = "unicode-normalization" 4786 - version = "0.1.24" 4787 - source = "registry+https://github.com/rust-lang/crates.io-index" 4788 - checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" 4789 - dependencies = [ 4790 - "tinyvec", 4791 - ] 4792 - 4793 - [[package]] 4794 - name = "unicode-properties" 4795 - version = "0.1.3" 4796 - source = "registry+https://github.com/rust-lang/crates.io-index" 4797 - checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" 4774 + checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" 4798 4775 4799 4776 [[package]] 4800 4777 name = "unicode-segmentation" ··· 4804 4781 4805 4782 [[package]] 4806 4783 name = "url" 4807 - version = "2.5.4" 4784 + version = "2.5.7" 4808 4785 source = "registry+https://github.com/rust-lang/crates.io-index" 4809 - checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 4786 + checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" 4810 4787 dependencies = [ 4811 4788 "form_urlencoded", 4812 4789 "idna", ··· 4840 4817 4841 4818 [[package]] 4842 4819 name = "uuid" 4843 - version = "1.17.0" 4820 + version = "1.18.1" 4844 4821 source = "registry+https://github.com/rust-lang/crates.io-index" 4845 - checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" 4822 + checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" 4846 4823 dependencies = [ 4847 - "getrandom 0.3.3", 4824 + "getrandom 0.3.4", 4848 4825 "js-sys", 4849 4826 "serde", 4850 4827 "wasm-bindgen", 4851 4828 ] 4852 4829 4853 4830 [[package]] 4854 - name = "vcpkg" 4855 - version = "0.2.15" 4856 - source = "registry+https://github.com/rust-lang/crates.io-index" 4857 - checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 4858 - 4859 - [[package]] 4860 4831 name = "version-compare" 4861 - version = "0.2.0" 4832 + version = "0.2.1" 4862 4833 source = "registry+https://github.com/rust-lang/crates.io-index" 4863 - checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" 4834 + checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" 4864 4835 4865 4836 [[package]] 4866 4837 name = "version_check" ··· 4920 4891 checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 4921 4892 4922 4893 [[package]] 4923 - name = "wasi" 4924 - version = "0.14.2+wasi-0.2.4" 4894 + name = "wasip2" 4895 + version = "1.0.1+wasi-0.2.4" 4925 4896 source = "registry+https://github.com/rust-lang/crates.io-index" 4926 - checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 4897 + checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" 4927 4898 dependencies = [ 4928 - "wit-bindgen-rt", 4899 + "wit-bindgen", 4929 4900 ] 4930 - 4931 - [[package]] 4932 - name = "wasite" 4933 - version = "0.1.0" 4934 - source = "registry+https://github.com/rust-lang/crates.io-index" 4935 - checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" 4936 4901 4937 4902 [[package]] 4938 4903 name = "wasm-bindgen" 4939 - version = "0.2.100" 4904 + version = "0.2.105" 4940 4905 source = "registry+https://github.com/rust-lang/crates.io-index" 4941 - checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 4906 + checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" 4942 4907 dependencies = [ 4943 4908 "cfg-if", 4944 4909 "once_cell", 4945 4910 "rustversion", 4946 4911 "wasm-bindgen-macro", 4947 - ] 4948 - 4949 - [[package]] 4950 - name = "wasm-bindgen-backend" 4951 - version = "0.2.100" 4952 - source = "registry+https://github.com/rust-lang/crates.io-index" 4953 - checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 4954 - dependencies = [ 4955 - "bumpalo", 4956 - "log", 4957 - "proc-macro2", 4958 - "quote", 4959 - "syn 2.0.104", 4960 4912 "wasm-bindgen-shared", 4961 4913 ] 4962 4914 4963 4915 [[package]] 4964 4916 name = "wasm-bindgen-futures" 4965 - version = "0.4.50" 4917 + version = "0.4.55" 4966 4918 source = "registry+https://github.com/rust-lang/crates.io-index" 4967 - checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 4919 + checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" 4968 4920 dependencies = [ 4969 4921 "cfg-if", 4970 4922 "js-sys", ··· 4975 4927 4976 4928 [[package]] 4977 4929 name = "wasm-bindgen-macro" 4978 - version = "0.2.100" 4930 + version = "0.2.105" 4979 4931 source = "registry+https://github.com/rust-lang/crates.io-index" 4980 - checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 4932 + checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" 4981 4933 dependencies = [ 4982 4934 "quote", 4983 4935 "wasm-bindgen-macro-support", ··· 4985 4937 4986 4938 [[package]] 4987 4939 name = "wasm-bindgen-macro-support" 4988 - version = "0.2.100" 4940 + version = "0.2.105" 4989 4941 source = "registry+https://github.com/rust-lang/crates.io-index" 4990 - checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 4942 + checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" 4991 4943 dependencies = [ 4944 + "bumpalo", 4992 4945 "proc-macro2", 4993 4946 "quote", 4994 - "syn 2.0.104", 4995 - "wasm-bindgen-backend", 4947 + "syn 2.0.109", 4996 4948 "wasm-bindgen-shared", 4997 4949 ] 4998 4950 4999 4951 [[package]] 5000 4952 name = "wasm-bindgen-shared" 5001 - version = "0.2.100" 4953 + version = "0.2.105" 5002 4954 source = "registry+https://github.com/rust-lang/crates.io-index" 5003 - checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 4955 + checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" 5004 4956 dependencies = [ 5005 4957 "unicode-ident", 5006 4958 ] ··· 5019 4971 ] 5020 4972 5021 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]] 5022 5047 name = "web-sys" 5023 - version = "0.3.77" 5048 + version = "0.3.82" 5024 5049 source = "registry+https://github.com/rust-lang/crates.io-index" 5025 - checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 5050 + checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" 5026 5051 dependencies = [ 5027 5052 "js-sys", 5028 5053 "wasm-bindgen", ··· 5081 5106 "webview2-com-macros", 5082 5107 "webview2-com-sys", 5083 5108 "windows", 5084 - "windows-core", 5109 + "windows-core 0.61.2", 5085 5110 "windows-implement", 5086 5111 "windows-interface", 5087 5112 ] ··· 5094 5119 dependencies = [ 5095 5120 "proc-macro2", 5096 5121 "quote", 5097 - "syn 2.0.104", 5122 + "syn 2.0.109", 5098 5123 ] 5099 5124 5100 5125 [[package]] ··· 5103 5128 source = "registry+https://github.com/rust-lang/crates.io-index" 5104 5129 checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" 5105 5130 dependencies = [ 5106 - "thiserror 2.0.12", 5131 + "thiserror 2.0.17", 5107 5132 "windows", 5108 - "windows-core", 5133 + "windows-core 0.61.2", 5109 5134 ] 5110 5135 5111 5136 [[package]] 5112 - name = "whoami" 5113 - version = "1.6.0" 5137 + name = "weezl" 5138 + version = "0.1.12" 5114 5139 source = "registry+https://github.com/rust-lang/crates.io-index" 5115 - checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7" 5116 - dependencies = [ 5117 - "redox_syscall", 5118 - "wasite", 5119 - ] 5140 + checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" 5120 5141 5121 5142 [[package]] 5122 5143 name = "winapi" ··· 5136 5157 5137 5158 [[package]] 5138 5159 name = "winapi-util" 5139 - version = "0.1.9" 5160 + version = "0.1.11" 5140 5161 source = "registry+https://github.com/rust-lang/crates.io-index" 5141 - checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 5162 + checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" 5142 5163 dependencies = [ 5143 - "windows-sys 0.59.0", 5164 + "windows-sys 0.61.2", 5144 5165 ] 5145 5166 5146 5167 [[package]] ··· 5155 5176 source = "registry+https://github.com/rust-lang/crates.io-index" 5156 5177 checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" 5157 5178 dependencies = [ 5158 - "objc2 0.6.1", 5179 + "objc2 0.6.3", 5159 5180 "objc2-app-kit", 5160 5181 "objc2-core-foundation", 5161 - "objc2-foundation 0.3.1", 5182 + "objc2-foundation 0.3.2", 5162 5183 "raw-window-handle", 5163 5184 "windows-sys 0.59.0", 5164 5185 "windows-version", ··· 5171 5192 checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" 5172 5193 dependencies = [ 5173 5194 "windows-collections", 5174 - "windows-core", 5195 + "windows-core 0.61.2", 5175 5196 "windows-future", 5176 - "windows-link", 5197 + "windows-link 0.1.3", 5177 5198 "windows-numerics", 5178 5199 ] 5179 5200 ··· 5183 5204 source = "registry+https://github.com/rust-lang/crates.io-index" 5184 5205 checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" 5185 5206 dependencies = [ 5186 - "windows-core", 5207 + "windows-core 0.61.2", 5187 5208 ] 5188 5209 5189 5210 [[package]] ··· 5194 5215 dependencies = [ 5195 5216 "windows-implement", 5196 5217 "windows-interface", 5197 - "windows-link", 5198 - "windows-result", 5199 - "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", 5200 5234 ] 5201 5235 5202 5236 [[package]] ··· 5205 5239 source = "registry+https://github.com/rust-lang/crates.io-index" 5206 5240 checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" 5207 5241 dependencies = [ 5208 - "windows-core", 5209 - "windows-link", 5242 + "windows-core 0.61.2", 5243 + "windows-link 0.1.3", 5210 5244 "windows-threading", 5211 5245 ] 5212 5246 5213 5247 [[package]] 5214 5248 name = "windows-implement" 5215 - version = "0.60.0" 5249 + version = "0.60.2" 5216 5250 source = "registry+https://github.com/rust-lang/crates.io-index" 5217 - checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" 5251 + checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" 5218 5252 dependencies = [ 5219 5253 "proc-macro2", 5220 5254 "quote", 5221 - "syn 2.0.104", 5255 + "syn 2.0.109", 5222 5256 ] 5223 5257 5224 5258 [[package]] 5225 5259 name = "windows-interface" 5226 - version = "0.59.1" 5260 + version = "0.59.3" 5227 5261 source = "registry+https://github.com/rust-lang/crates.io-index" 5228 - checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" 5262 + checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" 5229 5263 dependencies = [ 5230 5264 "proc-macro2", 5231 5265 "quote", 5232 - "syn 2.0.104", 5266 + "syn 2.0.109", 5233 5267 ] 5234 5268 5235 5269 [[package]] ··· 5239 5273 checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 5240 5274 5241 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]] 5242 5282 name = "windows-numerics" 5243 5283 version = "0.2.0" 5244 5284 source = "registry+https://github.com/rust-lang/crates.io-index" 5245 5285 checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" 5246 5286 dependencies = [ 5247 - "windows-core", 5248 - "windows-link", 5287 + "windows-core 0.61.2", 5288 + "windows-link 0.1.3", 5249 5289 ] 5250 5290 5251 5291 [[package]] ··· 5254 5294 source = "registry+https://github.com/rust-lang/crates.io-index" 5255 5295 checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" 5256 5296 dependencies = [ 5257 - "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", 5258 5307 ] 5259 5308 5260 5309 [[package]] ··· 5263 5312 source = "registry+https://github.com/rust-lang/crates.io-index" 5264 5313 checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" 5265 5314 dependencies = [ 5266 - "windows-link", 5315 + "windows-link 0.1.3", 5267 5316 ] 5268 5317 5269 5318 [[package]] 5270 - name = "windows-sys" 5271 - version = "0.45.0" 5319 + name = "windows-strings" 5320 + version = "0.5.1" 5272 5321 source = "registry+https://github.com/rust-lang/crates.io-index" 5273 - checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 5322 + checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" 5274 5323 dependencies = [ 5275 - "windows-targets 0.42.2", 5324 + "windows-link 0.2.1", 5276 5325 ] 5277 5326 5278 5327 [[package]] 5279 5328 name = "windows-sys" 5280 - version = "0.48.0" 5329 + version = "0.45.0" 5281 5330 source = "registry+https://github.com/rust-lang/crates.io-index" 5282 - checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 5331 + checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 5283 5332 dependencies = [ 5284 - "windows-targets 0.48.5", 5333 + "windows-targets 0.42.2", 5285 5334 ] 5286 5335 5287 5336 [[package]] ··· 5299 5348 source = "registry+https://github.com/rust-lang/crates.io-index" 5300 5349 checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 5301 5350 dependencies = [ 5302 - "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", 5303 5361 ] 5304 5362 5305 5363 [[package]] ··· 5319 5377 5320 5378 [[package]] 5321 5379 name = "windows-targets" 5322 - version = "0.48.5" 5323 - source = "registry+https://github.com/rust-lang/crates.io-index" 5324 - checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 5325 - dependencies = [ 5326 - "windows_aarch64_gnullvm 0.48.5", 5327 - "windows_aarch64_msvc 0.48.5", 5328 - "windows_i686_gnu 0.48.5", 5329 - "windows_i686_msvc 0.48.5", 5330 - "windows_x86_64_gnu 0.48.5", 5331 - "windows_x86_64_gnullvm 0.48.5", 5332 - "windows_x86_64_msvc 0.48.5", 5333 - ] 5334 - 5335 - [[package]] 5336 - name = "windows-targets" 5337 5380 version = "0.52.6" 5338 5381 source = "registry+https://github.com/rust-lang/crates.io-index" 5339 5382 checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" ··· 5350 5393 5351 5394 [[package]] 5352 5395 name = "windows-targets" 5353 - version = "0.53.3" 5396 + version = "0.53.5" 5354 5397 source = "registry+https://github.com/rust-lang/crates.io-index" 5355 - checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" 5398 + checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" 5356 5399 dependencies = [ 5357 - "windows-link", 5358 - "windows_aarch64_gnullvm 0.53.0", 5359 - "windows_aarch64_msvc 0.53.0", 5360 - "windows_i686_gnu 0.53.0", 5361 - "windows_i686_gnullvm 0.53.0", 5362 - "windows_i686_msvc 0.53.0", 5363 - "windows_x86_64_gnu 0.53.0", 5364 - "windows_x86_64_gnullvm 0.53.0", 5365 - "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", 5366 5409 ] 5367 5410 5368 5411 [[package]] ··· 5371 5414 source = "registry+https://github.com/rust-lang/crates.io-index" 5372 5415 checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" 5373 5416 dependencies = [ 5374 - "windows-link", 5417 + "windows-link 0.1.3", 5375 5418 ] 5376 5419 5377 5420 [[package]] 5378 5421 name = "windows-version" 5379 - version = "0.1.4" 5422 + version = "0.1.7" 5380 5423 source = "registry+https://github.com/rust-lang/crates.io-index" 5381 - checksum = "e04a5c6627e310a23ad2358483286c7df260c964eb2d003d8efd6d0f4e79265c" 5424 + checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" 5382 5425 dependencies = [ 5383 - "windows-link", 5426 + "windows-link 0.2.1", 5384 5427 ] 5385 5428 5386 5429 [[package]] ··· 5388 5431 version = "0.42.2" 5389 5432 source = "registry+https://github.com/rust-lang/crates.io-index" 5390 5433 checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 5391 - 5392 - [[package]] 5393 - name = "windows_aarch64_gnullvm" 5394 - version = "0.48.5" 5395 - source = "registry+https://github.com/rust-lang/crates.io-index" 5396 - checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 5397 5434 5398 5435 [[package]] 5399 5436 name = "windows_aarch64_gnullvm" ··· 5403 5440 5404 5441 [[package]] 5405 5442 name = "windows_aarch64_gnullvm" 5406 - version = "0.53.0" 5443 + version = "0.53.1" 5407 5444 source = "registry+https://github.com/rust-lang/crates.io-index" 5408 - checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 5445 + checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" 5409 5446 5410 5447 [[package]] 5411 5448 name = "windows_aarch64_msvc" ··· 5415 5452 5416 5453 [[package]] 5417 5454 name = "windows_aarch64_msvc" 5418 - version = "0.48.5" 5419 - source = "registry+https://github.com/rust-lang/crates.io-index" 5420 - checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 5421 - 5422 - [[package]] 5423 - name = "windows_aarch64_msvc" 5424 5455 version = "0.52.6" 5425 5456 source = "registry+https://github.com/rust-lang/crates.io-index" 5426 5457 checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 5427 5458 5428 5459 [[package]] 5429 5460 name = "windows_aarch64_msvc" 5430 - version = "0.53.0" 5461 + version = "0.53.1" 5431 5462 source = "registry+https://github.com/rust-lang/crates.io-index" 5432 - checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 5463 + checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" 5433 5464 5434 5465 [[package]] 5435 5466 name = "windows_i686_gnu" ··· 5439 5470 5440 5471 [[package]] 5441 5472 name = "windows_i686_gnu" 5442 - version = "0.48.5" 5443 - source = "registry+https://github.com/rust-lang/crates.io-index" 5444 - checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 5445 - 5446 - [[package]] 5447 - name = "windows_i686_gnu" 5448 5473 version = "0.52.6" 5449 5474 source = "registry+https://github.com/rust-lang/crates.io-index" 5450 5475 checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 5451 5476 5452 5477 [[package]] 5453 5478 name = "windows_i686_gnu" 5454 - version = "0.53.0" 5479 + version = "0.53.1" 5455 5480 source = "registry+https://github.com/rust-lang/crates.io-index" 5456 - checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 5481 + checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" 5457 5482 5458 5483 [[package]] 5459 5484 name = "windows_i686_gnullvm" ··· 5463 5488 5464 5489 [[package]] 5465 5490 name = "windows_i686_gnullvm" 5466 - version = "0.53.0" 5491 + version = "0.53.1" 5467 5492 source = "registry+https://github.com/rust-lang/crates.io-index" 5468 - checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 5493 + checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" 5469 5494 5470 5495 [[package]] 5471 5496 name = "windows_i686_msvc" ··· 5475 5500 5476 5501 [[package]] 5477 5502 name = "windows_i686_msvc" 5478 - version = "0.48.5" 5479 - source = "registry+https://github.com/rust-lang/crates.io-index" 5480 - checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 5481 - 5482 - [[package]] 5483 - name = "windows_i686_msvc" 5484 5503 version = "0.52.6" 5485 5504 source = "registry+https://github.com/rust-lang/crates.io-index" 5486 5505 checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 5487 5506 5488 5507 [[package]] 5489 5508 name = "windows_i686_msvc" 5490 - version = "0.53.0" 5509 + version = "0.53.1" 5491 5510 source = "registry+https://github.com/rust-lang/crates.io-index" 5492 - checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 5511 + checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" 5493 5512 5494 5513 [[package]] 5495 5514 name = "windows_x86_64_gnu" ··· 5499 5518 5500 5519 [[package]] 5501 5520 name = "windows_x86_64_gnu" 5502 - version = "0.48.5" 5503 - source = "registry+https://github.com/rust-lang/crates.io-index" 5504 - checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 5505 - 5506 - [[package]] 5507 - name = "windows_x86_64_gnu" 5508 5521 version = "0.52.6" 5509 5522 source = "registry+https://github.com/rust-lang/crates.io-index" 5510 5523 checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 5511 5524 5512 5525 [[package]] 5513 5526 name = "windows_x86_64_gnu" 5514 - version = "0.53.0" 5527 + version = "0.53.1" 5515 5528 source = "registry+https://github.com/rust-lang/crates.io-index" 5516 - checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 5529 + checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" 5517 5530 5518 5531 [[package]] 5519 5532 name = "windows_x86_64_gnullvm" ··· 5523 5536 5524 5537 [[package]] 5525 5538 name = "windows_x86_64_gnullvm" 5526 - version = "0.48.5" 5527 - source = "registry+https://github.com/rust-lang/crates.io-index" 5528 - checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 5529 - 5530 - [[package]] 5531 - name = "windows_x86_64_gnullvm" 5532 5539 version = "0.52.6" 5533 5540 source = "registry+https://github.com/rust-lang/crates.io-index" 5534 5541 checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 5535 5542 5536 5543 [[package]] 5537 5544 name = "windows_x86_64_gnullvm" 5538 - version = "0.53.0" 5545 + version = "0.53.1" 5539 5546 source = "registry+https://github.com/rust-lang/crates.io-index" 5540 - checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 5547 + checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" 5541 5548 5542 5549 [[package]] 5543 5550 name = "windows_x86_64_msvc" ··· 5547 5554 5548 5555 [[package]] 5549 5556 name = "windows_x86_64_msvc" 5550 - version = "0.48.5" 5551 - source = "registry+https://github.com/rust-lang/crates.io-index" 5552 - checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 5553 - 5554 - [[package]] 5555 - name = "windows_x86_64_msvc" 5556 5557 version = "0.52.6" 5557 5558 source = "registry+https://github.com/rust-lang/crates.io-index" 5558 5559 checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 5559 5560 5560 5561 [[package]] 5561 5562 name = "windows_x86_64_msvc" 5562 - version = "0.53.0" 5563 + version = "0.53.1" 5563 5564 source = "registry+https://github.com/rust-lang/crates.io-index" 5564 - checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 5565 + checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" 5565 5566 5566 5567 [[package]] 5567 5568 name = "winnow" ··· 5574 5575 5575 5576 [[package]] 5576 5577 name = "winnow" 5577 - version = "0.7.12" 5578 + version = "0.7.13" 5578 5579 source = "registry+https://github.com/rust-lang/crates.io-index" 5579 - checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" 5580 + checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" 5580 5581 dependencies = [ 5581 5582 "memchr", 5582 5583 ] ··· 5592 5593 ] 5593 5594 5594 5595 [[package]] 5595 - name = "wit-bindgen-rt" 5596 - version = "0.39.0" 5596 + name = "wit-bindgen" 5597 + version = "0.46.0" 5597 5598 source = "registry+https://github.com/rust-lang/crates.io-index" 5598 - checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 5599 + checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" 5600 + 5601 + [[package]] 5602 + name = "wl-clipboard-rs" 5603 + version = "0.9.2" 5604 + source = "registry+https://github.com/rust-lang/crates.io-index" 5605 + checksum = "8e5ff8d0e60065f549fafd9d6cb626203ea64a798186c80d8e7df4f8af56baeb" 5599 5606 dependencies = [ 5600 - "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", 5601 5618 ] 5602 5619 5603 5620 [[package]] 5604 5621 name = "writeable" 5605 - version = "0.6.1" 5622 + version = "0.6.2" 5606 5623 source = "registry+https://github.com/rust-lang/crates.io-index" 5607 - checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 5624 + checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" 5608 5625 5609 5626 [[package]] 5610 5627 name = "wry" 5611 - version = "0.52.1" 5628 + version = "0.53.5" 5612 5629 source = "registry+https://github.com/rust-lang/crates.io-index" 5613 - checksum = "12a714d9ba7075aae04a6e50229d6109e3d584774b99a6a8c60de1698ca111b9" 5630 + checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2" 5614 5631 dependencies = [ 5615 5632 "base64 0.22.1", 5616 - "block2 0.6.1", 5633 + "block2 0.6.2", 5617 5634 "cookie", 5618 5635 "crossbeam-channel", 5636 + "dirs", 5619 5637 "dpi", 5620 5638 "dunce", 5621 5639 "gdkx11", ··· 5627 5645 "kuchikiki", 5628 5646 "libc", 5629 5647 "ndk", 5630 - "objc2 0.6.1", 5648 + "objc2 0.6.3", 5631 5649 "objc2-app-kit", 5632 5650 "objc2-core-foundation", 5633 - "objc2-foundation 0.3.1", 5651 + "objc2-foundation 0.3.2", 5634 5652 "objc2-ui-kit", 5635 5653 "objc2-web-kit", 5636 5654 "once_cell", ··· 5639 5657 "sha2", 5640 5658 "soup3", 5641 5659 "tao-macros", 5642 - "thiserror 2.0.12", 5660 + "thiserror 2.0.17", 5643 5661 "url", 5644 5662 "webkit2gtk", 5645 5663 "webkit2gtk-sys", 5646 5664 "webview2-com", 5647 5665 "windows", 5648 - "windows-core", 5666 + "windows-core 0.61.2", 5649 5667 "windows-version", 5650 5668 "x11-dl", 5651 5669 ] ··· 5672 5690 ] 5673 5691 5674 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]] 5675 5727 name = "yoke" 5676 - version = "0.8.0" 5728 + version = "0.8.1" 5677 5729 source = "registry+https://github.com/rust-lang/crates.io-index" 5678 - checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 5730 + checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" 5679 5731 dependencies = [ 5680 - "serde", 5681 5732 "stable_deref_trait", 5682 5733 "yoke-derive", 5683 5734 "zerofrom", ··· 5685 5736 5686 5737 [[package]] 5687 5738 name = "yoke-derive" 5688 - version = "0.8.0" 5739 + version = "0.8.1" 5689 5740 source = "registry+https://github.com/rust-lang/crates.io-index" 5690 - checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 5741 + checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" 5691 5742 dependencies = [ 5692 5743 "proc-macro2", 5693 5744 "quote", 5694 - "syn 2.0.104", 5745 + "syn 2.0.109", 5695 5746 "synstructure", 5696 5747 ] 5697 5748 5698 5749 [[package]] 5699 5750 name = "zbus" 5700 - version = "5.9.0" 5751 + version = "5.12.0" 5701 5752 source = "registry+https://github.com/rust-lang/crates.io-index" 5702 - checksum = "4bb4f9a464286d42851d18a605f7193b8febaf5b0919d71c6399b7b26e5b0aad" 5753 + checksum = "b622b18155f7a93d1cd2dc8c01d2d6a44e08fb9ebb7b3f9e6ed101488bad6c91" 5703 5754 dependencies = [ 5704 5755 "async-broadcast", 5705 5756 "async-executor", ··· 5719 5770 "ordered-stream", 5720 5771 "serde", 5721 5772 "serde_repr", 5773 + "tokio", 5722 5774 "tracing", 5723 5775 "uds_windows", 5724 - "windows-sys 0.59.0", 5725 - "winnow 0.7.12", 5776 + "uuid", 5777 + "windows-sys 0.61.2", 5778 + "winnow 0.7.13", 5726 5779 "zbus_macros", 5727 5780 "zbus_names", 5728 5781 "zvariant", ··· 5730 5783 5731 5784 [[package]] 5732 5785 name = "zbus_macros" 5733 - version = "5.9.0" 5786 + version = "5.12.0" 5734 5787 source = "registry+https://github.com/rust-lang/crates.io-index" 5735 - checksum = "ef9859f68ee0c4ee2e8cde84737c78e3f4c54f946f2a38645d0d4c7a95327659" 5788 + checksum = "1cdb94821ca8a87ca9c298b5d1cbd80e2a8b67115d99f6e4551ac49e42b6a314" 5736 5789 dependencies = [ 5737 - "proc-macro-crate 3.3.0", 5790 + "proc-macro-crate 3.4.0", 5738 5791 "proc-macro2", 5739 5792 "quote", 5740 - "syn 2.0.104", 5793 + "syn 2.0.109", 5741 5794 "zbus_names", 5742 5795 "zvariant", 5743 5796 "zvariant_utils", ··· 5751 5804 dependencies = [ 5752 5805 "serde", 5753 5806 "static_assertions", 5754 - "winnow 0.7.12", 5807 + "winnow 0.7.13", 5755 5808 "zvariant", 5756 5809 ] 5757 5810 5758 5811 [[package]] 5759 5812 name = "zerocopy" 5760 - version = "0.8.26" 5813 + version = "0.8.27" 5761 5814 source = "registry+https://github.com/rust-lang/crates.io-index" 5762 - checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" 5815 + checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" 5763 5816 dependencies = [ 5764 5817 "zerocopy-derive", 5765 5818 ] 5766 5819 5767 5820 [[package]] 5768 5821 name = "zerocopy-derive" 5769 - version = "0.8.26" 5822 + version = "0.8.27" 5770 5823 source = "registry+https://github.com/rust-lang/crates.io-index" 5771 - checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" 5824 + checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" 5772 5825 dependencies = [ 5773 5826 "proc-macro2", 5774 5827 "quote", 5775 - "syn 2.0.104", 5828 + "syn 2.0.109", 5776 5829 ] 5777 5830 5778 5831 [[package]] ··· 5792 5845 dependencies = [ 5793 5846 "proc-macro2", 5794 5847 "quote", 5795 - "syn 2.0.104", 5848 + "syn 2.0.109", 5796 5849 "synstructure", 5797 5850 ] 5798 5851 5799 5852 [[package]] 5800 - name = "zeroize" 5801 - version = "1.8.1" 5802 - source = "registry+https://github.com/rust-lang/crates.io-index" 5803 - checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 5804 - 5805 - [[package]] 5806 5853 name = "zerotrie" 5807 - version = "0.2.2" 5854 + version = "0.2.3" 5808 5855 source = "registry+https://github.com/rust-lang/crates.io-index" 5809 - checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 5856 + checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" 5810 5857 dependencies = [ 5811 5858 "displaydoc", 5812 5859 "yoke", ··· 5815 5862 5816 5863 [[package]] 5817 5864 name = "zerovec" 5818 - version = "0.11.2" 5865 + version = "0.11.5" 5819 5866 source = "registry+https://github.com/rust-lang/crates.io-index" 5820 - checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" 5867 + checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" 5821 5868 dependencies = [ 5822 5869 "yoke", 5823 5870 "zerofrom", ··· 5826 5873 5827 5874 [[package]] 5828 5875 name = "zerovec-derive" 5829 - version = "0.11.1" 5876 + version = "0.11.2" 5830 5877 source = "registry+https://github.com/rust-lang/crates.io-index" 5831 - checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 5878 + checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" 5832 5879 dependencies = [ 5833 5880 "proc-macro2", 5834 5881 "quote", 5835 - "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", 5836 5898 ] 5837 5899 5838 5900 [[package]] 5839 5901 name = "zvariant" 5840 - version = "5.6.0" 5902 + version = "5.8.0" 5841 5903 source = "registry+https://github.com/rust-lang/crates.io-index" 5842 - checksum = "d91b3680bb339216abd84714172b5138a4edac677e641ef17e1d8cb1b3ca6e6f" 5904 + checksum = "2be61892e4f2b1772727be11630a62664a1826b62efa43a6fe7449521cb8744c" 5843 5905 dependencies = [ 5844 5906 "endi", 5845 5907 "enumflags2", 5846 5908 "serde", 5847 - "winnow 0.7.12", 5909 + "url", 5910 + "winnow 0.7.13", 5848 5911 "zvariant_derive", 5849 5912 "zvariant_utils", 5850 5913 ] 5851 5914 5852 5915 [[package]] 5853 5916 name = "zvariant_derive" 5854 - version = "5.6.0" 5917 + version = "5.8.0" 5855 5918 source = "registry+https://github.com/rust-lang/crates.io-index" 5856 - checksum = "3a8c68501be459a8dbfffbe5d792acdd23b4959940fc87785fb013b32edbc208" 5919 + checksum = "da58575a1b2b20766513b1ec59d8e2e68db2745379f961f86650655e862d2006" 5857 5920 dependencies = [ 5858 - "proc-macro-crate 3.3.0", 5921 + "proc-macro-crate 3.4.0", 5859 5922 "proc-macro2", 5860 5923 "quote", 5861 - "syn 2.0.104", 5924 + "syn 2.0.109", 5862 5925 "zvariant_utils", 5863 5926 ] 5864 5927 5865 5928 [[package]] 5866 5929 name = "zvariant_utils" 5867 - version = "3.2.0" 5930 + version = "3.2.1" 5868 5931 source = "registry+https://github.com/rust-lang/crates.io-index" 5869 - checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" 5932 + checksum = "c6949d142f89f6916deca2232cf26a8afacf2b9fdc35ce766105e104478be599" 5870 5933 dependencies = [ 5871 5934 "proc-macro2", 5872 5935 "quote", 5873 5936 "serde", 5874 - "static_assertions", 5875 - "syn 2.0.104", 5876 - "winnow 0.7.12", 5937 + "syn 2.0.109", 5938 + "winnow 0.7.13", 5877 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 - sqlx = { version = "0.8.6", features = [ "sqlite", "runtime-tokio" ] } 26 - tokio = { version = "1.47.0", features = [ "macros" ] } 27 - dirs = "6.0.0" 28 - anyhow = "1.0.99" 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 + }
+11
src-tauri/src/frontend_calls/get_addresses.rs
··· 1 + use std::sync::Mutex; 2 + 3 + use tauri::State; 4 + 5 + use crate::osc::OSCMessage; 6 + 7 + #[tauri::command] 8 + pub fn get_addresses(addresses: State<&Mutex<Vec<OSCMessage>>>) -> Vec<OSCMessage> { 9 + let addresses = addresses.lock().unwrap(); 10 + addresses.clone() 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 + }
+6
src-tauri/src/frontend_calls/mod.rs
··· 1 + pub mod close_app; 2 + pub mod get_addresses; 3 + pub mod load_previous_tabs; 4 + pub mod save_graph; 5 + pub mod settings; 6 + pub mod sync_tab;
+17
src-tauri/src/frontend_calls/save_graph.rs
··· 1 + use std::{fs::File, io::Write, path::PathBuf}; 2 + 3 + use flate2::{write::GzEncoder, Compression}; 4 + use tauri::State; 5 + 6 + use crate::utils::config::Config; 7 + 8 + #[tauri::command] 9 + pub fn save_graph(graph: String, path: PathBuf, conf: State<Config>) { 10 + let file = File::create(&path).unwrap(); 11 + let mut encoder = GzEncoder::new(file, Compression::default()); 12 + 13 + encoder.write_all(graph.as_bytes()).unwrap(); 14 + encoder.finish().unwrap(); 15 + 16 + conf.save(); 17 + }
+15
src-tauri/src/frontend_calls/settings.rs
··· 1 + use tauri::State; 2 + 3 + use crate::utils::config::Config; 4 + 5 + #[tauri::command] 6 + pub fn set_hide_editor_on_app_start(value: bool, conf: State<Config>) { 7 + let mut config = conf.store.lock().unwrap(); 8 + config.hide_editor_on_start = value; 9 + } 10 + 11 + #[tauri::command] 12 + pub fn get_hide_editor_on_app_start(conf: State<Config>) -> bool { 13 + let config = conf.store.lock().unwrap(); 14 + config.hide_editor_on_start 15 + }
+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 + }
+37 -19
src-tauri/src/lib.rs
··· 1 - use std::fs; 1 + use std::{fs, sync::Mutex}; 2 2 3 - use sqlx::{ migrate::MigrateDatabase, Sqlite, SqlitePool }; 3 + use crossbeam_channel::bounded; 4 + use frontend_calls::*; 4 5 5 - use crate::{ setup::setup, utils::config::Config }; 6 + use crate::{osc::OSCMessage, setup::setup, utils::{config::Config, vrchat_builtin_parameters}}; 6 7 8 + mod frontend_calls; 9 + mod osc; 10 + mod runtime; 7 11 mod setup; 12 + mod structs; 8 13 mod utils; 9 - mod osc; 10 14 11 15 #[cfg_attr(mobile, tauri::mobile_entry_point)] 12 16 #[tokio::main] 13 17 pub async fn run() { 14 18 let container_folder = dirs::config_dir().unwrap().join("VRCMacros"); 15 19 16 - match fs ::metadata(&container_folder){ 20 + match fs::metadata(&container_folder) { 17 21 Ok(meta) => { 18 - if meta.is_file(){ 19 - 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"); 20 24 } 21 25 } 22 26 Err(_) => { ··· 24 28 } 25 29 } 26 30 27 - let db_file = container_folder.join("VRCMacros.db"); 28 - if !db_file.exists(){ Sqlite::create_database(db_file.to_str().unwrap()).await.unwrap(); } 31 + let conf_file = container_folder.join("conf"); 32 + let conf = Config::new(conf_file); 29 33 30 - let conf_file = container_folder.join("VRCMacros.json"); 31 - if !conf_file.exists(){ fs::write(&conf_file, "{}").unwrap() } 34 + static ADDRESSES: Mutex<Vec<OSCMessage>> = Mutex::new(Vec::new()); 32 35 33 - let pool = SqlitePool::connect(db_file.to_str().unwrap()).await.unwrap(); 34 - let conf = Config::new(conf_file); 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); 35 41 36 42 tauri::Builder::default() 43 + .plugin(tauri_plugin_os::init()) 44 + .plugin(tauri_plugin_clipboard_manager::init()) 45 + .plugin(tauri_plugin_dialog::init()) 37 46 .plugin(tauri_plugin_opener::init()) 38 - .invoke_handler(tauri::generate_handler![]) 39 - .manage(pool) 47 + .invoke_handler(tauri::generate_handler![ 48 + get_addresses::get_addresses, 49 + save_graph::save_graph, 50 + sync_tab::sync_tab, 51 + sync_tab::discard_tab, 52 + load_previous_tabs::load_previous_tabs, 53 + close_app::close_app, 54 + settings::set_hide_editor_on_app_start, 55 + settings::get_hide_editor_on_app_start, 56 + ]) 40 57 .manage(conf) 41 - .setup(| app | { 42 - setup(app); 43 - 58 + .manage(&ADDRESSES) 59 + .manage(runtime_sender) 60 + .setup(|app| { 61 + setup(app, &ADDRESSES, runtime_receiver); 44 62 Ok(()) 45 63 }) 46 64 .run(tauri::generate_context!()) 47 65 .expect("error while running tauri application"); 48 - } 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 }
+58 -43
src-tauri/src/osc.rs
··· 1 1 // https://gist.github.com/phaze-the-dumb/634daacb5141eae2f846e20987dba7a8 2 + use std::net::UdpSocket; 2 3 3 - use std::{ net::UdpSocket, sync::mpsc::Sender }; 4 + use crossbeam_channel::Sender; 5 + use serde::Serialize; 4 6 5 - use serde::Serialize; 7 + use crate::structs::parameter_types::ParameterType; 6 8 7 9 #[derive(Debug, Clone, Serialize)] 8 - pub enum OSCValue{ 9 - Int(i32), 10 - Float(f32), 11 - Boolean(bool), 12 - String(String), 10 + pub struct OSCMessage { 11 + pub address: String, 12 + pub values: Vec<ParameterType>, 13 13 } 14 14 15 - #[derive(Debug, Clone, Serialize)] 16 - pub struct OSCMessage{ 17 - pub address: String, 18 - pub values: Vec<OSCValue> 15 + impl PartialEq for OSCMessage { 16 + // Technically this isn't exactly equal, but the only time i'm checking if OSCMessage's are equal 17 + // Is when i'm checking for the "address" value 18 + 19 + fn eq(&self, other: &Self) -> bool { 20 + self.address == other.address 21 + } 22 + 23 + fn ne(&self, other: &Self) -> bool { 24 + self.address != other.address 25 + } 19 26 } 20 27 21 - // TODO: implement osc bundles 22 - pub fn start_server( sender: Sender<OSCMessage>, addr: &str ) { 28 + // TODO: Implement osc bundles 29 + pub fn start_server(sender: Sender<OSCMessage>, addr: &str) { 23 30 let socket = UdpSocket::bind(addr).unwrap(); 24 31 25 32 loop { ··· 27 34 let (amt, _src) = socket.recv_from(&mut buf).unwrap(); 28 35 29 36 let buf = &mut buf[..amt]; 30 - 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 + } 31 40 32 41 let mut addr: Vec<u8> = Vec::new(); 33 42 let mut value_start = 0; 34 43 35 - loop{ 44 + loop { 36 45 let byte = buf[value_start]; 37 - if byte == 0x00{ break; } 46 + if byte == 0x00 { 47 + break; 48 + } 38 49 39 50 value_start += 1; 40 51 addr.push(byte); 41 52 } 42 53 43 - loop{ 54 + loop { 44 55 let byte = buf[value_start]; 45 56 value_start += 1; 46 57 47 - if byte == 0x2C{ break; } 58 + if byte == 0x2C { 59 + break; 60 + } 48 61 } 49 62 50 63 let mut types: Vec<u8> = Vec::new(); 51 64 52 - loop{ 65 + loop { 53 66 let byte = buf[value_start]; 54 - if byte == 0x00{ break; } 67 + if byte == 0x00 { 68 + break; 69 + } 55 70 56 71 types.push(byte); 57 72 value_start += 1; ··· 60 75 value_start = ((value_start as f32 / 4.0).ceil() * 4.0) as usize; 61 76 let mut values = Vec::new(); 62 77 63 - for tp in types{ 64 - match tp{ 78 + for tp in types { 79 + match tp { 65 80 0x69 => { 66 81 let val_buf = &buf[value_start..value_start + 4]; 67 82 68 83 let bytes = <&[u8; 4]>::try_from(val_buf).unwrap().clone(); 69 84 let int = i32::from_be_bytes(bytes); 70 85 71 - values.push(OSCValue::Int(int)); 86 + values.push(ParameterType::Int(int)); 72 87 value_start += 4; 73 - }, 88 + } 74 89 0x66 => { 75 90 let val_buf = &buf[value_start..value_start + 4]; 76 91 77 92 let bytes = <&[u8; 4]>::try_from(val_buf).unwrap().clone(); 78 93 let float = f32::from_be_bytes(bytes); 79 94 80 - values.push(OSCValue::Float(float)); 95 + values.push(ParameterType::Float(float)); 81 96 value_start += 4; 82 - }, 83 - 0x54 => values.push(OSCValue::Boolean(true)), 84 - 0x46 => values.push(OSCValue::Boolean(false)), 97 + } 98 + 0x54 => values.push(ParameterType::Boolean(true)), 99 + 0x46 => values.push(ParameterType::Boolean(false)), 85 100 _ => {} 86 101 } 87 102 } 88 103 89 104 let message = OSCMessage { 90 105 address: String::from_utf8(addr.clone()).unwrap(), 91 - values: values 106 + values: values, 92 107 }; 93 108 94 109 sender.send(message).unwrap(); 95 110 } 96 111 } 97 112 98 - pub fn send_message( address: &str, values: Vec<OSCValue>, ip_addr: &str ){ 113 + pub fn send_message(address: &str, values: Vec<ParameterType>, ip_addr: &str) { 99 114 let socket = UdpSocket::bind("127.0.0.1:0").unwrap(); 100 115 let mut buf: Vec<u8> = Vec::new(); 101 116 ··· 113 128 let mut value_count = 1; 114 129 for value in values.clone() { 115 130 match value { 116 - OSCValue::Boolean( val ) => buf.push(if val { 0x54 } else { 0x46 }), 117 - OSCValue::Float(_) => buf.push(0x66), 118 - OSCValue::Int(_) => buf.push(0x69), 119 - OSCValue::String(_) => buf.push(0x73) 131 + ParameterType::Boolean(val) => buf.push(if val { 0x54 } else { 0x46 }), 132 + ParameterType::Float(_) => buf.push(0x66), 133 + ParameterType::Int(_) => buf.push(0x69), 134 + ParameterType::String(_) => buf.push(0x73), 135 + _ => {} 120 136 }; 121 137 122 138 value_count += 1; 123 139 } 124 140 125 - for _i in 0..4 - (value_count % 4) { 141 + for _i in 0..4 - (value_count % 4) { 126 142 buf.push(0); 127 143 } 128 144 129 - for value in values{ 130 - match value{ 131 - OSCValue::Float( val ) => buf.append(&mut val.to_be_bytes().to_vec()), 132 - OSCValue::Int( val ) => buf.append(&mut val.to_be_bytes().to_vec()), 133 - OSCValue::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) => { 134 150 let mut str_buf = val.as_bytes().to_vec(); 135 151 let buf_len = str_buf.len().clone(); 136 152 137 153 buf.append(&mut str_buf); 138 154 139 - for _i in 0..4 - (buf_len % 4) { 155 + for _i in 0..4 - (buf_len % 4) { 140 156 buf.push(0); 141 157 } 142 158 } ··· 144 160 } 145 161 } 146 162 147 - println!("{:X?}", &buf); 148 163 socket.send_to(&buf, ip_addr).unwrap(); 149 - } 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 + }
+129 -7
src-tauri/src/setup.rs
··· 1 - use std::sync; 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 - use tauri::{ App, Emitter, Manager }; 9 + use flate2::read::GzDecoder; 10 + use serde_json::{Map, Value}; 11 + use tauri::{App, Emitter, Listener, Manager, WindowEvent}; 4 12 5 - use crate::osc; 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 + }; 6 16 7 - pub fn setup( app: &mut App ){ 17 + pub fn setup( 18 + app: &mut App, 19 + addresses: &'static Mutex<Vec<OSCMessage>>, 20 + runtime_command_receiver: Receiver<RuntimeCommand>, 21 + ) { 8 22 let window = app.get_webview_window("main").unwrap(); 23 + window.hide().unwrap(); 9 24 10 - let ( sender, receiver ) = sync::mpsc::channel(); 25 + let win_handle = window.clone(); 26 + 27 + window.on_window_event(move |event| match event { 28 + WindowEvent::CloseRequested { api, .. } => { 29 + api.prevent_close(); 30 + win_handle.emit("prompt_to_close", ()).unwrap(); 31 + } 32 + WindowEvent::Resized(_) => { 33 + let minimised = win_handle.is_minimized().unwrap(); 34 + if minimised{ 35 + win_handle.hide().unwrap(); 36 + win_handle.emit("hide-window", ()).unwrap(); 37 + win_handle.unminimize().unwrap(); 38 + } 39 + } 40 + _ => {} 41 + }); 42 + 43 + setup_traymenu(app.handle()); 44 + 45 + let handle = window.clone(); 46 + window.listen("tauri://drag-drop", move |ev| { 47 + let path: Value = serde_json::from_str(ev.payload()).unwrap(); 48 + let path = path["paths"][0].as_str().unwrap(); 49 + 50 + let file = File::open(&path).unwrap(); 51 + let mut decoder = GzDecoder::new(file); 52 + let mut string = String::new(); 53 + 54 + decoder.read_to_string(&mut string).unwrap(); 55 + 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(); 62 + }); 63 + 64 + let (sender, receiver) = bounded(1024); 11 65 12 66 tokio::spawn(async move { 13 67 osc::start_server(sender, "127.0.0.1:9001"); 14 68 }); 15 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 + 16 80 tokio::spawn(async move { 17 81 loop { 18 82 let message = receiver.recv().unwrap(); 19 83 84 + window.emit("osc-message", &message).unwrap(); 20 85 86 + let msg = message.clone(); 87 + let mut addrs = addresses.lock().unwrap(); 88 + if !addrs.contains(&msg) { 89 + addrs.push(msg); 90 + } 21 91 22 - window.emit("osc-message", message).unwrap(); 92 + if message.address == "/avatar/change".to_owned(){ 93 + *addrs = vrchat_builtin_parameters::get_read_addresses(); 94 + 95 + // TODO: Read avatar paramaters from file 96 + } 97 + 98 + runtime_sender 99 + .send(RuntimeCommand::OSCMessage(message)) 100 + .unwrap(); 23 101 } 24 102 }); 25 - } 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
src-tauri/src/structs/mod.rs
··· 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 + }
+68
src-tauri/src/structs/parameter_types.rs
··· 1 + use anyhow::{bail, Result}; 2 + use serde::Serialize; 3 + 4 + #[derive(Serialize, Clone, Debug, PartialEq)] 5 + #[serde(tag = "key", content = "value")] 6 + pub enum ParameterType { 7 + AnyType(String), 8 + Label(&'static str), 9 + 10 + Int(i32), 11 + Float(f32), 12 + Boolean(bool), 13 + String(String), 14 + Flow(bool), 15 + 16 + None, 17 + } 18 + 19 + impl ParameterType { 20 + pub fn as_bool(&self) -> Result<bool> { 21 + match self { 22 + ParameterType::Boolean(val) => Ok(val.clone()), 23 + ParameterType::Int(val) => { 24 + if *val == 0 { 25 + Ok(false) 26 + } else { 27 + Ok(true) 28 + } 29 + } 30 + _ => bail!("Cannot cast to bool."), 31 + } 32 + } 33 + 34 + pub fn as_int(&self) -> Result<i32> { 35 + match self { 36 + ParameterType::Boolean(val) => { 37 + if *val { 38 + Ok(1) 39 + } else { 40 + Ok(0) 41 + } 42 + } 43 + ParameterType::Int(val) => Ok(val.clone()), 44 + ParameterType::Float(val) => Ok(val.round().clone() as i32), 45 + ParameterType::String(val) => Ok(val.clone().parse()?), 46 + _ => bail!("Cannot cast to int."), 47 + } 48 + } 49 + 50 + pub fn as_float(&self) -> Result<f32> { 51 + match self { 52 + ParameterType::Int(val) => Ok(val.clone() as f32), 53 + ParameterType::Float(val) => Ok(val.clone()), 54 + ParameterType::String(val) => Ok(val.clone().parse()?), 55 + _ => bail!("Cannot cast to float."), 56 + } 57 + } 58 + 59 + pub fn as_string(&self) -> Result<String> { 60 + match self { 61 + ParameterType::Boolean(val) => Ok(val.clone().to_string()), 62 + ParameterType::Int(val) => Ok(val.clone().to_string()), 63 + ParameterType::Float(val) => Ok(val.clone().to_string()), 64 + ParameterType::String(val) => Ok(val.clone()), 65 + _ => bail!("Cannot cast to string."), 66 + } 67 + } 68 + }
+70 -54
src-tauri/src/utils/config.rs
··· 1 - use std::{ collections::HashMap, fs, path::PathBuf, sync::Mutex }; 2 - 3 - use serde::{ Deserialize, Serialize }; 4 - use serde_json::Value; 5 - 6 - #[derive(Clone, Deserialize, Serialize)] 7 - pub enum ConfigValue{ 8 - Bool(bool), 9 - String(String), 10 - Number(f64), 11 - Null 12 - } 13 - 14 - pub struct Config{ 15 - store: Mutex<HashMap<String, ConfigValue>>, 16 - } 17 - 18 - impl Config{ 19 - pub fn new( path: PathBuf ) -> Self{ 20 - let json_string = fs::read_to_string(path).unwrap(); 21 - let json: Value = serde_json::from_str(&json_string).unwrap(); 22 - 23 - let mut hashmap = HashMap::new(); 24 - 25 - let obj = json.as_object().unwrap(); 26 - for ( key, val ) in obj{ 27 - hashmap.insert(key.clone(), if val.is_boolean(){ ConfigValue::Bool(val.as_bool().unwrap()) } else if val.is_number(){ ConfigValue::Number(val.as_f64().unwrap()) } else if val.is_string(){ ConfigValue::String(val.as_str().unwrap().to_owned()) } else { ConfigValue::Null }); 28 - } 29 - 30 - Config { 31 - store: Mutex::new(hashmap) 32 - } 33 - } 34 - 35 - pub fn set( &self, key: &str, value: ConfigValue ){ 36 - self.store.lock().unwrap().insert(key.to_owned(), value); 37 - } 38 - 39 - pub fn get( &self, key: &str ) -> Option<ConfigValue>{ 40 - let store = self.store.lock().unwrap(); 41 - let val = store.get(&key.to_owned()); 42 - 43 - if val.is_none(){ 44 - None 45 - } else{ 46 - Some(val.unwrap().clone()) 47 - } 48 - } 49 - 50 - pub fn save( &self ){ 51 - let dat = serde_json::to_string(&self.store.lock().unwrap().clone()).unwrap(); 52 - fs::write(dirs::config_dir().unwrap().join("VRCMacros").join("VRCMacros.json"), dat).unwrap(); 53 - } 54 - } 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 + }
+2 -2
src-tauri/tauri.conf.json
··· 13 13 "windows": [ 14 14 { 15 15 "title": "vrcmacros", 16 - "width": 1000, 17 - "height": 500 16 + "width": 1400, 17 + "height": 700 18 18 } 19 19 ], 20 20 "security": {
+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 //