@forge-connect/react 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/provider.tsx","../src/context.ts","../src/api/client.ts","../src/utils.ts","../src/components/login-modal.tsx","../src/hooks/use-forge-connect.ts","../src/components/modal-overlay.tsx","../src/components/tabs/email-password.tsx","../src/resolve-config.ts","../src/components/tabs/email-otp.tsx","../src/components/tabs/wallet-connect.tsx","../src/components/tabs/forgot-password.tsx","../src/components/tabs/verify-2fa.tsx","../src/components/svg-icon.tsx","../src/components/tabs/oauth-buttons.tsx","../src/components/account-modal.tsx","../src/hooks/use-user.ts","../src/hooks/use-wallets.ts","../src/lib/utils.ts","../src/hooks/use-sessions.ts","../src/components/two-factor-modal.tsx","../src/components/passkeys-modal.tsx","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/bufferToBase64URLString.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/base64URLStringToBuffer.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/browserSupportsWebAuthn.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/toPublicKeyCredentialDescriptor.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/isValidDomain.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/webAuthnError.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/identifyRegistrationError.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/webAuthnAbortService.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/toAuthenticatorAttachment.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/methods/startRegistration.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/browserSupportsWebAuthnAutofill.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/identifyAuthenticationError.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/methods/startAuthentication.js","../src/components/password-modal.tsx","../src/components/error-view.tsx","../src/components/delete-account-modal.tsx","../src/components/link-auth-modal.tsx","../src/components/login-button.tsx","../src/components/account-button.tsx","../src/hooks/use-admin.ts","../src/hooks/use-roles.ts","../src/lib/permissions.ts"],"sourcesContent":["import { useState, useCallback, useEffect, useRef, useMemo, type ReactNode } from 'react';\nimport { ForgeConnectContext, type ForgeConnectContextValue, type WalletAdapterContext } from './context.js';\nimport { createApiClient, ForgeConnectApiError } from './api/client.js';\nimport type { AuthState, ModalState, AccountModalState, LinkModalState, ForgeConnectConfig, User, ModalStep } from './types.js';\nimport { getRefreshDelay } from './utils.js';\nimport { LoginModal } from './components/login-modal.js';\nimport { AccountModal } from './components/account-modal.js';\nimport { LinkAuthModal } from './components/link-auth-modal.js';\nimport { resolveLoginMethods, resolveInitialStep, isOAuthMethod } from './resolve-config.js';\nimport { startRegistration, startAuthentication } from './runtime-imports.js';\nimport { uint8ArrayToBase58 } from './lib/utils.js';\n\ninterface ForgeConnectProviderProps {\n config: ForgeConnectConfig;\n children: ReactNode;\n /** Called when user successfully authenticates */\n onLogin?: (user: User) => void;\n /** Called when user logs out */\n onLogout?: () => void;\n /** Pass `useWallet()` from @solana/wallet-adapter-react to enable wallet login */\n walletAdapter?: WalletAdapterContext | null;\n}\n\nexport function ForgeConnectProvider({ config, children, onLogin, onLogout, walletAdapter }: ForgeConnectProviderProps) {\n const [auth, setAuth] = useState<AuthState>({\n status: 'loading',\n user: null,\n accessToken: null,\n });\n\n const [modal, setModal] = useState<ModalState>({\n isOpen: false,\n step: 'method-select',\n });\n\n const [accountModal, setAccountModal] = useState<AccountModalState>({ isOpen: false });\n const [linkModal, setLinkModal] = useState<LinkModalState>({ isOpen: false });\n const [challengeToken, setChallengeToken] = useState<string | null>(null);\n\n const apiRef = useRef(createApiClient(config.apiUrl));\n const refreshTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const api = apiRef.current;\n\n // ── Token Refresh Scheduling ──\n\n const scheduleRefresh = useCallback((token: string) => {\n if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);\n const delay = getRefreshDelay(token);\n if (delay === null) return;\n\n refreshTimerRef.current = setTimeout(async () => {\n try {\n const { accessToken } = await api.refresh();\n setAuth((prev) => ({ ...prev, accessToken }));\n scheduleRefresh(accessToken);\n } catch {\n // Refresh failed — log user out\n setAuth({ status: 'unauthenticated', user: null, accessToken: null });\n }\n }, delay);\n }, [api]);\n\n // ── Initialize from refresh cookie ──\n\n useEffect(() => {\n const init = async () => {\n try {\n const { accessToken } = await api.refresh();\n const user = await api.getMe(accessToken);\n setAuth({ status: 'authenticated', user, accessToken });\n scheduleRefresh(accessToken);\n } catch {\n setAuth({ status: 'unauthenticated', user: null, accessToken: null });\n }\n };\n init();\n\n return () => {\n if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);\n };\n }, [api, scheduleRefresh]);\n\n // ── OAuth popup/callback handler ──\n\n useEffect(() => {\n // Check if THIS window is the OAuth callback popup\n if (window.location.pathname === '/fc-oauth-callback') {\n const params = new URLSearchParams(window.location.search);\n\n // Link callback — no token, just success flag\n if (params.get('fc_link_success') && window.opener) {\n window.opener.postMessage(\n { type: 'fc_oauth_link_success', provider: params.get('fc_provider') },\n window.location.origin,\n );\n window.close();\n return;\n }\n\n // Auth code callback — exchange code for tokens (prevents token leakage in URLs)\n const authCode = params.get('fc_code');\n if (authCode && window.opener) {\n window.opener.postMessage(\n { type: 'fc_oauth_code', code: authCode },\n window.location.origin,\n );\n window.close();\n return;\n }\n }\n\n // Listen for messages from OAuth popup\n const handleMessage = async (event: MessageEvent) => {\n if (event.origin !== window.location.origin) return;\n\n if (event.data?.type !== 'fc_oauth_code') return;\n\n const code = event.data.code as string;\n if (!code) return;\n\n try {\n // Exchange the one-time auth code for tokens\n const result = await api.exchangeOAuthCode(code);\n\n if (result.requires2FA && result.challengeToken) {\n setChallengeToken(result.challengeToken);\n setModal({ isOpen: true, step: 'verify-2fa' });\n return;\n }\n\n const token = result.accessToken;\n if (!token) return;\n\n setModal({ isOpen: true, step: 'success' });\n const user = await api.getMe(token);\n setAuth({ status: 'authenticated', user, accessToken: token });\n scheduleRefresh(token);\n onLogin?.(user);\n setTimeout(() => {\n setModal({ isOpen: false, step: 'method-select' });\n }, 1500);\n } catch {\n // OAuth exchange failed\n }\n };\n\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [api, config.apiUrl, scheduleRefresh, onLogin]);\n\n // ── Legacy config warning ──\n\n useEffect(() => {\n if (config.loginMethods && config.loginMethods.length > 0) {\n const hasLegacy = config.oauthProviders || config.walletLogin !== undefined || config.passwordlessLogin !== undefined;\n if (hasLegacy) {\n console.warn(\n '[ForgeConnect] Both loginMethods and legacy fields (oauthProviders, walletLogin, passwordlessLogin) are set. loginMethods takes precedence.',\n );\n }\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n // ── Auth Actions ──\n\n const handleAuthSuccess = useCallback(\n async (token: string) => {\n const user = await api.getMe(token);\n setAuth({ status: 'authenticated', user, accessToken: token });\n scheduleRefresh(token);\n // Show success screen, then auto-close\n setModal({ isOpen: true, step: 'success' });\n onLogin?.(user);\n setTimeout(() => {\n setModal({ isOpen: false, step: 'method-select' });\n }, 1500);\n },\n [api, scheduleRefresh, onLogin],\n );\n\n const loginWithEmail = useCallback(\n async (email: string, password: string) => {\n const res = await api.login(email, password);\n if (res.requires2FA) {\n setChallengeToken(res.challengeToken!);\n setModal((prev) => ({ ...prev, step: 'verify-2fa' }));\n return;\n }\n await handleAuthSuccess(res.accessToken!);\n },\n [api, handleAuthSuccess],\n );\n\n const register = useCallback(\n async (email: string, password: string, displayName?: string) => {\n await api.register(email, password, displayName);\n // Registration sends verification email, no token returned\n },\n [api],\n );\n\n const sendOtp = useCallback(\n async (email: string) => {\n await api.sendOtp(email);\n },\n [api],\n );\n\n const verifyOtp = useCallback(\n async (email: string, code: string) => {\n const res = await api.verifyOtp(email, code);\n if (res.requires2FA) {\n setChallengeToken(res.challengeToken!);\n setModal((prev) => ({ ...prev, step: 'verify-2fa' }));\n return;\n }\n await handleAuthSuccess(res.accessToken!);\n },\n [api, handleAuthSuccess],\n );\n\n const loginWithWallet = useCallback(\n async (\n walletAddress: string,\n signMessage: ((message: Uint8Array) => Promise<Uint8Array>) | undefined,\n chain: string = 'solana',\n signTransaction?: (txBase64: string) => Promise<string>,\n ) => {\n // If signMessage is available, use the standard message-signing flow\n if (signMessage) {\n const { challengeId, message: challengeMessage } = await api.walletChallenge(walletAddress, chain);\n const message = new TextEncoder().encode(challengeMessage);\n const signatureBytes = await signMessage(message);\n const signature = chain === 'solana'\n ? uint8ArrayToBase58(signatureBytes)\n : Array.from(signatureBytes).map((b) => b.toString(16).padStart(2, '0')).join('');\n const res = await api.walletVerify(challengeId, signature, walletAddress);\n if (res.requires2FA) {\n setChallengeToken(res.challengeToken!);\n setModal((prev) => ({ ...prev, step: 'verify-2fa' }));\n return;\n }\n await handleAuthSuccess(res.accessToken!);\n return;\n }\n\n // Fallback: transaction-based signing (hardware wallets)\n if (!signTransaction) {\n throw new Error('Wallet does not support message signing or transaction signing.');\n }\n\n const { challengeId, transaction: txBase64 } = await api.walletChallengeTx(walletAddress, chain);\n const signedTxBase64 = await signTransaction(txBase64);\n\n const res = await api.walletVerifyTx(challengeId, signedTxBase64, walletAddress);\n if (res.requires2FA) {\n setChallengeToken(res.challengeToken!);\n setModal((prev) => ({ ...prev, step: 'verify-2fa' }));\n return;\n }\n await handleAuthSuccess(res.accessToken!);\n },\n [api, handleAuthSuccess],\n );\n\n const loginWithOAuth = useCallback(\n (provider: string) => {\n const callbackUrl = `${config.apiUrl}/auth/oauth/${provider}`;\n const redirectUri = encodeURIComponent(window.location.origin + '/fc-oauth-callback');\n const url = `${callbackUrl}?redirect_uri=${redirectUri}`;\n const width = 500;\n const height = 600;\n const left = window.screenX + (window.innerWidth - width) / 2;\n const top = window.screenY + (window.innerHeight - height) / 2;\n const popup = window.open(url, 'fc_oauth', `width=${width},height=${height},left=${left},top=${top}`);\n setModal({ isOpen: true, step: 'oauth' });\n\n // Poll for popup close — revert to method-select if user closes it\n if (popup) {\n const poll = setInterval(() => {\n if (popup.closed) {\n clearInterval(poll);\n setModal((prev) => prev.step === 'oauth' ? { isOpen: true, step: 'method-select' } : prev);\n }\n }, 500);\n }\n },\n [config.apiUrl],\n );\n\n const logout = useCallback(async () => {\n const token = auth.accessToken;\n if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);\n setAuth({ status: 'unauthenticated', user: null, accessToken: null });\n onLogout?.();\n if (token) {\n try {\n await api.logout(token);\n } catch {\n // Already logged out client-side\n }\n }\n }, [auth.accessToken, api, onLogout]);\n\n const forgotPassword = useCallback(\n async (email: string) => {\n await api.forgotPassword(email);\n },\n [api],\n );\n\n const resetPassword = useCallback(\n async (token: string, password: string) => {\n await api.resetPassword(token, password);\n },\n [api],\n );\n\n const verifyEmailToken = useCallback(\n async (token: string) => {\n const res = await api.verifyEmailToken(token);\n if (res.requires2FA) {\n setChallengeToken(res.challengeToken!);\n setModal({ isOpen: true, step: 'verify-2fa' });\n return;\n }\n await handleAuthSuccess(res.accessToken!);\n },\n [api, handleAuthSuccess],\n );\n\n const loginWithPasskey = useCallback(async () => {\n const { options, challengeKey } = await api.getPasskeyLoginOptions(config.webauthnRpId);\n const authResponse = await startAuthentication({ optionsJSON: options });\n const { accessToken } = await api.verifyPasskeyLogin(challengeKey, authResponse, config.webauthnRpId, config.webauthnOrigin);\n await handleAuthSuccess(accessToken);\n }, [api, handleAuthSuccess, config.webauthnRpId, config.webauthnOrigin]);\n\n const verify2FA = useCallback(async (code: string) => {\n if (!challengeToken) throw new Error('No 2FA challenge active');\n const { accessToken } = await api.verify2FA(challengeToken, code);\n setChallengeToken(null);\n await handleAuthSuccess(accessToken);\n }, [api, challengeToken, handleAuthSuccess]);\n\n const verifyRecoveryCode = useCallback(async (code: string) => {\n if (!challengeToken) throw new Error('No 2FA challenge active');\n const { accessToken } = await api.verifyRecoveryCode(challengeToken, code);\n setChallengeToken(null);\n await handleAuthSuccess(accessToken);\n }, [api, challengeToken, handleAuthSuccess]);\n\n const logoutAll = useCallback(async () => {\n const token = auth.accessToken;\n if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);\n setAuth({ status: 'unauthenticated', user: null, accessToken: null });\n onLogout?.();\n if (token) {\n try {\n await api.logoutAll(token);\n } catch {\n // Already logged out client-side\n }\n }\n }, [auth.accessToken, api, onLogout]);\n\n // ── Modal Actions ──\n\n const openModal = useCallback(() => {\n const methods = resolveLoginMethods(config);\n\n // Single OAuth method — fire popup directly, skip modal\n if (methods.length === 1 && isOAuthMethod(methods[0])) {\n loginWithOAuth(methods[0]);\n return;\n }\n\n // Default OAuth method — fire popup directly\n if (config.defaultLoginMethod && isOAuthMethod(config.defaultLoginMethod) && methods.includes(config.defaultLoginMethod)) {\n loginWithOAuth(config.defaultLoginMethod);\n return;\n }\n\n const step = resolveInitialStep(config, methods);\n setModal({ isOpen: true, step });\n }, [config, loginWithOAuth]);\n\n const closeModal = useCallback(() => {\n setModal({ isOpen: false, step: 'method-select' });\n }, []);\n\n const setModalStep = useCallback((step: ModalStep) => {\n setModal((prev) => ({ ...prev, step }));\n }, []);\n\n const openAccountModal = useCallback(() => {\n setAccountModal({ isOpen: true });\n }, []);\n\n const closeAccountModal = useCallback(() => {\n setAccountModal({ isOpen: false });\n }, []);\n\n const openLinkModal = useCallback((mode?: 'auth' | 'wallet') => {\n setLinkModal({ isOpen: true, mode: mode ?? 'auth' });\n }, []);\n\n const closeLinkModal = useCallback(() => {\n setLinkModal({ isOpen: false });\n }, []);\n\n const getAccessToken = useCallback(() => auth.accessToken, [auth.accessToken]);\n\n // ── Context Value (memoized to avoid unnecessary re-renders) ──\n\n const value: ForgeConnectContextValue = useMemo(() => ({\n auth,\n modal,\n config,\n api,\n loginWithEmail,\n register,\n sendOtp,\n verifyOtp,\n loginWithWallet,\n loginWithOAuth,\n loginWithPasskey,\n logout,\n logoutAll,\n forgotPassword,\n resetPassword,\n verifyEmailToken,\n challengeToken,\n verify2FA,\n verifyRecoveryCode,\n openModal,\n closeModal,\n setModalStep,\n accountModal,\n openAccountModal,\n closeAccountModal,\n linkModal,\n openLinkModal,\n closeLinkModal,\n getAccessToken,\n walletAdapter: walletAdapter ?? null,\n }), [\n auth, modal, config, api, challengeToken, accountModal, linkModal,\n loginWithEmail, register, sendOtp, verifyOtp, loginWithWallet,\n loginWithOAuth, loginWithPasskey, logout, logoutAll, forgotPassword,\n resetPassword, verifyEmailToken, verify2FA, verifyRecoveryCode,\n openModal, closeModal, setModalStep, openAccountModal, closeAccountModal,\n openLinkModal, closeLinkModal, getAccessToken, walletAdapter,\n ]);\n\n return (\n <ForgeConnectContext.Provider value={value}>\n {children}\n <LoginModal />\n <AccountModal />\n <LinkAuthModal />\n </ForgeConnectContext.Provider>\n );\n}\n\n","import { createContext } from 'react';\nimport type { AuthState, ModalState, AccountModalState, LinkModalState, ForgeConnectConfig } from './types';\nimport type { ApiClient } from './api/client';\n\nexport interface ForgeConnectContextValue {\n // State\n auth: AuthState;\n modal: ModalState;\n config: ForgeConnectConfig;\n api: ApiClient;\n\n // Auth actions\n loginWithEmail: (email: string, password: string) => Promise<void>;\n register: (email: string, password: string, displayName?: string) => Promise<void>;\n sendOtp: (email: string) => Promise<void>;\n verifyOtp: (email: string, code: string) => Promise<void>;\n loginWithWallet: (walletAddress: string, signMessage: ((message: Uint8Array) => Promise<Uint8Array>) | undefined, chain?: string, signTransaction?: (txBase64: string) => Promise<string>) => Promise<void>;\n loginWithOAuth: (provider: string) => void;\n loginWithPasskey: () => Promise<void>;\n logout: () => Promise<void>;\n logoutAll: () => Promise<void>;\n forgotPassword: (email: string) => Promise<void>;\n resetPassword: (token: string, password: string) => Promise<void>;\n verifyEmailToken: (token: string) => Promise<void>;\n\n // 2FA\n challengeToken: string | null;\n verify2FA: (code: string) => Promise<void>;\n verifyRecoveryCode: (code: string) => Promise<void>;\n\n // Modal actions\n openModal: () => void;\n closeModal: () => void;\n setModalStep: (step: ModalState['step']) => void;\n\n // Account modal\n accountModal: AccountModalState;\n openAccountModal: () => void;\n closeAccountModal: () => void;\n\n // Link modal\n linkModal: LinkModalState;\n openLinkModal: (mode?: 'auth' | 'wallet') => void;\n closeLinkModal: () => void;\n\n // Token\n getAccessToken: () => string | null;\n\n // Wallet adapter (optional, injected by consumer)\n walletAdapter: WalletAdapterContext | null;\n}\n\nexport interface WalletAdapterContext {\n publicKey: { toBase58(): string } | null;\n signMessage: ((message: Uint8Array) => Promise<Uint8Array>) | undefined;\n signTransaction: ((transaction: any) => Promise<any>) | undefined;\n wallets: Array<{ adapter: { name: string; icon: string; connected: boolean; publicKey?: { toBase58(): string } | null }; readyState: string }>;\n select: (name: string) => void;\n connect: () => Promise<void>;\n}\n\nexport const ForgeConnectContext = createContext<ForgeConnectContextValue | null>(null);\n","import type { ApiErrorBody, User, AdminUser, Session, PaginatedResponse, UserStatus, TokenVerificationResult, WalletUserResult, TotpSetup, Passkey, Role, RoleUser, UserRoleAssignment, PermissionDomains } from '../types';\n\nexport class ForgeConnectApiError extends Error {\n public readonly status: number;\n public readonly code: string;\n\n constructor(status: number, code: string, message: string) {\n super(message);\n this.name = 'ForgeConnectApiError';\n this.status = status;\n this.code = code;\n }\n}\n\nexport function createApiClient(apiUrl: string) {\n const base = apiUrl.replace(/\\/+$/, '');\n\n // Request deduplication: prevents duplicate concurrent GET requests\n const inflightRequests = new Map<string, Promise<any>>();\n\n async function request<T>(\n path: string,\n options: {\n method?: string;\n body?: unknown;\n token?: string | null;\n } = {},\n ): Promise<T> {\n const { method = 'GET', body, token } = options;\n\n // Deduplicate identical concurrent GET requests\n if (method === 'GET' && token) {\n const dedupKey = `${path}:${token}`;\n const inflight = inflightRequests.get(dedupKey);\n if (inflight) return inflight as Promise<T>;\n const promise = doRequest<T>(path, options).finally(() => {\n inflightRequests.delete(dedupKey);\n });\n inflightRequests.set(dedupKey, promise);\n return promise;\n }\n\n return doRequest<T>(path, options);\n }\n\n async function doRequest<T>(\n path: string,\n options: {\n method?: string;\n body?: unknown;\n token?: string | null;\n } = {},\n ): Promise<T> {\n const { method = 'GET', body, token } = options;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n const res = await fetch(`${base}${path}`, {\n method,\n headers,\n credentials: 'include',\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n let errorBody: ApiErrorBody;\n try {\n errorBody = await res.json() as ApiErrorBody;\n } catch {\n throw new ForgeConnectApiError(res.status, 'UNKNOWN', res.statusText);\n }\n throw new ForgeConnectApiError(res.status, errorBody.error.code, errorBody.error.message);\n }\n\n return res.json() as Promise<T>;\n }\n\n async function serviceRequest<T>(\n path: string,\n options: {\n method?: string;\n body?: unknown;\n serviceKey: string;\n },\n ): Promise<T> {\n const { method = 'GET', body, serviceKey } = options;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-service-key': serviceKey,\n };\n\n const res = await fetch(`${base}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n let errorBody: ApiErrorBody;\n try {\n errorBody = await res.json() as ApiErrorBody;\n } catch {\n throw new ForgeConnectApiError(res.status, 'UNKNOWN', res.statusText);\n }\n throw new ForgeConnectApiError(res.status, errorBody.error.code, errorBody.error.message);\n }\n\n return res.json() as Promise<T>;\n }\n\n return {\n // ── Auth: Email ──\n register(email: string, password: string, displayName?: string) {\n return request<{ success: true }>('/auth/email/register', {\n method: 'POST',\n body: { email, password, displayName },\n });\n },\n\n login(email: string, password: string) {\n return request<{ accessToken?: string; requires2FA?: boolean; challengeToken?: string; user?: { id: string; displayName: string | null; email: string } }>(\n '/auth/email/login',\n { method: 'POST', body: { email, password } },\n );\n },\n\n sendOtp(email: string) {\n return request<{ success: true }>('/auth/email/send-code', {\n method: 'POST',\n body: { email },\n });\n },\n\n verifyOtp(email: string, code: string) {\n return request<{ accessToken?: string; requires2FA?: boolean; challengeToken?: string; user?: { id: string; email: string } }>(\n '/auth/email/verify-code',\n { method: 'POST', body: { email, code } },\n );\n },\n\n // ── Auth: Wallet ──\n walletChallenge(walletAddress: string, chain: string = 'solana') {\n return request<{ challengeId: string; message: string }>('/auth/wallet/challenge', {\n method: 'POST',\n body: { walletAddress, chain },\n });\n },\n\n walletVerify(challengeId: string, signature: string, walletAddress: string) {\n return request<{ accessToken?: string; requires2FA?: boolean; challengeToken?: string }>('/auth/wallet/verify', {\n method: 'POST',\n body: { challengeId, signature, walletAddress },\n });\n },\n\n walletChallengeTx(walletAddress: string, chain: string = 'solana') {\n return request<{ challengeId: string; transaction: string }>('/auth/wallet/challenge-tx', {\n method: 'POST',\n body: { walletAddress, chain },\n });\n },\n\n walletVerifyTx(challengeId: string, signedTransaction: string, walletAddress: string) {\n return request<{ accessToken?: string; requires2FA?: boolean; challengeToken?: string }>('/auth/wallet/verify-tx', {\n method: 'POST',\n body: { challengeId, signedTransaction, walletAddress },\n });\n },\n\n // ── Auth: OAuth ──\n exchangeOAuthCode(code: string) {\n return request<{ accessToken?: string; requires2FA?: boolean; challengeToken?: string; userId?: string }>('/auth/oauth/exchange', {\n method: 'POST',\n body: { code },\n });\n },\n\n createLinkIntent(token: string) {\n return request<{ intentToken: string }>('/auth/oauth/link-intent', {\n method: 'POST',\n token,\n });\n },\n\n // ── Auth: Session ──\n refresh() {\n return request<{ accessToken: string }>('/auth/refresh', { method: 'POST' });\n },\n\n logout(token: string) {\n return request<{ success: true }>('/auth/logout', { method: 'POST', token });\n },\n\n logoutAll(token: string) {\n return request<{ success: true }>('/auth/logout-all', { method: 'POST', token });\n },\n\n // ── User ──\n getMe(token: string) {\n return request<{ id: string; displayName: string | null; avatarUrl: string | null; primaryEmail: string | null; status: string; createdAt: string; updatedAt: string }>(\n '/users/me',\n { token },\n );\n },\n\n updateMe(token: string, data: { displayName?: string; avatarUrl?: string }) {\n return request<{ id: string; displayName: string | null; avatarUrl: string | null; primaryEmail: string | null; status: string; createdAt: string; updatedAt: string }>(\n '/users/me',\n { method: 'PATCH', token, body: data },\n );\n },\n\n setPassword(token: string, newPassword: string, currentPassword?: string) {\n return request<{ success: true }>('/users/me/password', {\n method: 'POST',\n token,\n body: { newPassword, ...(currentPassword ? { currentPassword } : {}) },\n });\n },\n\n getAuthMethods(token: string) {\n return request<Array<{ id: string; provider: string; providerId: string; providerUsername: string | null; isVerified: boolean; verifiedAt: string | null; createdAt: string }>>(\n '/users/me/auth-methods',\n { token },\n );\n },\n\n linkAuthMethod(token: string, data: { provider: string; email?: string; password?: string; challengeId?: string; signature?: string; signedTransaction?: string; walletAddress?: string }) {\n return request<{ success: true }>('/users/me/auth-methods', {\n method: 'POST',\n token,\n body: data,\n });\n },\n\n linkOtpSend(token: string, email: string) {\n return request<{ success: true }>('/users/me/auth-methods/otp/send', {\n method: 'POST',\n token,\n body: { email },\n });\n },\n\n linkOtpVerify(token: string, email: string, code: string) {\n return request<{ success: true }>('/users/me/auth-methods/otp/verify', {\n method: 'POST',\n token,\n body: { email, code },\n });\n },\n\n unlinkAuthMethod(token: string, id: string) {\n return request<{ success: true }>(`/users/me/auth-methods/${id}`, {\n method: 'DELETE',\n token,\n });\n },\n\n getWallets(token: string) {\n return request<Array<{ id: string; userId: string; chain: string; address: string; label: string | null; isPrimary: boolean; verifiedAt: string | null; lastUsedAt: string | null }>>(\n '/users/me/wallets',\n { token },\n );\n },\n\n updateWallet(token: string, id: string, data: { label?: string; isPrimary?: boolean }) {\n return request<{ id: string; userId: string; chain: string; address: string; label: string | null; isPrimary: boolean; verifiedAt: string | null; lastUsedAt: string | null }>(\n `/users/me/wallets/${id}`,\n { method: 'PATCH', token, body: data },\n );\n },\n\n getSessions(token: string) {\n return request<Array<{ id: string; createdAt: string; expiresAt: string; lastActiveAt: string; deviceInfo: Record<string, unknown> | null; ipAddress: string }>>(\n '/users/me/sessions',\n { token },\n );\n },\n\n revokeSession(token: string, id: string) {\n return request<{ success: true }>(`/users/me/sessions/${id}`, {\n method: 'DELETE',\n token,\n });\n },\n\n // ── Auth: Email Verification & Password Reset ──\n verifyEmailToken(token: string) {\n return request<{ accessToken?: string; requires2FA?: boolean; challengeToken?: string }>('/auth/email/verify', {\n method: 'POST',\n body: { token },\n });\n },\n\n forgotPassword(email: string) {\n return request<{ success: true }>('/auth/email/forgot-password', {\n method: 'POST',\n body: { email },\n });\n },\n\n resetPassword(token: string, password: string) {\n return request<{ success: true }>('/auth/email/reset-password', {\n method: 'POST',\n body: { token, password },\n });\n },\n\n // ── 2FA ──\n get2FAStatus(token: string) {\n return request<{ enabled: boolean }>('/users/me/2fa/status', { token });\n },\n\n setup2FA(token: string) {\n return request<TotpSetup>('/users/me/2fa/setup', { method: 'POST', token });\n },\n\n enable2FA(token: string, code: string) {\n return request<{ success: true }>('/users/me/2fa/enable', { method: 'POST', token, body: { code } });\n },\n\n disable2FA(token: string, code: string) {\n return request<{ success: true }>('/users/me/2fa', { method: 'DELETE', token, body: { code } });\n },\n\n verify2FA(challengeToken: string, code: string) {\n return request<{ accessToken: string }>('/auth/2fa/verify', { method: 'POST', body: { challengeToken, code } });\n },\n\n verifyRecoveryCode(challengeToken: string, code: string) {\n return request<{ accessToken: string }>('/auth/2fa/verify-recovery', { method: 'POST', body: { challengeToken, code } });\n },\n\n regenerateRecoveryCodes(token: string, code: string) {\n return request<{ recoveryCodes: string[] }>('/users/me/2fa/recovery-codes', { method: 'POST', token, body: { code } });\n },\n\n // ── Passkeys ──\n getPasskeys(token: string) {\n return request<Passkey[]>('/users/me/passkeys', { token });\n },\n\n getPasskeyRegisterOptions(token: string, rpId?: string, origin?: string) {\n return request<{ options: any; challengeKey: string }>('/auth/passkeys/register/options', { method: 'POST', token, body: { rpId, origin } });\n },\n\n verifyPasskeyRegistration(token: string, challengeKey: string, response: any, name?: string, rpId?: string, origin?: string) {\n return request<Passkey>('/auth/passkeys/register/verify', { method: 'POST', token, body: { challengeKey, response, name, rpId, origin } });\n },\n\n getPasskeyLoginOptions(rpId?: string) {\n return request<{ options: any; challengeKey: string }>('/auth/passkeys/login/options', { method: 'POST', body: { rpId } });\n },\n\n verifyPasskeyLogin(challengeKey: string, response: any, rpId?: string, origin?: string) {\n return request<{ accessToken: string }>('/auth/passkeys/login/verify', { method: 'POST', body: { challengeKey, response, rpId, origin } });\n },\n\n renamePasskey(token: string, id: string, name: string) {\n return request<Passkey>(`/users/me/passkeys/${id}`, { method: 'PATCH', token, body: { name } });\n },\n\n deletePasskey(token: string, id: string) {\n return request<{ success: true }>(`/users/me/passkeys/${id}`, { method: 'DELETE', token });\n },\n\n // ── Account Deletion ──\n requestAccountDeletion(token: string) {\n return request<{ requiresVerification: boolean }>('/users/me/delete-request', {\n method: 'POST',\n token,\n });\n },\n\n confirmAccountDeletion(token: string, code?: string) {\n return request<{ success: true }>('/users/me/delete-confirm', {\n method: 'POST',\n token,\n body: code ? { code } : {},\n });\n },\n\n // ── Admin ──\n adminListUsers(token: string, params?: { page?: number; limit?: number; search?: string }) {\n const query = new URLSearchParams();\n if (params?.page) query.set('page', String(params.page));\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.search) query.set('search', params.search);\n const qs = query.toString();\n return request<PaginatedResponse<User>>(`/admin/users${qs ? `?${qs}` : ''}`, { token });\n },\n\n adminGetUser(token: string, id: string) {\n return request<AdminUser>(`/admin/users/${id}`, { token });\n },\n\n adminUpdateUserStatus(token: string, id: string, status: UserStatus) {\n return request<{ success: true }>(`/admin/users/${id}/status`, {\n method: 'PATCH',\n token,\n body: { status },\n });\n },\n\n adminGetUserSessions(token: string, id: string) {\n return request<Session[]>(`/admin/users/${id}/sessions`, { token });\n },\n\n adminRevokeUserSessions(token: string, id: string) {\n return request<{ success: true }>(`/admin/users/${id}/sessions`, {\n method: 'DELETE',\n token,\n });\n },\n\n // ── Roles ──\n adminListRoles(token: string, tenantId?: string) {\n const query = new URLSearchParams();\n if (tenantId) query.set('tenantId', tenantId);\n const qs = query.toString();\n return request<{ data: Role[] }>(`/admin/roles${qs ? `?${qs}` : ''}`, { token });\n },\n\n adminGetRole(token: string, id: string) {\n return request<Role>(`/admin/roles/${id}`, { token });\n },\n\n adminGetRoleUsers(token: string, id: string) {\n return request<{ data: RoleUser[] }>(`/admin/roles/${id}/users`, { token });\n },\n\n adminCreateRole(token: string, data: { name: string; description?: string; permissions: string[]; tenantId?: string }) {\n return request<Role>('/admin/roles', { method: 'POST', token, body: data });\n },\n\n adminUpdateRole(token: string, id: string, data: { name?: string; description?: string; permissions?: string[] }) {\n return request<Role>(`/admin/roles/${id}`, { method: 'PATCH', token, body: data });\n },\n\n adminDeleteRole(token: string, id: string) {\n return request<{ success: true }>(`/admin/roles/${id}`, { method: 'DELETE', token });\n },\n\n adminGetPermissions(token: string) {\n return request<{ domains: PermissionDomains }>('/admin/roles/permissions', { token });\n },\n\n adminGetUserRoles(token: string, userId: string, tenantId?: string) {\n const query = new URLSearchParams();\n if (tenantId) query.set('tenantId', tenantId);\n const qs = query.toString();\n return request<{ data: UserRoleAssignment[] }>(`/admin/users/${userId}/roles${qs ? `?${qs}` : ''}`, { token });\n },\n\n adminAssignRole(token: string, userId: string, roleId: string, tenantId?: string) {\n return request<{ success: true }>(`/admin/users/${userId}/roles`, {\n method: 'POST',\n token,\n body: { roleId, ...(tenantId ? { tenantId } : {}) },\n });\n },\n\n adminRevokeRole(token: string, userId: string, roleId: string, tenantId?: string) {\n const query = new URLSearchParams();\n if (tenantId) query.set('tenantId', tenantId);\n const qs = query.toString();\n return request<{ success: true }>(`/admin/users/${userId}/roles/${roleId}${qs ? `?${qs}` : ''}`, {\n method: 'DELETE',\n token,\n });\n },\n\n // ── Service ──\n serviceVerifyToken(serviceKey: string, accessToken: string, tenantId?: string) {\n return serviceRequest<TokenVerificationResult>('/service/verify-token', {\n method: 'POST',\n serviceKey,\n body: { token: accessToken, ...(tenantId ? { tenantId } : {}) },\n });\n },\n\n serviceUserByWallet(serviceKey: string, walletAddress: string, chain?: string) {\n return serviceRequest<WalletUserResult>('/service/user-by-wallet', {\n method: 'POST',\n serviceKey,\n body: { walletAddress, chain },\n });\n },\n };\n}\n\nexport type ApiClient = ReturnType<typeof createApiClient>;\n","interface DecodedJWT {\n sub: string;\n tid?: string;\n scopes: string[];\n iat?: number;\n exp?: number;\n}\n\nexport function decodeJWT(token: string): DecodedJWT | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n const payload = JSON.parse(atob(parts[1].replace(/-/g, '+').replace(/_/g, '/')));\n return payload as DecodedJWT;\n } catch {\n return null;\n }\n}\n\n/**\n * Returns milliseconds until 80% of the token's TTL has elapsed.\n * Returns null if the token cannot be decoded or has no exp.\n */\nexport function getRefreshDelay(token: string): number | null {\n const decoded = decodeJWT(token);\n if (!decoded?.exp || !decoded.iat) return null;\n const ttl = (decoded.exp - decoded.iat) * 1000;\n const elapsed = Date.now() - decoded.iat * 1000;\n const delay = ttl * 0.8 - elapsed;\n return delay > 0 ? delay : 0;\n}\n","import { useState, type ReactNode } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { ModalOverlay } from './modal-overlay.js';\nimport { EmailLoginForm, EmailRegisterForm } from './tabs/email-password.js';\nimport { EmailOtpForm } from './tabs/email-otp.js';\nimport { WalletConnectForm } from './tabs/wallet-connect.js';\nimport { ForgotPasswordForm } from './tabs/forgot-password.js';\nimport { Verify2FAForm } from './tabs/verify-2fa.js';\nimport { OAuthButton } from './tabs/oauth-buttons.js';\nimport { resolveLoginMethods, isOAuthMethod } from '../resolve-config.js';\nimport type { LoginMethod } from '../types.js';\n\nexport function LoginModal() {\n const { modal, closeModal, config } = useForgeConnect();\n\n const renderStep = () => {\n switch (modal.step) {\n case 'email-login':\n return <EmailLoginForm />;\n case 'email-register':\n return <EmailRegisterForm />;\n case 'email-otp':\n return <EmailOtpForm />;\n case 'wallet-connect':\n return <WalletConnectForm />;\n case 'forgot-password':\n return <ForgotPasswordForm />;\n case 'verify-2fa':\n return <Verify2FAForm />;\n case 'oauth':\n return <OAuthLoadingView />;\n case 'success':\n return <SuccessView />;\n case 'method-select':\n default:\n return <MethodSelect />;\n }\n };\n\n const renderLogo = () => {\n if (config.appearance?.logoNode) {\n return <div className=\"fc-logo\">{config.appearance.logoNode as ReactNode}</div>;\n }\n if (config.appearance?.logo) {\n return <img src={config.appearance.logo} alt=\"\" className=\"fc-logo\" />;\n }\n return null;\n };\n\n return (\n <ModalOverlay isOpen={modal.isOpen} onClose={closeModal}>\n <div\n className=\"fc-modal-content\"\n style={{\n '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6',\n } as React.CSSProperties}\n data-theme={config.appearance?.theme ?? 'light'}\n >\n {modal.step === 'success' || modal.step === 'oauth' ? (\n renderStep()\n ) : (\n <>\n {renderLogo()}\n\n <h2 className=\"fc-modal-title\">\n {config.appearance?.title ?? 'Log in or sign up'}\n </h2>\n {renderStep()}\n {(config.appearance?.termsUrl || config.appearance?.privacyUrl) && (\n <p className=\"fc-legal\">\n By continuing, you agree to our{' '}\n {config.appearance.termsUrl && (\n <a href={config.appearance.termsUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"fc-legal-link\">Terms</a>\n )}\n {config.appearance.termsUrl && config.appearance.privacyUrl && ' and '}\n {config.appearance.privacyUrl && (\n <a href={config.appearance.privacyUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"fc-legal-link\">Privacy Policy</a>\n )}\n </p>\n )}\n </>\n )}\n </div>\n </ModalOverlay>\n );\n}\n\n// ── Icons ──\n\nconst EmailIcon = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon\">\n <rect x=\"2\" y=\"4\" width=\"16\" height=\"12\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2 6l8 5 8-5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </div>\n);\n\nconst OtpIcon = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon\">\n <rect x=\"3\" y=\"6\" width=\"14\" height=\"9\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <circle cx=\"6.5\" cy=\"10.5\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"10\" cy=\"10.5\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"13.5\" cy=\"10.5\" r=\"1\" fill=\"currentColor\" />\n </svg>\n </div>\n);\n\nconst WalletIcon = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon\">\n <rect x=\"2\" y=\"5\" width=\"16\" height=\"11\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <rect x=\"13\" y=\"9\" width=\"5\" height=\"3\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n </div>\n);\n\nconst PasskeyIcon = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon\">\n <circle cx=\"8\" cy=\"7\" r=\"3\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M13 13.5a5 5 0 0 0-10 0\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M15 10v4m0 0l-1.5-1m1.5 1l1.5-1\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </div>\n);\n\nconst LoadingSpinner = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon fc-spin\">\n <path d=\"M10 2a8 8 0 0 1 8 8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </div>\n);\n\n// ── Method Select ──\n\nfunction MethodSelect() {\n const { setModalStep, loginWithPasskey, config } = useForgeConnect();\n const methods = resolveLoginMethods(config);\n const [passkeyLoading, setPasskeyLoading] = useState(false);\n const [passkeyError, setPasskeyError] = useState('');\n\n const handlePasskey = async () => {\n setPasskeyLoading(true);\n setPasskeyError('');\n try {\n await loginWithPasskey();\n } catch (err: unknown) {\n setPasskeyError(err instanceof Error ? err.message : 'Passkey authentication failed.');\n } finally {\n setPasskeyLoading(false);\n }\n };\n\n // Build elements in config order, grouping consecutive OAuth providers\n const elements: ReactNode[] = [];\n let i = 0;\n\n while (i < methods.length) {\n const method = methods[i];\n\n if (isOAuthMethod(method)) {\n // Collect consecutive OAuth providers\n const oauthGroup: LoginMethod[] = [];\n while (i < methods.length && isOAuthMethod(methods[i])) {\n oauthGroup.push(methods[i]);\n i++;\n }\n\n // Add divider before OAuth group if there were non-OAuth elements before\n if (elements.length > 0) {\n elements.push(<div key={`div-before-${oauthGroup[0]}`} className=\"fc-divider\"><span>or</span></div>);\n }\n\n elements.push(\n <div key={`oauth-${oauthGroup.join('-')}`} className=\"fc-oauth-group\">\n {oauthGroup.map((p) => (\n <OAuthButton key={p} provider={p as any} />\n ))}\n </div>,\n );\n } else {\n // Add divider after an OAuth group\n if (elements.length > 0) {\n const prev = methods[i - 1];\n if (prev && isOAuthMethod(prev)) {\n elements.push(<div key={`div-after-${prev}`} className=\"fc-divider\"><span>or</span></div>);\n }\n }\n\n switch (method) {\n case 'email':\n elements.push(\n <button key=\"email\" type=\"button\" className=\"fc-btn fc-btn-method\" onClick={() => setModalStep('email-login')}>\n <EmailIcon /> <span className=\"fc-btn-name\">Password</span>\n </button>,\n );\n break;\n case 'otp':\n elements.push(\n <button key=\"otp\" type=\"button\" className=\"fc-btn fc-btn-method\" onClick={() => setModalStep('email-otp')}>\n <OtpIcon /> <span className=\"fc-btn-name\">Magic code</span>\n </button>,\n );\n break;\n case 'wallet':\n elements.push(\n <button key=\"wallet\" type=\"button\" className=\"fc-btn fc-btn-method\" onClick={() => setModalStep('wallet-connect')}>\n <WalletIcon /> <span className=\"fc-btn-name\">Wallet</span>\n </button>,\n );\n break;\n case 'passkey':\n elements.push(\n <button key=\"passkey\" type=\"button\" className=\"fc-btn fc-btn-method\" onClick={handlePasskey} disabled={passkeyLoading}>\n {passkeyLoading ? <LoadingSpinner /> : <PasskeyIcon />}\n <span className=\"fc-btn-name\">{passkeyLoading ? 'Waiting for passkey...' : 'Passkey'}</span>\n </button>,\n );\n break;\n }\n i++;\n }\n }\n\n return (\n <div className=\"fc-method-select\">\n {passkeyError && <p className=\"fc-error\">{passkeyError}</p>}\n {elements}\n </div>\n );\n}\n\n// ── OAuth Loading View ──\n\nfunction OAuthLoadingView() {\n const { setModalStep } = useForgeConnect();\n\n return (\n <div className=\"fc-success\">\n <div className=\"fc-success-icon\">\n <svg width=\"52\" height=\"52\" viewBox=\"0 0 52 52\" className=\"fc-spin\">\n <circle cx=\"26\" cy=\"26\" r=\"24\" fill=\"none\" stroke=\"var(--fc-accent, #8b5cf6)\" strokeWidth=\"3\" strokeLinecap=\"round\" strokeDasharray=\"100\" strokeDashoffset=\"30\" />\n </svg>\n </div>\n <p className=\"fc-success-text\">Completing sign in...</p>\n <button type=\"button\" className=\"fc-btn fc-btn-secondary\" style={{ marginTop: '16px' }} onClick={() => setModalStep('method-select')}>\n Cancel\n </button>\n </div>\n );\n}\n\n// ── Success View ──\n\nfunction SuccessView() {\n return (\n <div className=\"fc-success\">\n <div className=\"fc-success-icon\">\n <svg viewBox=\"0 0 52 52\" className=\"fc-success-check\">\n <circle className=\"fc-success-circle\" cx=\"26\" cy=\"26\" r=\"24\" fill=\"none\" />\n <path className=\"fc-success-tick\" fill=\"none\" d=\"M15 26l7.5 7.5L37 19\" />\n </svg>\n </div>\n <p className=\"fc-success-text\">You're in</p>\n </div>\n );\n}\n","import { useContext } from 'react';\nimport { ForgeConnectContext, type ForgeConnectContextValue } from '../context';\n\nexport function useForgeConnect(): ForgeConnectContextValue {\n const ctx = useContext(ForgeConnectContext);\n if (!ctx) {\n throw new Error('useForgeConnect must be used within a <ForgeConnectProvider>');\n }\n return ctx;\n}\n","import { useEffect, useRef, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\n\ninterface ModalOverlayProps {\n isOpen: boolean;\n onClose: () => void;\n children: ReactNode;\n}\n\nexport function ModalOverlay({ isOpen, onClose, children }: ModalOverlayProps) {\n const overlayRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!isOpen) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handleKeyDown);\n document.body.style.overflow = 'hidden';\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n // Only restore scroll if no other fc-overlay remains in the DOM\n if (!document.querySelector('.fc-overlay')) {\n document.body.style.overflow = '';\n }\n };\n }, [isOpen, onClose]);\n\n if (!isOpen) return null;\n\n const handleBackdropClick = (e: React.MouseEvent) => {\n if (e.target === overlayRef.current) onClose();\n };\n\n return createPortal(\n <div className=\"fc-overlay\" ref={overlayRef} onClick={handleBackdropClick}>\n <div className=\"fc-modal\" role=\"dialog\" aria-modal=\"true\">\n <button className=\"fc-modal-close\" onClick={onClose} aria-label=\"Close\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M15 5L5 15M5 5l10 10\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n </button>\n {children}\n </div>\n </div>,\n document.body,\n );\n}\n","import { useState, type FormEvent } from 'react';\nimport { useForgeConnect } from '../../hooks/use-forge-connect.js';\nimport { resolveLoginMethods } from '../../resolve-config.js';\n\nexport function EmailLoginForm() {\n const { loginWithEmail, setModalStep, config } = useForgeConnect();\n const methods = resolveLoginMethods(config);\n const showBack = methods.length > 1;\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n await loginWithEmail(email, password);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Something went wrong. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Sign in with email</h3>\n <form onSubmit={handleSubmit} className=\"fc-form\">\n <label className=\"fc-label\">\n Email\n <input\n type=\"email\"\n className=\"fc-input\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n autoComplete=\"email\"\n />\n </label>\n <label className=\"fc-label\">\n Password\n <input\n type=\"password\"\n className=\"fc-input\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Enter your password\"\n required\n autoComplete=\"current-password\"\n minLength={8}\n />\n </label>\n {error && <p className=\"fc-error\">{error}</p>}\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Signing in...' : 'Sign in'}\n </button>\n </form>\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('forgot-password')}>\n Forgot password?\n </button>\n </p>\n <p className=\"fc-switch\">\n Don't have an account?{' '}\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('email-register')}>\n Sign up\n </button>\n </p>\n {showBack && (\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('method-select')}>\n Back\n </button>\n </p>\n )}\n </div>\n );\n}\n\nexport function EmailRegisterForm() {\n const { register, setModalStep } = useForgeConnect();\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [displayName, setDisplayName] = useState('');\n const [error, setError] = useState('');\n const [success, setSuccess] = useState(false);\n const [loading, setLoading] = useState(false);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n await register(email, password, displayName || undefined);\n setSuccess(true);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Something went wrong. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n if (success) {\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Check your email</h3>\n <p className=\"fc-text\">We sent a verification link to <strong>{email}</strong>. Click it to activate your account, then sign in.</p>\n <button type=\"button\" className=\"fc-btn fc-btn-secondary\" onClick={() => setModalStep('email-login')}>\n Back to sign in\n </button>\n </div>\n );\n }\n\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Create an account</h3>\n <form onSubmit={handleSubmit} className=\"fc-form\">\n <label className=\"fc-label\">\n Display name\n <input\n type=\"text\"\n className=\"fc-input\"\n value={displayName}\n onChange={(e) => setDisplayName(e.target.value)}\n placeholder=\"Your name\"\n autoComplete=\"name\"\n />\n </label>\n <label className=\"fc-label\">\n Email\n <input\n type=\"email\"\n className=\"fc-input\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n autoComplete=\"email\"\n />\n </label>\n <label className=\"fc-label\">\n Password\n <input\n type=\"password\"\n className=\"fc-input\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"8+ characters\"\n required\n autoComplete=\"new-password\"\n minLength={8}\n />\n </label>\n {error && <p className=\"fc-error\">{error}</p>}\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Creating account...' : 'Create account'}\n </button>\n </form>\n <p className=\"fc-switch\">\n Already have an account?{' '}\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('email-login')}>\n Sign in\n </button>\n </p>\n </div>\n );\n}\n","import type { ForgeConnectConfig, LoginMethod, ModalStep, OAuthProvider } from './types.js';\n\nconst OAUTH_PROVIDERS: ReadonlySet<string> = new Set(['google', 'discord', 'twitter', 'apple', 'telegram']);\n\n/** Check if a login method is an OAuth provider. */\nexport function isOAuthMethod(method: LoginMethod): method is OAuthProvider {\n return OAUTH_PROVIDERS.has(method);\n}\n\n/**\n * Resolve the effective ordered login methods from config.\n * If `loginMethods` is set, uses that directly.\n * Otherwise, falls back to legacy fields for backward compat.\n */\nexport function resolveLoginMethods(config: ForgeConnectConfig): LoginMethod[] {\n if (config.loginMethods && config.loginMethods.length > 0) {\n return config.loginMethods;\n }\n\n // Legacy resolution\n const methods: LoginMethod[] = [];\n\n if (config.oauthProviders) {\n for (const p of config.oauthProviders) {\n methods.push(p);\n }\n }\n\n methods.push('email');\n\n if (config.passwordlessLogin !== false) {\n methods.push('otp');\n }\n\n if (config.walletLogin !== false) {\n methods.push('wallet');\n }\n\n return methods;\n}\n\n/** Map a LoginMethod to the ModalStep it navigates to. */\nexport function loginMethodToStep(method: LoginMethod): ModalStep {\n switch (method) {\n case 'email': return 'email-login';\n case 'otp': return 'email-otp';\n case 'wallet': return 'wallet-connect';\n case 'passkey': return 'method-select'; // Passkey triggers browser API directly\n default: return 'method-select'; // OAuth methods handled specially\n }\n}\n\n/**\n * Determine the initial modal step when opened.\n * - If only 1 method and it's not OAuth, go directly to that step.\n * - If `defaultLoginMethod` is set (and valid), go to that step.\n * - Otherwise, show method-select.\n */\nexport function resolveInitialStep(config: ForgeConnectConfig, methods: LoginMethod[]): ModalStep {\n // Single method — skip method-select\n if (methods.length === 1 && !isOAuthMethod(methods[0])) {\n return loginMethodToStep(methods[0]);\n }\n\n const defaultMethod = config.defaultLoginMethod;\n if (!defaultMethod || !methods.includes(defaultMethod)) {\n return 'method-select';\n }\n\n if (isOAuthMethod(defaultMethod)) {\n return 'method-select'; // OAuth default handled in openModal by firing popup\n }\n\n return loginMethodToStep(defaultMethod);\n}\n","import { useState, useRef, type FormEvent, type KeyboardEvent, type ClipboardEvent } from 'react';\nimport { useForgeConnect } from '../../hooks/use-forge-connect.js';\nimport { resolveLoginMethods } from '../../resolve-config.js';\n\nexport function EmailOtpForm() {\n const { sendOtp, verifyOtp, setModalStep, config } = useForgeConnect();\n const methods = resolveLoginMethods(config);\n const showBack = methods.length > 1;\n const [email, setEmail] = useState('');\n const [code, setCode] = useState(['', '', '', '', '', '']);\n const [step, setStep] = useState<'email' | 'code'>('email');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n const inputRefs = useRef<(HTMLInputElement | null)[]>([]);\n\n const handleSendCode = async (e: FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n await sendOtp(email);\n setStep('code');\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Could not send the code. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n const handleVerify = async (digits: string[]) => {\n const codeStr = digits.join('');\n if (codeStr.length !== 6) return;\n setError('');\n setLoading(true);\n try {\n await verifyOtp(email, codeStr);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'This code is incorrect. Please check and try again.');\n setLoading(false);\n }\n };\n\n const handleDigitChange = (index: number, value: string) => {\n if (!/^\\d*$/.test(value)) return;\n const digit = value.slice(-1);\n const newCode = [...code];\n newCode[index] = digit;\n setCode(newCode);\n\n if (digit && index < 5) {\n inputRefs.current[index + 1]?.focus();\n }\n\n if (newCode.every((d) => d !== '')) {\n handleVerify(newCode);\n }\n };\n\n const handleKeyDown = (index: number, e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace' && !code[index] && index > 0) {\n inputRefs.current[index - 1]?.focus();\n }\n };\n\n const handlePaste = (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const pasted = e.clipboardData.getData('text').replace(/\\D/g, '').slice(0, 6);\n if (!pasted) return;\n const newCode = [...code];\n for (let i = 0; i < pasted.length; i++) {\n newCode[i] = pasted[i];\n }\n setCode(newCode);\n if (newCode.every((d) => d !== '')) {\n handleVerify(newCode);\n }\n };\n\n if (step === 'email') {\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Passwordless sign in</h3>\n <form onSubmit={handleSendCode} className=\"fc-form\">\n <label className=\"fc-label\">\n Email\n <input\n type=\"email\"\n className=\"fc-input\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n autoComplete=\"email\"\n />\n </label>\n {error && <p className=\"fc-error\">{error}</p>}\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Sending...' : 'Send code'}\n </button>\n </form>\n {showBack && (\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('method-select')}>\n Back\n </button>\n </p>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Enter verification code</h3>\n <p className=\"fc-text\">We sent a 6-digit code to <strong>{email}</strong></p>\n <div className=\"fc-otp-inputs\">\n {code.map((digit, i) => (\n <input\n key={i}\n ref={(el) => { inputRefs.current[i] = el; }}\n type=\"text\"\n inputMode=\"numeric\"\n maxLength={1}\n className=\"fc-otp-digit\"\n value={digit}\n onChange={(e) => handleDigitChange(i, e.target.value)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onPaste={i === 0 ? handlePaste : undefined}\n autoFocus={i === 0}\n />\n ))}\n </div>\n {error && <p className=\"fc-error\">{error}</p>}\n {loading && <p className=\"fc-text\">Verifying...</p>}\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => { setStep('email'); setCode(['', '', '', '', '', '']); setError(''); }}>\n Use a different email\n </button>\n </p>\n </div>\n );\n}\n","import { useState, useMemo, useEffect, useRef, useCallback } from 'react';\nimport { useForgeConnect } from '../../hooks/use-forge-connect.js';\nimport { resolveLoginMethods } from '../../resolve-config.js';\n\n// ── Mobile wallet deep links ──\n\nexport interface MobileWallet {\n name: string;\n icon: string;\n /** Build a universal link that opens the wallet app with the dApp URL in its in-app browser */\n buildUrl: (pageUrl: string) => string;\n}\n\nexport const MOBILE_WALLETS: MobileWallet[] = [\n {\n name: 'Phantom',\n icon: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTA4IiBoZWlnaHQ9IjEwOCIgdmlld0JveD0iMCAwIDEwOCAxMDgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxMDgiIGhlaWdodD0iMTA4IiByeD0iMjYiIGZpbGw9IiNBQjlGRjIiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00Ni41MjY3IDY5LjkyMjlDNDIuMDA1NCA3Ni44NTA5IDM0LjQyOTIgODUuNjE4MiAyNC4zNDggODUuNjE4MkMxOS41ODI0IDg1LjYxODIgMTUgODMuNjU2MyAxNSA3NS4xMzQyQzE1IDUzLjQzMDUgNDQuNjMyNiAxOS44MzI3IDcyLjEyNjggMTkuODMyN0M4Ny43NjggMTkuODMyNyA5NCAzMC42ODQ2IDk0IDQzLjAwNzlDOTQgNTguODI1OCA4My43MzU1IDc2LjkxMjIgNzMuNTMyMSA3Ni45MTIyQzcwLjI5MzkgNzYuOTEyMiA2OC43MDUzIDc1LjEzNDIgNjguNzA1MyA3Mi4zMTRDNjguNzA1MyA3MS41NzgzIDY4LjgyNzUgNzAuNzgxMiA2OS4wNzE5IDY5LjkyMjlDNjUuNTg5MyA3NS44Njk5IDU4Ljg2ODUgODEuMzg3OCA1Mi41NzU0IDgxLjM4NzhDNDcuOTkzIDgxLjM4NzggNDUuNjcxMyA3OC41MDYzIDQ1LjY3MTMgNzQuNDU5OEM0NS42NzEzIDcyLjk4ODQgNDUuOTc2OCA3MS40NTU2IDQ2LjUyNjcgNjkuOTIyOVpNODMuNjc2MSA0Mi41Nzk0QzgzLjY3NjEgNDYuMTcwNCA4MS41NTc1IDQ3Ljk2NTggNzkuMTg3NSA0Ny45NjU4Qzc2Ljc4MTYgNDcuOTY1OCA3NC42OTg5IDQ2LjE3MDQgNzQuNjk4OSA0Mi41Nzk0Qzc0LjY5ODkgMzguOTg4NSA3Ni43ODE2IDM3LjE5MzEgNzkuMTg3NSAzNy4xOTMxQzgxLjU1NzUgMzcuMTkzMSA4My42NzYxIDM4Ljk4ODUgODMuNjc2MSA0Mi41Nzk0Wk03MC4yMTAzIDQyLjU3OTVDNzAuMjEwMyA0Ni4xNzA0IDY4LjA5MTYgNDcuOTY1OCA2NS43MjE2IDQ3Ljk2NThDNjMuMzE1NyA0Ny45NjU4IDYxLjIzMyA0Ni4xNzA0IDYxLjIzMyA0Mi41Nzk1QzYxLjIzMyAzOC45ODg1IDYzLjMxNTcgMzcuMTkzMSA2NS43MjE2IDM3LjE5MzFDNjguMDkxNiAzNy4xOTMxIDcwLjIxMDMgMzguOTg4NSA3MC4yMTAzIDQyLjU3OTVaIiBmaWxsPSIjRkZGREY4Ii8+Cjwvc3ZnPgo=',\n buildUrl: (url) => `https://phantom.app/ul/browse/${encodeURIComponent(url)}?ref=${encodeURIComponent(url)}`,\n },\n {\n name: 'Solflare',\n icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJTIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MCA1MCI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOiMwMjA1MGE7c3Ryb2tlOiNmZmVmNDY7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLXdpZHRoOi41cHg7fS5jbHMtMntmaWxsOiNmZmVmNDY7fTwvc3R5bGU+PC9kZWZzPjxyZWN0IGNsYXNzPSJjbHMtMiIgeD0iMCIgd2lkdGg9IjUwIiBoZWlnaHQ9IjUwIiByeD0iMTIiIHJ5PSIxMiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTI0LjIzLDI2LjQybDIuNDYtMi4zOCw0LjU5LDEuNWMzLjAxLDEsNC41MSwyLjg0LDQuNTEsNS40MywwLDEuOTYtLjc1LDMuMjYtMi4yNSw0LjkzbC0uNDYuNS4xNy0xLjE3Yy42Ny00LjI2LS41OC02LjA5LTQuNzItNy40M2wtNC4zLTEuMzhoMFpNMTguMDUsMTEuODVsMTIuNTIsNC4xNy0yLjcxLDIuNTktNi41MS0yLjE3Yy0yLjI1LS43NS0zLjAxLTEuOTYtMy4zLTQuNTF2LS4wOGgwWk0xNy4zLDMzLjA2bDIuODQtMi43MSw1LjM0LDEuNzVjMi44LjkyLDMuNzYsMi4xMywzLjQ2LDUuMThsLTExLjY1LTQuMjJoMFpNMTMuNzEsMjAuOTVjMC0uNzkuNDItMS41NCwxLjEzLTIuMTcuNzUsMS4wOSwyLjA1LDIuMDUsNC4wOSwyLjcxbDQuNDIsMS40Ni0yLjQ2LDIuMzgtNC4zNC0xLjQyYy0yLS42Ny0yLjg0LTEuNjctMi44NC0yLjk2TTI2LjgyLDQyLjg3YzkuMTgtNi4wOSwxNC4xMS0xMC4yMywxNC4xMS0xNS4zMiwwLTMuMzgtMi01LjI2LTYuNDMtNi43MmwtMy4zNC0xLjEzLDkuMTQtOC43Ny0xLjg0LTEuOTYtMi43MSwyLjM4LTEyLjgxLTQuMjJjLTMuOTcsMS4yOS04Ljk3LDUuMDktOC45Nyw4Ljg5LDAsLjQyLjA0LjgzLjE3LDEuMjktMy4zLDEuODgtNC42MywzLjYzLTQuNjMsNS44LDAsMi4wNSwxLjA5LDQuMDksNC41NSw1LjIybDIuNzUuOTItOS41Miw5LjE0LDEuODQsMS45NiwyLjk2LTIuNzEsMTQuNzMsNS4yMmgwWiIvPjwvc3ZnPg==',\n buildUrl: (url) => `https://solflare.com/ul/v1/browse/${encodeURIComponent(url)}?ref=${encodeURIComponent(url)}`,\n },\n {\n name: 'Backpack',\n icon: 'data:image/webp;base64,UklGRlgCAABXRUJQVlA4WAoAAAAQAAAAOwAAOwAAQUxQSC8AAAABL6CmbQOGP75e/cti0oiIOI0KBto2+a8ACZjAAQ7wL2gCSCL6PwER2t+KmZpFDwBWUDggAgIAAPALAJ0BKjwAPAA+SSCMRKKiIRYKrTQoBISyAGp7nL12mKuwHiZ/pX71XoA8m7rXfQA8q39lfhJ/cL0ZimIeNSGxOaSWtqEDDdJ++ARG5/LVm6OquItoAu4rpz8VksUr1NEDJ0CeZucwAP7+VdYX7J5e8V3cJZ9QoY9vj8KsNGOvZSm+khDZOvwCeiDFjGweq/8KIUmVQk3T/qW3ONyMcepN2uwyEXpZZiidST0x705r7ZnNuWX42r8oi+FEshvXGWm6DabjfrMbiaxJ15irl2Gj3nKWbZ2v3k/jd172plSBejBs7dNt90Re/m+nmv5kNjM/SPfa4EpzvOdu/8BR+hTnR4qe4eWhTsh/oecEfN31OExdi/6AYrsth4nlx/qGEP70b1/TNKmgaB/18+c9ntTfhku9wYpy17/wN3r+B/1geZPzth+AtNsMDXE99PaPLWdFP9MOIMD6ME+MpZu2H7WSfzY7MkWs/N/NNzAZ0P/9vMvxgcdzFHvs/doeUU9WyVv+Ll8QDJbn9NZl86ZZNYtfP4Ol1hiJHWosWyj/66vhMUeFIcDheXIOSRTzvKwj5ffEl7fn/QwflNU556SEjM8MriwSFJ/nrFBrr8O1/pqdrYGqPijG6tjsBVBHp+EDAbtNLL375I2jnG9i3Xb1ZphsFYNjdRaknYdFf4g5iJBoAAA=',\n buildUrl: (url) => `https://backpack.app/ul/browse/${encodeURIComponent(url)}`,\n },\n];\n\nexport function isMobile(): boolean {\n if (typeof navigator === 'undefined') return false;\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n}\n\nexport function WalletConnectForm() {\n const { walletAdapter, setModalStep, config } = useForgeConnect();\n const methods = resolveLoginMethods(config);\n const showBack = methods.length > 1;\n\n // On mobile without wallet adapter, show mobile deep links directly\n if (!walletAdapter && isMobile()) {\n return <MobileWalletFlow />;\n }\n\n if (walletAdapter) {\n return <WalletAdapterFlow />;\n }\n\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Connect wallet</h3>\n <p className=\"fc-text\">\n No wallet adapter detected. Pass <code>walletAdapter</code> to{' '}\n <code>&lt;ForgeConnectProvider&gt;</code> to enable wallet login.\n </p>\n {showBack && (\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('method-select')}>\n Back\n </button>\n </p>\n )}\n </div>\n );\n}\n\n/** Standalone mobile flow — when no wallet adapter is provided but we're on mobile */\nfunction MobileWalletFlow() {\n const { setModalStep, config } = useForgeConnect();\n const methods = resolveLoginMethods(config);\n const showBack = methods.length > 1;\n const walletConfig = config.walletConfig;\n const preferred = walletConfig?.preferredWallets ?? [];\n const onlyPreferred = walletConfig?.onlyPreferred ?? false;\n\n const walletsToShow = useMemo(() => {\n if (preferred.length > 0) {\n const prefList = preferred\n .map((name) => MOBILE_WALLETS.find((mw) => mw.name === name))\n .filter(Boolean) as MobileWallet[];\n if (onlyPreferred) return prefList;\n const prefNames = new Set(preferred);\n const others = MOBILE_WALLETS.filter((mw) => !prefNames.has(mw.name));\n return [...prefList, ...others];\n }\n return MOBILE_WALLETS;\n }, [preferred, onlyPreferred]);\n\n const handleOpen = (mw: MobileWallet) => {\n const pageUrl = window.location.href;\n window.location.href = mw.buildUrl(pageUrl);\n };\n\n return (\n <div className=\"fc-tab\">\n <div className=\"fc-wallet-list\">\n {walletsToShow.map((mw) => (\n <button\n key={mw.name}\n type=\"button\"\n className=\"fc-btn fc-btn-wallet\"\n onClick={() => handleOpen(mw)}\n >\n <span style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={mw.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{mw.name}</span>\n <span className=\"fc-badge-preferred\">Open app</span>\n </button>\n ))}\n </div>\n <p className=\"fc-text\" style={{ textAlign: 'center', fontSize: 12, opacity: 0.6 }}>\n You'll be redirected to the wallet app to sign in.\n </p>\n {showBack && (\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('method-select')}>\n Back\n </button>\n </p>\n )}\n </div>\n );\n}\n\nfunction WalletAdapterFlow() {\n const { walletAdapter, loginWithWallet, setModalStep, config } = useForgeConnect();\n const wallet = walletAdapter!;\n const walletConfig = config.walletConfig;\n const methods = resolveLoginMethods(config);\n const showBack = methods.length > 1;\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n const [showOther, setShowOther] = useState(false);\n const [coldWallet, setColdWallet] = useState(false);\n const mobile = useMemo(() => isMobile(), []);\n\n const coldWalletRef = useRef(coldWallet);\n coldWalletRef.current = coldWallet;\n\n // Build a base64→base64 signTransaction wrapper using a specific adapter.\n const buildSignTxFnForAdapter = useCallback((adapter: any): ((txBase64: string) => Promise<string>) | undefined => {\n if (!adapter.signTransaction) return undefined;\n const TxClass = walletConfig?.Transaction;\n if (!TxClass) return undefined;\n return async (txBase64: string) => {\n const bytes = Uint8Array.from(atob(txBase64), (c) => c.charCodeAt(0));\n const tx = TxClass.from(bytes);\n const signedTx = await adapter.signTransaction(tx);\n return btoa(String.fromCharCode(...new Uint8Array(signedTx.serialize())));\n };\n }, [walletConfig?.Transaction]);\n\n // Single handler: connect via React wallet adapter context → then sign\n const handleConnect = async (w: (typeof wallet.wallets)[0]) => {\n if (w.readyState !== 'Installed') {\n if (mobile) {\n const mw = MOBILE_WALLETS.find((m) => m.name === w.adapter.name);\n if (mw) {\n window.location.href = mw.buildUrl(window.location.href);\n return;\n }\n }\n const url = (w.adapter as any).url;\n if (url) window.open(url, '_blank');\n return;\n }\n\n setError('');\n setLoading(true);\n\n try {\n // Step 1: Select + connect via the React context so the wallet state\n // is available everywhere in the app (not just on the raw adapter)\n wallet.select(w.adapter.name);\n await wallet.connect();\n\n // Step 2: Get publicKey — prefer adapter (sync after connect), fallback to context\n const pk = w.adapter.publicKey ?? wallet.publicKey;\n if (!pk) throw new Error('Wallet did not provide a public key.');\n\n // Step 3: Sign the challenge\n const address: string = pk.toBase58();\n const useCold = coldWalletRef.current;\n const adapterSignMessage = wallet.signMessage\n ? (msg: Uint8Array) => wallet.signMessage!(msg)\n : undefined;\n\n await loginWithWallet(\n address,\n useCold ? undefined : adapterSignMessage,\n 'solana',\n useCold ? buildSignTxFnForAdapter(w.adapter) : undefined,\n );\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Could not verify your wallet. Please try again.');\n setLoading(false);\n }\n };\n\n const handleMobileOpen = (mw: MobileWallet) => {\n window.location.href = mw.buildUrl(window.location.href);\n };\n\n const preferred = walletConfig?.preferredWallets ?? [];\n const onlyPreferred = walletConfig?.onlyPreferred ?? false;\n const preferredSet = new Set(preferred);\n\n const connectedWalletName = wallet.publicKey\n ? wallet.wallets.find((w) => w.adapter.connected)?.adapter.name ?? null\n : null;\n\n const { preferredWallets, otherWallets } = useMemo(() => {\n const all = wallet.wallets;\n\n const prefList = preferred\n .map((name) => all.find((w) => w.adapter.name === name))\n .filter(Boolean) as typeof all;\n\n if (onlyPreferred && preferred.length > 0) {\n return { preferredWallets: prefList, otherWallets: [] as typeof all };\n }\n\n const others = all.filter(\n (w) => !preferredSet.has(w.adapter.name) && w.readyState === 'Installed',\n );\n\n return { preferredWallets: prefList, otherWallets: others };\n }, [wallet.wallets, walletConfig]);\n\n // On mobile, find wallets from MOBILE_WALLETS that aren't already in the adapter list\n const mobileExtraWallets = useMemo(() => {\n if (!mobile) return [];\n const adapterNames = new Set(wallet.wallets.map((w) => w.adapter.name));\n return MOBILE_WALLETS.filter((mw) => !adapterNames.has(mw.name));\n }, [mobile, wallet.wallets]);\n\n return (\n <div className=\"fc-tab\">\n {loading ? (\n <div style={{ textAlign: 'center', padding: '24px 0' }}>\n <p className=\"fc-tab-title\">Connecting...</p>\n <p className=\"fc-text\">\n {coldWallet\n ? 'Confirm the transaction on your device'\n : 'Approve the connection, then sign the verification request in your wallet'}\n </p>\n {error && (\n <>\n <p className=\"fc-error\">{error}</p>\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-secondary\"\n onClick={() => { setLoading(false); setError(''); }}\n style={{ marginTop: 8 }}\n >\n Try again\n </button>\n </>\n )}\n </div>\n ) : (\n <>\n <div className=\"fc-wallet-list\">\n {preferredWallets.map((w) => {\n const installed = w.readyState === 'Installed';\n const isConnected = w.adapter.name === connectedWalletName;\n return (\n <button\n key={w.adapter.name}\n type=\"button\"\n className=\"fc-btn fc-btn-wallet\"\n onClick={() => handleConnect(w)}\n >\n <span className={installed ? 'fc-installed-dot' : ''} style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={w.adapter.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{w.adapter.name}</span>\n {isConnected\n ? <span className=\"fc-badge-preferred\">Last used</span>\n : <span className=\"fc-badge-preferred\">Preferred</span>\n }\n {!installed && mobile && MOBILE_WALLETS.some((mw) => mw.name === w.adapter.name)\n ? <span className=\"fc-badge-install\">Open app</span>\n : !installed && <span className=\"fc-badge-install\">Install</span>\n }\n </button>\n );\n })}\n\n {/* Mobile deep link wallets not already in the adapter list */}\n {mobileExtraWallets.map((mw) => (\n <button\n key={mw.name}\n type=\"button\"\n className=\"fc-btn fc-btn-wallet\"\n onClick={() => handleMobileOpen(mw)}\n >\n <span style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={mw.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{mw.name}</span>\n <span className=\"fc-badge-install\">Open app</span>\n </button>\n ))}\n\n {otherWallets.length > 0 && !showOther && (\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-wallet\"\n onClick={() => setShowOther(true)}\n >\n <span className=\"fc-other-wallets-icon\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <rect x=\"2\" y=\"3\" width=\"16\" height=\"14\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2 7h16\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <rect x=\"11\" y=\"10\" width=\"7\" height=\"4\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n </span>\n <span className=\"fc-wallet-name\">Other wallets</span>\n </button>\n )}\n\n {showOther && otherWallets.map((w) => {\n const isConnected = w.adapter.name === connectedWalletName;\n return (\n <button\n key={w.adapter.name}\n type=\"button\"\n className=\"fc-btn fc-btn-wallet\"\n onClick={() => handleConnect(w)}\n >\n <span className=\"fc-installed-dot\" style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={w.adapter.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{w.adapter.name}</span>\n {isConnected && <span className=\"fc-badge-preferred\">Last used</span>}\n </button>\n );\n })}\n </div>\n\n {preferredWallets.length === 0 && otherWallets.length === 0 && mobileExtraWallets.length === 0 && (\n <p className=\"fc-text\">No wallet found. Please install a Solana wallet (like Phantom) to continue.</p>\n )}\n\n {walletConfig?.Transaction && (\n <label className=\"fc-cold-wallet-toggle\">\n <input\n type=\"checkbox\"\n checked={coldWallet}\n onChange={(e) => setColdWallet(e.target.checked)}\n />\n <span className=\"fc-toggle-track\" />\n <span className=\"fc-cold-wallet-label\">\n <span>Hardware wallet</span>\n <span>Ledger, Trezor, Keystone...</span>\n </span>\n </label>\n )}\n\n {error && <p className=\"fc-error\">{error}</p>}\n </>\n )}\n {showBack && !loading && (\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('method-select')}>\n Back\n </button>\n </p>\n )}\n </div>\n );\n}\n","import { useState, type FormEvent } from 'react';\nimport { useForgeConnect } from '../../hooks/use-forge-connect.js';\n\ntype Step = 'email' | 'reset' | 'done';\n\nexport function ForgotPasswordForm() {\n const { forgotPassword, resetPassword, setModalStep } = useForgeConnect();\n const [step, setStep] = useState<Step>('email');\n const [email, setEmail] = useState('');\n const [token, setToken] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n const handleSendCode = async (e: FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n await forgotPassword(email);\n setStep('reset');\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Could not send the reset code. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n const handleReset = async (e: FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n await resetPassword(token.trim(), password);\n setStep('done');\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Could not reset your password. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n if (step === 'done') {\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Password updated</h3>\n <p className=\"fc-text\">Your password has been reset. You can now sign in.</p>\n <button type=\"button\" className=\"fc-btn fc-btn-primary\" onClick={() => setModalStep('email-login')}>\n Sign in\n </button>\n </div>\n );\n }\n\n if (step === 'reset') {\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Set new password</h3>\n <p className=\"fc-text\">We sent a reset code to <strong>{email}</strong>. Paste it below with your new password.</p>\n <form onSubmit={handleReset} className=\"fc-form\">\n <label className=\"fc-label\">\n Reset code\n <input\n type=\"text\"\n className=\"fc-input\"\n value={token}\n onChange={(e) => setToken(e.target.value)}\n placeholder=\"Paste the code from your email\"\n required\n autoComplete=\"off\"\n />\n </label>\n <label className=\"fc-label\">\n New password\n <input\n type=\"password\"\n className=\"fc-input\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"8+ characters\"\n required\n autoComplete=\"new-password\"\n minLength={8}\n />\n </label>\n {error && <p className=\"fc-error\">{error}</p>}\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Resetting...' : 'Reset password'}\n </button>\n </form>\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setStep('email')}>\n Resend code\n </button>\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Reset your password</h3>\n <p className=\"fc-text\">Enter your email and we'll send you a reset code.</p>\n <form onSubmit={handleSendCode} className=\"fc-form\">\n <label className=\"fc-label\">\n Email\n <input\n type=\"email\"\n className=\"fc-input\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n autoComplete=\"email\"\n />\n </label>\n {error && <p className=\"fc-error\">{error}</p>}\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Sending...' : 'Send reset code'}\n </button>\n </form>\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('email-login')}>\n Back to sign in\n </button>\n </p>\n </div>\n );\n}\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { useForgeConnect } from '../../hooks/use-forge-connect.js';\n\nexport function Verify2FAForm() {\n const { verify2FA, verifyRecoveryCode, setModalStep } = useForgeConnect();\n const [code, setCode] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [useRecovery, setUseRecovery] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const submittingRef = useRef(false);\n\n useEffect(() => {\n inputRef.current?.focus();\n }, [useRecovery]);\n\n const submitCode = useCallback(async (codeValue: string, isRecovery: boolean) => {\n if (submittingRef.current || !codeValue.trim()) return;\n submittingRef.current = true;\n setLoading(true);\n setError('');\n try {\n if (isRecovery) {\n await verifyRecoveryCode(codeValue.trim());\n } else {\n await verify2FA(codeValue.trim());\n }\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Verification failed. Please try again.');\n } finally {\n setLoading(false);\n submittingRef.current = false;\n }\n }, [verify2FA, verifyRecoveryCode]);\n\n const handleSubmit = async (e?: React.FormEvent) => {\n e?.preventDefault();\n await submitCode(code, useRecovery);\n };\n\n const handleCodeChange = (value: string) => {\n setCode(value);\n // Auto-submit when 6 digits entered (TOTP mode only)\n if (!useRecovery && value.length === 6 && /^\\d{6}$/.test(value)) {\n submitCode(value, false);\n }\n };\n\n return (\n <div className=\"fc-tab\">\n <button type=\"button\" className=\"fc-back\" onClick={() => setModalStep('method-select')}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M10 12L6 8l4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n Back\n </button>\n\n <p className=\"fc-account-section-desc\" style={{ marginTop: 8 }}>\n {useRecovery\n ? 'Enter one of your recovery codes.'\n : 'Enter the 6-digit code from your authenticator app.'\n }\n </p>\n\n {error && <p className=\"fc-error\">{error}</p>}\n\n <form onSubmit={handleSubmit} className=\"fc-form\">\n <input\n ref={inputRef}\n className=\"fc-input fc-input-code\"\n type=\"text\"\n inputMode={useRecovery ? 'text' : 'numeric'}\n autoComplete=\"one-time-code\"\n placeholder={useRecovery ? 'Recovery code' : '000000'}\n maxLength={useRecovery ? 20 : 6}\n value={code}\n onChange={(e) => handleCodeChange(e.target.value)}\n style={useRecovery ? {} : { textAlign: 'center', letterSpacing: '0.3em', fontSize: '1.25rem' }}\n />\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading || !code.trim()}>\n {loading ? 'Verifying...' : 'Verify'}\n </button>\n </form>\n\n <button\n type=\"button\"\n className=\"fc-link\"\n onClick={() => { setUseRecovery(!useRecovery); setCode(''); setError(''); }}\n style={{ marginTop: 12 }}\n >\n {useRecovery ? 'Use authenticator code instead' : 'Use a recovery code'}\n </button>\n </div>\n );\n}\n","import { useRef, useEffect } from 'react';\n\n/**\n * Safely renders an SVG string by parsing it through the browser's DOMParser\n * and stripping any non-SVG elements (scripts, event handlers, etc.).\n *\n * This replaces dangerouslySetInnerHTML for icon rendering.\n */\nexport function SvgIcon({ svg, className }: { svg: string; className?: string }) {\n const ref = useRef<HTMLSpanElement>(null);\n\n useEffect(() => {\n if (!ref.current || !svg) return;\n\n try {\n // Parse as HTML so the browser's HTML parser assigns the correct SVG namespace.\n // Using 'image/svg+xml' can leave elements in the null namespace when xmlns is missing.\n const doc = new DOMParser().parseFromString(svg, 'text/html');\n const svgEl = doc.body.querySelector('svg');\n\n if (!svgEl) {\n ref.current.textContent = '';\n return;\n }\n\n // Strip any dangerous elements or attributes\n const dangerous = svgEl.querySelectorAll('script,iframe,object,embed,foreignObject');\n dangerous.forEach((el) => el.remove());\n\n // Remove event handler attributes from all elements\n const all = svgEl.querySelectorAll('*');\n all.forEach((el) => {\n for (const attr of Array.from(el.attributes)) {\n if (attr.name.startsWith('on')) {\n el.removeAttribute(attr.name);\n }\n }\n });\n\n ref.current.textContent = '';\n ref.current.appendChild(svgEl);\n } catch {\n ref.current.textContent = '';\n }\n }, [svg]);\n\n return <span ref={ref} className={className} />;\n}\n","import { useForgeConnect } from '../../hooks/use-forge-connect.js';\nimport type { OAuthProvider } from '../../types.js';\nimport { resolveLoginMethods, isOAuthMethod } from '../../resolve-config.js';\nimport { SvgIcon } from '../svg-icon.js';\n\nexport const PROVIDER_INFO: Record<OAuthProvider, { label: string; icon: string }> = {\n google: {\n label: 'Google',\n icon: '<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\" fill=\"#4285F4\"/><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\"/><path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" fill=\"#FBBC05\"/><path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\"/></svg>',\n },\n discord: {\n label: 'Discord',\n icon: '<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path d=\"M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128c.126-.094.252-.192.372-.292a.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03z\" fill=\"#5865F2\"/></svg>',\n },\n twitter: {\n label: 'Twitter',\n icon: '<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" fill=\"currentColor\"/></svg>',\n },\n apple: {\n label: 'Apple',\n icon: '<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path d=\"M17.05 20.28c-.98.95-2.05.88-3.08.4-1.09-.5-2.08-.52-3.23 0-1.44.64-2.2.45-3.06-.4C3.79 16.17 4.36 9.02 8.8 8.78c1.27.06 2.15.72 2.91.76.93-.19 1.82-.88 2.83-.8 1.21.1 2.12.58 2.72 1.49-2.46 1.48-1.88 4.73.52 5.64-.42 1.13-.98 2.24-1.73 3.41zM12.03 8.7c-.12-2.35 1.82-4.38 4.04-4.54.29 2.56-2.34 4.68-4.04 4.54z\" fill=\"currentColor\"/></svg>',\n },\n telegram: {\n label: 'Telegram',\n icon: '<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path d=\"M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.479.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z\" fill=\"#2AABEE\"/></svg>',\n },\n};\n\n/** Single OAuth provider button (card-style). */\nexport function OAuthButton({ provider }: { provider: OAuthProvider }) {\n const { loginWithOAuth } = useForgeConnect();\n const info = PROVIDER_INFO[provider];\n\n return (\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-oauth\"\n onClick={() => loginWithOAuth(provider)}\n >\n <SvgIcon svg={info.icon} className=\"fc-oauth-icon\" />\n <span className=\"fc-btn-name\">{info.label}</span>\n </button>\n );\n}\n\n/** Renders all OAuth providers from the resolved config. Legacy convenience wrapper. */\nexport function OAuthButtons() {\n const { config } = useForgeConnect();\n const methods = resolveLoginMethods(config);\n const oauthMethods = methods.filter(isOAuthMethod);\n\n if (oauthMethods.length === 0) return null;\n\n return (\n <div className=\"fc-oauth-buttons\">\n {oauthMethods.map((provider) => (\n <OAuthButton key={provider} provider={provider} />\n ))}\n </div>\n );\n}\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { useUser } from '../hooks/use-user.js';\nimport { useWallets } from '../hooks/use-wallets.js';\nimport { useSessions } from '../hooks/use-sessions.js';\nimport { ModalOverlay } from './modal-overlay.js';\nimport { TwoFactorModal } from './two-factor-modal.js';\nimport { PasskeysModal } from './passkeys-modal.js';\nimport { PasswordModal } from './password-modal.js';\nimport { DeleteAccountModal } from './delete-account-modal.js';\nimport { PROVIDER_INFO } from './tabs/oauth-buttons.js';\nimport { SvgIcon } from './svg-icon.js';\nimport { timeAgo } from '../lib/utils.js';\nimport type { AccountModalTab, OAuthProvider } from '../types.js';\n\n// ── Friendly provider display ──\n\nconst METHOD_DISPLAY: Record<string, { label: string; iconHtml?: string }> = {\n email: {\n label: 'Email',\n iconHtml: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\"><rect x=\"2\" y=\"4\" width=\"16\" height=\"12\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M2 6l8 5 8-5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>',\n },\n solana_wallet: {\n label: 'Solana Wallet',\n iconHtml: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\"><rect x=\"2\" y=\"5\" width=\"16\" height=\"11\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.5\"/><rect x=\"13\" y=\"9\" width=\"5\" height=\"3\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.5\"/></svg>',\n },\n ethereum_wallet: {\n label: 'Ethereum Wallet',\n iconHtml: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\"><rect x=\"2\" y=\"5\" width=\"16\" height=\"11\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.5\"/><rect x=\"13\" y=\"9\" width=\"5\" height=\"3\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.5\"/></svg>',\n },\n};\n\nfunction getMethodDisplay(provider: string) {\n // Check OAuth providers first\n if (provider in PROVIDER_INFO) {\n const info = PROVIDER_INFO[provider as OAuthProvider];\n return { label: info.label, iconHtml: info.icon };\n }\n return METHOD_DISPLAY[provider] ?? { label: provider, iconHtml: undefined };\n}\n\nfunction truncate(str: string, max = 12) {\n if (str.length <= max) return str;\n return `${str.slice(0, 6)}...${str.slice(-4)}`;\n}\n\nconst ChevronRight = () => (\n <span className=\"fc-security-card-chevron\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M6 4l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n);\n\n// ── Tab config ──\n\nconst TABS: { key: AccountModalTab; label: string }[] = [\n { key: 'profile', label: 'Profile' },\n { key: 'auth-methods', label: 'Logins' },\n { key: 'wallets', label: 'Wallets' },\n { key: 'sessions', label: 'Security' },\n];\n\n// ── Main ──\n\nexport function AccountModal() {\n const { accountModal, closeAccountModal, openLinkModal, linkModal, config, logout } = useForgeConnect();\n const { user } = useUser();\n const [activeTab, setActiveTab] = useState<AccountModalTab>('profile');\n\n // Track when LinkAuthModal closes → bump key so tabs re-fetch\n const [refreshKey, setRefreshKey] = useState(0);\n const prevLinkOpen = useRef(false);\n useEffect(() => {\n if (prevLinkOpen.current && !linkModal.isOpen) {\n setRefreshKey((k) => k + 1);\n }\n prevLinkOpen.current = linkModal.isOpen;\n }, [linkModal.isOpen]);\n\n if (!accountModal.isOpen) return null;\n\n const theme = config.appearance?.theme ?? 'light';\n const initial = (user?.displayName ?? user?.primaryEmail ?? '?').charAt(0).toUpperCase();\n\n return (\n <ModalOverlay isOpen={accountModal.isOpen} onClose={closeAccountModal}>\n <div\n className=\"fc-modal-content\"\n style={{ '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6' } as React.CSSProperties}\n data-theme={theme}\n >\n {/* ── Hero ── */}\n <div className=\"fc-account-hero\">\n {user?.avatarUrl ? (\n <img src={user.avatarUrl} alt=\"\" className=\"fc-account-hero-avatar\" />\n ) : (\n <span className=\"fc-account-hero-avatar fc-account-hero-avatar-placeholder\">{initial}</span>\n )}\n <div className=\"fc-account-hero-info\">\n <span className=\"fc-account-hero-name\">{user?.displayName ?? 'Your account'}</span>\n {user?.primaryEmail && <span className=\"fc-account-hero-email\">{user.primaryEmail}</span>}\n </div>\n </div>\n\n {/* ── Tabs ── */}\n <div className=\"fc-account-tabs\">\n {TABS.map((tab) => (\n <button\n key={tab.key}\n type=\"button\"\n className={`fc-account-tab${activeTab === tab.key ? ' fc-account-tab-active' : ''}`}\n onClick={() => setActiveTab(tab.key)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* ── Content ── */}\n {activeTab === 'profile' && <ProfileTab />}\n {activeTab === 'auth-methods' && <LoginsTab onLink={() => openLinkModal('auth')} refreshKey={refreshKey} />}\n {activeTab === 'wallets' && <WalletsTab onLink={() => openLinkModal('wallet')} refreshKey={refreshKey} />}\n {activeTab === 'sessions' && <SecurityTab />}\n\n {/* ── Footer ── */}\n <div className=\"fc-account-footer\">\n <button\n type=\"button\"\n className=\"fc-btn-logout\"\n onClick={() => { logout(); closeAccountModal(); }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M7 17H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3M13 14l4-4-4-4M17 10H7\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n Log out\n </button>\n </div>\n </div>\n </ModalOverlay>\n );\n}\n\n// ── Profile Tab ──\n\nfunction ProfileTab() {\n const { user, updateProfile } = useUser();\n const [displayName, setDisplayName] = useState(user?.displayName ?? '');\n const [avatarUrl, setAvatarUrl] = useState(user?.avatarUrl ?? '');\n const [loading, setLoading] = useState(false);\n const [msg, setMsg] = useState<{ text: string; ok: boolean } | null>(null);\n\n useEffect(() => {\n setDisplayName(user?.displayName ?? '');\n setAvatarUrl(user?.avatarUrl ?? '');\n }, [user]);\n\n const handleSave = async () => {\n setLoading(true);\n setMsg(null);\n try {\n await updateProfile({\n displayName: displayName || undefined,\n avatarUrl: avatarUrl || undefined,\n });\n setMsg({ text: 'Profile updated', ok: true });\n } catch (err: unknown) {\n setMsg({ text: err instanceof Error ? err.message : 'Something went wrong. Please try again.', ok: false });\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <div className=\"fc-tab\">\n <div className=\"fc-form\">\n <label className=\"fc-label\">\n Name\n <input\n className=\"fc-input\"\n value={displayName}\n onChange={(e) => setDisplayName(e.target.value)}\n placeholder=\"How should we call you?\"\n />\n </label>\n <label className=\"fc-label\">\n Photo URL\n <input\n className=\"fc-input\"\n value={avatarUrl}\n onChange={(e) => setAvatarUrl(e.target.value)}\n placeholder=\"Paste a link to your photo\"\n />\n </label>\n <button type=\"button\" className=\"fc-btn fc-btn-primary\" onClick={handleSave} disabled={loading}>\n {loading ? 'Saving...' : 'Save changes'}\n </button>\n {msg && <p className={msg.ok ? 'fc-text' : 'fc-error'}>{msg.text}</p>}\n </div>\n </div>\n );\n}\n\n// ── Logins Tab ──\n\nfunction LoginsTab({ onLink, refreshKey }: { onLink: () => void; refreshKey: number }) {\n const { authMethods, loading, fetchAuthMethods, unlinkAuthMethod } = useUser();\n const [msg, setMsg] = useState('');\n\n useEffect(() => {\n fetchAuthMethods().catch(() => {});\n }, [fetchAuthMethods, refreshKey]);\n\n const handleRemove = async (id: string) => {\n setMsg('');\n try {\n await unlinkAuthMethod(id);\n } catch (err: unknown) {\n setMsg(err instanceof Error ? err.message : 'Could not remove this sign-in method. Please try again.');\n }\n };\n\n return (\n <div className=\"fc-tab\">\n {msg && <p className=\"fc-error\">{msg}</p>}\n {loading && <p className=\"fc-text\">Loading...</p>}\n <p className=\"fc-account-section-desc\">Ways you can sign in to your account.</p>\n {authMethods?.map((m) => {\n const display = getMethodDisplay(m.provider);\n const detail = m.provider === 'email'\n ? m.providerId\n : m.provider.endsWith('_wallet')\n ? truncate(m.providerId)\n : m.providerId;\n return (\n <div key={m.id} className=\"fc-account-item\">\n {display.iconHtml && (\n <SvgIcon svg={display.iconHtml} className=\"fc-account-item-icon\" />\n )}\n <div className=\"fc-account-item-info\">\n <span className=\"fc-account-item-label\">{display.label}</span>\n <span className=\"fc-account-item-detail\">{detail}</span>\n </div>\n <div className=\"fc-account-item-actions\">\n {m.isVerified && <span className=\"fc-badge-verified\">Verified</span>}\n <button type=\"button\" className=\"fc-btn-danger-sm\" onClick={() => handleRemove(m.id)}>\n Remove\n </button>\n </div>\n </div>\n );\n })}\n {authMethods?.length === 0 && <p className=\"fc-account-empty\">No login methods yet</p>}\n <button type=\"button\" className=\"fc-btn fc-btn-secondary\" onClick={onLink} style={{ marginTop: 8 }}>\n + Add login method\n </button>\n </div>\n );\n}\n\n// ── Wallets Tab ──\n\nfunction WalletsTab({ onLink, refreshKey }: { onLink: () => void; refreshKey: number }) {\n const { wallets, loading, fetchWallets, updateWallet } = useWallets();\n const [msg, setMsg] = useState('');\n\n useEffect(() => {\n fetchWallets().catch(() => {});\n }, [fetchWallets, refreshKey]);\n\n const handleSetPrimary = async (id: string) => {\n setMsg('');\n try {\n await updateWallet(id, { isPrimary: true });\n } catch (err: unknown) {\n setMsg(err instanceof Error ? err.message : 'Could not update this wallet. Please try again.');\n }\n };\n\n return (\n <div className=\"fc-tab\">\n {msg && <p className=\"fc-error\">{msg}</p>}\n {loading && <p className=\"fc-text\">Loading...</p>}\n <p className=\"fc-account-section-desc\">Crypto wallets connected to your account.</p>\n {wallets?.map((w) => (\n <div key={w.id} className=\"fc-account-item\">\n <SvgIcon svg={METHOD_DISPLAY[`${w.chain}_wallet`]?.iconHtml ?? ''} className=\"fc-account-item-icon\" />\n <div className=\"fc-account-item-info\">\n <span className=\"fc-account-item-label\">\n {w.chain.charAt(0).toUpperCase() + w.chain.slice(1)}\n {w.isPrimary && <span className=\"fc-badge-primary\" style={{ marginLeft: 6 }}>Primary</span>}\n </span>\n <span className=\"fc-account-item-detail\">{truncate(w.address)}</span>\n </div>\n <div className=\"fc-account-item-actions\">\n {!w.isPrimary && (\n <button type=\"button\" className=\"fc-btn-primary-sm\" onClick={() => handleSetPrimary(w.id)}>\n Make primary\n </button>\n )}\n </div>\n </div>\n ))}\n {wallets?.length === 0 && <p className=\"fc-account-empty\">No wallets connected</p>}\n <button type=\"button\" className=\"fc-btn fc-btn-secondary\" onClick={onLink} style={{ marginTop: 8 }}>\n + Connect wallet\n </button>\n </div>\n );\n}\n\n// ── Security Tab ──\n\nfunction SecurityTab() {\n const { sessions, loading, fetchSessions, revokeSession } = useSessions();\n const { logoutAll, logout, closeAccountModal, api, getAccessToken } = useForgeConnect();\n const { user, authMethods: userAuthMethods, fetchAuthMethods } = useUser();\n const [msg, setMsg] = useState('');\n\n // Card status\n const [totpEnabled, setTotpEnabled] = useState<boolean | null>(null);\n const [passkeyCount, setPasskeyCount] = useState(0);\n\n // Sub-modal visibility\n const [show2FAModal, setShow2FAModal] = useState(false);\n const [showPasskeyModal, setShowPasskeyModal] = useState(false);\n const [showPasswordModal, setShowPasswordModal] = useState(false);\n const [showDeleteModal, setShowDeleteModal] = useState(false);\n\n const refreshStatus = useCallback(() => {\n const token = getAccessToken();\n if (!token) return;\n api.get2FAStatus(token).then((r) => setTotpEnabled(r.enabled)).catch(() => {});\n }, [api, getAccessToken]);\n\n const refreshPasskeyCount = useCallback(() => {\n const token = getAccessToken();\n if (!token) return;\n api.getPasskeys(token).then((list) => setPasskeyCount(list.length)).catch(() => {});\n }, [api, getAccessToken]);\n\n useEffect(() => {\n fetchSessions().catch(() => {});\n fetchAuthMethods().catch(() => {});\n refreshStatus();\n refreshPasskeyCount();\n }, [fetchSessions, fetchAuthMethods, refreshStatus, refreshPasskeyCount]);\n\n const hasPassword = userAuthMethods?.some((m) => m.provider === 'email');\n\n const handleRevoke = async (id: string) => {\n setMsg('');\n try {\n await revokeSession(id);\n } catch (err: unknown) {\n setMsg(err instanceof Error ? err.message : 'Could not sign out this session. Please try again.');\n }\n };\n\n return (\n <div className=\"fc-tab\">\n {msg && <p className=\"fc-error\">{msg}</p>}\n\n {/* ── 2FA Card ── */}\n <button type=\"button\" className=\"fc-security-card\" onClick={() => setShow2FAModal(true)}>\n <span className=\"fc-security-card-icon\">\n <svg viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M10 2l6 3v4c0 4.42-2.56 8.22-6 9.5C6.56 17.22 4 13.42 4 9V5l6-3z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M7.5 10.5l2 2 3.5-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n <span className=\"fc-security-card-info\">\n <span className=\"fc-security-card-label\">Two-factor authentication</span>\n <span className=\"fc-security-card-detail\">\n {totpEnabled === null ? 'Loading...' : totpEnabled ? 'Enabled' : 'Not enabled'}\n </span>\n </span>\n <ChevronRight />\n </button>\n\n {/* ── Passkeys Card ── */}\n <button type=\"button\" className=\"fc-security-card\" onClick={() => setShowPasskeyModal(true)}>\n <span className=\"fc-security-card-icon\">\n <svg viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"8\" cy=\"7\" r=\"3\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M13 13.5a5 5 0 0 0-10 0\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M15 10v4m0 0l-1.5-1m1.5 1l1.5-1\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n <span className=\"fc-security-card-info\">\n <span className=\"fc-security-card-label\">Passkeys</span>\n <span className=\"fc-security-card-detail\">\n {passkeyCount === 0 ? 'No passkeys' : `${passkeyCount} passkey${passkeyCount !== 1 ? 's' : ''}`}\n </span>\n </span>\n <ChevronRight />\n </button>\n\n {/* ── Password Card ── */}\n {user?.primaryEmail && (\n <button\n type=\"button\"\n className=\"fc-security-card\"\n onClick={() => setShowPasswordModal(true)}\n >\n <span className=\"fc-security-card-icon\">\n <svg viewBox=\"0 0 20 20\" fill=\"none\">\n <rect x=\"3\" y=\"9\" width=\"14\" height=\"8\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M6 9V6a4 4 0 1 1 8 0v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </span>\n <span className=\"fc-security-card-info\">\n <span className=\"fc-security-card-label\">Password</span>\n <span className=\"fc-security-card-detail\">\n {hasPassword ? 'Change your password' : 'Set a password'}\n </span>\n </span>\n <ChevronRight />\n </button>\n )}\n\n {/* ── Sessions ── */}\n <div className=\"fc-divider\" style={{ margin: '16px 0' }}><span>active sessions</span></div>\n {loading && <p className=\"fc-text\">Loading...</p>}\n {sessions?.map((s) => (\n <div key={s.id} className=\"fc-account-item\">\n <span className=\"fc-account-item-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <rect x=\"2\" y=\"3\" width=\"16\" height=\"11\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <path d=\"M7 17h6M10 14v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n </svg>\n </span>\n <div className=\"fc-account-item-info\">\n <span className=\"fc-account-item-label\">\n {s.ipAddress === '127.0.0.1' || s.ipAddress === '::1'\n ? 'This device'\n : truncate(s.ipAddress, 20)}\n </span>\n <span className=\"fc-account-item-detail\">\n Active {timeAgo(s.lastActiveAt)} · Expires {new Date(s.expiresAt).toLocaleDateString()}\n </span>\n </div>\n <div className=\"fc-account-item-actions\">\n <button type=\"button\" className=\"fc-btn-danger-sm\" onClick={() => handleRevoke(s.id)}>\n Sign out\n </button>\n </div>\n </div>\n ))}\n {sessions?.length === 0 && <p className=\"fc-account-empty\">No active sessions</p>}\n {sessions && sessions.length > 1 && (\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-secondary\"\n onClick={() => { logoutAll(); }}\n style={{ marginTop: 8 }}\n >\n Sign out of all devices\n </button>\n )}\n\n {/* ── Danger zone ── */}\n <div className=\"fc-divider\" style={{ margin: '16px 0' }}><span>danger zone</span></div>\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-secondary\"\n onClick={() => setShowDeleteModal(true)}\n style={{ background: 'rgba(220, 38, 38, 0.1)', color: '#dc2626', borderColor: 'rgba(220, 38, 38, 0.2)' }}\n >\n Delete account\n </button>\n\n {/* ── Sub-modals ── */}\n <TwoFactorModal\n isOpen={show2FAModal}\n onClose={() => { setShow2FAModal(false); refreshStatus(); }}\n initialEnabled={totpEnabled ?? false}\n onStatusChange={(e) => setTotpEnabled(e)}\n />\n <PasskeysModal\n isOpen={showPasskeyModal}\n onClose={() => { setShowPasskeyModal(false); refreshPasskeyCount(); }}\n onCountChange={(count) => setPasskeyCount(count)}\n />\n {user?.primaryEmail && (\n <PasswordModal\n isOpen={showPasswordModal}\n onClose={() => { setShowPasswordModal(false); fetchAuthMethods().catch(() => {}); }}\n hasPassword={hasPassword ?? false}\n />\n )}\n <DeleteAccountModal\n isOpen={showDeleteModal}\n onClose={() => setShowDeleteModal(false)}\n onDeleted={() => { logout(); closeAccountModal(); }}\n />\n </div>\n );\n}\n","import { useState, useCallback, useEffect, useRef } from 'react';\nimport { useForgeConnect } from './use-forge-connect';\nimport type { AuthMethod } from '../types';\n\nexport function useUser() {\n const { auth, api, config, getAccessToken } = useForgeConnect();\n const [authMethods, setAuthMethods] = useState<AuthMethod[] | null>(null);\n const [loading, setLoading] = useState(false);\n const pendingRefreshRef = useRef(false);\n\n const updateProfile = useCallback(\n async (data: { displayName?: string; avatarUrl?: string }) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n return api.updateMe(token, data);\n },\n [api, getAccessToken],\n );\n\n const fetchAuthMethods = useCallback(async () => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const methods = await api.getAuthMethods(token);\n setAuthMethods(methods as AuthMethod[]);\n return methods;\n } finally {\n setLoading(false);\n }\n }, [api, getAccessToken]);\n\n const linkAuthMethod = useCallback(\n async (data: { provider: string; email?: string; password?: string; challengeId?: string; signature?: string; walletAddress?: string }) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.linkAuthMethod(token, data);\n await fetchAuthMethods();\n },\n [api, getAccessToken, fetchAuthMethods],\n );\n\n const linkOtpSend = useCallback(\n async (email: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.linkOtpSend(token, email);\n },\n [api, getAccessToken],\n );\n\n const linkOtpVerify = useCallback(\n async (email: string, code: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.linkOtpVerify(token, email, code);\n await fetchAuthMethods();\n },\n [api, getAccessToken, fetchAuthMethods],\n );\n\n const unlinkAuthMethod = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.unlinkAuthMethod(token, id);\n await fetchAuthMethods();\n },\n [api, getAccessToken, fetchAuthMethods],\n );\n\n // ── OAuth linking via popup ──\n\n const linkOAuth = useCallback(\n async (provider: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n\n // Create a short-lived link intent token (avoids exposing JWT in URL)\n const { intentToken } = await api.createLinkIntent(token);\n\n const redirectUri = encodeURIComponent(window.location.origin + '/fc-oauth-callback');\n const url = `${config.apiUrl}/auth/oauth/${provider}/link?intent=${encodeURIComponent(intentToken)}&redirect_uri=${redirectUri}`;\n const width = 500;\n const height = 600;\n const left = window.screenX + (window.innerWidth - width) / 2;\n const top = window.screenY + (window.innerHeight - height) / 2;\n window.open(url, 'fc_oauth_link', `width=${width},height=${height},left=${left},top=${top}`);\n pendingRefreshRef.current = true;\n },\n [api, config.apiUrl, getAccessToken],\n );\n\n // Listen for OAuth link callback\n useEffect(() => {\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== window.location.origin) return;\n if (event.data?.type === 'fc_oauth_link_success' && pendingRefreshRef.current) {\n pendingRefreshRef.current = false;\n fetchAuthMethods().catch(() => {});\n }\n };\n\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [fetchAuthMethods]);\n\n return {\n user: auth.user,\n authMethods,\n loading,\n updateProfile,\n fetchAuthMethods,\n linkAuthMethod,\n linkOtpSend,\n linkOtpVerify,\n unlinkAuthMethod,\n linkOAuth,\n };\n}\n","import { useState, useCallback } from 'react';\nimport { useForgeConnect } from './use-forge-connect';\nimport { uint8ArrayToBase58 } from '../lib/utils.js';\nimport type { Wallet } from '../types';\n\nexport function useWallets() {\n const { api, getAccessToken } = useForgeConnect();\n const [wallets, setWallets] = useState<Wallet[] | null>(null);\n const [loading, setLoading] = useState(false);\n\n const fetchWallets = useCallback(async () => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.getWallets(token);\n setWallets(data as Wallet[]);\n return data;\n } finally {\n setLoading(false);\n }\n }, [api, getAccessToken]);\n\n const updateWallet = useCallback(\n async (id: string, data: { label?: string; isPrimary?: boolean }) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.updateWallet(token, id, data);\n await fetchWallets();\n },\n [api, getAccessToken, fetchWallets],\n );\n\n const linkWallet = useCallback(\n async (\n walletAddress: string,\n signMessage: ((message: Uint8Array) => Promise<Uint8Array>) | undefined,\n chain: string = 'solana',\n signTransaction?: (txBase64: string) => Promise<string>,\n ) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n\n if (signMessage) {\n // Standard message-signing flow (hot wallets)\n const { challengeId, message: challengeMessage } = await api.walletChallenge(walletAddress, chain);\n const encoded = new TextEncoder().encode(challengeMessage);\n const signatureBytes = await signMessage(encoded);\n const signature = chain === 'solana'\n ? uint8ArrayToBase58(signatureBytes)\n : Array.from(signatureBytes).map((b) => b.toString(16).padStart(2, '0')).join('');\n await api.linkAuthMethod(token, {\n provider: `${chain}_wallet`,\n challengeId,\n signature,\n walletAddress,\n });\n } else {\n // Transaction-based flow (hardware/cold wallets)\n if (!signTransaction) {\n throw new Error('Wallet does not support message signing or transaction signing.');\n }\n const { challengeId, transaction: txBase64 } = await api.walletChallengeTx(walletAddress, chain);\n const signedTxBase64 = await signTransaction(txBase64);\n await api.linkAuthMethod(token, {\n provider: `${chain}_wallet_tx`,\n challengeId,\n signedTransaction: signedTxBase64,\n walletAddress,\n });\n }\n\n await fetchWallets();\n },\n [api, getAccessToken, fetchWallets],\n );\n\n return {\n wallets,\n loading,\n fetchWallets,\n updateWallet,\n linkWallet,\n };\n}\n\n","const BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n\nexport function uint8ArrayToBase58(bytes: Uint8Array): string {\n const digits = [0];\n for (const byte of bytes) {\n let carry = byte;\n for (let j = 0; j < digits.length; j++) {\n carry += digits[j] << 8;\n digits[j] = carry % 58;\n carry = (carry / 58) | 0;\n }\n while (carry > 0) {\n digits.push(carry % 58);\n carry = (carry / 58) | 0;\n }\n }\n let str = '';\n for (let i = 0; i < bytes.length && bytes[i] === 0; i++) {\n str += '1';\n }\n for (let i = digits.length - 1; i >= 0; i--) {\n str += BASE58_ALPHABET[digits[i]];\n }\n return str;\n}\n\nexport function timeAgo(dateStr: string): string {\n const now = Date.now();\n const then = new Date(dateStr).getTime();\n const diff = now - then;\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n if (days < 30) return `${days}d ago`;\n return new Date(dateStr).toLocaleDateString();\n}\n","import { useState, useCallback } from 'react';\nimport { useForgeConnect } from './use-forge-connect';\nimport type { Session } from '../types';\n\nexport function useSessions() {\n const { api, getAccessToken } = useForgeConnect();\n const [sessions, setSessions] = useState<Session[] | null>(null);\n const [loading, setLoading] = useState(false);\n\n const fetchSessions = useCallback(async () => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.getSessions(token);\n setSessions(data as Session[]);\n return data;\n } finally {\n setLoading(false);\n }\n }, [api, getAccessToken]);\n\n const revokeSession = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.revokeSession(token, id);\n await fetchSessions();\n },\n [api, getAccessToken, fetchSessions],\n );\n\n return {\n sessions,\n loading,\n fetchSessions,\n revokeSession,\n };\n}\n","import { useState, useEffect } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { ModalOverlay } from './modal-overlay.js';\n\ninterface TwoFactorModalProps {\n isOpen: boolean;\n onClose: () => void;\n initialEnabled: boolean;\n onStatusChange: (enabled: boolean) => void;\n}\n\ntype Step = 'setup' | 'manage' | 'confirm-regenerate' | 'confirm-disable' | 'recovery-codes';\n\nexport function TwoFactorModal({ isOpen, onClose, initialEnabled, onStatusChange }: TwoFactorModalProps) {\n const { api, getAccessToken, config } = useForgeConnect();\n const theme = config.appearance?.theme ?? 'light';\n\n const [step, setStep] = useState<Step>(initialEnabled ? 'manage' : 'setup');\n\n // Setup state\n const [setupData, setSetupData] = useState<{ secret: string; qrCodeDataUrl: string; recoveryCodes: string[] } | null>(null);\n const [code, setCode] = useState('');\n const [loading, setLoading] = useState(false);\n const [msg, setMsg] = useState<{ text: string; ok: boolean } | null>(null);\n const [showSecret, setShowSecret] = useState(false);\n\n // Recovery codes (shared between setup and regenerate)\n const [recoveryCodes, setRecoveryCodes] = useState<string[]>([]);\n\n useEffect(() => {\n if (isOpen) {\n setStep(initialEnabled ? 'manage' : 'setup');\n setSetupData(null);\n setCode('');\n setMsg(null);\n setLoading(false);\n setShowSecret(false);\n setRecoveryCodes([]);\n\n // Auto-trigger setup if not enabled\n if (!initialEnabled) {\n const token = getAccessToken();\n if (token) {\n setLoading(true);\n api.setup2FA(token)\n .then((data) => {\n setSetupData(data);\n setRecoveryCodes(data.recoveryCodes);\n })\n .catch((err: unknown) => {\n setMsg({ text: err instanceof Error ? err.message : 'Could not set up 2FA.', ok: false });\n })\n .finally(() => setLoading(false));\n }\n }\n }\n }, [isOpen, initialEnabled, api, getAccessToken]);\n\n const handleEnable = async () => {\n const token = getAccessToken();\n if (!token || !code) return;\n setLoading(true);\n setMsg(null);\n try {\n await api.enable2FA(token, code);\n onStatusChange(true);\n setStep('recovery-codes');\n setCode('');\n } catch (err: unknown) {\n setMsg({ text: err instanceof Error ? err.message : 'Invalid code.', ok: false });\n } finally {\n setLoading(false);\n }\n };\n\n const handleDisable = async () => {\n const token = getAccessToken();\n if (!token || !code) return;\n setLoading(true);\n setMsg(null);\n try {\n await api.disable2FA(token, code);\n onStatusChange(false);\n setCode('');\n onClose();\n } catch (err: unknown) {\n setMsg({ text: err instanceof Error ? err.message : 'Invalid code.', ok: false });\n } finally {\n setLoading(false);\n }\n };\n\n const handleRegenerate = async () => {\n const token = getAccessToken();\n if (!token || !code) return;\n setLoading(true);\n setMsg(null);\n try {\n const { recoveryCodes: codes } = await api.regenerateRecoveryCodes(token, code);\n setRecoveryCodes(codes);\n setStep('recovery-codes');\n setCode('');\n } catch (err: unknown) {\n setMsg({ text: err instanceof Error ? err.message : 'Invalid code.', ok: false });\n } finally {\n setLoading(false);\n }\n };\n\n const handleCopyAll = () => {\n navigator.clipboard.writeText(recoveryCodes.join('\\n')).catch(() => {});\n };\n\n const goBack = () => {\n setCode('');\n setMsg(null);\n setStep('manage');\n };\n\n if (!isOpen) return null;\n\n return (\n <ModalOverlay isOpen={isOpen} onClose={onClose}>\n <div\n className=\"fc-modal-content\"\n style={{ '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6' } as React.CSSProperties}\n data-theme={theme}\n >\n {/* ── Setup flow (not enabled) ── */}\n {step === 'setup' && (\n <>\n <h2 className=\"fc-modal-title\">Set up 2FA</h2>\n {msg && <p className={msg.ok ? 'fc-text' : 'fc-error'}>{msg.text}</p>}\n {loading && !setupData && <p className=\"fc-text\">Loading...</p>}\n {setupData && (\n <div className=\"fc-tab\">\n <p className=\"fc-account-section-desc\" style={{ textAlign: 'center' }}>\n Scan this QR code with your authenticator app\n </p>\n <div style={{ display: 'flex', justifyContent: 'center', margin: '12px 0' }}>\n <img\n src={setupData.qrCodeDataUrl}\n alt=\"TOTP QR code\"\n style={{ width: 180, height: 180, borderRadius: 12 }}\n />\n </div>\n <div style={{ textAlign: 'center', marginBottom: 12 }}>\n <button type=\"button\" className=\"fc-link\" onClick={() => setShowSecret(!showSecret)}>\n {showSecret ? 'Hide code' : \"Can't scan? Enter manually\"}\n </button>\n {showSecret && (\n <p style={{ margin: '8px 0 0', fontFamily: 'monospace', fontSize: 12, opacity: 0.7, wordBreak: 'break-all' }}>\n {setupData.secret}\n </p>\n )}\n </div>\n <input\n className=\"fc-input\"\n type=\"text\"\n inputMode=\"numeric\"\n placeholder=\"Enter 6-digit code\"\n maxLength={6}\n value={code}\n onChange={(e) => setCode(e.target.value.replace(/\\D/g, ''))}\n style={{ textAlign: 'center', letterSpacing: '0.2em' }}\n autoFocus\n />\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-primary\"\n onClick={handleEnable}\n disabled={loading || code.length !== 6}\n style={{ marginTop: 10 }}\n >\n {loading ? 'Verifying...' : 'Verify & Enable'}\n </button>\n </div>\n )}\n </>\n )}\n\n {/* ── Manage (enabled) — just two action buttons ── */}\n {step === 'manage' && (\n <>\n <h2 className=\"fc-modal-title\">Two-factor authentication</h2>\n <div style={{ textAlign: 'center', marginBottom: 20 }}>\n <span className=\"fc-badge-verified\" style={{ fontSize: 12, padding: '4px 12px' }}>Enabled</span>\n </div>\n <div className=\"fc-tab\">\n <button\n type=\"button\"\n className=\"fc-security-card\"\n onClick={() => { setCode(''); setMsg(null); setStep('confirm-regenerate'); }}\n >\n <span className=\"fc-security-card-icon\">\n <svg viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M3 10a7 7 0 0 1 7-7m0 14a7 7 0 0 1-7-7m14 0a7 7 0 0 1-7 7m0-14a7 7 0 0 1 7 7\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M14 3l-1 3h3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n <span className=\"fc-security-card-info\">\n <span className=\"fc-security-card-label\">Regenerate recovery codes</span>\n <span className=\"fc-security-card-detail\">Get new backup codes</span>\n </span>\n <span className=\"fc-security-card-chevron\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M6 4l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n </button>\n\n <button\n type=\"button\"\n className=\"fc-security-card\"\n onClick={() => { setCode(''); setMsg(null); setStep('confirm-disable'); }}\n >\n <span className=\"fc-security-card-icon\" style={{ color: '#dc2626' }}>\n <svg viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M10 2l6 3v4c0 4.42-2.56 8.22-6 9.5C6.56 17.22 4 13.42 4 9V5l6-3z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M7.5 7.5l5 5M12.5 7.5l-5 5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </span>\n <span className=\"fc-security-card-info\">\n <span className=\"fc-security-card-label\" style={{ color: '#dc2626' }}>Disable 2FA</span>\n <span className=\"fc-security-card-detail\">Remove two-factor authentication</span>\n </span>\n <span className=\"fc-security-card-chevron\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M6 4l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n </button>\n </div>\n </>\n )}\n\n {/* ── Confirm: Regenerate recovery codes ── */}\n {step === 'confirm-regenerate' && (\n <>\n <h2 className=\"fc-modal-title\">Regenerate recovery codes</h2>\n <p className=\"fc-account-section-desc\" style={{ textAlign: 'center' }}>\n Enter your 2FA code to generate new recovery codes. Your old codes will stop working.\n </p>\n {msg && <p className={msg.ok ? 'fc-text' : 'fc-error'}>{msg.text}</p>}\n <div className=\"fc-tab\">\n <input\n className=\"fc-input\"\n type=\"text\"\n inputMode=\"numeric\"\n placeholder=\"Enter 6-digit code\"\n maxLength={6}\n value={code}\n onChange={(e) => setCode(e.target.value.replace(/\\D/g, ''))}\n style={{ textAlign: 'center', letterSpacing: '0.2em' }}\n autoFocus\n />\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-primary\"\n onClick={handleRegenerate}\n disabled={loading || code.length !== 6}\n style={{ marginTop: 10 }}\n >\n {loading ? 'Generating...' : 'Regenerate codes'}\n </button>\n <div className=\"fc-switch\" style={{ marginTop: 12 }}>\n <button type=\"button\" className=\"fc-link\" onClick={goBack}>Back</button>\n </div>\n </div>\n </>\n )}\n\n {/* ── Confirm: Disable 2FA ── */}\n {step === 'confirm-disable' && (\n <>\n <h2 className=\"fc-modal-title\">Disable 2FA</h2>\n <p className=\"fc-account-section-desc\" style={{ textAlign: 'center' }}>\n Enter your 2FA code to disable two-factor authentication.\n </p>\n {msg && <p className={msg.ok ? 'fc-text' : 'fc-error'}>{msg.text}</p>}\n <div className=\"fc-tab\">\n <input\n className=\"fc-input\"\n type=\"text\"\n inputMode=\"numeric\"\n placeholder=\"Enter 6-digit code\"\n maxLength={6}\n value={code}\n onChange={(e) => setCode(e.target.value.replace(/\\D/g, ''))}\n style={{ textAlign: 'center', letterSpacing: '0.2em' }}\n autoFocus\n />\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-secondary\"\n onClick={handleDisable}\n disabled={loading || code.length !== 6}\n style={{ marginTop: 10, background: 'rgba(220, 38, 38, 0.1)', color: '#dc2626', borderColor: 'rgba(220, 38, 38, 0.2)' }}\n >\n {loading ? 'Disabling...' : 'Disable 2FA'}\n </button>\n <div className=\"fc-switch\" style={{ marginTop: 12 }}>\n <button type=\"button\" className=\"fc-link\" onClick={goBack}>Back</button>\n </div>\n </div>\n </>\n )}\n\n {/* ── Recovery codes (after enable or regenerate) ── */}\n {step === 'recovery-codes' && (\n <>\n <h2 className=\"fc-modal-title\">Save your recovery codes</h2>\n <p className=\"fc-account-section-desc\" style={{ textAlign: 'center' }}>\n Store these codes somewhere safe. Each code can only be used once.\n </p>\n <div className=\"fc-recovery-grid\">\n {recoveryCodes.map((c, i) => (\n <div key={i} className=\"fc-recovery-code\">{c}</div>\n ))}\n </div>\n <div style={{ textAlign: 'center', margin: '8px 0 12px' }}>\n <button type=\"button\" className=\"fc-link\" onClick={handleCopyAll}>\n Copy all\n </button>\n </div>\n <button type=\"button\" className=\"fc-btn fc-btn-primary\" onClick={onClose}>\n Done\n </button>\n </>\n )}\n </div>\n </ModalOverlay>\n );\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { startRegistration } from '../runtime-imports.js';\nimport { ModalOverlay } from './modal-overlay.js';\nimport { timeAgo } from '../lib/utils.js';\nimport type { Passkey } from '../types.js';\n\ninterface PasskeysModalProps {\n isOpen: boolean;\n onClose: () => void;\n onCountChange: (count: number) => void;\n}\n\nexport function PasskeysModal({ isOpen, onClose, onCountChange }: PasskeysModalProps) {\n const { api, getAccessToken, config } = useForgeConnect();\n const theme = config.appearance?.theme ?? 'light';\n\n const [passkeys, setPasskeys] = useState<Passkey[]>([]);\n const [loading, setLoading] = useState(false);\n const [addLoading, setAddLoading] = useState(false);\n const [msg, setMsg] = useState('');\n\n const fetchPasskeys = useCallback(async () => {\n const token = getAccessToken();\n if (!token) return;\n setLoading(true);\n try {\n const list = await api.getPasskeys(token);\n setPasskeys(list);\n onCountChange(list.length);\n } catch {\n // silently fail\n } finally {\n setLoading(false);\n }\n }, [api, getAccessToken, onCountChange]);\n\n useEffect(() => {\n if (isOpen) {\n setMsg('');\n fetchPasskeys();\n }\n }, [isOpen, fetchPasskeys]);\n\n const handleAdd = async () => {\n const token = getAccessToken();\n if (!token) return;\n setAddLoading(true);\n setMsg('');\n try {\n const { options, challengeKey } = await api.getPasskeyRegisterOptions(token, config.webauthnRpId, config.webauthnOrigin);\n const regResponse = await startRegistration({ optionsJSON: options });\n const passkey = await api.verifyPasskeyRegistration(token, challengeKey, regResponse, undefined, config.webauthnRpId, config.webauthnOrigin);\n const updated = [...passkeys, passkey];\n setPasskeys(updated);\n onCountChange(updated.length);\n } catch (err: unknown) {\n setMsg(err instanceof Error ? err.message : 'Could not add passkey.');\n } finally {\n setAddLoading(false);\n }\n };\n\n const handleDelete = async (id: string) => {\n const token = getAccessToken();\n if (!token) return;\n setMsg('');\n try {\n await api.deletePasskey(token, id);\n const updated = passkeys.filter((p) => p.id !== id);\n setPasskeys(updated);\n onCountChange(updated.length);\n } catch (err: unknown) {\n setMsg(err instanceof Error ? err.message : 'Could not remove passkey.');\n }\n };\n\n if (!isOpen) return null;\n\n return (\n <ModalOverlay isOpen={isOpen} onClose={onClose}>\n <div\n className=\"fc-modal-content\"\n style={{ '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6' } as React.CSSProperties}\n data-theme={theme}\n >\n <h2 className=\"fc-modal-title\">Passkeys</h2>\n <p className=\"fc-account-section-desc\" style={{ textAlign: 'center' }}>\n Sign in without a password using biometrics or a security key.\n </p>\n\n {msg && <p className=\"fc-error\">{msg}</p>}\n {loading && <p className=\"fc-text\">Loading...</p>}\n\n <div className=\"fc-tab\">\n {passkeys.map((pk) => (\n <div key={pk.id} className=\"fc-account-item\">\n <span className=\"fc-account-item-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"8\" cy=\"7\" r=\"3\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M13 13.5a5 5 0 0 0-10 0\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M15 10v4m0 0l-1.5-1m1.5 1l1.5-1\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n <div className=\"fc-account-item-info\">\n <span className=\"fc-account-item-label\">{pk.name || 'Passkey'}</span>\n <span className=\"fc-account-item-detail\">\n {pk.deviceType ?? 'Unknown device'}\n {pk.lastUsedAt ? ` · Last used ${timeAgo(pk.lastUsedAt)}` : ''}\n </span>\n </div>\n <div className=\"fc-account-item-actions\">\n {pk.backedUp && <span className=\"fc-badge-verified\">Synced</span>}\n <button type=\"button\" className=\"fc-btn-danger-sm\" onClick={() => handleDelete(pk.id)}>\n Remove\n </button>\n </div>\n </div>\n ))}\n {!loading && passkeys.length === 0 && <p className=\"fc-account-empty\">No passkeys yet</p>}\n\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-secondary\"\n onClick={handleAdd}\n disabled={addLoading}\n style={{ marginTop: 8 }}\n >\n {addLoading ? 'Adding...' : '+ Add passkey'}\n </button>\n </div>\n </div>\n </ModalOverlay>\n );\n}\n","/**\n * Convert the given array buffer into a Base64URL-encoded string. Ideal for converting various\n * credential response ArrayBuffers to string for sending back to the server as JSON.\n *\n * Helper method to compliment `base64URLStringToBuffer`\n */\nexport function bufferToBase64URLString(buffer) {\n const bytes = new Uint8Array(buffer);\n let str = '';\n for (const charCode of bytes) {\n str += String.fromCharCode(charCode);\n }\n const base64String = btoa(str);\n return base64String.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n","/**\n * Convert from a Base64URL-encoded string to an Array Buffer. Best used when converting a\n * credential ID from a JSON string to an ArrayBuffer, like in allowCredentials or\n * excludeCredentials\n *\n * Helper method to compliment `bufferToBase64URLString`\n */\nexport function base64URLStringToBuffer(base64URLString) {\n // Convert from Base64URL to Base64\n const base64 = base64URLString.replace(/-/g, '+').replace(/_/g, '/');\n /**\n * Pad with '=' until it's a multiple of four\n * (4 - (85 % 4 = 1) = 3) % 4 = 3 padding\n * (4 - (86 % 4 = 2) = 2) % 4 = 2 padding\n * (4 - (87 % 4 = 3) = 1) % 4 = 1 padding\n * (4 - (88 % 4 = 0) = 4) % 4 = 0 padding\n */\n const padLength = (4 - (base64.length % 4)) % 4;\n const padded = base64.padEnd(base64.length + padLength, '=');\n // Convert to a binary string\n const binary = atob(padded);\n // Convert binary string to buffer\n const buffer = new ArrayBuffer(binary.length);\n const bytes = new Uint8Array(buffer);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return buffer;\n}\n","/**\n * Determine if the browser is capable of Webauthn\n */\nexport function browserSupportsWebAuthn() {\n return _browserSupportsWebAuthnInternals.stubThis(globalThis?.PublicKeyCredential !== undefined &&\n typeof globalThis.PublicKeyCredential === 'function');\n}\n/**\n * Make it possible to stub the return value during testing\n * @ignore Don't include this in docs output\n */\nexport const _browserSupportsWebAuthnInternals = {\n stubThis: (value) => value,\n};\n","import { base64URLStringToBuffer } from './base64URLStringToBuffer.js';\nexport function toPublicKeyCredentialDescriptor(descriptor) {\n const { id } = descriptor;\n return {\n ...descriptor,\n id: base64URLStringToBuffer(id),\n /**\n * `descriptor.transports` is an array of our `AuthenticatorTransportFuture` that includes newer\n * transports that TypeScript's DOM lib is ignorant of. Convince TS that our list of transports\n * are fine to pass to WebAuthn since browsers will recognize the new value.\n */\n transports: descriptor.transports,\n };\n}\n","/**\n * A simple test to determine if a hostname is a properly-formatted domain name\n *\n * A \"valid domain\" is defined here: https://url.spec.whatwg.org/#valid-domain\n *\n * Regex sourced from here:\n * https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch08s15.html\n */\nexport function isValidDomain(hostname) {\n return (\n // Consider localhost valid as well since it's okay wrt Secure Contexts\n hostname === 'localhost' ||\n /^([a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,}$/i.test(hostname));\n}\n","/**\n * A custom Error used to return a more nuanced error detailing _why_ one of the eight documented\n * errors in the spec was raised after calling `navigator.credentials.create()` or\n * `navigator.credentials.get()`:\n *\n * - `AbortError`\n * - `ConstraintError`\n * - `InvalidStateError`\n * - `NotAllowedError`\n * - `NotSupportedError`\n * - `SecurityError`\n * - `TypeError`\n * - `UnknownError`\n *\n * Error messages were determined through investigation of the spec to determine under which\n * scenarios a given error would be raised.\n */\nexport class WebAuthnError extends Error {\n constructor({ message, code, cause, name, }) {\n // @ts-ignore: help Rollup understand that `cause` is okay to set\n super(message, { cause });\n Object.defineProperty(this, \"code\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.name = name ?? cause.name;\n this.code = code;\n }\n}\n","import { isValidDomain } from './isValidDomain.js';\nimport { WebAuthnError } from './webAuthnError.js';\n/**\n * Attempt to intuit _why_ an error was raised after calling `navigator.credentials.create()`\n */\nexport function identifyRegistrationError({ error, options, }) {\n const { publicKey } = options;\n if (!publicKey) {\n throw Error('options was missing required publicKey property');\n }\n if (error.name === 'AbortError') {\n if (options.signal instanceof AbortSignal) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 16)\n return new WebAuthnError({\n message: 'Registration ceremony was sent an abort signal',\n code: 'ERROR_CEREMONY_ABORTED',\n cause: error,\n });\n }\n }\n else if (error.name === 'ConstraintError') {\n if (publicKey.authenticatorSelection?.requireResidentKey === true) {\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 4)\n return new WebAuthnError({\n message: 'Discoverable credentials were required but no available authenticator supported it',\n code: 'ERROR_AUTHENTICATOR_MISSING_DISCOVERABLE_CREDENTIAL_SUPPORT',\n cause: error,\n });\n }\n else if (\n // @ts-ignore: `mediation` doesn't yet exist on CredentialCreationOptions but it's possible as of Sept 2024\n options.mediation === 'conditional' &&\n publicKey.authenticatorSelection?.userVerification === 'required') {\n // https://w3c.github.io/webauthn/#sctn-createCredential (Step 22.4)\n return new WebAuthnError({\n message: 'User verification was required during automatic registration but it could not be performed',\n code: 'ERROR_AUTO_REGISTER_USER_VERIFICATION_FAILURE',\n cause: error,\n });\n }\n else if (publicKey.authenticatorSelection?.userVerification === 'required') {\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 5)\n return new WebAuthnError({\n message: 'User verification was required but no available authenticator supported it',\n code: 'ERROR_AUTHENTICATOR_MISSING_USER_VERIFICATION_SUPPORT',\n cause: error,\n });\n }\n }\n else if (error.name === 'InvalidStateError') {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 20)\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 3)\n return new WebAuthnError({\n message: 'The authenticator was previously registered',\n code: 'ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED',\n cause: error,\n });\n }\n else if (error.name === 'NotAllowedError') {\n /**\n * Pass the error directly through. Platforms are overloading this error beyond what the spec\n * defines and we don't want to overwrite potentially useful error messages.\n */\n return new WebAuthnError({\n message: error.message,\n code: 'ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY',\n cause: error,\n });\n }\n else if (error.name === 'NotSupportedError') {\n const validPubKeyCredParams = publicKey.pubKeyCredParams.filter((param) => param.type === 'public-key');\n if (validPubKeyCredParams.length === 0) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 10)\n return new WebAuthnError({\n message: 'No entry in pubKeyCredParams was of type \"public-key\"',\n code: 'ERROR_MALFORMED_PUBKEYCREDPARAMS',\n cause: error,\n });\n }\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 2)\n return new WebAuthnError({\n message: 'No available authenticator supported any of the specified pubKeyCredParams algorithms',\n code: 'ERROR_AUTHENTICATOR_NO_SUPPORTED_PUBKEYCREDPARAMS_ALG',\n cause: error,\n });\n }\n else if (error.name === 'SecurityError') {\n const effectiveDomain = globalThis.location.hostname;\n if (!isValidDomain(effectiveDomain)) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 7)\n return new WebAuthnError({\n message: `${globalThis.location.hostname} is an invalid domain`,\n code: 'ERROR_INVALID_DOMAIN',\n cause: error,\n });\n }\n else if (publicKey.rp.id !== effectiveDomain) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 8)\n return new WebAuthnError({\n message: `The RP ID \"${publicKey.rp.id}\" is invalid for this domain`,\n code: 'ERROR_INVALID_RP_ID',\n cause: error,\n });\n }\n }\n else if (error.name === 'TypeError') {\n if (publicKey.user.id.byteLength < 1 || publicKey.user.id.byteLength > 64) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 5)\n return new WebAuthnError({\n message: 'User ID was not between 1 and 64 characters',\n code: 'ERROR_INVALID_USER_ID_LENGTH',\n cause: error,\n });\n }\n }\n else if (error.name === 'UnknownError') {\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 1)\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 8)\n return new WebAuthnError({\n message: 'The authenticator was unable to process the specified options, or could not create a new credential',\n code: 'ERROR_AUTHENTICATOR_GENERAL_ERROR',\n cause: error,\n });\n }\n return error;\n}\n","class BaseWebAuthnAbortService {\n constructor() {\n Object.defineProperty(this, \"controller\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n }\n createNewAbortSignal() {\n // Abort any existing calls to navigator.credentials.create() or navigator.credentials.get()\n if (this.controller) {\n const abortError = new Error('Cancelling existing WebAuthn API call for new one');\n abortError.name = 'AbortError';\n this.controller.abort(abortError);\n }\n const newController = new AbortController();\n this.controller = newController;\n return newController.signal;\n }\n cancelCeremony() {\n if (this.controller) {\n const abortError = new Error('Manually cancelling existing WebAuthn API call');\n abortError.name = 'AbortError';\n this.controller.abort(abortError);\n this.controller = undefined;\n }\n }\n}\n/**\n * A service singleton to help ensure that only a single WebAuthn ceremony is active at a time.\n *\n * Users of **@simplewebauthn/browser** shouldn't typically need to use this, but it can help e.g.\n * developers building projects that use client-side routing to better control the behavior of\n * their UX in response to router navigation events.\n */\nexport const WebAuthnAbortService = new BaseWebAuthnAbortService();\n","const attachments = ['cross-platform', 'platform'];\n/**\n * If possible coerce a `string` value into a known `AuthenticatorAttachment`\n */\nexport function toAuthenticatorAttachment(attachment) {\n if (!attachment) {\n return;\n }\n if (attachments.indexOf(attachment) < 0) {\n return;\n }\n return attachment;\n}\n","import { bufferToBase64URLString } from '../helpers/bufferToBase64URLString.js';\nimport { base64URLStringToBuffer } from '../helpers/base64URLStringToBuffer.js';\nimport { browserSupportsWebAuthn } from '../helpers/browserSupportsWebAuthn.js';\nimport { toPublicKeyCredentialDescriptor } from '../helpers/toPublicKeyCredentialDescriptor.js';\nimport { identifyRegistrationError } from '../helpers/identifyRegistrationError.js';\nimport { WebAuthnAbortService } from '../helpers/webAuthnAbortService.js';\nimport { toAuthenticatorAttachment } from '../helpers/toAuthenticatorAttachment.js';\n/**\n * Begin authenticator \"registration\" via WebAuthn attestation\n *\n * @param optionsJSON Output from **@simplewebauthn/server**'s `generateRegistrationOptions()`\n * @param useAutoRegister (Optional) Try to silently create a passkey with the password manager that the user just signed in with. Defaults to `false`.\n */\nexport async function startRegistration(options) {\n // @ts-ignore: Intentionally check for old call structure to warn about improper API call\n if (!options.optionsJSON && options.challenge) {\n console.warn('startRegistration() was not called correctly. It will try to continue with the provided options, but this call should be refactored to use the expected call structure instead. See https://simplewebauthn.dev/docs/packages/browser#typeerror-cannot-read-properties-of-undefined-reading-challenge for more information.');\n // @ts-ignore: Reassign the options, passed in as a positional argument, to the expected variable\n options = { optionsJSON: options };\n }\n const { optionsJSON, useAutoRegister = false } = options;\n if (!browserSupportsWebAuthn()) {\n throw new Error('WebAuthn is not supported in this browser');\n }\n // We need to convert some values to Uint8Arrays before passing the credentials to the navigator\n const publicKey = {\n ...optionsJSON,\n challenge: base64URLStringToBuffer(optionsJSON.challenge),\n user: {\n ...optionsJSON.user,\n id: base64URLStringToBuffer(optionsJSON.user.id),\n },\n excludeCredentials: optionsJSON.excludeCredentials?.map(toPublicKeyCredentialDescriptor),\n };\n // Prepare options for `.create()`\n const createOptions = {};\n /**\n * Try to use conditional create to register a passkey for the user with the password manager\n * the user just used to authenticate with. The user won't be shown any prominent UI by the\n * browser.\n */\n if (useAutoRegister) {\n // @ts-ignore: `mediation` doesn't yet exist on CredentialCreationOptions but it's possible as of Sept 2024\n createOptions.mediation = 'conditional';\n }\n // Finalize options\n createOptions.publicKey = publicKey;\n // Set up the ability to cancel this request if the user attempts another\n createOptions.signal = WebAuthnAbortService.createNewAbortSignal();\n // Wait for the user to complete attestation\n let credential;\n try {\n credential = (await navigator.credentials.create(createOptions));\n }\n catch (err) {\n throw identifyRegistrationError({ error: err, options: createOptions });\n }\n if (!credential) {\n throw new Error('Registration was not completed');\n }\n const { id, rawId, response, type } = credential;\n // Continue to play it safe with `getTransports()` for now, even when L3 types say it's required\n let transports = undefined;\n if (typeof response.getTransports === 'function') {\n transports = response.getTransports();\n }\n // L3 says this is required, but browser and webview support are still not guaranteed.\n let responsePublicKeyAlgorithm = undefined;\n if (typeof response.getPublicKeyAlgorithm === 'function') {\n try {\n responsePublicKeyAlgorithm = response.getPublicKeyAlgorithm();\n }\n catch (error) {\n warnOnBrokenImplementation('getPublicKeyAlgorithm()', error);\n }\n }\n let responsePublicKey = undefined;\n if (typeof response.getPublicKey === 'function') {\n try {\n const _publicKey = response.getPublicKey();\n if (_publicKey !== null) {\n responsePublicKey = bufferToBase64URLString(_publicKey);\n }\n }\n catch (error) {\n warnOnBrokenImplementation('getPublicKey()', error);\n }\n }\n // L3 says this is required, but browser and webview support are still not guaranteed.\n let responseAuthenticatorData;\n if (typeof response.getAuthenticatorData === 'function') {\n try {\n responseAuthenticatorData = bufferToBase64URLString(response.getAuthenticatorData());\n }\n catch (error) {\n warnOnBrokenImplementation('getAuthenticatorData()', error);\n }\n }\n return {\n id,\n rawId: bufferToBase64URLString(rawId),\n response: {\n attestationObject: bufferToBase64URLString(response.attestationObject),\n clientDataJSON: bufferToBase64URLString(response.clientDataJSON),\n transports,\n publicKeyAlgorithm: responsePublicKeyAlgorithm,\n publicKey: responsePublicKey,\n authenticatorData: responseAuthenticatorData,\n },\n type,\n clientExtensionResults: credential.getClientExtensionResults(),\n authenticatorAttachment: toAuthenticatorAttachment(credential.authenticatorAttachment),\n };\n}\n/**\n * Visibly warn when we detect an issue related to a passkey provider intercepting WebAuthn API\n * calls\n */\nfunction warnOnBrokenImplementation(methodName, cause) {\n console.warn(`The browser extension that intercepted this WebAuthn API call incorrectly implemented ${methodName}. You should report this error to them.\\n`, cause);\n}\n","import { browserSupportsWebAuthn } from './browserSupportsWebAuthn.js';\n/**\n * Determine if the browser supports conditional UI, so that WebAuthn credentials can\n * be shown to the user in the browser's typical password autofill popup.\n */\nexport function browserSupportsWebAuthnAutofill() {\n if (!browserSupportsWebAuthn()) {\n return _browserSupportsWebAuthnAutofillInternals.stubThis(new Promise((resolve) => resolve(false)));\n }\n /**\n * I don't like the `as unknown` here but there's a `declare var PublicKeyCredential` in\n * TS' DOM lib that's making it difficult for me to just go `as PublicKeyCredentialFuture` as I\n * want. I think I'm fine with this for now since it's _supposed_ to be temporary, until TS types\n * have a chance to catch up.\n */\n const globalPublicKeyCredential = globalThis\n .PublicKeyCredential;\n if (globalPublicKeyCredential?.isConditionalMediationAvailable === undefined) {\n return _browserSupportsWebAuthnAutofillInternals.stubThis(new Promise((resolve) => resolve(false)));\n }\n return _browserSupportsWebAuthnAutofillInternals.stubThis(globalPublicKeyCredential.isConditionalMediationAvailable());\n}\n// Make it possible to stub the return value during testing\nexport const _browserSupportsWebAuthnAutofillInternals = {\n stubThis: (value) => value,\n};\n","import { isValidDomain } from './isValidDomain.js';\nimport { WebAuthnError } from './webAuthnError.js';\n/**\n * Attempt to intuit _why_ an error was raised after calling `navigator.credentials.get()`\n */\nexport function identifyAuthenticationError({ error, options, }) {\n const { publicKey } = options;\n if (!publicKey) {\n throw Error('options was missing required publicKey property');\n }\n if (error.name === 'AbortError') {\n if (options.signal instanceof AbortSignal) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 16)\n return new WebAuthnError({\n message: 'Authentication ceremony was sent an abort signal',\n code: 'ERROR_CEREMONY_ABORTED',\n cause: error,\n });\n }\n }\n else if (error.name === 'NotAllowedError') {\n /**\n * Pass the error directly through. Platforms are overloading this error beyond what the spec\n * defines and we don't want to overwrite potentially useful error messages.\n */\n return new WebAuthnError({\n message: error.message,\n code: 'ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY',\n cause: error,\n });\n }\n else if (error.name === 'SecurityError') {\n const effectiveDomain = globalThis.location.hostname;\n if (!isValidDomain(effectiveDomain)) {\n // https://www.w3.org/TR/webauthn-2/#sctn-discover-from-external-source (Step 5)\n return new WebAuthnError({\n message: `${globalThis.location.hostname} is an invalid domain`,\n code: 'ERROR_INVALID_DOMAIN',\n cause: error,\n });\n }\n else if (publicKey.rpId !== effectiveDomain) {\n // https://www.w3.org/TR/webauthn-2/#sctn-discover-from-external-source (Step 6)\n return new WebAuthnError({\n message: `The RP ID \"${publicKey.rpId}\" is invalid for this domain`,\n code: 'ERROR_INVALID_RP_ID',\n cause: error,\n });\n }\n }\n else if (error.name === 'UnknownError') {\n // https://www.w3.org/TR/webauthn-2/#sctn-op-get-assertion (Step 1)\n // https://www.w3.org/TR/webauthn-2/#sctn-op-get-assertion (Step 12)\n return new WebAuthnError({\n message: 'The authenticator was unable to process the specified options, or could not create a new assertion signature',\n code: 'ERROR_AUTHENTICATOR_GENERAL_ERROR',\n cause: error,\n });\n }\n return error;\n}\n","import { bufferToBase64URLString } from '../helpers/bufferToBase64URLString.js';\nimport { base64URLStringToBuffer } from '../helpers/base64URLStringToBuffer.js';\nimport { browserSupportsWebAuthn } from '../helpers/browserSupportsWebAuthn.js';\nimport { browserSupportsWebAuthnAutofill } from '../helpers/browserSupportsWebAuthnAutofill.js';\nimport { toPublicKeyCredentialDescriptor } from '../helpers/toPublicKeyCredentialDescriptor.js';\nimport { identifyAuthenticationError } from '../helpers/identifyAuthenticationError.js';\nimport { WebAuthnAbortService } from '../helpers/webAuthnAbortService.js';\nimport { toAuthenticatorAttachment } from '../helpers/toAuthenticatorAttachment.js';\n/**\n * Begin authenticator \"login\" via WebAuthn assertion\n *\n * @param optionsJSON Output from **@simplewebauthn/server**'s `generateAuthenticationOptions()`\n * @param useBrowserAutofill (Optional) Initialize conditional UI to enable logging in via browser autofill prompts. Defaults to `false`.\n * @param verifyBrowserAutofillInput (Optional) Ensure a suitable `<input>` element is present when `useBrowserAutofill` is `true`. Defaults to `true`.\n */\nexport async function startAuthentication(options) {\n // @ts-ignore: Intentionally check for old call structure to warn about improper API call\n if (!options.optionsJSON && options.challenge) {\n console.warn('startAuthentication() was not called correctly. It will try to continue with the provided options, but this call should be refactored to use the expected call structure instead. See https://simplewebauthn.dev/docs/packages/browser#typeerror-cannot-read-properties-of-undefined-reading-challenge for more information.');\n // @ts-ignore: Reassign the options, passed in as a positional argument, to the expected variable\n options = { optionsJSON: options };\n }\n const { optionsJSON, useBrowserAutofill = false, verifyBrowserAutofillInput = true, } = options;\n if (!browserSupportsWebAuthn()) {\n throw new Error('WebAuthn is not supported in this browser');\n }\n // We need to avoid passing empty array to avoid blocking retrieval\n // of public key\n let allowCredentials;\n if (optionsJSON.allowCredentials?.length !== 0) {\n allowCredentials = optionsJSON.allowCredentials?.map(toPublicKeyCredentialDescriptor);\n }\n // We need to convert some values to Uint8Arrays before passing the credentials to the navigator\n const publicKey = {\n ...optionsJSON,\n challenge: base64URLStringToBuffer(optionsJSON.challenge),\n allowCredentials,\n };\n // Prepare options for `.get()`\n const getOptions = {};\n /**\n * Set up the page to prompt the user to select a credential for authentication via the browser's\n * input autofill mechanism.\n */\n if (useBrowserAutofill) {\n if (!(await browserSupportsWebAuthnAutofill())) {\n throw Error('Browser does not support WebAuthn autofill');\n }\n // Check for an <input> with \"webauthn\" in its `autocomplete` attribute\n const eligibleInputs = document.querySelectorAll(\"input[autocomplete$='webauthn']\");\n // WebAuthn autofill requires at least one valid input\n if (eligibleInputs.length < 1 && verifyBrowserAutofillInput) {\n throw Error('No <input> with \"webauthn\" as the only or last value in its `autocomplete` attribute was detected');\n }\n // `CredentialMediationRequirement` doesn't know about \"conditional\" yet as of\n // typescript@4.6.3\n getOptions.mediation = 'conditional';\n // Conditional UI requires an empty allow list\n publicKey.allowCredentials = [];\n }\n // Finalize options\n getOptions.publicKey = publicKey;\n // Set up the ability to cancel this request if the user attempts another\n getOptions.signal = WebAuthnAbortService.createNewAbortSignal();\n // Wait for the user to complete assertion\n let credential;\n try {\n credential = (await navigator.credentials.get(getOptions));\n }\n catch (err) {\n throw identifyAuthenticationError({ error: err, options: getOptions });\n }\n if (!credential) {\n throw new Error('Authentication was not completed');\n }\n const { id, rawId, response, type } = credential;\n let userHandle = undefined;\n if (response.userHandle) {\n userHandle = bufferToBase64URLString(response.userHandle);\n }\n // Convert values to base64 to make it easier to send back to the server\n return {\n id,\n rawId: bufferToBase64URLString(rawId),\n response: {\n authenticatorData: bufferToBase64URLString(response.authenticatorData),\n clientDataJSON: bufferToBase64URLString(response.clientDataJSON),\n signature: bufferToBase64URLString(response.signature),\n userHandle,\n },\n type,\n clientExtensionResults: credential.getClientExtensionResults(),\n authenticatorAttachment: toAuthenticatorAttachment(credential.authenticatorAttachment),\n };\n}\n","import { useState, useEffect } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { ModalOverlay } from './modal-overlay.js';\nimport { ErrorView } from './error-view.js';\n\ninterface PasswordModalProps {\n isOpen: boolean;\n onClose: () => void;\n hasPassword: boolean;\n}\n\ntype Step = 'form' | 'done' | 'error';\n\nexport function PasswordModal({ isOpen, onClose, hasPassword }: PasswordModalProps) {\n const { api, getAccessToken, config } = useForgeConnect();\n const theme = config.appearance?.theme ?? 'light';\n\n const [step, setStep] = useState<Step>('form');\n const [currentPassword, setCurrentPassword] = useState('');\n const [newPassword, setNewPassword] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n\n useEffect(() => {\n if (isOpen) {\n setStep('form');\n setCurrentPassword('');\n setNewPassword('');\n setError('');\n setLoading(false);\n }\n }, [isOpen]);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.setPassword(token, newPassword, hasPassword ? currentPassword : undefined);\n setStep('done');\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : 'Could not set your password. Please try again.';\n setError(msg);\n setStep('error');\n } finally {\n setLoading(false);\n }\n };\n\n const title = hasPassword ? 'Change password' : 'Set a password';\n\n return (\n <ModalOverlay isOpen={isOpen} onClose={onClose}>\n <div\n className=\"fc-modal-content\"\n style={{ '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6' } as React.CSSProperties}\n data-theme={theme}\n >\n {step === 'done' ? (\n <div className=\"fc-tab\" style={{ textAlign: 'center', padding: '24px 0' }}>\n <div className=\"fc-success\">\n <div className=\"fc-success-icon\">\n <svg viewBox=\"0 0 52 52\" className=\"fc-success-check\">\n <circle className=\"fc-success-circle\" cx=\"26\" cy=\"26\" r=\"24\" fill=\"none\" />\n <path className=\"fc-success-tick\" fill=\"none\" d=\"M15 26l7.5 7.5L37 19\" />\n </svg>\n </div>\n <p className=\"fc-success-text\">Password {hasPassword ? 'updated' : 'set'}</p>\n </div>\n <button type=\"button\" className=\"fc-btn fc-btn-primary\" onClick={onClose} style={{ marginTop: 16 }}>\n Done\n </button>\n </div>\n ) : step === 'error' ? (\n <ErrorView\n title=\"Password update failed\"\n message={error}\n onRetry={() => setStep('form')}\n onClose={onClose}\n />\n ) : (\n <>\n <h2 className=\"fc-modal-title\">{title}</h2>\n <div className=\"fc-tab\">\n <form onSubmit={handleSubmit} className=\"fc-form\">\n {hasPassword && (\n <label className=\"fc-label\">\n Current password\n <input\n type=\"password\"\n className=\"fc-input\"\n value={currentPassword}\n onChange={(e) => setCurrentPassword(e.target.value)}\n placeholder=\"Enter current password\"\n required\n autoComplete=\"current-password\"\n />\n </label>\n )}\n <label className=\"fc-label\">\n New password\n <input\n type=\"password\"\n className=\"fc-input\"\n value={newPassword}\n onChange={(e) => setNewPassword(e.target.value)}\n placeholder=\"8+ characters\"\n required\n autoComplete=\"new-password\"\n minLength={8}\n />\n </label>\n {error && <p className=\"fc-error\">{error}</p>}\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Saving...' : hasPassword ? 'Update password' : 'Set password'}\n </button>\n </form>\n </div>\n </>\n )}\n </div>\n </ModalOverlay>\n );\n}\n","export interface ErrorViewProps {\n title?: string;\n message?: string;\n onRetry?: () => void;\n onClose?: () => void;\n}\n\nexport function ErrorView({\n title = 'Something went wrong',\n message,\n onRetry,\n onClose,\n}: ErrorViewProps) {\n return (\n <div className=\"fc-error-view\">\n <div className=\"fc-error-icon\">\n <svg viewBox=\"0 0 52 52\" className=\"fc-error-check\">\n <circle className=\"fc-error-circle\" cx=\"26\" cy=\"26\" r=\"24\" fill=\"none\" />\n <line className=\"fc-error-cross-1\" x1=\"16\" y1=\"16\" x2=\"36\" y2=\"36\" />\n <line className=\"fc-error-cross-2\" x1=\"36\" y1=\"16\" x2=\"16\" y2=\"36\" />\n </svg>\n </div>\n <p className=\"fc-error-text\">{title}</p>\n {message && <p className=\"fc-error-subtext\">{message}</p>}\n {(onRetry || onClose) && (\n <div className=\"fc-error-actions\">\n {onRetry && (\n <button type=\"button\" className=\"fc-btn fc-btn-primary\" onClick={onRetry}>\n Try again\n </button>\n )}\n {onClose && (\n <button type=\"button\" className=\"fc-btn fc-btn-secondary\" onClick={onClose}>\n Close\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { ModalOverlay } from './modal-overlay.js';\nimport { ErrorView } from './error-view.js';\n\ninterface DeleteAccountModalProps {\n isOpen: boolean;\n onClose: () => void;\n onDeleted: () => void;\n}\n\ntype Step = 'confirm' | 'code' | 'done' | 'error';\n\nexport function DeleteAccountModal({ isOpen, onClose, onDeleted }: DeleteAccountModalProps) {\n const { api, getAccessToken, config, logout } = useForgeConnect();\n const theme = config.appearance?.theme ?? 'light';\n\n const [step, setStep] = useState<Step>('confirm');\n const [code, setCode] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n\n useEffect(() => {\n if (isOpen) {\n setStep('confirm');\n setCode('');\n setError('');\n setLoading(false);\n }\n }, [isOpen]);\n\n const handleDelete = async () => {\n setError('');\n setLoading(true);\n try {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n const { requiresVerification } = await api.requestAccountDeletion(token);\n if (requiresVerification) {\n setStep('code');\n } else {\n await api.confirmAccountDeletion(token);\n setStep('done');\n }\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : 'Something went wrong. Please try again.';\n setError(msg);\n setStep('error');\n } finally {\n setLoading(false);\n }\n };\n\n const handleConfirmCode = async (e: React.FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.confirmAccountDeletion(token, code);\n setStep('done');\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : 'Something went wrong. Please try again.';\n setError(msg);\n setStep('error');\n } finally {\n setLoading(false);\n }\n };\n\n const handleDone = () => {\n logout();\n onDeleted();\n };\n\n if (!isOpen) return null;\n\n return (\n <ModalOverlay isOpen={isOpen} onClose={step === 'done' ? handleDone : onClose}>\n <div\n className=\"fc-modal-content\"\n style={{ '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6' } as React.CSSProperties}\n data-theme={theme}\n >\n {step === 'confirm' && (\n <>\n <h2 className=\"fc-modal-title\">Delete account</h2>\n <div className=\"fc-tab\" style={{ textAlign: 'center' }}>\n <p className=\"fc-account-section-desc\">\n This will permanently delete your account and all associated data. This action cannot be undone.\n </p>\n {error && <p className=\"fc-error\">{error}</p>}\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-secondary\"\n onClick={handleDelete}\n disabled={loading}\n style={{ marginTop: 12, background: 'rgba(220, 38, 38, 0.1)', color: '#dc2626', borderColor: 'rgba(220, 38, 38, 0.2)' }}\n >\n {loading ? 'Processing...' : 'Delete my account'}\n </button>\n <div style={{ marginTop: 12 }}>\n <button type=\"button\" className=\"fc-link\" onClick={onClose}>Cancel</button>\n </div>\n </div>\n </>\n )}\n\n {step === 'code' && (\n <>\n <h2 className=\"fc-modal-title\">Verify your identity</h2>\n <div className=\"fc-tab\">\n <p className=\"fc-account-section-desc\" style={{ textAlign: 'center' }}>\n Enter the 6-digit code sent to your email to confirm deletion.\n </p>\n {error && <p className=\"fc-error\">{error}</p>}\n <form onSubmit={handleConfirmCode} className=\"fc-form\">\n <input\n className=\"fc-input\"\n type=\"text\"\n inputMode=\"numeric\"\n placeholder=\"Enter 6-digit code\"\n maxLength={6}\n value={code}\n onChange={(e) => setCode(e.target.value.replace(/\\D/g, ''))}\n style={{ textAlign: 'center', letterSpacing: '0.2em' }}\n autoFocus\n />\n <button\n type=\"submit\"\n className=\"fc-btn fc-btn-secondary\"\n disabled={loading || code.length !== 6}\n style={{ marginTop: 10, background: 'rgba(220, 38, 38, 0.1)', color: '#dc2626', borderColor: 'rgba(220, 38, 38, 0.2)' }}\n >\n {loading ? 'Deleting...' : 'Delete my account'}\n </button>\n </form>\n <div style={{ marginTop: 12, textAlign: 'center' }}>\n <button type=\"button\" className=\"fc-link\" onClick={onClose}>Cancel</button>\n </div>\n </div>\n </>\n )}\n\n {step === 'done' && (\n <div className=\"fc-tab\" style={{ textAlign: 'center', padding: '24px 0' }}>\n <div className=\"fc-success\">\n <div className=\"fc-success-icon\">\n <svg viewBox=\"0 0 52 52\" className=\"fc-success-check\">\n <circle className=\"fc-success-circle\" cx=\"26\" cy=\"26\" r=\"24\" fill=\"none\" />\n <path className=\"fc-success-tick\" fill=\"none\" d=\"M15 26l7.5 7.5L37 19\" />\n </svg>\n </div>\n <p className=\"fc-success-text\">Account deleted</p>\n </div>\n <button type=\"button\" className=\"fc-btn fc-btn-primary\" onClick={handleDone} style={{ marginTop: 16 }}>\n Done\n </button>\n </div>\n )}\n\n {step === 'error' && (\n <ErrorView\n title=\"Deletion failed\"\n message={error}\n onRetry={() => setStep('confirm')}\n onClose={onClose}\n />\n )}\n </div>\n </ModalOverlay>\n );\n}\n","import { useState, useEffect, useMemo, useRef, useCallback } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { useUser } from '../hooks/use-user.js';\nimport { useWallets } from '../hooks/use-wallets.js';\nimport { ModalOverlay } from './modal-overlay.js';\nimport { ErrorView } from './error-view.js';\nimport { PROVIDER_INFO } from './tabs/oauth-buttons.js';\nimport { SvgIcon } from './svg-icon.js';\nimport { MOBILE_WALLETS, isMobile } from './tabs/wallet-connect.js';\nimport { resolveLoginMethods, isOAuthMethod } from '../resolve-config.js';\nimport type { OAuthProvider } from '../types.js';\n\ntype LinkStep = 'method-select' | 'email' | 'otp' | 'wallet' | 'success' | 'error';\n\nexport function LinkAuthModal() {\n const { linkModal, closeLinkModal, config } = useForgeConnect();\n const { linkOAuth, authMethods } = useUser();\n const mode = linkModal.mode ?? 'auth';\n const [step, setStep] = useState<LinkStep>('method-select');\n const [fatalError, setFatalError] = useState('');\n\n // When modal opens, set the correct initial step\n useEffect(() => {\n if (linkModal.isOpen) {\n setStep(mode === 'wallet' ? 'wallet' : 'method-select');\n setFatalError('');\n }\n }, [linkModal.isOpen, mode]);\n\n // Listen for OAuth link success (popup sends postMessage)\n useEffect(() => {\n if (!linkModal.isOpen) return;\n\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== window.location.origin) return;\n if (event.data?.type === 'fc_oauth_link_success') {\n setStep('success');\n setTimeout(() => {\n handleClose();\n }, 1500);\n }\n };\n\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [linkModal.isOpen]);\n\n if (!linkModal.isOpen) return null;\n\n const theme = config.appearance?.theme ?? 'light';\n\n const handleClose = () => {\n setStep('method-select');\n closeLinkModal();\n };\n\n const handleSuccess = () => {\n setStep('success');\n setTimeout(() => {\n handleClose();\n }, 1500);\n };\n\n const handleOAuthDirect = (provider: string) => {\n linkOAuth(provider);\n };\n\n const handleFatalError = (msg: string) => {\n setFatalError(msg);\n setStep('error');\n };\n\n const title = step === 'success' || step === 'error'\n ? ''\n : step === 'email'\n ? 'Link email'\n : step === 'otp'\n ? 'Link email'\n : mode === 'wallet' || step === 'wallet'\n ? 'Connect wallet'\n : 'Link a method';\n\n return (\n <ModalOverlay isOpen={linkModal.isOpen} onClose={handleClose}>\n <div\n className=\"fc-modal-content\"\n style={{ '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6' } as React.CSSProperties}\n data-theme={theme}\n >\n {step === 'success' ? (\n <SuccessView />\n ) : step === 'error' ? (\n <ErrorView\n title=\"Linking failed\"\n message={fatalError}\n onRetry={() => setStep(mode === 'wallet' ? 'wallet' : 'method-select')}\n onClose={handleClose}\n />\n ) : (\n <>\n <h2 className=\"fc-modal-title\">{title}</h2>\n {step === 'method-select' && (\n <AuthMethodSelectStep\n config={config}\n connectedProviders={authMethods?.map(m => m.provider) ?? []}\n onSelectEmail={() => setStep('email')}\n onSelectOtp={() => setStep('otp')}\n onOAuth={handleOAuthDirect}\n />\n )}\n {step === 'email' && (\n <EmailLinkStep\n onBack={mode === 'wallet' ? undefined : () => setStep('method-select')}\n onSuccess={handleSuccess}\n onFatalError={handleFatalError}\n />\n )}\n {step === 'otp' && (\n <OtpLinkStep\n onBack={() => setStep('method-select')}\n onSuccess={handleSuccess}\n onFatalError={handleFatalError}\n />\n )}\n {step === 'wallet' && (\n <WalletLinkStep\n onBack={mode === 'wallet' ? undefined : () => setStep('method-select')}\n onSuccess={handleSuccess}\n onFatalError={handleFatalError}\n />\n )}\n </>\n )}\n </div>\n </ModalOverlay>\n );\n}\n\n// ── Icons ──\n\nconst EmailIcon = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon\">\n <rect x=\"2\" y=\"4\" width=\"16\" height=\"12\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2 6l8 5 8-5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </div>\n);\n\nconst MagicCodeIcon = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon\">\n <rect x=\"3\" y=\"5\" width=\"14\" height=\"10\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M7 10h1.5M9.5 10h1M11.5 10h1.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </div>\n);\n\n// ── Auth Method Select (socials + email + otp, filtered) ──\n\nfunction AuthMethodSelectStep({\n config,\n connectedProviders,\n onSelectEmail,\n onSelectOtp,\n onOAuth,\n}: {\n config: import('../types.js').ForgeConnectConfig;\n connectedProviders: string[];\n onSelectEmail: () => void;\n onSelectOtp: () => void;\n onOAuth: (provider: string) => void;\n}) {\n const methods = resolveLoginMethods(config);\n const connectedSet = new Set(connectedProviders);\n const hasEmail = connectedSet.has('email');\n\n // Filter: only auth methods from config (no wallet/passkey), exclude already-connected\n const availableMethods = methods.filter((m) => {\n if (m === 'wallet' || m === 'passkey') return false;\n // Both email and otp link an email — skip if email already connected\n if (m === 'email') return !hasEmail;\n if (m === 'otp') return !hasEmail;\n if (isOAuthMethod(m)) return !connectedSet.has(m);\n return false;\n });\n\n if (availableMethods.length === 0) {\n return (\n <div className=\"fc-tab\">\n <p className=\"fc-text\">All available login methods are already connected.</p>\n </div>\n );\n }\n\n return (\n <div className=\"fc-tab\">\n {availableMethods.map((method) => {\n if (method === 'email') {\n return (\n <button key=\"email\" type=\"button\" className=\"fc-btn fc-btn-method\" onClick={onSelectEmail}>\n <EmailIcon /> <span className=\"fc-btn-name\">Email &amp; password</span>\n </button>\n );\n }\n\n if (method === 'otp') {\n return (\n <button key=\"otp\" type=\"button\" className=\"fc-btn fc-btn-method\" onClick={onSelectOtp}>\n <MagicCodeIcon /> <span className=\"fc-btn-name\">Magic code</span>\n </button>\n );\n }\n\n // OAuth provider\n const provider = method as OAuthProvider;\n const info = PROVIDER_INFO[provider];\n if (!info) return null;\n\n return (\n <button\n key={provider}\n type=\"button\"\n className=\"fc-btn fc-btn-method\"\n onClick={() => onOAuth(provider)}\n >\n <SvgIcon svg={info.icon} className=\"fc-oauth-icon\" />\n <span className=\"fc-btn-name\">{info.label}</span>\n </button>\n );\n })}\n </div>\n );\n}\n\n// ── Email Link Step ──\n\nfunction EmailLinkStep({ onBack, onSuccess, onFatalError }: { onBack?: () => void; onSuccess: () => void; onFatalError: (msg: string) => void }) {\n const { linkAuthMethod } = useUser();\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setLoading(true);\n setError('');\n try {\n await linkAuthMethod({ provider: 'email', email, password });\n onSuccess();\n } catch (err: unknown) {\n onFatalError(err instanceof Error ? err.message : 'Could not link this email. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <div className=\"fc-tab\">\n {error && <p className=\"fc-error\">{error}</p>}\n <form className=\"fc-form\" onSubmit={handleSubmit}>\n <label className=\"fc-label\">\n Email\n <input className=\"fc-input\" type=\"email\" value={email} onChange={(e) => setEmail(e.target.value)} required placeholder=\"you@example.com\" />\n </label>\n <label className=\"fc-label\">\n Password\n <input className=\"fc-input\" type=\"password\" value={password} onChange={(e) => setPassword(e.target.value)} required minLength={8} placeholder=\"8+ characters\" />\n </label>\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Linking...' : 'Link email'}\n </button>\n </form>\n {onBack && (\n <div className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={onBack}>Back</button>\n </div>\n )}\n </div>\n );\n}\n\n// ── OTP Link Step (magic code) ──\n\nfunction OtpLinkStep({ onBack, onSuccess, onFatalError }: { onBack?: () => void; onSuccess: () => void; onFatalError: (msg: string) => void }) {\n const { linkOtpSend, linkOtpVerify } = useUser();\n const [email, setEmail] = useState('');\n const [code, setCode] = useState('');\n const [codeSent, setCodeSent] = useState(false);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n\n const handleSendCode = async (e: React.FormEvent) => {\n e.preventDefault();\n setLoading(true);\n setError('');\n try {\n await linkOtpSend(email);\n setCodeSent(true);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Could not send code. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n const handleVerifyCode = async (e: React.FormEvent) => {\n e.preventDefault();\n setLoading(true);\n setError('');\n try {\n await linkOtpVerify(email, code);\n onSuccess();\n } catch (err: unknown) {\n onFatalError(err instanceof Error ? err.message : 'Invalid code. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n if (!codeSent) {\n return (\n <div className=\"fc-tab\">\n {error && <p className=\"fc-error\">{error}</p>}\n <form className=\"fc-form\" onSubmit={handleSendCode}>\n <label className=\"fc-label\">\n Email\n <input className=\"fc-input\" type=\"email\" value={email} onChange={(e) => setEmail(e.target.value)} required placeholder=\"you@example.com\" />\n </label>\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Sending...' : 'Send code'}\n </button>\n </form>\n {onBack && (\n <div className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={onBack}>Back</button>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"fc-tab\">\n <p className=\"fc-text\">A 6-digit code was sent to <strong>{email}</strong></p>\n {error && <p className=\"fc-error\">{error}</p>}\n <form className=\"fc-form\" onSubmit={handleVerifyCode}>\n <label className=\"fc-label\">\n Code\n <input\n className=\"fc-input\"\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]{6}\"\n maxLength={6}\n value={code}\n onChange={(e) => setCode(e.target.value.replace(/\\D/g, '').slice(0, 6))}\n required\n placeholder=\"000000\"\n autoFocus\n />\n </label>\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading || code.length !== 6}>\n {loading ? 'Verifying...' : 'Verify & link'}\n </button>\n </form>\n <div className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => { setCodeSent(false); setCode(''); setError(''); }}>\n Use a different email\n </button>\n </div>\n </div>\n );\n}\n\n// ── Wallet Link Step ──\n\nfunction WalletLinkStep({ onBack, onSuccess, onFatalError }: { onBack?: () => void; onSuccess: () => void; onFatalError: (msg: string) => void }) {\n const { walletAdapter, config } = useForgeConnect();\n const { linkWallet } = useWallets();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [showOther, setShowOther] = useState(false);\n const [coldWallet, setColdWallet] = useState(false);\n const mobile = useMemo(() => isMobile(), []);\n const walletConfig = config.walletConfig;\n const preferred = walletConfig?.preferredWallets ?? [];\n const onlyPreferred = walletConfig?.onlyPreferred ?? false;\n\n const coldWalletRef = useRef(coldWallet);\n coldWalletRef.current = coldWallet;\n\n const buildSignTxFnForAdapter = useCallback((adapter: any): ((txBase64: string) => Promise<string>) | undefined => {\n if (!adapter.signTransaction) return undefined;\n const TxClass = walletConfig?.Transaction;\n if (!TxClass) return undefined;\n return async (txBase64: string) => {\n const bytes = Uint8Array.from(atob(txBase64), (c) => c.charCodeAt(0));\n const tx = TxClass.from(bytes);\n const signedTx = await adapter.signTransaction(tx);\n return btoa(String.fromCharCode(...new Uint8Array(signedTx.serialize())));\n };\n }, [walletConfig?.Transaction]);\n\n const wallet = walletAdapter!;\n\n const handleConnect = async (w: NonNullable<typeof walletAdapter>['wallets'][0]) => {\n if (w.readyState !== 'Installed') {\n if (mobile) {\n const mw = MOBILE_WALLETS.find((m) => m.name === w.adapter.name);\n if (mw) { window.location.href = mw.buildUrl(window.location.href); return; }\n }\n const url = (w.adapter as any).url;\n if (url) window.open(url, '_blank');\n return;\n }\n\n setError('');\n setLoading(true);\n try {\n // Select + connect via the React context so the wallet state\n // is available everywhere in the app\n wallet.select(w.adapter.name);\n await wallet.connect();\n\n const pk = w.adapter.publicKey ?? wallet.publicKey;\n if (!pk) throw new Error('Wallet did not provide a public key.');\n const useCold = coldWalletRef.current;\n const adapterSignMessage = wallet.signMessage\n ? (msg: Uint8Array) => wallet.signMessage!(msg)\n : undefined;\n await linkWallet(\n pk.toBase58(),\n useCold ? undefined : adapterSignMessage,\n 'solana',\n useCold ? buildSignTxFnForAdapter(w.adapter) : undefined,\n );\n onSuccess();\n } catch (err: unknown) {\n onFatalError(err instanceof Error ? err.message : 'Could not link this wallet. Please try again.');\n }\n };\n\n const { preferredWallets, otherWallets } = useMemo(() => {\n if (!walletAdapter) return { preferredWallets: [] as any[], otherWallets: [] as any[] };\n const all = walletAdapter.wallets;\n const prefList = preferred\n .map((name) => all.find((w) => w.adapter.name === name))\n .filter(Boolean) as typeof all;\n if (onlyPreferred && preferred.length > 0) return { preferredWallets: prefList, otherWallets: [] as typeof all };\n const prefSet = new Set(preferred);\n const others = all.filter((w) => !prefSet.has(w.adapter.name) && w.readyState === 'Installed');\n return { preferredWallets: prefList, otherWallets: others };\n }, [walletAdapter?.wallets, walletConfig]);\n\n const mobileExtraWallets = useMemo(() => {\n if (!mobile || !walletAdapter) return [];\n const adapterNames = new Set(walletAdapter.wallets.map((w) => w.adapter.name));\n return MOBILE_WALLETS.filter((mw) => !adapterNames.has(mw.name));\n }, [mobile, walletAdapter?.wallets]);\n\n // Mobile without wallet adapter — show deep links\n if (!walletAdapter && mobile) {\n return (\n <div className=\"fc-tab\">\n <div className=\"fc-wallet-list\">\n {MOBILE_WALLETS.map((mw) => (\n <button key={mw.name} type=\"button\" className=\"fc-btn fc-btn-wallet\"\n onClick={() => { window.location.href = mw.buildUrl(window.location.href); }}>\n <span style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={mw.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{mw.name}</span>\n <span className=\"fc-badge-preferred\">Open app</span>\n </button>\n ))}\n </div>\n {onBack && (\n <div className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={onBack}>Back</button>\n </div>\n )}\n </div>\n );\n }\n\n // No wallet adapter at all\n if (!walletAdapter) {\n return (\n <div className=\"fc-tab\">\n <p className=\"fc-text\">\n No wallet adapter detected. Pass <code>walletAdapter</code> to{' '}\n <code>&lt;ForgeConnectProvider&gt;</code> to enable wallet connection.\n </p>\n {onBack && (\n <div className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={onBack}>Back</button>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"fc-tab\">\n {loading ? (\n <div style={{ textAlign: 'center', padding: '24px 0' }}>\n <p className=\"fc-tab-title\">Connecting...</p>\n <p className=\"fc-text\">\n {coldWallet\n ? 'Confirm the transaction on your device'\n : 'Approve the connection, then sign the verification request in your wallet'}\n </p>\n {error && (\n <>\n <p className=\"fc-error\">{error}</p>\n <button type=\"button\" className=\"fc-btn fc-btn-secondary\"\n onClick={() => { setLoading(false); setError(''); }} style={{ marginTop: 8 }}>\n Try again\n </button>\n </>\n )}\n </div>\n ) : (\n <>\n <div className=\"fc-wallet-list\">\n {preferredWallets.map((w: any) => {\n const installed = w.readyState === 'Installed';\n return (\n <button key={w.adapter.name} type=\"button\" className=\"fc-btn fc-btn-wallet\" onClick={() => handleConnect(w)}>\n <span className={installed ? 'fc-installed-dot' : ''} style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={w.adapter.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{w.adapter.name}</span>\n <span className=\"fc-badge-preferred\">Preferred</span>\n {!installed && mobile && MOBILE_WALLETS.some((mw) => mw.name === w.adapter.name)\n ? <span className=\"fc-badge-install\">Open app</span>\n : !installed && <span className=\"fc-badge-install\">Install</span>\n }\n </button>\n );\n })}\n {mobileExtraWallets.map((mw) => (\n <button key={mw.name} type=\"button\" className=\"fc-btn fc-btn-wallet\"\n onClick={() => { window.location.href = mw.buildUrl(window.location.href); }}>\n <span style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={mw.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{mw.name}</span>\n <span className=\"fc-badge-install\">Open app</span>\n </button>\n ))}\n {otherWallets.length > 0 && !showOther && (\n <button type=\"button\" className=\"fc-btn fc-btn-wallet\" onClick={() => setShowOther(true)}>\n <span className=\"fc-other-wallets-icon\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <rect x=\"2\" y=\"3\" width=\"16\" height=\"14\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2 7h16\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <rect x=\"11\" y=\"10\" width=\"7\" height=\"4\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n </span>\n <span className=\"fc-wallet-name\">Other wallets</span>\n </button>\n )}\n {showOther && otherWallets.map((w: any) => (\n <button key={w.adapter.name} type=\"button\" className=\"fc-btn fc-btn-wallet\" onClick={() => handleConnect(w)}>\n <span className=\"fc-installed-dot\" style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={w.adapter.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{w.adapter.name}</span>\n </button>\n ))}\n </div>\n {preferredWallets.length === 0 && otherWallets.length === 0 && mobileExtraWallets.length === 0 && (\n <p className=\"fc-text\">No wallet found. Please install a Solana wallet (like Phantom) to continue.</p>\n )}\n\n {walletConfig?.Transaction && (\n <label className=\"fc-cold-wallet-toggle\">\n <input\n type=\"checkbox\"\n checked={coldWallet}\n onChange={(e) => setColdWallet(e.target.checked)}\n />\n <span className=\"fc-toggle-track\" />\n <span className=\"fc-cold-wallet-label\">\n <span>Hardware wallet</span>\n <span>Ledger, Trezor, Keystone...</span>\n </span>\n </label>\n )}\n\n {error && <p className=\"fc-error\">{error}</p>}\n </>\n )}\n {!loading && onBack && (\n <div className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={onBack}>Back</button>\n </div>\n )}\n </div>\n );\n}\n\n// ── Success View ──\n\nfunction SuccessView() {\n return (\n <div className=\"fc-success\">\n <div className=\"fc-success-icon\">\n <svg viewBox=\"0 0 52 52\" className=\"fc-success-check\">\n <circle className=\"fc-success-circle\" cx=\"26\" cy=\"26\" r=\"24\" fill=\"none\" />\n <path className=\"fc-success-tick\" fill=\"none\" d=\"M15 26l7.5 7.5L37 19\" />\n </svg>\n </div>\n <p className=\"fc-success-text\">Linked</p>\n </div>\n );\n}\n","import { useForgeConnect } from '../hooks/use-forge-connect';\n\ninterface LoginButtonProps {\n className?: string;\n label?: string;\n}\n\nexport function LoginButton({ className, label }: LoginButtonProps) {\n const { auth, openModal, logout } = useForgeConnect();\n\n if (auth.status === 'loading') {\n return (\n <button type=\"button\" className={className ?? 'fc-btn fc-btn-login'} disabled>\n Loading...\n </button>\n );\n }\n\n if (auth.status === 'authenticated') {\n return (\n <button type=\"button\" className={className ?? 'fc-btn fc-btn-login'} onClick={logout}>\n {label ?? 'Log out'}\n </button>\n );\n }\n\n return (\n <button type=\"button\" className={className ?? 'fc-btn fc-btn-login'} onClick={openModal}>\n {label ?? 'Sign in'}\n </button>\n );\n}\n","import { useForgeConnect } from '../hooks/use-forge-connect.js';\n\ninterface AccountButtonProps {\n className?: string;\n loginLabel?: string;\n compact?: boolean;\n}\n\nexport function AccountButton({ className, loginLabel, compact }: AccountButtonProps) {\n const { auth, openModal, openAccountModal } = useForgeConnect();\n\n if (auth.status === 'loading') {\n return (\n <button type=\"button\" className={className ?? 'fc-btn fc-btn-login'} disabled>\n Loading...\n </button>\n );\n }\n\n if (auth.status === 'authenticated' && auth.user) {\n const user = auth.user;\n const initial = (user.displayName ?? user.primaryEmail ?? '?').charAt(0).toUpperCase();\n\n return (\n <button type=\"button\" className={className ?? 'fc-btn-account'} onClick={openAccountModal}>\n {user.avatarUrl ? (\n <img src={user.avatarUrl} alt=\"\" className=\"fc-account-avatar\" />\n ) : (\n <span className=\"fc-account-avatar-placeholder\">{initial}</span>\n )}\n {!compact && (\n <span>{user.displayName ?? user.primaryEmail ?? 'Account'}</span>\n )}\n </button>\n );\n }\n\n return (\n <button type=\"button\" className={className ?? 'fc-btn fc-btn-login'} onClick={openModal}>\n {loginLabel ?? 'Sign in'}\n </button>\n );\n}\n","import { useState, useCallback } from 'react';\nimport { useForgeConnect } from './use-forge-connect';\nimport type { User, AdminUser, Session, PaginatedResponse, UserStatus } from '../types';\n\nexport function useAdmin() {\n const { api, getAccessToken } = useForgeConnect();\n const [users, setUsers] = useState<PaginatedResponse<User> | null>(null);\n const [selectedUser, setSelectedUser] = useState<AdminUser | null>(null);\n const [userSessions, setUserSessions] = useState<Session[] | null>(null);\n const [loading, setLoading] = useState(false);\n\n const listUsers = useCallback(\n async (params?: { page?: number; limit?: number; search?: string }) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.adminListUsers(token, params);\n setUsers(data);\n return data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken],\n );\n\n const getUser = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.adminGetUser(token, id);\n setSelectedUser(data);\n return data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken],\n );\n\n const updateUserStatus = useCallback(\n async (id: string, status: UserStatus) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.adminUpdateUserStatus(token, id, status);\n // Refresh user detail if viewing same user\n if (selectedUser?.id === id) {\n await getUser(id);\n }\n },\n [api, getAccessToken, selectedUser?.id, getUser],\n );\n\n const getUserSessions = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.adminGetUserSessions(token, id);\n setUserSessions(data);\n return data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken],\n );\n\n const revokeUserSessions = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.adminRevokeUserSessions(token, id);\n setUserSessions([]);\n },\n [api, getAccessToken],\n );\n\n return {\n users,\n selectedUser,\n userSessions,\n loading,\n listUsers,\n getUser,\n updateUserStatus,\n getUserSessions,\n revokeUserSessions,\n };\n}\n","import { useState, useCallback } from 'react';\nimport { useForgeConnect } from './use-forge-connect';\nimport type { Role, RoleUser, UserRoleAssignment, PermissionDomains } from '../types';\n\nexport function useRoles() {\n const { api, getAccessToken } = useForgeConnect();\n const [roles, setRoles] = useState<Role[] | null>(null);\n const [selectedRole, setSelectedRole] = useState<Role | null>(null);\n const [userRoleAssignments, setUserRoleAssignments] = useState<UserRoleAssignment[] | null>(null);\n const [roleUsers, setRoleUsers] = useState<RoleUser[] | null>(null);\n const [permissionDomains, setPermissionDomains] = useState<PermissionDomains | null>(null);\n const [loading, setLoading] = useState(false);\n\n const listRoles = useCallback(\n async (tenantId?: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.adminListRoles(token, tenantId);\n setRoles(data.data);\n return data.data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken],\n );\n\n const getRoleUsers = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n const data = await api.adminGetRoleUsers(token, id);\n setRoleUsers(data.data);\n return data.data;\n },\n [api, getAccessToken],\n );\n\n const getRole = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.adminGetRole(token, id);\n setSelectedRole(data);\n // Also fetch users assigned to this role\n getRoleUsers(id).catch(() => {});\n return data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken, getRoleUsers],\n );\n\n const createRole = useCallback(\n async (data: { name: string; description?: string; permissions: string[]; tenantId?: string }) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n const role = await api.adminCreateRole(token, data);\n // Refresh list\n await listRoles(data.tenantId);\n return role;\n },\n [api, getAccessToken, listRoles],\n );\n\n const updateRole = useCallback(\n async (id: string, data: { name?: string; description?: string; permissions?: string[] }) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n const role = await api.adminUpdateRole(token, id, data);\n setSelectedRole(role);\n return role;\n },\n [api, getAccessToken],\n );\n\n const deleteRole = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.adminDeleteRole(token, id);\n if (selectedRole?.id === id) setSelectedRole(null);\n },\n [api, getAccessToken, selectedRole?.id],\n );\n\n const getPermissions = useCallback(\n async () => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n const data = await api.adminGetPermissions(token);\n setPermissionDomains(data.domains);\n return data.domains;\n },\n [api, getAccessToken],\n );\n\n const getUserRoles = useCallback(\n async (userId: string, tenantId?: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.adminGetUserRoles(token, userId, tenantId);\n setUserRoleAssignments(data.data);\n return data.data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken],\n );\n\n const assignRole = useCallback(\n async (userId: string, roleId: string, tenantId?: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.adminAssignRole(token, userId, roleId, tenantId);\n },\n [api, getAccessToken],\n );\n\n const revokeRole = useCallback(\n async (userId: string, roleId: string, tenantId?: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.adminRevokeRole(token, userId, roleId, tenantId);\n },\n [api, getAccessToken],\n );\n\n return {\n roles,\n selectedRole,\n roleUsers,\n userRoleAssignments,\n permissionDomains,\n loading,\n listRoles,\n getRole,\n getRoleUsers,\n createRole,\n updateRole,\n deleteRole,\n getPermissions,\n getUserRoles,\n assignRole,\n revokeRole,\n };\n}\n","/**\n * Client-side permission checking utilities.\n * These mirror the server-side logic for UI gating.\n */\n\n/** Check if a single required permission is satisfied by any of the granted permissions. */\nexport function hasPermission(required: string, granted: string[]): boolean {\n for (const g of granted) {\n if (g === '*') return true;\n if (g === required) return true;\n if (g.endsWith(':*')) {\n const gDomain = g.slice(0, -2);\n const rDomain = required.split(':')[0];\n if (gDomain === rDomain) return true;\n }\n }\n return false;\n}\n\n/** Check that ALL required permissions are satisfied. */\nexport function hasAllPermissions(required: string[], granted: string[]): boolean {\n return required.every(r => hasPermission(r, granted));\n}\n\n/** Check that at least ONE of the required permissions is satisfied. */\nexport function hasAnyPermission(required: string[], granted: string[]): boolean {\n return required.some(r => hasPermission(r, granted));\n}\n"],"mappings":"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","names":["useState","useCallback","useEffect","useRef","useMemo","useState","jsx","jsxs","useState","useRef","jsx","jsxs","useState","useRef","useState","useRef","jsx","jsxs","useState","useRef","useState","jsx","jsxs","useState","useState","useRef","useEffect","useCallback","jsx","jsxs","useState","useRef","useEffect","useCallback","useRef","useEffect","jsx","jsx","jsxs","Fragment","jsx","jsxs","useState","useState","useEffect","useRef","useCallback","useState","useCallback","useEffect","useRef","useState","useRef","useCallback","useEffect","useState","useCallback","useState","useCallback","useState","useCallback","useState","useCallback","useState","useEffect","Fragment","jsx","jsxs","useState","useEffect","useState","useEffect","useCallback","jsx","jsxs","useState","useCallback","useEffect","useState","useEffect","jsx","jsxs","Fragment","jsx","jsxs","useState","useEffect","useState","useEffect","Fragment","jsx","jsxs","useState","useEffect","jsx","jsxs","useState","useRef","useEffect","useCallback","useState","useEffect","useMemo","useRef","useCallback","Fragment","jsx","jsxs","useState","useEffect","SuccessView","EmailIcon","useMemo","useRef","useCallback","jsx","jsxs","useState","useRef","useCallback","useEffect","challengeId","res","useMemo","jsx","jsx","jsxs","useState","useCallback","useState","useCallback","useState","useCallback","useState","useCallback"]}
1
+ {"version":3,"sources":["../src/provider.tsx","../src/context.ts","../src/api/client.ts","../src/utils.ts","../src/components/login-modal.tsx","../src/hooks/use-forge-connect.ts","../src/components/modal-overlay.tsx","../src/components/tabs/email-password.tsx","../src/resolve-config.ts","../src/components/tabs/email-otp.tsx","../src/components/tabs/wallet-connect.tsx","../src/components/tabs/forgot-password.tsx","../src/components/tabs/verify-2fa.tsx","../src/components/svg-icon.tsx","../src/components/tabs/oauth-buttons.tsx","../src/components/account-modal.tsx","../src/hooks/use-user.ts","../src/hooks/use-wallets.ts","../src/lib/utils.ts","../src/hooks/use-sessions.ts","../src/components/two-factor-modal.tsx","../src/components/passkeys-modal.tsx","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/bufferToBase64URLString.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/base64URLStringToBuffer.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/browserSupportsWebAuthn.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/toPublicKeyCredentialDescriptor.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/isValidDomain.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/webAuthnError.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/identifyRegistrationError.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/webAuthnAbortService.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/toAuthenticatorAttachment.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/methods/startRegistration.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/browserSupportsWebAuthnAutofill.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/helpers/identifyAuthenticationError.js","../../../node_modules/.pnpm/@simplewebauthn+browser@13.2.2/node_modules/@simplewebauthn/browser/esm/methods/startAuthentication.js","../src/components/password-modal.tsx","../src/components/error-view.tsx","../src/components/delete-account-modal.tsx","../src/components/link-auth-modal.tsx","../src/components/login-button.tsx","../src/components/account-button.tsx","../src/hooks/use-admin.ts","../src/hooks/use-roles.ts","../src/lib/permissions.ts"],"sourcesContent":["import { useState, useCallback, useEffect, useRef, useMemo, type ReactNode } from 'react';\nimport { ForgeConnectContext, type ForgeConnectContextValue, type WalletAdapterContext } from './context.js';\nimport { createApiClient, ForgeConnectApiError } from './api/client.js';\nimport type { AuthState, ModalState, AccountModalState, LinkModalState, ForgeConnectConfig, User, ModalStep } from './types.js';\nimport { getRefreshDelay } from './utils.js';\nimport { LoginModal } from './components/login-modal.js';\nimport { AccountModal } from './components/account-modal.js';\nimport { LinkAuthModal } from './components/link-auth-modal.js';\nimport { resolveLoginMethods, resolveInitialStep, isOAuthMethod } from './resolve-config.js';\nimport { startRegistration, startAuthentication } from './runtime-imports.js';\nimport { uint8ArrayToBase58 } from './lib/utils.js';\n\ninterface ForgeConnectProviderProps {\n config: ForgeConnectConfig;\n children: ReactNode;\n /** Called when user successfully authenticates */\n onLogin?: (user: User) => void;\n /** Called when user logs out */\n onLogout?: () => void;\n /** Pass `useWallet()` from @solana/wallet-adapter-react to enable wallet login */\n walletAdapter?: WalletAdapterContext | null;\n}\n\nexport function ForgeConnectProvider({ config, children, onLogin, onLogout, walletAdapter }: ForgeConnectProviderProps) {\n const [auth, setAuth] = useState<AuthState>({\n status: 'loading',\n user: null,\n accessToken: null,\n });\n\n const [modal, setModal] = useState<ModalState>({\n isOpen: false,\n step: 'method-select',\n });\n\n const [accountModal, setAccountModal] = useState<AccountModalState>({ isOpen: false });\n const [linkModal, setLinkModal] = useState<LinkModalState>({ isOpen: false });\n const [challengeToken, setChallengeToken] = useState<string | null>(null);\n\n const apiRef = useRef(createApiClient(config.apiUrl));\n const refreshTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const api = apiRef.current;\n\n // ── Token Refresh Scheduling ──\n\n const scheduleRefresh = useCallback((token: string) => {\n if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);\n const delay = getRefreshDelay(token);\n if (delay === null) return;\n\n refreshTimerRef.current = setTimeout(async () => {\n try {\n const { accessToken } = await api.refresh();\n setAuth((prev) => ({ ...prev, accessToken }));\n scheduleRefresh(accessToken);\n } catch {\n // Refresh failed — log user out\n setAuth({ status: 'unauthenticated', user: null, accessToken: null });\n }\n }, delay);\n }, [api]);\n\n // ── Initialize from refresh cookie ──\n\n useEffect(() => {\n const init = async () => {\n try {\n const { accessToken } = await api.refresh();\n const user = await api.getMe(accessToken);\n setAuth({ status: 'authenticated', user, accessToken });\n scheduleRefresh(accessToken);\n } catch {\n setAuth({ status: 'unauthenticated', user: null, accessToken: null });\n }\n };\n init();\n\n return () => {\n if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);\n };\n }, [api, scheduleRefresh]);\n\n // ── OAuth popup/callback handler ──\n\n useEffect(() => {\n // Check if THIS window is the OAuth callback popup\n if (window.location.pathname === '/fc-oauth-callback') {\n const params = new URLSearchParams(window.location.search);\n\n // Link callback — no token, just success flag\n if (params.get('fc_link_success') && window.opener) {\n window.opener.postMessage(\n { type: 'fc_oauth_link_success', provider: params.get('fc_provider') },\n window.location.origin,\n );\n window.close();\n return;\n }\n\n // Auth code callback — exchange code for tokens (prevents token leakage in URLs)\n const authCode = params.get('fc_code');\n if (authCode && window.opener) {\n window.opener.postMessage(\n { type: 'fc_oauth_code', code: authCode },\n window.location.origin,\n );\n window.close();\n return;\n }\n }\n\n // Listen for messages from OAuth popup\n const handleMessage = async (event: MessageEvent) => {\n if (event.origin !== window.location.origin) return;\n\n if (event.data?.type !== 'fc_oauth_code') return;\n\n const code = event.data.code as string;\n if (!code) return;\n\n try {\n // Exchange the one-time auth code for tokens\n const result = await api.exchangeOAuthCode(code);\n\n if (result.requires2FA && result.challengeToken) {\n setChallengeToken(result.challengeToken);\n setModal({ isOpen: true, step: 'verify-2fa' });\n return;\n }\n\n const token = result.accessToken;\n if (!token) return;\n\n setModal({ isOpen: true, step: 'success' });\n const user = await api.getMe(token);\n setAuth({ status: 'authenticated', user, accessToken: token });\n scheduleRefresh(token);\n onLogin?.(user);\n setTimeout(() => {\n setModal({ isOpen: false, step: 'method-select' });\n }, 1500);\n } catch {\n // OAuth exchange failed\n }\n };\n\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [api, config.apiUrl, scheduleRefresh, onLogin]);\n\n // ── Legacy config warning ──\n\n useEffect(() => {\n if (config.loginMethods && config.loginMethods.length > 0) {\n const hasLegacy = config.oauthProviders || config.walletLogin !== undefined || config.passwordlessLogin !== undefined;\n if (hasLegacy) {\n console.warn(\n '[ForgeConnect] Both loginMethods and legacy fields (oauthProviders, walletLogin, passwordlessLogin) are set. loginMethods takes precedence.',\n );\n }\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n // ── Auth Actions ──\n\n const handleAuthSuccess = useCallback(\n async (token: string) => {\n const user = await api.getMe(token);\n setAuth({ status: 'authenticated', user, accessToken: token });\n scheduleRefresh(token);\n // Show success screen, then auto-close\n setModal({ isOpen: true, step: 'success' });\n onLogin?.(user);\n setTimeout(() => {\n setModal({ isOpen: false, step: 'method-select' });\n }, 1500);\n },\n [api, scheduleRefresh, onLogin],\n );\n\n const loginWithEmail = useCallback(\n async (email: string, password: string) => {\n const res = await api.login(email, password);\n if (res.requires2FA) {\n setChallengeToken(res.challengeToken!);\n setModal((prev) => ({ ...prev, step: 'verify-2fa' }));\n return;\n }\n await handleAuthSuccess(res.accessToken!);\n },\n [api, handleAuthSuccess],\n );\n\n const register = useCallback(\n async (email: string, password: string, displayName?: string) => {\n await api.register(email, password, displayName);\n // Registration sends verification email, no token returned\n },\n [api],\n );\n\n const sendOtp = useCallback(\n async (email: string) => {\n await api.sendOtp(email);\n },\n [api],\n );\n\n const verifyOtp = useCallback(\n async (email: string, code: string) => {\n const res = await api.verifyOtp(email, code);\n if (res.requires2FA) {\n setChallengeToken(res.challengeToken!);\n setModal((prev) => ({ ...prev, step: 'verify-2fa' }));\n return;\n }\n await handleAuthSuccess(res.accessToken!);\n },\n [api, handleAuthSuccess],\n );\n\n const loginWithWallet = useCallback(\n async (\n walletAddress: string,\n signMessage: ((message: Uint8Array) => Promise<Uint8Array>) | undefined,\n chain: string = 'solana',\n signTransaction?: (txBase64: string) => Promise<string>,\n ) => {\n // If signMessage is available, use the standard message-signing flow\n if (signMessage) {\n const { challengeId, message: challengeMessage } = await api.walletChallenge(walletAddress, chain);\n const message = new TextEncoder().encode(challengeMessage);\n const signatureBytes = await signMessage(message);\n const signature = chain === 'solana'\n ? uint8ArrayToBase58(signatureBytes)\n : Array.from(signatureBytes).map((b) => b.toString(16).padStart(2, '0')).join('');\n const res = await api.walletVerify(challengeId, signature, walletAddress);\n if (res.requires2FA) {\n setChallengeToken(res.challengeToken!);\n setModal((prev) => ({ ...prev, step: 'verify-2fa' }));\n return;\n }\n await handleAuthSuccess(res.accessToken!);\n return;\n }\n\n // Fallback: transaction-based signing (hardware wallets)\n if (!signTransaction) {\n throw new Error('Wallet does not support message signing or transaction signing.');\n }\n\n const { challengeId, transaction: txBase64 } = await api.walletChallengeTx(walletAddress, chain);\n const signedTxBase64 = await signTransaction(txBase64);\n\n const res = await api.walletVerifyTx(challengeId, signedTxBase64, walletAddress);\n if (res.requires2FA) {\n setChallengeToken(res.challengeToken!);\n setModal((prev) => ({ ...prev, step: 'verify-2fa' }));\n return;\n }\n await handleAuthSuccess(res.accessToken!);\n },\n [api, handleAuthSuccess],\n );\n\n const loginWithOAuth = useCallback(\n (provider: string) => {\n const callbackUrl = `${config.apiUrl}/auth/oauth/${provider}`;\n const redirectUri = encodeURIComponent(window.location.origin + '/fc-oauth-callback');\n const url = `${callbackUrl}?redirect_uri=${redirectUri}`;\n const width = 500;\n const height = 600;\n const left = window.screenX + (window.innerWidth - width) / 2;\n const top = window.screenY + (window.innerHeight - height) / 2;\n const popup = window.open(url, 'fc_oauth', `width=${width},height=${height},left=${left},top=${top}`);\n setModal({ isOpen: true, step: 'oauth' });\n\n // Poll for popup close — revert to method-select if user closes it\n if (popup) {\n const poll = setInterval(() => {\n if (popup.closed) {\n clearInterval(poll);\n setModal((prev) => prev.step === 'oauth' ? { isOpen: true, step: 'method-select' } : prev);\n }\n }, 500);\n }\n },\n [config.apiUrl],\n );\n\n const logout = useCallback(async () => {\n const token = auth.accessToken;\n if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);\n setAuth({ status: 'unauthenticated', user: null, accessToken: null });\n onLogout?.();\n if (token) {\n try {\n await api.logout(token);\n } catch {\n // Already logged out client-side\n }\n }\n }, [auth.accessToken, api, onLogout]);\n\n const forgotPassword = useCallback(\n async (email: string) => {\n await api.forgotPassword(email);\n },\n [api],\n );\n\n const resetPassword = useCallback(\n async (token: string, password: string) => {\n await api.resetPassword(token, password);\n },\n [api],\n );\n\n const verifyEmailToken = useCallback(\n async (token: string) => {\n const res = await api.verifyEmailToken(token);\n if (res.requires2FA) {\n setChallengeToken(res.challengeToken!);\n setModal({ isOpen: true, step: 'verify-2fa' });\n return;\n }\n await handleAuthSuccess(res.accessToken!);\n },\n [api, handleAuthSuccess],\n );\n\n const loginWithPasskey = useCallback(async () => {\n const { options, challengeKey } = await api.getPasskeyLoginOptions(config.webauthnRpId);\n const authResponse = await startAuthentication({ optionsJSON: options });\n const { accessToken } = await api.verifyPasskeyLogin(challengeKey, authResponse, config.webauthnRpId, config.webauthnOrigin);\n await handleAuthSuccess(accessToken);\n }, [api, handleAuthSuccess, config.webauthnRpId, config.webauthnOrigin]);\n\n const verify2FA = useCallback(async (code: string) => {\n if (!challengeToken) throw new Error('No 2FA challenge active');\n const { accessToken } = await api.verify2FA(challengeToken, code);\n setChallengeToken(null);\n await handleAuthSuccess(accessToken);\n }, [api, challengeToken, handleAuthSuccess]);\n\n const verifyRecoveryCode = useCallback(async (code: string) => {\n if (!challengeToken) throw new Error('No 2FA challenge active');\n const { accessToken } = await api.verifyRecoveryCode(challengeToken, code);\n setChallengeToken(null);\n await handleAuthSuccess(accessToken);\n }, [api, challengeToken, handleAuthSuccess]);\n\n const logoutAll = useCallback(async () => {\n const token = auth.accessToken;\n if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);\n setAuth({ status: 'unauthenticated', user: null, accessToken: null });\n onLogout?.();\n if (token) {\n try {\n await api.logoutAll(token);\n } catch {\n // Already logged out client-side\n }\n }\n }, [auth.accessToken, api, onLogout]);\n\n // ── Modal Actions ──\n\n const openModal = useCallback(() => {\n const methods = resolveLoginMethods(config);\n\n // Single OAuth method — fire popup directly, skip modal\n if (methods.length === 1 && isOAuthMethod(methods[0])) {\n loginWithOAuth(methods[0]);\n return;\n }\n\n // Default OAuth method — fire popup directly\n if (config.defaultLoginMethod && isOAuthMethod(config.defaultLoginMethod) && methods.includes(config.defaultLoginMethod)) {\n loginWithOAuth(config.defaultLoginMethod);\n return;\n }\n\n const step = resolveInitialStep(config, methods);\n setModal({ isOpen: true, step });\n }, [config, loginWithOAuth]);\n\n const closeModal = useCallback(() => {\n setModal({ isOpen: false, step: 'method-select' });\n }, []);\n\n const setModalStep = useCallback((step: ModalStep) => {\n setModal((prev) => ({ ...prev, step }));\n }, []);\n\n const openAccountModal = useCallback(() => {\n setAccountModal({ isOpen: true });\n }, []);\n\n const closeAccountModal = useCallback(() => {\n setAccountModal({ isOpen: false });\n }, []);\n\n const openLinkModal = useCallback((mode?: 'auth' | 'wallet') => {\n setLinkModal({ isOpen: true, mode: mode ?? 'auth' });\n }, []);\n\n const closeLinkModal = useCallback(() => {\n setLinkModal({ isOpen: false });\n }, []);\n\n const getAccessToken = useCallback(() => auth.accessToken, [auth.accessToken]);\n\n // ── Context Value (memoized to avoid unnecessary re-renders) ──\n\n const value: ForgeConnectContextValue = useMemo(() => ({\n auth,\n modal,\n config,\n api,\n loginWithEmail,\n register,\n sendOtp,\n verifyOtp,\n loginWithWallet,\n loginWithOAuth,\n loginWithPasskey,\n logout,\n logoutAll,\n forgotPassword,\n resetPassword,\n verifyEmailToken,\n challengeToken,\n verify2FA,\n verifyRecoveryCode,\n openModal,\n closeModal,\n setModalStep,\n accountModal,\n openAccountModal,\n closeAccountModal,\n linkModal,\n openLinkModal,\n closeLinkModal,\n getAccessToken,\n walletAdapter: walletAdapter ?? null,\n }), [\n auth, modal, config, api, challengeToken, accountModal, linkModal,\n loginWithEmail, register, sendOtp, verifyOtp, loginWithWallet,\n loginWithOAuth, loginWithPasskey, logout, logoutAll, forgotPassword,\n resetPassword, verifyEmailToken, verify2FA, verifyRecoveryCode,\n openModal, closeModal, setModalStep, openAccountModal, closeAccountModal,\n openLinkModal, closeLinkModal, getAccessToken, walletAdapter,\n ]);\n\n return (\n <ForgeConnectContext.Provider value={value}>\n {children}\n <LoginModal />\n <AccountModal />\n <LinkAuthModal />\n </ForgeConnectContext.Provider>\n );\n}\n\n","import { createContext } from 'react';\nimport type { AuthState, ModalState, AccountModalState, LinkModalState, ForgeConnectConfig } from './types';\nimport type { ApiClient } from './api/client';\n\nexport interface ForgeConnectContextValue {\n // State\n auth: AuthState;\n modal: ModalState;\n config: ForgeConnectConfig;\n api: ApiClient;\n\n // Auth actions\n loginWithEmail: (email: string, password: string) => Promise<void>;\n register: (email: string, password: string, displayName?: string) => Promise<void>;\n sendOtp: (email: string) => Promise<void>;\n verifyOtp: (email: string, code: string) => Promise<void>;\n loginWithWallet: (walletAddress: string, signMessage: ((message: Uint8Array) => Promise<Uint8Array>) | undefined, chain?: string, signTransaction?: (txBase64: string) => Promise<string>) => Promise<void>;\n loginWithOAuth: (provider: string) => void;\n loginWithPasskey: () => Promise<void>;\n logout: () => Promise<void>;\n logoutAll: () => Promise<void>;\n forgotPassword: (email: string) => Promise<void>;\n resetPassword: (token: string, password: string) => Promise<void>;\n verifyEmailToken: (token: string) => Promise<void>;\n\n // 2FA\n challengeToken: string | null;\n verify2FA: (code: string) => Promise<void>;\n verifyRecoveryCode: (code: string) => Promise<void>;\n\n // Modal actions\n openModal: () => void;\n closeModal: () => void;\n setModalStep: (step: ModalState['step']) => void;\n\n // Account modal\n accountModal: AccountModalState;\n openAccountModal: () => void;\n closeAccountModal: () => void;\n\n // Link modal\n linkModal: LinkModalState;\n openLinkModal: (mode?: 'auth' | 'wallet') => void;\n closeLinkModal: () => void;\n\n // Token\n getAccessToken: () => string | null;\n\n // Wallet adapter (optional, injected by consumer)\n walletAdapter: WalletAdapterContext | null;\n}\n\nexport interface WalletAdapterContext {\n publicKey: { toBase58(): string } | null;\n signMessage: ((message: Uint8Array) => Promise<Uint8Array>) | undefined;\n signTransaction: ((transaction: any) => Promise<any>) | undefined;\n wallets: Array<{ adapter: { name: string; icon: string; connected: boolean; publicKey?: { toBase58(): string } | null }; readyState: string }>;\n select: (name: string) => void;\n connect: () => Promise<void>;\n}\n\nexport const ForgeConnectContext = createContext<ForgeConnectContextValue | null>(null);\n","import type { ApiErrorBody, User, AdminUser, Session, PaginatedResponse, UserStatus, TokenVerificationResult, WalletUserResult, TotpSetup, Passkey, Role, RoleUser, UserRoleAssignment, PermissionDomains } from '../types';\n\nexport class ForgeConnectApiError extends Error {\n public readonly status: number;\n public readonly code: string;\n\n constructor(status: number, code: string, message: string) {\n super(message);\n this.name = 'ForgeConnectApiError';\n this.status = status;\n this.code = code;\n }\n}\n\nexport function createApiClient(apiUrl: string) {\n const base = apiUrl.replace(/\\/+$/, '');\n\n // Request deduplication: prevents duplicate concurrent GET requests\n const inflightRequests = new Map<string, Promise<any>>();\n\n async function request<T>(\n path: string,\n options: {\n method?: string;\n body?: unknown;\n token?: string | null;\n } = {},\n ): Promise<T> {\n const { method = 'GET', body, token } = options;\n\n // Deduplicate identical concurrent GET requests\n if (method === 'GET' && token) {\n const dedupKey = `${path}:${token}`;\n const inflight = inflightRequests.get(dedupKey);\n if (inflight) return inflight as Promise<T>;\n const promise = doRequest<T>(path, options).finally(() => {\n inflightRequests.delete(dedupKey);\n });\n inflightRequests.set(dedupKey, promise);\n return promise;\n }\n\n return doRequest<T>(path, options);\n }\n\n async function doRequest<T>(\n path: string,\n options: {\n method?: string;\n body?: unknown;\n token?: string | null;\n } = {},\n ): Promise<T> {\n const { method = 'GET', body, token } = options;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n const res = await fetch(`${base}${path}`, {\n method,\n headers,\n credentials: 'include',\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n let errorBody: ApiErrorBody;\n try {\n errorBody = await res.json() as ApiErrorBody;\n } catch {\n throw new ForgeConnectApiError(res.status, 'UNKNOWN', res.statusText);\n }\n throw new ForgeConnectApiError(res.status, errorBody.error.code, errorBody.error.message);\n }\n\n return res.json() as Promise<T>;\n }\n\n async function serviceRequest<T>(\n path: string,\n options: {\n method?: string;\n body?: unknown;\n serviceKey: string;\n },\n ): Promise<T> {\n const { method = 'GET', body, serviceKey } = options;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-service-key': serviceKey,\n };\n\n const res = await fetch(`${base}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n let errorBody: ApiErrorBody;\n try {\n errorBody = await res.json() as ApiErrorBody;\n } catch {\n throw new ForgeConnectApiError(res.status, 'UNKNOWN', res.statusText);\n }\n throw new ForgeConnectApiError(res.status, errorBody.error.code, errorBody.error.message);\n }\n\n return res.json() as Promise<T>;\n }\n\n return {\n // ── Auth: Email ──\n register(email: string, password: string, displayName?: string) {\n return request<{ success: true }>('/auth/email/register', {\n method: 'POST',\n body: { email, password, displayName },\n });\n },\n\n login(email: string, password: string) {\n return request<{ accessToken?: string; requires2FA?: boolean; challengeToken?: string; user?: { id: string; displayName: string | null; email: string } }>(\n '/auth/email/login',\n { method: 'POST', body: { email, password } },\n );\n },\n\n sendOtp(email: string) {\n return request<{ success: true }>('/auth/email/send-code', {\n method: 'POST',\n body: { email },\n });\n },\n\n verifyOtp(email: string, code: string) {\n return request<{ accessToken?: string; requires2FA?: boolean; challengeToken?: string; user?: { id: string; email: string } }>(\n '/auth/email/verify-code',\n { method: 'POST', body: { email, code } },\n );\n },\n\n // ── Auth: Wallet ──\n walletChallenge(walletAddress: string, chain: string = 'solana') {\n return request<{ challengeId: string; message: string }>('/auth/wallet/challenge', {\n method: 'POST',\n body: { walletAddress, chain },\n });\n },\n\n walletVerify(challengeId: string, signature: string, walletAddress: string) {\n return request<{ accessToken?: string; requires2FA?: boolean; challengeToken?: string }>('/auth/wallet/verify', {\n method: 'POST',\n body: { challengeId, signature, walletAddress },\n });\n },\n\n walletChallengeTx(walletAddress: string, chain: string = 'solana') {\n return request<{ challengeId: string; transaction: string }>('/auth/wallet/challenge-tx', {\n method: 'POST',\n body: { walletAddress, chain },\n });\n },\n\n walletVerifyTx(challengeId: string, signedTransaction: string, walletAddress: string) {\n return request<{ accessToken?: string; requires2FA?: boolean; challengeToken?: string }>('/auth/wallet/verify-tx', {\n method: 'POST',\n body: { challengeId, signedTransaction, walletAddress },\n });\n },\n\n // ── Auth: OAuth ──\n exchangeOAuthCode(code: string) {\n return request<{ accessToken?: string; requires2FA?: boolean; challengeToken?: string; userId?: string }>('/auth/oauth/exchange', {\n method: 'POST',\n body: { code },\n });\n },\n\n createLinkIntent(token: string) {\n return request<{ intentToken: string }>('/auth/oauth/link-intent', {\n method: 'POST',\n token,\n });\n },\n\n // ── Auth: Session ──\n refresh() {\n return request<{ accessToken: string }>('/auth/refresh', { method: 'POST' });\n },\n\n logout(token: string) {\n return request<{ success: true }>('/auth/logout', { method: 'POST', token });\n },\n\n logoutAll(token: string) {\n return request<{ success: true }>('/auth/logout-all', { method: 'POST', token });\n },\n\n // ── User ──\n getMe(token: string) {\n return request<{ id: string; displayName: string | null; avatarUrl: string | null; primaryEmail: string | null; status: string; createdAt: string; updatedAt: string }>(\n '/users/me',\n { token },\n );\n },\n\n updateMe(token: string, data: { displayName?: string; avatarUrl?: string }) {\n return request<{ id: string; displayName: string | null; avatarUrl: string | null; primaryEmail: string | null; status: string; createdAt: string; updatedAt: string }>(\n '/users/me',\n { method: 'PATCH', token, body: data },\n );\n },\n\n setPassword(token: string, newPassword: string, currentPassword?: string) {\n return request<{ success: true }>('/users/me/password', {\n method: 'POST',\n token,\n body: { newPassword, ...(currentPassword ? { currentPassword } : {}) },\n });\n },\n\n getAuthMethods(token: string) {\n return request<Array<{ id: string; provider: string; providerId: string; providerUsername: string | null; isVerified: boolean; verifiedAt: string | null; createdAt: string }>>(\n '/users/me/auth-methods',\n { token },\n );\n },\n\n linkAuthMethod(token: string, data: { provider: string; email?: string; password?: string; challengeId?: string; signature?: string; signedTransaction?: string; walletAddress?: string }) {\n return request<{ success: true }>('/users/me/auth-methods', {\n method: 'POST',\n token,\n body: data,\n });\n },\n\n linkOtpSend(token: string, email: string) {\n return request<{ success: true }>('/users/me/auth-methods/otp/send', {\n method: 'POST',\n token,\n body: { email },\n });\n },\n\n linkOtpVerify(token: string, email: string, code: string) {\n return request<{ success: true }>('/users/me/auth-methods/otp/verify', {\n method: 'POST',\n token,\n body: { email, code },\n });\n },\n\n unlinkAuthMethod(token: string, id: string) {\n return request<{ success: true }>(`/users/me/auth-methods/${id}`, {\n method: 'DELETE',\n token,\n });\n },\n\n getWallets(token: string) {\n return request<Array<{ id: string; userId: string; chain: string; address: string; label: string | null; isPrimary: boolean; verifiedAt: string | null; lastUsedAt: string | null }>>(\n '/users/me/wallets',\n { token },\n );\n },\n\n updateWallet(token: string, id: string, data: { label?: string; isPrimary?: boolean }) {\n return request<{ id: string; userId: string; chain: string; address: string; label: string | null; isPrimary: boolean; verifiedAt: string | null; lastUsedAt: string | null }>(\n `/users/me/wallets/${id}`,\n { method: 'PATCH', token, body: data },\n );\n },\n\n getSessions(token: string) {\n return request<Array<{ id: string; createdAt: string; expiresAt: string; lastActiveAt: string; deviceInfo: Record<string, unknown> | null; ipAddress: string }>>(\n '/users/me/sessions',\n { token },\n );\n },\n\n revokeSession(token: string, id: string) {\n return request<{ success: true }>(`/users/me/sessions/${id}`, {\n method: 'DELETE',\n token,\n });\n },\n\n // ── Auth: Email Verification & Password Reset ──\n verifyEmailToken(token: string) {\n return request<{ accessToken?: string; requires2FA?: boolean; challengeToken?: string }>('/auth/email/verify', {\n method: 'POST',\n body: { token },\n });\n },\n\n forgotPassword(email: string) {\n return request<{ success: true }>('/auth/email/forgot-password', {\n method: 'POST',\n body: { email },\n });\n },\n\n resetPassword(token: string, password: string) {\n return request<{ success: true }>('/auth/email/reset-password', {\n method: 'POST',\n body: { token, password },\n });\n },\n\n // ── 2FA ──\n get2FAStatus(token: string) {\n return request<{ enabled: boolean }>('/users/me/2fa/status', { token });\n },\n\n setup2FA(token: string) {\n return request<TotpSetup>('/users/me/2fa/setup', { method: 'POST', token });\n },\n\n enable2FA(token: string, code: string) {\n return request<{ success: true }>('/users/me/2fa/enable', { method: 'POST', token, body: { code } });\n },\n\n disable2FA(token: string, code: string) {\n return request<{ success: true }>('/users/me/2fa', { method: 'DELETE', token, body: { code } });\n },\n\n verify2FA(challengeToken: string, code: string) {\n return request<{ accessToken: string }>('/auth/2fa/verify', { method: 'POST', body: { challengeToken, code } });\n },\n\n verifyRecoveryCode(challengeToken: string, code: string) {\n return request<{ accessToken: string }>('/auth/2fa/verify-recovery', { method: 'POST', body: { challengeToken, code } });\n },\n\n regenerateRecoveryCodes(token: string, code: string) {\n return request<{ recoveryCodes: string[] }>('/users/me/2fa/recovery-codes', { method: 'POST', token, body: { code } });\n },\n\n // ── Passkeys ──\n getPasskeys(token: string) {\n return request<Passkey[]>('/users/me/passkeys', { token });\n },\n\n getPasskeyRegisterOptions(token: string, rpId?: string, origin?: string) {\n return request<{ options: any; challengeKey: string }>('/auth/passkeys/register/options', { method: 'POST', token, body: { rpId, origin } });\n },\n\n verifyPasskeyRegistration(token: string, challengeKey: string, response: any, name?: string, rpId?: string, origin?: string) {\n return request<Passkey>('/auth/passkeys/register/verify', { method: 'POST', token, body: { challengeKey, response, name, rpId, origin } });\n },\n\n getPasskeyLoginOptions(rpId?: string) {\n return request<{ options: any; challengeKey: string }>('/auth/passkeys/login/options', { method: 'POST', body: { rpId } });\n },\n\n verifyPasskeyLogin(challengeKey: string, response: any, rpId?: string, origin?: string) {\n return request<{ accessToken: string }>('/auth/passkeys/login/verify', { method: 'POST', body: { challengeKey, response, rpId, origin } });\n },\n\n renamePasskey(token: string, id: string, name: string) {\n return request<Passkey>(`/users/me/passkeys/${id}`, { method: 'PATCH', token, body: { name } });\n },\n\n deletePasskey(token: string, id: string) {\n return request<{ success: true }>(`/users/me/passkeys/${id}`, { method: 'DELETE', token });\n },\n\n // ── Account Deletion ──\n requestAccountDeletion(token: string) {\n return request<{ requiresVerification: boolean }>('/users/me/delete-request', {\n method: 'POST',\n token,\n });\n },\n\n confirmAccountDeletion(token: string, code?: string) {\n return request<{ success: true }>('/users/me/delete-confirm', {\n method: 'POST',\n token,\n body: code ? { code } : {},\n });\n },\n\n // ── Admin ──\n adminListUsers(token: string, params?: { page?: number; limit?: number; search?: string }) {\n const query = new URLSearchParams();\n if (params?.page) query.set('page', String(params.page));\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.search) query.set('search', params.search);\n const qs = query.toString();\n return request<PaginatedResponse<User>>(`/admin/users${qs ? `?${qs}` : ''}`, { token });\n },\n\n adminGetUser(token: string, id: string) {\n return request<AdminUser>(`/admin/users/${id}`, { token });\n },\n\n adminUpdateUserStatus(token: string, id: string, status: UserStatus) {\n return request<{ success: true }>(`/admin/users/${id}/status`, {\n method: 'PATCH',\n token,\n body: { status },\n });\n },\n\n adminGetUserSessions(token: string, id: string) {\n return request<Session[]>(`/admin/users/${id}/sessions`, { token });\n },\n\n adminRevokeUserSessions(token: string, id: string) {\n return request<{ success: true }>(`/admin/users/${id}/sessions`, {\n method: 'DELETE',\n token,\n });\n },\n\n // ── Roles ──\n adminListRoles(token: string, tenantId?: string) {\n const query = new URLSearchParams();\n if (tenantId) query.set('tenantId', tenantId);\n const qs = query.toString();\n return request<{ data: Role[] }>(`/admin/roles${qs ? `?${qs}` : ''}`, { token });\n },\n\n adminGetRole(token: string, id: string) {\n return request<Role>(`/admin/roles/${id}`, { token });\n },\n\n adminGetRoleUsers(token: string, id: string) {\n return request<{ data: RoleUser[] }>(`/admin/roles/${id}/users`, { token });\n },\n\n adminCreateRole(token: string, data: { name: string; description?: string; permissions: string[]; tenantId?: string }) {\n return request<Role>('/admin/roles', { method: 'POST', token, body: data });\n },\n\n adminUpdateRole(token: string, id: string, data: { name?: string; description?: string; permissions?: string[] }) {\n return request<Role>(`/admin/roles/${id}`, { method: 'PATCH', token, body: data });\n },\n\n adminDeleteRole(token: string, id: string) {\n return request<{ success: true }>(`/admin/roles/${id}`, { method: 'DELETE', token });\n },\n\n adminGetPermissions(token: string) {\n return request<{ domains: PermissionDomains }>('/admin/roles/permissions', { token });\n },\n\n adminGetUserRoles(token: string, userId: string, tenantId?: string) {\n const query = new URLSearchParams();\n if (tenantId) query.set('tenantId', tenantId);\n const qs = query.toString();\n return request<{ data: UserRoleAssignment[] }>(`/admin/users/${userId}/roles${qs ? `?${qs}` : ''}`, { token });\n },\n\n adminAssignRole(token: string, userId: string, roleId: string, tenantId?: string) {\n return request<{ success: true }>(`/admin/users/${userId}/roles`, {\n method: 'POST',\n token,\n body: { roleId, ...(tenantId ? { tenantId } : {}) },\n });\n },\n\n adminRevokeRole(token: string, userId: string, roleId: string, tenantId?: string) {\n const query = new URLSearchParams();\n if (tenantId) query.set('tenantId', tenantId);\n const qs = query.toString();\n return request<{ success: true }>(`/admin/users/${userId}/roles/${roleId}${qs ? `?${qs}` : ''}`, {\n method: 'DELETE',\n token,\n });\n },\n\n // ── Service ──\n serviceVerifyToken(serviceKey: string, accessToken: string, tenantId?: string) {\n return serviceRequest<TokenVerificationResult>('/service/verify-token', {\n method: 'POST',\n serviceKey,\n body: { token: accessToken, ...(tenantId ? { tenantId } : {}) },\n });\n },\n\n serviceUserByWallet(serviceKey: string, walletAddress: string, chain?: string) {\n return serviceRequest<WalletUserResult>('/service/user-by-wallet', {\n method: 'POST',\n serviceKey,\n body: { walletAddress, chain },\n });\n },\n };\n}\n\nexport type ApiClient = ReturnType<typeof createApiClient>;\n","interface DecodedJWT {\n sub: string;\n tid?: string;\n scopes: string[];\n iat?: number;\n exp?: number;\n}\n\nexport function decodeJWT(token: string): DecodedJWT | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n const payload = JSON.parse(atob(parts[1].replace(/-/g, '+').replace(/_/g, '/')));\n return payload as DecodedJWT;\n } catch {\n return null;\n }\n}\n\n/**\n * Returns milliseconds until 80% of the token's TTL has elapsed.\n * Returns null if the token cannot be decoded or has no exp.\n */\nexport function getRefreshDelay(token: string): number | null {\n const decoded = decodeJWT(token);\n if (!decoded?.exp || !decoded.iat) return null;\n const ttl = (decoded.exp - decoded.iat) * 1000;\n const elapsed = Date.now() - decoded.iat * 1000;\n const delay = ttl * 0.8 - elapsed;\n return delay > 0 ? delay : 0;\n}\n","import { useState, type ReactNode } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { ModalOverlay } from './modal-overlay.js';\nimport { EmailLoginForm, EmailRegisterForm } from './tabs/email-password.js';\nimport { EmailOtpForm } from './tabs/email-otp.js';\nimport { WalletConnectForm } from './tabs/wallet-connect.js';\nimport { ForgotPasswordForm } from './tabs/forgot-password.js';\nimport { Verify2FAForm } from './tabs/verify-2fa.js';\nimport { OAuthButton } from './tabs/oauth-buttons.js';\nimport { resolveLoginMethods, isOAuthMethod } from '../resolve-config.js';\nimport type { LoginMethod } from '../types.js';\n\nexport function LoginModal() {\n const { modal, closeModal, config } = useForgeConnect();\n\n const renderStep = () => {\n switch (modal.step) {\n case 'email-login':\n return <EmailLoginForm />;\n case 'email-register':\n return <EmailRegisterForm />;\n case 'email-otp':\n return <EmailOtpForm />;\n case 'wallet-connect':\n return <WalletConnectForm />;\n case 'forgot-password':\n return <ForgotPasswordForm />;\n case 'verify-2fa':\n return <Verify2FAForm />;\n case 'oauth':\n return <OAuthLoadingView />;\n case 'success':\n return <SuccessView />;\n case 'method-select':\n default:\n return <MethodSelect />;\n }\n };\n\n const renderLogo = () => {\n if (config.appearance?.logoNode) {\n return <div className=\"fc-logo\">{config.appearance.logoNode as ReactNode}</div>;\n }\n if (config.appearance?.logo) {\n return <img src={config.appearance.logo} alt=\"\" className=\"fc-logo\" />;\n }\n return null;\n };\n\n return (\n <ModalOverlay isOpen={modal.isOpen} onClose={closeModal}>\n <div\n className=\"fc-modal-content\"\n style={{\n '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6',\n } as React.CSSProperties}\n data-theme={config.appearance?.theme ?? 'light'}\n >\n {modal.step === 'success' || modal.step === 'oauth' ? (\n renderStep()\n ) : (\n <>\n {renderLogo()}\n\n <h2 className=\"fc-modal-title\">\n {config.appearance?.title ?? 'Log in or sign up'}\n </h2>\n {renderStep()}\n {(config.appearance?.termsUrl || config.appearance?.privacyUrl) && (\n <p className=\"fc-legal\">\n By continuing, you agree to our{' '}\n {config.appearance.termsUrl && (\n <a href={config.appearance.termsUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"fc-legal-link\">Terms</a>\n )}\n {config.appearance.termsUrl && config.appearance.privacyUrl && ' and '}\n {config.appearance.privacyUrl && (\n <a href={config.appearance.privacyUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"fc-legal-link\">Privacy Policy</a>\n )}\n </p>\n )}\n </>\n )}\n </div>\n </ModalOverlay>\n );\n}\n\n// ── Icons ──\n\nconst EmailIcon = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon\">\n <rect x=\"2\" y=\"4\" width=\"16\" height=\"12\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2 6l8 5 8-5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </div>\n);\n\nconst OtpIcon = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon\">\n <rect x=\"3\" y=\"6\" width=\"14\" height=\"9\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <circle cx=\"6.5\" cy=\"10.5\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"10\" cy=\"10.5\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"13.5\" cy=\"10.5\" r=\"1\" fill=\"currentColor\" />\n </svg>\n </div>\n);\n\nconst WalletIcon = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon\">\n <rect x=\"2\" y=\"5\" width=\"16\" height=\"11\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <rect x=\"13\" y=\"9\" width=\"5\" height=\"3\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n </div>\n);\n\nconst PasskeyIcon = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon\">\n <circle cx=\"8\" cy=\"7\" r=\"3\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M13 13.5a5 5 0 0 0-10 0\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M15 10v4m0 0l-1.5-1m1.5 1l1.5-1\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </div>\n);\n\nconst LoadingSpinner = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon fc-spin\">\n <path d=\"M10 2a8 8 0 0 1 8 8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </div>\n);\n\n// ── Method Select ──\n\nfunction MethodSelect() {\n const { setModalStep, loginWithPasskey, config } = useForgeConnect();\n const methods = resolveLoginMethods(config);\n const [passkeyLoading, setPasskeyLoading] = useState(false);\n const [passkeyError, setPasskeyError] = useState('');\n\n const handlePasskey = async () => {\n setPasskeyLoading(true);\n setPasskeyError('');\n try {\n await loginWithPasskey();\n } catch (err: unknown) {\n setPasskeyError(err instanceof Error ? err.message : 'Passkey authentication failed.');\n } finally {\n setPasskeyLoading(false);\n }\n };\n\n // Build elements in config order, grouping consecutive OAuth providers\n const elements: ReactNode[] = [];\n let i = 0;\n\n while (i < methods.length) {\n const method = methods[i];\n\n if (isOAuthMethod(method)) {\n // Collect consecutive OAuth providers\n const oauthGroup: LoginMethod[] = [];\n while (i < methods.length && isOAuthMethod(methods[i])) {\n oauthGroup.push(methods[i]);\n i++;\n }\n\n // Add divider before OAuth group if there were non-OAuth elements before\n if (elements.length > 0) {\n elements.push(<div key={`div-before-${oauthGroup[0]}`} className=\"fc-divider\"><span>or</span></div>);\n }\n\n elements.push(\n <div key={`oauth-${oauthGroup.join('-')}`} className=\"fc-oauth-group\">\n {oauthGroup.map((p) => (\n <OAuthButton key={p} provider={p as any} />\n ))}\n </div>,\n );\n } else {\n // Add divider after an OAuth group\n if (elements.length > 0) {\n const prev = methods[i - 1];\n if (prev && isOAuthMethod(prev)) {\n elements.push(<div key={`div-after-${prev}`} className=\"fc-divider\"><span>or</span></div>);\n }\n }\n\n switch (method) {\n case 'email':\n elements.push(\n <button key=\"email\" type=\"button\" className=\"fc-btn fc-btn-method\" onClick={() => setModalStep('email-login')}>\n <EmailIcon /> <span className=\"fc-btn-name\">Password</span>\n </button>,\n );\n break;\n case 'otp':\n elements.push(\n <button key=\"otp\" type=\"button\" className=\"fc-btn fc-btn-method\" onClick={() => setModalStep('email-otp')}>\n <OtpIcon /> <span className=\"fc-btn-name\">Magic code</span>\n </button>,\n );\n break;\n case 'wallet':\n elements.push(\n <button key=\"wallet\" type=\"button\" className=\"fc-btn fc-btn-method\" onClick={() => setModalStep('wallet-connect')}>\n <WalletIcon /> <span className=\"fc-btn-name\">Wallet</span>\n </button>,\n );\n break;\n case 'passkey':\n elements.push(\n <button key=\"passkey\" type=\"button\" className=\"fc-btn fc-btn-method\" onClick={handlePasskey} disabled={passkeyLoading}>\n {passkeyLoading ? <LoadingSpinner /> : <PasskeyIcon />}\n <span className=\"fc-btn-name\">{passkeyLoading ? 'Waiting for passkey...' : 'Passkey'}</span>\n </button>,\n );\n break;\n }\n i++;\n }\n }\n\n return (\n <div className=\"fc-method-select\">\n {passkeyError && <p className=\"fc-error\">{passkeyError}</p>}\n {elements}\n </div>\n );\n}\n\n// ── OAuth Loading View ──\n\nfunction OAuthLoadingView() {\n const { setModalStep } = useForgeConnect();\n\n return (\n <div className=\"fc-success\">\n <div className=\"fc-success-icon\">\n <svg width=\"52\" height=\"52\" viewBox=\"0 0 52 52\" className=\"fc-spin\">\n <circle cx=\"26\" cy=\"26\" r=\"24\" fill=\"none\" stroke=\"var(--fc-accent, #8b5cf6)\" strokeWidth=\"3\" strokeLinecap=\"round\" strokeDasharray=\"100\" strokeDashoffset=\"30\" />\n </svg>\n </div>\n <p className=\"fc-success-text\">Completing sign in...</p>\n <button type=\"button\" className=\"fc-btn fc-btn-secondary\" style={{ marginTop: '16px' }} onClick={() => setModalStep('method-select')}>\n Cancel\n </button>\n </div>\n );\n}\n\n// ── Success View ──\n\nfunction SuccessView() {\n return (\n <div className=\"fc-success\">\n <div className=\"fc-success-icon\">\n <svg viewBox=\"0 0 52 52\" className=\"fc-success-check\">\n <circle className=\"fc-success-circle\" cx=\"26\" cy=\"26\" r=\"24\" fill=\"none\" />\n <path className=\"fc-success-tick\" fill=\"none\" d=\"M15 26l7.5 7.5L37 19\" />\n </svg>\n </div>\n <p className=\"fc-success-text\">You're in</p>\n </div>\n );\n}\n","import { useContext } from 'react';\nimport { ForgeConnectContext, type ForgeConnectContextValue } from '../context';\n\nexport function useForgeConnect(): ForgeConnectContextValue {\n const ctx = useContext(ForgeConnectContext);\n if (!ctx) {\n throw new Error('useForgeConnect must be used within a <ForgeConnectProvider>');\n }\n return ctx;\n}\n","import { useEffect, useRef, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\n\ninterface ModalOverlayProps {\n isOpen: boolean;\n onClose: () => void;\n children: ReactNode;\n}\n\nexport function ModalOverlay({ isOpen, onClose, children }: ModalOverlayProps) {\n const overlayRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!isOpen) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handleKeyDown);\n document.body.style.overflow = 'hidden';\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n // Only restore scroll if no other fc-overlay remains in the DOM\n if (!document.querySelector('.fc-overlay')) {\n document.body.style.overflow = '';\n }\n };\n }, [isOpen, onClose]);\n\n if (!isOpen) return null;\n\n const handleBackdropClick = (e: React.MouseEvent) => {\n if (e.target === overlayRef.current) onClose();\n };\n\n return createPortal(\n <div className=\"fc-overlay\" ref={overlayRef} onClick={handleBackdropClick}>\n <div className=\"fc-modal\" role=\"dialog\" aria-modal=\"true\">\n <button className=\"fc-modal-close\" onClick={onClose} aria-label=\"Close\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M15 5L5 15M5 5l10 10\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n </button>\n {children}\n </div>\n </div>,\n document.body,\n );\n}\n","import { useState, type FormEvent } from 'react';\nimport { useForgeConnect } from '../../hooks/use-forge-connect.js';\nimport { resolveLoginMethods } from '../../resolve-config.js';\n\nexport function EmailLoginForm() {\n const { loginWithEmail, setModalStep, config } = useForgeConnect();\n const methods = resolveLoginMethods(config);\n const showBack = methods.length > 1;\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n await loginWithEmail(email, password);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Something went wrong. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Sign in with email</h3>\n <form onSubmit={handleSubmit} className=\"fc-form\">\n <label className=\"fc-label\">\n Email\n <input\n type=\"email\"\n className=\"fc-input\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n autoComplete=\"email\"\n />\n </label>\n <label className=\"fc-label\">\n Password\n <input\n type=\"password\"\n className=\"fc-input\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Enter your password\"\n required\n autoComplete=\"current-password\"\n minLength={8}\n />\n </label>\n {error && <p className=\"fc-error\">{error}</p>}\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Signing in...' : 'Sign in'}\n </button>\n </form>\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('forgot-password')}>\n Forgot password?\n </button>\n </p>\n <p className=\"fc-switch\">\n Don't have an account?{' '}\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('email-register')}>\n Sign up\n </button>\n </p>\n {showBack && (\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('method-select')}>\n Back\n </button>\n </p>\n )}\n </div>\n );\n}\n\nexport function EmailRegisterForm() {\n const { register, setModalStep } = useForgeConnect();\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [displayName, setDisplayName] = useState('');\n const [error, setError] = useState('');\n const [success, setSuccess] = useState(false);\n const [loading, setLoading] = useState(false);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n await register(email, password, displayName || undefined);\n setSuccess(true);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Something went wrong. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n if (success) {\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Check your email</h3>\n <p className=\"fc-text\">We sent a verification link to <strong>{email}</strong>. Click it to activate your account, then sign in.</p>\n <button type=\"button\" className=\"fc-btn fc-btn-secondary\" onClick={() => setModalStep('email-login')}>\n Back to sign in\n </button>\n </div>\n );\n }\n\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Create an account</h3>\n <form onSubmit={handleSubmit} className=\"fc-form\">\n <label className=\"fc-label\">\n Display name\n <input\n type=\"text\"\n className=\"fc-input\"\n value={displayName}\n onChange={(e) => setDisplayName(e.target.value)}\n placeholder=\"Your name\"\n autoComplete=\"name\"\n />\n </label>\n <label className=\"fc-label\">\n Email\n <input\n type=\"email\"\n className=\"fc-input\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n autoComplete=\"email\"\n />\n </label>\n <label className=\"fc-label\">\n Password\n <input\n type=\"password\"\n className=\"fc-input\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"8+ characters\"\n required\n autoComplete=\"new-password\"\n minLength={8}\n />\n </label>\n {error && <p className=\"fc-error\">{error}</p>}\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Creating account...' : 'Create account'}\n </button>\n </form>\n <p className=\"fc-switch\">\n Already have an account?{' '}\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('email-login')}>\n Sign in\n </button>\n </p>\n </div>\n );\n}\n","import type { ForgeConnectConfig, LoginMethod, ModalStep, OAuthProvider } from './types.js';\n\nconst OAUTH_PROVIDERS: ReadonlySet<string> = new Set(['google', 'discord', 'twitter', 'apple', 'telegram']);\n\n/** Check if a login method is an OAuth provider. */\nexport function isOAuthMethod(method: LoginMethod): method is OAuthProvider {\n return OAUTH_PROVIDERS.has(method);\n}\n\n/**\n * Resolve the effective ordered login methods from config.\n * If `loginMethods` is set, uses that directly.\n * Otherwise, falls back to legacy fields for backward compat.\n */\nexport function resolveLoginMethods(config: ForgeConnectConfig): LoginMethod[] {\n if (config.loginMethods && config.loginMethods.length > 0) {\n return config.loginMethods;\n }\n\n // Legacy resolution\n const methods: LoginMethod[] = [];\n\n if (config.oauthProviders) {\n for (const p of config.oauthProviders) {\n methods.push(p);\n }\n }\n\n methods.push('email');\n\n if (config.passwordlessLogin !== false) {\n methods.push('otp');\n }\n\n if (config.walletLogin !== false) {\n methods.push('wallet');\n }\n\n return methods;\n}\n\n/** Map a LoginMethod to the ModalStep it navigates to. */\nexport function loginMethodToStep(method: LoginMethod): ModalStep {\n switch (method) {\n case 'email': return 'email-login';\n case 'otp': return 'email-otp';\n case 'wallet': return 'wallet-connect';\n case 'passkey': return 'method-select'; // Passkey triggers browser API directly\n default: return 'method-select'; // OAuth methods handled specially\n }\n}\n\n/**\n * Determine the initial modal step when opened.\n * - If only 1 method and it's not OAuth, go directly to that step.\n * - If `defaultLoginMethod` is set (and valid), go to that step.\n * - Otherwise, show method-select.\n */\nexport function resolveInitialStep(config: ForgeConnectConfig, methods: LoginMethod[]): ModalStep {\n // Single method — skip method-select\n if (methods.length === 1 && !isOAuthMethod(methods[0])) {\n return loginMethodToStep(methods[0]);\n }\n\n const defaultMethod = config.defaultLoginMethod;\n if (!defaultMethod || !methods.includes(defaultMethod)) {\n return 'method-select';\n }\n\n if (isOAuthMethod(defaultMethod)) {\n return 'method-select'; // OAuth default handled in openModal by firing popup\n }\n\n return loginMethodToStep(defaultMethod);\n}\n","import { useState, useRef, type FormEvent, type KeyboardEvent, type ClipboardEvent } from 'react';\nimport { useForgeConnect } from '../../hooks/use-forge-connect.js';\nimport { resolveLoginMethods } from '../../resolve-config.js';\n\nexport function EmailOtpForm() {\n const { sendOtp, verifyOtp, setModalStep, config } = useForgeConnect();\n const methods = resolveLoginMethods(config);\n const showBack = methods.length > 1;\n const [email, setEmail] = useState('');\n const [code, setCode] = useState(['', '', '', '', '', '']);\n const [step, setStep] = useState<'email' | 'code'>('email');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n const inputRefs = useRef<(HTMLInputElement | null)[]>([]);\n\n const handleSendCode = async (e: FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n await sendOtp(email);\n setStep('code');\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Could not send the code. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n const handleVerify = async (digits: string[]) => {\n const codeStr = digits.join('');\n if (codeStr.length !== 6) return;\n setError('');\n setLoading(true);\n try {\n await verifyOtp(email, codeStr);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'This code is incorrect. Please check and try again.');\n setLoading(false);\n }\n };\n\n const handleDigitChange = (index: number, value: string) => {\n if (!/^\\d*$/.test(value)) return;\n const digit = value.slice(-1);\n const newCode = [...code];\n newCode[index] = digit;\n setCode(newCode);\n\n if (digit && index < 5) {\n inputRefs.current[index + 1]?.focus();\n }\n\n if (newCode.every((d) => d !== '')) {\n handleVerify(newCode);\n }\n };\n\n const handleKeyDown = (index: number, e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace' && !code[index] && index > 0) {\n inputRefs.current[index - 1]?.focus();\n }\n };\n\n const handlePaste = (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const pasted = e.clipboardData.getData('text').replace(/\\D/g, '').slice(0, 6);\n if (!pasted) return;\n const newCode = [...code];\n for (let i = 0; i < pasted.length; i++) {\n newCode[i] = pasted[i];\n }\n setCode(newCode);\n if (newCode.every((d) => d !== '')) {\n handleVerify(newCode);\n }\n };\n\n if (step === 'email') {\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Passwordless sign in</h3>\n <form onSubmit={handleSendCode} className=\"fc-form\">\n <label className=\"fc-label\">\n Email\n <input\n type=\"email\"\n className=\"fc-input\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n autoComplete=\"email\"\n />\n </label>\n {error && <p className=\"fc-error\">{error}</p>}\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Sending...' : 'Send code'}\n </button>\n </form>\n {showBack && (\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('method-select')}>\n Back\n </button>\n </p>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Enter verification code</h3>\n <p className=\"fc-text\">We sent a 6-digit code to <strong>{email}</strong></p>\n <div className=\"fc-otp-inputs\">\n {code.map((digit, i) => (\n <input\n key={i}\n ref={(el) => { inputRefs.current[i] = el; }}\n type=\"text\"\n inputMode=\"numeric\"\n maxLength={1}\n className=\"fc-otp-digit\"\n value={digit}\n onChange={(e) => handleDigitChange(i, e.target.value)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onPaste={i === 0 ? handlePaste : undefined}\n autoFocus={i === 0}\n />\n ))}\n </div>\n {error && <p className=\"fc-error\">{error}</p>}\n {loading && <p className=\"fc-text\">Verifying...</p>}\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => { setStep('email'); setCode(['', '', '', '', '', '']); setError(''); }}>\n Use a different email\n </button>\n </p>\n </div>\n );\n}\n","import { useState, useMemo, useEffect, useRef, useCallback } from 'react';\nimport { useForgeConnect } from '../../hooks/use-forge-connect.js';\nimport { resolveLoginMethods } from '../../resolve-config.js';\n\n// ── Mobile wallet deep links ──\n\nexport interface MobileWallet {\n name: string;\n icon: string;\n /** Build a universal link that opens the wallet app with the dApp URL in its in-app browser */\n buildUrl: (pageUrl: string) => string;\n}\n\nexport const MOBILE_WALLETS: MobileWallet[] = [\n {\n name: 'Phantom',\n icon: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTA4IiBoZWlnaHQ9IjEwOCIgdmlld0JveD0iMCAwIDEwOCAxMDgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxMDgiIGhlaWdodD0iMTA4IiByeD0iMjYiIGZpbGw9IiNBQjlGRjIiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00Ni41MjY3IDY5LjkyMjlDNDIuMDA1NCA3Ni44NTA5IDM0LjQyOTIgODUuNjE4MiAyNC4zNDggODUuNjE4MkMxOS41ODI0IDg1LjYxODIgMTUgODMuNjU2MyAxNSA3NS4xMzQyQzE1IDUzLjQzMDUgNDQuNjMyNiAxOS44MzI3IDcyLjEyNjggMTkuODMyN0M4Ny43NjggMTkuODMyNyA5NCAzMC42ODQ2IDk0IDQzLjAwNzlDOTQgNTguODI1OCA4My43MzU1IDc2LjkxMjIgNzMuNTMyMSA3Ni45MTIyQzcwLjI5MzkgNzYuOTEyMiA2OC43MDUzIDc1LjEzNDIgNjguNzA1MyA3Mi4zMTRDNjguNzA1MyA3MS41NzgzIDY4LjgyNzUgNzAuNzgxMiA2OS4wNzE5IDY5LjkyMjlDNjUuNTg5MyA3NS44Njk5IDU4Ljg2ODUgODEuMzg3OCA1Mi41NzU0IDgxLjM4NzhDNDcuOTkzIDgxLjM4NzggNDUuNjcxMyA3OC41MDYzIDQ1LjY3MTMgNzQuNDU5OEM0NS42NzEzIDcyLjk4ODQgNDUuOTc2OCA3MS40NTU2IDQ2LjUyNjcgNjkuOTIyOVpNODMuNjc2MSA0Mi41Nzk0QzgzLjY3NjEgNDYuMTcwNCA4MS41NTc1IDQ3Ljk2NTggNzkuMTg3NSA0Ny45NjU4Qzc2Ljc4MTYgNDcuOTY1OCA3NC42OTg5IDQ2LjE3MDQgNzQuNjk4OSA0Mi41Nzk0Qzc0LjY5ODkgMzguOTg4NSA3Ni43ODE2IDM3LjE5MzEgNzkuMTg3NSAzNy4xOTMxQzgxLjU1NzUgMzcuMTkzMSA4My42NzYxIDM4Ljk4ODUgODMuNjc2MSA0Mi41Nzk0Wk03MC4yMTAzIDQyLjU3OTVDNzAuMjEwMyA0Ni4xNzA0IDY4LjA5MTYgNDcuOTY1OCA2NS43MjE2IDQ3Ljk2NThDNjMuMzE1NyA0Ny45NjU4IDYxLjIzMyA0Ni4xNzA0IDYxLjIzMyA0Mi41Nzk1QzYxLjIzMyAzOC45ODg1IDYzLjMxNTcgMzcuMTkzMSA2NS43MjE2IDM3LjE5MzFDNjguMDkxNiAzNy4xOTMxIDcwLjIxMDMgMzguOTg4NSA3MC4yMTAzIDQyLjU3OTVaIiBmaWxsPSIjRkZGREY4Ii8+Cjwvc3ZnPgo=',\n buildUrl: (url) => `https://phantom.app/ul/browse/${encodeURIComponent(url)}?ref=${encodeURIComponent(url)}`,\n },\n {\n name: 'Solflare',\n icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJTIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MCA1MCI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOiMwMjA1MGE7c3Ryb2tlOiNmZmVmNDY7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLXdpZHRoOi41cHg7fS5jbHMtMntmaWxsOiNmZmVmNDY7fTwvc3R5bGU+PC9kZWZzPjxyZWN0IGNsYXNzPSJjbHMtMiIgeD0iMCIgd2lkdGg9IjUwIiBoZWlnaHQ9IjUwIiByeD0iMTIiIHJ5PSIxMiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTI0LjIzLDI2LjQybDIuNDYtMi4zOCw0LjU5LDEuNWMzLjAxLDEsNC41MSwyLjg0LDQuNTEsNS40MywwLDEuOTYtLjc1LDMuMjYtMi4yNSw0LjkzbC0uNDYuNS4xNy0xLjE3Yy42Ny00LjI2LS41OC02LjA5LTQuNzItNy40M2wtNC4zLTEuMzhoMFpNMTguMDUsMTEuODVsMTIuNTIsNC4xNy0yLjcxLDIuNTktNi41MS0yLjE3Yy0yLjI1LS43NS0zLjAxLTEuOTYtMy4zLTQuNTF2LS4wOGgwWk0xNy4zLDMzLjA2bDIuODQtMi43MSw1LjM0LDEuNzVjMi44LjkyLDMuNzYsMi4xMywzLjQ2LDUuMThsLTExLjY1LTQuMjJoMFpNMTMuNzEsMjAuOTVjMC0uNzkuNDItMS41NCwxLjEzLTIuMTcuNzUsMS4wOSwyLjA1LDIuMDUsNC4wOSwyLjcxbDQuNDIsMS40Ni0yLjQ2LDIuMzgtNC4zNC0xLjQyYy0yLS42Ny0yLjg0LTEuNjctMi44NC0yLjk2TTI2LjgyLDQyLjg3YzkuMTgtNi4wOSwxNC4xMS0xMC4yMywxNC4xMS0xNS4zMiwwLTMuMzgtMi01LjI2LTYuNDMtNi43MmwtMy4zNC0xLjEzLDkuMTQtOC43Ny0xLjg0LTEuOTYtMi43MSwyLjM4LTEyLjgxLTQuMjJjLTMuOTcsMS4yOS04Ljk3LDUuMDktOC45Nyw4Ljg5LDAsLjQyLjA0LjgzLjE3LDEuMjktMy4zLDEuODgtNC42MywzLjYzLTQuNjMsNS44LDAsMi4wNSwxLjA5LDQuMDksNC41NSw1LjIybDIuNzUuOTItOS41Miw5LjE0LDEuODQsMS45NiwyLjk2LTIuNzEsMTQuNzMsNS4yMmgwWiIvPjwvc3ZnPg==',\n buildUrl: (url) => `https://solflare.com/ul/v1/browse/${encodeURIComponent(url)}?ref=${encodeURIComponent(url)}`,\n },\n {\n name: 'Backpack',\n icon: 'data:image/webp;base64,UklGRlgCAABXRUJQVlA4WAoAAAAQAAAAOwAAOwAAQUxQSC8AAAABL6CmbQOGP75e/cti0oiIOI0KBto2+a8ACZjAAQ7wL2gCSCL6PwER2t+KmZpFDwBWUDggAgIAAPALAJ0BKjwAPAA+SSCMRKKiIRYKrTQoBISyAGp7nL12mKuwHiZ/pX71XoA8m7rXfQA8q39lfhJ/cL0ZimIeNSGxOaSWtqEDDdJ++ARG5/LVm6OquItoAu4rpz8VksUr1NEDJ0CeZucwAP7+VdYX7J5e8V3cJZ9QoY9vj8KsNGOvZSm+khDZOvwCeiDFjGweq/8KIUmVQk3T/qW3ONyMcepN2uwyEXpZZiidST0x705r7ZnNuWX42r8oi+FEshvXGWm6DabjfrMbiaxJ15irl2Gj3nKWbZ2v3k/jd172plSBejBs7dNt90Re/m+nmv5kNjM/SPfa4EpzvOdu/8BR+hTnR4qe4eWhTsh/oecEfN31OExdi/6AYrsth4nlx/qGEP70b1/TNKmgaB/18+c9ntTfhku9wYpy17/wN3r+B/1geZPzth+AtNsMDXE99PaPLWdFP9MOIMD6ME+MpZu2H7WSfzY7MkWs/N/NNzAZ0P/9vMvxgcdzFHvs/doeUU9WyVv+Ll8QDJbn9NZl86ZZNYtfP4Ol1hiJHWosWyj/66vhMUeFIcDheXIOSRTzvKwj5ffEl7fn/QwflNU556SEjM8MriwSFJ/nrFBrr8O1/pqdrYGqPijG6tjsBVBHp+EDAbtNLL375I2jnG9i3Xb1ZphsFYNjdRaknYdFf4g5iJBoAAA=',\n buildUrl: (url) => `https://backpack.app/ul/browse/${encodeURIComponent(url)}`,\n },\n];\n\nexport function isMobile(): boolean {\n if (typeof navigator === 'undefined') return false;\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n}\n\nexport function WalletConnectForm() {\n const { walletAdapter, setModalStep, config } = useForgeConnect();\n const methods = resolveLoginMethods(config);\n const showBack = methods.length > 1;\n\n // On mobile without wallet adapter, show mobile deep links directly\n if (!walletAdapter && isMobile()) {\n return <MobileWalletFlow />;\n }\n\n if (walletAdapter) {\n return <WalletAdapterFlow />;\n }\n\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Connect wallet</h3>\n <p className=\"fc-text\">\n No wallet adapter detected. Pass <code>walletAdapter</code> to{' '}\n <code>&lt;ForgeConnectProvider&gt;</code> to enable wallet login.\n </p>\n {showBack && (\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('method-select')}>\n Back\n </button>\n </p>\n )}\n </div>\n );\n}\n\n/** Standalone mobile flow — when no wallet adapter is provided but we're on mobile */\nfunction MobileWalletFlow() {\n const { setModalStep, config } = useForgeConnect();\n const methods = resolveLoginMethods(config);\n const showBack = methods.length > 1;\n const walletConfig = config.walletConfig;\n const preferred = walletConfig?.preferredWallets ?? [];\n const onlyPreferred = walletConfig?.onlyPreferred ?? false;\n\n const walletsToShow = useMemo(() => {\n if (preferred.length > 0) {\n const prefList = preferred\n .map((name) => MOBILE_WALLETS.find((mw) => mw.name === name))\n .filter(Boolean) as MobileWallet[];\n if (onlyPreferred) return prefList;\n const prefNames = new Set(preferred);\n const others = MOBILE_WALLETS.filter((mw) => !prefNames.has(mw.name));\n return [...prefList, ...others];\n }\n return MOBILE_WALLETS;\n }, [preferred, onlyPreferred]);\n\n const handleOpen = (mw: MobileWallet) => {\n const pageUrl = window.location.href;\n window.location.href = mw.buildUrl(pageUrl);\n };\n\n return (\n <div className=\"fc-tab\">\n <div className=\"fc-wallet-list\">\n {walletsToShow.map((mw) => (\n <button\n key={mw.name}\n type=\"button\"\n className=\"fc-btn fc-btn-wallet\"\n onClick={() => handleOpen(mw)}\n >\n <span style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={mw.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{mw.name}</span>\n <span className=\"fc-badge-preferred\">Open app</span>\n </button>\n ))}\n </div>\n <p className=\"fc-text\" style={{ textAlign: 'center', fontSize: 12, opacity: 0.6 }}>\n You'll be redirected to the wallet app to sign in.\n </p>\n {showBack && (\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('method-select')}>\n Back\n </button>\n </p>\n )}\n </div>\n );\n}\n\nfunction WalletAdapterFlow() {\n const { walletAdapter, loginWithWallet, setModalStep, config } = useForgeConnect();\n const wallet = walletAdapter!;\n const walletConfig = config.walletConfig;\n const methods = resolveLoginMethods(config);\n const showBack = methods.length > 1;\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n const [showOther, setShowOther] = useState(false);\n const [coldWallet, setColdWallet] = useState(false);\n const mobile = useMemo(() => isMobile(), []);\n\n const coldWalletRef = useRef(coldWallet);\n coldWalletRef.current = coldWallet;\n\n // Build a base64→base64 signTransaction wrapper using a specific adapter.\n const buildSignTxFnForAdapter = useCallback((adapter: any): ((txBase64: string) => Promise<string>) | undefined => {\n if (!adapter.signTransaction) return undefined;\n const TxClass = walletConfig?.Transaction;\n if (!TxClass) return undefined;\n return async (txBase64: string) => {\n const bytes = Uint8Array.from(atob(txBase64), (c) => c.charCodeAt(0));\n const tx = TxClass.from(bytes);\n const signedTx = await adapter.signTransaction(tx);\n return btoa(String.fromCharCode(...new Uint8Array(signedTx.serialize())));\n };\n }, [walletConfig?.Transaction]);\n\n // Single handler: connect via React wallet adapter context → then sign\n const handleConnect = async (w: (typeof wallet.wallets)[0]) => {\n if (w.readyState !== 'Installed') {\n if (mobile) {\n const mw = MOBILE_WALLETS.find((m) => m.name === w.adapter.name);\n if (mw) {\n window.location.href = mw.buildUrl(window.location.href);\n return;\n }\n }\n const url = (w.adapter as any).url;\n if (url) window.open(url, '_blank');\n return;\n }\n\n setError('');\n setLoading(true);\n\n try {\n // Step 1: Select in React context (propagates wallet state to the rest of the app)\n wallet.select(w.adapter.name);\n\n // Step 2: Connect via the raw adapter (select is async state — adapter is immediate)\n if (!w.adapter.connected) {\n await (w.adapter as any).connect();\n }\n\n // Step 3: Get publicKey from the adapter (available synchronously after connect)\n const pk = w.adapter.publicKey;\n if (!pk) throw new Error('Wallet did not provide a public key.');\n\n // Step 4: Sign the challenge\n const address: string = pk.toBase58();\n const useCold = coldWalletRef.current;\n const adapterSignMessage = (w.adapter as any).signMessage\n ? (msg: Uint8Array) => (w.adapter as any).signMessage(msg)\n : undefined;\n\n await loginWithWallet(\n address,\n useCold ? undefined : adapterSignMessage,\n 'solana',\n useCold ? buildSignTxFnForAdapter(w.adapter) : undefined,\n );\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Could not verify your wallet. Please try again.');\n setLoading(false);\n }\n };\n\n const handleMobileOpen = (mw: MobileWallet) => {\n window.location.href = mw.buildUrl(window.location.href);\n };\n\n const preferred = walletConfig?.preferredWallets ?? [];\n const onlyPreferred = walletConfig?.onlyPreferred ?? false;\n const preferredSet = new Set(preferred);\n\n const connectedWalletName = wallet.publicKey\n ? wallet.wallets.find((w) => w.adapter.connected)?.adapter.name ?? null\n : null;\n\n const { preferredWallets, otherWallets } = useMemo(() => {\n const all = wallet.wallets;\n\n const prefList = preferred\n .map((name) => all.find((w) => w.adapter.name === name))\n .filter(Boolean) as typeof all;\n\n if (onlyPreferred && preferred.length > 0) {\n return { preferredWallets: prefList, otherWallets: [] as typeof all };\n }\n\n const others = all.filter(\n (w) => !preferredSet.has(w.adapter.name) && w.readyState === 'Installed',\n );\n\n return { preferredWallets: prefList, otherWallets: others };\n }, [wallet.wallets, walletConfig]);\n\n // On mobile, find wallets from MOBILE_WALLETS that aren't already in the adapter list\n const mobileExtraWallets = useMemo(() => {\n if (!mobile) return [];\n const adapterNames = new Set(wallet.wallets.map((w) => w.adapter.name));\n return MOBILE_WALLETS.filter((mw) => !adapterNames.has(mw.name));\n }, [mobile, wallet.wallets]);\n\n return (\n <div className=\"fc-tab\">\n {loading ? (\n <div style={{ textAlign: 'center', padding: '24px 0' }}>\n <p className=\"fc-tab-title\">Connecting...</p>\n <p className=\"fc-text\">\n {coldWallet\n ? 'Confirm the transaction on your device'\n : 'Approve the connection, then sign the verification request in your wallet'}\n </p>\n {error && (\n <>\n <p className=\"fc-error\">{error}</p>\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-secondary\"\n onClick={() => { setLoading(false); setError(''); }}\n style={{ marginTop: 8 }}\n >\n Try again\n </button>\n </>\n )}\n </div>\n ) : (\n <>\n <div className=\"fc-wallet-list\">\n {preferredWallets.map((w) => {\n const installed = w.readyState === 'Installed';\n const isConnected = w.adapter.name === connectedWalletName;\n return (\n <button\n key={w.adapter.name}\n type=\"button\"\n className=\"fc-btn fc-btn-wallet\"\n onClick={() => handleConnect(w)}\n >\n <span className={installed ? 'fc-installed-dot' : ''} style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={w.adapter.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{w.adapter.name}</span>\n {isConnected\n ? <span className=\"fc-badge-preferred\">Last used</span>\n : <span className=\"fc-badge-preferred\">Preferred</span>\n }\n {!installed && mobile && MOBILE_WALLETS.some((mw) => mw.name === w.adapter.name)\n ? <span className=\"fc-badge-install\">Open app</span>\n : !installed && <span className=\"fc-badge-install\">Install</span>\n }\n </button>\n );\n })}\n\n {/* Mobile deep link wallets not already in the adapter list */}\n {mobileExtraWallets.map((mw) => (\n <button\n key={mw.name}\n type=\"button\"\n className=\"fc-btn fc-btn-wallet\"\n onClick={() => handleMobileOpen(mw)}\n >\n <span style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={mw.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{mw.name}</span>\n <span className=\"fc-badge-install\">Open app</span>\n </button>\n ))}\n\n {otherWallets.length > 0 && !showOther && (\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-wallet\"\n onClick={() => setShowOther(true)}\n >\n <span className=\"fc-other-wallets-icon\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <rect x=\"2\" y=\"3\" width=\"16\" height=\"14\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2 7h16\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <rect x=\"11\" y=\"10\" width=\"7\" height=\"4\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n </span>\n <span className=\"fc-wallet-name\">Other wallets</span>\n </button>\n )}\n\n {showOther && otherWallets.map((w) => {\n const isConnected = w.adapter.name === connectedWalletName;\n return (\n <button\n key={w.adapter.name}\n type=\"button\"\n className=\"fc-btn fc-btn-wallet\"\n onClick={() => handleConnect(w)}\n >\n <span className=\"fc-installed-dot\" style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={w.adapter.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{w.adapter.name}</span>\n {isConnected && <span className=\"fc-badge-preferred\">Last used</span>}\n </button>\n );\n })}\n </div>\n\n {preferredWallets.length === 0 && otherWallets.length === 0 && mobileExtraWallets.length === 0 && (\n <p className=\"fc-text\">No wallet found. Please install a Solana wallet (like Phantom) to continue.</p>\n )}\n\n {walletConfig?.Transaction && (\n <label className=\"fc-cold-wallet-toggle\">\n <input\n type=\"checkbox\"\n checked={coldWallet}\n onChange={(e) => setColdWallet(e.target.checked)}\n />\n <span className=\"fc-toggle-track\" />\n <span className=\"fc-cold-wallet-label\">\n <span>Hardware wallet</span>\n <span>Ledger, Trezor, Keystone...</span>\n </span>\n </label>\n )}\n\n {error && <p className=\"fc-error\">{error}</p>}\n </>\n )}\n {showBack && !loading && (\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('method-select')}>\n Back\n </button>\n </p>\n )}\n </div>\n );\n}\n","import { useState, type FormEvent } from 'react';\nimport { useForgeConnect } from '../../hooks/use-forge-connect.js';\n\ntype Step = 'email' | 'reset' | 'done';\n\nexport function ForgotPasswordForm() {\n const { forgotPassword, resetPassword, setModalStep } = useForgeConnect();\n const [step, setStep] = useState<Step>('email');\n const [email, setEmail] = useState('');\n const [token, setToken] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n const handleSendCode = async (e: FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n await forgotPassword(email);\n setStep('reset');\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Could not send the reset code. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n const handleReset = async (e: FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n await resetPassword(token.trim(), password);\n setStep('done');\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Could not reset your password. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n if (step === 'done') {\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Password updated</h3>\n <p className=\"fc-text\">Your password has been reset. You can now sign in.</p>\n <button type=\"button\" className=\"fc-btn fc-btn-primary\" onClick={() => setModalStep('email-login')}>\n Sign in\n </button>\n </div>\n );\n }\n\n if (step === 'reset') {\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Set new password</h3>\n <p className=\"fc-text\">We sent a reset code to <strong>{email}</strong>. Paste it below with your new password.</p>\n <form onSubmit={handleReset} className=\"fc-form\">\n <label className=\"fc-label\">\n Reset code\n <input\n type=\"text\"\n className=\"fc-input\"\n value={token}\n onChange={(e) => setToken(e.target.value)}\n placeholder=\"Paste the code from your email\"\n required\n autoComplete=\"off\"\n />\n </label>\n <label className=\"fc-label\">\n New password\n <input\n type=\"password\"\n className=\"fc-input\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"8+ characters\"\n required\n autoComplete=\"new-password\"\n minLength={8}\n />\n </label>\n {error && <p className=\"fc-error\">{error}</p>}\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Resetting...' : 'Reset password'}\n </button>\n </form>\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setStep('email')}>\n Resend code\n </button>\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"fc-tab\">\n <h3 className=\"fc-tab-title\">Reset your password</h3>\n <p className=\"fc-text\">Enter your email and we'll send you a reset code.</p>\n <form onSubmit={handleSendCode} className=\"fc-form\">\n <label className=\"fc-label\">\n Email\n <input\n type=\"email\"\n className=\"fc-input\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n required\n autoComplete=\"email\"\n />\n </label>\n {error && <p className=\"fc-error\">{error}</p>}\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Sending...' : 'Send reset code'}\n </button>\n </form>\n <p className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => setModalStep('email-login')}>\n Back to sign in\n </button>\n </p>\n </div>\n );\n}\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { useForgeConnect } from '../../hooks/use-forge-connect.js';\n\nexport function Verify2FAForm() {\n const { verify2FA, verifyRecoveryCode, setModalStep } = useForgeConnect();\n const [code, setCode] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [useRecovery, setUseRecovery] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const submittingRef = useRef(false);\n\n useEffect(() => {\n inputRef.current?.focus();\n }, [useRecovery]);\n\n const submitCode = useCallback(async (codeValue: string, isRecovery: boolean) => {\n if (submittingRef.current || !codeValue.trim()) return;\n submittingRef.current = true;\n setLoading(true);\n setError('');\n try {\n if (isRecovery) {\n await verifyRecoveryCode(codeValue.trim());\n } else {\n await verify2FA(codeValue.trim());\n }\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Verification failed. Please try again.');\n } finally {\n setLoading(false);\n submittingRef.current = false;\n }\n }, [verify2FA, verifyRecoveryCode]);\n\n const handleSubmit = async (e?: React.FormEvent) => {\n e?.preventDefault();\n await submitCode(code, useRecovery);\n };\n\n const handleCodeChange = (value: string) => {\n setCode(value);\n // Auto-submit when 6 digits entered (TOTP mode only)\n if (!useRecovery && value.length === 6 && /^\\d{6}$/.test(value)) {\n submitCode(value, false);\n }\n };\n\n return (\n <div className=\"fc-tab\">\n <button type=\"button\" className=\"fc-back\" onClick={() => setModalStep('method-select')}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M10 12L6 8l4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n Back\n </button>\n\n <p className=\"fc-account-section-desc\" style={{ marginTop: 8 }}>\n {useRecovery\n ? 'Enter one of your recovery codes.'\n : 'Enter the 6-digit code from your authenticator app.'\n }\n </p>\n\n {error && <p className=\"fc-error\">{error}</p>}\n\n <form onSubmit={handleSubmit} className=\"fc-form\">\n <input\n ref={inputRef}\n className=\"fc-input fc-input-code\"\n type=\"text\"\n inputMode={useRecovery ? 'text' : 'numeric'}\n autoComplete=\"one-time-code\"\n placeholder={useRecovery ? 'Recovery code' : '000000'}\n maxLength={useRecovery ? 20 : 6}\n value={code}\n onChange={(e) => handleCodeChange(e.target.value)}\n style={useRecovery ? {} : { textAlign: 'center', letterSpacing: '0.3em', fontSize: '1.25rem' }}\n />\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading || !code.trim()}>\n {loading ? 'Verifying...' : 'Verify'}\n </button>\n </form>\n\n <button\n type=\"button\"\n className=\"fc-link\"\n onClick={() => { setUseRecovery(!useRecovery); setCode(''); setError(''); }}\n style={{ marginTop: 12 }}\n >\n {useRecovery ? 'Use authenticator code instead' : 'Use a recovery code'}\n </button>\n </div>\n );\n}\n","import { useRef, useEffect } from 'react';\n\n/**\n * Safely renders an SVG string by parsing it through the browser's DOMParser\n * and stripping any non-SVG elements (scripts, event handlers, etc.).\n *\n * This replaces dangerouslySetInnerHTML for icon rendering.\n */\nexport function SvgIcon({ svg, className }: { svg: string; className?: string }) {\n const ref = useRef<HTMLSpanElement>(null);\n\n useEffect(() => {\n if (!ref.current || !svg) return;\n\n try {\n // Parse as HTML so the browser's HTML parser assigns the correct SVG namespace.\n // Using 'image/svg+xml' can leave elements in the null namespace when xmlns is missing.\n const doc = new DOMParser().parseFromString(svg, 'text/html');\n const svgEl = doc.body.querySelector('svg');\n\n if (!svgEl) {\n ref.current.textContent = '';\n return;\n }\n\n // Strip any dangerous elements or attributes\n const dangerous = svgEl.querySelectorAll('script,iframe,object,embed,foreignObject');\n dangerous.forEach((el) => el.remove());\n\n // Remove event handler attributes from all elements\n const all = svgEl.querySelectorAll('*');\n all.forEach((el) => {\n for (const attr of Array.from(el.attributes)) {\n if (attr.name.startsWith('on')) {\n el.removeAttribute(attr.name);\n }\n }\n });\n\n ref.current.textContent = '';\n ref.current.appendChild(svgEl);\n } catch {\n ref.current.textContent = '';\n }\n }, [svg]);\n\n return <span ref={ref} className={className} />;\n}\n","import { useForgeConnect } from '../../hooks/use-forge-connect.js';\nimport type { OAuthProvider } from '../../types.js';\nimport { resolveLoginMethods, isOAuthMethod } from '../../resolve-config.js';\nimport { SvgIcon } from '../svg-icon.js';\n\nexport const PROVIDER_INFO: Record<OAuthProvider, { label: string; icon: string }> = {\n google: {\n label: 'Google',\n icon: '<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\" fill=\"#4285F4\"/><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\"/><path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" fill=\"#FBBC05\"/><path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\"/></svg>',\n },\n discord: {\n label: 'Discord',\n icon: '<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path d=\"M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128c.126-.094.252-.192.372-.292a.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03z\" fill=\"#5865F2\"/></svg>',\n },\n twitter: {\n label: 'Twitter',\n icon: '<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" fill=\"currentColor\"/></svg>',\n },\n apple: {\n label: 'Apple',\n icon: '<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path d=\"M17.05 20.28c-.98.95-2.05.88-3.08.4-1.09-.5-2.08-.52-3.23 0-1.44.64-2.2.45-3.06-.4C3.79 16.17 4.36 9.02 8.8 8.78c1.27.06 2.15.72 2.91.76.93-.19 1.82-.88 2.83-.8 1.21.1 2.12.58 2.72 1.49-2.46 1.48-1.88 4.73.52 5.64-.42 1.13-.98 2.24-1.73 3.41zM12.03 8.7c-.12-2.35 1.82-4.38 4.04-4.54.29 2.56-2.34 4.68-4.04 4.54z\" fill=\"currentColor\"/></svg>',\n },\n telegram: {\n label: 'Telegram',\n icon: '<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path d=\"M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.479.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z\" fill=\"#2AABEE\"/></svg>',\n },\n};\n\n/** Single OAuth provider button (card-style). */\nexport function OAuthButton({ provider }: { provider: OAuthProvider }) {\n const { loginWithOAuth } = useForgeConnect();\n const info = PROVIDER_INFO[provider];\n\n return (\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-oauth\"\n onClick={() => loginWithOAuth(provider)}\n >\n <SvgIcon svg={info.icon} className=\"fc-oauth-icon\" />\n <span className=\"fc-btn-name\">{info.label}</span>\n </button>\n );\n}\n\n/** Renders all OAuth providers from the resolved config. Legacy convenience wrapper. */\nexport function OAuthButtons() {\n const { config } = useForgeConnect();\n const methods = resolveLoginMethods(config);\n const oauthMethods = methods.filter(isOAuthMethod);\n\n if (oauthMethods.length === 0) return null;\n\n return (\n <div className=\"fc-oauth-buttons\">\n {oauthMethods.map((provider) => (\n <OAuthButton key={provider} provider={provider} />\n ))}\n </div>\n );\n}\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { useUser } from '../hooks/use-user.js';\nimport { useWallets } from '../hooks/use-wallets.js';\nimport { useSessions } from '../hooks/use-sessions.js';\nimport { ModalOverlay } from './modal-overlay.js';\nimport { TwoFactorModal } from './two-factor-modal.js';\nimport { PasskeysModal } from './passkeys-modal.js';\nimport { PasswordModal } from './password-modal.js';\nimport { DeleteAccountModal } from './delete-account-modal.js';\nimport { PROVIDER_INFO } from './tabs/oauth-buttons.js';\nimport { SvgIcon } from './svg-icon.js';\nimport { timeAgo } from '../lib/utils.js';\nimport type { AccountModalTab, OAuthProvider } from '../types.js';\n\n// ── Friendly provider display ──\n\nconst METHOD_DISPLAY: Record<string, { label: string; iconHtml?: string }> = {\n email: {\n label: 'Email',\n iconHtml: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\"><rect x=\"2\" y=\"4\" width=\"16\" height=\"12\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M2 6l8 5 8-5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>',\n },\n solana_wallet: {\n label: 'Solana Wallet',\n iconHtml: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\"><rect x=\"2\" y=\"5\" width=\"16\" height=\"11\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.5\"/><rect x=\"13\" y=\"9\" width=\"5\" height=\"3\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.5\"/></svg>',\n },\n ethereum_wallet: {\n label: 'Ethereum Wallet',\n iconHtml: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\"><rect x=\"2\" y=\"5\" width=\"16\" height=\"11\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.5\"/><rect x=\"13\" y=\"9\" width=\"5\" height=\"3\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.5\"/></svg>',\n },\n};\n\nfunction getMethodDisplay(provider: string) {\n // Check OAuth providers first\n if (provider in PROVIDER_INFO) {\n const info = PROVIDER_INFO[provider as OAuthProvider];\n return { label: info.label, iconHtml: info.icon };\n }\n return METHOD_DISPLAY[provider] ?? { label: provider, iconHtml: undefined };\n}\n\nfunction truncate(str: string, max = 12) {\n if (str.length <= max) return str;\n return `${str.slice(0, 6)}...${str.slice(-4)}`;\n}\n\nconst ChevronRight = () => (\n <span className=\"fc-security-card-chevron\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M6 4l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n);\n\n// ── Tab config ──\n\nconst TABS: { key: AccountModalTab; label: string }[] = [\n { key: 'profile', label: 'Profile' },\n { key: 'auth-methods', label: 'Logins' },\n { key: 'wallets', label: 'Wallets' },\n { key: 'sessions', label: 'Security' },\n];\n\n// ── Main ──\n\nexport function AccountModal() {\n const { accountModal, closeAccountModal, openLinkModal, linkModal, config, logout } = useForgeConnect();\n const { user } = useUser();\n const [activeTab, setActiveTab] = useState<AccountModalTab>('profile');\n\n // Track when LinkAuthModal closes → bump key so tabs re-fetch\n const [refreshKey, setRefreshKey] = useState(0);\n const prevLinkOpen = useRef(false);\n useEffect(() => {\n if (prevLinkOpen.current && !linkModal.isOpen) {\n setRefreshKey((k) => k + 1);\n }\n prevLinkOpen.current = linkModal.isOpen;\n }, [linkModal.isOpen]);\n\n if (!accountModal.isOpen) return null;\n\n const theme = config.appearance?.theme ?? 'light';\n const initial = (user?.displayName ?? user?.primaryEmail ?? '?').charAt(0).toUpperCase();\n\n return (\n <ModalOverlay isOpen={accountModal.isOpen} onClose={closeAccountModal}>\n <div\n className=\"fc-modal-content\"\n style={{ '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6' } as React.CSSProperties}\n data-theme={theme}\n >\n {/* ── Hero ── */}\n <div className=\"fc-account-hero\">\n {user?.avatarUrl ? (\n <img src={user.avatarUrl} alt=\"\" className=\"fc-account-hero-avatar\" />\n ) : (\n <span className=\"fc-account-hero-avatar fc-account-hero-avatar-placeholder\">{initial}</span>\n )}\n <div className=\"fc-account-hero-info\">\n <span className=\"fc-account-hero-name\">{user?.displayName ?? 'Your account'}</span>\n {user?.primaryEmail && <span className=\"fc-account-hero-email\">{user.primaryEmail}</span>}\n </div>\n </div>\n\n {/* ── Tabs ── */}\n <div className=\"fc-account-tabs\">\n {TABS.map((tab) => (\n <button\n key={tab.key}\n type=\"button\"\n className={`fc-account-tab${activeTab === tab.key ? ' fc-account-tab-active' : ''}`}\n onClick={() => setActiveTab(tab.key)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* ── Content ── */}\n {activeTab === 'profile' && <ProfileTab />}\n {activeTab === 'auth-methods' && <LoginsTab onLink={() => openLinkModal('auth')} refreshKey={refreshKey} />}\n {activeTab === 'wallets' && <WalletsTab onLink={() => openLinkModal('wallet')} refreshKey={refreshKey} />}\n {activeTab === 'sessions' && <SecurityTab />}\n\n {/* ── Footer ── */}\n <div className=\"fc-account-footer\">\n <button\n type=\"button\"\n className=\"fc-btn-logout\"\n onClick={() => { logout(); closeAccountModal(); }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M7 17H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3M13 14l4-4-4-4M17 10H7\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n Log out\n </button>\n </div>\n </div>\n </ModalOverlay>\n );\n}\n\n// ── Profile Tab ──\n\nfunction ProfileTab() {\n const { user, updateProfile } = useUser();\n const [displayName, setDisplayName] = useState(user?.displayName ?? '');\n const [avatarUrl, setAvatarUrl] = useState(user?.avatarUrl ?? '');\n const [loading, setLoading] = useState(false);\n const [msg, setMsg] = useState<{ text: string; ok: boolean } | null>(null);\n\n useEffect(() => {\n setDisplayName(user?.displayName ?? '');\n setAvatarUrl(user?.avatarUrl ?? '');\n }, [user]);\n\n const handleSave = async () => {\n setLoading(true);\n setMsg(null);\n try {\n await updateProfile({\n displayName: displayName || undefined,\n avatarUrl: avatarUrl || undefined,\n });\n setMsg({ text: 'Profile updated', ok: true });\n } catch (err: unknown) {\n setMsg({ text: err instanceof Error ? err.message : 'Something went wrong. Please try again.', ok: false });\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <div className=\"fc-tab\">\n <div className=\"fc-form\">\n <label className=\"fc-label\">\n Name\n <input\n className=\"fc-input\"\n value={displayName}\n onChange={(e) => setDisplayName(e.target.value)}\n placeholder=\"How should we call you?\"\n />\n </label>\n <label className=\"fc-label\">\n Photo URL\n <input\n className=\"fc-input\"\n value={avatarUrl}\n onChange={(e) => setAvatarUrl(e.target.value)}\n placeholder=\"Paste a link to your photo\"\n />\n </label>\n <button type=\"button\" className=\"fc-btn fc-btn-primary\" onClick={handleSave} disabled={loading}>\n {loading ? 'Saving...' : 'Save changes'}\n </button>\n {msg && <p className={msg.ok ? 'fc-text' : 'fc-error'}>{msg.text}</p>}\n </div>\n </div>\n );\n}\n\n// ── Logins Tab ──\n\nfunction LoginsTab({ onLink, refreshKey }: { onLink: () => void; refreshKey: number }) {\n const { authMethods, loading, fetchAuthMethods, unlinkAuthMethod } = useUser();\n const [msg, setMsg] = useState('');\n\n useEffect(() => {\n fetchAuthMethods().catch(() => {});\n }, [fetchAuthMethods, refreshKey]);\n\n const handleRemove = async (id: string) => {\n setMsg('');\n try {\n await unlinkAuthMethod(id);\n } catch (err: unknown) {\n setMsg(err instanceof Error ? err.message : 'Could not remove this sign-in method. Please try again.');\n }\n };\n\n return (\n <div className=\"fc-tab\">\n {msg && <p className=\"fc-error\">{msg}</p>}\n {loading && <p className=\"fc-text\">Loading...</p>}\n <p className=\"fc-account-section-desc\">Ways you can sign in to your account.</p>\n {authMethods?.map((m) => {\n const display = getMethodDisplay(m.provider);\n const detail = m.provider === 'email'\n ? m.providerId\n : m.provider.endsWith('_wallet')\n ? truncate(m.providerId)\n : m.providerId;\n return (\n <div key={m.id} className=\"fc-account-item\">\n {display.iconHtml && (\n <SvgIcon svg={display.iconHtml} className=\"fc-account-item-icon\" />\n )}\n <div className=\"fc-account-item-info\">\n <span className=\"fc-account-item-label\">{display.label}</span>\n <span className=\"fc-account-item-detail\">{detail}</span>\n </div>\n <div className=\"fc-account-item-actions\">\n {m.isVerified && <span className=\"fc-badge-verified\">Verified</span>}\n <button type=\"button\" className=\"fc-btn-danger-sm\" onClick={() => handleRemove(m.id)}>\n Remove\n </button>\n </div>\n </div>\n );\n })}\n {authMethods?.length === 0 && <p className=\"fc-account-empty\">No login methods yet</p>}\n <button type=\"button\" className=\"fc-btn fc-btn-secondary\" onClick={onLink} style={{ marginTop: 8 }}>\n + Add login method\n </button>\n </div>\n );\n}\n\n// ── Wallets Tab ──\n\nfunction WalletsTab({ onLink, refreshKey }: { onLink: () => void; refreshKey: number }) {\n const { wallets, loading, fetchWallets, updateWallet } = useWallets();\n const [msg, setMsg] = useState('');\n\n useEffect(() => {\n fetchWallets().catch(() => {});\n }, [fetchWallets, refreshKey]);\n\n const handleSetPrimary = async (id: string) => {\n setMsg('');\n try {\n await updateWallet(id, { isPrimary: true });\n } catch (err: unknown) {\n setMsg(err instanceof Error ? err.message : 'Could not update this wallet. Please try again.');\n }\n };\n\n return (\n <div className=\"fc-tab\">\n {msg && <p className=\"fc-error\">{msg}</p>}\n {loading && <p className=\"fc-text\">Loading...</p>}\n <p className=\"fc-account-section-desc\">Crypto wallets connected to your account.</p>\n {wallets?.map((w) => (\n <div key={w.id} className=\"fc-account-item\">\n <SvgIcon svg={METHOD_DISPLAY[`${w.chain}_wallet`]?.iconHtml ?? ''} className=\"fc-account-item-icon\" />\n <div className=\"fc-account-item-info\">\n <span className=\"fc-account-item-label\">\n {w.chain.charAt(0).toUpperCase() + w.chain.slice(1)}\n {w.isPrimary && <span className=\"fc-badge-primary\" style={{ marginLeft: 6 }}>Primary</span>}\n </span>\n <span className=\"fc-account-item-detail\">{truncate(w.address)}</span>\n </div>\n <div className=\"fc-account-item-actions\">\n {!w.isPrimary && (\n <button type=\"button\" className=\"fc-btn-primary-sm\" onClick={() => handleSetPrimary(w.id)}>\n Make primary\n </button>\n )}\n </div>\n </div>\n ))}\n {wallets?.length === 0 && <p className=\"fc-account-empty\">No wallets connected</p>}\n <button type=\"button\" className=\"fc-btn fc-btn-secondary\" onClick={onLink} style={{ marginTop: 8 }}>\n + Connect wallet\n </button>\n </div>\n );\n}\n\n// ── Security Tab ──\n\nfunction SecurityTab() {\n const { sessions, loading, fetchSessions, revokeSession } = useSessions();\n const { logoutAll, logout, closeAccountModal, api, getAccessToken } = useForgeConnect();\n const { user, authMethods: userAuthMethods, fetchAuthMethods } = useUser();\n const [msg, setMsg] = useState('');\n\n // Card status\n const [totpEnabled, setTotpEnabled] = useState<boolean | null>(null);\n const [passkeyCount, setPasskeyCount] = useState(0);\n\n // Sub-modal visibility\n const [show2FAModal, setShow2FAModal] = useState(false);\n const [showPasskeyModal, setShowPasskeyModal] = useState(false);\n const [showPasswordModal, setShowPasswordModal] = useState(false);\n const [showDeleteModal, setShowDeleteModal] = useState(false);\n\n const refreshStatus = useCallback(() => {\n const token = getAccessToken();\n if (!token) return;\n api.get2FAStatus(token).then((r) => setTotpEnabled(r.enabled)).catch(() => {});\n }, [api, getAccessToken]);\n\n const refreshPasskeyCount = useCallback(() => {\n const token = getAccessToken();\n if (!token) return;\n api.getPasskeys(token).then((list) => setPasskeyCount(list.length)).catch(() => {});\n }, [api, getAccessToken]);\n\n useEffect(() => {\n fetchSessions().catch(() => {});\n fetchAuthMethods().catch(() => {});\n refreshStatus();\n refreshPasskeyCount();\n }, [fetchSessions, fetchAuthMethods, refreshStatus, refreshPasskeyCount]);\n\n const hasPassword = userAuthMethods?.some((m) => m.provider === 'email');\n\n const handleRevoke = async (id: string) => {\n setMsg('');\n try {\n await revokeSession(id);\n } catch (err: unknown) {\n setMsg(err instanceof Error ? err.message : 'Could not sign out this session. Please try again.');\n }\n };\n\n return (\n <div className=\"fc-tab\">\n {msg && <p className=\"fc-error\">{msg}</p>}\n\n {/* ── 2FA Card ── */}\n <button type=\"button\" className=\"fc-security-card\" onClick={() => setShow2FAModal(true)}>\n <span className=\"fc-security-card-icon\">\n <svg viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M10 2l6 3v4c0 4.42-2.56 8.22-6 9.5C6.56 17.22 4 13.42 4 9V5l6-3z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M7.5 10.5l2 2 3.5-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n <span className=\"fc-security-card-info\">\n <span className=\"fc-security-card-label\">Two-factor authentication</span>\n <span className=\"fc-security-card-detail\">\n {totpEnabled === null ? 'Loading...' : totpEnabled ? 'Enabled' : 'Not enabled'}\n </span>\n </span>\n <ChevronRight />\n </button>\n\n {/* ── Passkeys Card ── */}\n <button type=\"button\" className=\"fc-security-card\" onClick={() => setShowPasskeyModal(true)}>\n <span className=\"fc-security-card-icon\">\n <svg viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"8\" cy=\"7\" r=\"3\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M13 13.5a5 5 0 0 0-10 0\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M15 10v4m0 0l-1.5-1m1.5 1l1.5-1\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n <span className=\"fc-security-card-info\">\n <span className=\"fc-security-card-label\">Passkeys</span>\n <span className=\"fc-security-card-detail\">\n {passkeyCount === 0 ? 'No passkeys' : `${passkeyCount} passkey${passkeyCount !== 1 ? 's' : ''}`}\n </span>\n </span>\n <ChevronRight />\n </button>\n\n {/* ── Password Card ── */}\n {user?.primaryEmail && (\n <button\n type=\"button\"\n className=\"fc-security-card\"\n onClick={() => setShowPasswordModal(true)}\n >\n <span className=\"fc-security-card-icon\">\n <svg viewBox=\"0 0 20 20\" fill=\"none\">\n <rect x=\"3\" y=\"9\" width=\"14\" height=\"8\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M6 9V6a4 4 0 1 1 8 0v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </span>\n <span className=\"fc-security-card-info\">\n <span className=\"fc-security-card-label\">Password</span>\n <span className=\"fc-security-card-detail\">\n {hasPassword ? 'Change your password' : 'Set a password'}\n </span>\n </span>\n <ChevronRight />\n </button>\n )}\n\n {/* ── Sessions ── */}\n <div className=\"fc-divider\" style={{ margin: '16px 0' }}><span>active sessions</span></div>\n {loading && <p className=\"fc-text\">Loading...</p>}\n {sessions?.map((s) => (\n <div key={s.id} className=\"fc-account-item\">\n <span className=\"fc-account-item-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <rect x=\"2\" y=\"3\" width=\"16\" height=\"11\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <path d=\"M7 17h6M10 14v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n </svg>\n </span>\n <div className=\"fc-account-item-info\">\n <span className=\"fc-account-item-label\">\n {s.ipAddress === '127.0.0.1' || s.ipAddress === '::1'\n ? 'This device'\n : truncate(s.ipAddress, 20)}\n </span>\n <span className=\"fc-account-item-detail\">\n Active {timeAgo(s.lastActiveAt)} · Expires {new Date(s.expiresAt).toLocaleDateString()}\n </span>\n </div>\n <div className=\"fc-account-item-actions\">\n <button type=\"button\" className=\"fc-btn-danger-sm\" onClick={() => handleRevoke(s.id)}>\n Sign out\n </button>\n </div>\n </div>\n ))}\n {sessions?.length === 0 && <p className=\"fc-account-empty\">No active sessions</p>}\n {sessions && sessions.length > 1 && (\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-secondary\"\n onClick={() => { logoutAll(); }}\n style={{ marginTop: 8 }}\n >\n Sign out of all devices\n </button>\n )}\n\n {/* ── Danger zone ── */}\n <div className=\"fc-divider\" style={{ margin: '16px 0' }}><span>danger zone</span></div>\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-secondary\"\n onClick={() => setShowDeleteModal(true)}\n style={{ background: 'rgba(220, 38, 38, 0.1)', color: '#dc2626', borderColor: 'rgba(220, 38, 38, 0.2)' }}\n >\n Delete account\n </button>\n\n {/* ── Sub-modals ── */}\n <TwoFactorModal\n isOpen={show2FAModal}\n onClose={() => { setShow2FAModal(false); refreshStatus(); }}\n initialEnabled={totpEnabled ?? false}\n onStatusChange={(e) => setTotpEnabled(e)}\n />\n <PasskeysModal\n isOpen={showPasskeyModal}\n onClose={() => { setShowPasskeyModal(false); refreshPasskeyCount(); }}\n onCountChange={(count) => setPasskeyCount(count)}\n />\n {user?.primaryEmail && (\n <PasswordModal\n isOpen={showPasswordModal}\n onClose={() => { setShowPasswordModal(false); fetchAuthMethods().catch(() => {}); }}\n hasPassword={hasPassword ?? false}\n />\n )}\n <DeleteAccountModal\n isOpen={showDeleteModal}\n onClose={() => setShowDeleteModal(false)}\n onDeleted={() => { logout(); closeAccountModal(); }}\n />\n </div>\n );\n}\n","import { useState, useCallback, useEffect, useRef } from 'react';\nimport { useForgeConnect } from './use-forge-connect';\nimport type { AuthMethod } from '../types';\n\nexport function useUser() {\n const { auth, api, config, getAccessToken } = useForgeConnect();\n const [authMethods, setAuthMethods] = useState<AuthMethod[] | null>(null);\n const [loading, setLoading] = useState(false);\n const pendingRefreshRef = useRef(false);\n\n const updateProfile = useCallback(\n async (data: { displayName?: string; avatarUrl?: string }) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n return api.updateMe(token, data);\n },\n [api, getAccessToken],\n );\n\n const fetchAuthMethods = useCallback(async () => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const methods = await api.getAuthMethods(token);\n setAuthMethods(methods as AuthMethod[]);\n return methods;\n } finally {\n setLoading(false);\n }\n }, [api, getAccessToken]);\n\n const linkAuthMethod = useCallback(\n async (data: { provider: string; email?: string; password?: string; challengeId?: string; signature?: string; walletAddress?: string }) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.linkAuthMethod(token, data);\n await fetchAuthMethods();\n },\n [api, getAccessToken, fetchAuthMethods],\n );\n\n const linkOtpSend = useCallback(\n async (email: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.linkOtpSend(token, email);\n },\n [api, getAccessToken],\n );\n\n const linkOtpVerify = useCallback(\n async (email: string, code: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.linkOtpVerify(token, email, code);\n await fetchAuthMethods();\n },\n [api, getAccessToken, fetchAuthMethods],\n );\n\n const unlinkAuthMethod = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.unlinkAuthMethod(token, id);\n await fetchAuthMethods();\n },\n [api, getAccessToken, fetchAuthMethods],\n );\n\n // ── OAuth linking via popup ──\n\n const linkOAuth = useCallback(\n async (provider: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n\n // Create a short-lived link intent token (avoids exposing JWT in URL)\n const { intentToken } = await api.createLinkIntent(token);\n\n const redirectUri = encodeURIComponent(window.location.origin + '/fc-oauth-callback');\n const url = `${config.apiUrl}/auth/oauth/${provider}/link?intent=${encodeURIComponent(intentToken)}&redirect_uri=${redirectUri}`;\n const width = 500;\n const height = 600;\n const left = window.screenX + (window.innerWidth - width) / 2;\n const top = window.screenY + (window.innerHeight - height) / 2;\n window.open(url, 'fc_oauth_link', `width=${width},height=${height},left=${left},top=${top}`);\n pendingRefreshRef.current = true;\n },\n [api, config.apiUrl, getAccessToken],\n );\n\n // Listen for OAuth link callback\n useEffect(() => {\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== window.location.origin) return;\n if (event.data?.type === 'fc_oauth_link_success' && pendingRefreshRef.current) {\n pendingRefreshRef.current = false;\n fetchAuthMethods().catch(() => {});\n }\n };\n\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [fetchAuthMethods]);\n\n return {\n user: auth.user,\n authMethods,\n loading,\n updateProfile,\n fetchAuthMethods,\n linkAuthMethod,\n linkOtpSend,\n linkOtpVerify,\n unlinkAuthMethod,\n linkOAuth,\n };\n}\n","import { useState, useCallback } from 'react';\nimport { useForgeConnect } from './use-forge-connect';\nimport { uint8ArrayToBase58 } from '../lib/utils.js';\nimport type { Wallet } from '../types';\n\nexport function useWallets() {\n const { api, getAccessToken } = useForgeConnect();\n const [wallets, setWallets] = useState<Wallet[] | null>(null);\n const [loading, setLoading] = useState(false);\n\n const fetchWallets = useCallback(async () => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.getWallets(token);\n setWallets(data as Wallet[]);\n return data;\n } finally {\n setLoading(false);\n }\n }, [api, getAccessToken]);\n\n const updateWallet = useCallback(\n async (id: string, data: { label?: string; isPrimary?: boolean }) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.updateWallet(token, id, data);\n await fetchWallets();\n },\n [api, getAccessToken, fetchWallets],\n );\n\n const linkWallet = useCallback(\n async (\n walletAddress: string,\n signMessage: ((message: Uint8Array) => Promise<Uint8Array>) | undefined,\n chain: string = 'solana',\n signTransaction?: (txBase64: string) => Promise<string>,\n ) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n\n if (signMessage) {\n // Standard message-signing flow (hot wallets)\n const { challengeId, message: challengeMessage } = await api.walletChallenge(walletAddress, chain);\n const encoded = new TextEncoder().encode(challengeMessage);\n const signatureBytes = await signMessage(encoded);\n const signature = chain === 'solana'\n ? uint8ArrayToBase58(signatureBytes)\n : Array.from(signatureBytes).map((b) => b.toString(16).padStart(2, '0')).join('');\n await api.linkAuthMethod(token, {\n provider: `${chain}_wallet`,\n challengeId,\n signature,\n walletAddress,\n });\n } else {\n // Transaction-based flow (hardware/cold wallets)\n if (!signTransaction) {\n throw new Error('Wallet does not support message signing or transaction signing.');\n }\n const { challengeId, transaction: txBase64 } = await api.walletChallengeTx(walletAddress, chain);\n const signedTxBase64 = await signTransaction(txBase64);\n await api.linkAuthMethod(token, {\n provider: `${chain}_wallet_tx`,\n challengeId,\n signedTransaction: signedTxBase64,\n walletAddress,\n });\n }\n\n await fetchWallets();\n },\n [api, getAccessToken, fetchWallets],\n );\n\n return {\n wallets,\n loading,\n fetchWallets,\n updateWallet,\n linkWallet,\n };\n}\n\n","const BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n\nexport function uint8ArrayToBase58(bytes: Uint8Array): string {\n const digits = [0];\n for (const byte of bytes) {\n let carry = byte;\n for (let j = 0; j < digits.length; j++) {\n carry += digits[j] << 8;\n digits[j] = carry % 58;\n carry = (carry / 58) | 0;\n }\n while (carry > 0) {\n digits.push(carry % 58);\n carry = (carry / 58) | 0;\n }\n }\n let str = '';\n for (let i = 0; i < bytes.length && bytes[i] === 0; i++) {\n str += '1';\n }\n for (let i = digits.length - 1; i >= 0; i--) {\n str += BASE58_ALPHABET[digits[i]];\n }\n return str;\n}\n\nexport function timeAgo(dateStr: string): string {\n const now = Date.now();\n const then = new Date(dateStr).getTime();\n const diff = now - then;\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n if (days < 30) return `${days}d ago`;\n return new Date(dateStr).toLocaleDateString();\n}\n","import { useState, useCallback } from 'react';\nimport { useForgeConnect } from './use-forge-connect';\nimport type { Session } from '../types';\n\nexport function useSessions() {\n const { api, getAccessToken } = useForgeConnect();\n const [sessions, setSessions] = useState<Session[] | null>(null);\n const [loading, setLoading] = useState(false);\n\n const fetchSessions = useCallback(async () => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.getSessions(token);\n setSessions(data as Session[]);\n return data;\n } finally {\n setLoading(false);\n }\n }, [api, getAccessToken]);\n\n const revokeSession = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.revokeSession(token, id);\n await fetchSessions();\n },\n [api, getAccessToken, fetchSessions],\n );\n\n return {\n sessions,\n loading,\n fetchSessions,\n revokeSession,\n };\n}\n","import { useState, useEffect } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { ModalOverlay } from './modal-overlay.js';\n\ninterface TwoFactorModalProps {\n isOpen: boolean;\n onClose: () => void;\n initialEnabled: boolean;\n onStatusChange: (enabled: boolean) => void;\n}\n\ntype Step = 'setup' | 'manage' | 'confirm-regenerate' | 'confirm-disable' | 'recovery-codes';\n\nexport function TwoFactorModal({ isOpen, onClose, initialEnabled, onStatusChange }: TwoFactorModalProps) {\n const { api, getAccessToken, config } = useForgeConnect();\n const theme = config.appearance?.theme ?? 'light';\n\n const [step, setStep] = useState<Step>(initialEnabled ? 'manage' : 'setup');\n\n // Setup state\n const [setupData, setSetupData] = useState<{ secret: string; qrCodeDataUrl: string; recoveryCodes: string[] } | null>(null);\n const [code, setCode] = useState('');\n const [loading, setLoading] = useState(false);\n const [msg, setMsg] = useState<{ text: string; ok: boolean } | null>(null);\n const [showSecret, setShowSecret] = useState(false);\n\n // Recovery codes (shared between setup and regenerate)\n const [recoveryCodes, setRecoveryCodes] = useState<string[]>([]);\n\n useEffect(() => {\n if (isOpen) {\n setStep(initialEnabled ? 'manage' : 'setup');\n setSetupData(null);\n setCode('');\n setMsg(null);\n setLoading(false);\n setShowSecret(false);\n setRecoveryCodes([]);\n\n // Auto-trigger setup if not enabled\n if (!initialEnabled) {\n const token = getAccessToken();\n if (token) {\n setLoading(true);\n api.setup2FA(token)\n .then((data) => {\n setSetupData(data);\n setRecoveryCodes(data.recoveryCodes);\n })\n .catch((err: unknown) => {\n setMsg({ text: err instanceof Error ? err.message : 'Could not set up 2FA.', ok: false });\n })\n .finally(() => setLoading(false));\n }\n }\n }\n }, [isOpen, initialEnabled, api, getAccessToken]);\n\n const handleEnable = async () => {\n const token = getAccessToken();\n if (!token || !code) return;\n setLoading(true);\n setMsg(null);\n try {\n await api.enable2FA(token, code);\n onStatusChange(true);\n setStep('recovery-codes');\n setCode('');\n } catch (err: unknown) {\n setMsg({ text: err instanceof Error ? err.message : 'Invalid code.', ok: false });\n } finally {\n setLoading(false);\n }\n };\n\n const handleDisable = async () => {\n const token = getAccessToken();\n if (!token || !code) return;\n setLoading(true);\n setMsg(null);\n try {\n await api.disable2FA(token, code);\n onStatusChange(false);\n setCode('');\n onClose();\n } catch (err: unknown) {\n setMsg({ text: err instanceof Error ? err.message : 'Invalid code.', ok: false });\n } finally {\n setLoading(false);\n }\n };\n\n const handleRegenerate = async () => {\n const token = getAccessToken();\n if (!token || !code) return;\n setLoading(true);\n setMsg(null);\n try {\n const { recoveryCodes: codes } = await api.regenerateRecoveryCodes(token, code);\n setRecoveryCodes(codes);\n setStep('recovery-codes');\n setCode('');\n } catch (err: unknown) {\n setMsg({ text: err instanceof Error ? err.message : 'Invalid code.', ok: false });\n } finally {\n setLoading(false);\n }\n };\n\n const handleCopyAll = () => {\n navigator.clipboard.writeText(recoveryCodes.join('\\n')).catch(() => {});\n };\n\n const goBack = () => {\n setCode('');\n setMsg(null);\n setStep('manage');\n };\n\n if (!isOpen) return null;\n\n return (\n <ModalOverlay isOpen={isOpen} onClose={onClose}>\n <div\n className=\"fc-modal-content\"\n style={{ '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6' } as React.CSSProperties}\n data-theme={theme}\n >\n {/* ── Setup flow (not enabled) ── */}\n {step === 'setup' && (\n <>\n <h2 className=\"fc-modal-title\">Set up 2FA</h2>\n {msg && <p className={msg.ok ? 'fc-text' : 'fc-error'}>{msg.text}</p>}\n {loading && !setupData && <p className=\"fc-text\">Loading...</p>}\n {setupData && (\n <div className=\"fc-tab\">\n <p className=\"fc-account-section-desc\" style={{ textAlign: 'center' }}>\n Scan this QR code with your authenticator app\n </p>\n <div style={{ display: 'flex', justifyContent: 'center', margin: '12px 0' }}>\n <img\n src={setupData.qrCodeDataUrl}\n alt=\"TOTP QR code\"\n style={{ width: 180, height: 180, borderRadius: 12 }}\n />\n </div>\n <div style={{ textAlign: 'center', marginBottom: 12 }}>\n <button type=\"button\" className=\"fc-link\" onClick={() => setShowSecret(!showSecret)}>\n {showSecret ? 'Hide code' : \"Can't scan? Enter manually\"}\n </button>\n {showSecret && (\n <p style={{ margin: '8px 0 0', fontFamily: 'monospace', fontSize: 12, opacity: 0.7, wordBreak: 'break-all' }}>\n {setupData.secret}\n </p>\n )}\n </div>\n <input\n className=\"fc-input\"\n type=\"text\"\n inputMode=\"numeric\"\n placeholder=\"Enter 6-digit code\"\n maxLength={6}\n value={code}\n onChange={(e) => setCode(e.target.value.replace(/\\D/g, ''))}\n style={{ textAlign: 'center', letterSpacing: '0.2em' }}\n autoFocus\n />\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-primary\"\n onClick={handleEnable}\n disabled={loading || code.length !== 6}\n style={{ marginTop: 10 }}\n >\n {loading ? 'Verifying...' : 'Verify & Enable'}\n </button>\n </div>\n )}\n </>\n )}\n\n {/* ── Manage (enabled) — just two action buttons ── */}\n {step === 'manage' && (\n <>\n <h2 className=\"fc-modal-title\">Two-factor authentication</h2>\n <div style={{ textAlign: 'center', marginBottom: 20 }}>\n <span className=\"fc-badge-verified\" style={{ fontSize: 12, padding: '4px 12px' }}>Enabled</span>\n </div>\n <div className=\"fc-tab\">\n <button\n type=\"button\"\n className=\"fc-security-card\"\n onClick={() => { setCode(''); setMsg(null); setStep('confirm-regenerate'); }}\n >\n <span className=\"fc-security-card-icon\">\n <svg viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M3 10a7 7 0 0 1 7-7m0 14a7 7 0 0 1-7-7m14 0a7 7 0 0 1-7 7m0-14a7 7 0 0 1 7 7\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M14 3l-1 3h3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n <span className=\"fc-security-card-info\">\n <span className=\"fc-security-card-label\">Regenerate recovery codes</span>\n <span className=\"fc-security-card-detail\">Get new backup codes</span>\n </span>\n <span className=\"fc-security-card-chevron\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M6 4l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n </button>\n\n <button\n type=\"button\"\n className=\"fc-security-card\"\n onClick={() => { setCode(''); setMsg(null); setStep('confirm-disable'); }}\n >\n <span className=\"fc-security-card-icon\" style={{ color: '#dc2626' }}>\n <svg viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M10 2l6 3v4c0 4.42-2.56 8.22-6 9.5C6.56 17.22 4 13.42 4 9V5l6-3z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M7.5 7.5l5 5M12.5 7.5l-5 5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </span>\n <span className=\"fc-security-card-info\">\n <span className=\"fc-security-card-label\" style={{ color: '#dc2626' }}>Disable 2FA</span>\n <span className=\"fc-security-card-detail\">Remove two-factor authentication</span>\n </span>\n <span className=\"fc-security-card-chevron\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M6 4l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n </button>\n </div>\n </>\n )}\n\n {/* ── Confirm: Regenerate recovery codes ── */}\n {step === 'confirm-regenerate' && (\n <>\n <h2 className=\"fc-modal-title\">Regenerate recovery codes</h2>\n <p className=\"fc-account-section-desc\" style={{ textAlign: 'center' }}>\n Enter your 2FA code to generate new recovery codes. Your old codes will stop working.\n </p>\n {msg && <p className={msg.ok ? 'fc-text' : 'fc-error'}>{msg.text}</p>}\n <div className=\"fc-tab\">\n <input\n className=\"fc-input\"\n type=\"text\"\n inputMode=\"numeric\"\n placeholder=\"Enter 6-digit code\"\n maxLength={6}\n value={code}\n onChange={(e) => setCode(e.target.value.replace(/\\D/g, ''))}\n style={{ textAlign: 'center', letterSpacing: '0.2em' }}\n autoFocus\n />\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-primary\"\n onClick={handleRegenerate}\n disabled={loading || code.length !== 6}\n style={{ marginTop: 10 }}\n >\n {loading ? 'Generating...' : 'Regenerate codes'}\n </button>\n <div className=\"fc-switch\" style={{ marginTop: 12 }}>\n <button type=\"button\" className=\"fc-link\" onClick={goBack}>Back</button>\n </div>\n </div>\n </>\n )}\n\n {/* ── Confirm: Disable 2FA ── */}\n {step === 'confirm-disable' && (\n <>\n <h2 className=\"fc-modal-title\">Disable 2FA</h2>\n <p className=\"fc-account-section-desc\" style={{ textAlign: 'center' }}>\n Enter your 2FA code to disable two-factor authentication.\n </p>\n {msg && <p className={msg.ok ? 'fc-text' : 'fc-error'}>{msg.text}</p>}\n <div className=\"fc-tab\">\n <input\n className=\"fc-input\"\n type=\"text\"\n inputMode=\"numeric\"\n placeholder=\"Enter 6-digit code\"\n maxLength={6}\n value={code}\n onChange={(e) => setCode(e.target.value.replace(/\\D/g, ''))}\n style={{ textAlign: 'center', letterSpacing: '0.2em' }}\n autoFocus\n />\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-secondary\"\n onClick={handleDisable}\n disabled={loading || code.length !== 6}\n style={{ marginTop: 10, background: 'rgba(220, 38, 38, 0.1)', color: '#dc2626', borderColor: 'rgba(220, 38, 38, 0.2)' }}\n >\n {loading ? 'Disabling...' : 'Disable 2FA'}\n </button>\n <div className=\"fc-switch\" style={{ marginTop: 12 }}>\n <button type=\"button\" className=\"fc-link\" onClick={goBack}>Back</button>\n </div>\n </div>\n </>\n )}\n\n {/* ── Recovery codes (after enable or regenerate) ── */}\n {step === 'recovery-codes' && (\n <>\n <h2 className=\"fc-modal-title\">Save your recovery codes</h2>\n <p className=\"fc-account-section-desc\" style={{ textAlign: 'center' }}>\n Store these codes somewhere safe. Each code can only be used once.\n </p>\n <div className=\"fc-recovery-grid\">\n {recoveryCodes.map((c, i) => (\n <div key={i} className=\"fc-recovery-code\">{c}</div>\n ))}\n </div>\n <div style={{ textAlign: 'center', margin: '8px 0 12px' }}>\n <button type=\"button\" className=\"fc-link\" onClick={handleCopyAll}>\n Copy all\n </button>\n </div>\n <button type=\"button\" className=\"fc-btn fc-btn-primary\" onClick={onClose}>\n Done\n </button>\n </>\n )}\n </div>\n </ModalOverlay>\n );\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { startRegistration } from '../runtime-imports.js';\nimport { ModalOverlay } from './modal-overlay.js';\nimport { timeAgo } from '../lib/utils.js';\nimport type { Passkey } from '../types.js';\n\ninterface PasskeysModalProps {\n isOpen: boolean;\n onClose: () => void;\n onCountChange: (count: number) => void;\n}\n\nexport function PasskeysModal({ isOpen, onClose, onCountChange }: PasskeysModalProps) {\n const { api, getAccessToken, config } = useForgeConnect();\n const theme = config.appearance?.theme ?? 'light';\n\n const [passkeys, setPasskeys] = useState<Passkey[]>([]);\n const [loading, setLoading] = useState(false);\n const [addLoading, setAddLoading] = useState(false);\n const [msg, setMsg] = useState('');\n\n const fetchPasskeys = useCallback(async () => {\n const token = getAccessToken();\n if (!token) return;\n setLoading(true);\n try {\n const list = await api.getPasskeys(token);\n setPasskeys(list);\n onCountChange(list.length);\n } catch {\n // silently fail\n } finally {\n setLoading(false);\n }\n }, [api, getAccessToken, onCountChange]);\n\n useEffect(() => {\n if (isOpen) {\n setMsg('');\n fetchPasskeys();\n }\n }, [isOpen, fetchPasskeys]);\n\n const handleAdd = async () => {\n const token = getAccessToken();\n if (!token) return;\n setAddLoading(true);\n setMsg('');\n try {\n const { options, challengeKey } = await api.getPasskeyRegisterOptions(token, config.webauthnRpId, config.webauthnOrigin);\n const regResponse = await startRegistration({ optionsJSON: options });\n const passkey = await api.verifyPasskeyRegistration(token, challengeKey, regResponse, undefined, config.webauthnRpId, config.webauthnOrigin);\n const updated = [...passkeys, passkey];\n setPasskeys(updated);\n onCountChange(updated.length);\n } catch (err: unknown) {\n setMsg(err instanceof Error ? err.message : 'Could not add passkey.');\n } finally {\n setAddLoading(false);\n }\n };\n\n const handleDelete = async (id: string) => {\n const token = getAccessToken();\n if (!token) return;\n setMsg('');\n try {\n await api.deletePasskey(token, id);\n const updated = passkeys.filter((p) => p.id !== id);\n setPasskeys(updated);\n onCountChange(updated.length);\n } catch (err: unknown) {\n setMsg(err instanceof Error ? err.message : 'Could not remove passkey.');\n }\n };\n\n if (!isOpen) return null;\n\n return (\n <ModalOverlay isOpen={isOpen} onClose={onClose}>\n <div\n className=\"fc-modal-content\"\n style={{ '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6' } as React.CSSProperties}\n data-theme={theme}\n >\n <h2 className=\"fc-modal-title\">Passkeys</h2>\n <p className=\"fc-account-section-desc\" style={{ textAlign: 'center' }}>\n Sign in without a password using biometrics or a security key.\n </p>\n\n {msg && <p className=\"fc-error\">{msg}</p>}\n {loading && <p className=\"fc-text\">Loading...</p>}\n\n <div className=\"fc-tab\">\n {passkeys.map((pk) => (\n <div key={pk.id} className=\"fc-account-item\">\n <span className=\"fc-account-item-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"8\" cy=\"7\" r=\"3\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M13 13.5a5 5 0 0 0-10 0\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M15 10v4m0 0l-1.5-1m1.5 1l1.5-1\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n <div className=\"fc-account-item-info\">\n <span className=\"fc-account-item-label\">{pk.name || 'Passkey'}</span>\n <span className=\"fc-account-item-detail\">\n {pk.deviceType ?? 'Unknown device'}\n {pk.lastUsedAt ? ` · Last used ${timeAgo(pk.lastUsedAt)}` : ''}\n </span>\n </div>\n <div className=\"fc-account-item-actions\">\n {pk.backedUp && <span className=\"fc-badge-verified\">Synced</span>}\n <button type=\"button\" className=\"fc-btn-danger-sm\" onClick={() => handleDelete(pk.id)}>\n Remove\n </button>\n </div>\n </div>\n ))}\n {!loading && passkeys.length === 0 && <p className=\"fc-account-empty\">No passkeys yet</p>}\n\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-secondary\"\n onClick={handleAdd}\n disabled={addLoading}\n style={{ marginTop: 8 }}\n >\n {addLoading ? 'Adding...' : '+ Add passkey'}\n </button>\n </div>\n </div>\n </ModalOverlay>\n );\n}\n","/**\n * Convert the given array buffer into a Base64URL-encoded string. Ideal for converting various\n * credential response ArrayBuffers to string for sending back to the server as JSON.\n *\n * Helper method to compliment `base64URLStringToBuffer`\n */\nexport function bufferToBase64URLString(buffer) {\n const bytes = new Uint8Array(buffer);\n let str = '';\n for (const charCode of bytes) {\n str += String.fromCharCode(charCode);\n }\n const base64String = btoa(str);\n return base64String.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n","/**\n * Convert from a Base64URL-encoded string to an Array Buffer. Best used when converting a\n * credential ID from a JSON string to an ArrayBuffer, like in allowCredentials or\n * excludeCredentials\n *\n * Helper method to compliment `bufferToBase64URLString`\n */\nexport function base64URLStringToBuffer(base64URLString) {\n // Convert from Base64URL to Base64\n const base64 = base64URLString.replace(/-/g, '+').replace(/_/g, '/');\n /**\n * Pad with '=' until it's a multiple of four\n * (4 - (85 % 4 = 1) = 3) % 4 = 3 padding\n * (4 - (86 % 4 = 2) = 2) % 4 = 2 padding\n * (4 - (87 % 4 = 3) = 1) % 4 = 1 padding\n * (4 - (88 % 4 = 0) = 4) % 4 = 0 padding\n */\n const padLength = (4 - (base64.length % 4)) % 4;\n const padded = base64.padEnd(base64.length + padLength, '=');\n // Convert to a binary string\n const binary = atob(padded);\n // Convert binary string to buffer\n const buffer = new ArrayBuffer(binary.length);\n const bytes = new Uint8Array(buffer);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return buffer;\n}\n","/**\n * Determine if the browser is capable of Webauthn\n */\nexport function browserSupportsWebAuthn() {\n return _browserSupportsWebAuthnInternals.stubThis(globalThis?.PublicKeyCredential !== undefined &&\n typeof globalThis.PublicKeyCredential === 'function');\n}\n/**\n * Make it possible to stub the return value during testing\n * @ignore Don't include this in docs output\n */\nexport const _browserSupportsWebAuthnInternals = {\n stubThis: (value) => value,\n};\n","import { base64URLStringToBuffer } from './base64URLStringToBuffer.js';\nexport function toPublicKeyCredentialDescriptor(descriptor) {\n const { id } = descriptor;\n return {\n ...descriptor,\n id: base64URLStringToBuffer(id),\n /**\n * `descriptor.transports` is an array of our `AuthenticatorTransportFuture` that includes newer\n * transports that TypeScript's DOM lib is ignorant of. Convince TS that our list of transports\n * are fine to pass to WebAuthn since browsers will recognize the new value.\n */\n transports: descriptor.transports,\n };\n}\n","/**\n * A simple test to determine if a hostname is a properly-formatted domain name\n *\n * A \"valid domain\" is defined here: https://url.spec.whatwg.org/#valid-domain\n *\n * Regex sourced from here:\n * https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch08s15.html\n */\nexport function isValidDomain(hostname) {\n return (\n // Consider localhost valid as well since it's okay wrt Secure Contexts\n hostname === 'localhost' ||\n /^([a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,}$/i.test(hostname));\n}\n","/**\n * A custom Error used to return a more nuanced error detailing _why_ one of the eight documented\n * errors in the spec was raised after calling `navigator.credentials.create()` or\n * `navigator.credentials.get()`:\n *\n * - `AbortError`\n * - `ConstraintError`\n * - `InvalidStateError`\n * - `NotAllowedError`\n * - `NotSupportedError`\n * - `SecurityError`\n * - `TypeError`\n * - `UnknownError`\n *\n * Error messages were determined through investigation of the spec to determine under which\n * scenarios a given error would be raised.\n */\nexport class WebAuthnError extends Error {\n constructor({ message, code, cause, name, }) {\n // @ts-ignore: help Rollup understand that `cause` is okay to set\n super(message, { cause });\n Object.defineProperty(this, \"code\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n this.name = name ?? cause.name;\n this.code = code;\n }\n}\n","import { isValidDomain } from './isValidDomain.js';\nimport { WebAuthnError } from './webAuthnError.js';\n/**\n * Attempt to intuit _why_ an error was raised after calling `navigator.credentials.create()`\n */\nexport function identifyRegistrationError({ error, options, }) {\n const { publicKey } = options;\n if (!publicKey) {\n throw Error('options was missing required publicKey property');\n }\n if (error.name === 'AbortError') {\n if (options.signal instanceof AbortSignal) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 16)\n return new WebAuthnError({\n message: 'Registration ceremony was sent an abort signal',\n code: 'ERROR_CEREMONY_ABORTED',\n cause: error,\n });\n }\n }\n else if (error.name === 'ConstraintError') {\n if (publicKey.authenticatorSelection?.requireResidentKey === true) {\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 4)\n return new WebAuthnError({\n message: 'Discoverable credentials were required but no available authenticator supported it',\n code: 'ERROR_AUTHENTICATOR_MISSING_DISCOVERABLE_CREDENTIAL_SUPPORT',\n cause: error,\n });\n }\n else if (\n // @ts-ignore: `mediation` doesn't yet exist on CredentialCreationOptions but it's possible as of Sept 2024\n options.mediation === 'conditional' &&\n publicKey.authenticatorSelection?.userVerification === 'required') {\n // https://w3c.github.io/webauthn/#sctn-createCredential (Step 22.4)\n return new WebAuthnError({\n message: 'User verification was required during automatic registration but it could not be performed',\n code: 'ERROR_AUTO_REGISTER_USER_VERIFICATION_FAILURE',\n cause: error,\n });\n }\n else if (publicKey.authenticatorSelection?.userVerification === 'required') {\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 5)\n return new WebAuthnError({\n message: 'User verification was required but no available authenticator supported it',\n code: 'ERROR_AUTHENTICATOR_MISSING_USER_VERIFICATION_SUPPORT',\n cause: error,\n });\n }\n }\n else if (error.name === 'InvalidStateError') {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 20)\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 3)\n return new WebAuthnError({\n message: 'The authenticator was previously registered',\n code: 'ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED',\n cause: error,\n });\n }\n else if (error.name === 'NotAllowedError') {\n /**\n * Pass the error directly through. Platforms are overloading this error beyond what the spec\n * defines and we don't want to overwrite potentially useful error messages.\n */\n return new WebAuthnError({\n message: error.message,\n code: 'ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY',\n cause: error,\n });\n }\n else if (error.name === 'NotSupportedError') {\n const validPubKeyCredParams = publicKey.pubKeyCredParams.filter((param) => param.type === 'public-key');\n if (validPubKeyCredParams.length === 0) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 10)\n return new WebAuthnError({\n message: 'No entry in pubKeyCredParams was of type \"public-key\"',\n code: 'ERROR_MALFORMED_PUBKEYCREDPARAMS',\n cause: error,\n });\n }\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 2)\n return new WebAuthnError({\n message: 'No available authenticator supported any of the specified pubKeyCredParams algorithms',\n code: 'ERROR_AUTHENTICATOR_NO_SUPPORTED_PUBKEYCREDPARAMS_ALG',\n cause: error,\n });\n }\n else if (error.name === 'SecurityError') {\n const effectiveDomain = globalThis.location.hostname;\n if (!isValidDomain(effectiveDomain)) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 7)\n return new WebAuthnError({\n message: `${globalThis.location.hostname} is an invalid domain`,\n code: 'ERROR_INVALID_DOMAIN',\n cause: error,\n });\n }\n else if (publicKey.rp.id !== effectiveDomain) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 8)\n return new WebAuthnError({\n message: `The RP ID \"${publicKey.rp.id}\" is invalid for this domain`,\n code: 'ERROR_INVALID_RP_ID',\n cause: error,\n });\n }\n }\n else if (error.name === 'TypeError') {\n if (publicKey.user.id.byteLength < 1 || publicKey.user.id.byteLength > 64) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 5)\n return new WebAuthnError({\n message: 'User ID was not between 1 and 64 characters',\n code: 'ERROR_INVALID_USER_ID_LENGTH',\n cause: error,\n });\n }\n }\n else if (error.name === 'UnknownError') {\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 1)\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 8)\n return new WebAuthnError({\n message: 'The authenticator was unable to process the specified options, or could not create a new credential',\n code: 'ERROR_AUTHENTICATOR_GENERAL_ERROR',\n cause: error,\n });\n }\n return error;\n}\n","class BaseWebAuthnAbortService {\n constructor() {\n Object.defineProperty(this, \"controller\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n }\n createNewAbortSignal() {\n // Abort any existing calls to navigator.credentials.create() or navigator.credentials.get()\n if (this.controller) {\n const abortError = new Error('Cancelling existing WebAuthn API call for new one');\n abortError.name = 'AbortError';\n this.controller.abort(abortError);\n }\n const newController = new AbortController();\n this.controller = newController;\n return newController.signal;\n }\n cancelCeremony() {\n if (this.controller) {\n const abortError = new Error('Manually cancelling existing WebAuthn API call');\n abortError.name = 'AbortError';\n this.controller.abort(abortError);\n this.controller = undefined;\n }\n }\n}\n/**\n * A service singleton to help ensure that only a single WebAuthn ceremony is active at a time.\n *\n * Users of **@simplewebauthn/browser** shouldn't typically need to use this, but it can help e.g.\n * developers building projects that use client-side routing to better control the behavior of\n * their UX in response to router navigation events.\n */\nexport const WebAuthnAbortService = new BaseWebAuthnAbortService();\n","const attachments = ['cross-platform', 'platform'];\n/**\n * If possible coerce a `string` value into a known `AuthenticatorAttachment`\n */\nexport function toAuthenticatorAttachment(attachment) {\n if (!attachment) {\n return;\n }\n if (attachments.indexOf(attachment) < 0) {\n return;\n }\n return attachment;\n}\n","import { bufferToBase64URLString } from '../helpers/bufferToBase64URLString.js';\nimport { base64URLStringToBuffer } from '../helpers/base64URLStringToBuffer.js';\nimport { browserSupportsWebAuthn } from '../helpers/browserSupportsWebAuthn.js';\nimport { toPublicKeyCredentialDescriptor } from '../helpers/toPublicKeyCredentialDescriptor.js';\nimport { identifyRegistrationError } from '../helpers/identifyRegistrationError.js';\nimport { WebAuthnAbortService } from '../helpers/webAuthnAbortService.js';\nimport { toAuthenticatorAttachment } from '../helpers/toAuthenticatorAttachment.js';\n/**\n * Begin authenticator \"registration\" via WebAuthn attestation\n *\n * @param optionsJSON Output from **@simplewebauthn/server**'s `generateRegistrationOptions()`\n * @param useAutoRegister (Optional) Try to silently create a passkey with the password manager that the user just signed in with. Defaults to `false`.\n */\nexport async function startRegistration(options) {\n // @ts-ignore: Intentionally check for old call structure to warn about improper API call\n if (!options.optionsJSON && options.challenge) {\n console.warn('startRegistration() was not called correctly. It will try to continue with the provided options, but this call should be refactored to use the expected call structure instead. See https://simplewebauthn.dev/docs/packages/browser#typeerror-cannot-read-properties-of-undefined-reading-challenge for more information.');\n // @ts-ignore: Reassign the options, passed in as a positional argument, to the expected variable\n options = { optionsJSON: options };\n }\n const { optionsJSON, useAutoRegister = false } = options;\n if (!browserSupportsWebAuthn()) {\n throw new Error('WebAuthn is not supported in this browser');\n }\n // We need to convert some values to Uint8Arrays before passing the credentials to the navigator\n const publicKey = {\n ...optionsJSON,\n challenge: base64URLStringToBuffer(optionsJSON.challenge),\n user: {\n ...optionsJSON.user,\n id: base64URLStringToBuffer(optionsJSON.user.id),\n },\n excludeCredentials: optionsJSON.excludeCredentials?.map(toPublicKeyCredentialDescriptor),\n };\n // Prepare options for `.create()`\n const createOptions = {};\n /**\n * Try to use conditional create to register a passkey for the user with the password manager\n * the user just used to authenticate with. The user won't be shown any prominent UI by the\n * browser.\n */\n if (useAutoRegister) {\n // @ts-ignore: `mediation` doesn't yet exist on CredentialCreationOptions but it's possible as of Sept 2024\n createOptions.mediation = 'conditional';\n }\n // Finalize options\n createOptions.publicKey = publicKey;\n // Set up the ability to cancel this request if the user attempts another\n createOptions.signal = WebAuthnAbortService.createNewAbortSignal();\n // Wait for the user to complete attestation\n let credential;\n try {\n credential = (await navigator.credentials.create(createOptions));\n }\n catch (err) {\n throw identifyRegistrationError({ error: err, options: createOptions });\n }\n if (!credential) {\n throw new Error('Registration was not completed');\n }\n const { id, rawId, response, type } = credential;\n // Continue to play it safe with `getTransports()` for now, even when L3 types say it's required\n let transports = undefined;\n if (typeof response.getTransports === 'function') {\n transports = response.getTransports();\n }\n // L3 says this is required, but browser and webview support are still not guaranteed.\n let responsePublicKeyAlgorithm = undefined;\n if (typeof response.getPublicKeyAlgorithm === 'function') {\n try {\n responsePublicKeyAlgorithm = response.getPublicKeyAlgorithm();\n }\n catch (error) {\n warnOnBrokenImplementation('getPublicKeyAlgorithm()', error);\n }\n }\n let responsePublicKey = undefined;\n if (typeof response.getPublicKey === 'function') {\n try {\n const _publicKey = response.getPublicKey();\n if (_publicKey !== null) {\n responsePublicKey = bufferToBase64URLString(_publicKey);\n }\n }\n catch (error) {\n warnOnBrokenImplementation('getPublicKey()', error);\n }\n }\n // L3 says this is required, but browser and webview support are still not guaranteed.\n let responseAuthenticatorData;\n if (typeof response.getAuthenticatorData === 'function') {\n try {\n responseAuthenticatorData = bufferToBase64URLString(response.getAuthenticatorData());\n }\n catch (error) {\n warnOnBrokenImplementation('getAuthenticatorData()', error);\n }\n }\n return {\n id,\n rawId: bufferToBase64URLString(rawId),\n response: {\n attestationObject: bufferToBase64URLString(response.attestationObject),\n clientDataJSON: bufferToBase64URLString(response.clientDataJSON),\n transports,\n publicKeyAlgorithm: responsePublicKeyAlgorithm,\n publicKey: responsePublicKey,\n authenticatorData: responseAuthenticatorData,\n },\n type,\n clientExtensionResults: credential.getClientExtensionResults(),\n authenticatorAttachment: toAuthenticatorAttachment(credential.authenticatorAttachment),\n };\n}\n/**\n * Visibly warn when we detect an issue related to a passkey provider intercepting WebAuthn API\n * calls\n */\nfunction warnOnBrokenImplementation(methodName, cause) {\n console.warn(`The browser extension that intercepted this WebAuthn API call incorrectly implemented ${methodName}. You should report this error to them.\\n`, cause);\n}\n","import { browserSupportsWebAuthn } from './browserSupportsWebAuthn.js';\n/**\n * Determine if the browser supports conditional UI, so that WebAuthn credentials can\n * be shown to the user in the browser's typical password autofill popup.\n */\nexport function browserSupportsWebAuthnAutofill() {\n if (!browserSupportsWebAuthn()) {\n return _browserSupportsWebAuthnAutofillInternals.stubThis(new Promise((resolve) => resolve(false)));\n }\n /**\n * I don't like the `as unknown` here but there's a `declare var PublicKeyCredential` in\n * TS' DOM lib that's making it difficult for me to just go `as PublicKeyCredentialFuture` as I\n * want. I think I'm fine with this for now since it's _supposed_ to be temporary, until TS types\n * have a chance to catch up.\n */\n const globalPublicKeyCredential = globalThis\n .PublicKeyCredential;\n if (globalPublicKeyCredential?.isConditionalMediationAvailable === undefined) {\n return _browserSupportsWebAuthnAutofillInternals.stubThis(new Promise((resolve) => resolve(false)));\n }\n return _browserSupportsWebAuthnAutofillInternals.stubThis(globalPublicKeyCredential.isConditionalMediationAvailable());\n}\n// Make it possible to stub the return value during testing\nexport const _browserSupportsWebAuthnAutofillInternals = {\n stubThis: (value) => value,\n};\n","import { isValidDomain } from './isValidDomain.js';\nimport { WebAuthnError } from './webAuthnError.js';\n/**\n * Attempt to intuit _why_ an error was raised after calling `navigator.credentials.get()`\n */\nexport function identifyAuthenticationError({ error, options, }) {\n const { publicKey } = options;\n if (!publicKey) {\n throw Error('options was missing required publicKey property');\n }\n if (error.name === 'AbortError') {\n if (options.signal instanceof AbortSignal) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 16)\n return new WebAuthnError({\n message: 'Authentication ceremony was sent an abort signal',\n code: 'ERROR_CEREMONY_ABORTED',\n cause: error,\n });\n }\n }\n else if (error.name === 'NotAllowedError') {\n /**\n * Pass the error directly through. Platforms are overloading this error beyond what the spec\n * defines and we don't want to overwrite potentially useful error messages.\n */\n return new WebAuthnError({\n message: error.message,\n code: 'ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY',\n cause: error,\n });\n }\n else if (error.name === 'SecurityError') {\n const effectiveDomain = globalThis.location.hostname;\n if (!isValidDomain(effectiveDomain)) {\n // https://www.w3.org/TR/webauthn-2/#sctn-discover-from-external-source (Step 5)\n return new WebAuthnError({\n message: `${globalThis.location.hostname} is an invalid domain`,\n code: 'ERROR_INVALID_DOMAIN',\n cause: error,\n });\n }\n else if (publicKey.rpId !== effectiveDomain) {\n // https://www.w3.org/TR/webauthn-2/#sctn-discover-from-external-source (Step 6)\n return new WebAuthnError({\n message: `The RP ID \"${publicKey.rpId}\" is invalid for this domain`,\n code: 'ERROR_INVALID_RP_ID',\n cause: error,\n });\n }\n }\n else if (error.name === 'UnknownError') {\n // https://www.w3.org/TR/webauthn-2/#sctn-op-get-assertion (Step 1)\n // https://www.w3.org/TR/webauthn-2/#sctn-op-get-assertion (Step 12)\n return new WebAuthnError({\n message: 'The authenticator was unable to process the specified options, or could not create a new assertion signature',\n code: 'ERROR_AUTHENTICATOR_GENERAL_ERROR',\n cause: error,\n });\n }\n return error;\n}\n","import { bufferToBase64URLString } from '../helpers/bufferToBase64URLString.js';\nimport { base64URLStringToBuffer } from '../helpers/base64URLStringToBuffer.js';\nimport { browserSupportsWebAuthn } from '../helpers/browserSupportsWebAuthn.js';\nimport { browserSupportsWebAuthnAutofill } from '../helpers/browserSupportsWebAuthnAutofill.js';\nimport { toPublicKeyCredentialDescriptor } from '../helpers/toPublicKeyCredentialDescriptor.js';\nimport { identifyAuthenticationError } from '../helpers/identifyAuthenticationError.js';\nimport { WebAuthnAbortService } from '../helpers/webAuthnAbortService.js';\nimport { toAuthenticatorAttachment } from '../helpers/toAuthenticatorAttachment.js';\n/**\n * Begin authenticator \"login\" via WebAuthn assertion\n *\n * @param optionsJSON Output from **@simplewebauthn/server**'s `generateAuthenticationOptions()`\n * @param useBrowserAutofill (Optional) Initialize conditional UI to enable logging in via browser autofill prompts. Defaults to `false`.\n * @param verifyBrowserAutofillInput (Optional) Ensure a suitable `<input>` element is present when `useBrowserAutofill` is `true`. Defaults to `true`.\n */\nexport async function startAuthentication(options) {\n // @ts-ignore: Intentionally check for old call structure to warn about improper API call\n if (!options.optionsJSON && options.challenge) {\n console.warn('startAuthentication() was not called correctly. It will try to continue with the provided options, but this call should be refactored to use the expected call structure instead. See https://simplewebauthn.dev/docs/packages/browser#typeerror-cannot-read-properties-of-undefined-reading-challenge for more information.');\n // @ts-ignore: Reassign the options, passed in as a positional argument, to the expected variable\n options = { optionsJSON: options };\n }\n const { optionsJSON, useBrowserAutofill = false, verifyBrowserAutofillInput = true, } = options;\n if (!browserSupportsWebAuthn()) {\n throw new Error('WebAuthn is not supported in this browser');\n }\n // We need to avoid passing empty array to avoid blocking retrieval\n // of public key\n let allowCredentials;\n if (optionsJSON.allowCredentials?.length !== 0) {\n allowCredentials = optionsJSON.allowCredentials?.map(toPublicKeyCredentialDescriptor);\n }\n // We need to convert some values to Uint8Arrays before passing the credentials to the navigator\n const publicKey = {\n ...optionsJSON,\n challenge: base64URLStringToBuffer(optionsJSON.challenge),\n allowCredentials,\n };\n // Prepare options for `.get()`\n const getOptions = {};\n /**\n * Set up the page to prompt the user to select a credential for authentication via the browser's\n * input autofill mechanism.\n */\n if (useBrowserAutofill) {\n if (!(await browserSupportsWebAuthnAutofill())) {\n throw Error('Browser does not support WebAuthn autofill');\n }\n // Check for an <input> with \"webauthn\" in its `autocomplete` attribute\n const eligibleInputs = document.querySelectorAll(\"input[autocomplete$='webauthn']\");\n // WebAuthn autofill requires at least one valid input\n if (eligibleInputs.length < 1 && verifyBrowserAutofillInput) {\n throw Error('No <input> with \"webauthn\" as the only or last value in its `autocomplete` attribute was detected');\n }\n // `CredentialMediationRequirement` doesn't know about \"conditional\" yet as of\n // typescript@4.6.3\n getOptions.mediation = 'conditional';\n // Conditional UI requires an empty allow list\n publicKey.allowCredentials = [];\n }\n // Finalize options\n getOptions.publicKey = publicKey;\n // Set up the ability to cancel this request if the user attempts another\n getOptions.signal = WebAuthnAbortService.createNewAbortSignal();\n // Wait for the user to complete assertion\n let credential;\n try {\n credential = (await navigator.credentials.get(getOptions));\n }\n catch (err) {\n throw identifyAuthenticationError({ error: err, options: getOptions });\n }\n if (!credential) {\n throw new Error('Authentication was not completed');\n }\n const { id, rawId, response, type } = credential;\n let userHandle = undefined;\n if (response.userHandle) {\n userHandle = bufferToBase64URLString(response.userHandle);\n }\n // Convert values to base64 to make it easier to send back to the server\n return {\n id,\n rawId: bufferToBase64URLString(rawId),\n response: {\n authenticatorData: bufferToBase64URLString(response.authenticatorData),\n clientDataJSON: bufferToBase64URLString(response.clientDataJSON),\n signature: bufferToBase64URLString(response.signature),\n userHandle,\n },\n type,\n clientExtensionResults: credential.getClientExtensionResults(),\n authenticatorAttachment: toAuthenticatorAttachment(credential.authenticatorAttachment),\n };\n}\n","import { useState, useEffect } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { ModalOverlay } from './modal-overlay.js';\nimport { ErrorView } from './error-view.js';\n\ninterface PasswordModalProps {\n isOpen: boolean;\n onClose: () => void;\n hasPassword: boolean;\n}\n\ntype Step = 'form' | 'done' | 'error';\n\nexport function PasswordModal({ isOpen, onClose, hasPassword }: PasswordModalProps) {\n const { api, getAccessToken, config } = useForgeConnect();\n const theme = config.appearance?.theme ?? 'light';\n\n const [step, setStep] = useState<Step>('form');\n const [currentPassword, setCurrentPassword] = useState('');\n const [newPassword, setNewPassword] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n\n useEffect(() => {\n if (isOpen) {\n setStep('form');\n setCurrentPassword('');\n setNewPassword('');\n setError('');\n setLoading(false);\n }\n }, [isOpen]);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.setPassword(token, newPassword, hasPassword ? currentPassword : undefined);\n setStep('done');\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : 'Could not set your password. Please try again.';\n setError(msg);\n setStep('error');\n } finally {\n setLoading(false);\n }\n };\n\n const title = hasPassword ? 'Change password' : 'Set a password';\n\n return (\n <ModalOverlay isOpen={isOpen} onClose={onClose}>\n <div\n className=\"fc-modal-content\"\n style={{ '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6' } as React.CSSProperties}\n data-theme={theme}\n >\n {step === 'done' ? (\n <div className=\"fc-tab\" style={{ textAlign: 'center', padding: '24px 0' }}>\n <div className=\"fc-success\">\n <div className=\"fc-success-icon\">\n <svg viewBox=\"0 0 52 52\" className=\"fc-success-check\">\n <circle className=\"fc-success-circle\" cx=\"26\" cy=\"26\" r=\"24\" fill=\"none\" />\n <path className=\"fc-success-tick\" fill=\"none\" d=\"M15 26l7.5 7.5L37 19\" />\n </svg>\n </div>\n <p className=\"fc-success-text\">Password {hasPassword ? 'updated' : 'set'}</p>\n </div>\n <button type=\"button\" className=\"fc-btn fc-btn-primary\" onClick={onClose} style={{ marginTop: 16 }}>\n Done\n </button>\n </div>\n ) : step === 'error' ? (\n <ErrorView\n title=\"Password update failed\"\n message={error}\n onRetry={() => setStep('form')}\n onClose={onClose}\n />\n ) : (\n <>\n <h2 className=\"fc-modal-title\">{title}</h2>\n <div className=\"fc-tab\">\n <form onSubmit={handleSubmit} className=\"fc-form\">\n {hasPassword && (\n <label className=\"fc-label\">\n Current password\n <input\n type=\"password\"\n className=\"fc-input\"\n value={currentPassword}\n onChange={(e) => setCurrentPassword(e.target.value)}\n placeholder=\"Enter current password\"\n required\n autoComplete=\"current-password\"\n />\n </label>\n )}\n <label className=\"fc-label\">\n New password\n <input\n type=\"password\"\n className=\"fc-input\"\n value={newPassword}\n onChange={(e) => setNewPassword(e.target.value)}\n placeholder=\"8+ characters\"\n required\n autoComplete=\"new-password\"\n minLength={8}\n />\n </label>\n {error && <p className=\"fc-error\">{error}</p>}\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Saving...' : hasPassword ? 'Update password' : 'Set password'}\n </button>\n </form>\n </div>\n </>\n )}\n </div>\n </ModalOverlay>\n );\n}\n","export interface ErrorViewProps {\n title?: string;\n message?: string;\n onRetry?: () => void;\n onClose?: () => void;\n}\n\nexport function ErrorView({\n title = 'Something went wrong',\n message,\n onRetry,\n onClose,\n}: ErrorViewProps) {\n return (\n <div className=\"fc-error-view\">\n <div className=\"fc-error-icon\">\n <svg viewBox=\"0 0 52 52\" className=\"fc-error-check\">\n <circle className=\"fc-error-circle\" cx=\"26\" cy=\"26\" r=\"24\" fill=\"none\" />\n <line className=\"fc-error-cross-1\" x1=\"16\" y1=\"16\" x2=\"36\" y2=\"36\" />\n <line className=\"fc-error-cross-2\" x1=\"36\" y1=\"16\" x2=\"16\" y2=\"36\" />\n </svg>\n </div>\n <p className=\"fc-error-text\">{title}</p>\n {message && <p className=\"fc-error-subtext\">{message}</p>}\n {(onRetry || onClose) && (\n <div className=\"fc-error-actions\">\n {onRetry && (\n <button type=\"button\" className=\"fc-btn fc-btn-primary\" onClick={onRetry}>\n Try again\n </button>\n )}\n {onClose && (\n <button type=\"button\" className=\"fc-btn fc-btn-secondary\" onClick={onClose}>\n Close\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { ModalOverlay } from './modal-overlay.js';\nimport { ErrorView } from './error-view.js';\n\ninterface DeleteAccountModalProps {\n isOpen: boolean;\n onClose: () => void;\n onDeleted: () => void;\n}\n\ntype Step = 'confirm' | 'code' | 'done' | 'error';\n\nexport function DeleteAccountModal({ isOpen, onClose, onDeleted }: DeleteAccountModalProps) {\n const { api, getAccessToken, config, logout } = useForgeConnect();\n const theme = config.appearance?.theme ?? 'light';\n\n const [step, setStep] = useState<Step>('confirm');\n const [code, setCode] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n\n useEffect(() => {\n if (isOpen) {\n setStep('confirm');\n setCode('');\n setError('');\n setLoading(false);\n }\n }, [isOpen]);\n\n const handleDelete = async () => {\n setError('');\n setLoading(true);\n try {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n const { requiresVerification } = await api.requestAccountDeletion(token);\n if (requiresVerification) {\n setStep('code');\n } else {\n await api.confirmAccountDeletion(token);\n setStep('done');\n }\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : 'Something went wrong. Please try again.';\n setError(msg);\n setStep('error');\n } finally {\n setLoading(false);\n }\n };\n\n const handleConfirmCode = async (e: React.FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n try {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.confirmAccountDeletion(token, code);\n setStep('done');\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : 'Something went wrong. Please try again.';\n setError(msg);\n setStep('error');\n } finally {\n setLoading(false);\n }\n };\n\n const handleDone = () => {\n logout();\n onDeleted();\n };\n\n if (!isOpen) return null;\n\n return (\n <ModalOverlay isOpen={isOpen} onClose={step === 'done' ? handleDone : onClose}>\n <div\n className=\"fc-modal-content\"\n style={{ '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6' } as React.CSSProperties}\n data-theme={theme}\n >\n {step === 'confirm' && (\n <>\n <h2 className=\"fc-modal-title\">Delete account</h2>\n <div className=\"fc-tab\" style={{ textAlign: 'center' }}>\n <p className=\"fc-account-section-desc\">\n This will permanently delete your account and all associated data. This action cannot be undone.\n </p>\n {error && <p className=\"fc-error\">{error}</p>}\n <button\n type=\"button\"\n className=\"fc-btn fc-btn-secondary\"\n onClick={handleDelete}\n disabled={loading}\n style={{ marginTop: 12, background: 'rgba(220, 38, 38, 0.1)', color: '#dc2626', borderColor: 'rgba(220, 38, 38, 0.2)' }}\n >\n {loading ? 'Processing...' : 'Delete my account'}\n </button>\n <div style={{ marginTop: 12 }}>\n <button type=\"button\" className=\"fc-link\" onClick={onClose}>Cancel</button>\n </div>\n </div>\n </>\n )}\n\n {step === 'code' && (\n <>\n <h2 className=\"fc-modal-title\">Verify your identity</h2>\n <div className=\"fc-tab\">\n <p className=\"fc-account-section-desc\" style={{ textAlign: 'center' }}>\n Enter the 6-digit code sent to your email to confirm deletion.\n </p>\n {error && <p className=\"fc-error\">{error}</p>}\n <form onSubmit={handleConfirmCode} className=\"fc-form\">\n <input\n className=\"fc-input\"\n type=\"text\"\n inputMode=\"numeric\"\n placeholder=\"Enter 6-digit code\"\n maxLength={6}\n value={code}\n onChange={(e) => setCode(e.target.value.replace(/\\D/g, ''))}\n style={{ textAlign: 'center', letterSpacing: '0.2em' }}\n autoFocus\n />\n <button\n type=\"submit\"\n className=\"fc-btn fc-btn-secondary\"\n disabled={loading || code.length !== 6}\n style={{ marginTop: 10, background: 'rgba(220, 38, 38, 0.1)', color: '#dc2626', borderColor: 'rgba(220, 38, 38, 0.2)' }}\n >\n {loading ? 'Deleting...' : 'Delete my account'}\n </button>\n </form>\n <div style={{ marginTop: 12, textAlign: 'center' }}>\n <button type=\"button\" className=\"fc-link\" onClick={onClose}>Cancel</button>\n </div>\n </div>\n </>\n )}\n\n {step === 'done' && (\n <div className=\"fc-tab\" style={{ textAlign: 'center', padding: '24px 0' }}>\n <div className=\"fc-success\">\n <div className=\"fc-success-icon\">\n <svg viewBox=\"0 0 52 52\" className=\"fc-success-check\">\n <circle className=\"fc-success-circle\" cx=\"26\" cy=\"26\" r=\"24\" fill=\"none\" />\n <path className=\"fc-success-tick\" fill=\"none\" d=\"M15 26l7.5 7.5L37 19\" />\n </svg>\n </div>\n <p className=\"fc-success-text\">Account deleted</p>\n </div>\n <button type=\"button\" className=\"fc-btn fc-btn-primary\" onClick={handleDone} style={{ marginTop: 16 }}>\n Done\n </button>\n </div>\n )}\n\n {step === 'error' && (\n <ErrorView\n title=\"Deletion failed\"\n message={error}\n onRetry={() => setStep('confirm')}\n onClose={onClose}\n />\n )}\n </div>\n </ModalOverlay>\n );\n}\n","import { useState, useEffect, useMemo, useRef, useCallback } from 'react';\nimport { useForgeConnect } from '../hooks/use-forge-connect.js';\nimport { useUser } from '../hooks/use-user.js';\nimport { useWallets } from '../hooks/use-wallets.js';\nimport { ModalOverlay } from './modal-overlay.js';\nimport { ErrorView } from './error-view.js';\nimport { PROVIDER_INFO } from './tabs/oauth-buttons.js';\nimport { SvgIcon } from './svg-icon.js';\nimport { MOBILE_WALLETS, isMobile } from './tabs/wallet-connect.js';\nimport { resolveLoginMethods, isOAuthMethod } from '../resolve-config.js';\nimport type { OAuthProvider } from '../types.js';\n\ntype LinkStep = 'method-select' | 'email' | 'otp' | 'wallet' | 'success' | 'error';\n\nexport function LinkAuthModal() {\n const { linkModal, closeLinkModal, config } = useForgeConnect();\n const { linkOAuth, authMethods } = useUser();\n const mode = linkModal.mode ?? 'auth';\n const [step, setStep] = useState<LinkStep>('method-select');\n const [fatalError, setFatalError] = useState('');\n\n // When modal opens, set the correct initial step\n useEffect(() => {\n if (linkModal.isOpen) {\n setStep(mode === 'wallet' ? 'wallet' : 'method-select');\n setFatalError('');\n }\n }, [linkModal.isOpen, mode]);\n\n // Listen for OAuth link success (popup sends postMessage)\n useEffect(() => {\n if (!linkModal.isOpen) return;\n\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== window.location.origin) return;\n if (event.data?.type === 'fc_oauth_link_success') {\n setStep('success');\n setTimeout(() => {\n handleClose();\n }, 1500);\n }\n };\n\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [linkModal.isOpen]);\n\n if (!linkModal.isOpen) return null;\n\n const theme = config.appearance?.theme ?? 'light';\n\n const handleClose = () => {\n setStep('method-select');\n closeLinkModal();\n };\n\n const handleSuccess = () => {\n setStep('success');\n setTimeout(() => {\n handleClose();\n }, 1500);\n };\n\n const handleOAuthDirect = (provider: string) => {\n linkOAuth(provider);\n };\n\n const handleFatalError = (msg: string) => {\n setFatalError(msg);\n setStep('error');\n };\n\n const title = step === 'success' || step === 'error'\n ? ''\n : step === 'email'\n ? 'Link email'\n : step === 'otp'\n ? 'Link email'\n : mode === 'wallet' || step === 'wallet'\n ? 'Connect wallet'\n : 'Link a method';\n\n return (\n <ModalOverlay isOpen={linkModal.isOpen} onClose={handleClose}>\n <div\n className=\"fc-modal-content\"\n style={{ '--fc-accent': config.appearance?.accentColor ?? '#8b5cf6' } as React.CSSProperties}\n data-theme={theme}\n >\n {step === 'success' ? (\n <SuccessView />\n ) : step === 'error' ? (\n <ErrorView\n title=\"Linking failed\"\n message={fatalError}\n onRetry={() => setStep(mode === 'wallet' ? 'wallet' : 'method-select')}\n onClose={handleClose}\n />\n ) : (\n <>\n <h2 className=\"fc-modal-title\">{title}</h2>\n {step === 'method-select' && (\n <AuthMethodSelectStep\n config={config}\n connectedProviders={authMethods?.map(m => m.provider) ?? []}\n onSelectEmail={() => setStep('email')}\n onSelectOtp={() => setStep('otp')}\n onOAuth={handleOAuthDirect}\n />\n )}\n {step === 'email' && (\n <EmailLinkStep\n onBack={mode === 'wallet' ? undefined : () => setStep('method-select')}\n onSuccess={handleSuccess}\n onFatalError={handleFatalError}\n />\n )}\n {step === 'otp' && (\n <OtpLinkStep\n onBack={() => setStep('method-select')}\n onSuccess={handleSuccess}\n onFatalError={handleFatalError}\n />\n )}\n {step === 'wallet' && (\n <WalletLinkStep\n onBack={mode === 'wallet' ? undefined : () => setStep('method-select')}\n onSuccess={handleSuccess}\n onFatalError={handleFatalError}\n />\n )}\n </>\n )}\n </div>\n </ModalOverlay>\n );\n}\n\n// ── Icons ──\n\nconst EmailIcon = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon\">\n <rect x=\"2\" y=\"4\" width=\"16\" height=\"12\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2 6l8 5 8-5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </div>\n);\n\nconst MagicCodeIcon = () => (\n <div className=\"fc-method-icon-wrap\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"fc-method-icon\">\n <rect x=\"3\" y=\"5\" width=\"14\" height=\"10\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M7 10h1.5M9.5 10h1M11.5 10h1.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </div>\n);\n\n// ── Auth Method Select (socials + email + otp, filtered) ──\n\nfunction AuthMethodSelectStep({\n config,\n connectedProviders,\n onSelectEmail,\n onSelectOtp,\n onOAuth,\n}: {\n config: import('../types.js').ForgeConnectConfig;\n connectedProviders: string[];\n onSelectEmail: () => void;\n onSelectOtp: () => void;\n onOAuth: (provider: string) => void;\n}) {\n const methods = resolveLoginMethods(config);\n const connectedSet = new Set(connectedProviders);\n const hasEmail = connectedSet.has('email');\n\n // Filter: only auth methods from config (no wallet/passkey), exclude already-connected\n const availableMethods = methods.filter((m) => {\n if (m === 'wallet' || m === 'passkey') return false;\n // Both email and otp link an email — skip if email already connected\n if (m === 'email') return !hasEmail;\n if (m === 'otp') return !hasEmail;\n if (isOAuthMethod(m)) return !connectedSet.has(m);\n return false;\n });\n\n if (availableMethods.length === 0) {\n return (\n <div className=\"fc-tab\">\n <p className=\"fc-text\">All available login methods are already connected.</p>\n </div>\n );\n }\n\n return (\n <div className=\"fc-tab\">\n {availableMethods.map((method) => {\n if (method === 'email') {\n return (\n <button key=\"email\" type=\"button\" className=\"fc-btn fc-btn-method\" onClick={onSelectEmail}>\n <EmailIcon /> <span className=\"fc-btn-name\">Email &amp; password</span>\n </button>\n );\n }\n\n if (method === 'otp') {\n return (\n <button key=\"otp\" type=\"button\" className=\"fc-btn fc-btn-method\" onClick={onSelectOtp}>\n <MagicCodeIcon /> <span className=\"fc-btn-name\">Magic code</span>\n </button>\n );\n }\n\n // OAuth provider\n const provider = method as OAuthProvider;\n const info = PROVIDER_INFO[provider];\n if (!info) return null;\n\n return (\n <button\n key={provider}\n type=\"button\"\n className=\"fc-btn fc-btn-method\"\n onClick={() => onOAuth(provider)}\n >\n <SvgIcon svg={info.icon} className=\"fc-oauth-icon\" />\n <span className=\"fc-btn-name\">{info.label}</span>\n </button>\n );\n })}\n </div>\n );\n}\n\n// ── Email Link Step ──\n\nfunction EmailLinkStep({ onBack, onSuccess, onFatalError }: { onBack?: () => void; onSuccess: () => void; onFatalError: (msg: string) => void }) {\n const { linkAuthMethod } = useUser();\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setLoading(true);\n setError('');\n try {\n await linkAuthMethod({ provider: 'email', email, password });\n onSuccess();\n } catch (err: unknown) {\n onFatalError(err instanceof Error ? err.message : 'Could not link this email. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <div className=\"fc-tab\">\n {error && <p className=\"fc-error\">{error}</p>}\n <form className=\"fc-form\" onSubmit={handleSubmit}>\n <label className=\"fc-label\">\n Email\n <input className=\"fc-input\" type=\"email\" value={email} onChange={(e) => setEmail(e.target.value)} required placeholder=\"you@example.com\" />\n </label>\n <label className=\"fc-label\">\n Password\n <input className=\"fc-input\" type=\"password\" value={password} onChange={(e) => setPassword(e.target.value)} required minLength={8} placeholder=\"8+ characters\" />\n </label>\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Linking...' : 'Link email'}\n </button>\n </form>\n {onBack && (\n <div className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={onBack}>Back</button>\n </div>\n )}\n </div>\n );\n}\n\n// ── OTP Link Step (magic code) ──\n\nfunction OtpLinkStep({ onBack, onSuccess, onFatalError }: { onBack?: () => void; onSuccess: () => void; onFatalError: (msg: string) => void }) {\n const { linkOtpSend, linkOtpVerify } = useUser();\n const [email, setEmail] = useState('');\n const [code, setCode] = useState('');\n const [codeSent, setCodeSent] = useState(false);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n\n const handleSendCode = async (e: React.FormEvent) => {\n e.preventDefault();\n setLoading(true);\n setError('');\n try {\n await linkOtpSend(email);\n setCodeSent(true);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : 'Could not send code. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n const handleVerifyCode = async (e: React.FormEvent) => {\n e.preventDefault();\n setLoading(true);\n setError('');\n try {\n await linkOtpVerify(email, code);\n onSuccess();\n } catch (err: unknown) {\n onFatalError(err instanceof Error ? err.message : 'Invalid code. Please try again.');\n } finally {\n setLoading(false);\n }\n };\n\n if (!codeSent) {\n return (\n <div className=\"fc-tab\">\n {error && <p className=\"fc-error\">{error}</p>}\n <form className=\"fc-form\" onSubmit={handleSendCode}>\n <label className=\"fc-label\">\n Email\n <input className=\"fc-input\" type=\"email\" value={email} onChange={(e) => setEmail(e.target.value)} required placeholder=\"you@example.com\" />\n </label>\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading}>\n {loading ? 'Sending...' : 'Send code'}\n </button>\n </form>\n {onBack && (\n <div className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={onBack}>Back</button>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"fc-tab\">\n <p className=\"fc-text\">A 6-digit code was sent to <strong>{email}</strong></p>\n {error && <p className=\"fc-error\">{error}</p>}\n <form className=\"fc-form\" onSubmit={handleVerifyCode}>\n <label className=\"fc-label\">\n Code\n <input\n className=\"fc-input\"\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]{6}\"\n maxLength={6}\n value={code}\n onChange={(e) => setCode(e.target.value.replace(/\\D/g, '').slice(0, 6))}\n required\n placeholder=\"000000\"\n autoFocus\n />\n </label>\n <button type=\"submit\" className=\"fc-btn fc-btn-primary\" disabled={loading || code.length !== 6}>\n {loading ? 'Verifying...' : 'Verify & link'}\n </button>\n </form>\n <div className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={() => { setCodeSent(false); setCode(''); setError(''); }}>\n Use a different email\n </button>\n </div>\n </div>\n );\n}\n\n// ── Wallet Link Step ──\n\nfunction WalletLinkStep({ onBack, onSuccess, onFatalError }: { onBack?: () => void; onSuccess: () => void; onFatalError: (msg: string) => void }) {\n const { walletAdapter, config } = useForgeConnect();\n const { linkWallet } = useWallets();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [showOther, setShowOther] = useState(false);\n const [coldWallet, setColdWallet] = useState(false);\n const mobile = useMemo(() => isMobile(), []);\n const walletConfig = config.walletConfig;\n const preferred = walletConfig?.preferredWallets ?? [];\n const onlyPreferred = walletConfig?.onlyPreferred ?? false;\n\n const coldWalletRef = useRef(coldWallet);\n coldWalletRef.current = coldWallet;\n\n const buildSignTxFnForAdapter = useCallback((adapter: any): ((txBase64: string) => Promise<string>) | undefined => {\n if (!adapter.signTransaction) return undefined;\n const TxClass = walletConfig?.Transaction;\n if (!TxClass) return undefined;\n return async (txBase64: string) => {\n const bytes = Uint8Array.from(atob(txBase64), (c) => c.charCodeAt(0));\n const tx = TxClass.from(bytes);\n const signedTx = await adapter.signTransaction(tx);\n return btoa(String.fromCharCode(...new Uint8Array(signedTx.serialize())));\n };\n }, [walletConfig?.Transaction]);\n\n const wallet = walletAdapter!;\n\n const handleConnect = async (w: NonNullable<typeof walletAdapter>['wallets'][0]) => {\n if (w.readyState !== 'Installed') {\n if (mobile) {\n const mw = MOBILE_WALLETS.find((m) => m.name === w.adapter.name);\n if (mw) { window.location.href = mw.buildUrl(window.location.href); return; }\n }\n const url = (w.adapter as any).url;\n if (url) window.open(url, '_blank');\n return;\n }\n\n setError('');\n setLoading(true);\n try {\n // Select in React context (propagates wallet state to the rest of the app)\n wallet.select(w.adapter.name);\n\n // Connect via the raw adapter (select is async state — adapter is immediate)\n if (!w.adapter.connected) await (w.adapter as any).connect();\n\n const pk = w.adapter.publicKey;\n if (!pk) throw new Error('Wallet did not provide a public key.');\n const useCold = coldWalletRef.current;\n const adapterSignMessage = (w.adapter as any).signMessage\n ? (msg: Uint8Array) => (w.adapter as any).signMessage(msg)\n : undefined;\n await linkWallet(\n pk.toBase58(),\n useCold ? undefined : adapterSignMessage,\n 'solana',\n useCold ? buildSignTxFnForAdapter(w.adapter) : undefined,\n );\n onSuccess();\n } catch (err: unknown) {\n onFatalError(err instanceof Error ? err.message : 'Could not link this wallet. Please try again.');\n }\n };\n\n const { preferredWallets, otherWallets } = useMemo(() => {\n if (!walletAdapter) return { preferredWallets: [] as any[], otherWallets: [] as any[] };\n const all = walletAdapter.wallets;\n const prefList = preferred\n .map((name) => all.find((w) => w.adapter.name === name))\n .filter(Boolean) as typeof all;\n if (onlyPreferred && preferred.length > 0) return { preferredWallets: prefList, otherWallets: [] as typeof all };\n const prefSet = new Set(preferred);\n const others = all.filter((w) => !prefSet.has(w.adapter.name) && w.readyState === 'Installed');\n return { preferredWallets: prefList, otherWallets: others };\n }, [walletAdapter?.wallets, walletConfig]);\n\n const mobileExtraWallets = useMemo(() => {\n if (!mobile || !walletAdapter) return [];\n const adapterNames = new Set(walletAdapter.wallets.map((w) => w.adapter.name));\n return MOBILE_WALLETS.filter((mw) => !adapterNames.has(mw.name));\n }, [mobile, walletAdapter?.wallets]);\n\n // Mobile without wallet adapter — show deep links\n if (!walletAdapter && mobile) {\n return (\n <div className=\"fc-tab\">\n <div className=\"fc-wallet-list\">\n {MOBILE_WALLETS.map((mw) => (\n <button key={mw.name} type=\"button\" className=\"fc-btn fc-btn-wallet\"\n onClick={() => { window.location.href = mw.buildUrl(window.location.href); }}>\n <span style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={mw.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{mw.name}</span>\n <span className=\"fc-badge-preferred\">Open app</span>\n </button>\n ))}\n </div>\n {onBack && (\n <div className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={onBack}>Back</button>\n </div>\n )}\n </div>\n );\n }\n\n // No wallet adapter at all\n if (!walletAdapter) {\n return (\n <div className=\"fc-tab\">\n <p className=\"fc-text\">\n No wallet adapter detected. Pass <code>walletAdapter</code> to{' '}\n <code>&lt;ForgeConnectProvider&gt;</code> to enable wallet connection.\n </p>\n {onBack && (\n <div className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={onBack}>Back</button>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"fc-tab\">\n {loading ? (\n <div style={{ textAlign: 'center', padding: '24px 0' }}>\n <p className=\"fc-tab-title\">Connecting...</p>\n <p className=\"fc-text\">\n {coldWallet\n ? 'Confirm the transaction on your device'\n : 'Approve the connection, then sign the verification request in your wallet'}\n </p>\n {error && (\n <>\n <p className=\"fc-error\">{error}</p>\n <button type=\"button\" className=\"fc-btn fc-btn-secondary\"\n onClick={() => { setLoading(false); setError(''); }} style={{ marginTop: 8 }}>\n Try again\n </button>\n </>\n )}\n </div>\n ) : (\n <>\n <div className=\"fc-wallet-list\">\n {preferredWallets.map((w: any) => {\n const installed = w.readyState === 'Installed';\n return (\n <button key={w.adapter.name} type=\"button\" className=\"fc-btn fc-btn-wallet\" onClick={() => handleConnect(w)}>\n <span className={installed ? 'fc-installed-dot' : ''} style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={w.adapter.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{w.adapter.name}</span>\n <span className=\"fc-badge-preferred\">Preferred</span>\n {!installed && mobile && MOBILE_WALLETS.some((mw) => mw.name === w.adapter.name)\n ? <span className=\"fc-badge-install\">Open app</span>\n : !installed && <span className=\"fc-badge-install\">Install</span>\n }\n </button>\n );\n })}\n {mobileExtraWallets.map((mw) => (\n <button key={mw.name} type=\"button\" className=\"fc-btn fc-btn-wallet\"\n onClick={() => { window.location.href = mw.buildUrl(window.location.href); }}>\n <span style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={mw.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{mw.name}</span>\n <span className=\"fc-badge-install\">Open app</span>\n </button>\n ))}\n {otherWallets.length > 0 && !showOther && (\n <button type=\"button\" className=\"fc-btn fc-btn-wallet\" onClick={() => setShowOther(true)}>\n <span className=\"fc-other-wallets-icon\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <rect x=\"2\" y=\"3\" width=\"16\" height=\"14\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2 7h16\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <rect x=\"11\" y=\"10\" width=\"7\" height=\"4\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n </span>\n <span className=\"fc-wallet-name\">Other wallets</span>\n </button>\n )}\n {showOther && otherWallets.map((w: any) => (\n <button key={w.adapter.name} type=\"button\" className=\"fc-btn fc-btn-wallet\" onClick={() => handleConnect(w)}>\n <span className=\"fc-installed-dot\" style={{ position: 'relative', display: 'inline-flex' }}>\n <img src={w.adapter.icon} alt=\"\" className=\"fc-wallet-icon\" />\n </span>\n <span className=\"fc-wallet-name\">{w.adapter.name}</span>\n </button>\n ))}\n </div>\n {preferredWallets.length === 0 && otherWallets.length === 0 && mobileExtraWallets.length === 0 && (\n <p className=\"fc-text\">No wallet found. Please install a Solana wallet (like Phantom) to continue.</p>\n )}\n\n {walletConfig?.Transaction && (\n <label className=\"fc-cold-wallet-toggle\">\n <input\n type=\"checkbox\"\n checked={coldWallet}\n onChange={(e) => setColdWallet(e.target.checked)}\n />\n <span className=\"fc-toggle-track\" />\n <span className=\"fc-cold-wallet-label\">\n <span>Hardware wallet</span>\n <span>Ledger, Trezor, Keystone...</span>\n </span>\n </label>\n )}\n\n {error && <p className=\"fc-error\">{error}</p>}\n </>\n )}\n {!loading && onBack && (\n <div className=\"fc-switch\">\n <button type=\"button\" className=\"fc-link\" onClick={onBack}>Back</button>\n </div>\n )}\n </div>\n );\n}\n\n// ── Success View ──\n\nfunction SuccessView() {\n return (\n <div className=\"fc-success\">\n <div className=\"fc-success-icon\">\n <svg viewBox=\"0 0 52 52\" className=\"fc-success-check\">\n <circle className=\"fc-success-circle\" cx=\"26\" cy=\"26\" r=\"24\" fill=\"none\" />\n <path className=\"fc-success-tick\" fill=\"none\" d=\"M15 26l7.5 7.5L37 19\" />\n </svg>\n </div>\n <p className=\"fc-success-text\">Linked</p>\n </div>\n );\n}\n","import { useForgeConnect } from '../hooks/use-forge-connect';\n\ninterface LoginButtonProps {\n className?: string;\n label?: string;\n}\n\nexport function LoginButton({ className, label }: LoginButtonProps) {\n const { auth, openModal, logout } = useForgeConnect();\n\n if (auth.status === 'loading') {\n return (\n <button type=\"button\" className={className ?? 'fc-btn fc-btn-login'} disabled>\n Loading...\n </button>\n );\n }\n\n if (auth.status === 'authenticated') {\n return (\n <button type=\"button\" className={className ?? 'fc-btn fc-btn-login'} onClick={logout}>\n {label ?? 'Log out'}\n </button>\n );\n }\n\n return (\n <button type=\"button\" className={className ?? 'fc-btn fc-btn-login'} onClick={openModal}>\n {label ?? 'Sign in'}\n </button>\n );\n}\n","import { useForgeConnect } from '../hooks/use-forge-connect.js';\n\ninterface AccountButtonProps {\n className?: string;\n loginLabel?: string;\n compact?: boolean;\n}\n\nexport function AccountButton({ className, loginLabel, compact }: AccountButtonProps) {\n const { auth, openModal, openAccountModal } = useForgeConnect();\n\n if (auth.status === 'loading') {\n return (\n <button type=\"button\" className={className ?? 'fc-btn fc-btn-login'} disabled>\n Loading...\n </button>\n );\n }\n\n if (auth.status === 'authenticated' && auth.user) {\n const user = auth.user;\n const initial = (user.displayName ?? user.primaryEmail ?? '?').charAt(0).toUpperCase();\n\n return (\n <button type=\"button\" className={className ?? 'fc-btn-account'} onClick={openAccountModal}>\n {user.avatarUrl ? (\n <img src={user.avatarUrl} alt=\"\" className=\"fc-account-avatar\" />\n ) : (\n <span className=\"fc-account-avatar-placeholder\">{initial}</span>\n )}\n {!compact && (\n <span>{user.displayName ?? user.primaryEmail ?? 'Account'}</span>\n )}\n </button>\n );\n }\n\n return (\n <button type=\"button\" className={className ?? 'fc-btn fc-btn-login'} onClick={openModal}>\n {loginLabel ?? 'Sign in'}\n </button>\n );\n}\n","import { useState, useCallback } from 'react';\nimport { useForgeConnect } from './use-forge-connect';\nimport type { User, AdminUser, Session, PaginatedResponse, UserStatus } from '../types';\n\nexport function useAdmin() {\n const { api, getAccessToken } = useForgeConnect();\n const [users, setUsers] = useState<PaginatedResponse<User> | null>(null);\n const [selectedUser, setSelectedUser] = useState<AdminUser | null>(null);\n const [userSessions, setUserSessions] = useState<Session[] | null>(null);\n const [loading, setLoading] = useState(false);\n\n const listUsers = useCallback(\n async (params?: { page?: number; limit?: number; search?: string }) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.adminListUsers(token, params);\n setUsers(data);\n return data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken],\n );\n\n const getUser = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.adminGetUser(token, id);\n setSelectedUser(data);\n return data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken],\n );\n\n const updateUserStatus = useCallback(\n async (id: string, status: UserStatus) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.adminUpdateUserStatus(token, id, status);\n // Refresh user detail if viewing same user\n if (selectedUser?.id === id) {\n await getUser(id);\n }\n },\n [api, getAccessToken, selectedUser?.id, getUser],\n );\n\n const getUserSessions = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.adminGetUserSessions(token, id);\n setUserSessions(data);\n return data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken],\n );\n\n const revokeUserSessions = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.adminRevokeUserSessions(token, id);\n setUserSessions([]);\n },\n [api, getAccessToken],\n );\n\n return {\n users,\n selectedUser,\n userSessions,\n loading,\n listUsers,\n getUser,\n updateUserStatus,\n getUserSessions,\n revokeUserSessions,\n };\n}\n","import { useState, useCallback } from 'react';\nimport { useForgeConnect } from './use-forge-connect';\nimport type { Role, RoleUser, UserRoleAssignment, PermissionDomains } from '../types';\n\nexport function useRoles() {\n const { api, getAccessToken } = useForgeConnect();\n const [roles, setRoles] = useState<Role[] | null>(null);\n const [selectedRole, setSelectedRole] = useState<Role | null>(null);\n const [userRoleAssignments, setUserRoleAssignments] = useState<UserRoleAssignment[] | null>(null);\n const [roleUsers, setRoleUsers] = useState<RoleUser[] | null>(null);\n const [permissionDomains, setPermissionDomains] = useState<PermissionDomains | null>(null);\n const [loading, setLoading] = useState(false);\n\n const listRoles = useCallback(\n async (tenantId?: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.adminListRoles(token, tenantId);\n setRoles(data.data);\n return data.data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken],\n );\n\n const getRoleUsers = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n const data = await api.adminGetRoleUsers(token, id);\n setRoleUsers(data.data);\n return data.data;\n },\n [api, getAccessToken],\n );\n\n const getRole = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.adminGetRole(token, id);\n setSelectedRole(data);\n // Also fetch users assigned to this role\n getRoleUsers(id).catch(() => {});\n return data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken, getRoleUsers],\n );\n\n const createRole = useCallback(\n async (data: { name: string; description?: string; permissions: string[]; tenantId?: string }) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n const role = await api.adminCreateRole(token, data);\n // Refresh list\n await listRoles(data.tenantId);\n return role;\n },\n [api, getAccessToken, listRoles],\n );\n\n const updateRole = useCallback(\n async (id: string, data: { name?: string; description?: string; permissions?: string[] }) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n const role = await api.adminUpdateRole(token, id, data);\n setSelectedRole(role);\n return role;\n },\n [api, getAccessToken],\n );\n\n const deleteRole = useCallback(\n async (id: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.adminDeleteRole(token, id);\n if (selectedRole?.id === id) setSelectedRole(null);\n },\n [api, getAccessToken, selectedRole?.id],\n );\n\n const getPermissions = useCallback(\n async () => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n const data = await api.adminGetPermissions(token);\n setPermissionDomains(data.domains);\n return data.domains;\n },\n [api, getAccessToken],\n );\n\n const getUserRoles = useCallback(\n async (userId: string, tenantId?: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n setLoading(true);\n try {\n const data = await api.adminGetUserRoles(token, userId, tenantId);\n setUserRoleAssignments(data.data);\n return data.data;\n } finally {\n setLoading(false);\n }\n },\n [api, getAccessToken],\n );\n\n const assignRole = useCallback(\n async (userId: string, roleId: string, tenantId?: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.adminAssignRole(token, userId, roleId, tenantId);\n },\n [api, getAccessToken],\n );\n\n const revokeRole = useCallback(\n async (userId: string, roleId: string, tenantId?: string) => {\n const token = getAccessToken();\n if (!token) throw new Error('Please sign in to continue.');\n await api.adminRevokeRole(token, userId, roleId, tenantId);\n },\n [api, getAccessToken],\n );\n\n return {\n roles,\n selectedRole,\n roleUsers,\n userRoleAssignments,\n permissionDomains,\n loading,\n listRoles,\n getRole,\n getRoleUsers,\n createRole,\n updateRole,\n deleteRole,\n getPermissions,\n getUserRoles,\n assignRole,\n revokeRole,\n };\n}\n","/**\n * Client-side permission checking utilities.\n * These mirror the server-side logic for UI gating.\n */\n\n/** Check if a single required permission is satisfied by any of the granted permissions. */\nexport function hasPermission(required: string, granted: string[]): boolean {\n for (const g of granted) {\n if (g === '*') return true;\n if (g === required) return true;\n if (g.endsWith(':*')) {\n const gDomain = g.slice(0, -2);\n const rDomain = required.split(':')[0];\n if (gDomain === rDomain) return true;\n }\n }\n return false;\n}\n\n/** Check that ALL required permissions are satisfied. */\nexport function hasAllPermissions(required: string[], granted: string[]): boolean {\n return required.every(r => hasPermission(r, granted));\n}\n\n/** Check that at least ONE of the required permissions is satisfied. */\nexport function hasAnyPermission(required: string[], granted: string[]): boolean {\n return required.some(r => hasPermission(r, granted));\n}\n"],"mappings":"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","names":["useState","useCallback","useEffect","useRef","useMemo","useState","jsx","jsxs","useState","useRef","jsx","jsxs","useState","useRef","useState","useRef","jsx","jsxs","useState","useRef","useState","jsx","jsxs","useState","useState","useRef","useEffect","useCallback","jsx","jsxs","useState","useRef","useEffect","useCallback","useRef","useEffect","jsx","jsx","jsxs","Fragment","jsx","jsxs","useState","useState","useEffect","useRef","useCallback","useState","useCallback","useEffect","useRef","useState","useRef","useCallback","useEffect","useState","useCallback","useState","useCallback","useState","useCallback","useState","useCallback","useState","useEffect","Fragment","jsx","jsxs","useState","useEffect","useState","useEffect","useCallback","jsx","jsxs","useState","useCallback","useEffect","useState","useEffect","jsx","jsxs","Fragment","jsx","jsxs","useState","useEffect","useState","useEffect","Fragment","jsx","jsxs","useState","useEffect","jsx","jsxs","useState","useRef","useEffect","useCallback","useState","useEffect","useMemo","useRef","useCallback","Fragment","jsx","jsxs","useState","useEffect","SuccessView","EmailIcon","useMemo","useRef","useCallback","jsx","jsxs","useState","useRef","useCallback","useEffect","challengeId","res","useMemo","jsx","jsx","jsxs","useState","useCallback","useState","useCallback","useState","useCallback","useState","useCallback"]}