├── .env.example ├── .gitignore ├── .prettierrc ├── README.md ├── index.html ├── package-lock.json ├── package.json ├── public └── favicon.ico ├── src ├── App.vue ├── assets │ ├── base.css │ ├── logo.svg │ └── main.css ├── main.js ├── router │ └── index.js └── views │ ├── HomeView.vue │ └── ProfileView.vue └── vite.config.js /.env.example: -------------------------------------------------------------------------------- 1 | VITE_CORBADO_PROJECT_ID= -------------------------------------------------------------------------------- /.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 | .DS_Store 12 | dist 13 | dist-ssr 14 | coverage 15 | *.local 16 | 17 | /cypress/videos/ 18 | /cypress/screenshots/ 19 | 20 | # Editor directories and files 21 | .vscode/* 22 | !.vscode/extensions.json 23 | .idea 24 | *.suo 25 | *.ntvs* 26 | *.njsproj 27 | *.sln 28 | *.sw? 29 | .vscode 30 | .env -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 4, 3 | "printWidth": 80 4 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Vue.js Passkey Example App 2 | 3 | This is a sample implementation of the Corbado web-js package being integrated into a web application built with Vue.js. 4 | 5 | Please see the [full blog post](https://www.corbado.com/blog/vuejs-passkeys) to understand the detailed steps needed to integrate passkeys into Vue.js apps. 6 | 7 | ## File structure 8 | 9 | - `src/router/index.js`: routing for the Vue.js web app 10 | - `src/views/HomeView.vue`: component for the sign up / login screen 11 | - `src/views/ProfileView.vue`: component for the user profile information that is shown after successful authentication 12 | 13 | ## Setup 14 | 15 | ### Prerequisites 16 | 17 | Please follow the steps in [Getting started](https://docs.corbado.com/overview/getting-started) to create and configure 18 | a project in the [Corbado developer panel](https://app.corbado.com/signin#register). 19 | 20 | Add your projects id to an environment file as seen in `.env.example` 21 | 22 | You need to have [Node](https://nodejs.org/en/download) and `npm` installed to run it. 23 | 24 | ## Usage 25 | 26 | Run 27 | 28 | ```bash 29 | npm i 30 | ``` 31 | 32 | to install all dependencies. 33 | 34 | Finally, you can run the project locally with 35 | 36 | ```bash 37 | npm run dev 38 | ``` 39 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "passkeys-demo-vuejs", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "passkeys-demo-vuejs", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "@corbado/web-js": "^2.6.0-alpha.0", 12 | "prettier": "^3.2.5", 13 | "vue": "^3.4.25", 14 | "vue-router": "^4.3.2" 15 | }, 16 | "devDependencies": { 17 | "@vitejs/plugin-vue": "^4.3.1", 18 | "vite": "^4.4.9" 19 | } 20 | }, 21 | "node_modules/@babel/parser": { 22 | "version": "7.24.4", 23 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", 24 | "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", 25 | "bin": { 26 | "parser": "bin/babel-parser.js" 27 | }, 28 | "engines": { 29 | "node": ">=6.0.0" 30 | } 31 | }, 32 | "node_modules/@babel/runtime": { 33 | "version": "7.24.4", 34 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", 35 | "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", 36 | "dependencies": { 37 | "regenerator-runtime": "^0.14.0" 38 | }, 39 | "engines": { 40 | "node": ">=6.9.0" 41 | } 42 | }, 43 | "node_modules/@corbado/react": { 44 | "version": "2.6.0-alpha.0", 45 | "resolved": "https://registry.npmjs.org/@corbado/react/-/react-2.6.0-alpha.0.tgz", 46 | "integrity": "sha512-+Fu+/4WjTJuQTCD9glXA3LuGWlTC3mX5k26Yq3cnTrKutRsUtr7WMBz8bRmj5pKsJNOJhQBTiq+3x4dbklw8GA==", 47 | "dependencies": { 48 | "@corbado/shared-ui": "^2.6.0-alpha.0", 49 | "@corbado/web-core": "^2.3.4-alpha.0", 50 | "i18next": "23.5.1", 51 | "i18next-browser-languagedetector": "7.1.0", 52 | "libphonenumber-js": "^1.10.59", 53 | "react-i18next": "13.2.2", 54 | "react-phone-number-input": "^3.3.9" 55 | }, 56 | "peerDependencies": { 57 | "react": ">=18.0.0", 58 | "react-dom": ">=18.0.0" 59 | } 60 | }, 61 | "node_modules/@corbado/shared-ui": { 62 | "version": "2.6.0-alpha.0", 63 | "resolved": "https://registry.npmjs.org/@corbado/shared-ui/-/shared-ui-2.6.0-alpha.0.tgz", 64 | "integrity": "sha512-6yt9yKv4+TkgDEJsSDmwlHK4+I0vdb6cnFKK5EBODgnr6e44mAxD7qa7r9bYswS/wFFXVsOki/KVC7ySx71LYA==", 65 | "dependencies": { 66 | "@corbado/web-core": "^2.3.4-alpha.0", 67 | "rxjs": "^7.8.1", 68 | "ua-parser-js": "^1.0.37" 69 | } 70 | }, 71 | "node_modules/@corbado/web-core": { 72 | "version": "2.3.4-alpha.0", 73 | "resolved": "https://registry.npmjs.org/@corbado/web-core/-/web-core-2.3.4-alpha.0.tgz", 74 | "integrity": "sha512-w+awou60ZTKhX+zqi9UJfTMrrFdlWFjxjQnK/N54p/dXqfUbEEp0NC4xj1RtEOYesfHBFuNGVQiH1iqFggwdhw==", 75 | "dependencies": { 76 | "@github/webauthn-json": "^2.1.1", 77 | "axios": "^1.6.0", 78 | "loglevel": "^1.8.1", 79 | "rxjs": "^7.8.1", 80 | "ts-results": "^3.3.0" 81 | } 82 | }, 83 | "node_modules/@corbado/web-js": { 84 | "version": "2.6.0-alpha.0", 85 | "resolved": "https://registry.npmjs.org/@corbado/web-js/-/web-js-2.6.0-alpha.0.tgz", 86 | "integrity": "sha512-IKP9npQVGt0GrzQ1nlQ8boYM7a6v/ELx6nI0YDQgvTdKvcPNcc6tsditp8qy4Ji1NWhDP6RwBZMBiGrFy48HwA==", 87 | "dependencies": { 88 | "@corbado/react": "^2.6.0-alpha.0", 89 | "@corbado/web-core": "^2.3.4-alpha.0", 90 | "react": "^18.2.0", 91 | "react-dom": "^18.2.0" 92 | }, 93 | "peerDependencies": { 94 | "i18next": "23.5.1", 95 | "i18next-browser-languagedetector": "7.1.0", 96 | "react-i18next": "13.2.2" 97 | } 98 | }, 99 | "node_modules/@esbuild/android-arm": { 100 | "version": "0.18.20", 101 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", 102 | "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", 103 | "cpu": [ 104 | "arm" 105 | ], 106 | "dev": true, 107 | "optional": true, 108 | "os": [ 109 | "android" 110 | ], 111 | "engines": { 112 | "node": ">=12" 113 | } 114 | }, 115 | "node_modules/@esbuild/android-arm64": { 116 | "version": "0.18.20", 117 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", 118 | "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", 119 | "cpu": [ 120 | "arm64" 121 | ], 122 | "dev": true, 123 | "optional": true, 124 | "os": [ 125 | "android" 126 | ], 127 | "engines": { 128 | "node": ">=12" 129 | } 130 | }, 131 | "node_modules/@esbuild/android-x64": { 132 | "version": "0.18.20", 133 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", 134 | "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", 135 | "cpu": [ 136 | "x64" 137 | ], 138 | "dev": true, 139 | "optional": true, 140 | "os": [ 141 | "android" 142 | ], 143 | "engines": { 144 | "node": ">=12" 145 | } 146 | }, 147 | "node_modules/@esbuild/darwin-arm64": { 148 | "version": "0.18.20", 149 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", 150 | "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", 151 | "cpu": [ 152 | "arm64" 153 | ], 154 | "dev": true, 155 | "optional": true, 156 | "os": [ 157 | "darwin" 158 | ], 159 | "engines": { 160 | "node": ">=12" 161 | } 162 | }, 163 | "node_modules/@esbuild/darwin-x64": { 164 | "version": "0.18.20", 165 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", 166 | "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", 167 | "cpu": [ 168 | "x64" 169 | ], 170 | "dev": true, 171 | "optional": true, 172 | "os": [ 173 | "darwin" 174 | ], 175 | "engines": { 176 | "node": ">=12" 177 | } 178 | }, 179 | "node_modules/@esbuild/freebsd-arm64": { 180 | "version": "0.18.20", 181 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", 182 | "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", 183 | "cpu": [ 184 | "arm64" 185 | ], 186 | "dev": true, 187 | "optional": true, 188 | "os": [ 189 | "freebsd" 190 | ], 191 | "engines": { 192 | "node": ">=12" 193 | } 194 | }, 195 | "node_modules/@esbuild/freebsd-x64": { 196 | "version": "0.18.20", 197 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", 198 | "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", 199 | "cpu": [ 200 | "x64" 201 | ], 202 | "dev": true, 203 | "optional": true, 204 | "os": [ 205 | "freebsd" 206 | ], 207 | "engines": { 208 | "node": ">=12" 209 | } 210 | }, 211 | "node_modules/@esbuild/linux-arm": { 212 | "version": "0.18.20", 213 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", 214 | "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", 215 | "cpu": [ 216 | "arm" 217 | ], 218 | "dev": true, 219 | "optional": true, 220 | "os": [ 221 | "linux" 222 | ], 223 | "engines": { 224 | "node": ">=12" 225 | } 226 | }, 227 | "node_modules/@esbuild/linux-arm64": { 228 | "version": "0.18.20", 229 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", 230 | "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", 231 | "cpu": [ 232 | "arm64" 233 | ], 234 | "dev": true, 235 | "optional": true, 236 | "os": [ 237 | "linux" 238 | ], 239 | "engines": { 240 | "node": ">=12" 241 | } 242 | }, 243 | "node_modules/@esbuild/linux-ia32": { 244 | "version": "0.18.20", 245 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", 246 | "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", 247 | "cpu": [ 248 | "ia32" 249 | ], 250 | "dev": true, 251 | "optional": true, 252 | "os": [ 253 | "linux" 254 | ], 255 | "engines": { 256 | "node": ">=12" 257 | } 258 | }, 259 | "node_modules/@esbuild/linux-loong64": { 260 | "version": "0.18.20", 261 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", 262 | "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", 263 | "cpu": [ 264 | "loong64" 265 | ], 266 | "dev": true, 267 | "optional": true, 268 | "os": [ 269 | "linux" 270 | ], 271 | "engines": { 272 | "node": ">=12" 273 | } 274 | }, 275 | "node_modules/@esbuild/linux-mips64el": { 276 | "version": "0.18.20", 277 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", 278 | "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", 279 | "cpu": [ 280 | "mips64el" 281 | ], 282 | "dev": true, 283 | "optional": true, 284 | "os": [ 285 | "linux" 286 | ], 287 | "engines": { 288 | "node": ">=12" 289 | } 290 | }, 291 | "node_modules/@esbuild/linux-ppc64": { 292 | "version": "0.18.20", 293 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", 294 | "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", 295 | "cpu": [ 296 | "ppc64" 297 | ], 298 | "dev": true, 299 | "optional": true, 300 | "os": [ 301 | "linux" 302 | ], 303 | "engines": { 304 | "node": ">=12" 305 | } 306 | }, 307 | "node_modules/@esbuild/linux-riscv64": { 308 | "version": "0.18.20", 309 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", 310 | "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", 311 | "cpu": [ 312 | "riscv64" 313 | ], 314 | "dev": true, 315 | "optional": true, 316 | "os": [ 317 | "linux" 318 | ], 319 | "engines": { 320 | "node": ">=12" 321 | } 322 | }, 323 | "node_modules/@esbuild/linux-s390x": { 324 | "version": "0.18.20", 325 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", 326 | "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", 327 | "cpu": [ 328 | "s390x" 329 | ], 330 | "dev": true, 331 | "optional": true, 332 | "os": [ 333 | "linux" 334 | ], 335 | "engines": { 336 | "node": ">=12" 337 | } 338 | }, 339 | "node_modules/@esbuild/linux-x64": { 340 | "version": "0.18.20", 341 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", 342 | "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", 343 | "cpu": [ 344 | "x64" 345 | ], 346 | "dev": true, 347 | "optional": true, 348 | "os": [ 349 | "linux" 350 | ], 351 | "engines": { 352 | "node": ">=12" 353 | } 354 | }, 355 | "node_modules/@esbuild/netbsd-x64": { 356 | "version": "0.18.20", 357 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", 358 | "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", 359 | "cpu": [ 360 | "x64" 361 | ], 362 | "dev": true, 363 | "optional": true, 364 | "os": [ 365 | "netbsd" 366 | ], 367 | "engines": { 368 | "node": ">=12" 369 | } 370 | }, 371 | "node_modules/@esbuild/openbsd-x64": { 372 | "version": "0.18.20", 373 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", 374 | "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", 375 | "cpu": [ 376 | "x64" 377 | ], 378 | "dev": true, 379 | "optional": true, 380 | "os": [ 381 | "openbsd" 382 | ], 383 | "engines": { 384 | "node": ">=12" 385 | } 386 | }, 387 | "node_modules/@esbuild/sunos-x64": { 388 | "version": "0.18.20", 389 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", 390 | "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", 391 | "cpu": [ 392 | "x64" 393 | ], 394 | "dev": true, 395 | "optional": true, 396 | "os": [ 397 | "sunos" 398 | ], 399 | "engines": { 400 | "node": ">=12" 401 | } 402 | }, 403 | "node_modules/@esbuild/win32-arm64": { 404 | "version": "0.18.20", 405 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", 406 | "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", 407 | "cpu": [ 408 | "arm64" 409 | ], 410 | "dev": true, 411 | "optional": true, 412 | "os": [ 413 | "win32" 414 | ], 415 | "engines": { 416 | "node": ">=12" 417 | } 418 | }, 419 | "node_modules/@esbuild/win32-ia32": { 420 | "version": "0.18.20", 421 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", 422 | "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", 423 | "cpu": [ 424 | "ia32" 425 | ], 426 | "dev": true, 427 | "optional": true, 428 | "os": [ 429 | "win32" 430 | ], 431 | "engines": { 432 | "node": ">=12" 433 | } 434 | }, 435 | "node_modules/@esbuild/win32-x64": { 436 | "version": "0.18.20", 437 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", 438 | "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", 439 | "cpu": [ 440 | "x64" 441 | ], 442 | "dev": true, 443 | "optional": true, 444 | "os": [ 445 | "win32" 446 | ], 447 | "engines": { 448 | "node": ">=12" 449 | } 450 | }, 451 | "node_modules/@github/webauthn-json": { 452 | "version": "2.1.1", 453 | "resolved": "https://registry.npmjs.org/@github/webauthn-json/-/webauthn-json-2.1.1.tgz", 454 | "integrity": "sha512-XrftRn4z75SnaJOmZQbt7Mk+IIjqVHw+glDGOxuHwXkZBZh/MBoRS7MHjSZMDaLhT4RjN2VqiEU7EOYleuJWSQ==", 455 | "bin": { 456 | "webauthn-json": "dist/bin/main.js" 457 | } 458 | }, 459 | "node_modules/@jridgewell/sourcemap-codec": { 460 | "version": "1.4.15", 461 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 462 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" 463 | }, 464 | "node_modules/@vitejs/plugin-vue": { 465 | "version": "4.3.3", 466 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.3.3.tgz", 467 | "integrity": "sha512-ssxyhIAZqB0TrpUg6R0cBpCuMk9jTIlO1GNSKKQD6S8VjnXi6JXKfUXjSsxey9IwQiaRGsO1WnW9Rkl1L6AJVw==", 468 | "dev": true, 469 | "engines": { 470 | "node": "^14.18.0 || >=16.0.0" 471 | }, 472 | "peerDependencies": { 473 | "vite": "^4.0.0", 474 | "vue": "^3.2.25" 475 | } 476 | }, 477 | "node_modules/@vue/compiler-core": { 478 | "version": "3.4.25", 479 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.25.tgz", 480 | "integrity": "sha512-Y2pLLopaElgWnMNolgG8w3C5nNUVev80L7hdQ5iIKPtMJvhVpG0zhnBG/g3UajJmZdvW0fktyZTotEHD1Srhbg==", 481 | "dependencies": { 482 | "@babel/parser": "^7.24.4", 483 | "@vue/shared": "3.4.25", 484 | "entities": "^4.5.0", 485 | "estree-walker": "^2.0.2", 486 | "source-map-js": "^1.2.0" 487 | } 488 | }, 489 | "node_modules/@vue/compiler-dom": { 490 | "version": "3.4.25", 491 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.25.tgz", 492 | "integrity": "sha512-Ugz5DusW57+HjllAugLci19NsDK+VyjGvmbB2TXaTcSlQxwL++2PETHx/+Qv6qFwNLzSt7HKepPe4DcTE3pBWg==", 493 | "dependencies": { 494 | "@vue/compiler-core": "3.4.25", 495 | "@vue/shared": "3.4.25" 496 | } 497 | }, 498 | "node_modules/@vue/compiler-sfc": { 499 | "version": "3.4.25", 500 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.25.tgz", 501 | "integrity": "sha512-m7rryuqzIoQpOBZ18wKyq05IwL6qEpZxFZfRxlNYuIPDqywrXQxgUwLXIvoU72gs6cRdY6wHD0WVZIFE4OEaAQ==", 502 | "dependencies": { 503 | "@babel/parser": "^7.24.4", 504 | "@vue/compiler-core": "3.4.25", 505 | "@vue/compiler-dom": "3.4.25", 506 | "@vue/compiler-ssr": "3.4.25", 507 | "@vue/shared": "3.4.25", 508 | "estree-walker": "^2.0.2", 509 | "magic-string": "^0.30.10", 510 | "postcss": "^8.4.38", 511 | "source-map-js": "^1.2.0" 512 | } 513 | }, 514 | "node_modules/@vue/compiler-ssr": { 515 | "version": "3.4.25", 516 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.25.tgz", 517 | "integrity": "sha512-H2ohvM/Pf6LelGxDBnfbbXFPyM4NE3hrw0e/EpwuSiYu8c819wx+SVGdJ65p/sFrYDd6OnSDxN1MB2mN07hRSQ==", 518 | "dependencies": { 519 | "@vue/compiler-dom": "3.4.25", 520 | "@vue/shared": "3.4.25" 521 | } 522 | }, 523 | "node_modules/@vue/devtools-api": { 524 | "version": "6.6.1", 525 | "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.1.tgz", 526 | "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==" 527 | }, 528 | "node_modules/@vue/reactivity": { 529 | "version": "3.4.25", 530 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.25.tgz", 531 | "integrity": "sha512-mKbEtKr1iTxZkAG3vm3BtKHAOhuI4zzsVcN0epDldU/THsrvfXRKzq+lZnjczZGnTdh3ojd86/WrP+u9M51pWQ==", 532 | "dependencies": { 533 | "@vue/shared": "3.4.25" 534 | } 535 | }, 536 | "node_modules/@vue/runtime-core": { 537 | "version": "3.4.25", 538 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.25.tgz", 539 | "integrity": "sha512-3qhsTqbEh8BMH3pXf009epCI5E7bKu28fJLi9O6W+ZGt/6xgSfMuGPqa5HRbUxLoehTNp5uWvzCr60KuiRIL0Q==", 540 | "dependencies": { 541 | "@vue/reactivity": "3.4.25", 542 | "@vue/shared": "3.4.25" 543 | } 544 | }, 545 | "node_modules/@vue/runtime-dom": { 546 | "version": "3.4.25", 547 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.25.tgz", 548 | "integrity": "sha512-ode0sj77kuwXwSc+2Yhk8JMHZh1sZp9F/51wdBiz3KGaWltbKtdihlJFhQG4H6AY+A06zzeMLkq6qu8uDSsaoA==", 549 | "dependencies": { 550 | "@vue/runtime-core": "3.4.25", 551 | "@vue/shared": "3.4.25", 552 | "csstype": "^3.1.3" 553 | } 554 | }, 555 | "node_modules/@vue/server-renderer": { 556 | "version": "3.4.25", 557 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.25.tgz", 558 | "integrity": "sha512-8VTwq0Zcu3K4dWV0jOwIVINESE/gha3ifYCOKEhxOj6MEl5K5y8J8clQncTcDhKF+9U765nRw4UdUEXvrGhyVQ==", 559 | "dependencies": { 560 | "@vue/compiler-ssr": "3.4.25", 561 | "@vue/shared": "3.4.25" 562 | }, 563 | "peerDependencies": { 564 | "vue": "3.4.25" 565 | } 566 | }, 567 | "node_modules/@vue/shared": { 568 | "version": "3.4.25", 569 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.25.tgz", 570 | "integrity": "sha512-k0yappJ77g2+KNrIaF0FFnzwLvUBLUYr8VOwz+/6vLsmItFp51AcxLL7Ey3iPd7BIRyWPOcqUjMnm7OkahXllA==" 571 | }, 572 | "node_modules/asynckit": { 573 | "version": "0.4.0", 574 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 575 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 576 | }, 577 | "node_modules/axios": { 578 | "version": "1.6.8", 579 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", 580 | "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", 581 | "dependencies": { 582 | "follow-redirects": "^1.15.6", 583 | "form-data": "^4.0.0", 584 | "proxy-from-env": "^1.1.0" 585 | } 586 | }, 587 | "node_modules/classnames": { 588 | "version": "2.5.1", 589 | "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", 590 | "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" 591 | }, 592 | "node_modules/combined-stream": { 593 | "version": "1.0.8", 594 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 595 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 596 | "dependencies": { 597 | "delayed-stream": "~1.0.0" 598 | }, 599 | "engines": { 600 | "node": ">= 0.8" 601 | } 602 | }, 603 | "node_modules/country-flag-icons": { 604 | "version": "1.5.11", 605 | "resolved": "https://registry.npmjs.org/country-flag-icons/-/country-flag-icons-1.5.11.tgz", 606 | "integrity": "sha512-B+mvFywunkRJs270k7kCBjhogvIA0uNn6GAXv6m2cPn3rrwqZzZVr2gBWcz+Cz7OGVWlcbERlYRIX0S6OGr8Bw==" 607 | }, 608 | "node_modules/csstype": { 609 | "version": "3.1.3", 610 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 611 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" 612 | }, 613 | "node_modules/delayed-stream": { 614 | "version": "1.0.0", 615 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 616 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 617 | "engines": { 618 | "node": ">=0.4.0" 619 | } 620 | }, 621 | "node_modules/entities": { 622 | "version": "4.5.0", 623 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 624 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 625 | "engines": { 626 | "node": ">=0.12" 627 | }, 628 | "funding": { 629 | "url": "https://github.com/fb55/entities?sponsor=1" 630 | } 631 | }, 632 | "node_modules/esbuild": { 633 | "version": "0.18.20", 634 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", 635 | "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", 636 | "dev": true, 637 | "hasInstallScript": true, 638 | "bin": { 639 | "esbuild": "bin/esbuild" 640 | }, 641 | "engines": { 642 | "node": ">=12" 643 | }, 644 | "optionalDependencies": { 645 | "@esbuild/android-arm": "0.18.20", 646 | "@esbuild/android-arm64": "0.18.20", 647 | "@esbuild/android-x64": "0.18.20", 648 | "@esbuild/darwin-arm64": "0.18.20", 649 | "@esbuild/darwin-x64": "0.18.20", 650 | "@esbuild/freebsd-arm64": "0.18.20", 651 | "@esbuild/freebsd-x64": "0.18.20", 652 | "@esbuild/linux-arm": "0.18.20", 653 | "@esbuild/linux-arm64": "0.18.20", 654 | "@esbuild/linux-ia32": "0.18.20", 655 | "@esbuild/linux-loong64": "0.18.20", 656 | "@esbuild/linux-mips64el": "0.18.20", 657 | "@esbuild/linux-ppc64": "0.18.20", 658 | "@esbuild/linux-riscv64": "0.18.20", 659 | "@esbuild/linux-s390x": "0.18.20", 660 | "@esbuild/linux-x64": "0.18.20", 661 | "@esbuild/netbsd-x64": "0.18.20", 662 | "@esbuild/openbsd-x64": "0.18.20", 663 | "@esbuild/sunos-x64": "0.18.20", 664 | "@esbuild/win32-arm64": "0.18.20", 665 | "@esbuild/win32-ia32": "0.18.20", 666 | "@esbuild/win32-x64": "0.18.20" 667 | } 668 | }, 669 | "node_modules/estree-walker": { 670 | "version": "2.0.2", 671 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 672 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" 673 | }, 674 | "node_modules/follow-redirects": { 675 | "version": "1.15.6", 676 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", 677 | "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", 678 | "funding": [ 679 | { 680 | "type": "individual", 681 | "url": "https://github.com/sponsors/RubenVerborgh" 682 | } 683 | ], 684 | "engines": { 685 | "node": ">=4.0" 686 | }, 687 | "peerDependenciesMeta": { 688 | "debug": { 689 | "optional": true 690 | } 691 | } 692 | }, 693 | "node_modules/form-data": { 694 | "version": "4.0.0", 695 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 696 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 697 | "dependencies": { 698 | "asynckit": "^0.4.0", 699 | "combined-stream": "^1.0.8", 700 | "mime-types": "^2.1.12" 701 | }, 702 | "engines": { 703 | "node": ">= 6" 704 | } 705 | }, 706 | "node_modules/fsevents": { 707 | "version": "2.3.3", 708 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 709 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 710 | "dev": true, 711 | "hasInstallScript": true, 712 | "optional": true, 713 | "os": [ 714 | "darwin" 715 | ], 716 | "engines": { 717 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 718 | } 719 | }, 720 | "node_modules/html-parse-stringify": { 721 | "version": "3.0.1", 722 | "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", 723 | "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", 724 | "dependencies": { 725 | "void-elements": "3.1.0" 726 | } 727 | }, 728 | "node_modules/i18next": { 729 | "version": "23.5.1", 730 | "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.5.1.tgz", 731 | "integrity": "sha512-JelYzcaCoFDaa+Ysbfz2JsGAKkrHiMG6S61+HLBUEIPaF40WMwW9hCPymlQGrP+wWawKxKPuSuD71WZscCsWHg==", 732 | "funding": [ 733 | { 734 | "type": "individual", 735 | "url": "https://locize.com" 736 | }, 737 | { 738 | "type": "individual", 739 | "url": "https://locize.com/i18next.html" 740 | }, 741 | { 742 | "type": "individual", 743 | "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" 744 | } 745 | ], 746 | "dependencies": { 747 | "@babel/runtime": "^7.22.5" 748 | } 749 | }, 750 | "node_modules/i18next-browser-languagedetector": { 751 | "version": "7.1.0", 752 | "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.1.0.tgz", 753 | "integrity": "sha512-cr2k7u1XJJ4HTOjM9GyOMtbOA47RtUoWRAtt52z43r3AoMs2StYKyjS3URPhzHaf+mn10hY9dZWamga5WPQjhA==", 754 | "dependencies": { 755 | "@babel/runtime": "^7.19.4" 756 | } 757 | }, 758 | "node_modules/input-format": { 759 | "version": "0.3.10", 760 | "resolved": "https://registry.npmjs.org/input-format/-/input-format-0.3.10.tgz", 761 | "integrity": "sha512-5cFv/kOZD7Ch0viprVkuYPDkAU7HBZYBx8QrIpQ6yXUWbAQ0+RQ8IIojDJOf/RO6FDJLL099HDSK2KoVZ2zevg==", 762 | "dependencies": { 763 | "prop-types": "^15.8.1" 764 | } 765 | }, 766 | "node_modules/js-tokens": { 767 | "version": "4.0.0", 768 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 769 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 770 | }, 771 | "node_modules/libphonenumber-js": { 772 | "version": "1.10.61", 773 | "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.61.tgz", 774 | "integrity": "sha512-TsQsyzDttDvvzWNkbp/i0fVbzTGJIG0mUu/uNalIaRQEYeJxVQ/FPg+EJgSqfSXezREjM0V3RZ8cLVsKYhhw0Q==" 775 | }, 776 | "node_modules/loglevel": { 777 | "version": "1.9.1", 778 | "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz", 779 | "integrity": "sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==", 780 | "engines": { 781 | "node": ">= 0.6.0" 782 | }, 783 | "funding": { 784 | "type": "tidelift", 785 | "url": "https://tidelift.com/funding/github/npm/loglevel" 786 | } 787 | }, 788 | "node_modules/loose-envify": { 789 | "version": "1.4.0", 790 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 791 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 792 | "dependencies": { 793 | "js-tokens": "^3.0.0 || ^4.0.0" 794 | }, 795 | "bin": { 796 | "loose-envify": "cli.js" 797 | } 798 | }, 799 | "node_modules/magic-string": { 800 | "version": "0.30.10", 801 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", 802 | "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", 803 | "dependencies": { 804 | "@jridgewell/sourcemap-codec": "^1.4.15" 805 | } 806 | }, 807 | "node_modules/mime-db": { 808 | "version": "1.52.0", 809 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 810 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 811 | "engines": { 812 | "node": ">= 0.6" 813 | } 814 | }, 815 | "node_modules/mime-types": { 816 | "version": "2.1.35", 817 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 818 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 819 | "dependencies": { 820 | "mime-db": "1.52.0" 821 | }, 822 | "engines": { 823 | "node": ">= 0.6" 824 | } 825 | }, 826 | "node_modules/nanoid": { 827 | "version": "3.3.7", 828 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 829 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 830 | "funding": [ 831 | { 832 | "type": "github", 833 | "url": "https://github.com/sponsors/ai" 834 | } 835 | ], 836 | "bin": { 837 | "nanoid": "bin/nanoid.cjs" 838 | }, 839 | "engines": { 840 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 841 | } 842 | }, 843 | "node_modules/object-assign": { 844 | "version": "4.1.1", 845 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 846 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 847 | "engines": { 848 | "node": ">=0.10.0" 849 | } 850 | }, 851 | "node_modules/picocolors": { 852 | "version": "1.0.0", 853 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 854 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 855 | }, 856 | "node_modules/postcss": { 857 | "version": "8.4.38", 858 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", 859 | "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", 860 | "funding": [ 861 | { 862 | "type": "opencollective", 863 | "url": "https://opencollective.com/postcss/" 864 | }, 865 | { 866 | "type": "tidelift", 867 | "url": "https://tidelift.com/funding/github/npm/postcss" 868 | }, 869 | { 870 | "type": "github", 871 | "url": "https://github.com/sponsors/ai" 872 | } 873 | ], 874 | "dependencies": { 875 | "nanoid": "^3.3.7", 876 | "picocolors": "^1.0.0", 877 | "source-map-js": "^1.2.0" 878 | }, 879 | "engines": { 880 | "node": "^10 || ^12 || >=14" 881 | } 882 | }, 883 | "node_modules/prettier": { 884 | "version": "3.2.5", 885 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", 886 | "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", 887 | "bin": { 888 | "prettier": "bin/prettier.cjs" 889 | }, 890 | "engines": { 891 | "node": ">=14" 892 | }, 893 | "funding": { 894 | "url": "https://github.com/prettier/prettier?sponsor=1" 895 | } 896 | }, 897 | "node_modules/prop-types": { 898 | "version": "15.8.1", 899 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", 900 | "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", 901 | "dependencies": { 902 | "loose-envify": "^1.4.0", 903 | "object-assign": "^4.1.1", 904 | "react-is": "^16.13.1" 905 | } 906 | }, 907 | "node_modules/proxy-from-env": { 908 | "version": "1.1.0", 909 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 910 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 911 | }, 912 | "node_modules/react": { 913 | "version": "18.2.0", 914 | "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", 915 | "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", 916 | "dependencies": { 917 | "loose-envify": "^1.1.0" 918 | }, 919 | "engines": { 920 | "node": ">=0.10.0" 921 | } 922 | }, 923 | "node_modules/react-dom": { 924 | "version": "18.2.0", 925 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", 926 | "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", 927 | "dependencies": { 928 | "loose-envify": "^1.1.0", 929 | "scheduler": "^0.23.0" 930 | }, 931 | "peerDependencies": { 932 | "react": "^18.2.0" 933 | } 934 | }, 935 | "node_modules/react-i18next": { 936 | "version": "13.2.2", 937 | "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-13.2.2.tgz", 938 | "integrity": "sha512-+nFUkbRByFwnrfDcYqvzBuaeZb+nACHx+fAWN/pZMddWOCJH5hoc21+Sa/N/Lqi6ne6/9wC/qRGOoQhJa6IkEQ==", 939 | "dependencies": { 940 | "@babel/runtime": "^7.22.5", 941 | "html-parse-stringify": "^3.0.1" 942 | }, 943 | "peerDependencies": { 944 | "i18next": ">= 23.2.3", 945 | "react": ">= 16.8.0" 946 | }, 947 | "peerDependenciesMeta": { 948 | "react-dom": { 949 | "optional": true 950 | }, 951 | "react-native": { 952 | "optional": true 953 | } 954 | } 955 | }, 956 | "node_modules/react-is": { 957 | "version": "16.13.1", 958 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 959 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" 960 | }, 961 | "node_modules/react-phone-number-input": { 962 | "version": "3.4.0", 963 | "resolved": "https://registry.npmjs.org/react-phone-number-input/-/react-phone-number-input-3.4.0.tgz", 964 | "integrity": "sha512-anL8OAqlSnOXd6O+lidkprOO5+OpgW+ODrbfyLc6u8lOX8ghT0nO6ZOPrGjotpZND4cr0xxH+vu3dgbdUB2lBA==", 965 | "dependencies": { 966 | "classnames": "^2.5.1", 967 | "country-flag-icons": "^1.5.11", 968 | "input-format": "^0.3.10", 969 | "libphonenumber-js": "^1.10.61", 970 | "prop-types": "^15.8.1" 971 | }, 972 | "peerDependencies": { 973 | "react": ">=16.8", 974 | "react-dom": ">=16.8" 975 | } 976 | }, 977 | "node_modules/regenerator-runtime": { 978 | "version": "0.14.1", 979 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", 980 | "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" 981 | }, 982 | "node_modules/rollup": { 983 | "version": "3.28.1", 984 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.1.tgz", 985 | "integrity": "sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==", 986 | "dev": true, 987 | "bin": { 988 | "rollup": "dist/bin/rollup" 989 | }, 990 | "engines": { 991 | "node": ">=14.18.0", 992 | "npm": ">=8.0.0" 993 | }, 994 | "optionalDependencies": { 995 | "fsevents": "~2.3.2" 996 | } 997 | }, 998 | "node_modules/rxjs": { 999 | "version": "7.8.1", 1000 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", 1001 | "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", 1002 | "dependencies": { 1003 | "tslib": "^2.1.0" 1004 | } 1005 | }, 1006 | "node_modules/scheduler": { 1007 | "version": "0.23.0", 1008 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", 1009 | "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", 1010 | "dependencies": { 1011 | "loose-envify": "^1.1.0" 1012 | } 1013 | }, 1014 | "node_modules/source-map-js": { 1015 | "version": "1.2.0", 1016 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", 1017 | "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", 1018 | "engines": { 1019 | "node": ">=0.10.0" 1020 | } 1021 | }, 1022 | "node_modules/ts-results": { 1023 | "version": "3.3.0", 1024 | "resolved": "https://registry.npmjs.org/ts-results/-/ts-results-3.3.0.tgz", 1025 | "integrity": "sha512-FWqxGX2NHp5oCyaMd96o2y2uMQmSu8Dey6kvyuFdRJ2AzfmWo3kWa4UsPlCGlfQ/qu03m09ZZtppMoY8EMHuiA==" 1026 | }, 1027 | "node_modules/tslib": { 1028 | "version": "2.6.2", 1029 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", 1030 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" 1031 | }, 1032 | "node_modules/ua-parser-js": { 1033 | "version": "1.0.37", 1034 | "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", 1035 | "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==", 1036 | "funding": [ 1037 | { 1038 | "type": "opencollective", 1039 | "url": "https://opencollective.com/ua-parser-js" 1040 | }, 1041 | { 1042 | "type": "paypal", 1043 | "url": "https://paypal.me/faisalman" 1044 | }, 1045 | { 1046 | "type": "github", 1047 | "url": "https://github.com/sponsors/faisalman" 1048 | } 1049 | ], 1050 | "engines": { 1051 | "node": "*" 1052 | } 1053 | }, 1054 | "node_modules/vite": { 1055 | "version": "4.4.9", 1056 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", 1057 | "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", 1058 | "dev": true, 1059 | "dependencies": { 1060 | "esbuild": "^0.18.10", 1061 | "postcss": "^8.4.27", 1062 | "rollup": "^3.27.1" 1063 | }, 1064 | "bin": { 1065 | "vite": "bin/vite.js" 1066 | }, 1067 | "engines": { 1068 | "node": "^14.18.0 || >=16.0.0" 1069 | }, 1070 | "funding": { 1071 | "url": "https://github.com/vitejs/vite?sponsor=1" 1072 | }, 1073 | "optionalDependencies": { 1074 | "fsevents": "~2.3.2" 1075 | }, 1076 | "peerDependencies": { 1077 | "@types/node": ">= 14", 1078 | "less": "*", 1079 | "lightningcss": "^1.21.0", 1080 | "sass": "*", 1081 | "stylus": "*", 1082 | "sugarss": "*", 1083 | "terser": "^5.4.0" 1084 | }, 1085 | "peerDependenciesMeta": { 1086 | "@types/node": { 1087 | "optional": true 1088 | }, 1089 | "less": { 1090 | "optional": true 1091 | }, 1092 | "lightningcss": { 1093 | "optional": true 1094 | }, 1095 | "sass": { 1096 | "optional": true 1097 | }, 1098 | "stylus": { 1099 | "optional": true 1100 | }, 1101 | "sugarss": { 1102 | "optional": true 1103 | }, 1104 | "terser": { 1105 | "optional": true 1106 | } 1107 | } 1108 | }, 1109 | "node_modules/void-elements": { 1110 | "version": "3.1.0", 1111 | "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", 1112 | "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", 1113 | "engines": { 1114 | "node": ">=0.10.0" 1115 | } 1116 | }, 1117 | "node_modules/vue": { 1118 | "version": "3.4.25", 1119 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.25.tgz", 1120 | "integrity": "sha512-HWyDqoBHMgav/OKiYA2ZQg+kjfMgLt/T0vg4cbIF7JbXAjDexRf5JRg+PWAfrAkSmTd2I8aPSXtooBFWHB98cg==", 1121 | "dependencies": { 1122 | "@vue/compiler-dom": "3.4.25", 1123 | "@vue/compiler-sfc": "3.4.25", 1124 | "@vue/runtime-dom": "3.4.25", 1125 | "@vue/server-renderer": "3.4.25", 1126 | "@vue/shared": "3.4.25" 1127 | }, 1128 | "peerDependencies": { 1129 | "typescript": "*" 1130 | }, 1131 | "peerDependenciesMeta": { 1132 | "typescript": { 1133 | "optional": true 1134 | } 1135 | } 1136 | }, 1137 | "node_modules/vue-router": { 1138 | "version": "4.3.2", 1139 | "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.2.tgz", 1140 | "integrity": "sha512-hKQJ1vDAZ5LVkKEnHhmm1f9pMiWIBNGF5AwU67PdH7TyXCj/a4hTccuUuYCAMgJK6rO/NVYtQIEN3yL8CECa7Q==", 1141 | "dependencies": { 1142 | "@vue/devtools-api": "^6.5.1" 1143 | }, 1144 | "funding": { 1145 | "url": "https://github.com/sponsors/posva" 1146 | }, 1147 | "peerDependencies": { 1148 | "vue": "^3.2.0" 1149 | } 1150 | } 1151 | } 1152 | } 1153 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "passkeys-demo-vuejs", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "vite", 7 | "build": "vite build", 8 | "preview": "vite preview" 9 | }, 10 | "dependencies": { 11 | "@corbado/web-js": "^2.6.0-alpha.0", 12 | "vue": "^3.4.25", 13 | "vue-router": "^4.3.2" 14 | }, 15 | "devDependencies": { 16 | "@vitejs/plugin-vue": "^4.3.1", 17 | "vite": "^4.4.9", 18 | "prettier": "^3.2.5" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corbado/example-passkeys-vuejs/5803ab1190f08b886c9b452b0d11f840a3c6bda5/public/favicon.ico -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 21 | -------------------------------------------------------------------------------- /src/assets/base.css: -------------------------------------------------------------------------------- 1 | /* color palette from */ 2 | :root { 3 | --vt-c-white: #ffffff; 4 | --vt-c-white-soft: #f8f8f8; 5 | --vt-c-white-mute: #f2f2f2; 6 | 7 | --vt-c-black: #181818; 8 | --vt-c-black-soft: #222222; 9 | --vt-c-black-mute: #282828; 10 | 11 | --vt-c-indigo: #2c3e50; 12 | 13 | --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); 14 | --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); 15 | --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); 16 | --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); 17 | 18 | --vt-c-text-light-1: var(--vt-c-indigo); 19 | --vt-c-text-light-2: rgba(60, 60, 60, 0.66); 20 | --vt-c-text-dark-1: var(--vt-c-white); 21 | --vt-c-text-dark-2: rgba(235, 235, 235, 0.64); 22 | } 23 | 24 | /* semantic color variables for this project */ 25 | :root { 26 | --color-background: var(--vt-c-white); 27 | --color-background-soft: var(--vt-c-white-soft); 28 | --color-background-mute: var(--vt-c-white-mute); 29 | 30 | --color-border: var(--vt-c-divider-light-2); 31 | --color-border-hover: var(--vt-c-divider-light-1); 32 | 33 | --color-heading: var(--vt-c-text-light-1); 34 | --color-text: var(--vt-c-text-light-1); 35 | 36 | --section-gap: 160px; 37 | } 38 | 39 | @media (prefers-color-scheme: dark) { 40 | :root { 41 | --color-background: var(--vt-c-black); 42 | --color-background-soft: var(--vt-c-black-soft); 43 | --color-background-mute: var(--vt-c-black-mute); 44 | 45 | --color-border: var(--vt-c-divider-dark-2); 46 | --color-border-hover: var(--vt-c-divider-dark-1); 47 | 48 | --color-heading: var(--vt-c-text-dark-1); 49 | --color-text: var(--vt-c-text-dark-2); 50 | } 51 | } 52 | 53 | *, 54 | *::before, 55 | *::after { 56 | box-sizing: border-box; 57 | margin: 0; 58 | font-weight: normal; 59 | } 60 | 61 | body { 62 | min-height: 100vh; 63 | color: var(--color-text); 64 | background: var(--color-background); 65 | transition: color 0.5s, background-color 0.5s; 66 | line-height: 1.6; 67 | font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, 68 | Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; 69 | font-size: 15px; 70 | text-rendering: optimizeLegibility; 71 | -webkit-font-smoothing: antialiased; 72 | -moz-osx-font-smoothing: grayscale; 73 | } 74 | -------------------------------------------------------------------------------- /src/assets/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/assets/main.css: -------------------------------------------------------------------------------- 1 | @import './base.css'; 2 | 3 | #app { 4 | max-width: 1280px; 5 | margin: 0 auto; 6 | padding: 2rem; 7 | 8 | font-weight: normal; 9 | } 10 | 11 | a, 12 | .green { 13 | text-decoration: none; 14 | color: hsla(160, 100%, 37%, 1); 15 | transition: 0.4s; 16 | } 17 | 18 | @media (hover: hover) { 19 | a:hover { 20 | background-color: hsla(160, 100%, 37%, 0.2); 21 | } 22 | } 23 | 24 | body { 25 | width: 100%; 26 | height: 100%; 27 | display: grid; 28 | place-items: center; 29 | } -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import './assets/main.css' 2 | 3 | import { createApp } from 'vue' 4 | import App from './App.vue' 5 | import router from './router' 6 | 7 | const app = createApp(App) 8 | 9 | app.use(router) 10 | 11 | app.mount('#app') 12 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import { createRouter, createWebHistory } from 'vue-router' 2 | import HomeView from '../views/HomeView.vue' 3 | import ProfileView from "@/views/ProfileView.vue"; 4 | 5 | const router = createRouter({ 6 | history: createWebHistory(import.meta.env.BASE_URL), 7 | routes: [ 8 | { 9 | path: '/', 10 | name: 'home', 11 | component: HomeView 12 | }, 13 | { 14 | path: '/profile', 15 | name: 'profile', 16 | component: ProfileView 17 | } 18 | ] 19 | }) 20 | 21 | export default router 22 | -------------------------------------------------------------------------------- /src/views/HomeView.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 25 | -------------------------------------------------------------------------------- /src/views/ProfileView.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 45 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { fileURLToPath, URL } from 'node:url' 2 | 3 | import { defineConfig } from 'vite' 4 | import vue from '@vitejs/plugin-vue' 5 | 6 | // https://vitejs.dev/config/ 7 | export default defineConfig({ 8 | plugins: [ 9 | vue({ 10 | template: { 11 | compilerOptions: { 12 | isCustomElement: (tag) => ['corbado-auth'].includes(tag), 13 | } 14 | } 15 | }), 16 | ], 17 | resolve: { 18 | alias: { 19 | '@': fileURLToPath(new URL('./src', import.meta.url)) 20 | } 21 | } 22 | }) 23 | --------------------------------------------------------------------------------