@smbcloud / snac / commits / 8fbf674

initial commit

Seto committed Nov 27, 2025 at 17:39 UTC 8fbf674eef4ec2ab05477189305e05a9e9c9a37c
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 +}));