+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/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>
+5
src/App.css
+5
src/App.css
+158
-53
src/App.tsx
+158
-53
src/App.tsx
···
1
-
import { createSignal, onCleanup, onMount } from "solid-js";
1
+
import { createEffect, createSignal, onCleanup, onMount } from "solid-js";
2
2
import "./App.css";
3
3
import { renderBackgroundGrid, renderContextMenu, renderNodes, renderNullTab, renderTempDrawing } from "./renderer";
4
4
import { lerp } from "./utils/lerp";
5
-
import { Node, NodeIO, NodeIOResolveAnyTypes } from "./structs/node";
5
+
import { Node, NodeIO, NodeIOCanCast, NodeIOResolveAnyTypes } from "./structs/node";
6
6
import { isPointInRect, isPointInRectApplyOffset, screenToWorldSpace } from "./utils/interections";
7
7
import { ControlBar } from "./components/ControlBar";
8
8
import { CanvasContextMenu } from "./ContextMenu/Canvas";
···
10
10
import { ContextMenu } from "./structs/ContextMenu";
11
11
import { NodeManager } from "./Mangers/NodeManager";
12
12
import { TabMenu } from "./components/TabMenu";
13
+
import { ConfirmationPopup } from "./components/ConfirmationPopup";
14
+
15
+
import * as keybinds from './keybinds';
16
+
import { listen } from "@tauri-apps/api/event";
17
+
18
+
// TODO: Only allow one node to input on non-flow inputs
13
19
14
20
let App = () => {
15
-
// TODO: Delete selected node when delete key is pressed
16
-
// TODO: Add undo / redo -ing
17
-
let [ selectedNode, setSelectedNode ] = createSignal<Node | null>(null);
21
+
let [ selectedNodes, setSelectedNodes ] = createSignal<Node[]>([], { equals: false });
22
+
let [ mousePos, setMousePos ] = createSignal<[ number, number ]>([ 0, 0 ]);
18
23
19
24
let canvas!: HTMLCanvasElement;
20
25
let ctx: CanvasRenderingContext2D;
···
55
60
visible: false
56
61
}
57
62
58
-
onMount(() => {
59
-
NodeManager.Instance.HookTabChange(() => setSelectedNode(null));
63
+
createEffect(() => {
64
+
let snodes = selectedNodes();
65
+
66
+
let anodes = NodeManager.Instance.GetNodes();
67
+
if(!anodes)return;
68
+
69
+
for(let node of anodes)node.selected = false;
70
+
for(let node of snodes)node.selected = true;
71
+
})
72
+
73
+
onMount(async () => {
74
+
NodeManager.Instance.HookTabChange(() => setSelectedNodes([]));
60
75
61
76
ctx = canvas.getContext('2d')!;
62
77
···
99
114
}
100
115
101
116
if(clickedNode){
102
-
contextMenu.items = NodeContextMenu(clickedNode);
117
+
contextMenu.items = NodeContextMenu(clickedNode, selectedNodes, setSelectedNodes);
103
118
} else{
104
119
contextMenu.items = CanvasContextMenu;
105
120
}
···
108
123
contextMenu.visible = true;
109
124
}
110
125
126
+
let isShiftClick = false;
111
127
canvas.onmousedown = ( e ) => {
128
+
isShiftClick = e.shiftKey;
129
+
112
130
if(
113
131
e.clientY < 60 ||
114
132
e.clientX < 220 ||
···
154
172
155
173
if(nodes){
156
174
nodes.map(node => {
157
-
node.selected = false;
158
-
159
175
if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale },
160
176
e.clientX, e.clientY,
161
-
node.x, node.y, node.w, node.h
177
+
node.x - 20, node.y, node.w + 40, node.h
162
178
)){
163
179
node.outputs.map(( output, i ) => {
164
180
if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale },
165
181
e.clientX, e.clientY,
166
-
node.x + (node.w - 30),
182
+
node.x + (node.w - 10),
167
183
node.y + 50 + (30 * i),
168
184
20, 20
169
185
)){
170
186
output.index = i;
171
187
172
-
drawingTo = [ node.x + (node.w - 30), node.y + 50 + (30 * i) ];
188
+
drawingTo = [
189
+
node.x + (node.w - 10),
190
+
node.y + 50 + (30 * i)
191
+
];
173
192
drawingFrom = output;
174
193
175
194
isDrawing = true;
···
180
199
node.inputs.map(( input, i ) => {
181
200
if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale },
182
201
e.clientX, e.clientY,
183
-
node.x + 10,
202
+
node.x - 10,
184
203
node.y + 50 + (30 * i),
185
204
20, 20
186
205
)){
···
211
230
212
231
movingNode = clickedNode;
213
232
214
-
if(clickedNode){
215
-
clickedNode.selected = true;
216
-
setSelectedNode(clickedNode);
217
-
}
218
-
219
233
isMouseDown = true;
220
234
mouseStartPos = [ e.clientX, e.clientY ];
235
+
mouseMovePos = [ e.clientX, e.clientY ];
221
236
}
222
237
223
238
canvas.onmousemove = ( e ) => {
239
+
setMousePos([ e.clientX, e.clientY ]);
240
+
241
+
if(e.shiftKey && isMouseDown){
242
+
let nodes = NodeManager.Instance.GetNodes();
243
+
let hoveredNode: Node | null = null;
244
+
245
+
if(nodes){
246
+
nodes.map(node => {
247
+
if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale },
248
+
e.clientX, e.clientY,
249
+
node.x - 20, node.y, node.w + 40, node.h
250
+
)){
251
+
hoveredNode = node;
252
+
return;
253
+
}
254
+
})
255
+
}
256
+
257
+
if(hoveredNode !== null){
258
+
let snodes = selectedNodes();
259
+
if(!snodes.find(x => x.id === hoveredNode!.id)){
260
+
snodes.push(hoveredNode);
261
+
262
+
// @ts-ignore
263
+
hoveredNode.x = Math.round(hoveredNode.x / 10) * 10;
264
+
// @ts-ignore
265
+
hoveredNode.y = Math.round(hoveredNode.y / 10) * 10;
266
+
267
+
setSelectedNodes(snodes);
268
+
}
269
+
}
270
+
271
+
return;
272
+
} else if(isShiftClick)return;
273
+
224
274
if(isMouseDown){
225
275
if(isDrawing){
226
276
drawingTo = screenToWorldSpace(canvas, { x: offset[0], y: offset[1], scale }, e.clientX - 10 * scale, e.clientY - 10 * scale) as [ number, number ];
227
277
} else if(movingNode){
228
-
movingNode.x = movingNode.x - (mouseStartPos[0] - e.clientX) / scale;
229
-
movingNode.y = movingNode.y - (mouseStartPos[1] - e.clientY) / scale;
278
+
let nodes = selectedNodes();
230
279
231
-
mouseStartPos = [ e.clientX, e.clientY ];
280
+
for(let node of nodes){
281
+
node.x = node.x - (mouseMovePos[0] - e.clientX) / scale;
282
+
node.y = node.y - (mouseMovePos[1] - e.clientY) / scale;
283
+
}
284
+
285
+
mouseMovePos = [ e.clientX, e.clientY ];
232
286
NodeManager.Instance.UpdateConfig();
233
287
} else{
234
-
offsetTarget = [ offsetTarget[0] - (mouseStartPos[0] - e.clientX) / scale, offsetTarget[1] - (mouseStartPos[1] - e.clientY) / scale ];
235
-
mouseStartPos = [ e.clientX, e.clientY ];
288
+
offsetTarget = [ offsetTarget[0] - (mouseMovePos[0] - e.clientX) / scale, offsetTarget[1] - (mouseMovePos[1] - e.clientY) / scale ];
289
+
mouseMovePos = [ e.clientX, e.clientY ];
236
290
237
291
screenMoved = true;
238
292
}
···
276
330
277
331
canvas.onmouseup = ( e ) => {
278
332
let nodes = NodeManager.Instance.GetNodes();
333
+
let clickedNode;
279
334
280
335
if(nodes){
281
336
nodes.map(node => {
282
-
node.inputs.map(( input, i ) => {
283
-
if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale },
284
-
e.clientX, e.clientY,
285
-
node.x + 10,
286
-
node.y + 50 + (30 * i),
287
-
20, 20
288
-
)){
289
-
if(isDrawing){
290
-
let fromType = NodeIOResolveAnyTypes(drawingFrom!);
291
-
let toType = NodeIOResolveAnyTypes(input);
337
+
if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale },
338
+
e.clientX, e.clientY,
339
+
node.x - 20, node.y, node.w + 40, node.h
340
+
)){
341
+
clickedNode = node;
342
+
343
+
node.inputs.map(( input, i ) => {
344
+
if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale },
345
+
e.clientX, e.clientY,
346
+
node.x - 10,
347
+
node.y + 50 + (30 * i),
348
+
20, 20
349
+
)){
350
+
if(isDrawing){
351
+
let fromType = NodeIOResolveAnyTypes(drawingFrom!);
352
+
let toType = NodeIOResolveAnyTypes(input);
292
353
293
-
if(
294
-
drawingFrom!.connections.indexOf(input) === -1 &&
295
-
(
296
-
toType === null ||
297
-
fromType === toType
298
-
)
299
-
){
300
-
drawingFrom!.connections.push(input);
301
-
input.connections.push(drawingFrom!);
354
+
if(
355
+
drawingFrom!.connections.indexOf(input) === -1 &&
356
+
(
357
+
toType === null ||
358
+
NodeIOCanCast(fromType, toType)
359
+
)
360
+
){
361
+
drawingFrom!.connections.push(input);
362
+
input.connections.push(drawingFrom!);
302
363
303
-
NodeManager.Instance.UpdateConfig();
364
+
NodeManager.Instance.UpdateConfig();
365
+
}
304
366
}
305
367
}
306
-
}
307
-
})
368
+
})
369
+
}
308
370
})
309
371
}
310
372
373
+
let diffX = mouseStartPos[0] - e.clientX;
374
+
let diffY = mouseStartPos[1] - e.clientY;
375
+
376
+
let dist = Math.sqrt(diffX * diffX + diffY * diffY);
377
+
378
+
if(dist < 10){
379
+
if(clickedNode){
380
+
if(e.shiftKey){
381
+
let snodes = selectedNodes();
382
+
if(snodes.indexOf(clickedNode) === -1)snodes.push(clickedNode);
383
+
384
+
// @ts-ignore
385
+
clickedNode.x = Math.round(clickedNode.x / 10) * 10;
386
+
// @ts-ignore
387
+
clickedNode.y = Math.round(clickedNode.y / 10) * 10;
388
+
389
+
setSelectedNodes(snodes);
390
+
} else{
391
+
// @ts-ignore
392
+
clickedNode.x = Math.round(clickedNode.x / 10) * 10;
393
+
// @ts-ignore
394
+
clickedNode.y = Math.round(clickedNode.y / 10) * 10;
395
+
396
+
setSelectedNodes([ clickedNode ]);
397
+
}
398
+
} else {
399
+
setSelectedNodes([]);
400
+
}
401
+
}
402
+
311
403
isDrawing = false;
312
404
isMouseDown = false;
313
405
}
314
406
407
+
keybinds.load(canvas, mousePos, selectedNodes, setSelectedNodes);
315
408
requestAnimationFrame(update);
409
+
410
+
let unlisten_0 = await listen('hide-window', () => {
411
+
stopRender = true;
412
+
})
413
+
414
+
let unlisten_1 = await listen('show-window', () => {
415
+
if(stopRender)window.location.reload();
416
+
})
417
+
418
+
onCleanup(() => {
419
+
stopRender = true;
420
+
window.clearInterval(interval);
421
+
422
+
unlisten_0();
423
+
unlisten_1();
424
+
});
316
425
});
317
426
318
427
let update = () => {
319
428
if(stopRender)return;
320
-
321
429
scale = lerp(scale, targetScale, 0.25);
322
430
323
431
offset[0] = lerp(offset[0], offsetTarget[0], 0.5);
···
342
450
343
451
let isMouseDown = false;
344
452
let mouseStartPos = [ 0, 0 ];
453
+
let mouseMovePos = [ 0, 0 ];
345
454
346
455
let interval = setInterval(() => {
347
456
if(screenMoved){
···
351
460
}
352
461
}, 1000);
353
462
354
-
onCleanup(() => {
355
-
stopRender = true;
356
-
window.clearInterval(interval);
357
-
});
358
-
359
463
return (
360
464
<>
465
+
<ConfirmationPopup />
361
466
<TabMenu />
362
-
<ControlBar node={selectedNode} lockMovement={( lock ) => lockMovement = lock} />
467
+
<ControlBar node={selectedNodes} lockMovement={( lock ) => lockMovement = lock} />
363
468
<canvas ref={canvas}/>
364
469
</>
365
470
);
+14
-2
src/ContextMenu/Node.tsx
+14
-2
src/ContextMenu/Node.tsx
···
1
+
import { Accessor, Setter } from "solid-js";
1
2
import { NodeManager } from "../Mangers/NodeManager";
2
3
import { PositionInfo } from "../renderer";
3
4
import { Node } from "../structs/node";
4
5
5
-
export let NodeContextMenu = ( clickedNode: Node ) => [
6
+
export let NodeContextMenu = ( clickedNode: Node, selectedNode: Accessor<Node[]>, setSelectedNode: Setter<Node[]> ) => [
6
7
{
7
8
text: "Delete Node",
8
9
clicked: ( _e: MouseEvent, _canvas: HTMLCanvasElement, _position: PositionInfo ) => {
···
18
19
})
19
20
})
20
21
21
-
// TODO: If node is currently selected, deselect it.
22
+
let selected = selectedNode();
23
+
for (let i = 0; i < selected.length; i++) {
24
+
let node = selected[i];
25
+
26
+
if(node.id === clickedNode.id){
27
+
selected.splice(i, 1);
28
+
setSelectedNode(selected);
29
+
30
+
break;
31
+
}
32
+
}
33
+
22
34
NodeManager.Instance.RemoveNode(clickedNode!)
23
35
},
24
36
hovered: false
+47
src/Mangers/ConfirmationManager.tsx
+47
src/Mangers/ConfirmationManager.tsx
···
1
+
import { Accessor, createSignal, Setter } from "solid-js";
2
+
3
+
export interface ConfirmationPopupButton{
4
+
text: string,
5
+
callback: () => void
6
+
}
7
+
8
+
export class ConfirmationManager{
9
+
public static Instance: ConfirmationManager;
10
+
11
+
private _setText: Setter<string>;
12
+
public Text: Accessor<string>;
13
+
14
+
private _setBody: Setter<string>;
15
+
public Body: Accessor<string>;
16
+
17
+
private _setButtons: Setter<ConfirmationPopupButton[]>;
18
+
public Buttons: Accessor<ConfirmationPopupButton[]>;
19
+
20
+
private _setShown: Setter<boolean>;
21
+
public Shown: Accessor<boolean>;
22
+
23
+
constructor(){
24
+
ConfirmationManager.Instance = this;
25
+
26
+
[ this.Text, this._setText ] = createSignal('');
27
+
[ this.Body, this._setBody ] = createSignal('');
28
+
[ this.Buttons, this._setButtons ] = createSignal<ConfirmationPopupButton[]>([]);
29
+
[ this.Shown, this._setShown ] = createSignal(false);
30
+
}
31
+
32
+
public ShowConfirmation( text: string, body: string, buttons: ConfirmationPopupButton[] ): boolean{
33
+
if(this.Shown())return false;
34
+
35
+
this._setShown(true);
36
+
37
+
this._setText(text);
38
+
this._setBody(body);
39
+
this._setButtons(buttons);
40
+
41
+
return true;
42
+
}
43
+
44
+
public CancelConfirmation(){
45
+
this._setShown(false);
46
+
}
47
+
}
+200
-40
src/Mangers/NodeManager.tsx
+200
-40
src/Mangers/NodeManager.tsx
···
5
5
import { listen } from "@tauri-apps/api/event";
6
6
import { getVersion } from "@tauri-apps/api/app";
7
7
import { NodesByID } from "../Nodes/Nodes";
8
+
import { save } from "@tauri-apps/plugin-dialog";
9
+
import { ConfirmationManager } from "./ConfirmationManager";
10
+
import { platform } from "@tauri-apps/plugin-os";
8
11
9
12
export interface TabHashMap {
10
13
[details: string] : Tab;
···
17
20
private _tabs: TabHashMap = {};
18
21
19
22
private _nodes: Node[] = [];
20
-
private _needsSave = false;
21
23
22
24
constructor(){
23
25
NodeManager.Instance = this;
24
26
25
27
setInterval(() => {
26
-
// Save config every 1 second
27
-
if(this._needsSave)this._saveConfigToDisk();
28
-
}, 1_000);
28
+
let tabs = Object.values(this._tabs).filter(x => x.needSync);
29
+
for(let tab of tabs){
30
+
invoke('sync_tab', {
31
+
graph: this._generateTabGraph(tab.id)[0],
32
+
id: tab.id,
33
+
name: tab.name,
34
+
location: tab.saveLocation,
35
+
saveState: tab.needsSave()
36
+
});
37
+
38
+
tab.needSync = false;
39
+
}
40
+
}, 1000);
29
41
30
42
listen('load_new_tab', ( ev: any ) => {
31
-
this._loadFromConfig(ev.payload);
32
-
})
43
+
this._loadFromConfig(ev.payload.path, null, ev.payload.graph);
44
+
});
45
+
46
+
invoke('load_previous_tabs').then(async ( tabs: any ) => {
47
+
let version = await getVersion();
48
+
49
+
for(let tab of Object.entries<any>(tabs)){
50
+
let loaded_tab = await this._loadFromConfig(tab[1][2], tab[0], JSON.stringify({
51
+
tab_name: tab[1][1],
52
+
version,
53
+
graph: tab[1][0]
54
+
}));
55
+
56
+
if(loaded_tab)
57
+
loaded_tab.setNeedsSave(tab[1][3]);
58
+
};
59
+
60
+
this.UpdateConfig();
61
+
});
62
+
63
+
listen('prompt_to_close', async _ => {
64
+
let tabs = Object.values(this._tabs);
65
+
let tabsNeedingSaving = tabs.filter(x => x.needsSave());
66
+
67
+
for(let tab of tabsNeedingSaving){
68
+
await new Promise<void>(res => {
69
+
ConfirmationManager.Instance.ShowConfirmation(
70
+
`Discard Changes in ${tab.name}?`,
71
+
'If you close this tab without saving you will lose all changes.',
72
+
[
73
+
{
74
+
text: 'Save',
75
+
callback: async () => {
76
+
await this.SaveTab(tab);
77
+
res();
78
+
}
79
+
},
80
+
{
81
+
text: 'Don\'t Save',
82
+
callback: async () => {
83
+
res();
84
+
}
85
+
}
86
+
]
87
+
)
88
+
});
89
+
}
90
+
91
+
invoke('close_app');
92
+
});
33
93
}
34
94
35
95
36
96
private _tabUpdateHook: ( tabs: TabHashMap ) => void = () => {};
37
97
private _tabChangeHook: () => void = () => {};
38
98
39
-
public async AddTab( name: string ){
99
+
public CurrentTab(): Tab | null{
100
+
if(!this._selectedTab)return null
101
+
return this._tabs[this._selectedTab] || null;
102
+
}
103
+
104
+
public async AddTab( name: string, id: string | null = null ): Promise<Tab>{
40
105
let [ selected, setSelected ] = createSignal(false);
106
+
let [ needsSave, setNeedsSave ] = createSignal(false);
41
107
42
108
let tab: Tab = {
43
109
name: name,
44
-
id: await NodeManager.Instance.GetNewNodeId(),
110
+
id: id || await NodeManager.Instance.GetNewNodeId(),
45
111
nodes: [],
46
-
selected: selected,
47
-
setSelected: setSelected
112
+
saveLocation: null,
113
+
114
+
selected,
115
+
setSelected,
116
+
117
+
needsSave,
118
+
setNeedsSave,
119
+
120
+
needSync: false
48
121
};
49
122
50
123
this._tabs[tab.id] = tab;
51
124
52
125
this.SelectTab(tab.id);
53
126
this._tabUpdateHook(this._tabs);
127
+
128
+
return tab;
54
129
}
55
130
56
-
public CloseTab( id: string ){ // TODO: Add confirmation to close tab
57
-
console.log(id === this._selectedTab);
58
-
if(this._selectedTab === id){
59
-
let tabs = Object.values(this._tabs);
131
+
public CloseTab( id: string ){
132
+
let tab = this._tabs[id];
60
133
61
-
if(tabs.length === 1){
62
-
this.SelectTab(null);
63
-
} else{
64
-
let tabToDelete = this._tabs[id];
134
+
let closeCB = () => {
135
+
if(this._selectedTab === id){
136
+
let tabs = Object.values(this._tabs);
65
137
66
-
let index = tabs.indexOf(tabToDelete);
67
-
let nextTab = tabs[index + 1];
138
+
if(tabs.length === 1){
139
+
this.SelectTab(null);
140
+
} else{
141
+
let index = tabs.indexOf(tab);
142
+
let nextTab = tabs[index + 1];
68
143
69
-
if(nextTab)
70
-
this.SelectTab(nextTab.id);
71
-
else
72
-
this.SelectTab(tabs[0].id);
144
+
if(nextTab)
145
+
this.SelectTab(nextTab.id);
146
+
else
147
+
this.SelectTab(tabs[0].id);
148
+
}
73
149
}
150
+
151
+
invoke('discard_tab', { id: id });
152
+
153
+
delete this._tabs[id];
154
+
this._tabUpdateHook(this._tabs);
74
155
}
75
156
76
-
delete this._tabs[id];
77
-
this._tabUpdateHook(this._tabs);
157
+
if(tab.needsSave()){
158
+
ConfirmationManager.Instance.ShowConfirmation(
159
+
'Discard Changes?',
160
+
'If you close this tab without saving you will lose all changes.',
161
+
[
162
+
{
163
+
text: 'Save',
164
+
callback: async () => {
165
+
await this.SaveTab(tab);
166
+
closeCB();
167
+
}
168
+
},
169
+
{
170
+
text: 'Don\'t Save',
171
+
callback: () => {
172
+
closeCB();
173
+
}
174
+
}
175
+
]
176
+
)
177
+
} else{
178
+
closeCB();
179
+
}
78
180
}
79
181
80
182
public RenameTab( id: string, name: string ){
···
110
212
}
111
213
}
112
214
215
+
public async SaveTab( tab: Tab, ignoreSaveLocation: boolean = false ){
216
+
let path =
217
+
tab.saveLocation && !ignoreSaveLocation ?
218
+
tab.saveLocation :
219
+
await save({ defaultPath: tab.name + '.macro', filters: [ { name: 'Macro Files', extensions: [ 'macro' ] } ] });
220
+
221
+
if(!path)throw new Error("Cannot save");
222
+
223
+
tab.saveLocation = path;
224
+
tab.setNeedsSave(false);
225
+
226
+
this._saveConfigToDisk(path, tab.id);
227
+
}
228
+
113
229
public HookTabUpdate( cb: ( tabs: TabHashMap ) => void ){
114
230
this._tabUpdateHook = cb;
115
231
}
···
149
265
}
150
266
151
267
152
-
public UpdateConfig(){
153
-
this._needsSave = true;
268
+
public UpdateConfig( needsSave = true ){
269
+
if(!this._selectedTab)return;
270
+
let tab = this._tabs[this._selectedTab];
271
+
if(!tab)return;
272
+
273
+
tab.nodes = this._nodes;
274
+
tab.needSync = true;
275
+
276
+
if(needsSave)tab.setNeedsSave(true);
154
277
}
155
278
156
-
private async _loadFromConfig( config: string ){
279
+
private async _loadFromConfig( path: string | null, id: string | null, config: string ){
157
280
let json = JSON.parse(config);
158
281
159
282
if(
···
162
285
!json.graph
163
286
)return;
164
287
165
-
await this.AddTab(json.tab_name);
288
+
let tab = await this.AddTab(json.tab_name, id);
289
+
tab.needSync = false;
290
+
tab.saveLocation = path;
291
+
166
292
this._nodes = [];
167
293
168
294
let graph = json.graph;
···
174
300
let nod = new Node(node.pos, NodesByID[node.typeId], node.id);
175
301
176
302
nod.statics = node.statics;
177
-
nod.onStaticsUpdate(nod);
303
+
await nod.onStaticsUpdate(nod);
178
304
179
305
this._nodes.push(nod);
180
306
}
···
191
317
let input = output.connections[k];
192
318
let node = this._nodes.find(x => x.id === input.node)!;
193
319
320
+
if(!node)continue;
321
+
194
322
let realInput = node.inputs.find(x => x.index === input.index);
195
323
let realOutput = outputParentNode.outputs[j];
196
324
···
212
340
}
213
341
}
214
342
}
343
+
344
+
tab.setNeedsSave(false);
345
+
tab.nodes = this._nodes;
346
+
347
+
tab.needSync = false;
348
+
if(!id)this.UpdateConfig(false);
349
+
350
+
return tab;
215
351
}
216
352
217
-
private async _saveConfigToDisk(){
218
-
this._needsSave = false;
353
+
private _generateTabGraph( tabId: string | null ): [ any, Tab | null ]{
219
354
// Convert it into a structure we can actually save...
220
355
221
-
if(!this._selectedTab)return;
222
-
let tab = this._tabs[this._selectedTab];
223
-
if(!tab)return;
356
+
if(!tabId)return [ null, null ];
357
+
let tab = this._tabs[tabId];
358
+
if(!tab)return [ null, null ];
224
359
225
360
let nodesToSave = [];
226
361
227
-
for (let i = 0; i < this._nodes.length; i++) {
228
-
let node = this._nodes[i];
362
+
for (let i = 0; i < tab.nodes.length; i++) {
363
+
let node = tab.nodes[i];
229
364
230
365
let nodeOutputs = [];
366
+
let nodeInputs = [];
231
367
232
368
for (let j = 0; j < node.outputs.length; j++) {
233
369
let output = node.outputs[j];
···
244
380
})
245
381
}
246
382
383
+
for (let j = 0; j < node.inputs.length; j++) {
384
+
let input = node.inputs[j];
385
+
386
+
nodeInputs.push({
387
+
name: input.name,
388
+
type: input.type,
389
+
connections: input.connections.map(x => { return {
390
+
name: x.name,
391
+
node: x.parent.id,
392
+
index: x.index,
393
+
type: x.type
394
+
}})
395
+
})
396
+
}
397
+
247
398
nodesToSave.push({
248
399
name: node.name,
249
400
id: node.id,
250
401
typeId: node.typeId,
251
402
pos: [ node.x, node.y ],
252
403
outputs: nodeOutputs,
404
+
inputs: nodeInputs,
253
405
statics: node.statics
254
406
})
255
407
}
256
408
257
-
invoke('save_graph', { tabName: tab.name, graph: JSON.stringify({
409
+
return [ nodesToSave, tab ];
410
+
}
411
+
412
+
private async _saveConfigToDisk( path: string, tabId: string | null ){
413
+
let [ nodesToSave, tab ] = this._generateTabGraph(tabId);
414
+
if(!tab)return;
415
+
416
+
invoke('save_graph', { graph: JSON.stringify({
258
417
tab_name: tab.name,
259
418
version: await getVersion(),
419
+
platform: platform(),
260
420
graph: nodesToSave
261
-
}) });
421
+
}), path });
262
422
}
263
423
}
+3
-2
src/Nodes/Conditional/IfEqual.tsx
+3
-2
src/Nodes/Conditional/IfEqual.tsx
···
2
2
import { NodeDefinition } from "../Nodes";
3
3
4
4
export let NodeConditionalIfEqual: NodeDefinition = {
5
+
os: 'any',
6
+
5
7
isSingle: true,
6
8
name: 'If Equal',
7
9
typeId: 'ifequal',
8
10
9
11
w: 220,
10
-
h: 150,
11
12
12
13
statics: [{
13
14
type: NodeType.Label,
···
26
27
{ name: "Not Equal", type: NodeType.Flow },
27
28
],
28
29
29
-
onStaticsUpdate: ( _node: Node ) => {}
30
+
onStaticsUpdate: async ( _node: Node ) => {}
30
31
}
+3
-2
src/Nodes/Conditional/IfFalse.tsx
+3
-2
src/Nodes/Conditional/IfFalse.tsx
···
2
2
import { NodeDefinition } from "../Nodes";
3
3
4
4
export let NodeConditionalIfFalse: NodeDefinition = {
5
+
os: 'any',
6
+
5
7
isSingle: true,
6
8
name: 'If False',
7
9
typeId: 'iffalse',
8
10
9
11
w: 220,
10
-
h: 150,
11
12
12
13
statics: [{
13
14
type: NodeType.Label,
···
25
26
{ name: "Not False", type: NodeType.Flow },
26
27
],
27
28
28
-
onStaticsUpdate: ( _node: Node ) => {}
29
+
onStaticsUpdate: async ( _node: Node ) => {}
29
30
}
+3
-2
src/Nodes/Conditional/IfTrue.tsx
+3
-2
src/Nodes/Conditional/IfTrue.tsx
···
2
2
import { NodeDefinition } from "../Nodes";
3
3
4
4
export let NodeConditionalIfTrue: NodeDefinition = {
5
+
os: 'any',
6
+
5
7
isSingle: true,
6
8
name: 'If True',
7
9
typeId: 'iftrue',
8
10
9
11
w: 220,
10
-
h: 150,
11
12
12
13
statics: [{
13
14
type: NodeType.Label,
···
25
26
{ name: "Not True", type: NodeType.Flow },
26
27
],
27
28
28
-
onStaticsUpdate: (_node: Node) => { }
29
+
onStaticsUpdate: async ( _node: Node ) => { }
29
30
}
+2
src/Nodes/Conditional.tsx
+2
src/Nodes/Conditional.tsx
+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
+
};
+27
-4
src/Nodes/Nodes.tsx
+27
-4
src/Nodes/Nodes.tsx
···
1
1
import { Node, NodeStatic, NodeType } from "../structs/node";
2
+
import { platform } from '@tauri-apps/plugin-os';
2
3
3
4
import { NodeConditional } from "./Conditional";
5
+
import { NodeDebug } from "./Debug";
4
6
import { NodeOSCActions } from "./OSCActions";
5
7
import { NodeOSCTrigger } from "./OSCTrigger";
8
+
import { NodePressKey } from "./PressKey";
6
9
import { NodeStatics } from "./Statics";
10
+
import { NodeShellCommand } from "./Shell";
7
11
8
12
export interface NodeDefinition{
13
+
os: string,
9
14
isSingle: boolean,
10
15
name: string,
11
16
typeId?: string,
12
-
onStaticsUpdate?: ( node: Node ) => void,
17
+
onStaticsUpdate?: ( node: Node ) => Promise<void>,
13
18
// build?: ( pos: [ number, number ], onStaticsUpdate: ( node: Node ) => void ) => Promise<Node>,
14
19
w?: number,
15
-
h?: number,
16
20
statics?: NodeStatic[],
17
21
inputs?: { name: string, type: NodeType }[],
18
22
outputs?: { name: string, type: NodeType }[],
···
24
28
[details: string] : NodeDefinition;
25
29
}
26
30
27
-
export let Nodes: NodeDefinition[] = [
31
+
// TODO: (Node Additions) Pressing keyboard keys (like to do linux, but has extra steps)
32
+
// TODO: (Node Additions) Getting media state from os
33
+
// TODO: (Node Additions) Sending custom OSC messages
34
+
// TODO: (Node Additions) Sending HTTP requests?
35
+
// TODO: (Node Additions) Voicemeeter integrations (win only)
36
+
// TODO: (Node Additions) Voicemod integrations (win only)
37
+
// TODO: (Node Additions) Executing shell commands? (probably need some kinda popup warning when these are imported about dangerous usage)
38
+
39
+
export let Nodes: NodeDefinition[] = [];
40
+
let nodes = [
28
41
NodeOSCTrigger,
29
42
NodeConditional,
30
43
NodeStatics,
31
-
NodeOSCActions
44
+
NodeOSCActions,
45
+
NodeDebug,
46
+
NodePressKey,
47
+
NodeShellCommand
32
48
]
49
+
50
+
let os = platform();
51
+
52
+
for (let i = 0; i < nodes.length; i++) {
53
+
let node = nodes[i];
54
+
if(node.os === 'any' || node.os === os)Nodes.push(node);
55
+
}
33
56
34
57
export let NodesByID: NodeDefinitionHashMap = {}
35
58
+3
-2
src/Nodes/OSCActions/Send Chatbox.tsx
+3
-2
src/Nodes/OSCActions/Send Chatbox.tsx
···
2
2
import { NodeDefinition } from "../Nodes";
3
3
4
4
export let NodeOSCActionsSendChatbox: NodeDefinition = {
5
+
os: 'any',
6
+
5
7
isSingle: true,
6
8
name: 'Send Chatbox',
7
9
typeId: 'oscsendchatbox',
8
10
9
11
w: 200,
10
-
h: 120,
11
12
12
13
statics: [{
13
14
type: NodeType.Label,
···
20
21
{ name: "Value", type: NodeType.String }
21
22
],
22
23
23
-
onStaticsUpdate: ( _node: Node ) => {}
24
+
onStaticsUpdate: async ( _node: Node ) => {}
24
25
}
+2
src/Nodes/OSCActions.tsx
+2
src/Nodes/OSCActions.tsx
+63
-48
src/Nodes/OSCTrigger.tsx
+63
-48
src/Nodes/OSCTrigger.tsx
···
5
5
import { NodeDefinition } from "./Nodes";
6
6
7
7
export let NodeOSCTrigger: NodeDefinition = {
8
+
os: 'any',
9
+
8
10
isSingle: true,
9
11
name: 'OSC Trigger',
10
12
typeId: 'osctrigger',
11
13
12
14
w: 200,
13
-
h: 50,
14
15
15
16
statics: [
16
17
{
···
25
26
}
26
27
],
27
28
28
-
onStaticsUpdate: ( node: Node ) => {
29
+
onStaticsUpdate: async ( node: Node ) => {
29
30
let address = node.statics[0].value;
30
31
let parameters = node.statics[1].value;
31
32
32
-
(async () => {
33
-
if(address){
34
-
let addresses = await invoke<OSCMessage[]>('get_addresses');
35
-
let msgDat = addresses.find(x => x.address == address);
36
-
37
-
if(!msgDat)return;
33
+
if(address){
34
+
let addresses = await invoke<OSCMessage[]>('get_addresses');
35
+
let msgDat = addresses.find(x => x.address == address);
38
36
37
+
if(msgDat){
39
38
parameters = msgDat.values.map(x => { return { type: x.key, desc: '' }});
40
39
node.statics[1].value = parameters;
41
40
}
41
+
}
42
+
43
+
let tempOutputs = [];
42
44
45
+
tempOutputs.push({
46
+
name: 'Flow',
47
+
type: NodeType.Flow,
48
+
connections: [],
49
+
parent: node,
50
+
index: 0
51
+
})
52
+
53
+
parameters.forEach(( dat: any, indx: number ) => {
54
+
let type: NodeType | null = null;
55
+
56
+
switch(dat.type){
57
+
case 'Int':
58
+
type = NodeType.Int;
59
+
break;
60
+
case 'Float':
61
+
type = NodeType.Float;
62
+
break;
63
+
case 'String':
64
+
type = NodeType.String;
65
+
break;
66
+
case 'Boolean':
67
+
type = NodeType.Boolean;
68
+
break;
69
+
}
70
+
71
+
if(type){
72
+
tempOutputs.push({
73
+
name: dat.desc === '' ? dat.type : dat.desc,
74
+
type: type,
75
+
connections: [],
76
+
parent: node,
77
+
index: indx + 1
78
+
})
79
+
}
80
+
});
81
+
82
+
let hasChanged = false;
83
+
84
+
for(let i in tempOutputs){
85
+
if(
86
+
node.outputs[i] === undefined ||
87
+
tempOutputs[i].type != node.outputs[i].type
88
+
){
89
+
hasChanged = true;
90
+
}
91
+
}
92
+
93
+
if(hasChanged){
43
94
node.outputs.map(output => {
44
95
output.connections.map(partner => {
45
96
partner.connections = partner.connections.filter(x => x != output);
46
97
})
47
98
})
48
-
node.outputs = [];
49
99
50
-
node.outputs.push({
51
-
name: 'Flow',
52
-
type: NodeType.Flow,
53
-
connections: [],
54
-
parent: node,
55
-
index: 0
56
-
})
57
-
58
-
parameters.forEach(( dat: any, indx: number ) => {
59
-
let type: NodeType | null = null;
100
+
node.outputs = tempOutputs;
101
+
node.updateSize();
102
+
}
60
103
61
-
switch(dat.type){
62
-
case 'Int':
63
-
type = NodeType.Int;
64
-
break;
65
-
case 'Float':
66
-
type = NodeType.Float;
67
-
break;
68
-
case 'String':
69
-
type = NodeType.String;
70
-
break;
71
-
case 'Boolean':
72
-
type = NodeType.Boolean;
73
-
break;
74
-
}
75
-
76
-
if(type){
77
-
node.outputs.push({
78
-
name: dat.desc === '' ? dat.type : dat.desc,
79
-
type: type,
80
-
connections: [],
81
-
parent: node,
82
-
index: indx + 1
83
-
})
84
-
}
85
-
});
86
-
87
-
node.h = 60 + (parameters.length + 1) * 30;
88
-
NodeManager.Instance.UpdateConfig();
89
-
})();
104
+
NodeManager.Instance.UpdateConfig();
90
105
}
91
106
};
+29
src/Nodes/PressKey.tsx
+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
+
}
+5
-4
src/Nodes/Statics/Int.tsx
+5
-4
src/Nodes/Statics/Int.tsx
···
2
2
import { NodeDefinition } from "../Nodes";
3
3
4
4
export let NodeStaticsInt: NodeDefinition = {
5
+
os: 'any',
6
+
5
7
isSingle: true,
6
8
name: 'Int',
7
-
typeId: 'ifelse',
9
+
typeId: 'staticint',
8
10
9
11
w: 200,
10
-
h: 85,
11
12
12
13
statics: [{
13
14
type: NodeType.Int,
14
15
name: 'Value',
15
-
value: null
16
+
value: 0
16
17
}],
17
18
18
19
outputs: [{ name: "Int", type: NodeType.Int }],
19
20
20
-
onStaticsUpdate: ( _node: Node ) => {}
21
+
onStaticsUpdate: async ( _node: Node ) => {}
21
22
}
+4
-3
src/Nodes/Statics/String.tsx
+4
-3
src/Nodes/Statics/String.tsx
···
2
2
import { NodeDefinition } from "../Nodes";
3
3
4
4
export let NodeStaticsString: NodeDefinition = {
5
+
os: 'any',
6
+
5
7
isSingle: true,
6
8
name: 'String',
7
9
typeId: 'staticstring',
8
10
9
11
w: 200,
10
-
h: 85,
11
12
12
13
statics: [{
13
14
type: NodeType.String,
14
15
name: 'Value',
15
-
value: null
16
+
value: 'Hello World!'
16
17
}],
17
18
18
19
outputs: [{ name: "String", type: NodeType.String }],
19
20
20
-
onStaticsUpdate: ( _node: Node ) => {}
21
+
onStaticsUpdate: async ( _node: Node ) => {}
21
22
}
+5
-1
src/Nodes/Statics.tsx
+5
-1
src/Nodes/Statics.tsx
···
1
1
import { NodeDefinition } from "./Nodes";
2
+
import { NodeStaticsFloat } from "./Statics/Float";
2
3
3
4
import { NodeStaticsInt } from "./Statics/Int";
4
5
import { NodeStaticsString } from "./Statics/String";
5
6
6
7
export let NodeStatics: NodeDefinition = {
8
+
os: 'any',
9
+
7
10
isSingle: false,
8
11
name: 'Statics',
9
12
items: [
10
13
NodeStaticsInt,
11
-
NodeStaticsString
14
+
NodeStaticsString,
15
+
NodeStaticsFloat
12
16
]
13
17
}
+42
src/components/ConfirmationPopup.css
+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
+
}
+40
-4
src/components/ControlBar.tsx
+40
-4
src/components/ControlBar.tsx
···
9
9
import { NodeManager } from '../Mangers/NodeManager';
10
10
11
11
export interface ControlBarProps{
12
-
node: Accessor<Node | null>,
12
+
node: Accessor<Node[]>,
13
13
lockMovement: ( lock: boolean ) => void
14
14
}
15
15
16
16
export let ControlBar = ( props: ControlBarProps ) => {
17
17
return (
18
18
<div class="control-bar">
19
-
<For each={props.node()?.statics}>
19
+
<For each={props.node()[0]?.statics}>
20
20
{ ( item ) => {
21
21
let [ popupOpen, setPopupOpen ] = createSignal(false);
22
22
···
26
26
<Match when={item.type == NodeType.String}>
27
27
{ item.name }
28
28
<div style={{ display: 'inline-block', 'margin-left': '10px' }}>
29
+
<input
30
+
type="text"
31
+
placeholder='Enter Value...'
32
+
value={item.value || ''}
33
+
onChange={( el ) => {
34
+
let value = el.target.value;
35
+
let node = props.node()[0]!;
29
36
37
+
item.value = value;
38
+
node.onStaticsUpdate(node);
39
+
40
+
NodeManager.Instance.UpdateConfig();
41
+
}} />
30
42
</div>
31
43
</Match>
32
44
<Match when={item.type == NodeType.Int}>
33
45
{ item.name }
34
46
<div style={{ display: 'inline-block', 'margin-left': '10px' }}>
47
+
<input
48
+
type="number"
49
+
placeholder='Enter Value...'
50
+
value={item.value !== undefined ? item.value : ''}
51
+
onChange={( el ) => {
52
+
let value = el.target.value;
53
+
let node = props.node()[0]!;
35
54
55
+
item.value = parseInt(value);
56
+
node.onStaticsUpdate(node);
57
+
58
+
NodeManager.Instance.UpdateConfig();
59
+
}} />
36
60
</div>
37
61
</Match>
38
62
<Match when={item.type == NodeType.Float}>
39
63
{ item.name }
40
64
<div style={{ display: 'inline-block', 'margin-left': '10px' }}>
65
+
<input
66
+
type="number"
67
+
placeholder='Enter Value...'
68
+
value={item.value !== undefined ? item.value : ''}
69
+
onChange={( el ) => {
70
+
let value = el.target.value;
71
+
let node = props.node()[0]!;
41
72
73
+
item.value = parseFloat(value);
74
+
node.onStaticsUpdate(node);
75
+
76
+
NodeManager.Instance.UpdateConfig();
77
+
}} />
42
78
</div>
43
79
</Match>
44
80
<Match when={item.type == NodeType.OSCAddress}>
···
52
88
return addresses.map(x => x.address).filter(x => x.toLowerCase().includes(text.toLowerCase()));
53
89
}}
54
90
change={( text ) => {
55
-
let node = props.node()!;
91
+
let node = props.node()[0]!;
56
92
57
93
item.value = text;
58
94
node.onStaticsUpdate(node);
···
78
114
}}
79
115
value={item.value}
80
116
changed={( value ) => {
81
-
let node = props.node()!;
117
+
let node = props.node()[0]!;
82
118
83
119
item.value = value;
84
120
node.onStaticsUpdate(node);
+23
src/components/ParameterList.css
+23
src/components/ParameterList.css
···
59
59
60
60
.parameter-list-button-dropdown > div:hover{
61
61
color: #aaa;
62
+
}
63
+
64
+
.parameter-list-parameter{
65
+
display: inline-block;
66
+
padding: 5px 10px;
67
+
margin: 5px 0px 5px 10px;
68
+
background: #445077;
69
+
border-radius: 5px;
70
+
transition: 0.1s;
71
+
cursor: pointer;
72
+
user-select: none;
73
+
-webkit-user-select: none;
74
+
}
75
+
76
+
.parameter-list-parameter:hover{
77
+
background: #363f5e;
78
+
}
79
+
80
+
.parameter-list-parameter-delete{
81
+
padding: 0px 5px;
82
+
display: flex;
83
+
justify-content: center;
84
+
align-items: center;
62
85
}
+12
-1
src/components/ParameterList.tsx
+12
-1
src/components/ParameterList.tsx
···
22
22
</div>
23
23
<div class="parameter-list-content">
24
24
<For each={parameters()}>
25
-
{ i => <div>{ JSON.stringify(i) }</div>}
25
+
{ ( i, index ) => <div style={{ display: 'flex' }}>
26
+
<div class="parameter-list-parameter">{ i.desc === "" ? i.type : i.desc + ` ${i.type}` }</div>
27
+
<div class="parameter-list-parameter parameter-list-parameter-delete" onClick={() => {
28
+
let params = parameters();
29
+
params.splice(index(), 1);
30
+
31
+
setParameters(params);
32
+
props.changed(params);
33
+
}}>
34
+
<img src="/assets/icons/trash-can-solid-full.svg" width="20" />
35
+
</div>
36
+
</div>}
26
37
</For>
27
38
<div class="button" onClick={() => { setAddParametersOpen(!addParametersOpen()) }}>Add Parameter + </div>
28
39
<Show when={addParametersOpen()}>
+41
src/components/SettingsMenu.css
+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
+
}
+30
-1
src/components/TabMenu.css
+30
-1
src/components/TabMenu.css
···
12
12
overflow-y: auto;
13
13
}
14
14
15
+
.tab-container{
16
+
height: calc(100% - 35px);
17
+
overflow: auto;
18
+
mask-image: linear-gradient(to bottom, #000 90%, #0000);
19
+
padding-bottom: 25px;
20
+
}
21
+
15
22
.tab{
16
23
border-radius: 10px;
17
24
padding: 8px 10px;
···
53
60
.tab-meta{
54
61
width: calc(100% - 40px);
55
62
transform: translateY(1px);
63
+
display: flex;
64
+
align-items: center;
56
65
}
57
66
58
67
.tab-meta-input{
···
88
97
}
89
98
90
99
.tab-new-dropdown{
91
-
opacity: 0;
92
100
position: absolute;
93
101
width: 180px;
94
102
transform: translate(-10px, 35px);
95
103
border-radius: 10px;
96
104
background: #fff1;
105
+
}
106
+
107
+
.tab-icon-bar{
108
+
height: 30px;
109
+
margin: 0 5px;
110
+
display: flex;
111
+
justify-content: left;
112
+
align-items: center;
113
+
}
114
+
115
+
.tab-icon-bar img{
116
+
padding: 3px;
117
+
border-radius: 5px;
97
118
transition: 0.1s;
119
+
background: transparent;
120
+
cursor: pointer;
121
+
user-select: none;
122
+
-webkit-user-select: none;
123
+
}
124
+
125
+
.tab-icon-bar img:hover{
126
+
background: #fff2;
98
127
}
+70
-40
src/components/TabMenu.tsx
+70
-40
src/components/TabMenu.tsx
···
1
-
import { createSignal, For, onMount } from 'solid-js';
2
1
import './TabMenu.css';
2
+
3
+
import { createSignal, For, onMount, Show } from 'solid-js';
3
4
import { NodeManager } from '../Mangers/NodeManager';
4
5
import { Tab } from '../structs/Tab';
6
+
import { SettingsMenu } from './SettingsMenu';
7
+
import { openUrl } from '@tauri-apps/plugin-opener';
5
8
6
9
export let TabMenu = () => {
7
10
let [ tabImportOpen, setTabImportOpen ] = createSignal(false);
8
11
let [ tabs, setTabs ] = createSignal<Tab[]>([], { equals: false });
12
+
13
+
let [ settingsOpen, setSettingsOpen ] = createSignal(false);
9
14
10
15
let closeTabImportMenu = () => {
11
16
window.removeEventListener('click', closeTabImportMenu);
···
17
22
});
18
23
19
24
return (
20
-
<div class="tab-menu">
21
-
<For each={Object.values(tabs())}>
22
-
{
23
-
tab =>
24
-
<div class={ tab.selected() ? 'tab-selected ' : 'tab' }>
25
-
<div class="tab-icon" onClick={() => {
26
-
NodeManager.Instance.SelectTab(tab.id);
27
-
}}><img src="/assets/icons/pen-to-square-regular-full.svg" width="15" /></div>
28
-
<div class="tab-meta" onClick={() => {
29
-
NodeManager.Instance.SelectTab(tab.id);
30
-
}} onDblClick={( e ) => {
31
-
let input = <input class="tab-meta-input" value={ e.target.innerHTML } /> as HTMLInputElement;
25
+
<>
26
+
<Show when={settingsOpen()}>
27
+
<SettingsMenu close={() => setSettingsOpen(false)} />
28
+
</Show>
32
29
33
-
e.target.innerHTML = '';
34
-
e.target.appendChild(input);
30
+
<div class="tab-menu">
31
+
<div class="tab-container">
32
+
<For each={Object.values(tabs())}>
33
+
{
34
+
tab =>
35
+
<div class={ tab.selected() ? 'tab-selected ' : 'tab' } onClick={() => {
36
+
NodeManager.Instance.SelectTab(tab.id);
37
+
}}>
38
+
<div class="tab-icon" onClick={async () => {
39
+
if(tab.selected()){
40
+
NodeManager.Instance.SaveTab(tab);
41
+
}
42
+
}}>
43
+
<Show when={tab.selected() && tab.needsSave()} fallback={
44
+
<img src="/assets/icons/pen-to-square-regular-full.svg" width="15" />
45
+
}>
46
+
<img src="/assets/icons/floppy-disk-solid-full.svg" width="15" />
47
+
</Show>
35
48
36
-
input.select();
37
-
input.onchange = () => {
38
-
NodeManager.Instance.RenameTab(tab.id, input.value);
39
-
e.target.innerHTML = input.value;
40
-
}
41
-
}}>{ tab.name }</div>
42
-
<div class="tab-close" onClick={() => {
43
-
NodeManager.Instance.CloseTab(tab.id);
44
-
}}><img src="/assets/icons/xmark-solid-full.svg" width="12" /></div>
45
-
</div>
46
-
}
47
-
</For>
49
+
</div>
50
+
<div class="tab-meta" onDblClick={( e ) => {
51
+
let input = <input class="tab-meta-input" value={ e.target.innerHTML } /> as HTMLInputElement;
48
52
49
-
<div class="tab" onClick={() => {
50
-
NodeManager.Instance.AddTab("Untitled");
51
-
}} onContextMenu={( e ) => {
52
-
e.preventDefault();
53
-
setTabImportOpen(true);
53
+
e.target.innerHTML = '';
54
+
e.target.appendChild(input);
55
+
56
+
input.select();
57
+
input.onchange = () => {
58
+
NodeManager.Instance.RenameTab(tab.id, input.value);
59
+
e.target.innerHTML = input.value;
60
+
}
61
+
}}>{ tab.name }</div>
62
+
<div class="tab-close" onClick={() => {
63
+
setTimeout(() => {
64
+
NodeManager.Instance.CloseTab(tab.id);
65
+
}, 50)
66
+
}}><img src="/assets/icons/xmark-solid-full.svg" width="12" /></div>
67
+
</div>
68
+
}
69
+
</For>
70
+
71
+
<div class="tab" onClick={() => {
72
+
NodeManager.Instance.AddTab("Untitled");
73
+
}} onContextMenu={( e ) => {
74
+
e.preventDefault();
75
+
setTabImportOpen(true);
76
+
77
+
window.addEventListener('click', closeTabImportMenu);
78
+
}}>
79
+
<div class="tab-new-dropdown" style={{ display: tabImportOpen() ? 'block' : 'none' }}>
80
+
<div class="tab">Import from file</div>
81
+
<div class="tab">Import from URL</div>
82
+
</div>
83
+
<div class="tab-icon"><img src="/assets/icons/plus-solid-full.svg" width="15" /></div>
84
+
<div class="tab-meta">New Tab</div>
85
+
</div>
86
+
</div>
54
87
55
-
window.addEventListener('click', closeTabImportMenu);
56
-
}}>
57
-
<div class="tab-new-dropdown" style={{ opacity: tabImportOpen() ? 1 : 0 }}>
58
-
<div class="tab">Import from file</div>
59
-
<div class="tab">Import from URL</div>
88
+
<div class="tab-icon-bar">
89
+
<img src="/assets/icons/gear-solid-full.svg" width="25" onClick={() => setSettingsOpen(true)} />
90
+
<div style={{ width: 'calc(100% - 50px)' }}></div>
91
+
<img src="/assets/icons/circle-info-solid-full.svg" width="25" onClick={() => openUrl('https://github.com/phaze-the-dumb/VRCMacros/wiki')} />
60
92
</div>
61
-
<div class="tab-icon"><img src="/assets/icons/plus-solid-full.svg" width="15" /></div>
62
-
<div class="tab-meta">New Tab</div>
63
93
</div>
64
-
</div>
94
+
</>
65
95
)
66
96
}
+11
src/components/TextInput.css
+11
src/components/TextInput.css
···
9
9
width: 400px;
10
10
}
11
11
12
+
input[type="number"]{
13
+
outline: none;
14
+
background: none;
15
+
border: none;
16
+
border-bottom: 2px solid #525252;
17
+
font-size: 15px;
18
+
font-family: Rubik, 'Courier New';
19
+
color: #fff;
20
+
width: 400px;
21
+
}
22
+
12
23
div[input-dropdown]{
13
24
position: absolute;
14
25
width: fit-content;
+4
-1
src/index.tsx
+4
-1
src/index.tsx
···
3
3
import App from "./App";
4
4
5
5
import { NodeManager } from "./Mangers/NodeManager";
6
+
import { ConfirmationManager } from "./Mangers/ConfirmationManager";
7
+
6
8
new NodeManager();
9
+
new ConfirmationManager();
7
10
8
-
render(() => <App />, document.getElementById("root") as HTMLElement);
11
+
render(() => <App />, document.getElementById("root") as HTMLElement);
+94
src/keybinds.ts
+94
src/keybinds.ts
···
1
+
import { Accessor, Setter } from "solid-js";
2
+
import { NodeManager } from "./Mangers/NodeManager";
3
+
import { Node } from "./structs/node";
4
+
import { readText, writeText } from "@tauri-apps/plugin-clipboard-manager";
5
+
import { decodeNodeList, encodeNodeList } from "./utils/clipboard";
6
+
7
+
let isKeyDown: any = {};
8
+
9
+
export let load = ( canvas: HTMLCanvasElement, mousePos: Accessor<[ number, number ]>, selectedNode: Accessor<Node[]>, setSelectedNode: Setter<Node[]> ) => {
10
+
// TODO: Add undo / redo -ing
11
+
12
+
canvas.onkeydown = async ( e ) => {
13
+
switch(e.key){
14
+
case 'Delete':
15
+
let nodes = selectedNode();
16
+
for(let node of nodes){
17
+
node.inputs.map(input => {
18
+
input.connections.map(partner => {
19
+
partner.connections = partner.connections.filter(x => x != input);
20
+
})
21
+
})
22
+
23
+
node.outputs.map(output => {
24
+
output.connections.map(partner => {
25
+
partner.connections = partner.connections.filter(x => x != output);
26
+
})
27
+
})
28
+
29
+
NodeManager.Instance.RemoveNode(node);
30
+
}
31
+
32
+
setSelectedNode([]);
33
+
break;
34
+
}
35
+
}
36
+
37
+
window.onkeydown = async ( e ) => {
38
+
isKeyDown[e.key] = true;
39
+
40
+
switch(e.key){
41
+
case 's':
42
+
if(e.ctrlKey){
43
+
let currentTab = NodeManager.Instance.CurrentTab();
44
+
if(!currentTab)return;
45
+
46
+
// Save
47
+
NodeManager.Instance.SaveTab(currentTab);
48
+
}
49
+
break;
50
+
case 'S':
51
+
if(e.ctrlKey){
52
+
let currentTab = NodeManager.Instance.CurrentTab();
53
+
if(!currentTab)return;
54
+
55
+
// Save
56
+
NodeManager.Instance.SaveTab(currentTab, true);
57
+
}
58
+
break;
59
+
case 'c':
60
+
if(e.ctrlKey){
61
+
let nodes = selectedNode();
62
+
await writeText(encodeNodeList(nodes, mousePos()));
63
+
}
64
+
break;
65
+
case 'v':
66
+
if(e.ctrlKey){
67
+
let text = await readText();
68
+
69
+
let nodes = await decodeNodeList(text, mousePos());
70
+
if(!nodes)return;
71
+
72
+
for(let node of nodes)
73
+
NodeManager.Instance.AddNode(node);
74
+
75
+
setSelectedNode(nodes);
76
+
}
77
+
break;
78
+
case 'z':
79
+
if(e.ctrlKey){
80
+
console.log('undo');
81
+
}
82
+
break;
83
+
case 'y':
84
+
if(e.ctrlKey){
85
+
console.log('redo');
86
+
}
87
+
break;
88
+
}
89
+
}
90
+
91
+
window.onkeyup = ( e ) => {
92
+
isKeyDown[e.key] = false;
93
+
}
94
+
}
+69
-40
src/renderer.ts
+69
-40
src/renderer.ts
···
63
63
let nodeX = Math.round(node.x / 10) * 10;
64
64
let nodeY = Math.round(node.y / 10) * 10;
65
65
66
-
ctx.fillStyle = '#1f2129';
67
-
ctx.strokeStyle = node.selected ? '#004696ff' : '#fff5';
66
+
ctx.fillStyle = '#343742ff';
67
+
ctx.strokeStyle = node.selected ? '#004696ff' : '#fff0';
68
68
ctx.lineWidth = 5 * position.scale;
69
69
70
70
// Draw Node Box
···
74
74
node.w * position.scale,
75
75
node.h * position.scale,
76
76
10 * position.scale);
77
+
78
+
ctx.shadowColor = '#0005';
79
+
ctx.shadowBlur = 10;
77
80
78
81
ctx.stroke();
79
82
ctx.fill();
80
83
84
+
ctx.shadowBlur = 0;
85
+
81
86
// Draw Node Name
82
87
ctx.fillStyle = '#fff';
83
-
ctx.font = (25 * position.scale) + 'px Comic Mono';
88
+
ctx.font = (25 * position.scale) + 'px Rubik';
84
89
ctx.textAlign = 'center';
85
90
86
91
ctx.fillText(node.name,
···
89
94
);
90
95
91
96
// Draw Inputs
92
-
ctx.font = (15 * position.scale) + 'px Comic Mono';
97
+
ctx.font = (15 * position.scale) + 'px Rubik';
93
98
ctx.textAlign = 'left';
94
99
95
100
node.inputs.map(( input, i ) => {
96
101
ctx.fillStyle = NodeIOLinkColours(input);
97
-
ctx.fillRect(
98
-
(nodeX + 10 + startX + position.x) * position.scale,
99
-
(nodeY + 50 + (30 * i) + startY + position.y) * position.scale,
100
-
20 * position.scale, 20 * position.scale
101
-
)
102
+
103
+
ctx.beginPath();
104
+
ctx.arc(
105
+
(nodeX - 10 + startX + 10 + position.x) * position.scale,
106
+
(nodeY + 50 + (30 * i) + startY + 10 + position.y) * position.scale,
107
+
7 * position.scale,
108
+
0,
109
+
Math.PI * 2,
110
+
);
111
+
ctx.fill();
102
112
103
113
ctx.fillText(input.name,
104
-
(nodeX + 35 + startX + position.x) * position.scale,
114
+
(nodeX + 15 + startX + position.x) * position.scale,
105
115
(nodeY + 53 + (30 * i) + startY + position.y) * position.scale,
106
116
)
107
117
})
···
111
121
112
122
node.outputs.map(( output, i ) => {
113
123
ctx.fillStyle = NodeIOLinkColours(output);
114
-
ctx.fillRect(
115
-
(nodeX + (node.w - 30) + startX + position.x) * position.scale,
116
-
(nodeY + 50 + (30 * i) + startY + position.y) * position.scale,
117
-
20 * position.scale, 20 * position.scale
118
-
)
124
+
125
+
ctx.beginPath();
126
+
ctx.arc(
127
+
(nodeX + (node.w - 10) + startX + 10 + position.x) * position.scale,
128
+
(nodeY + 50 + (30 * i) + startY + 10 + position.y) * position.scale,
129
+
7 * position.scale,
130
+
0,
131
+
Math.PI * 2,
132
+
);
133
+
ctx.fill();
119
134
120
135
ctx.fillText(output.name,
121
-
(nodeX + (node.w - 35) + startX + position.x) * position.scale,
136
+
(nodeX + (node.w - 15) + startX + position.x) * position.scale,
122
137
(nodeY + 53 + (30 * i) + startY + position.y) * position.scale,
123
138
)
124
139
})
···
130
145
131
146
node.outputs.map(( output, i ) => {
132
147
output.connections.map(partner => {
133
-
ctx.strokeStyle = NodeIOLinkColours(output);
134
-
drawCurve(ctx,
135
-
(nodeX + (node.w - 30) + 10 + startX + position.x) * position.scale,
136
-
(nodeY + 50 + (30 * i) + 10 + startY + position.y) * position.scale,
137
-
((Math.round(partner.parent.x / 10) * 10) + 20 + startX + position.x) * position.scale,
138
-
((Math.round(partner.parent.y / 10) * 10) + 60 + (30 * partner.index) + startY + position.y) * position.scale,
139
-
);
148
+
let x0 = (nodeX + (node.w - 10) + 10 + startX + position.x) * position.scale;
149
+
let y0 = (nodeY + 50 + (30 * i) + 10 + startY + position.y) * position.scale;
150
+
let x1 = ((Math.round(partner.parent.x / 10) * 10) + startX + position.x) * position.scale;
151
+
let y1 = ((Math.round(partner.parent.y / 10) * 10) + 60 + (30 * partner.index) + startY + position.y) * position.scale;
152
+
153
+
let colours = NodeIOLinkColours(output, partner);
154
+
let grad = ctx.createLinearGradient(x0, y0, x1, y1);
155
+
156
+
grad.addColorStop(0, colours[0]);
157
+
grad.addColorStop(1, colours[1]);
158
+
159
+
ctx.strokeStyle = grad;
160
+
ctx.lineWidth = 3 * position.scale;
161
+
162
+
drawCurve(ctx, x0, y0, x1, y1);
140
163
ctx.stroke();
141
164
})
142
165
})
···
148
171
contextMenu: ContextMenu
149
172
) => {
150
173
if(contextMenu.visible){
151
-
ctx.font = '20px Arial';
174
+
ctx.font = '20px Rubik';
152
175
ctx.textBaseline = 'top';
153
176
ctx.textAlign = 'left';
154
177
···
192
215
let startX = canvas.width / -2;
193
216
let startY = canvas.height / -2;
194
217
195
-
ctx.fillStyle = '#f00';
218
+
// DEBUG STUFF
219
+
// ctx.fillStyle = '#f00';
196
220
197
-
ctx.fillRect(
198
-
(drawingTo[0] + 10 + startX + position.x) * position.scale,
199
-
(drawingTo[1] + 10 + startY + position.y) * position.scale,
200
-
10, 10
201
-
);
221
+
// ctx.fillRect(
222
+
// (drawingTo[0] + 10 + startX + position.x) * position.scale,
223
+
// (drawingTo[1] + 10 + startY + position.y) * position.scale,
224
+
// 10, 10
225
+
// );
202
226
203
-
ctx.fillRect(
204
-
(drawingFrom.parent.x + (drawingFrom.parent.w - 30) + 10 + startX + position.x) * position.scale,
205
-
(drawingFrom.parent.y + 50 + (30 * drawingFrom.index) + 10 + startY + position.y) * position.scale,
206
-
10, 10
207
-
);
227
+
// ctx.fillRect(
228
+
// (drawingFrom.parent.x + (drawingFrom.parent.w - 10) + 10 + startX + position.x) * position.scale,
229
+
// (drawingFrom.parent.y + 50 + (30 * drawingFrom.index) + 10 + startY + position.y) * position.scale,
230
+
// 10, 10
231
+
// );
208
232
209
233
ctx.strokeStyle = NodeIOLinkColours(drawingFrom);
234
+
ctx.lineWidth = 3 * position.scale;
235
+
236
+
let nodeX = Math.round(drawingFrom.parent.x / 10) * 10;
237
+
let nodeY = Math.round(drawingFrom.parent.y / 10) * 10;
238
+
210
239
drawCurve(ctx,
211
-
(drawingFrom.parent.x + (drawingFrom.parent.w - 30) + 10 + startX + position.x) * position.scale,
212
-
(drawingFrom.parent.y + 50 + (30 * drawingFrom.index) + 10 + startY + position.y) * position.scale,
240
+
(nodeX + (drawingFrom.parent.w - 10) + 10 + startX + position.x) * position.scale,
241
+
(nodeY + 50 + (30 * drawingFrom.index) + 10 + startY + position.y) * position.scale,
213
242
(drawingTo[0] + 10 + startX + position.x) * position.scale,
214
243
(drawingTo[1] + 10 + startY + position.y) * position.scale,
215
244
);
···
239
268
) => {
240
269
ctx.fillStyle = '#fff';
241
270
242
-
ctx.font = '20px Arial';
271
+
ctx.font = '20px Rubik';
243
272
ctx.textBaseline = 'middle';
244
273
ctx.textAlign = 'center';
245
274
246
275
let textX = lerp((canvas.width / -2) + 200, canvas.width / 2, 0.5);
247
276
let textY = lerp((canvas.height / -2) + 40, canvas.height / 2, 0.5);
248
277
249
-
ctx.font = '40px Arial';
278
+
ctx.font = '40px Rubik';
250
279
ctx.fillText('Welcome to VRCMacros', textX, textY);
251
280
252
-
ctx.font = '20px Arial';
281
+
ctx.font = '20px Rubik';
253
282
ctx.fillText('Create a new tab to get started!', textX, textY + 40);
254
283
}
255
284
+7
src/structs/Tab.ts
+7
src/structs/Tab.ts
+42
-4
src/structs/node.ts
+42
-4
src/structs/node.ts
···
12
12
outputs: NodeIO[];
13
13
selected: boolean;
14
14
statics: NodeStatic[];
15
-
onStaticsUpdate: ( node: Node ) => void;
15
+
onStaticsUpdate: ( node: Node ) => Promise<void>;
16
16
17
17
constructor( pos: [ number, number ], node: NodeDefinition, id: string ){
18
18
this.name = node.name;
···
20
20
this.typeId = node.typeId!;
21
21
this.x = pos[0];
22
22
this.y = pos[1];
23
-
this.w = node.w!;
24
-
this.h = node.h!;
25
23
26
24
this.inputs = node.inputs ? node.inputs.map(( x, indx ) => {
27
25
return {
···
43
41
}
44
42
}) : [];
45
43
44
+
this.w = node.w || 200;
45
+
this.h = 50 + Math.max(this.outputs.length, this.inputs.length) * 30;
46
+
46
47
this.selected = false;
47
48
this.statics = node.statics!,
48
49
this.onStaticsUpdate = node.onStaticsUpdate!;
50
+
}
51
+
52
+
updateSize(){
53
+
this.h = 50 + Math.max(this.outputs.length, this.inputs.length) * 30;
49
54
}
50
55
}
51
56
···
74
79
ParameterList = 10
75
80
}
76
81
82
+
let NodeIOCastTable: any = {
83
+
1: { 2: true, 3: true, 4: true }, // Strings -> Floats, Ints, Bools
84
+
2: { 1: true, 3: true }, // Floats -> Strings, Ints
85
+
3: { 1: true, 2: true, 4: true }, // Ints -> Strings, Floats, Bools
86
+
4: { 1: true, 2: true, 3: true } // Bools -> Strings, Ints, Floats
87
+
};
88
+
89
+
export let NodeIOCanCast = ( input: NodeType | null, output: NodeType | null ): boolean => {
90
+
if(input === output)return true;
91
+
if(!input || !output)return false;
92
+
93
+
let CastFrom = NodeIOCastTable[input];
94
+
if(!CastFrom)return false;
95
+
96
+
let CastTo = CastFrom[output];
97
+
if(!CastTo)return false;
98
+
99
+
return true;
100
+
}
101
+
77
102
export let NodeIOResolveAnyTypes = ( nodeio: NodeIO ): NodeType | null => {
78
103
if(nodeio.type > 0 && nodeio.type < 6){
79
104
// It's a base type
···
105
130
return null;
106
131
}
107
132
108
-
export let NodeIOLinkColours = ( nodeio: NodeIO ) => {
133
+
export let NodeIOLinkColours = ( nodeio: NodeIO, output?: NodeIO ) => {
109
134
let cols: any = {
110
135
1: '#ffff9f',
111
136
2: '#cda0cb',
···
115
140
}
116
141
117
142
let type = NodeIOResolveAnyTypes(nodeio);
143
+
if(output){
144
+
let outputType = NodeIOResolveAnyTypes(output);
145
+
let startType = type ? cols[type] : '#fff5';
146
+
147
+
if(type !== outputType){
148
+
let endType = outputType ? cols[outputType] : '#fff5';
149
+
150
+
return [ startType, endType ];
151
+
} else{
152
+
return [ startType, startType ];
153
+
}
154
+
}
155
+
118
156
return type ? cols[type] : '#fff5';
119
157
}
120
158
+80
src/utils/clipboard.ts
+80
src/utils/clipboard.ts
···
1
+
import { NodeManager } from "../Mangers/NodeManager";
2
+
import { NodesByID } from "../Nodes/Nodes";
3
+
import { Node } from "../structs/node";
4
+
5
+
export let encodeNodeList = ( selectedNodes: Node[], mousePos: [ number, number ] ): string => {
6
+
let arr: any[] = [];
7
+
8
+
for(let node of selectedNodes){
9
+
arr.push({
10
+
id: node.id,
11
+
type_id: node.typeId,
12
+
statics: node.statics,
13
+
x: node.x - mousePos[0],
14
+
y: node.y - mousePos[1],
15
+
outputs: node.outputs.map(x => {
16
+
return x.connections.map(x => {
17
+
return { node: x.parent.id, index: x.index } }) })
18
+
})
19
+
}
20
+
21
+
for(let node of arr){
22
+
for(let output of node.outputs){
23
+
for(let i in output){
24
+
let indx = arr.findIndex(x => x.id === output[i].node);
25
+
if(indx === -1)
26
+
delete output[i];
27
+
else
28
+
output[i].node = indx;
29
+
}
30
+
}
31
+
}
32
+
33
+
for(let node of arr)delete node.id;
34
+
35
+
console.log(arr);
36
+
return 'VRCMACRO' + btoa(JSON.stringify(arr));
37
+
}
38
+
39
+
export let decodeNodeList = async ( text: string, mousePos: [ number, number ] ): Promise<Node[] | null> => {
40
+
if(!text.startsWith("VRCMACRO"))return null;
41
+
42
+
let data = text.slice(8);
43
+
let json = JSON.parse(atob(data));
44
+
45
+
let nodes: Node[] = [];
46
+
for(let node of json){
47
+
let n = new Node(
48
+
[ node.x + mousePos[0] + 10, node.y + mousePos[1] + 10 ],
49
+
NodesByID[node.type_id],
50
+
await NodeManager.Instance.GetNewNodeId()
51
+
);
52
+
53
+
n.statics = node.statics;
54
+
await n.onStaticsUpdate(n);
55
+
56
+
nodes.push(n);
57
+
}
58
+
59
+
for(let i in nodes){
60
+
let outputs: { node: number, index: number }[][] = json[i].outputs;
61
+
let node = nodes[i];
62
+
63
+
for(let j in outputs){
64
+
let output = node.outputs[j];
65
+
66
+
for(let k in outputs[j]){
67
+
let connection = outputs[j][k];
68
+
if(!connection)continue;
69
+
70
+
let peerNode = nodes[connection.node];
71
+
let input = peerNode.inputs[connection.index];
72
+
73
+
output.connections.push(input);
74
+
input.connections.push(output);
75
+
}
76
+
}
77
+
}
78
+
79
+
return nodes;
80
+
}
+1413
-683
src-tauri/Cargo.lock
+1413
-683
src-tauri/Cargo.lock
···
7
7
version = "0.1.0"
8
8
dependencies = [
9
9
"anyhow",
10
+
"chrono",
11
+
"crossbeam-channel",
10
12
"dirs",
13
+
"enigo",
11
14
"flate2",
12
15
"serde",
13
16
"serde_json",
14
17
"tauri",
15
18
"tauri-build",
19
+
"tauri-plugin-clipboard-manager",
20
+
"tauri-plugin-dialog",
16
21
"tauri-plugin-opener",
22
+
"tauri-plugin-os",
17
23
"tokio",
18
24
]
19
25
20
26
[[package]]
21
-
name = "addr2line"
22
-
version = "0.24.2"
23
-
source = "registry+https://github.com/rust-lang/crates.io-index"
24
-
checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
25
-
dependencies = [
26
-
"gimli",
27
-
]
28
-
29
-
[[package]]
30
27
name = "adler2"
31
28
version = "2.0.1"
32
29
source = "registry+https://github.com/rust-lang/crates.io-index"
···
34
31
35
32
[[package]]
36
33
name = "aho-corasick"
37
-
version = "1.1.3"
34
+
version = "1.1.4"
38
35
source = "registry+https://github.com/rust-lang/crates.io-index"
39
-
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
36
+
checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
40
37
dependencies = [
41
38
"memchr",
42
39
]
···
57
54
]
58
55
59
56
[[package]]
60
-
name = "android-tzdata"
61
-
version = "0.1.1"
62
-
source = "registry+https://github.com/rust-lang/crates.io-index"
63
-
checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
64
-
65
-
[[package]]
66
57
name = "android_system_properties"
67
58
version = "0.1.5"
68
59
source = "registry+https://github.com/rust-lang/crates.io-index"
···
73
64
74
65
[[package]]
75
66
name = "anyhow"
76
-
version = "1.0.99"
67
+
version = "1.0.100"
68
+
source = "registry+https://github.com/rust-lang/crates.io-index"
69
+
checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
70
+
71
+
[[package]]
72
+
name = "arboard"
73
+
version = "3.6.1"
77
74
source = "registry+https://github.com/rust-lang/crates.io-index"
78
-
checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100"
75
+
checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf"
76
+
dependencies = [
77
+
"clipboard-win",
78
+
"image",
79
+
"log",
80
+
"objc2 0.6.3",
81
+
"objc2-app-kit",
82
+
"objc2-core-foundation",
83
+
"objc2-core-graphics",
84
+
"objc2-foundation 0.3.2",
85
+
"parking_lot",
86
+
"percent-encoding",
87
+
"windows-sys 0.60.2",
88
+
"wl-clipboard-rs",
89
+
"x11rb",
90
+
]
91
+
92
+
[[package]]
93
+
name = "ashpd"
94
+
version = "0.11.0"
95
+
source = "registry+https://github.com/rust-lang/crates.io-index"
96
+
checksum = "6cbdf310d77fd3aaee6ea2093db7011dc2d35d2eb3481e5607f1f8d942ed99df"
97
+
dependencies = [
98
+
"enumflags2",
99
+
"futures-channel",
100
+
"futures-util",
101
+
"rand 0.9.2",
102
+
"raw-window-handle",
103
+
"serde",
104
+
"serde_repr",
105
+
"tokio",
106
+
"url",
107
+
"wayland-backend",
108
+
"wayland-client",
109
+
"wayland-protocols",
110
+
"zbus",
111
+
]
79
112
80
113
[[package]]
81
114
name = "async-broadcast"
···
103
136
104
137
[[package]]
105
138
name = "async-executor"
106
-
version = "1.13.2"
139
+
version = "1.13.3"
107
140
source = "registry+https://github.com/rust-lang/crates.io-index"
108
-
checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa"
141
+
checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8"
109
142
dependencies = [
110
143
"async-task",
111
144
"concurrent-queue",
···
117
150
118
151
[[package]]
119
152
name = "async-io"
120
-
version = "2.5.0"
153
+
version = "2.6.0"
121
154
source = "registry+https://github.com/rust-lang/crates.io-index"
122
-
checksum = "19634d6336019ef220f09fd31168ce5c184b295cbf80345437cc36094ef223ca"
155
+
checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc"
123
156
dependencies = [
124
-
"async-lock",
157
+
"autocfg",
125
158
"cfg-if",
126
159
"concurrent-queue",
127
160
"futures-io",
128
161
"futures-lite",
129
162
"parking",
130
163
"polling",
131
-
"rustix",
164
+
"rustix 1.1.2",
132
165
"slab",
133
-
"windows-sys 0.60.2",
166
+
"windows-sys 0.61.2",
134
167
]
135
168
136
169
[[package]]
137
170
name = "async-lock"
138
-
version = "3.4.0"
171
+
version = "3.4.1"
139
172
source = "registry+https://github.com/rust-lang/crates.io-index"
140
-
checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18"
173
+
checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc"
141
174
dependencies = [
142
175
"event-listener",
143
176
"event-listener-strategy",
···
146
179
147
180
[[package]]
148
181
name = "async-process"
149
-
version = "2.4.0"
182
+
version = "2.5.0"
150
183
source = "registry+https://github.com/rust-lang/crates.io-index"
151
-
checksum = "65daa13722ad51e6ab1a1b9c01299142bc75135b337923cfa10e79bbbd669f00"
184
+
checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75"
152
185
dependencies = [
153
186
"async-channel",
154
187
"async-io",
···
159
192
"cfg-if",
160
193
"event-listener",
161
194
"futures-lite",
162
-
"rustix",
195
+
"rustix 1.1.2",
163
196
]
164
197
165
198
[[package]]
···
170
203
dependencies = [
171
204
"proc-macro2",
172
205
"quote",
173
-
"syn 2.0.104",
206
+
"syn 2.0.109",
174
207
]
175
208
176
209
[[package]]
177
210
name = "async-signal"
178
-
version = "0.2.12"
211
+
version = "0.2.13"
179
212
source = "registry+https://github.com/rust-lang/crates.io-index"
180
-
checksum = "f567af260ef69e1d52c2b560ce0ea230763e6fbb9214a85d768760a920e3e3c1"
213
+
checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c"
181
214
dependencies = [
182
215
"async-io",
183
216
"async-lock",
···
185
218
"cfg-if",
186
219
"futures-core",
187
220
"futures-io",
188
-
"rustix",
221
+
"rustix 1.1.2",
189
222
"signal-hook-registry",
190
223
"slab",
191
-
"windows-sys 0.60.2",
224
+
"windows-sys 0.61.2",
192
225
]
193
226
194
227
[[package]]
···
199
232
200
233
[[package]]
201
234
name = "async-trait"
202
-
version = "0.1.88"
235
+
version = "0.1.89"
203
236
source = "registry+https://github.com/rust-lang/crates.io-index"
204
-
checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5"
237
+
checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
205
238
dependencies = [
206
239
"proc-macro2",
207
240
"quote",
208
-
"syn 2.0.104",
241
+
"syn 2.0.109",
209
242
]
210
243
211
244
[[package]]
···
244
277
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
245
278
246
279
[[package]]
247
-
name = "backtrace"
248
-
version = "0.3.75"
249
-
source = "registry+https://github.com/rust-lang/crates.io-index"
250
-
checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002"
251
-
dependencies = [
252
-
"addr2line",
253
-
"cfg-if",
254
-
"libc",
255
-
"miniz_oxide",
256
-
"object",
257
-
"rustc-demangle",
258
-
"windows-targets 0.52.6",
259
-
]
260
-
261
-
[[package]]
262
280
name = "base64"
263
281
version = "0.21.7"
264
282
source = "registry+https://github.com/rust-lang/crates.io-index"
···
278
296
279
297
[[package]]
280
298
name = "bitflags"
281
-
version = "2.9.1"
299
+
version = "2.10.0"
282
300
source = "registry+https://github.com/rust-lang/crates.io-index"
283
-
checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967"
301
+
checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3"
284
302
dependencies = [
285
-
"serde",
303
+
"serde_core",
286
304
]
287
305
288
306
[[package]]
···
305
323
306
324
[[package]]
307
325
name = "block2"
308
-
version = "0.6.1"
326
+
version = "0.6.2"
309
327
source = "registry+https://github.com/rust-lang/crates.io-index"
310
-
checksum = "340d2f0bdb2a43c1d3cd40513185b2bd7def0aa1052f956455114bc98f82dcf2"
328
+
checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5"
311
329
dependencies = [
312
-
"objc2 0.6.1",
330
+
"objc2 0.6.3",
313
331
]
314
332
315
333
[[package]]
···
327
345
328
346
[[package]]
329
347
name = "brotli"
330
-
version = "8.0.1"
348
+
version = "8.0.2"
331
349
source = "registry+https://github.com/rust-lang/crates.io-index"
332
-
checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d"
350
+
checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560"
333
351
dependencies = [
334
352
"alloc-no-stdlib",
335
353
"alloc-stdlib",
···
354
372
355
373
[[package]]
356
374
name = "bytemuck"
357
-
version = "1.23.1"
375
+
version = "1.24.0"
358
376
source = "registry+https://github.com/rust-lang/crates.io-index"
359
-
checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422"
377
+
checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4"
360
378
361
379
[[package]]
362
380
name = "byteorder"
···
365
383
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
366
384
367
385
[[package]]
386
+
name = "byteorder-lite"
387
+
version = "0.1.0"
388
+
source = "registry+https://github.com/rust-lang/crates.io-index"
389
+
checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"
390
+
391
+
[[package]]
368
392
name = "bytes"
369
393
version = "1.10.1"
370
394
source = "registry+https://github.com/rust-lang/crates.io-index"
···
379
403
source = "registry+https://github.com/rust-lang/crates.io-index"
380
404
checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2"
381
405
dependencies = [
382
-
"bitflags 2.9.1",
406
+
"bitflags 2.10.0",
383
407
"cairo-sys-rs",
384
408
"glib",
385
409
"libc",
···
400
424
401
425
[[package]]
402
426
name = "camino"
403
-
version = "1.1.10"
427
+
version = "1.2.1"
404
428
source = "registry+https://github.com/rust-lang/crates.io-index"
405
-
checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab"
429
+
checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609"
406
430
dependencies = [
407
-
"serde",
431
+
"serde_core",
408
432
]
409
433
410
434
[[package]]
···
427
451
"semver",
428
452
"serde",
429
453
"serde_json",
430
-
"thiserror 2.0.12",
454
+
"thiserror 2.0.17",
431
455
]
432
456
433
457
[[package]]
···
437
461
checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77"
438
462
dependencies = [
439
463
"serde",
440
-
"toml 0.9.3",
464
+
"toml 0.9.8",
441
465
]
442
466
443
467
[[package]]
444
468
name = "cc"
445
-
version = "1.2.30"
469
+
version = "1.2.45"
446
470
source = "registry+https://github.com/rust-lang/crates.io-index"
447
-
checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7"
471
+
checksum = "35900b6c8d709fb1d854671ae27aeaa9eec2f8b01b364e1619a40da3e6fe2afe"
448
472
dependencies = [
473
+
"find-msvc-tools",
449
474
"shlex",
450
475
]
451
476
···
478
503
479
504
[[package]]
480
505
name = "cfg-if"
481
-
version = "1.0.1"
506
+
version = "1.0.4"
482
507
source = "registry+https://github.com/rust-lang/crates.io-index"
483
-
checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
508
+
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
484
509
485
510
[[package]]
486
511
name = "cfg_aliases"
···
490
515
491
516
[[package]]
492
517
name = "chrono"
493
-
version = "0.4.41"
518
+
version = "0.4.42"
494
519
source = "registry+https://github.com/rust-lang/crates.io-index"
495
-
checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d"
520
+
checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2"
496
521
dependencies = [
497
-
"android-tzdata",
498
522
"iana-time-zone",
523
+
"js-sys",
499
524
"num-traits",
500
525
"serde",
501
-
"windows-link",
526
+
"wasm-bindgen",
527
+
"windows-link 0.2.1",
528
+
]
529
+
530
+
[[package]]
531
+
name = "clipboard-win"
532
+
version = "5.4.1"
533
+
source = "registry+https://github.com/rust-lang/crates.io-index"
534
+
checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4"
535
+
dependencies = [
536
+
"error-code",
502
537
]
503
538
504
539
[[package]]
···
558
593
source = "registry+https://github.com/rust-lang/crates.io-index"
559
594
checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1"
560
595
dependencies = [
561
-
"bitflags 2.9.1",
596
+
"bitflags 2.10.0",
597
+
"core-foundation",
598
+
"core-graphics-types",
599
+
"foreign-types",
600
+
"libc",
601
+
]
602
+
603
+
[[package]]
604
+
name = "core-graphics"
605
+
version = "0.25.0"
606
+
source = "registry+https://github.com/rust-lang/crates.io-index"
607
+
checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97"
608
+
dependencies = [
609
+
"bitflags 2.10.0",
562
610
"core-foundation",
563
611
"core-graphics-types",
564
612
"foreign-types",
···
571
619
source = "registry+https://github.com/rust-lang/crates.io-index"
572
620
checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb"
573
621
dependencies = [
574
-
"bitflags 2.9.1",
622
+
"bitflags 2.10.0",
575
623
"core-foundation",
576
624
"libc",
577
625
]
···
608
656
version = "0.8.21"
609
657
source = "registry+https://github.com/rust-lang/crates.io-index"
610
658
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
659
+
660
+
[[package]]
661
+
name = "crunchy"
662
+
version = "0.2.4"
663
+
source = "registry+https://github.com/rust-lang/crates.io-index"
664
+
checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5"
611
665
612
666
[[package]]
613
667
name = "crypto-common"
···
643
697
checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
644
698
dependencies = [
645
699
"quote",
646
-
"syn 2.0.104",
700
+
"syn 2.0.109",
647
701
]
648
702
649
703
[[package]]
···
653
707
checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501"
654
708
dependencies = [
655
709
"quote",
656
-
"syn 2.0.104",
710
+
"syn 2.0.109",
657
711
]
658
712
659
713
[[package]]
660
714
name = "darling"
661
-
version = "0.20.11"
715
+
version = "0.21.3"
662
716
source = "registry+https://github.com/rust-lang/crates.io-index"
663
-
checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee"
717
+
checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0"
664
718
dependencies = [
665
719
"darling_core",
666
720
"darling_macro",
···
668
722
669
723
[[package]]
670
724
name = "darling_core"
671
-
version = "0.20.11"
725
+
version = "0.21.3"
672
726
source = "registry+https://github.com/rust-lang/crates.io-index"
673
-
checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e"
727
+
checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4"
674
728
dependencies = [
675
729
"fnv",
676
730
"ident_case",
677
731
"proc-macro2",
678
732
"quote",
679
733
"strsim",
680
-
"syn 2.0.104",
734
+
"syn 2.0.109",
681
735
]
682
736
683
737
[[package]]
684
738
name = "darling_macro"
685
-
version = "0.20.11"
739
+
version = "0.21.3"
686
740
source = "registry+https://github.com/rust-lang/crates.io-index"
687
-
checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"
741
+
checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81"
688
742
dependencies = [
689
743
"darling_core",
690
744
"quote",
691
-
"syn 2.0.104",
745
+
"syn 2.0.109",
692
746
]
693
747
694
748
[[package]]
695
749
name = "deranged"
696
-
version = "0.4.0"
750
+
version = "0.5.5"
697
751
source = "registry+https://github.com/rust-lang/crates.io-index"
698
-
checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e"
752
+
checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587"
699
753
dependencies = [
700
754
"powerfmt",
701
-
"serde",
755
+
"serde_core",
702
756
]
703
757
704
758
[[package]]
···
711
765
"proc-macro2",
712
766
"quote",
713
767
"rustc_version",
714
-
"syn 2.0.104",
768
+
"syn 2.0.109",
715
769
]
716
770
717
771
[[package]]
···
742
796
"libc",
743
797
"option-ext",
744
798
"redox_users",
745
-
"windows-sys 0.60.2",
799
+
"windows-sys 0.61.2",
746
800
]
747
801
748
802
[[package]]
···
757
811
source = "registry+https://github.com/rust-lang/crates.io-index"
758
812
checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec"
759
813
dependencies = [
760
-
"bitflags 2.9.1",
761
-
"objc2 0.6.1",
814
+
"bitflags 2.10.0",
815
+
"block2 0.6.2",
816
+
"libc",
817
+
"objc2 0.6.3",
762
818
]
763
819
764
820
[[package]]
···
769
825
dependencies = [
770
826
"proc-macro2",
771
827
"quote",
772
-
"syn 2.0.104",
828
+
"syn 2.0.109",
829
+
]
830
+
831
+
[[package]]
832
+
name = "dlib"
833
+
version = "0.5.2"
834
+
source = "registry+https://github.com/rust-lang/crates.io-index"
835
+
checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412"
836
+
dependencies = [
837
+
"libloading 0.8.9",
773
838
]
774
839
775
840
[[package]]
776
841
name = "dlopen2"
777
-
version = "0.7.0"
842
+
version = "0.8.0"
778
843
source = "registry+https://github.com/rust-lang/crates.io-index"
779
-
checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6"
844
+
checksum = "b54f373ccf864bf587a89e880fb7610f8d73f3045f13580948ccbcaff26febff"
780
845
dependencies = [
781
846
"dlopen2_derive",
782
847
"libc",
···
792
857
dependencies = [
793
858
"proc-macro2",
794
859
"quote",
795
-
"syn 2.0.104",
860
+
"syn 2.0.109",
796
861
]
862
+
863
+
[[package]]
864
+
name = "downcast-rs"
865
+
version = "1.2.1"
866
+
source = "registry+https://github.com/rust-lang/crates.io-index"
867
+
checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2"
797
868
798
869
[[package]]
799
870
name = "dpi"
···
833
904
834
905
[[package]]
835
906
name = "embed-resource"
836
-
version = "3.0.5"
907
+
version = "3.0.6"
837
908
source = "registry+https://github.com/rust-lang/crates.io-index"
838
-
checksum = "4c6d81016d6c977deefb2ef8d8290da019e27cc26167e102185da528e6c0ab38"
909
+
checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e"
839
910
dependencies = [
840
911
"cc",
841
912
"memchr",
842
913
"rustc_version",
843
-
"toml 0.9.3",
914
+
"toml 0.9.8",
844
915
"vswhom",
845
916
"winreg",
846
917
]
···
858
929
checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf"
859
930
860
931
[[package]]
932
+
name = "enigo"
933
+
version = "0.6.1"
934
+
source = "registry+https://github.com/rust-lang/crates.io-index"
935
+
checksum = "71c6c56e50f7acae2906a0dcbb34529ca647e40421119ad5d12e7f8ba6e50010"
936
+
dependencies = [
937
+
"core-foundation",
938
+
"core-graphics 0.25.0",
939
+
"foreign-types-shared",
940
+
"libc",
941
+
"log",
942
+
"nom 8.0.0",
943
+
"objc2 0.6.3",
944
+
"objc2-app-kit",
945
+
"objc2-foundation 0.3.2",
946
+
"windows",
947
+
"x11rb",
948
+
"xkbcommon",
949
+
"xkeysym",
950
+
]
951
+
952
+
[[package]]
861
953
name = "enumflags2"
862
954
version = "0.7.12"
863
955
source = "registry+https://github.com/rust-lang/crates.io-index"
···
875
967
dependencies = [
876
968
"proc-macro2",
877
969
"quote",
878
-
"syn 2.0.104",
970
+
"syn 2.0.109",
879
971
]
880
972
881
973
[[package]]
···
886
978
887
979
[[package]]
888
980
name = "erased-serde"
889
-
version = "0.4.6"
981
+
version = "0.4.9"
890
982
source = "registry+https://github.com/rust-lang/crates.io-index"
891
-
checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7"
983
+
checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3"
892
984
dependencies = [
893
985
"serde",
986
+
"serde_core",
894
987
"typeid",
895
988
]
896
989
897
990
[[package]]
898
991
name = "errno"
899
-
version = "0.3.13"
992
+
version = "0.3.14"
900
993
source = "registry+https://github.com/rust-lang/crates.io-index"
901
-
checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad"
994
+
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
902
995
dependencies = [
903
996
"libc",
904
-
"windows-sys 0.60.2",
997
+
"windows-sys 0.61.2",
905
998
]
906
999
907
1000
[[package]]
1001
+
name = "error-code"
1002
+
version = "3.3.2"
1003
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1004
+
checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59"
1005
+
1006
+
[[package]]
908
1007
name = "event-listener"
909
-
version = "5.4.0"
1008
+
version = "5.4.1"
910
1009
source = "registry+https://github.com/rust-lang/crates.io-index"
911
-
checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae"
1010
+
checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab"
912
1011
dependencies = [
913
1012
"concurrent-queue",
914
1013
"parking",
···
932
1031
checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
933
1032
934
1033
[[package]]
1034
+
name = "fax"
1035
+
version = "0.2.6"
1036
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1037
+
checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab"
1038
+
dependencies = [
1039
+
"fax_derive",
1040
+
]
1041
+
1042
+
[[package]]
1043
+
name = "fax_derive"
1044
+
version = "0.2.0"
1045
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1046
+
checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d"
1047
+
dependencies = [
1048
+
"proc-macro2",
1049
+
"quote",
1050
+
"syn 2.0.109",
1051
+
]
1052
+
1053
+
[[package]]
935
1054
name = "fdeflate"
936
1055
version = "0.3.7"
937
1056
source = "registry+https://github.com/rust-lang/crates.io-index"
···
951
1070
]
952
1071
953
1072
[[package]]
1073
+
name = "find-msvc-tools"
1074
+
version = "0.1.4"
1075
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1076
+
checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127"
1077
+
1078
+
[[package]]
1079
+
name = "fixedbitset"
1080
+
version = "0.5.7"
1081
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1082
+
checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99"
1083
+
1084
+
[[package]]
954
1085
name = "flate2"
955
-
version = "1.1.2"
1086
+
version = "1.1.5"
956
1087
source = "registry+https://github.com/rust-lang/crates.io-index"
957
-
checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d"
1088
+
checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb"
958
1089
dependencies = [
959
1090
"crc32fast",
960
1091
"miniz_oxide",
···
967
1098
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
968
1099
969
1100
[[package]]
1101
+
name = "foldhash"
1102
+
version = "0.1.5"
1103
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1104
+
checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
1105
+
1106
+
[[package]]
970
1107
name = "foreign-types"
971
1108
version = "0.5.0"
972
1109
source = "registry+https://github.com/rust-lang/crates.io-index"
···
984
1121
dependencies = [
985
1122
"proc-macro2",
986
1123
"quote",
987
-
"syn 2.0.104",
1124
+
"syn 2.0.109",
988
1125
]
989
1126
990
1127
[[package]]
···
995
1132
996
1133
[[package]]
997
1134
name = "form_urlencoded"
998
-
version = "1.2.1"
1135
+
version = "1.2.2"
999
1136
source = "registry+https://github.com/rust-lang/crates.io-index"
1000
-
checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
1137
+
checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
1001
1138
dependencies = [
1002
1139
"percent-encoding",
1003
1140
]
···
1046
1183
1047
1184
[[package]]
1048
1185
name = "futures-lite"
1049
-
version = "2.6.0"
1186
+
version = "2.6.1"
1050
1187
source = "registry+https://github.com/rust-lang/crates.io-index"
1051
-
checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532"
1188
+
checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad"
1052
1189
dependencies = [
1053
1190
"fastrand",
1054
1191
"futures-core",
···
1065
1202
dependencies = [
1066
1203
"proc-macro2",
1067
1204
"quote",
1068
-
"syn 2.0.104",
1205
+
"syn 2.0.109",
1069
1206
]
1070
1207
1071
1208
[[package]]
···
1207
1344
1208
1345
[[package]]
1209
1346
name = "generic-array"
1210
-
version = "0.14.7"
1347
+
version = "0.14.9"
1211
1348
source = "registry+https://github.com/rust-lang/crates.io-index"
1212
-
checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
1349
+
checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2"
1213
1350
dependencies = [
1214
1351
"typenum",
1215
1352
"version_check",
1353
+
]
1354
+
1355
+
[[package]]
1356
+
name = "gethostname"
1357
+
version = "1.1.0"
1358
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1359
+
checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8"
1360
+
dependencies = [
1361
+
"rustix 1.1.2",
1362
+
"windows-link 0.2.1",
1216
1363
]
1217
1364
1218
1365
[[package]]
···
1239
1386
1240
1387
[[package]]
1241
1388
name = "getrandom"
1242
-
version = "0.3.3"
1389
+
version = "0.3.4"
1243
1390
source = "registry+https://github.com/rust-lang/crates.io-index"
1244
-
checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4"
1391
+
checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
1245
1392
dependencies = [
1246
1393
"cfg-if",
1247
1394
"libc",
1248
1395
"r-efi",
1249
-
"wasi 0.14.2+wasi-0.2.4",
1396
+
"wasip2",
1250
1397
]
1251
1398
1252
1399
[[package]]
1253
-
name = "gimli"
1254
-
version = "0.31.1"
1255
-
source = "registry+https://github.com/rust-lang/crates.io-index"
1256
-
checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
1257
-
1258
-
[[package]]
1259
1400
name = "gio"
1260
1401
version = "0.18.4"
1261
1402
source = "registry+https://github.com/rust-lang/crates.io-index"
···
1293
1434
source = "registry+https://github.com/rust-lang/crates.io-index"
1294
1435
checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5"
1295
1436
dependencies = [
1296
-
"bitflags 2.9.1",
1437
+
"bitflags 2.10.0",
1297
1438
"futures-channel",
1298
1439
"futures-core",
1299
1440
"futures-executor",
···
1317
1458
checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc"
1318
1459
dependencies = [
1319
1460
"heck 0.4.1",
1320
-
"proc-macro-crate 2.0.0",
1461
+
"proc-macro-crate 2.0.2",
1321
1462
"proc-macro-error",
1322
1463
"proc-macro2",
1323
1464
"quote",
1324
-
"syn 2.0.104",
1465
+
"syn 2.0.109",
1325
1466
]
1326
1467
1327
1468
[[package]]
···
1336
1477
1337
1478
[[package]]
1338
1479
name = "glob"
1339
-
version = "0.3.2"
1480
+
version = "0.3.3"
1340
1481
source = "registry+https://github.com/rust-lang/crates.io-index"
1341
-
checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2"
1482
+
checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"
1342
1483
1343
1484
[[package]]
1344
1485
name = "gobject-sys"
···
1400
1541
"proc-macro-error",
1401
1542
"proc-macro2",
1402
1543
"quote",
1403
-
"syn 2.0.104",
1544
+
"syn 2.0.109",
1545
+
]
1546
+
1547
+
[[package]]
1548
+
name = "half"
1549
+
version = "2.7.1"
1550
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1551
+
checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b"
1552
+
dependencies = [
1553
+
"cfg-if",
1554
+
"crunchy",
1555
+
"zerocopy",
1404
1556
]
1405
1557
1406
1558
[[package]]
···
1411
1563
1412
1564
[[package]]
1413
1565
name = "hashbrown"
1414
-
version = "0.15.4"
1566
+
version = "0.15.5"
1567
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1568
+
checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
1569
+
dependencies = [
1570
+
"foldhash",
1571
+
]
1572
+
1573
+
[[package]]
1574
+
name = "hashbrown"
1575
+
version = "0.16.0"
1415
1576
source = "registry+https://github.com/rust-lang/crates.io-index"
1416
-
checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5"
1577
+
checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d"
1417
1578
1418
1579
[[package]]
1419
1580
name = "heck"
···
1493
1654
1494
1655
[[package]]
1495
1656
name = "hyper"
1496
-
version = "1.6.0"
1657
+
version = "1.7.0"
1497
1658
source = "registry+https://github.com/rust-lang/crates.io-index"
1498
-
checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80"
1659
+
checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e"
1499
1660
dependencies = [
1661
+
"atomic-waker",
1500
1662
"bytes",
1501
1663
"futures-channel",
1502
-
"futures-util",
1664
+
"futures-core",
1503
1665
"http",
1504
1666
"http-body",
1505
1667
"httparse",
1506
1668
"itoa",
1507
1669
"pin-project-lite",
1670
+
"pin-utils",
1508
1671
"smallvec",
1509
1672
"tokio",
1510
1673
"want",
···
1512
1675
1513
1676
[[package]]
1514
1677
name = "hyper-util"
1515
-
version = "0.1.16"
1678
+
version = "0.1.17"
1516
1679
source = "registry+https://github.com/rust-lang/crates.io-index"
1517
-
checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e"
1680
+
checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8"
1518
1681
dependencies = [
1519
1682
"base64 0.22.1",
1520
1683
"bytes",
···
1536
1699
1537
1700
[[package]]
1538
1701
name = "iana-time-zone"
1539
-
version = "0.1.63"
1702
+
version = "0.1.64"
1540
1703
source = "registry+https://github.com/rust-lang/crates.io-index"
1541
-
checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8"
1704
+
checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb"
1542
1705
dependencies = [
1543
1706
"android_system_properties",
1544
1707
"core-foundation-sys",
···
1546
1709
"js-sys",
1547
1710
"log",
1548
1711
"wasm-bindgen",
1549
-
"windows-core",
1712
+
"windows-core 0.62.2",
1550
1713
]
1551
1714
1552
1715
[[package]]
···
1565
1728
checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98"
1566
1729
dependencies = [
1567
1730
"byteorder",
1568
-
"png",
1731
+
"png 0.17.16",
1569
1732
]
1570
1733
1571
1734
[[package]]
1572
1735
name = "icu_collections"
1573
-
version = "2.0.0"
1736
+
version = "2.1.1"
1574
1737
source = "registry+https://github.com/rust-lang/crates.io-index"
1575
-
checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47"
1738
+
checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43"
1576
1739
dependencies = [
1577
1740
"displaydoc",
1578
1741
"potential_utf",
···
1583
1746
1584
1747
[[package]]
1585
1748
name = "icu_locale_core"
1586
-
version = "2.0.0"
1749
+
version = "2.1.1"
1587
1750
source = "registry+https://github.com/rust-lang/crates.io-index"
1588
-
checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a"
1751
+
checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6"
1589
1752
dependencies = [
1590
1753
"displaydoc",
1591
1754
"litemap",
···
1596
1759
1597
1760
[[package]]
1598
1761
name = "icu_normalizer"
1599
-
version = "2.0.0"
1762
+
version = "2.1.1"
1600
1763
source = "registry+https://github.com/rust-lang/crates.io-index"
1601
-
checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979"
1764
+
checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599"
1602
1765
dependencies = [
1603
-
"displaydoc",
1604
1766
"icu_collections",
1605
1767
"icu_normalizer_data",
1606
1768
"icu_properties",
···
1611
1773
1612
1774
[[package]]
1613
1775
name = "icu_normalizer_data"
1614
-
version = "2.0.0"
1776
+
version = "2.1.1"
1615
1777
source = "registry+https://github.com/rust-lang/crates.io-index"
1616
-
checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3"
1778
+
checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a"
1617
1779
1618
1780
[[package]]
1619
1781
name = "icu_properties"
1620
-
version = "2.0.1"
1782
+
version = "2.1.1"
1621
1783
source = "registry+https://github.com/rust-lang/crates.io-index"
1622
-
checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b"
1784
+
checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99"
1623
1785
dependencies = [
1624
-
"displaydoc",
1625
1786
"icu_collections",
1626
1787
"icu_locale_core",
1627
1788
"icu_properties_data",
1628
1789
"icu_provider",
1629
-
"potential_utf",
1630
1790
"zerotrie",
1631
1791
"zerovec",
1632
1792
]
1633
1793
1634
1794
[[package]]
1635
1795
name = "icu_properties_data"
1636
-
version = "2.0.1"
1796
+
version = "2.1.1"
1637
1797
source = "registry+https://github.com/rust-lang/crates.io-index"
1638
-
checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632"
1798
+
checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899"
1639
1799
1640
1800
[[package]]
1641
1801
name = "icu_provider"
1642
-
version = "2.0.0"
1802
+
version = "2.1.1"
1643
1803
source = "registry+https://github.com/rust-lang/crates.io-index"
1644
-
checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af"
1804
+
checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614"
1645
1805
dependencies = [
1646
1806
"displaydoc",
1647
1807
"icu_locale_core",
1648
-
"stable_deref_trait",
1649
-
"tinystr",
1650
1808
"writeable",
1651
1809
"yoke",
1652
1810
"zerofrom",
···
1662
1820
1663
1821
[[package]]
1664
1822
name = "idna"
1665
-
version = "1.0.3"
1823
+
version = "1.1.0"
1666
1824
source = "registry+https://github.com/rust-lang/crates.io-index"
1667
-
checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e"
1825
+
checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
1668
1826
dependencies = [
1669
1827
"idna_adapter",
1670
1828
"smallvec",
···
1682
1840
]
1683
1841
1684
1842
[[package]]
1843
+
name = "image"
1844
+
version = "0.25.8"
1845
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1846
+
checksum = "529feb3e6769d234375c4cf1ee2ce713682b8e76538cb13f9fc23e1400a591e7"
1847
+
dependencies = [
1848
+
"bytemuck",
1849
+
"byteorder-lite",
1850
+
"moxcms",
1851
+
"num-traits",
1852
+
"png 0.18.0",
1853
+
"tiff",
1854
+
]
1855
+
1856
+
[[package]]
1685
1857
name = "indexmap"
1686
1858
version = "1.9.3"
1687
1859
source = "registry+https://github.com/rust-lang/crates.io-index"
···
1694
1866
1695
1867
[[package]]
1696
1868
name = "indexmap"
1697
-
version = "2.10.0"
1869
+
version = "2.12.0"
1698
1870
source = "registry+https://github.com/rust-lang/crates.io-index"
1699
-
checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661"
1871
+
checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f"
1700
1872
dependencies = [
1701
1873
"equivalent",
1702
-
"hashbrown 0.15.4",
1874
+
"hashbrown 0.16.0",
1703
1875
"serde",
1876
+
"serde_core",
1704
1877
]
1705
1878
1706
1879
[[package]]
···
1713
1886
]
1714
1887
1715
1888
[[package]]
1716
-
name = "io-uring"
1717
-
version = "0.7.9"
1718
-
source = "registry+https://github.com/rust-lang/crates.io-index"
1719
-
checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4"
1720
-
dependencies = [
1721
-
"bitflags 2.9.1",
1722
-
"cfg-if",
1723
-
"libc",
1724
-
]
1725
-
1726
-
[[package]]
1727
1889
name = "ipnet"
1728
1890
version = "2.11.0"
1729
1891
source = "registry+https://github.com/rust-lang/crates.io-index"
···
1731
1893
1732
1894
[[package]]
1733
1895
name = "iri-string"
1734
-
version = "0.7.8"
1896
+
version = "0.7.9"
1735
1897
source = "registry+https://github.com/rust-lang/crates.io-index"
1736
-
checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2"
1898
+
checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397"
1737
1899
dependencies = [
1738
1900
"memchr",
1739
1901
"serde",
···
1811
1973
1812
1974
[[package]]
1813
1975
name = "js-sys"
1814
-
version = "0.3.77"
1976
+
version = "0.3.82"
1815
1977
source = "registry+https://github.com/rust-lang/crates.io-index"
1816
-
checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
1978
+
checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65"
1817
1979
dependencies = [
1818
1980
"once_cell",
1819
1981
"wasm-bindgen",
···
1847
2009
source = "registry+https://github.com/rust-lang/crates.io-index"
1848
2010
checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a"
1849
2011
dependencies = [
1850
-
"bitflags 2.9.1",
2012
+
"bitflags 2.10.0",
1851
2013
"serde",
1852
2014
"unicode-segmentation",
1853
2015
]
···
1860
2022
dependencies = [
1861
2023
"cssparser",
1862
2024
"html5ever",
1863
-
"indexmap 2.10.0",
2025
+
"indexmap 2.12.0",
1864
2026
"selectors",
1865
2027
]
1866
2028
···
1890
2052
checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf"
1891
2053
dependencies = [
1892
2054
"gtk-sys",
1893
-
"libloading",
2055
+
"libloading 0.7.4",
1894
2056
"once_cell",
1895
2057
]
1896
2058
1897
2059
[[package]]
1898
2060
name = "libc"
1899
-
version = "0.2.174"
2061
+
version = "0.2.177"
1900
2062
source = "registry+https://github.com/rust-lang/crates.io-index"
1901
-
checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776"
2063
+
checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976"
1902
2064
1903
2065
[[package]]
1904
2066
name = "libloading"
···
1911
2073
]
1912
2074
1913
2075
[[package]]
2076
+
name = "libloading"
2077
+
version = "0.8.9"
2078
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2079
+
checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55"
2080
+
dependencies = [
2081
+
"cfg-if",
2082
+
"windows-link 0.2.1",
2083
+
]
2084
+
2085
+
[[package]]
1914
2086
name = "libredox"
1915
-
version = "0.1.8"
2087
+
version = "0.1.10"
1916
2088
source = "registry+https://github.com/rust-lang/crates.io-index"
1917
-
checksum = "360e552c93fa0e8152ab463bc4c4837fce76a225df11dfaeea66c313de5e61f7"
2089
+
checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb"
1918
2090
dependencies = [
1919
-
"bitflags 2.9.1",
2091
+
"bitflags 2.10.0",
1920
2092
"libc",
1921
2093
]
1922
2094
1923
2095
[[package]]
1924
2096
name = "linux-raw-sys"
1925
-
version = "0.9.4"
2097
+
version = "0.4.15"
2098
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2099
+
checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
2100
+
2101
+
[[package]]
2102
+
name = "linux-raw-sys"
2103
+
version = "0.11.0"
1926
2104
source = "registry+https://github.com/rust-lang/crates.io-index"
1927
-
checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12"
2105
+
checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039"
1928
2106
1929
2107
[[package]]
1930
2108
name = "litemap"
1931
-
version = "0.8.0"
2109
+
version = "0.8.1"
1932
2110
source = "registry+https://github.com/rust-lang/crates.io-index"
1933
-
checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
2111
+
checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77"
1934
2112
1935
2113
[[package]]
1936
2114
name = "lock_api"
1937
-
version = "0.4.13"
2115
+
version = "0.4.14"
1938
2116
source = "registry+https://github.com/rust-lang/crates.io-index"
1939
-
checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765"
2117
+
checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
1940
2118
dependencies = [
1941
-
"autocfg",
1942
2119
"scopeguard",
1943
2120
]
1944
2121
1945
2122
[[package]]
1946
2123
name = "log"
1947
-
version = "0.4.27"
2124
+
version = "0.4.28"
1948
2125
source = "registry+https://github.com/rust-lang/crates.io-index"
1949
-
checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
2126
+
checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
1950
2127
1951
2128
[[package]]
1952
2129
name = "mac"
···
1976
2153
dependencies = [
1977
2154
"proc-macro2",
1978
2155
"quote",
1979
-
"syn 2.0.104",
2156
+
"syn 2.0.109",
1980
2157
]
1981
2158
1982
2159
[[package]]
···
1987
2164
1988
2165
[[package]]
1989
2166
name = "memchr"
1990
-
version = "2.7.5"
2167
+
version = "2.7.6"
2168
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2169
+
checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
2170
+
2171
+
[[package]]
2172
+
name = "memmap2"
2173
+
version = "0.9.9"
1991
2174
source = "registry+https://github.com/rust-lang/crates.io-index"
1992
-
checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
2175
+
checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490"
2176
+
dependencies = [
2177
+
"libc",
2178
+
]
1993
2179
1994
2180
[[package]]
1995
2181
name = "memoffset"
···
2007
2193
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
2008
2194
2009
2195
[[package]]
2196
+
name = "minimal-lexical"
2197
+
version = "0.2.1"
2198
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2199
+
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
2200
+
2201
+
[[package]]
2010
2202
name = "miniz_oxide"
2011
2203
version = "0.8.9"
2012
2204
source = "registry+https://github.com/rust-lang/crates.io-index"
···
2018
2210
2019
2211
[[package]]
2020
2212
name = "mio"
2021
-
version = "1.0.4"
2213
+
version = "1.1.0"
2022
2214
source = "registry+https://github.com/rust-lang/crates.io-index"
2023
-
checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
2215
+
checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873"
2024
2216
dependencies = [
2025
2217
"libc",
2026
2218
"wasi 0.11.1+wasi-snapshot-preview1",
2027
-
"windows-sys 0.59.0",
2219
+
"windows-sys 0.61.2",
2220
+
]
2221
+
2222
+
[[package]]
2223
+
name = "moxcms"
2224
+
version = "0.7.9"
2225
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2226
+
checksum = "0fbdd3d7436f8b5e892b8b7ea114271ff0fa00bc5acae845d53b07d498616ef6"
2227
+
dependencies = [
2228
+
"num-traits",
2229
+
"pxfm",
2028
2230
]
2029
2231
2030
2232
[[package]]
2031
2233
name = "muda"
2032
-
version = "0.17.0"
2234
+
version = "0.17.1"
2033
2235
source = "registry+https://github.com/rust-lang/crates.io-index"
2034
-
checksum = "58b89bf91c19bf036347f1ab85a81c560f08c0667c8601bece664d860a600988"
2236
+
checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a"
2035
2237
dependencies = [
2036
2238
"crossbeam-channel",
2037
2239
"dpi",
2038
2240
"gtk",
2039
2241
"keyboard-types",
2040
-
"objc2 0.6.1",
2242
+
"objc2 0.6.3",
2041
2243
"objc2-app-kit",
2042
2244
"objc2-core-foundation",
2043
-
"objc2-foundation 0.3.1",
2245
+
"objc2-foundation 0.3.2",
2044
2246
"once_cell",
2045
-
"png",
2247
+
"png 0.17.16",
2046
2248
"serde",
2047
-
"thiserror 2.0.12",
2048
-
"windows-sys 0.59.0",
2249
+
"thiserror 2.0.17",
2250
+
"windows-sys 0.60.2",
2049
2251
]
2050
2252
2051
2253
[[package]]
···
2054
2256
source = "registry+https://github.com/rust-lang/crates.io-index"
2055
2257
checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4"
2056
2258
dependencies = [
2057
-
"bitflags 2.9.1",
2259
+
"bitflags 2.10.0",
2058
2260
"jni-sys",
2059
2261
"log",
2060
2262
"ndk-sys",
···
2090
2292
source = "registry+https://github.com/rust-lang/crates.io-index"
2091
2293
checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6"
2092
2294
dependencies = [
2093
-
"bitflags 2.9.1",
2295
+
"bitflags 2.10.0",
2094
2296
"cfg-if",
2095
2297
"cfg_aliases",
2096
2298
"libc",
···
2104
2306
checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb"
2105
2307
2106
2308
[[package]]
2309
+
name = "nom"
2310
+
version = "7.1.3"
2311
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2312
+
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
2313
+
dependencies = [
2314
+
"memchr",
2315
+
"minimal-lexical",
2316
+
]
2317
+
2318
+
[[package]]
2319
+
name = "nom"
2320
+
version = "8.0.0"
2321
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2322
+
checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405"
2323
+
dependencies = [
2324
+
"memchr",
2325
+
]
2326
+
2327
+
[[package]]
2107
2328
name = "num-conv"
2108
2329
version = "0.1.0"
2109
2330
source = "registry+https://github.com/rust-lang/crates.io-index"
···
2120
2341
2121
2342
[[package]]
2122
2343
name = "num_enum"
2123
-
version = "0.7.4"
2344
+
version = "0.7.5"
2124
2345
source = "registry+https://github.com/rust-lang/crates.io-index"
2125
-
checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a"
2346
+
checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c"
2126
2347
dependencies = [
2127
2348
"num_enum_derive",
2128
2349
"rustversion",
···
2130
2351
2131
2352
[[package]]
2132
2353
name = "num_enum_derive"
2133
-
version = "0.7.4"
2354
+
version = "0.7.5"
2134
2355
source = "registry+https://github.com/rust-lang/crates.io-index"
2135
-
checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d"
2356
+
checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7"
2136
2357
dependencies = [
2137
-
"proc-macro-crate 3.3.0",
2358
+
"proc-macro-crate 3.4.0",
2138
2359
"proc-macro2",
2139
2360
"quote",
2140
-
"syn 2.0.104",
2361
+
"syn 2.0.109",
2141
2362
]
2142
2363
2143
2364
[[package]]
···
2158
2379
2159
2380
[[package]]
2160
2381
name = "objc2"
2161
-
version = "0.6.1"
2382
+
version = "0.6.3"
2162
2383
source = "registry+https://github.com/rust-lang/crates.io-index"
2163
-
checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551"
2384
+
checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05"
2164
2385
dependencies = [
2165
2386
"objc2-encode",
2166
2387
"objc2-exception-helper",
···
2168
2389
2169
2390
[[package]]
2170
2391
name = "objc2-app-kit"
2171
-
version = "0.3.1"
2392
+
version = "0.3.2"
2172
2393
source = "registry+https://github.com/rust-lang/crates.io-index"
2173
-
checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc"
2394
+
checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c"
2174
2395
dependencies = [
2175
-
"bitflags 2.9.1",
2176
-
"block2 0.6.1",
2396
+
"bitflags 2.10.0",
2397
+
"block2 0.6.2",
2177
2398
"libc",
2178
-
"objc2 0.6.1",
2399
+
"objc2 0.6.3",
2179
2400
"objc2-cloud-kit",
2180
2401
"objc2-core-data",
2181
2402
"objc2-core-foundation",
2182
2403
"objc2-core-graphics",
2183
2404
"objc2-core-image",
2184
-
"objc2-foundation 0.3.1",
2185
-
"objc2-quartz-core 0.3.1",
2405
+
"objc2-core-text",
2406
+
"objc2-core-video",
2407
+
"objc2-foundation 0.3.2",
2408
+
"objc2-quartz-core 0.3.2",
2186
2409
]
2187
2410
2188
2411
[[package]]
2189
2412
name = "objc2-cloud-kit"
2190
-
version = "0.3.1"
2413
+
version = "0.3.2"
2191
2414
source = "registry+https://github.com/rust-lang/crates.io-index"
2192
-
checksum = "17614fdcd9b411e6ff1117dfb1d0150f908ba83a7df81b1f118005fe0a8ea15d"
2415
+
checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c"
2193
2416
dependencies = [
2194
-
"bitflags 2.9.1",
2195
-
"objc2 0.6.1",
2196
-
"objc2-foundation 0.3.1",
2417
+
"bitflags 2.10.0",
2418
+
"objc2 0.6.3",
2419
+
"objc2-foundation 0.3.2",
2197
2420
]
2198
2421
2199
2422
[[package]]
2200
2423
name = "objc2-core-data"
2201
-
version = "0.3.1"
2424
+
version = "0.3.2"
2202
2425
source = "registry+https://github.com/rust-lang/crates.io-index"
2203
-
checksum = "291fbbf7d29287518e8686417cf7239c74700fd4b607623140a7d4a3c834329d"
2426
+
checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa"
2204
2427
dependencies = [
2205
-
"bitflags 2.9.1",
2206
-
"objc2 0.6.1",
2207
-
"objc2-foundation 0.3.1",
2428
+
"bitflags 2.10.0",
2429
+
"objc2 0.6.3",
2430
+
"objc2-foundation 0.3.2",
2208
2431
]
2209
2432
2210
2433
[[package]]
2211
2434
name = "objc2-core-foundation"
2212
-
version = "0.3.1"
2435
+
version = "0.3.2"
2213
2436
source = "registry+https://github.com/rust-lang/crates.io-index"
2214
-
checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166"
2437
+
checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536"
2215
2438
dependencies = [
2216
-
"bitflags 2.9.1",
2439
+
"bitflags 2.10.0",
2217
2440
"dispatch2",
2218
-
"objc2 0.6.1",
2441
+
"objc2 0.6.3",
2219
2442
]
2220
2443
2221
2444
[[package]]
2222
2445
name = "objc2-core-graphics"
2223
-
version = "0.3.1"
2446
+
version = "0.3.2"
2224
2447
source = "registry+https://github.com/rust-lang/crates.io-index"
2225
-
checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4"
2448
+
checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807"
2226
2449
dependencies = [
2227
-
"bitflags 2.9.1",
2450
+
"bitflags 2.10.0",
2228
2451
"dispatch2",
2229
-
"objc2 0.6.1",
2452
+
"objc2 0.6.3",
2230
2453
"objc2-core-foundation",
2231
2454
"objc2-io-surface",
2232
2455
]
2233
2456
2234
2457
[[package]]
2235
2458
name = "objc2-core-image"
2236
-
version = "0.3.1"
2459
+
version = "0.3.2"
2460
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2461
+
checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006"
2462
+
dependencies = [
2463
+
"objc2 0.6.3",
2464
+
"objc2-foundation 0.3.2",
2465
+
]
2466
+
2467
+
[[package]]
2468
+
name = "objc2-core-location"
2469
+
version = "0.3.2"
2470
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2471
+
checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009"
2472
+
dependencies = [
2473
+
"objc2 0.6.3",
2474
+
"objc2-foundation 0.3.2",
2475
+
]
2476
+
2477
+
[[package]]
2478
+
name = "objc2-core-text"
2479
+
version = "0.3.2"
2480
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2481
+
checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d"
2482
+
dependencies = [
2483
+
"bitflags 2.10.0",
2484
+
"objc2 0.6.3",
2485
+
"objc2-core-foundation",
2486
+
"objc2-core-graphics",
2487
+
]
2488
+
2489
+
[[package]]
2490
+
name = "objc2-core-video"
2491
+
version = "0.3.2"
2237
2492
source = "registry+https://github.com/rust-lang/crates.io-index"
2238
-
checksum = "79b3dc0cc4386b6ccf21c157591b34a7f44c8e75b064f85502901ab2188c007e"
2493
+
checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6"
2239
2494
dependencies = [
2240
-
"objc2 0.6.1",
2241
-
"objc2-foundation 0.3.1",
2495
+
"bitflags 2.10.0",
2496
+
"objc2 0.6.3",
2497
+
"objc2-core-foundation",
2498
+
"objc2-core-graphics",
2499
+
"objc2-io-surface",
2242
2500
]
2243
2501
2244
2502
[[package]]
···
2262
2520
source = "registry+https://github.com/rust-lang/crates.io-index"
2263
2521
checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8"
2264
2522
dependencies = [
2265
-
"bitflags 2.9.1",
2523
+
"bitflags 2.10.0",
2266
2524
"block2 0.5.1",
2267
2525
"libc",
2268
2526
"objc2 0.5.2",
···
2270
2528
2271
2529
[[package]]
2272
2530
name = "objc2-foundation"
2273
-
version = "0.3.1"
2531
+
version = "0.3.2"
2274
2532
source = "registry+https://github.com/rust-lang/crates.io-index"
2275
-
checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c"
2533
+
checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272"
2276
2534
dependencies = [
2277
-
"bitflags 2.9.1",
2278
-
"block2 0.6.1",
2535
+
"bitflags 2.10.0",
2536
+
"block2 0.6.2",
2279
2537
"libc",
2280
-
"objc2 0.6.1",
2538
+
"objc2 0.6.3",
2281
2539
"objc2-core-foundation",
2282
2540
]
2283
2541
2284
2542
[[package]]
2285
2543
name = "objc2-io-surface"
2286
-
version = "0.3.1"
2544
+
version = "0.3.2"
2287
2545
source = "registry+https://github.com/rust-lang/crates.io-index"
2288
-
checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c"
2546
+
checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d"
2289
2547
dependencies = [
2290
-
"bitflags 2.9.1",
2291
-
"objc2 0.6.1",
2548
+
"bitflags 2.10.0",
2549
+
"objc2 0.6.3",
2550
+
"objc2-core-foundation",
2551
+
]
2552
+
2553
+
[[package]]
2554
+
name = "objc2-javascript-core"
2555
+
version = "0.3.2"
2556
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2557
+
checksum = "2a1e6550c4caed348956ce3370c9ffeca70bb1dbed4fa96112e7c6170e074586"
2558
+
dependencies = [
2559
+
"objc2 0.6.3",
2292
2560
"objc2-core-foundation",
2293
2561
]
2294
2562
···
2298
2566
source = "registry+https://github.com/rust-lang/crates.io-index"
2299
2567
checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6"
2300
2568
dependencies = [
2301
-
"bitflags 2.9.1",
2569
+
"bitflags 2.10.0",
2302
2570
"block2 0.5.1",
2303
2571
"objc2 0.5.2",
2304
2572
"objc2-foundation 0.2.2",
···
2310
2578
source = "registry+https://github.com/rust-lang/crates.io-index"
2311
2579
checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a"
2312
2580
dependencies = [
2313
-
"bitflags 2.9.1",
2581
+
"bitflags 2.10.0",
2314
2582
"block2 0.5.1",
2315
2583
"objc2 0.5.2",
2316
2584
"objc2-foundation 0.2.2",
···
2319
2587
2320
2588
[[package]]
2321
2589
name = "objc2-quartz-core"
2322
-
version = "0.3.1"
2590
+
version = "0.3.2"
2323
2591
source = "registry+https://github.com/rust-lang/crates.io-index"
2324
-
checksum = "90ffb6a0cd5f182dc964334388560b12a57f7b74b3e2dec5e2722aa2dfb2ccd5"
2592
+
checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f"
2325
2593
dependencies = [
2326
-
"bitflags 2.9.1",
2327
-
"objc2 0.6.1",
2328
-
"objc2-foundation 0.3.1",
2594
+
"bitflags 2.10.0",
2595
+
"objc2 0.6.3",
2596
+
"objc2-core-foundation",
2597
+
"objc2-foundation 0.3.2",
2598
+
]
2599
+
2600
+
[[package]]
2601
+
name = "objc2-security"
2602
+
version = "0.3.2"
2603
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2604
+
checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a"
2605
+
dependencies = [
2606
+
"bitflags 2.10.0",
2607
+
"objc2 0.6.3",
2608
+
"objc2-core-foundation",
2329
2609
]
2330
2610
2331
2611
[[package]]
2332
2612
name = "objc2-ui-kit"
2333
-
version = "0.3.1"
2613
+
version = "0.3.2"
2334
2614
source = "registry+https://github.com/rust-lang/crates.io-index"
2335
-
checksum = "25b1312ad7bc8a0e92adae17aa10f90aae1fb618832f9b993b022b591027daed"
2615
+
checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22"
2336
2616
dependencies = [
2337
-
"bitflags 2.9.1",
2338
-
"objc2 0.6.1",
2617
+
"bitflags 2.10.0",
2618
+
"block2 0.6.2",
2619
+
"objc2 0.6.3",
2620
+
"objc2-cloud-kit",
2621
+
"objc2-core-data",
2339
2622
"objc2-core-foundation",
2340
-
"objc2-foundation 0.3.1",
2623
+
"objc2-core-graphics",
2624
+
"objc2-core-image",
2625
+
"objc2-core-location",
2626
+
"objc2-core-text",
2627
+
"objc2-foundation 0.3.2",
2628
+
"objc2-quartz-core 0.3.2",
2629
+
"objc2-user-notifications",
2341
2630
]
2342
2631
2343
2632
[[package]]
2344
-
name = "objc2-web-kit"
2345
-
version = "0.3.1"
2633
+
name = "objc2-user-notifications"
2634
+
version = "0.3.2"
2346
2635
source = "registry+https://github.com/rust-lang/crates.io-index"
2347
-
checksum = "91672909de8b1ce1c2252e95bbee8c1649c9ad9d14b9248b3d7b4c47903c47ad"
2636
+
checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e"
2348
2637
dependencies = [
2349
-
"bitflags 2.9.1",
2350
-
"block2 0.6.1",
2351
-
"objc2 0.6.1",
2352
-
"objc2-app-kit",
2353
-
"objc2-core-foundation",
2354
-
"objc2-foundation 0.3.1",
2638
+
"objc2 0.6.3",
2639
+
"objc2-foundation 0.3.2",
2355
2640
]
2356
2641
2357
2642
[[package]]
2358
-
name = "object"
2359
-
version = "0.36.7"
2643
+
name = "objc2-web-kit"
2644
+
version = "0.3.2"
2360
2645
source = "registry+https://github.com/rust-lang/crates.io-index"
2361
-
checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
2646
+
checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f"
2362
2647
dependencies = [
2363
-
"memchr",
2648
+
"bitflags 2.10.0",
2649
+
"block2 0.6.2",
2650
+
"objc2 0.6.3",
2651
+
"objc2-app-kit",
2652
+
"objc2-core-foundation",
2653
+
"objc2-foundation 0.3.2",
2654
+
"objc2-javascript-core",
2655
+
"objc2-security",
2364
2656
]
2365
2657
2366
2658
[[package]]
···
2398
2690
]
2399
2691
2400
2692
[[package]]
2693
+
name = "os_info"
2694
+
version = "3.13.0"
2695
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2696
+
checksum = "7c39b5918402d564846d5aba164c09a66cc88d232179dfd3e3c619a25a268392"
2697
+
dependencies = [
2698
+
"android_system_properties",
2699
+
"log",
2700
+
"nix",
2701
+
"objc2 0.6.3",
2702
+
"objc2-foundation 0.3.2",
2703
+
"objc2-ui-kit",
2704
+
"serde",
2705
+
"windows-sys 0.61.2",
2706
+
]
2707
+
2708
+
[[package]]
2709
+
name = "os_pipe"
2710
+
version = "1.2.3"
2711
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2712
+
checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967"
2713
+
dependencies = [
2714
+
"libc",
2715
+
"windows-sys 0.61.2",
2716
+
]
2717
+
2718
+
[[package]]
2401
2719
name = "pango"
2402
2720
version = "0.18.3"
2403
2721
source = "registry+https://github.com/rust-lang/crates.io-index"
···
2430
2748
2431
2749
[[package]]
2432
2750
name = "parking_lot"
2433
-
version = "0.12.4"
2751
+
version = "0.12.5"
2434
2752
source = "registry+https://github.com/rust-lang/crates.io-index"
2435
-
checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13"
2753
+
checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
2436
2754
dependencies = [
2437
2755
"lock_api",
2438
2756
"parking_lot_core",
···
2440
2758
2441
2759
[[package]]
2442
2760
name = "parking_lot_core"
2443
-
version = "0.9.11"
2761
+
version = "0.9.12"
2444
2762
source = "registry+https://github.com/rust-lang/crates.io-index"
2445
-
checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5"
2763
+
checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
2446
2764
dependencies = [
2447
2765
"cfg-if",
2448
2766
"libc",
2449
2767
"redox_syscall",
2450
2768
"smallvec",
2451
-
"windows-targets 0.52.6",
2769
+
"windows-link 0.2.1",
2452
2770
]
2453
2771
2454
2772
[[package]]
···
2459
2777
2460
2778
[[package]]
2461
2779
name = "percent-encoding"
2462
-
version = "2.3.1"
2780
+
version = "2.3.2"
2463
2781
source = "registry+https://github.com/rust-lang/crates.io-index"
2464
-
checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
2782
+
checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
2783
+
2784
+
[[package]]
2785
+
name = "petgraph"
2786
+
version = "0.8.3"
2787
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2788
+
checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455"
2789
+
dependencies = [
2790
+
"fixedbitset",
2791
+
"hashbrown 0.15.5",
2792
+
"indexmap 2.12.0",
2793
+
]
2465
2794
2466
2795
[[package]]
2467
2796
name = "phf"
···
2567
2896
"phf_shared 0.11.3",
2568
2897
"proc-macro2",
2569
2898
"quote",
2570
-
"syn 2.0.104",
2899
+
"syn 2.0.109",
2571
2900
]
2572
2901
2573
2902
[[package]]
···
2628
2957
2629
2958
[[package]]
2630
2959
name = "plist"
2631
-
version = "1.7.4"
2960
+
version = "1.8.0"
2632
2961
source = "registry+https://github.com/rust-lang/crates.io-index"
2633
-
checksum = "3af6b589e163c5a788fab00ce0c0366f6efbb9959c2f9874b224936af7fce7e1"
2962
+
checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07"
2634
2963
dependencies = [
2635
2964
"base64 0.22.1",
2636
-
"indexmap 2.10.0",
2637
-
"quick-xml",
2965
+
"indexmap 2.12.0",
2966
+
"quick-xml 0.38.3",
2638
2967
"serde",
2639
2968
"time",
2640
2969
]
···
2653
2982
]
2654
2983
2655
2984
[[package]]
2985
+
name = "png"
2986
+
version = "0.18.0"
2987
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2988
+
checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0"
2989
+
dependencies = [
2990
+
"bitflags 2.10.0",
2991
+
"crc32fast",
2992
+
"fdeflate",
2993
+
"flate2",
2994
+
"miniz_oxide",
2995
+
]
2996
+
2997
+
[[package]]
2656
2998
name = "polling"
2657
-
version = "3.9.0"
2999
+
version = "3.11.0"
2658
3000
source = "registry+https://github.com/rust-lang/crates.io-index"
2659
-
checksum = "8ee9b2fa7a4517d2c91ff5bc6c297a427a96749d15f98fcdbb22c05571a4d4b7"
3001
+
checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218"
2660
3002
dependencies = [
2661
3003
"cfg-if",
2662
3004
"concurrent-queue",
2663
3005
"hermit-abi",
2664
3006
"pin-project-lite",
2665
-
"rustix",
2666
-
"windows-sys 0.60.2",
3007
+
"rustix 1.1.2",
3008
+
"windows-sys 0.61.2",
2667
3009
]
2668
3010
2669
3011
[[package]]
2670
3012
name = "potential_utf"
2671
-
version = "0.1.2"
3013
+
version = "0.1.4"
2672
3014
source = "registry+https://github.com/rust-lang/crates.io-index"
2673
-
checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585"
3015
+
checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77"
2674
3016
dependencies = [
2675
3017
"zerovec",
2676
3018
]
···
2708
3050
2709
3051
[[package]]
2710
3052
name = "proc-macro-crate"
2711
-
version = "2.0.0"
3053
+
version = "2.0.2"
2712
3054
source = "registry+https://github.com/rust-lang/crates.io-index"
2713
-
checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8"
3055
+
checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24"
2714
3056
dependencies = [
2715
-
"toml_edit 0.20.7",
3057
+
"toml_datetime 0.6.3",
3058
+
"toml_edit 0.20.2",
2716
3059
]
2717
3060
2718
3061
[[package]]
2719
3062
name = "proc-macro-crate"
2720
-
version = "3.3.0"
3063
+
version = "3.4.0"
2721
3064
source = "registry+https://github.com/rust-lang/crates.io-index"
2722
-
checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35"
3065
+
checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983"
2723
3066
dependencies = [
2724
-
"toml_edit 0.22.27",
3067
+
"toml_edit 0.23.7",
2725
3068
]
2726
3069
2727
3070
[[package]]
···
2756
3099
2757
3100
[[package]]
2758
3101
name = "proc-macro2"
2759
-
version = "1.0.95"
3102
+
version = "1.0.103"
2760
3103
source = "registry+https://github.com/rust-lang/crates.io-index"
2761
-
checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
3104
+
checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8"
2762
3105
dependencies = [
2763
3106
"unicode-ident",
2764
3107
]
2765
3108
2766
3109
[[package]]
3110
+
name = "pxfm"
3111
+
version = "0.1.25"
3112
+
source = "registry+https://github.com/rust-lang/crates.io-index"
3113
+
checksum = "a3cbdf373972bf78df4d3b518d07003938e2c7d1fb5891e55f9cb6df57009d84"
3114
+
dependencies = [
3115
+
"num-traits",
3116
+
]
3117
+
3118
+
[[package]]
3119
+
name = "quick-error"
3120
+
version = "2.0.1"
3121
+
source = "registry+https://github.com/rust-lang/crates.io-index"
3122
+
checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3"
3123
+
3124
+
[[package]]
2767
3125
name = "quick-xml"
2768
-
version = "0.38.0"
3126
+
version = "0.37.5"
3127
+
source = "registry+https://github.com/rust-lang/crates.io-index"
3128
+
checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb"
3129
+
dependencies = [
3130
+
"memchr",
3131
+
]
3132
+
3133
+
[[package]]
3134
+
name = "quick-xml"
3135
+
version = "0.38.3"
2769
3136
source = "registry+https://github.com/rust-lang/crates.io-index"
2770
-
checksum = "8927b0664f5c5a98265138b7e3f90aa19a6b21353182469ace36d4ac527b7b1b"
3137
+
checksum = "42a232e7487fc2ef313d96dde7948e7a3c05101870d8985e4fd8d26aedd27b89"
2771
3138
dependencies = [
2772
3139
"memchr",
2773
3140
]
2774
3141
2775
3142
[[package]]
2776
3143
name = "quote"
2777
-
version = "1.0.40"
3144
+
version = "1.0.42"
2778
3145
source = "registry+https://github.com/rust-lang/crates.io-index"
2779
-
checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
3146
+
checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f"
2780
3147
dependencies = [
2781
3148
"proc-macro2",
2782
3149
]
···
2813
3180
]
2814
3181
2815
3182
[[package]]
3183
+
name = "rand"
3184
+
version = "0.9.2"
3185
+
source = "registry+https://github.com/rust-lang/crates.io-index"
3186
+
checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
3187
+
dependencies = [
3188
+
"rand_chacha 0.9.0",
3189
+
"rand_core 0.9.3",
3190
+
]
3191
+
3192
+
[[package]]
2816
3193
name = "rand_chacha"
2817
3194
version = "0.2.2"
2818
3195
source = "registry+https://github.com/rust-lang/crates.io-index"
···
2833
3210
]
2834
3211
2835
3212
[[package]]
3213
+
name = "rand_chacha"
3214
+
version = "0.9.0"
3215
+
source = "registry+https://github.com/rust-lang/crates.io-index"
3216
+
checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
3217
+
dependencies = [
3218
+
"ppv-lite86",
3219
+
"rand_core 0.9.3",
3220
+
]
3221
+
3222
+
[[package]]
2836
3223
name = "rand_core"
2837
3224
version = "0.5.1"
2838
3225
source = "registry+https://github.com/rust-lang/crates.io-index"
···
2851
3238
]
2852
3239
2853
3240
[[package]]
3241
+
name = "rand_core"
3242
+
version = "0.9.3"
3243
+
source = "registry+https://github.com/rust-lang/crates.io-index"
3244
+
checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
3245
+
dependencies = [
3246
+
"getrandom 0.3.4",
3247
+
]
3248
+
3249
+
[[package]]
2854
3250
name = "rand_hc"
2855
3251
version = "0.2.0"
2856
3252
source = "registry+https://github.com/rust-lang/crates.io-index"
···
2876
3272
2877
3273
[[package]]
2878
3274
name = "redox_syscall"
2879
-
version = "0.5.17"
3275
+
version = "0.5.18"
2880
3276
source = "registry+https://github.com/rust-lang/crates.io-index"
2881
-
checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77"
3277
+
checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
2882
3278
dependencies = [
2883
-
"bitflags 2.9.1",
3279
+
"bitflags 2.10.0",
2884
3280
]
2885
3281
2886
3282
[[package]]
2887
3283
name = "redox_users"
2888
-
version = "0.5.0"
3284
+
version = "0.5.2"
2889
3285
source = "registry+https://github.com/rust-lang/crates.io-index"
2890
-
checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b"
3286
+
checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac"
2891
3287
dependencies = [
2892
3288
"getrandom 0.2.16",
2893
3289
"libredox",
2894
-
"thiserror 2.0.12",
3290
+
"thiserror 2.0.17",
2895
3291
]
2896
3292
2897
3293
[[package]]
2898
3294
name = "ref-cast"
2899
-
version = "1.0.24"
3295
+
version = "1.0.25"
2900
3296
source = "registry+https://github.com/rust-lang/crates.io-index"
2901
-
checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf"
3297
+
checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d"
2902
3298
dependencies = [
2903
3299
"ref-cast-impl",
2904
3300
]
2905
3301
2906
3302
[[package]]
2907
3303
name = "ref-cast-impl"
2908
-
version = "1.0.24"
3304
+
version = "1.0.25"
2909
3305
source = "registry+https://github.com/rust-lang/crates.io-index"
2910
-
checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7"
3306
+
checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da"
2911
3307
dependencies = [
2912
3308
"proc-macro2",
2913
3309
"quote",
2914
-
"syn 2.0.104",
3310
+
"syn 2.0.109",
2915
3311
]
2916
3312
2917
3313
[[package]]
2918
3314
name = "regex"
2919
-
version = "1.11.1"
3315
+
version = "1.12.2"
2920
3316
source = "registry+https://github.com/rust-lang/crates.io-index"
2921
-
checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
3317
+
checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4"
2922
3318
dependencies = [
2923
3319
"aho-corasick",
2924
3320
"memchr",
···
2928
3324
2929
3325
[[package]]
2930
3326
name = "regex-automata"
2931
-
version = "0.4.9"
3327
+
version = "0.4.13"
2932
3328
source = "registry+https://github.com/rust-lang/crates.io-index"
2933
-
checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
3329
+
checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c"
2934
3330
dependencies = [
2935
3331
"aho-corasick",
2936
3332
"memchr",
···
2939
3335
2940
3336
[[package]]
2941
3337
name = "regex-syntax"
2942
-
version = "0.8.5"
3338
+
version = "0.8.8"
2943
3339
source = "registry+https://github.com/rust-lang/crates.io-index"
2944
-
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
3340
+
checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58"
2945
3341
2946
3342
[[package]]
2947
3343
name = "reqwest"
2948
-
version = "0.12.22"
3344
+
version = "0.12.24"
2949
3345
source = "registry+https://github.com/rust-lang/crates.io-index"
2950
-
checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531"
3346
+
checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f"
2951
3347
dependencies = [
2952
3348
"base64 0.22.1",
2953
3349
"bytes",
···
2979
3375
]
2980
3376
2981
3377
[[package]]
2982
-
name = "rustc-demangle"
2983
-
version = "0.1.26"
3378
+
name = "rfd"
3379
+
version = "0.15.4"
2984
3380
source = "registry+https://github.com/rust-lang/crates.io-index"
2985
-
checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace"
3381
+
checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed"
3382
+
dependencies = [
3383
+
"ashpd",
3384
+
"block2 0.6.2",
3385
+
"dispatch2",
3386
+
"glib-sys",
3387
+
"gobject-sys",
3388
+
"gtk-sys",
3389
+
"js-sys",
3390
+
"log",
3391
+
"objc2 0.6.3",
3392
+
"objc2-app-kit",
3393
+
"objc2-core-foundation",
3394
+
"objc2-foundation 0.3.2",
3395
+
"raw-window-handle",
3396
+
"wasm-bindgen",
3397
+
"wasm-bindgen-futures",
3398
+
"web-sys",
3399
+
"windows-sys 0.59.0",
3400
+
]
2986
3401
2987
3402
[[package]]
2988
3403
name = "rustc_version"
···
2995
3410
2996
3411
[[package]]
2997
3412
name = "rustix"
2998
-
version = "1.0.8"
3413
+
version = "0.38.44"
3414
+
source = "registry+https://github.com/rust-lang/crates.io-index"
3415
+
checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
3416
+
dependencies = [
3417
+
"bitflags 2.10.0",
3418
+
"errno",
3419
+
"libc",
3420
+
"linux-raw-sys 0.4.15",
3421
+
"windows-sys 0.59.0",
3422
+
]
3423
+
3424
+
[[package]]
3425
+
name = "rustix"
3426
+
version = "1.1.2"
2999
3427
source = "registry+https://github.com/rust-lang/crates.io-index"
3000
-
checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8"
3428
+
checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e"
3001
3429
dependencies = [
3002
-
"bitflags 2.9.1",
3430
+
"bitflags 2.10.0",
3003
3431
"errno",
3004
3432
"libc",
3005
-
"linux-raw-sys",
3006
-
"windows-sys 0.60.2",
3433
+
"linux-raw-sys 0.11.0",
3434
+
"windows-sys 0.61.2",
3007
3435
]
3008
3436
3009
3437
[[package]]
3010
3438
name = "rustversion"
3011
-
version = "1.0.21"
3439
+
version = "1.0.22"
3012
3440
source = "registry+https://github.com/rust-lang/crates.io-index"
3013
-
checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d"
3441
+
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
3014
3442
3015
3443
[[package]]
3016
3444
name = "ryu"
···
3056
3484
3057
3485
[[package]]
3058
3486
name = "schemars"
3059
-
version = "1.0.4"
3487
+
version = "1.1.0"
3060
3488
source = "registry+https://github.com/rust-lang/crates.io-index"
3061
-
checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0"
3489
+
checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289"
3062
3490
dependencies = [
3063
3491
"dyn-clone",
3064
3492
"ref-cast",
···
3075
3503
"proc-macro2",
3076
3504
"quote",
3077
3505
"serde_derive_internals",
3078
-
"syn 2.0.104",
3506
+
"syn 2.0.109",
3079
3507
]
3080
3508
3081
3509
[[package]]
3510
+
name = "scoped-tls"
3511
+
version = "1.0.1"
3512
+
source = "registry+https://github.com/rust-lang/crates.io-index"
3513
+
checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
3514
+
3515
+
[[package]]
3082
3516
name = "scopeguard"
3083
3517
version = "1.2.0"
3084
3518
source = "registry+https://github.com/rust-lang/crates.io-index"
···
3104
3538
3105
3539
[[package]]
3106
3540
name = "semver"
3107
-
version = "1.0.26"
3541
+
version = "1.0.27"
3108
3542
source = "registry+https://github.com/rust-lang/crates.io-index"
3109
-
checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0"
3543
+
checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2"
3110
3544
dependencies = [
3111
3545
"serde",
3546
+
"serde_core",
3112
3547
]
3113
3548
3114
3549
[[package]]
3115
3550
name = "serde"
3116
-
version = "1.0.219"
3551
+
version = "1.0.228"
3117
3552
source = "registry+https://github.com/rust-lang/crates.io-index"
3118
-
checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
3553
+
checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
3119
3554
dependencies = [
3555
+
"serde_core",
3120
3556
"serde_derive",
3121
3557
]
3122
3558
3123
3559
[[package]]
3124
3560
name = "serde-untagged"
3125
-
version = "0.1.7"
3561
+
version = "0.1.9"
3126
3562
source = "registry+https://github.com/rust-lang/crates.io-index"
3127
-
checksum = "299d9c19d7d466db4ab10addd5703e4c615dec2a5a16dbbafe191045e87ee66e"
3563
+
checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058"
3128
3564
dependencies = [
3129
3565
"erased-serde",
3130
3566
"serde",
3567
+
"serde_core",
3131
3568
"typeid",
3132
3569
]
3133
3570
3134
3571
[[package]]
3572
+
name = "serde_core"
3573
+
version = "1.0.228"
3574
+
source = "registry+https://github.com/rust-lang/crates.io-index"
3575
+
checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
3576
+
dependencies = [
3577
+
"serde_derive",
3578
+
]
3579
+
3580
+
[[package]]
3135
3581
name = "serde_derive"
3136
-
version = "1.0.219"
3582
+
version = "1.0.228"
3137
3583
source = "registry+https://github.com/rust-lang/crates.io-index"
3138
-
checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
3584
+
checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
3139
3585
dependencies = [
3140
3586
"proc-macro2",
3141
3587
"quote",
3142
-
"syn 2.0.104",
3588
+
"syn 2.0.109",
3143
3589
]
3144
3590
3145
3591
[[package]]
···
3150
3596
dependencies = [
3151
3597
"proc-macro2",
3152
3598
"quote",
3153
-
"syn 2.0.104",
3599
+
"syn 2.0.109",
3154
3600
]
3155
3601
3156
3602
[[package]]
3157
3603
name = "serde_json"
3158
-
version = "1.0.141"
3604
+
version = "1.0.145"
3159
3605
source = "registry+https://github.com/rust-lang/crates.io-index"
3160
-
checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3"
3606
+
checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c"
3161
3607
dependencies = [
3162
3608
"itoa",
3163
3609
"memchr",
3164
3610
"ryu",
3165
3611
"serde",
3612
+
"serde_core",
3166
3613
]
3167
3614
3168
3615
[[package]]
···
3173
3620
dependencies = [
3174
3621
"proc-macro2",
3175
3622
"quote",
3176
-
"syn 2.0.104",
3623
+
"syn 2.0.109",
3177
3624
]
3178
3625
3179
3626
[[package]]
···
3187
3634
3188
3635
[[package]]
3189
3636
name = "serde_spanned"
3190
-
version = "1.0.0"
3637
+
version = "1.0.3"
3191
3638
source = "registry+https://github.com/rust-lang/crates.io-index"
3192
-
checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83"
3639
+
checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392"
3193
3640
dependencies = [
3194
-
"serde",
3641
+
"serde_core",
3195
3642
]
3196
3643
3197
3644
[[package]]
···
3208
3655
3209
3656
[[package]]
3210
3657
name = "serde_with"
3211
-
version = "3.14.0"
3658
+
version = "3.15.1"
3212
3659
source = "registry+https://github.com/rust-lang/crates.io-index"
3213
-
checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5"
3660
+
checksum = "aa66c845eee442168b2c8134fec70ac50dc20e760769c8ba0ad1319ca1959b04"
3214
3661
dependencies = [
3215
3662
"base64 0.22.1",
3216
3663
"chrono",
3217
3664
"hex",
3218
3665
"indexmap 1.9.3",
3219
-
"indexmap 2.10.0",
3666
+
"indexmap 2.12.0",
3220
3667
"schemars 0.9.0",
3221
-
"schemars 1.0.4",
3222
-
"serde",
3223
-
"serde_derive",
3668
+
"schemars 1.1.0",
3669
+
"serde_core",
3224
3670
"serde_json",
3225
3671
"serde_with_macros",
3226
3672
"time",
···
3228
3674
3229
3675
[[package]]
3230
3676
name = "serde_with_macros"
3231
-
version = "3.14.0"
3677
+
version = "3.15.1"
3232
3678
source = "registry+https://github.com/rust-lang/crates.io-index"
3233
-
checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f"
3679
+
checksum = "b91a903660542fced4e99881aa481bdbaec1634568ee02e0b8bd57c64cb38955"
3234
3680
dependencies = [
3235
3681
"darling",
3236
3682
"proc-macro2",
3237
3683
"quote",
3238
-
"syn 2.0.104",
3684
+
"syn 2.0.109",
3239
3685
]
3240
3686
3241
3687
[[package]]
3242
3688
name = "serialize-to-javascript"
3243
-
version = "0.1.1"
3689
+
version = "0.1.2"
3244
3690
source = "registry+https://github.com/rust-lang/crates.io-index"
3245
-
checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb"
3691
+
checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5"
3246
3692
dependencies = [
3247
3693
"serde",
3248
3694
"serde_json",
···
3251
3697
3252
3698
[[package]]
3253
3699
name = "serialize-to-javascript-impl"
3254
-
version = "0.1.1"
3700
+
version = "0.1.2"
3255
3701
source = "registry+https://github.com/rust-lang/crates.io-index"
3256
-
checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763"
3702
+
checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d"
3257
3703
dependencies = [
3258
3704
"proc-macro2",
3259
3705
"quote",
3260
-
"syn 1.0.109",
3706
+
"syn 2.0.109",
3261
3707
]
3262
3708
3263
3709
[[package]]
···
3289
3735
3290
3736
[[package]]
3291
3737
name = "signal-hook-registry"
3292
-
version = "1.4.5"
3738
+
version = "1.4.6"
3293
3739
source = "registry+https://github.com/rust-lang/crates.io-index"
3294
-
checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410"
3740
+
checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b"
3295
3741
dependencies = [
3296
3742
"libc",
3297
3743
]
···
3316
3762
3317
3763
[[package]]
3318
3764
name = "slab"
3319
-
version = "0.4.10"
3765
+
version = "0.4.11"
3320
3766
source = "registry+https://github.com/rust-lang/crates.io-index"
3321
-
checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d"
3767
+
checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589"
3322
3768
3323
3769
[[package]]
3324
3770
name = "smallvec"
···
3328
3774
3329
3775
[[package]]
3330
3776
name = "socket2"
3331
-
version = "0.6.0"
3777
+
version = "0.6.1"
3332
3778
source = "registry+https://github.com/rust-lang/crates.io-index"
3333
-
checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807"
3779
+
checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881"
3334
3780
dependencies = [
3335
3781
"libc",
3336
-
"windows-sys 0.59.0",
3782
+
"windows-sys 0.60.2",
3337
3783
]
3338
3784
3339
3785
[[package]]
···
3344
3790
dependencies = [
3345
3791
"bytemuck",
3346
3792
"cfg_aliases",
3347
-
"core-graphics",
3793
+
"core-graphics 0.24.0",
3348
3794
"foreign-types",
3349
3795
"js-sys",
3350
3796
"log",
···
3386
3832
3387
3833
[[package]]
3388
3834
name = "stable_deref_trait"
3389
-
version = "1.2.0"
3835
+
version = "1.2.1"
3390
3836
source = "registry+https://github.com/rust-lang/crates.io-index"
3391
-
checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
3837
+
checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
3392
3838
3393
3839
[[package]]
3394
3840
name = "static_assertions"
···
3451
3897
3452
3898
[[package]]
3453
3899
name = "syn"
3454
-
version = "2.0.104"
3900
+
version = "2.0.109"
3455
3901
source = "registry+https://github.com/rust-lang/crates.io-index"
3456
-
checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40"
3902
+
checksum = "2f17c7e013e88258aa9543dcbe81aca68a667a9ac37cd69c9fbc07858bfe0e2f"
3457
3903
dependencies = [
3458
3904
"proc-macro2",
3459
3905
"quote",
···
3477
3923
dependencies = [
3478
3924
"proc-macro2",
3479
3925
"quote",
3480
-
"syn 2.0.104",
3926
+
"syn 2.0.109",
3927
+
]
3928
+
3929
+
[[package]]
3930
+
name = "sys-locale"
3931
+
version = "0.3.2"
3932
+
source = "registry+https://github.com/rust-lang/crates.io-index"
3933
+
checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4"
3934
+
dependencies = [
3935
+
"libc",
3481
3936
]
3482
3937
3483
3938
[[package]]
···
3489
3944
"cfg-expr",
3490
3945
"heck 0.5.0",
3491
3946
"pkg-config",
3492
-
"toml 0.8.23",
3947
+
"toml 0.8.2",
3493
3948
"version-compare",
3494
3949
]
3495
3950
3496
3951
[[package]]
3497
3952
name = "tao"
3498
-
version = "0.34.0"
3953
+
version = "0.34.5"
3499
3954
source = "registry+https://github.com/rust-lang/crates.io-index"
3500
-
checksum = "49c380ca75a231b87b6c9dd86948f035012e7171d1a7c40a9c2890489a7ffd8a"
3955
+
checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7"
3501
3956
dependencies = [
3502
-
"bitflags 2.9.1",
3957
+
"bitflags 2.10.0",
3958
+
"block2 0.6.2",
3503
3959
"core-foundation",
3504
-
"core-graphics",
3960
+
"core-graphics 0.24.0",
3505
3961
"crossbeam-channel",
3506
3962
"dispatch",
3507
3963
"dlopen2",
···
3516
3972
"ndk",
3517
3973
"ndk-context",
3518
3974
"ndk-sys",
3519
-
"objc2 0.6.1",
3975
+
"objc2 0.6.3",
3520
3976
"objc2-app-kit",
3521
-
"objc2-foundation 0.3.1",
3977
+
"objc2-foundation 0.3.2",
3522
3978
"once_cell",
3523
3979
"parking_lot",
3524
3980
"raw-window-handle",
···
3527
3983
"unicode-segmentation",
3528
3984
"url",
3529
3985
"windows",
3530
-
"windows-core",
3986
+
"windows-core 0.61.2",
3531
3987
"windows-version",
3532
3988
"x11-dl",
3533
3989
]
···
3540
3996
dependencies = [
3541
3997
"proc-macro2",
3542
3998
"quote",
3543
-
"syn 2.0.104",
3999
+
"syn 2.0.109",
3544
4000
]
3545
4001
3546
4002
[[package]]
···
3551
4007
3552
4008
[[package]]
3553
4009
name = "tauri"
3554
-
version = "2.7.0"
4010
+
version = "2.9.2"
3555
4011
source = "registry+https://github.com/rust-lang/crates.io-index"
3556
-
checksum = "352a4bc7bf6c25f5624227e3641adf475a6535707451b09bb83271df8b7a6ac7"
4012
+
checksum = "8bceb52453e507c505b330afe3398510e87f428ea42b6e76ecb6bd63b15965b5"
3557
4013
dependencies = [
3558
4014
"anyhow",
3559
4015
"bytes",
4016
+
"cookie",
3560
4017
"dirs",
3561
4018
"dunce",
3562
4019
"embed_plist",
3563
-
"getrandom 0.3.3",
4020
+
"getrandom 0.3.4",
3564
4021
"glob",
3565
4022
"gtk",
3566
4023
"heck 0.5.0",
3567
4024
"http",
4025
+
"image",
3568
4026
"jni",
3569
4027
"libc",
3570
4028
"log",
3571
4029
"mime",
3572
4030
"muda",
3573
-
"objc2 0.6.1",
4031
+
"objc2 0.6.3",
3574
4032
"objc2-app-kit",
3575
-
"objc2-foundation 0.3.1",
4033
+
"objc2-foundation 0.3.2",
3576
4034
"objc2-ui-kit",
4035
+
"objc2-web-kit",
3577
4036
"percent-encoding",
3578
4037
"plist",
3579
4038
"raw-window-handle",
···
3588
4047
"tauri-runtime",
3589
4048
"tauri-runtime-wry",
3590
4049
"tauri-utils",
3591
-
"thiserror 2.0.12",
4050
+
"thiserror 2.0.17",
3592
4051
"tokio",
3593
4052
"tray-icon",
3594
4053
"url",
3595
-
"urlpattern",
3596
4054
"webkit2gtk",
3597
4055
"webview2-com",
3598
4056
"window-vibrancy",
···
3601
4059
3602
4060
[[package]]
3603
4061
name = "tauri-build"
3604
-
version = "2.3.1"
4062
+
version = "2.5.1"
3605
4063
source = "registry+https://github.com/rust-lang/crates.io-index"
3606
-
checksum = "182d688496c06bf08ea896459bf483eb29cdff35c1c4c115fb14053514303064"
4064
+
checksum = "a924b6c50fe83193f0f8b14072afa7c25b7a72752a2a73d9549b463f5fe91a38"
3607
4065
dependencies = [
3608
4066
"anyhow",
3609
4067
"cargo_toml",
···
3617
4075
"serde_json",
3618
4076
"tauri-utils",
3619
4077
"tauri-winres",
3620
-
"toml 0.8.23",
4078
+
"toml 0.9.8",
3621
4079
"walkdir",
3622
4080
]
3623
4081
3624
4082
[[package]]
3625
4083
name = "tauri-codegen"
3626
-
version = "2.3.1"
4084
+
version = "2.5.0"
3627
4085
source = "registry+https://github.com/rust-lang/crates.io-index"
3628
-
checksum = "b54a99a6cd8e01abcfa61508177e6096a4fe2681efecee9214e962f2f073ae4a"
4086
+
checksum = "6c1fe64c74cc40f90848281a90058a6db931eb400b60205840e09801ee30f190"
3629
4087
dependencies = [
3630
4088
"base64 0.22.1",
3631
4089
"brotli",
3632
4090
"ico",
3633
4091
"json-patch",
3634
4092
"plist",
3635
-
"png",
4093
+
"png 0.17.16",
3636
4094
"proc-macro2",
3637
4095
"quote",
3638
4096
"semver",
3639
4097
"serde",
3640
4098
"serde_json",
3641
4099
"sha2",
3642
-
"syn 2.0.104",
4100
+
"syn 2.0.109",
3643
4101
"tauri-utils",
3644
-
"thiserror 2.0.12",
4102
+
"thiserror 2.0.17",
3645
4103
"time",
3646
4104
"url",
3647
4105
"uuid",
···
3650
4108
3651
4109
[[package]]
3652
4110
name = "tauri-macros"
3653
-
version = "2.3.2"
4111
+
version = "2.5.0"
3654
4112
source = "registry+https://github.com/rust-lang/crates.io-index"
3655
-
checksum = "7945b14dc45e23532f2ded6e120170bbdd4af5ceaa45784a6b33d250fbce3f9e"
4113
+
checksum = "260c5d2eb036b76206b9fca20b7be3614cfd21046c5396f7959e0e64a4b07f2f"
3656
4114
dependencies = [
3657
4115
"heck 0.5.0",
3658
4116
"proc-macro2",
3659
4117
"quote",
3660
-
"syn 2.0.104",
4118
+
"syn 2.0.109",
3661
4119
"tauri-codegen",
3662
4120
"tauri-utils",
3663
4121
]
3664
4122
3665
4123
[[package]]
3666
4124
name = "tauri-plugin"
3667
-
version = "2.3.1"
4125
+
version = "2.5.1"
3668
4126
source = "registry+https://github.com/rust-lang/crates.io-index"
3669
-
checksum = "5bd5c1e56990c70a906ef67a9851bbdba9136d26075ee9a2b19c8b46986b3e02"
4127
+
checksum = "076c78a474a7247c90cad0b6e87e593c4c620ed4efdb79cbe0214f0021f6c39d"
3670
4128
dependencies = [
3671
4129
"anyhow",
3672
4130
"glob",
···
3675
4133
"serde",
3676
4134
"serde_json",
3677
4135
"tauri-utils",
3678
-
"toml 0.8.23",
4136
+
"toml 0.9.8",
3679
4137
"walkdir",
3680
4138
]
3681
4139
3682
4140
[[package]]
4141
+
name = "tauri-plugin-clipboard-manager"
4142
+
version = "2.3.2"
4143
+
source = "registry+https://github.com/rust-lang/crates.io-index"
4144
+
checksum = "206dc20af4ed210748ba945c2774e60fd0acd52b9a73a028402caf809e9b6ecf"
4145
+
dependencies = [
4146
+
"arboard",
4147
+
"log",
4148
+
"serde",
4149
+
"serde_json",
4150
+
"tauri",
4151
+
"tauri-plugin",
4152
+
"thiserror 2.0.17",
4153
+
]
4154
+
4155
+
[[package]]
4156
+
name = "tauri-plugin-dialog"
4157
+
version = "2.4.2"
4158
+
source = "registry+https://github.com/rust-lang/crates.io-index"
4159
+
checksum = "313f8138692ddc4a2127c4c9607d616a46f5c042e77b3722450866da0aad2f19"
4160
+
dependencies = [
4161
+
"log",
4162
+
"raw-window-handle",
4163
+
"rfd",
4164
+
"serde",
4165
+
"serde_json",
4166
+
"tauri",
4167
+
"tauri-plugin",
4168
+
"tauri-plugin-fs",
4169
+
"thiserror 2.0.17",
4170
+
"url",
4171
+
]
4172
+
4173
+
[[package]]
4174
+
name = "tauri-plugin-fs"
4175
+
version = "2.4.4"
4176
+
source = "registry+https://github.com/rust-lang/crates.io-index"
4177
+
checksum = "47df422695255ecbe7bac7012440eddaeefd026656171eac9559f5243d3230d9"
4178
+
dependencies = [
4179
+
"anyhow",
4180
+
"dunce",
4181
+
"glob",
4182
+
"percent-encoding",
4183
+
"schemars 0.8.22",
4184
+
"serde",
4185
+
"serde_json",
4186
+
"serde_repr",
4187
+
"tauri",
4188
+
"tauri-plugin",
4189
+
"tauri-utils",
4190
+
"thiserror 2.0.17",
4191
+
"toml 0.9.8",
4192
+
"url",
4193
+
]
4194
+
4195
+
[[package]]
3683
4196
name = "tauri-plugin-opener"
3684
-
version = "2.4.0"
4197
+
version = "2.5.2"
3685
4198
source = "registry+https://github.com/rust-lang/crates.io-index"
3686
-
checksum = "ecee219f11cdac713ab32959db5d0cceec4810ba4f4458da992292ecf9660321"
4199
+
checksum = "c26b72571d25dee25667940027114e60f569fc3974f8cefbe50c2cbc5fd65e3b"
3687
4200
dependencies = [
3688
4201
"dunce",
3689
4202
"glob",
3690
4203
"objc2-app-kit",
3691
-
"objc2-foundation 0.3.1",
4204
+
"objc2-foundation 0.3.2",
3692
4205
"open",
3693
4206
"schemars 0.8.22",
3694
4207
"serde",
3695
4208
"serde_json",
3696
4209
"tauri",
3697
4210
"tauri-plugin",
3698
-
"thiserror 2.0.12",
4211
+
"thiserror 2.0.17",
3699
4212
"url",
3700
4213
"windows",
3701
4214
"zbus",
3702
4215
]
3703
4216
3704
4217
[[package]]
4218
+
name = "tauri-plugin-os"
4219
+
version = "2.3.2"
4220
+
source = "registry+https://github.com/rust-lang/crates.io-index"
4221
+
checksum = "d8f08346c8deb39e96f86973da0e2d76cbb933d7ac9b750f6dc4daf955a6f997"
4222
+
dependencies = [
4223
+
"gethostname",
4224
+
"log",
4225
+
"os_info",
4226
+
"serde",
4227
+
"serde_json",
4228
+
"serialize-to-javascript",
4229
+
"sys-locale",
4230
+
"tauri",
4231
+
"tauri-plugin",
4232
+
"thiserror 2.0.17",
4233
+
]
4234
+
4235
+
[[package]]
3705
4236
name = "tauri-runtime"
3706
-
version = "2.7.1"
4237
+
version = "2.9.1"
3707
4238
source = "registry+https://github.com/rust-lang/crates.io-index"
3708
-
checksum = "2b1cc885be806ea15ff7b0eb47098a7b16323d9228876afda329e34e2d6c4676"
4239
+
checksum = "9368f09358496f2229313fccb37682ad116b7f46fa76981efe116994a0628926"
3709
4240
dependencies = [
3710
4241
"cookie",
3711
4242
"dpi",
3712
4243
"gtk",
3713
4244
"http",
3714
4245
"jni",
3715
-
"objc2 0.6.1",
4246
+
"objc2 0.6.3",
3716
4247
"objc2-ui-kit",
4248
+
"objc2-web-kit",
3717
4249
"raw-window-handle",
3718
4250
"serde",
3719
4251
"serde_json",
3720
4252
"tauri-utils",
3721
-
"thiserror 2.0.12",
4253
+
"thiserror 2.0.17",
3722
4254
"url",
4255
+
"webkit2gtk",
4256
+
"webview2-com",
3723
4257
"windows",
3724
4258
]
3725
4259
3726
4260
[[package]]
3727
4261
name = "tauri-runtime-wry"
3728
-
version = "2.7.2"
4262
+
version = "2.9.1"
3729
4263
source = "registry+https://github.com/rust-lang/crates.io-index"
3730
-
checksum = "fe653a2fbbef19fe898efc774bc52c8742576342a33d3d028c189b57eb1d2439"
4264
+
checksum = "929f5df216f5c02a9e894554401bcdab6eec3e39ec6a4a7731c7067fc8688a93"
3731
4265
dependencies = [
3732
4266
"gtk",
3733
4267
"http",
3734
4268
"jni",
3735
4269
"log",
3736
-
"objc2 0.6.1",
4270
+
"objc2 0.6.3",
3737
4271
"objc2-app-kit",
3738
-
"objc2-foundation 0.3.1",
4272
+
"objc2-foundation 0.3.2",
3739
4273
"once_cell",
3740
4274
"percent-encoding",
3741
4275
"raw-window-handle",
···
3752
4286
3753
4287
[[package]]
3754
4288
name = "tauri-utils"
3755
-
version = "2.6.0"
4289
+
version = "2.8.0"
3756
4290
source = "registry+https://github.com/rust-lang/crates.io-index"
3757
-
checksum = "9330c15cabfe1d9f213478c9e8ec2b0c76dab26bb6f314b8ad1c8a568c1d186e"
4291
+
checksum = "f6b8bbe426abdbf52d050e52ed693130dbd68375b9ad82a3fb17efb4c8d85673"
3758
4292
dependencies = [
3759
4293
"anyhow",
3760
4294
"brotli",
···
3780
4314
"serde_json",
3781
4315
"serde_with",
3782
4316
"swift-rs",
3783
-
"thiserror 2.0.12",
3784
-
"toml 0.8.23",
4317
+
"thiserror 2.0.17",
4318
+
"toml 0.9.8",
3785
4319
"url",
3786
4320
"urlpattern",
3787
4321
"uuid",
···
3790
4324
3791
4325
[[package]]
3792
4326
name = "tauri-winres"
3793
-
version = "0.3.1"
4327
+
version = "0.3.3"
3794
4328
source = "registry+https://github.com/rust-lang/crates.io-index"
3795
-
checksum = "e8d321dbc6f998d825ab3f0d62673e810c861aac2d0de2cc2c395328f1d113b4"
4329
+
checksum = "fd21509dd1fa9bd355dc29894a6ff10635880732396aa38c0066c1e6c1ab8074"
3796
4330
dependencies = [
3797
4331
"embed-resource",
3798
-
"indexmap 2.10.0",
3799
-
"toml 0.8.23",
4332
+
"toml 0.9.8",
3800
4333
]
3801
4334
3802
4335
[[package]]
3803
4336
name = "tempfile"
3804
-
version = "3.20.0"
4337
+
version = "3.23.0"
3805
4338
source = "registry+https://github.com/rust-lang/crates.io-index"
3806
-
checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1"
4339
+
checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16"
3807
4340
dependencies = [
3808
4341
"fastrand",
3809
-
"getrandom 0.3.3",
4342
+
"getrandom 0.3.4",
3810
4343
"once_cell",
3811
-
"rustix",
3812
-
"windows-sys 0.59.0",
4344
+
"rustix 1.1.2",
4345
+
"windows-sys 0.61.2",
3813
4346
]
3814
4347
3815
4348
[[package]]
···
3834
4367
3835
4368
[[package]]
3836
4369
name = "thiserror"
3837
-
version = "2.0.12"
4370
+
version = "2.0.17"
3838
4371
source = "registry+https://github.com/rust-lang/crates.io-index"
3839
-
checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"
4372
+
checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8"
3840
4373
dependencies = [
3841
-
"thiserror-impl 2.0.12",
4374
+
"thiserror-impl 2.0.17",
3842
4375
]
3843
4376
3844
4377
[[package]]
···
3849
4382
dependencies = [
3850
4383
"proc-macro2",
3851
4384
"quote",
3852
-
"syn 2.0.104",
4385
+
"syn 2.0.109",
3853
4386
]
3854
4387
3855
4388
[[package]]
3856
4389
name = "thiserror-impl"
3857
-
version = "2.0.12"
4390
+
version = "2.0.17"
3858
4391
source = "registry+https://github.com/rust-lang/crates.io-index"
3859
-
checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
4392
+
checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
3860
4393
dependencies = [
3861
4394
"proc-macro2",
3862
4395
"quote",
3863
-
"syn 2.0.104",
4396
+
"syn 2.0.109",
4397
+
]
4398
+
4399
+
[[package]]
4400
+
name = "tiff"
4401
+
version = "0.10.3"
4402
+
source = "registry+https://github.com/rust-lang/crates.io-index"
4403
+
checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f"
4404
+
dependencies = [
4405
+
"fax",
4406
+
"flate2",
4407
+
"half",
4408
+
"quick-error",
4409
+
"weezl",
4410
+
"zune-jpeg",
3864
4411
]
3865
4412
3866
4413
[[package]]
3867
4414
name = "time"
3868
-
version = "0.3.41"
4415
+
version = "0.3.44"
3869
4416
source = "registry+https://github.com/rust-lang/crates.io-index"
3870
-
checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40"
4417
+
checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d"
3871
4418
dependencies = [
3872
4419
"deranged",
3873
4420
"itoa",
···
3880
4427
3881
4428
[[package]]
3882
4429
name = "time-core"
3883
-
version = "0.1.4"
4430
+
version = "0.1.6"
3884
4431
source = "registry+https://github.com/rust-lang/crates.io-index"
3885
-
checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c"
4432
+
checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b"
3886
4433
3887
4434
[[package]]
3888
4435
name = "time-macros"
3889
-
version = "0.2.22"
4436
+
version = "0.2.24"
3890
4437
source = "registry+https://github.com/rust-lang/crates.io-index"
3891
-
checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49"
4438
+
checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3"
3892
4439
dependencies = [
3893
4440
"num-conv",
3894
4441
"time-core",
···
3896
4443
3897
4444
[[package]]
3898
4445
name = "tinystr"
3899
-
version = "0.8.1"
4446
+
version = "0.8.2"
3900
4447
source = "registry+https://github.com/rust-lang/crates.io-index"
3901
-
checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b"
4448
+
checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869"
3902
4449
dependencies = [
3903
4450
"displaydoc",
3904
4451
"zerovec",
···
3906
4453
3907
4454
[[package]]
3908
4455
name = "tokio"
3909
-
version = "1.47.0"
4456
+
version = "1.48.0"
3910
4457
source = "registry+https://github.com/rust-lang/crates.io-index"
3911
-
checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35"
4458
+
checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408"
3912
4459
dependencies = [
3913
-
"backtrace",
3914
4460
"bytes",
3915
-
"io-uring",
3916
4461
"libc",
3917
4462
"mio",
3918
4463
"pin-project-lite",
3919
-
"slab",
4464
+
"signal-hook-registry",
3920
4465
"socket2",
3921
4466
"tokio-macros",
3922
-
"windows-sys 0.59.0",
4467
+
"tracing",
4468
+
"windows-sys 0.61.2",
3923
4469
]
3924
4470
3925
4471
[[package]]
3926
4472
name = "tokio-macros"
3927
-
version = "2.5.0"
4473
+
version = "2.6.0"
3928
4474
source = "registry+https://github.com/rust-lang/crates.io-index"
3929
-
checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
4475
+
checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5"
3930
4476
dependencies = [
3931
4477
"proc-macro2",
3932
4478
"quote",
3933
-
"syn 2.0.104",
4479
+
"syn 2.0.109",
3934
4480
]
3935
4481
3936
4482
[[package]]
3937
4483
name = "tokio-util"
3938
-
version = "0.7.15"
4484
+
version = "0.7.17"
3939
4485
source = "registry+https://github.com/rust-lang/crates.io-index"
3940
-
checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df"
4486
+
checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594"
3941
4487
dependencies = [
3942
4488
"bytes",
3943
4489
"futures-core",
···
3948
4494
3949
4495
[[package]]
3950
4496
name = "toml"
3951
-
version = "0.8.23"
4497
+
version = "0.8.2"
3952
4498
source = "registry+https://github.com/rust-lang/crates.io-index"
3953
-
checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362"
4499
+
checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d"
3954
4500
dependencies = [
3955
4501
"serde",
3956
4502
"serde_spanned 0.6.9",
3957
-
"toml_datetime 0.6.11",
3958
-
"toml_edit 0.22.27",
4503
+
"toml_datetime 0.6.3",
4504
+
"toml_edit 0.20.2",
3959
4505
]
3960
4506
3961
4507
[[package]]
3962
4508
name = "toml"
3963
-
version = "0.9.3"
4509
+
version = "0.9.8"
3964
4510
source = "registry+https://github.com/rust-lang/crates.io-index"
3965
-
checksum = "e06723639aaded957e5a80be250c1f82f274b9d23ebb4d94163668470623461c"
4511
+
checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8"
3966
4512
dependencies = [
3967
-
"indexmap 2.10.0",
3968
-
"serde",
3969
-
"serde_spanned 1.0.0",
3970
-
"toml_datetime 0.7.0",
4513
+
"indexmap 2.12.0",
4514
+
"serde_core",
4515
+
"serde_spanned 1.0.3",
4516
+
"toml_datetime 0.7.3",
3971
4517
"toml_parser",
3972
4518
"toml_writer",
3973
-
"winnow 0.7.12",
4519
+
"winnow 0.7.13",
3974
4520
]
3975
4521
3976
4522
[[package]]
3977
4523
name = "toml_datetime"
3978
-
version = "0.6.11"
4524
+
version = "0.6.3"
3979
4525
source = "registry+https://github.com/rust-lang/crates.io-index"
3980
-
checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c"
4526
+
checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b"
3981
4527
dependencies = [
3982
4528
"serde",
3983
4529
]
3984
4530
3985
4531
[[package]]
3986
4532
name = "toml_datetime"
3987
-
version = "0.7.0"
4533
+
version = "0.7.3"
3988
4534
source = "registry+https://github.com/rust-lang/crates.io-index"
3989
-
checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3"
4535
+
checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533"
3990
4536
dependencies = [
3991
-
"serde",
4537
+
"serde_core",
3992
4538
]
3993
4539
3994
4540
[[package]]
···
3997
4543
source = "registry+https://github.com/rust-lang/crates.io-index"
3998
4544
checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
3999
4545
dependencies = [
4000
-
"indexmap 2.10.0",
4001
-
"toml_datetime 0.6.11",
4546
+
"indexmap 2.12.0",
4547
+
"toml_datetime 0.6.3",
4002
4548
"winnow 0.5.40",
4003
4549
]
4004
4550
4005
4551
[[package]]
4006
4552
name = "toml_edit"
4007
-
version = "0.20.7"
4553
+
version = "0.20.2"
4008
4554
source = "registry+https://github.com/rust-lang/crates.io-index"
4009
-
checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81"
4555
+
checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338"
4010
4556
dependencies = [
4011
-
"indexmap 2.10.0",
4012
-
"toml_datetime 0.6.11",
4557
+
"indexmap 2.12.0",
4558
+
"serde",
4559
+
"serde_spanned 0.6.9",
4560
+
"toml_datetime 0.6.3",
4013
4561
"winnow 0.5.40",
4014
4562
]
4015
4563
4016
4564
[[package]]
4017
4565
name = "toml_edit"
4018
-
version = "0.22.27"
4566
+
version = "0.23.7"
4019
4567
source = "registry+https://github.com/rust-lang/crates.io-index"
4020
-
checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a"
4568
+
checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d"
4021
4569
dependencies = [
4022
-
"indexmap 2.10.0",
4023
-
"serde",
4024
-
"serde_spanned 0.6.9",
4025
-
"toml_datetime 0.6.11",
4026
-
"toml_write",
4027
-
"winnow 0.7.12",
4570
+
"indexmap 2.12.0",
4571
+
"toml_datetime 0.7.3",
4572
+
"toml_parser",
4573
+
"winnow 0.7.13",
4028
4574
]
4029
4575
4030
4576
[[package]]
4031
4577
name = "toml_parser"
4032
-
version = "1.0.1"
4578
+
version = "1.0.4"
4033
4579
source = "registry+https://github.com/rust-lang/crates.io-index"
4034
-
checksum = "97200572db069e74c512a14117b296ba0a80a30123fbbb5aa1f4a348f639ca30"
4580
+
checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e"
4035
4581
dependencies = [
4036
-
"winnow 0.7.12",
4582
+
"winnow 0.7.13",
4037
4583
]
4038
-
4039
-
[[package]]
4040
-
name = "toml_write"
4041
-
version = "0.1.2"
4042
-
source = "registry+https://github.com/rust-lang/crates.io-index"
4043
-
checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801"
4044
4584
4045
4585
[[package]]
4046
4586
name = "toml_writer"
4047
-
version = "1.0.2"
4587
+
version = "1.0.4"
4048
4588
source = "registry+https://github.com/rust-lang/crates.io-index"
4049
-
checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64"
4589
+
checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2"
4050
4590
4051
4591
[[package]]
4052
4592
name = "tower"
···
4069
4609
source = "registry+https://github.com/rust-lang/crates.io-index"
4070
4610
checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2"
4071
4611
dependencies = [
4072
-
"bitflags 2.9.1",
4612
+
"bitflags 2.10.0",
4073
4613
"bytes",
4074
4614
"futures-util",
4075
4615
"http",
···
4112
4652
dependencies = [
4113
4653
"proc-macro2",
4114
4654
"quote",
4115
-
"syn 2.0.104",
4655
+
"syn 2.0.109",
4116
4656
]
4117
4657
4118
4658
[[package]]
···
4126
4666
4127
4667
[[package]]
4128
4668
name = "tray-icon"
4129
-
version = "0.21.0"
4669
+
version = "0.21.2"
4130
4670
source = "registry+https://github.com/rust-lang/crates.io-index"
4131
-
checksum = "2da75ec677957aa21f6e0b361df0daab972f13a5bee3606de0638fd4ee1c666a"
4671
+
checksum = "e3d5572781bee8e3f994d7467084e1b1fd7a93ce66bd480f8156ba89dee55a2b"
4132
4672
dependencies = [
4133
4673
"crossbeam-channel",
4134
4674
"dirs",
4135
4675
"libappindicator",
4136
4676
"muda",
4137
-
"objc2 0.6.1",
4677
+
"objc2 0.6.3",
4138
4678
"objc2-app-kit",
4139
4679
"objc2-core-foundation",
4140
4680
"objc2-core-graphics",
4141
-
"objc2-foundation 0.3.1",
4681
+
"objc2-foundation 0.3.2",
4142
4682
"once_cell",
4143
-
"png",
4683
+
"png 0.17.16",
4144
4684
"serde",
4145
-
"thiserror 2.0.12",
4146
-
"windows-sys 0.59.0",
4685
+
"thiserror 2.0.17",
4686
+
"windows-sys 0.60.2",
4687
+
]
4688
+
4689
+
[[package]]
4690
+
name = "tree_magic_mini"
4691
+
version = "3.2.1"
4692
+
source = "registry+https://github.com/rust-lang/crates.io-index"
4693
+
checksum = "52fac5f7d176f7f7f7e827299ead28ef98de642c5d93a97e0cd0816d17557f19"
4694
+
dependencies = [
4695
+
"memchr",
4696
+
"nom 7.1.3",
4697
+
"petgraph",
4147
4698
]
4148
4699
4149
4700
[[package]]
···
4160
4711
4161
4712
[[package]]
4162
4713
name = "typenum"
4163
-
version = "1.18.0"
4714
+
version = "1.19.0"
4164
4715
source = "registry+https://github.com/rust-lang/crates.io-index"
4165
-
checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
4716
+
checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb"
4166
4717
4167
4718
[[package]]
4168
4719
name = "uds_windows"
···
4218
4769
4219
4770
[[package]]
4220
4771
name = "unicode-ident"
4221
-
version = "1.0.18"
4772
+
version = "1.0.22"
4222
4773
source = "registry+https://github.com/rust-lang/crates.io-index"
4223
-
checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
4774
+
checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
4224
4775
4225
4776
[[package]]
4226
4777
name = "unicode-segmentation"
···
4230
4781
4231
4782
[[package]]
4232
4783
name = "url"
4233
-
version = "2.5.4"
4784
+
version = "2.5.7"
4234
4785
source = "registry+https://github.com/rust-lang/crates.io-index"
4235
-
checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60"
4786
+
checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b"
4236
4787
dependencies = [
4237
4788
"form_urlencoded",
4238
4789
"idna",
···
4266
4817
4267
4818
[[package]]
4268
4819
name = "uuid"
4269
-
version = "1.17.0"
4820
+
version = "1.18.1"
4270
4821
source = "registry+https://github.com/rust-lang/crates.io-index"
4271
-
checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d"
4822
+
checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2"
4272
4823
dependencies = [
4273
-
"getrandom 0.3.3",
4824
+
"getrandom 0.3.4",
4274
4825
"js-sys",
4275
4826
"serde",
4276
4827
"wasm-bindgen",
···
4278
4829
4279
4830
[[package]]
4280
4831
name = "version-compare"
4281
-
version = "0.2.0"
4832
+
version = "0.2.1"
4282
4833
source = "registry+https://github.com/rust-lang/crates.io-index"
4283
-
checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b"
4834
+
checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e"
4284
4835
4285
4836
[[package]]
4286
4837
name = "version_check"
···
4340
4891
checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
4341
4892
4342
4893
[[package]]
4343
-
name = "wasi"
4344
-
version = "0.14.2+wasi-0.2.4"
4894
+
name = "wasip2"
4895
+
version = "1.0.1+wasi-0.2.4"
4345
4896
source = "registry+https://github.com/rust-lang/crates.io-index"
4346
-
checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3"
4897
+
checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7"
4347
4898
dependencies = [
4348
-
"wit-bindgen-rt",
4899
+
"wit-bindgen",
4349
4900
]
4350
4901
4351
4902
[[package]]
4352
4903
name = "wasm-bindgen"
4353
-
version = "0.2.100"
4904
+
version = "0.2.105"
4354
4905
source = "registry+https://github.com/rust-lang/crates.io-index"
4355
-
checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
4906
+
checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60"
4356
4907
dependencies = [
4357
4908
"cfg-if",
4358
4909
"once_cell",
4359
4910
"rustversion",
4360
4911
"wasm-bindgen-macro",
4361
-
]
4362
-
4363
-
[[package]]
4364
-
name = "wasm-bindgen-backend"
4365
-
version = "0.2.100"
4366
-
source = "registry+https://github.com/rust-lang/crates.io-index"
4367
-
checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
4368
-
dependencies = [
4369
-
"bumpalo",
4370
-
"log",
4371
-
"proc-macro2",
4372
-
"quote",
4373
-
"syn 2.0.104",
4374
4912
"wasm-bindgen-shared",
4375
4913
]
4376
4914
4377
4915
[[package]]
4378
4916
name = "wasm-bindgen-futures"
4379
-
version = "0.4.50"
4917
+
version = "0.4.55"
4380
4918
source = "registry+https://github.com/rust-lang/crates.io-index"
4381
-
checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61"
4919
+
checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0"
4382
4920
dependencies = [
4383
4921
"cfg-if",
4384
4922
"js-sys",
···
4389
4927
4390
4928
[[package]]
4391
4929
name = "wasm-bindgen-macro"
4392
-
version = "0.2.100"
4930
+
version = "0.2.105"
4393
4931
source = "registry+https://github.com/rust-lang/crates.io-index"
4394
-
checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
4932
+
checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2"
4395
4933
dependencies = [
4396
4934
"quote",
4397
4935
"wasm-bindgen-macro-support",
···
4399
4937
4400
4938
[[package]]
4401
4939
name = "wasm-bindgen-macro-support"
4402
-
version = "0.2.100"
4940
+
version = "0.2.105"
4403
4941
source = "registry+https://github.com/rust-lang/crates.io-index"
4404
-
checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
4942
+
checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc"
4405
4943
dependencies = [
4944
+
"bumpalo",
4406
4945
"proc-macro2",
4407
4946
"quote",
4408
-
"syn 2.0.104",
4409
-
"wasm-bindgen-backend",
4947
+
"syn 2.0.109",
4410
4948
"wasm-bindgen-shared",
4411
4949
]
4412
4950
4413
4951
[[package]]
4414
4952
name = "wasm-bindgen-shared"
4415
-
version = "0.2.100"
4953
+
version = "0.2.105"
4416
4954
source = "registry+https://github.com/rust-lang/crates.io-index"
4417
-
checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
4955
+
checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76"
4418
4956
dependencies = [
4419
4957
"unicode-ident",
4420
4958
]
···
4433
4971
]
4434
4972
4435
4973
[[package]]
4974
+
name = "wayland-backend"
4975
+
version = "0.3.11"
4976
+
source = "registry+https://github.com/rust-lang/crates.io-index"
4977
+
checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35"
4978
+
dependencies = [
4979
+
"cc",
4980
+
"downcast-rs",
4981
+
"rustix 1.1.2",
4982
+
"scoped-tls",
4983
+
"smallvec",
4984
+
"wayland-sys",
4985
+
]
4986
+
4987
+
[[package]]
4988
+
name = "wayland-client"
4989
+
version = "0.31.11"
4990
+
source = "registry+https://github.com/rust-lang/crates.io-index"
4991
+
checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d"
4992
+
dependencies = [
4993
+
"bitflags 2.10.0",
4994
+
"rustix 1.1.2",
4995
+
"wayland-backend",
4996
+
"wayland-scanner",
4997
+
]
4998
+
4999
+
[[package]]
5000
+
name = "wayland-protocols"
5001
+
version = "0.32.9"
5002
+
source = "registry+https://github.com/rust-lang/crates.io-index"
5003
+
checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901"
5004
+
dependencies = [
5005
+
"bitflags 2.10.0",
5006
+
"wayland-backend",
5007
+
"wayland-client",
5008
+
"wayland-scanner",
5009
+
]
5010
+
5011
+
[[package]]
5012
+
name = "wayland-protocols-wlr"
5013
+
version = "0.3.9"
5014
+
source = "registry+https://github.com/rust-lang/crates.io-index"
5015
+
checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec"
5016
+
dependencies = [
5017
+
"bitflags 2.10.0",
5018
+
"wayland-backend",
5019
+
"wayland-client",
5020
+
"wayland-protocols",
5021
+
"wayland-scanner",
5022
+
]
5023
+
5024
+
[[package]]
5025
+
name = "wayland-scanner"
5026
+
version = "0.31.7"
5027
+
source = "registry+https://github.com/rust-lang/crates.io-index"
5028
+
checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3"
5029
+
dependencies = [
5030
+
"proc-macro2",
5031
+
"quick-xml 0.37.5",
5032
+
"quote",
5033
+
]
5034
+
5035
+
[[package]]
5036
+
name = "wayland-sys"
5037
+
version = "0.31.7"
5038
+
source = "registry+https://github.com/rust-lang/crates.io-index"
5039
+
checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142"
5040
+
dependencies = [
5041
+
"dlib",
5042
+
"log",
5043
+
"pkg-config",
5044
+
]
5045
+
5046
+
[[package]]
4436
5047
name = "web-sys"
4437
-
version = "0.3.77"
5048
+
version = "0.3.82"
4438
5049
source = "registry+https://github.com/rust-lang/crates.io-index"
4439
-
checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2"
5050
+
checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1"
4440
5051
dependencies = [
4441
5052
"js-sys",
4442
5053
"wasm-bindgen",
···
4495
5106
"webview2-com-macros",
4496
5107
"webview2-com-sys",
4497
5108
"windows",
4498
-
"windows-core",
5109
+
"windows-core 0.61.2",
4499
5110
"windows-implement",
4500
5111
"windows-interface",
4501
5112
]
···
4508
5119
dependencies = [
4509
5120
"proc-macro2",
4510
5121
"quote",
4511
-
"syn 2.0.104",
5122
+
"syn 2.0.109",
4512
5123
]
4513
5124
4514
5125
[[package]]
···
4517
5128
source = "registry+https://github.com/rust-lang/crates.io-index"
4518
5129
checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c"
4519
5130
dependencies = [
4520
-
"thiserror 2.0.12",
5131
+
"thiserror 2.0.17",
4521
5132
"windows",
4522
-
"windows-core",
5133
+
"windows-core 0.61.2",
4523
5134
]
5135
+
5136
+
[[package]]
5137
+
name = "weezl"
5138
+
version = "0.1.12"
5139
+
source = "registry+https://github.com/rust-lang/crates.io-index"
5140
+
checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88"
4524
5141
4525
5142
[[package]]
4526
5143
name = "winapi"
···
4540
5157
4541
5158
[[package]]
4542
5159
name = "winapi-util"
4543
-
version = "0.1.9"
5160
+
version = "0.1.11"
4544
5161
source = "registry+https://github.com/rust-lang/crates.io-index"
4545
-
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
5162
+
checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
4546
5163
dependencies = [
4547
-
"windows-sys 0.59.0",
5164
+
"windows-sys 0.61.2",
4548
5165
]
4549
5166
4550
5167
[[package]]
···
4559
5176
source = "registry+https://github.com/rust-lang/crates.io-index"
4560
5177
checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c"
4561
5178
dependencies = [
4562
-
"objc2 0.6.1",
5179
+
"objc2 0.6.3",
4563
5180
"objc2-app-kit",
4564
5181
"objc2-core-foundation",
4565
-
"objc2-foundation 0.3.1",
5182
+
"objc2-foundation 0.3.2",
4566
5183
"raw-window-handle",
4567
5184
"windows-sys 0.59.0",
4568
5185
"windows-version",
···
4575
5192
checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893"
4576
5193
dependencies = [
4577
5194
"windows-collections",
4578
-
"windows-core",
5195
+
"windows-core 0.61.2",
4579
5196
"windows-future",
4580
-
"windows-link",
5197
+
"windows-link 0.1.3",
4581
5198
"windows-numerics",
4582
5199
]
4583
5200
···
4587
5204
source = "registry+https://github.com/rust-lang/crates.io-index"
4588
5205
checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8"
4589
5206
dependencies = [
4590
-
"windows-core",
5207
+
"windows-core 0.61.2",
4591
5208
]
4592
5209
4593
5210
[[package]]
···
4598
5215
dependencies = [
4599
5216
"windows-implement",
4600
5217
"windows-interface",
4601
-
"windows-link",
4602
-
"windows-result",
4603
-
"windows-strings",
5218
+
"windows-link 0.1.3",
5219
+
"windows-result 0.3.4",
5220
+
"windows-strings 0.4.2",
5221
+
]
5222
+
5223
+
[[package]]
5224
+
name = "windows-core"
5225
+
version = "0.62.2"
5226
+
source = "registry+https://github.com/rust-lang/crates.io-index"
5227
+
checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
5228
+
dependencies = [
5229
+
"windows-implement",
5230
+
"windows-interface",
5231
+
"windows-link 0.2.1",
5232
+
"windows-result 0.4.1",
5233
+
"windows-strings 0.5.1",
4604
5234
]
4605
5235
4606
5236
[[package]]
···
4609
5239
source = "registry+https://github.com/rust-lang/crates.io-index"
4610
5240
checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e"
4611
5241
dependencies = [
4612
-
"windows-core",
4613
-
"windows-link",
5242
+
"windows-core 0.61.2",
5243
+
"windows-link 0.1.3",
4614
5244
"windows-threading",
4615
5245
]
4616
5246
4617
5247
[[package]]
4618
5248
name = "windows-implement"
4619
-
version = "0.60.0"
5249
+
version = "0.60.2"
4620
5250
source = "registry+https://github.com/rust-lang/crates.io-index"
4621
-
checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
5251
+
checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
4622
5252
dependencies = [
4623
5253
"proc-macro2",
4624
5254
"quote",
4625
-
"syn 2.0.104",
5255
+
"syn 2.0.109",
4626
5256
]
4627
5257
4628
5258
[[package]]
4629
5259
name = "windows-interface"
4630
-
version = "0.59.1"
5260
+
version = "0.59.3"
4631
5261
source = "registry+https://github.com/rust-lang/crates.io-index"
4632
-
checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
5262
+
checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
4633
5263
dependencies = [
4634
5264
"proc-macro2",
4635
5265
"quote",
4636
-
"syn 2.0.104",
5266
+
"syn 2.0.109",
4637
5267
]
4638
5268
4639
5269
[[package]]
···
4643
5273
checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
4644
5274
4645
5275
[[package]]
5276
+
name = "windows-link"
5277
+
version = "0.2.1"
5278
+
source = "registry+https://github.com/rust-lang/crates.io-index"
5279
+
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
5280
+
5281
+
[[package]]
4646
5282
name = "windows-numerics"
4647
5283
version = "0.2.0"
4648
5284
source = "registry+https://github.com/rust-lang/crates.io-index"
4649
5285
checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1"
4650
5286
dependencies = [
4651
-
"windows-core",
4652
-
"windows-link",
5287
+
"windows-core 0.61.2",
5288
+
"windows-link 0.1.3",
4653
5289
]
4654
5290
4655
5291
[[package]]
···
4658
5294
source = "registry+https://github.com/rust-lang/crates.io-index"
4659
5295
checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6"
4660
5296
dependencies = [
4661
-
"windows-link",
5297
+
"windows-link 0.1.3",
5298
+
]
5299
+
5300
+
[[package]]
5301
+
name = "windows-result"
5302
+
version = "0.4.1"
5303
+
source = "registry+https://github.com/rust-lang/crates.io-index"
5304
+
checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
5305
+
dependencies = [
5306
+
"windows-link 0.2.1",
4662
5307
]
4663
5308
4664
5309
[[package]]
···
4667
5312
source = "registry+https://github.com/rust-lang/crates.io-index"
4668
5313
checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57"
4669
5314
dependencies = [
4670
-
"windows-link",
5315
+
"windows-link 0.1.3",
5316
+
]
5317
+
5318
+
[[package]]
5319
+
name = "windows-strings"
5320
+
version = "0.5.1"
5321
+
source = "registry+https://github.com/rust-lang/crates.io-index"
5322
+
checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
5323
+
dependencies = [
5324
+
"windows-link 0.2.1",
4671
5325
]
4672
5326
4673
5327
[[package]]
···
4694
5348
source = "registry+https://github.com/rust-lang/crates.io-index"
4695
5349
checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
4696
5350
dependencies = [
4697
-
"windows-targets 0.53.3",
5351
+
"windows-targets 0.53.5",
5352
+
]
5353
+
5354
+
[[package]]
5355
+
name = "windows-sys"
5356
+
version = "0.61.2"
5357
+
source = "registry+https://github.com/rust-lang/crates.io-index"
5358
+
checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
5359
+
dependencies = [
5360
+
"windows-link 0.2.1",
4698
5361
]
4699
5362
4700
5363
[[package]]
···
4730
5393
4731
5394
[[package]]
4732
5395
name = "windows-targets"
4733
-
version = "0.53.3"
5396
+
version = "0.53.5"
4734
5397
source = "registry+https://github.com/rust-lang/crates.io-index"
4735
-
checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91"
5398
+
checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3"
4736
5399
dependencies = [
4737
-
"windows-link",
4738
-
"windows_aarch64_gnullvm 0.53.0",
4739
-
"windows_aarch64_msvc 0.53.0",
4740
-
"windows_i686_gnu 0.53.0",
4741
-
"windows_i686_gnullvm 0.53.0",
4742
-
"windows_i686_msvc 0.53.0",
4743
-
"windows_x86_64_gnu 0.53.0",
4744
-
"windows_x86_64_gnullvm 0.53.0",
4745
-
"windows_x86_64_msvc 0.53.0",
5400
+
"windows-link 0.2.1",
5401
+
"windows_aarch64_gnullvm 0.53.1",
5402
+
"windows_aarch64_msvc 0.53.1",
5403
+
"windows_i686_gnu 0.53.1",
5404
+
"windows_i686_gnullvm 0.53.1",
5405
+
"windows_i686_msvc 0.53.1",
5406
+
"windows_x86_64_gnu 0.53.1",
5407
+
"windows_x86_64_gnullvm 0.53.1",
5408
+
"windows_x86_64_msvc 0.53.1",
4746
5409
]
4747
5410
4748
5411
[[package]]
···
4751
5414
source = "registry+https://github.com/rust-lang/crates.io-index"
4752
5415
checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6"
4753
5416
dependencies = [
4754
-
"windows-link",
5417
+
"windows-link 0.1.3",
4755
5418
]
4756
5419
4757
5420
[[package]]
4758
5421
name = "windows-version"
4759
-
version = "0.1.4"
5422
+
version = "0.1.7"
4760
5423
source = "registry+https://github.com/rust-lang/crates.io-index"
4761
-
checksum = "e04a5c6627e310a23ad2358483286c7df260c964eb2d003d8efd6d0f4e79265c"
5424
+
checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631"
4762
5425
dependencies = [
4763
-
"windows-link",
5426
+
"windows-link 0.2.1",
4764
5427
]
4765
5428
4766
5429
[[package]]
···
4777
5440
4778
5441
[[package]]
4779
5442
name = "windows_aarch64_gnullvm"
4780
-
version = "0.53.0"
5443
+
version = "0.53.1"
4781
5444
source = "registry+https://github.com/rust-lang/crates.io-index"
4782
-
checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764"
5445
+
checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53"
4783
5446
4784
5447
[[package]]
4785
5448
name = "windows_aarch64_msvc"
···
4795
5458
4796
5459
[[package]]
4797
5460
name = "windows_aarch64_msvc"
4798
-
version = "0.53.0"
5461
+
version = "0.53.1"
4799
5462
source = "registry+https://github.com/rust-lang/crates.io-index"
4800
-
checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c"
5463
+
checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006"
4801
5464
4802
5465
[[package]]
4803
5466
name = "windows_i686_gnu"
···
4813
5476
4814
5477
[[package]]
4815
5478
name = "windows_i686_gnu"
4816
-
version = "0.53.0"
5479
+
version = "0.53.1"
4817
5480
source = "registry+https://github.com/rust-lang/crates.io-index"
4818
-
checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3"
5481
+
checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3"
4819
5482
4820
5483
[[package]]
4821
5484
name = "windows_i686_gnullvm"
···
4825
5488
4826
5489
[[package]]
4827
5490
name = "windows_i686_gnullvm"
4828
-
version = "0.53.0"
5491
+
version = "0.53.1"
4829
5492
source = "registry+https://github.com/rust-lang/crates.io-index"
4830
-
checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11"
5493
+
checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c"
4831
5494
4832
5495
[[package]]
4833
5496
name = "windows_i686_msvc"
···
4843
5506
4844
5507
[[package]]
4845
5508
name = "windows_i686_msvc"
4846
-
version = "0.53.0"
5509
+
version = "0.53.1"
4847
5510
source = "registry+https://github.com/rust-lang/crates.io-index"
4848
-
checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d"
5511
+
checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2"
4849
5512
4850
5513
[[package]]
4851
5514
name = "windows_x86_64_gnu"
···
4861
5524
4862
5525
[[package]]
4863
5526
name = "windows_x86_64_gnu"
4864
-
version = "0.53.0"
5527
+
version = "0.53.1"
4865
5528
source = "registry+https://github.com/rust-lang/crates.io-index"
4866
-
checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba"
5529
+
checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499"
4867
5530
4868
5531
[[package]]
4869
5532
name = "windows_x86_64_gnullvm"
···
4879
5542
4880
5543
[[package]]
4881
5544
name = "windows_x86_64_gnullvm"
4882
-
version = "0.53.0"
5545
+
version = "0.53.1"
4883
5546
source = "registry+https://github.com/rust-lang/crates.io-index"
4884
-
checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57"
5547
+
checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1"
4885
5548
4886
5549
[[package]]
4887
5550
name = "windows_x86_64_msvc"
···
4897
5560
4898
5561
[[package]]
4899
5562
name = "windows_x86_64_msvc"
4900
-
version = "0.53.0"
5563
+
version = "0.53.1"
4901
5564
source = "registry+https://github.com/rust-lang/crates.io-index"
4902
-
checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
5565
+
checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
4903
5566
4904
5567
[[package]]
4905
5568
name = "winnow"
···
4912
5575
4913
5576
[[package]]
4914
5577
name = "winnow"
4915
-
version = "0.7.12"
5578
+
version = "0.7.13"
4916
5579
source = "registry+https://github.com/rust-lang/crates.io-index"
4917
-
checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95"
5580
+
checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf"
4918
5581
dependencies = [
4919
5582
"memchr",
4920
5583
]
···
4930
5593
]
4931
5594
4932
5595
[[package]]
4933
-
name = "wit-bindgen-rt"
4934
-
version = "0.39.0"
5596
+
name = "wit-bindgen"
5597
+
version = "0.46.0"
5598
+
source = "registry+https://github.com/rust-lang/crates.io-index"
5599
+
checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59"
5600
+
5601
+
[[package]]
5602
+
name = "wl-clipboard-rs"
5603
+
version = "0.9.2"
4935
5604
source = "registry+https://github.com/rust-lang/crates.io-index"
4936
-
checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
5605
+
checksum = "8e5ff8d0e60065f549fafd9d6cb626203ea64a798186c80d8e7df4f8af56baeb"
4937
5606
dependencies = [
4938
-
"bitflags 2.9.1",
5607
+
"libc",
5608
+
"log",
5609
+
"os_pipe",
5610
+
"rustix 0.38.44",
5611
+
"tempfile",
5612
+
"thiserror 2.0.17",
5613
+
"tree_magic_mini",
5614
+
"wayland-backend",
5615
+
"wayland-client",
5616
+
"wayland-protocols",
5617
+
"wayland-protocols-wlr",
4939
5618
]
4940
5619
4941
5620
[[package]]
4942
5621
name = "writeable"
4943
-
version = "0.6.1"
5622
+
version = "0.6.2"
4944
5623
source = "registry+https://github.com/rust-lang/crates.io-index"
4945
-
checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb"
5624
+
checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9"
4946
5625
4947
5626
[[package]]
4948
5627
name = "wry"
4949
-
version = "0.52.1"
5628
+
version = "0.53.5"
4950
5629
source = "registry+https://github.com/rust-lang/crates.io-index"
4951
-
checksum = "12a714d9ba7075aae04a6e50229d6109e3d584774b99a6a8c60de1698ca111b9"
5630
+
checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2"
4952
5631
dependencies = [
4953
5632
"base64 0.22.1",
4954
-
"block2 0.6.1",
5633
+
"block2 0.6.2",
4955
5634
"cookie",
4956
5635
"crossbeam-channel",
5636
+
"dirs",
4957
5637
"dpi",
4958
5638
"dunce",
4959
5639
"gdkx11",
···
4965
5645
"kuchikiki",
4966
5646
"libc",
4967
5647
"ndk",
4968
-
"objc2 0.6.1",
5648
+
"objc2 0.6.3",
4969
5649
"objc2-app-kit",
4970
5650
"objc2-core-foundation",
4971
-
"objc2-foundation 0.3.1",
5651
+
"objc2-foundation 0.3.2",
4972
5652
"objc2-ui-kit",
4973
5653
"objc2-web-kit",
4974
5654
"once_cell",
···
4977
5657
"sha2",
4978
5658
"soup3",
4979
5659
"tao-macros",
4980
-
"thiserror 2.0.12",
5660
+
"thiserror 2.0.17",
4981
5661
"url",
4982
5662
"webkit2gtk",
4983
5663
"webkit2gtk-sys",
4984
5664
"webview2-com",
4985
5665
"windows",
4986
-
"windows-core",
5666
+
"windows-core 0.61.2",
4987
5667
"windows-version",
4988
5668
"x11-dl",
4989
5669
]
···
5010
5690
]
5011
5691
5012
5692
[[package]]
5693
+
name = "x11rb"
5694
+
version = "0.13.2"
5695
+
source = "registry+https://github.com/rust-lang/crates.io-index"
5696
+
checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414"
5697
+
dependencies = [
5698
+
"gethostname",
5699
+
"rustix 1.1.2",
5700
+
"x11rb-protocol",
5701
+
]
5702
+
5703
+
[[package]]
5704
+
name = "x11rb-protocol"
5705
+
version = "0.13.2"
5706
+
source = "registry+https://github.com/rust-lang/crates.io-index"
5707
+
checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd"
5708
+
5709
+
[[package]]
5710
+
name = "xkbcommon"
5711
+
version = "0.9.0"
5712
+
source = "registry+https://github.com/rust-lang/crates.io-index"
5713
+
checksum = "a7a974f48060a14e95705c01f24ad9c3345022f4d97441b8a36beb7ed5c4a02d"
5714
+
dependencies = [
5715
+
"libc",
5716
+
"memmap2",
5717
+
"xkeysym",
5718
+
]
5719
+
5720
+
[[package]]
5721
+
name = "xkeysym"
5722
+
version = "0.2.1"
5723
+
source = "registry+https://github.com/rust-lang/crates.io-index"
5724
+
checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56"
5725
+
5726
+
[[package]]
5013
5727
name = "yoke"
5014
-
version = "0.8.0"
5728
+
version = "0.8.1"
5015
5729
source = "registry+https://github.com/rust-lang/crates.io-index"
5016
-
checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc"
5730
+
checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954"
5017
5731
dependencies = [
5018
-
"serde",
5019
5732
"stable_deref_trait",
5020
5733
"yoke-derive",
5021
5734
"zerofrom",
···
5023
5736
5024
5737
[[package]]
5025
5738
name = "yoke-derive"
5026
-
version = "0.8.0"
5739
+
version = "0.8.1"
5027
5740
source = "registry+https://github.com/rust-lang/crates.io-index"
5028
-
checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6"
5741
+
checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d"
5029
5742
dependencies = [
5030
5743
"proc-macro2",
5031
5744
"quote",
5032
-
"syn 2.0.104",
5745
+
"syn 2.0.109",
5033
5746
"synstructure",
5034
5747
]
5035
5748
5036
5749
[[package]]
5037
5750
name = "zbus"
5038
-
version = "5.9.0"
5751
+
version = "5.12.0"
5039
5752
source = "registry+https://github.com/rust-lang/crates.io-index"
5040
-
checksum = "4bb4f9a464286d42851d18a605f7193b8febaf5b0919d71c6399b7b26e5b0aad"
5753
+
checksum = "b622b18155f7a93d1cd2dc8c01d2d6a44e08fb9ebb7b3f9e6ed101488bad6c91"
5041
5754
dependencies = [
5042
5755
"async-broadcast",
5043
5756
"async-executor",
···
5057
5770
"ordered-stream",
5058
5771
"serde",
5059
5772
"serde_repr",
5773
+
"tokio",
5060
5774
"tracing",
5061
5775
"uds_windows",
5062
-
"windows-sys 0.59.0",
5063
-
"winnow 0.7.12",
5776
+
"uuid",
5777
+
"windows-sys 0.61.2",
5778
+
"winnow 0.7.13",
5064
5779
"zbus_macros",
5065
5780
"zbus_names",
5066
5781
"zvariant",
···
5068
5783
5069
5784
[[package]]
5070
5785
name = "zbus_macros"
5071
-
version = "5.9.0"
5786
+
version = "5.12.0"
5072
5787
source = "registry+https://github.com/rust-lang/crates.io-index"
5073
-
checksum = "ef9859f68ee0c4ee2e8cde84737c78e3f4c54f946f2a38645d0d4c7a95327659"
5788
+
checksum = "1cdb94821ca8a87ca9c298b5d1cbd80e2a8b67115d99f6e4551ac49e42b6a314"
5074
5789
dependencies = [
5075
-
"proc-macro-crate 3.3.0",
5790
+
"proc-macro-crate 3.4.0",
5076
5791
"proc-macro2",
5077
5792
"quote",
5078
-
"syn 2.0.104",
5793
+
"syn 2.0.109",
5079
5794
"zbus_names",
5080
5795
"zvariant",
5081
5796
"zvariant_utils",
···
5089
5804
dependencies = [
5090
5805
"serde",
5091
5806
"static_assertions",
5092
-
"winnow 0.7.12",
5807
+
"winnow 0.7.13",
5093
5808
"zvariant",
5094
5809
]
5095
5810
5096
5811
[[package]]
5097
5812
name = "zerocopy"
5098
-
version = "0.8.26"
5813
+
version = "0.8.27"
5099
5814
source = "registry+https://github.com/rust-lang/crates.io-index"
5100
-
checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f"
5815
+
checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c"
5101
5816
dependencies = [
5102
5817
"zerocopy-derive",
5103
5818
]
5104
5819
5105
5820
[[package]]
5106
5821
name = "zerocopy-derive"
5107
-
version = "0.8.26"
5822
+
version = "0.8.27"
5108
5823
source = "registry+https://github.com/rust-lang/crates.io-index"
5109
-
checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181"
5824
+
checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831"
5110
5825
dependencies = [
5111
5826
"proc-macro2",
5112
5827
"quote",
5113
-
"syn 2.0.104",
5828
+
"syn 2.0.109",
5114
5829
]
5115
5830
5116
5831
[[package]]
···
5130
5845
dependencies = [
5131
5846
"proc-macro2",
5132
5847
"quote",
5133
-
"syn 2.0.104",
5848
+
"syn 2.0.109",
5134
5849
"synstructure",
5135
5850
]
5136
5851
5137
5852
[[package]]
5138
5853
name = "zerotrie"
5139
-
version = "0.2.2"
5854
+
version = "0.2.3"
5140
5855
source = "registry+https://github.com/rust-lang/crates.io-index"
5141
-
checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595"
5856
+
checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851"
5142
5857
dependencies = [
5143
5858
"displaydoc",
5144
5859
"yoke",
···
5147
5862
5148
5863
[[package]]
5149
5864
name = "zerovec"
5150
-
version = "0.11.2"
5865
+
version = "0.11.5"
5151
5866
source = "registry+https://github.com/rust-lang/crates.io-index"
5152
-
checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428"
5867
+
checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002"
5153
5868
dependencies = [
5154
5869
"yoke",
5155
5870
"zerofrom",
···
5158
5873
5159
5874
[[package]]
5160
5875
name = "zerovec-derive"
5161
-
version = "0.11.1"
5876
+
version = "0.11.2"
5162
5877
source = "registry+https://github.com/rust-lang/crates.io-index"
5163
-
checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f"
5878
+
checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3"
5164
5879
dependencies = [
5165
5880
"proc-macro2",
5166
5881
"quote",
5167
-
"syn 2.0.104",
5882
+
"syn 2.0.109",
5883
+
]
5884
+
5885
+
[[package]]
5886
+
name = "zune-core"
5887
+
version = "0.4.12"
5888
+
source = "registry+https://github.com/rust-lang/crates.io-index"
5889
+
checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a"
5890
+
5891
+
[[package]]
5892
+
name = "zune-jpeg"
5893
+
version = "0.4.21"
5894
+
source = "registry+https://github.com/rust-lang/crates.io-index"
5895
+
checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713"
5896
+
dependencies = [
5897
+
"zune-core",
5168
5898
]
5169
5899
5170
5900
[[package]]
5171
5901
name = "zvariant"
5172
-
version = "5.6.0"
5902
+
version = "5.8.0"
5173
5903
source = "registry+https://github.com/rust-lang/crates.io-index"
5174
-
checksum = "d91b3680bb339216abd84714172b5138a4edac677e641ef17e1d8cb1b3ca6e6f"
5904
+
checksum = "2be61892e4f2b1772727be11630a62664a1826b62efa43a6fe7449521cb8744c"
5175
5905
dependencies = [
5176
5906
"endi",
5177
5907
"enumflags2",
5178
5908
"serde",
5179
-
"winnow 0.7.12",
5909
+
"url",
5910
+
"winnow 0.7.13",
5180
5911
"zvariant_derive",
5181
5912
"zvariant_utils",
5182
5913
]
5183
5914
5184
5915
[[package]]
5185
5916
name = "zvariant_derive"
5186
-
version = "5.6.0"
5917
+
version = "5.8.0"
5187
5918
source = "registry+https://github.com/rust-lang/crates.io-index"
5188
-
checksum = "3a8c68501be459a8dbfffbe5d792acdd23b4959940fc87785fb013b32edbc208"
5919
+
checksum = "da58575a1b2b20766513b1ec59d8e2e68db2745379f961f86650655e862d2006"
5189
5920
dependencies = [
5190
-
"proc-macro-crate 3.3.0",
5921
+
"proc-macro-crate 3.4.0",
5191
5922
"proc-macro2",
5192
5923
"quote",
5193
-
"syn 2.0.104",
5924
+
"syn 2.0.109",
5194
5925
"zvariant_utils",
5195
5926
]
5196
5927
5197
5928
[[package]]
5198
5929
name = "zvariant_utils"
5199
-
version = "3.2.0"
5930
+
version = "3.2.1"
5200
5931
source = "registry+https://github.com/rust-lang/crates.io-index"
5201
-
checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34"
5932
+
checksum = "c6949d142f89f6916deca2232cf26a8afacf2b9fdc35ce766105e104478be599"
5202
5933
dependencies = [
5203
5934
"proc-macro2",
5204
5935
"quote",
5205
5936
"serde",
5206
-
"static_assertions",
5207
-
"syn 2.0.104",
5208
-
"winnow 0.7.12",
5937
+
"syn 2.0.109",
5938
+
"winnow 0.7.13",
5209
5939
]
+13
-5
src-tauri/Cargo.toml
+13
-5
src-tauri/Cargo.toml
···
18
18
tauri-build = { version = "2", features = [] }
19
19
20
20
[dependencies]
21
-
tauri = { version = "2", features = [] }
21
+
tauri = { version = "2", features = [ 'tray-icon', 'image-png' ] }
22
22
tauri-plugin-opener = "2"
23
23
serde = { version = "1", features = ["derive"] }
24
24
serde_json = "1"
25
-
tokio = { version = "1.47.0", features = [ "macros" ] }
26
-
dirs = "6.0.0"
27
-
anyhow = "1.0.99"
28
-
flate2 = "1.1.2"
25
+
tokio = { version = "1.47", features = [ "macros" ] }
26
+
dirs = "6.0"
27
+
anyhow = "1.0"
28
+
flate2 = "1.1"
29
+
tauri-plugin-dialog = "2"
30
+
crossbeam-channel = "0.5"
31
+
tauri-plugin-clipboard-manager = "2"
32
+
tauri-plugin-os = "2"
33
+
34
+
# [target.'cfg(windows)'.dependencies]
35
+
enigo = { version = "0.6.1" }
36
+
chrono = "0.4.42"
29
37
+1
-1
src-tauri/build.rs
+1
-1
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
+2
-2
src-tauri/src/frontend_calls/get_addresses.rs
+2
-2
src-tauri/src/frontend_calls/get_addresses.rs
···
5
5
use crate::osc::OSCMessage;
6
6
7
7
#[tauri::command]
8
-
pub fn get_addresses( addresses: State<&Mutex<Vec<OSCMessage>>> ) -> Vec<OSCMessage> {
8
+
pub fn get_addresses(addresses: State<&Mutex<Vec<OSCMessage>>>) -> Vec<OSCMessage> {
9
9
let addresses = addresses.lock().unwrap();
10
10
addresses.clone()
11
-
}
11
+
}
+20
src-tauri/src/frontend_calls/load_previous_tabs.rs
+20
src-tauri/src/frontend_calls/load_previous_tabs.rs
···
1
+
use std::collections::HashMap;
2
+
3
+
use tauri::{State, Window};
4
+
5
+
use crate::{structs::nodes::Node, utils::config::Config};
6
+
7
+
#[tauri::command]
8
+
pub fn load_previous_tabs(
9
+
window: Window,
10
+
conf: State<Config>,
11
+
) -> HashMap<String, (Vec<Node>, String, Option<String>, bool)> {
12
+
let config = conf.store.lock().unwrap();
13
+
14
+
if !config.hide_editor_on_start {
15
+
window.show().unwrap();
16
+
}
17
+
18
+
let tabs = config.loaded_tabs.clone();
19
+
tabs
20
+
}
+5
-1
src-tauri/src/frontend_calls/mod.rs
+5
-1
src-tauri/src/frontend_calls/mod.rs
+9
-8
src-tauri/src/frontend_calls/save_graph.rs
+9
-8
src-tauri/src/frontend_calls/save_graph.rs
···
1
-
use std::{ fs::File, io::Write };
1
+
use std::{fs::File, io::Write, path::PathBuf};
2
+
3
+
use flate2::{write::GzEncoder, Compression};
4
+
use tauri::State;
2
5
3
-
use flate2::{ write::GzEncoder, Compression };
6
+
use crate::utils::config::Config;
4
7
5
8
#[tauri::command]
6
-
pub fn save_graph( tab_name: String, graph: String ) {
7
-
dbg!(&graph);
8
-
9
-
let path = dirs::config_dir().unwrap().join("VRCMacros").join(format!("{}.macro", tab_name));
10
-
9
+
pub fn save_graph(graph: String, path: PathBuf, conf: State<Config>) {
11
10
let file = File::create(&path).unwrap();
12
11
let mut encoder = GzEncoder::new(file, Compression::default());
13
12
14
13
encoder.write_all(graph.as_bytes()).unwrap();
15
14
encoder.finish().unwrap();
16
-
}
15
+
16
+
conf.save();
17
+
}
+15
src-tauri/src/frontend_calls/settings.rs
+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
+
}
+29
-12
src-tauri/src/lib.rs
+29
-12
src-tauri/src/lib.rs
···
1
-
use std::{ fs, sync::Mutex };
1
+
use std::{fs, sync::Mutex};
2
2
3
+
use crossbeam_channel::bounded;
3
4
use frontend_calls::*;
4
5
5
-
use crate::{ osc::OSCMessage, setup::setup, utils::config::Config };
6
+
use crate::{osc::OSCMessage, setup::setup, utils::{config::Config, vrchat_builtin_parameters}};
6
7
7
8
mod frontend_calls;
8
-
mod structs;
9
+
mod osc;
10
+
mod runtime;
9
11
mod setup;
12
+
mod structs;
10
13
mod utils;
11
-
mod osc;
12
14
13
15
#[cfg_attr(mobile, tauri::mobile_entry_point)]
14
16
#[tokio::main]
15
17
pub async fn run() {
16
18
let container_folder = dirs::config_dir().unwrap().join("VRCMacros");
17
19
18
-
match fs ::metadata(&container_folder){
20
+
match fs::metadata(&container_folder) {
19
21
Ok(meta) => {
20
-
if meta.is_file(){
21
-
panic!("document.write('Cannot launch app as the container path is a file not a directory')");
22
+
if meta.is_file() {
23
+
panic!("Cannot launch app as the container path is a file not a directory");
22
24
}
23
25
}
24
26
Err(_) => {
···
31
33
32
34
static ADDRESSES: Mutex<Vec<OSCMessage>> = Mutex::new(Vec::new());
33
35
36
+
let mut addresses = ADDRESSES.lock().unwrap();
37
+
addresses.append(&mut vrchat_builtin_parameters::get_read_addresses());
38
+
drop(addresses);
39
+
40
+
let (runtime_sender, runtime_receiver) = bounded(1024);
41
+
34
42
tauri::Builder::default()
43
+
.plugin(tauri_plugin_os::init())
44
+
.plugin(tauri_plugin_clipboard_manager::init())
45
+
.plugin(tauri_plugin_dialog::init())
35
46
.plugin(tauri_plugin_opener::init())
36
47
.invoke_handler(tauri::generate_handler![
37
48
get_addresses::get_addresses,
38
-
39
-
save_graph::save_graph
49
+
save_graph::save_graph,
50
+
sync_tab::sync_tab,
51
+
sync_tab::discard_tab,
52
+
load_previous_tabs::load_previous_tabs,
53
+
close_app::close_app,
54
+
settings::set_hide_editor_on_app_start,
55
+
settings::get_hide_editor_on_app_start,
40
56
])
41
57
.manage(conf)
42
58
.manage(&ADDRESSES)
43
-
.setup(| app | {
44
-
setup(app, &ADDRESSES);
59
+
.manage(runtime_sender)
60
+
.setup(|app| {
61
+
setup(app, &ADDRESSES, runtime_receiver);
45
62
Ok(())
46
63
})
47
64
.run(tauri::generate_context!())
48
65
.expect("error while running tauri application");
49
-
}
66
+
}
+3
-1
src-tauri/src/main.rs
+3
-1
src-tauri/src/main.rs
+36
-29
src-tauri/src/osc.rs
+36
-29
src-tauri/src/osc.rs
···
1
1
// https://gist.github.com/phaze-the-dumb/634daacb5141eae2f846e20987dba7a8
2
-
3
-
use std::{ net::UdpSocket, sync::mpsc::Sender };
2
+
use std::net::UdpSocket;
4
3
4
+
use crossbeam_channel::Sender;
5
5
use serde::Serialize;
6
6
7
7
use crate::structs::parameter_types::ParameterType;
8
8
9
9
#[derive(Debug, Clone, Serialize)]
10
-
pub struct OSCMessage{
10
+
pub struct OSCMessage {
11
11
pub address: String,
12
-
pub values: Vec<ParameterType>
12
+
pub values: Vec<ParameterType>,
13
13
}
14
14
15
-
impl PartialEq for OSCMessage{
15
+
impl PartialEq for OSCMessage {
16
16
// Technically this isn't exactly equal, but the only time i'm checking if OSCMessage's are equal
17
17
// Is when i'm checking for the "address" value
18
18
···
26
26
}
27
27
28
28
// TODO: Implement osc bundles
29
-
pub fn start_server( sender: Sender<OSCMessage>, addr: &str ) {
29
+
pub fn start_server(sender: Sender<OSCMessage>, addr: &str) {
30
30
let socket = UdpSocket::bind(addr).unwrap();
31
31
32
32
loop {
···
34
34
let (amt, _src) = socket.recv_from(&mut buf).unwrap();
35
35
36
36
let buf = &mut buf[..amt];
37
-
if buf[0] != 0x2F { panic!("Packet is not an OSC Message"); }
37
+
if buf[0] != 0x2F {
38
+
panic!("Packet is not an OSC Message");
39
+
}
38
40
39
41
let mut addr: Vec<u8> = Vec::new();
40
42
let mut value_start = 0;
41
43
42
-
loop{
44
+
loop {
43
45
let byte = buf[value_start];
44
-
if byte == 0x00{ break; }
46
+
if byte == 0x00 {
47
+
break;
48
+
}
45
49
46
50
value_start += 1;
47
51
addr.push(byte);
48
52
}
49
53
50
-
loop{
54
+
loop {
51
55
let byte = buf[value_start];
52
56
value_start += 1;
53
57
54
-
if byte == 0x2C{ break; }
58
+
if byte == 0x2C {
59
+
break;
60
+
}
55
61
}
56
62
57
63
let mut types: Vec<u8> = Vec::new();
58
64
59
-
loop{
65
+
loop {
60
66
let byte = buf[value_start];
61
-
if byte == 0x00{ break; }
67
+
if byte == 0x00 {
68
+
break;
69
+
}
62
70
63
71
types.push(byte);
64
72
value_start += 1;
···
67
75
value_start = ((value_start as f32 / 4.0).ceil() * 4.0) as usize;
68
76
let mut values = Vec::new();
69
77
70
-
for tp in types{
71
-
match tp{
78
+
for tp in types {
79
+
match tp {
72
80
0x69 => {
73
81
let val_buf = &buf[value_start..value_start + 4];
74
82
···
77
85
78
86
values.push(ParameterType::Int(int));
79
87
value_start += 4;
80
-
},
88
+
}
81
89
0x66 => {
82
90
let val_buf = &buf[value_start..value_start + 4];
83
91
···
86
94
87
95
values.push(ParameterType::Float(float));
88
96
value_start += 4;
89
-
},
97
+
}
90
98
0x54 => values.push(ParameterType::Boolean(true)),
91
99
0x46 => values.push(ParameterType::Boolean(false)),
92
100
_ => {}
···
95
103
96
104
let message = OSCMessage {
97
105
address: String::from_utf8(addr.clone()).unwrap(),
98
-
values: values
106
+
values: values,
99
107
};
100
108
101
109
sender.send(message).unwrap();
102
110
}
103
111
}
104
112
105
-
pub fn send_message( address: &str, values: Vec<ParameterType>, ip_addr: &str ){
113
+
pub fn send_message(address: &str, values: Vec<ParameterType>, ip_addr: &str) {
106
114
let socket = UdpSocket::bind("127.0.0.1:0").unwrap();
107
115
let mut buf: Vec<u8> = Vec::new();
108
116
···
120
128
let mut value_count = 1;
121
129
for value in values.clone() {
122
130
match value {
123
-
ParameterType::Boolean( val ) => buf.push(if val { 0x54 } else { 0x46 }),
131
+
ParameterType::Boolean(val) => buf.push(if val { 0x54 } else { 0x46 }),
124
132
ParameterType::Float(_) => buf.push(0x66),
125
133
ParameterType::Int(_) => buf.push(0x69),
126
134
ParameterType::String(_) => buf.push(0x73),
···
130
138
value_count += 1;
131
139
}
132
140
133
-
for _i in 0..4 - (value_count % 4) {
141
+
for _i in 0..4 - (value_count % 4) {
134
142
buf.push(0);
135
143
}
136
144
137
-
for value in values{
138
-
match value{
139
-
ParameterType::Float( val ) => buf.append(&mut val.to_be_bytes().to_vec()),
140
-
ParameterType::Int( val ) => buf.append(&mut val.to_be_bytes().to_vec()),
141
-
ParameterType::String( val ) => {
145
+
for value in values {
146
+
match value {
147
+
ParameterType::Float(val) => buf.append(&mut val.to_be_bytes().to_vec()),
148
+
ParameterType::Int(val) => buf.append(&mut val.to_be_bytes().to_vec()),
149
+
ParameterType::String(val) => {
142
150
let mut str_buf = val.as_bytes().to_vec();
143
151
let buf_len = str_buf.len().clone();
144
152
145
153
buf.append(&mut str_buf);
146
154
147
-
for _i in 0..4 - (buf_len % 4) {
155
+
for _i in 0..4 - (buf_len % 4) {
148
156
buf.push(0);
149
157
}
150
158
}
···
152
160
}
153
161
}
154
162
155
-
println!("{:X?}", &buf);
156
163
socket.send_to(&buf, ip_addr).unwrap();
157
-
}
164
+
}
+9
src-tauri/src/runtime/commands.rs
+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
+
}
+116
-12
src-tauri/src/setup.rs
+116
-12
src-tauri/src/setup.rs
···
1
-
use std::{ fs::File, io::Read, sync::{ self, Mutex } };
1
+
use crossbeam_channel::{bounded, Receiver};
2
+
use std::{
3
+
collections::HashMap,
4
+
fs::File,
5
+
io::Read,
6
+
sync::{Arc, Mutex},
7
+
};
2
8
3
9
use flate2::read::GzDecoder;
4
-
use serde_json::Value;
5
-
use tauri::{ App, Emitter, Listener, Manager };
10
+
use serde_json::{Map, Value};
11
+
use tauri::{App, Emitter, Listener, Manager, WindowEvent};
6
12
7
-
use crate::osc::{ self, OSCMessage };
13
+
use crate::{
14
+
osc::{self, OSCMessage}, runtime::{commands::RuntimeCommand, nodes::RuntimeNodeTree, recurse_runtime}, structs::parameter_types::ParameterType, utils::{setup_traymenu::setup_traymenu, vrchat_builtin_parameters}
15
+
};
8
16
9
-
pub fn setup( app: &mut App, addresses: &'static Mutex<Vec<OSCMessage>> ){
17
+
pub fn setup(
18
+
app: &mut App,
19
+
addresses: &'static Mutex<Vec<OSCMessage>>,
20
+
runtime_command_receiver: Receiver<RuntimeCommand>,
21
+
) {
10
22
let window = app.get_webview_window("main").unwrap();
23
+
window.hide().unwrap();
24
+
25
+
let win_handle = window.clone();
26
+
27
+
window.on_window_event(move |event| match event {
28
+
WindowEvent::CloseRequested { api, .. } => {
29
+
api.prevent_close();
30
+
win_handle.emit("prompt_to_close", ()).unwrap();
31
+
}
32
+
WindowEvent::Resized(_) => {
33
+
let minimised = win_handle.is_minimized().unwrap();
34
+
if minimised{
35
+
win_handle.hide().unwrap();
36
+
win_handle.emit("hide-window", ()).unwrap();
37
+
win_handle.unminimize().unwrap();
38
+
}
39
+
}
40
+
_ => {}
41
+
});
42
+
43
+
setup_traymenu(app.handle());
11
44
12
45
let handle = window.clone();
13
-
window.listen("tauri://drag-drop", move | ev | {
46
+
window.listen("tauri://drag-drop", move |ev| {
14
47
let path: Value = serde_json::from_str(ev.payload()).unwrap();
15
48
let path = path["paths"][0].as_str().unwrap();
16
49
17
-
let file = File::open(path).unwrap();
50
+
let file = File::open(&path).unwrap();
18
51
let mut decoder = GzDecoder::new(file);
19
52
let mut string = String::new();
20
53
21
54
decoder.read_to_string(&mut string).unwrap();
22
55
23
-
handle.emit("load_new_tab", Value::String(string)).unwrap();
56
+
let mut map = Map::new();
57
+
58
+
map.insert("path".to_owned(), Value::String(path.to_owned()));
59
+
map.insert("graph".to_owned(), Value::String(string));
60
+
61
+
handle.emit("load_new_tab", Value::Object(map)).unwrap();
24
62
});
25
63
26
-
let ( sender, receiver ) = sync::mpsc::channel();
64
+
let (sender, receiver) = bounded(1024);
27
65
28
66
tokio::spawn(async move {
29
67
osc::start_server(sender, "127.0.0.1:9001");
30
68
});
31
69
70
+
let (runtime_sender, runtime_receiver) = bounded(1024);
71
+
72
+
let runtime_sender_1 = runtime_sender.clone();
73
+
tokio::spawn(async move {
74
+
loop {
75
+
let cmd = runtime_command_receiver.recv().unwrap();
76
+
runtime_sender_1.send(cmd).unwrap();
77
+
}
78
+
});
79
+
32
80
tokio::spawn(async move {
33
81
loop {
34
82
let message = receiver.recv().unwrap();
···
36
84
window.emit("osc-message", &message).unwrap();
37
85
38
86
let msg = message.clone();
39
-
let mut addresses = addresses.lock().unwrap();
40
-
if !addresses.contains(&msg){ addresses.push(msg); }
87
+
let mut addrs = addresses.lock().unwrap();
88
+
if !addrs.contains(&msg) {
89
+
addrs.push(msg);
90
+
}
91
+
92
+
if message.address == "/avatar/change".to_owned(){
93
+
*addrs = vrchat_builtin_parameters::get_read_addresses();
94
+
95
+
// TODO: Read avatar paramaters from file
96
+
}
97
+
98
+
runtime_sender
99
+
.send(RuntimeCommand::OSCMessage(message))
100
+
.unwrap();
41
101
}
42
102
});
43
-
}
103
+
104
+
// TODO: Run tabs in seperate threads (really not looking forward to this... thanks rust)
105
+
106
+
tokio::spawn(async move {
107
+
let mut tabs: HashMap<String, RuntimeNodeTree> = HashMap::new();
108
+
109
+
// #[cfg(target_os = "windows")]
110
+
let enigo = Arc::new(Mutex::new(enigo::Enigo::new(&enigo::Settings::default()).unwrap()));
111
+
112
+
loop {
113
+
let cmd = runtime_receiver.recv().unwrap();
114
+
115
+
match cmd {
116
+
RuntimeCommand::OSCMessage(msg) => {
117
+
for (_, mut tab) in &mut tabs {
118
+
let keys: Vec<String> = tab.nodes.keys().map(|x| x.clone()).collect();
119
+
120
+
for id in keys {
121
+
let entry = tab.nodes[&id].is_entrypoint();
122
+
123
+
if entry {
124
+
let mut args = vec![ ParameterType::String(msg.address.clone())];
125
+
let mut values = msg.values.clone();
126
+
127
+
args.append(&mut values);
128
+
let _ = recurse_runtime(id.clone(), &mut tab, args);
129
+
}
130
+
}
131
+
}
132
+
}
133
+
134
+
RuntimeCommand::AddTab(graph, id) => {
135
+
// #[cfg(target_os = "windows")]
136
+
tabs.insert(id, RuntimeNodeTree::from(graph, enigo.clone()));
137
+
138
+
// #[cfg(target_os = "linux")]
139
+
// tabs.insert(id, RuntimeNodeTree::from(graph));
140
+
}
141
+
RuntimeCommand::RemoveTab(id) => {
142
+
tabs.remove(&id);
143
+
}
144
+
}
145
+
}
146
+
});
147
+
}
+2
-1
src-tauri/src/structs/mod.rs
+2
-1
src-tauri/src/structs/mod.rs
+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
+
}
+58
-3
src-tauri/src/structs/parameter_types.rs
+58
-3
src-tauri/src/structs/parameter_types.rs
···
1
+
use anyhow::{bail, Result};
1
2
use serde::Serialize;
2
3
3
-
#[derive(Serialize, Clone, Debug)]
4
+
#[derive(Serialize, Clone, Debug, PartialEq)]
4
5
#[serde(tag = "key", content = "value")]
5
-
pub enum ParameterType{
6
+
pub enum ParameterType {
6
7
AnyType(String),
7
8
Label(&'static str),
8
9
···
10
11
Float(f32),
11
12
Boolean(bool),
12
13
String(String),
13
-
}
14
+
Flow(bool),
15
+
16
+
None,
17
+
}
18
+
19
+
impl ParameterType {
20
+
pub fn as_bool(&self) -> Result<bool> {
21
+
match self {
22
+
ParameterType::Boolean(val) => Ok(val.clone()),
23
+
ParameterType::Int(val) => {
24
+
if *val == 0 {
25
+
Ok(false)
26
+
} else {
27
+
Ok(true)
28
+
}
29
+
}
30
+
_ => bail!("Cannot cast to bool."),
31
+
}
32
+
}
33
+
34
+
pub fn as_int(&self) -> Result<i32> {
35
+
match self {
36
+
ParameterType::Boolean(val) => {
37
+
if *val {
38
+
Ok(1)
39
+
} else {
40
+
Ok(0)
41
+
}
42
+
}
43
+
ParameterType::Int(val) => Ok(val.clone()),
44
+
ParameterType::Float(val) => Ok(val.round().clone() as i32),
45
+
ParameterType::String(val) => Ok(val.clone().parse()?),
46
+
_ => bail!("Cannot cast to int."),
47
+
}
48
+
}
49
+
50
+
pub fn as_float(&self) -> Result<f32> {
51
+
match self {
52
+
ParameterType::Int(val) => Ok(val.clone() as f32),
53
+
ParameterType::Float(val) => Ok(val.clone()),
54
+
ParameterType::String(val) => Ok(val.clone().parse()?),
55
+
_ => bail!("Cannot cast to float."),
56
+
}
57
+
}
58
+
59
+
pub fn as_string(&self) -> Result<String> {
60
+
match self {
61
+
ParameterType::Boolean(val) => Ok(val.clone().to_string()),
62
+
ParameterType::Int(val) => Ok(val.clone().to_string()),
63
+
ParameterType::Float(val) => Ok(val.clone().to_string()),
64
+
ParameterType::String(val) => Ok(val.clone()),
65
+
_ => bail!("Cannot cast to string."),
66
+
}
67
+
}
68
+
}
+70
-63
src-tauri/src/utils/config.rs
+70
-63
src-tauri/src/utils/config.rs
···
1
-
use std::{ collections::HashMap, fs::File, io::{ Read, Write }, path::PathBuf, sync::Mutex };
2
-
3
-
use flate2::{ read::GzDecoder, write::GzEncoder, Compression };
4
-
use serde_json::Value;
5
-
6
-
pub struct Config{
7
-
store: Mutex<HashMap<String, Value>>,
8
-
path: PathBuf
9
-
}
10
-
11
-
impl Config{
12
-
pub fn new( path: PathBuf ) -> Self{
13
-
let json_string = if path.exists(){
14
-
let mut decoder = GzDecoder::new(File::open(&path).unwrap());
15
-
let mut string = String::new();
16
-
17
-
decoder.read_to_string(&mut string).unwrap();
18
-
string
19
-
} else{
20
-
"{}".into()
21
-
};
22
-
23
-
let json: Value = serde_json::from_str(&json_string).unwrap();
24
-
25
-
let mut hashmap = HashMap::new();
26
-
27
-
let obj = json.as_object().unwrap();
28
-
for ( key, val ) in obj{
29
-
hashmap.insert(key.clone(), val.clone());
30
-
}
31
-
32
-
Config {
33
-
store: Mutex::new(hashmap),
34
-
path: path
35
-
}
36
-
}
37
-
38
-
pub fn set( &self, key: &str, value: Value ){
39
-
self.store.lock().unwrap().insert(key.to_owned(), value);
40
-
}
41
-
42
-
pub fn get( &self, key: &str ) -> Option<Value>{
43
-
let store = self.store.lock().unwrap();
44
-
let val = store.get(&key.to_owned());
45
-
46
-
if val.is_none(){
47
-
None
48
-
} else{
49
-
Some(val.unwrap().clone())
50
-
}
51
-
}
52
-
53
-
pub fn save( &self ){
54
-
let dat = serde_json::to_string(&self.store.lock().unwrap().clone()).unwrap();
55
-
dbg!(&dat);
56
-
57
-
let file = File::create(&self.path).unwrap();
58
-
let mut encoder = GzEncoder::new(file, Compression::default());
59
-
60
-
encoder.write_all(dat.as_bytes()).unwrap();
61
-
encoder.finish().unwrap();
62
-
}
63
-
}
1
+
use std::{
2
+
collections::HashMap,
3
+
fs::File,
4
+
io::{Read, Write},
5
+
path::PathBuf,
6
+
sync::{Mutex, MutexGuard},
7
+
};
8
+
9
+
use chrono::Utc;
10
+
use flate2::{read::GzDecoder, write::GzEncoder, Compression};
11
+
use serde::{Deserialize, Serialize};
12
+
13
+
use crate::structs::nodes::Node;
14
+
15
+
#[derive(Clone, Serialize, Deserialize, Debug)]
16
+
pub struct ConfigValues {
17
+
#[serde(default)]
18
+
pub loaded_tabs: HashMap<String, (Vec<Node>, String, Option<String>, bool)>,
19
+
20
+
#[serde(default)]
21
+
pub hide_editor_on_start: bool,
22
+
}
23
+
24
+
pub struct Config {
25
+
pub store: Mutex<ConfigValues>,
26
+
path: PathBuf,
27
+
}
28
+
29
+
impl Config {
30
+
pub fn new(path: PathBuf) -> Self {
31
+
let json_string = if path.exists() {
32
+
let mut decoder = GzDecoder::new(File::open(&path).unwrap());
33
+
let mut string = String::new();
34
+
35
+
decoder.read_to_string(&mut string).unwrap();
36
+
string
37
+
} else {
38
+
"{}".into()
39
+
};
40
+
41
+
let json: ConfigValues = serde_json::from_str(&json_string).unwrap();
42
+
43
+
Config {
44
+
store: Mutex::new(json),
45
+
path: path,
46
+
}
47
+
}
48
+
49
+
pub fn save(&self) {
50
+
let mut dat = self.store.lock().unwrap();
51
+
52
+
let dat = serde_json::to_string(&*dat).unwrap();
53
+
54
+
let file = File::create(&self.path).unwrap();
55
+
let mut encoder = GzEncoder::new(file, Compression::default());
56
+
57
+
encoder.write_all(dat.as_bytes()).unwrap();
58
+
encoder.finish().unwrap();
59
+
}
60
+
61
+
pub fn save_prelocked(&self, mut dat: MutexGuard<'_, ConfigValues>) {
62
+
let dat = serde_json::to_string(&*dat).unwrap();
63
+
64
+
let file = File::create(&self.path).unwrap();
65
+
let mut encoder = GzEncoder::new(file, Compression::default());
66
+
67
+
encoder.write_all(dat.as_bytes()).unwrap();
68
+
encoder.finish().unwrap();
69
+
}
70
+
}
+3
-1
src-tauri/src/utils/mod.rs
+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
+
}