diff --git a/package.json b/package.json index 14defe5..e569526 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,8 @@ "markdown-it": "^14.1.1", "svelte-dnd-action": "^0.9.69", "tiptap-markdown": "^0.9.0", - "uuid": "^11.1.0" + "uuid": "^11.1.0", + "zxcvbn": "^4.4.2" }, "devDependencies": { "@playwright/test": "^1.58.2", @@ -58,6 +59,7 @@ "@types/better-sqlite3": "^7.6.13", "@types/markdown-it": "^14.1.2", "@types/uuid": "^10.0.0", + "@types/zxcvbn": "^4.4.5", "@vite-pwa/sveltekit": "^1.1.0", "drizzle-kit": "^0.31.9", "svelte": "^5.53.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 80cb3d4..51e1d77 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -70,6 +70,9 @@ importers: uuid: specifier: ^11.1.0 version: 11.1.0 + zxcvbn: + specifier: ^4.4.2 + version: 4.4.2 devDependencies: '@playwright/test': specifier: ^1.58.2 @@ -3248,6 +3251,9 @@ packages: zimmerframe@1.1.4: resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} + zxcvbn@4.4.2: + resolution: {integrity: sha512-Bq0B+ixT/DMyG8kgX2xWcI5jUvCwqrMxSFam7m0lAf78nf04hv6lNCsyLYdyYTrCVMqNDY/206K7eExYCeSyUQ==} + snapshots: '@apideck/better-ajv-errors@0.3.6(ajv@8.18.0)': @@ -6494,3 +6500,5 @@ snapshots: yaml@2.8.2: {} zimmerframe@1.1.4: {} + + zxcvbn@4.4.2: {} diff --git a/src/lib/components/PasswordStrengthMeter.svelte b/src/lib/components/PasswordStrengthMeter.svelte new file mode 100644 index 0000000..d4863bd --- /dev/null +++ b/src/lib/components/PasswordStrengthMeter.svelte @@ -0,0 +1,36 @@ + + +{#if result} +
+
+ {#each { length: 4 } as _, i} +
+ {/each} +
+

+ {labels[result.score]} + {#if result.feedback.warning} + — {result.feedback.warning} + {/if} +

+
+{/if} diff --git a/src/routes/settings/+page.svelte b/src/routes/settings/+page.svelte index 5aa3221..589b992 100644 --- a/src/routes/settings/+page.svelte +++ b/src/routes/settings/+page.svelte @@ -1,5 +1,6 @@