@urbackend/react 0.1.1 → 0.2.0

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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/context.tsx","../src/hooks.ts","../src/components.tsx","../src/components/UrAuth.tsx","../src/components/Toast.tsx","../src/components/UrUserButton.tsx"],"sourcesContent":["export { UrProvider, useUrContext } from './context';\nexport type { UrProviderProps } from './context';\n\nexport { useAuth, useUser, useDb, useStorage } from './hooks';\nexport { ProtectedRoute, GuestRoute } from './components';\nexport type { ProtectedRouteProps, GuestRouteProps } from './components';\n\nexport { UrAuth } from './components/UrAuth';\nexport type { UrAuthProps } from './components/UrAuth';\n\nexport * from './components/UrUserButton';\n\nexport * from '@urbackend/sdk'; // re-export types so users don't need to import from sdk directly","import React, { createContext, useContext, useEffect, useState, useMemo } from 'react';\r\nimport { UrBackendClient, AuthModule, DatabaseModule, StorageModule } from '@urbackend/sdk';\r\nimport type { AuthUser } from '@urbackend/sdk';\r\n\r\ninterface UrContextValue {\r\n client: UrBackendClient | null;\r\n auth: AuthModule | null;\r\n db: DatabaseModule | null;\r\n storage: StorageModule | null;\r\n user: AuthUser | null;\r\n setUser: React.Dispatch<React.SetStateAction<AuthUser | null>>;\r\n isInitializing: boolean;\r\n isLoading: boolean;\r\n setIsLoading: React.Dispatch<React.SetStateAction<boolean>>;\r\n error: string | null;\r\n setError: React.Dispatch<React.SetStateAction<string | null>>;\r\n}\r\n\r\nconst UrContext = createContext<UrContextValue | undefined>(undefined);\r\n\r\nexport interface UrProviderProps {\r\n apiKey: string;\r\n baseUrl?: string;\r\n children: React.ReactNode;\r\n}\r\n\r\nexport const UrProvider: React.FC<UrProviderProps> = ({ apiKey, baseUrl, children }) => {\r\n const [user, setUser] = useState<AuthUser | null>(null);\r\n const [isInitializing, setIsInitializing] = useState(true);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const { client, auth, db, storage } = useMemo(() => {\r\n const _client = new UrBackendClient({ apiKey, baseUrl });\r\n return {\r\n client: _client,\r\n auth: new AuthModule(_client),\r\n db: new DatabaseModule(_client),\r\n storage: new StorageModule(_client),\r\n };\r\n }, [apiKey, baseUrl]);\r\n\r\n useEffect(() => {\r\n let mounted = true;\r\n\r\n const initAuth = async () => {\r\n try {\r\n // Hydrate from localStorage first as a fallback for environments without cookies\r\n if (typeof window !== 'undefined') {\r\n const savedToken = localStorage.getItem('ur_auth_token');\r\n if (savedToken) auth.setToken(savedToken);\r\n }\r\n\r\n // Check for social auth callback params\r\n const urlParams = new URLSearchParams(window.location.search);\r\n const hashParams = new URLSearchParams(window.location.hash.substring(1));\r\n const token = hashParams.get('token');\r\n const rtCode = urlParams.get('rtCode');\r\n const error = urlParams.get('error');\r\n\r\n if (error) {\r\n console.error('Social Auth Error:', error);\r\n if (mounted) setError(error);\r\n window.history.replaceState({}, document.title, window.location.pathname);\r\n } else if (token) {\r\n // Social auth succeeded, establish session immediately\r\n auth.setToken(token);\r\n if (typeof window !== 'undefined') localStorage.setItem('ur_auth_token', token);\r\n \r\n if (rtCode) {\r\n // Exchange for long-lived refresh token\r\n try {\r\n const exRes = await auth.socialExchange({ token, rtCode });\r\n const exToken = (exRes as any).accessToken || (exRes as any).token;\r\n if (exToken && typeof window !== 'undefined') localStorage.setItem('ur_auth_token', exToken);\r\n } catch (err: any) {\r\n console.error('Failed to exchange refresh token', err);\r\n if (mounted) setError(err.message || 'Failed to complete social login');\r\n throw err;\r\n }\r\n }\r\n window.history.replaceState({}, document.title, window.location.pathname);\r\n } else {\r\n // Attempt to silently refresh session using the HTTP-only cookie\r\n try {\r\n const res = await auth.refreshToken();\r\n const newToken = res.accessToken || (res as any).token;\r\n if (newToken && typeof window !== 'undefined') localStorage.setItem('ur_auth_token', newToken);\r\n } catch (e) {\r\n // If refresh fails, me() will catch it\r\n }\r\n }\r\n \r\n const currentUser = await auth.me();\r\n if (mounted) {\r\n setUser(currentUser);\r\n }\r\n } catch (error: any) {\r\n if (mounted) {\r\n setUser(null);\r\n // Don't set global error for initial me() check failure (usually just means not logged in)\r\n }\r\n } finally {\r\n if (mounted) {\r\n setIsInitializing(false);\r\n }\r\n }\r\n };\r\n\r\n initAuth();\r\n\r\n return () => {\r\n mounted = false;\r\n };\r\n }, [auth]);\r\n\r\n const value: UrContextValue = {\r\n client,\r\n auth,\r\n db,\r\n storage,\r\n user,\r\n setUser,\r\n isInitializing,\r\n isLoading,\r\n setIsLoading,\r\n error,\r\n setError,\r\n };\r\n\r\n return <UrContext.Provider value={value}>{children}</UrContext.Provider>;\r\n};\r\n\r\nexport const useUrContext = () => {\r\n const context = useContext(UrContext);\r\n if (!context) {\r\n throw new Error('useUrContext must be used within an UrProvider');\r\n }\r\n return context;\r\n};\r\n","import { useCallback } from 'react';\r\nimport { useUrContext } from './context';\r\nimport type { \r\n LoginPayload, \r\n SignUpPayload, \r\n ChangePasswordPayload,\r\n VerifyEmailPayload,\r\n RequestPasswordResetPayload,\r\n ResetPasswordPayload\r\n} from '@urbackend/sdk';\r\n\r\nexport const useAuth = () => {\r\n const { auth, user, setUser, isInitializing, isLoading, setIsLoading, error, setError } = useUrContext();\r\n\r\n if (!auth) {\r\n throw new Error('Auth module not initialized. Make sure you are inside UrProvider.');\r\n }\r\n\r\n const login = useCallback(async (payload: LoginPayload) => {\r\n try {\r\n setError(null);\r\n setIsLoading(true);\r\n const res = await auth.login(payload);\r\n const token = res.accessToken || (res as any).token;\r\n if (token && typeof window !== 'undefined') localStorage.setItem('ur_auth_token', token);\r\n const currentUser = await auth.me();\r\n setUser(currentUser);\r\n } catch (err: any) {\r\n setError(err.message || 'Login failed');\r\n throw err;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n }, [auth, setUser, setIsLoading, setError]);\r\n\r\n const signUp = useCallback(async (payload: SignUpPayload) => {\r\n try {\r\n setError(null);\r\n setIsLoading(true);\r\n const newUser = await auth.signUp(payload);\r\n return newUser;\r\n } catch (err: any) {\r\n setError(err.message || 'Sign up failed');\r\n throw err;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n }, [auth, setIsLoading, setError]);\r\n\r\n const logout = useCallback(async () => {\r\n try {\r\n setError(null);\r\n setIsLoading(true);\r\n await auth.logout();\r\n if (typeof window !== 'undefined') localStorage.removeItem('ur_auth_token');\r\n setUser(null);\r\n } catch (err: any) {\r\n setError(err.message || 'Logout failed');\r\n throw err;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n }, [auth, setUser, setIsLoading, setError]);\r\n\r\n const socialLogin = useCallback((provider: 'google' | 'github') => {\r\n setError(null);\r\n const url = auth.socialStart(provider);\r\n window.location.href = url;\r\n }, [auth, setError]);\r\n \r\n const verifyEmail = useCallback(async (payload: VerifyEmailPayload) => {\r\n try {\r\n setError(null);\r\n return await auth.verifyEmail(payload);\r\n } catch (err: any) {\r\n setError(err.message || 'Email verification failed');\r\n throw err;\r\n }\r\n }, [auth, setError]);\r\n\r\n const changePassword = useCallback(async (payload: ChangePasswordPayload) => {\r\n try {\r\n setError(null);\r\n return await auth.changePassword(payload);\r\n } catch (err: any) {\r\n setError(err.message || 'Failed to change password');\r\n throw err;\r\n }\r\n }, [auth, setError]);\r\n\r\n const requestPasswordReset = useCallback(async (payload: RequestPasswordResetPayload) => {\r\n try {\r\n setError(null);\r\n setIsLoading(true);\r\n return await auth.requestPasswordReset(payload);\r\n } catch (err: any) {\r\n setError(err.message || 'Failed to request password reset');\r\n throw err;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n }, [auth, setError, setIsLoading]);\r\n\r\n const resetPassword = useCallback(async (payload: ResetPasswordPayload) => {\r\n try {\r\n setError(null);\r\n setIsLoading(true);\r\n return await auth.resetPassword(payload);\r\n } catch (err: any) {\r\n setError(err.message || 'Failed to reset password');\r\n throw err;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n }, [auth, setError, setIsLoading]);\r\n\r\n const clearError = useCallback(() => setError(null), [setError]);\r\n\r\n return {\r\n user,\r\n isInitializing,\r\n isLoading,\r\n error,\r\n isAuthenticated: !!user,\r\n login,\r\n signUp,\r\n logout,\r\n socialLogin,\r\n verifyEmail,\r\n changePassword,\r\n requestPasswordReset,\r\n resetPassword,\r\n clearError,\r\n authApi: auth // Escape hatch to underlying SDK\r\n };\r\n};\r\n\r\nexport const useUser = () => {\r\n const { user, isInitializing, isLoading, error } = useUrContext();\r\n return {\r\n user,\r\n isInitializing,\r\n isLoading,\r\n error,\r\n isAuthenticated: !!user,\r\n };\r\n};\r\n\r\nexport const useDb = () => {\r\n const { db } = useUrContext();\r\n if (!db) {\r\n throw new Error('Database module not initialized.');\r\n }\r\n return db;\r\n};\r\n\r\nexport const useStorage = () => {\r\n const { storage } = useUrContext();\r\n if (!storage) {\r\n throw new Error('Storage module not initialized.');\r\n }\r\n return storage;\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { useUser } from './hooks';\r\n\r\nexport interface ProtectedRouteProps {\r\n children: React.ReactNode;\r\n redirectTo?: string;\r\n fallback?: React.ReactNode;\r\n onRedirect?: () => void;\r\n}\r\n\r\n/**\r\n * A wrapper component that requires the user to be authenticated.\r\n * If the user is not authenticated after initialization, they will be redirected,\r\n * or the fallback will be rendered (or nothing if fallback is not provided and no window redirect occurs).\r\n */\r\nexport const ProtectedRoute: React.FC<ProtectedRouteProps> = ({ \r\n children, \r\n redirectTo = '/login', \r\n fallback = null,\r\n onRedirect\r\n}) => {\r\n const { isAuthenticated, isInitializing } = useUser();\r\n\r\n useEffect(() => {\r\n if (!isInitializing && !isAuthenticated) {\r\n if (onRedirect) {\r\n onRedirect();\r\n } else if (typeof window !== 'undefined') {\r\n window.location.href = redirectTo;\r\n }\r\n }\r\n }, [isAuthenticated, isInitializing, redirectTo, onRedirect]);\r\n\r\n if (isInitializing) {\r\n return fallback;\r\n }\r\n\r\n if (!isAuthenticated) {\r\n return fallback;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n\r\nexport interface GuestRouteProps {\r\n children: React.ReactNode;\r\n redirectTo?: string;\r\n fallback?: React.ReactNode;\r\n onRedirect?: () => void;\r\n}\r\n\r\n/**\r\n * A wrapper component that requires the user to NOT be authenticated (e.g. for Login pages).\r\n * If the user IS authenticated, they will be redirected to the specified route.\r\n */\r\nexport const GuestRoute: React.FC<GuestRouteProps> = ({\r\n children,\r\n redirectTo = '/dashboard',\r\n fallback = null,\r\n onRedirect\r\n}) => {\r\n const { isAuthenticated, isInitializing } = useUser();\r\n\r\n useEffect(() => {\r\n if (!isInitializing && isAuthenticated) {\r\n if (onRedirect) {\r\n onRedirect();\r\n } else if (typeof window !== 'undefined') {\r\n window.location.href = redirectTo;\r\n }\r\n }\r\n }, [isAuthenticated, isInitializing, redirectTo, onRedirect]);\r\n\r\n if (isInitializing) {\r\n return fallback;\r\n }\r\n\r\n if (isAuthenticated) {\r\n return fallback;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n","import React, { useState, useEffect } from 'react';\r\nimport { useAuth } from '../hooks';\r\nimport { Toast } from './Toast';\r\n\r\nexport interface UrAuthProps {\r\n providers?: ('google' | 'github')[];\r\n theme?: 'light' | 'dark'; // Dark mode not perfectly matched to image, but kept for API compat\r\n onSuccess?: () => void;\r\n}\r\n\r\nexport const UrAuth: React.FC<UrAuthProps> = ({ \r\n providers = ['google', 'github'], \r\n theme = 'light',\r\n onSuccess\r\n}) => {\r\n const { login, signUp, socialLogin, requestPasswordReset, resetPassword, isLoading, error, clearError } = useAuth();\r\n const [mode, setMode] = useState<'signin' | 'signup' | 'forgot' | 'reset'>('signin');\r\n const [email, setEmail] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [otp, setOtp] = useState('');\r\n const [name, setName] = useState('');\r\n const [toast, setToast] = useState<{message: string, type: 'success' | 'error'} | null>(null);\r\n\r\n useEffect(() => {\r\n if (error) {\r\n setToast({ message: error, type: 'error' });\r\n }\r\n }, [error]);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n try {\r\n if (mode === 'signin') {\r\n await login({ email, password });\r\n setToast({ message: 'Welcome back!', type: 'success' });\r\n if (onSuccess) onSuccess();\r\n } else if (mode === 'signup') {\r\n await signUp({ email, password, name });\r\n // Auto-login after signup for convenience\r\n await login({ email, password });\r\n setToast({ message: 'Account created successfully!', type: 'success' });\r\n if (onSuccess) onSuccess();\r\n } else if (mode === 'forgot') {\r\n await requestPasswordReset({ email });\r\n setToast({ message: 'Reset code sent to your email', type: 'success' });\r\n setMode('reset');\r\n } else if (mode === 'reset') {\r\n await resetPassword({ email, otp, newPassword: password });\r\n setToast({ message: 'Password reset successfully', type: 'success' });\r\n setMode('signin');\r\n setPassword('');\r\n setOtp('');\r\n }\r\n } catch (err: any) {\r\n // Error is now handled and stored globally by useAuth hook, which triggers the useEffect toast\r\n }\r\n };\r\n\r\n const isDark = theme === 'dark';\r\n const bg = isDark ? '#1a1a1a' : '#ffffff';\r\n const text = isDark ? '#ffffff' : '#0f172a';\r\n const textMuted = isDark ? '#a1a1aa' : '#64748b';\r\n const border = isDark ? '#333' : '#e2e8f0';\r\n const inputBg = isDark ? '#2a2a2a' : '#ffffff';\r\n \r\n const styles = {\r\n wrapper: {\r\n width: '100%',\r\n maxWidth: '420px',\r\n margin: '0 auto',\r\n borderRadius: '0',\r\n background: bg,\r\n boxShadow: isDark ? '0 20px 40px rgba(0,0,0,0.5)' : '0 20px 40px rgba(0,0,0,0.06), 0 1px 3px rgba(0,0,0,0.05)',\r\n border: `1px solid ${border}`,\r\n overflow: 'hidden',\r\n fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n color: text,\r\n },\r\n body: {\r\n padding: '32px 32px 24px 32px',\r\n },\r\n switcherContainer: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n marginBottom: '32px'\r\n },\r\n switcher: {\r\n display: 'inline-flex',\r\n background: isDark ? '#2a2a2a' : '#f1f5f9',\r\n padding: '4px',\r\n borderRadius: '0',\r\n },\r\n switchBtn: (active: boolean) => ({\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '6px',\r\n padding: '8px 20px',\r\n borderRadius: '0',\r\n fontSize: '13px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n color: active ? text : textMuted,\r\n background: active ? (isDark ? '#444' : '#ffffff') : 'transparent',\r\n boxShadow: active ? (isDark ? '0 2px 4px rgba(0,0,0,0.2)' : '0 2px 8px rgba(0,0,0,0.05)') : 'none',\r\n border: 'none',\r\n transition: 'all 0.2s ease',\r\n }),\r\n field: {\r\n marginBottom: '20px',\r\n },\r\n labelRow: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n marginBottom: '8px',\r\n },\r\n label: {\r\n fontSize: '13px',\r\n fontWeight: 600,\r\n color: isDark ? '#ddd' : '#334155',\r\n },\r\n forgotLink: {\r\n fontSize: '12px',\r\n fontWeight: 600,\r\n color: text,\r\n cursor: 'pointer',\r\n textDecoration: 'none',\r\n background: 'none',\r\n border: 'none',\r\n padding: 0,\r\n },\r\n input: {\r\n width: '100%',\r\n padding: '12px 16px',\r\n borderRadius: '0',\r\n border: `1px solid ${border}`,\r\n background: inputBg,\r\n color: text,\r\n fontSize: '14px',\r\n boxSizing: 'border-box' as const,\r\n outline: 'none',\r\n transition: 'border-color 0.2s ease',\r\n },\r\n primaryBtn: {\r\n width: '100%',\r\n padding: '14px',\r\n borderRadius: '0',\r\n background: 'linear-gradient(180deg, #2a2a2a 0%, #111111 100%)',\r\n color: '#ffffff',\r\n fontSize: '15px',\r\n fontWeight: 600,\r\n border: 'none',\r\n boxShadow: '0 4px 12px rgba(0,0,0,0.15)',\r\n cursor: 'pointer',\r\n marginTop: '8px',\r\n transition: 'transform 0.1s ease',\r\n },\r\n divider: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n margin: '24px 0',\r\n color: '#94a3b8',\r\n fontSize: '11px',\r\n fontWeight: 600,\r\n letterSpacing: '1px',\r\n },\r\n dividerLine: {\r\n flex: 1,\r\n height: '1px',\r\n background: border,\r\n },\r\n dividerText: {\r\n padding: '0 12px',\r\n },\r\n socialBtn: {\r\n width: '100%',\r\n padding: '12px',\r\n borderRadius: '0',\r\n border: `1px solid ${border}`,\r\n background: isDark ? '#2a2a2a' : '#ffffff',\r\n color: text,\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '10px',\r\n marginBottom: '12px',\r\n cursor: 'pointer',\r\n boxShadow: isDark ? 'none' : '0 1px 2px rgba(0,0,0,0.02)',\r\n transition: 'background 0.2s ease',\r\n },\r\n footer: {\r\n background: isDark ? '#222' : '#f8fafc',\r\n padding: '24px',\r\n textAlign: 'center' as const,\r\n borderTop: `1px solid ${border}`,\r\n fontSize: '13px',\r\n color: textMuted,\r\n },\r\n footerLink: {\r\n color: text,\r\n fontWeight: 600,\r\n textDecoration: 'underline',\r\n cursor: 'pointer',\r\n marginLeft: '4px',\r\n background: 'none',\r\n border: 'none',\r\n padding: 0,\r\n }\r\n };\r\n\r\n const GoogleIcon = () => (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path 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\" fill=\"#4285F4\"/>\r\n <path 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\" fill=\"#34A853\"/>\r\n <path 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\" fill=\"#FBBC05\"/>\r\n <path 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\" fill=\"#EA4335\"/>\r\n </svg>\r\n );\r\n\r\n const GithubIcon = () => (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill={isDark ? '#fff' : '#000'}>\r\n <path d=\"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z\"/>\r\n </svg>\r\n );\r\n\r\n return (\r\n <div style={styles.wrapper}>\r\n {toast && (\r\n <Toast \r\n message={toast.message} \r\n type={toast.type} \r\n isDark={isDark} \r\n onClose={() => {\r\n setToast(null);\r\n if (toast.type === 'error') clearError();\r\n }} \r\n />\r\n )}\r\n \r\n <div style={styles.body}>\r\n {(mode === 'signin' || mode === 'signup') && (\r\n <div style={styles.switcherContainer}>\r\n <div style={styles.switcher}>\r\n <button \r\n type=\"button\"\r\n style={styles.switchBtn(mode === 'signin')} \r\n onClick={() => { setMode('signin'); clearError(); }}\r\n >\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4\"/><polyline points=\"10 17 15 12 10 7\"/><line x1=\"15\" y1=\"12\" x2=\"3\" y2=\"12\"/></svg>\r\n Login\r\n </button>\r\n <button \r\n type=\"button\"\r\n style={styles.switchBtn(mode === 'signup')} \r\n onClick={() => { setMode('signup'); clearError(); }}\r\n >\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"/><circle cx=\"9\" cy=\"7\" r=\"4\"/><line x1=\"19\" y1=\"8\" x2=\"19\" y2=\"14\"/><line x1=\"22\" y1=\"11\" x2=\"16\" y2=\"11\"/></svg>\r\n Sign Up\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {(mode === 'forgot' || mode === 'reset') && (\r\n <div style={{ marginBottom: '24px', textAlign: 'center' }}>\r\n <h2 style={{ margin: '0 0 8px', fontSize: '20px', fontWeight: 700, color: text }}>\r\n {mode === 'forgot' ? 'Reset Password' : 'Enter Reset Code'}\r\n </h2>\r\n <p style={{ margin: 0, fontSize: '14px', color: textMuted }}>\r\n {mode === 'forgot' ? \"Enter your email and we'll send a code\" : `Enter the code sent to ${email}`}\r\n </p>\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleSubmit}>\r\n {mode === 'signup' && (\r\n <div style={styles.field}>\r\n <div style={styles.labelRow}>\r\n <label style={styles.label}>Full Name</label>\r\n </div>\r\n <input\r\n style={styles.input}\r\n type=\"text\"\r\n placeholder=\"Enter your name\"\r\n value={name}\r\n onChange={e => setName(e.target.value)}\r\n required\r\n />\r\n </div>\r\n )}\r\n \r\n <div style={styles.field}>\r\n <div style={styles.labelRow}>\r\n <label style={styles.label}>Email address</label>\r\n </div>\r\n <input\r\n style={styles.input}\r\n type=\"email\"\r\n placeholder=\"Enter your email address\"\r\n value={email}\r\n onChange={e => setEmail(e.target.value)}\r\n required\r\n readOnly={mode === 'reset'}\r\n />\r\n </div>\r\n\r\n {mode === 'reset' && (\r\n <div style={styles.field}>\r\n <div style={styles.labelRow}>\r\n <label style={styles.label}>6-digit OTP Code</label>\r\n </div>\r\n <input\r\n style={styles.input}\r\n type=\"text\"\r\n placeholder=\"Enter reset code\"\r\n value={otp}\r\n onChange={e => setOtp(e.target.value)}\r\n required\r\n />\r\n </div>\r\n )}\r\n\r\n {(mode === 'signin' || mode === 'signup' || mode === 'reset') && (\r\n <div style={styles.field}>\r\n <div style={styles.labelRow}>\r\n <label style={styles.label}>{mode === 'reset' ? 'New Password' : 'Password'}</label>\r\n {mode === 'signin' && (\r\n <button type=\"button\" style={styles.forgotLink} onClick={() => { setMode('forgot'); clearError(); }}>\r\n Forgot password?\r\n </button>\r\n )}\r\n </div>\r\n <input\r\n style={styles.input}\r\n type=\"password\"\r\n placeholder={mode === 'reset' ? \"Enter new password\" : \"Enter your password\"}\r\n value={password}\r\n onChange={e => setPassword(e.target.value)}\r\n required\r\n />\r\n </div>\r\n )}\r\n\r\n <button style={styles.primaryBtn} type=\"submit\" disabled={isLoading} \r\n onMouseDown={e => e.currentTarget.style.transform = 'scale(0.98)'}\r\n onMouseUp={e => e.currentTarget.style.transform = 'scale(1)'}\r\n onMouseLeave={e => e.currentTarget.style.transform = 'scale(1)'}\r\n >\r\n {isLoading \r\n ? 'Processing...' \r\n : (mode === 'signin' ? 'Log In' \r\n : mode === 'signup' ? 'Create Account' \r\n : mode === 'forgot' ? 'Send Reset Code' \r\n : 'Reset Password')\r\n }\r\n </button>\r\n </form>\r\n\r\n {(mode === 'signin' || mode === 'signup') && providers && providers.length > 0 && (\r\n <>\r\n <div style={styles.divider}>\r\n <div style={styles.dividerLine} />\r\n <span style={styles.dividerText}>OR</span>\r\n <div style={styles.dividerLine} />\r\n </div>\r\n\r\n <div>\r\n {providers.includes('google') && (\r\n <button style={styles.socialBtn} onClick={() => socialLogin('google')} type=\"button\">\r\n <GoogleIcon />\r\n Continue with Google\r\n </button>\r\n )}\r\n {providers.includes('github') && (\r\n <button style={styles.socialBtn} onClick={() => socialLogin('github')} type=\"button\">\r\n <GithubIcon />\r\n Continue with GitHub\r\n </button>\r\n )}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n\r\n <div style={styles.footer}>\r\n {mode === 'signin' ? \"Don't have an account yet?\" \r\n : mode === 'signup' ? \"Already have an account?\"\r\n : \"Remember your password?\"}\r\n <button \r\n type=\"button\"\r\n style={styles.footerLink}\r\n onClick={() => {\r\n setMode(mode === 'signin' ? 'signup' : 'signin');\r\n clearError();\r\n }}\r\n >\r\n {mode === 'signin' ? 'Sign up' : 'Log in'}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\n\r\ninterface ToastProps {\r\n message: string;\r\n type: 'success' | 'error';\r\n onClose: () => void;\r\n isDark?: boolean;\r\n}\r\n\r\nexport const Toast: React.FC<ToastProps> = ({ message, type, onClose, isDark = false }) => {\r\n const [isVisible, setIsVisible] = useState(false);\r\n const [isLeaving, setIsLeaving] = useState(false);\r\n\r\n useEffect(() => {\r\n // Trigger enter animation on mount\r\n requestAnimationFrame(() => {\r\n setIsVisible(true);\r\n });\r\n\r\n let innerTimer: ReturnType<typeof setTimeout>;\r\n const timer = setTimeout(() => {\r\n setIsLeaving(true);\r\n innerTimer = setTimeout(onClose, 300); // Wait for exit animation\r\n }, 4000);\r\n\r\n return () => {\r\n clearTimeout(timer);\r\n if (innerTimer) clearTimeout(innerTimer);\r\n };\r\n }, [onClose]);\r\n\r\n const bgColor = isDark ? 'rgba(30, 30, 30, 0.9)' : 'rgba(255, 255, 255, 0.9)';\r\n const borderColor = type === 'success' ? 'rgba(34, 197, 94, 0.5)' : 'rgba(239, 68, 68, 0.5)';\r\n const iconColor = type === 'success' ? '#22c55e' : '#ef4444';\r\n const textColor = isDark ? '#fff' : '#000';\r\n\r\n return (\r\n <>\r\n <style>\r\n {`\r\n @keyframes slideIn {\r\n from { transform: translate(-50%, -20px) scale(0.95); opacity: 0; }\r\n to { transform: translate(-50%, 0) scale(1); opacity: 1; }\r\n }\r\n @keyframes slideOut {\r\n from { transform: translate(-50%, 0) scale(1); opacity: 1; }\r\n to { transform: translate(-50%, -20px) scale(0.95); opacity: 0; }\r\n }\r\n `}\r\n </style>\r\n <div\r\n style={{\r\n position: 'fixed',\r\n top: '24px',\r\n left: '50%',\r\n transform: 'translateX(-50%)',\r\n zIndex: 9999,\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '12px',\r\n padding: '12px 20px',\r\n borderRadius: '0',\r\n background: bgColor,\r\n backdropFilter: 'blur(16px)',\r\n WebkitBackdropFilter: 'blur(16px)',\r\n border: `1px solid ${borderColor}`,\r\n boxShadow: '0 8px 32px rgba(0,0,0,0.12)',\r\n color: textColor,\r\n fontFamily: 'system-ui, -apple-system, sans-serif',\r\n fontSize: '14px',\r\n fontWeight: 500,\r\n animation: isLeaving ? 'slideOut 0.3s cubic-bezier(0.4, 0, 0.2, 1) forwards' : 'slideIn 0.4s cubic-bezier(0.16, 1, 0.3, 1) forwards',\r\n }}\r\n >\r\n {type === 'success' ? (\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={iconColor} strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"></path>\r\n <polyline points=\"22 4 12 14.01 9 11.01\"></polyline>\r\n </svg>\r\n ) : (\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={iconColor} strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\r\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line>\r\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line>\r\n </svg>\r\n )}\r\n {message}\r\n </div>\r\n </>\r\n );\r\n};\r\n","import React, { useState, useRef, useEffect } from 'react';\nimport { useUser, useAuth } from '../hooks';\n\nexport interface UrUserButtonProps {\n /**\n * Shape of the profile avatar. Defaults to 'square' as requested.\n */\n shape?: 'square' | 'circle';\n /**\n * Position of the button on the screen. Defaults to 'top-right'.\n * Use 'inline' if you want to place it within a normal flex/grid layout instead of absolute positioning.\n */\n position?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'inline';\n /**\n * Called when \"Profile\" is clicked.\n */\n onProfileClick?: () => void;\n /**\n * Called when \"Settings\" is clicked.\n */\n onSettingsClick?: () => void;\n /**\n * Z-index for the fixed container. Defaults to 999.\n */\n zIndex?: number;\n}\n\nexport const UrUserButton: React.FC<UrUserButtonProps> = ({\n shape = 'square',\n position = 'top-right',\n onProfileClick,\n onSettingsClick,\n zIndex = 999,\n}) => {\n const { user } = useUser();\n const { logout } = useAuth();\n const [isOpen, setIsOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n if (!user) return null; // Only render if logged in\n\n const borderRadius = shape === 'circle' ? '50%' : '0px';\n const isFixed = position !== 'inline';\n\n const positionStyles: React.CSSProperties = isFixed\n ? {\n position: 'fixed',\n zIndex,\n top: position.includes('top') ? '24px' : 'auto',\n bottom: position.includes('bottom') ? '24px' : 'auto',\n right: position.includes('right') ? '24px' : 'auto',\n left: position.includes('left') ? '24px' : 'auto',\n }\n : { position: 'relative' };\n\n const dropdownStyles: React.CSSProperties = {\n position: 'absolute',\n top: position.includes('top') || position === 'inline' ? 'calc(100% + 8px)' : 'auto',\n bottom: position.includes('bottom') ? 'calc(100% + 8px)' : 'auto',\n right: position.includes('right') || position === 'inline' ? '0' : 'auto',\n left: position.includes('left') ? '0' : 'auto',\n background: '#ffffff',\n border: '1px solid #e2e8f0',\n borderRadius: '0px',\n boxShadow: '0 10px 25px rgba(0,0,0,0.1)',\n width: '220px',\n display: isOpen ? 'block' : 'none',\n overflow: 'hidden',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n };\n\n const getInitials = () => {\n return user.name?.[0]?.toUpperCase() || user.email?.[0]?.toUpperCase() || 'U';\n };\n\n return (\n <div ref={containerRef} style={positionStyles}>\n <button\n onClick={() => setIsOpen(!isOpen)}\n style={{\n width: '40px',\n height: '40px',\n padding: 0,\n border: '1px solid #e2e8f0',\n background: '#f8fafc',\n borderRadius,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n boxShadow: '0 2px 5px rgba(0,0,0,0.05)',\n transition: 'transform 0.1s ease',\n }}\n >\n {user.avatarUrl ? (\n <img src={user.avatarUrl as string} alt=\"User\" style={{ width: '100%', height: '100%', objectFit: 'cover' }} />\n ) : (\n <span style={{ fontSize: '16px', fontWeight: 600, color: '#475569' }}>\n {getInitials()}\n </span>\n )}\n </button>\n\n <div style={dropdownStyles}>\n {/* User Info Header */}\n <div style={{ padding: '16px', borderBottom: '1px solid #e2e8f0', background: '#f8fafc' }}>\n <div style={{ fontSize: '14px', fontWeight: 600, color: '#0f172a', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>\n {user.name || 'User'}\n </div>\n <div style={{ fontSize: '12px', color: '#64748b', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', marginTop: '2px' }}>\n {user.email}\n </div>\n </div>\n\n {/* Action List */}\n <div style={{ padding: '8px' }}>\n {onProfileClick && (\n <button\n onClick={() => {\n setIsOpen(false);\n onProfileClick();\n }}\n style={{\n width: '100%',\n textAlign: 'left',\n padding: '10px 12px',\n background: 'transparent',\n border: 'none',\n fontSize: '14px',\n color: '#334155',\n cursor: 'pointer',\n borderRadius: '0px',\n display: 'block',\n }}\n onMouseEnter={(e) => (e.currentTarget.style.background = '#f1f5f9')}\n onMouseLeave={(e) => (e.currentTarget.style.background = 'transparent')}\n >\n Profile\n </button>\n )}\n\n {onSettingsClick && (\n <button\n onClick={() => {\n setIsOpen(false);\n onSettingsClick();\n }}\n style={{\n width: '100%',\n textAlign: 'left',\n padding: '10px 12px',\n background: 'transparent',\n border: 'none',\n fontSize: '14px',\n color: '#334155',\n cursor: 'pointer',\n borderRadius: '0px',\n display: 'block',\n }}\n onMouseEnter={(e) => (e.currentTarget.style.background = '#f1f5f9')}\n onMouseLeave={(e) => (e.currentTarget.style.background = 'transparent')}\n >\n Settings\n </button>\n )}\n\n <div style={{ height: '1px', background: '#e2e8f0', margin: '4px 0' }} />\n\n <button\n onClick={() => {\n setIsOpen(false);\n logout();\n }}\n style={{\n width: '100%',\n textAlign: 'left',\n padding: '10px 12px',\n background: 'transparent',\n border: 'none',\n fontSize: '14px',\n color: '#ef4444',\n fontWeight: 500,\n cursor: 'pointer',\n borderRadius: '0px',\n display: 'block',\n }}\n onMouseEnter={(e) => (e.currentTarget.style.background = '#fef2f2')}\n onMouseLeave={(e) => (e.currentTarget.style.background = 'transparent')}\n >\n Logout\n </button>\n </div>\n </div>\n </div>\n );\n};\n"],"mappings":"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","names":["error","import_react","import_react","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/context.tsx","../src/hooks.ts","../src/components.tsx","../src/components/UrAuth.tsx","../src/components/Toast.tsx","../src/components/UrUserButton.tsx"],"sourcesContent":["export { UrProvider, useUrContext } from './context';\nexport type { UrProviderProps } from './context';\n\nexport { useAuth, useUser, useDb, useStorage } from './hooks';\nexport { ProtectedRoute, GuestRoute } from './components';\nexport type { ProtectedRouteProps, GuestRouteProps } from './components';\n\nexport { UrAuth } from './components/UrAuth';\nexport type { UrAuthProps } from './components/UrAuth';\n\nexport * from './components/UrUserButton';\n\nexport * from '@urbackend/sdk'; // re-export types so users don't need to import from sdk directly","import React, { createContext, useContext, useEffect, useState, useMemo } from 'react';\r\nimport { UrBackendClient, AuthModule, DatabaseModule, StorageModule } from '@urbackend/sdk';\r\nimport type { AuthUser } from '@urbackend/sdk';\r\n\r\ninterface UrContextValue {\r\n client: UrBackendClient | null;\r\n auth: AuthModule | null;\r\n db: DatabaseModule | null;\r\n storage: StorageModule | null;\r\n user: AuthUser | null;\r\n setUser: React.Dispatch<React.SetStateAction<AuthUser | null>>;\r\n isInitializing: boolean;\r\n isLoading: boolean;\r\n setIsLoading: React.Dispatch<React.SetStateAction<boolean>>;\r\n error: string | null;\r\n setError: React.Dispatch<React.SetStateAction<string | null>>;\r\n}\r\n\r\nconst UrContext = createContext<UrContextValue | undefined>(undefined);\r\n\r\nexport interface UrProviderProps {\r\n apiKey: string;\r\n baseUrl?: string;\r\n children: React.ReactNode;\r\n}\r\n\r\nexport const UrProvider: React.FC<UrProviderProps> = ({ apiKey, baseUrl, children }) => {\r\n const [user, setUser] = useState<AuthUser | null>(null);\r\n const [isInitializing, setIsInitializing] = useState(true);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const { client, auth, db, storage } = useMemo(() => {\r\n const _client = new UrBackendClient({ apiKey, baseUrl });\r\n return {\r\n client: _client,\r\n auth: new AuthModule(_client),\r\n db: new DatabaseModule(_client),\r\n storage: new StorageModule(_client),\r\n };\r\n }, [apiKey, baseUrl]);\r\n\r\n useEffect(() => {\r\n let mounted = true;\r\n\r\n const initAuth = async () => {\r\n try {\r\n // Hydrate from localStorage first as a fallback for environments without cookies\r\n if (typeof window !== 'undefined') {\r\n const savedToken = localStorage.getItem('ur_auth_token');\r\n if (savedToken) auth.setToken(savedToken);\r\n }\r\n\r\n // Check for social auth callback params\r\n const urlParams = new URLSearchParams(window.location.search);\r\n const hashParams = new URLSearchParams(window.location.hash.substring(1));\r\n const token = hashParams.get('token');\r\n const rtCode = urlParams.get('rtCode');\r\n const error = urlParams.get('error');\r\n\r\n if (error) {\r\n console.error('Social Auth Error:', error);\r\n if (mounted) setError(error);\r\n window.history.replaceState({}, document.title, window.location.pathname);\r\n } else if (token) {\r\n // Social auth succeeded, establish session immediately\r\n auth.setToken(token);\r\n if (typeof window !== 'undefined') localStorage.setItem('ur_auth_token', token);\r\n \r\n if (rtCode) {\r\n // Exchange for long-lived refresh token\r\n try {\r\n const exRes = await auth.socialExchange({ token, rtCode });\r\n const exToken = (exRes as any).accessToken || (exRes as any).token;\r\n if (exToken && typeof window !== 'undefined') localStorage.setItem('ur_auth_token', exToken);\r\n } catch (err: any) {\r\n console.error('Failed to exchange refresh token', err);\r\n if (mounted) setError(err.message || 'Failed to complete social login');\r\n throw err;\r\n }\r\n }\r\n window.history.replaceState({}, document.title, window.location.pathname);\r\n } else {\r\n // Attempt to silently refresh session using the HTTP-only cookie\r\n try {\r\n const res = await auth.refreshToken();\r\n const newToken = res.accessToken || (res as any).token;\r\n if (newToken && typeof window !== 'undefined') localStorage.setItem('ur_auth_token', newToken);\r\n } catch (e) {\r\n // If refresh fails, me() will catch it\r\n }\r\n }\r\n \r\n const currentUser = await auth.me();\r\n if (mounted) {\r\n setUser(currentUser);\r\n }\r\n } catch (error: any) {\r\n if (mounted) {\r\n setUser(null);\r\n // Don't set global error for initial me() check failure (usually just means not logged in)\r\n }\r\n } finally {\r\n if (mounted) {\r\n setIsInitializing(false);\r\n }\r\n }\r\n };\r\n\r\n initAuth();\r\n\r\n return () => {\r\n mounted = false;\r\n };\r\n }, [auth]);\r\n\r\n const value: UrContextValue = {\r\n client,\r\n auth,\r\n db,\r\n storage,\r\n user,\r\n setUser,\r\n isInitializing,\r\n isLoading,\r\n setIsLoading,\r\n error,\r\n setError,\r\n };\r\n\r\n return <UrContext.Provider value={value}>{children}</UrContext.Provider>;\r\n};\r\n\r\nexport const useUrContext = () => {\r\n const context = useContext(UrContext);\r\n if (!context) {\r\n throw new Error('useUrContext must be used within an UrProvider');\r\n }\r\n return context;\r\n};\r\n","import { useCallback } from 'react';\r\nimport { useUrContext } from './context';\r\nimport type { \r\n LoginPayload, \r\n SignUpPayload, \r\n ChangePasswordPayload,\r\n VerifyEmailPayload,\r\n RequestPasswordResetPayload,\r\n ResetPasswordPayload\r\n} from '@urbackend/sdk';\r\n\r\nexport const useAuth = () => {\r\n const { auth, user, setUser, isInitializing, isLoading, setIsLoading, error, setError } = useUrContext();\r\n\r\n if (!auth) {\r\n throw new Error('Auth module not initialized. Make sure you are inside UrProvider.');\r\n }\r\n\r\n const login = useCallback(async (payload: LoginPayload) => {\r\n try {\r\n setError(null);\r\n setIsLoading(true);\r\n const res = await auth.login(payload);\r\n const token = res.accessToken || (res as any).token;\r\n if (token && typeof window !== 'undefined') localStorage.setItem('ur_auth_token', token);\r\n const currentUser = await auth.me();\r\n setUser(currentUser);\r\n } catch (err: any) {\r\n setError(err.message || 'Login failed');\r\n throw err;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n }, [auth, setUser, setIsLoading, setError]);\r\n\r\n const signUp = useCallback(async (payload: SignUpPayload) => {\r\n try {\r\n setError(null);\r\n setIsLoading(true);\r\n const newUser = await auth.signUp(payload);\r\n return newUser;\r\n } catch (err: any) {\r\n setError(err.message || 'Sign up failed');\r\n throw err;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n }, [auth, setIsLoading, setError]);\r\n\r\n const logout = useCallback(async () => {\r\n try {\r\n setError(null);\r\n setIsLoading(true);\r\n await auth.logout();\r\n if (typeof window !== 'undefined') localStorage.removeItem('ur_auth_token');\r\n setUser(null);\r\n } catch (err: any) {\r\n setError(err.message || 'Logout failed');\r\n throw err;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n }, [auth, setUser, setIsLoading, setError]);\r\n\r\n const socialLogin = useCallback((provider: 'google' | 'github') => {\r\n setError(null);\r\n const url = auth.socialStart(provider);\r\n window.location.href = url;\r\n }, [auth, setError]);\r\n \r\n const verifyEmail = useCallback(async (payload: VerifyEmailPayload) => {\r\n try {\r\n setError(null);\r\n return await auth.verifyEmail(payload);\r\n } catch (err: any) {\r\n setError(err.message || 'Email verification failed');\r\n throw err;\r\n }\r\n }, [auth, setError]);\r\n\r\n const changePassword = useCallback(async (payload: ChangePasswordPayload) => {\r\n try {\r\n setError(null);\r\n return await auth.changePassword(payload);\r\n } catch (err: any) {\r\n setError(err.message || 'Failed to change password');\r\n throw err;\r\n }\r\n }, [auth, setError]);\r\n\r\n const requestPasswordReset = useCallback(async (payload: RequestPasswordResetPayload) => {\r\n try {\r\n setError(null);\r\n setIsLoading(true);\r\n return await auth.requestPasswordReset(payload);\r\n } catch (err: any) {\r\n setError(err.message || 'Failed to request password reset');\r\n throw err;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n }, [auth, setError, setIsLoading]);\r\n\r\n const resetPassword = useCallback(async (payload: ResetPasswordPayload) => {\r\n try {\r\n setError(null);\r\n setIsLoading(true);\r\n return await auth.resetPassword(payload);\r\n } catch (err: any) {\r\n setError(err.message || 'Failed to reset password');\r\n throw err;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n }, [auth, setError, setIsLoading]);\r\n\r\n const clearError = useCallback(() => setError(null), [setError]);\r\n\r\n return {\r\n user,\r\n isInitializing,\r\n isLoading,\r\n error,\r\n isAuthenticated: !!user,\r\n login,\r\n signUp,\r\n logout,\r\n socialLogin,\r\n verifyEmail,\r\n changePassword,\r\n requestPasswordReset,\r\n resetPassword,\r\n clearError,\r\n authApi: auth // Escape hatch to underlying SDK\r\n };\r\n};\r\n\r\nexport const useUser = () => {\r\n const { user, isInitializing, isLoading, error } = useUrContext();\r\n return {\r\n user,\r\n isInitializing,\r\n isLoading,\r\n error,\r\n isAuthenticated: !!user,\r\n };\r\n};\r\n\r\nexport const useDb = () => {\r\n const { db } = useUrContext();\r\n if (!db) {\r\n throw new Error('Database module not initialized.');\r\n }\r\n return db;\r\n};\r\n\r\nexport const useStorage = () => {\r\n const { storage } = useUrContext();\r\n if (!storage) {\r\n throw new Error('Storage module not initialized.');\r\n }\r\n return storage;\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { useUser } from './hooks';\r\n\r\nexport interface ProtectedRouteProps {\r\n children: React.ReactNode;\r\n redirectTo?: string;\r\n fallback?: React.ReactNode;\r\n onRedirect?: () => void;\r\n}\r\n\r\n/**\r\n * A wrapper component that requires the user to be authenticated.\r\n * If the user is not authenticated after initialization, they will be redirected,\r\n * or the fallback will be rendered (or nothing if fallback is not provided and no window redirect occurs).\r\n */\r\nexport const ProtectedRoute: React.FC<ProtectedRouteProps> = ({ \r\n children, \r\n redirectTo = '/login', \r\n fallback = null,\r\n onRedirect\r\n}) => {\r\n const { isAuthenticated, isInitializing } = useUser();\r\n\r\n useEffect(() => {\r\n if (!isInitializing && !isAuthenticated) {\r\n if (onRedirect) {\r\n onRedirect();\r\n } else if (typeof window !== 'undefined') {\r\n window.location.href = redirectTo;\r\n }\r\n }\r\n }, [isAuthenticated, isInitializing, redirectTo, onRedirect]);\r\n\r\n if (isInitializing) {\r\n return fallback;\r\n }\r\n\r\n if (!isAuthenticated) {\r\n return fallback;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n\r\nexport interface GuestRouteProps {\r\n children: React.ReactNode;\r\n redirectTo?: string;\r\n fallback?: React.ReactNode;\r\n onRedirect?: () => void;\r\n}\r\n\r\n/**\r\n * A wrapper component that requires the user to NOT be authenticated (e.g. for Login pages).\r\n * If the user IS authenticated, they will be redirected to the specified route.\r\n */\r\nexport const GuestRoute: React.FC<GuestRouteProps> = ({\r\n children,\r\n redirectTo = '/dashboard',\r\n fallback = null,\r\n onRedirect\r\n}) => {\r\n const { isAuthenticated, isInitializing } = useUser();\r\n\r\n useEffect(() => {\r\n if (!isInitializing && isAuthenticated) {\r\n if (onRedirect) {\r\n onRedirect();\r\n } else if (typeof window !== 'undefined') {\r\n window.location.href = redirectTo;\r\n }\r\n }\r\n }, [isAuthenticated, isInitializing, redirectTo, onRedirect]);\r\n\r\n if (isInitializing) {\r\n return fallback;\r\n }\r\n\r\n if (isAuthenticated) {\r\n return fallback;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport { useAuth } from '../hooks';\r\nimport { Toast } from './Toast';\r\n\r\ntype AuthProvider = 'google' | 'github';\r\ntype ThemeMode = 'light' | 'dark';\r\n\r\ninterface AuthColors {\r\n background: string;\r\n surface: string;\r\n text: string;\r\n textMuted: string;\r\n border: string;\r\n inputBackground: string;\r\n primary: string;\r\n primaryText: string;\r\n footerBackground: string;\r\n dividerText: string;\r\n socialButtonBackground: string;\r\n}\r\n\r\ninterface AuthBranding {\r\n brandName?: string;\r\n appName?: string;\r\n title?: string;\r\n subtitle?: string;\r\n logo?: React.ReactNode | string;\r\n primaryColor?: string;\r\n}\r\n\r\ninterface AuthLabels {\r\n loginTab: string;\r\n signupTab: string;\r\n loginTitle: string;\r\n signupTitle: string;\r\n forgotTitle: string;\r\n resetTitle: string;\r\n loginButton: string;\r\n signupButton: string;\r\n forgotButton: string;\r\n resetButton: string;\r\n emailLabel: string;\r\n emailPlaceholder: string;\r\n passwordLabel: string;\r\n passwordPlaceholder: string;\r\n nameLabel: string;\r\n namePlaceholder: string;\r\n otpLabel: string;\r\n otpPlaceholder: string;\r\n forgotPasswordLink: string;\r\n socialDivider: string;\r\n googleButton: string;\r\n githubButton: string;\r\n footerSigninPrompt: string;\r\n footerSignupPrompt: string;\r\n footerForgotPrompt: string;\r\n noAuthMethods: string;\r\n forgotSubtitle: string;\r\n resetSubtitle: string;\r\n // Aliases support\r\n signInTitle?: string;\r\n signUpTitle?: string;\r\n signInTab?: string;\r\n signUpTab?: string;\r\n signInButton?: string;\r\n signUpButton?: string;\r\n}\r\n\r\nexport interface UrAuthProps {\r\n providers?: AuthProvider[] | {\r\n google?: boolean;\r\n github?: boolean;\r\n emailPassword?: boolean;\r\n };\r\n enableEmailPassword?: boolean;\r\n theme?: ThemeMode;\r\n colors?: Partial<AuthColors>;\r\n branding?: AuthBranding;\r\n labels?: Partial<AuthLabels>;\r\n onSuccess?: () => void;\r\n}\r\n\r\nconst defaultLabels: AuthLabels = {\r\n loginTab: 'Login',\r\n signupTab: 'Sign Up',\r\n loginTitle: 'Welcome back',\r\n signupTitle: 'Create your account',\r\n forgotTitle: 'Reset Password',\r\n resetTitle: 'Enter Reset Code',\r\n loginButton: 'Log In',\r\n signupButton: 'Create Account',\r\n forgotButton: 'Send Reset Code',\r\n resetButton: 'Reset Password',\r\n emailLabel: 'Email address',\r\n emailPlaceholder: 'Enter your email address',\r\n passwordLabel: 'Password',\r\n passwordPlaceholder: 'Enter your password',\r\n nameLabel: 'Full Name',\r\n namePlaceholder: 'Enter your name',\r\n otpLabel: '6-digit OTP Code',\r\n otpPlaceholder: 'Enter reset code',\r\n forgotPasswordLink: 'Forgot password?',\r\n socialDivider: 'OR',\r\n googleButton: 'Continue with Google',\r\n githubButton: 'Continue with GitHub',\r\n footerSigninPrompt: \"Don't have an account yet?\",\r\n footerSignupPrompt: 'Already have an account?',\r\n footerForgotPrompt: 'Remember your password?',\r\n noAuthMethods: 'No authentication methods are enabled for this screen.',\r\n forgotSubtitle: 'Welcome back',\r\n resetSubtitle: 'Enter the code sent to {email}',\r\n};\r\n\r\nconst defaultThemeColors: Record<ThemeMode, AuthColors> = {\r\n light: {\r\n background: '#ffffff',\r\n surface: '#ffffff',\r\n text: '#0f172a',\r\n textMuted: '#64748b',\r\n border: '#e2e8f0',\r\n inputBackground: '#ffffff',\r\n primary: '#111111',\r\n primaryText: '#ffffff',\r\n footerBackground: '#f8fafc',\r\n dividerText: '#94a3b8',\r\n socialButtonBackground: '#ffffff',\r\n },\r\n dark: {\r\n background: '#1a1a1a',\r\n surface: '#1a1a1a',\r\n text: '#ffffff',\r\n textMuted: '#a1a1aa',\r\n border: '#333333',\r\n inputBackground: '#2a2a2a',\r\n primary: '#ffffff',\r\n primaryText: '#111111',\r\n footerBackground: '#222222',\r\n dividerText: '#94a3b8',\r\n socialButtonBackground: '#2a2a2a',\r\n },\r\n};\r\n\r\n// Helper to adjust brightness of hex colors for professional gradient stops\r\nconst adjustColor = (color: string, percent: number) => {\r\n try {\r\n if (color.startsWith('#')) {\r\n let hex = color.replace('#', '');\r\n if (hex.length === 3) {\r\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\r\n }\r\n let r = parseInt(hex.substring(0, 2), 16);\r\n let g = parseInt(hex.substring(2, 4), 16);\r\n let b = parseInt(hex.substring(4, 6), 16);\r\n\r\n r = Math.min(255, Math.max(0, r + percent));\r\n g = Math.min(255, Math.max(0, g + percent));\r\n b = Math.min(255, Math.max(0, b + percent));\r\n\r\n const rr = r.toString(16).padStart(2, '0');\r\n const gg = g.toString(16).padStart(2, '0');\r\n const bb = b.toString(16).padStart(2, '0');\r\n\r\n return `#${rr}${gg}${bb}`;\r\n }\r\n } catch (e) {\r\n // Safe fallback to original color\r\n }\r\n return color;\r\n};\r\n\r\n\r\n\r\n\r\nexport const UrAuth: React.FC<UrAuthProps> = ({ \r\n providers = ['google', 'github'], \r\n enableEmailPassword = true,\r\n theme = 'light',\r\n colors,\r\n branding,\r\n labels,\r\n onSuccess\r\n}) => {\r\n const { login, signUp, socialLogin, requestPasswordReset, resetPassword, isLoading, error, clearError } = useAuth();\r\n const [mode, setMode] = useState<'signin' | 'signup' | 'forgot' | 'reset'>('signin');\r\n const [email, setEmail] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [otp, setOtp] = useState('');\r\n const [name, setName] = useState('');\r\n const [toast, setToast] = useState<{message: string, type: 'success' | 'error'} | null>(null);\r\n\r\n const text = {\r\n ...defaultLabels,\r\n ...labels,\r\n loginTab: labels?.signInTab ?? labels?.loginTab ?? defaultLabels.loginTab,\r\n loginTitle: labels?.signInTitle ?? labels?.loginTitle ?? defaultLabels.loginTitle,\r\n loginButton: labels?.signInButton ?? labels?.loginButton ?? defaultLabels.loginButton,\r\n signupTab: labels?.signUpTab ?? labels?.signupTab ?? defaultLabels.signupTab,\r\n signupTitle: labels?.signUpTitle ?? labels?.signupTitle ?? defaultLabels.signupTitle,\r\n signupButton: labels?.signUpButton ?? labels?.signupButton ?? defaultLabels.signupButton,\r\n};\r\n\r\n const themeColors = { ...defaultThemeColors[theme], ...colors };\r\n const primaryColor = branding?.primaryColor || themeColors.primary;\r\n const secondStopColor = adjustColor(primaryColor, -15);\r\n\r\n let isGoogleEnabled = true;\r\n let isGithubEnabled = true;\r\n let isEmailPasswordEnabled = enableEmailPassword;\r\n\r\n if (providers) {\r\n if (Array.isArray(providers)) {\r\n isGoogleEnabled = providers.includes('google');\r\n isGithubEnabled = providers.includes('github');\r\n } else if (typeof providers === 'object') {\r\n isGoogleEnabled = !!providers.google;\r\n isGithubEnabled = !!providers.github;\r\n isEmailPasswordEnabled = providers.emailPassword !== undefined ? providers.emailPassword : enableEmailPassword;\r\n }\r\n }\r\n\r\n const hasPasswordAuth = isEmailPasswordEnabled;\r\n const hasSocialAuth = isGoogleEnabled || isGithubEnabled;\r\n const brandName = branding?.brandName || branding?.appName || branding?.title || 'urBackend';\r\n const headerTitle = branding?.title || brandName;\r\n const headerSubtitle = branding?.subtitle || (mode === 'signin'\r\n ? text.loginTitle\r\n : mode === 'signup'\r\n ? text.signupTitle\r\n : mode === 'forgot'\r\n ? text.forgotTitle\r\n : text.resetTitle);\r\n const showSwitcher = hasPasswordAuth;\r\n\r\n useEffect(() => {\r\n if (error) {\r\n setToast({ message: error, type: 'error' });\r\n }\r\n }, [error]);\r\n\r\n useEffect(() => {\r\n if (!hasPasswordAuth && mode !== 'signin') {\r\n setMode('signin');\r\n }\r\n }, [hasPasswordAuth, mode]);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n try {\r\n if (mode === 'signin') {\r\n await login({ email, password });\r\n setToast({ message: 'Welcome back!', type: 'success' });\r\n if (onSuccess) onSuccess();\r\n } else if (mode === 'signup') {\r\n await signUp({ email, password, name });\r\n await login({ email, password });\r\n setToast({ message: 'Account created successfully!', type: 'success' });\r\n if (onSuccess) onSuccess();\r\n } else if (mode === 'forgot') {\r\n await requestPasswordReset({ email });\r\n setToast({ message: 'Reset code sent to your email', type: 'success' });\r\n setMode('reset');\r\n } else if (mode === 'reset') {\r\n await resetPassword({ email, otp, newPassword: password });\r\n setToast({ message: 'Password reset successfully', type: 'success' });\r\n setMode('signin');\r\n setPassword('');\r\n setOtp('');\r\n }\r\n } catch (err: any) {\r\n // Errors are surfaced via the shared auth hook state.\r\n }\r\n };\r\n\r\n const styles = {\r\n wrapper: {\r\n width: '100%',\r\n maxWidth: '420px',\r\n margin: '0 auto',\r\n borderRadius: '0',\r\n background: themeColors.background,\r\n boxShadow: theme === 'dark' ? '0 20px 40px rgba(0,0,0,0.5)' : '0 20px 40px rgba(0,0,0,0.06), 0 1px 3px rgba(0,0,0,0.05)',\r\n border: `1px solid ${themeColors.border}`,\r\n overflow: 'hidden',\r\n fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n color: themeColors.text,\r\n },\r\n body: {\r\n padding: '32px 32px 24px 32px',\r\n },\r\n header: {\r\n textAlign: 'center' as const,\r\n marginBottom: '28px',\r\n },\r\n brandRow: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n gap: '12px',\r\n marginBottom: '10px',\r\n },\r\n brandLogo: {\r\n width: '44px',\r\n height: '44px',\r\n borderRadius: '12px',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n background: theme === 'dark' ? '#2a2a2a' : '#f1f5f9',\r\n color: themeColors.text,\r\n overflow: 'hidden' as const,\r\n },\r\n brandTitle: {\r\n margin: 0,\r\n fontSize: '26px',\r\n lineHeight: 1.1,\r\n fontWeight: 800,\r\n color: themeColors.text,\r\n },\r\n brandSubtitle: {\r\n margin: '0 auto',\r\n maxWidth: '320px',\r\n fontSize: '14px',\r\n lineHeight: 1.5,\r\n color: themeColors.textMuted,\r\n },\r\n switcherContainer: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n marginBottom: '32px'\r\n },\r\n switcher: {\r\n display: 'inline-flex',\r\n background: theme === 'dark' ? '#2a2a2a' : '#f1f5f9',\r\n padding: '4px',\r\n borderRadius: '0',\r\n },\r\n switchBtn: (active: boolean) => ({\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '6px',\r\n padding: '8px 20px',\r\n borderRadius: '0',\r\n fontSize: '13px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n color: active ? themeColors.text : themeColors.textMuted,\r\n background: active ? (theme === 'dark' ? '#444444' : '#ffffff') : 'transparent',\r\n boxShadow: active ? (theme === 'dark' ? '0 2px 4px rgba(0,0,0,0.2)' : '0 2px 8px rgba(0,0,0,0.05)') : 'none',\r\n border: 'none',\r\n transition: 'all 0.2s ease',\r\n }),\r\n field: {\r\n marginBottom: '20px',\r\n },\r\n labelRow: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n marginBottom: '8px',\r\n },\r\n label: {\r\n fontSize: '13px',\r\n fontWeight: 600,\r\n color: theme === 'dark' ? '#dddddd' : '#334155',\r\n },\r\n forgotLink: {\r\n fontSize: '12px',\r\n fontWeight: 600,\r\n color: themeColors.text,\r\n cursor: 'pointer',\r\n textDecoration: 'none',\r\n background: 'none',\r\n border: 'none',\r\n padding: 0,\r\n },\r\n input: {\r\n width: '100%',\r\n padding: '12px 16px',\r\n borderRadius: '0',\r\n border: `1px solid ${themeColors.border}`,\r\n background: themeColors.inputBackground,\r\n color: themeColors.text,\r\n fontSize: '14px',\r\n boxSizing: 'border-box' as const,\r\n outline: 'none',\r\n transition: 'border-color 0.2s ease',\r\n },\r\n primaryBtn: {\r\n width: '100%',\r\n padding: '14px',\r\n borderRadius: '0',\r\n background: `linear-gradient(180deg, ${primaryColor} 0%, ${secondStopColor} 100%)`,\r\n color: themeColors.primaryText,\r\n fontSize: '15px',\r\n fontWeight: 600,\r\n border: 'none',\r\n boxShadow: '0 4px 12px rgba(0,0,0,0.15)',\r\n cursor: 'pointer',\r\n marginTop: '8px',\r\n transition: 'transform 0.1s ease',\r\n },\r\n divider: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n margin: '24px 0',\r\n color: themeColors.dividerText,\r\n fontSize: '11px',\r\n fontWeight: 600,\r\n letterSpacing: '1px',\r\n },\r\n dividerLine: {\r\n flex: 1,\r\n height: '1px',\r\n background: themeColors.border,\r\n },\r\n dividerText: {\r\n padding: '0 12px',\r\n },\r\n socialBtn: {\r\n width: '100%',\r\n padding: '12px',\r\n borderRadius: '0',\r\n border: `1px solid ${themeColors.border}`,\r\n background: themeColors.socialButtonBackground,\r\n color: themeColors.text,\r\n fontSize: '14px',\r\n fontWeight: 600,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '10px',\r\n marginBottom: '12px',\r\n cursor: 'pointer',\r\n boxShadow: theme === 'dark' ? 'none' : '0 1px 2px rgba(0,0,0,0.02)',\r\n transition: 'background 0.2s ease',\r\n },\r\n footer: {\r\n background: themeColors.footerBackground,\r\n padding: '24px',\r\n textAlign: 'center' as const,\r\n borderTop: `1px solid ${themeColors.border}`,\r\n fontSize: '13px',\r\n color: themeColors.textMuted,\r\n },\r\n footerLink: {\r\n color: themeColors.text,\r\n fontWeight: 600,\r\n textDecoration: 'underline',\r\n cursor: 'pointer',\r\n marginLeft: '4px',\r\n background: 'none',\r\n border: 'none',\r\n padding: 0,\r\n }\r\n };\r\n\r\n const GoogleIcon = () => (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path 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\" fill=\"#4285F4\"/>\r\n <path 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\" fill=\"#34A853\"/>\r\n <path 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\" fill=\"#FBBC05\"/>\r\n <path 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\" fill=\"#EA4335\"/>\r\n </svg>\r\n );\r\n\r\n const GithubIcon = () => (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill={theme === 'dark' ? '#fff' : '#000'}>\r\n <path d=\"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z\"/>\r\n </svg>\r\n );\r\n\r\n const renderSocialButtons = () => {\r\n if (!hasSocialAuth) {\r\n return null;\r\n }\r\n\r\n return (\r\n <>\r\n {hasPasswordAuth && (\r\n <div style={styles.divider}>\r\n <div style={styles.dividerLine} />\r\n <span style={styles.dividerText}>{text.socialDivider}</span>\r\n <div style={styles.dividerLine} />\r\n </div>\r\n )}\r\n\r\n <div>\r\n {isGoogleEnabled && (\r\n <button style={styles.socialBtn} onClick={() => socialLogin('google')} type=\"button\">\r\n <GoogleIcon />\r\n {text.googleButton}\r\n </button>\r\n )}\r\n {isGithubEnabled && (\r\n <button style={styles.socialBtn} onClick={() => socialLogin('github')} type=\"button\">\r\n <GithubIcon />\r\n {text.githubButton}\r\n </button>\r\n )}\r\n </div>\r\n </>\r\n );\r\n };\r\n\r\n const footerPrompt = mode === 'signin'\r\n ? text.footerSigninPrompt\r\n : mode === 'signup'\r\n ? text.footerSignupPrompt\r\n : text.footerForgotPrompt;\r\n\r\n return (\r\n <div style={styles.wrapper}>\r\n {toast && (\r\n <Toast \r\n message={toast.message} \r\n type={toast.type} \r\n isDark={theme === 'dark'} \r\n onClose={() => {\r\n setToast(null);\r\n if (toast.type === 'error') clearError();\r\n }} \r\n />\r\n )}\r\n \r\n <div style={styles.body}>\r\n {(branding?.logo || branding?.brandName || branding?.appName || branding?.title || branding?.subtitle || headerTitle || headerSubtitle) && (\r\n <div style={styles.header}>\r\n <div style={styles.brandRow}>\r\n {branding?.logo ? (\r\n <div style={styles.brandLogo}>\r\n {typeof branding.logo === 'string' ? (\r\n <img src={branding.logo} alt={brandName} style={{ width: '100%', height: '100%', objectFit: 'contain' }} />\r\n ) : (\r\n branding.logo\r\n )}\r\n </div>\r\n ) : (\r\n <div style={styles.brandLogo} aria-hidden=\"true\">\r\n {brandName.slice(0, 1).toUpperCase()}\r\n </div>\r\n )}\r\n </div>\r\n <h1 style={styles.brandTitle}>{headerTitle}</h1>\r\n <p style={styles.brandSubtitle}>{headerSubtitle}</p>\r\n </div>\r\n )}\r\n\r\n {showSwitcher && (mode === 'signin' || mode === 'signup') && (\r\n <div style={styles.switcherContainer}>\r\n <div style={styles.switcher}>\r\n <button \r\n type=\"button\"\r\n style={styles.switchBtn(mode === 'signin')} \r\n onClick={() => { setMode('signin'); clearError(); }}\r\n >\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4\"/><polyline points=\"10 17 15 12 10 7\"/><line x1=\"15\" y1=\"12\" x2=\"3\" y2=\"12\"/></svg>\r\n {text.loginTab}\r\n </button>\r\n <button \r\n type=\"button\"\r\n style={styles.switchBtn(mode === 'signup')} \r\n onClick={() => { setMode('signup'); clearError(); }}\r\n >\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"/><circle cx=\"9\" cy=\"7\" r=\"4\"/><line x1=\"19\" y1=\"8\" x2=\"19\" y2=\"14\"/><line x1=\"22\" y1=\"11\" x2=\"16\" y2=\"11\"/></svg>\r\n {text.signupTab}\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {(mode === 'forgot' || mode === 'reset') && (\r\n <div style={{ marginBottom: '24px', textAlign: 'center' }}>\r\n <h2 style={{ margin: '0 0 8px', fontSize: '20px', fontWeight: 700, color: themeColors.text }}>\r\n {mode === 'forgot' ? text.forgotTitle : text.resetTitle}\r\n </h2>\r\n <p style={{ margin: 0, fontSize: '14px', color: themeColors.textMuted }}>\r\n {mode === 'forgot' ? text.forgotSubtitle : text.resetSubtitle.replace('{email}', email)}\r\n \r\n </p>\r\n </div>\r\n )}\r\n\r\n {!hasPasswordAuth && !hasSocialAuth && (\r\n <div style={{ textAlign: 'center', color: themeColors.textMuted, fontSize: '14px', lineHeight: 1.5 }}>\r\n {text.noAuthMethods}\r\n </div>\r\n )}\r\n\r\n {hasPasswordAuth && (\r\n <form onSubmit={handleSubmit}>\r\n {mode === 'signup' && (\r\n <div style={styles.field}>\r\n <div style={styles.labelRow}>\r\n <label style={styles.label}>{text.nameLabel}</label>\r\n </div>\r\n <input\r\n style={styles.input}\r\n type=\"text\"\r\n placeholder={text.namePlaceholder}\r\n value={name}\r\n onChange={e => setName(e.target.value)}\r\n required\r\n />\r\n </div>\r\n )}\r\n\r\n <div style={styles.field}>\r\n <div style={styles.labelRow}>\r\n <label style={styles.label}>{text.emailLabel}</label>\r\n </div>\r\n <input\r\n style={styles.input}\r\n type=\"email\"\r\n placeholder={text.emailPlaceholder}\r\n value={email}\r\n onChange={e => setEmail(e.target.value)}\r\n required\r\n readOnly={mode === 'reset'}\r\n />\r\n </div>\r\n\r\n {(mode === 'signin' || mode === 'signup' || mode === 'reset') && (\r\n <div style={styles.field}>\r\n <div style={styles.labelRow}>\r\n <label style={styles.label}>{mode === 'reset' ? text.passwordLabel : text.passwordLabel}</label>\r\n {mode === 'signin' && (\r\n <button type=\"button\" style={styles.forgotLink} onClick={() => { setMode('forgot'); clearError(); }}>\r\n {text.forgotPasswordLink}\r\n </button>\r\n )}\r\n </div>\r\n <input\r\n style={styles.input}\r\n type=\"password\"\r\n placeholder={text.passwordPlaceholder}\r\n value={password}\r\n onChange={e => setPassword(e.target.value)}\r\n required\r\n />\r\n </div>\r\n )}\r\n\r\n {mode === 'reset' && (\r\n <div style={styles.field}>\r\n <div style={styles.labelRow}>\r\n <label style={styles.label}>{text.otpLabel}</label>\r\n </div>\r\n <input\r\n style={styles.input}\r\n type=\"text\"\r\n placeholder={text.otpPlaceholder}\r\n value={otp}\r\n onChange={e => setOtp(e.target.value)}\r\n required\r\n />\r\n </div>\r\n )}\r\n\r\n <button style={styles.primaryBtn} type=\"submit\" disabled={isLoading} \r\n onMouseDown={e => e.currentTarget.style.transform = 'scale(0.98)'}\r\n onMouseUp={e => e.currentTarget.style.transform = 'scale(1)'}\r\n onMouseLeave={e => e.currentTarget.style.transform = 'scale(1)'}\r\n >\r\n {isLoading \r\n ? 'Processing...' \r\n : (mode === 'signin' ? text.loginButton \r\n : mode === 'signup' ? text.signupButton \r\n : mode === 'forgot' ? text.forgotButton \r\n : text.resetButton)\r\n }\r\n </button>\r\n </form>\r\n )}\r\n\r\n {(mode === 'signin' || mode === 'signup') && renderSocialButtons()}\r\n </div>\r\n\r\n {hasPasswordAuth && (\r\n <div style={styles.footer}>\r\n {footerPrompt}\r\n <button \r\n type=\"button\"\r\n style={styles.footerLink}\r\n onClick={() => {\r\n setMode(mode === 'signin' ? 'signup' : 'signin');\r\n clearError();\r\n }}\r\n >\r\n {mode === 'signin' ? text.signupTab : text.loginTab}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\n\r\ninterface ToastProps {\r\n message: string;\r\n type: 'success' | 'error';\r\n onClose: () => void;\r\n isDark?: boolean;\r\n}\r\n\r\nexport const Toast: React.FC<ToastProps> = ({ message, type, onClose, isDark = false }) => {\r\n const [isVisible, setIsVisible] = useState(false);\r\n const [isLeaving, setIsLeaving] = useState(false);\r\n\r\n useEffect(() => {\r\n // Trigger enter animation on mount\r\n requestAnimationFrame(() => {\r\n setIsVisible(true);\r\n });\r\n\r\n let innerTimer: ReturnType<typeof setTimeout>;\r\n const timer = setTimeout(() => {\r\n setIsLeaving(true);\r\n innerTimer = setTimeout(onClose, 300); // Wait for exit animation\r\n }, 4000);\r\n\r\n return () => {\r\n clearTimeout(timer);\r\n if (innerTimer) clearTimeout(innerTimer);\r\n };\r\n }, [onClose]);\r\n\r\n const bgColor = isDark ? 'rgba(30, 30, 30, 0.9)' : 'rgba(255, 255, 255, 0.9)';\r\n const borderColor = type === 'success' ? 'rgba(34, 197, 94, 0.5)' : 'rgba(239, 68, 68, 0.5)';\r\n const iconColor = type === 'success' ? '#22c55e' : '#ef4444';\r\n const textColor = isDark ? '#fff' : '#000';\r\n\r\n return (\r\n <>\r\n <style>\r\n {`\r\n @keyframes slideIn {\r\n from { transform: translate(-50%, -20px) scale(0.95); opacity: 0; }\r\n to { transform: translate(-50%, 0) scale(1); opacity: 1; }\r\n }\r\n @keyframes slideOut {\r\n from { transform: translate(-50%, 0) scale(1); opacity: 1; }\r\n to { transform: translate(-50%, -20px) scale(0.95); opacity: 0; }\r\n }\r\n `}\r\n </style>\r\n <div\r\n style={{\r\n position: 'fixed',\r\n top: '24px',\r\n left: '50%',\r\n transform: 'translateX(-50%)',\r\n zIndex: 9999,\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '12px',\r\n padding: '12px 20px',\r\n borderRadius: '0',\r\n background: bgColor,\r\n backdropFilter: 'blur(16px)',\r\n WebkitBackdropFilter: 'blur(16px)',\r\n border: `1px solid ${borderColor}`,\r\n boxShadow: '0 8px 32px rgba(0,0,0,0.12)',\r\n color: textColor,\r\n fontFamily: 'system-ui, -apple-system, sans-serif',\r\n fontSize: '14px',\r\n fontWeight: 500,\r\n animation: isLeaving ? 'slideOut 0.3s cubic-bezier(0.4, 0, 0.2, 1) forwards' : 'slideIn 0.4s cubic-bezier(0.16, 1, 0.3, 1) forwards',\r\n }}\r\n >\r\n {type === 'success' ? (\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={iconColor} strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"></path>\r\n <polyline points=\"22 4 12 14.01 9 11.01\"></polyline>\r\n </svg>\r\n ) : (\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={iconColor} strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\r\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line>\r\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line>\r\n </svg>\r\n )}\r\n {message}\r\n </div>\r\n </>\r\n );\r\n};\r\n","import React, { useState, useRef, useEffect } from 'react';\nimport { useUser, useAuth } from '../hooks';\n\nexport interface UrUserButtonProps {\n /**\n * Shape of the profile avatar. Defaults to 'square' as requested.\n */\n shape?: 'square' | 'circle';\n /**\n * Position of the button on the screen. Defaults to 'top-right'.\n * Use 'inline' if you want to place it within a normal flex/grid layout instead of absolute positioning.\n */\n position?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'inline';\n /**\n * Called when \"Profile\" is clicked.\n */\n onProfileClick?: () => void;\n /**\n * Called when \"Settings\" is clicked.\n */\n onSettingsClick?: () => void;\n /**\n * Z-index for the fixed container. Defaults to 999.\n */\n zIndex?: number;\n}\n\nexport const UrUserButton: React.FC<UrUserButtonProps> = ({\n shape = 'square',\n position = 'top-right',\n onProfileClick,\n onSettingsClick,\n zIndex = 999,\n}) => {\n const { user } = useUser();\n const { logout } = useAuth();\n const [isOpen, setIsOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n if (!user) return null; // Only render if logged in\n\n const borderRadius = shape === 'circle' ? '50%' : '0px';\n const isFixed = position !== 'inline';\n\n const positionStyles: React.CSSProperties = isFixed\n ? {\n position: 'fixed',\n zIndex,\n top: position.includes('top') ? '24px' : 'auto',\n bottom: position.includes('bottom') ? '24px' : 'auto',\n right: position.includes('right') ? '24px' : 'auto',\n left: position.includes('left') ? '24px' : 'auto',\n }\n : { position: 'relative' };\n\n const dropdownStyles: React.CSSProperties = {\n position: 'absolute',\n top: position.includes('top') || position === 'inline' ? 'calc(100% + 8px)' : 'auto',\n bottom: position.includes('bottom') ? 'calc(100% + 8px)' : 'auto',\n right: position.includes('right') || position === 'inline' ? '0' : 'auto',\n left: position.includes('left') ? '0' : 'auto',\n background: '#ffffff',\n border: '1px solid #e2e8f0',\n borderRadius: '0px',\n boxShadow: '0 10px 25px rgba(0,0,0,0.1)',\n width: '220px',\n display: isOpen ? 'block' : 'none',\n overflow: 'hidden',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n };\n\n const getInitials = () => {\n return user.name?.[0]?.toUpperCase() || user.email?.[0]?.toUpperCase() || 'U';\n };\n\n return (\n <div ref={containerRef} style={positionStyles}>\n <button\n onClick={() => setIsOpen(!isOpen)}\n style={{\n width: '40px',\n height: '40px',\n padding: 0,\n border: '1px solid #e2e8f0',\n background: '#f8fafc',\n borderRadius,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n boxShadow: '0 2px 5px rgba(0,0,0,0.05)',\n transition: 'transform 0.1s ease',\n }}\n >\n {user.avatarUrl ? (\n <img src={user.avatarUrl as string} alt=\"User\" style={{ width: '100%', height: '100%', objectFit: 'cover' }} />\n ) : (\n <span style={{ fontSize: '16px', fontWeight: 600, color: '#475569' }}>\n {getInitials()}\n </span>\n )}\n </button>\n\n <div style={dropdownStyles}>\n {/* User Info Header */}\n <div style={{ padding: '16px', borderBottom: '1px solid #e2e8f0', background: '#f8fafc' }}>\n <div style={{ fontSize: '14px', fontWeight: 600, color: '#0f172a', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>\n {user.name || 'User'}\n </div>\n <div style={{ fontSize: '12px', color: '#64748b', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', marginTop: '2px' }}>\n {user.email}\n </div>\n </div>\n\n {/* Action List */}\n <div style={{ padding: '8px' }}>\n {onProfileClick && (\n <button\n onClick={() => {\n setIsOpen(false);\n onProfileClick();\n }}\n style={{\n width: '100%',\n textAlign: 'left',\n padding: '10px 12px',\n background: 'transparent',\n border: 'none',\n fontSize: '14px',\n color: '#334155',\n cursor: 'pointer',\n borderRadius: '0px',\n display: 'block',\n }}\n onMouseEnter={(e) => (e.currentTarget.style.background = '#f1f5f9')}\n onMouseLeave={(e) => (e.currentTarget.style.background = 'transparent')}\n >\n Profile\n </button>\n )}\n\n {onSettingsClick && (\n <button\n onClick={() => {\n setIsOpen(false);\n onSettingsClick();\n }}\n style={{\n width: '100%',\n textAlign: 'left',\n padding: '10px 12px',\n background: 'transparent',\n border: 'none',\n fontSize: '14px',\n color: '#334155',\n cursor: 'pointer',\n borderRadius: '0px',\n display: 'block',\n }}\n onMouseEnter={(e) => (e.currentTarget.style.background = '#f1f5f9')}\n onMouseLeave={(e) => (e.currentTarget.style.background = 'transparent')}\n >\n Settings\n </button>\n )}\n\n <div style={{ height: '1px', background: '#e2e8f0', margin: '4px 0' }} />\n\n <button\n onClick={() => {\n setIsOpen(false);\n logout();\n }}\n style={{\n width: '100%',\n textAlign: 'left',\n padding: '10px 12px',\n background: 'transparent',\n border: 'none',\n fontSize: '14px',\n color: '#ef4444',\n fontWeight: 500,\n cursor: 'pointer',\n borderRadius: '0px',\n display: 'block',\n }}\n onMouseEnter={(e) => (e.currentTarget.style.background = '#fef2f2')}\n onMouseLeave={(e) => (e.currentTarget.style.background = 'transparent')}\n >\n Logout\n </button>\n </div>\n </div>\n </div>\n );\n};\n"],"mappings":"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","names":["error","import_react","import_react","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime"]}