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