From 4a7a0cb26a510a213495fcecc425b5088810a3ab Mon Sep 17 00:00:00 2001 From: Eric Lay Date: Wed, 11 Mar 2026 08:43:19 -0500 Subject: [PATCH] Add src/components/onboarding/PasswordRequirements.jsx --- .../onboarding/PasswordRequirements.jsx | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/components/onboarding/PasswordRequirements.jsx diff --git a/src/components/onboarding/PasswordRequirements.jsx b/src/components/onboarding/PasswordRequirements.jsx new file mode 100644 index 0000000..872ec1e --- /dev/null +++ b/src/components/onboarding/PasswordRequirements.jsx @@ -0,0 +1,51 @@ +import React from "react"; +import { Check, X } from "lucide-react"; +import { motion, AnimatePresence } from "framer-motion"; + +const requirements = [ + { label: "At least 8 characters long", test: (p) => p.length >= 8 }, + { label: "Contains an uppercase letter", test: (p) => /[A-Z]/.test(p) }, + { label: "Contains a lowercase letter", test: (p) => /[a-z]/.test(p) }, + { label: "Contains a number", test: (p) => /[0-9]/.test(p) }, + { label: "Contains a special character (!@#$%^&*)", test: (p) => /[!@#$%^&*(),.?":{}|<>]/.test(p) }, +]; + +export function validatePassword(password) { + return requirements.every((req) => req.test(password)); +} + +export default function PasswordRequirements({ password, visible }) { + return ( + + {visible && ( + +
+

+ Password Requirements +

+ {requirements.map((req, i) => { + const met = req.test(password); + return ( +
+
+ {met ? ( + + ) : ( + + )} +
+