{"version":3,"file":"sign-in-modal.cjs","sources":["../../../../../src/components/auth/sign-in/sign-in-modal.tsx"],"sourcesContent":["/**\n * @frank-auth/react - Sign In Modal Component\n *\n * Modal wrapper for sign-in form with customizable overlay and behavior.\n */\n\n\"use client\";\n\nimport {\n\tButton,\n\tModal,\n\tModalBody,\n\tModalFooter,\n\tModalHeader,\n} from \"@/components/ui\";\nimport { XMarkIcon } from \"@heroicons/react/24/outline\";\nimport React, { useCallback } from \"react\";\n\nimport { useConfig } from \"../../../hooks/use-config\";\nimport { SignInForm } from \"./sign-in-form\";\n\n// ============================================================================\n// Sign In Modal Types\n// ============================================================================\n\nexport interface SignInModalProps {\n\t/**\n\t * Whether the modal is open\n\t */\n\tisOpen?: boolean;\n\n\t/**\n\t * Callback for when modal should close\n\t */\n\tonClose?: () => void;\n\n\t/**\n\t * Modal size\n\t */\n\tmodalSize?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n\n\t/**\n\t * Whether modal can be closed by clicking backdrop\n\t */\n\tcloseOnBackdropClick?: boolean;\n\n\t/**\n\t * Whether modal can be closed by pressing escape\n\t */\n\tcloseOnEscape?: boolean;\n\n\t/**\n\t * Custom modal className\n\t */\n\tmodalClassName?: string;\n\n\t/**\n\t * Show close button\n\t */\n\tshowCloseButton?: boolean;\n\n\t/**\n\t * Sign-in methods to show\n\t */\n\tmethods?: (\"password\" | \"oauth\" | \"magic-link\" | \"passkey\" | \"sso\")[];\n\n\t/**\n\t * Initial email value\n\t */\n\temail?: string;\n\n\t/**\n\t * Initial organization ID\n\t */\n\torganizationId?: string;\n\n\t/**\n\t * Redirect URL after successful sign-in\n\t */\n\tredirectUrl?: string;\n\n\t/**\n\t * Success callback\n\t */\n\tonSuccess?: (result: any) => void;\n\n\t/**\n\t * Error callback\n\t */\n\tonError?: (error: Error) => void;\n\n\t/**\n\t * Custom title\n\t */\n\ttitle?: string;\n\n\t/**\n\t * Custom subtitle\n\t */\n\tsubtitle?: string;\n\n\t/**\n\t * Form size\n\t */\n\tsize?: \"sm\" | \"md\" | \"lg\";\n\n\t/**\n\t * Whether to show branding\n\t */\n\tshowBranding?: boolean;\n\n\t/**\n\t * Disabled state\n\t */\n\tdisabled?: boolean;\n\n\t/**\n\t * Show sign-up link\n\t */\n\tshowSignUpLink?: boolean;\n\n\t/**\n\t * Show forgot password link\n\t */\n\tshowForgotPasswordLink?: boolean;\n\n\t/**\n\t * Custom footer content\n\t */\n\tfooter?: React.ReactNode;\n\n\t/**\n\t * Custom header content\n\t */\n\theader?: React.ReactNode;\n\n\t/**\n\t * Modal backdrop blur\n\t */\n\tbackdrop?: \"opaque\" | \"blur\" | \"transparent\";\n\n\t/**\n\t * Modal placement\n\t */\n\tplacement?: \"auto\" | \"top\" | \"center\" | \"bottom\";\n\n\t/**\n\t * Custom modal header\n\t */\n\tmodalHeader?: React.ReactNode;\n\n\t/**\n\t * Custom modal footer\n\t */\n\tmodalFooter?: React.ReactNode;\n\n\t/**\n\t * Hide modal header\n\t */\n\thideHeader?: boolean;\n\n\t/**\n\t * Hide modal footer\n\t */\n\thideFooter?: boolean;\n\n\t/**\n\t * Modal scroll behavior\n\t */\n\tscrollBehavior?: \"inside\" | \"outside\";\n\n\tshowOrganizationSelector?: boolean;\n}\n\n// ============================================================================\n// Sign In Modal Component\n// ============================================================================\n\nexport function SignInModal({\n\tisOpen = false,\n\tonClose,\n\tmodalSize = \"md\",\n\tcloseOnBackdropClick = true,\n\tcloseOnEscape = true,\n\tmodalClassName = \"\",\n\tshowCloseButton = true,\n\tmethods = [\"password\", \"oauth\", \"magic-link\"],\n\temail,\n\torganizationId,\n\tredirectUrl,\n\tonSuccess,\n\tonError,\n\ttitle,\n\tsubtitle,\n\tsize = \"md\",\n\tshowBranding = true,\n\tdisabled = false,\n\tshowSignUpLink = true,\n\tshowForgotPasswordLink = true,\n\tfooter,\n\theader,\n\tbackdrop = \"blur\",\n\tplacement = \"center\",\n\tmodalHeader,\n\tmodalFooter,\n\thideHeader = false,\n\thideFooter = false,\n\tscrollBehavior = \"inside\",\n}: SignInModalProps) {\n\tconst { components } = useConfig();\n\n\t// Custom component override\n\tconst CustomSignInModal = components.SignInModal;\n\tif (CustomSignInModal) {\n\t\treturn (\n\t\t\t<CustomSignInModal\n\t\t\t\t{...{\n\t\t\t\t\tisOpen,\n\t\t\t\t\tonClose,\n\t\t\t\t\tmodalSize,\n\t\t\t\t\tcloseOnBackdropClick,\n\t\t\t\t\tcloseOnEscape,\n\t\t\t\t\tmodalClassName,\n\t\t\t\t\tshowCloseButton,\n\t\t\t\t\tmethods,\n\t\t\t\t\temail,\n\t\t\t\t\torganizationId,\n\t\t\t\t\tredirectUrl,\n\t\t\t\t\tonSuccess,\n\t\t\t\t\tonError,\n\t\t\t\t\ttitle,\n\t\t\t\t\tsubtitle,\n\t\t\t\t\tsize,\n\t\t\t\t\tshowBranding,\n\t\t\t\t\tdisabled,\n\t\t\t\t\tshowSignUpLink,\n\t\t\t\t\tshowForgotPasswordLink,\n\t\t\t\t\tfooter,\n\t\t\t\t\theader,\n\t\t\t\t\tbackdrop,\n\t\t\t\t\tplacement,\n\t\t\t\t\tmodalHeader,\n\t\t\t\t\tmodalFooter,\n\t\t\t\t\thideHeader,\n\t\t\t\t\thideFooter,\n\t\t\t\t\tscrollBehavior,\n\t\t\t\t}}\n\t\t\t/>\n\t\t);\n\t}\n\n\t// Handle successful sign-in\n\tconst handleSuccess = useCallback(\n\t\t(result: any) => {\n\t\t\tonSuccess?.(result);\n\n\t\t\t// Auto-close modal on success unless redirecting\n\t\t\tif (!redirectUrl) {\n\t\t\t\tonClose?.();\n\t\t\t}\n\t\t},\n\t\t[onSuccess, onClose, redirectUrl],\n\t);\n\n\t// Handle modal close\n\tconst handleClose = useCallback(() => {\n\t\tif (disabled) return;\n\t\tonClose?.();\n\t}, [onClose, disabled]);\n\n\t// Get modal size mapping\n\tconst getSizeProps = () => {\n\t\tswitch (modalSize) {\n\t\t\tcase \"sm\":\n\t\t\t\treturn { size: \"sm\" as const, className: \"max-w-sm\" };\n\t\t\tcase \"md\":\n\t\t\t\treturn { size: \"md\" as const, className: \"max-w-md\" };\n\t\t\tcase \"lg\":\n\t\t\t\treturn { size: \"lg\" as const, className: \"max-w-lg\" };\n\t\t\tcase \"xl\":\n\t\t\t\treturn { size: \"xl\" as const, className: \"max-w-xl\" };\n\t\t\tcase \"full\":\n\t\t\t\treturn { size: \"full\" as const, className: \"max-w-full\" };\n\t\t\tdefault:\n\t\t\t\treturn { size: \"md\" as const, className: \"max-w-md\" };\n\t\t}\n\t};\n\n\tconst sizeProps = getSizeProps();\n\n\treturn (\n\t\t<Modal\n\t\t\tisOpen={isOpen}\n\t\t\tonClose={handleClose}\n\t\t\tsize={sizeProps.size}\n\t\t\tbackdrop={backdrop}\n\t\t\tplacement={placement}\n\t\t\tscrollBehavior={scrollBehavior}\n\t\t\tcloseButton={showCloseButton}\n\t\t\tisDismissable={closeOnBackdropClick && !disabled}\n\t\t\tisKeyboardDismissDisabled={!closeOnEscape || disabled}\n\t\t\tclassName={`${modalClassName}`}\n\t\t\tclassNames={{\n\t\t\t\twrapper: \"z-[9999]\",\n\t\t\t\tbackdrop: \"z-[9998]\",\n\t\t\t\tbase: `${sizeProps.className}`,\n\t\t\t}}\n\t\t>\n\t\t\t<>\n\t\t\t\t{/* Modal Header */}\n\t\t\t\t{!hideHeader && (\n\t\t\t\t\t<ModalHeader className=\"flex flex-col gap-1 px-6 py-4\">\n\t\t\t\t\t\t{modalHeader || (\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-between w-full\">\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t{title && (\n\t\t\t\t\t\t\t\t\t\t<h2 className=\"text-lg font-semibold text-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t\t\t</h2>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{subtitle && (\n\t\t\t\t\t\t\t\t\t\t<p className=\"text-sm text-default-500 mt-1\">{subtitle}</p>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t{showCloseButton && (\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\tisIconOnly\n\t\t\t\t\t\t\t\t\t\tvariant=\"light\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\tonPress={handleClose}\n\t\t\t\t\t\t\t\t\t\tclassName=\"text-default-400 hover:text-default-600\"\n\t\t\t\t\t\t\t\t\t\tisDisabled={disabled}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<XMarkIcon className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</ModalHeader>\n\t\t\t\t)}\n\n\t\t\t\t{/* Modal Body */}\n\t\t\t\t<ModalBody className=\"px-6 py-4\">\n\t\t\t\t\t<SignInForm\n\t\t\t\t\t\tmethods={methods}\n\t\t\t\t\t\temail={email}\n\t\t\t\t\t\torganizationId={organizationId}\n\t\t\t\t\t\tredirectUrl={redirectUrl}\n\t\t\t\t\t\tonSuccess={handleSuccess}\n\t\t\t\t\t\tonError={onError}\n\t\t\t\t\t\ttitle={hideHeader ? title : undefined}\n\t\t\t\t\t\tsubtitle={hideHeader ? subtitle : undefined}\n\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\tshowBranding={showBranding}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tshowSignUpLink={showSignUpLink}\n\t\t\t\t\t\tshowForgotPasswordLink={showForgotPasswordLink}\n\t\t\t\t\t\theader={header}\n\t\t\t\t\t\tfooter={footer}\n\t\t\t\t\t\tvariant=\"minimal\"\n\t\t\t\t\t\tclassName=\"space-y-4\"\n\t\t\t\t\t/>\n\t\t\t\t</ModalBody>\n\n\t\t\t\t{/* Modal Footer */}\n\t\t\t\t{!hideFooter && modalFooter && (\n\t\t\t\t\t<ModalFooter className=\"px-6 py-4\">{modalFooter}</ModalFooter>\n\t\t\t\t)}\n\t\t\t</>\n\t\t</Modal>\n\t);\n}\n\n// ============================================================================\n// Sign In Modal Hook\n// ============================================================================\n\n/**\n * Hook for managing sign-in modal state\n */\nexport function useSignInModal() {\n\tconst [isOpen, setIsOpen] = React.useState(false);\n\n\tconst open = useCallback(() => setIsOpen(true), []);\n\tconst close = useCallback(() => setIsOpen(false), []);\n\tconst toggle = useCallback(() => setIsOpen((prev) => !prev), []);\n\n\treturn {\n\t\tisOpen,\n\t\topen,\n\t\tclose,\n\t\ttoggle,\n\t\tsetIsOpen,\n\t};\n}\n\n// ============================================================================\n// Sign In Modal with Trigger\n// ============================================================================\n\nexport interface SignInModalWithTriggerProps extends SignInModalProps {\n\t/**\n\t * Trigger element\n\t */\n\ttrigger?: React.ReactElement;\n\n\t/**\n\t * Trigger props (for default button)\n\t */\n\ttriggerProps?: {\n\t\tchildren?: React.ReactNode;\n\t\tvariant?:\n\t\t\t| \"solid\"\n\t\t\t| \"bordered\"\n\t\t\t| \"light\"\n\t\t\t| \"flat\"\n\t\t\t| \"faded\"\n\t\t\t| \"shadow\"\n\t\t\t| \"ghost\";\n\t\tcolor?:\n\t\t\t| \"default\"\n\t\t\t| \"primary\"\n\t\t\t| \"secondary\"\n\t\t\t| \"success\"\n\t\t\t| \"warning\"\n\t\t\t| \"danger\";\n\t\tsize?: \"sm\" | \"md\" | \"lg\";\n\t\tfullWidth?: boolean;\n\t\tstartContent?: React.ReactNode;\n\t\tendContent?: React.ReactNode;\n\t\tclassName?: string;\n\t\tdisabled?: boolean;\n\t};\n}\n\n/**\n * Sign In Modal with built-in trigger button\n */\nexport function SignInModalWithTrigger({\n\ttrigger,\n\ttriggerProps = {},\n\t...modalProps\n}: SignInModalWithTriggerProps) {\n\tconst { isOpen, open, close } = useSignInModal();\n\n\t// Default trigger button\n\tconst defaultTrigger = (\n\t\t<Button\n\t\t\tvariant={triggerProps.variant || \"solid\"}\n\t\t\tcolor={triggerProps.color || \"primary\"}\n\t\t\tsize={triggerProps.size || \"md\"}\n\t\t\tfullWidth={triggerProps.fullWidth}\n\t\t\tstartContent={triggerProps.startContent}\n\t\t\tendContent={triggerProps.endContent}\n\t\t\tclassName={triggerProps.className}\n\t\t\tisDisabled={triggerProps.disabled}\n\t\t\tonPress={open}\n\t\t>\n\t\t\t{triggerProps.children || \"Sign In\"}\n\t\t</Button>\n\t);\n\n\t// Use custom trigger or default\n\tconst triggerElement = trigger\n\t\t? React.cloneElement(trigger, {\n\t\t\t\tonClick: (e: React.MouseEvent) => {\n\t\t\t\t\ttrigger.props.onClick?.(e);\n\t\t\t\t\topen();\n\t\t\t\t},\n\t\t\t})\n\t\t: defaultTrigger;\n\n\treturn (\n\t\t<>\n\t\t\t{triggerElement}\n\t\t\t<SignInModal {...modalProps} isOpen={isOpen} onClose={close} />\n\t\t</>\n\t);\n}\n\n// ============================================================================\n// Export\n// ============================================================================\n\nexport default SignInModal;\n"],"names":["SignInModal","isOpen","onClose","modalSize","closeOnBackdropClick","closeOnEscape","modalClassName","showCloseButton","methods","email","organizationId","redirectUrl","onSuccess","onError","title","subtitle","size","showBranding","disabled","showSignUpLink","showForgotPasswordLink","footer","header","backdrop","placement","modalHeader","modalFooter","hideHeader","hideFooter","scrollBehavior","components","useConfig","CustomSignInModal","jsx","handleSuccess","useCallback","result","handleClose","sizeProps","Modal","jsxs","Fragment","ModalHeader","Button","XMarkIcon","ModalBody","SignInForm","ModalFooter","useSignInModal","setIsOpen","React","open","close","toggle","prev"],"mappings":"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"}