91 files changed
+14699
.env.example
new
+2
@@ -0,0 +1,2 @@
1
+GOOGLE_OAUTH_CLIENT_SECRET= # This is the Google OAuth client secret
2
+GOOGLE_OAUTH_CLIENT_ID= # This is the Google OAuth client ID
.gitignore
new
+30
@@ -0,0 +1,30 @@
1
+# Logs
2
+logs
3
+*.log
4
+npm-debug.log*
5
+yarn-debug.log*
6
+yarn-error.log*
7
+pnpm-debug.log*
8
+lerna-debug.log*
9
+
10
+node_modules
11
+dist
12
+dist-ssr
13
+*.local
14
+
15
+# Editor directories and files
16
+.vscode/*
17
+!.vscode/extensions.json
18
+.idea
19
+.DS_Store
20
+*.suo
21
+*.ntvs*
22
+*.njsproj
23
+*.sln
24
+*.sw?
25
+
26
+# Secrets
27
+.env
28
+
29
+# Editor settings
30
+.zed
.vscode/extensions.json
new
+3
@@ -0,0 +1,3 @@
1
+{
2
+ "recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer"]
3
+}
README.md
new
+3
@@ -0,0 +1,3 @@
1
+# Snac
2
+
3
+[Light x Lovable x McKinsey Finance Hackathon](https://luma.com/FinanceHackathonStockholm).
assets/app-icon.png
Binary files /dev/null and b/assets/app-icon.png differ
index.html
new
+16
@@ -0,0 +1,16 @@
1
+<!doctype html>
2
+<html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
+ <meta
7
+ name="viewport"
8
+ content="width=device-width, initial-scale=1, viewport-fit=cover"
9
+ />
10
+ <title>Snac</title>
11
+ </head>
12
+ <body>
13
+ <div id="root"></div>
14
+ <script type="module" src="/src/main.tsx"></script>
15
+ </body>
16
+</html>
package.json
new
+74
@@ -0,0 +1,74 @@
1
+{
2
+ "name": "snac",
3
+ "private": true,
4
+ "version": "1.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "tsc && vite build",
9
+ "preview": "vite preview",
10
+ "tauri": "tauri",
11
+ "gim": "./scripts/generate-icon-mobile.sh",
12
+ "gimas": "./scripts/generate-icon-mas.sh",
13
+ "tsync": "tsync -i src-tauri/src/google -o src/lib/crate/generated.ts"
14
+ },
15
+ "dependencies": {
16
+ "@hookform/resolvers": "^3.10.0",
17
+ "@radix-ui/react-accordion": "^1.2.11",
18
+ "@radix-ui/react-alert-dialog": "^1.1.14",
19
+ "@radix-ui/react-aspect-ratio": "^1.1.7",
20
+ "@radix-ui/react-avatar": "^1.1.10",
21
+ "@radix-ui/react-checkbox": "^1.3.2",
22
+ "@radix-ui/react-collapsible": "^1.1.11",
23
+ "@radix-ui/react-context-menu": "^2.2.15",
24
+ "@radix-ui/react-dialog": "^1.1.14",
25
+ "@radix-ui/react-dropdown-menu": "^2.1.15",
26
+ "@radix-ui/react-hover-card": "^1.1.14",
27
+ "@radix-ui/react-label": "^2.1.7",
28
+ "@radix-ui/react-menubar": "^1.1.15",
29
+ "@radix-ui/react-navigation-menu": "^1.2.13",
30
+ "@radix-ui/react-popover": "^1.1.14",
31
+ "@radix-ui/react-progress": "^1.1.7",
32
+ "@radix-ui/react-radio-group": "^1.3.7",
33
+ "@radix-ui/react-scroll-area": "^1.2.9",
34
+ "@radix-ui/react-select": "^2.2.5",
35
+ "@radix-ui/react-separator": "^1.1.7",
36
+ "@radix-ui/react-slider": "^1.3.5",
37
+ "@radix-ui/react-slot": "^1.2.3",
38
+ "@radix-ui/react-switch": "^1.2.5",
39
+ "@radix-ui/react-tabs": "^1.1.12",
40
+ "@radix-ui/react-toast": "^1.2.14",
41
+ "@radix-ui/react-toggle": "^1.1.9",
42
+ "@radix-ui/react-toggle-group": "^1.1.10",
43
+ "@tanstack/react-query": "^5.83.0",
44
+ "@fabianlars/tauri-plugin-oauth": "^2.0.0",
45
+ "@radix-ui/react-tooltip": "^1.2.8",
46
+ "@tauri-apps/api": "^2.9.0",
47
+ "@tauri-apps/plugin-haptics": "^2.3.2",
48
+ "@tauri-apps/plugin-log": "~2.7.1",
49
+ "@tauri-apps/plugin-opener": "^2.5.2",
50
+ "@tauri-apps/plugin-os": "~2.3.2",
51
+ "@tauri-apps/plugin-store": "~2.4.1",
52
+ "react": "^19.2.0",
53
+ "react-dom": "^19.2.0",
54
+ "react-router-dom": "^6.30.2",
55
+ "tauri-plugin-admob-api": "^0.0.4",
56
+ "lucide-react": "^0.462.0",
57
+ "tailwind-merge": "^2.6.0",
58
+ "tailwindcss-animate": "^1.0.7",
59
+ "clsx": "^2.1.1",
60
+ "class-variance-authority": "^0.7.1",
61
+ "date-fns": "^4.1.0"
62
+ },
63
+ "devDependencies": {
64
+ "@tauri-apps/cli": "^2.9.4",
65
+ "@types/react": "^19.2.7",
66
+ "@types/react-dom": "^19.2.3",
67
+ "@vitejs/plugin-react": "^4.7.0",
68
+ "autoprefixer": "^10.4.22",
69
+ "postcss": "^8.5.6",
70
+ "tailwindcss": "^3.4.18",
71
+ "typescript": "~5.8.3",
72
+ "vite": "^7.2.4"
73
+ }
74
+}
pnpm-lock.yaml
new
+3538
@@ -0,0 +1,3538 @@
1
+lockfileVersion: '9.0'
2
+
3
+settings:
4
+ autoInstallPeers: true
5
+ excludeLinksFromLockfile: false
6
+
7
+importers:
8
+
9
+ .:
10
+ dependencies:
11
+ '@fabianlars/tauri-plugin-oauth':
12
+ specifier: ^2.0.0
13
+ version: 2.0.0
14
+ '@hookform/resolvers':
15
+ specifier: ^3.10.0
16
+ version: 3.10.0(react-hook-form@7.66.1(react@19.2.0))
17
+ '@radix-ui/react-accordion':
18
+ specifier: ^1.2.11
19
+ version: 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
20
+ '@radix-ui/react-alert-dialog':
21
+ specifier: ^1.1.14
22
+ version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
23
+ '@radix-ui/react-aspect-ratio':
24
+ specifier: ^1.1.7
25
+ version: 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
26
+ '@radix-ui/react-avatar':
27
+ specifier: ^1.1.10
28
+ version: 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
29
+ '@radix-ui/react-checkbox':
30
+ specifier: ^1.3.2
31
+ version: 1.3.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
32
+ '@radix-ui/react-collapsible':
33
+ specifier: ^1.1.11
34
+ version: 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
35
+ '@radix-ui/react-context-menu':
36
+ specifier: ^2.2.15
37
+ version: 2.2.16(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
38
+ '@radix-ui/react-dialog':
39
+ specifier: ^1.1.14
40
+ version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
41
+ '@radix-ui/react-dropdown-menu':
42
+ specifier: ^2.1.15
43
+ version: 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
44
+ '@radix-ui/react-hover-card':
45
+ specifier: ^1.1.14
46
+ version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
47
+ '@radix-ui/react-label':
48
+ specifier: ^2.1.7
49
+ version: 2.1.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
50
+ '@radix-ui/react-menubar':
51
+ specifier: ^1.1.15
52
+ version: 1.1.16(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
53
+ '@radix-ui/react-navigation-menu':
54
+ specifier: ^1.2.13
55
+ version: 1.2.14(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
56
+ '@radix-ui/react-popover':
57
+ specifier: ^1.1.14
58
+ version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
59
+ '@radix-ui/react-progress':
60
+ specifier: ^1.1.7
61
+ version: 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
62
+ '@radix-ui/react-radio-group':
63
+ specifier: ^1.3.7
64
+ version: 1.3.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
65
+ '@radix-ui/react-scroll-area':
66
+ specifier: ^1.2.9
67
+ version: 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
68
+ '@radix-ui/react-select':
69
+ specifier: ^2.2.5
70
+ version: 2.2.6(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
71
+ '@radix-ui/react-separator':
72
+ specifier: ^1.1.7
73
+ version: 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
74
+ '@radix-ui/react-slider':
75
+ specifier: ^1.3.5
76
+ version: 1.3.6(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
77
+ '@radix-ui/react-slot':
78
+ specifier: ^1.2.3
79
+ version: 1.2.3(@types/react@19.2.7)(react@19.2.0)
80
+ '@radix-ui/react-switch':
81
+ specifier: ^1.2.5
82
+ version: 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
83
+ '@radix-ui/react-tabs':
84
+ specifier: ^1.1.12
85
+ version: 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
86
+ '@radix-ui/react-toast':
87
+ specifier: ^1.2.14
88
+ version: 1.2.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
89
+ '@radix-ui/react-toggle':
90
+ specifier: ^1.1.9
91
+ version: 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
92
+ '@radix-ui/react-toggle-group':
93
+ specifier: ^1.1.10
94
+ version: 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
95
+ '@radix-ui/react-tooltip':
96
+ specifier: ^1.2.8
97
+ version: 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
98
+ '@tanstack/react-query':
99
+ specifier: ^5.83.0
100
+ version: 5.90.11(react@19.2.0)
101
+ '@tauri-apps/api':
102
+ specifier: ^2.9.0
103
+ version: 2.9.0
104
+ '@tauri-apps/plugin-haptics':
105
+ specifier: ^2.3.2
106
+ version: 2.3.2
107
+ '@tauri-apps/plugin-log':
108
+ specifier: ~2.7.1
109
+ version: 2.7.1
110
+ '@tauri-apps/plugin-opener':
111
+ specifier: ^2.5.2
112
+ version: 2.5.2
113
+ '@tauri-apps/plugin-os':
114
+ specifier: ~2.3.2
115
+ version: 2.3.2
116
+ '@tauri-apps/plugin-store':
117
+ specifier: ~2.4.1
118
+ version: 2.4.1
119
+ class-variance-authority:
120
+ specifier: ^0.7.1
121
+ version: 0.7.1
122
+ clsx:
123
+ specifier: ^2.1.1
124
+ version: 2.1.1
125
+ date-fns:
126
+ specifier: ^4.1.0
127
+ version: 4.1.0
128
+ lucide-react:
129
+ specifier: ^0.462.0
130
+ version: 0.462.0(react@19.2.0)
131
+ react:
132
+ specifier: ^19.2.0
133
+ version: 19.2.0
134
+ react-dom:
135
+ specifier: ^19.2.0
136
+ version: 19.2.0(react@19.2.0)
137
+ react-router-dom:
138
+ specifier: ^6.30.2
139
+ version: 6.30.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
140
+ tailwind-merge:
141
+ specifier: ^2.6.0
142
+ version: 2.6.0
143
+ tailwindcss-animate:
144
+ specifier: ^1.0.7
145
+ version: 1.0.7(tailwindcss@3.4.18)
146
+ tauri-plugin-admob-api:
147
+ specifier: ^0.0.4
148
+ version: 0.0.4
149
+ devDependencies:
150
+ '@tauri-apps/cli':
151
+ specifier: ^2.9.4
152
+ version: 2.9.4
153
+ '@types/react':
154
+ specifier: ^19.2.7
155
+ version: 19.2.7
156
+ '@types/react-dom':
157
+ specifier: ^19.2.3
158
+ version: 19.2.3(@types/react@19.2.7)
159
+ '@vitejs/plugin-react':
160
+ specifier: ^4.7.0
161
+ version: 4.7.0(vite@7.2.4(jiti@1.21.7))
162
+ autoprefixer:
163
+ specifier: ^10.4.22
164
+ version: 10.4.22(postcss@8.5.6)
165
+ postcss:
166
+ specifier: ^8.5.6
167
+ version: 8.5.6
168
+ tailwindcss:
169
+ specifier: ^3.4.18
170
+ version: 3.4.18
171
+ typescript:
172
+ specifier: ~5.8.3
173
+ version: 5.8.3
174
+ vite:
175
+ specifier: ^7.2.4
176
+ version: 7.2.4(jiti@1.21.7)
177
+
178
+packages:
179
+
180
+ '@alloc/quick-lru@5.2.0':
181
+ resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
182
+ engines: {node: '>=10'}
183
+
184
+ '@babel/code-frame@7.27.1':
185
+ resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
186
+ engines: {node: '>=6.9.0'}
187
+
188
+ '@babel/compat-data@7.28.5':
189
+ resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==}
190
+ engines: {node: '>=6.9.0'}
191
+
192
+ '@babel/core@7.28.5':
193
+ resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==}
194
+ engines: {node: '>=6.9.0'}
195
+
196
+ '@babel/generator@7.28.5':
197
+ resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==}
198
+ engines: {node: '>=6.9.0'}
199
+
200
+ '@babel/helper-compilation-targets@7.27.2':
201
+ resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
202
+ engines: {node: '>=6.9.0'}
203
+
204
+ '@babel/helper-globals@7.28.0':
205
+ resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
206
+ engines: {node: '>=6.9.0'}
207
+
208
+ '@babel/helper-module-imports@7.27.1':
209
+ resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
210
+ engines: {node: '>=6.9.0'}
211
+
212
+ '@babel/helper-module-transforms@7.28.3':
213
+ resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==}
214
+ engines: {node: '>=6.9.0'}
215
+ peerDependencies:
216
+ '@babel/core': ^7.0.0
217
+
218
+ '@babel/helper-plugin-utils@7.27.1':
219
+ resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==}
220
+ engines: {node: '>=6.9.0'}
221
+
222
+ '@babel/helper-string-parser@7.27.1':
223
+ resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
224
+ engines: {node: '>=6.9.0'}
225
+
226
+ '@babel/helper-validator-identifier@7.28.5':
227
+ resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
228
+ engines: {node: '>=6.9.0'}
229
+
230
+ '@babel/helper-validator-option@7.27.1':
231
+ resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
232
+ engines: {node: '>=6.9.0'}
233
+
234
+ '@babel/helpers@7.28.4':
235
+ resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==}
236
+ engines: {node: '>=6.9.0'}
237
+
238
+ '@babel/parser@7.28.5':
239
+ resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==}
240
+ engines: {node: '>=6.0.0'}
241
+ hasBin: true
242
+
243
+ '@babel/plugin-transform-react-jsx-self@7.27.1':
244
+ resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==}
245
+ engines: {node: '>=6.9.0'}
246
+ peerDependencies:
247
+ '@babel/core': ^7.0.0-0
248
+
249
+ '@babel/plugin-transform-react-jsx-source@7.27.1':
250
+ resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==}
251
+ engines: {node: '>=6.9.0'}
252
+ peerDependencies:
253
+ '@babel/core': ^7.0.0-0
254
+
255
+ '@babel/template@7.27.2':
256
+ resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
257
+ engines: {node: '>=6.9.0'}
258
+
259
+ '@babel/traverse@7.28.5':
260
+ resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==}
261
+ engines: {node: '>=6.9.0'}
262
+
263
+ '@babel/types@7.28.5':
264
+ resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==}
265
+ engines: {node: '>=6.9.0'}
266
+
267
+ '@esbuild/aix-ppc64@0.25.12':
268
+ resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==}
269
+ engines: {node: '>=18'}
270
+ cpu: [ppc64]
271
+ os: [aix]
272
+
273
+ '@esbuild/android-arm64@0.25.12':
274
+ resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==}
275
+ engines: {node: '>=18'}
276
+ cpu: [arm64]
277
+ os: [android]
278
+
279
+ '@esbuild/android-arm@0.25.12':
280
+ resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==}
281
+ engines: {node: '>=18'}
282
+ cpu: [arm]
283
+ os: [android]
284
+
285
+ '@esbuild/android-x64@0.25.12':
286
+ resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==}
287
+ engines: {node: '>=18'}
288
+ cpu: [x64]
289
+ os: [android]
290
+
291
+ '@esbuild/darwin-arm64@0.25.12':
292
+ resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==}
293
+ engines: {node: '>=18'}
294
+ cpu: [arm64]
295
+ os: [darwin]
296
+
297
+ '@esbuild/darwin-x64@0.25.12':
298
+ resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==}
299
+ engines: {node: '>=18'}
300
+ cpu: [x64]
301
+ os: [darwin]
302
+
303
+ '@esbuild/freebsd-arm64@0.25.12':
304
+ resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==}
305
+ engines: {node: '>=18'}
306
+ cpu: [arm64]
307
+ os: [freebsd]
308
+
309
+ '@esbuild/freebsd-x64@0.25.12':
310
+ resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==}
311
+ engines: {node: '>=18'}
312
+ cpu: [x64]
313
+ os: [freebsd]
314
+
315
+ '@esbuild/linux-arm64@0.25.12':
316
+ resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==}
317
+ engines: {node: '>=18'}
318
+ cpu: [arm64]
319
+ os: [linux]
320
+
321
+ '@esbuild/linux-arm@0.25.12':
322
+ resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==}
323
+ engines: {node: '>=18'}
324
+ cpu: [arm]
325
+ os: [linux]
326
+
327
+ '@esbuild/linux-ia32@0.25.12':
328
+ resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==}
329
+ engines: {node: '>=18'}
330
+ cpu: [ia32]
331
+ os: [linux]
332
+
333
+ '@esbuild/linux-loong64@0.25.12':
334
+ resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==}
335
+ engines: {node: '>=18'}
336
+ cpu: [loong64]
337
+ os: [linux]
338
+
339
+ '@esbuild/linux-mips64el@0.25.12':
340
+ resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==}
341
+ engines: {node: '>=18'}
342
+ cpu: [mips64el]
343
+ os: [linux]
344
+
345
+ '@esbuild/linux-ppc64@0.25.12':
346
+ resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==}
347
+ engines: {node: '>=18'}
348
+ cpu: [ppc64]
349
+ os: [linux]
350
+
351
+ '@esbuild/linux-riscv64@0.25.12':
352
+ resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==}
353
+ engines: {node: '>=18'}
354
+ cpu: [riscv64]
355
+ os: [linux]
356
+
357
+ '@esbuild/linux-s390x@0.25.12':
358
+ resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==}
359
+ engines: {node: '>=18'}
360
+ cpu: [s390x]
361
+ os: [linux]
362
+
363
+ '@esbuild/linux-x64@0.25.12':
364
+ resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==}
365
+ engines: {node: '>=18'}
366
+ cpu: [x64]
367
+ os: [linux]
368
+
369
+ '@esbuild/netbsd-arm64@0.25.12':
370
+ resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==}
371
+ engines: {node: '>=18'}
372
+ cpu: [arm64]
373
+ os: [netbsd]
374
+
375
+ '@esbuild/netbsd-x64@0.25.12':
376
+ resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==}
377
+ engines: {node: '>=18'}
378
+ cpu: [x64]
379
+ os: [netbsd]
380
+
381
+ '@esbuild/openbsd-arm64@0.25.12':
382
+ resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==}
383
+ engines: {node: '>=18'}
384
+ cpu: [arm64]
385
+ os: [openbsd]
386
+
387
+ '@esbuild/openbsd-x64@0.25.12':
388
+ resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==}
389
+ engines: {node: '>=18'}
390
+ cpu: [x64]
391
+ os: [openbsd]
392
+
393
+ '@esbuild/openharmony-arm64@0.25.12':
394
+ resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==}
395
+ engines: {node: '>=18'}
396
+ cpu: [arm64]
397
+ os: [openharmony]
398
+
399
+ '@esbuild/sunos-x64@0.25.12':
400
+ resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==}
401
+ engines: {node: '>=18'}
402
+ cpu: [x64]
403
+ os: [sunos]
404
+
405
+ '@esbuild/win32-arm64@0.25.12':
406
+ resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==}
407
+ engines: {node: '>=18'}
408
+ cpu: [arm64]
409
+ os: [win32]
410
+
411
+ '@esbuild/win32-ia32@0.25.12':
412
+ resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==}
413
+ engines: {node: '>=18'}
414
+ cpu: [ia32]
415
+ os: [win32]
416
+
417
+ '@esbuild/win32-x64@0.25.12':
418
+ resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==}
419
+ engines: {node: '>=18'}
420
+ cpu: [x64]
421
+ os: [win32]
422
+
423
+ '@fabianlars/tauri-plugin-oauth@2.0.0':
424
+ resolution: {integrity: sha512-I1s08ZXrsFuYfNWusAcpLyiCfr5TCvaBrRuKfTG+XQrcaqnAcwjdWH0U5J9QWuMDLwCUMnVxdobtMJzPR8raxQ==}
425
+
426
+ '@floating-ui/core@1.7.3':
427
+ resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==}
428
+
429
+ '@floating-ui/dom@1.7.4':
430
+ resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==}
431
+
432
+ '@floating-ui/react-dom@2.1.6':
433
+ resolution: {integrity: sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==}
434
+ peerDependencies:
435
+ react: '>=16.8.0'
436
+ react-dom: '>=16.8.0'
437
+
438
+ '@floating-ui/utils@0.2.10':
439
+ resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==}
440
+
441
+ '@hookform/resolvers@3.10.0':
442
+ resolution: {integrity: sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag==}
443
+ peerDependencies:
444
+ react-hook-form: ^7.0.0
445
+
446
+ '@jridgewell/gen-mapping@0.3.13':
447
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
448
+
449
+ '@jridgewell/remapping@2.3.5':
450
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
451
+
452
+ '@jridgewell/resolve-uri@3.1.2':
453
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
454
+ engines: {node: '>=6.0.0'}
455
+
456
+ '@jridgewell/sourcemap-codec@1.5.5':
457
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
458
+
459
+ '@jridgewell/trace-mapping@0.3.31':
460
+ resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
461
+
462
+ '@nodelib/fs.scandir@2.1.5':
463
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
464
+ engines: {node: '>= 8'}
465
+
466
+ '@nodelib/fs.stat@2.0.5':
467
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
468
+ engines: {node: '>= 8'}
469
+
470
+ '@nodelib/fs.walk@1.2.8':
471
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
472
+ engines: {node: '>= 8'}
473
+
474
+ '@radix-ui/number@1.1.1':
475
+ resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==}
476
+
477
+ '@radix-ui/primitive@1.1.3':
478
+ resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==}
479
+
480
+ '@radix-ui/react-accordion@1.2.12':
481
+ resolution: {integrity: sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==}
482
+ peerDependencies:
483
+ '@types/react': '*'
484
+ '@types/react-dom': '*'
485
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
486
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
487
+ peerDependenciesMeta:
488
+ '@types/react':
489
+ optional: true
490
+ '@types/react-dom':
491
+ optional: true
492
+
493
+ '@radix-ui/react-alert-dialog@1.1.15':
494
+ resolution: {integrity: sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==}
495
+ peerDependencies:
496
+ '@types/react': '*'
497
+ '@types/react-dom': '*'
498
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
499
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
500
+ peerDependenciesMeta:
501
+ '@types/react':
502
+ optional: true
503
+ '@types/react-dom':
504
+ optional: true
505
+
506
+ '@radix-ui/react-arrow@1.1.7':
507
+ resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==}
508
+ peerDependencies:
509
+ '@types/react': '*'
510
+ '@types/react-dom': '*'
511
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
512
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
513
+ peerDependenciesMeta:
514
+ '@types/react':
515
+ optional: true
516
+ '@types/react-dom':
517
+ optional: true
518
+
519
+ '@radix-ui/react-aspect-ratio@1.1.8':
520
+ resolution: {integrity: sha512-5nZrJTF7gH+e0nZS7/QxFz6tJV4VimhQb1avEgtsJxvvIp5JilL+c58HICsKzPxghdwaDt48hEfPM1au4zGy+w==}
521
+ peerDependencies:
522
+ '@types/react': '*'
523
+ '@types/react-dom': '*'
524
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
525
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
526
+ peerDependenciesMeta:
527
+ '@types/react':
528
+ optional: true
529
+ '@types/react-dom':
530
+ optional: true
531
+
532
+ '@radix-ui/react-avatar@1.1.11':
533
+ resolution: {integrity: sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q==}
534
+ peerDependencies:
535
+ '@types/react': '*'
536
+ '@types/react-dom': '*'
537
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
538
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
539
+ peerDependenciesMeta:
540
+ '@types/react':
541
+ optional: true
542
+ '@types/react-dom':
543
+ optional: true
544
+
545
+ '@radix-ui/react-checkbox@1.3.3':
546
+ resolution: {integrity: sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==}
547
+ peerDependencies:
548
+ '@types/react': '*'
549
+ '@types/react-dom': '*'
550
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
551
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
552
+ peerDependenciesMeta:
553
+ '@types/react':
554
+ optional: true
555
+ '@types/react-dom':
556
+ optional: true
557
+
558
+ '@radix-ui/react-collapsible@1.1.12':
559
+ resolution: {integrity: sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==}
560
+ peerDependencies:
561
+ '@types/react': '*'
562
+ '@types/react-dom': '*'
563
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
564
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
565
+ peerDependenciesMeta:
566
+ '@types/react':
567
+ optional: true
568
+ '@types/react-dom':
569
+ optional: true
570
+
571
+ '@radix-ui/react-collection@1.1.7':
572
+ resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==}
573
+ peerDependencies:
574
+ '@types/react': '*'
575
+ '@types/react-dom': '*'
576
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
577
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
578
+ peerDependenciesMeta:
579
+ '@types/react':
580
+ optional: true
581
+ '@types/react-dom':
582
+ optional: true
583
+
584
+ '@radix-ui/react-compose-refs@1.1.2':
585
+ resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==}
586
+ peerDependencies:
587
+ '@types/react': '*'
588
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
589
+ peerDependenciesMeta:
590
+ '@types/react':
591
+ optional: true
592
+
593
+ '@radix-ui/react-context-menu@2.2.16':
594
+ resolution: {integrity: sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==}
595
+ peerDependencies:
596
+ '@types/react': '*'
597
+ '@types/react-dom': '*'
598
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
599
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
600
+ peerDependenciesMeta:
601
+ '@types/react':
602
+ optional: true
603
+ '@types/react-dom':
604
+ optional: true
605
+
606
+ '@radix-ui/react-context@1.1.2':
607
+ resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==}
608
+ peerDependencies:
609
+ '@types/react': '*'
610
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
611
+ peerDependenciesMeta:
612
+ '@types/react':
613
+ optional: true
614
+
615
+ '@radix-ui/react-context@1.1.3':
616
+ resolution: {integrity: sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==}
617
+ peerDependencies:
618
+ '@types/react': '*'
619
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
620
+ peerDependenciesMeta:
621
+ '@types/react':
622
+ optional: true
623
+
624
+ '@radix-ui/react-dialog@1.1.15':
625
+ resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==}
626
+ peerDependencies:
627
+ '@types/react': '*'
628
+ '@types/react-dom': '*'
629
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
630
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
631
+ peerDependenciesMeta:
632
+ '@types/react':
633
+ optional: true
634
+ '@types/react-dom':
635
+ optional: true
636
+
637
+ '@radix-ui/react-direction@1.1.1':
638
+ resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==}
639
+ peerDependencies:
640
+ '@types/react': '*'
641
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
642
+ peerDependenciesMeta:
643
+ '@types/react':
644
+ optional: true
645
+
646
+ '@radix-ui/react-dismissable-layer@1.1.11':
647
+ resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==}
648
+ peerDependencies:
649
+ '@types/react': '*'
650
+ '@types/react-dom': '*'
651
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
652
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
653
+ peerDependenciesMeta:
654
+ '@types/react':
655
+ optional: true
656
+ '@types/react-dom':
657
+ optional: true
658
+
659
+ '@radix-ui/react-dropdown-menu@2.1.16':
660
+ resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==}
661
+ peerDependencies:
662
+ '@types/react': '*'
663
+ '@types/react-dom': '*'
664
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
665
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
666
+ peerDependenciesMeta:
667
+ '@types/react':
668
+ optional: true
669
+ '@types/react-dom':
670
+ optional: true
671
+
672
+ '@radix-ui/react-focus-guards@1.1.3':
673
+ resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==}
674
+ peerDependencies:
675
+ '@types/react': '*'
676
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
677
+ peerDependenciesMeta:
678
+ '@types/react':
679
+ optional: true
680
+
681
+ '@radix-ui/react-focus-scope@1.1.7':
682
+ resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==}
683
+ peerDependencies:
684
+ '@types/react': '*'
685
+ '@types/react-dom': '*'
686
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
687
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
688
+ peerDependenciesMeta:
689
+ '@types/react':
690
+ optional: true
691
+ '@types/react-dom':
692
+ optional: true
693
+
694
+ '@radix-ui/react-hover-card@1.1.15':
695
+ resolution: {integrity: sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==}
696
+ peerDependencies:
697
+ '@types/react': '*'
698
+ '@types/react-dom': '*'
699
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
700
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
701
+ peerDependenciesMeta:
702
+ '@types/react':
703
+ optional: true
704
+ '@types/react-dom':
705
+ optional: true
706
+
707
+ '@radix-ui/react-id@1.1.1':
708
+ resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==}
709
+ peerDependencies:
710
+ '@types/react': '*'
711
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
712
+ peerDependenciesMeta:
713
+ '@types/react':
714
+ optional: true
715
+
716
+ '@radix-ui/react-label@2.1.8':
717
+ resolution: {integrity: sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==}
718
+ peerDependencies:
719
+ '@types/react': '*'
720
+ '@types/react-dom': '*'
721
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
722
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
723
+ peerDependenciesMeta:
724
+ '@types/react':
725
+ optional: true
726
+ '@types/react-dom':
727
+ optional: true
728
+
729
+ '@radix-ui/react-menu@2.1.16':
730
+ resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==}
731
+ peerDependencies:
732
+ '@types/react': '*'
733
+ '@types/react-dom': '*'
734
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
735
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
736
+ peerDependenciesMeta:
737
+ '@types/react':
738
+ optional: true
739
+ '@types/react-dom':
740
+ optional: true
741
+
742
+ '@radix-ui/react-menubar@1.1.16':
743
+ resolution: {integrity: sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==}
744
+ peerDependencies:
745
+ '@types/react': '*'
746
+ '@types/react-dom': '*'
747
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
748
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
749
+ peerDependenciesMeta:
750
+ '@types/react':
751
+ optional: true
752
+ '@types/react-dom':
753
+ optional: true
754
+
755
+ '@radix-ui/react-navigation-menu@1.2.14':
756
+ resolution: {integrity: sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==}
757
+ peerDependencies:
758
+ '@types/react': '*'
759
+ '@types/react-dom': '*'
760
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
761
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
762
+ peerDependenciesMeta:
763
+ '@types/react':
764
+ optional: true
765
+ '@types/react-dom':
766
+ optional: true
767
+
768
+ '@radix-ui/react-popover@1.1.15':
769
+ resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==}
770
+ peerDependencies:
771
+ '@types/react': '*'
772
+ '@types/react-dom': '*'
773
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
774
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
775
+ peerDependenciesMeta:
776
+ '@types/react':
777
+ optional: true
778
+ '@types/react-dom':
779
+ optional: true
780
+
781
+ '@radix-ui/react-popper@1.2.8':
782
+ resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==}
783
+ peerDependencies:
784
+ '@types/react': '*'
785
+ '@types/react-dom': '*'
786
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
787
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
788
+ peerDependenciesMeta:
789
+ '@types/react':
790
+ optional: true
791
+ '@types/react-dom':
792
+ optional: true
793
+
794
+ '@radix-ui/react-portal@1.1.9':
795
+ resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==}
796
+ peerDependencies:
797
+ '@types/react': '*'
798
+ '@types/react-dom': '*'
799
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
800
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
801
+ peerDependenciesMeta:
802
+ '@types/react':
803
+ optional: true
804
+ '@types/react-dom':
805
+ optional: true
806
+
807
+ '@radix-ui/react-presence@1.1.5':
808
+ resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==}
809
+ peerDependencies:
810
+ '@types/react': '*'
811
+ '@types/react-dom': '*'
812
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
813
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
814
+ peerDependenciesMeta:
815
+ '@types/react':
816
+ optional: true
817
+ '@types/react-dom':
818
+ optional: true
819
+
820
+ '@radix-ui/react-primitive@2.1.3':
821
+ resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==}
822
+ peerDependencies:
823
+ '@types/react': '*'
824
+ '@types/react-dom': '*'
825
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
826
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
827
+ peerDependenciesMeta:
828
+ '@types/react':
829
+ optional: true
830
+ '@types/react-dom':
831
+ optional: true
832
+
833
+ '@radix-ui/react-primitive@2.1.4':
834
+ resolution: {integrity: sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==}
835
+ peerDependencies:
836
+ '@types/react': '*'
837
+ '@types/react-dom': '*'
838
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
839
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
840
+ peerDependenciesMeta:
841
+ '@types/react':
842
+ optional: true
843
+ '@types/react-dom':
844
+ optional: true
845
+
846
+ '@radix-ui/react-progress@1.1.8':
847
+ resolution: {integrity: sha512-+gISHcSPUJ7ktBy9RnTqbdKW78bcGke3t6taawyZ71pio1JewwGSJizycs7rLhGTvMJYCQB1DBK4KQsxs7U8dA==}
848
+ peerDependencies:
849
+ '@types/react': '*'
850
+ '@types/react-dom': '*'
851
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
852
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
853
+ peerDependenciesMeta:
854
+ '@types/react':
855
+ optional: true
856
+ '@types/react-dom':
857
+ optional: true
858
+
859
+ '@radix-ui/react-radio-group@1.3.8':
860
+ resolution: {integrity: sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==}
861
+ peerDependencies:
862
+ '@types/react': '*'
863
+ '@types/react-dom': '*'
864
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
865
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
866
+ peerDependenciesMeta:
867
+ '@types/react':
868
+ optional: true
869
+ '@types/react-dom':
870
+ optional: true
871
+
872
+ '@radix-ui/react-roving-focus@1.1.11':
873
+ resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==}
874
+ peerDependencies:
875
+ '@types/react': '*'
876
+ '@types/react-dom': '*'
877
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
878
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
879
+ peerDependenciesMeta:
880
+ '@types/react':
881
+ optional: true
882
+ '@types/react-dom':
883
+ optional: true
884
+
885
+ '@radix-ui/react-scroll-area@1.2.10':
886
+ resolution: {integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==}
887
+ peerDependencies:
888
+ '@types/react': '*'
889
+ '@types/react-dom': '*'
890
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
891
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
892
+ peerDependenciesMeta:
893
+ '@types/react':
894
+ optional: true
895
+ '@types/react-dom':
896
+ optional: true
897
+
898
+ '@radix-ui/react-select@2.2.6':
899
+ resolution: {integrity: sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==}
900
+ peerDependencies:
901
+ '@types/react': '*'
902
+ '@types/react-dom': '*'
903
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
904
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
905
+ peerDependenciesMeta:
906
+ '@types/react':
907
+ optional: true
908
+ '@types/react-dom':
909
+ optional: true
910
+
911
+ '@radix-ui/react-separator@1.1.8':
912
+ resolution: {integrity: sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==}
913
+ peerDependencies:
914
+ '@types/react': '*'
915
+ '@types/react-dom': '*'
916
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
917
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
918
+ peerDependenciesMeta:
919
+ '@types/react':
920
+ optional: true
921
+ '@types/react-dom':
922
+ optional: true
923
+
924
+ '@radix-ui/react-slider@1.3.6':
925
+ resolution: {integrity: sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==}
926
+ peerDependencies:
927
+ '@types/react': '*'
928
+ '@types/react-dom': '*'
929
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
930
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
931
+ peerDependenciesMeta:
932
+ '@types/react':
933
+ optional: true
934
+ '@types/react-dom':
935
+ optional: true
936
+
937
+ '@radix-ui/react-slot@1.2.3':
938
+ resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==}
939
+ peerDependencies:
940
+ '@types/react': '*'
941
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
942
+ peerDependenciesMeta:
943
+ '@types/react':
944
+ optional: true
945
+
946
+ '@radix-ui/react-slot@1.2.4':
947
+ resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==}
948
+ peerDependencies:
949
+ '@types/react': '*'
950
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
951
+ peerDependenciesMeta:
952
+ '@types/react':
953
+ optional: true
954
+
955
+ '@radix-ui/react-switch@1.2.6':
956
+ resolution: {integrity: sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==}
957
+ peerDependencies:
958
+ '@types/react': '*'
959
+ '@types/react-dom': '*'
960
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
961
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
962
+ peerDependenciesMeta:
963
+ '@types/react':
964
+ optional: true
965
+ '@types/react-dom':
966
+ optional: true
967
+
968
+ '@radix-ui/react-tabs@1.1.13':
969
+ resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==}
970
+ peerDependencies:
971
+ '@types/react': '*'
972
+ '@types/react-dom': '*'
973
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
974
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
975
+ peerDependenciesMeta:
976
+ '@types/react':
977
+ optional: true
978
+ '@types/react-dom':
979
+ optional: true
980
+
981
+ '@radix-ui/react-toast@1.2.15':
982
+ resolution: {integrity: sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==}
983
+ peerDependencies:
984
+ '@types/react': '*'
985
+ '@types/react-dom': '*'
986
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
987
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
988
+ peerDependenciesMeta:
989
+ '@types/react':
990
+ optional: true
991
+ '@types/react-dom':
992
+ optional: true
993
+
994
+ '@radix-ui/react-toggle-group@1.1.11':
995
+ resolution: {integrity: sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==}
996
+ peerDependencies:
997
+ '@types/react': '*'
998
+ '@types/react-dom': '*'
999
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1000
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1001
+ peerDependenciesMeta:
1002
+ '@types/react':
1003
+ optional: true
1004
+ '@types/react-dom':
1005
+ optional: true
1006
+
1007
+ '@radix-ui/react-toggle@1.1.10':
1008
+ resolution: {integrity: sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==}
1009
+ peerDependencies:
1010
+ '@types/react': '*'
1011
+ '@types/react-dom': '*'
1012
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1013
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1014
+ peerDependenciesMeta:
1015
+ '@types/react':
1016
+ optional: true
1017
+ '@types/react-dom':
1018
+ optional: true
1019
+
1020
+ '@radix-ui/react-tooltip@1.2.8':
1021
+ resolution: {integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==}
1022
+ peerDependencies:
1023
+ '@types/react': '*'
1024
+ '@types/react-dom': '*'
1025
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1026
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1027
+ peerDependenciesMeta:
1028
+ '@types/react':
1029
+ optional: true
1030
+ '@types/react-dom':
1031
+ optional: true
1032
+
1033
+ '@radix-ui/react-use-callback-ref@1.1.1':
1034
+ resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==}
1035
+ peerDependencies:
1036
+ '@types/react': '*'
1037
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1038
+ peerDependenciesMeta:
1039
+ '@types/react':
1040
+ optional: true
1041
+
1042
+ '@radix-ui/react-use-controllable-state@1.2.2':
1043
+ resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==}
1044
+ peerDependencies:
1045
+ '@types/react': '*'
1046
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1047
+ peerDependenciesMeta:
1048
+ '@types/react':
1049
+ optional: true
1050
+
1051
+ '@radix-ui/react-use-effect-event@0.0.2':
1052
+ resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==}
1053
+ peerDependencies:
1054
+ '@types/react': '*'
1055
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1056
+ peerDependenciesMeta:
1057
+ '@types/react':
1058
+ optional: true
1059
+
1060
+ '@radix-ui/react-use-escape-keydown@1.1.1':
1061
+ resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==}
1062
+ peerDependencies:
1063
+ '@types/react': '*'
1064
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1065
+ peerDependenciesMeta:
1066
+ '@types/react':
1067
+ optional: true
1068
+
1069
+ '@radix-ui/react-use-is-hydrated@0.1.0':
1070
+ resolution: {integrity: sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==}
1071
+ peerDependencies:
1072
+ '@types/react': '*'
1073
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1074
+ peerDependenciesMeta:
1075
+ '@types/react':
1076
+ optional: true
1077
+
1078
+ '@radix-ui/react-use-layout-effect@1.1.1':
1079
+ resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==}
1080
+ peerDependencies:
1081
+ '@types/react': '*'
1082
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1083
+ peerDependenciesMeta:
1084
+ '@types/react':
1085
+ optional: true
1086
+
1087
+ '@radix-ui/react-use-previous@1.1.1':
1088
+ resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==}
1089
+ peerDependencies:
1090
+ '@types/react': '*'
1091
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1092
+ peerDependenciesMeta:
1093
+ '@types/react':
1094
+ optional: true
1095
+
1096
+ '@radix-ui/react-use-rect@1.1.1':
1097
+ resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==}
1098
+ peerDependencies:
1099
+ '@types/react': '*'
1100
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1101
+ peerDependenciesMeta:
1102
+ '@types/react':
1103
+ optional: true
1104
+
1105
+ '@radix-ui/react-use-size@1.1.1':
1106
+ resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==}
1107
+ peerDependencies:
1108
+ '@types/react': '*'
1109
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1110
+ peerDependenciesMeta:
1111
+ '@types/react':
1112
+ optional: true
1113
+
1114
+ '@radix-ui/react-visually-hidden@1.2.3':
1115
+ resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==}
1116
+ peerDependencies:
1117
+ '@types/react': '*'
1118
+ '@types/react-dom': '*'
1119
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1120
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
1121
+ peerDependenciesMeta:
1122
+ '@types/react':
1123
+ optional: true
1124
+ '@types/react-dom':
1125
+ optional: true
1126
+
1127
+ '@radix-ui/rect@1.1.1':
1128
+ resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==}
1129
+
1130
+ '@remix-run/router@1.23.1':
1131
+ resolution: {integrity: sha512-vDbaOzF7yT2Qs4vO6XV1MHcJv+3dgR1sT+l3B8xxOVhUC336prMvqrvsLL/9Dnw2xr6Qhz4J0dmS0llNAbnUmQ==}
1132
+ engines: {node: '>=14.0.0'}
1133
+
1134
+ '@rolldown/pluginutils@1.0.0-beta.27':
1135
+ resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==}
1136
+
1137
+ '@rollup/rollup-android-arm-eabi@4.53.3':
1138
+ resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==}
1139
+ cpu: [arm]
1140
+ os: [android]
1141
+
1142
+ '@rollup/rollup-android-arm64@4.53.3':
1143
+ resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==}
1144
+ cpu: [arm64]
1145
+ os: [android]
1146
+
1147
+ '@rollup/rollup-darwin-arm64@4.53.3':
1148
+ resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==}
1149
+ cpu: [arm64]
1150
+ os: [darwin]
1151
+
1152
+ '@rollup/rollup-darwin-x64@4.53.3':
1153
+ resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==}
1154
+ cpu: [x64]
1155
+ os: [darwin]
1156
+
1157
+ '@rollup/rollup-freebsd-arm64@4.53.3':
1158
+ resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==}
1159
+ cpu: [arm64]
1160
+ os: [freebsd]
1161
+
1162
+ '@rollup/rollup-freebsd-x64@4.53.3':
1163
+ resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==}
1164
+ cpu: [x64]
1165
+ os: [freebsd]
1166
+
1167
+ '@rollup/rollup-linux-arm-gnueabihf@4.53.3':
1168
+ resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==}
1169
+ cpu: [arm]
1170
+ os: [linux]
1171
+
1172
+ '@rollup/rollup-linux-arm-musleabihf@4.53.3':
1173
+ resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==}
1174
+ cpu: [arm]
1175
+ os: [linux]
1176
+
1177
+ '@rollup/rollup-linux-arm64-gnu@4.53.3':
1178
+ resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==}
1179
+ cpu: [arm64]
1180
+ os: [linux]
1181
+
1182
+ '@rollup/rollup-linux-arm64-musl@4.53.3':
1183
+ resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==}
1184
+ cpu: [arm64]
1185
+ os: [linux]
1186
+
1187
+ '@rollup/rollup-linux-loong64-gnu@4.53.3':
1188
+ resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==}
1189
+ cpu: [loong64]
1190
+ os: [linux]
1191
+
1192
+ '@rollup/rollup-linux-ppc64-gnu@4.53.3':
1193
+ resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==}
1194
+ cpu: [ppc64]
1195
+ os: [linux]
1196
+
1197
+ '@rollup/rollup-linux-riscv64-gnu@4.53.3':
1198
+ resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==}
1199
+ cpu: [riscv64]
1200
+ os: [linux]
1201
+
1202
+ '@rollup/rollup-linux-riscv64-musl@4.53.3':
1203
+ resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==}
1204
+ cpu: [riscv64]
1205
+ os: [linux]
1206
+
1207
+ '@rollup/rollup-linux-s390x-gnu@4.53.3':
1208
+ resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==}
1209
+ cpu: [s390x]
1210
+ os: [linux]
1211
+
1212
+ '@rollup/rollup-linux-x64-gnu@4.53.3':
1213
+ resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==}
1214
+ cpu: [x64]
1215
+ os: [linux]
1216
+
1217
+ '@rollup/rollup-linux-x64-musl@4.53.3':
1218
+ resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==}
1219
+ cpu: [x64]
1220
+ os: [linux]
1221
+
1222
+ '@rollup/rollup-openharmony-arm64@4.53.3':
1223
+ resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==}
1224
+ cpu: [arm64]
1225
+ os: [openharmony]
1226
+
1227
+ '@rollup/rollup-win32-arm64-msvc@4.53.3':
1228
+ resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==}
1229
+ cpu: [arm64]
1230
+ os: [win32]
1231
+
1232
+ '@rollup/rollup-win32-ia32-msvc@4.53.3':
1233
+ resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==}
1234
+ cpu: [ia32]
1235
+ os: [win32]
1236
+
1237
+ '@rollup/rollup-win32-x64-gnu@4.53.3':
1238
+ resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==}
1239
+ cpu: [x64]
1240
+ os: [win32]
1241
+
1242
+ '@rollup/rollup-win32-x64-msvc@4.53.3':
1243
+ resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==}
1244
+ cpu: [x64]
1245
+ os: [win32]
1246
+
1247
+ '@tanstack/query-core@5.90.11':
1248
+ resolution: {integrity: sha512-f9z/nXhCgWDF4lHqgIE30jxLe4sYv15QodfdPDKYAk7nAEjNcndy4dHz3ezhdUaR23BpWa4I2EH4/DZ0//Uf8A==}
1249
+
1250
+ '@tanstack/react-query@5.90.11':
1251
+ resolution: {integrity: sha512-3uyzz01D1fkTLXuxF3JfoJoHQMU2fxsfJwE+6N5hHy0dVNoZOvwKP8Z2k7k1KDeD54N20apcJnG75TBAStIrBA==}
1252
+ peerDependencies:
1253
+ react: ^18 || ^19
1254
+
1255
+ '@tauri-apps/api@2.9.0':
1256
+ resolution: {integrity: sha512-qD5tMjh7utwBk9/5PrTA/aGr3i5QaJ/Mlt7p8NilQ45WgbifUNPyKWsA63iQ8YfQq6R8ajMapU+/Q8nMcPRLNw==}
1257
+
1258
+ '@tauri-apps/cli-darwin-arm64@2.9.4':
1259
+ resolution: {integrity: sha512-9rHkMVtbMhe0AliVbrGpzMahOBg3rwV46JYRELxR9SN6iu1dvPOaMaiC4cP6M/aD1424ziXnnMdYU06RAH8oIw==}
1260
+ engines: {node: '>= 10'}
1261
+ cpu: [arm64]
1262
+ os: [darwin]
1263
+
1264
+ '@tauri-apps/cli-darwin-x64@2.9.4':
1265
+ resolution: {integrity: sha512-VT9ymNuT06f5TLjCZW2hfSxbVtZDhORk7CDUDYiq5TiSYQdxkl8MVBy0CCFFcOk4QAkUmqmVUA9r3YZ/N/vPRQ==}
1266
+ engines: {node: '>= 10'}
1267
+ cpu: [x64]
1268
+ os: [darwin]
1269
+
1270
+ '@tauri-apps/cli-linux-arm-gnueabihf@2.9.4':
1271
+ resolution: {integrity: sha512-tTWkEPig+2z3Rk0zqZYfjUYcgD+aSm72wdrIhdYobxbQZOBw0zfn50YtWv+av7bm0SHvv75f0l7JuwgZM1HFow==}
1272
+ engines: {node: '>= 10'}
1273
+ cpu: [arm]
1274
+ os: [linux]
1275
+
1276
+ '@tauri-apps/cli-linux-arm64-gnu@2.9.4':
1277
+ resolution: {integrity: sha512-ql6vJ611qoqRYHxkKPnb2vHa27U+YRKRmIpLMMBeZnfFtZ938eao7402AQCH1mO2+/8ioUhbpy9R/ZcLTXVmkg==}
1278
+ engines: {node: '>= 10'}
1279
+ cpu: [arm64]
1280
+ os: [linux]
1281
+
1282
+ '@tauri-apps/cli-linux-arm64-musl@2.9.4':
1283
+ resolution: {integrity: sha512-vg7yNn7ICTi6hRrcA/6ff2UpZQP7un3xe3SEld5QM0prgridbKAiXGaCKr3BnUBx/rGXegQlD/wiLcWdiiraSw==}
1284
+ engines: {node: '>= 10'}
1285
+ cpu: [arm64]
1286
+ os: [linux]
1287
+
1288
+ '@tauri-apps/cli-linux-riscv64-gnu@2.9.4':
1289
+ resolution: {integrity: sha512-l8L+3VxNk6yv5T/Z/gv5ysngmIpsai40B9p6NQQyqYqxImqYX37pqREoEBl1YwG7szGnDibpWhidPrWKR59OJA==}
1290
+ engines: {node: '>= 10'}
1291
+ cpu: [riscv64]
1292
+ os: [linux]
1293
+
1294
+ '@tauri-apps/cli-linux-x64-gnu@2.9.4':
1295
+ resolution: {integrity: sha512-PepPhCXc/xVvE3foykNho46OmCyx47E/aG676vKTVp+mqin5d+IBqDL6wDKiGNT5OTTxKEyNlCQ81Xs2BQhhqA==}
1296
+ engines: {node: '>= 10'}
1297
+ cpu: [x64]
1298
+ os: [linux]
1299
+
1300
+ '@tauri-apps/cli-linux-x64-musl@2.9.4':
1301
+ resolution: {integrity: sha512-zcd1QVffh5tZs1u1SCKUV/V7RRynebgYUNWHuV0FsIF1MjnULUChEXhAhug7usCDq4GZReMJOoXa6rukEozWIw==}
1302
+ engines: {node: '>= 10'}
1303
+ cpu: [x64]
1304
+ os: [linux]
1305
+
1306
+ '@tauri-apps/cli-win32-arm64-msvc@2.9.4':
1307
+ resolution: {integrity: sha512-/7ZhnP6PY04bEob23q8MH/EoDISdmR1wuNm0k9d5HV7TDMd2GGCDa8dPXA4vJuglJKXIfXqxFmZ4L+J+MO42+w==}
1308
+ engines: {node: '>= 10'}
1309
+ cpu: [arm64]
1310
+ os: [win32]
1311
+
1312
+ '@tauri-apps/cli-win32-ia32-msvc@2.9.4':
1313
+ resolution: {integrity: sha512-1LmAfaC4Cq+3O1Ir1ksdhczhdtFSTIV51tbAGtbV/mr348O+M52A/xwCCXQank0OcdBxy5BctqkMtuZnQvA8uQ==}
1314
+ engines: {node: '>= 10'}
1315
+ cpu: [ia32]
1316
+ os: [win32]
1317
+
1318
+ '@tauri-apps/cli-win32-x64-msvc@2.9.4':
1319
+ resolution: {integrity: sha512-EdYd4c9wGvtPB95kqtEyY+bUR+k4kRw3IA30mAQ1jPH6z57AftT8q84qwv0RDp6kkEqOBKxeInKfqi4BESYuqg==}
1320
+ engines: {node: '>= 10'}
1321
+ cpu: [x64]
1322
+ os: [win32]
1323
+
1324
+ '@tauri-apps/cli@2.9.4':
1325
+ resolution: {integrity: sha512-pvylWC9QckrOS9ATWXIXcgu7g2hKK5xTL5ZQyZU/U0n9l88SEFGcWgLQNa8WZmd+wWIOWhkxOFcOl3i6ubDNNw==}
1326
+ engines: {node: '>= 10'}
1327
+ hasBin: true
1328
+
1329
+ '@tauri-apps/plugin-haptics@2.3.2':
1330
+ resolution: {integrity: sha512-TqvBR5JoPodDQWPXsNymmyqp37dOpunZOdVVbx5xOAxki7rVwiCMvoEPdtJQNIrU+dQDfkQYZ2oDBVOu4hf+ig==}
1331
+
1332
+ '@tauri-apps/plugin-log@2.7.1':
1333
+ resolution: {integrity: sha512-jdb+o0wxQc8PjnLktgGpOs9Dh1YupaOGDXzO+Y8peA1UZ1ep3eXv4E1oiJ7nIQVN0XUFDDhnn3aBszl8ijhR+A==}
1334
+
1335
+ '@tauri-apps/plugin-opener@2.5.2':
1336
+ resolution: {integrity: sha512-ei/yRRoCklWHImwpCcDK3VhNXx+QXM9793aQ64YxpqVF0BDuuIlXhZgiAkc15wnPVav+IbkYhmDJIv5R326Mew==}
1337
+
1338
+ '@tauri-apps/plugin-os@2.3.2':
1339
+ resolution: {integrity: sha512-n+nXWeuSeF9wcEsSPmRnBEGrRgOy6jjkSU+UVCOV8YUGKb2erhDOxis7IqRXiRVHhY8XMKks00BJ0OAdkpf6+A==}
1340
+
1341
+ '@tauri-apps/plugin-store@2.4.1':
1342
+ resolution: {integrity: sha512-ckGSEzZ5Ii4Hf2D5x25Oqnm2Zf9MfDWAzR+volY0z/OOBz6aucPKEY0F649JvQ0Vupku6UJo7ugpGRDOFOunkA==}
1343
+
1344
+ '@types/babel__core@7.20.5':
1345
+ resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
1346
+
1347
+ '@types/babel__generator@7.27.0':
1348
+ resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==}
1349
+
1350
+ '@types/babel__template@7.4.4':
1351
+ resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
1352
+
1353
+ '@types/babel__traverse@7.28.0':
1354
+ resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==}
1355
+
1356
+ '@types/estree@1.0.8':
1357
+ resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
1358
+
1359
+ '@types/react-dom@19.2.3':
1360
+ resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==}
1361
+ peerDependencies:
1362
+ '@types/react': ^19.2.0
1363
+
1364
+ '@types/react@19.2.7':
1365
+ resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==}
1366
+
1367
+ '@vitejs/plugin-react@4.7.0':
1368
+ resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==}
1369
+ engines: {node: ^14.18.0 || >=16.0.0}
1370
+ peerDependencies:
1371
+ vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0
1372
+
1373
+ any-promise@1.3.0:
1374
+ resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
1375
+
1376
+ anymatch@3.1.3:
1377
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
1378
+ engines: {node: '>= 8'}
1379
+
1380
+ arg@5.0.2:
1381
+ resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
1382
+
1383
+ aria-hidden@1.2.6:
1384
+ resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==}
1385
+ engines: {node: '>=10'}
1386
+
1387
+ autoprefixer@10.4.22:
1388
+ resolution: {integrity: sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==}
1389
+ engines: {node: ^10 || ^12 || >=14}
1390
+ hasBin: true
1391
+ peerDependencies:
1392
+ postcss: ^8.1.0
1393
+
1394
+ baseline-browser-mapping@2.8.31:
1395
+ resolution: {integrity: sha512-a28v2eWrrRWPpJSzxc+mKwm0ZtVx/G8SepdQZDArnXYU/XS+IF6mp8aB/4E+hH1tyGCoDo3KlUCdlSxGDsRkAw==}
1396
+ hasBin: true
1397
+
1398
+ binary-extensions@2.3.0:
1399
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
1400
+ engines: {node: '>=8'}
1401
+
1402
+ braces@3.0.3:
1403
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
1404
+ engines: {node: '>=8'}
1405
+
1406
+ browserslist@4.28.0:
1407
+ resolution: {integrity: sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==}
1408
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
1409
+ hasBin: true
1410
+
1411
+ camelcase-css@2.0.1:
1412
+ resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
1413
+ engines: {node: '>= 6'}
1414
+
1415
+ caniuse-lite@1.0.30001757:
1416
+ resolution: {integrity: sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==}
1417
+
1418
+ chokidar@3.6.0:
1419
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
1420
+ engines: {node: '>= 8.10.0'}
1421
+
1422
+ class-variance-authority@0.7.1:
1423
+ resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==}
1424
+
1425
+ clsx@2.1.1:
1426
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
1427
+ engines: {node: '>=6'}
1428
+
1429
+ commander@4.1.1:
1430
+ resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
1431
+ engines: {node: '>= 6'}
1432
+
1433
+ convert-source-map@2.0.0:
1434
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
1435
+
1436
+ cssesc@3.0.0:
1437
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
1438
+ engines: {node: '>=4'}
1439
+ hasBin: true
1440
+
1441
+ csstype@3.2.3:
1442
+ resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
1443
+
1444
+ date-fns@4.1.0:
1445
+ resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==}
1446
+
1447
+ debug@4.4.3:
1448
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
1449
+ engines: {node: '>=6.0'}
1450
+ peerDependencies:
1451
+ supports-color: '*'
1452
+ peerDependenciesMeta:
1453
+ supports-color:
1454
+ optional: true
1455
+
1456
+ detect-node-es@1.1.0:
1457
+ resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
1458
+
1459
+ didyoumean@1.2.2:
1460
+ resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
1461
+
1462
+ dlv@1.1.3:
1463
+ resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
1464
+
1465
+ electron-to-chromium@1.5.259:
1466
+ resolution: {integrity: sha512-I+oLXgpEJzD6Cwuwt1gYjxsDmu/S/Kd41mmLA3O+/uH2pFRO/DvOjUyGozL8j3KeLV6WyZ7ssPwELMsXCcsJAQ==}
1467
+
1468
+ esbuild@0.25.12:
1469
+ resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==}
1470
+ engines: {node: '>=18'}
1471
+ hasBin: true
1472
+
1473
+ escalade@3.2.0:
1474
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
1475
+ engines: {node: '>=6'}
1476
+
1477
+ fast-glob@3.3.3:
1478
+ resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
1479
+ engines: {node: '>=8.6.0'}
1480
+
1481
+ fastq@1.19.1:
1482
+ resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
1483
+
1484
+ fdir@6.5.0:
1485
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
1486
+ engines: {node: '>=12.0.0'}
1487
+ peerDependencies:
1488
+ picomatch: ^3 || ^4
1489
+ peerDependenciesMeta:
1490
+ picomatch:
1491
+ optional: true
1492
+
1493
+ fill-range@7.1.1:
1494
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
1495
+ engines: {node: '>=8'}
1496
+
1497
+ fraction.js@5.3.4:
1498
+ resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==}
1499
+
1500
+ fsevents@2.3.3:
1501
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
1502
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
1503
+ os: [darwin]
1504
+
1505
+ function-bind@1.1.2:
1506
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
1507
+
1508
+ gensync@1.0.0-beta.2:
1509
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
1510
+ engines: {node: '>=6.9.0'}
1511
+
1512
+ get-nonce@1.0.1:
1513
+ resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
1514
+ engines: {node: '>=6'}
1515
+
1516
+ glob-parent@5.1.2:
1517
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
1518
+ engines: {node: '>= 6'}
1519
+
1520
+ glob-parent@6.0.2:
1521
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
1522
+ engines: {node: '>=10.13.0'}
1523
+
1524
+ hasown@2.0.2:
1525
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
1526
+ engines: {node: '>= 0.4'}
1527
+
1528
+ is-binary-path@2.1.0:
1529
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
1530
+ engines: {node: '>=8'}
1531
+
1532
+ is-core-module@2.16.1:
1533
+ resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
1534
+ engines: {node: '>= 0.4'}
1535
+
1536
+ is-extglob@2.1.1:
1537
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
1538
+ engines: {node: '>=0.10.0'}
1539
+
1540
+ is-glob@4.0.3:
1541
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
1542
+ engines: {node: '>=0.10.0'}
1543
+
1544
+ is-number@7.0.0:
1545
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
1546
+ engines: {node: '>=0.12.0'}
1547
+
1548
+ jiti@1.21.7:
1549
+ resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==}
1550
+ hasBin: true
1551
+
1552
+ js-tokens@4.0.0:
1553
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
1554
+
1555
+ jsesc@3.1.0:
1556
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
1557
+ engines: {node: '>=6'}
1558
+ hasBin: true
1559
+
1560
+ json5@2.2.3:
1561
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
1562
+ engines: {node: '>=6'}
1563
+ hasBin: true
1564
+
1565
+ lilconfig@3.1.3:
1566
+ resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
1567
+ engines: {node: '>=14'}
1568
+
1569
+ lines-and-columns@1.2.4:
1570
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
1571
+
1572
+ lru-cache@5.1.1:
1573
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
1574
+
1575
+ lucide-react@0.462.0:
1576
+ resolution: {integrity: sha512-NTL7EbAao9IFtuSivSZgrAh4fZd09Lr+6MTkqIxuHaH2nnYiYIzXPo06cOxHg9wKLdj6LL8TByG4qpePqwgx/g==}
1577
+ peerDependencies:
1578
+ react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc
1579
+
1580
+ merge2@1.4.1:
1581
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
1582
+ engines: {node: '>= 8'}
1583
+
1584
+ micromatch@4.0.8:
1585
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
1586
+ engines: {node: '>=8.6'}
1587
+
1588
+ ms@2.1.3:
1589
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
1590
+
1591
+ mz@2.7.0:
1592
+ resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
1593
+
1594
+ nanoid@3.3.11:
1595
+ resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
1596
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
1597
+ hasBin: true
1598
+
1599
+ node-releases@2.0.27:
1600
+ resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
1601
+
1602
+ normalize-path@3.0.0:
1603
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
1604
+ engines: {node: '>=0.10.0'}
1605
+
1606
+ normalize-range@0.1.2:
1607
+ resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
1608
+ engines: {node: '>=0.10.0'}
1609
+
1610
+ object-assign@4.1.1:
1611
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
1612
+ engines: {node: '>=0.10.0'}
1613
+
1614
+ object-hash@3.0.0:
1615
+ resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
1616
+ engines: {node: '>= 6'}
1617
+
1618
+ path-parse@1.0.7:
1619
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
1620
+
1621
+ picocolors@1.1.1:
1622
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
1623
+
1624
+ picomatch@2.3.1:
1625
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
1626
+ engines: {node: '>=8.6'}
1627
+
1628
+ picomatch@4.0.3:
1629
+ resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
1630
+ engines: {node: '>=12'}
1631
+
1632
+ pify@2.3.0:
1633
+ resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
1634
+ engines: {node: '>=0.10.0'}
1635
+
1636
+ pirates@4.0.7:
1637
+ resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==}
1638
+ engines: {node: '>= 6'}
1639
+
1640
+ postcss-import@15.1.0:
1641
+ resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
1642
+ engines: {node: '>=14.0.0'}
1643
+ peerDependencies:
1644
+ postcss: ^8.0.0
1645
+
1646
+ postcss-js@4.1.0:
1647
+ resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==}
1648
+ engines: {node: ^12 || ^14 || >= 16}
1649
+ peerDependencies:
1650
+ postcss: ^8.4.21
1651
+
1652
+ postcss-load-config@6.0.1:
1653
+ resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==}
1654
+ engines: {node: '>= 18'}
1655
+ peerDependencies:
1656
+ jiti: '>=1.21.0'
1657
+ postcss: '>=8.0.9'
1658
+ tsx: ^4.8.1
1659
+ yaml: ^2.4.2
1660
+ peerDependenciesMeta:
1661
+ jiti:
1662
+ optional: true
1663
+ postcss:
1664
+ optional: true
1665
+ tsx:
1666
+ optional: true
1667
+ yaml:
1668
+ optional: true
1669
+
1670
+ postcss-nested@6.2.0:
1671
+ resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==}
1672
+ engines: {node: '>=12.0'}
1673
+ peerDependencies:
1674
+ postcss: ^8.2.14
1675
+
1676
+ postcss-selector-parser@6.1.2:
1677
+ resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
1678
+ engines: {node: '>=4'}
1679
+
1680
+ postcss-value-parser@4.2.0:
1681
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
1682
+
1683
+ postcss@8.5.6:
1684
+ resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
1685
+ engines: {node: ^10 || ^12 || >=14}
1686
+
1687
+ queue-microtask@1.2.3:
1688
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
1689
+
1690
+ react-dom@19.2.0:
1691
+ resolution: {integrity: sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==}
1692
+ peerDependencies:
1693
+ react: ^19.2.0
1694
+
1695
+ react-hook-form@7.66.1:
1696
+ resolution: {integrity: sha512-2KnjpgG2Rhbi+CIiIBQQ9Df6sMGH5ExNyFl4Hw9qO7pIqMBR8Bvu9RQyjl3JM4vehzCh9soiNUM/xYMswb2EiA==}
1697
+ engines: {node: '>=18.0.0'}
1698
+ peerDependencies:
1699
+ react: ^16.8.0 || ^17 || ^18 || ^19
1700
+
1701
+ react-refresh@0.17.0:
1702
+ resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==}
1703
+ engines: {node: '>=0.10.0'}
1704
+
1705
+ react-remove-scroll-bar@2.3.8:
1706
+ resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==}
1707
+ engines: {node: '>=10'}
1708
+ peerDependencies:
1709
+ '@types/react': '*'
1710
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
1711
+ peerDependenciesMeta:
1712
+ '@types/react':
1713
+ optional: true
1714
+
1715
+ react-remove-scroll@2.7.1:
1716
+ resolution: {integrity: sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==}
1717
+ engines: {node: '>=10'}
1718
+ peerDependencies:
1719
+ '@types/react': '*'
1720
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
1721
+ peerDependenciesMeta:
1722
+ '@types/react':
1723
+ optional: true
1724
+
1725
+ react-router-dom@6.30.2:
1726
+ resolution: {integrity: sha512-l2OwHn3UUnEVUqc6/1VMmR1cvZryZ3j3NzapC2eUXO1dB0sYp5mvwdjiXhpUbRb21eFow3qSxpP8Yv6oAU824Q==}
1727
+ engines: {node: '>=14.0.0'}
1728
+ peerDependencies:
1729
+ react: '>=16.8'
1730
+ react-dom: '>=16.8'
1731
+
1732
+ react-router@6.30.2:
1733
+ resolution: {integrity: sha512-H2Bm38Zu1bm8KUE5NVWRMzuIyAV8p/JrOaBJAwVmp37AXG72+CZJlEBw6pdn9i5TBgLMhNDgijS4ZlblpHyWTA==}
1734
+ engines: {node: '>=14.0.0'}
1735
+ peerDependencies:
1736
+ react: '>=16.8'
1737
+
1738
+ react-style-singleton@2.2.3:
1739
+ resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==}
1740
+ engines: {node: '>=10'}
1741
+ peerDependencies:
1742
+ '@types/react': '*'
1743
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
1744
+ peerDependenciesMeta:
1745
+ '@types/react':
1746
+ optional: true
1747
+
1748
+ react@19.2.0:
1749
+ resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==}
1750
+ engines: {node: '>=0.10.0'}
1751
+
1752
+ read-cache@1.0.0:
1753
+ resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
1754
+
1755
+ readdirp@3.6.0:
1756
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
1757
+ engines: {node: '>=8.10.0'}
1758
+
1759
+ resolve@1.22.11:
1760
+ resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==}
1761
+ engines: {node: '>= 0.4'}
1762
+ hasBin: true
1763
+
1764
+ reusify@1.1.0:
1765
+ resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
1766
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
1767
+
1768
+ rollup@4.53.3:
1769
+ resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==}
1770
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
1771
+ hasBin: true
1772
+
1773
+ run-parallel@1.2.0:
1774
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
1775
+
1776
+ scheduler@0.27.0:
1777
+ resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
1778
+
1779
+ semver@6.3.1:
1780
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
1781
+ hasBin: true
1782
+
1783
+ source-map-js@1.2.1:
1784
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
1785
+ engines: {node: '>=0.10.0'}
1786
+
1787
+ sucrase@3.35.1:
1788
+ resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==}
1789
+ engines: {node: '>=16 || 14 >=14.17'}
1790
+ hasBin: true
1791
+
1792
+ supports-preserve-symlinks-flag@1.0.0:
1793
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
1794
+ engines: {node: '>= 0.4'}
1795
+
1796
+ tailwind-merge@2.6.0:
1797
+ resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==}
1798
+
1799
+ tailwindcss-animate@1.0.7:
1800
+ resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==}
1801
+ peerDependencies:
1802
+ tailwindcss: '>=3.0.0 || insiders'
1803
+
1804
+ tailwindcss@3.4.18:
1805
+ resolution: {integrity: sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==}
1806
+ engines: {node: '>=14.0.0'}
1807
+ hasBin: true
1808
+
1809
+ tauri-plugin-admob-api@0.0.4:
1810
+ resolution: {integrity: sha512-c/ZwczxTM5gTSyq0iLuai5lynvF22q3EbKRW05CzZpiVRiTElgSGMDUkJp316dVmxb/L+DOcwSZ0pZ0zfgQz9g==}
1811
+
1812
+ thenify-all@1.6.0:
1813
+ resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
1814
+ engines: {node: '>=0.8'}
1815
+
1816
+ thenify@3.3.1:
1817
+ resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
1818
+
1819
+ tinyglobby@0.2.15:
1820
+ resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
1821
+ engines: {node: '>=12.0.0'}
1822
+
1823
+ to-regex-range@5.0.1:
1824
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
1825
+ engines: {node: '>=8.0'}
1826
+
1827
+ ts-interface-checker@0.1.13:
1828
+ resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
1829
+
1830
+ tslib@2.8.1:
1831
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
1832
+
1833
+ typescript@5.8.3:
1834
+ resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==}
1835
+ engines: {node: '>=14.17'}
1836
+ hasBin: true
1837
+
1838
+ update-browserslist-db@1.1.4:
1839
+ resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==}
1840
+ hasBin: true
1841
+ peerDependencies:
1842
+ browserslist: '>= 4.21.0'
1843
+
1844
+ use-callback-ref@1.3.3:
1845
+ resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==}
1846
+ engines: {node: '>=10'}
1847
+ peerDependencies:
1848
+ '@types/react': '*'
1849
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
1850
+ peerDependenciesMeta:
1851
+ '@types/react':
1852
+ optional: true
1853
+
1854
+ use-sidecar@1.1.3:
1855
+ resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==}
1856
+ engines: {node: '>=10'}
1857
+ peerDependencies:
1858
+ '@types/react': '*'
1859
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
1860
+ peerDependenciesMeta:
1861
+ '@types/react':
1862
+ optional: true
1863
+
1864
+ use-sync-external-store@1.6.0:
1865
+ resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==}
1866
+ peerDependencies:
1867
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
1868
+
1869
+ util-deprecate@1.0.2:
1870
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
1871
+
1872
+ vite@7.2.4:
1873
+ resolution: {integrity: sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==}
1874
+ engines: {node: ^20.19.0 || >=22.12.0}
1875
+ hasBin: true
1876
+ peerDependencies:
1877
+ '@types/node': ^20.19.0 || >=22.12.0
1878
+ jiti: '>=1.21.0'
1879
+ less: ^4.0.0
1880
+ lightningcss: ^1.21.0
1881
+ sass: ^1.70.0
1882
+ sass-embedded: ^1.70.0
1883
+ stylus: '>=0.54.8'
1884
+ sugarss: ^5.0.0
1885
+ terser: ^5.16.0
1886
+ tsx: ^4.8.1
1887
+ yaml: ^2.4.2
1888
+ peerDependenciesMeta:
1889
+ '@types/node':
1890
+ optional: true
1891
+ jiti:
1892
+ optional: true
1893
+ less:
1894
+ optional: true
1895
+ lightningcss:
1896
+ optional: true
1897
+ sass:
1898
+ optional: true
1899
+ sass-embedded:
1900
+ optional: true
1901
+ stylus:
1902
+ optional: true
1903
+ sugarss:
1904
+ optional: true
1905
+ terser:
1906
+ optional: true
1907
+ tsx:
1908
+ optional: true
1909
+ yaml:
1910
+ optional: true
1911
+
1912
+ yallist@3.1.1:
1913
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
1914
+
1915
+snapshots:
1916
+
1917
+ '@alloc/quick-lru@5.2.0': {}
1918
+
1919
+ '@babel/code-frame@7.27.1':
1920
+ dependencies:
1921
+ '@babel/helper-validator-identifier': 7.28.5
1922
+ js-tokens: 4.0.0
1923
+ picocolors: 1.1.1
1924
+
1925
+ '@babel/compat-data@7.28.5': {}
1926
+
1927
+ '@babel/core@7.28.5':
1928
+ dependencies:
1929
+ '@babel/code-frame': 7.27.1
1930
+ '@babel/generator': 7.28.5
1931
+ '@babel/helper-compilation-targets': 7.27.2
1932
+ '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5)
1933
+ '@babel/helpers': 7.28.4
1934
+ '@babel/parser': 7.28.5
1935
+ '@babel/template': 7.27.2
1936
+ '@babel/traverse': 7.28.5
1937
+ '@babel/types': 7.28.5
1938
+ '@jridgewell/remapping': 2.3.5
1939
+ convert-source-map: 2.0.0
1940
+ debug: 4.4.3
1941
+ gensync: 1.0.0-beta.2
1942
+ json5: 2.2.3
1943
+ semver: 6.3.1
1944
+ transitivePeerDependencies:
1945
+ - supports-color
1946
+
1947
+ '@babel/generator@7.28.5':
1948
+ dependencies:
1949
+ '@babel/parser': 7.28.5
1950
+ '@babel/types': 7.28.5
1951
+ '@jridgewell/gen-mapping': 0.3.13
1952
+ '@jridgewell/trace-mapping': 0.3.31
1953
+ jsesc: 3.1.0
1954
+
1955
+ '@babel/helper-compilation-targets@7.27.2':
1956
+ dependencies:
1957
+ '@babel/compat-data': 7.28.5
1958
+ '@babel/helper-validator-option': 7.27.1
1959
+ browserslist: 4.28.0
1960
+ lru-cache: 5.1.1
1961
+ semver: 6.3.1
1962
+
1963
+ '@babel/helper-globals@7.28.0': {}
1964
+
1965
+ '@babel/helper-module-imports@7.27.1':
1966
+ dependencies:
1967
+ '@babel/traverse': 7.28.5
1968
+ '@babel/types': 7.28.5
1969
+ transitivePeerDependencies:
1970
+ - supports-color
1971
+
1972
+ '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)':
1973
+ dependencies:
1974
+ '@babel/core': 7.28.5
1975
+ '@babel/helper-module-imports': 7.27.1
1976
+ '@babel/helper-validator-identifier': 7.28.5
1977
+ '@babel/traverse': 7.28.5
1978
+ transitivePeerDependencies:
1979
+ - supports-color
1980
+
1981
+ '@babel/helper-plugin-utils@7.27.1': {}
1982
+
1983
+ '@babel/helper-string-parser@7.27.1': {}
1984
+
1985
+ '@babel/helper-validator-identifier@7.28.5': {}
1986
+
1987
+ '@babel/helper-validator-option@7.27.1': {}
1988
+
1989
+ '@babel/helpers@7.28.4':
1990
+ dependencies:
1991
+ '@babel/template': 7.27.2
1992
+ '@babel/types': 7.28.5
1993
+
1994
+ '@babel/parser@7.28.5':
1995
+ dependencies:
1996
+ '@babel/types': 7.28.5
1997
+
1998
+ '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5)':
1999
+ dependencies:
2000
+ '@babel/core': 7.28.5
2001
+ '@babel/helper-plugin-utils': 7.27.1
2002
+
2003
+ '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.5)':
2004
+ dependencies:
2005
+ '@babel/core': 7.28.5
2006
+ '@babel/helper-plugin-utils': 7.27.1
2007
+
2008
+ '@babel/template@7.27.2':
2009
+ dependencies:
2010
+ '@babel/code-frame': 7.27.1
2011
+ '@babel/parser': 7.28.5
2012
+ '@babel/types': 7.28.5
2013
+
2014
+ '@babel/traverse@7.28.5':
2015
+ dependencies:
2016
+ '@babel/code-frame': 7.27.1
2017
+ '@babel/generator': 7.28.5
2018
+ '@babel/helper-globals': 7.28.0
2019
+ '@babel/parser': 7.28.5
2020
+ '@babel/template': 7.27.2
2021
+ '@babel/types': 7.28.5
2022
+ debug: 4.4.3
2023
+ transitivePeerDependencies:
2024
+ - supports-color
2025
+
2026
+ '@babel/types@7.28.5':
2027
+ dependencies:
2028
+ '@babel/helper-string-parser': 7.27.1
2029
+ '@babel/helper-validator-identifier': 7.28.5
2030
+
2031
+ '@esbuild/aix-ppc64@0.25.12':
2032
+ optional: true
2033
+
2034
+ '@esbuild/android-arm64@0.25.12':
2035
+ optional: true
2036
+
2037
+ '@esbuild/android-arm@0.25.12':
2038
+ optional: true
2039
+
2040
+ '@esbuild/android-x64@0.25.12':
2041
+ optional: true
2042
+
2043
+ '@esbuild/darwin-arm64@0.25.12':
2044
+ optional: true
2045
+
2046
+ '@esbuild/darwin-x64@0.25.12':
2047
+ optional: true
2048
+
2049
+ '@esbuild/freebsd-arm64@0.25.12':
2050
+ optional: true
2051
+
2052
+ '@esbuild/freebsd-x64@0.25.12':
2053
+ optional: true
2054
+
2055
+ '@esbuild/linux-arm64@0.25.12':
2056
+ optional: true
2057
+
2058
+ '@esbuild/linux-arm@0.25.12':
2059
+ optional: true
2060
+
2061
+ '@esbuild/linux-ia32@0.25.12':
2062
+ optional: true
2063
+
2064
+ '@esbuild/linux-loong64@0.25.12':
2065
+ optional: true
2066
+
2067
+ '@esbuild/linux-mips64el@0.25.12':
2068
+ optional: true
2069
+
2070
+ '@esbuild/linux-ppc64@0.25.12':
2071
+ optional: true
2072
+
2073
+ '@esbuild/linux-riscv64@0.25.12':
2074
+ optional: true
2075
+
2076
+ '@esbuild/linux-s390x@0.25.12':
2077
+ optional: true
2078
+
2079
+ '@esbuild/linux-x64@0.25.12':
2080
+ optional: true
2081
+
2082
+ '@esbuild/netbsd-arm64@0.25.12':
2083
+ optional: true
2084
+
2085
+ '@esbuild/netbsd-x64@0.25.12':
2086
+ optional: true
2087
+
2088
+ '@esbuild/openbsd-arm64@0.25.12':
2089
+ optional: true
2090
+
2091
+ '@esbuild/openbsd-x64@0.25.12':
2092
+ optional: true
2093
+
2094
+ '@esbuild/openharmony-arm64@0.25.12':
2095
+ optional: true
2096
+
2097
+ '@esbuild/sunos-x64@0.25.12':
2098
+ optional: true
2099
+
2100
+ '@esbuild/win32-arm64@0.25.12':
2101
+ optional: true
2102
+
2103
+ '@esbuild/win32-ia32@0.25.12':
2104
+ optional: true
2105
+
2106
+ '@esbuild/win32-x64@0.25.12':
2107
+ optional: true
2108
+
2109
+ '@fabianlars/tauri-plugin-oauth@2.0.0':
2110
+ dependencies:
2111
+ '@tauri-apps/api': 2.9.0
2112
+
2113
+ '@floating-ui/core@1.7.3':
2114
+ dependencies:
2115
+ '@floating-ui/utils': 0.2.10
2116
+
2117
+ '@floating-ui/dom@1.7.4':
2118
+ dependencies:
2119
+ '@floating-ui/core': 1.7.3
2120
+ '@floating-ui/utils': 0.2.10
2121
+
2122
+ '@floating-ui/react-dom@2.1.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2123
+ dependencies:
2124
+ '@floating-ui/dom': 1.7.4
2125
+ react: 19.2.0
2126
+ react-dom: 19.2.0(react@19.2.0)
2127
+
2128
+ '@floating-ui/utils@0.2.10': {}
2129
+
2130
+ '@hookform/resolvers@3.10.0(react-hook-form@7.66.1(react@19.2.0))':
2131
+ dependencies:
2132
+ react-hook-form: 7.66.1(react@19.2.0)
2133
+
2134
+ '@jridgewell/gen-mapping@0.3.13':
2135
+ dependencies:
2136
+ '@jridgewell/sourcemap-codec': 1.5.5
2137
+ '@jridgewell/trace-mapping': 0.3.31
2138
+
2139
+ '@jridgewell/remapping@2.3.5':
2140
+ dependencies:
2141
+ '@jridgewell/gen-mapping': 0.3.13
2142
+ '@jridgewell/trace-mapping': 0.3.31
2143
+
2144
+ '@jridgewell/resolve-uri@3.1.2': {}
2145
+
2146
+ '@jridgewell/sourcemap-codec@1.5.5': {}
2147
+
2148
+ '@jridgewell/trace-mapping@0.3.31':
2149
+ dependencies:
2150
+ '@jridgewell/resolve-uri': 3.1.2
2151
+ '@jridgewell/sourcemap-codec': 1.5.5
2152
+
2153
+ '@nodelib/fs.scandir@2.1.5':
2154
+ dependencies:
2155
+ '@nodelib/fs.stat': 2.0.5
2156
+ run-parallel: 1.2.0
2157
+
2158
+ '@nodelib/fs.stat@2.0.5': {}
2159
+
2160
+ '@nodelib/fs.walk@1.2.8':
2161
+ dependencies:
2162
+ '@nodelib/fs.scandir': 2.1.5
2163
+ fastq: 1.19.1
2164
+
2165
+ '@radix-ui/number@1.1.1': {}
2166
+
2167
+ '@radix-ui/primitive@1.1.3': {}
2168
+
2169
+ '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2170
+ dependencies:
2171
+ '@radix-ui/primitive': 1.1.3
2172
+ '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2173
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2174
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2175
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2176
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2177
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2178
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2179
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.0)
2180
+ react: 19.2.0
2181
+ react-dom: 19.2.0(react@19.2.0)
2182
+ optionalDependencies:
2183
+ '@types/react': 19.2.7
2184
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2185
+
2186
+ '@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2187
+ dependencies:
2188
+ '@radix-ui/primitive': 1.1.3
2189
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2190
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2191
+ '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2192
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2193
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.0)
2194
+ react: 19.2.0
2195
+ react-dom: 19.2.0(react@19.2.0)
2196
+ optionalDependencies:
2197
+ '@types/react': 19.2.7
2198
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2199
+
2200
+ '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2201
+ dependencies:
2202
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2203
+ react: 19.2.0
2204
+ react-dom: 19.2.0(react@19.2.0)
2205
+ optionalDependencies:
2206
+ '@types/react': 19.2.7
2207
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2208
+
2209
+ '@radix-ui/react-aspect-ratio@1.1.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2210
+ dependencies:
2211
+ '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2212
+ react: 19.2.0
2213
+ react-dom: 19.2.0(react@19.2.0)
2214
+ optionalDependencies:
2215
+ '@types/react': 19.2.7
2216
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2217
+
2218
+ '@radix-ui/react-avatar@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2219
+ dependencies:
2220
+ '@radix-ui/react-context': 1.1.3(@types/react@19.2.7)(react@19.2.0)
2221
+ '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2222
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2223
+ '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.7)(react@19.2.0)
2224
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2225
+ react: 19.2.0
2226
+ react-dom: 19.2.0(react@19.2.0)
2227
+ optionalDependencies:
2228
+ '@types/react': 19.2.7
2229
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2230
+
2231
+ '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2232
+ dependencies:
2233
+ '@radix-ui/primitive': 1.1.3
2234
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2235
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2236
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2237
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2238
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.0)
2239
+ '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2240
+ '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2241
+ react: 19.2.0
2242
+ react-dom: 19.2.0(react@19.2.0)
2243
+ optionalDependencies:
2244
+ '@types/react': 19.2.7
2245
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2246
+
2247
+ '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2248
+ dependencies:
2249
+ '@radix-ui/primitive': 1.1.3
2250
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2251
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2252
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2253
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2254
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2255
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.0)
2256
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2257
+ react: 19.2.0
2258
+ react-dom: 19.2.0(react@19.2.0)
2259
+ optionalDependencies:
2260
+ '@types/react': 19.2.7
2261
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2262
+
2263
+ '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2264
+ dependencies:
2265
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2266
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2267
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2268
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.0)
2269
+ react: 19.2.0
2270
+ react-dom: 19.2.0(react@19.2.0)
2271
+ optionalDependencies:
2272
+ '@types/react': 19.2.7
2273
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2274
+
2275
+ '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.7)(react@19.2.0)':
2276
+ dependencies:
2277
+ react: 19.2.0
2278
+ optionalDependencies:
2279
+ '@types/react': 19.2.7
2280
+
2281
+ '@radix-ui/react-context-menu@2.2.16(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2282
+ dependencies:
2283
+ '@radix-ui/primitive': 1.1.3
2284
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2285
+ '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2286
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2287
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2288
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.0)
2289
+ react: 19.2.0
2290
+ react-dom: 19.2.0(react@19.2.0)
2291
+ optionalDependencies:
2292
+ '@types/react': 19.2.7
2293
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2294
+
2295
+ '@radix-ui/react-context@1.1.2(@types/react@19.2.7)(react@19.2.0)':
2296
+ dependencies:
2297
+ react: 19.2.0
2298
+ optionalDependencies:
2299
+ '@types/react': 19.2.7
2300
+
2301
+ '@radix-ui/react-context@1.1.3(@types/react@19.2.7)(react@19.2.0)':
2302
+ dependencies:
2303
+ react: 19.2.0
2304
+ optionalDependencies:
2305
+ '@types/react': 19.2.7
2306
+
2307
+ '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2308
+ dependencies:
2309
+ '@radix-ui/primitive': 1.1.3
2310
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2311
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2312
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2313
+ '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.7)(react@19.2.0)
2314
+ '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2315
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2316
+ '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2317
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2318
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2319
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.0)
2320
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.0)
2321
+ aria-hidden: 1.2.6
2322
+ react: 19.2.0
2323
+ react-dom: 19.2.0(react@19.2.0)
2324
+ react-remove-scroll: 2.7.1(@types/react@19.2.7)(react@19.2.0)
2325
+ optionalDependencies:
2326
+ '@types/react': 19.2.7
2327
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2328
+
2329
+ '@radix-ui/react-direction@1.1.1(@types/react@19.2.7)(react@19.2.0)':
2330
+ dependencies:
2331
+ react: 19.2.0
2332
+ optionalDependencies:
2333
+ '@types/react': 19.2.7
2334
+
2335
+ '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2336
+ dependencies:
2337
+ '@radix-ui/primitive': 1.1.3
2338
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2339
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2340
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2341
+ '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2342
+ react: 19.2.0
2343
+ react-dom: 19.2.0(react@19.2.0)
2344
+ optionalDependencies:
2345
+ '@types/react': 19.2.7
2346
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2347
+
2348
+ '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2349
+ dependencies:
2350
+ '@radix-ui/primitive': 1.1.3
2351
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2352
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2353
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2354
+ '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2355
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2356
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.0)
2357
+ react: 19.2.0
2358
+ react-dom: 19.2.0(react@19.2.0)
2359
+ optionalDependencies:
2360
+ '@types/react': 19.2.7
2361
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2362
+
2363
+ '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.7)(react@19.2.0)':
2364
+ dependencies:
2365
+ react: 19.2.0
2366
+ optionalDependencies:
2367
+ '@types/react': 19.2.7
2368
+
2369
+ '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2370
+ dependencies:
2371
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2372
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2373
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2374
+ react: 19.2.0
2375
+ react-dom: 19.2.0(react@19.2.0)
2376
+ optionalDependencies:
2377
+ '@types/react': 19.2.7
2378
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2379
+
2380
+ '@radix-ui/react-hover-card@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2381
+ dependencies:
2382
+ '@radix-ui/primitive': 1.1.3
2383
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2384
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2385
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2386
+ '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2387
+ '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2388
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2389
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2390
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.0)
2391
+ react: 19.2.0
2392
+ react-dom: 19.2.0(react@19.2.0)
2393
+ optionalDependencies:
2394
+ '@types/react': 19.2.7
2395
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2396
+
2397
+ '@radix-ui/react-id@1.1.1(@types/react@19.2.7)(react@19.2.0)':
2398
+ dependencies:
2399
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2400
+ react: 19.2.0
2401
+ optionalDependencies:
2402
+ '@types/react': 19.2.7
2403
+
2404
+ '@radix-ui/react-label@2.1.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2405
+ dependencies:
2406
+ '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2407
+ react: 19.2.0
2408
+ react-dom: 19.2.0(react@19.2.0)
2409
+ optionalDependencies:
2410
+ '@types/react': 19.2.7
2411
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2412
+
2413
+ '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2414
+ dependencies:
2415
+ '@radix-ui/primitive': 1.1.3
2416
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2417
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2418
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2419
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2420
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2421
+ '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.7)(react@19.2.0)
2422
+ '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2423
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2424
+ '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2425
+ '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2426
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2427
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2428
+ '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2429
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.0)
2430
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2431
+ aria-hidden: 1.2.6
2432
+ react: 19.2.0
2433
+ react-dom: 19.2.0(react@19.2.0)
2434
+ react-remove-scroll: 2.7.1(@types/react@19.2.7)(react@19.2.0)
2435
+ optionalDependencies:
2436
+ '@types/react': 19.2.7
2437
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2438
+
2439
+ '@radix-ui/react-menubar@1.1.16(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2440
+ dependencies:
2441
+ '@radix-ui/primitive': 1.1.3
2442
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2443
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2444
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2445
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2446
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2447
+ '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2448
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2449
+ '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2450
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.0)
2451
+ react: 19.2.0
2452
+ react-dom: 19.2.0(react@19.2.0)
2453
+ optionalDependencies:
2454
+ '@types/react': 19.2.7
2455
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2456
+
2457
+ '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2458
+ dependencies:
2459
+ '@radix-ui/primitive': 1.1.3
2460
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2461
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2462
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2463
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2464
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2465
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2466
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2467
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2468
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2469
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.0)
2470
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2471
+ '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2472
+ '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2473
+ react: 19.2.0
2474
+ react-dom: 19.2.0(react@19.2.0)
2475
+ optionalDependencies:
2476
+ '@types/react': 19.2.7
2477
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2478
+
2479
+ '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2480
+ dependencies:
2481
+ '@radix-ui/primitive': 1.1.3
2482
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2483
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2484
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2485
+ '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.7)(react@19.2.0)
2486
+ '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2487
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2488
+ '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2489
+ '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2490
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2491
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2492
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.0)
2493
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.0)
2494
+ aria-hidden: 1.2.6
2495
+ react: 19.2.0
2496
+ react-dom: 19.2.0(react@19.2.0)
2497
+ react-remove-scroll: 2.7.1(@types/react@19.2.7)(react@19.2.0)
2498
+ optionalDependencies:
2499
+ '@types/react': 19.2.7
2500
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2501
+
2502
+ '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2503
+ dependencies:
2504
+ '@floating-ui/react-dom': 2.1.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2505
+ '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2506
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2507
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2508
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2509
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2510
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2511
+ '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2512
+ '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2513
+ '@radix-ui/rect': 1.1.1
2514
+ react: 19.2.0
2515
+ react-dom: 19.2.0(react@19.2.0)
2516
+ optionalDependencies:
2517
+ '@types/react': 19.2.7
2518
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2519
+
2520
+ '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2521
+ dependencies:
2522
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2523
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2524
+ react: 19.2.0
2525
+ react-dom: 19.2.0(react@19.2.0)
2526
+ optionalDependencies:
2527
+ '@types/react': 19.2.7
2528
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2529
+
2530
+ '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2531
+ dependencies:
2532
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2533
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2534
+ react: 19.2.0
2535
+ react-dom: 19.2.0(react@19.2.0)
2536
+ optionalDependencies:
2537
+ '@types/react': 19.2.7
2538
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2539
+
2540
+ '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2541
+ dependencies:
2542
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.0)
2543
+ react: 19.2.0
2544
+ react-dom: 19.2.0(react@19.2.0)
2545
+ optionalDependencies:
2546
+ '@types/react': 19.2.7
2547
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2548
+
2549
+ '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2550
+ dependencies:
2551
+ '@radix-ui/react-slot': 1.2.4(@types/react@19.2.7)(react@19.2.0)
2552
+ react: 19.2.0
2553
+ react-dom: 19.2.0(react@19.2.0)
2554
+ optionalDependencies:
2555
+ '@types/react': 19.2.7
2556
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2557
+
2558
+ '@radix-ui/react-progress@1.1.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2559
+ dependencies:
2560
+ '@radix-ui/react-context': 1.1.3(@types/react@19.2.7)(react@19.2.0)
2561
+ '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2562
+ react: 19.2.0
2563
+ react-dom: 19.2.0(react@19.2.0)
2564
+ optionalDependencies:
2565
+ '@types/react': 19.2.7
2566
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2567
+
2568
+ '@radix-ui/react-radio-group@1.3.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2569
+ dependencies:
2570
+ '@radix-ui/primitive': 1.1.3
2571
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2572
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2573
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2574
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2575
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2576
+ '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2577
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.0)
2578
+ '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2579
+ '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2580
+ react: 19.2.0
2581
+ react-dom: 19.2.0(react@19.2.0)
2582
+ optionalDependencies:
2583
+ '@types/react': 19.2.7
2584
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2585
+
2586
+ '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2587
+ dependencies:
2588
+ '@radix-ui/primitive': 1.1.3
2589
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2590
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2591
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2592
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2593
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2594
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2595
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2596
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.0)
2597
+ react: 19.2.0
2598
+ react-dom: 19.2.0(react@19.2.0)
2599
+ optionalDependencies:
2600
+ '@types/react': 19.2.7
2601
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2602
+
2603
+ '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2604
+ dependencies:
2605
+ '@radix-ui/number': 1.1.1
2606
+ '@radix-ui/primitive': 1.1.3
2607
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2608
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2609
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2610
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2611
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2612
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2613
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2614
+ react: 19.2.0
2615
+ react-dom: 19.2.0(react@19.2.0)
2616
+ optionalDependencies:
2617
+ '@types/react': 19.2.7
2618
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2619
+
2620
+ '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2621
+ dependencies:
2622
+ '@radix-ui/number': 1.1.1
2623
+ '@radix-ui/primitive': 1.1.3
2624
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2625
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2626
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2627
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2628
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2629
+ '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.7)(react@19.2.0)
2630
+ '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2631
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2632
+ '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2633
+ '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2634
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2635
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.0)
2636
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2637
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.0)
2638
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2639
+ '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2640
+ '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2641
+ aria-hidden: 1.2.6
2642
+ react: 19.2.0
2643
+ react-dom: 19.2.0(react@19.2.0)
2644
+ react-remove-scroll: 2.7.1(@types/react@19.2.7)(react@19.2.0)
2645
+ optionalDependencies:
2646
+ '@types/react': 19.2.7
2647
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2648
+
2649
+ '@radix-ui/react-separator@1.1.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2650
+ dependencies:
2651
+ '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2652
+ react: 19.2.0
2653
+ react-dom: 19.2.0(react@19.2.0)
2654
+ optionalDependencies:
2655
+ '@types/react': 19.2.7
2656
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2657
+
2658
+ '@radix-ui/react-slider@1.3.6(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2659
+ dependencies:
2660
+ '@radix-ui/number': 1.1.1
2661
+ '@radix-ui/primitive': 1.1.3
2662
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2663
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2664
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2665
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2666
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2667
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.0)
2668
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2669
+ '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2670
+ '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2671
+ react: 19.2.0
2672
+ react-dom: 19.2.0(react@19.2.0)
2673
+ optionalDependencies:
2674
+ '@types/react': 19.2.7
2675
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2676
+
2677
+ '@radix-ui/react-slot@1.2.3(@types/react@19.2.7)(react@19.2.0)':
2678
+ dependencies:
2679
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2680
+ react: 19.2.0
2681
+ optionalDependencies:
2682
+ '@types/react': 19.2.7
2683
+
2684
+ '@radix-ui/react-slot@1.2.4(@types/react@19.2.7)(react@19.2.0)':
2685
+ dependencies:
2686
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2687
+ react: 19.2.0
2688
+ optionalDependencies:
2689
+ '@types/react': 19.2.7
2690
+
2691
+ '@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2692
+ dependencies:
2693
+ '@radix-ui/primitive': 1.1.3
2694
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2695
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2696
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2697
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.0)
2698
+ '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2699
+ '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2700
+ react: 19.2.0
2701
+ react-dom: 19.2.0(react@19.2.0)
2702
+ optionalDependencies:
2703
+ '@types/react': 19.2.7
2704
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2705
+
2706
+ '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2707
+ dependencies:
2708
+ '@radix-ui/primitive': 1.1.3
2709
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2710
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2711
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2712
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2713
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2714
+ '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2715
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.0)
2716
+ react: 19.2.0
2717
+ react-dom: 19.2.0(react@19.2.0)
2718
+ optionalDependencies:
2719
+ '@types/react': 19.2.7
2720
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2721
+
2722
+ '@radix-ui/react-toast@1.2.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2723
+ dependencies:
2724
+ '@radix-ui/primitive': 1.1.3
2725
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2726
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2727
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2728
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2729
+ '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2730
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2731
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2732
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2733
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.0)
2734
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2735
+ '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2736
+ react: 19.2.0
2737
+ react-dom: 19.2.0(react@19.2.0)
2738
+ optionalDependencies:
2739
+ '@types/react': 19.2.7
2740
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2741
+
2742
+ '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2743
+ dependencies:
2744
+ '@radix-ui/primitive': 1.1.3
2745
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2746
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2747
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2748
+ '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2749
+ '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2750
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.0)
2751
+ react: 19.2.0
2752
+ react-dom: 19.2.0(react@19.2.0)
2753
+ optionalDependencies:
2754
+ '@types/react': 19.2.7
2755
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2756
+
2757
+ '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2758
+ dependencies:
2759
+ '@radix-ui/primitive': 1.1.3
2760
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2761
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.0)
2762
+ react: 19.2.0
2763
+ react-dom: 19.2.0(react@19.2.0)
2764
+ optionalDependencies:
2765
+ '@types/react': 19.2.7
2766
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2767
+
2768
+ '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2769
+ dependencies:
2770
+ '@radix-ui/primitive': 1.1.3
2771
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2772
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.0)
2773
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2774
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2775
+ '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2776
+ '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2777
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2778
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2779
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.0)
2780
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.0)
2781
+ '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2782
+ react: 19.2.0
2783
+ react-dom: 19.2.0(react@19.2.0)
2784
+ optionalDependencies:
2785
+ '@types/react': 19.2.7
2786
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2787
+
2788
+ '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.7)(react@19.2.0)':
2789
+ dependencies:
2790
+ react: 19.2.0
2791
+ optionalDependencies:
2792
+ '@types/react': 19.2.7
2793
+
2794
+ '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.7)(react@19.2.0)':
2795
+ dependencies:
2796
+ '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.7)(react@19.2.0)
2797
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2798
+ react: 19.2.0
2799
+ optionalDependencies:
2800
+ '@types/react': 19.2.7
2801
+
2802
+ '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.7)(react@19.2.0)':
2803
+ dependencies:
2804
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2805
+ react: 19.2.0
2806
+ optionalDependencies:
2807
+ '@types/react': 19.2.7
2808
+
2809
+ '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.7)(react@19.2.0)':
2810
+ dependencies:
2811
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2812
+ react: 19.2.0
2813
+ optionalDependencies:
2814
+ '@types/react': 19.2.7
2815
+
2816
+ '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.2.7)(react@19.2.0)':
2817
+ dependencies:
2818
+ react: 19.2.0
2819
+ use-sync-external-store: 1.6.0(react@19.2.0)
2820
+ optionalDependencies:
2821
+ '@types/react': 19.2.7
2822
+
2823
+ '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.7)(react@19.2.0)':
2824
+ dependencies:
2825
+ react: 19.2.0
2826
+ optionalDependencies:
2827
+ '@types/react': 19.2.7
2828
+
2829
+ '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.7)(react@19.2.0)':
2830
+ dependencies:
2831
+ react: 19.2.0
2832
+ optionalDependencies:
2833
+ '@types/react': 19.2.7
2834
+
2835
+ '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.7)(react@19.2.0)':
2836
+ dependencies:
2837
+ '@radix-ui/rect': 1.1.1
2838
+ react: 19.2.0
2839
+ optionalDependencies:
2840
+ '@types/react': 19.2.7
2841
+
2842
+ '@radix-ui/react-use-size@1.1.1(@types/react@19.2.7)(react@19.2.0)':
2843
+ dependencies:
2844
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.0)
2845
+ react: 19.2.0
2846
+ optionalDependencies:
2847
+ '@types/react': 19.2.7
2848
+
2849
+ '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
2850
+ dependencies:
2851
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2852
+ react: 19.2.0
2853
+ react-dom: 19.2.0(react@19.2.0)
2854
+ optionalDependencies:
2855
+ '@types/react': 19.2.7
2856
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
2857
+
2858
+ '@radix-ui/rect@1.1.1': {}
2859
+
2860
+ '@remix-run/router@1.23.1': {}
2861
+
2862
+ '@rolldown/pluginutils@1.0.0-beta.27': {}
2863
+
2864
+ '@rollup/rollup-android-arm-eabi@4.53.3':
2865
+ optional: true
2866
+
2867
+ '@rollup/rollup-android-arm64@4.53.3':
2868
+ optional: true
2869
+
2870
+ '@rollup/rollup-darwin-arm64@4.53.3':
2871
+ optional: true
2872
+
2873
+ '@rollup/rollup-darwin-x64@4.53.3':
2874
+ optional: true
2875
+
2876
+ '@rollup/rollup-freebsd-arm64@4.53.3':
2877
+ optional: true
2878
+
2879
+ '@rollup/rollup-freebsd-x64@4.53.3':
2880
+ optional: true
2881
+
2882
+ '@rollup/rollup-linux-arm-gnueabihf@4.53.3':
2883
+ optional: true
2884
+
2885
+ '@rollup/rollup-linux-arm-musleabihf@4.53.3':
2886
+ optional: true
2887
+
2888
+ '@rollup/rollup-linux-arm64-gnu@4.53.3':
2889
+ optional: true
2890
+
2891
+ '@rollup/rollup-linux-arm64-musl@4.53.3':
2892
+ optional: true
2893
+
2894
+ '@rollup/rollup-linux-loong64-gnu@4.53.3':
2895
+ optional: true
2896
+
2897
+ '@rollup/rollup-linux-ppc64-gnu@4.53.3':
2898
+ optional: true
2899
+
2900
+ '@rollup/rollup-linux-riscv64-gnu@4.53.3':
2901
+ optional: true
2902
+
2903
+ '@rollup/rollup-linux-riscv64-musl@4.53.3':
2904
+ optional: true
2905
+
2906
+ '@rollup/rollup-linux-s390x-gnu@4.53.3':
2907
+ optional: true
2908
+
2909
+ '@rollup/rollup-linux-x64-gnu@4.53.3':
2910
+ optional: true
2911
+
2912
+ '@rollup/rollup-linux-x64-musl@4.53.3':
2913
+ optional: true
2914
+
2915
+ '@rollup/rollup-openharmony-arm64@4.53.3':
2916
+ optional: true
2917
+
2918
+ '@rollup/rollup-win32-arm64-msvc@4.53.3':
2919
+ optional: true
2920
+
2921
+ '@rollup/rollup-win32-ia32-msvc@4.53.3':
2922
+ optional: true
2923
+
2924
+ '@rollup/rollup-win32-x64-gnu@4.53.3':
2925
+ optional: true
2926
+
2927
+ '@rollup/rollup-win32-x64-msvc@4.53.3':
2928
+ optional: true
2929
+
2930
+ '@tanstack/query-core@5.90.11': {}
2931
+
2932
+ '@tanstack/react-query@5.90.11(react@19.2.0)':
2933
+ dependencies:
2934
+ '@tanstack/query-core': 5.90.11
2935
+ react: 19.2.0
2936
+
2937
+ '@tauri-apps/api@2.9.0': {}
2938
+
2939
+ '@tauri-apps/cli-darwin-arm64@2.9.4':
2940
+ optional: true
2941
+
2942
+ '@tauri-apps/cli-darwin-x64@2.9.4':
2943
+ optional: true
2944
+
2945
+ '@tauri-apps/cli-linux-arm-gnueabihf@2.9.4':
2946
+ optional: true
2947
+
2948
+ '@tauri-apps/cli-linux-arm64-gnu@2.9.4':
2949
+ optional: true
2950
+
2951
+ '@tauri-apps/cli-linux-arm64-musl@2.9.4':
2952
+ optional: true
2953
+
2954
+ '@tauri-apps/cli-linux-riscv64-gnu@2.9.4':
2955
+ optional: true
2956
+
2957
+ '@tauri-apps/cli-linux-x64-gnu@2.9.4':
2958
+ optional: true
2959
+
2960
+ '@tauri-apps/cli-linux-x64-musl@2.9.4':
2961
+ optional: true
2962
+
2963
+ '@tauri-apps/cli-win32-arm64-msvc@2.9.4':
2964
+ optional: true
2965
+
2966
+ '@tauri-apps/cli-win32-ia32-msvc@2.9.4':
2967
+ optional: true
2968
+
2969
+ '@tauri-apps/cli-win32-x64-msvc@2.9.4':
2970
+ optional: true
2971
+
2972
+ '@tauri-apps/cli@2.9.4':
2973
+ optionalDependencies:
2974
+ '@tauri-apps/cli-darwin-arm64': 2.9.4
2975
+ '@tauri-apps/cli-darwin-x64': 2.9.4
2976
+ '@tauri-apps/cli-linux-arm-gnueabihf': 2.9.4
2977
+ '@tauri-apps/cli-linux-arm64-gnu': 2.9.4
2978
+ '@tauri-apps/cli-linux-arm64-musl': 2.9.4
2979
+ '@tauri-apps/cli-linux-riscv64-gnu': 2.9.4
2980
+ '@tauri-apps/cli-linux-x64-gnu': 2.9.4
2981
+ '@tauri-apps/cli-linux-x64-musl': 2.9.4
2982
+ '@tauri-apps/cli-win32-arm64-msvc': 2.9.4
2983
+ '@tauri-apps/cli-win32-ia32-msvc': 2.9.4
2984
+ '@tauri-apps/cli-win32-x64-msvc': 2.9.4
2985
+
2986
+ '@tauri-apps/plugin-haptics@2.3.2':
2987
+ dependencies:
2988
+ '@tauri-apps/api': 2.9.0
2989
+
2990
+ '@tauri-apps/plugin-log@2.7.1':
2991
+ dependencies:
2992
+ '@tauri-apps/api': 2.9.0
2993
+
2994
+ '@tauri-apps/plugin-opener@2.5.2':
2995
+ dependencies:
2996
+ '@tauri-apps/api': 2.9.0
2997
+
2998
+ '@tauri-apps/plugin-os@2.3.2':
2999
+ dependencies:
3000
+ '@tauri-apps/api': 2.9.0
3001
+
3002
+ '@tauri-apps/plugin-store@2.4.1':
3003
+ dependencies:
3004
+ '@tauri-apps/api': 2.9.0
3005
+
3006
+ '@types/babel__core@7.20.5':
3007
+ dependencies:
3008
+ '@babel/parser': 7.28.5
3009
+ '@babel/types': 7.28.5
3010
+ '@types/babel__generator': 7.27.0
3011
+ '@types/babel__template': 7.4.4
3012
+ '@types/babel__traverse': 7.28.0
3013
+
3014
+ '@types/babel__generator@7.27.0':
3015
+ dependencies:
3016
+ '@babel/types': 7.28.5
3017
+
3018
+ '@types/babel__template@7.4.4':
3019
+ dependencies:
3020
+ '@babel/parser': 7.28.5
3021
+ '@babel/types': 7.28.5
3022
+
3023
+ '@types/babel__traverse@7.28.0':
3024
+ dependencies:
3025
+ '@babel/types': 7.28.5
3026
+
3027
+ '@types/estree@1.0.8': {}
3028
+
3029
+ '@types/react-dom@19.2.3(@types/react@19.2.7)':
3030
+ dependencies:
3031
+ '@types/react': 19.2.7
3032
+
3033
+ '@types/react@19.2.7':
3034
+ dependencies:
3035
+ csstype: 3.2.3
3036
+
3037
+ '@vitejs/plugin-react@4.7.0(vite@7.2.4(jiti@1.21.7))':
3038
+ dependencies:
3039
+ '@babel/core': 7.28.5
3040
+ '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5)
3041
+ '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5)
3042
+ '@rolldown/pluginutils': 1.0.0-beta.27
3043
+ '@types/babel__core': 7.20.5
3044
+ react-refresh: 0.17.0
3045
+ vite: 7.2.4(jiti@1.21.7)
3046
+ transitivePeerDependencies:
3047
+ - supports-color
3048
+
3049
+ any-promise@1.3.0: {}
3050
+
3051
+ anymatch@3.1.3:
3052
+ dependencies:
3053
+ normalize-path: 3.0.0
3054
+ picomatch: 2.3.1
3055
+
3056
+ arg@5.0.2: {}
3057
+
3058
+ aria-hidden@1.2.6:
3059
+ dependencies:
3060
+ tslib: 2.8.1
3061
+
3062
+ autoprefixer@10.4.22(postcss@8.5.6):
3063
+ dependencies:
3064
+ browserslist: 4.28.0
3065
+ caniuse-lite: 1.0.30001757
3066
+ fraction.js: 5.3.4
3067
+ normalize-range: 0.1.2
3068
+ picocolors: 1.1.1
3069
+ postcss: 8.5.6
3070
+ postcss-value-parser: 4.2.0
3071
+
3072
+ baseline-browser-mapping@2.8.31: {}
3073
+
3074
+ binary-extensions@2.3.0: {}
3075
+
3076
+ braces@3.0.3:
3077
+ dependencies:
3078
+ fill-range: 7.1.1
3079
+
3080
+ browserslist@4.28.0:
3081
+ dependencies:
3082
+ baseline-browser-mapping: 2.8.31
3083
+ caniuse-lite: 1.0.30001757
3084
+ electron-to-chromium: 1.5.259
3085
+ node-releases: 2.0.27
3086
+ update-browserslist-db: 1.1.4(browserslist@4.28.0)
3087
+
3088
+ camelcase-css@2.0.1: {}
3089
+
3090
+ caniuse-lite@1.0.30001757: {}
3091
+
3092
+ chokidar@3.6.0:
3093
+ dependencies:
3094
+ anymatch: 3.1.3
3095
+ braces: 3.0.3
3096
+ glob-parent: 5.1.2
3097
+ is-binary-path: 2.1.0
3098
+ is-glob: 4.0.3
3099
+ normalize-path: 3.0.0
3100
+ readdirp: 3.6.0
3101
+ optionalDependencies:
3102
+ fsevents: 2.3.3
3103
+
3104
+ class-variance-authority@0.7.1:
3105
+ dependencies:
3106
+ clsx: 2.1.1
3107
+
3108
+ clsx@2.1.1: {}
3109
+
3110
+ commander@4.1.1: {}
3111
+
3112
+ convert-source-map@2.0.0: {}
3113
+
3114
+ cssesc@3.0.0: {}
3115
+
3116
+ csstype@3.2.3: {}
3117
+
3118
+ date-fns@4.1.0: {}
3119
+
3120
+ debug@4.4.3:
3121
+ dependencies:
3122
+ ms: 2.1.3
3123
+
3124
+ detect-node-es@1.1.0: {}
3125
+
3126
+ didyoumean@1.2.2: {}
3127
+
3128
+ dlv@1.1.3: {}
3129
+
3130
+ electron-to-chromium@1.5.259: {}
3131
+
3132
+ esbuild@0.25.12:
3133
+ optionalDependencies:
3134
+ '@esbuild/aix-ppc64': 0.25.12
3135
+ '@esbuild/android-arm': 0.25.12
3136
+ '@esbuild/android-arm64': 0.25.12
3137
+ '@esbuild/android-x64': 0.25.12
3138
+ '@esbuild/darwin-arm64': 0.25.12
3139
+ '@esbuild/darwin-x64': 0.25.12
3140
+ '@esbuild/freebsd-arm64': 0.25.12
3141
+ '@esbuild/freebsd-x64': 0.25.12
3142
+ '@esbuild/linux-arm': 0.25.12
3143
+ '@esbuild/linux-arm64': 0.25.12
3144
+ '@esbuild/linux-ia32': 0.25.12
3145
+ '@esbuild/linux-loong64': 0.25.12
3146
+ '@esbuild/linux-mips64el': 0.25.12
3147
+ '@esbuild/linux-ppc64': 0.25.12
3148
+ '@esbuild/linux-riscv64': 0.25.12
3149
+ '@esbuild/linux-s390x': 0.25.12
3150
+ '@esbuild/linux-x64': 0.25.12
3151
+ '@esbuild/netbsd-arm64': 0.25.12
3152
+ '@esbuild/netbsd-x64': 0.25.12
3153
+ '@esbuild/openbsd-arm64': 0.25.12
3154
+ '@esbuild/openbsd-x64': 0.25.12
3155
+ '@esbuild/openharmony-arm64': 0.25.12
3156
+ '@esbuild/sunos-x64': 0.25.12
3157
+ '@esbuild/win32-arm64': 0.25.12
3158
+ '@esbuild/win32-ia32': 0.25.12
3159
+ '@esbuild/win32-x64': 0.25.12
3160
+
3161
+ escalade@3.2.0: {}
3162
+
3163
+ fast-glob@3.3.3:
3164
+ dependencies:
3165
+ '@nodelib/fs.stat': 2.0.5
3166
+ '@nodelib/fs.walk': 1.2.8
3167
+ glob-parent: 5.1.2
3168
+ merge2: 1.4.1
3169
+ micromatch: 4.0.8
3170
+
3171
+ fastq@1.19.1:
3172
+ dependencies:
3173
+ reusify: 1.1.0
3174
+
3175
+ fdir@6.5.0(picomatch@4.0.3):
3176
+ optionalDependencies:
3177
+ picomatch: 4.0.3
3178
+
3179
+ fill-range@7.1.1:
3180
+ dependencies:
3181
+ to-regex-range: 5.0.1
3182
+
3183
+ fraction.js@5.3.4: {}
3184
+
3185
+ fsevents@2.3.3:
3186
+ optional: true
3187
+
3188
+ function-bind@1.1.2: {}
3189
+
3190
+ gensync@1.0.0-beta.2: {}
3191
+
3192
+ get-nonce@1.0.1: {}
3193
+
3194
+ glob-parent@5.1.2:
3195
+ dependencies:
3196
+ is-glob: 4.0.3
3197
+
3198
+ glob-parent@6.0.2:
3199
+ dependencies:
3200
+ is-glob: 4.0.3
3201
+
3202
+ hasown@2.0.2:
3203
+ dependencies:
3204
+ function-bind: 1.1.2
3205
+
3206
+ is-binary-path@2.1.0:
3207
+ dependencies:
3208
+ binary-extensions: 2.3.0
3209
+
3210
+ is-core-module@2.16.1:
3211
+ dependencies:
3212
+ hasown: 2.0.2
3213
+
3214
+ is-extglob@2.1.1: {}
3215
+
3216
+ is-glob@4.0.3:
3217
+ dependencies:
3218
+ is-extglob: 2.1.1
3219
+
3220
+ is-number@7.0.0: {}
3221
+
3222
+ jiti@1.21.7: {}
3223
+
3224
+ js-tokens@4.0.0: {}
3225
+
3226
+ jsesc@3.1.0: {}
3227
+
3228
+ json5@2.2.3: {}
3229
+
3230
+ lilconfig@3.1.3: {}
3231
+
3232
+ lines-and-columns@1.2.4: {}
3233
+
3234
+ lru-cache@5.1.1:
3235
+ dependencies:
3236
+ yallist: 3.1.1
3237
+
3238
+ lucide-react@0.462.0(react@19.2.0):
3239
+ dependencies:
3240
+ react: 19.2.0
3241
+
3242
+ merge2@1.4.1: {}
3243
+
3244
+ micromatch@4.0.8:
3245
+ dependencies:
3246
+ braces: 3.0.3
3247
+ picomatch: 2.3.1
3248
+
3249
+ ms@2.1.3: {}
3250
+
3251
+ mz@2.7.0:
3252
+ dependencies:
3253
+ any-promise: 1.3.0
3254
+ object-assign: 4.1.1
3255
+ thenify-all: 1.6.0
3256
+
3257
+ nanoid@3.3.11: {}
3258
+
3259
+ node-releases@2.0.27: {}
3260
+
3261
+ normalize-path@3.0.0: {}
3262
+
3263
+ normalize-range@0.1.2: {}
3264
+
3265
+ object-assign@4.1.1: {}
3266
+
3267
+ object-hash@3.0.0: {}
3268
+
3269
+ path-parse@1.0.7: {}
3270
+
3271
+ picocolors@1.1.1: {}
3272
+
3273
+ picomatch@2.3.1: {}
3274
+
3275
+ picomatch@4.0.3: {}
3276
+
3277
+ pify@2.3.0: {}
3278
+
3279
+ pirates@4.0.7: {}
3280
+
3281
+ postcss-import@15.1.0(postcss@8.5.6):
3282
+ dependencies:
3283
+ postcss: 8.5.6
3284
+ postcss-value-parser: 4.2.0
3285
+ read-cache: 1.0.0
3286
+ resolve: 1.22.11
3287
+
3288
+ postcss-js@4.1.0(postcss@8.5.6):
3289
+ dependencies:
3290
+ camelcase-css: 2.0.1
3291
+ postcss: 8.5.6
3292
+
3293
+ postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6):
3294
+ dependencies:
3295
+ lilconfig: 3.1.3
3296
+ optionalDependencies:
3297
+ jiti: 1.21.7
3298
+ postcss: 8.5.6
3299
+
3300
+ postcss-nested@6.2.0(postcss@8.5.6):
3301
+ dependencies:
3302
+ postcss: 8.5.6
3303
+ postcss-selector-parser: 6.1.2
3304
+
3305
+ postcss-selector-parser@6.1.2:
3306
+ dependencies:
3307
+ cssesc: 3.0.0
3308
+ util-deprecate: 1.0.2
3309
+
3310
+ postcss-value-parser@4.2.0: {}
3311
+
3312
+ postcss@8.5.6:
3313
+ dependencies:
3314
+ nanoid: 3.3.11
3315
+ picocolors: 1.1.1
3316
+ source-map-js: 1.2.1
3317
+
3318
+ queue-microtask@1.2.3: {}
3319
+
3320
+ react-dom@19.2.0(react@19.2.0):
3321
+ dependencies:
3322
+ react: 19.2.0
3323
+ scheduler: 0.27.0
3324
+
3325
+ react-hook-form@7.66.1(react@19.2.0):
3326
+ dependencies:
3327
+ react: 19.2.0
3328
+
3329
+ react-refresh@0.17.0: {}
3330
+
3331
+ react-remove-scroll-bar@2.3.8(@types/react@19.2.7)(react@19.2.0):
3332
+ dependencies:
3333
+ react: 19.2.0
3334
+ react-style-singleton: 2.2.3(@types/react@19.2.7)(react@19.2.0)
3335
+ tslib: 2.8.1
3336
+ optionalDependencies:
3337
+ '@types/react': 19.2.7
3338
+
3339
+ react-remove-scroll@2.7.1(@types/react@19.2.7)(react@19.2.0):
3340
+ dependencies:
3341
+ react: 19.2.0
3342
+ react-remove-scroll-bar: 2.3.8(@types/react@19.2.7)(react@19.2.0)
3343
+ react-style-singleton: 2.2.3(@types/react@19.2.7)(react@19.2.0)
3344
+ tslib: 2.8.1
3345
+ use-callback-ref: 1.3.3(@types/react@19.2.7)(react@19.2.0)
3346
+ use-sidecar: 1.1.3(@types/react@19.2.7)(react@19.2.0)
3347
+ optionalDependencies:
3348
+ '@types/react': 19.2.7
3349
+
3350
+ react-router-dom@6.30.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0):
3351
+ dependencies:
3352
+ '@remix-run/router': 1.23.1
3353
+ react: 19.2.0
3354
+ react-dom: 19.2.0(react@19.2.0)
3355
+ react-router: 6.30.2(react@19.2.0)
3356
+
3357
+ react-router@6.30.2(react@19.2.0):
3358
+ dependencies:
3359
+ '@remix-run/router': 1.23.1
3360
+ react: 19.2.0
3361
+
3362
+ react-style-singleton@2.2.3(@types/react@19.2.7)(react@19.2.0):
3363
+ dependencies:
3364
+ get-nonce: 1.0.1
3365
+ react: 19.2.0
3366
+ tslib: 2.8.1
3367
+ optionalDependencies:
3368
+ '@types/react': 19.2.7
3369
+
3370
+ react@19.2.0: {}
3371
+
3372
+ read-cache@1.0.0:
3373
+ dependencies:
3374
+ pify: 2.3.0
3375
+
3376
+ readdirp@3.6.0:
3377
+ dependencies:
3378
+ picomatch: 2.3.1
3379
+
3380
+ resolve@1.22.11:
3381
+ dependencies:
3382
+ is-core-module: 2.16.1
3383
+ path-parse: 1.0.7
3384
+ supports-preserve-symlinks-flag: 1.0.0
3385
+
3386
+ reusify@1.1.0: {}
3387
+
3388
+ rollup@4.53.3:
3389
+ dependencies:
3390
+ '@types/estree': 1.0.8
3391
+ optionalDependencies:
3392
+ '@rollup/rollup-android-arm-eabi': 4.53.3
3393
+ '@rollup/rollup-android-arm64': 4.53.3
3394
+ '@rollup/rollup-darwin-arm64': 4.53.3
3395
+ '@rollup/rollup-darwin-x64': 4.53.3
3396
+ '@rollup/rollup-freebsd-arm64': 4.53.3
3397
+ '@rollup/rollup-freebsd-x64': 4.53.3
3398
+ '@rollup/rollup-linux-arm-gnueabihf': 4.53.3
3399
+ '@rollup/rollup-linux-arm-musleabihf': 4.53.3
3400
+ '@rollup/rollup-linux-arm64-gnu': 4.53.3
3401
+ '@rollup/rollup-linux-arm64-musl': 4.53.3
3402
+ '@rollup/rollup-linux-loong64-gnu': 4.53.3
3403
+ '@rollup/rollup-linux-ppc64-gnu': 4.53.3
3404
+ '@rollup/rollup-linux-riscv64-gnu': 4.53.3
3405
+ '@rollup/rollup-linux-riscv64-musl': 4.53.3
3406
+ '@rollup/rollup-linux-s390x-gnu': 4.53.3
3407
+ '@rollup/rollup-linux-x64-gnu': 4.53.3
3408
+ '@rollup/rollup-linux-x64-musl': 4.53.3
3409
+ '@rollup/rollup-openharmony-arm64': 4.53.3
3410
+ '@rollup/rollup-win32-arm64-msvc': 4.53.3
3411
+ '@rollup/rollup-win32-ia32-msvc': 4.53.3
3412
+ '@rollup/rollup-win32-x64-gnu': 4.53.3
3413
+ '@rollup/rollup-win32-x64-msvc': 4.53.3
3414
+ fsevents: 2.3.3
3415
+
3416
+ run-parallel@1.2.0:
3417
+ dependencies:
3418
+ queue-microtask: 1.2.3
3419
+
3420
+ scheduler@0.27.0: {}
3421
+
3422
+ semver@6.3.1: {}
3423
+
3424
+ source-map-js@1.2.1: {}
3425
+
3426
+ sucrase@3.35.1:
3427
+ dependencies:
3428
+ '@jridgewell/gen-mapping': 0.3.13
3429
+ commander: 4.1.1
3430
+ lines-and-columns: 1.2.4
3431
+ mz: 2.7.0
3432
+ pirates: 4.0.7
3433
+ tinyglobby: 0.2.15
3434
+ ts-interface-checker: 0.1.13
3435
+
3436
+ supports-preserve-symlinks-flag@1.0.0: {}
3437
+
3438
+ tailwind-merge@2.6.0: {}
3439
+
3440
+ tailwindcss-animate@1.0.7(tailwindcss@3.4.18):
3441
+ dependencies:
3442
+ tailwindcss: 3.4.18
3443
+
3444
+ tailwindcss@3.4.18:
3445
+ dependencies:
3446
+ '@alloc/quick-lru': 5.2.0
3447
+ arg: 5.0.2
3448
+ chokidar: 3.6.0
3449
+ didyoumean: 1.2.2
3450
+ dlv: 1.1.3
3451
+ fast-glob: 3.3.3
3452
+ glob-parent: 6.0.2
3453
+ is-glob: 4.0.3
3454
+ jiti: 1.21.7
3455
+ lilconfig: 3.1.3
3456
+ micromatch: 4.0.8
3457
+ normalize-path: 3.0.0
3458
+ object-hash: 3.0.0
3459
+ picocolors: 1.1.1
3460
+ postcss: 8.5.6
3461
+ postcss-import: 15.1.0(postcss@8.5.6)
3462
+ postcss-js: 4.1.0(postcss@8.5.6)
3463
+ postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)
3464
+ postcss-nested: 6.2.0(postcss@8.5.6)
3465
+ postcss-selector-parser: 6.1.2
3466
+ resolve: 1.22.11
3467
+ sucrase: 3.35.1
3468
+ transitivePeerDependencies:
3469
+ - tsx
3470
+ - yaml
3471
+
3472
+ tauri-plugin-admob-api@0.0.4:
3473
+ dependencies:
3474
+ '@tauri-apps/api': 2.9.0
3475
+
3476
+ thenify-all@1.6.0:
3477
+ dependencies:
3478
+ thenify: 3.3.1
3479
+
3480
+ thenify@3.3.1:
3481
+ dependencies:
3482
+ any-promise: 1.3.0
3483
+
3484
+ tinyglobby@0.2.15:
3485
+ dependencies:
3486
+ fdir: 6.5.0(picomatch@4.0.3)
3487
+ picomatch: 4.0.3
3488
+
3489
+ to-regex-range@5.0.1:
3490
+ dependencies:
3491
+ is-number: 7.0.0
3492
+
3493
+ ts-interface-checker@0.1.13: {}
3494
+
3495
+ tslib@2.8.1: {}
3496
+
3497
+ typescript@5.8.3: {}
3498
+
3499
+ update-browserslist-db@1.1.4(browserslist@4.28.0):
3500
+ dependencies:
3501
+ browserslist: 4.28.0
3502
+ escalade: 3.2.0
3503
+ picocolors: 1.1.1
3504
+
3505
+ use-callback-ref@1.3.3(@types/react@19.2.7)(react@19.2.0):
3506
+ dependencies:
3507
+ react: 19.2.0
3508
+ tslib: 2.8.1
3509
+ optionalDependencies:
3510
+ '@types/react': 19.2.7
3511
+
3512
+ use-sidecar@1.1.3(@types/react@19.2.7)(react@19.2.0):
3513
+ dependencies:
3514
+ detect-node-es: 1.1.0
3515
+ react: 19.2.0
3516
+ tslib: 2.8.1
3517
+ optionalDependencies:
3518
+ '@types/react': 19.2.7
3519
+
3520
+ use-sync-external-store@1.6.0(react@19.2.0):
3521
+ dependencies:
3522
+ react: 19.2.0
3523
+
3524
+ util-deprecate@1.0.2: {}
3525
+
3526
+ vite@7.2.4(jiti@1.21.7):
3527
+ dependencies:
3528
+ esbuild: 0.25.12
3529
+ fdir: 6.5.0(picomatch@4.0.3)
3530
+ picomatch: 4.0.3
3531
+ postcss: 8.5.6
3532
+ rollup: 4.53.3
3533
+ tinyglobby: 0.2.15
3534
+ optionalDependencies:
3535
+ fsevents: 2.3.3
3536
+ jiti: 1.21.7
3537
+
3538
+ yallist@3.1.1: {}
pnpm-workspace.yaml
new
+2
@@ -0,0 +1,2 @@
1
+onlyBuiltDependencies:
2
+ - esbuild
postcss.config.cjs
new
+6
@@ -0,0 +1,6 @@
1
+module.exports = {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+}
scripts/generate-icon-mobile.sh
new
+10
@@ -0,0 +1,10 @@
1
+#!/usr/bin/env bash
2
+
3
+# This command should be run after the cargo tauri android|ios init.
4
+#
5
+# Generate icon for mobile platforms. The no-alpha version is used for iOS. Should update the script
6
+# if Android icon is broken.
7
+cargo tauri icon assets/app-icon.png
8
+
9
+# Restore the icons directory to its original state.
10
+git restore src-tauri/icons
src-tauri/.gitignore
new
+7
@@ -0,0 +1,7 @@
1
+# Generated by Cargo
2
+# will have compiled files and executables
3
+/target/
4
+
5
+# Generated by Tauri
6
+# will have schema files for capabilities auto-completion
7
+/gen/
src-tauri/Cargo.lock
new
+6764
@@ -0,0 +1,6764 @@
1
+# This file is automatically @generated by Cargo.
2
+# It is not intended for manual editing.
3
+version = 4
4
+
5
+[[package]]
6
+name = "adler2"
7
+version = "2.0.1"
8
+source = "registry+https://github.com/rust-lang/crates.io-index"
9
+checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
10
+
11
+[[package]]
12
+name = "ahash"
13
+version = "0.7.8"
14
+source = "registry+https://github.com/rust-lang/crates.io-index"
15
+checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9"
16
+dependencies = [
17
+ "getrandom 0.2.16",
18
+ "once_cell",
19
+ "version_check",
20
+]
21
+
22
+[[package]]
23
+name = "aho-corasick"
24
+version = "1.1.4"
25
+source = "registry+https://github.com/rust-lang/crates.io-index"
26
+checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
27
+dependencies = [
28
+ "memchr",
29
+]
30
+
31
+[[package]]
32
+name = "alloc-no-stdlib"
33
+version = "2.0.4"
34
+source = "registry+https://github.com/rust-lang/crates.io-index"
35
+checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3"
36
+
37
+[[package]]
38
+name = "alloc-stdlib"
39
+version = "0.2.2"
40
+source = "registry+https://github.com/rust-lang/crates.io-index"
41
+checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece"
42
+dependencies = [
43
+ "alloc-no-stdlib",
44
+]
45
+
46
+[[package]]
47
+name = "android_log-sys"
48
+version = "0.3.2"
49
+source = "registry+https://github.com/rust-lang/crates.io-index"
50
+checksum = "84521a3cf562bc62942e294181d9eef17eb38ceb8c68677bc49f144e4c3d4f8d"
51
+
52
+[[package]]
53
+name = "android_logger"
54
+version = "0.15.1"
55
+source = "registry+https://github.com/rust-lang/crates.io-index"
56
+checksum = "dbb4e440d04be07da1f1bf44fb4495ebd58669372fe0cffa6e48595ac5bd88a3"
57
+dependencies = [
58
+ "android_log-sys",
59
+ "env_filter",
60
+ "log",
61
+]
62
+
63
+[[package]]
64
+name = "android_system_properties"
65
+version = "0.1.5"
66
+source = "registry+https://github.com/rust-lang/crates.io-index"
67
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
68
+dependencies = [
69
+ "libc",
70
+]
71
+
72
+[[package]]
73
+name = "ansi_term"
74
+version = "0.12.1"
75
+source = "registry+https://github.com/rust-lang/crates.io-index"
76
+checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
77
+dependencies = [
78
+ "winapi",
79
+]
80
+
81
+[[package]]
82
+name = "anstream"
83
+version = "0.6.21"
84
+source = "registry+https://github.com/rust-lang/crates.io-index"
85
+checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a"
86
+dependencies = [
87
+ "anstyle",
88
+ "anstyle-parse",
89
+ "anstyle-query",
90
+ "anstyle-wincon",
91
+ "colorchoice",
92
+ "is_terminal_polyfill",
93
+ "utf8parse",
94
+]
95
+
96
+[[package]]
97
+name = "anstyle"
98
+version = "1.0.13"
99
+source = "registry+https://github.com/rust-lang/crates.io-index"
100
+checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78"
101
+
102
+[[package]]
103
+name = "anstyle-parse"
104
+version = "0.2.7"
105
+source = "registry+https://github.com/rust-lang/crates.io-index"
106
+checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
107
+dependencies = [
108
+ "utf8parse",
109
+]
110
+
111
+[[package]]
112
+name = "anstyle-query"
113
+version = "1.1.5"
114
+source = "registry+https://github.com/rust-lang/crates.io-index"
115
+checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
116
+dependencies = [
117
+ "windows-sys 0.61.2",
118
+]
119
+
120
+[[package]]
121
+name = "anstyle-wincon"
122
+version = "3.0.11"
123
+source = "registry+https://github.com/rust-lang/crates.io-index"
124
+checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
125
+dependencies = [
126
+ "anstyle",
127
+ "once_cell_polyfill",
128
+ "windows-sys 0.61.2",
129
+]
130
+
131
+[[package]]
132
+name = "anyhow"
133
+version = "1.0.100"
134
+source = "registry+https://github.com/rust-lang/crates.io-index"
135
+checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
136
+
137
+[[package]]
138
+name = "arrayvec"
139
+version = "0.7.6"
140
+source = "registry+https://github.com/rust-lang/crates.io-index"
141
+checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
142
+
143
+[[package]]
144
+name = "async-broadcast"
145
+version = "0.7.2"
146
+source = "registry+https://github.com/rust-lang/crates.io-index"
147
+checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532"
148
+dependencies = [
149
+ "event-listener",
150
+ "event-listener-strategy",
151
+ "futures-core",
152
+ "pin-project-lite",
153
+]
154
+
155
+[[package]]
156
+name = "async-channel"
157
+version = "2.5.0"
158
+source = "registry+https://github.com/rust-lang/crates.io-index"
159
+checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2"
160
+dependencies = [
161
+ "concurrent-queue",
162
+ "event-listener-strategy",
163
+ "futures-core",
164
+ "pin-project-lite",
165
+]
166
+
167
+[[package]]
168
+name = "async-executor"
169
+version = "1.13.3"
170
+source = "registry+https://github.com/rust-lang/crates.io-index"
171
+checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8"
172
+dependencies = [
173
+ "async-task",
174
+ "concurrent-queue",
175
+ "fastrand",
176
+ "futures-lite",
177
+ "pin-project-lite",
178
+ "slab",
179
+]
180
+
181
+[[package]]
182
+name = "async-io"
183
+version = "2.6.0"
184
+source = "registry+https://github.com/rust-lang/crates.io-index"
185
+checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc"
186
+dependencies = [
187
+ "autocfg",
188
+ "cfg-if",
189
+ "concurrent-queue",
190
+ "futures-io",
191
+ "futures-lite",
192
+ "parking",
193
+ "polling",
194
+ "rustix",
195
+ "slab",
196
+ "windows-sys 0.61.2",
197
+]
198
+
199
+[[package]]
200
+name = "async-lock"
201
+version = "3.4.1"
202
+source = "registry+https://github.com/rust-lang/crates.io-index"
203
+checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc"
204
+dependencies = [
205
+ "event-listener",
206
+ "event-listener-strategy",
207
+ "pin-project-lite",
208
+]
209
+
210
+[[package]]
211
+name = "async-process"
212
+version = "2.5.0"
213
+source = "registry+https://github.com/rust-lang/crates.io-index"
214
+checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75"
215
+dependencies = [
216
+ "async-channel",
217
+ "async-io",
218
+ "async-lock",
219
+ "async-signal",
220
+ "async-task",
221
+ "blocking",
222
+ "cfg-if",
223
+ "event-listener",
224
+ "futures-lite",
225
+ "rustix",
226
+]
227
+
228
+[[package]]
229
+name = "async-recursion"
230
+version = "1.1.1"
231
+source = "registry+https://github.com/rust-lang/crates.io-index"
232
+checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11"
233
+dependencies = [
234
+ "proc-macro2",
235
+ "quote",
236
+ "syn 2.0.111",
237
+]
238
+
239
+[[package]]
240
+name = "async-signal"
241
+version = "0.2.13"
242
+source = "registry+https://github.com/rust-lang/crates.io-index"
243
+checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c"
244
+dependencies = [
245
+ "async-io",
246
+ "async-lock",
247
+ "atomic-waker",
248
+ "cfg-if",
249
+ "futures-core",
250
+ "futures-io",
251
+ "rustix",
252
+ "signal-hook-registry",
253
+ "slab",
254
+ "windows-sys 0.61.2",
255
+]
256
+
257
+[[package]]
258
+name = "async-task"
259
+version = "4.7.1"
260
+source = "registry+https://github.com/rust-lang/crates.io-index"
261
+checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de"
262
+
263
+[[package]]
264
+name = "async-trait"
265
+version = "0.1.89"
266
+source = "registry+https://github.com/rust-lang/crates.io-index"
267
+checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
268
+dependencies = [
269
+ "proc-macro2",
270
+ "quote",
271
+ "syn 2.0.111",
272
+]
273
+
274
+[[package]]
275
+name = "atk"
276
+version = "0.18.2"
277
+source = "registry+https://github.com/rust-lang/crates.io-index"
278
+checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b"
279
+dependencies = [
280
+ "atk-sys",
281
+ "glib",
282
+ "libc",
283
+]
284
+
285
+[[package]]
286
+name = "atk-sys"
287
+version = "0.18.2"
288
+source = "registry+https://github.com/rust-lang/crates.io-index"
289
+checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086"
290
+dependencies = [
291
+ "glib-sys",
292
+ "gobject-sys",
293
+ "libc",
294
+ "system-deps",
295
+]
296
+
297
+[[package]]
298
+name = "atomic-waker"
299
+version = "1.1.2"
300
+source = "registry+https://github.com/rust-lang/crates.io-index"
301
+checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
302
+
303
+[[package]]
304
+name = "atty"
305
+version = "0.2.14"
306
+source = "registry+https://github.com/rust-lang/crates.io-index"
307
+checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
308
+dependencies = [
309
+ "hermit-abi 0.1.19",
310
+ "libc",
311
+ "winapi",
312
+]
313
+
314
+[[package]]
315
+name = "autocfg"
316
+version = "1.5.0"
317
+source = "registry+https://github.com/rust-lang/crates.io-index"
318
+checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
319
+
320
+[[package]]
321
+name = "base64"
322
+version = "0.21.7"
323
+source = "registry+https://github.com/rust-lang/crates.io-index"
324
+checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
325
+
326
+[[package]]
327
+name = "base64"
328
+version = "0.22.1"
329
+source = "registry+https://github.com/rust-lang/crates.io-index"
330
+checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
331
+
332
+[[package]]
333
+name = "bitflags"
334
+version = "1.3.2"
335
+source = "registry+https://github.com/rust-lang/crates.io-index"
336
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
337
+
338
+[[package]]
339
+name = "bitflags"
340
+version = "2.10.0"
341
+source = "registry+https://github.com/rust-lang/crates.io-index"
342
+checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3"
343
+dependencies = [
344
+ "serde_core",
345
+]
346
+
347
+[[package]]
348
+name = "bitvec"
349
+version = "1.0.1"
350
+source = "registry+https://github.com/rust-lang/crates.io-index"
351
+checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c"
352
+dependencies = [
353
+ "funty",
354
+ "radium",
355
+ "tap",
356
+ "wyz",
357
+]
358
+
359
+[[package]]
360
+name = "block-buffer"
361
+version = "0.10.4"
362
+source = "registry+https://github.com/rust-lang/crates.io-index"
363
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
364
+dependencies = [
365
+ "generic-array",
366
+]
367
+
368
+[[package]]
369
+name = "block2"
370
+version = "0.5.1"
371
+source = "registry+https://github.com/rust-lang/crates.io-index"
372
+checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f"
373
+dependencies = [
374
+ "objc2 0.5.2",
375
+]
376
+
377
+[[package]]
378
+name = "block2"
379
+version = "0.6.2"
380
+source = "registry+https://github.com/rust-lang/crates.io-index"
381
+checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5"
382
+dependencies = [
383
+ "objc2 0.6.3",
384
+]
385
+
386
+[[package]]
387
+name = "blocking"
388
+version = "1.6.2"
389
+source = "registry+https://github.com/rust-lang/crates.io-index"
390
+checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21"
391
+dependencies = [
392
+ "async-channel",
393
+ "async-task",
394
+ "futures-io",
395
+ "futures-lite",
396
+ "piper",
397
+]
398
+
399
+[[package]]
400
+name = "borsh"
401
+version = "1.5.7"
402
+source = "registry+https://github.com/rust-lang/crates.io-index"
403
+checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce"
404
+dependencies = [
405
+ "borsh-derive",
406
+ "cfg_aliases",
407
+]
408
+
409
+[[package]]
410
+name = "borsh-derive"
411
+version = "1.5.7"
412
+source = "registry+https://github.com/rust-lang/crates.io-index"
413
+checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3"
414
+dependencies = [
415
+ "once_cell",
416
+ "proc-macro-crate 3.4.0",
417
+ "proc-macro2",
418
+ "quote",
419
+ "syn 2.0.111",
420
+]
421
+
422
+[[package]]
423
+name = "brotli"
424
+version = "8.0.2"
425
+source = "registry+https://github.com/rust-lang/crates.io-index"
426
+checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560"
427
+dependencies = [
428
+ "alloc-no-stdlib",
429
+ "alloc-stdlib",
430
+ "brotli-decompressor",
431
+]
432
+
433
+[[package]]
434
+name = "brotli-decompressor"
435
+version = "5.0.0"
436
+source = "registry+https://github.com/rust-lang/crates.io-index"
437
+checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03"
438
+dependencies = [
439
+ "alloc-no-stdlib",
440
+ "alloc-stdlib",
441
+]
442
+
443
+[[package]]
444
+name = "bumpalo"
445
+version = "3.19.0"
446
+source = "registry+https://github.com/rust-lang/crates.io-index"
447
+checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
448
+
449
+[[package]]
450
+name = "byte-unit"
451
+version = "5.2.0"
452
+source = "registry+https://github.com/rust-lang/crates.io-index"
453
+checksum = "8c6d47a4e2961fb8721bcfc54feae6455f2f64e7054f9bc67e875f0e77f4c58d"
454
+dependencies = [
455
+ "rust_decimal",
456
+ "schemars 1.1.0",
457
+ "serde",
458
+ "utf8-width",
459
+]
460
+
461
+[[package]]
462
+name = "bytecheck"
463
+version = "0.6.12"
464
+source = "registry+https://github.com/rust-lang/crates.io-index"
465
+checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2"
466
+dependencies = [
467
+ "bytecheck_derive",
468
+ "ptr_meta",
469
+ "simdutf8",
470
+]
471
+
472
+[[package]]
473
+name = "bytecheck_derive"
474
+version = "0.6.12"
475
+source = "registry+https://github.com/rust-lang/crates.io-index"
476
+checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659"
477
+dependencies = [
478
+ "proc-macro2",
479
+ "quote",
480
+ "syn 1.0.109",
481
+]
482
+
483
+[[package]]
484
+name = "bytemuck"
485
+version = "1.24.0"
486
+source = "registry+https://github.com/rust-lang/crates.io-index"
487
+checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4"
488
+
489
+[[package]]
490
+name = "byteorder"
491
+version = "1.5.0"
492
+source = "registry+https://github.com/rust-lang/crates.io-index"
493
+checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
494
+
495
+[[package]]
496
+name = "bytes"
497
+version = "1.11.0"
498
+source = "registry+https://github.com/rust-lang/crates.io-index"
499
+checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3"
500
+dependencies = [
501
+ "serde",
502
+]
503
+
504
+[[package]]
505
+name = "cairo-rs"
506
+version = "0.18.5"
507
+source = "registry+https://github.com/rust-lang/crates.io-index"
508
+checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2"
509
+dependencies = [
510
+ "bitflags 2.10.0",
511
+ "cairo-sys-rs",
512
+ "glib",
513
+ "libc",
514
+ "once_cell",
515
+ "thiserror 1.0.69",
516
+]
517
+
518
+[[package]]
519
+name = "cairo-sys-rs"
520
+version = "0.18.2"
521
+source = "registry+https://github.com/rust-lang/crates.io-index"
522
+checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51"
523
+dependencies = [
524
+ "glib-sys",
525
+ "libc",
526
+ "system-deps",
527
+]
528
+
529
+[[package]]
530
+name = "camino"
531
+version = "1.2.1"
532
+source = "registry+https://github.com/rust-lang/crates.io-index"
533
+checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609"
534
+dependencies = [
535
+ "serde_core",
536
+]
537
+
538
+[[package]]
539
+name = "cargo-platform"
540
+version = "0.1.9"
541
+source = "registry+https://github.com/rust-lang/crates.io-index"
542
+checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea"
543
+dependencies = [
544
+ "serde",
545
+]
546
+
547
+[[package]]
548
+name = "cargo_metadata"
549
+version = "0.19.2"
550
+source = "registry+https://github.com/rust-lang/crates.io-index"
551
+checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba"
552
+dependencies = [
553
+ "camino",
554
+ "cargo-platform",
555
+ "semver",
556
+ "serde",
557
+ "serde_json",
558
+ "thiserror 2.0.17",
559
+]
560
+
561
+[[package]]
562
+name = "cargo_toml"
563
+version = "0.22.3"
564
+source = "registry+https://github.com/rust-lang/crates.io-index"
565
+checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77"
566
+dependencies = [
567
+ "serde",
568
+ "toml 0.9.8",
569
+]
570
+
571
+[[package]]
572
+name = "cc"
573
+version = "1.2.47"
574
+source = "registry+https://github.com/rust-lang/crates.io-index"
575
+checksum = "cd405d82c84ff7f35739f175f67d8b9fb7687a0e84ccdc78bd3568839827cf07"
576
+dependencies = [
577
+ "find-msvc-tools",
578
+ "shlex",
579
+]
580
+
581
+[[package]]
582
+name = "cesu8"
583
+version = "1.1.0"
584
+source = "registry+https://github.com/rust-lang/crates.io-index"
585
+checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
586
+
587
+[[package]]
588
+name = "cfb"
589
+version = "0.7.3"
590
+source = "registry+https://github.com/rust-lang/crates.io-index"
591
+checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f"
592
+dependencies = [
593
+ "byteorder",
594
+ "fnv",
595
+ "uuid",
596
+]
597
+
598
+[[package]]
599
+name = "cfg-expr"
600
+version = "0.15.8"
601
+source = "registry+https://github.com/rust-lang/crates.io-index"
602
+checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02"
603
+dependencies = [
604
+ "smallvec",
605
+ "target-lexicon",
606
+]
607
+
608
+[[package]]
609
+name = "cfg-if"
610
+version = "1.0.4"
611
+source = "registry+https://github.com/rust-lang/crates.io-index"
612
+checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
613
+
614
+[[package]]
615
+name = "cfg_aliases"
616
+version = "0.2.1"
617
+source = "registry+https://github.com/rust-lang/crates.io-index"
618
+checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
619
+
620
+[[package]]
621
+name = "chrono"
622
+version = "0.4.42"
623
+source = "registry+https://github.com/rust-lang/crates.io-index"
624
+checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2"
625
+dependencies = [
626
+ "iana-time-zone",
627
+ "js-sys",
628
+ "num-traits",
629
+ "serde",
630
+ "wasm-bindgen",
631
+ "windows-link 0.2.1",
632
+]
633
+
634
+[[package]]
635
+name = "clap"
636
+version = "2.34.0"
637
+source = "registry+https://github.com/rust-lang/crates.io-index"
638
+checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
639
+dependencies = [
640
+ "ansi_term",
641
+ "atty",
642
+ "bitflags 1.3.2",
643
+ "strsim 0.8.0",
644
+ "textwrap",
645
+ "unicode-width",
646
+ "vec_map",
647
+]
648
+
649
+[[package]]
650
+name = "clap"
651
+version = "4.5.53"
652
+source = "registry+https://github.com/rust-lang/crates.io-index"
653
+checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8"
654
+dependencies = [
655
+ "clap_builder",
656
+ "clap_derive",
657
+]
658
+
659
+[[package]]
660
+name = "clap_builder"
661
+version = "4.5.53"
662
+source = "registry+https://github.com/rust-lang/crates.io-index"
663
+checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00"
664
+dependencies = [
665
+ "anstream",
666
+ "anstyle",
667
+ "clap_lex",
668
+ "strsim 0.11.1",
669
+]
670
+
671
+[[package]]
672
+name = "clap_derive"
673
+version = "4.5.49"
674
+source = "registry+https://github.com/rust-lang/crates.io-index"
675
+checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671"
676
+dependencies = [
677
+ "heck 0.5.0",
678
+ "proc-macro2",
679
+ "quote",
680
+ "syn 2.0.111",
681
+]
682
+
683
+[[package]]
684
+name = "clap_lex"
685
+version = "0.7.6"
686
+source = "registry+https://github.com/rust-lang/crates.io-index"
687
+checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d"
688
+
689
+[[package]]
690
+name = "colorchoice"
691
+version = "1.0.4"
692
+source = "registry+https://github.com/rust-lang/crates.io-index"
693
+checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
694
+
695
+[[package]]
696
+name = "colored"
697
+version = "2.2.0"
698
+source = "registry+https://github.com/rust-lang/crates.io-index"
699
+checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c"
700
+dependencies = [
701
+ "lazy_static",
702
+ "windows-sys 0.59.0",
703
+]
704
+
705
+[[package]]
706
+name = "combine"
707
+version = "4.6.7"
708
+source = "registry+https://github.com/rust-lang/crates.io-index"
709
+checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd"
710
+dependencies = [
711
+ "bytes",
712
+ "memchr",
713
+]
714
+
715
+[[package]]
716
+name = "concurrent-queue"
717
+version = "2.5.0"
718
+source = "registry+https://github.com/rust-lang/crates.io-index"
719
+checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"
720
+dependencies = [
721
+ "crossbeam-utils",
722
+]
723
+
724
+[[package]]
725
+name = "convert_case"
726
+version = "0.4.0"
727
+source = "registry+https://github.com/rust-lang/crates.io-index"
728
+checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
729
+
730
+[[package]]
731
+name = "convert_case"
732
+version = "0.6.0"
733
+source = "registry+https://github.com/rust-lang/crates.io-index"
734
+checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca"
735
+dependencies = [
736
+ "unicode-segmentation",
737
+]
738
+
739
+[[package]]
740
+name = "cookie"
741
+version = "0.18.1"
742
+source = "registry+https://github.com/rust-lang/crates.io-index"
743
+checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747"
744
+dependencies = [
745
+ "time",
746
+ "version_check",
747
+]
748
+
749
+[[package]]
750
+name = "core-foundation"
751
+version = "0.9.4"
752
+source = "registry+https://github.com/rust-lang/crates.io-index"
753
+checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
754
+dependencies = [
755
+ "core-foundation-sys",
756
+ "libc",
757
+]
758
+
759
+[[package]]
760
+name = "core-foundation"
761
+version = "0.10.1"
762
+source = "registry+https://github.com/rust-lang/crates.io-index"
763
+checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6"
764
+dependencies = [
765
+ "core-foundation-sys",
766
+ "libc",
767
+]
768
+
769
+[[package]]
770
+name = "core-foundation-sys"
771
+version = "0.8.7"
772
+source = "registry+https://github.com/rust-lang/crates.io-index"
773
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
774
+
775
+[[package]]
776
+name = "core-graphics"
777
+version = "0.24.0"
778
+source = "registry+https://github.com/rust-lang/crates.io-index"
779
+checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1"
780
+dependencies = [
781
+ "bitflags 2.10.0",
782
+ "core-foundation 0.10.1",
783
+ "core-graphics-types",
784
+ "foreign-types 0.5.0",
785
+ "libc",
786
+]
787
+
788
+[[package]]
789
+name = "core-graphics-types"
790
+version = "0.2.0"
791
+source = "registry+https://github.com/rust-lang/crates.io-index"
792
+checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb"
793
+dependencies = [
794
+ "bitflags 2.10.0",
795
+ "core-foundation 0.10.1",
796
+ "libc",
797
+]
798
+
799
+[[package]]
800
+name = "cpufeatures"
801
+version = "0.2.17"
802
+source = "registry+https://github.com/rust-lang/crates.io-index"
803
+checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
804
+dependencies = [
805
+ "libc",
806
+]
807
+
808
+[[package]]
809
+name = "crc32fast"
810
+version = "1.5.0"
811
+source = "registry+https://github.com/rust-lang/crates.io-index"
812
+checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
813
+dependencies = [
814
+ "cfg-if",
815
+]
816
+
817
+[[package]]
818
+name = "crossbeam-channel"
819
+version = "0.5.15"
820
+source = "registry+https://github.com/rust-lang/crates.io-index"
821
+checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"
822
+dependencies = [
823
+ "crossbeam-utils",
824
+]
825
+
826
+[[package]]
827
+name = "crossbeam-utils"
828
+version = "0.8.21"
829
+source = "registry+https://github.com/rust-lang/crates.io-index"
830
+checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
831
+
832
+[[package]]
833
+name = "crypto-common"
834
+version = "0.1.7"
835
+source = "registry+https://github.com/rust-lang/crates.io-index"
836
+checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
837
+dependencies = [
838
+ "generic-array",
839
+ "typenum",
840
+]
841
+
842
+[[package]]
843
+name = "cssparser"
844
+version = "0.29.6"
845
+source = "registry+https://github.com/rust-lang/crates.io-index"
846
+checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa"
847
+dependencies = [
848
+ "cssparser-macros",
849
+ "dtoa-short",
850
+ "itoa",
851
+ "matches",
852
+ "phf 0.10.1",
853
+ "proc-macro2",
854
+ "quote",
855
+ "smallvec",
856
+ "syn 1.0.109",
857
+]
858
+
859
+[[package]]
860
+name = "cssparser-macros"
861
+version = "0.6.1"
862
+source = "registry+https://github.com/rust-lang/crates.io-index"
863
+checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
864
+dependencies = [
865
+ "quote",
866
+ "syn 2.0.111",
867
+]
868
+
869
+[[package]]
870
+name = "ctor"
871
+version = "0.2.9"
872
+source = "registry+https://github.com/rust-lang/crates.io-index"
873
+checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501"
874
+dependencies = [
875
+ "quote",
876
+ "syn 2.0.111",
877
+]
878
+
879
+[[package]]
880
+name = "darling"
881
+version = "0.21.3"
882
+source = "registry+https://github.com/rust-lang/crates.io-index"
883
+checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0"
884
+dependencies = [
885
+ "darling_core",
886
+ "darling_macro",
887
+]
888
+
889
+[[package]]
890
+name = "darling_core"
891
+version = "0.21.3"
892
+source = "registry+https://github.com/rust-lang/crates.io-index"
893
+checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4"
894
+dependencies = [
895
+ "fnv",
896
+ "ident_case",
897
+ "proc-macro2",
898
+ "quote",
899
+ "strsim 0.11.1",
900
+ "syn 2.0.111",
901
+]
902
+
903
+[[package]]
904
+name = "darling_macro"
905
+version = "0.21.3"
906
+source = "registry+https://github.com/rust-lang/crates.io-index"
907
+checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81"
908
+dependencies = [
909
+ "darling_core",
910
+ "quote",
911
+ "syn 2.0.111",
912
+]
913
+
914
+[[package]]
915
+name = "deranged"
916
+version = "0.5.5"
917
+source = "registry+https://github.com/rust-lang/crates.io-index"
918
+checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587"
919
+dependencies = [
920
+ "powerfmt",
921
+ "serde_core",
922
+]
923
+
924
+[[package]]
925
+name = "derive_more"
926
+version = "0.99.20"
927
+source = "registry+https://github.com/rust-lang/crates.io-index"
928
+checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f"
929
+dependencies = [
930
+ "convert_case 0.4.0",
931
+ "proc-macro2",
932
+ "quote",
933
+ "rustc_version",
934
+ "syn 2.0.111",
935
+]
936
+
937
+[[package]]
938
+name = "digest"
939
+version = "0.10.7"
940
+source = "registry+https://github.com/rust-lang/crates.io-index"
941
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
942
+dependencies = [
943
+ "block-buffer",
944
+ "crypto-common",
945
+]
946
+
947
+[[package]]
948
+name = "dirs"
949
+version = "6.0.0"
950
+source = "registry+https://github.com/rust-lang/crates.io-index"
951
+checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e"
952
+dependencies = [
953
+ "dirs-sys",
954
+]
955
+
956
+[[package]]
957
+name = "dirs-sys"
958
+version = "0.5.0"
959
+source = "registry+https://github.com/rust-lang/crates.io-index"
960
+checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab"
961
+dependencies = [
962
+ "libc",
963
+ "option-ext",
964
+ "redox_users",
965
+ "windows-sys 0.61.2",
966
+]
967
+
968
+[[package]]
969
+name = "dispatch"
970
+version = "0.2.0"
971
+source = "registry+https://github.com/rust-lang/crates.io-index"
972
+checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b"
973
+
974
+[[package]]
975
+name = "dispatch2"
976
+version = "0.3.0"
977
+source = "registry+https://github.com/rust-lang/crates.io-index"
978
+checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec"
979
+dependencies = [
980
+ "bitflags 2.10.0",
981
+ "objc2 0.6.3",
982
+]
983
+
984
+[[package]]
985
+name = "displaydoc"
986
+version = "0.2.5"
987
+source = "registry+https://github.com/rust-lang/crates.io-index"
988
+checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
989
+dependencies = [
990
+ "proc-macro2",
991
+ "quote",
992
+ "syn 2.0.111",
993
+]
994
+
995
+[[package]]
996
+name = "dlopen2"
997
+version = "0.8.0"
998
+source = "registry+https://github.com/rust-lang/crates.io-index"
999
+checksum = "b54f373ccf864bf587a89e880fb7610f8d73f3045f13580948ccbcaff26febff"
1000
+dependencies = [
1001
+ "dlopen2_derive",
1002
+ "libc",
1003
+ "once_cell",
1004
+ "winapi",
1005
+]
1006
+
1007
+[[package]]
1008
+name = "dlopen2_derive"
1009
+version = "0.4.1"
1010
+source = "registry+https://github.com/rust-lang/crates.io-index"
1011
+checksum = "788160fb30de9cdd857af31c6a2675904b16ece8fc2737b2c7127ba368c9d0f4"
1012
+dependencies = [
1013
+ "proc-macro2",
1014
+ "quote",
1015
+ "syn 2.0.111",
1016
+]
1017
+
1018
+[[package]]
1019
+name = "dotenv"
1020
+version = "0.15.0"
1021
+source = "registry+https://github.com/rust-lang/crates.io-index"
1022
+checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f"
1023
+
1024
+[[package]]
1025
+name = "dotenv_codegen"
1026
+version = "0.15.0"
1027
+source = "registry+https://github.com/rust-lang/crates.io-index"
1028
+checksum = "56966279c10e4f8ee8c22123a15ed74e7c8150b658b26c619c53f4a56eb4a8aa"
1029
+dependencies = [
1030
+ "dotenv_codegen_implementation",
1031
+ "proc-macro-hack",
1032
+]
1033
+
1034
+[[package]]
1035
+name = "dotenv_codegen_implementation"
1036
+version = "0.15.0"
1037
+source = "registry+https://github.com/rust-lang/crates.io-index"
1038
+checksum = "53e737a3522cd45f6adc19b644ce43ef53e1e9045f2d2de425c1f468abd4cf33"
1039
+dependencies = [
1040
+ "dotenv",
1041
+ "proc-macro-hack",
1042
+ "proc-macro2",
1043
+ "quote",
1044
+ "syn 1.0.109",
1045
+]
1046
+
1047
+[[package]]
1048
+name = "dpi"
1049
+version = "0.1.2"
1050
+source = "registry+https://github.com/rust-lang/crates.io-index"
1051
+checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76"
1052
+dependencies = [
1053
+ "serde",
1054
+]
1055
+
1056
+[[package]]
1057
+name = "dtoa"
1058
+version = "1.0.10"
1059
+source = "registry+https://github.com/rust-lang/crates.io-index"
1060
+checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04"
1061
+
1062
+[[package]]
1063
+name = "dtoa-short"
1064
+version = "0.3.5"
1065
+source = "registry+https://github.com/rust-lang/crates.io-index"
1066
+checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87"
1067
+dependencies = [
1068
+ "dtoa",
1069
+]
1070
+
1071
+[[package]]
1072
+name = "dunce"
1073
+version = "1.0.5"
1074
+source = "registry+https://github.com/rust-lang/crates.io-index"
1075
+checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
1076
+
1077
+[[package]]
1078
+name = "dyn-clone"
1079
+version = "1.0.20"
1080
+source = "registry+https://github.com/rust-lang/crates.io-index"
1081
+checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555"
1082
+
1083
+[[package]]
1084
+name = "embed-resource"
1085
+version = "3.0.6"
1086
+source = "registry+https://github.com/rust-lang/crates.io-index"
1087
+checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e"
1088
+dependencies = [
1089
+ "cc",
1090
+ "memchr",
1091
+ "rustc_version",
1092
+ "toml 0.9.8",
1093
+ "vswhom",
1094
+ "winreg",
1095
+]
1096
+
1097
+[[package]]
1098
+name = "embed_plist"
1099
+version = "1.2.2"
1100
+source = "registry+https://github.com/rust-lang/crates.io-index"
1101
+checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7"
1102
+
1103
+[[package]]
1104
+name = "encoding_rs"
1105
+version = "0.8.35"
1106
+source = "registry+https://github.com/rust-lang/crates.io-index"
1107
+checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
1108
+dependencies = [
1109
+ "cfg-if",
1110
+]
1111
+
1112
+[[package]]
1113
+name = "endi"
1114
+version = "1.1.0"
1115
+source = "registry+https://github.com/rust-lang/crates.io-index"
1116
+checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf"
1117
+
1118
+[[package]]
1119
+name = "enumflags2"
1120
+version = "0.7.12"
1121
+source = "registry+https://github.com/rust-lang/crates.io-index"
1122
+checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef"
1123
+dependencies = [
1124
+ "enumflags2_derive",
1125
+ "serde",
1126
+]
1127
+
1128
+[[package]]
1129
+name = "enumflags2_derive"
1130
+version = "0.7.12"
1131
+source = "registry+https://github.com/rust-lang/crates.io-index"
1132
+checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827"
1133
+dependencies = [
1134
+ "proc-macro2",
1135
+ "quote",
1136
+ "syn 2.0.111",
1137
+]
1138
+
1139
+[[package]]
1140
+name = "env_filter"
1141
+version = "0.1.4"
1142
+source = "registry+https://github.com/rust-lang/crates.io-index"
1143
+checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2"
1144
+dependencies = [
1145
+ "log",
1146
+ "regex",
1147
+]
1148
+
1149
+[[package]]
1150
+name = "equivalent"
1151
+version = "1.0.2"
1152
+source = "registry+https://github.com/rust-lang/crates.io-index"
1153
+checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
1154
+
1155
+[[package]]
1156
+name = "erased-serde"
1157
+version = "0.4.9"
1158
+source = "registry+https://github.com/rust-lang/crates.io-index"
1159
+checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3"
1160
+dependencies = [
1161
+ "serde",
1162
+ "serde_core",
1163
+ "typeid",
1164
+]
1165
+
1166
+[[package]]
1167
+name = "errno"
1168
+version = "0.3.14"
1169
+source = "registry+https://github.com/rust-lang/crates.io-index"
1170
+checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
1171
+dependencies = [
1172
+ "libc",
1173
+ "windows-sys 0.61.2",
1174
+]
1175
+
1176
+[[package]]
1177
+name = "event-listener"
1178
+version = "5.4.1"
1179
+source = "registry+https://github.com/rust-lang/crates.io-index"
1180
+checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab"
1181
+dependencies = [
1182
+ "concurrent-queue",
1183
+ "parking",
1184
+ "pin-project-lite",
1185
+]
1186
+
1187
+[[package]]
1188
+name = "event-listener-strategy"
1189
+version = "0.5.4"
1190
+source = "registry+https://github.com/rust-lang/crates.io-index"
1191
+checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93"
1192
+dependencies = [
1193
+ "event-listener",
1194
+ "pin-project-lite",
1195
+]
1196
+
1197
+[[package]]
1198
+name = "fastrand"
1199
+version = "2.3.0"
1200
+source = "registry+https://github.com/rust-lang/crates.io-index"
1201
+checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
1202
+
1203
+[[package]]
1204
+name = "fdeflate"
1205
+version = "0.3.7"
1206
+source = "registry+https://github.com/rust-lang/crates.io-index"
1207
+checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c"
1208
+dependencies = [
1209
+ "simd-adler32",
1210
+]
1211
+
1212
+[[package]]
1213
+name = "fern"
1214
+version = "0.7.1"
1215
+source = "registry+https://github.com/rust-lang/crates.io-index"
1216
+checksum = "4316185f709b23713e41e3195f90edef7fb00c3ed4adc79769cf09cc762a3b29"
1217
+dependencies = [
1218
+ "colored",
1219
+ "log",
1220
+]
1221
+
1222
+[[package]]
1223
+name = "field-offset"
1224
+version = "0.3.6"
1225
+source = "registry+https://github.com/rust-lang/crates.io-index"
1226
+checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f"
1227
+dependencies = [
1228
+ "memoffset",
1229
+ "rustc_version",
1230
+]
1231
+
1232
+[[package]]
1233
+name = "find-msvc-tools"
1234
+version = "0.1.5"
1235
+source = "registry+https://github.com/rust-lang/crates.io-index"
1236
+checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844"
1237
+
1238
+[[package]]
1239
+name = "flate2"
1240
+version = "1.1.5"
1241
+source = "registry+https://github.com/rust-lang/crates.io-index"
1242
+checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb"
1243
+dependencies = [
1244
+ "crc32fast",
1245
+ "miniz_oxide",
1246
+]
1247
+
1248
+[[package]]
1249
+name = "fnv"
1250
+version = "1.0.7"
1251
+source = "registry+https://github.com/rust-lang/crates.io-index"
1252
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
1253
+
1254
+[[package]]
1255
+name = "foreign-types"
1256
+version = "0.3.2"
1257
+source = "registry+https://github.com/rust-lang/crates.io-index"
1258
+checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
1259
+dependencies = [
1260
+ "foreign-types-shared 0.1.1",
1261
+]
1262
+
1263
+[[package]]
1264
+name = "foreign-types"
1265
+version = "0.5.0"
1266
+source = "registry+https://github.com/rust-lang/crates.io-index"
1267
+checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965"
1268
+dependencies = [
1269
+ "foreign-types-macros",
1270
+ "foreign-types-shared 0.3.1",
1271
+]
1272
+
1273
+[[package]]
1274
+name = "foreign-types-macros"
1275
+version = "0.2.3"
1276
+source = "registry+https://github.com/rust-lang/crates.io-index"
1277
+checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
1278
+dependencies = [
1279
+ "proc-macro2",
1280
+ "quote",
1281
+ "syn 2.0.111",
1282
+]
1283
+
1284
+[[package]]
1285
+name = "foreign-types-shared"
1286
+version = "0.1.1"
1287
+source = "registry+https://github.com/rust-lang/crates.io-index"
1288
+checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
1289
+
1290
+[[package]]
1291
+name = "foreign-types-shared"
1292
+version = "0.3.1"
1293
+source = "registry+https://github.com/rust-lang/crates.io-index"
1294
+checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b"
1295
+
1296
+[[package]]
1297
+name = "form_urlencoded"
1298
+version = "1.2.2"
1299
+source = "registry+https://github.com/rust-lang/crates.io-index"
1300
+checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
1301
+dependencies = [
1302
+ "percent-encoding",
1303
+]
1304
+
1305
+[[package]]
1306
+name = "funty"
1307
+version = "2.0.0"
1308
+source = "registry+https://github.com/rust-lang/crates.io-index"
1309
+checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
1310
+
1311
+[[package]]
1312
+name = "futf"
1313
+version = "0.1.5"
1314
+source = "registry+https://github.com/rust-lang/crates.io-index"
1315
+checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843"
1316
+dependencies = [
1317
+ "mac",
1318
+ "new_debug_unreachable",
1319
+]
1320
+
1321
+[[package]]
1322
+name = "futures-channel"
1323
+version = "0.3.31"
1324
+source = "registry+https://github.com/rust-lang/crates.io-index"
1325
+checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
1326
+dependencies = [
1327
+ "futures-core",
1328
+]
1329
+
1330
+[[package]]
1331
+name = "futures-core"
1332
+version = "0.3.31"
1333
+source = "registry+https://github.com/rust-lang/crates.io-index"
1334
+checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
1335
+
1336
+[[package]]
1337
+name = "futures-executor"
1338
+version = "0.3.31"
1339
+source = "registry+https://github.com/rust-lang/crates.io-index"
1340
+checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f"
1341
+dependencies = [
1342
+ "futures-core",
1343
+ "futures-task",
1344
+ "futures-util",
1345
+]
1346
+
1347
+[[package]]
1348
+name = "futures-io"
1349
+version = "0.3.31"
1350
+source = "registry+https://github.com/rust-lang/crates.io-index"
1351
+checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"
1352
+
1353
+[[package]]
1354
+name = "futures-lite"
1355
+version = "2.6.1"
1356
+source = "registry+https://github.com/rust-lang/crates.io-index"
1357
+checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad"
1358
+dependencies = [
1359
+ "fastrand",
1360
+ "futures-core",
1361
+ "futures-io",
1362
+ "parking",
1363
+ "pin-project-lite",
1364
+]
1365
+
1366
+[[package]]
1367
+name = "futures-macro"
1368
+version = "0.3.31"
1369
+source = "registry+https://github.com/rust-lang/crates.io-index"
1370
+checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
1371
+dependencies = [
1372
+ "proc-macro2",
1373
+ "quote",
1374
+ "syn 2.0.111",
1375
+]
1376
+
1377
+[[package]]
1378
+name = "futures-sink"
1379
+version = "0.3.31"
1380
+source = "registry+https://github.com/rust-lang/crates.io-index"
1381
+checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7"
1382
+
1383
+[[package]]
1384
+name = "futures-task"
1385
+version = "0.3.31"
1386
+source = "registry+https://github.com/rust-lang/crates.io-index"
1387
+checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
1388
+
1389
+[[package]]
1390
+name = "futures-util"
1391
+version = "0.3.31"
1392
+source = "registry+https://github.com/rust-lang/crates.io-index"
1393
+checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
1394
+dependencies = [
1395
+ "futures-core",
1396
+ "futures-io",
1397
+ "futures-macro",
1398
+ "futures-sink",
1399
+ "futures-task",
1400
+ "memchr",
1401
+ "pin-project-lite",
1402
+ "pin-utils",
1403
+ "slab",
1404
+]
1405
+
1406
+[[package]]
1407
+name = "fxhash"
1408
+version = "0.2.1"
1409
+source = "registry+https://github.com/rust-lang/crates.io-index"
1410
+checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
1411
+dependencies = [
1412
+ "byteorder",
1413
+]
1414
+
1415
+[[package]]
1416
+name = "gdk"
1417
+version = "0.18.2"
1418
+source = "registry+https://github.com/rust-lang/crates.io-index"
1419
+checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691"
1420
+dependencies = [
1421
+ "cairo-rs",
1422
+ "gdk-pixbuf",
1423
+ "gdk-sys",
1424
+ "gio",
1425
+ "glib",
1426
+ "libc",
1427
+ "pango",
1428
+]
1429
+
1430
+[[package]]
1431
+name = "gdk-pixbuf"
1432
+version = "0.18.5"
1433
+source = "registry+https://github.com/rust-lang/crates.io-index"
1434
+checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec"
1435
+dependencies = [
1436
+ "gdk-pixbuf-sys",
1437
+ "gio",
1438
+ "glib",
1439
+ "libc",
1440
+ "once_cell",
1441
+]
1442
+
1443
+[[package]]
1444
+name = "gdk-pixbuf-sys"
1445
+version = "0.18.0"
1446
+source = "registry+https://github.com/rust-lang/crates.io-index"
1447
+checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7"
1448
+dependencies = [
1449
+ "gio-sys",
1450
+ "glib-sys",
1451
+ "gobject-sys",
1452
+ "libc",
1453
+ "system-deps",
1454
+]
1455
+
1456
+[[package]]
1457
+name = "gdk-sys"
1458
+version = "0.18.2"
1459
+source = "registry+https://github.com/rust-lang/crates.io-index"
1460
+checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7"
1461
+dependencies = [
1462
+ "cairo-sys-rs",
1463
+ "gdk-pixbuf-sys",
1464
+ "gio-sys",
1465
+ "glib-sys",
1466
+ "gobject-sys",
1467
+ "libc",
1468
+ "pango-sys",
1469
+ "pkg-config",
1470
+ "system-deps",
1471
+]
1472
+
1473
+[[package]]
1474
+name = "gdkwayland-sys"
1475
+version = "0.18.2"
1476
+source = "registry+https://github.com/rust-lang/crates.io-index"
1477
+checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69"
1478
+dependencies = [
1479
+ "gdk-sys",
1480
+ "glib-sys",
1481
+ "gobject-sys",
1482
+ "libc",
1483
+ "pkg-config",
1484
+ "system-deps",
1485
+]
1486
+
1487
+[[package]]
1488
+name = "gdkx11"
1489
+version = "0.18.2"
1490
+source = "registry+https://github.com/rust-lang/crates.io-index"
1491
+checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe"
1492
+dependencies = [
1493
+ "gdk",
1494
+ "gdkx11-sys",
1495
+ "gio",
1496
+ "glib",
1497
+ "libc",
1498
+ "x11",
1499
+]
1500
+
1501
+[[package]]
1502
+name = "gdkx11-sys"
1503
+version = "0.18.2"
1504
+source = "registry+https://github.com/rust-lang/crates.io-index"
1505
+checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d"
1506
+dependencies = [
1507
+ "gdk-sys",
1508
+ "glib-sys",
1509
+ "libc",
1510
+ "system-deps",
1511
+ "x11",
1512
+]
1513
+
1514
+[[package]]
1515
+name = "generator"
1516
+version = "0.7.5"
1517
+source = "registry+https://github.com/rust-lang/crates.io-index"
1518
+checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e"
1519
+dependencies = [
1520
+ "cc",
1521
+ "libc",
1522
+ "log",
1523
+ "rustversion",
1524
+ "windows 0.48.0",
1525
+]
1526
+
1527
+[[package]]
1528
+name = "generic-array"
1529
+version = "0.14.7"
1530
+source = "registry+https://github.com/rust-lang/crates.io-index"
1531
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
1532
+dependencies = [
1533
+ "typenum",
1534
+ "version_check",
1535
+]
1536
+
1537
+[[package]]
1538
+name = "gethostname"
1539
+version = "1.1.0"
1540
+source = "registry+https://github.com/rust-lang/crates.io-index"
1541
+checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8"
1542
+dependencies = [
1543
+ "rustix",
1544
+ "windows-link 0.2.1",
1545
+]
1546
+
1547
+[[package]]
1548
+name = "getrandom"
1549
+version = "0.1.16"
1550
+source = "registry+https://github.com/rust-lang/crates.io-index"
1551
+checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
1552
+dependencies = [
1553
+ "cfg-if",
1554
+ "libc",
1555
+ "wasi 0.9.0+wasi-snapshot-preview1",
1556
+]
1557
+
1558
+[[package]]
1559
+name = "getrandom"
1560
+version = "0.2.16"
1561
+source = "registry+https://github.com/rust-lang/crates.io-index"
1562
+checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
1563
+dependencies = [
1564
+ "cfg-if",
1565
+ "js-sys",
1566
+ "libc",
1567
+ "wasi 0.11.1+wasi-snapshot-preview1",
1568
+ "wasm-bindgen",
1569
+]
1570
+
1571
+[[package]]
1572
+name = "getrandom"
1573
+version = "0.3.4"
1574
+source = "registry+https://github.com/rust-lang/crates.io-index"
1575
+checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
1576
+dependencies = [
1577
+ "cfg-if",
1578
+ "js-sys",
1579
+ "libc",
1580
+ "r-efi",
1581
+ "wasip2",
1582
+ "wasm-bindgen",
1583
+]
1584
+
1585
+[[package]]
1586
+name = "gio"
1587
+version = "0.18.4"
1588
+source = "registry+https://github.com/rust-lang/crates.io-index"
1589
+checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73"
1590
+dependencies = [
1591
+ "futures-channel",
1592
+ "futures-core",
1593
+ "futures-io",
1594
+ "futures-util",
1595
+ "gio-sys",
1596
+ "glib",
1597
+ "libc",
1598
+ "once_cell",
1599
+ "pin-project-lite",
1600
+ "smallvec",
1601
+ "thiserror 1.0.69",
1602
+]
1603
+
1604
+[[package]]
1605
+name = "gio-sys"
1606
+version = "0.18.1"
1607
+source = "registry+https://github.com/rust-lang/crates.io-index"
1608
+checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2"
1609
+dependencies = [
1610
+ "glib-sys",
1611
+ "gobject-sys",
1612
+ "libc",
1613
+ "system-deps",
1614
+ "winapi",
1615
+]
1616
+
1617
+[[package]]
1618
+name = "glib"
1619
+version = "0.18.5"
1620
+source = "registry+https://github.com/rust-lang/crates.io-index"
1621
+checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5"
1622
+dependencies = [
1623
+ "bitflags 2.10.0",
1624
+ "futures-channel",
1625
+ "futures-core",
1626
+ "futures-executor",
1627
+ "futures-task",
1628
+ "futures-util",
1629
+ "gio-sys",
1630
+ "glib-macros",
1631
+ "glib-sys",
1632
+ "gobject-sys",
1633
+ "libc",
1634
+ "memchr",
1635
+ "once_cell",
1636
+ "smallvec",
1637
+ "thiserror 1.0.69",
1638
+]
1639
+
1640
+[[package]]
1641
+name = "glib-macros"
1642
+version = "0.18.5"
1643
+source = "registry+https://github.com/rust-lang/crates.io-index"
1644
+checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc"
1645
+dependencies = [
1646
+ "heck 0.4.1",
1647
+ "proc-macro-crate 2.0.2",
1648
+ "proc-macro-error",
1649
+ "proc-macro2",
1650
+ "quote",
1651
+ "syn 2.0.111",
1652
+]
1653
+
1654
+[[package]]
1655
+name = "glib-sys"
1656
+version = "0.18.1"
1657
+source = "registry+https://github.com/rust-lang/crates.io-index"
1658
+checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898"
1659
+dependencies = [
1660
+ "libc",
1661
+ "system-deps",
1662
+]
1663
+
1664
+[[package]]
1665
+name = "glob"
1666
+version = "0.3.3"
1667
+source = "registry+https://github.com/rust-lang/crates.io-index"
1668
+checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"
1669
+
1670
+[[package]]
1671
+name = "gobject-sys"
1672
+version = "0.18.0"
1673
+source = "registry+https://github.com/rust-lang/crates.io-index"
1674
+checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44"
1675
+dependencies = [
1676
+ "glib-sys",
1677
+ "libc",
1678
+ "system-deps",
1679
+]
1680
+
1681
+[[package]]
1682
+name = "gtk"
1683
+version = "0.18.2"
1684
+source = "registry+https://github.com/rust-lang/crates.io-index"
1685
+checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a"
1686
+dependencies = [
1687
+ "atk",
1688
+ "cairo-rs",
1689
+ "field-offset",
1690
+ "futures-channel",
1691
+ "gdk",
1692
+ "gdk-pixbuf",
1693
+ "gio",
1694
+ "glib",
1695
+ "gtk-sys",
1696
+ "gtk3-macros",
1697
+ "libc",
1698
+ "pango",
1699
+ "pkg-config",
1700
+]
1701
+
1702
+[[package]]
1703
+name = "gtk-sys"
1704
+version = "0.18.2"
1705
+source = "registry+https://github.com/rust-lang/crates.io-index"
1706
+checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414"
1707
+dependencies = [
1708
+ "atk-sys",
1709
+ "cairo-sys-rs",
1710
+ "gdk-pixbuf-sys",
1711
+ "gdk-sys",
1712
+ "gio-sys",
1713
+ "glib-sys",
1714
+ "gobject-sys",
1715
+ "libc",
1716
+ "pango-sys",
1717
+ "system-deps",
1718
+]
1719
+
1720
+[[package]]
1721
+name = "gtk3-macros"
1722
+version = "0.18.2"
1723
+source = "registry+https://github.com/rust-lang/crates.io-index"
1724
+checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d"
1725
+dependencies = [
1726
+ "proc-macro-crate 1.3.1",
1727
+ "proc-macro-error",
1728
+ "proc-macro2",
1729
+ "quote",
1730
+ "syn 2.0.111",
1731
+]
1732
+
1733
+[[package]]
1734
+name = "h2"
1735
+version = "0.4.12"
1736
+source = "registry+https://github.com/rust-lang/crates.io-index"
1737
+checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386"
1738
+dependencies = [
1739
+ "atomic-waker",
1740
+ "bytes",
1741
+ "fnv",
1742
+ "futures-core",
1743
+ "futures-sink",
1744
+ "http",
1745
+ "indexmap 2.12.1",
1746
+ "slab",
1747
+ "tokio",
1748
+ "tokio-util",
1749
+ "tracing",
1750
+]
1751
+
1752
+[[package]]
1753
+name = "hashbrown"
1754
+version = "0.12.3"
1755
+source = "registry+https://github.com/rust-lang/crates.io-index"
1756
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
1757
+dependencies = [
1758
+ "ahash",
1759
+]
1760
+
1761
+[[package]]
1762
+name = "hashbrown"
1763
+version = "0.16.1"
1764
+source = "registry+https://github.com/rust-lang/crates.io-index"
1765
+checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
1766
+
1767
+[[package]]
1768
+name = "heck"
1769
+version = "0.3.3"
1770
+source = "registry+https://github.com/rust-lang/crates.io-index"
1771
+checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
1772
+dependencies = [
1773
+ "unicode-segmentation",
1774
+]
1775
+
1776
+[[package]]
1777
+name = "heck"
1778
+version = "0.4.1"
1779
+source = "registry+https://github.com/rust-lang/crates.io-index"
1780
+checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
1781
+
1782
+[[package]]
1783
+name = "heck"
1784
+version = "0.5.0"
1785
+source = "registry+https://github.com/rust-lang/crates.io-index"
1786
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
1787
+
1788
+[[package]]
1789
+name = "hermit-abi"
1790
+version = "0.1.19"
1791
+source = "registry+https://github.com/rust-lang/crates.io-index"
1792
+checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
1793
+dependencies = [
1794
+ "libc",
1795
+]
1796
+
1797
+[[package]]
1798
+name = "hermit-abi"
1799
+version = "0.5.2"
1800
+source = "registry+https://github.com/rust-lang/crates.io-index"
1801
+checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c"
1802
+
1803
+[[package]]
1804
+name = "hex"
1805
+version = "0.4.3"
1806
+source = "registry+https://github.com/rust-lang/crates.io-index"
1807
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
1808
+
1809
+[[package]]
1810
+name = "html5ever"
1811
+version = "0.29.1"
1812
+source = "registry+https://github.com/rust-lang/crates.io-index"
1813
+checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c"
1814
+dependencies = [
1815
+ "log",
1816
+ "mac",
1817
+ "markup5ever",
1818
+ "match_token",
1819
+]
1820
+
1821
+[[package]]
1822
+name = "http"
1823
+version = "1.3.1"
1824
+source = "registry+https://github.com/rust-lang/crates.io-index"
1825
+checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565"
1826
+dependencies = [
1827
+ "bytes",
1828
+ "fnv",
1829
+ "itoa",
1830
+]
1831
+
1832
+[[package]]
1833
+name = "http-body"
1834
+version = "1.0.1"
1835
+source = "registry+https://github.com/rust-lang/crates.io-index"
1836
+checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
1837
+dependencies = [
1838
+ "bytes",
1839
+ "http",
1840
+]
1841
+
1842
+[[package]]
1843
+name = "http-body-util"
1844
+version = "0.1.3"
1845
+source = "registry+https://github.com/rust-lang/crates.io-index"
1846
+checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
1847
+dependencies = [
1848
+ "bytes",
1849
+ "futures-core",
1850
+ "http",
1851
+ "http-body",
1852
+ "pin-project-lite",
1853
+]
1854
+
1855
+[[package]]
1856
+name = "httparse"
1857
+version = "1.10.1"
1858
+source = "registry+https://github.com/rust-lang/crates.io-index"
1859
+checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
1860
+
1861
+[[package]]
1862
+name = "hyper"
1863
+version = "1.8.1"
1864
+source = "registry+https://github.com/rust-lang/crates.io-index"
1865
+checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11"
1866
+dependencies = [
1867
+ "atomic-waker",
1868
+ "bytes",
1869
+ "futures-channel",
1870
+ "futures-core",
1871
+ "h2",
1872
+ "http",
1873
+ "http-body",
1874
+ "httparse",
1875
+ "itoa",
1876
+ "pin-project-lite",
1877
+ "pin-utils",
1878
+ "smallvec",
1879
+ "tokio",
1880
+ "want",
1881
+]
1882
+
1883
+[[package]]
1884
+name = "hyper-rustls"
1885
+version = "0.27.7"
1886
+source = "registry+https://github.com/rust-lang/crates.io-index"
1887
+checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58"
1888
+dependencies = [
1889
+ "http",
1890
+ "hyper",
1891
+ "hyper-util",
1892
+ "rustls",
1893
+ "rustls-native-certs",
1894
+ "rustls-pki-types",
1895
+ "tokio",
1896
+ "tokio-rustls",
1897
+ "tower-service",
1898
+]
1899
+
1900
+[[package]]
1901
+name = "hyper-tls"
1902
+version = "0.6.0"
1903
+source = "registry+https://github.com/rust-lang/crates.io-index"
1904
+checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0"
1905
+dependencies = [
1906
+ "bytes",
1907
+ "http-body-util",
1908
+ "hyper",
1909
+ "hyper-util",
1910
+ "native-tls",
1911
+ "tokio",
1912
+ "tokio-native-tls",
1913
+ "tower-service",
1914
+]
1915
+
1916
+[[package]]
1917
+name = "hyper-util"
1918
+version = "0.1.18"
1919
+source = "registry+https://github.com/rust-lang/crates.io-index"
1920
+checksum = "52e9a2a24dc5c6821e71a7030e1e14b7b632acac55c40e9d2e082c621261bb56"
1921
+dependencies = [
1922
+ "base64 0.22.1",
1923
+ "bytes",
1924
+ "futures-channel",
1925
+ "futures-core",
1926
+ "futures-util",
1927
+ "http",
1928
+ "http-body",
1929
+ "hyper",
1930
+ "ipnet",
1931
+ "libc",
1932
+ "percent-encoding",
1933
+ "pin-project-lite",
1934
+ "socket2",
1935
+ "system-configuration",
1936
+ "tokio",
1937
+ "tower-service",
1938
+ "tracing",
1939
+ "windows-registry",
1940
+]
1941
+
1942
+[[package]]
1943
+name = "iana-time-zone"
1944
+version = "0.1.64"
1945
+source = "registry+https://github.com/rust-lang/crates.io-index"
1946
+checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb"
1947
+dependencies = [
1948
+ "android_system_properties",
1949
+ "core-foundation-sys",
1950
+ "iana-time-zone-haiku",
1951
+ "js-sys",
1952
+ "log",
1953
+ "wasm-bindgen",
1954
+ "windows-core 0.62.2",
1955
+]
1956
+
1957
+[[package]]
1958
+name = "iana-time-zone-haiku"
1959
+version = "0.1.2"
1960
+source = "registry+https://github.com/rust-lang/crates.io-index"
1961
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
1962
+dependencies = [
1963
+ "cc",
1964
+]
1965
+
1966
+[[package]]
1967
+name = "ico"
1968
+version = "0.4.0"
1969
+source = "registry+https://github.com/rust-lang/crates.io-index"
1970
+checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98"
1971
+dependencies = [
1972
+ "byteorder",
1973
+ "png",
1974
+]
1975
+
1976
+[[package]]
1977
+name = "icu_collections"
1978
+version = "2.1.1"
1979
+source = "registry+https://github.com/rust-lang/crates.io-index"
1980
+checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43"
1981
+dependencies = [
1982
+ "displaydoc",
1983
+ "potential_utf",
1984
+ "yoke",
1985
+ "zerofrom",
1986
+ "zerovec",
1987
+]
1988
+
1989
+[[package]]
1990
+name = "icu_locale_core"
1991
+version = "2.1.1"
1992
+source = "registry+https://github.com/rust-lang/crates.io-index"
1993
+checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6"
1994
+dependencies = [
1995
+ "displaydoc",
1996
+ "litemap",
1997
+ "tinystr",
1998
+ "writeable",
1999
+ "zerovec",
2000
+]
2001
+
2002
+[[package]]
2003
+name = "icu_normalizer"
2004
+version = "2.1.1"
2005
+source = "registry+https://github.com/rust-lang/crates.io-index"
2006
+checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599"
2007
+dependencies = [
2008
+ "icu_collections",
2009
+ "icu_normalizer_data",
2010
+ "icu_properties",
2011
+ "icu_provider",
2012
+ "smallvec",
2013
+ "zerovec",
2014
+]
2015
+
2016
+[[package]]
2017
+name = "icu_normalizer_data"
2018
+version = "2.1.1"
2019
+source = "registry+https://github.com/rust-lang/crates.io-index"
2020
+checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a"
2021
+
2022
+[[package]]
2023
+name = "icu_properties"
2024
+version = "2.1.1"
2025
+source = "registry+https://github.com/rust-lang/crates.io-index"
2026
+checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99"
2027
+dependencies = [
2028
+ "icu_collections",
2029
+ "icu_locale_core",
2030
+ "icu_properties_data",
2031
+ "icu_provider",
2032
+ "zerotrie",
2033
+ "zerovec",
2034
+]
2035
+
2036
+[[package]]
2037
+name = "icu_properties_data"
2038
+version = "2.1.1"
2039
+source = "registry+https://github.com/rust-lang/crates.io-index"
2040
+checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899"
2041
+
2042
+[[package]]
2043
+name = "icu_provider"
2044
+version = "2.1.1"
2045
+source = "registry+https://github.com/rust-lang/crates.io-index"
2046
+checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614"
2047
+dependencies = [
2048
+ "displaydoc",
2049
+ "icu_locale_core",
2050
+ "writeable",
2051
+ "yoke",
2052
+ "zerofrom",
2053
+ "zerotrie",
2054
+ "zerovec",
2055
+]
2056
+
2057
+[[package]]
2058
+name = "ident_case"
2059
+version = "1.0.1"
2060
+source = "registry+https://github.com/rust-lang/crates.io-index"
2061
+checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
2062
+
2063
+[[package]]
2064
+name = "idna"
2065
+version = "1.1.0"
2066
+source = "registry+https://github.com/rust-lang/crates.io-index"
2067
+checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
2068
+dependencies = [
2069
+ "idna_adapter",
2070
+ "smallvec",
2071
+ "utf8_iter",
2072
+]
2073
+
2074
+[[package]]
2075
+name = "idna_adapter"
2076
+version = "1.2.1"
2077
+source = "registry+https://github.com/rust-lang/crates.io-index"
2078
+checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
2079
+dependencies = [
2080
+ "icu_normalizer",
2081
+ "icu_properties",
2082
+]
2083
+
2084
+[[package]]
2085
+name = "indexmap"
2086
+version = "1.9.3"
2087
+source = "registry+https://github.com/rust-lang/crates.io-index"
2088
+checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
2089
+dependencies = [
2090
+ "autocfg",
2091
+ "hashbrown 0.12.3",
2092
+ "serde",
2093
+]
2094
+
2095
+[[package]]
2096
+name = "indexmap"
2097
+version = "2.12.1"
2098
+source = "registry+https://github.com/rust-lang/crates.io-index"
2099
+checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2"
2100
+dependencies = [
2101
+ "equivalent",
2102
+ "hashbrown 0.16.1",
2103
+ "serde",
2104
+ "serde_core",
2105
+]
2106
+
2107
+[[package]]
2108
+name = "infer"
2109
+version = "0.19.0"
2110
+source = "registry+https://github.com/rust-lang/crates.io-index"
2111
+checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7"
2112
+dependencies = [
2113
+ "cfb",
2114
+]
2115
+
2116
+[[package]]
2117
+name = "ipnet"
2118
+version = "2.11.0"
2119
+source = "registry+https://github.com/rust-lang/crates.io-index"
2120
+checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
2121
+
2122
+[[package]]
2123
+name = "iri-string"
2124
+version = "0.7.9"
2125
+source = "registry+https://github.com/rust-lang/crates.io-index"
2126
+checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397"
2127
+dependencies = [
2128
+ "memchr",
2129
+ "serde",
2130
+]
2131
+
2132
+[[package]]
2133
+name = "is-docker"
2134
+version = "0.2.0"
2135
+source = "registry+https://github.com/rust-lang/crates.io-index"
2136
+checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3"
2137
+dependencies = [
2138
+ "once_cell",
2139
+]
2140
+
2141
+[[package]]
2142
+name = "is-wsl"
2143
+version = "0.4.0"
2144
+source = "registry+https://github.com/rust-lang/crates.io-index"
2145
+checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5"
2146
+dependencies = [
2147
+ "is-docker",
2148
+ "once_cell",
2149
+]
2150
+
2151
+[[package]]
2152
+name = "is_terminal_polyfill"
2153
+version = "1.70.2"
2154
+source = "registry+https://github.com/rust-lang/crates.io-index"
2155
+checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
2156
+
2157
+[[package]]
2158
+name = "itoa"
2159
+version = "1.0.15"
2160
+source = "registry+https://github.com/rust-lang/crates.io-index"
2161
+checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
2162
+
2163
+[[package]]
2164
+name = "javascriptcore-rs"
2165
+version = "1.1.2"
2166
+source = "registry+https://github.com/rust-lang/crates.io-index"
2167
+checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc"
2168
+dependencies = [
2169
+ "bitflags 1.3.2",
2170
+ "glib",
2171
+ "javascriptcore-rs-sys",
2172
+]
2173
+
2174
+[[package]]
2175
+name = "javascriptcore-rs-sys"
2176
+version = "1.1.1"
2177
+source = "registry+https://github.com/rust-lang/crates.io-index"
2178
+checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124"
2179
+dependencies = [
2180
+ "glib-sys",
2181
+ "gobject-sys",
2182
+ "libc",
2183
+ "system-deps",
2184
+]
2185
+
2186
+[[package]]
2187
+name = "jni"
2188
+version = "0.21.1"
2189
+source = "registry+https://github.com/rust-lang/crates.io-index"
2190
+checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97"
2191
+dependencies = [
2192
+ "cesu8",
2193
+ "cfg-if",
2194
+ "combine",
2195
+ "jni-sys",
2196
+ "log",
2197
+ "thiserror 1.0.69",
2198
+ "walkdir",
2199
+ "windows-sys 0.45.0",
2200
+]
2201
+
2202
+[[package]]
2203
+name = "jni-sys"
2204
+version = "0.3.0"
2205
+source = "registry+https://github.com/rust-lang/crates.io-index"
2206
+checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
2207
+
2208
+[[package]]
2209
+name = "js-sys"
2210
+version = "0.3.82"
2211
+source = "registry+https://github.com/rust-lang/crates.io-index"
2212
+checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65"
2213
+dependencies = [
2214
+ "once_cell",
2215
+ "wasm-bindgen",
2216
+]
2217
+
2218
+[[package]]
2219
+name = "json-patch"
2220
+version = "3.0.1"
2221
+source = "registry+https://github.com/rust-lang/crates.io-index"
2222
+checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08"
2223
+dependencies = [
2224
+ "jsonptr",
2225
+ "serde",
2226
+ "serde_json",
2227
+ "thiserror 1.0.69",
2228
+]
2229
+
2230
+[[package]]
2231
+name = "jsonptr"
2232
+version = "0.6.3"
2233
+source = "registry+https://github.com/rust-lang/crates.io-index"
2234
+checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70"
2235
+dependencies = [
2236
+ "serde",
2237
+ "serde_json",
2238
+]
2239
+
2240
+[[package]]
2241
+name = "keyboard-types"
2242
+version = "0.7.0"
2243
+source = "registry+https://github.com/rust-lang/crates.io-index"
2244
+checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a"
2245
+dependencies = [
2246
+ "bitflags 2.10.0",
2247
+ "serde",
2248
+ "unicode-segmentation",
2249
+]
2250
+
2251
+[[package]]
2252
+name = "kuchikiki"
2253
+version = "0.8.8-speedreader"
2254
+source = "registry+https://github.com/rust-lang/crates.io-index"
2255
+checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2"
2256
+dependencies = [
2257
+ "cssparser",
2258
+ "html5ever",
2259
+ "indexmap 2.12.1",
2260
+ "selectors",
2261
+]
2262
+
2263
+[[package]]
2264
+name = "lazy_static"
2265
+version = "1.5.0"
2266
+source = "registry+https://github.com/rust-lang/crates.io-index"
2267
+checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
2268
+
2269
+[[package]]
2270
+name = "libappindicator"
2271
+version = "0.9.0"
2272
+source = "registry+https://github.com/rust-lang/crates.io-index"
2273
+checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a"
2274
+dependencies = [
2275
+ "glib",
2276
+ "gtk",
2277
+ "gtk-sys",
2278
+ "libappindicator-sys",
2279
+ "log",
2280
+]
2281
+
2282
+[[package]]
2283
+name = "libappindicator-sys"
2284
+version = "0.9.0"
2285
+source = "registry+https://github.com/rust-lang/crates.io-index"
2286
+checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf"
2287
+dependencies = [
2288
+ "gtk-sys",
2289
+ "libloading",
2290
+ "once_cell",
2291
+]
2292
+
2293
+[[package]]
2294
+name = "libc"
2295
+version = "0.2.177"
2296
+source = "registry+https://github.com/rust-lang/crates.io-index"
2297
+checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976"
2298
+
2299
+[[package]]
2300
+name = "libloading"
2301
+version = "0.7.4"
2302
+source = "registry+https://github.com/rust-lang/crates.io-index"
2303
+checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f"
2304
+dependencies = [
2305
+ "cfg-if",
2306
+ "winapi",
2307
+]
2308
+
2309
+[[package]]
2310
+name = "libredox"
2311
+version = "0.1.10"
2312
+source = "registry+https://github.com/rust-lang/crates.io-index"
2313
+checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb"
2314
+dependencies = [
2315
+ "bitflags 2.10.0",
2316
+ "libc",
2317
+]
2318
+
2319
+[[package]]
2320
+name = "linux-raw-sys"
2321
+version = "0.11.0"
2322
+source = "registry+https://github.com/rust-lang/crates.io-index"
2323
+checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039"
2324
+
2325
+[[package]]
2326
+name = "litemap"
2327
+version = "0.8.1"
2328
+source = "registry+https://github.com/rust-lang/crates.io-index"
2329
+checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77"
2330
+
2331
+[[package]]
2332
+name = "lock_api"
2333
+version = "0.4.14"
2334
+source = "registry+https://github.com/rust-lang/crates.io-index"
2335
+checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
2336
+dependencies = [
2337
+ "scopeguard",
2338
+]
2339
+
2340
+[[package]]
2341
+name = "log"
2342
+version = "0.4.28"
2343
+source = "registry+https://github.com/rust-lang/crates.io-index"
2344
+checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
2345
+dependencies = [
2346
+ "value-bag",
2347
+]
2348
+
2349
+[[package]]
2350
+name = "loom"
2351
+version = "0.5.6"
2352
+source = "registry+https://github.com/rust-lang/crates.io-index"
2353
+checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5"
2354
+dependencies = [
2355
+ "cfg-if",
2356
+ "generator",
2357
+ "scoped-tls",
2358
+ "serde",
2359
+ "serde_json",
2360
+ "tracing",
2361
+ "tracing-subscriber",
2362
+]
2363
+
2364
+[[package]]
2365
+name = "lru-slab"
2366
+version = "0.1.2"
2367
+source = "registry+https://github.com/rust-lang/crates.io-index"
2368
+checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154"
2369
+
2370
+[[package]]
2371
+name = "mac"
2372
+version = "0.1.1"
2373
+source = "registry+https://github.com/rust-lang/crates.io-index"
2374
+checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
2375
+
2376
+[[package]]
2377
+name = "maplit"
2378
+version = "1.0.2"
2379
+source = "registry+https://github.com/rust-lang/crates.io-index"
2380
+checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
2381
+
2382
+[[package]]
2383
+name = "markup5ever"
2384
+version = "0.14.1"
2385
+source = "registry+https://github.com/rust-lang/crates.io-index"
2386
+checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18"
2387
+dependencies = [
2388
+ "log",
2389
+ "phf 0.11.3",
2390
+ "phf_codegen 0.11.3",
2391
+ "string_cache",
2392
+ "string_cache_codegen",
2393
+ "tendril",
2394
+]
2395
+
2396
+[[package]]
2397
+name = "match_token"
2398
+version = "0.1.0"
2399
+source = "registry+https://github.com/rust-lang/crates.io-index"
2400
+checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b"
2401
+dependencies = [
2402
+ "proc-macro2",
2403
+ "quote",
2404
+ "syn 2.0.111",
2405
+]
2406
+
2407
+[[package]]
2408
+name = "matchers"
2409
+version = "0.2.0"
2410
+source = "registry+https://github.com/rust-lang/crates.io-index"
2411
+checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9"
2412
+dependencies = [
2413
+ "regex-automata",
2414
+]
2415
+
2416
+[[package]]
2417
+name = "matches"
2418
+version = "0.1.10"
2419
+source = "registry+https://github.com/rust-lang/crates.io-index"
2420
+checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"
2421
+
2422
+[[package]]
2423
+name = "memchr"
2424
+version = "2.7.6"
2425
+source = "registry+https://github.com/rust-lang/crates.io-index"
2426
+checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
2427
+
2428
+[[package]]
2429
+name = "memoffset"
2430
+version = "0.9.1"
2431
+source = "registry+https://github.com/rust-lang/crates.io-index"
2432
+checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
2433
+dependencies = [
2434
+ "autocfg",
2435
+]
2436
+
2437
+[[package]]
2438
+name = "mime"
2439
+version = "0.3.17"
2440
+source = "registry+https://github.com/rust-lang/crates.io-index"
2441
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
2442
+
2443
+[[package]]
2444
+name = "miniz_oxide"
2445
+version = "0.8.9"
2446
+source = "registry+https://github.com/rust-lang/crates.io-index"
2447
+checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
2448
+dependencies = [
2449
+ "adler2",
2450
+ "simd-adler32",
2451
+]
2452
+
2453
+[[package]]
2454
+name = "mio"
2455
+version = "1.1.0"
2456
+source = "registry+https://github.com/rust-lang/crates.io-index"
2457
+checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873"
2458
+dependencies = [
2459
+ "libc",
2460
+ "wasi 0.11.1+wasi-snapshot-preview1",
2461
+ "windows-sys 0.61.2",
2462
+]
2463
+
2464
+[[package]]
2465
+name = "muda"
2466
+version = "0.17.1"
2467
+source = "registry+https://github.com/rust-lang/crates.io-index"
2468
+checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a"
2469
+dependencies = [
2470
+ "crossbeam-channel",
2471
+ "dpi",
2472
+ "gtk",
2473
+ "keyboard-types",
2474
+ "objc2 0.6.3",
2475
+ "objc2-app-kit",
2476
+ "objc2-core-foundation",
2477
+ "objc2-foundation 0.3.2",
2478
+ "once_cell",
2479
+ "png",
2480
+ "serde",
2481
+ "thiserror 2.0.17",
2482
+ "windows-sys 0.60.2",
2483
+]
2484
+
2485
+[[package]]
2486
+name = "native-tls"
2487
+version = "0.2.14"
2488
+source = "registry+https://github.com/rust-lang/crates.io-index"
2489
+checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e"
2490
+dependencies = [
2491
+ "libc",
2492
+ "log",
2493
+ "openssl",
2494
+ "openssl-probe",
2495
+ "openssl-sys",
2496
+ "schannel",
2497
+ "security-framework 2.11.1",
2498
+ "security-framework-sys",
2499
+ "tempfile",
2500
+]
2501
+
2502
+[[package]]
2503
+name = "ndk"
2504
+version = "0.9.0"
2505
+source = "registry+https://github.com/rust-lang/crates.io-index"
2506
+checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4"
2507
+dependencies = [
2508
+ "bitflags 2.10.0",
2509
+ "jni-sys",
2510
+ "log",
2511
+ "ndk-sys",
2512
+ "num_enum",
2513
+ "raw-window-handle",
2514
+ "thiserror 1.0.69",
2515
+]
2516
+
2517
+[[package]]
2518
+name = "ndk-context"
2519
+version = "0.1.1"
2520
+source = "registry+https://github.com/rust-lang/crates.io-index"
2521
+checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b"
2522
+
2523
+[[package]]
2524
+name = "ndk-sys"
2525
+version = "0.6.0+11769913"
2526
+source = "registry+https://github.com/rust-lang/crates.io-index"
2527
+checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873"
2528
+dependencies = [
2529
+ "jni-sys",
2530
+]
2531
+
2532
+[[package]]
2533
+name = "new_debug_unreachable"
2534
+version = "1.0.6"
2535
+source = "registry+https://github.com/rust-lang/crates.io-index"
2536
+checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
2537
+
2538
+[[package]]
2539
+name = "nix"
2540
+version = "0.30.1"
2541
+source = "registry+https://github.com/rust-lang/crates.io-index"
2542
+checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6"
2543
+dependencies = [
2544
+ "bitflags 2.10.0",
2545
+ "cfg-if",
2546
+ "cfg_aliases",
2547
+ "libc",
2548
+ "memoffset",
2549
+]
2550
+
2551
+[[package]]
2552
+name = "nodrop"
2553
+version = "0.1.14"
2554
+source = "registry+https://github.com/rust-lang/crates.io-index"
2555
+checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb"
2556
+
2557
+[[package]]
2558
+name = "nu-ansi-term"
2559
+version = "0.50.3"
2560
+source = "registry+https://github.com/rust-lang/crates.io-index"
2561
+checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
2562
+dependencies = [
2563
+ "windows-sys 0.61.2",
2564
+]
2565
+
2566
+[[package]]
2567
+name = "num-conv"
2568
+version = "0.1.0"
2569
+source = "registry+https://github.com/rust-lang/crates.io-index"
2570
+checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
2571
+
2572
+[[package]]
2573
+name = "num-traits"
2574
+version = "0.2.19"
2575
+source = "registry+https://github.com/rust-lang/crates.io-index"
2576
+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
2577
+dependencies = [
2578
+ "autocfg",
2579
+]
2580
+
2581
+[[package]]
2582
+name = "num_enum"
2583
+version = "0.7.5"
2584
+source = "registry+https://github.com/rust-lang/crates.io-index"
2585
+checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c"
2586
+dependencies = [
2587
+ "num_enum_derive",
2588
+ "rustversion",
2589
+]
2590
+
2591
+[[package]]
2592
+name = "num_enum_derive"
2593
+version = "0.7.5"
2594
+source = "registry+https://github.com/rust-lang/crates.io-index"
2595
+checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7"
2596
+dependencies = [
2597
+ "proc-macro-crate 3.4.0",
2598
+ "proc-macro2",
2599
+ "quote",
2600
+ "syn 2.0.111",
2601
+]
2602
+
2603
+[[package]]
2604
+name = "num_threads"
2605
+version = "0.1.7"
2606
+source = "registry+https://github.com/rust-lang/crates.io-index"
2607
+checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9"
2608
+dependencies = [
2609
+ "libc",
2610
+]
2611
+
2612
+[[package]]
2613
+name = "objc-sys"
2614
+version = "0.3.5"
2615
+source = "registry+https://github.com/rust-lang/crates.io-index"
2616
+checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310"
2617
+
2618
+[[package]]
2619
+name = "objc2"
2620
+version = "0.5.2"
2621
+source = "registry+https://github.com/rust-lang/crates.io-index"
2622
+checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804"
2623
+dependencies = [
2624
+ "objc-sys",
2625
+ "objc2-encode",
2626
+]
2627
+
2628
+[[package]]
2629
+name = "objc2"
2630
+version = "0.6.3"
2631
+source = "registry+https://github.com/rust-lang/crates.io-index"
2632
+checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05"
2633
+dependencies = [
2634
+ "objc2-encode",
2635
+ "objc2-exception-helper",
2636
+]
2637
+
2638
+[[package]]
2639
+name = "objc2-app-kit"
2640
+version = "0.3.2"
2641
+source = "registry+https://github.com/rust-lang/crates.io-index"
2642
+checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c"
2643
+dependencies = [
2644
+ "bitflags 2.10.0",
2645
+ "block2 0.6.2",
2646
+ "libc",
2647
+ "objc2 0.6.3",
2648
+ "objc2-cloud-kit",
2649
+ "objc2-core-data",
2650
+ "objc2-core-foundation",
2651
+ "objc2-core-graphics",
2652
+ "objc2-core-image",
2653
+ "objc2-core-text",
2654
+ "objc2-core-video",
2655
+ "objc2-foundation 0.3.2",
2656
+ "objc2-quartz-core 0.3.2",
2657
+]
2658
+
2659
+[[package]]
2660
+name = "objc2-cloud-kit"
2661
+version = "0.3.2"
2662
+source = "registry+https://github.com/rust-lang/crates.io-index"
2663
+checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c"
2664
+dependencies = [
2665
+ "bitflags 2.10.0",
2666
+ "objc2 0.6.3",
2667
+ "objc2-foundation 0.3.2",
2668
+]
2669
+
2670
+[[package]]
2671
+name = "objc2-core-data"
2672
+version = "0.3.2"
2673
+source = "registry+https://github.com/rust-lang/crates.io-index"
2674
+checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa"
2675
+dependencies = [
2676
+ "bitflags 2.10.0",
2677
+ "objc2 0.6.3",
2678
+ "objc2-foundation 0.3.2",
2679
+]
2680
+
2681
+[[package]]
2682
+name = "objc2-core-foundation"
2683
+version = "0.3.2"
2684
+source = "registry+https://github.com/rust-lang/crates.io-index"
2685
+checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536"
2686
+dependencies = [
2687
+ "bitflags 2.10.0",
2688
+ "dispatch2",
2689
+ "objc2 0.6.3",
2690
+]
2691
+
2692
+[[package]]
2693
+name = "objc2-core-graphics"
2694
+version = "0.3.2"
2695
+source = "registry+https://github.com/rust-lang/crates.io-index"
2696
+checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807"
2697
+dependencies = [
2698
+ "bitflags 2.10.0",
2699
+ "dispatch2",
2700
+ "objc2 0.6.3",
2701
+ "objc2-core-foundation",
2702
+ "objc2-io-surface",
2703
+]
2704
+
2705
+[[package]]
2706
+name = "objc2-core-image"
2707
+version = "0.3.2"
2708
+source = "registry+https://github.com/rust-lang/crates.io-index"
2709
+checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006"
2710
+dependencies = [
2711
+ "objc2 0.6.3",
2712
+ "objc2-foundation 0.3.2",
2713
+]
2714
+
2715
+[[package]]
2716
+name = "objc2-core-location"
2717
+version = "0.3.2"
2718
+source = "registry+https://github.com/rust-lang/crates.io-index"
2719
+checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009"
2720
+dependencies = [
2721
+ "objc2 0.6.3",
2722
+ "objc2-foundation 0.3.2",
2723
+]
2724
+
2725
+[[package]]
2726
+name = "objc2-core-text"
2727
+version = "0.3.2"
2728
+source = "registry+https://github.com/rust-lang/crates.io-index"
2729
+checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d"
2730
+dependencies = [
2731
+ "bitflags 2.10.0",
2732
+ "objc2 0.6.3",
2733
+ "objc2-core-foundation",
2734
+ "objc2-core-graphics",
2735
+]
2736
+
2737
+[[package]]
2738
+name = "objc2-core-video"
2739
+version = "0.3.2"
2740
+source = "registry+https://github.com/rust-lang/crates.io-index"
2741
+checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6"
2742
+dependencies = [
2743
+ "bitflags 2.10.0",
2744
+ "objc2 0.6.3",
2745
+ "objc2-core-foundation",
2746
+ "objc2-core-graphics",
2747
+ "objc2-io-surface",
2748
+]
2749
+
2750
+[[package]]
2751
+name = "objc2-encode"
2752
+version = "4.1.0"
2753
+source = "registry+https://github.com/rust-lang/crates.io-index"
2754
+checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33"
2755
+
2756
+[[package]]
2757
+name = "objc2-exception-helper"
2758
+version = "0.1.1"
2759
+source = "registry+https://github.com/rust-lang/crates.io-index"
2760
+checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a"
2761
+dependencies = [
2762
+ "cc",
2763
+]
2764
+
2765
+[[package]]
2766
+name = "objc2-foundation"
2767
+version = "0.2.2"
2768
+source = "registry+https://github.com/rust-lang/crates.io-index"
2769
+checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8"
2770
+dependencies = [
2771
+ "bitflags 2.10.0",
2772
+ "block2 0.5.1",
2773
+ "libc",
2774
+ "objc2 0.5.2",
2775
+]
2776
+
2777
+[[package]]
2778
+name = "objc2-foundation"
2779
+version = "0.3.2"
2780
+source = "registry+https://github.com/rust-lang/crates.io-index"
2781
+checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272"
2782
+dependencies = [
2783
+ "bitflags 2.10.0",
2784
+ "block2 0.6.2",
2785
+ "libc",
2786
+ "objc2 0.6.3",
2787
+ "objc2-core-foundation",
2788
+]
2789
+
2790
+[[package]]
2791
+name = "objc2-io-surface"
2792
+version = "0.3.2"
2793
+source = "registry+https://github.com/rust-lang/crates.io-index"
2794
+checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d"
2795
+dependencies = [
2796
+ "bitflags 2.10.0",
2797
+ "objc2 0.6.3",
2798
+ "objc2-core-foundation",
2799
+]
2800
+
2801
+[[package]]
2802
+name = "objc2-javascript-core"
2803
+version = "0.3.2"
2804
+source = "registry+https://github.com/rust-lang/crates.io-index"
2805
+checksum = "2a1e6550c4caed348956ce3370c9ffeca70bb1dbed4fa96112e7c6170e074586"
2806
+dependencies = [
2807
+ "objc2 0.6.3",
2808
+ "objc2-core-foundation",
2809
+]
2810
+
2811
+[[package]]
2812
+name = "objc2-metal"
2813
+version = "0.2.2"
2814
+source = "registry+https://github.com/rust-lang/crates.io-index"
2815
+checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6"
2816
+dependencies = [
2817
+ "bitflags 2.10.0",
2818
+ "block2 0.5.1",
2819
+ "objc2 0.5.2",
2820
+ "objc2-foundation 0.2.2",
2821
+]
2822
+
2823
+[[package]]
2824
+name = "objc2-quartz-core"
2825
+version = "0.2.2"
2826
+source = "registry+https://github.com/rust-lang/crates.io-index"
2827
+checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a"
2828
+dependencies = [
2829
+ "bitflags 2.10.0",
2830
+ "block2 0.5.1",
2831
+ "objc2 0.5.2",
2832
+ "objc2-foundation 0.2.2",
2833
+ "objc2-metal",
2834
+]
2835
+
2836
+[[package]]
2837
+name = "objc2-quartz-core"
2838
+version = "0.3.2"
2839
+source = "registry+https://github.com/rust-lang/crates.io-index"
2840
+checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f"
2841
+dependencies = [
2842
+ "bitflags 2.10.0",
2843
+ "objc2 0.6.3",
2844
+ "objc2-core-foundation",
2845
+ "objc2-foundation 0.3.2",
2846
+]
2847
+
2848
+[[package]]
2849
+name = "objc2-security"
2850
+version = "0.3.2"
2851
+source = "registry+https://github.com/rust-lang/crates.io-index"
2852
+checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a"
2853
+dependencies = [
2854
+ "bitflags 2.10.0",
2855
+ "objc2 0.6.3",
2856
+ "objc2-core-foundation",
2857
+]
2858
+
2859
+[[package]]
2860
+name = "objc2-ui-kit"
2861
+version = "0.3.2"
2862
+source = "registry+https://github.com/rust-lang/crates.io-index"
2863
+checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22"
2864
+dependencies = [
2865
+ "bitflags 2.10.0",
2866
+ "block2 0.6.2",
2867
+ "objc2 0.6.3",
2868
+ "objc2-cloud-kit",
2869
+ "objc2-core-data",
2870
+ "objc2-core-foundation",
2871
+ "objc2-core-graphics",
2872
+ "objc2-core-image",
2873
+ "objc2-core-location",
2874
+ "objc2-core-text",
2875
+ "objc2-foundation 0.3.2",
2876
+ "objc2-quartz-core 0.3.2",
2877
+ "objc2-user-notifications",
2878
+]
2879
+
2880
+[[package]]
2881
+name = "objc2-user-notifications"
2882
+version = "0.3.2"
2883
+source = "registry+https://github.com/rust-lang/crates.io-index"
2884
+checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e"
2885
+dependencies = [
2886
+ "objc2 0.6.3",
2887
+ "objc2-foundation 0.3.2",
2888
+]
2889
+
2890
+[[package]]
2891
+name = "objc2-web-kit"
2892
+version = "0.3.2"
2893
+source = "registry+https://github.com/rust-lang/crates.io-index"
2894
+checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f"
2895
+dependencies = [
2896
+ "bitflags 2.10.0",
2897
+ "block2 0.6.2",
2898
+ "objc2 0.6.3",
2899
+ "objc2-app-kit",
2900
+ "objc2-core-foundation",
2901
+ "objc2-foundation 0.3.2",
2902
+ "objc2-javascript-core",
2903
+ "objc2-security",
2904
+]
2905
+
2906
+[[package]]
2907
+name = "once_cell"
2908
+version = "1.21.3"
2909
+source = "registry+https://github.com/rust-lang/crates.io-index"
2910
+checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
2911
+
2912
+[[package]]
2913
+name = "once_cell_polyfill"
2914
+version = "1.70.2"
2915
+source = "registry+https://github.com/rust-lang/crates.io-index"
2916
+checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
2917
+
2918
+[[package]]
2919
+name = "open"
2920
+version = "5.3.3"
2921
+source = "registry+https://github.com/rust-lang/crates.io-index"
2922
+checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc"
2923
+dependencies = [
2924
+ "dunce",
2925
+ "is-wsl",
2926
+ "libc",
2927
+ "pathdiff",
2928
+]
2929
+
2930
+[[package]]
2931
+name = "openssl"
2932
+version = "0.10.75"
2933
+source = "registry+https://github.com/rust-lang/crates.io-index"
2934
+checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328"
2935
+dependencies = [
2936
+ "bitflags 2.10.0",
2937
+ "cfg-if",
2938
+ "foreign-types 0.3.2",
2939
+ "libc",
2940
+ "once_cell",
2941
+ "openssl-macros",
2942
+ "openssl-sys",
2943
+]
2944
+
2945
+[[package]]
2946
+name = "openssl-macros"
2947
+version = "0.1.1"
2948
+source = "registry+https://github.com/rust-lang/crates.io-index"
2949
+checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
2950
+dependencies = [
2951
+ "proc-macro2",
2952
+ "quote",
2953
+ "syn 2.0.111",
2954
+]
2955
+
2956
+[[package]]
2957
+name = "openssl-probe"
2958
+version = "0.1.6"
2959
+source = "registry+https://github.com/rust-lang/crates.io-index"
2960
+checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
2961
+
2962
+[[package]]
2963
+name = "openssl-src"
2964
+version = "300.5.4+3.5.4"
2965
+source = "registry+https://github.com/rust-lang/crates.io-index"
2966
+checksum = "a507b3792995dae9b0df8a1c1e3771e8418b7c2d9f0baeba32e6fe8b06c7cb72"
2967
+dependencies = [
2968
+ "cc",
2969
+]
2970
+
2971
+[[package]]
2972
+name = "openssl-sys"
2973
+version = "0.9.111"
2974
+source = "registry+https://github.com/rust-lang/crates.io-index"
2975
+checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321"
2976
+dependencies = [
2977
+ "cc",
2978
+ "libc",
2979
+ "openssl-src",
2980
+ "pkg-config",
2981
+ "vcpkg",
2982
+]
2983
+
2984
+[[package]]
2985
+name = "option-ext"
2986
+version = "0.2.0"
2987
+source = "registry+https://github.com/rust-lang/crates.io-index"
2988
+checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
2989
+
2990
+[[package]]
2991
+name = "ordered-stream"
2992
+version = "0.2.0"
2993
+source = "registry+https://github.com/rust-lang/crates.io-index"
2994
+checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50"
2995
+dependencies = [
2996
+ "futures-core",
2997
+ "pin-project-lite",
2998
+]
2999
+
3000
+[[package]]
3001
+name = "os_info"
3002
+version = "3.13.0"
3003
+source = "registry+https://github.com/rust-lang/crates.io-index"
3004
+checksum = "7c39b5918402d564846d5aba164c09a66cc88d232179dfd3e3c619a25a268392"
3005
+dependencies = [
3006
+ "android_system_properties",
3007
+ "log",
3008
+ "nix",
3009
+ "objc2 0.6.3",
3010
+ "objc2-foundation 0.3.2",
3011
+ "objc2-ui-kit",
3012
+ "serde",
3013
+ "windows-sys 0.61.2",
3014
+]
3015
+
3016
+[[package]]
3017
+name = "pango"
3018
+version = "0.18.3"
3019
+source = "registry+https://github.com/rust-lang/crates.io-index"
3020
+checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4"
3021
+dependencies = [
3022
+ "gio",
3023
+ "glib",
3024
+ "libc",
3025
+ "once_cell",
3026
+ "pango-sys",
3027
+]
3028
+
3029
+[[package]]
3030
+name = "pango-sys"
3031
+version = "0.18.0"
3032
+source = "registry+https://github.com/rust-lang/crates.io-index"
3033
+checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5"
3034
+dependencies = [
3035
+ "glib-sys",
3036
+ "gobject-sys",
3037
+ "libc",
3038
+ "system-deps",
3039
+]
3040
+
3041
+[[package]]
3042
+name = "parking"
3043
+version = "2.2.1"
3044
+source = "registry+https://github.com/rust-lang/crates.io-index"
3045
+checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba"
3046
+
3047
+[[package]]
3048
+name = "parking_lot"
3049
+version = "0.12.5"
3050
+source = "registry+https://github.com/rust-lang/crates.io-index"
3051
+checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
3052
+dependencies = [
3053
+ "lock_api",
3054
+ "parking_lot_core",
3055
+]
3056
+
3057
+[[package]]
3058
+name = "parking_lot_core"
3059
+version = "0.9.12"
3060
+source = "registry+https://github.com/rust-lang/crates.io-index"
3061
+checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
3062
+dependencies = [
3063
+ "cfg-if",
3064
+ "libc",
3065
+ "redox_syscall",
3066
+ "smallvec",
3067
+ "windows-link 0.2.1",
3068
+]
3069
+
3070
+[[package]]
3071
+name = "pathdiff"
3072
+version = "0.2.3"
3073
+source = "registry+https://github.com/rust-lang/crates.io-index"
3074
+checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3"
3075
+
3076
+[[package]]
3077
+name = "percent-encoding"
3078
+version = "2.3.2"
3079
+source = "registry+https://github.com/rust-lang/crates.io-index"
3080
+checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
3081
+
3082
+[[package]]
3083
+name = "phf"
3084
+version = "0.8.0"
3085
+source = "registry+https://github.com/rust-lang/crates.io-index"
3086
+checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12"
3087
+dependencies = [
3088
+ "phf_shared 0.8.0",
3089
+]
3090
+
3091
+[[package]]
3092
+name = "phf"
3093
+version = "0.10.1"
3094
+source = "registry+https://github.com/rust-lang/crates.io-index"
3095
+checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259"
3096
+dependencies = [
3097
+ "phf_macros 0.10.0",
3098
+ "phf_shared 0.10.0",
3099
+ "proc-macro-hack",
3100
+]
3101
+
3102
+[[package]]
3103
+name = "phf"
3104
+version = "0.11.3"
3105
+source = "registry+https://github.com/rust-lang/crates.io-index"
3106
+checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078"
3107
+dependencies = [
3108
+ "phf_macros 0.11.3",
3109
+ "phf_shared 0.11.3",
3110
+]
3111
+
3112
+[[package]]
3113
+name = "phf_codegen"
3114
+version = "0.8.0"
3115
+source = "registry+https://github.com/rust-lang/crates.io-index"
3116
+checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815"
3117
+dependencies = [
3118
+ "phf_generator 0.8.0",
3119
+ "phf_shared 0.8.0",
3120
+]
3121
+
3122
+[[package]]
3123
+name = "phf_codegen"
3124
+version = "0.11.3"
3125
+source = "registry+https://github.com/rust-lang/crates.io-index"
3126
+checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a"
3127
+dependencies = [
3128
+ "phf_generator 0.11.3",
3129
+ "phf_shared 0.11.3",
3130
+]
3131
+
3132
+[[package]]
3133
+name = "phf_generator"
3134
+version = "0.8.0"
3135
+source = "registry+https://github.com/rust-lang/crates.io-index"
3136
+checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526"
3137
+dependencies = [
3138
+ "phf_shared 0.8.0",
3139
+ "rand 0.7.3",
3140
+]
3141
+
3142
+[[package]]
3143
+name = "phf_generator"
3144
+version = "0.10.0"
3145
+source = "registry+https://github.com/rust-lang/crates.io-index"
3146
+checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6"
3147
+dependencies = [
3148
+ "phf_shared 0.10.0",
3149
+ "rand 0.8.5",
3150
+]
3151
+
3152
+[[package]]
3153
+name = "phf_generator"
3154
+version = "0.11.3"
3155
+source = "registry+https://github.com/rust-lang/crates.io-index"
3156
+checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d"
3157
+dependencies = [
3158
+ "phf_shared 0.11.3",
3159
+ "rand 0.8.5",
3160
+]
3161
+
3162
+[[package]]
3163
+name = "phf_macros"
3164
+version = "0.10.0"
3165
+source = "registry+https://github.com/rust-lang/crates.io-index"
3166
+checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0"
3167
+dependencies = [
3168
+ "phf_generator 0.10.0",
3169
+ "phf_shared 0.10.0",
3170
+ "proc-macro-hack",
3171
+ "proc-macro2",
3172
+ "quote",
3173
+ "syn 1.0.109",
3174
+]
3175
+
3176
+[[package]]
3177
+name = "phf_macros"
3178
+version = "0.11.3"
3179
+source = "registry+https://github.com/rust-lang/crates.io-index"
3180
+checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216"
3181
+dependencies = [
3182
+ "phf_generator 0.11.3",
3183
+ "phf_shared 0.11.3",
3184
+ "proc-macro2",
3185
+ "quote",
3186
+ "syn 2.0.111",
3187
+]
3188
+
3189
+[[package]]
3190
+name = "phf_shared"
3191
+version = "0.8.0"
3192
+source = "registry+https://github.com/rust-lang/crates.io-index"
3193
+checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7"
3194
+dependencies = [
3195
+ "siphasher 0.3.11",
3196
+]
3197
+
3198
+[[package]]
3199
+name = "phf_shared"
3200
+version = "0.10.0"
3201
+source = "registry+https://github.com/rust-lang/crates.io-index"
3202
+checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096"
3203
+dependencies = [
3204
+ "siphasher 0.3.11",
3205
+]
3206
+
3207
+[[package]]
3208
+name = "phf_shared"
3209
+version = "0.11.3"
3210
+source = "registry+https://github.com/rust-lang/crates.io-index"
3211
+checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5"
3212
+dependencies = [
3213
+ "siphasher 1.0.1",
3214
+]
3215
+
3216
+[[package]]
3217
+name = "pin-project-lite"
3218
+version = "0.2.16"
3219
+source = "registry+https://github.com/rust-lang/crates.io-index"
3220
+checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
3221
+
3222
+[[package]]
3223
+name = "pin-utils"
3224
+version = "0.1.0"
3225
+source = "registry+https://github.com/rust-lang/crates.io-index"
3226
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
3227
+
3228
+[[package]]
3229
+name = "piper"
3230
+version = "0.2.4"
3231
+source = "registry+https://github.com/rust-lang/crates.io-index"
3232
+checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066"
3233
+dependencies = [
3234
+ "atomic-waker",
3235
+ "fastrand",
3236
+ "futures-io",
3237
+]
3238
+
3239
+[[package]]
3240
+name = "pkg-config"
3241
+version = "0.3.32"
3242
+source = "registry+https://github.com/rust-lang/crates.io-index"
3243
+checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
3244
+
3245
+[[package]]
3246
+name = "plist"
3247
+version = "1.8.0"
3248
+source = "registry+https://github.com/rust-lang/crates.io-index"
3249
+checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07"
3250
+dependencies = [
3251
+ "base64 0.22.1",
3252
+ "indexmap 2.12.1",
3253
+ "quick-xml",
3254
+ "serde",
3255
+ "time",
3256
+]
3257
+
3258
+[[package]]
3259
+name = "png"
3260
+version = "0.17.16"
3261
+source = "registry+https://github.com/rust-lang/crates.io-index"
3262
+checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526"
3263
+dependencies = [
3264
+ "bitflags 1.3.2",
3265
+ "crc32fast",
3266
+ "fdeflate",
3267
+ "flate2",
3268
+ "miniz_oxide",
3269
+]
3270
+
3271
+[[package]]
3272
+name = "polling"
3273
+version = "3.11.0"
3274
+source = "registry+https://github.com/rust-lang/crates.io-index"
3275
+checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218"
3276
+dependencies = [
3277
+ "cfg-if",
3278
+ "concurrent-queue",
3279
+ "hermit-abi 0.5.2",
3280
+ "pin-project-lite",
3281
+ "rustix",
3282
+ "windows-sys 0.61.2",
3283
+]
3284
+
3285
+[[package]]
3286
+name = "potential_utf"
3287
+version = "0.1.4"
3288
+source = "registry+https://github.com/rust-lang/crates.io-index"
3289
+checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77"
3290
+dependencies = [
3291
+ "zerovec",
3292
+]
3293
+
3294
+[[package]]
3295
+name = "powerfmt"
3296
+version = "0.2.0"
3297
+source = "registry+https://github.com/rust-lang/crates.io-index"
3298
+checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
3299
+
3300
+[[package]]
3301
+name = "ppv-lite86"
3302
+version = "0.2.21"
3303
+source = "registry+https://github.com/rust-lang/crates.io-index"
3304
+checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
3305
+dependencies = [
3306
+ "zerocopy",
3307
+]
3308
+
3309
+[[package]]
3310
+name = "precomputed-hash"
3311
+version = "0.1.1"
3312
+source = "registry+https://github.com/rust-lang/crates.io-index"
3313
+checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
3314
+
3315
+[[package]]
3316
+name = "proc-macro-crate"
3317
+version = "1.3.1"
3318
+source = "registry+https://github.com/rust-lang/crates.io-index"
3319
+checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919"
3320
+dependencies = [
3321
+ "once_cell",
3322
+ "toml_edit 0.19.15",
3323
+]
3324
+
3325
+[[package]]
3326
+name = "proc-macro-crate"
3327
+version = "2.0.2"
3328
+source = "registry+https://github.com/rust-lang/crates.io-index"
3329
+checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24"
3330
+dependencies = [
3331
+ "toml_datetime 0.6.3",
3332
+ "toml_edit 0.20.2",
3333
+]
3334
+
3335
+[[package]]
3336
+name = "proc-macro-crate"
3337
+version = "3.4.0"
3338
+source = "registry+https://github.com/rust-lang/crates.io-index"
3339
+checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983"
3340
+dependencies = [
3341
+ "toml_edit 0.23.7",
3342
+]
3343
+
3344
+[[package]]
3345
+name = "proc-macro-error"
3346
+version = "1.0.4"
3347
+source = "registry+https://github.com/rust-lang/crates.io-index"
3348
+checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
3349
+dependencies = [
3350
+ "proc-macro-error-attr",
3351
+ "proc-macro2",
3352
+ "quote",
3353
+ "syn 1.0.109",
3354
+ "version_check",
3355
+]
3356
+
3357
+[[package]]
3358
+name = "proc-macro-error-attr"
3359
+version = "1.0.4"
3360
+source = "registry+https://github.com/rust-lang/crates.io-index"
3361
+checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
3362
+dependencies = [
3363
+ "proc-macro2",
3364
+ "quote",
3365
+ "version_check",
3366
+]
3367
+
3368
+[[package]]
3369
+name = "proc-macro-hack"
3370
+version = "0.5.20+deprecated"
3371
+source = "registry+https://github.com/rust-lang/crates.io-index"
3372
+checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
3373
+
3374
+[[package]]
3375
+name = "proc-macro2"
3376
+version = "1.0.103"
3377
+source = "registry+https://github.com/rust-lang/crates.io-index"
3378
+checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8"
3379
+dependencies = [
3380
+ "unicode-ident",
3381
+]
3382
+
3383
+[[package]]
3384
+name = "ptr_meta"
3385
+version = "0.1.4"
3386
+source = "registry+https://github.com/rust-lang/crates.io-index"
3387
+checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1"
3388
+dependencies = [
3389
+ "ptr_meta_derive",
3390
+]
3391
+
3392
+[[package]]
3393
+name = "ptr_meta_derive"
3394
+version = "0.1.4"
3395
+source = "registry+https://github.com/rust-lang/crates.io-index"
3396
+checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac"
3397
+dependencies = [
3398
+ "proc-macro2",
3399
+ "quote",
3400
+ "syn 1.0.109",
3401
+]
3402
+
3403
+[[package]]
3404
+name = "quick-xml"
3405
+version = "0.38.4"
3406
+source = "registry+https://github.com/rust-lang/crates.io-index"
3407
+checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c"
3408
+dependencies = [
3409
+ "memchr",
3410
+]
3411
+
3412
+[[package]]
3413
+name = "quinn"
3414
+version = "0.11.9"
3415
+source = "registry+https://github.com/rust-lang/crates.io-index"
3416
+checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20"
3417
+dependencies = [
3418
+ "bytes",
3419
+ "cfg_aliases",
3420
+ "pin-project-lite",
3421
+ "quinn-proto",
3422
+ "quinn-udp",
3423
+ "rustc-hash",
3424
+ "rustls",
3425
+ "socket2",
3426
+ "thiserror 2.0.17",
3427
+ "tokio",
3428
+ "tracing",
3429
+ "web-time",
3430
+]
3431
+
3432
+[[package]]
3433
+name = "quinn-proto"
3434
+version = "0.11.13"
3435
+source = "registry+https://github.com/rust-lang/crates.io-index"
3436
+checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31"
3437
+dependencies = [
3438
+ "bytes",
3439
+ "getrandom 0.3.4",
3440
+ "lru-slab",
3441
+ "rand 0.9.2",
3442
+ "ring",
3443
+ "rustc-hash",
3444
+ "rustls",
3445
+ "rustls-pki-types",
3446
+ "slab",
3447
+ "thiserror 2.0.17",
3448
+ "tinyvec",
3449
+ "tracing",
3450
+ "web-time",
3451
+]
3452
+
3453
+[[package]]
3454
+name = "quinn-udp"
3455
+version = "0.5.14"
3456
+source = "registry+https://github.com/rust-lang/crates.io-index"
3457
+checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd"
3458
+dependencies = [
3459
+ "cfg_aliases",
3460
+ "libc",
3461
+ "once_cell",
3462
+ "socket2",
3463
+ "tracing",
3464
+ "windows-sys 0.60.2",
3465
+]
3466
+
3467
+[[package]]
3468
+name = "quote"
3469
+version = "1.0.42"
3470
+source = "registry+https://github.com/rust-lang/crates.io-index"
3471
+checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f"
3472
+dependencies = [
3473
+ "proc-macro2",
3474
+]
3475
+
3476
+[[package]]
3477
+name = "r-efi"
3478
+version = "5.3.0"
3479
+source = "registry+https://github.com/rust-lang/crates.io-index"
3480
+checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
3481
+
3482
+[[package]]
3483
+name = "radium"
3484
+version = "0.7.0"
3485
+source = "registry+https://github.com/rust-lang/crates.io-index"
3486
+checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
3487
+
3488
+[[package]]
3489
+name = "rand"
3490
+version = "0.7.3"
3491
+source = "registry+https://github.com/rust-lang/crates.io-index"
3492
+checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
3493
+dependencies = [
3494
+ "getrandom 0.1.16",
3495
+ "libc",
3496
+ "rand_chacha 0.2.2",
3497
+ "rand_core 0.5.1",
3498
+ "rand_hc",
3499
+ "rand_pcg",
3500
+]
3501
+
3502
+[[package]]
3503
+name = "rand"
3504
+version = "0.8.5"
3505
+source = "registry+https://github.com/rust-lang/crates.io-index"
3506
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
3507
+dependencies = [
3508
+ "libc",
3509
+ "rand_chacha 0.3.1",
3510
+ "rand_core 0.6.4",
3511
+]
3512
+
3513
+[[package]]
3514
+name = "rand"
3515
+version = "0.9.2"
3516
+source = "registry+https://github.com/rust-lang/crates.io-index"
3517
+checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
3518
+dependencies = [
3519
+ "rand_chacha 0.9.0",
3520
+ "rand_core 0.9.3",
3521
+]
3522
+
3523
+[[package]]
3524
+name = "rand_chacha"
3525
+version = "0.2.2"
3526
+source = "registry+https://github.com/rust-lang/crates.io-index"
3527
+checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
3528
+dependencies = [
3529
+ "ppv-lite86",
3530
+ "rand_core 0.5.1",
3531
+]
3532
+
3533
+[[package]]
3534
+name = "rand_chacha"
3535
+version = "0.3.1"
3536
+source = "registry+https://github.com/rust-lang/crates.io-index"
3537
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
3538
+dependencies = [
3539
+ "ppv-lite86",
3540
+ "rand_core 0.6.4",
3541
+]
3542
+
3543
+[[package]]
3544
+name = "rand_chacha"
3545
+version = "0.9.0"
3546
+source = "registry+https://github.com/rust-lang/crates.io-index"
3547
+checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
3548
+dependencies = [
3549
+ "ppv-lite86",
3550
+ "rand_core 0.9.3",
3551
+]
3552
+
3553
+[[package]]
3554
+name = "rand_core"
3555
+version = "0.5.1"
3556
+source = "registry+https://github.com/rust-lang/crates.io-index"
3557
+checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
3558
+dependencies = [
3559
+ "getrandom 0.1.16",
3560
+]
3561
+
3562
+[[package]]
3563
+name = "rand_core"
3564
+version = "0.6.4"
3565
+source = "registry+https://github.com/rust-lang/crates.io-index"
3566
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
3567
+dependencies = [
3568
+ "getrandom 0.2.16",
3569
+]
3570
+
3571
+[[package]]
3572
+name = "rand_core"
3573
+version = "0.9.3"
3574
+source = "registry+https://github.com/rust-lang/crates.io-index"
3575
+checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
3576
+dependencies = [
3577
+ "getrandom 0.3.4",
3578
+]
3579
+
3580
+[[package]]
3581
+name = "rand_hc"
3582
+version = "0.2.0"
3583
+source = "registry+https://github.com/rust-lang/crates.io-index"
3584
+checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
3585
+dependencies = [
3586
+ "rand_core 0.5.1",
3587
+]
3588
+
3589
+[[package]]
3590
+name = "rand_pcg"
3591
+version = "0.2.1"
3592
+source = "registry+https://github.com/rust-lang/crates.io-index"
3593
+checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429"
3594
+dependencies = [
3595
+ "rand_core 0.5.1",
3596
+]
3597
+
3598
+[[package]]
3599
+name = "raw-window-handle"
3600
+version = "0.6.2"
3601
+source = "registry+https://github.com/rust-lang/crates.io-index"
3602
+checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539"
3603
+
3604
+[[package]]
3605
+name = "redox_syscall"
3606
+version = "0.5.18"
3607
+source = "registry+https://github.com/rust-lang/crates.io-index"
3608
+checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
3609
+dependencies = [
3610
+ "bitflags 2.10.0",
3611
+]
3612
+
3613
+[[package]]
3614
+name = "redox_users"
3615
+version = "0.5.2"
3616
+source = "registry+https://github.com/rust-lang/crates.io-index"
3617
+checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac"
3618
+dependencies = [
3619
+ "getrandom 0.2.16",
3620
+ "libredox",
3621
+ "thiserror 2.0.17",
3622
+]
3623
+
3624
+[[package]]
3625
+name = "ref-cast"
3626
+version = "1.0.25"
3627
+source = "registry+https://github.com/rust-lang/crates.io-index"
3628
+checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d"
3629
+dependencies = [
3630
+ "ref-cast-impl",
3631
+]
3632
+
3633
+[[package]]
3634
+name = "ref-cast-impl"
3635
+version = "1.0.25"
3636
+source = "registry+https://github.com/rust-lang/crates.io-index"
3637
+checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da"
3638
+dependencies = [
3639
+ "proc-macro2",
3640
+ "quote",
3641
+ "syn 2.0.111",
3642
+]
3643
+
3644
+[[package]]
3645
+name = "regex"
3646
+version = "1.12.2"
3647
+source = "registry+https://github.com/rust-lang/crates.io-index"
3648
+checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4"
3649
+dependencies = [
3650
+ "aho-corasick",
3651
+ "memchr",
3652
+ "regex-automata",
3653
+ "regex-syntax",
3654
+]
3655
+
3656
+[[package]]
3657
+name = "regex-automata"
3658
+version = "0.4.13"
3659
+source = "registry+https://github.com/rust-lang/crates.io-index"
3660
+checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c"
3661
+dependencies = [
3662
+ "aho-corasick",
3663
+ "memchr",
3664
+ "regex-syntax",
3665
+]
3666
+
3667
+[[package]]
3668
+name = "regex-syntax"
3669
+version = "0.8.8"
3670
+source = "registry+https://github.com/rust-lang/crates.io-index"
3671
+checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58"
3672
+
3673
+[[package]]
3674
+name = "rend"
3675
+version = "0.4.2"
3676
+source = "registry+https://github.com/rust-lang/crates.io-index"
3677
+checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c"
3678
+dependencies = [
3679
+ "bytecheck",
3680
+]
3681
+
3682
+[[package]]
3683
+name = "reqwest"
3684
+version = "0.12.24"
3685
+source = "registry+https://github.com/rust-lang/crates.io-index"
3686
+checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f"
3687
+dependencies = [
3688
+ "base64 0.22.1",
3689
+ "bytes",
3690
+ "encoding_rs",
3691
+ "futures-core",
3692
+ "futures-util",
3693
+ "h2",
3694
+ "http",
3695
+ "http-body",
3696
+ "http-body-util",
3697
+ "hyper",
3698
+ "hyper-rustls",
3699
+ "hyper-tls",
3700
+ "hyper-util",
3701
+ "js-sys",
3702
+ "log",
3703
+ "mime",
3704
+ "native-tls",
3705
+ "percent-encoding",
3706
+ "pin-project-lite",
3707
+ "quinn",
3708
+ "rustls",
3709
+ "rustls-native-certs",
3710
+ "rustls-pki-types",
3711
+ "serde",
3712
+ "serde_json",
3713
+ "serde_urlencoded",
3714
+ "sync_wrapper",
3715
+ "tokio",
3716
+ "tokio-native-tls",
3717
+ "tokio-rustls",
3718
+ "tokio-util",
3719
+ "tower",
3720
+ "tower-http",
3721
+ "tower-service",
3722
+ "url",
3723
+ "wasm-bindgen",
3724
+ "wasm-bindgen-futures",
3725
+ "wasm-streams",
3726
+ "web-sys",
3727
+]
3728
+
3729
+[[package]]
3730
+name = "ring"
3731
+version = "0.17.14"
3732
+source = "registry+https://github.com/rust-lang/crates.io-index"
3733
+checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
3734
+dependencies = [
3735
+ "cc",
3736
+ "cfg-if",
3737
+ "getrandom 0.2.16",
3738
+ "libc",
3739
+ "untrusted",
3740
+ "windows-sys 0.52.0",
3741
+]
3742
+
3743
+[[package]]
3744
+name = "rkyv"
3745
+version = "0.7.45"
3746
+source = "registry+https://github.com/rust-lang/crates.io-index"
3747
+checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b"
3748
+dependencies = [
3749
+ "bitvec",
3750
+ "bytecheck",
3751
+ "bytes",
3752
+ "hashbrown 0.12.3",
3753
+ "ptr_meta",
3754
+ "rend",
3755
+ "rkyv_derive",
3756
+ "seahash",
3757
+ "tinyvec",
3758
+ "uuid",
3759
+]
3760
+
3761
+[[package]]
3762
+name = "rkyv_derive"
3763
+version = "0.7.45"
3764
+source = "registry+https://github.com/rust-lang/crates.io-index"
3765
+checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0"
3766
+dependencies = [
3767
+ "proc-macro2",
3768
+ "quote",
3769
+ "syn 1.0.109",
3770
+]
3771
+
3772
+[[package]]
3773
+name = "rust_decimal"
3774
+version = "1.39.0"
3775
+source = "registry+https://github.com/rust-lang/crates.io-index"
3776
+checksum = "35affe401787a9bd846712274d97654355d21b2a2c092a3139aabe31e9022282"
3777
+dependencies = [
3778
+ "arrayvec",
3779
+ "borsh",
3780
+ "bytes",
3781
+ "num-traits",
3782
+ "rand 0.8.5",
3783
+ "rkyv",
3784
+ "serde",
3785
+ "serde_json",
3786
+]
3787
+
3788
+[[package]]
3789
+name = "rustc-hash"
3790
+version = "2.1.1"
3791
+source = "registry+https://github.com/rust-lang/crates.io-index"
3792
+checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d"
3793
+
3794
+[[package]]
3795
+name = "rustc_version"
3796
+version = "0.4.1"
3797
+source = "registry+https://github.com/rust-lang/crates.io-index"
3798
+checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
3799
+dependencies = [
3800
+ "semver",
3801
+]
3802
+
3803
+[[package]]
3804
+name = "rustix"
3805
+version = "1.1.2"
3806
+source = "registry+https://github.com/rust-lang/crates.io-index"
3807
+checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e"
3808
+dependencies = [
3809
+ "bitflags 2.10.0",
3810
+ "errno",
3811
+ "libc",
3812
+ "linux-raw-sys",
3813
+ "windows-sys 0.61.2",
3814
+]
3815
+
3816
+[[package]]
3817
+name = "rustls"
3818
+version = "0.23.35"
3819
+source = "registry+https://github.com/rust-lang/crates.io-index"
3820
+checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f"
3821
+dependencies = [
3822
+ "once_cell",
3823
+ "ring",
3824
+ "rustls-pki-types",
3825
+ "rustls-webpki",
3826
+ "subtle",
3827
+ "zeroize",
3828
+]
3829
+
3830
+[[package]]
3831
+name = "rustls-native-certs"
3832
+version = "0.8.2"
3833
+source = "registry+https://github.com/rust-lang/crates.io-index"
3834
+checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923"
3835
+dependencies = [
3836
+ "openssl-probe",
3837
+ "rustls-pki-types",
3838
+ "schannel",
3839
+ "security-framework 3.5.1",
3840
+]
3841
+
3842
+[[package]]
3843
+name = "rustls-pki-types"
3844
+version = "1.13.0"
3845
+source = "registry+https://github.com/rust-lang/crates.io-index"
3846
+checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a"
3847
+dependencies = [
3848
+ "web-time",
3849
+ "zeroize",
3850
+]
3851
+
3852
+[[package]]
3853
+name = "rustls-webpki"
3854
+version = "0.103.8"
3855
+source = "registry+https://github.com/rust-lang/crates.io-index"
3856
+checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52"
3857
+dependencies = [
3858
+ "ring",
3859
+ "rustls-pki-types",
3860
+ "untrusted",
3861
+]
3862
+
3863
+[[package]]
3864
+name = "rustversion"
3865
+version = "1.0.22"
3866
+source = "registry+https://github.com/rust-lang/crates.io-index"
3867
+checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
3868
+
3869
+[[package]]
3870
+name = "ryu"
3871
+version = "1.0.20"
3872
+source = "registry+https://github.com/rust-lang/crates.io-index"
3873
+checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
3874
+
3875
+[[package]]
3876
+name = "same-file"
3877
+version = "1.0.6"
3878
+source = "registry+https://github.com/rust-lang/crates.io-index"
3879
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
3880
+dependencies = [
3881
+ "winapi-util",
3882
+]
3883
+
3884
+[[package]]
3885
+name = "schannel"
3886
+version = "0.1.28"
3887
+source = "registry+https://github.com/rust-lang/crates.io-index"
3888
+checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1"
3889
+dependencies = [
3890
+ "windows-sys 0.61.2",
3891
+]
3892
+
3893
+[[package]]
3894
+name = "schemars"
3895
+version = "0.8.22"
3896
+source = "registry+https://github.com/rust-lang/crates.io-index"
3897
+checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615"
3898
+dependencies = [
3899
+ "dyn-clone",
3900
+ "indexmap 1.9.3",
3901
+ "schemars_derive",
3902
+ "serde",
3903
+ "serde_json",
3904
+ "url",
3905
+ "uuid",
3906
+]
3907
+
3908
+[[package]]
3909
+name = "schemars"
3910
+version = "0.9.0"
3911
+source = "registry+https://github.com/rust-lang/crates.io-index"
3912
+checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f"
3913
+dependencies = [
3914
+ "dyn-clone",
3915
+ "ref-cast",
3916
+ "serde",
3917
+ "serde_json",
3918
+]
3919
+
3920
+[[package]]
3921
+name = "schemars"
3922
+version = "1.1.0"
3923
+source = "registry+https://github.com/rust-lang/crates.io-index"
3924
+checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289"
3925
+dependencies = [
3926
+ "dyn-clone",
3927
+ "ref-cast",
3928
+ "serde",
3929
+ "serde_json",
3930
+]
3931
+
3932
+[[package]]
3933
+name = "schemars_derive"
3934
+version = "0.8.22"
3935
+source = "registry+https://github.com/rust-lang/crates.io-index"
3936
+checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d"
3937
+dependencies = [
3938
+ "proc-macro2",
3939
+ "quote",
3940
+ "serde_derive_internals",
3941
+ "syn 2.0.111",
3942
+]
3943
+
3944
+[[package]]
3945
+name = "scoped-tls"
3946
+version = "1.0.1"
3947
+source = "registry+https://github.com/rust-lang/crates.io-index"
3948
+checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
3949
+
3950
+[[package]]
3951
+name = "scopeguard"
3952
+version = "1.2.0"
3953
+source = "registry+https://github.com/rust-lang/crates.io-index"
3954
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
3955
+
3956
+[[package]]
3957
+name = "seahash"
3958
+version = "4.1.0"
3959
+source = "registry+https://github.com/rust-lang/crates.io-index"
3960
+checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b"
3961
+
3962
+[[package]]
3963
+name = "security-framework"
3964
+version = "2.11.1"
3965
+source = "registry+https://github.com/rust-lang/crates.io-index"
3966
+checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
3967
+dependencies = [
3968
+ "bitflags 2.10.0",
3969
+ "core-foundation 0.9.4",
3970
+ "core-foundation-sys",
3971
+ "libc",
3972
+ "security-framework-sys",
3973
+]
3974
+
3975
+[[package]]
3976
+name = "security-framework"
3977
+version = "3.5.1"
3978
+source = "registry+https://github.com/rust-lang/crates.io-index"
3979
+checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef"
3980
+dependencies = [
3981
+ "bitflags 2.10.0",
3982
+ "core-foundation 0.10.1",
3983
+ "core-foundation-sys",
3984
+ "libc",
3985
+ "security-framework-sys",
3986
+]
3987
+
3988
+[[package]]
3989
+name = "security-framework-sys"
3990
+version = "2.15.0"
3991
+source = "registry+https://github.com/rust-lang/crates.io-index"
3992
+checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0"
3993
+dependencies = [
3994
+ "core-foundation-sys",
3995
+ "libc",
3996
+]
3997
+
3998
+[[package]]
3999
+name = "selectors"
4000
+version = "0.24.0"
4001
+source = "registry+https://github.com/rust-lang/crates.io-index"
4002
+checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416"
4003
+dependencies = [
4004
+ "bitflags 1.3.2",
4005
+ "cssparser",
4006
+ "derive_more",
4007
+ "fxhash",
4008
+ "log",
4009
+ "phf 0.8.0",
4010
+ "phf_codegen 0.8.0",
4011
+ "precomputed-hash",
4012
+ "servo_arc",
4013
+ "smallvec",
4014
+]
4015
+
4016
+[[package]]
4017
+name = "semver"
4018
+version = "1.0.27"
4019
+source = "registry+https://github.com/rust-lang/crates.io-index"
4020
+checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2"
4021
+dependencies = [
4022
+ "serde",
4023
+ "serde_core",
4024
+]
4025
+
4026
+[[package]]
4027
+name = "serde"
4028
+version = "1.0.228"
4029
+source = "registry+https://github.com/rust-lang/crates.io-index"
4030
+checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
4031
+dependencies = [
4032
+ "serde_core",
4033
+ "serde_derive",
4034
+]
4035
+
4036
+[[package]]
4037
+name = "serde-untagged"
4038
+version = "0.1.9"
4039
+source = "registry+https://github.com/rust-lang/crates.io-index"
4040
+checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058"
4041
+dependencies = [
4042
+ "erased-serde",
4043
+ "serde",
4044
+ "serde_core",
4045
+ "typeid",
4046
+]
4047
+
4048
+[[package]]
4049
+name = "serde_core"
4050
+version = "1.0.228"
4051
+source = "registry+https://github.com/rust-lang/crates.io-index"
4052
+checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
4053
+dependencies = [
4054
+ "serde_derive",
4055
+]
4056
+
4057
+[[package]]
4058
+name = "serde_derive"
4059
+version = "1.0.228"
4060
+source = "registry+https://github.com/rust-lang/crates.io-index"
4061
+checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
4062
+dependencies = [
4063
+ "proc-macro2",
4064
+ "quote",
4065
+ "syn 2.0.111",
4066
+]
4067
+
4068
+[[package]]
4069
+name = "serde_derive_internals"
4070
+version = "0.29.1"
4071
+source = "registry+https://github.com/rust-lang/crates.io-index"
4072
+checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
4073
+dependencies = [
4074
+ "proc-macro2",
4075
+ "quote",
4076
+ "syn 2.0.111",
4077
+]
4078
+
4079
+[[package]]
4080
+name = "serde_json"
4081
+version = "1.0.145"
4082
+source = "registry+https://github.com/rust-lang/crates.io-index"
4083
+checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c"
4084
+dependencies = [
4085
+ "itoa",
4086
+ "memchr",
4087
+ "ryu",
4088
+ "serde",
4089
+ "serde_core",
4090
+]
4091
+
4092
+[[package]]
4093
+name = "serde_qs"
4094
+version = "0.15.0"
4095
+source = "registry+https://github.com/rust-lang/crates.io-index"
4096
+checksum = "f3faaf9e727533a19351a43cc5a8de957372163c7d35cc48c90b75cdda13c352"
4097
+dependencies = [
4098
+ "percent-encoding",
4099
+ "serde",
4100
+ "thiserror 2.0.17",
4101
+]
4102
+
4103
+[[package]]
4104
+name = "serde_repr"
4105
+version = "0.1.20"
4106
+source = "registry+https://github.com/rust-lang/crates.io-index"
4107
+checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c"
4108
+dependencies = [
4109
+ "proc-macro2",
4110
+ "quote",
4111
+ "syn 2.0.111",
4112
+]
4113
+
4114
+[[package]]
4115
+name = "serde_spanned"
4116
+version = "0.6.9"
4117
+source = "registry+https://github.com/rust-lang/crates.io-index"
4118
+checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3"
4119
+dependencies = [
4120
+ "serde",
4121
+]
4122
+
4123
+[[package]]
4124
+name = "serde_spanned"
4125
+version = "1.0.3"
4126
+source = "registry+https://github.com/rust-lang/crates.io-index"
4127
+checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392"
4128
+dependencies = [
4129
+ "serde_core",
4130
+]
4131
+
4132
+[[package]]
4133
+name = "serde_urlencoded"
4134
+version = "0.7.1"
4135
+source = "registry+https://github.com/rust-lang/crates.io-index"
4136
+checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
4137
+dependencies = [
4138
+ "form_urlencoded",
4139
+ "itoa",
4140
+ "ryu",
4141
+ "serde",
4142
+]
4143
+
4144
+[[package]]
4145
+name = "serde_with"
4146
+version = "3.16.0"
4147
+source = "registry+https://github.com/rust-lang/crates.io-index"
4148
+checksum = "10574371d41b0d9b2cff89418eda27da52bcaff2cc8741db26382a77c29131f1"
4149
+dependencies = [
4150
+ "base64 0.22.1",
4151
+ "chrono",
4152
+ "hex",
4153
+ "indexmap 1.9.3",
4154
+ "indexmap 2.12.1",
4155
+ "schemars 0.9.0",
4156
+ "schemars 1.1.0",
4157
+ "serde_core",
4158
+ "serde_json",
4159
+ "serde_with_macros",
4160
+ "time",
4161
+]
4162
+
4163
+[[package]]
4164
+name = "serde_with_macros"
4165
+version = "3.16.0"
4166
+source = "registry+https://github.com/rust-lang/crates.io-index"
4167
+checksum = "08a72d8216842fdd57820dc78d840bef99248e35fb2554ff923319e60f2d686b"
4168
+dependencies = [
4169
+ "darling",
4170
+ "proc-macro2",
4171
+ "quote",
4172
+ "syn 2.0.111",
4173
+]
4174
+
4175
+[[package]]
4176
+name = "serialize-to-javascript"
4177
+version = "0.1.2"
4178
+source = "registry+https://github.com/rust-lang/crates.io-index"
4179
+checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5"
4180
+dependencies = [
4181
+ "serde",
4182
+ "serde_json",
4183
+ "serialize-to-javascript-impl",
4184
+]
4185
+
4186
+[[package]]
4187
+name = "serialize-to-javascript-impl"
4188
+version = "0.1.2"
4189
+source = "registry+https://github.com/rust-lang/crates.io-index"
4190
+checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d"
4191
+dependencies = [
4192
+ "proc-macro2",
4193
+ "quote",
4194
+ "syn 2.0.111",
4195
+]
4196
+
4197
+[[package]]
4198
+name = "servo_arc"
4199
+version = "0.2.0"
4200
+source = "registry+https://github.com/rust-lang/crates.io-index"
4201
+checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741"
4202
+dependencies = [
4203
+ "nodrop",
4204
+ "stable_deref_trait",
4205
+]
4206
+
4207
+[[package]]
4208
+name = "sha2"
4209
+version = "0.10.9"
4210
+source = "registry+https://github.com/rust-lang/crates.io-index"
4211
+checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
4212
+dependencies = [
4213
+ "cfg-if",
4214
+ "cpufeatures",
4215
+ "digest",
4216
+]
4217
+
4218
+[[package]]
4219
+name = "sharded-slab"
4220
+version = "0.1.7"
4221
+source = "registry+https://github.com/rust-lang/crates.io-index"
4222
+checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
4223
+dependencies = [
4224
+ "lazy_static",
4225
+]
4226
+
4227
+[[package]]
4228
+name = "shlex"
4229
+version = "1.3.0"
4230
+source = "registry+https://github.com/rust-lang/crates.io-index"
4231
+checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
4232
+
4233
+[[package]]
4234
+name = "signal-hook-registry"
4235
+version = "1.4.7"
4236
+source = "registry+https://github.com/rust-lang/crates.io-index"
4237
+checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad"
4238
+dependencies = [
4239
+ "libc",
4240
+]
4241
+
4242
+[[package]]
4243
+name = "simd-adler32"
4244
+version = "0.3.7"
4245
+source = "registry+https://github.com/rust-lang/crates.io-index"
4246
+checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
4247
+
4248
+[[package]]
4249
+name = "simdutf8"
4250
+version = "0.1.5"
4251
+source = "registry+https://github.com/rust-lang/crates.io-index"
4252
+checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e"
4253
+
4254
+[[package]]
4255
+name = "siphasher"
4256
+version = "0.3.11"
4257
+source = "registry+https://github.com/rust-lang/crates.io-index"
4258
+checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
4259
+
4260
+[[package]]
4261
+name = "siphasher"
4262
+version = "1.0.1"
4263
+source = "registry+https://github.com/rust-lang/crates.io-index"
4264
+checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d"
4265
+
4266
+[[package]]
4267
+name = "slab"
4268
+version = "0.4.11"
4269
+source = "registry+https://github.com/rust-lang/crates.io-index"
4270
+checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589"
4271
+
4272
+[[package]]
4273
+name = "smallvec"
4274
+version = "1.15.1"
4275
+source = "registry+https://github.com/rust-lang/crates.io-index"
4276
+checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
4277
+
4278
+[[package]]
4279
+name = "smbcloud-model"
4280
+version = "0.3.27"
4281
+source = "registry+https://github.com/rust-lang/crates.io-index"
4282
+checksum = "07424d137f71bce21d12838b38c519d856bcb18ae6bf63390cfee5dfa544cee3"
4283
+dependencies = [
4284
+ "chrono",
4285
+ "log",
4286
+ "serde",
4287
+ "serde_json",
4288
+ "serde_repr",
4289
+ "spinners",
4290
+ "strum 0.27.2",
4291
+ "strum_macros 0.27.2",
4292
+ "thiserror 2.0.17",
4293
+ "tsync",
4294
+]
4295
+
4296
+[[package]]
4297
+name = "smbcloud-network"
4298
+version = "0.3.27"
4299
+source = "registry+https://github.com/rust-lang/crates.io-index"
4300
+checksum = "870654b8b3864b8bbc5293ab209d8de661ec50309aca4ff93792ddbe50d312ae"
4301
+dependencies = [
4302
+ "clap 4.5.53",
4303
+ "log",
4304
+ "reqwest",
4305
+ "serde",
4306
+ "serde_json",
4307
+ "smbcloud-model",
4308
+ "wasm-bindgen",
4309
+]
4310
+
4311
+[[package]]
4312
+name = "smbcloud-networking"
4313
+version = "0.3.27"
4314
+source = "registry+https://github.com/rust-lang/crates.io-index"
4315
+checksum = "f426f0956ad1689d43cb22292adaddcb5cd6911439df77bb6796ffdc7f074475"
4316
+dependencies = [
4317
+ "smbcloud-network",
4318
+ "url-builder",
4319
+]
4320
+
4321
+[[package]]
4322
+name = "smbcloud-networking-account"
4323
+version = "0.3.27"
4324
+source = "registry+https://github.com/rust-lang/crates.io-index"
4325
+checksum = "27d6919be5a0530db29c8c209354a83866e8512fbe8a3f75684add14c9c9eac7"
4326
+dependencies = [
4327
+ "log",
4328
+ "openssl",
4329
+ "reqwest",
4330
+ "serde_json",
4331
+ "smbcloud-model",
4332
+ "smbcloud-network",
4333
+ "smbcloud-networking",
4334
+]
4335
+
4336
+[[package]]
4337
+name = "snac"
4338
+version = "1.0.0"
4339
+dependencies = [
4340
+ "dotenv_codegen",
4341
+ "serde",
4342
+ "serde_json",
4343
+ "serde_qs",
4344
+ "smbcloud-model",
4345
+ "smbcloud-networking-account",
4346
+ "tauri",
4347
+ "tauri-build",
4348
+ "tauri-plugin-admob",
4349
+ "tauri-plugin-haptics",
4350
+ "tauri-plugin-log",
4351
+ "tauri-plugin-oauth",
4352
+ "tauri-plugin-opener",
4353
+ "tauri-plugin-os",
4354
+ "tauri-plugin-store",
4355
+ "tsync",
4356
+]
4357
+
4358
+[[package]]
4359
+name = "socket2"
4360
+version = "0.6.1"
4361
+source = "registry+https://github.com/rust-lang/crates.io-index"
4362
+checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881"
4363
+dependencies = [
4364
+ "libc",
4365
+ "windows-sys 0.60.2",
4366
+]
4367
+
4368
+[[package]]
4369
+name = "softbuffer"
4370
+version = "0.4.6"
4371
+source = "registry+https://github.com/rust-lang/crates.io-index"
4372
+checksum = "18051cdd562e792cad055119e0cdb2cfc137e44e3987532e0f9659a77931bb08"
4373
+dependencies = [
4374
+ "bytemuck",
4375
+ "cfg_aliases",
4376
+ "core-graphics",
4377
+ "foreign-types 0.5.0",
4378
+ "js-sys",
4379
+ "log",
4380
+ "objc2 0.5.2",
4381
+ "objc2-foundation 0.2.2",
4382
+ "objc2-quartz-core 0.2.2",
4383
+ "raw-window-handle",
4384
+ "redox_syscall",
4385
+ "wasm-bindgen",
4386
+ "web-sys",
4387
+ "windows-sys 0.59.0",
4388
+]
4389
+
4390
+[[package]]
4391
+name = "soup3"
4392
+version = "0.5.0"
4393
+source = "registry+https://github.com/rust-lang/crates.io-index"
4394
+checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f"
4395
+dependencies = [
4396
+ "futures-channel",
4397
+ "gio",
4398
+ "glib",
4399
+ "libc",
4400
+ "soup3-sys",
4401
+]
4402
+
4403
+[[package]]
4404
+name = "soup3-sys"
4405
+version = "0.5.0"
4406
+source = "registry+https://github.com/rust-lang/crates.io-index"
4407
+checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27"
4408
+dependencies = [
4409
+ "gio-sys",
4410
+ "glib-sys",
4411
+ "gobject-sys",
4412
+ "libc",
4413
+ "system-deps",
4414
+]
4415
+
4416
+[[package]]
4417
+name = "spinners"
4418
+version = "4.1.1"
4419
+source = "registry+https://github.com/rust-lang/crates.io-index"
4420
+checksum = "a0ef947f358b9c238923f764c72a4a9d42f2d637c46e059dbd319d6e7cfb4f82"
4421
+dependencies = [
4422
+ "lazy_static",
4423
+ "maplit",
4424
+ "strum 0.24.1",
4425
+]
4426
+
4427
+[[package]]
4428
+name = "stable_deref_trait"
4429
+version = "1.2.1"
4430
+source = "registry+https://github.com/rust-lang/crates.io-index"
4431
+checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
4432
+
4433
+[[package]]
4434
+name = "state"
4435
+version = "0.6.0"
4436
+source = "registry+https://github.com/rust-lang/crates.io-index"
4437
+checksum = "2b8c4a4445d81357df8b1a650d0d0d6fbbbfe99d064aa5e02f3e4022061476d8"
4438
+dependencies = [
4439
+ "loom",
4440
+]
4441
+
4442
+[[package]]
4443
+name = "static_assertions"
4444
+version = "1.1.0"
4445
+source = "registry+https://github.com/rust-lang/crates.io-index"
4446
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
4447
+
4448
+[[package]]
4449
+name = "string_cache"
4450
+version = "0.8.9"
4451
+source = "registry+https://github.com/rust-lang/crates.io-index"
4452
+checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f"
4453
+dependencies = [
4454
+ "new_debug_unreachable",
4455
+ "parking_lot",
4456
+ "phf_shared 0.11.3",
4457
+ "precomputed-hash",
4458
+ "serde",
4459
+]
4460
+
4461
+[[package]]
4462
+name = "string_cache_codegen"
4463
+version = "0.5.4"
4464
+source = "registry+https://github.com/rust-lang/crates.io-index"
4465
+checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0"
4466
+dependencies = [
4467
+ "phf_generator 0.11.3",
4468
+ "phf_shared 0.11.3",
4469
+ "proc-macro2",
4470
+ "quote",
4471
+]
4472
+
4473
+[[package]]
4474
+name = "strsim"
4475
+version = "0.8.0"
4476
+source = "registry+https://github.com/rust-lang/crates.io-index"
4477
+checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
4478
+
4479
+[[package]]
4480
+name = "strsim"
4481
+version = "0.11.1"
4482
+source = "registry+https://github.com/rust-lang/crates.io-index"
4483
+checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
4484
+
4485
+[[package]]
4486
+name = "structopt"
4487
+version = "0.3.26"
4488
+source = "registry+https://github.com/rust-lang/crates.io-index"
4489
+checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10"
4490
+dependencies = [
4491
+ "clap 2.34.0",
4492
+ "lazy_static",
4493
+ "structopt-derive",
4494
+]
4495
+
4496
+[[package]]
4497
+name = "structopt-derive"
4498
+version = "0.4.18"
4499
+source = "registry+https://github.com/rust-lang/crates.io-index"
4500
+checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0"
4501
+dependencies = [
4502
+ "heck 0.3.3",
4503
+ "proc-macro-error",
4504
+ "proc-macro2",
4505
+ "quote",
4506
+ "syn 1.0.109",
4507
+]
4508
+
4509
+[[package]]
4510
+name = "strum"
4511
+version = "0.24.1"
4512
+source = "registry+https://github.com/rust-lang/crates.io-index"
4513
+checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f"
4514
+dependencies = [
4515
+ "strum_macros 0.24.3",
4516
+]
4517
+
4518
+[[package]]
4519
+name = "strum"
4520
+version = "0.27.2"
4521
+source = "registry+https://github.com/rust-lang/crates.io-index"
4522
+checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf"
4523
+
4524
+[[package]]
4525
+name = "strum_macros"
4526
+version = "0.24.3"
4527
+source = "registry+https://github.com/rust-lang/crates.io-index"
4528
+checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59"
4529
+dependencies = [
4530
+ "heck 0.4.1",
4531
+ "proc-macro2",
4532
+ "quote",
4533
+ "rustversion",
4534
+ "syn 1.0.109",
4535
+]
4536
+
4537
+[[package]]
4538
+name = "strum_macros"
4539
+version = "0.27.2"
4540
+source = "registry+https://github.com/rust-lang/crates.io-index"
4541
+checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7"
4542
+dependencies = [
4543
+ "heck 0.5.0",
4544
+ "proc-macro2",
4545
+ "quote",
4546
+ "syn 2.0.111",
4547
+]
4548
+
4549
+[[package]]
4550
+name = "subtle"
4551
+version = "2.6.1"
4552
+source = "registry+https://github.com/rust-lang/crates.io-index"
4553
+checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
4554
+
4555
+[[package]]
4556
+name = "swift-rs"
4557
+version = "1.0.7"
4558
+source = "registry+https://github.com/rust-lang/crates.io-index"
4559
+checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7"
4560
+dependencies = [
4561
+ "base64 0.21.7",
4562
+ "serde",
4563
+ "serde_json",
4564
+]
4565
+
4566
+[[package]]
4567
+name = "syn"
4568
+version = "1.0.109"
4569
+source = "registry+https://github.com/rust-lang/crates.io-index"
4570
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
4571
+dependencies = [
4572
+ "proc-macro2",
4573
+ "quote",
4574
+ "unicode-ident",
4575
+]
4576
+
4577
+[[package]]
4578
+name = "syn"
4579
+version = "2.0.111"
4580
+source = "registry+https://github.com/rust-lang/crates.io-index"
4581
+checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87"
4582
+dependencies = [
4583
+ "proc-macro2",
4584
+ "quote",
4585
+ "unicode-ident",
4586
+]
4587
+
4588
+[[package]]
4589
+name = "sync_wrapper"
4590
+version = "1.0.2"
4591
+source = "registry+https://github.com/rust-lang/crates.io-index"
4592
+checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
4593
+dependencies = [
4594
+ "futures-core",
4595
+]
4596
+
4597
+[[package]]
4598
+name = "synstructure"
4599
+version = "0.13.2"
4600
+source = "registry+https://github.com/rust-lang/crates.io-index"
4601
+checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
4602
+dependencies = [
4603
+ "proc-macro2",
4604
+ "quote",
4605
+ "syn 2.0.111",
4606
+]
4607
+
4608
+[[package]]
4609
+name = "sys-locale"
4610
+version = "0.3.2"
4611
+source = "registry+https://github.com/rust-lang/crates.io-index"
4612
+checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4"
4613
+dependencies = [
4614
+ "libc",
4615
+]
4616
+
4617
+[[package]]
4618
+name = "system-configuration"
4619
+version = "0.6.1"
4620
+source = "registry+https://github.com/rust-lang/crates.io-index"
4621
+checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b"
4622
+dependencies = [
4623
+ "bitflags 2.10.0",
4624
+ "core-foundation 0.9.4",
4625
+ "system-configuration-sys",
4626
+]
4627
+
4628
+[[package]]
4629
+name = "system-configuration-sys"
4630
+version = "0.6.0"
4631
+source = "registry+https://github.com/rust-lang/crates.io-index"
4632
+checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4"
4633
+dependencies = [
4634
+ "core-foundation-sys",
4635
+ "libc",
4636
+]
4637
+
4638
+[[package]]
4639
+name = "system-deps"
4640
+version = "6.2.2"
4641
+source = "registry+https://github.com/rust-lang/crates.io-index"
4642
+checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349"
4643
+dependencies = [
4644
+ "cfg-expr",
4645
+ "heck 0.5.0",
4646
+ "pkg-config",
4647
+ "toml 0.8.2",
4648
+ "version-compare",
4649
+]
4650
+
4651
+[[package]]
4652
+name = "tao"
4653
+version = "0.34.5"
4654
+source = "registry+https://github.com/rust-lang/crates.io-index"
4655
+checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7"
4656
+dependencies = [
4657
+ "bitflags 2.10.0",
4658
+ "block2 0.6.2",
4659
+ "core-foundation 0.10.1",
4660
+ "core-graphics",
4661
+ "crossbeam-channel",
4662
+ "dispatch",
4663
+ "dlopen2",
4664
+ "dpi",
4665
+ "gdkwayland-sys",
4666
+ "gdkx11-sys",
4667
+ "gtk",
4668
+ "jni",
4669
+ "lazy_static",
4670
+ "libc",
4671
+ "log",
4672
+ "ndk",
4673
+ "ndk-context",
4674
+ "ndk-sys",
4675
+ "objc2 0.6.3",
4676
+ "objc2-app-kit",
4677
+ "objc2-foundation 0.3.2",
4678
+ "once_cell",
4679
+ "parking_lot",
4680
+ "raw-window-handle",
4681
+ "scopeguard",
4682
+ "tao-macros",
4683
+ "unicode-segmentation",
4684
+ "url",
4685
+ "windows 0.61.3",
4686
+ "windows-core 0.61.2",
4687
+ "windows-version",
4688
+ "x11-dl",
4689
+]
4690
+
4691
+[[package]]
4692
+name = "tao-macros"
4693
+version = "0.1.3"
4694
+source = "registry+https://github.com/rust-lang/crates.io-index"
4695
+checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd"
4696
+dependencies = [
4697
+ "proc-macro2",
4698
+ "quote",
4699
+ "syn 2.0.111",
4700
+]
4701
+
4702
+[[package]]
4703
+name = "tap"
4704
+version = "1.0.1"
4705
+source = "registry+https://github.com/rust-lang/crates.io-index"
4706
+checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
4707
+
4708
+[[package]]
4709
+name = "target-lexicon"
4710
+version = "0.12.16"
4711
+source = "registry+https://github.com/rust-lang/crates.io-index"
4712
+checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
4713
+
4714
+[[package]]
4715
+name = "tauri"
4716
+version = "2.9.3"
4717
+source = "registry+https://github.com/rust-lang/crates.io-index"
4718
+checksum = "9e492485dd390b35f7497401f67694f46161a2a00ffd800938d5dd3c898fb9d8"
4719
+dependencies = [
4720
+ "anyhow",
4721
+ "bytes",
4722
+ "cookie",
4723
+ "dirs",
4724
+ "dunce",
4725
+ "embed_plist",
4726
+ "getrandom 0.3.4",
4727
+ "glob",
4728
+ "gtk",
4729
+ "heck 0.5.0",
4730
+ "http",
4731
+ "jni",
4732
+ "libc",
4733
+ "log",
4734
+ "mime",
4735
+ "muda",
4736
+ "objc2 0.6.3",
4737
+ "objc2-app-kit",
4738
+ "objc2-foundation 0.3.2",
4739
+ "objc2-ui-kit",
4740
+ "objc2-web-kit",
4741
+ "percent-encoding",
4742
+ "plist",
4743
+ "raw-window-handle",
4744
+ "reqwest",
4745
+ "serde",
4746
+ "serde_json",
4747
+ "serde_repr",
4748
+ "serialize-to-javascript",
4749
+ "swift-rs",
4750
+ "tauri-build",
4751
+ "tauri-macros",
4752
+ "tauri-runtime",
4753
+ "tauri-runtime-wry",
4754
+ "tauri-utils",
4755
+ "thiserror 2.0.17",
4756
+ "tokio",
4757
+ "tray-icon",
4758
+ "url",
4759
+ "webkit2gtk",
4760
+ "webview2-com",
4761
+ "window-vibrancy",
4762
+ "windows 0.61.3",
4763
+]
4764
+
4765
+[[package]]
4766
+name = "tauri-build"
4767
+version = "2.5.2"
4768
+source = "registry+https://github.com/rust-lang/crates.io-index"
4769
+checksum = "87d6f8cafe6a75514ce5333f115b7b1866e8e68d9672bf4ca89fc0f35697ea9d"
4770
+dependencies = [
4771
+ "anyhow",
4772
+ "cargo_toml",
4773
+ "dirs",
4774
+ "glob",
4775
+ "heck 0.5.0",
4776
+ "json-patch",
4777
+ "schemars 0.8.22",
4778
+ "semver",
4779
+ "serde",
4780
+ "serde_json",
4781
+ "tauri-utils",
4782
+ "tauri-winres",
4783
+ "toml 0.9.8",
4784
+ "walkdir",
4785
+]
4786
+
4787
+[[package]]
4788
+name = "tauri-codegen"
4789
+version = "2.5.1"
4790
+source = "registry+https://github.com/rust-lang/crates.io-index"
4791
+checksum = "b7ef707148f0755110ca54377560ab891d722de4d53297595380a748026f139f"
4792
+dependencies = [
4793
+ "base64 0.22.1",
4794
+ "brotli",
4795
+ "ico",
4796
+ "json-patch",
4797
+ "plist",
4798
+ "png",
4799
+ "proc-macro2",
4800
+ "quote",
4801
+ "semver",
4802
+ "serde",
4803
+ "serde_json",
4804
+ "sha2",
4805
+ "syn 2.0.111",
4806
+ "tauri-utils",
4807
+ "thiserror 2.0.17",
4808
+ "time",
4809
+ "url",
4810
+ "uuid",
4811
+ "walkdir",
4812
+]
4813
+
4814
+[[package]]
4815
+name = "tauri-macros"
4816
+version = "2.5.1"
4817
+source = "registry+https://github.com/rust-lang/crates.io-index"
4818
+checksum = "71664fd715ee6e382c05345ad258d6d1d50f90cf1b58c0aa726638b33c2a075d"
4819
+dependencies = [
4820
+ "heck 0.5.0",
4821
+ "proc-macro2",
4822
+ "quote",
4823
+ "syn 2.0.111",
4824
+ "tauri-codegen",
4825
+ "tauri-utils",
4826
+]
4827
+
4828
+[[package]]
4829
+name = "tauri-plugin"
4830
+version = "2.5.1"
4831
+source = "registry+https://github.com/rust-lang/crates.io-index"
4832
+checksum = "076c78a474a7247c90cad0b6e87e593c4c620ed4efdb79cbe0214f0021f6c39d"
4833
+dependencies = [
4834
+ "anyhow",
4835
+ "glob",
4836
+ "plist",
4837
+ "schemars 0.8.22",
4838
+ "serde",
4839
+ "serde_json",
4840
+ "tauri-utils",
4841
+ "toml 0.9.8",
4842
+ "walkdir",
4843
+]
4844
+
4845
+[[package]]
4846
+name = "tauri-plugin-admob"
4847
+version = "0.0.4"
4848
+source = "git+https://github.com/setoelkahfi/tauri-plugin-admob.git?branch=feature%2Fandroid-update-deps#f254a049b6f2b1d351c8765994d3cc78c56ccacf"
4849
+dependencies = [
4850
+ "serde",
4851
+ "tauri",
4852
+ "tauri-plugin",
4853
+ "thiserror 2.0.17",
4854
+]
4855
+
4856
+[[package]]
4857
+name = "tauri-plugin-haptics"
4858
+version = "2.3.2"
4859
+source = "registry+https://github.com/rust-lang/crates.io-index"
4860
+checksum = "01b167d598ada05c599f4460595108c8d1aa636030a97d19796c1bcda97d881d"
4861
+dependencies = [
4862
+ "log",
4863
+ "serde",
4864
+ "serde_json",
4865
+ "tauri",
4866
+ "tauri-plugin",
4867
+ "thiserror 2.0.17",
4868
+]
4869
+
4870
+[[package]]
4871
+name = "tauri-plugin-log"
4872
+version = "2.7.1"
4873
+source = "registry+https://github.com/rust-lang/crates.io-index"
4874
+checksum = "d5709c792b8630290b5d9811a1f8fe983dd925fc87c7fc7f4923616458cd00b6"
4875
+dependencies = [
4876
+ "android_logger",
4877
+ "byte-unit",
4878
+ "fern",
4879
+ "log",
4880
+ "objc2 0.6.3",
4881
+ "objc2-foundation 0.3.2",
4882
+ "serde",
4883
+ "serde_json",
4884
+ "serde_repr",
4885
+ "swift-rs",
4886
+ "tauri",
4887
+ "tauri-plugin",
4888
+ "thiserror 2.0.17",
4889
+ "time",
4890
+]
4891
+
4892
+[[package]]
4893
+name = "tauri-plugin-oauth"
4894
+version = "2.0.0"
4895
+source = "registry+https://github.com/rust-lang/crates.io-index"
4896
+checksum = "eda564acdb23185caf700f89dd6e5d4540225d6a991516b2cad0cbcf27e4dcd3"
4897
+dependencies = [
4898
+ "httparse",
4899
+ "log",
4900
+ "serde",
4901
+ "tauri",
4902
+ "tauri-plugin",
4903
+ "thiserror 1.0.69",
4904
+ "url",
4905
+]
4906
+
4907
+[[package]]
4908
+name = "tauri-plugin-opener"
4909
+version = "2.5.2"
4910
+source = "registry+https://github.com/rust-lang/crates.io-index"
4911
+checksum = "c26b72571d25dee25667940027114e60f569fc3974f8cefbe50c2cbc5fd65e3b"
4912
+dependencies = [
4913
+ "dunce",
4914
+ "glob",
4915
+ "objc2-app-kit",
4916
+ "objc2-foundation 0.3.2",
4917
+ "open",
4918
+ "schemars 0.8.22",
4919
+ "serde",
4920
+ "serde_json",
4921
+ "tauri",
4922
+ "tauri-plugin",
4923
+ "thiserror 2.0.17",
4924
+ "url",
4925
+ "windows 0.61.3",
4926
+ "zbus",
4927
+]
4928
+
4929
+[[package]]
4930
+name = "tauri-plugin-os"
4931
+version = "2.3.2"
4932
+source = "registry+https://github.com/rust-lang/crates.io-index"
4933
+checksum = "d8f08346c8deb39e96f86973da0e2d76cbb933d7ac9b750f6dc4daf955a6f997"
4934
+dependencies = [
4935
+ "gethostname",
4936
+ "log",
4937
+ "os_info",
4938
+ "serde",
4939
+ "serde_json",
4940
+ "serialize-to-javascript",
4941
+ "sys-locale",
4942
+ "tauri",
4943
+ "tauri-plugin",
4944
+ "thiserror 2.0.17",
4945
+]
4946
+
4947
+[[package]]
4948
+name = "tauri-plugin-store"
4949
+version = "2.4.1"
4950
+source = "registry+https://github.com/rust-lang/crates.io-index"
4951
+checksum = "59a77036340a97eb5bbe1b3209c31e5f27f75e6f92a52fd9dd4b211ef08bf310"
4952
+dependencies = [
4953
+ "dunce",
4954
+ "serde",
4955
+ "serde_json",
4956
+ "tauri",
4957
+ "tauri-plugin",
4958
+ "thiserror 2.0.17",
4959
+ "tokio",
4960
+ "tracing",
4961
+]
4962
+
4963
+[[package]]
4964
+name = "tauri-runtime"
4965
+version = "2.9.1"
4966
+source = "registry+https://github.com/rust-lang/crates.io-index"
4967
+checksum = "9368f09358496f2229313fccb37682ad116b7f46fa76981efe116994a0628926"
4968
+dependencies = [
4969
+ "cookie",
4970
+ "dpi",
4971
+ "gtk",
4972
+ "http",
4973
+ "jni",
4974
+ "objc2 0.6.3",
4975
+ "objc2-ui-kit",
4976
+ "objc2-web-kit",
4977
+ "raw-window-handle",
4978
+ "serde",
4979
+ "serde_json",
4980
+ "tauri-utils",
4981
+ "thiserror 2.0.17",
4982
+ "url",
4983
+ "webkit2gtk",
4984
+ "webview2-com",
4985
+ "windows 0.61.3",
4986
+]
4987
+
4988
+[[package]]
4989
+name = "tauri-runtime-wry"
4990
+version = "2.9.1"
4991
+source = "registry+https://github.com/rust-lang/crates.io-index"
4992
+checksum = "929f5df216f5c02a9e894554401bcdab6eec3e39ec6a4a7731c7067fc8688a93"
4993
+dependencies = [
4994
+ "gtk",
4995
+ "http",
4996
+ "jni",
4997
+ "log",
4998
+ "objc2 0.6.3",
4999
+ "objc2-app-kit",
This file is too large to show in full.
src-tauri/Cargo.toml
new
+37
@@ -0,0 +1,37 @@
1
+[package]
2
+name = "snac"
3
+version = "1.0.0"
4
+description = "A Tauri App"
5
+authors = ["you"]
6
+edition = "2021"
7
+
8
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
9
+
10
+[lib]
11
+# The `_lib` suffix may seem redundant but it is necessary
12
+# to make the lib name unique and wouldn't conflict with the bin name.
13
+# This seems to be only an issue on Windows, see https://github.com/rust-lang/cargo/issues/8519
14
+name = "snac_lib"
15
+crate-type = ["staticlib", "cdylib", "rlib"]
16
+
17
+[dependencies]
18
+dotenv_codegen = "0.15"
19
+serde = { version = "1", features = ["derive"] }
20
+serde_json = "1"
21
+serde_qs = "0.15"
22
+tauri = { version = "2", features = [] }
23
+tauri-plugin-haptics = "2"
24
+tauri-plugin-log = { features = ["colored"], version = "2" }
25
+tauri-plugin-opener = "2"
26
+tauri-plugin-os = "2"
27
+tauri-plugin-store = "2"
28
+tauri-plugin-oauth = "2"
29
+tsync = "2"
30
+smbcloud-model = "0.3"
31
+smbcloud-networking-account = "0.3"
32
+
33
+[target.'cfg(target_os = "android")'.dependencies]
34
+tauri-plugin-admob = { git = "https://github.com/setoelkahfi/tauri-plugin-admob.git", branch = "feature/android-update-deps" }
35
+
36
+[build-dependencies]
37
+tauri-build = { version = "2", features = [] }
src-tauri/Entitlements.plist
new
+15
@@ -0,0 +1,15 @@
1
+<?xml version="1.0" encoding="UTF-8" ?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
3
+ "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
4
+<plist version="1.0">
5
+ <dict>
6
+ <key>com.apple.security.app-sandbox</key>
7
+ <true />
8
+ <key>com.apple.application-identifier</key>
9
+ <string>your_app_identifier</string>
10
+ <key>com.apple.developer.team-identifier</key>
11
+ <string>your_team_id</string>
12
+ <key>com.apple.security.network.client</key>
13
+ <true />
14
+ </dict>
15
+</plist>
src-tauri/Info.plist
new
+11
@@ -0,0 +1,11 @@
1
+<?xml version="1.0" encoding="UTF-8" ?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
3
+ "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
4
+<plist version="1.0">
5
+<dict>
6
+ <key>ITSAppUsesNonExemptEncryption</key>
7
+ <false />
8
+ <key>LSApplicationCategoryType</key>
9
+ <string>public.app-category.finance</string>
10
+</dict>
11
+</plist>
src-tauri/build.rs
new
+3
@@ -0,0 +1,3 @@
1
+fn main() {
2
+ tauri_build::build()
3
+}
src-tauri/capabilities/android.json
new
+8
@@ -0,0 +1,8 @@
1
+{
2
+ "$schema": "../gen/schemas/android-schema.json",
3
+ "identifier": "android-capabilities",
4
+ "description": "Capabilities for the Android platform.",
5
+ "platforms": ["android"],
6
+ "windows": ["main"],
7
+ "permissions": ["admob:default"]
8
+}
src-tauri/capabilities/default.json
new
+19
@@ -0,0 +1,19 @@
1
+{
2
+ "$schema": "../gen/schemas/desktop-schema.json",
3
+ "identifier": "default",
4
+ "description": "Capability for the main window",
5
+ "windows": [
6
+ "main"
7
+ ],
8
+ "permissions": [
9
+ "core:default",
10
+ "opener:default",
11
+ "haptics:allow-impact-feedback",
12
+ "haptics:allow-notification-feedback",
13
+ "haptics:allow-selection-feedback",
14
+ "haptics:allow-vibrate",
15
+ "os:default",
16
+ "log:default",
17
+ "store:default"
18
+ ]
19
+}
\ No newline at end of file
src-tauri/capabilities/mobile.json
new
+8
@@ -0,0 +1,8 @@
1
+{
2
+ "$schema": "../gen/schemas/mobile-schema.json",
3
+ "identifier": "mobile-capabilities",
4
+ "description": "Capabilities for the mobile platforms.",
5
+ "platforms": ["android", "iOS"],
6
+ "windows": ["main"],
7
+ "permissions": ["oauth:allow-start", "oauth:allow-cancel"]
8
+}
src-tauri/gen-override/.keep
src-tauri/gen-override/android/.keep
src-tauri/gen-override/android/app/build.gradle.kts
new
+86
@@ -0,0 +1,86 @@
1
+import java.io.FileInputStream
2
+import java.util.Properties
3
+
4
+plugins {
5
+ id("com.android.application")
6
+ id("org.jetbrains.kotlin.android")
7
+ id("rust")
8
+}
9
+
10
+val tauriProperties = Properties().apply {
11
+ val propFile = file("tauri.properties")
12
+ if (propFile.exists()) {
13
+ propFile.inputStream().use { load(it) }
14
+ }
15
+}
16
+
17
+android {
18
+ compileSdk = 36
19
+ namespace = "xyz.smbcloud.snac"
20
+ defaultConfig {
21
+ manifestPlaceholders["usesCleartextTraffic"] = "false"
22
+ applicationId = "xyz.smbcloud.snac"
23
+ minSdk = 24
24
+ targetSdk = 36
25
+ versionCode = tauriProperties.getProperty("tauri.android.versionCode", "1").toInt()
26
+ versionName = tauriProperties.getProperty("tauri.android.versionName", "1.0")
27
+ }
28
+ signingConfigs {
29
+ create("release") {
30
+ val keystorePropertiesFile = rootProject.file("keystore.properties")
31
+ val keystoreProperties = Properties()
32
+ if (keystorePropertiesFile.exists()) {
33
+ keystoreProperties.load(FileInputStream(keystorePropertiesFile))
34
+ }
35
+
36
+ keyAlias = keystoreProperties["keyAlias"] as String
37
+ keyPassword = keystoreProperties["password"] as String
38
+ storeFile = file(keystoreProperties["storeFile"] as String)
39
+ storePassword = keystoreProperties["password"] as String
40
+ }
41
+ }
42
+ buildTypes {
43
+ getByName("debug") {
44
+ manifestPlaceholders["usesCleartextTraffic"] = "true"
45
+ isDebuggable = true
46
+ isJniDebuggable = true
47
+ isMinifyEnabled = false
48
+ packaging { jniLibs.keepDebugSymbols.add("*/arm64-v8a/*.so")
49
+ jniLibs.keepDebugSymbols.add("*/armeabi-v7a/*.so")
50
+ jniLibs.keepDebugSymbols.add("*/x86/*.so")
51
+ jniLibs.keepDebugSymbols.add("*/x86_64/*.so")
52
+ }
53
+ }
54
+ getByName("release") {
55
+ signingConfig = signingConfigs.getByName("release")
56
+ isMinifyEnabled = true
57
+ proguardFiles(
58
+ *fileTree(".") { include("**/*.pro") }
59
+ .plus(getDefaultProguardFile("proguard-android-optimize.txt"))
60
+ .toList().toTypedArray()
61
+ )
62
+ }
63
+ }
64
+ kotlinOptions {
65
+ jvmTarget = "1.8"
66
+ }
67
+ buildFeatures {
68
+ buildConfig = true
69
+ }
70
+}
71
+
72
+rust {
73
+ rootDirRel = "../../../"
74
+}
75
+
76
+dependencies {
77
+ implementation("androidx.webkit:webkit:1.14.0")
78
+ implementation("androidx.appcompat:appcompat:1.7.1")
79
+ implementation("androidx.activity:activity-ktx:1.10.1")
80
+ implementation("com.google.android.material:material:1.12.0")
81
+ testImplementation("junit:junit:4.13.2")
82
+ androidTestImplementation("androidx.test.ext:junit:1.1.4")
83
+ androidTestImplementation("androidx.test.espresso:espresso-core:3.5.0")
84
+}
85
+
86
+apply(from = "tauri.build.gradle.kts")
src-tauri/gen-override/android/app/src/.keep
src-tauri/gen-override/android/app/src/main/.keep
src-tauri/gen-override/android/app/src/main/AndroidManifest.xml
new
+97
@@ -0,0 +1,97 @@
1
+<?xml version="1.0" encoding="utf-8" ?>
2
+<manifest
3
+ xmlns:android="http://schemas.android.com/apk/res/android"
4
+ xmlns:tools="http://schemas.android.com/tools"
5
+>
6
+ <uses-permission android:name="android.permission.INTERNET" />
7
+ <uses-permission android:name="com.google.android.gms.permission.AD_ID" />
8
+
9
+ <!-- AndroidTV support -->
10
+ <uses-feature
11
+ android:name="android.software.leanback"
12
+ android:required="false"
13
+ />
14
+ <uses-feature
15
+ android:name="android.hardware.touchscreen"
16
+ android:required="false"
17
+ />
18
+ <uses-feature
19
+ android:name="android.hardware.faketouch"
20
+ android:required="false"
21
+ />
22
+ <uses-feature
23
+ android:name="android.hardware.telephony"
24
+ android:required="false"
25
+ />
26
+ <uses-feature
27
+ android:name="android.hardware.camera"
28
+ android:required="false"
29
+ />
30
+ <uses-feature
31
+ android:name="android.hardware.nfc"
32
+ android:required="false"
33
+ />
34
+ <uses-feature
35
+ android:name="android.hardware.location.gps"
36
+ android:required="false"
37
+ />
38
+ <uses-feature
39
+ android:name="android.hardware.microphone"
40
+ android:required="false"
41
+ />
42
+ <uses-feature
43
+ android:name="android.hardware.sensor"
44
+ android:required="false"
45
+ />
46
+ <!-- Some TV devices have an ethernet connection only -->
47
+ <uses-feature
48
+ android:name="android.hardware.wifi"
49
+ android:required="false"
50
+ />
51
+
52
+ <application
53
+ android:icon="@mipmap/ic_launcher"
54
+ android:label="@string/app_name"
55
+ android:theme="@style/Theme.snac"
56
+ android:usesCleartextTraffic="${usesCleartextTraffic}"
57
+ >
58
+ <!-- Sample AdMob app ID: ca-app-pub-3940256099942544~3347511713 -->
59
+ <!-- Production AdMod app ID: ca-app-pub-8869993014420242~9851179757 -->
60
+ <meta-data
61
+ android:name="com.google.android.gms.ads.APPLICATION_ID"
62
+ android:value="ca-app-pub-8869993014420242~9851179757"
63
+ />
64
+ <meta-data
65
+ android:name="com.google.android.gms.ads.DELAY_APP_MEASUREMENT_INIT"
66
+ android:value="true"
67
+ />
68
+ <activity
69
+ android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode"
70
+ android:launchMode="singleTask"
71
+ android:label="@string/main_activity_title"
72
+ android:name=".MainActivity"
73
+ android:exported="true"
74
+ >
75
+ <intent-filter>
76
+ <action android:name="android.intent.action.MAIN" />
77
+ <category android:name="android.intent.category.LAUNCHER" />
78
+ <!-- AndroidTV support -->
79
+ <category
80
+ android:name="android.intent.category.LEANBACK_LAUNCHER"
81
+ />
82
+ </intent-filter>
83
+ </activity>
84
+
85
+ <provider
86
+ android:name="androidx.core.content.FileProvider"
87
+ android:authorities="${applicationId}.fileprovider"
88
+ android:exported="false"
89
+ android:grantUriPermissions="true"
90
+ >
91
+ <meta-data
92
+ android:name="android.support.FILE_PROVIDER_PATHS"
93
+ android:resource="@xml/file_paths"
94
+ />
95
+ </provider>
96
+ </application>
97
+</manifest>
src-tauri/gen-override/android/keystore.properties
new
+3
@@ -0,0 +1,3 @@
1
+password=123456
2
+keyAlias=upload
3
+storeFile=/Users/setoelkahfi/Repositories/google-certificates/upload-keystore.jks
src-tauri/icons/128x128.png
Binary files /dev/null and b/src-tauri/icons/128x128.png differ
src-tauri/icons/128x128@2x.png
Binary files /dev/null and b/src-tauri/icons/128x128@2x.png differ
src-tauri/icons/32x32.png
Binary files /dev/null and b/src-tauri/icons/32x32.png differ
src-tauri/icons/64x64.png
Binary files /dev/null and b/src-tauri/icons/64x64.png differ
src-tauri/icons/Square107x107Logo.png
Binary files /dev/null and b/src-tauri/icons/Square107x107Logo.png differ
src-tauri/icons/Square142x142Logo.png
Binary files /dev/null and b/src-tauri/icons/Square142x142Logo.png differ
src-tauri/icons/Square150x150Logo.png
Binary files /dev/null and b/src-tauri/icons/Square150x150Logo.png differ
src-tauri/icons/Square284x284Logo.png
Binary files /dev/null and b/src-tauri/icons/Square284x284Logo.png differ
src-tauri/icons/Square30x30Logo.png
Binary files /dev/null and b/src-tauri/icons/Square30x30Logo.png differ
src-tauri/icons/Square310x310Logo.png
Binary files /dev/null and b/src-tauri/icons/Square310x310Logo.png differ
src-tauri/icons/Square44x44Logo.png
Binary files /dev/null and b/src-tauri/icons/Square44x44Logo.png differ
src-tauri/icons/Square71x71Logo.png
Binary files /dev/null and b/src-tauri/icons/Square71x71Logo.png differ
src-tauri/icons/Square89x89Logo.png
Binary files /dev/null and b/src-tauri/icons/Square89x89Logo.png differ
src-tauri/icons/StoreLogo.png
Binary files /dev/null and b/src-tauri/icons/StoreLogo.png differ
src-tauri/icons/icon.icns
Binary files /dev/null and b/src-tauri/icons/icon.icns differ
src-tauri/icons/icon.ico
Binary files /dev/null and b/src-tauri/icons/icon.ico differ
src-tauri/icons/icon.png
Binary files /dev/null and b/src-tauri/icons/icon.png differ
src-tauri/src/command_start_server.rs
new
+70
@@ -0,0 +1,70 @@
1
+use {
2
+ crate::google::model::OauthRedirect,
3
+ tauri::{command, AppHandle, Emitter, Url},
4
+ tauri_plugin_log::log::{debug, error},
5
+ tauri_plugin_oauth::{start_with_config, OauthConfig},
6
+};
7
+
8
+#[command]
9
+pub async fn start_server(app: AppHandle) -> Result<u16, String> {
10
+ let config = OauthConfig {
11
+ ports: Some(vec![8000, 8001, 8002, 8003]),
12
+ response: Some(
13
+ "
14
+ <html>
15
+ <head>
16
+ <title>Done!</title>
17
+ <style>
18
+ body {
19
+ font-family: sans-serif;
20
+ text-align: center;
21
+ padding: 50px;
22
+ }
23
+ h1 {
24
+ color: #333;
25
+ }
26
+ p {
27
+ font-size: 20px;
28
+ color: #666;
29
+ }
30
+ a {
31
+ color: #007BFF;
32
+ text-decoration: none;
33
+ }
34
+ a:hover {
35
+ text-decoration: underline;
36
+ }
37
+ </style>
38
+ </head>
39
+ <body>
40
+ <h1>Done!</h1>
41
+ <p>You can close this window. You can <a href='snac://'>open the app</a>.</p>
42
+ <p>If you are not redirected, <a href=\"javascript:window.close()\">click here</a>.</p>
43
+ </body>
44
+ </html>
45
+ "
46
+ .into(),
47
+ ),
48
+ };
49
+ start_with_config(config, move |url| {
50
+ debug!("Received URL: {}", url);
51
+ let url = Url::try_from(url.as_str()).unwrap();
52
+
53
+ for (key, val) in url.query_pairs() {
54
+ debug!("{} = {}", key, val);
55
+ }
56
+
57
+ if let Some(query) = url.query() {
58
+ let oauth_redirect: OauthRedirect = serde_qs::from_str(query).unwrap();
59
+ match app.emit("oauth_redirect_uri", oauth_redirect) {
60
+ Ok(_) => {
61
+ debug!("Emitted event.");
62
+ }
63
+ Err(e) => {
64
+ error!("Failed to emit event: {}", e);
65
+ }
66
+ }
67
+ }
68
+ })
69
+ .map_err(|err| err.to_string())
70
+}
src-tauri/src/google/command_get_consent_url.rs
new
+5
@@ -0,0 +1,5 @@
1
+#[tauri::command]
2
+pub async fn get_consent_url(redirect_uri: String) -> String {
3
+ let client_id = dotenv!("GOOGLE_OAUTH_CLIENT_ID").to_string();
4
+ smbcloud_networking_account::oauth::get_consent_url::get_consent_url(client_id, redirect_uri)
5
+}
src-tauri/src/google/command_get_profile.rs
new
+6
@@ -0,0 +1,6 @@
1
+use smbcloud_model::{error_codes::ErrorResponse, oauth::UserInfo};
2
+
3
+#[tauri::command]
4
+pub async fn get_profile(access_token: String) -> Result<UserInfo, ErrorResponse> {
5
+ smbcloud_networking_account::oauth::get_profile::get_profile(access_token).await
6
+}
src-tauri/src/google/command_get_token.rs
new
+16
@@ -0,0 +1,16 @@
1
+use smbcloud_model::{
2
+ error_codes::ErrorResponse,
3
+ oauth::{OauthRedirect, TokenResponse},
4
+};
5
+
6
+#[tauri::command]
7
+pub async fn get_token(oauth_redirect: OauthRedirect) -> Result<TokenResponse, ErrorResponse> {
8
+ let client_id = dotenv!("GOOGLE_OAUTH_CLIENT_ID").to_string();
9
+ let client_secret = dotenv!("GOOGLE_OAUTH_CLIENT_SECRET").to_string();
10
+ smbcloud_networking_account::oauth::get_token::get_token(
11
+ oauth_redirect,
12
+ client_id,
13
+ client_secret,
14
+ )
15
+ .await
16
+}
src-tauri/src/google/mod.rs
new
+4
@@ -0,0 +1,4 @@
1
+pub mod command_get_consent_url;
2
+pub mod command_get_profile;
3
+pub mod command_get_token;
4
+pub mod model;
src-tauri/src/google/model.rs
new
+34
@@ -0,0 +1,34 @@
1
+use serde::{Deserialize, Serialize};
2
+use tsync::tsync;
3
+
4
+#[derive(Serialize, Deserialize, Debug, Clone)]
5
+#[tsync]
6
+pub struct TokenResponse {
7
+ pub access_token: String,
8
+ pub expires_in: i32,
9
+ pub refresh_token: Option<String>,
10
+ pub refresh_token_expires_in: Option<String>,
11
+ pub scope: String,
12
+ pub token_type: String,
13
+}
14
+
15
+#[derive(Serialize, Deserialize, Debug, Clone)]
16
+#[tsync]
17
+pub struct OauthRedirect {
18
+ pub code: String,
19
+ pub scope: String,
20
+ pub authuser: i32,
21
+ pub prompt: String,
22
+}
23
+
24
+#[derive(Serialize, Deserialize, Debug, Clone)]
25
+#[tsync]
26
+pub struct UserInfo {
27
+ pub id: String,
28
+ pub email: String,
29
+ pub verified_email: bool,
30
+ pub name: String,
31
+ pub given_name: String,
32
+ pub family_name: String,
33
+ pub picture: String,
34
+}
src-tauri/src/lib.rs
new
+49
@@ -0,0 +1,49 @@
1
+mod command_start_server;
2
+mod google;
3
+
4
+use command_start_server::start_server;
5
+use google::command_get_consent_url::get_consent_url;
6
+use google::command_get_profile::get_profile;
7
+use google::command_get_token::get_token;
8
+use tauri_plugin_log::fern::colors::{Color, ColoredLevelConfig};
9
+
10
+#[macro_use]
11
+extern crate dotenv_codegen;
12
+
13
+#[cfg_attr(mobile, tauri::mobile_entry_point)]
14
+pub fn run() {
15
+ tauri::Builder::default()
16
+ .plugin(tauri_plugin_store::Builder::new().build())
17
+ .plugin(
18
+ tauri_plugin_log::Builder::new()
19
+ .with_colors(
20
+ ColoredLevelConfig::default()
21
+ .debug(Color::Green)
22
+ .info(Color::Cyan),
23
+ )
24
+ .target(tauri_plugin_log::Target::new(
25
+ tauri_plugin_log::TargetKind::Stdout,
26
+ ))
27
+ .build(),
28
+ )
29
+ .plugin(tauri_plugin_os::init())
30
+ .plugin(tauri_plugin_opener::init())
31
+ .plugin(tauri_plugin_haptics::init())
32
+ .setup(|#[allow(unused)] app| {
33
+ // Android-only plugin.
34
+ #[cfg(target_os = "android")]
35
+ {
36
+ app.handle().plugin(tauri_plugin_admob::init())?;
37
+ }
38
+ app.handle().plugin(tauri_plugin_oauth::init())?;
39
+ Ok(())
40
+ })
41
+ .invoke_handler(tauri::generate_handler![
42
+ start_server,
43
+ get_token,
44
+ get_profile,
45
+ get_consent_url,
46
+ ])
47
+ .run(tauri::generate_context!())
48
+ .expect("Error while running tauri application");
49
+}
src-tauri/src/main.rs
new
+6
@@ -0,0 +1,6 @@
1
+// Prevents additional console window on Windows in release, DO NOT REMOVE!!
2
+#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
3
+
4
+fn main() {
5
+ snac_lib::run()
6
+}
src-tauri/tauri.conf.json
new
+43
@@ -0,0 +1,43 @@
1
+{
2
+ "$schema": "https://schema.tauri.app/config/2",
3
+ "productName": "Snac",
4
+ "version": "1.0.0",
5
+ "identifier": "xyz.smbcloud.snac",
6
+ "build": {
7
+ "beforeDevCommand": "pnpm dev",
8
+ "devUrl": "http://localhost:1420",
9
+ "beforeBuildCommand": "pnpm build",
10
+ "frontendDist": "../dist"
11
+ },
12
+ "app": {
13
+ "windows": [
14
+ {
15
+ "title": "Snac",
16
+ "width": 800,
17
+ "height": 600
18
+ }
19
+ ],
20
+ "security": {
21
+ "csp": null
22
+ }
23
+ },
24
+ "bundle": {
25
+ "active": true,
26
+ "targets": "all",
27
+ "icon": [
28
+ "icons/32x32.png",
29
+ "icons/128x128.png",
30
+ "icons/128x128@2x.png",
31
+ "icons/icon.icns",
32
+ "icons/icon.ico"
33
+ ],
34
+ "android": {
35
+ "minSdkVersion": 24,
36
+ "versionCode": 4
37
+ },
38
+ "iOS": {
39
+ "developmentTeam": "2TQF86ZACD",
40
+ "minimumSystemVersion": "14.0"
41
+ }
42
+ }
43
+}
src-tauri/tauri.prod-android-playstore.conf.json
new
+9
@@ -0,0 +1,9 @@
1
+{
2
+ "version": "1.0.0",
3
+ "bundle": {
4
+ "android": {
5
+ "minSdkVersion": 24,
6
+ "versionCode": 5
7
+ }
8
+ }
9
+}
src-tauri/tauri.prod-macos-appstore.conf.json
new
+11
@@ -0,0 +1,11 @@
1
+{
2
+ "bundle": {
3
+ "macOS": {
4
+ "entitlements": "./Entitlements.plist",
5
+ "signingIdentity": "Your signing identity",
6
+ "files": {
7
+ "embedded.provisionprofile": "/path/to/your.provisionprofile"
8
+ }
9
+ }
10
+ }
11
+}
src/App.css
new
+42
@@ -0,0 +1,42 @@
1
+#root {
2
+ max-width: 1280px;
3
+ margin: 0 auto;
4
+ padding: 2rem;
5
+ text-align: center;
6
+}
7
+
8
+.logo {
9
+ height: 6em;
10
+ padding: 1.5em;
11
+ will-change: filter;
12
+ transition: filter 300ms;
13
+}
14
+.logo:hover {
15
+ filter: drop-shadow(0 0 2em #646cffaa);
16
+}
17
+.logo.react:hover {
18
+ filter: drop-shadow(0 0 2em #61dafbaa);
19
+}
20
+
21
+@keyframes logo-spin {
22
+ from {
23
+ transform: rotate(0deg);
24
+ }
25
+ to {
26
+ transform: rotate(360deg);
27
+ }
28
+}
29
+
30
+@media (prefers-reduced-motion: no-preference) {
31
+ a:nth-of-type(2) .logo {
32
+ animation: logo-spin infinite 20s linear;
33
+ }
34
+}
35
+
36
+.card {
37
+ padding: 2em;
38
+}
39
+
40
+.read-the-docs {
41
+ color: #888;
42
+}
src/App.tsx
new
+74
@@ -0,0 +1,74 @@
1
+import { Routes, Route, useLocation } from "react-router-dom";
2
+import * as Tooltip from "@radix-ui/react-tooltip";
3
+import Navbar from "./components/Navbar";
4
+import AnimatedPage from "./components/AnimatedPage";
5
+import Home from "./pages/Home";
6
+import Profile from "./pages/Profile";
7
+import { AccountProvider } from "./context/AccountContext";
8
+import Pay from "./pages/Pay";
9
+import SendMoney from "./pages/SendMoney";
10
+import Recipients from "./pages/Recipients";
11
+import { useLang } from "./context/LanguageContext";
12
+
13
+export default function App() {
14
+ const location = useLocation();
15
+ const { lang } = useLang();
16
+ const isRTL = lang === "fa";
17
+
18
+ return (
19
+ <Tooltip.Provider>
20
+ <div
21
+ className="bg-gradient-to-tr from-primary to-sky-100 min-h-screen w-full font-sans relative safe-area"
22
+ dir={isRTL ? "rtl" : "ltr"}
23
+ >
24
+ <Navbar />
25
+ <main className="py-4 bottom-nav-safe max-w-2xl mx-auto px-4">
26
+ <AccountProvider>
27
+ <Routes location={location} key={location.pathname}>
28
+ <Route
29
+ path="/"
30
+ element={
31
+ <AnimatedPage>
32
+ <Home />
33
+ </AnimatedPage>
34
+ }
35
+ />
36
+ <Route
37
+ path="/pay"
38
+ element={
39
+ <AnimatedPage>
40
+ <Pay />
41
+ </AnimatedPage>
42
+ }
43
+ />
44
+ <Route
45
+ path="/send"
46
+ element={
47
+ <AnimatedPage>
48
+ <SendMoney />
49
+ </AnimatedPage>
50
+ }
51
+ />
52
+ <Route
53
+ path="/recipients"
54
+ element={
55
+ <AnimatedPage>
56
+ <Recipients />
57
+ </AnimatedPage>
58
+ }
59
+ />
60
+ <Route
61
+ path="/profile"
62
+ element={
63
+ <AnimatedPage>
64
+ <Profile />
65
+ </AnimatedPage>
66
+ }
67
+ />
68
+ </Routes>
69
+ </AccountProvider>
70
+ </main>
71
+ </div>
72
+ </Tooltip.Provider>
73
+ );
74
+}
src/components/AnimatedPage.tsx
new
+10
@@ -0,0 +1,10 @@
1
+import { ReactNode } from "react";
2
+
3
+interface AnimatedPageProps {
4
+ children: ReactNode;
5
+}
6
+
7
+export default function AnimatedPage({ children }: AnimatedPageProps) {
8
+ // Simple fade-in; use Framer Motion or React Spring for more advanced animation
9
+ return <div className="fade-in">{children}</div>;
10
+}
src/components/Navbar.tsx
new
+99
@@ -0,0 +1,99 @@
1
+import { Link, useLocation } from "react-router-dom";
2
+import * as Tooltip from "@radix-ui/react-tooltip";
3
+import { useLang } from "../context/LanguageContext";
4
+import { SupportedLanguage } from "../utils/i18n";
5
+import haptics from "./../utils/haptics";
6
+import { Home, CreditCard, User } from "lucide-react";
7
+
8
+interface NavItem {
9
+ path: string;
10
+ key: "home" | "pay" | "profile";
11
+ icon: React.JSX.Element;
12
+}
13
+
14
+const navItems: NavItem[] = [
15
+ {
16
+ path: "/",
17
+ key: "home",
18
+ icon: <Home />,
19
+ },
20
+ {
21
+ path: "/pay",
22
+ key: "pay",
23
+ icon: <CreditCard />,
24
+ },
25
+ {
26
+ path: "/profile",
27
+ key: "profile",
28
+ icon: <User />,
29
+ },
30
+];
31
+
32
+export default function Navbar() {
33
+ const location = useLocation();
34
+ const { t, lang, setLang } = useLang();
35
+ const isRTL = lang === "fa";
36
+
37
+ const handleNavClick = async () => {
38
+ await haptics.navigation();
39
+ };
40
+
41
+ return (
42
+ <>
43
+ {/* Top bar with app name and language switcher, matching bottom bar width */}
44
+ <div
45
+ className={`fixed top-0 left-0 w-full bg-white/70 backdrop-blur-lg z-50 shadow top-nav-safe`}
46
+ dir={isRTL ? "rtl" : "ltr"}
47
+ >
48
+ <div className="max-w-2xl mx-auto flex flex-row justify-between items-center px-4 py-3 w-full">
49
+ <span className="font-bold text-xl text-primary">{t.appName}</span>
50
+ <select
51
+ className="rounded border px-2 py-1 bg-white text-sm text-primary cursor-pointer shadow"
52
+ value={lang}
53
+ onClick={handleNavClick}
54
+ onChange={(e) => setLang(e.target.value as SupportedLanguage)}
55
+ aria-label="Change language"
56
+ >
57
+ <option value="fa">فارسی</option>
58
+ <option value="en">English</option>
59
+ <option value="sv">Svenska</option>
60
+ </select>
61
+ </div>
62
+ </div>
63
+
64
+ {/* Bottom tab navigation */}
65
+ <nav className="fixed bottom-0 left-0 w-full bg-white/90 backdrop-blur-md border-t z-40 shadow-lg bottom-nav-safe">
66
+ <div className="max-w-2xl mx-auto flex justify-around items-center px-4 py-2 w-full">
67
+ {navItems.map((item) => (
68
+ <Tooltip.Root key={item.path} delayDuration={100}>
69
+ <Tooltip.Trigger asChild>
70
+ <Link
71
+ to={item.path}
72
+ onClick={handleNavClick}
73
+ className={`flex flex-col items-center justify-center gap-1 px-3 py-1 rounded transition-all duration-200
74
+ ${
75
+ location.pathname === item.path
76
+ ? "bg-fuchsia-100 text-primary shadow font-semibold"
77
+ : "hover:bg-fuchsia-50 text-slate-800"
78
+ }`}
79
+ style={{ minWidth: 60 }}
80
+ >
81
+ {item.icon}
82
+ <span className="text-xs">{t[item.key]}</span>
83
+ </Link>
84
+ </Tooltip.Trigger>
85
+ <Tooltip.Portal>
86
+ <Tooltip.Content className="text-xs bg-white border px-2 py-1 rounded shadow">
87
+ {t[item.key]}
88
+ <Tooltip.Arrow className="fill-white" />
89
+ </Tooltip.Content>
90
+ </Tooltip.Portal>
91
+ </Tooltip.Root>
92
+ ))}
93
+ </div>
94
+ </nav>
95
+ {/* Add top and bottom padding to main content to prevent overlap */}
96
+ <div className="h-16" aria-hidden="true"></div>
97
+ </>
98
+ );
99
+}
src/components/ui/alert-dialog.tsx
new
+104
@@ -0,0 +1,104 @@
1
+import * as React from "react";
2
+import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
3
+
4
+import { cn } from "@/lib/utils";
5
+import { buttonVariants } from "@/components/ui/button";
6
+
7
+const AlertDialog = AlertDialogPrimitive.Root;
8
+
9
+const AlertDialogTrigger = AlertDialogPrimitive.Trigger;
10
+
11
+const AlertDialogPortal = AlertDialogPrimitive.Portal;
12
+
13
+const AlertDialogOverlay = React.forwardRef<
14
+ React.ElementRef<typeof AlertDialogPrimitive.Overlay>,
15
+ React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>
16
+>(({ className, ...props }, ref) => (
17
+ <AlertDialogPrimitive.Overlay
18
+ className={cn(
19
+ "fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
20
+ className,
21
+ )}
22
+ {...props}
23
+ ref={ref}
24
+ />
25
+));
26
+AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;
27
+
28
+const AlertDialogContent = React.forwardRef<
29
+ React.ElementRef<typeof AlertDialogPrimitive.Content>,
30
+ React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>
31
+>(({ className, ...props }, ref) => (
32
+ <AlertDialogPortal>
33
+ <AlertDialogOverlay />
34
+ <AlertDialogPrimitive.Content
35
+ ref={ref}
36
+ className={cn(
37
+ "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
38
+ className,
39
+ )}
40
+ {...props}
41
+ />
42
+ </AlertDialogPortal>
43
+));
44
+AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;
45
+
46
+const AlertDialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
47
+ <div className={cn("flex flex-col space-y-2 text-center sm:text-left", className)} {...props} />
48
+);
49
+AlertDialogHeader.displayName = "AlertDialogHeader";
50
+
51
+const AlertDialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
52
+ <div className={cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className)} {...props} />
53
+);
54
+AlertDialogFooter.displayName = "AlertDialogFooter";
55
+
56
+const AlertDialogTitle = React.forwardRef<
57
+ React.ElementRef<typeof AlertDialogPrimitive.Title>,
58
+ React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>
59
+>(({ className, ...props }, ref) => (
60
+ <AlertDialogPrimitive.Title ref={ref} className={cn("text-lg font-semibold", className)} {...props} />
61
+));
62
+AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;
63
+
64
+const AlertDialogDescription = React.forwardRef<
65
+ React.ElementRef<typeof AlertDialogPrimitive.Description>,
66
+ React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>
67
+>(({ className, ...props }, ref) => (
68
+ <AlertDialogPrimitive.Description ref={ref} className={cn("text-sm text-muted-foreground", className)} {...props} />
69
+));
70
+AlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName;
71
+
72
+const AlertDialogAction = React.forwardRef<
73
+ React.ElementRef<typeof AlertDialogPrimitive.Action>,
74
+ React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>
75
+>(({ className, ...props }, ref) => (
76
+ <AlertDialogPrimitive.Action ref={ref} className={cn(buttonVariants(), className)} {...props} />
77
+));
78
+AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;
79
+
80
+const AlertDialogCancel = React.forwardRef<
81
+ React.ElementRef<typeof AlertDialogPrimitive.Cancel>,
82
+ React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>
83
+>(({ className, ...props }, ref) => (
84
+ <AlertDialogPrimitive.Cancel
85
+ ref={ref}
86
+ className={cn(buttonVariants({ variant: "outline" }), "mt-2 sm:mt-0", className)}
87
+ {...props}
88
+ />
89
+));
90
+AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;
91
+
92
+export {
93
+ AlertDialog,
94
+ AlertDialogPortal,
95
+ AlertDialogOverlay,
96
+ AlertDialogTrigger,
97
+ AlertDialogContent,
98
+ AlertDialogHeader,
99
+ AlertDialogFooter,
100
+ AlertDialogTitle,
101
+ AlertDialogDescription,
102
+ AlertDialogAction,
103
+ AlertDialogCancel,
104
+};
src/components/ui/avatar.tsx
new
+48
@@ -0,0 +1,48 @@
1
+import * as React from "react";
2
+import * as AvatarPrimitive from "@radix-ui/react-avatar";
3
+
4
+import { cn } from "@/lib/utils";
5
+
6
+const Avatar = React.forwardRef<
7
+ React.ElementRef<typeof AvatarPrimitive.Root>,
8
+ React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>
9
+>(({ className, ...props }, ref) => (
10
+ <AvatarPrimitive.Root
11
+ ref={ref}
12
+ className={cn(
13
+ "relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full",
14
+ className,
15
+ )}
16
+ {...props}
17
+ />
18
+));
19
+Avatar.displayName = AvatarPrimitive.Root.displayName;
20
+
21
+const AvatarImage = React.forwardRef<
22
+ React.ElementRef<typeof AvatarPrimitive.Image>,
23
+ React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>
24
+>(({ className, ...props }, ref) => (
25
+ <AvatarPrimitive.Image
26
+ ref={ref}
27
+ className={cn("aspect-square h-full w-full", className)}
28
+ {...props}
29
+ />
30
+));
31
+AvatarImage.displayName = AvatarPrimitive.Image.displayName;
32
+
33
+const AvatarFallback = React.forwardRef<
34
+ React.ElementRef<typeof AvatarPrimitive.Fallback>,
35
+ React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>
36
+>(({ className, ...props }, ref) => (
37
+ <AvatarPrimitive.Fallback
38
+ ref={ref}
39
+ className={cn(
40
+ "flex h-full w-full items-center justify-center rounded-full bg-muted",
41
+ className,
42
+ )}
43
+ {...props}
44
+ />
45
+));
46
+AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
47
+
48
+export { Avatar, AvatarImage, AvatarFallback };
src/components/ui/badge.tsx
new
+36
@@ -0,0 +1,36 @@
1
+import * as React from "react";
2
+import { cva, type VariantProps } from "class-variance-authority";
3
+import { cn } from "@/lib/utils";
4
+
5
+const badgeVariants = cva(
6
+ "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
7
+ {
8
+ variants: {
9
+ variant: {
10
+ default:
11
+ "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
12
+ secondary:
13
+ "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
14
+ destructive:
15
+ "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
16
+ outline: "text-foreground",
17
+ },
18
+ },
19
+ defaultVariants: {
20
+ variant: "default",
21
+ },
22
+ },
23
+);
24
+
25
+export interface BadgeProps
26
+ extends
27
+ React.HTMLAttributes<HTMLDivElement>,
28
+ VariantProps<typeof badgeVariants> {}
29
+
30
+function Badge({ className, variant, ...props }: BadgeProps) {
31
+ return (
32
+ <div className={cn(badgeVariants({ variant }), className)} {...props} />
33
+ );
34
+}
35
+
36
+export { Badge, badgeVariants };
src/components/ui/button.tsx
new
+58
@@ -0,0 +1,58 @@
1
+import * as React from "react";
2
+import { Slot } from "@radix-ui/react-slot";
3
+import { cva, type VariantProps } from "class-variance-authority";
4
+
5
+import { cn } from "@/lib/utils";
6
+
7
+const buttonVariants = cva(
8
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lg text-sm font-semibold ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
9
+ {
10
+ variants: {
11
+ variant: {
12
+ default:
13
+ "bg-primary text-primary-foreground hover:bg-primary/90 shadow-sm hover:shadow-md",
14
+ destructive:
15
+ "bg-destructive text-destructive-foreground hover:bg-destructive/90 shadow-sm",
16
+ outline:
17
+ "border-2 border-primary bg-background text-foreground hover:bg-primary hover:text-primary-foreground",
18
+ secondary:
19
+ "bg-secondary text-secondary-foreground hover:bg-secondary/80",
20
+ ghost: "hover:bg-muted hover:text-foreground",
21
+ link: "text-primary underline-offset-4 hover:underline",
22
+ },
23
+ size: {
24
+ default: "h-12 px-6 py-3",
25
+ sm: "h-10 rounded-lg px-4",
26
+ lg: "h-14 rounded-lg px-8 text-base",
27
+ icon: "h-12 w-12",
28
+ },
29
+ },
30
+ defaultVariants: {
31
+ variant: "default",
32
+ size: "default",
33
+ },
34
+ },
35
+);
36
+
37
+export interface ButtonProps
38
+ extends
39
+ React.ButtonHTMLAttributes<HTMLButtonElement>,
40
+ VariantProps<typeof buttonVariants> {
41
+ asChild?: boolean;
42
+}
43
+
44
+const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
45
+ ({ className, variant, size, asChild = false, ...props }, ref) => {
46
+ const Comp = asChild ? Slot : "button";
47
+ return (
48
+ <Comp
49
+ className={cn(buttonVariants({ variant, size, className }))}
50
+ ref={ref}
51
+ {...props}
52
+ />
53
+ );
54
+ },
55
+);
56
+Button.displayName = "Button";
57
+
58
+export { Button, buttonVariants };
src/components/ui/card.tsx
new
+85
@@ -0,0 +1,85 @@
1
+import * as React from "react";
2
+import { cn } from "../../lib/utils";
3
+
4
+const Card = React.forwardRef<
5
+ HTMLDivElement,
6
+ React.HTMLAttributes<HTMLDivElement>
7
+>(({ className, ...props }, ref) => (
8
+ <div
9
+ ref={ref}
10
+ className={cn(
11
+ "rounded-lg border bg-card text-card-foreground shadow-sm",
12
+ className,
13
+ )}
14
+ {...props}
15
+ />
16
+));
17
+Card.displayName = "Card";
18
+
19
+const CardHeader = React.forwardRef<
20
+ HTMLDivElement,
21
+ React.HTMLAttributes<HTMLDivElement>
22
+>(({ className, ...props }, ref) => (
23
+ <div
24
+ ref={ref}
25
+ className={cn("flex flex-col space-y-1.5 p-6", className)}
26
+ {...props}
27
+ />
28
+));
29
+CardHeader.displayName = "CardHeader";
30
+
31
+const CardTitle = React.forwardRef<
32
+ HTMLParagraphElement,
33
+ React.HTMLAttributes<HTMLHeadingElement>
34
+>(({ className, ...props }, ref) => (
35
+ <h3
36
+ ref={ref}
37
+ className={cn(
38
+ "text-2xl font-semibold leading-none tracking-tight",
39
+ className,
40
+ )}
41
+ {...props}
42
+ />
43
+));
44
+CardTitle.displayName = "CardTitle";
45
+
46
+const CardDescription = React.forwardRef<
47
+ HTMLParagraphElement,
48
+ React.HTMLAttributes<HTMLParagraphElement>
49
+>(({ className, ...props }, ref) => (
50
+ <p
51
+ ref={ref}
52
+ className={cn("text-sm text-muted-foreground", className)}
53
+ {...props}
54
+ />
55
+));
56
+CardDescription.displayName = "CardDescription";
57
+
58
+const CardContent = React.forwardRef<
59
+ HTMLDivElement,
60
+ React.HTMLAttributes<HTMLDivElement>
61
+>(({ className, ...props }, ref) => (
62
+ <div ref={ref} className={cn("p-6 pt-0", className)} {...props} />
63
+));
64
+CardContent.displayName = "CardContent";
65
+
66
+const CardFooter = React.forwardRef<
67
+ HTMLDivElement,
68
+ React.HTMLAttributes<HTMLDivElement>
69
+>(({ className, ...props }, ref) => (
70
+ <div
71
+ ref={ref}
72
+ className={cn("flex items-center p-6 pt-0", className)}
73
+ {...props}
74
+ />
75
+));
76
+CardFooter.displayName = "CardFooter";
77
+
78
+export {
79
+ Card,
80
+ CardHeader,
81
+ CardFooter,
82
+ CardTitle,
83
+ CardDescription,
84
+ CardContent,
85
+};
src/components/ui/dialog.tsx
new
+95
@@ -0,0 +1,95 @@
1
+import * as React from "react";
2
+import * as DialogPrimitive from "@radix-ui/react-dialog";
3
+import { X } from "lucide-react";
4
+
5
+import { cn } from "@/lib/utils";
6
+
7
+const Dialog = DialogPrimitive.Root;
8
+
9
+const DialogTrigger = DialogPrimitive.Trigger;
10
+
11
+const DialogPortal = DialogPrimitive.Portal;
12
+
13
+const DialogClose = DialogPrimitive.Close;
14
+
15
+const DialogOverlay = React.forwardRef<
16
+ React.ElementRef<typeof DialogPrimitive.Overlay>,
17
+ React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>
18
+>(({ className, ...props }, ref) => (
19
+ <DialogPrimitive.Overlay
20
+ ref={ref}
21
+ className={cn(
22
+ "fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
23
+ className,
24
+ )}
25
+ {...props}
26
+ />
27
+));
28
+DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
29
+
30
+const DialogContent = React.forwardRef<
31
+ React.ElementRef<typeof DialogPrimitive.Content>,
32
+ React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>
33
+>(({ className, children, ...props }, ref) => (
34
+ <DialogPortal>
35
+ <DialogOverlay />
36
+ <DialogPrimitive.Content
37
+ ref={ref}
38
+ className={cn(
39
+ "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
40
+ className,
41
+ )}
42
+ {...props}
43
+ >
44
+ {children}
45
+ <DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity data-[state=open]:bg-accent data-[state=open]:text-muted-foreground hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none">
46
+ <X className="h-4 w-4" />
47
+ <span className="sr-only">Close</span>
48
+ </DialogPrimitive.Close>
49
+ </DialogPrimitive.Content>
50
+ </DialogPortal>
51
+));
52
+DialogContent.displayName = DialogPrimitive.Content.displayName;
53
+
54
+const DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
55
+ <div className={cn("flex flex-col space-y-1.5 text-center sm:text-left", className)} {...props} />
56
+);
57
+DialogHeader.displayName = "DialogHeader";
58
+
59
+const DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
60
+ <div className={cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className)} {...props} />
61
+);
62
+DialogFooter.displayName = "DialogFooter";
63
+
64
+const DialogTitle = React.forwardRef<
65
+ React.ElementRef<typeof DialogPrimitive.Title>,
66
+ React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>
67
+>(({ className, ...props }, ref) => (
68
+ <DialogPrimitive.Title
69
+ ref={ref}
70
+ className={cn("text-lg font-semibold leading-none tracking-tight", className)}
71
+ {...props}
72
+ />
73
+));
74
+DialogTitle.displayName = DialogPrimitive.Title.displayName;
75
+
76
+const DialogDescription = React.forwardRef<
77
+ React.ElementRef<typeof DialogPrimitive.Description>,
78
+ React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>
79
+>(({ className, ...props }, ref) => (
80
+ <DialogPrimitive.Description ref={ref} className={cn("text-sm text-muted-foreground", className)} {...props} />
81
+));
82
+DialogDescription.displayName = DialogPrimitive.Description.displayName;
83
+
84
+export {
85
+ Dialog,
86
+ DialogPortal,
87
+ DialogOverlay,
88
+ DialogClose,
89
+ DialogTrigger,
90
+ DialogContent,
91
+ DialogHeader,
92
+ DialogFooter,
93
+ DialogTitle,
94
+ DialogDescription,
95
+};
src/components/ui/input.tsx
new
+22
@@ -0,0 +1,22 @@
1
+import * as React from "react";
2
+
3
+import { cn } from "@/lib/utils";
4
+
5
+const Input = React.forwardRef<HTMLInputElement, React.ComponentProps<"input">>(
6
+ ({ className, type, ...props }, ref) => {
7
+ return (
8
+ <input
9
+ type={type}
10
+ className={cn(
11
+ "flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
12
+ className,
13
+ )}
14
+ ref={ref}
15
+ {...props}
16
+ />
17
+ );
18
+ },
19
+);
20
+Input.displayName = "Input";
21
+
22
+export { Input };
src/components/ui/label.tsx
new
+17
@@ -0,0 +1,17 @@
1
+import * as React from "react";
2
+import * as LabelPrimitive from "@radix-ui/react-label";
3
+import { cva, type VariantProps } from "class-variance-authority";
4
+
5
+import { cn } from "@/lib/utils";
6
+
7
+const labelVariants = cva("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70");
8
+
9
+const Label = React.forwardRef<
10
+ React.ElementRef<typeof LabelPrimitive.Root>,
11
+ React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & VariantProps<typeof labelVariants>
12
+>(({ className, ...props }, ref) => (
13
+ <LabelPrimitive.Root ref={ref} className={cn(labelVariants(), className)} {...props} />
14
+));
15
+Label.displayName = LabelPrimitive.Root.displayName;
16
+
17
+export { Label };
src/components/ui/select.tsx
new
+158
@@ -0,0 +1,158 @@
1
+import * as React from "react";
2
+import * as SelectPrimitive from "@radix-ui/react-select";
3
+import { Check, ChevronDown, ChevronUp } from "lucide-react";
4
+
5
+import { cn } from "@/lib/utils";
6
+
7
+const Select = SelectPrimitive.Root;
8
+
9
+const SelectGroup = SelectPrimitive.Group;
10
+
11
+const SelectValue = SelectPrimitive.Value;
12
+
13
+const SelectTrigger = React.forwardRef<
14
+ React.ElementRef<typeof SelectPrimitive.Trigger>,
15
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>
16
+>(({ className, children, ...props }, ref) => (
17
+ <SelectPrimitive.Trigger
18
+ ref={ref}
19
+ className={cn(
20
+ "flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1",
21
+ className,
22
+ )}
23
+ {...props}
24
+ >
25
+ {children}
26
+ <SelectPrimitive.Icon asChild>
27
+ <ChevronDown className="h-4 w-4 opacity-50" />
28
+ </SelectPrimitive.Icon>
29
+ </SelectPrimitive.Trigger>
30
+));
31
+SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
32
+
33
+const SelectScrollUpButton = React.forwardRef<
34
+ React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,
35
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>
36
+>(({ className, ...props }, ref) => (
37
+ <SelectPrimitive.ScrollUpButton
38
+ ref={ref}
39
+ className={cn(
40
+ "flex cursor-default items-center justify-center py-1",
41
+ className,
42
+ )}
43
+ {...props}
44
+ >
45
+ <ChevronUp className="h-4 w-4" />
46
+ </SelectPrimitive.ScrollUpButton>
47
+));
48
+SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
49
+
50
+const SelectScrollDownButton = React.forwardRef<
51
+ React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,
52
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>
53
+>(({ className, ...props }, ref) => (
54
+ <SelectPrimitive.ScrollDownButton
55
+ ref={ref}
56
+ className={cn(
57
+ "flex cursor-default items-center justify-center py-1",
58
+ className,
59
+ )}
60
+ {...props}
61
+ >
62
+ <ChevronDown className="h-4 w-4" />
63
+ </SelectPrimitive.ScrollDownButton>
64
+));
65
+SelectScrollDownButton.displayName =
66
+ SelectPrimitive.ScrollDownButton.displayName;
67
+
68
+const SelectContent = React.forwardRef<
69
+ React.ElementRef<typeof SelectPrimitive.Content>,
70
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>
71
+>(({ className, children, position = "popper", ...props }, ref) => (
72
+ <SelectPrimitive.Portal>
73
+ <SelectPrimitive.Content
74
+ ref={ref}
75
+ className={cn(
76
+ "relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
77
+ position === "popper" &&
78
+ "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
79
+ className,
80
+ )}
81
+ position={position}
82
+ {...props}
83
+ >
84
+ <SelectScrollUpButton />
85
+ <SelectPrimitive.Viewport
86
+ className={cn(
87
+ "p-1",
88
+ position === "popper" &&
89
+ "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]",
90
+ )}
91
+ >
92
+ {children}
93
+ </SelectPrimitive.Viewport>
94
+ <SelectScrollDownButton />
95
+ </SelectPrimitive.Content>
96
+ </SelectPrimitive.Portal>
97
+));
98
+SelectContent.displayName = SelectPrimitive.Content.displayName;
99
+
100
+const SelectLabel = React.forwardRef<
101
+ React.ElementRef<typeof SelectPrimitive.Label>,
102
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>
103
+>(({ className, ...props }, ref) => (
104
+ <SelectPrimitive.Label
105
+ ref={ref}
106
+ className={cn("py-1.5 pl-8 pr-2 text-sm font-semibold", className)}
107
+ {...props}
108
+ />
109
+));
110
+SelectLabel.displayName = SelectPrimitive.Label.displayName;
111
+
112
+const SelectItem = React.forwardRef<
113
+ React.ElementRef<typeof SelectPrimitive.Item>,
114
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>
115
+>(({ className, children, ...props }, ref) => (
116
+ <SelectPrimitive.Item
117
+ ref={ref}
118
+ className={cn(
119
+ "relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 focus:bg-accent focus:text-accent-foreground",
120
+ className,
121
+ )}
122
+ {...props}
123
+ >
124
+ <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
125
+ <SelectPrimitive.ItemIndicator>
126
+ <Check className="h-4 w-4" />
127
+ </SelectPrimitive.ItemIndicator>
128
+ </span>
129
+
130
+ <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
131
+ </SelectPrimitive.Item>
132
+));
133
+SelectItem.displayName = SelectPrimitive.Item.displayName;
134
+
135
+const SelectSeparator = React.forwardRef<
136
+ React.ElementRef<typeof SelectPrimitive.Separator>,
137
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>
138
+>(({ className, ...props }, ref) => (
139
+ <SelectPrimitive.Separator
140
+ ref={ref}
141
+ className={cn("-mx-1 my-1 h-px bg-muted", className)}
142
+ {...props}
143
+ />
144
+));
145
+SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
146
+
147
+export {
148
+ Select,
149
+ SelectGroup,
150
+ SelectValue,
151
+ SelectTrigger,
152
+ SelectContent,
153
+ SelectLabel,
154
+ SelectItem,
155
+ SelectSeparator,
156
+ SelectScrollUpButton,
157
+ SelectScrollDownButton,
158
+};
src/components/ui/toast.tsx
new
+127
@@ -0,0 +1,127 @@
1
+import * as React from "react";
2
+import * as ToastPrimitives from "@radix-ui/react-toast";
3
+import { cva, type VariantProps } from "class-variance-authority";
4
+import { X } from "lucide-react";
5
+
6
+import { cn } from "@/lib/utils";
7
+
8
+const ToastProvider = ToastPrimitives.Provider;
9
+
10
+const ToastViewport = React.forwardRef<
11
+ React.ElementRef<typeof ToastPrimitives.Viewport>,
12
+ React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport>
13
+>(({ className, ...props }, ref) => (
14
+ <ToastPrimitives.Viewport
15
+ ref={ref}
16
+ className={cn(
17
+ "fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]",
18
+ className,
19
+ )}
20
+ {...props}
21
+ />
22
+));
23
+ToastViewport.displayName = ToastPrimitives.Viewport.displayName;
24
+
25
+const toastVariants = cva(
26
+ "group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",
27
+ {
28
+ variants: {
29
+ variant: {
30
+ default: "border bg-background text-foreground",
31
+ destructive:
32
+ "destructive group border-destructive bg-destructive text-destructive-foreground",
33
+ },
34
+ },
35
+ defaultVariants: {
36
+ variant: "default",
37
+ },
38
+ },
39
+);
40
+
41
+const Toast = React.forwardRef<
42
+ React.ElementRef<typeof ToastPrimitives.Root>,
43
+ React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> &
44
+ VariantProps<typeof toastVariants>
45
+>(({ className, variant, ...props }, ref) => {
46
+ return (
47
+ <ToastPrimitives.Root
48
+ ref={ref}
49
+ className={cn(toastVariants({ variant }), className)}
50
+ {...props}
51
+ />
52
+ );
53
+});
54
+Toast.displayName = ToastPrimitives.Root.displayName;
55
+
56
+const ToastAction = React.forwardRef<
57
+ React.ElementRef<typeof ToastPrimitives.Action>,
58
+ React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action>
59
+>(({ className, ...props }, ref) => (
60
+ <ToastPrimitives.Action
61
+ ref={ref}
62
+ className={cn(
63
+ "inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors group-[.destructive]:border-muted/40 hover:bg-secondary group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 group-[.destructive]:focus:ring-destructive disabled:pointer-events-none disabled:opacity-50",
64
+ className,
65
+ )}
66
+ {...props}
67
+ />
68
+));
69
+ToastAction.displayName = ToastPrimitives.Action.displayName;
70
+
71
+const ToastClose = React.forwardRef<
72
+ React.ElementRef<typeof ToastPrimitives.Close>,
73
+ React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close>
74
+>(({ className, ...props }, ref) => (
75
+ <ToastPrimitives.Close
76
+ ref={ref}
77
+ className={cn(
78
+ "absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity group-hover:opacity-100 group-[.destructive]:text-red-300 hover:text-foreground group-[.destructive]:hover:text-red-50 focus:opacity-100 focus:outline-none focus:ring-2 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600",
79
+ className,
80
+ )}
81
+ toast-close=""
82
+ {...props}
83
+ >
84
+ <X className="h-4 w-4" />
85
+ </ToastPrimitives.Close>
86
+));
87
+ToastClose.displayName = ToastPrimitives.Close.displayName;
88
+
89
+const ToastTitle = React.forwardRef<
90
+ React.ElementRef<typeof ToastPrimitives.Title>,
91
+ React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title>
92
+>(({ className, ...props }, ref) => (
93
+ <ToastPrimitives.Title
94
+ ref={ref}
95
+ className={cn("text-sm font-semibold", className)}
96
+ {...props}
97
+ />
98
+));
99
+ToastTitle.displayName = ToastPrimitives.Title.displayName;
100
+
101
+const ToastDescription = React.forwardRef<
102
+ React.ElementRef<typeof ToastPrimitives.Description>,
103
+ React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description>
104
+>(({ className, ...props }, ref) => (
105
+ <ToastPrimitives.Description
106
+ ref={ref}
107
+ className={cn("text-sm opacity-90", className)}
108
+ {...props}
109
+ />
110
+));
111
+ToastDescription.displayName = ToastPrimitives.Description.displayName;
112
+
113
+type ToastProps = React.ComponentPropsWithoutRef<typeof Toast>;
114
+
115
+type ToastActionElement = React.ReactElement<typeof ToastAction>;
116
+
117
+export {
118
+ type ToastProps,
119
+ type ToastActionElement,
120
+ ToastProvider,
121
+ ToastViewport,
122
+ Toast,
123
+ ToastTitle,
124
+ ToastDescription,
125
+ ToastClose,
126
+ ToastAction,
127
+};
src/context/AccountContext.tsx
new
+102
@@ -0,0 +1,102 @@
1
+import React, { createContext, useContext, useState, useEffect } from "react";
2
+import { debug, error } from "@tauri-apps/plugin-log";
3
+import { invoke } from "@tauri-apps/api/core";
4
+import { STORE_ACCESS_TOKEN_KEY, storeAccount } from "../stores/store";
5
+import { UserInfo } from "../lib/crate/generated";
6
+
7
+type AccountContextType = {
8
+ loggedIn: boolean;
9
+ accessToken: string | undefined;
10
+ user: UserInfo | undefined;
11
+ provider: undefined | "google" | "apple";
12
+ onLoggedOut: () => void;
13
+ onLoggedIn: (provider: "google" | "apple", accessToken: string) => void;
14
+};
15
+
16
+const AccountContext = createContext<AccountContextType>({
17
+ loggedIn: false,
18
+ accessToken: undefined,
19
+ user: undefined,
20
+ provider: undefined,
21
+ onLoggedOut: () => {},
22
+ onLoggedIn: (_provider, _accessToken) => {},
23
+});
24
+
25
+enum State {
26
+ INITIALIZING,
27
+ LOADED,
28
+}
29
+
30
+export function AccountProvider({ children }: { children: React.ReactNode }) {
31
+ const [state, setState] = useState<State>(State.INITIALIZING);
32
+ const [loggedIn, setLoggedIn] = useState(false);
33
+ const [accessToken, setAccessToken] = useState<string>();
34
+ const [user, setUser] = useState<UserInfo>();
35
+ const [provider, setProvider] = useState<"google" | "apple">();
36
+
37
+ const onLoggedOut = () => {
38
+ setState(State.INITIALIZING);
39
+ storeAccount().delete(STORE_ACCESS_TOKEN_KEY);
40
+ setLoggedIn(false);
41
+ setAccessToken(undefined);
42
+ setUser(undefined);
43
+ setState(State.LOADED);
44
+ };
45
+
46
+ const onLoggedIn = async (
47
+ provider: "google" | "apple",
48
+ accessToken: string,
49
+ ) => {
50
+ setState(State.INITIALIZING);
51
+ storeAccount().set(STORE_ACCESS_TOKEN_KEY, accessToken);
52
+ const user = await invoke<UserInfo>("get_profile", {
53
+ accessToken,
54
+ });
55
+ debug(`User: ${JSON.stringify(user)}`);
56
+ setUser(user);
57
+ setProvider(provider);
58
+ setLoggedIn(true);
59
+ setState(State.LOADED);
60
+ };
61
+
62
+ const init = async () => {
63
+ try {
64
+ const accessToken = await storeAccount().get<string>(
65
+ STORE_ACCESS_TOKEN_KEY,
66
+ );
67
+ const user = await invoke<UserInfo>("get_profile", {
68
+ accessToken,
69
+ });
70
+ setUser(user);
71
+ setLoggedIn(!!accessToken);
72
+ setAccessToken(accessToken);
73
+ setState(State.LOADED);
74
+ } catch (e) {
75
+ // Force log out for now
76
+ onLoggedOut();
77
+ error(`AccountProvider: ${e}`);
78
+ setState(State.LOADED);
79
+ }
80
+ };
81
+
82
+ useEffect(() => {
83
+ init();
84
+ }, []);
85
+
86
+ return (
87
+ <AccountContext.Provider
88
+ value={{ loggedIn, accessToken, user, onLoggedOut, onLoggedIn, provider }}
89
+ >
90
+ {state === State.INITIALIZING && (
91
+ <div className="flex items-center justify-center min-h-screen">
92
+ <span>Loading...</span>
93
+ </div>
94
+ )}
95
+ {state === State.LOADED && children}
96
+ </AccountContext.Provider>
97
+ );
98
+}
99
+
100
+export function useAccount() {
101
+ return useContext(AccountContext);
102
+}
src/context/LanguageContext.tsx
new
+50
@@ -0,0 +1,50 @@
1
+import {
2
+ createContext,
3
+ useContext,
4
+ useState,
5
+ useEffect,
6
+ ReactNode,
7
+} from "react";
8
+import { translations, SupportedLanguage, Translation } from "../utils/i18n";
9
+
10
+interface LanguageContextType {
11
+ lang: SupportedLanguage;
12
+ setLang: (lang: SupportedLanguage) => void;
13
+ t: Translation;
14
+}
15
+
16
+const LanguageContext = createContext<LanguageContextType | undefined>(
17
+ undefined,
18
+);
19
+
20
+interface LanguageProviderProps {
21
+ children: ReactNode;
22
+}
23
+
24
+export function LanguageProvider({ children }: LanguageProviderProps) {
25
+ const [lang, setLang] = useState<SupportedLanguage>("en");
26
+ const t = translations[lang];
27
+
28
+ // Update HTML lang and dir attributes when language changes
29
+ useEffect(() => {
30
+ const htmlElement = document.documentElement;
31
+ const isRTL = lang === "fa";
32
+
33
+ htmlElement.lang = lang;
34
+ htmlElement.dir = isRTL ? "rtl" : "ltr";
35
+ }, [lang]);
36
+
37
+ return (
38
+ <LanguageContext.Provider value={{ lang, setLang, t }}>
39
+ {children}
40
+ </LanguageContext.Provider>
41
+ );
42
+}
43
+
44
+export function useLang(): LanguageContextType {
45
+ const context = useContext(LanguageContext);
46
+ if (context === undefined) {
47
+ throw new Error("useLang must be used within a LanguageProvider");
48
+ }
49
+ return context;
50
+}
src/hooks/use-mobile.tsx
new
+19
@@ -0,0 +1,19 @@
1
+import * as React from "react";
2
+
3
+const MOBILE_BREAKPOINT = 768;
4
+
5
+export function useIsMobile() {
6
+ const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined);
7
+
8
+ React.useEffect(() => {
9
+ const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
10
+ const onChange = () => {
11
+ setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
12
+ };
13
+ mql.addEventListener("change", onChange);
14
+ setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
15
+ return () => mql.removeEventListener("change", onChange);
16
+ }, []);
17
+
18
+ return !!isMobile;
19
+}
src/hooks/use-toast.ts
new
+188
@@ -0,0 +1,188 @@
1
+import * as React from "react";
2
+
3
+import type { ToastActionElement, ToastProps } from "@/components/ui/toast";
4
+
5
+const TOAST_LIMIT = 1;
6
+const TOAST_REMOVE_DELAY = 1000000;
7
+
8
+type ToasterToast = ToastProps & {
9
+ id: string;
10
+ title?: React.ReactNode;
11
+ description?: React.ReactNode;
12
+ action?: ToastActionElement;
13
+};
14
+
15
+const actionTypes = {
16
+ ADD_TOAST: "ADD_TOAST",
17
+ UPDATE_TOAST: "UPDATE_TOAST",
18
+ DISMISS_TOAST: "DISMISS_TOAST",
19
+ REMOVE_TOAST: "REMOVE_TOAST",
20
+} as const;
21
+
22
+let count = 0;
23
+
24
+function genId() {
25
+ count = (count + 1) % Number.MAX_SAFE_INTEGER;
26
+ return count.toString();
27
+}
28
+
29
+type ActionType = typeof actionTypes;
30
+
31
+type Action =
32
+ | {
33
+ type: ActionType["ADD_TOAST"];
34
+ toast: ToasterToast;
35
+ }
36
+ | {
37
+ type: ActionType["UPDATE_TOAST"];
38
+ toast: Partial<ToasterToast>;
39
+ }
40
+ | {
41
+ type: ActionType["DISMISS_TOAST"];
42
+ toastId?: ToasterToast["id"];
43
+ }
44
+ | {
45
+ type: ActionType["REMOVE_TOAST"];
46
+ toastId?: ToasterToast["id"];
47
+ };
48
+
49
+interface State {
50
+ toasts: ToasterToast[];
51
+}
52
+
53
+const toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>();
54
+
55
+const addToRemoveQueue = (toastId: string) => {
56
+ if (toastTimeouts.has(toastId)) {
57
+ return;
58
+ }
59
+
60
+ const timeout = setTimeout(() => {
61
+ toastTimeouts.delete(toastId);
62
+ dispatch({
63
+ type: "REMOVE_TOAST",
64
+ toastId: toastId,
65
+ });
66
+ }, TOAST_REMOVE_DELAY);
67
+
68
+ toastTimeouts.set(toastId, timeout);
69
+};
70
+
71
+export const reducer = (state: State, action: Action): State => {
72
+ switch (action.type) {
73
+ case "ADD_TOAST":
74
+ return {
75
+ ...state,
76
+ toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),
77
+ };
78
+
79
+ case "UPDATE_TOAST":
80
+ return {
81
+ ...state,
82
+ toasts: state.toasts.map((t) =>
83
+ t.id === action.toast.id ? { ...t, ...action.toast } : t,
84
+ ),
85
+ };
86
+
87
+ case "DISMISS_TOAST": {
88
+ const { toastId } = action;
89
+
90
+ // ! Side effects ! - This could be extracted into a dismissToast() action,
91
+ // but I'll keep it here for simplicity
92
+ if (toastId) {
93
+ addToRemoveQueue(toastId);
94
+ } else {
95
+ state.toasts.forEach((toast) => {
96
+ addToRemoveQueue(toast.id);
97
+ });
98
+ }
99
+
100
+ return {
101
+ ...state,
102
+ toasts: state.toasts.map((t) =>
103
+ t.id === toastId || toastId === undefined
104
+ ? {
105
+ ...t,
106
+ open: false,
107
+ }
108
+ : t,
109
+ ),
110
+ };
111
+ }
112
+ case "REMOVE_TOAST":
113
+ if (action.toastId === undefined) {
114
+ return {
115
+ ...state,
116
+ toasts: [],
117
+ };
118
+ }
119
+ return {
120
+ ...state,
121
+ toasts: state.toasts.filter((t) => t.id !== action.toastId),
122
+ };
123
+ }
124
+};
125
+
126
+const listeners: Array<(state: State) => void> = [];
127
+
128
+let memoryState: State = { toasts: [] };
129
+
130
+function dispatch(action: Action) {
131
+ memoryState = reducer(memoryState, action);
132
+ listeners.forEach((listener) => {
133
+ listener(memoryState);
134
+ });
135
+}
136
+
137
+type Toast = Omit<ToasterToast, "id">;
138
+
139
+function toast({ ...props }: Toast) {
140
+ const id = genId();
141
+
142
+ const update = (props: ToasterToast) =>
143
+ dispatch({
144
+ type: "UPDATE_TOAST",
145
+ toast: { ...props, id },
146
+ });
147
+ const dismiss = () => dispatch({ type: "DISMISS_TOAST", toastId: id });
148
+
149
+ dispatch({
150
+ type: "ADD_TOAST",
151
+ toast: {
152
+ ...props,
153
+ id,
154
+ open: true,
155
+ onOpenChange: (open) => {
156
+ if (!open) dismiss();
157
+ },
158
+ },
159
+ });
160
+
161
+ return {
162
+ id: id,
163
+ dismiss,
164
+ update,
165
+ };
166
+}
167
+
168
+function useToast() {
169
+ const [state, setState] = React.useState<State>(memoryState);
170
+
171
+ React.useEffect(() => {
172
+ listeners.push(setState);
173
+ return () => {
174
+ const index = listeners.indexOf(setState);
175
+ if (index > -1) {
176
+ listeners.splice(index, 1);
177
+ }
178
+ };
179
+ }, [state]);
180
+
181
+ return {
182
+ ...state,
183
+ toast,
184
+ dismiss: (toastId?: string) => dispatch({ type: "DISMISS_TOAST", toastId }),
185
+ };
186
+}
187
+
188
+export { useToast, toast };
src/index.css
new
+168
@@ -0,0 +1,168 @@
1
+@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap");
2
+
3
+@tailwind base;
4
+@tailwind components;
5
+@tailwind utilities;
6
+
7
+/* RTL Support */
8
+[dir="rtl"] {
9
+ direction: rtl;
10
+}
11
+
12
+[dir="ltr"] {
13
+ direction: ltr;
14
+}
15
+
16
+/* RTL-specific adjustments */
17
+[dir="rtl"] .space-x-reverse > * + * {
18
+ margin-right: var(--tw-space-x-reverse);
19
+ margin-left: calc(var(--tw-space-x-reverse) * 0);
20
+}
21
+
22
+::-webkit-scrollbar {
23
+ width: 0px;
24
+ display: none;
25
+}
26
+
27
+/* Disable zoom */
28
+:root {
29
+ touch-action: pan-x pan-y;
30
+ height: 100%;
31
+}
32
+
33
+/* Safe Area Support */
34
+.safe-area {
35
+ padding-top: env(safe-area-inset-top);
36
+ padding-bottom: env(safe-area-inset-bottom);
37
+ padding-left: env(safe-area-inset-left);
38
+ padding-right: env(safe-area-inset-right);
39
+}
40
+
41
+.top-nav-safe {
42
+ padding-top: max(0.5rem, env(safe-area-inset-top));
43
+}
44
+
45
+/* Optional: Give bottom nav extra safe-area padding */
46
+.bottom-nav-safe {
47
+ padding-bottom: max(0.5rem, env(safe-area-inset-bottom));
48
+}
49
+
50
+/* Animations */
51
+@layer utilities {
52
+ .fade-in {
53
+ animation: fadeIn 0.6s cubic-bezier(0.4, 0, 0.2, 1);
54
+ }
55
+ @keyframes fadeIn {
56
+ from {
57
+ opacity: 0;
58
+ transform: translateY(12px);
59
+ }
60
+ to {
61
+ opacity: 1;
62
+ transform: translateY(0);
63
+ }
64
+ }
65
+ .wiggle {
66
+ animation: wiggle 0.25s linear;
67
+ }
68
+ @keyframes wiggle {
69
+ 0% {
70
+ transform: rotate(-2deg);
71
+ }
72
+ 25% {
73
+ transform: rotate(2deg);
74
+ }
75
+ 50% {
76
+ transform: rotate(-2deg);
77
+ }
78
+ 75% {
79
+ transform: rotate(2deg);
80
+ }
81
+ 100% {
82
+ transform: rotate(0);
83
+ }
84
+ }
85
+}
86
+
87
+@layer base {
88
+ :root {
89
+ --background: 0 0% 100%;
90
+ --foreground: 220 26% 14%;
91
+
92
+ --card: 0 0% 100%;
93
+ --card-foreground: 220 26% 14%;
94
+
95
+ --popover: 0 0% 100%;
96
+ --popover-foreground: 220 26% 14%;
97
+
98
+ /* Wise signature lime green */
99
+ --primary: 93 72% 67%;
100
+ --primary-foreground: 220 26% 14%;
101
+
102
+ /* Dark navy */
103
+ --secondary: 220 26% 14%;
104
+ --secondary-foreground: 0 0% 100%;
105
+
106
+ --muted: 220 14% 96%;
107
+ --muted-foreground: 220 13% 46%;
108
+
109
+ --accent: 93 72% 67%;
110
+ --accent-foreground: 220 26% 14%;
111
+
112
+ --destructive: 0 84% 60%;
113
+ --destructive-foreground: 0 0% 100%;
114
+
115
+ --border: 220 13% 91%;
116
+ --input: 220 13% 91%;
117
+ --ring: 93 72% 67%;
118
+
119
+ --radius: 0.75rem;
120
+
121
+ /* Custom colors */
122
+ --navy: 220 26% 14%;
123
+ --navy-light: 220 20% 20%;
124
+ --lime: 93 72% 67%;
125
+ --lime-dark: 93 60% 55%;
126
+ --gray-warm: 220 14% 96%;
127
+ }
128
+
129
+ .dark {
130
+ --background: 220 26% 14%;
131
+ --foreground: 0 0% 98%;
132
+
133
+ --card: 220 20% 18%;
134
+ --card-foreground: 0 0% 98%;
135
+
136
+ --popover: 220 20% 18%;
137
+ --popover-foreground: 0 0% 98%;
138
+
139
+ --primary: 93 72% 67%;
140
+ --primary-foreground: 220 26% 14%;
141
+
142
+ --secondary: 220 20% 22%;
143
+ --secondary-foreground: 0 0% 98%;
144
+
145
+ --muted: 220 20% 22%;
146
+ --muted-foreground: 220 13% 65%;
147
+
148
+ --accent: 93 72% 67%;
149
+ --accent-foreground: 220 26% 14%;
150
+
151
+ --destructive: 0 62% 30%;
152
+ --destructive-foreground: 0 0% 98%;
153
+
154
+ --border: 220 20% 22%;
155
+ --input: 220 20% 22%;
156
+ --ring: 93 72% 67%;
157
+ }
158
+}
159
+
160
+@layer base {
161
+ * {
162
+ @apply border-border;
163
+ }
164
+
165
+ body {
166
+ @apply bg-background text-foreground;
167
+ }
168
+}
src/lib/crate/generated.ts
new
+27
@@ -0,0 +1,27 @@
1
+/* This file is generated and managed by tsync */
2
+
3
+export interface TokenResponse {
4
+ access_token: string;
5
+ expires_in: number;
6
+ refresh_token?: string;
7
+ refresh_token_expires_in?: string;
8
+ scope: string;
9
+ token_type: string;
10
+}
11
+
12
+export interface OauthRedirect {
13
+ code: string;
14
+ scope: string;
15
+ authuser: number;
16
+ prompt: string;
17
+}
18
+
19
+export interface UserInfo {
20
+ id: string;
21
+ email: string;
22
+ verified_email: boolean;
23
+ name: string;
24
+ given_name: string;
25
+ family_name: string;
26
+ picture: string;
27
+}
src/lib/utils.ts
new
+6
@@ -0,0 +1,6 @@
1
+import { clsx, type ClassValue } from "clsx";
2
+import { twMerge } from "tailwind-merge";
3
+
4
+export function cn(...inputs: ClassValue[]) {
5
+ return twMerge(clsx(inputs));
6
+}
src/main.tsx
new
+16
@@ -0,0 +1,16 @@
1
+import React from "react";
2
+import ReactDOM from "react-dom/client";
3
+import { BrowserRouter } from "react-router-dom";
4
+import App from "./App";
5
+import "./index.css";
6
+import { LanguageProvider } from "./context/LanguageContext";
7
+
8
+ReactDOM.createRoot(document.getElementById("root")!).render(
9
+ <React.StrictMode>
10
+ <LanguageProvider>
11
+ <BrowserRouter>
12
+ <App />
13
+ </BrowserRouter>
14
+ </LanguageProvider>
15
+ </React.StrictMode>,
16
+);
src/pages/Home.tsx
new
+154
@@ -0,0 +1,154 @@
1
+import { useEffect, useState } from "react";
2
+import { useNavigate } from "react-router-dom";
3
+import { Card } from "@/components/ui/card";
4
+import { Badge } from "@/components/ui/badge";
5
+import { ArrowUpRight, ArrowDownRight, Plus } from "lucide-react";
6
+import { Button } from "@/components/ui/button";
7
+import { transactionService } from "@/services/transactionService";
8
+import { Transaction } from "@/types/transaction";
9
+import { formatDistanceToNow } from "date-fns";
10
+import { useLang } from "@/context/LanguageContext";
11
+import { useAccount } from "@/context/AccountContext";
12
+
13
+const Home = () => {
14
+ const navigate = useNavigate();
15
+ const { t, lang } = useLang();
16
+ const [transactions, setTransactions] = useState<Transaction[]>([]);
17
+ const [loading, setLoading] = useState(true);
18
+ const balance = transactionService.getBalance();
19
+ const isRTL = lang === "fa";
20
+ const { loggedIn, user } = useAccount();
21
+
22
+ useEffect(() => {
23
+ const loadTransactions = async () => {
24
+ const data = await transactionService.getTransactions();
25
+ setTransactions(data);
26
+ setLoading(false);
27
+ };
28
+ loadTransactions();
29
+ }, [user]);
30
+
31
+ return (
32
+ <div className="p-4 space-y-6" dir={isRTL ? "rtl" : "ltr"}>
33
+ {!loggedIn && (
34
+ <Card className="p-8 bg-card border-0 shadow-lg">
35
+ <div className="space-y-2">Login to see your account</div>
36
+ </Card>
37
+ )}
38
+ {/* LOGGED IN */}
39
+ {user && (
40
+ <>
41
+ {/* Balance Card */}
42
+ <Card className="p-8 bg-card border-0 shadow-lg">
43
+ <div className="space-y-2">
44
+ <p className="text-sm text-muted-foreground font-medium">
45
+ {t.availableBalance}
46
+ </p>
47
+ <h2 className="text-5xl font-bold tracking-tight">
48
+ ${balance.toFixed(2)}
49
+ </h2>
50
+ </div>
51
+ <div className="mt-8">
52
+ <Button
53
+ size="lg"
54
+ className="w-full"
55
+ onClick={() => navigate("/send")}
56
+ >
57
+ <Plus className={`h-5 w-5 ${isRTL ? "ml-2" : "mr-2"}`} />
58
+ {t.sendMoney}
59
+ </Button>
60
+ </div>
61
+ </Card>
62
+
63
+ {/* Stats */}
64
+ <div className="grid grid-cols-2 gap-4">
65
+ <Card className="p-6 border-0 shadow-md">
66
+ <div className="space-y-2">
67
+ <p className="text-sm text-muted-foreground font-medium">
68
+ {t.thisMonth}
69
+ </p>
70
+ <p className="text-3xl font-bold text-foreground">$985</p>
71
+ <div className="flex items-center gap-1 text-expense-negative text-sm font-medium">
72
+ <ArrowUpRight className="h-4 w-4" />
73
+ <span>{t.spent}</span>
74
+ </div>
75
+ </div>
76
+ </Card>
77
+ <Card className="p-6 border-0 shadow-md">
78
+ <div className="space-y-2">
79
+ <p className="text-sm text-muted-foreground font-medium">
80
+ {t.saved}
81
+ </p>
82
+ <p className="text-3xl font-bold text-foreground">$450</p>
83
+ <div className="flex items-center gap-1 text-expense-positive text-sm font-medium">
84
+ <ArrowDownRight className="h-4 w-4" />
85
+ <span>{t.thisMonth}</span>
86
+ </div>
87
+ </div>
88
+ </Card>
89
+ </div>
90
+
91
+ {/* Recent Transactions */}
92
+ <div className="space-y-4">
93
+ <h3 className="text-xl font-bold">{t.recentTransactions}</h3>
94
+ {loading ? (
95
+ <Card className="p-8 border-0 shadow-md text-center">
96
+ <p className="text-muted-foreground">{t.loadingTransactions}</p>
97
+ </Card>
98
+ ) : transactions.length === 0 ? (
99
+ <Card className="p-8 border-0 shadow-md text-center">
100
+ <p className="text-muted-foreground">{t.noTransactions}</p>
101
+ </Card>
102
+ ) : (
103
+ <div className="space-y-3">
104
+ {transactions.map((transaction) => (
105
+ <Card
106
+ key={transaction.id}
107
+ className="p-5 border-0 shadow-md hover:shadow-lg transition-all cursor-pointer"
108
+ >
109
+ <div className="flex items-center justify-between">
110
+ <div className="flex-1">
111
+ <div className="flex items-center gap-3 mb-1">
112
+ <p className="font-semibold text-base">
113
+ {transaction.recipientName}
114
+ </p>
115
+ {transaction.status === "processing" && (
116
+ <Badge
117
+ variant="outline"
118
+ className="text-xs font-medium border-2"
119
+ >
120
+ {t.processing}
121
+ </Badge>
122
+ )}
123
+ {transaction.status === "pending" && (
124
+ <Badge
125
+ variant="outline"
126
+ className="text-xs font-medium border-2 border-yellow-500"
127
+ >
128
+ {t.pending}
129
+ </Badge>
130
+ )}
131
+ </div>
132
+ <p className="text-sm text-muted-foreground font-medium">
133
+ {transaction.description || t.payment} ·{" "}
134
+ {formatDistanceToNow(transaction.timestamp, {
135
+ addSuffix: true,
136
+ })}
137
+ </p>
138
+ </div>
139
+ <p className="text-xl font-bold text-foreground">
140
+ -{transaction.currency} {transaction.amount.toFixed(2)}
141
+ </p>
142
+ </div>
143
+ </Card>
144
+ ))}
145
+ </div>
146
+ )}
147
+ </div>
148
+ </>
149
+ )}
150
+ </div>
151
+ );
152
+};
153
+
154
+export default Home;
src/pages/Pay.tsx
new
+148
@@ -0,0 +1,148 @@
1
+import { useNavigate } from "react-router-dom";
2
+import { Card } from "@/components/ui/card";
3
+import { Send, Download, QrCode, Users } from "lucide-react";
4
+import { useLang } from "@/context/LanguageContext";
5
+import { useAccount } from "@/context/AccountContext";
6
+
7
+const linkedCards = [
8
+ {
9
+ id: 1,
10
+ name: "Business Visa",
11
+ last4: "4242",
12
+ type: "Visa",
13
+ primary: true,
14
+ },
15
+ {
16
+ id: 2,
17
+ name: "Corporate Amex",
18
+ last4: "8888",
19
+ type: "Amex",
20
+ primary: false,
21
+ },
22
+];
23
+
24
+const Pay = () => {
25
+ const navigate = useNavigate();
26
+ const { t, lang } = useLang();
27
+ const isRTL = lang === "fa";
28
+ const { loggedIn, user } = useAccount();
29
+
30
+ const quickActions = [
31
+ {
32
+ id: 1,
33
+ name: t.sendMoneyAction,
34
+ description: t.sendMoneyDesc,
35
+ icon: Send,
36
+ color: "text-primary",
37
+ route: "/send",
38
+ },
39
+ {
40
+ id: 2,
41
+ name: t.requestMoney,
42
+ description: t.requestMoneyDesc,
43
+ icon: Download,
44
+ color: "text-accent",
45
+ route: "/request",
46
+ },
47
+ {
48
+ id: 3,
49
+ name: t.qrCode,
50
+ description: t.qrCodeDesc,
51
+ icon: QrCode,
52
+ color: "text-expense-positive",
53
+ route: "/qr",
54
+ },
55
+ {
56
+ id: 4,
57
+ name: t.recipients,
58
+ description: t.recipientsDesc,
59
+ icon: Users,
60
+ color: "text-muted-foreground",
61
+ route: "/recipients",
62
+ },
63
+ ];
64
+
65
+ return (
66
+ <div className="p-4 space-y-6" dir={isRTL ? "rtl" : "ltr"}>
67
+ {!loggedIn && (
68
+ <Card className="p-8 bg-card border-0 shadow-lg">
69
+ <div className="space-y-2">Login to see your account</div>
70
+ </Card>
71
+ )}
72
+ {/* LOGGED IN */}
73
+ {user && (
74
+ <>
75
+ {/* Quick Actions */}
76
+ <div>
77
+ <h3 className="text-xl font-bold mb-4">{t.quickActions}</h3>
78
+ <div className="grid grid-cols-2 gap-4">
79
+ {quickActions.map((action) => (
80
+ <Card
81
+ key={action.id}
82
+ className="p-6 hover:shadow-lg transition-all cursor-pointer border-0 shadow-md active:scale-95"
83
+ onClick={() => navigate(action.route)}
84
+ >
85
+ <div className="space-y-4">
86
+ <action.icon className={`h-10 w-10 ${action.color}`} />
87
+ <div>
88
+ <p className="font-semibold text-base mb-1">
89
+ {action.name}
90
+ </p>
91
+ <p className="text-xs text-muted-foreground font-medium">
92
+ {action.description}
93
+ </p>
94
+ </div>
95
+ </div>
96
+ </Card>
97
+ ))}
98
+ </div>
99
+ </div>
100
+
101
+ {/* Recent Recipients */}
102
+ <div>
103
+ <h3 className="text-xl font-bold mb-4">{t.recentRecipients}</h3>
104
+ <div className="space-y-3">
105
+ {linkedCards.map((card) => (
106
+ <Card
107
+ key={card.id}
108
+ className="p-5 cursor-pointer hover:shadow-lg transition-all border-0 shadow-md"
109
+ >
110
+ <div className="flex items-center gap-4">
111
+ <div className="h-14 w-14 rounded-full bg-primary/10 flex items-center justify-center">
112
+ <span className="text-xl font-bold text-primary">
113
+ {card.name.charAt(0)}
114
+ </span>
115
+ </div>
116
+ <div className="flex-1">
117
+ <p className="font-semibold text-base">{card.name}</p>
118
+ <p className="text-sm text-muted-foreground font-medium">
119
+ {card.type} {t.account}
120
+ </p>
121
+ </div>
122
+ </div>
123
+ </Card>
124
+ ))}
125
+ </div>
126
+ </div>
127
+
128
+ {/* Quick Transfer */}
129
+ <Card className="p-8 bg-card border-0 shadow-md">
130
+ <div className="text-center space-y-4">
131
+ <div className="h-32 w-32 mx-auto bg-muted rounded-2xl flex items-center justify-center">
132
+ <QrCode className="h-20 w-20 text-foreground" />
133
+ </div>
134
+ <div>
135
+ <h4 className="font-bold text-lg mb-2">{t.quickPayQR}</h4>
136
+ <p className="text-sm text-muted-foreground font-medium">
137
+ {t.quickPayQRDesc}
138
+ </p>
139
+ </div>
140
+ </div>
141
+ </Card>
142
+ </>
143
+ )}
144
+ </div>
145
+ );
146
+};
147
+
148
+export default Pay;
src/pages/Profile.tsx
new
+231
@@ -0,0 +1,231 @@
1
+import { Card } from "@/components/ui/card";
2
+import { Avatar, AvatarFallback } from "@/components/ui/avatar";
3
+import {
4
+ Settings,
5
+ Bell,
6
+ Shield,
7
+ HelpCircle,
8
+ FileText,
9
+ LogOut,
10
+ ChevronRight,
11
+} from "lucide-react";
12
+import { Button } from "@/components/ui/button";
13
+import { useLang } from "@/context/LanguageContext";
14
+import { useAccount } from "@/context/AccountContext";
15
+import haptics from "@/utils/haptics";
16
+import { useEffect } from "react";
17
+import { debug, error } from "@tauri-apps/plugin-log";
18
+import { invoke } from "@tauri-apps/api/core";
19
+import { OauthRedirect, TokenResponse } from "@/lib/crate/generated";
20
+import { listen } from "@tauri-apps/api/event";
21
+import { openUrl } from "@tauri-apps/plugin-opener";
22
+
23
+const Profile = () => {
24
+ const { t, lang } = useLang();
25
+ const isRTL = lang === "fa";
26
+ const { onLoggedIn, loggedIn, user, onLoggedOut } = useAccount();
27
+
28
+ const menuItems = [
29
+ {
30
+ section: t.accountSection,
31
+ items: [
32
+ { icon: Settings, label: t.settings, to: "/settings" },
33
+ { icon: Bell, label: t.notifications, to: "/notifications" },
34
+ { icon: Shield, label: t.security, to: "/security" },
35
+ ],
36
+ },
37
+ {
38
+ section: t.supportSection,
39
+ items: [
40
+ { icon: HelpCircle, label: t.helpCenter, to: "/help" },
41
+ { icon: FileText, label: t.termsPrivacy, to: "/terms" },
42
+ ],
43
+ },
44
+ ];
45
+
46
+ const handleOAuthLogin = async (provider: "google" | "apple") => {
47
+ try {
48
+ // Handle all operations in the Rust backend.
49
+ const port = await invoke<number>("start_server");
50
+ debug(`OAuth server started on port ${port}`);
51
+ // Tauri OAuth plugin server.
52
+ const redirectUri = `http://localhost:${port}`;
53
+ if (provider === "google") {
54
+ const baseUrl = await invoke<string>("get_consent_url", {
55
+ redirectUri,
56
+ });
57
+ debug(`Google OAuth URL: ${baseUrl}`);
58
+ await openUrl(baseUrl);
59
+ }
60
+ } catch (e) {
61
+ error(`Error: ${e}`);
62
+ }
63
+ };
64
+
65
+ const handleLogout = async () => {
66
+ onLoggedOut();
67
+ };
68
+
69
+ const init = async () => {
70
+ try {
71
+ // Listen for OAuth emitted events from the Rust backend.
72
+ await listen<OauthRedirect>("oauth_redirect_uri", async (event) => {
73
+ debug(
74
+ `Received OAuth redirect event: ${JSON.stringify(event.payload)}`,
75
+ );
76
+ const oauthRedirect = event.payload;
77
+ // Handle the redirect event here
78
+ try {
79
+ const res = await invoke<TokenResponse>("get_token", {
80
+ oauthRedirect,
81
+ });
82
+ debug(`OAuth response: ${JSON.stringify(res)}`);
83
+ onLoggedIn("google", res.access_token);
84
+ } catch (e) {
85
+ error(`Error processing OAuth response: ${JSON.stringify(e)}`);
86
+ }
87
+ });
88
+ } catch (e) {
89
+ error(`Error listening OAuth event: ${e}`);
90
+ }
91
+ };
92
+
93
+ useEffect(() => {
94
+ init();
95
+ // eslint-disable-next-line react-hooks/exhaustive-deps
96
+ }, [loggedIn]);
97
+
98
+ return (
99
+ <div className="p-4 space-y-6" dir={isRTL ? "rtl" : "ltr"}>
100
+ {!loggedIn && (
101
+ <div className="px-8 py-4 mt-2 w-full max-w-xs">
102
+ <button
103
+ onClick={async () => {
104
+ await haptics.buttonPress();
105
+ await handleOAuthLogin("google");
106
+ }}
107
+ className="w-full bg-white hover:bg-gray-50 active:bg-gray-100 text-gray-700 font-medium rounded-lg px-4 py-3 flex items-center justify-center gap-3 transition-colors border border-gray-300 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 shadow-sm"
108
+ aria-label={t.googleOAuthLogin}
109
+ >
110
+ <svg
111
+ className="w-5 h-5"
112
+ viewBox="0 0 24 24"
113
+ xmlns="http://www.w3.org/2000/svg"
114
+ >
115
+ <path
116
+ d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"
117
+ fill="#4285F4"
118
+ />
119
+ <path
120
+ d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"
121
+ fill="#34A853"
122
+ />
123
+ <path
124
+ d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"
125
+ fill="#FBBC05"
126
+ />
127
+ <path
128
+ d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"
129
+ fill="#EA4335"
130
+ />
131
+ </svg>
132
+ <span className="text-sm font-medium leading-none">
133
+ {t.googleOAuthLogin}
134
+ </span>
135
+ </button>
136
+ </div>
137
+ )}
138
+ {/* LOGGED IN */}
139
+ {user && (
140
+ <>
141
+ {/* Profile Header */}
142
+ <Card className="p-8 border-0 shadow-lg">
143
+ <div className="flex items-center gap-5">
144
+ <Avatar className="h-24 w-24">
145
+ <AvatarFallback className="bg-primary text-primary-foreground text-3xl font-bold">
146
+ <img
147
+ src={user.picture}
148
+ alt="Avatar"
149
+ className="w-24 h-24 mb-4 rounded-full border-4 border-food-orange bg-gradient-to-br from-food-orange to-food-red "
150
+ />
151
+ </AvatarFallback>
152
+ </Avatar>
153
+ <div className="flex-1">
154
+ <h2 className="text-2xl font-bold mb-1">{user.name}</h2>
155
+ <p className="text-sm text-muted-foreground font-medium">
156
+ {user.email}
157
+ </p>
158
+ <p className="text-sm text-muted-foreground font-medium mt-1">
159
+ ID: EMP-001
160
+ </p>
161
+ </div>
162
+ </div>
163
+ </Card>
164
+
165
+ {/* Stats */}
166
+ <div className="grid grid-cols-3 gap-4">
167
+ <Card className="p-5 text-center border-0 shadow-md">
168
+ <p className="text-3xl font-bold text-foreground">24</p>
169
+ <p className="text-xs text-muted-foreground mt-2 font-medium">
170
+ {t.expenses}
171
+ </p>
172
+ </Card>
173
+ <Card className="p-5 text-center border-0 shadow-md">
174
+ <p className="text-xl font-bold text-expense-positive">$2.4K</p>
175
+ <p className="text-xs text-muted-foreground mt-2 font-medium">
176
+ {t.approved}
177
+ </p>
178
+ </Card>
179
+ <Card className="p-5 text-center border-0 shadow-md">
180
+ <p className="text-3xl font-bold text-foreground">3</p>
181
+ <p className="text-xs text-muted-foreground mt-2 font-medium">
182
+ {t.pending}
183
+ </p>
184
+ </Card>
185
+ </div>
186
+
187
+ {/* Menu Sections */}
188
+ {menuItems.map((section) => (
189
+ <div key={section.section} className="space-y-3">
190
+ <h3 className="text-sm font-bold text-muted-foreground px-1 uppercase tracking-wider">
191
+ {section.section}
192
+ </h3>
193
+ <Card className="divide-y border-0 shadow-md">
194
+ {section.items.map((item) => (
195
+ <button
196
+ key={item.label}
197
+ className="w-full px-5 py-4 flex items-center justify-between hover:bg-muted/50 transition-colors first:rounded-t-lg last:rounded-b-lg"
198
+ >
199
+ <div className="flex items-center gap-4">
200
+ <item.icon className="h-5 w-5 text-muted-foreground" />
201
+ <span className="font-semibold">{item.label}</span>
202
+ </div>
203
+ <ChevronRight
204
+ className={`h-5 w-5 text-muted-foreground ${isRTL ? "rotate-180" : ""}`}
205
+ />
206
+ </button>
207
+ ))}
208
+ </Card>
209
+ </div>
210
+ ))}
211
+
212
+ {/* Logout Button */}
213
+ <Button
214
+ variant="outline"
215
+ className="w-full"
216
+ size="lg"
217
+ onClick={handleLogout}
218
+ >
219
+ <LogOut className={`h-5 w-5 ${isRTL ? "ml-2" : "mr-2"}`} />
220
+ {t.logOut}
221
+ </Button>
222
+ </>
223
+ )}
224
+ <div className="text-center text-sm text-muted-foreground font-medium pb-4">
225
+ {t.version} 1.0.0
226
+ </div>
227
+ </div>
228
+ );
229
+};
230
+
231
+export default Profile;
src/pages/Recipients.tsx
new
+323
@@ -0,0 +1,323 @@
1
+import { useState, useEffect } from "react";
2
+import { useNavigate } from "react-router-dom";
3
+import { Card } from "@/components/ui/card";
4
+import { Button } from "@/components/ui/button";
5
+import { Input } from "@/components/ui/input";
6
+import { Label } from "@/components/ui/label";
7
+import { useLang } from "@/context/LanguageContext";
8
+import {
9
+ Dialog,
10
+ DialogContent,
11
+ DialogDescription,
12
+ DialogFooter,
13
+ DialogHeader,
14
+ DialogTitle,
15
+} from "@/components/ui/dialog";
16
+import {
17
+ AlertDialog,
18
+ AlertDialogAction,
19
+ AlertDialogCancel,
20
+ AlertDialogContent,
21
+ AlertDialogDescription,
22
+ AlertDialogFooter,
23
+ AlertDialogHeader,
24
+ AlertDialogTitle,
25
+} from "@/components/ui/alert-dialog";
26
+import { Plus, Pencil, Trash2, Send } from "lucide-react";
27
+import { transactionService } from "@/services/transactionService";
28
+import { Recipient } from "@/types/transaction";
29
+import { toast } from "@/hooks/use-toast";
30
+
31
+const Recipients = () => {
32
+ const navigate = useNavigate();
33
+ const { t, lang } = useLang();
34
+ const isRTL = lang === "fa";
35
+ const [recipients, setRecipients] = useState<Recipient[]>([]);
36
+ const [loading, setLoading] = useState(true);
37
+ const [dialogOpen, setDialogOpen] = useState(false);
38
+ const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
39
+ const [editingRecipient, setEditingRecipient] = useState<Recipient | null>(
40
+ null,
41
+ );
42
+ const [deletingRecipient, setDeletingRecipient] = useState<Recipient | null>(
43
+ null,
44
+ );
45
+ const [name, setName] = useState("");
46
+ const [email, setEmail] = useState("");
47
+ const [saving, setSaving] = useState(false);
48
+
49
+ useEffect(() => {
50
+ loadRecipients();
51
+ }, []);
52
+
53
+ const loadRecipients = async () => {
54
+ setLoading(true);
55
+ const data = await transactionService.getRecipients();
56
+ setRecipients(data);
57
+ setLoading(false);
58
+ };
59
+
60
+ const handleOpenDialog = (recipient?: Recipient) => {
61
+ if (recipient) {
62
+ setEditingRecipient(recipient);
63
+ setName(recipient.name);
64
+ setEmail(recipient.email);
65
+ } else {
66
+ setEditingRecipient(null);
67
+ setName("");
68
+ setEmail("");
69
+ }
70
+ setDialogOpen(true);
71
+ };
72
+
73
+ const handleCloseDialog = () => {
74
+ setDialogOpen(false);
75
+ setEditingRecipient(null);
76
+ setName("");
77
+ setEmail("");
78
+ };
79
+
80
+ const handleSave = async () => {
81
+ if (!name.trim() || !email.trim()) {
82
+ toast({
83
+ title: t.missingInfo,
84
+ description: t.fillAllFields,
85
+ variant: "destructive",
86
+ });
87
+ return;
88
+ }
89
+
90
+ // Basic email validation
91
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
92
+ if (!emailRegex.test(email)) {
93
+ toast({
94
+ title: t.invalidEmail,
95
+ description: t.validEmailAddress,
96
+ variant: "destructive",
97
+ });
98
+ return;
99
+ }
100
+
101
+ setSaving(true);
102
+ try {
103
+ if (editingRecipient) {
104
+ await transactionService.updateRecipient(
105
+ editingRecipient.id,
106
+ name,
107
+ email,
108
+ );
109
+ toast({
110
+ title: t.recipientUpdated,
111
+ description: t.recipientUpdatedDesc(name),
112
+ });
113
+ } else {
114
+ await transactionService.addRecipient(name, email);
115
+ toast({
116
+ title: t.recipientAdded,
117
+ description: t.recipientAddedDesc(name),
118
+ });
119
+ }
120
+ await loadRecipients();
121
+ handleCloseDialog();
122
+ } catch (error) {
123
+ toast({
124
+ title: t.error,
125
+ description: t.failedSaveRecipient,
126
+ variant: "destructive",
127
+ });
128
+ } finally {
129
+ setSaving(false);
130
+ }
131
+ };
132
+
133
+ const handleDelete = async () => {
134
+ if (!deletingRecipient) return;
135
+
136
+ try {
137
+ await transactionService.deleteRecipient(deletingRecipient.id);
138
+ toast({
139
+ title: t.recipientDeleted,
140
+ description: t.recipientDeletedDesc(deletingRecipient.name),
141
+ });
142
+ await loadRecipients();
143
+ setDeleteDialogOpen(false);
144
+ setDeletingRecipient(null);
145
+ } catch (error) {
146
+ toast({
147
+ title: t.error,
148
+ description: t.failedDeleteRecipient,
149
+ variant: "destructive",
150
+ });
151
+ }
152
+ };
153
+
154
+ const openDeleteDialog = (recipient: Recipient) => {
155
+ setDeletingRecipient(recipient);
156
+ setDeleteDialogOpen(true);
157
+ };
158
+
159
+ return (
160
+ <>
161
+ <div className="p-4 space-y-6" dir={isRTL ? "rtl" : "ltr"}>
162
+ {/* Header */}
163
+ <div className="flex items-center justify-between">
164
+ <div>
165
+ <h2 className="text-2xl font-bold">{t.paymentRecipients}</h2>
166
+ <p className="text-sm text-muted-foreground font-medium mt-1">
167
+ {t.manageContacts}
168
+ </p>
169
+ </div>
170
+ <Button onClick={() => handleOpenDialog()}>
171
+ <Plus className={`h-5 w-5 ${isRTL ? "ml-2" : "mr-2"}`} />
172
+ {t.add}
173
+ </Button>
174
+ </div>
175
+
176
+ {/* Recipients List */}
177
+ {loading ? (
178
+ <Card className="p-8 border-0 shadow-md text-center">
179
+ <p className="text-muted-foreground">{t.loadingRecipients}</p>
180
+ </Card>
181
+ ) : recipients.length === 0 ? (
182
+ <Card className="p-12 border-0 shadow-md text-center space-y-4">
183
+ <div className="h-20 w-20 rounded-full bg-muted mx-auto flex items-center justify-center">
184
+ <Plus className="h-10 w-10 text-muted-foreground" />
185
+ </div>
186
+ <div>
187
+ <h3 className="text-lg font-bold mb-2">{t.noRecipientsYet}</h3>
188
+ <p className="text-sm text-muted-foreground font-medium mb-4">
189
+ {t.addFirstRecipient}
190
+ </p>
191
+ <Button onClick={() => handleOpenDialog()}>
192
+ <Plus className={`h-5 w-5 ${isRTL ? "ml-2" : "mr-2"}`} />
193
+ {t.addRecipient}
194
+ </Button>
195
+ </div>
196
+ </Card>
197
+ ) : (
198
+ <div className="space-y-3">
199
+ {recipients.map((recipient) => (
200
+ <Card
201
+ key={recipient.id}
202
+ className="p-5 border-0 shadow-md hover:shadow-lg transition-all"
203
+ >
204
+ <div className="flex items-center gap-4">
205
+ <div className="h-14 w-14 rounded-full bg-primary/10 flex items-center justify-center flex-shrink-0">
206
+ <span className="text-xl font-bold text-primary">
207
+ {recipient.name.charAt(0).toUpperCase()}
208
+ </span>
209
+ </div>
210
+ <div className="flex-1 min-w-0">
211
+ <p className="font-semibold text-base truncate">
212
+ {recipient.name}
213
+ </p>
214
+ <p className="text-sm text-muted-foreground font-medium truncate">
215
+ {recipient.email}
216
+ </p>
217
+ </div>
218
+ <div className="flex items-center gap-2 flex-shrink-0">
219
+ <Button
220
+ size="icon"
221
+ variant="ghost"
222
+ onClick={() =>
223
+ navigate("/send", { state: { recipient } })
224
+ }
225
+ className="h-10 w-10"
226
+ >
227
+ <Send className="h-5 w-5" />
228
+ </Button>
229
+ <Button
230
+ size="icon"
231
+ variant="ghost"
232
+ onClick={() => handleOpenDialog(recipient)}
233
+ className="h-10 w-10"
234
+ >
235
+ <Pencil className="h-5 w-5" />
236
+ </Button>
237
+ <Button
238
+ size="icon"
239
+ variant="ghost"
240
+ onClick={() => openDeleteDialog(recipient)}
241
+ className="h-10 w-10 text-destructive hover:text-destructive"
242
+ >
243
+ <Trash2 className="h-5 w-5" />
244
+ </Button>
245
+ </div>
246
+ </div>
247
+ </Card>
248
+ ))}
249
+ </div>
250
+ )}
251
+ </div>
252
+
253
+ {/* Add/Edit Dialog */}
254
+ <Dialog open={dialogOpen} onOpenChange={setDialogOpen}>
255
+ <DialogContent>
256
+ <DialogHeader>
257
+ <DialogTitle>
258
+ {editingRecipient ? t.editRecipient : t.addRecipient}
259
+ </DialogTitle>
260
+ <DialogDescription>
261
+ {editingRecipient ? t.updateRecipientInfo : t.addNewRecipient}
262
+ </DialogDescription>
263
+ </DialogHeader>
264
+ <div className="space-y-4 py-4">
265
+ <div className="space-y-2">
266
+ <Label htmlFor="name">{t.name}</Label>
267
+ <Input
268
+ id="name"
269
+ placeholder="John Doe"
270
+ value={name}
271
+ onChange={(e) => setName(e.target.value)}
272
+ />
273
+ </div>
274
+ <div className="space-y-2">
275
+ <Label htmlFor="email">{t.emailAddress}</Label>
276
+ <Input
277
+ id="email"
278
+ type="email"
279
+ placeholder="john@example.com"
280
+ value={email}
281
+ onChange={(e) => setEmail(e.target.value)}
282
+ />
283
+ </div>
284
+ </div>
285
+ <DialogFooter>
286
+ <Button variant="outline" onClick={handleCloseDialog}>
287
+ {t.cancel}
288
+ </Button>
289
+ <Button onClick={handleSave} disabled={saving}>
290
+ {saving ? t.saving : editingRecipient ? t.update : t.add}
291
+ </Button>
292
+ </DialogFooter>
293
+ </DialogContent>
294
+ </Dialog>
295
+
296
+ {/* Delete Confirmation Dialog */}
297
+ <AlertDialog open={deleteDialogOpen} onOpenChange={setDeleteDialogOpen}>
298
+ <AlertDialogContent>
299
+ <AlertDialogHeader>
300
+ <AlertDialogTitle>{t.deleteRecipientTitle}</AlertDialogTitle>
301
+ <AlertDialogDescription>
302
+ {deletingRecipient &&
303
+ t.deleteRecipientDesc(deletingRecipient.name)}
304
+ </AlertDialogDescription>
305
+ </AlertDialogHeader>
306
+ <AlertDialogFooter>
307
+ <AlertDialogCancel onClick={() => setDeletingRecipient(null)}>
308
+ {t.cancel}
309
+ </AlertDialogCancel>
310
+ <AlertDialogAction
311
+ onClick={handleDelete}
312
+ className="bg-destructive text-destructive-foreground hover:bg-destructive/90"
313
+ >
314
+ {t.delete}
315
+ </AlertDialogAction>
316
+ </AlertDialogFooter>
317
+ </AlertDialogContent>
318
+ </AlertDialog>
319
+ </>
320
+ );
321
+};
322
+
323
+export default Recipients;
src/pages/SendMoney.tsx
new
+254
@@ -0,0 +1,254 @@
1
+import { useState, useEffect } from "react";
2
+import { useNavigate, useLocation } from "react-router-dom";
3
+import { Card } from "@/components/ui/card";
4
+import { Input } from "@/components/ui/input";
5
+import { Button } from "@/components/ui/button";
6
+import { Label } from "@/components/ui/label";
7
+import {
8
+ Select,
9
+ SelectContent,
10
+ SelectItem,
11
+ SelectTrigger,
12
+ SelectValue,
13
+} from "@/components/ui/select";
14
+import { ArrowRight, CheckCircle, Loader2 } from "lucide-react";
15
+import { transactionService } from "@/services/transactionService";
16
+import { Currency } from "@/types/transaction";
17
+import { toast } from "@/hooks/use-toast";
18
+import { useLang } from "@/context/LanguageContext";
19
+
20
+const SendMoney = () => {
21
+ const navigate = useNavigate();
22
+ const location = useLocation();
23
+ const { t, lang } = useLang();
24
+ const isRTL = lang === "fa";
25
+ const [step, setStep] = useState<"form" | "processing" | "success">("form");
26
+ const [amount, setAmount] = useState("");
27
+ const [currency, setCurrency] = useState<Currency>("USD");
28
+ const [recipient, setRecipient] = useState("");
29
+ const [recipientName, setRecipientName] = useState("");
30
+ const [description, setDescription] = useState("");
31
+ const [transactionId, setTransactionId] = useState("");
32
+
33
+ // Pre-fill recipient data if passed from Recipients page
34
+ useEffect(() => {
35
+ if (location.state?.recipient) {
36
+ const { name, email } = location.state.recipient;
37
+ setRecipientName(name);
38
+ setRecipient(email);
39
+ }
40
+ }, [location]);
41
+
42
+ const fee = amount ? transactionService.calculateFee(parseFloat(amount)) : 0;
43
+ const total = amount ? parseFloat(amount) + fee : 0;
44
+
45
+ const handleSend = async () => {
46
+ if (!amount || !recipient || !recipientName) {
47
+ toast({
48
+ title: t.missingInfo,
49
+ description: t.fillAllFields,
50
+ variant: "destructive",
51
+ });
52
+ return;
53
+ }
54
+
55
+ setStep("processing");
56
+
57
+ try {
58
+ const transaction = await transactionService.sendMoney(
59
+ parseFloat(amount),
60
+ currency,
61
+ recipient,
62
+ recipientName,
63
+ description,
64
+ );
65
+
66
+ setTransactionId(transaction.id);
67
+ setStep("success");
68
+ } catch (error) {
69
+ toast({
70
+ title: t.transactionFailed,
71
+ description: t.transactionFailedDesc,
72
+ variant: "destructive",
73
+ });
74
+ setStep("form");
75
+ }
76
+ };
77
+
78
+ if (step === "processing") {
79
+ return (
80
+ <div
81
+ className="min-h-[60vh] flex items-center justify-center p-4"
82
+ dir={isRTL ? "rtl" : "ltr"}
83
+ >
84
+ <Card className="p-12 border-0 shadow-lg text-center max-w-md w-full">
85
+ <Loader2 className="h-16 w-16 text-primary animate-spin mx-auto mb-6" />
86
+ <h3 className="text-2xl font-bold mb-3">{t.processingPayment}</h3>
87
+ <p className="text-muted-foreground font-medium">
88
+ {t.processingPaymentDesc}
89
+ </p>
90
+ </Card>
91
+ </div>
92
+ );
93
+ }
94
+
95
+ if (step === "success") {
96
+ return (
97
+ <div
98
+ className="min-h-[60vh] flex items-center justify-center p-4"
99
+ dir={isRTL ? "rtl" : "ltr"}
100
+ >
101
+ <Card className="p-12 border-0 shadow-lg text-center max-w-md w-full space-y-6">
102
+ <CheckCircle className="h-20 w-20 text-expense-positive mx-auto" />
103
+ <div>
104
+ <h3 className="text-2xl font-bold mb-3">{t.paymentSent}</h3>
105
+ <p className="text-muted-foreground font-medium mb-2">
106
+ {t.paymentSentDesc}
107
+ </p>
108
+ <p className="text-sm text-muted-foreground">
109
+ {t.transactionId}: {transactionId}
110
+ </p>
111
+ </div>
112
+ <div className="space-y-3 pt-4">
113
+ <Button className="w-full" onClick={() => navigate("/")}>
114
+ {t.viewTransactions}
115
+ </Button>
116
+ <Button
117
+ variant="outline"
118
+ className="w-full"
119
+ onClick={() => {
120
+ setStep("form");
121
+ setAmount("");
122
+ setRecipient("");
123
+ setRecipientName("");
124
+ setDescription("");
125
+ }}
126
+ >
127
+ {t.sendAnotherPayment}
128
+ </Button>
129
+ </div>
130
+ </Card>
131
+ </div>
132
+ );
133
+ }
134
+
135
+ return (
136
+ <div className="p-4 space-y-6" dir={isRTL ? "rtl" : "ltr"}>
137
+ <Card className="p-6 border-0 shadow-lg">
138
+ <div className="space-y-6">
139
+ <div className="space-y-2">
140
+ <Label htmlFor="amount" className="text-base font-semibold">
141
+ {t.amount}
142
+ </Label>
143
+ <div className="flex gap-2">
144
+ <Input
145
+ id="amount"
146
+ type="number"
147
+ placeholder="0.00"
148
+ value={amount}
149
+ onChange={(e) => setAmount(e.target.value)}
150
+ className="text-2xl h-14 font-bold"
151
+ />
152
+ <Select
153
+ value={currency}
154
+ onValueChange={(val) => setCurrency(val as Currency)}
155
+ >
156
+ <SelectTrigger className="w-28 h-14">
157
+ <SelectValue />
158
+ </SelectTrigger>
159
+ <SelectContent>
160
+ <SelectItem value="USD">USD</SelectItem>
161
+ <SelectItem value="EUR">EUR</SelectItem>
162
+ <SelectItem value="GBP">GBP</SelectItem>
163
+ <SelectItem value="NGN">NGN</SelectItem>
164
+ <SelectItem value="KES">KES</SelectItem>
165
+ <SelectItem value="GHS">GHS</SelectItem>
166
+ </SelectContent>
167
+ </Select>
168
+ </div>
169
+ </div>
170
+
171
+ <div className="space-y-2">
172
+ <Label htmlFor="recipientName" className="text-base font-semibold">
173
+ {t.recipientName}
174
+ </Label>
175
+ <Input
176
+ id="recipientName"
177
+ placeholder="John Doe"
178
+ value={recipientName}
179
+ onChange={(e) => setRecipientName(e.target.value)}
180
+ className="h-12"
181
+ />
182
+ </div>
183
+
184
+ <div className="space-y-2">
185
+ <Label htmlFor="recipient" className="text-base font-semibold">
186
+ {t.emailAddress}
187
+ </Label>
188
+ <Input
189
+ id="recipient"
190
+ type="email"
191
+ placeholder="recipient@email.com"
192
+ value={recipient}
193
+ onChange={(e) => setRecipient(e.target.value)}
194
+ className="h-12"
195
+ />
196
+ </div>
197
+
198
+ <div className="space-y-2">
199
+ <Label htmlFor="description" className="text-base font-semibold">
200
+ {t.descriptionOptional}
201
+ </Label>
202
+ <Input
203
+ id="description"
204
+ placeholder={t.descriptionPlaceholder}
205
+ value={description}
206
+ onChange={(e) => setDescription(e.target.value)}
207
+ className="h-12"
208
+ />
209
+ </div>
210
+ </div>
211
+ </Card>
212
+
213
+ {amount && (
214
+ <Card className="p-6 border-0 shadow-md space-y-4">
215
+ <h3 className="font-bold text-lg">{t.paymentSummary}</h3>
216
+ <div className="space-y-3">
217
+ <div className="flex justify-between text-base">
218
+ <span className="text-muted-foreground">{t.amount}</span>
219
+ <span className="font-semibold">
220
+ {currency} {parseFloat(amount).toFixed(2)}
221
+ </span>
222
+ </div>
223
+ <div className="flex justify-between text-base">
224
+ <span className="text-muted-foreground">{t.fee}</span>
225
+ <span className="font-semibold">
226
+ {currency} {fee.toFixed(2)}
227
+ </span>
228
+ </div>
229
+ <div className="border-t pt-3 flex justify-between text-lg">
230
+ <span className="font-bold">{t.total}</span>
231
+ <span className="font-bold">
232
+ {currency} {total.toFixed(2)}
233
+ </span>
234
+ </div>
235
+ </div>
236
+ </Card>
237
+ )}
238
+
239
+ <Button
240
+ size="lg"
241
+ className="w-full"
242
+ onClick={handleSend}
243
+ disabled={!amount || !recipient || !recipientName}
244
+ >
245
+ {t.sendPayment}
246
+ <ArrowRight
247
+ className={`h-5 w-5 ${isRTL ? "mr-2 rotate-180" : "ml-2"}`}
248
+ />
249
+ </Button>
250
+ </div>
251
+ );
252
+};
253
+
254
+export default SendMoney;
src/services/transactionService.ts
new
+175
@@ -0,0 +1,175 @@
1
+import {
2
+ Transaction,
3
+ Currency,
4
+ ExchangeRate,
5
+ Recipient,
6
+} from "@/types/transaction";
7
+
8
+// Mock data
9
+const mockTransactions: Transaction[] = [
10
+ {
11
+ id: "tx_001",
12
+ amount: 250.0,
13
+ currency: "USD",
14
+ status: "completed",
15
+ sender: "you@company.com",
16
+ recipient: "vendor@supplier.com",
17
+ recipientName: "Office Supplies Co.",
18
+ timestamp: new Date(Date.now() - 24 * 60 * 60 * 1000),
19
+ description: "Office Supplies",
20
+ fee: 2.5,
21
+ },
22
+ {
23
+ id: "tx_002",
24
+ amount: 128.5,
25
+ currency: "USD",
26
+ status: "completed",
27
+ sender: "you@company.com",
28
+ recipient: "restaurant@food.com",
29
+ recipientName: "City Bistro",
30
+ timestamp: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000),
31
+ description: "Client Lunch",
32
+ fee: 1.29,
33
+ },
34
+ {
35
+ id: "tx_003",
36
+ amount: 45.99,
37
+ currency: "USD",
38
+ status: "processing",
39
+ sender: "you@company.com",
40
+ recipient: "store@retail.com",
41
+ recipientName: "Tech Store",
42
+ timestamp: new Date(Date.now() - 30 * 60 * 1000),
43
+ description: "Cable & Adapters",
44
+ fee: 0.46,
45
+ },
46
+];
47
+
48
+const mockRecipients: Recipient[] = [
49
+ {
50
+ id: "rec_001",
51
+ name: "Sarah Johnson",
52
+ email: "sarah.j@company.com",
53
+ },
54
+ {
55
+ id: "rec_002",
56
+ name: "Michael Chen",
57
+ email: "m.chen@partner.com",
58
+ },
59
+ {
60
+ id: "rec_003",
61
+ name: "Office Supplies Co.",
62
+ email: "vendor@supplier.com",
63
+ },
64
+];
65
+
66
+// Exchange rates (base USD)
67
+const exchangeRates: Record<Currency, number> = {
68
+ USD: 1,
69
+ EUR: 0.92,
70
+ GBP: 0.79,
71
+ NGN: 1620,
72
+ KES: 129,
73
+ GHS: 15.5,
74
+};
75
+
76
+class TransactionService {
77
+ private transactions: Transaction[] = [...mockTransactions];
78
+ private recipients: Recipient[] = [...mockRecipients];
79
+
80
+ async sendMoney(
81
+ amount: number,
82
+ currency: Currency,
83
+ recipient: string,
84
+ recipientName: string,
85
+ description?: string,
86
+ ): Promise<Transaction> {
87
+ // Calculate fee (1% with min $0.50)
88
+ const fee = Math.max(amount * 0.01, 0.5);
89
+
90
+ const transaction: Transaction = {
91
+ id: `tx_${Date.now()}`,
92
+ amount,
93
+ currency,
94
+ status: "pending",
95
+ sender: "you@company.com",
96
+ recipient,
97
+ recipientName,
98
+ timestamp: new Date(),
99
+ description,
100
+ fee,
101
+ };
102
+
103
+ this.transactions.unshift(transaction);
104
+
105
+ // Simulate processing delay
106
+ await new Promise((resolve) => setTimeout(resolve, 1500));
107
+ transaction.status = "processing";
108
+
109
+ await new Promise((resolve) => setTimeout(resolve, 2000));
110
+ transaction.status = "completed";
111
+
112
+ return transaction;
113
+ }
114
+
115
+ async getTransactions(): Promise<Transaction[]> {
116
+ // Simulate network delay
117
+ await new Promise((resolve) => setTimeout(resolve, 300));
118
+ return [...this.transactions];
119
+ }
120
+
121
+ async getTransaction(id: string): Promise<Transaction | null> {
122
+ await new Promise((resolve) => setTimeout(resolve, 200));
123
+ return this.transactions.find((tx) => tx.id === id) || null;
124
+ }
125
+
126
+ getExchangeRate(from: Currency, to: Currency): ExchangeRate {
127
+ const rate = exchangeRates[to] / exchangeRates[from];
128
+ return { from, to, rate };
129
+ }
130
+
131
+ async getRecipients(): Promise<Recipient[]> {
132
+ await new Promise((resolve) => setTimeout(resolve, 200));
133
+ return [...this.recipients];
134
+ }
135
+
136
+ async addRecipient(name: string, email: string): Promise<Recipient> {
137
+ await new Promise((resolve) => setTimeout(resolve, 300));
138
+ const newRecipient: Recipient = {
139
+ id: `rec_${Date.now()}`,
140
+ name,
141
+ email,
142
+ };
143
+ this.recipients.push(newRecipient);
144
+ return newRecipient;
145
+ }
146
+
147
+ async updateRecipient(
148
+ id: string,
149
+ name: string,
150
+ email: string,
151
+ ): Promise<Recipient> {
152
+ await new Promise((resolve) => setTimeout(resolve, 300));
153
+ const recipientIndex = this.recipients.findIndex((r) => r.id === id);
154
+ if (recipientIndex === -1) {
155
+ throw new Error("Recipient not found");
156
+ }
157
+ this.recipients[recipientIndex] = { id, name, email };
158
+ return this.recipients[recipientIndex];
159
+ }
160
+
161
+ async deleteRecipient(id: string): Promise<void> {
162
+ await new Promise((resolve) => setTimeout(resolve, 300));
163
+ this.recipients = this.recipients.filter((r) => r.id !== id);
164
+ }
165
+
166
+ calculateFee(amount: number): number {
167
+ return Math.max(amount * 0.01, 0.5);
168
+ }
169
+
170
+ getBalance(): number {
171
+ return 2450.0;
172
+ }
173
+}
174
+
175
+export const transactionService = new TransactionService();
src/stores/store.ts
new
+10
@@ -0,0 +1,10 @@
1
+import { LazyStore } from "@tauri-apps/plugin-store";
2
+
3
+export function storeAccount() {
4
+ const store = new LazyStore(STORE_ACCOUNT);
5
+ return store;
6
+}
7
+
8
+export const STORE_ACCOUNT = ".account.dat";
9
+
10
+export const STORE_ACCESS_TOKEN_KEY = "access_token";
src/types/transaction.ts
new
+34
@@ -0,0 +1,34 @@
1
+export type TransactionStatus =
2
+ | "pending"
3
+ | "processing"
4
+ | "completed"
5
+ | "failed";
6
+
7
+export type Currency = "USD" | "EUR" | "GBP" | "NGN" | "KES" | "GHS";
8
+
9
+export interface Transaction {
10
+ id: string;
11
+ amount: number;
12
+ currency: Currency;
13
+ status: TransactionStatus;
14
+ sender: string;
15
+ recipient: string;
16
+ recipientName: string;
17
+ timestamp: Date;
18
+ description?: string;
19
+ fee: number;
20
+ exchangeRate?: number;
21
+}
22
+
23
+export interface ExchangeRate {
24
+ from: Currency;
25
+ to: Currency;
26
+ rate: number;
27
+}
28
+
29
+export interface Recipient {
30
+ id: string;
31
+ name: string;
32
+ email: string;
33
+ avatar?: string;
34
+}
src/utils/haptics.ts
new
+198
@@ -0,0 +1,198 @@
1
+import {
2
+ vibrate,
3
+ impactFeedback,
4
+ notificationFeedback,
5
+ selectionFeedback,
6
+} from "@tauri-apps/plugin-haptics";
7
+
8
+/**
9
+ * Haptic feedback utility for consistent haptic responses across the app
10
+ */
11
+export class HapticFeedback {
12
+ private static isEnabled = true;
13
+
14
+ /**
15
+ * Enable or disable haptic feedback globally
16
+ */
17
+ static setEnabled(enabled: boolean) {
18
+ this.isEnabled = enabled;
19
+ }
20
+
21
+ /**
22
+ * Check if haptic feedback is enabled
23
+ */
24
+ static getEnabled(): boolean {
25
+ return this.isEnabled;
26
+ }
27
+
28
+ /**
29
+ * Light haptic feedback for selections and navigation
30
+ * Use for: navigation taps, filter selections, toggle switches
31
+ */
32
+ static async selection(): Promise<void> {
33
+ if (!this.isEnabled) return;
34
+
35
+ try {
36
+ await selectionFeedback();
37
+ } catch (error) {
38
+ console.log("Selection haptic feedback not available:", error);
39
+ }
40
+ }
41
+
42
+ /**
43
+ * Light impact feedback for UI interactions
44
+ * Use for: button taps, menu selections
45
+ */
46
+ static async light(): Promise<void> {
47
+ if (!this.isEnabled) return;
48
+
49
+ try {
50
+ await impactFeedback("light");
51
+ } catch (error) {
52
+ console.log("Light haptic feedback not available:", error);
53
+ }
54
+ }
55
+
56
+ /**
57
+ * Medium impact feedback for important actions
58
+ * Use for: save/favorite actions, form submissions
59
+ */
60
+ static async medium(): Promise<void> {
61
+ if (!this.isEnabled) return;
62
+
63
+ try {
64
+ await impactFeedback("medium");
65
+ } catch (error) {
66
+ console.log("Medium haptic feedback not available:", error);
67
+ }
68
+ }
69
+
70
+ /**
71
+ * Heavy impact feedback for significant actions
72
+ * Use for: delete actions, important confirmations
73
+ */
74
+ static async heavy(): Promise<void> {
75
+ if (!this.isEnabled) return;
76
+
77
+ try {
78
+ await impactFeedback("heavy");
79
+ } catch (error) {
80
+ console.log("Heavy haptic feedback not available:", error);
81
+ }
82
+ }
83
+
84
+ /**
85
+ * Success notification feedback
86
+ * Use for: successful saves, completed actions
87
+ */
88
+ static async success(): Promise<void> {
89
+ if (!this.isEnabled) return;
90
+
91
+ try {
92
+ await notificationFeedback("success");
93
+ } catch (error) {
94
+ console.log("Success haptic feedback not available:", error);
95
+ }
96
+ }
97
+
98
+ /**
99
+ * Warning notification feedback
100
+ * Use for: validation errors, warnings
101
+ */
102
+ static async warning(): Promise<void> {
103
+ if (!this.isEnabled) return;
104
+
105
+ try {
106
+ await notificationFeedback("warning");
107
+ } catch (error) {
108
+ console.log("Warning haptic feedback not available:", error);
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Error notification feedback
114
+ * Use for: errors, failed actions
115
+ */
116
+ static async error(): Promise<void> {
117
+ if (!this.isEnabled) return;
118
+
119
+ try {
120
+ await notificationFeedback("error");
121
+ } catch (error) {
122
+ console.log("Error haptic feedback not available:", error);
123
+ }
124
+ }
125
+
126
+ /**
127
+ * Custom vibration pattern
128
+ * Use for: special interactions, custom feedback
129
+ */
130
+ static async vibrate(duration: number = 200): Promise<void> {
131
+ if (!this.isEnabled) return;
132
+
133
+ try {
134
+ await vibrate(duration);
135
+ } catch (error) {
136
+ console.log("Vibration haptic feedback not available:", error);
137
+ }
138
+ }
139
+
140
+ /**
141
+ * Button press feedback - convenience method for button interactions
142
+ * Use for: most button presses and clickable elements
143
+ */
144
+ static async buttonPress(): Promise<void> {
145
+ return this.light();
146
+ }
147
+
148
+ /**
149
+ * Card tap feedback - convenience method for card interactions
150
+ * Use for: restaurant cards, list items
151
+ */
152
+ static async cardTap(): Promise<void> {
153
+ return this.selection();
154
+ }
155
+
156
+ /**
157
+ * Toggle feedback - convenience method for toggle actions
158
+ * Use for: favorite/unfavorite, like/unlike
159
+ */
160
+ static async toggle(): Promise<void> {
161
+ return this.medium();
162
+ }
163
+
164
+ /**
165
+ * Navigation feedback - convenience method for navigation actions
166
+ * Use for: tab switches, page navigation
167
+ */
168
+ static async navigation(): Promise<void> {
169
+ return this.selection();
170
+ }
171
+}
172
+
173
+/**
174
+ * Convenience functions for common haptic patterns
175
+ */
176
+export const haptics = {
177
+ // Basic interactions
178
+ selection: () => HapticFeedback.selection(),
179
+ light: () => HapticFeedback.light(),
180
+ medium: () => HapticFeedback.medium(),
181
+ heavy: () => HapticFeedback.heavy(),
182
+
183
+ // Notifications
184
+ success: () => HapticFeedback.success(),
185
+ warning: () => HapticFeedback.warning(),
186
+ error: () => HapticFeedback.error(),
187
+
188
+ // Custom
189
+ vibrate: (duration?: number) => HapticFeedback.vibrate(duration),
190
+
191
+ // Convenience methods
192
+ buttonPress: () => HapticFeedback.buttonPress(),
193
+ cardTap: () => HapticFeedback.cardTap(),
194
+ toggle: () => HapticFeedback.toggle(),
195
+ navigation: () => HapticFeedback.navigation(),
196
+};
197
+
198
+export default haptics;
src/utils/i18n.ts
new
+446
@@ -0,0 +1,446 @@
1
+export interface Translation {
2
+ appName: string;
3
+ home: string;
4
+ pay: string;
5
+ profile: string;
6
+ welcome: string;
7
+ welcomePersonal: (name: string) => string;
8
+ homeDesc: string;
9
+ getStarted: string;
10
+ startLesson: string;
11
+ back: string;
12
+ lessonCompleted: string;
13
+ user: string;
14
+ guest: string;
15
+ progress: string;
16
+ completed: string;
17
+ question: string;
18
+ of: string;
19
+ afterChoice: string;
20
+ correct: string;
21
+ incorrect: string;
22
+ startThisLesson: string;
23
+ googleOAuthLogin: string;
24
+ appleOAuthLogin: string;
25
+ availableBalance: string;
26
+ sendMoney: string;
27
+ thisMonth: string;
28
+ spent: string;
29
+ saved: string;
30
+ recentTransactions: string;
31
+ loadingTransactions: string;
32
+ noTransactions: string;
33
+ processing: string;
34
+ pending: string;
35
+ payment: string;
36
+ quickActions: string;
37
+ sendMoneyAction: string;
38
+ sendMoneyDesc: string;
39
+ requestMoney: string;
40
+ requestMoneyDesc: string;
41
+ qrCode: string;
42
+ qrCodeDesc: string;
43
+ recipients: string;
44
+ recipientsDesc: string;
45
+ recentRecipients: string;
46
+ account: string;
47
+ quickPayQR: string;
48
+ quickPayQRDesc: string;
49
+ accountSection: string;
50
+ supportSection: string;
51
+ settings: string;
52
+ notifications: string;
53
+ security: string;
54
+ helpCenter: string;
55
+ termsPrivacy: string;
56
+ logOut: string;
57
+ version: string;
58
+ expenses: string;
59
+ approved: string;
60
+ paymentRecipients: string;
61
+ manageContacts: string;
62
+ add: string;
63
+ loadingRecipients: string;
64
+ noRecipientsYet: string;
65
+ addFirstRecipient: string;
66
+ addRecipient: string;
67
+ editRecipient: string;
68
+ updateRecipientInfo: string;
69
+ addNewRecipient: string;
70
+ name: string;
71
+ emailAddress: string;
72
+ cancel: string;
73
+ update: string;
74
+ saving: string;
75
+ deleteRecipientTitle: string;
76
+ deleteRecipientDesc: (name: string) => string;
77
+ delete: string;
78
+ missingInfo: string;
79
+ fillAllFields: string;
80
+ invalidEmail: string;
81
+ validEmailAddress: string;
82
+ recipientUpdated: string;
83
+ recipientUpdatedDesc: (name: string) => string;
84
+ recipientAdded: string;
85
+ recipientAddedDesc: (name: string) => string;
86
+ error: string;
87
+ failedSaveRecipient: string;
88
+ recipientDeleted: string;
89
+ recipientDeletedDesc: (name: string) => string;
90
+ failedDeleteRecipient: string;
91
+ amount: string;
92
+ recipientName: string;
93
+ descriptionOptional: string;
94
+ descriptionPlaceholder: string;
95
+ paymentSummary: string;
96
+ fee: string;
97
+ total: string;
98
+ sendPayment: string;
99
+ processingPayment: string;
100
+ processingPaymentDesc: string;
101
+ paymentSent: string;
102
+ paymentSentDesc: string;
103
+ transactionId: string;
104
+ viewTransactions: string;
105
+ sendAnotherPayment: string;
106
+ transactionFailed: string;
107
+ transactionFailedDesc: string;
108
+}
109
+
110
+export type SupportedLanguage = "fa" | "en" | "sv";
111
+
112
+export const translations: Record<SupportedLanguage, Translation> = {
113
+ fa: {
114
+ appName: "رومی",
115
+ home: "خانه",
116
+ pay: "درسها",
117
+ profile: "پروفایل",
118
+ welcome: "به رومی خوش آمدید!",
119
+ welcomePersonal: (name) => `به رومی خوش آمدد, ${name}!`,
120
+ homeDesc: "روشی سرگرمکننده برای یادگیری زبان فارسی.",
121
+ getStarted: "شروع یادگیری",
122
+ startLesson: "شروع",
123
+ back: "← بازگشت",
124
+ lessonCompleted: "درس به پایان رسید! 🎉",
125
+ user: "نام کاربر",
126
+ guest: "مهمان",
127
+ progress: "پیشرفت",
128
+ completed: "درس تکمیل شده",
129
+ question: "سوال",
130
+ of: "از",
131
+ afterChoice: "پس از انتخاب، نتیجه نمایش داده میشود.",
132
+ correct: "درست!",
133
+ incorrect: "اشتباه!",
134
+ startThisLesson: "شروع درس",
135
+ googleOAuthLogin: "Login with Google",
136
+ appleOAuthLogin: "Sign in with Apple",
137
+ availableBalance: "موجودی موجود",
138
+ sendMoney: "ارسال پول",
139
+ thisMonth: "این ماه",
140
+ spent: "خرج شده",
141
+ saved: "پسانداز شده",
142
+ recentTransactions: "تراکنشهای اخیر",
143
+ loadingTransactions: "در حال بارگذاری تراکنشها...",
144
+ noTransactions: "هنوز تراکنشی وجود ندارد",
145
+ processing: "در حال پردازش",
146
+ pending: "در انتظار",
147
+ payment: "پرداخت",
148
+ quickActions: "اقدامات سریع",
149
+ sendMoneyAction: "ارسال پول",
150
+ sendMoneyDesc: "پرداخت فوری ارسال کنید",
151
+ requestMoney: "درخواست پول",
152
+ requestMoneyDesc: "از هر کسی درخواست کنید",
153
+ qrCode: "کد QR",
154
+ qrCodeDesc: "از طریق اسکن QR دریافت کنید",
155
+ recipients: "دریافتکنندگان",
156
+ recipientsDesc: "مدیریت مخاطبین ذخیره شده",
157
+ recentRecipients: "دریافتکنندگان اخیر",
158
+ account: "حساب",
159
+ quickPayQR: "کد QR پرداخت سریع",
160
+ quickPayQRDesc: "این کد را اسکن کنید تا به صورت فوری پرداخت دریافت کنید",
161
+ accountSection: "حساب کاربری",
162
+ supportSection: "پشتیبانی",
163
+ settings: "تنظیمات",
164
+ notifications: "اعلانها",
165
+ security: "امنیت",
166
+ helpCenter: "مرکز راهنما",
167
+ termsPrivacy: "شرایط و حریم خصوصی",
168
+ logOut: "خروج",
169
+ version: "نسخه",
170
+ expenses: "هزینهها",
171
+ approved: "تایید شده",
172
+ paymentRecipients: "دریافتکنندگان پرداخت",
173
+ manageContacts: "مدیریت مخاطبین پرداخت مکرر",
174
+ add: "افزودن",
175
+ loadingRecipients: "در حال بارگذاری دریافتکنندگان...",
176
+ noRecipientsYet: "هنوز دریافتکنندهای وجود ندارد",
177
+ addFirstRecipient: "اولین دریافتکننده خود را اضافه کنید",
178
+ addRecipient: "افزودن دریافتکننده",
179
+ editRecipient: "ویرایش دریافتکننده",
180
+ updateRecipientInfo: "اطلاعات دریافتکننده را بهروزرسانی کنید",
181
+ addNewRecipient: "دریافتکننده جدید به مخاطبین خود اضافه کنید",
182
+ name: "نام",
183
+ emailAddress: "آدرس ایمیل",
184
+ cancel: "لغو",
185
+ update: "بهروزرسانی",
186
+ saving: "در حال ذخیره...",
187
+ deleteRecipientTitle: "حذف دریافتکننده؟",
188
+ deleteRecipientDesc: (name) =>
189
+ `آیا مطمئن هستید که میخواهید ${name} را حذف کنید؟ این عمل قابل بازگشت نیست.`,
190
+ delete: "حذف",
191
+ missingInfo: "اطلاعات ناقص",
192
+ fillAllFields: "لطفاً تمام فیلدها را پر کنید",
193
+ invalidEmail: "ایمیل نامعتبر",
194
+ validEmailAddress: "لطفاً یک آدرس ایمیل معتبر وارد کنید",
195
+ recipientUpdated: "دریافتکننده بهروزرسانی شد",
196
+ recipientUpdatedDesc: (name) => `${name} با موفقیت بهروزرسانی شد`,
197
+ recipientAdded: "دریافتکننده اضافه شد",
198
+ recipientAddedDesc: (name) => `${name} به دریافتکنندگان شما اضافه شد`,
199
+ error: "خطا",
200
+ failedSaveRecipient:
201
+ "ذخیره دریافتکننده ناموفق بود. لطفاً دوباره تلاش کنید.",
202
+ recipientDeleted: "دریافتکننده حذف شد",
203
+ recipientDeletedDesc: (name) => `${name} حذف شد`,
204
+ failedDeleteRecipient:
205
+ "حذف دریافتکننده ناموفق بود. لطفاً دوباره تلاش کنید.",
206
+ amount: "مبلغ",
207
+ recipientName: "نام دریافتکننده",
208
+ descriptionOptional: "توضیحات (اختیاری)",
209
+ descriptionPlaceholder: "این پرداخت برای چیست؟",
210
+ paymentSummary: "خلاصه پرداخت",
211
+ fee: "کارمزد",
212
+ total: "جمع کل",
213
+ sendPayment: "ارسال پرداخت",
214
+ processingPayment: "در حال پردازش پرداخت",
215
+ processingPaymentDesc:
216
+ "لطفاً صبر کنید تا تراکنش شما به صورت ایمن پردازش شود...",
217
+ paymentSent: "پرداخت ارسال شد!",
218
+ paymentSentDesc: "پرداخت شما با موفقیت پردازش شد",
219
+ transactionId: "شناسه تراکنش",
220
+ viewTransactions: "مشاهده تراکنشها",
221
+ sendAnotherPayment: "ارسال پرداخت دیگر",
222
+ transactionFailed: "تراکنش ناموفق بود",
223
+ transactionFailedDesc:
224
+ "پردازش پرداخت امکانپذیر نیست. لطفاً دوباره تلاش کنید.",
225
+ },
226
+ en: {
227
+ appName: "Snac",
228
+ home: "Home",
229
+ pay: "Pay",
230
+ profile: "Profile",
231
+ welcome: "Welcome to Snac!",
232
+ welcomePersonal: (name) => `Welcome to Snac, ${name}!`,
233
+ homeDesc: "A fun way to learn Persian.",
234
+ getStarted: "Start Learning",
235
+ startLesson: "Start",
236
+ back: "← Back",
237
+ lessonCompleted: "Lesson Complete! 🎉",
238
+ user: "Username",
239
+ guest: "Guest",
240
+ progress: "Progress",
241
+ completed: "lesson(s) completed",
242
+ question: "Question",
243
+ of: "of",
244
+ afterChoice: "The result will be shown after you select.",
245
+ correct: "Correct!",
246
+ incorrect: "Incorrect!",
247
+ startThisLesson: "Start Lesson",
248
+ googleOAuthLogin: "Login with Google",
249
+ appleOAuthLogin: "Sign in with Apple",
250
+ availableBalance: "Available Balance",
251
+ sendMoney: "Send Money",
252
+ thisMonth: "This Month",
253
+ spent: "Spent",
254
+ saved: "Saved",
255
+ recentTransactions: "Recent Transactions",
256
+ loadingTransactions: "Loading transactions...",
257
+ noTransactions: "No transactions yet",
258
+ processing: "Processing",
259
+ pending: "Pending",
260
+ payment: "Payment",
261
+ quickActions: "Quick Actions",
262
+ sendMoneyAction: "Send Money",
263
+ sendMoneyDesc: "Send payment instantly",
264
+ requestMoney: "Request Money",
265
+ requestMoneyDesc: "Request from anyone",
266
+ qrCode: "QR Code",
267
+ qrCodeDesc: "Receive via QR scan",
268
+ recipients: "Recipients",
269
+ recipientsDesc: "Manage saved contacts",
270
+ recentRecipients: "Recent Recipients",
271
+ account: "Account",
272
+ quickPayQR: "Quick Pay QR Code",
273
+ quickPayQRDesc: "Scan this code to receive payments instantly",
274
+ accountSection: "Account",
275
+ supportSection: "Support",
276
+ settings: "Settings",
277
+ notifications: "Notifications",
278
+ security: "Security",
279
+ helpCenter: "Help Center",
280
+ termsPrivacy: "Terms & Privacy",
281
+ logOut: "Log Out",
282
+ version: "Version",
283
+ expenses: "Expenses",
284
+ approved: "Approved",
285
+ paymentRecipients: "Payment Recipients",
286
+ manageContacts: "Manage your frequent payment contacts",
287
+ add: "Add",
288
+ loadingRecipients: "Loading recipients...",
289
+ noRecipientsYet: "No Recipients Yet",
290
+ addFirstRecipient: "Add your first recipient to get started",
291
+ addRecipient: "Add Recipient",
292
+ editRecipient: "Edit Recipient",
293
+ updateRecipientInfo: "Update the recipient's information",
294
+ addNewRecipient: "Add a new recipient to your contacts",
295
+ name: "Name",
296
+ emailAddress: "Email Address",
297
+ cancel: "Cancel",
298
+ update: "Update",
299
+ saving: "Saving...",
300
+ deleteRecipientTitle: "Delete Recipient?",
301
+ deleteRecipientDesc: (name) =>
302
+ `Are you sure you want to delete ${name}? This action cannot be undone.`,
303
+ delete: "Delete",
304
+ missingInfo: "Missing Information",
305
+ fillAllFields: "Please fill in all fields",
306
+ invalidEmail: "Invalid Email",
307
+ validEmailAddress: "Please enter a valid email address",
308
+ recipientUpdated: "Recipient Updated",
309
+ recipientUpdatedDesc: (name) => `${name} has been updated successfully`,
310
+ recipientAdded: "Recipient Added",
311
+ recipientAddedDesc: (name) => `${name} has been added to your recipients`,
312
+ error: "Error",
313
+ failedSaveRecipient: "Failed to save recipient. Please try again.",
314
+ recipientDeleted: "Recipient Deleted",
315
+ recipientDeletedDesc: (name) => `${name} has been removed`,
316
+ failedDeleteRecipient: "Failed to delete recipient. Please try again.",
317
+ amount: "Amount",
318
+ recipientName: "Recipient Name",
319
+ descriptionOptional: "Description (Optional)",
320
+ descriptionPlaceholder: "What's this payment for?",
321
+ paymentSummary: "Payment Summary",
322
+ fee: "Fee",
323
+ total: "Total",
324
+ sendPayment: "Send Payment",
325
+ processingPayment: "Processing Payment",
326
+ processingPaymentDesc:
327
+ "Please wait while we securely process your transaction...",
328
+ paymentSent: "Payment Sent!",
329
+ paymentSentDesc: "Your payment has been successfully processed",
330
+ transactionId: "Transaction ID",
331
+ viewTransactions: "View Transactions",
332
+ sendAnotherPayment: "Send Another Payment",
333
+ transactionFailed: "Transaction Failed",
334
+ transactionFailedDesc: "Unable to process payment. Please try again.",
335
+ },
336
+ sv: {
337
+ appName: "Snac",
338
+ home: "Hem",
339
+ pay: "Betala",
340
+ profile: "Profil",
341
+ welcome: "Välkommen till Snac!",
342
+ welcomePersonal: (name) => `Välkommen till Snac, ${name}!`,
343
+ homeDesc: "Ett roligt sätt att lära sig persiska.",
344
+ getStarted: "Börja lära",
345
+ startLesson: "Starta",
346
+ back: "← Tillbaka",
347
+ lessonCompleted: "Lektion klar! 🎉",
348
+ user: "Användarnamn",
349
+ guest: "Gäst",
350
+ progress: "Framsteg",
351
+ completed: "lektion(er) slutförda",
352
+ question: "Fråga",
353
+ of: "av",
354
+ afterChoice: "Resultatet visas när du har valt.",
355
+ correct: "Rätt!",
356
+ incorrect: "Fel!",
357
+ startThisLesson: "Starta lektionen",
358
+ googleOAuthLogin: "Loga in med Google",
359
+ appleOAuthLogin: "Loga in med Apple",
360
+ availableBalance: "Tillgängligt saldo",
361
+ sendMoney: "Skicka pengar",
362
+ thisMonth: "Denna månad",
363
+ spent: "Spenderat",
364
+ saved: "Sparat",
365
+ recentTransactions: "Senaste transaktioner",
366
+ loadingTransactions: "Laddar transaktioner...",
367
+ noTransactions: "Inga transaktioner än",
368
+ processing: "Bearbetar",
369
+ pending: "Väntar",
370
+ payment: "Betalning",
371
+ quickActions: "Snabbåtgärder",
372
+ sendMoneyAction: "Skicka pengar",
373
+ sendMoneyDesc: "Skicka betalning direkt",
374
+ requestMoney: "Begär pengar",
375
+ requestMoneyDesc: "Begär från vem som helst",
376
+ qrCode: "QR-kod",
377
+ qrCodeDesc: "Ta emot via QR-skanning",
378
+ recipients: "Mottagare",
379
+ recipientsDesc: "Hantera sparade kontakter",
380
+ recentRecipients: "Senaste mottagare",
381
+ account: "Konto",
382
+ quickPayQR: "Snabbbetalning QR-kod",
383
+ quickPayQRDesc: "Skanna denna kod för att ta emot betalningar direkt",
384
+ accountSection: "Konto",
385
+ supportSection: "Support",
386
+ settings: "Inställningar",
387
+ notifications: "Notiser",
388
+ security: "Säkerhet",
389
+ helpCenter: "Hjälpcenter",
390
+ termsPrivacy: "Villkor och integritet",
391
+ logOut: "Logga ut",
392
+ version: "Version",
393
+ expenses: "Utgifter",
394
+ approved: "Godkänd",
395
+ paymentRecipients: "Betalningsmottagare",
396
+ manageContacts: "Hantera dina frekventa betalkontakter",
397
+ add: "Lägg till",
398
+ loadingRecipients: "Laddar mottagare...",
399
+ noRecipientsYet: "Inga mottagare än",
400
+ addFirstRecipient: "Lägg till din första mottagare för att komma igång",
401
+ addRecipient: "Lägg till mottagare",
402
+ editRecipient: "Redigera mottagare",
403
+ updateRecipientInfo: "Uppdatera mottagarens information",
404
+ addNewRecipient: "Lägg till en ny mottagare till dina kontakter",
405
+ name: "Namn",
406
+ emailAddress: "E-postadress",
407
+ cancel: "Avbryt",
408
+ update: "Uppdatera",
409
+ saving: "Sparar...",
410
+ deleteRecipientTitle: "Ta bort mottagare?",
411
+ deleteRecipientDesc: (name) =>
412
+ `Är du säker på att du vill ta bort ${name}? Denna åtgärd kan inte ångras.`,
413
+ delete: "Ta bort",
414
+ missingInfo: "Information saknas",
415
+ fillAllFields: "Vänligen fyll i alla fält",
416
+ invalidEmail: "Ogiltig e-post",
417
+ validEmailAddress: "Vänligen ange en giltig e-postadress",
418
+ recipientUpdated: "Mottagare uppdaterad",
419
+ recipientUpdatedDesc: (name) => `${name} har uppdaterats framgångsrikt`,
420
+ recipientAdded: "Mottagare tillagd",
421
+ recipientAddedDesc: (name) => `${name} har lagts till bland dina mottagare`,
422
+ error: "Fel",
423
+ failedSaveRecipient: "Misslyckades med att spara mottagare. Försök igen.",
424
+ recipientDeleted: "Mottagare borttagen",
425
+ recipientDeletedDesc: (name) => `${name} har tagits bort`,
426
+ failedDeleteRecipient:
427
+ "Misslyckades med att ta bort mottagare. Försök igen.",
428
+ amount: "Belopp",
429
+ recipientName: "Mottagarens namn",
430
+ descriptionOptional: "Beskrivning (valfritt)",
431
+ descriptionPlaceholder: "Vad är denna betalning för?",
432
+ paymentSummary: "Betalningsöversikt",
433
+ fee: "Avgift",
434
+ total: "Totalt",
435
+ sendPayment: "Skicka betalning",
436
+ processingPayment: "Bearbetar betalning",
437
+ processingPaymentDesc: "Vänta medan vi säkert bearbetar din transaktion...",
438
+ paymentSent: "Betalning skickad!",
439
+ paymentSentDesc: "Din betalning har bearbetats framgångsrikt",
440
+ transactionId: "Transaktions-ID",
441
+ viewTransactions: "Visa transaktioner",
442
+ sendAnotherPayment: "Skicka en annan betalning",
443
+ transactionFailed: "Transaktion misslyckades",
444
+ transactionFailedDesc: "Kan inte bearbeta betalning. Försök igen.",
445
+ },
446
+};
tailwind.config.js
new
+102
@@ -0,0 +1,102 @@
1
+/** @type {import('tailwindcss').Config} */
2
+export default {
3
+ content: ["./index.html", "./src/**/*.{js,jsx,ts,tsx}"],
4
+ theme: {
5
+ container: {
6
+ center: true,
7
+ padding: "2rem",
8
+ screens: {
9
+ "2xl": "1400px",
10
+ },
11
+ },
12
+ extend: {
13
+ fontFamily: {
14
+ sans: ["Inter", "system-ui", "sans-serif"],
15
+ },
16
+ colors: {
17
+ border: "hsl(var(--border))",
18
+ input: "hsl(var(--input))",
19
+ ring: "hsl(var(--ring))",
20
+ background: "hsl(var(--background))",
21
+ foreground: "hsl(var(--foreground))",
22
+ primary: {
23
+ DEFAULT: "hsl(var(--primary))",
24
+ foreground: "hsl(var(--primary-foreground))",
25
+ },
26
+ secondary: {
27
+ DEFAULT: "hsl(var(--secondary))",
28
+ foreground: "hsl(var(--secondary-foreground))",
29
+ },
30
+ destructive: {
31
+ DEFAULT: "hsl(var(--destructive))",
32
+ foreground: "hsl(var(--destructive-foreground))",
33
+ },
34
+ muted: {
35
+ DEFAULT: "hsl(var(--muted))",
36
+ foreground: "hsl(var(--muted-foreground))",
37
+ },
38
+ accent: {
39
+ DEFAULT: "hsl(var(--accent))",
40
+ foreground: "hsl(var(--accent-foreground))",
41
+ },
42
+ popover: {
43
+ DEFAULT: "hsl(var(--popover))",
44
+ foreground: "hsl(var(--popover-foreground))",
45
+ },
46
+ card: {
47
+ DEFAULT: "hsl(var(--card))",
48
+ foreground: "hsl(var(--card-foreground))",
49
+ },
50
+ toolbar: {
51
+ bg: "hsl(var(--toolbar-bg))",
52
+ border: "hsl(var(--toolbar-border))",
53
+ },
54
+ nav: {
55
+ bg: "hsl(var(--nav-bg))",
56
+ border: "hsl(var(--nav-border))",
57
+ active: "hsl(var(--nav-active))",
58
+ },
59
+ expense: {
60
+ positive: "hsl(var(--expense-positive))",
61
+ negative: "hsl(var(--expense-negative))",
62
+ },
63
+ },
64
+ boxShadow: {
65
+ sm: "var(--shadow-sm)",
66
+ md: "var(--shadow-md)",
67
+ lg: "var(--shadow-lg)",
68
+ },
69
+ transitionProperty: {
70
+ all: "var(--transition)",
71
+ },
72
+ borderRadius: {
73
+ lg: "var(--radius)",
74
+ md: "calc(var(--radius) - 2px)",
75
+ sm: "calc(var(--radius) - 4px)",
76
+ },
77
+ keyframes: {
78
+ "accordion-down": {
79
+ from: {
80
+ height: "0",
81
+ },
82
+ to: {
83
+ height: "var(--radix-accordion-content-height)",
84
+ },
85
+ },
86
+ "accordion-up": {
87
+ from: {
88
+ height: "var(--radix-accordion-content-height)",
89
+ },
90
+ to: {
91
+ height: "0",
92
+ },
93
+ },
94
+ },
95
+ animation: {
96
+ "accordion-down": "accordion-down 0.2s ease-out",
97
+ "accordion-up": "accordion-up 0.2s ease-out",
98
+ },
99
+ },
100
+ },
101
+ plugins: [require("tailwindcss-animate")],
102
+};
tsconfig.json
new
+30
@@ -0,0 +1,30 @@
1
+{
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "useDefineForClassFields": true,
5
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
6
+ "module": "ESNext",
7
+ "skipLibCheck": true,
8
+
9
+ /* Bundler mode */
10
+ "moduleResolution": "bundler",
11
+ "allowImportingTsExtensions": true,
12
+ "resolveJsonModule": true,
13
+ "isolatedModules": true,
14
+ "noEmit": true,
15
+ "jsx": "react-jsx",
16
+
17
+ /* Linting */
18
+ "strict": true,
19
+ "noUnusedLocals": true,
20
+ "noUnusedParameters": true,
21
+ "noFallthroughCasesInSwitch": true,
22
+
23
+ "baseUrl": ".",
24
+ "paths": {
25
+ "@/*": ["./src/*"]
26
+ }
27
+ },
28
+ "include": ["src"],
29
+ "references": [{ "path": "./tsconfig.node.json" }]
30
+}
tsconfig.node.json
new
+10
@@ -0,0 +1,10 @@
1
+{
2
+ "compilerOptions": {
3
+ "composite": true,
4
+ "skipLibCheck": true,
5
+ "module": "ESNext",
6
+ "moduleResolution": "bundler",
7
+ "allowSyntheticDefaultImports": true
8
+ },
9
+ "include": ["vite.config.ts"]
10
+}
vite.config.ts
new
+38
@@ -0,0 +1,38 @@
1
+import { defineConfig } from "vite";
2
+import react from "@vitejs/plugin-react";
3
+import path from "path";
4
+
5
+// @ts-expect-error process is a nodejs global
6
+const host = process.env.TAURI_DEV_HOST;
7
+
8
+// https://vite.dev/config/
9
+export default defineConfig(async () => ({
10
+ plugins: [react()],
11
+
12
+ // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build`
13
+ //
14
+ // 1. prevent Vite from obscuring rust errors
15
+ clearScreen: false,
16
+ // 2. tauri expects a fixed port, fail if that port is not available
17
+ server: {
18
+ port: 1420,
19
+ strictPort: true,
20
+ host: host || false,
21
+ hmr: host
22
+ ? {
23
+ protocol: "ws",
24
+ host,
25
+ port: 1421,
26
+ }
27
+ : undefined,
28
+ watch: {
29
+ // 3. tell Vite to ignore watching `src-tauri`
30
+ ignored: ["**/src-tauri/**"],
31
+ },
32
+ },
33
+ resolve: {
34
+ alias: {
35
+ "@": path.resolve(__dirname, "./src"),
36
+ },
37
+ },
38
+}));