@kaappu/react 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +134 -0
- package/dist/index.d.mts +354 -0
- package/dist/index.d.ts +354 -0
- package/dist/index.js +2201 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2183 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/context/KaappuContext.ts","../src/context/KaappuProvider.tsx","../src/theme/index.ts","../src/components/LoginPanel.tsx","../src/components/RegisterPanel.tsx","../src/components/ProfileBadge.tsx","../src/components/AccountView.tsx","../src/components/Authorize.tsx","../../core/dist/index.mjs"],"names":["createContext","useContext","useState","useRef","useEffect","useCallback","jsxs","jsx","mapUser","CARD","GoogleIcon","GithubIcon","MicrosoftIcon","AppleIcon","OAUTH_BTN","ERROR_BANNER","LABEL","INPUT_ROW","ICON_BOX","INPUT","MailIcon","LockIcon","EyeOffIcon","EyeIcon","PRIMARY_BTN","Fragment","SpinnerIcon","ArrowIcon","ShieldIcon"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext } from 'react'\r\nimport type { KaappuContextValue } from '../types'\r\n\r\nexport const KaappuContext = createContext<KaappuContextValue | null>(null)\r\n\r\nexport function useKaappu(): KaappuContextValue {\r\n const ctx = useContext(KaappuContext)\r\n if (!ctx) {\r\n throw new Error(\r\n '[Kaappu] useKaappu() must be used inside <KaappuProvider>. ' +\r\n 'Wrap your app: <KaappuProvider publishableKey=\"pk_live_...\"><App /></KaappuProvider>'\r\n )\r\n }\r\n return ctx\r\n}\r\n","'use client'\r\n\r\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\r\nimport type { KaappuContextValue, KaappuProviderProps, KaappuTenantConfig, KaappuUser } from '../types'\r\nimport { KaappuContext } from './KaappuContext'\r\n\r\nconst TOKEN_KEY = 'kaappu_token'\r\nconst REFRESH_KEY = 'kaappu_refresh'\r\nconst USER_KEY = 'kaappu_user'\r\n\r\n// Refresh the access token 60 seconds before it expires (tokens are 15 min = 900s)\r\nconst REFRESH_BEFORE_EXPIRY_MS = 60_000\r\n\r\nfunction getStoredToken(): string | null {\r\n if (typeof window === 'undefined') return null\r\n return localStorage.getItem(TOKEN_KEY)\r\n}\r\n\r\nfunction parseJwtPayload(token: string): Record<string, unknown> | null {\r\n try {\r\n return JSON.parse(atob(token.split('.')[1].replace(/-/g, '+').replace(/_/g, '/')))\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nfunction isTokenExpired(token: string): boolean {\r\n const payload = parseJwtPayload(token)\r\n if (!payload || typeof payload.exp !== 'number') return true\r\n return Date.now() >= payload.exp * 1000\r\n}\r\n\r\nfunction getTokenExpiryMs(token: string): number {\r\n const payload = parseJwtPayload(token)\r\n if (!payload || typeof payload.exp !== 'number') return 0\r\n return payload.exp * 1000 - Date.now()\r\n}\r\n\r\nexport function KaappuProvider({\r\n publishableKey,\r\n baseUrl = 'http://localhost:9091',\r\n signInUrl = '/sign-in',\r\n signUpUrl = '/sign-up',\r\n children,\r\n}: KaappuProviderProps) {\r\n const [isLoaded, setIsLoaded] = useState(false)\r\n const [isSignedIn, setIsSignedIn] = useState(false)\r\n const [user, setUser] = useState<KaappuUser | null>(null)\r\n const [accessToken, setAccessToken] = useState<string | null>(null)\r\n const [tenantConfig, setTenantConfig] = useState<KaappuTenantConfig | null>(null)\r\n\r\n const refreshTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\r\n\r\n const [configLoaded, setConfigLoaded] = useState(false)\r\n const [sessionReady, setSessionReady] = useState(false)\r\n\r\n // Mark as loaded only when BOTH config and session are ready\r\n useEffect(() => {\r\n if (configLoaded && sessionReady) setIsLoaded(true)\r\n }, [configLoaded, sessionReady])\r\n\r\n // Fetch tenant config on mount — retry up to 3 times on failure\r\n useEffect(() => {\r\n let cancelled = false\r\n async function loadConfig(attempt = 0) {\r\n try {\r\n const r = await fetch(`${baseUrl}/api/v1/accounts/config?pk=${publishableKey}`)\r\n if (r.ok) {\r\n const data = await r.json()\r\n if (!cancelled && data?.data) setTenantConfig(data.data)\r\n if (!cancelled) setConfigLoaded(true)\r\n return\r\n }\r\n } catch {}\r\n // Retry after 1s, 2s, 4s\r\n if (!cancelled && attempt < 3) {\r\n setTimeout(() => loadConfig(attempt + 1), 1000 * Math.pow(2, attempt))\r\n } else if (!cancelled) {\r\n setConfigLoaded(true) // give up, let UI render without OAuth buttons\r\n }\r\n }\r\n loadConfig()\r\n return () => { cancelled = true }\r\n }, [publishableKey, baseUrl])\r\n\r\n // Restore session from localStorage on mount (also sync OAuth cookie → localStorage)\r\n useEffect(() => {\r\n // If an OAuth callback set kaappu_token as a cookie, move it to localStorage\r\n const cookieToken = document.cookie.split('; ').find(c => c.startsWith('kaappu_token='))\r\n if (cookieToken) {\r\n const token = decodeURIComponent(cookieToken.split('=')[1])\r\n if (token && !isTokenExpired(token)) {\r\n localStorage.setItem(TOKEN_KEY, token)\r\n // Clear the cookie now that we've synced it\r\n document.cookie = 'kaappu_token=; path=/; max-age=0'\r\n // Decode user from token claims\r\n const payload = parseJwtPayload(token)\r\n if (payload) {\r\n const userData: KaappuUser = {\r\n id: payload.sub as string,\r\n email: payload.email as string,\r\n accountId: (payload.tid as string) || 'default',\r\n sessionId: (payload.sid as string) || '',\r\n permissions: Array.isArray(payload.permissions) ? payload.permissions as string[] : [],\r\n }\r\n localStorage.setItem(USER_KEY, JSON.stringify(userData))\r\n setAccessToken(token)\r\n setUser(userData)\r\n setIsSignedIn(true)\r\n scheduleRefresh(token)\r\n setSessionReady(true)\r\n return\r\n }\r\n }\r\n }\r\n\r\n const storedToken = getStoredToken()\r\n const storedUser = localStorage.getItem(USER_KEY)\r\n\r\n if (storedToken && !isTokenExpired(storedToken)) {\r\n setAccessToken(storedToken)\r\n if (storedUser) {\r\n try { setUser(JSON.parse(storedUser)) } catch {}\r\n }\r\n setIsSignedIn(true)\r\n scheduleRefresh(storedToken)\r\n } else if (storedToken && isTokenExpired(storedToken)) {\r\n // Attempt silent refresh\r\n silentRefresh().finally(() => setSessionReady(true))\r\n return\r\n }\r\n setSessionReady(true)\r\n }, [])\r\n\r\n function scheduleRefresh(token: string) {\r\n if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current)\r\n const msUntilRefresh = Math.max(getTokenExpiryMs(token) - REFRESH_BEFORE_EXPIRY_MS, 0)\r\n refreshTimerRef.current = setTimeout(() => silentRefresh(), msUntilRefresh)\r\n }\r\n\r\n async function silentRefresh(): Promise<string | null> {\r\n const refreshToken = localStorage.getItem(REFRESH_KEY)\r\n if (!refreshToken) {\r\n clearSession()\r\n return null\r\n }\r\n try {\r\n const res = await fetch(`${baseUrl}/api/v1/idm/auth/refresh`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ refreshToken }),\r\n })\r\n if (!res.ok) { clearSession(); return null }\r\n const data = await res.json()\r\n const newToken = data.data?.accessToken\r\n if (newToken) {\r\n localStorage.setItem(TOKEN_KEY, newToken)\r\n document.cookie = `kaappu_token=${encodeURIComponent(newToken)}; path=/; max-age=${15 * 60}; samesite=lax`\r\n setAccessToken(newToken)\r\n scheduleRefresh(newToken)\r\n return newToken\r\n }\r\n clearSession()\r\n return null\r\n } catch {\r\n clearSession()\r\n return null\r\n }\r\n }\r\n\r\n function clearSession() {\r\n localStorage.removeItem(TOKEN_KEY)\r\n localStorage.removeItem(REFRESH_KEY)\r\n localStorage.removeItem(USER_KEY)\r\n // Clear the middleware cookie\r\n document.cookie = 'kaappu_token=; path=/; max-age=0'\r\n setAccessToken(null)\r\n setUser(null)\r\n setIsSignedIn(false)\r\n if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current)\r\n }\r\n\r\n const signOut = useCallback(async () => {\r\n const token = getStoredToken()\r\n if (token) {\r\n await fetch(`${baseUrl}/api/v1/idm/auth/sign-out`, {\r\n method: 'POST',\r\n headers: { Authorization: `Bearer ${token}` },\r\n }).catch(() => {})\r\n }\r\n clearSession()\r\n }, [baseUrl])\r\n\r\n const getToken = useCallback(async (): Promise<string | null> => {\r\n const stored = getStoredToken()\r\n if (stored && !isTokenExpired(stored)) return stored\r\n return silentRefresh()\r\n }, [baseUrl])\r\n\r\n const hasPermission = useCallback((permission: string): boolean => {\r\n if (!user?.permissions) return false\r\n return user.permissions.includes('*') || user.permissions.includes(permission)\r\n }, [user])\r\n\r\n /** Called by LoginPanel/RegisterPanel on successful auth */\r\n function onAuthSuccess(token: string, refreshToken: string, userData: KaappuUser) {\r\n localStorage.setItem(TOKEN_KEY, token)\r\n localStorage.setItem(REFRESH_KEY, refreshToken)\r\n localStorage.setItem(USER_KEY, JSON.stringify(userData))\r\n // Set cookie so Next.js middleware (server-side) can see the token\r\n document.cookie = `kaappu_token=${encodeURIComponent(token)}; path=/; max-age=${15 * 60}; samesite=lax`\r\n setAccessToken(token)\r\n setUser(userData)\r\n setIsSignedIn(true)\r\n scheduleRefresh(token)\r\n }\r\n\r\n const contextValue: KaappuContextValue & { _onAuthSuccess?: typeof onAuthSuccess; _baseUrl?: string } = {\r\n isLoaded,\r\n isSignedIn,\r\n user,\r\n accessToken,\r\n tenantConfig,\r\n signOut,\r\n getToken,\r\n hasPermission,\r\n // Internal — used by LoginPanel/RegisterPanel without exposing in public types\r\n _onAuthSuccess: onAuthSuccess,\r\n _baseUrl: baseUrl,\r\n }\r\n\r\n return (\r\n <KaappuContext.Provider value={contextValue}>\r\n {children}\r\n </KaappuContext.Provider>\r\n )\r\n}\r\n","import type { KaappuAppearance } from '../types'\r\n\r\n/** Dark theme defaults (Kaappu's native aesthetic) */\r\nconst DARK_VARS: Record<string, string> = {\r\n '--k-primary': '#6366f1',\r\n '--k-primary-fg': '#ffffff',\r\n '--k-bg': '#0a0a0f',\r\n '--k-card-bg': '#111118',\r\n '--k-text': '#f0f6fc',\r\n '--k-muted': '#8b949e',\r\n '--k-border': 'rgba(240,246,252,0.12)',\r\n '--k-hover': 'rgba(240,246,252,0.06)',\r\n '--k-radius': '0.75rem',\r\n '--k-font': '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n '--k-shadow': '0 8px 32px rgba(0,0,0,0.4)',\r\n}\r\n\r\n/** Light theme defaults */\r\nconst LIGHT_VARS: Record<string, string> = {\r\n '--k-primary': '#6366f1',\r\n '--k-primary-fg': '#ffffff',\r\n '--k-bg': '#f5f5fa',\r\n '--k-card-bg': '#ffffff',\r\n '--k-text': '#111118',\r\n '--k-muted': '#6b7280',\r\n '--k-border': 'rgba(0,0,0,0.10)',\r\n '--k-hover': 'rgba(0,0,0,0.04)',\r\n '--k-radius': '0.75rem',\r\n '--k-font': '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n '--k-shadow': '0 8px 32px rgba(0,0,0,0.12)',\r\n}\r\n\r\n/**\r\n * Resolves the active color scheme.\r\n * 'auto' reads prefers-color-scheme at call time (SSR-safe — defaults to dark).\r\n */\r\nexport function resolveColorScheme(\r\n scheme: 'dark' | 'light' | 'auto' = 'dark'\r\n): 'dark' | 'light' {\r\n if (scheme !== 'auto') return scheme\r\n if (typeof window === 'undefined') return 'dark'\r\n return window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark'\r\n}\r\n\r\n/**\r\n * Build the CSS variables object to apply as `style` on the root element.\r\n * Merges theme defaults → branding primaryColor → appearance overrides.\r\n */\r\nexport function buildThemeVars(\r\n appearance?: KaappuAppearance,\r\n brandingColor?: string\r\n): React.CSSProperties {\r\n const scheme = resolveColorScheme(appearance?.colorScheme ?? 'dark')\r\n const base = scheme === 'light' ? { ...LIGHT_VARS } : { ...DARK_VARS }\r\n\r\n // Branding color from tenant config (lower priority than explicit appearance)\r\n if (brandingColor) base['--k-primary'] = brandingColor\r\n\r\n // Appearance variable overrides (highest priority)\r\n const v = appearance?.variables ?? {}\r\n if (v.primaryColor) base['--k-primary'] = v.primaryColor\r\n if (v.primaryForeground) base['--k-primary-fg'] = v.primaryForeground\r\n if (v.backgroundColor) base['--k-bg'] = v.backgroundColor\r\n if (v.cardBackground) base['--k-card-bg'] = v.cardBackground\r\n if (v.textColor) base['--k-text'] = v.textColor\r\n if (v.mutedColor) base['--k-muted'] = v.mutedColor\r\n if (v.borderColor) base['--k-border'] = v.borderColor\r\n if (v.borderRadius) base['--k-radius'] = v.borderRadius\r\n if (v.fontFamily) base['--k-font'] = v.fontFamily\r\n\r\n return base as React.CSSProperties\r\n}\r\n\r\n/**\r\n * createTheme() — convenience helper for customers who want to define a\r\n * theme object once and reuse it across multiple components.\r\n *\r\n * @example\r\n * const theme = createTheme({ colorScheme: 'light', variables: { primaryColor: '#0ea5e9' } })\r\n * <LoginPanel appearance={theme} />\r\n * <ProfileBadge appearance={theme} />\r\n */\r\nexport function createTheme(appearance: KaappuAppearance): KaappuAppearance {\r\n return appearance\r\n}\r\n\r\n// ── Shared inline style constants (used across all SDK components) ──────────\r\n\r\nexport const cardStyle: React.CSSProperties = {\r\n background: 'var(--k-card-bg)',\r\n border: '1px solid var(--k-border)',\r\n borderRadius: 'var(--k-radius)',\r\n padding: '2rem',\r\n width: '100%',\r\n maxWidth: '420px',\r\n fontFamily: 'var(--k-font)',\r\n color: 'var(--k-text)',\r\n boxSizing: 'border-box',\r\n boxShadow: 'var(--k-shadow)',\r\n}\r\n\r\nexport const inputStyle: React.CSSProperties = {\r\n width: '100%',\r\n padding: '0.625rem 0.875rem',\r\n background: 'var(--k-hover)',\r\n border: '1px solid var(--k-border)',\r\n borderRadius: 'calc(var(--k-radius) * 0.6)',\r\n color: 'var(--k-text)',\r\n fontSize: '0.875rem',\r\n outline: 'none',\r\n boxSizing: 'border-box',\r\n fontFamily: 'var(--k-font)',\r\n}\r\n\r\nexport const primaryButtonStyle: React.CSSProperties = {\r\n width: '100%',\r\n padding: '0.625rem 1rem',\r\n background: 'var(--k-primary)',\r\n color: 'var(--k-primary-fg)',\r\n border: 'none',\r\n borderRadius: 'calc(var(--k-radius) * 0.6)',\r\n fontSize: '0.875rem',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n fontFamily: 'var(--k-font)',\r\n}\r\n\r\nexport const ghostButtonStyle: React.CSSProperties = {\r\n width: '100%',\r\n padding: '0.625rem 1rem',\r\n background: 'var(--k-hover)',\r\n color: 'var(--k-text)',\r\n border: '1px solid var(--k-border)',\r\n borderRadius: 'calc(var(--k-radius) * 0.6)',\r\n fontSize: '0.875rem',\r\n fontWeight: 500,\r\n cursor: 'pointer',\r\n fontFamily: 'var(--k-font)',\r\n}\r\n\r\nexport const labelStyle: React.CSSProperties = {\r\n display: 'block',\r\n fontSize: '0.8125rem',\r\n fontWeight: 500,\r\n color: 'var(--k-muted)',\r\n marginBottom: '0.375rem',\r\n}\r\n\r\nexport const errorStyle: React.CSSProperties = {\r\n fontSize: '0.8125rem',\r\n color: '#ef4444',\r\n marginTop: '0.25rem',\r\n}\r\n","'use client'\n\nimport React, { useContext, useState } from 'react'\nimport { KaappuContext } from '../context/KaappuContext'\nimport type { KaappuUser, LoginPanelProps } from '../types'\nimport { buildThemeVars, resolveColorScheme } from '../theme'\n\ntype Tab = 'password' | 'magic' | 'otp' | 'phone'\n\n/**\n * <LoginPanel /> — Drop-in sign-in component.\n *\n * Renders the full Kaappu authentication UI: OAuth providers, passkey,\n * email/password, magic link, OTP, and phone tabs.\n *\n * All auth calls go through the configured middleware (Next.js API routes\n * at /api/auth/*) — never directly to igai-connector.\n *\n * @example\n * // Inside <KaappuProvider baseUrl=\"/api/auth\">\n * <LoginPanel onSuccess={(token, user) => router.push('/')} />\n *\n * // Or standalone without KaappuProvider:\n * <LoginPanel\n * authUrl=\"https://myapp.com/api/auth\"\n * accountId=\"kaappu_org\"\n * onSuccess={(token, user) => { ... }}\n * />\n */\nexport function LoginPanel({\n onSuccess,\n redirectUrl,\n logoUrl,\n appearance,\n className,\n oauthProxyUrl,\n allowedProviders,\n // New props for standalone usage (without KaappuProvider)\n authUrl: authUrlProp,\n accountId: accountIdProp,\n signUpPath = '/sign-up',\n signUpLabel = 'Enroll Identity',\n signUpPrompt = 'New operator?',\n}: LoginPanelProps & {\n authUrl?: string\n accountId?: string\n signUpPath?: string\n signUpLabel?: string\n signUpPrompt?: string\n}) {\n // Try KaappuProvider context first, fall back to standalone props\n const ctx = useContext(KaappuContext) as any\n const config = ctx?.tenantConfig\n // authUrlProp = explicit proxy URL (e.g., /api/auth for Next.js proxy)\n // ctx._baseUrl = IDM root URL (e.g., http://server/igai)\n // If using IDM directly (no proxy), append the full API path\n const rawBase: string = authUrlProp ?? ctx?._baseUrl ?? '/api/auth'\n const baseUrl: string = rawBase.includes('/api/auth') || rawBase.includes('/idm/auth')\n ? rawBase\n : rawBase.endsWith('/igai') || rawBase.includes(':9091')\n ? `${rawBase}/api/v1/idm/auth`\n : rawBase\n const accountId = accountIdProp ?? config?.accountId ?? 'default'\n\n const [tab, setTab] = useState<Tab>('password')\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [showPassword, setShowPassword] = useState(false)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [info, setInfo] = useState<string | null>(null)\n\n // ── Auth handlers ─────────────────────────────────────────────────────────\n\n async function handlePasswordSignIn(e: React.FormEvent) {\n e.preventDefault()\n setError(null)\n setLoading(true)\n try {\n const res = await fetch(`${baseUrl}/sign-in`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email, password, accountId }),\n })\n const data = await res.json()\n if (!data.success && !data.data) {\n setError(data.error ?? 'Sign in failed')\n return\n }\n const { accessToken, refreshToken, user } = data.data ?? data\n const mapped = mapUser(user, accountId)\n ctx?._onAuthSuccess?.(accessToken, refreshToken, mapped)\n onSuccess?.(accessToken, mapped)\n if (redirectUrl) window.location.href = redirectUrl\n } catch {\n setError('Unable to connect. Please try again.')\n } finally {\n setLoading(false)\n }\n }\n\n async function handleMagicLink(e: React.FormEvent) {\n e.preventDefault()\n setError(null)\n setLoading(true)\n try {\n const res = await fetch(`${baseUrl}/magic-link`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email, accountId }),\n })\n if (res.ok) {\n setInfo(`Magic link sent to ${email}. Check your inbox.`)\n } else {\n const d = await res.json().catch(() => ({}))\n setError(d.error ?? 'Could not send magic link')\n }\n } catch {\n setError('Unable to connect.')\n } finally {\n setLoading(false)\n }\n }\n\n async function handleOtpRequest(e: React.FormEvent) {\n e.preventDefault()\n setError(null)\n setLoading(true)\n try {\n const res = await fetch(`${baseUrl}/email-otp`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email, accountId }),\n })\n if (res.ok) {\n setInfo(`A 6-digit code was sent to ${email}`)\n } else {\n const d = await res.json().catch(() => ({}))\n setError(d.error ?? 'Could not send code')\n }\n } catch {\n setError('Unable to connect.')\n } finally {\n setLoading(false)\n }\n }\n\n function handleOAuth(provider: string) {\n if (oauthProxyUrl) {\n // Use external proxy (e.g., WordPress plugin handles the OAuth flow)\n window.location.href = `${oauthProxyUrl}/${provider}`\n } else {\n const redirect = redirectUrl ?? window.location.href\n window.location.href = `${baseUrl}/oauth/${provider}?redirect=${encodeURIComponent(redirect)}`\n }\n }\n\n // ── Theme ─────────────────────────────────────────────────────────────────\n const resolvedLogo = logoUrl ?? config?.branding?.logoUrl ?? '/kaappu-logo.png'\n const cssVars = buildThemeVars(appearance, config?.branding?.primaryColor)\n\n const isDark = resolveColorScheme(appearance?.colorScheme) === 'dark'\n\n return (\n <div\n style={{\n ...cssVars,\n background: isDark ? '#030712' : 'var(--k-bg, #f5f5fa)',\n minHeight: isDark ? '100vh' : undefined,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n position: 'relative',\n overflow: 'hidden',\n padding: isDark ? undefined : '1rem 0',\n }}\n className={className}\n >\n {/* Background effects (dark mode only) */}\n {isDark && <div style={{ position: 'absolute', inset: 0, background: 'radial-gradient(circle at 20% 30%, rgba(99,102,241,0.12) 0%, transparent 60%), radial-gradient(circle at 80% 70%, rgba(139,92,246,0.08) 0%, transparent 60%)', zIndex: 0 }} />}\n {isDark && <div style={{ position: 'absolute', inset: 0, backgroundImage: 'linear-gradient(rgba(255,255,255,0.02) 1px, transparent 1px), linear-gradient(90deg, rgba(255,255,255,0.02) 1px, transparent 1px)', backgroundSize: '40px 40px', zIndex: 1 }} />}\n\n <div style={CARD}>\n {/* Brand */}\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', marginBottom: 32 }}>\n <img src={resolvedLogo} alt=\"Logo\" style={{ height: isDark ? 120 : 52, marginBottom: 4, filter: isDark ? 'drop-shadow(0 0 20px rgba(99,102,241,0.3))' : 'none' }} />\n <p style={{ color: 'var(--k-muted, #8b949e)', fontSize: 13, marginTop: 12, textAlign: 'center' }}>\n Welcome back! Please sign in to continue.\n </p>\n </div>\n\n {/* OAuth buttons */}\n {(() => {\n const allProviders = [\n { id: 'google', label: 'Google', icon: <GoogleIcon /> },\n { id: 'github', label: 'GitHub', icon: <GithubIcon /> },\n { id: 'microsoft', label: 'Microsoft', icon: <MicrosoftIcon /> },\n { id: 'apple', label: 'Apple', icon: <AppleIcon /> },\n ]\n const visible = allProviders.filter(p => {\n // If allowedProviders is set, only show those\n if (allowedProviders && allowedProviders.length > 0) return allowedProviders.includes(p.id)\n // Otherwise, check tenant config\n return config?.authMethods?.[p.id as keyof typeof config.authMethods] !== false\n })\n if (visible.length === 0) return null\n\n // Single provider: show full-width \"Continue with X\" button\n if (visible.length === 1) {\n const p = visible[0]\n return (\n <button onClick={() => handleOAuth(p.id)} style={{\n ...OAUTH_BTN, display: 'flex', gap: 10, padding: '12px 16px',\n width: '100%', marginBottom: 12, fontSize: 14, fontWeight: 500,\n }}\n onMouseEnter={e => (e.currentTarget.style.background = 'var(--k-hover, rgba(255,255,255,0.08))')}\n onMouseLeave={e => (e.currentTarget.style.background = 'var(--k-hover, rgba(255,255,255,0.04))')}>\n {p.icon} <span>Continue with {p.label}</span>\n </button>\n )\n }\n\n // Multiple providers: show icon grid\n const cols = Math.min(visible.length, 4)\n return (\n <div style={{ display: 'grid', gridTemplateColumns: `repeat(${cols}, 1fr)`, gap: 10, marginBottom: 12 }}>\n {visible.map(p => (\n <button key={p.id} onClick={() => handleOAuth(p.id)} style={OAUTH_BTN}\n onMouseEnter={e => (e.currentTarget.style.background = 'var(--k-hover, rgba(255,255,255,0.08))')}\n onMouseLeave={e => (e.currentTarget.style.background = 'var(--k-hover, rgba(255,255,255,0.04))')}>\n {p.icon}\n </button>\n ))}\n </div>\n )\n })()}\n\n {/* Passkey */}\n <button style={PASSKEY_BTN}\n onMouseEnter={e => (e.currentTarget.style.background = 'rgba(99,102,241,0.15)')}\n onMouseLeave={e => (e.currentTarget.style.background = 'rgba(99,102,241,0.08)')}>\n <FingerprintIcon /> Sign in with Passkey\n </button>\n\n {/* Divider */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, marginBottom: 24, color: 'var(--k-muted, #484f58)', fontSize: 11, fontWeight: 700, textTransform: 'uppercase' as const, letterSpacing: '0.1em' }}>\n <div style={{ flex: 1, height: 1, background: 'var(--k-border, rgba(255,255,255,0.06))' }} />\n or use email\n <div style={{ flex: 1, height: 1, background: 'var(--k-border, rgba(255,255,255,0.06))' }} />\n </div>\n\n {/* Tabs */}\n <div style={{ display: 'flex', background: 'var(--k-hover, rgba(255,255,255,0.04))', borderRadius: 10, padding: 3, marginBottom: 24 }}>\n {([\n { key: 'password' as Tab, label: '\\uD83D\\uDD11 Password' },\n { key: 'magic' as Tab, label: '\\u2728 Magic Link' },\n { key: 'otp' as Tab, label: '\\uD83D\\uDCE7 Email OTP' },\n { key: 'phone' as Tab, label: '\\uD83D\\uDCF1 Phone' },\n ]).map(({ key, label }) => (\n <button key={key} onClick={() => { setTab(key); setError(null); setInfo(null) }}\n style={{\n flex: 1, padding: '7px 2px', borderRadius: 8, fontSize: 10, fontWeight: 700, cursor: 'pointer',\n background: tab === key ? 'rgba(99,102,241,0.2)' : 'transparent',\n color: tab === key ? '#818cf8' : '#8b949e',\n border: 'none', transition: 'all 0.15s ease',\n }}>\n {label}\n </button>\n ))}\n </div>\n\n {/* Error / Info */}\n {error && <div style={ERROR_BANNER}>{error}</div>}\n {info && <p style={{ fontSize: 13, color: '#34d399', marginBottom: 12, textAlign: 'center' }}>{info}</p>}\n\n {/* Form */}\n <form onSubmit={tab === 'magic' ? handleMagicLink : tab === 'otp' ? handleOtpRequest : handlePasswordSignIn}>\n {/* Email */}\n <div style={{ marginBottom: 16 }}>\n <label style={LABEL}>Work Email</label>\n <div style={INPUT_ROW}>\n <div style={ICON_BOX}><MailIcon /></div>\n <input type=\"email\" value={email} onChange={e => setEmail(e.target.value)}\n placeholder=\"name@company.com\" required\n style={INPUT} />\n </div>\n </div>\n\n {/* Password (password tab only) */}\n {tab === 'password' && (\n <div style={{ marginBottom: 16 }}>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 6, marginLeft: 4 }}>\n <label style={{ ...LABEL, marginBottom: 0 }}>Access Key</label>\n <span style={{ fontSize: 11, color: 'var(--k-primary, #818cf8)', fontWeight: 700, cursor: 'pointer' }}>Recover</span>\n </div>\n <div style={INPUT_ROW}>\n <div style={ICON_BOX}><LockIcon /></div>\n <input type={showPassword ? 'text' : 'password'} value={password}\n onChange={e => setPassword(e.target.value)} placeholder=\"••••••••\" required\n style={{ ...INPUT, paddingRight: 0 }} />\n <button type=\"button\" onClick={() => setShowPassword(!showPassword)}\n style={{ width: 48, height: '100%', display: 'flex', alignItems: 'center', justifyContent: 'center', background: 'none', border: 'none', cursor: 'pointer', color: 'var(--k-muted, #484f58)' }}>\n {showPassword ? <EyeOffIcon /> : <EyeIcon />}\n </button>\n </div>\n </div>\n )}\n\n {tab === 'magic' && <p style={HINT}>We'll send a one-click sign-in link to your email.</p>}\n {tab === 'otp' && <p style={HINT}>We'll send a 6-digit code to your email. No password needed.</p>}\n {tab === 'phone' && <p style={HINT}>We'll send a 6-digit code via SMS. No password needed.</p>}\n\n {/* Submit */}\n <button type=\"submit\" disabled={loading} style={{\n ...PRIMARY_BTN,\n opacity: loading ? 0.6 : 1,\n cursor: loading ? 'not-allowed' : 'pointer',\n }}>\n {loading ? <SpinnerIcon /> : null}\n {tab === 'password' && 'Authenticate'}\n {tab === 'magic' && 'Send Magic Link'}\n {tab === 'otp' && 'Send Code'}\n {tab === 'phone' && 'Send Code'}\n {!loading && <ArrowIcon />}\n </button>\n </form>\n\n {/* Sign up link */}\n <p style={{ textAlign: 'center', fontSize: 14, color: 'var(--k-muted, #8b949e)', marginTop: 28 }}>\n {signUpPrompt}{' '}\n <a href={signUpPath} style={{ color: 'var(--k-primary, #818cf8)', textDecoration: 'none', fontWeight: 700 }}>{signUpLabel}</a>\n </p>\n\n {/* Protected by Kaappu */}\n <div style={{ marginTop: 32, borderTop: '1px solid var(--k-border, rgba(255,255,255,0.06))', paddingTop: 20, textAlign: 'center' }}>\n <div style={{ display: 'inline-flex', alignItems: 'center', gap: 8, opacity: 0.4 }}>\n <ShieldIcon />\n <span style={{ fontSize: 10, fontWeight: 800, textTransform: 'uppercase' as const, letterSpacing: '0.3em', color: 'var(--k-muted, #8b949e)' }}>Protected by Kaappu</span>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\n// ── Styles ──────────────────────────────────────────────────────────────────\n\nconst CARD: React.CSSProperties = {\n width: '100%', maxWidth: 420,\n background: 'var(--k-card-bg, rgba(13, 17, 23, 0.9))',\n border: '1px solid var(--k-border, rgba(255,255,255,0.1))',\n borderRadius: 24, padding: 40,\n position: 'relative', zIndex: 10,\n backdropFilter: 'blur(20px)',\n boxShadow: 'var(--k-shadow, 0 25px 80px rgba(0,0,0,0.5))',\n}\n\nconst INPUT_ROW: React.CSSProperties = {\n display: 'flex', alignItems: 'center',\n background: 'var(--k-hover, rgba(255,255,255,0.03))',\n border: '1px solid var(--k-border, rgba(255,255,255,0.08))',\n borderRadius: 12, height: 52, overflow: 'hidden',\n}\n\nconst INPUT: React.CSSProperties = {\n flex: 1, background: 'transparent', border: 'none', outline: 'none',\n color: 'var(--k-text, #f0f6fc)', fontSize: 15, paddingRight: 16,\n}\n\nconst ICON_BOX: React.CSSProperties = {\n width: 48, display: 'flex', alignItems: 'center', justifyContent: 'center', color: 'var(--k-muted, #484f58)',\n}\n\nconst LABEL: React.CSSProperties = {\n display: 'block', fontSize: 11, fontWeight: 800, color: 'var(--k-muted, #484f58)',\n textTransform: 'uppercase' as const, letterSpacing: '0.1em', marginBottom: 6, marginLeft: 4,\n}\n\nconst HINT: React.CSSProperties = {\n fontSize: 12, color: 'var(--k-muted, #8b949e)', marginBottom: 12, marginLeft: 4,\n}\n\nconst PRIMARY_BTN: React.CSSProperties = {\n width: '100%', height: 56, marginTop: 8,\n background: 'linear-gradient(135deg, #6366f1, #8b5cf6)',\n color: 'white', border: 'none', borderRadius: 14,\n fontSize: 15, fontWeight: 700,\n boxShadow: '0 10px 25px rgba(99,102,241,0.3)',\n display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 10,\n}\n\nconst OAUTH_BTN: React.CSSProperties = {\n padding: 10, display: 'flex', alignItems: 'center', justifyContent: 'center',\n background: 'var(--k-hover, rgba(255,255,255,0.04))', border: '1px solid var(--k-border, rgba(255,255,255,0.08))',\n borderRadius: 12, cursor: 'pointer', color: 'var(--k-text, #f0f6fc)',\n}\n\nconst PASSKEY_BTN: React.CSSProperties = {\n width: '100%', marginBottom: 12, padding: '10px 16px',\n display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 8,\n background: 'rgba(99,102,241,0.08)', border: '1px solid rgba(99,102,241,0.2)',\n borderRadius: 12, cursor: 'pointer', color: 'var(--k-primary, #818cf8)', fontSize: 13, fontWeight: 600,\n}\n\nconst ERROR_BANNER: React.CSSProperties = {\n background: 'rgba(248,81,73,0.1)', border: '1px solid rgba(248,81,73,0.2)',\n borderRadius: 10, padding: '10px 14px', fontSize: 13, color: '#f85149',\n textAlign: 'center', fontWeight: 600, marginBottom: 16,\n}\n\n// ── Inline SVG icons (no external deps) ─────────────────────────────────────\n\nconst GoogleIcon = () => (\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\">\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" fill=\"#4285F4\"/>\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\"/>\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l3.66-2.84z\" fill=\"#FBBC05\"/>\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.66l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\"/>\n </svg>\n)\nconst GithubIcon = () => (\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\n <path d=\"M12 2C6.477 2 2 6.477 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33.85 0 1.71.11 2.5.33 1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0012 2z\"/>\n </svg>\n)\nconst MicrosoftIcon = () => (\n <svg viewBox=\"0 0 23 23\" width=\"16\" height=\"16\">\n <path fill=\"#f3f3f3\" d=\"M0 0h11v11H0zM12 0h11v11H12zM0 12h11v11H0zM12 12h11v11H12z\"/>\n </svg>\n)\nconst AppleIcon = () => (\n <svg viewBox=\"0 0 384 512\" width=\"20\" height=\"20\" fill=\"currentColor\">\n <path d=\"M318.7 268.7c-.2-36.7 16.4-64.4 50-84.8-18.8-26.9-47.2-41.7-84.7-44.6-35.5-2.8-74.3 20.7-88.5 20.7-15 0-49.4-19.7-76.4-19.7C63.3 141.2 4 184.8 4 273.5q0 39.3 14.4 81.2c12.8 36.7 59 126.7 107.2 125.2 25.2-.6 43-17.9 75.8-17.9 31.8 0 48.3 17.9 76.4 17.9 48.6-.7 90.4-82.5 102.6-119.3-65.2-30.7-61.7-90-61.7-91.9zm-56.6-164.2c27.3-32.4 24.8-61.9 24-72.5-24.1 1.4-52 16.4-67.9 34.9-17.5 19.8-27.8 44.3-25.6 71.9 26.1 2 49.9-11.4 69.5-34.3z\"/>\n </svg>\n)\nconst FingerprintIcon = () => (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M2 12C2 6.5 6.5 2 12 2a10 10 0 0 1 8 4\"/><path d=\"M5 19.5C5.5 18 6 15 6 12c0-3.5 2.5-6 6-6 3 0 5.5 2 5.8 5\"/><path d=\"M12 12v4s.9 3 3.3 5\"/><path d=\"M8.5 18c.5-2 .5-4 .5-6 0-1.7 1.3-3 3-3s3 1.3 3 3c0 2-.5 4.5-1.5 6.5\"/><path d=\"M14 21c.5-2 .5-4.5 0-7\"/>\n </svg>\n)\nconst MailIcon = () => <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><rect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\"/><path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\"/></svg>\nconst LockIcon = () => <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\"/><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"/></svg>\nconst EyeIcon = () => <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>\nconst EyeOffIcon = () => <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\"/><path d=\"M14.084 14.158a3 3 0 0 1-4.242-4.242\"/><path d=\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\"/><path d=\"m2 2 20 20\"/></svg>\nconst ArrowIcon = () => <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M5 12h14\"/><path d=\"m12 5 7 7-7 7\"/></svg>\nconst ShieldIcon = () => <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"#8b949e\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\"/></svg>\nconst SpinnerIcon = () => <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" style={{ animation: 'kaappu-spin 1s linear infinite' }}><path d=\"M21 12a9 9 0 1 1-6.219-8.56\"/></svg>\n\nfunction mapUser(raw: any, accountId: string): KaappuUser {\n return {\n id: raw.id ?? raw.userId,\n email: raw.email,\n firstName: raw.firstName,\n lastName: raw.lastName,\n avatarUrl: raw.avatarUrl,\n emailVerified: raw.emailVerified,\n mfaEnabled: raw.mfaEnabled,\n accountId: raw.accountId ?? accountId,\n sessionId: raw.sessionId ?? '',\n roles: raw.roles ?? [],\n permissions: raw.permissions ?? [],\n }\n}\n","'use client'\n\nimport React, { useContext, useState } from 'react'\nimport { KaappuContext } from '../context/KaappuContext'\nimport type { KaappuUser, RegisterPanelProps } from '../types'\nimport { buildThemeVars, resolveColorScheme } from '../theme'\n\n/**\n * <RegisterPanel /> — Drop-in sign-up component.\n *\n * Renders the full Kaappu registration UI: OAuth providers, name/email/\n * password form with confirm-password and live password rule indicators,\n * friendly error messages, and an optional email-verification step.\n *\n * Designed for visual parity with <LoginPanel /> so apps can wire both\n * components into a single onboarding flow.\n *\n * @example\n * // Inside <KaappuProvider baseUrl=\"/api/auth\">\n * <RegisterPanel onSuccess={(token, user) => router.push('/')} />\n *\n * // Standalone (no provider needed):\n * <RegisterPanel\n * authUrl=\"https://myapp.com/api/auth\"\n * accountId=\"acme\"\n * onSuccess={(token, user) => { ... }}\n * />\n */\nexport function RegisterPanel({\n onSuccess,\n redirectUrl,\n logoUrl,\n appearance,\n className,\n // Standalone-mode props (no KaappuProvider required)\n authUrl: authUrlProp,\n accountId: accountIdProp,\n signInPath = '/sign-in',\n signInLabel = 'Sign in',\n signInPrompt = 'Already have an account?',\n // OAuth provider gating (mirrors LoginPanel)\n allowedProviders,\n oauthProxyUrl,\n}: RegisterPanelProps & {\n authUrl?: string\n accountId?: string\n signInPath?: string\n signInLabel?: string\n signInPrompt?: string\n allowedProviders?: string[]\n oauthProxyUrl?: string\n}) {\n // Try KaappuProvider context first; fall back to standalone props.\n const ctx = useContext(KaappuContext) as any\n const config = ctx?.tenantConfig\n\n // baseUrl resolution mirrors LoginPanel exactly so registrations and\n // sign-ins hit the same gateway.\n const rawBase: string = authUrlProp ?? ctx?._baseUrl ?? '/api/auth'\n const baseUrl: string = rawBase.includes('/api/auth') || rawBase.includes('/idm/auth')\n ? rawBase\n : rawBase.endsWith('/igai') || rawBase.includes(':9091')\n ? `${rawBase}/api/v1/idm/auth`\n : rawBase\n const accountId = accountIdProp ?? config?.accountId ?? 'default'\n\n // ── Form state ────────────────────────────────────────────────────────────\n const [firstName, setFirstName] = useState('')\n const [lastName, setLastName] = useState('')\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [confirm, setConfirm] = useState('')\n const [showPassword, setShowPassword] = useState(false)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [step, setStep] = useState<'form' | 'verify'>('form')\n\n // ── Password rule evaluation ──────────────────────────────────────────────\n const rules = {\n length: password.length >= 8,\n letter: /[A-Za-z]/.test(password),\n number: /\\d/.test(password),\n symbol: /[^A-Za-z0-9]/.test(password),\n }\n const passwordsMatch = confirm.length > 0 && password === confirm\n const passwordStrong = rules.length && rules.letter && rules.number\n const canSubmit = firstName && lastName && email && passwordStrong && passwordsMatch && !loading\n\n // ── Sign-up handler ───────────────────────────────────────────────────────\n async function handleSignUp(e: React.FormEvent) {\n e.preventDefault()\n setError(null)\n if (!passwordStrong) {\n setError('Password must be at least 8 characters and include letters and numbers.')\n return\n }\n if (!passwordsMatch) {\n setError('Passwords do not match.')\n return\n }\n setLoading(true)\n try {\n const res = await fetch(`${baseUrl}/sign-up`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email, password, firstName, lastName, accountId }),\n })\n const data = await res.json()\n if (!res.ok && !data.success) {\n setError(friendlyError(data.error ?? data.code))\n return\n }\n\n const payload = data.data ?? data\n const { accessToken, refreshToken, user } = payload\n if (accessToken) {\n // Auto sign-in after registration\n const mapped = mapUser(user, accountId)\n ctx?._onAuthSuccess?.(accessToken, refreshToken, mapped)\n onSuccess?.(accessToken, mapped)\n if (redirectUrl) window.location.href = redirectUrl\n } else {\n // Email verification required\n setStep('verify')\n }\n } catch {\n setError('Unable to connect. Please try again.')\n } finally {\n setLoading(false)\n }\n }\n\n function handleOAuth(provider: string) {\n if (oauthProxyUrl) {\n window.location.href = `${oauthProxyUrl}/${provider}`\n } else {\n const redirect = redirectUrl ?? window.location.href\n window.location.href = `${baseUrl}/oauth/${provider}?redirect=${encodeURIComponent(redirect)}`\n }\n }\n\n // ── Theme ─────────────────────────────────────────────────────────────────\n const resolvedLogo = logoUrl ?? config?.branding?.logoUrl ?? '/kaappu-logo.png'\n const cssVars = buildThemeVars(appearance, config?.branding?.primaryColor)\n const isDark = resolveColorScheme(appearance?.colorScheme) === 'dark'\n\n // ── Email verification step ───────────────────────────────────────────────\n if (step === 'verify') {\n return (\n <div\n style={{\n ...cssVars,\n background: isDark ? '#030712' : 'var(--k-bg, #f5f5fa)',\n minHeight: isDark ? '100vh' : undefined,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: isDark ? undefined : '1rem 0',\n }}\n className={className}\n >\n <div style={CARD}>\n <div style={{ textAlign: 'center' }}>\n <div style={{ fontSize: 40, marginBottom: 12 }}>{'\\u2709\\uFE0F'}</div>\n <h2 style={{ margin: '0 0 8px', fontSize: 22, fontWeight: 700, color: 'var(--k-text, #f0f6fc)' }}>\n Check your inbox\n </h2>\n <p style={{ margin: 0, fontSize: 14, color: 'var(--k-muted, #8b949e)', lineHeight: 1.6 }}>\n We sent a verification link to{' '}\n <strong style={{ color: 'var(--k-text, #f0f6fc)' }}>{email}</strong>.\n Click the link to activate your account.\n </p>\n </div>\n <ProtectedFooter />\n </div>\n </div>\n )\n }\n\n // ── Main form ─────────────────────────────────────────────────────────────\n return (\n <div\n style={{\n ...cssVars,\n background: isDark ? '#030712' : 'var(--k-bg, #f5f5fa)',\n minHeight: isDark ? '100vh' : undefined,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n position: 'relative',\n overflow: 'hidden',\n padding: isDark ? '40px 16px' : '1rem 0',\n }}\n className={className}\n >\n {/* Background effects (dark mode only) */}\n {isDark && <div style={{ position: 'absolute', inset: 0, background: 'radial-gradient(circle at 20% 30%, rgba(99,102,241,0.12) 0%, transparent 60%), radial-gradient(circle at 80% 70%, rgba(139,92,246,0.08) 0%, transparent 60%)', zIndex: 0 }} />}\n {isDark && <div style={{ position: 'absolute', inset: 0, backgroundImage: 'linear-gradient(rgba(255,255,255,0.02) 1px, transparent 1px), linear-gradient(90deg, rgba(255,255,255,0.02) 1px, transparent 1px)', backgroundSize: '40px 40px', zIndex: 1 }} />}\n\n <div style={CARD}>\n {/* Brand */}\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', marginBottom: 24 }}>\n <img src={resolvedLogo} alt=\"Logo\"\n style={{ height: isDark ? 96 : 52, marginBottom: 6, filter: isDark ? 'drop-shadow(0 0 20px rgba(99,102,241,0.30))' : 'none' }} />\n <h2 style={{ color: 'var(--k-text, #f0f6fc)', fontSize: 22, fontWeight: 700, margin: '4px 0 6px 0' }}>\n Create your account\n </h2>\n <p style={{ color: 'var(--k-muted, #8b949e)', fontSize: 13, margin: 0, textAlign: 'center' }}>\n Join {config?.branding?.name ?? 'Kaappu'} to get started.\n </p>\n </div>\n\n {/* OAuth providers (gated by allowedProviders / tenant config) */}\n {(() => {\n const allProviders = [\n { id: 'google', label: 'Google', icon: <GoogleIcon /> },\n { id: 'github', label: 'GitHub', icon: <GithubIcon /> },\n { id: 'microsoft', label: 'Microsoft', icon: <MicrosoftIcon /> },\n { id: 'apple', label: 'Apple', icon: <AppleIcon /> },\n ]\n const visible = allProviders.filter(p => {\n if (allowedProviders && allowedProviders.length > 0) return allowedProviders.includes(p.id)\n return config?.authMethods?.[p.id as keyof typeof config.authMethods] !== false\n })\n if (visible.length === 0) return null\n\n if (visible.length === 1) {\n const p = visible[0]\n return (\n <button type=\"button\" onClick={() => handleOAuth(p.id)} style={{\n ...OAUTH_BTN, gap: 10, padding: '12px 16px',\n width: '100%', marginBottom: 14, fontSize: 14, fontWeight: 500,\n }}\n onMouseEnter={e => (e.currentTarget.style.background = 'var(--k-hover, rgba(255,255,255,0.08))')}\n onMouseLeave={e => (e.currentTarget.style.background = 'var(--k-hover, rgba(255,255,255,0.04))')}>\n {p.icon}<span>Continue with {p.label}</span>\n </button>\n )\n }\n\n const cols = Math.min(visible.length, 4)\n return (\n <div style={{ display: 'grid', gridTemplateColumns: `repeat(${cols}, 1fr)`, gap: 10, marginBottom: 14 }}>\n {visible.map(p => (\n <button key={p.id} type=\"button\" onClick={() => handleOAuth(p.id)} style={OAUTH_BTN}\n onMouseEnter={e => (e.currentTarget.style.background = 'var(--k-hover, rgba(255,255,255,0.08))')}\n onMouseLeave={e => (e.currentTarget.style.background = 'var(--k-hover, rgba(255,255,255,0.04))')}>\n {p.icon}\n </button>\n ))}\n </div>\n )\n })()}\n\n {/* Divider */}\n <div style={{\n display: 'flex', alignItems: 'center', gap: 12,\n marginTop: 4, marginBottom: 18,\n color: 'var(--k-muted, #484f58)', fontSize: 11, fontWeight: 700,\n textTransform: 'uppercase', letterSpacing: '0.1em',\n }}>\n <div style={{ flex: 1, height: 1, background: 'var(--k-border, rgba(255,255,255,0.06))' }} />\n or with email\n <div style={{ flex: 1, height: 1, background: 'var(--k-border, rgba(255,255,255,0.06))' }} />\n </div>\n\n {/* Error banner */}\n {error && (\n <div style={ERROR_BANNER}>\n <AlertIcon />\n <span>{error}</span>\n </div>\n )}\n\n <form onSubmit={handleSignUp}>\n {/* Name fields — min-width:0 forces grid columns to honor their width */}\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 12, marginBottom: 14 }}>\n <div style={{ minWidth: 0 }}>\n <label style={LABEL}>First name</label>\n <div style={INPUT_ROW}>\n <div style={ICON_BOX}><UserIcon /></div>\n <input type=\"text\" value={firstName} onChange={e => setFirstName(e.target.value)}\n placeholder=\"Jane\" required autoComplete=\"given-name\"\n style={{ ...INPUT, minWidth: 0, width: '100%' }} />\n </div>\n </div>\n <div style={{ minWidth: 0 }}>\n <label style={LABEL}>Last name</label>\n <div style={INPUT_ROW}>\n <div style={ICON_BOX}><UserIcon /></div>\n <input type=\"text\" value={lastName} onChange={e => setLastName(e.target.value)}\n placeholder=\"Doe\" required autoComplete=\"family-name\"\n style={{ ...INPUT, minWidth: 0, width: '100%' }} />\n </div>\n </div>\n </div>\n\n {/* Email */}\n <div style={{ marginBottom: 14 }}>\n <label style={LABEL}>Work email</label>\n <div style={INPUT_ROW}>\n <div style={ICON_BOX}><MailIcon /></div>\n <input type=\"email\" value={email} onChange={e => setEmail(e.target.value)}\n placeholder=\"you@company.com\" required autoComplete=\"email\" style={INPUT} />\n </div>\n </div>\n\n {/* Password */}\n <div style={{ marginBottom: 12 }}>\n <label style={LABEL}>Password</label>\n <div style={INPUT_ROW}>\n <div style={ICON_BOX}><LockIcon /></div>\n <input type={showPassword ? 'text' : 'password'} value={password}\n onChange={e => setPassword(e.target.value)}\n placeholder=\"At least 8 characters\" required minLength={8}\n autoComplete=\"new-password\"\n style={{ ...INPUT, paddingRight: 0 }} />\n <button type=\"button\" onClick={() => setShowPassword(!showPassword)}\n aria-label={showPassword ? 'Hide password' : 'Show password'}\n style={{ width: 44, height: '100%', display: 'flex', alignItems: 'center', justifyContent: 'center', background: 'none', border: 'none', cursor: 'pointer', color: 'var(--k-muted, #6b7280)' }}>\n {showPassword ? <EyeOffIcon /> : <EyeIcon />}\n </button>\n </div>\n {password.length > 0 && (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '6px 14px', marginTop: 8, marginLeft: 4, fontSize: 11 }}>\n <RuleChip ok={rules.length} label=\"8+ characters\" />\n <RuleChip ok={rules.letter} label=\"letter\" />\n <RuleChip ok={rules.number} label=\"number\" />\n <RuleChip ok={rules.symbol} label=\"symbol (recommended)\" optional />\n </div>\n )}\n </div>\n\n {/* Confirm password */}\n <div style={{ marginBottom: 16 }}>\n <label style={LABEL}>Confirm password</label>\n <div style={{\n ...INPUT_ROW,\n ...(confirm.length > 0 && {\n borderColor: passwordsMatch ? 'rgba(52,211,153,0.40)' : 'rgba(248,81,73,0.40)',\n }),\n }}>\n <div style={ICON_BOX}><LockIcon /></div>\n <input type={showPassword ? 'text' : 'password'} value={confirm}\n onChange={e => setConfirm(e.target.value)}\n placeholder=\"Re-enter password\" required\n autoComplete=\"new-password\" style={INPUT} />\n {confirm.length > 0 && (\n <div style={{ width: 44, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n {passwordsMatch ? <CheckIcon /> : <XIcon />}\n </div>\n )}\n </div>\n </div>\n\n {/* Submit */}\n <button type=\"submit\" disabled={!canSubmit} style={{\n ...PRIMARY_BTN,\n background: canSubmit ? PRIMARY_BTN.background : 'rgba(99,102,241,0.30)',\n boxShadow: canSubmit ? PRIMARY_BTN.boxShadow : 'none',\n cursor: canSubmit ? 'pointer' : 'not-allowed',\n }}>\n {loading\n ? <><SpinnerIcon /> Creating account…</>\n : <>Create account <ArrowIcon /></>}\n </button>\n\n <p style={{ margin: '14px 0 0', textAlign: 'center', fontSize: 12, color: 'var(--k-muted, #8b949e)' }}>\n By continuing, you agree to the Terms of Service and Privacy Policy.\n </p>\n </form>\n\n {/* Sign in link */}\n <p style={{ textAlign: 'center', fontSize: 13, color: 'var(--k-muted, #8b949e)', marginTop: 22 }}>\n {signInPrompt}{' '}\n <a href={signInPath} style={{ color: 'var(--k-primary, #818cf8)', textDecoration: 'none', fontWeight: 600 }}>{signInLabel}</a>\n </p>\n\n <ProtectedFooter />\n </div>\n\n <style>{`@keyframes kaappu-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }`}</style>\n </div>\n )\n}\n\n// ─── Password rule chip ─────────────────────────────────────────────────────\nfunction RuleChip({ ok, label, optional }: { ok: boolean; label: string; optional?: boolean }) {\n const color = ok ? '#34d399' : (optional ? '#6b7280' : '#9ca3af')\n return (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4, color, fontWeight: 500 }}>\n {ok\n ? <CheckIcon size={12} />\n : <span style={{ width: 8, height: 8, borderRadius: '50%', border: `1.5px solid ${color}`, display: 'inline-block' }} />}\n {label}\n </span>\n )\n}\n\n// ─── \"Protected by Kaappu\" footer ───────────────────────────────────────────\nfunction ProtectedFooter() {\n return (\n <div style={{ marginTop: 26, borderTop: '1px solid var(--k-border, rgba(255,255,255,0.06))', paddingTop: 18, textAlign: 'center' }}>\n <div style={{ display: 'inline-flex', alignItems: 'center', gap: 8, opacity: 0.5 }}>\n <ShieldIcon />\n <span style={{ fontSize: 9, fontWeight: 800, textTransform: 'uppercase', letterSpacing: '0.28em', color: 'var(--k-muted, #8b949e)' }}>\n Protected by Kaappu\n </span>\n </div>\n </div>\n )\n}\n\n// ─── Friendly error message map ─────────────────────────────────────────────\nfunction friendlyError(code: string): string {\n const map: Record<string, string> = {\n email_already_exists: 'An account with this email already exists. Try signing in instead.',\n email_exists: 'An account with this email already exists. Try signing in instead.',\n password_breached: 'This password has appeared in a known data breach. Please choose a different one.',\n weak_password: 'Password is too weak. Use at least 8 characters with letters and numbers.',\n password_too_weak: 'Password is too weak. Use at least 8 characters with letters and numbers.',\n password_too_short: 'Password must be at least 8 characters.',\n invalid_email: 'Please enter a valid email address.',\n invalid_password: 'Password does not meet the requirements.',\n email_domain_not_allowed: 'Sign-ups from this email domain are not allowed.',\n email_blocked: 'This email address cannot be used.',\n bot_protection_failed: 'Bot protection check failed. Please try again.',\n rate_limited: 'Too many attempts. Please wait a minute and try again.',\n }\n return map[code] ?? code ?? 'Registration failed. Please try again.'\n}\n\n// ─── Helper: shape backend user into KaappuUser ─────────────────────────────\nfunction mapUser(raw: any, accountId: string): KaappuUser {\n return {\n id: raw.id ?? raw.userId,\n email: raw.email,\n firstName: raw.firstName,\n lastName: raw.lastName,\n avatarUrl: raw.avatarUrl,\n emailVerified: raw.emailVerified,\n mfaEnabled: raw.mfaEnabled,\n accountId: raw.accountId ?? accountId,\n sessionId: raw.sessionId ?? '',\n roles: raw.roles ?? [],\n permissions: raw.permissions ?? [],\n }\n}\n\n// ─── Style constants (mirror LoginPanel for visual parity) ──────────────────\n\nconst CARD: React.CSSProperties = {\n width: '100%', maxWidth: 460,\n background: 'var(--k-card-bg, rgba(13, 17, 23, 0.92))',\n border: '1px solid var(--k-border, rgba(255,255,255,0.10))',\n borderRadius: 24, padding: '40px 38px',\n position: 'relative', zIndex: 10,\n backdropFilter: 'blur(20px)',\n boxShadow: 'var(--k-shadow, 0 25px 80px rgba(0,0,0,0.5))',\n}\n\nconst INPUT_ROW: React.CSSProperties = {\n display: 'flex', alignItems: 'center',\n background: 'var(--k-hover, rgba(255,255,255,0.03))',\n border: '1px solid var(--k-border, rgba(255,255,255,0.10))',\n borderRadius: 12, height: 48, overflow: 'hidden',\n transition: 'border-color 0.15s ease',\n}\n\nconst INPUT: React.CSSProperties = {\n flex: 1, background: 'transparent', border: 'none', outline: 'none',\n color: 'var(--k-text, #f0f6fc)', fontSize: 14, paddingRight: 14,\n WebkitTextFillColor: 'var(--k-text, #f0f6fc)' as any,\n minWidth: 0,\n}\n\nconst ICON_BOX: React.CSSProperties = {\n width: 44, display: 'flex', alignItems: 'center', justifyContent: 'center',\n color: 'var(--k-muted, #6b7280)',\n}\n\nconst LABEL: React.CSSProperties = {\n display: 'block', fontSize: 11, fontWeight: 700, color: 'var(--k-muted, #9ca3af)',\n textTransform: 'uppercase', letterSpacing: '0.08em',\n marginBottom: 6, marginLeft: 2,\n}\n\nconst PRIMARY_BTN: React.CSSProperties = {\n width: '100%', height: 50, marginTop: 4,\n background: 'linear-gradient(135deg, #6366f1, #8b5cf6)',\n color: 'white', border: 'none', borderRadius: 12,\n fontSize: 14, fontWeight: 700,\n boxShadow: '0 10px 25px rgba(99,102,241,0.30)',\n display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 10,\n transition: 'all 0.15s ease',\n}\n\nconst OAUTH_BTN: React.CSSProperties = {\n padding: 10, display: 'flex', alignItems: 'center', justifyContent: 'center',\n background: 'var(--k-hover, rgba(255,255,255,0.04))',\n border: '1px solid var(--k-border, rgba(255,255,255,0.08))',\n borderRadius: 12, cursor: 'pointer',\n color: 'var(--k-text, #f0f6fc)', height: 46,\n}\n\nconst ERROR_BANNER: React.CSSProperties = {\n background: 'rgba(248,81,73,0.10)',\n border: '1px solid rgba(248,81,73,0.25)',\n borderRadius: 10, padding: '10px 14px',\n fontSize: 13, color: '#f87171',\n display: 'flex', alignItems: 'flex-start', gap: 8,\n marginBottom: 14,\n}\n\n// ─── Inline SVG icons (no external deps) ────────────────────────────────────\n\nconst GoogleIcon = () => (\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\">\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" fill=\"#4285F4\"/>\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\"/>\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l3.66-2.84z\" fill=\"#FBBC05\"/>\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.66l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\"/>\n </svg>\n)\nconst GithubIcon = () => (\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\n <path d=\"M12 2C6.477 2 2 6.477 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33.85 0 1.71.11 2.5.33 1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0012 2z\"/>\n </svg>\n)\nconst MicrosoftIcon = () => (\n <svg viewBox=\"0 0 23 23\" width=\"18\" height=\"18\">\n <path fill=\"#f3f3f3\" d=\"M0 0h11v11H0zM12 0h11v11H12zM0 12h11v11H0zM12 12h11v11H12z\"/>\n </svg>\n)\nconst AppleIcon = () => (\n <svg viewBox=\"0 0 384 512\" width=\"20\" height=\"20\" fill=\"currentColor\">\n <path d=\"M318.7 268.7c-.2-36.7 16.4-64.4 50-84.8-18.8-26.9-47.2-41.7-84.7-44.6-35.5-2.8-74.3 20.7-88.5 20.7-15 0-49.4-19.7-76.4-19.7C63.3 141.2 4 184.8 4 273.5q0 39.3 14.4 81.2c12.8 36.7 59 126.7 107.2 125.2 25.2-.6 43-17.9 75.8-17.9 31.8 0 48.3 17.9 76.4 17.9 48.6-.7 90.4-82.5 102.6-119.3-65.2-30.7-61.7-90-61.7-91.9zm-56.6-164.2c27.3-32.4 24.8-61.9 24-72.5-24.1 1.4-52 16.4-67.9 34.9-17.5 19.8-27.8 44.3-25.6 71.9 26.1 2 49.9-11.4 69.5-34.3z\"/>\n </svg>\n)\n\nconst UserIcon = () => <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\"/><circle cx=\"12\" cy=\"7\" r=\"4\"/></svg>\nconst MailIcon = () => <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><rect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\"/><path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\"/></svg>\nconst LockIcon = () => <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\"/><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"/></svg>\nconst EyeIcon = () => <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>\nconst EyeOffIcon = () => <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\"/><path d=\"M14.084 14.158a3 3 0 0 1-4.242-4.242\"/><path d=\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\"/><path d=\"m2 2 20 20\"/></svg>\nconst ArrowIcon = () => <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M5 12h14\"/><path d=\"m12 5 7 7-7 7\"/></svg>\nconst ShieldIcon = () => <svg viewBox=\"0 0 24 24\" width=\"12\" height=\"12\" fill=\"none\" stroke=\"#8b949e\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\"/></svg>\nconst SpinnerIcon = () => <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" style={{ animation: 'kaappu-spin 1s linear infinite' }}><path d=\"M21 12a9 9 0 1 1-6.219-8.56\"/></svg>\nconst AlertIcon = () => <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0, marginTop: 1 }}><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" x2=\"12\" y1=\"8\" y2=\"12\"/><line x1=\"12\" x2=\"12.01\" y1=\"16\" y2=\"16\"/></svg>\nconst CheckIcon = ({ size = 16 }: { size?: number }) => <svg viewBox=\"0 0 24 24\" width={size} height={size} fill=\"none\" stroke=\"#34d399\" strokeWidth=\"3\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"/></svg>\nconst XIcon = () => <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"#f87171\" strokeWidth=\"3\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>\n","'use client'\r\n\r\nimport React, { useContext, useEffect, useRef, useState } from 'react'\r\nimport { KaappuContext } from '../context/KaappuContext'\r\nimport type { KaappuAppearance } from '../types'\r\nimport { buildThemeVars } from '../theme'\r\n\r\nexport interface ProfileBadgeProps {\r\n /** URL to redirect after sign-out (default: '/sign-in') */\r\n afterSignOutUrl?: string\r\n /** URL for \"Manage account\" link (default: '/account') */\r\n userProfileUrl?: string\r\n /** Appearance overrides */\r\n appearance?: KaappuAppearance\r\n /** Custom CSS class for the trigger button */\r\n className?: string\r\n}\r\n\r\n/**\r\n * <ProfileBadge /> — compact avatar + dropdown menu.\r\n * Shows user's initials (or avatar image) and name.\r\n * Click opens a dropdown: Manage account, Sign out.\r\n *\r\n * @example\r\n * <ProfileBadge afterSignOutUrl=\"/sign-in\" userProfileUrl=\"/dashboard/profile\" />\r\n */\r\nexport function ProfileBadge({\r\n afterSignOutUrl = '/sign-in',\r\n userProfileUrl = '/account',\r\n appearance,\r\n className,\r\n}: ProfileBadgeProps) {\r\n const ctx = useContext(KaappuContext) as any\r\n if (!ctx) throw new Error('[Kaappu] <ProfileBadge> must be inside <KaappuProvider>')\r\n\r\n const { user, isLoaded, isSignedIn, signOut, tenantConfig } = ctx\r\n const [open, setOpen] = useState(false)\r\n const wrapperRef = useRef<HTMLDivElement>(null)\r\n\r\n // Close dropdown on outside click\r\n useEffect(() => {\r\n function handleClick(e: MouseEvent) {\r\n if (wrapperRef.current && !wrapperRef.current.contains(e.target as Node)) {\r\n setOpen(false)\r\n }\r\n }\r\n if (open) document.addEventListener('mousedown', handleClick)\r\n return () => document.removeEventListener('mousedown', handleClick)\r\n }, [open])\r\n\r\n if (!isLoaded || !isSignedIn || !user) return null\r\n\r\n const themeVars = buildThemeVars(appearance, tenantConfig?.branding?.primaryColor)\r\n\r\n const initials = [user.firstName, user.lastName]\r\n .filter(Boolean)\r\n .map((n: string) => n[0].toUpperCase())\r\n .join('') || user.email[0].toUpperCase()\r\n\r\n const displayName = [user.firstName, user.lastName].filter(Boolean).join(' ') || user.email\r\n\r\n async function handleSignOut() {\r\n setOpen(false)\r\n await signOut()\r\n window.location.href = afterSignOutUrl\r\n }\r\n\r\n return (\r\n <div\r\n ref={wrapperRef}\r\n style={{ position: 'relative', display: 'inline-block', ...themeVars, fontFamily: 'var(--k-font)' }}\r\n >\r\n {/* Trigger */}\r\n <button\r\n onClick={() => setOpen(o => !o)}\r\n className={className}\r\n aria-haspopup=\"true\"\r\n aria-expanded={open}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '0.5rem',\r\n padding: '0.25rem 0.5rem 0.25rem 0.25rem',\r\n background: open ? 'var(--k-hover)' : 'transparent',\r\n border: '1px solid transparent',\r\n borderRadius: '2rem',\r\n cursor: 'pointer',\r\n color: 'var(--k-text)',\r\n fontFamily: 'var(--k-font)',\r\n transition: 'background 0.15s ease, border-color 0.15s ease',\r\n }}\r\n onMouseEnter={e => {\r\n const el = e.currentTarget\r\n el.style.background = 'var(--k-hover)'\r\n el.style.borderColor = 'var(--k-border)'\r\n }}\r\n onMouseLeave={e => {\r\n if (!open) {\r\n const el = e.currentTarget\r\n el.style.background = 'transparent'\r\n el.style.borderColor = 'transparent'\r\n }\r\n }}\r\n >\r\n {/* Avatar */}\r\n <div\r\n style={{\r\n width: '32px',\r\n height: '32px',\r\n borderRadius: '50%',\r\n background: user.avatarUrl ? 'transparent' : 'var(--k-primary)',\r\n color: 'var(--k-primary-fg)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: '0.8125rem',\r\n fontWeight: 700,\r\n flexShrink: 0,\r\n overflow: 'hidden',\r\n }}\r\n >\r\n {user.avatarUrl\r\n ? <img src={user.avatarUrl} alt={displayName} style={{ width: '100%', height: '100%', objectFit: 'cover' }} />\r\n : initials\r\n }\r\n </div>\r\n\r\n {/* Name */}\r\n <span style={{ fontSize: '0.875rem', fontWeight: 500, maxWidth: '120px', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\r\n {displayName}\r\n </span>\r\n\r\n {/* Chevron */}\r\n <svg\r\n width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n style={{ color: 'var(--k-muted)', transform: open ? 'rotate(180deg)' : 'none', transition: 'transform 0.15s ease', flexShrink: 0 }}\r\n >\r\n <path d=\"M2 4L6 8L10 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n </svg>\r\n </button>\r\n\r\n {/* Dropdown */}\r\n {open && (\r\n <div\r\n role=\"menu\"\r\n style={{\r\n position: 'absolute',\r\n top: 'calc(100% + 0.5rem)',\r\n right: 0,\r\n minWidth: '220px',\r\n background: 'var(--k-card-bg)',\r\n border: '1px solid var(--k-border)',\r\n borderRadius: 'var(--k-radius)',\r\n boxShadow: 'var(--k-shadow)',\r\n padding: '0.5rem',\r\n zIndex: 9999,\r\n }}\r\n >\r\n {/* User info header */}\r\n <div style={{\r\n padding: '0.5rem 0.75rem 0.75rem',\r\n borderBottom: '1px solid var(--k-border)',\r\n marginBottom: '0.375rem',\r\n }}>\r\n <div style={{ fontSize: '0.875rem', fontWeight: 600, color: 'var(--k-text)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\r\n {displayName}\r\n </div>\r\n <div style={{ fontSize: '0.75rem', color: 'var(--k-muted)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', marginTop: '0.125rem' }}>\r\n {user.email}\r\n </div>\r\n </div>\r\n\r\n {/* Menu items */}\r\n <DropdownItem\r\n href={userProfileUrl}\r\n icon=\"⚙️\"\r\n label=\"Manage account\"\r\n onClick={() => setOpen(false)}\r\n />\r\n\r\n <div style={{ height: '1px', background: 'var(--k-border)', margin: '0.375rem 0' }} />\r\n\r\n <DropdownItem\r\n icon=\"→\"\r\n label=\"Sign out\"\r\n onClick={handleSignOut}\r\n danger\r\n />\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nfunction DropdownItem({\r\n href,\r\n icon,\r\n label,\r\n onClick,\r\n danger = false,\r\n}: {\r\n href?: string\r\n icon: string\r\n label: string\r\n onClick?: () => void\r\n danger?: boolean\r\n}) {\r\n const baseStyle: React.CSSProperties = {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '0.625rem',\r\n width: '100%',\r\n padding: '0.5rem 0.75rem',\r\n borderRadius: 'calc(var(--k-radius) * 0.5)',\r\n fontSize: '0.875rem',\r\n fontWeight: 500,\r\n color: danger ? '#ef4444' : 'var(--k-text)',\r\n background: 'transparent',\r\n border: 'none',\r\n cursor: 'pointer',\r\n textDecoration: 'none',\r\n fontFamily: 'var(--k-font)',\r\n textAlign: 'left',\r\n boxSizing: 'border-box',\r\n }\r\n\r\n const hoverStyle: React.CSSProperties = { background: 'var(--k-hover)' }\r\n\r\n const content = (\r\n <>\r\n <span style={{ fontSize: '0.875rem' }}>{icon}</span>\r\n {label}\r\n </>\r\n )\r\n\r\n if (href) {\r\n return (\r\n <a\r\n href={href}\r\n style={baseStyle}\r\n role=\"menuitem\"\r\n onClick={onClick}\r\n onMouseEnter={e => Object.assign(e.currentTarget.style, hoverStyle)}\r\n onMouseLeave={e => { e.currentTarget.style.background = 'transparent' }}\r\n >\r\n {content}\r\n </a>\r\n )\r\n }\r\n\r\n return (\r\n <button\r\n style={baseStyle}\r\n role=\"menuitem\"\r\n onClick={onClick}\r\n onMouseEnter={e => Object.assign(e.currentTarget.style, hoverStyle)}\r\n onMouseLeave={e => { e.currentTarget.style.background = 'transparent' }}\r\n >\r\n {content}\r\n </button>\r\n )\r\n}\r\n","'use client'\r\n\r\nimport React, { useCallback, useContext, useEffect, useState } from 'react'\r\nimport { KaappuContext } from '../context/KaappuContext'\r\nimport type { KaappuAppearance } from '../types'\r\nimport {\r\n buildThemeVars, cardStyle, inputStyle, primaryButtonStyle,\r\n ghostButtonStyle, labelStyle, errorStyle,\r\n} from '../theme'\r\n\r\nexport interface AccountViewProps {\r\n /** Appearance overrides */\r\n appearance?: KaappuAppearance\r\n /** Custom CSS class for the wrapper */\r\n className?: string\r\n}\r\n\r\ntype Tab = 'profile' | 'security' | 'sessions' | 'passkeys'\r\n\r\ninterface Session {\r\n id: string\r\n ipAddress?: string\r\n userAgent?: string\r\n createdAt?: string\r\n current?: boolean\r\n}\r\n\r\ninterface Passkey {\r\n id: string\r\n credentialId: string\r\n name?: string\r\n createdAt?: string\r\n aaguid?: string\r\n}\r\n\r\n/**\r\n * <AccountView /> — full embeddable profile + security management component.\r\n *\r\n * Tabs:\r\n * - Profile — display name editing\r\n * - Security — TOTP MFA enrollment/status, password change\r\n * - Sessions — active session list with individual revoke\r\n * - Passkeys — registered passkey list with delete\r\n *\r\n * @example\r\n * // app/account/page.tsx\r\n * import { AccountView } from '@kaappu/react'\r\n * export default function AccountPage() {\r\n * return <AccountView />\r\n * }\r\n */\r\nexport function AccountView({ appearance, className }: AccountViewProps) {\r\n const ctx = useContext(KaappuContext) as any\r\n if (!ctx) throw new Error('[Kaappu] <AccountView> must be inside <KaappuProvider>')\r\n\r\n const { user, isLoaded, isSignedIn, tenantConfig, getToken } = ctx\r\n const baseUrl: string = ctx._baseUrl ?? 'http://localhost:9091'\r\n\r\n const [tab, setTab] = useState<Tab>('profile')\r\n\r\n if (!isLoaded) return <Skeleton />\r\n if (!isSignedIn || !user) return null\r\n\r\n const themeVars = buildThemeVars(appearance, tenantConfig?.branding?.primaryColor)\r\n const accountId = user.accountId ?? 'default'\r\n\r\n return (\r\n <div style={{ ...themeVars, fontFamily: 'var(--k-font)', color: 'var(--k-text)', width: '100%' }} className={className}>\r\n {/* Tab bar */}\r\n <div style={{ display: 'flex', gap: '0', borderBottom: '1px solid var(--k-border)', marginBottom: '1.5rem', overflowX: 'auto' }}>\r\n {(['profile', 'security', 'sessions', 'passkeys'] as Tab[]).map(t => (\r\n <button\r\n key={t}\r\n onClick={() => setTab(t)}\r\n style={{\r\n padding: '0.625rem 1rem',\r\n background: 'none',\r\n border: 'none',\r\n borderBottom: tab === t ? '2px solid var(--k-primary)' : '2px solid transparent',\r\n color: tab === t ? 'var(--k-text)' : 'var(--k-muted)',\r\n fontWeight: tab === t ? 600 : 400,\r\n cursor: 'pointer',\r\n fontSize: '0.875rem',\r\n fontFamily: 'var(--k-font)',\r\n whiteSpace: 'nowrap',\r\n textTransform: 'capitalize',\r\n }}\r\n >\r\n {t}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {tab === 'profile' && <ProfileTab user={user} baseUrl={baseUrl} accountId={accountId} getToken={getToken} />}\r\n {tab === 'security' && <SecurityTab user={user} baseUrl={baseUrl} accountId={accountId} getToken={getToken} />}\r\n {tab === 'sessions' && <SessionsTab baseUrl={baseUrl} accountId={accountId} getToken={getToken} currentSessionId={user.sessionId} />}\r\n {tab === 'passkeys' && <PasskeysTab baseUrl={baseUrl} accountId={accountId} getToken={getToken} />}\r\n </div>\r\n )\r\n}\r\n\r\n// ── Profile tab ──────────────────────────────────────────────────────────────\r\n\r\nfunction ProfileTab({ user, baseUrl, accountId, getToken }: any) {\r\n const [firstName, setFirstName] = useState(user.firstName ?? '')\r\n const [lastName, setLastName] = useState(user.lastName ?? '')\r\n const [phoneNumber, setPhoneNumber] = useState((user as any).phoneNumber ?? '')\r\n const [saving, setSaving] = useState(false)\r\n const [saved, setSaved] = useState(false)\r\n const [error, setError] = useState<string | null>(null)\r\n\r\n async function handleSave(e: React.FormEvent) {\r\n e.preventDefault()\r\n setError(null)\r\n setSaving(true)\r\n try {\r\n const token = await getToken()\r\n const res = await fetch(`${baseUrl}/api/v1/idm/users/me`, {\r\n method: 'PATCH',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\r\n },\r\n body: JSON.stringify({ firstName, lastName }),\r\n })\r\n if (!res.ok) {\r\n const d = await res.json().catch(() => ({}))\r\n setError(d.error ?? 'Failed to save changes')\r\n } else {\r\n setSaved(true)\r\n setTimeout(() => setSaved(false), 2500)\r\n }\r\n } catch {\r\n setError('Unable to connect.')\r\n } finally {\r\n setSaving(false)\r\n }\r\n }\r\n\r\n return (\r\n <div style={{ maxWidth: '480px' }}>\r\n <SectionTitle>Personal information</SectionTitle>\r\n\r\n {/* Read-only email */}\r\n <div style={{ marginBottom: '1.25rem' }}>\r\n <label style={labelStyle}>Email address</label>\r\n <div style={{ ...inputStyle, color: 'var(--k-muted)', cursor: 'default', userSelect: 'text' as const }}>\r\n {user.email}\r\n {user.emailVerified && (\r\n <span style={{ marginLeft: '0.5rem', fontSize: '0.75rem', color: '#34d399' }}>✓ Verified</span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <form onSubmit={handleSave} style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\r\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '0.75rem' }}>\r\n <div>\r\n <label style={labelStyle}>First name</label>\r\n <input style={inputStyle} value={firstName} onChange={e => setFirstName(e.target.value)} placeholder=\"Jane\" />\r\n </div>\r\n <div>\r\n <label style={labelStyle}>Last name</label>\r\n <input style={inputStyle} value={lastName} onChange={e => setLastName(e.target.value)} placeholder=\"Smith\" />\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label style={labelStyle}>Phone number</label>\r\n <input style={inputStyle} value={phoneNumber} onChange={e => setPhoneNumber(e.target.value)} placeholder=\"+1 (555) 000-0000\" type=\"tel\" />\r\n </div>\r\n\r\n {error && <p style={errorStyle}>{error}</p>}\r\n\r\n <button style={{ ...primaryButtonStyle, maxWidth: '160px' }} type=\"submit\" disabled={saving}>\r\n {saving ? 'Saving…' : saved ? 'Saved ✓' : 'Save changes'}\r\n </button>\r\n </form>\r\n </div>\r\n )\r\n}\r\n\r\n// ── Security tab ─────────────────────────────────────────────────────────────\r\n\r\nfunction SecurityTab({ user, baseUrl, accountId, getToken }: any) {\r\n const [pwOld, setPwOld] = useState('')\r\n const [pwNew, setPwNew] = useState('')\r\n const [pwSaving, setPwSaving] = useState(false)\r\n const [pwError, setPwError] = useState<string | null>(null)\r\n const [pwDone, setPwDone] = useState(false)\r\n\r\n // TOTP\r\n const [totpUri, setTotpUri] = useState<string | null>(null)\r\n const [totpCode, setTotpCode] = useState('')\r\n const [totpStep, setTotpStep] = useState<'idle' | 'enroll' | 'confirm' | 'done'>('idle')\r\n const [totpError, setTotpError] = useState<string | null>(null)\r\n\r\n async function handleChangePassword(e: React.FormEvent) {\r\n e.preventDefault()\r\n setPwError(null)\r\n setPwSaving(true)\r\n try {\r\n const token = await getToken()\r\n const res = await fetch(`${baseUrl}/api/v1/idm/auth/change-password`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\r\n },\r\n body: JSON.stringify({ currentPassword: pwOld, newPassword: pwNew, accountId }),\r\n })\r\n const d = await res.json().catch(() => ({}))\r\n if (!res.ok) { setPwError(d.error ?? 'Failed to change password') }\r\n else { setPwDone(true); setPwOld(''); setPwNew('') }\r\n } catch {\r\n setPwError('Unable to connect.')\r\n } finally {\r\n setPwSaving(false)\r\n }\r\n }\r\n\r\n async function startTotpEnroll() {\r\n setTotpError(null)\r\n const token = await getToken()\r\n const res = await fetch(`${baseUrl}/api/v1/idm/auth/totp/enroll`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\r\n },\r\n body: JSON.stringify({ accountId }),\r\n })\r\n const d = await res.json().catch(() => ({}))\r\n if (res.ok && d.data?.uri) {\r\n setTotpUri(d.data.uri)\r\n setTotpStep('enroll')\r\n } else {\r\n setTotpError(d.error ?? 'Failed to start TOTP enrollment')\r\n }\r\n }\r\n\r\n async function confirmTotp(e: React.FormEvent) {\r\n e.preventDefault()\r\n setTotpError(null)\r\n const token = await getToken()\r\n const res = await fetch(`${baseUrl}/api/v1/idm/auth/totp/confirm`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\r\n },\r\n body: JSON.stringify({ code: totpCode, accountId }),\r\n })\r\n const d = await res.json().catch(() => ({}))\r\n if (res.ok) { setTotpStep('done') }\r\n else { setTotpError(d.error ?? 'Invalid code') }\r\n }\r\n\r\n return (\r\n <div style={{ maxWidth: '480px', display: 'flex', flexDirection: 'column', gap: '2rem' }}>\r\n {/* Password change */}\r\n <section>\r\n <SectionTitle>Change password</SectionTitle>\r\n {pwDone ? (\r\n <p style={{ color: '#34d399', fontSize: '0.875rem' }}>Password updated successfully.</p>\r\n ) : (\r\n <form onSubmit={handleChangePassword} style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\r\n <div>\r\n <label style={labelStyle}>Current password</label>\r\n <input style={inputStyle} type=\"password\" value={pwOld} onChange={e => setPwOld(e.target.value)} required placeholder=\"••••••••\" autoComplete=\"current-password\" />\r\n </div>\r\n <div>\r\n <label style={labelStyle}>New password</label>\r\n <input style={inputStyle} type=\"password\" value={pwNew} onChange={e => setPwNew(e.target.value)} required minLength={8} placeholder=\"Min. 8 characters\" autoComplete=\"new-password\" />\r\n </div>\r\n {pwError && <p style={errorStyle}>{pwError}</p>}\r\n <button style={{ ...primaryButtonStyle, maxWidth: '180px' }} type=\"submit\" disabled={pwSaving}>\r\n {pwSaving ? 'Updating…' : 'Update password'}\r\n </button>\r\n </form>\r\n )}\r\n </section>\r\n\r\n {/* TOTP MFA */}\r\n <section>\r\n <SectionTitle>Authenticator app (TOTP)</SectionTitle>\r\n\r\n {user.mfaEnabled && totpStep !== 'done' && (\r\n <StatusBadge color=\"#34d399\">MFA enabled</StatusBadge>\r\n )}\r\n\r\n {!user.mfaEnabled && totpStep === 'idle' && (\r\n <>\r\n <p style={{ fontSize: '0.875rem', color: 'var(--k-muted)', marginBottom: '1rem', lineHeight: 1.6 }}>\r\n Add an extra layer of security by requiring a code from your authenticator app at sign-in.\r\n </p>\r\n {totpError && <p style={errorStyle}>{totpError}</p>}\r\n <button style={{ ...ghostButtonStyle, maxWidth: '200px' }} onClick={startTotpEnroll}>\r\n Set up authenticator\r\n </button>\r\n </>\r\n )}\r\n\r\n {totpStep === 'enroll' && totpUri && (\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\r\n <p style={{ fontSize: '0.875rem', color: 'var(--k-muted)', lineHeight: 1.6 }}>\r\n Scan this QR code with your authenticator app (Google Authenticator, Authy, etc.),\r\n then enter the 6-digit code to confirm.\r\n </p>\r\n <QrCode uri={totpUri} />\r\n <form onSubmit={confirmTotp} style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem', maxWidth: '240px' }}>\r\n <div>\r\n <label style={labelStyle}>Verification code</label>\r\n <input\r\n style={{ ...inputStyle, letterSpacing: '0.25em', textAlign: 'center', fontSize: '1.125rem' }}\r\n type=\"text\" inputMode=\"numeric\" maxLength={6}\r\n value={totpCode} onChange={e => setTotpCode(e.target.value.replace(/\\D/g, ''))}\r\n placeholder=\"000000\" required\r\n />\r\n </div>\r\n {totpError && <p style={errorStyle}>{totpError}</p>}\r\n <button style={primaryButtonStyle} type=\"submit\" disabled={totpCode.length < 6}>\r\n Verify & enable\r\n </button>\r\n </form>\r\n </div>\r\n )}\r\n\r\n {totpStep === 'done' && (\r\n <StatusBadge color=\"#34d399\">Authenticator app enabled ✓</StatusBadge>\r\n )}\r\n </section>\r\n </div>\r\n )\r\n}\r\n\r\n// ── Sessions tab ─────────────────────────────────────────────────────────────\r\n\r\nfunction SessionsTab({ baseUrl, accountId, getToken, currentSessionId }: any) {\r\n const [sessions, setSessions] = useState<Session[]>([])\r\n const [loading, setLoading] = useState(true)\r\n const [revoking, setRevoking] = useState<string | null>(null)\r\n\r\n const loadSessions = useCallback(async () => {\r\n setLoading(true)\r\n try {\r\n const token = await getToken()\r\n const res = await fetch(`${baseUrl}/api/v1/idm/sessions?accountId=${accountId}`, {\r\n headers: token ? { Authorization: `Bearer ${token}` } : {},\r\n })\r\n const d = await res.json().catch(() => ({}))\r\n setSessions(Array.isArray(d.data) ? d.data : [])\r\n } catch {\r\n setSessions([])\r\n } finally {\r\n setLoading(false)\r\n }\r\n }, [baseUrl, accountId, getToken])\r\n\r\n useEffect(() => { loadSessions() }, [loadSessions])\r\n\r\n async function handleRevoke(sessionId: string) {\r\n setRevoking(sessionId)\r\n try {\r\n const token = await getToken()\r\n await fetch(`${baseUrl}/api/v1/idm/sessions/${sessionId}`, {\r\n method: 'DELETE',\r\n headers: token ? { Authorization: `Bearer ${token}` } : {},\r\n })\r\n setSessions(s => s.filter(x => x.id !== sessionId))\r\n } finally {\r\n setRevoking(null)\r\n }\r\n }\r\n\r\n if (loading) return <Skeleton rows={3} />\r\n\r\n return (\r\n <div style={{ maxWidth: '560px' }}>\r\n <SectionTitle>Active sessions</SectionTitle>\r\n <p style={{ fontSize: '0.875rem', color: 'var(--k-muted)', marginBottom: '1.25rem', lineHeight: 1.6 }}>\r\n These devices are currently signed into your account.\r\n </p>\r\n\r\n {sessions.length === 0 && (\r\n <p style={{ fontSize: '0.875rem', color: 'var(--k-muted)' }}>No active sessions found.</p>\r\n )}\r\n\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.625rem' }}>\r\n {sessions.map(s => {\r\n const isCurrent = s.id === currentSessionId\r\n return (\r\n <div\r\n key={s.id}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: '1rem',\r\n padding: '0.875rem 1rem',\r\n background: 'var(--k-hover)',\r\n border: `1px solid ${isCurrent ? 'var(--k-primary)' : 'var(--k-border)'}`,\r\n borderRadius: 'calc(var(--k-radius) * 0.6)',\r\n }}\r\n >\r\n <div style={{ flex: 1, minWidth: 0 }}>\r\n <div style={{ fontSize: '0.875rem', fontWeight: 500, color: 'var(--k-text)', display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\r\n <span style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\r\n {s.ipAddress ?? 'Unknown IP'}\r\n </span>\r\n {isCurrent && <StatusBadge color=\"var(--k-primary)\" inline>Current</StatusBadge>}\r\n </div>\r\n {s.userAgent && (\r\n <div style={{ fontSize: '0.75rem', color: 'var(--k-muted)', marginTop: '0.25rem', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\r\n {parseUserAgent(s.userAgent)}\r\n </div>\r\n )}\r\n {s.createdAt && (\r\n <div style={{ fontSize: '0.75rem', color: 'var(--k-muted)', marginTop: '0.125rem' }}>\r\n Started {formatDate(s.createdAt)}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {!isCurrent && (\r\n <button\r\n style={{\r\n padding: '0.375rem 0.75rem',\r\n background: 'transparent',\r\n border: '1px solid rgba(239,68,68,0.35)',\r\n borderRadius: 'calc(var(--k-radius) * 0.5)',\r\n color: '#ef4444',\r\n fontSize: '0.8125rem',\r\n cursor: 'pointer',\r\n fontFamily: 'var(--k-font)',\r\n flexShrink: 0,\r\n }}\r\n disabled={revoking === s.id}\r\n onClick={() => handleRevoke(s.id)}\r\n >\r\n {revoking === s.id ? 'Revoking…' : 'Revoke'}\r\n </button>\r\n )}\r\n </div>\r\n )\r\n })}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n// ── Passkeys tab ─────────────────────────────────────────────────────────────\r\n\r\nfunction PasskeysTab({ baseUrl, accountId, getToken }: any) {\r\n const [passkeys, setPasskeys] = useState<Passkey[]>([])\r\n const [loading, setLoading] = useState(true)\r\n const [deleting, setDeleting] = useState<string | null>(null)\r\n\r\n const loadPasskeys = useCallback(async () => {\r\n setLoading(true)\r\n try {\r\n const token = await getToken()\r\n const res = await fetch(`${baseUrl}/api/v1/idm/auth/passkey/credentials?accountId=${accountId}`, {\r\n headers: token ? { Authorization: `Bearer ${token}` } : {},\r\n })\r\n const d = await res.json().catch(() => ({}))\r\n setPasskeys(Array.isArray(d.data) ? d.data : [])\r\n } catch {\r\n setPasskeys([])\r\n } finally {\r\n setLoading(false)\r\n }\r\n }, [baseUrl, accountId, getToken])\r\n\r\n useEffect(() => { loadPasskeys() }, [loadPasskeys])\r\n\r\n async function handleDelete(passkeyId: string) {\r\n setDeleting(passkeyId)\r\n try {\r\n const token = await getToken()\r\n await fetch(`${baseUrl}/api/v1/idm/auth/passkey/credentials/${passkeyId}`, {\r\n method: 'DELETE',\r\n headers: token ? { Authorization: `Bearer ${token}` } : {},\r\n })\r\n setPasskeys(p => p.filter(x => x.id !== passkeyId))\r\n } finally {\r\n setDeleting(null)\r\n }\r\n }\r\n\r\n if (loading) return <Skeleton rows={2} />\r\n\r\n return (\r\n <div style={{ maxWidth: '560px' }}>\r\n <SectionTitle>Passkeys</SectionTitle>\r\n <p style={{ fontSize: '0.875rem', color: 'var(--k-muted)', marginBottom: '1.25rem', lineHeight: 1.6 }}>\r\n Passkeys let you sign in with your device's biometrics or PIN — no password needed.\r\n </p>\r\n\r\n {passkeys.length === 0 && (\r\n <p style={{ fontSize: '0.875rem', color: 'var(--k-muted)' }}>No passkeys registered.</p>\r\n )}\r\n\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.625rem' }}>\r\n {passkeys.map(pk => (\r\n <div\r\n key={pk.id}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: '1rem',\r\n padding: '0.875rem 1rem',\r\n background: 'var(--k-hover)',\r\n border: '1px solid var(--k-border)',\r\n borderRadius: 'calc(var(--k-radius) * 0.6)',\r\n }}\r\n >\r\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.75rem', flex: 1, minWidth: 0 }}>\r\n <span style={{ fontSize: '1.25rem' }}>🔑</span>\r\n <div>\r\n <div style={{ fontSize: '0.875rem', fontWeight: 500, color: 'var(--k-text)' }}>\r\n {pk.name ?? 'Passkey'}\r\n </div>\r\n {pk.createdAt && (\r\n <div style={{ fontSize: '0.75rem', color: 'var(--k-muted)', marginTop: '0.125rem' }}>\r\n Added {formatDate(pk.createdAt)}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n <button\r\n style={{\r\n padding: '0.375rem 0.75rem',\r\n background: 'transparent',\r\n border: '1px solid rgba(239,68,68,0.35)',\r\n borderRadius: 'calc(var(--k-radius) * 0.5)',\r\n color: '#ef4444',\r\n fontSize: '0.8125rem',\r\n cursor: 'pointer',\r\n fontFamily: 'var(--k-font)',\r\n flexShrink: 0,\r\n }}\r\n disabled={deleting === pk.id}\r\n onClick={() => handleDelete(pk.id)}\r\n >\r\n {deleting === pk.id ? 'Removing…' : 'Remove'}\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n// ── Shared sub-components ────────────────────────────────────────────────────\r\n\r\nfunction SectionTitle({ children }: { children: React.ReactNode }) {\r\n return (\r\n <h3 style={{ margin: '0 0 1rem', fontSize: '0.9375rem', fontWeight: 600, color: 'var(--k-text)' }}>\r\n {children}\r\n </h3>\r\n )\r\n}\r\n\r\nfunction StatusBadge({ children, color, inline = false }: { children: React.ReactNode; color: string; inline?: boolean }) {\r\n return (\r\n <span style={{\r\n display: inline ? 'inline-flex' : 'inline-flex',\r\n alignItems: 'center',\r\n padding: '0.125rem 0.5rem',\r\n borderRadius: '1rem',\r\n fontSize: '0.75rem',\r\n fontWeight: 600,\r\n color,\r\n background: `${color}22`,\r\n border: `1px solid ${color}44`,\r\n marginBottom: inline ? 0 : '0.75rem',\r\n }}>\r\n {children}\r\n </span>\r\n )\r\n}\r\n\r\nfunction Skeleton({ rows = 1 }: { rows?: number }) {\r\n return (\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\r\n {Array.from({ length: rows }).map((_, i) => (\r\n <div key={i} style={{ height: '52px', background: 'var(--k-hover)', borderRadius: 'calc(var(--k-radius) * 0.6)', border: '1px solid var(--k-border)' }} />\r\n ))}\r\n </div>\r\n )\r\n}\r\n\r\n/** Minimal inline QR code using a data URL via a free API — no npm dep required */\r\nfunction QrCode({ uri }: { uri: string }) {\r\n const encoded = encodeURIComponent(uri)\r\n return (\r\n <div style={{\r\n padding: '0.75rem',\r\n background: '#ffffff',\r\n borderRadius: 'calc(var(--k-radius) * 0.6)',\r\n display: 'inline-block',\r\n lineHeight: 0,\r\n }}>\r\n <img\r\n src={`https://api.qrserver.com/v1/create-qr-code/?size=160x160&data=${encoded}`}\r\n alt=\"TOTP QR code\"\r\n width={160}\r\n height={160}\r\n style={{ display: 'block' }}\r\n />\r\n </div>\r\n )\r\n}\r\n\r\nfunction parseUserAgent(ua: string): string {\r\n if (ua.includes('Chrome')) return `Chrome · ${extractOS(ua)}`\r\n if (ua.includes('Firefox')) return `Firefox · ${extractOS(ua)}`\r\n if (ua.includes('Safari')) return `Safari · ${extractOS(ua)}`\r\n return ua.slice(0, 60)\r\n}\r\n\r\nfunction extractOS(ua: string): string {\r\n if (ua.includes('Windows')) return 'Windows'\r\n if (ua.includes('Mac')) return 'macOS'\r\n if (ua.includes('Linux')) return 'Linux'\r\n if (ua.includes('Android')) return 'Android'\r\n if (ua.includes('iPhone') || ua.includes('iPad')) return 'iOS'\r\n return 'Unknown OS'\r\n}\r\n\r\nfunction formatDate(iso: string): string {\r\n try {\r\n return new Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeStyle: 'short' }).format(new Date(iso))\r\n } catch {\r\n return iso\r\n }\r\n}\r\n","'use client'\r\n\r\nimport React from 'react'\r\nimport { useKaappu } from '../context/KaappuContext'\r\n\r\n// ── <LoggedIn> ───────────────────────────────────────────────────────────────\r\n\r\ninterface LoggedInProps {\r\n children: React.ReactNode\r\n /** Rendered while auth state is loading */\r\n fallback?: React.ReactNode\r\n}\r\n\r\n/**\r\n * Renders children only when the user is signed in.\r\n *\r\n * @example\r\n * <LoggedIn fallback={<Spinner />}>\r\n * <UserMenu />\r\n * </LoggedIn>\r\n */\r\nexport function LoggedIn({ children, fallback = null }: LoggedInProps) {\r\n const { isLoaded, isSignedIn } = useKaappu()\r\n if (!isLoaded) return <>{fallback}</>\r\n if (!isSignedIn) return null\r\n return <>{children}</>\r\n}\r\n\r\n// ── <LoggedOut> ──────────────────────────────────────────────────────────────\r\n\r\ninterface LoggedOutProps {\r\n children: React.ReactNode\r\n /** Rendered while auth state is loading */\r\n fallback?: React.ReactNode\r\n}\r\n\r\n/**\r\n * Renders children only when the user is NOT signed in.\r\n *\r\n * @example\r\n * <LoggedOut>\r\n * <a href=\"/sign-in\">Sign in</a>\r\n * </LoggedOut>\r\n */\r\nexport function LoggedOut({ children, fallback = null }: LoggedOutProps) {\r\n const { isLoaded, isSignedIn } = useKaappu()\r\n if (!isLoaded) return <>{fallback}</>\r\n if (isSignedIn) return null\r\n return <>{children}</>\r\n}\r\n\r\n// ── <Authorize> ──────────────────────────────────────────────────────────────\r\n\r\ninterface AuthorizeProps {\r\n children: React.ReactNode\r\n /**\r\n * Required permission string (e.g. \"billing:manage\", \"users:read\").\r\n * Uses client-side permission list from the user's session.\r\n * The wildcard permission \"*\" grants access to everything.\r\n */\r\n permission?: string\r\n /**\r\n * Required role name (e.g. \"admin\", \"owner\").\r\n * Checked against user.roles[].\r\n */\r\n role?: string\r\n /** Rendered when the user lacks the required permission/role */\r\n fallback?: React.ReactNode\r\n /** Rendered while auth state is loading */\r\n loading?: React.ReactNode\r\n}\r\n\r\n/**\r\n * Conditionally renders children based on the user's permissions or role.\r\n * Combines with <LoggedIn> semantics — unauthenticated users see fallback.\r\n *\r\n * @example\r\n * // Permission-gated\r\n * <Authorize permission=\"billing:manage\" fallback={<p>Upgrade to access billing.</p>}>\r\n * <BillingPanel />\r\n * </Authorize>\r\n *\r\n * // Role-gated\r\n * <Authorize role=\"admin\">\r\n * <AdminTools />\r\n * </Authorize>\r\n *\r\n * // Combine both (user must have BOTH)\r\n * <Authorize role=\"admin\" permission=\"users:delete\">\r\n * <DangerZone />\r\n * </Authorize>\r\n */\r\nexport function Authorize({\r\n children,\r\n permission,\r\n role,\r\n fallback = null,\r\n loading = null,\r\n}: AuthorizeProps) {\r\n const { isLoaded, isSignedIn, user, hasPermission } = useKaappu()\r\n\r\n if (!isLoaded) return <>{loading}</>\r\n if (!isSignedIn || !user) return <>{fallback}</>\r\n\r\n // Permission check\r\n if (permission && !hasPermission(permission)) return <>{fallback}</>\r\n\r\n // Role check\r\n if (role) {\r\n const userRoles = user.roles ?? []\r\n if (!userRoles.includes(role) && !userRoles.includes('super_admin')) {\r\n return <>{fallback}</>\r\n }\r\n }\r\n\r\n return <>{children}</>\r\n}\r\n","// src/token.ts\nfunction parseJwtPayload(token) {\n try {\n const base64 = token.split(\".\")[1].replace(/-/g, \"+\").replace(/_/g, \"/\");\n return JSON.parse(\n typeof atob !== \"undefined\" ? atob(base64) : Buffer.from(base64, \"base64\").toString()\n );\n } catch {\n return null;\n }\n}\nfunction isTokenExpired(token) {\n const payload = parseJwtPayload(token);\n if (!payload || typeof payload.exp !== \"number\") return true;\n return Date.now() >= payload.exp * 1e3;\n}\nfunction getTokenExpiryMs(token) {\n const payload = parseJwtPayload(token);\n if (!payload || typeof payload.exp !== \"number\") return 0;\n return Math.max(payload.exp * 1e3 - Date.now(), 0);\n}\nfunction extractUserFromToken(token) {\n const payload = parseJwtPayload(token);\n if (!payload || !payload.sub) return null;\n return {\n id: payload.sub,\n email: payload.email || \"\",\n accountId: payload.tid || \"default\",\n sessionId: payload.sid || \"\",\n permissions: Array.isArray(payload.permissions) ? payload.permissions : []\n };\n}\n\n// src/permissions.ts\nfunction checkPermission(userPermissions, required) {\n if (!required) return true;\n if (!userPermissions || userPermissions.length === 0) return false;\n const [requiredResource] = required.split(\":\");\n return userPermissions.some(\n (p) => p === \"*\" || p === required || p === `${requiredResource}:*`\n );\n}\nfunction checkAllPermissions(userPermissions, required) {\n return required.every((perm) => checkPermission(userPermissions, perm));\n}\nfunction checkAnyPermission(userPermissions, required) {\n return required.some((perm) => checkPermission(userPermissions, perm));\n}\nfunction isPermission(val) {\n return val === \"*\" || /^[a-z_]+:[a-z_*]+$/.test(val);\n}\n\n// src/api-client.ts\nvar KaappuApiClient = class {\n constructor(config) {\n this.baseUrl = config.baseUrl || \"http://localhost:9091\";\n this.publishableKey = config.publishableKey;\n }\n /** Fetch tenant config (auth methods, branding, bot protection) */\n async getTenantConfig() {\n try {\n const res = await fetch(`${this.baseUrl}/api/v1/accounts/config?pk=${this.publishableKey}`);\n if (!res.ok) return null;\n const data = await res.json();\n return data?.data ?? null;\n } catch {\n return null;\n }\n }\n /** Sign in with email + password */\n async signIn(email, password, accountId) {\n const res = await fetch(`${this.baseUrl}/api/v1/idm/auth/sign-in`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ email, password, accountId: accountId || \"default\" })\n });\n const data = await res.json();\n if (!data.success) throw new Error(data.error || \"Sign in failed\");\n return data.data;\n }\n /** Sign up with email + password */\n async signUp(params) {\n const res = await fetch(`${this.baseUrl}/api/v1/idm/auth/sign-up`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ ...params, accountId: params.accountId || \"default\" })\n });\n const data = await res.json();\n if (!data.success) throw new Error(data.error || \"Sign up failed\");\n return data.data;\n }\n /** Refresh an access token using a refresh token */\n async refreshToken(refreshToken) {\n try {\n const res = await fetch(`${this.baseUrl}/api/v1/idm/auth/refresh`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ refreshToken })\n });\n if (!res.ok) return null;\n const data = await res.json();\n return data?.data ?? null;\n } catch {\n return null;\n }\n }\n /** Sign out — invalidate session on the server */\n async signOut(accessToken) {\n await fetch(`${this.baseUrl}/api/v1/idm/auth/sign-out`, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${accessToken}` }\n }).catch(() => {\n });\n }\n /** Get current user profile */\n async getMe(accessToken) {\n try {\n const res = await fetch(`${this.baseUrl}/api/v1/idm/auth/me`, {\n headers: { Authorization: `Bearer ${accessToken}` }\n });\n if (!res.ok) return null;\n const data = await res.json();\n return data?.data?.user ?? null;\n } catch {\n return null;\n }\n }\n /** Verify MFA challenge */\n async verifyMfa(challengeId, code) {\n const res = await fetch(`${this.baseUrl}/api/v1/idm/auth/mfa/verify`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ challengeId, code })\n });\n const data = await res.json();\n if (!data.success) throw new Error(data.error || \"MFA verification failed\");\n return data.data;\n }\n /** Request magic link */\n async requestMagicLink(email, accountId) {\n await fetch(`${this.baseUrl}/api/v1/idm/auth/magic-link`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ email, accountId: accountId || \"default\" })\n });\n }\n /** Get OAuth authorization URL */\n async getOAuthUrl(provider, redirectUri, accountId) {\n const res = await fetch(\n `${this.baseUrl}/api/v1/idm/auth/oauth/${provider}?accountId=${accountId || \"default\"}&redirectUri=${encodeURIComponent(redirectUri)}`\n );\n const data = await res.json();\n return data?.data?.url || data?.url || \"\";\n }\n};\n\n// src/storage.ts\nvar TOKEN_KEY = \"kaappu_token\";\nvar REFRESH_KEY = \"kaappu_refresh\";\nvar USER_KEY = \"kaappu_user\";\nvar BrowserTokenStorage = class {\n getToken() {\n if (typeof window === \"undefined\") return null;\n return localStorage.getItem(TOKEN_KEY);\n }\n setToken(token) {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(TOKEN_KEY, token);\n }\n getRefreshToken() {\n if (typeof window === \"undefined\") return null;\n return localStorage.getItem(REFRESH_KEY);\n }\n setRefreshToken(token) {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(REFRESH_KEY, token);\n }\n getUser() {\n if (typeof window === \"undefined\") return null;\n const stored = localStorage.getItem(USER_KEY);\n if (!stored) return null;\n try {\n return JSON.parse(stored);\n } catch {\n return null;\n }\n }\n setUser(user) {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(USER_KEY, JSON.stringify(user));\n }\n clear() {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(TOKEN_KEY);\n localStorage.removeItem(REFRESH_KEY);\n localStorage.removeItem(USER_KEY);\n }\n};\nvar MemoryTokenStorage = class {\n constructor() {\n this.token = null;\n this.refreshToken = null;\n this.user = null;\n }\n getToken() {\n return this.token;\n }\n setToken(token) {\n this.token = token;\n }\n getRefreshToken() {\n return this.refreshToken;\n }\n setRefreshToken(token) {\n this.refreshToken = token;\n }\n getUser() {\n return this.user;\n }\n setUser(user) {\n this.user = user;\n }\n clear() {\n this.token = null;\n this.refreshToken = null;\n this.user = null;\n }\n};\nexport {\n BrowserTokenStorage,\n KaappuApiClient,\n MemoryTokenStorage,\n checkAllPermissions,\n checkAnyPermission,\n checkPermission,\n extractUserFromToken,\n getTokenExpiryMs,\n isPermission,\n isTokenExpired,\n parseJwtPayload\n};\n"]}
|