@marcwelti/mw-core 0.6.0 → 0.7.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.
@@ -38,4 +38,13 @@ interface AccountSettingsProps {
38
38
  }
39
39
  declare function AccountSettings({ user, firebaseUser, onUpdateEmail, onUpdatePassword, onDeleteAccount, onRefreshUser, logoutEndpoint, }: AccountSettingsProps): react_jsx_runtime.JSX.Element;
40
40
 
41
- export { AccountSettings, type AccountSettingsProps, type AccountSettingsUser, AuthDialog, type AuthDialogProps };
41
+ interface ThemeProviderProps {
42
+ children: React.ReactNode;
43
+ attribute?: 'class' | 'data-theme';
44
+ defaultTheme?: string;
45
+ enableSystem?: boolean;
46
+ storageKey?: string;
47
+ }
48
+ declare function ThemeProvider({ children, attribute, defaultTheme, enableSystem, storageKey, }: ThemeProviderProps): react_jsx_runtime.JSX.Element;
49
+
50
+ export { AccountSettings, type AccountSettingsProps, type AccountSettingsUser, AuthDialog, type AuthDialogProps, ThemeProvider, type ThemeProviderProps };
@@ -38,4 +38,13 @@ interface AccountSettingsProps {
38
38
  }
39
39
  declare function AccountSettings({ user, firebaseUser, onUpdateEmail, onUpdatePassword, onDeleteAccount, onRefreshUser, logoutEndpoint, }: AccountSettingsProps): react_jsx_runtime.JSX.Element;
40
40
 
41
- export { AccountSettings, type AccountSettingsProps, type AccountSettingsUser, AuthDialog, type AuthDialogProps };
41
+ interface ThemeProviderProps {
42
+ children: React.ReactNode;
43
+ attribute?: 'class' | 'data-theme';
44
+ defaultTheme?: string;
45
+ enableSystem?: boolean;
46
+ storageKey?: string;
47
+ }
48
+ declare function ThemeProvider({ children, attribute, defaultTheme, enableSystem, storageKey, }: ThemeProviderProps): react_jsx_runtime.JSX.Element;
49
+
50
+ export { AccountSettings, type AccountSettingsProps, type AccountSettingsUser, AuthDialog, type AuthDialogProps, ThemeProvider, type ThemeProviderProps };
@@ -8,6 +8,7 @@ var firestore = require('firebase/firestore');
8
8
  var storage = require('firebase/storage');
9
9
  var mwUi = require('@marcwelti/mw-ui');
10
10
  var jsxRuntime = require('react/jsx-runtime');
11
+ var nextThemes = require('next-themes');
11
12
 
12
13
  function _interopNamespace(e) {
13
14
  if (e && e.__esModule) return e;
@@ -853,6 +854,63 @@ function AccountSettings({
853
854
  ] })
854
855
  ] });
855
856
  }
