├── .gitignore
├── .vscode
└── extensions.json
├── LICENSE
├── README.md
├── app-icon.png
├── index.html
├── package-lock.json
├── package.json
├── passwords.afphoto
├── public
├── tauri.svg
└── vite.svg
├── screenshot.png
├── src-tauri
├── .gitignore
├── Cargo.lock
├── Cargo.toml
├── build.rs
├── capabilities
│ └── default.json
├── icons
│ ├── 128x128.png
│ ├── 128x128@2x.png
│ ├── 32x32.png
│ ├── Square107x107Logo.png
│ ├── Square142x142Logo.png
│ ├── Square150x150Logo.png
│ ├── Square284x284Logo.png
│ ├── Square30x30Logo.png
│ ├── Square310x310Logo.png
│ ├── Square44x44Logo.png
│ ├── Square71x71Logo.png
│ ├── Square89x89Logo.png
│ ├── StoreLogo.png
│ ├── icon.icns
│ ├── icon.ico
│ └── icon.png
├── src
│ ├── lib.rs
│ ├── main.rs
│ ├── syllables.rs
│ └── words.rs
└── tauri.conf.json
├── src
├── App.css
├── App.tsx
├── assets
│ └── react.svg
├── hooks.ts
├── main.tsx
├── natives.ts
├── utils.ts
└── vite-env.d.ts
├── tsconfig.json
├── tsconfig.node.json
└── vite.config.ts
/.gitignore:
--------------------------------------------------------------------------------
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 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer"]
3 | }
4 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 hiql
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Passwords
4 |
5 | A random password generator
6 |
7 | 
8 |
9 | ## Features
10 |
11 | - Generator
12 | - Random
13 | - Memoriable
14 | - PIN
15 | - Hasher
16 | - MD5
17 | - Bcrypt
18 | - SHA1/SHA224/SHA256/SHA384/SHA512
19 | - BASE64
20 | - Analyzer
21 | - Password strength test
22 | - Common password check
23 | - Estimate the time to crack
24 |
25 | ## License
26 |
27 | MIT
28 |
--------------------------------------------------------------------------------
/app-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hiql/passwords-app/a69ef191b600b954e09e692ec06ea3ad62558f48/app-icon.png
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Passwords
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "passwords-app",
3 | "version": "0.1.4",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "passwords-app",
9 | "version": "0.1.4",
10 | "dependencies": {
11 | "@radix-ui/react-icons": "^1.3.2",
12 | "@radix-ui/themes": "^3.2.0",
13 | "@tauri-apps/api": "^2",
14 | "@tauri-apps/plugin-clipboard-manager": "^2",
15 | "@tauri-apps/plugin-opener": "^2",
16 | "@tauri-apps/plugin-shell": "^2",
17 | "react": "^18.3.1",
18 | "react-dom": "^18.3.1",
19 | "use-resize-observer": "^9.1.0"
20 | },
21 | "devDependencies": {
22 | "@tauri-apps/cli": "^2",
23 | "@types/react": "^18.3.1",
24 | "@types/react-dom": "^18.3.1",
25 | "@vitejs/plugin-react": "^4.3.4",
26 | "typescript": "~5.6.2",
27 | "vite": "^6.0.3"
28 | }
29 | },
30 | "node_modules/@ampproject/remapping": {
31 | "version": "2.3.0",
32 | "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz",
33 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
34 | "dev": true,
35 | "license": "Apache-2.0",
36 | "dependencies": {
37 | "@jridgewell/gen-mapping": "^0.3.5",
38 | "@jridgewell/trace-mapping": "^0.3.24"
39 | },
40 | "engines": {
41 | "node": ">=6.0.0"
42 | }
43 | },
44 | "node_modules/@babel/code-frame": {
45 | "version": "7.26.2",
46 | "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.26.2.tgz",
47 | "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
48 | "dev": true,
49 | "license": "MIT",
50 | "dependencies": {
51 | "@babel/helper-validator-identifier": "^7.25.9",
52 | "js-tokens": "^4.0.0",
53 | "picocolors": "^1.0.0"
54 | },
55 | "engines": {
56 | "node": ">=6.9.0"
57 | }
58 | },
59 | "node_modules/@babel/compat-data": {
60 | "version": "7.26.2",
61 | "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.26.2.tgz",
62 | "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==",
63 | "dev": true,
64 | "license": "MIT",
65 | "engines": {
66 | "node": ">=6.9.0"
67 | }
68 | },
69 | "node_modules/@babel/core": {
70 | "version": "7.26.0",
71 | "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.26.0.tgz",
72 | "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==",
73 | "dev": true,
74 | "license": "MIT",
75 | "dependencies": {
76 | "@ampproject/remapping": "^2.2.0",
77 | "@babel/code-frame": "^7.26.0",
78 | "@babel/generator": "^7.26.0",
79 | "@babel/helper-compilation-targets": "^7.25.9",
80 | "@babel/helper-module-transforms": "^7.26.0",
81 | "@babel/helpers": "^7.26.0",
82 | "@babel/parser": "^7.26.0",
83 | "@babel/template": "^7.25.9",
84 | "@babel/traverse": "^7.25.9",
85 | "@babel/types": "^7.26.0",
86 | "convert-source-map": "^2.0.0",
87 | "debug": "^4.1.0",
88 | "gensync": "^1.0.0-beta.2",
89 | "json5": "^2.2.3",
90 | "semver": "^6.3.1"
91 | },
92 | "engines": {
93 | "node": ">=6.9.0"
94 | },
95 | "funding": {
96 | "type": "opencollective",
97 | "url": "https://opencollective.com/babel"
98 | }
99 | },
100 | "node_modules/@babel/generator": {
101 | "version": "7.26.2",
102 | "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.26.2.tgz",
103 | "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==",
104 | "dev": true,
105 | "license": "MIT",
106 | "dependencies": {
107 | "@babel/parser": "^7.26.2",
108 | "@babel/types": "^7.26.0",
109 | "@jridgewell/gen-mapping": "^0.3.5",
110 | "@jridgewell/trace-mapping": "^0.3.25",
111 | "jsesc": "^3.0.2"
112 | },
113 | "engines": {
114 | "node": ">=6.9.0"
115 | }
116 | },
117 | "node_modules/@babel/helper-compilation-targets": {
118 | "version": "7.25.9",
119 | "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz",
120 | "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==",
121 | "dev": true,
122 | "license": "MIT",
123 | "dependencies": {
124 | "@babel/compat-data": "^7.25.9",
125 | "@babel/helper-validator-option": "^7.25.9",
126 | "browserslist": "^4.24.0",
127 | "lru-cache": "^5.1.1",
128 | "semver": "^6.3.1"
129 | },
130 | "engines": {
131 | "node": ">=6.9.0"
132 | }
133 | },
134 | "node_modules/@babel/helper-module-imports": {
135 | "version": "7.25.9",
136 | "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
137 | "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
138 | "dev": true,
139 | "license": "MIT",
140 | "dependencies": {
141 | "@babel/traverse": "^7.25.9",
142 | "@babel/types": "^7.25.9"
143 | },
144 | "engines": {
145 | "node": ">=6.9.0"
146 | }
147 | },
148 | "node_modules/@babel/helper-module-transforms": {
149 | "version": "7.26.0",
150 | "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
151 | "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
152 | "dev": true,
153 | "license": "MIT",
154 | "dependencies": {
155 | "@babel/helper-module-imports": "^7.25.9",
156 | "@babel/helper-validator-identifier": "^7.25.9",
157 | "@babel/traverse": "^7.25.9"
158 | },
159 | "engines": {
160 | "node": ">=6.9.0"
161 | },
162 | "peerDependencies": {
163 | "@babel/core": "^7.0.0"
164 | }
165 | },
166 | "node_modules/@babel/helper-plugin-utils": {
167 | "version": "7.25.9",
168 | "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz",
169 | "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==",
170 | "dev": true,
171 | "license": "MIT",
172 | "engines": {
173 | "node": ">=6.9.0"
174 | }
175 | },
176 | "node_modules/@babel/helper-string-parser": {
177 | "version": "7.25.9",
178 | "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
179 | "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
180 | "dev": true,
181 | "license": "MIT",
182 | "engines": {
183 | "node": ">=6.9.0"
184 | }
185 | },
186 | "node_modules/@babel/helper-validator-identifier": {
187 | "version": "7.25.9",
188 | "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
189 | "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
190 | "dev": true,
191 | "license": "MIT",
192 | "engines": {
193 | "node": ">=6.9.0"
194 | }
195 | },
196 | "node_modules/@babel/helper-validator-option": {
197 | "version": "7.25.9",
198 | "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
199 | "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
200 | "dev": true,
201 | "license": "MIT",
202 | "engines": {
203 | "node": ">=6.9.0"
204 | }
205 | },
206 | "node_modules/@babel/helpers": {
207 | "version": "7.26.0",
208 | "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.26.0.tgz",
209 | "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==",
210 | "dev": true,
211 | "license": "MIT",
212 | "dependencies": {
213 | "@babel/template": "^7.25.9",
214 | "@babel/types": "^7.26.0"
215 | },
216 | "engines": {
217 | "node": ">=6.9.0"
218 | }
219 | },
220 | "node_modules/@babel/parser": {
221 | "version": "7.26.2",
222 | "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.26.2.tgz",
223 | "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==",
224 | "dev": true,
225 | "license": "MIT",
226 | "dependencies": {
227 | "@babel/types": "^7.26.0"
228 | },
229 | "bin": {
230 | "parser": "bin/babel-parser.js"
231 | },
232 | "engines": {
233 | "node": ">=6.0.0"
234 | }
235 | },
236 | "node_modules/@babel/plugin-transform-react-jsx-self": {
237 | "version": "7.25.9",
238 | "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz",
239 | "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==",
240 | "dev": true,
241 | "license": "MIT",
242 | "dependencies": {
243 | "@babel/helper-plugin-utils": "^7.25.9"
244 | },
245 | "engines": {
246 | "node": ">=6.9.0"
247 | },
248 | "peerDependencies": {
249 | "@babel/core": "^7.0.0-0"
250 | }
251 | },
252 | "node_modules/@babel/plugin-transform-react-jsx-source": {
253 | "version": "7.25.9",
254 | "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz",
255 | "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==",
256 | "dev": true,
257 | "license": "MIT",
258 | "dependencies": {
259 | "@babel/helper-plugin-utils": "^7.25.9"
260 | },
261 | "engines": {
262 | "node": ">=6.9.0"
263 | },
264 | "peerDependencies": {
265 | "@babel/core": "^7.0.0-0"
266 | }
267 | },
268 | "node_modules/@babel/template": {
269 | "version": "7.25.9",
270 | "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.25.9.tgz",
271 | "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
272 | "dev": true,
273 | "license": "MIT",
274 | "dependencies": {
275 | "@babel/code-frame": "^7.25.9",
276 | "@babel/parser": "^7.25.9",
277 | "@babel/types": "^7.25.9"
278 | },
279 | "engines": {
280 | "node": ">=6.9.0"
281 | }
282 | },
283 | "node_modules/@babel/traverse": {
284 | "version": "7.25.9",
285 | "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.25.9.tgz",
286 | "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==",
287 | "dev": true,
288 | "license": "MIT",
289 | "dependencies": {
290 | "@babel/code-frame": "^7.25.9",
291 | "@babel/generator": "^7.25.9",
292 | "@babel/parser": "^7.25.9",
293 | "@babel/template": "^7.25.9",
294 | "@babel/types": "^7.25.9",
295 | "debug": "^4.3.1",
296 | "globals": "^11.1.0"
297 | },
298 | "engines": {
299 | "node": ">=6.9.0"
300 | }
301 | },
302 | "node_modules/@babel/types": {
303 | "version": "7.26.0",
304 | "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.26.0.tgz",
305 | "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
306 | "dev": true,
307 | "license": "MIT",
308 | "dependencies": {
309 | "@babel/helper-string-parser": "^7.25.9",
310 | "@babel/helper-validator-identifier": "^7.25.9"
311 | },
312 | "engines": {
313 | "node": ">=6.9.0"
314 | }
315 | },
316 | "node_modules/@esbuild/aix-ppc64": {
317 | "version": "0.24.2",
318 | "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz",
319 | "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==",
320 | "cpu": [
321 | "ppc64"
322 | ],
323 | "dev": true,
324 | "license": "MIT",
325 | "optional": true,
326 | "os": [
327 | "aix"
328 | ],
329 | "engines": {
330 | "node": ">=18"
331 | }
332 | },
333 | "node_modules/@esbuild/android-arm": {
334 | "version": "0.24.2",
335 | "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.24.2.tgz",
336 | "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==",
337 | "cpu": [
338 | "arm"
339 | ],
340 | "dev": true,
341 | "license": "MIT",
342 | "optional": true,
343 | "os": [
344 | "android"
345 | ],
346 | "engines": {
347 | "node": ">=18"
348 | }
349 | },
350 | "node_modules/@esbuild/android-arm64": {
351 | "version": "0.24.2",
352 | "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz",
353 | "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==",
354 | "cpu": [
355 | "arm64"
356 | ],
357 | "dev": true,
358 | "license": "MIT",
359 | "optional": true,
360 | "os": [
361 | "android"
362 | ],
363 | "engines": {
364 | "node": ">=18"
365 | }
366 | },
367 | "node_modules/@esbuild/android-x64": {
368 | "version": "0.24.2",
369 | "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.24.2.tgz",
370 | "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==",
371 | "cpu": [
372 | "x64"
373 | ],
374 | "dev": true,
375 | "license": "MIT",
376 | "optional": true,
377 | "os": [
378 | "android"
379 | ],
380 | "engines": {
381 | "node": ">=18"
382 | }
383 | },
384 | "node_modules/@esbuild/darwin-arm64": {
385 | "version": "0.24.2",
386 | "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz",
387 | "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==",
388 | "cpu": [
389 | "arm64"
390 | ],
391 | "dev": true,
392 | "license": "MIT",
393 | "optional": true,
394 | "os": [
395 | "darwin"
396 | ],
397 | "engines": {
398 | "node": ">=18"
399 | }
400 | },
401 | "node_modules/@esbuild/darwin-x64": {
402 | "version": "0.24.2",
403 | "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz",
404 | "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==",
405 | "cpu": [
406 | "x64"
407 | ],
408 | "dev": true,
409 | "license": "MIT",
410 | "optional": true,
411 | "os": [
412 | "darwin"
413 | ],
414 | "engines": {
415 | "node": ">=18"
416 | }
417 | },
418 | "node_modules/@esbuild/freebsd-arm64": {
419 | "version": "0.24.2",
420 | "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz",
421 | "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==",
422 | "cpu": [
423 | "arm64"
424 | ],
425 | "dev": true,
426 | "license": "MIT",
427 | "optional": true,
428 | "os": [
429 | "freebsd"
430 | ],
431 | "engines": {
432 | "node": ">=18"
433 | }
434 | },
435 | "node_modules/@esbuild/freebsd-x64": {
436 | "version": "0.24.2",
437 | "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz",
438 | "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==",
439 | "cpu": [
440 | "x64"
441 | ],
442 | "dev": true,
443 | "license": "MIT",
444 | "optional": true,
445 | "os": [
446 | "freebsd"
447 | ],
448 | "engines": {
449 | "node": ">=18"
450 | }
451 | },
452 | "node_modules/@esbuild/linux-arm": {
453 | "version": "0.24.2",
454 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz",
455 | "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==",
456 | "cpu": [
457 | "arm"
458 | ],
459 | "dev": true,
460 | "license": "MIT",
461 | "optional": true,
462 | "os": [
463 | "linux"
464 | ],
465 | "engines": {
466 | "node": ">=18"
467 | }
468 | },
469 | "node_modules/@esbuild/linux-arm64": {
470 | "version": "0.24.2",
471 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz",
472 | "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==",
473 | "cpu": [
474 | "arm64"
475 | ],
476 | "dev": true,
477 | "license": "MIT",
478 | "optional": true,
479 | "os": [
480 | "linux"
481 | ],
482 | "engines": {
483 | "node": ">=18"
484 | }
485 | },
486 | "node_modules/@esbuild/linux-ia32": {
487 | "version": "0.24.2",
488 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz",
489 | "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==",
490 | "cpu": [
491 | "ia32"
492 | ],
493 | "dev": true,
494 | "license": "MIT",
495 | "optional": true,
496 | "os": [
497 | "linux"
498 | ],
499 | "engines": {
500 | "node": ">=18"
501 | }
502 | },
503 | "node_modules/@esbuild/linux-loong64": {
504 | "version": "0.24.2",
505 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz",
506 | "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==",
507 | "cpu": [
508 | "loong64"
509 | ],
510 | "dev": true,
511 | "license": "MIT",
512 | "optional": true,
513 | "os": [
514 | "linux"
515 | ],
516 | "engines": {
517 | "node": ">=18"
518 | }
519 | },
520 | "node_modules/@esbuild/linux-mips64el": {
521 | "version": "0.24.2",
522 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz",
523 | "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==",
524 | "cpu": [
525 | "mips64el"
526 | ],
527 | "dev": true,
528 | "license": "MIT",
529 | "optional": true,
530 | "os": [
531 | "linux"
532 | ],
533 | "engines": {
534 | "node": ">=18"
535 | }
536 | },
537 | "node_modules/@esbuild/linux-ppc64": {
538 | "version": "0.24.2",
539 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz",
540 | "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==",
541 | "cpu": [
542 | "ppc64"
543 | ],
544 | "dev": true,
545 | "license": "MIT",
546 | "optional": true,
547 | "os": [
548 | "linux"
549 | ],
550 | "engines": {
551 | "node": ">=18"
552 | }
553 | },
554 | "node_modules/@esbuild/linux-riscv64": {
555 | "version": "0.24.2",
556 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz",
557 | "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==",
558 | "cpu": [
559 | "riscv64"
560 | ],
561 | "dev": true,
562 | "license": "MIT",
563 | "optional": true,
564 | "os": [
565 | "linux"
566 | ],
567 | "engines": {
568 | "node": ">=18"
569 | }
570 | },
571 | "node_modules/@esbuild/linux-s390x": {
572 | "version": "0.24.2",
573 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz",
574 | "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==",
575 | "cpu": [
576 | "s390x"
577 | ],
578 | "dev": true,
579 | "license": "MIT",
580 | "optional": true,
581 | "os": [
582 | "linux"
583 | ],
584 | "engines": {
585 | "node": ">=18"
586 | }
587 | },
588 | "node_modules/@esbuild/linux-x64": {
589 | "version": "0.24.2",
590 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz",
591 | "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==",
592 | "cpu": [
593 | "x64"
594 | ],
595 | "dev": true,
596 | "license": "MIT",
597 | "optional": true,
598 | "os": [
599 | "linux"
600 | ],
601 | "engines": {
602 | "node": ">=18"
603 | }
604 | },
605 | "node_modules/@esbuild/netbsd-arm64": {
606 | "version": "0.24.2",
607 | "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz",
608 | "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==",
609 | "cpu": [
610 | "arm64"
611 | ],
612 | "dev": true,
613 | "license": "MIT",
614 | "optional": true,
615 | "os": [
616 | "netbsd"
617 | ],
618 | "engines": {
619 | "node": ">=18"
620 | }
621 | },
622 | "node_modules/@esbuild/netbsd-x64": {
623 | "version": "0.24.2",
624 | "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz",
625 | "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==",
626 | "cpu": [
627 | "x64"
628 | ],
629 | "dev": true,
630 | "license": "MIT",
631 | "optional": true,
632 | "os": [
633 | "netbsd"
634 | ],
635 | "engines": {
636 | "node": ">=18"
637 | }
638 | },
639 | "node_modules/@esbuild/openbsd-arm64": {
640 | "version": "0.24.2",
641 | "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz",
642 | "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==",
643 | "cpu": [
644 | "arm64"
645 | ],
646 | "dev": true,
647 | "license": "MIT",
648 | "optional": true,
649 | "os": [
650 | "openbsd"
651 | ],
652 | "engines": {
653 | "node": ">=18"
654 | }
655 | },
656 | "node_modules/@esbuild/openbsd-x64": {
657 | "version": "0.24.2",
658 | "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz",
659 | "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==",
660 | "cpu": [
661 | "x64"
662 | ],
663 | "dev": true,
664 | "license": "MIT",
665 | "optional": true,
666 | "os": [
667 | "openbsd"
668 | ],
669 | "engines": {
670 | "node": ">=18"
671 | }
672 | },
673 | "node_modules/@esbuild/sunos-x64": {
674 | "version": "0.24.2",
675 | "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz",
676 | "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==",
677 | "cpu": [
678 | "x64"
679 | ],
680 | "dev": true,
681 | "license": "MIT",
682 | "optional": true,
683 | "os": [
684 | "sunos"
685 | ],
686 | "engines": {
687 | "node": ">=18"
688 | }
689 | },
690 | "node_modules/@esbuild/win32-arm64": {
691 | "version": "0.24.2",
692 | "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz",
693 | "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==",
694 | "cpu": [
695 | "arm64"
696 | ],
697 | "dev": true,
698 | "license": "MIT",
699 | "optional": true,
700 | "os": [
701 | "win32"
702 | ],
703 | "engines": {
704 | "node": ">=18"
705 | }
706 | },
707 | "node_modules/@esbuild/win32-ia32": {
708 | "version": "0.24.2",
709 | "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz",
710 | "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==",
711 | "cpu": [
712 | "ia32"
713 | ],
714 | "dev": true,
715 | "license": "MIT",
716 | "optional": true,
717 | "os": [
718 | "win32"
719 | ],
720 | "engines": {
721 | "node": ">=18"
722 | }
723 | },
724 | "node_modules/@esbuild/win32-x64": {
725 | "version": "0.24.2",
726 | "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz",
727 | "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==",
728 | "cpu": [
729 | "x64"
730 | ],
731 | "dev": true,
732 | "license": "MIT",
733 | "optional": true,
734 | "os": [
735 | "win32"
736 | ],
737 | "engines": {
738 | "node": ">=18"
739 | }
740 | },
741 | "node_modules/@floating-ui/core": {
742 | "version": "1.6.9",
743 | "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.6.9.tgz",
744 | "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==",
745 | "license": "MIT",
746 | "dependencies": {
747 | "@floating-ui/utils": "^0.2.9"
748 | }
749 | },
750 | "node_modules/@floating-ui/dom": {
751 | "version": "1.6.13",
752 | "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.6.13.tgz",
753 | "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==",
754 | "license": "MIT",
755 | "dependencies": {
756 | "@floating-ui/core": "^1.6.0",
757 | "@floating-ui/utils": "^0.2.9"
758 | }
759 | },
760 | "node_modules/@floating-ui/react-dom": {
761 | "version": "2.1.2",
762 | "resolved": "https://registry.npmmirror.com/@floating-ui/react-dom/-/react-dom-2.1.2.tgz",
763 | "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==",
764 | "license": "MIT",
765 | "dependencies": {
766 | "@floating-ui/dom": "^1.0.0"
767 | },
768 | "peerDependencies": {
769 | "react": ">=16.8.0",
770 | "react-dom": ">=16.8.0"
771 | }
772 | },
773 | "node_modules/@floating-ui/utils": {
774 | "version": "0.2.9",
775 | "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.9.tgz",
776 | "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==",
777 | "license": "MIT"
778 | },
779 | "node_modules/@jridgewell/gen-mapping": {
780 | "version": "0.3.5",
781 | "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
782 | "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
783 | "dev": true,
784 | "license": "MIT",
785 | "dependencies": {
786 | "@jridgewell/set-array": "^1.2.1",
787 | "@jridgewell/sourcemap-codec": "^1.4.10",
788 | "@jridgewell/trace-mapping": "^0.3.24"
789 | },
790 | "engines": {
791 | "node": ">=6.0.0"
792 | }
793 | },
794 | "node_modules/@jridgewell/resolve-uri": {
795 | "version": "3.1.2",
796 | "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
797 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
798 | "dev": true,
799 | "license": "MIT",
800 | "engines": {
801 | "node": ">=6.0.0"
802 | }
803 | },
804 | "node_modules/@jridgewell/set-array": {
805 | "version": "1.2.1",
806 | "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz",
807 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
808 | "dev": true,
809 | "license": "MIT",
810 | "engines": {
811 | "node": ">=6.0.0"
812 | }
813 | },
814 | "node_modules/@jridgewell/sourcemap-codec": {
815 | "version": "1.5.0",
816 | "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
817 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
818 | "dev": true,
819 | "license": "MIT"
820 | },
821 | "node_modules/@jridgewell/trace-mapping": {
822 | "version": "0.3.25",
823 | "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
824 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
825 | "dev": true,
826 | "license": "MIT",
827 | "dependencies": {
828 | "@jridgewell/resolve-uri": "^3.1.0",
829 | "@jridgewell/sourcemap-codec": "^1.4.14"
830 | }
831 | },
832 | "node_modules/@juggle/resize-observer": {
833 | "version": "3.4.0",
834 | "resolved": "https://registry.npmmirror.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz",
835 | "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==",
836 | "license": "Apache-2.0"
837 | },
838 | "node_modules/@radix-ui/colors": {
839 | "version": "3.0.0",
840 | "resolved": "https://registry.npmmirror.com/@radix-ui/colors/-/colors-3.0.0.tgz",
841 | "integrity": "sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==",
842 | "license": "MIT"
843 | },
844 | "node_modules/@radix-ui/number": {
845 | "version": "1.1.0",
846 | "resolved": "https://registry.npmmirror.com/@radix-ui/number/-/number-1.1.0.tgz",
847 | "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==",
848 | "license": "MIT"
849 | },
850 | "node_modules/@radix-ui/primitive": {
851 | "version": "1.1.1",
852 | "resolved": "https://registry.npmmirror.com/@radix-ui/primitive/-/primitive-1.1.1.tgz",
853 | "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==",
854 | "license": "MIT"
855 | },
856 | "node_modules/@radix-ui/react-accessible-icon": {
857 | "version": "1.1.1",
858 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.1.tgz",
859 | "integrity": "sha512-DH8vuU7oqHt9RhO3V9Z1b8ek+bOl4+9VLsh0cgL6t7f2WhbuOChm3ft0EmCCsfd4ORi7Cs3II4aNcTXi+bh+wg==",
860 | "license": "MIT",
861 | "dependencies": {
862 | "@radix-ui/react-visually-hidden": "1.1.1"
863 | },
864 | "peerDependencies": {
865 | "@types/react": "*",
866 | "@types/react-dom": "*",
867 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
868 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
869 | },
870 | "peerDependenciesMeta": {
871 | "@types/react": {
872 | "optional": true
873 | },
874 | "@types/react-dom": {
875 | "optional": true
876 | }
877 | }
878 | },
879 | "node_modules/@radix-ui/react-accordion": {
880 | "version": "1.2.2",
881 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-accordion/-/react-accordion-1.2.2.tgz",
882 | "integrity": "sha512-b1oh54x4DMCdGsB4/7ahiSrViXxaBwRPotiZNnYXjLha9vfuURSAZErki6qjDoSIV0eXx5v57XnTGVtGwnfp2g==",
883 | "license": "MIT",
884 | "dependencies": {
885 | "@radix-ui/primitive": "1.1.1",
886 | "@radix-ui/react-collapsible": "1.1.2",
887 | "@radix-ui/react-collection": "1.1.1",
888 | "@radix-ui/react-compose-refs": "1.1.1",
889 | "@radix-ui/react-context": "1.1.1",
890 | "@radix-ui/react-direction": "1.1.0",
891 | "@radix-ui/react-id": "1.1.0",
892 | "@radix-ui/react-primitive": "2.0.1",
893 | "@radix-ui/react-use-controllable-state": "1.1.0"
894 | },
895 | "peerDependencies": {
896 | "@types/react": "*",
897 | "@types/react-dom": "*",
898 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
899 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
900 | },
901 | "peerDependenciesMeta": {
902 | "@types/react": {
903 | "optional": true
904 | },
905 | "@types/react-dom": {
906 | "optional": true
907 | }
908 | }
909 | },
910 | "node_modules/@radix-ui/react-alert-dialog": {
911 | "version": "1.1.5",
912 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.5.tgz",
913 | "integrity": "sha512-1Y2sI17QzSZP58RjGtrklfSGIf3AF7U/HkD3aAcAnhOUJrm7+7GG1wRDFaUlSe0nW5B/t4mYd/+7RNbP2Wexug==",
914 | "license": "MIT",
915 | "dependencies": {
916 | "@radix-ui/primitive": "1.1.1",
917 | "@radix-ui/react-compose-refs": "1.1.1",
918 | "@radix-ui/react-context": "1.1.1",
919 | "@radix-ui/react-dialog": "1.1.5",
920 | "@radix-ui/react-primitive": "2.0.1",
921 | "@radix-ui/react-slot": "1.1.1"
922 | },
923 | "peerDependencies": {
924 | "@types/react": "*",
925 | "@types/react-dom": "*",
926 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
927 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
928 | },
929 | "peerDependenciesMeta": {
930 | "@types/react": {
931 | "optional": true
932 | },
933 | "@types/react-dom": {
934 | "optional": true
935 | }
936 | }
937 | },
938 | "node_modules/@radix-ui/react-arrow": {
939 | "version": "1.1.1",
940 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-arrow/-/react-arrow-1.1.1.tgz",
941 | "integrity": "sha512-NaVpZfmv8SKeZbn4ijN2V3jlHA9ngBG16VnIIm22nUR0Yk8KUALyBxT3KYEUnNuch9sTE8UTsS3whzBgKOL30w==",
942 | "license": "MIT",
943 | "dependencies": {
944 | "@radix-ui/react-primitive": "2.0.1"
945 | },
946 | "peerDependencies": {
947 | "@types/react": "*",
948 | "@types/react-dom": "*",
949 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
950 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
951 | },
952 | "peerDependenciesMeta": {
953 | "@types/react": {
954 | "optional": true
955 | },
956 | "@types/react-dom": {
957 | "optional": true
958 | }
959 | }
960 | },
961 | "node_modules/@radix-ui/react-aspect-ratio": {
962 | "version": "1.1.1",
963 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.1.tgz",
964 | "integrity": "sha512-kNU4FIpcFMBLkOUcgeIteH06/8JLBcYY6Le1iKenDGCYNYFX3TQqCZjzkOsz37h7r94/99GTb7YhEr98ZBJibw==",
965 | "license": "MIT",
966 | "dependencies": {
967 | "@radix-ui/react-primitive": "2.0.1"
968 | },
969 | "peerDependencies": {
970 | "@types/react": "*",
971 | "@types/react-dom": "*",
972 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
973 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
974 | },
975 | "peerDependenciesMeta": {
976 | "@types/react": {
977 | "optional": true
978 | },
979 | "@types/react-dom": {
980 | "optional": true
981 | }
982 | }
983 | },
984 | "node_modules/@radix-ui/react-avatar": {
985 | "version": "1.1.2",
986 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-avatar/-/react-avatar-1.1.2.tgz",
987 | "integrity": "sha512-GaC7bXQZ5VgZvVvsJ5mu/AEbjYLnhhkoidOboC50Z6FFlLA03wG2ianUoH+zgDQ31/9gCF59bE4+2bBgTyMiig==",
988 | "license": "MIT",
989 | "dependencies": {
990 | "@radix-ui/react-context": "1.1.1",
991 | "@radix-ui/react-primitive": "2.0.1",
992 | "@radix-ui/react-use-callback-ref": "1.1.0",
993 | "@radix-ui/react-use-layout-effect": "1.1.0"
994 | },
995 | "peerDependencies": {
996 | "@types/react": "*",
997 | "@types/react-dom": "*",
998 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
999 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1000 | },
1001 | "peerDependenciesMeta": {
1002 | "@types/react": {
1003 | "optional": true
1004 | },
1005 | "@types/react-dom": {
1006 | "optional": true
1007 | }
1008 | }
1009 | },
1010 | "node_modules/@radix-ui/react-checkbox": {
1011 | "version": "1.1.3",
1012 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-checkbox/-/react-checkbox-1.1.3.tgz",
1013 | "integrity": "sha512-HD7/ocp8f1B3e6OHygH0n7ZKjONkhciy1Nh0yuBgObqThc3oyx+vuMfFHKAknXRHHWVE9XvXStxJFyjUmB8PIw==",
1014 | "license": "MIT",
1015 | "dependencies": {
1016 | "@radix-ui/primitive": "1.1.1",
1017 | "@radix-ui/react-compose-refs": "1.1.1",
1018 | "@radix-ui/react-context": "1.1.1",
1019 | "@radix-ui/react-presence": "1.1.2",
1020 | "@radix-ui/react-primitive": "2.0.1",
1021 | "@radix-ui/react-use-controllable-state": "1.1.0",
1022 | "@radix-ui/react-use-previous": "1.1.0",
1023 | "@radix-ui/react-use-size": "1.1.0"
1024 | },
1025 | "peerDependencies": {
1026 | "@types/react": "*",
1027 | "@types/react-dom": "*",
1028 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1029 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1030 | },
1031 | "peerDependenciesMeta": {
1032 | "@types/react": {
1033 | "optional": true
1034 | },
1035 | "@types/react-dom": {
1036 | "optional": true
1037 | }
1038 | }
1039 | },
1040 | "node_modules/@radix-ui/react-collapsible": {
1041 | "version": "1.1.2",
1042 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-collapsible/-/react-collapsible-1.1.2.tgz",
1043 | "integrity": "sha512-PliMB63vxz7vggcyq0IxNYk8vGDrLXVWw4+W4B8YnwI1s18x7YZYqlG9PLX7XxAJUi0g2DxP4XKJMFHh/iVh9A==",
1044 | "license": "MIT",
1045 | "dependencies": {
1046 | "@radix-ui/primitive": "1.1.1",
1047 | "@radix-ui/react-compose-refs": "1.1.1",
1048 | "@radix-ui/react-context": "1.1.1",
1049 | "@radix-ui/react-id": "1.1.0",
1050 | "@radix-ui/react-presence": "1.1.2",
1051 | "@radix-ui/react-primitive": "2.0.1",
1052 | "@radix-ui/react-use-controllable-state": "1.1.0",
1053 | "@radix-ui/react-use-layout-effect": "1.1.0"
1054 | },
1055 | "peerDependencies": {
1056 | "@types/react": "*",
1057 | "@types/react-dom": "*",
1058 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1059 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1060 | },
1061 | "peerDependenciesMeta": {
1062 | "@types/react": {
1063 | "optional": true
1064 | },
1065 | "@types/react-dom": {
1066 | "optional": true
1067 | }
1068 | }
1069 | },
1070 | "node_modules/@radix-ui/react-collection": {
1071 | "version": "1.1.1",
1072 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-collection/-/react-collection-1.1.1.tgz",
1073 | "integrity": "sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==",
1074 | "license": "MIT",
1075 | "dependencies": {
1076 | "@radix-ui/react-compose-refs": "1.1.1",
1077 | "@radix-ui/react-context": "1.1.1",
1078 | "@radix-ui/react-primitive": "2.0.1",
1079 | "@radix-ui/react-slot": "1.1.1"
1080 | },
1081 | "peerDependencies": {
1082 | "@types/react": "*",
1083 | "@types/react-dom": "*",
1084 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1085 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1086 | },
1087 | "peerDependenciesMeta": {
1088 | "@types/react": {
1089 | "optional": true
1090 | },
1091 | "@types/react-dom": {
1092 | "optional": true
1093 | }
1094 | }
1095 | },
1096 | "node_modules/@radix-ui/react-compose-refs": {
1097 | "version": "1.1.1",
1098 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz",
1099 | "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==",
1100 | "license": "MIT",
1101 | "peerDependencies": {
1102 | "@types/react": "*",
1103 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1104 | },
1105 | "peerDependenciesMeta": {
1106 | "@types/react": {
1107 | "optional": true
1108 | }
1109 | }
1110 | },
1111 | "node_modules/@radix-ui/react-context": {
1112 | "version": "1.1.1",
1113 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-context/-/react-context-1.1.1.tgz",
1114 | "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==",
1115 | "license": "MIT",
1116 | "peerDependencies": {
1117 | "@types/react": "*",
1118 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1119 | },
1120 | "peerDependenciesMeta": {
1121 | "@types/react": {
1122 | "optional": true
1123 | }
1124 | }
1125 | },
1126 | "node_modules/@radix-ui/react-context-menu": {
1127 | "version": "2.2.5",
1128 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-context-menu/-/react-context-menu-2.2.5.tgz",
1129 | "integrity": "sha512-MY5PFCwo/ICaaQtpQBQ0g19AyjzI0mhz+a2GUWA2pJf4XFkvglAdcgDV2Iqm+lLbXn8hb+6rbLgcmRtc6ImPvg==",
1130 | "license": "MIT",
1131 | "dependencies": {
1132 | "@radix-ui/primitive": "1.1.1",
1133 | "@radix-ui/react-context": "1.1.1",
1134 | "@radix-ui/react-menu": "2.1.5",
1135 | "@radix-ui/react-primitive": "2.0.1",
1136 | "@radix-ui/react-use-callback-ref": "1.1.0",
1137 | "@radix-ui/react-use-controllable-state": "1.1.0"
1138 | },
1139 | "peerDependencies": {
1140 | "@types/react": "*",
1141 | "@types/react-dom": "*",
1142 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1143 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1144 | },
1145 | "peerDependenciesMeta": {
1146 | "@types/react": {
1147 | "optional": true
1148 | },
1149 | "@types/react-dom": {
1150 | "optional": true
1151 | }
1152 | }
1153 | },
1154 | "node_modules/@radix-ui/react-dialog": {
1155 | "version": "1.1.5",
1156 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-dialog/-/react-dialog-1.1.5.tgz",
1157 | "integrity": "sha512-LaO3e5h/NOEL4OfXjxD43k9Dx+vn+8n+PCFt6uhX/BADFflllyv3WJG6rgvvSVBxpTch938Qq/LGc2MMxipXPw==",
1158 | "license": "MIT",
1159 | "dependencies": {
1160 | "@radix-ui/primitive": "1.1.1",
1161 | "@radix-ui/react-compose-refs": "1.1.1",
1162 | "@radix-ui/react-context": "1.1.1",
1163 | "@radix-ui/react-dismissable-layer": "1.1.4",
1164 | "@radix-ui/react-focus-guards": "1.1.1",
1165 | "@radix-ui/react-focus-scope": "1.1.1",
1166 | "@radix-ui/react-id": "1.1.0",
1167 | "@radix-ui/react-portal": "1.1.3",
1168 | "@radix-ui/react-presence": "1.1.2",
1169 | "@radix-ui/react-primitive": "2.0.1",
1170 | "@radix-ui/react-slot": "1.1.1",
1171 | "@radix-ui/react-use-controllable-state": "1.1.0",
1172 | "aria-hidden": "^1.2.4",
1173 | "react-remove-scroll": "^2.6.2"
1174 | },
1175 | "peerDependencies": {
1176 | "@types/react": "*",
1177 | "@types/react-dom": "*",
1178 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1179 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1180 | },
1181 | "peerDependenciesMeta": {
1182 | "@types/react": {
1183 | "optional": true
1184 | },
1185 | "@types/react-dom": {
1186 | "optional": true
1187 | }
1188 | }
1189 | },
1190 | "node_modules/@radix-ui/react-direction": {
1191 | "version": "1.1.0",
1192 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-direction/-/react-direction-1.1.0.tgz",
1193 | "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==",
1194 | "license": "MIT",
1195 | "peerDependencies": {
1196 | "@types/react": "*",
1197 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1198 | },
1199 | "peerDependenciesMeta": {
1200 | "@types/react": {
1201 | "optional": true
1202 | }
1203 | }
1204 | },
1205 | "node_modules/@radix-ui/react-dismissable-layer": {
1206 | "version": "1.1.4",
1207 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.4.tgz",
1208 | "integrity": "sha512-XDUI0IVYVSwjMXxM6P4Dfti7AH+Y4oS/TB+sglZ/EXc7cqLwGAmp1NlMrcUjj7ks6R5WTZuWKv44FBbLpwU3sA==",
1209 | "license": "MIT",
1210 | "dependencies": {
1211 | "@radix-ui/primitive": "1.1.1",
1212 | "@radix-ui/react-compose-refs": "1.1.1",
1213 | "@radix-ui/react-primitive": "2.0.1",
1214 | "@radix-ui/react-use-callback-ref": "1.1.0",
1215 | "@radix-ui/react-use-escape-keydown": "1.1.0"
1216 | },
1217 | "peerDependencies": {
1218 | "@types/react": "*",
1219 | "@types/react-dom": "*",
1220 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1221 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1222 | },
1223 | "peerDependenciesMeta": {
1224 | "@types/react": {
1225 | "optional": true
1226 | },
1227 | "@types/react-dom": {
1228 | "optional": true
1229 | }
1230 | }
1231 | },
1232 | "node_modules/@radix-ui/react-dropdown-menu": {
1233 | "version": "2.1.5",
1234 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.5.tgz",
1235 | "integrity": "sha512-50ZmEFL1kOuLalPKHrLWvPFMons2fGx9TqQCWlPwDVpbAnaUJ1g4XNcKqFNMQymYU0kKWR4MDDi+9vUQBGFgcQ==",
1236 | "license": "MIT",
1237 | "dependencies": {
1238 | "@radix-ui/primitive": "1.1.1",
1239 | "@radix-ui/react-compose-refs": "1.1.1",
1240 | "@radix-ui/react-context": "1.1.1",
1241 | "@radix-ui/react-id": "1.1.0",
1242 | "@radix-ui/react-menu": "2.1.5",
1243 | "@radix-ui/react-primitive": "2.0.1",
1244 | "@radix-ui/react-use-controllable-state": "1.1.0"
1245 | },
1246 | "peerDependencies": {
1247 | "@types/react": "*",
1248 | "@types/react-dom": "*",
1249 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1250 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1251 | },
1252 | "peerDependenciesMeta": {
1253 | "@types/react": {
1254 | "optional": true
1255 | },
1256 | "@types/react-dom": {
1257 | "optional": true
1258 | }
1259 | }
1260 | },
1261 | "node_modules/@radix-ui/react-focus-guards": {
1262 | "version": "1.1.1",
1263 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz",
1264 | "integrity": "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==",
1265 | "license": "MIT",
1266 | "peerDependencies": {
1267 | "@types/react": "*",
1268 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1269 | },
1270 | "peerDependenciesMeta": {
1271 | "@types/react": {
1272 | "optional": true
1273 | }
1274 | }
1275 | },
1276 | "node_modules/@radix-ui/react-focus-scope": {
1277 | "version": "1.1.1",
1278 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.1.tgz",
1279 | "integrity": "sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA==",
1280 | "license": "MIT",
1281 | "dependencies": {
1282 | "@radix-ui/react-compose-refs": "1.1.1",
1283 | "@radix-ui/react-primitive": "2.0.1",
1284 | "@radix-ui/react-use-callback-ref": "1.1.0"
1285 | },
1286 | "peerDependencies": {
1287 | "@types/react": "*",
1288 | "@types/react-dom": "*",
1289 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1290 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1291 | },
1292 | "peerDependenciesMeta": {
1293 | "@types/react": {
1294 | "optional": true
1295 | },
1296 | "@types/react-dom": {
1297 | "optional": true
1298 | }
1299 | }
1300 | },
1301 | "node_modules/@radix-ui/react-form": {
1302 | "version": "0.1.1",
1303 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-form/-/react-form-0.1.1.tgz",
1304 | "integrity": "sha512-Ah2TBvzl2trb4DL9DQtyUJgAUfq/djMN7j5CHzdpbdR3W7OL8N4JcJgE80cXMf3ssCE+8yg0zFQoJ0srxqfsFA==",
1305 | "license": "MIT",
1306 | "dependencies": {
1307 | "@radix-ui/primitive": "1.1.1",
1308 | "@radix-ui/react-compose-refs": "1.1.1",
1309 | "@radix-ui/react-context": "1.1.1",
1310 | "@radix-ui/react-id": "1.1.0",
1311 | "@radix-ui/react-label": "2.1.1",
1312 | "@radix-ui/react-primitive": "2.0.1"
1313 | },
1314 | "peerDependencies": {
1315 | "@types/react": "*",
1316 | "@types/react-dom": "*",
1317 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1318 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1319 | },
1320 | "peerDependenciesMeta": {
1321 | "@types/react": {
1322 | "optional": true
1323 | },
1324 | "@types/react-dom": {
1325 | "optional": true
1326 | }
1327 | }
1328 | },
1329 | "node_modules/@radix-ui/react-hover-card": {
1330 | "version": "1.1.5",
1331 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-hover-card/-/react-hover-card-1.1.5.tgz",
1332 | "integrity": "sha512-0jPlX3ZrUIhtMAY0m1SBn1koI4Yqsizq2UwdUiQF1GseSZLZBPa6b8tNS+m32K94Yb4wxtWFSQs85wujQvwahg==",
1333 | "license": "MIT",
1334 | "dependencies": {
1335 | "@radix-ui/primitive": "1.1.1",
1336 | "@radix-ui/react-compose-refs": "1.1.1",
1337 | "@radix-ui/react-context": "1.1.1",
1338 | "@radix-ui/react-dismissable-layer": "1.1.4",
1339 | "@radix-ui/react-popper": "1.2.1",
1340 | "@radix-ui/react-portal": "1.1.3",
1341 | "@radix-ui/react-presence": "1.1.2",
1342 | "@radix-ui/react-primitive": "2.0.1",
1343 | "@radix-ui/react-use-controllable-state": "1.1.0"
1344 | },
1345 | "peerDependencies": {
1346 | "@types/react": "*",
1347 | "@types/react-dom": "*",
1348 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1349 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1350 | },
1351 | "peerDependenciesMeta": {
1352 | "@types/react": {
1353 | "optional": true
1354 | },
1355 | "@types/react-dom": {
1356 | "optional": true
1357 | }
1358 | }
1359 | },
1360 | "node_modules/@radix-ui/react-icons": {
1361 | "version": "1.3.2",
1362 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-icons/-/react-icons-1.3.2.tgz",
1363 | "integrity": "sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g==",
1364 | "license": "MIT",
1365 | "peerDependencies": {
1366 | "react": "^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc"
1367 | }
1368 | },
1369 | "node_modules/@radix-ui/react-id": {
1370 | "version": "1.1.0",
1371 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-id/-/react-id-1.1.0.tgz",
1372 | "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==",
1373 | "license": "MIT",
1374 | "dependencies": {
1375 | "@radix-ui/react-use-layout-effect": "1.1.0"
1376 | },
1377 | "peerDependencies": {
1378 | "@types/react": "*",
1379 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1380 | },
1381 | "peerDependenciesMeta": {
1382 | "@types/react": {
1383 | "optional": true
1384 | }
1385 | }
1386 | },
1387 | "node_modules/@radix-ui/react-label": {
1388 | "version": "2.1.1",
1389 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-label/-/react-label-2.1.1.tgz",
1390 | "integrity": "sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw==",
1391 | "license": "MIT",
1392 | "dependencies": {
1393 | "@radix-ui/react-primitive": "2.0.1"
1394 | },
1395 | "peerDependencies": {
1396 | "@types/react": "*",
1397 | "@types/react-dom": "*",
1398 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1399 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1400 | },
1401 | "peerDependenciesMeta": {
1402 | "@types/react": {
1403 | "optional": true
1404 | },
1405 | "@types/react-dom": {
1406 | "optional": true
1407 | }
1408 | }
1409 | },
1410 | "node_modules/@radix-ui/react-menu": {
1411 | "version": "2.1.5",
1412 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-menu/-/react-menu-2.1.5.tgz",
1413 | "integrity": "sha512-uH+3w5heoMJtqVCgYOtYVMECk1TOrkUn0OG0p5MqXC0W2ppcuVeESbou8PTHoqAjbdTEK19AGXBWcEtR5WpEQg==",
1414 | "license": "MIT",
1415 | "dependencies": {
1416 | "@radix-ui/primitive": "1.1.1",
1417 | "@radix-ui/react-collection": "1.1.1",
1418 | "@radix-ui/react-compose-refs": "1.1.1",
1419 | "@radix-ui/react-context": "1.1.1",
1420 | "@radix-ui/react-direction": "1.1.0",
1421 | "@radix-ui/react-dismissable-layer": "1.1.4",
1422 | "@radix-ui/react-focus-guards": "1.1.1",
1423 | "@radix-ui/react-focus-scope": "1.1.1",
1424 | "@radix-ui/react-id": "1.1.0",
1425 | "@radix-ui/react-popper": "1.2.1",
1426 | "@radix-ui/react-portal": "1.1.3",
1427 | "@radix-ui/react-presence": "1.1.2",
1428 | "@radix-ui/react-primitive": "2.0.1",
1429 | "@radix-ui/react-roving-focus": "1.1.1",
1430 | "@radix-ui/react-slot": "1.1.1",
1431 | "@radix-ui/react-use-callback-ref": "1.1.0",
1432 | "aria-hidden": "^1.2.4",
1433 | "react-remove-scroll": "^2.6.2"
1434 | },
1435 | "peerDependencies": {
1436 | "@types/react": "*",
1437 | "@types/react-dom": "*",
1438 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1439 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1440 | },
1441 | "peerDependenciesMeta": {
1442 | "@types/react": {
1443 | "optional": true
1444 | },
1445 | "@types/react-dom": {
1446 | "optional": true
1447 | }
1448 | }
1449 | },
1450 | "node_modules/@radix-ui/react-menubar": {
1451 | "version": "1.1.5",
1452 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-menubar/-/react-menubar-1.1.5.tgz",
1453 | "integrity": "sha512-Kzbpcf2bxUmI/G+949+LvSvGkyzIaY7ctb8loydt6YpJR8pQF+j4QbVhYvjs7qxaWK0DEJL3XbP2p46YPRkS3A==",
1454 | "license": "MIT",
1455 | "dependencies": {
1456 | "@radix-ui/primitive": "1.1.1",
1457 | "@radix-ui/react-collection": "1.1.1",
1458 | "@radix-ui/react-compose-refs": "1.1.1",
1459 | "@radix-ui/react-context": "1.1.1",
1460 | "@radix-ui/react-direction": "1.1.0",
1461 | "@radix-ui/react-id": "1.1.0",
1462 | "@radix-ui/react-menu": "2.1.5",
1463 | "@radix-ui/react-primitive": "2.0.1",
1464 | "@radix-ui/react-roving-focus": "1.1.1",
1465 | "@radix-ui/react-use-controllable-state": "1.1.0"
1466 | },
1467 | "peerDependencies": {
1468 | "@types/react": "*",
1469 | "@types/react-dom": "*",
1470 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1471 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1472 | },
1473 | "peerDependenciesMeta": {
1474 | "@types/react": {
1475 | "optional": true
1476 | },
1477 | "@types/react-dom": {
1478 | "optional": true
1479 | }
1480 | }
1481 | },
1482 | "node_modules/@radix-ui/react-navigation-menu": {
1483 | "version": "1.2.4",
1484 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.4.tgz",
1485 | "integrity": "sha512-wUi01RrTDTOoGtjEPHsxlzPtVzVc3R/AZ5wfh0dyqMAqolhHAHvG5iQjBCTi2AjQqa77FWWbA3kE3RkD+bDMgQ==",
1486 | "license": "MIT",
1487 | "dependencies": {
1488 | "@radix-ui/primitive": "1.1.1",
1489 | "@radix-ui/react-collection": "1.1.1",
1490 | "@radix-ui/react-compose-refs": "1.1.1",
1491 | "@radix-ui/react-context": "1.1.1",
1492 | "@radix-ui/react-direction": "1.1.0",
1493 | "@radix-ui/react-dismissable-layer": "1.1.4",
1494 | "@radix-ui/react-id": "1.1.0",
1495 | "@radix-ui/react-presence": "1.1.2",
1496 | "@radix-ui/react-primitive": "2.0.1",
1497 | "@radix-ui/react-use-callback-ref": "1.1.0",
1498 | "@radix-ui/react-use-controllable-state": "1.1.0",
1499 | "@radix-ui/react-use-layout-effect": "1.1.0",
1500 | "@radix-ui/react-use-previous": "1.1.0",
1501 | "@radix-ui/react-visually-hidden": "1.1.1"
1502 | },
1503 | "peerDependencies": {
1504 | "@types/react": "*",
1505 | "@types/react-dom": "*",
1506 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1507 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1508 | },
1509 | "peerDependenciesMeta": {
1510 | "@types/react": {
1511 | "optional": true
1512 | },
1513 | "@types/react-dom": {
1514 | "optional": true
1515 | }
1516 | }
1517 | },
1518 | "node_modules/@radix-ui/react-popover": {
1519 | "version": "1.1.5",
1520 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-popover/-/react-popover-1.1.5.tgz",
1521 | "integrity": "sha512-YXkTAftOIW2Bt3qKH8vYr6n9gCkVrvyvfiTObVjoHVTHnNj26rmvO87IKa3VgtgCjb8FAQ6qOjNViwl+9iIzlg==",
1522 | "license": "MIT",
1523 | "dependencies": {
1524 | "@radix-ui/primitive": "1.1.1",
1525 | "@radix-ui/react-compose-refs": "1.1.1",
1526 | "@radix-ui/react-context": "1.1.1",
1527 | "@radix-ui/react-dismissable-layer": "1.1.4",
1528 | "@radix-ui/react-focus-guards": "1.1.1",
1529 | "@radix-ui/react-focus-scope": "1.1.1",
1530 | "@radix-ui/react-id": "1.1.0",
1531 | "@radix-ui/react-popper": "1.2.1",
1532 | "@radix-ui/react-portal": "1.1.3",
1533 | "@radix-ui/react-presence": "1.1.2",
1534 | "@radix-ui/react-primitive": "2.0.1",
1535 | "@radix-ui/react-slot": "1.1.1",
1536 | "@radix-ui/react-use-controllable-state": "1.1.0",
1537 | "aria-hidden": "^1.2.4",
1538 | "react-remove-scroll": "^2.6.2"
1539 | },
1540 | "peerDependencies": {
1541 | "@types/react": "*",
1542 | "@types/react-dom": "*",
1543 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1544 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1545 | },
1546 | "peerDependenciesMeta": {
1547 | "@types/react": {
1548 | "optional": true
1549 | },
1550 | "@types/react-dom": {
1551 | "optional": true
1552 | }
1553 | }
1554 | },
1555 | "node_modules/@radix-ui/react-popper": {
1556 | "version": "1.2.1",
1557 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-popper/-/react-popper-1.2.1.tgz",
1558 | "integrity": "sha512-3kn5Me69L+jv82EKRuQCXdYyf1DqHwD2U/sxoNgBGCB7K9TRc3bQamQ+5EPM9EvyPdli0W41sROd+ZU1dTCztw==",
1559 | "license": "MIT",
1560 | "dependencies": {
1561 | "@floating-ui/react-dom": "^2.0.0",
1562 | "@radix-ui/react-arrow": "1.1.1",
1563 | "@radix-ui/react-compose-refs": "1.1.1",
1564 | "@radix-ui/react-context": "1.1.1",
1565 | "@radix-ui/react-primitive": "2.0.1",
1566 | "@radix-ui/react-use-callback-ref": "1.1.0",
1567 | "@radix-ui/react-use-layout-effect": "1.1.0",
1568 | "@radix-ui/react-use-rect": "1.1.0",
1569 | "@radix-ui/react-use-size": "1.1.0",
1570 | "@radix-ui/rect": "1.1.0"
1571 | },
1572 | "peerDependencies": {
1573 | "@types/react": "*",
1574 | "@types/react-dom": "*",
1575 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1576 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1577 | },
1578 | "peerDependenciesMeta": {
1579 | "@types/react": {
1580 | "optional": true
1581 | },
1582 | "@types/react-dom": {
1583 | "optional": true
1584 | }
1585 | }
1586 | },
1587 | "node_modules/@radix-ui/react-portal": {
1588 | "version": "1.1.3",
1589 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-portal/-/react-portal-1.1.3.tgz",
1590 | "integrity": "sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw==",
1591 | "license": "MIT",
1592 | "dependencies": {
1593 | "@radix-ui/react-primitive": "2.0.1",
1594 | "@radix-ui/react-use-layout-effect": "1.1.0"
1595 | },
1596 | "peerDependencies": {
1597 | "@types/react": "*",
1598 | "@types/react-dom": "*",
1599 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1600 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1601 | },
1602 | "peerDependenciesMeta": {
1603 | "@types/react": {
1604 | "optional": true
1605 | },
1606 | "@types/react-dom": {
1607 | "optional": true
1608 | }
1609 | }
1610 | },
1611 | "node_modules/@radix-ui/react-presence": {
1612 | "version": "1.1.2",
1613 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-presence/-/react-presence-1.1.2.tgz",
1614 | "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==",
1615 | "license": "MIT",
1616 | "dependencies": {
1617 | "@radix-ui/react-compose-refs": "1.1.1",
1618 | "@radix-ui/react-use-layout-effect": "1.1.0"
1619 | },
1620 | "peerDependencies": {
1621 | "@types/react": "*",
1622 | "@types/react-dom": "*",
1623 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1624 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1625 | },
1626 | "peerDependenciesMeta": {
1627 | "@types/react": {
1628 | "optional": true
1629 | },
1630 | "@types/react-dom": {
1631 | "optional": true
1632 | }
1633 | }
1634 | },
1635 | "node_modules/@radix-ui/react-primitive": {
1636 | "version": "2.0.1",
1637 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz",
1638 | "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==",
1639 | "license": "MIT",
1640 | "dependencies": {
1641 | "@radix-ui/react-slot": "1.1.1"
1642 | },
1643 | "peerDependencies": {
1644 | "@types/react": "*",
1645 | "@types/react-dom": "*",
1646 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1647 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1648 | },
1649 | "peerDependenciesMeta": {
1650 | "@types/react": {
1651 | "optional": true
1652 | },
1653 | "@types/react-dom": {
1654 | "optional": true
1655 | }
1656 | }
1657 | },
1658 | "node_modules/@radix-ui/react-progress": {
1659 | "version": "1.1.1",
1660 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-progress/-/react-progress-1.1.1.tgz",
1661 | "integrity": "sha512-6diOawA84f/eMxFHcWut0aE1C2kyE9dOyCTQOMRR2C/qPiXz/X0SaiA/RLbapQaXUCmy0/hLMf9meSccD1N0pA==",
1662 | "license": "MIT",
1663 | "dependencies": {
1664 | "@radix-ui/react-context": "1.1.1",
1665 | "@radix-ui/react-primitive": "2.0.1"
1666 | },
1667 | "peerDependencies": {
1668 | "@types/react": "*",
1669 | "@types/react-dom": "*",
1670 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1671 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1672 | },
1673 | "peerDependenciesMeta": {
1674 | "@types/react": {
1675 | "optional": true
1676 | },
1677 | "@types/react-dom": {
1678 | "optional": true
1679 | }
1680 | }
1681 | },
1682 | "node_modules/@radix-ui/react-radio-group": {
1683 | "version": "1.2.2",
1684 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-radio-group/-/react-radio-group-1.2.2.tgz",
1685 | "integrity": "sha512-E0MLLGfOP0l8P/NxgVzfXJ8w3Ch8cdO6UDzJfDChu4EJDy+/WdO5LqpdY8PYnCErkmZH3gZhDL1K7kQ41fAHuQ==",
1686 | "license": "MIT",
1687 | "dependencies": {
1688 | "@radix-ui/primitive": "1.1.1",
1689 | "@radix-ui/react-compose-refs": "1.1.1",
1690 | "@radix-ui/react-context": "1.1.1",
1691 | "@radix-ui/react-direction": "1.1.0",
1692 | "@radix-ui/react-presence": "1.1.2",
1693 | "@radix-ui/react-primitive": "2.0.1",
1694 | "@radix-ui/react-roving-focus": "1.1.1",
1695 | "@radix-ui/react-use-controllable-state": "1.1.0",
1696 | "@radix-ui/react-use-previous": "1.1.0",
1697 | "@radix-ui/react-use-size": "1.1.0"
1698 | },
1699 | "peerDependencies": {
1700 | "@types/react": "*",
1701 | "@types/react-dom": "*",
1702 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1703 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1704 | },
1705 | "peerDependenciesMeta": {
1706 | "@types/react": {
1707 | "optional": true
1708 | },
1709 | "@types/react-dom": {
1710 | "optional": true
1711 | }
1712 | }
1713 | },
1714 | "node_modules/@radix-ui/react-roving-focus": {
1715 | "version": "1.1.1",
1716 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.1.tgz",
1717 | "integrity": "sha512-QE1RoxPGJ/Nm8Qmk0PxP8ojmoaS67i0s7hVssS7KuI2FQoc/uzVlZsqKfQvxPE6D8hICCPHJ4D88zNhT3OOmkw==",
1718 | "license": "MIT",
1719 | "dependencies": {
1720 | "@radix-ui/primitive": "1.1.1",
1721 | "@radix-ui/react-collection": "1.1.1",
1722 | "@radix-ui/react-compose-refs": "1.1.1",
1723 | "@radix-ui/react-context": "1.1.1",
1724 | "@radix-ui/react-direction": "1.1.0",
1725 | "@radix-ui/react-id": "1.1.0",
1726 | "@radix-ui/react-primitive": "2.0.1",
1727 | "@radix-ui/react-use-callback-ref": "1.1.0",
1728 | "@radix-ui/react-use-controllable-state": "1.1.0"
1729 | },
1730 | "peerDependencies": {
1731 | "@types/react": "*",
1732 | "@types/react-dom": "*",
1733 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1734 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1735 | },
1736 | "peerDependenciesMeta": {
1737 | "@types/react": {
1738 | "optional": true
1739 | },
1740 | "@types/react-dom": {
1741 | "optional": true
1742 | }
1743 | }
1744 | },
1745 | "node_modules/@radix-ui/react-scroll-area": {
1746 | "version": "1.2.2",
1747 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.2.tgz",
1748 | "integrity": "sha512-EFI1N/S3YxZEW/lJ/H1jY3njlvTd8tBmgKEn4GHi51+aMm94i6NmAJstsm5cu3yJwYqYc93gpCPm21FeAbFk6g==",
1749 | "license": "MIT",
1750 | "dependencies": {
1751 | "@radix-ui/number": "1.1.0",
1752 | "@radix-ui/primitive": "1.1.1",
1753 | "@radix-ui/react-compose-refs": "1.1.1",
1754 | "@radix-ui/react-context": "1.1.1",
1755 | "@radix-ui/react-direction": "1.1.0",
1756 | "@radix-ui/react-presence": "1.1.2",
1757 | "@radix-ui/react-primitive": "2.0.1",
1758 | "@radix-ui/react-use-callback-ref": "1.1.0",
1759 | "@radix-ui/react-use-layout-effect": "1.1.0"
1760 | },
1761 | "peerDependencies": {
1762 | "@types/react": "*",
1763 | "@types/react-dom": "*",
1764 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1765 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1766 | },
1767 | "peerDependenciesMeta": {
1768 | "@types/react": {
1769 | "optional": true
1770 | },
1771 | "@types/react-dom": {
1772 | "optional": true
1773 | }
1774 | }
1775 | },
1776 | "node_modules/@radix-ui/react-select": {
1777 | "version": "2.1.5",
1778 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-select/-/react-select-2.1.5.tgz",
1779 | "integrity": "sha512-eVV7N8jBXAXnyrc+PsOF89O9AfVgGnbLxUtBb0clJ8y8ENMWLARGMI/1/SBRLz7u4HqxLgN71BJ17eono3wcjA==",
1780 | "license": "MIT",
1781 | "dependencies": {
1782 | "@radix-ui/number": "1.1.0",
1783 | "@radix-ui/primitive": "1.1.1",
1784 | "@radix-ui/react-collection": "1.1.1",
1785 | "@radix-ui/react-compose-refs": "1.1.1",
1786 | "@radix-ui/react-context": "1.1.1",
1787 | "@radix-ui/react-direction": "1.1.0",
1788 | "@radix-ui/react-dismissable-layer": "1.1.4",
1789 | "@radix-ui/react-focus-guards": "1.1.1",
1790 | "@radix-ui/react-focus-scope": "1.1.1",
1791 | "@radix-ui/react-id": "1.1.0",
1792 | "@radix-ui/react-popper": "1.2.1",
1793 | "@radix-ui/react-portal": "1.1.3",
1794 | "@radix-ui/react-primitive": "2.0.1",
1795 | "@radix-ui/react-slot": "1.1.1",
1796 | "@radix-ui/react-use-callback-ref": "1.1.0",
1797 | "@radix-ui/react-use-controllable-state": "1.1.0",
1798 | "@radix-ui/react-use-layout-effect": "1.1.0",
1799 | "@radix-ui/react-use-previous": "1.1.0",
1800 | "@radix-ui/react-visually-hidden": "1.1.1",
1801 | "aria-hidden": "^1.2.4",
1802 | "react-remove-scroll": "^2.6.2"
1803 | },
1804 | "peerDependencies": {
1805 | "@types/react": "*",
1806 | "@types/react-dom": "*",
1807 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1808 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1809 | },
1810 | "peerDependenciesMeta": {
1811 | "@types/react": {
1812 | "optional": true
1813 | },
1814 | "@types/react-dom": {
1815 | "optional": true
1816 | }
1817 | }
1818 | },
1819 | "node_modules/@radix-ui/react-separator": {
1820 | "version": "1.1.1",
1821 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-separator/-/react-separator-1.1.1.tgz",
1822 | "integrity": "sha512-RRiNRSrD8iUiXriq/Y5n4/3iE8HzqgLHsusUSg5jVpU2+3tqcUFPJXHDymwEypunc2sWxDUS3UC+rkZRlHedsw==",
1823 | "license": "MIT",
1824 | "dependencies": {
1825 | "@radix-ui/react-primitive": "2.0.1"
1826 | },
1827 | "peerDependencies": {
1828 | "@types/react": "*",
1829 | "@types/react-dom": "*",
1830 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1831 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1832 | },
1833 | "peerDependenciesMeta": {
1834 | "@types/react": {
1835 | "optional": true
1836 | },
1837 | "@types/react-dom": {
1838 | "optional": true
1839 | }
1840 | }
1841 | },
1842 | "node_modules/@radix-ui/react-slider": {
1843 | "version": "1.2.2",
1844 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-slider/-/react-slider-1.2.2.tgz",
1845 | "integrity": "sha512-sNlU06ii1/ZcbHf8I9En54ZPW0Vil/yPVg4vQMcFNjrIx51jsHbFl1HYHQvCIWJSr1q0ZmA+iIs/ZTv8h7HHSA==",
1846 | "license": "MIT",
1847 | "dependencies": {
1848 | "@radix-ui/number": "1.1.0",
1849 | "@radix-ui/primitive": "1.1.1",
1850 | "@radix-ui/react-collection": "1.1.1",
1851 | "@radix-ui/react-compose-refs": "1.1.1",
1852 | "@radix-ui/react-context": "1.1.1",
1853 | "@radix-ui/react-direction": "1.1.0",
1854 | "@radix-ui/react-primitive": "2.0.1",
1855 | "@radix-ui/react-use-controllable-state": "1.1.0",
1856 | "@radix-ui/react-use-layout-effect": "1.1.0",
1857 | "@radix-ui/react-use-previous": "1.1.0",
1858 | "@radix-ui/react-use-size": "1.1.0"
1859 | },
1860 | "peerDependencies": {
1861 | "@types/react": "*",
1862 | "@types/react-dom": "*",
1863 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1864 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1865 | },
1866 | "peerDependenciesMeta": {
1867 | "@types/react": {
1868 | "optional": true
1869 | },
1870 | "@types/react-dom": {
1871 | "optional": true
1872 | }
1873 | }
1874 | },
1875 | "node_modules/@radix-ui/react-slot": {
1876 | "version": "1.1.1",
1877 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-slot/-/react-slot-1.1.1.tgz",
1878 | "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==",
1879 | "license": "MIT",
1880 | "dependencies": {
1881 | "@radix-ui/react-compose-refs": "1.1.1"
1882 | },
1883 | "peerDependencies": {
1884 | "@types/react": "*",
1885 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1886 | },
1887 | "peerDependenciesMeta": {
1888 | "@types/react": {
1889 | "optional": true
1890 | }
1891 | }
1892 | },
1893 | "node_modules/@radix-ui/react-switch": {
1894 | "version": "1.1.2",
1895 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-switch/-/react-switch-1.1.2.tgz",
1896 | "integrity": "sha512-zGukiWHjEdBCRyXvKR6iXAQG6qXm2esuAD6kDOi9Cn+1X6ev3ASo4+CsYaD6Fov9r/AQFekqnD/7+V0Cs6/98g==",
1897 | "license": "MIT",
1898 | "dependencies": {
1899 | "@radix-ui/primitive": "1.1.1",
1900 | "@radix-ui/react-compose-refs": "1.1.1",
1901 | "@radix-ui/react-context": "1.1.1",
1902 | "@radix-ui/react-primitive": "2.0.1",
1903 | "@radix-ui/react-use-controllable-state": "1.1.0",
1904 | "@radix-ui/react-use-previous": "1.1.0",
1905 | "@radix-ui/react-use-size": "1.1.0"
1906 | },
1907 | "peerDependencies": {
1908 | "@types/react": "*",
1909 | "@types/react-dom": "*",
1910 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1911 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1912 | },
1913 | "peerDependenciesMeta": {
1914 | "@types/react": {
1915 | "optional": true
1916 | },
1917 | "@types/react-dom": {
1918 | "optional": true
1919 | }
1920 | }
1921 | },
1922 | "node_modules/@radix-ui/react-tabs": {
1923 | "version": "1.1.2",
1924 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-tabs/-/react-tabs-1.1.2.tgz",
1925 | "integrity": "sha512-9u/tQJMcC2aGq7KXpGivMm1mgq7oRJKXphDwdypPd/j21j/2znamPU8WkXgnhUaTrSFNIt8XhOyCAupg8/GbwQ==",
1926 | "license": "MIT",
1927 | "dependencies": {
1928 | "@radix-ui/primitive": "1.1.1",
1929 | "@radix-ui/react-context": "1.1.1",
1930 | "@radix-ui/react-direction": "1.1.0",
1931 | "@radix-ui/react-id": "1.1.0",
1932 | "@radix-ui/react-presence": "1.1.2",
1933 | "@radix-ui/react-primitive": "2.0.1",
1934 | "@radix-ui/react-roving-focus": "1.1.1",
1935 | "@radix-ui/react-use-controllable-state": "1.1.0"
1936 | },
1937 | "peerDependencies": {
1938 | "@types/react": "*",
1939 | "@types/react-dom": "*",
1940 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1941 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1942 | },
1943 | "peerDependenciesMeta": {
1944 | "@types/react": {
1945 | "optional": true
1946 | },
1947 | "@types/react-dom": {
1948 | "optional": true
1949 | }
1950 | }
1951 | },
1952 | "node_modules/@radix-ui/react-toast": {
1953 | "version": "1.2.5",
1954 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-toast/-/react-toast-1.2.5.tgz",
1955 | "integrity": "sha512-ZzUsAaOx8NdXZZKcFNDhbSlbsCUy8qQWmzTdgrlrhhZAOx2ofLtKrBDW9fkqhFvXgmtv560Uj16pkLkqML7SHA==",
1956 | "license": "MIT",
1957 | "dependencies": {
1958 | "@radix-ui/primitive": "1.1.1",
1959 | "@radix-ui/react-collection": "1.1.1",
1960 | "@radix-ui/react-compose-refs": "1.1.1",
1961 | "@radix-ui/react-context": "1.1.1",
1962 | "@radix-ui/react-dismissable-layer": "1.1.4",
1963 | "@radix-ui/react-portal": "1.1.3",
1964 | "@radix-ui/react-presence": "1.1.2",
1965 | "@radix-ui/react-primitive": "2.0.1",
1966 | "@radix-ui/react-use-callback-ref": "1.1.0",
1967 | "@radix-ui/react-use-controllable-state": "1.1.0",
1968 | "@radix-ui/react-use-layout-effect": "1.1.0",
1969 | "@radix-ui/react-visually-hidden": "1.1.1"
1970 | },
1971 | "peerDependencies": {
1972 | "@types/react": "*",
1973 | "@types/react-dom": "*",
1974 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1975 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1976 | },
1977 | "peerDependenciesMeta": {
1978 | "@types/react": {
1979 | "optional": true
1980 | },
1981 | "@types/react-dom": {
1982 | "optional": true
1983 | }
1984 | }
1985 | },
1986 | "node_modules/@radix-ui/react-toggle": {
1987 | "version": "1.1.1",
1988 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-toggle/-/react-toggle-1.1.1.tgz",
1989 | "integrity": "sha512-i77tcgObYr743IonC1hrsnnPmszDRn8p+EGUsUt+5a/JFn28fxaM88Py6V2mc8J5kELMWishI0rLnuGLFD/nnQ==",
1990 | "license": "MIT",
1991 | "dependencies": {
1992 | "@radix-ui/primitive": "1.1.1",
1993 | "@radix-ui/react-primitive": "2.0.1",
1994 | "@radix-ui/react-use-controllable-state": "1.1.0"
1995 | },
1996 | "peerDependencies": {
1997 | "@types/react": "*",
1998 | "@types/react-dom": "*",
1999 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2000 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2001 | },
2002 | "peerDependenciesMeta": {
2003 | "@types/react": {
2004 | "optional": true
2005 | },
2006 | "@types/react-dom": {
2007 | "optional": true
2008 | }
2009 | }
2010 | },
2011 | "node_modules/@radix-ui/react-toggle-group": {
2012 | "version": "1.1.1",
2013 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.1.tgz",
2014 | "integrity": "sha512-OgDLZEA30Ylyz8YSXvnGqIHtERqnUt1KUYTKdw/y8u7Ci6zGiJfXc02jahmcSNK3YcErqioj/9flWC9S1ihfwg==",
2015 | "license": "MIT",
2016 | "dependencies": {
2017 | "@radix-ui/primitive": "1.1.1",
2018 | "@radix-ui/react-context": "1.1.1",
2019 | "@radix-ui/react-direction": "1.1.0",
2020 | "@radix-ui/react-primitive": "2.0.1",
2021 | "@radix-ui/react-roving-focus": "1.1.1",
2022 | "@radix-ui/react-toggle": "1.1.1",
2023 | "@radix-ui/react-use-controllable-state": "1.1.0"
2024 | },
2025 | "peerDependencies": {
2026 | "@types/react": "*",
2027 | "@types/react-dom": "*",
2028 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2029 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2030 | },
2031 | "peerDependenciesMeta": {
2032 | "@types/react": {
2033 | "optional": true
2034 | },
2035 | "@types/react-dom": {
2036 | "optional": true
2037 | }
2038 | }
2039 | },
2040 | "node_modules/@radix-ui/react-toolbar": {
2041 | "version": "1.1.1",
2042 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-toolbar/-/react-toolbar-1.1.1.tgz",
2043 | "integrity": "sha512-r7T80WOCHc2n3KRzFCbHWGVzkfVTCzDofGU4gqa5ZuIzgnVaLogGsdyifFJXWQDp0lAr5hrf+X9uqQdE0pa6Ww==",
2044 | "license": "MIT",
2045 | "dependencies": {
2046 | "@radix-ui/primitive": "1.1.1",
2047 | "@radix-ui/react-context": "1.1.1",
2048 | "@radix-ui/react-direction": "1.1.0",
2049 | "@radix-ui/react-primitive": "2.0.1",
2050 | "@radix-ui/react-roving-focus": "1.1.1",
2051 | "@radix-ui/react-separator": "1.1.1",
2052 | "@radix-ui/react-toggle-group": "1.1.1"
2053 | },
2054 | "peerDependencies": {
2055 | "@types/react": "*",
2056 | "@types/react-dom": "*",
2057 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2058 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2059 | },
2060 | "peerDependenciesMeta": {
2061 | "@types/react": {
2062 | "optional": true
2063 | },
2064 | "@types/react-dom": {
2065 | "optional": true
2066 | }
2067 | }
2068 | },
2069 | "node_modules/@radix-ui/react-tooltip": {
2070 | "version": "1.1.7",
2071 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-tooltip/-/react-tooltip-1.1.7.tgz",
2072 | "integrity": "sha512-ss0s80BC0+g0+Zc53MvilcnTYSOi4mSuFWBPYPuTOFGjx+pUU+ZrmamMNwS56t8MTFlniA5ocjd4jYm/CdhbOg==",
2073 | "license": "MIT",
2074 | "dependencies": {
2075 | "@radix-ui/primitive": "1.1.1",
2076 | "@radix-ui/react-compose-refs": "1.1.1",
2077 | "@radix-ui/react-context": "1.1.1",
2078 | "@radix-ui/react-dismissable-layer": "1.1.4",
2079 | "@radix-ui/react-id": "1.1.0",
2080 | "@radix-ui/react-popper": "1.2.1",
2081 | "@radix-ui/react-portal": "1.1.3",
2082 | "@radix-ui/react-presence": "1.1.2",
2083 | "@radix-ui/react-primitive": "2.0.1",
2084 | "@radix-ui/react-slot": "1.1.1",
2085 | "@radix-ui/react-use-controllable-state": "1.1.0",
2086 | "@radix-ui/react-visually-hidden": "1.1.1"
2087 | },
2088 | "peerDependencies": {
2089 | "@types/react": "*",
2090 | "@types/react-dom": "*",
2091 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2092 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2093 | },
2094 | "peerDependenciesMeta": {
2095 | "@types/react": {
2096 | "optional": true
2097 | },
2098 | "@types/react-dom": {
2099 | "optional": true
2100 | }
2101 | }
2102 | },
2103 | "node_modules/@radix-ui/react-use-callback-ref": {
2104 | "version": "1.1.0",
2105 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz",
2106 | "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==",
2107 | "license": "MIT",
2108 | "peerDependencies": {
2109 | "@types/react": "*",
2110 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2111 | },
2112 | "peerDependenciesMeta": {
2113 | "@types/react": {
2114 | "optional": true
2115 | }
2116 | }
2117 | },
2118 | "node_modules/@radix-ui/react-use-controllable-state": {
2119 | "version": "1.1.0",
2120 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz",
2121 | "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==",
2122 | "license": "MIT",
2123 | "dependencies": {
2124 | "@radix-ui/react-use-callback-ref": "1.1.0"
2125 | },
2126 | "peerDependencies": {
2127 | "@types/react": "*",
2128 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2129 | },
2130 | "peerDependenciesMeta": {
2131 | "@types/react": {
2132 | "optional": true
2133 | }
2134 | }
2135 | },
2136 | "node_modules/@radix-ui/react-use-escape-keydown": {
2137 | "version": "1.1.0",
2138 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz",
2139 | "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==",
2140 | "license": "MIT",
2141 | "dependencies": {
2142 | "@radix-ui/react-use-callback-ref": "1.1.0"
2143 | },
2144 | "peerDependencies": {
2145 | "@types/react": "*",
2146 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2147 | },
2148 | "peerDependenciesMeta": {
2149 | "@types/react": {
2150 | "optional": true
2151 | }
2152 | }
2153 | },
2154 | "node_modules/@radix-ui/react-use-layout-effect": {
2155 | "version": "1.1.0",
2156 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz",
2157 | "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==",
2158 | "license": "MIT",
2159 | "peerDependencies": {
2160 | "@types/react": "*",
2161 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2162 | },
2163 | "peerDependenciesMeta": {
2164 | "@types/react": {
2165 | "optional": true
2166 | }
2167 | }
2168 | },
2169 | "node_modules/@radix-ui/react-use-previous": {
2170 | "version": "1.1.0",
2171 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz",
2172 | "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==",
2173 | "license": "MIT",
2174 | "peerDependencies": {
2175 | "@types/react": "*",
2176 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2177 | },
2178 | "peerDependenciesMeta": {
2179 | "@types/react": {
2180 | "optional": true
2181 | }
2182 | }
2183 | },
2184 | "node_modules/@radix-ui/react-use-rect": {
2185 | "version": "1.1.0",
2186 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz",
2187 | "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==",
2188 | "license": "MIT",
2189 | "dependencies": {
2190 | "@radix-ui/rect": "1.1.0"
2191 | },
2192 | "peerDependencies": {
2193 | "@types/react": "*",
2194 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2195 | },
2196 | "peerDependenciesMeta": {
2197 | "@types/react": {
2198 | "optional": true
2199 | }
2200 | }
2201 | },
2202 | "node_modules/@radix-ui/react-use-size": {
2203 | "version": "1.1.0",
2204 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz",
2205 | "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==",
2206 | "license": "MIT",
2207 | "dependencies": {
2208 | "@radix-ui/react-use-layout-effect": "1.1.0"
2209 | },
2210 | "peerDependencies": {
2211 | "@types/react": "*",
2212 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2213 | },
2214 | "peerDependenciesMeta": {
2215 | "@types/react": {
2216 | "optional": true
2217 | }
2218 | }
2219 | },
2220 | "node_modules/@radix-ui/react-visually-hidden": {
2221 | "version": "1.1.1",
2222 | "resolved": "https://registry.npmmirror.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.1.tgz",
2223 | "integrity": "sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg==",
2224 | "license": "MIT",
2225 | "dependencies": {
2226 | "@radix-ui/react-primitive": "2.0.1"
2227 | },
2228 | "peerDependencies": {
2229 | "@types/react": "*",
2230 | "@types/react-dom": "*",
2231 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2232 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2233 | },
2234 | "peerDependenciesMeta": {
2235 | "@types/react": {
2236 | "optional": true
2237 | },
2238 | "@types/react-dom": {
2239 | "optional": true
2240 | }
2241 | }
2242 | },
2243 | "node_modules/@radix-ui/rect": {
2244 | "version": "1.1.0",
2245 | "resolved": "https://registry.npmmirror.com/@radix-ui/rect/-/rect-1.1.0.tgz",
2246 | "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==",
2247 | "license": "MIT"
2248 | },
2249 | "node_modules/@radix-ui/themes": {
2250 | "version": "3.2.0",
2251 | "resolved": "https://registry.npmmirror.com/@radix-ui/themes/-/themes-3.2.0.tgz",
2252 | "integrity": "sha512-cG/47tfHN9FW1ZoAigd3oUeJaIm591vGtQ97PrhfwS22IJgWhE5h6D0w2m+NVbKRVo8qIWCG+hiWN04MlLoW4A==",
2253 | "license": "MIT",
2254 | "dependencies": {
2255 | "@radix-ui/colors": "^3.0.0",
2256 | "classnames": "^2.3.2",
2257 | "radix-ui": "^1.1.2",
2258 | "react-remove-scroll-bar": "^2.3.8"
2259 | },
2260 | "peerDependencies": {
2261 | "@types/react": "*",
2262 | "@types/react-dom": "*",
2263 | "react": "16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2264 | "react-dom": "16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2265 | },
2266 | "peerDependenciesMeta": {
2267 | "@types/react": {
2268 | "optional": true
2269 | },
2270 | "@types/react-dom": {
2271 | "optional": true
2272 | }
2273 | }
2274 | },
2275 | "node_modules/@rollup/rollup-darwin-arm64": {
2276 | "version": "4.27.3",
2277 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.3.tgz",
2278 | "integrity": "sha512-OuRysZ1Mt7wpWJ+aYKblVbJWtVn3Cy52h8nLuNSzTqSesYw1EuN6wKp5NW/4eSre3mp12gqFRXOKTcN3AI3LqA==",
2279 | "cpu": [
2280 | "arm64"
2281 | ],
2282 | "dev": true,
2283 | "license": "MIT",
2284 | "optional": true,
2285 | "os": [
2286 | "darwin"
2287 | ]
2288 | },
2289 | "node_modules/@tauri-apps/api": {
2290 | "version": "2.1.1",
2291 | "resolved": "https://registry.npmmirror.com/@tauri-apps/api/-/api-2.1.1.tgz",
2292 | "integrity": "sha512-fzUfFFKo4lknXGJq8qrCidkUcKcH2UHhfaaCNt4GzgzGaW2iS26uFOg4tS3H4P8D6ZEeUxtiD5z0nwFF0UN30A==",
2293 | "license": "Apache-2.0 OR MIT",
2294 | "funding": {
2295 | "type": "opencollective",
2296 | "url": "https://opencollective.com/tauri"
2297 | }
2298 | },
2299 | "node_modules/@tauri-apps/cli": {
2300 | "version": "2.1.0",
2301 | "resolved": "https://registry.npmmirror.com/@tauri-apps/cli/-/cli-2.1.0.tgz",
2302 | "integrity": "sha512-K2VhcKqBhAeS5pNOVdnR/xQRU6jwpgmkSL2ejHXcl0m+kaTggT0WRDQnFtPq6NljA7aE03cvwsbCAoFG7vtkJw==",
2303 | "dev": true,
2304 | "license": "Apache-2.0 OR MIT",
2305 | "bin": {
2306 | "tauri": "tauri.js"
2307 | },
2308 | "engines": {
2309 | "node": ">= 10"
2310 | },
2311 | "funding": {
2312 | "type": "opencollective",
2313 | "url": "https://opencollective.com/tauri"
2314 | },
2315 | "optionalDependencies": {
2316 | "@tauri-apps/cli-darwin-arm64": "2.1.0",
2317 | "@tauri-apps/cli-darwin-x64": "2.1.0",
2318 | "@tauri-apps/cli-linux-arm-gnueabihf": "2.1.0",
2319 | "@tauri-apps/cli-linux-arm64-gnu": "2.1.0",
2320 | "@tauri-apps/cli-linux-arm64-musl": "2.1.0",
2321 | "@tauri-apps/cli-linux-x64-gnu": "2.1.0",
2322 | "@tauri-apps/cli-linux-x64-musl": "2.1.0",
2323 | "@tauri-apps/cli-win32-arm64-msvc": "2.1.0",
2324 | "@tauri-apps/cli-win32-ia32-msvc": "2.1.0",
2325 | "@tauri-apps/cli-win32-x64-msvc": "2.1.0"
2326 | }
2327 | },
2328 | "node_modules/@tauri-apps/cli-darwin-arm64": {
2329 | "version": "2.1.0",
2330 | "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.1.0.tgz",
2331 | "integrity": "sha512-ESc6J6CE8hl1yKH2vJ+ALF+thq4Be+DM1mvmTyUCQObvezNCNhzfS6abIUd3ou4x5RGH51ouiANeT3wekU6dCw==",
2332 | "cpu": [
2333 | "arm64"
2334 | ],
2335 | "dev": true,
2336 | "license": "Apache-2.0 OR MIT",
2337 | "optional": true,
2338 | "os": [
2339 | "darwin"
2340 | ],
2341 | "engines": {
2342 | "node": ">= 10"
2343 | }
2344 | },
2345 | "node_modules/@tauri-apps/plugin-clipboard-manager": {
2346 | "version": "2.0.0",
2347 | "resolved": "https://registry.npmmirror.com/@tauri-apps/plugin-clipboard-manager/-/plugin-clipboard-manager-2.0.0.tgz",
2348 | "integrity": "sha512-V1sXmbjnwfXt/r48RJMwfUmDMSaP/8/YbH4CLNxt+/sf1eHlIP8PRFdFDQwLN0cNQKu2rqQVbG/Wc/Ps6cDUhw==",
2349 | "license": "MIT OR Apache-2.0",
2350 | "dependencies": {
2351 | "@tauri-apps/api": "^2.0.0"
2352 | }
2353 | },
2354 | "node_modules/@tauri-apps/plugin-opener": {
2355 | "version": "2.2.5",
2356 | "resolved": "https://registry.npmmirror.com/@tauri-apps/plugin-opener/-/plugin-opener-2.2.5.tgz",
2357 | "integrity": "sha512-hHsJ9RPWpZvZEPVFaL+d25gABMUMOf/A6ESXnvf/ii9guTukj58WXsAE/SOysXRIhej7kseRCxnOnIMpSCdUsQ==",
2358 | "license": "MIT OR Apache-2.0",
2359 | "dependencies": {
2360 | "@tauri-apps/api": "^2.0.0"
2361 | }
2362 | },
2363 | "node_modules/@tauri-apps/plugin-shell": {
2364 | "version": "2.0.1",
2365 | "resolved": "https://registry.npmmirror.com/@tauri-apps/plugin-shell/-/plugin-shell-2.0.1.tgz",
2366 | "integrity": "sha512-akU1b77sw3qHiynrK0s930y8zKmcdrSD60htjH+mFZqv5WaakZA/XxHR3/sF1nNv9Mgmt/Shls37HwnOr00aSw==",
2367 | "license": "MIT OR Apache-2.0",
2368 | "dependencies": {
2369 | "@tauri-apps/api": "^2.0.0"
2370 | }
2371 | },
2372 | "node_modules/@types/babel__core": {
2373 | "version": "7.20.5",
2374 | "resolved": "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.5.tgz",
2375 | "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
2376 | "dev": true,
2377 | "license": "MIT",
2378 | "dependencies": {
2379 | "@babel/parser": "^7.20.7",
2380 | "@babel/types": "^7.20.7",
2381 | "@types/babel__generator": "*",
2382 | "@types/babel__template": "*",
2383 | "@types/babel__traverse": "*"
2384 | }
2385 | },
2386 | "node_modules/@types/babel__generator": {
2387 | "version": "7.6.8",
2388 | "resolved": "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.6.8.tgz",
2389 | "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
2390 | "dev": true,
2391 | "license": "MIT",
2392 | "dependencies": {
2393 | "@babel/types": "^7.0.0"
2394 | }
2395 | },
2396 | "node_modules/@types/babel__template": {
2397 | "version": "7.4.4",
2398 | "resolved": "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.4.tgz",
2399 | "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
2400 | "dev": true,
2401 | "license": "MIT",
2402 | "dependencies": {
2403 | "@babel/parser": "^7.1.0",
2404 | "@babel/types": "^7.0.0"
2405 | }
2406 | },
2407 | "node_modules/@types/babel__traverse": {
2408 | "version": "7.20.6",
2409 | "resolved": "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz",
2410 | "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==",
2411 | "dev": true,
2412 | "license": "MIT",
2413 | "dependencies": {
2414 | "@babel/types": "^7.20.7"
2415 | }
2416 | },
2417 | "node_modules/@types/estree": {
2418 | "version": "1.0.6",
2419 | "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.6.tgz",
2420 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
2421 | "dev": true,
2422 | "license": "MIT"
2423 | },
2424 | "node_modules/@types/node": {
2425 | "version": "22.9.1",
2426 | "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.9.1.tgz",
2427 | "integrity": "sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg==",
2428 | "dev": true,
2429 | "license": "MIT",
2430 | "optional": true,
2431 | "peer": true,
2432 | "dependencies": {
2433 | "undici-types": "~6.19.8"
2434 | }
2435 | },
2436 | "node_modules/@types/prop-types": {
2437 | "version": "15.7.13",
2438 | "resolved": "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.13.tgz",
2439 | "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==",
2440 | "devOptional": true,
2441 | "license": "MIT"
2442 | },
2443 | "node_modules/@types/react": {
2444 | "version": "18.3.12",
2445 | "resolved": "https://registry.npmmirror.com/@types/react/-/react-18.3.12.tgz",
2446 | "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==",
2447 | "devOptional": true,
2448 | "license": "MIT",
2449 | "dependencies": {
2450 | "@types/prop-types": "*",
2451 | "csstype": "^3.0.2"
2452 | }
2453 | },
2454 | "node_modules/@types/react-dom": {
2455 | "version": "18.3.1",
2456 | "resolved": "https://registry.npmmirror.com/@types/react-dom/-/react-dom-18.3.1.tgz",
2457 | "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==",
2458 | "devOptional": true,
2459 | "license": "MIT",
2460 | "dependencies": {
2461 | "@types/react": "*"
2462 | }
2463 | },
2464 | "node_modules/@vitejs/plugin-react": {
2465 | "version": "4.3.4",
2466 | "resolved": "https://registry.npmmirror.com/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz",
2467 | "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==",
2468 | "dev": true,
2469 | "license": "MIT",
2470 | "dependencies": {
2471 | "@babel/core": "^7.26.0",
2472 | "@babel/plugin-transform-react-jsx-self": "^7.25.9",
2473 | "@babel/plugin-transform-react-jsx-source": "^7.25.9",
2474 | "@types/babel__core": "^7.20.5",
2475 | "react-refresh": "^0.14.2"
2476 | },
2477 | "engines": {
2478 | "node": "^14.18.0 || >=16.0.0"
2479 | },
2480 | "peerDependencies": {
2481 | "vite": "^4.2.0 || ^5.0.0 || ^6.0.0"
2482 | }
2483 | },
2484 | "node_modules/aria-hidden": {
2485 | "version": "1.2.4",
2486 | "resolved": "https://registry.npmmirror.com/aria-hidden/-/aria-hidden-1.2.4.tgz",
2487 | "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==",
2488 | "license": "MIT",
2489 | "dependencies": {
2490 | "tslib": "^2.0.0"
2491 | },
2492 | "engines": {
2493 | "node": ">=10"
2494 | }
2495 | },
2496 | "node_modules/browserslist": {
2497 | "version": "4.24.2",
2498 | "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.24.2.tgz",
2499 | "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==",
2500 | "dev": true,
2501 | "funding": [
2502 | {
2503 | "type": "opencollective",
2504 | "url": "https://opencollective.com/browserslist"
2505 | },
2506 | {
2507 | "type": "tidelift",
2508 | "url": "https://tidelift.com/funding/github/npm/browserslist"
2509 | },
2510 | {
2511 | "type": "github",
2512 | "url": "https://github.com/sponsors/ai"
2513 | }
2514 | ],
2515 | "license": "MIT",
2516 | "dependencies": {
2517 | "caniuse-lite": "^1.0.30001669",
2518 | "electron-to-chromium": "^1.5.41",
2519 | "node-releases": "^2.0.18",
2520 | "update-browserslist-db": "^1.1.1"
2521 | },
2522 | "bin": {
2523 | "browserslist": "cli.js"
2524 | },
2525 | "engines": {
2526 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
2527 | }
2528 | },
2529 | "node_modules/caniuse-lite": {
2530 | "version": "1.0.30001683",
2531 | "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001683.tgz",
2532 | "integrity": "sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q==",
2533 | "dev": true,
2534 | "funding": [
2535 | {
2536 | "type": "opencollective",
2537 | "url": "https://opencollective.com/browserslist"
2538 | },
2539 | {
2540 | "type": "tidelift",
2541 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
2542 | },
2543 | {
2544 | "type": "github",
2545 | "url": "https://github.com/sponsors/ai"
2546 | }
2547 | ],
2548 | "license": "CC-BY-4.0"
2549 | },
2550 | "node_modules/classnames": {
2551 | "version": "2.5.1",
2552 | "resolved": "https://registry.npmmirror.com/classnames/-/classnames-2.5.1.tgz",
2553 | "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==",
2554 | "license": "MIT"
2555 | },
2556 | "node_modules/convert-source-map": {
2557 | "version": "2.0.0",
2558 | "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz",
2559 | "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
2560 | "dev": true,
2561 | "license": "MIT"
2562 | },
2563 | "node_modules/csstype": {
2564 | "version": "3.1.3",
2565 | "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
2566 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
2567 | "devOptional": true,
2568 | "license": "MIT"
2569 | },
2570 | "node_modules/debug": {
2571 | "version": "4.3.7",
2572 | "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.7.tgz",
2573 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
2574 | "dev": true,
2575 | "license": "MIT",
2576 | "dependencies": {
2577 | "ms": "^2.1.3"
2578 | },
2579 | "engines": {
2580 | "node": ">=6.0"
2581 | },
2582 | "peerDependenciesMeta": {
2583 | "supports-color": {
2584 | "optional": true
2585 | }
2586 | }
2587 | },
2588 | "node_modules/detect-node-es": {
2589 | "version": "1.1.0",
2590 | "resolved": "https://registry.npmmirror.com/detect-node-es/-/detect-node-es-1.1.0.tgz",
2591 | "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
2592 | "license": "MIT"
2593 | },
2594 | "node_modules/electron-to-chromium": {
2595 | "version": "1.5.64",
2596 | "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.64.tgz",
2597 | "integrity": "sha512-IXEuxU+5ClW2IGEYFC2T7szbyVgehupCWQe5GNh+H065CD6U6IFN0s4KeAMFGNmQolRU4IV7zGBWSYMmZ8uuqQ==",
2598 | "dev": true,
2599 | "license": "ISC"
2600 | },
2601 | "node_modules/esbuild": {
2602 | "version": "0.24.2",
2603 | "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.24.2.tgz",
2604 | "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==",
2605 | "dev": true,
2606 | "hasInstallScript": true,
2607 | "license": "MIT",
2608 | "bin": {
2609 | "esbuild": "bin/esbuild"
2610 | },
2611 | "engines": {
2612 | "node": ">=18"
2613 | },
2614 | "optionalDependencies": {
2615 | "@esbuild/aix-ppc64": "0.24.2",
2616 | "@esbuild/android-arm": "0.24.2",
2617 | "@esbuild/android-arm64": "0.24.2",
2618 | "@esbuild/android-x64": "0.24.2",
2619 | "@esbuild/darwin-arm64": "0.24.2",
2620 | "@esbuild/darwin-x64": "0.24.2",
2621 | "@esbuild/freebsd-arm64": "0.24.2",
2622 | "@esbuild/freebsd-x64": "0.24.2",
2623 | "@esbuild/linux-arm": "0.24.2",
2624 | "@esbuild/linux-arm64": "0.24.2",
2625 | "@esbuild/linux-ia32": "0.24.2",
2626 | "@esbuild/linux-loong64": "0.24.2",
2627 | "@esbuild/linux-mips64el": "0.24.2",
2628 | "@esbuild/linux-ppc64": "0.24.2",
2629 | "@esbuild/linux-riscv64": "0.24.2",
2630 | "@esbuild/linux-s390x": "0.24.2",
2631 | "@esbuild/linux-x64": "0.24.2",
2632 | "@esbuild/netbsd-arm64": "0.24.2",
2633 | "@esbuild/netbsd-x64": "0.24.2",
2634 | "@esbuild/openbsd-arm64": "0.24.2",
2635 | "@esbuild/openbsd-x64": "0.24.2",
2636 | "@esbuild/sunos-x64": "0.24.2",
2637 | "@esbuild/win32-arm64": "0.24.2",
2638 | "@esbuild/win32-ia32": "0.24.2",
2639 | "@esbuild/win32-x64": "0.24.2"
2640 | }
2641 | },
2642 | "node_modules/escalade": {
2643 | "version": "3.2.0",
2644 | "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz",
2645 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
2646 | "dev": true,
2647 | "license": "MIT",
2648 | "engines": {
2649 | "node": ">=6"
2650 | }
2651 | },
2652 | "node_modules/fsevents": {
2653 | "version": "2.3.3",
2654 | "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
2655 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
2656 | "dev": true,
2657 | "hasInstallScript": true,
2658 | "license": "MIT",
2659 | "optional": true,
2660 | "os": [
2661 | "darwin"
2662 | ],
2663 | "engines": {
2664 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
2665 | }
2666 | },
2667 | "node_modules/gensync": {
2668 | "version": "1.0.0-beta.2",
2669 | "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz",
2670 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
2671 | "dev": true,
2672 | "license": "MIT",
2673 | "engines": {
2674 | "node": ">=6.9.0"
2675 | }
2676 | },
2677 | "node_modules/get-nonce": {
2678 | "version": "1.0.1",
2679 | "resolved": "https://registry.npmmirror.com/get-nonce/-/get-nonce-1.0.1.tgz",
2680 | "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
2681 | "license": "MIT",
2682 | "engines": {
2683 | "node": ">=6"
2684 | }
2685 | },
2686 | "node_modules/globals": {
2687 | "version": "11.12.0",
2688 | "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz",
2689 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
2690 | "dev": true,
2691 | "license": "MIT",
2692 | "engines": {
2693 | "node": ">=4"
2694 | }
2695 | },
2696 | "node_modules/js-tokens": {
2697 | "version": "4.0.0",
2698 | "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz",
2699 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
2700 | "license": "MIT"
2701 | },
2702 | "node_modules/jsesc": {
2703 | "version": "3.0.2",
2704 | "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.0.2.tgz",
2705 | "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
2706 | "dev": true,
2707 | "license": "MIT",
2708 | "bin": {
2709 | "jsesc": "bin/jsesc"
2710 | },
2711 | "engines": {
2712 | "node": ">=6"
2713 | }
2714 | },
2715 | "node_modules/json5": {
2716 | "version": "2.2.3",
2717 | "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz",
2718 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
2719 | "dev": true,
2720 | "license": "MIT",
2721 | "bin": {
2722 | "json5": "lib/cli.js"
2723 | },
2724 | "engines": {
2725 | "node": ">=6"
2726 | }
2727 | },
2728 | "node_modules/loose-envify": {
2729 | "version": "1.4.0",
2730 | "resolved": "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz",
2731 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
2732 | "license": "MIT",
2733 | "dependencies": {
2734 | "js-tokens": "^3.0.0 || ^4.0.0"
2735 | },
2736 | "bin": {
2737 | "loose-envify": "cli.js"
2738 | }
2739 | },
2740 | "node_modules/lru-cache": {
2741 | "version": "5.1.1",
2742 | "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz",
2743 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
2744 | "dev": true,
2745 | "license": "ISC",
2746 | "dependencies": {
2747 | "yallist": "^3.0.2"
2748 | }
2749 | },
2750 | "node_modules/ms": {
2751 | "version": "2.1.3",
2752 | "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
2753 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
2754 | "dev": true,
2755 | "license": "MIT"
2756 | },
2757 | "node_modules/nanoid": {
2758 | "version": "3.3.7",
2759 | "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
2760 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
2761 | "dev": true,
2762 | "funding": [
2763 | {
2764 | "type": "github",
2765 | "url": "https://github.com/sponsors/ai"
2766 | }
2767 | ],
2768 | "license": "MIT",
2769 | "bin": {
2770 | "nanoid": "bin/nanoid.cjs"
2771 | },
2772 | "engines": {
2773 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
2774 | }
2775 | },
2776 | "node_modules/node-releases": {
2777 | "version": "2.0.18",
2778 | "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.18.tgz",
2779 | "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
2780 | "dev": true,
2781 | "license": "MIT"
2782 | },
2783 | "node_modules/picocolors": {
2784 | "version": "1.1.1",
2785 | "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
2786 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
2787 | "dev": true,
2788 | "license": "ISC"
2789 | },
2790 | "node_modules/postcss": {
2791 | "version": "8.4.49",
2792 | "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.49.tgz",
2793 | "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
2794 | "dev": true,
2795 | "funding": [
2796 | {
2797 | "type": "opencollective",
2798 | "url": "https://opencollective.com/postcss/"
2799 | },
2800 | {
2801 | "type": "tidelift",
2802 | "url": "https://tidelift.com/funding/github/npm/postcss"
2803 | },
2804 | {
2805 | "type": "github",
2806 | "url": "https://github.com/sponsors/ai"
2807 | }
2808 | ],
2809 | "license": "MIT",
2810 | "dependencies": {
2811 | "nanoid": "^3.3.7",
2812 | "picocolors": "^1.1.1",
2813 | "source-map-js": "^1.2.1"
2814 | },
2815 | "engines": {
2816 | "node": "^10 || ^12 || >=14"
2817 | }
2818 | },
2819 | "node_modules/radix-ui": {
2820 | "version": "1.1.2",
2821 | "resolved": "https://registry.npmmirror.com/radix-ui/-/radix-ui-1.1.2.tgz",
2822 | "integrity": "sha512-P2F30iTIG/eheoZbF3QXo7kDoFgnj/zxX1NwPq02G00ggq7OSXFsMuyn98WHtQCql2DsO8ZCbBk+VbbgVrlwOg==",
2823 | "license": "MIT",
2824 | "dependencies": {
2825 | "@radix-ui/primitive": "1.1.1",
2826 | "@radix-ui/react-accessible-icon": "1.1.1",
2827 | "@radix-ui/react-accordion": "1.2.2",
2828 | "@radix-ui/react-alert-dialog": "1.1.5",
2829 | "@radix-ui/react-aspect-ratio": "1.1.1",
2830 | "@radix-ui/react-avatar": "1.1.2",
2831 | "@radix-ui/react-checkbox": "1.1.3",
2832 | "@radix-ui/react-collapsible": "1.1.2",
2833 | "@radix-ui/react-collection": "1.1.1",
2834 | "@radix-ui/react-compose-refs": "1.1.1",
2835 | "@radix-ui/react-context": "1.1.1",
2836 | "@radix-ui/react-context-menu": "2.2.5",
2837 | "@radix-ui/react-dialog": "1.1.5",
2838 | "@radix-ui/react-direction": "1.1.0",
2839 | "@radix-ui/react-dismissable-layer": "1.1.4",
2840 | "@radix-ui/react-dropdown-menu": "2.1.5",
2841 | "@radix-ui/react-focus-guards": "1.1.1",
2842 | "@radix-ui/react-focus-scope": "1.1.1",
2843 | "@radix-ui/react-form": "0.1.1",
2844 | "@radix-ui/react-hover-card": "1.1.5",
2845 | "@radix-ui/react-label": "2.1.1",
2846 | "@radix-ui/react-menu": "2.1.5",
2847 | "@radix-ui/react-menubar": "1.1.5",
2848 | "@radix-ui/react-navigation-menu": "1.2.4",
2849 | "@radix-ui/react-popover": "1.1.5",
2850 | "@radix-ui/react-popper": "1.2.1",
2851 | "@radix-ui/react-portal": "1.1.3",
2852 | "@radix-ui/react-presence": "1.1.2",
2853 | "@radix-ui/react-primitive": "2.0.1",
2854 | "@radix-ui/react-progress": "1.1.1",
2855 | "@radix-ui/react-radio-group": "1.2.2",
2856 | "@radix-ui/react-roving-focus": "1.1.1",
2857 | "@radix-ui/react-scroll-area": "1.2.2",
2858 | "@radix-ui/react-select": "2.1.5",
2859 | "@radix-ui/react-separator": "1.1.1",
2860 | "@radix-ui/react-slider": "1.2.2",
2861 | "@radix-ui/react-slot": "1.1.1",
2862 | "@radix-ui/react-switch": "1.1.2",
2863 | "@radix-ui/react-tabs": "1.1.2",
2864 | "@radix-ui/react-toast": "1.2.5",
2865 | "@radix-ui/react-toggle": "1.1.1",
2866 | "@radix-ui/react-toggle-group": "1.1.1",
2867 | "@radix-ui/react-toolbar": "1.1.1",
2868 | "@radix-ui/react-tooltip": "1.1.7",
2869 | "@radix-ui/react-use-callback-ref": "1.1.0",
2870 | "@radix-ui/react-use-controllable-state": "1.1.0",
2871 | "@radix-ui/react-use-escape-keydown": "1.1.0",
2872 | "@radix-ui/react-use-layout-effect": "1.1.0",
2873 | "@radix-ui/react-use-size": "1.1.0",
2874 | "@radix-ui/react-visually-hidden": "1.1.1"
2875 | },
2876 | "peerDependencies": {
2877 | "@types/react": "*",
2878 | "@types/react-dom": "*",
2879 | "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2880 | "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2881 | },
2882 | "peerDependenciesMeta": {
2883 | "@types/react": {
2884 | "optional": true
2885 | },
2886 | "@types/react-dom": {
2887 | "optional": true
2888 | }
2889 | }
2890 | },
2891 | "node_modules/react": {
2892 | "version": "18.3.1",
2893 | "resolved": "https://registry.npmmirror.com/react/-/react-18.3.1.tgz",
2894 | "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
2895 | "license": "MIT",
2896 | "dependencies": {
2897 | "loose-envify": "^1.1.0"
2898 | },
2899 | "engines": {
2900 | "node": ">=0.10.0"
2901 | }
2902 | },
2903 | "node_modules/react-dom": {
2904 | "version": "18.3.1",
2905 | "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-18.3.1.tgz",
2906 | "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
2907 | "license": "MIT",
2908 | "dependencies": {
2909 | "loose-envify": "^1.1.0",
2910 | "scheduler": "^0.23.2"
2911 | },
2912 | "peerDependencies": {
2913 | "react": "^18.3.1"
2914 | }
2915 | },
2916 | "node_modules/react-refresh": {
2917 | "version": "0.14.2",
2918 | "resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.14.2.tgz",
2919 | "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==",
2920 | "dev": true,
2921 | "license": "MIT",
2922 | "engines": {
2923 | "node": ">=0.10.0"
2924 | }
2925 | },
2926 | "node_modules/react-remove-scroll": {
2927 | "version": "2.6.3",
2928 | "resolved": "https://registry.npmmirror.com/react-remove-scroll/-/react-remove-scroll-2.6.3.tgz",
2929 | "integrity": "sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==",
2930 | "license": "MIT",
2931 | "dependencies": {
2932 | "react-remove-scroll-bar": "^2.3.7",
2933 | "react-style-singleton": "^2.2.3",
2934 | "tslib": "^2.1.0",
2935 | "use-callback-ref": "^1.3.3",
2936 | "use-sidecar": "^1.1.3"
2937 | },
2938 | "engines": {
2939 | "node": ">=10"
2940 | },
2941 | "peerDependencies": {
2942 | "@types/react": "*",
2943 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
2944 | },
2945 | "peerDependenciesMeta": {
2946 | "@types/react": {
2947 | "optional": true
2948 | }
2949 | }
2950 | },
2951 | "node_modules/react-remove-scroll-bar": {
2952 | "version": "2.3.8",
2953 | "resolved": "https://registry.npmmirror.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz",
2954 | "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==",
2955 | "license": "MIT",
2956 | "dependencies": {
2957 | "react-style-singleton": "^2.2.2",
2958 | "tslib": "^2.0.0"
2959 | },
2960 | "engines": {
2961 | "node": ">=10"
2962 | },
2963 | "peerDependencies": {
2964 | "@types/react": "*",
2965 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
2966 | },
2967 | "peerDependenciesMeta": {
2968 | "@types/react": {
2969 | "optional": true
2970 | }
2971 | }
2972 | },
2973 | "node_modules/react-style-singleton": {
2974 | "version": "2.2.3",
2975 | "resolved": "https://registry.npmmirror.com/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
2976 | "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==",
2977 | "license": "MIT",
2978 | "dependencies": {
2979 | "get-nonce": "^1.0.0",
2980 | "tslib": "^2.0.0"
2981 | },
2982 | "engines": {
2983 | "node": ">=10"
2984 | },
2985 | "peerDependencies": {
2986 | "@types/react": "*",
2987 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
2988 | },
2989 | "peerDependenciesMeta": {
2990 | "@types/react": {
2991 | "optional": true
2992 | }
2993 | }
2994 | },
2995 | "node_modules/rollup": {
2996 | "version": "4.27.3",
2997 | "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.27.3.tgz",
2998 | "integrity": "sha512-SLsCOnlmGt9VoZ9Ek8yBK8tAdmPHeppkw+Xa7yDlCEhDTvwYei03JlWo1fdc7YTfLZ4tD8riJCUyAgTbszk1fQ==",
2999 | "dev": true,
3000 | "license": "MIT",
3001 | "dependencies": {
3002 | "@types/estree": "1.0.6"
3003 | },
3004 | "bin": {
3005 | "rollup": "dist/bin/rollup"
3006 | },
3007 | "engines": {
3008 | "node": ">=18.0.0",
3009 | "npm": ">=8.0.0"
3010 | },
3011 | "optionalDependencies": {
3012 | "@rollup/rollup-android-arm-eabi": "4.27.3",
3013 | "@rollup/rollup-android-arm64": "4.27.3",
3014 | "@rollup/rollup-darwin-arm64": "4.27.3",
3015 | "@rollup/rollup-darwin-x64": "4.27.3",
3016 | "@rollup/rollup-freebsd-arm64": "4.27.3",
3017 | "@rollup/rollup-freebsd-x64": "4.27.3",
3018 | "@rollup/rollup-linux-arm-gnueabihf": "4.27.3",
3019 | "@rollup/rollup-linux-arm-musleabihf": "4.27.3",
3020 | "@rollup/rollup-linux-arm64-gnu": "4.27.3",
3021 | "@rollup/rollup-linux-arm64-musl": "4.27.3",
3022 | "@rollup/rollup-linux-powerpc64le-gnu": "4.27.3",
3023 | "@rollup/rollup-linux-riscv64-gnu": "4.27.3",
3024 | "@rollup/rollup-linux-s390x-gnu": "4.27.3",
3025 | "@rollup/rollup-linux-x64-gnu": "4.27.3",
3026 | "@rollup/rollup-linux-x64-musl": "4.27.3",
3027 | "@rollup/rollup-win32-arm64-msvc": "4.27.3",
3028 | "@rollup/rollup-win32-ia32-msvc": "4.27.3",
3029 | "@rollup/rollup-win32-x64-msvc": "4.27.3",
3030 | "fsevents": "~2.3.2"
3031 | }
3032 | },
3033 | "node_modules/scheduler": {
3034 | "version": "0.23.2",
3035 | "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.2.tgz",
3036 | "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
3037 | "license": "MIT",
3038 | "dependencies": {
3039 | "loose-envify": "^1.1.0"
3040 | }
3041 | },
3042 | "node_modules/semver": {
3043 | "version": "6.3.1",
3044 | "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz",
3045 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
3046 | "dev": true,
3047 | "license": "ISC",
3048 | "bin": {
3049 | "semver": "bin/semver.js"
3050 | }
3051 | },
3052 | "node_modules/source-map-js": {
3053 | "version": "1.2.1",
3054 | "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
3055 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
3056 | "dev": true,
3057 | "license": "BSD-3-Clause",
3058 | "engines": {
3059 | "node": ">=0.10.0"
3060 | }
3061 | },
3062 | "node_modules/tslib": {
3063 | "version": "2.8.1",
3064 | "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz",
3065 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
3066 | "license": "0BSD"
3067 | },
3068 | "node_modules/typescript": {
3069 | "version": "5.6.3",
3070 | "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.6.3.tgz",
3071 | "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
3072 | "dev": true,
3073 | "license": "Apache-2.0",
3074 | "bin": {
3075 | "tsc": "bin/tsc",
3076 | "tsserver": "bin/tsserver"
3077 | },
3078 | "engines": {
3079 | "node": ">=14.17"
3080 | }
3081 | },
3082 | "node_modules/undici-types": {
3083 | "version": "6.19.8",
3084 | "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.19.8.tgz",
3085 | "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
3086 | "dev": true,
3087 | "license": "MIT",
3088 | "optional": true,
3089 | "peer": true
3090 | },
3091 | "node_modules/update-browserslist-db": {
3092 | "version": "1.1.1",
3093 | "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
3094 | "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
3095 | "dev": true,
3096 | "funding": [
3097 | {
3098 | "type": "opencollective",
3099 | "url": "https://opencollective.com/browserslist"
3100 | },
3101 | {
3102 | "type": "tidelift",
3103 | "url": "https://tidelift.com/funding/github/npm/browserslist"
3104 | },
3105 | {
3106 | "type": "github",
3107 | "url": "https://github.com/sponsors/ai"
3108 | }
3109 | ],
3110 | "license": "MIT",
3111 | "dependencies": {
3112 | "escalade": "^3.2.0",
3113 | "picocolors": "^1.1.0"
3114 | },
3115 | "bin": {
3116 | "update-browserslist-db": "cli.js"
3117 | },
3118 | "peerDependencies": {
3119 | "browserslist": ">= 4.21.0"
3120 | }
3121 | },
3122 | "node_modules/use-callback-ref": {
3123 | "version": "1.3.3",
3124 | "resolved": "https://registry.npmmirror.com/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
3125 | "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==",
3126 | "license": "MIT",
3127 | "dependencies": {
3128 | "tslib": "^2.0.0"
3129 | },
3130 | "engines": {
3131 | "node": ">=10"
3132 | },
3133 | "peerDependencies": {
3134 | "@types/react": "*",
3135 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
3136 | },
3137 | "peerDependenciesMeta": {
3138 | "@types/react": {
3139 | "optional": true
3140 | }
3141 | }
3142 | },
3143 | "node_modules/use-resize-observer": {
3144 | "version": "9.1.0",
3145 | "resolved": "https://registry.npmmirror.com/use-resize-observer/-/use-resize-observer-9.1.0.tgz",
3146 | "integrity": "sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==",
3147 | "license": "MIT",
3148 | "dependencies": {
3149 | "@juggle/resize-observer": "^3.3.1"
3150 | },
3151 | "peerDependencies": {
3152 | "react": "16.8.0 - 18",
3153 | "react-dom": "16.8.0 - 18"
3154 | }
3155 | },
3156 | "node_modules/use-sidecar": {
3157 | "version": "1.1.3",
3158 | "resolved": "https://registry.npmmirror.com/use-sidecar/-/use-sidecar-1.1.3.tgz",
3159 | "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==",
3160 | "license": "MIT",
3161 | "dependencies": {
3162 | "detect-node-es": "^1.1.0",
3163 | "tslib": "^2.0.0"
3164 | },
3165 | "engines": {
3166 | "node": ">=10"
3167 | },
3168 | "peerDependencies": {
3169 | "@types/react": "*",
3170 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
3171 | },
3172 | "peerDependenciesMeta": {
3173 | "@types/react": {
3174 | "optional": true
3175 | }
3176 | }
3177 | },
3178 | "node_modules/vite": {
3179 | "version": "6.0.11",
3180 | "resolved": "https://registry.npmmirror.com/vite/-/vite-6.0.11.tgz",
3181 | "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==",
3182 | "dev": true,
3183 | "license": "MIT",
3184 | "dependencies": {
3185 | "esbuild": "^0.24.2",
3186 | "postcss": "^8.4.49",
3187 | "rollup": "^4.23.0"
3188 | },
3189 | "bin": {
3190 | "vite": "bin/vite.js"
3191 | },
3192 | "engines": {
3193 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
3194 | },
3195 | "funding": {
3196 | "url": "https://github.com/vitejs/vite?sponsor=1"
3197 | },
3198 | "optionalDependencies": {
3199 | "fsevents": "~2.3.3"
3200 | },
3201 | "peerDependencies": {
3202 | "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
3203 | "jiti": ">=1.21.0",
3204 | "less": "*",
3205 | "lightningcss": "^1.21.0",
3206 | "sass": "*",
3207 | "sass-embedded": "*",
3208 | "stylus": "*",
3209 | "sugarss": "*",
3210 | "terser": "^5.16.0",
3211 | "tsx": "^4.8.1",
3212 | "yaml": "^2.4.2"
3213 | },
3214 | "peerDependenciesMeta": {
3215 | "@types/node": {
3216 | "optional": true
3217 | },
3218 | "jiti": {
3219 | "optional": true
3220 | },
3221 | "less": {
3222 | "optional": true
3223 | },
3224 | "lightningcss": {
3225 | "optional": true
3226 | },
3227 | "sass": {
3228 | "optional": true
3229 | },
3230 | "sass-embedded": {
3231 | "optional": true
3232 | },
3233 | "stylus": {
3234 | "optional": true
3235 | },
3236 | "sugarss": {
3237 | "optional": true
3238 | },
3239 | "terser": {
3240 | "optional": true
3241 | },
3242 | "tsx": {
3243 | "optional": true
3244 | },
3245 | "yaml": {
3246 | "optional": true
3247 | }
3248 | }
3249 | },
3250 | "node_modules/yallist": {
3251 | "version": "3.1.1",
3252 | "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz",
3253 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
3254 | "dev": true,
3255 | "license": "ISC"
3256 | }
3257 | }
3258 | }
3259 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "passwords-app",
3 | "private": true,
4 | "version": "0.1.4",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "tsc && vite build",
9 | "preview": "vite preview",
10 | "tauri": "tauri"
11 | },
12 | "dependencies": {
13 | "@radix-ui/react-icons": "^1.3.2",
14 | "@radix-ui/themes": "^3.2.0",
15 | "@tauri-apps/api": "^2",
16 | "@tauri-apps/plugin-clipboard-manager": "^2",
17 | "@tauri-apps/plugin-opener": "^2",
18 | "@tauri-apps/plugin-shell": "^2",
19 | "react": "^18.3.1",
20 | "react-dom": "^18.3.1",
21 | "use-resize-observer": "^9.1.0"
22 | },
23 | "devDependencies": {
24 | "@tauri-apps/cli": "^2",
25 | "@types/react": "^18.3.1",
26 | "@types/react-dom": "^18.3.1",
27 | "@vitejs/plugin-react": "^4.3.4",
28 | "typescript": "~5.6.2",
29 | "vite": "^6.0.3"
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/passwords.afphoto:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hiql/passwords-app/a69ef191b600b954e09e692ec06ea3ad62558f48/passwords.afphoto
--------------------------------------------------------------------------------
/public/tauri.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/public/vite.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hiql/passwords-app/a69ef191b600b954e09e692ec06ea3ad62558f48/screenshot.png
--------------------------------------------------------------------------------
/src-tauri/.gitignore:
--------------------------------------------------------------------------------
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/schemas
8 |
--------------------------------------------------------------------------------
/src-tauri/Cargo.toml:
--------------------------------------------------------------------------------
1 | [package]
2 | name = "passwords-app"
3 | version = "0.1.4"
4 | description = "A random password generator"
5 | authors = ["hiql"]
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 = "passwords_app_lib"
15 | crate-type = ["rlib", "cdylib", "staticlib"]
16 |
17 | [build-dependencies]
18 | tauri-build = { version = "2", features = [] }
19 |
20 | [dependencies]
21 | tauri = { version = "2", features = [] }
22 | tauri-plugin-opener = "2"
23 | tauri-plugin-clipboard-manager = "2"
24 | serde = { version = "1", features = ["derive"] }
25 | serde_json = "1"
26 | passwords = { version = "3.1.16", features = ["common-password", "crypto"] }
27 | rand = "0.9.0"
28 | md5 = "0.7.0"
29 | base64 = "0.22.1"
30 | bcrypt = "0.17.0"
31 | sha2 = "0.10.8"
32 | hex = "0.4.3"
33 | zxcvbn = "3.1.0"
34 | sha1 = "0.10.6"
35 |
--------------------------------------------------------------------------------
/src-tauri/build.rs:
--------------------------------------------------------------------------------
1 | fn main() {
2 | tauri_build::build()
3 | }
4 |
--------------------------------------------------------------------------------
/src-tauri/capabilities/default.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "../gen/schemas/desktop-schema.json",
3 | "identifier": "default",
4 | "description": "Capability for the main window",
5 | "windows": ["main"],
6 | "permissions": [
7 | "core:default",
8 | "opener:default",
9 | "core:window:allow-start-dragging",
10 | "core:window:allow-set-size",
11 | "core:window:allow-theme",
12 | "core:event:allow-listen",
13 | "clipboard-manager:default",
14 | "clipboard-manager:allow-write-text",
15 | "clipboard-manager:allow-read-text"
16 | ]
17 | }
18 |
--------------------------------------------------------------------------------
/src-tauri/icons/128x128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hiql/passwords-app/a69ef191b600b954e09e692ec06ea3ad62558f48/src-tauri/icons/128x128.png
--------------------------------------------------------------------------------
/src-tauri/icons/128x128@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hiql/passwords-app/a69ef191b600b954e09e692ec06ea3ad62558f48/src-tauri/icons/128x128@2x.png
--------------------------------------------------------------------------------
/src-tauri/icons/32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hiql/passwords-app/a69ef191b600b954e09e692ec06ea3ad62558f48/src-tauri/icons/32x32.png
--------------------------------------------------------------------------------
/src-tauri/icons/Square107x107Logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hiql/passwords-app/a69ef191b600b954e09e692ec06ea3ad62558f48/src-tauri/icons/Square107x107Logo.png
--------------------------------------------------------------------------------
/src-tauri/icons/Square142x142Logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hiql/passwords-app/a69ef191b600b954e09e692ec06ea3ad62558f48/src-tauri/icons/Square142x142Logo.png
--------------------------------------------------------------------------------
/src-tauri/icons/Square150x150Logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hiql/passwords-app/a69ef191b600b954e09e692ec06ea3ad62558f48/src-tauri/icons/Square150x150Logo.png
--------------------------------------------------------------------------------
/src-tauri/icons/Square284x284Logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hiql/passwords-app/a69ef191b600b954e09e692ec06ea3ad62558f48/src-tauri/icons/Square284x284Logo.png
--------------------------------------------------------------------------------
/src-tauri/icons/Square30x30Logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hiql/passwords-app/a69ef191b600b954e09e692ec06ea3ad62558f48/src-tauri/icons/Square30x30Logo.png
--------------------------------------------------------------------------------
/src-tauri/icons/Square310x310Logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hiql/passwords-app/a69ef191b600b954e09e692ec06ea3ad62558f48/src-tauri/icons/Square310x310Logo.png
--------------------------------------------------------------------------------
/src-tauri/icons/Square44x44Logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hiql/passwords-app/a69ef191b600b954e09e692ec06ea3ad62558f48/src-tauri/icons/Square44x44Logo.png
--------------------------------------------------------------------------------
/src-tauri/icons/Square71x71Logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hiql/passwords-app/a69ef191b600b954e09e692ec06ea3ad62558f48/src-tauri/icons/Square71x71Logo.png
--------------------------------------------------------------------------------
/src-tauri/icons/Square89x89Logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hiql/passwords-app/a69ef191b600b954e09e692ec06ea3ad62558f48/src-tauri/icons/Square89x89Logo.png
--------------------------------------------------------------------------------
/src-tauri/icons/StoreLogo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hiql/passwords-app/a69ef191b600b954e09e692ec06ea3ad62558f48/src-tauri/icons/StoreLogo.png
--------------------------------------------------------------------------------
/src-tauri/icons/icon.icns:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hiql/passwords-app/a69ef191b600b954e09e692ec06ea3ad62558f48/src-tauri/icons/icon.icns
--------------------------------------------------------------------------------
/src-tauri/icons/icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hiql/passwords-app/a69ef191b600b954e09e692ec06ea3ad62558f48/src-tauri/icons/icon.ico
--------------------------------------------------------------------------------
/src-tauri/icons/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hiql/passwords-app/a69ef191b600b954e09e692ec06ea3ad62558f48/src-tauri/icons/icon.png
--------------------------------------------------------------------------------
/src-tauri/src/lib.rs:
--------------------------------------------------------------------------------
1 | use base64::{prelude::BASE64_STANDARD, Engine};
2 | use passwords::{analyzer, scorer, PasswordGenerator};
3 | use sha1::Sha1;
4 | use sha2::{Digest, Sha224, Sha256, Sha384, Sha512};
5 | use tauri::menu::{AboutMetadata, MenuBuilder, MenuItemBuilder, SubmenuBuilder};
6 | use tauri_plugin_opener::OpenerExt;
7 | use zxcvbn::zxcvbn;
8 |
9 | mod syllables;
10 | mod words;
11 |
12 | #[tauri::command]
13 | fn gen_password(
14 | length: usize,
15 | numbers: bool,
16 | symbols: bool,
17 | uppercase: bool,
18 | lowercase: bool,
19 | spaces: bool,
20 | exclude_similar_characters: bool,
21 | strict: bool,
22 | ) -> String {
23 | let pg = PasswordGenerator {
24 | length,
25 | numbers,
26 | lowercase_letters: lowercase,
27 | uppercase_letters: uppercase,
28 | symbols,
29 | spaces,
30 | exclude_similar_characters,
31 | strict,
32 | };
33 | pg.generate_one().unwrap()
34 | }
35 |
36 | #[tauri::command]
37 | fn gen_pin(length: usize) -> String {
38 | let pg = PasswordGenerator {
39 | length,
40 | numbers: true,
41 | lowercase_letters: false,
42 | uppercase_letters: false,
43 | symbols: false,
44 | spaces: false,
45 | exclude_similar_characters: false,
46 | strict: true,
47 | };
48 | pg.generate_one().unwrap()
49 | }
50 |
51 | #[tauri::command]
52 | fn gen_words(length: usize, full_words: bool) -> Vec<&'static str> {
53 | let max = if length > 256 { 256 } else { length };
54 | let mut words: Vec<&str> = vec![];
55 | let mut i = 0;
56 |
57 | while i < max {
58 | let word = if full_words {
59 | words::rand()
60 | } else {
61 | syllables::rand()
62 | };
63 |
64 | let found = words.iter().find(|&&x| *x == *word);
65 | if found.is_some() {
66 | continue;
67 | }
68 |
69 | words.push(word);
70 | i += 1;
71 | }
72 |
73 | words
74 | }
75 |
76 | #[derive(serde::Serialize)]
77 | struct AnalyzedResult {
78 | password: String,
79 | length: usize,
80 | spaces_count: usize,
81 | numbers_count: usize,
82 | lowercase_letters_count: usize,
83 | uppercase_letters_count: usize,
84 | symbols_count: usize,
85 | other_characters_count: usize,
86 | consecutive_count: usize,
87 | non_consecutive_count: usize,
88 | progressive_count: usize,
89 | is_common: bool,
90 | }
91 |
92 | #[tauri::command]
93 | fn analyze(password: &str) -> AnalyzedResult {
94 | let result = analyzer::analyze(password);
95 | AnalyzedResult {
96 | password: result.password().to_string(),
97 | length: result.length(),
98 | spaces_count: result.spaces_count(),
99 | numbers_count: result.numbers_count(),
100 | lowercase_letters_count: result.lowercase_letters_count(),
101 | uppercase_letters_count: result.uppercase_letters_count(),
102 | symbols_count: result.symbols_count(),
103 | other_characters_count: result.other_characters_count(),
104 | consecutive_count: result.consecutive_count(),
105 | non_consecutive_count: result.non_consecutive_count(),
106 | progressive_count: result.progressive_count(),
107 | is_common: result.is_common(),
108 | }
109 | }
110 |
111 | #[tauri::command]
112 | fn score(password: &str) -> f64 {
113 | scorer::score(&analyzer::analyze(password))
114 | }
115 |
116 | #[tauri::command]
117 | fn is_common_password(password: &str) -> bool {
118 | analyzer::is_common_password(password)
119 | }
120 |
121 | #[tauri::command]
122 | fn md5(password: &str) -> String {
123 | let digest = md5::compute(password.as_bytes());
124 | format!("{:x}", digest)
125 | }
126 |
127 | #[tauri::command]
128 | fn bcrypt(password: &str, rounds: u32) -> String {
129 | bcrypt::hash(&password, rounds).unwrap()
130 | }
131 |
132 | #[tauri::command]
133 | fn base64(password: &str) -> String {
134 | BASE64_STANDARD.encode(password.as_bytes())
135 | }
136 |
137 | #[tauri::command]
138 | fn sha1(password: &str) -> String {
139 | let mut hasher = Sha1::new();
140 | hasher.update(password.as_bytes());
141 | let result = hasher.finalize();
142 | hex::encode(result)
143 | }
144 |
145 | #[tauri::command]
146 | fn sha224(password: &str) -> String {
147 | let mut hasher = Sha224::new();
148 | hasher.update(password.as_bytes());
149 | let result = hasher.finalize();
150 | hex::encode(result)
151 | }
152 |
153 | #[tauri::command]
154 | fn sha256(password: &str) -> String {
155 | let mut hasher = Sha256::new();
156 | hasher.update(password.as_bytes());
157 | let result = hasher.finalize();
158 | hex::encode(result)
159 | }
160 |
161 | #[tauri::command]
162 | fn sha384(password: &str) -> String {
163 | let mut hasher = Sha384::new();
164 | hasher.update(password.as_bytes());
165 | let result = hasher.finalize();
166 | hex::encode(result)
167 | }
168 | #[tauri::command]
169 | fn sha512(password: &str) -> String {
170 | let mut hasher = Sha512::new();
171 | hasher.update(password.as_bytes());
172 | let result = hasher.finalize();
173 | hex::encode(result)
174 | }
175 |
176 | #[tauri::command]
177 | fn crack_times(password: &str) -> String {
178 | let entropy = zxcvbn(password, &[]);
179 | entropy
180 | .crack_times()
181 | .offline_slow_hashing_1e4_per_second()
182 | .to_string()
183 | }
184 |
185 | #[cfg_attr(mobile, tauri::mobile_entry_point)]
186 | pub fn run() {
187 | tauri::Builder::default()
188 | .setup(|app| {
189 | let github = MenuItemBuilder::new("Github").id("github").build(app)?;
190 | let app_submenu = SubmenuBuilder::new(app, "App")
191 | .about(Some(AboutMetadata {
192 | ..Default::default()
193 | }))
194 | .separator()
195 | .item(&github)
196 | .separator()
197 | .services()
198 | .separator()
199 | .hide()
200 | .hide_others()
201 | .quit()
202 | .build()?;
203 | let menu = MenuBuilder::new(app).items(&[&app_submenu]).build()?;
204 |
205 | app.set_menu(menu)?;
206 | app.on_menu_event(move |app, event| {
207 | if event.id() == github.id() {
208 | app.opener()
209 | .open_url("https://github.com/hiql/passwords-app", None::<&str>)
210 | .unwrap();
211 | }
212 | });
213 | Ok(())
214 | })
215 | .plugin(tauri_plugin_clipboard_manager::init())
216 | .plugin(tauri_plugin_opener::init())
217 | .invoke_handler(tauri::generate_handler![
218 | gen_password,
219 | gen_pin,
220 | gen_words,
221 | score,
222 | analyze,
223 | is_common_password,
224 | md5,
225 | base64,
226 | bcrypt,
227 | sha1,
228 | sha224,
229 | sha256,
230 | sha384,
231 | sha512,
232 | crack_times
233 | ])
234 | .run(tauri::generate_context!())
235 | .expect("error while running tauri application");
236 | }
237 |
238 | #[cfg(test)]
239 | mod test {
240 | use super::*;
241 |
242 | #[test]
243 | fn test_gen_words() {
244 | let words = gen_words(15, true);
245 | println!("{:?}", words);
246 | let words = gen_words(8, false);
247 | println!("{:?}", words);
248 | }
249 | }
250 |
--------------------------------------------------------------------------------
/src-tauri/src/main.rs:
--------------------------------------------------------------------------------
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 | passwords_app_lib::run()
6 | }
7 |
--------------------------------------------------------------------------------
/src-tauri/tauri.conf.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://schema.tauri.app/config/2",
3 | "productName": "Passwords",
4 | "version": "0.1.4",
5 | "identifier": "com.github.hiql.passwords-app",
6 | "build": {
7 | "beforeDevCommand": "npm run dev",
8 | "devUrl": "http://localhost:1420",
9 | "beforeBuildCommand": "npm run build",
10 | "frontendDist": "../dist"
11 | },
12 | "app": {
13 | "windows": [
14 | {
15 | "title": "Passwords",
16 | "width": 480,
17 | "height": 600,
18 | "maximized": false,
19 | "resizable": false,
20 | "titleBarStyle": "Overlay"
21 | }
22 | ],
23 | "security": {
24 | "csp": null
25 | }
26 | },
27 | "bundle": {
28 | "active": true,
29 | "targets": "all",
30 | "icon": [
31 | "icons/32x32.png",
32 | "icons/128x128.png",
33 | "icons/128x128@2x.png",
34 | "icons/icon.icns",
35 | "icons/icon.ico"
36 | ]
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/App.css:
--------------------------------------------------------------------------------
1 | body {
2 | padding: 0;
3 | margin: 0;
4 | overflow: hidden;
5 |
6 | cursor: default;
7 | -webkit-user-select: none; /* Chrome, Safari, Opera */
8 | -moz-user-select: none; /* Firefox */
9 | -ms-user-select: none; /* Internet Explorer/Edge */
10 | user-select: none; /* Standard syntax */
11 | }
12 |
13 | :root {
14 | font-synthesis: none;
15 | text-rendering: optimizeLegibility;
16 | -webkit-font-smoothing: antialiased;
17 | -moz-osx-font-smoothing: grayscale;
18 | -webkit-text-size-adjust: 100%;
19 | }
20 |
--------------------------------------------------------------------------------
/src/App.tsx:
--------------------------------------------------------------------------------
1 | import { ReactNode, useEffect, useState } from "react";
2 | import { getCurrentWindow, LogicalSize } from "@tauri-apps/api/window";
3 | import { readText } from "@tauri-apps/plugin-clipboard-manager";
4 | import useResizeObserver from "use-resize-observer";
5 | import {
6 | Flex,
7 | Theme,
8 | Text,
9 | Button,
10 | Slider,
11 | TextField,
12 | Box,
13 | Badge,
14 | BadgeProps,
15 | Tabs,
16 | RadioCards,
17 | TextArea,
18 | IconButton,
19 | Checkbox,
20 | RadioGroup,
21 | Spinner,
22 | Table,
23 | ButtonProps,
24 | ThemeProps,
25 | Tooltip,
26 | Strong,
27 | } from "@radix-ui/themes";
28 | import {
29 | ButtonIcon,
30 | CheckIcon,
31 | ClipboardIcon,
32 | CodeIcon,
33 | CopyIcon,
34 | EraserIcon,
35 | LetterCaseCapitalizeIcon,
36 | LightningBoltIcon,
37 | MagicWandIcon,
38 | QuestionMarkCircledIcon,
39 | ReaderIcon,
40 | ShuffleIcon,
41 | UpdateIcon,
42 | } from "@radix-ui/react-icons";
43 | import "@radix-ui/themes/styles.css";
44 | import "./App.css";
45 | import { isDigit, isLetter } from "./utils";
46 | import {
47 | useCopy,
48 | useDebounce,
49 | useHover,
50 | useLocalStorage,
51 | useTheme,
52 | } from "./hooks";
53 | import natives, { AnalyzedResult } from "./natives";
54 |
55 | const ACCENT_COLOR_KEY = "passwords-app-accent-color";
56 | const DEFAULT_ACCENT_COLOR = "indigo";
57 | const COLORS: ButtonProps["color"][] = [
58 | "gray",
59 | "gold",
60 | "bronze",
61 | "brown",
62 | "yellow",
63 | "amber",
64 | "orange",
65 | "tomato",
66 | "red",
67 | "ruby",
68 | "crimson",
69 | "pink",
70 | "plum",
71 | "purple",
72 | "violet",
73 | "iris",
74 | "indigo",
75 | "blue",
76 | "cyan",
77 | "teal",
78 | "jade",
79 | "green",
80 | "grass",
81 | "lime",
82 | "mint",
83 | "sky",
84 | ];
85 |
86 | const getStrengthString = (score: number): string => {
87 | if (score >= 0 && score < 20) {
88 | return "VERY DANGEROUS";
89 | } else if (score >= 20 && score < 40) {
90 | return "DANGEROUS";
91 | } else if (score >= 40 && score < 60) {
92 | return "VERY WEAK";
93 | } else if (score >= 60 && score < 80) {
94 | return "WEAK";
95 | } else if (score >= 80 && score < 90) {
96 | return "GOOD";
97 | } else if (score >= 90 && score < 95) {
98 | return "STRONG";
99 | } else if (score >= 95 && score < 99) {
100 | return "VERY STRONG";
101 | } else if (score >= 99 && score <= 100) {
102 | return "INVULNERABLE";
103 | } else return "";
104 | };
105 |
106 | const getStrengthColor = (score: number): BadgeProps["color"] | undefined => {
107 | if (score >= 0 && score < 40) {
108 | return "red";
109 | } else if (score >= 40 && score < 60) {
110 | return "orange";
111 | } else if (score >= 60 && score < 80) {
112 | return "yellow";
113 | } else if (score >= 80 && score <= 100) {
114 | return "green";
115 | } else {
116 | return undefined;
117 | }
118 | };
119 |
120 | function App() {
121 | const [panelType, setPanelType] = useState("generator");
122 | const [passwordType, setPasswordType] = useState("random");
123 | const [randomLength, setRandomLength] = useState(20);
124 | const [randomSymbols, setRandomSymbols] = useState(false);
125 | const [randomNumbers, setRandomNumbers] = useState(true);
126 | const [randomUppercase, setRandomUppercase] = useState(true);
127 | const [randomExcludeSimilarChars, setRandomExcludeSimilarChars] =
128 | useState(false);
129 | const [randomStrict, setRandomStrict] = useState(true);
130 | const [memorableLength, setMemorableLength] = useState(4);
131 | const [memorableUseFullWords, setMemorableUseFullWords] = useState(true);
132 | const [memorableCapitalize, setMemorableCapitalize] = useState(false);
133 | const [memorableUppercase, setMemorableUppercase] = useState(false);
134 | const [memorableSeparator, setMemorableSeparator] = useState("-");
135 | const [pinLength, setPinLength] = useState(6);
136 | const [strength, setStrength] = useState("");
137 | const [strengthColor, setStrengthColor] =
138 | useState(undefined);
139 | const [crackTime, setCrackTime] = useState("");
140 | const [isGenerating, setIsGenerating] = useState(false);
141 | const [password, setPassword] = useState("");
142 | const [hashPassword, setHashPassword] = useState("");
143 | const [md5String, setMd5String] = useState("");
144 | const [md5Uppercase, setMd5Uppercase] = useState(false);
145 | const [bcryptString, setBcryptString] = useState("");
146 | const [bcryptRounds, setBcryptRounds] = useState(10);
147 | const [base64String, setBase64String] = useState("");
148 | const [shaType, setShaType] = useState("256");
149 | const [sha1String, setSha1String] = useState("");
150 | const [sha224String, setSha224String] = useState("");
151 | const [sha256String, setSha256String] = useState("");
152 | const [sha384String, setSha384String] = useState("");
153 | const [sha512String, setSha512String] = useState("");
154 | const [isCalculating, setIsCalculating] = useState(false);
155 | const [analysisPassword, setAnalysisPassword] = useState("");
156 | const [analysisResult, setAnalysisResult] = useState(
157 | null
158 | );
159 | const [isAnalyzing, setIsAnalyzing] = useState(false);
160 |
161 | const randomLengthDebounce = useDebounce(randomLength, 200);
162 | const memorableLengthDebounce = useDebounce(memorableLength, 200);
163 | const pinLengthDebounce = useDebounce(pinLength, 200);
164 | const hashDebounce = useDebounce(hashPassword, 400);
165 | const analyzeDebounce = useDebounce(analysisPassword, 400);
166 | const bcryptRoundsDebounce = useDebounce(bcryptRounds, 200);
167 |
168 | const theme = useTheme();
169 | const { isCopied, copyToClipboard, resetCopyStatus } = useCopy();
170 | const [storedThemeColorValue, setThemeColorValue] = useLocalStorage(
171 | ACCENT_COLOR_KEY,
172 | DEFAULT_ACCENT_COLOR
173 | );
174 |
175 | async function generateRandomPassword() {
176 | const pass: string = await natives.generatePassword({
177 | length: randomLength,
178 | symbols: randomSymbols,
179 | numbers: randomNumbers,
180 | uppercase: randomUppercase,
181 | lowercase: true,
182 | spaces: false,
183 | excludeSimilarCharacters: randomExcludeSimilarChars,
184 | strict: randomStrict,
185 | });
186 | const score: number = await natives.score(pass);
187 | const time: string = await natives.crackTimes(pass);
188 | setPassword(pass);
189 | setStrength(getStrengthString(score));
190 | setStrengthColor(getStrengthColor(score));
191 | setCrackTime(time);
192 | setIsGenerating(false);
193 | resetCopyStatus();
194 | }
195 |
196 | async function generateWords() {
197 | const words: string[] = await natives.generateWords(
198 | memorableLength,
199 | memorableUseFullWords
200 | );
201 | let pass = words
202 | .map((w) =>
203 | memorableUppercase
204 | ? w.toUpperCase()
205 | : memorableCapitalize
206 | ? w.charAt(0).toUpperCase() + w.slice(1)
207 | : w
208 | )
209 | .join(memorableSeparator === "" ? " " : memorableSeparator);
210 | setPassword(pass);
211 | setIsGenerating(false);
212 | resetCopyStatus();
213 | }
214 |
215 | async function generatePin() {
216 | setPassword(await natives.generatePin(pinLength));
217 | setIsGenerating(false);
218 | resetCopyStatus();
219 | }
220 |
221 | async function analyzeAsync() {
222 | setIsAnalyzing(true);
223 | if (analysisPassword) {
224 | let obj: AnalyzedResult = await natives.analyze(analysisPassword);
225 | obj.score = await natives.score(analysisPassword);
226 | obj.crack_times = await natives.crackTimes(analysisPassword);
227 | setAnalysisResult(obj);
228 | } else {
229 | setAnalysisResult(null);
230 | }
231 | setIsAnalyzing(false);
232 | }
233 |
234 | async function bcryptAsync(password: string, rounds: number) {
235 | if (password) {
236 | const value: string = await natives.bcrypt(password, rounds);
237 | setBcryptString(value);
238 | }
239 | }
240 |
241 | async function hashAsync() {
242 | if (hashPassword) {
243 | setMd5String(await natives.md5(hashPassword));
244 | setBase64String(await natives.base64(hashPassword));
245 | setBcryptString(await natives.bcrypt(hashPassword, bcryptRounds));
246 | setSha1String(await natives.sha1(hashPassword));
247 | setSha224String(await natives.sha224(hashPassword));
248 | setSha256String(await natives.sha256(hashPassword));
249 | setSha384String(await natives.sha384(hashPassword));
250 | setSha512String(await natives.sha512(hashPassword));
251 | } else {
252 | setMd5String("");
253 | setBase64String("");
254 | setBcryptString("");
255 | setSha1String("");
256 | setSha224String("");
257 | setSha256String("");
258 | setSha384String("");
259 | setSha512String("");
260 | }
261 | setIsCalculating(false);
262 | }
263 |
264 | useEffect(() => {
265 | setIsGenerating(true);
266 | generateRandomPassword();
267 | }, [
268 | randomLengthDebounce,
269 | randomNumbers,
270 | randomSymbols,
271 | randomUppercase,
272 | randomExcludeSimilarChars,
273 | randomStrict,
274 | ]);
275 |
276 | useEffect(() => {
277 | setIsGenerating(true);
278 | generateWords();
279 | }, [
280 | memorableLengthDebounce,
281 | memorableCapitalize,
282 | memorableUppercase,
283 | memorableUseFullWords,
284 | memorableSeparator,
285 | ]);
286 |
287 | useEffect(() => {
288 | setIsGenerating(true);
289 | generatePin();
290 | }, [pinLengthDebounce]);
291 |
292 | useEffect(() => {
293 | setIsCalculating(true);
294 | hashAsync();
295 | }, [hashDebounce]);
296 |
297 | useEffect(() => {
298 | analyzeAsync();
299 | }, [analyzeDebounce]);
300 |
301 | useEffect(() => {
302 | bcryptAsync(hashPassword, bcryptRounds);
303 | setIsCalculating(false);
304 | }, [bcryptRoundsDebounce]);
305 |
306 | const copy = async () => {
307 | await copyToClipboard(password);
308 | };
309 |
310 | useEffect(() => {
311 | if (passwordType === "random") {
312 | setIsGenerating(true);
313 | generateRandomPassword();
314 | } else if (passwordType === "memorable") {
315 | setIsGenerating(true);
316 | generateWords();
317 | } else if (passwordType === "pin") {
318 | setIsGenerating(true);
319 | generatePin();
320 | }
321 | }, [passwordType]);
322 |
323 | async function setWindowHeight(height: number) {
324 | await getCurrentWindow().setSize(new LogicalSize(480, height));
325 | }
326 |
327 | const { ref } = useResizeObserver({
328 | onResize: ({ height }) => {
329 | if (height) {
330 | setWindowHeight(height);
331 | }
332 | },
333 | });
334 |
335 | useEffect(() => {
336 | // disable context menu
337 | document.addEventListener(
338 | "contextmenu",
339 | (e) => {
340 | e.preventDefault();
341 | return false;
342 | },
343 | { capture: true }
344 | );
345 | }, []);
346 |
347 | return (
348 |
355 |
356 |
368 |
369 |
380 |
381 |
382 |
383 | Generator
384 |
385 |
386 |
387 |
388 |
389 | Hasher
390 |
391 |
392 |
393 |
394 |
395 | Analyzer
396 |
397 |
398 |
399 |
400 |
401 | Principles
402 |
403 |
404 |
405 |
406 |
407 |
408 |
409 | Choose a password type:
410 |
411 |
418 |
419 |
420 |
421 | Random
422 |
423 |
424 |
425 |
426 |
427 |
428 | Memorable
429 |
430 |
431 |
432 |
433 |
434 | PIN
435 |
436 |
437 |
438 |
439 | Customize your password:
440 |
441 | {passwordType === "random" ? (
442 |
452 |
453 |
454 |
455 |
458 | setRandomNumbers(checked as boolean)
459 | }
460 | />
461 | Numbers
462 |
463 |
464 |
465 |
466 |
469 | setRandomSymbols(checked as boolean)
470 | }
471 | />
472 | Symbols
473 |
474 |
475 |
476 |
477 |
480 | setRandomUppercase(checked as boolean)
481 | }
482 | />
483 | Uppercase
484 |
485 |
486 |
487 |
488 |
491 | setRandomStrict(checked as boolean)
492 | }
493 | />
494 | Strict
495 |
496 |
497 |
498 |
499 |
502 | setRandomExcludeSimilarChars(checked as boolean)
503 | }
504 | />
505 | Exclude similar characters
506 |
507 |
508 |
509 |
510 |
511 |
512 |
513 | Characters
514 | setRandomLength(values[0])}
517 | min={4}
518 | max={128}
519 | />
520 |
521 |
528 |
529 |
530 |
531 | ) : passwordType === "memorable" ? (
532 |
542 |
543 |
544 |
545 | {
548 | setMemorableCapitalize(checked as boolean);
549 | if (checked) {
550 | setMemorableUppercase(false);
551 | }
552 | }}
553 | />
554 | Capitalize
555 |
556 |
557 |
558 |
559 | {
562 | setMemorableUppercase(checked as boolean);
563 | if (checked) {
564 | setMemorableCapitalize(false);
565 | }
566 | }}
567 | />
568 | Uppercase
569 |
570 |
571 |
572 |
573 |
576 | setMemorableUseFullWords(checked as boolean)
577 | }
578 | />
579 | Use full words
580 |
581 |
582 |
583 |
584 |
585 | Separator
586 |
587 |
588 |
593 | setMemorableSeparator(e.currentTarget.value)
594 | }
595 | />
596 |
597 |
598 |
599 |
600 | Characters
601 |
602 |
605 | setMemorableLength(values[0])
606 | }
607 | min={3}
608 | max={20}
609 | />
610 |
611 |
618 |
619 |
620 |
621 | ) : (
622 |
632 |
633 | Characters
634 | setPinLength(values[0])}
637 | min={3}
638 | max={12}
639 | />
640 |
641 |
648 |
649 |
650 |
651 | )}
652 |
653 | Generated password:
654 |
655 | {
664 | await copy();
665 | }}
666 | >
667 |
668 |
674 | {[...password].map((char, i) =>
675 | char === " " ? (
676 |
677 | ) : (
678 |
690 | {char}
691 |
692 | )
693 | )}
694 |
695 |
696 | {passwordType === "random" ? (
697 |
704 | {strength}
705 |
706 | Estimated time to crack: {crackTime}
707 |
708 |
709 | ) : null}
710 |
711 |
718 |
736 |
746 |
747 |
748 |
749 |
750 |
751 |
794 | }
795 | />
796 |
802 |
803 | Rounds
804 |
805 | {
811 | setIsCalculating(true);
812 | setBcryptRounds(value[0]);
813 | }}
814 | />
815 |
816 |
821 |
822 |
823 | }
824 | />
825 |
856 |
857 | 1
858 | 224
859 | 256
860 | 384
861 | 512
862 |
863 |
864 | }
865 | />
866 |
872 |
879 | {isCalculating ? (
880 | <>
881 |
882 |
883 | calculating...
884 |
885 | >
886 | ) : null}
887 |
888 |
889 |
890 |
891 |
892 |
899 |
900 |
912 |
915 |
916 |
917 |
918 |
919 |
920 |
921 | Number of characters
922 |
923 |
924 | {analysisResult?.length}
925 |
926 |
927 |
928 |
929 | Lowercase letters
930 |
931 |
932 | {analysisResult?.lowercase_letters_count}
933 |
934 |
935 |
936 |
937 | Uppercase letters
938 |
939 |
940 | {analysisResult?.uppercase_letters_count}
941 |
942 |
943 |
944 |
945 | Numbers
946 |
947 |
948 | {analysisResult?.numbers_count}
949 |
950 |
951 |
952 |
953 | Spaces
954 |
955 |
956 | {analysisResult?.spaces_count}
957 |
958 |
959 |
960 |
961 | Symbols
962 |
963 |
964 | {analysisResult?.symbols_count}
965 |
966 |
967 |
968 |
969 | Other characters
970 |
971 |
972 | {analysisResult?.other_characters_count}
973 |
974 |
975 |
976 |
977 |
978 | Consecutive repeated characters
979 |
980 |
981 |
982 | {analysisResult?.consecutive_count}
983 |
984 |
985 |
986 |
987 |
988 | Non consecutive repeated characters
989 |
990 |
991 |
992 | {analysisResult?.non_consecutive_count}
993 |
994 |
995 |
996 |
997 | Progressive characters
998 |
999 |
1000 | {analysisResult?.progressive_count}
1001 |
1002 |
1003 |
1004 |
1005 | Strength
1006 |
1007 |
1008 | {analysisResult ? (
1009 |
1010 | {getStrengthString(analysisResult.score)}
1011 |
1012 | ) : (
1013 | ""
1014 | )}
1015 |
1016 |
1017 |
1018 |
1019 | Common password
1020 |
1021 |
1022 | {analysisResult ? (
1023 | analysisResult.is_common ? (
1024 | YES
1025 | ) : (
1026 | NO
1027 | )
1028 | ) : (
1029 | ""
1030 | )}
1031 |
1032 |
1033 |
1034 |
1035 | Estimated time to crack
1036 |
1037 |
1038 | {analysisResult?.crack_times}
1039 |
1040 |
1041 |
1042 |
1043 |
1044 |
1045 | {isAnalyzing ? (
1046 | <>
1047 |
1048 |
1049 | analyzing...
1050 |
1051 | >
1052 | ) : null}
1053 |
1054 |
1055 |
1056 |
1057 | The principles of generating a strong password
1058 |
1059 |
1060 |
1061 | Make it unique
1062 |
1063 |
1064 | Passwords should be unique to different accounts. This reduces
1065 | the likelihood that multiple accounts of yours could be hacked
1066 | if one of your passwords is exposed in a data breach.
1067 |
1068 |
1069 | Make it random
1070 |
1071 |
1072 | The password has a combination of uppercase and lowercase
1073 | letters, numbers, special characters, and words with no
1074 | discernable pattern, unrelated to your personal information.
1075 |
1076 |
1077 | Make it long
1078 |
1079 |
1080 | The password consists of 14 characters or longer. An
1081 | 8-character password will take a hacker 39 minutes to crack
1082 | while a 16-character password will take a hacker a billion
1083 | years to crack.
1084 |
1085 |
1086 |
1087 | {COLORS.map((color) => (
1088 | {
1094 | setThemeColorValue(e.currentTarget.value);
1095 | }}
1096 | >
1097 | ))}
1098 |
1099 |
1100 |
1101 |
1102 |
1103 |
1104 | );
1105 | }
1106 |
1107 | function TextBox({
1108 | label,
1109 | text,
1110 | placeholder,
1111 | rows,
1112 | toolbar,
1113 | }: {
1114 | label: string;
1115 | text: string;
1116 | placeholder?: string;
1117 | rows?: number;
1118 | toolbar?: ReactNode;
1119 | }) {
1120 | const { isCopied, copyToClipboard } = useCopy();
1121 | const { hovered, ref } = useHover();
1122 |
1123 | return (
1124 |
1125 |
1126 | {label}
1127 | {toolbar}
1128 |
1129 |
1130 |
1136 |
1137 | {(hovered || isCopied) && text ? (
1138 | copyToClipboard(text)}
1143 | variant="solid"
1144 | >
1145 | {isCopied ? : }
1146 |
1147 | ) : null}
1148 |
1149 |
1150 |
1151 | );
1152 | }
1153 |
1154 | export default App;
1155 |
--------------------------------------------------------------------------------
/src/assets/react.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/hooks.ts:
--------------------------------------------------------------------------------
1 | import { useState, useEffect, useRef, useCallback } from "react";
2 | import { getCurrentWindow } from "@tauri-apps/api/window";
3 | import { UnlistenFn } from "@tauri-apps/api/event";
4 | import { writeText } from "@tauri-apps/plugin-clipboard-manager";
5 |
6 | export const useTheme = () => {
7 | const [theme, setTheme] = useState<"light" | "dark" | "inherit">("inherit");
8 |
9 | useEffect(() => {
10 | let unlisten: UnlistenFn | undefined;
11 |
12 | (async () => {
13 | setTheme((await getCurrentWindow().theme()) || "inherit");
14 |
15 | unlisten = await getCurrentWindow().onThemeChanged(
16 | ({ payload: theme }) => {
17 | console.log(`theme changed to ${theme}`);
18 | setTheme(theme);
19 | }
20 | );
21 | })();
22 |
23 | return () => {
24 | if (unlisten != null) {
25 | unlisten();
26 | }
27 | };
28 | }, []);
29 |
30 | return theme;
31 | };
32 |
33 | export function useCopy() {
34 | const [isCopied, setIsCopied] = useState(false);
35 |
36 | const copyToClipboard = async (text: string) => {
37 | await writeText(text);
38 | setIsCopied(true);
39 | };
40 |
41 | const resetCopyStatus = () => {
42 | setIsCopied(false);
43 | };
44 |
45 | useEffect(() => {
46 | if (isCopied) {
47 | const timer = setTimeout(resetCopyStatus, 3000); // Reset copy status after 3 seconds
48 | return () => clearTimeout(timer);
49 | }
50 | }, [isCopied]);
51 |
52 | return { isCopied, copyToClipboard, resetCopyStatus };
53 | }
54 |
55 | export function useDebounce(value: T, delay: number): T {
56 | // State and setters for debounced value
57 | const [debouncedValue, setDebouncedValue] = useState(value);
58 | useEffect(
59 | () => {
60 | // Update debounced value after delay
61 | const handler = setTimeout(() => {
62 | setDebouncedValue(value);
63 | }, delay);
64 | // Cancel the timeout if value changes (also on delay change or unmount)
65 | // This is how we prevent debounced value from updating if value is changed ...
66 | // .. within the delay period. Timeout gets cleared and restarted.
67 | return () => {
68 | clearTimeout(handler);
69 | };
70 | },
71 | [value, delay] // Only re-call effect if value or delay changes
72 | );
73 | return debouncedValue;
74 | }
75 |
76 | export function useHover() {
77 | const [hovered, setHovered] = useState(false);
78 | const ref = useRef(null);
79 | const onMouseEnter = useCallback(() => setHovered(true), []);
80 | const onMouseLeave = useCallback(() => setHovered(false), []);
81 |
82 | useEffect(() => {
83 | if (ref.current) {
84 | ref.current.addEventListener("mouseenter", onMouseEnter);
85 | ref.current.addEventListener("mouseleave", onMouseLeave);
86 |
87 | return () => {
88 | ref.current?.removeEventListener("mouseenter", onMouseEnter);
89 | ref.current?.removeEventListener("mouseleave", onMouseLeave);
90 | };
91 | }
92 |
93 | return undefined;
94 | }, []);
95 |
96 | return { ref, hovered };
97 | }
98 |
99 | export function useLocalStorage(key: string, initialValue: T) {
100 | // State to store our value
101 | // Pass initial state function to useState so logic is only executed once
102 | const [storedValue, setStoredValue] = useState(() => {
103 | try {
104 | // Get from local storage by key
105 | const item = window.localStorage.getItem(key);
106 | // Parse stored json or if none return initialValue
107 | return item ? JSON.parse(item) : initialValue;
108 | } catch (error) {
109 | // If error also return initialValue
110 | console.log(error);
111 | return initialValue;
112 | }
113 | });
114 | // Return a wrapped version of useState's setter function that ...
115 | // ... persists the new value to localStorage.
116 | const setValue = (value: T | ((val: T) => T)) => {
117 | try {
118 | // Allow value to be a function so we have same API as useState
119 | const valueToStore =
120 | value instanceof Function ? value(storedValue) : value;
121 | // Save state
122 | setStoredValue(valueToStore);
123 | // Save to local storage
124 | window.localStorage.setItem(key, JSON.stringify(valueToStore));
125 | } catch (error) {
126 | // A more advanced implementation would handle the error case
127 | console.log(error);
128 | }
129 | };
130 | return [storedValue, setValue] as const;
131 | }
132 |
--------------------------------------------------------------------------------
/src/main.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import ReactDOM from "react-dom/client";
3 | import App from "./App";
4 |
5 | ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
6 |
7 |
8 |
9 | );
10 |
--------------------------------------------------------------------------------
/src/natives.ts:
--------------------------------------------------------------------------------
1 | import { invoke } from "@tauri-apps/api/core";
2 |
3 | export interface AnalyzedResult {
4 | password: string;
5 | length: number;
6 | spaces_count: number;
7 | numbers_count: number;
8 | lowercase_letters_count: number;
9 | uppercase_letters_count: number;
10 | symbols_count: number;
11 | other_characters_count: number;
12 | consecutive_count: number;
13 | non_consecutive_count: number;
14 | progressive_count: number;
15 | is_common: boolean;
16 | crack_times?: string;
17 | score: number;
18 | }
19 |
20 | export interface Complexity {
21 | length: number;
22 | symbols: boolean;
23 | numbers: boolean;
24 | uppercase: boolean;
25 | lowercase: boolean;
26 | spaces: boolean;
27 | excludeSimilarCharacters: boolean;
28 | strict: boolean;
29 | }
30 |
31 | const generatePassword = async (options: Complexity): Promise => {
32 | return await invoke("gen_password", { ...options });
33 | };
34 |
35 | const generateWords = async (
36 | length: number,
37 | fullWords: boolean
38 | ): Promise => {
39 | return await invoke("gen_words", {
40 | length,
41 | fullWords,
42 | });
43 | };
44 |
45 | const generatePin = async (length: number): Promise => {
46 | return await invoke("gen_pin", {
47 | length,
48 | });
49 | };
50 |
51 | const analyze = async (password: string): Promise => {
52 | return await invoke("analyze", {
53 | password,
54 | });
55 | };
56 |
57 | const score = async (password: string): Promise => {
58 | return await invoke("score", {
59 | password,
60 | });
61 | };
62 |
63 | const crackTimes = async (password: string): Promise => {
64 | return await invoke("crack_times", {
65 | password,
66 | });
67 | };
68 |
69 | const md5 = async (password: string): Promise => {
70 | return await invoke("md5", {
71 | password,
72 | });
73 | };
74 |
75 | const base64 = async (password: string): Promise => {
76 | return await invoke("base64", {
77 | password,
78 | });
79 | };
80 |
81 | const bcrypt = async (password: string, rounds: number): Promise => {
82 | return await invoke("bcrypt", {
83 | password,
84 | rounds,
85 | });
86 | };
87 |
88 | const sha1 = async (password: string): Promise => {
89 | return await invoke("sha1", {
90 | password,
91 | });
92 | };
93 |
94 | const sha224 = async (password: string): Promise => {
95 | return await invoke("sha224", {
96 | password,
97 | });
98 | };
99 |
100 | const sha256 = async (password: string): Promise => {
101 | return await invoke("sha256", {
102 | password,
103 | });
104 | };
105 |
106 | const sha384 = async (password: string): Promise => {
107 | return await invoke("sha384", {
108 | password,
109 | });
110 | };
111 |
112 | const sha512 = async (password: string): Promise => {
113 | return await invoke("sha512", {
114 | password,
115 | });
116 | };
117 |
118 | export default {
119 | generatePassword,
120 | generateWords,
121 | generatePin,
122 | score,
123 | crackTimes,
124 | analyze,
125 | md5,
126 | bcrypt,
127 | base64,
128 | sha1,
129 | sha224,
130 | sha256,
131 | sha384,
132 | sha512,
133 | };
134 |
--------------------------------------------------------------------------------
/src/utils.ts:
--------------------------------------------------------------------------------
1 | export function sleep(millis: number) {
2 | return new Promise((resolve) => setTimeout(resolve, millis));
3 | }
4 |
5 | export function isDigit(char: string): boolean {
6 | return /^\d$/.test(char);
7 | }
8 |
9 | export function isLetter(char: string): boolean {
10 | return /^[A-Za-z]$/.test(char);
11 | }
12 |
--------------------------------------------------------------------------------
/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
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 | "include": ["src"],
24 | "references": [{ "path": "./tsconfig.node.json" }]
25 | }
26 |
--------------------------------------------------------------------------------
/tsconfig.node.json:
--------------------------------------------------------------------------------
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 | }
11 |
--------------------------------------------------------------------------------
/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from "vite";
2 | import react from "@vitejs/plugin-react";
3 |
4 | // @ts-expect-error process is a nodejs global
5 | const host = process.env.TAURI_DEV_HOST;
6 |
7 | // https://vitejs.dev/config/
8 | export default defineConfig(async () => ({
9 | plugins: [react()],
10 |
11 | // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build`
12 | //
13 | // 1. prevent vite from obscuring rust errors
14 | clearScreen: false,
15 | // 2. tauri expects a fixed port, fail if that port is not available
16 | server: {
17 | port: 1420,
18 | strictPort: true,
19 | host: host || false,
20 | hmr: host
21 | ? {
22 | protocol: "ws",
23 | host,
24 | port: 1421,
25 | }
26 | : undefined,
27 | watch: {
28 | // 3. tell vite to ignore watching `src-tauri`
29 | ignored: ["**/src-tauri/**"],
30 | },
31 | },
32 | }));
33 |
--------------------------------------------------------------------------------