@frank-auth/react
Version:
Flexible and customizable React UI components for Frank Authentication
1 lines • 51.8 kB
Source Map (JSON)
{"version":3,"file":"sign-up-form.cjs","sources":["../../../../../src/components/auth/sign-up/sign-up-form.tsx"],"sourcesContent":["/**\n * @frank-auth/react - Sign Up Form Component\n *\n * Comprehensive sign-up form with multiple registration methods,\n * organization support, and customizable validation.\n */\n\n\"use client\";\n\nimport {\n Checkbox,\n Divider,\n Button as HeroButton,\n Input as HeroInput,\n Link,\n} from \"@/components/ui\";\nimport {\n CheckIcon,\n EnvelopeIcon,\n EyeIcon,\n EyeSlashIcon,\n LockClosedIcon,\n PhoneIcon,\n UserIcon,\n} from \"@heroicons/react/24/outline\";\nimport { motion } from \"framer-motion\";\nimport { useTheme } from \"@/theme/context\";\nimport type React from \"react\";\nimport { useCallback, useMemo, useState } from \"react\";\n\nimport { useAuth } from \"../../../hooks/use-auth\";\nimport { useConfig } from \"../../../hooks/use-config\";\nimport { useOAuth } from \"../../../hooks/use-oauth\";\nimport { usePasskeys } from \"../../../hooks/use-passkeys\";\n\nimport EmailField from \"@/components/forms/email-field\";\nimport FormWrapper from \"@/components/forms/form-wrapper\";\nimport PasswordField, { StyledSvg } from \"@/components/forms/password-field\";\nimport type { RadiusT, SizeT } from \"@/types\";\nimport {\n DEFAULT_PASSWORD_REQUIREMENTS,\n type SignUpFormProps,\n formatInvitationData,\n signUpValidation,\n} from \"./index\";\n\n// ============================================================================\n// Sign Up Form State\n// ============================================================================\n\ntype SignUpStep = \"form\" | \"verification\" | \"success\";\n\ninterface SignUpState {\n step: SignUpStep;\n method: string;\n\n // Basic fields\n email: string;\n password: string;\n confirmPassword: string;\n\n // Optional fields\n firstName: string;\n lastName: string;\n username: string;\n phoneNumber: string;\n\n // UI state\n showPassword: boolean;\n showConfirmPassword: boolean;\n acceptTerms: boolean;\n acceptMarketing: boolean;\n\n // Validation\n fieldErrors: Record<string, string>;\n passwordSuggestions: string[];\n}\n\n// ============================================================================\n// OAuth Provider Buttons Component\n// ============================================================================\n\nfunction OAuthButtons({\n onSuccess,\n onError,\n redirectUrl,\n organizationId,\n disabled,\n size = \"md\",\n radius = \"md\",\n}: {\n onSuccess: (provider: string, result: any) => void;\n onError?: (error: Error) => void;\n redirectUrl?: string;\n organizationId?: string;\n disabled?: boolean;\n size?: SizeT;\n radius?: RadiusT;\n}) {\n const {\n signInWithGoogle,\n signInWithGitHub,\n signInWithMicrosoft,\n signInWithApple,\n isLoading,\n } = useOAuth();\n const { components } = useConfig();\n\n const Button = components.Button ?? HeroButton;\n\n const handleOAuthSignUp = useCallback(\n async (provider: string, signInMethod: () => Promise<void>) => {\n try {\n await signInMethod();\n onSuccess(provider, { provider });\n } catch (error) {\n onError?.(\n error instanceof Error\n ? error\n : new Error(`${provider} sign-up failed`),\n );\n }\n },\n [onSuccess, onError],\n );\n\n return (\n <div className=\"space-y-3\">\n <Button\n variant=\"bordered\"\n size={size}\n radius={radius}\n className=\"w-full\"\n startContent={<GoogleIcon />}\n onPress={() =>\n handleOAuthSignUp(\"google\", () =>\n signInWithGoogle({ redirectUrl, organizationId }),\n )\n }\n isDisabled={disabled || isLoading}\n >\n Continue with Google\n </Button>\n\n <Button\n variant=\"bordered\"\n size={size}\n radius={radius}\n className=\"w-full\"\n startContent={<GitHubIcon />}\n onPress={() =>\n handleOAuthSignUp(\"github\", () =>\n signInWithGitHub({ redirectUrl, organizationId }),\n )\n }\n isDisabled={disabled || isLoading}\n >\n Continue with GitHub\n </Button>\n\n <Button\n variant=\"bordered\"\n size={size}\n radius={radius}\n className=\"w-full\"\n startContent={<MicrosoftIcon />}\n onPress={() =>\n handleOAuthSignUp(\"microsoft\", () =>\n signInWithMicrosoft({ redirectUrl, organizationId }),\n )\n }\n isDisabled={disabled || isLoading}\n >\n Continue with Microsoft\n </Button>\n\n <Button\n variant=\"bordered\"\n size={size}\n radius={radius}\n className=\"w-full\"\n startContent={<AppleIcon />}\n onPress={() =>\n handleOAuthSignUp(\"apple\", () =>\n signInWithApple({ redirectUrl, organizationId }),\n )\n }\n isDisabled={disabled || isLoading}\n >\n Continue with Apple\n </Button>\n </div>\n );\n}\n\n// ============================================================================\n// Main Sign Up Form Component\n// ============================================================================\n\nexport function SignUpForm({\n methods = [\"password\", \"sso\", \"magic-link\"],\n email: initialEmail = \"\",\n organizationId: initialOrganizationId,\n invitationToken,\n redirectUrl,\n onSuccess,\n onError,\n showSignInLink = true,\n title,\n subtitle,\n variant = \"default\",\n size = \"md\",\n radius = \"md\",\n className = \"\",\n showBranding = true,\n disabled = false,\n footer,\n header,\n requireTerms = true,\n termsUrl = \"/terms\",\n privacyUrl = \"/privacy\",\n passwordRequirements = DEFAULT_PASSWORD_REQUIREMENTS,\n autoFocus = true,\n collectFields = [\"firstName\", \"lastName\"],\n}: SignUpFormProps) {\n const { theme } = useTheme();\n const { signUp, isLoading } = useAuth();\n const { features, organizationSettings, components, linksPath } = useConfig();\n const { registerPasskey } = usePasskeys();\n\n // Custom component override\n const Input = components.Input ?? HeroInput;\n const Button = components.Button ?? HeroButton;\n const CustomSignUpForm = components.SignUpForm;\n if (CustomSignUpForm) {\n return (\n <CustomSignUpForm\n {...{\n methods,\n email: initialEmail,\n organizationId: initialOrganizationId,\n invitationToken,\n redirectUrl,\n onSuccess,\n onError,\n showSignInLink,\n title,\n subtitle,\n variant,\n size,\n className,\n showBranding,\n disabled,\n footer,\n header,\n requireTerms,\n termsUrl,\n privacyUrl,\n passwordRequirements,\n autoFocus,\n collectFields,\n }}\n />\n );\n }\n\n // Parse invitation data\n const invitationData = useMemo(() => {\n return formatInvitationData(invitationToken);\n }, [invitationToken]);\n\n // Form state\n const [state, setState] = useState<SignUpState>({\n step: \"form\",\n method: \"password\",\n email: initialEmail,\n password: \"\",\n confirmPassword: \"\",\n firstName: \"\",\n lastName: \"\",\n username: \"\",\n phoneNumber: \"\",\n showPassword: false,\n showConfirmPassword: false,\n acceptTerms: false,\n acceptMarketing: false,\n fieldErrors: {},\n passwordSuggestions: [],\n });\n\n const [formError, setFormError] = useState<string | null>(null);\n\n // Available methods based on features\n const availableMethods = useMemo(() => {\n return methods.filter((method) => {\n switch (method) {\n case \"oauth\":\n return features.oauth;\n case \"magic-link\":\n return features.magicLink;\n case \"passkey\":\n return features.passkeys;\n default:\n return true;\n }\n });\n }, [methods, features]);\n\n // Field validation\n const validateField = useCallback(\n (field: string, value: string) => {\n const newErrors = { ...state.fieldErrors };\n\n switch (field) {\n case \"email\":\n if (!signUpValidation.email(value)) {\n newErrors.email = \"Please enter a valid email address\";\n } else {\n delete newErrors.email;\n }\n break;\n\n case \"password\":\n if (!signUpValidation.password(value, passwordRequirements)) {\n newErrors.password = \"Password does not meet requirements\";\n } else {\n delete newErrors.password;\n }\n\n // Check confirm password match\n if (state.confirmPassword && value !== state.confirmPassword) {\n newErrors.confirmPassword = \"Passwords do not match\";\n } else if (state.confirmPassword) {\n delete newErrors.confirmPassword;\n }\n break;\n\n case \"confirmPassword\":\n if (value !== state.password) {\n newErrors.confirmPassword = \"Passwords do not match\";\n } else {\n delete newErrors.confirmPassword;\n }\n break;\n\n case \"firstName\":\n if (\n collectFields.includes(\"firstName\") &&\n !signUpValidation.firstName(value)\n ) {\n newErrors.firstName = \"Please enter a valid first name\";\n } else {\n delete newErrors.firstName;\n }\n break;\n\n case \"lastName\":\n if (\n collectFields.includes(\"lastName\") &&\n !signUpValidation.lastName(value)\n ) {\n newErrors.lastName = \"Please enter a valid last name\";\n } else {\n delete newErrors.lastName;\n }\n break;\n\n case \"username\":\n if (\n collectFields.includes(\"username\") &&\n value &&\n !signUpValidation.username(value)\n ) {\n newErrors.username =\n \"Username must be at least 3 characters and contain only letters, numbers, - and _\";\n } else {\n delete newErrors.username;\n }\n break;\n\n case \"phoneNumber\":\n if (\n collectFields.includes(\"phoneNumber\") &&\n value &&\n !signUpValidation.phoneNumber(value)\n ) {\n newErrors.phoneNumber = \"Please enter a valid phone number\";\n } else {\n delete newErrors.phoneNumber;\n }\n break;\n }\n\n setState((prev) => ({ ...prev, fieldErrors: newErrors }));\n },\n [\n state.fieldErrors,\n state.password,\n state.confirmPassword,\n passwordRequirements,\n collectFields,\n ],\n );\n\n // Handle field changes\n const handleFieldChange = useCallback(\n (field: string, value: string) => {\n setState((prev) => ({ ...prev, [field]: value }));\n validateField(field, value);\n },\n [validateField],\n );\n\n // Default content\n const getDefaultContent = () => {\n if (invitationData) {\n return {\n title: `Join ${invitationData.organizationName}`,\n subtitle: invitationData.inviterName\n ? `${invitationData.inviterName} has invited you to join`\n : \"You've been invited to join\",\n };\n }\n\n if (organizationSettings?.branding?.customSignUpText) {\n return {\n title:\n organizationSettings.branding.customSignUpText.title ||\n \"Create your account\",\n subtitle:\n organizationSettings.branding.customSignUpText.subtitle ||\n \"Join us today\",\n };\n }\n\n return {\n title: \"Create your account\",\n subtitle: \"Join us today\",\n };\n };\n\n const defaultContent = getDefaultContent();\n const finalTitle = title || defaultContent.title;\n const finalSubtitle = subtitle || defaultContent.subtitle;\n\n // Handle form submission\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault();\n setFormError(null);\n\n // Validate required fields\n const requiredFields = [\"email\", \"password\"];\n if (collectFields.includes(\"firstName\")) requiredFields.push(\"firstName\");\n if (collectFields.includes(\"lastName\")) requiredFields.push(\"lastName\");\n\n for (const field of requiredFields) {\n const value = state[field as keyof SignUpState] as string;\n if (!value) {\n setFormError(`Please fill in all required fields`);\n return;\n }\n }\n\n // Check for validation errors\n if (Object.keys(state.fieldErrors).length > 0) {\n setFormError(\"Please fix the errors above\");\n return;\n }\n\n // Check password confirmation\n if (state.password !== state.confirmPassword) {\n setFormError(\"Passwords do not match\");\n return;\n }\n\n // Check terms acceptance\n if (requireTerms && !state.acceptTerms) {\n setFormError(\"Please accept the terms of service\");\n return;\n }\n\n try {\n const result = await signUp({\n emailAddress: state.email,\n password: state.password,\n firstName: state.firstName || undefined,\n lastName: state.lastName || undefined,\n username: state.username || undefined,\n organizationId:\n invitationData?.organizationId || initialOrganizationId,\n invitationToken,\n acceptTerms: state.acceptTerms,\n marketingConsent: state.acceptMarketing,\n unsafeMetadata: {\n phoneNumber: state.phoneNumber || undefined,\n acceptMarketing: state.acceptMarketing,\n },\n });\n\n if (result.status === \"needs_verification\") {\n setState((prev) => ({ ...prev, step: \"verification\" }));\n return;\n }\n\n if (result.status === \"complete\" && result.user) {\n setState((prev) => ({ ...prev, step: \"success\" }));\n onSuccess?.(result);\n\n // Redirect if URL provided\n if (redirectUrl) {\n setTimeout(() => {\n window.location.href = redirectUrl;\n }, 1000);\n }\n }\n\n if (result.status === \"missing_requirements\" && result.error) {\n setFormError(result.error?.message);\n }\n } catch (error) {\n const authError =\n error instanceof Error ? error : new Error(\"Sign up failed\");\n setFormError(authError.message);\n onError?.(authError);\n }\n },\n [\n state,\n collectFields,\n requireTerms,\n signUp,\n invitationData?.organizationId,\n initialOrganizationId,\n invitationToken,\n onSuccess,\n onError,\n redirectUrl,\n ],\n );\n\n // Handle OAuth success\n const handleOAuthSuccess = useCallback(\n (provider: string, result: any) => {\n setState((prev) => ({ ...prev, step: \"success\" }));\n onSuccess?.(result);\n },\n [onSuccess],\n );\n\n // Handle Magic Link success\n const handleMagicLinkSuccess = useCallback(\n (result: any) => {\n setState((prev) => ({ ...prev, step: \"verification\" }));\n onSuccess?.(result);\n },\n [onSuccess],\n );\n\n // Handle Passkey registration\n const handlePasskeySignUp = useCallback(async () => {\n try {\n const result = await registerPasskey(\"Sign-up passkey\");\n setState((prev) => ({ ...prev, step: \"success\" }));\n onSuccess?.(result);\n } catch (error) {\n const authError =\n error instanceof Error\n ? error\n : new Error(\"Passkey registration failed\");\n setFormError(authError.message);\n onError?.(authError);\n }\n }, [registerPasskey, onSuccess, onError]);\n\n // Success step\n if (state.step === \"success\") {\n return (\n <div className=\"text-center space-y-4\">\n <motion.div\n initial={{ scale: 0 }}\n animate={{ scale: 1 }}\n className=\"mx-auto w-16 h-16 bg-success-100 dark:bg-success-900/30 rounded-full flex items-center justify-center\"\n >\n <CheckIcon className=\"w-8 h-8 text-success-600 dark:text-success-400\" />\n </motion.div>\n\n <div>\n <h3 className=\"text-xl font-semibold text-foreground mb-2\">\n Welcome aboard!\n </h3>\n <p className=\"text-default-500 text-sm\">\n Your account has been created successfully.\n </p>\n </div>\n\n {redirectUrl && (\n <div className=\"flex items-center justify-center gap-2 text-sm text-default-500\">\n <div className=\"animate-spin rounded-full h-4 w-4 border-b-2 border-primary\"></div>\n <span>Setting up your account...</span>\n </div>\n )}\n </div>\n );\n }\n\n // Verification step\n if (state.step === \"verification\") {\n return (\n <div className=\"text-center space-y-4\">\n <div className=\"mx-auto w-16 h-16 bg-primary-100 dark:bg-primary-900/30 rounded-full flex items-center justify-center\">\n <EnvelopeIcon className=\"w-8 h-8 text-primary-600 dark:text-primary-400\" />\n </div>\n\n <div>\n <h3 className=\"text-xl font-semibold text-foreground mb-2\">\n Check your email\n </h3>\n <p className=\"text-default-500 text-sm\">\n We've sent a verification link to {state.email}\n </p>\n </div>\n\n <Button\n variant=\"light\"\n size=\"sm\"\n onPress={() => setState((prev) => ({ ...prev, step: \"form\" }))}\n >\n Use a different email\n </Button>\n </div>\n );\n }\n\n // Main form\n return (\n <FormWrapper\n size={size}\n radius={radius}\n variant={\"flat\"}\n disableAnimations\n className={`space-y-6 ${className}`}\n footer={footer}\n header={header}\n title={finalTitle}\n onSubmit={handleSubmit}\n subtitle={finalSubtitle}\n desc={\n invitationData && (\n <div className=\"bg-primary-50 dark:bg-primary-900/20 rounded-lg p-3 text-sm\">\n <p className=\"text-primary-600 dark:text-primary-400\">\n You're joining as: <strong>{invitationData.role}</strong>\n </p>\n </div>\n )\n }\n showCard={false}\n logo={\n showBranding && organizationSettings?.branding?.logoUrl ? (\n <img\n src={organizationSettings.branding.logoUrl}\n alt=\"Organization Logo\"\n className=\"h-8 w-auto mx-auto mb-4\"\n />\n ) : undefined\n }\n >\n {/* OAuth Buttons */}\n {availableMethods.includes(\"oauth\") && (\n <>\n <OAuthButtons\n onSuccess={handleOAuthSuccess}\n onError={onError}\n redirectUrl={redirectUrl}\n organizationId={\n invitationData?.organizationId || initialOrganizationId\n }\n disabled={disabled}\n size={size}\n radius={radius}\n />\n\n {(availableMethods.includes(\"password\") ||\n availableMethods.includes(\"magic-link\")) && (\n <div className=\"relative\">\n <Divider className=\"my-4\">\n <span className=\"bg-background px-2 text-sm text-default-500\">\n or\n </span>\n </Divider>\n </div>\n )}\n </>\n )}\n\n {/* Passkey Registration */}\n {availableMethods.includes(\"passkey\") && (\n <>\n <Button\n variant=\"bordered\"\n size={size}\n radius={radius}\n className=\"w-full\"\n startContent={<LockClosedIcon className=\"w-4 h-4\" />}\n onPress={handlePasskeySignUp}\n isDisabled={disabled || isLoading}\n >\n Sign up with passkey\n </Button>\n\n {(availableMethods.includes(\"password\") ||\n availableMethods.includes(\"magic-link\")) && (\n <div className=\"relative\">\n <Divider className=\"my-4\" />\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <span className=\"bg-background px-2 text-sm text-default-500\">\n or\n </span>\n </div>\n </div>\n )}\n </>\n )}\n\n {/* Password Form */}\n {availableMethods.includes(\"password\") && (\n <div className=\"space-y-4\">\n {/* Name Fields */}\n {(collectFields.includes(\"firstName\") ||\n collectFields.includes(\"lastName\")) && (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n {collectFields.includes(\"firstName\") && (\n <Input\n type=\"text\"\n label=\"First Name\"\n placeholder=\"Enter your first name\"\n value={state.firstName}\n onChange={(e) =>\n handleFieldChange(\"firstName\", e.target.value)\n }\n startContent={\n <UserIcon className=\"w-4 h-4 text-default-400\" />\n }\n size={size}\n radius={radius}\n required\n disabled={disabled || isLoading}\n isRequired\n isDisabled={disabled || isLoading}\n isInvalid={!!state.fieldErrors.firstName}\n errorMessage={state.fieldErrors.firstName}\n autoFocus={autoFocus}\n variant=\"bordered\"\n />\n )}\n\n {collectFields.includes(\"lastName\") && (\n <Input\n type=\"text\"\n label=\"Last Name\"\n placeholder=\"Enter your last name\"\n value={state.lastName}\n onChange={(e) =>\n handleFieldChange(\"lastName\", e.target.value)\n }\n startContent={\n <UserIcon className=\"w-4 h-4 text-default-400\" />\n }\n size={size}\n radius={radius}\n required\n disabled={disabled || isLoading}\n isRequired\n isDisabled={disabled || isLoading}\n isInvalid={!!state.fieldErrors.lastName}\n errorMessage={state.fieldErrors.lastName}\n autoFocus={autoFocus && !collectFields.includes(\"firstName\")}\n variant=\"bordered\"\n />\n )}\n </div>\n )}\n\n {/* Email Field */}\n <EmailField\n label=\"Email\"\n placeholder=\"Enter your email\"\n value={state.email}\n onChange={(e) => handleFieldChange(\"email\", e)}\n startContent={<EnvelopeIcon className=\"w-4 h-4 text-default-400\" />}\n size={size}\n radius={radius}\n required\n disabled={disabled || isLoading}\n error={state.fieldErrors.email}\n autoFocus={autoFocus && collectFields.length === 0}\n showSuggestions={false}\n variant=\"bordered\"\n />\n\n {/* Username Field */}\n {collectFields.includes(\"username\") && (\n <Input\n type=\"text\"\n label=\"Username\"\n placeholder=\"Choose a username\"\n value={state.username}\n onChange={(e) => handleFieldChange(\"username\", e.target.value)}\n startContent={<span className=\"text-default-400 text-sm\">@</span>}\n size={size}\n radius={radius}\n required\n disabled={disabled || isLoading}\n isDisabled={disabled || isLoading}\n isInvalid={!!state.fieldErrors.username}\n errorMessage={state.fieldErrors.username}\n variant=\"bordered\"\n />\n )}\n\n {/* Phone Number Field */}\n {collectFields.includes(\"phoneNumber\") && (\n <Input\n type=\"tel\"\n label=\"Phone Number\"\n placeholder=\"Enter your phone number\"\n value={state.phoneNumber}\n onChange={(e) => handleFieldChange(\"phoneNumber\", e.target.value)}\n startContent={<PhoneIcon className=\"w-4 h-4 text-default-400\" />}\n size={size}\n radius={radius}\n disabled={disabled || isLoading}\n isDisabled={disabled || isLoading}\n isInvalid={!!state.fieldErrors.phoneNumber}\n errorMessage={state.fieldErrors.phoneNumber}\n variant=\"bordered\"\n />\n )}\n\n {/* Password Field */}\n <div className=\"space-y-2\">\n <PasswordField\n label=\"Password\"\n placeholder=\"Create a password\"\n value={state.password}\n onChange={(e) => handleFieldChange(\"password\", e)}\n endContent={\n <button\n type=\"button\"\n onClick={() =>\n setState((prev) => ({\n ...prev,\n showPassword: !prev.showPassword,\n }))\n }\n className=\"focus:outline-none\"\n >\n {state.showPassword ? (\n <EyeSlashIcon className=\"w-4 h-4 text-default-400\" />\n ) : (\n <EyeIcon className=\"w-4 h-4 text-default-400\" />\n )}\n </button>\n }\n size={size}\n radius={radius}\n required\n advanceRequirements={passwordRequirements}\n disabled={disabled || isLoading}\n isInvalid={!!state.fieldErrors.password}\n errorMessage={state.fieldErrors.password}\n variant=\"bordered\"\n />\n\n {/* Password Suggestions */}\n {state.passwordSuggestions.length > 0 && (\n <div className=\"space-y-2\">\n <div className=\"text-xs text-default-500\">\n Suggested passwords:\n </div>\n <div className=\"space-y-1\">\n {state.passwordSuggestions.map((suggestion, index) => (\n <button\n key={index}\n type=\"button\"\n onClick={() => {\n handleFieldChange(\"password\", suggestion);\n handleFieldChange(\"confirmPassword\", suggestion);\n }}\n className=\"text-xs font-mono text-primary-600 hover:text-primary-800 hover:underline block\"\n >\n {suggestion}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Confirm Password Field */}\n <Input\n type={state.showConfirmPassword ? \"text\" : \"password\"}\n label=\"Confirm Password\"\n placeholder=\"Confirm your password\"\n value={state.confirmPassword}\n onChange={(e) =>\n handleFieldChange(\"confirmPassword\", e.target.value)\n }\n startContent={\n <LockClosedIcon className=\"w-4 h-4 text-default-400\" />\n }\n endContent={\n <button\n type=\"button\"\n onClick={() =>\n setState((prev) => ({\n ...prev,\n showConfirmPassword: !prev.showConfirmPassword,\n }))\n }\n className=\"focus:outline-none\"\n >\n {state.showConfirmPassword ? (\n <StyledSvg theme={theme} as={EyeSlashIcon} />\n ) : (\n <StyledSvg theme={theme} as={EyeIcon} />\n )}\n </button>\n }\n size={size}\n isRequired\n isDisabled={disabled || isLoading}\n isInvalid={!!state.fieldErrors.confirmPassword}\n errorMessage={state.fieldErrors.confirmPassword}\n variant=\"bordered\"\n />\n\n {/* Terms and Privacy */}\n <div className=\"space-y-3\">\n {requireTerms && (\n <Checkbox\n isSelected={state.acceptTerms}\n onValueChange={(checked) =>\n setState((prev) => ({ ...prev, acceptTerms: checked }))\n }\n size=\"sm\"\n isDisabled={disabled || isLoading}\n isRequired\n >\n <span className=\"text-sm\">\n I agree to the{\" \"}\n <Link href={termsUrl} size=\"sm\" color=\"primary\" isExternal>\n Terms of Service\n </Link>{\" \"}\n and{\" \"}\n <Link href={privacyUrl} size=\"sm\" color=\"primary\" isExternal>\n Privacy Policy\n </Link>\n </span>\n </Checkbox>\n )}\n\n <Checkbox\n isSelected={state.acceptMarketing}\n onValueChange={(checked) =>\n setState((prev) => ({ ...prev, acceptMarketing: checked }))\n }\n size=\"sm\"\n isDisabled={disabled || isLoading}\n >\n <span className=\"text-sm text-default-500\">\n I'd like to receive product updates and marketing emails\n </span>\n </Checkbox>\n </div>\n\n {/* Error Display */}\n {formError && (\n <div className=\"text-danger-600 text-sm bg-danger-50 dark:bg-danger-900/20 rounded-lg p-3\">\n {formError}\n </div>\n )}\n\n {/* Submit Button */}\n <Button\n type=\"submit\"\n color=\"primary\"\n size={size}\n radius={radius}\n className=\"w-full\"\n isLoading={isLoading}\n isDisabled={\n disabled || !state.email || !state.password || !state.acceptTerms\n }\n >\n {isLoading ? \"Creating account...\" : \"Create account\"}\n </Button>\n </div>\n )}\n\n {/* Magic Link Only */}\n {availableMethods.includes(\"magic-link\") &&\n !availableMethods.includes(\"password\") && (\n <div className=\"space-y-4\">\n <Input\n type=\"email\"\n label=\"Email\"\n placeholder=\"Enter your email\"\n value={state.email}\n onChange={(e) => handleFieldChange(\"email\", e.target.value)}\n startContent={\n <EnvelopeIcon className=\"w-4 h-4 text-default-400\" />\n }\n size={size}\n isRequired\n isDisabled={disabled || isLoading}\n autoFocus\n variant=\"bordered\"\n />\n\n <Button\n variant=\"bordered\"\n size={size}\n radius={radius}\n className=\"w-full\"\n startContent={<EnvelopeIcon className=\"w-4 h-4\" />}\n isDisabled={disabled || isLoading || !state.email}\n isLoading={isLoading}\n >\n Send magic link\n </Button>\n </div>\n )}\n\n {/* Sign In Link */}\n {showSignInLink && features.signIn && (\n <div className=\"text-center text-sm\">\n <span className=\"text-default-500\">Already have an account? </span>\n <Link href={linksPath?.signIn} color=\"primary\">\n Sign in\n </Link>\n </div>\n )}\n\n {/* Custom Footer */}\n {footer}\n </FormWrapper>\n );\n}\n\n// ============================================================================\n// Provider Icons (same as sign-in)\n// ============================================================================\n\nfunction GoogleIcon() {\n return (\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\">\n <path\n fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n />\n <path\n fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n />\n <path\n fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n />\n </svg>\n );\n}\n\nfunction GitHubIcon() {\n return (\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n );\n}\n\nfunction MicrosoftIcon() {\n return (\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\">\n <path fill=\"#f25022\" d=\"M1 1h10v10H1z\" />\n <path fill=\"#00a4ef\" d=\"M13 1h10v10H13z\" />\n <path fill=\"#7fba00\" d=\"M1 13h10v10H1z\" />\n <path fill=\"#ffb900\" d=\"M13 13h10v10H13z\" />\n </svg>\n );\n}\n\nfunction AppleIcon() {\n return (\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.81-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M13 3.5c.73-.83 1.94-1.46 2.94-1.5.13 1.17-.34 2.35-1.04 3.19-.69.85-1.83 1.51-2.95 1.42-.15-1.15.41-2.35 1.05-3.11z\" />\n </svg>\n );\n}\n\nexport default SignUpForm;\n"],"names":["OAuthButtons","onSuccess","onError","redirectUrl","organizationId","disabled","size","radius","signInWithGoogle","signInWithGitHub","signInWithMicrosoft","signInWithApple","isLoading","useOAuth","components","useConfig","Button","HeroButton","handleOAuthSignUp","useCallback","provider","signInMethod","error","jsxs","jsx","GoogleIcon","GitHubIcon","MicrosoftIcon","AppleIcon","SignUpForm","methods","initialEmail","initialOrganizationId","invitationToken","showSignInLink","title","subtitle","variant","className","showBranding","footer","header","requireTerms","termsUrl","privacyUrl","passwordRequirements","DEFAULT_PASSWORD_REQUIREMENTS","autoFocus","collectFields","theme","useTheme","signUp","useAuth","features","organizationSettings","linksPath","registerPasskey","usePasskeys","Input","HeroInput","CustomSignUpForm","invitationData","useMemo","formatInvitationData","state","setState","useState","formError","setFormError","availableMethods","method","validateField","field","value","newErrors","signUpValidation","prev","handleFieldChange","defaultContent","finalTitle","finalSubtitle","handleSubmit","e","requiredFields","result","authError","handleOAuthSuccess","handlePasskeySignUp","motion","CheckIcon","EnvelopeIcon","FormWrapper","Fragment","Divider","LockClosedIcon","UserIcon","EmailField","PhoneIcon","PasswordField","EyeSlashIcon","EyeIcon","suggestion","index","StyledSvg","Checkbox","checked","Link"],"mappings":"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