UNPKG

@frank-auth/react

Version:

Flexible and customizable React UI components for Frank Authentication

1 lines 46.8 kB
{"version":3,"file":"password-field.cjs","sources":["../../../../src/components/forms/password-field.tsx"],"sourcesContent":["/**\n * @frank-auth/react - Password Field Component\n *\n * Advanced password input with strength validation, visibility toggle, and\n * organization-specific password requirements. Supports MFA and security features.\n */\n\n\"use client\";\n\nimport {\n type SignUpFormProps,\n generatePasswordSuggestions,\n getPasswordStrength,\n} from \"@/components\";\nimport type { FieldProps } from \"@/components/forms/shared\";\nimport { Button, Input } from \"@/components/ui\";\nimport { Chip, Progress } from \"@/components/ui\";\nimport { useConfig } from \"@/hooks\";\nimport { useTheme } from \"@/theme/context\";\nimport type { StyledProps } from \"@/theme/styled\";\nimport styled from \"@emotion/styled\";\nimport {\n CheckIcon,\n ExclamationTriangleIcon,\n EyeIcon,\n EyeSlashIcon,\n} from \"@heroicons/react/24/outline\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport React from \"react\";\nimport { FieldError } from \"./field-error\";\nimport { useFormField } from \"./form-wrapper\";\n\n// ============================================================================\n// Password Field Interface\n// ============================================================================\n\nexport interface PasswordFieldProps extends FieldProps<string> {\n /**\n * Whether field is required\n */\n required?: boolean;\n\n /**\n * Whether field is disabled\n */\n disabled?: boolean;\n\n /**\n * Whether to show password strength indicator\n */\n showStrength?: boolean;\n\n /**\n * Whether to show password requirements\n */\n showRequirements?: boolean;\n showSuggestions?: boolean;\n enableGenerate?: boolean;\n\n /**\n * Whether to allow password visibility toggle\n */\n allowToggle?: boolean;\n\n /**\n * Custom password validation rules\n */\n rules?: PasswordRules;\n\n /**\n * Field size\n */\n size?: \"sm\" | \"md\" | \"lg\";\n\n /**\n * Field variant\n */\n variant?: \"flat\" | \"bordered\" | \"underlined\" | \"faded\";\n\n /**\n * Custom className\n */\n className?: string;\n\n /**\n * Auto focus\n */\n autoFocus?: boolean;\n\n /**\n * Auto complete\n */\n autoComplete?: string;\n\n /**\n * Whether this is for password confirmation\n */\n isConfirmation?: boolean;\n\n /**\n * Original password for confirmation\n */\n originalPassword?: string;\n\n /**\n * Custom validation error\n */\n error?: string | string[];\n\n /**\n * Help text\n */\n description?: string;\n\n /**\n * Start icon\n */\n startContent?: React.ReactNode;\n\n advanceRequirements?: any;\n}\n\n// ============================================================================\n// Password Validation Types\n// ============================================================================\n\nexport interface PasswordRules {\n minLength?: number;\n maxLength?: number;\n requireUppercase?: boolean;\n requireLowercase?: boolean;\n requireNumbers?: boolean;\n requireSpecialChars?: boolean;\n preventCommon?: boolean;\n preventUserInfo?: boolean;\n customPattern?: RegExp;\n customMessage?: string;\n}\n\nexport interface PasswordStrength {\n score: number; // 0-4 (very weak to very strong)\n label: string;\n color: string;\n percentage: number;\n feedback: string[];\n requirements: PasswordRequirement[];\n}\n\nexport interface PasswordRequirement {\n id: string;\n label: string;\n met: boolean;\n required: boolean;\n}\n\n// ============================================================================\n// Styled Components\n// ============================================================================\n\nconst PasswordFieldContainer = styled.div<StyledProps>`\n display: flex;\n flex-direction: column;\n gap: ${(props) => props.theme.spacing[2]};\n`;\n\nconst ToggleButton = styled(Button)<StyledProps>`\n color: ${(props) => props.theme.colors.text.quaternary};\n\n &:hover {\n color: ${(props) => props.theme.colors.text.tertiary};\n }\n`;\n\nexport const StyledSvg = styled.svg<StyledProps>`\n width: ${(props) => props.theme.spacing[4]};\n height: ${(props) => props.theme.spacing[4]};\n color: ${(props) => props.theme.colors.text.quaternary};\n`;\n\nconst StrengthContainer = styled(motion.div)<StyledProps>`\n display: flex;\n flex-direction: column;\n gap: ${(props) => props.theme.spacing[2]};\n`;\n\nconst StrengthHeader = styled.div<StyledProps>`\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: ${(props) => props.theme.fontSizes.sm};\n`;\n\nconst StrengthLabel = styled.span<StyledProps>`\n color: ${(props) => props.theme.colors.text.secondary};\n`;\n\nconst StrengthValue = styled.span<\n StyledProps & { strengthColor: keyof typeof props.theme.colors }\n>`\n font-weight: ${(props) => props.theme.fontWeights.medium};\n color: ${(props) => {\n switch (props.strengthColor) {\n case \"danger\":\n return props.theme.colors.danger[500];\n case \"warning\":\n return props.theme.colors.warning[500];\n case \"primary\":\n return props.theme.colors.primary[500];\n case \"success\":\n return props.theme.colors.success[500];\n default:\n return props.theme.colors.text.primary;\n }\n }};\n`;\n\nconst StrengthFeedback = styled.div<StyledProps>`\n font-size: ${(props) => props.theme.fontSizes.xs};\n color: ${(props) => props.theme.colors.text.tertiary};\n`;\n\nconst RequirementsContainer = styled(motion.div)<StyledProps>`\n display: flex;\n flex-direction: column;\n gap: ${(props) => props.theme.spacing[2]};\n`;\n\nconst RequirementsTitle = styled.div<StyledProps>`\n font-size: ${(props) => props.theme.fontSizes.sm};\n font-weight: ${(props) => props.theme.fontWeights.medium};\n color: ${(props) => props.theme.colors.text.primary};\n`;\n\nconst RequirementsGrid = styled.div<StyledProps>`\n display: flex;\n flex-direction: column;\n gap: ${(props) => props.theme.spacing[1]};\n`;\n\nconst RequirementItem = styled.div<StyledProps>`\n display: flex;\n align-items: center;\n gap: ${(props) => props.theme.spacing[2]};\n font-size: ${(props) => props.theme.fontSizes.xs};\n`;\n\nconst RequirementIcon = styled.div<StyledProps & { met: boolean }>`\n width: ${(props) => props.theme.spacing[4]};\n height: ${(props) => props.theme.spacing[4]};\n border-radius: ${(props) => props.theme.borderRadius.full};\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: ${(props) =>\n props.met\n ? props.theme.colors.success[100]\n : props.theme.colors.background.tertiary};\n color: ${(props) =>\n props.met\n ? props.theme.colors.success[600]\n : props.theme.colors.text.quaternary};\n`;\n\nconst RequirementIconSvg = styled.svg<StyledProps>`\n width: ${(props) => props.theme.spacing[3]};\n height: ${(props) => props.theme.spacing[3]};\n`;\n\nconst RequirementDot = styled.div<StyledProps>`\n width: 6px;\n height: 6px;\n border-radius: ${(props) => props.theme.borderRadius.full};\n background-color: currentColor;\n`;\n\nconst RequirementText = styled.span<StyledProps & { met: boolean }>`\n color: ${(props) =>\n props.met\n ? props.theme.colors.success[600]\n : props.theme.colors.text.tertiary};\n`;\n\nconst SuggestionsContainer = styled.div<StyledProps>`\n display: flex;\n flex-direction: column;\n gap: ${(props) => props.theme.spacing[2]};\n`;\n\nconst SuggestionsTitle = styled.div<StyledProps>`\n font-size: ${(props) => props.theme.fontSizes.xs};\n color: ${(props) => props.theme.colors.text.tertiary};\n`;\n\nconst SuggestionsGrid = styled.div<StyledProps>`\n display: flex;\n flex-direction: column;\n gap: ${(props) => props.theme.spacing[1]};\n`;\n\nconst SuggestionButton = styled.button<StyledProps>`\n font-size: ${(props) => props.theme.fontSizes.xs};\n font-family: monospace;\n color: ${(props) => props.theme.colors.primary[600]};\n background: none;\n border: none;\n cursor: pointer;\n text-align: left;\n padding: 0;\n\n &:hover {\n color: ${(props) => props.theme.colors.primary[800]};\n text-decoration: underline;\n }\n`;\n\nconst FeedbackContainer = styled.div<StyledProps>`\n font-size: ${(props) => props.theme.fontSizes.xs};\n display: flex;\n flex-direction: column;\n gap: ${(props) => props.theme.spacing[1]};\n`;\n\nconst FeedbackItem = styled.div<StyledProps>`\n display: flex;\n align-items: center;\n gap: ${(props) => props.theme.spacing[1]};\n color: ${(props) => props.theme.colors.text.tertiary};\n`;\n\nconst FeedbackIcon = styled.svg<StyledProps>`\n width: ${(props) => props.theme.spacing[3]};\n height: ${(props) => props.theme.spacing[3]};\n`;\n\nconst ChecklistContainer = styled.div<StyledProps>`\n font-size: ${(props) => props.theme.fontSizes.xs};\n display: flex;\n flex-direction: column;\n gap: ${(props) => props.theme.spacing[1]};\n`;\n\nconst ChecklistItem = styled.div<StyledProps & { met: boolean }>`\n display: flex;\n align-items: center;\n gap: ${(props) => props.theme.spacing[1]};\n color: ${(props) =>\n props.met\n ? props.theme.colors.success[600]\n : props.theme.colors.text.quaternary};\n`;\n\nconst ChecklistIcon = styled.svg<StyledProps & { met: boolean }>`\n width: ${(props) => props.theme.spacing[3]};\n height: ${(props) => props.theme.spacing[3]};\n opacity: ${(props) => (props.met ? 1 : 0.3)};\n`;\n\n// ============================================================================\n// Default Password Rules\n// ============================================================================\n\nconst defaultPasswordRules: PasswordRules = {\n minLength: 8,\n maxLength: 128,\n requireUppercase: true,\n requireLowercase: true,\n requireNumbers: true,\n requireSpecialChars: true,\n preventCommon: true,\n preventUserInfo: false,\n};\n\n// Common weak passwords\nconst commonPasswords = [\n \"password\",\n \"123456\",\n \"123456789\",\n \"qwerty\",\n \"abc123\",\n \"password123\",\n \"admin\",\n \"letmein\",\n \"welcome\",\n \"monkey\",\n \"1234567890\",\n \"iloveyou\",\n];\n\n// ============================================================================\n// Password Validation Functions\n// ============================================================================\n\n// Fixed special characters regex - dash moved to end to avoid range issues\nconst SPECIAL_CHARS_REGEX = /[!@#$%^&*()_+=\\[\\]{}|;':\",./<>?~`-]/;\n\n// Alternative: Even more comprehensive list including common symbols\n// const COMPREHENSIVE_SPECIAL_CHARS_REGEX =\n// \t/[!@#$%^&*()_+=\\[\\]{}\\|\\\\:;'\".,<>?/~`-]/;\n\n// Alternative comprehensive regex (includes more symbols)\nconst COMPREHENSIVE_SPECIAL_CHARS_REGEX =\n /[!@#$%^&*()_+=\\[\\]{}\\\\|;':\",./<>?~`-]/;\n\n// Most common special characters (simpler pattern)\nconst COMMON_SPECIAL_CHARS_REGEX = /[!@#$%^&*()_+-=\\[\\]{}|;':\",./<>?~]/;\n\nfunction validatePassword(\n password: string,\n rules: PasswordRules,\n userInfo?: any,\n): PasswordStrength {\n const requirements: PasswordRequirement[] = [];\n let score = 0;\n const feedback: string[] = [];\n\n // Length requirement\n if (rules.minLength) {\n const lengthMet = password.length >= rules.minLength;\n requirements.push({\n id: \"length\",\n label: `At least ${rules.minLength} characters`,\n met: lengthMet,\n required: true,\n });\n if (lengthMet) score += 1;\n else\n feedback.push(\n `Password must be at least ${rules.minLength} characters long`,\n );\n }\n\n // Uppercase requirement\n if (rules.requireUppercase) {\n const uppercaseMet = /[A-Z]/.test(password);\n requirements.push({\n id: \"uppercase\",\n label: \"One uppercase letter\",\n met: uppercaseMet,\n required: true,\n });\n if (uppercaseMet) score += 1;\n else feedback.push(\"Password must contain at least one uppercase letter\");\n }\n\n // Lowercase requirement\n if (rules.requireLowercase) {\n const lowercaseMet = /[a-z]/.test(password);\n requirements.push({\n id: \"lowercase\",\n label: \"One lowercase letter\",\n met: lowercaseMet,\n required: true,\n });\n if (lowercaseMet) score += 1;\n else feedback.push(\"Password must contain at least one lowercase letter\");\n }\n\n // Number requirement\n if (rules.requireNumbers) {\n const numberMet = /\\d/.test(password);\n requirements.push({\n id: \"number\",\n label: \"One number\",\n met: numberMet,\n required: true,\n });\n if (numberMet) score += 1;\n else feedback.push(\"Password must contain at least one number\");\n }\n\n // Fixed Special character requirement\n if (rules.requireSpecialChars) {\n // Use the fixed regex pattern\n const specialMet = SPECIAL_CHARS_REGEX.test(password);\n requirements.push({\n id: \"special\",\n label: \"One special character\",\n met: specialMet,\n required: true,\n });\n if (specialMet) score += 1;\n else\n feedback.push(\n \"Password must contain at least one special character (!@#$%^&*()_+-=[]{}|;':\\\",./<>?~`)\",\n );\n }\n\n // Common password check\n if (rules.preventCommon) {\n const isCommon = commonPasswords.includes(password.toLowerCase());\n requirements.push({\n id: \"common\",\n label: \"Not a common password\",\n met: !isCommon,\n required: false,\n });\n if (isCommon) {\n score = Math.max(0, score - 2);\n feedback.push(\"This is a commonly used password\");\n }\n }\n\n // Additional scoring for complexity\n if (password.length >= 12) score += 1;\n if (password.length >= 16) score += 1;\n if (/[A-Z].*[A-Z]/.test(password)) score += 0.5;\n if (/\\d.*\\d/.test(password)) score += 0.5;\n // Use the same fixed regex for additional scoring\n if (SPECIAL_CHARS_REGEX.test(password)) {\n const specialMatches = password.match(\n new RegExp(SPECIAL_CHARS_REGEX.source, \"g\"),\n );\n if (specialMatches && specialMatches.length >= 2) score += 0.5;\n }\n\n // Cap the score at 4\n score = Math.min(4, Math.floor(score * 0.8));\n\n // Determine strength label and color\n let label: string;\n let color: string;\n let percentage: number;\n\n switch (score) {\n case 0:\n case 1:\n label = \"Very Weak\";\n color = \"danger\";\n percentage = 20;\n break;\n case 2:\n label = \"Weak\";\n color = \"warning\";\n percentage = 40;\n break;\n case 3:\n label = \"Good\";\n color = \"primary\";\n percentage = 70;\n break;\n case 4:\n label = \"Strong\";\n color = \"success\";\n percentage = 100;\n break;\n default:\n label = \"Very Weak\";\n color = \"danger\";\n percentage = 0;\n }\n\n return {\n score,\n label,\n color,\n percentage,\n feedback,\n requirements,\n };\n}\n\n// ============================================================================\n// Password Field Component\n// ============================================================================\n\nexport function PasswordFieldComponent({\n name = \"password\",\n label = \"Password\",\n placeholder = \"Enter your password\",\n value = \"\",\n onChange,\n onBlur,\n onFocus,\n required = false,\n disabled = false,\n showStrength = true,\n showRequirements = false,\n showSuggestions = false,\n enableGenerate = false,\n allowToggle = true,\n rules = defaultPasswordRules,\n size = \"md\",\n radius = \"md\",\n variant = \"bordered\",\n className = \"\",\n autoFocus = false,\n autoComplete = \"current-password\",\n isConfirmation = false,\n originalPassword,\n error: externalError,\n description,\n startContent,\n advanceRequirements,\n}: PasswordFieldProps) {\n const { theme } = useTheme();\n const { components, organizationSettings } = useConfig();\n const formField = useFormField(name);\n\n // Custom component override\n const RootInput = components.Input ?? Input;\n const RootButton = components.Button ?? Button;\n const CustomPasswordField = components.PasswordField;\n if (CustomPasswordField) {\n return (\n <CustomPasswordField\n {...{\n name,\n label,\n placeholder,\n value,\n onChange,\n onBlur,\n onFocus,\n required,\n disabled,\n showStrength,\n showRequirements,\n allowToggle,\n rules,\n size,\n variant,\n className,\n autoFocus,\n autoComplete,\n isConfirmation,\n originalPassword,\n error: externalError,\n description,\n }}\n />\n );\n }\n\n // State\n const [internalValue, setInternalValue] = React.useState(value);\n const [isVisible, setIsVisible] = React.useState(false);\n const [isFocused, setIsFocused] = React.useState(false);\n const [suggestedPasswords, setSuggestedPasswords] = React.useState<string[]>(\n [],\n );\n\n // Use external value if controlled\n const currentValue = onChange ? value : internalValue;\n\n // Apply organization password rules if available\n const effectiveRules = React.useMemo(() => {\n const orgRules = organizationSettings?.passwordPolicy;\n if (orgRules) {\n return {\n ...defaultPasswordRules,\n ...rules,\n minLength: orgRules.minLength || rules.minLength,\n requireUppercase: orgRules.requireUppercase ?? rules.requireUppercase,\n requireLowercase: orgRules.requireLowercase ?? rules.requireLowercase,\n requireNumbers: orgRules.requireNumbers ?? rules.requireNumbers,\n requireSpecialChars:\n orgRules.requireSpecialChars ?? rules.requireSpecialChars,\n };\n }\n return { ...defaultPasswordRules, ...rules };\n }, [rules, organizationSettings]);\n\n // Password strength validation\n const strength = React.useMemo(() => {\n if (!currentValue) return null;\n return validatePassword(currentValue, effectiveRules);\n }, [currentValue, effectiveRules]);\n\n // Password confirmation validation\n const confirmationError = React.useMemo(() => {\n if (!isConfirmation || !originalPassword || !currentValue) return null;\n return originalPassword !== currentValue ? \"Passwords do not match\" : null;\n }, [isConfirmation, originalPassword, currentValue]);\n\n // Combined errors\n const errors = React.useMemo(() => {\n const allErrors: string[] = [];\n\n if (externalError) {\n if (Array.isArray(externalError)) {\n allErrors.push(...externalError);\n } else {\n allErrors.push(externalError);\n }\n }\n\n if (formField.error) {\n if (Array.isArray(formField.error)) {\n allErrors.push(...formField.error);\n } else {\n allErrors.push(formField.error);\n }\n }\n\n if (confirmationError) {\n allErrors.push(confirmationError);\n }\n\n return allErrors.length > 0 ? allErrors : null;\n }, [externalError, formField.error, confirmationError]);\n\n // Handle value change\n const handleChange = React.useCallback(\n (newValue: string) => {\n if (onChange) {\n onChange(newValue);\n } else {\n setInternalValue(newValue);\n }\n\n // Clear errors when user starts typing\n if (formField.clearError) {\n formField.clearError();\n }\n },\n [onChange, formField],\n );\n\n // Handle blur\n const handleBlur = React.useCallback(() => {\n setIsFocused(false);\n if (formField.setTouched) {\n formField.setTouched(true);\n }\n onBlur?.();\n }, [formField, onBlur]);\n\n // Handle focus\n const handleFocus = React.useCallback(() => {\n setIsFocused(true);\n onFocus?.();\n }, [onFocus]);\n\n // Toggle visibility\n const toggleVisibility = React.useCallback(() => {\n setIsVisible((prev) => !prev);\n }, []);\n\n // Show requirements when focused or has value\n const shouldShowRequirements =\n showRequirements && (isFocused || currentValue);\n const shouldShowSuggestions = showSuggestions && (isFocused || currentValue);\n const shouldShowStrength = showStrength && currentValue && !isConfirmation;\n\n // Generate password suggestions\n const generateSuggestions = React.useCallback(() => {\n const suggestions = generatePasswordSuggestions();\n setSuggestedPasswords(suggestions);\n }, []);\n\n return (\n <PasswordFieldContainer theme={theme} className={className}>\n <RootInput\n name={name}\n label={label}\n placeholder={placeholder}\n value={currentValue}\n onBlur={handleBlur}\n onFocus={handleFocus}\n type={isVisible ? \"text\" : \"password\"}\n isRequired={required}\n isDisabled={disabled}\n onChange={(e: any) =>\n handleChange(typeof e === \"string\" ? e : e.target.value)\n }\n required={required}\n disabled={disabled}\n size={size}\n radius={radius}\n variant={variant}\n autoFocus={autoFocus}\n autoComplete={autoComplete}\n description={description}\n isInvalid={!!errors}\n errorMessage=\"\"\n startContent={startContent}\n endContent={\n allowToggle && (\n <ToggleButton\n theme={theme}\n isIconOnly\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n color=\"secondary\"\n onClick={toggleVisibility}\n aria-label={isVisible ? \"Hide password\" : \"Show password\"}\n >\n {isVisible ? (\n <StyledSvg theme={theme} as={EyeSlashIcon} />\n ) : (\n <StyledSvg theme={theme} as={EyeIcon} />\n )}\n </ToggleButton>\n )\n }\n />\n\n {/* Field Errors */}\n {errors && <FieldError error={errors} fieldName={name} />}\n\n {/* Password Strength Indicator */}\n <AnimatePresence>\n {shouldShowStrength && strength && (\n <StrengthContainer\n theme={theme}\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n >\n <StrengthHeader theme={theme}>\n <StrengthLabel theme={theme}>Password strength:</StrengthLabel>\n <StrengthValue\n theme={theme}\n strengthColor={strength.color as any}\n >\n {strength.label}\n </StrengthValue>\n </StrengthHeader>\n <Progress\n value={strength.percentage}\n color={strength.color as any}\n size=\"xs\"\n />\n {strength.feedback.length > 0 && (\n <StrengthFeedback theme={theme}>\n {strength.feedback[0]}\n </StrengthFeedback>\n )}\n </StrengthContainer>\n )}\n </AnimatePresence>\n\n {/* Password Requirements */}\n <AnimatePresence>\n {shouldShowRequirements && strength && (\n <RequirementsContainer\n theme={theme}\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n >\n {!advanceRequirements ? (\n <>\n <RequirementsTitle theme={theme}>\n Password Requirements:\n </RequirementsTitle>\n <RequirementsGrid theme={theme}>\n {strength.requirements.map((req) => (\n <RequirementItem key={req.id} theme={theme}>\n <RequirementIcon theme={theme} met={req.met}>\n {req.met ? (\n <RequirementIconSvg\n theme={theme}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 13l4 4L19 7\"\n />\n </RequirementIconSvg>\n ) : (\n <RequirementDot theme={theme} />\n )}\n </RequirementIcon>\n <RequirementText theme={theme} met={req.met}>\n {req.label}\n </RequirementText>\n </RequirementItem>\n ))}\n </RequirementsGrid>\n </>\n ) : (\n <PasswordStrengthIndicator\n password={value}\n requirements={advanceRequirements}\n />\n )}\n </RequirementsContainer>\n )}\n </AnimatePresence>\n\n {/* Password Suggestions */}\n <AnimatePresence>\n {shouldShowSuggestions && strength && (\n <SuggestionsContainer theme={theme}>\n {suggestedPasswords.length > 0 && (\n <>\n <SuggestionsTitle theme={theme}>\n Suggested passwords:\n </SuggestionsTitle>\n <SuggestionsGrid theme={theme}>\n {suggestedPasswords.map((suggestion, index) => (\n <SuggestionButton\n key={index}\n theme={theme}\n type=\"button\"\n // onClick={() => {\n // handleFieldChange('password', suggestion);\n // handleFieldChange('confirmPassword', suggestion);\n // }}\n >\n {suggestion}\n </SuggestionButton>\n ))}\n </SuggestionsGrid>\n </>\n )}\n </SuggestionsContainer>\n )}\n </AnimatePresence>\n\n {/* Generate Suggestions Button */}\n <AnimatePresence>\n {enableGenerate && (\n <Button\n type=\"button\"\n variant=\"light\"\n size=\"sm\"\n onPress={generateSuggestions}\n >\n Generate secure password\n </Button>\n )}\n </AnimatePresence>\n </PasswordFieldContainer>\n );\n}\n\nexport const PasswordField = React.memo(PasswordFieldComponent);\n\n// ============================================================================\n// Password Confirmation Field\n// ============================================================================\n\nexport function PasswordConfirmationField({\n originalPassword,\n ...props\n}: PasswordFieldProps & { originalPassword: string }) {\n return (\n <PasswordField\n {...props}\n name={props.name || \"passwordConfirmation\"}\n label={props.label || \"Confirm Password\"}\n placeholder={props.placeholder || \"Confirm your password\"}\n autoComplete=\"new-password\"\n isConfirmation={true}\n originalPassword={originalPassword}\n showStrength={false}\n showRequirements={false}\n />\n );\n}\n\n// ============================================================================\n// Password Strength Indicator\n// ============================================================================\n\nfunction PasswordStrengthIndicator({\n password,\n requirements,\n}: {\n password: string;\n requirements?: SignUpFormProps[\"passwordRequirements\"];\n}) {\n const { theme } = useTheme();\n const strength = getPasswordStrength(password);\n\n const getStrengthColor = (strength: string) => {\n switch (strength) {\n case \"weak\":\n return \"danger\";\n case \"fair\":\n return \"warning\";\n case \"good\":\n return \"primary\";\n case \"strong\":\n return \"success\";\n default:\n return \"default\";\n }\n };\n\n const getStrengthText = (strength: string) => {\n switch (strength) {\n case \"weak\":\n return \"Weak\";\n case \"fair\":\n return \"Fair\";\n case \"good\":\n return \"Good\";\n case \"strong\":\n return \"Strong\";\n default:\n return \"\";\n }\n };\n\n if (!password) return null;\n\n return (\n <StrengthContainer theme={theme}>\n {/* Strength Bar */}\n <StrengthHeader theme={theme}>\n <Progress\n value={(strength.score / 6) * 100}\n color={getStrengthColor(strength.strength) as any}\n size=\"xs\"\n style={{ flex: 1 }}\n />\n <Chip\n size=\"sm\"\n color={getStrengthColor(strength.strength) as any}\n variant=\"flat\"\n >\n {getStrengthText(strength.strength)}\n </Chip>\n </StrengthHeader>\n\n {/* Feedback */}\n {strength.feedback.length > 0 && (\n <FeedbackContainer theme={theme}>\n {strength.feedback.map((feedback, index) => (\n <FeedbackItem key={index} theme={theme}>\n <FeedbackIcon theme={theme} as={ExclamationTriangleIcon} />\n <span>{feedback}</span>\n </FeedbackItem>\n ))}\n </FeedbackContainer>\n )}\n\n {/* Requirements checklist */}\n {requirements && (\n <ChecklistContainer theme={theme}>\n {requirements.minLength && (\n <RequirementItemComponent\n met={password.length >= requirements.minLength}\n text={`At least ${requirements.minLength} characters`}\n />\n )}\n {requirements.requireUppercase && (\n <RequirementItemComponent\n met={/[A-Z]/.test(password)}\n text=\"One uppercase letter\"\n />\n )}\n {requirements.requireLowercase && (\n <RequirementItemComponent\n met={/[a-z]/.test(password)}\n text=\"One lowercase letter\"\n />\n )}\n {requirements.requireNumbers && (\n <RequirementItemComponent\n met={/\\d/.test(password)}\n text=\"One number\"\n />\n )}\n {requirements.requireSymbols && (\n <RequirementItemComponent\n met={/[!@#$%^&*(),.?\":{}|<>]/.test(password)}\n text=\"One symbol\"\n />\n )}\n </ChecklistContainer>\n )}\n </StrengthContainer>\n );\n}\n\nfunction RequirementItemComponent({\n met,\n text,\n}: {\n met: boolean;\n text: string;\n}) {\n const { theme } = useTheme();\n\n return (\n <ChecklistItem theme={theme} met={met}>\n <ChecklistIcon theme={theme} met={met} as={CheckIcon} />\n <span>{text}</span>\n </ChecklistItem>\n );\n}\n\n// ============================================================================\n// Export\n// ============================================================================\n\nexport default PasswordField;\n"],"names":["PasswordFieldContainer","styled","props","ToggleButton","Button","StyledSvg","StrengthContainer","motion","StrengthHeader","StrengthLabel","StrengthValue","StrengthFeedback","RequirementsContainer","RequirementsTitle","RequirementsGrid","RequirementItem","RequirementIcon","RequirementIconSvg","RequirementDot","RequirementText","SuggestionsContainer","SuggestionsTitle","SuggestionsGrid","SuggestionButton","FeedbackContainer","FeedbackItem","FeedbackIcon","ChecklistContainer","ChecklistItem","ChecklistIcon","defaultPasswordRules","commonPasswords","SPECIAL_CHARS_REGEX","validatePassword","password","rules","userInfo","requirements","score","feedback","lengthMet","uppercaseMet","lowercaseMet","numberMet","specialMet","isCommon","specialMatches","label","color","percentage","PasswordFieldComponent","name","placeholder","value","onChange","onBlur","onFocus","required","disabled","showStrength","showRequirements","showSuggestions","enableGenerate","allowToggle","size","radius","variant","className","autoFocus","autoComplete","isConfirmation","originalPassword","externalError","description","startContent","advanceRequirements","theme","useTheme","components","organizationSettings","useConfig","formField","useFormField","RootInput","Input","CustomPasswordField","jsx","internalValue","setInternalValue","React","isVisible","setIsVisible","isFocused","setIsFocused","suggestedPasswords","setSuggestedPasswords","currentValue","effectiveRules","orgRules","strength","confirmationError","errors","allErrors","handleChange","newValue","handleBlur","handleFocus","toggleVisibility","prev","shouldShowRequirements","shouldShowSuggestions","shouldShowStrength","generateSuggestions","suggestions","generatePasswordSuggestions","jsxs","e","EyeSlashIcon","EyeIcon","FieldError","AnimatePresence","Progress","PasswordStrengthIndicator","Fragment","req","suggestion","index","PasswordField","PasswordConfirmationField","getPasswordStrength","getStrengthColor","getStrengthText","Chip","ExclamationTriangleIcon","RequirementItemComponent","met","text","CheckIcon","password_field_default"],"mappings":"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"}