857
+ var THEME_COOKIE_NAME = "mw-theme";
858
+ function ThemeSyncWrapper({ children }) {
859
+ const { theme, setTheme } = nextThemes.useTheme();
860
+ React2.useEffect(() => {
861
+ const cookieTheme = getCookie(THEME_COOKIE_NAME);
862
+ if (cookieTheme && cookieTheme !== theme) {
863
+ setTheme(cookieTheme);
864
+ }
865
+ }, []);
866
+ React2.useEffect(() => {
867
+ if (theme) {
868
+ setCookie(THEME_COOKIE_NAME, theme);
869
+ }
870
+ }, [theme]);
871
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children });
872
+ }
873
+ function getCookie(name) {
874
+ if (typeof document === "undefined") return null;
875
+ const value = `; ${document.cookie}`;
876
+ const parts = value.split(`; ${name}=`);
877
+ if (parts.length === 2) {
878
+ return parts.pop()?.split(";").shift() || null;
879
+ }
880
+ return null;
881
+ }
882
+ function setCookie(name, value) {
883
+ if (typeof document === "undefined") return;
884
+ const hostname = window.location.hostname;
885
+ if (hostname === "localhost" || hostname === "127.0.0.1") {
886
+ document.cookie = `${name}=${value}; path=/; max-age=31536000; SameSite=Lax`;
887
+ return;
888
+ }
889
+ const parts = hostname.split(".");
890
+ let domain = hostname;
891
+ if (parts.length >= 2) {
892
+ domain = `.${parts.slice(-2).join(".")}`;
893
+ }
894
+ document.cookie = `${name}=${value}; path=/; domain=${domain}; max-age=31536000; SameSite=Lax`;
895
+ }
896
+ function ThemeProvider({
897
+ children,
898
+ attribute = "class",
899
+ defaultTheme = "system",
900
+ enableSystem = true,
901
+ storageKey = "theme"
902
+ }) {
903
+ return /* @__PURE__ */ jsxRuntime.jsx(
904
+ nextThemes.ThemeProvider,
905
+ {
906
+ attribute,
907
+ defaultTheme,
908
+ enableSystem,
909
+ storageKey,
910
+ children: /* @__PURE__ */ jsxRuntime.jsx(ThemeSyncWrapper, { children })
911
+ }
912
+ );
913
+ }
856
914
  /*! Bundled license information:
857
915
 
858
916
  lucide-react/dist/esm/shared/src/utils.js:
@@ -877,5 +935,6 @@ lucide-react/dist/esm/lucide-react.js:
877
935
 
878
936
  exports.AccountSettings = AccountSettings;
879
937
  exports.AuthDialog = AuthDialog;
938
+ exports.ThemeProvider = ThemeProvider;
880
939
  //# sourceMappingURL=index.js.map
881
940
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/firebase/config.ts","../../src/firebase/auth.ts","../../src/components/AuthDialog.tsx","../../node_modules/shared/src/utils.ts","../../node_modules/lucide-react/src/defaultAttributes.ts","../../node_modules/lucide-react/src/Icon.ts","../../node_modules/lucide-react/src/createLucideIcon.ts","../../node_modules/lucide-react/src/icons/circle-alert.ts","../../node_modules/lucide-react/src/icons/circle-check-big.ts","../../node_modules/lucide-react/src/icons/key-round.ts","../../node_modules/lucide-react/src/icons/mail.ts","../../node_modules/lucide-react/src/icons/pen.ts","../../node_modules/lucide-react/src/icons/trash-2.ts","../../node_modules/lucide-react/src/icons/triangle-alert.ts","../../src/components/AccountSettings.tsx"],"names":["getApps","getApp","initializeApp","getAuth","getFirestore","getStorage","auth","signInWithEmailAndPassword","createUserWithEmailAndPassword","GoogleAuthProvider","signInWithPopup","jsxs","jsx","React","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Label","Input","Alert","AlertDescription","Button","Separator","Fragment","forwardRef","createElement","React2","Card","CardHeader","CardTitle","CardDescription","CardContent"],"mappings":"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","file":"index.js","sourcesContent":["import { initializeApp, getApps, getApp, FirebaseApp } from 'firebase/app';\nimport { getAuth, Auth } from 'firebase/auth';\nimport { getFirestore, Firestore } from 'firebase/firestore';\nimport { getStorage, FirebaseStorage } from 'firebase/storage';\n\n/**\n * Firebase configuration interface\n * All values should be provided via environment variables\n */\nexport interface FirebaseConfig {\n apiKey: string;\n authDomain: string;\n projectId: string;\n storageBucket: string;\n messagingSenderId: string;\n appId: string;\n measurementId?: string;\n}\n\n/**\n * Get Firebase configuration from environment variables\n * Works with Next.js NEXT_PUBLIC_ prefix\n */\nexport function getFirebaseConfig(): FirebaseConfig {\n const config: FirebaseConfig = {\n apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY || '',\n authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN || '',\n projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID || '',\n storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET || '',\n messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID || '',\n appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID || '',\n measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID,\n };\n\n // Validate required fields\n const requiredFields: (keyof FirebaseConfig)[] = [\n 'apiKey',\n 'authDomain',\n 'projectId',\n 'storageBucket',\n 'messagingSenderId',\n 'appId',\n ];\n\n const missingFields = requiredFields.filter((field) => !config[field]);\n\n if (missingFields.length > 0) {\n console.warn(\n `[mw-core] Missing Firebase config fields: ${missingFields.join(', ')}. ` +\n `Make sure to set NEXT_PUBLIC_FIREBASE_* environment variables.`\n );\n }\n\n return config;\n}\n\n/**\n * Initialize Firebase app (singleton pattern)\n * Safe to call multiple times - returns existing instance if already initialized\n */\nexport function initializeFirebase(config?: FirebaseConfig): FirebaseApp {\n if (getApps().length > 0) {\n return getApp();\n }\n\n const firebaseConfig = config || getFirebaseConfig();\n return initializeApp(firebaseConfig);\n}\n\n// Lazy initialization singletons\nlet _app: FirebaseApp | null = null;\nlet _auth: Auth | null = null;\nlet _db: Firestore | null = null;\nlet _storage: FirebaseStorage | null = null;\n\n/**\n * Get the Firebase app instance\n */\nexport function getFirebaseApp(): FirebaseApp {\n if (!_app) {\n _app = initializeFirebase();\n }\n return _app;\n}\n\n/**\n * Get the Firebase Auth instance\n */\nexport function getFirebaseAuth(): Auth {\n if (!_auth) {\n _auth = getAuth(getFirebaseApp());\n }\n return _auth;\n}\n\n/**\n * Get the Firestore database instance\n * Supports named databases via NEXT_PUBLIC_FIRESTORE_DATABASE_ID env var\n */\nexport function getFirebaseFirestore(): Firestore {\n if (!_db) {\n const databaseId = process.env.NEXT_PUBLIC_FIRESTORE_DATABASE_ID;\n if (databaseId) {\n _db = getFirestore(getFirebaseApp(), databaseId);\n } else {\n _db = getFirestore(getFirebaseApp());\n }\n }\n return _db;\n}\n\n/**\n * Get the Firebase Storage instance\n */\nexport function getFirebaseStorage(): FirebaseStorage {\n if (!_storage) {\n _storage = getStorage(getFirebaseApp());\n }\n return _storage;\n}\n\n// Convenience exports for direct access\nexport const app = typeof window !== 'undefined' ? getFirebaseApp() : null;\nexport const auth = typeof window !== 'undefined' ? getFirebaseAuth() : null;\nexport const db = typeof window !== 'undefined' ? getFirebaseFirestore() : null;\nexport const storage = typeof window !== 'undefined' ? getFirebaseStorage() : null;\n\n","import {\n signInWithEmailAndPassword,\n createUserWithEmailAndPassword,\n signOut as firebaseSignOut,\n sendPasswordResetEmail,\n sendEmailVerification,\n updateProfile,\n updatePassword as firebaseUpdatePassword,\n GoogleAuthProvider,\n EmailAuthProvider,\n signInWithPopup,\n signInWithRedirect,\n getRedirectResult,\n onAuthStateChanged,\n reauthenticateWithCredential as firebaseReauthenticateWithCredential,\n reauthenticateWithPopup as firebaseReauthenticateWithPopup,\n verifyBeforeUpdateEmail as firebaseVerifyBeforeUpdateEmail,\n deleteUser as firebaseDeleteUser,\n getAdditionalUserInfo as firebaseGetAdditionalUserInfo,\n User,\n UserCredential,\n Auth,\n AuthCredential,\n} from 'firebase/auth';\nimport { getFirebaseAuth } from './config';\n\n/**\n * Sign in with email and password\n */\nexport async function signInWithEmail(\n email: string,\n password: string\n): Promise<UserCredential> {\n const auth = getFirebaseAuth();\n return signInWithEmailAndPassword(auth, email, password);\n}\n\n/**\n * Create a new account with email and password\n */\nexport async function signUpWithEmail(\n email: string,\n password: string,\n displayName?: string\n): Promise<UserCredential> {\n const auth = getFirebaseAuth();\n const credential = await createUserWithEmailAndPassword(auth, email, password);\n \n if (displayName && credential.user) {\n await updateProfile(credential.user, { displayName });\n }\n \n return credential;\n}\n\n/**\n * Sign out the current user\n */\nexport async function signOut(): Promise<void> {\n const auth = getFirebaseAuth();\n return firebaseSignOut(auth);\n}\n\n/**\n * Send a password reset email\n */\nexport async function resetPassword(email: string): Promise<void> {\n const auth = getFirebaseAuth();\n return sendPasswordResetEmail(auth, email);\n}\n\n/**\n * Send email verification to the current user\n */\nexport async function sendVerificationEmail(user: User): Promise<void> {\n return sendEmailVerification(user);\n}\n\n/**\n * Update the current user's profile\n */\nexport async function updateUserProfile(\n user: User,\n profile: { displayName?: string; photoURL?: string }\n): Promise<void> {\n return updateProfile(user, profile);\n}\n\n/**\n * Sign in with Google using popup\n */\nexport async function signInWithGoogle(): Promise<UserCredential> {\n const auth = getFirebaseAuth();\n const provider = new GoogleAuthProvider();\n provider.addScope('email');\n provider.addScope('profile');\n return signInWithPopup(auth, provider);\n}\n\n/**\n * Sign in with Google using redirect (better for mobile)\n */\nexport async function signInWithGoogleRedirect(): Promise<void> {\n const auth = getFirebaseAuth();\n const provider = new GoogleAuthProvider();\n provider.addScope('email');\n provider.addScope('profile');\n return signInWithRedirect(auth, provider);\n}\n\n/**\n * Get the result of a redirect sign-in\n */\nexport async function getGoogleRedirectResult(): Promise<UserCredential | null> {\n const auth = getFirebaseAuth();\n return getRedirectResult(auth);\n}\n\n/**\n * Subscribe to auth state changes\n */\nexport function subscribeToAuthState(\n callback: (user: User | null) => void\n): () => void {\n const auth = getFirebaseAuth();\n return onAuthStateChanged(auth, callback);\n}\n\n/**\n * Get the current user (may be null if not authenticated)\n */\nexport function getCurrentUser(): User | null {\n const auth = getFirebaseAuth();\n return auth.currentUser;\n}\n\n/**\n * Wait for the auth state to be determined\n * Useful for SSR/initial load\n */\nexport function waitForAuthState(): Promise<User | null> {\n return new Promise((resolve) => {\n const auth = getFirebaseAuth();\n const unsubscribe = onAuthStateChanged(auth, (user) => {\n unsubscribe();\n resolve(user);\n });\n });\n}\n\n/**\n * Update the current user's password\n * Requires recent authentication\n */\nexport async function updatePassword(\n user: User,\n newPassword: string\n): Promise<void> {\n return firebaseUpdatePassword(user, newPassword);\n}\n\n/**\n * Re-authenticate user with email/password credential\n * Required before sensitive operations like password change, email change, account deletion\n */\nexport async function reauthenticateWithCredential(\n user: User,\n credential: AuthCredential\n): Promise<UserCredential> {\n return firebaseReauthenticateWithCredential(user, credential);\n}\n\n/**\n * Re-authenticate user with Google popup\n * Required before sensitive operations for Google-authenticated users\n */\nexport async function reauthenticateWithPopup(\n user: User\n): Promise<UserCredential> {\n const provider = new GoogleAuthProvider();\n return firebaseReauthenticateWithPopup(user, provider);\n}\n\n/**\n * Send verification email to new email address before updating\n * User must verify new email before it becomes active\n */\nexport async function verifyBeforeUpdateEmail(\n user: User,\n newEmail: string\n): Promise<void> {\n return firebaseVerifyBeforeUpdateEmail(user, newEmail);\n}\n\n/**\n * Delete the authenticated user\n * Requires recent authentication\n */\nexport async function deleteUser(user: User): Promise<void> {\n return firebaseDeleteUser(user);\n}\n\n/**\n * Get additional user info from credential (e.g., isNewUser)\n */\nexport function getAdditionalUserInfo(credential: UserCredential) {\n return firebaseGetAdditionalUserInfo(credential);\n}\n\n/**\n * Create email/password credential for re-authentication\n */\nexport function createEmailCredential(email: string, password: string): AuthCredential {\n return EmailAuthProvider.credential(email, password);\n}\n\n/**\n * Get the Firebase Auth instance\n */\nexport function getAuth(): Auth {\n return getFirebaseAuth();\n}\n\n/**\n * Convenience: Reauthenticate with password\n * @returns Promise<UserCredential>\n */\nexport async function reauthenticateWithPassword(\n user: User,\n password: string\n): Promise<UserCredential> {\n if (!user.email) throw new Error('User email not found');\n const credential = EmailAuthProvider.credential(user.email, password);\n return firebaseReauthenticateWithCredential(user, credential);\n}\n\n/**\n * Convenience: Reauthenticate with Google\n * @returns Promise<UserCredential> or false if user cancelled\n */\nexport async function reauthenticateWithGoogle(\n user: User\n): Promise<UserCredential | false> {\n try {\n const provider = new GoogleAuthProvider();\n return await firebaseReauthenticateWithPopup(user, provider);\n } catch (error: any) {\n if (error.code === 'auth/popup-closed-by-user' || error.code === 'auth/cancelled-popup-request') {\n return false; // User cancelled\n }\n throw error;\n }\n}\n\n/**\n * Update user email (requires recent authentication)\n */\nexport async function updateUserEmail(user: User, newEmail: string): Promise<void> {\n const { updateEmail: firebaseUpdateEmail } = await import('firebase/auth');\n return firebaseUpdateEmail(user, newEmail);\n}\n\n/**\n * Update user password (requires recent authentication)\n */\nexport async function updateUserPassword(user: User, newPassword: string): Promise<void> {\n return firebaseUpdatePassword(user, newPassword);\n}\n\n// Re-export useful types\nexport type { User, UserCredential, Auth, AuthCredential };\n\n// Re-export providers for direct use\nexport { GoogleAuthProvider, EmailAuthProvider };\n\n","'use client';\n\nimport * as React from 'react';\nimport { signInWithEmail, signInWithGoogle, signUpWithEmail } from '../firebase/auth';\nimport {\n Button,\n Input,\n Label,\n Alert,\n AlertDescription,\n Separator,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n} from '@marcwelti/mw-ui';\n\n// ---------------------------------------------------------------------------\n// Error helper\n// ---------------------------------------------------------------------------\n\nfunction getAuthErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n if (error.message.includes('auth/user-not-found')) return 'Kein Account mit dieser E-Mail gefunden.';\n if (error.message.includes('auth/wrong-password')) return 'Falsches Passwort.';\n if (error.message.includes('auth/too-many-requests')) return 'Zu viele Versuche. Bitte warte einen Moment.';\n if (error.message.includes('auth/invalid-credential')) return 'Ungültige Anmeldedaten.';\n if (error.message.includes('auth/popup-closed-by-user')) return 'Anmeldung abgebrochen.';\n if (error.message.includes('auth/email-already-in-use')) return 'Diese E-Mail wird bereits verwendet.';\n if (error.message.includes('auth/weak-password')) return 'Passwort ist zu schwach.';\n if (error.message.includes('auth/invalid-email')) return 'Ungültige E-Mail-Adresse.';\n return error.message;\n }\n return 'Ein Fehler ist aufgetreten.';\n}\n\n// ---------------------------------------------------------------------------\n// Google SVG icon\n// ---------------------------------------------------------------------------\n\nfunction GoogleIcon() {\n return (\n <svg className=\"h-5 w-5 mr-2\" viewBox=\"0 0 24 24\">\n <path fill=\"#4285F4\" 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\" />\n <path fill=\"#34A853\" 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\" />\n <path fill=\"#FBBC05\" 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\" />\n <path fill=\"#EA4335\" 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\" />\n </svg>\n );\n}\n\n// ---------------------------------------------------------------------------\n// AuthDialog\n// ---------------------------------------------------------------------------\n\nexport interface AuthDialogProps {\n /** Whether the dialog is open. */\n open: boolean;\n /** Called when the dialog open state changes. */\n onOpenChange: (open: boolean) => void;\n /** Called after successful authentication. Use this to reload the session. */\n onSuccess: () => void;\n /** URL for the session creation endpoint. Defaults to '/api/auth/login'. */\n sessionEndpoint?: string;\n /** Default mode: 'login' or 'register'. Defaults to 'login'. */\n defaultMode?: 'login' | 'register';\n}\n\nexport function AuthDialog({\n open,\n onOpenChange,\n onSuccess,\n sessionEndpoint = '/api/auth/login',\n defaultMode = 'login',\n}: AuthDialogProps) {\n const [mode, setMode] = React.useState<'login' | 'register'>(defaultMode);\n const [email, setEmail] = React.useState('');\n const [password, setPassword] = React.useState('');\n const [confirmPassword, setConfirmPassword] = React.useState('');\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n\n const resetForm = React.useCallback(() => {\n setEmail('');\n setPassword('');\n setConfirmPassword('');\n setError(null);\n setLoading(false);\n }, []);\n\n // Reset mode to default when dialog opens\n React.useEffect(() => {\n if (open) {\n setMode(defaultMode);\n resetForm();\n }\n }, [open, defaultMode, resetForm]);\n\n const createSession = async (idToken: string) => {\n const response = await fetch(sessionEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ idToken }),\n });\n if (!response.ok) throw new Error('Sitzung konnte nicht erstellt werden.');\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n\n if (mode === 'register' && password !== confirmPassword) {\n setError('Passwörter stimmen nicht überein.');\n return;\n }\n if (mode === 'register' && password.length < 8) {\n setError('Passwort muss mindestens 8 Zeichen lang sein.');\n return;\n }\n\n setLoading(true);\n try {\n const credential = mode === 'login'\n ? await signInWithEmail(email, password)\n : await signUpWithEmail(email, password);\n const idToken = await credential.user.getIdToken();\n await createSession(idToken);\n resetForm();\n onOpenChange(false);\n onSuccess();\n } catch (err) {\n setError(getAuthErrorMessage(err));\n } finally {\n setLoading(false);\n }\n };\n\n const handleGoogle = async () => {\n setError(null);\n setLoading(true);\n try {\n const credential = await signInWithGoogle();\n const idToken = await credential.user.getIdToken();\n await createSession(idToken);\n resetForm();\n onOpenChange(false);\n onSuccess();\n } catch (err) {\n setError(getAuthErrorMessage(err));\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <Dialog open={open} onOpenChange={(v) => { onOpenChange(v); if (!v) resetForm(); }}>\n <DialogContent className=\"!max-w-md mx-4\">\n <DialogHeader>\n <DialogTitle className=\"text-xl\">\n {mode === 'login' ? 'Willkommen zurück' : 'Account erstellen'}\n </DialogTitle>\n <DialogDescription>\n {mode === 'login'\n ? 'Melde dich bei deinem Account an.'\n : 'Erstelle einen neuen Account.'}\n </DialogDescription>\n </DialogHeader>\n\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"auth-email\">E-Mail</Label>\n <Input\n id=\"auth-email\"\n type=\"email\"\n value={email}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setEmail(e.target.value)}\n placeholder=\"du@beispiel.ch\"\n required\n disabled={loading}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"auth-password\">Passwort</Label>\n <Input\n id=\"auth-password\"\n type=\"password\"\n value={password}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setPassword(e.target.value)}\n placeholder=\"••••••••\"\n required\n disabled={loading}\n minLength={mode === 'register' ? 8 : undefined}\n />\n </div>\n\n {mode === 'register' && (\n <div className=\"space-y-2\">\n <Label htmlFor=\"auth-confirm\">Passwort bestätigen</Label>\n <Input\n id=\"auth-confirm\"\n type=\"password\"\n value={confirmPassword}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setConfirmPassword(e.target.value)}\n placeholder=\"Passwort wiederholen\"\n required\n disabled={loading}\n />\n </div>\n )}\n\n {error && (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n\n <Button type=\"submit\" className=\"w-full\" disabled={loading}>\n {loading\n ? 'Wird geladen...'\n : mode === 'login'\n ? 'Anmelden'\n : 'Account erstellen'}\n </Button>\n </form>\n\n <div className=\"flex items-center gap-4\">\n <Separator className=\"flex-1\" />\n <span className=\"text-sm text-muted-foreground\">oder</span>\n <Separator className=\"flex-1\" />\n </div>\n\n <Button\n type=\"button\"\n intent=\"secondary\"\n background=\"solid\"\n className=\"w-full\"\n onClick={handleGoogle}\n disabled={loading}\n >\n <GoogleIcon />\n Mit Google anmelden\n </Button>\n\n <div className=\"text-center text-sm text-muted-foreground\">\n {mode === 'login' ? (\n <>\n Noch kein Account?{' '}\n <button\n type=\"button\"\n onClick={() => { setMode('register'); setError(null); }}\n className=\"text-brand-gold hover:underline\"\n >\n Registrieren\n </button>\n </>\n ) : (\n <>\n Bereits ein Account?{' '}\n <button\n type=\"button\"\n onClick={() => { setMode('login'); setError(null); }}\n className=\"text-brand-gold hover:underline\"\n >\n Anmelden\n </button>\n </>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n\n","import { CamelToPascal } from './utility-types';\n\n/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n\n/**\n * Converts string to camel case\n *\n * @param {string} string\n * @returns {string} A camelized string\n */\nexport const toCamelCase = <T extends string>(string: T) =>\n string.replace(/^([A-Z])|[\\s-_]+(\\w)/g, (match, p1, p2) =>\n p2 ? p2.toUpperCase() : p1.toLowerCase(),\n );\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = toCamelCase(string);\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n\n/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return (\n Boolean(className) &&\n (className as string).trim() !== '' &&\n array.indexOf(className) === index\n );\n })\n .join(' ')\n .trim();\n","export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n","import { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses } from '@lucide/shared';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n {\n color = 'currentColor',\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = '',\n children,\n iconNode,\n ...rest\n },\n ref,\n ) => {\n return createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth,\n className: mergeClasses('lucide', className),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n );\n },\n);\n\nexport default Icon;\n","import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase } from '@lucide/shared';\nimport { IconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Create a Lucide icon component\n * @param {string} iconName\n * @param {array} iconNode\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst createLucideIcon = (iconName: string, iconNode: IconNode) => {\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(`lucide-${toKebabCase(iconName)}`, className),\n ...props,\n }),\n );\n\n Component.displayName = `${iconName}`;\n\n return Component;\n};\n\nexport default createLucideIcon;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name CircleAlert\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8bGluZSB4MT0iMTIiIHgyPSIxMiIgeTE9IjgiIHkyPSIxMiIgLz4KICA8bGluZSB4MT0iMTIiIHgyPSIxMi4wMSIgeTE9IjE2IiB5Mj0iMTYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/circle-alert\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleAlert = createLucideIcon('CircleAlert', [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['line', { x1: '12', x2: '12', y1: '8', y2: '12', key: '1pkeuh' }],\n ['line', { x1: '12', x2: '12.01', y1: '16', y2: '16', key: '4dfq90' }],\n]);\n\nexport default CircleAlert;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name CircleCheckBig\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEuODAxIDEwQTEwIDEwIDAgMSAxIDE3IDMuMzM1IiAvPgogIDxwYXRoIGQ9Im05IDExIDMgM0wyMiA0IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/circle-check-big\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleCheckBig = createLucideIcon('CircleCheckBig', [\n ['path', { d: 'M21.801 10A10 10 0 1 1 17 3.335', key: 'yps3ct' }],\n ['path', { d: 'm9 11 3 3L22 4', key: '1pflzl' }],\n]);\n\nexport default CircleCheckBig;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name KeyRound\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMi41ODYgMTcuNDE0QTIgMiAwIDAgMCAyIDE4LjgyOFYyMWExIDEgMCAwIDAgMSAxaDNhMSAxIDAgMCAwIDEtMXYtMWExIDEgMCAwIDEgMS0xaDFhMSAxIDAgMCAwIDEtMXYtMWExIDEgMCAwIDEgMS0xaC4xNzJhMiAyIDAgMCAwIDEuNDE0LS41ODZsLjgxNC0uODE0YTYuNSA2LjUgMCAxIDAtNC00eiIgLz4KICA8Y2lyY2xlIGN4PSIxNi41IiBjeT0iNy41IiByPSIuNSIgZmlsbD0iY3VycmVudENvbG9yIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/key-round\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst KeyRound = createLucideIcon('KeyRound', [\n [\n 'path',\n {\n d: 'M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z',\n key: '1s6t7t',\n },\n ],\n ['circle', { cx: '16.5', cy: '7.5', r: '.5', fill: 'currentColor', key: 'w0ekpg' }],\n]);\n\nexport default KeyRound;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Mail\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMjAiIGhlaWdodD0iMTYiIHg9IjIiIHk9IjQiIHJ4PSIyIiAvPgogIDxwYXRoIGQ9Im0yMiA3LTguOTcgNS43YTEuOTQgMS45NCAwIDAgMS0yLjA2IDBMMiA3IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/mail\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Mail = createLucideIcon('Mail', [\n ['rect', { width: '20', height: '16', x: '2', y: '4', rx: '2', key: '18n3k1' }],\n ['path', { d: 'm22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7', key: '1ocrg3' }],\n]);\n\nexport default Mail;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Pen\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEuMTc0IDYuODEyYTEgMSAwIDAgMC0zLjk4Ni0zLjk4N0wzLjg0MiAxNi4xNzRhMiAyIDAgMCAwLS41LjgzbC0xLjMyMSA0LjM1MmEuNS41IDAgMCAwIC42MjMuNjIybDQuMzUzLTEuMzJhMiAyIDAgMCAwIC44My0uNDk3eiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/pen\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Pen = createLucideIcon('Pen', [\n [\n 'path',\n {\n d: 'M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z',\n key: '1a8usu',\n },\n ],\n]);\n\nexport default Pen;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Trash2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyA2aDE4IiAvPgogIDxwYXRoIGQ9Ik0xOSA2djE0YzAgMS0xIDItMiAySDdjLTEgMC0yLTEtMi0yVjYiIC8+CiAgPHBhdGggZD0iTTggNlY0YzAtMSAxLTIgMi0yaDRjMSAwIDIgMSAyIDJ2MiIgLz4KICA8bGluZSB4MT0iMTAiIHgyPSIxMCIgeTE9IjExIiB5Mj0iMTciIC8+CiAgPGxpbmUgeDE9IjE0IiB4Mj0iMTQiIHkxPSIxMSIgeTI9IjE3IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/trash-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Trash2 = createLucideIcon('Trash2', [\n ['path', { d: 'M3 6h18', key: 'd0wm0j' }],\n ['path', { d: 'M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6', key: '4alrt4' }],\n ['path', { d: 'M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2', key: 'v07s0e' }],\n ['line', { x1: '10', x2: '10', y1: '11', y2: '17', key: '1uufr5' }],\n ['line', { x1: '14', x2: '14', y1: '11', y2: '17', key: 'xtxkd' }],\n]);\n\nexport default Trash2;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name TriangleAlert\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMjEuNzMgMTgtOC0xNGEyIDIgMCAwIDAtMy40OCAwbC04IDE0QTIgMiAwIDAgMCA0IDIxaDE2YTIgMiAwIDAgMCAxLjczLTMiIC8+CiAgPHBhdGggZD0iTTEyIDl2NCIgLz4KICA8cGF0aCBkPSJNMTIgMTdoLjAxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/triangle-alert\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst TriangleAlert = createLucideIcon('TriangleAlert', [\n [\n 'path',\n {\n d: 'm21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3',\n key: 'wmoenq',\n },\n ],\n ['path', { d: 'M12 9v4', key: 'juzpu7' }],\n ['path', { d: 'M12 17h.01', key: 'p32p05' }],\n]);\n\nexport default TriangleAlert;\n","'use client';\n\nimport * as React from 'react';\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Button,\n Input,\n Label,\n Alert,\n AlertDescription,\n} from '@marcwelti/mw-ui';\nimport {\n Mail,\n KeyRound,\n Trash2,\n AlertTriangle,\n Edit2,\n CheckCircle,\n AlertCircle,\n} from 'lucide-react';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface AccountSettingsUser {\n uid: string;\n email?: string;\n displayName?: string;\n emailVerified?: boolean;\n}\n\nexport interface AccountSettingsProps {\n /** Current user data */\n user: AccountSettingsUser | null;\n /** Firebase user object for provider checks */\n firebaseUser?: any;\n /** Called when user updates email */\n onUpdateEmail?: (newEmail: string, password: string) => Promise<void>;\n /** Called when user updates password */\n onUpdatePassword?: (currentPassword: string, newPassword: string) => Promise<void>;\n /** Called when user deletes account */\n onDeleteAccount?: (password?: string) => Promise<boolean | void>;\n /** Called to refresh user data */\n onRefreshUser?: () => Promise<void>;\n /** Session endpoint for logout */\n logoutEndpoint?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helper: Spinner Icon\n// ---------------------------------------------------------------------------\n\nfunction SpinnerIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Helper: Password Input\n// ---------------------------------------------------------------------------\n\nconst PasswordInput = React.forwardRef<\n HTMLInputElement,\n React.InputHTMLAttributes<HTMLInputElement>\n>((props, ref) => {\n return <Input {...props} ref={ref} type=\"password\" />;\n});\nPasswordInput.displayName = 'PasswordInput';\n\n// ---------------------------------------------------------------------------\n// AccountSettings Component\n// ---------------------------------------------------------------------------\n\nexport function AccountSettings({\n user,\n firebaseUser,\n onUpdateEmail,\n onUpdatePassword,\n onDeleteAccount,\n onRefreshUser,\n logoutEndpoint = '/api/auth/logout',\n}: AccountSettingsProps) {\n\n // Email change states\n const [showEmailChange, setShowEmailChange] = React.useState(false);\n const [newEmail, setNewEmail] = React.useState('');\n const [emailPassword, setEmailPassword] = React.useState('');\n const [emailLoading, setEmailLoading] = React.useState(false);\n const [emailError, setEmailError] = React.useState('');\n const [emailSuccess, setEmailSuccess] = React.useState(false);\n\n // Password change states\n const [showPasswordChange, setShowPasswordChange] = React.useState(false);\n const [currentPassword, setCurrentPassword] = React.useState('');\n const [newPassword, setNewPassword] = React.useState('');\n const [confirmPassword, setConfirmPassword] = React.useState('');\n const [passwordLoading, setPasswordLoading] = React.useState(false);\n const [passwordError, setPasswordError] = React.useState('');\n const [passwordSuccess, setPasswordSuccess] = React.useState(false);\n\n // Account deletion states\n const [showDeleteConfirm, setShowDeleteConfirm] = React.useState(false);\n const [deletePassword, setDeletePassword] = React.useState('');\n const [deleteConfirmText, setDeleteConfirmText] = React.useState('');\n const [deleteLoading, setDeleteLoading] = React.useState(false);\n const [deleteError, setDeleteError] = React.useState('');\n\n // Check if user has password provider\n const hasPasswordProvider = firebaseUser?.providerData?.some(\n (p: any) => p.providerId === 'password'\n );\n const hasGoogleProvider = firebaseUser?.providerData?.some(\n (p: any) => p.providerId === 'google.com'\n );\n\n // Handle email update\n const handleEmailUpdate = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!onUpdateEmail) return;\n\n setEmailError('');\n setEmailLoading(true);\n\n try {\n await onUpdateEmail(newEmail, emailPassword);\n setEmailSuccess(true);\n setNewEmail('');\n setEmailPassword('');\n setTimeout(() => {\n setShowEmailChange(false);\n setEmailSuccess(false);\n onRefreshUser?.();\n }, 2000);\n } catch (error: any) {\n setEmailError(error.message || 'Failed to update email');\n } finally {\n setEmailLoading(false);\n }\n };\n\n // Handle password update\n const handlePasswordUpdate = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!onUpdatePassword) return;\n\n if (newPassword !== confirmPassword) {\n setPasswordError('Passwords do not match');\n return;\n }\n if (newPassword.length < 8) {\n setPasswordError('Password must be at least 8 characters');\n return;\n }\n\n setPasswordError('');\n setPasswordLoading(true);\n\n try {\n await onUpdatePassword(currentPassword, newPassword);\n setPasswordSuccess(true);\n setCurrentPassword('');\n setNewPassword('');\n setConfirmPassword('');\n setTimeout(() => {\n setShowPasswordChange(false);\n setPasswordSuccess(false);\n }, 2000);\n } catch (error: any) {\n setPasswordError(error.message || 'Failed to update password');\n } finally {\n setPasswordLoading(false);\n }\n };\n\n // Handle account deletion\n const handleDeleteAccount = async () => {\n if (!onDeleteAccount) return;\n\n const needsPassword = hasPasswordProvider && !hasGoogleProvider;\n const needsConfirmText = hasGoogleProvider;\n\n if (needsPassword && !deletePassword) {\n setDeleteError('Please enter your password');\n return;\n }\n if (needsConfirmText && deleteConfirmText !== 'DELETE') {\n setDeleteError('Please type DELETE to confirm');\n return;\n }\n\n setDeleteLoading(true);\n setDeleteError('');\n\n try {\n const result = await onDeleteAccount(needsPassword ? deletePassword : undefined);\n if (result === false) {\n // User cancelled\n setDeleteLoading(false);\n return;\n }\n // Success - call logout endpoint and parent will handle redirect\n await fetch(logoutEndpoint, { method: 'POST' });\n // Parent component (page) should redirect after successful deletion\n } catch (error: any) {\n setDeleteError(error.message || 'Failed to delete account');\n setDeleteLoading(false);\n }\n };\n\n return (\n <div className=\"max-w-4xl mx-auto space-y-6\">\n {/* Email Section */}\n <Card className=\"bg-card border border-border shadow-lg\">\n <CardHeader>\n <CardTitle className=\"text-foreground\">Email Address</CardTitle>\n <CardDescription className=\"text-muted-foreground\">\n Manage your email address\n </CardDescription>\n </CardHeader>\n <CardContent>\n {!showEmailChange ? (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Mail className=\"h-5 w-5 text-brand-gold\" />\n <span className=\"text-foreground font-medium\">{user?.email}</span>\n </div>\n {hasPasswordProvider && user?.emailVerified && onUpdateEmail && (\n <Button\n intent=\"ghost\"\n size=\"sm\"\n onClick={() => setShowEmailChange(true)}\n >\n <Edit2 className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n {!user?.emailVerified && (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"h-4 w-4\" />\n <AlertDescription>\n Your email is not verified. Please check your inbox.\n </AlertDescription>\n </Alert>\n )}\n </div>\n ) : (\n <form onSubmit={handleEmailUpdate} className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"new-email\">New Email Address</Label>\n <Input\n id=\"new-email\"\n type=\"email\"\n value={newEmail}\n onChange={(e) => setNewEmail(e.target.value)}\n required\n disabled={emailLoading}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"email-password\">Current Password</Label>\n <PasswordInput\n id=\"email-password\"\n value={emailPassword}\n onChange={(e) => setEmailPassword(e.target.value)}\n required\n disabled={emailLoading}\n />\n </div>\n {emailError && (\n <Alert variant=\"destructive\">\n <AlertDescription>{emailError}</AlertDescription>\n </Alert>\n )}\n {emailSuccess && (\n <Alert className=\"bg-brand-gold/10 border-brand-gold/30\">\n <CheckCircle className=\"h-4 w-4 text-brand-gold\" />\n <AlertDescription className=\"text-brand-gold\">\n Email updated! Check your new email to verify.\n </AlertDescription>\n </Alert>\n )}\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n intent=\"secondary\"\n onClick={() => {\n setShowEmailChange(false);\n setEmailError('');\n setNewEmail('');\n setEmailPassword('');\n }}\n disabled={emailLoading}\n >\n Cancel\n </Button>\n <Button\n type=\"submit\"\n disabled={emailLoading || !newEmail || !emailPassword}\n >\n {emailLoading && <SpinnerIcon className=\"mr-2 h-4 w-4 animate-spin\" />}\n Update Email\n </Button>\n </div>\n </form>\n )}\n </CardContent>\n </Card>\n\n {/* Password Section - only for password providers */}\n {hasPasswordProvider && onUpdatePassword && (\n <Card className=\"bg-card border border-border shadow-lg\">\n <CardHeader>\n <CardTitle className=\"text-foreground\">Password</CardTitle>\n <CardDescription className=\"text-muted-foreground\">\n Change your password\n </CardDescription>\n </CardHeader>\n <CardContent>\n {!showPasswordChange ? (\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <KeyRound className=\"h-5 w-5 text-brand-gold\" />\n <span className=\"text-foreground font-medium\">••••••••••••</span>\n </div>\n <Button\n intent=\"ghost\"\n size=\"sm\"\n onClick={() => setShowPasswordChange(true)}\n >\n <Edit2 className=\"h-4 w-4\" />\n </Button>\n </div>\n ) : (\n <form onSubmit={handlePasswordUpdate} className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"current-password\">Current Password</Label>\n <PasswordInput\n id=\"current-password\"\n value={currentPassword}\n onChange={(e) => setCurrentPassword(e.target.value)}\n required\n disabled={passwordLoading}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"new-password\">New Password</Label>\n <PasswordInput\n id=\"new-password\"\n value={newPassword}\n onChange={(e) => setNewPassword(e.target.value)}\n required\n minLength={8}\n disabled={passwordLoading}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"confirm-password\">Confirm New Password</Label>\n <PasswordInput\n id=\"confirm-password\"\n value={confirmPassword}\n onChange={(e) => setConfirmPassword(e.target.value)}\n required\n disabled={passwordLoading}\n />\n </div>\n {passwordError && (\n <Alert variant=\"destructive\">\n <AlertDescription>{passwordError}</AlertDescription>\n </Alert>\n )}\n {passwordSuccess && (\n <Alert className=\"bg-brand-gold/10 border-brand-gold/30\">\n <CheckCircle className=\"h-4 w-4 text-brand-gold\" />\n <AlertDescription className=\"text-brand-gold\">\n Password updated successfully!\n </AlertDescription>\n </Alert>\n )}\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n intent=\"secondary\"\n onClick={() => {\n setShowPasswordChange(false);\n setPasswordError('');\n setCurrentPassword('');\n setNewPassword('');\n setConfirmPassword('');\n }}\n disabled={passwordLoading}\n >\n Cancel\n </Button>\n <Button\n type=\"submit\"\n disabled={\n passwordLoading ||\n !currentPassword ||\n !newPassword ||\n !confirmPassword ||\n newPassword !== confirmPassword\n }\n >\n {passwordLoading && <SpinnerIcon className=\"mr-2 h-4 w-4 animate-spin\" />}\n Update Password\n </Button>\n </div>\n </form>\n )}\n </CardContent>\n </Card>\n )}\n\n {/* Danger Zone - Account Deletion */}\n {onDeleteAccount && (\n <Card className=\"bg-card border border-border shadow-lg\">\n <CardHeader>\n <CardTitle className=\"text-foreground flex items-center gap-2\">\n <AlertTriangle className=\"h-5 w-5 text-red-500\" />\n Danger Zone\n </CardTitle>\n <CardDescription className=\"text-muted-foreground\">\n Permanently delete your account\n </CardDescription>\n </CardHeader>\n <CardContent>\n {!showDeleteConfirm ? (\n <Button\n intent=\"destructive\"\n onClick={() => setShowDeleteConfirm(true)}\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n Delete My Account\n </Button>\n ) : (\n <div className=\"space-y-4\">\n <Alert variant=\"destructive\" className=\"bg-red-900/20 border-red-900/40\">\n <AlertDescription>\n <p className=\"font-medium mb-2\">⚠️ This action cannot be undone!</p>\n <p>\n Your account and all associated data will be permanently deleted.\n </p>\n </AlertDescription>\n </Alert>\n\n {hasPasswordProvider && !hasGoogleProvider && (\n <div className=\"space-y-2\">\n <Label htmlFor=\"delete-password\">Enter Your Password</Label>\n <PasswordInput\n id=\"delete-password\"\n value={deletePassword}\n onChange={(e) => setDeletePassword(e.target.value)}\n placeholder=\"Enter your password to confirm\"\n disabled={deleteLoading}\n />\n </div>\n )}\n\n {hasGoogleProvider && (\n <div className=\"space-y-2\">\n <Label htmlFor=\"delete-confirm\">Type DELETE to confirm</Label>\n <Input\n id=\"delete-confirm\"\n value={deleteConfirmText}\n onChange={(e) => setDeleteConfirmText(e.target.value)}\n placeholder=\"DELETE\"\n disabled={deleteLoading}\n />\n </div>\n )}\n\n {deleteError && (\n <Alert variant=\"destructive\">\n <AlertDescription>{deleteError}</AlertDescription>\n </Alert>\n )}\n\n <div className=\"flex gap-2\">\n <Button\n intent=\"secondary\"\n onClick={() => {\n setShowDeleteConfirm(false);\n setDeleteError('');\n setDeletePassword('');\n setDeleteConfirmText('');\n }}\n disabled={deleteLoading}\n >\n Cancel\n </Button>\n <Button\n intent=\"destructive\"\n onClick={handleDeleteAccount}\n disabled={\n deleteLoading ||\n (hasPasswordProvider && !hasGoogleProvider && !deletePassword) ||\n (hasGoogleProvider && deleteConfirmText !== 'DELETE')\n }\n >\n {deleteLoading && <SpinnerIcon className=\"mr-2 h-4 w-4 animate-spin\" />}\n Yes, Delete My Account\n </Button>\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n )}\n </div>\n );\n}\n\n"]}
1
+ {"version":3,"sources":["../../src/firebase/config.ts","../../src/firebase/auth.ts","../../src/components/AuthDialog.tsx","../../node_modules/shared/src/utils.ts","../../node_modules/lucide-react/src/defaultAttributes.ts","../../node_modules/lucide-react/src/Icon.ts","../../node_modules/lucide-react/src/createLucideIcon.ts","../../node_modules/lucide-react/src/icons/circle-alert.ts","../../node_modules/lucide-react/src/icons/circle-check-big.ts","../../node_modules/lucide-react/src/icons/key-round.ts","../../node_modules/lucide-react/src/icons/mail.ts","../../node_modules/lucide-react/src/icons/pen.ts","../../node_modules/lucide-react/src/icons/trash-2.ts","../../node_modules/lucide-react/src/icons/triangle-alert.ts","../../src/components/AccountSettings.tsx","../../src/components/ThemeProvider.tsx"],"names":["getApps","getApp","initializeApp","getAuth","getFirestore","getStorage","auth","signInWithEmailAndPassword","createUserWithEmailAndPassword","GoogleAuthProvider","signInWithPopup","jsxs","jsx","React","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Label","Input","Alert","AlertDescription","Button","Separator","Fragment","forwardRef","createElement","React2","Card","CardHeader","CardTitle","CardDescription","CardContent","useTheme","useEffect","NextThemesProvider"],"mappings":"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","file":"index.js","sourcesContent":["import { initializeApp, getApps, getApp, FirebaseApp } from 'firebase/app';\nimport { getAuth, Auth } from 'firebase/auth';\nimport { getFirestore, Firestore } from 'firebase/firestore';\nimport { getStorage, FirebaseStorage } from 'firebase/storage';\n\n/**\n * Firebase configuration interface\n * All values should be provided via environment variables\n */\nexport interface FirebaseConfig {\n apiKey: string;\n authDomain: string;\n projectId: string;\n storageBucket: string;\n messagingSenderId: string;\n appId: string;\n measurementId?: string;\n}\n\n/**\n * Get Firebase configuration from environment variables\n * Works with Next.js NEXT_PUBLIC_ prefix\n */\nexport function getFirebaseConfig(): FirebaseConfig {\n const config: FirebaseConfig = {\n apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY || '',\n authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN || '',\n projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID || '',\n storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET || '',\n messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID || '',\n appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID || '',\n measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID,\n };\n\n // Validate required fields\n const requiredFields: (keyof FirebaseConfig)[] = [\n 'apiKey',\n 'authDomain',\n 'projectId',\n 'storageBucket',\n 'messagingSenderId',\n 'appId',\n ];\n\n const missingFields = requiredFields.filter((field) => !config[field]);\n\n if (missingFields.length > 0) {\n console.warn(\n `[mw-core] Missing Firebase config fields: ${missingFields.join(', ')}. ` +\n `Make sure to set NEXT_PUBLIC_FIREBASE_* environment variables.`\n );\n }\n\n return config;\n}\n\n/**\n * Initialize Firebase app (singleton pattern)\n * Safe to call multiple times - returns existing instance if already initialized\n */\nexport function initializeFirebase(config?: FirebaseConfig): FirebaseApp {\n if (getApps().length > 0) {\n return getApp();\n }\n\n const firebaseConfig = config || getFirebaseConfig();\n return initializeApp(firebaseConfig);\n}\n\n// Lazy initialization singletons\nlet _app: FirebaseApp | null = null;\nlet _auth: Auth | null = null;\nlet _db: Firestore | null = null;\nlet _storage: FirebaseStorage | null = null;\n\n/**\n * Get the Firebase app instance\n */\nexport function getFirebaseApp(): FirebaseApp {\n if (!_app) {\n _app = initializeFirebase();\n }\n return _app;\n}\n\n/**\n * Get the Firebase Auth instance\n */\nexport function getFirebaseAuth(): Auth {\n if (!_auth) {\n _auth = getAuth(getFirebaseApp());\n }\n return _auth;\n}\n\n/**\n * Get the Firestore database instance\n * Supports named databases via NEXT_PUBLIC_FIRESTORE_DATABASE_ID env var\n */\nexport function getFirebaseFirestore(): Firestore {\n if (!_db) {\n const databaseId = process.env.NEXT_PUBLIC_FIRESTORE_DATABASE_ID;\n if (databaseId) {\n _db = getFirestore(getFirebaseApp(), databaseId);\n } else {\n _db = getFirestore(getFirebaseApp());\n }\n }\n return _db;\n}\n\n/**\n * Get the Firebase Storage instance\n */\nexport function getFirebaseStorage(): FirebaseStorage {\n if (!_storage) {\n _storage = getStorage(getFirebaseApp());\n }\n return _storage;\n}\n\n// Convenience exports for direct access\nexport const app = typeof window !== 'undefined' ? getFirebaseApp() : null;\nexport const auth = typeof window !== 'undefined' ? getFirebaseAuth() : null;\nexport const db = typeof window !== 'undefined' ? getFirebaseFirestore() : null;\nexport const storage = typeof window !== 'undefined' ? getFirebaseStorage() : null;\n\n","import {\n signInWithEmailAndPassword,\n createUserWithEmailAndPassword,\n signOut as firebaseSignOut,\n sendPasswordResetEmail,\n sendEmailVerification,\n updateProfile,\n updatePassword as firebaseUpdatePassword,\n GoogleAuthProvider,\n EmailAuthProvider,\n signInWithPopup,\n signInWithRedirect,\n getRedirectResult,\n onAuthStateChanged,\n reauthenticateWithCredential as firebaseReauthenticateWithCredential,\n reauthenticateWithPopup as firebaseReauthenticateWithPopup,\n verifyBeforeUpdateEmail as firebaseVerifyBeforeUpdateEmail,\n deleteUser as firebaseDeleteUser,\n getAdditionalUserInfo as firebaseGetAdditionalUserInfo,\n User,\n UserCredential,\n Auth,\n AuthCredential,\n} from 'firebase/auth';\nimport { getFirebaseAuth } from './config';\n\n/**\n * Sign in with email and password\n */\nexport async function signInWithEmail(\n email: string,\n password: string\n): Promise<UserCredential> {\n const auth = getFirebaseAuth();\n return signInWithEmailAndPassword(auth, email, password);\n}\n\n/**\n * Create a new account with email and password\n */\nexport async function signUpWithEmail(\n email: string,\n password: string,\n displayName?: string\n): Promise<UserCredential> {\n const auth = getFirebaseAuth();\n const credential = await createUserWithEmailAndPassword(auth, email, password);\n \n if (displayName && credential.user) {\n await updateProfile(credential.user, { displayName });\n }\n \n return credential;\n}\n\n/**\n * Sign out the current user\n */\nexport async function signOut(): Promise<void> {\n const auth = getFirebaseAuth();\n return firebaseSignOut(auth);\n}\n\n/**\n * Send a password reset email\n */\nexport async function resetPassword(email: string): Promise<void> {\n const auth = getFirebaseAuth();\n return sendPasswordResetEmail(auth, email);\n}\n\n/**\n * Send email verification to the current user\n */\nexport async function sendVerificationEmail(user: User): Promise<void> {\n return sendEmailVerification(user);\n}\n\n/**\n * Update the current user's profile\n */\nexport async function updateUserProfile(\n user: User,\n profile: { displayName?: string; photoURL?: string }\n): Promise<void> {\n return updateProfile(user, profile);\n}\n\n/**\n * Sign in with Google using popup\n */\nexport async function signInWithGoogle(): Promise<UserCredential> {\n const auth = getFirebaseAuth();\n const provider = new GoogleAuthProvider();\n provider.addScope('email');\n provider.addScope('profile');\n return signInWithPopup(auth, provider);\n}\n\n/**\n * Sign in with Google using redirect (better for mobile)\n */\nexport async function signInWithGoogleRedirect(): Promise<void> {\n const auth = getFirebaseAuth();\n const provider = new GoogleAuthProvider();\n provider.addScope('email');\n provider.addScope('profile');\n return signInWithRedirect(auth, provider);\n}\n\n/**\n * Get the result of a redirect sign-in\n */\nexport async function getGoogleRedirectResult(): Promise<UserCredential | null> {\n const auth = getFirebaseAuth();\n return getRedirectResult(auth);\n}\n\n/**\n * Subscribe to auth state changes\n */\nexport function subscribeToAuthState(\n callback: (user: User | null) => void\n): () => void {\n const auth = getFirebaseAuth();\n return onAuthStateChanged(auth, callback);\n}\n\n/**\n * Get the current user (may be null if not authenticated)\n */\nexport function getCurrentUser(): User | null {\n const auth = getFirebaseAuth();\n return auth.currentUser;\n}\n\n/**\n * Wait for the auth state to be determined\n * Useful for SSR/initial load\n */\nexport function waitForAuthState(): Promise<User | null> {\n return new Promise((resolve) => {\n const auth = getFirebaseAuth();\n const unsubscribe = onAuthStateChanged(auth, (user) => {\n unsubscribe();\n resolve(user);\n });\n });\n}\n\n/**\n * Update the current user's password\n * Requires recent authentication\n */\nexport async function updatePassword(\n user: User,\n newPassword: string\n): Promise<void> {\n return firebaseUpdatePassword(user, newPassword);\n}\n\n/**\n * Re-authenticate user with email/password credential\n * Required before sensitive operations like password change, email change, account deletion\n */\nexport async function reauthenticateWithCredential(\n user: User,\n credential: AuthCredential\n): Promise<UserCredential> {\n return firebaseReauthenticateWithCredential(user, credential);\n}\n\n/**\n * Re-authenticate user with Google popup\n * Required before sensitive operations for Google-authenticated users\n */\nexport async function reauthenticateWithPopup(\n user: User\n): Promise<UserCredential> {\n const provider = new GoogleAuthProvider();\n return firebaseReauthenticateWithPopup(user, provider);\n}\n\n/**\n * Send verification email to new email address before updating\n * User must verify new email before it becomes active\n */\nexport async function verifyBeforeUpdateEmail(\n user: User,\n newEmail: string\n): Promise<void> {\n return firebaseVerifyBeforeUpdateEmail(user, newEmail);\n}\n\n/**\n * Delete the authenticated user\n * Requires recent authentication\n */\nexport async function deleteUser(user: User): Promise<void> {\n return firebaseDeleteUser(user);\n}\n\n/**\n * Get additional user info from credential (e.g., isNewUser)\n */\nexport function getAdditionalUserInfo(credential: UserCredential) {\n return firebaseGetAdditionalUserInfo(credential);\n}\n\n/**\n * Create email/password credential for re-authentication\n */\nexport function createEmailCredential(email: string, password: string): AuthCredential {\n return EmailAuthProvider.credential(email, password);\n}\n\n/**\n * Get the Firebase Auth instance\n */\nexport function getAuth(): Auth {\n return getFirebaseAuth();\n}\n\n/**\n * Convenience: Reauthenticate with password\n * @returns Promise<UserCredential>\n */\nexport async function reauthenticateWithPassword(\n user: User,\n password: string\n): Promise<UserCredential> {\n if (!user.email) throw new Error('User email not found');\n const credential = EmailAuthProvider.credential(user.email, password);\n return firebaseReauthenticateWithCredential(user, credential);\n}\n\n/**\n * Convenience: Reauthenticate with Google\n * @returns Promise<UserCredential> or false if user cancelled\n */\nexport async function reauthenticateWithGoogle(\n user: User\n): Promise<UserCredential | false> {\n try {\n const provider = new GoogleAuthProvider();\n return await firebaseReauthenticateWithPopup(user, provider);\n } catch (error: any) {\n if (error.code === 'auth/popup-closed-by-user' || error.code === 'auth/cancelled-popup-request') {\n return false; // User cancelled\n }\n throw error;\n }\n}\n\n/**\n * Update user email (requires recent authentication)\n */\nexport async function updateUserEmail(user: User, newEmail: string): Promise<void> {\n const { updateEmail: firebaseUpdateEmail } = await import('firebase/auth');\n return firebaseUpdateEmail(user, newEmail);\n}\n\n/**\n * Update user password (requires recent authentication)\n */\nexport async function updateUserPassword(user: User, newPassword: string): Promise<void> {\n return firebaseUpdatePassword(user, newPassword);\n}\n\n// Re-export useful types\nexport type { User, UserCredential, Auth, AuthCredential };\n\n// Re-export providers for direct use\nexport { GoogleAuthProvider, EmailAuthProvider };\n\n","'use client';\n\nimport * as React from 'react';\nimport { signInWithEmail, signInWithGoogle, signUpWithEmail } from '../firebase/auth';\nimport {\n Button,\n Input,\n Label,\n Alert,\n AlertDescription,\n Separator,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n} from '@marcwelti/mw-ui';\n\n// ---------------------------------------------------------------------------\n// Error helper\n// ---------------------------------------------------------------------------\n\nfunction getAuthErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n if (error.message.includes('auth/user-not-found')) return 'Kein Account mit dieser E-Mail gefunden.';\n if (error.message.includes('auth/wrong-password')) return 'Falsches Passwort.';\n if (error.message.includes('auth/too-many-requests')) return 'Zu viele Versuche. Bitte warte einen Moment.';\n if (error.message.includes('auth/invalid-credential')) return 'Ungültige Anmeldedaten.';\n if (error.message.includes('auth/popup-closed-by-user')) return 'Anmeldung abgebrochen.';\n if (error.message.includes('auth/email-already-in-use')) return 'Diese E-Mail wird bereits verwendet.';\n if (error.message.includes('auth/weak-password')) return 'Passwort ist zu schwach.';\n if (error.message.includes('auth/invalid-email')) return 'Ungültige E-Mail-Adresse.';\n return error.message;\n }\n return 'Ein Fehler ist aufgetreten.';\n}\n\n// ---------------------------------------------------------------------------\n// Google SVG icon\n// ---------------------------------------------------------------------------\n\nfunction GoogleIcon() {\n return (\n <svg className=\"h-5 w-5 mr-2\" viewBox=\"0 0 24 24\">\n <path fill=\"#4285F4\" 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\" />\n <path fill=\"#34A853\" 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\" />\n <path fill=\"#FBBC05\" 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\" />\n <path fill=\"#EA4335\" 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\" />\n </svg>\n );\n}\n\n// ---------------------------------------------------------------------------\n// AuthDialog\n// ---------------------------------------------------------------------------\n\nexport interface AuthDialogProps {\n /** Whether the dialog is open. */\n open: boolean;\n /** Called when the dialog open state changes. */\n onOpenChange: (open: boolean) => void;\n /** Called after successful authentication. Use this to reload the session. */\n onSuccess: () => void;\n /** URL for the session creation endpoint. Defaults to '/api/auth/login'. */\n sessionEndpoint?: string;\n /** Default mode: 'login' or 'register'. Defaults to 'login'. */\n defaultMode?: 'login' | 'register';\n}\n\nexport function AuthDialog({\n open,\n onOpenChange,\n onSuccess,\n sessionEndpoint = '/api/auth/login',\n defaultMode = 'login',\n}: AuthDialogProps) {\n const [mode, setMode] = React.useState<'login' | 'register'>(defaultMode);\n const [email, setEmail] = React.useState('');\n const [password, setPassword] = React.useState('');\n const [confirmPassword, setConfirmPassword] = React.useState('');\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n\n const resetForm = React.useCallback(() => {\n setEmail('');\n setPassword('');\n setConfirmPassword('');\n setError(null);\n setLoading(false);\n }, []);\n\n // Reset mode to default when dialog opens\n React.useEffect(() => {\n if (open) {\n setMode(defaultMode);\n resetForm();\n }\n }, [open, defaultMode, resetForm]);\n\n const createSession = async (idToken: string) => {\n const response = await fetch(sessionEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ idToken }),\n });\n if (!response.ok) throw new Error('Sitzung konnte nicht erstellt werden.');\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n\n if (mode === 'register' && password !== confirmPassword) {\n setError('Passwörter stimmen nicht überein.');\n return;\n }\n if (mode === 'register' && password.length < 8) {\n setError('Passwort muss mindestens 8 Zeichen lang sein.');\n return;\n }\n\n setLoading(true);\n try {\n const credential = mode === 'login'\n ? await signInWithEmail(email, password)\n : await signUpWithEmail(email, password);\n const idToken = await credential.user.getIdToken();\n await createSession(idToken);\n resetForm();\n onOpenChange(false);\n onSuccess();\n } catch (err) {\n setError(getAuthErrorMessage(err));\n } finally {\n setLoading(false);\n }\n };\n\n const handleGoogle = async () => {\n setError(null);\n setLoading(true);\n try {\n const credential = await signInWithGoogle();\n const idToken = await credential.user.getIdToken();\n await createSession(idToken);\n resetForm();\n onOpenChange(false);\n onSuccess();\n } catch (err) {\n setError(getAuthErrorMessage(err));\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <Dialog open={open} onOpenChange={(v) => { onOpenChange(v); if (!v) resetForm(); }}>\n <DialogContent className=\"!max-w-md mx-4\">\n <DialogHeader>\n <DialogTitle className=\"text-xl\">\n {mode === 'login' ? 'Willkommen zurück' : 'Account erstellen'}\n </DialogTitle>\n <DialogDescription>\n {mode === 'login'\n ? 'Melde dich bei deinem Account an.'\n : 'Erstelle einen neuen Account.'}\n </DialogDescription>\n </DialogHeader>\n\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"auth-email\">E-Mail</Label>\n <Input\n id=\"auth-email\"\n type=\"email\"\n value={email}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setEmail(e.target.value)}\n placeholder=\"du@beispiel.ch\"\n required\n disabled={loading}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"auth-password\">Passwort</Label>\n <Input\n id=\"auth-password\"\n type=\"password\"\n value={password}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setPassword(e.target.value)}\n placeholder=\"••••••••\"\n required\n disabled={loading}\n minLength={mode === 'register' ? 8 : undefined}\n />\n </div>\n\n {mode === 'register' && (\n <div className=\"space-y-2\">\n <Label htmlFor=\"auth-confirm\">Passwort bestätigen</Label>\n <Input\n id=\"auth-confirm\"\n type=\"password\"\n value={confirmPassword}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setConfirmPassword(e.target.value)}\n placeholder=\"Passwort wiederholen\"\n required\n disabled={loading}\n />\n </div>\n )}\n\n {error && (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n\n <Button type=\"submit\" className=\"w-full\" disabled={loading}>\n {loading\n ? 'Wird geladen...'\n : mode === 'login'\n ? 'Anmelden'\n : 'Account erstellen'}\n </Button>\n </form>\n\n <div className=\"flex items-center gap-4\">\n <Separator className=\"flex-1\" />\n <span className=\"text-sm text-muted-foreground\">oder</span>\n <Separator className=\"flex-1\" />\n </div>\n\n <Button\n type=\"button\"\n intent=\"secondary\"\n background=\"solid\"\n className=\"w-full\"\n onClick={handleGoogle}\n disabled={loading}\n >\n <GoogleIcon />\n Mit Google anmelden\n </Button>\n\n <div className=\"text-center text-sm text-muted-foreground\">\n {mode === 'login' ? (\n <>\n Noch kein Account?{' '}\n <button\n type=\"button\"\n onClick={() => { setMode('register'); setError(null); }}\n className=\"text-brand-gold hover:underline\"\n >\n Registrieren\n </button>\n </>\n ) : (\n <>\n Bereits ein Account?{' '}\n <button\n type=\"button\"\n onClick={() => { setMode('login'); setError(null); }}\n className=\"text-brand-gold hover:underline\"\n >\n Anmelden\n </button>\n </>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n\n","import { CamelToPascal } from './utility-types';\n\n/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n\n/**\n * Converts string to camel case\n *\n * @param {string} string\n * @returns {string} A camelized string\n */\nexport const toCamelCase = <T extends string>(string: T) =>\n string.replace(/^([A-Z])|[\\s-_]+(\\w)/g, (match, p1, p2) =>\n p2 ? p2.toUpperCase() : p1.toLowerCase(),\n );\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = toCamelCase(string);\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n\n/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return (\n Boolean(className) &&\n (className as string).trim() !== '' &&\n array.indexOf(className) === index\n );\n })\n .join(' ')\n .trim();\n","export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n","import { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses } from '@lucide/shared';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n {\n color = 'currentColor',\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = '',\n children,\n iconNode,\n ...rest\n },\n ref,\n ) => {\n return createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth,\n className: mergeClasses('lucide', className),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n );\n },\n);\n\nexport default Icon;\n","import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase } from '@lucide/shared';\nimport { IconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Create a Lucide icon component\n * @param {string} iconName\n * @param {array} iconNode\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst createLucideIcon = (iconName: string, iconNode: IconNode) => {\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(`lucide-${toKebabCase(iconName)}`, className),\n ...props,\n }),\n );\n\n Component.displayName = `${iconName}`;\n\n return Component;\n};\n\nexport default createLucideIcon;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name CircleAlert\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8bGluZSB4MT0iMTIiIHgyPSIxMiIgeTE9IjgiIHkyPSIxMiIgLz4KICA8bGluZSB4MT0iMTIiIHgyPSIxMi4wMSIgeTE9IjE2IiB5Mj0iMTYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/circle-alert\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleAlert = createLucideIcon('CircleAlert', [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['line', { x1: '12', x2: '12', y1: '8', y2: '12', key: '1pkeuh' }],\n ['line', { x1: '12', x2: '12.01', y1: '16', y2: '16', key: '4dfq90' }],\n]);\n\nexport default CircleAlert;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name CircleCheckBig\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEuODAxIDEwQTEwIDEwIDAgMSAxIDE3IDMuMzM1IiAvPgogIDxwYXRoIGQ9Im05IDExIDMgM0wyMiA0IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/circle-check-big\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleCheckBig = createLucideIcon('CircleCheckBig', [\n ['path', { d: 'M21.801 10A10 10 0 1 1 17 3.335', key: 'yps3ct' }],\n ['path', { d: 'm9 11 3 3L22 4', key: '1pflzl' }],\n]);\n\nexport default CircleCheckBig;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name KeyRound\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMi41ODYgMTcuNDE0QTIgMiAwIDAgMCAyIDE4LjgyOFYyMWExIDEgMCAwIDAgMSAxaDNhMSAxIDAgMCAwIDEtMXYtMWExIDEgMCAwIDEgMS0xaDFhMSAxIDAgMCAwIDEtMXYtMWExIDEgMCAwIDEgMS0xaC4xNzJhMiAyIDAgMCAwIDEuNDE0LS41ODZsLjgxNC0uODE0YTYuNSA2LjUgMCAxIDAtNC00eiIgLz4KICA8Y2lyY2xlIGN4PSIxNi41IiBjeT0iNy41IiByPSIuNSIgZmlsbD0iY3VycmVudENvbG9yIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/key-round\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst KeyRound = createLucideIcon('KeyRound', [\n [\n 'path',\n {\n d: 'M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z',\n key: '1s6t7t',\n },\n ],\n ['circle', { cx: '16.5', cy: '7.5', r: '.5', fill: 'currentColor', key: 'w0ekpg' }],\n]);\n\nexport default KeyRound;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Mail\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMjAiIGhlaWdodD0iMTYiIHg9IjIiIHk9IjQiIHJ4PSIyIiAvPgogIDxwYXRoIGQ9Im0yMiA3LTguOTcgNS43YTEuOTQgMS45NCAwIDAgMS0yLjA2IDBMMiA3IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/mail\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Mail = createLucideIcon('Mail', [\n ['rect', { width: '20', height: '16', x: '2', y: '4', rx: '2', key: '18n3k1' }],\n ['path', { d: 'm22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7', key: '1ocrg3' }],\n]);\n\nexport default Mail;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Pen\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEuMTc0IDYuODEyYTEgMSAwIDAgMC0zLjk4Ni0zLjk4N0wzLjg0MiAxNi4xNzRhMiAyIDAgMCAwLS41LjgzbC0xLjMyMSA0LjM1MmEuNS41IDAgMCAwIC42MjMuNjIybDQuMzUzLTEuMzJhMiAyIDAgMCAwIC44My0uNDk3eiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/pen\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Pen = createLucideIcon('Pen', [\n [\n 'path',\n {\n d: 'M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z',\n key: '1a8usu',\n },\n ],\n]);\n\nexport default Pen;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Trash2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyA2aDE4IiAvPgogIDxwYXRoIGQ9Ik0xOSA2djE0YzAgMS0xIDItMiAySDdjLTEgMC0yLTEtMi0yVjYiIC8+CiAgPHBhdGggZD0iTTggNlY0YzAtMSAxLTIgMi0yaDRjMSAwIDIgMSAyIDJ2MiIgLz4KICA8bGluZSB4MT0iMTAiIHgyPSIxMCIgeTE9IjExIiB5Mj0iMTciIC8+CiAgPGxpbmUgeDE9IjE0IiB4Mj0iMTQiIHkxPSIxMSIgeTI9IjE3IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/trash-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Trash2 = createLucideIcon('Trash2', [\n ['path', { d: 'M3 6h18', key: 'd0wm0j' }],\n ['path', { d: 'M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6', key: '4alrt4' }],\n ['path', { d: 'M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2', key: 'v07s0e' }],\n ['line', { x1: '10', x2: '10', y1: '11', y2: '17', key: '1uufr5' }],\n ['line', { x1: '14', x2: '14', y1: '11', y2: '17', key: 'xtxkd' }],\n]);\n\nexport default Trash2;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name TriangleAlert\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMjEuNzMgMTgtOC0xNGEyIDIgMCAwIDAtMy40OCAwbC04IDE0QTIgMiAwIDAgMCA0IDIxaDE2YTIgMiAwIDAgMCAxLjczLTMiIC8+CiAgPHBhdGggZD0iTTEyIDl2NCIgLz4KICA8cGF0aCBkPSJNMTIgMTdoLjAxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/triangle-alert\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst TriangleAlert = createLucideIcon('TriangleAlert', [\n [\n 'path',\n {\n d: 'm21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3',\n key: 'wmoenq',\n },\n ],\n ['path', { d: 'M12 9v4', key: 'juzpu7' }],\n ['path', { d: 'M12 17h.01', key: 'p32p05' }],\n]);\n\nexport default TriangleAlert;\n","'use client';\n\nimport * as React from 'react';\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Button,\n Input,\n Label,\n Alert,\n AlertDescription,\n} from '@marcwelti/mw-ui';\nimport {\n Mail,\n KeyRound,\n Trash2,\n AlertTriangle,\n Edit2,\n CheckCircle,\n AlertCircle,\n} from 'lucide-react';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface AccountSettingsUser {\n uid: string;\n email?: string;\n displayName?: string;\n emailVerified?: boolean;\n}\n\nexport interface AccountSettingsProps {\n /** Current user data */\n user: AccountSettingsUser | null;\n /** Firebase user object for provider checks */\n firebaseUser?: any;\n /** Called when user updates email */\n onUpdateEmail?: (newEmail: string, password: string) => Promise<void>;\n /** Called when user updates password */\n onUpdatePassword?: (currentPassword: string, newPassword: string) => Promise<void>;\n /** Called when user deletes account */\n onDeleteAccount?: (password?: string) => Promise<boolean | void>;\n /** Called to refresh user data */\n onRefreshUser?: () => Promise<void>;\n /** Session endpoint for logout */\n logoutEndpoint?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helper: Spinner Icon\n// ---------------------------------------------------------------------------\n\nfunction SpinnerIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Helper: Password Input\n// ---------------------------------------------------------------------------\n\nconst PasswordInput = React.forwardRef<\n HTMLInputElement,\n React.InputHTMLAttributes<HTMLInputElement>\n>((props, ref) => {\n return <Input {...props} ref={ref} type=\"password\" />;\n});\nPasswordInput.displayName = 'PasswordInput';\n\n// ---------------------------------------------------------------------------\n// AccountSettings Component\n// ---------------------------------------------------------------------------\n\nexport function AccountSettings({\n user,\n firebaseUser,\n onUpdateEmail,\n onUpdatePassword,\n onDeleteAccount,\n onRefreshUser,\n logoutEndpoint = '/api/auth/logout',\n}: AccountSettingsProps) {\n\n // Email change states\n const [showEmailChange, setShowEmailChange] = React.useState(false);\n const [newEmail, setNewEmail] = React.useState('');\n const [emailPassword, setEmailPassword] = React.useState('');\n const [emailLoading, setEmailLoading] = React.useState(false);\n const [emailError, setEmailError] = React.useState('');\n const [emailSuccess, setEmailSuccess] = React.useState(false);\n\n // Password change states\n const [showPasswordChange, setShowPasswordChange] = React.useState(false);\n const [currentPassword, setCurrentPassword] = React.useState('');\n const [newPassword, setNewPassword] = React.useState('');\n const [confirmPassword, setConfirmPassword] = React.useState('');\n const [passwordLoading, setPasswordLoading] = React.useState(false);\n const [passwordError, setPasswordError] = React.useState('');\n const [passwordSuccess, setPasswordSuccess] = React.useState(false);\n\n // Account deletion states\n const [showDeleteConfirm, setShowDeleteConfirm] = React.useState(false);\n const [deletePassword, setDeletePassword] = React.useState('');\n const [deleteConfirmText, setDeleteConfirmText] = React.useState('');\n const [deleteLoading, setDeleteLoading] = React.useState(false);\n const [deleteError, setDeleteError] = React.useState('');\n\n // Check if user has password provider\n const hasPasswordProvider = firebaseUser?.providerData?.some(\n (p: any) => p.providerId === 'password'\n );\n const hasGoogleProvider = firebaseUser?.providerData?.some(\n (p: any) => p.providerId === 'google.com'\n );\n\n // Handle email update\n const handleEmailUpdate = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!onUpdateEmail) return;\n\n setEmailError('');\n setEmailLoading(true);\n\n try {\n await onUpdateEmail(newEmail, emailPassword);\n setEmailSuccess(true);\n setNewEmail('');\n setEmailPassword('');\n setTimeout(() => {\n setShowEmailChange(false);\n setEmailSuccess(false);\n onRefreshUser?.();\n }, 2000);\n } catch (error: any) {\n setEmailError(error.message || 'Failed to update email');\n } finally {\n setEmailLoading(false);\n }\n };\n\n // Handle password update\n const handlePasswordUpdate = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!onUpdatePassword) return;\n\n if (newPassword !== confirmPassword) {\n setPasswordError('Passwords do not match');\n return;\n }\n if (newPassword.length < 8) {\n setPasswordError('Password must be at least 8 characters');\n return;\n }\n\n setPasswordError('');\n setPasswordLoading(true);\n\n try {\n await onUpdatePassword(currentPassword, newPassword);\n setPasswordSuccess(true);\n setCurrentPassword('');\n setNewPassword('');\n setConfirmPassword('');\n setTimeout(() => {\n setShowPasswordChange(false);\n setPasswordSuccess(false);\n }, 2000);\n } catch (error: any) {\n setPasswordError(error.message || 'Failed to update password');\n } finally {\n setPasswordLoading(false);\n }\n };\n\n // Handle account deletion\n const handleDeleteAccount = async () => {\n if (!onDeleteAccount) return;\n\n const needsPassword = hasPasswordProvider && !hasGoogleProvider;\n const needsConfirmText = hasGoogleProvider;\n\n if (needsPassword && !deletePassword) {\n setDeleteError('Please enter your password');\n return;\n }\n if (needsConfirmText && deleteConfirmText !== 'DELETE') {\n setDeleteError('Please type DELETE to confirm');\n return;\n }\n\n setDeleteLoading(true);\n setDeleteError('');\n\n try {\n const result = await onDeleteAccount(needsPassword ? deletePassword : undefined);\n if (result === false) {\n // User cancelled\n setDeleteLoading(false);\n return;\n }\n // Success - call logout endpoint and parent will handle redirect\n await fetch(logoutEndpoint, { method: 'POST' });\n // Parent component (page) should redirect after successful deletion\n } catch (error: any) {\n setDeleteError(error.message || 'Failed to delete account');\n setDeleteLoading(false);\n }\n };\n\n return (\n <div className=\"max-w-4xl mx-auto space-y-6\">\n {/* Email Section */}\n <Card className=\"bg-card border border-border shadow-lg\">\n <CardHeader>\n <CardTitle className=\"text-foreground\">Email Address</CardTitle>\n <CardDescription className=\"text-muted-foreground\">\n Manage your email address\n </CardDescription>\n </CardHeader>\n <CardContent>\n {!showEmailChange ? (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Mail className=\"h-5 w-5 text-brand-gold\" />\n <span className=\"text-foreground font-medium\">{user?.email}</span>\n </div>\n {hasPasswordProvider && user?.emailVerified && onUpdateEmail && (\n <Button\n intent=\"ghost\"\n size=\"sm\"\n onClick={() => setShowEmailChange(true)}\n >\n <Edit2 className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n {!user?.emailVerified && (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"h-4 w-4\" />\n <AlertDescription>\n Your email is not verified. Please check your inbox.\n </AlertDescription>\n </Alert>\n )}\n </div>\n ) : (\n <form onSubmit={handleEmailUpdate} className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"new-email\">New Email Address</Label>\n <Input\n id=\"new-email\"\n type=\"email\"\n value={newEmail}\n onChange={(e) => setNewEmail(e.target.value)}\n required\n disabled={emailLoading}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"email-password\">Current Password</Label>\n <PasswordInput\n id=\"email-password\"\n value={emailPassword}\n onChange={(e) => setEmailPassword(e.target.value)}\n required\n disabled={emailLoading}\n />\n </div>\n {emailError && (\n <Alert variant=\"destructive\">\n <AlertDescription>{emailError}</AlertDescription>\n </Alert>\n )}\n {emailSuccess && (\n <Alert className=\"bg-brand-gold/10 border-brand-gold/30\">\n <CheckCircle className=\"h-4 w-4 text-brand-gold\" />\n <AlertDescription className=\"text-brand-gold\">\n Email updated! Check your new email to verify.\n </AlertDescription>\n </Alert>\n )}\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n intent=\"secondary\"\n onClick={() => {\n setShowEmailChange(false);\n setEmailError('');\n setNewEmail('');\n setEmailPassword('');\n }}\n disabled={emailLoading}\n >\n Cancel\n </Button>\n <Button\n type=\"submit\"\n disabled={emailLoading || !newEmail || !emailPassword}\n >\n {emailLoading && <SpinnerIcon className=\"mr-2 h-4 w-4 animate-spin\" />}\n Update Email\n </Button>\n </div>\n </form>\n )}\n </CardContent>\n </Card>\n\n {/* Password Section - only for password providers */}\n {hasPasswordProvider && onUpdatePassword && (\n <Card className=\"bg-card border border-border shadow-lg\">\n <CardHeader>\n <CardTitle className=\"text-foreground\">Password</CardTitle>\n <CardDescription className=\"text-muted-foreground\">\n Change your password\n </CardDescription>\n </CardHeader>\n <CardContent>\n {!showPasswordChange ? (\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <KeyRound className=\"h-5 w-5 text-brand-gold\" />\n <span className=\"text-foreground font-medium\">••••••••••••</span>\n </div>\n <Button\n intent=\"ghost\"\n size=\"sm\"\n onClick={() => setShowPasswordChange(true)}\n >\n <Edit2 className=\"h-4 w-4\" />\n </Button>\n </div>\n ) : (\n <form onSubmit={handlePasswordUpdate} className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"current-password\">Current Password</Label>\n <PasswordInput\n id=\"current-password\"\n value={currentPassword}\n onChange={(e) => setCurrentPassword(e.target.value)}\n required\n disabled={passwordLoading}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"new-password\">New Password</Label>\n <PasswordInput\n id=\"new-password\"\n value={newPassword}\n onChange={(e) => setNewPassword(e.target.value)}\n required\n minLength={8}\n disabled={passwordLoading}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"confirm-password\">Confirm New Password</Label>\n <PasswordInput\n id=\"confirm-password\"\n value={confirmPassword}\n onChange={(e) => setConfirmPassword(e.target.value)}\n required\n disabled={passwordLoading}\n />\n </div>\n {passwordError && (\n <Alert variant=\"destructive\">\n <AlertDescription>{passwordError}</AlertDescription>\n </Alert>\n )}\n {passwordSuccess && (\n <Alert className=\"bg-brand-gold/10 border-brand-gold/30\">\n <CheckCircle className=\"h-4 w-4 text-brand-gold\" />\n <AlertDescription className=\"text-brand-gold\">\n Password updated successfully!\n </AlertDescription>\n </Alert>\n )}\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n intent=\"secondary\"\n onClick={() => {\n setShowPasswordChange(false);\n setPasswordError('');\n setCurrentPassword('');\n setNewPassword('');\n setConfirmPassword('');\n }}\n disabled={passwordLoading}\n >\n Cancel\n </Button>\n <Button\n type=\"submit\"\n disabled={\n passwordLoading ||\n !currentPassword ||\n !newPassword ||\n !confirmPassword ||\n newPassword !== confirmPassword\n }\n >\n {passwordLoading && <SpinnerIcon className=\"mr-2 h-4 w-4 animate-spin\" />}\n Update Password\n </Button>\n </div>\n </form>\n )}\n </CardContent>\n </Card>\n )}\n\n {/* Danger Zone - Account Deletion */}\n {onDeleteAccount && (\n <Card className=\"bg-card border border-border shadow-lg\">\n <CardHeader>\n <CardTitle className=\"text-foreground flex items-center gap-2\">\n <AlertTriangle className=\"h-5 w-5 text-red-500\" />\n Danger Zone\n </CardTitle>\n <CardDescription className=\"text-muted-foreground\">\n Permanently delete your account\n </CardDescription>\n </CardHeader>\n <CardContent>\n {!showDeleteConfirm ? (\n <Button\n intent=\"destructive\"\n onClick={() => setShowDeleteConfirm(true)}\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n Delete My Account\n </Button>\n ) : (\n <div className=\"space-y-4\">\n <Alert variant=\"destructive\" className=\"bg-red-900/20 border-red-900/40\">\n <AlertDescription>\n <p className=\"font-medium mb-2\">⚠️ This action cannot be undone!</p>\n <p>\n Your account and all associated data will be permanently deleted.\n </p>\n </AlertDescription>\n </Alert>\n\n {hasPasswordProvider && !hasGoogleProvider && (\n <div className=\"space-y-2\">\n <Label htmlFor=\"delete-password\">Enter Your Password</Label>\n <PasswordInput\n id=\"delete-password\"\n value={deletePassword}\n onChange={(e) => setDeletePassword(e.target.value)}\n placeholder=\"Enter your password to confirm\"\n disabled={deleteLoading}\n />\n </div>\n )}\n\n {hasGoogleProvider && (\n <div className=\"space-y-2\">\n <Label htmlFor=\"delete-confirm\">Type DELETE to confirm</Label>\n <Input\n id=\"delete-confirm\"\n value={deleteConfirmText}\n onChange={(e) => setDeleteConfirmText(e.target.value)}\n placeholder=\"DELETE\"\n disabled={deleteLoading}\n />\n </div>\n )}\n\n {deleteError && (\n <Alert variant=\"destructive\">\n <AlertDescription>{deleteError}</AlertDescription>\n </Alert>\n )}\n\n <div className=\"flex gap-2\">\n <Button\n intent=\"secondary\"\n onClick={() => {\n setShowDeleteConfirm(false);\n setDeleteError('');\n setDeletePassword('');\n setDeleteConfirmText('');\n }}\n disabled={deleteLoading}\n >\n Cancel\n </Button>\n <Button\n intent=\"destructive\"\n onClick={handleDeleteAccount}\n disabled={\n deleteLoading ||\n (hasPasswordProvider && !hasGoogleProvider && !deletePassword) ||\n (hasGoogleProvider && deleteConfirmText !== 'DELETE')\n }\n >\n {deleteLoading && <SpinnerIcon className=\"mr-2 h-4 w-4 animate-spin\" />}\n Yes, Delete My Account\n </Button>\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n )}\n </div>\n );\n}\n\n","'use client';\n\nimport { ThemeProvider as NextThemesProvider } from 'next-themes';\nimport { useEffect } from 'react';\nimport { useTheme } from 'next-themes';\n\n/**\n * Cross-subdomain theme synchronization\n * \n * This component syncs the theme preference across all subdomains by storing it\n * in a cookie with domain set to the root domain (e.g., .your-domain.ch).\n */\n\nconst THEME_COOKIE_NAME = 'mw-theme';\n\nfunction ThemeSyncWrapper({ children }: { children: React.ReactNode }) {\n const { theme, setTheme } = useTheme();\n\n // Read theme from cookie on mount\n useEffect(() => {\n const cookieTheme = getCookie(THEME_COOKIE_NAME);\n if (cookieTheme && cookieTheme !== theme) {\n setTheme(cookieTheme);\n }\n }, []);\n\n // Write theme to cookie whenever it changes\n useEffect(() => {\n if (theme) {\n setCookie(THEME_COOKIE_NAME, theme);\n }\n }, [theme]);\n\n return <>{children}</>;\n}\n\nfunction getCookie(name: string): string | null {\n if (typeof document === 'undefined') return null;\n \n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n if (parts.length === 2) {\n return parts.pop()?.split(';').shift() || null;\n }\n return null;\n}\n\nfunction setCookie(name: string, value: string) {\n if (typeof document === 'undefined') return;\n \n // Extract root domain (e.g., your-domain.ch from subdomain.your-domain.ch)\n const hostname = window.location.hostname;\n \n // For localhost, don't set domain\n if (hostname === 'localhost' || hostname === '127.0.0.1') {\n document.cookie = `${name}=${value}; path=/; max-age=31536000; SameSite=Lax`;\n return;\n }\n \n // For production, set domain to root (with leading dot for subdomain sharing)\n const parts = hostname.split('.');\n let domain = hostname;\n \n // If it's a subdomain (e.g., academy.your-domain.ch), extract root domain\n if (parts.length >= 2) {\n domain = `.${parts.slice(-2).join('.')}`;\n }\n \n document.cookie = `${name}=${value}; path=/; domain=${domain}; max-age=31536000; SameSite=Lax`;\n}\n\nexport interface ThemeProviderProps {\n children: React.ReactNode;\n attribute?: 'class' | 'data-theme';\n defaultTheme?: string;\n enableSystem?: boolean;\n storageKey?: string;\n}\n\nexport function ThemeProvider({\n children,\n attribute = 'class',\n defaultTheme = 'system',\n enableSystem = true,\n storageKey = 'theme',\n}: ThemeProviderProps) {\n return (\n <NextThemesProvider\n attribute={attribute}\n defaultTheme={defaultTheme}\n enableSystem={enableSystem}\n storageKey={storageKey}\n >\n <ThemeSyncWrapper>{children}</ThemeSyncWrapper>\n </NextThemesProvider>\n );\n}\n\n"]}