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