@insforge/react 0.2.4 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/provider/InsforgeProvider.tsx","../src/hooks/usePublicAuthConfig.ts","../src/components/atoms/AuthBranding.tsx","../src/lib/utils.ts","../src/components/atoms/AuthContainer.tsx","../src/components/atoms/AuthHeader.tsx","../src/components/atoms/AuthErrorBanner.tsx","../src/components/atoms/AuthFormField.tsx","../src/components/atoms/AuthPasswordStrengthIndicator.tsx","../src/components/atoms/AuthPasswordField.tsx","../src/components/atoms/AuthSubmitButton.tsx","../src/components/atoms/AuthLink.tsx","../src/components/atoms/AuthDivider.tsx","../src/config/oauth-providers.tsx","../src/components/atoms/AuthOAuthButton.tsx","../src/components/atoms/AuthOAuthProviders.tsx","../src/components/atoms/AuthVerificationCodeInput.tsx","../src/components/forms/SignInForm.tsx","../src/components/SignIn.tsx","../src/components/forms/SignUpForm.tsx","../src/components/SignUp.tsx","../src/components/UserButton.tsx","../src/components/Protect.tsx","../src/components/SignedIn.tsx","../src/components/SignedOut.tsx","../src/components/InsforgeCallback.tsx","../src/components/forms/ForgotPasswordForm.tsx","../src/components/forms/ResetPasswordForm.tsx","../src/components/forms/VerifyEmailStatus.tsx","../src/hooks/useAuth.ts","../src/hooks/useUser.ts","../src/lib/validation.ts","../src/router/getInsforgeRoutes.tsx"],"names":["error","useState","useEffect","jsx","jsxs","Loader2","useRef","createClient","Fragment"],"mappings":"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","file":"index.mjs","sourcesContent":["\"use client\";\r\n\r\nimport {\r\n createContext,\r\n useContext,\r\n useEffect,\r\n useState,\r\n useCallback,\r\n useRef,\r\n type ReactNode,\r\n} from \"react\";\r\nimport { createClient } from \"@insforge/sdk\";\r\nimport type { InsforgeUser } from \"../types\";\r\nimport { GetPublicAuthConfigResponse } from \"@insforge/shared-schemas\";\r\n\r\ninterface InsforgeContextValue {\r\n // Auth state\r\n user: InsforgeUser | null;\r\n isLoaded: boolean;\r\n isSignedIn: boolean;\r\n\r\n // Auth methods\r\n setUser: (user: InsforgeUser | null) => void;\r\n signIn: (\r\n email: string,\r\n password: string\r\n ) => Promise<\r\n | {\r\n user?: { id: string; email: string; name: string };\r\n accessToken: string | null;\r\n }\r\n | { error: string }\r\n >;\r\n signUp: (\r\n email: string,\r\n password: string\r\n ) => Promise<\r\n | {\r\n user?: { id: string; email: string; name: string };\r\n accessToken: string | null;\r\n }\r\n | { error: string }\r\n >;\r\n signOut: () => Promise<void>;\r\n updateUser: (data: Partial<InsforgeUser>) => Promise<void>;\r\n reloadAuth: () => Promise<{ success: boolean; error?: string }>;\r\n\r\n // Email verification methods\r\n sendPasswordResetCode: (\r\n email: string\r\n ) => Promise<{ success: boolean; message: string } | null>;\r\n resetPassword: (\r\n token: string,\r\n newPassword: string\r\n ) => Promise<{ message: string; redirectTo?: string } | null>;\r\n verifyEmail: (\r\n token: string\r\n ) => Promise<{ accessToken: string; user?: any } | null>;\r\n\r\n // Public auth config\r\n getPublicAuthConfig: () => Promise<GetPublicAuthConfigResponse | null>;\r\n // Base config\r\n baseUrl: string;\r\n}\r\n\r\nconst InsforgeContext = createContext<InsforgeContextValue | undefined>(\r\n undefined\r\n);\r\n\r\nexport interface InsforgeProviderProps {\r\n children: ReactNode;\r\n baseUrl: string;\r\n onAuthChange?: (user: InsforgeUser | null) => void;\r\n // Optional: custom token sync functions (e.g., for Next.js cookie sync)\r\n syncTokenToCookie?: (token: string) => Promise<boolean>;\r\n clearCookie?: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * Unified Insforge Provider - manages authentication state and configuration\r\n *\r\n * Manages user authentication state and provides all necessary context to child components.\r\n * Works with any React framework (Next.js, Vite, Remix, etc.).\r\n *\r\n * @example\r\n * ```tsx\r\n * // Basic usage (React/Vite)\r\n * import { InsforgeProvider } from '@insforge/react';\r\n *\r\n * export default function App() {\r\n * return (\r\n * <InsforgeProvider baseUrl={process.env.VITE_INSFORGE_BASE_URL}>\r\n * {children}\r\n * </InsforgeProvider>\r\n * );\r\n * }\r\n * ```\r\n *\r\n * @example\r\n * ```tsx\r\n * // With cookie sync (Next.js optimization)\r\n * <InsforgeProvider\r\n * baseUrl={baseUrl}\r\n * syncTokenToCookie={async (token) => {\r\n * await fetch('/api/auth', {\r\n * method: 'POST',\r\n * body: JSON.stringify({ token })\r\n * });\r\n * return true;\r\n * }}\r\n * clearCookie={async () => {\r\n * await fetch('/api/auth', { method: 'DELETE' });\r\n * }}\r\n * >\r\n * {children}\r\n * </InsforgeProvider>\r\n * ```\r\n */\r\nexport function InsforgeProvider({\r\n children,\r\n baseUrl,\r\n onAuthChange,\r\n syncTokenToCookie,\r\n clearCookie,\r\n}: InsforgeProviderProps) {\r\n // Auth state\r\n const [user, setUser] = useState<InsforgeUser | null>(null);\r\n const [isLoaded, setIsLoaded] = useState(false);\r\n\r\n const refreshIntervalRef = useRef<NodeJS.Timeout | null>(null);\r\n\r\n // Initialize SDK client with lazy initialization - only runs once\r\n const [insforge] = useState(() => createClient({ baseUrl }));\r\n\r\n // Load auth state - returns explicit success/error status\r\n const loadAuthState = useCallback(async (): Promise<{\r\n success: boolean;\r\n error?: string;\r\n }> => {\r\n try {\r\n // Use SDK's getCurrentSession() to check for existing session\r\n const sessionResult = insforge.auth.getCurrentSession();\r\n const session = sessionResult.data?.session;\r\n const token = session?.accessToken || null;\r\n\r\n if (!token) {\r\n // No token, user is not authenticated\r\n setUser(null);\r\n if (onAuthChange) {\r\n onAuthChange(null);\r\n }\r\n setIsLoaded(true);\r\n return { success: false, error: \"no_session\" };\r\n }\r\n\r\n const userResult = await insforge.auth.getCurrentUser();\r\n\r\n if (userResult.data) {\r\n // Token is valid, update user state with fresh data\r\n const profile = userResult.data.profile;\r\n const userData: InsforgeUser = {\r\n id: userResult.data.user.id,\r\n email: userResult.data.user.email,\r\n name: (profile?.nickname as string | undefined) || \"\",\r\n avatarUrl: (profile?.avatarUrl as string | undefined) || \"\",\r\n };\r\n\r\n setUser(userData);\r\n\r\n if (onAuthChange) {\r\n onAuthChange(userData);\r\n }\r\n setIsLoaded(true);\r\n return { success: true };\r\n } else {\r\n // Token invalid or expired\r\n await insforge.auth.signOut();\r\n\r\n // Clear cookie if function provided\r\n if (clearCookie) {\r\n try {\r\n await clearCookie();\r\n } catch (error) {\r\n // Ignore errors\r\n }\r\n }\r\n\r\n setUser(null);\r\n if (onAuthChange) {\r\n onAuthChange(null);\r\n }\r\n setIsLoaded(true);\r\n return { success: false, error: \"invalid_token\" };\r\n }\r\n } catch (error) {\r\n // Token validation failed\r\n console.error(\"[InsforgeProvider] Token validation failed:\", error);\r\n\r\n await insforge.auth.signOut();\r\n\r\n // Clear cookie if function provided\r\n if (clearCookie) {\r\n try {\r\n await clearCookie();\r\n } catch (error) {\r\n // Ignore errors\r\n }\r\n }\r\n\r\n setUser(null);\r\n if (onAuthChange) {\r\n onAuthChange(null);\r\n }\r\n setIsLoaded(true);\r\n\r\n return {\r\n success: false,\r\n error: error instanceof Error ? error.message : \"authentication_failed\",\r\n };\r\n }\r\n }, [insforge, onAuthChange, syncTokenToCookie, clearCookie]);\r\n\r\n useEffect(() => {\r\n // Run loadAuthState only once on mount\r\n loadAuthState();\r\n\r\n return () => {\r\n if (refreshIntervalRef.current) {\r\n clearInterval(refreshIntervalRef.current);\r\n }\r\n };\r\n }, []); // Empty deps - run only on mount\r\n\r\n const getPublicAuthConfig = useCallback(async () => {\r\n try {\r\n const result = await insforge.auth.getPublicAuthConfig();\r\n if (result.data) {\r\n return result.data;\r\n } else {\r\n console.error('[InsforgeProvider] Failed to get public auth config:', result.error);\r\n return null;\r\n }\r\n } catch (error) {\r\n console.error(\r\n \"[InsforgeProvider] Failed to get public auth config:\",\r\n error\r\n );\r\n return null;\r\n }\r\n }, [insforge]);\r\n\r\n /**\r\n * Helper function to handle successful authentication\r\n */\r\n const handleAuthSuccess = useCallback(\r\n async (\r\n authToken: string,\r\n fallbackUser?: { id?: string; email?: string; name?: string }\r\n ) => {\r\n const userResult = await insforge.auth.getCurrentUser();\r\n\r\n if (userResult.data) {\r\n const profile = userResult.data.profile;\r\n const userData: InsforgeUser = {\r\n id: userResult.data.user.id,\r\n email: userResult.data.user.email,\r\n name: (profile?.nickname as string | undefined) || \"\",\r\n avatarUrl: (profile?.avatarUrl as string | undefined) || \"\",\r\n };\r\n\r\n setUser(userData);\r\n\r\n if (onAuthChange) {\r\n onAuthChange(userData);\r\n }\r\n\r\n // Try to sync token to cookie if function provided\r\n if (syncTokenToCookie) {\r\n try {\r\n await syncTokenToCookie(authToken);\r\n } catch (error) {\r\n // Cookie sync failed - that's okay\r\n }\r\n }\r\n } else if (fallbackUser) {\r\n // Fallback to basic user data if getCurrentUser fails\r\n const userData: InsforgeUser = {\r\n id: fallbackUser.id || \"\",\r\n email: fallbackUser.email || \"\",\r\n name: fallbackUser.name || \"\",\r\n avatarUrl: \"\",\r\n };\r\n\r\n setUser(userData);\r\n\r\n if (onAuthChange) {\r\n onAuthChange(userData);\r\n }\r\n }\r\n },\r\n [insforge, onAuthChange, syncTokenToCookie]\r\n );\r\n\r\n const signIn = useCallback(\r\n async (email: string, password: string) => {\r\n const sdkResult = await insforge.auth.signInWithPassword({\r\n email,\r\n password,\r\n });\r\n\r\n if (sdkResult.data) {\r\n await handleAuthSuccess(\r\n sdkResult.data.accessToken || \"\",\r\n sdkResult.data.user\r\n ? {\r\n id: sdkResult.data.user.id,\r\n email: sdkResult.data.user.email,\r\n name: sdkResult.data.user.name,\r\n }\r\n : undefined\r\n );\r\n return sdkResult.data;\r\n } else {\r\n const errorMessage =\r\n sdkResult.error?.message || \"Invalid email or password\";\r\n return { error: errorMessage };\r\n }\r\n },\r\n [insforge, handleAuthSuccess]\r\n );\r\n\r\n const signUp = useCallback(\r\n async (email: string, password: string) => {\r\n const sdkResult = await insforge.auth.signUp({ email, password });\r\n\r\n if (sdkResult.data) {\r\n await handleAuthSuccess(\r\n sdkResult.data.accessToken || \"\",\r\n sdkResult.data.user\r\n ? {\r\n id: sdkResult.data.user.id,\r\n email: sdkResult.data.user.email,\r\n name: sdkResult.data.user.name,\r\n }\r\n : undefined\r\n );\r\n return sdkResult.data;\r\n } else {\r\n const errorMessage = sdkResult.error?.message || \"Sign up failed\";\r\n return { error: errorMessage };\r\n }\r\n },\r\n [insforge, handleAuthSuccess]\r\n );\r\n\r\n const signOut = useCallback(async () => {\r\n await insforge.auth.signOut();\r\n\r\n // Clear cookie if function provided\r\n if (clearCookie) {\r\n try {\r\n await clearCookie();\r\n } catch (error) {\r\n // Ignore errors\r\n }\r\n }\r\n\r\n // Clear refresh interval if exists\r\n if (refreshIntervalRef.current) {\r\n clearInterval(refreshIntervalRef.current);\r\n }\r\n\r\n setUser(null);\r\n if (onAuthChange) {\r\n onAuthChange(null);\r\n }\r\n }, [insforge, onAuthChange, clearCookie]);\r\n\r\n const updateUser = useCallback(\r\n async (data: Partial<InsforgeUser>) => {\r\n if (!user) throw new Error(\"No user signed in\");\r\n\r\n const profileUpdate: Record<string, any> = {\r\n nickname: data.name,\r\n avatarUrl: data.avatarUrl,\r\n };\r\n\r\n const result = await insforge.auth.setProfile(profileUpdate);\r\n\r\n if (result.data) {\r\n const userResult = await insforge.auth.getCurrentUser();\r\n if (userResult.data) {\r\n const profile = userResult.data.profile;\r\n const updatedUser: InsforgeUser = {\r\n id: userResult.data.user.id,\r\n email: userResult.data.user.email,\r\n name: (profile?.nickname as string | undefined) || \"\",\r\n avatarUrl: (profile?.avatarUrl as string | undefined) || \"\",\r\n };\r\n setUser(updatedUser);\r\n if (onAuthChange) {\r\n onAuthChange(updatedUser);\r\n }\r\n }\r\n }\r\n },\r\n [user, onAuthChange, insforge]\r\n );\r\n\r\n const sendPasswordResetCode = useCallback(\r\n async (email: string) => {\r\n const sdkResult = await insforge.auth.sendPasswordResetCode({ email });\r\n return sdkResult.data;\r\n },\r\n [insforge]\r\n );\r\n\r\n const resetPassword = useCallback(\r\n async (token: string, newPassword: string) => {\r\n const sdkResult = await insforge.auth.resetPassword({\r\n newPassword,\r\n otp: token,\r\n });\r\n return sdkResult.data;\r\n },\r\n [insforge]\r\n );\r\n\r\n const verifyEmail = useCallback(\r\n async (token: string) => {\r\n const sdkResult = await insforge.auth.verifyEmail({ otp: token });\r\n return sdkResult.data;\r\n },\r\n [insforge]\r\n );\r\n\r\n return (\r\n <InsforgeContext.Provider\r\n value={{\r\n user,\r\n isLoaded,\r\n isSignedIn: !!user,\r\n setUser,\r\n signIn,\r\n signUp,\r\n signOut,\r\n updateUser,\r\n reloadAuth: loadAuthState,\r\n baseUrl,\r\n sendPasswordResetCode,\r\n resetPassword,\r\n verifyEmail,\r\n getPublicAuthConfig,\r\n }}\r\n >\r\n {children}\r\n </InsforgeContext.Provider>\r\n );\r\n}\r\n\r\n/**\r\n * Hook to access Insforge context\r\n *\r\n * @example\r\n * ```tsx\r\n * function MyComponent() {\r\n * const { user, isSignedIn, signOut } = useInsforge();\r\n *\r\n * if (!isSignedIn) return <SignIn />;\r\n *\r\n * return (\r\n * <div>\r\n * <p>Welcome {user.email}</p>\r\n * <button onClick={signOut}>Sign Out</button>\r\n * </div>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function useInsforge(): InsforgeContextValue {\r\n const context = useContext(InsforgeContext);\r\n if (!context) {\r\n throw new Error(\"useInsforge must be used within InsforgeProvider\");\r\n }\r\n return context;\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type {\r\n GetPublicAuthConfigResponse\r\n} from '@insforge/shared-schemas';\r\nimport { useInsforge } from '../provider/InsforgeProvider';\r\n\r\n/**\r\n * Hook to get all public authentication configuration (OAuth + Email) from Insforge backend\r\n *\r\n * **IMPORTANT: This hook should ONLY be used in SignIn and SignUp components.**\r\n *\r\n * This hook lazily fetches all public authentication configuration from the backend\r\n * only when the component mounts. Using it in other components will cause unnecessary\r\n * API calls on every page load.\r\n *\r\n * @returns Object containing OAuth providers, email auth config, and loading state\r\n * - `oauthProviders`: Array of enabled OAuth provider names (e.g., ['google', 'github'])\r\n * - `emailConfig`: Email authentication configuration object with password rules\r\n * - `isLoaded`: Boolean indicating if the config has been fetched\r\n *\r\n * @example\r\n * ```tsx\r\n * // ✅ Correct usage - only in SignIn/SignUp components\r\n * function SignUp() {\r\n * const { oauthProviders, emailConfig, isLoaded } = usePublicAuthConfig();\r\n * \r\n * if (!isLoaded) return <div>Loading...</div>;\r\n * \r\n * return (\r\n * <div>\r\n * <p>OAuth providers: {oauthProviders.length}</p>\r\n * <p>Password min length: {emailConfig?.passwordMinLength}</p>\r\n * </div>\r\n * );\r\n * }\r\n * ```\r\n *\r\n * @requires Must be used within InsforgeProvider\r\n */\r\nexport function usePublicAuthConfig(): {\r\n emailConfig: GetPublicAuthConfigResponse | null;\r\n isLoaded: boolean;\r\n} {\r\n const { getPublicAuthConfig } = useInsforge();\r\n const [emailConfig, setEmailConfig] = useState<GetPublicAuthConfigResponse | null>(null);\r\n const [isLoaded, setIsLoaded] = useState(false);\r\n\r\n useEffect(() => {\r\n async function fetchConfig() {\r\n const result = await getPublicAuthConfig();\r\n if (result) {\r\n setEmailConfig(result);\r\n } else {\r\n console.error('[usePublicAuthConfig] Failed to get public auth config');\r\n setEmailConfig(null);\r\n }\r\n setIsLoaded(true);\r\n }\r\n\r\n fetchConfig();\r\n }, [getPublicAuthConfig]);\r\n\r\n return { emailConfig, isLoaded };\r\n}\r\n\r\n","'use client';\r\n\r\n/**\r\n * Insforge branding component for authentication pages.\r\n * \r\n * @component\r\n * @example\r\n * ```tsx\r\n * <AuthBranding />\r\n * ```\r\n */\r\nexport function AuthBranding() {\r\n return (\r\n <div className=\"bg-[#FAFAFA] px-2 py-4 flex flex-row justify-center items-center gap-1\">\r\n <p className=\"text-xs font-medium text-black font-manrope\">Secured by</p>\r\n <a href=\"https://insforge.dev\" target=\"_blank\" rel=\"noopener noreferrer\">\r\n <svg width=\"83\" height=\"20\" viewBox=\"0 0 83 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2.16783 8.46797C1.9334 8.23325 1.9334 7.85269 2.16783 7.61797L8.11049 1.66797L16.6 1.66797L6.41259 11.868C6.17815 12.1027 5.79807 12.1027 5.56363 11.868L2.16783 8.46797Z\"\r\n fill=\"url(#paint0_linear_2976_9475)\"\r\n />\r\n <path\r\n d=\"M12.8858 6.44922L16.6 10.168V18.668L8.64108 10.6992L12.8858 6.44922Z\"\r\n fill=\"url(#paint1_linear_2976_9475)\"\r\n />\r\n <path\r\n d=\"M67.5439 6.48828C68.2894 6.48828 68.9145 6.67064 69.418 7.03516C69.5229 7.10943 69.6214 7.1907 69.7158 7.27637V6.70703H71.248V14.959C71.248 15.1583 71.2381 15.3485 71.2188 15.5283C71.2042 15.7129 71.1774 15.8925 71.1387 16.0674C71.0225 16.5776 70.7998 16.9957 70.4707 17.3213C70.1415 17.6518 69.7321 17.8972 69.2432 18.0576C68.7592 18.2179 68.2222 18.2988 67.6318 18.2988C67.1962 18.2988 66.7768 18.2308 66.375 18.0947C65.9782 17.9587 65.6202 17.7614 65.3008 17.5039C64.9813 17.2512 64.7199 16.9446 64.5166 16.585L66.1289 15.7832C66.2789 16.0698 66.4888 16.2819 66.7598 16.418C67.0356 16.5589 67.3289 16.6289 67.6387 16.6289C68.0016 16.6289 68.3258 16.5628 68.6113 16.4316C68.8969 16.3053 69.1176 16.116 69.2725 15.8633C69.4321 15.6155 69.5077 15.3047 69.498 14.9307V14.1797C69.4665 14.2037 69.4359 14.229 69.4033 14.252C68.8855 14.6164 68.2441 14.7988 67.4795 14.7988C66.7582 14.7988 66.1281 14.6165 65.5908 14.252C65.0537 13.8875 64.637 13.3915 64.3418 12.7646C64.0467 12.1378 63.8994 11.4307 63.8994 10.6436C63.8994 9.84651 64.0465 9.13673 64.3418 8.51465C64.6419 7.88768 65.0663 7.39481 65.6133 7.03516C66.1601 6.67077 66.8036 6.48836 67.5439 6.48828ZM37.5 6.48828C38.1099 6.48828 38.6496 6.58294 39.1191 6.77246C39.5935 6.96201 39.9762 7.2321 40.2666 7.58203C40.5569 7.93184 40.7359 8.34227 40.8037 8.81348L39.0176 9.13477C38.974 8.79951 38.8218 8.53424 38.5605 8.33984C38.304 8.14547 37.96 8.03605 37.5293 8.01172C37.1178 7.98742 36.7859 8.05051 36.5342 8.20117C36.2825 8.34698 36.1562 8.55398 36.1562 8.82129C36.1563 8.97184 36.208 9.10017 36.3096 9.20703C36.4112 9.31394 36.614 9.42141 36.9189 9.52832C37.2288 9.63524 37.6889 9.76635 38.2988 9.92188C38.9232 10.0823 39.4222 10.2666 39.7949 10.4756C40.1722 10.6796 40.4428 10.9254 40.6074 11.2119C40.7768 11.4987 40.8623 11.8466 40.8623 12.2549C40.8623 13.047 40.574 13.6691 39.998 14.1211C39.4268 14.5731 38.6348 14.7988 37.623 14.7988C36.6551 14.7988 35.8687 14.5799 35.2637 14.1426C34.6587 13.7052 34.2909 13.0908 34.1602 12.2988L35.9463 12.0215C36.0383 12.4102 36.2411 12.7169 36.5557 12.9404C36.8703 13.164 37.2678 13.2754 37.7471 13.2754C38.1681 13.2754 38.4922 13.1926 38.7197 13.0273C38.9521 12.8572 39.0684 12.6266 39.0684 12.335C39.0684 12.1552 39.0245 12.0122 38.9375 11.9053C38.8552 11.7935 38.6713 11.686 38.3857 11.584C38.1001 11.4819 37.6618 11.3528 37.0713 11.1973C36.4131 11.0223 35.8901 10.8359 35.5029 10.6367C35.1158 10.4327 34.8374 10.192 34.668 9.91504C34.4985 9.63801 34.4141 9.30188 34.4141 8.9082C34.4141 8.41746 34.5423 7.98943 34.7988 7.625C35.0553 7.26073 35.4135 6.98146 35.873 6.78711C36.3329 6.58784 36.8755 6.48828 37.5 6.48828ZM53.3047 6.48828C54.0937 6.48828 54.7815 6.66572 55.3672 7.02051C55.9527 7.37528 56.4072 7.86634 56.7314 8.49316C57.0558 9.11525 57.2187 9.83193 57.2188 10.6436C57.2188 11.46 57.0537 12.1817 56.7246 12.8086C56.4003 13.4307 55.9451 13.9196 55.3594 14.2744C54.7737 14.6242 54.0888 14.7988 53.3047 14.7988C52.5205 14.7988 51.8357 14.6214 51.25 14.2666C50.6643 13.9118 50.2091 13.4238 49.8848 12.8018C49.5653 12.1748 49.4053 11.4552 49.4053 10.6436C49.4053 9.81735 49.5703 9.09279 49.8994 8.4707C50.2286 7.8488 50.6859 7.36255 51.2715 7.0127C51.8572 6.66281 52.5351 6.48828 53.3047 6.48828ZM76.7471 6.48828C77.5603 6.48828 78.25 6.68053 78.8164 7.06445C79.3876 7.44351 79.812 7.97991 80.0879 8.6748C80.3638 9.36976 80.4672 10.189 80.3994 11.1318H74.7256C74.7843 11.6972 74.949 12.1516 75.2227 12.4951C75.5711 12.9325 76.0792 13.1513 76.7471 13.1514C77.1779 13.1514 77.5486 13.0567 77.8584 12.8672C78.173 12.6728 78.4146 12.3928 78.584 12.0283L80.3125 12.5537C80.0124 13.2633 79.5473 13.8153 78.918 14.209C78.2936 14.6025 77.6036 14.7988 76.8486 14.7988C76.0549 14.7988 75.358 14.6263 74.7578 14.2812C74.1576 13.9362 73.6875 13.458 73.3486 12.8457C73.0147 12.2334 72.8477 11.5284 72.8477 10.7314C72.8477 9.87126 73.0127 9.12495 73.3418 8.49316C73.671 7.85651 74.1282 7.36263 74.7139 7.0127C75.2995 6.6628 75.9775 6.48832 76.7471 6.48828ZM23.3301 14.5801H21.5801V4.08203H23.3301V14.5801ZM29.6152 6.48047C30.1959 6.48052 30.6753 6.5781 31.0527 6.77246C31.4301 6.96681 31.7305 7.21443 31.9531 7.51562C32.1758 7.81695 32.3398 8.13831 32.4463 8.47852C32.5528 8.81873 32.6213 9.14205 32.6504 9.44824C32.6843 9.74946 32.7012 9.99508 32.7012 10.1846V14.5801H30.9287V10.7891C30.9287 10.5413 30.9118 10.2669 30.8779 9.96582C30.844 9.66449 30.7645 9.37469 30.6387 9.09766C30.5177 8.81592 30.3337 8.58503 30.0869 8.40527C29.8449 8.22551 29.5157 8.13579 29.0996 8.13574C28.8769 8.13574 28.6563 8.17221 28.4385 8.24512C28.2206 8.31802 28.0219 8.4442 27.8428 8.62402C27.6685 8.79899 27.5284 9.04249 27.4219 9.35352C27.3154 9.65965 27.2617 10.0532 27.2617 10.5342V14.5801H25.4902V6.70703H27.0518V7.58301C27.2521 7.34675 27.486 7.14172 27.7559 6.96973C28.2593 6.64409 28.8794 6.48047 29.6152 6.48047ZM48.748 5.83887H44.2021V8.45605H47.876V10.2061H44.2021V14.5801H42.4521V4.08203H48.748V5.83887ZM62.5137 6.67773C62.7606 6.65829 63.001 6.66815 63.2334 6.70703V8.34766C63.001 8.27961 62.7317 8.25695 62.4268 8.28125C62.1267 8.30557 61.8553 8.39134 61.6133 8.53711C61.3715 8.66829 61.1733 8.83606 61.0186 9.04004C60.8686 9.24404 60.7572 9.47701 60.6846 9.73926C60.612 9.99685 60.5752 10.2768 60.5752 10.5781V14.5801H58.8184V6.70703H60.3652V7.96582C60.4243 7.85986 60.4888 7.75824 60.5605 7.66211C60.7251 7.4434 60.9219 7.26302 61.1494 7.12207C61.3429 6.99098 61.5559 6.88926 61.7881 6.81641C62.0251 6.73869 62.267 6.69235 62.5137 6.67773ZM67.8057 8.0625C67.3362 8.06252 66.9485 8.17982 66.6436 8.41309C66.3389 8.64144 66.1139 8.95232 65.9688 9.3457C65.8235 9.7345 65.751 10.1673 65.751 10.6436C65.751 11.1247 65.8215 11.5624 65.9619 11.9561C66.1071 12.3447 66.3269 12.6535 66.6221 12.8818C66.9174 13.1103 67.293 13.2246 67.748 13.2246C68.2174 13.2246 68.5953 13.1171 68.8809 12.9033C69.1711 12.6846 69.3811 12.3808 69.5117 11.9922C69.6473 11.6034 69.7158 11.1539 69.7158 10.6436C69.7158 10.1284 69.6473 9.67886 69.5117 9.29492C69.381 8.90617 69.1753 8.60445 68.8945 8.39062C68.6138 8.17213 68.2508 8.0625 67.8057 8.0625ZM53.3047 8.13574C52.8351 8.13574 52.4475 8.24222 52.1426 8.45605C51.8425 8.66504 51.6198 8.95977 51.4746 9.33887C51.3295 9.71303 51.2568 10.148 51.2568 10.6436C51.2568 11.4066 51.4288 12.0168 51.7725 12.4736C52.121 12.9256 52.6318 13.1514 53.3047 13.1514C54.0017 13.1514 54.5196 12.9177 54.8584 12.4512C55.1971 11.9846 55.3672 11.3822 55.3672 10.6436C55.3672 9.8807 55.1951 9.27324 54.8516 8.82129C54.5079 8.36444 53.9921 8.13575 53.3047 8.13574ZM76.8203 8.02637C76.1039 8.02637 75.5712 8.25013 75.2227 8.69727C74.9987 8.98144 74.8476 9.35094 74.7676 9.80566H78.6221C78.5589 9.29301 78.4236 8.89686 78.2139 8.61719C77.9186 8.22359 77.4543 8.02645 76.8203 8.02637Z\"\r\n fill=\"black\"\r\n />\r\n <defs>\r\n <linearGradient\r\n id=\"paint0_linear_2976_9475\"\r\n x1=\"1.85883\"\r\n y1=\"1.92425\"\r\n x2=\"24.3072\"\r\n y2=\"9.64016\"\r\n gradientUnits=\"userSpaceOnUse\"\r\n >\r\n <stop />\r\n <stop offset=\"1\" stopOpacity=\"0.4\" />\r\n </linearGradient>\r\n <linearGradient\r\n id=\"paint1_linear_2976_9475\"\r\n x1=\"25.6475\"\r\n y1=\"8.65468\"\r\n x2=\"10.7901\"\r\n y2=\"8.65468\"\r\n gradientUnits=\"userSpaceOnUse\"\r\n >\r\n <stop />\r\n <stop offset=\"1\" stopOpacity=\"0.4\" />\r\n </linearGradient>\r\n </defs>\r\n </svg>\r\n </a>\r\n </div>\r\n );\r\n}\r\n\r\n","import { type ClassValue, clsx } from 'clsx';\r\nimport { twMerge } from 'tailwind-merge';\r\n\r\n/**\r\n * Utility function to merge Tailwind CSS classes with clsx\r\n * Handles conditional classes and prevents style conflicts\r\n */\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n\r\n","'use client';\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { AuthBranding } from './AuthBranding';\r\nimport type { AuthContainerProps } from '../../types';\r\n\r\n/**\r\n * Main container component for authentication forms.\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * <AuthContainer>\r\n * <AuthHeader title=\"Sign In\" />\r\n * <form>...</form>\r\n * </AuthContainer>\r\n * \r\n * // With custom styling\r\n * <AuthContainer\r\n * appearance={{\r\n * cardClassName: \"bg-gray-50\"\r\n * }}\r\n * >\r\n * <AuthHeader title=\"Sign In\" />\r\n * <form>...</form>\r\n * </AuthContainer>\r\n * ```\r\n *\r\n * @param {ReactNode} children - Form content\r\n * @param {object} [appearance] - Tailwind CSS classes for styling\r\n * - `appearance.containerClassName`: Outer container element\r\n * - `appearance.cardClassName`: Inner card element (white background area)\r\n */\r\nexport function AuthContainer({ children, appearance = {} }: AuthContainerProps) {\r\n return (\r\n <div\r\n className={cn(\r\n 'w-full max-w-[400px] rounded-xl overflow-hidden shadow-lg',\r\n appearance.containerClassName\r\n )}\r\n >\r\n <div className={cn(\r\n 'bg-white p-6 flex flex-col justify-center items-stretch gap-6',\r\n appearance.cardClassName\r\n )}>\r\n {children}\r\n </div>\r\n <AuthBranding />\r\n </div>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport type { AuthHeaderProps } from '../../types';\r\n\r\n/**\r\n * Header component for authentication forms displaying title and optional subtitle.\r\n * \r\n * @component\r\n * @example\r\n * ```tsx\r\n * // Basic usage\r\n * <AuthHeader \r\n * title=\"Welcome Back\" \r\n * subtitle=\"Sign in to continue\" \r\n * />\r\n * \r\n * // With custom styling\r\n * <AuthHeader \r\n * title=\"Welcome Back\"\r\n * appearance={{\r\n * titleClassName: \"text-purple-900 text-3xl\",\r\n * subtitleClassName: \"text-purple-700\"\r\n * }}\r\n * />\r\n * ```\r\n * \r\n * @param {string} title - Main heading text\r\n * @param {string} [subtitle] - Optional subheading text\r\n * @param {object} [appearance] - Tailwind CSS classes for styling\r\n * - `appearance.containerClassName`: Container element\r\n * - `appearance.titleClassName`: Title element\r\n * - `appearance.subtitleClassName`: Subtitle element\r\n */\r\nexport function AuthHeader({ \r\n title, \r\n subtitle,\r\n appearance = {}\r\n}: AuthHeaderProps) {\r\n return (\r\n <div className={cn(\r\n 'flex flex-col justify-start items-start gap-2',\r\n appearance.containerClassName\r\n )}>\r\n <h1 className={cn(\r\n 'text-2xl font-semibold text-black leading-8',\r\n appearance.titleClassName\r\n )}>\r\n {title}\r\n </h1>\r\n {subtitle && (\r\n <p className={cn(\r\n 'text-sm font-normal text-[#828282] leading-6',\r\n appearance.subtitleClassName\r\n )}>\r\n {subtitle}\r\n </p>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport { AlertTriangle } from 'lucide-react';\r\nimport { cn } from '../../lib/utils';\r\nimport type { AuthErrorBannerProps } from '../../types';\r\n\r\n/**\r\n * Error message banner for authentication forms.\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * <AuthErrorBanner error={error} />\r\n * ```\r\n *\r\n * @param {string} error - Error message to display\r\n * @param {string} [className] - Banner element classes\r\n */\r\nexport function AuthErrorBanner({ error, className }: AuthErrorBannerProps) {\r\n if (!error) return null;\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'flex items-center gap-2 mb-4 pl-3 py-2 pr-2 bg-red-50 border-2 border-red-600 rounded',\r\n className\r\n )}\r\n >\r\n <AlertTriangle className=\"w-6 h-6 text-red-500 shrink-0\" />\r\n <span className=\"text-sm text-red-600 flex-1\">{error}</span>\r\n </div>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport type { AuthFormFieldProps } from '../../types';\r\n\r\n/**\r\n * Standard form input field with label for authentication forms.\r\n * \r\n * @component\r\n * @example\r\n * ```tsx\r\n * // Basic usage\r\n * <AuthFormField\r\n * id=\"email\"\r\n * type=\"email\"\r\n * label=\"Email Address\"\r\n * />\r\n * \r\n * // With custom styling\r\n * <AuthFormField\r\n * id=\"email\"\r\n * label=\"Email\"\r\n * appearance={{\r\n * containerClassName: \"flex flex-col justify-center items-stretch gap-1\",\r\n * inputClassName: \"border-blue-500 focus:ring-blue-500\",\r\n * labelClassName: \"text-blue-900 font-semibold\"\r\n * }}\r\n * />\r\n * ```\r\n * \r\n * @param {string} label - Label text\r\n * @param {string} id - Input element ID\r\n * @param {object} [appearance] - Tailwind CSS classes for styling\r\n * - `appearance.containerClassName`: Container element\r\n * - `appearance.labelClassName`: Label element\r\n * - `appearance.inputClassName`: Input element\r\n */\r\nexport function AuthFormField({ \r\n label, \r\n id, \r\n appearance = {},\r\n ...props \r\n}: AuthFormFieldProps) {\r\n return (\r\n <div className={cn(\r\n 'flex flex-col justify-center items-stretch gap-1',\r\n appearance.containerClassName\r\n )}>\r\n <label \r\n htmlFor={id} \r\n className={cn(\r\n 'text-sm font-normal text-black leading-6',\r\n appearance.labelClassName\r\n )}\r\n >\r\n {label}\r\n </label>\r\n <input\r\n id={id}\r\n className={cn(\r\n 'w-full flex items-center gap-2 self-stretch',\r\n 'pl-3 pr-2 py-2 rounded-sm border border-[#D4D4D4] bg-white',\r\n 'text-sm font-normal leading-5',\r\n 'placeholder:text-[#A3A3A3] placeholder:font-sm placeholder:font-normal',\r\n 'focus:outline-none focus:border-black',\r\n appearance.inputClassName\r\n )}\r\n {...props}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport { Check } from 'lucide-react';\r\nimport { cn } from '../../lib/utils';\r\nimport type { AuthPasswordStrengthIndicatorProps, AuthConfig } from '../../types';\r\n\r\ninterface PasswordRequirement {\r\n label: string;\r\n test: (password: string) => boolean;\r\n}\r\n\r\n/**\r\n * Password strength indicator showing requirement checklist.\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * <AuthPasswordStrengthIndicator\r\n * password={password}\r\n * config={emailAuthConfig}\r\n * />\r\n *\r\n * // With custom styling\r\n * <AuthPasswordStrengthIndicator\r\n * password={password}\r\n * config={emailAuthConfig}\r\n * appearance={{\r\n * requirementClassName: \"text-lg\"\r\n * }}\r\n * />\r\n * ```\r\n *\r\n * @param {string} password - Current password value\r\n * @param {object} config - Email auth configuration\r\n * @param {object} [appearance] - Tailwind CSS classes for styling\r\n * - `appearance.containerClassName`: Container element\r\n * - `appearance.requirementClassName`: Requirement text elements\r\n */\r\nexport function AuthPasswordStrengthIndicator({\r\n password,\r\n config,\r\n appearance = {},\r\n}: AuthPasswordStrengthIndicatorProps) {\r\n const requirements = createRequirements(config);\r\n\r\n return (\r\n <div\r\n className={cn('mt-3 flex flex-col gap-3', appearance.containerClassName)}\r\n >\r\n {requirements.map((req) => (\r\n <div key={req.label} className=\"flex items-center gap-2\">\r\n <div\r\n className={cn(\r\n 'flex items-center justify-center w-4 h-4 rounded-full border-2 transition-colors',\r\n req.test(password)\r\n ? 'bg-[#059669] border-transparent'\r\n : 'border-neutral-400 bg-white'\r\n )}\r\n >\r\n {req.test(password) && <Check className=\"w-3 h-3 text-white\" />}\r\n </div>\r\n <span\r\n className={cn(\r\n 'text-sm font-normal leading-5 text-[#525252]',\r\n appearance.requirementClassName\r\n )}\r\n >\r\n {req.label}\r\n </span>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * Creates password requirements based on email auth configuration\r\n */\r\nfunction createRequirements(\r\n config: AuthConfig\r\n): PasswordRequirement[] {\r\n const requirements: PasswordRequirement[] = [];\r\n\r\n const minLength = config.passwordMinLength;\r\n const requireUppercase = config.requireUppercase;\r\n const requireLowercase = config.requireLowercase;\r\n const requireNumber = config.requireNumber;\r\n const requireSpecialChar = config.requireSpecialChar;\r\n\r\n if (requireUppercase) {\r\n requirements.push({\r\n label: 'At least 1 Uppercase letter',\r\n test: (pwd) => /[A-Z]/.test(pwd),\r\n });\r\n }\r\n\r\n if (requireLowercase) {\r\n requirements.push({\r\n label: 'At least 1 Lowercase letter',\r\n test: (pwd) => /[a-z]/.test(pwd),\r\n });\r\n }\r\n\r\n if (requireNumber) {\r\n requirements.push({\r\n label: 'At least 1 Number',\r\n test: (pwd) => /\\d/.test(pwd),\r\n });\r\n }\r\n\r\n if (requireSpecialChar) {\r\n requirements.push({\r\n label: 'Special character (e.g. !?<>@#$%)',\r\n test: (pwd) => /[!@#$%^&*()_+\\-=[\\]{};\\\\|,.<>/?]/.test(pwd),\r\n });\r\n }\r\n\r\n requirements.push({\r\n label: `${minLength} characters or more`,\r\n test: (pwd) => pwd.length >= minLength,\r\n });\r\n\r\n return requirements;\r\n}\r\n\r\n/**\r\n * Validates that a password meets all strength requirements based on email auth configuration.\r\n *\r\n * @param password - The password string to validate\r\n * @param config - Email authentication configuration from backend\r\n * @returns true if all requirements are met, false otherwise\r\n */\r\nexport function validatePasswordStrength(\r\n password: string,\r\n config: AuthConfig\r\n): boolean {\r\n if (!password) return false;\r\n const requirements = createRequirements(config);\r\n return requirements.every((req) => req.test(password));\r\n}\r\n\r\n","'use client';\r\n\r\nimport { useState } from 'react';\r\nimport { Eye, EyeOff } from 'lucide-react';\r\nimport { cn } from '../../lib/utils';\r\nimport { AuthPasswordStrengthIndicator } from './AuthPasswordStrengthIndicator';\r\nimport type { AuthPasswordFieldProps } from '../../types';\r\n\r\n/**\r\n * Password input field with visibility toggle and optional strength indicator.\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * // With forgot password link\r\n * <AuthPasswordField\r\n * id=\"password\"\r\n * label=\"Password\"\r\n * forgotPasswordLink={{ href: '/forgot-password' }}\r\n * emailAuthConfig={config}\r\n * />\r\n *\r\n * // With custom styling\r\n * <AuthPasswordField\r\n * id=\"password\"\r\n * label=\"Password\"\r\n * emailAuthConfig={config}\r\n * appearance={{\r\n * inputClassName: \"border-blue-500\",\r\n * labelClassName: \"text-blue-900\"\r\n * }}\r\n * />\r\n * ```\r\n *\r\n * @param {string} label - Label text\r\n * @param {string} id - Input element ID\r\n * @param {boolean} [showStrengthIndicator] - Show password strength requirements\r\n * @param {object} [forgotPasswordLink] - Forgot password link config\r\n * @param {object} [appearance] - Tailwind CSS classes for styling\r\n * - `appearance.containerClassName`: Container element\r\n * - `appearance.labelClassName`: Label element\r\n * - `appearance.inputClassName`: Input element\r\n */\r\nexport function AuthPasswordField({\r\n label,\r\n id,\r\n showStrengthIndicator = false,\r\n emailAuthConfig,\r\n forgotPasswordLink,\r\n value,\r\n appearance = {},\r\n onFocus,\r\n ...props\r\n}: AuthPasswordFieldProps) {\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [showStrength, setShowStrength] = useState(false);\r\n\r\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\r\n if (showStrengthIndicator) {\r\n setShowStrength(true);\r\n }\r\n onFocus?.(e);\r\n };\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'flex flex-col justify-center items-stretch gap-1',\r\n appearance.containerClassName\r\n )}\r\n >\r\n {(label || forgotPasswordLink) && (\r\n <div className=\"flex justify-between items-center\">\r\n <label\r\n htmlFor={id}\r\n className={cn(\r\n 'text-sm font-normal text-black leading-6',\r\n appearance.labelClassName\r\n )}\r\n >\r\n {label}\r\n </label>\r\n {forgotPasswordLink && (\r\n <a\r\n href={forgotPasswordLink.href}\r\n className=\"text-right text-sm font-normal text-[#737373] leading-6\"\r\n >\r\n {forgotPasswordLink.text || 'Forget Password?'}\r\n </a>\r\n )}\r\n </div>\r\n )}\r\n <div className=\"relative\">\r\n <input\r\n id={id}\r\n type={showPassword ? 'text' : 'password'}\r\n className={cn(\r\n 'w-full flex items-center gap-2 self-stretch',\r\n 'pl-3 py-2 pr-8 rounded border border-[#D4D4D4] bg-white',\r\n 'text-sm font-normal leading-5',\r\n 'placeholder:text-[#A3A3A3] placeholder:font-sm placeholder:font-normal',\r\n 'focus:outline-none focus:border-black',\r\n appearance.inputClassName\r\n )}\r\n value={value}\r\n onFocus={handleFocus}\r\n {...props}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n className=\"absolute right-2 top-1/2 -translate-y-1/2 bg-transparent border-none text-[#A6A6A6] cursor-pointer transition-colors hover:text-gray-600 flex items-center justify-center\"\r\n aria-label={showPassword ? 'Hide password' : 'Show password'}\r\n >\r\n {showPassword ? <EyeOff size={20} /> : <Eye size={20} />}\r\n </button>\r\n </div>\r\n {showStrengthIndicator && showStrength && (\r\n <AuthPasswordStrengthIndicator\r\n password={String(value || '')}\r\n config={emailAuthConfig}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport { CircleCheck, Loader2 } from 'lucide-react';\r\nimport { cn } from '../../lib/utils';\r\nimport type { AuthSubmitButtonProps } from '../../types';\r\n\r\n/**\r\n * Primary submit button for authentication forms with loading and confirmed states.\r\n * \r\n * @component\r\n * @example\r\n * ```tsx\r\n * // Basic usage\r\n * <AuthSubmitButton isLoading={loading}>\r\n * Sign In\r\n * </AuthSubmitButton>\r\n * \r\n * // With custom styling\r\n * <AuthSubmitButton className=\"bg-purple-600 hover:bg-purple-700\">\r\n * Sign In\r\n * </AuthSubmitButton>\r\n * ```\r\n * \r\n * @param {ReactNode} children - Button text\r\n * @param {boolean} [isLoading] - Loading state (shows spinner)\r\n * @param {boolean} [confirmed] - Confirmed state (shows checkmark)\r\n * @param {boolean} [disabled] - Disabled state\r\n * @param {string} [className] - Button element classes\r\n */\r\nexport function AuthSubmitButton({\r\n children,\r\n isLoading = false,\r\n confirmed = false,\r\n disabled = false,\r\n className,\r\n}: AuthSubmitButtonProps) {\r\n return (\r\n <button\r\n type=\"submit\"\r\n className={cn(\r\n 'rounded-sm bg-black w-full flex mt-4 px-4 py-2',\r\n 'justify-center items-center gap-2.5 self-stretch',\r\n 'text-white font-semibold font-manrope text-base leading-normal',\r\n 'border-none cursor-pointer transition-colors',\r\n 'hover:bg-gray-800',\r\n 'disabled:opacity-50 disabled:cursor-not-allowed',\r\n className\r\n )}\r\n disabled={disabled || isLoading || confirmed}\r\n >\r\n {isLoading && <Loader2 className=\"w-5 h-5 animate-spin\" size={20} />}\r\n {confirmed && <CircleCheck className=\"w-5 h-5\" size={20} />}\r\n {children}\r\n </button>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport type { AuthLinkProps } from '../../types';\r\n\r\n/**\r\n * Call-to-action link component for navigation between auth pages.\r\n * \r\n * @component\r\n * @example\r\n * ```tsx\r\n * <AuthLink \r\n * text=\"Don't have an account?\" \r\n * linkText=\"Sign up\" \r\n * href=\"/sign-up\" \r\n * />\r\n * \r\n * // With custom styling\r\n * <AuthLink \r\n * text=\"Don't have an account?\" \r\n * linkText=\"Sign up\" \r\n * href=\"/sign-up\"\r\n * appearance={{\r\n * linkClassName: \"text-blue-500\"\r\n * }}\r\n * />\r\n * ```\r\n * \r\n * @param {string} text - Regular text before the link\r\n * @param {string} linkText - Clickable link text\r\n * @param {string} href - Link URL\r\n * @param {object} [appearance] - Tailwind CSS classes for styling\r\n * - `appearance.containerClassName`: Container element\r\n * - `appearance.linkClassName`: Link element\r\n */\r\nexport function AuthLink({ text, linkText, href, appearance = {} }: AuthLinkProps) {\r\n // Preserve current URL search params when navigating\r\n const currentSearch = typeof window !== 'undefined' ? window.location.search : '';\r\n \r\n const finalHref = (() => {\r\n if (!currentSearch) return href;\r\n \r\n try {\r\n const url = new URL(href, window.location.origin);\r\n const currentParams = new URLSearchParams(currentSearch);\r\n \r\n // Add current params to the target URL (don't override existing params in href)\r\n currentParams.forEach((value, key) => {\r\n if (!url.searchParams.has(key)) {\r\n url.searchParams.set(key, value);\r\n }\r\n });\r\n \r\n return url.pathname + url.search;\r\n } catch {\r\n // Fallback to original href if URL parsing fails\r\n return href;\r\n }\r\n })();\r\n \r\n return (\r\n <p className={cn(\r\n 'text-center text-sm font-normal text-[#828282] leading-6',\r\n appearance.containerClassName\r\n )}>\r\n {text}{' '}\r\n <a \r\n href={finalHref} \r\n className={cn(\r\n 'text-sm font-medium text-black leading-6',\r\n appearance.linkClassName\r\n )}\r\n >\r\n {linkText}\r\n </a>\r\n </p>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport type { AuthDividerProps } from '../../types';\r\n\r\n/**\r\n * Visual divider with optional centered text for auth forms.\r\n * \r\n * @component\r\n * @example\r\n * ```tsx\r\n * <AuthDivider text=\"or\" />\r\n * ```\r\n * \r\n * @param {string} [text='or'] - Centered text\r\n * @param {string} [className] - Divider element classes\r\n */\r\nexport function AuthDivider({ text = 'or', className }: AuthDividerProps) {\r\n return (\r\n <div className={cn(\r\n 'flex justify-center items-center gap-6 self-stretch',\r\n \"before:content-[''] before:flex-1 before:h-px before:bg-[#E5E5E5]\",\r\n \"after:content-[''] after:flex-1 after:h-px after:bg-[#E5E5E5]\",\r\n className\r\n )}>\r\n <span className=\"text-sm font-semibold font-manrope text-[#A3A3A3] leading-normal\">\r\n {text}\r\n </span>\r\n </div>\r\n );\r\n}\r\n\r\n","import type { OAuthProvider, OAuthProviderConfig } from '../types';\r\n\r\nexport const OAUTH_PROVIDER_CONFIG: Record<OAuthProvider, OAuthProviderConfig> = {\r\n google: {\r\n name: 'Google',\r\n svg: (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M17.64 9.2c0-.637-.057-1.251-.164-1.84H9v3.481h4.844c-.209 1.125-.843 2.078-1.796 2.717v2.258h2.908c1.702-1.567 2.684-3.874 2.684-6.615z\"\r\n fill=\"#4285F4\"\r\n />\r\n <path\r\n d=\"M9 18c2.43 0 4.467-.806 5.956-2.184l-2.908-2.258c-.806.54-1.837.86-3.048.86-2.344 0-4.328-1.584-5.036-3.711H.957v2.332C2.438 15.983 5.482 18 9 18z\"\r\n fill=\"#34A853\"\r\n />\r\n <path\r\n d=\"M3.964 10.707c-.18-.54-.282-1.117-.282-1.707 0-.593.102-1.17.282-1.709V4.958H.957C.347 6.173 0 7.548 0 9c0 1.452.348 2.827.957 4.042l3.007-2.335z\"\r\n fill=\"#FBBC05\"\r\n />\r\n <path\r\n d=\"M9 3.58c1.321 0 2.508.454 3.44 1.345l2.582-2.58C13.463.891 11.426 0 9 0 5.482 0 2.438 2.017.957 4.958L3.964 7.29C4.672 5.163 6.656 3.58 9 3.58z\"\r\n fill=\"#EA4335\"\r\n />\r\n </svg>\r\n ),\r\n className: 'insforge-oauth-google',\r\n },\r\n github: {\r\n name: 'GitHub',\r\n svg: (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z\" />\r\n </svg>\r\n ),\r\n className: 'insforge-oauth-github',\r\n },\r\n discord: {\r\n name: 'Discord',\r\n svg: (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M20.317 4.37a19.791 19.791 0 00-4.885-1.515.074.074 0 00-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 00-5.487 0 12.64 12.64 0 00-.617-1.25.077.077 0 00-.079-.037A19.736 19.736 0 003.677 4.37a.07.07 0 00-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 00.031.057 19.9 19.9 0 005.993 3.03.078.078 0 00.084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 00-.041-.106 13.107 13.107 0 01-1.872-.892.077.077 0 01-.008-.128 10.2 10.2 0 00.372-.292.074.074 0 01.077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 01.078.01c.12.098.246.198.373.292a.077.077 0 01-.006.127 12.299 12.299 0 01-1.873.892.077.077 0 00-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 00.084.028 19.839 19.839 0 006.002-3.03.077.077 0 00.032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 00-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z\"\r\n fill=\"#5865F2\"\r\n />\r\n </svg>\r\n ),\r\n className: 'insforge-oauth-discord',\r\n },\r\n facebook: {\r\n name: 'Facebook',\r\n svg: (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M24 12.073C24 5.405 18.627 0 12 0S0 5.405 0 12.073C0 18.1 4.388 23.094 10.125 24v-8.437H7.078v-3.49h3.047v-2.66c0-3.025 1.792-4.697 4.533-4.697 1.312 0 2.686.236 2.686.236v2.971H15.83c-1.49 0-1.955.93-1.955 1.886v2.264h3.328l-.532 3.49h-2.796V24C19.612 23.094 24 18.1 24 12.073z\"\r\n fill=\"#1877F2\"\r\n />\r\n </svg>\r\n ),\r\n className: 'insforge-oauth-facebook',\r\n },\r\n linkedin: {\r\n name: 'LinkedIn',\r\n svg: (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\"\r\n fill=\"#0A66C2\"\r\n />\r\n </svg>\r\n ),\r\n className: 'insforge-oauth-linkedin',\r\n },\r\n microsoft: {\r\n name: 'Microsoft',\r\n svg: (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 23 23\" fill=\"none\">\r\n <path d=\"M0 0h11v11H0z\" fill=\"#F25022\" />\r\n <path d=\"M12 0h11v11H12z\" fill=\"#7FBA00\" />\r\n <path d=\"M0 12h11v11H0z\" fill=\"#00A4EF\" />\r\n <path d=\"M12 12h11v11H12z\" fill=\"#FFB900\" />\r\n </svg>\r\n ),\r\n className: 'insforge-oauth-microsoft',\r\n },\r\n apple: {\r\n name: 'Apple',\r\n svg: (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M17.05 20.28c-.98.95-2.05.8-3.08.35-1.09-.46-2.09-.48-3.24 0-1.44.62-2.2.44-3.06-.35C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09l.01-.01zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z\" />\r\n </svg>\r\n ),\r\n className: 'insforge-oauth-apple',\r\n },\r\n x: {\r\n name: 'X',\r\n svg: (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\r\n </svg>\r\n ),\r\n className: 'insforge-oauth-x',\r\n },\r\n instagram: {\r\n name: 'Instagram',\r\n svg: (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.741 24 12 24c3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z\"\r\n fill=\"url(#instagram-gradient)\"\r\n />\r\n <defs>\r\n <linearGradient id=\"instagram-gradient\" x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\">\r\n <stop offset=\"0%\" stopColor=\"#FD5949\" />\r\n <stop offset=\"50%\" stopColor=\"#D6249F\" />\r\n <stop offset=\"100%\" stopColor=\"#285AEB\" />\r\n </linearGradient>\r\n </defs>\r\n </svg>\r\n ),\r\n className: 'insforge-oauth-instagram',\r\n },\r\n tiktok: {\r\n name: 'TikTok',\r\n svg: (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M19.589 6.686a4.793 4.793 0 01-3.77-4.245V2h-3.445v13.672a2.896 2.896 0 01-5.201 1.743l-.002-.001.002.001a2.895 2.895 0 013.183-4.51v-3.5a6.329 6.329 0 00-5.394 10.692 6.33 6.33 0 0010.857-4.424V8.687a8.182 8.182 0 004.773 1.526V6.79a4.831 4.831 0 01-1.003-.104z\"\r\n fill=\"currentColor\"\r\n />\r\n </svg>\r\n ),\r\n className: 'insforge-oauth-tiktok',\r\n },\r\n spotify: {\r\n name: 'Spotify',\r\n svg: (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M12 0C5.4 0 0 5.4 0 12s5.4 12 12 12 12-5.4 12-12S18.66 0 12 0zm5.521 17.34c-.24.359-.66.48-1.021.24-2.82-1.74-6.36-2.101-10.561-1.141-.418.122-.779-.179-.899-.539-.12-.421.18-.78.54-.9 4.56-1.021 8.52-.6 11.64 1.32.42.18.479.659.301 1.02zm1.44-3.3c-.301.42-.841.6-1.262.3-3.239-1.98-8.159-2.58-11.939-1.38-.479.12-1.02-.12-1.14-.6-.12-.48.12-1.021.6-1.141C9.6 9.9 15 10.561 18.72 12.84c.361.181.54.78.241 1.2zm.12-3.36C15.24 8.4 8.82 8.16 5.16 9.301c-.6.179-1.2-.181-1.38-.721-.18-.601.18-1.2.72-1.381 4.26-1.26 11.28-1.02 15.721 1.621.539.3.719 1.02.419 1.56-.299.421-1.02.599-1.559.3z\"\r\n fill=\"#1DB954\"\r\n />\r\n </svg>\r\n ),\r\n className: 'insforge-oauth-spotify',\r\n },\r\n};\r\n\r\n\r\n/**\r\n * Get OAuth provider configuration by provider name\r\n */\r\nexport function getProviderConfig(provider: OAuthProvider): OAuthProviderConfig | null {\r\n return OAUTH_PROVIDER_CONFIG[provider] || null;\r\n}\r\n\r\n/**\r\n * Get all available OAuth provider configurations\r\n */\r\nexport function getAllProviderConfigs(): Partial<Record<OAuthProvider, OAuthProviderConfig>> {\r\n return OAUTH_PROVIDER_CONFIG;\r\n}\r\n\r\n","'use client';\r\n\r\nimport { Loader2 } from 'lucide-react';\r\nimport { cn } from '../../lib/utils';\r\nimport { getProviderConfig } from '../../config/oauth-providers';\r\nimport type { AuthOAuthButtonProps } from '../../types';\r\n\r\n/**\r\n * OAuth provider button with adaptive display modes.\r\n * \r\n * @component\r\n * @example\r\n * ```tsx\r\n * <AuthOAuthButton\r\n * provider=\"google\"\r\n * onClick={handleOAuth}\r\n * displayMode=\"full\"\r\n * />\r\n * ```\r\n * \r\n * @param {OAuthProvider} provider - Provider identifier (e.g., 'google', 'github')\r\n * @param {function} onClick - Click handler\r\n * @param {boolean} [disabled] - Disabled state\r\n * @param {boolean} [loading] - Loading state (shows spinner)\r\n * @param {string} [displayMode='full'] - Display mode ('full' | 'short' | 'icon')\r\n * @param {string} [className] - Button element classes\r\n */\r\nexport function AuthOAuthButton({ \r\n provider, \r\n onClick, \r\n disabled, \r\n loading, \r\n displayMode = 'full',\r\n style,\r\n className \r\n}: AuthOAuthButtonProps) {\r\n const config = getProviderConfig(provider);\r\n\r\n if (!config) {\r\n return null;\r\n }\r\n\r\n const getButtonText = () => {\r\n if (loading) return 'Authenticating...';\r\n if (displayMode === 'full') return `Continue with ${config.name}`;\r\n if (displayMode === 'short') return config.name;\r\n return ''; // icon only mode\r\n };\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n onClick={() => onClick(provider)}\r\n className={cn(\r\n 'flex w-full h-9 px-3 py-2',\r\n 'flex-row justify-center items-center gap-3',\r\n 'rounded-md border border-[#E4E4E7] bg-white',\r\n 'shadow-[0_1px_2px_0_rgba(0,0,0,0.10)]',\r\n 'text-[#09090B] text-center text-sm font-medium leading-5',\r\n 'cursor-pointer transition-all duration-200',\r\n 'hover:bg-[#f9fafb] hover:border-[#9ca3af]',\r\n 'disabled:opacity-60 disabled:cursor-not-allowed',\r\n displayMode === 'full' && 'justify-center',\r\n displayMode === 'short' && 'justify-center px-2 gap-2',\r\n displayMode === 'icon' && 'justify-center gap-0',\r\n className\r\n )}\r\n disabled={disabled || loading}\r\n style={style}\r\n >\r\n {loading ? (\r\n <Loader2 className=\"w-[18px] h-[18px] animate-spin\" size={18} />\r\n ) : (\r\n <span className=\"flex items-center justify-center shrink-0\">{config.svg}</span>\r\n )}\r\n {getButtonText() && <span>{getButtonText()}</span>}\r\n </button>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { AuthOAuthButton } from './AuthOAuthButton';\r\nimport type { AuthOAuthProvidersProps } from '../../types';\r\n\r\n/**\r\n * Smart OAuth provider grid with adaptive layout.\r\n * \r\n * Automatically adjusts layout based on provider count:\r\n * - 1 provider: Full-width\r\n * - 2 or 4 providers: Two columns\r\n * - 3+ providers: Three columns\r\n * \r\n * @component\r\n * @example\r\n * ```tsx\r\n * <AuthOAuthProviders\r\n * providers={['google', 'github', 'discord']}\r\n * onClick={handleOAuth}\r\n * loading={currentProvider}\r\n * />\r\n * \r\n * // With custom styling\r\n * <AuthOAuthProviders\r\n * providers={['google', 'github']}\r\n * onClick={handleOAuth}\r\n * loading={currentProvider}\r\n * appearance={{\r\n * buttonClassName: \"hover:bg-blue-50\"\r\n * }}\r\n * />\r\n * ```\r\n * \r\n * @param {OAuthProvider[]} providers - Provider identifiers array\r\n * @param {function} onClick - Provider click handler\r\n * @param {boolean} [disabled] - Disabled state for all buttons\r\n * @param {OAuthProvider | null} loading - Currently loading provider\r\n * @param {object} [appearance] - Tailwind CSS classes for styling\r\n * - `appearance.containerClassName`: Grid container element\r\n * - `appearance.buttonClassName`: OAuth button elements\r\n */\r\nexport function AuthOAuthProviders({\r\n providers,\r\n onClick,\r\n disabled,\r\n loading,\r\n appearance = {},\r\n}: AuthOAuthProvidersProps) {\r\n if (!providers || providers.length === 0) {\r\n return null;\r\n }\r\n\r\n const count = providers.length;\r\n\r\n // Determine display mode based on count\r\n const getDisplayMode = () => {\r\n if (count === 1) return 'full';\r\n if (count === 2 || count === 4) return 'short';\r\n return 'icon';\r\n };\r\n\r\n // Calculate grid column style for each button\r\n // Grid is always 6 columns, but buttons span different widths based on total count\r\n const getGridColumnStyle = (index: number): React.CSSProperties => {\r\n // 1 button: span all 6 columns\r\n if (count === 1) {\r\n return { gridColumn: 'span 6' };\r\n }\r\n\r\n // 2 buttons: each spans 3 columns\r\n if (count === 2) {\r\n return { gridColumn: 'span 3' };\r\n }\r\n\r\n // 3 buttons: each spans 2 columns\r\n if (count === 3) {\r\n return { gridColumn: 'span 2 / span 2' };\r\n }\r\n\r\n // 4 buttons: 2 rows, each button spans 3 columns\r\n if (count === 4) {\r\n return { gridColumn: 'span 3' };\r\n }\r\n\r\n // 5+ buttons: each spans 2 columns, with last row centered if needed\r\n const totalRows = Math.ceil(count / 3);\r\n const lastRowStartIndex = (totalRows - 1) * 3;\r\n const isInLastRow = index >= lastRowStartIndex;\r\n\r\n if (!isInLastRow) {\r\n // Not in last row, use default span 2\r\n return { gridColumn: 'span 2 / span 2' };\r\n }\r\n\r\n // Calculate position in last row (0-based)\r\n const positionInLastRow = index - lastRowStartIndex;\r\n const itemsInLastRow = count - lastRowStartIndex;\r\n\r\n if (itemsInLastRow === 1) {\r\n // Last row has 1 item: center it at columns 3-4 (span 2 in middle)\r\n return { gridColumn: '3 / 5' };\r\n } else if (itemsInLastRow === 2) {\r\n // Last row has 2 items: center them symmetrically\r\n if (positionInLastRow === 0) {\r\n return { gridColumn: '2 / 4' }; // First button: cols 2-3\r\n } else {\r\n return { gridColumn: '4 / 6' }; // Second button: cols 4-5\r\n }\r\n } else {\r\n // Last row has 3 items: normal span 2\r\n return { gridColumn: 'span 2 / span 2' };\r\n }\r\n };\r\n\r\n return (\r\n <div className={cn(\r\n 'grid gap-3 w-full grid-cols-6',\r\n appearance.containerClassName\r\n )}>\r\n {providers.map((provider, index) => (\r\n <AuthOAuthButton\r\n key={provider}\r\n provider={provider}\r\n onClick={onClick}\r\n disabled={disabled}\r\n loading={loading === provider}\r\n displayMode={getDisplayMode()}\r\n style={getGridColumnStyle(index)}\r\n className={appearance.buttonClassName}\r\n />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport {\r\n useRef,\r\n KeyboardEvent,\r\n ClipboardEvent,\r\n ChangeEvent,\r\n} from 'react';\r\nimport { cn } from '../../lib/utils';\r\nimport type { AuthVerificationCodeInputProps } from '../../types';\r\n\r\n/**\r\n * 6-digit verification code input component with auto-focus and paste support.\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * const [code, setCode] = useState('');\r\n *\r\n * <AuthVerificationCodeInput\r\n * email=\"user@example.com\"\r\n * value={code}\r\n * onChange={setCode}\r\n * />\r\n * \r\n * // With custom styling\r\n * <AuthVerificationCodeInput\r\n * email=\"user@example.com\"\r\n * value={code}\r\n * onChange={setCode}\r\n * appearance={{\r\n * inputClassName: \"border-blue-500\"\r\n * }}\r\n * />\r\n * ```\r\n * \r\n * @param {string} email - Email address to display in instructions\r\n * @param {string} value - Current code value\r\n * @param {function} onChange - Code change handler\r\n * @param {number} [length=6] - Number of digits\r\n * @param {boolean} [disabled] - Disabled state\r\n * @param {object} [appearance] - Tailwind CSS classes for styling\r\n * - `appearance.containerClassName`: Container element\r\n * - `appearance.inputClassName`: Input elements\r\n */\r\nexport function AuthVerificationCodeInput({\r\n length = 6,\r\n value,\r\n email,\r\n onChange,\r\n disabled = false,\r\n appearance = {},\r\n}: AuthVerificationCodeInputProps) {\r\n const inputRefs = useRef<(HTMLInputElement | null)[]>([]);\r\n\r\n const handleChange = (index: number, digit: string) => {\r\n // Only allow single digits\r\n if (digit.length > 1) return;\r\n\r\n // Only allow numbers\r\n if (digit && !/^\\d$/.test(digit)) return;\r\n\r\n // Update the value\r\n const newValue = value.split('');\r\n newValue[index] = digit;\r\n const updatedValue = newValue.join('');\r\n onChange(updatedValue);\r\n\r\n // Auto-focus next input if digit was entered\r\n if (digit && index < length - 1) {\r\n inputRefs.current[index + 1]?.focus();\r\n }\r\n };\r\n\r\n const handleKeyDown = (index: number, e: KeyboardEvent<HTMLInputElement>) => {\r\n // Handle backspace\r\n if (e.key === 'Backspace') {\r\n if (!value[index] && index > 0) {\r\n // If current input is empty, focus previous input\r\n inputRefs.current[index - 1]?.focus();\r\n } else {\r\n // Clear current input\r\n handleChange(index, '');\r\n }\r\n }\r\n // Handle arrow keys\r\n else if (e.key === 'ArrowLeft' && index > 0) {\r\n inputRefs.current[index - 1]?.focus();\r\n } else if (e.key === 'ArrowRight' && index < length - 1) {\r\n inputRefs.current[index + 1]?.focus();\r\n }\r\n };\r\n\r\n const handlePaste = (e: ClipboardEvent<HTMLInputElement>) => {\r\n e.preventDefault();\r\n const pastedData = e.clipboardData.getData('text/plain').trim();\r\n\r\n // Only paste if it's all digits and correct length\r\n if (/^\\d+$/.test(pastedData) && pastedData.length === length) {\r\n onChange(pastedData);\r\n // Focus last input\r\n inputRefs.current[length - 1]?.focus();\r\n }\r\n };\r\n\r\n return (\r\n <div className={cn(\r\n 'flex flex-col justify-center items-center gap-6',\r\n appearance.containerClassName\r\n )}>\r\n <p className=\"text-sm font-normal text-[#525252] leading-5\">\r\n We've sent a verification code to your inbox at{' '}\r\n <span className=\"text-sm font-semibold text-black leading-5\">{email}</span>.\r\n Enter it below to proceed.\r\n </p>\r\n <div className=\"flex flex-row gap-3 justify-center items-center\">\r\n {Array.from({ length }).map((_, index) => (\r\n <input\r\n key={index}\r\n ref={(el) => {\r\n inputRefs.current[index] = el;\r\n }}\r\n type=\"text\"\r\n inputMode=\"numeric\"\r\n maxLength={1}\r\n value={value[index] || ''}\r\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\r\n handleChange(index, e.target.value)\r\n }\r\n onKeyDown={(e: KeyboardEvent<HTMLInputElement>) =>\r\n handleKeyDown(index, e)\r\n }\r\n onPaste={handlePaste}\r\n disabled={disabled}\r\n className={cn(\r\n 'w-full h-12 px-3 py-2 rounded border border-[#E0E0E0] bg-white',\r\n 'text-center text-base font-semibold leading-5 text-black',\r\n 'transition-all duration-200 outline-none',\r\n 'focus:border-black focus:shadow-[0_0_0_2px_rgba(0,0,0,0.1)]',\r\n 'disabled:bg-[#F5F5F5] disabled:cursor-not-allowed disabled:opacity-60',\r\n appearance.inputClassName\r\n )}\r\n autoComplete=\"one-time-code\"\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport {\r\n AuthContainer,\r\n AuthHeader,\r\n AuthErrorBanner,\r\n AuthFormField,\r\n AuthPasswordField,\r\n AuthSubmitButton,\r\n AuthLink,\r\n AuthDivider,\r\n AuthOAuthProviders,\r\n} from '../atoms';\r\nimport type { SignInFormProps } from '../../types';\r\n\r\n/**\r\n * Pre-built sign-in form component (UI only, no business logic).\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * const [email, setEmail] = useState('');\r\n * const [password, setPassword] = useState('');\r\n * const [error, setError] = useState('');\r\n * const [loading, setLoading] = useState(false);\r\n *\r\n * const handleSubmit = async (e) => {\r\n * e.preventDefault();\r\n * setLoading(true);\r\n * try {\r\n * await authService.signIn(email, password);\r\n * } catch (err) {\r\n * setError(err.message);\r\n * } finally {\r\n * setLoading(false);\r\n * }\r\n * };\r\n *\r\n * <SignInForm\r\n * email={email}\r\n * password={password}\r\n * onEmailChange={setEmail}\r\n * onPasswordChange={setPassword}\r\n * onSubmit={handleSubmit}\r\n * error={error}\r\n * loading={loading}\r\n * />\r\n * ```\r\n */\r\nexport function SignInForm({\r\n email,\r\n password,\r\n onEmailChange,\r\n onPasswordChange,\r\n onSubmit,\r\n error,\r\n loading = false,\r\n oauthLoading = null,\r\n availableProviders = [],\r\n onOAuthClick,\r\n emailAuthConfig,\r\n appearance = {},\r\n title = 'Welcome Back',\r\n subtitle = 'Login to your account',\r\n emailLabel = 'Email',\r\n emailPlaceholder = 'example@email.com',\r\n passwordLabel = 'Password',\r\n passwordPlaceholder = '••••••',\r\n forgotPasswordText = 'Forget Password?',\r\n forgotPasswordUrl,\r\n submitButtonText = 'Sign In',\r\n loadingButtonText = 'Signing in...',\r\n signUpText = \"Don't have an account?\",\r\n signUpLinkText = 'Sign Up Now',\r\n signUpUrl = '/sign-up',\r\n dividerText = 'or',\r\n}: SignInFormProps) {\r\n return (\r\n <AuthContainer \r\n appearance={{\r\n containerClassName: appearance.container,\r\n cardClassName: appearance.card,\r\n }}\r\n >\r\n <AuthHeader \r\n title={title} \r\n subtitle={subtitle}\r\n appearance={{\r\n containerClassName: appearance.header?.container,\r\n titleClassName: appearance.header?.title,\r\n subtitleClassName: appearance.header?.subtitle,\r\n }}\r\n />\r\n\r\n <AuthErrorBanner \r\n error={error || ''} \r\n className={appearance.errorBanner}\r\n />\r\n\r\n <form\r\n onSubmit={onSubmit}\r\n noValidate\r\n className={appearance.form?.container || 'flex flex-col items-stretch justify-center gap-6'}\r\n >\r\n <AuthFormField\r\n id=\"email\"\r\n type=\"email\"\r\n label={emailLabel}\r\n placeholder={emailPlaceholder}\r\n value={email}\r\n onChange={(e) => onEmailChange(e.target.value)}\r\n required\r\n autoComplete=\"email\"\r\n appearance={{\r\n containerClassName: appearance.form?.emailField?.container,\r\n labelClassName: appearance.form?.emailField?.label,\r\n inputClassName: appearance.form?.emailField?.input,\r\n }}\r\n />\r\n\r\n <AuthPasswordField\r\n id=\"password\"\r\n label={passwordLabel}\r\n placeholder={passwordPlaceholder}\r\n value={password}\r\n onChange={(e) => onPasswordChange(e.target.value)}\r\n required\r\n autoComplete=\"current-password\"\r\n emailAuthConfig={emailAuthConfig}\r\n forgotPasswordLink={forgotPasswordUrl ? {\r\n href: forgotPasswordUrl,\r\n text: forgotPasswordText,\r\n } : undefined}\r\n appearance={{\r\n containerClassName: appearance.form?.passwordField?.container,\r\n labelClassName: appearance.form?.passwordField?.label,\r\n inputClassName: appearance.form?.passwordField?.input,\r\n }}\r\n />\r\n\r\n <AuthSubmitButton\r\n isLoading={loading}\r\n disabled={loading || oauthLoading !== null}\r\n className={appearance.button}\r\n >\r\n {loading ? loadingButtonText : submitButtonText}\r\n </AuthSubmitButton>\r\n </form>\r\n\r\n <AuthLink \r\n text={signUpText} \r\n linkText={signUpLinkText} \r\n href={signUpUrl}\r\n appearance={{\r\n containerClassName: appearance.link?.container,\r\n linkClassName: appearance.link?.link,\r\n }}\r\n />\r\n\r\n {availableProviders.length > 0 && onOAuthClick && (\r\n <>\r\n <AuthDivider \r\n text={dividerText} \r\n className={appearance.divider}\r\n />\r\n <AuthOAuthProviders\r\n providers={availableProviders}\r\n onClick={onOAuthClick}\r\n disabled={loading || oauthLoading !== null}\r\n loading={oauthLoading}\r\n appearance={{\r\n containerClassName: appearance.oauth?.container,\r\n buttonClassName: appearance.oauth?.button,\r\n }}\r\n />\r\n </>\r\n )}\r\n </AuthContainer>\r\n );\r\n}\r\n\r\n","\"use client\";\r\n\r\nimport { useState, FormEvent } from \"react\";\r\nimport { createClient } from \"@insforge/sdk\";\r\nimport type { OAuthProvidersSchema } from \"@insforge/shared-schemas\";\r\nimport { useInsforge } from \"../provider/InsforgeProvider\";\r\nimport { usePublicAuthConfig } from \"../hooks/usePublicAuthConfig\";\r\nimport { SignInForm } from \"./forms/SignInForm\";\r\nimport type { SignInProps } from \"../types\";\r\n\r\n/**\r\n * Pre-built sign-in component with full authentication logic.\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * <SignIn afterSignInUrl=\"/dashboard\" />\r\n *\r\n * // With custom callbacks\r\n * <SignIn\r\n * onSuccess={(user) => console.log('Signed in:', user)}\r\n * onError={(error) => console.error('Error:', error)}\r\n * />\r\n * ```\r\n */\r\nexport function SignIn({\r\n afterSignInUrl = \"/\",\r\n onSuccess,\r\n onError,\r\n onRedirect,\r\n ...uiProps\r\n}: SignInProps) {\r\n const { signIn, baseUrl } = useInsforge();\r\n const { emailConfig } = usePublicAuthConfig();\r\n const [email, setEmail] = useState(\"\");\r\n const [password, setPassword] = useState(\"\");\r\n const [error, setError] = useState(\"\");\r\n const [loading, setLoading] = useState(false);\r\n const [oauthLoading, setOauthLoading] = useState<OAuthProvidersSchema | null>(\r\n null\r\n );\r\n\r\n // Memoized SDK client\r\n const [insforge] = useState(() => createClient({ baseUrl }));\r\n\r\n async function handleSubmit(e: FormEvent<HTMLFormElement>) {\r\n e.preventDefault();\r\n setLoading(true);\r\n setError(\"\");\r\n\r\n try {\r\n const result = await signIn(email, password);\r\n if (\"error\" in result) {\r\n throw new Error(result.error);\r\n }\r\n const { user, accessToken } = result;\r\n\r\n if (onSuccess) {\r\n if (user) onSuccess(user, accessToken || \"\");\r\n }\r\n\r\n // Redirect\r\n if (onRedirect) {\r\n onRedirect(afterSignInUrl);\r\n } else {\r\n window.location.href = afterSignInUrl;\r\n }\r\n } catch (err: any) {\r\n const errorMessage = err.message || \"Sign in failed\";\r\n setError(errorMessage);\r\n if (onError) onError(new Error(errorMessage));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }\r\n\r\n async function handleOAuth(provider: OAuthProvidersSchema) {\r\n try {\r\n setOauthLoading(provider);\r\n setError(\"\");\r\n\r\n const redirectTo = `${window.location.origin}/auth/callback`;\r\n sessionStorage.setItem(\"oauth_final_destination\", afterSignInUrl || \"/\");\r\n\r\n await insforge.auth.signInWithOAuth({\r\n provider,\r\n redirectTo,\r\n });\r\n\r\n // Browser will redirect automatically\r\n } catch (err: any) {\r\n const errorMessage = err.message || `${provider} sign in failed`;\r\n setError(errorMessage);\r\n if (onError) onError(new Error(errorMessage));\r\n setOauthLoading(null);\r\n }\r\n }\r\n\r\n // If email auth is disabled after loading, don't show the form\r\n if (!emailConfig) {\r\n return null;\r\n }\r\n\r\n return (\r\n <SignInForm\r\n email={email}\r\n password={password}\r\n onEmailChange={setEmail}\r\n onPasswordChange={setPassword}\r\n onSubmit={handleSubmit}\r\n error={error}\r\n loading={loading}\r\n oauthLoading={oauthLoading}\r\n availableProviders={emailConfig?.oAuthProviders || []}\r\n onOAuthClick={handleOAuth}\r\n emailAuthConfig={emailConfig}\r\n {...uiProps}\r\n />\r\n );\r\n}\r\n","'use client';\r\n\r\nimport {\r\n AuthContainer,\r\n AuthHeader,\r\n AuthErrorBanner,\r\n AuthFormField,\r\n AuthPasswordField,\r\n AuthSubmitButton,\r\n AuthLink,\r\n AuthDivider,\r\n AuthOAuthProviders,\r\n} from '../atoms';\r\nimport type { SignUpFormProps } from '../../types';\r\n\r\n/**\r\n * Pre-built sign-up form component (UI only, no business logic).\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * const [email, setEmail] = useState('');\r\n * const [password, setPassword] = useState('');\r\n * const [error, setError] = useState('');\r\n * const [loading, setLoading] = useState(false);\r\n *\r\n * const handleSubmit = async (e) => {\r\n * e.preventDefault();\r\n * setLoading(true);\r\n * try {\r\n * await authService.signUp(email, password);\r\n * } catch (err) {\r\n * setError(err.message);\r\n * } finally {\r\n * setLoading(false);\r\n * }\r\n * };\r\n *\r\n * <SignUpForm\r\n * email={email}\r\n * password={password}\r\n * onEmailChange={setEmail}\r\n * onPasswordChange={setPassword}\r\n * onSubmit={handleSubmit}\r\n * error={error}\r\n * loading={loading}\r\n * />\r\n * ```\r\n */\r\nexport function SignUpForm({\r\n email,\r\n password,\r\n onEmailChange,\r\n onPasswordChange,\r\n onSubmit,\r\n error,\r\n loading = false,\r\n oauthLoading = null,\r\n availableProviders = [],\r\n onOAuthClick,\r\n emailAuthConfig,\r\n appearance = {},\r\n title = 'Get Started',\r\n subtitle = 'Create your account',\r\n emailLabel = 'Email',\r\n emailPlaceholder = 'example@email.com',\r\n passwordLabel = 'Password',\r\n passwordPlaceholder = '••••••',\r\n submitButtonText = 'Sign Up',\r\n loadingButtonText = 'Creating account...',\r\n signInText = 'Already have an account?',\r\n signInLinkText = 'Login Now',\r\n signInUrl = '/sign-in',\r\n dividerText = 'or',\r\n}: SignUpFormProps) {\r\n return (\r\n <AuthContainer \r\n appearance={{\r\n containerClassName: appearance.container,\r\n cardClassName: appearance.card,\r\n }}\r\n >\r\n <AuthHeader \r\n title={title} \r\n subtitle={subtitle}\r\n appearance={{\r\n containerClassName: appearance.header?.container,\r\n titleClassName: appearance.header?.title,\r\n subtitleClassName: appearance.header?.subtitle,\r\n }}\r\n />\r\n\r\n <AuthErrorBanner \r\n error={error || ''} \r\n className={appearance.errorBanner}\r\n />\r\n\r\n <form\r\n onSubmit={onSubmit}\r\n noValidate\r\n className={appearance.form?.container || 'flex flex-col items-stretch justify-center gap-6'}\r\n >\r\n <AuthFormField\r\n id=\"email\"\r\n type=\"email\"\r\n label={emailLabel}\r\n placeholder={emailPlaceholder}\r\n value={email}\r\n onChange={(e) => onEmailChange(e.target.value)}\r\n required\r\n autoComplete=\"email\"\r\n appearance={{\r\n containerClassName: appearance.form?.emailField?.container,\r\n labelClassName: appearance.form?.emailField?.label,\r\n inputClassName: appearance.form?.emailField?.input,\r\n }}\r\n />\r\n\r\n <AuthPasswordField\r\n id=\"password\"\r\n label={passwordLabel}\r\n placeholder={passwordPlaceholder}\r\n value={password}\r\n onChange={(e) => onPasswordChange(e.target.value)}\r\n required\r\n minLength={emailAuthConfig.passwordMinLength}\r\n autoComplete=\"new-password\"\r\n showStrengthIndicator\r\n emailAuthConfig={emailAuthConfig}\r\n appearance={{\r\n containerClassName: appearance.form?.passwordField?.container,\r\n labelClassName: appearance.form?.passwordField?.label,\r\n inputClassName: appearance.form?.passwordField?.input,\r\n }}\r\n />\r\n\r\n <AuthSubmitButton\r\n isLoading={loading}\r\n disabled={loading || oauthLoading !== null}\r\n className={appearance.button}\r\n >\r\n {loading ? loadingButtonText : submitButtonText}\r\n </AuthSubmitButton>\r\n </form>\r\n\r\n <AuthLink \r\n text={signInText} \r\n linkText={signInLinkText} \r\n href={signInUrl}\r\n appearance={{\r\n containerClassName: appearance.link?.container,\r\n linkClassName: appearance.link?.link,\r\n }}\r\n />\r\n\r\n {availableProviders.length > 0 && onOAuthClick && (\r\n <>\r\n <AuthDivider \r\n text={dividerText} \r\n className={appearance.divider}\r\n />\r\n <AuthOAuthProviders\r\n providers={availableProviders}\r\n onClick={onOAuthClick}\r\n disabled={loading || oauthLoading !== null}\r\n loading={oauthLoading}\r\n appearance={{\r\n containerClassName: appearance.oauth?.container,\r\n buttonClassName: appearance.oauth?.button,\r\n }}\r\n />\r\n </>\r\n )}\r\n </AuthContainer>\r\n );\r\n}\r\n\r\n","\"use client\";\r\n\r\nimport { useState, FormEvent } from \"react\";\r\nimport { createClient } from \"@insforge/sdk\";\r\nimport type { OAuthProvidersSchema } from \"@insforge/shared-schemas\";\r\nimport { useInsforge } from \"../provider/InsforgeProvider\";\r\nimport { usePublicAuthConfig } from \"../hooks/usePublicAuthConfig\";\r\nimport { SignUpForm } from \"./forms/SignUpForm\";\r\nimport { validatePasswordStrength } from \"./atoms/AuthPasswordStrengthIndicator\";\r\nimport type { SignUpProps } from \"../types\";\r\n\r\n/**\r\n * Pre-built sign-up component with full authentication logic.\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * <SignUp afterSignUpUrl=\"/onboarding\" />\r\n *\r\n * // With custom callbacks\r\n * <SignUp\r\n * onSuccess={(user) => console.log('Signed up:', user)}\r\n * onError={(error) => console.error('Error:', error)}\r\n * />\r\n * ```\r\n */\r\nexport function SignUp({\r\n afterSignUpUrl = \"/\",\r\n onSuccess,\r\n onError,\r\n onRedirect,\r\n ...uiProps\r\n}: SignUpProps) {\r\n const { signUp, baseUrl } = useInsforge();\r\n const { emailConfig } = usePublicAuthConfig();\r\n const [email, setEmail] = useState(\"\");\r\n const [password, setPassword] = useState(\"\");\r\n const [error, setError] = useState(\"\");\r\n const [loading, setLoading] = useState(false);\r\n const [oauthLoading, setOauthLoading] = useState<OAuthProvidersSchema | null>(\r\n null\r\n );\r\n\r\n // Memoized SDK client\r\n const [insforge] = useState(() => createClient({ baseUrl }));\r\n\r\n async function handleSubmit(e: FormEvent<HTMLFormElement>) {\r\n e.preventDefault();\r\n setLoading(true);\r\n setError(\"\");\r\n\r\n // Validate password strength\r\n if (emailConfig && !validatePasswordStrength(password, emailConfig)) {\r\n setError(\"Password does not meet all requirements\");\r\n setLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n const result = await signUp(email, password);\r\n if (\"error\" in result) {\r\n throw new Error(result.error);\r\n }\r\n const { user, accessToken } = result;\r\n\r\n if (onSuccess) {\r\n if (user) onSuccess(user, accessToken || \"\");\r\n }\r\n\r\n // Redirect\r\n if (onRedirect) {\r\n onRedirect(afterSignUpUrl);\r\n } else {\r\n window.location.href = afterSignUpUrl;\r\n }\r\n } catch (err: any) {\r\n const errorMessage = err.message || \"Sign up failed\";\r\n setError(errorMessage);\r\n if (onError) onError(new Error(errorMessage));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }\r\n\r\n async function handleOAuth(provider: OAuthProvidersSchema) {\r\n try {\r\n setOauthLoading(provider);\r\n setError(\"\");\r\n\r\n const redirectTo = `${window.location.origin}/auth/callback`;\r\n sessionStorage.setItem(\"oauth_final_destination\", afterSignUpUrl || \"/\");\r\n\r\n await insforge.auth.signInWithOAuth({\r\n provider,\r\n redirectTo,\r\n });\r\n\r\n // Browser will redirect automatically\r\n } catch (err: any) {\r\n const errorMessage = err.message || `${provider} sign up failed`;\r\n setError(errorMessage);\r\n if (onError) onError(new Error(errorMessage));\r\n setOauthLoading(null);\r\n }\r\n }\r\n\r\n // If email auth is disabled after loading, don't show the form\r\n if (!emailConfig) {\r\n return null;\r\n }\r\n\r\n return (\r\n <SignUpForm\r\n email={email}\r\n password={password}\r\n onEmailChange={setEmail}\r\n onPasswordChange={setPassword}\r\n onSubmit={handleSubmit}\r\n error={error}\r\n loading={loading}\r\n oauthLoading={oauthLoading}\r\n availableProviders={emailConfig?.oAuthProviders || []}\r\n onOAuthClick={handleOAuth}\r\n emailAuthConfig={emailConfig}\r\n {...uiProps}\r\n />\r\n );\r\n}\r\n","'use client';\r\n\r\nimport { useState, useRef, useEffect } from 'react';\r\nimport { LogOut } from 'lucide-react';\r\nimport { useInsforge } from '../provider/InsforgeProvider';\r\nimport { cn } from '../lib/utils';\r\nimport type { UserButtonProps } from '../types';\r\n\r\n/**\r\n * User profile button with dropdown menu and sign-out functionality.\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * <UserButton afterSignOutUrl=\"/\" />\r\n * \r\n * // Simple mode\r\n * <UserButton mode=\"simple\" />\r\n * \r\n * // With custom styling\r\n * <UserButton\r\n * appearance={{\r\n * buttonClassName: \"hover:bg-white/10\",\r\n * dropdownClassName: \"bg-gray-900\"\r\n * }}\r\n * />\r\n * ```\r\n * \r\n * @param {string} [afterSignOutUrl='/'] - URL to redirect to after sign-out\r\n * @param {'detailed'|'simple'} [mode='detailed'] - Display mode\r\n * @param {object} [appearance] - Custom Tailwind classes\r\n */\r\nexport function UserButton({\r\n afterSignOutUrl = '/',\r\n mode = 'detailed',\r\n appearance = {},\r\n}: UserButtonProps) {\r\n const { user, signOut } = useInsforge();\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [imageError, setImageError] = useState(false);\r\n const dropdownRef = useRef<HTMLDivElement>(null);\r\n\r\n // Validate image URL when avatarUrl changes\r\n useEffect(() => {\r\n setImageError(false);\r\n\r\n const avatarUrl = user?.avatarUrl;\r\n if (!avatarUrl) return;\r\n\r\n const checkImageUrl = async () => {\r\n try {\r\n const response = await fetch(avatarUrl, {\r\n method: 'HEAD',\r\n cache: 'no-cache',\r\n });\r\n if (!response.ok) {\r\n setImageError(true);\r\n }\r\n } catch (error) {\r\n setImageError(true);\r\n }\r\n };\r\n\r\n checkImageUrl();\r\n }, [user?.avatarUrl]);\r\n\r\n useEffect(() => {\r\n function handleClickOutside(event: MouseEvent) {\r\n if (\r\n dropdownRef.current &&\r\n !dropdownRef.current.contains(event.target as Node)\r\n ) {\r\n setIsOpen(false);\r\n }\r\n }\r\n\r\n if (isOpen) {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n }\r\n\r\n return () => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n };\r\n }, [isOpen]);\r\n\r\n async function handleSignOut() {\r\n await signOut();\r\n setIsOpen(false);\r\n window.location.href = afterSignOutUrl;\r\n }\r\n\r\n if (!user) return null;\r\n\r\n const initials = user.name\r\n ? user.name.charAt(0).toUpperCase()\r\n : user.email.split('@')[0].slice(0, 2).toUpperCase();\r\n\r\n return (\r\n <div\r\n className={cn('relative inline-block', appearance.containerClassName)}\r\n ref={dropdownRef}\r\n >\r\n <button\r\n className={cn(\r\n 'p-1 bg-transparent border-0 rounded-full cursor-pointer transition-all duration-200',\r\n 'flex items-center justify-center gap-2',\r\n 'hover:bg-black/5',\r\n mode === 'detailed' && 'rounded-lg p-2',\r\n appearance.buttonClassName\r\n )}\r\n onClick={() => setIsOpen(!isOpen)}\r\n aria-expanded={isOpen}\r\n aria-haspopup=\"true\"\r\n >\r\n <div className=\"flex items-center justify-center w-10 h-10 bg-blue-500 rounded-full\">\r\n {user.avatarUrl && !imageError ? (\r\n <img\r\n src={user.avatarUrl}\r\n alt={user.email}\r\n onError={() => setImageError(true)}\r\n className=\"rounded-full object-cover w-full h-full\"\r\n />\r\n ) : (\r\n <span className=\"text-white font-semibold text-sm\">{initials}</span>\r\n )}\r\n </div>\r\n {mode === 'detailed' && (\r\n <div className=\"flex flex-col items-start gap-0.5\">\r\n {user.name && (\r\n <div\r\n className={cn(\r\n 'text-sm font-semibold text-gray-900 leading-5 text-left',\r\n appearance.nameClassName\r\n )}\r\n >\r\n {user.name}\r\n </div>\r\n )}\r\n <div\r\n className={cn(\r\n 'text-xs text-gray-500 leading-4 text-left',\r\n appearance.emailClassName\r\n )}\r\n >\r\n {user.email}\r\n </div>\r\n </div>\r\n )}\r\n </button>\r\n\r\n {isOpen && (\r\n <div\r\n className={cn(\r\n 'absolute top-full right-0 mt-2 min-w-40',\r\n 'bg-white border border-gray-200 rounded-lg',\r\n 'shadow-lg z-50 overflow-hidden p-1',\r\n appearance.dropdownClassName\r\n )}\r\n >\r\n <button\r\n onClick={handleSignOut}\r\n className=\"flex items-center justify-start gap-2 w-full px-3 py-2 text-sm font-normal text-red-600 bg-transparent border-0 rounded-md cursor-pointer transition-colors hover:bg-red-50 text-left\"\r\n >\r\n <LogOut className=\"w-5 h-5\" />\r\n Sign out\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport { useInsforge } from '../provider/InsforgeProvider';\r\nimport { useEffect } from 'react';\r\nimport type { ProtectProps } from '../types';\r\n\r\n/**\r\n * Protected route component that redirects unauthenticated users.\r\n * \r\n * @component\r\n * @example\r\n * ```tsx\r\n * // Basic usage\r\n * <Protect redirectTo=\"/sign-in\">\r\n * <Dashboard />\r\n * </Protect>\r\n * \r\n * // With custom redirect handler (e.g., for Next.js router)\r\n * <Protect \r\n * redirectTo=\"/sign-in\"\r\n * onRedirect={(url) => router.push(url)}\r\n * >\r\n * <AdminPanel />\r\n * </Protect>\r\n * \r\n * // With custom condition (role-based access)\r\n * <Protect\r\n * redirectTo=\"/unauthorized\"\r\n * condition={(user) => user.role === 'admin'}\r\n * >\r\n * <AdminContent />\r\n * </Protect>\r\n * ```\r\n * \r\n * @param {ReactNode} children - Content to protect\r\n * @param {ReactNode} [fallback] - Fallback UI while loading\r\n * @param {string} [redirectTo='/sign-in'] - Redirect URL\r\n * @param {function} [condition] - Custom access condition\r\n * @param {function} [onRedirect] - Custom redirect handler (default: window.location)\r\n */\r\nexport function Protect({\r\n children,\r\n fallback,\r\n redirectTo = '/sign-in',\r\n condition,\r\n onRedirect,\r\n}: ProtectProps) {\r\n const { isSignedIn, isLoaded, user } = useInsforge();\r\n\r\n useEffect(() => {\r\n if (isLoaded && !isSignedIn) {\r\n // Redirect if not signed in\r\n if (onRedirect) {\r\n onRedirect(redirectTo);\r\n } else {\r\n window.location.href = redirectTo;\r\n }\r\n } else if (isLoaded && isSignedIn && condition && user) {\r\n // Check custom condition\r\n if (!condition(user)) {\r\n if (onRedirect) {\r\n onRedirect(redirectTo);\r\n } else {\r\n window.location.href = redirectTo;\r\n }\r\n }\r\n }\r\n }, [isLoaded, isSignedIn, redirectTo, condition, user, onRedirect]);\r\n\r\n // Show fallback while loading\r\n if (!isLoaded) {\r\n return fallback || <div className=\"insforge-loading\">Loading...</div>;\r\n }\r\n\r\n // Don't render if not signed in\r\n if (!isSignedIn) {\r\n return fallback || null;\r\n }\r\n\r\n // Don't render if condition fails\r\n if (condition && user && !condition(user)) {\r\n return fallback || null;\r\n }\r\n\r\n return <>{children}</>;\r\n}\r\n\r\n","'use client';\r\n\r\nimport { useInsforge } from '../provider/InsforgeProvider';\r\nimport type { ConditionalProps } from '../types';\r\n\r\n/**\r\n * Conditional component that renders children only when user is signed in.\r\n * \r\n * @component\r\n * @example\r\n * ```tsx\r\n * <SignedIn>\r\n * <Dashboard />\r\n * </SignedIn>\r\n * ```\r\n * \r\n * @param {ReactNode} children - React nodes to render when user is authenticated\r\n * @returns {JSX.Element | null} Renders children when signed in, null otherwise\r\n */\r\nexport function SignedIn({ children }: ConditionalProps) {\r\n const { isSignedIn, isLoaded } = useInsforge();\r\n\r\n if (!isLoaded) return null;\r\n if (!isSignedIn) return null;\r\n\r\n return <>{children}</>;\r\n}\r\n\r\n","'use client';\r\n\r\nimport { useInsforge } from '../provider/InsforgeProvider';\r\nimport type { ConditionalProps } from '../types';\r\n\r\n/**\r\n * Conditional component that renders children only when user is signed out.\r\n * \r\n * @component\r\n * @example\r\n * ```tsx\r\n * <SignedOut>\r\n * <SignIn />\r\n * </SignedOut>\r\n * ```\r\n * \r\n * @param {ReactNode} children - React nodes to render when user is not authenticated\r\n * @returns {JSX.Element | null} Renders children when signed out, null otherwise\r\n */\r\nexport function SignedOut({ children }: ConditionalProps) {\r\n const { isSignedIn, isLoaded } = useInsforge();\r\n\r\n if (!isLoaded) return null;\r\n if (isSignedIn) return null;\r\n\r\n return <>{children}</>;\r\n}\r\n\r\n","'use client';\r\n\r\nimport { useEffect, useRef, type ReactNode } from 'react';\r\nimport { useInsforge } from '../provider/InsforgeProvider';\r\n\r\nexport interface InsforgeCallbackProps {\r\n /**\r\n * Redirect destination after successful authentication\r\n */\r\n redirectTo?: string;\r\n \r\n /**\r\n * Callback fired on successful authentication\r\n */\r\n onSuccess?: () => void;\r\n \r\n /**\r\n * Callback fired on authentication error\r\n */\r\n onError?: (error: string) => void;\r\n \r\n /**\r\n * Custom loading component\r\n */\r\n loadingComponent?: ReactNode;\r\n \r\n /**\r\n * Custom redirect handler (default: window.location)\r\n */\r\n onRedirect?: (url: string) => void;\r\n}\r\n\r\n/**\r\n * InsforgeCallback - Handles OAuth and email/password authentication callbacks\r\n * \r\n * Place this component on your `/auth/callback` page.\r\n * \r\n * @example\r\n * ```tsx\r\n * // Minimal usage\r\n * export default function CallbackPage() {\r\n * return <InsforgeCallback />;\r\n * }\r\n * ```\r\n * \r\n * @example\r\n * ```tsx\r\n * // With Next.js router\r\n * import { useRouter } from 'next/navigation';\r\n * \r\n * export default function CallbackPage() {\r\n * const router = useRouter();\r\n * return (\r\n * <InsforgeCallback\r\n * redirectTo=\"/dashboard\"\r\n * onRedirect={(url) => router.push(url)}\r\n * />\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function InsforgeCallback({\r\n redirectTo,\r\n onSuccess,\r\n onError,\r\n loadingComponent,\r\n onRedirect,\r\n}: InsforgeCallbackProps) {\r\n const isProcessingRef = useRef(false);\r\n const { reloadAuth } = useInsforge();\r\n\r\n useEffect(() => {\r\n const processCallback = async () => {\r\n // Prevent double-processing\r\n if (isProcessingRef.current) return;\r\n isProcessingRef.current = true;\r\n\r\n // Get search params\r\n const searchParams = new URLSearchParams(window.location.search);\r\n\r\n // Check for error from backend\r\n const error = searchParams.get('error');\r\n if (error) {\r\n if (onError) {\r\n onError(error);\r\n } else {\r\n const errorUrl = '/?error=' + encodeURIComponent(error);\r\n if (onRedirect) {\r\n onRedirect(errorUrl);\r\n } else {\r\n window.location.href = errorUrl;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n // Reload auth state\r\n const result = await reloadAuth();\r\n\r\n if (!result.success) {\r\n const errorMsg = result.error || 'authentication_failed';\r\n if (onError) {\r\n onError(errorMsg);\r\n } else {\r\n const errorUrl = '/?error=' + encodeURIComponent(errorMsg);\r\n if (onRedirect) {\r\n onRedirect(errorUrl);\r\n } else {\r\n window.location.href = errorUrl;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n // Authentication successful!\r\n // Clean URL\r\n window.history.replaceState({}, '', window.location.pathname);\r\n\r\n // Fire success callback\r\n if (onSuccess) {\r\n onSuccess();\r\n }\r\n\r\n // Get destination and redirect\r\n const destination = \r\n redirectTo || \r\n sessionStorage.getItem('auth_destination') || \r\n sessionStorage.getItem('oauth_final_destination') || \r\n '/';\r\n \r\n sessionStorage.removeItem('auth_destination');\r\n sessionStorage.removeItem('oauth_final_destination');\r\n\r\n if (onRedirect) {\r\n onRedirect(destination);\r\n } else {\r\n window.location.href = destination;\r\n }\r\n };\r\n\r\n processCallback();\r\n }, []); // Empty deps - run once\r\n\r\n const defaultLoading = (\r\n <div className=\"flex items-center justify-center min-h-screen\">\r\n <div className=\"text-center\">\r\n <h2 className=\"text-2xl font-semibold mb-4\">Completing authentication...</h2>\r\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto\"></div>\r\n </div>\r\n </div>\r\n );\r\n\r\n return loadingComponent || defaultLoading;\r\n}\r\n\r\n","'use client';\r\n\r\nimport {\r\n AuthContainer,\r\n AuthHeader,\r\n AuthErrorBanner,\r\n AuthFormField,\r\n AuthSubmitButton,\r\n AuthLink,\r\n} from '../atoms';\r\nimport type { ForgotPasswordFormProps } from '../../types';\r\n\r\n/**\r\n * Pre-built forgot password form component (UI only, no business logic).\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * const [email, setEmail] = useState('');\r\n * const [error, setError] = useState('');\r\n * const [loading, setLoading] = useState(false);\r\n * const [success, setSuccess] = useState(false);\r\n *\r\n * const handleSubmit = async (e) => {\r\n * e.preventDefault();\r\n * setLoading(true);\r\n * try {\r\n * await authService.sendResetPasswordCode({ email });\r\n * setSuccess(true);\r\n * } catch (err) {\r\n * setError(err.message);\r\n * } finally {\r\n * setLoading(false);\r\n * }\r\n * };\r\n *\r\n * <ForgotPasswordForm\r\n * email={email}\r\n * onEmailChange={setEmail}\r\n * onSubmit={handleSubmit}\r\n * error={error}\r\n * loading={loading}\r\n * success={success}\r\n * />\r\n * ```\r\n */\r\nexport function ForgotPasswordForm({\r\n email,\r\n onEmailChange,\r\n onSubmit,\r\n error,\r\n loading = false,\r\n success = false,\r\n appearance = {},\r\n title = 'Forgot Password?',\r\n subtitle = \"Enter your email address and we'll send you a code to reset your password.\",\r\n emailLabel = 'Email',\r\n emailPlaceholder = 'example@email.com',\r\n submitButtonText = 'Send Reset Code',\r\n loadingButtonText = 'Sending...',\r\n backToSignInText = 'Remember your password?',\r\n backToSignInUrl = '/sign-in',\r\n successTitle = 'Check Your Email',\r\n successMessage,\r\n}: ForgotPasswordFormProps) {\r\n if (success) {\r\n return (\r\n <AuthContainer \r\n appearance={{\r\n containerClassName: appearance.container,\r\n cardClassName: appearance.card,\r\n }}\r\n >\r\n <div className=\"flex flex-col items-center gap-4\">\r\n <div className=\"w-16 h-16 rounded-full bg-green-100 dark:bg-green-900 flex items-center justify-center\">\r\n <svg className=\"w-8 h-8 text-green-600 dark:text-green-400\" fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n </div>\r\n <h2 className=\"text-2xl font-semibold text-black dark:text-white text-center\">{successTitle}</h2>\r\n <p className=\"text-sm text-neutral-600 dark:text-neutral-400 text-center\">\r\n {successMessage || `We've sent a password reset link to ${email}. Please check your email and follow the instructions.`}\r\n </p>\r\n <a href={backToSignInUrl} className=\"mt-4 text-black dark:text-white font-medium\">\r\n Back to Sign In\r\n </a>\r\n </div>\r\n </AuthContainer>\r\n );\r\n }\r\n\r\n return (\r\n <AuthContainer \r\n appearance={{\r\n containerClassName: appearance.container,\r\n cardClassName: appearance.card,\r\n }}\r\n >\r\n <AuthHeader \r\n title={title} \r\n subtitle={subtitle}\r\n appearance={{\r\n containerClassName: appearance.header?.container,\r\n titleClassName: appearance.header?.title,\r\n subtitleClassName: appearance.header?.subtitle,\r\n }}\r\n />\r\n\r\n <AuthErrorBanner \r\n error={error || ''} \r\n className={appearance.errorBanner}\r\n />\r\n\r\n <form\r\n onSubmit={onSubmit}\r\n noValidate\r\n className={appearance.form?.container || 'flex flex-col items-stretch justify-center gap-6'}\r\n >\r\n <AuthFormField\r\n id=\"email\"\r\n type=\"email\"\r\n label={emailLabel}\r\n placeholder={emailPlaceholder}\r\n value={email}\r\n onChange={(e) => onEmailChange(e.target.value)}\r\n required\r\n autoComplete=\"email\"\r\n appearance={{\r\n containerClassName: appearance.form?.emailField?.container,\r\n labelClassName: appearance.form?.emailField?.label,\r\n inputClassName: appearance.form?.emailField?.input,\r\n }}\r\n />\r\n\r\n <AuthSubmitButton\r\n isLoading={loading}\r\n disabled={loading}\r\n className={appearance.button}\r\n >\r\n {loading ? loadingButtonText : submitButtonText}\r\n </AuthSubmitButton>\r\n </form>\r\n\r\n <AuthLink \r\n text={backToSignInText} \r\n linkText=\"Back to Sign In\" \r\n href={backToSignInUrl}\r\n appearance={{\r\n containerClassName: appearance.link?.container,\r\n linkClassName: appearance.link?.link,\r\n }}\r\n />\r\n </AuthContainer>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport {\r\n AuthContainer,\r\n AuthHeader,\r\n AuthErrorBanner,\r\n AuthPasswordField,\r\n AuthSubmitButton,\r\n} from '../atoms';\r\nimport type { ResetPasswordFormProps } from '../../types';\r\n\r\n/**\r\n * Pre-built reset password form component (UI only, no business logic).\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * const [newPassword, setNewPassword] = useState('');\r\n * const [confirmPassword, setConfirmPassword] = useState('');\r\n * const [error, setError] = useState('');\r\n * const [loading, setLoading] = useState(false);\r\n *\r\n * const handleSubmit = async (e) => {\r\n * e.preventDefault();\r\n * if (newPassword !== confirmPassword) {\r\n * setError('Passwords do not match');\r\n * return;\r\n * }\r\n * setLoading(true);\r\n * try {\r\n * await authService.resetPassword({ newPassword, token });\r\n * } catch (err) {\r\n * setError(err.message);\r\n * } finally {\r\n * setLoading(false);\r\n * }\r\n * };\r\n *\r\n * <ResetPasswordForm\r\n * newPassword={newPassword}\r\n * confirmPassword={confirmPassword}\r\n * onNewPasswordChange={setNewPassword}\r\n * onConfirmPasswordChange={setConfirmPassword}\r\n * onSubmit={handleSubmit}\r\n * error={error}\r\n * loading={loading}\r\n * emailAuthConfig={config}\r\n * />\r\n * ```\r\n */\r\nexport function ResetPasswordForm({\r\n newPassword,\r\n confirmPassword,\r\n onNewPasswordChange,\r\n onConfirmPasswordChange,\r\n onSubmit,\r\n error,\r\n loading = false,\r\n emailAuthConfig,\r\n appearance = {},\r\n title = 'Reset Password',\r\n subtitle = 'Enter your new password below.',\r\n newPasswordLabel = 'New Password',\r\n newPasswordPlaceholder = '••••••',\r\n confirmPasswordLabel = 'Confirm Password',\r\n confirmPasswordPlaceholder = '••••••',\r\n submitButtonText = 'Reset Password',\r\n loadingButtonText = 'Resetting...',\r\n backToSignInText = '',\r\n backToSignInUrl = '/sign-in',\r\n}: ResetPasswordFormProps) {\r\n return (\r\n <AuthContainer \r\n appearance={{\r\n containerClassName: appearance.container,\r\n cardClassName: appearance.card,\r\n }}\r\n >\r\n <AuthHeader \r\n title={title} \r\n subtitle={subtitle}\r\n appearance={{\r\n containerClassName: appearance.header?.container,\r\n titleClassName: appearance.header?.title,\r\n subtitleClassName: appearance.header?.subtitle,\r\n }}\r\n />\r\n\r\n <AuthErrorBanner \r\n error={error || ''} \r\n className={appearance.errorBanner}\r\n />\r\n\r\n <form\r\n onSubmit={onSubmit}\r\n noValidate\r\n className={appearance.form?.container || 'flex flex-col items-stretch justify-center gap-6'}\r\n >\r\n <AuthPasswordField\r\n id=\"newPassword\"\r\n label={newPasswordLabel}\r\n placeholder={newPasswordPlaceholder}\r\n value={newPassword}\r\n onChange={(e) => onNewPasswordChange(e.target.value)}\r\n required\r\n autoComplete=\"new-password\"\r\n showStrengthIndicator\r\n emailAuthConfig={emailAuthConfig}\r\n appearance={{\r\n containerClassName: appearance.form?.newPasswordField?.container,\r\n labelClassName: appearance.form?.newPasswordField?.label,\r\n inputClassName: appearance.form?.newPasswordField?.input,\r\n }}\r\n />\r\n\r\n <AuthPasswordField\r\n id=\"confirmPassword\"\r\n label={confirmPasswordLabel}\r\n placeholder={confirmPasswordPlaceholder}\r\n value={confirmPassword}\r\n onChange={(e) => onConfirmPasswordChange(e.target.value)}\r\n required\r\n autoComplete=\"new-password\"\r\n emailAuthConfig={emailAuthConfig}\r\n appearance={{\r\n containerClassName: appearance.form?.confirmPasswordField?.container,\r\n labelClassName: appearance.form?.confirmPasswordField?.label,\r\n inputClassName: appearance.form?.confirmPasswordField?.input,\r\n }}\r\n />\r\n\r\n <AuthSubmitButton\r\n isLoading={loading}\r\n disabled={loading}\r\n className={appearance.button}\r\n >\r\n {loading ? loadingButtonText : submitButtonText}\r\n </AuthSubmitButton>\r\n </form>\r\n\r\n <p className={appearance.backToSignIn || \"text-center text-sm text-gray-600 dark:text-gray-400\"}>\r\n {backToSignInText && <span>{backToSignInText} </span>}\r\n <a href={backToSignInUrl} className=\"text-black dark:text-white font-medium\">\r\n Back to Sign In\r\n </a>\r\n </p>\r\n </AuthContainer>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport { AuthContainer } from '../atoms';\r\nimport type { VerifyEmailStatusProps } from '../../types';\r\n\r\n/**\r\n * Email verification status display component (UI only, no business logic).\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * const [status, setStatus] = useState('verifying');\r\n * const [error, setError] = useState('');\r\n *\r\n * useEffect(() => {\r\n * const verify = async () => {\r\n * try {\r\n * await authService.verifyEmail({ token });\r\n * setStatus('success');\r\n * } catch (err) {\r\n * setError(err.message);\r\n * setStatus('error');\r\n * }\r\n * };\r\n * verify();\r\n * }, [token]);\r\n *\r\n * <VerifyEmailStatus\r\n * status={status}\r\n * error={error}\r\n * />\r\n * ```\r\n */\r\nexport function VerifyEmailStatus({\r\n status,\r\n error,\r\n appearance = {},\r\n verifyingTitle = 'Verifying your email...',\r\n successTitle = 'Email Verified!',\r\n successMessage = 'Your email has been verified successfully. You can close this page and return to your app.',\r\n errorTitle = 'Verification Failed',\r\n}: VerifyEmailStatusProps) {\r\n if (status === 'verifying') {\r\n return (\r\n <AuthContainer appearance={appearance}>\r\n <div className=\"w-full flex flex-col items-center justify-center gap-6\">\r\n <h2 className=\"text-2xl font-semibold text-black dark:text-white\">{verifyingTitle}</h2>\r\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-black dark:border-white\" />\r\n </div>\r\n </AuthContainer>\r\n );\r\n }\r\n\r\n if (status === 'error') {\r\n return (\r\n <AuthContainer appearance={appearance}>\r\n <div className=\"w-full flex flex-col items-stretch justify-center gap-6\">\r\n <div className=\"flex flex-col items-start justify-center gap-2\">\r\n <h1 className=\"text-2xl font-semibold text-black dark:text-white\">{errorTitle}</h1>\r\n <p className=\"text-sm text-neutral-600 dark:text-neutral-400 leading-relaxed\">\r\n {error || 'The verification link is invalid or has expired.'} Please try again or contact support if the problem persists. You can close this page and return to your app.\r\n </p>\r\n </div>\r\n </div>\r\n </AuthContainer>\r\n );\r\n }\r\n\r\n // Success state\r\n return (\r\n <AuthContainer appearance={appearance}>\r\n <div className=\"w-full flex flex-col items-stretch justify-center gap-6\">\r\n <div className=\"flex flex-col items-center gap-4\">\r\n <div className=\"w-16 h-16 rounded-full bg-green-100 dark:bg-green-900 flex items-center justify-center\">\r\n <svg className=\"w-8 h-8 text-green-600 dark:text-green-400\" fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n </div>\r\n <h2 className=\"text-2xl font-semibold text-black dark:text-white text-center\">{successTitle}</h2>\r\n <p className=\"text-sm text-neutral-600 dark:text-neutral-400 text-center\">\r\n {successMessage}\r\n </p>\r\n </div>\r\n </div>\r\n </AuthContainer>\r\n );\r\n}\r\n\r\n","import { useInsforge } from '../provider/InsforgeProvider';\r\n\r\n/**\r\n * Hook to access authentication methods\r\n * \r\n * @returns Object containing:\r\n * - `signIn`: Function to sign in with email and password\r\n * - `signUp`: Function to sign up with email and password\r\n * - `signOut`: Function to sign out the current user\r\n * - `isLoaded`: Boolean indicating if auth state has been loaded\r\n * - `isSignedIn`: Boolean indicating if user is currently signed in\r\n * \r\n * @example\r\n * ```tsx\r\n * function LoginForm() {\r\n * const { signIn, signUp, signOut, isLoaded, isSignedIn } = useAuth();\r\n * \r\n * async function handleLogin(email: string, password: string) {\r\n * try {\r\n * await signIn(email, password);\r\n * // User is now signed in\r\n * } catch (error) {\r\n * console.error('Sign in failed:', error);\r\n * }\r\n * }\r\n * \r\n * if (!isLoaded) return <div>Loading...</div>;\r\n * \r\n * return (\r\n * <form onSubmit={(e) => { e.preventDefault(); handleLogin(email, password); }}>\r\n * {/* form fields *\\/}\r\n * </form>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function useAuth() {\r\n const { signIn, signUp, signOut, isLoaded, isSignedIn } = useInsforge();\r\n return { signIn, signUp, signOut, isLoaded, isSignedIn };\r\n}\r\n\r\n","import { useInsforge } from '../provider/InsforgeProvider';\r\n\r\n/**\r\n * Hook to access current user data\r\n * \r\n * @returns Object containing:\r\n * - `user`: Current user object (InsforgeUser | null)\r\n * - `isLoaded`: Boolean indicating if auth state has been loaded\r\n * - `updateUser`: Function to update user profile data\r\n * - `setUser`: Internal function to manually set user state\r\n * \r\n * @example\r\n * ```tsx\r\n * function UserProfile() {\r\n * const { user, isLoaded, updateUser } = useUser();\r\n * \r\n * if (!isLoaded) return <div>Loading...</div>;\r\n * if (!user) return <div>Not signed in</div>;\r\n * \r\n * async function handleUpdate(name: string) {\r\n * await updateUser({ name });\r\n * }\r\n * \r\n * return (\r\n * <div>\r\n * <p>Email: {user.email}</p>\r\n * {user.name && <p>Name: {user.name}</p>}\r\n * {user.avatarUrl && <img src={user.avatarUrl} alt=\"Avatar\" />}\r\n * </div>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function useUser() {\r\n const { user, isLoaded, updateUser, setUser } = useInsforge();\r\n return { user, isLoaded, updateUser, setUser };\r\n}\r\n\r\n","import { z } from 'zod';\r\n\r\n/**\r\n * Email validation schema\r\n */\r\nexport const emailSchema = z\r\n .string()\r\n .min(1, 'Email is required')\r\n .email('Invalid email address');\r\n\r\n/**\r\n * Password validation schema with configurable requirements\r\n */\r\nexport function createPasswordSchema(options?: {\r\n minLength?: number;\r\n requireUppercase?: boolean;\r\n requireLowercase?: boolean;\r\n requireNumber?: boolean;\r\n requireSpecialChar?: boolean;\r\n}) {\r\n const {\r\n minLength = 6,\r\n requireUppercase = false,\r\n requireLowercase = false,\r\n requireNumber = false,\r\n requireSpecialChar = false,\r\n } = options || {};\r\n\r\n let schema = z.string().min(minLength, `Password must be at least ${minLength} characters`);\r\n\r\n if (requireUppercase) {\r\n schema = schema.regex(/[A-Z]/, 'Password must contain at least one uppercase letter');\r\n }\r\n\r\n if (requireLowercase) {\r\n schema = schema.regex(/[a-z]/, 'Password must contain at least one lowercase letter');\r\n }\r\n\r\n if (requireNumber) {\r\n schema = schema.regex(/\\d/, 'Password must contain at least one number');\r\n }\r\n\r\n if (requireSpecialChar) {\r\n schema = schema.regex(\r\n /[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/,\r\n 'Password must contain at least one special character'\r\n );\r\n }\r\n\r\n return schema;\r\n}\r\n\r\n/**\r\n * Default password schema (minimum 6 characters)\r\n */\r\nexport const passwordSchema = createPasswordSchema();\r\n\r\n/**\r\n * Validate email format\r\n */\r\nexport function validateEmail(email: string): { valid: boolean; error?: string } {\r\n const result = emailSchema.safeParse(email);\r\n if (result.success) {\r\n return { valid: true };\r\n }\r\n return { valid: false, error: result.error.message };\r\n}\r\n\r\n/**\r\n * Validate password format\r\n */\r\nexport function validatePassword(\r\n password: string,\r\n options?: Parameters<typeof createPasswordSchema>[0]\r\n): { valid: boolean; error?: string } {\r\n const schema = createPasswordSchema(options);\r\n const result = schema.safeParse(password);\r\n if (result.success) {\r\n return { valid: true };\r\n }\r\n return { valid: false, error: result.error.message };\r\n}\r\n\r\n/**\r\n * Validate password strength based on multiple criteria\r\n */\r\nexport function checkPasswordStrength(password: string): {\r\n score: number;\r\n feedback: string[];\r\n} {\r\n const feedback: string[] = [];\r\n let score = 0;\r\n\r\n if (password.length >= 8) {\r\n score += 1;\r\n } else {\r\n feedback.push('Use at least 8 characters');\r\n }\r\n\r\n if (password.length >= 12) {\r\n score += 1;\r\n }\r\n\r\n if (/[a-z]/.test(password) && /[A-Z]/.test(password)) {\r\n score += 1;\r\n } else {\r\n feedback.push('Use both uppercase and lowercase letters');\r\n }\r\n\r\n if (/\\d/.test(password)) {\r\n score += 1;\r\n } else {\r\n feedback.push('Include at least one number');\r\n }\r\n\r\n if (/[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/.test(password)) {\r\n score += 1;\r\n } else {\r\n feedback.push('Include at least one special character');\r\n }\r\n\r\n return { score, feedback };\r\n}\r\n\r\n","'use client';\r\n\r\nimport { useEffect } from 'react';\r\nimport type { RouteObject } from 'react-router-dom';\r\nimport { InsforgeCallback } from '../components/InsforgeCallback';\r\n\r\ninterface GetInsforgeRoutesConfig {\r\n /**\r\n * Base URL of your Insforge backend\r\n */\r\n baseUrl: string;\r\n \r\n /**\r\n * Whether to use built-in auth (deployed Insforge Auth)\r\n * When true: redirects to baseUrl/auth/* pages\r\n * When false: no redirect routes are added (use your own components)\r\n * @default true\r\n */\r\n builtInAuth?: boolean;\r\n \r\n /**\r\n * Custom paths for auth routes\r\n * @default {\r\n * signIn: '/sign-in',\r\n * signUp: '/sign-up',\r\n * verifyEmail: '/verify-email',\r\n * forgotPassword: '/forgot-password',\r\n * resetPassword: '/reset-password',\r\n * callback: '/auth/callback'\r\n * }\r\n */\r\n paths?: {\r\n signIn?: string;\r\n signUp?: string;\r\n verifyEmail?: string;\r\n forgotPassword?: string;\r\n resetPassword?: string;\r\n callback?: string;\r\n };\r\n}\r\n\r\n/**\r\n * Helper component for redirecting to external auth\r\n */\r\nfunction RedirectToAuth({ baseUrl, path }: { baseUrl: string; path: string }) {\r\n useEffect(() => {\r\n const callbackUrl = `${window.location.origin}/auth/callback`;\r\n const authUrl = new URL(path, baseUrl);\r\n authUrl.searchParams.set('redirect', callbackUrl);\r\n window.location.replace(authUrl.toString());\r\n }, [baseUrl, path]);\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Generates Insforge authentication routes for React Router.\r\n * \r\n * Returns an array of RouteObjects that can be spread into your router configuration.\r\n * Supports all Insforge auth pages: sign-in, sign-up, verify-email, forgot-password, reset-password.\r\n * \r\n * @param config - Configuration for Insforge routes\r\n * @returns Array of RouteObject for React Router\r\n * \r\n * @example\r\n * ```tsx\r\n * import { createBrowserRouter } from 'react-router-dom';\r\n * import { getInsforgeRoutes } from '@insforge/react';\r\n * \r\n * const router = createBrowserRouter([\r\n * {\r\n * path: '/',\r\n * element: <Home />\r\n * },\r\n * // Add all Insforge auth routes (sign-in, sign-up, verify-email, etc.)\r\n * ...getInsforgeRoutes({\r\n * baseUrl: 'https://your-backend.com',\r\n * builtInAuth: true\r\n * }),\r\n * {\r\n * path: '/dashboard',\r\n * element: <Dashboard />\r\n * }\r\n * ]);\r\n * ```\r\n * \r\n * @example\r\n * ```tsx\r\n * // Don't use built-in auth, use your own components instead\r\n * import { SignIn, SignUp } from '@insforge/react';\r\n * \r\n * const router = createBrowserRouter([\r\n * // Only add callback route\r\n * ...getInsforgeRoutes({\r\n * baseUrl: 'https://your-backend.com',\r\n * builtInAuth: false\r\n * }),\r\n * // Your own auth components\r\n * {\r\n * path: '/sign-in',\r\n * element: <SignIn />\r\n * },\r\n * {\r\n * path: '/sign-up',\r\n * element: <SignUp />\r\n * }\r\n * ]);\r\n * ```\r\n * \r\n * @example\r\n * ```tsx\r\n * // Custom paths\r\n * ...getInsforgeRoutes({\r\n * baseUrl: 'https://your-backend.com',\r\n * builtInAuth: true,\r\n * paths: {\r\n * signIn: '/login',\r\n * signUp: '/register',\r\n * callback: '/callback'\r\n * }\r\n * })\r\n * ```\r\n */\r\nexport function getInsforgeRoutes(config: GetInsforgeRoutesConfig): RouteObject[] {\r\n const {\r\n baseUrl,\r\n builtInAuth = true,\r\n paths = {},\r\n } = config;\r\n\r\n const {\r\n signIn = '/sign-in',\r\n signUp = '/sign-up',\r\n verifyEmail = '/verify-email',\r\n forgotPassword = '/forgot-password',\r\n resetPassword = '/reset-password',\r\n callback = '/auth/callback',\r\n } = paths;\r\n\r\n const routes: RouteObject[] = [\r\n // Always include callback route\r\n {\r\n path: callback,\r\n element: <InsforgeCallback />,\r\n },\r\n ];\r\n\r\n // Only add redirect routes if using built-in auth\r\n if (builtInAuth) {\r\n routes.push(\r\n {\r\n path: signIn,\r\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/sign-in\" />,\r\n },\r\n {\r\n path: signUp,\r\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/sign-up\" />,\r\n },\r\n {\r\n path: verifyEmail,\r\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/verify-email\" />,\r\n },\r\n {\r\n path: forgotPassword,\r\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/forgot-password\" />,\r\n },\r\n {\r\n path: resetPassword,\r\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/reset-password\" />,\r\n }\r\n );\r\n }\r\n\r\n return routes;\r\n}\r\n\r\n"]}
1
+ {"version":3,"sources":["../src/provider/InsforgeProvider.tsx","../src/hooks/usePublicAuthConfig.ts","../src/components/atoms/AuthBranding.tsx","../src/lib/utils.ts","../src/components/atoms/AuthContainer.tsx","../src/components/atoms/AuthHeader.tsx","../src/components/atoms/AuthErrorBanner.tsx","../src/components/atoms/AuthFormField.tsx","../src/components/atoms/AuthPasswordStrengthIndicator.tsx","../src/components/atoms/AuthPasswordField.tsx","../src/components/atoms/AuthSubmitButton.tsx","../src/components/atoms/AuthLink.tsx","../src/components/atoms/AuthDivider.tsx","../src/config/oauth-providers.tsx","../src/components/atoms/AuthOAuthButton.tsx","../src/components/atoms/AuthOAuthProviders.tsx","../src/components/atoms/AuthVerificationCodeInput.tsx","../src/components/forms/SignInForm.tsx","../src/components/SignIn.tsx","../src/components/forms/SignUpForm.tsx","../src/components/SignUp.tsx","../src/components/UserButton.tsx","../src/components/Protect.tsx","../src/components/SignedIn.tsx","../src/components/SignedOut.tsx","../src/components/InsforgeCallback.tsx","../src/components/forms/ForgotPasswordForm.tsx","../src/components/forms/ResetPasswordForm.tsx","../src/components/forms/VerifyEmailStatus.tsx","../src/hooks/useAuth.ts","../src/hooks/useUser.ts","../src/lib/validation.ts","../src/router/getInsforgeRoutes.tsx"],"names":["error","useState","useEffect","jsx","jsxs","Loader2","useRef","createClient","Fragment"],"mappings":";;;;;;;;AAyEA,IAAM,eAAA,GAAkB,aAAA;AAAA,EACtB;AACF,CAAA;AAmDO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,QAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAA,EAA0B;AAExB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAA8B,IAAI,CAAA;AAC1D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAE9C,EAAA,MAAM,kBAAA,GAAqB,OAA8B,IAAI,CAAA;AAG7D,EAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,QAAA,CAAS,MAAM,YAAA,CAAa,EAAE,OAAA,EAAS,CAAC,CAAA;AAG3D,EAAA,MAAM,aAAA,GAAgB,YAAY,YAG5B;AACJ,IAAA,IAAI;AAEF,MAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,IAAA,CAAK,iBAAA,EAAkB;AACtD,MAAA,MAAM,OAAA,GAAU,cAAc,IAAA,EAAM,OAAA;AACpC,MAAA,MAAM,KAAA,GAAQ,SAAS,WAAA,IAAe,IAAA;AAEtC,MAAA,IAAI,CAAC,KAAA,EAAO;AAEV,QAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,YAAA,CAAa,IAAI,CAAA;AAAA,QACnB;AACA,QAAA,WAAA,CAAY,IAAI,CAAA;AAChB,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,YAAA,EAAa;AAAA,MAC/C;AAEA,MAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,IAAA,CAAK,cAAA,EAAe;AAEtD,MAAA,IAAI,WAAW,IAAA,EAAM;AAEnB,QAAA,MAAM,OAAA,GAAU,WAAW,IAAA,CAAK,OAAA;AAChC,QAAA,MAAM,QAAA,GAAyB;AAAA,UAC7B,EAAA,EAAI,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,EAAA;AAAA,UACzB,KAAA,EAAO,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,KAAA;AAAA,UAC5B,IAAA,EAAO,SAAS,QAAA,IAAmC,EAAA;AAAA,UACnD,SAAA,EAAY,SAAS,SAAA,IAAoC;AAAA,SAC3D;AAEA,QAAA,OAAA,CAAQ,QAAQ,CAAA;AAEhB,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,YAAA,CAAa,QAAQ,CAAA;AAAA,QACvB;AACA,QAAA,WAAA,CAAY,IAAI,CAAA;AAChB,QAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,MACzB,CAAA,MAAO;AAEL,QAAA,MAAM,QAAA,CAAS,KAAK,OAAA,EAAQ;AAG5B,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,IAAI;AACF,YAAA,MAAM,WAAA,EAAY;AAAA,UACpB,SAAS,KAAA,EAAO;AAAA,UAEhB;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,YAAA,CAAa,IAAI,CAAA;AAAA,QACnB;AACA,QAAA,WAAA,CAAY,IAAI,CAAA;AAChB,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,eAAA,EAAgB;AAAA,MAClD;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,OAAA,CAAQ,KAAA,CAAM,+CAA+C,KAAK,CAAA;AAElE,MAAA,MAAM,QAAA,CAAS,KAAK,OAAA,EAAQ;AAG5B,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,IAAI;AACF,UAAA,MAAM,WAAA,EAAY;AAAA,QACpB,SAASA,MAAAA,EAAO;AAAA,QAEhB;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,YAAA,CAAa,IAAI,CAAA;AAAA,MACnB;AACA,MAAA,WAAA,CAAY,IAAI,CAAA;AAEhB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,YAAA,EAAc,iBAAA,EAAmB,WAAW,CAAC,CAAA;AAE3D,EAAA,SAAA,CAAU,MAAM;AAEd,IAAA,aAAA,EAAc;AAEd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,QAAA,aAAA,CAAc,mBAAmB,OAAO,CAAA;AAAA,MAC1C;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,mBAAA,GAAsB,YAAY,YAAY;AAClD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK,mBAAA,EAAoB;AACvD,MAAA,IAAI,OAAO,IAAA,EAAM;AACf,QAAA,OAAO,MAAA,CAAO,IAAA;AAAA,MAChB,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,KAAA,CAAM,sDAAA,EAAwD,MAAA,CAAO,KAAK,CAAA;AAClF,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN,sDAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAKb,EAAA,MAAM,iBAAA,GAAoB,WAAA;AAAA,IACxB,OACE,WACA,YAAA,KACG;AACH,MAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,IAAA,CAAK,cAAA,EAAe;AAEtD,MAAA,IAAI,WAAW,IAAA,EAAM;AACnB,QAAA,MAAM,OAAA,GAAU,WAAW,IAAA,CAAK,OAAA;AAChC,QAAA,MAAM,QAAA,GAAyB;AAAA,UAC7B,EAAA,EAAI,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,EAAA;AAAA,UACzB,KAAA,EAAO,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,KAAA;AAAA,UAC5B,IAAA,EAAO,SAAS,QAAA,IAAmC,EAAA;AAAA,UACnD,SAAA,EAAY,SAAS,SAAA,IAAoC;AAAA,SAC3D;AAEA,QAAA,OAAA,CAAQ,QAAQ,CAAA;AAEhB,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,YAAA,CAAa,QAAQ,CAAA;AAAA,QACvB;AAGA,QAAA,IAAI,iBAAA,EAAmB;AACrB,UAAA,IAAI;AACF,YAAA,MAAM,kBAAkB,SAAS,CAAA;AAAA,UACnC,SAAS,KAAA,EAAO;AAAA,UAEhB;AAAA,QACF;AAAA,MACF,WAAW,YAAA,EAAc;AAEvB,QAAA,MAAM,QAAA,GAAyB;AAAA,UAC7B,EAAA,EAAI,aAAa,EAAA,IAAM,EAAA;AAAA,UACvB,KAAA,EAAO,aAAa,KAAA,IAAS,EAAA;AAAA,UAC7B,IAAA,EAAM,aAAa,IAAA,IAAQ,EAAA;AAAA,UAC3B,SAAA,EAAW;AAAA,SACb;AAEA,QAAA,OAAA,CAAQ,QAAQ,CAAA;AAEhB,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,YAAA,CAAa,QAAQ,CAAA;AAAA,QACvB;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAA,EAAU,YAAA,EAAc,iBAAiB;AAAA,GAC5C;AAMA,EAAA,MAAM,kBAAA,GAAqB,WAAA;AAAA,IACzB,OAAO,MAAA,KAK8C;AACnD,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,CAAS,KAAK,UAAA,CAAW;AAAA,UAC7B,aAAa,MAAA,CAAO,WAAA;AAAA,UACpB,IAAA,EAAM;AAAA,YACJ,EAAA,EAAI,OAAO,MAAA,IAAU,EAAA;AAAA,YACrB,KAAA,EAAO,OAAO,KAAA,IAAS,EAAA;AAAA,YACvB,IAAA,EAAM,OAAO,IAAA,IAAQ,EAAA;AAAA,YACrB,aAAA,EAAe,KAAA;AAAA,YACf,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,YAClC,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY;AACpC,SACD,CAAA;AAGD,QAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,IAAA,CAAK,cAAA,EAAe;AAEtD,QAAA,IAAI,CAAC,WAAW,IAAA,EAAM;AAEpB,UAAA,MAAM,QAAA,CAAS,KAAK,OAAA,EAAQ;AAE5B,UAAA,IAAI,WAAA,EAAa;AACf,YAAA,IAAI;AACF,cAAA,MAAM,WAAA,EAAY;AAAA,YACpB,SAAS,KAAA,EAAO;AAAA,YAEhB;AAAA,UACF;AAEA,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,eAAA,EAAgB;AAAA,QAClD;AAGA,QAAA,MAAM,OAAA,GAAU,WAAW,IAAA,CAAK,OAAA;AAChC,QAAA,MAAM,QAAA,GAAyB;AAAA,UAC7B,EAAA,EAAI,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,EAAA;AAAA,UACzB,KAAA,EAAO,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,KAAA;AAAA,UAC5B,IAAA,EAAO,OAAA,EAAS,QAAA,IAAmC,MAAA,CAAO,IAAA,IAAQ,EAAA;AAAA,UAClE,SAAA,EAAY,SAAS,SAAA,IAAoC;AAAA,SAC3D;AAEA,QAAA,OAAA,CAAQ,QAAQ,CAAA;AAEhB,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,YAAA,CAAa,QAAQ,CAAA;AAAA,QACvB;AAGA,QAAA,IAAI,iBAAA,EAAmB;AACrB,UAAA,IAAI;AACF,YAAA,MAAM,iBAAA,CAAkB,OAAO,WAAW,CAAA;AAAA,UAC5C,SAAS,KAAA,EAAO;AAAA,UAEhB;AAAA,QACF;AAEA,QAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,MACzB,SAAS,KAAA,EAAO;AAEd,QAAA,OAAA,CAAQ,KAAA,CAAM,4CAA4C,KAAK,CAAA;AAE/D,QAAA,MAAM,QAAA,CAAS,KAAK,OAAA,EAAQ;AAE5B,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,IAAI;AACF,YAAA,MAAM,WAAA,EAAY;AAAA,UACpB,SAASA,MAAAA,EAAO;AAAA,UAEhB;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,YAAA,CAAa,IAAI,CAAA;AAAA,QACnB;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,SAClD;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAA,EAAU,YAAA,EAAc,iBAAA,EAAmB,WAAW;AAAA,GACzD;AAEA,EAAA,MAAM,MAAA,GAAS,WAAA;AAAA,IACb,OAAO,OAAe,QAAA,KAAqB;AACzC,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,CAAK,kBAAA,CAAmB;AAAA,QACvD,KAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,MAAM,iBAAA;AAAA,UACJ,SAAA,CAAU,KAAK,WAAA,IAAe,EAAA;AAAA,UAC9B,SAAA,CAAU,KAAK,IAAA,GACX;AAAA,YACE,EAAA,EAAI,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,EAAA;AAAA,YACxB,KAAA,EAAO,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,KAAA;AAAA,YAC3B,IAAA,EAAM,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK;AAAA,WAC5B,GACA;AAAA,SACN;AACA,QAAA,OAAO,SAAA,CAAU,IAAA;AAAA,MACnB,CAAA,MAAO;AACL,QAAA,MAAM,YAAA,GACJ,SAAA,CAAU,KAAA,EAAO,OAAA,IAAW,2BAAA;AAC9B,QAAA,OAAO,EAAE,OAAO,YAAA,EAAa;AAAA,MAC/B;AAAA,IACF,CAAA;AAAA,IACA,CAAC,UAAU,iBAAiB;AAAA,GAC9B;AAEA,EAAA,MAAM,MAAA,GAAS,WAAA;AAAA,IACb,OAAO,OAAe,QAAA,KAAqB;AACzC,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,EAAE,KAAA,EAAO,UAAU,CAAA;AAEhE,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,MAAM,iBAAA;AAAA,UACJ,SAAA,CAAU,KAAK,WAAA,IAAe,EAAA;AAAA,UAC9B,SAAA,CAAU,KAAK,IAAA,GACX;AAAA,YACE,EAAA,EAAI,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,EAAA;AAAA,YACxB,KAAA,EAAO,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,KAAA;AAAA,YAC3B,IAAA,EAAM,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK;AAAA,WAC5B,GACA;AAAA,SACN;AACA,QAAA,OAAO,SAAA,CAAU,IAAA;AAAA,MACnB,CAAA,MAAO;AACL,QAAA,MAAM,YAAA,GAAe,SAAA,CAAU,KAAA,EAAO,OAAA,IAAW,gBAAA;AACjD,QAAA,OAAO,EAAE,OAAO,YAAA,EAAa;AAAA,MAC/B;AAAA,IACF,CAAA;AAAA,IACA,CAAC,UAAU,iBAAiB;AAAA,GAC9B;AAEA,EAAA,MAAM,OAAA,GAAU,YAAY,YAAY;AACtC,IAAA,MAAM,QAAA,CAAS,KAAK,OAAA,EAAQ;AAG5B,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IAAI;AACF,QAAA,MAAM,WAAA,EAAY;AAAA,MACpB,SAAS,KAAA,EAAO;AAAA,MAEhB;AAAA,IACF;AAGA,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,aAAA,CAAc,mBAAmB,OAAO,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,YAAA,EAAc,WAAW,CAAC,CAAA;AAExC,EAAA,MAAM,UAAA,GAAa,WAAA;AAAA,IACjB,OAAO,IAAA,KAAgC;AACrC,MAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAE9C,MAAA,MAAM,aAAA,GAAqC;AAAA,QACzC,UAAU,IAAA,CAAK,IAAA;AAAA,QACf,WAAW,IAAA,CAAK;AAAA,OAClB;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK,WAAW,aAAa,CAAA;AAE3D,MAAA,IAAI,OAAO,IAAA,EAAM;AACf,QAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,IAAA,CAAK,cAAA,EAAe;AACtD,QAAA,IAAI,WAAW,IAAA,EAAM;AACnB,UAAA,MAAM,OAAA,GAAU,WAAW,IAAA,CAAK,OAAA;AAChC,UAAA,MAAM,WAAA,GAA4B;AAAA,YAChC,EAAA,EAAI,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,EAAA;AAAA,YACzB,KAAA,EAAO,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,KAAA;AAAA,YAC5B,IAAA,EAAO,SAAS,QAAA,IAAmC,EAAA;AAAA,YACnD,SAAA,EAAY,SAAS,SAAA,IAAoC;AAAA,WAC3D;AACA,UAAA,OAAA,CAAQ,WAAW,CAAA;AACnB,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,YAAA,CAAa,WAAW,CAAA;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,IAAA,EAAM,YAAA,EAAc,QAAQ;AAAA,GAC/B;AAEA,EAAA,MAAM,qBAAA,GAAwB,WAAA;AAAA,IAC5B,OAAO,KAAA,KAAkB;AACvB,MAAA,MAAM,YAAY,MAAM,QAAA,CAAS,KAAK,qBAAA,CAAsB,EAAE,OAAO,CAAA;AACrE,MAAA,OAAO,SAAA,CAAU,IAAA;AAAA,IACnB,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,OAAO,OAAe,WAAA,KAAwB;AAC5C,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,CAAK,aAAA,CAAc;AAAA,QAClD,WAAA;AAAA,QACA,GAAA,EAAK;AAAA,OACN,CAAA;AACD,MAAA,OAAO,SAAA,CAAU,IAAA;AAAA,IACnB,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,WAAA,GAAc,WAAA;AAAA,IAClB,OAAO,KAAA,KAAkB;AACvB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,CAAK,YAAY,EAAE,GAAA,EAAK,OAAO,CAAA;AAChE,MAAA,OAAO,SAAA,CAAU,IAAA;AAAA,IACnB,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,eAAA,CAAgB,QAAA;AAAA,IAAhB;AAAA,MACC,KAAA,EAAO;AAAA,QACL,IAAA;AAAA,QACA,QAAA;AAAA,QACA,UAAA,EAAY,CAAC,CAAC,IAAA;AAAA,QACd,OAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,OAAA;AAAA,QACA,UAAA;AAAA,QACA,UAAA,EAAY,aAAA;AAAA,QACZ,kBAAA;AAAA,QACA,OAAA;AAAA,QACA,qBAAA;AAAA,QACA,aAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AAqBO,SAAS,WAAA,GAAoC;AAClD,EAAA,MAAM,OAAA,GAAU,WAAW,eAAe,CAAA;AAC1C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,OAAA;AACT;ACtiBO,SAAS,mBAAA,GAGd;AACA,EAAA,MAAM,EAAE,mBAAA,EAAoB,GAAI,WAAA,EAAY;AAC5C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIC,SAA6C,IAAI,CAAA;AACvF,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE9C,EAAAC,UAAU,MAAM;AACd,IAAA,eAAe,WAAA,GAAc;AAC3B,MAAA,MAAM,MAAA,GAAS,MAAM,mBAAA,EAAoB;AACzC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,cAAA,CAAe,MAAM,CAAA;AAAA,MACvB,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,MAAM,wDAAwD,CAAA;AACtE,QAAA,cAAA,CAAe,IAAI,CAAA;AAAA,MACrB;AACA,MAAA,WAAA,CAAY,IAAI,CAAA;AAAA,IAClB;AAEA,IAAA,WAAA,EAAY;AAAA,EACd,CAAA,EAAG,CAAC,mBAAmB,CAAC,CAAA;AAExB,EAAA,OAAO,EAAE,aAAa,QAAA,EAAS;AACjC;ACpDO,SAAS,YAAA,GAAe;AAC7B,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wEAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6CAAA,EAA8C,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,oBACrEA,IAAC,GAAA,EAAA,EAAE,IAAA,EAAK,wBAAuB,MAAA,EAAO,QAAA,EAAS,KAAI,qBAAA,EACjD,QAAA,kBAAA,IAAA,CAAC,SAAI,KAAA,EAAM,IAAA,EAAK,QAAO,IAAA,EAAK,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,OAAM,4BAAA,EAChE,QAAA,EAAA;AAAA,sBAAAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAE,4KAAA;AAAA,UACF,IAAA,EAAK;AAAA;AAAA,OACP;AAAA,sBACAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAE,sEAAA;AAAA,UACF,IAAA,EAAK;AAAA;AAAA,OACP;AAAA,sBACAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAE,ohNAAA;AAAA,UACF,IAAA,EAAK;AAAA;AAAA,OACP;AAAA,2BACC,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAAC,gBAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAG,yBAAA;AAAA,YACH,EAAA,EAAG,SAAA;AAAA,YACH,EAAA,EAAG,SAAA;AAAA,YACH,EAAA,EAAG,SAAA;AAAA,YACH,EAAA,EAAG,SAAA;AAAA,YACH,aAAA,EAAc,gBAAA;AAAA,YAEd,QAAA,EAAA;AAAA,8BAAAA,IAAC,MAAA,EAAA,EAAK,CAAA;AAAA,8BACNA,GAAAA,CAAC,MAAA,EAAA,EAAK,MAAA,EAAO,GAAA,EAAI,aAAY,KAAA,EAAM;AAAA;AAAA;AAAA,SACrC;AAAA,wBACA,IAAA;AAAA,UAAC,gBAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAG,yBAAA;AAAA,YACH,EAAA,EAAG,SAAA;AAAA,YACH,EAAA,EAAG,SAAA;AAAA,YACH,EAAA,EAAG,SAAA;AAAA,YACH,EAAA,EAAG,SAAA;AAAA,YACH,aAAA,EAAc,gBAAA;AAAA,YAEd,QAAA,EAAA;AAAA,8BAAAA,IAAC,MAAA,EAAA,EAAK,CAAA;AAAA,8BACNA,GAAAA,CAAC,MAAA,EAAA,EAAK,MAAA,EAAO,GAAA,EAAI,aAAY,KAAA,EAAM;AAAA;AAAA;AAAA;AACrC,OAAA,EACF;AAAA,KAAA,EACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AClDO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACwBO,SAAS,cAAc,EAAE,QAAA,EAAU,UAAA,GAAa,IAAG,EAAuB;AAC/E,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,2DAAA;AAAA,QACA,UAAA,CAAW;AAAA,OACb;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,SAAI,SAAA,EAAW,EAAA;AAAA,UACd,+DAAA;AAAA,UACA,UAAA,CAAW;AAAA,WAEV,QAAA,EACH,CAAA;AAAA,wBACAA,IAAC,YAAA,EAAA,EAAa;AAAA;AAAA;AAAA,GAChB;AAEJ;AChBO,SAAS,UAAA,CAAW;AAAA,EACzB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAa;AACf,CAAA,EAAoB;AAClB,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA;AAAA,IACd,+CAAA;AAAA,IACA,UAAA,CAAW;AAAA,GACb,EACE,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,QAAG,SAAA,EAAW,EAAA;AAAA,MACb,6CAAA;AAAA,MACA,UAAA,CAAW;AAAA,OAEV,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,IACC,QAAA,oBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,EAAA;AAAA,MACZ,8CAAA;AAAA,MACA,UAAA,CAAW;AAAA,OAEV,QAAA,EAAA,QAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AC1CO,SAAS,eAAA,CAAgB,EAAE,KAAA,EAAO,SAAA,EAAU,EAAyB;AAC1E,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,uFAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,+BAAA,EAAgC,CAAA;AAAA,wBACzDA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAA+B,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,GACvD;AAEJ;ACKO,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,EAAA;AAAA,EACA,aAAa,EAAC;AAAA,EACd,GAAG;AACL,CAAA,EAAuB;AACrB,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA;AAAA,IACd,kDAAA;AAAA,IACA,UAAA,CAAW;AAAA,GACb,EACE,QAAA,EAAA;AAAA,oBAAAD,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,EAAA;AAAA,QACT,SAAA,EAAW,EAAA;AAAA,UACT,0CAAA;AAAA,UACA,UAAA,CAAW;AAAA,SACb;AAAA,QAEC,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,oBACAA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,EAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,6CAAA;AAAA,UACA,4DAAA;AAAA,UACA,+BAAA;AAAA,UACA,wEAAA;AAAA,UACA,uCAAA;AAAA,UACA,UAAA,CAAW;AAAA,SACb;AAAA,QACC,GAAG;AAAA;AAAA;AACN,GAAA,EACF,CAAA;AAEJ;ACjCO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,QAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAa;AACf,CAAA,EAAuC;AACrC,EAAA,MAAM,YAAA,GAAe,mBAAmB,MAAM,CAAA;AAE9C,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,0BAAA,EAA4B,UAAA,CAAW,kBAAkB,CAAA;AAAA,MAEtE,QAAA,EAAA,YAAA,CAAa,IAAI,CAAC,GAAA,qBACjBC,IAAAA,CAAC,KAAA,EAAA,EAAoB,WAAU,yBAAA,EAC7B,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,kFAAA;AAAA,cACA,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA,GACb,iCAAA,GACA;AAAA,aACN;AAAA,YAEC,QAAA,EAAA,GAAA,CAAI,KAAK,QAAQ,CAAA,oBAAKA,GAAAA,CAAC,KAAA,EAAA,EAAM,WAAU,oBAAA,EAAqB;AAAA;AAAA,SAC/D;AAAA,wBACAA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,8CAAA;AAAA,cACA,UAAA,CAAW;AAAA,aACb;AAAA,YAEC,QAAA,EAAA,GAAA,CAAI;AAAA;AAAA;AACP,OAAA,EAAA,EAlBQ,GAAA,CAAI,KAmBd,CACD;AAAA;AAAA,GACH;AAEJ;AAKA,SAAS,mBACP,MAAA,EACuB;AACvB,EAAA,MAAM,eAAsC,EAAC;AAE7C,EAAA,MAAM,YAAY,MAAA,CAAO,iBAAA;AACzB,EAAA,MAAM,mBAAmB,MAAA,CAAO,gBAAA;AAChC,EAAA,MAAM,mBAAmB,MAAA,CAAO,gBAAA;AAChC,EAAA,MAAM,gBAAgB,MAAA,CAAO,aAAA;AAC7B,EAAA,MAAM,qBAAqB,MAAA,CAAO,kBAAA;AAElC,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,YAAA,CAAa,IAAA,CAAK;AAAA,MAChB,KAAA,EAAO,6BAAA;AAAA,MACP,IAAA,EAAM,CAAC,GAAA,KAAQ,OAAA,CAAQ,KAAK,GAAG;AAAA,KAChC,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,YAAA,CAAa,IAAA,CAAK;AAAA,MAChB,KAAA,EAAO,6BAAA;AAAA,MACP,IAAA,EAAM,CAAC,GAAA,KAAQ,OAAA,CAAQ,KAAK,GAAG;AAAA,KAChC,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,YAAA,CAAa,IAAA,CAAK;AAAA,MAChB,KAAA,EAAO,mBAAA;AAAA,MACP,IAAA,EAAM,CAAC,GAAA,KAAQ,IAAA,CAAK,KAAK,GAAG;AAAA,KAC7B,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,YAAA,CAAa,IAAA,CAAK;AAAA,MAChB,KAAA,EAAO,mCAAA;AAAA,MACP,IAAA,EAAM,CAAC,GAAA,KAAQ,kCAAA,CAAmC,KAAK,GAAG;AAAA,KAC3D,CAAA;AAAA,EACH;AAEA,EAAA,YAAA,CAAa,IAAA,CAAK;AAAA,IAChB,KAAA,EAAO,GAAG,SAAS,CAAA,mBAAA,CAAA;AAAA,IACnB,IAAA,EAAM,CAAC,GAAA,KAAQ,GAAA,CAAI,MAAA,IAAU;AAAA,GAC9B,CAAA;AAED,EAAA,OAAO,YAAA;AACT;AASO,SAAS,wBAAA,CACd,UACA,MAAA,EACS;AACT,EAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AACtB,EAAA,MAAM,YAAA,GAAe,mBAAmB,MAAM,CAAA;AAC9C,EAAA,OAAO,aAAa,KAAA,CAAM,CAAC,QAAQ,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAC,CAAA;AACvD;AChGO,SAAS,iBAAA,CAAkB;AAAA,EAChC,KAAA;AAAA,EACA,EAAA;AAAA,EACA,qBAAA,GAAwB,KAAA;AAAA,EACxB,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,KAAA;AAAA,EACA,aAAa,EAAC;AAAA,EACd,OAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA2B;AACzB,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIF,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,KAAK,CAAA;AAEtD,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAA0C;AAC7D,IAAA,IAAI,qBAAA,EAAuB;AACzB,MAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,IACtB;AACA,IAAA,OAAA,GAAU,CAAC,CAAA;AAAA,EACb,CAAA;AAEA,EAAA,uBACEG,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,kDAAA;AAAA,QACA,UAAA,CAAW;AAAA,OACb;AAAA,MAEE,QAAA,EAAA;AAAA,QAAA,CAAA,KAAA,IAAS,kBAAA,qBACTA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,EAAA;AAAA,cACT,SAAA,EAAW,EAAA;AAAA,gBACT,0CAAA;AAAA,gBACA,UAAA,CAAW;AAAA,eACb;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,UACC,sCACCA,GAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACC,MAAM,kBAAA,CAAmB,IAAA;AAAA,cACzB,SAAA,EAAU,yDAAA;AAAA,cAET,6BAAmB,IAAA,IAAQ;AAAA;AAAA;AAC9B,SAAA,EAEJ,CAAA;AAAA,wBAEFC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,EAAA;AAAA,cACA,IAAA,EAAM,eAAe,MAAA,GAAS,UAAA;AAAA,cAC9B,SAAA,EAAW,EAAA;AAAA,gBACT,6CAAA;AAAA,gBACA,yDAAA;AAAA,gBACA,+BAAA;AAAA,gBACA,wEAAA;AAAA,gBACA,uCAAA;AAAA,gBACA,UAAA,CAAW;AAAA,eACb;AAAA,cACA,KAAA;AAAA,cACA,OAAA,EAAS,WAAA;AAAA,cACR,GAAG;AAAA;AAAA,WACN;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,MAAM,eAAA,CAAgB,CAAC,YAAY,CAAA;AAAA,cAC5C,SAAA,EAAU,2KAAA;AAAA,cACV,YAAA,EAAY,eAAe,eAAA,GAAkB,eAAA;AAAA,cAE5C,QAAA,EAAA,YAAA,mBAAeA,GAAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAM,EAAA,EAAI,CAAA,mBAAKA,GAAAA,CAAC,GAAA,EAAA,EAAI,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA;AACxD,SAAA,EACF,CAAA;AAAA,QACC,qBAAA,IAAyB,gCACxBA,GAAAA;AAAA,UAAC,6BAAA;AAAA,UAAA;AAAA,YACC,QAAA,EAAU,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA;AAAA,YAC5B,MAAA,EAAQ;AAAA;AAAA;AACV;AAAA;AAAA,GAEJ;AAEJ;AChGO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,QAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,SAAA,GAAY,KAAA;AAAA,EACZ,QAAA,GAAW,KAAA;AAAA,EACX;AACF,CAAA,EAA0B;AACxB,EAAA,uBACEC,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAW,EAAA;AAAA,QACT,gDAAA;AAAA,QACA,kDAAA;AAAA,QACA,gEAAA;AAAA,QACA,8CAAA;AAAA,QACA,mBAAA;AAAA,QACA,iDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,QAAA,EAAU,YAAY,SAAA,IAAa,SAAA;AAAA,MAElC,QAAA,EAAA;AAAA,QAAA,SAAA,oBAAaD,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,sBAAA,EAAuB,MAAM,EAAA,EAAI,CAAA;AAAA,QACjE,6BAAaA,GAAAA,CAAC,eAAY,SAAA,EAAU,SAAA,EAAU,MAAM,EAAA,EAAI,CAAA;AAAA,QACxD;AAAA;AAAA;AAAA,GACH;AAEJ;ACpBO,SAAS,QAAA,CAAS,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,UAAA,GAAa,IAAG,EAAkB;AAEjF,EAAA,MAAM,gBAAgB,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,MAAA,GAAS,EAAA;AAE/E,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,IAAI,CAAC,eAAe,OAAO,IAAA;AAE3B,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,IAAI,GAAA,CAAI,IAAA,EAAM,MAAA,CAAO,SAAS,MAAM,CAAA;AAChD,MAAA,MAAM,aAAA,GAAgB,IAAI,eAAA,CAAgB,aAAa,CAAA;AAGvD,MAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AACpC,QAAA,IAAI,CAAC,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,EAAG;AAC9B,UAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,QACjC;AAAA,MACF,CAAC,CAAA;AAED,MAAA,OAAO,GAAA,CAAI,WAAW,GAAA,CAAI,MAAA;AAAA,IAC5B,CAAA,CAAA,MAAQ;AAEN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA,GAAG;AAEH,EAAA,uBACEC,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,EAAA;AAAA,IACZ,0DAAA;AAAA,IACA,UAAA,CAAW;AAAA,GACb,EACG,QAAA,EAAA;AAAA,IAAA,IAAA;AAAA,IAAM,GAAA;AAAA,oBACPD,GAAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,SAAA;AAAA,QACN,SAAA,EAAW,EAAA;AAAA,UACT,0CAAA;AAAA,UACA,UAAA,CAAW;AAAA,SACb;AAAA,QAEC,QAAA,EAAA;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;AC5DO,SAAS,WAAA,CAAY,EAAE,IAAA,GAAO,IAAA,EAAM,WAAU,EAAqB;AACxE,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA;AAAA,IACd,qDAAA;AAAA,IACA,mEAAA;AAAA,IACA,+DAAA;AAAA,IACA;AAAA,KAEA,QAAA,kBAAAA,GAAAA,CAAC,UAAK,SAAA,EAAU,kEAAA,EACb,gBACH,CAAA,EACF,CAAA;AAEJ;AC5BO,IAAM,qBAAA,GAAoE;AAAA,EAC/E,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,GAAA,kBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EACnD,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAE,0IAAA;AAAA,UACF,IAAA,EAAK;AAAA;AAAA,OACP;AAAA,sBACAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAE,oJAAA;AAAA,UACF,IAAA,EAAK;AAAA;AAAA,OACP;AAAA,sBACAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAE,mJAAA;AAAA,UACF,IAAA,EAAK;AAAA;AAAA,OACP;AAAA,sBACAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAE,iJAAA;AAAA,UACF,IAAA,EAAK;AAAA;AAAA;AACP,KAAA,EACF,CAAA;AAAA,IAEF,SAAA,EAAW;AAAA,GACb;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,qBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,MAAK,cAAA,EACnD,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,CAAA,EAAE,4jBAA2jB,CAAA,EACrkB,CAAA;AAAA,IAEF,SAAA,EAAW;AAAA,GACb;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,SAAA;AAAA,IACN,GAAA,kBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EACnD,QAAA,kBAAAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAE,6hCAAA;AAAA,QACF,IAAA,EAAK;AAAA;AAAA,KACP,EACF,CAAA;AAAA,IAEF,SAAA,EAAW;AAAA,GACb;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,UAAA;AAAA,IACN,GAAA,kBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EACnD,QAAA,kBAAAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAE,wRAAA;AAAA,QACF,IAAA,EAAK;AAAA;AAAA,KACP,EACF,CAAA;AAAA,IAEF,SAAA,EAAW;AAAA,GACb;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,UAAA;AAAA,IACN,GAAA,kBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EACnD,QAAA,kBAAAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAE,obAAA;AAAA,QACF,IAAA,EAAK;AAAA;AAAA,KACP,EACF,CAAA;AAAA,IAEF,SAAA,EAAW;AAAA,GACb;AAAA,EACA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,WAAA;AAAA,IACN,GAAA,kBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EACnD,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,eAAA,EAAgB,MAAK,SAAA,EAAU,CAAA;AAAA,sBACvCA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,iBAAA,EAAkB,MAAK,SAAA,EAAU,CAAA;AAAA,sBACzCA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gBAAA,EAAiB,MAAK,SAAA,EAAU,CAAA;AAAA,sBACxCA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,kBAAA,EAAmB,MAAK,SAAA,EAAU;AAAA,KAAA,EAC5C,CAAA;AAAA,IAEF,SAAA,EAAW;AAAA,GACb;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,qBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,MAAK,cAAA,EACnD,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,CAAA,EAAE,uUAAsU,CAAA,EAChV,CAAA;AAAA,IAEF,SAAA,EAAW;AAAA,GACb;AAAA,EACA,CAAA,EAAG;AAAA,IACD,IAAA,EAAM,GAAA;AAAA,IACN,qBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,MAAK,cAAA,EACnD,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,CAAA,EAAE,+JAA8J,CAAA,EACxK,CAAA;AAAA,IAEF,SAAA,EAAW;AAAA,GACb;AAAA,EACA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,WAAA;AAAA,IACN,GAAA,kBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EACnD,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAE,+2BAAA;AAAA,UACF,IAAA,EAAK;AAAA;AAAA,OACP;AAAA,sBACAA,GAAAA,CAAC,MAAA,EAAA,EACC,QAAA,kBAAAC,KAAC,gBAAA,EAAA,EAAe,EAAA,EAAG,oBAAA,EAAqB,EAAA,EAAG,MAAK,EAAA,EAAG,MAAA,EAAO,EAAA,EAAG,MAAA,EAAO,IAAG,IAAA,EACrE,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,MAAA,EAAO,IAAA,EAAK,WAAU,SAAA,EAAU,CAAA;AAAA,wBACtCA,GAAAA,CAAC,MAAA,EAAA,EAAK,MAAA,EAAO,KAAA,EAAM,WAAU,SAAA,EAAU,CAAA;AAAA,wBACvCA,GAAAA,CAAC,MAAA,EAAA,EAAK,MAAA,EAAO,MAAA,EAAO,WAAU,SAAA,EAAU;AAAA,OAAA,EAC1C,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,IAEF,SAAA,EAAW;AAAA,GACb;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,GAAA,kBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EACnD,QAAA,kBAAAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAE,wQAAA;AAAA,QACF,IAAA,EAAK;AAAA;AAAA,KACP,EACF,CAAA;AAAA,IAEF,SAAA,EAAW;AAAA,GACb;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,SAAA;AAAA,IACN,GAAA,kBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EACnD,QAAA,kBAAAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAE,4kBAAA;AAAA,QACF,IAAA,EAAK;AAAA;AAAA,KACP,EACF,CAAA;AAAA,IAEF,SAAA,EAAW;AAAA;AAEf;AAMO,SAAS,kBAAkB,QAAA,EAAqD;AACrF,EAAA,OAAO,qBAAA,CAAsB,QAAQ,CAAA,IAAK,IAAA;AAC5C;AAKO,SAAS,qBAAA,GAA6E;AAC3F,EAAA,OAAO,qBAAA;AACT;ACrIO,SAAS,eAAA,CAAgB;AAAA,EAC9B,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA,GAAc,MAAA;AAAA,EACd,KAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,MAAA,GAAS,kBAAkB,QAAQ,CAAA;AAEzC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,IAAI,SAAS,OAAO,mBAAA;AACpB,IAAA,IAAI,WAAA,KAAgB,MAAA,EAAQ,OAAO,CAAA,cAAA,EAAiB,OAAO,IAAI,CAAA,CAAA;AAC/D,IAAA,IAAI,WAAA,KAAgB,OAAA,EAAS,OAAO,MAAA,CAAO,IAAA;AAC3C,IAAA,OAAO,EAAA;AAAA,EACT,CAAA;AAEA,EAAA,uBACEC,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,MAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,MAC/B,SAAA,EAAW,EAAA;AAAA,QACT,2BAAA;AAAA,QACA,4CAAA;AAAA,QACA,6CAAA;AAAA,QACA,uCAAA;AAAA,QACA,0DAAA;AAAA,QACA,4CAAA;AAAA,QACA,2CAAA;AAAA,QACA,iDAAA;AAAA,QACA,gBAAgB,MAAA,IAAU,gBAAA;AAAA,QAC1B,gBAAgB,OAAA,IAAW,2BAAA;AAAA,QAC3B,gBAAgB,MAAA,IAAU,sBAAA;AAAA,QAC1B;AAAA,OACF;AAAA,MACA,UAAU,QAAA,IAAY,OAAA;AAAA,MACtB,KAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,OAAA,mBACCD,GAAAA,CAACE,OAAAA,EAAA,EAAQ,WAAU,gCAAA,EAAiC,IAAA,EAAM,EAAA,EAAI,CAAA,mBAE9DF,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EAA6C,iBAAO,GAAA,EAAI,CAAA;AAAA,QAEzE,eAAc,oBAAKA,GAAAA,CAAC,MAAA,EAAA,EAAM,yBAAc,EAAE;AAAA;AAAA;AAAA,GAC7C;AAEJ;ACpCO,SAAS,kBAAA,CAAmB;AAAA,EACjC,SAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAa;AACf,CAAA,EAA4B;AAC1B,EAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AACxC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAQ,SAAA,CAAU,MAAA;AAGxB,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,KAAA,KAAU,GAAG,OAAO,MAAA;AACxB,IAAA,IAAI,KAAA,KAAU,CAAA,IAAK,KAAA,KAAU,CAAA,EAAG,OAAO,OAAA;AACvC,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAIA,EAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAuC;AAEjE,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,OAAO,EAAE,YAAY,QAAA,EAAS;AAAA,IAChC;AAGA,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,OAAO,EAAE,YAAY,QAAA,EAAS;AAAA,IAChC;AAGA,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,OAAO,EAAE,YAAY,iBAAA,EAAkB;AAAA,IACzC;AAGA,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,OAAO,EAAE,YAAY,QAAA,EAAS;AAAA,IAChC;AAGA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA;AACrC,IAAA,MAAM,iBAAA,GAAA,CAAqB,YAAY,CAAA,IAAK,CAAA;AAC5C,IAAA,MAAM,cAAc,KAAA,IAAS,iBAAA;AAE7B,IAAA,IAAI,CAAC,WAAA,EAAa;AAEhB,MAAA,OAAO,EAAE,YAAY,iBAAA,EAAkB;AAAA,IACzC;AAGA,IAAA,MAAM,oBAAoB,KAAA,GAAQ,iBAAA;AAClC,IAAA,MAAM,iBAAiB,KAAA,GAAQ,iBAAA;AAE/B,IAAA,IAAI,mBAAmB,CAAA,EAAG;AAExB,MAAA,OAAO,EAAE,YAAY,OAAA,EAAQ;AAAA,IAC/B,CAAA,MAAA,IAAW,mBAAmB,CAAA,EAAG;AAE/B,MAAA,IAAI,sBAAsB,CAAA,EAAG;AAC3B,QAAA,OAAO,EAAE,YAAY,OAAA,EAAQ;AAAA,MAC/B,CAAA,MAAO;AACL,QAAA,OAAO,EAAE,YAAY,OAAA,EAAQ;AAAA,MAC/B;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,OAAO,EAAE,YAAY,iBAAA,EAAkB;AAAA,IACzC;AAAA,EACF,CAAA;AAEA,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA;AAAA,IACd,+BAAA;AAAA,IACA,UAAA,CAAW;AAAA,KAEV,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,EAAU,0BACxBA,GAAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MAEC,QAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAS,OAAA,KAAY,QAAA;AAAA,MACrB,aAAa,cAAA,EAAe;AAAA,MAC5B,KAAA,EAAO,mBAAmB,KAAK,CAAA;AAAA,MAC/B,WAAW,UAAA,CAAW;AAAA,KAAA;AAAA,IAPjB;AAAA,GASR,CAAA,EACH,CAAA;AAEJ;ACzFO,SAAS,yBAAA,CAA0B;AAAA,EACxC,MAAA,GAAS,CAAA;AAAA,EACT,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,aAAa;AACf,CAAA,EAAmC;AACjC,EAAA,MAAM,SAAA,GAAYG,MAAAA,CAAoC,EAAE,CAAA;AAExD,EAAA,MAAM,YAAA,GAAe,CAAC,KAAA,EAAe,KAAA,KAAkB;AAErD,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AAGtB,IAAA,IAAI,KAAA,IAAS,CAAC,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AAGlC,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,EAAE,CAAA;AAC/B,IAAA,QAAA,CAAS,KAAK,CAAA,GAAI,KAAA;AAClB,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA;AACrC,IAAA,QAAA,CAAS,YAAY,CAAA;AAGrB,IAAA,IAAI,KAAA,IAAS,KAAA,GAAQ,MAAA,GAAS,CAAA,EAAG;AAC/B,MAAA,SAAA,CAAU,OAAA,CAAQ,KAAA,GAAQ,CAAC,CAAA,EAAG,KAAA,EAAM;AAAA,IACtC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,EAAe,CAAA,KAAuC;AAE3E,IAAA,IAAI,CAAA,CAAE,QAAQ,WAAA,EAAa;AACzB,MAAA,IAAI,CAAC,KAAA,CAAM,KAAK,CAAA,IAAK,QAAQ,CAAA,EAAG;AAE9B,QAAA,SAAA,CAAU,OAAA,CAAQ,KAAA,GAAQ,CAAC,CAAA,EAAG,KAAA,EAAM;AAAA,MACtC,CAAA,MAAO;AAEL,QAAA,YAAA,CAAa,OAAO,EAAE,CAAA;AAAA,MACxB;AAAA,IACF,CAAA,MAAA,IAES,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,QAAQ,CAAA,EAAG;AAC3C,MAAA,SAAA,CAAU,OAAA,CAAQ,KAAA,GAAQ,CAAC,CAAA,EAAG,KAAA,EAAM;AAAA,IACtC,WAAW,CAAA,CAAE,GAAA,KAAQ,YAAA,IAAgB,KAAA,GAAQ,SAAS,CAAA,EAAG;AACvD,MAAA,SAAA,CAAU,OAAA,CAAQ,KAAA,GAAQ,CAAC,CAAA,EAAG,KAAA,EAAM;AAAA,IACtC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAwC;AAC3D,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,MAAM,aAAa,CAAA,CAAE,aAAA,CAAc,OAAA,CAAQ,YAAY,EAAE,IAAA,EAAK;AAG9D,IAAA,IAAI,QAAQ,IAAA,CAAK,UAAU,CAAA,IAAK,UAAA,CAAW,WAAW,MAAA,EAAQ;AAC5D,MAAA,QAAA,CAAS,UAAU,CAAA;AAEnB,MAAA,SAAA,CAAU,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,EAAG,KAAA,EAAM;AAAA,IACvC;AAAA,EACF,CAAA;AAEA,EAAA,uBACEF,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA;AAAA,IACd,iDAAA;AAAA,IACA,UAAA,CAAW;AAAA,GACb,EACE,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8CAAA,EAA+C,QAAA,EAAA;AAAA,MAAA,iDAAA;AAAA,MACV,GAAA;AAAA,sBAChDD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8CAA8C,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAAO;AAAA,KAAA,EAE7E,CAAA;AAAA,oBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDACZ,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,0BAC9BA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QAEC,GAAA,EAAK,CAAC,EAAA,KAAO;AACX,UAAA,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAA,GAAI,EAAA;AAAA,QAC7B,CAAA;AAAA,QACA,IAAA,EAAK,MAAA;AAAA,QACL,SAAA,EAAU,SAAA;AAAA,QACV,SAAA,EAAW,CAAA;AAAA,QACX,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA,IAAK,EAAA;AAAA,QACvB,UAAU,CAAC,CAAA,KACT,aAAa,KAAA,EAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QAEpC,SAAA,EAAW,CAAC,CAAA,KACV,aAAA,CAAc,OAAO,CAAC,CAAA;AAAA,QAExB,OAAA,EAAS,WAAA;AAAA,QACT,QAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,gEAAA;AAAA,UACA,0DAAA;AAAA,UACA,0CAAA;AAAA,UACA,6DAAA;AAAA,UACA,uEAAA;AAAA,UACA,UAAA,CAAW;AAAA,SACb;AAAA,QACA,YAAA,EAAa;AAAA,OAAA;AAAA,MAxBR;AAAA,KA0BR,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;ACnGO,SAAS,UAAA,CAAW;AAAA,EACzB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,YAAA,GAAe,IAAA;AAAA,EACf,qBAAqB,EAAC;AAAA,EACtB,YAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAa,EAAC;AAAA,EACd,KAAA,GAAQ,cAAA;AAAA,EACR,QAAA,GAAW,uBAAA;AAAA,EACX,UAAA,GAAa,OAAA;AAAA,EACb,gBAAA,GAAmB,mBAAA;AAAA,EACnB,aAAA,GAAgB,UAAA;AAAA,EAChB,mBAAA,GAAsB,sCAAA;AAAA,EACtB,kBAAA,GAAqB,kBAAA;AAAA,EACrB,iBAAA;AAAA,EACA,gBAAA,GAAmB,SAAA;AAAA,EACnB,iBAAA,GAAoB,eAAA;AAAA,EACpB,UAAA,GAAa,wBAAA;AAAA,EACb,cAAA,GAAiB,aAAA;AAAA,EACjB,SAAA,GAAY,UAAA;AAAA,EACZ,WAAA,GAAc;AAChB,CAAA,EAAoB;AAClB,EAAA,uBACEC,IAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,UAAA,EAAY;AAAA,QACV,oBAAoB,UAAA,CAAW,SAAA;AAAA,QAC/B,eAAe,UAAA,CAAW;AAAA,OAC5B;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,KAAA;AAAA,YACA,QAAA;AAAA,YACA,UAAA,EAAY;AAAA,cACV,kBAAA,EAAoB,WAAW,MAAA,EAAQ,SAAA;AAAA,cACvC,cAAA,EAAgB,WAAW,MAAA,EAAQ,KAAA;AAAA,cACnC,iBAAA,EAAmB,WAAW,MAAA,EAAQ;AAAA;AACxC;AAAA,SACF;AAAA,wBAEAA,GAAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,OAAO,KAAA,IAAS,EAAA;AAAA,YAChB,WAAW,UAAA,CAAW;AAAA;AAAA,SACxB;AAAA,wBAEAC,IAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,QAAA;AAAA,YACA,UAAA,EAAU,IAAA;AAAA,YACV,SAAA,EAAW,UAAA,CAAW,IAAA,EAAM,SAAA,IAAa,kDAAA;AAAA,YAEzC,QAAA,EAAA;AAAA,8BAAAD,GAAAA;AAAA,gBAAC,aAAA;AAAA,gBAAA;AAAA,kBACC,EAAA,EAAG,OAAA;AAAA,kBACH,IAAA,EAAK,OAAA;AAAA,kBACL,KAAA,EAAO,UAAA;AAAA,kBACP,WAAA,EAAa,gBAAA;AAAA,kBACb,KAAA,EAAO,KAAA;AAAA,kBACP,UAAU,CAAC,CAAA,KAAM,aAAA,CAAc,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,kBAC7C,QAAA,EAAQ,IAAA;AAAA,kBACR,YAAA,EAAa,OAAA;AAAA,kBACb,UAAA,EAAY;AAAA,oBACV,kBAAA,EAAoB,UAAA,CAAW,IAAA,EAAM,UAAA,EAAY,SAAA;AAAA,oBACjD,cAAA,EAAgB,UAAA,CAAW,IAAA,EAAM,UAAA,EAAY,KAAA;AAAA,oBAC7C,cAAA,EAAgB,UAAA,CAAW,IAAA,EAAM,UAAA,EAAY;AAAA;AAC/C;AAAA,eACF;AAAA,8BAEAA,GAAAA;AAAA,gBAAC,iBAAA;AAAA,gBAAA;AAAA,kBACC,EAAA,EAAG,UAAA;AAAA,kBACH,KAAA,EAAO,aAAA;AAAA,kBACP,WAAA,EAAa,mBAAA;AAAA,kBACb,KAAA,EAAO,QAAA;AAAA,kBACP,UAAU,CAAC,CAAA,KAAM,gBAAA,CAAiB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,kBAChD,QAAA,EAAQ,IAAA;AAAA,kBACR,YAAA,EAAa,kBAAA;AAAA,kBACb,eAAA;AAAA,kBACA,oBAAoB,iBAAA,GAAoB;AAAA,oBACtC,IAAA,EAAM,iBAAA;AAAA,oBACN,IAAA,EAAM;AAAA,mBACR,GAAI,MAAA;AAAA,kBACJ,UAAA,EAAY;AAAA,oBACV,kBAAA,EAAoB,UAAA,CAAW,IAAA,EAAM,aAAA,EAAe,SAAA;AAAA,oBACpD,cAAA,EAAgB,UAAA,CAAW,IAAA,EAAM,aAAA,EAAe,KAAA;AAAA,oBAChD,cAAA,EAAgB,UAAA,CAAW,IAAA,EAAM,aAAA,EAAe;AAAA;AAClD;AAAA,eACF;AAAA,8BAEAA,GAAAA;AAAA,gBAAC,gBAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW,OAAA;AAAA,kBACX,QAAA,EAAU,WAAW,YAAA,KAAiB,IAAA;AAAA,kBACtC,WAAW,UAAA,CAAW,MAAA;AAAA,kBAErB,oBAAU,iBAAA,GAAoB;AAAA;AAAA;AACjC;AAAA;AAAA,SACF;AAAA,wBAEAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,UAAA;AAAA,YACN,QAAA,EAAU,cAAA;AAAA,YACV,IAAA,EAAM,SAAA;AAAA,YACN,UAAA,EAAY;AAAA,cACV,kBAAA,EAAoB,WAAW,IAAA,EAAM,SAAA;AAAA,cACrC,aAAA,EAAe,WAAW,IAAA,EAAM;AAAA;AAClC;AAAA,SACF;AAAA,QAEC,mBAAmB,MAAA,GAAS,CAAA,IAAK,YAAA,oBAChCC,KAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,WAAA;AAAA,cACN,WAAW,UAAA,CAAW;AAAA;AAAA,WACxB;AAAA,0BACAA,GAAAA;AAAA,YAAC,kBAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,kBAAA;AAAA,cACX,OAAA,EAAS,YAAA;AAAA,cACT,QAAA,EAAU,WAAW,YAAA,KAAiB,IAAA;AAAA,cACtC,OAAA,EAAS,YAAA;AAAA,cACT,UAAA,EAAY;AAAA,gBACV,kBAAA,EAAoB,WAAW,KAAA,EAAO,SAAA;AAAA,gBACtC,eAAA,EAAiB,WAAW,KAAA,EAAO;AAAA;AACrC;AAAA;AACF,SAAA,EACF;AAAA;AAAA;AAAA,GAEJ;AAEJ;AC1JO,SAAS,MAAA,CAAO;AAAA,EACrB,SAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAgB;AACd,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAQ,GAAI,WAAA,EAAY;AACxC,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,mBAAA,EAAoB;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIF,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,QAAAA;AAAA,IACtC;AAAA,GACF;AAGA,EAAA,MAAM,CAAC,QAAQ,CAAA,GAAIA,QAAAA,CAAS,MAAMM,YAAAA,CAAa,EAAE,OAAA,EAAS,CAAC,CAAA;AAE3D,EAAA,eAAe,aAAa,CAAA,EAA+B;AACzD,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,EAAE,CAAA;AAEX,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA,EAAO,QAAQ,CAAA;AAC3C,MAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,QAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAAA,MAC9B;AACA,MAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAY,GAAI,MAAA;AAE9B,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,IAAI,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,WAAA,IAAe,EAAE,CAAA;AAAA,MAC7C;AAAA,IAEF,SAAS,GAAA,EAAU;AACjB,MAAA,MAAM,YAAA,GAAe,IAAI,OAAA,IAAW,gBAAA;AACpC,MAAA,QAAA,CAAS,YAAY,CAAA;AACrB,MAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,IAAI,KAAA,CAAM,YAAY,CAAC,CAAA;AAAA,IAC9C,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,eAAe,YAAY,QAAA,EAAgC;AACzD,IAAA,IAAI;AACF,MAAA,eAAA,CAAgB,QAAQ,CAAA;AACxB,MAAA,QAAA,CAAS,EAAE,CAAA;AAEX,MAAA,MAAM,UAAA,GAAa,CAAA,EAAG,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,cAAA,CAAA;AAE5C,MAAA,MAAM,QAAA,CAAS,KAAK,eAAA,CAAgB;AAAA,QAClC,QAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IAGH,SAAS,GAAA,EAAU;AACjB,MAAA,MAAM,YAAA,GAAe,GAAA,CAAI,OAAA,IAAW,CAAA,EAAG,QAAQ,CAAA,eAAA,CAAA;AAC/C,MAAA,QAAA,CAAS,YAAY,CAAA;AACrB,MAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,IAAI,KAAA,CAAM,YAAY,CAAC,CAAA;AAC5C,MAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,IACtB;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACEJ,GAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,QAAA;AAAA,MACA,aAAA,EAAe,QAAA;AAAA,MACf,gBAAA,EAAkB,WAAA;AAAA,MAClB,QAAA,EAAU,YAAA;AAAA,MACV,KAAA;AAAA,MACA,OAAA;AAAA,MACA,YAAA;AAAA,MACA,kBAAA,EAAoB,WAAA,EAAa,cAAA,IAAkB,EAAC;AAAA,MACpD,YAAA,EAAc,WAAA;AAAA,MACd,eAAA,EAAiB,WAAA;AAAA,MAChB,GAAG;AAAA;AAAA,GACN;AAEJ;AC7DO,SAAS,UAAA,CAAW;AAAA,EACzB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,YAAA,GAAe,IAAA;AAAA,EACf,qBAAqB,EAAC;AAAA,EACtB,YAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAa,EAAC;AAAA,EACd,KAAA,GAAQ,aAAA;AAAA,EACR,QAAA,GAAW,qBAAA;AAAA,EACX,UAAA,GAAa,OAAA;AAAA,EACb,gBAAA,GAAmB,mBAAA;AAAA,EACnB,aAAA,GAAgB,UAAA;AAAA,EAChB,mBAAA,GAAsB,sCAAA;AAAA,EACtB,gBAAA,GAAmB,SAAA;AAAA,EACnB,iBAAA,GAAoB,qBAAA;AAAA,EACpB,UAAA,GAAa,0BAAA;AAAA,EACb,cAAA,GAAiB,WAAA;AAAA,EACjB,SAAA,GAAY,UAAA;AAAA,EACZ,WAAA,GAAc;AAChB,CAAA,EAAoB;AAClB,EAAA,uBACEC,IAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,UAAA,EAAY;AAAA,QACV,oBAAoB,UAAA,CAAW,SAAA;AAAA,QAC/B,eAAe,UAAA,CAAW;AAAA,OAC5B;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,KAAA;AAAA,YACA,QAAA;AAAA,YACA,UAAA,EAAY;AAAA,cACV,kBAAA,EAAoB,WAAW,MAAA,EAAQ,SAAA;AAAA,cACvC,cAAA,EAAgB,WAAW,MAAA,EAAQ,KAAA;AAAA,cACnC,iBAAA,EAAmB,WAAW,MAAA,EAAQ;AAAA;AACxC;AAAA,SACF;AAAA,wBAEAA,GAAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,OAAO,KAAA,IAAS,EAAA;AAAA,YAChB,WAAW,UAAA,CAAW;AAAA;AAAA,SACxB;AAAA,wBAEAC,IAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,QAAA;AAAA,YACA,UAAA,EAAU,IAAA;AAAA,YACV,SAAA,EAAW,UAAA,CAAW,IAAA,EAAM,SAAA,IAAa,kDAAA;AAAA,YAEzC,QAAA,EAAA;AAAA,8BAAAD,GAAAA;AAAA,gBAAC,aAAA;AAAA,gBAAA;AAAA,kBACC,EAAA,EAAG,OAAA;AAAA,kBACH,IAAA,EAAK,OAAA;AAAA,kBACL,KAAA,EAAO,UAAA;AAAA,kBACP,WAAA,EAAa,gBAAA;AAAA,kBACb,KAAA,EAAO,KAAA;AAAA,kBACP,UAAU,CAAC,CAAA,KAAM,aAAA,CAAc,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,kBAC7C,QAAA,EAAQ,IAAA;AAAA,kBACR,YAAA,EAAa,OAAA;AAAA,kBACb,UAAA,EAAY;AAAA,oBACV,kBAAA,EAAoB,UAAA,CAAW,IAAA,EAAM,UAAA,EAAY,SAAA;AAAA,oBACjD,cAAA,EAAgB,UAAA,CAAW,IAAA,EAAM,UAAA,EAAY,KAAA;AAAA,oBAC7C,cAAA,EAAgB,UAAA,CAAW,IAAA,EAAM,UAAA,EAAY;AAAA;AAC/C;AAAA,eACF;AAAA,8BAEAA,GAAAA;AAAA,gBAAC,iBAAA;AAAA,gBAAA;AAAA,kBACC,EAAA,EAAG,UAAA;AAAA,kBACH,KAAA,EAAO,aAAA;AAAA,kBACP,WAAA,EAAa,mBAAA;AAAA,kBACb,KAAA,EAAO,QAAA;AAAA,kBACP,UAAU,CAAC,CAAA,KAAM,gBAAA,CAAiB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,kBAChD,QAAA,EAAQ,IAAA;AAAA,kBACR,WAAW,eAAA,CAAgB,iBAAA;AAAA,kBAC3B,YAAA,EAAa,cAAA;AAAA,kBACb,qBAAA,EAAqB,IAAA;AAAA,kBACrB,eAAA;AAAA,kBACA,UAAA,EAAY;AAAA,oBACV,kBAAA,EAAoB,UAAA,CAAW,IAAA,EAAM,aAAA,EAAe,SAAA;AAAA,oBACpD,cAAA,EAAgB,UAAA,CAAW,IAAA,EAAM,aAAA,EAAe,KAAA;AAAA,oBAChD,cAAA,EAAgB,UAAA,CAAW,IAAA,EAAM,aAAA,EAAe;AAAA;AAClD;AAAA,eACF;AAAA,8BAEAA,GAAAA;AAAA,gBAAC,gBAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW,OAAA;AAAA,kBACX,QAAA,EAAU,WAAW,YAAA,KAAiB,IAAA;AAAA,kBACtC,WAAW,UAAA,CAAW,MAAA;AAAA,kBAErB,oBAAU,iBAAA,GAAoB;AAAA;AAAA;AACjC;AAAA;AAAA,SACF;AAAA,wBAEAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,UAAA;AAAA,YACN,QAAA,EAAU,cAAA;AAAA,YACV,IAAA,EAAM,SAAA;AAAA,YACN,UAAA,EAAY;AAAA,cACV,kBAAA,EAAoB,WAAW,IAAA,EAAM,SAAA;AAAA,cACrC,aAAA,EAAe,WAAW,IAAA,EAAM;AAAA;AAClC;AAAA,SACF;AAAA,QAEC,mBAAmB,MAAA,GAAS,CAAA,IAAK,gCAChCC,IAAAA,CAAAI,UAAA,EACE,QAAA,EAAA;AAAA,0BAAAL,GAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,WAAA;AAAA,cACN,WAAW,UAAA,CAAW;AAAA;AAAA,WACxB;AAAA,0BACAA,GAAAA;AAAA,YAAC,kBAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,kBAAA;AAAA,cACX,OAAA,EAAS,YAAA;AAAA,cACT,QAAA,EAAU,WAAW,YAAA,KAAiB,IAAA;AAAA,cACtC,OAAA,EAAS,YAAA;AAAA,cACT,UAAA,EAAY;AAAA,gBACV,kBAAA,EAAoB,WAAW,KAAA,EAAO,SAAA;AAAA,gBACtC,eAAA,EAAiB,WAAW,KAAA,EAAO;AAAA;AACrC;AAAA;AACF,SAAA,EACF;AAAA;AAAA;AAAA,GAEJ;AAEJ;ACrJO,SAAS,MAAA,CAAO;AAAA,EACrB,SAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAgB;AACd,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAQ,GAAI,WAAA,EAAY;AACxC,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,mBAAA,EAAoB;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIF,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,QAAAA;AAAA,IACtC;AAAA,GACF;AAGA,EAAA,MAAM,CAAC,QAAQ,CAAA,GAAIA,QAAAA,CAAS,MAAMM,YAAAA,CAAa,EAAE,OAAA,EAAS,CAAC,CAAA;AAE3D,EAAA,eAAe,aAAa,CAAA,EAA+B;AACzD,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,EAAE,CAAA;AAGX,IAAA,IAAI,WAAA,IAAe,CAAC,wBAAA,CAAyB,QAAA,EAAU,WAAW,CAAA,EAAG;AACnE,MAAA,QAAA,CAAS,yCAAyC,CAAA;AAClD,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA,EAAO,QAAQ,CAAA;AAC3C,MAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,QAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAAA,MAC9B;AACA,MAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAY,GAAI,MAAA;AAE9B,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,IAAI,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,WAAA,IAAe,EAAE,CAAA;AAAA,MAC7C;AAAA,IAEF,SAAS,GAAA,EAAU;AACjB,MAAA,MAAM,YAAA,GAAe,IAAI,OAAA,IAAW,gBAAA;AACpC,MAAA,QAAA,CAAS,YAAY,CAAA;AACrB,MAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,IAAI,KAAA,CAAM,YAAY,CAAC,CAAA;AAAA,IAC9C,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,eAAe,YAAY,QAAA,EAAgC;AACzD,IAAA,IAAI;AACF,MAAA,eAAA,CAAgB,QAAQ,CAAA;AACxB,MAAA,QAAA,CAAS,EAAE,CAAA;AAEX,MAAA,MAAM,UAAA,GAAa,CAAA,EAAG,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,cAAA,CAAA;AAE5C,MAAA,MAAM,QAAA,CAAS,KAAK,eAAA,CAAgB;AAAA,QAClC,QAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IAGH,SAAS,GAAA,EAAU;AACjB,MAAA,MAAM,YAAA,GAAe,GAAA,CAAI,OAAA,IAAW,CAAA,EAAG,QAAQ,CAAA,eAAA,CAAA;AAC/C,MAAA,QAAA,CAAS,YAAY,CAAA;AACrB,MAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,IAAI,KAAA,CAAM,YAAY,CAAC,CAAA;AAC5C,MAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,IACtB;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACEJ,GAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,QAAA;AAAA,MACA,aAAA,EAAe,QAAA;AAAA,MACf,gBAAA,EAAkB,WAAA;AAAA,MAClB,QAAA,EAAU,YAAA;AAAA,MACV,KAAA;AAAA,MACA,OAAA;AAAA,MACA,YAAA;AAAA,MACA,kBAAA,EAAoB,WAAA,EAAa,cAAA,IAAkB,EAAC;AAAA,MACpD,YAAA,EAAc,WAAA;AAAA,MACd,eAAA,EAAiB,WAAA;AAAA,MAChB,GAAG;AAAA;AAAA,GACN;AAEJ;ACtFO,SAAS,UAAA,CAAW;AAAA,EACzB,eAAA,GAAkB,GAAA;AAAA,EAClB,IAAA,GAAO,UAAA;AAAA,EACP,aAAa;AACf,CAAA,EAAoB;AAClB,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,WAAA,EAAY;AACtC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIF,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,WAAA,GAAcK,OAAuB,IAAI,CAAA;AAG/C,EAAAJ,UAAU,MAAM;AACd,IAAA,aAAA,CAAc,KAAK,CAAA;AAEnB,IAAA,MAAM,YAAY,IAAA,EAAM,SAAA;AACxB,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,gBAAgB,YAAY;AAChC,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,SAAA,EAAW;AAAA,UACtC,MAAA,EAAQ,MAAA;AAAA,UACR,KAAA,EAAO;AAAA,SACR,CAAA;AACD,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,aAAA,CAAc,IAAI,CAAA;AAAA,QACpB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAEA,IAAA,aAAA,EAAc;AAAA,EAChB,CAAA,EAAG,CAAC,IAAA,EAAM,SAAS,CAAC,CAAA;AAEpB,EAAAA,UAAU,MAAM;AACd,IAAA,SAAS,mBAAmB,KAAA,EAAmB;AAC7C,MAAA,IACE,WAAA,CAAY,WACZ,CAAC,WAAA,CAAY,QAAQ,QAAA,CAAS,KAAA,CAAM,MAAc,CAAA,EAClD;AACA,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA,MACjB;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,kBAAkB,CAAA;AAAA,IAC3D;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,kBAAkB,CAAA;AAAA,IAC9D,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,eAAe,aAAA,GAAgB;AAC7B,IAAA,MAAM,OAAA,EAAQ;AACd,IAAA,SAAA,CAAU,KAAK,CAAA;AACf,IAAA,MAAA,CAAO,SAAS,IAAA,GAAO,eAAA;AAAA,EACzB;AAEA,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,QAAA,GAAW,KAAK,IAAA,GAClB,IAAA,CAAK,KAAK,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY,GAChC,KAAK,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,WAAA,EAAY;AAErD,EAAA,uBACEE,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,uBAAA,EAAyB,UAAA,CAAW,kBAAkB,CAAA;AAAA,MACpE,GAAA,EAAK,WAAA;AAAA,MAEL,QAAA,EAAA;AAAA,wBAAAA,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,qFAAA;AAAA,cACA,wCAAA;AAAA,cACA,kBAAA;AAAA,cACA,SAAS,UAAA,IAAc,gBAAA;AAAA,cACvB,UAAA,CAAW;AAAA,aACb;AAAA,YACA,OAAA,EAAS,MAAM,SAAA,CAAU,CAAC,MAAM,CAAA;AAAA,YAChC,eAAA,EAAe,MAAA;AAAA,YACf,eAAA,EAAc,MAAA;AAAA,YAEd,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC,SAAI,SAAA,EAAU,qEAAA,EACZ,eAAK,SAAA,IAAa,CAAC,6BAClBA,GAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,KAAK,IAAA,CAAK,SAAA;AAAA,kBACV,KAAK,IAAA,CAAK,KAAA;AAAA,kBACV,OAAA,EAAS,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,kBACjC,SAAA,EAAU;AAAA;AAAA,kCAGZA,GAAAA,CAAC,UAAK,SAAA,EAAU,kCAAA,EAAoC,oBAAS,CAAA,EAEjE,CAAA;AAAA,cACC,SAAS,UAAA,oBACRC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,IAAA,CAAK,wBACJD,GAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAW,EAAA;AAAA,sBACT,yDAAA;AAAA,sBACA,UAAA,CAAW;AAAA,qBACb;AAAA,oBAEC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,iBACR;AAAA,gCAEFA,GAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAW,EAAA;AAAA,sBACT,2CAAA;AAAA,sBACA,UAAA,CAAW;AAAA,qBACb;AAAA,oBAEC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA;AACR,eAAA,EACF;AAAA;AAAA;AAAA,SAEJ;AAAA,QAEC,0BACCA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,yCAAA;AAAA,cACA,4CAAA;AAAA,cACA,oCAAA;AAAA,cACA,UAAA,CAAW;AAAA,aACb;AAAA,YAEA,QAAA,kBAAAC,IAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,aAAA;AAAA,gBACT,SAAA,EAAU,uLAAA;AAAA,gBAEV,QAAA,EAAA;AAAA,kCAAAD,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,kBAAE;AAAA;AAAA;AAAA;AAEhC;AAAA;AACF;AAAA;AAAA,GAEJ;AAEJ;AClIO,SAAS,OAAA,CAAQ;AAAA,EACtB,QAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA,GAAa,UAAA;AAAA,EACb,SAAA;AAAA,EACA;AACF,CAAA,EAAiB;AACf,EAAA,MAAM,EAAE,UAAA,EAAY,QAAA,EAAU,IAAA,KAAS,WAAA,EAAY;AAEnD,EAAAD,UAAU,MAAM;AACd,IAAA,IAAI,QAAA,IAAY,CAAC,UAAA,EAAY;AAE3B,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,UAAA,CAAW,UAAU,CAAA;AAAA,MACvB,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,SAAS,IAAA,GAAO,UAAA;AAAA,MACzB;AAAA,IACF,CAAA,MAAA,IAAW,QAAA,IAAY,UAAA,IAAc,SAAA,IAAa,IAAA,EAAM;AAEtD,MAAA,IAAI,CAAC,SAAA,CAAU,IAAI,CAAA,EAAG;AACpB,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,UAAA,CAAW,UAAU,CAAA;AAAA,QACvB,CAAA,MAAO;AACL,UAAA,MAAA,CAAO,SAAS,IAAA,GAAO,UAAA;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,UAAA,EAAY,YAAY,SAAA,EAAW,IAAA,EAAM,UAAU,CAAC,CAAA;AAGlE,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,4BAAYC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAmB,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,EACjE;AAGA,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,QAAA,IAAY,IAAA;AAAA,EACrB;AAGA,EAAA,IAAI,SAAA,IAAa,IAAA,IAAQ,CAAC,SAAA,CAAU,IAAI,CAAA,EAAG;AACzC,IAAA,OAAO,QAAA,IAAY,IAAA;AAAA,EACrB;AAEA,EAAA,uBAAOA,GAAAA,CAAAK,QAAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AACrB;AClEO,SAAS,QAAA,CAAS,EAAE,QAAA,EAAS,EAAqB;AACvD,EAAA,MAAM,EAAE,UAAA,EAAY,QAAA,EAAS,GAAI,WAAA,EAAY;AAE7C,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,EAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AAExB,EAAA,uBAAOL,GAAAA,CAAAK,QAAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AACrB;ACPO,SAAS,SAAA,CAAU,EAAE,QAAA,EAAS,EAAqB;AACxD,EAAA,MAAM,EAAE,UAAA,EAAY,QAAA,EAAS,GAAI,WAAA,EAAY;AAE7C,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,EAAA,IAAI,YAAY,OAAO,IAAA;AAEvB,EAAA,uBAAOL,GAAAA,CAAAK,QAAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AACrB;ACmCO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,UAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,eAAA,GAAkBF,OAAO,KAAK,CAAA;AACpC,EAAA,MAAM,EAAE,kBAAA,EAAmB,GAAI,WAAA,EAAY;AAE3C,EAAAJ,UAAU,MAAM;AACd,IAAA,MAAM,kBAAkB,YAAY;AAElC,MAAA,IAAI,gBAAgB,OAAA,EAAS;AAC7B,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,MAAA,MAAM,YAAA,GAAe,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AAG/D,MAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AACtC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,QACf,CAAA,MAAO;AACL,UAAA,MAAM,QAAA,GAAW,UAAA,GAAa,kBAAA,CAAmB,KAAK,CAAA;AACtD,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,UAAA,CAAW,QAAQ,CAAA;AAAA,UACrB,CAAA,MAAO;AACL,YAAA,MAAA,CAAO,SAAS,IAAA,GAAO,QAAA;AAAA,UACzB;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,WAAA,GAAc,YAAA,CAAa,GAAA,CAAI,cAAc,CAAA;AACnD,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,CAAI,SAAS,CAAA;AACzC,MAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AACtC,MAAA,MAAM,IAAA,GAAO,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA;AAEpC,MAAA,IAAI,CAAC,WAAA,EAAa;AAEhB,QAAA,MAAM,QAAA,GAAW,UAAA;AACjB,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,OAAA,CAAQ,QAAQ,CAAA;AAAA,QAClB,CAAA,MAAO;AACL,UAAA,MAAM,QAAA,GAAW,UAAA,GAAa,kBAAA,CAAmB,QAAQ,CAAA;AACzD,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,UAAA,CAAW,QAAQ,CAAA;AAAA,UACrB,CAAA,MAAO;AACL,YAAA,MAAA,CAAO,SAAS,IAAA,GAAO,QAAA;AAAA,UACzB;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB;AAAA,QACtC,WAAA;AAAA,QACA,QAAQ,MAAA,IAAU,MAAA;AAAA,QAClB,OAAO,KAAA,IAAS,MAAA;AAAA,QAChB,MAAM,IAAA,IAAQ;AAAA,OACf,CAAA;AAED,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,QAAA,GAAW,OAAO,KAAA,IAAS,uBAAA;AACjC,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,OAAA,CAAQ,QAAQ,CAAA;AAAA,QAClB,CAAA,MAAO;AACL,UAAA,MAAM,QAAA,GAAW,UAAA,GAAa,kBAAA,CAAmB,QAAQ,CAAA;AACzD,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,UAAA,CAAW,QAAQ,CAAA;AAAA,UACrB,CAAA,MAAO;AACL,YAAA,MAAA,CAAO,SAAS,IAAA,GAAO,QAAA;AAAA,UACzB;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAGA,MAAA,MAAA,CAAO,QAAQ,YAAA,CAAa,IAAI,EAAA,EAAI,MAAA,CAAO,SAAS,QAAQ,CAAA;AAG5D,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,SAAA,EAAU;AAAA,MACZ;AAEA,MAAA,MAAM,WAAA,GACJ,cACA,cAAA,CAAe,OAAA,CAAQ,kBAAkB,CAAA,IACzC,cAAA,CAAe,OAAA,CAAQ,yBAAyB,CAAA,IAChD,GAAA;AAEF,MAAA,cAAA,CAAe,WAAW,kBAAkB,CAAA;AAC5C,MAAA,cAAA,CAAe,WAAW,yBAAyB,CAAA;AAGnD,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,UAAA,CAAW,WAAW,CAAA;AAAA,MACxB,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,SAAS,IAAA,GAAO,WAAA;AAAA,MACzB;AAAA,IACF,CAAA;AAEA,IAAA,eAAA,EAAgB;AAAA,EAClB,GAAG,CAAC,kBAAA,EAAoB,YAAY,SAAA,EAAW,OAAA,EAAS,UAAU,CAAC,CAAA;AAEnE,EAAA,MAAM,cAAA,mBACJC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDACb,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6BAAA,EAA8B,QAAA,EAAA,8BAAA,EAA4B,CAAA;AAAA,oBACxEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wEAAA,EAAyE;AAAA,GAAA,EAC1F,CAAA,EACF,CAAA;AAGF,EAAA,OAAO,gBAAA,IAAoB,cAAA;AAC7B;ACjIO,SAAS,kBAAA,CAAmB;AAAA,EACjC,KAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,OAAA,GAAU,KAAA;AAAA,EACV,aAAa,EAAC;AAAA,EACd,KAAA,GAAQ,kBAAA;AAAA,EACR,QAAA,GAAW,4EAAA;AAAA,EACX,UAAA,GAAa,OAAA;AAAA,EACb,gBAAA,GAAmB,mBAAA;AAAA,EACnB,gBAAA,GAAmB,iBAAA;AAAA,EACnB,iBAAA,GAAoB,YAAA;AAAA,EACpB,gBAAA,GAAmB,yBAAA;AAAA,EACnB,eAAA,GAAkB,UAAA;AAAA,EAClB,YAAA,GAAe,kBAAA;AAAA,EACf;AACF,CAAA,EAA4B;AAC1B,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACEA,GAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,UAAA,EAAY;AAAA,UACV,oBAAoB,UAAA,CAAW,SAAA;AAAA,UAC/B,eAAe,UAAA,CAAW;AAAA,SAC5B;AAAA,QAEA,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wFAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EAA6C,IAAA,EAAK,MAAA,EAAO,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,WAAA,EAAY,GAAA,EAAI,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAC9J,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gBAAA,EAAiB,CAAA,EAC3B,CAAA,EACF,CAAA;AAAA,0BACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iEAAiE,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,0BAC5FA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8DACV,QAAA,EAAA,cAAA,IAAkB,CAAA,oCAAA,EAAuC,KAAK,CAAA,sDAAA,CAAA,EACjE,CAAA;AAAA,0BACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,MAAM,eAAA,EAAiB,SAAA,EAAU,+CAA8C,QAAA,EAAA,iBAAA,EAElF;AAAA,SAAA,EACF;AAAA;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,uBACEC,IAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,UAAA,EAAY;AAAA,QACV,oBAAoB,UAAA,CAAW,SAAA;AAAA,QAC/B,eAAe,UAAA,CAAW;AAAA,OAC5B;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,KAAA;AAAA,YACA,QAAA;AAAA,YACA,UAAA,EAAY;AAAA,cACV,kBAAA,EAAoB,WAAW,MAAA,EAAQ,SAAA;AAAA,cACvC,cAAA,EAAgB,WAAW,MAAA,EAAQ,KAAA;AAAA,cACnC,iBAAA,EAAmB,WAAW,MAAA,EAAQ;AAAA;AACxC;AAAA,SACF;AAAA,wBAEAA,GAAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,OAAO,KAAA,IAAS,EAAA;AAAA,YAChB,WAAW,UAAA,CAAW;AAAA;AAAA,SACxB;AAAA,wBAEAC,IAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,QAAA;AAAA,YACA,UAAA,EAAU,IAAA;AAAA,YACV,SAAA,EAAW,UAAA,CAAW,IAAA,EAAM,SAAA,IAAa,kDAAA;AAAA,YAEzC,QAAA,EAAA;AAAA,8BAAAD,GAAAA;AAAA,gBAAC,aAAA;AAAA,gBAAA;AAAA,kBACC,EAAA,EAAG,OAAA;AAAA,kBACH,IAAA,EAAK,OAAA;AAAA,kBACL,KAAA,EAAO,UAAA;AAAA,kBACP,WAAA,EAAa,gBAAA;AAAA,kBACb,KAAA,EAAO,KAAA;AAAA,kBACP,UAAU,CAAC,CAAA,KAAM,aAAA,CAAc,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,kBAC7C,QAAA,EAAQ,IAAA;AAAA,kBACR,YAAA,EAAa,OAAA;AAAA,kBACb,UAAA,EAAY;AAAA,oBACV,kBAAA,EAAoB,UAAA,CAAW,IAAA,EAAM,UAAA,EAAY,SAAA;AAAA,oBACjD,cAAA,EAAgB,UAAA,CAAW,IAAA,EAAM,UAAA,EAAY,KAAA;AAAA,oBAC7C,cAAA,EAAgB,UAAA,CAAW,IAAA,EAAM,UAAA,EAAY;AAAA;AAC/C;AAAA,eACF;AAAA,8BAEAA,GAAAA;AAAA,gBAAC,gBAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW,OAAA;AAAA,kBACX,QAAA,EAAU,OAAA;AAAA,kBACV,WAAW,UAAA,CAAW,MAAA;AAAA,kBAErB,oBAAU,iBAAA,GAAoB;AAAA;AAAA;AACjC;AAAA;AAAA,SACF;AAAA,wBAEAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,gBAAA;AAAA,YACN,QAAA,EAAS,iBAAA;AAAA,YACT,IAAA,EAAM,eAAA;AAAA,YACN,UAAA,EAAY;AAAA,cACV,kBAAA,EAAoB,WAAW,IAAA,EAAM,SAAA;AAAA,cACrC,aAAA,EAAe,WAAW,IAAA,EAAM;AAAA;AAClC;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;ACxGO,SAAS,iBAAA,CAAkB;AAAA,EAChC,WAAA;AAAA,EACA,eAAA;AAAA,EACA,mBAAA;AAAA,EACA,uBAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,eAAA;AAAA,EACA,aAAa,EAAC;AAAA,EACd,KAAA,GAAQ,gBAAA;AAAA,EACR,QAAA,GAAW,gCAAA;AAAA,EACX,gBAAA,GAAmB,cAAA;AAAA,EACnB,sBAAA,GAAyB,sCAAA;AAAA,EACzB,oBAAA,GAAuB,kBAAA;AAAA,EACvB,0BAAA,GAA6B,sCAAA;AAAA,EAC7B,gBAAA,GAAmB,gBAAA;AAAA,EACnB,iBAAA,GAAoB,cAAA;AAAA,EACpB,gBAAA,GAAmB,EAAA;AAAA,EACnB,eAAA,GAAkB;AACpB,CAAA,EAA2B;AACzB,EAAA,uBACEC,IAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,UAAA,EAAY;AAAA,QACV,oBAAoB,UAAA,CAAW,SAAA;AAAA,QAC/B,eAAe,UAAA,CAAW;AAAA,OAC5B;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,KAAA;AAAA,YACA,QAAA;AAAA,YACA,UAAA,EAAY;AAAA,cACV,kBAAA,EAAoB,WAAW,MAAA,EAAQ,SAAA;AAAA,cACvC,cAAA,EAAgB,WAAW,MAAA,EAAQ,KAAA;AAAA,cACnC,iBAAA,EAAmB,WAAW,MAAA,EAAQ;AAAA;AACxC;AAAA,SACF;AAAA,wBAEAA,GAAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,OAAO,KAAA,IAAS,EAAA;AAAA,YAChB,WAAW,UAAA,CAAW;AAAA;AAAA,SACxB;AAAA,wBAEAC,IAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,QAAA;AAAA,YACA,UAAA,EAAU,IAAA;AAAA,YACV,SAAA,EAAW,UAAA,CAAW,IAAA,EAAM,SAAA,IAAa,kDAAA;AAAA,YAEzC,QAAA,EAAA;AAAA,8BAAAD,GAAAA;AAAA,gBAAC,iBAAA;AAAA,gBAAA;AAAA,kBACC,EAAA,EAAG,aAAA;AAAA,kBACH,KAAA,EAAO,gBAAA;AAAA,kBACP,WAAA,EAAa,sBAAA;AAAA,kBACb,KAAA,EAAO,WAAA;AAAA,kBACP,UAAU,CAAC,CAAA,KAAM,mBAAA,CAAoB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,kBACnD,QAAA,EAAQ,IAAA;AAAA,kBACR,YAAA,EAAa,cAAA;AAAA,kBACb,qBAAA,EAAqB,IAAA;AAAA,kBACrB,eAAA;AAAA,kBACA,UAAA,EAAY;AAAA,oBACV,kBAAA,EAAoB,UAAA,CAAW,IAAA,EAAM,gBAAA,EAAkB,SAAA;AAAA,oBACvD,cAAA,EAAgB,UAAA,CAAW,IAAA,EAAM,gBAAA,EAAkB,KAAA;AAAA,oBACnD,cAAA,EAAgB,UAAA,CAAW,IAAA,EAAM,gBAAA,EAAkB;AAAA;AACrD;AAAA,eACF;AAAA,8BAEAA,GAAAA;AAAA,gBAAC,iBAAA;AAAA,gBAAA;AAAA,kBACC,EAAA,EAAG,iBAAA;AAAA,kBACH,KAAA,EAAO,oBAAA;AAAA,kBACP,WAAA,EAAa,0BAAA;AAAA,kBACb,KAAA,EAAO,eAAA;AAAA,kBACP,UAAU,CAAC,CAAA,KAAM,uBAAA,CAAwB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,kBACvD,QAAA,EAAQ,IAAA;AAAA,kBACR,YAAA,EAAa,cAAA;AAAA,kBACb,eAAA;AAAA,kBACA,UAAA,EAAY;AAAA,oBACV,kBAAA,EAAoB,UAAA,CAAW,IAAA,EAAM,oBAAA,EAAsB,SAAA;AAAA,oBAC3D,cAAA,EAAgB,UAAA,CAAW,IAAA,EAAM,oBAAA,EAAsB,KAAA;AAAA,oBACvD,cAAA,EAAgB,UAAA,CAAW,IAAA,EAAM,oBAAA,EAAsB;AAAA;AACzD;AAAA,eACF;AAAA,8BAEAA,GAAAA;AAAA,gBAAC,gBAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW,OAAA;AAAA,kBACX,QAAA,EAAU,OAAA;AAAA,kBACV,WAAW,UAAA,CAAW,MAAA;AAAA,kBAErB,oBAAU,iBAAA,GAAoB;AAAA;AAAA;AACjC;AAAA;AAAA,SACF;AAAA,wBAEAC,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,UAAA,CAAW,gBAAgB,sDAAA,EACtC,QAAA,EAAA;AAAA,UAAA,gBAAA,oBAAoBA,KAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,YAAA,gBAAA;AAAA,YAAiB;AAAA,WAAA,EAAC,CAAA;AAAA,0BAC9CD,GAAAA,CAAC,GAAA,EAAA,EAAE,MAAM,eAAA,EAAiB,SAAA,EAAU,0CAAyC,QAAA,EAAA,iBAAA,EAE7E;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;ACnHO,SAAS,iBAAA,CAAkB;AAAA,EAChC,MAAA;AAAA,EACA,KAAA;AAAA,EACA,aAAa,EAAC;AAAA,EACd,cAAA,GAAiB,yBAAA;AAAA,EACjB,YAAA,GAAe,iBAAA;AAAA,EACf,cAAA,GAAiB,4FAAA;AAAA,EACjB,UAAA,GAAa;AACf,CAAA,EAA2B;AACzB,EAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,IAAA,uBACEA,IAAC,aAAA,EAAA,EAAc,UAAA,EACb,0BAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wDAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mDAAA,EAAqD,QAAA,EAAA,cAAA,EAAe,CAAA;AAAA,sBAClFA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+EAAA,EAAgF;AAAA,KAAA,EACjG,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,WAAW,OAAA,EAAS;AACtB,IAAA,uBACEA,GAAAA,CAAC,aAAA,EAAA,EAAc,UAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDAAA,EACb,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gDAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mDAAA,EAAqD,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,sBAC9EC,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gEAAA,EACV,QAAA,EAAA;AAAA,QAAA,KAAA,IAAS,kDAAA;AAAA,QAAmD;AAAA,OAAA,EAC/D;AAAA,KAAA,EACF,GACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,uBACED,GAAAA,CAAC,aAAA,EAAA,EAAc,UAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDAAA,EACb,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kCAAA,EACb,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wFAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EAA6C,IAAA,EAAK,MAAA,EAAO,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,WAAA,EAAY,GAAA,EAAI,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAC9J,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gBAAA,EAAiB,CAAA,EAC3B,CAAA,EACF,CAAA;AAAA,oBACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iEAAiE,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,oBAC5FA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8DACV,QAAA,EAAA,cAAA,EACH;AAAA,GAAA,EACF,GACF,CAAA,EACF,CAAA;AAEJ;;;AClDO,SAAS,OAAA,GAAU;AACxB,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,SAAS,QAAA,EAAU,UAAA,KAAe,WAAA,EAAY;AACtE,EAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,UAAU,UAAA,EAAW;AACzD;;;ACNO,SAAS,OAAA,GAAU;AACxB,EAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,OAAA,KAAY,WAAA,EAAY;AAC5D,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,OAAA,EAAQ;AAC/C;AC/BO,IAAM,WAAA,GAAc,EACxB,MAAA,EAAO,CACP,IAAI,CAAA,EAAG,mBAAmB,CAAA,CAC1B,KAAA,CAAM,uBAAuB;AAKzB,SAAS,qBAAqB,OAAA,EAMlC;AACD,EAAA,MAAM;AAAA,IACJ,SAAA,GAAY,CAAA;AAAA,IACZ,gBAAA,GAAmB,KAAA;AAAA,IACnB,gBAAA,GAAmB,KAAA;AAAA,IACnB,aAAA,GAAgB,KAAA;AAAA,IAChB,kBAAA,GAAqB;AAAA,GACvB,GAAI,WAAW,EAAC;AAEhB,EAAA,IAAI,MAAA,GAAS,EAAE,MAAA,EAAO,CAAE,IAAI,SAAA,EAAW,CAAA,0BAAA,EAA6B,SAAS,CAAA,WAAA,CAAa,CAAA;AAE1F,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,OAAA,EAAS,qDAAqD,CAAA;AAAA,EACtF;AAEA,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,OAAA,EAAS,qDAAqD,CAAA;AAAA,EACtF;AAEA,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,IAAA,EAAM,2CAA2C,CAAA;AAAA,EACzE;AAEA,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,MAAA,GAAS,MAAA,CAAO,KAAA;AAAA,MACd,qCAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,IAAM,iBAAiB,oBAAA;AAKvB,SAAS,cAAc,KAAA,EAAmD;AAC/E,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,SAAA,CAAU,KAAK,CAAA;AAC1C,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AAAA,EACvB;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,MAAM,OAAA,EAAQ;AACrD;AAKO,SAAS,gBAAA,CACd,UACA,OAAA,EACoC;AACpC,EAAA,MAAM,MAAA,GAAS,qBAAqB,OAAO,CAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAA,CAAU,QAAQ,CAAA;AACxC,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AAAA,EACvB;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,MAAM,OAAA,EAAQ;AACrD;AAKO,SAAS,sBAAsB,QAAA,EAGpC;AACA,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,IAAI,QAAA,CAAS,UAAU,CAAA,EAAG;AACxB,IAAA,KAAA,IAAS,CAAA;AAAA,EACX,CAAA,MAAO;AACL,IAAA,QAAA,CAAS,KAAK,2BAA2B,CAAA;AAAA,EAC3C;AAEA,EAAA,IAAI,QAAA,CAAS,UAAU,EAAA,EAAI;AACzB,IAAA,KAAA,IAAS,CAAA;AAAA,EACX;AAEA,EAAA,IAAI,QAAQ,IAAA,CAAK,QAAQ,KAAK,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,EAAG;AACpD,IAAA,KAAA,IAAS,CAAA;AAAA,EACX,CAAA,MAAO;AACL,IAAA,QAAA,CAAS,KAAK,0CAA0C,CAAA;AAAA,EAC1D;AAEA,EAAA,IAAI,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,EAAG;AACvB,IAAA,KAAA,IAAS,CAAA;AAAA,EACX,CAAA,MAAO;AACL,IAAA,QAAA,CAAS,KAAK,6BAA6B,CAAA;AAAA,EAC7C;AAEA,EAAA,IAAI,qCAAA,CAAsC,IAAA,CAAK,QAAQ,CAAA,EAAG;AACxD,IAAA,KAAA,IAAS,CAAA;AAAA,EACX,CAAA,MAAO;AACL,IAAA,QAAA,CAAS,KAAK,wCAAwC,CAAA;AAAA,EACxD;AAEA,EAAA,OAAO,EAAE,OAAO,QAAA,EAAS;AAC3B;ACjFA,SAAS,cAAA,CAAe,EAAE,OAAA,EAAS,IAAA,EAAK,EAAsC;AAC5E,EAAAD,UAAU,MAAM;AACd,IAAA,MAAM,WAAA,GAAc,CAAA,EAAG,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,cAAA,CAAA;AAC7C,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AACrC,IAAA,OAAA,CAAQ,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,WAAW,CAAA;AAChD,IAAA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,OAAA,CAAQ,QAAA,EAAU,CAAA;AAAA,EAC5C,CAAA,EAAG,CAAC,OAAA,EAAS,IAAI,CAAC,CAAA;AAElB,EAAA,OAAO,IAAA;AACT;AAwDO,SAAS,kBAAkB,MAAA,EAAgD;AAChF,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,WAAA,GAAc,IAAA;AAAA,IACd,QAAQ;AAAC,GACX,GAAI,MAAA;AAEJ,EAAA,MAAM;AAAA,IACJ,MAAA,GAAS,UAAA;AAAA,IACT,MAAA,GAAS,UAAA;AAAA,IACT,WAAA,GAAc,eAAA;AAAA,IACd,cAAA,GAAiB,kBAAA;AAAA,IACjB,aAAA,GAAgB;AAAA,GAClB,GAAI,KAAA;AAEJ,EAAA,MAAM,SAAwB,EAAC;AAG/B,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAA,CAAO,IAAA;AAAA,MACL;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,yBAASC,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,eAAA,EAAgB;AAAA,OAClE;AAAA,MACA;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,yBAASA,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,eAAA,EAAgB;AAAA,OAClE;AAAA,MACA;AAAA,QACE,IAAA,EAAM,WAAA;AAAA,QACN,yBAASA,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,oBAAA,EAAqB;AAAA,OACvE;AAAA,MACA;AAAA,QACE,IAAA,EAAM,cAAA;AAAA,QACN,yBAASA,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,uBAAA,EAAwB;AAAA,OAC1E;AAAA,MACA;AAAA,QACE,IAAA,EAAM,aAAA;AAAA,QACN,yBAASA,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,MAAK,sBAAA,EAAuB;AAAA;AACzE,KACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT","file":"index.mjs","sourcesContent":["\"use client\";\r\n\r\nimport {\r\n createContext,\r\n useContext,\r\n useEffect,\r\n useState,\r\n useCallback,\r\n useRef,\r\n type ReactNode,\r\n} from \"react\";\r\nimport { createClient } from \"@insforge/sdk\";\r\nimport type { InsforgeUser } from \"../types\";\r\nimport { GetPublicAuthConfigResponse } from \"@insforge/shared-schemas\";\r\n\r\ninterface InsforgeContextValue {\r\n // Auth state\r\n user: InsforgeUser | null;\r\n isLoaded: boolean;\r\n isSignedIn: boolean;\r\n\r\n // Auth methods\r\n setUser: (user: InsforgeUser | null) => void;\r\n signIn: (\r\n email: string,\r\n password: string\r\n ) => Promise<\r\n | {\r\n user?: { id: string; email: string; name: string };\r\n accessToken: string | null;\r\n }\r\n | { error: string }\r\n >;\r\n signUp: (\r\n email: string,\r\n password: string\r\n ) => Promise<\r\n | {\r\n user?: { id: string; email: string; name: string };\r\n accessToken: string | null;\r\n }\r\n | { error: string }\r\n >;\r\n signOut: () => Promise<void>;\r\n updateUser: (data: Partial<InsforgeUser>) => Promise<void>;\r\n reloadAuth: () => Promise<{ success: boolean; error?: string }>;\r\n \r\n // Callback handling for OAuth and email/password redirects\r\n handleAuthCallback: (params: {\r\n accessToken: string;\r\n userId?: string;\r\n email?: string;\r\n name?: string;\r\n }) => Promise<{ success: boolean; error?: string }>;\r\n\r\n // Email verification methods\r\n sendPasswordResetCode: (\r\n email: string\r\n ) => Promise<{ success: boolean; message: string } | null>;\r\n resetPassword: (\r\n token: string,\r\n newPassword: string\r\n ) => Promise<{ message: string; redirectTo?: string } | null>;\r\n verifyEmail: (\r\n token: string\r\n ) => Promise<{ accessToken: string; user?: any } | null>;\r\n\r\n // Public auth config\r\n getPublicAuthConfig: () => Promise<GetPublicAuthConfigResponse | null>;\r\n // Base config\r\n baseUrl: string;\r\n}\r\n\r\nconst InsforgeContext = createContext<InsforgeContextValue | undefined>(\r\n undefined\r\n);\r\n\r\nexport interface InsforgeProviderProps {\r\n children: ReactNode;\r\n baseUrl: string;\r\n onAuthChange?: (user: InsforgeUser | null) => void;\r\n // Optional: custom token sync functions (e.g., for Next.js cookie sync)\r\n syncTokenToCookie?: (token: string) => Promise<boolean>;\r\n clearCookie?: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * Unified Insforge Provider - manages authentication state and configuration\r\n *\r\n * Manages user authentication state and provides all necessary context to child components.\r\n * Works with any React framework (Next.js, Vite, Remix, etc.).\r\n *\r\n * @example\r\n * ```tsx\r\n * // Basic usage (React/Vite)\r\n * import { InsforgeProvider } from '@insforge/react';\r\n *\r\n * export default function App() {\r\n * return (\r\n * <InsforgeProvider baseUrl={process.env.VITE_INSFORGE_BASE_URL}>\r\n * {children}\r\n * </InsforgeProvider>\r\n * );\r\n * }\r\n * ```\r\n *\r\n * @example\r\n * ```tsx\r\n * // With cookie sync (Next.js optimization)\r\n * <InsforgeProvider\r\n * baseUrl={baseUrl}\r\n * syncTokenToCookie={async (token) => {\r\n * await fetch('/api/auth', {\r\n * method: 'POST',\r\n * body: JSON.stringify({ token })\r\n * });\r\n * return true;\r\n * }}\r\n * clearCookie={async () => {\r\n * await fetch('/api/auth', { method: 'DELETE' });\r\n * }}\r\n * >\r\n * {children}\r\n * </InsforgeProvider>\r\n * ```\r\n */\r\nexport function InsforgeProvider({\r\n children,\r\n baseUrl,\r\n onAuthChange,\r\n syncTokenToCookie,\r\n clearCookie,\r\n}: InsforgeProviderProps) {\r\n // Auth state\r\n const [user, setUser] = useState<InsforgeUser | null>(null);\r\n const [isLoaded, setIsLoaded] = useState(false);\r\n\r\n const refreshIntervalRef = useRef<NodeJS.Timeout | null>(null);\r\n\r\n // Initialize SDK client with lazy initialization - only runs once\r\n const [insforge] = useState(() => createClient({ baseUrl }));\r\n\r\n // Load auth state - returns explicit success/error status\r\n const loadAuthState = useCallback(async (): Promise<{\r\n success: boolean;\r\n error?: string;\r\n }> => {\r\n try {\r\n // Use SDK's getCurrentSession() to check for existing session\r\n const sessionResult = insforge.auth.getCurrentSession();\r\n const session = sessionResult.data?.session;\r\n const token = session?.accessToken || null;\r\n\r\n if (!token) {\r\n // No token, user is not authenticated\r\n setUser(null);\r\n if (onAuthChange) {\r\n onAuthChange(null);\r\n }\r\n setIsLoaded(true);\r\n return { success: false, error: \"no_session\" };\r\n }\r\n\r\n const userResult = await insforge.auth.getCurrentUser();\r\n\r\n if (userResult.data) {\r\n // Token is valid, update user state with fresh data\r\n const profile = userResult.data.profile;\r\n const userData: InsforgeUser = {\r\n id: userResult.data.user.id,\r\n email: userResult.data.user.email,\r\n name: (profile?.nickname as string | undefined) || \"\",\r\n avatarUrl: (profile?.avatarUrl as string | undefined) || \"\",\r\n };\r\n\r\n setUser(userData);\r\n\r\n if (onAuthChange) {\r\n onAuthChange(userData);\r\n }\r\n setIsLoaded(true);\r\n return { success: true };\r\n } else {\r\n // Token invalid or expired\r\n await insforge.auth.signOut();\r\n\r\n // Clear cookie if function provided\r\n if (clearCookie) {\r\n try {\r\n await clearCookie();\r\n } catch (error) {\r\n // Ignore errors\r\n }\r\n }\r\n\r\n setUser(null);\r\n if (onAuthChange) {\r\n onAuthChange(null);\r\n }\r\n setIsLoaded(true);\r\n return { success: false, error: \"invalid_token\" };\r\n }\r\n } catch (error) {\r\n // Token validation failed\r\n console.error(\"[InsforgeProvider] Token validation failed:\", error);\r\n\r\n await insforge.auth.signOut();\r\n\r\n // Clear cookie if function provided\r\n if (clearCookie) {\r\n try {\r\n await clearCookie();\r\n } catch (error) {\r\n // Ignore errors\r\n }\r\n }\r\n\r\n setUser(null);\r\n if (onAuthChange) {\r\n onAuthChange(null);\r\n }\r\n setIsLoaded(true);\r\n\r\n return {\r\n success: false,\r\n error: error instanceof Error ? error.message : \"authentication_failed\",\r\n };\r\n }\r\n }, [insforge, onAuthChange, syncTokenToCookie, clearCookie]);\r\n\r\n useEffect(() => {\r\n // Run loadAuthState only once on mount\r\n loadAuthState();\r\n\r\n return () => {\r\n if (refreshIntervalRef.current) {\r\n clearInterval(refreshIntervalRef.current);\r\n }\r\n };\r\n }, []); // Empty deps - run only on mount\r\n\r\n const getPublicAuthConfig = useCallback(async () => {\r\n try {\r\n const result = await insforge.auth.getPublicAuthConfig();\r\n if (result.data) {\r\n return result.data;\r\n } else {\r\n console.error('[InsforgeProvider] Failed to get public auth config:', result.error);\r\n return null;\r\n }\r\n } catch (error) {\r\n console.error(\r\n \"[InsforgeProvider] Failed to get public auth config:\",\r\n error\r\n );\r\n return null;\r\n }\r\n }, [insforge]);\r\n\r\n /**\r\n * Helper function to handle successful authentication\r\n */\r\n const handleAuthSuccess = useCallback(\r\n async (\r\n authToken: string,\r\n fallbackUser?: { id?: string; email?: string; name?: string }\r\n ) => {\r\n const userResult = await insforge.auth.getCurrentUser();\r\n\r\n if (userResult.data) {\r\n const profile = userResult.data.profile;\r\n const userData: InsforgeUser = {\r\n id: userResult.data.user.id,\r\n email: userResult.data.user.email,\r\n name: (profile?.nickname as string | undefined) || \"\",\r\n avatarUrl: (profile?.avatarUrl as string | undefined) || \"\",\r\n };\r\n\r\n setUser(userData);\r\n\r\n if (onAuthChange) {\r\n onAuthChange(userData);\r\n }\r\n\r\n // Try to sync token to cookie if function provided\r\n if (syncTokenToCookie) {\r\n try {\r\n await syncTokenToCookie(authToken);\r\n } catch (error) {\r\n // Cookie sync failed - that's okay\r\n }\r\n }\r\n } else if (fallbackUser) {\r\n // Fallback to basic user data if getCurrentUser fails\r\n const userData: InsforgeUser = {\r\n id: fallbackUser.id || \"\",\r\n email: fallbackUser.email || \"\",\r\n name: fallbackUser.name || \"\",\r\n avatarUrl: \"\",\r\n };\r\n\r\n setUser(userData);\r\n\r\n if (onAuthChange) {\r\n onAuthChange(userData);\r\n }\r\n }\r\n },\r\n [insforge, onAuthChange, syncTokenToCookie]\r\n );\r\n\r\n /**\r\n * Handle authentication callback from OAuth or email/password redirects\r\n * This is specifically for callback pages - saves token and verifies authentication\r\n */\r\n const handleAuthCallback = useCallback(\r\n async (params: {\r\n accessToken: string;\r\n userId?: string;\r\n email?: string;\r\n name?: string;\r\n }): Promise<{ success: boolean; error?: string }> => {\r\n try {\r\n await insforge.auth.setSession({\r\n accessToken: params.accessToken,\r\n user: {\r\n id: params.userId || '',\r\n email: params.email || '',\r\n name: params.name || '',\r\n emailVerified: false,\r\n createdAt: new Date().toISOString(),\r\n updatedAt: new Date().toISOString(),\r\n },\r\n });\r\n\r\n // Now verify the token and get full user data\r\n const userResult = await insforge.auth.getCurrentUser();\r\n\r\n if (!userResult.data) {\r\n // Token is invalid\r\n await insforge.auth.signOut();\r\n \r\n if (clearCookie) {\r\n try {\r\n await clearCookie();\r\n } catch (error) {\r\n // Ignore errors\r\n }\r\n }\r\n\r\n return { success: false, error: 'invalid_token' };\r\n }\r\n\r\n // Update user state with full profile data\r\n const profile = userResult.data.profile;\r\n const userData: InsforgeUser = {\r\n id: userResult.data.user.id,\r\n email: userResult.data.user.email,\r\n name: (profile?.nickname as string | undefined) || params.name || '',\r\n avatarUrl: (profile?.avatarUrl as string | undefined) || '',\r\n };\r\n\r\n setUser(userData);\r\n\r\n if (onAuthChange) {\r\n onAuthChange(userData);\r\n }\r\n\r\n // Sync token to cookie if function provided\r\n if (syncTokenToCookie) {\r\n try {\r\n await syncTokenToCookie(params.accessToken);\r\n } catch (error) {\r\n // Cookie sync failed - that's okay, continue\r\n }\r\n }\r\n\r\n return { success: true };\r\n } catch (error) {\r\n // Authentication failed\r\n console.error('[InsforgeProvider] Auth callback failed:', error);\r\n\r\n await insforge.auth.signOut();\r\n\r\n if (clearCookie) {\r\n try {\r\n await clearCookie();\r\n } catch (error) {\r\n // Ignore errors\r\n }\r\n }\r\n\r\n setUser(null);\r\n if (onAuthChange) {\r\n onAuthChange(null);\r\n }\r\n\r\n return {\r\n success: false,\r\n error: error instanceof Error ? error.message : 'authentication_failed',\r\n };\r\n }\r\n },\r\n [insforge, onAuthChange, syncTokenToCookie, clearCookie]\r\n );\r\n\r\n const signIn = useCallback(\r\n async (email: string, password: string) => {\r\n const sdkResult = await insforge.auth.signInWithPassword({\r\n email,\r\n password,\r\n });\r\n\r\n if (sdkResult.data) {\r\n await handleAuthSuccess(\r\n sdkResult.data.accessToken || \"\",\r\n sdkResult.data.user\r\n ? {\r\n id: sdkResult.data.user.id,\r\n email: sdkResult.data.user.email,\r\n name: sdkResult.data.user.name,\r\n }\r\n : undefined\r\n );\r\n return sdkResult.data;\r\n } else {\r\n const errorMessage =\r\n sdkResult.error?.message || \"Invalid email or password\";\r\n return { error: errorMessage };\r\n }\r\n },\r\n [insforge, handleAuthSuccess]\r\n );\r\n\r\n const signUp = useCallback(\r\n async (email: string, password: string) => {\r\n const sdkResult = await insforge.auth.signUp({ email, password });\r\n\r\n if (sdkResult.data) {\r\n await handleAuthSuccess(\r\n sdkResult.data.accessToken || \"\",\r\n sdkResult.data.user\r\n ? {\r\n id: sdkResult.data.user.id,\r\n email: sdkResult.data.user.email,\r\n name: sdkResult.data.user.name,\r\n }\r\n : undefined\r\n );\r\n return sdkResult.data;\r\n } else {\r\n const errorMessage = sdkResult.error?.message || \"Sign up failed\";\r\n return { error: errorMessage };\r\n }\r\n },\r\n [insforge, handleAuthSuccess]\r\n );\r\n\r\n const signOut = useCallback(async () => {\r\n await insforge.auth.signOut();\r\n\r\n // Clear cookie if function provided\r\n if (clearCookie) {\r\n try {\r\n await clearCookie();\r\n } catch (error) {\r\n // Ignore errors\r\n }\r\n }\r\n\r\n // Clear refresh interval if exists\r\n if (refreshIntervalRef.current) {\r\n clearInterval(refreshIntervalRef.current);\r\n }\r\n\r\n setUser(null);\r\n if (onAuthChange) {\r\n onAuthChange(null);\r\n }\r\n }, [insforge, onAuthChange, clearCookie]);\r\n\r\n const updateUser = useCallback(\r\n async (data: Partial<InsforgeUser>) => {\r\n if (!user) throw new Error(\"No user signed in\");\r\n\r\n const profileUpdate: Record<string, any> = {\r\n nickname: data.name,\r\n avatarUrl: data.avatarUrl,\r\n };\r\n\r\n const result = await insforge.auth.setProfile(profileUpdate);\r\n\r\n if (result.data) {\r\n const userResult = await insforge.auth.getCurrentUser();\r\n if (userResult.data) {\r\n const profile = userResult.data.profile;\r\n const updatedUser: InsforgeUser = {\r\n id: userResult.data.user.id,\r\n email: userResult.data.user.email,\r\n name: (profile?.nickname as string | undefined) || \"\",\r\n avatarUrl: (profile?.avatarUrl as string | undefined) || \"\",\r\n };\r\n setUser(updatedUser);\r\n if (onAuthChange) {\r\n onAuthChange(updatedUser);\r\n }\r\n }\r\n }\r\n },\r\n [user, onAuthChange, insforge]\r\n );\r\n\r\n const sendPasswordResetCode = useCallback(\r\n async (email: string) => {\r\n const sdkResult = await insforge.auth.sendPasswordResetCode({ email });\r\n return sdkResult.data;\r\n },\r\n [insforge]\r\n );\r\n\r\n const resetPassword = useCallback(\r\n async (token: string, newPassword: string) => {\r\n const sdkResult = await insforge.auth.resetPassword({\r\n newPassword,\r\n otp: token,\r\n });\r\n return sdkResult.data;\r\n },\r\n [insforge]\r\n );\r\n\r\n const verifyEmail = useCallback(\r\n async (token: string) => {\r\n const sdkResult = await insforge.auth.verifyEmail({ otp: token });\r\n return sdkResult.data;\r\n },\r\n [insforge]\r\n );\r\n\r\n return (\r\n <InsforgeContext.Provider\r\n value={{\r\n user,\r\n isLoaded,\r\n isSignedIn: !!user,\r\n setUser,\r\n signIn,\r\n signUp,\r\n signOut,\r\n updateUser,\r\n reloadAuth: loadAuthState,\r\n handleAuthCallback,\r\n baseUrl,\r\n sendPasswordResetCode,\r\n resetPassword,\r\n verifyEmail,\r\n getPublicAuthConfig,\r\n }}\r\n >\r\n {children}\r\n </InsforgeContext.Provider>\r\n );\r\n}\r\n\r\n/**\r\n * Hook to access Insforge context\r\n *\r\n * @example\r\n * ```tsx\r\n * function MyComponent() {\r\n * const { user, isSignedIn, signOut } = useInsforge();\r\n *\r\n * if (!isSignedIn) return <SignIn />;\r\n *\r\n * return (\r\n * <div>\r\n * <p>Welcome {user.email}</p>\r\n * <button onClick={signOut}>Sign Out</button>\r\n * </div>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function useInsforge(): InsforgeContextValue {\r\n const context = useContext(InsforgeContext);\r\n if (!context) {\r\n throw new Error(\"useInsforge must be used within InsforgeProvider\");\r\n }\r\n return context;\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type {\r\n GetPublicAuthConfigResponse\r\n} from '@insforge/shared-schemas';\r\nimport { useInsforge } from '../provider/InsforgeProvider';\r\n\r\n/**\r\n * Hook to get all public authentication configuration (OAuth + Email) from Insforge backend\r\n *\r\n * **IMPORTANT: This hook should ONLY be used in SignIn and SignUp components.**\r\n *\r\n * This hook lazily fetches all public authentication configuration from the backend\r\n * only when the component mounts. Using it in other components will cause unnecessary\r\n * API calls on every page load.\r\n *\r\n * @returns Object containing OAuth providers, email auth config, and loading state\r\n * - `oauthProviders`: Array of enabled OAuth provider names (e.g., ['google', 'github'])\r\n * - `emailConfig`: Email authentication configuration object with password rules\r\n * - `isLoaded`: Boolean indicating if the config has been fetched\r\n *\r\n * @example\r\n * ```tsx\r\n * // ✅ Correct usage - only in SignIn/SignUp components\r\n * function SignUp() {\r\n * const { oauthProviders, emailConfig, isLoaded } = usePublicAuthConfig();\r\n * \r\n * if (!isLoaded) return <div>Loading...</div>;\r\n * \r\n * return (\r\n * <div>\r\n * <p>OAuth providers: {oauthProviders.length}</p>\r\n * <p>Password min length: {emailConfig?.passwordMinLength}</p>\r\n * </div>\r\n * );\r\n * }\r\n * ```\r\n *\r\n * @requires Must be used within InsforgeProvider\r\n */\r\nexport function usePublicAuthConfig(): {\r\n emailConfig: GetPublicAuthConfigResponse | null;\r\n isLoaded: boolean;\r\n} {\r\n const { getPublicAuthConfig } = useInsforge();\r\n const [emailConfig, setEmailConfig] = useState<GetPublicAuthConfigResponse | null>(null);\r\n const [isLoaded, setIsLoaded] = useState(false);\r\n\r\n useEffect(() => {\r\n async function fetchConfig() {\r\n const result = await getPublicAuthConfig();\r\n if (result) {\r\n setEmailConfig(result);\r\n } else {\r\n console.error('[usePublicAuthConfig] Failed to get public auth config');\r\n setEmailConfig(null);\r\n }\r\n setIsLoaded(true);\r\n }\r\n\r\n fetchConfig();\r\n }, [getPublicAuthConfig]);\r\n\r\n return { emailConfig, isLoaded };\r\n}\r\n\r\n","'use client';\r\n\r\n/**\r\n * Insforge branding component for authentication pages.\r\n * \r\n * @component\r\n * @example\r\n * ```tsx\r\n * <AuthBranding />\r\n * ```\r\n */\r\nexport function AuthBranding() {\r\n return (\r\n <div className=\"bg-[#FAFAFA] px-2 py-4 flex flex-row justify-center items-center gap-1\">\r\n <p className=\"text-xs font-medium text-black font-manrope\">Secured by</p>\r\n <a href=\"https://insforge.dev\" target=\"_blank\" rel=\"noopener noreferrer\">\r\n <svg width=\"83\" height=\"20\" viewBox=\"0 0 83 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2.16783 8.46797C1.9334 8.23325 1.9334 7.85269 2.16783 7.61797L8.11049 1.66797L16.6 1.66797L6.41259 11.868C6.17815 12.1027 5.79807 12.1027 5.56363 11.868L2.16783 8.46797Z\"\r\n fill=\"url(#paint0_linear_2976_9475)\"\r\n />\r\n <path\r\n d=\"M12.8858 6.44922L16.6 10.168V18.668L8.64108 10.6992L12.8858 6.44922Z\"\r\n fill=\"url(#paint1_linear_2976_9475)\"\r\n />\r\n <path\r\n d=\"M67.5439 6.48828C68.2894 6.48828 68.9145 6.67064 69.418 7.03516C69.5229 7.10943 69.6214 7.1907 69.7158 7.27637V6.70703H71.248V14.959C71.248 15.1583 71.2381 15.3485 71.2188 15.5283C71.2042 15.7129 71.1774 15.8925 71.1387 16.0674C71.0225 16.5776 70.7998 16.9957 70.4707 17.3213C70.1415 17.6518 69.7321 17.8972 69.2432 18.0576C68.7592 18.2179 68.2222 18.2988 67.6318 18.2988C67.1962 18.2988 66.7768 18.2308 66.375 18.0947C65.9782 17.9587 65.6202 17.7614 65.3008 17.5039C64.9813 17.2512 64.7199 16.9446 64.5166 16.585L66.1289 15.7832C66.2789 16.0698 66.4888 16.2819 66.7598 16.418C67.0356 16.5589 67.3289 16.6289 67.6387 16.6289C68.0016 16.6289 68.3258 16.5628 68.6113 16.4316C68.8969 16.3053 69.1176 16.116 69.2725 15.8633C69.4321 15.6155 69.5077 15.3047 69.498 14.9307V14.1797C69.4665 14.2037 69.4359 14.229 69.4033 14.252C68.8855 14.6164 68.2441 14.7988 67.4795 14.7988C66.7582 14.7988 66.1281 14.6165 65.5908 14.252C65.0537 13.8875 64.637 13.3915 64.3418 12.7646C64.0467 12.1378 63.8994 11.4307 63.8994 10.6436C63.8994 9.84651 64.0465 9.13673 64.3418 8.51465C64.6419 7.88768 65.0663 7.39481 65.6133 7.03516C66.1601 6.67077 66.8036 6.48836 67.5439 6.48828ZM37.5 6.48828C38.1099 6.48828 38.6496 6.58294 39.1191 6.77246C39.5935 6.96201 39.9762 7.2321 40.2666 7.58203C40.5569 7.93184 40.7359 8.34227 40.8037 8.81348L39.0176 9.13477C38.974 8.79951 38.8218 8.53424 38.5605 8.33984C38.304 8.14547 37.96 8.03605 37.5293 8.01172C37.1178 7.98742 36.7859 8.05051 36.5342 8.20117C36.2825 8.34698 36.1562 8.55398 36.1562 8.82129C36.1563 8.97184 36.208 9.10017 36.3096 9.20703C36.4112 9.31394 36.614 9.42141 36.9189 9.52832C37.2288 9.63524 37.6889 9.76635 38.2988 9.92188C38.9232 10.0823 39.4222 10.2666 39.7949 10.4756C40.1722 10.6796 40.4428 10.9254 40.6074 11.2119C40.7768 11.4987 40.8623 11.8466 40.8623 12.2549C40.8623 13.047 40.574 13.6691 39.998 14.1211C39.4268 14.5731 38.6348 14.7988 37.623 14.7988C36.6551 14.7988 35.8687 14.5799 35.2637 14.1426C34.6587 13.7052 34.2909 13.0908 34.1602 12.2988L35.9463 12.0215C36.0383 12.4102 36.2411 12.7169 36.5557 12.9404C36.8703 13.164 37.2678 13.2754 37.7471 13.2754C38.1681 13.2754 38.4922 13.1926 38.7197 13.0273C38.9521 12.8572 39.0684 12.6266 39.0684 12.335C39.0684 12.1552 39.0245 12.0122 38.9375 11.9053C38.8552 11.7935 38.6713 11.686 38.3857 11.584C38.1001 11.4819 37.6618 11.3528 37.0713 11.1973C36.4131 11.0223 35.8901 10.8359 35.5029 10.6367C35.1158 10.4327 34.8374 10.192 34.668 9.91504C34.4985 9.63801 34.4141 9.30188 34.4141 8.9082C34.4141 8.41746 34.5423 7.98943 34.7988 7.625C35.0553 7.26073 35.4135 6.98146 35.873 6.78711C36.3329 6.58784 36.8755 6.48828 37.5 6.48828ZM53.3047 6.48828C54.0937 6.48828 54.7815 6.66572 55.3672 7.02051C55.9527 7.37528 56.4072 7.86634 56.7314 8.49316C57.0558 9.11525 57.2187 9.83193 57.2188 10.6436C57.2188 11.46 57.0537 12.1817 56.7246 12.8086C56.4003 13.4307 55.9451 13.9196 55.3594 14.2744C54.7737 14.6242 54.0888 14.7988 53.3047 14.7988C52.5205 14.7988 51.8357 14.6214 51.25 14.2666C50.6643 13.9118 50.2091 13.4238 49.8848 12.8018C49.5653 12.1748 49.4053 11.4552 49.4053 10.6436C49.4053 9.81735 49.5703 9.09279 49.8994 8.4707C50.2286 7.8488 50.6859 7.36255 51.2715 7.0127C51.8572 6.66281 52.5351 6.48828 53.3047 6.48828ZM76.7471 6.48828C77.5603 6.48828 78.25 6.68053 78.8164 7.06445C79.3876 7.44351 79.812 7.97991 80.0879 8.6748C80.3638 9.36976 80.4672 10.189 80.3994 11.1318H74.7256C74.7843 11.6972 74.949 12.1516 75.2227 12.4951C75.5711 12.9325 76.0792 13.1513 76.7471 13.1514C77.1779 13.1514 77.5486 13.0567 77.8584 12.8672C78.173 12.6728 78.4146 12.3928 78.584 12.0283L80.3125 12.5537C80.0124 13.2633 79.5473 13.8153 78.918 14.209C78.2936 14.6025 77.6036 14.7988 76.8486 14.7988C76.0549 14.7988 75.358 14.6263 74.7578 14.2812C74.1576 13.9362 73.6875 13.458 73.3486 12.8457C73.0147 12.2334 72.8477 11.5284 72.8477 10.7314C72.8477 9.87126 73.0127 9.12495 73.3418 8.49316C73.671 7.85651 74.1282 7.36263 74.7139 7.0127C75.2995 6.6628 75.9775 6.48832 76.7471 6.48828ZM23.3301 14.5801H21.5801V4.08203H23.3301V14.5801ZM29.6152 6.48047C30.1959 6.48052 30.6753 6.5781 31.0527 6.77246C31.4301 6.96681 31.7305 7.21443 31.9531 7.51562C32.1758 7.81695 32.3398 8.13831 32.4463 8.47852C32.5528 8.81873 32.6213 9.14205 32.6504 9.44824C32.6843 9.74946 32.7012 9.99508 32.7012 10.1846V14.5801H30.9287V10.7891C30.9287 10.5413 30.9118 10.2669 30.8779 9.96582C30.844 9.66449 30.7645 9.37469 30.6387 9.09766C30.5177 8.81592 30.3337 8.58503 30.0869 8.40527C29.8449 8.22551 29.5157 8.13579 29.0996 8.13574C28.8769 8.13574 28.6563 8.17221 28.4385 8.24512C28.2206 8.31802 28.0219 8.4442 27.8428 8.62402C27.6685 8.79899 27.5284 9.04249 27.4219 9.35352C27.3154 9.65965 27.2617 10.0532 27.2617 10.5342V14.5801H25.4902V6.70703H27.0518V7.58301C27.2521 7.34675 27.486 7.14172 27.7559 6.96973C28.2593 6.64409 28.8794 6.48047 29.6152 6.48047ZM48.748 5.83887H44.2021V8.45605H47.876V10.2061H44.2021V14.5801H42.4521V4.08203H48.748V5.83887ZM62.5137 6.67773C62.7606 6.65829 63.001 6.66815 63.2334 6.70703V8.34766C63.001 8.27961 62.7317 8.25695 62.4268 8.28125C62.1267 8.30557 61.8553 8.39134 61.6133 8.53711C61.3715 8.66829 61.1733 8.83606 61.0186 9.04004C60.8686 9.24404 60.7572 9.47701 60.6846 9.73926C60.612 9.99685 60.5752 10.2768 60.5752 10.5781V14.5801H58.8184V6.70703H60.3652V7.96582C60.4243 7.85986 60.4888 7.75824 60.5605 7.66211C60.7251 7.4434 60.9219 7.26302 61.1494 7.12207C61.3429 6.99098 61.5559 6.88926 61.7881 6.81641C62.0251 6.73869 62.267 6.69235 62.5137 6.67773ZM67.8057 8.0625C67.3362 8.06252 66.9485 8.17982 66.6436 8.41309C66.3389 8.64144 66.1139 8.95232 65.9688 9.3457C65.8235 9.7345 65.751 10.1673 65.751 10.6436C65.751 11.1247 65.8215 11.5624 65.9619 11.9561C66.1071 12.3447 66.3269 12.6535 66.6221 12.8818C66.9174 13.1103 67.293 13.2246 67.748 13.2246C68.2174 13.2246 68.5953 13.1171 68.8809 12.9033C69.1711 12.6846 69.3811 12.3808 69.5117 11.9922C69.6473 11.6034 69.7158 11.1539 69.7158 10.6436C69.7158 10.1284 69.6473 9.67886 69.5117 9.29492C69.381 8.90617 69.1753 8.60445 68.8945 8.39062C68.6138 8.17213 68.2508 8.0625 67.8057 8.0625ZM53.3047 8.13574C52.8351 8.13574 52.4475 8.24222 52.1426 8.45605C51.8425 8.66504 51.6198 8.95977 51.4746 9.33887C51.3295 9.71303 51.2568 10.148 51.2568 10.6436C51.2568 11.4066 51.4288 12.0168 51.7725 12.4736C52.121 12.9256 52.6318 13.1514 53.3047 13.1514C54.0017 13.1514 54.5196 12.9177 54.8584 12.4512C55.1971 11.9846 55.3672 11.3822 55.3672 10.6436C55.3672 9.8807 55.1951 9.27324 54.8516 8.82129C54.5079 8.36444 53.9921 8.13575 53.3047 8.13574ZM76.8203 8.02637C76.1039 8.02637 75.5712 8.25013 75.2227 8.69727C74.9987 8.98144 74.8476 9.35094 74.7676 9.80566H78.6221C78.5589 9.29301 78.4236 8.89686 78.2139 8.61719C77.9186 8.22359 77.4543 8.02645 76.8203 8.02637Z\"\r\n fill=\"black\"\r\n />\r\n <defs>\r\n <linearGradient\r\n id=\"paint0_linear_2976_9475\"\r\n x1=\"1.85883\"\r\n y1=\"1.92425\"\r\n x2=\"24.3072\"\r\n y2=\"9.64016\"\r\n gradientUnits=\"userSpaceOnUse\"\r\n >\r\n <stop />\r\n <stop offset=\"1\" stopOpacity=\"0.4\" />\r\n </linearGradient>\r\n <linearGradient\r\n id=\"paint1_linear_2976_9475\"\r\n x1=\"25.6475\"\r\n y1=\"8.65468\"\r\n x2=\"10.7901\"\r\n y2=\"8.65468\"\r\n gradientUnits=\"userSpaceOnUse\"\r\n >\r\n <stop />\r\n <stop offset=\"1\" stopOpacity=\"0.4\" />\r\n </linearGradient>\r\n </defs>\r\n </svg>\r\n </a>\r\n </div>\r\n );\r\n}\r\n\r\n","import { type ClassValue, clsx } from 'clsx';\r\nimport { twMerge } from 'tailwind-merge';\r\n\r\n/**\r\n * Utility function to merge Tailwind CSS classes with clsx\r\n * Handles conditional classes and prevents style conflicts\r\n */\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n\r\n","'use client';\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { AuthBranding } from './AuthBranding';\r\nimport type { AuthContainerProps } from '../../types';\r\n\r\n/**\r\n * Main container component for authentication forms.\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * <AuthContainer>\r\n * <AuthHeader title=\"Sign In\" />\r\n * <form>...</form>\r\n * </AuthContainer>\r\n * \r\n * // With custom styling\r\n * <AuthContainer\r\n * appearance={{\r\n * cardClassName: \"bg-gray-50\"\r\n * }}\r\n * >\r\n * <AuthHeader title=\"Sign In\" />\r\n * <form>...</form>\r\n * </AuthContainer>\r\n * ```\r\n *\r\n * @param {ReactNode} children - Form content\r\n * @param {object} [appearance] - Tailwind CSS classes for styling\r\n * - `appearance.containerClassName`: Outer container element\r\n * - `appearance.cardClassName`: Inner card element (white background area)\r\n */\r\nexport function AuthContainer({ children, appearance = {} }: AuthContainerProps) {\r\n return (\r\n <div\r\n className={cn(\r\n 'w-full max-w-[400px] rounded-xl overflow-hidden shadow-lg',\r\n appearance.containerClassName\r\n )}\r\n >\r\n <div className={cn(\r\n 'bg-white p-6 flex flex-col justify-center items-stretch gap-6',\r\n appearance.cardClassName\r\n )}>\r\n {children}\r\n </div>\r\n <AuthBranding />\r\n </div>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport type { AuthHeaderProps } from '../../types';\r\n\r\n/**\r\n * Header component for authentication forms displaying title and optional subtitle.\r\n * \r\n * @component\r\n * @example\r\n * ```tsx\r\n * // Basic usage\r\n * <AuthHeader \r\n * title=\"Welcome Back\" \r\n * subtitle=\"Sign in to continue\" \r\n * />\r\n * \r\n * // With custom styling\r\n * <AuthHeader \r\n * title=\"Welcome Back\"\r\n * appearance={{\r\n * titleClassName: \"text-purple-900 text-3xl\",\r\n * subtitleClassName: \"text-purple-700\"\r\n * }}\r\n * />\r\n * ```\r\n * \r\n * @param {string} title - Main heading text\r\n * @param {string} [subtitle] - Optional subheading text\r\n * @param {object} [appearance] - Tailwind CSS classes for styling\r\n * - `appearance.containerClassName`: Container element\r\n * - `appearance.titleClassName`: Title element\r\n * - `appearance.subtitleClassName`: Subtitle element\r\n */\r\nexport function AuthHeader({ \r\n title, \r\n subtitle,\r\n appearance = {}\r\n}: AuthHeaderProps) {\r\n return (\r\n <div className={cn(\r\n 'flex flex-col justify-start items-start gap-2',\r\n appearance.containerClassName\r\n )}>\r\n <h1 className={cn(\r\n 'text-2xl font-semibold text-black leading-8',\r\n appearance.titleClassName\r\n )}>\r\n {title}\r\n </h1>\r\n {subtitle && (\r\n <p className={cn(\r\n 'text-sm font-normal text-[#828282] leading-6',\r\n appearance.subtitleClassName\r\n )}>\r\n {subtitle}\r\n </p>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport { AlertTriangle } from 'lucide-react';\r\nimport { cn } from '../../lib/utils';\r\nimport type { AuthErrorBannerProps } from '../../types';\r\n\r\n/**\r\n * Error message banner for authentication forms.\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * <AuthErrorBanner error={error} />\r\n * ```\r\n *\r\n * @param {string} error - Error message to display\r\n * @param {string} [className] - Banner element classes\r\n */\r\nexport function AuthErrorBanner({ error, className }: AuthErrorBannerProps) {\r\n if (!error) return null;\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'flex items-center gap-2 mb-4 pl-3 py-2 pr-2 bg-red-50 border-2 border-red-600 rounded',\r\n className\r\n )}\r\n >\r\n <AlertTriangle className=\"w-6 h-6 text-red-500 shrink-0\" />\r\n <span className=\"text-sm text-red-600 flex-1\">{error}</span>\r\n </div>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport type { AuthFormFieldProps } from '../../types';\r\n\r\n/**\r\n * Standard form input field with label for authentication forms.\r\n * \r\n * @component\r\n * @example\r\n * ```tsx\r\n * // Basic usage\r\n * <AuthFormField\r\n * id=\"email\"\r\n * type=\"email\"\r\n * label=\"Email Address\"\r\n * />\r\n * \r\n * // With custom styling\r\n * <AuthFormField\r\n * id=\"email\"\r\n * label=\"Email\"\r\n * appearance={{\r\n * containerClassName: \"flex flex-col justify-center items-stretch gap-1\",\r\n * inputClassName: \"border-blue-500 focus:ring-blue-500\",\r\n * labelClassName: \"text-blue-900 font-semibold\"\r\n * }}\r\n * />\r\n * ```\r\n * \r\n * @param {string} label - Label text\r\n * @param {string} id - Input element ID\r\n * @param {object} [appearance] - Tailwind CSS classes for styling\r\n * - `appearance.containerClassName`: Container element\r\n * - `appearance.labelClassName`: Label element\r\n * - `appearance.inputClassName`: Input element\r\n */\r\nexport function AuthFormField({ \r\n label, \r\n id, \r\n appearance = {},\r\n ...props \r\n}: AuthFormFieldProps) {\r\n return (\r\n <div className={cn(\r\n 'flex flex-col justify-center items-stretch gap-1',\r\n appearance.containerClassName\r\n )}>\r\n <label \r\n htmlFor={id} \r\n className={cn(\r\n 'text-sm font-normal text-black leading-6',\r\n appearance.labelClassName\r\n )}\r\n >\r\n {label}\r\n </label>\r\n <input\r\n id={id}\r\n className={cn(\r\n 'w-full flex items-center gap-2 self-stretch',\r\n 'pl-3 pr-2 py-2 rounded-sm border border-[#D4D4D4] bg-white',\r\n 'text-sm font-normal leading-5',\r\n 'placeholder:text-[#A3A3A3] placeholder:font-sm placeholder:font-normal',\r\n 'focus:outline-none focus:border-black',\r\n appearance.inputClassName\r\n )}\r\n {...props}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport { Check } from 'lucide-react';\r\nimport { cn } from '../../lib/utils';\r\nimport type { AuthPasswordStrengthIndicatorProps, AuthConfig } from '../../types';\r\n\r\ninterface PasswordRequirement {\r\n label: string;\r\n test: (password: string) => boolean;\r\n}\r\n\r\n/**\r\n * Password strength indicator showing requirement checklist.\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * <AuthPasswordStrengthIndicator\r\n * password={password}\r\n * config={emailAuthConfig}\r\n * />\r\n *\r\n * // With custom styling\r\n * <AuthPasswordStrengthIndicator\r\n * password={password}\r\n * config={emailAuthConfig}\r\n * appearance={{\r\n * requirementClassName: \"text-lg\"\r\n * }}\r\n * />\r\n * ```\r\n *\r\n * @param {string} password - Current password value\r\n * @param {object} config - Email auth configuration\r\n * @param {object} [appearance] - Tailwind CSS classes for styling\r\n * - `appearance.containerClassName`: Container element\r\n * - `appearance.requirementClassName`: Requirement text elements\r\n */\r\nexport function AuthPasswordStrengthIndicator({\r\n password,\r\n config,\r\n appearance = {},\r\n}: AuthPasswordStrengthIndicatorProps) {\r\n const requirements = createRequirements(config);\r\n\r\n return (\r\n <div\r\n className={cn('mt-3 flex flex-col gap-3', appearance.containerClassName)}\r\n >\r\n {requirements.map((req) => (\r\n <div key={req.label} className=\"flex items-center gap-2\">\r\n <div\r\n className={cn(\r\n 'flex items-center justify-center w-4 h-4 rounded-full border-2 transition-colors',\r\n req.test(password)\r\n ? 'bg-[#059669] border-transparent'\r\n : 'border-neutral-400 bg-white'\r\n )}\r\n >\r\n {req.test(password) && <Check className=\"w-3 h-3 text-white\" />}\r\n </div>\r\n <span\r\n className={cn(\r\n 'text-sm font-normal leading-5 text-[#525252]',\r\n appearance.requirementClassName\r\n )}\r\n >\r\n {req.label}\r\n </span>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * Creates password requirements based on email auth configuration\r\n */\r\nfunction createRequirements(\r\n config: AuthConfig\r\n): PasswordRequirement[] {\r\n const requirements: PasswordRequirement[] = [];\r\n\r\n const minLength = config.passwordMinLength;\r\n const requireUppercase = config.requireUppercase;\r\n const requireLowercase = config.requireLowercase;\r\n const requireNumber = config.requireNumber;\r\n const requireSpecialChar = config.requireSpecialChar;\r\n\r\n if (requireUppercase) {\r\n requirements.push({\r\n label: 'At least 1 Uppercase letter',\r\n test: (pwd) => /[A-Z]/.test(pwd),\r\n });\r\n }\r\n\r\n if (requireLowercase) {\r\n requirements.push({\r\n label: 'At least 1 Lowercase letter',\r\n test: (pwd) => /[a-z]/.test(pwd),\r\n });\r\n }\r\n\r\n if (requireNumber) {\r\n requirements.push({\r\n label: 'At least 1 Number',\r\n test: (pwd) => /\\d/.test(pwd),\r\n });\r\n }\r\n\r\n if (requireSpecialChar) {\r\n requirements.push({\r\n label: 'Special character (e.g. !?<>@#$%)',\r\n test: (pwd) => /[!@#$%^&*()_+\\-=[\\]{};\\\\|,.<>/?]/.test(pwd),\r\n });\r\n }\r\n\r\n requirements.push({\r\n label: `${minLength} characters or more`,\r\n test: (pwd) => pwd.length >= minLength,\r\n });\r\n\r\n return requirements;\r\n}\r\n\r\n/**\r\n * Validates that a password meets all strength requirements based on email auth configuration.\r\n *\r\n * @param password - The password string to validate\r\n * @param config - Email authentication configuration from backend\r\n * @returns true if all requirements are met, false otherwise\r\n */\r\nexport function validatePasswordStrength(\r\n password: string,\r\n config: AuthConfig\r\n): boolean {\r\n if (!password) return false;\r\n const requirements = createRequirements(config);\r\n return requirements.every((req) => req.test(password));\r\n}\r\n\r\n","'use client';\r\n\r\nimport { useState } from 'react';\r\nimport { Eye, EyeOff } from 'lucide-react';\r\nimport { cn } from '../../lib/utils';\r\nimport { AuthPasswordStrengthIndicator } from './AuthPasswordStrengthIndicator';\r\nimport type { AuthPasswordFieldProps } from '../../types';\r\n\r\n/**\r\n * Password input field with visibility toggle and optional strength indicator.\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * // With forgot password link\r\n * <AuthPasswordField\r\n * id=\"password\"\r\n * label=\"Password\"\r\n * forgotPasswordLink={{ href: '/forgot-password' }}\r\n * emailAuthConfig={config}\r\n * />\r\n *\r\n * // With custom styling\r\n * <AuthPasswordField\r\n * id=\"password\"\r\n * label=\"Password\"\r\n * emailAuthConfig={config}\r\n * appearance={{\r\n * inputClassName: \"border-blue-500\",\r\n * labelClassName: \"text-blue-900\"\r\n * }}\r\n * />\r\n * ```\r\n *\r\n * @param {string} label - Label text\r\n * @param {string} id - Input element ID\r\n * @param {boolean} [showStrengthIndicator] - Show password strength requirements\r\n * @param {object} [forgotPasswordLink] - Forgot password link config\r\n * @param {object} [appearance] - Tailwind CSS classes for styling\r\n * - `appearance.containerClassName`: Container element\r\n * - `appearance.labelClassName`: Label element\r\n * - `appearance.inputClassName`: Input element\r\n */\r\nexport function AuthPasswordField({\r\n label,\r\n id,\r\n showStrengthIndicator = false,\r\n emailAuthConfig,\r\n forgotPasswordLink,\r\n value,\r\n appearance = {},\r\n onFocus,\r\n ...props\r\n}: AuthPasswordFieldProps) {\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [showStrength, setShowStrength] = useState(false);\r\n\r\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\r\n if (showStrengthIndicator) {\r\n setShowStrength(true);\r\n }\r\n onFocus?.(e);\r\n };\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'flex flex-col justify-center items-stretch gap-1',\r\n appearance.containerClassName\r\n )}\r\n >\r\n {(label || forgotPasswordLink) && (\r\n <div className=\"flex justify-between items-center\">\r\n <label\r\n htmlFor={id}\r\n className={cn(\r\n 'text-sm font-normal text-black leading-6',\r\n appearance.labelClassName\r\n )}\r\n >\r\n {label}\r\n </label>\r\n {forgotPasswordLink && (\r\n <a\r\n href={forgotPasswordLink.href}\r\n className=\"text-right text-sm font-normal text-[#737373] leading-6\"\r\n >\r\n {forgotPasswordLink.text || 'Forget Password?'}\r\n </a>\r\n )}\r\n </div>\r\n )}\r\n <div className=\"relative\">\r\n <input\r\n id={id}\r\n type={showPassword ? 'text' : 'password'}\r\n className={cn(\r\n 'w-full flex items-center gap-2 self-stretch',\r\n 'pl-3 py-2 pr-8 rounded border border-[#D4D4D4] bg-white',\r\n 'text-sm font-normal leading-5',\r\n 'placeholder:text-[#A3A3A3] placeholder:font-sm placeholder:font-normal',\r\n 'focus:outline-none focus:border-black',\r\n appearance.inputClassName\r\n )}\r\n value={value}\r\n onFocus={handleFocus}\r\n {...props}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n className=\"absolute right-2 top-1/2 -translate-y-1/2 bg-transparent border-none text-[#A6A6A6] cursor-pointer transition-colors hover:text-gray-600 flex items-center justify-center\"\r\n aria-label={showPassword ? 'Hide password' : 'Show password'}\r\n >\r\n {showPassword ? <EyeOff size={20} /> : <Eye size={20} />}\r\n </button>\r\n </div>\r\n {showStrengthIndicator && showStrength && (\r\n <AuthPasswordStrengthIndicator\r\n password={String(value || '')}\r\n config={emailAuthConfig}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport { CircleCheck, Loader2 } from 'lucide-react';\r\nimport { cn } from '../../lib/utils';\r\nimport type { AuthSubmitButtonProps } from '../../types';\r\n\r\n/**\r\n * Primary submit button for authentication forms with loading and confirmed states.\r\n * \r\n * @component\r\n * @example\r\n * ```tsx\r\n * // Basic usage\r\n * <AuthSubmitButton isLoading={loading}>\r\n * Sign In\r\n * </AuthSubmitButton>\r\n * \r\n * // With custom styling\r\n * <AuthSubmitButton className=\"bg-purple-600 hover:bg-purple-700\">\r\n * Sign In\r\n * </AuthSubmitButton>\r\n * ```\r\n * \r\n * @param {ReactNode} children - Button text\r\n * @param {boolean} [isLoading] - Loading state (shows spinner)\r\n * @param {boolean} [confirmed] - Confirmed state (shows checkmark)\r\n * @param {boolean} [disabled] - Disabled state\r\n * @param {string} [className] - Button element classes\r\n */\r\nexport function AuthSubmitButton({\r\n children,\r\n isLoading = false,\r\n confirmed = false,\r\n disabled = false,\r\n className,\r\n}: AuthSubmitButtonProps) {\r\n return (\r\n <button\r\n type=\"submit\"\r\n className={cn(\r\n 'rounded-sm bg-black w-full flex mt-4 px-4 py-2',\r\n 'justify-center items-center gap-2.5 self-stretch',\r\n 'text-white font-semibold font-manrope text-base leading-normal',\r\n 'border-none cursor-pointer transition-colors',\r\n 'hover:bg-gray-800',\r\n 'disabled:opacity-50 disabled:cursor-not-allowed',\r\n className\r\n )}\r\n disabled={disabled || isLoading || confirmed}\r\n >\r\n {isLoading && <Loader2 className=\"w-5 h-5 animate-spin\" size={20} />}\r\n {confirmed && <CircleCheck className=\"w-5 h-5\" size={20} />}\r\n {children}\r\n </button>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport type { AuthLinkProps } from '../../types';\r\n\r\n/**\r\n * Call-to-action link component for navigation between auth pages.\r\n * \r\n * @component\r\n * @example\r\n * ```tsx\r\n * <AuthLink \r\n * text=\"Don't have an account?\" \r\n * linkText=\"Sign up\" \r\n * href=\"/sign-up\" \r\n * />\r\n * \r\n * // With custom styling\r\n * <AuthLink \r\n * text=\"Don't have an account?\" \r\n * linkText=\"Sign up\" \r\n * href=\"/sign-up\"\r\n * appearance={{\r\n * linkClassName: \"text-blue-500\"\r\n * }}\r\n * />\r\n * ```\r\n * \r\n * @param {string} text - Regular text before the link\r\n * @param {string} linkText - Clickable link text\r\n * @param {string} href - Link URL\r\n * @param {object} [appearance] - Tailwind CSS classes for styling\r\n * - `appearance.containerClassName`: Container element\r\n * - `appearance.linkClassName`: Link element\r\n */\r\nexport function AuthLink({ text, linkText, href, appearance = {} }: AuthLinkProps) {\r\n // Preserve current URL search params when navigating\r\n const currentSearch = typeof window !== 'undefined' ? window.location.search : '';\r\n \r\n const finalHref = (() => {\r\n if (!currentSearch) return href;\r\n \r\n try {\r\n const url = new URL(href, window.location.origin);\r\n const currentParams = new URLSearchParams(currentSearch);\r\n \r\n // Add current params to the target URL (don't override existing params in href)\r\n currentParams.forEach((value, key) => {\r\n if (!url.searchParams.has(key)) {\r\n url.searchParams.set(key, value);\r\n }\r\n });\r\n \r\n return url.pathname + url.search;\r\n } catch {\r\n // Fallback to original href if URL parsing fails\r\n return href;\r\n }\r\n })();\r\n \r\n return (\r\n <p className={cn(\r\n 'text-center text-sm font-normal text-[#828282] leading-6',\r\n appearance.containerClassName\r\n )}>\r\n {text}{' '}\r\n <a \r\n href={finalHref} \r\n className={cn(\r\n 'text-sm font-medium text-black leading-6',\r\n appearance.linkClassName\r\n )}\r\n >\r\n {linkText}\r\n </a>\r\n </p>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport type { AuthDividerProps } from '../../types';\r\n\r\n/**\r\n * Visual divider with optional centered text for auth forms.\r\n * \r\n * @component\r\n * @example\r\n * ```tsx\r\n * <AuthDivider text=\"or\" />\r\n * ```\r\n * \r\n * @param {string} [text='or'] - Centered text\r\n * @param {string} [className] - Divider element classes\r\n */\r\nexport function AuthDivider({ text = 'or', className }: AuthDividerProps) {\r\n return (\r\n <div className={cn(\r\n 'flex justify-center items-center gap-6 self-stretch',\r\n \"before:content-[''] before:flex-1 before:h-px before:bg-[#E5E5E5]\",\r\n \"after:content-[''] after:flex-1 after:h-px after:bg-[#E5E5E5]\",\r\n className\r\n )}>\r\n <span className=\"text-sm font-semibold font-manrope text-[#A3A3A3] leading-normal\">\r\n {text}\r\n </span>\r\n </div>\r\n );\r\n}\r\n\r\n","import type { OAuthProvider, OAuthProviderConfig } from '../types';\r\n\r\nexport const OAUTH_PROVIDER_CONFIG: Record<OAuthProvider, OAuthProviderConfig> = {\r\n google: {\r\n name: 'Google',\r\n svg: (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M17.64 9.2c0-.637-.057-1.251-.164-1.84H9v3.481h4.844c-.209 1.125-.843 2.078-1.796 2.717v2.258h2.908c1.702-1.567 2.684-3.874 2.684-6.615z\"\r\n fill=\"#4285F4\"\r\n />\r\n <path\r\n d=\"M9 18c2.43 0 4.467-.806 5.956-2.184l-2.908-2.258c-.806.54-1.837.86-3.048.86-2.344 0-4.328-1.584-5.036-3.711H.957v2.332C2.438 15.983 5.482 18 9 18z\"\r\n fill=\"#34A853\"\r\n />\r\n <path\r\n d=\"M3.964 10.707c-.18-.54-.282-1.117-.282-1.707 0-.593.102-1.17.282-1.709V4.958H.957C.347 6.173 0 7.548 0 9c0 1.452.348 2.827.957 4.042l3.007-2.335z\"\r\n fill=\"#FBBC05\"\r\n />\r\n <path\r\n d=\"M9 3.58c1.321 0 2.508.454 3.44 1.345l2.582-2.58C13.463.891 11.426 0 9 0 5.482 0 2.438 2.017.957 4.958L3.964 7.29C4.672 5.163 6.656 3.58 9 3.58z\"\r\n fill=\"#EA4335\"\r\n />\r\n </svg>\r\n ),\r\n className: 'insforge-oauth-google',\r\n },\r\n github: {\r\n name: 'GitHub',\r\n svg: (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z\" />\r\n </svg>\r\n ),\r\n className: 'insforge-oauth-github',\r\n },\r\n discord: {\r\n name: 'Discord',\r\n svg: (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M20.317 4.37a19.791 19.791 0 00-4.885-1.515.074.074 0 00-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 00-5.487 0 12.64 12.64 0 00-.617-1.25.077.077 0 00-.079-.037A19.736 19.736 0 003.677 4.37a.07.07 0 00-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 00.031.057 19.9 19.9 0 005.993 3.03.078.078 0 00.084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 00-.041-.106 13.107 13.107 0 01-1.872-.892.077.077 0 01-.008-.128 10.2 10.2 0 00.372-.292.074.074 0 01.077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 01.078.01c.12.098.246.198.373.292a.077.077 0 01-.006.127 12.299 12.299 0 01-1.873.892.077.077 0 00-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 00.084.028 19.839 19.839 0 006.002-3.03.077.077 0 00.032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 00-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z\"\r\n fill=\"#5865F2\"\r\n />\r\n </svg>\r\n ),\r\n className: 'insforge-oauth-discord',\r\n },\r\n facebook: {\r\n name: 'Facebook',\r\n svg: (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M24 12.073C24 5.405 18.627 0 12 0S0 5.405 0 12.073C0 18.1 4.388 23.094 10.125 24v-8.437H7.078v-3.49h3.047v-2.66c0-3.025 1.792-4.697 4.533-4.697 1.312 0 2.686.236 2.686.236v2.971H15.83c-1.49 0-1.955.93-1.955 1.886v2.264h3.328l-.532 3.49h-2.796V24C19.612 23.094 24 18.1 24 12.073z\"\r\n fill=\"#1877F2\"\r\n />\r\n </svg>\r\n ),\r\n className: 'insforge-oauth-facebook',\r\n },\r\n linkedin: {\r\n name: 'LinkedIn',\r\n svg: (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\"\r\n fill=\"#0A66C2\"\r\n />\r\n </svg>\r\n ),\r\n className: 'insforge-oauth-linkedin',\r\n },\r\n microsoft: {\r\n name: 'Microsoft',\r\n svg: (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 23 23\" fill=\"none\">\r\n <path d=\"M0 0h11v11H0z\" fill=\"#F25022\" />\r\n <path d=\"M12 0h11v11H12z\" fill=\"#7FBA00\" />\r\n <path d=\"M0 12h11v11H0z\" fill=\"#00A4EF\" />\r\n <path d=\"M12 12h11v11H12z\" fill=\"#FFB900\" />\r\n </svg>\r\n ),\r\n className: 'insforge-oauth-microsoft',\r\n },\r\n apple: {\r\n name: 'Apple',\r\n svg: (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M17.05 20.28c-.98.95-2.05.8-3.08.35-1.09-.46-2.09-.48-3.24 0-1.44.62-2.2.44-3.06-.35C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09l.01-.01zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z\" />\r\n </svg>\r\n ),\r\n className: 'insforge-oauth-apple',\r\n },\r\n x: {\r\n name: 'X',\r\n svg: (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\r\n </svg>\r\n ),\r\n className: 'insforge-oauth-x',\r\n },\r\n instagram: {\r\n name: 'Instagram',\r\n svg: (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.741 24 12 24c3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z\"\r\n fill=\"url(#instagram-gradient)\"\r\n />\r\n <defs>\r\n <linearGradient id=\"instagram-gradient\" x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\">\r\n <stop offset=\"0%\" stopColor=\"#FD5949\" />\r\n <stop offset=\"50%\" stopColor=\"#D6249F\" />\r\n <stop offset=\"100%\" stopColor=\"#285AEB\" />\r\n </linearGradient>\r\n </defs>\r\n </svg>\r\n ),\r\n className: 'insforge-oauth-instagram',\r\n },\r\n tiktok: {\r\n name: 'TikTok',\r\n svg: (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M19.589 6.686a4.793 4.793 0 01-3.77-4.245V2h-3.445v13.672a2.896 2.896 0 01-5.201 1.743l-.002-.001.002.001a2.895 2.895 0 013.183-4.51v-3.5a6.329 6.329 0 00-5.394 10.692 6.33 6.33 0 0010.857-4.424V8.687a8.182 8.182 0 004.773 1.526V6.79a4.831 4.831 0 01-1.003-.104z\"\r\n fill=\"currentColor\"\r\n />\r\n </svg>\r\n ),\r\n className: 'insforge-oauth-tiktok',\r\n },\r\n spotify: {\r\n name: 'Spotify',\r\n svg: (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M12 0C5.4 0 0 5.4 0 12s5.4 12 12 12 12-5.4 12-12S18.66 0 12 0zm5.521 17.34c-.24.359-.66.48-1.021.24-2.82-1.74-6.36-2.101-10.561-1.141-.418.122-.779-.179-.899-.539-.12-.421.18-.78.54-.9 4.56-1.021 8.52-.6 11.64 1.32.42.18.479.659.301 1.02zm1.44-3.3c-.301.42-.841.6-1.262.3-3.239-1.98-8.159-2.58-11.939-1.38-.479.12-1.02-.12-1.14-.6-.12-.48.12-1.021.6-1.141C9.6 9.9 15 10.561 18.72 12.84c.361.181.54.78.241 1.2zm.12-3.36C15.24 8.4 8.82 8.16 5.16 9.301c-.6.179-1.2-.181-1.38-.721-.18-.601.18-1.2.72-1.381 4.26-1.26 11.28-1.02 15.721 1.621.539.3.719 1.02.419 1.56-.299.421-1.02.599-1.559.3z\"\r\n fill=\"#1DB954\"\r\n />\r\n </svg>\r\n ),\r\n className: 'insforge-oauth-spotify',\r\n },\r\n};\r\n\r\n\r\n/**\r\n * Get OAuth provider configuration by provider name\r\n */\r\nexport function getProviderConfig(provider: OAuthProvider): OAuthProviderConfig | null {\r\n return OAUTH_PROVIDER_CONFIG[provider] || null;\r\n}\r\n\r\n/**\r\n * Get all available OAuth provider configurations\r\n */\r\nexport function getAllProviderConfigs(): Partial<Record<OAuthProvider, OAuthProviderConfig>> {\r\n return OAUTH_PROVIDER_CONFIG;\r\n}\r\n\r\n","'use client';\r\n\r\nimport { Loader2 } from 'lucide-react';\r\nimport { cn } from '../../lib/utils';\r\nimport { getProviderConfig } from '../../config/oauth-providers';\r\nimport type { AuthOAuthButtonProps } from '../../types';\r\n\r\n/**\r\n * OAuth provider button with adaptive display modes.\r\n * \r\n * @component\r\n * @example\r\n * ```tsx\r\n * <AuthOAuthButton\r\n * provider=\"google\"\r\n * onClick={handleOAuth}\r\n * displayMode=\"full\"\r\n * />\r\n * ```\r\n * \r\n * @param {OAuthProvider} provider - Provider identifier (e.g., 'google', 'github')\r\n * @param {function} onClick - Click handler\r\n * @param {boolean} [disabled] - Disabled state\r\n * @param {boolean} [loading] - Loading state (shows spinner)\r\n * @param {string} [displayMode='full'] - Display mode ('full' | 'short' | 'icon')\r\n * @param {string} [className] - Button element classes\r\n */\r\nexport function AuthOAuthButton({ \r\n provider, \r\n onClick, \r\n disabled, \r\n loading, \r\n displayMode = 'full',\r\n style,\r\n className \r\n}: AuthOAuthButtonProps) {\r\n const config = getProviderConfig(provider);\r\n\r\n if (!config) {\r\n return null;\r\n }\r\n\r\n const getButtonText = () => {\r\n if (loading) return 'Authenticating...';\r\n if (displayMode === 'full') return `Continue with ${config.name}`;\r\n if (displayMode === 'short') return config.name;\r\n return ''; // icon only mode\r\n };\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n onClick={() => onClick(provider)}\r\n className={cn(\r\n 'flex w-full h-9 px-3 py-2',\r\n 'flex-row justify-center items-center gap-3',\r\n 'rounded-md border border-[#E4E4E7] bg-white',\r\n 'shadow-[0_1px_2px_0_rgba(0,0,0,0.10)]',\r\n 'text-[#09090B] text-center text-sm font-medium leading-5',\r\n 'cursor-pointer transition-all duration-200',\r\n 'hover:bg-[#f9fafb] hover:border-[#9ca3af]',\r\n 'disabled:opacity-60 disabled:cursor-not-allowed',\r\n displayMode === 'full' && 'justify-center',\r\n displayMode === 'short' && 'justify-center px-2 gap-2',\r\n displayMode === 'icon' && 'justify-center gap-0',\r\n className\r\n )}\r\n disabled={disabled || loading}\r\n style={style}\r\n >\r\n {loading ? (\r\n <Loader2 className=\"w-[18px] h-[18px] animate-spin\" size={18} />\r\n ) : (\r\n <span className=\"flex items-center justify-center shrink-0\">{config.svg}</span>\r\n )}\r\n {getButtonText() && <span>{getButtonText()}</span>}\r\n </button>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport { cn } from '../../lib/utils';\r\nimport { AuthOAuthButton } from './AuthOAuthButton';\r\nimport type { AuthOAuthProvidersProps } from '../../types';\r\n\r\n/**\r\n * Smart OAuth provider grid with adaptive layout.\r\n * \r\n * Automatically adjusts layout based on provider count:\r\n * - 1 provider: Full-width\r\n * - 2 or 4 providers: Two columns\r\n * - 3+ providers: Three columns\r\n * \r\n * @component\r\n * @example\r\n * ```tsx\r\n * <AuthOAuthProviders\r\n * providers={['google', 'github', 'discord']}\r\n * onClick={handleOAuth}\r\n * loading={currentProvider}\r\n * />\r\n * \r\n * // With custom styling\r\n * <AuthOAuthProviders\r\n * providers={['google', 'github']}\r\n * onClick={handleOAuth}\r\n * loading={currentProvider}\r\n * appearance={{\r\n * buttonClassName: \"hover:bg-blue-50\"\r\n * }}\r\n * />\r\n * ```\r\n * \r\n * @param {OAuthProvider[]} providers - Provider identifiers array\r\n * @param {function} onClick - Provider click handler\r\n * @param {boolean} [disabled] - Disabled state for all buttons\r\n * @param {OAuthProvider | null} loading - Currently loading provider\r\n * @param {object} [appearance] - Tailwind CSS classes for styling\r\n * - `appearance.containerClassName`: Grid container element\r\n * - `appearance.buttonClassName`: OAuth button elements\r\n */\r\nexport function AuthOAuthProviders({\r\n providers,\r\n onClick,\r\n disabled,\r\n loading,\r\n appearance = {},\r\n}: AuthOAuthProvidersProps) {\r\n if (!providers || providers.length === 0) {\r\n return null;\r\n }\r\n\r\n const count = providers.length;\r\n\r\n // Determine display mode based on count\r\n const getDisplayMode = () => {\r\n if (count === 1) return 'full';\r\n if (count === 2 || count === 4) return 'short';\r\n return 'icon';\r\n };\r\n\r\n // Calculate grid column style for each button\r\n // Grid is always 6 columns, but buttons span different widths based on total count\r\n const getGridColumnStyle = (index: number): React.CSSProperties => {\r\n // 1 button: span all 6 columns\r\n if (count === 1) {\r\n return { gridColumn: 'span 6' };\r\n }\r\n\r\n // 2 buttons: each spans 3 columns\r\n if (count === 2) {\r\n return { gridColumn: 'span 3' };\r\n }\r\n\r\n // 3 buttons: each spans 2 columns\r\n if (count === 3) {\r\n return { gridColumn: 'span 2 / span 2' };\r\n }\r\n\r\n // 4 buttons: 2 rows, each button spans 3 columns\r\n if (count === 4) {\r\n return { gridColumn: 'span 3' };\r\n }\r\n\r\n // 5+ buttons: each spans 2 columns, with last row centered if needed\r\n const totalRows = Math.ceil(count / 3);\r\n const lastRowStartIndex = (totalRows - 1) * 3;\r\n const isInLastRow = index >= lastRowStartIndex;\r\n\r\n if (!isInLastRow) {\r\n // Not in last row, use default span 2\r\n return { gridColumn: 'span 2 / span 2' };\r\n }\r\n\r\n // Calculate position in last row (0-based)\r\n const positionInLastRow = index - lastRowStartIndex;\r\n const itemsInLastRow = count - lastRowStartIndex;\r\n\r\n if (itemsInLastRow === 1) {\r\n // Last row has 1 item: center it at columns 3-4 (span 2 in middle)\r\n return { gridColumn: '3 / 5' };\r\n } else if (itemsInLastRow === 2) {\r\n // Last row has 2 items: center them symmetrically\r\n if (positionInLastRow === 0) {\r\n return { gridColumn: '2 / 4' }; // First button: cols 2-3\r\n } else {\r\n return { gridColumn: '4 / 6' }; // Second button: cols 4-5\r\n }\r\n } else {\r\n // Last row has 3 items: normal span 2\r\n return { gridColumn: 'span 2 / span 2' };\r\n }\r\n };\r\n\r\n return (\r\n <div className={cn(\r\n 'grid gap-3 w-full grid-cols-6',\r\n appearance.containerClassName\r\n )}>\r\n {providers.map((provider, index) => (\r\n <AuthOAuthButton\r\n key={provider}\r\n provider={provider}\r\n onClick={onClick}\r\n disabled={disabled}\r\n loading={loading === provider}\r\n displayMode={getDisplayMode()}\r\n style={getGridColumnStyle(index)}\r\n className={appearance.buttonClassName}\r\n />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport {\r\n useRef,\r\n KeyboardEvent,\r\n ClipboardEvent,\r\n ChangeEvent,\r\n} from 'react';\r\nimport { cn } from '../../lib/utils';\r\nimport type { AuthVerificationCodeInputProps } from '../../types';\r\n\r\n/**\r\n * 6-digit verification code input component with auto-focus and paste support.\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * const [code, setCode] = useState('');\r\n *\r\n * <AuthVerificationCodeInput\r\n * email=\"user@example.com\"\r\n * value={code}\r\n * onChange={setCode}\r\n * />\r\n * \r\n * // With custom styling\r\n * <AuthVerificationCodeInput\r\n * email=\"user@example.com\"\r\n * value={code}\r\n * onChange={setCode}\r\n * appearance={{\r\n * inputClassName: \"border-blue-500\"\r\n * }}\r\n * />\r\n * ```\r\n * \r\n * @param {string} email - Email address to display in instructions\r\n * @param {string} value - Current code value\r\n * @param {function} onChange - Code change handler\r\n * @param {number} [length=6] - Number of digits\r\n * @param {boolean} [disabled] - Disabled state\r\n * @param {object} [appearance] - Tailwind CSS classes for styling\r\n * - `appearance.containerClassName`: Container element\r\n * - `appearance.inputClassName`: Input elements\r\n */\r\nexport function AuthVerificationCodeInput({\r\n length = 6,\r\n value,\r\n email,\r\n onChange,\r\n disabled = false,\r\n appearance = {},\r\n}: AuthVerificationCodeInputProps) {\r\n const inputRefs = useRef<(HTMLInputElement | null)[]>([]);\r\n\r\n const handleChange = (index: number, digit: string) => {\r\n // Only allow single digits\r\n if (digit.length > 1) return;\r\n\r\n // Only allow numbers\r\n if (digit && !/^\\d$/.test(digit)) return;\r\n\r\n // Update the value\r\n const newValue = value.split('');\r\n newValue[index] = digit;\r\n const updatedValue = newValue.join('');\r\n onChange(updatedValue);\r\n\r\n // Auto-focus next input if digit was entered\r\n if (digit && index < length - 1) {\r\n inputRefs.current[index + 1]?.focus();\r\n }\r\n };\r\n\r\n const handleKeyDown = (index: number, e: KeyboardEvent<HTMLInputElement>) => {\r\n // Handle backspace\r\n if (e.key === 'Backspace') {\r\n if (!value[index] && index > 0) {\r\n // If current input is empty, focus previous input\r\n inputRefs.current[index - 1]?.focus();\r\n } else {\r\n // Clear current input\r\n handleChange(index, '');\r\n }\r\n }\r\n // Handle arrow keys\r\n else if (e.key === 'ArrowLeft' && index > 0) {\r\n inputRefs.current[index - 1]?.focus();\r\n } else if (e.key === 'ArrowRight' && index < length - 1) {\r\n inputRefs.current[index + 1]?.focus();\r\n }\r\n };\r\n\r\n const handlePaste = (e: ClipboardEvent<HTMLInputElement>) => {\r\n e.preventDefault();\r\n const pastedData = e.clipboardData.getData('text/plain').trim();\r\n\r\n // Only paste if it's all digits and correct length\r\n if (/^\\d+$/.test(pastedData) && pastedData.length === length) {\r\n onChange(pastedData);\r\n // Focus last input\r\n inputRefs.current[length - 1]?.focus();\r\n }\r\n };\r\n\r\n return (\r\n <div className={cn(\r\n 'flex flex-col justify-center items-center gap-6',\r\n appearance.containerClassName\r\n )}>\r\n <p className=\"text-sm font-normal text-[#525252] leading-5\">\r\n We've sent a verification code to your inbox at{' '}\r\n <span className=\"text-sm font-semibold text-black leading-5\">{email}</span>.\r\n Enter it below to proceed.\r\n </p>\r\n <div className=\"flex flex-row gap-3 justify-center items-center\">\r\n {Array.from({ length }).map((_, index) => (\r\n <input\r\n key={index}\r\n ref={(el) => {\r\n inputRefs.current[index] = el;\r\n }}\r\n type=\"text\"\r\n inputMode=\"numeric\"\r\n maxLength={1}\r\n value={value[index] || ''}\r\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\r\n handleChange(index, e.target.value)\r\n }\r\n onKeyDown={(e: KeyboardEvent<HTMLInputElement>) =>\r\n handleKeyDown(index, e)\r\n }\r\n onPaste={handlePaste}\r\n disabled={disabled}\r\n className={cn(\r\n 'w-full h-12 px-3 py-2 rounded border border-[#E0E0E0] bg-white',\r\n 'text-center text-base font-semibold leading-5 text-black',\r\n 'transition-all duration-200 outline-none',\r\n 'focus:border-black focus:shadow-[0_0_0_2px_rgba(0,0,0,0.1)]',\r\n 'disabled:bg-[#F5F5F5] disabled:cursor-not-allowed disabled:opacity-60',\r\n appearance.inputClassName\r\n )}\r\n autoComplete=\"one-time-code\"\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport {\r\n AuthContainer,\r\n AuthHeader,\r\n AuthErrorBanner,\r\n AuthFormField,\r\n AuthPasswordField,\r\n AuthSubmitButton,\r\n AuthLink,\r\n AuthDivider,\r\n AuthOAuthProviders,\r\n} from '../atoms';\r\nimport type { SignInFormProps } from '../../types';\r\n\r\n/**\r\n * Pre-built sign-in form component (UI only, no business logic).\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * const [email, setEmail] = useState('');\r\n * const [password, setPassword] = useState('');\r\n * const [error, setError] = useState('');\r\n * const [loading, setLoading] = useState(false);\r\n *\r\n * const handleSubmit = async (e) => {\r\n * e.preventDefault();\r\n * setLoading(true);\r\n * try {\r\n * await authService.signIn(email, password);\r\n * } catch (err) {\r\n * setError(err.message);\r\n * } finally {\r\n * setLoading(false);\r\n * }\r\n * };\r\n *\r\n * <SignInForm\r\n * email={email}\r\n * password={password}\r\n * onEmailChange={setEmail}\r\n * onPasswordChange={setPassword}\r\n * onSubmit={handleSubmit}\r\n * error={error}\r\n * loading={loading}\r\n * />\r\n * ```\r\n */\r\nexport function SignInForm({\r\n email,\r\n password,\r\n onEmailChange,\r\n onPasswordChange,\r\n onSubmit,\r\n error,\r\n loading = false,\r\n oauthLoading = null,\r\n availableProviders = [],\r\n onOAuthClick,\r\n emailAuthConfig,\r\n appearance = {},\r\n title = 'Welcome Back',\r\n subtitle = 'Login to your account',\r\n emailLabel = 'Email',\r\n emailPlaceholder = 'example@email.com',\r\n passwordLabel = 'Password',\r\n passwordPlaceholder = '••••••',\r\n forgotPasswordText = 'Forget Password?',\r\n forgotPasswordUrl,\r\n submitButtonText = 'Sign In',\r\n loadingButtonText = 'Signing in...',\r\n signUpText = \"Don't have an account?\",\r\n signUpLinkText = 'Sign Up Now',\r\n signUpUrl = '/sign-up',\r\n dividerText = 'or',\r\n}: SignInFormProps) {\r\n return (\r\n <AuthContainer \r\n appearance={{\r\n containerClassName: appearance.container,\r\n cardClassName: appearance.card,\r\n }}\r\n >\r\n <AuthHeader \r\n title={title} \r\n subtitle={subtitle}\r\n appearance={{\r\n containerClassName: appearance.header?.container,\r\n titleClassName: appearance.header?.title,\r\n subtitleClassName: appearance.header?.subtitle,\r\n }}\r\n />\r\n\r\n <AuthErrorBanner \r\n error={error || ''} \r\n className={appearance.errorBanner}\r\n />\r\n\r\n <form\r\n onSubmit={onSubmit}\r\n noValidate\r\n className={appearance.form?.container || 'flex flex-col items-stretch justify-center gap-6'}\r\n >\r\n <AuthFormField\r\n id=\"email\"\r\n type=\"email\"\r\n label={emailLabel}\r\n placeholder={emailPlaceholder}\r\n value={email}\r\n onChange={(e) => onEmailChange(e.target.value)}\r\n required\r\n autoComplete=\"email\"\r\n appearance={{\r\n containerClassName: appearance.form?.emailField?.container,\r\n labelClassName: appearance.form?.emailField?.label,\r\n inputClassName: appearance.form?.emailField?.input,\r\n }}\r\n />\r\n\r\n <AuthPasswordField\r\n id=\"password\"\r\n label={passwordLabel}\r\n placeholder={passwordPlaceholder}\r\n value={password}\r\n onChange={(e) => onPasswordChange(e.target.value)}\r\n required\r\n autoComplete=\"current-password\"\r\n emailAuthConfig={emailAuthConfig}\r\n forgotPasswordLink={forgotPasswordUrl ? {\r\n href: forgotPasswordUrl,\r\n text: forgotPasswordText,\r\n } : undefined}\r\n appearance={{\r\n containerClassName: appearance.form?.passwordField?.container,\r\n labelClassName: appearance.form?.passwordField?.label,\r\n inputClassName: appearance.form?.passwordField?.input,\r\n }}\r\n />\r\n\r\n <AuthSubmitButton\r\n isLoading={loading}\r\n disabled={loading || oauthLoading !== null}\r\n className={appearance.button}\r\n >\r\n {loading ? loadingButtonText : submitButtonText}\r\n </AuthSubmitButton>\r\n </form>\r\n\r\n <AuthLink \r\n text={signUpText} \r\n linkText={signUpLinkText} \r\n href={signUpUrl}\r\n appearance={{\r\n containerClassName: appearance.link?.container,\r\n linkClassName: appearance.link?.link,\r\n }}\r\n />\r\n\r\n {availableProviders.length > 0 && onOAuthClick && (\r\n <>\r\n <AuthDivider \r\n text={dividerText} \r\n className={appearance.divider}\r\n />\r\n <AuthOAuthProviders\r\n providers={availableProviders}\r\n onClick={onOAuthClick}\r\n disabled={loading || oauthLoading !== null}\r\n loading={oauthLoading}\r\n appearance={{\r\n containerClassName: appearance.oauth?.container,\r\n buttonClassName: appearance.oauth?.button,\r\n }}\r\n />\r\n </>\r\n )}\r\n </AuthContainer>\r\n );\r\n}\r\n\r\n","\"use client\";\r\n\r\nimport { useState, FormEvent } from \"react\";\r\nimport { createClient } from \"@insforge/sdk\";\r\nimport type { OAuthProvidersSchema } from \"@insforge/shared-schemas\";\r\nimport { useInsforge } from \"../provider/InsforgeProvider\";\r\nimport { usePublicAuthConfig } from \"../hooks/usePublicAuthConfig\";\r\nimport { SignInForm } from \"./forms/SignInForm\";\r\nimport type { SignInProps } from \"../types\";\r\n\r\n/**\r\n * Pre-built sign-in component with full authentication logic.\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * <SignIn afterSignInUrl=\"/dashboard\" />\r\n *\r\n * // With custom callbacks\r\n * <SignIn\r\n * onSuccess={(user) => console.log('Signed in:', user)}\r\n * onError={(error) => console.error('Error:', error)}\r\n * />\r\n * ```\r\n */\r\nexport function SignIn({\r\n onSuccess,\r\n onError,\r\n ...uiProps\r\n}: SignInProps) {\r\n const { signIn, baseUrl } = useInsforge();\r\n const { emailConfig } = usePublicAuthConfig();\r\n const [email, setEmail] = useState(\"\");\r\n const [password, setPassword] = useState(\"\");\r\n const [error, setError] = useState(\"\");\r\n const [loading, setLoading] = useState(false);\r\n const [oauthLoading, setOauthLoading] = useState<OAuthProvidersSchema | null>(\r\n null\r\n );\r\n\r\n // Memoized SDK client\r\n const [insforge] = useState(() => createClient({ baseUrl }));\r\n\r\n async function handleSubmit(e: FormEvent<HTMLFormElement>) {\r\n e.preventDefault();\r\n setLoading(true);\r\n setError(\"\");\r\n\r\n try {\r\n const result = await signIn(email, password);\r\n if (\"error\" in result) {\r\n throw new Error(result.error);\r\n }\r\n const { user, accessToken } = result;\r\n\r\n if (onSuccess) {\r\n if (user) onSuccess(user, accessToken || \"\");\r\n }\r\n\r\n } catch (err: any) {\r\n const errorMessage = err.message || \"Sign in failed\";\r\n setError(errorMessage);\r\n if (onError) onError(new Error(errorMessage));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }\r\n\r\n async function handleOAuth(provider: OAuthProvidersSchema) {\r\n try {\r\n setOauthLoading(provider);\r\n setError(\"\");\r\n\r\n const redirectTo = `${window.location.origin}/auth/callback`;\r\n\r\n await insforge.auth.signInWithOAuth({\r\n provider,\r\n redirectTo,\r\n });\r\n\r\n // Browser will redirect automatically\r\n } catch (err: any) {\r\n const errorMessage = err.message || `${provider} sign in failed`;\r\n setError(errorMessage);\r\n if (onError) onError(new Error(errorMessage));\r\n setOauthLoading(null);\r\n }\r\n }\r\n\r\n // If email auth is disabled after loading, don't show the form\r\n if (!emailConfig) {\r\n return null;\r\n }\r\n\r\n return (\r\n <SignInForm\r\n email={email}\r\n password={password}\r\n onEmailChange={setEmail}\r\n onPasswordChange={setPassword}\r\n onSubmit={handleSubmit}\r\n error={error}\r\n loading={loading}\r\n oauthLoading={oauthLoading}\r\n availableProviders={emailConfig?.oAuthProviders || []}\r\n onOAuthClick={handleOAuth}\r\n emailAuthConfig={emailConfig}\r\n {...uiProps}\r\n />\r\n );\r\n}\r\n","'use client';\r\n\r\nimport {\r\n AuthContainer,\r\n AuthHeader,\r\n AuthErrorBanner,\r\n AuthFormField,\r\n AuthPasswordField,\r\n AuthSubmitButton,\r\n AuthLink,\r\n AuthDivider,\r\n AuthOAuthProviders,\r\n} from '../atoms';\r\nimport type { SignUpFormProps } from '../../types';\r\n\r\n/**\r\n * Pre-built sign-up form component (UI only, no business logic).\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * const [email, setEmail] = useState('');\r\n * const [password, setPassword] = useState('');\r\n * const [error, setError] = useState('');\r\n * const [loading, setLoading] = useState(false);\r\n *\r\n * const handleSubmit = async (e) => {\r\n * e.preventDefault();\r\n * setLoading(true);\r\n * try {\r\n * await authService.signUp(email, password);\r\n * } catch (err) {\r\n * setError(err.message);\r\n * } finally {\r\n * setLoading(false);\r\n * }\r\n * };\r\n *\r\n * <SignUpForm\r\n * email={email}\r\n * password={password}\r\n * onEmailChange={setEmail}\r\n * onPasswordChange={setPassword}\r\n * onSubmit={handleSubmit}\r\n * error={error}\r\n * loading={loading}\r\n * />\r\n * ```\r\n */\r\nexport function SignUpForm({\r\n email,\r\n password,\r\n onEmailChange,\r\n onPasswordChange,\r\n onSubmit,\r\n error,\r\n loading = false,\r\n oauthLoading = null,\r\n availableProviders = [],\r\n onOAuthClick,\r\n emailAuthConfig,\r\n appearance = {},\r\n title = 'Get Started',\r\n subtitle = 'Create your account',\r\n emailLabel = 'Email',\r\n emailPlaceholder = 'example@email.com',\r\n passwordLabel = 'Password',\r\n passwordPlaceholder = '••••••',\r\n submitButtonText = 'Sign Up',\r\n loadingButtonText = 'Creating account...',\r\n signInText = 'Already have an account?',\r\n signInLinkText = 'Login Now',\r\n signInUrl = '/sign-in',\r\n dividerText = 'or',\r\n}: SignUpFormProps) {\r\n return (\r\n <AuthContainer \r\n appearance={{\r\n containerClassName: appearance.container,\r\n cardClassName: appearance.card,\r\n }}\r\n >\r\n <AuthHeader \r\n title={title} \r\n subtitle={subtitle}\r\n appearance={{\r\n containerClassName: appearance.header?.container,\r\n titleClassName: appearance.header?.title,\r\n subtitleClassName: appearance.header?.subtitle,\r\n }}\r\n />\r\n\r\n <AuthErrorBanner \r\n error={error || ''} \r\n className={appearance.errorBanner}\r\n />\r\n\r\n <form\r\n onSubmit={onSubmit}\r\n noValidate\r\n className={appearance.form?.container || 'flex flex-col items-stretch justify-center gap-6'}\r\n >\r\n <AuthFormField\r\n id=\"email\"\r\n type=\"email\"\r\n label={emailLabel}\r\n placeholder={emailPlaceholder}\r\n value={email}\r\n onChange={(e) => onEmailChange(e.target.value)}\r\n required\r\n autoComplete=\"email\"\r\n appearance={{\r\n containerClassName: appearance.form?.emailField?.container,\r\n labelClassName: appearance.form?.emailField?.label,\r\n inputClassName: appearance.form?.emailField?.input,\r\n }}\r\n />\r\n\r\n <AuthPasswordField\r\n id=\"password\"\r\n label={passwordLabel}\r\n placeholder={passwordPlaceholder}\r\n value={password}\r\n onChange={(e) => onPasswordChange(e.target.value)}\r\n required\r\n minLength={emailAuthConfig.passwordMinLength}\r\n autoComplete=\"new-password\"\r\n showStrengthIndicator\r\n emailAuthConfig={emailAuthConfig}\r\n appearance={{\r\n containerClassName: appearance.form?.passwordField?.container,\r\n labelClassName: appearance.form?.passwordField?.label,\r\n inputClassName: appearance.form?.passwordField?.input,\r\n }}\r\n />\r\n\r\n <AuthSubmitButton\r\n isLoading={loading}\r\n disabled={loading || oauthLoading !== null}\r\n className={appearance.button}\r\n >\r\n {loading ? loadingButtonText : submitButtonText}\r\n </AuthSubmitButton>\r\n </form>\r\n\r\n <AuthLink \r\n text={signInText} \r\n linkText={signInLinkText} \r\n href={signInUrl}\r\n appearance={{\r\n containerClassName: appearance.link?.container,\r\n linkClassName: appearance.link?.link,\r\n }}\r\n />\r\n\r\n {availableProviders.length > 0 && onOAuthClick && (\r\n <>\r\n <AuthDivider \r\n text={dividerText} \r\n className={appearance.divider}\r\n />\r\n <AuthOAuthProviders\r\n providers={availableProviders}\r\n onClick={onOAuthClick}\r\n disabled={loading || oauthLoading !== null}\r\n loading={oauthLoading}\r\n appearance={{\r\n containerClassName: appearance.oauth?.container,\r\n buttonClassName: appearance.oauth?.button,\r\n }}\r\n />\r\n </>\r\n )}\r\n </AuthContainer>\r\n );\r\n}\r\n\r\n","\"use client\";\r\n\r\nimport { useState, FormEvent } from \"react\";\r\nimport { createClient } from \"@insforge/sdk\";\r\nimport type { OAuthProvidersSchema } from \"@insforge/shared-schemas\";\r\nimport { useInsforge } from \"../provider/InsforgeProvider\";\r\nimport { usePublicAuthConfig } from \"../hooks/usePublicAuthConfig\";\r\nimport { SignUpForm } from \"./forms/SignUpForm\";\r\nimport { validatePasswordStrength } from \"./atoms/AuthPasswordStrengthIndicator\";\r\nimport type { SignUpProps } from \"../types\";\r\n\r\n/**\r\n * Pre-built sign-up component with full authentication logic.\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * <SignUp afterSignUpUrl=\"/onboarding\" />\r\n *\r\n * // With custom callbacks\r\n * <SignUp\r\n * onSuccess={(user) => console.log('Signed up:', user)}\r\n * onError={(error) => console.error('Error:', error)}\r\n * />\r\n * ```\r\n */\r\nexport function SignUp({\r\n onSuccess,\r\n onError,\r\n ...uiProps\r\n}: SignUpProps) {\r\n const { signUp, baseUrl } = useInsforge();\r\n const { emailConfig } = usePublicAuthConfig();\r\n const [email, setEmail] = useState(\"\");\r\n const [password, setPassword] = useState(\"\");\r\n const [error, setError] = useState(\"\");\r\n const [loading, setLoading] = useState(false);\r\n const [oauthLoading, setOauthLoading] = useState<OAuthProvidersSchema | null>(\r\n null\r\n );\r\n\r\n // Memoized SDK client\r\n const [insforge] = useState(() => createClient({ baseUrl }));\r\n\r\n async function handleSubmit(e: FormEvent<HTMLFormElement>) {\r\n e.preventDefault();\r\n setLoading(true);\r\n setError(\"\");\r\n\r\n // Validate password strength\r\n if (emailConfig && !validatePasswordStrength(password, emailConfig)) {\r\n setError(\"Password does not meet all requirements\");\r\n setLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n const result = await signUp(email, password);\r\n if (\"error\" in result) {\r\n throw new Error(result.error);\r\n }\r\n const { user, accessToken } = result;\r\n\r\n if (onSuccess) {\r\n if (user) onSuccess(user, accessToken || \"\");\r\n }\r\n\r\n } catch (err: any) {\r\n const errorMessage = err.message || \"Sign up failed\";\r\n setError(errorMessage);\r\n if (onError) onError(new Error(errorMessage));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }\r\n\r\n async function handleOAuth(provider: OAuthProvidersSchema) {\r\n try {\r\n setOauthLoading(provider);\r\n setError(\"\");\r\n\r\n const redirectTo = `${window.location.origin}/auth/callback`;\r\n\r\n await insforge.auth.signInWithOAuth({\r\n provider,\r\n redirectTo,\r\n });\r\n\r\n // Browser will redirect automatically\r\n } catch (err: any) {\r\n const errorMessage = err.message || `${provider} sign up failed`;\r\n setError(errorMessage);\r\n if (onError) onError(new Error(errorMessage));\r\n setOauthLoading(null);\r\n }\r\n }\r\n\r\n // If email auth is disabled after loading, don't show the form\r\n if (!emailConfig) {\r\n return null;\r\n }\r\n\r\n return (\r\n <SignUpForm\r\n email={email}\r\n password={password}\r\n onEmailChange={setEmail}\r\n onPasswordChange={setPassword}\r\n onSubmit={handleSubmit}\r\n error={error}\r\n loading={loading}\r\n oauthLoading={oauthLoading}\r\n availableProviders={emailConfig?.oAuthProviders || []}\r\n onOAuthClick={handleOAuth}\r\n emailAuthConfig={emailConfig}\r\n {...uiProps}\r\n />\r\n );\r\n}\r\n","'use client';\r\n\r\nimport { useState, useRef, useEffect } from 'react';\r\nimport { LogOut } from 'lucide-react';\r\nimport { useInsforge } from '../provider/InsforgeProvider';\r\nimport { cn } from '../lib/utils';\r\nimport type { UserButtonProps } from '../types';\r\n\r\n/**\r\n * User profile button with dropdown menu and sign-out functionality.\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * <UserButton afterSignOutUrl=\"/\" />\r\n * \r\n * // Simple mode\r\n * <UserButton mode=\"simple\" />\r\n * \r\n * // With custom styling\r\n * <UserButton\r\n * appearance={{\r\n * buttonClassName: \"hover:bg-white/10\",\r\n * dropdownClassName: \"bg-gray-900\"\r\n * }}\r\n * />\r\n * ```\r\n * \r\n * @param {string} [afterSignOutUrl='/'] - URL to redirect to after sign-out\r\n * @param {'detailed'|'simple'} [mode='detailed'] - Display mode\r\n * @param {object} [appearance] - Custom Tailwind classes\r\n */\r\nexport function UserButton({\r\n afterSignOutUrl = '/',\r\n mode = 'detailed',\r\n appearance = {},\r\n}: UserButtonProps) {\r\n const { user, signOut } = useInsforge();\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [imageError, setImageError] = useState(false);\r\n const dropdownRef = useRef<HTMLDivElement>(null);\r\n\r\n // Validate image URL when avatarUrl changes\r\n useEffect(() => {\r\n setImageError(false);\r\n\r\n const avatarUrl = user?.avatarUrl;\r\n if (!avatarUrl) return;\r\n\r\n const checkImageUrl = async () => {\r\n try {\r\n const response = await fetch(avatarUrl, {\r\n method: 'HEAD',\r\n cache: 'no-cache',\r\n });\r\n if (!response.ok) {\r\n setImageError(true);\r\n }\r\n } catch (error) {\r\n setImageError(true);\r\n }\r\n };\r\n\r\n checkImageUrl();\r\n }, [user?.avatarUrl]);\r\n\r\n useEffect(() => {\r\n function handleClickOutside(event: MouseEvent) {\r\n if (\r\n dropdownRef.current &&\r\n !dropdownRef.current.contains(event.target as Node)\r\n ) {\r\n setIsOpen(false);\r\n }\r\n }\r\n\r\n if (isOpen) {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n }\r\n\r\n return () => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n };\r\n }, [isOpen]);\r\n\r\n async function handleSignOut() {\r\n await signOut();\r\n setIsOpen(false);\r\n window.location.href = afterSignOutUrl;\r\n }\r\n\r\n if (!user) return null;\r\n\r\n const initials = user.name\r\n ? user.name.charAt(0).toUpperCase()\r\n : user.email.split('@')[0].slice(0, 2).toUpperCase();\r\n\r\n return (\r\n <div\r\n className={cn('relative inline-block', appearance.containerClassName)}\r\n ref={dropdownRef}\r\n >\r\n <button\r\n className={cn(\r\n 'p-1 bg-transparent border-0 rounded-full cursor-pointer transition-all duration-200',\r\n 'flex items-center justify-center gap-2',\r\n 'hover:bg-black/5',\r\n mode === 'detailed' && 'rounded-lg p-2',\r\n appearance.buttonClassName\r\n )}\r\n onClick={() => setIsOpen(!isOpen)}\r\n aria-expanded={isOpen}\r\n aria-haspopup=\"true\"\r\n >\r\n <div className=\"flex items-center justify-center w-10 h-10 bg-blue-500 rounded-full\">\r\n {user.avatarUrl && !imageError ? (\r\n <img\r\n src={user.avatarUrl}\r\n alt={user.email}\r\n onError={() => setImageError(true)}\r\n className=\"rounded-full object-cover w-full h-full\"\r\n />\r\n ) : (\r\n <span className=\"text-white font-semibold text-sm\">{initials}</span>\r\n )}\r\n </div>\r\n {mode === 'detailed' && (\r\n <div className=\"flex flex-col items-start gap-0.5\">\r\n {user.name && (\r\n <div\r\n className={cn(\r\n 'text-sm font-semibold text-gray-900 leading-5 text-left',\r\n appearance.nameClassName\r\n )}\r\n >\r\n {user.name}\r\n </div>\r\n )}\r\n <div\r\n className={cn(\r\n 'text-xs text-gray-500 leading-4 text-left',\r\n appearance.emailClassName\r\n )}\r\n >\r\n {user.email}\r\n </div>\r\n </div>\r\n )}\r\n </button>\r\n\r\n {isOpen && (\r\n <div\r\n className={cn(\r\n 'absolute top-full right-0 mt-2 min-w-40',\r\n 'bg-white border border-gray-200 rounded-lg',\r\n 'shadow-lg z-50 overflow-hidden p-1',\r\n appearance.dropdownClassName\r\n )}\r\n >\r\n <button\r\n onClick={handleSignOut}\r\n className=\"flex items-center justify-start gap-2 w-full px-3 py-2 text-sm font-normal text-red-600 bg-transparent border-0 rounded-md cursor-pointer transition-colors hover:bg-red-50 text-left\"\r\n >\r\n <LogOut className=\"w-5 h-5\" />\r\n Sign out\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport { useInsforge } from '../provider/InsforgeProvider';\r\nimport { useEffect } from 'react';\r\nimport type { ProtectProps } from '../types';\r\n\r\n/**\r\n * Protected route component that redirects unauthenticated users.\r\n * \r\n * @component\r\n * @example\r\n * ```tsx\r\n * // Basic usage\r\n * <Protect redirectTo=\"/sign-in\">\r\n * <Dashboard />\r\n * </Protect>\r\n * \r\n * // With custom redirect handler (e.g., for Next.js router)\r\n * <Protect \r\n * redirectTo=\"/sign-in\"\r\n * onRedirect={(url) => router.push(url)}\r\n * >\r\n * <AdminPanel />\r\n * </Protect>\r\n * \r\n * // With custom condition (role-based access)\r\n * <Protect\r\n * redirectTo=\"/unauthorized\"\r\n * condition={(user) => user.role === 'admin'}\r\n * >\r\n * <AdminContent />\r\n * </Protect>\r\n * ```\r\n * \r\n * @param {ReactNode} children - Content to protect\r\n * @param {ReactNode} [fallback] - Fallback UI while loading\r\n * @param {string} [redirectTo='/sign-in'] - Redirect URL\r\n * @param {function} [condition] - Custom access condition\r\n * @param {function} [onRedirect] - Custom redirect handler (default: window.location)\r\n */\r\nexport function Protect({\r\n children,\r\n fallback,\r\n redirectTo = '/sign-in',\r\n condition,\r\n onRedirect,\r\n}: ProtectProps) {\r\n const { isSignedIn, isLoaded, user } = useInsforge();\r\n\r\n useEffect(() => {\r\n if (isLoaded && !isSignedIn) {\r\n // Redirect if not signed in\r\n if (onRedirect) {\r\n onRedirect(redirectTo);\r\n } else {\r\n window.location.href = redirectTo;\r\n }\r\n } else if (isLoaded && isSignedIn && condition && user) {\r\n // Check custom condition\r\n if (!condition(user)) {\r\n if (onRedirect) {\r\n onRedirect(redirectTo);\r\n } else {\r\n window.location.href = redirectTo;\r\n }\r\n }\r\n }\r\n }, [isLoaded, isSignedIn, redirectTo, condition, user, onRedirect]);\r\n\r\n // Show fallback while loading\r\n if (!isLoaded) {\r\n return fallback || <div className=\"insforge-loading\">Loading...</div>;\r\n }\r\n\r\n // Don't render if not signed in\r\n if (!isSignedIn) {\r\n return fallback || null;\r\n }\r\n\r\n // Don't render if condition fails\r\n if (condition && user && !condition(user)) {\r\n return fallback || null;\r\n }\r\n\r\n return <>{children}</>;\r\n}\r\n\r\n","'use client';\r\n\r\nimport { useInsforge } from '../provider/InsforgeProvider';\r\nimport type { ConditionalProps } from '../types';\r\n\r\n/**\r\n * Conditional component that renders children only when user is signed in.\r\n * \r\n * @component\r\n * @example\r\n * ```tsx\r\n * <SignedIn>\r\n * <Dashboard />\r\n * </SignedIn>\r\n * ```\r\n * \r\n * @param {ReactNode} children - React nodes to render when user is authenticated\r\n * @returns {JSX.Element | null} Renders children when signed in, null otherwise\r\n */\r\nexport function SignedIn({ children }: ConditionalProps) {\r\n const { isSignedIn, isLoaded } = useInsforge();\r\n\r\n if (!isLoaded) return null;\r\n if (!isSignedIn) return null;\r\n\r\n return <>{children}</>;\r\n}\r\n\r\n","'use client';\r\n\r\nimport { useInsforge } from '../provider/InsforgeProvider';\r\nimport type { ConditionalProps } from '../types';\r\n\r\n/**\r\n * Conditional component that renders children only when user is signed out.\r\n * \r\n * @component\r\n * @example\r\n * ```tsx\r\n * <SignedOut>\r\n * <SignIn />\r\n * </SignedOut>\r\n * ```\r\n * \r\n * @param {ReactNode} children - React nodes to render when user is not authenticated\r\n * @returns {JSX.Element | null} Renders children when signed out, null otherwise\r\n */\r\nexport function SignedOut({ children }: ConditionalProps) {\r\n const { isSignedIn, isLoaded } = useInsforge();\r\n\r\n if (!isLoaded) return null;\r\n if (isSignedIn) return null;\r\n\r\n return <>{children}</>;\r\n}\r\n\r\n","'use client';\r\n\r\nimport { useEffect, useRef, type ReactNode } from 'react';\r\nimport { useInsforge } from '../provider/InsforgeProvider';\r\n\r\nexport interface InsforgeCallbackProps {\r\n /**\r\n * Redirect destination after successful authentication\r\n */\r\n redirectTo?: string;\r\n \r\n /**\r\n * Callback fired on successful authentication\r\n */\r\n onSuccess?: () => void;\r\n \r\n /**\r\n * Callback fired on authentication error\r\n */\r\n onError?: (error: string) => void;\r\n \r\n /**\r\n * Custom loading component\r\n */\r\n loadingComponent?: ReactNode;\r\n \r\n /**\r\n * Custom redirect handler (default: window.location)\r\n */\r\n onRedirect?: (url: string) => void;\r\n}\r\n\r\n/**\r\n * InsforgeCallback - Handles OAuth and email/password authentication callbacks\r\n * \r\n * Place this component on your `/auth/callback` page.\r\n * \r\n * @example\r\n * ```tsx\r\n * // Minimal usage\r\n * export default function CallbackPage() {\r\n * return <InsforgeCallback />;\r\n * }\r\n * ```\r\n * \r\n * @example\r\n * ```tsx\r\n * // With Next.js router\r\n * import { useRouter } from 'next/navigation';\r\n * \r\n * export default function CallbackPage() {\r\n * const router = useRouter();\r\n * return (\r\n * <InsforgeCallback\r\n * redirectTo=\"/dashboard\"\r\n * onRedirect={(url) => router.push(url)}\r\n * />\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function InsforgeCallback({\r\n redirectTo,\r\n onSuccess,\r\n onError,\r\n loadingComponent,\r\n onRedirect,\r\n}: InsforgeCallbackProps) {\r\n const isProcessingRef = useRef(false);\r\n const { handleAuthCallback } = useInsforge();\r\n\r\n useEffect(() => {\r\n const processCallback = async () => {\r\n // Prevent double-processing\r\n if (isProcessingRef.current) return;\r\n isProcessingRef.current = true;\r\n const searchParams = new URLSearchParams(window.location.search);\r\n\r\n // Check for error from backend (authentication service)\r\n const error = searchParams.get('error');\r\n if (error) {\r\n if (onError) {\r\n onError(error);\r\n } else {\r\n const errorUrl = '/?error=' + encodeURIComponent(error);\r\n if (onRedirect) {\r\n onRedirect(errorUrl);\r\n } else {\r\n window.location.href = errorUrl;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n const accessToken = searchParams.get('access_token');\r\n const userId = searchParams.get('user_id');\r\n const email = searchParams.get('email');\r\n const name = searchParams.get('name');\r\n\r\n if (!accessToken) {\r\n // No token found in URL - invalid callback\r\n const errorMsg = 'no_token';\r\n if (onError) {\r\n onError(errorMsg);\r\n } else {\r\n const errorUrl = '/?error=' + encodeURIComponent(errorMsg);\r\n if (onRedirect) {\r\n onRedirect(errorUrl);\r\n } else {\r\n window.location.href = errorUrl;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n const result = await handleAuthCallback({\r\n accessToken,\r\n userId: userId || undefined,\r\n email: email || undefined,\r\n name: name || undefined,\r\n });\r\n\r\n if (!result.success) {\r\n const errorMsg = result.error || 'authentication_failed';\r\n if (onError) {\r\n onError(errorMsg);\r\n } else {\r\n const errorUrl = '/?error=' + encodeURIComponent(errorMsg);\r\n if (onRedirect) {\r\n onRedirect(errorUrl);\r\n } else {\r\n window.location.href = errorUrl;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n // Authentication successful!\r\n window.history.replaceState({}, '', window.location.pathname);\r\n\r\n // Fire success callback\r\n if (onSuccess) {\r\n onSuccess();\r\n }\r\n\r\n const destination = \r\n redirectTo || \r\n sessionStorage.getItem('auth_destination') || \r\n sessionStorage.getItem('oauth_final_destination') || \r\n '/';\r\n \r\n sessionStorage.removeItem('auth_destination');\r\n sessionStorage.removeItem('oauth_final_destination');\r\n\r\n // Redirect to final destination\r\n if (onRedirect) {\r\n onRedirect(destination);\r\n } else {\r\n window.location.href = destination;\r\n }\r\n };\r\n\r\n processCallback();\r\n }, [handleAuthCallback, redirectTo, onSuccess, onError, onRedirect]); // Include all dependencies\r\n\r\n const defaultLoading = (\r\n <div className=\"flex items-center justify-center min-h-screen\">\r\n <div className=\"text-center\">\r\n <h2 className=\"text-2xl font-semibold mb-4\">Completing authentication...</h2>\r\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto\"></div>\r\n </div>\r\n </div>\r\n );\r\n\r\n return loadingComponent || defaultLoading;\r\n}\r\n\r\n","'use client';\r\n\r\nimport {\r\n AuthContainer,\r\n AuthHeader,\r\n AuthErrorBanner,\r\n AuthFormField,\r\n AuthSubmitButton,\r\n AuthLink,\r\n} from '../atoms';\r\nimport type { ForgotPasswordFormProps } from '../../types';\r\n\r\n/**\r\n * Pre-built forgot password form component (UI only, no business logic).\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * const [email, setEmail] = useState('');\r\n * const [error, setError] = useState('');\r\n * const [loading, setLoading] = useState(false);\r\n * const [success, setSuccess] = useState(false);\r\n *\r\n * const handleSubmit = async (e) => {\r\n * e.preventDefault();\r\n * setLoading(true);\r\n * try {\r\n * await authService.sendResetPasswordCode({ email });\r\n * setSuccess(true);\r\n * } catch (err) {\r\n * setError(err.message);\r\n * } finally {\r\n * setLoading(false);\r\n * }\r\n * };\r\n *\r\n * <ForgotPasswordForm\r\n * email={email}\r\n * onEmailChange={setEmail}\r\n * onSubmit={handleSubmit}\r\n * error={error}\r\n * loading={loading}\r\n * success={success}\r\n * />\r\n * ```\r\n */\r\nexport function ForgotPasswordForm({\r\n email,\r\n onEmailChange,\r\n onSubmit,\r\n error,\r\n loading = false,\r\n success = false,\r\n appearance = {},\r\n title = 'Forgot Password?',\r\n subtitle = \"Enter your email address and we'll send you a code to reset your password.\",\r\n emailLabel = 'Email',\r\n emailPlaceholder = 'example@email.com',\r\n submitButtonText = 'Send Reset Code',\r\n loadingButtonText = 'Sending...',\r\n backToSignInText = 'Remember your password?',\r\n backToSignInUrl = '/sign-in',\r\n successTitle = 'Check Your Email',\r\n successMessage,\r\n}: ForgotPasswordFormProps) {\r\n if (success) {\r\n return (\r\n <AuthContainer \r\n appearance={{\r\n containerClassName: appearance.container,\r\n cardClassName: appearance.card,\r\n }}\r\n >\r\n <div className=\"flex flex-col items-center gap-4\">\r\n <div className=\"w-16 h-16 rounded-full bg-green-100 dark:bg-green-900 flex items-center justify-center\">\r\n <svg className=\"w-8 h-8 text-green-600 dark:text-green-400\" fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n </div>\r\n <h2 className=\"text-2xl font-semibold text-black dark:text-white text-center\">{successTitle}</h2>\r\n <p className=\"text-sm text-neutral-600 dark:text-neutral-400 text-center\">\r\n {successMessage || `We've sent a password reset link to ${email}. Please check your email and follow the instructions.`}\r\n </p>\r\n <a href={backToSignInUrl} className=\"mt-4 text-black dark:text-white font-medium\">\r\n Back to Sign In\r\n </a>\r\n </div>\r\n </AuthContainer>\r\n );\r\n }\r\n\r\n return (\r\n <AuthContainer \r\n appearance={{\r\n containerClassName: appearance.container,\r\n cardClassName: appearance.card,\r\n }}\r\n >\r\n <AuthHeader \r\n title={title} \r\n subtitle={subtitle}\r\n appearance={{\r\n containerClassName: appearance.header?.container,\r\n titleClassName: appearance.header?.title,\r\n subtitleClassName: appearance.header?.subtitle,\r\n }}\r\n />\r\n\r\n <AuthErrorBanner \r\n error={error || ''} \r\n className={appearance.errorBanner}\r\n />\r\n\r\n <form\r\n onSubmit={onSubmit}\r\n noValidate\r\n className={appearance.form?.container || 'flex flex-col items-stretch justify-center gap-6'}\r\n >\r\n <AuthFormField\r\n id=\"email\"\r\n type=\"email\"\r\n label={emailLabel}\r\n placeholder={emailPlaceholder}\r\n value={email}\r\n onChange={(e) => onEmailChange(e.target.value)}\r\n required\r\n autoComplete=\"email\"\r\n appearance={{\r\n containerClassName: appearance.form?.emailField?.container,\r\n labelClassName: appearance.form?.emailField?.label,\r\n inputClassName: appearance.form?.emailField?.input,\r\n }}\r\n />\r\n\r\n <AuthSubmitButton\r\n isLoading={loading}\r\n disabled={loading}\r\n className={appearance.button}\r\n >\r\n {loading ? loadingButtonText : submitButtonText}\r\n </AuthSubmitButton>\r\n </form>\r\n\r\n <AuthLink \r\n text={backToSignInText} \r\n linkText=\"Back to Sign In\" \r\n href={backToSignInUrl}\r\n appearance={{\r\n containerClassName: appearance.link?.container,\r\n linkClassName: appearance.link?.link,\r\n }}\r\n />\r\n </AuthContainer>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport {\r\n AuthContainer,\r\n AuthHeader,\r\n AuthErrorBanner,\r\n AuthPasswordField,\r\n AuthSubmitButton,\r\n} from '../atoms';\r\nimport type { ResetPasswordFormProps } from '../../types';\r\n\r\n/**\r\n * Pre-built reset password form component (UI only, no business logic).\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * const [newPassword, setNewPassword] = useState('');\r\n * const [confirmPassword, setConfirmPassword] = useState('');\r\n * const [error, setError] = useState('');\r\n * const [loading, setLoading] = useState(false);\r\n *\r\n * const handleSubmit = async (e) => {\r\n * e.preventDefault();\r\n * if (newPassword !== confirmPassword) {\r\n * setError('Passwords do not match');\r\n * return;\r\n * }\r\n * setLoading(true);\r\n * try {\r\n * await authService.resetPassword({ newPassword, token });\r\n * } catch (err) {\r\n * setError(err.message);\r\n * } finally {\r\n * setLoading(false);\r\n * }\r\n * };\r\n *\r\n * <ResetPasswordForm\r\n * newPassword={newPassword}\r\n * confirmPassword={confirmPassword}\r\n * onNewPasswordChange={setNewPassword}\r\n * onConfirmPasswordChange={setConfirmPassword}\r\n * onSubmit={handleSubmit}\r\n * error={error}\r\n * loading={loading}\r\n * emailAuthConfig={config}\r\n * />\r\n * ```\r\n */\r\nexport function ResetPasswordForm({\r\n newPassword,\r\n confirmPassword,\r\n onNewPasswordChange,\r\n onConfirmPasswordChange,\r\n onSubmit,\r\n error,\r\n loading = false,\r\n emailAuthConfig,\r\n appearance = {},\r\n title = 'Reset Password',\r\n subtitle = 'Enter your new password below.',\r\n newPasswordLabel = 'New Password',\r\n newPasswordPlaceholder = '••••••',\r\n confirmPasswordLabel = 'Confirm Password',\r\n confirmPasswordPlaceholder = '••••••',\r\n submitButtonText = 'Reset Password',\r\n loadingButtonText = 'Resetting...',\r\n backToSignInText = '',\r\n backToSignInUrl = '/sign-in',\r\n}: ResetPasswordFormProps) {\r\n return (\r\n <AuthContainer \r\n appearance={{\r\n containerClassName: appearance.container,\r\n cardClassName: appearance.card,\r\n }}\r\n >\r\n <AuthHeader \r\n title={title} \r\n subtitle={subtitle}\r\n appearance={{\r\n containerClassName: appearance.header?.container,\r\n titleClassName: appearance.header?.title,\r\n subtitleClassName: appearance.header?.subtitle,\r\n }}\r\n />\r\n\r\n <AuthErrorBanner \r\n error={error || ''} \r\n className={appearance.errorBanner}\r\n />\r\n\r\n <form\r\n onSubmit={onSubmit}\r\n noValidate\r\n className={appearance.form?.container || 'flex flex-col items-stretch justify-center gap-6'}\r\n >\r\n <AuthPasswordField\r\n id=\"newPassword\"\r\n label={newPasswordLabel}\r\n placeholder={newPasswordPlaceholder}\r\n value={newPassword}\r\n onChange={(e) => onNewPasswordChange(e.target.value)}\r\n required\r\n autoComplete=\"new-password\"\r\n showStrengthIndicator\r\n emailAuthConfig={emailAuthConfig}\r\n appearance={{\r\n containerClassName: appearance.form?.newPasswordField?.container,\r\n labelClassName: appearance.form?.newPasswordField?.label,\r\n inputClassName: appearance.form?.newPasswordField?.input,\r\n }}\r\n />\r\n\r\n <AuthPasswordField\r\n id=\"confirmPassword\"\r\n label={confirmPasswordLabel}\r\n placeholder={confirmPasswordPlaceholder}\r\n value={confirmPassword}\r\n onChange={(e) => onConfirmPasswordChange(e.target.value)}\r\n required\r\n autoComplete=\"new-password\"\r\n emailAuthConfig={emailAuthConfig}\r\n appearance={{\r\n containerClassName: appearance.form?.confirmPasswordField?.container,\r\n labelClassName: appearance.form?.confirmPasswordField?.label,\r\n inputClassName: appearance.form?.confirmPasswordField?.input,\r\n }}\r\n />\r\n\r\n <AuthSubmitButton\r\n isLoading={loading}\r\n disabled={loading}\r\n className={appearance.button}\r\n >\r\n {loading ? loadingButtonText : submitButtonText}\r\n </AuthSubmitButton>\r\n </form>\r\n\r\n <p className={appearance.backToSignIn || \"text-center text-sm text-gray-600 dark:text-gray-400\"}>\r\n {backToSignInText && <span>{backToSignInText} </span>}\r\n <a href={backToSignInUrl} className=\"text-black dark:text-white font-medium\">\r\n Back to Sign In\r\n </a>\r\n </p>\r\n </AuthContainer>\r\n );\r\n}\r\n\r\n","'use client';\r\n\r\nimport { AuthContainer } from '../atoms';\r\nimport type { VerifyEmailStatusProps } from '../../types';\r\n\r\n/**\r\n * Email verification status display component (UI only, no business logic).\r\n *\r\n * @component\r\n * @example\r\n * ```tsx\r\n * const [status, setStatus] = useState('verifying');\r\n * const [error, setError] = useState('');\r\n *\r\n * useEffect(() => {\r\n * const verify = async () => {\r\n * try {\r\n * await authService.verifyEmail({ token });\r\n * setStatus('success');\r\n * } catch (err) {\r\n * setError(err.message);\r\n * setStatus('error');\r\n * }\r\n * };\r\n * verify();\r\n * }, [token]);\r\n *\r\n * <VerifyEmailStatus\r\n * status={status}\r\n * error={error}\r\n * />\r\n * ```\r\n */\r\nexport function VerifyEmailStatus({\r\n status,\r\n error,\r\n appearance = {},\r\n verifyingTitle = 'Verifying your email...',\r\n successTitle = 'Email Verified!',\r\n successMessage = 'Your email has been verified successfully. You can close this page and return to your app.',\r\n errorTitle = 'Verification Failed',\r\n}: VerifyEmailStatusProps) {\r\n if (status === 'verifying') {\r\n return (\r\n <AuthContainer appearance={appearance}>\r\n <div className=\"w-full flex flex-col items-center justify-center gap-6\">\r\n <h2 className=\"text-2xl font-semibold text-black dark:text-white\">{verifyingTitle}</h2>\r\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-black dark:border-white\" />\r\n </div>\r\n </AuthContainer>\r\n );\r\n }\r\n\r\n if (status === 'error') {\r\n return (\r\n <AuthContainer appearance={appearance}>\r\n <div className=\"w-full flex flex-col items-stretch justify-center gap-6\">\r\n <div className=\"flex flex-col items-start justify-center gap-2\">\r\n <h1 className=\"text-2xl font-semibold text-black dark:text-white\">{errorTitle}</h1>\r\n <p className=\"text-sm text-neutral-600 dark:text-neutral-400 leading-relaxed\">\r\n {error || 'The verification link is invalid or has expired.'} Please try again or contact support if the problem persists. You can close this page and return to your app.\r\n </p>\r\n </div>\r\n </div>\r\n </AuthContainer>\r\n );\r\n }\r\n\r\n // Success state\r\n return (\r\n <AuthContainer appearance={appearance}>\r\n <div className=\"w-full flex flex-col items-stretch justify-center gap-6\">\r\n <div className=\"flex flex-col items-center gap-4\">\r\n <div className=\"w-16 h-16 rounded-full bg-green-100 dark:bg-green-900 flex items-center justify-center\">\r\n <svg className=\"w-8 h-8 text-green-600 dark:text-green-400\" fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n </div>\r\n <h2 className=\"text-2xl font-semibold text-black dark:text-white text-center\">{successTitle}</h2>\r\n <p className=\"text-sm text-neutral-600 dark:text-neutral-400 text-center\">\r\n {successMessage}\r\n </p>\r\n </div>\r\n </div>\r\n </AuthContainer>\r\n );\r\n}\r\n\r\n","import { useInsforge } from '../provider/InsforgeProvider';\r\n\r\n/**\r\n * Hook to access authentication methods\r\n * \r\n * @returns Object containing:\r\n * - `signIn`: Function to sign in with email and password\r\n * - `signUp`: Function to sign up with email and password\r\n * - `signOut`: Function to sign out the current user\r\n * - `isLoaded`: Boolean indicating if auth state has been loaded\r\n * - `isSignedIn`: Boolean indicating if user is currently signed in\r\n * \r\n * @example\r\n * ```tsx\r\n * function LoginForm() {\r\n * const { signIn, signUp, signOut, isLoaded, isSignedIn } = useAuth();\r\n * \r\n * async function handleLogin(email: string, password: string) {\r\n * try {\r\n * await signIn(email, password);\r\n * // User is now signed in\r\n * } catch (error) {\r\n * console.error('Sign in failed:', error);\r\n * }\r\n * }\r\n * \r\n * if (!isLoaded) return <div>Loading...</div>;\r\n * \r\n * return (\r\n * <form onSubmit={(e) => { e.preventDefault(); handleLogin(email, password); }}>\r\n * {/* form fields *\\/}\r\n * </form>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function useAuth() {\r\n const { signIn, signUp, signOut, isLoaded, isSignedIn } = useInsforge();\r\n return { signIn, signUp, signOut, isLoaded, isSignedIn };\r\n}\r\n\r\n","import { useInsforge } from '../provider/InsforgeProvider';\r\n\r\n/**\r\n * Hook to access current user data\r\n * \r\n * @returns Object containing:\r\n * - `user`: Current user object (InsforgeUser | null)\r\n * - `isLoaded`: Boolean indicating if auth state has been loaded\r\n * - `updateUser`: Function to update user profile data\r\n * - `setUser`: Internal function to manually set user state\r\n * \r\n * @example\r\n * ```tsx\r\n * function UserProfile() {\r\n * const { user, isLoaded, updateUser } = useUser();\r\n * \r\n * if (!isLoaded) return <div>Loading...</div>;\r\n * if (!user) return <div>Not signed in</div>;\r\n * \r\n * async function handleUpdate(name: string) {\r\n * await updateUser({ name });\r\n * }\r\n * \r\n * return (\r\n * <div>\r\n * <p>Email: {user.email}</p>\r\n * {user.name && <p>Name: {user.name}</p>}\r\n * {user.avatarUrl && <img src={user.avatarUrl} alt=\"Avatar\" />}\r\n * </div>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function useUser() {\r\n const { user, isLoaded, updateUser, setUser } = useInsforge();\r\n return { user, isLoaded, updateUser, setUser };\r\n}\r\n\r\n","import { z } from 'zod';\r\n\r\n/**\r\n * Email validation schema\r\n */\r\nexport const emailSchema = z\r\n .string()\r\n .min(1, 'Email is required')\r\n .email('Invalid email address');\r\n\r\n/**\r\n * Password validation schema with configurable requirements\r\n */\r\nexport function createPasswordSchema(options?: {\r\n minLength?: number;\r\n requireUppercase?: boolean;\r\n requireLowercase?: boolean;\r\n requireNumber?: boolean;\r\n requireSpecialChar?: boolean;\r\n}) {\r\n const {\r\n minLength = 6,\r\n requireUppercase = false,\r\n requireLowercase = false,\r\n requireNumber = false,\r\n requireSpecialChar = false,\r\n } = options || {};\r\n\r\n let schema = z.string().min(minLength, `Password must be at least ${minLength} characters`);\r\n\r\n if (requireUppercase) {\r\n schema = schema.regex(/[A-Z]/, 'Password must contain at least one uppercase letter');\r\n }\r\n\r\n if (requireLowercase) {\r\n schema = schema.regex(/[a-z]/, 'Password must contain at least one lowercase letter');\r\n }\r\n\r\n if (requireNumber) {\r\n schema = schema.regex(/\\d/, 'Password must contain at least one number');\r\n }\r\n\r\n if (requireSpecialChar) {\r\n schema = schema.regex(\r\n /[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/,\r\n 'Password must contain at least one special character'\r\n );\r\n }\r\n\r\n return schema;\r\n}\r\n\r\n/**\r\n * Default password schema (minimum 6 characters)\r\n */\r\nexport const passwordSchema = createPasswordSchema();\r\n\r\n/**\r\n * Validate email format\r\n */\r\nexport function validateEmail(email: string): { valid: boolean; error?: string } {\r\n const result = emailSchema.safeParse(email);\r\n if (result.success) {\r\n return { valid: true };\r\n }\r\n return { valid: false, error: result.error.message };\r\n}\r\n\r\n/**\r\n * Validate password format\r\n */\r\nexport function validatePassword(\r\n password: string,\r\n options?: Parameters<typeof createPasswordSchema>[0]\r\n): { valid: boolean; error?: string } {\r\n const schema = createPasswordSchema(options);\r\n const result = schema.safeParse(password);\r\n if (result.success) {\r\n return { valid: true };\r\n }\r\n return { valid: false, error: result.error.message };\r\n}\r\n\r\n/**\r\n * Validate password strength based on multiple criteria\r\n */\r\nexport function checkPasswordStrength(password: string): {\r\n score: number;\r\n feedback: string[];\r\n} {\r\n const feedback: string[] = [];\r\n let score = 0;\r\n\r\n if (password.length >= 8) {\r\n score += 1;\r\n } else {\r\n feedback.push('Use at least 8 characters');\r\n }\r\n\r\n if (password.length >= 12) {\r\n score += 1;\r\n }\r\n\r\n if (/[a-z]/.test(password) && /[A-Z]/.test(password)) {\r\n score += 1;\r\n } else {\r\n feedback.push('Use both uppercase and lowercase letters');\r\n }\r\n\r\n if (/\\d/.test(password)) {\r\n score += 1;\r\n } else {\r\n feedback.push('Include at least one number');\r\n }\r\n\r\n if (/[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/.test(password)) {\r\n score += 1;\r\n } else {\r\n feedback.push('Include at least one special character');\r\n }\r\n\r\n return { score, feedback };\r\n}\r\n\r\n","'use client';\r\n\r\nimport { useEffect } from 'react';\r\nimport type { RouteObject } from 'react-router-dom';\r\n\r\ninterface GetInsforgeRoutesConfig {\r\n /**\r\n * Base URL of your Insforge backend\r\n */\r\n baseUrl: string;\r\n \r\n /**\r\n * Whether to use built-in auth (deployed Insforge Auth)\r\n * When true: redirects to baseUrl/auth/* pages\r\n * When false: no redirect routes are added (use your own components)\r\n * @default true\r\n */\r\n builtInAuth?: boolean;\r\n \r\n /**\r\n * Custom paths for auth redirect routes\r\n * @default {\r\n * signIn: '/sign-in',\r\n * signUp: '/sign-up',\r\n * verifyEmail: '/verify-email',\r\n * forgotPassword: '/forgot-password',\r\n * resetPassword: '/reset-password'\r\n * }\r\n */\r\n paths?: {\r\n signIn?: string;\r\n signUp?: string;\r\n verifyEmail?: string;\r\n forgotPassword?: string;\r\n resetPassword?: string;\r\n };\r\n}\r\n\r\n/**\r\n * Helper component for redirecting to external auth\r\n */\r\nfunction RedirectToAuth({ baseUrl, path }: { baseUrl: string; path: string }) {\r\n useEffect(() => {\r\n const callbackUrl = `${window.location.origin}/auth/callback`;\r\n const authUrl = new URL(path, baseUrl);\r\n authUrl.searchParams.set('redirect', callbackUrl);\r\n window.location.replace(authUrl.toString());\r\n }, [baseUrl, path]);\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Generates Insforge authentication redirect routes for React Router.\r\n * \r\n * Returns redirect routes for sign-in, sign-up, etc. that redirect to your deployed Insforge auth pages.\r\n * \r\n * ⚠️ **Important**: You must manually create the `/auth/callback` route in your router\r\n * to handle authentication callbacks. See documentation for details.\r\n * \r\n * @param config - Configuration for Insforge routes\r\n * @returns Array of RouteObject for React Router (redirect routes only)\r\n * \r\n * @example\r\n * ```tsx\r\n * import { createBrowserRouter } from 'react-router-dom';\r\n * import { getInsforgeRoutes } from '@insforge/react/router';\r\n * import { InsforgeCallback } from '@insforge/react';\r\n * \r\n * const router = createBrowserRouter([\r\n * {\r\n * path: '/',\r\n * element: <Layout />,\r\n * children: [\r\n * { index: true, element: <Home /> },\r\n * // ✅ Required: Manually create callback route\r\n * { path: 'auth/callback', element: <AuthCallback /> },\r\n * { path: 'dashboard', element: <Dashboard /> }\r\n * ]\r\n * },\r\n * // Add redirect routes (sign-in, sign-up, etc.)\r\n * ...getInsforgeRoutes({\r\n * baseUrl: 'https://your-backend.com',\r\n * builtInAuth: true\r\n * })\r\n * ]);\r\n * \r\n * // src/pages/AuthCallback.tsx\r\n * function AuthCallback() {\r\n * return <InsforgeCallback redirectTo=\"/dashboard\" />;\r\n * }\r\n * ```\r\n * \r\n * @example\r\n * ```tsx\r\n * // Custom paths for redirect routes\r\n * ...getInsforgeRoutes({\r\n * baseUrl: 'https://your-backend.com',\r\n * builtInAuth: true,\r\n * paths: {\r\n * signIn: '/login',\r\n * signUp: '/register'\r\n * }\r\n * })\r\n * ```\r\n */\r\nexport function getInsforgeRoutes(config: GetInsforgeRoutesConfig): RouteObject[] {\r\n const {\r\n baseUrl,\r\n builtInAuth = true,\r\n paths = {},\r\n } = config;\r\n\r\n const {\r\n signIn = '/sign-in',\r\n signUp = '/sign-up',\r\n verifyEmail = '/verify-email',\r\n forgotPassword = '/forgot-password',\r\n resetPassword = '/reset-password',\r\n } = paths;\r\n\r\n const routes: RouteObject[] = [];\r\n\r\n // Only add redirect routes if using built-in auth\r\n if (builtInAuth) {\r\n routes.push(\r\n {\r\n path: signIn,\r\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/sign-in\" />,\r\n },\r\n {\r\n path: signUp,\r\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/sign-up\" />,\r\n },\r\n {\r\n path: verifyEmail,\r\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/verify-email\" />,\r\n },\r\n {\r\n path: forgotPassword,\r\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/forgot-password\" />,\r\n },\r\n {\r\n path: resetPassword,\r\n element: <RedirectToAuth baseUrl={baseUrl} path=\"/auth/reset-password\" />,\r\n }\r\n );\r\n }\r\n\r\n return routes;\r\n}\r\n\r\n"]}