{"version":3,"sources":["../../src/auth/index.ts","../../src/auth/services/auth.service.ts","../../src/auth/services/invite.service.ts","../../src/auth/hooks/useAuth.ts","../../src/auth/providers/AuthProvider.tsx","../../src/auth/hooks/useUser.ts","../../src/auth/hooks/useRole.ts","../../src/auth/hooks/usePermission.ts","../../src/auth/components/SignIn/SignIn.tsx","../../src/auth/components/SignUp/SignUp.tsx","../../src/auth/components/UserButton/UserButton.tsx","../../src/auth/components/UserButton/UserButton.module.css","../../src/auth/components/UserProfile/UserProfile.tsx","../../src/auth/components/SignedIn/SignedIn.tsx","../../src/auth/components/SignedOut/SignedOut.tsx","../../src/auth/components/Protect/Protect.tsx","../../src/auth/components/RedirectToSignIn/RedirectToSignIn.tsx"],"sourcesContent":["// Core exports\nexport { initAuth } from './services/auth.service';\nexport { getInviteService } from './services/invite.service';\nexport type { AuthConfig } from './types';\n\n// Hooks\nexport { useAuth } from './hooks/useAuth';\nexport { useUser } from './hooks/useUser';\nexport { useRole } from './hooks/useRole';\nexport { usePermission } from './hooks/usePermission';\n\n// Components\nexport { AuthProvider } from './providers/AuthProvider';\nexport { SignIn } from './components/SignIn';\nexport { SignUp } from './components/SignUp';\nexport { UserButton } from './components/UserButton';\nexport { UserProfile } from './components/UserProfile';\nexport { SignedIn } from './components/SignedIn';\nexport { SignedOut } from './components/SignedOut';\nexport { Protect } from './components/Protect';\nexport { RedirectToSignIn } from './components/RedirectToSignIn';\n\n// Types\nexport type {\n  AuthUser,\n  AuthError,\n  AuthState,\n  User,\n  UserInvite,\n  InviteUserOptions,\n  Role,\n  Permission,\n  UserPermissions,\n} from './types';","import { \n  initializeApp, \n  getApps, \n  getApp,\n  FirebaseApp \n} from 'firebase/app';\nimport {\n  getAuth,\n  Auth as FirebaseAuth,\n  createUserWithEmailAndPassword,\n  signInWithEmailAndPassword,\n  signOut as firebaseSignOut,\n  onAuthStateChanged,\n  User as FirebaseUser,\n  GoogleAuthProvider,\n  GithubAuthProvider,\n  signInWithPopup,\n  sendPasswordResetEmail,\n  updateProfile,\n  setPersistence,\n  browserLocalPersistence,\n  browserSessionPersistence,\n} from 'firebase/auth';\nimport { \n  AuthConfig, \n  AuthUser, \n  SignInOptions, \n  SignUpOptions,\n  AuthProvider,\n  AuthError \n} from '../types';\n\nclass AuthService {\n  private app: FirebaseApp;\n  private auth: FirebaseAuth;\n  private config: AuthConfig;\n  private customClaimsCache: Map<string, any> = new Map();\n\n  constructor(config: AuthConfig) {\n    this.config = config;\n    \n    // Initialize Firebase app\n    this.app = getApps().length > 0 \n      ? getApp() \n      : initializeApp(config.firebaseConfig);\n    \n    this.auth = getAuth(this.app);\n  }\n\n  // Initialize auth with configuration\n  async initialize(): Promise<void> {\n    // Set up auth state observer\n    onAuthStateChanged(this.auth, async (user) => {\n      if (user) {\n        await this.enhanceUser(user);\n        if (this.config.onUserCreated && this.isNewUser(user)) {\n          await this.config.onUserCreated(user as AuthUser);\n        }\n      }\n    });\n  }\n\n  // Sign up with email and password\n  async signUp(options: SignUpOptions): Promise<{ user: AuthUser }> {\n    try {\n      const { email, password, displayName, photoURL, metadata } = options;\n      \n      const userCredential = await createUserWithEmailAndPassword(\n        this.auth, \n        email, \n        password\n      );\n\n      // Update profile if display name or photo provided\n      if (displayName || photoURL) {\n        await updateProfile(userCredential.user, {\n          displayName,\n          photoURL,\n        });\n      }\n\n      // Store metadata in custom claims (server-side required)\n      if (metadata) {\n        await this.setUserMetadata(userCredential.user.uid, metadata);\n      }\n\n      const user = await this.enhanceUser(userCredential.user);\n      return { user };\n    } catch (error: any) {\n      throw this.normalizeError(error);\n    }\n  }\n\n  // Sign in with email and password\n  async signIn(options: SignInOptions): Promise<{ user: AuthUser }> {\n    try {\n      const { email, password, rememberMe = false } = options;\n      \n      // Set persistence based on remember me option\n      await setPersistence(\n        this.auth,\n        rememberMe ? browserLocalPersistence : browserSessionPersistence\n      );\n\n      const userCredential = await signInWithEmailAndPassword(\n        this.auth,\n        email,\n        password\n      );\n\n      const user = await this.enhanceUser(userCredential.user);\n      return { user };\n    } catch (error: any) {\n      throw this.normalizeError(error);\n    }\n  }\n\n  // Sign in with social provider\n  async signInWith(provider: AuthProvider): Promise<{ user: AuthUser }> {\n    try {\n      let authProvider;\n      \n      switch (provider) {\n        case 'google':\n          authProvider = new GoogleAuthProvider();\n          break;\n        case 'github':\n          authProvider = new GithubAuthProvider();\n          break;\n        default:\n          throw new Error(`Provider ${provider} not supported yet`);\n      }\n\n      const userCredential = await signInWithPopup(this.auth, authProvider);\n      const user = await this.enhanceUser(userCredential.user);\n      return { user };\n    } catch (error: any) {\n      throw this.normalizeError(error);\n    }\n  }\n\n  // Sign out\n  async signOut(): Promise<void> {\n    try {\n      await firebaseSignOut(this.auth);\n      this.customClaimsCache.clear();\n    } catch (error: any) {\n      throw this.normalizeError(error);\n    }\n  }\n\n  // Send password reset email\n  async sendPasswordResetEmail(email: string): Promise<void> {\n    try {\n      await sendPasswordResetEmail(this.auth, email);\n    } catch (error: any) {\n      throw this.normalizeError(error);\n    }\n  }\n\n  // Get current user\n  getCurrentUser(): AuthUser | null {\n    const user = this.auth.currentUser;\n    if (!user) return null;\n    \n    // Return cached enhanced user\n    return this.getCachedEnhancedUser(user);\n  }\n\n  // Subscribe to auth state changes\n  onAuthStateChange(callback: (user: AuthUser | null) => void): () => void {\n    return onAuthStateChanged(this.auth, async (user) => {\n      if (user) {\n        const enhancedUser = await this.enhanceUser(user);\n        callback(enhancedUser);\n      } else {\n        callback(null);\n      }\n    });\n  }\n\n  // Enhance Firebase user with custom claims and additional data\n  private async enhanceUser(user: FirebaseUser): Promise<AuthUser> {\n    const tokenResult = await user.getIdTokenResult();\n    const customClaims = tokenResult.claims;\n    \n    // Cache custom claims\n    this.customClaimsCache.set(user.uid, customClaims);\n\n    const enhancedUser: AuthUser = {\n      ...user,\n      customClaims,\n      role: customClaims.role as string | undefined,\n      roles: customClaims.roles as string[] | undefined,\n      department: customClaims.department as string | undefined,\n      departments: customClaims.departments as string[] | undefined,\n      isAdmin: customClaims.isAdmin as boolean | undefined,\n      isSuperAdmin: customClaims.isSuperAdmin as boolean | undefined,\n      permissions: customClaims.permissions as string[] | undefined,\n    };\n\n    return enhancedUser;\n  }\n\n  // Get cached enhanced user\n  private getCachedEnhancedUser(user: FirebaseUser): AuthUser {\n    const customClaims = this.customClaimsCache.get(user.uid) || {};\n    \n    return {\n      ...user,\n      customClaims,\n      role: customClaims.role as string | undefined,\n      permissions: customClaims.permissions as string[] | undefined,\n      department: customClaims.department as string | undefined,\n    };\n  }\n\n  // Check if user is new (created within last minute)\n  private isNewUser(user: FirebaseUser): boolean {\n    if (!user.metadata.creationTime) return false;\n    \n    const creationTime = new Date(user.metadata.creationTime).getTime();\n    const now = Date.now();\n    const oneMinute = 60 * 1000;\n    \n    return now - creationTime < oneMinute;\n  }\n\n  // Set user metadata (requires server-side implementation)\n  private async setUserMetadata(_uid: string, _metadata: any): Promise<void> {\n    // This would typically call your backend API to set custom claims\n    console.warn('setUserMetadata requires server-side implementation');\n  }\n\n  // Normalize Firebase errors to consistent format\n  private normalizeError(error: any): AuthError {\n    const errorCode = error.code || 'unknown';\n    let message = error.message || 'An unknown error occurred';\n\n    // Provide user-friendly error messages\n    switch (errorCode) {\n      case 'auth/invalid-email':\n        message = 'The email address is not valid.';\n        break;\n      case 'auth/user-disabled':\n        message = 'This user account has been disabled.';\n        break;\n      case 'auth/user-not-found':\n        message = 'No user found with this email address.';\n        break;\n      case 'auth/wrong-password':\n        message = 'The password is incorrect.';\n        break;\n      case 'auth/email-already-in-use':\n        message = 'An account already exists with this email address.';\n        break;\n      case 'auth/weak-password':\n        message = 'The password must be at least 6 characters long.';\n        break;\n      case 'auth/popup-closed-by-user':\n        message = 'The sign-in popup was closed before completing sign in.';\n        break;\n    }\n\n    return {\n      code: errorCode,\n      message,\n      originalError: error,\n    };\n  }\n\n  // Get Firebase Auth instance (for advanced usage)\n  getAuth(): FirebaseAuth {\n    return this.auth;\n  }\n\n  // Get Firebase App instance\n  getApp(): FirebaseApp {\n    return this.app;\n  }\n}\n\n// Singleton instance\nlet authInstance: AuthService | null = null;\n\n// Initialize auth service\nexport function initAuth(config: AuthConfig): AuthService {\n  if (!authInstance) {\n    authInstance = new AuthService(config);\n    authInstance.initialize();\n  }\n  return authInstance;\n}\n\n// Get auth instance\nexport function getAuthInstance(): AuthService {\n  if (!authInstance) {\n    throw new Error('Auth not initialized. Call initAuth first.');\n  }\n  return authInstance;\n}","import { \n  UserInvite, \n  InviteUserOptions, \n  InviteTemplate,\n  BulkInviteResult,\n  InvitePreview,\n  InviteAssignment\n} from '../types';\nimport { getAuthInstance } from './auth.service';\n\nclass InviteService {\n  private invites: Map<string, UserInvite> = new Map();\n  private templates: Map<string, InviteTemplate> = new Map();\n  private inviteExpirationMs = 7 * 24 * 60 * 60 * 1000; // 7 days default\n\n  // Invite a single user\n  async inviteUser(options: InviteUserOptions | string, role?: string, department?: string): Promise<UserInvite> {\n    let inviteOptions: InviteUserOptions;\n    \n    // Support simple invocation\n    if (typeof options === 'string') {\n      inviteOptions = {\n        email: options,\n        role,\n        department,\n        sendEmail: true,\n        expiresIn: '7d',\n      };\n    } else {\n      inviteOptions = options;\n    }\n\n    // Validate email\n    if (!this.isValidEmail(inviteOptions.email)) {\n      throw new Error('Invalid email address');\n    }\n\n    // Check if user already invited\n    const existingInvite = this.findInviteByEmail(inviteOptions.email);\n    if (existingInvite && existingInvite.status === 'pending') {\n      throw new Error('User already has a pending invitation');\n    }\n\n    // Create invite\n    const invite: UserInvite = {\n      id: this.generateInviteId(),\n      email: inviteOptions.email,\n      status: 'pending',\n      assignments: {\n        immediate: inviteOptions.immediate || {\n          role: inviteOptions.role,\n          department: inviteOptions.department,\n          permissions: inviteOptions.permissions,\n        },\n        conditional: inviteOptions.conditional,\n        deferred: inviteOptions.deferred,\n      },\n      invitedBy: await this.getCurrentUserId(),\n      invitedAt: new Date(),\n      expiresAt: this.calculateExpirationDate(inviteOptions.expiresIn || '7d'),\n      metadata: inviteOptions.metadata,\n    };\n\n    // Store invite\n    this.invites.set(invite.id, invite);\n\n    // Send email if requested\n    if (inviteOptions.sendEmail !== false) {\n      await this.sendInviteEmail(invite);\n    }\n\n    return invite;\n  }\n\n  // Bulk invite users\n  async inviteUsers(invites: InviteUserOptions[]): Promise<BulkInviteResult> {\n    const result: BulkInviteResult = {\n      successful: [],\n      failed: [],\n    };\n\n    for (const inviteOptions of invites) {\n      try {\n        const invite = await this.inviteUser(inviteOptions);\n        result.successful.push(invite.email);\n      } catch (error: any) {\n        result.failed.push({\n          email: inviteOptions.email,\n          error: error.message,\n        });\n      }\n    }\n\n    return result;\n  }\n\n  // Define an invite template\n  async defineInviteTemplate(id: string, template: Omit<InviteTemplate, 'id' | 'createdBy' | 'createdAt'>): Promise<void> {\n    const fullTemplate: InviteTemplate = {\n      ...template,\n      id,\n      createdBy: await this.getCurrentUserId(),\n      createdAt: new Date(),\n    };\n    \n    this.templates.set(id, fullTemplate);\n  }\n\n  // Invite user with template\n  async inviteUserWithTemplate(templateId: string, overrides: Partial<InviteUserOptions>): Promise<UserInvite> {\n    const template = this.templates.get(templateId);\n    if (!template) {\n      throw new Error(`Template ${templateId} not found`);\n    }\n\n    const inviteOptions: InviteUserOptions = {\n      ...template.assignments,\n      ...overrides,\n    };\n\n    return this.inviteUser(inviteOptions);\n  }\n\n  // Preview permissions for an invite\n  previewPermissions(options: { role?: string; department?: string }): InvitePreview {\n    // This would typically fetch from your permission configuration\n    const rolePermissions = this.getPermissionsForRole(options.role);\n    const departmentPermissions = this.getPermissionsForDepartment(options.department);\n    \n    const allPermissions = new Set([\n      ...rolePermissions,\n      ...departmentPermissions,\n    ]);\n\n    return {\n      fromRole: rolePermissions,\n      fromDepartment: departmentPermissions,\n      explicit: [],\n      total: Array.from(allPermissions),\n    };\n  }\n\n  // Accept an invite\n  async acceptInvite(inviteId: string): Promise<void> {\n    const invite = this.invites.get(inviteId);\n    if (!invite) {\n      throw new Error('Invite not found');\n    }\n\n    if (invite.status !== 'pending') {\n      throw new Error(`Invite is ${invite.status}`);\n    }\n\n    if (new Date() > invite.expiresAt) {\n      invite.status = 'expired';\n      throw new Error('Invite has expired');\n    }\n\n    // Apply immediate assignments\n    if (invite.assignments.immediate) {\n      await this.applyAssignments(invite.assignments.immediate);\n    }\n\n    // Check conditional assignments\n    if (invite.assignments.conditional) {\n      const shouldApply = await this.checkConditionalAssignment(invite.assignments.conditional);\n      if (shouldApply && invite.assignments.conditional.thenAssign) {\n        await this.applyAssignments(invite.assignments.conditional.thenAssign);\n      }\n    }\n\n    // Mark invite as accepted\n    invite.status = 'accepted';\n    invite.acceptedAt = new Date();\n\n    // Trigger callback if configured\n    const auth = getAuthInstance();\n    const config = (auth as any).config;\n    if (config.onInviteAccepted) {\n      const user = auth.getCurrentUser();\n      if (user) {\n        await config.onInviteAccepted(user, invite);\n      }\n    }\n  }\n\n  // Cancel an invite\n  async cancelInvite(inviteId: string): Promise<void> {\n    const invite = this.invites.get(inviteId);\n    if (!invite) {\n      throw new Error('Invite not found');\n    }\n\n    if (invite.status !== 'pending') {\n      throw new Error('Can only cancel pending invites');\n    }\n\n    invite.status = 'cancelled';\n  }\n\n  // Get invite by ID\n  getInvite(inviteId: string): UserInvite | null {\n    return this.invites.get(inviteId) || null;\n  }\n\n  // Get invite by email\n  getInviteByEmail(email: string): UserInvite | null {\n    return this.findInviteByEmail(email);\n  }\n\n  // Get all invites\n  getAllInvites(filter?: { status?: string; invitedBy?: string }): UserInvite[] {\n    let invites = Array.from(this.invites.values());\n    \n    if (filter?.status) {\n      invites = invites.filter(i => i.status === filter.status);\n    }\n    \n    if (filter?.invitedBy) {\n      invites = invites.filter(i => i.invitedBy === filter.invitedBy);\n    }\n\n    return invites;\n  }\n\n  // Get invite permissions\n  async getInvitePermissions(inviteId: string): Promise<string[]> {\n    const invite = this.invites.get(inviteId);\n    if (!invite) {\n      throw new Error('Invite not found');\n    }\n\n    const permissions = new Set<string>();\n\n    // Add immediate permissions\n    if (invite.assignments.immediate) {\n      const { role, department, permissions: explicitPerms } = invite.assignments.immediate;\n      \n      if (role) {\n        this.getPermissionsForRole(role).forEach(p => permissions.add(p));\n      }\n      \n      if (department) {\n        this.getPermissionsForDepartment(department).forEach(p => permissions.add(p));\n      }\n      \n      if (explicitPerms) {\n        explicitPerms.forEach(p => permissions.add(p));\n      }\n    }\n\n    return Array.from(permissions);\n  }\n\n  // Private helper methods\n  private isValidEmail(email: string): boolean {\n    return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n  }\n\n  private generateInviteId(): string {\n    return `inv_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n  }\n\n  private findInviteByEmail(email: string): UserInvite | null {\n    for (const invite of this.invites.values()) {\n      if (invite.email === email) {\n        return invite;\n      }\n    }\n    return null;\n  }\n\n  private calculateExpirationDate(expiresIn: string): Date {\n    const now = new Date();\n    const match = expiresIn.match(/^(\\d+)([hdwmy])$/);\n    \n    if (!match) {\n      return new Date(now.getTime() + this.inviteExpirationMs);\n    }\n\n    const [, value, unit] = match;\n    const num = parseInt(value, 10);\n\n    switch (unit) {\n      case 'h':\n        return new Date(now.getTime() + num * 60 * 60 * 1000);\n      case 'd':\n        return new Date(now.getTime() + num * 24 * 60 * 60 * 1000);\n      case 'w':\n        return new Date(now.getTime() + num * 7 * 24 * 60 * 60 * 1000);\n      case 'm':\n        return new Date(now.getTime() + num * 30 * 24 * 60 * 60 * 1000);\n      case 'y':\n        return new Date(now.getTime() + num * 365 * 24 * 60 * 60 * 1000);\n      default:\n        return new Date(now.getTime() + this.inviteExpirationMs);\n    }\n  }\n\n  private async getCurrentUserId(): Promise<string> {\n    const auth = getAuthInstance();\n    const user = auth.getCurrentUser();\n    return user?.uid || 'system';\n  }\n\n  private async sendInviteEmail(invite: UserInvite): Promise<void> {\n    // This would integrate with the email service\n    console.log(`Sending invite email to ${invite.email}`);\n  }\n\n  private async applyAssignments(assignments: InviteAssignment): Promise<void> {\n    // This would typically call your backend API to set custom claims\n    console.log('Applying assignments:', assignments);\n  }\n\n  private async checkConditionalAssignment(conditional: any): Promise<boolean> {\n    // Check conditions like email domain\n    if (conditional.ifEmailDomain) {\n      const auth = getAuthInstance();\n      const user = auth.getCurrentUser();\n      if (user?.email?.endsWith(`@${conditional.ifEmailDomain}`)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  private getPermissionsForRole(role?: string): string[] {\n    // This would fetch from your role configuration\n    const rolePermissions: Record<string, string[]> = {\n      admin: ['manage:users', 'manage:settings', 'edit:content', 'view:content'],\n      editor: ['edit:content', 'publish:content', 'view:content'],\n      viewer: ['view:content'],\n    };\n    \n    return role ? (rolePermissions[role] || []) : [];\n  }\n\n  private getPermissionsForDepartment(department?: string): string[] {\n    // This would fetch from your department configuration\n    const departmentPermissions: Record<string, string[]> = {\n      marketing: ['edit:campaigns', 'view:analytics'],\n      engineering: ['edit:code', 'deploy:apps'],\n    };\n    \n    return department ? (departmentPermissions[department] || []) : [];\n  }\n}\n\n// Singleton instance\nlet inviteInstance: InviteService | null = null;\n\n// Get invite service instance\nexport function getInviteService(): InviteService {\n  if (!inviteInstance) {\n    inviteInstance = new InviteService();\n  }\n  return inviteInstance;\n}","import { useCallback } from 'react';\nimport { useAuthContext } from '../providers/AuthProvider';\n\nexport function useAuth() {\n  const {\n    user,\n    loading,\n    error,\n    isAuthenticated,\n    signIn,\n    signUp,\n    signOut,\n    signInWithProvider,\n    sendPasswordResetEmail,\n  } = useAuthContext();\n\n  const signInWithGoogle = useCallback(() => signInWithProvider('google'), [signInWithProvider]);\n  const signInWithGithub = useCallback(() => signInWithProvider('github'), [signInWithProvider]);\n\n  return {\n    user,\n    loading,\n    error,\n    isAuthenticated,\n    signIn,\n    signUp,\n    signOut,\n    signInWithGoogle,\n    signInWithGithub,\n    sendPasswordResetEmail,\n  };\n}","'use client';\n\nimport React, { createContext, useContext, useEffect, useState, useCallback } from 'react';\nimport { AuthUser, AuthState, AuthConfig } from '../types';\nimport { getAuthInstance, initAuth } from '../services/auth.service';\n\ninterface AuthContextValue extends AuthState {\n  signIn: (email: string, password: string, rememberMe?: boolean) => Promise<AuthUser>;\n  signUp: (email: string, password: string, displayName?: string) => Promise<AuthUser>;\n  signOut: () => Promise<void>;\n  signInWithProvider: (provider: 'google' | 'github') => Promise<AuthUser>;\n  sendPasswordResetEmail: (email: string) => Promise<void>;\n  refreshUser: () => Promise<void>;\n}\n\nconst AuthContext = createContext<AuthContextValue | undefined>(undefined);\n\ninterface AuthProviderProps {\n  children: React.ReactNode;\n  config?: AuthConfig;\n}\n\nexport function AuthProvider({ children, config }: AuthProviderProps) {\n  const [state, setState] = useState<AuthState>({\n    user: null,\n    loading: true,\n    error: null,\n    isAuthenticated: false,\n  });\n\n  // Initialize auth service if config provided\n  useEffect(() => {\n    if (config) {\n      initAuth(config);\n    }\n  }, [config]);\n\n  // Subscribe to auth state changes\n  useEffect(() => {\n    try {\n      const auth = getAuthInstance();\n      \n      const unsubscribe = auth.onAuthStateChange((user) => {\n        setState({\n          user,\n          loading: false,\n          error: null,\n          isAuthenticated: !!user,\n        });\n      });\n\n      return unsubscribe;\n    } catch (error) {\n      setState({\n        user: null,\n        loading: false,\n        error: {\n          code: 'auth/not-initialized',\n          message: 'Auth not initialized. Provide config to AuthProvider.',\n        },\n        isAuthenticated: false,\n      });\n      return () => {}; // Return empty cleanup function\n    }\n  }, []);\n\n  const signIn = useCallback(async (email: string, password: string, rememberMe = false) => {\n    setState(prev => ({ ...prev, loading: true, error: null }));\n    \n    try {\n      const auth = getAuthInstance();\n      const { user } = await auth.signIn({ email, password, rememberMe });\n      \n      setState({\n        user,\n        loading: false,\n        error: null,\n        isAuthenticated: true,\n      });\n      \n      return user;\n    } catch (error: any) {\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error,\n      }));\n      throw error;\n    }\n  }, []);\n\n  const signUp = useCallback(async (email: string, password: string, displayName?: string) => {\n    setState(prev => ({ ...prev, loading: true, error: null }));\n    \n    try {\n      const auth = getAuthInstance();\n      const { user } = await auth.signUp({ email, password, displayName });\n      \n      setState({\n        user,\n        loading: false,\n        error: null,\n        isAuthenticated: true,\n      });\n      \n      return user;\n    } catch (error: any) {\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error,\n      }));\n      throw error;\n    }\n  }, []);\n\n  const signOut = useCallback(async () => {\n    setState(prev => ({ ...prev, loading: true, error: null }));\n    \n    try {\n      const auth = getAuthInstance();\n      await auth.signOut();\n      \n      setState({\n        user: null,\n        loading: false,\n        error: null,\n        isAuthenticated: false,\n      });\n    } catch (error: any) {\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error,\n      }));\n      throw error;\n    }\n  }, []);\n\n  const signInWithProvider = useCallback(async (provider: 'google' | 'github') => {\n    setState(prev => ({ ...prev, loading: true, error: null }));\n    \n    try {\n      const auth = getAuthInstance();\n      const { user } = await auth.signInWith(provider);\n      \n      setState({\n        user,\n        loading: false,\n        error: null,\n        isAuthenticated: true,\n      });\n      \n      return user;\n    } catch (error: any) {\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error,\n      }));\n      throw error;\n    }\n  }, []);\n\n  const sendPasswordResetEmail = useCallback(async (email: string) => {\n    try {\n      const auth = getAuthInstance();\n      await auth.sendPasswordResetEmail(email);\n    } catch (error: any) {\n      setState(prev => ({\n        ...prev,\n        error,\n      }));\n      throw error;\n    }\n  }, []);\n\n  const refreshUser = useCallback(async () => {\n    if (!state.user) return;\n    \n    setState(prev => ({ ...prev, loading: true }));\n    \n    try {\n      // Force token refresh to get latest custom claims\n      await state.user.getIdToken(true);\n      const auth = getAuthInstance();\n      const currentUser = auth.getCurrentUser();\n      \n      setState(prev => ({\n        ...prev,\n        user: currentUser,\n        loading: false,\n      }));\n    } catch (error: any) {\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error,\n      }));\n    }\n  }, [state.user]);\n\n  const value: AuthContextValue = {\n    ...state,\n    signIn,\n    signUp,\n    signOut,\n    signInWithProvider,\n    sendPasswordResetEmail,\n    refreshUser,\n  };\n\n  return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n}\n\nexport function useAuthContext() {\n  const context = useContext(AuthContext);\n  if (context === undefined) {\n    throw new Error('useAuthContext must be used within an AuthProvider');\n  }\n  return context;\n}","import { useAuthContext } from '../providers/AuthProvider';\n\nexport function useUser() {\n  const { user, loading, error, refreshUser } = useAuthContext();\n\n  return {\n    user,\n    loading,\n    error,\n    refreshUser,\n  };\n}","import { useMemo } from 'react';\nimport { useAuthContext } from '../providers/AuthProvider';\n\nexport function useRole(role: string | string[]) {\n  const { user, loading } = useAuthContext();\n\n  const hasRole = useMemo(() => {\n    if (!user || !user.role) return false;\n\n    const roles = Array.isArray(role) ? role : [role];\n    return roles.includes(user.role);\n  }, [user, role]);\n\n  return {\n    hasRole,\n    loading,\n    userRole: user?.role,\n  };\n}","import { useMemo } from 'react';\nimport { useAuthContext } from '../providers/AuthProvider';\n\nexport function usePermission(permission: string | string[]) {\n  const { user, loading } = useAuthContext();\n\n  const hasPermission = useMemo(() => {\n    if (!user || !user.permissions) return false;\n\n    const permissions = Array.isArray(permission) ? permission : [permission];\n    return permissions.every(p => user.permissions?.includes(p));\n  }, [user, permission]);\n\n  const hasAnyPermission = useMemo(() => {\n    if (!user || !user.permissions) return false;\n\n    const permissions = Array.isArray(permission) ? permission : [permission];\n    return permissions.some(p => user.permissions?.includes(p));\n  }, [user, permission]);\n\n  return {\n    hasPermission,\n    hasAnyPermission,\n    loading,\n    userPermissions: user?.permissions || [],\n  };\n}","'use client';\n\nimport React, { useState } from 'react';\nimport {\n  Paper,\n  TextInput,\n  PasswordInput,\n  Button,\n  Stack,\n  Text,\n  Divider,\n  Group,\n  Anchor,\n  Checkbox,\n  Alert,\n  Title,\n  Container,\n} from '@mantine/core';\nimport { useForm } from '@mantine/form';\nimport { IconAlertCircle, IconBrandGoogle, IconBrandGithub } from '@tabler/icons-react';\nimport { SignInProps, SignInFormData } from './SignIn.types';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useRouter } from 'next/navigation';\n\nexport function SignIn({\n  redirectUrl = '/dashboard',\n  afterSignInUrl,\n  providers = ['email', 'google', 'github'],\n  appearance,\n  onSuccess,\n  onError,\n  rememberMe = true,\n  showDivider = true,\n  forgotPasswordUrl = '/forgot-password',\n  signUpUrl = '/sign-up',\n  initialEmail = '',\n  className,\n  style,\n}: SignInProps) {\n  const router = useRouter();\n  const { signIn, signInWithGoogle, signInWithGithub } = useAuth();\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n\n  const form = useForm<SignInFormData>({\n    initialValues: {\n      email: initialEmail,\n      password: '',\n      rememberMe: false,\n    },\n    validate: {\n      email: (value) => (!value ? 'Email is required' : !/^\\S+@\\S+$/.test(value) ? 'Invalid email' : null),\n      password: (value) => (!value ? 'Password is required' : value.length < 6 ? 'Password must be at least 6 characters' : null),\n    },\n  });\n\n  const handleSubmit = async (values: SignInFormData) => {\n    setLoading(true);\n    setError(null);\n\n    try {\n      const user = await signIn(values.email, values.password, values.rememberMe);\n      \n      if (onSuccess) {\n        onSuccess(user);\n      }\n      \n      const redirectTo = afterSignInUrl || redirectUrl;\n      router.push(redirectTo);\n    } catch (err: any) {\n      const errorMessage = err.message || 'Failed to sign in';\n      setError(errorMessage);\n      \n      if (onError) {\n        onError(err);\n      }\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  const handleSocialSignIn = async (provider: 'google' | 'github') => {\n    setLoading(true);\n    setError(null);\n\n    try {\n      let user;\n      if (provider === 'google') {\n        user = await signInWithGoogle();\n      } else {\n        user = await signInWithGithub();\n      }\n      \n      if (onSuccess) {\n        onSuccess(user);\n      }\n      \n      const redirectTo = afterSignInUrl || redirectUrl;\n      router.push(redirectTo);\n    } catch (err: any) {\n      const errorMessage = err.message || `Failed to sign in with ${provider}`;\n      setError(errorMessage);\n      \n      if (onError) {\n        onError(err);\n      }\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  const socialButtons = providers.includes('google') || providers.includes('github') ? (\n    <Stack>\n      {providers.includes('google') && (\n        <Button\n          leftSection={<IconBrandGoogle size={20} />}\n          variant=\"default\"\n          fullWidth\n          onClick={() => handleSocialSignIn('google')}\n          disabled={loading}\n        >\n          Continue with Google\n        </Button>\n      )}\n      {providers.includes('github') && (\n        <Button\n          leftSection={<IconBrandGithub size={20} />}\n          variant=\"default\"\n          fullWidth\n          onClick={() => handleSocialSignIn('github')}\n          disabled={loading}\n        >\n          Continue with GitHub\n        </Button>\n      )}\n    </Stack>\n  ) : null;\n\n  const showSocialTop = appearance?.layout?.socialButtonsPlacement === 'top';\n\n  return (\n    <Container size={420} className={className} style={style}>\n      <Paper withBorder shadow=\"md\" p={30} radius=\"md\">\n        <Title order={2} ta=\"center\" mb={5}>\n          Welcome back\n        </Title>\n        <Text c=\"dimmed\" size=\"sm\" ta=\"center\" mb={20}>\n          Sign in to your account to continue\n        </Text>\n\n        {error && (\n          <Alert icon={<IconAlertCircle size={16} />} color=\"red\" mb=\"md\">\n            {error}\n          </Alert>\n        )}\n\n        {showSocialTop && socialButtons}\n        {showSocialTop && showDivider && providers.includes('email') && (\n          <Divider label=\"Or continue with email\" labelPosition=\"center\" my=\"lg\" />\n        )}\n\n        {providers.includes('email') && (\n          <form onSubmit={form.onSubmit(handleSubmit)}>\n            <Stack>\n              <TextInput\n                label=\"Email\"\n                placeholder=\"your@email.com\"\n                required\n                {...form.getInputProps('email')}\n                disabled={loading}\n              />\n\n              <PasswordInput\n                label=\"Password\"\n                placeholder=\"Your password\"\n                required\n                {...form.getInputProps('password')}\n                disabled={loading}\n              />\n\n              <Group justify=\"space-between\">\n                {rememberMe && (\n                  <Checkbox\n                    label=\"Remember me\"\n                    {...form.getInputProps('rememberMe', { type: 'checkbox' })}\n                    disabled={loading}\n                  />\n                )}\n                <Anchor size=\"sm\" href={forgotPasswordUrl}>\n                  Forgot password?\n                </Anchor>\n              </Group>\n\n              <Button type=\"submit\" fullWidth loading={loading}>\n                Sign in\n              </Button>\n            </Stack>\n          </form>\n        )}\n\n        {!showSocialTop && showDivider && socialButtons && providers.includes('email') && (\n          <Divider label=\"Or continue with\" labelPosition=\"center\" my=\"lg\" />\n        )}\n        {!showSocialTop && socialButtons}\n\n        <Text c=\"dimmed\" size=\"sm\" ta=\"center\" mt={20}>\n          Don&apos;t have an account?{' '}\n          <Anchor size=\"sm\" href={signUpUrl}>\n            Sign up\n          </Anchor>\n        </Text>\n      </Paper>\n    </Container>\n  );\n}","'use client';\n\nimport React, { useState } from 'react';\nimport {\n  Paper,\n  TextInput,\n  PasswordInput,\n  Button,\n  Stack,\n  Text,\n  Divider,\n  Group,\n  Anchor,\n  Alert,\n  Title,\n  Container,\n  Progress,\n  Box,\n  List,\n} from '@mantine/core';\nimport { useForm } from '@mantine/form';\nimport { \n  IconAlertCircle, \n  IconBrandGoogle, \n  IconBrandGithub,\n  IconCheck,\n  IconX \n} from '@tabler/icons-react';\nimport { SignUpProps, SignUpFormData, PasswordRequirements } from './SignUp.types';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useRouter } from 'next/navigation';\n\nexport function SignUp({\n  redirectUrl = '/dashboard',\n  afterSignUpUrl,\n  providers = ['email', 'google', 'github'],\n  appearance,\n  onSuccess,\n  onError,\n  initialValues = {},\n  unsafeMetadata,\n  showDivider = true,\n  signInUrl = '/sign-in',\n  requireDisplayName = true,\n  passwordRequirements = {\n    minLength: 8,\n    requireUppercase: true,\n    requireNumbers: true,\n    requireSymbols: true,\n  },\n  customValidation,\n  className,\n  style,\n}: SignUpProps) {\n  const router = useRouter();\n  const { signUp, signInWithGoogle, signInWithGithub } = useAuth();\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n  const [passwordStrength, setPasswordStrength] = useState(0);\n\n  const form = useForm<SignUpFormData>({\n    initialValues: {\n      email: initialValues.email || '',\n      password: '',\n      confirmPassword: '',\n      firstName: initialValues.firstName || '',\n      lastName: initialValues.lastName || '',\n      displayName: '',\n    },\n    validate: {\n      email: (value) => {\n        if (!value) return 'Email is required';\n        if (!/^\\S+@\\S+$/.test(value)) return 'Invalid email';\n        if (customValidation?.email) return customValidation.email(value);\n        return null;\n      },\n      password: (value) => {\n        if (!value) return 'Password is required';\n        if (customValidation?.password) return customValidation.password(value);\n        \n        const errors = [];\n        if (passwordRequirements.minLength && value.length < passwordRequirements.minLength) {\n          errors.push(`at least ${passwordRequirements.minLength} characters`);\n        }\n        if (passwordRequirements.requireUppercase && !/[A-Z]/.test(value)) {\n          errors.push('one uppercase letter');\n        }\n        if (passwordRequirements.requireNumbers && !/[0-9]/.test(value)) {\n          errors.push('one number');\n        }\n        if (passwordRequirements.requireSymbols && !/[^A-Za-z0-9]/.test(value)) {\n          errors.push('one special character');\n        }\n        \n        return errors.length > 0 ? `Password must contain ${errors.join(', ')}` : null;\n      },\n      confirmPassword: (value, values) => \n        value !== values.password ? 'Passwords do not match' : null,\n      displayName: (value) => {\n        if (requireDisplayName && !value) return 'Display name is required';\n        if (customValidation?.displayName) return customValidation.displayName(value);\n        return null;\n      },\n    },\n  });\n\n  const calculatePasswordStrength = (password: string) => {\n    let strength = 0;\n    if (password.length >= (passwordRequirements.minLength || 8)) strength += 25;\n    if (passwordRequirements.requireUppercase && /[A-Z]/.test(password)) strength += 25;\n    if (passwordRequirements.requireNumbers && /[0-9]/.test(password)) strength += 25;\n    if (passwordRequirements.requireSymbols && /[^A-Za-z0-9]/.test(password)) strength += 25;\n    return strength;\n  };\n\n  const handlePasswordChange = (value: string) => {\n    form.setFieldValue('password', value);\n    setPasswordStrength(calculatePasswordStrength(value));\n  };\n\n  const handleSubmit = async (values: SignUpFormData) => {\n    setLoading(true);\n    setError(null);\n\n    try {\n      const displayName = values.displayName || `${values.firstName} ${values.lastName}`.trim();\n      const user = await signUp(values.email, values.password, displayName);\n      \n      if (onSuccess) {\n        onSuccess(user);\n      }\n      \n      const redirectTo = afterSignUpUrl || redirectUrl;\n      router.push(redirectTo);\n    } catch (err: any) {\n      const errorMessage = err.message || 'Failed to sign up';\n      setError(errorMessage);\n      \n      if (onError) {\n        onError(err);\n      }\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  const handleSocialSignIn = async (provider: 'google' | 'github') => {\n    setLoading(true);\n    setError(null);\n\n    try {\n      let user;\n      if (provider === 'google') {\n        user = await signInWithGoogle();\n      } else {\n        user = await signInWithGithub();\n      }\n      \n      if (onSuccess) {\n        onSuccess(user);\n      }\n      \n      const redirectTo = afterSignUpUrl || redirectUrl;\n      router.push(redirectTo);\n    } catch (err: any) {\n      const errorMessage = err.message || `Failed to sign up with ${provider}`;\n      setError(errorMessage);\n      \n      if (onError) {\n        onError(err);\n      }\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  const socialButtons = providers.includes('google') || providers.includes('github') ? (\n    <Stack>\n      {providers.includes('google') && (\n        <Button\n          leftSection={<IconBrandGoogle size={20} />}\n          variant=\"default\"\n          fullWidth\n          onClick={() => handleSocialSignIn('google')}\n          disabled={loading}\n        >\n          Continue with Google\n        </Button>\n      )}\n      {providers.includes('github') && (\n        <Button\n          leftSection={<IconBrandGithub size={20} />}\n          variant=\"default\"\n          fullWidth\n          onClick={() => handleSocialSignIn('github')}\n          disabled={loading}\n        >\n          Continue with GitHub\n        </Button>\n      )}\n    </Stack>\n  ) : null;\n\n  const showSocialTop = appearance?.layout?.socialButtonsPlacement === 'top';\n\n  const getStrengthColor = () => {\n    if (passwordStrength <= 25) return 'red';\n    if (passwordStrength <= 50) return 'orange';\n    if (passwordStrength <= 75) return 'yellow';\n    return 'green';\n  };\n\n  return (\n    <Container size={420} className={className} style={style}>\n      <Paper withBorder shadow=\"md\" p={30} radius=\"md\">\n        <Title order={2} ta=\"center\" mb={5}>\n          Create your account\n        </Title>\n        <Text c=\"dimmed\" size=\"sm\" ta=\"center\" mb={20}>\n          Sign up to get started\n        </Text>\n\n        {error && (\n          <Alert icon={<IconAlertCircle size={16} />} color=\"red\" mb=\"md\">\n            {error}\n          </Alert>\n        )}\n\n        {showSocialTop && socialButtons}\n        {showSocialTop && showDivider && providers.includes('email') && (\n          <Divider label=\"Or sign up with email\" labelPosition=\"center\" my=\"lg\" />\n        )}\n\n        {providers.includes('email') && (\n          <form onSubmit={form.onSubmit(handleSubmit)}>\n            <Stack>\n              <TextInput\n                label=\"Email\"\n                placeholder=\"your@email.com\"\n                required\n                {...form.getInputProps('email')}\n                disabled={loading}\n              />\n\n              {requireDisplayName && (\n                <Group grow>\n                  <TextInput\n                    label=\"First name\"\n                    placeholder=\"John\"\n                    {...form.getInputProps('firstName')}\n                    disabled={loading}\n                  />\n                  <TextInput\n                    label=\"Last name\"\n                    placeholder=\"Doe\"\n                    {...form.getInputProps('lastName')}\n                    disabled={loading}\n                  />\n                </Group>\n              )}\n\n              <PasswordInput\n                label=\"Password\"\n                placeholder=\"Create a password\"\n                required\n                value={form.values.password}\n                onChange={(e) => handlePasswordChange(e.currentTarget.value)}\n                error={form.errors.password}\n                disabled={loading}\n              />\n\n              {form.values.password && (\n                <Box>\n                  <Progress \n                    value={passwordStrength} \n                    color={getStrengthColor()} \n                    size=\"xs\" \n                    mb={5}\n                  />\n                  <Text size=\"xs\" c=\"dimmed\">\n                    Password strength: {passwordStrength}%\n                  </Text>\n                </Box>\n              )}\n\n              <PasswordInput\n                label=\"Confirm password\"\n                placeholder=\"Confirm your password\"\n                required\n                {...form.getInputProps('confirmPassword')}\n                disabled={loading}\n              />\n\n              <Button type=\"submit\" fullWidth loading={loading}>\n                Sign up\n              </Button>\n            </Stack>\n          </form>\n        )}\n\n        {!showSocialTop && showDivider && socialButtons && providers.includes('email') && (\n          <Divider label=\"Or sign up with\" labelPosition=\"center\" my=\"lg\" />\n        )}\n        {!showSocialTop && socialButtons}\n\n        <Text c=\"dimmed\" size=\"sm\" ta=\"center\" mt={20}>\n          Already have an account?{' '}\n          <Anchor size=\"sm\" href={signInUrl}>\n            Sign in\n          </Anchor>\n        </Text>\n      </Paper>\n    </Container>\n  );\n}","'use client';\n\nimport React, { ReactElement } from 'react';\nimport {\n  Menu,\n  Avatar,\n  Text,\n  Group,\n  UnstyledButton,\n  rem,\n  Divider,\n  Box,\n} from '@mantine/core';\nimport {\n  IconLogout,\n  IconSettings,\n  IconUser,\n  IconChevronDown,\n} from '@tabler/icons-react';\nimport { UserButtonProps, UserButtonMenuItemProps, UserButtonLinkProps } from './UserButton.types';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useRouter } from 'next/navigation';\nimport classes from './UserButton.module.css';\n\n// Sub-components\nfunction MenuItems({ children }: { children: ReactNode }) {\n  return <>{children}</>;\n}\n\nfunction Link({ children, href, icon, onClick, color, disabled }: UserButtonLinkProps) {\n  const router = useRouter();\n  \n  const handleClick = () => {\n    if (onClick) {\n      onClick();\n    } else {\n      router.push(href);\n    }\n  };\n\n  return (\n    <Menu.Item\n      leftSection={icon}\n      onClick={handleClick}\n      color={color}\n      disabled={disabled}\n    >\n      {children}\n    </Menu.Item>\n  );\n}\n\nfunction Action({ children, onClick, icon, color, disabled }: UserButtonMenuItemProps) {\n  return (\n    <Menu.Item\n      leftSection={icon}\n      onClick={onClick}\n      color={color}\n      disabled={disabled}\n    >\n      {children}\n    </Menu.Item>\n  );\n}\n\n// Main component\nexport function UserButton({\n  afterSignOutUrl = '/',\n  afterMultiSessionSingleSignOutUrl,\n  afterSwitchSessionUrl,\n  appearance,\n  showName = false,\n  children,\n  className,\n  style,\n}: UserButtonProps) {\n  const { user, signOut } = useAuth();\n  const router = useRouter();\n\n  if (!user) {\n    return null;\n  }\n\n  const handleSignOut = async () => {\n    await signOut();\n    router.push(afterSignOutUrl);\n  };\n\n  const displayName = user.displayName || user.email?.split('@')[0] || 'User';\n  const avatarUrl = user.photoURL || undefined;\n  const initials = displayName\n    .split(' ')\n    .map(n => n[0])\n    .join('')\n    .toUpperCase()\n    .slice(0, 2);\n\n  // Extract custom menu items from children\n  let customMenuItems: ReactElement[] = [];\n  if (children) {\n    React.Children.forEach(children, (child) => {\n      if (React.isValidElement(child) && child.type === MenuItems) {\n        React.Children.forEach(child.props.children, (menuItem) => {\n          if (React.isValidElement(menuItem)) {\n            customMenuItems.push(menuItem);\n          }\n        });\n      }\n    });\n  }\n\n  return (\n    <Menu\n      width={260}\n      position=\"bottom-end\"\n      transitionProps={{ transition: 'pop-top-right' }}\n      withinPortal\n    >\n      <Menu.Target>\n        <UnstyledButton\n          className={`${classes.user} ${className || ''}`}\n          style={style}\n        >\n          <Group gap={7}>\n            <Avatar\n              src={avatarUrl}\n              alt={displayName}\n              radius=\"xl\"\n              size={28}\n              className={appearance?.elements?.avatarBox}\n            >\n              {!avatarUrl && initials}\n            </Avatar>\n            {showName && (\n              <>\n                <Text fw={500} size=\"sm\" lh={1} mr={3}>\n                  {displayName}\n                </Text>\n                <IconChevronDown size={rem(12)} stroke={1.5} />\n              </>\n            )}\n          </Group>\n        </UnstyledButton>\n      </Menu.Target>\n\n      <Menu.Dropdown>\n        <Box px=\"xs\" py=\"sm\">\n          <Group>\n            <Avatar\n              src={avatarUrl}\n              alt={displayName}\n              radius=\"xl\"\n              size={40}\n            >\n              {!avatarUrl && initials}\n            </Avatar>\n            <div style={{ flex: 1 }}>\n              <Text size=\"sm\" fw={500}>\n                {displayName}\n              </Text>\n              <Text c=\"dimmed\" size=\"xs\">\n                {user.email}\n              </Text>\n            </div>\n          </Group>\n        </Box>\n\n        <Divider />\n\n        <Menu.Item\n          leftSection={<IconUser size={rem(14)} stroke={1.5} />}\n          onClick={() => router.push('/user-profile')}\n        >\n          Manage account\n        </Menu.Item>\n\n        {customMenuItems.length > 0 && (\n          <>\n            <Divider />\n            {customMenuItems}\n          </>\n        )}\n\n        <Divider />\n\n        <Menu.Item\n          leftSection={<IconLogout size={rem(14)} stroke={1.5} />}\n          onClick={handleSignOut}\n          color=\"red\"\n        >\n          Sign out\n        </Menu.Item>\n      </Menu.Dropdown>\n    </Menu>\n  );\n}\n\n// Attach sub-components\nUserButton.MenuItems = MenuItems;\nUserButton.Link = Link;\nUserButton.Action = Action;",".user {\n  padding: var(--mantine-spacing-xs);\n  border-radius: var(--mantine-radius-sm);\n  transition: background-color 150ms ease;\n  cursor: pointer;\n  \n  &:hover {\n    background-color: light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-6));\n  }\n  \n  &:active {\n    transform: translateY(1px);\n  }\n}","'use client';\n\nimport React, { useState, ReactElement } from 'react';\nimport {\n  Container,\n  Paper,\n  Tabs,\n  Stack,\n  Title,\n  Text,\n  Avatar,\n  Group,\n  TextInput,\n  Button,\n  PasswordInput,\n  Alert,\n  Box,\n  rem,\n} from '@mantine/core';\nimport {\n  IconUser,\n  IconLock,\n  IconSettings,\n  IconAlertCircle,\n  IconCheck,\n} from '@tabler/icons-react';\nimport { useForm } from '@mantine/form';\nimport { UserProfileProps, UserProfilePageProps } from './UserProfile.types';\nimport { useUser } from '../../hooks/useUser';\nimport { notifications } from '@mantine/notifications';\n\n// Sub-component for custom pages\nfunction Page({ label, labelIcon, children }: UserProfilePageProps) {\n  return <div data-label={label}>{children}</div>;\n}\n\nexport function UserProfile({\n  appearance,\n  children,\n  className,\n  style,\n}: UserProfileProps) {\n  const { user, refreshUser } = useUser();\n  const [activeTab, setActiveTab] = useState<string | null>('profile');\n  const [loading, setLoading] = useState(false);\n\n  // Extract custom pages from children\n  const customPages: Array<{ label: string; icon?: ReactNode; content: ReactNode }> = [];\n  if (children) {\n    React.Children.forEach(children, (child) => {\n      if (React.isValidElement(child) && child.type === Page) {\n        const pageProps = child.props as UserProfilePageProps;\n        customPages.push({\n          label: pageProps.label,\n          icon: pageProps.labelIcon,\n          content: pageProps.children,\n        });\n      }\n    });\n  }\n\n  const profileForm = useForm({\n    initialValues: {\n      displayName: user?.displayName || '',\n      email: user?.email || '',\n    },\n  });\n\n  const passwordForm = useForm({\n    initialValues: {\n      currentPassword: '',\n      newPassword: '',\n      confirmPassword: '',\n    },\n    validate: {\n      newPassword: (value) => {\n        if (!value) return 'New password is required';\n        if (value.length < 8) return 'Password must be at least 8 characters';\n        return null;\n      },\n      confirmPassword: (value, values) =>\n        value !== values.newPassword ? 'Passwords do not match' : null,\n    },\n  });\n\n  const handleProfileUpdate = async (values: any) => {\n    setLoading(true);\n    try {\n      // Update profile logic here\n      await refreshUser();\n      notifications.show({\n        title: 'Profile updated',\n        message: 'Your profile has been updated successfully',\n        color: 'green',\n        icon: <IconCheck size={16} />,\n      });\n    } catch (error: any) {\n      notifications.show({\n        title: 'Update failed',\n        message: error.message || 'Failed to update profile',\n        color: 'red',\n        icon: <IconAlertCircle size={16} />,\n      });\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  const handlePasswordUpdate = async (values: any) => {\n    setLoading(true);\n    try {\n      // Update password logic here\n      notifications.show({\n        title: 'Password updated',\n        message: 'Your password has been updated successfully',\n        color: 'green',\n        icon: <IconCheck size={16} />,\n      });\n      passwordForm.reset();\n    } catch (error: any) {\n      notifications.show({\n        title: 'Update failed',\n        message: error.message || 'Failed to update password',\n        color: 'red',\n        icon: <IconAlertCircle size={16} />,\n      });\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  if (!user) {\n    return null;\n  }\n\n  const displayName = user.displayName || user.email?.split('@')[0] || 'User';\n  const avatarUrl = user.photoURL || undefined;\n  const initials = displayName\n    .split(' ')\n    .map(n => n[0])\n    .join('')\n    .toUpperCase()\n    .slice(0, 2);\n\n  return (\n    <Container size=\"md\" className={className} style={style}>\n      <Paper shadow=\"sm\" radius=\"md\" p=\"lg\">\n        <Stack>\n          <Box>\n            <Group mb=\"md\">\n              <Avatar\n                src={avatarUrl}\n                alt={displayName}\n                radius=\"xl\"\n                size=\"xl\"\n              >\n                {!avatarUrl && initials}\n              </Avatar>\n              <div>\n                <Title order={3}>{displayName}</Title>\n                <Text c=\"dimmed\" size=\"sm\">{user.email}</Text>\n              </div>\n            </Group>\n          </Box>\n\n          <Tabs value={activeTab} onChange={setActiveTab}>\n            <Tabs.List>\n              <Tabs.Tab value=\"profile\" leftSection={<IconUser size={rem(16)} />}>\n                Profile\n              </Tabs.Tab>\n              <Tabs.Tab value=\"security\" leftSection={<IconLock size={rem(16)} />}>\n                Security\n              </Tabs.Tab>\n              {customPages.map((page, index) => (\n                <Tabs.Tab\n                  key={index}\n                  value={`custom-${index}`}\n                  leftSection={page.icon}\n                >\n                  {page.label}\n                </Tabs.Tab>\n              ))}\n            </Tabs.List>\n\n            <Tabs.Panel value=\"profile\" pt=\"md\">\n              <form onSubmit={profileForm.onSubmit(handleProfileUpdate)}>\n                <Stack>\n                  <TextInput\n                    label=\"Display name\"\n                    placeholder=\"Your name\"\n                    {...profileForm.getInputProps('displayName')}\n                    disabled={loading}\n                  />\n                  \n                  <TextInput\n                    label=\"Email\"\n                    placeholder=\"your@email.com\"\n                    {...profileForm.getInputProps('email')}\n                    disabled\n                  />\n\n                  <Group>\n                    <Button type=\"submit\" loading={loading}>\n                      Update profile\n                    </Button>\n                  </Group>\n                </Stack>\n              </form>\n            </Tabs.Panel>\n\n            <Tabs.Panel value=\"security\" pt=\"md\">\n              <form onSubmit={passwordForm.onSubmit(handlePasswordUpdate)}>\n                <Stack>\n                  <PasswordInput\n                    label=\"Current password\"\n                    placeholder=\"Enter current password\"\n                    {...passwordForm.getInputProps('currentPassword')}\n                    disabled={loading}\n                  />\n                  \n                  <PasswordInput\n                    label=\"New password\"\n                    placeholder=\"Enter new password\"\n                    {...passwordForm.getInputProps('newPassword')}\n                    disabled={loading}\n                  />\n                  \n                  <PasswordInput\n                    label=\"Confirm new password\"\n                    placeholder=\"Confirm new password\"\n                    {...passwordForm.getInputProps('confirmPassword')}\n                    disabled={loading}\n                  />\n\n                  <Group>\n                    <Button type=\"submit\" loading={loading}>\n                      Update password\n                    </Button>\n                  </Group>\n                </Stack>\n              </form>\n            </Tabs.Panel>\n\n            {customPages.map((page, index) => (\n              <Tabs.Panel key={index} value={`custom-${index}`} pt=\"md\">\n                {page.content}\n              </Tabs.Panel>\n            ))}\n          </Tabs>\n        </Stack>\n      </Paper>\n    </Container>\n  );\n}\n\n// Attach sub-component\nUserProfile.Page = Page;","'use client';\n\nimport { ReactNode } from 'react';\nimport { useAuth } from '../../hooks/useAuth';\n\ninterface SignedInProps {\n  children: ReactNode;\n}\n\nexport function SignedIn({ children }: SignedInProps) {\n  const { isAuthenticated } = useAuth();\n  \n  if (!isAuthenticated) {\n    return null;\n  }\n\n  return <>{children}</>;\n}","'use client';\n\nimport { ReactNode } from 'react';\nimport { useAuth } from '../../hooks/useAuth';\n\ninterface SignedOutProps {\n  children: ReactNode;\n}\n\nexport function SignedOut({ children }: SignedOutProps) {\n  const { isAuthenticated } = useAuth();\n  \n  if (isAuthenticated) {\n    return null;\n  }\n\n  return <>{children}</>;\n}","'use client';\n\nimport { ReactNode } from 'react';\nimport { useRole } from '../../hooks/useRole';\nimport { usePermission } from '../../hooks/usePermission';\n\ninterface ProtectProps {\n  children: ReactNode;\n  fallback?: ReactNode;\n  role?: string | string[];\n  permission?: string | string[];\n  condition?: 'and' | 'or';\n}\n\nexport function Protect({ \n  children, \n  fallback = null, \n  role, \n  permission,\n  condition = 'and' \n}: ProtectProps) {\n  const { hasRole } = useRole(role || []);\n  const { hasPermission, hasAnyPermission } = usePermission(permission || []);\n\n  let isAuthorized = true;\n\n  if (role && permission) {\n    if (condition === 'and') {\n      isAuthorized = hasRole && hasPermission;\n    } else {\n      isAuthorized = hasRole || hasAnyPermission;\n    }\n  } else if (role) {\n    isAuthorized = hasRole;\n  } else if (permission) {\n    isAuthorized = hasPermission;\n  }\n\n  if (!isAuthorized) {\n    return <>{fallback}</>;\n  }\n\n  return <>{children}</>;\n}","'use client';\n\nimport { useEffect } from 'react';\nimport { useRouter } from 'next/navigation';\nimport { useAuth } from '../../hooks/useAuth';\n\ninterface RedirectToSignInProps {\n  returnUrl?: string;\n  signInUrl?: string;\n}\n\nexport function RedirectToSignIn({ \n  returnUrl,\n  signInUrl = '/sign-in' \n}: RedirectToSignInProps) {\n  const router = useRouter();\n  const { isAuthenticated, loading } = useAuth();\n\n  useEffect(() => {\n    if (!loading && !isAuthenticated) {\n      const url = new URL(signInUrl, window.location.origin);\n      if (returnUrl) {\n        url.searchParams.set('returnUrl', returnUrl);\n      }\n      router.push(url.toString());\n    }\n  }, [isAuthenticated, loading, router, signInUrl, returnUrl]);\n\n  // Show nothing while checking auth\n  return null;\n}"],"mappings":"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","names":["firebaseSignOut","import_react","sendPasswordResetEmail","sendPasswordResetEmail","import_react","import_react","import_react","import_jsx_runtime","import_react","import_core","import_form","import_icons_react","import_navigation","import_jsx_runtime","import_react","import_core","import_icons_react","import_navigation","import_jsx_runtime","React","import_react","import_core","import_icons_react","import_form","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_navigation"]}