+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>
+1
public/assets/icons/pen-to-square-regular-full.svg
+1
public/assets/icons/pen-to-square-regular-full.svg
···
1
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path fill="#cfcfcf" d="M505 122.9L517.1 135C526.5 144.4 526.5 159.6 517.1 168.9L488 198.1L441.9 152L471 122.9C480.4 113.5 495.6 113.5 504.9 122.9zM273.8 320.2L408 185.9L454.1 232L319.8 366.2C316.9 369.1 313.3 371.2 309.4 372.3L250.9 389L267.6 330.5C268.7 326.6 270.8 323 273.7 320.1zM437.1 89L239.8 286.2C231.1 294.9 224.8 305.6 221.5 317.3L192.9 417.3C190.5 425.7 192.8 434.7 199 440.9C205.2 447.1 214.2 449.4 222.6 447L322.6 418.4C334.4 415 345.1 408.7 353.7 400.1L551 202.9C579.1 174.8 579.1 129.2 551 101.1L538.9 89C510.8 60.9 465.2 60.9 437.1 89zM152 128C103.4 128 64 167.4 64 216L64 488C64 536.6 103.4 576 152 576L424 576C472.6 576 512 536.6 512 488L512 376C512 362.7 501.3 352 488 352C474.7 352 464 362.7 464 376L464 488C464 510.1 446.1 528 424 528L152 528C129.9 528 112 510.1 112 488L112 216C112 193.9 129.9 176 152 176L264 176C277.3 176 288 165.3 288 152C288 138.7 277.3 128 264 128L152 128z"/></svg>
+1
public/assets/icons/plus-solid-full.svg
+1
public/assets/icons/plus-solid-full.svg
···
1
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path fill="#cfcfcf" d="M352 128C352 110.3 337.7 96 320 96C302.3 96 288 110.3 288 128L288 288L128 288C110.3 288 96 302.3 96 320C96 337.7 110.3 352 128 352L288 352L288 512C288 529.7 302.3 544 320 544C337.7 544 352 529.7 352 512L352 352L512 352C529.7 352 544 337.7 544 320C544 302.3 529.7 288 512 288L352 288L352 128z"/></svg>
+1
public/assets/icons/xmark-solid-full.svg
+1
public/assets/icons/xmark-solid-full.svg
···
1
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path fill="#fff" d="M183.1 137.4C170.6 124.9 150.3 124.9 137.8 137.4C125.3 149.9 125.3 170.2 137.8 182.7L275.2 320L137.9 457.4C125.4 469.9 125.4 490.2 137.9 502.7C150.4 515.2 170.7 515.2 183.2 502.7L320.5 365.3L457.9 502.6C470.4 515.1 490.7 515.1 503.2 502.6C515.7 490.1 515.7 469.8 503.2 457.3L365.8 320L503.1 182.6C515.6 170.1 515.6 149.8 503.1 137.3C490.6 124.8 470.3 124.8 457.8 137.3L320.5 274.7L183.1 137.4z"/></svg>
+10
-92
src/App.css
+10
-92
src/App.css
···
1
-
@font-face {
1
+
@font-face{
2
2
font-family: Rubik;
3
-
src: url('/assets/fonts/Rubik-VariableFont_wght.ttf');
4
-
}
5
-
6
-
* {
7
-
box-sizing: border-box;
8
-
-webkit-user-select: none;
3
+
src: url("/assets/fonts/Rubik-VariableFont_wght.ttf");
9
4
}
10
5
11
6
body{
12
-
background: linear-gradient(-45deg,
13
-
#12141a 0%, #12141a 10%,
14
-
#22262e 10%, #22262e 20%,
15
-
#272e44 20%, #272e44 22%,
16
-
#1f2129 22%
17
-
);
7
+
background: #1f2129;
18
8
background-attachment: fixed;
19
9
color: #fff;
20
10
font-family: Rubik, 'Courier New';
21
11
margin: 0;
22
12
}
23
13
24
-
h1, h2, h3, h4, h5, h6, p{
25
-
margin: 0;
26
-
font-weight: 500;
14
+
* {
15
+
box-sizing: border-box;
27
16
}
28
17
29
-
span{
30
-
-webkit-user-select: auto;
18
+
p, h1, h2, h3, h4, h5, h6{
19
+
margin: 0;
31
20
}
32
21
33
-
div[app-carousel]{
22
+
canvas{
34
23
position: fixed;
35
-
top: 10px;
36
-
left: 220px;
37
-
width: calc(100vw - 230px);
38
-
height: calc(100vh - 20px);
39
-
overflow: hidden;
40
-
}
41
-
42
-
div[app-page]{
43
-
width: calc(100vw - 230px);
44
-
height: calc(100vh - 20px);
45
-
overflow-y: auto;
46
-
overflow-x: hidden;
47
-
}
48
-
49
-
div[app-button]{
50
-
display: inline-block;
51
-
background: #2a3452;
52
-
padding: 10px 25px;
53
-
cursor: pointer;
54
-
user-select: none;
55
-
border-radius: 5px;
56
-
transition: 0.25s;
57
-
min-width: 100px;
58
-
text-align: center;
59
-
}
60
-
61
-
div[app-button]:hover{
62
-
background: #151a29;
63
-
}
64
-
65
-
div[app-button-minimal]{
66
-
display: inline-block;
67
-
background: #424242;
68
-
padding: 10px 25px;
69
-
cursor: pointer;
70
-
user-select: none;
71
-
border-radius: 5px;
72
-
transition: 0.25s;
73
-
min-width: 100px;
74
-
text-align: center;
75
-
opacity: 0.5;
76
-
}
77
-
78
-
div[app-button-minimal]:hover{
79
-
background: #525252;
80
-
}
81
-
82
-
div[app-col]{
83
-
display: flex;
84
-
}
85
-
86
-
div[app-col-50]{
87
-
display: flex;
88
-
}
89
-
90
-
div[app-col-50] > div{
91
-
width: 50%;
92
-
}
93
-
94
-
div[app-icon]{
95
-
display: flex;
96
-
justify-content: center;
97
-
align-items: center;
98
-
width: 30px;
99
-
height: 30px;
100
-
user-select: none;
101
-
-webkit-user-select: none;
102
-
cursor: pointer;
103
-
transition: 0.1s;
104
-
}
105
-
106
-
div[app-icon]:hover{
107
-
opacity: 0.75;
24
+
top: 0;
25
+
left: 0;
108
26
}
+457
-19
src/App.tsx
+457
-19
src/App.tsx
···
1
+
import { createEffect, createSignal, onCleanup, onMount } from "solid-js";
1
2
import "./App.css";
3
+
import { renderBackgroundGrid, renderContextMenu, renderNodes, renderNullTab, renderTempDrawing } from "./renderer";
4
+
import { lerp } from "./utils/lerp";
5
+
import { Node, NodeIO, NodeIOCanCast, NodeIOResolveAnyTypes } from "./structs/node";
6
+
import { isPointInRect, isPointInRectApplyOffset, screenToWorldSpace } from "./utils/interections";
7
+
import { ControlBar } from "./components/ControlBar";
8
+
import { CanvasContextMenu } from "./ContextMenu/Canvas";
9
+
import { NodeContextMenu } from "./ContextMenu/Node";
10
+
import { ContextMenu } from "./structs/ContextMenu";
11
+
import { NodeManager } from "./Mangers/NodeManager";
12
+
import { TabMenu } from "./components/TabMenu";
13
+
import { ConfirmationPopup } from "./components/ConfirmationPopup";
2
14
3
-
import { createEffect, createSignal } from "solid-js";
15
+
import * as keybinds from './keybinds';
16
+
import { listen } from "@tauri-apps/api/event";
4
17
5
-
import { Sidebar } from "./Components/Sidebar";
6
-
import { Actions } from "./Components/Actions";
7
-
import { Relays } from "./Components/Relays";
8
-
import { animate } from "animejs";
9
-
import { Settings } from "./Components/Settings";
10
-
import { Debug } from "./Components/Debug";
18
+
// TODO: Only allow one node to input on non-flow inputs
11
19
12
20
let App = () => {
13
-
let [ page, setPage ] = createSignal(0);
14
-
let carousel!: HTMLDivElement;
21
+
let [ selectedNodes, setSelectedNodes ] = createSignal<Node[]>([], { equals: false });
22
+
let [ mousePos, setMousePos ] = createSignal<[ number, number ]>([ 0, 0 ]);
23
+
24
+
let canvas!: HTMLCanvasElement;
25
+
let ctx: CanvasRenderingContext2D;
26
+
27
+
let stopRender = false;
28
+
29
+
let scale = 0.25;
30
+
let targetScale = 1;
31
+
32
+
let offset = [ 0, 0 ];
33
+
let offsetTarget = [ 0, 0 ];
34
+
35
+
let movingNode: Node | null = null;
36
+
37
+
let isDrawing = false;
38
+
let drawingFrom: NodeIO | null = null;
39
+
let drawingTo: [ number, number ] = [ 0, 0 ];
40
+
41
+
let lockMovement = false;
42
+
43
+
{
44
+
let loadedScale = localStorage.getItem('scale');
45
+
if(loadedScale)targetScale = parseFloat(loadedScale);
46
+
47
+
let loadedOffsetX = localStorage.getItem('offsetX');
48
+
if(loadedOffsetX)offsetTarget[0] = parseFloat(loadedOffsetX);
49
+
50
+
let loadedOffsetY = localStorage.getItem('offsetY');
51
+
if(loadedOffsetY)offsetTarget[1] = parseFloat(loadedOffsetY);
52
+
};
53
+
54
+
let screenMoved = false;
55
+
56
+
let contextMenu: ContextMenu = {
57
+
items: [],
58
+
position: [ 0, 0 ],
59
+
size: [ 0, 0 ],
60
+
visible: false
61
+
}
15
62
16
63
createEffect(() => {
17
-
let pagenum = page();
18
-
animate(carousel.children, { translateY: '-' + ( 100 * pagenum ) + '%', ease: 'outElastic(.1, .7)', duration: 500 });
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;
19
71
})
20
72
73
+
onMount(async () => {
74
+
NodeManager.Instance.HookTabChange(() => setSelectedNodes([]));
75
+
76
+
ctx = canvas.getContext('2d')!;
77
+
78
+
canvas.width = window.innerWidth;
79
+
canvas.height = window.innerHeight;
80
+
ctx.translate(canvas.width / 2, canvas.height / 2);
81
+
82
+
window.onresize = () => {
83
+
canvas.width = window.innerWidth;
84
+
canvas.height = window.innerHeight;
85
+
86
+
ctx.translate(canvas.width / 2, canvas.height / 2);
87
+
}
88
+
89
+
canvas.onwheel = ( e ) => {
90
+
targetScale += e.deltaY * -(Math.sqrt(targetScale) * 0.001);
91
+
92
+
if(targetScale < 0.25)targetScale = 0.25
93
+
else if(targetScale > 5)targetScale = 5;
94
+
95
+
screenMoved = true;
96
+
}
97
+
98
+
canvas.oncontextmenu = ( e ) => {
99
+
e.preventDefault();
100
+
101
+
let clickedNode: Node | null = null
102
+
let nodes = NodeManager.Instance.GetNodes();
103
+
104
+
if(nodes){
105
+
nodes.map(node => {
106
+
if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale },
107
+
e.clientX, e.clientY,
108
+
node.x, node.y, node.w, node.h
109
+
)){
110
+
clickedNode = node;
111
+
return;
112
+
}
113
+
})
114
+
}
115
+
116
+
if(clickedNode){
117
+
contextMenu.items = NodeContextMenu(clickedNode, selectedNodes, setSelectedNodes);
118
+
} else{
119
+
contextMenu.items = CanvasContextMenu;
120
+
}
121
+
122
+
contextMenu.position = [ e.clientX - 10 - canvas.width / 2, e.clientY - 10 - canvas.height / 2 ];
123
+
contextMenu.visible = true;
124
+
}
125
+
126
+
let isShiftClick = false;
127
+
canvas.onmousedown = ( e ) => {
128
+
isShiftClick = e.shiftKey;
129
+
130
+
if(
131
+
e.clientY < 60 ||
132
+
e.clientX < 220 ||
133
+
lockMovement
134
+
)return;
135
+
136
+
if(e.button !== 0){
137
+
contextMenu.visible = false;
138
+
return;
139
+
}
140
+
141
+
if(contextMenu.visible){
142
+
let submenus: ContextMenu[] = [];
143
+
contextMenu.items.map(x => x.menu ? submenus.push(x.menu): null);
144
+
145
+
submenus.map(x => {
146
+
if(!x.visible)return;
147
+
if(isPointInRect(canvas, e.clientX, e.clientY,
148
+
x.position[0], x.position[1],
149
+
x.size[0], x.size[1]
150
+
)){
151
+
let item = x.items.filter(x => x.hovered)[0];
152
+
if(item && item.clicked)item.clicked(e, canvas, { x: offset[0], y: offset[1], scale });
153
+
}
154
+
});
155
+
156
+
if(isPointInRect(canvas, e.clientX, e.clientY,
157
+
contextMenu.position[0], contextMenu.position[1],
158
+
contextMenu.size[0], contextMenu.size[1]
159
+
)){
160
+
let item = contextMenu.items.filter(x => x.hovered)[0];
161
+
if(item && item.clicked)item.clicked(e, canvas, { x: offset[0], y: offset[1], scale });
162
+
}
163
+
}
164
+
165
+
contextMenu.visible = false;
166
+
167
+
let clickedNode: any = null;
168
+
isDrawing = false;
169
+
170
+
let clickedInput: any = null;
171
+
let nodes = NodeManager.Instance.GetNodes();
172
+
173
+
if(nodes){
174
+
nodes.map(node => {
175
+
if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale },
176
+
e.clientX, e.clientY,
177
+
node.x - 20, node.y, node.w + 40, node.h
178
+
)){
179
+
node.outputs.map(( output, i ) => {
180
+
if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale },
181
+
e.clientX, e.clientY,
182
+
node.x + (node.w - 10),
183
+
node.y + 50 + (30 * i),
184
+
20, 20
185
+
)){
186
+
output.index = i;
187
+
188
+
drawingTo = [
189
+
node.x + (node.w - 10),
190
+
node.y + 50 + (30 * i)
191
+
];
192
+
drawingFrom = output;
193
+
194
+
isDrawing = true;
195
+
return;
196
+
}
197
+
})
198
+
199
+
node.inputs.map(( input, i ) => {
200
+
if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale },
201
+
e.clientX, e.clientY,
202
+
node.x - 10,
203
+
node.y + 50 + (30 * i),
204
+
20, 20
205
+
)){
206
+
clickedInput = input;
207
+
}
208
+
})
209
+
210
+
clickedNode = node;
211
+
return;
212
+
}
213
+
})
214
+
}
215
+
216
+
if(clickedInput){
217
+
let partner = clickedInput.connections.pop();
218
+
if(!partner)return;
219
+
220
+
partner.connections = partner.connections.filter(( x: any ) => x !== clickedInput);
221
+
222
+
isDrawing = true;
223
+
isMouseDown = true;
224
+
225
+
drawingFrom = partner;
226
+
drawingTo = screenToWorldSpace(canvas, { x: offset[0], y: offset[1], scale }, e.clientX - 10 * scale, e.clientY - 10 * scale) as [ number, number ];;
227
+
228
+
return;
229
+
}
230
+
231
+
movingNode = clickedNode;
232
+
233
+
isMouseDown = true;
234
+
mouseStartPos = [ e.clientX, e.clientY ];
235
+
mouseMovePos = [ e.clientX, e.clientY ];
236
+
}
237
+
238
+
canvas.onmousemove = ( e ) => {
239
+
setMousePos([ e.clientX, e.clientY ]);
240
+
241
+
if(e.shiftKey && isMouseDown){
242
+
let nodes = NodeManager.Instance.GetNodes();
243
+
let hoveredNode: Node | null = null;
244
+
245
+
if(nodes){
246
+
nodes.map(node => {
247
+
if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale },
248
+
e.clientX, e.clientY,
249
+
node.x - 20, node.y, node.w + 40, node.h
250
+
)){
251
+
hoveredNode = node;
252
+
return;
253
+
}
254
+
})
255
+
}
256
+
257
+
if(hoveredNode !== null){
258
+
let snodes = selectedNodes();
259
+
if(!snodes.find(x => x.id === hoveredNode!.id)){
260
+
snodes.push(hoveredNode);
261
+
262
+
// @ts-ignore
263
+
hoveredNode.x = Math.round(hoveredNode.x / 10) * 10;
264
+
// @ts-ignore
265
+
hoveredNode.y = Math.round(hoveredNode.y / 10) * 10;
266
+
267
+
setSelectedNodes(snodes);
268
+
}
269
+
}
270
+
271
+
return;
272
+
} else if(isShiftClick)return;
273
+
274
+
if(isMouseDown){
275
+
if(isDrawing){
276
+
drawingTo = screenToWorldSpace(canvas, { x: offset[0], y: offset[1], scale }, e.clientX - 10 * scale, e.clientY - 10 * scale) as [ number, number ];
277
+
} else if(movingNode){
278
+
let nodes = selectedNodes();
279
+
280
+
for(let node of nodes){
281
+
node.x = node.x - (mouseMovePos[0] - e.clientX) / scale;
282
+
node.y = node.y - (mouseMovePos[1] - e.clientY) / scale;
283
+
}
284
+
285
+
mouseMovePos = [ e.clientX, e.clientY ];
286
+
NodeManager.Instance.UpdateConfig();
287
+
} else{
288
+
offsetTarget = [ offsetTarget[0] - (mouseMovePos[0] - e.clientX) / scale, offsetTarget[1] - (mouseMovePos[1] - e.clientY) / scale ];
289
+
mouseMovePos = [ e.clientX, e.clientY ];
290
+
291
+
screenMoved = true;
292
+
}
293
+
}
294
+
295
+
// TODO: Fix this shit lmao please
296
+
if(contextMenu.visible){
297
+
let submenus: ContextMenu[] = [];
298
+
contextMenu.items.map(x => x.menu ? submenus.push(x.menu): null);
299
+
300
+
submenus.map(x => {
301
+
if(!x.visible)return;
302
+
if(isPointInRect(canvas, e.clientX, e.clientY,
303
+
x.position[0], x.position[1],
304
+
x.size[0], x.size[1]
305
+
)){
306
+
x.items.map((y, i) => {
307
+
y.hovered = isPointInRect(canvas, e.clientX, e.clientY,
308
+
x.position[0], x.position[1] + 10 + 25 * i,
309
+
x.size[0], 25
310
+
)
311
+
});
312
+
}
313
+
});
314
+
315
+
if(isPointInRect(canvas, e.clientX, e.clientY,
316
+
contextMenu.position[0], contextMenu.position[1],
317
+
contextMenu.size[0], contextMenu.size[1]
318
+
)){
319
+
contextMenu.items.map((x, i) => {
320
+
x.hovered = isPointInRect(canvas, e.clientX, e.clientY,
321
+
contextMenu.position[0], contextMenu.position[1] + 10 + 25 * i,
322
+
contextMenu.size[0], 25
323
+
)
324
+
325
+
if(x.menu)x.menu.visible = x.hovered;
326
+
});
327
+
}
328
+
}
329
+
}
330
+
331
+
canvas.onmouseup = ( e ) => {
332
+
let nodes = NodeManager.Instance.GetNodes();
333
+
let clickedNode;
334
+
335
+
if(nodes){
336
+
nodes.map(node => {
337
+
if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale },
338
+
e.clientX, e.clientY,
339
+
node.x - 20, node.y, node.w + 40, node.h
340
+
)){
341
+
clickedNode = node;
342
+
343
+
node.inputs.map(( input, i ) => {
344
+
if(isPointInRectApplyOffset(canvas, { x: offset[0], y: offset[1], scale },
345
+
e.clientX, e.clientY,
346
+
node.x - 10,
347
+
node.y + 50 + (30 * i),
348
+
20, 20
349
+
)){
350
+
if(isDrawing){
351
+
let fromType = NodeIOResolveAnyTypes(drawingFrom!);
352
+
let toType = NodeIOResolveAnyTypes(input);
353
+
354
+
if(
355
+
drawingFrom!.connections.indexOf(input) === -1 &&
356
+
(
357
+
toType === null ||
358
+
NodeIOCanCast(fromType, toType)
359
+
)
360
+
){
361
+
drawingFrom!.connections.push(input);
362
+
input.connections.push(drawingFrom!);
363
+
364
+
NodeManager.Instance.UpdateConfig();
365
+
}
366
+
}
367
+
}
368
+
})
369
+
}
370
+
})
371
+
}
372
+
373
+
let diffX = mouseStartPos[0] - e.clientX;
374
+
let diffY = mouseStartPos[1] - e.clientY;
375
+
376
+
let dist = Math.sqrt(diffX * diffX + diffY * diffY);
377
+
378
+
if(dist < 10){
379
+
if(clickedNode){
380
+
if(e.shiftKey){
381
+
let snodes = selectedNodes();
382
+
if(snodes.indexOf(clickedNode) === -1)snodes.push(clickedNode);
383
+
384
+
// @ts-ignore
385
+
clickedNode.x = Math.round(clickedNode.x / 10) * 10;
386
+
// @ts-ignore
387
+
clickedNode.y = Math.round(clickedNode.y / 10) * 10;
388
+
389
+
setSelectedNodes(snodes);
390
+
} else{
391
+
// @ts-ignore
392
+
clickedNode.x = Math.round(clickedNode.x / 10) * 10;
393
+
// @ts-ignore
394
+
clickedNode.y = Math.round(clickedNode.y / 10) * 10;
395
+
396
+
setSelectedNodes([ clickedNode ]);
397
+
}
398
+
} else {
399
+
setSelectedNodes([]);
400
+
}
401
+
}
402
+
403
+
isDrawing = false;
404
+
isMouseDown = false;
405
+
}
406
+
407
+
keybinds.load(canvas, mousePos, selectedNodes, setSelectedNodes);
408
+
requestAnimationFrame(update);
409
+
410
+
let unlisten_0 = await listen('hide-window', () => {
411
+
stopRender = true;
412
+
})
413
+
414
+
let unlisten_1 = await listen('show-window', () => {
415
+
if(stopRender)window.location.reload();
416
+
})
417
+
418
+
onCleanup(() => {
419
+
stopRender = true;
420
+
window.clearInterval(interval);
421
+
422
+
unlisten_0();
423
+
unlisten_1();
424
+
});
425
+
});
426
+
427
+
let update = () => {
428
+
if(stopRender)return;
429
+
scale = lerp(scale, targetScale, 0.25);
430
+
431
+
offset[0] = lerp(offset[0], offsetTarget[0], 0.5);
432
+
offset[1] = lerp(offset[1], offsetTarget[1], 0.5);
433
+
434
+
ctx.clearRect(canvas.width / -2, canvas.height / -2, canvas.width, canvas.height);
435
+
436
+
let nodes = NodeManager.Instance.GetNodes();
437
+
438
+
renderBackgroundGrid(canvas, ctx, { x: offset[0], y: offset[1], scale });
439
+
440
+
if(nodes)
441
+
renderNodes(canvas, ctx, nodes, { x: offset[0], y: offset[1], scale });
442
+
else
443
+
renderNullTab(canvas, ctx);
444
+
445
+
if(isDrawing)renderTempDrawing(canvas, ctx, drawingTo, drawingFrom!, { x: offset[0], y: offset[1], scale });
446
+
renderContextMenu(ctx, contextMenu);
447
+
448
+
requestAnimationFrame(update);
449
+
}
450
+
451
+
let isMouseDown = false;
452
+
let mouseStartPos = [ 0, 0 ];
453
+
let mouseMovePos = [ 0, 0 ];
454
+
455
+
let interval = setInterval(() => {
456
+
if(screenMoved){
457
+
localStorage.setItem('scale', targetScale.toFixed(4));
458
+
localStorage.setItem('offsetX', offset[0].toFixed(4));
459
+
localStorage.setItem('offsetY', offset[1].toFixed(4));
460
+
}
461
+
}, 1000);
462
+
21
463
return (
22
464
<>
23
-
<Sidebar setPage={setPage} />
24
-
25
-
<div app-carousel ref={carousel}>
26
-
<Actions />
27
-
<Relays />
28
-
<Debug page={page} />
29
-
<Settings />
30
-
</div>
465
+
<ConfirmationPopup />
466
+
<TabMenu />
467
+
<ControlBar node={selectedNodes} lockMovement={( lock ) => lockMovement = lock} />
468
+
<canvas ref={canvas}/>
31
469
</>
32
470
);
33
471
}
-13
src/Components/Actions.css
-13
src/Components/Actions.css
-58
src/Components/Actions.tsx
-58
src/Components/Actions.tsx
···
1
-
import { For } from 'solid-js';
2
-
import './Actions.css';
3
-
import { TriggerEl } from './TriggerEl';
4
-
import { createStore } from 'solid-js/store';
5
-
import { invoke } from '@tauri-apps/api/core';
6
-
7
-
export interface Trigger{
8
-
id: string,
9
-
address: string,
10
-
actions: any[]
11
-
}
12
-
13
-
export let Actions = () => {
14
-
let [ triggers, setTriggers ] = createStore<Trigger[]>([]);
15
-
16
-
invoke<Trigger[]>('list_triggers').then(triggers => { setTriggers(triggers) })
17
-
18
-
return (
19
-
<div app-page>
20
-
<div app-col>
21
-
<div style={{ width: '100%' }}><h1>Actions</h1></div>
22
-
<div app-button style={{ width: 'fit-content', "margin-left": '50%' }} onClick={() => {
23
-
let id = Math.random().toString().replace('0.', '');
24
-
25
-
invoke('new_trigger', { id });
26
-
setTriggers(( trig ) => [
27
-
...trig,
28
-
{ address: '', actions: [], id }
29
-
]);
30
-
}}>+</div>
31
-
</div>
32
-
33
-
<For each={triggers}>
34
-
{ ( item, index ) => <TriggerEl
35
-
trigger={item}
36
-
onDelete={() => {
37
-
invoke('rm_trigger', { indx: index() });
38
-
setTriggers(( trig ) => trig.filter(x => x.id !== item.id));
39
-
}}
40
-
onAddAction={( action ) => {
41
-
invoke('add_trigger_action', { indx: index(), action });
42
-
setTriggers(index(), "actions", ( actions ) => [ ...actions, action ]);
43
-
}}
44
-
onDeleteAction={( id, indx ) => {
45
-
invoke('rm_trigger_action', { indx: index(), actionIndx: indx });
46
-
setTriggers(index(), "actions", ( actions ) => actions.filter(x => x.id !== id))
47
-
}}
48
-
onSetActionType={( i, type ) => {
49
-
invoke('set_trigger_action_type', { indx: index(), actionIndx: i, actionType: type });
50
-
setTriggers(index(), "actions", i, "actionType", type)
51
-
}}
52
-
onSetOSCAddress={( address ) => {
53
-
invoke('set_trigger_address', { indx: index(), address });
54
-
}} /> }
55
-
</For>
56
-
</div>
57
-
)
58
-
}
-8
src/Components/Debug.css
-8
src/Components/Debug.css
-89
src/Components/Debug.tsx
-89
src/Components/Debug.tsx
···
1
-
import './Debug.css';
2
-
3
-
import { createEffect, onCleanup, onMount } from 'solid-js';
4
-
import { listen, UnlistenFn } from '@tauri-apps/api/event';
5
-
import { OSCMessage, OSCValue } from '../Structs/OSCMessage';
6
-
7
-
let formatValuesForDebug = ( values: OSCValue[] ): string => {
8
-
let text = '';
9
-
10
-
for(let value of values){
11
-
if(value.Boolean !== undefined)
12
-
text += ' Boolean: ' + value.Boolean;
13
-
else if(value.Float !== undefined)
14
-
text += ' Float: ' + value.Float.toFixed(6);
15
-
else if(value.Int !== undefined)
16
-
text += ' Int: ' + value.Int;
17
-
else if(value.String !== undefined)
18
-
text += ' String: ' + value.String;
19
-
}
20
-
21
-
return text.trimStart();
22
-
}
23
-
24
-
export interface DebugProps{
25
-
page: () => number
26
-
}
27
-
28
-
export let Debug = ( props: DebugProps ) => {
29
-
let debugContainer!: HTMLDivElement;
30
-
31
-
let debugEls: any = {};
32
-
33
-
let isListening = false;
34
-
let unlisten: UnlistenFn;
35
-
36
-
let stopListening = () => {
37
-
if(!isListening)return;
38
-
isListening = false;
39
-
40
-
unlisten();
41
-
}
42
-
43
-
let startListening = async () => {
44
-
if(isListening)return;
45
-
isListening = true;
46
-
47
-
unlisten = await listen<OSCMessage>('osc-message', ( ev ) => {
48
-
let el = debugEls[ev.payload.address];
49
-
if(el){
50
-
el.style.boxShadow = '#00ccff 0 0 10px';
51
-
debugContainer.insertBefore(el, debugContainer.firstChild);
52
-
53
-
el.innerHTML = `<div><span>${ ev.payload.address }</span></div><div>${ formatValuesForDebug(ev.payload.values) }</div>`;
54
-
setTimeout(() => { el.style.boxShadow = '#00ccff 0 0 0px'; })
55
-
} else{
56
-
el = <div app-debug-el app-col-50><div><span>{ ev.payload.address }</span></div><div>{ formatValuesForDebug(ev.payload.values) }</div></div> as Node;
57
-
58
-
el.style.boxShadow = '#00ccff 0 0 10px';
59
-
debugContainer.insertBefore(el, debugContainer.firstChild);
60
-
61
-
setTimeout(() => { el.style.boxShadow = '#00ccff 0 0 0px'; })
62
-
debugEls[ev.payload.address] = el;
63
-
}
64
-
})
65
-
}
66
-
67
-
onMount(() => {
68
-
createEffect(() => {
69
-
if(props.page() === 2)
70
-
startListening();
71
-
else
72
-
stopListening();
73
-
});
74
-
});
75
-
76
-
onCleanup(() => {
77
-
stopListening();
78
-
});
79
-
80
-
return (
81
-
<div app-page>
82
-
<h1>Debug</h1>
83
-
84
-
<div ref={debugContainer}>
85
-
86
-
</div>
87
-
</div>
88
-
)
89
-
}
src/Components/Relays.css
src/Components/Relays.css
This is a binary file and will not be displayed.
-9
src/Components/Relays.tsx
-9
src/Components/Relays.tsx
src/Components/Settings.css
src/Components/Settings.css
This is a binary file and will not be displayed.
-9
src/Components/Settings.tsx
-9
src/Components/Settings.tsx
-32
src/Components/Sidebar.css
-32
src/Components/Sidebar.css
···
1
-
div[app-sidebar]{
2
-
position: fixed;
3
-
top: 10px;
4
-
left: 10px;
5
-
6
-
height: calc(100vh - 20px);
7
-
width: 200px;
8
-
padding: 0px;
9
-
10
-
background: #272e44;
11
-
border-radius: 5px;
12
-
}
13
-
14
-
div[app-sidebar-tab]{
15
-
padding: 10px;
16
-
cursor: pointer;
17
-
user-select: none;
18
-
-webkit-user-select: none;
19
-
transition: 0.1s;
20
-
margin: 10px;
21
-
border-radius: 5px;
22
-
}
23
-
24
-
div[app-sidebar-tab]:hover{
25
-
background: #5b6ca5;
26
-
}
27
-
28
-
div[app-sidebar-tab-dropped]{
29
-
position: absolute;
30
-
width: calc(100% - 20px);
31
-
bottom: 0px;
32
-
}
-19
src/Components/Sidebar.tsx
-19
src/Components/Sidebar.tsx
···
1
-
import './Sidebar.css'
2
-
3
-
export interface SidebarProps{
4
-
setPage: ( page: number ) => number
5
-
}
6
-
7
-
export let Sidebar = ( props: SidebarProps ) => {
8
-
return (
9
-
<>
10
-
<div app-sidebar>
11
-
<div app-sidebar-tab onClick={() => props.setPage(0)}>Actions</div>
12
-
<div app-sidebar-tab onClick={() => props.setPage(1)}>Relays</div>
13
-
<div app-sidebar-tab onClick={() => props.setPage(2)}>Debug</div>
14
-
15
-
<div app-sidebar-tab app-sidebar-tab-dropped onClick={() => props.setPage(3)}>Settings</div>
16
-
</div>
17
-
</>
18
-
)
19
-
}
-38
src/Components/TextInput.css
-38
src/Components/TextInput.css
···
1
-
input[type="text"]{
2
-
outline: none;
3
-
background: none;
4
-
border: none;
5
-
border-bottom: 2px solid #525252;
6
-
font-size: 15px;
7
-
font-family: Rubik, 'Courier New';
8
-
color: #fff;
9
-
width: 400px;
10
-
}
11
-
12
-
div[input-dropdown]{
13
-
position: absolute;
14
-
width: fit-content;
15
-
16
-
margin-top: 5px;
17
-
padding: 10px;
18
-
float: left;
19
-
border-radius: 5px;
20
-
21
-
max-height: 300px;
22
-
overflow-y: auto;
23
-
24
-
background: #525252;
25
-
z-index: 50;
26
-
}
27
-
28
-
div[input-dropdown] > div{
29
-
transition: 0.25s;
30
-
}
31
-
32
-
div[input-dropdown] > div:hover{
33
-
color: #aaa;
34
-
}
35
-
36
-
.suggestion-selected{
37
-
color: #aaa;
38
-
}
-104
src/Components/TextInput.tsx
-104
src/Components/TextInput.tsx
···
1
-
import './TextInput.css';
2
-
3
-
import { createSignal, For, Show } from "solid-js"
4
-
5
-
export interface TextInputProps{
6
-
placeholder: string,
7
-
value?: string,
8
-
requestSuggestions?: ( text: string ) => Promise<string[]>,
9
-
change?: ( text: string ) => void
10
-
}
11
-
12
-
export let TextInput = ( props: TextInputProps ) => {
13
-
let [ suggestionsOpen, setSuggestionsOpen ] = createSignal(false);
14
-
let [ suggestions, setSuggestions ] = createSignal<string[]>([])
15
-
16
-
let input!: HTMLInputElement;
17
-
18
-
let suggestionsContainer!: HTMLDivElement;
19
-
let suggestionsIndex = 0;
20
-
21
-
let onInput = async () => {
22
-
let s = null;
23
-
24
-
if(props.requestSuggestions){
25
-
s = await props.requestSuggestions(input.value);
26
-
27
-
if(s != suggestions()){
28
-
setSuggestions(s);
29
-
30
-
let open = s !== null && s.length > 0 && input.value.length > 0;
31
-
32
-
setSuggestionsOpen(open);
33
-
if(open)changeSelection(() => { suggestionsIndex = 0; });
34
-
}
35
-
}
36
-
}
37
-
38
-
let onKeyDown = ( ev: KeyboardEvent ) => {
39
-
switch(ev.key){
40
-
case 'ArrowDown':
41
-
changeSelection(() => {
42
-
suggestionsIndex++;
43
-
if(suggestionsIndex >= suggestionsContainer.children.length)suggestionsIndex = suggestionsContainer.children.length - 1;
44
-
});
45
-
break;
46
-
case 'ArrowUp':
47
-
changeSelection(() => {
48
-
suggestionsIndex--;
49
-
if(suggestionsIndex < 0)suggestionsIndex = 0;
50
-
});
51
-
break;
52
-
case 'Enter':
53
-
let currentDiv = suggestionsContainer.children[suggestionsIndex];
54
-
if(currentDiv)input.value = currentDiv.innerHTML;
55
-
56
-
props.change ? props.change(input.value) : null
57
-
setSuggestionsOpen(false);
58
-
break;
59
-
}
60
-
}
61
-
62
-
let changeSelection = ( cb: () => void ) => {
63
-
for(let child of suggestionsContainer.children)
64
-
child.classList.remove('suggestion-selected');
65
-
66
-
cb();
67
-
68
-
let height = suggestionsIndex * 19;
69
-
suggestionsContainer.scrollTo(0, height - 150);
70
-
71
-
let currentDiv = suggestionsContainer.children[suggestionsIndex];
72
-
if(currentDiv)currentDiv.classList.add('suggestion-selected');
73
-
}
74
-
75
-
return (
76
-
<>
77
-
<div style={{ width: '100%' }}>
78
-
<input
79
-
style={{ width: '100%' }}
80
-
type="text"
81
-
placeholder={ props.placeholder }
82
-
value={ props.value || "" }
83
-
onChange={() => props.change ? props.change(input.value) : null}
84
-
onInput={onInput}
85
-
onKeyDown={onKeyDown}
86
-
onFocusOut={() => setSuggestionsOpen(false)}
87
-
ref={input} />
88
-
89
-
<Show when={suggestionsOpen()}>
90
-
<div input-dropdown ref={suggestionsContainer}>
91
-
<For each={suggestions()}>
92
-
{ item => <div onClick={( el ) => {
93
-
let thisEl = el.target;
94
-
95
-
input.value = thisEl.innerHTML;
96
-
setSuggestionsOpen(false);
97
-
}}>{ item }</div> }
98
-
</For>
99
-
</div>
100
-
</Show>
101
-
</div>
102
-
</>
103
-
)
104
-
}
-81
src/Components/TriggerEl.tsx
-81
src/Components/TriggerEl.tsx
···
1
-
import { For } from "solid-js"
2
-
import { Trigger } from "./Actions"
3
-
import { TextInput } from "./TextInput"
4
-
import { invoke } from "@tauri-apps/api/core"
5
-
import { ActionType } from "../Structs/ActionType"
6
-
7
-
export interface TriggerElProps{
8
-
trigger: Trigger,
9
-
10
-
onDelete: () => void,
11
-
12
-
onAddAction: ( value: any ) => void,
13
-
onDeleteAction: ( id: string, index: number ) => void,
14
-
15
-
onSetActionType: ( index: number, type: string | null ) => void,
16
-
17
-
onSetOSCAddress: ( address: string ) => void,
18
-
}
19
-
20
-
export let TriggerEl = ( { trigger, onDelete, onAddAction, onDeleteAction, onSetActionType, onSetOSCAddress }: TriggerElProps ) => {
21
-
let suggestOSCAddresses = async ( text: string ): Promise<string[]> => {
22
-
let addresses = await invoke<string[]>('get_addresses');
23
-
return addresses.filter(x => x.toLowerCase().includes(text.toLowerCase()));
24
-
}
25
-
26
-
let suggestActionNames = async ( text: string ): Promise<string[]> => {
27
-
let actions = await invoke<ActionType[]>('get_actions');
28
-
return actions.filter(x => x.name.toLowerCase().includes(text.toLowerCase())).map(x => x.name);
29
-
}
30
-
31
-
return (
32
-
<div app-trigger-el>
33
-
<div app-col>
34
-
OSC Address:
35
-
<div style={{ width: '400px', display: 'inline-block', "margin-left": '10px' }}>
36
-
<TextInput
37
-
placeholder="/avatar/parameters/MyValue"
38
-
value={ trigger.address }
39
-
requestSuggestions={suggestOSCAddresses}
40
-
change={onSetOSCAddress} />
41
-
</div>
42
-
<div app-icon style={{ 'margin-left': 'calc(100% - 545px)' }} onClick={onDelete}>
43
-
<img src="/assets/icons/trash-can-solid-full.svg" width="18" />
44
-
</div>
45
-
</div>
46
-
47
-
<br />
48
-
<For each={trigger.actions}>
49
-
{ ( item, index ) => <div app-trigger-action>
50
-
<div app-col>
51
-
<div style={{ width: 'calc(100% - 40px)', height: '30px', display: 'flex', "justify-content": 'center', 'align-items': 'center' }}>
52
-
<TextInput
53
-
placeholder="Search Actions..."
54
-
requestSuggestions={suggestActionNames}
55
-
value={item.actionType}
56
-
change={async ( text: string ) => {
57
-
let action = await invoke<ActionType>('get_action', { name: text });
58
-
if(action)onSetActionType(index(), action.name);
59
-
else onSetActionType(index(), null);
60
-
}} />
61
-
</div>
62
-
<div app-icon style={{ width: '40px' }} onClick={() => {
63
-
onDeleteAction(item.id, index());
64
-
}}>
65
-
<img src="/assets/icons/trash-can-solid-full.svg" width="18" />
66
-
</div>
67
-
</div>
68
-
69
-
<div>
70
-
71
-
</div>
72
-
</div> }
73
-
</For>
74
-
75
-
<br />
76
-
<div app-button onClick={() => {
77
-
onAddAction({ id: Math.random().toString().replace('0.', '') })
78
-
}}>Add Action +</div>
79
-
</div>
80
-
)
81
-
}
+43
src/ContextMenu/Canvas.tsx
+43
src/ContextMenu/Canvas.tsx
···
1
+
import { PositionInfo } from "../renderer";
2
+
import { Node } from "../structs/node";
3
+
import { screenToWorldSpace } from "../utils/interections";
4
+
import { NodeManager } from "../Mangers/NodeManager";
5
+
import { ContextMenuItem } from "../structs/ContextMenu";
6
+
import { Nodes } from "../Nodes/Nodes";
7
+
8
+
export let CanvasContextMenu: ContextMenuItem[] = Nodes.map(( node ) => {
9
+
if(node.isSingle){
10
+
return {
11
+
text: node.name,
12
+
clicked: async ( e: MouseEvent, canvas: HTMLCanvasElement, position: PositionInfo ) => {
13
+
let pos = screenToWorldSpace(canvas, position, e.clientX, e.clientY);
14
+
let id = await NodeManager.Instance.GetNewNodeId();
15
+
16
+
NodeManager.Instance.AddNode(new Node(pos, node, id));
17
+
},
18
+
hovered: false
19
+
}
20
+
} else{
21
+
return {
22
+
text: node.name,
23
+
menu: {
24
+
items: node.items!.map(x => {
25
+
return {
26
+
text: x.name,
27
+
clicked: async ( e: MouseEvent, canvas: HTMLCanvasElement, position: PositionInfo ) => {
28
+
let pos = screenToWorldSpace(canvas, position, e.clientX, e.clientY);
29
+
let id = await NodeManager.Instance.GetNewNodeId();
30
+
31
+
NodeManager.Instance.AddNode(new Node(pos, x, id));
32
+
},
33
+
hovered: false
34
+
}
35
+
}),
36
+
position: [ 0, 0 ],
37
+
size: [ 0, 0 ],
38
+
visible: true
39
+
},
40
+
hovered: false
41
+
}
42
+
}
43
+
});
+38
src/ContextMenu/Node.tsx
+38
src/ContextMenu/Node.tsx
···
1
+
import { Accessor, Setter } from "solid-js";
2
+
import { NodeManager } from "../Mangers/NodeManager";
3
+
import { PositionInfo } from "../renderer";
4
+
import { Node } from "../structs/node";
5
+
6
+
export let NodeContextMenu = ( clickedNode: Node, selectedNode: Accessor<Node[]>, setSelectedNode: Setter<Node[]> ) => [
7
+
{
8
+
text: "Delete Node",
9
+
clicked: ( _e: MouseEvent, _canvas: HTMLCanvasElement, _position: PositionInfo ) => {
10
+
clickedNode!.inputs.map(input => {
11
+
input.connections.map(partner => {
12
+
partner.connections = partner.connections.filter(x => x != input);
13
+
})
14
+
})
15
+
16
+
clickedNode!.outputs.map(output => {
17
+
output.connections.map(partner => {
18
+
partner.connections = partner.connections.filter(x => x != output);
19
+
})
20
+
})
21
+
22
+
let selected = selectedNode();
23
+
for (let i = 0; i < selected.length; i++) {
24
+
let node = selected[i];
25
+
26
+
if(node.id === clickedNode.id){
27
+
selected.splice(i, 1);
28
+
setSelectedNode(selected);
29
+
30
+
break;
31
+
}
32
+
}
33
+
34
+
NodeManager.Instance.RemoveNode(clickedNode!)
35
+
},
36
+
hovered: false
37
+
}
38
+
]
+47
src/Mangers/ConfirmationManager.tsx
+47
src/Mangers/ConfirmationManager.tsx
···
1
+
import { Accessor, createSignal, Setter } from "solid-js";
2
+
3
+
export interface ConfirmationPopupButton{
4
+
text: string,
5
+
callback: () => void
6
+
}
7
+
8
+
export class ConfirmationManager{
9
+
public static Instance: ConfirmationManager;
10
+
11
+
private _setText: Setter<string>;
12
+
public Text: Accessor<string>;
13
+
14
+
private _setBody: Setter<string>;
15
+
public Body: Accessor<string>;
16
+
17
+
private _setButtons: Setter<ConfirmationPopupButton[]>;
18
+
public Buttons: Accessor<ConfirmationPopupButton[]>;
19
+
20
+
private _setShown: Setter<boolean>;
21
+
public Shown: Accessor<boolean>;
22
+
23
+
constructor(){
24
+
ConfirmationManager.Instance = this;
25
+
26
+
[ this.Text, this._setText ] = createSignal('');
27
+
[ this.Body, this._setBody ] = createSignal('');
28
+
[ this.Buttons, this._setButtons ] = createSignal<ConfirmationPopupButton[]>([]);
29
+
[ this.Shown, this._setShown ] = createSignal(false);
30
+
}
31
+
32
+
public ShowConfirmation( text: string, body: string, buttons: ConfirmationPopupButton[] ): boolean{
33
+
if(this.Shown())return false;
34
+
35
+
this._setShown(true);
36
+
37
+
this._setText(text);
38
+
this._setBody(body);
39
+
this._setButtons(buttons);
40
+
41
+
return true;
42
+
}
43
+
44
+
public CancelConfirmation(){
45
+
this._setShown(false);
46
+
}
47
+
}
+423
src/Mangers/NodeManager.tsx
+423
src/Mangers/NodeManager.tsx
···
1
+
import { invoke } from "@tauri-apps/api/core";
2
+
import { Node } from "../structs/node";
3
+
import { Tab } from "../structs/Tab";
4
+
import { createSignal } from "solid-js";
5
+
import { listen } from "@tauri-apps/api/event";
6
+
import { getVersion } from "@tauri-apps/api/app";
7
+
import { NodesByID } from "../Nodes/Nodes";
8
+
import { save } from "@tauri-apps/plugin-dialog";
9
+
import { ConfirmationManager } from "./ConfirmationManager";
10
+
import { platform } from "@tauri-apps/plugin-os";
11
+
12
+
export interface TabHashMap {
13
+
[details: string] : Tab;
14
+
}
15
+
16
+
export class NodeManager{
17
+
public static Instance: NodeManager;
18
+
19
+
private _selectedTab: string | null = null;
20
+
private _tabs: TabHashMap = {};
21
+
22
+
private _nodes: Node[] = [];
23
+
24
+
constructor(){
25
+
NodeManager.Instance = this;
26
+
27
+
setInterval(() => {
28
+
let tabs = Object.values(this._tabs).filter(x => x.needSync);
29
+
for(let tab of tabs){
30
+
invoke('sync_tab', {
31
+
graph: this._generateTabGraph(tab.id)[0],
32
+
id: tab.id,
33
+
name: tab.name,
34
+
location: tab.saveLocation,
35
+
saveState: tab.needsSave()
36
+
});
37
+
38
+
tab.needSync = false;
39
+
}
40
+
}, 1000);
41
+
42
+
listen('load_new_tab', ( ev: any ) => {
43
+
this._loadFromConfig(ev.payload.path, null, ev.payload.graph);
44
+
});
45
+
46
+
invoke('load_previous_tabs').then(async ( tabs: any ) => {
47
+
let version = await getVersion();
48
+
49
+
for(let tab of Object.entries<any>(tabs)){
50
+
let loaded_tab = await this._loadFromConfig(tab[1][2], tab[0], JSON.stringify({
51
+
tab_name: tab[1][1],
52
+
version,
53
+
graph: tab[1][0]
54
+
}));
55
+
56
+
if(loaded_tab)
57
+
loaded_tab.setNeedsSave(tab[1][3]);
58
+
};
59
+
60
+
this.UpdateConfig();
61
+
});
62
+
63
+
listen('prompt_to_close', async _ => {
64
+
let tabs = Object.values(this._tabs);
65
+
let tabsNeedingSaving = tabs.filter(x => x.needsSave());
66
+
67
+
for(let tab of tabsNeedingSaving){
68
+
await new Promise<void>(res => {
69
+
ConfirmationManager.Instance.ShowConfirmation(
70
+
`Discard Changes in ${tab.name}?`,
71
+
'If you close this tab without saving you will lose all changes.',
72
+
[
73
+
{
74
+
text: 'Save',
75
+
callback: async () => {
76
+
await this.SaveTab(tab);
77
+
res();
78
+
}
79
+
},
80
+
{
81
+
text: 'Don\'t Save',
82
+
callback: async () => {
83
+
res();
84
+
}
85
+
}
86
+
]
87
+
)
88
+
});
89
+
}
90
+
91
+
invoke('close_app');
92
+
});
93
+
}
94
+
95
+
96
+
private _tabUpdateHook: ( tabs: TabHashMap ) => void = () => {};
97
+
private _tabChangeHook: () => void = () => {};
98
+
99
+
public CurrentTab(): Tab | null{
100
+
if(!this._selectedTab)return null
101
+
return this._tabs[this._selectedTab] || null;
102
+
}
103
+
104
+
public async AddTab( name: string, id: string | null = null ): Promise<Tab>{
105
+
let [ selected, setSelected ] = createSignal(false);
106
+
let [ needsSave, setNeedsSave ] = createSignal(false);
107
+
108
+
let tab: Tab = {
109
+
name: name,
110
+
id: id || await NodeManager.Instance.GetNewNodeId(),
111
+
nodes: [],
112
+
saveLocation: null,
113
+
114
+
selected,
115
+
setSelected,
116
+
117
+
needsSave,
118
+
setNeedsSave,
119
+
120
+
needSync: false
121
+
};
122
+
123
+
this._tabs[tab.id] = tab;
124
+
125
+
this.SelectTab(tab.id);
126
+
this._tabUpdateHook(this._tabs);
127
+
128
+
return tab;
129
+
}
130
+
131
+
public CloseTab( id: string ){
132
+
let tab = this._tabs[id];
133
+
134
+
let closeCB = () => {
135
+
if(this._selectedTab === id){
136
+
let tabs = Object.values(this._tabs);
137
+
138
+
if(tabs.length === 1){
139
+
this.SelectTab(null);
140
+
} else{
141
+
let index = tabs.indexOf(tab);
142
+
let nextTab = tabs[index + 1];
143
+
144
+
if(nextTab)
145
+
this.SelectTab(nextTab.id);
146
+
else
147
+
this.SelectTab(tabs[0].id);
148
+
}
149
+
}
150
+
151
+
invoke('discard_tab', { id: id });
152
+
153
+
delete this._tabs[id];
154
+
this._tabUpdateHook(this._tabs);
155
+
}
156
+
157
+
if(tab.needsSave()){
158
+
ConfirmationManager.Instance.ShowConfirmation(
159
+
'Discard Changes?',
160
+
'If you close this tab without saving you will lose all changes.',
161
+
[
162
+
{
163
+
text: 'Save',
164
+
callback: async () => {
165
+
await this.SaveTab(tab);
166
+
closeCB();
167
+
}
168
+
},
169
+
{
170
+
text: 'Don\'t Save',
171
+
callback: () => {
172
+
closeCB();
173
+
}
174
+
}
175
+
]
176
+
)
177
+
} else{
178
+
closeCB();
179
+
}
180
+
}
181
+
182
+
public RenameTab( id: string, name: string ){
183
+
let tab = this._tabs[id];
184
+
if(!tab)return;
185
+
186
+
tab.name = name;
187
+
this._tabUpdateHook(this._tabs);
188
+
}
189
+
190
+
public SelectTab( id: string | null ){
191
+
if(this._selectedTab && this._tabs[this._selectedTab]){
192
+
let tab = this._tabs[this._selectedTab];
193
+
194
+
tab.setSelected(false);
195
+
tab.nodes = this._nodes;
196
+
}
197
+
198
+
this._selectedTab = id;
199
+
this._tabChangeHook();
200
+
201
+
if(this._selectedTab){
202
+
let tab = this._tabs[this._selectedTab];
203
+
if(!tab){
204
+
this._selectedTab = null;
205
+
return this._nodes = [];
206
+
}
207
+
208
+
tab.setSelected(true);
209
+
this._nodes = tab.nodes;
210
+
} else{
211
+
this._nodes = [];
212
+
}
213
+
}
214
+
215
+
public async SaveTab( tab: Tab, ignoreSaveLocation: boolean = false ){
216
+
let path =
217
+
tab.saveLocation && !ignoreSaveLocation ?
218
+
tab.saveLocation :
219
+
await save({ defaultPath: tab.name + '.macro', filters: [ { name: 'Macro Files', extensions: [ 'macro' ] } ] });
220
+
221
+
if(!path)throw new Error("Cannot save");
222
+
223
+
tab.saveLocation = path;
224
+
tab.setNeedsSave(false);
225
+
226
+
this._saveConfigToDisk(path, tab.id);
227
+
}
228
+
229
+
public HookTabUpdate( cb: ( tabs: TabHashMap ) => void ){
230
+
this._tabUpdateHook = cb;
231
+
}
232
+
233
+
public HookTabChange( cb: () => void ){
234
+
this._tabChangeHook = cb;
235
+
}
236
+
237
+
238
+
public AddNode( node: Node ){
239
+
if(!this._selectedTab)return;
240
+
241
+
this._nodes.push(node);
242
+
this.UpdateConfig();
243
+
}
244
+
245
+
public RemoveNode( node: Node ){
246
+
if(!this._selectedTab)return;
247
+
248
+
this._nodes = this._nodes.filter(x => x !== node);
249
+
this.UpdateConfig();
250
+
}
251
+
252
+
public GetNodes(): Node[] | null{
253
+
if(this._selectedTab)
254
+
return this._nodes;
255
+
else
256
+
return null;
257
+
}
258
+
259
+
public async GetNewNodeId(){
260
+
let encoder = new TextEncoder();
261
+
let data = encoder.encode(Date.now().toString() + Math.random().toString());
262
+
let hash = await window.crypto.subtle.digest("SHA-256", data); // Probably should get a better ID implementation
263
+
264
+
return btoa(String.fromCharCode(...new Uint8Array(hash)));
265
+
}
266
+
267
+
268
+
public UpdateConfig( needsSave = true ){
269
+
if(!this._selectedTab)return;
270
+
let tab = this._tabs[this._selectedTab];
271
+
if(!tab)return;
272
+
273
+
tab.nodes = this._nodes;
274
+
tab.needSync = true;
275
+
276
+
if(needsSave)tab.setNeedsSave(true);
277
+
}
278
+
279
+
private async _loadFromConfig( path: string | null, id: string | null, config: string ){
280
+
let json = JSON.parse(config);
281
+
282
+
if(
283
+
!json.tab_name ||
284
+
!json.version ||
285
+
!json.graph
286
+
)return;
287
+
288
+
let tab = await this.AddTab(json.tab_name, id);
289
+
tab.needSync = false;
290
+
tab.saveLocation = path;
291
+
292
+
this._nodes = [];
293
+
294
+
let graph = json.graph;
295
+
296
+
// Populate nodes
297
+
for (let i = 0; i < graph.length; i++) {
298
+
let node = graph[i];
299
+
300
+
let nod = new Node(node.pos, NodesByID[node.typeId], node.id);
301
+
302
+
nod.statics = node.statics;
303
+
await nod.onStaticsUpdate(nod);
304
+
305
+
this._nodes.push(nod);
306
+
}
307
+
308
+
// Populate node inputs
309
+
for (let i = 0; i < graph.length; i++) {
310
+
let configNode = graph[i];
311
+
let outputParentNode = this._nodes[i];
312
+
313
+
for (let j = 0; j < configNode.outputs.length; j++) {
314
+
let output = configNode.outputs[j];
315
+
316
+
for (let k = 0; k < output.connections.length; k++) {
317
+
let input = output.connections[k];
318
+
let node = this._nodes.find(x => x.id === input.node)!;
319
+
320
+
if(!node)continue;
321
+
322
+
let realInput = node.inputs.find(x => x.index === input.index);
323
+
let realOutput = outputParentNode.outputs[j];
324
+
325
+
if(realInput){
326
+
realInput.connections.push(realOutput);
327
+
realOutput.connections.push(realInput);
328
+
} else{
329
+
let realInput = {
330
+
name: input.name,
331
+
type: input.type,
332
+
parent: node,
333
+
connections: [ realOutput ],
334
+
index: input.index
335
+
};
336
+
337
+
node.inputs.push(realInput);
338
+
realOutput.connections.push(realInput);
339
+
}
340
+
}
341
+
}
342
+
}
343
+
344
+
tab.setNeedsSave(false);
345
+
tab.nodes = this._nodes;
346
+
347
+
tab.needSync = false;
348
+
if(!id)this.UpdateConfig(false);
349
+
350
+
return tab;
351
+
}
352
+
353
+
private _generateTabGraph( tabId: string | null ): [ any, Tab | null ]{
354
+
// Convert it into a structure we can actually save...
355
+
356
+
if(!tabId)return [ null, null ];
357
+
let tab = this._tabs[tabId];
358
+
if(!tab)return [ null, null ];
359
+
360
+
let nodesToSave = [];
361
+
362
+
for (let i = 0; i < tab.nodes.length; i++) {
363
+
let node = tab.nodes[i];
364
+
365
+
let nodeOutputs = [];
366
+
let nodeInputs = [];
367
+
368
+
for (let j = 0; j < node.outputs.length; j++) {
369
+
let output = node.outputs[j];
370
+
371
+
nodeOutputs.push({
372
+
name: output.name,
373
+
type: output.type,
374
+
connections: output.connections.map(x => { return {
375
+
name: x.name,
376
+
node: x.parent.id,
377
+
index: x.index,
378
+
type: x.type
379
+
}})
380
+
})
381
+
}
382
+
383
+
for (let j = 0; j < node.inputs.length; j++) {
384
+
let input = node.inputs[j];
385
+
386
+
nodeInputs.push({
387
+
name: input.name,
388
+
type: input.type,
389
+
connections: input.connections.map(x => { return {
390
+
name: x.name,
391
+
node: x.parent.id,
392
+
index: x.index,
393
+
type: x.type
394
+
}})
395
+
})
396
+
}
397
+
398
+
nodesToSave.push({
399
+
name: node.name,
400
+
id: node.id,
401
+
typeId: node.typeId,
402
+
pos: [ node.x, node.y ],
403
+
outputs: nodeOutputs,
404
+
inputs: nodeInputs,
405
+
statics: node.statics
406
+
})
407
+
}
408
+
409
+
return [ nodesToSave, tab ];
410
+
}
411
+
412
+
private async _saveConfigToDisk( path: string, tabId: string | null ){
413
+
let [ nodesToSave, tab ] = this._generateTabGraph(tabId);
414
+
if(!tab)return;
415
+
416
+
invoke('save_graph', { graph: JSON.stringify({
417
+
tab_name: tab.name,
418
+
version: await getVersion(),
419
+
platform: platform(),
420
+
graph: nodesToSave
421
+
}), path });
422
+
}
423
+
}
+31
src/Nodes/Conditional/IfEqual.tsx
+31
src/Nodes/Conditional/IfEqual.tsx
···
1
+
import { Node, NodeType } from "../../structs/node";
2
+
import { NodeDefinition } from "../Nodes";
3
+
4
+
export let NodeConditionalIfEqual: NodeDefinition = {
5
+
os: 'any',
6
+
7
+
isSingle: true,
8
+
name: 'If Equal',
9
+
typeId: 'ifequal',
10
+
11
+
w: 220,
12
+
13
+
statics: [{
14
+
type: NodeType.Label,
15
+
name: 'If Equal',
16
+
value: null
17
+
}],
18
+
19
+
inputs: [
20
+
{ name: "Flow", type: NodeType.Flow },
21
+
{ name: "Input 1", type: NodeType.AnyTypeA },
22
+
{ name: "Input 2", type: NodeType.AnyTypeA },
23
+
],
24
+
25
+
outputs: [
26
+
{ name: "Equal", type: NodeType.Flow },
27
+
{ name: "Not Equal", type: NodeType.Flow },
28
+
],
29
+
30
+
onStaticsUpdate: async ( _node: Node ) => {}
31
+
}
+30
src/Nodes/Conditional/IfFalse.tsx
+30
src/Nodes/Conditional/IfFalse.tsx
···
1
+
import { Node, NodeType } from "../../structs/node";
2
+
import { NodeDefinition } from "../Nodes";
3
+
4
+
export let NodeConditionalIfFalse: NodeDefinition = {
5
+
os: 'any',
6
+
7
+
isSingle: true,
8
+
name: 'If False',
9
+
typeId: 'iffalse',
10
+
11
+
w: 220,
12
+
13
+
statics: [{
14
+
type: NodeType.Label,
15
+
name: 'If False',
16
+
value: null
17
+
}],
18
+
19
+
inputs: [
20
+
{ name: "Flow", type: NodeType.Flow },
21
+
{ name: "Input", type: NodeType.Boolean },
22
+
],
23
+
24
+
outputs: [
25
+
{ name: "Is False", type: NodeType.Flow },
26
+
{ name: "Not False", type: NodeType.Flow },
27
+
],
28
+
29
+
onStaticsUpdate: async ( _node: Node ) => {}
30
+
}
+30
src/Nodes/Conditional/IfTrue.tsx
+30
src/Nodes/Conditional/IfTrue.tsx
···
1
+
import { Node, NodeType } from "../../structs/node";
2
+
import { NodeDefinition } from "../Nodes";
3
+
4
+
export let NodeConditionalIfTrue: NodeDefinition = {
5
+
os: 'any',
6
+
7
+
isSingle: true,
8
+
name: 'If True',
9
+
typeId: 'iftrue',
10
+
11
+
w: 220,
12
+
13
+
statics: [{
14
+
type: NodeType.Label,
15
+
name: 'If True',
16
+
value: null
17
+
}],
18
+
19
+
inputs: [
20
+
{ name: "Flow", type: NodeType.Flow },
21
+
{ name: "Input", type: NodeType.Boolean },
22
+
],
23
+
24
+
outputs: [
25
+
{ name: "Is True", type: NodeType.Flow },
26
+
{ name: "Not True", type: NodeType.Flow },
27
+
],
28
+
29
+
onStaticsUpdate: async ( _node: Node ) => { }
30
+
}
+17
src/Nodes/Conditional.tsx
+17
src/Nodes/Conditional.tsx
···
1
+
import { NodeDefinition } from "./Nodes";
2
+
3
+
import { NodeConditionalIfEqual } from "./Conditional/IfEqual";
4
+
import { NodeConditionalIfTrue } from "./Conditional/IfTrue";
5
+
import { NodeConditionalIfFalse } from "./Conditional/IfFalse";
6
+
7
+
export let NodeConditional: NodeDefinition = {
8
+
os: 'any',
9
+
10
+
isSingle: false,
11
+
name: 'Conditional',
12
+
items: [
13
+
NodeConditionalIfEqual,
14
+
NodeConditionalIfTrue,
15
+
NodeConditionalIfFalse
16
+
]
17
+
}
+33
src/Nodes/Debug.tsx
+33
src/Nodes/Debug.tsx
···
1
+
import { Node, NodeType } from "../structs/node";
2
+
import { NodeDefinition } from "./Nodes";
3
+
4
+
export let NodeDebug: NodeDefinition = {
5
+
os: 'any',
6
+
7
+
isSingle: true,
8
+
name: 'Debug',
9
+
typeId: 'debug',
10
+
11
+
w: 200,
12
+
13
+
statics: [
14
+
{
15
+
name: "Debug",
16
+
type: NodeType.Label,
17
+
value: null
18
+
}
19
+
],
20
+
21
+
inputs: [
22
+
{
23
+
name: "Flow",
24
+
type: NodeType.Flow,
25
+
},
26
+
{
27
+
name: "Value",
28
+
type: NodeType.AnyTypeA,
29
+
}
30
+
],
31
+
32
+
onStaticsUpdate: async ( _node: Node ) => {}
33
+
};
+69
src/Nodes/Nodes.tsx
+69
src/Nodes/Nodes.tsx
···
1
+
import { Node, NodeStatic, NodeType } from "../structs/node";
2
+
import { platform } from '@tauri-apps/plugin-os';
3
+
4
+
import { NodeConditional } from "./Conditional";
5
+
import { NodeDebug } from "./Debug";
6
+
import { NodeOSCActions } from "./OSCActions";
7
+
import { NodeOSCTrigger } from "./OSCTrigger";
8
+
import { NodePressKey } from "./PressKey";
9
+
import { NodeStatics } from "./Statics";
10
+
import { NodeShellCommand } from "./Shell";
11
+
12
+
export interface NodeDefinition{
13
+
os: string,
14
+
isSingle: boolean,
15
+
name: string,
16
+
typeId?: string,
17
+
onStaticsUpdate?: ( node: Node ) => Promise<void>,
18
+
// build?: ( pos: [ number, number ], onStaticsUpdate: ( node: Node ) => void ) => Promise<Node>,
19
+
w?: number,
20
+
statics?: NodeStatic[],
21
+
inputs?: { name: string, type: NodeType }[],
22
+
outputs?: { name: string, type: NodeType }[],
23
+
24
+
items?: NodeDefinition[]
25
+
}
26
+
27
+
export interface NodeDefinitionHashMap {
28
+
[details: string] : NodeDefinition;
29
+
}
30
+
31
+
// TODO: (Node Additions) Pressing keyboard keys (like to do linux, but has extra steps)
32
+
// TODO: (Node Additions) Getting media state from os
33
+
// TODO: (Node Additions) Sending custom OSC messages
34
+
// TODO: (Node Additions) Sending HTTP requests?
35
+
// TODO: (Node Additions) Voicemeeter integrations (win only)
36
+
// TODO: (Node Additions) Voicemod integrations (win only)
37
+
// TODO: (Node Additions) Executing shell commands? (probably need some kinda popup warning when these are imported about dangerous usage)
38
+
39
+
export let Nodes: NodeDefinition[] = [];
40
+
let nodes = [
41
+
NodeOSCTrigger,
42
+
NodeConditional,
43
+
NodeStatics,
44
+
NodeOSCActions,
45
+
NodeDebug,
46
+
NodePressKey,
47
+
NodeShellCommand
48
+
]
49
+
50
+
let os = platform();
51
+
52
+
for (let i = 0; i < nodes.length; i++) {
53
+
let node = nodes[i];
54
+
if(node.os === 'any' || node.os === os)Nodes.push(node);
55
+
}
56
+
57
+
export let NodesByID: NodeDefinitionHashMap = {}
58
+
59
+
Nodes.forEach(node => {
60
+
if(node.isSingle){
61
+
NodesByID[node.typeId!] = node;
62
+
} else{
63
+
node.items!.forEach(node => {
64
+
NodesByID[node.typeId!] = node;
65
+
})
66
+
}
67
+
})
68
+
69
+
console.log(NodesByID);
+25
src/Nodes/OSCActions/Send Chatbox.tsx
+25
src/Nodes/OSCActions/Send Chatbox.tsx
···
1
+
import { Node, NodeType } from "../../structs/node";
2
+
import { NodeDefinition } from "../Nodes";
3
+
4
+
export let NodeOSCActionsSendChatbox: NodeDefinition = {
5
+
os: 'any',
6
+
7
+
isSingle: true,
8
+
name: 'Send Chatbox',
9
+
typeId: 'oscsendchatbox',
10
+
11
+
w: 200,
12
+
13
+
statics: [{
14
+
type: NodeType.Label,
15
+
name: 'Send Chatbox',
16
+
value: null
17
+
}],
18
+
19
+
inputs: [
20
+
{ name: "Flow", type: NodeType.Flow },
21
+
{ name: "Value", type: NodeType.String }
22
+
],
23
+
24
+
onStaticsUpdate: async ( _node: Node ) => {}
25
+
}
+12
src/Nodes/OSCActions.tsx
+12
src/Nodes/OSCActions.tsx
···
1
+
import { NodeDefinition } from "./Nodes";
2
+
import { NodeOSCActionsSendChatbox } from "./OSCActions/Send Chatbox";
3
+
4
+
export let NodeOSCActions: NodeDefinition = {
5
+
os: 'any',
6
+
7
+
isSingle: false,
8
+
name: 'OSC Actions',
9
+
items: [
10
+
NodeOSCActionsSendChatbox
11
+
]
12
+
}
+106
src/Nodes/OSCTrigger.tsx
+106
src/Nodes/OSCTrigger.tsx
···
1
+
import { invoke } from "@tauri-apps/api/core";
2
+
import { Node, NodeType } from "../structs/node";
3
+
import { OSCMessage } from "../structs/OscMessage";
4
+
import { NodeManager } from "../Mangers/NodeManager";
5
+
import { NodeDefinition } from "./Nodes";
6
+
7
+
export let NodeOSCTrigger: NodeDefinition = {
8
+
os: 'any',
9
+
10
+
isSingle: true,
11
+
name: 'OSC Trigger',
12
+
typeId: 'osctrigger',
13
+
14
+
w: 200,
15
+
16
+
statics: [
17
+
{
18
+
name: "OSC Trigger",
19
+
type: NodeType.OSCAddress,
20
+
value: null
21
+
},
22
+
{
23
+
name: "Parameter List",
24
+
type: NodeType.ParameterList,
25
+
value: []
26
+
}
27
+
],
28
+
29
+
onStaticsUpdate: async ( node: Node ) => {
30
+
let address = node.statics[0].value;
31
+
let parameters = node.statics[1].value;
32
+
33
+
if(address){
34
+
let addresses = await invoke<OSCMessage[]>('get_addresses');
35
+
let msgDat = addresses.find(x => x.address == address);
36
+
37
+
if(msgDat){
38
+
parameters = msgDat.values.map(x => { return { type: x.key, desc: '' }});
39
+
node.statics[1].value = parameters;
40
+
}
41
+
}
42
+
43
+
let tempOutputs = [];
44
+
45
+
tempOutputs.push({
46
+
name: 'Flow',
47
+
type: NodeType.Flow,
48
+
connections: [],
49
+
parent: node,
50
+
index: 0
51
+
})
52
+
53
+
parameters.forEach(( dat: any, indx: number ) => {
54
+
let type: NodeType | null = null;
55
+
56
+
switch(dat.type){
57
+
case 'Int':
58
+
type = NodeType.Int;
59
+
break;
60
+
case 'Float':
61
+
type = NodeType.Float;
62
+
break;
63
+
case 'String':
64
+
type = NodeType.String;
65
+
break;
66
+
case 'Boolean':
67
+
type = NodeType.Boolean;
68
+
break;
69
+
}
70
+
71
+
if(type){
72
+
tempOutputs.push({
73
+
name: dat.desc === '' ? dat.type : dat.desc,
74
+
type: type,
75
+
connections: [],
76
+
parent: node,
77
+
index: indx + 1
78
+
})
79
+
}
80
+
});
81
+
82
+
let hasChanged = false;
83
+
84
+
for(let i in tempOutputs){
85
+
if(
86
+
node.outputs[i] === undefined ||
87
+
tempOutputs[i].type != node.outputs[i].type
88
+
){
89
+
hasChanged = true;
90
+
}
91
+
}
92
+
93
+
if(hasChanged){
94
+
node.outputs.map(output => {
95
+
output.connections.map(partner => {
96
+
partner.connections = partner.connections.filter(x => x != output);
97
+
})
98
+
})
99
+
100
+
node.outputs = tempOutputs;
101
+
node.updateSize();
102
+
}
103
+
104
+
NodeManager.Instance.UpdateConfig();
105
+
}
106
+
};
+29
src/Nodes/PressKey.tsx
+29
src/Nodes/PressKey.tsx
···
1
+
import { Node, NodeType } from "../structs/node";
2
+
import { NodeDefinition } from "./Nodes";
3
+
4
+
export let NodePressKey: NodeDefinition = {
5
+
os: 'windows',
6
+
7
+
isSingle: true,
8
+
name: 'Press Key',
9
+
typeId: 'presskey',
10
+
11
+
w: 200,
12
+
13
+
statics: [
14
+
{
15
+
name: "Key",
16
+
type: NodeType.String,
17
+
value: ""
18
+
}
19
+
],
20
+
21
+
inputs: [
22
+
{
23
+
name: "Flow",
24
+
type: NodeType.Flow,
25
+
}
26
+
],
27
+
28
+
onStaticsUpdate: async ( _node: Node ) => {}
29
+
};
+38
src/Nodes/Shell.tsx
+38
src/Nodes/Shell.tsx
···
1
+
import { Node, NodeType } from "../structs/node";
2
+
import { NodeDefinition } from "./Nodes";
3
+
4
+
export let NodeShellCommand: NodeDefinition = {
5
+
os: 'any',
6
+
7
+
isSingle: true,
8
+
name: 'Shell Command',
9
+
typeId: 'shellcommand',
10
+
11
+
w: 200,
12
+
13
+
statics: [],
14
+
15
+
inputs: [
16
+
{
17
+
name: "Flow",
18
+
type: NodeType.Flow,
19
+
},
20
+
{
21
+
name: "Command",
22
+
type: NodeType.String,
23
+
},
24
+
],
25
+
26
+
outputs: [
27
+
{
28
+
name: "Flow",
29
+
type: NodeType.Flow,
30
+
},
31
+
{
32
+
name: "Output",
33
+
type: NodeType.String,
34
+
},
35
+
],
36
+
37
+
onStaticsUpdate: async ( _node: Node ) => {}
38
+
};
+22
src/Nodes/Statics/Float.tsx
+22
src/Nodes/Statics/Float.tsx
···
1
+
import { Node, NodeType } from "../../structs/node";
2
+
import { NodeDefinition } from "../Nodes";
3
+
4
+
export let NodeStaticsFloat: NodeDefinition = {
5
+
os: 'any',
6
+
7
+
isSingle: true,
8
+
name: 'Float',
9
+
typeId: 'staticfloat',
10
+
11
+
w: 200,
12
+
13
+
statics: [{
14
+
type: NodeType.Float,
15
+
name: 'Value',
16
+
value: 0.0
17
+
}],
18
+
19
+
outputs: [{ name: "Float", type: NodeType.Float }],
20
+
21
+
onStaticsUpdate: async ( _node: Node ) => {}
22
+
}
+22
src/Nodes/Statics/Int.tsx
+22
src/Nodes/Statics/Int.tsx
···
1
+
import { Node, NodeType } from "../../structs/node";
2
+
import { NodeDefinition } from "../Nodes";
3
+
4
+
export let NodeStaticsInt: NodeDefinition = {
5
+
os: 'any',
6
+
7
+
isSingle: true,
8
+
name: 'Int',
9
+
typeId: 'staticint',
10
+
11
+
w: 200,
12
+
13
+
statics: [{
14
+
type: NodeType.Int,
15
+
name: 'Value',
16
+
value: 0
17
+
}],
18
+
19
+
outputs: [{ name: "Int", type: NodeType.Int }],
20
+
21
+
onStaticsUpdate: async ( _node: Node ) => {}
22
+
}
+22
src/Nodes/Statics/String.tsx
+22
src/Nodes/Statics/String.tsx
···
1
+
import { Node, NodeType } from "../../structs/node";
2
+
import { NodeDefinition } from "../Nodes";
3
+
4
+
export let NodeStaticsString: NodeDefinition = {
5
+
os: 'any',
6
+
7
+
isSingle: true,
8
+
name: 'String',
9
+
typeId: 'staticstring',
10
+
11
+
w: 200,
12
+
13
+
statics: [{
14
+
type: NodeType.String,
15
+
name: 'Value',
16
+
value: 'Hello World!'
17
+
}],
18
+
19
+
outputs: [{ name: "String", type: NodeType.String }],
20
+
21
+
onStaticsUpdate: async ( _node: Node ) => {}
22
+
}
+17
src/Nodes/Statics.tsx
+17
src/Nodes/Statics.tsx
···
1
+
import { NodeDefinition } from "./Nodes";
2
+
import { NodeStaticsFloat } from "./Statics/Float";
3
+
4
+
import { NodeStaticsInt } from "./Statics/Int";
5
+
import { NodeStaticsString } from "./Statics/String";
6
+
7
+
export let NodeStatics: NodeDefinition = {
8
+
os: 'any',
9
+
10
+
isSingle: false,
11
+
name: 'Statics',
12
+
items: [
13
+
NodeStaticsInt,
14
+
NodeStaticsString,
15
+
NodeStaticsFloat
16
+
]
17
+
}
-4
src/Structs/ActionType.ts
-4
src/Structs/ActionType.ts
-11
src/Structs/OSCMessage.ts
-11
src/Structs/OSCMessage.ts
+42
src/components/ConfirmationPopup.css
+42
src/components/ConfirmationPopup.css
···
1
+
.confirmation-blackout{
2
+
position: fixed;
3
+
top: 0;
4
+
left: 0;
5
+
width: 100vw;
6
+
height: 100vh;
7
+
z-index: 150;
8
+
background: #000A;
9
+
}
10
+
11
+
.confirmation-popup{
12
+
position: fixed;
13
+
top: 50%;
14
+
left: 50%;
15
+
transform: translate(-50%, -50%);
16
+
background: #272e44;
17
+
border-radius: 20px;
18
+
padding: 10px 20px;
19
+
text-align: center;
20
+
}
21
+
22
+
.confirmation-buttons{
23
+
display: flex;
24
+
margin-top: 30px;
25
+
}
26
+
27
+
.confirmation-button{
28
+
cursor: pointer;
29
+
user-select: none;
30
+
-webkit-user-select: none;
31
+
32
+
width: 100%;
33
+
padding: 2px 10px;
34
+
border: 1px solid #fff;
35
+
border-radius: 5px;
36
+
transition: 0.1s;
37
+
margin: 0 5px;
38
+
}
39
+
40
+
.confirmation-button:hover{
41
+
background: #fff2;
42
+
}
+41
src/components/ConfirmationPopup.tsx
+41
src/components/ConfirmationPopup.tsx
···
1
+
import { For, Show } from 'solid-js';
2
+
import './ConfirmationPopup.css';
3
+
import { ConfirmationManager } from '../Mangers/ConfirmationManager';
4
+
5
+
export let ConfirmationPopup = () => {
6
+
return (
7
+
<>
8
+
<Show when={ConfirmationManager.Instance.Shown()}>
9
+
<div class="confirmation-blackout">
10
+
<div class="confirmation-popup">
11
+
<h2>{ConfirmationManager.Instance.Text()}</h2>
12
+
<p>{ConfirmationManager.Instance.Body()}</p>
13
+
14
+
<div class="confirmation-buttons">
15
+
<For each={ConfirmationManager.Instance.Buttons()}>
16
+
{ item =>
17
+
<div
18
+
class="confirmation-button"
19
+
onClick={() => {
20
+
ConfirmationManager.Instance.CancelConfirmation();
21
+
item.callback();
22
+
}}
23
+
>
24
+
{ item.text }
25
+
</div>
26
+
}
27
+
</For>
28
+
29
+
<div
30
+
class="confirmation-button"
31
+
onClick={() => ConfirmationManager.Instance.CancelConfirmation()}
32
+
>
33
+
Cancel
34
+
</div>
35
+
</div>
36
+
</div>
37
+
</div>
38
+
</Show>
39
+
</>
40
+
)
41
+
}
+29
src/components/ControlBar.css
+29
src/components/ControlBar.css
···
1
+
.control-bar{
2
+
position: fixed;
3
+
top: 20px;
4
+
left: 20px;
5
+
height: 40px;
6
+
z-index: 100;
7
+
width: calc(100vw - 40px);
8
+
background: #272e44;
9
+
border-radius: 20px;
10
+
display: flex;
11
+
padding: 10px 20px;
12
+
align-items: center;
13
+
}
14
+
15
+
.button{
16
+
padding: 5px 10px;
17
+
margin: 0 10px;
18
+
background: #445077;
19
+
border-radius: 5px;
20
+
transition: 0.1s;
21
+
cursor: pointer;
22
+
user-select: none;
23
+
-webkit-user-select: none;
24
+
width: fit-content;
25
+
}
26
+
27
+
.button:hover{
28
+
background: #363f5e;
29
+
}
+133
src/components/ControlBar.tsx
+133
src/components/ControlBar.tsx
···
1
+
import './ControlBar.css';
2
+
3
+
import { Accessor, createSignal, For, Match, Show, Switch } from 'solid-js';
4
+
import { Node, NodeType } from '../structs/node';
5
+
import { TextInput } from './TextInput';
6
+
import { invoke } from '@tauri-apps/api/core';
7
+
import { OSCMessage } from '../structs/OscMessage';
8
+
import { ParameterList } from './ParameterList';
9
+
import { NodeManager } from '../Mangers/NodeManager';
10
+
11
+
export interface ControlBarProps{
12
+
node: Accessor<Node[]>,
13
+
lockMovement: ( lock: boolean ) => void
14
+
}
15
+
16
+
export let ControlBar = ( props: ControlBarProps ) => {
17
+
return (
18
+
<div class="control-bar">
19
+
<For each={props.node()[0]?.statics}>
20
+
{ ( item ) => {
21
+
let [ popupOpen, setPopupOpen ] = createSignal(false);
22
+
23
+
return (
24
+
<div>
25
+
<Switch>
26
+
<Match when={item.type == NodeType.String}>
27
+
{ item.name }
28
+
<div style={{ display: 'inline-block', 'margin-left': '10px' }}>
29
+
<input
30
+
type="text"
31
+
placeholder='Enter Value...'
32
+
value={item.value || ''}
33
+
onChange={( el ) => {
34
+
let value = el.target.value;
35
+
let node = props.node()[0]!;
36
+
37
+
item.value = value;
38
+
node.onStaticsUpdate(node);
39
+
40
+
NodeManager.Instance.UpdateConfig();
41
+
}} />
42
+
</div>
43
+
</Match>
44
+
<Match when={item.type == NodeType.Int}>
45
+
{ item.name }
46
+
<div style={{ display: 'inline-block', 'margin-left': '10px' }}>
47
+
<input
48
+
type="number"
49
+
placeholder='Enter Value...'
50
+
value={item.value !== undefined ? item.value : ''}
51
+
onChange={( el ) => {
52
+
let value = el.target.value;
53
+
let node = props.node()[0]!;
54
+
55
+
item.value = parseInt(value);
56
+
node.onStaticsUpdate(node);
57
+
58
+
NodeManager.Instance.UpdateConfig();
59
+
}} />
60
+
</div>
61
+
</Match>
62
+
<Match when={item.type == NodeType.Float}>
63
+
{ item.name }
64
+
<div style={{ display: 'inline-block', 'margin-left': '10px' }}>
65
+
<input
66
+
type="number"
67
+
placeholder='Enter Value...'
68
+
value={item.value !== undefined ? item.value : ''}
69
+
onChange={( el ) => {
70
+
let value = el.target.value;
71
+
let node = props.node()[0]!;
72
+
73
+
item.value = parseFloat(value);
74
+
node.onStaticsUpdate(node);
75
+
76
+
NodeManager.Instance.UpdateConfig();
77
+
}} />
78
+
</div>
79
+
</Match>
80
+
<Match when={item.type == NodeType.OSCAddress}>
81
+
{ item.name }
82
+
<div style={{ display: 'inline-block', 'margin-left': '10px', width: '300px' }}>
83
+
<TextInput
84
+
placeholder='Enter OSC Address...'
85
+
value={item.value || ''}
86
+
requestSuggestions={async ( text: string ): Promise<string[]> => {
87
+
let addresses = await invoke<OSCMessage[]>('get_addresses');
88
+
return addresses.map(x => x.address).filter(x => x.toLowerCase().includes(text.toLowerCase()));
89
+
}}
90
+
change={( text ) => {
91
+
let node = props.node()[0]!;
92
+
93
+
item.value = text;
94
+
node.onStaticsUpdate(node);
95
+
96
+
NodeManager.Instance.UpdateConfig();
97
+
}} />
98
+
</div>
99
+
</Match>
100
+
<Match when={item.type == NodeType.ParameterList}>
101
+
<div class="button" onClick={() => {
102
+
let popup = !popupOpen();
103
+
104
+
props.lockMovement(popup);
105
+
setPopupOpen(popup);
106
+
}}>
107
+
{ item.name }
108
+
</div>
109
+
<Show when={popupOpen()}>
110
+
<ParameterList
111
+
setPopupOpen={( open: boolean ) => {
112
+
setPopupOpen(open);
113
+
props.lockMovement(open);
114
+
}}
115
+
value={item.value}
116
+
changed={( value ) => {
117
+
let node = props.node()[0]!;
118
+
119
+
item.value = value;
120
+
node.onStaticsUpdate(node);
121
+
122
+
NodeManager.Instance.UpdateConfig();
123
+
}} />
124
+
</Show>
125
+
</Match>
126
+
</Switch>
127
+
</div>
128
+
)
129
+
}}
130
+
</For>
131
+
</div>
132
+
)
133
+
}
+85
src/components/ParameterList.css
+85
src/components/ParameterList.css
···
1
+
.parameter-list{
2
+
position: fixed;
3
+
z-index: 100;
4
+
top: 0;
5
+
left: 0;
6
+
width: 100vw;
7
+
height: 100vh;
8
+
background: rgba(0, 0, 0, 0.75);
9
+
}
10
+
11
+
.parameter-list-inner{
12
+
position: fixed;
13
+
top: 50%;
14
+
left: 50%;
15
+
transform: translate(-50%, -50%);
16
+
padding: 10px;
17
+
background: #373738;
18
+
border-radius: 10px;
19
+
width: 40%;
20
+
height: 80%;
21
+
}
22
+
23
+
.parameter-list-close{
24
+
width: 25px;
25
+
height: 43px;
26
+
display: flex;
27
+
justify-content: center;
28
+
align-items: center;
29
+
}
30
+
31
+
.parameter-list-header{
32
+
width: 100%;
33
+
height: 50px;
34
+
}
35
+
36
+
.parameter-list-content{
37
+
width: 100%;
38
+
height: calc(100% - 50px);
39
+
overflow-x: hidden;
40
+
overflow-y: auto;
41
+
}
42
+
43
+
.parameter-list-button-dropdown{
44
+
position: fixed;
45
+
padding: 5px 10px;
46
+
margin: 0 10px;
47
+
background: #445077;
48
+
border-radius: 5px;
49
+
transition: 0.1s;
50
+
cursor: pointer;
51
+
user-select: none;
52
+
transform: translate(0, 5px);
53
+
-webkit-user-select: none;
54
+
}
55
+
56
+
.parameter-list-button-dropdown > div{
57
+
transition: 0.1s;
58
+
}
59
+
60
+
.parameter-list-button-dropdown > div:hover{
61
+
color: #aaa;
62
+
}
63
+
64
+
.parameter-list-parameter{
65
+
display: inline-block;
66
+
padding: 5px 10px;
67
+
margin: 5px 0px 5px 10px;
68
+
background: #445077;
69
+
border-radius: 5px;
70
+
transition: 0.1s;
71
+
cursor: pointer;
72
+
user-select: none;
73
+
-webkit-user-select: none;
74
+
}
75
+
76
+
.parameter-list-parameter:hover{
77
+
background: #363f5e;
78
+
}
79
+
80
+
.parameter-list-parameter-delete{
81
+
padding: 0px 5px;
82
+
display: flex;
83
+
justify-content: center;
84
+
align-items: center;
85
+
}
+74
src/components/ParameterList.tsx
+74
src/components/ParameterList.tsx
···
1
+
import { createSignal, For, Show } from 'solid-js';
2
+
import './ParameterList.css';
3
+
4
+
export interface ParameterListProps{
5
+
setPopupOpen: ( open: boolean ) => void
6
+
value: { type: string, desc: string }[],
7
+
changed: ( value: { type: string, desc: string }[] ) => void
8
+
}
9
+
10
+
export let ParameterList = ( props: ParameterListProps ) => {
11
+
let [ parameters, setParameters ] = createSignal<{ type: string, desc: string }[]>(props.value, { equals: false });
12
+
let [ addParametersOpen, setAddParametersOpen ] = createSignal(false);
13
+
14
+
return (
15
+
<div class="parameter-list">
16
+
<div class="parameter-list-inner">
17
+
<div class="parameter-list-header">
18
+
<h1 style={{ float: 'left' }}>Parameter List</h1>
19
+
<div style={{ float: 'right' }} class="parameter-list-close">
20
+
<div style={{ background: 'red', width: '25px', height: '25px', cursor: 'pointer' }} onClick={() => props.setPopupOpen(false)}></div>
21
+
</div>
22
+
</div>
23
+
<div class="parameter-list-content">
24
+
<For each={parameters()}>
25
+
{ ( i, index ) => <div style={{ display: 'flex' }}>
26
+
<div class="parameter-list-parameter">{ i.desc === "" ? i.type : i.desc + ` ${i.type}` }</div>
27
+
<div class="parameter-list-parameter parameter-list-parameter-delete" onClick={() => {
28
+
let params = parameters();
29
+
params.splice(index(), 1);
30
+
31
+
setParameters(params);
32
+
props.changed(params);
33
+
}}>
34
+
<img src="/assets/icons/trash-can-solid-full.svg" width="20" />
35
+
</div>
36
+
</div>}
37
+
</For>
38
+
<div class="button" onClick={() => { setAddParametersOpen(!addParametersOpen()) }}>Add Parameter + </div>
39
+
<Show when={addParametersOpen()}>
40
+
<div class="parameter-list-button-dropdown">
41
+
<div onClick={() => {
42
+
setAddParametersOpen(false);
43
+
44
+
let params = parameters();
45
+
params.push({ type: 'Float', desc: '' });
46
+
47
+
setParameters(params);
48
+
props.changed(params);
49
+
}}>Float Parameter</div>
50
+
<div onClick={() => {
51
+
setAddParametersOpen(false);
52
+
53
+
let params = parameters();
54
+
params.push({ type: 'Int', desc: '' });
55
+
56
+
setParameters(params);
57
+
props.changed(params);
58
+
}}>Integer Parameter</div>
59
+
<div onClick={() => {
60
+
setAddParametersOpen(false);
61
+
62
+
let params = parameters();
63
+
params.push({ type: 'Boolean', desc: '' });
64
+
65
+
setParameters(params);
66
+
props.changed(params);
67
+
}}>Boolean Parameter</div>
68
+
</div>
69
+
</Show>
70
+
</div>
71
+
</div>
72
+
</div>
73
+
)
74
+
}
+41
src/components/SettingsMenu.css
+41
src/components/SettingsMenu.css
···
1
+
.settings-menu{
2
+
position: fixed;
3
+
z-index: 110;
4
+
top: 0;
5
+
left: 0;
6
+
width: 100vw;
7
+
height: 100vh;
8
+
background: rgba(0, 0, 0, 0.75);
9
+
}
10
+
11
+
.settings-menu-inner{
12
+
position: fixed;
13
+
top: 50%;
14
+
left: 50%;
15
+
transform: translate(-50%, -50%);
16
+
padding: 10px;
17
+
background: #373738;
18
+
border-radius: 10px;
19
+
width: 40%;
20
+
height: 80%;
21
+
}
22
+
23
+
.settings-menu-close{
24
+
width: 25px;
25
+
height: 43px;
26
+
display: flex;
27
+
justify-content: center;
28
+
align-items: center;
29
+
}
30
+
31
+
.settings-menu-header{
32
+
width: 100%;
33
+
height: 50px;
34
+
}
35
+
36
+
.settings-menu-content{
37
+
width: 100%;
38
+
height: calc(100% - 50px);
39
+
overflow-x: hidden;
40
+
overflow-y: auto;
41
+
}
+35
src/components/SettingsMenu.tsx
+35
src/components/SettingsMenu.tsx
···
1
+
import { invoke } from '@tauri-apps/api/core';
2
+
import './SettingsMenu.css';
3
+
4
+
export interface SettingsMenuProps{
5
+
close: () => void
6
+
}
7
+
8
+
export let SettingsMenu = ( props: SettingsMenuProps ) => {
9
+
// TODO: Changable OSC Ports
10
+
// TODO: Changable keybinds
11
+
12
+
return (
13
+
<>
14
+
<div class="settings-menu">
15
+
<div class="settings-menu-inner">
16
+
<div class="settings-menu-header">
17
+
<h1 style={{ float: 'left' }}>Options</h1>
18
+
<div style={{ float: 'right' }} class="settings-menu-close">
19
+
<div style={{ background: 'red', width: '25px', height: '25px', cursor: 'pointer' }} onClick={() => props.close()}></div>
20
+
</div>
21
+
</div>
22
+
23
+
<div class="settings-menu-content">
24
+
Hide editor on app start:
25
+
<input
26
+
ref={async ( el ) => el.checked = await invoke('get_hide_editor_on_app_start')}
27
+
onChange={( el ) => invoke('set_hide_editor_on_app_start', { value: el.target.checked })}
28
+
type="checkbox"
29
+
style={{ width: '15px', height: '15px' }} />
30
+
</div>
31
+
</div>
32
+
</div>
33
+
</>
34
+
)
35
+
}
+127
src/components/TabMenu.css
+127
src/components/TabMenu.css
···
1
+
.tab-menu{
2
+
position: fixed;
3
+
top: 70px;
4
+
left: 20px;
5
+
width: 200px;
6
+
z-index: 100;
7
+
height: calc(100vh - 100px);
8
+
background: #272e44;
9
+
border-radius: 20px;
10
+
padding: 5px;
11
+
overflow-x: hidden;
12
+
overflow-y: auto;
13
+
}
14
+
15
+
.tab-container{
16
+
height: calc(100% - 35px);
17
+
overflow: auto;
18
+
mask-image: linear-gradient(to bottom, #000 90%, #0000);
19
+
padding-bottom: 25px;
20
+
}
21
+
22
+
.tab{
23
+
border-radius: 10px;
24
+
padding: 8px 10px;
25
+
background: #fff0;
26
+
margin: 5px;
27
+
font-size: 14px;
28
+
transition: 0.5s;
29
+
user-select: none;
30
+
-webkit-user-select: none;
31
+
display: flex;
32
+
color: #cfcfcf;
33
+
}
34
+
35
+
.tab:hover{
36
+
background: #fff1;
37
+
}
38
+
39
+
.tab-selected{
40
+
border-radius: 10px;
41
+
padding: 8px 10px;
42
+
margin: 5px;
43
+
font-size: 14px;
44
+
transition: 0.5s;
45
+
user-select: none;
46
+
-webkit-user-select: none;
47
+
display: flex;
48
+
color: #cfcfcf;
49
+
background: #fff4;
50
+
}
51
+
52
+
.tab-selected > .tab-close{
53
+
opacity: 1;
54
+
}
55
+
56
+
.tab:hover > .tab-close{
57
+
opacity: 1;
58
+
}
59
+
60
+
.tab-meta{
61
+
width: calc(100% - 40px);
62
+
transform: translateY(1px);
63
+
display: flex;
64
+
align-items: center;
65
+
}
66
+
67
+
.tab-meta-input{
68
+
color: #cfcfcf;
69
+
font-size: 14px;
70
+
width: 120px;
71
+
background: none;
72
+
outline: none;
73
+
border: none;
74
+
transform: translateY(-1px);
75
+
}
76
+
77
+
.tab-close{
78
+
opacity: 0;
79
+
width: 20px;
80
+
height: 20px;
81
+
display: flex;
82
+
align-items: center;
83
+
justify-content: center;
84
+
border-radius: 5px;
85
+
}
86
+
87
+
.tab-close:hover{
88
+
background: #fff3;
89
+
}
90
+
91
+
.tab-icon{
92
+
width: 20px;
93
+
height: 20px;
94
+
display: flex;
95
+
align-items: center;
96
+
justify-content: left;
97
+
}
98
+
99
+
.tab-new-dropdown{
100
+
position: absolute;
101
+
width: 180px;
102
+
transform: translate(-10px, 35px);
103
+
border-radius: 10px;
104
+
background: #fff1;
105
+
}
106
+
107
+
.tab-icon-bar{
108
+
height: 30px;
109
+
margin: 0 5px;
110
+
display: flex;
111
+
justify-content: left;
112
+
align-items: center;
113
+
}
114
+
115
+
.tab-icon-bar img{
116
+
padding: 3px;
117
+
border-radius: 5px;
118
+
transition: 0.1s;
119
+
background: transparent;
120
+
cursor: pointer;
121
+
user-select: none;
122
+
-webkit-user-select: none;
123
+
}
124
+
125
+
.tab-icon-bar img:hover{
126
+
background: #fff2;
127
+
}
+96
src/components/TabMenu.tsx
+96
src/components/TabMenu.tsx
···
1
+
import './TabMenu.css';
2
+
3
+
import { createSignal, For, onMount, Show } from 'solid-js';
4
+
import { NodeManager } from '../Mangers/NodeManager';
5
+
import { Tab } from '../structs/Tab';
6
+
import { SettingsMenu } from './SettingsMenu';
7
+
import { openUrl } from '@tauri-apps/plugin-opener';
8
+
9
+
export let TabMenu = () => {
10
+
let [ tabImportOpen, setTabImportOpen ] = createSignal(false);
11
+
let [ tabs, setTabs ] = createSignal<Tab[]>([], { equals: false });
12
+
13
+
let [ settingsOpen, setSettingsOpen ] = createSignal(false);
14
+
15
+
let closeTabImportMenu = () => {
16
+
window.removeEventListener('click', closeTabImportMenu);
17
+
setTabImportOpen(false);
18
+
}
19
+
20
+
onMount(() => {
21
+
NodeManager.Instance.HookTabUpdate(setTabs);
22
+
});
23
+
24
+
return (
25
+
<>
26
+
<Show when={settingsOpen()}>
27
+
<SettingsMenu close={() => setSettingsOpen(false)} />
28
+
</Show>
29
+
30
+
<div class="tab-menu">
31
+
<div class="tab-container">
32
+
<For each={Object.values(tabs())}>
33
+
{
34
+
tab =>
35
+
<div class={ tab.selected() ? 'tab-selected ' : 'tab' } onClick={() => {
36
+
NodeManager.Instance.SelectTab(tab.id);
37
+
}}>
38
+
<div class="tab-icon" onClick={async () => {
39
+
if(tab.selected()){
40
+
NodeManager.Instance.SaveTab(tab);
41
+
}
42
+
}}>
43
+
<Show when={tab.selected() && tab.needsSave()} fallback={
44
+
<img src="/assets/icons/pen-to-square-regular-full.svg" width="15" />
45
+
}>
46
+
<img src="/assets/icons/floppy-disk-solid-full.svg" width="15" />
47
+
</Show>
48
+
49
+
</div>
50
+
<div class="tab-meta" onDblClick={( e ) => {
51
+
let input = <input class="tab-meta-input" value={ e.target.innerHTML } /> as HTMLInputElement;
52
+
53
+
e.target.innerHTML = '';
54
+
e.target.appendChild(input);
55
+
56
+
input.select();
57
+
input.onchange = () => {
58
+
NodeManager.Instance.RenameTab(tab.id, input.value);
59
+
e.target.innerHTML = input.value;
60
+
}
61
+
}}>{ tab.name }</div>
62
+
<div class="tab-close" onClick={() => {
63
+
setTimeout(() => {
64
+
NodeManager.Instance.CloseTab(tab.id);
65
+
}, 50)
66
+
}}><img src="/assets/icons/xmark-solid-full.svg" width="12" /></div>
67
+
</div>
68
+
}
69
+
</For>
70
+
71
+
<div class="tab" onClick={() => {
72
+
NodeManager.Instance.AddTab("Untitled");
73
+
}} onContextMenu={( e ) => {
74
+
e.preventDefault();
75
+
setTabImportOpen(true);
76
+
77
+
window.addEventListener('click', closeTabImportMenu);
78
+
}}>
79
+
<div class="tab-new-dropdown" style={{ display: tabImportOpen() ? 'block' : 'none' }}>
80
+
<div class="tab">Import from file</div>
81
+
<div class="tab">Import from URL</div>
82
+
</div>
83
+
<div class="tab-icon"><img src="/assets/icons/plus-solid-full.svg" width="15" /></div>
84
+
<div class="tab-meta">New Tab</div>
85
+
</div>
86
+
</div>
87
+
88
+
<div class="tab-icon-bar">
89
+
<img src="/assets/icons/gear-solid-full.svg" width="25" onClick={() => setSettingsOpen(true)} />
90
+
<div style={{ width: 'calc(100% - 50px)' }}></div>
91
+
<img src="/assets/icons/circle-info-solid-full.svg" width="25" onClick={() => openUrl('https://github.com/phaze-the-dumb/VRCMacros/wiki')} />
92
+
</div>
93
+
</div>
94
+
</>
95
+
)
96
+
}
+49
src/components/TextInput.css
+49
src/components/TextInput.css
···
1
+
input[type="text"]{
2
+
outline: none;
3
+
background: none;
4
+
border: none;
5
+
border-bottom: 2px solid #525252;
6
+
font-size: 15px;
7
+
font-family: Rubik, 'Courier New';
8
+
color: #fff;
9
+
width: 400px;
10
+
}
11
+
12
+
input[type="number"]{
13
+
outline: none;
14
+
background: none;
15
+
border: none;
16
+
border-bottom: 2px solid #525252;
17
+
font-size: 15px;
18
+
font-family: Rubik, 'Courier New';
19
+
color: #fff;
20
+
width: 400px;
21
+
}
22
+
23
+
div[input-dropdown]{
24
+
position: absolute;
25
+
width: fit-content;
26
+
27
+
margin-top: 5px;
28
+
padding: 10px;
29
+
float: left;
30
+
border-radius: 5px;
31
+
32
+
max-height: 300px;
33
+
overflow-y: auto;
34
+
35
+
background: #525252;
36
+
z-index: 50;
37
+
}
38
+
39
+
div[input-dropdown] > div{
40
+
transition: 0.25s;
41
+
}
42
+
43
+
div[input-dropdown] > div:hover{
44
+
color: #aaa;
45
+
}
46
+
47
+
.suggestion-selected{
48
+
color: #aaa;
49
+
}
+110
src/components/TextInput.tsx
+110
src/components/TextInput.tsx
···
1
+
import './TextInput.css';
2
+
3
+
import { createSignal, For, Show } from "solid-js"
4
+
5
+
export interface TextInputProps{
6
+
placeholder: string,
7
+
value?: string,
8
+
requestSuggestions?: ( text: string ) => Promise<string[]>,
9
+
change?: ( text: string ) => void
10
+
}
11
+
12
+
export let TextInput = ( props: TextInputProps ) => {
13
+
let [ suggestionsOpen, setSuggestionsOpen ] = createSignal(false);
14
+
let [ suggestions, setSuggestions ] = createSignal<string[]>([])
15
+
16
+
let input!: HTMLInputElement;
17
+
18
+
let suggestionsContainer!: HTMLDivElement;
19
+
let suggestionsIndex = 0;
20
+
21
+
let onInput = async () => {
22
+
let s = null;
23
+
24
+
if(props.requestSuggestions){
25
+
s = await props.requestSuggestions(input.value);
26
+
27
+
if(s != suggestions()){
28
+
setSuggestions(s);
29
+
30
+
let open = s !== null && s.length > 0 && input.value.length > 0;
31
+
32
+
setSuggestionsOpen(open);
33
+
if(open)changeSelection(() => { suggestionsIndex = 0; });
34
+
}
35
+
}
36
+
}
37
+
38
+
let onKeyDown = ( ev: KeyboardEvent ) => {
39
+
switch(ev.key){
40
+
case 'ArrowDown':
41
+
changeSelection(() => {
42
+
suggestionsIndex++;
43
+
if(suggestionsIndex >= suggestionsContainer.children.length)suggestionsIndex = suggestionsContainer.children.length - 1;
44
+
});
45
+
break;
46
+
case 'ArrowUp':
47
+
changeSelection(() => {
48
+
suggestionsIndex--;
49
+
if(suggestionsIndex < 0)suggestionsIndex = 0;
50
+
});
51
+
break;
52
+
case 'Enter':
53
+
let currentDiv = suggestionsContainer.children[suggestionsIndex];
54
+
if(currentDiv)input.value = currentDiv.innerHTML;
55
+
56
+
props.change ? props.change(input.value) : null
57
+
setSuggestionsOpen(false);
58
+
break;
59
+
}
60
+
}
61
+
62
+
let changeSelection = ( cb: () => void ) => {
63
+
for(let child of suggestionsContainer.children)
64
+
child.classList.remove('suggestion-selected');
65
+
66
+
cb();
67
+
68
+
let height = suggestionsIndex * 19;
69
+
suggestionsContainer.scrollTo(0, height - 150);
70
+
71
+
let currentDiv = suggestionsContainer.children[suggestionsIndex];
72
+
if(currentDiv)currentDiv.classList.add('suggestion-selected');
73
+
}
74
+
75
+
return (
76
+
<>
77
+
<div style={{ width: '100%' }}>
78
+
<input
79
+
style={{ width: '100%' }}
80
+
type="text"
81
+
placeholder={ props.placeholder }
82
+
value={ props.value || "" }
83
+
onChange={() => props.change ? props.change(input.value) : null}
84
+
onInput={onInput}
85
+
onKeyDown={onKeyDown}
86
+
onFocusOut={() => setTimeout(() => {
87
+
setSuggestionsOpen(false);
88
+
suggestionsIndex = -1;
89
+
}, 100)}
90
+
ref={input} />
91
+
92
+
<Show when={suggestionsOpen()}>
93
+
<div input-dropdown ref={suggestionsContainer}>
94
+
<For each={suggestions()}>
95
+
{ item => <div onClick={( el ) => {
96
+
let thisEl = el.target;
97
+
98
+
input.value = thisEl.innerHTML;
99
+
setSuggestionsOpen(false);
100
+
101
+
props.change ? props.change(input.value) : null
102
+
suggestionsIndex = -1;
103
+
}}>{ item }</div> }
104
+
</For>
105
+
</div>
106
+
</Show>
107
+
</div>
108
+
</>
109
+
)
110
+
}
+7
-1
src/index.tsx
+7
-1
src/index.tsx
···
2
2
import { render } from "solid-js/web";
3
3
import App from "./App";
4
4
5
-
render(() => <App />, document.getElementById("root") as HTMLElement);
5
+
import { NodeManager } from "./Mangers/NodeManager";
6
+
import { ConfirmationManager } from "./Mangers/ConfirmationManager";
7
+
8
+
new NodeManager();
9
+
new ConfirmationManager();
10
+
11
+
render(() => <App />, document.getElementById("root") as HTMLElement);
+94
src/keybinds.ts
+94
src/keybinds.ts
···
1
+
import { Accessor, Setter } from "solid-js";
2
+
import { NodeManager } from "./Mangers/NodeManager";
3
+
import { Node } from "./structs/node";
4
+
import { readText, writeText } from "@tauri-apps/plugin-clipboard-manager";
5
+
import { decodeNodeList, encodeNodeList } from "./utils/clipboard";
6
+
7
+
let isKeyDown: any = {};
8
+
9
+
export let load = ( canvas: HTMLCanvasElement, mousePos: Accessor<[ number, number ]>, selectedNode: Accessor<Node[]>, setSelectedNode: Setter<Node[]> ) => {
10
+
// TODO: Add undo / redo -ing
11
+
12
+
canvas.onkeydown = async ( e ) => {
13
+
switch(e.key){
14
+
case 'Delete':
15
+
let nodes = selectedNode();
16
+
for(let node of nodes){
17
+
node.inputs.map(input => {
18
+
input.connections.map(partner => {
19
+
partner.connections = partner.connections.filter(x => x != input);
20
+
})
21
+
})
22
+
23
+
node.outputs.map(output => {
24
+
output.connections.map(partner => {
25
+
partner.connections = partner.connections.filter(x => x != output);
26
+
})
27
+
})
28
+
29
+
NodeManager.Instance.RemoveNode(node);
30
+
}
31
+
32
+
setSelectedNode([]);
33
+
break;
34
+
}
35
+
}
36
+
37
+
window.onkeydown = async ( e ) => {
38
+
isKeyDown[e.key] = true;
39
+
40
+
switch(e.key){
41
+
case 's':
42
+
if(e.ctrlKey){
43
+
let currentTab = NodeManager.Instance.CurrentTab();
44
+
if(!currentTab)return;
45
+
46
+
// Save
47
+
NodeManager.Instance.SaveTab(currentTab);
48
+
}
49
+
break;
50
+
case 'S':
51
+
if(e.ctrlKey){
52
+
let currentTab = NodeManager.Instance.CurrentTab();
53
+
if(!currentTab)return;
54
+
55
+
// Save
56
+
NodeManager.Instance.SaveTab(currentTab, true);
57
+
}
58
+
break;
59
+
case 'c':
60
+
if(e.ctrlKey){
61
+
let nodes = selectedNode();
62
+
await writeText(encodeNodeList(nodes, mousePos()));
63
+
}
64
+
break;
65
+
case 'v':
66
+
if(e.ctrlKey){
67
+
let text = await readText();
68
+
69
+
let nodes = await decodeNodeList(text, mousePos());
70
+
if(!nodes)return;
71
+
72
+
for(let node of nodes)
73
+
NodeManager.Instance.AddNode(node);
74
+
75
+
setSelectedNode(nodes);
76
+
}
77
+
break;
78
+
case 'z':
79
+
if(e.ctrlKey){
80
+
console.log('undo');
81
+
}
82
+
break;
83
+
case 'y':
84
+
if(e.ctrlKey){
85
+
console.log('redo');
86
+
}
87
+
break;
88
+
}
89
+
}
90
+
91
+
window.onkeyup = ( e ) => {
92
+
isKeyDown[e.key] = false;
93
+
}
94
+
}
+295
src/renderer.ts
+295
src/renderer.ts
···
1
+
import { ContextMenu } from "./structs/ContextMenu";
2
+
import { Node, NodeIO, NodeIOLinkColours } from "./structs/node";
3
+
import { lerp } from "./utils/lerp";
4
+
5
+
export interface PositionInfo{
6
+
x: number,
7
+
y: number,
8
+
scale: number
9
+
}
10
+
11
+
const GRID_SIZE = 50;
12
+
13
+
export let renderBackgroundGrid = (
14
+
canvas: HTMLCanvasElement,
15
+
ctx: CanvasRenderingContext2D,
16
+
position: PositionInfo
17
+
) => {
18
+
let offsetX = position.x % 50;
19
+
let offsetY = position.y % 50;
20
+
21
+
let gridAmountX = canvas.width / (GRID_SIZE * position.scale);
22
+
let gridAmountY = canvas.height / (GRID_SIZE * position.scale);
23
+
24
+
ctx.fillStyle = '#fff1';
25
+
26
+
for (let x = 0; x < gridAmountX / 2; x++) {
27
+
for (let y = 0; y < gridAmountY / 2; y++) {
28
+
ctx.fillRect(
29
+
((x * GRID_SIZE) + offsetX) * position.scale,
30
+
((y * GRID_SIZE) + offsetY) * position.scale,
31
+
5 * position.scale, 5 * position.scale);
32
+
33
+
ctx.fillRect(
34
+
(((x + 1) * GRID_SIZE) - offsetX) * -position.scale,
35
+
((y * GRID_SIZE) + offsetY) * position.scale,
36
+
5 * position.scale, 5 * position.scale);
37
+
38
+
ctx.fillRect(
39
+
((x * GRID_SIZE) + offsetX) * position.scale,
40
+
(((y + 1) * GRID_SIZE) - offsetY) * -position.scale,
41
+
5 * position.scale, 5 * position.scale);
42
+
43
+
ctx.fillRect(
44
+
(((x + 1) * GRID_SIZE) - offsetX) * -position.scale,
45
+
(((y + 1) * GRID_SIZE) - offsetY) * -position.scale,
46
+
5 * position.scale, 5 * position.scale);
47
+
}
48
+
}
49
+
}
50
+
51
+
export let renderNodes = (
52
+
canvas: HTMLCanvasElement,
53
+
ctx: CanvasRenderingContext2D,
54
+
nodes: Node[],
55
+
position: PositionInfo
56
+
) => {
57
+
let startX = canvas.width / -2;
58
+
let startY = canvas.height / -2;
59
+
60
+
ctx.textBaseline = 'top';
61
+
62
+
nodes.map(node => {
63
+
let nodeX = Math.round(node.x / 10) * 10;
64
+
let nodeY = Math.round(node.y / 10) * 10;
65
+
66
+
ctx.fillStyle = '#343742ff';
67
+
ctx.strokeStyle = node.selected ? '#004696ff' : '#fff0';
68
+
ctx.lineWidth = 5 * position.scale;
69
+
70
+
// Draw Node Box
71
+
drawRoundedRect(ctx,
72
+
(nodeX + startX + position.x) * position.scale,
73
+
(nodeY + startY + position.y) * position.scale,
74
+
node.w * position.scale,
75
+
node.h * position.scale,
76
+
10 * position.scale);
77
+
78
+
ctx.shadowColor = '#0005';
79
+
ctx.shadowBlur = 10;
80
+
81
+
ctx.stroke();
82
+
ctx.fill();
83
+
84
+
ctx.shadowBlur = 0;
85
+
86
+
// Draw Node Name
87
+
ctx.fillStyle = '#fff';
88
+
ctx.font = (25 * position.scale) + 'px Rubik';
89
+
ctx.textAlign = 'center';
90
+
91
+
ctx.fillText(node.name,
92
+
(nodeX + (node.w * 0.5) + startX + position.x) * position.scale,
93
+
(nodeY + 10 + startY + position.y) * position.scale
94
+
);
95
+
96
+
// Draw Inputs
97
+
ctx.font = (15 * position.scale) + 'px Rubik';
98
+
ctx.textAlign = 'left';
99
+
100
+
node.inputs.map(( input, i ) => {
101
+
ctx.fillStyle = NodeIOLinkColours(input);
102
+
103
+
ctx.beginPath();
104
+
ctx.arc(
105
+
(nodeX - 10 + startX + 10 + position.x) * position.scale,
106
+
(nodeY + 50 + (30 * i) + startY + 10 + position.y) * position.scale,
107
+
7 * position.scale,
108
+
0,
109
+
Math.PI * 2,
110
+
);
111
+
ctx.fill();
112
+
113
+
ctx.fillText(input.name,
114
+
(nodeX + 15 + startX + position.x) * position.scale,
115
+
(nodeY + 53 + (30 * i) + startY + position.y) * position.scale,
116
+
)
117
+
})
118
+
119
+
// Draw Outputs
120
+
ctx.textAlign = 'right';
121
+
122
+
node.outputs.map(( output, i ) => {
123
+
ctx.fillStyle = NodeIOLinkColours(output);
124
+
125
+
ctx.beginPath();
126
+
ctx.arc(
127
+
(nodeX + (node.w - 10) + startX + 10 + position.x) * position.scale,
128
+
(nodeY + 50 + (30 * i) + startY + 10 + position.y) * position.scale,
129
+
7 * position.scale,
130
+
0,
131
+
Math.PI * 2,
132
+
);
133
+
ctx.fill();
134
+
135
+
ctx.fillText(output.name,
136
+
(nodeX + (node.w - 15) + startX + position.x) * position.scale,
137
+
(nodeY + 53 + (30 * i) + startY + position.y) * position.scale,
138
+
)
139
+
})
140
+
})
141
+
142
+
nodes.map(node => {
143
+
let nodeX = Math.round(node.x / 10) * 10;
144
+
let nodeY = Math.round(node.y / 10) * 10;
145
+
146
+
node.outputs.map(( output, i ) => {
147
+
output.connections.map(partner => {
148
+
let x0 = (nodeX + (node.w - 10) + 10 + startX + position.x) * position.scale;
149
+
let y0 = (nodeY + 50 + (30 * i) + 10 + startY + position.y) * position.scale;
150
+
let x1 = ((Math.round(partner.parent.x / 10) * 10) + startX + position.x) * position.scale;
151
+
let y1 = ((Math.round(partner.parent.y / 10) * 10) + 60 + (30 * partner.index) + startY + position.y) * position.scale;
152
+
153
+
let colours = NodeIOLinkColours(output, partner);
154
+
let grad = ctx.createLinearGradient(x0, y0, x1, y1);
155
+
156
+
grad.addColorStop(0, colours[0]);
157
+
grad.addColorStop(1, colours[1]);
158
+
159
+
ctx.strokeStyle = grad;
160
+
ctx.lineWidth = 3 * position.scale;
161
+
162
+
drawCurve(ctx, x0, y0, x1, y1);
163
+
ctx.stroke();
164
+
})
165
+
})
166
+
})
167
+
}
168
+
169
+
export let renderContextMenu = (
170
+
ctx: CanvasRenderingContext2D,
171
+
contextMenu: ContextMenu
172
+
) => {
173
+
if(contextMenu.visible){
174
+
ctx.font = '20px Rubik';
175
+
ctx.textBaseline = 'top';
176
+
ctx.textAlign = 'left';
177
+
178
+
let widestItem = 0;
179
+
contextMenu.items.map(x => {
180
+
let width = ctx.measureText(x.text).width;
181
+
if(widestItem < width)widestItem = width;
182
+
});
183
+
184
+
contextMenu.size = [ widestItem + 20, 25 * contextMenu.items.length + 20 ]
185
+
186
+
drawRoundedRect(ctx, contextMenu.position[0], contextMenu.position[1], contextMenu.size[0], contextMenu.size[1], 10);
187
+
ctx.fillStyle = '#444';
188
+
ctx.fill();
189
+
190
+
let submenuToRender: any = null;
191
+
192
+
contextMenu.items.map((x, i) => {
193
+
ctx.fillStyle = x.hovered ? '#aaa' : '#fff';
194
+
ctx.fillText(x.text, contextMenu.position[0] + 10, contextMenu.position[1] + 10 + 25 * i);
195
+
196
+
if(x.hovered && x.menu){
197
+
submenuToRender = x.menu;
198
+
submenuToRender.position = [ contextMenu.position[0] + contextMenu.size[0] + 5, contextMenu.position[1] + 25 * i ];
199
+
}
200
+
});
201
+
202
+
if(submenuToRender){
203
+
renderContextMenu(ctx, submenuToRender);
204
+
}
205
+
}
206
+
}
207
+
208
+
export let renderTempDrawing = (
209
+
canvas: HTMLCanvasElement,
210
+
ctx: CanvasRenderingContext2D,
211
+
drawingTo: [ number, number ],
212
+
drawingFrom: NodeIO,
213
+
position: PositionInfo
214
+
) => {
215
+
let startX = canvas.width / -2;
216
+
let startY = canvas.height / -2;
217
+
218
+
// DEBUG STUFF
219
+
// ctx.fillStyle = '#f00';
220
+
221
+
// ctx.fillRect(
222
+
// (drawingTo[0] + 10 + startX + position.x) * position.scale,
223
+
// (drawingTo[1] + 10 + startY + position.y) * position.scale,
224
+
// 10, 10
225
+
// );
226
+
227
+
// ctx.fillRect(
228
+
// (drawingFrom.parent.x + (drawingFrom.parent.w - 10) + 10 + startX + position.x) * position.scale,
229
+
// (drawingFrom.parent.y + 50 + (30 * drawingFrom.index) + 10 + startY + position.y) * position.scale,
230
+
// 10, 10
231
+
// );
232
+
233
+
ctx.strokeStyle = NodeIOLinkColours(drawingFrom);
234
+
ctx.lineWidth = 3 * position.scale;
235
+
236
+
let nodeX = Math.round(drawingFrom.parent.x / 10) * 10;
237
+
let nodeY = Math.round(drawingFrom.parent.y / 10) * 10;
238
+
239
+
drawCurve(ctx,
240
+
(nodeX + (drawingFrom.parent.w - 10) + 10 + startX + position.x) * position.scale,
241
+
(nodeY + 50 + (30 * drawingFrom.index) + 10 + startY + position.y) * position.scale,
242
+
(drawingTo[0] + 10 + startX + position.x) * position.scale,
243
+
(drawingTo[1] + 10 + startY + position.y) * position.scale,
244
+
);
245
+
ctx.stroke();
246
+
}
247
+
248
+
let drawCurve = ( ctx: CanvasRenderingContext2D, fromX: number, fromY: number, toX: number, toY: number ) => {
249
+
ctx.beginPath();
250
+
251
+
let bias = Math.sqrt(( fromX - toX ) * ( fromX - toX ) + ( fromY - toY ) * ( fromY - toY )) / 3;
252
+
253
+
let start = [ fromX + bias, fromY ];
254
+
let end = [ toX - bias, toY ];
255
+
256
+
let midpoint = [
257
+
lerp(start[0], end[0], 0.5),
258
+
lerp(start[1], end[1], 0.5)
259
+
];
260
+
261
+
ctx.bezierCurveTo(fromX, fromY, start[0], start[1], midpoint[0], midpoint[1]);
262
+
ctx.bezierCurveTo(midpoint[0], midpoint[1], end[0], end[1], toX, toY);
263
+
}
264
+
265
+
export let renderNullTab = (
266
+
canvas: HTMLCanvasElement,
267
+
ctx: CanvasRenderingContext2D,
268
+
) => {
269
+
ctx.fillStyle = '#fff';
270
+
271
+
ctx.font = '20px Rubik';
272
+
ctx.textBaseline = 'middle';
273
+
ctx.textAlign = 'center';
274
+
275
+
let textX = lerp((canvas.width / -2) + 200, canvas.width / 2, 0.5);
276
+
let textY = lerp((canvas.height / -2) + 40, canvas.height / 2, 0.5);
277
+
278
+
ctx.font = '40px Rubik';
279
+
ctx.fillText('Welcome to VRCMacros', textX, textY);
280
+
281
+
ctx.font = '20px Rubik';
282
+
ctx.fillText('Create a new tab to get started!', textX, textY + 40);
283
+
}
284
+
285
+
let drawRoundedRect = ( ctx: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, radius: number ) => {
286
+
ctx.beginPath();
287
+
ctx.arc(x + radius, y + radius, radius, Math.PI, Math.PI * 1.5);
288
+
ctx.lineTo(x + w - radius, y);
289
+
ctx.arc(x + w - radius, y + radius, radius, Math.PI * 1.5, 0);
290
+
ctx.lineTo(x + w, y + h - radius);
291
+
ctx.arc(x + w - radius, y + h - radius, radius, 0, Math.PI * 0.5);
292
+
ctx.lineTo(x + radius, y + h);
293
+
ctx.arc(x + radius, y + h - radius, radius, Math.PI * 0.5, Math.PI);
294
+
ctx.closePath();
295
+
}
+16
src/structs/ContextMenu.ts
+16
src/structs/ContextMenu.ts
···
1
+
import { PositionInfo } from "../renderer";
2
+
import { Node } from "./node";
3
+
4
+
export interface ContextMenuItem{
5
+
text: string,
6
+
hovered: boolean,
7
+
clicked?: ( e: MouseEvent, canvas: HTMLCanvasElement, pos: PositionInfo, clickedNode?: Node ) => void,
8
+
menu?: ContextMenu
9
+
}
10
+
11
+
export interface ContextMenu{
12
+
items: ContextMenuItem[];
13
+
position: [ number, number ];
14
+
size: [ number, number ];
15
+
visible: boolean;
16
+
}
+9
src/structs/OscMessage.ts
+9
src/structs/OscMessage.ts
+17
src/structs/Tab.ts
+17
src/structs/Tab.ts
···
1
+
import { Accessor, Setter } from "solid-js";
2
+
import { Node } from "./node";
3
+
4
+
export interface Tab{
5
+
name: string,
6
+
id: string,
7
+
nodes: Node[],
8
+
saveLocation: string | null,
9
+
10
+
selected: Accessor<boolean>,
11
+
setSelected: Setter<boolean>
12
+
13
+
needsSave: Accessor<boolean>,
14
+
setNeedsSave: Setter<boolean>,
15
+
16
+
needSync: boolean
17
+
}
+163
src/structs/node.ts
+163
src/structs/node.ts
···
1
+
import { NodeDefinition } from "../Nodes/Nodes";
2
+
3
+
export class Node{
4
+
name: string;
5
+
id: string;
6
+
typeId: string;
7
+
x: number;
8
+
y: number;
9
+
w: number;
10
+
h: number;
11
+
inputs: NodeIO[];
12
+
outputs: NodeIO[];
13
+
selected: boolean;
14
+
statics: NodeStatic[];
15
+
onStaticsUpdate: ( node: Node ) => Promise<void>;
16
+
17
+
constructor( pos: [ number, number ], node: NodeDefinition, id: string ){
18
+
this.name = node.name;
19
+
this.id = id;
20
+
this.typeId = node.typeId!;
21
+
this.x = pos[0];
22
+
this.y = pos[1];
23
+
24
+
this.inputs = node.inputs ? node.inputs.map(( x, indx ) => {
25
+
return {
26
+
name: x.name,
27
+
type: x.type,
28
+
connections: [],
29
+
parent: this,
30
+
index: indx
31
+
}
32
+
}) : [];
33
+
34
+
this.outputs = node.outputs ? node.outputs.map(( x, indx ) => {
35
+
return {
36
+
name: x.name,
37
+
type: x.type,
38
+
connections: [],
39
+
parent: this,
40
+
index: indx
41
+
}
42
+
}) : [];
43
+
44
+
this.w = node.w || 200;
45
+
this.h = 50 + Math.max(this.outputs.length, this.inputs.length) * 30;
46
+
47
+
this.selected = false;
48
+
this.statics = node.statics!,
49
+
this.onStaticsUpdate = node.onStaticsUpdate!;
50
+
}
51
+
52
+
updateSize(){
53
+
this.h = 50 + Math.max(this.outputs.length, this.inputs.length) * 30;
54
+
}
55
+
}
56
+
57
+
export interface NodeIO{
58
+
name: string,
59
+
type: NodeType,
60
+
connections: NodeIO[],
61
+
parent: Node,
62
+
index: number
63
+
}
64
+
65
+
export enum NodeType{
66
+
Label = 0,
67
+
68
+
String = 1,
69
+
Float = 2,
70
+
Int = 3,
71
+
Boolean = 4,
72
+
Flow = 5,
73
+
74
+
AnyTypeA = 6,
75
+
AnyTypeB = 7,
76
+
AnyTypeC = 8,
77
+
78
+
OSCAddress = 9,
79
+
ParameterList = 10
80
+
}
81
+
82
+
let NodeIOCastTable: any = {
83
+
1: { 2: true, 3: true, 4: true }, // Strings -> Floats, Ints, Bools
84
+
2: { 1: true, 3: true }, // Floats -> Strings, Ints
85
+
3: { 1: true, 2: true, 4: true }, // Ints -> Strings, Floats, Bools
86
+
4: { 1: true, 2: true, 3: true } // Bools -> Strings, Ints, Floats
87
+
};
88
+
89
+
export let NodeIOCanCast = ( input: NodeType | null, output: NodeType | null ): boolean => {
90
+
if(input === output)return true;
91
+
if(!input || !output)return false;
92
+
93
+
let CastFrom = NodeIOCastTable[input];
94
+
if(!CastFrom)return false;
95
+
96
+
let CastTo = CastFrom[output];
97
+
if(!CastTo)return false;
98
+
99
+
return true;
100
+
}
101
+
102
+
export let NodeIOResolveAnyTypes = ( nodeio: NodeIO ): NodeType | null => {
103
+
if(nodeio.type > 0 && nodeio.type < 6){
104
+
// It's a base type
105
+
return nodeio.type;
106
+
}
107
+
108
+
// It's an "AnyType" value and we should resolve it,
109
+
// it also means it's an input as "AnyType" is not valid on outputs
110
+
let type = nodeio.type;
111
+
112
+
// Check if we have any connections
113
+
if(nodeio.connections.length > 0){
114
+
// We do, lets copy the type of the first input
115
+
return nodeio.connections[0].type;
116
+
}
117
+
118
+
// Check if there are any others of the same "AnyType"
119
+
let other = nodeio.parent.inputs.filter(x => x !== nodeio).find(x => x.type === type);
120
+
if(other){
121
+
// There are others with the same type, lets copy that type
122
+
// Does other have any connections
123
+
124
+
if(other.connections.length > 0){
125
+
return other.connections[0].type;
126
+
}
127
+
}
128
+
129
+
// We can't resolve it yet
130
+
return null;
131
+
}
132
+
133
+
export let NodeIOLinkColours = ( nodeio: NodeIO, output?: NodeIO ) => {
134
+
let cols: any = {
135
+
1: '#ffff9f',
136
+
2: '#cda0cb',
137
+
3: '#7ecaca',
138
+
4: '#8bc0a2',
139
+
5: '#edeae3'
140
+
}
141
+
142
+
let type = NodeIOResolveAnyTypes(nodeio);
143
+
if(output){
144
+
let outputType = NodeIOResolveAnyTypes(output);
145
+
let startType = type ? cols[type] : '#fff5';
146
+
147
+
if(type !== outputType){
148
+
let endType = outputType ? cols[outputType] : '#fff5';
149
+
150
+
return [ startType, endType ];
151
+
} else{
152
+
return [ startType, startType ];
153
+
}
154
+
}
155
+
156
+
return type ? cols[type] : '#fff5';
157
+
}
158
+
159
+
export interface NodeStatic{
160
+
name: string,
161
+
type: NodeType,
162
+
value: any
163
+
}
+80
src/utils/clipboard.ts
+80
src/utils/clipboard.ts
···
1
+
import { NodeManager } from "../Mangers/NodeManager";
2
+
import { NodesByID } from "../Nodes/Nodes";
3
+
import { Node } from "../structs/node";
4
+
5
+
export let encodeNodeList = ( selectedNodes: Node[], mousePos: [ number, number ] ): string => {
6
+
let arr: any[] = [];
7
+
8
+
for(let node of selectedNodes){
9
+
arr.push({
10
+
id: node.id,
11
+
type_id: node.typeId,
12
+
statics: node.statics,
13
+
x: node.x - mousePos[0],
14
+
y: node.y - mousePos[1],
15
+
outputs: node.outputs.map(x => {
16
+
return x.connections.map(x => {
17
+
return { node: x.parent.id, index: x.index } }) })
18
+
})
19
+
}
20
+
21
+
for(let node of arr){
22
+
for(let output of node.outputs){
23
+
for(let i in output){
24
+
let indx = arr.findIndex(x => x.id === output[i].node);
25
+
if(indx === -1)
26
+
delete output[i];
27
+
else
28
+
output[i].node = indx;
29
+
}
30
+
}
31
+
}
32
+
33
+
for(let node of arr)delete node.id;
34
+
35
+
console.log(arr);
36
+
return 'VRCMACRO' + btoa(JSON.stringify(arr));
37
+
}
38
+
39
+
export let decodeNodeList = async ( text: string, mousePos: [ number, number ] ): Promise<Node[] | null> => {
40
+
if(!text.startsWith("VRCMACRO"))return null;
41
+
42
+
let data = text.slice(8);
43
+
let json = JSON.parse(atob(data));
44
+
45
+
let nodes: Node[] = [];
46
+
for(let node of json){
47
+
let n = new Node(
48
+
[ node.x + mousePos[0] + 10, node.y + mousePos[1] + 10 ],
49
+
NodesByID[node.type_id],
50
+
await NodeManager.Instance.GetNewNodeId()
51
+
);
52
+
53
+
n.statics = node.statics;
54
+
await n.onStaticsUpdate(n);
55
+
56
+
nodes.push(n);
57
+
}
58
+
59
+
for(let i in nodes){
60
+
let outputs: { node: number, index: number }[][] = json[i].outputs;
61
+
let node = nodes[i];
62
+
63
+
for(let j in outputs){
64
+
let output = node.outputs[j];
65
+
66
+
for(let k in outputs[j]){
67
+
let connection = outputs[j][k];
68
+
if(!connection)continue;
69
+
70
+
let peerNode = nodes[connection.node];
71
+
let input = peerNode.inputs[connection.index];
72
+
73
+
output.connections.push(input);
74
+
input.connections.push(output);
75
+
}
76
+
}
77
+
}
78
+
79
+
return nodes;
80
+
}
+40
src/utils/interections.ts
+40
src/utils/interections.ts
···
1
+
import { PositionInfo } from "../renderer";
2
+
3
+
export let screenToWorldSpace = ( canvas: HTMLCanvasElement, position: PositionInfo, pointX: number, pointY: number ): [ number, number ] => {
4
+
let startX = canvas.width / -2;
5
+
let startY = canvas.height / -2;
6
+
7
+
let worldX = ((pointX + startX) / position.scale) - position.x - startX;
8
+
let worldY = ((pointY + startY) / position.scale) - position.y - startY;
9
+
10
+
return [ worldX, worldY ];
11
+
}
12
+
13
+
export let isPointInRectApplyOffset = ( canvas: HTMLCanvasElement, position: PositionInfo, pointX: number, pointY: number, rectX: number, rectY: number, rectW: number, rectH: number ): boolean => {
14
+
let startX = canvas.width / -2;
15
+
let startY = canvas.height / -2;
16
+
17
+
let screenPointX = (pointX + startX);
18
+
let screenPointY = (pointY + startY);
19
+
20
+
let rectScreenX = (rectX + startX + position.x) * position.scale;
21
+
let rectScreenY = (rectY + startY + position.y) * position.scale;
22
+
let rectScreenW = rectW * position.scale;
23
+
let rectScreenH = rectH * position.scale;
24
+
25
+
return (
26
+
screenPointX > rectScreenX &&
27
+
screenPointX < rectScreenX + rectScreenW &&
28
+
screenPointY > rectScreenY &&
29
+
screenPointY < rectScreenY + rectScreenH
30
+
)
31
+
}
32
+
33
+
export let isPointInRect = ( canvas: HTMLCanvasElement, pointX: number, pointY: number, rectX: number, rectY: number, rectW: number, rectH: number ): boolean => {
34
+
return (
35
+
pointX > canvas.width / 2 + rectX &&
36
+
pointX < canvas.width / 2 + rectX + rectW &&
37
+
pointY > canvas.height / 2 + rectY &&
38
+
pointY < canvas.height / 2 + rectY + rectH
39
+
)
40
+
}
+1
src/utils/lerp.ts
+1
src/utils/lerp.ts
···
1
+
export let lerp = ( a: number, b: number, t: number ): number => a + ( b - a ) * t;
+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
-29
src-tauri/src/frontend_calls/get_actions.rs
-29
src-tauri/src/frontend_calls/get_actions.rs
···
1
-
use crate::structs::action::{ Action, ActionParameters };
2
-
3
-
#[tauri::command]
4
-
pub fn get_actions() -> Vec<Action> {
5
-
vec![
6
-
Action {
7
-
name: "If Equals".into(),
8
-
parameters: vec![ ActionParameters::AnyType, ActionParameters::Label(" = "), ActionParameters::AnyType ]
9
-
}
10
-
]
11
-
}
12
-
13
-
#[tauri::command]
14
-
pub fn get_action( name: String ) -> Option<Action> {
15
-
let actions = vec![
16
-
Action {
17
-
name: "If Equals".into(),
18
-
parameters: vec![ ActionParameters::AnyType, ActionParameters::Label(" = "), ActionParameters::AnyType ]
19
-
}
20
-
];
21
-
22
-
let action = actions.iter().find(| x | x.name == name);
23
-
24
-
if action.is_some(){
25
-
Some(action.unwrap().clone())
26
-
} else{
27
-
None
28
-
}
29
-
}
+4
-2
src-tauri/src/frontend_calls/get_addresses.rs
+4
-2
src-tauri/src/frontend_calls/get_addresses.rs
···
2
2
3
3
use tauri::State;
4
4
5
+
use crate::osc::OSCMessage;
6
+
5
7
#[tauri::command]
6
-
pub fn get_addresses( addresses: State<&Mutex<Vec<String>>> ) -> Vec<String> {
8
+
pub fn get_addresses(addresses: State<&Mutex<Vec<OSCMessage>>>) -> Vec<OSCMessage> {
7
9
let addresses = addresses.lock().unwrap();
8
10
addresses.clone()
9
-
}
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
-3
src-tauri/src/frontend_calls/mod.rs
+5
-3
src-tauri/src/frontend_calls/mod.rs
+17
src-tauri/src/frontend_calls/save_graph.rs
+17
src-tauri/src/frontend_calls/save_graph.rs
···
1
+
use std::{fs::File, io::Write, path::PathBuf};
2
+
3
+
use flate2::{write::GzEncoder, Compression};
4
+
use tauri::State;
5
+
6
+
use crate::utils::config::Config;
7
+
8
+
#[tauri::command]
9
+
pub fn save_graph(graph: String, path: PathBuf, conf: State<Config>) {
10
+
let file = File::create(&path).unwrap();
11
+
let mut encoder = GzEncoder::new(file, Compression::default());
12
+
13
+
encoder.write_all(graph.as_bytes()).unwrap();
14
+
encoder.finish().unwrap();
15
+
16
+
conf.save();
17
+
}
+15
src-tauri/src/frontend_calls/settings.rs
+15
src-tauri/src/frontend_calls/settings.rs
···
1
+
use tauri::State;
2
+
3
+
use crate::utils::config::Config;
4
+
5
+
#[tauri::command]
6
+
pub fn set_hide_editor_on_app_start(value: bool, conf: State<Config>) {
7
+
let mut config = conf.store.lock().unwrap();
8
+
config.hide_editor_on_start = value;
9
+
}
10
+
11
+
#[tauri::command]
12
+
pub fn get_hide_editor_on_app_start(conf: State<Config>) -> bool {
13
+
let config = conf.store.lock().unwrap();
14
+
config.hide_editor_on_start
15
+
}
+34
src-tauri/src/frontend_calls/sync_tab.rs
+34
src-tauri/src/frontend_calls/sync_tab.rs
···
1
+
use chrono::Utc;
2
+
use crossbeam_channel::Sender;
3
+
4
+
use tauri::State;
5
+
6
+
use crate::{runtime::commands::RuntimeCommand, structs::nodes::Node, utils::config::Config};
7
+
8
+
#[tauri::command]
9
+
pub fn sync_tab(
10
+
graph: Vec<Node>,
11
+
id: String,
12
+
name: String,
13
+
save_state: bool,
14
+
location: Option<String>,
15
+
cmd: State<Sender<RuntimeCommand>>,
16
+
conf: State<Config>,
17
+
) {
18
+
cmd
19
+
.send(RuntimeCommand::AddTab(graph.clone(), id.clone()))
20
+
.unwrap();
21
+
22
+
let mut config = conf.store.lock().unwrap();
23
+
config.loaded_tabs.insert(id, (graph, name, location, save_state));
24
+
25
+
conf.save_prelocked(config);
26
+
}
27
+
28
+
#[tauri::command]
29
+
pub fn discard_tab(id: String, cmd: State<Sender<RuntimeCommand>>, conf: State<Config>) {
30
+
cmd.send(RuntimeCommand::RemoveTab(id.clone())).unwrap();
31
+
32
+
let mut config = conf.store.lock().unwrap();
33
+
config.loaded_tabs.remove(&id);
34
+
}
-88
src-tauri/src/frontend_calls/triggers.rs
-88
src-tauri/src/frontend_calls/triggers.rs
···
1
-
use serde_json::{json, Value};
2
-
use tauri::State;
3
-
4
-
use crate::utils::config::Config;
5
-
6
-
#[tauri::command]
7
-
pub fn new_trigger( id: String, conf: State<Config> ){
8
-
if let Some(triggers) = conf.get("triggers").unwrap_or(Value::Array(Vec::new())).as_array(){
9
-
let mut triggers = triggers.clone();
10
-
triggers.push(json!({
11
-
"id": id,
12
-
"address": "",
13
-
"actions": []
14
-
}));
15
-
16
-
conf.set("triggers", Value::Array(triggers));
17
-
conf.save();
18
-
}
19
-
}
20
-
21
-
#[tauri::command]
22
-
pub fn rm_trigger( indx: usize, conf: State<Config> ){
23
-
if let Some(triggers) = conf.get("triggers").unwrap_or(Value::Array(Vec::new())).as_array(){
24
-
let mut triggers = triggers.clone();
25
-
triggers.remove(indx);
26
-
27
-
conf.set("triggers", Value::Array(triggers));
28
-
conf.save();
29
-
}
30
-
}
31
-
32
-
#[tauri::command]
33
-
pub fn add_trigger_action( indx: usize, action: Value, conf: State<Config> ){
34
-
if let Some(triggers) = conf.get("triggers").unwrap_or(Value::Array(Vec::new())).as_array(){
35
-
let mut triggers = triggers.clone();
36
-
37
-
let actions = triggers[indx]["actions"].as_array_mut().unwrap();
38
-
actions.push(action);
39
-
40
-
conf.set("triggers", Value::Array(triggers));
41
-
conf.save();
42
-
}
43
-
}
44
-
45
-
#[tauri::command]
46
-
pub fn rm_trigger_action( indx: usize, action_indx: usize, conf: State<Config> ){
47
-
if let Some(triggers) = conf.get("triggers").unwrap_or(Value::Array(Vec::new())).as_array(){
48
-
let mut triggers = triggers.clone();
49
-
50
-
let actions = triggers[indx]["actions"].as_array_mut().unwrap();
51
-
actions.remove(action_indx);
52
-
53
-
conf.set("triggers", Value::Array(triggers));
54
-
conf.save();
55
-
}
56
-
}
57
-
58
-
#[tauri::command]
59
-
pub fn set_trigger_action_type( indx: usize, action_indx: usize, action_type: Option<String>, conf: State<Config> ){
60
-
if let Some(triggers) = conf.get("triggers").unwrap_or(Value::Array(Vec::new())).as_array(){
61
-
let mut triggers = triggers.clone();
62
-
63
-
triggers[indx]["actions"][action_indx]["actionType"] = if action_type.is_none(){
64
-
Value::Null
65
-
} else {
66
-
Value::String(action_type.unwrap())
67
-
};
68
-
69
-
conf.set("triggers", Value::Array(triggers));
70
-
conf.save();
71
-
}
72
-
}
73
-
74
-
#[tauri::command]
75
-
pub fn set_trigger_address( indx: usize, address: String, conf: State<Config> ){
76
-
if let Some(triggers) = conf.get("triggers").unwrap_or(Value::Array(Vec::new())).as_array(){
77
-
let mut triggers = triggers.clone();
78
-
triggers[indx]["address"] = Value::String(address);
79
-
80
-
conf.set("triggers", Value::Array(triggers));
81
-
conf.save();
82
-
}
83
-
}
84
-
85
-
#[tauri::command]
86
-
pub fn list_triggers( conf: State<Config> ) -> Value{
87
-
conf.get("triggers").unwrap_or(Value::Array(Vec::new()))
88
-
}
+30
-21
src-tauri/src/lib.rs
+30
-21
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::{ 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(_) => {
···
29
31
let conf_file = container_folder.join("conf");
30
32
let conf = Config::new(conf_file);
31
33
32
-
static ADDRESSES: Mutex<Vec<String>> = Mutex::new(Vec::new());
34
+
static ADDRESSES: Mutex<Vec<OSCMessage>> = Mutex::new(Vec::new());
35
+
36
+
let mut addresses = ADDRESSES.lock().unwrap();
37
+
addresses.append(&mut vrchat_builtin_parameters::get_read_addresses());
38
+
drop(addresses);
39
+
40
+
let (runtime_sender, runtime_receiver) = bounded(1024);
33
41
34
42
tauri::Builder::default()
43
+
.plugin(tauri_plugin_os::init())
44
+
.plugin(tauri_plugin_clipboard_manager::init())
45
+
.plugin(tauri_plugin_dialog::init())
35
46
.plugin(tauri_plugin_opener::init())
36
47
.invoke_handler(tauri::generate_handler![
37
48
get_addresses::get_addresses,
38
-
get_actions::get_actions,
39
-
get_actions::get_action,
40
-
41
-
triggers::new_trigger,
42
-
triggers::rm_trigger,
43
-
triggers::add_trigger_action,
44
-
triggers::rm_trigger_action,
45
-
triggers::set_trigger_action_type,
46
-
triggers::set_trigger_address,
47
-
triggers::list_triggers,
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,
48
56
])
49
57
.manage(conf)
50
58
.manage(&ADDRESSES)
51
-
.setup(| app | {
52
-
setup(app, &ADDRESSES);
59
+
.manage(runtime_sender)
60
+
.setup(|app| {
61
+
setup(app, &ADDRESSES, runtime_receiver);
53
62
Ok(())
54
63
})
55
64
.run(tauri::generate_context!())
56
65
.expect("error while running tauri application");
57
-
}
66
+
}
+3
-1
src-tauri/src/main.rs
+3
-1
src-tauri/src/main.rs
+58
-43
src-tauri/src/osc.rs
+58
-43
src-tauri/src/osc.rs
···
1
1
// https://gist.github.com/phaze-the-dumb/634daacb5141eae2f846e20987dba7a8
2
+
use std::net::UdpSocket;
2
3
3
-
use std::{ net::UdpSocket, sync::mpsc::Sender };
4
+
use crossbeam_channel::Sender;
5
+
use serde::Serialize;
4
6
5
-
use serde::Serialize;
7
+
use crate::structs::parameter_types::ParameterType;
6
8
7
9
#[derive(Debug, Clone, Serialize)]
8
-
pub enum OSCValue{
9
-
Int(i32),
10
-
Float(f32),
11
-
Boolean(bool),
12
-
String(String),
10
+
pub struct OSCMessage {
11
+
pub address: String,
12
+
pub values: Vec<ParameterType>,
13
13
}
14
14
15
-
#[derive(Debug, Clone, Serialize)]
16
-
pub struct OSCMessage{
17
-
pub address: String,
18
-
pub values: Vec<OSCValue>
15
+
impl PartialEq for OSCMessage {
16
+
// Technically this isn't exactly equal, but the only time i'm checking if OSCMessage's are equal
17
+
// Is when i'm checking for the "address" value
18
+
19
+
fn eq(&self, other: &Self) -> bool {
20
+
self.address == other.address
21
+
}
22
+
23
+
fn ne(&self, other: &Self) -> bool {
24
+
self.address != other.address
25
+
}
19
26
}
20
27
21
-
// TODO: implement osc bundles
22
-
pub fn start_server( sender: Sender<OSCMessage>, addr: &str ) {
28
+
// TODO: Implement osc bundles
29
+
pub fn start_server(sender: Sender<OSCMessage>, addr: &str) {
23
30
let socket = UdpSocket::bind(addr).unwrap();
24
31
25
32
loop {
···
27
34
let (amt, _src) = socket.recv_from(&mut buf).unwrap();
28
35
29
36
let buf = &mut buf[..amt];
30
-
if buf[0] != 0x2F { panic!("Packet is not an OSC Message"); }
37
+
if buf[0] != 0x2F {
38
+
panic!("Packet is not an OSC Message");
39
+
}
31
40
32
41
let mut addr: Vec<u8> = Vec::new();
33
42
let mut value_start = 0;
34
43
35
-
loop{
44
+
loop {
36
45
let byte = buf[value_start];
37
-
if byte == 0x00{ break; }
46
+
if byte == 0x00 {
47
+
break;
48
+
}
38
49
39
50
value_start += 1;
40
51
addr.push(byte);
41
52
}
42
53
43
-
loop{
54
+
loop {
44
55
let byte = buf[value_start];
45
56
value_start += 1;
46
57
47
-
if byte == 0x2C{ break; }
58
+
if byte == 0x2C {
59
+
break;
60
+
}
48
61
}
49
62
50
63
let mut types: Vec<u8> = Vec::new();
51
64
52
-
loop{
65
+
loop {
53
66
let byte = buf[value_start];
54
-
if byte == 0x00{ break; }
67
+
if byte == 0x00 {
68
+
break;
69
+
}
55
70
56
71
types.push(byte);
57
72
value_start += 1;
···
60
75
value_start = ((value_start as f32 / 4.0).ceil() * 4.0) as usize;
61
76
let mut values = Vec::new();
62
77
63
-
for tp in types{
64
-
match tp{
78
+
for tp in types {
79
+
match tp {
65
80
0x69 => {
66
81
let val_buf = &buf[value_start..value_start + 4];
67
82
68
83
let bytes = <&[u8; 4]>::try_from(val_buf).unwrap().clone();
69
84
let int = i32::from_be_bytes(bytes);
70
85
71
-
values.push(OSCValue::Int(int));
86
+
values.push(ParameterType::Int(int));
72
87
value_start += 4;
73
-
},
88
+
}
74
89
0x66 => {
75
90
let val_buf = &buf[value_start..value_start + 4];
76
91
77
92
let bytes = <&[u8; 4]>::try_from(val_buf).unwrap().clone();
78
93
let float = f32::from_be_bytes(bytes);
79
94
80
-
values.push(OSCValue::Float(float));
95
+
values.push(ParameterType::Float(float));
81
96
value_start += 4;
82
-
},
83
-
0x54 => values.push(OSCValue::Boolean(true)),
84
-
0x46 => values.push(OSCValue::Boolean(false)),
97
+
}
98
+
0x54 => values.push(ParameterType::Boolean(true)),
99
+
0x46 => values.push(ParameterType::Boolean(false)),
85
100
_ => {}
86
101
}
87
102
}
88
103
89
104
let message = OSCMessage {
90
105
address: String::from_utf8(addr.clone()).unwrap(),
91
-
values: values
106
+
values: values,
92
107
};
93
108
94
109
sender.send(message).unwrap();
95
110
}
96
111
}
97
112
98
-
pub fn send_message( address: &str, values: Vec<OSCValue>, ip_addr: &str ){
113
+
pub fn send_message(address: &str, values: Vec<ParameterType>, ip_addr: &str) {
99
114
let socket = UdpSocket::bind("127.0.0.1:0").unwrap();
100
115
let mut buf: Vec<u8> = Vec::new();
101
116
···
113
128
let mut value_count = 1;
114
129
for value in values.clone() {
115
130
match value {
116
-
OSCValue::Boolean( val ) => buf.push(if val { 0x54 } else { 0x46 }),
117
-
OSCValue::Float(_) => buf.push(0x66),
118
-
OSCValue::Int(_) => buf.push(0x69),
119
-
OSCValue::String(_) => buf.push(0x73)
131
+
ParameterType::Boolean(val) => buf.push(if val { 0x54 } else { 0x46 }),
132
+
ParameterType::Float(_) => buf.push(0x66),
133
+
ParameterType::Int(_) => buf.push(0x69),
134
+
ParameterType::String(_) => buf.push(0x73),
135
+
_ => {}
120
136
};
121
137
122
138
value_count += 1;
123
139
}
124
140
125
-
for _i in 0..4 - (value_count % 4) {
141
+
for _i in 0..4 - (value_count % 4) {
126
142
buf.push(0);
127
143
}
128
144
129
-
for value in values{
130
-
match value{
131
-
OSCValue::Float( val ) => buf.append(&mut val.to_be_bytes().to_vec()),
132
-
OSCValue::Int( val ) => buf.append(&mut val.to_be_bytes().to_vec()),
133
-
OSCValue::String( val ) => {
145
+
for value in values {
146
+
match value {
147
+
ParameterType::Float(val) => buf.append(&mut val.to_be_bytes().to_vec()),
148
+
ParameterType::Int(val) => buf.append(&mut val.to_be_bytes().to_vec()),
149
+
ParameterType::String(val) => {
134
150
let mut str_buf = val.as_bytes().to_vec();
135
151
let buf_len = str_buf.len().clone();
136
152
137
153
buf.append(&mut str_buf);
138
154
139
-
for _i in 0..4 - (buf_len % 4) {
155
+
for _i in 0..4 - (buf_len % 4) {
140
156
buf.push(0);
141
157
}
142
158
}
···
144
160
}
145
161
}
146
162
147
-
println!("{:X?}", &buf);
148
163
socket.send_to(&buf, ip_addr).unwrap();
149
-
}
164
+
}
+9
src-tauri/src/runtime/commands.rs
+9
src-tauri/src/runtime/commands.rs
+51
src-tauri/src/runtime/nodes/conditional/ifequal.rs
+51
src-tauri/src/runtime/nodes/conditional/ifequal.rs
···
1
+
use crate::{
2
+
runtime::nodes::RuntimeNode,
3
+
structs::{nodes::Node, parameter_types::ParameterType},
4
+
};
5
+
6
+
pub struct ConditionalIfEqual {
7
+
outputs: Vec<Vec<(String, isize, isize)>>,
8
+
inputs: Vec<Option<(String, isize, isize)>>,
9
+
}
10
+
11
+
impl ConditionalIfEqual {
12
+
pub fn new(node: Node) -> Box<Self> {
13
+
Box::new(Self {
14
+
outputs: node.outputs.iter().map(|x| {
15
+
x.connections.iter()
16
+
.map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(),
17
+
18
+
inputs: node.inputs.iter().map(|x| {
19
+
let y = x.connections.get(0);
20
+
if let Some(y) = y{
21
+
Some((y.node.clone(), y.index, y.value_type))
22
+
} else{
23
+
None
24
+
}
25
+
}).collect(),
26
+
})
27
+
}
28
+
}
29
+
30
+
impl RuntimeNode for ConditionalIfEqual {
31
+
fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> {
32
+
self.outputs.clone()
33
+
}
34
+
35
+
fn inputs(&self) -> Vec<Option<(String, isize, isize)>> {
36
+
self.inputs.clone()
37
+
}
38
+
39
+
fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType> {
40
+
let is_equal = args[1] == args[2];
41
+
42
+
vec![
43
+
ParameterType::Flow(is_equal),
44
+
ParameterType::Flow(!is_equal),
45
+
]
46
+
}
47
+
48
+
fn is_entrypoint(&self) -> bool {
49
+
false
50
+
}
51
+
}
+51
src-tauri/src/runtime/nodes/conditional/iffalse.rs
+51
src-tauri/src/runtime/nodes/conditional/iffalse.rs
···
1
+
use crate::{
2
+
runtime::nodes::RuntimeNode,
3
+
structs::{nodes::Node, parameter_types::ParameterType},
4
+
};
5
+
6
+
pub struct ConditionalIfFalse {
7
+
outputs: Vec<Vec<(String, isize, isize)>>,
8
+
inputs: Vec<Option<(String, isize, isize)>>,
9
+
}
10
+
11
+
impl ConditionalIfFalse {
12
+
pub fn new(node: Node) -> Box<Self> {
13
+
Box::new(Self {
14
+
outputs: node.outputs.iter().map(|x| {
15
+
x.connections.iter()
16
+
.map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(),
17
+
18
+
inputs: node.inputs.iter().map(|x| {
19
+
let y = x.connections.get(0);
20
+
if let Some(y) = y{
21
+
Some((y.node.clone(), y.index, y.value_type))
22
+
} else{
23
+
None
24
+
}
25
+
}).collect(),
26
+
})
27
+
}
28
+
}
29
+
30
+
impl RuntimeNode for ConditionalIfFalse {
31
+
fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> {
32
+
self.outputs.clone()
33
+
}
34
+
35
+
fn inputs(&self) -> Vec<Option<(String, isize, isize)>> {
36
+
self.inputs.clone()
37
+
}
38
+
39
+
fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType> {
40
+
let is_false = !args[1].as_bool().unwrap();
41
+
42
+
vec![
43
+
ParameterType::Flow(is_false),
44
+
ParameterType::Flow(!is_false),
45
+
]
46
+
}
47
+
48
+
fn is_entrypoint(&self) -> bool {
49
+
false
50
+
}
51
+
}
+51
src-tauri/src/runtime/nodes/conditional/iftrue.rs
+51
src-tauri/src/runtime/nodes/conditional/iftrue.rs
···
1
+
use crate::{
2
+
runtime::nodes::RuntimeNode,
3
+
structs::{nodes::Node, parameter_types::ParameterType},
4
+
};
5
+
6
+
pub struct ConditionalIfTrue {
7
+
outputs: Vec<Vec<(String, isize, isize)>>,
8
+
inputs: Vec<Option<(String, isize, isize)>>,
9
+
}
10
+
11
+
impl ConditionalIfTrue {
12
+
pub fn new(node: Node) -> Box<Self> {
13
+
Box::new(Self {
14
+
outputs: node.outputs.iter().map(|x| {
15
+
x.connections.iter()
16
+
.map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(),
17
+
18
+
inputs: node.inputs.iter().map(|x| {
19
+
let y = x.connections.get(0);
20
+
if let Some(y) = y{
21
+
Some((y.node.clone(), y.index, y.value_type))
22
+
} else{
23
+
None
24
+
}
25
+
}).collect(),
26
+
})
27
+
}
28
+
}
29
+
30
+
impl RuntimeNode for ConditionalIfTrue {
31
+
fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> {
32
+
self.outputs.clone()
33
+
}
34
+
35
+
fn inputs(&self) -> Vec<Option<(String, isize, isize)>> {
36
+
self.inputs.clone()
37
+
}
38
+
39
+
fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType> {
40
+
let is_true = args[1].as_bool().unwrap();
41
+
42
+
vec![
43
+
ParameterType::Flow(is_true),
44
+
ParameterType::Flow(!is_true),
45
+
]
46
+
}
47
+
48
+
fn is_entrypoint(&self) -> bool {
49
+
false
50
+
}
51
+
}
+3
src-tauri/src/runtime/nodes/conditional/mod.rs
+3
src-tauri/src/runtime/nodes/conditional/mod.rs
+47
src-tauri/src/runtime/nodes/debug.rs
+47
src-tauri/src/runtime/nodes/debug.rs
···
1
+
use crate::{
2
+
runtime::nodes::RuntimeNode,
3
+
structs::{nodes::Node, parameter_types::ParameterType},
4
+
};
5
+
6
+
pub struct Debug {
7
+
outputs: Vec<Vec<(String, isize, isize)>>,
8
+
inputs: Vec<Option<(String, isize, isize)>>
9
+
}
10
+
11
+
impl Debug {
12
+
pub fn new(node: Node) -> Box<Self> {
13
+
Box::new(Self {
14
+
outputs: node.outputs.iter().map(|x| {
15
+
x.connections.iter()
16
+
.map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(),
17
+
18
+
inputs: node.inputs.iter().map(|x| {
19
+
let y = x.connections.get(0);
20
+
if let Some(y) = y{
21
+
Some((y.node.clone(), y.index, y.value_type))
22
+
} else{
23
+
None
24
+
}
25
+
}).collect(),
26
+
})
27
+
}
28
+
}
29
+
30
+
impl RuntimeNode for Debug {
31
+
fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> {
32
+
self.outputs.clone()
33
+
}
34
+
35
+
fn inputs(&self) -> Vec<Option<(String, isize, isize)>> {
36
+
self.inputs.clone()
37
+
}
38
+
39
+
fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType> {
40
+
dbg!(&args); // TODO: Debug to actual UI instead of console
41
+
vec![]
42
+
}
43
+
44
+
fn is_entrypoint(&self) -> bool {
45
+
false
46
+
}
47
+
}
+1
src-tauri/src/runtime/nodes/oscactions/mod.rs
+1
src-tauri/src/runtime/nodes/oscactions/mod.rs
···
1
+
pub mod sendchatbox;
+61
src-tauri/src/runtime/nodes/oscactions/sendchatbox.rs
+61
src-tauri/src/runtime/nodes/oscactions/sendchatbox.rs
···
1
+
use std::vec;
2
+
3
+
use crate::{
4
+
osc,
5
+
runtime::nodes::RuntimeNode,
6
+
structs::{nodes::Node, parameter_types::ParameterType},
7
+
};
8
+
9
+
pub struct OSCActionsSendChatbox {
10
+
outputs: Vec<Vec<(String, isize, isize)>>,
11
+
inputs: Vec<Option<(String, isize, isize)>>,
12
+
}
13
+
14
+
impl OSCActionsSendChatbox {
15
+
pub fn new(node: Node) -> Box<Self> {
16
+
Box::new(Self {
17
+
outputs: node.outputs.iter().map(|x| {
18
+
x.connections.iter()
19
+
.map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(),
20
+
21
+
inputs: node.inputs.iter().map(|x| {
22
+
let y = x.connections.get(0);
23
+
if let Some(y) = y{
24
+
Some((y.node.clone(), y.index, y.value_type))
25
+
} else{
26
+
None
27
+
}
28
+
}).collect(),
29
+
})
30
+
}
31
+
}
32
+
33
+
impl RuntimeNode for OSCActionsSendChatbox {
34
+
fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> {
35
+
self.outputs.clone()
36
+
}
37
+
38
+
fn inputs(&self) -> Vec<Option<(String, isize, isize)>> {
39
+
self.inputs.clone()
40
+
}
41
+
42
+
fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType> {
43
+
if let Ok(msg) = args[1].as_string(){
44
+
osc::send_message(
45
+
"/chatbox/input",
46
+
vec![
47
+
ParameterType::String(msg.clone()),
48
+
ParameterType::Boolean(true),
49
+
ParameterType::Boolean(false),
50
+
],
51
+
"127.0.0.1:9000",
52
+
);
53
+
}
54
+
55
+
vec![]
56
+
}
57
+
58
+
fn is_entrypoint(&self) -> bool {
59
+
false
60
+
}
61
+
}
+69
src-tauri/src/runtime/nodes/osctrigger.rs
+69
src-tauri/src/runtime/nodes/osctrigger.rs
···
1
+
use crate::{
2
+
runtime::nodes::RuntimeNode,
3
+
structs::{nodes::Node, parameter_types::ParameterType},
4
+
};
5
+
6
+
pub struct OSCTrigger {
7
+
outputs: Vec<Vec<(String, isize, isize)>>,
8
+
inputs: Vec<Option<(String, isize, isize)>>,
9
+
10
+
address: Option<String>
11
+
}
12
+
13
+
impl OSCTrigger {
14
+
pub fn new(node: Node) -> Box<Self> {
15
+
let value = &node.statics[0].value;
16
+
17
+
Box::new(Self {
18
+
outputs: node.outputs.iter().map(|x| {
19
+
x.connections.iter()
20
+
.map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(),
21
+
22
+
inputs: node.inputs.iter().map(|x| {
23
+
let y = x.connections.get(0);
24
+
if let Some(y) = y{
25
+
Some((y.node.clone(), y.index, y.value_type))
26
+
} else{
27
+
None
28
+
}
29
+
}).collect(),
30
+
31
+
address: if value.is_null() {
32
+
None
33
+
} else {
34
+
Some(value.as_str().unwrap().to_owned())
35
+
},
36
+
})
37
+
}
38
+
}
39
+
40
+
impl RuntimeNode for OSCTrigger {
41
+
fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> {
42
+
self.outputs.clone()
43
+
}
44
+
45
+
fn inputs(&self) -> Vec<Option<(String, isize, isize)>> {
46
+
self.inputs.clone()
47
+
}
48
+
49
+
fn execute(&mut self, mut args: Vec<ParameterType>) -> Vec<ParameterType> {
50
+
if args.len() == 0{ return args }
51
+
52
+
let execute = if let Some(internal_address) = &self.address {
53
+
if let Ok(address) = args[0].as_string() {
54
+
address == *internal_address
55
+
} else{
56
+
false
57
+
}
58
+
} else{
59
+
false
60
+
};
61
+
62
+
args[0] = ParameterType::Flow(execute);
63
+
args
64
+
}
65
+
66
+
fn is_entrypoint(&self) -> bool {
67
+
true
68
+
}
69
+
}
+73
src-tauri/src/runtime/nodes/press_key.rs
+73
src-tauri/src/runtime/nodes/press_key.rs
···
1
+
use std::sync::{Arc, Mutex};
2
+
3
+
use enigo::{Direction, Enigo, Key, Keyboard};
4
+
5
+
use crate::{
6
+
runtime::nodes::RuntimeNode,
7
+
structs::{nodes::Node, parameter_types::ParameterType},
8
+
};
9
+
10
+
pub struct PressKey {
11
+
outputs: Vec<Vec<(String, isize, isize)>>,
12
+
inputs: Vec<Option<(String, isize, isize)>>,
13
+
14
+
key: Option<char>,
15
+
enigo: Arc<Mutex<Enigo>>,
16
+
}
17
+
18
+
impl PressKey {
19
+
pub fn new(node: Node, enigo: Arc<Mutex<Enigo>>) -> Box<Self> {
20
+
let value = &node.statics[0].value;
21
+
22
+
Box::new(Self {
23
+
outputs: node.outputs.iter().map(|x| {
24
+
x.connections.iter()
25
+
.map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(),
26
+
27
+
inputs: node.inputs.iter().map(|x| {
28
+
let y = x.connections.get(0);
29
+
if let Some(y) = y{
30
+
Some((y.node.clone(), y.index, y.value_type))
31
+
} else{
32
+
None
33
+
}
34
+
}).collect(),
35
+
36
+
enigo,
37
+
key: if value.is_null() {
38
+
None
39
+
} else {
40
+
let string = value.as_str().unwrap().to_owned();
41
+
42
+
if string.len() == 1 {
43
+
Some(string.chars().nth(0).unwrap())
44
+
} else {
45
+
None
46
+
}
47
+
},
48
+
})
49
+
}
50
+
}
51
+
52
+
impl RuntimeNode for PressKey {
53
+
fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> {
54
+
self.outputs.clone()
55
+
}
56
+
57
+
fn inputs(&self) -> Vec<Option<(String, isize, isize)>> {
58
+
self.inputs.clone()
59
+
}
60
+
61
+
fn execute(&mut self, _: Vec<ParameterType>) -> Vec<ParameterType> {
62
+
if self.key.is_some() {
63
+
let mut enigo = self.enigo.lock().unwrap();
64
+
enigo.key(Key::MediaPlayPause, Direction::Click).unwrap();
65
+
}
66
+
67
+
vec![]
68
+
}
69
+
70
+
fn is_entrypoint(&self) -> bool {
71
+
false
72
+
}
73
+
}
+70
src-tauri/src/runtime/nodes/shell.rs
+70
src-tauri/src/runtime/nodes/shell.rs
···
1
+
use std::{io::Stdin, process::{Command, Stdio}};
2
+
3
+
use crate::{
4
+
runtime::nodes::RuntimeNode,
5
+
structs::{nodes::Node, parameter_types::ParameterType},
6
+
};
7
+
8
+
pub struct ShellCommand {
9
+
outputs: Vec<Vec<(String, isize, isize)>>,
10
+
inputs: Vec<Option<(String, isize, isize)>>
11
+
}
12
+
13
+
impl ShellCommand {
14
+
pub fn new(node: Node) -> Box<Self> {
15
+
Box::new(Self {
16
+
outputs: node.outputs.iter().map(|x| {
17
+
x.connections.iter()
18
+
.map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(),
19
+
20
+
inputs: node.inputs.iter().map(|x| {
21
+
let y = x.connections.get(0);
22
+
if let Some(y) = y{
23
+
Some((y.node.clone(), y.index, y.value_type))
24
+
} else{
25
+
None
26
+
}
27
+
}).collect()
28
+
})
29
+
}
30
+
}
31
+
32
+
impl RuntimeNode for ShellCommand {
33
+
fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> {
34
+
self.outputs.clone()
35
+
}
36
+
37
+
fn inputs(&self) -> Vec<Option<(String, isize, isize)>> {
38
+
self.inputs.clone()
39
+
}
40
+
41
+
fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType> {
42
+
if let Ok(cmd) = args[1].as_string(){
43
+
if cmd != ""{
44
+
let mut split_cmd = cmd.split(" ");
45
+
46
+
let mut cmd = Command::new(split_cmd.nth(0).unwrap());
47
+
if split_cmd.clone().count() > 0{ cmd.args(split_cmd); }
48
+
49
+
cmd.stdout(Stdio::piped());
50
+
cmd.stderr(Stdio::piped());
51
+
52
+
let child = cmd.spawn().unwrap();
53
+
let output = child.wait_with_output().unwrap();
54
+
55
+
vec![
56
+
ParameterType::Flow(true),
57
+
ParameterType::String(str::from_utf8(&output.stdout).unwrap().to_owned())
58
+
]
59
+
} else{
60
+
vec![ ParameterType::Flow(false) ]
61
+
}
62
+
} else{
63
+
vec![ ParameterType::Flow(false) ]
64
+
}
65
+
}
66
+
67
+
fn is_entrypoint(&self) -> bool {
68
+
false
69
+
}
70
+
}
+60
src-tauri/src/runtime/nodes/statics/float.rs
+60
src-tauri/src/runtime/nodes/statics/float.rs
···
1
+
use crate::{
2
+
runtime::nodes::RuntimeNode,
3
+
structs::{nodes::Node, parameter_types::ParameterType},
4
+
};
5
+
6
+
pub struct StaticFloat {
7
+
outputs: Vec<Vec<(String, isize, isize)>>,
8
+
inputs: Vec<Option<(String, isize, isize)>>,
9
+
10
+
value: Option<f32>,
11
+
}
12
+
13
+
impl StaticFloat {
14
+
pub fn new(node: Node) -> Box<Self> {
15
+
let value = &node.statics[0].value;
16
+
17
+
Box::new(Self {
18
+
outputs: node.outputs.iter().map(|x| {
19
+
x.connections.iter()
20
+
.map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(),
21
+
22
+
inputs: node.inputs.iter().map(|x| {
23
+
let y = x.connections.get(0);
24
+
if let Some(y) = y{
25
+
Some((y.node.clone(), y.index, y.value_type))
26
+
} else{
27
+
None
28
+
}
29
+
}).collect(),
30
+
31
+
value: if value.is_null() {
32
+
None
33
+
} else {
34
+
Some(value.as_f64().unwrap() as f32)
35
+
}
36
+
})
37
+
}
38
+
}
39
+
40
+
impl RuntimeNode for StaticFloat {
41
+
fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> {
42
+
self.outputs.clone()
43
+
}
44
+
45
+
fn inputs(&self) -> Vec<Option<(String, isize, isize)>> {
46
+
self.inputs.clone()
47
+
}
48
+
49
+
fn execute(&mut self, _: Vec<ParameterType>) -> Vec<ParameterType> {
50
+
if self.value.is_some() {
51
+
vec![ParameterType::Float(self.value.clone().unwrap())]
52
+
} else {
53
+
vec![ParameterType::Float(0.0)]
54
+
}
55
+
}
56
+
57
+
fn is_entrypoint(&self) -> bool {
58
+
false
59
+
}
60
+
}
+60
src-tauri/src/runtime/nodes/statics/int.rs
+60
src-tauri/src/runtime/nodes/statics/int.rs
···
1
+
use crate::{
2
+
runtime::nodes::RuntimeNode,
3
+
structs::{nodes::Node, parameter_types::ParameterType},
4
+
};
5
+
6
+
pub struct StaticInt {
7
+
outputs: Vec<Vec<(String, isize, isize)>>,
8
+
inputs: Vec<Option<(String, isize, isize)>>,
9
+
10
+
value: Option<i32>,
11
+
}
12
+
13
+
impl StaticInt {
14
+
pub fn new(node: Node) -> Box<Self> {
15
+
let value = &node.statics[0].value;
16
+
17
+
Box::new(Self {
18
+
outputs: node.outputs.iter().map(|x| {
19
+
x.connections.iter()
20
+
.map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(),
21
+
22
+
inputs: node.inputs.iter().map(|x| {
23
+
let y = x.connections.get(0);
24
+
if let Some(y) = y{
25
+
Some((y.node.clone(), y.index, y.value_type))
26
+
} else{
27
+
None
28
+
}
29
+
}).collect(),
30
+
31
+
value: if value.is_null() {
32
+
None
33
+
} else {
34
+
Some(value.as_i64().unwrap() as i32)
35
+
}
36
+
})
37
+
}
38
+
}
39
+
40
+
impl RuntimeNode for StaticInt {
41
+
fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> {
42
+
self.outputs.clone()
43
+
}
44
+
45
+
fn inputs(&self) -> Vec<Option<(String, isize, isize)>> {
46
+
self.inputs.clone()
47
+
}
48
+
49
+
fn execute(&mut self, _: Vec<ParameterType>) -> Vec<ParameterType> {
50
+
if self.value.is_some() {
51
+
vec![ParameterType::Int(self.value.clone().unwrap())]
52
+
} else {
53
+
vec![ParameterType::Int(0)]
54
+
}
55
+
}
56
+
57
+
fn is_entrypoint(&self) -> bool {
58
+
false
59
+
}
60
+
}
+3
src-tauri/src/runtime/nodes/statics/mod.rs
+3
src-tauri/src/runtime/nodes/statics/mod.rs
+60
src-tauri/src/runtime/nodes/statics/string.rs
+60
src-tauri/src/runtime/nodes/statics/string.rs
···
1
+
use crate::{
2
+
runtime::nodes::RuntimeNode,
3
+
structs::{nodes::Node, parameter_types::ParameterType},
4
+
};
5
+
6
+
pub struct StaticString {
7
+
outputs: Vec<Vec<(String, isize, isize)>>,
8
+
inputs: Vec<Option<(String, isize, isize)>>,
9
+
10
+
value: Option<String>,
11
+
}
12
+
13
+
impl StaticString {
14
+
pub fn new(node: Node) -> Box<Self> {
15
+
let value = &node.statics[0].value;
16
+
17
+
Box::new(Self {
18
+
outputs: node.outputs.iter().map(|x| {
19
+
x.connections.iter()
20
+
.map(|x| (x.node.clone(), x.index, x.value_type)).collect()}).collect(),
21
+
22
+
inputs: node.inputs.iter().map(|x| {
23
+
let y = x.connections.get(0);
24
+
if let Some(y) = y{
25
+
Some((y.node.clone(), y.index, y.value_type))
26
+
} else{
27
+
None
28
+
}
29
+
}).collect(),
30
+
31
+
value: if value.is_null() {
32
+
None
33
+
} else {
34
+
Some(value.as_str().unwrap().to_owned())
35
+
}
36
+
})
37
+
}
38
+
}
39
+
40
+
impl RuntimeNode for StaticString {
41
+
fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> {
42
+
self.outputs.clone()
43
+
}
44
+
45
+
fn inputs(&self) -> Vec<Option<(String, isize, isize)>> {
46
+
self.inputs.clone()
47
+
}
48
+
49
+
fn execute(&mut self, _: Vec<ParameterType>) -> Vec<ParameterType> {
50
+
if self.value.is_some() {
51
+
vec![ParameterType::String(self.value.clone().unwrap())]
52
+
} else {
53
+
vec![ParameterType::String("".to_owned())]
54
+
}
55
+
}
56
+
57
+
fn is_entrypoint(&self) -> bool {
58
+
false
59
+
}
60
+
}
+99
src-tauri/src/runtime/nodes.rs
+99
src-tauri/src/runtime/nodes.rs
···
1
+
use std::{
2
+
collections::HashMap,
3
+
sync::{Arc, Mutex},
4
+
};
5
+
6
+
// #[cfg(target_os = "windows")]
7
+
use enigo::Enigo;
8
+
9
+
use crate::{
10
+
runtime::nodes::{
11
+
conditional::{
12
+
ifequal::ConditionalIfEqual, iffalse::ConditionalIfFalse, iftrue::ConditionalIfTrue,
13
+
}, debug::Debug, oscactions::sendchatbox::OSCActionsSendChatbox, osctrigger::OSCTrigger, shell::ShellCommand, statics::{float::StaticFloat, int::StaticInt, string::StaticString}
14
+
},
15
+
structs::{nodes::Node, parameter_types::ParameterType},
16
+
};
17
+
18
+
// #[cfg(target_os = "windows")]
19
+
use crate::runtime::nodes::press_key::PressKey;
20
+
21
+
mod conditional;
22
+
mod debug;
23
+
mod oscactions;
24
+
mod osctrigger;
25
+
mod statics;
26
+
mod shell;
27
+
28
+
// #[cfg(target_os = "windows")]
29
+
mod press_key;
30
+
31
+
pub struct RuntimeNodeTree {
32
+
pub nodes: HashMap<String, Box<dyn RuntimeNode>>,
33
+
}
34
+
35
+
unsafe impl Send for RuntimeNodeTree {}
36
+
37
+
impl RuntimeNodeTree {
38
+
pub fn from(tree: Vec<Node>, /*#[cfg(target_os = "windows")]*/ enigo: Arc<Mutex<Enigo>>) -> Self {
39
+
let mut runtime_nodes: HashMap<String, Box<dyn RuntimeNode>> = HashMap::new();
40
+
for node in tree {
41
+
match node.type_id.as_str() {
42
+
"osctrigger" => {
43
+
runtime_nodes.insert(node.id.clone(), OSCTrigger::new(node));
44
+
}
45
+
46
+
"staticstring" => {
47
+
runtime_nodes.insert(node.id.clone(), StaticString::new(node));
48
+
}
49
+
"staticint" => {
50
+
runtime_nodes.insert(node.id.clone(), StaticInt::new(node));
51
+
}
52
+
"staticfloat" => {
53
+
runtime_nodes.insert(node.id.clone(), StaticFloat::new(node));
54
+
}
55
+
56
+
"iftrue" => {
57
+
runtime_nodes.insert(node.id.clone(), ConditionalIfTrue::new(node));
58
+
}
59
+
"iffalse" => {
60
+
runtime_nodes.insert(node.id.clone(), ConditionalIfFalse::new(node));
61
+
}
62
+
"ifequal" => {
63
+
runtime_nodes.insert(node.id.clone(), ConditionalIfEqual::new(node));
64
+
}
65
+
66
+
"oscsendchatbox" => {
67
+
runtime_nodes.insert(node.id.clone(), OSCActionsSendChatbox::new(node));
68
+
}
69
+
70
+
"debug" => {
71
+
runtime_nodes.insert(node.id.clone(), Debug::new(node));
72
+
}
73
+
74
+
// #[cfg(target_os = "windows")]
75
+
"presskey" => {
76
+
runtime_nodes.insert(node.id.clone(), PressKey::new(node, enigo.clone()));
77
+
}
78
+
79
+
"shellcommand" => {
80
+
runtime_nodes.insert(node.id.clone(), ShellCommand::new(node));
81
+
}
82
+
83
+
_ => {}
84
+
}
85
+
}
86
+
87
+
Self {
88
+
nodes: runtime_nodes,
89
+
}
90
+
}
91
+
}
92
+
93
+
pub trait RuntimeNode {
94
+
fn outputs(&self) -> Vec<Vec<(String, isize, isize)>>; // Node ID, input index, output value type
95
+
fn inputs(&self) -> Vec<Option<(String, isize, isize)>>; // Node ID, input index, output value type
96
+
97
+
fn execute(&mut self, args: Vec<ParameterType>) -> Vec<ParameterType>; // Then call functions on the second loop
98
+
fn is_entrypoint(&self) -> bool;
99
+
}
+97
src-tauri/src/runtime.rs
+97
src-tauri/src/runtime.rs
···
1
+
use std::collections::HashMap;
2
+
3
+
use anyhow::{bail, Result};
4
+
5
+
use crate::{runtime::nodes::RuntimeNodeTree, structs::parameter_types::ParameterType};
6
+
7
+
pub mod commands;
8
+
pub mod nodes;
9
+
10
+
// TODO: Variables
11
+
12
+
pub fn recurse_runtime(entry: String, tab: &mut RuntimeNodeTree, args: Vec<ParameterType>) -> Result<()>{
13
+
let ( out_args, output_map ) = runtime(entry, tab, args)?;
14
+
15
+
let mut next_node_args: HashMap<String, Vec<ParameterType>> = HashMap::new();
16
+
17
+
for i in 0..out_args.len(){
18
+
if output_map.len() <= i { break; }
19
+
let links = &output_map[i];
20
+
21
+
for ( id, link_index, _ ) in links{
22
+
let link_index = link_index.clone() as usize;
23
+
24
+
if next_node_args.contains_key(id){
25
+
let args: &mut _ = next_node_args.get_mut(id).unwrap();
26
+
while args.len() < link_index{ args.push(ParameterType::None); }
27
+
28
+
args.push(out_args[i].clone());
29
+
} else{
30
+
let mut args = vec![ParameterType::None; link_index];
31
+
args.push(out_args[i].clone());
32
+
33
+
next_node_args.insert(id.clone(), args);
34
+
}
35
+
}
36
+
}
37
+
38
+
for i in 0..out_args.len(){
39
+
if let ParameterType::Flow(next) = out_args[i]{
40
+
if next{
41
+
let links = &output_map[i];
42
+
43
+
for ( id, _, _ ) in links{
44
+
let args = next_node_args.remove(id).unwrap();
45
+
recurse_runtime(id.clone(), tab, args)?;
46
+
}
47
+
}
48
+
}
49
+
}
50
+
51
+
Ok(())
52
+
}
53
+
54
+
pub fn runtime(entry: String, tab: &mut RuntimeNodeTree, mut args: Vec<ParameterType>) -> Result<(Vec<ParameterType>, Vec<Vec<(String, isize, isize)>>)> {
55
+
let node = tab.nodes.get_mut(&entry);
56
+
if node.is_none() { bail!("Cannot find node"); }
57
+
58
+
let node = node.unwrap();
59
+
let inputs = node.inputs();
60
+
61
+
let mut needed_input_nodes = HashMap::new();
62
+
63
+
for i in 0..inputs.len(){
64
+
if i >= args.len() || args[i] == ParameterType::None{
65
+
if let Some(input) = &inputs[i]{
66
+
if !needed_input_nodes.contains_key(&input.0){
67
+
needed_input_nodes.insert(input.0.clone(), vec![(input.1.clone(), i.clone())]);
68
+
} else{
69
+
needed_input_nodes.get_mut(&input.0).unwrap().push((input.1.clone(), i.clone()));
70
+
}
71
+
}
72
+
}
73
+
}
74
+
75
+
for ( id, needed ) in needed_input_nodes{
76
+
let (out_args, _) = runtime(id, tab, vec![]).unwrap();
77
+
78
+
for ( output, input ) in needed{
79
+
let arg = &out_args[output as usize];
80
+
81
+
if args.len() >= input{
82
+
while args.len() < input{ args.push(ParameterType::None); }
83
+
args.push(arg.clone());
84
+
} else{
85
+
args[input] = arg.clone();
86
+
}
87
+
}
88
+
}
89
+
90
+
let node = tab.nodes.get_mut(&entry); // TODO: Find a way to only do this lookup once
91
+
if node.is_none() { bail!("Cannot find node"); }
92
+
93
+
let node = node.unwrap();
94
+
95
+
let output = node.execute(args);
96
+
Ok((output, node.outputs()))
97
+
}
+129
-9
src-tauri/src/setup.rs
+129
-9
src-tauri/src/setup.rs
···
1
-
use std::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
-
use tauri::{ App, Emitter, Manager };
9
+
use flate2::read::GzDecoder;
10
+
use serde_json::{Map, Value};
11
+
use tauri::{App, Emitter, Listener, Manager, WindowEvent};
4
12
5
-
use crate::{ osc };
13
+
use crate::{
14
+
osc::{self, OSCMessage}, runtime::{commands::RuntimeCommand, nodes::RuntimeNodeTree, recurse_runtime}, structs::parameter_types::ParameterType, utils::{setup_traymenu::setup_traymenu, vrchat_builtin_parameters}
15
+
};
6
16
7
-
pub fn setup( app: &mut App, addresses: &'static Mutex<Vec<String>> ){
17
+
pub fn setup(
18
+
app: &mut App,
19
+
addresses: &'static Mutex<Vec<OSCMessage>>,
20
+
runtime_command_receiver: Receiver<RuntimeCommand>,
21
+
) {
8
22
let window = app.get_webview_window("main").unwrap();
23
+
window.hide().unwrap();
9
24
10
-
let ( sender, receiver ) = sync::mpsc::channel();
25
+
let win_handle = window.clone();
26
+
27
+
window.on_window_event(move |event| match event {
28
+
WindowEvent::CloseRequested { api, .. } => {
29
+
api.prevent_close();
30
+
win_handle.emit("prompt_to_close", ()).unwrap();
31
+
}
32
+
WindowEvent::Resized(_) => {
33
+
let minimised = win_handle.is_minimized().unwrap();
34
+
if minimised{
35
+
win_handle.hide().unwrap();
36
+
win_handle.emit("hide-window", ()).unwrap();
37
+
win_handle.unminimize().unwrap();
38
+
}
39
+
}
40
+
_ => {}
41
+
});
42
+
43
+
setup_traymenu(app.handle());
44
+
45
+
let handle = window.clone();
46
+
window.listen("tauri://drag-drop", move |ev| {
47
+
let path: Value = serde_json::from_str(ev.payload()).unwrap();
48
+
let path = path["paths"][0].as_str().unwrap();
49
+
50
+
let file = File::open(&path).unwrap();
51
+
let mut decoder = GzDecoder::new(file);
52
+
let mut string = String::new();
53
+
54
+
decoder.read_to_string(&mut string).unwrap();
55
+
56
+
let mut map = Map::new();
57
+
58
+
map.insert("path".to_owned(), Value::String(path.to_owned()));
59
+
map.insert("graph".to_owned(), Value::String(string));
60
+
61
+
handle.emit("load_new_tab", Value::Object(map)).unwrap();
62
+
});
63
+
64
+
let (sender, receiver) = bounded(1024);
11
65
12
66
tokio::spawn(async move {
13
67
osc::start_server(sender, "127.0.0.1:9001");
14
68
});
15
69
70
+
let (runtime_sender, runtime_receiver) = bounded(1024);
71
+
72
+
let runtime_sender_1 = runtime_sender.clone();
73
+
tokio::spawn(async move {
74
+
loop {
75
+
let cmd = runtime_command_receiver.recv().unwrap();
76
+
runtime_sender_1.send(cmd).unwrap();
77
+
}
78
+
});
79
+
16
80
tokio::spawn(async move {
17
81
loop {
18
82
let message = receiver.recv().unwrap();
19
83
20
84
window.emit("osc-message", &message).unwrap();
21
85
22
-
let addr = message.address.clone();
23
-
let mut addresses = addresses.lock().unwrap();
24
-
if !addresses.contains(&addr){ addresses.push(addr); }
86
+
let msg = message.clone();
87
+
let mut addrs = addresses.lock().unwrap();
88
+
if !addrs.contains(&msg) {
89
+
addrs.push(msg);
90
+
}
91
+
92
+
if message.address == "/avatar/change".to_owned(){
93
+
*addrs = vrchat_builtin_parameters::get_read_addresses();
94
+
95
+
// TODO: Read avatar paramaters from file
96
+
}
97
+
98
+
runtime_sender
99
+
.send(RuntimeCommand::OSCMessage(message))
100
+
.unwrap();
101
+
}
102
+
});
103
+
104
+
// TODO: Run tabs in seperate threads (really not looking forward to this... thanks rust)
105
+
106
+
tokio::spawn(async move {
107
+
let mut tabs: HashMap<String, RuntimeNodeTree> = HashMap::new();
108
+
109
+
// #[cfg(target_os = "windows")]
110
+
let enigo = Arc::new(Mutex::new(enigo::Enigo::new(&enigo::Settings::default()).unwrap()));
111
+
112
+
loop {
113
+
let cmd = runtime_receiver.recv().unwrap();
114
+
115
+
match cmd {
116
+
RuntimeCommand::OSCMessage(msg) => {
117
+
for (_, mut tab) in &mut tabs {
118
+
let keys: Vec<String> = tab.nodes.keys().map(|x| x.clone()).collect();
119
+
120
+
for id in keys {
121
+
let entry = tab.nodes[&id].is_entrypoint();
122
+
123
+
if entry {
124
+
let mut args = vec![ ParameterType::String(msg.address.clone())];
125
+
let mut values = msg.values.clone();
126
+
127
+
args.append(&mut values);
128
+
let _ = recurse_runtime(id.clone(), &mut tab, args);
129
+
}
130
+
}
131
+
}
132
+
}
133
+
134
+
RuntimeCommand::AddTab(graph, id) => {
135
+
// #[cfg(target_os = "windows")]
136
+
tabs.insert(id, RuntimeNodeTree::from(graph, enigo.clone()));
137
+
138
+
// #[cfg(target_os = "linux")]
139
+
// tabs.insert(id, RuntimeNodeTree::from(graph));
140
+
}
141
+
RuntimeCommand::RemoveTab(id) => {
142
+
tabs.remove(&id);
143
+
}
144
+
}
25
145
}
26
146
});
27
-
}
147
+
}
-19
src-tauri/src/structs/action.rs
-19
src-tauri/src/structs/action.rs
···
1
-
use serde::Serialize;
2
-
3
-
#[derive(Serialize, Clone)]
4
-
#[serde(tag = "key", content = "value")]
5
-
pub enum ActionParameters{
6
-
AnyType,
7
-
Int,
8
-
String,
9
-
Float,
10
-
Boolean,
11
-
Actions,
12
-
Label(&'static str)
13
-
}
14
-
15
-
#[derive(Serialize, Clone)]
16
-
pub struct Action{
17
-
pub name: String,
18
-
pub parameters: Vec<ActionParameters>
19
-
}
+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
+
}
+68
src-tauri/src/structs/parameter_types.rs
+68
src-tauri/src/structs/parameter_types.rs
···
1
+
use anyhow::{bail, Result};
2
+
use serde::Serialize;
3
+
4
+
#[derive(Serialize, Clone, Debug, PartialEq)]
5
+
#[serde(tag = "key", content = "value")]
6
+
pub enum ParameterType {
7
+
AnyType(String),
8
+
Label(&'static str),
9
+
10
+
Int(i32),
11
+
Float(f32),
12
+
Boolean(bool),
13
+
String(String),
14
+
Flow(bool),
15
+
16
+
None,
17
+
}
18
+
19
+
impl ParameterType {
20
+
pub fn as_bool(&self) -> Result<bool> {
21
+
match self {
22
+
ParameterType::Boolean(val) => Ok(val.clone()),
23
+
ParameterType::Int(val) => {
24
+
if *val == 0 {
25
+
Ok(false)
26
+
} else {
27
+
Ok(true)
28
+
}
29
+
}
30
+
_ => bail!("Cannot cast to bool."),
31
+
}
32
+
}
33
+
34
+
pub fn as_int(&self) -> Result<i32> {
35
+
match self {
36
+
ParameterType::Boolean(val) => {
37
+
if *val {
38
+
Ok(1)
39
+
} else {
40
+
Ok(0)
41
+
}
42
+
}
43
+
ParameterType::Int(val) => Ok(val.clone()),
44
+
ParameterType::Float(val) => Ok(val.round().clone() as i32),
45
+
ParameterType::String(val) => Ok(val.clone().parse()?),
46
+
_ => bail!("Cannot cast to int."),
47
+
}
48
+
}
49
+
50
+
pub fn as_float(&self) -> Result<f32> {
51
+
match self {
52
+
ParameterType::Int(val) => Ok(val.clone() as f32),
53
+
ParameterType::Float(val) => Ok(val.clone()),
54
+
ParameterType::String(val) => Ok(val.clone().parse()?),
55
+
_ => bail!("Cannot cast to float."),
56
+
}
57
+
}
58
+
59
+
pub fn as_string(&self) -> Result<String> {
60
+
match self {
61
+
ParameterType::Boolean(val) => Ok(val.clone().to_string()),
62
+
ParameterType::Int(val) => Ok(val.clone().to_string()),
63
+
ParameterType::Float(val) => Ok(val.clone().to_string()),
64
+
ParameterType::String(val) => Ok(val.clone()),
65
+
_ => bail!("Cannot cast to string."),
66
+
}
67
+
}
68
+
}
+70
-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
+
}
+2
-2
src-tauri/tauri.conf.json
+2
-2
src-tauri/tauri.conf.json