├── .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 | image 2 | 3 | # Passwords 4 | 5 | A random password generator 6 | 7 | ![alt text](screenshot.png) 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 | 2 | 3 | 4 | 5 | 6 | 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 |