├── .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 |
17 |
18 |
19 |
20 |
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 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/src/views/ProfileView.vue:
--------------------------------------------------------------------------------
1 |
23 |
24 |
25 |
26 |
27 |
Profile Page
28 |
29 | User-ID: {{ user.sub }}
30 |
31 | Name: {{ user.name }}
32 |
33 |
34 |
35 |
36 |
37 |
38 |
You're not logged in.
39 |
40 | Please go back to home to log in.
41 |
42 |
43 |
44 |
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 |
--------------------------------------------------------------------------------