@thetechfossil/auth2 1.2.9 → 1.2.10
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.
- package/dist/index.components.js +2 -1
- package/dist/index.components.js.map +1 -1
- package/dist/index.components.mjs +2 -1
- package/dist/index.components.mjs.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -1
- package/dist/index.mjs.map +1 -1
- package/dist/index.next.js +2 -1
- package/dist/index.next.js.map +1 -1
- package/dist/index.next.mjs +2 -1
- package/dist/index.next.mjs.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/components/LoginForm.tsx","../src/react/use-auth.ts","../src/core/http-client.ts","../src/core/auth-service.ts","../src/react/ThemeContext.tsx","../src/react/hooks/useThemeColors.ts","../src/react/components/PhoneInput.tsx","../src/react/components/RegisterForm.tsx","../src/react/components/OtpForm.tsx","../src/react/components/AuthFlow.tsx","../src/react/components/EmailVerificationPage.tsx","../src/react/components/SignIn.tsx","../src/react/AuthProvider.tsx","../src/react/components/ThemeWrapper.tsx","../src/react/components/SignUp.tsx","../src/react/components/SignOut.tsx","../src/react/components/UserButton.tsx","../src/react/components/ProtectedRoute.tsx","../src/react/components/PublicRoute.tsx","../src/react/components/VerifyEmail.tsx","../src/react/components/ForgotPassword.tsx","../src/react/components/ResetPassword.tsx","../src/react/components/ChangePassword.tsx","../src/react/components/UserProfile.tsx","../src/react/components/AvatarUploader.tsx","../src/react/components/AvatarManager.tsx"],"names":["useState","useEffect","React","jsx","jsxs","email","createContext","useContext","useCallback","useAuth","colors","Fragment","error","ImageManager"],"mappings":"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","sourcesContent":["'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../use-auth';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\nimport { PhoneInput } from './PhoneInput';\r\n\r\ninterface LoginFormProps {\r\n onSuccess?: (response: { message: string; email?: string; token?: string; success: boolean; user?: any }) => void;\r\n onLoginSuccess?: (email: string, needsOtpVerification: boolean) => void; // For backward compatibility\r\n onRegisterClick?: () => void;\r\n showRegisterLink?: boolean;\r\n config?: {\r\n baseUrl?: string;\r\n };\r\n oauthProviders?: Array<'google' | 'github'>;\r\n showOAuthButtons?: boolean;\r\n}\r\n\r\nexport const LoginForm: React.FC<LoginFormProps> = ({\r\n onSuccess,\r\n onLoginSuccess,\r\n onRegisterClick,\r\n showRegisterLink = true,\r\n config,\r\n oauthProviders = ['google', 'github'],\r\n showOAuthButtons = true\r\n}) => {\r\n const colors = useThemeColors();\r\n const [email, setEmail] = useState('');\r\n const [phoneNumber, setPhoneNumber] = useState('');\r\n const [usePhone, setUsePhone] = useState(false);\r\n const [password, setPassword] = useState('');\r\n const [usePassword, setUsePassword] = useState(false);\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [rememberMe, setRememberMe] = useState(false);\r\n\r\n const { login } = useAuth({\r\n baseUrl: config?.baseUrl || 'http://localhost:7000'\r\n });\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n try {\r\n let response;\r\n const loginData: any = {};\r\n \r\n // Add email or phone number\r\n if (usePhone && phoneNumber) {\r\n loginData.phoneNumber = phoneNumber;\r\n } else if (email) {\r\n loginData.email = email;\r\n }\r\n \r\n if (usePassword) {\r\n // Traditional email/password or phone/password login\r\n loginData.password = password;\r\n response = await login(loginData);\r\n } else {\r\n // OTP-based login\r\n response = await login(loginData);\r\n }\r\n\r\n if (response.success) {\r\n // Call the new callback if provided\r\n onSuccess?.(response);\r\n\r\n // For backward compatibility, call the old callback if provided\r\n if (onLoginSuccess) {\r\n const identifier = usePhone ? phoneNumber : email;\r\n // Check if this is an OTP sent response or a successful login\r\n if (response.message === 'OTP sent to your email.' || response.message === 'OTP sent to your phone number.') {\r\n // OTP was sent, need to verify\r\n onLoginSuccess(identifier, true);\r\n } else if (response.token) {\r\n // Direct login successful (email/password)\r\n onLoginSuccess(identifier, false);\r\n } else {\r\n // Default to needing OTP verification for safety\r\n onLoginSuccess(identifier, true);\r\n }\r\n }\r\n } else {\r\n setError(response.message || 'Login failed');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An unknown error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const toggleAuthMethod = () => {\r\n setUsePassword(!usePassword);\r\n setError(null); // Clear error when switching methods\r\n };\r\n\r\n const togglePasswordVisibility = () => {\r\n setShowPassword(!showPassword);\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '24px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <form onSubmit={handleSubmit} style={{\r\n display: 'flex',\r\n flexDirection: 'column'\r\n }}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '20px',\r\n color: colors.textPrimary,\r\n fontSize: '24px',\r\n fontWeight: 600\r\n }}>{usePassword ? 'Login with Password' : 'Login with OTP'}</h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '16px',\r\n backgroundColor: colors.errorBg,\r\n color: colors.errorText,\r\n border: `1px solid ${colors.errorBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div style={{\r\n marginBottom: '16px'\r\n }}>\r\n <label htmlFor={usePhone ? \"phone\" : \"email\"} style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>{usePhone ? 'Phone Number:' : 'Email:'}</label>\r\n {usePhone ? (\r\n <PhoneInput\r\n id=\"phone\"\r\n value={phoneNumber}\r\n onChange={setPhoneNumber}\r\n required\r\n disabled={isLoading}\r\n placeholder=\"1234567890\"\r\n />\r\n ) : (\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary\r\n }}\r\n placeholder=\"Enter your email\"\r\n />\r\n )}\r\n <button\r\n type=\"button\"\r\n onClick={() => setUsePhone(!usePhone)}\r\n disabled={isLoading}\r\n style={{\r\n marginTop: '8px',\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n fontSize: '13px',\r\n fontWeight: 500,\r\n padding: '0',\r\n transition: 'color 0.2s ease'\r\n }}\r\n >\r\n {usePhone ? 'Use email instead' : 'Use phone number instead'}\r\n </button>\r\n </div>\r\n\r\n {usePassword && (\r\n <div style={{\r\n marginBottom: '16px',\r\n position: 'relative'\r\n }}>\r\n <label htmlFor=\"login-password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Password:</label>\r\n <input\r\n id=\"login-password\"\r\n type={showPassword ? \"text\" : \"password\"}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary\r\n }}\r\n placeholder=\"Enter your password\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={togglePasswordVisibility}\r\n disabled={isLoading}\r\n style={{\r\n position: 'absolute',\r\n right: '12px',\r\n top: '38px',\r\n background: 'none',\r\n border: 'none',\r\n cursor: 'pointer',\r\n color: colors.textTertiary,\r\n fontSize: '14px'\r\n }}\r\n >\r\n {showPassword ? 'Hide' : 'Show'}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {usePassword && (\r\n <div style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n marginBottom: '12px',\r\n marginTop: '4px'\r\n }}>\r\n <input\r\n type=\"checkbox\"\r\n id=\"remember-me\"\r\n checked={rememberMe}\r\n onChange={(e) => setRememberMe(e.target.checked)}\r\n disabled={isLoading}\r\n style={{\r\n marginRight: '8px',\r\n cursor: 'pointer',\r\n width: '16px',\r\n height: '16px'\r\n }}\r\n />\r\n <label\r\n htmlFor=\"remember-me\"\r\n style={{\r\n fontSize: '14px',\r\n color: colors.textSecondary,\r\n cursor: 'pointer',\r\n userSelect: 'none'\r\n }}\r\n >\r\n Remember me\r\n </label>\r\n </div>\r\n )}\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n padding: '14px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n marginTop: '4px'\r\n }}\r\n >\r\n {isLoading ? (usePassword ? 'Logging in...' : 'Sending OTP...') : (usePassword ? 'Login' : 'Send OTP')}\r\n </button>\r\n\r\n <div style={{\r\n textAlign: 'center',\r\n marginTop: '16px',\r\n paddingTop: '16px',\r\n borderTop: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <button\r\n type=\"button\"\r\n onClick={toggleAuthMethod}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n transition: 'color 0.2s ease'\r\n }}\r\n >\r\n {usePassword ? 'Login with OTP instead' : 'Login with password instead'}\r\n </button>\r\n </div>\r\n\r\n {showOAuthButtons && oauthProviders.length > 0 && (\r\n <div style={{\r\n marginTop: '16px',\r\n paddingTop: '16px',\r\n borderTop: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <div style={{\r\n position: 'relative',\r\n marginBottom: '16px'\r\n }}>\r\n <div style={{\r\n position: 'absolute',\r\n top: '50%',\r\n left: 0,\r\n right: 0,\r\n height: '1px',\r\n backgroundColor: colors.borderPrimary\r\n }} />\r\n <div style={{\r\n position: 'relative',\r\n textAlign: 'center'\r\n }}>\r\n <span style={{\r\n backgroundColor: colors.bgPrimary,\r\n padding: '0 12px',\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Or continue with</span>\r\n </div>\r\n </div>\r\n\r\n <div style={{\r\n display: 'grid',\r\n gridTemplateColumns: oauthProviders.length === 1 ? '1fr' : 'repeat(2, 1fr)',\r\n gap: '12px'\r\n }}>\r\n {oauthProviders.includes('google') && (\r\n <a\r\n href={`${config?.baseUrl || 'http://localhost:7000'}/api/v1/auth/oauth/google`}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '8px',\r\n padding: '10px 16px',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n color: colors.textPrimary,\r\n textDecoration: 'none',\r\n fontSize: '14px',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.bgHover;\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.bgPrimary;\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n }}\r\n >\r\n <svg style={{ width: '18px', height: '18px' }} viewBox=\"0 0 24 24\">\r\n <path\r\n fill=\"#4285F4\"\r\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\r\n />\r\n <path\r\n fill=\"#34A853\"\r\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\r\n />\r\n <path\r\n fill=\"#FBBC05\"\r\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\r\n />\r\n <path\r\n fill=\"#EA4335\"\r\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\r\n />\r\n </svg>\r\n Google\r\n </a>\r\n )}\r\n\r\n {oauthProviders.includes('github') && (\r\n <a\r\n href={`${config?.baseUrl || 'http://localhost:7000'}/api/v1/auth/oauth/github`}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '8px',\r\n padding: '10px 16px',\r\n backgroundColor: '#24292e',\r\n border: '1px solid #24292e',\r\n borderRadius: '8px',\r\n color: '#ffffff',\r\n textDecoration: 'none',\r\n fontSize: '14px',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = '#1b1f23';\r\n e.currentTarget.style.borderColor = '#1b1f23';\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = '#24292e';\r\n e.currentTarget.style.borderColor = '#24292e';\r\n }}\r\n >\r\n <svg style={{ width: '18px', height: '18px' }} fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\r\n </svg>\r\n GitHub\r\n </a>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {showRegisterLink && (\r\n <div style={{\r\n textAlign: 'center',\r\n marginTop: '16px',\r\n paddingTop: '16px',\r\n borderTop: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <p style={{\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>\r\n Don't have an account?{' '}\r\n <button\r\n type=\"button\"\r\n onClick={onRegisterClick}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n transition: 'color 0.2s ease'\r\n }}\r\n >\r\n Register\r\n </button>\r\n </p>\r\n </div>\r\n )}\r\n </form>\r\n </div>\r\n );\r\n};","import { useState, useEffect, useCallback } from 'react';\r\nimport { AuthService } from '../core/auth-service';\r\nimport { \r\n AuthResponse, \r\n LoginData, \r\n VerifyData, \r\n UpdateUserData, \r\n User,\r\n AuthConfig,\r\n RegisterData\r\n} from '../types';\r\n\r\ninterface UseAuthReturnBase {\r\n user: User | null;\r\n isAuthenticated: boolean;\r\n loading: boolean;\r\n register: (data: RegisterData) => Promise<AuthResponse>;\r\n login: (data: LoginData) => Promise<AuthResponse>;\r\n verify: (data: VerifyData) => Promise<AuthResponse>;\r\n verifyEmailToken: (token: string) => Promise<AuthResponse>;\r\n logout: () => Promise<void>;\r\n updateProfile: (data: UpdateUserData) => Promise<AuthResponse>;\r\n getProfile: () => Promise<User>;\r\n getAllUsers: () => Promise<User[]>;\r\n getUserById: (id: string) => Promise<User>;\r\n uploadAndUpdateAvatar: (file: File) => Promise<AuthResponse>;\r\n}\r\n\r\nexport const useAuth = (config: AuthConfig): UseAuthReturnBase => {\r\n const [authService] = useState<AuthService>(() => new AuthService(config));\r\n const [user, setUser] = useState<User | null>(null);\r\n const [isAuthenticated, setIsAuthenticated] = useState<boolean>(false);\r\n const [loading, setLoading] = useState<boolean>(true);\r\n\r\n const checkAuthStatus = useCallback(() => {\r\n const authenticated = authService.isAuthenticated();\r\n setIsAuthenticated(authenticated);\r\n \r\n if (authenticated) {\r\n const currentUser = authService.getCurrentUser();\r\n setUser(currentUser);\r\n } else {\r\n setUser(null);\r\n }\r\n \r\n setLoading(false);\r\n }, [authService]);\r\n\r\n useEffect(() => {\r\n checkAuthStatus();\r\n }, [checkAuthStatus]);\r\n\r\n const register = useCallback(async (data: RegisterData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await authService.register(data);\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const login = useCallback(async (data: LoginData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.login(data);\r\n // Update user state if login was successful and we have a user\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n setIsAuthenticated(true);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verify = useCallback(async (data: VerifyData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verify(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n setIsAuthenticated(true);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verifyEmailToken = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verifyEmailToken(token);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n setIsAuthenticated(true);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const logout = useCallback(async (): Promise<void> => {\r\n setLoading(true);\r\n try {\r\n await authService.logout();\r\n setUser(null);\r\n setIsAuthenticated(false);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const updateProfile = useCallback(async (data: UpdateUserData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.updateProfile(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getProfile = useCallback(async (): Promise<User> => {\r\n setLoading(true);\r\n try {\r\n const userData = await authService.getProfile();\r\n setUser(userData);\r\n return userData;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getAllUsers = useCallback(async (): Promise<User[]> => {\r\n setLoading(true);\r\n try {\r\n return await authService.getAllUsers();\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getUserById = useCallback(async (id: string): Promise<User> => {\r\n setLoading(true);\r\n try {\r\n return await authService.getUserById(id);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const uploadAndUpdateAvatar = useCallback(async (file: File): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.uploadAndUpdateAvatar(file);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n return {\r\n user,\r\n isAuthenticated,\r\n loading,\r\n register,\r\n login,\r\n verify,\r\n verifyEmailToken,\r\n logout,\r\n updateProfile,\r\n getProfile,\r\n getAllUsers,\r\n getUserById,\r\n uploadAndUpdateAvatar\r\n };\r\n};","import axios, { AxiosInstance, AxiosRequestConfig, AxiosError } from 'axios';\r\n\r\nexport class HttpClient {\r\n private axiosInstance: AxiosInstance;\r\n private csrfToken: string | null = null;\r\n private frontendBaseUrl: string | null = null;\r\n private baseUrl: string;\r\n\r\n constructor(baseUrl: string, defaultHeaders: Record<string, string> = {}) {\r\n this.baseUrl = baseUrl.replace(/\\/$/, '');\r\n\r\n this.axiosInstance = axios.create({\r\n baseURL: this.baseUrl,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...defaultHeaders\r\n },\r\n withCredentials: true, // Include cookies for CSRF\r\n timeout: 30000 // 30 second timeout\r\n });\r\n\r\n // Request interceptor to add CSRF token and frontend URL\r\n this.axiosInstance.interceptors.request.use(\r\n async (config) => {\r\n // Fetch CSRF token lazily on first mutating request (only on client side)\r\n const isMutatingRequest = ['post', 'put', 'delete', 'patch'].includes(config.method?.toLowerCase() || '');\r\n if (isMutatingRequest && !this.csrfToken && typeof window !== 'undefined') {\r\n try {\r\n await this.refreshCsrfToken();\r\n } catch (error) {\r\n console.warn('Failed to fetch CSRF token:', error);\r\n }\r\n }\r\n\r\n // Add CSRF token to mutating requests\r\n if (this.csrfToken && isMutatingRequest) {\r\n config.headers['x-csrf-token'] = this.csrfToken;\r\n }\r\n\r\n // Add frontend base URL header if available\r\n if (this.frontendBaseUrl) {\r\n config.headers['X-Frontend-URL'] = this.frontendBaseUrl;\r\n }\r\n\r\n return config;\r\n },\r\n (error) => Promise.reject(error)\r\n );\r\n\r\n // Response interceptor for error handling and CSRF token refresh\r\n this.axiosInstance.interceptors.response.use(\r\n (response) => response,\r\n async (error: AxiosError) => {\r\n const originalRequest = error.config as AxiosRequestConfig & { _retry?: boolean };\r\n\r\n // Handle CSRF token refresh on 403\r\n if (error.response?.status === 403 && !originalRequest._retry) {\r\n originalRequest._retry = true;\r\n\r\n try {\r\n await this.refreshCsrfToken();\r\n if (originalRequest.headers) {\r\n originalRequest.headers['x-csrf-token'] = this.csrfToken!;\r\n }\r\n return this.axiosInstance(originalRequest);\r\n } catch (refreshError) {\r\n return Promise.reject(refreshError);\r\n }\r\n }\r\n\r\n return Promise.reject(error);\r\n }\r\n );\r\n }\r\n\r\n public async get<T>(endpoint: string, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.get<T>(endpoint, { headers });\r\n return response.data;\r\n }\r\n\r\n public async post<T>(endpoint: string, data?: any, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.post<T>(endpoint, data, { headers });\r\n return response.data;\r\n }\r\n\r\n public async put<T>(endpoint: string, data?: any, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.put<T>(endpoint, data, { headers });\r\n return response.data;\r\n }\r\n\r\n public async delete<T>(endpoint: string, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.delete<T>(endpoint, { headers });\r\n return response.data;\r\n }\r\n\r\n public setAuthToken(token: string): void {\r\n this.axiosInstance.defaults.headers.common['Authorization'] = `Bearer ${token}`;\r\n }\r\n\r\n public removeAuthToken(): void {\r\n delete this.axiosInstance.defaults.headers.common['Authorization'];\r\n }\r\n\r\n public setCsrfToken(token: string): void {\r\n this.csrfToken = token;\r\n }\r\n\r\n public getCsrfToken(): string | null {\r\n return this.csrfToken;\r\n }\r\n\r\n public removeCsrfToken(): void {\r\n this.csrfToken = null;\r\n }\r\n\r\n public setFrontendBaseUrl(url: string): void {\r\n this.frontendBaseUrl = url;\r\n }\r\n\r\n public getFrontendBaseUrl(): string | null {\r\n return this.frontendBaseUrl;\r\n }\r\n\r\n public removeFrontendBaseUrl(): void {\r\n this.frontendBaseUrl = null;\r\n }\r\n\r\n private async refreshCsrfToken(): Promise<void> {\r\n try {\r\n const response = await this.axiosInstance.get<{ csrfToken: string }>('/api/v1/auth/csrf-token');\r\n this.csrfToken = response.data.csrfToken;\r\n } catch (error) {\r\n console.error('Failed to refresh CSRF token:', error);\r\n throw error;\r\n }\r\n }\r\n}","import { HttpClient } from './http-client';\r\nimport {\r\n AuthResponse,\r\n LoginData,\r\n VerifyData,\r\n UpdateUserData,\r\n User,\r\n AuthConfig,\r\n RegisterData,\r\n OAuthProvider,\r\n CsrfTokenResponse\r\n} from '../types';\r\nimport { UpfilesClient } from '@thetechfossil/upfiles';\r\n\r\nexport class AuthService {\r\n private httpClient: HttpClient;\r\n private config: AuthConfig;\r\n private token: string | null = null;\r\n private upfilesClient: UpfilesClient | null = null;\r\n\r\n constructor(config: AuthConfig) {\r\n this.config = {\r\n localStorageKey: 'auth_token',\r\n csrfEnabled: true,\r\n ...config\r\n };\r\n\r\n this.httpClient = new HttpClient(this.config.baseUrl);\r\n this.loadTokenFromStorage();\r\n\r\n // Initialize upfiles client if config is provided\r\n if (this.config.upfilesConfig) {\r\n this.upfilesClient = new UpfilesClient({\r\n baseUrl: this.config.upfilesConfig.baseUrl,\r\n apiKey: this.config.upfilesConfig.apiKey,\r\n apiKeyHeader: this.config.upfilesConfig.apiKeyHeader,\r\n presignUrl: this.config.upfilesConfig.presignUrl,\r\n presignPath: this.config.upfilesConfig.presignPath,\r\n });\r\n }\r\n\r\n // Set frontend base URL if available\r\n if (typeof window !== 'undefined') {\r\n const frontendBaseUrl = \r\n process.env.NEXT_PUBLIC_FRONTEND_BASE_URL ||\r\n process.env.REACT_APP_FRONTEND_BASE_URL ||\r\n process.env.NEXT_PUBLIC_APP_URL ||\r\n window.location.origin;\r\n \r\n if (frontendBaseUrl) {\r\n this.httpClient.setFrontendBaseUrl(frontendBaseUrl);\r\n }\r\n }\r\n\r\n // CSRF token will be fetched lazily on first mutating request\r\n // This prevents SSR issues and ensures proper initialization\r\n }\r\n\r\n private loadTokenFromStorage(): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n const token = localStorage.getItem(this.config.localStorageKey);\r\n if (token) {\r\n this.token = token;\r\n this.httpClient.setAuthToken(token);\r\n }\r\n } catch (error) {\r\n console.warn('Failed to load token from storage:', error);\r\n }\r\n }\r\n }\r\n\r\n private saveTokenToStorage(token: string): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n localStorage.setItem(this.config.localStorageKey, token);\r\n } catch (error) {\r\n console.warn('Failed to save token to storage:', error);\r\n }\r\n }\r\n }\r\n\r\n private removeTokenFromStorage(): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n localStorage.removeItem(this.config.localStorageKey);\r\n } catch (error) {\r\n console.warn('Failed to remove token from storage:', error);\r\n }\r\n }\r\n }\r\n\r\n public isAuthenticated(): boolean {\r\n return !!this.token;\r\n }\r\n\r\n public getToken(): string | null {\r\n return this.token;\r\n }\r\n\r\n public getCurrentUser(): User | null {\r\n if (!this.token) return null;\r\n\r\n try {\r\n const payload = JSON.parse(atob(this.token.split('.')[1]));\r\n return payload.user || null;\r\n } catch (error) {\r\n console.error('Failed to parse user from token:', error);\r\n return null;\r\n }\r\n }\r\n\r\n // CSRF Token Management\r\n public async refreshCsrfToken(): Promise<void> {\r\n if (!this.config.csrfEnabled) return;\r\n\r\n try {\r\n const response = await this.httpClient.get<CsrfTokenResponse>('/api/v1/auth/csrf-token');\r\n if (response.csrfToken) {\r\n this.httpClient.setCsrfToken(response.csrfToken);\r\n }\r\n } catch (error) {\r\n console.error('Failed to get CSRF token:', error);\r\n }\r\n }\r\n\r\n public getCsrfToken(): string | null {\r\n return this.httpClient.getCsrfToken();\r\n }\r\n\r\n // OAuth Methods\r\n public loginWithOAuth(provider: OAuthProvider): void {\r\n if (typeof window === 'undefined') {\r\n throw new Error('OAuth login is only available in browser environments');\r\n }\r\n\r\n const oauthUrl = `${this.config.baseUrl}/api/v1/auth/oauth/${provider}`;\r\n window.location.href = oauthUrl;\r\n }\r\n\r\n public linkOAuthProvider(provider: OAuthProvider): void {\r\n if (typeof window === 'undefined') {\r\n throw new Error('OAuth linking is only available in browser environments');\r\n }\r\n\r\n if (!this.token) {\r\n throw new Error('Must be authenticated to link OAuth provider');\r\n }\r\n\r\n const linkUrl = `${this.config.baseUrl}/api/v1/auth/oauth/${provider}/link`;\r\n window.location.href = linkUrl;\r\n }\r\n\r\n public async unlinkOAuthProvider(provider: OAuthProvider): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>(\r\n `/api/v1/auth/oauth/${provider}/unlink`\r\n );\r\n return response;\r\n }\r\n\r\n // Standard Auth Methods\r\n public async login(data: LoginData): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/login', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n return response;\r\n }\r\n\r\n if (response.success && (response.message === 'OTP sent to your email.' || response.message === 'OTP sent to your phone number.')) {\r\n return response;\r\n }\r\n\r\n if (response.success && response.message === 'OTP verified successfully.' && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n return response;\r\n }\r\n\r\n throw new Error(response.message || 'Login failed');\r\n }\r\n\r\n public async register(data: RegisterData): Promise<AuthResponse> {\r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/register', data);\r\n\r\n if (response.success && response.message === 'Registration data saved. Verification email sent. Please check your inbox.') {\r\n return response;\r\n }\r\n\r\n throw new Error(response.message || 'Registration failed');\r\n }\r\n\r\n public async verify(data: VerifyData): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/verify', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async verifyEmailToken(token: string): Promise<AuthResponse> {\r\n try {\r\n const response = await this.httpClient.get<AuthResponse>(`/api/v1/auth/verify-email?token=${token}`);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n } catch (error: any) {\r\n // Handle axios error response\r\n if (error.response?.data) {\r\n return {\r\n success: false,\r\n message: error.response.data.message || 'Email verification failed',\r\n };\r\n }\r\n \r\n // Handle network or other errors\r\n return {\r\n success: false,\r\n message: error.message || 'Network error occurred',\r\n };\r\n }\r\n }\r\n\r\n public async logout(): Promise<void> {\r\n // Call backend to clear cookie\r\n try {\r\n await this.httpClient.post('/api/v1/auth/logout', {});\r\n } catch (error) {\r\n console.warn('Failed to call logout endpoint:', error);\r\n }\r\n\r\n this.token = null;\r\n this.httpClient.removeAuthToken();\r\n this.httpClient.removeCsrfToken();\r\n this.removeTokenFromStorage();\r\n }\r\n\r\n public async getProfile(): Promise<User> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ user: User }>('/api/v1/user/me');\r\n return response.user;\r\n }\r\n\r\n public async updateProfile(data: UpdateUserData): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/update/profile', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async getAllUsers(): Promise<User[]> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ users: User[] }>('/api/v1/user/all');\r\n return response.users;\r\n }\r\n\r\n public async getUserById(id: string): Promise<User> {\r\n const response = await this.httpClient.get<{ user: User }>(`/api/v1/user/${id}`);\r\n return response.user;\r\n }\r\n\r\n public async forgotPassword(email: string): Promise<AuthResponse> {\r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/forgot-password', { email });\r\n return response;\r\n }\r\n\r\n public async resetPassword(token: string, password: string): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/reset-password', { token, password });\r\n return response;\r\n }\r\n\r\n public async changePassword(oldPassword: string, newPassword: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/change-password', { \r\n oldPassword, \r\n newPassword \r\n });\r\n return response;\r\n }\r\n\r\n public async updateAvatar(avatar: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/update/profile', { avatar });\r\n \r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async uploadAndUpdateAvatar(file: File): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n if (!this.upfilesClient) {\r\n throw new Error('Upfiles configuration is required. Please provide upfilesConfig in AuthConfig.');\r\n }\r\n\r\n try {\r\n // Upload file using upfiles SDK\r\n const folderPath = this.config.upfilesConfig?.folderPath || 'avatars/';\r\n const uploadResult = await this.upfilesClient.upload(file, {\r\n folderPath,\r\n fetchThumbnails: true,\r\n });\r\n\r\n // Update user avatar with the uploaded file URL\r\n const response = await this.updateAvatar(uploadResult.publicUrl);\r\n \r\n return response;\r\n } catch (error: any) {\r\n throw new Error(`Failed to upload avatar: ${error.message || 'Unknown error'}`);\r\n }\r\n }\r\n\r\n public getUpfilesClient(): UpfilesClient | null {\r\n return this.upfilesClient;\r\n }\r\n\r\n public async requestEmailChange(newEmail: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/request-email-change', { \r\n newEmail \r\n });\r\n return response;\r\n }\r\n\r\n public async verifyEmailChange(token: string): Promise<AuthResponse> {\r\n const response = await this.httpClient.get<AuthResponse>(`/api/v1/user/verify-email-change?token=${token}`);\r\n \r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n // 2FA / MFA Methods\r\n public async generate2FA(): Promise<{ success: boolean; qrCode?: string; secret?: string; message: string }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<{ success: boolean; qrCode?: string; secret?: string; message: string }>(\r\n '/api/v1/mfa/generate', \r\n {}\r\n );\r\n return response;\r\n }\r\n\r\n public async enable2FA(token: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/mfa/enable', { token });\r\n return response;\r\n }\r\n\r\n public async disable2FA(token: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/mfa/disable', { token });\r\n return response;\r\n }\r\n\r\n public async validate2FA(token: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/mfa/validate', { token });\r\n return response;\r\n }\r\n\r\n // Session Management Methods\r\n public async getSessions(): Promise<{ success: boolean; sessions: any[] }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ success: boolean; sessions: any[] }>('/api/v1/sessions');\r\n return response;\r\n }\r\n\r\n public async revokeSession(sessionId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>(`/api/v1/sessions/${sessionId}`);\r\n return response;\r\n }\r\n\r\n public async revokeAllSessions(): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>('/api/v1/sessions/revoke/all');\r\n \r\n // After revoking all sessions, current session is also revoked\r\n this.token = null;\r\n this.httpClient.removeAuthToken();\r\n this.removeTokenFromStorage();\r\n \r\n return response;\r\n }\r\n\r\n // Admin Methods\r\n public async getAuditLogs(filters?: any): Promise<{ success: boolean; logs: any[] }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ success: boolean; logs: any[] }>(\r\n '/api/v1/admin/audit-logs',\r\n filters\r\n );\r\n return response;\r\n }\r\n\r\n public async adminVerifyUser(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/verify-user/${userId}`, {});\r\n return response;\r\n }\r\n\r\n public async adminForcePasswordReset(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/force-password-reset/${userId}`, {});\r\n return response;\r\n }\r\n\r\n public async adminSuspendUser(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/suspend-user/${userId}`, {});\r\n return response;\r\n }\r\n\r\n public async adminActivateUser(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/activate-user/${userId}`, {});\r\n return response;\r\n }\r\n}","'use client';\r\n\r\nimport React, { createContext, useContext, useEffect, useState, ReactNode } from 'react';\r\n\r\ntype Theme = 'light' | 'dark';\r\n\r\ninterface ThemeContextType {\r\n theme: Theme;\r\n mounted: boolean;\r\n}\r\n\r\nconst ThemeContext = createContext<ThemeContextType>({ theme: 'light', mounted: false });\r\n\r\nexport function AuthThemeProvider({ children }: { children: ReactNode }) {\r\n const [theme, setTheme] = useState<Theme>('light');\r\n const [mounted, setMounted] = useState(false);\r\n\r\n useEffect(() => {\r\n // Detect theme from parent app\r\n const detectTheme = () => {\r\n // Check if parent has theme class on html/body\r\n const htmlElement = document.documentElement;\r\n const bodyElement = document.body;\r\n \r\n if (htmlElement.classList.contains('dark') || bodyElement.classList.contains('dark')) {\r\n return 'dark';\r\n }\r\n \r\n if (htmlElement.classList.contains('light') || bodyElement.classList.contains('light')) {\r\n return 'light';\r\n }\r\n \r\n // Check data-theme attribute\r\n const dataTheme = htmlElement.getAttribute('data-theme') || bodyElement.getAttribute('data-theme');\r\n if (dataTheme === 'dark' || dataTheme === 'light') {\r\n return dataTheme as Theme;\r\n }\r\n \r\n // Check prefers-color-scheme\r\n if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\r\n return 'dark';\r\n }\r\n \r\n return 'light';\r\n };\r\n\r\n const updateTheme = () => {\r\n const detectedTheme = detectTheme();\r\n setTheme(detectedTheme);\r\n };\r\n\r\n // Initial detection\r\n updateTheme();\r\n setMounted(true);\r\n\r\n // Watch for theme changes using MutationObserver\r\n const observer = new MutationObserver(updateTheme);\r\n observer.observe(document.documentElement, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme']\r\n });\r\n observer.observe(document.body, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme']\r\n });\r\n\r\n // Watch for prefers-color-scheme changes\r\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\r\n const handleMediaChange = () => updateTheme();\r\n mediaQuery.addEventListener('change', handleMediaChange);\r\n\r\n return () => {\r\n observer.disconnect();\r\n mediaQuery.removeEventListener('change', handleMediaChange);\r\n };\r\n }, []);\r\n\r\n return (\r\n <ThemeContext.Provider value={{ theme, mounted }}>\r\n {children}\r\n </ThemeContext.Provider>\r\n );\r\n}\r\n\r\nexport function useAuthTheme() {\r\n return useContext(ThemeContext);\r\n}\r\n","'use client';\r\n\r\nimport { useAuthTheme } from '../ThemeContext';\r\n\r\ninterface ThemeColors {\r\n bgPrimary: string;\r\n bgSecondary: string;\r\n bgHover: string;\r\n textPrimary: string;\r\n textSecondary: string;\r\n textTertiary: string;\r\n borderPrimary: string;\r\n borderSecondary: string;\r\n buttonPrimary: string;\r\n buttonPrimaryHover: string;\r\n errorBg: string;\r\n errorText: string;\r\n errorBorder: string;\r\n successBg: string;\r\n successText: string;\r\n successBorder: string;\r\n}\r\n\r\nconst lightTheme: ThemeColors = {\r\n bgPrimary: 'var(--auth-bg-primary, #ffffff)',\r\n bgSecondary: 'var(--auth-bg-secondary, #f8fafc)',\r\n bgHover: 'var(--auth-bg-hover, #f1f5f9)',\r\n textPrimary: 'var(--auth-text-primary, #0f172a)',\r\n textSecondary: 'var(--auth-text-secondary, #475569)',\r\n textTertiary: 'var(--auth-text-tertiary, #94a3b8)',\r\n borderPrimary: 'var(--auth-border-primary, #e2e8f0)',\r\n borderSecondary: 'var(--auth-border-secondary, #cbd5e1)',\r\n buttonPrimary: 'var(--auth-button-primary, #3b82f6)',\r\n buttonPrimaryHover: 'var(--auth-button-primary-hover, #2563eb)',\r\n errorBg: 'var(--auth-error-bg, #fef2f2)',\r\n errorText: 'var(--auth-error-text, #dc2626)',\r\n errorBorder: 'var(--auth-error-border, #fecaca)',\r\n successBg: 'var(--auth-success-bg, #f0fdf4)',\r\n successText: 'var(--auth-success-text, #16a34a)',\r\n successBorder: 'var(--auth-success-border, #bbf7d0)',\r\n};\r\n\r\nconst darkTheme: ThemeColors = {\r\n bgPrimary: 'var(--auth-bg-primary, #1f2937)',\r\n bgSecondary: 'var(--auth-bg-secondary, #111827)',\r\n bgHover: 'var(--auth-bg-hover, #374151)',\r\n textPrimary: 'var(--auth-text-primary, #f9fafb)',\r\n textSecondary: 'var(--auth-text-secondary, #e5e7eb)',\r\n textTertiary: 'var(--auth-text-tertiary, #d1d5db)',\r\n borderPrimary: 'var(--auth-border-primary, #374151)',\r\n borderSecondary: 'var(--auth-border-secondary, #4b5563)',\r\n buttonPrimary: 'var(--auth-button-primary, #3b82f6)',\r\n buttonPrimaryHover: 'var(--auth-button-primary-hover, #2563eb)',\r\n errorBg: 'var(--auth-error-bg, #7f1d1d)',\r\n errorText: 'var(--auth-error-text, #fecaca)',\r\n errorBorder: 'var(--auth-error-border, #991b1b)',\r\n successBg: 'var(--auth-success-bg, #14532d)',\r\n successText: 'var(--auth-success-text, #bbf7d0)',\r\n successBorder: 'var(--auth-success-border, #166534)',\r\n};\r\n\r\nexport function useThemeColors(): ThemeColors {\r\n const { theme } = useAuthTheme();\r\n return theme === 'dark' ? darkTheme : lightTheme;\r\n}\r\n","'use client';\r\n\r\nimport React, { useState, useEffect, useMemo } from 'react';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\n\r\n// Lazy load react-phone-number-input to avoid React 19 compatibility issues\r\nlet PhoneInputWithCountry: any = null;\r\ntry {\r\n const module = require('react-phone-number-input');\r\n PhoneInputWithCountry = module.default || module;\r\n require('react-phone-number-input/style.css');\r\n} catch (error) {\r\n console.warn('react-phone-number-input not available, using fallback');\r\n}\r\n\r\ninterface PhoneInputProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n disabled?: boolean;\r\n required?: boolean;\r\n placeholder?: string;\r\n id?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\n// Create the input component outside to prevent recreation on every render\r\nconst CustomPhoneInput = React.forwardRef<HTMLInputElement, any>((props, ref) => (\r\n <input\r\n {...props}\r\n ref={ref}\r\n className=\"PhoneInputInput\"\r\n />\r\n));\r\nCustomPhoneInput.displayName = 'CustomPhoneInput';\r\n\r\nexport const PhoneInput: React.FC<PhoneInputProps> = ({\r\n value,\r\n onChange,\r\n disabled = false,\r\n required = false,\r\n placeholder = 'Enter phone number',\r\n id = 'phone',\r\n style = {}\r\n}) => {\r\n const colors = useThemeColors();\r\n const [defaultCountry, setDefaultCountry] = useState<string>('US');\r\n \r\n // Memoize the styles to prevent recreation on every render\r\n const styleContent = useMemo(() => `\r\n .PhoneInput {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n }\r\n \r\n .PhoneInputCountry {\r\n position: relative;\r\n align-self: stretch;\r\n display: flex;\r\n align-items: center;\r\n padding: 0 8px;\r\n border: 1px solid ${colors.borderSecondary};\r\n border-radius: 8px;\r\n background-color: ${colors.bgSecondary};\r\n transition: all 0.2s ease;\r\n }\r\n \r\n .PhoneInputCountry:focus-within {\r\n border-color: ${colors.buttonPrimary};\r\n outline: 2px solid ${colors.buttonPrimary}40;\r\n }\r\n \r\n .PhoneInputCountryIcon {\r\n width: 24px;\r\n height: 24px;\r\n margin-right: 4px;\r\n }\r\n \r\n .PhoneInputCountryIcon--border {\r\n box-shadow: none;\r\n }\r\n \r\n .PhoneInputCountrySelect {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n height: 100%;\r\n width: 100%;\r\n z-index: 1;\r\n border: 0;\r\n opacity: 0;\r\n cursor: pointer;\r\n color: ${colors.textPrimary};\r\n background-color: ${colors.bgSecondary};\r\n }\r\n \r\n .PhoneInputCountrySelect:disabled {\r\n cursor: not-allowed;\r\n }\r\n \r\n /* Dropdown menu styling */\r\n .PhoneInputCountrySelect option {\r\n background-color: ${colors.bgPrimary};\r\n color: ${colors.textPrimary};\r\n padding: 8px 12px;\r\n font-size: 14px;\r\n }\r\n \r\n .PhoneInputCountrySelect option:hover,\r\n .PhoneInputCountrySelect option:focus,\r\n .PhoneInputCountrySelect option:checked {\r\n background-color: ${colors.buttonPrimary};\r\n color: white;\r\n }\r\n \r\n .PhoneInputCountrySelectArrow {\r\n display: block;\r\n content: '';\r\n width: 0.3em;\r\n height: 0.3em;\r\n margin-left: 0.35em;\r\n border-style: solid;\r\n border-color: ${colors.textPrimary};\r\n border-top-width: 0;\r\n border-bottom-width: 1px;\r\n border-left-width: 0;\r\n border-right-width: 1px;\r\n transform: rotate(45deg);\r\n opacity: 0.7;\r\n }\r\n \r\n .PhoneInputInput {\r\n flex: 1;\r\n min-width: 0;\r\n padding: 12px 16px;\r\n border: 1px solid ${colors.borderSecondary};\r\n border-radius: 8px;\r\n font-size: 16px;\r\n background-color: ${colors.bgSecondary};\r\n color: ${colors.textPrimary};\r\n transition: all 0.2s ease;\r\n -webkit-text-fill-color: ${colors.textPrimary};\r\n -webkit-box-shadow: 0 0 0 1000px ${colors.bgSecondary} inset;\r\n }\r\n \r\n .PhoneInputInput:focus {\r\n border-color: ${colors.buttonPrimary};\r\n outline: 2px solid ${colors.buttonPrimary}40;\r\n }\r\n \r\n .PhoneInputInput:disabled {\r\n cursor: not-allowed;\r\n opacity: 0.6;\r\n }\r\n \r\n .PhoneInputInput::placeholder {\r\n color: ${colors.textTertiary};\r\n opacity: 0.6;\r\n }\r\n `, [colors]);\r\n\r\n useEffect(() => {\r\n // Detect user's country based on timezone or IP\r\n const detectCountry = async () => {\r\n try {\r\n // Try to get country from timezone first\r\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\r\n const timezoneToCountry: Record<string, string> = {\r\n 'America/New_York': 'US',\r\n 'America/Chicago': 'US',\r\n 'America/Denver': 'US',\r\n 'America/Los_Angeles': 'US',\r\n 'America/Phoenix': 'US',\r\n 'America/Anchorage': 'US',\r\n 'Pacific/Honolulu': 'US',\r\n 'Europe/London': 'GB',\r\n 'Europe/Paris': 'FR',\r\n 'Europe/Berlin': 'DE',\r\n 'Europe/Rome': 'IT',\r\n 'Europe/Madrid': 'ES',\r\n 'Asia/Dubai': 'AE',\r\n 'Asia/Kolkata': 'IN',\r\n 'Asia/Shanghai': 'CN',\r\n 'Asia/Tokyo': 'JP',\r\n 'Asia/Seoul': 'KR',\r\n 'Asia/Singapore': 'SG',\r\n 'Asia/Hong_Kong': 'HK',\r\n 'Australia/Sydney': 'AU',\r\n 'Pacific/Auckland': 'NZ',\r\n 'America/Toronto': 'CA',\r\n 'America/Vancouver': 'CA',\r\n 'America/Mexico_City': 'MX',\r\n 'America/Sao_Paulo': 'BR',\r\n 'America/Buenos_Aires': 'AR',\r\n 'Africa/Cairo': 'EG',\r\n 'Africa/Johannesburg': 'ZA',\r\n 'Africa/Lagos': 'NG',\r\n 'Africa/Nairobi': 'KE',\r\n };\r\n\r\n const detectedCountry = timezoneToCountry[timezone];\r\n if (detectedCountry) {\r\n setDefaultCountry(detectedCountry);\r\n return;\r\n }\r\n\r\n // Fallback: Try to get country from IP using a free API\r\n const response = await fetch('https://ipapi.co/json/', {\r\n signal: AbortSignal.timeout(3000) // 3 second timeout\r\n });\r\n \r\n if (response.ok) {\r\n const data = await response.json();\r\n if (data.country_code) {\r\n setDefaultCountry(data.country_code);\r\n }\r\n }\r\n } catch (error) {\r\n // If detection fails, keep default US\r\n console.log('Country detection failed, using default US');\r\n }\r\n };\r\n\r\n detectCountry();\r\n }, []);\r\n\r\n // Memoize the onChange handler to prevent recreation\r\n const handleChange = useMemo(() => (val: string | undefined) => {\r\n onChange(val || '');\r\n }, [onChange]);\r\n\r\n // Fallback to simple input if react-phone-number-input is not available\r\n if (!PhoneInputWithCountry) {\r\n return (\r\n <input\r\n id={id}\r\n type=\"tel\"\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n disabled={disabled}\r\n required={required}\r\n placeholder={placeholder}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n ...style\r\n }}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n style={{\r\n width: '100%',\r\n ...style\r\n }}\r\n >\r\n <style>{styleContent}</style>\r\n \r\n <PhoneInputWithCountry\r\n key={id}\r\n id={id}\r\n international\r\n defaultCountry={defaultCountry as any}\r\n value={value || ''}\r\n onChange={handleChange}\r\n disabled={disabled}\r\n placeholder={placeholder}\r\n inputComponent={CustomPhoneInput}\r\n />\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../use-auth';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\nimport { AuthConfig } from '../../types';\r\nimport { PhoneInput } from './PhoneInput';\r\n\r\nexport interface RegisterFormProps {\r\n onRegisterSuccess?: () => void;\r\n onLoginClick?: () => void;\r\n showLoginLink?: boolean;\r\n authConfig?: AuthConfig;\r\n oauthProviders?: Array<'google' | 'github'>;\r\n showOAuthButtons?: boolean;\r\n invitationToken?: string | null;\r\n}\r\n\r\nexport const RegisterForm: React.FC<RegisterFormProps> = ({\r\n onRegisterSuccess,\r\n onLoginClick,\r\n showLoginLink = true,\r\n authConfig,\r\n oauthProviders = ['google', 'github'],\r\n showOAuthButtons = true,\r\n invitationToken\r\n}) => {\r\n const colors = useThemeColors();\r\n const [name, setName] = useState('');\r\n const [email, setEmail] = useState('');\r\n const [phoneNumber, setPhoneNumber] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\r\n\r\n const getPasswordStrength = (pwd: string): { strength: 'weak' | 'medium' | 'strong'; score: number; label: string } => {\r\n if (!pwd) return { strength: 'weak', score: 0, label: '' };\r\n\r\n let score = 0;\r\n if (pwd.length >= 6) score++;\r\n if (pwd.length >= 8) score++;\r\n if (/[a-z]/.test(pwd) && /[A-Z]/.test(pwd)) score++;\r\n if (/\\d/.test(pwd)) score++;\r\n if (/[^a-zA-Z\\d]/.test(pwd)) score++;\r\n\r\n if (score <= 2) return { strength: 'weak', score, label: 'Weak' };\r\n if (score <= 3) return { strength: 'medium', score, label: 'Medium' };\r\n return { strength: 'strong', score, label: 'Strong' };\r\n };\r\n\r\n const passwordStrength = getPasswordStrength(password);\r\n\r\n // Use the provided authConfig or a default one\r\n const config = authConfig || {\r\n baseUrl: 'http://localhost:7000'\r\n };\r\n\r\n const { register } = useAuth(config);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n // Validate password confirmation\r\n if (password !== confirmPassword) {\r\n setError('Passwords do not match');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n // Validate password strength\r\n if (password.length < 6) {\r\n setError('Password must be at least 6 characters long');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n // If invitation token is present, use the signup-with-invitation endpoint\r\n if (invitationToken) {\r\n const response = await fetch(`${config.baseUrl}/api/v1/auth/signup-with-invitation`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n name,\r\n email,\r\n password,\r\n phoneNumber: phoneNumber || undefined,\r\n invitationToken,\r\n }),\r\n });\r\n\r\n const data = await response.json();\r\n\r\n if (response.ok && data.success) {\r\n // Store the token\r\n if (typeof window !== 'undefined' && data.token) {\r\n localStorage.setItem('auth_token', data.token);\r\n }\r\n onRegisterSuccess?.();\r\n } else {\r\n setError(data.error || data.message || 'Registration failed');\r\n }\r\n } else {\r\n // Regular registration flow\r\n const registerData: any = {\r\n name,\r\n password,\r\n frontendBaseUrl: typeof window !== 'undefined'\r\n ? (process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || process.env.REACT_APP_FRONTEND_BASE_URL || window.location.origin)\r\n : undefined\r\n };\r\n\r\n // Add email or phone number\r\n if (email) registerData.email = email;\r\n if (phoneNumber) registerData.phoneNumber = phoneNumber;\r\n\r\n const response = await register(registerData);\r\n if (response.success) {\r\n onRegisterSuccess?.();\r\n } else {\r\n setError(response.message || 'Registration failed');\r\n }\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An unknown error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '24px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <form onSubmit={handleSubmit} style={{\r\n display: 'flex',\r\n flexDirection: 'column'\r\n }}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '20px',\r\n color: colors.textPrimary,\r\n fontSize: '24px',\r\n fontWeight: 600\r\n }}>Register</h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '16px',\r\n backgroundColor: colors.errorBg,\r\n color: colors.errorText,\r\n border: `1px solid ${colors.errorBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div style={{\r\n marginBottom: '16px'\r\n }}>\r\n <label htmlFor=\"name\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Name:</label>\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary\r\n }}\r\n placeholder=\"Enter your name\"\r\n />\r\n </div>\r\n\r\n <div style={{\r\n marginBottom: '16px'\r\n }}>\r\n <label htmlFor=\"register-email\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Email:</label>\r\n <input\r\n id=\"register-email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n required={!phoneNumber}\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary\r\n }}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n\r\n <div style={{\r\n marginBottom: '16px'\r\n }}>\r\n <label htmlFor=\"register-phone\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Phone Number (Optional):</label>\r\n <PhoneInput\r\n id=\"register-phone\"\r\n value={phoneNumber}\r\n onChange={setPhoneNumber}\r\n disabled={isLoading}\r\n placeholder=\"1234567890\"\r\n />\r\n </div>\r\n\r\n <div style={{\r\n marginBottom: '16px'\r\n }}>\r\n <label htmlFor=\"password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Password:</label>\r\n <input\r\n id=\"password\"\r\n type=\"password\"\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary\r\n }}\r\n placeholder=\"Enter your password\"\r\n minLength={6}\r\n />\r\n </div>\r\n\r\n <div style={{\r\n marginBottom: '16px'\r\n }}>\r\n <label htmlFor=\"confirm-password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Confirm Password:</label>\r\n <input\r\n id=\"confirm-password\"\r\n type=\"password\"\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary\r\n }}\r\n placeholder=\"Confirm your password\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n padding: '14px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n marginTop: '4px'\r\n }}\r\n >\r\n {isLoading ? 'Registering...' : 'Register'}\r\n </button>\r\n\r\n {showOAuthButtons && oauthProviders.length > 0 && (\r\n <div style={{\r\n marginTop: '16px',\r\n paddingTop: '16px',\r\n borderTop: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <div style={{\r\n position: 'relative',\r\n marginBottom: '16px'\r\n }}>\r\n <div style={{\r\n position: 'absolute',\r\n top: '50%',\r\n left: 0,\r\n right: 0,\r\n height: '1px',\r\n backgroundColor: colors.borderPrimary\r\n }} />\r\n <div style={{\r\n position: 'relative',\r\n textAlign: 'center'\r\n }}>\r\n <span style={{\r\n backgroundColor: colors.bgPrimary,\r\n padding: '0 12px',\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Or continue with</span>\r\n </div>\r\n </div>\r\n\r\n <div style={{\r\n display: 'grid',\r\n gridTemplateColumns: oauthProviders.length === 1 ? '1fr' : 'repeat(2, 1fr)',\r\n gap: '12px'\r\n }}>\r\n {oauthProviders.includes('google') && (\r\n <a\r\n href={`${config.baseUrl}/api/v1/auth/oauth/google`}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '8px',\r\n padding: '10px 16px',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n color: colors.textPrimary,\r\n textDecoration: 'none',\r\n fontSize: '14px',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.bgHover;\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.bgPrimary;\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n }}\r\n >\r\n <svg style={{ width: '18px', height: '18px' }} viewBox=\"0 0 24 24\">\r\n <path\r\n fill=\"#4285F4\"\r\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\r\n />\r\n <path\r\n fill=\"#34A853\"\r\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\r\n />\r\n <path\r\n fill=\"#FBBC05\"\r\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\r\n />\r\n <path\r\n fill=\"#EA4335\"\r\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\r\n />\r\n </svg>\r\n Google\r\n </a>\r\n )}\r\n\r\n {oauthProviders.includes('github') && (\r\n <a\r\n href={`${config.baseUrl}/api/v1/auth/oauth/github`}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '8px',\r\n padding: '10px 16px',\r\n backgroundColor: '#24292e',\r\n border: '1px solid #24292e',\r\n borderRadius: '8px',\r\n color: '#ffffff',\r\n textDecoration: 'none',\r\n fontSize: '14px',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = '#1b1f23';\r\n e.currentTarget.style.borderColor = '#1b1f23';\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = '#24292e';\r\n e.currentTarget.style.borderColor = '#24292e';\r\n }}\r\n >\r\n <svg style={{ width: '18px', height: '18px' }} fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\r\n </svg>\r\n GitHub\r\n </a>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {showLoginLink && (\r\n <div style={{\r\n textAlign: 'center',\r\n marginTop: '16px',\r\n paddingTop: '16px',\r\n borderTop: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <p style={{\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>\r\n Already have an account?{' '}\r\n <button\r\n type=\"button\"\r\n onClick={onLoginClick}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n transition: 'color 0.2s ease'\r\n }}\r\n >\r\n Login\r\n </button>\r\n </p>\r\n </div>\r\n )}\r\n </form>\r\n </div>\r\n );\r\n};","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../use-auth';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\n// Removed CSS import - styles will be embedded directly\r\n\r\ninterface OtpFormProps {\r\n email: string;\r\n onVerifySuccess?: () => void;\r\n onBackToLogin?: () => void;\r\n baseUrl?: string;\r\n}\r\n\r\nexport const OtpForm: React.FC<OtpFormProps> = ({\r\n email,\r\n onVerifySuccess,\r\n onBackToLogin,\r\n baseUrl\r\n}) => {\r\n const colors = useThemeColors();\r\n const [otp, setOtp] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [resendCooldown, setResendCooldown] = useState(0);\r\n const [resendLoading, setResendLoading] = useState(false);\r\n\r\n const { verify, login } = useAuth({\r\n baseUrl: baseUrl || process.env.NEXT_PUBLIC_AUTH_API_URL || 'http://localhost:7000'\r\n });\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n // Validate OTP format\r\n if (!/^\\d{6}$/.test(otp)) {\r\n setError('Please enter a valid 6-digit OTP');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n const response = await verify({ email, otp });\r\n if (response.success) {\r\n onVerifySuccess?.();\r\n } else {\r\n setError(response.message || 'Verification failed');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An unknown error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const handleOtpChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const value = e.target.value;\r\n // Allow only digits and limit to 6 characters\r\n if (/^\\d{0,6}$/.test(value)) {\r\n setOtp(value);\r\n }\r\n };\r\n\r\n const handleResendOtp = async () => {\r\n if (resendCooldown > 0 || resendLoading) return;\r\n\r\n setResendLoading(true);\r\n setError(null);\r\n\r\n try {\r\n const response = await login({ email });\r\n if (response.success) {\r\n // Start 60 second cooldown\r\n setResendCooldown(60);\r\n const interval = setInterval(() => {\r\n setResendCooldown((prev) => {\r\n if (prev <= 1) {\r\n clearInterval(interval);\r\n return 0;\r\n }\r\n return prev - 1;\r\n });\r\n }, 1000);\r\n } else {\r\n setError(response.message || 'Failed to resend OTP');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to resend OTP');\r\n } finally {\r\n setResendLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <form onSubmit={handleSubmit} style={{\r\n display: 'flex',\r\n flexDirection: 'column'\r\n }}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: colors.textPrimary,\r\n fontSize: '24px',\r\n fontWeight: 600\r\n }}>Verify OTP</h2>\r\n <p style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Enter the 6-digit code sent to <strong style={{ color: colors.textPrimary }}>{email}</strong></p>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.errorBg,\r\n color: colors.errorText,\r\n border: `1px solid ${colors.errorBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div style={{\r\n marginBottom: '20px'\r\n }}>\r\n <label htmlFor=\"otp\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>OTP Code:</label>\r\n <input\r\n id=\"otp\"\r\n type=\"text\"\r\n value={otp}\r\n onChange={handleOtpChange}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '20px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary,\r\n textAlign: 'center',\r\n letterSpacing: '5px'\r\n }}\r\n maxLength={6}\r\n placeholder=\"123456\"\r\n autoFocus\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading || otp.length !== 6}\r\n style={{\r\n padding: '14px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n marginTop: '8px'\r\n }}\r\n >\r\n {isLoading ? 'Verifying...' : 'Verify OTP'}\r\n </button>\r\n\r\n <div style={{\r\n textAlign: 'center',\r\n marginTop: '20px',\r\n paddingTop: '20px',\r\n borderTop: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <button\r\n type=\"button\"\r\n onClick={handleResendOtp}\r\n disabled={isLoading || resendLoading || resendCooldown > 0}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: resendCooldown > 0 ? colors.textTertiary : colors.buttonPrimary,\r\n textDecoration: 'none',\r\n cursor: resendCooldown > 0 ? 'not-allowed' : 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n marginBottom: '12px',\r\n transition: 'color 0.2s ease',\r\n display: 'block',\r\n width: '100%'\r\n }}\r\n >\r\n {resendLoading ? 'Sending...' : resendCooldown > 0 ? `Resend OTP in ${resendCooldown}s` : 'Resend OTP'}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={onBackToLogin}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n transition: 'color 0.2s ease'\r\n }}\r\n >\r\n Back to Login\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n );\r\n};","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { LoginForm } from './LoginForm';\r\nimport { RegisterForm } from './RegisterForm';\r\nimport { OtpForm } from './OtpForm';\r\n// Removed CSS import - styles will be embedded directly\r\n\r\ntype AuthStep = 'login' | 'register' | 'otp';\r\n\r\ninterface AuthFlowProps {\r\n onAuthComplete?: () => void;\r\n initialStep?: AuthStep;\r\n showTitle?: boolean;\r\n}\r\n\r\nexport const AuthFlow: React.FC<AuthFlowProps> = ({ \r\n onAuthComplete,\r\n initialStep = 'login',\r\n showTitle = true\r\n}) => {\r\n const [step, setStep] = useState<AuthStep>(initialStep);\r\n const [email, setEmail] = useState('');\r\n const [message, setMessage] = useState<string | null>(null);\r\n\r\n const handleLoginSuccess = (email: string, needsOtpVerification: boolean) => {\r\n // Set email\r\n setEmail(email);\r\n \r\n if (needsOtpVerification) {\r\n // Move to OTP verification step\r\n setStep('otp');\r\n setMessage(null);\r\n } else {\r\n // Login is complete, notify parent\r\n setMessage(null);\r\n onAuthComplete?.();\r\n }\r\n };\r\n\r\n const handleRegisterSuccess = () => {\r\n // Registration successful, show message and redirect to login\r\n setMessage('Registration successful! Please check your email for verification.');\r\n // Automatically switch to login after a short delay\r\n setTimeout(() => {\r\n setStep('login');\r\n setMessage(null);\r\n }, 3000);\r\n };\r\n\r\n const handleVerifySuccess = () => {\r\n // Authentication complete\r\n setMessage(null);\r\n onAuthComplete?.();\r\n };\r\n\r\n const handleBackToLogin = () => {\r\n setStep('login');\r\n setMessage(null);\r\n };\r\n\r\n const renderCurrentStep = () => {\r\n switch (step) {\r\n case 'login':\r\n return (\r\n <>\r\n {showTitle && <h1 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#333',\r\n fontSize: '32px',\r\n fontWeight: 700\r\n }}>Welcome Back</h1>}\r\n {message && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#d4edda',\r\n color: '#155724',\r\n border: '1px solid #c3e6cb',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {message}\r\n </div>\r\n )}\r\n <LoginForm\r\n onLoginSuccess={handleLoginSuccess}\r\n onRegisterClick={() => setStep('register')}\r\n showRegisterLink={true}\r\n />\r\n </>\r\n );\r\n \r\n case 'register':\r\n return (\r\n <>\r\n {showTitle && <h1 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#333',\r\n fontSize: '32px',\r\n fontWeight: 700\r\n }}>Create Account</h1>}\r\n {message && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#d4edda',\r\n color: '#155724',\r\n border: '1px solid #c3e6cb',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {message}\r\n </div>\r\n )}\r\n <RegisterForm\r\n onRegisterSuccess={handleRegisterSuccess}\r\n onLoginClick={() => setStep('login')}\r\n showLoginLink={true}\r\n />\r\n </>\r\n );\r\n \r\n case 'otp':\r\n return (\r\n <>\r\n {showTitle && <h1 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#333',\r\n fontSize: '32px',\r\n fontWeight: 700\r\n }}>Verify Your Email</h1>}\r\n <OtpForm\r\n email={email}\r\n onVerifySuccess={handleVerifySuccess}\r\n onBackToLogin={handleBackToLogin}\r\n />\r\n </>\r\n );\r\n \r\n default:\r\n return (\r\n <>\r\n {showTitle && <h1 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#333',\r\n fontSize: '32px',\r\n fontWeight: 700\r\n }}>Welcome Back</h1>}\r\n <LoginForm\r\n onLoginSuccess={handleLoginSuccess}\r\n onRegisterClick={() => setStep('register')}\r\n showRegisterLink={true}\r\n />\r\n </>\r\n );\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n minHeight: '300px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }}>\r\n {renderCurrentStep()}\r\n </div>\r\n );\r\n};","'use client';\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useAuth } from '../use-auth';\r\n// Removed CSS import - styles will be embedded directly\r\n\r\ninterface EmailVerificationPageProps {\r\n token: string;\r\n onVerificationSuccess?: () => void;\r\n onVerificationError?: (error: string) => void;\r\n baseUrl?: string;\r\n}\r\n\r\nexport const EmailVerificationPage: React.FC<EmailVerificationPageProps> = ({\r\n token,\r\n onVerificationSuccess,\r\n onVerificationError,\r\n baseUrl\r\n}) => {\r\n const [isLoading, setIsLoading] = useState(true);\r\n const [message, setMessage] = useState('');\r\n const [isSuccess, setIsSuccess] = useState(false);\r\n \r\n const { verifyEmailToken } = useAuth({\r\n baseUrl: baseUrl || (typeof window !== 'undefined' ? window.location.origin : 'http://localhost:7000')\r\n });\r\n\r\n useEffect(() => {\r\n const verifyEmail = async () => {\r\n if (!token) {\r\n setIsLoading(false);\r\n setMessage('Invalid verification token');\r\n setIsSuccess(false);\r\n onVerificationError?.('Invalid verification token');\r\n return;\r\n }\r\n\r\n try {\r\n const response = await verifyEmailToken(token);\r\n \r\n if (response.success) {\r\n setIsLoading(false);\r\n setMessage(response.message || 'Email verified successfully!');\r\n setIsSuccess(true);\r\n onVerificationSuccess?.();\r\n } else {\r\n setIsLoading(false);\r\n setMessage(response.message || 'Email verification failed');\r\n setIsSuccess(false);\r\n onVerificationError?.(response.message || 'Email verification failed');\r\n }\r\n } catch (err) {\r\n setIsLoading(false);\r\n const errorMessage = err instanceof Error ? err.message : 'An unknown error occurred';\r\n setMessage(errorMessage);\r\n setIsSuccess(false);\r\n onVerificationError?.(errorMessage);\r\n }\r\n };\r\n\r\n verifyEmail();\r\n }, [token, verifyEmailToken, onVerificationSuccess, onVerificationError]);\r\n\r\n if (isLoading) {\r\n return (\r\n <div style={{\r\n maxWidth: '500px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n textAlign: 'center',\r\n border: '1px solid #eaeaea'\r\n }}>\r\n <div style={{\r\n padding: '20px'\r\n }}>\r\n <h2 style={{ color: 'black' }}>Verifying your email...</h2>\r\n <div style={{\r\n border: '4px solid #f3f3f3',\r\n borderTop: '4px solid #007bff',\r\n borderRadius: '50%',\r\n width: '40px',\r\n height: '40px',\r\n animation: 'spin 2s linear infinite',\r\n margin: '20px auto'\r\n }}></div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '500px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n textAlign: 'center',\r\n border: '1px solid #eaeaea'\r\n }}>\r\n <div style={{\r\n padding: '20px'\r\n }}>\r\n <h2 style={{ color: 'black' }}>Email Verification</h2>\r\n <div style={{\r\n padding: '16px 20px',\r\n margin: '24px 0',\r\n borderRadius: '8px',\r\n fontSize: '15px',\r\n fontWeight: 500,\r\n backgroundColor: isSuccess ? '#d4edda' : '#f8d7da',\r\n color: isSuccess ? '#155724' : '#721c24',\r\n border: isSuccess ? '1px solid #c3e6cb' : '1px solid #f5c6cb'\r\n }}>\r\n {message}\r\n </div>\r\n {isSuccess && (\r\n <div style={{\r\n marginTop: '24px'\r\n }}>\r\n <p style={{ color: 'black' }}>Your email has been successfully verified!</p>\r\n <button \r\n onClick={() => window.location.href = '/login'}\r\n style={{\r\n padding: '12px 24px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n >\r\n Go to Login\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};","'use client';\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\nimport { ThemeWrapper } from './ThemeWrapper';\r\n\r\ninterface SignInProps {\r\n redirectUrl?: string;\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n routing?: 'path' | 'virtual';\r\n path?: string;\r\n}\r\n\r\nexport const SignIn: React.FC<SignInProps> = ({ redirectUrl, appearance }) => {\r\n const { signIn, isSignedIn, loading: authLoading } = useAuth();\r\n const colors = useThemeColors();\r\n const [email, setEmail] = useState('');\r\n const [phoneNumber, setPhoneNumber] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [otp, setOtp] = useState('');\r\n const [usePassword, setUsePassword] = useState(false);\r\n const [usePhone, setUsePhone] = useState(false);\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [needsOtp, setNeedsOtp] = useState(false);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n if (isSignedIn && redirectUrl) {\r\n const redirect = redirectUrl || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_LOGIN || \r\n '/dashboard';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${redirect}`;\r\n }\r\n }, [isSignedIn, redirectUrl]);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n const loginData = usePhone ? { phoneNumber } : { email };\r\n \r\n if (needsOtp) {\r\n // Submit OTP\r\n const response = await signIn({ ...loginData, otp });\r\n if (response.success) {\r\n setSuccess('Login successful!');\r\n // Redirect will happen via useEffect\r\n } else {\r\n setError(response.message || 'OTP verification failed');\r\n }\r\n } else if (usePassword) {\r\n // Password login\r\n const response = await signIn({ ...loginData, password });\r\n if (response.success) {\r\n setSuccess('Login successful!');\r\n // Redirect will happen via useEffect\r\n } else {\r\n setError(response.message || 'Login failed');\r\n }\r\n } else {\r\n // Request OTP\r\n const response = await signIn(loginData);\r\n if (response.success && (response.message === 'OTP sent to your email.' || response.message === 'OTP sent to your phone number.')) {\r\n setNeedsOtp(true);\r\n setSuccess(usePhone ? 'OTP sent to your phone. Please check your messages.' : 'OTP sent to your email. Please check your inbox.');\r\n } else {\r\n setError(response.message || 'Failed to send OTP');\r\n }\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const toggleAuthMethod = () => {\r\n setUsePassword(!usePassword);\r\n setNeedsOtp(false);\r\n setError(null);\r\n setSuccess(null);\r\n setOtp('');\r\n };\r\n\r\n const toggleLoginMethod = () => {\r\n setUsePhone(!usePhone);\r\n setNeedsOtp(false);\r\n setError(null);\r\n setSuccess(null);\r\n setOtp('');\r\n setEmail('');\r\n setPhoneNumber('');\r\n };\r\n\r\n if (authLoading) {\r\n return (\r\n <div style={{ textAlign: 'center', padding: '40px' }}>\r\n <div>Loading...</div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <ThemeWrapper\r\n style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderPrimary}`,\r\n ...appearance?.elements?.card\r\n }}\r\n >\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: colors.textPrimary,\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n {needsOtp ? 'Enter OTP' : usePassword ? 'Sign in with password' : 'Sign in'}\r\n </h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.errorBg,\r\n color: colors.errorText,\r\n border: `1px solid ${colors.errorBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.successBg,\r\n color: colors.successText,\r\n border: `1px solid ${colors.successBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {success}\r\n </div>\r\n )}\r\n\r\n {!needsOtp && !usePhone && (\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"email\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Email</label>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n )}\r\n\r\n {!needsOtp && usePhone && (\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"phoneNumber\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Phone Number</label>\r\n <input\r\n id=\"phoneNumber\"\r\n type=\"tel\"\r\n value={phoneNumber}\r\n onChange={(e) => setPhoneNumber(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Enter your phone number\"\r\n />\r\n </div>\r\n )}\r\n\r\n {usePassword && !needsOtp && (\r\n <div style={{ marginBottom: '20px', position: 'relative' }}>\r\n <label htmlFor=\"password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Password</label>\r\n <input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Enter your password\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n style={{\r\n position: 'absolute',\r\n right: '12px',\r\n top: '38px',\r\n background: 'none',\r\n border: 'none',\r\n cursor: 'pointer',\r\n color: colors.textTertiary,\r\n fontSize: '14px'\r\n }}\r\n >\r\n {showPassword ? 'Hide' : 'Show'}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {needsOtp && (\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"otp\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>One-Time Password</label>\r\n <input\r\n id=\"otp\"\r\n type=\"text\"\r\n value={otp}\r\n onChange={(e) => setOtp(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n maxLength={6}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n letterSpacing: '0.5em',\r\n textAlign: 'center',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"000000\"\r\n />\r\n </div>\r\n )}\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n onMouseEnter={(e) => {\r\n if (!isLoading) {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimaryHover;\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimary;\r\n }}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: isLoading ? 'not-allowed' : 'pointer',\r\n opacity: isLoading ? 0.6 : 1,\r\n transition: 'all 0.2s ease',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Please wait...' : needsOtp ? 'Verify OTP' : usePassword ? 'Sign in' : usePhone ? 'Continue with phone' : 'Continue with email'}\r\n </button>\r\n\r\n {!needsOtp && (\r\n <div style={{ textAlign: 'center', marginTop: '16px' }}>\r\n <button\r\n type=\"button\"\r\n onClick={toggleAuthMethod}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n marginRight: '16px'\r\n }}\r\n >\r\n {usePassword ? 'Use OTP code instead' : 'Use password instead'}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={toggleLoginMethod}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600\r\n }}\r\n >\r\n {usePhone ? 'Use email instead' : 'Use phone instead'}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {needsOtp && (\r\n <div style={{ textAlign: 'center', marginTop: '16px' }}>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n setNeedsOtp(false);\r\n setOtp('');\r\n setError(null);\r\n setSuccess(null);\r\n }}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600\r\n }}\r\n >\r\n Back to sign in\r\n </button>\r\n </div>\r\n )}\r\n </form>\r\n </ThemeWrapper>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { createContext, useContext, useState, useEffect, useCallback, ReactNode } from 'react';\r\nimport { AuthService } from '../core/auth-service';\r\nimport { User, AuthConfig, AuthResponse, LoginData, RegisterData, VerifyData, UpdateUserData, OAuthProvider } from '../types';\r\nimport { AuthThemeProvider } from './ThemeContext';\r\n\r\ninterface AuthContextValue {\r\n user: User | null;\r\n isLoaded: boolean;\r\n isSignedIn: boolean;\r\n loading: boolean;\r\n signIn: (data: LoginData) => Promise<AuthResponse>;\r\n signUp: (data: RegisterData) => Promise<AuthResponse>;\r\n signOut: () => Promise<void>;\r\n verify: (data: VerifyData) => Promise<AuthResponse>;\r\n verifyEmailToken: (token: string) => Promise<AuthResponse>;\r\n updateProfile: (data: UpdateUserData) => Promise<AuthResponse>;\r\n getProfile: () => Promise<User>;\r\n signInWithOAuth: (provider: OAuthProvider) => void;\r\n linkOAuthProvider: (provider: OAuthProvider) => void;\r\n unlinkOAuthProvider: (provider: OAuthProvider) => Promise<AuthResponse>;\r\n forgotPassword: (email: string) => Promise<AuthResponse>;\r\n resetPassword: (token: string, password: string) => Promise<AuthResponse>;\r\n changePassword: (oldPassword: string, newPassword: string) => Promise<AuthResponse>;\r\n updateAvatar: (avatar: string) => Promise<AuthResponse>;\r\n uploadAndUpdateAvatar: (file: File) => Promise<AuthResponse>;\r\n requestEmailChange: (newEmail: string) => Promise<AuthResponse>;\r\n verifyEmailChange: (token: string) => Promise<AuthResponse>;\r\n generate2FA: () => Promise<any>;\r\n enable2FA: (token: string) => Promise<AuthResponse>;\r\n disable2FA: (token: string) => Promise<AuthResponse>;\r\n validate2FA: (token: string) => Promise<AuthResponse>;\r\n getSessions: () => Promise<any>;\r\n revokeSession: (sessionId: string) => Promise<AuthResponse>;\r\n revokeAllSessions: () => Promise<AuthResponse>;\r\n authService: AuthService;\r\n}\r\n\r\nconst AuthContext = createContext<AuthContextValue | undefined>(undefined);\r\n\r\ninterface AuthProviderProps {\r\n children: ReactNode;\r\n config?: Partial<AuthConfig>;\r\n}\r\n\r\nexport const AuthProvider: React.FC<AuthProviderProps> = ({ children, config }) => {\r\n // Get configuration from environment variables or props\r\n const authConfig: AuthConfig = {\r\n baseUrl: config?.baseUrl || \r\n (typeof window !== 'undefined' \r\n ? (process.env.NEXT_PUBLIC_AUTH_API_URL || process.env.REACT_APP_AUTH_API_URL || 'http://localhost:7000')\r\n : 'http://localhost:7000'),\r\n localStorageKey: config?.localStorageKey || 'auth_token',\r\n csrfEnabled: config?.csrfEnabled !== undefined ? config.csrfEnabled : true,\r\n upfilesConfig: config?.upfilesConfig,\r\n };\r\n\r\n const [authService] = useState(() => new AuthService(authConfig));\r\n const [user, setUser] = useState<User | null>(null);\r\n const [isLoaded, setIsLoaded] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n\r\n const checkAuthStatus = useCallback(async () => {\r\n const authenticated = authService.isAuthenticated();\r\n \r\n if (authenticated) {\r\n try {\r\n const currentUser = authService.getCurrentUser();\r\n setUser(currentUser);\r\n } catch (error) {\r\n console.error('Failed to get current user:', error);\r\n setUser(null);\r\n }\r\n } else {\r\n setUser(null);\r\n }\r\n \r\n setIsLoaded(true);\r\n }, [authService]);\r\n\r\n useEffect(() => {\r\n checkAuthStatus();\r\n }, [checkAuthStatus]);\r\n\r\n const signIn = useCallback(async (data: LoginData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.login(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const signUp = useCallback(async (data: RegisterData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.register(data);\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const signOut = useCallback(async (): Promise<void> => {\r\n setLoading(true);\r\n try {\r\n await authService.logout();\r\n setUser(null);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verify = useCallback(async (data: VerifyData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verify(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verifyEmailToken = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verifyEmailToken(token);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const updateProfile = useCallback(async (data: UpdateUserData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.updateProfile(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getProfile = useCallback(async (): Promise<User> => {\r\n setLoading(true);\r\n try {\r\n const userData = await authService.getProfile();\r\n setUser(userData);\r\n return userData;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const signInWithOAuth = useCallback((provider: OAuthProvider) => {\r\n authService.loginWithOAuth(provider);\r\n }, [authService]);\r\n\r\n const linkOAuthProvider = useCallback((provider: OAuthProvider) => {\r\n authService.linkOAuthProvider(provider);\r\n }, [authService]);\r\n\r\n const unlinkOAuthProvider = useCallback(async (provider: OAuthProvider): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.unlinkOAuthProvider(provider);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const forgotPassword = useCallback(async (email: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.forgotPassword(email);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const resetPassword = useCallback(async (token: string, password: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.resetPassword(token, password);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const changePassword = useCallback(async (oldPassword: string, newPassword: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.changePassword(oldPassword, newPassword);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const updateAvatar = useCallback(async (avatar: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.updateAvatar(avatar);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const uploadAndUpdateAvatar = useCallback(async (file: File): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.uploadAndUpdateAvatar(file);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const requestEmailChange = useCallback(async (newEmail: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.requestEmailChange(newEmail);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verifyEmailChange = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verifyEmailChange(token);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const generate2FA = useCallback(async () => {\r\n setLoading(true);\r\n try {\r\n return await authService.generate2FA();\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const enable2FA = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.enable2FA(token);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const disable2FA = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.disable2FA(token);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const validate2FA = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.validate2FA(token);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getSessions = useCallback(async () => {\r\n setLoading(true);\r\n try {\r\n return await authService.getSessions();\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const revokeSession = useCallback(async (sessionId: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.revokeSession(sessionId);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const revokeAllSessions = useCallback(async (): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.revokeAllSessions();\r\n setUser(null);\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const value: AuthContextValue = {\r\n user,\r\n isLoaded,\r\n isSignedIn: !!user,\r\n loading,\r\n signIn,\r\n signUp,\r\n signOut,\r\n verify,\r\n verifyEmailToken,\r\n updateProfile,\r\n getProfile,\r\n signInWithOAuth,\r\n linkOAuthProvider,\r\n unlinkOAuthProvider,\r\n forgotPassword,\r\n resetPassword,\r\n changePassword,\r\n updateAvatar,\r\n uploadAndUpdateAvatar,\r\n requestEmailChange,\r\n verifyEmailChange,\r\n generate2FA,\r\n enable2FA,\r\n disable2FA,\r\n validate2FA,\r\n getSessions,\r\n revokeSession,\r\n revokeAllSessions,\r\n authService,\r\n };\r\n\r\n return (\r\n <AuthContext.Provider value={value}>\r\n <AuthThemeProvider>\r\n {children}\r\n </AuthThemeProvider>\r\n </AuthContext.Provider>\r\n );\r\n};\r\n\r\nexport const useAuth = (): AuthContextValue => {\r\n const context = useContext(AuthContext);\r\n if (context === undefined) {\r\n throw new Error('useAuth must be used within an AuthProvider');\r\n }\r\n return context;\r\n};\r\n","'use client';\r\n\r\nimport React, { ReactNode, forwardRef } from 'react';\r\nimport { useAuthTheme } from '../ThemeContext';\r\n\r\ninterface ThemeWrapperProps {\r\n children: ReactNode;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nexport const ThemeWrapper = forwardRef<HTMLDivElement, ThemeWrapperProps>(\r\n ({ children, className = '', style }, ref) => {\r\n const { theme, mounted } = useAuthTheme();\r\n\r\n if (!mounted) {\r\n return <div ref={ref} className={className} style={style}>{children}</div>;\r\n }\r\n\r\n return (\r\n <div ref={ref} className={`${theme} ${className}`} style={style}>\r\n {children}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nThemeWrapper.displayName = 'ThemeWrapper';\r\n","'use client';\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\nimport { ThemeWrapper } from './ThemeWrapper';\r\nimport { PhoneInput } from './PhoneInput';\r\n\r\ninterface SignUpProps {\r\n redirectUrl?: string;\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const SignUp: React.FC<SignUpProps> = ({ redirectUrl, appearance }) => {\r\n const { signUp, isSignedIn } = useAuth();\r\n const colors = useThemeColors();\r\n const [name, setName] = useState('');\r\n const [email, setEmail] = useState('');\r\n const [phoneNumber, setPhoneNumber] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n if (isSignedIn && redirectUrl) {\r\n const redirect = redirectUrl ||\r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_REGISTER ||\r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_REGISTER ||\r\n '/dashboard';\r\n\r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL ||\r\n process.env.REACT_APP_FRONTEND_BASE_URL ||\r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n\r\n window.location.href = `${baseUrl}${redirect}`;\r\n }\r\n }, [isSignedIn, redirectUrl]);\r\n\r\n const getPasswordStrength = (pwd: string, colors: any): { strength: 'weak' | 'medium' | 'strong'; color: string } => {\r\n if (!pwd) return { strength: 'weak', color: colors.borderSecondary };\r\n\r\n let score = 0;\r\n if (pwd.length >= 6) score++;\r\n if (pwd.length >= 8) score++;\r\n if (/[a-z]/.test(pwd) && /[A-Z]/.test(pwd)) score++;\r\n if (/\\d/.test(pwd)) score++;\r\n if (/[^a-zA-Z\\d]/.test(pwd)) score++;\r\n\r\n if (score <= 2) return { strength: 'weak', color: colors.errorText };\r\n if (score <= 3) return { strength: 'medium', color: colors.warningText || '#fa4' };\r\n return { strength: 'strong', color: colors.successText };\r\n };\r\n\r\n const passwordStrength = getPasswordStrength(password, colors);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n if (password !== confirmPassword) {\r\n setError('Passwords do not match');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n if (password.length < 6) {\r\n setError('Password must be at least 6 characters');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n const signUpData: any = { name, password };\r\n if (email) signUpData.email = email;\r\n if (phoneNumber) signUpData.phoneNumber = phoneNumber;\r\n \r\n const response = await signUp(signUpData);\r\n if (response.success) {\r\n setSuccess('Registration successful! Please check your email to verify your account.');\r\n } else {\r\n setError(response.message || 'Registration failed');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <ThemeWrapper style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderPrimary}`,\r\n ...appearance?.elements?.card\r\n }}>\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: colors.textPrimary,\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n Create your account\r\n </h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.errorBg,\r\n color: colors.errorText,\r\n border: `1px solid ${colors.errorBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.successBg,\r\n color: colors.successText,\r\n border: `1px solid ${colors.successBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {success}\r\n </div>\r\n )}\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"name\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Full name</label>\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Enter your full name\"\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"email\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Email</label>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required={!phoneNumber}\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"phoneNumber\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Phone Number (Optional)</label>\r\n <PhoneInput\r\n id=\"phoneNumber\"\r\n value={phoneNumber}\r\n onChange={setPhoneNumber}\r\n disabled={isLoading}\r\n placeholder=\"1234567890\"\r\n style={appearance?.elements?.formFieldInput}\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px', position: 'relative' }}>\r\n <label htmlFor=\"password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Password</label>\r\n <input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n minLength={6}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Create a password\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n style={{\r\n position: 'absolute',\r\n right: '12px',\r\n top: '38px',\r\n background: 'none',\r\n border: 'none',\r\n cursor: 'pointer',\r\n color: colors.textTertiary,\r\n fontSize: '14px'\r\n }}\r\n >\r\n {showPassword ? 'Hide' : 'Show'}\r\n </button>\r\n {password && (\r\n <div style={{ marginTop: '8px' }}>\r\n <div style={{\r\n height: '4px',\r\n backgroundColor: colors.borderSecondary,\r\n borderRadius: '2px',\r\n overflow: 'hidden'\r\n }}>\r\n <div style={{\r\n height: '100%',\r\n width: passwordStrength.strength === 'weak' ? '33%' : passwordStrength.strength === 'medium' ? '66%' : '100%',\r\n backgroundColor: passwordStrength.color,\r\n transition: 'all 0.3s ease'\r\n }} />\r\n </div>\r\n <p style={{\r\n fontSize: '12px',\r\n color: passwordStrength.color,\r\n marginTop: '4px',\r\n textTransform: 'capitalize'\r\n }}>\r\n {passwordStrength.strength} password\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"confirmPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Confirm password</label>\r\n <input\r\n id=\"confirmPassword\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Confirm your password\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n onMouseEnter={(e) => {\r\n if (!isLoading) {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimaryHover;\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimary;\r\n }}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: isLoading ? 'not-allowed' : 'pointer',\r\n opacity: isLoading ? 0.6 : 1,\r\n transition: 'all 0.2s ease',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Creating account...' : 'Sign up'}\r\n </button>\r\n </form>\r\n </ThemeWrapper>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface SignOutProps {\r\n redirectUrl?: string;\r\n}\r\n\r\nexport const SignOut: React.FC<SignOutProps> = ({ redirectUrl }) => {\r\n const { signOut } = useAuth();\r\n\r\n useEffect(() => {\r\n const performSignOut = async () => {\r\n await signOut();\r\n \r\n const redirect = redirectUrl || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_LOGOUT || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_LOGOUT || \r\n '/';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${redirect}`;\r\n };\r\n\r\n performSignOut();\r\n }, [signOut, redirectUrl]);\r\n\r\n return (\r\n <div style={{ textAlign: 'center', padding: '40px' }}>\r\n <div>Signing out...</div>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState, useRef, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\nimport { ThemeWrapper } from './ThemeWrapper';\r\n\r\ninterface UserButtonProps {\r\n showName?: boolean;\r\n appearance?: {\r\n elements?: {\r\n userButtonBox?: React.CSSProperties;\r\n userButtonTrigger?: React.CSSProperties;\r\n userButtonPopoverCard?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const UserButton: React.FC<UserButtonProps> = ({ showName = false, appearance }) => {\r\n const { user, signOut } = useAuth();\r\n const colors = useThemeColors();\r\n const [isOpen, setIsOpen] = useState(false);\r\n const dropdownRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => document.removeEventListener('mousedown', handleClickOutside);\r\n }, []);\r\n\r\n if (!user) return null;\r\n\r\n const getInitials = (name: string) => {\r\n return name\r\n .split(' ')\r\n .map(n => n[0])\r\n .join('')\r\n .toUpperCase()\r\n .slice(0, 2);\r\n };\r\n\r\n const handleSignOut = async () => {\r\n await signOut();\r\n const redirect = process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_LOGOUT || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_LOGOUT || \r\n '/';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${redirect}`;\r\n };\r\n\r\n return (\r\n <ThemeWrapper style={{ position: 'relative', ...appearance?.elements?.userButtonBox }} ref={dropdownRef}>\r\n <button\r\n onClick={() => setIsOpen(!isOpen)}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n padding: '6px',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n borderRadius: '8px',\r\n cursor: 'pointer',\r\n transition: 'background-color 0.2s',\r\n ...appearance?.elements?.userButtonTrigger\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.bgHover;\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent';\r\n }}\r\n >\r\n <div style={{\r\n width: '36px',\r\n height: '36px',\r\n borderRadius: '50%',\r\n backgroundColor: colors.buttonPrimary,\r\n color: colors.textPrimary,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: '14px',\r\n fontWeight: 600\r\n }}>\r\n {getInitials(user.name)}\r\n </div>\r\n {showName && (\r\n <span style={{ fontSize: '14px', fontWeight: 500, color: colors.textPrimary }}>\r\n {user.name}\r\n </span>\r\n )}\r\n </button>\r\n\r\n {isOpen && (\r\n <div style={{\r\n position: 'absolute',\r\n top: '100%',\r\n right: 0,\r\n marginTop: '8px',\r\n width: '240px',\r\n backgroundColor: colors.bgPrimary,\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.15)',\r\n border: `1px solid ${colors.borderPrimary}`,\r\n zIndex: 1000,\r\n ...appearance?.elements?.userButtonPopoverCard\r\n }}>\r\n <div style={{\r\n padding: '16px',\r\n borderBottom: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <div style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '12px'\r\n }}>\r\n <div style={{\r\n width: '48px',\r\n height: '48px',\r\n borderRadius: '50%',\r\n backgroundColor: colors.buttonPrimary,\r\n color: colors.textPrimary,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: '18px',\r\n fontWeight: 600\r\n }}>\r\n {getInitials(user.name)}\r\n </div>\r\n <div style={{ flex: 1, minWidth: 0 }}>\r\n <div style={{\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n color: colors.textPrimary,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap'\r\n }}>\r\n {user.name}\r\n </div>\r\n <div style={{\r\n fontSize: '12px',\r\n color: colors.textTertiary,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap'\r\n }}>\r\n {user.email}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div style={{ padding: '8px' }}>\r\n <button\r\n onClick={handleSignOut}\r\n style={{\r\n width: '100%',\r\n padding: '10px 16px',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n borderRadius: '8px',\r\n textAlign: 'left',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n color: colors.textPrimary,\r\n fontWeight: 500,\r\n transition: 'background-color 0.2s'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.bgHover;\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent';\r\n }}\r\n >\r\n Sign out\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n </ThemeWrapper>\r\n );\r\n};\r\n\r\n","'use client';\r\n\r\nimport React, { ReactNode, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface ProtectedRouteProps {\r\n children: ReactNode;\r\n fallback?: ReactNode;\r\n redirectTo?: string;\r\n}\r\n\r\nexport const ProtectedRoute: React.FC<ProtectedRouteProps> = ({ \r\n children, \r\n fallback,\r\n redirectTo \r\n}) => {\r\n const { isSignedIn, isLoaded } = useAuth();\r\n\r\n useEffect(() => {\r\n if (isLoaded && !isSignedIn) {\r\n const loginPath = redirectTo || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_TO_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_TO_LOGIN || \r\n '/auth/login';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${loginPath}`;\r\n }\r\n }, [isSignedIn, isLoaded, redirectTo]);\r\n\r\n if (!isLoaded) {\r\n return fallback || (\r\n <div style={{ \r\n display: 'flex', \r\n justifyContent: 'center', \r\n alignItems: 'center', \r\n minHeight: '100vh' \r\n }}>\r\n <div>Loading...</div>\r\n </div>\r\n );\r\n }\r\n\r\n if (!isSignedIn) {\r\n return fallback || null;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n","'use client';\r\n\r\nimport React, { ReactNode, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface PublicRouteProps {\r\n children: ReactNode;\r\n redirectTo?: string;\r\n}\r\n\r\nexport const PublicRoute: React.FC<PublicRouteProps> = ({ \r\n children, \r\n redirectTo \r\n}) => {\r\n const { isSignedIn, isLoaded } = useAuth();\r\n\r\n useEffect(() => {\r\n if (isLoaded && isSignedIn) {\r\n const dashboardPath = redirectTo || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_LOGIN || \r\n '/dashboard';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${dashboardPath}`;\r\n }\r\n }, [isSignedIn, isLoaded, redirectTo]);\r\n\r\n if (!isLoaded) {\r\n return (\r\n <div style={{ \r\n display: 'flex', \r\n justifyContent: 'center', \r\n alignItems: 'center', \r\n minHeight: '100vh' \r\n }}>\r\n <div>Loading...</div>\r\n </div>\r\n );\r\n }\r\n\r\n if (isSignedIn) {\r\n return null;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n","'use client';\r\n\r\nimport React, { useEffect, useState } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface VerifyEmailProps {\r\n token?: string;\r\n onSuccess?: () => void;\r\n onError?: (error: string) => void;\r\n}\r\n\r\nexport const VerifyEmail: React.FC<VerifyEmailProps> = ({ token, onSuccess, onError }) => {\r\n const { verifyEmailToken } = useAuth();\r\n const [status, setStatus] = useState<'loading' | 'success' | 'error'>('loading');\r\n const [message, setMessage] = useState('');\r\n\r\n useEffect(() => {\r\n const verify = async () => {\r\n // Get token from URL if not provided\r\n const verifyToken = token || (typeof window !== 'undefined' \r\n ? new URLSearchParams(window.location.search).get('token') \r\n : null);\r\n\r\n if (!verifyToken) {\r\n setStatus('error');\r\n setMessage('No verification token provided');\r\n onError?.('No verification token provided');\r\n return;\r\n }\r\n\r\n try {\r\n const response = await verifyEmailToken(verifyToken);\r\n if (response.success) {\r\n setStatus('success');\r\n setMessage('Email verified successfully! Redirecting...');\r\n onSuccess?.();\r\n \r\n // Redirect after success\r\n setTimeout(() => {\r\n const redirect = process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_VERIFY || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_VERIFY || \r\n '/dashboard';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${redirect}`;\r\n }, 2000);\r\n } else {\r\n setStatus('error');\r\n setMessage(response.message || 'Verification failed');\r\n onError?.(response.message || 'Verification failed');\r\n }\r\n } catch (err) {\r\n setStatus('error');\r\n const errorMsg = err instanceof Error ? err.message : 'An error occurred';\r\n setMessage(errorMsg);\r\n onError?.(errorMsg);\r\n }\r\n };\r\n\r\n verify();\r\n }, [token, verifyEmailToken, onSuccess, onError]);\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '40px auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n textAlign: 'center'\r\n }}>\r\n {status === 'loading' && (\r\n <>\r\n <div style={{\r\n width: '48px',\r\n height: '48px',\r\n margin: '0 auto 20px',\r\n border: '4px solid #f3f3f3',\r\n borderTop: '4px solid #007bff',\r\n borderRadius: '50%',\r\n animation: 'spin 1s linear infinite'\r\n }} />\r\n <style>{`\r\n @keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `}</style>\r\n <h2 style={{\r\n fontSize: '20px',\r\n fontWeight: 600,\r\n color: '#333',\r\n marginBottom: '12px'\r\n }}>\r\n Verifying your email...\r\n </h2>\r\n <p style={{ fontSize: '14px', color: '#666' }}>\r\n Please wait while we verify your email address.\r\n </p>\r\n </>\r\n )}\r\n\r\n {status === 'success' && (\r\n <>\r\n <div style={{\r\n width: '64px',\r\n height: '64px',\r\n margin: '0 auto 20px',\r\n backgroundColor: '#4caf50',\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }}>\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"3\">\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n </div>\r\n <h2 style={{\r\n fontSize: '20px',\r\n fontWeight: 600,\r\n color: '#333',\r\n marginBottom: '12px'\r\n }}>\r\n Email Verified!\r\n </h2>\r\n <p style={{ fontSize: '14px', color: '#666' }}>\r\n {message}\r\n </p>\r\n </>\r\n )}\r\n\r\n {status === 'error' && (\r\n <>\r\n <div style={{\r\n width: '64px',\r\n height: '64px',\r\n margin: '0 auto 20px',\r\n backgroundColor: '#f44336',\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }}>\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"3\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\r\n </svg>\r\n </div>\r\n <h2 style={{\r\n fontSize: '20px',\r\n fontWeight: 600,\r\n color: '#333',\r\n marginBottom: '12px'\r\n }}>\r\n Verification Failed\r\n </h2>\r\n <p style={{ fontSize: '14px', color: '#666', marginBottom: '20px' }}>\r\n {message}\r\n </p>\r\n <button\r\n onClick={() => {\r\n const loginPath = process.env.NEXT_PUBLIC_AUTH_REDIRECT_TO_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_TO_LOGIN || \r\n '/auth/login';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${loginPath}`;\r\n }}\r\n style={{\r\n padding: '10px 20px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n cursor: 'pointer'\r\n }}\r\n >\r\n Go to Login\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface ForgotPasswordProps {\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const ForgotPassword: React.FC<ForgotPasswordProps> = ({ appearance }) => {\r\n const { forgotPassword } = useAuth();\r\n const [email, setEmail] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n const response = await forgotPassword(email);\r\n if (response.success) {\r\n setSuccess('Password reset link sent! Please check your email.');\r\n setEmail('');\r\n } else {\r\n setError(response.message || 'Failed to send reset link');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n ...appearance?.elements?.card\r\n }}>\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '12px',\r\n color: '#1f2937',\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n Forgot password?\r\n </h2>\r\n \r\n <p style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#666',\r\n fontSize: '14px'\r\n }}>\r\n Enter your email address and we'll send you a link to reset your password.\r\n </p>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#fee',\r\n color: '#c33',\r\n border: '1px solid #fcc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#efe',\r\n color: '#3c3',\r\n border: '1px solid #cfc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {success}\r\n </div>\r\n )}\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"email\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Email</label>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n marginBottom: '16px',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Sending...' : 'Send reset link'}\r\n </button>\r\n\r\n <div style={{ textAlign: 'center' }}>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n const loginPath = process.env.NEXT_PUBLIC_AUTH_REDIRECT_TO_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_TO_LOGIN || \r\n '/auth/login';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${loginPath}`;\r\n }}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: '#007bff',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600\r\n }}\r\n >\r\n Back to sign in\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface ResetPasswordProps {\r\n token?: string;\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const ResetPassword: React.FC<ResetPasswordProps> = ({ token, appearance }) => {\r\n const { resetPassword } = useAuth();\r\n const [resetToken, setResetToken] = useState(token || '');\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n useEffect(() => {\r\n // Get token from URL if not provided as prop\r\n if (!resetToken && typeof window !== 'undefined') {\r\n const urlToken = new URLSearchParams(window.location.search).get('token');\r\n if (urlToken) {\r\n setResetToken(urlToken);\r\n }\r\n }\r\n }, [resetToken]);\r\n\r\n const getPasswordStrength = (pwd: string): { strength: 'weak' | 'medium' | 'strong'; color: string } => {\r\n if (!pwd) return { strength: 'weak', color: '#ddd' };\r\n\r\n let score = 0;\r\n if (pwd.length >= 6) score++;\r\n if (pwd.length >= 8) score++;\r\n if (/[a-z]/.test(pwd) && /[A-Z]/.test(pwd)) score++;\r\n if (/\\d/.test(pwd)) score++;\r\n if (/[^a-zA-Z\\d]/.test(pwd)) score++;\r\n\r\n if (score <= 2) return { strength: 'weak', color: '#f44' };\r\n if (score <= 3) return { strength: 'medium', color: '#fa4' };\r\n return { strength: 'strong', color: '#4f4' };\r\n };\r\n\r\n const passwordStrength = getPasswordStrength(password);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n if (password !== confirmPassword) {\r\n setError('Passwords do not match');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n if (password.length < 6) {\r\n setError('Password must be at least 6 characters');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n if (!resetToken) {\r\n setError('Invalid reset token');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n const response = await resetPassword(resetToken, password);\r\n if (response.success) {\r\n setSuccess(true);\r\n setTimeout(() => {\r\n const loginPath = process.env.NEXT_PUBLIC_AUTH_REDIRECT_TO_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_TO_LOGIN || \r\n '/auth/login';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${loginPath}`;\r\n }, 2000);\r\n } else {\r\n setError(response.message || 'Failed to reset password');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n if (success) {\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '40px auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n textAlign: 'center'\r\n }}>\r\n <div style={{\r\n width: '64px',\r\n height: '64px',\r\n margin: '0 auto 20px',\r\n backgroundColor: '#4caf50',\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }}>\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"3\">\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n </div>\r\n <h2 style={{\r\n fontSize: '20px',\r\n fontWeight: 600,\r\n color: '#333',\r\n marginBottom: '12px'\r\n }}>\r\n Password Reset Successful!\r\n </h2>\r\n <p style={{ fontSize: '14px', color: '#666' }}>\r\n Your password has been reset. Redirecting to login...\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n ...appearance?.elements?.card\r\n }}>\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '12px',\r\n color: '#1f2937',\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n Reset your password\r\n </h2>\r\n \r\n <p style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#666',\r\n fontSize: '14px'\r\n }}>\r\n Enter your new password below.\r\n </p>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#fee',\r\n color: '#c33',\r\n border: '1px solid #fcc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div style={{ marginBottom: '20px', position: 'relative' }}>\r\n <label htmlFor=\"password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>New password</label>\r\n <input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n minLength={6}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Enter new password\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n style={{\r\n position: 'absolute',\r\n right: '12px',\r\n top: '38px',\r\n background: 'none',\r\n border: 'none',\r\n cursor: 'pointer',\r\n color: '#666',\r\n fontSize: '14px'\r\n }}\r\n >\r\n {showPassword ? 'Hide' : 'Show'}\r\n </button>\r\n {password && (\r\n <div style={{ marginTop: '8px' }}>\r\n <div style={{\r\n height: '4px',\r\n backgroundColor: '#eee',\r\n borderRadius: '2px',\r\n overflow: 'hidden'\r\n }}>\r\n <div style={{\r\n height: '100%',\r\n width: passwordStrength.strength === 'weak' ? '33%' : passwordStrength.strength === 'medium' ? '66%' : '100%',\r\n backgroundColor: passwordStrength.color,\r\n transition: 'all 0.3s ease'\r\n }} />\r\n </div>\r\n <p style={{\r\n fontSize: '12px',\r\n color: passwordStrength.color,\r\n marginTop: '4px',\r\n textTransform: 'capitalize'\r\n }}>\r\n {passwordStrength.strength} password\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"confirmPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Confirm password</label>\r\n <input\r\n id=\"confirmPassword\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Confirm new password\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Resetting...' : 'Reset password'}\r\n </button>\r\n </form>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface ChangePasswordProps {\r\n onSuccess?: () => void;\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const ChangePassword: React.FC<ChangePasswordProps> = ({ onSuccess, appearance }) => {\r\n const { changePassword } = useAuth();\r\n const [oldPassword, setOldPassword] = useState('');\r\n const [newPassword, setNewPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showPasswords, setShowPasswords] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n const getPasswordStrength = (pwd: string): { strength: 'weak' | 'medium' | 'strong'; color: string } => {\r\n if (!pwd) return { strength: 'weak', color: '#ddd' };\r\n\r\n let score = 0;\r\n if (pwd.length >= 6) score++;\r\n if (pwd.length >= 8) score++;\r\n if (/[a-z]/.test(pwd) && /[A-Z]/.test(pwd)) score++;\r\n if (/\\d/.test(pwd)) score++;\r\n if (/[^a-zA-Z\\d]/.test(pwd)) score++;\r\n\r\n if (score <= 2) return { strength: 'weak', color: '#f44' };\r\n if (score <= 3) return { strength: 'medium', color: '#fa4' };\r\n return { strength: 'strong', color: '#4f4' };\r\n };\r\n\r\n const passwordStrength = getPasswordStrength(newPassword);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(false);\r\n\r\n if (newPassword !== confirmPassword) {\r\n setError('New passwords do not match');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n if (newPassword.length < 6) {\r\n setError('New password must be at least 6 characters');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n const response = await changePassword(oldPassword, newPassword);\r\n if (response.success) {\r\n setSuccess(true);\r\n setOldPassword('');\r\n setNewPassword('');\r\n setConfirmPassword('');\r\n onSuccess?.();\r\n } else {\r\n setError(response.message || 'Failed to change password');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n ...appearance?.elements?.card\r\n }}>\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#1f2937',\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n Change Password\r\n </h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#fee',\r\n color: '#c33',\r\n border: '1px solid #fcc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#efe',\r\n color: '#3c3',\r\n border: '1px solid #cfc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n Password changed successfully!\r\n </div>\r\n )}\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"oldPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Current password</label>\r\n <input\r\n id=\"oldPassword\"\r\n type={showPasswords ? 'text' : 'password'}\r\n value={oldPassword}\r\n onChange={(e) => setOldPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Enter current password\"\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"newPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>New password</label>\r\n <input\r\n id=\"newPassword\"\r\n type={showPasswords ? 'text' : 'password'}\r\n value={newPassword}\r\n onChange={(e) => setNewPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n minLength={6}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Enter new password\"\r\n />\r\n {newPassword && (\r\n <div style={{ marginTop: '8px' }}>\r\n <div style={{\r\n height: '4px',\r\n backgroundColor: '#eee',\r\n borderRadius: '2px',\r\n overflow: 'hidden'\r\n }}>\r\n <div style={{\r\n height: '100%',\r\n width: passwordStrength.strength === 'weak' ? '33%' : passwordStrength.strength === 'medium' ? '66%' : '100%',\r\n backgroundColor: passwordStrength.color,\r\n transition: 'all 0.3s ease'\r\n }} />\r\n </div>\r\n <p style={{\r\n fontSize: '12px',\r\n color: passwordStrength.color,\r\n marginTop: '4px',\r\n textTransform: 'capitalize'\r\n }}>\r\n {passwordStrength.strength} password\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"confirmPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Confirm new password</label>\r\n <input\r\n id=\"confirmPassword\"\r\n type={showPasswords ? 'text' : 'password'}\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Confirm new password\"\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label style={{ display: 'flex', alignItems: 'center', cursor: 'pointer' }}>\r\n <input\r\n type=\"checkbox\"\r\n checked={showPasswords}\r\n onChange={(e) => setShowPasswords(e.target.checked)}\r\n style={{ marginRight: '8px' }}\r\n />\r\n <span style={{ fontSize: '14px', color: '#666' }}>Show passwords</span>\r\n </label>\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Changing password...' : 'Change password'}\r\n </button>\r\n </form>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\nimport { PhoneInput } from './PhoneInput';\r\nimport { AvatarUploader } from './AvatarUploader';\r\n\r\ninterface UserProfileProps {\r\n showAvatar?: boolean;\r\n showEmailChange?: boolean;\r\n showPasswordChange?: boolean;\r\n upfilesConfig?: {\r\n baseUrl: string;\r\n apiKey?: string;\r\n apiKeyHeader?: 'authorization' | 'x-api-key' | 'x-up-api-key';\r\n presignUrl?: string;\r\n presignPath?: string;\r\n folderPath?: string;\r\n projectId?: string;\r\n };\r\n}\r\n\r\nexport const UserProfile: React.FC<UserProfileProps> = ({\r\n showAvatar = true,\r\n showEmailChange = true,\r\n showPasswordChange = true,\r\n upfilesConfig,\r\n}) => {\r\n const { user, updateProfile, requestEmailChange } = useAuth();\r\n const colors = useThemeColors();\r\n const [name, setName] = useState(user?.name || '');\r\n const [phoneNumber, setPhoneNumber] = useState(user?.phoneNumber || '');\r\n const [newEmail, setNewEmail] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n const handleUpdateProfile = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n const updates: { name?: string; phoneNumber?: string } = {};\r\n \r\n if (name !== user?.name) {\r\n updates.name = name;\r\n }\r\n\r\n if (phoneNumber !== user?.phoneNumber) {\r\n updates.phoneNumber = phoneNumber;\r\n }\r\n\r\n if (Object.keys(updates).length === 0) {\r\n setError('No changes to save');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n const response = await updateProfile(updates);\r\n if (response.success) {\r\n setSuccess('Profile updated successfully!');\r\n } else {\r\n setError(response.message || 'Failed to update profile');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const handleAvatarUploadComplete = (avatarUrl: string) => {\r\n setSuccess('Avatar updated successfully!');\r\n };\r\n\r\n const handleAvatarUploadError = (error: Error) => {\r\n setError(error.message || 'Failed to upload avatar');\r\n };\r\n\r\n const handleRequestEmailChange = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n const response = await requestEmailChange(newEmail);\r\n if (response.success) {\r\n setSuccess('Verification email sent! Please check your inbox.');\r\n setNewEmail('');\r\n } else {\r\n setError(response.message || 'Failed to request email change');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n if (!user) return null;\r\n\r\n return (\r\n <div style={{ maxWidth: '700px', margin: '0 auto', padding: '20px' }}>\r\n <h2 style={{ marginBottom: '24px', fontSize: '24px', fontWeight: 600, color: colors.textPrimary }}>Profile Settings</h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.errorBg,\r\n color: colors.errorText,\r\n border: `1px solid ${colors.errorBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.successBg,\r\n color: colors.successText,\r\n border: `1px solid ${colors.successBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {success}\r\n </div>\r\n )}\r\n\r\n {/* Profile Information Form */}\r\n <div style={{\r\n padding: '24px',\r\n backgroundColor: colors.bgPrimary,\r\n borderRadius: '12px',\r\n boxShadow: '0 2px 8px rgba(0,0,0,0.1)',\r\n marginBottom: '24px',\r\n border: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <h3 style={{ marginBottom: '20px', fontSize: '18px', fontWeight: 600, color: colors.textPrimary }}>Profile Information</h3>\r\n <form onSubmit={handleUpdateProfile}>\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"name\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Full Name</label>\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease'\r\n }}\r\n placeholder=\"Manish Batra\"\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"phoneNumber\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Phone Number</label>\r\n <PhoneInput\r\n id=\"phoneNumber\"\r\n value={phoneNumber}\r\n onChange={setPhoneNumber}\r\n disabled={isLoading}\r\n placeholder=\"1234567890\"\r\n />\r\n </div>\r\n\r\n {showAvatar && upfilesConfig && (\r\n <div style={{ marginBottom: '20px' }}>\r\n <label style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Avatar</label>\r\n {user?.avatar && (\r\n <div style={{ marginBottom: '12px' }}>\r\n <img \r\n src={user.avatar} \r\n alt=\"Current avatar\" \r\n style={{\r\n width: '80px',\r\n height: '80px',\r\n borderRadius: '50%',\r\n objectFit: 'cover',\r\n border: `2px solid ${colors.borderSecondary}`\r\n }}\r\n />\r\n </div>\r\n )}\r\n <AvatarUploader\r\n upfilesConfig={upfilesConfig}\r\n onUploadComplete={handleAvatarUploadComplete}\r\n onError={handleAvatarUploadError}\r\n maxFileSize={5 * 1024 * 1024}\r\n accept={['image/*']}\r\n />\r\n </div>\r\n )}\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n onMouseEnter={(e) => {\r\n if (!isLoading) {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimaryHover;\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimary;\r\n }}\r\n style={{\r\n padding: '12px 24px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n cursor: isLoading ? 'not-allowed' : 'pointer',\r\n opacity: isLoading ? 0.6 : 1,\r\n transition: 'all 0.2s ease'\r\n }}\r\n >\r\n {isLoading ? 'Saving...' : 'Save Changes'}\r\n </button>\r\n </form>\r\n </div>\r\n\r\n {/* Change Email Form */}\r\n {showEmailChange && (\r\n <div style={{\r\n padding: '24px',\r\n backgroundColor: colors.bgPrimary,\r\n borderRadius: '12px',\r\n boxShadow: '0 2px 8px rgba(0,0,0,0.1)',\r\n marginBottom: '20px',\r\n border: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <h3 style={{ marginBottom: '16px', fontSize: '18px', fontWeight: 600, color: colors.textPrimary }}>Change Email</h3>\r\n <p style={{ fontSize: '14px', color: colors.textSecondary, marginBottom: '16px' }}>\r\n Current email: <strong>{user.email}</strong>\r\n </p>\r\n <form onSubmit={handleRequestEmailChange}>\r\n <div style={{ marginBottom: '16px' }}>\r\n <label htmlFor=\"newEmail\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>New Email Address</label>\r\n <input\r\n id=\"newEmail\"\r\n type=\"email\"\r\n value={newEmail}\r\n onChange={(e) => setNewEmail(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease'\r\n }}\r\n placeholder=\"newemail@example.com\"\r\n />\r\n </div>\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n onMouseEnter={(e) => {\r\n if (!isLoading) {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimaryHover;\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimary;\r\n }}\r\n style={{\r\n padding: '12px 24px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n cursor: isLoading ? 'not-allowed' : 'pointer',\r\n opacity: isLoading ? 0.6 : 1,\r\n transition: 'all 0.2s ease'\r\n }}\r\n >\r\n {isLoading ? 'Sending...' : 'Request Email Change'}\r\n </button>\r\n </form>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { ImageManager } from '@thetechfossil/upfiles';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\nexport interface AvatarUploaderProps {\r\n onUploadComplete?: (avatarUrl: string) => void;\r\n onError?: (error: Error) => void;\r\n className?: string;\r\n buttonClassName?: string;\r\n dropzoneClassName?: string;\r\n maxFileSize?: number;\r\n accept?: string[];\r\n upfilesConfig: {\r\n baseUrl: string;\r\n apiKey?: string;\r\n apiKeyHeader?: 'authorization' | 'x-api-key' | 'x-up-api-key';\r\n presignUrl?: string;\r\n presignPath?: string;\r\n folderPath?: string;\r\n projectId?: string;\r\n };\r\n buttonText?: string;\r\n}\r\n\r\n/**\r\n * AvatarUploader Component\r\n * \r\n * A ready-to-use component for uploading user avatars using the upfiles SDK.\r\n * Opens an ImageManager dialog for uploading and selecting images.\r\n * Automatically updates the user's avatar in the auth system after selection.\r\n * \r\n * @example\r\n * ```tsx\r\n * <AvatarUploader\r\n * upfilesConfig={{\r\n * baseUrl: process.env.NEXT_PUBLIC_UPFILES_APP_URL!,\r\n * apiKey: process.env.NEXT_PUBLIC_UPFILES_API_KEY!,\r\n * apiKeyHeader: 'authorization',\r\n * folderPath: 'avatars/',\r\n * projectId: 'proj_123'\r\n * }}\r\n * onUploadComplete={(url) => console.log('Avatar uploaded:', url)}\r\n * onError={(err) => console.error('Upload failed:', err)}\r\n * buttonText=\"Upload Avatar\"\r\n * />\r\n * ```\r\n */\r\nexport const AvatarUploader: React.FC<AvatarUploaderProps> = ({\r\n onUploadComplete,\r\n onError,\r\n className,\r\n buttonClassName,\r\n maxFileSize = 5 * 1024 * 1024, // 5MB default\r\n upfilesConfig,\r\n buttonText = 'Upload Avatar',\r\n}) => {\r\n const { uploadAndUpdateAvatar } = useAuth();\r\n const [open, setOpen] = useState(false);\r\n const [uploading, setUploading] = useState(false);\r\n\r\n const handleSelect = async (image: {\r\n url: string;\r\n key: string;\r\n originalName: string;\r\n size: number;\r\n contentType: string;\r\n }) => {\r\n setUploading(true);\r\n try {\r\n // Fetch the image as a blob and convert to File\r\n const response = await fetch(image.url);\r\n const blob = await response.blob();\r\n const file = new File([blob], image.originalName, { type: image.contentType });\r\n \r\n const result = await uploadAndUpdateAvatar(file);\r\n \r\n if (result.success && result.user?.avatar) {\r\n onUploadComplete?.(result.user.avatar);\r\n setOpen(false);\r\n } else {\r\n throw new Error(result.message || 'Failed to update avatar');\r\n }\r\n } catch (error) {\r\n const err = error instanceof Error ? error : new Error('Upload failed');\r\n onError?.(err);\r\n } finally {\r\n setUploading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className={className}>\r\n <button\r\n type=\"button\"\r\n onClick={() => setOpen(true)}\r\n disabled={uploading}\r\n className={buttonClassName || 'px-4 py-2 text-sm rounded border bg-blue-600 text-white hover:bg-blue-700 disabled:opacity-50'}\r\n >\r\n {uploading ? 'Uploading...' : buttonText}\r\n </button>\r\n\r\n <ImageManager\r\n open={open}\r\n onOpenChange={setOpen}\r\n clientOptions={{\r\n baseUrl: upfilesConfig.baseUrl,\r\n apiKey: upfilesConfig.apiKey,\r\n apiKeyHeader: upfilesConfig.apiKeyHeader || 'authorization',\r\n presignUrl: upfilesConfig.presignUrl,\r\n presignPath: upfilesConfig.presignPath,\r\n }}\r\n projectId={upfilesConfig.projectId}\r\n folderPath={upfilesConfig.folderPath || 'avatars/'}\r\n title=\"Select Avatar\"\r\n description=\"Upload a new avatar or select from existing images.\"\r\n mode=\"full\"\r\n maxFileSize={maxFileSize}\r\n maxFiles={1}\r\n autoRecordToDb={true}\r\n fetchThumbnails={true}\r\n onSelect={handleSelect}\r\n />\r\n </div>\r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { ImageManager } from '@thetechfossil/upfiles';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\nexport interface AvatarManagerProps {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n onAvatarUpdated?: (avatarUrl: string) => void;\r\n onError?: (error: Error) => void;\r\n title?: string;\r\n description?: string;\r\n className?: string;\r\n gridClassName?: string;\r\n maxFileSize?: number;\r\n mode?: 'full' | 'browse' | 'upload';\r\n showDelete?: boolean;\r\n upfilesConfig: {\r\n baseUrl: string;\r\n apiKey?: string;\r\n apiKeyHeader?: 'authorization' | 'x-api-key' | 'x-up-api-key';\r\n presignUrl?: string;\r\n presignPath?: string;\r\n folderPath?: string;\r\n };\r\n}\r\n\r\n/**\r\n * AvatarManager Component\r\n * \r\n * A comprehensive avatar management component that allows users to:\r\n * - Browse existing uploaded images\r\n * - Upload new avatar images\r\n * - Select and set an avatar\r\n * \r\n * Uses the ImageManager from @thetechfossil/upfiles for a complete image management experience.\r\n * \r\n * @example\r\n * ```tsx\r\n * const [open, setOpen] = useState(false);\r\n * \r\n * <button onClick={() => setOpen(true)}>Change Avatar</button>\r\n * \r\n * <AvatarManager\r\n * open={open}\r\n * onOpenChange={setOpen}\r\n * upfilesConfig={{\r\n * baseUrl: process.env.NEXT_PUBLIC_UPFILES_APP_URL!,\r\n * apiKey: process.env.NEXT_PUBLIC_UPFILES_API_KEY!,\r\n * apiKeyHeader: 'authorization',\r\n * folderPath: 'avatars/'\r\n * }}\r\n * onAvatarUpdated={(url) => console.log('Avatar updated:', url)}\r\n * onError={(err) => console.error('Error:', err)}\r\n * />\r\n * ```\r\n */\r\nexport const AvatarManager: React.FC<AvatarManagerProps> = ({\r\n open,\r\n onOpenChange,\r\n onAvatarUpdated,\r\n onError,\r\n title = 'Select Avatar',\r\n description = 'Choose an existing image or upload a new one',\r\n className,\r\n gridClassName,\r\n maxFileSize = 5 * 1024 * 1024, // 5MB default\r\n mode = 'full',\r\n showDelete = false,\r\n upfilesConfig,\r\n}) => {\r\n const { updateProfile } = useAuth();\r\n const [updating, setUpdating] = useState(false);\r\n\r\n const handleSelect = async (image: any) => {\r\n setUpdating(true);\r\n try {\r\n const response = await updateProfile({ avatar: image.url });\r\n \r\n if (response.success && response.user?.avatar) {\r\n onAvatarUpdated?.(response.user.avatar);\r\n onOpenChange(false);\r\n } else {\r\n throw new Error(response.message || 'Failed to update avatar');\r\n }\r\n } catch (error) {\r\n const err = error instanceof Error ? error : new Error('Failed to update avatar');\r\n onError?.(err);\r\n } finally {\r\n setUpdating(false);\r\n }\r\n };\r\n\r\n return (\r\n <ImageManager\r\n open={open}\r\n onOpenChange={onOpenChange}\r\n clientOptions={{\r\n baseUrl: upfilesConfig.baseUrl,\r\n apiKey: upfilesConfig.apiKey,\r\n apiKeyHeader: upfilesConfig.apiKeyHeader || 'authorization',\r\n presignUrl: upfilesConfig.presignUrl,\r\n presignPath: upfilesConfig.presignPath,\r\n }}\r\n folderPath={upfilesConfig.folderPath || 'avatars/'}\r\n title={title}\r\n description={description}\r\n className={className}\r\n gridClassName={gridClassName}\r\n onSelect={handleSelect}\r\n maxFileSize={maxFileSize}\r\n mode={mode}\r\n showDelete={showDelete}\r\n fetchThumbnails={true}\r\n />\r\n );\r\n};\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/react/components/LoginForm.tsx","../src/react/use-auth.ts","../src/core/http-client.ts","../src/core/auth-service.ts","../src/react/ThemeContext.tsx","../src/react/hooks/useThemeColors.ts","../src/react/components/PhoneInput.tsx","../src/react/components/RegisterForm.tsx","../src/react/components/OtpForm.tsx","../src/react/components/AuthFlow.tsx","../src/react/components/EmailVerificationPage.tsx","../src/react/components/SignIn.tsx","../src/react/AuthProvider.tsx","../src/react/components/ThemeWrapper.tsx","../src/react/components/SignUp.tsx","../src/react/components/SignOut.tsx","../src/react/components/UserButton.tsx","../src/react/components/ProtectedRoute.tsx","../src/react/components/PublicRoute.tsx","../src/react/components/VerifyEmail.tsx","../src/react/components/ForgotPassword.tsx","../src/react/components/ResetPassword.tsx","../src/react/components/ChangePassword.tsx","../src/react/components/UserProfile.tsx","../src/react/components/AvatarUploader.tsx","../src/react/components/AvatarManager.tsx"],"names":["useState","useEffect","React","jsx","jsxs","email","createContext","useContext","useCallback","useAuth","colors","Fragment","error","ImageManager"],"mappings":";;;;;;;;;;AAEA,SAAgB,YAAAA,iBAAgB;;;ACFhC,SAAS,UAAU,WAAW,mBAAmB;;;ACAjD,OAAO,WAA8D;AAE9D,IAAM,aAAN,MAAiB;AAAA,EAMtB,YAAY,SAAiB,iBAAyC,CAAC,GAAG;AAJ1E,SAAQ,YAA2B;AACnC,SAAQ,kBAAiC;AAIvC,SAAK,UAAU,QAAQ,QAAQ,OAAO,EAAE;AAExC,SAAK,gBAAgB,MAAM,OAAO;AAAA,MAChC,SAAS,KAAK;AAAA,MACd,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAG;AAAA,MACL;AAAA,MACA,iBAAiB;AAAA;AAAA,MACjB,SAAS;AAAA;AAAA,IACX,CAAC;AAGD,SAAK,cAAc,aAAa,QAAQ;AAAA,MACtC,OAAO,WAAW;AAEhB,cAAM,oBAAoB,CAAC,QAAQ,OAAO,UAAU,OAAO,EAAE,SAAS,OAAO,QAAQ,YAAY,KAAK,EAAE;AACxG,YAAI,qBAAqB,CAAC,KAAK,aAAa,OAAO,WAAW,aAAa;AACzE,cAAI;AACF,kBAAM,KAAK,iBAAiB;AAAA,UAC9B,SAAS,OAAP;AACA,oBAAQ,KAAK,+BAA+B,KAAK;AAAA,UACnD;AAAA,QACF;AAGA,YAAI,KAAK,aAAa,mBAAmB;AACvC,iBAAO,QAAQ,cAAc,IAAI,KAAK;AAAA,QACxC;AAGA,YAAI,KAAK,iBAAiB;AACxB,iBAAO,QAAQ,gBAAgB,IAAI,KAAK;AAAA,QAC1C;AAEA,eAAO;AAAA,MACT;AAAA,MACA,CAAC,UAAU,QAAQ,OAAO,KAAK;AAAA,IACjC;AAGA,SAAK,cAAc,aAAa,SAAS;AAAA,MACvC,CAAC,aAAa;AAAA,MACd,OAAO,UAAsB;AAC3B,cAAM,kBAAkB,MAAM;AAG9B,YAAI,MAAM,UAAU,WAAW,OAAO,CAAC,gBAAgB,QAAQ;AAC7D,0BAAgB,SAAS;AAEzB,cAAI;AACF,kBAAM,KAAK,iBAAiB;AAC5B,gBAAI,gBAAgB,SAAS;AAC3B,8BAAgB,QAAQ,cAAc,IAAI,KAAK;AAAA,YACjD;AACA,mBAAO,KAAK,cAAc,eAAe;AAAA,UAC3C,SAAS,cAAP;AACA,mBAAO,QAAQ,OAAO,YAAY;AAAA,UACpC;AAAA,QACF;AAEA,eAAO,QAAQ,OAAO,KAAK;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,IAAO,UAAkB,SAA8C;AAClF,UAAM,WAAW,MAAM,KAAK,cAAc,IAAO,UAAU,EAAE,QAAQ,CAAC;AACtE,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAa,KAAQ,UAAkB,MAAY,SAA8C;AAC/F,UAAM,WAAW,MAAM,KAAK,cAAc,KAAQ,UAAU,MAAM,EAAE,QAAQ,CAAC;AAC7E,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAa,IAAO,UAAkB,MAAY,SAA8C;AAC9F,UAAM,WAAW,MAAM,KAAK,cAAc,IAAO,UAAU,MAAM,EAAE,QAAQ,CAAC;AAC5E,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAa,OAAU,UAAkB,SAA8C;AACrF,UAAM,WAAW,MAAM,KAAK,cAAc,OAAU,UAAU,EAAE,QAAQ,CAAC;AACzE,WAAO,SAAS;AAAA,EAClB;AAAA,EAEO,aAAa,OAAqB;AACvC,SAAK,cAAc,SAAS,QAAQ,OAAO,eAAe,IAAI,UAAU;AAAA,EAC1E;AAAA,EAEO,kBAAwB;AAC7B,WAAO,KAAK,cAAc,SAAS,QAAQ,OAAO,eAAe;AAAA,EACnE;AAAA,EAEO,aAAa,OAAqB;AACvC,SAAK,YAAY;AAAA,EACnB;AAAA,EAEO,eAA8B;AACnC,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,kBAAwB;AAC7B,SAAK,YAAY;AAAA,EACnB;AAAA,EAEO,mBAAmB,KAAmB;AAC3C,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEO,qBAAoC;AACzC,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,wBAA8B;AACnC,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,MAAc,mBAAkC;AAC9C,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,cAAc,IAA2B,yBAAyB;AAC9F,WAAK,YAAY,SAAS,KAAK;AAAA,IACjC,SAAS,OAAP;AACA,cAAQ,MAAM,iCAAiC,KAAK;AACpD,YAAM;AAAA,IACR;AAAA,EACF;AACF;;;AC5HA,SAAS,qBAAqB;AAEvB,IAAM,cAAN,MAAkB;AAAA,EAMvB,YAAY,QAAoB;AAHhC,SAAQ,QAAuB;AAC/B,SAAQ,gBAAsC;AAG5C,SAAK,SAAS;AAAA,MACZ,iBAAiB;AAAA,MACjB,aAAa;AAAA,MACb,GAAG;AAAA,IACL;AAEA,SAAK,aAAa,IAAI,WAAW,KAAK,OAAO,OAAO;AACpD,SAAK,qBAAqB;AAG1B,QAAI,KAAK,OAAO,eAAe;AAC7B,WAAK,gBAAgB,IAAI,cAAc;AAAA,QACrC,SAAS,KAAK,OAAO,cAAc;AAAA,QACnC,QAAQ,KAAK,OAAO,cAAc;AAAA,QAClC,cAAc,KAAK,OAAO,cAAc;AAAA,QACxC,YAAY,KAAK,OAAO,cAAc;AAAA,QACtC,aAAa,KAAK,OAAO,cAAc;AAAA,MACzC,CAAC;AAAA,IACH;AAGA,QAAI,OAAO,WAAW,aAAa;AACjC,YAAM,kBACJ,QAAQ,IAAI,iCACZ,QAAQ,IAAI,+BACZ,QAAQ,IAAI,uBACZ,OAAO,SAAS;AAElB,UAAI,iBAAiB;AACnB,aAAK,WAAW,mBAAmB,eAAe;AAAA,MACpD;AAAA,IACF;AAAA,EAIF;AAAA,EAEQ,uBAA6B;AACnC,QAAI,OAAO,WAAW,eAAe,KAAK,OAAO,iBAAiB;AAChE,UAAI;AACF,cAAM,QAAQ,aAAa,QAAQ,KAAK,OAAO,eAAe;AAC9D,YAAI,OAAO;AACT,eAAK,QAAQ;AACb,eAAK,WAAW,aAAa,KAAK;AAAA,QACpC;AAAA,MACF,SAAS,OAAP;AACA,gBAAQ,KAAK,sCAAsC,KAAK;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,mBAAmB,OAAqB;AAC9C,QAAI,OAAO,WAAW,eAAe,KAAK,OAAO,iBAAiB;AAChE,UAAI;AACF,qBAAa,QAAQ,KAAK,OAAO,iBAAiB,KAAK;AAAA,MACzD,SAAS,OAAP;AACA,gBAAQ,KAAK,oCAAoC,KAAK;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,yBAA+B;AACrC,QAAI,OAAO,WAAW,eAAe,KAAK,OAAO,iBAAiB;AAChE,UAAI;AACF,qBAAa,WAAW,KAAK,OAAO,eAAe;AAAA,MACrD,SAAS,OAAP;AACA,gBAAQ,KAAK,wCAAwC,KAAK;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAAA,EAEO,kBAA2B;AAChC,WAAO,CAAC,CAAC,KAAK;AAAA,EAChB;AAAA,EAEO,WAA0B;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,iBAA8B;AACnC,QAAI,CAAC,KAAK;AAAO,aAAO;AAExB,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,KAAK,KAAK,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC;AACzD,aAAO,QAAQ,QAAQ;AAAA,IACzB,SAAS,OAAP;AACA,cAAQ,MAAM,oCAAoC,KAAK;AACvD,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,MAAa,mBAAkC;AAC7C,QAAI,CAAC,KAAK,OAAO;AAAa;AAE9B,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,WAAW,IAAuB,yBAAyB;AACvF,UAAI,SAAS,WAAW;AACtB,aAAK,WAAW,aAAa,SAAS,SAAS;AAAA,MACjD;AAAA,IACF,SAAS,OAAP;AACA,cAAQ,MAAM,6BAA6B,KAAK;AAAA,IAClD;AAAA,EACF;AAAA,EAEO,eAA8B;AACnC,WAAO,KAAK,WAAW,aAAa;AAAA,EACtC;AAAA;AAAA,EAGO,eAAe,UAA+B;AACnD,QAAI,OAAO,WAAW,aAAa;AACjC,YAAM,IAAI,MAAM,uDAAuD;AAAA,IACzE;AAEA,UAAM,WAAW,GAAG,KAAK,OAAO,6BAA6B;AAC7D,WAAO,SAAS,OAAO;AAAA,EACzB;AAAA,EAEO,kBAAkB,UAA+B;AACtD,QAAI,OAAO,WAAW,aAAa;AACjC,YAAM,IAAI,MAAM,yDAAyD;AAAA,IAC3E;AAEA,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AAEA,UAAM,UAAU,GAAG,KAAK,OAAO,6BAA6B;AAC5D,WAAO,SAAS,OAAO;AAAA,EACzB;AAAA,EAEA,MAAa,oBAAoB,UAAgD;AAC/E,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW;AAAA,MACrC,sBAAsB;AAAA,IACxB;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAa,MAAM,MAAwC;AACzD,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,sBAAsB,IAAI;AAEpF,QAAI,SAAS,WAAW,SAAS,OAAO;AACtC,WAAK,QAAQ,SAAS;AACtB,WAAK,WAAW,aAAa,SAAS,KAAK;AAC3C,WAAK,mBAAmB,SAAS,KAAK;AACtC,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,YAAY,SAAS,YAAY,6BAA6B,SAAS,YAAY,mCAAmC;AACjI,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,WAAW,SAAS,YAAY,gCAAgC,SAAS,OAAO;AAC3F,WAAK,QAAQ,SAAS;AACtB,WAAK,WAAW,aAAa,SAAS,KAAK;AAC3C,WAAK,mBAAmB,SAAS,KAAK;AACtC,aAAO;AAAA,IACT;AAEA,UAAM,IAAI,MAAM,SAAS,WAAW,cAAc;AAAA,EACpD;AAAA,EAEA,MAAa,SAAS,MAA2C;AAE/D,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,yBAAyB,IAAI;AAEvF,QAAI,SAAS,WAAW,SAAS,YAAY,8EAA8E;AACzH,aAAO;AAAA,IACT;AAEA,UAAM,IAAI,MAAM,SAAS,WAAW,qBAAqB;AAAA,EAC3D;AAAA,EAEA,MAAa,OAAO,MAAyC;AAC3D,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,uBAAuB,IAAI;AAErF,QAAI,SAAS,WAAW,SAAS,OAAO;AACtC,WAAK,QAAQ,SAAS;AACtB,WAAK,WAAW,aAAa,SAAS,KAAK;AAC3C,WAAK,mBAAmB,SAAS,KAAK;AAAA,IACxC;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,iBAAiB,OAAsC;AAClE,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,WAAW,IAAkB,mCAAmC,OAAO;AAEnG,UAAI,SAAS,WAAW,SAAS,OAAO;AACtC,aAAK,QAAQ,SAAS;AACtB,aAAK,WAAW,aAAa,SAAS,KAAK;AAC3C,aAAK,mBAAmB,SAAS,KAAK;AAAA,MACxC;AAEA,aAAO;AAAA,IACT,SAAS,OAAP;AAEA,UAAI,MAAM,UAAU,MAAM;AACxB,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS,MAAM,SAAS,KAAK,WAAW;AAAA,QAC1C;AAAA,MACF;AAGA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,MAAM,WAAW;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,SAAwB;AAEnC,QAAI;AACF,YAAM,KAAK,WAAW,KAAK,uBAAuB,CAAC,CAAC;AAAA,IACtD,SAAS,OAAP;AACA,cAAQ,KAAK,mCAAmC,KAAK;AAAA,IACvD;AAEA,SAAK,QAAQ;AACb,SAAK,WAAW,gBAAgB;AAChC,SAAK,WAAW,gBAAgB;AAChC,SAAK,uBAAuB;AAAA,EAC9B;AAAA,EAEA,MAAa,aAA4B;AACvC,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,IAAoB,iBAAiB;AAC5E,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAa,cAAc,MAA6C;AACtE,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,+BAA+B,IAAI;AAE7F,QAAI,SAAS,WAAW,SAAS,OAAO;AACtC,WAAK,QAAQ,SAAS;AACtB,WAAK,WAAW,aAAa,SAAS,KAAK;AAC3C,WAAK,mBAAmB,SAAS,KAAK;AAAA,IACxC;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,cAA+B;AAC1C,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,IAAuB,kBAAkB;AAChF,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAa,YAAY,IAA2B;AAClD,UAAM,WAAW,MAAM,KAAK,WAAW,IAAoB,gBAAgB,IAAI;AAC/E,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAa,eAAe,OAAsC;AAEhE,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,gCAAgC,EAAE,MAAM,CAAC;AACnG,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,cAAc,OAAe,UAAyC;AACjF,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,+BAA+B,EAAE,OAAO,SAAS,CAAC;AAC5G,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,eAAe,aAAqB,aAA4C;AAC3F,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,gCAAgC;AAAA,MACxF;AAAA,MACA;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,aAAa,QAAuC;AAC/D,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,+BAA+B,EAAE,OAAO,CAAC;AAEnG,QAAI,SAAS,WAAW,SAAS,OAAO;AACtC,WAAK,QAAQ,SAAS;AACtB,WAAK,WAAW,aAAa,SAAS,KAAK;AAC3C,WAAK,mBAAmB,SAAS,KAAK;AAAA,IACxC;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,sBAAsB,MAAmC;AACpE,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,QAAI,CAAC,KAAK,eAAe;AACvB,YAAM,IAAI,MAAM,gFAAgF;AAAA,IAClG;AAEA,QAAI;AAEF,YAAM,aAAa,KAAK,OAAO,eAAe,cAAc;AAC5D,YAAM,eAAe,MAAM,KAAK,cAAc,OAAO,MAAM;AAAA,QACzD;AAAA,QACA,iBAAiB;AAAA,MACnB,CAAC;AAGD,YAAM,WAAW,MAAM,KAAK,aAAa,aAAa,SAAS;AAE/D,aAAO;AAAA,IACT,SAAS,OAAP;AACA,YAAM,IAAI,MAAM,4BAA4B,MAAM,WAAW,iBAAiB;AAAA,IAChF;AAAA,EACF;AAAA,EAEO,mBAAyC;AAC9C,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAa,mBAAmB,UAAyC;AACvE,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,qCAAqC;AAAA,MAC7F;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,kBAAkB,OAAsC;AACnE,UAAM,WAAW,MAAM,KAAK,WAAW,IAAkB,0CAA0C,OAAO;AAE1G,QAAI,SAAS,WAAW,SAAS,OAAO;AACtC,WAAK,QAAQ,SAAS;AACtB,WAAK,WAAW,aAAa,SAAS,KAAK;AAC3C,WAAK,mBAAmB,SAAS,KAAK;AAAA,IACxC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAa,cAAgG;AAC3G,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW;AAAA,MACrC;AAAA,MACA,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,UAAU,OAAsC;AAC3D,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,sBAAsB,EAAE,MAAM,CAAC;AACzF,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,WAAW,OAAsC;AAC5D,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,uBAAuB,EAAE,MAAM,CAAC;AAC1F,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,YAAY,OAAsC;AAC7D,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,wBAAwB,EAAE,MAAM,CAAC;AAC3F,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAa,cAA8D;AACzE,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,IAA2C,kBAAkB;AACpG,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,cAAc,WAA0C;AACnE,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,OAAqB,oBAAoB,WAAW;AAC3F,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,oBAA2C;AACtD,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,OAAqB,6BAA6B;AAGzF,SAAK,QAAQ;AACb,SAAK,WAAW,gBAAgB;AAChC,SAAK,uBAAuB;AAE5B,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAa,aAAa,SAA2D;AACnF,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW;AAAA,MACrC;AAAA,MACA;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,gBAAgB,QAAuC;AAClE,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,6BAA6B,UAAU,CAAC,CAAC;AACnG,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,wBAAwB,QAAuC;AAC1E,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,sCAAsC,UAAU,CAAC,CAAC;AAC5G,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,iBAAiB,QAAuC;AACnE,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,8BAA8B,UAAU,CAAC,CAAC;AACpG,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,kBAAkB,QAAuC;AACpE,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAEA,UAAM,WAAW,MAAM,KAAK,WAAW,KAAmB,+BAA+B,UAAU,CAAC,CAAC;AACrG,WAAO;AAAA,EACT;AACF;;;AF/dO,IAAM,UAAU,CAAC,WAA0C;AAChE,QAAM,CAAC,WAAW,IAAI,SAAsB,MAAM,IAAI,YAAY,MAAM,CAAC;AACzE,QAAM,CAAC,MAAM,OAAO,IAAI,SAAsB,IAAI;AAClD,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAkB,KAAK;AACrE,QAAM,CAAC,SAAS,UAAU,IAAI,SAAkB,IAAI;AAEpD,QAAM,kBAAkB,YAAY,MAAM;AACxC,UAAM,gBAAgB,YAAY,gBAAgB;AAClD,uBAAmB,aAAa;AAEhC,QAAI,eAAe;AACjB,YAAM,cAAc,YAAY,eAAe;AAC/C,cAAQ,WAAW;AAAA,IACrB,OAAO;AACL,cAAQ,IAAI;AAAA,IACd;AAEA,eAAW,KAAK;AAAA,EAClB,GAAG,CAAC,WAAW,CAAC;AAEhB,YAAU,MAAM;AACd,oBAAgB;AAAA,EAClB,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,WAAW,YAAY,OAAO,SAA8C;AAChF,eAAW,IAAI;AACf,QAAI;AAEF,YAAM,WAAW,MAAM,YAAY,SAAS,IAAI;AAChD,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,QAAQ,YAAY,OAAO,SAA2C;AAC1E,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,MAAM,IAAI;AAE7C,UAAI,SAAS,WAAW,SAAS,MAAM;AACrC,gBAAQ,SAAS,IAAI;AACrB,2BAAmB,IAAI;AAAA,MACzB;AACA,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,SAAS,YAAY,OAAO,SAA4C;AAC5E,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,OAAO,IAAI;AAC9C,UAAI,SAAS,WAAW,SAAS,MAAM;AACrC,gBAAQ,SAAS,IAAI;AACrB,2BAAmB,IAAI;AAAA,MACzB;AACA,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,mBAAmB,YAAY,OAAO,UAAyC;AACnF,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,iBAAiB,KAAK;AACzD,UAAI,SAAS,WAAW,SAAS,MAAM;AACrC,gBAAQ,SAAS,IAAI;AACrB,2BAAmB,IAAI;AAAA,MACzB;AACA,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,SAAS,YAAY,YAA2B;AACpD,eAAW,IAAI;AACf,QAAI;AACF,YAAM,YAAY,OAAO;AACzB,cAAQ,IAAI;AACZ,yBAAmB,KAAK;AAAA,IAC1B,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,gBAAgB,YAAY,OAAO,SAAgD;AACvF,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,cAAc,IAAI;AACrD,UAAI,SAAS,WAAW,SAAS,MAAM;AACrC,gBAAQ,SAAS,IAAI;AAAA,MACvB;AACA,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,aAAa,YAAY,YAA2B;AACxD,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,WAAW;AAC9C,cAAQ,QAAQ;AAChB,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,cAAc,YAAY,YAA6B;AAC3D,eAAW,IAAI;AACf,QAAI;AACF,aAAO,MAAM,YAAY,YAAY;AAAA,IACvC,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,cAAc,YAAY,OAAO,OAA8B;AACnE,eAAW,IAAI;AACf,QAAI;AACF,aAAO,MAAM,YAAY,YAAY,EAAE;AAAA,IACzC,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,wBAAwB,YAAY,OAAO,SAAsC;AACrF,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,sBAAsB,IAAI;AAC7D,UAAI,SAAS,WAAW,SAAS,MAAM;AACrC,gBAAQ,SAAS,IAAI;AAAA,MACvB;AACA,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AGzLA,SAAgB,eAAe,YAAY,aAAAC,YAAW,YAAAD,iBAA2B;AA4E7E;AAnEJ,IAAM,eAAe,cAAgC,EAAE,OAAO,SAAS,SAAS,MAAM,CAAC;AAyEhF,SAAS,eAAe;AAC7B,SAAO,WAAW,YAAY;AAChC;;;AC/DA,IAAM,aAA0B;AAAA,EAC9B,WAAW;AAAA,EACX,aAAa;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,eAAe;AAAA,EACf,cAAc;AAAA,EACd,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,SAAS;AAAA,EACT,WAAW;AAAA,EACX,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EACb,eAAe;AACjB;AAEA,IAAM,YAAyB;AAAA,EAC7B,WAAW;AAAA,EACX,aAAa;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,eAAe;AAAA,EACf,cAAc;AAAA,EACd,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,SAAS;AAAA,EACT,WAAW;AAAA,EACX,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EACb,eAAe;AACjB;AAEO,SAAS,iBAA8B;AAC5C,QAAM,EAAE,MAAM,IAAI,aAAa;AAC/B,SAAO,UAAU,SAAS,YAAY;AACxC;;;AC9DA,OAAOE,UAAS,YAAAF,WAAU,aAAAC,YAAW,eAAe;AAyBlD,gBAAAE,MAsOE,YAtOF;AArBF,IAAI,wBAA6B;AACjC,IAAI;AACF,QAAM,SAAS,UAAQ,0BAA0B;AACjD,0BAAwB,OAAO,WAAW;AAC1C,YAAQ,oCAAoC;AAC9C,SAAS,OAAP;AACA,UAAQ,KAAK,wDAAwD;AACvE;AAaA,IAAM,mBAAmBD,OAAM,WAAkC,CAAC,OAAO,QACvE,gBAAAC;AAAA,EAAC;AAAA;AAAA,IACE,GAAG;AAAA,IACJ;AAAA,IACA,WAAU;AAAA;AACZ,CACD;AACD,iBAAiB,cAAc;AAExB,IAAM,aAAwC,CAAC;AAAA,EACpD;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AAAA,EACX,cAAc;AAAA,EACd,KAAK;AAAA,EACL,QAAQ,CAAC;AACX,MAAM;AACJ,QAAM,SAAS,eAAe;AAC9B,QAAM,CAAC,gBAAgB,iBAAiB,IAAIH,UAAiB,IAAI;AAGjE,QAAM,eAAe,QAAQ,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAaX,OAAO;AAAA;AAAA,0BAEP,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,sBAKX,OAAO;AAAA,2BACF,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAuBnB,OAAO;AAAA,0BACI,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BASP,OAAO;AAAA,eAClB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAQI,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAWX,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAaH,OAAO;AAAA;AAAA;AAAA,0BAGP,OAAO;AAAA,eAClB,OAAO;AAAA;AAAA,iCAEW,OAAO;AAAA,yCACC,OAAO;AAAA;AAAA;AAAA;AAAA,sBAI1B,OAAO;AAAA,2BACF,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eASnB,OAAO;AAAA;AAAA;AAAA,KAGjB,CAAC,MAAM,CAAC;AAEX,EAAAC,WAAU,MAAM;AAEd,UAAM,gBAAgB,YAAY;AAChC,UAAI;AAEF,cAAM,WAAW,KAAK,eAAe,EAAE,gBAAgB,EAAE;AACzD,cAAM,oBAA4C;AAAA,UAChD,oBAAoB;AAAA,UACpB,mBAAmB;AAAA,UACnB,kBAAkB;AAAA,UAClB,uBAAuB;AAAA,UACvB,mBAAmB;AAAA,UACnB,qBAAqB;AAAA,UACrB,oBAAoB;AAAA,UACpB,iBAAiB;AAAA,UACjB,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,eAAe;AAAA,UACf,iBAAiB;AAAA,UACjB,cAAc;AAAA,UACd,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,cAAc;AAAA,UACd,cAAc;AAAA,UACd,kBAAkB;AAAA,UAClB,kBAAkB;AAAA,UAClB,oBAAoB;AAAA,UACpB,oBAAoB;AAAA,UACpB,mBAAmB;AAAA,UACnB,qBAAqB;AAAA,UACrB,uBAAuB;AAAA,UACvB,qBAAqB;AAAA,UACrB,wBAAwB;AAAA,UACxB,gBAAgB;AAAA,UAChB,uBAAuB;AAAA,UACvB,gBAAgB;AAAA,UAChB,kBAAkB;AAAA,QACpB;AAEA,cAAM,kBAAkB,kBAAkB,QAAQ;AAClD,YAAI,iBAAiB;AACnB,4BAAkB,eAAe;AACjC;AAAA,QACF;AAGA,cAAM,WAAW,MAAM,MAAM,0BAA0B;AAAA,UACrD,QAAQ,YAAY,QAAQ,GAAI;AAAA;AAAA,QAClC,CAAC;AAED,YAAI,SAAS,IAAI;AACf,gBAAM,OAAO,MAAM,SAAS,KAAK;AACjC,cAAI,KAAK,cAAc;AACrB,8BAAkB,KAAK,YAAY;AAAA,UACrC;AAAA,QACF;AAAA,MACF,SAAS,OAAP;AAEA,gBAAQ,IAAI,4CAA4C;AAAA,MAC1D;AAAA,IACF;AAEA,kBAAc;AAAA,EAChB,GAAG,CAAC,CAAC;AAGL,QAAM,eAAe,QAAQ,MAAM,CAAC,QAA4B;AAC9D,aAAS,OAAO,EAAE;AAAA,EACpB,GAAG,CAAC,QAAQ,CAAC;AAGb,MAAI,CAAC,uBAAuB;AAC1B,WACE,gBAAAE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL;AAAA,QACA,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,QACxC;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,QAAQ,aAAa,OAAO;AAAA,UAC5B,cAAc;AAAA,UACd,UAAU;AAAA,UACV,iBAAiB,OAAO;AAAA,UACxB,OAAO,OAAO;AAAA,UACd,GAAG;AAAA,QACL;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,GAAG;AAAA,MACL;AAAA,MAEA;AAAA,wBAAAA,KAAC,WAAO,wBAAa;AAAA,QAErB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA,eAAa;AAAA,YACb;AAAA,YACA,OAAO,SAAS;AAAA,YAChB,UAAU;AAAA,YACV;AAAA,YACA;AAAA,YACA,gBAAgB;AAAA;AAAA,UARX;AAAA,QASP;AAAA;AAAA;AAAA,EACF;AAEJ;;;AN9JQ,gBAAAA,MAuBA,QAAAC,aAvBA;AArGD,IAAM,YAAsC,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB;AAAA,EACA,iBAAiB,CAAC,UAAU,QAAQ;AAAA,EACpC,mBAAmB;AACrB,MAAM;AACJ,QAAM,SAAS,eAAe;AAC9B,QAAM,CAAC,OAAO,QAAQ,IAAIJ,UAAS,EAAE;AACrC,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,EAAE;AACjD,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,KAAK;AAC9C,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,EAAE;AAC3C,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AACpD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAElD,QAAM,EAAE,MAAM,IAAI,QAAQ;AAAA,IACxB,SAAS,QAAQ,WAAW;AAAA,EAC9B,CAAC;AAED,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,iBAAa,IAAI;AACjB,aAAS,IAAI;AAEb,QAAI;AACF,UAAI;AACJ,YAAM,YAAiB,CAAC;AAGxB,UAAI,YAAY,aAAa;AAC3B,kBAAU,cAAc;AAAA,MAC1B,WAAW,OAAO;AAChB,kBAAU,QAAQ;AAAA,MACpB;AAEA,UAAI,aAAa;AAEf,kBAAU,WAAW;AACrB,mBAAW,MAAM,MAAM,SAAS;AAAA,MAClC,OAAO;AAEL,mBAAW,MAAM,MAAM,SAAS;AAAA,MAClC;AAEA,UAAI,SAAS,SAAS;AAEpB,oBAAY,QAAQ;AAGpB,YAAI,gBAAgB;AAClB,gBAAM,aAAa,WAAW,cAAc;AAE5C,cAAI,SAAS,YAAY,6BAA6B,SAAS,YAAY,kCAAkC;AAE3G,2BAAe,YAAY,IAAI;AAAA,UACjC,WAAW,SAAS,OAAO;AAEzB,2BAAe,YAAY,KAAK;AAAA,UAClC,OAAO;AAEL,2BAAe,YAAY,IAAI;AAAA,UACjC;AAAA,QACF;AAAA,MACF,OAAO;AACL,iBAAS,SAAS,WAAW,cAAc;AAAA,MAC7C;AAAA,IACF,SAAS,KAAP;AACA,eAAS,eAAe,QAAQ,IAAI,UAAU,2BAA2B;AAAA,IAC3E,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,mBAAmB,MAAM;AAC7B,mBAAe,CAAC,WAAW;AAC3B,aAAS,IAAI;AAAA,EACf;AAEA,QAAM,2BAA2B,MAAM;AACrC,oBAAgB,CAAC,YAAY;AAAA,EAC/B;AAEA,SACE,gBAAAG,KAAC,SAAI,OAAO;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,iBAAiB,OAAO;AAAA,IACxB,QAAQ,aAAa,OAAO;AAAA,EAC9B,GACE,0BAAAC,MAAC,UAAK,UAAU,cAAc,OAAO;AAAA,IACnC,SAAS;AAAA,IACT,eAAe;AAAA,EACjB,GACE;AAAA,oBAAAD,KAAC,QAAG,OAAO;AAAA,MACT,WAAW;AAAA,MACX,cAAc;AAAA,MACd,OAAO,OAAO;AAAA,MACd,UAAU;AAAA,MACV,YAAY;AAAA,IACd,GAAI,wBAAc,wBAAwB,kBAAiB;AAAA,IAE1D,SACC,gBAAAA,KAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB,OAAO;AAAA,MACxB,OAAO,OAAO;AAAA,MACd,QAAQ,aAAa,OAAO;AAAA,MAC5B,cAAc;AAAA,MACd,UAAU;AAAA,MACV,YAAY;AAAA,IACd,GACG,iBACH;AAAA,IAGF,gBAAAC,MAAC,SAAI,OAAO;AAAA,MACV,cAAc;AAAA,IAChB,GACE;AAAA,sBAAAD,KAAC,WAAM,SAAS,WAAW,UAAU,SAAS,OAAO;AAAA,QACnD,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO,OAAO;AAAA,QACd,UAAU;AAAA,MACZ,GAAI,qBAAW,kBAAkB,UAAS;AAAA,MACzC,WACC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,OAAO;AAAA,UACP,UAAU;AAAA,UACV,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,aAAY;AAAA;AAAA,MACd,IAEA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,UACxC,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ,aAAa,OAAO;AAAA,YAC5B,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,OAAO,OAAO;AAAA,YACd,YAAY;AAAA,YACZ,iBAAiB,OAAO;AAAA,UAC1B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,MAEF,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,YAAY,CAAC,QAAQ;AAAA,UACpC,UAAU;AAAA,UACV,OAAO;AAAA,YACL,WAAW;AAAA,YACX,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,OAAO,OAAO;AAAA,YACd,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,SAAS;AAAA,YACT,YAAY;AAAA,UACd;AAAA,UAEC,qBAAW,sBAAsB;AAAA;AAAA,MACpC;AAAA,OACF;AAAA,IAEC,eACC,gBAAAC,MAAC,SAAI,OAAO;AAAA,MACV,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,GACE;AAAA,sBAAAD,KAAC,WAAM,SAAQ,kBAAiB,OAAO;AAAA,QACrC,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO,OAAO;AAAA,QACd,UAAU;AAAA,MACZ,GAAG,uBAAS;AAAA,MACZ,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAM,eAAe,SAAS;AAAA,UAC9B,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,UAC3C,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ,aAAa,OAAO;AAAA,YAC5B,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,OAAO,OAAO;AAAA,YACd,YAAY;AAAA,YACZ,iBAAiB,OAAO;AAAA,UAC1B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,UACV,OAAO;AAAA,YACL,UAAU;AAAA,YACV,OAAO;AAAA,YACP,KAAK;AAAA,YACL,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,OAAO,OAAO;AAAA,YACd,UAAU;AAAA,UACZ;AAAA,UAEC,yBAAe,SAAS;AAAA;AAAA,MAC3B;AAAA,OACF;AAAA,IAGD,eACC,gBAAAC,MAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,WAAW;AAAA,IACb,GACE;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,IAAG;AAAA,UACH,SAAS;AAAA,UACT,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,OAAO;AAAA,UAC/C,UAAU;AAAA,UACV,OAAO;AAAA,YACL,aAAa;AAAA,YACb,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,QAAQ;AAAA,UACV;AAAA;AAAA,MACF;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,OAAO;AAAA,YACL,UAAU;AAAA,YACV,OAAO,OAAO;AAAA,YACd,QAAQ;AAAA,YACR,YAAY;AAAA,UACd;AAAA,UACD;AAAA;AAAA,MAED;AAAA,OACF;AAAA,IAGF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,UACL,SAAS;AAAA,UACT,iBAAiB,OAAO;AAAA,UACxB,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,WAAW;AAAA,QACb;AAAA,QAEC,sBAAa,cAAc,kBAAkB,mBAAqB,cAAc,UAAU;AAAA;AAAA,IAC7F;AAAA,IAEA,gBAAAA,KAAC,SAAI,OAAO;AAAA,MACV,WAAW;AAAA,MACX,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW,aAAa,OAAO;AAAA,IACjC,GACE,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,OAAO;AAAA,UACL,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,OAAO,OAAO;AAAA,UACd,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,YAAY;AAAA,QACd;AAAA,QAEC,wBAAc,2BAA2B;AAAA;AAAA,IAC5C,GACF;AAAA,IAEC,oBAAoB,eAAe,SAAS,KAC3C,gBAAAC,MAAC,SAAI,OAAO;AAAA,MACV,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW,aAAa,OAAO;AAAA,IACjC,GACE;AAAA,sBAAAA,MAAC,SAAI,OAAO;AAAA,QACV,UAAU;AAAA,QACV,cAAc;AAAA,MAChB,GACE;AAAA,wBAAAD,KAAC,SAAI,OAAO;AAAA,UACV,UAAU;AAAA,UACV,KAAK;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,iBAAiB,OAAO;AAAA,QAC1B,GAAG;AAAA,QACH,gBAAAA,KAAC,SAAI,OAAO;AAAA,UACV,UAAU;AAAA,UACV,WAAW;AAAA,QACb,GACE,0BAAAA,KAAC,UAAK,OAAO;AAAA,UACX,iBAAiB,OAAO;AAAA,UACxB,SAAS;AAAA,UACT,OAAO,OAAO;AAAA,UACd,UAAU;AAAA,QACZ,GAAG,8BAAgB,GACrB;AAAA,SACF;AAAA,MAEA,gBAAAC,MAAC,SAAI,OAAO;AAAA,QACV,SAAS;AAAA,QACT,qBAAqB,eAAe,WAAW,IAAI,QAAQ;AAAA,QAC3D,KAAK;AAAA,MACP,GACG;AAAA,uBAAe,SAAS,QAAQ,KAC/B,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,QAAQ,WAAW;AAAA,YAC5B,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,KAAK;AAAA,cACL,SAAS;AAAA,cACT,iBAAiB,OAAO;AAAA,cACxB,QAAQ,aAAa,OAAO;AAAA,cAC5B,cAAc;AAAA,cACd,OAAO,OAAO;AAAA,cACd,gBAAgB;AAAA,cAChB,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,YAAY;AAAA,YACd;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,gBAAE,cAAc,MAAM,kBAAkB,OAAO;AAC/C,gBAAE,cAAc,MAAM,cAAc,OAAO;AAAA,YAC7C;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,gBAAE,cAAc,MAAM,kBAAkB,OAAO;AAC/C,gBAAE,cAAc,MAAM,cAAc,OAAO;AAAA,YAC7C;AAAA,YAEA;AAAA,8BAAAA,MAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,OAAO,GAAG,SAAQ,aACrD;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,GAAE;AAAA;AAAA,gBACJ;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,GAAE;AAAA;AAAA,gBACJ;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,GAAE;AAAA;AAAA,gBACJ;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,GAAE;AAAA;AAAA,gBACJ;AAAA,iBACF;AAAA,cAAM;AAAA;AAAA;AAAA,QAER;AAAA,QAGD,eAAe,SAAS,QAAQ,KAC/B,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,QAAQ,WAAW;AAAA,YAC5B,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,KAAK;AAAA,cACL,SAAS;AAAA,cACT,iBAAiB;AAAA,cACjB,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,OAAO;AAAA,cACP,gBAAgB;AAAA,cAChB,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,YAAY;AAAA,YACd;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,gBAAE,cAAc,MAAM,kBAAkB;AACxC,gBAAE,cAAc,MAAM,cAAc;AAAA,YACtC;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,gBAAE,cAAc,MAAM,kBAAkB;AACxC,gBAAE,cAAc,MAAM,cAAc;AAAA,YACtC;AAAA,YAEA;AAAA,8BAAAD,KAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,OAAO,GAAG,MAAK,gBAAe,SAAQ,aACzE,0BAAAA,KAAC,UAAK,GAAE,6sBAA4sB,GACttB;AAAA,cAAM;AAAA;AAAA;AAAA,QAER;AAAA,SAEJ;AAAA,OACF;AAAA,IAGD,oBACC,gBAAAA,KAAC,SAAI,OAAO;AAAA,MACV,WAAW;AAAA,MACX,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW,aAAa,OAAO;AAAA,IACjC,GACE,0BAAAC,MAAC,OAAE,OAAO;AAAA,MACR,OAAO,OAAO;AAAA,MACd,UAAU;AAAA,IACZ,GAAG;AAAA;AAAA,MACsB;AAAA,MACvB,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,UACV,OAAO;AAAA,YACL,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,OAAO,OAAO;AAAA,YACd,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,SAAS;AAAA,YACT,YAAY;AAAA,UACd;AAAA,UACD;AAAA;AAAA,MAED;AAAA,OACF,GACF;AAAA,KAEJ,GACF;AAEJ;;;AO9eA,SAAgB,YAAAH,iBAAgB;AAqJxB,gBAAAG,MAuBA,QAAAC,aAvBA;AArID,IAAM,eAA4C,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA,iBAAiB,CAAC,UAAU,QAAQ;AAAA,EACpC,mBAAmB;AAAA,EACnB;AACF,MAAM;AACJ,QAAM,SAAS,eAAe;AAC9B,QAAM,CAAC,MAAM,OAAO,IAAIJ,UAAS,EAAE;AACnC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AACrC,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,EAAE;AACjD,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,EAAE;AAC3C,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAS,EAAE;AACzD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,qBAAqB,sBAAsB,IAAIA,UAAS,KAAK;AAEpE,QAAM,sBAAsB,CAAC,QAA0F;AACrH,QAAI,CAAC;AAAK,aAAO,EAAE,UAAU,QAAQ,OAAO,GAAG,OAAO,GAAG;AAEzD,QAAI,QAAQ;AACZ,QAAI,IAAI,UAAU;AAAG;AACrB,QAAI,IAAI,UAAU;AAAG;AACrB,QAAI,QAAQ,KAAK,GAAG,KAAK,QAAQ,KAAK,GAAG;AAAG;AAC5C,QAAI,KAAK,KAAK,GAAG;AAAG;AACpB,QAAI,cAAc,KAAK,GAAG;AAAG;AAE7B,QAAI,SAAS;AAAG,aAAO,EAAE,UAAU,QAAQ,OAAO,OAAO,OAAO;AAChE,QAAI,SAAS;AAAG,aAAO,EAAE,UAAU,UAAU,OAAO,OAAO,SAAS;AACpE,WAAO,EAAE,UAAU,UAAU,OAAO,OAAO,SAAS;AAAA,EACtD;AAEA,QAAM,mBAAmB,oBAAoB,QAAQ;AAGrD,QAAM,SAAS,cAAc;AAAA,IAC3B,SAAS;AAAA,EACX;AAEA,QAAM,EAAE,SAAS,IAAI,QAAQ,MAAM;AAEnC,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,iBAAa,IAAI;AACjB,aAAS,IAAI;AAGb,QAAI,aAAa,iBAAiB;AAChC,eAAS,wBAAwB;AACjC,mBAAa,KAAK;AAClB;AAAA,IACF;AAGA,QAAI,SAAS,SAAS,GAAG;AACvB,eAAS,6CAA6C;AACtD,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,QAAI;AAEF,UAAI,iBAAiB;AACnB,cAAM,WAAW,MAAM,MAAM,GAAG,OAAO,8CAA8C;AAAA,UACnF,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,UAClB;AAAA,UACA,MAAM,KAAK,UAAU;AAAA,YACnB;AAAA,YACA;AAAA,YACA;AAAA,YACA,aAAa,eAAe;AAAA,YAC5B;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAED,cAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,YAAI,SAAS,MAAM,KAAK,SAAS;AAE/B,cAAI,OAAO,WAAW,eAAe,KAAK,OAAO;AAC/C,yBAAa,QAAQ,cAAc,KAAK,KAAK;AAAA,UAC/C;AACA,8BAAoB;AAAA,QACtB,OAAO;AACL,mBAAS,KAAK,SAAS,KAAK,WAAW,qBAAqB;AAAA,QAC9D;AAAA,MACF,OAAO;AAEL,cAAM,eAAoB;AAAA,UACxB;AAAA,UACA;AAAA,UACA,iBAAiB,OAAO,WAAW,cAC9B,QAAQ,IAAI,iCAAiC,QAAQ,IAAI,+BAA+B,OAAO,SAAS,SACzG;AAAA,QACN;AAGA,YAAI;AAAO,uBAAa,QAAQ;AAChC,YAAI;AAAa,uBAAa,cAAc;AAE5C,cAAM,WAAW,MAAM,SAAS,YAAY;AAC5C,YAAI,SAAS,SAAS;AACpB,8BAAoB;AAAA,QACtB,OAAO;AACL,mBAAS,SAAS,WAAW,qBAAqB;AAAA,QACpD;AAAA,MACF;AAAA,IACF,SAAS,KAAP;AACA,eAAS,eAAe,QAAQ,IAAI,UAAU,2BAA2B;AAAA,IAC3E,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,SACE,gBAAAG,KAAC,SAAI,OAAO;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,iBAAiB,OAAO;AAAA,IACxB,QAAQ,aAAa,OAAO;AAAA,EAC9B,GACE,0BAAAC,MAAC,UAAK,UAAU,cAAc,OAAO;AAAA,IACnC,SAAS;AAAA,IACT,eAAe;AAAA,EACjB,GACE;AAAA,oBAAAD,KAAC,QAAG,OAAO;AAAA,MACT,WAAW;AAAA,MACX,cAAc;AAAA,MACd,OAAO,OAAO;AAAA,MACd,UAAU;AAAA,MACV,YAAY;AAAA,IACd,GAAG,sBAAQ;AAAA,IAEV,SACC,gBAAAA,KAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB,OAAO;AAAA,MACxB,OAAO,OAAO;AAAA,MACd,QAAQ,aAAa,OAAO;AAAA,MAC5B,cAAc;AAAA,MACd,UAAU;AAAA,MACV,YAAY;AAAA,IACd,GACG,iBACH;AAAA,IAGF,gBAAAC,MAAC,SAAI,OAAO;AAAA,MACV,cAAc;AAAA,IAChB,GACE;AAAA,sBAAAD,KAAC,WAAM,SAAQ,QAAO,OAAO;AAAA,QAC3B,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO,OAAO;AAAA,QACd,UAAU;AAAA,MACZ,GAAG,mBAAK;AAAA,MACR,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,KAAK;AAAA,UACvC,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ,aAAa,OAAO;AAAA,YAC5B,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,OAAO,OAAO;AAAA,YACd,YAAY;AAAA,YACZ,iBAAiB,OAAO;AAAA,UAC1B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,SAAI,OAAO;AAAA,MACV,cAAc;AAAA,IAChB,GACE;AAAA,sBAAAD,KAAC,WAAM,SAAQ,kBAAiB,OAAO;AAAA,QACrC,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO,OAAO;AAAA,QACd,UAAU;AAAA,MACZ,GAAG,oBAAM;AAAA,MACT,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,UACxC,UAAU,CAAC;AAAA,UACX,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ,aAAa,OAAO;AAAA,YAC5B,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,OAAO,OAAO;AAAA,YACd,YAAY;AAAA,YACZ,iBAAiB,OAAO;AAAA,UAC1B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,SAAI,OAAO;AAAA,MACV,cAAc;AAAA,IAChB,GACE;AAAA,sBAAAD,KAAC,WAAM,SAAQ,kBAAiB,OAAO;AAAA,QACrC,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO,OAAO;AAAA,QACd,UAAU;AAAA,MACZ,GAAG,sCAAwB;AAAA,MAC3B,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,OAAO;AAAA,UACP,UAAU;AAAA,UACV,UAAU;AAAA,UACV,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,SAAI,OAAO;AAAA,MACV,cAAc;AAAA,IAChB,GACE;AAAA,sBAAAD,KAAC,WAAM,SAAQ,YAAW,OAAO;AAAA,QAC/B,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO,OAAO;AAAA,QACd,UAAU;AAAA,MACZ,GAAG,uBAAS;AAAA,MACZ,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,UAC3C,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ,aAAa,OAAO;AAAA,YAC5B,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,OAAO,OAAO;AAAA,YACd,YAAY;AAAA,YACZ,iBAAiB,OAAO;AAAA,UAC1B;AAAA,UACA,aAAY;AAAA,UACZ,WAAW;AAAA;AAAA,MACb;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,SAAI,OAAO;AAAA,MACV,cAAc;AAAA,IAChB,GACE;AAAA,sBAAAD,KAAC,WAAM,SAAQ,oBAAmB,OAAO;AAAA,QACvC,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO,OAAO;AAAA,QACd,UAAU;AAAA,MACZ,GAAG,+BAAiB;AAAA,MACpB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,mBAAmB,EAAE,OAAO,KAAK;AAAA,UAClD,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ,aAAa,OAAO;AAAA,YAC5B,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,OAAO,OAAO;AAAA,YACd,YAAY;AAAA,YACZ,iBAAiB,OAAO;AAAA,UAC1B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,UACL,SAAS;AAAA,UACT,iBAAiB,OAAO;AAAA,UACxB,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,WAAW;AAAA,QACb;AAAA,QAEC,sBAAY,mBAAmB;AAAA;AAAA,IAClC;AAAA,IAEC,oBAAoB,eAAe,SAAS,KAC3C,gBAAAC,MAAC,SAAI,OAAO;AAAA,MACV,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW,aAAa,OAAO;AAAA,IACjC,GACE;AAAA,sBAAAA,MAAC,SAAI,OAAO;AAAA,QACV,UAAU;AAAA,QACV,cAAc;AAAA,MAChB,GACE;AAAA,wBAAAD,KAAC,SAAI,OAAO;AAAA,UACV,UAAU;AAAA,UACV,KAAK;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,iBAAiB,OAAO;AAAA,QAC1B,GAAG;AAAA,QACH,gBAAAA,KAAC,SAAI,OAAO;AAAA,UACV,UAAU;AAAA,UACV,WAAW;AAAA,QACb,GACE,0BAAAA,KAAC,UAAK,OAAO;AAAA,UACX,iBAAiB,OAAO;AAAA,UACxB,SAAS;AAAA,UACT,OAAO,OAAO;AAAA,UACd,UAAU;AAAA,QACZ,GAAG,8BAAgB,GACrB;AAAA,SACF;AAAA,MAEA,gBAAAC,MAAC,SAAI,OAAO;AAAA,QACV,SAAS;AAAA,QACT,qBAAqB,eAAe,WAAW,IAAI,QAAQ;AAAA,QAC3D,KAAK;AAAA,MACP,GACG;AAAA,uBAAe,SAAS,QAAQ,KAC/B,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,OAAO;AAAA,YAChB,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,KAAK;AAAA,cACL,SAAS;AAAA,cACT,iBAAiB,OAAO;AAAA,cACxB,QAAQ,aAAa,OAAO;AAAA,cAC5B,cAAc;AAAA,cACd,OAAO,OAAO;AAAA,cACd,gBAAgB;AAAA,cAChB,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,YAAY;AAAA,YACd;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,gBAAE,cAAc,MAAM,kBAAkB,OAAO;AAC/C,gBAAE,cAAc,MAAM,cAAc,OAAO;AAAA,YAC7C;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,gBAAE,cAAc,MAAM,kBAAkB,OAAO;AAC/C,gBAAE,cAAc,MAAM,cAAc,OAAO;AAAA,YAC7C;AAAA,YAEA;AAAA,8BAAAA,MAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,OAAO,GAAG,SAAQ,aACrD;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,GAAE;AAAA;AAAA,gBACJ;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,GAAE;AAAA;AAAA,gBACJ;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,GAAE;AAAA;AAAA,gBACJ;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,GAAE;AAAA;AAAA,gBACJ;AAAA,iBACF;AAAA,cAAM;AAAA;AAAA;AAAA,QAER;AAAA,QAGD,eAAe,SAAS,QAAQ,KAC/B,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,OAAO;AAAA,YAChB,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,KAAK;AAAA,cACL,SAAS;AAAA,cACT,iBAAiB;AAAA,cACjB,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,OAAO;AAAA,cACP,gBAAgB;AAAA,cAChB,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,YAAY;AAAA,YACd;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,gBAAE,cAAc,MAAM,kBAAkB;AACxC,gBAAE,cAAc,MAAM,cAAc;AAAA,YACtC;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,gBAAE,cAAc,MAAM,kBAAkB;AACxC,gBAAE,cAAc,MAAM,cAAc;AAAA,YACtC;AAAA,YAEA;AAAA,8BAAAD,KAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,OAAO,GAAG,MAAK,gBAAe,SAAQ,aACzE,0BAAAA,KAAC,UAAK,GAAE,6sBAA4sB,GACttB;AAAA,cAAM;AAAA;AAAA;AAAA,QAER;AAAA,SAEJ;AAAA,OACF;AAAA,IAGD,iBACC,gBAAAA,KAAC,SAAI,OAAO;AAAA,MACV,WAAW;AAAA,MACX,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW,aAAa,OAAO;AAAA,IACjC,GACE,0BAAAC,MAAC,OAAE,OAAO;AAAA,MACR,OAAO,OAAO;AAAA,MACd,UAAU;AAAA,IACZ,GAAG;AAAA;AAAA,MACwB;AAAA,MACzB,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,UACV,OAAO;AAAA,YACL,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,OAAO,OAAO;AAAA,YACd,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,SAAS;AAAA,YACT,YAAY;AAAA,UACd;AAAA,UACD;AAAA;AAAA,MAED;AAAA,OACF,GACF;AAAA,KAEJ,GACF;AAEJ;;;ACnfA,SAAgB,YAAAH,iBAAgB;AA2GxB,gBAAAG,MAOA,QAAAC,aAPA;AA/FD,IAAM,UAAkC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,SAAS,eAAe;AAC9B,QAAM,CAAC,KAAK,MAAM,IAAIJ,UAAS,EAAE;AACjC,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAS,CAAC;AACtD,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAS,KAAK;AAExD,QAAM,EAAE,QAAQ,MAAM,IAAI,QAAQ;AAAA,IAChC,SAAS,WAAW,QAAQ,IAAI,4BAA4B;AAAA,EAC9D,CAAC;AAED,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,iBAAa,IAAI;AACjB,aAAS,IAAI;AAGb,QAAI,CAAC,UAAU,KAAK,GAAG,GAAG;AACxB,eAAS,kCAAkC;AAC3C,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,OAAO,EAAE,OAAO,IAAI,CAAC;AAC5C,UAAI,SAAS,SAAS;AACpB,0BAAkB;AAAA,MACpB,OAAO;AACL,iBAAS,SAAS,WAAW,qBAAqB;AAAA,MACpD;AAAA,IACF,SAAS,KAAP;AACA,eAAS,eAAe,QAAQ,IAAI,UAAU,2BAA2B;AAAA,IAC3E,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,kBAAkB,CAAC,MAA2C;AAClE,UAAM,QAAQ,EAAE,OAAO;AAEvB,QAAI,YAAY,KAAK,KAAK,GAAG;AAC3B,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AAEA,QAAM,kBAAkB,YAAY;AAClC,QAAI,iBAAiB,KAAK;AAAe;AAEzC,qBAAiB,IAAI;AACrB,aAAS,IAAI;AAEb,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,EAAE,MAAM,CAAC;AACtC,UAAI,SAAS,SAAS;AAEpB,0BAAkB,EAAE;AACpB,cAAM,WAAW,YAAY,MAAM;AACjC,4BAAkB,CAAC,SAAS;AAC1B,gBAAI,QAAQ,GAAG;AACb,4BAAc,QAAQ;AACtB,qBAAO;AAAA,YACT;AACA,mBAAO,OAAO;AAAA,UAChB,CAAC;AAAA,QACH,GAAG,GAAI;AAAA,MACT,OAAO;AACL,iBAAS,SAAS,WAAW,sBAAsB;AAAA,MACrD;AAAA,IACF,SAAS,KAAP;AACA,eAAS,eAAe,QAAQ,IAAI,UAAU,sBAAsB;AAAA,IACtE,UAAE;AACA,uBAAiB,KAAK;AAAA,IACxB;AAAA,EACF;AAEA,SACE,gBAAAG,KAAC,SAAI,OAAO;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,iBAAiB,OAAO;AAAA,IACxB,QAAQ,aAAa,OAAO;AAAA,EAC9B,GACE,0BAAAC,MAAC,UAAK,UAAU,cAAc,OAAO;AAAA,IACnC,SAAS;AAAA,IACT,eAAe;AAAA,EACjB,GACE;AAAA,oBAAAD,KAAC,QAAG,OAAO;AAAA,MACT,WAAW;AAAA,MACX,cAAc;AAAA,MACd,OAAO,OAAO;AAAA,MACd,UAAU;AAAA,MACV,YAAY;AAAA,IACd,GAAG,wBAAU;AAAA,IACb,gBAAAC,MAAC,OAAE,OAAO;AAAA,MACR,WAAW;AAAA,MACX,cAAc;AAAA,MACd,OAAO,OAAO;AAAA,MACd,UAAU;AAAA,IACZ,GAAG;AAAA;AAAA,MAA+B,gBAAAD,KAAC,YAAO,OAAO,EAAE,OAAO,OAAO,YAAY,GAAI,iBAAM;AAAA,OAAS;AAAA,IAE/F,SACC,gBAAAA,KAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB,OAAO;AAAA,MACxB,OAAO,OAAO;AAAA,MACd,QAAQ,aAAa,OAAO;AAAA,MAC5B,cAAc;AAAA,MACd,UAAU;AAAA,MACV,YAAY;AAAA,IACd,GACG,iBACH;AAAA,IAGF,gBAAAC,MAAC,SAAI,OAAO;AAAA,MACV,cAAc;AAAA,IAChB,GACE;AAAA,sBAAAD,KAAC,WAAM,SAAQ,OAAM,OAAO;AAAA,QAC1B,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO,OAAO;AAAA,QACd,UAAU;AAAA,MACZ,GAAG,uBAAS;AAAA,MACZ,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU;AAAA,UACV,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ,aAAa,OAAO;AAAA,YAC5B,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,OAAO,OAAO;AAAA,YACd,YAAY;AAAA,YACZ,iBAAiB,OAAO;AAAA,YACxB,WAAW;AAAA,YACX,eAAe;AAAA,UACjB;AAAA,UACA,WAAW;AAAA,UACX,aAAY;AAAA,UACZ,WAAS;AAAA;AAAA,MACX;AAAA,OACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,UAAU,aAAa,IAAI,WAAW;AAAA,QACtC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,iBAAiB,OAAO;AAAA,UACxB,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,WAAW;AAAA,QACb;AAAA,QAEC,sBAAY,iBAAiB;AAAA;AAAA,IAChC;AAAA,IAEA,gBAAAC,MAAC,SAAI,OAAO;AAAA,MACV,WAAW;AAAA,MACX,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW,aAAa,OAAO;AAAA,IACjC,GACE;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,UAAU,aAAa,iBAAiB,iBAAiB;AAAA,UACzD,OAAO;AAAA,YACL,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,OAAO,iBAAiB,IAAI,OAAO,eAAe,OAAO;AAAA,YACzD,gBAAgB;AAAA,YAChB,QAAQ,iBAAiB,IAAI,gBAAgB;AAAA,YAC7C,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,SAAS;AAAA,YACT,cAAc;AAAA,YACd,YAAY;AAAA,YACZ,SAAS;AAAA,YACT,OAAO;AAAA,UACT;AAAA,UAEC,0BAAgB,eAAe,iBAAiB,IAAI,iBAAiB,oBAAoB;AAAA;AAAA,MAC5F;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,UACV,OAAO;AAAA,YACL,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,OAAO,OAAO;AAAA,YACd,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,SAAS;AAAA,YACT,YAAY;AAAA,UACd;AAAA,UACD;AAAA;AAAA,MAED;AAAA,OACF;AAAA,KACF,GACF;AAEJ;;;AChPA,SAAgB,YAAAH,iBAAgB;AA+DtB,mBACgB,OAAAG,MADhB,QAAAC,aAAA;AAjDH,IAAM,WAAoC,CAAC;AAAA,EAChD;AAAA,EACA,cAAc;AAAA,EACd,YAAY;AACd,MAAM;AACJ,QAAM,CAAC,MAAM,OAAO,IAAIJ,UAAmB,WAAW;AACtD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AACrC,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAwB,IAAI;AAE1D,QAAM,qBAAqB,CAACK,QAAe,yBAAkC;AAE3E,aAASA,MAAK;AAEd,QAAI,sBAAsB;AAExB,cAAQ,KAAK;AACb,iBAAW,IAAI;AAAA,IACjB,OAAO;AAEL,iBAAW,IAAI;AACf,uBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,wBAAwB,MAAM;AAElC,eAAW,oEAAoE;AAE/E,eAAW,MAAM;AACf,cAAQ,OAAO;AACf,iBAAW,IAAI;AAAA,IACjB,GAAG,GAAI;AAAA,EACT;AAEA,QAAM,sBAAsB,MAAM;AAEhC,eAAW,IAAI;AACf,qBAAiB;AAAA,EACnB;AAEA,QAAM,oBAAoB,MAAM;AAC9B,YAAQ,OAAO;AACf,eAAW,IAAI;AAAA,EACjB;AAEA,QAAM,oBAAoB,MAAM;AAC9B,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eACE,gBAAAD,MAAA,YACG;AAAA,uBAAa,gBAAAD,KAAC,QAAG,OAAO;AAAA,YACvB,WAAW;AAAA,YACX,cAAc;AAAA,YACd,OAAO;AAAA,YACP,UAAU;AAAA,YACV,YAAY;AAAA,UACd,GAAG,0BAAY;AAAA,UACd,WACC,gBAAAA,KAAC,SAAI,OAAO;AAAA,YACV,SAAS;AAAA,YACT,cAAc;AAAA,YACd,iBAAiB;AAAA,YACjB,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,YAAY;AAAA,UACd,GACG,mBACH;AAAA,UAEF,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,gBAAgB;AAAA,cAChB,iBAAiB,MAAM,QAAQ,UAAU;AAAA,cACzC,kBAAkB;AAAA;AAAA,UACpB;AAAA,WACF;AAAA,MAGJ,KAAK;AACH,eACE,gBAAAC,MAAA,YACG;AAAA,uBAAa,gBAAAD,KAAC,QAAG,OAAO;AAAA,YACvB,WAAW;AAAA,YACX,cAAc;AAAA,YACd,OAAO;AAAA,YACP,UAAU;AAAA,YACV,YAAY;AAAA,UACd,GAAG,4BAAc;AAAA,UAChB,WACC,gBAAAA,KAAC,SAAI,OAAO;AAAA,YACV,SAAS;AAAA,YACT,cAAc;AAAA,YACd,iBAAiB;AAAA,YACjB,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,YAAY;AAAA,UACd,GACG,mBACH;AAAA,UAEF,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,mBAAmB;AAAA,cACnB,cAAc,MAAM,QAAQ,OAAO;AAAA,cACnC,eAAe;AAAA;AAAA,UACjB;AAAA,WACF;AAAA,MAGJ,KAAK;AACH,eACE,gBAAAC,MAAA,YACG;AAAA,uBAAa,gBAAAD,KAAC,QAAG,OAAO;AAAA,YACvB,WAAW;AAAA,YACX,cAAc;AAAA,YACd,OAAO;AAAA,YACP,UAAU;AAAA,YACV,YAAY;AAAA,UACd,GAAG,+BAAiB;AAAA,UACpB,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,iBAAiB;AAAA,cACjB,eAAe;AAAA;AAAA,UACjB;AAAA,WACF;AAAA,MAGJ;AACE,eACE,gBAAAC,MAAA,YACG;AAAA,uBAAa,gBAAAD,KAAC,QAAG,OAAO;AAAA,YACvB,WAAW;AAAA,YACX,cAAc;AAAA,YACd,OAAO;AAAA,YACP,UAAU;AAAA,YACV,YAAY;AAAA,UACd,GAAG,0BAAY;AAAA,UACf,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,gBAAgB;AAAA,cAChB,iBAAiB,MAAM,QAAQ,UAAU;AAAA,cACzC,kBAAkB;AAAA;AAAA,UACpB;AAAA,WACF;AAAA,IAEN;AAAA,EACF;AAEA,SACE,gBAAAA,KAAC,SAAI,OAAO;AAAA,IACV,WAAW;AAAA,IACX,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,EAClB,GACG,4BAAkB,GACrB;AAEJ;;;AC7KA,SAAgB,YAAAH,WAAU,aAAAC,kBAAiB;AAyEnC,SAGE,OAAAE,MAHF,QAAAC,aAAA;AA9DD,IAAM,wBAA8D,CAAC;AAAA,EAC1E;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,WAAW,YAAY,IAAIJ,UAAS,IAAI;AAC/C,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,EAAE;AACzC,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAEhD,QAAM,EAAE,iBAAiB,IAAI,QAAQ;AAAA,IACnC,SAAS,YAAY,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAAA,EAChF,CAAC;AAED,EAAAC,WAAU,MAAM;AACd,UAAM,cAAc,YAAY;AAC9B,UAAI,CAAC,OAAO;AACV,qBAAa,KAAK;AAClB,mBAAW,4BAA4B;AACvC,qBAAa,KAAK;AAClB,8BAAsB,4BAA4B;AAClD;AAAA,MACF;AAEA,UAAI;AACF,cAAM,WAAW,MAAM,iBAAiB,KAAK;AAE7C,YAAI,SAAS,SAAS;AACpB,uBAAa,KAAK;AAClB,qBAAW,SAAS,WAAW,8BAA8B;AAC7D,uBAAa,IAAI;AACjB,kCAAwB;AAAA,QAC1B,OAAO;AACL,uBAAa,KAAK;AAClB,qBAAW,SAAS,WAAW,2BAA2B;AAC1D,uBAAa,KAAK;AAClB,gCAAsB,SAAS,WAAW,2BAA2B;AAAA,QACvE;AAAA,MACF,SAAS,KAAP;AACA,qBAAa,KAAK;AAClB,cAAM,eAAe,eAAe,QAAQ,IAAI,UAAU;AAC1D,mBAAW,YAAY;AACvB,qBAAa,KAAK;AAClB,8BAAsB,YAAY;AAAA,MACpC;AAAA,IACF;AAEA,gBAAY;AAAA,EACd,GAAG,CAAC,OAAO,kBAAkB,uBAAuB,mBAAmB,CAAC;AAExE,MAAI,WAAW;AACb,WACE,gBAAAE,KAAC,SAAI,OAAO;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,cAAc;AAAA,MACd,WAAW;AAAA,MACX,iBAAiB;AAAA,MACjB,WAAW;AAAA,MACX,QAAQ;AAAA,IACV,GACE,0BAAAC,MAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,IACX,GACE;AAAA,sBAAAD,KAAC,QAAG,OAAO,EAAE,OAAO,QAAQ,GAAG,qCAAuB;AAAA,MACtD,gBAAAA,KAAC,SAAI,OAAO;AAAA,QACV,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,cAAc;AAAA,QACd,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,QAAQ;AAAA,MACV,GAAG;AAAA,OACL,GACF;AAAA,EAEJ;AAEA,SACE,gBAAAA,KAAC,SAAI,OAAO;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,QAAQ;AAAA,EACV,GACE,0BAAAC,MAAC,SAAI,OAAO;AAAA,IACV,SAAS;AAAA,EACX,GACE;AAAA,oBAAAD,KAAC,QAAG,OAAO,EAAE,OAAO,QAAQ,GAAG,gCAAkB;AAAA,IACjD,gBAAAA,KAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,iBAAiB,YAAY,YAAY;AAAA,MACzC,OAAO,YAAY,YAAY;AAAA,MAC/B,QAAQ,YAAY,sBAAsB;AAAA,IAC5C,GACG,mBACH;AAAA,IACC,aACC,gBAAAC,MAAC,SAAI,OAAO;AAAA,MACV,WAAW;AAAA,IACb,GACE;AAAA,sBAAAD,KAAC,OAAE,OAAO,EAAE,OAAO,QAAQ,GAAG,wDAA0C;AAAA,MACxE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM,OAAO,SAAS,OAAO;AAAA,UACtC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,iBAAiB;AAAA,YACjB,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,YAAY;AAAA,UACd;AAAA,UACD;AAAA;AAAA,MAED;AAAA,OACF;AAAA,KAEJ,GACF;AAEJ;;;AChJA,SAAgB,YAAAH,YAAU,aAAAC,kBAAiB;;;ACA3C,SAAgB,iBAAAK,gBAAe,cAAAC,aAAY,YAAAP,WAAU,aAAAC,YAAW,eAAAO,oBAA8B;AAqWxF,gBAAAL,YAAA;AAhUN,IAAM,cAAcG,eAA4C,MAAS;AAuUlE,IAAMG,WAAU,MAAwB;AAC7C,QAAM,UAAUF,YAAW,WAAW;AACtC,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AACA,SAAO;AACT;;;AClXA,SAA2B,kBAAkB;AAchC,gBAAAJ,YAAA;AALN,IAAM,eAAe;AAAA,EAC1B,CAAC,EAAE,UAAU,YAAY,IAAI,MAAM,GAAG,QAAQ;AAC5C,UAAM,EAAE,OAAO,QAAQ,IAAI,aAAa;AAExC,QAAI,CAAC,SAAS;AACZ,aAAO,gBAAAA,KAAC,SAAI,KAAU,WAAsB,OAAe,UAAS;AAAA,IACtE;AAEA,WACE,gBAAAA,KAAC,SAAI,KAAU,WAAW,GAAG,SAAS,aAAa,OAChD,UACH;AAAA,EAEJ;AACF;AAEA,aAAa,cAAc;;;AFyFnB,gBAAAA,OA2DE,QAAAC,aA3DF;AA/FD,IAAM,SAAgC,CAAC,EAAE,aAAa,WAAW,MAAM;AAC5E,QAAM,EAAE,QAAQ,YAAY,SAAS,YAAY,IAAIK,SAAQ;AAC7D,QAAM,SAAS,eAAe;AAC9B,QAAM,CAAC,OAAO,QAAQ,IAAIT,WAAS,EAAE;AACrC,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAS,EAAE;AACjD,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAS,EAAE;AAC3C,QAAM,CAAC,KAAK,MAAM,IAAIA,WAAS,EAAE;AACjC,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAS,KAAK;AACpD,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAS,KAAK;AAC9C,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAS,KAAK;AACtD,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAwB,IAAI;AACtD,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAS,KAAK;AAC9C,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAwB,IAAI;AAE1D,EAAAC,WAAU,MAAM;AACd,QAAI,cAAc,aAAa;AAC7B,YAAM,WAAW,eACf,QAAQ,IAAI,yCACZ,QAAQ,IAAI,uCACZ;AAEF,YAAM,UAAU,QAAQ,IAAI,iCAC1B,QAAQ,IAAI,gCACX,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAE5D,aAAO,SAAS,OAAO,GAAG,UAAU;AAAA,IACtC;AAAA,EACF,GAAG,CAAC,YAAY,WAAW,CAAC;AAE5B,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,eAAW,IAAI;AAEf,QAAI;AACF,YAAM,YAAY,WAAW,EAAE,YAAY,IAAI,EAAE,MAAM;AAEvD,UAAI,UAAU;AAEZ,cAAM,WAAW,MAAM,OAAO,EAAE,GAAG,WAAW,IAAI,CAAC;AACnD,YAAI,SAAS,SAAS;AACpB,qBAAW,mBAAmB;AAAA,QAEhC,OAAO;AACL,mBAAS,SAAS,WAAW,yBAAyB;AAAA,QACxD;AAAA,MACF,WAAW,aAAa;AAEtB,cAAM,WAAW,MAAM,OAAO,EAAE,GAAG,WAAW,SAAS,CAAC;AACxD,YAAI,SAAS,SAAS;AACpB,qBAAW,mBAAmB;AAAA,QAEhC,OAAO;AACL,mBAAS,SAAS,WAAW,cAAc;AAAA,QAC7C;AAAA,MACF,OAAO;AAEL,cAAM,WAAW,MAAM,OAAO,SAAS;AACvC,YAAI,SAAS,YAAY,SAAS,YAAY,6BAA6B,SAAS,YAAY,mCAAmC;AACjI,sBAAY,IAAI;AAChB,qBAAW,WAAW,wDAAwD,kDAAkD;AAAA,QAClI,OAAO;AACL,mBAAS,SAAS,WAAW,oBAAoB;AAAA,QACnD;AAAA,MACF;AAAA,IACF,SAAS,KAAP;AACA,eAAS,eAAe,QAAQ,IAAI,UAAU,mBAAmB;AAAA,IACnE,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,mBAAmB,MAAM;AAC7B,mBAAe,CAAC,WAAW;AAC3B,gBAAY,KAAK;AACjB,aAAS,IAAI;AACb,eAAW,IAAI;AACf,WAAO,EAAE;AAAA,EACX;AAEA,QAAM,oBAAoB,MAAM;AAC9B,gBAAY,CAAC,QAAQ;AACrB,gBAAY,KAAK;AACjB,aAAS,IAAI;AACb,eAAW,IAAI;AACf,WAAO,EAAE;AACT,aAAS,EAAE;AACX,mBAAe,EAAE;AAAA,EACnB;AAEA,MAAI,aAAa;AACf,WACE,gBAAAE,MAAC,SAAI,OAAO,EAAE,WAAW,UAAU,SAAS,OAAO,GACjD,0BAAAA,MAAC,SAAI,wBAAU,GACjB;AAAA,EAEJ;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,cAAc;AAAA,QACd,WAAW;AAAA,QACX,iBAAiB,OAAO;AAAA,QACxB,QAAQ,aAAa,OAAO;AAAA,QAC5B,GAAG,YAAY,UAAU;AAAA,MAC3B;AAAA,MAEA,0BAAAC,MAAC,UAAK,UAAU,cACd;AAAA,wBAAAD,MAAC,QAAG,OAAO;AAAA,UACT,WAAW;AAAA,UACX,cAAc;AAAA,UACd,OAAO,OAAO;AAAA,UACd,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,GAAG,YAAY,UAAU;AAAA,QAC3B,GACG,qBAAW,cAAc,cAAc,0BAA0B,WACpE;AAAA,QAEC,SACC,gBAAAA,MAAC,SAAI,OAAO;AAAA,UACV,SAAS;AAAA,UACT,cAAc;AAAA,UACd,iBAAiB,OAAO;AAAA,UACxB,OAAO,OAAO;AAAA,UACd,QAAQ,aAAa,OAAO;AAAA,UAC5B,cAAc;AAAA,UACd,UAAU;AAAA,QACZ,GACG,iBACH;AAAA,QAGD,WACC,gBAAAA,MAAC,SAAI,OAAO;AAAA,UACV,SAAS;AAAA,UACT,cAAc;AAAA,UACd,iBAAiB,OAAO;AAAA,UACxB,OAAO,OAAO;AAAA,UACd,QAAQ,aAAa,OAAO;AAAA,UAC5B,cAAc;AAAA,UACd,UAAU;AAAA,QACZ,GACG,mBACH;AAAA,QAGD,CAAC,YAAY,CAAC,YACb,gBAAAC,MAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,0BAAAD,MAAC,WAAM,SAAQ,SAAQ,OAAO;AAAA,YAC5B,SAAS;AAAA,YACT,cAAc;AAAA,YACd,YAAY;AAAA,YACZ,OAAO,OAAO;AAAA,YACd,UAAU;AAAA,UACZ,GAAG,mBAAK;AAAA,UACR,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,MAAK;AAAA,cACL,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,cACxC,SAAS,CAAC,MAAM;AACd,kBAAE,cAAc,MAAM,cAAc,OAAO;AAC3C,kBAAE,cAAc,MAAM,UAAU,aAAa,OAAO;AAAA,cACtD;AAAA,cACA,QAAQ,CAAC,MAAM;AACb,kBAAE,cAAc,MAAM,cAAc,OAAO;AAC3C,kBAAE,cAAc,MAAM,UAAU;AAAA,cAClC;AAAA,cACA,UAAQ;AAAA,cACR,UAAU;AAAA,cACV,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,QAAQ,aAAa,OAAO;AAAA,gBAC5B,cAAc;AAAA,gBACd,UAAU;AAAA,gBACV,WAAW;AAAA,gBACX,iBAAiB,OAAO;AAAA,gBACxB,OAAO,OAAO;AAAA,gBACd,YAAY;AAAA,gBACZ,qBAAqB,OAAO;AAAA,gBAC5B,iBAAiB,gBAAgB,OAAO;AAAA,gBACxC,GAAG,YAAY,UAAU;AAAA,cAC3B;AAAA,cACA,aAAY;AAAA;AAAA,UACd;AAAA,WACF;AAAA,QAGD,CAAC,YAAY,YACZ,gBAAAC,MAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,0BAAAD,MAAC,WAAM,SAAQ,eAAc,OAAO;AAAA,YAClC,SAAS;AAAA,YACT,cAAc;AAAA,YACd,YAAY;AAAA,YACZ,OAAO,OAAO;AAAA,YACd,UAAU;AAAA,UACZ,GAAG,0BAAY;AAAA,UACf,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,MAAK;AAAA,cACL,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,cAC9C,SAAS,CAAC,MAAM;AACd,kBAAE,cAAc,MAAM,cAAc,OAAO;AAC3C,kBAAE,cAAc,MAAM,UAAU,aAAa,OAAO;AAAA,cACtD;AAAA,cACA,QAAQ,CAAC,MAAM;AACb,kBAAE,cAAc,MAAM,cAAc,OAAO;AAC3C,kBAAE,cAAc,MAAM,UAAU;AAAA,cAClC;AAAA,cACA,UAAQ;AAAA,cACR,UAAU;AAAA,cACV,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,QAAQ,aAAa,OAAO;AAAA,gBAC5B,cAAc;AAAA,gBACd,UAAU;AAAA,gBACV,WAAW;AAAA,gBACX,iBAAiB,OAAO;AAAA,gBACxB,OAAO,OAAO;AAAA,gBACd,YAAY;AAAA,gBACZ,qBAAqB,OAAO;AAAA,gBAC5B,iBAAiB,gBAAgB,OAAO;AAAA,gBACxC,GAAG,YAAY,UAAU;AAAA,cAC3B;AAAA,cACA,aAAY;AAAA;AAAA,UACd;AAAA,WACF;AAAA,QAGD,eAAe,CAAC,YACf,gBAAAC,MAAC,SAAI,OAAO,EAAE,cAAc,QAAQ,UAAU,WAAW,GACvD;AAAA,0BAAAD,MAAC,WAAM,SAAQ,YAAW,OAAO;AAAA,YAC/B,SAAS;AAAA,YACT,cAAc;AAAA,YACd,YAAY;AAAA,YACZ,OAAO,OAAO;AAAA,YACd,UAAU;AAAA,UACZ,GAAG,sBAAQ;AAAA,UACX,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,MAAM,eAAe,SAAS;AAAA,cAC9B,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,cAC3C,SAAS,CAAC,MAAM;AACd,kBAAE,cAAc,MAAM,cAAc,OAAO;AAC3C,kBAAE,cAAc,MAAM,UAAU,aAAa,OAAO;AAAA,cACtD;AAAA,cACA,QAAQ,CAAC,MAAM;AACb,kBAAE,cAAc,MAAM,cAAc,OAAO;AAC3C,kBAAE,cAAc,MAAM,UAAU;AAAA,cAClC;AAAA,cACA,UAAQ;AAAA,cACR,UAAU;AAAA,cACV,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,QAAQ,aAAa,OAAO;AAAA,gBAC5B,cAAc;AAAA,gBACd,UAAU;AAAA,gBACV,WAAW;AAAA,gBACX,iBAAiB,OAAO;AAAA,gBACxB,OAAO,OAAO;AAAA,gBACd,YAAY;AAAA,gBACZ,qBAAqB,OAAO;AAAA,gBAC5B,iBAAiB,gBAAgB,OAAO;AAAA,gBACxC,GAAG,YAAY,UAAU;AAAA,cAC3B;AAAA,cACA,aAAY;AAAA;AAAA,UACd;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM,gBAAgB,CAAC,YAAY;AAAA,cAC5C,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,OAAO;AAAA,gBACP,KAAK;AAAA,gBACL,YAAY;AAAA,gBACZ,QAAQ;AAAA,gBACR,QAAQ;AAAA,gBACR,OAAO,OAAO;AAAA,gBACd,UAAU;AAAA,cACZ;AAAA,cAEC,yBAAe,SAAS;AAAA;AAAA,UAC3B;AAAA,WACF;AAAA,QAGD,YACC,gBAAAC,MAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,0BAAAD,MAAC,WAAM,SAAQ,OAAM,OAAO;AAAA,YAC1B,SAAS;AAAA,YACT,cAAc;AAAA,YACd,YAAY;AAAA,YACZ,OAAO,OAAO;AAAA,YACd,UAAU;AAAA,UACZ,GAAG,+BAAiB;AAAA,UACpB,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,MAAK;AAAA,cACL,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,OAAO,EAAE,OAAO,KAAK;AAAA,cACtC,SAAS,CAAC,MAAM;AACd,kBAAE,cAAc,MAAM,cAAc,OAAO;AAC3C,kBAAE,cAAc,MAAM,UAAU,aAAa,OAAO;AAAA,cACtD;AAAA,cACA,QAAQ,CAAC,MAAM;AACb,kBAAE,cAAc,MAAM,cAAc,OAAO;AAC3C,kBAAE,cAAc,MAAM,UAAU;AAAA,cAClC;AAAA,cACA,UAAQ;AAAA,cACR,UAAU;AAAA,cACV,WAAW;AAAA,cACX,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,QAAQ,aAAa,OAAO;AAAA,gBAC5B,cAAc;AAAA,gBACd,UAAU;AAAA,gBACV,WAAW;AAAA,gBACX,eAAe;AAAA,gBACf,WAAW;AAAA,gBACX,iBAAiB,OAAO;AAAA,gBACxB,OAAO,OAAO;AAAA,gBACd,YAAY;AAAA,gBACZ,qBAAqB,OAAO;AAAA,gBAC5B,iBAAiB,gBAAgB,OAAO;AAAA,gBACxC,GAAG,YAAY,UAAU;AAAA,cAC3B;AAAA,cACA,aAAY;AAAA;AAAA,UACd;AAAA,WACF;AAAA,QAGF,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU;AAAA,YACV,cAAc,CAAC,MAAM;AACnB,kBAAI,CAAC,WAAW;AACd,kBAAE,cAAc,MAAM,kBAAkB,OAAO;AAAA,cACjD;AAAA,YACF;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,gBAAE,cAAc,MAAM,kBAAkB,OAAO;AAAA,YACjD;AAAA,YACA,OAAO;AAAA,cACL,OAAO;AAAA,cACP,SAAS;AAAA,cACT,iBAAiB,OAAO;AAAA,cACxB,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,QAAQ,YAAY,gBAAgB;AAAA,cACpC,SAAS,YAAY,MAAM;AAAA,cAC3B,YAAY;AAAA,cACZ,GAAG,YAAY,UAAU;AAAA,YAC3B;AAAA,YAEC,sBAAY,mBAAmB,WAAW,eAAe,cAAc,YAAY,WAAW,wBAAwB;AAAA;AAAA,QACzH;AAAA,QAEC,CAAC,YACA,gBAAAC,MAAC,SAAI,OAAO,EAAE,WAAW,UAAU,WAAW,OAAO,GACnD;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,UAAU;AAAA,cACV,OAAO;AAAA,gBACL,YAAY;AAAA,gBACZ,QAAQ;AAAA,gBACR,OAAO,OAAO;AAAA,gBACd,QAAQ;AAAA,gBACR,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,aAAa;AAAA,cACf;AAAA,cAEC,wBAAc,yBAAyB;AAAA;AAAA,UAC1C;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,UAAU;AAAA,cACV,OAAO;AAAA,gBACL,YAAY;AAAA,gBACZ,QAAQ;AAAA,gBACR,OAAO,OAAO;AAAA,gBACd,QAAQ;AAAA,gBACR,UAAU;AAAA,gBACV,YAAY;AAAA,cACd;AAAA,cAEC,qBAAW,sBAAsB;AAAA;AAAA,UACpC;AAAA,WACF;AAAA,QAGD,YACC,gBAAAA,MAAC,SAAI,OAAO,EAAE,WAAW,UAAU,WAAW,OAAO,GACnD,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM;AACb,0BAAY,KAAK;AACjB,qBAAO,EAAE;AACT,uBAAS,IAAI;AACb,yBAAW,IAAI;AAAA,YACjB;AAAA,YACA,UAAU;AAAA,YACV,OAAO;AAAA,cACL,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,OAAO,OAAO;AAAA,cACd,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,YAAY;AAAA,YACd;AAAA,YACD;AAAA;AAAA,QAED,GACF;AAAA,SAEJ;AAAA;AAAA,EACF;AAEJ;;;AGvcA,SAAgB,YAAAH,YAAU,aAAAC,kBAAiB;AA+GnC,gBAAAE,OAuCA,QAAAC,aAvCA;AA7FD,IAAM,SAAgC,CAAC,EAAE,aAAa,WAAW,MAAM;AAC5E,QAAM,EAAE,QAAQ,WAAW,IAAIK,SAAQ;AACvC,QAAM,SAAS,eAAe;AAC9B,QAAM,CAAC,MAAM,OAAO,IAAIT,WAAS,EAAE;AACnC,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,EAAE;AACrC,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAS,EAAE;AACjD,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAS,EAAE;AAC3C,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,WAAS,EAAE;AACzD,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAS,KAAK;AACtD,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAwB,IAAI;AACtD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAwB,IAAI;AAE1D,EAAAC,WAAU,MAAM;AACd,QAAI,cAAc,aAAa;AAC7B,YAAM,WAAW,eACf,QAAQ,IAAI,4CACZ,QAAQ,IAAI,0CACZ;AAEF,YAAM,UAAU,QAAQ,IAAI,iCAC1B,QAAQ,IAAI,gCACX,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAE5D,aAAO,SAAS,OAAO,GAAG,UAAU;AAAA,IACtC;AAAA,EACF,GAAG,CAAC,YAAY,WAAW,CAAC;AAE5B,QAAM,sBAAsB,CAAC,KAAaS,YAA2E;AACnH,QAAI,CAAC;AAAK,aAAO,EAAE,UAAU,QAAQ,OAAOA,QAAO,gBAAgB;AAEnE,QAAI,QAAQ;AACZ,QAAI,IAAI,UAAU;AAAG;AACrB,QAAI,IAAI,UAAU;AAAG;AACrB,QAAI,QAAQ,KAAK,GAAG,KAAK,QAAQ,KAAK,GAAG;AAAG;AAC5C,QAAI,KAAK,KAAK,GAAG;AAAG;AACpB,QAAI,cAAc,KAAK,GAAG;AAAG;AAE7B,QAAI,SAAS;AAAG,aAAO,EAAE,UAAU,QAAQ,OAAOA,QAAO,UAAU;AACnE,QAAI,SAAS;AAAG,aAAO,EAAE,UAAU,UAAU,OAAOA,QAAO,eAAe,OAAO;AACjF,WAAO,EAAE,UAAU,UAAU,OAAOA,QAAO,YAAY;AAAA,EACzD;AAEA,QAAM,mBAAmB,oBAAoB,UAAU,MAAM;AAE7D,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,eAAW,IAAI;AAEf,QAAI,aAAa,iBAAiB;AAChC,eAAS,wBAAwB;AACjC,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,QAAI,SAAS,SAAS,GAAG;AACvB,eAAS,wCAAwC;AACjD,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,QAAI;AACF,YAAM,aAAkB,EAAE,MAAM,SAAS;AACzC,UAAI;AAAO,mBAAW,QAAQ;AAC9B,UAAI;AAAa,mBAAW,cAAc;AAE1C,YAAM,WAAW,MAAM,OAAO,UAAU;AACxC,UAAI,SAAS,SAAS;AACpB,mBAAW,0EAA0E;AAAA,MACvF,OAAO;AACL,iBAAS,SAAS,WAAW,qBAAqB;AAAA,MACpD;AAAA,IACF,SAAS,KAAP;AACA,eAAS,eAAe,QAAQ,IAAI,UAAU,mBAAmB;AAAA,IACnE,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,SACE,gBAAAP,MAAC,gBAAa,OAAO;AAAA,IACnB,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,iBAAiB,OAAO;AAAA,IACxB,QAAQ,aAAa,OAAO;AAAA,IAC5B,GAAG,YAAY,UAAU;AAAA,EAC3B,GACE,0BAAAC,MAAC,UAAK,UAAU,cACd;AAAA,oBAAAD,MAAC,QAAG,OAAO;AAAA,MACT,WAAW;AAAA,MACX,cAAc;AAAA,MACd,OAAO,OAAO;AAAA,MACd,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,GAAG,YAAY,UAAU;AAAA,IAC3B,GAAG,iCAEH;AAAA,IAEC,SACC,gBAAAA,MAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB,OAAO;AAAA,MACxB,OAAO,OAAO;AAAA,MACd,QAAQ,aAAa,OAAO;AAAA,MAC5B,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,GACG,iBACH;AAAA,IAGD,WACC,gBAAAA,MAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB,OAAO;AAAA,MACxB,OAAO,OAAO;AAAA,MACd,QAAQ,aAAa,OAAO;AAAA,MAC5B,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,GACG,mBACH;AAAA,IAGF,gBAAAC,MAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,sBAAAD,MAAC,WAAM,SAAQ,QAAO,OAAO;AAAA,QAC3B,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO,OAAO;AAAA,QACd,UAAU;AAAA,MACZ,GAAG,uBAAS;AAAA,MACZ,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,KAAK;AAAA,UACvC,SAAS,CAAC,MAAM;AACd,cAAE,cAAc,MAAM,cAAc,OAAO;AAC3C,cAAE,cAAc,MAAM,UAAU,aAAa,OAAO;AAAA,UACtD;AAAA,UACA,QAAQ,CAAC,MAAM;AACb,cAAE,cAAc,MAAM,cAAc,OAAO;AAC3C,cAAE,cAAc,MAAM,UAAU;AAAA,UAClC;AAAA,UACA,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ,aAAa,OAAO;AAAA,YAC5B,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,iBAAiB,OAAO;AAAA,YACxB,OAAO,OAAO;AAAA,YACd,YAAY;AAAA,YACZ,qBAAqB,OAAO;AAAA,YAC5B,iBAAiB,gBAAgB,OAAO;AAAA,YACxC,GAAG,YAAY,UAAU;AAAA,UAC3B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,sBAAAD,MAAC,WAAM,SAAQ,SAAQ,OAAO;AAAA,QAC5B,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO,OAAO;AAAA,QACd,UAAU;AAAA,MACZ,GAAG,mBAAK;AAAA,MACR,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,UACxC,SAAS,CAAC,MAAM;AACd,cAAE,cAAc,MAAM,cAAc,OAAO;AAC3C,cAAE,cAAc,MAAM,UAAU,aAAa,OAAO;AAAA,UACtD;AAAA,UACA,QAAQ,CAAC,MAAM;AACb,cAAE,cAAc,MAAM,cAAc,OAAO;AAC3C,cAAE,cAAc,MAAM,UAAU;AAAA,UAClC;AAAA,UACA,UAAU,CAAC;AAAA,UACX,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ,aAAa,OAAO;AAAA,YAC5B,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,iBAAiB,OAAO;AAAA,YACxB,OAAO,OAAO;AAAA,YACd,YAAY;AAAA,YACZ,qBAAqB,OAAO;AAAA,YAC5B,iBAAiB,gBAAgB,OAAO;AAAA,YACxC,GAAG,YAAY,UAAU;AAAA,UAC3B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,sBAAAD,MAAC,WAAM,SAAQ,eAAc,OAAO;AAAA,QAClC,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO,OAAO;AAAA,QACd,UAAU;AAAA,MACZ,GAAG,qCAAuB;AAAA,MAC1B,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,OAAO;AAAA,UACP,UAAU;AAAA,UACV,UAAU;AAAA,UACV,aAAY;AAAA,UACZ,OAAO,YAAY,UAAU;AAAA;AAAA,MAC/B;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,SAAI,OAAO,EAAE,cAAc,QAAQ,UAAU,WAAW,GACvD;AAAA,sBAAAD,MAAC,WAAM,SAAQ,YAAW,OAAO;AAAA,QAC/B,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO,OAAO;AAAA,QACd,UAAU;AAAA,MACZ,GAAG,sBAAQ;AAAA,MACX,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAM,eAAe,SAAS;AAAA,UAC9B,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,UAC3C,SAAS,CAAC,MAAM;AACd,cAAE,cAAc,MAAM,cAAc,OAAO;AAC3C,cAAE,cAAc,MAAM,UAAU,aAAa,OAAO;AAAA,UACtD;AAAA,UACA,QAAQ,CAAC,MAAM;AACb,cAAE,cAAc,MAAM,cAAc,OAAO;AAC3C,cAAE,cAAc,MAAM,UAAU;AAAA,UAClC;AAAA,UACA,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,WAAW;AAAA,UACX,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ,aAAa,OAAO;AAAA,YAC5B,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,iBAAiB,OAAO;AAAA,YACxB,OAAO,OAAO;AAAA,YACd,YAAY;AAAA,YACZ,qBAAqB,OAAO;AAAA,YAC5B,iBAAiB,gBAAgB,OAAO;AAAA,YACxC,GAAG,YAAY,UAAU;AAAA,UAC3B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,gBAAgB,CAAC,YAAY;AAAA,UAC5C,OAAO;AAAA,YACL,UAAU;AAAA,YACV,OAAO;AAAA,YACP,KAAK;AAAA,YACL,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,OAAO,OAAO;AAAA,YACd,UAAU;AAAA,UACZ;AAAA,UAEC,yBAAe,SAAS;AAAA;AAAA,MAC3B;AAAA,MACC,YACC,gBAAAC,MAAC,SAAI,OAAO,EAAE,WAAW,MAAM,GAC7B;AAAA,wBAAAD,MAAC,SAAI,OAAO;AAAA,UACV,QAAQ;AAAA,UACR,iBAAiB,OAAO;AAAA,UACxB,cAAc;AAAA,UACd,UAAU;AAAA,QACZ,GACE,0BAAAA,MAAC,SAAI,OAAO;AAAA,UACV,QAAQ;AAAA,UACR,OAAO,iBAAiB,aAAa,SAAS,QAAQ,iBAAiB,aAAa,WAAW,QAAQ;AAAA,UACvG,iBAAiB,iBAAiB;AAAA,UAClC,YAAY;AAAA,QACd,GAAG,GACL;AAAA,QACA,gBAAAC,MAAC,OAAE,OAAO;AAAA,UACR,UAAU;AAAA,UACV,OAAO,iBAAiB;AAAA,UACxB,WAAW;AAAA,UACX,eAAe;AAAA,QACjB,GACG;AAAA,2BAAiB;AAAA,UAAS;AAAA,WAC7B;AAAA,SACF;AAAA,OAEJ;AAAA,IAEA,gBAAAA,MAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,sBAAAD,MAAC,WAAM,SAAQ,mBAAkB,OAAO;AAAA,QACtC,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO,OAAO;AAAA,QACd,UAAU;AAAA,MACZ,GAAG,8BAAgB;AAAA,MACnB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAM,eAAe,SAAS;AAAA,UAC9B,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,mBAAmB,EAAE,OAAO,KAAK;AAAA,UAClD,SAAS,CAAC,MAAM;AACd,cAAE,cAAc,MAAM,cAAc,OAAO;AAC3C,cAAE,cAAc,MAAM,UAAU,aAAa,OAAO;AAAA,UACtD;AAAA,UACA,QAAQ,CAAC,MAAM;AACb,cAAE,cAAc,MAAM,cAAc,OAAO;AAC3C,cAAE,cAAc,MAAM,UAAU;AAAA,UAClC;AAAA,UACA,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ,aAAa,OAAO;AAAA,YAC5B,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,iBAAiB,OAAO;AAAA,YACxB,OAAO,OAAO;AAAA,YACd,YAAY;AAAA,YACZ,qBAAqB,OAAO;AAAA,YAC5B,iBAAiB,gBAAgB,OAAO;AAAA,YACxC,GAAG,YAAY,UAAU;AAAA,UAC3B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,UAAU;AAAA,QACV,cAAc,CAAC,MAAM;AACnB,cAAI,CAAC,WAAW;AACd,cAAE,cAAc,MAAM,kBAAkB,OAAO;AAAA,UACjD;AAAA,QACF;AAAA,QACA,cAAc,CAAC,MAAM;AACnB,YAAE,cAAc,MAAM,kBAAkB,OAAO;AAAA,QACjD;AAAA,QACA,OAAO;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,iBAAiB,OAAO;AAAA,UACxB,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ,YAAY,gBAAgB;AAAA,UACpC,SAAS,YAAY,MAAM;AAAA,UAC3B,YAAY;AAAA,UACZ,GAAG,YAAY,UAAU;AAAA,QAC3B;AAAA,QAEC,sBAAY,wBAAwB;AAAA;AAAA,IACvC;AAAA,KACF,GACF;AAEJ;;;ACrZA,SAAgB,aAAAF,kBAAiB;AA+B3B,gBAAAE,aAAA;AAxBC,IAAM,UAAkC,CAAC,EAAE,YAAY,MAAM;AAClE,QAAM,EAAE,QAAQ,IAAIM,SAAQ;AAE5B,EAAAR,WAAU,MAAM;AACd,UAAM,iBAAiB,YAAY;AACjC,YAAM,QAAQ;AAEd,YAAM,WAAW,eACf,QAAQ,IAAI,0CACZ,QAAQ,IAAI,wCACZ;AAEF,YAAM,UAAU,QAAQ,IAAI,iCAC1B,QAAQ,IAAI,gCACX,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAE5D,aAAO,SAAS,OAAO,GAAG,UAAU;AAAA,IACtC;AAEA,mBAAe;AAAA,EACjB,GAAG,CAAC,SAAS,WAAW,CAAC;AAEzB,SACE,gBAAAE,MAAC,SAAI,OAAO,EAAE,WAAW,UAAU,SAAS,OAAO,GACjD,0BAAAA,MAAC,SAAI,4BAAc,GACrB;AAEJ;;;AClCA,SAAgB,YAAAH,YAAU,QAAQ,aAAAC,kBAAiB;AA2D7C,SAqBE,OAAAE,OArBF,QAAAC,aAAA;AA3CC,IAAM,aAAwC,CAAC,EAAE,WAAW,OAAO,WAAW,MAAM;AACzF,QAAM,EAAE,MAAM,QAAQ,IAAIK,SAAQ;AAClC,QAAM,SAAS,eAAe;AAC9B,QAAM,CAAC,QAAQ,SAAS,IAAIT,WAAS,KAAK;AAC1C,QAAM,cAAc,OAAuB,IAAI;AAE/C,EAAAC,WAAU,MAAM;AACd,UAAM,qBAAqB,CAAC,UAAsB;AAChD,UAAI,YAAY,WAAW,CAAC,YAAY,QAAQ,SAAS,MAAM,MAAc,GAAG;AAC9E,kBAAU,KAAK;AAAA,MACjB;AAAA,IACF;AAEA,aAAS,iBAAiB,aAAa,kBAAkB;AACzD,WAAO,MAAM,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,EAC3E,GAAG,CAAC,CAAC;AAEL,MAAI,CAAC;AAAM,WAAO;AAElB,QAAM,cAAc,CAAC,SAAiB;AACpC,WAAO,KACJ,MAAM,GAAG,EACT,IAAI,OAAK,EAAE,CAAC,CAAC,EACb,KAAK,EAAE,EACP,YAAY,EACZ,MAAM,GAAG,CAAC;AAAA,EACf;AAEA,QAAM,gBAAgB,YAAY;AAChC,UAAM,QAAQ;AACd,UAAM,WAAW,QAAQ,IAAI,0CAC3B,QAAQ,IAAI,wCACZ;AAEF,UAAM,UAAU,QAAQ,IAAI,iCAC1B,QAAQ,IAAI,gCACX,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAE5D,WAAO,SAAS,OAAO,GAAG,UAAU;AAAA,EACtC;AAEA,SACE,gBAAAG,MAAC,gBAAa,OAAO,EAAE,UAAU,YAAY,GAAG,YAAY,UAAU,cAAc,GAAG,KAAK,aAC1F;AAAA,oBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,MAAM,UAAU,CAAC,MAAM;AAAA,QAChC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,KAAK;AAAA,UACL,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,GAAG,YAAY,UAAU;AAAA,QAC3B;AAAA,QACA,cAAc,CAAC,MAAM;AACnB,YAAE,cAAc,MAAM,kBAAkB,OAAO;AAAA,QACjD;AAAA,QACA,cAAc,CAAC,MAAM;AACnB,YAAE,cAAc,MAAM,kBAAkB;AAAA,QAC1C;AAAA,QAEA;AAAA,0BAAAD,MAAC,SAAI,OAAO;AAAA,YACV,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,iBAAiB,OAAO;AAAA,YACxB,OAAO,OAAO;AAAA,YACd,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,gBAAgB;AAAA,YAChB,UAAU;AAAA,YACV,YAAY;AAAA,UACd,GACG,sBAAY,KAAK,IAAI,GACxB;AAAA,UACC,YACC,gBAAAA,MAAC,UAAK,OAAO,EAAE,UAAU,QAAQ,YAAY,KAAK,OAAO,OAAO,YAAY,GACzE,eAAK,MACR;AAAA;AAAA;AAAA,IAEJ;AAAA,IAEC,UACC,gBAAAC,MAAC,SAAI,OAAO;AAAA,MACV,UAAU;AAAA,MACV,KAAK;AAAA,MACL,OAAO;AAAA,MACP,WAAW;AAAA,MACX,OAAO;AAAA,MACP,iBAAiB,OAAO;AAAA,MACxB,cAAc;AAAA,MACd,WAAW;AAAA,MACX,QAAQ,aAAa,OAAO;AAAA,MAC5B,QAAQ;AAAA,MACR,GAAG,YAAY,UAAU;AAAA,IAC3B,GACE;AAAA,sBAAAD,MAAC,SAAI,OAAO;AAAA,QACV,SAAS;AAAA,QACT,cAAc,aAAa,OAAO;AAAA,MACpC,GACE,0BAAAC,MAAC,SAAI,OAAO;AAAA,QACV,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,MACP,GACE;AAAA,wBAAAD,MAAC,SAAI,OAAO;AAAA,UACV,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,iBAAiB,OAAO;AAAA,UACxB,OAAO,OAAO;AAAA,UACd,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,UAAU;AAAA,UACV,YAAY;AAAA,QACd,GACG,sBAAY,KAAK,IAAI,GACxB;AAAA,QACA,gBAAAC,MAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,GACjC;AAAA,0BAAAD,MAAC,SAAI,OAAO;AAAA,YACV,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,OAAO,OAAO;AAAA,YACd,UAAU;AAAA,YACV,cAAc;AAAA,YACd,YAAY;AAAA,UACd,GACG,eAAK,MACR;AAAA,UACA,gBAAAA,MAAC,SAAI,OAAO;AAAA,YACV,UAAU;AAAA,YACV,OAAO,OAAO;AAAA,YACd,UAAU;AAAA,YACV,cAAc;AAAA,YACd,YAAY;AAAA,UACd,GACG,eAAK,OACR;AAAA,WACF;AAAA,SACF,GACF;AAAA,MAEA,gBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,MAAM,GAC3B,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,iBAAiB;AAAA,YACjB,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,UAAU;AAAA,YACV,OAAO,OAAO;AAAA,YACd,YAAY;AAAA,YACZ,YAAY;AAAA,UACd;AAAA,UACA,cAAc,CAAC,MAAM;AACnB,cAAE,cAAc,MAAM,kBAAkB,OAAO;AAAA,UACjD;AAAA,UACA,cAAc,CAAC,MAAM;AACnB,cAAE,cAAc,MAAM,kBAAkB;AAAA,UAC1C;AAAA,UACD;AAAA;AAAA,MAED,GACF;AAAA,OACF;AAAA,KAEJ;AAEJ;;;AChMA,SAA2B,aAAAF,mBAAiB;AAuCpC,SASC,YAAAU,WATD,OAAAR,aAAA;AA9BD,IAAM,iBAAgD,CAAC;AAAA,EAC5D;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,YAAY,SAAS,IAAIM,SAAQ;AAEzC,EAAAR,YAAU,MAAM;AACd,QAAI,YAAY,CAAC,YAAY;AAC3B,YAAM,YAAY,cAChB,QAAQ,IAAI,sCACZ,QAAQ,IAAI,oCACZ;AAEF,YAAM,UAAU,QAAQ,IAAI,iCAC1B,QAAQ,IAAI,gCACX,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAE5D,aAAO,SAAS,OAAO,GAAG,UAAU;AAAA,IACtC;AAAA,EACF,GAAG,CAAC,YAAY,UAAU,UAAU,CAAC;AAErC,MAAI,CAAC,UAAU;AACb,WAAO,YACL,gBAAAE,MAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,WAAW;AAAA,IACb,GACE,0BAAAA,MAAC,SAAI,wBAAU,GACjB;AAAA,EAEJ;AAEA,MAAI,CAAC,YAAY;AACf,WAAO,YAAY;AAAA,EACrB;AAEA,SAAO,gBAAAA,MAAAQ,WAAA,EAAG,UAAS;AACrB;;;ACjDA,SAA2B,aAAAV,mBAAiB;AAqCpC,SASC,YAAAU,WATD,OAAAR,aAAA;AA7BD,IAAM,cAA0C,CAAC;AAAA,EACtD;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,YAAY,SAAS,IAAIM,SAAQ;AAEzC,EAAAR,YAAU,MAAM;AACd,QAAI,YAAY,YAAY;AAC1B,YAAM,gBAAgB,cACpB,QAAQ,IAAI,yCACZ,QAAQ,IAAI,uCACZ;AAEF,YAAM,UAAU,QAAQ,IAAI,iCAC1B,QAAQ,IAAI,gCACX,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAE5D,aAAO,SAAS,OAAO,GAAG,UAAU;AAAA,IACtC;AAAA,EACF,GAAG,CAAC,YAAY,UAAU,UAAU,CAAC;AAErC,MAAI,CAAC,UAAU;AACb,WACE,gBAAAE,MAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,WAAW;AAAA,IACb,GACE,0BAAAA,MAAC,SAAI,wBAAU,GACjB;AAAA,EAEJ;AAEA,MAAI,YAAY;AACd,WAAO;AAAA,EACT;AAEA,SAAO,gBAAAA,MAAAQ,WAAA,EAAG,UAAS;AACrB;;;AC/CA,SAAgB,aAAAV,aAAW,YAAAD,kBAAgB;AA2EnC,qBAAAW,WACE,OAAAR,OADF,QAAAC,cAAA;AAlED,IAAM,cAA0C,CAAC,EAAE,OAAO,WAAW,QAAQ,MAAM;AACxF,QAAM,EAAE,iBAAiB,IAAIK,SAAQ;AACrC,QAAM,CAAC,QAAQ,SAAS,IAAIT,WAA0C,SAAS;AAC/E,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,EAAE;AAEzC,EAAAC,YAAU,MAAM;AACd,UAAM,SAAS,YAAY;AAEzB,YAAM,cAAc,UAAU,OAAO,WAAW,cAC5C,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,OAAO,IACvD;AAEJ,UAAI,CAAC,aAAa;AAChB,kBAAU,OAAO;AACjB,mBAAW,gCAAgC;AAC3C,kBAAU,gCAAgC;AAC1C;AAAA,MACF;AAEA,UAAI;AACF,cAAM,WAAW,MAAM,iBAAiB,WAAW;AACnD,YAAI,SAAS,SAAS;AACpB,oBAAU,SAAS;AACnB,qBAAW,6CAA6C;AACxD,sBAAY;AAGZ,qBAAW,MAAM;AACf,kBAAM,WAAW,QAAQ,IAAI,0CAC3B,QAAQ,IAAI,wCACZ;AAEF,kBAAM,UAAU,QAAQ,IAAI,iCAC1B,QAAQ,IAAI,gCACX,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAE5D,mBAAO,SAAS,OAAO,GAAG,UAAU;AAAA,UACtC,GAAG,GAAI;AAAA,QACT,OAAO;AACL,oBAAU,OAAO;AACjB,qBAAW,SAAS,WAAW,qBAAqB;AACpD,oBAAU,SAAS,WAAW,qBAAqB;AAAA,QACrD;AAAA,MACF,SAAS,KAAP;AACA,kBAAU,OAAO;AACjB,cAAM,WAAW,eAAe,QAAQ,IAAI,UAAU;AACtD,mBAAW,QAAQ;AACnB,kBAAU,QAAQ;AAAA,MACpB;AAAA,IACF;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,kBAAkB,WAAW,OAAO,CAAC;AAEhD,SACE,gBAAAG,OAAC,SAAI,OAAO;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,WAAW;AAAA,EACb,GACG;AAAA,eAAW,aACV,gBAAAA,OAAAO,WAAA,EACE;AAAA,sBAAAR,MAAC,SAAI,OAAO;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,cAAc;AAAA,QACd,WAAW;AAAA,MACb,GAAG;AAAA,MACH,gBAAAA,MAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA,aAKN;AAAA,MACF,gBAAAA,MAAC,QAAG,OAAO;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,cAAc;AAAA,MAChB,GAAG,qCAEH;AAAA,MACA,gBAAAA,MAAC,OAAE,OAAO,EAAE,UAAU,QAAQ,OAAO,OAAO,GAAG,6DAE/C;AAAA,OACF;AAAA,IAGD,WAAW,aACV,gBAAAC,OAAAO,WAAA,EACE;AAAA,sBAAAR,MAAC,SAAI,OAAO;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,iBAAiB;AAAA,QACjB,cAAc;AAAA,QACd,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,MAClB,GACE,0BAAAA,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,SAAQ,aAAY,KACrF,0BAAAA,MAAC,cAAS,QAAO,kBAAiB,GACpC,GACF;AAAA,MACA,gBAAAA,MAAC,QAAG,OAAO;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,cAAc;AAAA,MAChB,GAAG,6BAEH;AAAA,MACA,gBAAAA,MAAC,OAAE,OAAO,EAAE,UAAU,QAAQ,OAAO,OAAO,GACzC,mBACH;AAAA,OACF;AAAA,IAGD,WAAW,WACV,gBAAAC,OAAAO,WAAA,EACE;AAAA,sBAAAR,MAAC,SAAI,OAAO;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,iBAAiB;AAAA,QACjB,cAAc;AAAA,QACd,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,MAClB,GACE,0BAAAC,OAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,SAAQ,aAAY,KACrF;AAAA,wBAAAD,MAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK;AAAA,QACpC,gBAAAA,MAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK;AAAA,SACtC,GACF;AAAA,MACA,gBAAAA,MAAC,QAAG,OAAO;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,cAAc;AAAA,MAChB,GAAG,iCAEH;AAAA,MACA,gBAAAA,MAAC,OAAE,OAAO,EAAE,UAAU,QAAQ,OAAO,QAAQ,cAAc,OAAO,GAC/D,mBACH;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM;AACb,kBAAM,YAAY,QAAQ,IAAI,sCAC5B,QAAQ,IAAI,oCACZ;AAEF,kBAAM,UAAU,QAAQ,IAAI,iCAC1B,QAAQ,IAAI,gCACX,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAE5D,mBAAO,SAAS,OAAO,GAAG,UAAU;AAAA,UACtC;AAAA,UACA,OAAO;AAAA,YACL,SAAS;AAAA,YACT,iBAAiB;AAAA,YACjB,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,QAAQ;AAAA,UACV;AAAA,UACD;AAAA;AAAA,MAED;AAAA,OACF;AAAA,KAEJ;AAEJ;;;AChMA,SAAgB,YAAAH,kBAAgB;AAsDxB,gBAAAG,OAgDA,QAAAC,cAhDA;AAxCD,IAAM,iBAAgD,CAAC,EAAE,WAAW,MAAM;AAC/E,QAAM,EAAE,eAAe,IAAIK,SAAQ;AACnC,QAAM,CAAC,OAAO,QAAQ,IAAIT,WAAS,EAAE;AACrC,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAwB,IAAI;AACtD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAwB,IAAI;AAE1D,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,eAAW,IAAI;AAEf,QAAI;AACF,YAAM,WAAW,MAAM,eAAe,KAAK;AAC3C,UAAI,SAAS,SAAS;AACpB,mBAAW,oDAAoD;AAC/D,iBAAS,EAAE;AAAA,MACb,OAAO;AACL,iBAAS,SAAS,WAAW,2BAA2B;AAAA,MAC1D;AAAA,IACF,SAAS,KAAP;AACA,eAAS,eAAe,QAAQ,IAAI,UAAU,mBAAmB;AAAA,IACnE,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,SACE,gBAAAG,MAAC,SAAI,OAAO;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,GAAG,YAAY,UAAU;AAAA,EAC3B,GACE,0BAAAC,OAAC,UAAK,UAAU,cACd;AAAA,oBAAAD,MAAC,QAAG,OAAO;AAAA,MACT,WAAW;AAAA,MACX,cAAc;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,GAAG,YAAY,UAAU;AAAA,IAC3B,GAAG,8BAEH;AAAA,IAEA,gBAAAA,MAAC,OAAE,OAAO;AAAA,MACR,WAAW;AAAA,MACX,cAAc;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,GAAG,wFAEH;AAAA,IAEC,SACC,gBAAAA,MAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,GACG,iBACH;AAAA,IAGD,WACC,gBAAAA,MAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,GACG,mBACH;AAAA,IAGF,gBAAAC,OAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,sBAAAD,MAAC,WAAM,SAAQ,SAAQ,OAAO;AAAA,QAC5B,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,mBAAK;AAAA,MACR,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,UACxC,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,GAAG,YAAY,UAAU;AAAA,UAC3B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,GAAG,YAAY,UAAU;AAAA,QAC3B;AAAA,QAEC,sBAAY,eAAe;AAAA;AAAA,IAC9B;AAAA,IAEA,gBAAAA,MAAC,SAAI,OAAO,EAAE,WAAW,SAAS,GAChC,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM;AACb,gBAAM,YAAY,QAAQ,IAAI,sCAC5B,QAAQ,IAAI,oCACZ;AAEF,gBAAM,UAAU,QAAQ,IAAI,iCAC1B,QAAQ,IAAI,gCACX,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAE5D,iBAAO,SAAS,OAAO,GAAG,UAAU;AAAA,QACtC;AAAA,QACA,UAAU;AAAA,QACV,OAAO;AAAA,UACL,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,YAAY;AAAA,QACd;AAAA,QACD;AAAA;AAAA,IAED,GACF;AAAA,KACF,GACF;AAEJ;;;ACrLA,SAAgB,YAAAH,YAAU,aAAAC,mBAAiB;AAsGrC,SAqBM,OAAAE,OArBN,QAAAC,cAAA;AAvFC,IAAM,gBAA8C,CAAC,EAAE,OAAO,WAAW,MAAM;AACpF,QAAM,EAAE,cAAc,IAAIK,SAAQ;AAClC,QAAM,CAAC,YAAY,aAAa,IAAIT,WAAS,SAAS,EAAE;AACxD,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAS,EAAE;AAC3C,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,WAAS,EAAE;AACzD,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAS,KAAK;AACtD,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAwB,IAAI;AACtD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,KAAK;AAE5C,EAAAC,YAAU,MAAM;AAEd,QAAI,CAAC,cAAc,OAAO,WAAW,aAAa;AAChD,YAAM,WAAW,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,OAAO;AACxE,UAAI,UAAU;AACZ,sBAAc,QAAQ;AAAA,MACxB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,sBAAsB,CAAC,QAA2E;AACtG,QAAI,CAAC;AAAK,aAAO,EAAE,UAAU,QAAQ,OAAO,OAAO;AAEnD,QAAI,QAAQ;AACZ,QAAI,IAAI,UAAU;AAAG;AACrB,QAAI,IAAI,UAAU;AAAG;AACrB,QAAI,QAAQ,KAAK,GAAG,KAAK,QAAQ,KAAK,GAAG;AAAG;AAC5C,QAAI,KAAK,KAAK,GAAG;AAAG;AACpB,QAAI,cAAc,KAAK,GAAG;AAAG;AAE7B,QAAI,SAAS;AAAG,aAAO,EAAE,UAAU,QAAQ,OAAO,OAAO;AACzD,QAAI,SAAS;AAAG,aAAO,EAAE,UAAU,UAAU,OAAO,OAAO;AAC3D,WAAO,EAAE,UAAU,UAAU,OAAO,OAAO;AAAA,EAC7C;AAEA,QAAM,mBAAmB,oBAAoB,QAAQ;AAErD,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,iBAAa,IAAI;AACjB,aAAS,IAAI;AAEb,QAAI,aAAa,iBAAiB;AAChC,eAAS,wBAAwB;AACjC,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,QAAI,SAAS,SAAS,GAAG;AACvB,eAAS,wCAAwC;AACjD,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,QAAI,CAAC,YAAY;AACf,eAAS,qBAAqB;AAC9B,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,cAAc,YAAY,QAAQ;AACzD,UAAI,SAAS,SAAS;AACpB,mBAAW,IAAI;AACf,mBAAW,MAAM;AACf,gBAAM,YAAY,QAAQ,IAAI,sCAC5B,QAAQ,IAAI,oCACZ;AAEF,gBAAM,UAAU,QAAQ,IAAI,iCAC1B,QAAQ,IAAI,gCACX,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAE5D,iBAAO,SAAS,OAAO,GAAG,UAAU;AAAA,QACtC,GAAG,GAAI;AAAA,MACT,OAAO;AACL,iBAAS,SAAS,WAAW,0BAA0B;AAAA,MACzD;AAAA,IACF,SAAS,KAAP;AACA,eAAS,eAAe,QAAQ,IAAI,UAAU,mBAAmB;AAAA,IACnE,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,MAAI,SAAS;AACX,WACE,gBAAAG,OAAC,SAAI,OAAO;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,cAAc;AAAA,MACd,WAAW;AAAA,MACX,iBAAiB;AAAA,MACjB,QAAQ;AAAA,MACR,WAAW;AAAA,IACb,GACE;AAAA,sBAAAD,MAAC,SAAI,OAAO;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,iBAAiB;AAAA,QACjB,cAAc;AAAA,QACd,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,MAClB,GACE,0BAAAA,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,SAAQ,aAAY,KACrF,0BAAAA,MAAC,cAAS,QAAO,kBAAiB,GACpC,GACF;AAAA,MACA,gBAAAA,MAAC,QAAG,OAAO;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,cAAc;AAAA,MAChB,GAAG,wCAEH;AAAA,MACA,gBAAAA,MAAC,OAAE,OAAO,EAAE,UAAU,QAAQ,OAAO,OAAO,GAAG,mEAE/C;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,gBAAAA,MAAC,SAAI,OAAO;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,GAAG,YAAY,UAAU;AAAA,EAC3B,GACE,0BAAAC,OAAC,UAAK,UAAU,cACd;AAAA,oBAAAD,MAAC,QAAG,OAAO;AAAA,MACT,WAAW;AAAA,MACX,cAAc;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,GAAG,YAAY,UAAU;AAAA,IAC3B,GAAG,iCAEH;AAAA,IAEA,gBAAAA,MAAC,OAAE,OAAO;AAAA,MACR,WAAW;AAAA,MACX,cAAc;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,GAAG,4CAEH;AAAA,IAEC,SACC,gBAAAA,MAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,GACG,iBACH;AAAA,IAGF,gBAAAC,OAAC,SAAI,OAAO,EAAE,cAAc,QAAQ,UAAU,WAAW,GACvD;AAAA,sBAAAD,MAAC,WAAM,SAAQ,YAAW,OAAO;AAAA,QAC/B,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,0BAAY;AAAA,MACf,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAM,eAAe,SAAS;AAAA,UAC9B,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,UAC3C,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,WAAW;AAAA,UACX,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,GAAG,YAAY,UAAU;AAAA,UAC3B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,gBAAgB,CAAC,YAAY;AAAA,UAC5C,OAAO;AAAA,YACL,UAAU;AAAA,YACV,OAAO;AAAA,YACP,KAAK;AAAA,YACL,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,UAAU;AAAA,UACZ;AAAA,UAEC,yBAAe,SAAS;AAAA;AAAA,MAC3B;AAAA,MACC,YACC,gBAAAC,OAAC,SAAI,OAAO,EAAE,WAAW,MAAM,GAC7B;AAAA,wBAAAD,MAAC,SAAI,OAAO;AAAA,UACV,QAAQ;AAAA,UACR,iBAAiB;AAAA,UACjB,cAAc;AAAA,UACd,UAAU;AAAA,QACZ,GACE,0BAAAA,MAAC,SAAI,OAAO;AAAA,UACV,QAAQ;AAAA,UACR,OAAO,iBAAiB,aAAa,SAAS,QAAQ,iBAAiB,aAAa,WAAW,QAAQ;AAAA,UACvG,iBAAiB,iBAAiB;AAAA,UAClC,YAAY;AAAA,QACd,GAAG,GACL;AAAA,QACA,gBAAAC,OAAC,OAAE,OAAO;AAAA,UACR,UAAU;AAAA,UACV,OAAO,iBAAiB;AAAA,UACxB,WAAW;AAAA,UACX,eAAe;AAAA,QACjB,GACG;AAAA,2BAAiB;AAAA,UAAS;AAAA,WAC7B;AAAA,SACF;AAAA,OAEJ;AAAA,IAEA,gBAAAA,OAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,sBAAAD,MAAC,WAAM,SAAQ,mBAAkB,OAAO;AAAA,QACtC,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,8BAAgB;AAAA,MACnB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAM,eAAe,SAAS;AAAA,UAC9B,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,mBAAmB,EAAE,OAAO,KAAK;AAAA,UAClD,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,GAAG,YAAY,UAAU;AAAA,UAC3B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,GAAG,YAAY,UAAU;AAAA,QAC3B;AAAA,QAEC,sBAAY,iBAAiB;AAAA;AAAA,IAChC;AAAA,KACF,GACF;AAEJ;;;ACnTA,SAAgB,YAAAH,kBAAgB;AA0FxB,gBAAAG,OAuCA,QAAAC,cAvCA;AA3ED,IAAM,iBAAgD,CAAC,EAAE,WAAW,WAAW,MAAM;AAC1F,QAAM,EAAE,eAAe,IAAIK,SAAQ;AACnC,QAAM,CAAC,aAAa,cAAc,IAAIT,WAAS,EAAE;AACjD,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAS,EAAE;AACjD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,WAAS,EAAE;AACzD,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAAS,KAAK;AACxD,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAwB,IAAI;AACtD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,KAAK;AAE5C,QAAM,sBAAsB,CAAC,QAA2E;AACtG,QAAI,CAAC;AAAK,aAAO,EAAE,UAAU,QAAQ,OAAO,OAAO;AAEnD,QAAI,QAAQ;AACZ,QAAI,IAAI,UAAU;AAAG;AACrB,QAAI,IAAI,UAAU;AAAG;AACrB,QAAI,QAAQ,KAAK,GAAG,KAAK,QAAQ,KAAK,GAAG;AAAG;AAC5C,QAAI,KAAK,KAAK,GAAG;AAAG;AACpB,QAAI,cAAc,KAAK,GAAG;AAAG;AAE7B,QAAI,SAAS;AAAG,aAAO,EAAE,UAAU,QAAQ,OAAO,OAAO;AACzD,QAAI,SAAS;AAAG,aAAO,EAAE,UAAU,UAAU,OAAO,OAAO;AAC3D,WAAO,EAAE,UAAU,UAAU,OAAO,OAAO;AAAA,EAC7C;AAEA,QAAM,mBAAmB,oBAAoB,WAAW;AAExD,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,eAAW,KAAK;AAEhB,QAAI,gBAAgB,iBAAiB;AACnC,eAAS,4BAA4B;AACrC,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,QAAI,YAAY,SAAS,GAAG;AAC1B,eAAS,4CAA4C;AACrD,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,eAAe,aAAa,WAAW;AAC9D,UAAI,SAAS,SAAS;AACpB,mBAAW,IAAI;AACf,uBAAe,EAAE;AACjB,uBAAe,EAAE;AACjB,2BAAmB,EAAE;AACrB,oBAAY;AAAA,MACd,OAAO;AACL,iBAAS,SAAS,WAAW,2BAA2B;AAAA,MAC1D;AAAA,IACF,SAAS,KAAP;AACA,eAAS,eAAe,QAAQ,IAAI,UAAU,mBAAmB;AAAA,IACnE,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,SACE,gBAAAG,MAAC,SAAI,OAAO;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,GAAG,YAAY,UAAU;AAAA,EAC3B,GACE,0BAAAC,OAAC,UAAK,UAAU,cACd;AAAA,oBAAAD,MAAC,QAAG,OAAO;AAAA,MACT,WAAW;AAAA,MACX,cAAc;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,GAAG,YAAY,UAAU;AAAA,IAC3B,GAAG,6BAEH;AAAA,IAEC,SACC,gBAAAA,MAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,GACG,iBACH;AAAA,IAGD,WACC,gBAAAA,MAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,GAAG,4CAEH;AAAA,IAGF,gBAAAC,OAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,sBAAAD,MAAC,WAAM,SAAQ,eAAc,OAAO;AAAA,QAClC,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,8BAAgB;AAAA,MACnB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAM,gBAAgB,SAAS;AAAA,UAC/B,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,UAC9C,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,GAAG,YAAY,UAAU;AAAA,UAC3B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IAEA,gBAAAC,OAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,sBAAAD,MAAC,WAAM,SAAQ,eAAc,OAAO;AAAA,QAClC,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,0BAAY;AAAA,MACf,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAM,gBAAgB,SAAS;AAAA,UAC/B,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,UAC9C,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,WAAW;AAAA,UACX,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,GAAG,YAAY,UAAU;AAAA,UAC3B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,MACC,eACC,gBAAAC,OAAC,SAAI,OAAO,EAAE,WAAW,MAAM,GAC7B;AAAA,wBAAAD,MAAC,SAAI,OAAO;AAAA,UACV,QAAQ;AAAA,UACR,iBAAiB;AAAA,UACjB,cAAc;AAAA,UACd,UAAU;AAAA,QACZ,GACE,0BAAAA,MAAC,SAAI,OAAO;AAAA,UACV,QAAQ;AAAA,UACR,OAAO,iBAAiB,aAAa,SAAS,QAAQ,iBAAiB,aAAa,WAAW,QAAQ;AAAA,UACvG,iBAAiB,iBAAiB;AAAA,UAClC,YAAY;AAAA,QACd,GAAG,GACL;AAAA,QACA,gBAAAC,OAAC,OAAE,OAAO;AAAA,UACR,UAAU;AAAA,UACV,OAAO,iBAAiB;AAAA,UACxB,WAAW;AAAA,UACX,eAAe;AAAA,QACjB,GACG;AAAA,2BAAiB;AAAA,UAAS;AAAA,WAC7B;AAAA,SACF;AAAA,OAEJ;AAAA,IAEA,gBAAAA,OAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,sBAAAD,MAAC,WAAM,SAAQ,mBAAkB,OAAO;AAAA,QACtC,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,GAAG,kCAAoB;AAAA,MACvB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAM,gBAAgB,SAAS;AAAA,UAC/B,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,mBAAmB,EAAE,OAAO,KAAK;AAAA,UAClD,UAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,GAAG,YAAY,UAAU;AAAA,UAC3B;AAAA,UACA,aAAY;AAAA;AAAA,MACd;AAAA,OACF;AAAA,IAEA,gBAAAA,MAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC,0BAAAC,OAAC,WAAM,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,QAAQ,UAAU,GACvE;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,UAAU,CAAC,MAAM,iBAAiB,EAAE,OAAO,OAAO;AAAA,UAClD,OAAO,EAAE,aAAa,MAAM;AAAA;AAAA,MAC9B;AAAA,MACA,gBAAAA,MAAC,UAAK,OAAO,EAAE,UAAU,QAAQ,OAAO,OAAO,GAAG,4BAAc;AAAA,OAClE,GACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,GAAG,YAAY,UAAU;AAAA,QAC3B;AAAA,QAEC,sBAAY,yBAAyB;AAAA;AAAA,IACxC;AAAA,KACF,GACF;AAEJ;;;ACjRA,SAAgB,YAAAH,kBAAgB;;;ACFhC,SAAgB,YAAAA,kBAAgB;AAChC,SAAS,oBAAoB;AA0FzB,SACE,OAAAG,OADF,QAAAC,cAAA;AA5CG,IAAM,iBAAgD,CAAC;AAAA,EAC5D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc,IAAI,OAAO;AAAA;AAAA,EACzB;AAAA,EACA,aAAa;AACf,MAAM;AACJ,QAAM,EAAE,sBAAsB,IAAIK,SAAQ;AAC1C,QAAM,CAAC,MAAM,OAAO,IAAIT,WAAS,KAAK;AACtC,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAS,KAAK;AAEhD,QAAM,eAAe,OAAO,UAMtB;AACJ,iBAAa,IAAI;AACjB,QAAI;AAEF,YAAM,WAAW,MAAM,MAAM,MAAM,GAAG;AACtC,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAM,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,MAAM,cAAc,EAAE,MAAM,MAAM,YAAY,CAAC;AAE7E,YAAM,SAAS,MAAM,sBAAsB,IAAI;AAE/C,UAAI,OAAO,WAAW,OAAO,MAAM,QAAQ;AACzC,2BAAmB,OAAO,KAAK,MAAM;AACrC,gBAAQ,KAAK;AAAA,MACf,OAAO;AACL,cAAM,IAAI,MAAM,OAAO,WAAW,yBAAyB;AAAA,MAC7D;AAAA,IACF,SAAS,OAAP;AACA,YAAM,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,eAAe;AACtE,gBAAU,GAAG;AAAA,IACf,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,SACE,gBAAAI,OAAC,SAAI,WACH;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM,QAAQ,IAAI;AAAA,QAC3B,UAAU;AAAA,QACV,WAAW,mBAAmB;AAAA,QAE7B,sBAAY,iBAAiB;AAAA;AAAA,IAChC;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,cAAc;AAAA,QACd,eAAe;AAAA,UACb,SAAS,cAAc;AAAA,UACvB,QAAQ,cAAc;AAAA,UACtB,cAAc,cAAc,gBAAgB;AAAA,UAC5C,YAAY,cAAc;AAAA,UAC1B,aAAa,cAAc;AAAA,QAC7B;AAAA,QACA,WAAW,cAAc;AAAA,QACzB,YAAY,cAAc,cAAc;AAAA,QACxC,OAAM;AAAA,QACN,aAAY;AAAA,QACZ,MAAK;AAAA,QACL;AAAA,QACA,UAAU;AAAA,QACV,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,UAAU;AAAA;AAAA,IACZ;AAAA,KACF;AAEJ;;;ADfM,gBAAAA,OAyCI,QAAAC,cAzCJ;AAtFC,IAAM,cAA0C,CAAC;AAAA,EACtD,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB;AACF,MAAM;AACJ,QAAM,EAAE,MAAM,eAAe,mBAAmB,IAAIK,SAAQ;AAC5D,QAAM,SAAS,eAAe;AAC9B,QAAM,CAAC,MAAM,OAAO,IAAIT,WAAS,MAAM,QAAQ,EAAE;AACjD,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAS,MAAM,eAAe,EAAE;AACtE,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAS,EAAE;AAC3C,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAwB,IAAI;AACtD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAwB,IAAI;AAE1D,QAAM,sBAAsB,OAAO,MAAuB;AACxD,MAAE,eAAe;AACjB,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,eAAW,IAAI;AAEf,QAAI;AACF,YAAM,UAAmD,CAAC;AAE1D,UAAI,SAAS,MAAM,MAAM;AACvB,gBAAQ,OAAO;AAAA,MACjB;AAEA,UAAI,gBAAgB,MAAM,aAAa;AACrC,gBAAQ,cAAc;AAAA,MACxB;AAEA,UAAI,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AACrC,iBAAS,oBAAoB;AAC7B,qBAAa,KAAK;AAClB;AAAA,MACF;AAEA,YAAM,WAAW,MAAM,cAAc,OAAO;AAC5C,UAAI,SAAS,SAAS;AACpB,mBAAW,+BAA+B;AAAA,MAC5C,OAAO;AACL,iBAAS,SAAS,WAAW,0BAA0B;AAAA,MACzD;AAAA,IACF,SAAS,KAAP;AACA,eAAS,eAAe,QAAQ,IAAI,UAAU,mBAAmB;AAAA,IACnE,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,6BAA6B,OAAO,cAAsB;AAC9D,eAAW,8BAA8B;AAEzC,WAAO,SAAS,OAAO;AAAA,EACzB;AAEA,QAAM,0BAA0B,CAACY,WAAiB;AAChD,aAASA,OAAM,WAAW,yBAAyB;AAAA,EACrD;AAEA,QAAM,2BAA2B,OAAO,MAAuB;AAC7D,MAAE,eAAe;AACjB,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,eAAW,IAAI;AAEf,QAAI;AACF,YAAM,WAAW,MAAM,mBAAmB,QAAQ;AAClD,UAAI,SAAS,SAAS;AACpB,mBAAW,mDAAmD;AAC9D,oBAAY,EAAE;AAAA,MAChB,OAAO;AACL,iBAAS,SAAS,WAAW,gCAAgC;AAAA,MAC/D;AAAA,IACF,SAAS,KAAP;AACA,eAAS,eAAe,QAAQ,IAAI,UAAU,mBAAmB;AAAA,IACnE,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,MAAI,CAAC;AAAM,WAAO;AAElB,SACE,gBAAAR,OAAC,SAAI,OAAO,EAAE,UAAU,SAAS,QAAQ,UAAU,SAAS,OAAO,GACjE;AAAA,oBAAAD,MAAC,QAAG,OAAO,EAAE,cAAc,QAAQ,UAAU,QAAQ,YAAY,KAAK,OAAO,OAAO,YAAY,GAAG,8BAAgB;AAAA,IAElH,SACC,gBAAAA,MAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB,OAAO;AAAA,MACxB,OAAO,OAAO;AAAA,MACd,QAAQ,aAAa,OAAO;AAAA,MAC5B,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,GACG,iBACH;AAAA,IAGD,WACC,gBAAAA,MAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,MACd,iBAAiB,OAAO;AAAA,MACxB,OAAO,OAAO;AAAA,MACd,QAAQ,aAAa,OAAO;AAAA,MAC5B,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,GACG,mBACH;AAAA,IAIF,gBAAAC,OAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,iBAAiB,OAAO;AAAA,MACxB,cAAc;AAAA,MACd,WAAW;AAAA,MACX,cAAc;AAAA,MACd,QAAQ,aAAa,OAAO;AAAA,IAC9B,GACE;AAAA,sBAAAD,MAAC,QAAG,OAAO,EAAE,cAAc,QAAQ,UAAU,QAAQ,YAAY,KAAK,OAAO,OAAO,YAAY,GAAG,iCAAmB;AAAA,MACtH,gBAAAC,OAAC,UAAK,UAAU,qBACd;AAAA,wBAAAA,OAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,0BAAAD,MAAC,WAAM,SAAQ,QAAO,OAAO;AAAA,YAC3B,SAAS;AAAA,YACT,cAAc;AAAA,YACd,YAAY;AAAA,YACZ,OAAO,OAAO;AAAA,YACd,UAAU;AAAA,UACZ,GAAG,uBAAS;AAAA,UACZ,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,MAAK;AAAA,cACL,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,KAAK;AAAA,cACvC,UAAQ;AAAA,cACR,UAAU;AAAA,cACV,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,QAAQ,aAAa,OAAO;AAAA,gBAC5B,cAAc;AAAA,gBACd,UAAU;AAAA,gBACV,WAAW;AAAA,gBACX,iBAAiB,OAAO;AAAA,gBACxB,OAAO,OAAO;AAAA,gBACd,YAAY;AAAA,cACd;AAAA,cACA,aAAY;AAAA;AAAA,UACd;AAAA,WACF;AAAA,QAEA,gBAAAC,OAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,0BAAAD,MAAC,WAAM,SAAQ,eAAc,OAAO;AAAA,YAClC,SAAS;AAAA,YACT,cAAc;AAAA,YACd,YAAY;AAAA,YACZ,OAAO,OAAO;AAAA,YACd,UAAU;AAAA,UACZ,GAAG,0BAAY;AAAA,UACf,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,OAAO;AAAA,cACP,UAAU;AAAA,cACV,UAAU;AAAA,cACV,aAAY;AAAA;AAAA,UACd;AAAA,WACF;AAAA,QAEC,cAAc,iBACb,gBAAAC,OAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,0BAAAD,MAAC,WAAM,OAAO;AAAA,YACZ,SAAS;AAAA,YACT,cAAc;AAAA,YACd,YAAY;AAAA,YACZ,OAAO,OAAO;AAAA,YACd,UAAU;AAAA,UACZ,GAAG,oBAAM;AAAA,UACR,MAAM,UACL,gBAAAA,MAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK,KAAK;AAAA,cACV,KAAI;AAAA,cACJ,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,cAAc;AAAA,gBACd,WAAW;AAAA,gBACX,QAAQ,aAAa,OAAO;AAAA,cAC9B;AAAA;AAAA,UACF,GACF;AAAA,UAEF,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,kBAAkB;AAAA,cAClB,SAAS;AAAA,cACT,aAAa,IAAI,OAAO;AAAA,cACxB,QAAQ,CAAC,SAAS;AAAA;AAAA,UACpB;AAAA,WACF;AAAA,QAGF,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU;AAAA,YACV,cAAc,CAAC,MAAM;AACnB,kBAAI,CAAC,WAAW;AACd,kBAAE,cAAc,MAAM,kBAAkB,OAAO;AAAA,cACjD;AAAA,YACF;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,gBAAE,cAAc,MAAM,kBAAkB,OAAO;AAAA,YACjD;AAAA,YACA,OAAO;AAAA,cACL,SAAS;AAAA,cACT,iBAAiB,OAAO;AAAA,cACxB,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,QAAQ,YAAY,gBAAgB;AAAA,cACpC,SAAS,YAAY,MAAM;AAAA,cAC3B,YAAY;AAAA,YACd;AAAA,YAEC,sBAAY,cAAc;AAAA;AAAA,QAC7B;AAAA,SACF;AAAA,OACF;AAAA,IAGC,mBACC,gBAAAC,OAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,iBAAiB,OAAO;AAAA,MACxB,cAAc;AAAA,MACd,WAAW;AAAA,MACX,cAAc;AAAA,MACd,QAAQ,aAAa,OAAO;AAAA,IAC9B,GACE;AAAA,sBAAAD,MAAC,QAAG,OAAO,EAAE,cAAc,QAAQ,UAAU,QAAQ,YAAY,KAAK,OAAO,OAAO,YAAY,GAAG,0BAAY;AAAA,MAC/G,gBAAAC,OAAC,OAAE,OAAO,EAAE,UAAU,QAAQ,OAAO,OAAO,eAAe,cAAc,OAAO,GAAG;AAAA;AAAA,QAClE,gBAAAD,MAAC,YAAQ,eAAK,OAAM;AAAA,SACrC;AAAA,MACA,gBAAAC,OAAC,UAAK,UAAU,0BACd;AAAA,wBAAAA,OAAC,SAAI,OAAO,EAAE,cAAc,OAAO,GACjC;AAAA,0BAAAD,MAAC,WAAM,SAAQ,YAAW,OAAO;AAAA,YAC/B,SAAS;AAAA,YACT,cAAc;AAAA,YACd,YAAY;AAAA,YACZ,OAAO,OAAO;AAAA,YACd,UAAU;AAAA,UACZ,GAAG,+BAAiB;AAAA,UACpB,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,MAAK;AAAA,cACL,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,cAC3C,UAAQ;AAAA,cACR,UAAU;AAAA,cACV,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,QAAQ,aAAa,OAAO;AAAA,gBAC5B,cAAc;AAAA,gBACd,UAAU;AAAA,gBACV,WAAW;AAAA,gBACX,iBAAiB,OAAO;AAAA,gBACxB,OAAO,OAAO;AAAA,gBACd,YAAY;AAAA,cACd;AAAA,cACA,aAAY;AAAA;AAAA,UACd;AAAA,WACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU;AAAA,YACV,cAAc,CAAC,MAAM;AACnB,kBAAI,CAAC,WAAW;AACd,kBAAE,cAAc,MAAM,kBAAkB,OAAO;AAAA,cACjD;AAAA,YACF;AAAA,YACA,cAAc,CAAC,MAAM;AACnB,gBAAE,cAAc,MAAM,kBAAkB,OAAO;AAAA,YACjD;AAAA,YACA,OAAO;AAAA,cACL,SAAS;AAAA,cACT,iBAAiB,OAAO;AAAA,cACxB,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,QAAQ,YAAY,gBAAgB;AAAA,cACpC,SAAS,YAAY,MAAM;AAAA,cAC3B,YAAY;AAAA,YACd;AAAA,YAEC,sBAAY,eAAe;AAAA;AAAA,QAC9B;AAAA,SACF;AAAA,OACF;AAAA,KAEJ;AAEJ;;;AE/UA,SAAgB,YAAAH,kBAAgB;AAChC,SAAS,gBAAAa,qBAAoB;AA4FzB,gBAAAV,aAAA;AArCG,IAAM,gBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,cAAc,IAAI,OAAO;AAAA;AAAA,EACzB,OAAO;AAAA,EACP,aAAa;AAAA,EACb;AACF,MAAM;AACJ,QAAM,EAAE,cAAc,IAAIM,SAAQ;AAClC,QAAM,CAAC,UAAU,WAAW,IAAIT,WAAS,KAAK;AAE9C,QAAM,eAAe,OAAO,UAAe;AACzC,gBAAY,IAAI;AAChB,QAAI;AACF,YAAM,WAAW,MAAM,cAAc,EAAE,QAAQ,MAAM,IAAI,CAAC;AAE1D,UAAI,SAAS,WAAW,SAAS,MAAM,QAAQ;AAC7C,0BAAkB,SAAS,KAAK,MAAM;AACtC,qBAAa,KAAK;AAAA,MACpB,OAAO;AACL,cAAM,IAAI,MAAM,SAAS,WAAW,yBAAyB;AAAA,MAC/D;AAAA,IACF,SAAS,OAAP;AACA,YAAM,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,yBAAyB;AAChF,gBAAU,GAAG;AAAA,IACf,UAAE;AACA,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,SACE,gBAAAG;AAAA,IAACU;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,eAAe;AAAA,QACb,SAAS,cAAc;AAAA,QACvB,QAAQ,cAAc;AAAA,QACtB,cAAc,cAAc,gBAAgB;AAAA,QAC5C,YAAY,cAAc;AAAA,QAC1B,aAAa,cAAc;AAAA,MAC7B;AAAA,MACA,YAAY,cAAc,cAAc;AAAA,MACxC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA;AAAA,EACnB;AAEJ","sourcesContent":["'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../use-auth';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\nimport { PhoneInput } from './PhoneInput';\r\n\r\ninterface LoginFormProps {\r\n onSuccess?: (response: { message: string; email?: string; token?: string; success: boolean; user?: any }) => void;\r\n onLoginSuccess?: (email: string, needsOtpVerification: boolean) => void; // For backward compatibility\r\n onRegisterClick?: () => void;\r\n showRegisterLink?: boolean;\r\n config?: {\r\n baseUrl?: string;\r\n };\r\n oauthProviders?: Array<'google' | 'github'>;\r\n showOAuthButtons?: boolean;\r\n}\r\n\r\nexport const LoginForm: React.FC<LoginFormProps> = ({\r\n onSuccess,\r\n onLoginSuccess,\r\n onRegisterClick,\r\n showRegisterLink = true,\r\n config,\r\n oauthProviders = ['google', 'github'],\r\n showOAuthButtons = true\r\n}) => {\r\n const colors = useThemeColors();\r\n const [email, setEmail] = useState('');\r\n const [phoneNumber, setPhoneNumber] = useState('');\r\n const [usePhone, setUsePhone] = useState(false);\r\n const [password, setPassword] = useState('');\r\n const [usePassword, setUsePassword] = useState(false);\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [rememberMe, setRememberMe] = useState(false);\r\n\r\n const { login } = useAuth({\r\n baseUrl: config?.baseUrl || 'http://localhost:7000'\r\n });\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n try {\r\n let response;\r\n const loginData: any = {};\r\n \r\n // Add email or phone number\r\n if (usePhone && phoneNumber) {\r\n loginData.phoneNumber = phoneNumber;\r\n } else if (email) {\r\n loginData.email = email;\r\n }\r\n \r\n if (usePassword) {\r\n // Traditional email/password or phone/password login\r\n loginData.password = password;\r\n response = await login(loginData);\r\n } else {\r\n // OTP-based login\r\n response = await login(loginData);\r\n }\r\n\r\n if (response.success) {\r\n // Call the new callback if provided\r\n onSuccess?.(response);\r\n\r\n // For backward compatibility, call the old callback if provided\r\n if (onLoginSuccess) {\r\n const identifier = usePhone ? phoneNumber : email;\r\n // Check if this is an OTP sent response or a successful login\r\n if (response.message === 'OTP sent to your email.' || response.message === 'OTP sent to your phone number.') {\r\n // OTP was sent, need to verify\r\n onLoginSuccess(identifier, true);\r\n } else if (response.token) {\r\n // Direct login successful (email/password)\r\n onLoginSuccess(identifier, false);\r\n } else {\r\n // Default to needing OTP verification for safety\r\n onLoginSuccess(identifier, true);\r\n }\r\n }\r\n } else {\r\n setError(response.message || 'Login failed');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An unknown error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const toggleAuthMethod = () => {\r\n setUsePassword(!usePassword);\r\n setError(null); // Clear error when switching methods\r\n };\r\n\r\n const togglePasswordVisibility = () => {\r\n setShowPassword(!showPassword);\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '24px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <form onSubmit={handleSubmit} style={{\r\n display: 'flex',\r\n flexDirection: 'column'\r\n }}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '20px',\r\n color: colors.textPrimary,\r\n fontSize: '24px',\r\n fontWeight: 600\r\n }}>{usePassword ? 'Login with Password' : 'Login with OTP'}</h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '16px',\r\n backgroundColor: colors.errorBg,\r\n color: colors.errorText,\r\n border: `1px solid ${colors.errorBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div style={{\r\n marginBottom: '16px'\r\n }}>\r\n <label htmlFor={usePhone ? \"phone\" : \"email\"} style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>{usePhone ? 'Phone Number:' : 'Email:'}</label>\r\n {usePhone ? (\r\n <PhoneInput\r\n id=\"phone\"\r\n value={phoneNumber}\r\n onChange={setPhoneNumber}\r\n required\r\n disabled={isLoading}\r\n placeholder=\"1234567890\"\r\n />\r\n ) : (\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary\r\n }}\r\n placeholder=\"Enter your email\"\r\n />\r\n )}\r\n <button\r\n type=\"button\"\r\n onClick={() => setUsePhone(!usePhone)}\r\n disabled={isLoading}\r\n style={{\r\n marginTop: '8px',\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n fontSize: '13px',\r\n fontWeight: 500,\r\n padding: '0',\r\n transition: 'color 0.2s ease'\r\n }}\r\n >\r\n {usePhone ? 'Use email instead' : 'Use phone number instead'}\r\n </button>\r\n </div>\r\n\r\n {usePassword && (\r\n <div style={{\r\n marginBottom: '16px',\r\n position: 'relative'\r\n }}>\r\n <label htmlFor=\"login-password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Password:</label>\r\n <input\r\n id=\"login-password\"\r\n type={showPassword ? \"text\" : \"password\"}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary\r\n }}\r\n placeholder=\"Enter your password\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={togglePasswordVisibility}\r\n disabled={isLoading}\r\n style={{\r\n position: 'absolute',\r\n right: '12px',\r\n top: '38px',\r\n background: 'none',\r\n border: 'none',\r\n cursor: 'pointer',\r\n color: colors.textTertiary,\r\n fontSize: '14px'\r\n }}\r\n >\r\n {showPassword ? 'Hide' : 'Show'}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {usePassword && (\r\n <div style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n marginBottom: '12px',\r\n marginTop: '4px'\r\n }}>\r\n <input\r\n type=\"checkbox\"\r\n id=\"remember-me\"\r\n checked={rememberMe}\r\n onChange={(e) => setRememberMe(e.target.checked)}\r\n disabled={isLoading}\r\n style={{\r\n marginRight: '8px',\r\n cursor: 'pointer',\r\n width: '16px',\r\n height: '16px'\r\n }}\r\n />\r\n <label\r\n htmlFor=\"remember-me\"\r\n style={{\r\n fontSize: '14px',\r\n color: colors.textSecondary,\r\n cursor: 'pointer',\r\n userSelect: 'none'\r\n }}\r\n >\r\n Remember me\r\n </label>\r\n </div>\r\n )}\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n padding: '14px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n marginTop: '4px'\r\n }}\r\n >\r\n {isLoading ? (usePassword ? 'Logging in...' : 'Sending OTP...') : (usePassword ? 'Login' : 'Send OTP')}\r\n </button>\r\n\r\n <div style={{\r\n textAlign: 'center',\r\n marginTop: '16px',\r\n paddingTop: '16px',\r\n borderTop: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <button\r\n type=\"button\"\r\n onClick={toggleAuthMethod}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n transition: 'color 0.2s ease'\r\n }}\r\n >\r\n {usePassword ? 'Login with OTP instead' : 'Login with password instead'}\r\n </button>\r\n </div>\r\n\r\n {showOAuthButtons && oauthProviders.length > 0 && (\r\n <div style={{\r\n marginTop: '16px',\r\n paddingTop: '16px',\r\n borderTop: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <div style={{\r\n position: 'relative',\r\n marginBottom: '16px'\r\n }}>\r\n <div style={{\r\n position: 'absolute',\r\n top: '50%',\r\n left: 0,\r\n right: 0,\r\n height: '1px',\r\n backgroundColor: colors.borderPrimary\r\n }} />\r\n <div style={{\r\n position: 'relative',\r\n textAlign: 'center'\r\n }}>\r\n <span style={{\r\n backgroundColor: colors.bgPrimary,\r\n padding: '0 12px',\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Or continue with</span>\r\n </div>\r\n </div>\r\n\r\n <div style={{\r\n display: 'grid',\r\n gridTemplateColumns: oauthProviders.length === 1 ? '1fr' : 'repeat(2, 1fr)',\r\n gap: '12px'\r\n }}>\r\n {oauthProviders.includes('google') && (\r\n <a\r\n href={`${config?.baseUrl || 'http://localhost:7000'}/api/v1/auth/oauth/google`}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '8px',\r\n padding: '10px 16px',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n color: colors.textPrimary,\r\n textDecoration: 'none',\r\n fontSize: '14px',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.bgHover;\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.bgPrimary;\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n }}\r\n >\r\n <svg style={{ width: '18px', height: '18px' }} viewBox=\"0 0 24 24\">\r\n <path\r\n fill=\"#4285F4\"\r\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\r\n />\r\n <path\r\n fill=\"#34A853\"\r\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\r\n />\r\n <path\r\n fill=\"#FBBC05\"\r\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\r\n />\r\n <path\r\n fill=\"#EA4335\"\r\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\r\n />\r\n </svg>\r\n Google\r\n </a>\r\n )}\r\n\r\n {oauthProviders.includes('github') && (\r\n <a\r\n href={`${config?.baseUrl || 'http://localhost:7000'}/api/v1/auth/oauth/github`}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '8px',\r\n padding: '10px 16px',\r\n backgroundColor: '#24292e',\r\n border: '1px solid #24292e',\r\n borderRadius: '8px',\r\n color: '#ffffff',\r\n textDecoration: 'none',\r\n fontSize: '14px',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = '#1b1f23';\r\n e.currentTarget.style.borderColor = '#1b1f23';\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = '#24292e';\r\n e.currentTarget.style.borderColor = '#24292e';\r\n }}\r\n >\r\n <svg style={{ width: '18px', height: '18px' }} fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\r\n </svg>\r\n GitHub\r\n </a>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {showRegisterLink && (\r\n <div style={{\r\n textAlign: 'center',\r\n marginTop: '16px',\r\n paddingTop: '16px',\r\n borderTop: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <p style={{\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>\r\n Don't have an account?{' '}\r\n <button\r\n type=\"button\"\r\n onClick={onRegisterClick}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n transition: 'color 0.2s ease'\r\n }}\r\n >\r\n Register\r\n </button>\r\n </p>\r\n </div>\r\n )}\r\n </form>\r\n </div>\r\n );\r\n};","import { useState, useEffect, useCallback } from 'react';\r\nimport { AuthService } from '../core/auth-service';\r\nimport { \r\n AuthResponse, \r\n LoginData, \r\n VerifyData, \r\n UpdateUserData, \r\n User,\r\n AuthConfig,\r\n RegisterData\r\n} from '../types';\r\n\r\ninterface UseAuthReturnBase {\r\n user: User | null;\r\n isAuthenticated: boolean;\r\n loading: boolean;\r\n register: (data: RegisterData) => Promise<AuthResponse>;\r\n login: (data: LoginData) => Promise<AuthResponse>;\r\n verify: (data: VerifyData) => Promise<AuthResponse>;\r\n verifyEmailToken: (token: string) => Promise<AuthResponse>;\r\n logout: () => Promise<void>;\r\n updateProfile: (data: UpdateUserData) => Promise<AuthResponse>;\r\n getProfile: () => Promise<User>;\r\n getAllUsers: () => Promise<User[]>;\r\n getUserById: (id: string) => Promise<User>;\r\n uploadAndUpdateAvatar: (file: File) => Promise<AuthResponse>;\r\n}\r\n\r\nexport const useAuth = (config: AuthConfig): UseAuthReturnBase => {\r\n const [authService] = useState<AuthService>(() => new AuthService(config));\r\n const [user, setUser] = useState<User | null>(null);\r\n const [isAuthenticated, setIsAuthenticated] = useState<boolean>(false);\r\n const [loading, setLoading] = useState<boolean>(true);\r\n\r\n const checkAuthStatus = useCallback(() => {\r\n const authenticated = authService.isAuthenticated();\r\n setIsAuthenticated(authenticated);\r\n \r\n if (authenticated) {\r\n const currentUser = authService.getCurrentUser();\r\n setUser(currentUser);\r\n } else {\r\n setUser(null);\r\n }\r\n \r\n setLoading(false);\r\n }, [authService]);\r\n\r\n useEffect(() => {\r\n checkAuthStatus();\r\n }, [checkAuthStatus]);\r\n\r\n const register = useCallback(async (data: RegisterData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await authService.register(data);\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const login = useCallback(async (data: LoginData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.login(data);\r\n // Update user state if login was successful and we have a user\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n setIsAuthenticated(true);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verify = useCallback(async (data: VerifyData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verify(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n setIsAuthenticated(true);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verifyEmailToken = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verifyEmailToken(token);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n setIsAuthenticated(true);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const logout = useCallback(async (): Promise<void> => {\r\n setLoading(true);\r\n try {\r\n await authService.logout();\r\n setUser(null);\r\n setIsAuthenticated(false);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const updateProfile = useCallback(async (data: UpdateUserData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.updateProfile(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getProfile = useCallback(async (): Promise<User> => {\r\n setLoading(true);\r\n try {\r\n const userData = await authService.getProfile();\r\n setUser(userData);\r\n return userData;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getAllUsers = useCallback(async (): Promise<User[]> => {\r\n setLoading(true);\r\n try {\r\n return await authService.getAllUsers();\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getUserById = useCallback(async (id: string): Promise<User> => {\r\n setLoading(true);\r\n try {\r\n return await authService.getUserById(id);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const uploadAndUpdateAvatar = useCallback(async (file: File): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.uploadAndUpdateAvatar(file);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n return {\r\n user,\r\n isAuthenticated,\r\n loading,\r\n register,\r\n login,\r\n verify,\r\n verifyEmailToken,\r\n logout,\r\n updateProfile,\r\n getProfile,\r\n getAllUsers,\r\n getUserById,\r\n uploadAndUpdateAvatar\r\n };\r\n};","import axios, { AxiosInstance, AxiosRequestConfig, AxiosError } from 'axios';\r\n\r\nexport class HttpClient {\r\n private axiosInstance: AxiosInstance;\r\n private csrfToken: string | null = null;\r\n private frontendBaseUrl: string | null = null;\r\n private baseUrl: string;\r\n\r\n constructor(baseUrl: string, defaultHeaders: Record<string, string> = {}) {\r\n this.baseUrl = baseUrl.replace(/\\/$/, '');\r\n\r\n this.axiosInstance = axios.create({\r\n baseURL: this.baseUrl,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...defaultHeaders\r\n },\r\n withCredentials: true, // Include cookies for CSRF\r\n timeout: 30000 // 30 second timeout\r\n });\r\n\r\n // Request interceptor to add CSRF token and frontend URL\r\n this.axiosInstance.interceptors.request.use(\r\n async (config) => {\r\n // Fetch CSRF token lazily on first mutating request (only on client side)\r\n const isMutatingRequest = ['post', 'put', 'delete', 'patch'].includes(config.method?.toLowerCase() || '');\r\n if (isMutatingRequest && !this.csrfToken && typeof window !== 'undefined') {\r\n try {\r\n await this.refreshCsrfToken();\r\n } catch (error) {\r\n console.warn('Failed to fetch CSRF token:', error);\r\n }\r\n }\r\n\r\n // Add CSRF token to mutating requests\r\n if (this.csrfToken && isMutatingRequest) {\r\n config.headers['x-csrf-token'] = this.csrfToken;\r\n }\r\n\r\n // Add frontend base URL header if available\r\n if (this.frontendBaseUrl) {\r\n config.headers['X-Frontend-URL'] = this.frontendBaseUrl;\r\n }\r\n\r\n return config;\r\n },\r\n (error) => Promise.reject(error)\r\n );\r\n\r\n // Response interceptor for error handling and CSRF token refresh\r\n this.axiosInstance.interceptors.response.use(\r\n (response) => response,\r\n async (error: AxiosError) => {\r\n const originalRequest = error.config as AxiosRequestConfig & { _retry?: boolean };\r\n\r\n // Handle CSRF token refresh on 403\r\n if (error.response?.status === 403 && !originalRequest._retry) {\r\n originalRequest._retry = true;\r\n\r\n try {\r\n await this.refreshCsrfToken();\r\n if (originalRequest.headers) {\r\n originalRequest.headers['x-csrf-token'] = this.csrfToken!;\r\n }\r\n return this.axiosInstance(originalRequest);\r\n } catch (refreshError) {\r\n return Promise.reject(refreshError);\r\n }\r\n }\r\n\r\n return Promise.reject(error);\r\n }\r\n );\r\n }\r\n\r\n public async get<T>(endpoint: string, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.get<T>(endpoint, { headers });\r\n return response.data;\r\n }\r\n\r\n public async post<T>(endpoint: string, data?: any, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.post<T>(endpoint, data, { headers });\r\n return response.data;\r\n }\r\n\r\n public async put<T>(endpoint: string, data?: any, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.put<T>(endpoint, data, { headers });\r\n return response.data;\r\n }\r\n\r\n public async delete<T>(endpoint: string, headers?: Record<string, string>): Promise<T> {\r\n const response = await this.axiosInstance.delete<T>(endpoint, { headers });\r\n return response.data;\r\n }\r\n\r\n public setAuthToken(token: string): void {\r\n this.axiosInstance.defaults.headers.common['Authorization'] = `Bearer ${token}`;\r\n }\r\n\r\n public removeAuthToken(): void {\r\n delete this.axiosInstance.defaults.headers.common['Authorization'];\r\n }\r\n\r\n public setCsrfToken(token: string): void {\r\n this.csrfToken = token;\r\n }\r\n\r\n public getCsrfToken(): string | null {\r\n return this.csrfToken;\r\n }\r\n\r\n public removeCsrfToken(): void {\r\n this.csrfToken = null;\r\n }\r\n\r\n public setFrontendBaseUrl(url: string): void {\r\n this.frontendBaseUrl = url;\r\n }\r\n\r\n public getFrontendBaseUrl(): string | null {\r\n return this.frontendBaseUrl;\r\n }\r\n\r\n public removeFrontendBaseUrl(): void {\r\n this.frontendBaseUrl = null;\r\n }\r\n\r\n private async refreshCsrfToken(): Promise<void> {\r\n try {\r\n const response = await this.axiosInstance.get<{ csrfToken: string }>('/api/v1/auth/csrf-token');\r\n this.csrfToken = response.data.csrfToken;\r\n } catch (error) {\r\n console.error('Failed to refresh CSRF token:', error);\r\n throw error;\r\n }\r\n }\r\n}","import { HttpClient } from './http-client';\r\nimport {\r\n AuthResponse,\r\n LoginData,\r\n VerifyData,\r\n UpdateUserData,\r\n User,\r\n AuthConfig,\r\n RegisterData,\r\n OAuthProvider,\r\n CsrfTokenResponse\r\n} from '../types';\r\nimport { UpfilesClient } from '@thetechfossil/upfiles';\r\n\r\nexport class AuthService {\r\n private httpClient: HttpClient;\r\n private config: AuthConfig;\r\n private token: string | null = null;\r\n private upfilesClient: UpfilesClient | null = null;\r\n\r\n constructor(config: AuthConfig) {\r\n this.config = {\r\n localStorageKey: 'auth_token',\r\n csrfEnabled: true,\r\n ...config\r\n };\r\n\r\n this.httpClient = new HttpClient(this.config.baseUrl);\r\n this.loadTokenFromStorage();\r\n\r\n // Initialize upfiles client if config is provided\r\n if (this.config.upfilesConfig) {\r\n this.upfilesClient = new UpfilesClient({\r\n baseUrl: this.config.upfilesConfig.baseUrl,\r\n apiKey: this.config.upfilesConfig.apiKey,\r\n apiKeyHeader: this.config.upfilesConfig.apiKeyHeader,\r\n presignUrl: this.config.upfilesConfig.presignUrl,\r\n presignPath: this.config.upfilesConfig.presignPath,\r\n });\r\n }\r\n\r\n // Set frontend base URL if available\r\n if (typeof window !== 'undefined') {\r\n const frontendBaseUrl = \r\n process.env.NEXT_PUBLIC_FRONTEND_BASE_URL ||\r\n process.env.REACT_APP_FRONTEND_BASE_URL ||\r\n process.env.NEXT_PUBLIC_APP_URL ||\r\n window.location.origin;\r\n \r\n if (frontendBaseUrl) {\r\n this.httpClient.setFrontendBaseUrl(frontendBaseUrl);\r\n }\r\n }\r\n\r\n // CSRF token will be fetched lazily on first mutating request\r\n // This prevents SSR issues and ensures proper initialization\r\n }\r\n\r\n private loadTokenFromStorage(): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n const token = localStorage.getItem(this.config.localStorageKey);\r\n if (token) {\r\n this.token = token;\r\n this.httpClient.setAuthToken(token);\r\n }\r\n } catch (error) {\r\n console.warn('Failed to load token from storage:', error);\r\n }\r\n }\r\n }\r\n\r\n private saveTokenToStorage(token: string): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n localStorage.setItem(this.config.localStorageKey, token);\r\n } catch (error) {\r\n console.warn('Failed to save token to storage:', error);\r\n }\r\n }\r\n }\r\n\r\n private removeTokenFromStorage(): void {\r\n if (typeof window !== 'undefined' && this.config.localStorageKey) {\r\n try {\r\n localStorage.removeItem(this.config.localStorageKey);\r\n } catch (error) {\r\n console.warn('Failed to remove token from storage:', error);\r\n }\r\n }\r\n }\r\n\r\n public isAuthenticated(): boolean {\r\n return !!this.token;\r\n }\r\n\r\n public getToken(): string | null {\r\n return this.token;\r\n }\r\n\r\n public getCurrentUser(): User | null {\r\n if (!this.token) return null;\r\n\r\n try {\r\n const payload = JSON.parse(atob(this.token.split('.')[1]));\r\n return payload.user || null;\r\n } catch (error) {\r\n console.error('Failed to parse user from token:', error);\r\n return null;\r\n }\r\n }\r\n\r\n // CSRF Token Management\r\n public async refreshCsrfToken(): Promise<void> {\r\n if (!this.config.csrfEnabled) return;\r\n\r\n try {\r\n const response = await this.httpClient.get<CsrfTokenResponse>('/api/v1/auth/csrf-token');\r\n if (response.csrfToken) {\r\n this.httpClient.setCsrfToken(response.csrfToken);\r\n }\r\n } catch (error) {\r\n console.error('Failed to get CSRF token:', error);\r\n }\r\n }\r\n\r\n public getCsrfToken(): string | null {\r\n return this.httpClient.getCsrfToken();\r\n }\r\n\r\n // OAuth Methods\r\n public loginWithOAuth(provider: OAuthProvider): void {\r\n if (typeof window === 'undefined') {\r\n throw new Error('OAuth login is only available in browser environments');\r\n }\r\n\r\n const oauthUrl = `${this.config.baseUrl}/api/v1/auth/oauth/${provider}`;\r\n window.location.href = oauthUrl;\r\n }\r\n\r\n public linkOAuthProvider(provider: OAuthProvider): void {\r\n if (typeof window === 'undefined') {\r\n throw new Error('OAuth linking is only available in browser environments');\r\n }\r\n\r\n if (!this.token) {\r\n throw new Error('Must be authenticated to link OAuth provider');\r\n }\r\n\r\n const linkUrl = `${this.config.baseUrl}/api/v1/auth/oauth/${provider}/link`;\r\n window.location.href = linkUrl;\r\n }\r\n\r\n public async unlinkOAuthProvider(provider: OAuthProvider): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>(\r\n `/api/v1/auth/oauth/${provider}/unlink`\r\n );\r\n return response;\r\n }\r\n\r\n // Standard Auth Methods\r\n public async login(data: LoginData): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/login', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n return response;\r\n }\r\n\r\n if (response.success && (response.message === 'OTP sent to your email.' || response.message === 'OTP sent to your phone number.')) {\r\n return response;\r\n }\r\n\r\n if (response.success && response.message === 'OTP verified successfully.' && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n return response;\r\n }\r\n\r\n throw new Error(response.message || 'Login failed');\r\n }\r\n\r\n public async register(data: RegisterData): Promise<AuthResponse> {\r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/register', data);\r\n\r\n if (response.success && response.message === 'Registration data saved. Verification email sent. Please check your inbox.') {\r\n return response;\r\n }\r\n\r\n throw new Error(response.message || 'Registration failed');\r\n }\r\n\r\n public async verify(data: VerifyData): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/verify', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async verifyEmailToken(token: string): Promise<AuthResponse> {\r\n try {\r\n const response = await this.httpClient.get<AuthResponse>(`/api/v1/auth/verify-email?token=${token}`);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n } catch (error: any) {\r\n // Handle axios error response\r\n if (error.response?.data) {\r\n return {\r\n success: false,\r\n message: error.response.data.message || 'Email verification failed',\r\n };\r\n }\r\n \r\n // Handle network or other errors\r\n return {\r\n success: false,\r\n message: error.message || 'Network error occurred',\r\n };\r\n }\r\n }\r\n\r\n public async logout(): Promise<void> {\r\n // Call backend to clear cookie\r\n try {\r\n await this.httpClient.post('/api/v1/auth/logout', {});\r\n } catch (error) {\r\n console.warn('Failed to call logout endpoint:', error);\r\n }\r\n\r\n this.token = null;\r\n this.httpClient.removeAuthToken();\r\n this.httpClient.removeCsrfToken();\r\n this.removeTokenFromStorage();\r\n }\r\n\r\n public async getProfile(): Promise<User> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ user: User }>('/api/v1/user/me');\r\n return response.user;\r\n }\r\n\r\n public async updateProfile(data: UpdateUserData): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/update/profile', data);\r\n\r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async getAllUsers(): Promise<User[]> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ users: User[] }>('/api/v1/user/all');\r\n return response.users;\r\n }\r\n\r\n public async getUserById(id: string): Promise<User> {\r\n const response = await this.httpClient.get<{ user: User }>(`/api/v1/user/${id}`);\r\n return response.user;\r\n }\r\n\r\n public async forgotPassword(email: string): Promise<AuthResponse> {\r\n // Frontend base URL is now automatically sent via X-Frontend-URL header\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/forgot-password', { email });\r\n return response;\r\n }\r\n\r\n public async resetPassword(token: string, password: string): Promise<AuthResponse> {\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/auth/reset-password', { token, password });\r\n return response;\r\n }\r\n\r\n public async changePassword(oldPassword: string, newPassword: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/change-password', { \r\n oldPassword, \r\n newPassword \r\n });\r\n return response;\r\n }\r\n\r\n public async updateAvatar(avatar: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/update/profile', { avatar });\r\n \r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async uploadAndUpdateAvatar(file: File): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n if (!this.upfilesClient) {\r\n throw new Error('Upfiles configuration is required. Please provide upfilesConfig in AuthConfig.');\r\n }\r\n\r\n try {\r\n // Upload file using upfiles SDK\r\n const folderPath = this.config.upfilesConfig?.folderPath || 'avatars/';\r\n const uploadResult = await this.upfilesClient.upload(file, {\r\n folderPath,\r\n fetchThumbnails: true,\r\n });\r\n\r\n // Update user avatar with the uploaded file URL\r\n const response = await this.updateAvatar(uploadResult.publicUrl);\r\n \r\n return response;\r\n } catch (error: any) {\r\n throw new Error(`Failed to upload avatar: ${error.message || 'Unknown error'}`);\r\n }\r\n }\r\n\r\n public getUpfilesClient(): UpfilesClient | null {\r\n return this.upfilesClient;\r\n }\r\n\r\n public async requestEmailChange(newEmail: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/user/request-email-change', { \r\n newEmail \r\n });\r\n return response;\r\n }\r\n\r\n public async verifyEmailChange(token: string): Promise<AuthResponse> {\r\n const response = await this.httpClient.get<AuthResponse>(`/api/v1/user/verify-email-change?token=${token}`);\r\n \r\n if (response.success && response.token) {\r\n this.token = response.token;\r\n this.httpClient.setAuthToken(response.token);\r\n this.saveTokenToStorage(response.token);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n // 2FA / MFA Methods\r\n public async generate2FA(): Promise<{ success: boolean; qrCode?: string; secret?: string; message: string }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<{ success: boolean; qrCode?: string; secret?: string; message: string }>(\r\n '/api/v1/mfa/generate', \r\n {}\r\n );\r\n return response;\r\n }\r\n\r\n public async enable2FA(token: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/mfa/enable', { token });\r\n return response;\r\n }\r\n\r\n public async disable2FA(token: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/mfa/disable', { token });\r\n return response;\r\n }\r\n\r\n public async validate2FA(token: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>('/api/v1/mfa/validate', { token });\r\n return response;\r\n }\r\n\r\n // Session Management Methods\r\n public async getSessions(): Promise<{ success: boolean; sessions: any[] }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ success: boolean; sessions: any[] }>('/api/v1/sessions');\r\n return response;\r\n }\r\n\r\n public async revokeSession(sessionId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>(`/api/v1/sessions/${sessionId}`);\r\n return response;\r\n }\r\n\r\n public async revokeAllSessions(): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.delete<AuthResponse>('/api/v1/sessions/revoke/all');\r\n \r\n // After revoking all sessions, current session is also revoked\r\n this.token = null;\r\n this.httpClient.removeAuthToken();\r\n this.removeTokenFromStorage();\r\n \r\n return response;\r\n }\r\n\r\n // Admin Methods\r\n public async getAuditLogs(filters?: any): Promise<{ success: boolean; logs: any[] }> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.get<{ success: boolean; logs: any[] }>(\r\n '/api/v1/admin/audit-logs',\r\n filters\r\n );\r\n return response;\r\n }\r\n\r\n public async adminVerifyUser(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/verify-user/${userId}`, {});\r\n return response;\r\n }\r\n\r\n public async adminForcePasswordReset(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/force-password-reset/${userId}`, {});\r\n return response;\r\n }\r\n\r\n public async adminSuspendUser(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/suspend-user/${userId}`, {});\r\n return response;\r\n }\r\n\r\n public async adminActivateUser(userId: string): Promise<AuthResponse> {\r\n if (!this.token) {\r\n throw new Error('Not authenticated');\r\n }\r\n\r\n const response = await this.httpClient.post<AuthResponse>(`/api/v1/admin/activate-user/${userId}`, {});\r\n return response;\r\n }\r\n}","'use client';\r\n\r\nimport React, { createContext, useContext, useEffect, useState, ReactNode } from 'react';\r\n\r\ntype Theme = 'light' | 'dark';\r\n\r\ninterface ThemeContextType {\r\n theme: Theme;\r\n mounted: boolean;\r\n}\r\n\r\nconst ThemeContext = createContext<ThemeContextType>({ theme: 'light', mounted: false });\r\n\r\nexport function AuthThemeProvider({ children }: { children: ReactNode }) {\r\n const [theme, setTheme] = useState<Theme>('light');\r\n const [mounted, setMounted] = useState(false);\r\n\r\n useEffect(() => {\r\n // Detect theme from parent app\r\n const detectTheme = () => {\r\n // Check if parent has theme class on html/body\r\n const htmlElement = document.documentElement;\r\n const bodyElement = document.body;\r\n \r\n if (htmlElement.classList.contains('dark') || bodyElement.classList.contains('dark')) {\r\n return 'dark';\r\n }\r\n \r\n if (htmlElement.classList.contains('light') || bodyElement.classList.contains('light')) {\r\n return 'light';\r\n }\r\n \r\n // Check data-theme attribute\r\n const dataTheme = htmlElement.getAttribute('data-theme') || bodyElement.getAttribute('data-theme');\r\n if (dataTheme === 'dark' || dataTheme === 'light') {\r\n return dataTheme as Theme;\r\n }\r\n \r\n // Check prefers-color-scheme\r\n if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\r\n return 'dark';\r\n }\r\n \r\n return 'light';\r\n };\r\n\r\n const updateTheme = () => {\r\n const detectedTheme = detectTheme();\r\n setTheme(detectedTheme);\r\n };\r\n\r\n // Initial detection\r\n updateTheme();\r\n setMounted(true);\r\n\r\n // Watch for theme changes using MutationObserver\r\n const observer = new MutationObserver(updateTheme);\r\n observer.observe(document.documentElement, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme']\r\n });\r\n observer.observe(document.body, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme']\r\n });\r\n\r\n // Watch for prefers-color-scheme changes\r\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\r\n const handleMediaChange = () => updateTheme();\r\n mediaQuery.addEventListener('change', handleMediaChange);\r\n\r\n return () => {\r\n observer.disconnect();\r\n mediaQuery.removeEventListener('change', handleMediaChange);\r\n };\r\n }, []);\r\n\r\n return (\r\n <ThemeContext.Provider value={{ theme, mounted }}>\r\n {children}\r\n </ThemeContext.Provider>\r\n );\r\n}\r\n\r\nexport function useAuthTheme() {\r\n return useContext(ThemeContext);\r\n}\r\n","'use client';\r\n\r\nimport { useAuthTheme } from '../ThemeContext';\r\n\r\ninterface ThemeColors {\r\n bgPrimary: string;\r\n bgSecondary: string;\r\n bgHover: string;\r\n textPrimary: string;\r\n textSecondary: string;\r\n textTertiary: string;\r\n borderPrimary: string;\r\n borderSecondary: string;\r\n buttonPrimary: string;\r\n buttonPrimaryHover: string;\r\n errorBg: string;\r\n errorText: string;\r\n errorBorder: string;\r\n successBg: string;\r\n successText: string;\r\n successBorder: string;\r\n}\r\n\r\nconst lightTheme: ThemeColors = {\r\n bgPrimary: 'var(--auth-bg-primary, #ffffff)',\r\n bgSecondary: 'var(--auth-bg-secondary, #f8fafc)',\r\n bgHover: 'var(--auth-bg-hover, #f1f5f9)',\r\n textPrimary: 'var(--auth-text-primary, #0f172a)',\r\n textSecondary: 'var(--auth-text-secondary, #475569)',\r\n textTertiary: 'var(--auth-text-tertiary, #94a3b8)',\r\n borderPrimary: 'var(--auth-border-primary, #e2e8f0)',\r\n borderSecondary: 'var(--auth-border-secondary, #cbd5e1)',\r\n buttonPrimary: 'var(--auth-button-primary, #3b82f6)',\r\n buttonPrimaryHover: 'var(--auth-button-primary-hover, #2563eb)',\r\n errorBg: 'var(--auth-error-bg, #fef2f2)',\r\n errorText: 'var(--auth-error-text, #dc2626)',\r\n errorBorder: 'var(--auth-error-border, #fecaca)',\r\n successBg: 'var(--auth-success-bg, #f0fdf4)',\r\n successText: 'var(--auth-success-text, #16a34a)',\r\n successBorder: 'var(--auth-success-border, #bbf7d0)',\r\n};\r\n\r\nconst darkTheme: ThemeColors = {\r\n bgPrimary: 'var(--auth-bg-primary, #1f2937)',\r\n bgSecondary: 'var(--auth-bg-secondary, #111827)',\r\n bgHover: 'var(--auth-bg-hover, #374151)',\r\n textPrimary: 'var(--auth-text-primary, #f9fafb)',\r\n textSecondary: 'var(--auth-text-secondary, #e5e7eb)',\r\n textTertiary: 'var(--auth-text-tertiary, #d1d5db)',\r\n borderPrimary: 'var(--auth-border-primary, #374151)',\r\n borderSecondary: 'var(--auth-border-secondary, #4b5563)',\r\n buttonPrimary: 'var(--auth-button-primary, #3b82f6)',\r\n buttonPrimaryHover: 'var(--auth-button-primary-hover, #2563eb)',\r\n errorBg: 'var(--auth-error-bg, #7f1d1d)',\r\n errorText: 'var(--auth-error-text, #fecaca)',\r\n errorBorder: 'var(--auth-error-border, #991b1b)',\r\n successBg: 'var(--auth-success-bg, #14532d)',\r\n successText: 'var(--auth-success-text, #bbf7d0)',\r\n successBorder: 'var(--auth-success-border, #166534)',\r\n};\r\n\r\nexport function useThemeColors(): ThemeColors {\r\n const { theme } = useAuthTheme();\r\n return theme === 'dark' ? darkTheme : lightTheme;\r\n}\r\n","'use client';\r\n\r\nimport React, { useState, useEffect, useMemo } from 'react';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\n\r\n// Lazy load react-phone-number-input to avoid React 19 compatibility issues\r\nlet PhoneInputWithCountry: any = null;\r\ntry {\r\n const module = require('react-phone-number-input');\r\n PhoneInputWithCountry = module.default || module;\r\n require('react-phone-number-input/style.css');\r\n} catch (error) {\r\n console.warn('react-phone-number-input not available, using fallback');\r\n}\r\n\r\ninterface PhoneInputProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n disabled?: boolean;\r\n required?: boolean;\r\n placeholder?: string;\r\n id?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\n// Create the input component outside to prevent recreation on every render\r\nconst CustomPhoneInput = React.forwardRef<HTMLInputElement, any>((props, ref) => (\r\n <input\r\n {...props}\r\n ref={ref}\r\n className=\"PhoneInputInput\"\r\n />\r\n));\r\nCustomPhoneInput.displayName = 'CustomPhoneInput';\r\n\r\nexport const PhoneInput: React.FC<PhoneInputProps> = ({\r\n value,\r\n onChange,\r\n disabled = false,\r\n required = false,\r\n placeholder = 'Enter phone number',\r\n id = 'phone',\r\n style = {}\r\n}) => {\r\n const colors = useThemeColors();\r\n const [defaultCountry, setDefaultCountry] = useState<string>('US');\r\n \r\n // Memoize the styles to prevent recreation on every render\r\n const styleContent = useMemo(() => `\r\n .PhoneInput {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n }\r\n \r\n .PhoneInputCountry {\r\n position: relative;\r\n align-self: stretch;\r\n display: flex;\r\n align-items: center;\r\n padding: 0 8px;\r\n border: 1px solid ${colors.borderSecondary};\r\n border-radius: 8px;\r\n background-color: ${colors.bgSecondary};\r\n transition: all 0.2s ease;\r\n }\r\n \r\n .PhoneInputCountry:focus-within {\r\n border-color: ${colors.buttonPrimary};\r\n outline: 2px solid ${colors.buttonPrimary}40;\r\n }\r\n \r\n .PhoneInputCountryIcon {\r\n width: 24px;\r\n height: 24px;\r\n margin-right: 4px;\r\n }\r\n \r\n .PhoneInputCountryIcon--border {\r\n box-shadow: none;\r\n }\r\n \r\n .PhoneInputCountrySelect {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n height: 100%;\r\n width: 100%;\r\n z-index: 1;\r\n border: 0;\r\n opacity: 0;\r\n cursor: pointer;\r\n color: ${colors.textPrimary};\r\n background-color: ${colors.bgSecondary};\r\n }\r\n \r\n .PhoneInputCountrySelect:disabled {\r\n cursor: not-allowed;\r\n }\r\n \r\n /* Dropdown menu styling */\r\n .PhoneInputCountrySelect option {\r\n background-color: ${colors.bgPrimary};\r\n color: ${colors.textPrimary};\r\n padding: 8px 12px;\r\n font-size: 14px;\r\n }\r\n \r\n .PhoneInputCountrySelect option:hover,\r\n .PhoneInputCountrySelect option:focus,\r\n .PhoneInputCountrySelect option:checked {\r\n background-color: ${colors.buttonPrimary};\r\n color: white;\r\n }\r\n \r\n .PhoneInputCountrySelectArrow {\r\n display: block;\r\n content: '';\r\n width: 0.3em;\r\n height: 0.3em;\r\n margin-left: 0.35em;\r\n border-style: solid;\r\n border-color: ${colors.textPrimary};\r\n border-top-width: 0;\r\n border-bottom-width: 1px;\r\n border-left-width: 0;\r\n border-right-width: 1px;\r\n transform: rotate(45deg);\r\n opacity: 0.7;\r\n }\r\n \r\n .PhoneInputInput {\r\n flex: 1;\r\n min-width: 0;\r\n padding: 12px 16px;\r\n border: 1px solid ${colors.borderSecondary};\r\n border-radius: 8px;\r\n font-size: 16px;\r\n background-color: ${colors.bgSecondary};\r\n color: ${colors.textPrimary};\r\n transition: all 0.2s ease;\r\n -webkit-text-fill-color: ${colors.textPrimary};\r\n -webkit-box-shadow: 0 0 0 1000px ${colors.bgSecondary} inset;\r\n }\r\n \r\n .PhoneInputInput:focus {\r\n border-color: ${colors.buttonPrimary};\r\n outline: 2px solid ${colors.buttonPrimary}40;\r\n }\r\n \r\n .PhoneInputInput:disabled {\r\n cursor: not-allowed;\r\n opacity: 0.6;\r\n }\r\n \r\n .PhoneInputInput::placeholder {\r\n color: ${colors.textTertiary};\r\n opacity: 0.6;\r\n }\r\n `, [colors]);\r\n\r\n useEffect(() => {\r\n // Detect user's country based on timezone or IP\r\n const detectCountry = async () => {\r\n try {\r\n // Try to get country from timezone first\r\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\r\n const timezoneToCountry: Record<string, string> = {\r\n 'America/New_York': 'US',\r\n 'America/Chicago': 'US',\r\n 'America/Denver': 'US',\r\n 'America/Los_Angeles': 'US',\r\n 'America/Phoenix': 'US',\r\n 'America/Anchorage': 'US',\r\n 'Pacific/Honolulu': 'US',\r\n 'Europe/London': 'GB',\r\n 'Europe/Paris': 'FR',\r\n 'Europe/Berlin': 'DE',\r\n 'Europe/Rome': 'IT',\r\n 'Europe/Madrid': 'ES',\r\n 'Asia/Dubai': 'AE',\r\n 'Asia/Kolkata': 'IN',\r\n 'Asia/Shanghai': 'CN',\r\n 'Asia/Tokyo': 'JP',\r\n 'Asia/Seoul': 'KR',\r\n 'Asia/Singapore': 'SG',\r\n 'Asia/Hong_Kong': 'HK',\r\n 'Australia/Sydney': 'AU',\r\n 'Pacific/Auckland': 'NZ',\r\n 'America/Toronto': 'CA',\r\n 'America/Vancouver': 'CA',\r\n 'America/Mexico_City': 'MX',\r\n 'America/Sao_Paulo': 'BR',\r\n 'America/Buenos_Aires': 'AR',\r\n 'Africa/Cairo': 'EG',\r\n 'Africa/Johannesburg': 'ZA',\r\n 'Africa/Lagos': 'NG',\r\n 'Africa/Nairobi': 'KE',\r\n };\r\n\r\n const detectedCountry = timezoneToCountry[timezone];\r\n if (detectedCountry) {\r\n setDefaultCountry(detectedCountry);\r\n return;\r\n }\r\n\r\n // Fallback: Try to get country from IP using a free API\r\n const response = await fetch('https://ipapi.co/json/', {\r\n signal: AbortSignal.timeout(3000) // 3 second timeout\r\n });\r\n \r\n if (response.ok) {\r\n const data = await response.json();\r\n if (data.country_code) {\r\n setDefaultCountry(data.country_code);\r\n }\r\n }\r\n } catch (error) {\r\n // If detection fails, keep default US\r\n console.log('Country detection failed, using default US');\r\n }\r\n };\r\n\r\n detectCountry();\r\n }, []);\r\n\r\n // Memoize the onChange handler to prevent recreation\r\n const handleChange = useMemo(() => (val: string | undefined) => {\r\n onChange(val || '');\r\n }, [onChange]);\r\n\r\n // Fallback to simple input if react-phone-number-input is not available\r\n if (!PhoneInputWithCountry) {\r\n return (\r\n <input\r\n id={id}\r\n type=\"tel\"\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n disabled={disabled}\r\n required={required}\r\n placeholder={placeholder}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n ...style\r\n }}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n style={{\r\n width: '100%',\r\n ...style\r\n }}\r\n >\r\n <style>{styleContent}</style>\r\n \r\n <PhoneInputWithCountry\r\n key={id}\r\n id={id}\r\n international\r\n defaultCountry={defaultCountry as any}\r\n value={value || ''}\r\n onChange={handleChange}\r\n disabled={disabled}\r\n placeholder={placeholder}\r\n inputComponent={CustomPhoneInput}\r\n />\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../use-auth';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\nimport { AuthConfig } from '../../types';\r\nimport { PhoneInput } from './PhoneInput';\r\n\r\nexport interface RegisterFormProps {\r\n onRegisterSuccess?: () => void;\r\n onLoginClick?: () => void;\r\n showLoginLink?: boolean;\r\n authConfig?: AuthConfig;\r\n oauthProviders?: Array<'google' | 'github'>;\r\n showOAuthButtons?: boolean;\r\n invitationToken?: string | null;\r\n}\r\n\r\nexport const RegisterForm: React.FC<RegisterFormProps> = ({\r\n onRegisterSuccess,\r\n onLoginClick,\r\n showLoginLink = true,\r\n authConfig,\r\n oauthProviders = ['google', 'github'],\r\n showOAuthButtons = true,\r\n invitationToken\r\n}) => {\r\n const colors = useThemeColors();\r\n const [name, setName] = useState('');\r\n const [email, setEmail] = useState('');\r\n const [phoneNumber, setPhoneNumber] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\r\n\r\n const getPasswordStrength = (pwd: string): { strength: 'weak' | 'medium' | 'strong'; score: number; label: string } => {\r\n if (!pwd) return { strength: 'weak', score: 0, label: '' };\r\n\r\n let score = 0;\r\n if (pwd.length >= 6) score++;\r\n if (pwd.length >= 8) score++;\r\n if (/[a-z]/.test(pwd) && /[A-Z]/.test(pwd)) score++;\r\n if (/\\d/.test(pwd)) score++;\r\n if (/[^a-zA-Z\\d]/.test(pwd)) score++;\r\n\r\n if (score <= 2) return { strength: 'weak', score, label: 'Weak' };\r\n if (score <= 3) return { strength: 'medium', score, label: 'Medium' };\r\n return { strength: 'strong', score, label: 'Strong' };\r\n };\r\n\r\n const passwordStrength = getPasswordStrength(password);\r\n\r\n // Use the provided authConfig or a default one\r\n const config = authConfig || {\r\n baseUrl: 'http://localhost:7000'\r\n };\r\n\r\n const { register } = useAuth(config);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n // Validate password confirmation\r\n if (password !== confirmPassword) {\r\n setError('Passwords do not match');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n // Validate password strength\r\n if (password.length < 6) {\r\n setError('Password must be at least 6 characters long');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n // If invitation token is present, use the signup-with-invitation endpoint\r\n if (invitationToken) {\r\n const response = await fetch(`${config.baseUrl}/api/v1/auth/signup-with-invitation`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n name,\r\n email,\r\n password,\r\n phoneNumber: phoneNumber || undefined,\r\n invitationToken,\r\n }),\r\n });\r\n\r\n const data = await response.json();\r\n\r\n if (response.ok && data.success) {\r\n // Store the token\r\n if (typeof window !== 'undefined' && data.token) {\r\n localStorage.setItem('auth_token', data.token);\r\n }\r\n onRegisterSuccess?.();\r\n } else {\r\n setError(data.error || data.message || 'Registration failed');\r\n }\r\n } else {\r\n // Regular registration flow\r\n const registerData: any = {\r\n name,\r\n password,\r\n frontendBaseUrl: typeof window !== 'undefined'\r\n ? (process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || process.env.REACT_APP_FRONTEND_BASE_URL || window.location.origin)\r\n : undefined\r\n };\r\n\r\n // Add email or phone number\r\n if (email) registerData.email = email;\r\n if (phoneNumber) registerData.phoneNumber = phoneNumber;\r\n\r\n const response = await register(registerData);\r\n if (response.success) {\r\n onRegisterSuccess?.();\r\n } else {\r\n setError(response.message || 'Registration failed');\r\n }\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An unknown error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '24px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <form onSubmit={handleSubmit} style={{\r\n display: 'flex',\r\n flexDirection: 'column'\r\n }}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '20px',\r\n color: colors.textPrimary,\r\n fontSize: '24px',\r\n fontWeight: 600\r\n }}>Register</h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '16px',\r\n backgroundColor: colors.errorBg,\r\n color: colors.errorText,\r\n border: `1px solid ${colors.errorBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div style={{\r\n marginBottom: '16px'\r\n }}>\r\n <label htmlFor=\"name\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Name:</label>\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary\r\n }}\r\n placeholder=\"Enter your name\"\r\n />\r\n </div>\r\n\r\n <div style={{\r\n marginBottom: '16px'\r\n }}>\r\n <label htmlFor=\"register-email\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Email:</label>\r\n <input\r\n id=\"register-email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n required={!phoneNumber}\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary\r\n }}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n\r\n <div style={{\r\n marginBottom: '16px'\r\n }}>\r\n <label htmlFor=\"register-phone\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Phone Number (Optional):</label>\r\n <PhoneInput\r\n id=\"register-phone\"\r\n value={phoneNumber}\r\n onChange={setPhoneNumber}\r\n disabled={isLoading}\r\n placeholder=\"1234567890\"\r\n />\r\n </div>\r\n\r\n <div style={{\r\n marginBottom: '16px'\r\n }}>\r\n <label htmlFor=\"password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Password:</label>\r\n <input\r\n id=\"password\"\r\n type=\"password\"\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary\r\n }}\r\n placeholder=\"Enter your password\"\r\n minLength={6}\r\n />\r\n </div>\r\n\r\n <div style={{\r\n marginBottom: '16px'\r\n }}>\r\n <label htmlFor=\"confirm-password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Confirm Password:</label>\r\n <input\r\n id=\"confirm-password\"\r\n type=\"password\"\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary\r\n }}\r\n placeholder=\"Confirm your password\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n padding: '14px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n marginTop: '4px'\r\n }}\r\n >\r\n {isLoading ? 'Registering...' : 'Register'}\r\n </button>\r\n\r\n {showOAuthButtons && oauthProviders.length > 0 && (\r\n <div style={{\r\n marginTop: '16px',\r\n paddingTop: '16px',\r\n borderTop: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <div style={{\r\n position: 'relative',\r\n marginBottom: '16px'\r\n }}>\r\n <div style={{\r\n position: 'absolute',\r\n top: '50%',\r\n left: 0,\r\n right: 0,\r\n height: '1px',\r\n backgroundColor: colors.borderPrimary\r\n }} />\r\n <div style={{\r\n position: 'relative',\r\n textAlign: 'center'\r\n }}>\r\n <span style={{\r\n backgroundColor: colors.bgPrimary,\r\n padding: '0 12px',\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Or continue with</span>\r\n </div>\r\n </div>\r\n\r\n <div style={{\r\n display: 'grid',\r\n gridTemplateColumns: oauthProviders.length === 1 ? '1fr' : 'repeat(2, 1fr)',\r\n gap: '12px'\r\n }}>\r\n {oauthProviders.includes('google') && (\r\n <a\r\n href={`${config.baseUrl}/api/v1/auth/oauth/google`}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '8px',\r\n padding: '10px 16px',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n color: colors.textPrimary,\r\n textDecoration: 'none',\r\n fontSize: '14px',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.bgHover;\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.bgPrimary;\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n }}\r\n >\r\n <svg style={{ width: '18px', height: '18px' }} viewBox=\"0 0 24 24\">\r\n <path\r\n fill=\"#4285F4\"\r\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\r\n />\r\n <path\r\n fill=\"#34A853\"\r\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\r\n />\r\n <path\r\n fill=\"#FBBC05\"\r\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\r\n />\r\n <path\r\n fill=\"#EA4335\"\r\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\r\n />\r\n </svg>\r\n Google\r\n </a>\r\n )}\r\n\r\n {oauthProviders.includes('github') && (\r\n <a\r\n href={`${config.baseUrl}/api/v1/auth/oauth/github`}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '8px',\r\n padding: '10px 16px',\r\n backgroundColor: '#24292e',\r\n border: '1px solid #24292e',\r\n borderRadius: '8px',\r\n color: '#ffffff',\r\n textDecoration: 'none',\r\n fontSize: '14px',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = '#1b1f23';\r\n e.currentTarget.style.borderColor = '#1b1f23';\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = '#24292e';\r\n e.currentTarget.style.borderColor = '#24292e';\r\n }}\r\n >\r\n <svg style={{ width: '18px', height: '18px' }} fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\r\n </svg>\r\n GitHub\r\n </a>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {showLoginLink && (\r\n <div style={{\r\n textAlign: 'center',\r\n marginTop: '16px',\r\n paddingTop: '16px',\r\n borderTop: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <p style={{\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>\r\n Already have an account?{' '}\r\n <button\r\n type=\"button\"\r\n onClick={onLoginClick}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n transition: 'color 0.2s ease'\r\n }}\r\n >\r\n Login\r\n </button>\r\n </p>\r\n </div>\r\n )}\r\n </form>\r\n </div>\r\n );\r\n};","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../use-auth';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\n// Removed CSS import - styles will be embedded directly\r\n\r\ninterface OtpFormProps {\r\n email: string;\r\n onVerifySuccess?: () => void;\r\n onBackToLogin?: () => void;\r\n baseUrl?: string;\r\n}\r\n\r\nexport const OtpForm: React.FC<OtpFormProps> = ({\r\n email,\r\n onVerifySuccess,\r\n onBackToLogin,\r\n baseUrl\r\n}) => {\r\n const colors = useThemeColors();\r\n const [otp, setOtp] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [resendCooldown, setResendCooldown] = useState(0);\r\n const [resendLoading, setResendLoading] = useState(false);\r\n\r\n const { verify, login } = useAuth({\r\n baseUrl: baseUrl || process.env.NEXT_PUBLIC_AUTH_API_URL || 'http://localhost:7000'\r\n });\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n // Validate OTP format\r\n if (!/^\\d{6}$/.test(otp)) {\r\n setError('Please enter a valid 6-digit OTP');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n const response = await verify({ email, otp });\r\n if (response.success) {\r\n onVerifySuccess?.();\r\n } else {\r\n setError(response.message || 'Verification failed');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An unknown error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const handleOtpChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const value = e.target.value;\r\n // Allow only digits and limit to 6 characters\r\n if (/^\\d{0,6}$/.test(value)) {\r\n setOtp(value);\r\n }\r\n };\r\n\r\n const handleResendOtp = async () => {\r\n if (resendCooldown > 0 || resendLoading) return;\r\n\r\n setResendLoading(true);\r\n setError(null);\r\n\r\n try {\r\n const response = await login({ email });\r\n if (response.success) {\r\n // Start 60 second cooldown\r\n setResendCooldown(60);\r\n const interval = setInterval(() => {\r\n setResendCooldown((prev) => {\r\n if (prev <= 1) {\r\n clearInterval(interval);\r\n return 0;\r\n }\r\n return prev - 1;\r\n });\r\n }, 1000);\r\n } else {\r\n setError(response.message || 'Failed to resend OTP');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to resend OTP');\r\n } finally {\r\n setResendLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <form onSubmit={handleSubmit} style={{\r\n display: 'flex',\r\n flexDirection: 'column'\r\n }}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: colors.textPrimary,\r\n fontSize: '24px',\r\n fontWeight: 600\r\n }}>Verify OTP</h2>\r\n <p style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Enter the 6-digit code sent to <strong style={{ color: colors.textPrimary }}>{email}</strong></p>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.errorBg,\r\n color: colors.errorText,\r\n border: `1px solid ${colors.errorBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div style={{\r\n marginBottom: '20px'\r\n }}>\r\n <label htmlFor=\"otp\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>OTP Code:</label>\r\n <input\r\n id=\"otp\"\r\n type=\"text\"\r\n value={otp}\r\n onChange={handleOtpChange}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '20px',\r\n boxSizing: 'border-box',\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n backgroundColor: colors.bgSecondary,\r\n textAlign: 'center',\r\n letterSpacing: '5px'\r\n }}\r\n maxLength={6}\r\n placeholder=\"123456\"\r\n autoFocus\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading || otp.length !== 6}\r\n style={{\r\n padding: '14px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n marginTop: '8px'\r\n }}\r\n >\r\n {isLoading ? 'Verifying...' : 'Verify OTP'}\r\n </button>\r\n\r\n <div style={{\r\n textAlign: 'center',\r\n marginTop: '20px',\r\n paddingTop: '20px',\r\n borderTop: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <button\r\n type=\"button\"\r\n onClick={handleResendOtp}\r\n disabled={isLoading || resendLoading || resendCooldown > 0}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: resendCooldown > 0 ? colors.textTertiary : colors.buttonPrimary,\r\n textDecoration: 'none',\r\n cursor: resendCooldown > 0 ? 'not-allowed' : 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n marginBottom: '12px',\r\n transition: 'color 0.2s ease',\r\n display: 'block',\r\n width: '100%'\r\n }}\r\n >\r\n {resendLoading ? 'Sending...' : resendCooldown > 0 ? `Resend OTP in ${resendCooldown}s` : 'Resend OTP'}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={onBackToLogin}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n padding: '0',\r\n transition: 'color 0.2s ease'\r\n }}\r\n >\r\n Back to Login\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n );\r\n};","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { LoginForm } from './LoginForm';\r\nimport { RegisterForm } from './RegisterForm';\r\nimport { OtpForm } from './OtpForm';\r\n// Removed CSS import - styles will be embedded directly\r\n\r\ntype AuthStep = 'login' | 'register' | 'otp';\r\n\r\ninterface AuthFlowProps {\r\n onAuthComplete?: () => void;\r\n initialStep?: AuthStep;\r\n showTitle?: boolean;\r\n}\r\n\r\nexport const AuthFlow: React.FC<AuthFlowProps> = ({ \r\n onAuthComplete,\r\n initialStep = 'login',\r\n showTitle = true\r\n}) => {\r\n const [step, setStep] = useState<AuthStep>(initialStep);\r\n const [email, setEmail] = useState('');\r\n const [message, setMessage] = useState<string | null>(null);\r\n\r\n const handleLoginSuccess = (email: string, needsOtpVerification: boolean) => {\r\n // Set email\r\n setEmail(email);\r\n \r\n if (needsOtpVerification) {\r\n // Move to OTP verification step\r\n setStep('otp');\r\n setMessage(null);\r\n } else {\r\n // Login is complete, notify parent\r\n setMessage(null);\r\n onAuthComplete?.();\r\n }\r\n };\r\n\r\n const handleRegisterSuccess = () => {\r\n // Registration successful, show message and redirect to login\r\n setMessage('Registration successful! Please check your email for verification.');\r\n // Automatically switch to login after a short delay\r\n setTimeout(() => {\r\n setStep('login');\r\n setMessage(null);\r\n }, 3000);\r\n };\r\n\r\n const handleVerifySuccess = () => {\r\n // Authentication complete\r\n setMessage(null);\r\n onAuthComplete?.();\r\n };\r\n\r\n const handleBackToLogin = () => {\r\n setStep('login');\r\n setMessage(null);\r\n };\r\n\r\n const renderCurrentStep = () => {\r\n switch (step) {\r\n case 'login':\r\n return (\r\n <>\r\n {showTitle && <h1 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#333',\r\n fontSize: '32px',\r\n fontWeight: 700\r\n }}>Welcome Back</h1>}\r\n {message && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#d4edda',\r\n color: '#155724',\r\n border: '1px solid #c3e6cb',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {message}\r\n </div>\r\n )}\r\n <LoginForm\r\n onLoginSuccess={handleLoginSuccess}\r\n onRegisterClick={() => setStep('register')}\r\n showRegisterLink={true}\r\n />\r\n </>\r\n );\r\n \r\n case 'register':\r\n return (\r\n <>\r\n {showTitle && <h1 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#333',\r\n fontSize: '32px',\r\n fontWeight: 700\r\n }}>Create Account</h1>}\r\n {message && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#d4edda',\r\n color: '#155724',\r\n border: '1px solid #c3e6cb',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 500\r\n }}>\r\n {message}\r\n </div>\r\n )}\r\n <RegisterForm\r\n onRegisterSuccess={handleRegisterSuccess}\r\n onLoginClick={() => setStep('login')}\r\n showLoginLink={true}\r\n />\r\n </>\r\n );\r\n \r\n case 'otp':\r\n return (\r\n <>\r\n {showTitle && <h1 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#333',\r\n fontSize: '32px',\r\n fontWeight: 700\r\n }}>Verify Your Email</h1>}\r\n <OtpForm\r\n email={email}\r\n onVerifySuccess={handleVerifySuccess}\r\n onBackToLogin={handleBackToLogin}\r\n />\r\n </>\r\n );\r\n \r\n default:\r\n return (\r\n <>\r\n {showTitle && <h1 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#333',\r\n fontSize: '32px',\r\n fontWeight: 700\r\n }}>Welcome Back</h1>}\r\n <LoginForm\r\n onLoginSuccess={handleLoginSuccess}\r\n onRegisterClick={() => setStep('register')}\r\n showRegisterLink={true}\r\n />\r\n </>\r\n );\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n minHeight: '300px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }}>\r\n {renderCurrentStep()}\r\n </div>\r\n );\r\n};","'use client';\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useAuth } from '../use-auth';\r\n// Removed CSS import - styles will be embedded directly\r\n\r\ninterface EmailVerificationPageProps {\r\n token: string;\r\n onVerificationSuccess?: () => void;\r\n onVerificationError?: (error: string) => void;\r\n baseUrl?: string;\r\n}\r\n\r\nexport const EmailVerificationPage: React.FC<EmailVerificationPageProps> = ({\r\n token,\r\n onVerificationSuccess,\r\n onVerificationError,\r\n baseUrl\r\n}) => {\r\n const [isLoading, setIsLoading] = useState(true);\r\n const [message, setMessage] = useState('');\r\n const [isSuccess, setIsSuccess] = useState(false);\r\n \r\n const { verifyEmailToken } = useAuth({\r\n baseUrl: baseUrl || (typeof window !== 'undefined' ? window.location.origin : 'http://localhost:7000')\r\n });\r\n\r\n useEffect(() => {\r\n const verifyEmail = async () => {\r\n if (!token) {\r\n setIsLoading(false);\r\n setMessage('Invalid verification token');\r\n setIsSuccess(false);\r\n onVerificationError?.('Invalid verification token');\r\n return;\r\n }\r\n\r\n try {\r\n const response = await verifyEmailToken(token);\r\n \r\n if (response.success) {\r\n setIsLoading(false);\r\n setMessage(response.message || 'Email verified successfully!');\r\n setIsSuccess(true);\r\n onVerificationSuccess?.();\r\n } else {\r\n setIsLoading(false);\r\n setMessage(response.message || 'Email verification failed');\r\n setIsSuccess(false);\r\n onVerificationError?.(response.message || 'Email verification failed');\r\n }\r\n } catch (err) {\r\n setIsLoading(false);\r\n const errorMessage = err instanceof Error ? err.message : 'An unknown error occurred';\r\n setMessage(errorMessage);\r\n setIsSuccess(false);\r\n onVerificationError?.(errorMessage);\r\n }\r\n };\r\n\r\n verifyEmail();\r\n }, [token, verifyEmailToken, onVerificationSuccess, onVerificationError]);\r\n\r\n if (isLoading) {\r\n return (\r\n <div style={{\r\n maxWidth: '500px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n textAlign: 'center',\r\n border: '1px solid #eaeaea'\r\n }}>\r\n <div style={{\r\n padding: '20px'\r\n }}>\r\n <h2 style={{ color: 'black' }}>Verifying your email...</h2>\r\n <div style={{\r\n border: '4px solid #f3f3f3',\r\n borderTop: '4px solid #007bff',\r\n borderRadius: '50%',\r\n width: '40px',\r\n height: '40px',\r\n animation: 'spin 2s linear infinite',\r\n margin: '20px auto'\r\n }}></div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '500px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n textAlign: 'center',\r\n border: '1px solid #eaeaea'\r\n }}>\r\n <div style={{\r\n padding: '20px'\r\n }}>\r\n <h2 style={{ color: 'black' }}>Email Verification</h2>\r\n <div style={{\r\n padding: '16px 20px',\r\n margin: '24px 0',\r\n borderRadius: '8px',\r\n fontSize: '15px',\r\n fontWeight: 500,\r\n backgroundColor: isSuccess ? '#d4edda' : '#f8d7da',\r\n color: isSuccess ? '#155724' : '#721c24',\r\n border: isSuccess ? '1px solid #c3e6cb' : '1px solid #f5c6cb'\r\n }}>\r\n {message}\r\n </div>\r\n {isSuccess && (\r\n <div style={{\r\n marginTop: '24px'\r\n }}>\r\n <p style={{ color: 'black' }}>Your email has been successfully verified!</p>\r\n <button \r\n onClick={() => window.location.href = '/login'}\r\n style={{\r\n padding: '12px 24px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease'\r\n }}\r\n >\r\n Go to Login\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};","'use client';\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\nimport { ThemeWrapper } from './ThemeWrapper';\r\n\r\ninterface SignInProps {\r\n redirectUrl?: string;\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n routing?: 'path' | 'virtual';\r\n path?: string;\r\n}\r\n\r\nexport const SignIn: React.FC<SignInProps> = ({ redirectUrl, appearance }) => {\r\n const { signIn, isSignedIn, loading: authLoading } = useAuth();\r\n const colors = useThemeColors();\r\n const [email, setEmail] = useState('');\r\n const [phoneNumber, setPhoneNumber] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [otp, setOtp] = useState('');\r\n const [usePassword, setUsePassword] = useState(false);\r\n const [usePhone, setUsePhone] = useState(false);\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [needsOtp, setNeedsOtp] = useState(false);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n if (isSignedIn && redirectUrl) {\r\n const redirect = redirectUrl || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_LOGIN || \r\n '/dashboard';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${redirect}`;\r\n }\r\n }, [isSignedIn, redirectUrl]);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n const loginData = usePhone ? { phoneNumber } : { email };\r\n \r\n if (needsOtp) {\r\n // Submit OTP\r\n const response = await signIn({ ...loginData, otp });\r\n if (response.success) {\r\n setSuccess('Login successful!');\r\n // Redirect will happen via useEffect\r\n } else {\r\n setError(response.message || 'OTP verification failed');\r\n }\r\n } else if (usePassword) {\r\n // Password login\r\n const response = await signIn({ ...loginData, password });\r\n if (response.success) {\r\n setSuccess('Login successful!');\r\n // Redirect will happen via useEffect\r\n } else {\r\n setError(response.message || 'Login failed');\r\n }\r\n } else {\r\n // Request OTP\r\n const response = await signIn(loginData);\r\n if (response.success && (response.message === 'OTP sent to your email.' || response.message === 'OTP sent to your phone number.')) {\r\n setNeedsOtp(true);\r\n setSuccess(usePhone ? 'OTP sent to your phone. Please check your messages.' : 'OTP sent to your email. Please check your inbox.');\r\n } else {\r\n setError(response.message || 'Failed to send OTP');\r\n }\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const toggleAuthMethod = () => {\r\n setUsePassword(!usePassword);\r\n setNeedsOtp(false);\r\n setError(null);\r\n setSuccess(null);\r\n setOtp('');\r\n };\r\n\r\n const toggleLoginMethod = () => {\r\n setUsePhone(!usePhone);\r\n setNeedsOtp(false);\r\n setError(null);\r\n setSuccess(null);\r\n setOtp('');\r\n setEmail('');\r\n setPhoneNumber('');\r\n };\r\n\r\n if (authLoading) {\r\n return (\r\n <div style={{ textAlign: 'center', padding: '40px' }}>\r\n <div>Loading...</div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <ThemeWrapper\r\n style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderPrimary}`,\r\n ...appearance?.elements?.card\r\n }}\r\n >\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: colors.textPrimary,\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n {needsOtp ? 'Enter OTP' : usePassword ? 'Sign in with password' : 'Sign in'}\r\n </h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.errorBg,\r\n color: colors.errorText,\r\n border: `1px solid ${colors.errorBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.successBg,\r\n color: colors.successText,\r\n border: `1px solid ${colors.successBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {success}\r\n </div>\r\n )}\r\n\r\n {!needsOtp && !usePhone && (\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"email\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Email</label>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n )}\r\n\r\n {!needsOtp && usePhone && (\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"phoneNumber\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Phone Number</label>\r\n <input\r\n id=\"phoneNumber\"\r\n type=\"tel\"\r\n value={phoneNumber}\r\n onChange={(e) => setPhoneNumber(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Enter your phone number\"\r\n />\r\n </div>\r\n )}\r\n\r\n {usePassword && !needsOtp && (\r\n <div style={{ marginBottom: '20px', position: 'relative' }}>\r\n <label htmlFor=\"password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Password</label>\r\n <input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Enter your password\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n style={{\r\n position: 'absolute',\r\n right: '12px',\r\n top: '38px',\r\n background: 'none',\r\n border: 'none',\r\n cursor: 'pointer',\r\n color: colors.textTertiary,\r\n fontSize: '14px'\r\n }}\r\n >\r\n {showPassword ? 'Hide' : 'Show'}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {needsOtp && (\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"otp\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>One-Time Password</label>\r\n <input\r\n id=\"otp\"\r\n type=\"text\"\r\n value={otp}\r\n onChange={(e) => setOtp(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n maxLength={6}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n letterSpacing: '0.5em',\r\n textAlign: 'center',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"000000\"\r\n />\r\n </div>\r\n )}\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n onMouseEnter={(e) => {\r\n if (!isLoading) {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimaryHover;\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimary;\r\n }}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: isLoading ? 'not-allowed' : 'pointer',\r\n opacity: isLoading ? 0.6 : 1,\r\n transition: 'all 0.2s ease',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Please wait...' : needsOtp ? 'Verify OTP' : usePassword ? 'Sign in' : usePhone ? 'Continue with phone' : 'Continue with email'}\r\n </button>\r\n\r\n {!needsOtp && (\r\n <div style={{ textAlign: 'center', marginTop: '16px' }}>\r\n <button\r\n type=\"button\"\r\n onClick={toggleAuthMethod}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n marginRight: '16px'\r\n }}\r\n >\r\n {usePassword ? 'Use OTP code instead' : 'Use password instead'}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={toggleLoginMethod}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600\r\n }}\r\n >\r\n {usePhone ? 'Use email instead' : 'Use phone instead'}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {needsOtp && (\r\n <div style={{ textAlign: 'center', marginTop: '16px' }}>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n setNeedsOtp(false);\r\n setOtp('');\r\n setError(null);\r\n setSuccess(null);\r\n }}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: colors.buttonPrimary,\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600\r\n }}\r\n >\r\n Back to sign in\r\n </button>\r\n </div>\r\n )}\r\n </form>\r\n </ThemeWrapper>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { createContext, useContext, useState, useEffect, useCallback, ReactNode } from 'react';\r\nimport { AuthService } from '../core/auth-service';\r\nimport { User, AuthConfig, AuthResponse, LoginData, RegisterData, VerifyData, UpdateUserData, OAuthProvider } from '../types';\r\nimport { AuthThemeProvider } from './ThemeContext';\r\n\r\ninterface AuthContextValue {\r\n user: User | null;\r\n isLoaded: boolean;\r\n isSignedIn: boolean;\r\n loading: boolean;\r\n signIn: (data: LoginData) => Promise<AuthResponse>;\r\n signUp: (data: RegisterData) => Promise<AuthResponse>;\r\n signOut: () => Promise<void>;\r\n verify: (data: VerifyData) => Promise<AuthResponse>;\r\n verifyEmailToken: (token: string) => Promise<AuthResponse>;\r\n updateProfile: (data: UpdateUserData) => Promise<AuthResponse>;\r\n getProfile: () => Promise<User>;\r\n signInWithOAuth: (provider: OAuthProvider) => void;\r\n linkOAuthProvider: (provider: OAuthProvider) => void;\r\n unlinkOAuthProvider: (provider: OAuthProvider) => Promise<AuthResponse>;\r\n forgotPassword: (email: string) => Promise<AuthResponse>;\r\n resetPassword: (token: string, password: string) => Promise<AuthResponse>;\r\n changePassword: (oldPassword: string, newPassword: string) => Promise<AuthResponse>;\r\n updateAvatar: (avatar: string) => Promise<AuthResponse>;\r\n uploadAndUpdateAvatar: (file: File) => Promise<AuthResponse>;\r\n requestEmailChange: (newEmail: string) => Promise<AuthResponse>;\r\n verifyEmailChange: (token: string) => Promise<AuthResponse>;\r\n generate2FA: () => Promise<any>;\r\n enable2FA: (token: string) => Promise<AuthResponse>;\r\n disable2FA: (token: string) => Promise<AuthResponse>;\r\n validate2FA: (token: string) => Promise<AuthResponse>;\r\n getSessions: () => Promise<any>;\r\n revokeSession: (sessionId: string) => Promise<AuthResponse>;\r\n revokeAllSessions: () => Promise<AuthResponse>;\r\n authService: AuthService;\r\n}\r\n\r\nconst AuthContext = createContext<AuthContextValue | undefined>(undefined);\r\n\r\ninterface AuthProviderProps {\r\n children: ReactNode;\r\n config?: Partial<AuthConfig>;\r\n}\r\n\r\nexport const AuthProvider: React.FC<AuthProviderProps> = ({ children, config }) => {\r\n // Get configuration from environment variables or props\r\n const authConfig: AuthConfig = {\r\n baseUrl: config?.baseUrl || \r\n (typeof window !== 'undefined' \r\n ? (process.env.NEXT_PUBLIC_AUTH_API_URL || process.env.REACT_APP_AUTH_API_URL || 'http://localhost:7000')\r\n : 'http://localhost:7000'),\r\n localStorageKey: config?.localStorageKey || 'auth_token',\r\n csrfEnabled: config?.csrfEnabled !== undefined ? config.csrfEnabled : true,\r\n upfilesConfig: config?.upfilesConfig,\r\n };\r\n\r\n const [authService] = useState(() => new AuthService(authConfig));\r\n const [user, setUser] = useState<User | null>(null);\r\n const [isLoaded, setIsLoaded] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n\r\n const checkAuthStatus = useCallback(async () => {\r\n const authenticated = authService.isAuthenticated();\r\n \r\n if (authenticated) {\r\n try {\r\n const currentUser = authService.getCurrentUser();\r\n setUser(currentUser);\r\n } catch (error) {\r\n console.error('Failed to get current user:', error);\r\n setUser(null);\r\n }\r\n } else {\r\n setUser(null);\r\n }\r\n \r\n setIsLoaded(true);\r\n }, [authService]);\r\n\r\n useEffect(() => {\r\n checkAuthStatus();\r\n }, [checkAuthStatus]);\r\n\r\n const signIn = useCallback(async (data: LoginData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.login(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const signUp = useCallback(async (data: RegisterData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.register(data);\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const signOut = useCallback(async (): Promise<void> => {\r\n setLoading(true);\r\n try {\r\n await authService.logout();\r\n setUser(null);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verify = useCallback(async (data: VerifyData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verify(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verifyEmailToken = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verifyEmailToken(token);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const updateProfile = useCallback(async (data: UpdateUserData): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.updateProfile(data);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getProfile = useCallback(async (): Promise<User> => {\r\n setLoading(true);\r\n try {\r\n const userData = await authService.getProfile();\r\n setUser(userData);\r\n return userData;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const signInWithOAuth = useCallback((provider: OAuthProvider) => {\r\n authService.loginWithOAuth(provider);\r\n }, [authService]);\r\n\r\n const linkOAuthProvider = useCallback((provider: OAuthProvider) => {\r\n authService.linkOAuthProvider(provider);\r\n }, [authService]);\r\n\r\n const unlinkOAuthProvider = useCallback(async (provider: OAuthProvider): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.unlinkOAuthProvider(provider);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const forgotPassword = useCallback(async (email: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.forgotPassword(email);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const resetPassword = useCallback(async (token: string, password: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.resetPassword(token, password);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const changePassword = useCallback(async (oldPassword: string, newPassword: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.changePassword(oldPassword, newPassword);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const updateAvatar = useCallback(async (avatar: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.updateAvatar(avatar);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const uploadAndUpdateAvatar = useCallback(async (file: File): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.uploadAndUpdateAvatar(file);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const requestEmailChange = useCallback(async (newEmail: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.requestEmailChange(newEmail);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const verifyEmailChange = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.verifyEmailChange(token);\r\n if (response.success && response.user) {\r\n setUser(response.user);\r\n }\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const generate2FA = useCallback(async () => {\r\n setLoading(true);\r\n try {\r\n return await authService.generate2FA();\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const enable2FA = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.enable2FA(token);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const disable2FA = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.disable2FA(token);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const validate2FA = useCallback(async (token: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.validate2FA(token);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const getSessions = useCallback(async () => {\r\n setLoading(true);\r\n try {\r\n return await authService.getSessions();\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const revokeSession = useCallback(async (sessionId: string): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n return await authService.revokeSession(sessionId);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const revokeAllSessions = useCallback(async (): Promise<AuthResponse> => {\r\n setLoading(true);\r\n try {\r\n const response = await authService.revokeAllSessions();\r\n setUser(null);\r\n return response;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [authService]);\r\n\r\n const value: AuthContextValue = {\r\n user,\r\n isLoaded,\r\n isSignedIn: !!user,\r\n loading,\r\n signIn,\r\n signUp,\r\n signOut,\r\n verify,\r\n verifyEmailToken,\r\n updateProfile,\r\n getProfile,\r\n signInWithOAuth,\r\n linkOAuthProvider,\r\n unlinkOAuthProvider,\r\n forgotPassword,\r\n resetPassword,\r\n changePassword,\r\n updateAvatar,\r\n uploadAndUpdateAvatar,\r\n requestEmailChange,\r\n verifyEmailChange,\r\n generate2FA,\r\n enable2FA,\r\n disable2FA,\r\n validate2FA,\r\n getSessions,\r\n revokeSession,\r\n revokeAllSessions,\r\n authService,\r\n };\r\n\r\n return (\r\n <AuthContext.Provider value={value}>\r\n <AuthThemeProvider>\r\n {children}\r\n </AuthThemeProvider>\r\n </AuthContext.Provider>\r\n );\r\n};\r\n\r\nexport const useAuth = (): AuthContextValue => {\r\n const context = useContext(AuthContext);\r\n if (context === undefined) {\r\n throw new Error('useAuth must be used within an AuthProvider');\r\n }\r\n return context;\r\n};\r\n","'use client';\r\n\r\nimport React, { ReactNode, forwardRef } from 'react';\r\nimport { useAuthTheme } from '../ThemeContext';\r\n\r\ninterface ThemeWrapperProps {\r\n children: ReactNode;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nexport const ThemeWrapper = forwardRef<HTMLDivElement, ThemeWrapperProps>(\r\n ({ children, className = '', style }, ref) => {\r\n const { theme, mounted } = useAuthTheme();\r\n\r\n if (!mounted) {\r\n return <div ref={ref} className={className} style={style}>{children}</div>;\r\n }\r\n\r\n return (\r\n <div ref={ref} className={`${theme} ${className}`} style={style}>\r\n {children}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nThemeWrapper.displayName = 'ThemeWrapper';\r\n","'use client';\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\nimport { ThemeWrapper } from './ThemeWrapper';\r\nimport { PhoneInput } from './PhoneInput';\r\n\r\ninterface SignUpProps {\r\n redirectUrl?: string;\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const SignUp: React.FC<SignUpProps> = ({ redirectUrl, appearance }) => {\r\n const { signUp, isSignedIn } = useAuth();\r\n const colors = useThemeColors();\r\n const [name, setName] = useState('');\r\n const [email, setEmail] = useState('');\r\n const [phoneNumber, setPhoneNumber] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n if (isSignedIn && redirectUrl) {\r\n const redirect = redirectUrl ||\r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_REGISTER ||\r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_REGISTER ||\r\n '/dashboard';\r\n\r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL ||\r\n process.env.REACT_APP_FRONTEND_BASE_URL ||\r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n\r\n window.location.href = `${baseUrl}${redirect}`;\r\n }\r\n }, [isSignedIn, redirectUrl]);\r\n\r\n const getPasswordStrength = (pwd: string, colors: any): { strength: 'weak' | 'medium' | 'strong'; color: string } => {\r\n if (!pwd) return { strength: 'weak', color: colors.borderSecondary };\r\n\r\n let score = 0;\r\n if (pwd.length >= 6) score++;\r\n if (pwd.length >= 8) score++;\r\n if (/[a-z]/.test(pwd) && /[A-Z]/.test(pwd)) score++;\r\n if (/\\d/.test(pwd)) score++;\r\n if (/[^a-zA-Z\\d]/.test(pwd)) score++;\r\n\r\n if (score <= 2) return { strength: 'weak', color: colors.errorText };\r\n if (score <= 3) return { strength: 'medium', color: colors.warningText || '#fa4' };\r\n return { strength: 'strong', color: colors.successText };\r\n };\r\n\r\n const passwordStrength = getPasswordStrength(password, colors);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n if (password !== confirmPassword) {\r\n setError('Passwords do not match');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n if (password.length < 6) {\r\n setError('Password must be at least 6 characters');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n const signUpData: any = { name, password };\r\n if (email) signUpData.email = email;\r\n if (phoneNumber) signUpData.phoneNumber = phoneNumber;\r\n \r\n const response = await signUp(signUpData);\r\n if (response.success) {\r\n setSuccess('Registration successful! Please check your email to verify your account.');\r\n } else {\r\n setError(response.message || 'Registration failed');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <ThemeWrapper style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: colors.bgPrimary,\r\n border: `1px solid ${colors.borderPrimary}`,\r\n ...appearance?.elements?.card\r\n }}>\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: colors.textPrimary,\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n Create your account\r\n </h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.errorBg,\r\n color: colors.errorText,\r\n border: `1px solid ${colors.errorBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.successBg,\r\n color: colors.successText,\r\n border: `1px solid ${colors.successBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {success}\r\n </div>\r\n )}\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"name\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Full name</label>\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Enter your full name\"\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"email\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Email</label>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required={!phoneNumber}\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"phoneNumber\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Phone Number (Optional)</label>\r\n <PhoneInput\r\n id=\"phoneNumber\"\r\n value={phoneNumber}\r\n onChange={setPhoneNumber}\r\n disabled={isLoading}\r\n placeholder=\"1234567890\"\r\n style={appearance?.elements?.formFieldInput}\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px', position: 'relative' }}>\r\n <label htmlFor=\"password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Password</label>\r\n <input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n minLength={6}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Create a password\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n style={{\r\n position: 'absolute',\r\n right: '12px',\r\n top: '38px',\r\n background: 'none',\r\n border: 'none',\r\n cursor: 'pointer',\r\n color: colors.textTertiary,\r\n fontSize: '14px'\r\n }}\r\n >\r\n {showPassword ? 'Hide' : 'Show'}\r\n </button>\r\n {password && (\r\n <div style={{ marginTop: '8px' }}>\r\n <div style={{\r\n height: '4px',\r\n backgroundColor: colors.borderSecondary,\r\n borderRadius: '2px',\r\n overflow: 'hidden'\r\n }}>\r\n <div style={{\r\n height: '100%',\r\n width: passwordStrength.strength === 'weak' ? '33%' : passwordStrength.strength === 'medium' ? '66%' : '100%',\r\n backgroundColor: passwordStrength.color,\r\n transition: 'all 0.3s ease'\r\n }} />\r\n </div>\r\n <p style={{\r\n fontSize: '12px',\r\n color: passwordStrength.color,\r\n marginTop: '4px',\r\n textTransform: 'capitalize'\r\n }}>\r\n {passwordStrength.strength} password\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"confirmPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Confirm password</label>\r\n <input\r\n id=\"confirmPassword\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n onFocus={(e) => {\r\n e.currentTarget.style.borderColor = colors.buttonPrimary;\r\n e.currentTarget.style.outline = `2px solid ${colors.buttonPrimary}40`;\r\n }}\r\n onBlur={(e) => {\r\n e.currentTarget.style.borderColor = colors.borderSecondary;\r\n e.currentTarget.style.outline = 'none';\r\n }}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease',\r\n WebkitTextFillColor: colors.textPrimary,\r\n WebkitBoxShadow: `0 0 0 1000px ${colors.bgSecondary} inset`,\r\n ...appearance?.elements?.formFieldInput\r\n } as React.CSSProperties}\r\n placeholder=\"Confirm your password\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n onMouseEnter={(e) => {\r\n if (!isLoading) {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimaryHover;\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimary;\r\n }}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: isLoading ? 'not-allowed' : 'pointer',\r\n opacity: isLoading ? 0.6 : 1,\r\n transition: 'all 0.2s ease',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Creating account...' : 'Sign up'}\r\n </button>\r\n </form>\r\n </ThemeWrapper>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface SignOutProps {\r\n redirectUrl?: string;\r\n}\r\n\r\nexport const SignOut: React.FC<SignOutProps> = ({ redirectUrl }) => {\r\n const { signOut } = useAuth();\r\n\r\n useEffect(() => {\r\n const performSignOut = async () => {\r\n await signOut();\r\n \r\n const redirect = redirectUrl || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_LOGOUT || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_LOGOUT || \r\n '/';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${redirect}`;\r\n };\r\n\r\n performSignOut();\r\n }, [signOut, redirectUrl]);\r\n\r\n return (\r\n <div style={{ textAlign: 'center', padding: '40px' }}>\r\n <div>Signing out...</div>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState, useRef, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\nimport { ThemeWrapper } from './ThemeWrapper';\r\n\r\ninterface UserButtonProps {\r\n showName?: boolean;\r\n appearance?: {\r\n elements?: {\r\n userButtonBox?: React.CSSProperties;\r\n userButtonTrigger?: React.CSSProperties;\r\n userButtonPopoverCard?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const UserButton: React.FC<UserButtonProps> = ({ showName = false, appearance }) => {\r\n const { user, signOut } = useAuth();\r\n const colors = useThemeColors();\r\n const [isOpen, setIsOpen] = useState(false);\r\n const dropdownRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => document.removeEventListener('mousedown', handleClickOutside);\r\n }, []);\r\n\r\n if (!user) return null;\r\n\r\n const getInitials = (name: string) => {\r\n return name\r\n .split(' ')\r\n .map(n => n[0])\r\n .join('')\r\n .toUpperCase()\r\n .slice(0, 2);\r\n };\r\n\r\n const handleSignOut = async () => {\r\n await signOut();\r\n const redirect = process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_LOGOUT || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_LOGOUT || \r\n '/';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${redirect}`;\r\n };\r\n\r\n return (\r\n <ThemeWrapper style={{ position: 'relative', ...appearance?.elements?.userButtonBox }} ref={dropdownRef}>\r\n <button\r\n onClick={() => setIsOpen(!isOpen)}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n padding: '6px',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n borderRadius: '8px',\r\n cursor: 'pointer',\r\n transition: 'background-color 0.2s',\r\n ...appearance?.elements?.userButtonTrigger\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.bgHover;\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent';\r\n }}\r\n >\r\n <div style={{\r\n width: '36px',\r\n height: '36px',\r\n borderRadius: '50%',\r\n backgroundColor: colors.buttonPrimary,\r\n color: colors.textPrimary,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: '14px',\r\n fontWeight: 600\r\n }}>\r\n {getInitials(user.name)}\r\n </div>\r\n {showName && (\r\n <span style={{ fontSize: '14px', fontWeight: 500, color: colors.textPrimary }}>\r\n {user.name}\r\n </span>\r\n )}\r\n </button>\r\n\r\n {isOpen && (\r\n <div style={{\r\n position: 'absolute',\r\n top: '100%',\r\n right: 0,\r\n marginTop: '8px',\r\n width: '240px',\r\n backgroundColor: colors.bgPrimary,\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.15)',\r\n border: `1px solid ${colors.borderPrimary}`,\r\n zIndex: 1000,\r\n ...appearance?.elements?.userButtonPopoverCard\r\n }}>\r\n <div style={{\r\n padding: '16px',\r\n borderBottom: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <div style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '12px'\r\n }}>\r\n <div style={{\r\n width: '48px',\r\n height: '48px',\r\n borderRadius: '50%',\r\n backgroundColor: colors.buttonPrimary,\r\n color: colors.textPrimary,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: '18px',\r\n fontWeight: 600\r\n }}>\r\n {getInitials(user.name)}\r\n </div>\r\n <div style={{ flex: 1, minWidth: 0 }}>\r\n <div style={{\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n color: colors.textPrimary,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap'\r\n }}>\r\n {user.name}\r\n </div>\r\n <div style={{\r\n fontSize: '12px',\r\n color: colors.textTertiary,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap'\r\n }}>\r\n {user.email}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div style={{ padding: '8px' }}>\r\n <button\r\n onClick={handleSignOut}\r\n style={{\r\n width: '100%',\r\n padding: '10px 16px',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n borderRadius: '8px',\r\n textAlign: 'left',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n color: colors.textPrimary,\r\n fontWeight: 500,\r\n transition: 'background-color 0.2s'\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.bgHover;\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = 'transparent';\r\n }}\r\n >\r\n Sign out\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n </ThemeWrapper>\r\n );\r\n};\r\n\r\n","'use client';\r\n\r\nimport React, { ReactNode, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface ProtectedRouteProps {\r\n children: ReactNode;\r\n fallback?: ReactNode;\r\n redirectTo?: string;\r\n}\r\n\r\nexport const ProtectedRoute: React.FC<ProtectedRouteProps> = ({ \r\n children, \r\n fallback,\r\n redirectTo \r\n}) => {\r\n const { isSignedIn, isLoaded } = useAuth();\r\n\r\n useEffect(() => {\r\n if (isLoaded && !isSignedIn) {\r\n const loginPath = redirectTo || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_TO_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_TO_LOGIN || \r\n '/auth/login';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${loginPath}`;\r\n }\r\n }, [isSignedIn, isLoaded, redirectTo]);\r\n\r\n if (!isLoaded) {\r\n return fallback || (\r\n <div style={{ \r\n display: 'flex', \r\n justifyContent: 'center', \r\n alignItems: 'center', \r\n minHeight: '100vh' \r\n }}>\r\n <div>Loading...</div>\r\n </div>\r\n );\r\n }\r\n\r\n if (!isSignedIn) {\r\n return fallback || null;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n","'use client';\r\n\r\nimport React, { ReactNode, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface PublicRouteProps {\r\n children: ReactNode;\r\n redirectTo?: string;\r\n}\r\n\r\nexport const PublicRoute: React.FC<PublicRouteProps> = ({ \r\n children, \r\n redirectTo \r\n}) => {\r\n const { isSignedIn, isLoaded } = useAuth();\r\n\r\n useEffect(() => {\r\n if (isLoaded && isSignedIn) {\r\n const dashboardPath = redirectTo || \r\n process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_LOGIN || \r\n '/dashboard';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${dashboardPath}`;\r\n }\r\n }, [isSignedIn, isLoaded, redirectTo]);\r\n\r\n if (!isLoaded) {\r\n return (\r\n <div style={{ \r\n display: 'flex', \r\n justifyContent: 'center', \r\n alignItems: 'center', \r\n minHeight: '100vh' \r\n }}>\r\n <div>Loading...</div>\r\n </div>\r\n );\r\n }\r\n\r\n if (isSignedIn) {\r\n return null;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n","'use client';\r\n\r\nimport React, { useEffect, useState } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface VerifyEmailProps {\r\n token?: string;\r\n onSuccess?: () => void;\r\n onError?: (error: string) => void;\r\n}\r\n\r\nexport const VerifyEmail: React.FC<VerifyEmailProps> = ({ token, onSuccess, onError }) => {\r\n const { verifyEmailToken } = useAuth();\r\n const [status, setStatus] = useState<'loading' | 'success' | 'error'>('loading');\r\n const [message, setMessage] = useState('');\r\n\r\n useEffect(() => {\r\n const verify = async () => {\r\n // Get token from URL if not provided\r\n const verifyToken = token || (typeof window !== 'undefined' \r\n ? new URLSearchParams(window.location.search).get('token') \r\n : null);\r\n\r\n if (!verifyToken) {\r\n setStatus('error');\r\n setMessage('No verification token provided');\r\n onError?.('No verification token provided');\r\n return;\r\n }\r\n\r\n try {\r\n const response = await verifyEmailToken(verifyToken);\r\n if (response.success) {\r\n setStatus('success');\r\n setMessage('Email verified successfully! Redirecting...');\r\n onSuccess?.();\r\n \r\n // Redirect after success\r\n setTimeout(() => {\r\n const redirect = process.env.NEXT_PUBLIC_AUTH_REDIRECT_AFTER_VERIFY || \r\n process.env.REACT_APP_AUTH_REDIRECT_AFTER_VERIFY || \r\n '/dashboard';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${redirect}`;\r\n }, 2000);\r\n } else {\r\n setStatus('error');\r\n setMessage(response.message || 'Verification failed');\r\n onError?.(response.message || 'Verification failed');\r\n }\r\n } catch (err) {\r\n setStatus('error');\r\n const errorMsg = err instanceof Error ? err.message : 'An error occurred';\r\n setMessage(errorMsg);\r\n onError?.(errorMsg);\r\n }\r\n };\r\n\r\n verify();\r\n }, [token, verifyEmailToken, onSuccess, onError]);\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '40px auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n textAlign: 'center'\r\n }}>\r\n {status === 'loading' && (\r\n <>\r\n <div style={{\r\n width: '48px',\r\n height: '48px',\r\n margin: '0 auto 20px',\r\n border: '4px solid #f3f3f3',\r\n borderTop: '4px solid #007bff',\r\n borderRadius: '50%',\r\n animation: 'spin 1s linear infinite'\r\n }} />\r\n <style>{`\r\n @keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `}</style>\r\n <h2 style={{\r\n fontSize: '20px',\r\n fontWeight: 600,\r\n color: '#333',\r\n marginBottom: '12px'\r\n }}>\r\n Verifying your email...\r\n </h2>\r\n <p style={{ fontSize: '14px', color: '#666' }}>\r\n Please wait while we verify your email address.\r\n </p>\r\n </>\r\n )}\r\n\r\n {status === 'success' && (\r\n <>\r\n <div style={{\r\n width: '64px',\r\n height: '64px',\r\n margin: '0 auto 20px',\r\n backgroundColor: '#4caf50',\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }}>\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"3\">\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n </div>\r\n <h2 style={{\r\n fontSize: '20px',\r\n fontWeight: 600,\r\n color: '#333',\r\n marginBottom: '12px'\r\n }}>\r\n Email Verified!\r\n </h2>\r\n <p style={{ fontSize: '14px', color: '#666' }}>\r\n {message}\r\n </p>\r\n </>\r\n )}\r\n\r\n {status === 'error' && (\r\n <>\r\n <div style={{\r\n width: '64px',\r\n height: '64px',\r\n margin: '0 auto 20px',\r\n backgroundColor: '#f44336',\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }}>\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"3\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\r\n </svg>\r\n </div>\r\n <h2 style={{\r\n fontSize: '20px',\r\n fontWeight: 600,\r\n color: '#333',\r\n marginBottom: '12px'\r\n }}>\r\n Verification Failed\r\n </h2>\r\n <p style={{ fontSize: '14px', color: '#666', marginBottom: '20px' }}>\r\n {message}\r\n </p>\r\n <button\r\n onClick={() => {\r\n const loginPath = process.env.NEXT_PUBLIC_AUTH_REDIRECT_TO_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_TO_LOGIN || \r\n '/auth/login';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${loginPath}`;\r\n }}\r\n style={{\r\n padding: '10px 20px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n cursor: 'pointer'\r\n }}\r\n >\r\n Go to Login\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface ForgotPasswordProps {\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const ForgotPassword: React.FC<ForgotPasswordProps> = ({ appearance }) => {\r\n const { forgotPassword } = useAuth();\r\n const [email, setEmail] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n const response = await forgotPassword(email);\r\n if (response.success) {\r\n setSuccess('Password reset link sent! Please check your email.');\r\n setEmail('');\r\n } else {\r\n setError(response.message || 'Failed to send reset link');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n ...appearance?.elements?.card\r\n }}>\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '12px',\r\n color: '#1f2937',\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n Forgot password?\r\n </h2>\r\n \r\n <p style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#666',\r\n fontSize: '14px'\r\n }}>\r\n Enter your email address and we'll send you a link to reset your password.\r\n </p>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#fee',\r\n color: '#c33',\r\n border: '1px solid #fcc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#efe',\r\n color: '#3c3',\r\n border: '1px solid #cfc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {success}\r\n </div>\r\n )}\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"email\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Email</label>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n marginBottom: '16px',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Sending...' : 'Send reset link'}\r\n </button>\r\n\r\n <div style={{ textAlign: 'center' }}>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n const loginPath = process.env.NEXT_PUBLIC_AUTH_REDIRECT_TO_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_TO_LOGIN || \r\n '/auth/login';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${loginPath}`;\r\n }}\r\n disabled={isLoading}\r\n style={{\r\n background: 'none',\r\n border: 'none',\r\n color: '#007bff',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 600\r\n }}\r\n >\r\n Back to sign in\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface ResetPasswordProps {\r\n token?: string;\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const ResetPassword: React.FC<ResetPasswordProps> = ({ token, appearance }) => {\r\n const { resetPassword } = useAuth();\r\n const [resetToken, setResetToken] = useState(token || '');\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n useEffect(() => {\r\n // Get token from URL if not provided as prop\r\n if (!resetToken && typeof window !== 'undefined') {\r\n const urlToken = new URLSearchParams(window.location.search).get('token');\r\n if (urlToken) {\r\n setResetToken(urlToken);\r\n }\r\n }\r\n }, [resetToken]);\r\n\r\n const getPasswordStrength = (pwd: string): { strength: 'weak' | 'medium' | 'strong'; color: string } => {\r\n if (!pwd) return { strength: 'weak', color: '#ddd' };\r\n\r\n let score = 0;\r\n if (pwd.length >= 6) score++;\r\n if (pwd.length >= 8) score++;\r\n if (/[a-z]/.test(pwd) && /[A-Z]/.test(pwd)) score++;\r\n if (/\\d/.test(pwd)) score++;\r\n if (/[^a-zA-Z\\d]/.test(pwd)) score++;\r\n\r\n if (score <= 2) return { strength: 'weak', color: '#f44' };\r\n if (score <= 3) return { strength: 'medium', color: '#fa4' };\r\n return { strength: 'strong', color: '#4f4' };\r\n };\r\n\r\n const passwordStrength = getPasswordStrength(password);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n if (password !== confirmPassword) {\r\n setError('Passwords do not match');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n if (password.length < 6) {\r\n setError('Password must be at least 6 characters');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n if (!resetToken) {\r\n setError('Invalid reset token');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n const response = await resetPassword(resetToken, password);\r\n if (response.success) {\r\n setSuccess(true);\r\n setTimeout(() => {\r\n const loginPath = process.env.NEXT_PUBLIC_AUTH_REDIRECT_TO_LOGIN || \r\n process.env.REACT_APP_AUTH_REDIRECT_TO_LOGIN || \r\n '/auth/login';\r\n \r\n const baseUrl = process.env.NEXT_PUBLIC_FRONTEND_BASE_URL || \r\n process.env.REACT_APP_FRONTEND_BASE_URL || \r\n (typeof window !== 'undefined' ? window.location.origin : '');\r\n \r\n window.location.href = `${baseUrl}${loginPath}`;\r\n }, 2000);\r\n } else {\r\n setError(response.message || 'Failed to reset password');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n if (success) {\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '40px auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n textAlign: 'center'\r\n }}>\r\n <div style={{\r\n width: '64px',\r\n height: '64px',\r\n margin: '0 auto 20px',\r\n backgroundColor: '#4caf50',\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }}>\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"3\">\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n </div>\r\n <h2 style={{\r\n fontSize: '20px',\r\n fontWeight: 600,\r\n color: '#333',\r\n marginBottom: '12px'\r\n }}>\r\n Password Reset Successful!\r\n </h2>\r\n <p style={{ fontSize: '14px', color: '#666' }}>\r\n Your password has been reset. Redirecting to login...\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n ...appearance?.elements?.card\r\n }}>\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '12px',\r\n color: '#1f2937',\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n Reset your password\r\n </h2>\r\n \r\n <p style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#666',\r\n fontSize: '14px'\r\n }}>\r\n Enter your new password below.\r\n </p>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#fee',\r\n color: '#c33',\r\n border: '1px solid #fcc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div style={{ marginBottom: '20px', position: 'relative' }}>\r\n <label htmlFor=\"password\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>New password</label>\r\n <input\r\n id=\"password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n minLength={6}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Enter new password\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n style={{\r\n position: 'absolute',\r\n right: '12px',\r\n top: '38px',\r\n background: 'none',\r\n border: 'none',\r\n cursor: 'pointer',\r\n color: '#666',\r\n fontSize: '14px'\r\n }}\r\n >\r\n {showPassword ? 'Hide' : 'Show'}\r\n </button>\r\n {password && (\r\n <div style={{ marginTop: '8px' }}>\r\n <div style={{\r\n height: '4px',\r\n backgroundColor: '#eee',\r\n borderRadius: '2px',\r\n overflow: 'hidden'\r\n }}>\r\n <div style={{\r\n height: '100%',\r\n width: passwordStrength.strength === 'weak' ? '33%' : passwordStrength.strength === 'medium' ? '66%' : '100%',\r\n backgroundColor: passwordStrength.color,\r\n transition: 'all 0.3s ease'\r\n }} />\r\n </div>\r\n <p style={{\r\n fontSize: '12px',\r\n color: passwordStrength.color,\r\n marginTop: '4px',\r\n textTransform: 'capitalize'\r\n }}>\r\n {passwordStrength.strength} password\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"confirmPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Confirm password</label>\r\n <input\r\n id=\"confirmPassword\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Confirm new password\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Resetting...' : 'Reset password'}\r\n </button>\r\n </form>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\ninterface ChangePasswordProps {\r\n onSuccess?: () => void;\r\n appearance?: {\r\n elements?: {\r\n formButtonPrimary?: React.CSSProperties;\r\n card?: React.CSSProperties;\r\n headerTitle?: React.CSSProperties;\r\n formFieldInput?: React.CSSProperties;\r\n };\r\n };\r\n}\r\n\r\nexport const ChangePassword: React.FC<ChangePasswordProps> = ({ onSuccess, appearance }) => {\r\n const { changePassword } = useAuth();\r\n const [oldPassword, setOldPassword] = useState('');\r\n const [newPassword, setNewPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showPasswords, setShowPasswords] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n const getPasswordStrength = (pwd: string): { strength: 'weak' | 'medium' | 'strong'; color: string } => {\r\n if (!pwd) return { strength: 'weak', color: '#ddd' };\r\n\r\n let score = 0;\r\n if (pwd.length >= 6) score++;\r\n if (pwd.length >= 8) score++;\r\n if (/[a-z]/.test(pwd) && /[A-Z]/.test(pwd)) score++;\r\n if (/\\d/.test(pwd)) score++;\r\n if (/[^a-zA-Z\\d]/.test(pwd)) score++;\r\n\r\n if (score <= 2) return { strength: 'weak', color: '#f44' };\r\n if (score <= 3) return { strength: 'medium', color: '#fa4' };\r\n return { strength: 'strong', color: '#4f4' };\r\n };\r\n\r\n const passwordStrength = getPasswordStrength(newPassword);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(false);\r\n\r\n if (newPassword !== confirmPassword) {\r\n setError('New passwords do not match');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n if (newPassword.length < 6) {\r\n setError('New password must be at least 6 characters');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n const response = await changePassword(oldPassword, newPassword);\r\n if (response.success) {\r\n setSuccess(true);\r\n setOldPassword('');\r\n setNewPassword('');\r\n setConfirmPassword('');\r\n onSuccess?.();\r\n } else {\r\n setError(response.message || 'Failed to change password');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div style={{\r\n maxWidth: '400px',\r\n margin: '0 auto',\r\n padding: '30px',\r\n borderRadius: '12px',\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #eaeaea',\r\n ...appearance?.elements?.card\r\n }}>\r\n <form onSubmit={handleSubmit}>\r\n <h2 style={{\r\n textAlign: 'center',\r\n marginBottom: '24px',\r\n color: '#1f2937',\r\n fontSize: '24px',\r\n fontWeight: 600,\r\n ...appearance?.elements?.headerTitle\r\n }}>\r\n Change Password\r\n </h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#fee',\r\n color: '#c33',\r\n border: '1px solid #fcc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: '#efe',\r\n color: '#3c3',\r\n border: '1px solid #cfc',\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n Password changed successfully!\r\n </div>\r\n )}\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"oldPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Current password</label>\r\n <input\r\n id=\"oldPassword\"\r\n type={showPasswords ? 'text' : 'password'}\r\n value={oldPassword}\r\n onChange={(e) => setOldPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Enter current password\"\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"newPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>New password</label>\r\n <input\r\n id=\"newPassword\"\r\n type={showPasswords ? 'text' : 'password'}\r\n value={newPassword}\r\n onChange={(e) => setNewPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n minLength={6}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Enter new password\"\r\n />\r\n {newPassword && (\r\n <div style={{ marginTop: '8px' }}>\r\n <div style={{\r\n height: '4px',\r\n backgroundColor: '#eee',\r\n borderRadius: '2px',\r\n overflow: 'hidden'\r\n }}>\r\n <div style={{\r\n height: '100%',\r\n width: passwordStrength.strength === 'weak' ? '33%' : passwordStrength.strength === 'medium' ? '66%' : '100%',\r\n backgroundColor: passwordStrength.color,\r\n transition: 'all 0.3s ease'\r\n }} />\r\n </div>\r\n <p style={{\r\n fontSize: '12px',\r\n color: passwordStrength.color,\r\n marginTop: '4px',\r\n textTransform: 'capitalize'\r\n }}>\r\n {passwordStrength.strength} password\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"confirmPassword\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: '#374151',\r\n fontSize: '14px'\r\n }}>Confirm new password</label>\r\n <input\r\n id=\"confirmPassword\"\r\n type={showPasswords ? 'text' : 'password'}\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n ...appearance?.elements?.formFieldInput\r\n }}\r\n placeholder=\"Confirm new password\"\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label style={{ display: 'flex', alignItems: 'center', cursor: 'pointer' }}>\r\n <input\r\n type=\"checkbox\"\r\n checked={showPasswords}\r\n onChange={(e) => setShowPasswords(e.target.checked)}\r\n style={{ marginRight: '8px' }}\r\n />\r\n <span style={{ fontSize: '14px', color: '#666' }}>Show passwords</span>\r\n </label>\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '14px',\r\n backgroundColor: '#007bff',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n ...appearance?.elements?.formButtonPrimary\r\n }}\r\n >\r\n {isLoading ? 'Changing password...' : 'Change password'}\r\n </button>\r\n </form>\r\n </div>\r\n );\r\n};\r\n","'use client';\r\n\r\nimport React, { useState } from 'react';\r\nimport { useAuth } from '../AuthProvider';\r\nimport { useThemeColors } from '../hooks/useThemeColors';\r\nimport { PhoneInput } from './PhoneInput';\r\nimport { AvatarUploader } from './AvatarUploader';\r\n\r\ninterface UserProfileProps {\r\n showAvatar?: boolean;\r\n showEmailChange?: boolean;\r\n showPasswordChange?: boolean;\r\n upfilesConfig?: {\r\n baseUrl: string;\r\n apiKey?: string;\r\n apiKeyHeader?: 'authorization' | 'x-api-key' | 'x-up-api-key';\r\n presignUrl?: string;\r\n presignPath?: string;\r\n folderPath?: string;\r\n projectId?: string;\r\n };\r\n}\r\n\r\nexport const UserProfile: React.FC<UserProfileProps> = ({\r\n showAvatar = true,\r\n showEmailChange = true,\r\n showPasswordChange = true,\r\n upfilesConfig,\r\n}) => {\r\n const { user, updateProfile, requestEmailChange } = useAuth();\r\n const colors = useThemeColors();\r\n const [name, setName] = useState(user?.name || '');\r\n const [phoneNumber, setPhoneNumber] = useState(user?.phoneNumber || '');\r\n const [newEmail, setNewEmail] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n const handleUpdateProfile = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n const updates: { name?: string; phoneNumber?: string } = {};\r\n \r\n if (name !== user?.name) {\r\n updates.name = name;\r\n }\r\n\r\n if (phoneNumber !== user?.phoneNumber) {\r\n updates.phoneNumber = phoneNumber;\r\n }\r\n\r\n if (Object.keys(updates).length === 0) {\r\n setError('No changes to save');\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n const response = await updateProfile(updates);\r\n if (response.success) {\r\n setSuccess('Profile updated successfully!');\r\n } else {\r\n setError(response.message || 'Failed to update profile');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const handleAvatarUploadComplete = async (avatarUrl: string) => {\r\n setSuccess('Avatar updated successfully!');\r\n // Force a refresh of user data to show the new avatar\r\n window.location.reload();\r\n };\r\n\r\n const handleAvatarUploadError = (error: Error) => {\r\n setError(error.message || 'Failed to upload avatar');\r\n };\r\n\r\n const handleRequestEmailChange = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setIsLoading(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n const response = await requestEmailChange(newEmail);\r\n if (response.success) {\r\n setSuccess('Verification email sent! Please check your inbox.');\r\n setNewEmail('');\r\n } else {\r\n setError(response.message || 'Failed to request email change');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'An error occurred');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n if (!user) return null;\r\n\r\n return (\r\n <div style={{ maxWidth: '700px', margin: '0 auto', padding: '20px' }}>\r\n <h2 style={{ marginBottom: '24px', fontSize: '24px', fontWeight: 600, color: colors.textPrimary }}>Profile Settings</h2>\r\n\r\n {error && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.errorBg,\r\n color: colors.errorText,\r\n border: `1px solid ${colors.errorBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {error}\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div style={{\r\n padding: '12px 16px',\r\n marginBottom: '20px',\r\n backgroundColor: colors.successBg,\r\n color: colors.successText,\r\n border: `1px solid ${colors.successBorder}`,\r\n borderRadius: '8px',\r\n fontSize: '14px'\r\n }}>\r\n {success}\r\n </div>\r\n )}\r\n\r\n {/* Profile Information Form */}\r\n <div style={{\r\n padding: '24px',\r\n backgroundColor: colors.bgPrimary,\r\n borderRadius: '12px',\r\n boxShadow: '0 2px 8px rgba(0,0,0,0.1)',\r\n marginBottom: '24px',\r\n border: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <h3 style={{ marginBottom: '20px', fontSize: '18px', fontWeight: 600, color: colors.textPrimary }}>Profile Information</h3>\r\n <form onSubmit={handleUpdateProfile}>\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"name\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Full Name</label>\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease'\r\n }}\r\n placeholder=\"Manish Batra\"\r\n />\r\n </div>\r\n\r\n <div style={{ marginBottom: '20px' }}>\r\n <label htmlFor=\"phoneNumber\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Phone Number</label>\r\n <PhoneInput\r\n id=\"phoneNumber\"\r\n value={phoneNumber}\r\n onChange={setPhoneNumber}\r\n disabled={isLoading}\r\n placeholder=\"1234567890\"\r\n />\r\n </div>\r\n\r\n {showAvatar && upfilesConfig && (\r\n <div style={{ marginBottom: '20px' }}>\r\n <label style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>Avatar</label>\r\n {user?.avatar && (\r\n <div style={{ marginBottom: '12px' }}>\r\n <img \r\n src={user.avatar} \r\n alt=\"Current avatar\" \r\n style={{\r\n width: '80px',\r\n height: '80px',\r\n borderRadius: '50%',\r\n objectFit: 'cover',\r\n border: `2px solid ${colors.borderSecondary}`\r\n }}\r\n />\r\n </div>\r\n )}\r\n <AvatarUploader\r\n upfilesConfig={upfilesConfig}\r\n onUploadComplete={handleAvatarUploadComplete}\r\n onError={handleAvatarUploadError}\r\n maxFileSize={5 * 1024 * 1024}\r\n accept={['image/*']}\r\n />\r\n </div>\r\n )}\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n onMouseEnter={(e) => {\r\n if (!isLoading) {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimaryHover;\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimary;\r\n }}\r\n style={{\r\n padding: '12px 24px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n cursor: isLoading ? 'not-allowed' : 'pointer',\r\n opacity: isLoading ? 0.6 : 1,\r\n transition: 'all 0.2s ease'\r\n }}\r\n >\r\n {isLoading ? 'Saving...' : 'Save Changes'}\r\n </button>\r\n </form>\r\n </div>\r\n\r\n {/* Change Email Form */}\r\n {showEmailChange && (\r\n <div style={{\r\n padding: '24px',\r\n backgroundColor: colors.bgPrimary,\r\n borderRadius: '12px',\r\n boxShadow: '0 2px 8px rgba(0,0,0,0.1)',\r\n marginBottom: '20px',\r\n border: `1px solid ${colors.borderPrimary}`\r\n }}>\r\n <h3 style={{ marginBottom: '16px', fontSize: '18px', fontWeight: 600, color: colors.textPrimary }}>Change Email</h3>\r\n <p style={{ fontSize: '14px', color: colors.textSecondary, marginBottom: '16px' }}>\r\n Current email: <strong>{user.email}</strong>\r\n </p>\r\n <form onSubmit={handleRequestEmailChange}>\r\n <div style={{ marginBottom: '16px' }}>\r\n <label htmlFor=\"newEmail\" style={{\r\n display: 'block',\r\n marginBottom: '8px',\r\n fontWeight: 500,\r\n color: colors.textSecondary,\r\n fontSize: '14px'\r\n }}>New Email Address</label>\r\n <input\r\n id=\"newEmail\"\r\n type=\"email\"\r\n value={newEmail}\r\n onChange={(e) => setNewEmail(e.target.value)}\r\n required\r\n disabled={isLoading}\r\n style={{\r\n width: '100%',\r\n padding: '12px 16px',\r\n border: `1px solid ${colors.borderSecondary}`,\r\n borderRadius: '8px',\r\n fontSize: '16px',\r\n boxSizing: 'border-box',\r\n backgroundColor: colors.bgSecondary,\r\n color: colors.textPrimary,\r\n transition: 'all 0.2s ease'\r\n }}\r\n placeholder=\"newemail@example.com\"\r\n />\r\n </div>\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n onMouseEnter={(e) => {\r\n if (!isLoading) {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimaryHover;\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = colors.buttonPrimary;\r\n }}\r\n style={{\r\n padding: '12px 24px',\r\n backgroundColor: colors.buttonPrimary,\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '8px',\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n cursor: isLoading ? 'not-allowed' : 'pointer',\r\n opacity: isLoading ? 0.6 : 1,\r\n transition: 'all 0.2s ease'\r\n }}\r\n >\r\n {isLoading ? 'Sending...' : 'Request Email Change'}\r\n </button>\r\n </form>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { ImageManager } from '@thetechfossil/upfiles';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\nexport interface AvatarUploaderProps {\r\n onUploadComplete?: (avatarUrl: string) => void;\r\n onError?: (error: Error) => void;\r\n className?: string;\r\n buttonClassName?: string;\r\n dropzoneClassName?: string;\r\n maxFileSize?: number;\r\n accept?: string[];\r\n upfilesConfig: {\r\n baseUrl: string;\r\n apiKey?: string;\r\n apiKeyHeader?: 'authorization' | 'x-api-key' | 'x-up-api-key';\r\n presignUrl?: string;\r\n presignPath?: string;\r\n folderPath?: string;\r\n projectId?: string;\r\n };\r\n buttonText?: string;\r\n}\r\n\r\n/**\r\n * AvatarUploader Component\r\n * \r\n * A ready-to-use component for uploading user avatars using the upfiles SDK.\r\n * Opens an ImageManager dialog for uploading and selecting images.\r\n * Automatically updates the user's avatar in the auth system after selection.\r\n * \r\n * @example\r\n * ```tsx\r\n * <AvatarUploader\r\n * upfilesConfig={{\r\n * baseUrl: process.env.NEXT_PUBLIC_UPFILES_APP_URL!,\r\n * apiKey: process.env.NEXT_PUBLIC_UPFILES_API_KEY!,\r\n * apiKeyHeader: 'authorization',\r\n * folderPath: 'avatars/',\r\n * projectId: 'proj_123'\r\n * }}\r\n * onUploadComplete={(url) => console.log('Avatar uploaded:', url)}\r\n * onError={(err) => console.error('Upload failed:', err)}\r\n * buttonText=\"Upload Avatar\"\r\n * />\r\n * ```\r\n */\r\nexport const AvatarUploader: React.FC<AvatarUploaderProps> = ({\r\n onUploadComplete,\r\n onError,\r\n className,\r\n buttonClassName,\r\n maxFileSize = 5 * 1024 * 1024, // 5MB default\r\n upfilesConfig,\r\n buttonText = 'Upload Avatar',\r\n}) => {\r\n const { uploadAndUpdateAvatar } = useAuth();\r\n const [open, setOpen] = useState(false);\r\n const [uploading, setUploading] = useState(false);\r\n\r\n const handleSelect = async (image: {\r\n url: string;\r\n key: string;\r\n originalName: string;\r\n size: number;\r\n contentType: string;\r\n }) => {\r\n setUploading(true);\r\n try {\r\n // Fetch the image as a blob and convert to File\r\n const response = await fetch(image.url);\r\n const blob = await response.blob();\r\n const file = new File([blob], image.originalName, { type: image.contentType });\r\n \r\n const result = await uploadAndUpdateAvatar(file);\r\n \r\n if (result.success && result.user?.avatar) {\r\n onUploadComplete?.(result.user.avatar);\r\n setOpen(false);\r\n } else {\r\n throw new Error(result.message || 'Failed to update avatar');\r\n }\r\n } catch (error) {\r\n const err = error instanceof Error ? error : new Error('Upload failed');\r\n onError?.(err);\r\n } finally {\r\n setUploading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className={className}>\r\n <button\r\n type=\"button\"\r\n onClick={() => setOpen(true)}\r\n disabled={uploading}\r\n className={buttonClassName || 'px-4 py-2 text-sm rounded border bg-blue-600 text-white hover:bg-blue-700 disabled:opacity-50'}\r\n >\r\n {uploading ? 'Uploading...' : buttonText}\r\n </button>\r\n\r\n <ImageManager\r\n open={open}\r\n onOpenChange={setOpen}\r\n clientOptions={{\r\n baseUrl: upfilesConfig.baseUrl,\r\n apiKey: upfilesConfig.apiKey,\r\n apiKeyHeader: upfilesConfig.apiKeyHeader || 'authorization',\r\n presignUrl: upfilesConfig.presignUrl,\r\n presignPath: upfilesConfig.presignPath,\r\n }}\r\n projectId={upfilesConfig.projectId}\r\n folderPath={upfilesConfig.folderPath || 'avatars/'}\r\n title=\"Select Avatar\"\r\n description=\"Upload a new avatar or select from existing images.\"\r\n mode=\"full\"\r\n maxFileSize={maxFileSize}\r\n maxFiles={1}\r\n autoRecordToDb={true}\r\n fetchThumbnails={true}\r\n onSelect={handleSelect}\r\n />\r\n </div>\r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { ImageManager } from '@thetechfossil/upfiles';\r\nimport { useAuth } from '../AuthProvider';\r\n\r\nexport interface AvatarManagerProps {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n onAvatarUpdated?: (avatarUrl: string) => void;\r\n onError?: (error: Error) => void;\r\n title?: string;\r\n description?: string;\r\n className?: string;\r\n gridClassName?: string;\r\n maxFileSize?: number;\r\n mode?: 'full' | 'browse' | 'upload';\r\n showDelete?: boolean;\r\n upfilesConfig: {\r\n baseUrl: string;\r\n apiKey?: string;\r\n apiKeyHeader?: 'authorization' | 'x-api-key' | 'x-up-api-key';\r\n presignUrl?: string;\r\n presignPath?: string;\r\n folderPath?: string;\r\n };\r\n}\r\n\r\n/**\r\n * AvatarManager Component\r\n * \r\n * A comprehensive avatar management component that allows users to:\r\n * - Browse existing uploaded images\r\n * - Upload new avatar images\r\n * - Select and set an avatar\r\n * \r\n * Uses the ImageManager from @thetechfossil/upfiles for a complete image management experience.\r\n * \r\n * @example\r\n * ```tsx\r\n * const [open, setOpen] = useState(false);\r\n * \r\n * <button onClick={() => setOpen(true)}>Change Avatar</button>\r\n * \r\n * <AvatarManager\r\n * open={open}\r\n * onOpenChange={setOpen}\r\n * upfilesConfig={{\r\n * baseUrl: process.env.NEXT_PUBLIC_UPFILES_APP_URL!,\r\n * apiKey: process.env.NEXT_PUBLIC_UPFILES_API_KEY!,\r\n * apiKeyHeader: 'authorization',\r\n * folderPath: 'avatars/'\r\n * }}\r\n * onAvatarUpdated={(url) => console.log('Avatar updated:', url)}\r\n * onError={(err) => console.error('Error:', err)}\r\n * />\r\n * ```\r\n */\r\nexport const AvatarManager: React.FC<AvatarManagerProps> = ({\r\n open,\r\n onOpenChange,\r\n onAvatarUpdated,\r\n onError,\r\n title = 'Select Avatar',\r\n description = 'Choose an existing image or upload a new one',\r\n className,\r\n gridClassName,\r\n maxFileSize = 5 * 1024 * 1024, // 5MB default\r\n mode = 'full',\r\n showDelete = false,\r\n upfilesConfig,\r\n}) => {\r\n const { updateProfile } = useAuth();\r\n const [updating, setUpdating] = useState(false);\r\n\r\n const handleSelect = async (image: any) => {\r\n setUpdating(true);\r\n try {\r\n const response = await updateProfile({ avatar: image.url });\r\n \r\n if (response.success && response.user?.avatar) {\r\n onAvatarUpdated?.(response.user.avatar);\r\n onOpenChange(false);\r\n } else {\r\n throw new Error(response.message || 'Failed to update avatar');\r\n }\r\n } catch (error) {\r\n const err = error instanceof Error ? error : new Error('Failed to update avatar');\r\n onError?.(err);\r\n } finally {\r\n setUpdating(false);\r\n }\r\n };\r\n\r\n return (\r\n <ImageManager\r\n open={open}\r\n onOpenChange={onOpenChange}\r\n clientOptions={{\r\n baseUrl: upfilesConfig.baseUrl,\r\n apiKey: upfilesConfig.apiKey,\r\n apiKeyHeader: upfilesConfig.apiKeyHeader || 'authorization',\r\n presignUrl: upfilesConfig.presignUrl,\r\n presignPath: upfilesConfig.presignPath,\r\n }}\r\n folderPath={upfilesConfig.folderPath || 'avatars/'}\r\n title={title}\r\n description={description}\r\n className={className}\r\n gridClassName={gridClassName}\r\n onSelect={handleSelect}\r\n maxFileSize={maxFileSize}\r\n mode={mode}\r\n showDelete={showDelete}\r\n fetchThumbnails={true}\r\n />\r\n );\r\n};\r\n"]}
|