@lumiapassport/ui-kit 1.5.3 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -62
- package/dist/iframe/index.html +1 -1
- package/dist/iframe/main.js +1 -1
- package/dist/index.cjs +33 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +15 -3
- package/dist/index.d.ts +15 -3
- package/dist/index.js +31 -13
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config/lumiaPassport.tsx","../src/internal/utils/env.ts","../src/internal/clients/base.ts","../src/config/wagmi.ts","../src/context/WagmiContext.tsx","../src/internal/auth/base64url.ts","../src/internal/auth/webauthn.ts","../src/internal/utils/projectId.ts","../src/internal/auth/passkeyAuth.ts","../src/internal/auth/telegram.ts","../src/internal/lib/site.ts","../src/internal/auth/passkey.ts","../src/internal/lib/iframe-mpc-client.ts","../src/internal/clients/httpClient.ts","../src/internal/cloudStorage.ts","../src/internal/vaultClient.ts","../src/internal/auth/keyshare.ts","../src/internal/auth/providers/types.ts","../src/internal/auth/providers/common.ts","../src/internal/auth/providers/email.ts","../src/internal/auth/providers/passkey.ts","../src/internal/auth/providers/telegram.ts","../src/internal/auth/providers/wallet.ts","../src/internal/auth/providers/index.ts","../src/internal/auth/index.ts","../src/internal/lib/iframe-manager.ts","../src/context/LumiaPassportContext.tsx","../src/internal/hooks/useTheme.ts","../src/internal/lib/utils.ts","../src/internal/components/ui/dialog.tsx","../src/internal/components/ui/button.tsx","../src/internal/components/ui/alert-dialog.tsx","../src/internal/components/ErrorAlert.tsx","../src/internal/components/LumiaLogo.tsx","../src/internal/components/FailedScreen.tsx","../src/internal/components/TermsOfService.tsx","../src/internal/components/ui/card.tsx","../src/internal/components/ui/input.tsx","../src/internal/components/KeyshareRestore.tsx","../src/internal/components/VerificationCodeInput.tsx","../src/internal/clients/profile.ts","../src/internal/components/DisplayNameInput.tsx","../src/internal/components/AuthModal.tsx","../src/internal/akHelpers.ts","../src/internal/clients/account.ts","../src/internal/clients/utils.ts","../src/internal/clients/index.ts","../src/index.ts","../src/styles/built.css","../src/context/LumiaPassportSessionContext.tsx","../src/context/RainbowKitContext.tsx","../src/config/rainbowkit.ts","../src/components/ConnectWalletButton.tsx","../src/internal/components/ui/visually-hidden.tsx","../src/internal/components/TssManager.tsx","../src/internal/components/ManageWallet.tsx","../src/internal/components/WalletConnectHandler.tsx","../src/internal/components/SecurityModal.tsx","../src/internal/components/KeyshareBackup.tsx","../src/internal/components/TransactionsModal.tsx","../src/internal/components/ViewAssetsModal.tsx","../src/modules/assets.ts","../src/internal/components/SendModal.tsx","../src/hooks/useSendTransaction.ts","../src/internal/components/UserOpStatus.tsx","../src/internal/components/ui/badge.tsx","../src/internal/utils/cn.ts","../src/internal/components/Address.tsx","../src/internal/components/ReceiveModal.tsx","../src/internal/components/BuyModal.tsx","../src/internal/components/KycModal.tsx","../src/modules/linkedProfiles.ts","../package.json","../src/components/ThemeToggle.tsx","../src/components/LumiaLogo.tsx","../src/hooks/useTheme.ts","../src/internal/components/Hash.tsx","../src/internal/components/TransactionsList.tsx","../src/hooks/useUserOpStatus.ts","../src/modules/transactions.ts","../src/modules/smartAccountTransactions.ts"],"sourcesContent":["/**\n * LumiaPassport Configuration (library copy)\n * Default config can be overridden via Provider initialConfig\n */\n\nimport React from 'react';\n\n// Build-time injected globals (tsup.define). Declare for type-checking.\ndeclare const __LUMIA_TSS_URL__: string;\ndeclare const __LUMIA_BUNDLER_URL__: string;\ndeclare const __LUMIA_SHARE_VAULT_URL__: string;\ndeclare const __LUMIA_IFRAME_URL__: string;\ndeclare const __LUMIA_TSS_REQUIRE_WASM__: boolean;\ndeclare const __LUMIA_TSS_WASM_DEBUG__: boolean;\ndeclare const __LUMIA_TG_BOT__: string;\ndeclare const __LUMIA_TG_SALT__: string;\ndeclare const __LUMIA_AA_FACTORY_ADDRESS__: string;\ndeclare const __LUMIA_PAYMASTER_ADDRESS__: string;\ndeclare const __LUMIA_EXPLORER_URL__: string;\ndeclare const __LUMIA_RPC_URL__: string;\n\ndeclare global {\n interface Window {\n __LUMIA_SERVICES__?: Partial<{\n bundlerUrl: string;\n tssUrl: string;\n shareVaultUrl: string;\n tssRequireWasm: boolean;\n tssWasmDebug: boolean;\n }>;\n __LUMIA_PROJECT_ID__?: string;\n }\n}\n\nexport interface SocialProvider {\n id: string;\n name: string;\n enabled: boolean;\n icon: React.ComponentType<{ className?: string }>;\n comingSoon?: boolean;\n meta?: Record<string, any>;\n}\n\nexport interface LumiaPassportConfig {\n projectId?: string;\n passkey: {\n enabled: boolean;\n showCreateButton: boolean;\n primaryButtonText: string;\n };\n email: {\n enabled: boolean;\n placeholder: string;\n buttonText: string;\n verificationTitle: string;\n };\n social: {\n enabled: boolean;\n providers: SocialProvider[];\n gridColumns: number;\n };\n wallet: {\n enabled: boolean;\n supportedChains?: number[];\n requireSignature: boolean;\n walletConnectProjectId?: string;\n };\n development: {\n enabled: boolean;\n showOnProduction: boolean;\n };\n ui: {\n title: string;\n subtitle?: string;\n theme: 'light' | 'dark' | 'auto';\n // Controls the order of auth sections on the sign-in screen\n authOrder?: Array<'passkey' | 'email' | 'social'>;\n // When true, open Auth modal automatically when button mounts (for unauthenticated users)\n authOpen?: boolean;\n fonts?: {\n base?: string; // CSS font-family string\n heading?: string; // CSS font-family string for headings\n };\n colors?: {\n // Light theme colors\n light?: {\n background?: string; // Main background color\n text?: string; // Primary text color\n textSecondary?: string; // Secondary text color\n textMuted?: string; // Muted/disabled text color\n border?: string; // Border color\n buttonBackground?: string; // Connect button background (gradient start)\n buttonBackgroundEnd?: string; // Connect button background (gradient end)\n buttonText?: string; // Connect button text color\n buttonBackgroundHover?: string; // Connect button hover background (gradient start)\n buttonBackgroundHoverEnd?: string; // Connect button hover background (gradient end)\n connectedButtonBackground?: string; // Connected state button background\n connectedButtonBorder?: string; // Connected state button border\n };\n // Dark theme colors\n dark?: {\n background?: string; // Main background color\n text?: string; // Primary text color\n textSecondary?: string; // Secondary text color\n textMuted?: string; // Muted/disabled text color\n border?: string; // Border color\n buttonBackground?: string; // Connect button background (gradient start)\n buttonBackgroundEnd?: string; // Connect button background (gradient end)\n buttonText?: string; // Connect button text color\n buttonBackgroundHover?: string; // Connect button hover background (gradient start)\n buttonBackgroundHoverEnd?: string; // Connect button hover background (gradient end)\n connectedButtonBackground?: string; // Connected state button background\n connectedButtonBorder?: string; // Connected state button border\n };\n };\n branding: {\n logo?: React.ComponentType<{ size?: number }>;\n tagline: string;\n link?: { text: string; url: string };\n };\n modal: { width: string; borderRadius: string };\n };\n network: {\n name: string;\n symbol: string;\n chainId: number;\n rpcUrl: string;\n explorerUrl?: string;\n testnet?: boolean;\n };\n services: {\n bundlerUrl: string;\n tssUrl: string;\n shareVaultUrl: string;\n iframeUrl?: string; // URL for secure iframe wallet (default: https://auth.lumiapassport.com)\n tssRequireWasm?: boolean;\n tssWasmDebug?: boolean;\n };\n features: {\n mpcSecurity: boolean;\n strictMode: boolean;\n requestDeduplication: boolean;\n kycNeeded?: boolean;\n displayNameNeeded?: boolean;\n };\n warnings: {\n backupWarning: boolean;\n emailNotConnectedWarning: boolean;\n };\n kyc?: {\n provider?: 'sumsub' | 'uaepass' | 'custom';\n options?: Record<string, any>; // provider-specific metadata\n };\n}\n\nexport const GoogleIcon: React.FC<{ className?: string }> = ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className}>\n <path fill=\"#4285F4\" d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\n <path fill=\"#34A853\" d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <path fill=\"#FBBC05\" d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <path fill=\"#EA4335\" d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </svg>\n);\n\nexport const TelegramIcon: React.FC<{ className?: string }> = ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className} fill=\"#229ED9\">\n <path d=\"M9.78 18.65l.28-4.23 7.68-6.92c.34-.31-.07-.46-.52-.19L7.74 13.3 3.64 12c-.88-.25-.89-.86.2-1.3l15.97-6.16c.73-.33 1.43.18 1.15 1.3l-2.72 12.81c-.19.91-.74 1.13-1.5.71L12.6 16.3l-1.99 1.93c-.23.23-.42.42-.83.42z\" />\n </svg>\n);\n\nexport const TwitterIcon: React.FC<{ className?: string }> = ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className} fill=\"currentColor\">\n <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\" />\n </svg>\n);\n\nexport const DiscordIcon: React.FC<{ className?: string }> = ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className}>\n <path\n fill=\"#5865F2\"\n d=\"M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515a.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0a12.64 12.64 0 0 0-.617-1.25a.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.057a19.9 19.9 0 0 0 5.993 3.03a.078.078 0 0 0 .084-.028a14.09 14.09 0 0 0 1.226-1.994a.076.076 0 0 0-.041-.106a13.107 13.107 0 0 1-1.872-.892a.077.077 0 0 1-.008-.128a10.2 10.2 0 0 0 .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.127a12.299 12.299 0 0 1-1.873.892a.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028a19.839 19.839 0 0 0 6.002-3.03a.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.956-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.955-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.946 2.418-2.157 2.418Z\"\n />\n </svg>\n);\n\nexport const defaultLumiaPassportConfig: LumiaPassportConfig = {\n passkey: {\n enabled: true,\n showCreateButton: true,\n primaryButtonText: 'Sign in with Passkey'\n },\n email: {\n enabled: true,\n placeholder: 'Enter your email',\n buttonText: 'Continue',\n verificationTitle: 'Check your email'\n },\n social: {\n enabled: true,\n gridColumns: 4,\n providers: [\n { id: 'google', name: 'Google', enabled: true, icon: GoogleIcon, comingSoon: true },\n { id: 'telegram', name: 'Telegram', enabled: true, icon: TelegramIcon, comingSoon: false, meta: {\n botUsername: (typeof __LUMIA_TG_BOT__ !== 'undefined' && __LUMIA_TG_BOT__) || undefined,\n salt: (typeof __LUMIA_TG_SALT__ !== 'undefined' && __LUMIA_TG_SALT__) || 'demo'\n } }\n ]\n },\n wallet: {\n enabled: true,\n supportedChains: [1, 137, 56],\n requireSignature: true,\n walletConnectProjectId: undefined\n },\n development: {\n enabled: true,\n showOnProduction: false\n },\n ui: {\n title: 'Sign in',\n subtitle: undefined,\n theme: 'auto',\n authOrder: ['passkey', 'email', 'social'],\n authOpen: false,\n fonts: {\n base: 'system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif',\n heading: 'system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif',\n },\n branding: {\n tagline: 'Lumia Passport MPC',\n link: { text: 'Lumia Passport MPC', url: '/mpc-security' }\n },\n modal: { width: '400px', borderRadius: '24px' }\n },\n network: {\n name: 'Lumia Beam',\n symbol: 'LUMIA',\n chainId: 2030232745,\n rpcUrl: 'https://beam-rpc.lumia.org',\n explorerUrl: 'https://beam-explorer.lumia.org',\n testnet: true\n },\n services: {\n bundlerUrl: '', // Will fallback to build-time env vars\n tssUrl: '', // Will fallback to build-time env vars\n shareVaultUrl: '', // Will fallback to build-time env vars\n iframeUrl: 'https://auth.lumiapassport.com', // Secure iframe for MPC operations\n tssRequireWasm: false,\n tssWasmDebug: false\n },\n features: {\n mpcSecurity: true,\n strictMode: false,\n requestDeduplication: true,\n kycNeeded: false,\n displayNameNeeded: false\n },\n warnings: {\n backupWarning: true,\n emailNotConnectedWarning: true\n },\n kyc: {\n provider: undefined,\n options: undefined\n }\n};\n\nexport function getServiceUrls() {\n const config = defaultLumiaPassportConfig;\n const globalOverride = (typeof window !== 'undefined' && window.__LUMIA_SERVICES__) || {};\n const searchParams = typeof window !== 'undefined' ? new URLSearchParams(window.location.search) : undefined;\n const paramBundler = searchParams?.get('bundlerUrl') || undefined;\n const paramTss = searchParams?.get('tssUrl') || undefined;\n const paramVault = searchParams?.get('shareVaultUrl') || undefined;\n // Build-time injected (via tsup.define)\n const buildBundler = (typeof __LUMIA_BUNDLER_URL__ !== 'undefined' && __LUMIA_BUNDLER_URL__) || '';\n const buildTss = (typeof __LUMIA_TSS_URL__ !== 'undefined' && __LUMIA_TSS_URL__) || '';\n const buildVault = (typeof __LUMIA_SHARE_VAULT_URL__ !== 'undefined' && __LUMIA_SHARE_VAULT_URL__) || '';\n const buildRequireWasm = (typeof __LUMIA_TSS_REQUIRE_WASM__ !== 'undefined' && (__LUMIA_TSS_REQUIRE_WASM__ as any) === true) || false;\n const buildWasmDebug = (typeof __LUMIA_TSS_WASM_DEBUG__ !== 'undefined' && (__LUMIA_TSS_WASM_DEBUG__ as any) === true) || false;\n\n // Use sensible defaults as last fallback\n const defaultBundler = '/bundler';\n const defaultTss = '/tss';\n const defaultVault = '/vault';\n\n const result = {\n bundlerUrl: paramBundler || globalOverride.bundlerUrl || buildBundler || config.services.bundlerUrl || defaultBundler,\n tssUrl: paramTss || globalOverride.tssUrl || buildTss || config.services.tssUrl || defaultTss,\n shareVaultUrl: paramVault || globalOverride.shareVaultUrl || buildVault || config.services.shareVaultUrl || defaultVault,\n tssRequireWasm: globalOverride.tssRequireWasm ?? buildRequireWasm ?? config.services.tssRequireWasm ?? false,\n tssWasmDebug: globalOverride.tssWasmDebug ?? buildWasmDebug ?? config.services.tssWasmDebug ?? false\n };\n\n return result;\n}\n\nexport function getIframeUrl(): string {\n const config = defaultLumiaPassportConfig;\n\n // Build-time injected iframe URL (from LUMIA_IFRAME_URL env var)\n const buildIframeUrl = (typeof __LUMIA_IFRAME_URL__ !== 'undefined' && __LUMIA_IFRAME_URL__) || '';\n\n // Priority: build-time env var > config > default production URL\n const iframeUrl = buildIframeUrl || config.services.iframeUrl || 'https://auth.lumiapassport.com';\n\n return iframeUrl;\n}\n\nexport function getLumiaPassportConfig(): LumiaPassportConfig {\n return defaultLumiaPassportConfig;\n}\n\nexport function updateLumiaPassportConfig(updates: Partial<LumiaPassportConfig>): LumiaPassportConfig {\n const config = { ...defaultLumiaPassportConfig } as LumiaPassportConfig;\n if (updates.passkey) config.passkey = { ...config.passkey, ...updates.passkey };\n if (updates.email) config.email = { ...config.email, ...updates.email };\n if (updates.social) {\n config.social = { ...config.social, ...updates.social };\n if (updates.social.providers) config.social.providers = updates.social.providers;\n }\n if (updates.development) config.development = { ...config.development, ...updates.development };\n if (updates.ui) {\n config.ui = { ...config.ui, ...updates.ui };\n if (updates.ui.branding) config.ui.branding = { ...config.ui.branding, ...updates.ui.branding };\n if (updates.ui.modal) config.ui.modal = { ...config.ui.modal, ...updates.ui.modal };\n }\n if (updates.network) config.network = { ...config.network, ...updates.network };\n if (updates.features) config.features = { ...config.features, ...updates.features };\n if (updates.warnings) config.warnings = { ...config.warnings, ...updates.warnings };\n if (updates.kyc) config.kyc = { ...config.kyc, ...updates.kyc };\n return config;\n}\n\n// LumiaPassportConfig is already exported as a type above; avoid duplicate export.\n","/**\n * Universal environment variable access that works in both ESM and CJS builds\n */\n\ninterface EnvVars {\n VITE_FORCE_LEGACY_GAS?: string;\n VITE_LEGACY_GAS_CHAIN_IDS?: string;\n NODE_ENV?: string;\n MODE?: string;\n}\n\nfunction getEnvironmentVars(): EnvVars {\n // Try browser environment first (Vite)\n if (typeof window !== 'undefined' && (window as any).__LUMIA_ENV__) {\n return (window as any).__LUMIA_ENV__;\n }\n\n // Try import.meta.env (ESM/Vite)\n if (typeof globalThis !== 'undefined' && (globalThis as any).import?.meta?.env) {\n return (globalThis as any).import.meta.env;\n }\n\n // Try process.env (Node.js/CJS)\n if (typeof process !== 'undefined' && process.env) {\n return process.env;\n }\n\n // Fallback for browser environment without explicit env\n return {};\n}\n\nexport function getEnvVar(name: string): string | undefined {\n const env = getEnvironmentVars();\n return (env as any)[name];\n}\n\nexport function getEnvVarBool(name: string): boolean {\n const value = getEnvVar(name);\n return value === 'true' || value === '1';\n}\n\nexport function getEnvVarArray(name: string, separator = ','): string[] {\n const value = getEnvVar(name);\n return value ? value.split(separator).map(s => s.trim()).filter(Boolean) : [];\n}\n\nexport function getAllEnvVars(): EnvVars {\n return getEnvironmentVars();\n}\n","import { defineChain, http, createPublicClient, type Chain } from 'viem';\nimport { createBundlerClient } from 'viem/account-abstraction';\nimport { getServiceUrls } from '../../config/lumiaPassport';\nimport { getEnvVar } from '../utils/env';\n\n// Unified service URL resolution for all endpoints\nexport function getTssUrl(): string {\n const serviceUrls = getServiceUrls();\n const paramUrl = typeof window !== 'undefined' ? new URLSearchParams(window.location.search).get('tssUrl') || undefined : undefined;\n const envUrl = getEnvVar('VITE_LUMIA_TSS_URL') || getEnvVar('LUMIA_TSS_URL');\n return paramUrl || serviceUrls.tssUrl || envUrl || 'http://localhost:9256';\n}\n\nexport function getBundlerUrl(): string {\n const serviceUrls = getServiceUrls();\n const paramUrl = typeof window !== 'undefined' ? new URLSearchParams(window.location.search).get('bundlerUrl') || undefined : undefined;\n const envUrl = getEnvVar('VITE_LUMIA_BUNDLER_URL') || getEnvVar('LUMIA_BUNDLER_URL');\n const proxyPath = '/bundler';\n return (paramUrl || serviceUrls.bundlerUrl || envUrl || 'http://localhost:4337').replace(/^\\/$/, proxyPath);\n}\n\nexport function getShareVaultUrl(): string {\n const serviceUrls = getServiceUrls();\n const paramUrl = typeof window !== 'undefined' ? new URLSearchParams(window.location.search).get('shareVaultUrl') || undefined : undefined;\n const envUrl = getEnvVar('VITE_LUMIA_SHARE_VAULT_URL') || getEnvVar('LUMIA_SHARE_VAULT_URL');\n return paramUrl || serviceUrls.shareVaultUrl || envUrl || 'http://localhost:9090';\n}\n\n// Network selection and defaults\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst BUILD_NETWORK = typeof __LUMIA_NETWORK__ !== 'undefined' ? (__LUMIA_NETWORK__ as string) : '';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst BUILD_CHAIN_ID = typeof __LUMIA_CHAIN_ID__ !== 'undefined' ? (__LUMIA_CHAIN_ID__ as string) : '';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst BUILD_NETWORK_NAME = typeof __LUMIA_NETWORK_NAME__ !== 'undefined' ? (__LUMIA_NETWORK_NAME__ as string) : '';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst BUILD_NATIVE_SYMBOL = typeof __LUMIA_NATIVE_SYMBOL__ !== 'undefined' ? (__LUMIA_NATIVE_SYMBOL__ as string) : '';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst BUILD_CHAIN_LOGO_DATA_URI = typeof __LUMIA_CHAIN_LOGO_DATA_URI__ !== 'undefined' ? (__LUMIA_CHAIN_LOGO_DATA_URI__ as string) : '';\n\nfunction getSelectedNetwork(): 'beam' | 'prisma' {\n const paramNet = typeof window !== 'undefined' ? (new URLSearchParams(window.location.search).get('network') || '').toLowerCase() : '';\n const envNet = (getEnvVar('VITE_LUMIA_NETWORK') || getEnvVar('LUMIA_NETWORK') || BUILD_NETWORK || '').toLowerCase();\n const net = (paramNet || envNet) as string;\n return net === 'prisma' ? 'prisma' : 'beam';\n}\n\nfunction defaultRpcUrl(network: 'beam' | 'prisma'): string {\n return network === 'prisma' ? 'https://prisma-rpc.lumia.org' : 'https://beam-rpc.lumia.org';\n}\n\nfunction defaultExplorerUrl(network: 'beam' | 'prisma'): string {\n return network === 'prisma' ? 'https://explorer.lumia.org/' : 'https://beam-explorer.lumia.org/';\n}\n\nexport function getExplorerUrl(): string {\n const paramUrl = typeof window !== 'undefined' ? new URLSearchParams(window.location.search).get('explorerUrl') || undefined : undefined;\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const buildUrl = typeof __LUMIA_EXPLORER_URL__ !== 'undefined' ? __LUMIA_EXPLORER_URL__ : '';\n const envUrl = getEnvVar('VITE_LUMIA_EXPLORER_URL');\n const net = getSelectedNetwork();\n return paramUrl || (buildUrl as string) || envUrl || defaultExplorerUrl(net);\n}\n\n// Note: Previously exported BUNDLER_URL and TSS_URL constants have been removed\n// Always use getBundlerUrl(), getTssUrl(), getShareVaultUrl() functions instead\n// to ensure dynamic configuration updates are reflected\n\n// Prefer build-time injected URLs if provided\n// Legacy export for backward compatibility - use getExplorerUrl() for dynamic updates\nexport const LUMIA_EXPLORER_URL: string = getExplorerUrl();\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst BUILD_RPC_URL = typeof __LUMIA_RPC_URL__ !== 'undefined' ? __LUMIA_RPC_URL__ : '';\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst BUILD_AA_FACTORY_ADDRESS = typeof __LUMIA_AA_FACTORY_ADDRESS__ !== 'undefined' ? __LUMIA_AA_FACTORY_ADDRESS__ : '';\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst BUILD_PAYMASTER_ADDRESS = typeof __LUMIA_PAYMASTER_ADDRESS__ !== 'undefined' ? __LUMIA_PAYMASTER_ADDRESS__ : '';\n\n// Chain definitions\nconst BEAM_DEFAULTS = {\n id: 2030232745,\n name: 'Lumia Beam Testnet',\n symbol: 'LUMIA',\n};\n\nconst PRISMA_DEFAULTS = {\n // Note: chainId can be overridden via env LUMIA_CHAIN_ID\n id: Number(BUILD_CHAIN_ID || getEnvVar('VITE_LUMIA_CHAIN_ID') || getEnvVar('LUMIA_CHAIN_ID') || BEAM_DEFAULTS.id),\n name: BUILD_NETWORK_NAME || 'Lumia Prisma',\n symbol: BUILD_NATIVE_SYMBOL || 'LUMIA',\n};\n\nexport const lumiaBeamTestnet: Chain = defineChain({\n id: BEAM_DEFAULTS.id,\n name: BEAM_DEFAULTS.name,\n nativeCurrency: { name: BEAM_DEFAULTS.symbol, symbol: BEAM_DEFAULTS.symbol, decimals: 18 },\n rpcUrls: {\n default: { http: [(BUILD_RPC_URL as string) || defaultRpcUrl('beam')] },\n public: { http: [(BUILD_RPC_URL as string) || defaultRpcUrl('beam')] },\n },\n blockExplorers: { default: { name: 'Lumia Beam Explorer', url: LUMIA_EXPLORER_URL.replace(/\\/$/, '') } },\n // Custom field: logo identifier for UI\n logo: 'lumia',\n logoDataUri: BUILD_CHAIN_LOGO_DATA_URI || undefined,\n} as unknown as Chain);\n\nexport const lumiaPrisma: Chain = defineChain({\n id: PRISMA_DEFAULTS.id,\n name: PRISMA_DEFAULTS.name,\n nativeCurrency: { name: PRISMA_DEFAULTS.symbol, symbol: PRISMA_DEFAULTS.symbol, decimals: 18 },\n rpcUrls: {\n default: { http: [(BUILD_RPC_URL as string) || defaultRpcUrl('prisma')] },\n public: { http: [(BUILD_RPC_URL as string) || defaultRpcUrl('prisma')] },\n },\n blockExplorers: { default: { name: 'Lumia Explorer', url: LUMIA_EXPLORER_URL.replace(/\\/$/, '') } },\n // Custom field: logo identifier for UI\n logo: 'lumia',\n logoDataUri: BUILD_CHAIN_LOGO_DATA_URI || undefined,\n} as unknown as Chain);\n\n// Active chain is selected by env/network param; exported under the legacy name\nconst ACTIVE_CHAIN: Chain = (getSelectedNetwork() === 'prisma' ? lumiaPrisma : lumiaBeamTestnet) as Chain;\nexport const lumiaBeam: Chain = ACTIVE_CHAIN;\n\nexport const ENTRYPOINT_V07 = '0x0000000071727De22E5E9d8BAf0edAc6f37da032' as const;\nexport const ENTRYPOINT_V06 = '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789' as const;\nexport const ENTRYPOINT = ENTRYPOINT_V07;\n\nexport const LUMIA_AA_FACTORY_ADDRESS = (BUILD_AA_FACTORY_ADDRESS as string) || getEnvVar('VITE_LUMIA_AA_FACTORY_ADDRESS') || '';\nexport const FACTORY_ADDRESS = LUMIA_AA_FACTORY_ADDRESS;\nexport const COMPAT_FACTORY_ADDRESS = LUMIA_AA_FACTORY_ADDRESS;\nexport const LUMIA_FACTORY_ADDRESS = LUMIA_AA_FACTORY_ADDRESS;\nexport const LUMIA_PAYMASTER_ADDRESS = (BUILD_PAYMASTER_ADDRESS as string) || getEnvVar('VITE_LUMIA_PAYMASTER_ADDRESS') || '';\nexport const FUNDER_PK = getEnvVar('VITE_FUNDER_PK') || '';\n\nexport const publicClient = createPublicClient({\n chain: lumiaBeam,\n transport: http(lumiaBeam.rpcUrls.default.http[0], { timeout: 10_000, retryCount: 2, fetchOptions: { mode: 'cors' } }),\n});\n\n// Create bundler client dynamically to get the latest URL\nexport function getBundlerClient() {\n return createBundlerClient({\n chain: lumiaBeam,\n transport: http(getBundlerUrl(), { timeout: 10_000, retryCount: 0, fetchOptions: { mode: 'cors' } }),\n });\n}\n\nexport const bundlerClient = getBundlerClient();\n\nexport const beamPublic = publicClient;\nexport const viemBundlerClient = bundlerClient;\n","import { createConfig, http } from 'wagmi';\nimport { QueryClient } from '@tanstack/react-query';\nimport { lumiaBeam } from '../internal/clients/base';\n\nexport const queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 1000 * 60 * 5, // 5 minutes\n gcTime: 1000 * 60 * 10, // 10 minutes\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n retry: false,\n },\n },\n});\n\nexport const wagmiConfig = createConfig({\n chains: [lumiaBeam],\n transports: {\n [lumiaBeam.id]: http(lumiaBeam.rpcUrls.default.http[0], {\n timeout: 10_000,\n retryCount: 0,\n batch: false, // Disable batch requests\n fetchOptions: { mode: 'cors' },\n }),\n },\n});","import React from 'react';\nimport { WagmiProvider } from 'wagmi';\nimport { QueryClientProvider } from '@tanstack/react-query';\nimport { wagmiConfig, queryClient } from '../config/wagmi';\n\nexport interface LumiaWagmiProviderProps {\n children: React.ReactNode;\n}\n\nexport const LumiaWagmiProvider: React.FC<LumiaWagmiProviderProps> = ({ children }) => {\n return (\n <WagmiProvider config={wagmiConfig}>\n {/* <QueryClientProvider client={queryClient}> */}\n {children}\n {/* </QueryClientProvider> */}\n </WagmiProvider>\n );\n};","/**\n * Base64URL encoding/decoding utilities for browser\n * Re-exports core functionality and adds browser-specific helpers\n */\n\n// Re-export core base64url functions\nexport * from '@lumiapassport/core/auth';\n\n/**\n * Convert ArrayBuffer to base64url string (browser-specific)\n */\nexport function arrayBufferToBase64url(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n const base64 = btoa(binary);\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n\n/**\n * Convert base64url string to Uint8Array (browser-specific)\n */\nexport function base64urlToUint8Array(base64url: string): Uint8Array {\n const base64 = base64url.replace(/-/g, '+').replace(/_/g, '/');\n const pad = base64.length % 4 ? 4 - (base64.length % 4) : 0;\n const padded = base64 + '='.repeat(pad);\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n","import { arrayBufferToBase64url } from './base64url';\n\nexport type AttestationCredentialPayload = {\n id: string;\n rawId: string; // base64url\n type: string; // \"public-key\"\n response: {\n clientDataJSON: string; // base64url\n attestationObject: string; // base64url\n transports?: string[];\n };\n};\n\nexport function credentialToAttestationPayload(credential: PublicKeyCredential): AttestationCredentialPayload {\n const response = credential.response as AuthenticatorAttestationResponse & {\n getTransports?: () => string[];\n };\n\n const transports = (response as any).getTransports?.() || [];\n\n return {\n id: credential.id,\n rawId: arrayBufferToBase64url(credential.rawId),\n type: credential.type,\n response: {\n clientDataJSON: arrayBufferToBase64url(response.clientDataJSON),\n attestationObject: arrayBufferToBase64url(response.attestationObject),\n transports,\n },\n };\n}\n\n","/**\n * Helper to add projectId to URL query parameters\n * This is used across the codebase to ensure projectId is sent with every request\n */\nexport function addProjectIdToUrl(url: string): string {\n try {\n const projectId = typeof window !== 'undefined' ? (window as any).__LUMIA_PROJECT_ID__ : undefined;\n if (projectId) {\n const separator = url.includes('?') ? '&' : '?';\n return `${url}${separator}projectId=${encodeURIComponent(projectId)}`;\n }\n } catch {}\n return url;\n}\n\n/**\n * Get projectId from window global\n */\nexport function getProjectId(): string | undefined {\n try {\n return typeof window !== 'undefined' ? (window as any).__LUMIA_PROJECT_ID__ : undefined;\n } catch {\n return undefined;\n }\n}\n","/**\n * Browser-specific passkey authentication functions\n * These functions work with WebAuthn API and are UI-specific\n */\n\nimport { jwtTokenManager } from '@lumiapassport/core/auth';\nimport type { LoginResponse } from '@lumiapassport/core/auth';\nimport { credentialToAttestationPayload } from './webauthn';\nimport { arrayBufferToBase64url, base64urlToUint8Array } from './base64url';\nimport { addProjectIdToUrl } from '../utils/projectId';\nimport { getServiceUrls } from '../../config/lumiaPassport';\n\nfunction getTssUrl(): string {\n return getServiceUrls().tssUrl;\n}\n\n/**\n * Begin passkey authentication flow\n */\nexport async function beginPasskeyAuthentication(\n username?: string\n): Promise<{\n challenge: string;\n challengeId: string;\n options: PublicKeyCredentialRequestOptions;\n}> {\n const response = await fetch(\n addProjectIdToUrl(`${getTssUrl()}/api/auth/passkey/login/begin`),\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ username }),\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Failed to begin authentication');\n throw new Error(`Begin auth failed: ${response.status} ${errorText}`);\n }\n\n const beginResponse = await response.json();\n\n const options: PublicKeyCredentialRequestOptions = {\n challenge: base64urlToUint8Array(beginResponse.challenge),\n allowCredentials: (beginResponse.allowCredentials || []).map((cred: any) => ({\n type: cred.type,\n id: base64urlToUint8Array(cred.id),\n transports: cred.transports,\n })),\n timeout: beginResponse.timeout,\n userVerification: beginResponse.userVerification || 'preferred',\n extensions: beginResponse.extensions,\n };\n\n return {\n challenge: beginResponse.challenge,\n challengeId: beginResponse.challengeId,\n options,\n };\n}\n\n/**\n * Complete passkey authentication flow\n */\nexport async function completePasskeyAuthentication(\n challengeId: string,\n credential: PublicKeyCredential,\n options?: { skipTokenSave?: boolean }\n): Promise<LoginResponse> {\n const response = credential.response as AuthenticatorAssertionResponse;\n\n const credentialData = {\n id: credential.id,\n rawId: arrayBufferToBase64url(credential.rawId),\n type: credential.type,\n response: {\n clientDataJSON: arrayBufferToBase64url(response.clientDataJSON),\n authenticatorData: arrayBufferToBase64url(response.authenticatorData),\n signature: arrayBufferToBase64url(response.signature),\n userHandle: response.userHandle ? arrayBufferToBase64url(response.userHandle) : null,\n },\n };\n\n const completeResponse = await fetch(\n addProjectIdToUrl(`${getTssUrl()}/api/auth/passkey/login/complete`),\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ challengeId, credential: credentialData }),\n }\n );\n\n if (!completeResponse.ok) {\n let message = 'Authentication failed';\n try {\n const err = await completeResponse.json();\n message = err?.message || message;\n } catch {\n try {\n const text = await completeResponse.text();\n message = (text || message).slice(0, 200);\n } catch {}\n }\n throw new Error(`Complete authentication failed: ${completeResponse.status} ${message}`);\n }\n\n const loginResponse: LoginResponse = (await completeResponse.json()) as LoginResponse;\n if (!options?.skipTokenSave) {\n await jwtTokenManager.setTokens(loginResponse);\n }\n return loginResponse;\n}\n\n/**\n * Begin passkey registration flow\n */\nexport async function beginPasskeyRegistration(\n username: string\n): Promise<{\n challengeId: string;\n options: PublicKeyCredentialCreationOptions;\n}> {\n const response = await fetch(\n addProjectIdToUrl(`${getTssUrl()}/api/auth/passkey/register/begin`),\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ username }),\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Failed to begin registration');\n throw new Error(`Begin registration failed: ${response.status} ${errorText}`);\n }\n\n const beginResponse = await response.json();\n\n const options: PublicKeyCredentialCreationOptions = {\n rp: beginResponse.rp,\n user: {\n id: base64urlToUint8Array(beginResponse.user.id),\n name: beginResponse.user.name,\n displayName: beginResponse.user.displayName,\n },\n challenge: base64urlToUint8Array(beginResponse.challenge),\n pubKeyCredParams: beginResponse.pubKeyCredParams,\n timeout: beginResponse.timeout,\n attestation: beginResponse.attestation,\n authenticatorSelection: {\n ...beginResponse.authenticatorSelection,\n residentKey: 'preferred',\n requireResidentKey: false,\n userVerification: 'preferred',\n },\n excludeCredentials:\n beginResponse.excludeCredentials?.map((cred: any) => ({\n type: cred.type,\n id: base64urlToUint8Array(cred.id),\n transports: cred.transports,\n })) || undefined,\n };\n\n return {\n challengeId: beginResponse.challengeId,\n options,\n };\n}\n\n/**\n * Complete passkey registration flow\n */\nexport async function completePasskeyRegistration(\n challengeId: string,\n credential: PublicKeyCredential,\n options?: { skipTokenSave?: boolean }\n): Promise<LoginResponse> {\n const credentialData = credentialToAttestationPayload(credential);\n\n const completeResponse = await fetch(\n addProjectIdToUrl(`${getTssUrl()}/api/auth/passkey/register/complete`),\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ challengeId, credential: credentialData }),\n }\n );\n\n if (!completeResponse.ok) {\n const errorText = await completeResponse.text().catch(() => 'Registration failed');\n throw new Error(errorText);\n }\n\n const loginResponse: LoginResponse = (await completeResponse.json()) as LoginResponse;\n if (!options?.skipTokenSave) {\n await jwtTokenManager.setTokens(loginResponse);\n }\n return loginResponse;\n}\n","import { isHex, toHex, keccak256, stringToBytes } from 'viem';\n\nexport type TelegramUser = {\n id: number;\n first_name?: string;\n last_name?: string;\n username?: string;\n photo_url?: string;\n auth_date: string;\n hash: string;\n};\n\nexport interface TelegramAuthResult {\n user: TelegramUser;\n privateKey: `0x${string}`;\n displayName: string;\n}\n\nexport function deriveDemoPrivateKey(user: TelegramUser, salt: string): `0x${string}` {\n const base = `${user.id}:${salt}`;\n const h = keccak256(stringToBytes(base));\n const pk = h.slice(0, 66) as `0x${string}`;\n return isHex(pk) ? pk : (toHex(h).slice(0, 66) as `0x${string}`);\n}\n\nexport function initTelegramWidget(\n botUsername: string,\n onAuth: (result: TelegramAuthResult) => Promise<void>,\n salt: string = 'demo',\n rootId: string = 'tg-root'\n): () => void {\n const root = document.getElementById(rootId);\n if (!root) {\n console.warn(`[Telegram] No ${rootId} element found`);\n return () => {};\n }\n root.innerHTML = '';\n (window as any).onTelegramAuth = async (user: TelegramUser) => {\n if (!user?.id || !user.auth_date || !user.hash) throw new Error('Invalid Telegram auth payload');\n const privateKey = deriveDemoPrivateKey(user, salt);\n const displayName = user.first_name || user.username || `User ${user.id}`;\n await onAuth({ user, privateKey, displayName });\n };\n const script = document.createElement('script');\n script.async = true;\n script.src = 'https://telegram.org/js/telegram-widget.js?22';\n script.setAttribute('data-telegram-login', botUsername);\n script.setAttribute('data-size', 'large');\n script.setAttribute('data-userpic', 'true');\n script.setAttribute('data-onauth', 'onTelegramAuth(user)');\n script.setAttribute('data-request-access', 'write');\n script.onerror = (error) => { console.error('[Telegram] Failed to load widget script:', error); };\n root.appendChild(script);\n return () => {\n try { delete (window as any).onTelegramAuth; if (root) root.innerHTML = ''; if (script && script.parentElement && document.contains(script)) script.parentElement.removeChild(script); } catch {}\n };\n}\n\nexport function hideTelegramWidget(): void { try { const root = document.getElementById('tg-root'); if (root) root.style.display = 'none'; } catch {} }\nexport function showTelegramWidget(): void { try { const root = document.getElementById('tg-root'); if (root) root.style.display = ''; } catch {} }\n\n","export const APP_TITLE = 'Lumia Passport';\nexport const APP_SUBTITLE = 'Connect and use Lumia smart accounts';\nexport const DAPP_NAME = 'passport';\n\n","/** Passkey module (copied, lightly adapted) */\nimport { DAPP_NAME } from '../lib/site';\nimport { beginPasskeyRegistration, completePasskeyRegistration, beginPasskeyAuthentication, completePasskeyAuthentication } from './index';\n\nlet activeWebAuthnOperation: Promise<any> | null = null;\nlet conditionalUIStarting = false;\ndeclare global { interface Window { __LUMIA_CONDITIONAL_UI_ACTIVE__?: boolean } }\nfunction isConditionalUIGloballyActive(): boolean { return typeof window !== 'undefined' && window.__LUMIA_CONDITIONAL_UI_ACTIVE__ === true; }\nfunction setGlobalConditionalUI(active: boolean): void { if (typeof window !== 'undefined') window.__LUMIA_CONDITIONAL_UI_ACTIVE__ = active; }\nexport function resetWebAuthnFlags(): void { activeWebAuthnOperation = null; conditionalUIStarting = false; setGlobalConditionalUI(false); }\nfunction generatePasskeyUsername(): string { const timestamp = new Date().toISOString(); return `lumia-aa.${DAPP_NAME}-${timestamp}`; }\n\nexport interface PasskeyCredential { id: string; rawId: string; ownerPublicKey: `0x${string}` }\nexport interface PasskeyAuthResult { credential: PasskeyCredential; mpcUserId: string; loginResponse: any }\nexport interface PasskeyHelpers {\n getPasskeyKey: (key: string) => string;\n getCredId: () => string | null;\n getRawId: () => string | null;\n getOwnerPk: () => `0x${string}` | null;\n setCredId: (credId: string) => void;\n setRawId: (rawId: string) => void;\n setOwnerPk: (ownerPk: `0x${string}`) => void;\n clear: () => void;\n hasCredentials: () => boolean;\n}\n\nexport function createPasskeyHelpers(mpcUserId: string): PasskeyHelpers {\n const getPasskeyKey = (key: string) => `passkey.${mpcUserId}.${key}`;\n return {\n getPasskeyKey,\n getCredId: () => localStorage.getItem(getPasskeyKey('credId')),\n getRawId: () => localStorage.getItem(getPasskeyKey('rawId')),\n getOwnerPk: () => localStorage.getItem(getPasskeyKey('ownerPk')) as `0x${string}` | null,\n setCredId: (credId: string) => localStorage.setItem(getPasskeyKey('credId'), credId),\n setRawId: (rawId: string) => localStorage.setItem(getPasskeyKey('rawId'), rawId),\n setOwnerPk: (ownerPk: `0x${string}`) => localStorage.setItem(getPasskeyKey('ownerPk'), ownerPk),\n clear: () => { localStorage.removeItem(getPasskeyKey('credId')); localStorage.removeItem(getPasskeyKey('rawId')); localStorage.removeItem(getPasskeyKey('ownerPk')); },\n hasCredentials: () => !!(localStorage.getItem(getPasskeyKey('credId')) || localStorage.getItem(getPasskeyKey('rawId'))),\n };\n}\n\nexport function isWebAuthnSupported(): boolean { return ('credentials' in navigator && 'create' in navigator.credentials && 'get' in navigator.credentials); }\n\nexport async function hasAvailablePasskeys(): Promise<boolean> {\n if (!isWebAuthnSupported()) return false;\n try {\n const isAvailable = await Promise.race([\n PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable(),\n new Promise<boolean>((_, reject) => setTimeout(() => reject(new Error('Timeout')), 3000)),\n ]);\n if (!isAvailable) return false;\n try {\n const credential = await Promise.race([\n navigator.credentials.get({ publicKey: { challenge: new Uint8Array(32), timeout: 5000, userVerification: 'preferred' }, mediation: 'silent' as any }),\n new Promise((_, reject) => setTimeout(() => reject(new Error('Detection timeout')), 2000)),\n ]);\n return !!credential;\n } catch { return false; }\n } catch { return false; }\n}\n\nexport async function registerPasskey(mpcUserId: string, onProgress?: (s: string) => void, options?: { skipTokenSave?: boolean }): Promise<{ credential: PasskeyCredential; loginResponse: any }> {\n if (!isWebAuthnSupported()) throw new Error('WebAuthn not supported in this browser');\n const helpers = createPasskeyHelpers(mpcUserId);\n onProgress?.('Starting passkey registration...');\n const passkeyUsername = generatePasskeyUsername();\n onProgress?.('Getting registration challenge...');\n const { challengeId, options: credOptions } = await beginPasskeyRegistration(passkeyUsername);\n onProgress?.('Creating passkey credential...');\n const credential = (await navigator.credentials.create({ publicKey: credOptions })) as PublicKeyCredential;\n if (!credential) throw new Error('Failed to create passkey credential');\n onProgress?.('Verifying passkey with server...');\n const loginResponse = await completePasskeyRegistration(challengeId, credential, options);\n const rawIdB64 = btoa(String.fromCharCode(...new Uint8Array(credential.rawId)));\n const derivedOwnerPk = `0x${'0'.repeat(40)}${credential.id.slice(-24)}` as `0x${string}`;\n helpers.setCredId(credential.id); helpers.setRawId(rawIdB64); helpers.setOwnerPk(derivedOwnerPk);\n onProgress?.('Passkey registered successfully!');\n return {\n credential: { id: credential.id, rawId: rawIdB64, ownerPublicKey: derivedOwnerPk },\n loginResponse\n };\n}\n\nexport async function authenticateWithPasskey(_username?: string, onProgress?: (s: string) => void, options?: { skipTokenSave?: boolean }): Promise<PasskeyAuthResult> {\n if (!isWebAuthnSupported()) throw new Error('WebAuthn not supported in this browser');\n onProgress?.('Starting passkey authentication...');\n const { challengeId, options: beginOptions } = await beginPasskeyAuthentication();\n const getOptions = { ...beginOptions } as any; if (getOptions.allowCredentials && getOptions.allowCredentials.length === 0) delete getOptions.allowCredentials;\n const assertion = (await navigator.credentials.get({ publicKey: getOptions })) as PublicKeyCredential;\n if (!assertion) throw new Error('Passkey authentication failed - no credential returned');\n onProgress?.('Verifying passkey with server...');\n const loginResponse = await completePasskeyAuthentication(challengeId, assertion, options);\n const userHelpers = createPasskeyHelpers(loginResponse.userId);\n const rawIdB64 = btoa(String.fromCharCode(...new Uint8Array(assertion.rawId)));\n const derivedOwnerPk = `0x${'0'.repeat(40)}${assertion.id.slice(-24)}` as `0x${string}`;\n userHelpers.setCredId(assertion.id); userHelpers.setRawId(rawIdB64); userHelpers.setOwnerPk(derivedOwnerPk);\n onProgress?.('Authentication complete!');\n return {\n credential: { id: assertion.id, rawId: rawIdB64, ownerPublicKey: derivedOwnerPk },\n mpcUserId: loginResponse.userId,\n loginResponse\n };\n}\n","/**\n * Iframe-based MPC Client\n *\n * Secure implementation that uses iframe isolation for key share storage and cryptographic operations\n * This replaces the legacy mpcClient.ts localStorage-based approach with iframe-based security\n */\n\nimport type { Address, Hex } from 'viem';\nimport { getIframeManager } from './iframe-manager';\nimport { logSdkError } from '@lumiapassport/core/internal/error-tracking';\n\n/**\n * Performance statistics for MPC signing (compatible with legacy interface)\n */\nexport type MpcSigningStats = {\n startTime: number;\n endTime?: number;\n totalDurationMs?: number;\n rounds: {\n roundNumber: number;\n startTime: number;\n endTime?: number;\n durationMs?: number;\n description: string;\n clientMsgSize?: number;\n serverMsgSize?: number;\n clientMsgKind?: string;\n serverMsgKind?: string;\n }[];\n wasmLoadTime?: number;\n keyshareLoadTime?: number;\n keyshareSize?: number;\n signatureVerificationTime?: number;\n totalDataTransferred?: number;\n};\n\nlet currentSigningStats: MpcSigningStats | null = null;\n\n/**\n * Get current MPC signing statistics\n */\nexport function getCurrentMpcSigningStats(): MpcSigningStats | null {\n if (!currentSigningStats) return null;\n const clonedRounds = currentSigningStats.rounds.map((r) => ({ ...r }));\n return { ...currentSigningStats, rounds: clonedRounds };\n}\n\n/**\n * Ensure DKG is completed and get owner address\n *\n * SECURITY: All cryptographic operations now happen inside the isolated iframe\n * Key shares are stored in iframe's localStorage (auth.lumiapassport.com)\n * NOT in parent domain's localStorage\n */\nexport async function ensureDkgAndGetOwner(\n userId: string,\n _clientSeedHex?: `0x${string}` // Deprecated parameter, kept for API compatibility\n): Promise<{ sessionId: string; ownerAddress?: Address }> {\n try {\n const iframeManager = getIframeManager();\n\n // Check if user already has a keyshare in iframe\n const keyshareStatus = await iframeManager.checkKeyshare(userId);\n\n if (keyshareStatus.hasKeyshare && keyshareStatus.address) {\n // Return with dummy sessionId (actual session is managed by iframe)\n return {\n sessionId: 'iframe-session',\n ownerAddress: keyshareStatus.address,\n };\n }\n\n // Authenticate user with iframe (will show consent modal if needed)\n await iframeManager.authenticate(userId);\n\n // Get access token from jwtTokenManager for TSS API authentication\n const { jwtTokenManager } = await import('../auth');\n const accessToken = jwtTokenManager.getAccessToken();\n\n if (!accessToken) {\n throw new Error('No access token available for DKG');\n }\n\n // Start DKG in iframe\n const ownerAddress = await iframeManager.startDKG(userId, accessToken);\n\n return {\n sessionId: 'iframe-session',\n ownerAddress,\n };\n } catch (error) {\n logSdkError(\n error instanceof Error ? error : new Error('DKG failed'),\n { userId },\n 'iframe-mpc'\n );\n throw error;\n }\n}\n\n/**\n * Sign digest with MPC using iframe\n *\n * SECURITY: All signing operations happen inside the isolated iframe\n * User sees confirmation modal inside iframe (parent cannot manipulate it)\n * Key share never leaves iframe's localStorage\n */\nexport async function signDigestWithMpc(\n userId: string,\n digest32: `0x${string}`,\n userOpDetails?: {\n sender?: string;\n nonce?: string;\n callData?: string;\n callGasLimit?: string;\n verificationGasLimit?: string;\n preVerificationGas?: string;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n paymaster?: string;\n factory?: string;\n factoryData?: string;\n callTarget?: string;\n }\n): Promise<`0x${string}` | null> {\n const startTime = performance.now();\n currentSigningStats = {\n startTime,\n rounds: [],\n };\n\n try {\n const iframeManager = getIframeManager();\n\n // Get access token from jwtTokenManager for TSS API authentication\n const { jwtTokenManager } = await import('../auth');\n const accessToken = jwtTokenManager.getAccessToken();\n\n if (!accessToken) {\n throw new Error('No access token available for signing');\n }\n\n // Create transaction object with UserOp details for display + pre-computed digest\n const transaction = {\n to: userOpDetails?.callTarget || '0x0000000000000000000000000000000000000000' as Address,\n value: '0',\n data: userOpDetails?.callData as Hex || '0x' as Hex,\n digest32, // Pre-computed digest - DO NOT recompute!\n // Additional UserOp fields for display in confirmation modal\n userOpDetails,\n };\n\n // Sign transaction via iframe\n // This will show user confirmation modal inside iframe with full UserOp details\n const signature = await iframeManager.signTransaction(userId, transaction, accessToken);\n\n const endTime = performance.now();\n currentSigningStats.endTime = endTime;\n currentSigningStats.totalDurationMs = endTime - startTime;\n\n return signature;\n } catch (error) {\n logSdkError(\n error instanceof Error ? error : new Error('MPC signing failed'),\n { userId, hasUserOpDetails: !!userOpDetails },\n 'iframe-mpc'\n );\n\n const endTime = performance.now();\n if (currentSigningStats) {\n currentSigningStats.endTime = endTime;\n currentSigningStats.totalDurationMs = endTime - startTime;\n }\n\n return null;\n }\n}\n\n/**\n * Check if user has a keyshare (via iframe)\n */\nexport async function checkKeyshare(\n userId: string\n): Promise<{ hasKeyshare: boolean; address?: Address }> {\n try {\n const iframeManager = getIframeManager();\n return await iframeManager.checkKeyshare(userId);\n } catch (error) {\n console.error('[IframeMPC] Error checking keyshare:', error);\n return { hasKeyshare: false };\n }\n}\n\n/**\n * Get user's wallet address (via iframe)\n */\nexport async function getAddress(userId: string): Promise<Address | undefined> {\n try {\n const iframeManager = getIframeManager();\n return await iframeManager.getAddress(userId);\n } catch (error) {\n console.error('[IframeMPC] Error getting address:', error);\n return undefined;\n }\n}\n","import { jwtTokenManager } from '../auth';\nimport { getTssUrl, getShareVaultUrl } from './base';\nimport { addProjectIdToUrl } from '../utils/projectId';\nimport { logSdkError } from '@lumiapassport/core/internal/error-tracking';\n\ninterface ApiRequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n headers?: Record<string, string>;\n body?: any;\n requireAuth?: boolean;\n}\n\ninterface ApiResponse<T = any> {\n success: boolean;\n data?: T;\n error?: string;\n status: number;\n}\n\nclass HttpClient {\n private baseUrl: string;\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl.replace(/\\/$/, ''); // Remove trailing slash\n }\n\n private async makeRequest<T>(\n endpoint: string,\n options: ApiRequestOptions = {}\n ): Promise<ApiResponse<T>> {\n const {\n method = 'GET',\n headers = {},\n body,\n requireAuth = true\n } = options;\n\n // Add projectId to URL query params (so it's available in preflight OPTIONS request)\n const url = addProjectIdToUrl(`${this.baseUrl}${endpoint}`);\n\n // Prepare headers\n const requestHeaders: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...headers\n };\n\n // Add auth header if required\n if (requireAuth) {\n const accessToken = jwtTokenManager.getAccessToken();\n if (accessToken) {\n requestHeaders['Authorization'] = `Bearer ${accessToken}`;\n }\n }\n\n // Prepare request config\n const requestConfig: RequestInit = {\n method,\n headers: requestHeaders\n };\n\n if (body && method !== 'GET') {\n requestConfig.body = typeof body === 'string' ? body : JSON.stringify(body);\n }\n\n try {\n const response = await fetch(url, requestConfig);\n\n // Handle 401 for token refresh\n if (response.status === 401 && requireAuth) {\n const refreshSuccess = await jwtTokenManager.refreshAccessToken();\n if (refreshSuccess) {\n // Update auth header with new token\n const newAccessToken = jwtTokenManager.getAccessToken();\n if (newAccessToken) {\n requestHeaders['Authorization'] = `Bearer ${newAccessToken}`;\n requestConfig.headers = requestHeaders;\n }\n\n // Retry the request\n const retryResponse = await fetch(url, requestConfig);\n return await this.processResponse<T>(retryResponse);\n } else {\n return {\n success: false,\n error: 'Authentication failed - unable to refresh token',\n status: 401\n };\n }\n }\n\n return await this.processResponse<T>(response);\n } catch (error) {\n logSdkError(\n error instanceof Error ? error : new Error('Network error'),\n { url, method },\n 'http-client'\n );\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Network error',\n status: 0\n };\n }\n }\n\n private async processResponse<T>(response: Response): Promise<ApiResponse<T>> {\n const status = response.status;\n\n try {\n const data = await response.json();\n\n if (!response.ok) {\n return {\n success: false,\n error: data.message || data.error || `HTTP ${status}`,\n status,\n data\n };\n }\n\n return {\n success: true,\n data,\n status\n };\n } catch (parseError) {\n logSdkError(\n parseError instanceof Error ? parseError : new Error('Failed to parse response'),\n { status },\n 'http-client'\n );\n return {\n success: false,\n error: 'Invalid response format',\n status\n };\n }\n }\n\n // Convenience methods\n async get<T>(endpoint: string, requireAuth = true): Promise<ApiResponse<T>> {\n return this.makeRequest<T>(endpoint, { method: 'GET', requireAuth });\n }\n\n async post<T>(endpoint: string, body?: any, requireAuth = true): Promise<ApiResponse<T>> {\n return this.makeRequest<T>(endpoint, { method: 'POST', body, requireAuth });\n }\n\n async put<T>(endpoint: string, body?: any, requireAuth = true): Promise<ApiResponse<T>> {\n return this.makeRequest<T>(endpoint, { method: 'PUT', body, requireAuth });\n }\n\n async patch<T>(endpoint: string, body?: any, requireAuth = true): Promise<ApiResponse<T>> {\n return this.makeRequest<T>(endpoint, { method: 'PATCH', body, requireAuth });\n }\n\n async delete<T>(endpoint: string, requireAuth = true): Promise<ApiResponse<T>> {\n return this.makeRequest<T>(endpoint, { method: 'DELETE', requireAuth });\n }\n}\n\n// Factory function to create HTTP clients for different services\nexport function createHttpClient(baseUrl: string): HttpClient {\n return new HttpClient(baseUrl);\n}\n\n// Pre-configured singleton clients for our services\n// These use dynamic URLs and read projectId from window.__LUMIA_PROJECT_ID__ on each request\n// The projectId is set by LumiaPassportProvider during initialization\n// Using lazy initialization to ensure URLs are read after LumiaPassportProvider sets window.__LUMIA_SERVICES__\nlet _tssClient: HttpClient | null = null;\nlet _vaultClient: HttpClient | null = null;\n\nexport const tssClient = new Proxy({} as HttpClient, {\n get(target, prop) {\n if (!_tssClient) {\n _tssClient = createHttpClient(getTssUrl());\n }\n return (_tssClient as any)[prop];\n }\n});\n\nexport const vaultClient = new Proxy({} as HttpClient, {\n get(target, prop) {\n if (!_vaultClient) {\n _vaultClient = createHttpClient(getShareVaultUrl());\n }\n return (_vaultClient as any)[prop];\n }\n});\n\nexport { HttpClient };\nexport type { ApiResponse };","// Cloud storage integrations for secure backup files\n// Supports Google Drive, and can be extended for other providers\n\nexport interface CloudStorageProvider {\n name: string;\n id: string;\n icon: string;\n isAvailable: () => boolean;\n authenticate: () => Promise<boolean>;\n upload: (fileName: string, content: string, usePrivateStorage?: boolean) => Promise<string>; // Returns file URL or ID\n isAuthenticated: () => boolean;\n signOut: () => Promise<void>;\n}\n\n// Google Drive integration using Google Identity Services + Google API Client Library\nexport class GoogleDriveProvider implements CloudStorageProvider {\n name = 'Google Drive';\n id = 'google-drive';\n icon = '📁'; // Can be replaced with proper icon\n\n private accessToken: string | null = null;\n private readonly CLIENT_ID = __GOOGLE_DRIVE_CLIENT_ID__;\n private readonly DISCOVERY_DOC = 'https://www.googleapis.com/discovery/v1/apis/drive/v3/rest';\n private readonly SCOPES = 'https://www.googleapis.com/auth/drive.file https://www.googleapis.com/auth/drive.appdata';\n\n private gapiInitialized = false;\n private gisInitialized = false;\n\n constructor() {\n this.initializeAPIs();\n }\n\n private async initializeAPIs(): Promise<void> {\n // Load Google APIs\n if (!window.gapi) {\n await this.loadScript('https://apis.google.com/js/api.js');\n }\n\n if (!window.google?.accounts) {\n await this.loadScript('https://accounts.google.com/gsi/client');\n }\n\n // Initialize gapi\n if (!this.gapiInitialized) {\n await new Promise<void>(resolve => {\n window.gapi.load('client', resolve);\n });\n\n await window.gapi.client.init({\n discoveryDocs: [this.DISCOVERY_DOC],\n });\n\n this.gapiInitialized = true;\n }\n\n // Initialize Google Identity Services\n if (!this.gisInitialized) {\n this.gisInitialized = true;\n }\n }\n\n private loadScript(src: string): Promise<void> {\n return new Promise((resolve, reject) => {\n if (document.querySelector(`script[src=\"${src}\"]`)) {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.src = src;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(`Failed to load ${src}`));\n document.head.appendChild(script);\n });\n }\n\n isAvailable(): boolean {\n return !!this.CLIENT_ID && typeof window !== 'undefined';\n }\n\n async authenticate(): Promise<boolean> {\n if (!this.isAvailable()) {\n throw new Error(\n 'Google Drive integration is not available in this environment'\n );\n }\n\n await this.initializeAPIs();\n\n return new Promise((resolve, reject) => {\n try {\n const tokenClient = window.google.accounts.oauth2.initTokenClient({\n client_id: this.CLIENT_ID,\n scope: this.SCOPES,\n callback: (response: any) => {\n if (response.error) {\n console.error('[GoogleDrive] Authentication error:', response.error);\n reject(new Error(`Google Drive authentication failed: ${response.error}`));\n return;\n }\n\n this.accessToken = response.access_token;\n window.gapi.client.setToken({ access_token: this.accessToken });\n resolve(true);\n },\n });\n\n tokenClient.requestAccessToken({ prompt: 'consent' });\n } catch (error) {\n console.error('[GoogleDrive] Authentication initialization failed:', error);\n reject(new Error(`Google Drive authentication setup failed: ${error}`));\n }\n });\n }\n\n isAuthenticated(): boolean {\n return !!this.accessToken;\n }\n\n async signOut(): Promise<void> {\n if (this.accessToken) {\n window.google?.accounts.oauth2.revoke(this.accessToken);\n this.accessToken = null;\n window.gapi?.client.setToken(null);\n }\n }\n\n async upload(fileName: string, content: string, usePrivateStorage: boolean = true): Promise<string> {\n if (!this.isAuthenticated()) {\n throw new Error('Not authenticated with Google Drive');\n }\n\n await this.initializeAPIs();\n\n if (usePrivateStorage) {\n // Try appDataFolder first (private, hidden)\n try {\n const fileId = await this.uploadToAppDataFolder(fileName, content);\n return fileId;\n } catch (error) {\n console.warn('[GoogleDrive] AppDataFolder upload failed, trying fallback to regular folder:', error);\n // Fallback to visible folder if appDataFolder fails\n const fileId = await this.uploadToAppFolder(fileName, content);\n return fileId;\n }\n } else {\n // Upload to \"Lumia Backups\" folder (visible in Drive)\n try {\n const fileId = await this.uploadToAppFolder(fileName, content);\n return fileId;\n } catch (error) {\n console.error('[GoogleDrive] Upload failed:', error);\n throw new Error(\n `Failed to upload to Google Drive: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n }\n\n private async uploadToAppDataFolder(fileName: string, content: string): Promise<string> {\n const metadata = {\n name: fileName,\n parents: ['appDataFolder'], // Store in app-specific folder for privacy\n };\n\n return this.performUpload(metadata, content);\n }\n\n private async uploadToAppFolder(fileName: string, content: string): Promise<string> {\n // First, find or create \"Lumia Backups\" folder\n const folderName = 'Lumia Passport Backups';\n const folderId = await this.findOrCreateFolder(folderName);\n\n const metadata = {\n name: fileName,\n parents: [folderId],\n };\n\n return this.performUpload(metadata, content);\n }\n\n private async findOrCreateFolder(folderName: string): Promise<string> {\n // Search for existing folder\n const searchResponse = await fetch(\n `https://www.googleapis.com/drive/v3/files?q=name='${folderName}' and mimeType='application/vnd.google-apps.folder' and trashed=false`,\n {\n headers: { Authorization: `Bearer ${this.accessToken}` },\n }\n );\n\n if (!searchResponse.ok) {\n throw new Error(`Failed to search for folder: ${searchResponse.status}`);\n }\n\n const searchResult = await searchResponse.json();\n\n if (searchResult.files && searchResult.files.length > 0) {\n return searchResult.files[0].id; // Return existing folder ID\n }\n\n // Create new folder\n const createResponse = await fetch('https://www.googleapis.com/drive/v3/files', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.accessToken}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n name: folderName,\n mimeType: 'application/vnd.google-apps.folder',\n }),\n });\n\n if (!createResponse.ok) {\n throw new Error(`Failed to create folder: ${createResponse.status}`);\n }\n\n const createResult = await createResponse.json();\n return createResult.id;\n }\n\n private async performUpload(metadata: any, content: string): Promise<string> {\n const form = new FormData();\n form.append('metadata', new Blob([JSON.stringify(metadata)], { type: 'application/json' }));\n form.append('file', new Blob([content], { type: 'application/json' }));\n\n const response = await fetch(\n 'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart',\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.accessToken}`,\n },\n body: form,\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Google Drive upload failed: ${response.status} ${response.statusText} - ${errorText}`\n );\n }\n\n const result = await response.json();\n return result.id; // Return file ID\n }\n}\n\n// Factory function to get available cloud storage providers\nexport function getAvailableCloudProviders(): CloudStorageProvider[] {\n const providers: CloudStorageProvider[] = [];\n\n // Google Drive\n const googleDrive = new GoogleDriveProvider();\n if (googleDrive.isAvailable()) {\n providers.push(googleDrive);\n }\n\n // Future: Add more providers (Dropbox, OneDrive, etc.)\n\n return providers;\n}\n\n// Type definitions for global APIs\ndeclare global {\n interface Window {\n gapi: any;\n google: any;\n }\n}","// Client-side backup functionality for keyshares\n// Provides encrypted backup options: Server, Cloud (iCloud/etc), Local file\n\nimport { jwtTokenManager } from './auth';\nimport { getTssUrl, getShareVaultUrl } from './clients/base';\nimport { createHttpClient } from './clients/httpClient';\nimport { createPasskeyHelpers } from './auth/passkey';\nimport { logSdkError } from '@lumiapassport/core/internal/error-tracking';\n\nexport interface KeyshareBackupData {\n userId: string;\n sessionId: string;\n keyshare: string;\n ownerAddress: `0x${string}`;\n createdAt: number;\n version: string;\n}\n\nexport interface EncryptedBackup {\n data: string;\n iv: string;\n salt: string;\n version: string;\n checksum: string;\n magic: string;\n encryptionMethod: 'passkey' | 'password';\n createdAt: number;\n credentialId?: string; // WebAuthn credential ID (required for passkey method)\n}\n\nexport interface EnvelopeEncryptedShare {\n ciphertext_share: string;\n wrapped_dek: string;\n kdf: { prf: string; hkdf: string; info: string };\n alg: { data: string; wrap: string };\n aad: { userId: string; version: number; deviceId?: string };\n createdAt?: string;\n expiresAt?: string | null;\n // Server spec fields for encryption method tracking\n encryptionMethod?: \"passkey\" | \"password\"; // for client guidance during recovery\n credentialId?: string; // WebAuthn credential ID (required for passkey method)\n}\n\nexport type BackupMethod = 'server' | 'cloud' | 'local';\n\nexport class PasswordValidationError extends Error { constructor(message: string) { super(message); this.name = 'PasswordValidationError'; } }\n\nexport const BACKUP_MAGIC = 'LUMIA_PASSPORT_BACKUP_V1';\nconst BACKUP_VERSION = '1.0';\n\nexport function getBackupEncryptionMethod(backupFile: EncryptedBackup): 'passkey' | 'password' | 'unknown' {\n if (backupFile.encryptionMethod) return backupFile.encryptionMethod; return 'unknown';\n}\n\nexport function isCloudShareSupported(): { supported: boolean; canShareFiles: boolean } {\n if (typeof navigator === 'undefined' || !navigator.share) return { supported: false, canShareFiles: false };\n const canShareFiles = navigator.canShare?.({ files: [new File(['test'], 'test.txt')] }) ?? false;\n return { supported: true, canShareFiles };\n}\n\nexport async function checkPasskeyAvailability(userId: string): Promise<boolean> {\n try {\n if (!navigator.credentials || !window.PublicKeyCredential) return false;\n const challengeString = `lumia-check:${userId}`; const challenge = new TextEncoder().encode(challengeString);\n const credential = await navigator.credentials.get({ publicKey: { challenge, allowCredentials: [], userVerification: 'preferred', timeout: 5000 } });\n return !!credential;\n } catch { return false; }\n}\n\nexport interface BackupStatus { server: { enabled: boolean; lastBackup?: number; error?: string }; cloud: { enabled: boolean; lastBackup?: number; error?: string }; local: { enabled: boolean; lastBackup?: number; error?: string } }\n\n// Using unified URL functions from base.ts\n\ninterface ShareVaultToken { token: string; expiresAt: number }\n\nasync function getShareVaultToken(scopes: string[]): Promise<ShareVaultToken> {\n const httpClient = createHttpClient(getTssUrl());\n\n const response = await httpClient.post('/api/auth/token/exchange', {\n scopes,\n audience: 'lumia-passport-share-vault-service',\n ttl: 300\n });\n\n if (!response.success) {\n throw new Error(`Failed to get Share Vault token: ${response.error}`);\n }\n\n const data = response.data;\n if (!data?.resourceToken) {\n throw new Error(`Invalid token response: ${JSON.stringify(data)}`);\n }\n\n return {\n token: data.resourceToken,\n expiresAt: Date.now() + data.expiresIn * 1000\n };\n}\n\n// Share API types (aligned with Vault docs)\nexport interface RecoveryStatsDeviceEntry { deviceId: string; name?: string; count: number; lastAt: string; ip?: string; ua?: string; secChUa?: string; browser?: string }\nexport interface RecoveryStatsCreatedMeta { at: string; ip?: string; ua?: string; secChUa?: string; browser?: string; deviceId?: string; deviceName?: string; country?: string }\nexport interface RecoveryStats { created: RecoveryStatsCreatedMeta; devices: RecoveryStatsDeviceEntry[] }\n\nexport async function getShareRecoveryStats(): Promise<RecoveryStats | null> {\n try {\n const token = await getShareVaultToken(['share:get']);\n const response = await fetch(`${getShareVaultUrl()}/v1/shares/me/recovery/stats`, { method: 'GET', headers: { Authorization: `Bearer ${token.token}`, 'Content-Type': 'application/json' } });\n if (response.status === 404) return null;\n if (!response.ok) return null;\n return await response.json();\n } catch {\n return null;\n }\n}\n\nexport async function getShare(): Promise<EnvelopeEncryptedShare | null> {\n const token = await getShareVaultToken(['share:get']);\n const response = await fetch(`${getShareVaultUrl()}/v1/shares/me`, { method: 'GET', headers: { Authorization: `Bearer ${token.token}`, 'Content-Type': 'application/json' } });\n if (response.status === 404) return null;\n if (!response.ok) throw new Error(`Failed to fetch share: ${response.status} ${response.statusText}`);\n return (await response.json()) as EnvelopeEncryptedShare;\n}\n\nexport async function uploadShare(share: EnvelopeEncryptedShare, idempotencyKey: string): Promise<{ etag: string }> {\n const token = await getShareVaultToken(['share:put']);\n const response = await fetch(`${getShareVaultUrl()}/v1/shares/me`, { method: 'PUT', headers: { Authorization: `Bearer ${token.token}`, 'Content-Type': 'application/json', 'Idempotency-Key': idempotencyKey }, body: JSON.stringify(share) });\n if (!response.ok) throw new Error(`Failed to upload share: ${response.status} ${response.statusText}`);\n return (await response.json()) as { etag: string };\n}\n\nexport async function rewrapShare(payload: { wrapped_dek: string; nonce_wrap?: string; alg?: { wrap: string }; kdf?: { prf: string; hkdf?: string; info?: string } }, idempotencyKey: string): Promise<{ etag: string }> {\n const token = await getShareVaultToken(['share:rewrap']);\n const response = await fetch(`${getShareVaultUrl()}/v1/shares/me/rewrap`, { method: 'POST', headers: { Authorization: `Bearer ${token.token}`, 'Content-Type': 'application/json', 'Idempotency-Key': idempotencyKey }, body: JSON.stringify(payload) });\n if (!response.ok) throw new Error(`Failed to rewrap share: ${response.status} ${response.statusText}`);\n return (await response.json()) as { etag: string };\n}\n\nexport async function deleteShare(): Promise<void> {\n const token = await getShareVaultToken(['share:delete']);\n const response = await fetch(`${getShareVaultUrl()}/v1/shares/me`, { method: 'DELETE', headers: { Authorization: `Bearer ${token.token}` } });\n if (!response.ok && response.status !== 404) throw new Error(`Failed to delete share: ${response.status} ${response.statusText}`);\n}\n\nasync function decryptShareEnvelopeWithPasskey(userId: string, share: EnvelopeEncryptedShare): Promise<KeyshareBackupData> {\n if (!share.nonce_wrap || !share.nonce_share) throw new Error('Invalid share envelope: missing nonces');\n const kek = await deriveKEKFromPasskey(userId, share.credentialId);\n const kekKey = await crypto.subtle.importKey('raw', kek, 'AES-GCM', false, ['decrypt']);\n const wrappedDekBytes = base64ToBytes(share.wrapped_dek);\n const nonceWrapBytes = base64ToBytes(share.nonce_wrap);\n const dekBytesBuffer = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: nonceWrapBytes }, kekKey, wrappedDekBytes);\n const dekKey = await crypto.subtle.importKey('raw', new Uint8Array(dekBytesBuffer), 'AES-GCM', false, ['decrypt']);\n const cipherBytes = base64ToBytes(share.ciphertext_share);\n const nonceShareBytes = base64ToBytes(share.nonce_share);\n const plain = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: nonceShareBytes }, dekKey, cipherBytes);\n const decoder = new TextDecoder();\n return JSON.parse(decoder.decode(new Uint8Array(plain)));\n}\n\nasync function deriveKEKFromPasskey(userId: string, requiredCredentialId?: string): Promise<ArrayBuffer> {\n const challengeString = `lumia-kek:${userId}`;\n const challenge = new TextEncoder().encode(challengeString);\n\n // Helper function to decode base64url credential ID\n function base64urlToUint8Array(base64url: string): Uint8Array {\n const base64 = base64url.replace(/-/g, '+').replace(/_/g, '/');\n const pad = base64.length % 4 ? 4 - (base64.length % 4) : 0;\n const padded = base64 + '='.repeat(pad);\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n }\n\n // Use required credential ID if provided (from server backup), otherwise fallback to stored credential ID\n const targetCredentialId = requiredCredentialId || createPasskeyHelpers(userId).getCredId();\n\n const allowCredentials = targetCredentialId ? [{ id: base64urlToUint8Array(targetCredentialId), type: 'public-key' as const }] : [];\n\n try {\n const credential = (await navigator.credentials.get({\n publicKey: {\n challenge,\n allowCredentials,\n userVerification: 'required',\n extensions: { prf: { eval: { first: challenge } } },\n },\n })) as PublicKeyCredential;\n\n if (credential) {\n const extensionResults = (credential as any).getClientExtensionResults?.();\n\n if (extensionResults?.prf?.results?.first) {\n return extensionResults.prf.results.first as ArrayBuffer;\n }\n }\n\n // Fallback: HKDF on credential id\n const credentialIdBytes = new TextEncoder().encode(credential.id);\n const keyMaterial = await crypto.subtle.importKey('raw', credentialIdBytes, 'HKDF', false, ['deriveBits']);\n const kekBytes = await crypto.subtle.deriveBits({ name: 'HKDF', hash: 'SHA-256', salt: challenge, info: new TextEncoder().encode('client-share') }, keyMaterial, 256);\n return kekBytes;\n } catch (error) {\n logSdkError(\n error instanceof Error ? error : new Error('Passkey operation failed'),\n { userId },\n \"vault\"\n );\n throw error;\n }\n}\n\nasync function deriveKeyFromPassword(password: string, salt: Uint8Array): Promise<CryptoKey> {\n const encoder = new TextEncoder();\n const keyMaterial = await crypto.subtle.importKey('raw', encoder.encode(password), 'PBKDF2', false, ['deriveBits', 'deriveKey']);\n const key = await crypto.subtle.deriveKey({ name: 'PBKDF2', salt, iterations: 150000, hash: 'SHA-256' }, keyMaterial, { name: 'AES-GCM', length: 256 }, false, ['encrypt', 'decrypt']);\n return key;\n}\n\nfunction base64ToBytes(base64: string): Uint8Array { const bin = atob(base64); const bytes = new Uint8Array(bin.length); for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i); return bytes; }\nfunction bytesToBase64(bytes: Uint8Array): string { let bin = ''; for (let i = 0; i < bytes.length; i++) bin += String.fromCharCode(bytes[i]); return btoa(bin); }\nfunction bytesToHex(bytes: Uint8Array): string { return Array.from(bytes, b => b.toString(16).padStart(2, '0')).join(''); }\n\n// Demo-app compatible encrypt/decrypt for file backups\nasync function encryptKeyshare(data: KeyshareBackupData, password: string, encryptionMethod: 'passkey' | 'password' = 'password', credentialId?: string): Promise<EncryptedBackup> {\n const encoder = new TextEncoder(); const plaintext = JSON.stringify(data);\n const salt = crypto.getRandomValues(new Uint8Array(16));\n const passwordKey = await crypto.subtle.importKey('raw', encoder.encode(password), 'PBKDF2', false, ['deriveBits']);\n const keyMaterial = await crypto.subtle.deriveBits({ name: 'PBKDF2', salt, iterations: 100000, hash: 'SHA-256' }, passwordKey, 256);\n const key = await crypto.subtle.importKey('raw', keyMaterial, 'AES-GCM', false, ['encrypt']);\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encryptedData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, encoder.encode(plaintext));\n const checksumData = `${data.userId}:${data.sessionId}:${encryptionMethod}`;\n const checksumBuffer = await crypto.subtle.digest('SHA-256', encoder.encode(checksumData));\n const checksum = bytesToBase64(new Uint8Array(checksumBuffer));\n const timestamp = Date.now();\n return { data: bytesToBase64(new Uint8Array(encryptedData)), iv: bytesToBase64(iv), salt: bytesToBase64(salt), version: BACKUP_VERSION, checksum, magic: BACKUP_MAGIC, encryptionMethod, createdAt: timestamp, credentialId: encryptionMethod === 'passkey' ? credentialId : undefined };\n}\n\nasync function decryptKeyshare(encryptedBackup: EncryptedBackup, password: string): Promise<KeyshareBackupData> {\n try { if (encryptedBackup.magic && encryptedBackup.magic !== BACKUP_MAGIC) throw new PasswordValidationError('Invalid backup file format'); if (encryptedBackup.version && encryptedBackup.version !== BACKUP_VERSION) throw new PasswordValidationError(`Unsupported backup version: ${encryptedBackup.version}`); } catch (e) { if (e instanceof PasswordValidationError) throw e; }\n try {\n const encoder = new TextEncoder(); const decoder = new TextDecoder();\n const salt = base64ToBytes(encryptedBackup.salt); const iv = base64ToBytes(encryptedBackup.iv); const encryptedData = base64ToBytes(encryptedBackup.data);\n const passwordKey = await crypto.subtle.importKey('raw', encoder.encode(password), 'PBKDF2', false, ['deriveBits']);\n const keyMaterial = await crypto.subtle.deriveBits({ name: 'PBKDF2', salt, iterations: 100000, hash: 'SHA-256' }, passwordKey, 256);\n const key = await crypto.subtle.importKey('raw', keyMaterial, 'AES-GCM', false, ['decrypt']);\n const decryptedData = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, encryptedData);\n const plaintext = decoder.decode(decryptedData); const backupData = JSON.parse(plaintext) as KeyshareBackupData;\n if (encryptedBackup.checksum) { const expected = `${backupData.userId}:${backupData.sessionId}:${encryptedBackup.encryptionMethod || 'password'}`; const expectedBuf = await crypto.subtle.digest('SHA-256', encoder.encode(expected)); const expectedChecksum = bytesToBase64(new Uint8Array(expectedBuf)); if (expectedChecksum !== encryptedBackup.checksum) throw new PasswordValidationError('Backup integrity check failed - file may be corrupted or tampered with'); }\n return backupData;\n } catch (error: any) {\n const message = error?.message || String(error);\n const name = error?.name || 'Error';\n if (name === 'OperationError' || message.includes('decrypt')) throw new PasswordValidationError('Incorrect password - unable to decrypt backup file');\n if (error instanceof SyntaxError || message.includes('JSON')) throw new PasswordValidationError('Corrupted backup file - decryption succeeded but data is invalid');\n throw new Error(`Failed to decrypt backup: ${message}`);\n }\n}\n\nasync function deriveBackupPasswordFromPasskey(userId: string, credentialId?: string): Promise<{ password: string; credentialId: string }> {\n const challengeString = `lumia-backup-key:${userId}`;\n const challenge = new TextEncoder().encode(challengeString);\n\n let allowCredentials: PublicKeyCredentialDescriptor[] = [];\n\n // If credentialId is provided, use it for more deterministic passkey selection\n if (credentialId) {\n try {\n // Convert base64url credential ID to bytes\n const base64 = credentialId.replace(/-/g, '+').replace(/_/g, '/');\n const pad = base64.length % 4 ? 4 - (base64.length % 4) : 0;\n const paddedBase64 = base64 + '='.repeat(pad);\n const credentialIdBytes = Uint8Array.from(atob(paddedBase64), c => c.charCodeAt(0));\n\n allowCredentials = [{\n id: credentialIdBytes,\n type: 'public-key',\n transports: ['internal', 'hybrid']\n }];\n } catch (error) {\n console.warn('[deriveBackupPasswordFromPasskey] Failed to parse credentialId, falling back to open selection:', error);\n }\n }\n\n const credential = (await navigator.credentials.get({\n publicKey: {\n challenge,\n allowCredentials,\n userVerification: 'required'\n }\n })) as PublicKeyCredential;\n\n if (credential && credential.response) {\n const credentialIdBytes = new TextEncoder().encode(credential.id);\n const combined = new Uint8Array(credentialIdBytes.length + challengeString.length);\n combined.set(credentialIdBytes, 0);\n combined.set(new TextEncoder().encode(challengeString), credentialIdBytes.length);\n const password = bytesToBase64(combined);\n\n // Return both password and the actual credential ID used\n return { password, credentialId: credential.id };\n }\n throw new Error('Passkey key derivation failed - user must provide password manually');\n}\n\nexport function getBackupStatus(userId: string): BackupStatus { const storage = typeof window !== 'undefined' ? window.localStorage : undefined; const statusData = storage?.getItem(`lumia-passport.backup.status.${userId}`); if (statusData) { try { return JSON.parse(statusData); } catch {} } return { server: { enabled: false }, cloud: { enabled: false }, local: { enabled: false } }; }\n\nexport function updateBackupStatus(userId: string, method: BackupMethod, status: Partial<BackupStatus[BackupMethod]>): void {\n const storage = typeof window !== 'undefined' ? window.localStorage : undefined; if (!storage) return; const current = getBackupStatus(userId); (current as any)[method] = { ...(current as any)[method], ...status }; storage.setItem(`lumia-passport.backup.status.${userId}`, JSON.stringify(current)); if (typeof window !== 'undefined') { window.dispatchEvent(new CustomEvent('lumia-passport-backup-status-changed', { detail: { method, status, currentStatus: current } })); }\n}\n\nexport function clearBackupStatus(userId: string): void { const storage = typeof window !== 'undefined' ? window.localStorage : undefined; storage?.removeItem(`lumia-passport.backup.status.${userId}`); }\n\nexport async function checkServerBackupAvailability(): Promise<{ hasBackup: boolean; serviceAvailable: boolean }> {\n try {\n const token = await getShareVaultToken(['share:get']);\n const response = await fetch(`${getShareVaultUrl()}/v1/shares/me/recovery/stats`, { method: 'GET', headers: { Authorization: `Bearer ${token.token}`, 'Content-Type': 'application/json' } });\n if (response.status === 404) return { hasBackup: false, serviceAvailable: true };\n if (!response.ok) return { hasBackup: false, serviceAvailable: false };\n return { hasBackup: true, serviceAvailable: true };\n } catch { return { hasBackup: false, serviceAvailable: false }; }\n}\n\nasync function uploadShareToVault(envelope: EnvelopeEncryptedShare, token: string): Promise<void> {\n const idempotencyKey = crypto.randomUUID ? crypto.randomUUID() : `backup-${Date.now()}`;\n const response = await fetch(`${getShareVaultUrl()}/v1/shares/me`, { method: 'PUT', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}`, 'Idempotency-Key': idempotencyKey }, body: JSON.stringify(envelope) });\n if (!response.ok) { const errorText = await response.text(); throw new Error(`Failed to upload share: ${response.status} ${response.statusText} - ${errorText}`); }\n}\n\nasync function downloadShareFromVault(token: string): Promise<EnvelopeEncryptedShare> {\n const response = await fetch(`${getShareVaultUrl()}/v1/shares/me`, { method: 'GET', headers: { Authorization: `Bearer ${token}`, 'X-Client-Device-Id': 'lumia-ui-kit', 'X-Client-Device-Name': 'Lumia UI Kit' } });\n if (!response.ok) { if (response.status === 404) throw new Error('No backup found on server for this user'); const errorText = await response.text(); throw new Error(`Failed to download share: ${response.status} ${response.statusText} - ${errorText}`); }\n const envelope = (await response.json()) as EnvelopeEncryptedShare; if (!envelope.ciphertext_share || !envelope.wrapped_dek || !envelope.kdf || !envelope.alg || !envelope.aad) throw new Error('Invalid envelope structure received from Share Vault');\n return envelope;\n}\n\nasync function envelopeEncryptKeyshare(data: KeyshareBackupData, userId: string): Promise<EnvelopeEncryptedShare> {\n // Get the credential ID that will be used for encryption\n const passkeyHelpers = createPasskeyHelpers(userId);\n const credentialId = passkeyHelpers.getCredId();\n\n const dek = crypto.getRandomValues(new Uint8Array(32));\n const kekBytes = await deriveKEKFromPasskey(userId);\n const kek = await crypto.subtle.importKey('raw', kekBytes, 'AES-GCM', false, ['encrypt']);\n const plaintext = JSON.stringify(data);\n const plaintextBytes = new TextEncoder().encode(plaintext);\n const dekCryptoKey = await crypto.subtle.importKey('raw', dek, 'AES-GCM', false, ['encrypt']);\n const dataIv = crypto.getRandomValues(new Uint8Array(12));\n const encryptedData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: dataIv }, dekCryptoKey, plaintextBytes);\n const wrapIv = crypto.getRandomValues(new Uint8Array(12));\n const wrappedDekData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: wrapIv }, kek, dek);\n const ciphertextWithIv = new Uint8Array(dataIv.length + encryptedData.byteLength);\n ciphertextWithIv.set(dataIv, 0);\n ciphertextWithIv.set(new Uint8Array(encryptedData), dataIv.length);\n const wrappedDekWithIv = new Uint8Array(wrapIv.length + wrappedDekData.byteLength);\n wrappedDekWithIv.set(wrapIv, 0);\n wrappedDekWithIv.set(new Uint8Array(wrappedDekData), wrapIv.length);\n\n return {\n ciphertext_share: bytesToBase64(ciphertextWithIv),\n wrapped_dek: bytesToBase64(wrappedDekWithIv),\n kdf: { prf: 'webauthn-prf', hkdf: 'hkdf-sha256', info: 'client-share' },\n alg: { data: 'aes-256-gcm', wrap: 'aes-256-gcm' },\n aad: { userId: data.userId, version: 1, deviceId: 'lumia-ui-kit' },\n createdAt: new Date().toISOString(),\n expiresAt: null,\n encryptionMethod: 'passkey', // Track encryption method\n credentialId: credentialId || undefined // Save the credential ID used for encryption\n };\n}\n\nasync function envelopeEncryptKeyshareWithPassword(data: KeyshareBackupData, password: string): Promise<EnvelopeEncryptedShare> {\n // Generate DEK and derive KEK from password\n const dek = crypto.getRandomValues(new Uint8Array(32));\n const salt = crypto.getRandomValues(new Uint8Array(16));\n const kekKey = await deriveKeyFromPassword(password, salt);\n\n const plaintext = JSON.stringify(data);\n const plaintextBytes = new TextEncoder().encode(plaintext);\n const dekCryptoKey = await crypto.subtle.importKey('raw', dek, 'AES-GCM', false, ['encrypt']);\n const dataIv = crypto.getRandomValues(new Uint8Array(12));\n const encryptedData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: dataIv }, dekCryptoKey, plaintextBytes);\n const wrapIv = crypto.getRandomValues(new Uint8Array(12));\n const wrappedDekData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: wrapIv }, kekKey, dek);\n\n const ciphertextWithIv = new Uint8Array(dataIv.length + encryptedData.byteLength);\n ciphertextWithIv.set(dataIv, 0);\n ciphertextWithIv.set(new Uint8Array(encryptedData), dataIv.length);\n const wrappedDekWithIv = new Uint8Array(salt.length + wrapIv.length + wrappedDekData.byteLength);\n wrappedDekWithIv.set(salt, 0);\n wrappedDekWithIv.set(wrapIv, salt.length);\n wrappedDekWithIv.set(new Uint8Array(wrappedDekData), salt.length + wrapIv.length);\n\n return {\n ciphertext_share: bytesToBase64(ciphertextWithIv),\n wrapped_dek: bytesToBase64(wrappedDekWithIv),\n kdf: { prf: 'pbkdf2', hkdf: 'hkdf-sha256', info: 'client-share' },\n alg: { data: 'aes-256-gcm', wrap: 'aes-256-gcm' },\n aad: { userId: data.userId, version: 1, deviceId: 'lumia-ui-kit' },\n createdAt: new Date().toISOString(),\n expiresAt: null,\n encryptionMethod: 'password' // Track encryption method\n };\n}\n\nasync function envelopeDecryptKeyshare(envelope: EnvelopeEncryptedShare, userId: string): Promise<KeyshareBackupData> {\n const kekBytes = await deriveKEKFromPasskey(userId, envelope.credentialId);\n const kek = await crypto.subtle.importKey('raw', kekBytes, 'AES-GCM', false, ['decrypt']);\n\n const wrappedDekWithIv = base64ToBytes(envelope.wrapped_dek);\n const wrapIv = wrappedDekWithIv.slice(0, 12);\n const wrappedDekData = wrappedDekWithIv.slice(12);\n\n try {\n const dekBytes = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: wrapIv }, kek, wrappedDekData);\n const dekCryptoKey = await crypto.subtle.importKey('raw', dekBytes, 'AES-GCM', false, ['decrypt']);\n\n const ciphertextWithIv = base64ToBytes(envelope.ciphertext_share);\n const dataIv = ciphertextWithIv.slice(0, 12);\n const encryptedData = ciphertextWithIv.slice(12);\n\n const decryptedData = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: dataIv }, dekCryptoKey, encryptedData);\n\n const plaintext = new TextDecoder().decode(decryptedData);\n const result = JSON.parse(plaintext) as KeyshareBackupData;\n return result;\n } catch (error) {\n logSdkError(\n error instanceof Error ? error : new Error('Envelope decryption failed'),\n { hasCredentialId: !!envelope.credentialId },\n \"vault\"\n );\n if (error instanceof Error && error.name === 'OperationError') {\n const credentialHint = envelope.credentialId\n ? `The backup requires a specific passkey (ID: ${envelope.credentialId.slice(-8)}...)`\n : 'The backup was encrypted with a different passkey than the one you selected';\n throw new Error(`Passkey mismatch: ${credentialHint}. If you have multiple passkeys, please try again and select the correct passkey that was used when creating this backup.`);\n }\n throw new Error('Failed to decrypt keyshare: ' + (error instanceof Error ? error.message : String(error)));\n }\n}\n\nasync function envelopeDecryptKeyshareWithPassword(envelope: EnvelopeEncryptedShare, password: string): Promise<KeyshareBackupData> {\n const wrappedDekWithSaltAndIv = base64ToBytes(envelope.wrapped_dek);\n\n // Extract salt (16 bytes), wrapIv (12 bytes), and wrapped DEK data\n const salt = wrappedDekWithSaltAndIv.slice(0, 16);\n const wrapIv = wrappedDekWithSaltAndIv.slice(16, 28);\n const wrappedDekData = wrappedDekWithSaltAndIv.slice(28);\n\n try {\n // Derive KEK from password using the same salt\n const kekKey = await deriveKeyFromPassword(password, salt);\n\n // Decrypt the DEK\n const dekBytes = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: wrapIv }, kekKey, wrappedDekData);\n\n // Import DEK as crypto key\n const dekCryptoKey = await crypto.subtle.importKey('raw', dekBytes, 'AES-GCM', false, ['decrypt']);\n\n // Decrypt main data\n const ciphertextWithIv = base64ToBytes(envelope.ciphertext_share);\n const dataIv = ciphertextWithIv.slice(0, 12);\n const encryptedData = ciphertextWithIv.slice(12);\n\n const decryptedData = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: dataIv }, dekCryptoKey, encryptedData);\n\n const plaintext = new TextDecoder().decode(decryptedData);\n const result = JSON.parse(plaintext) as KeyshareBackupData;\n return result;\n } catch (error) {\n logSdkError(\n error instanceof Error ? error : new Error('Password decryption failed'),\n { errorName: error instanceof Error ? error.name : \"unknown\" },\n \"vault\"\n );\n if (error instanceof Error && error.name === 'OperationError') {\n throw new Error('Incorrect password: Unable to decrypt the backup with the provided password.');\n }\n throw new Error('Failed to decrypt keyshare with password: ' + (error instanceof Error ? error.message : String(error)));\n }\n}\n\nexport async function backupToServer(userId: string, password?: string): Promise<void> {\n const storageData = typeof window !== 'undefined' ? window.localStorage : undefined;\n const keyshareData = storageData?.getItem(`tss.${userId}.keyshare`);\n const sessionId = storageData?.getItem(`tss.${userId}.sessionId`);\n const ownerAddress = storageData?.getItem(`tss.${userId}.ownerAddress`);\n\n if (!keyshareData || !sessionId || !ownerAddress) throw new Error('No keyshare data available for backup');\n\n const backupData = { userId, sessionId, keyshare: keyshareData, ownerAddress: ownerAddress as `0x${string}`, createdAt: Date.now(), version: BACKUP_VERSION };\n\n // Create envelope with appropriate encryption method\n const envelope = password\n ? await envelopeEncryptKeyshareWithPassword(backupData, password)\n : await envelopeEncryptKeyshare(backupData, userId);\n\n const vaultToken = await getShareVaultToken(['share:put']);\n await uploadShareToVault(envelope, vaultToken.token);\n updateBackupStatus(userId, 'server', { enabled: true, lastBackup: Date.now(), error: undefined });\n}\n\nexport async function restoreFromServer(userId: string, password: string | null = null): Promise<void> {\n const vaultToken = await getShareVaultToken(['share:get']);\n const envelope = await downloadShareFromVault(vaultToken.token);\n\n // Decrypt based on encryption method or user preference\n const backupData = password\n ? await envelopeDecryptKeyshareWithPassword(envelope, password)\n : await envelopeDecryptKeyshare(envelope, userId);\n\n if (backupData.userId !== userId) throw new Error('Server backup does not match current user');\n\n const storage = typeof window !== 'undefined' ? window.localStorage : undefined;\n if (!storage) throw new Error('localStorage not available');\n\n storage.setItem(`tss.${userId}.keyshare`, backupData.keyshare);\n storage.setItem(`tss.${userId}.sessionId`, backupData.sessionId);\n storage.setItem(`tss.${userId}.ownerAddress`, backupData.ownerAddress);\n}\n\nexport async function restoreFromBackup(file: File, password: string | null, userId: string): Promise<void> {\n const fileContent = await file.text();\n const encryptedBackup: EncryptedBackup = JSON.parse(fileContent);\n\n let decryptionPassword: string;\n if (password) {\n // Use provided password\n decryptionPassword = password;\n } else {\n // Use passkey-derived password, with specific credentialId if available\n const credentialIdFromBackup = encryptedBackup.encryptionMethod === 'passkey' ? encryptedBackup.credentialId : undefined;\n const result = await deriveBackupPasswordFromPasskey(userId, credentialIdFromBackup).catch(() => {\n throw new Error('Restore requires either password or passkey authentication');\n });\n decryptionPassword = result.password;\n }\n\n const backupData = await decryptKeyshare(encryptedBackup, decryptionPassword);\n if (backupData.userId !== userId) throw new Error('Backup file does not match current user');\n\n const storage = typeof window !== 'undefined' ? window.localStorage : undefined;\n if (!storage) throw new Error('localStorage not available');\n\n storage.setItem(`tss.${userId}.keyshare`, backupData.keyshare);\n storage.setItem(`tss.${userId}.sessionId`, backupData.sessionId);\n storage.setItem(`tss.${userId}.ownerAddress`, backupData.ownerAddress);\n}\n\nexport function getCurrentKeyshareBackupData(userId: string): KeyshareBackupData | null {\n try {\n const storage = typeof window !== 'undefined' ? window.localStorage : undefined;\n const keyshareData = storage?.getItem(`tss.${userId}.keyshare`);\n const sessionId = storage?.getItem(`tss.${userId}.sessionId`);\n const ownerAddress = storage?.getItem(`tss.${userId}.ownerAddress`);\n if (!keyshareData || !sessionId || !ownerAddress) {\n console.warn('[BACKUP] Missing keyshare data for backup:', {\n hasKeyshare: !!keyshareData,\n hasSession: !!sessionId,\n hasOwner: !!ownerAddress,\n });\n return null;\n }\n return {\n userId,\n sessionId,\n keyshare: keyshareData,\n ownerAddress: ownerAddress as `0x${string}`,\n createdAt: Date.now(),\n version: BACKUP_VERSION,\n };\n } catch (error) {\n logSdkError(\n error instanceof Error ? error : new Error('Failed to get keyshare data'),\n { userId },\n \"vault\"\n );\n return null;\n }\n}\n\nexport async function backupToLocalFile(userId: string, password?: string): Promise<void> {\n const backupData = getCurrentKeyshareBackupData(userId);\n if (!backupData) {\n throw new Error('No keyshare data available for backup');\n }\n\n // Determine encryption method and get password + credential ID\n const encryptionMethod: 'passkey' | 'password' = password ? 'password' : 'passkey';\n let backupPassword: string;\n let credentialId: string | undefined;\n\n if (password) {\n // Use provided password\n backupPassword = password;\n } else {\n // Use passkey-derived password and get the credential ID from the actual passkey used\n const result = await deriveBackupPasswordFromPasskey(userId).catch(() => {\n throw new Error('Backup requires either custom password or passkey authentication');\n });\n backupPassword = result.password;\n credentialId = result.credentialId;\n }\n\n const encryptedBackup = await encryptKeyshare(backupData, backupPassword, encryptionMethod, credentialId);\n\n const fileName = `lumia-keyshare-backup-${userId}-${Date.now()}.json`;\n const fileContent = JSON.stringify(encryptedBackup, null, 2);\n\n // Create and trigger download\n const blob = new Blob([fileContent], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n\n const a = document.createElement('a');\n a.href = url;\n a.download = fileName;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n\n updateBackupStatus(userId, 'local', { enabled: true, lastBackup: Date.now(), error: undefined });\n console.info('[BACKUP] Successfully downloaded backup file');\n}\n\nexport async function backupToCloud(\n userId: string,\n password?: string,\n providerId?: string,\n usePrivateStorage: boolean = true\n): Promise<void> {\n const backupData = getCurrentKeyshareBackupData(userId);\n if (!backupData) {\n throw new Error('No keyshare data available for backup');\n }\n\n // Determine encryption method and get password + credential ID\n const encryptionMethod: 'passkey' | 'password' = password ? 'password' : 'passkey';\n let backupPassword: string;\n let credentialId: string | undefined;\n\n if (password) {\n // Use provided password\n backupPassword = password;\n } else {\n // Use passkey-derived password and get the credential ID from the actual passkey used\n const result = await deriveBackupPasswordFromPasskey(userId).catch(() => {\n throw new Error('Backup requires either custom password or passkey authentication');\n });\n backupPassword = result.password;\n credentialId = result.credentialId;\n }\n\n const encryptedBackup = await encryptKeyshare(backupData, backupPassword, encryptionMethod, credentialId);\n\n const timestamp = Date.now();\n const fileName = `lumia-keyshare-backup-${userId}-${timestamp}.json`;\n const fileContent = JSON.stringify(encryptedBackup, null, 2);\n\n // Import cloud storage module dynamically to avoid bundle bloat\n try {\n const { getAvailableCloudProviders } = await import('./cloudStorage');\n const providers = getAvailableCloudProviders();\n\n if (providers.length === 0) {\n throw new Error(\n 'No cloud storage providers available in this environment'\n );\n }\n\n // Use specified provider or first available\n const provider = providerId ? providers.find(p => p.id === providerId) : providers[0];\n\n if (!provider) {\n throw new Error(\n providerId ?\n `Cloud provider '${providerId}' not available`\n : 'No cloud storage provider available'\n );\n }\n\n console.info(`[BACKUP] Using ${provider.name} for cloud backup`);\n\n // Authenticate if not already authenticated\n if (!provider.isAuthenticated()) {\n console.info(`[BACKUP] Authenticating with ${provider.name}`);\n const authenticated = await provider.authenticate();\n if (!authenticated) {\n throw new Error(`Failed to authenticate with ${provider.name}`);\n }\n }\n\n // Upload file to cloud storage\n console.info(`[BACKUP] Uploading backup to ${provider.name}`);\n const fileId = await provider.upload(fileName, fileContent, usePrivateStorage);\n\n updateBackupStatus(userId, 'cloud', { enabled: true, lastBackup: timestamp, error: undefined });\n } catch (error) {\n logSdkError(\n error instanceof Error ? error : new Error('Cloud backup failed'),\n { userId, providerId },\n \"vault\"\n );\n const errorMsg = error instanceof Error ? error.message : 'Cloud backup failed';\n updateBackupStatus(userId, 'cloud', { error: errorMsg });\n throw new Error(errorMsg);\n }\n}\n\nexport async function getAvailableCloudProviders(): Promise<\n Array<{ id: string; name: string; icon: string; isAuthenticated: boolean }>\n> {\n try {\n const { getAvailableCloudProviders } = await import('./cloudStorage');\n const providers = getAvailableCloudProviders();\n\n return providers.map(provider => ({\n id: provider.id,\n name: provider.name,\n icon: provider.icon,\n isAuthenticated: provider.isAuthenticated(),\n }));\n } catch (error) {\n console.warn('[BACKUP] Failed to load cloud providers:', error);\n return [];\n }\n}\n","// Use iframe-based MPC client for secure key storage\nimport {\n ensureDkgAndGetOwner,\n checkKeyshare,\n getAddress,\n} from '../lib/iframe-mpc-client';\nimport { syncKeyshareStatus } from './index';\n\nexport interface KeyshareStatus {\n hasServerKeyshare: boolean;\n hasLocalKeyshare: boolean;\n needsDkg: boolean;\n needsRecovery: boolean;\n ownerAddress?: `0x${string}`;\n}\n\nexport async function checkKeyshareStatusWithSync(userId: string): Promise<KeyshareStatus> {\n const serverHasKeyshare = await syncKeyshareStatus();\n return checkKeyshareStatus(userId, serverHasKeyshare);\n}\n\nexport async function checkKeyshareStatus(\n userId: string,\n serverHasKeyshare: boolean\n): Promise<KeyshareStatus> {\n // Check keyshare status via secure iframe\n const keyshareInfo = await checkKeyshare(userId);\n const hasLocalKeyshare = keyshareInfo.hasKeyshare;\n const localOwnerAddress = keyshareInfo.address;\n\n console.log('[checkKeyshareStatus] Checking via iframe:', {\n userId,\n serverHasKeyshare,\n hasLocalKeyshare,\n ownerAddress: localOwnerAddress,\n });\n\n let needsDkg = false;\n let needsRecovery = false;\n if (!serverHasKeyshare && !hasLocalKeyshare) needsDkg = true;\n else if (serverHasKeyshare && !hasLocalKeyshare) needsRecovery = true;\n else if (!serverHasKeyshare && hasLocalKeyshare) {\n needsDkg = true;\n }\n\n const result = {\n hasServerKeyshare: serverHasKeyshare,\n hasLocalKeyshare,\n needsDkg,\n needsRecovery,\n ownerAddress: localOwnerAddress,\n };\n console.log('[checkKeyshareStatus] Result:', result);\n\n return result;\n}\n\nasync function ensureKeyshareForNewUser(userId: string, onProgress?: (step: string) => void): Promise<{ ownerAddress: `0x${string}` }> {\n onProgress?.('Setting up secure key management...');\n const result = await ensureDkgAndGetOwner(userId);\n if (!result.ownerAddress) throw new Error('DKG completed but no owner address received');\n await syncKeyshareStatus();\n onProgress?.('Key management setup complete');\n return { ownerAddress: result.ownerAddress };\n}\n\nexport async function ensureKeyshare(\n userId: string,\n serverHasKeyshare: boolean,\n onProgress?: (step: string) => void,\n isNewUser?: boolean\n): Promise<{ ownerAddress: `0x${string}` }> {\n console.log('[ensureKeyshare] Called with:', { userId, serverHasKeyshare, isNewUser });\n\n const status = await checkKeyshareStatus(userId, serverHasKeyshare);\n\n if (!status.needsDkg && !status.needsRecovery && status.ownerAddress) {\n console.log('[ensureKeyshare] Keyshare already ready, returning');\n onProgress?.('Keyshare ready');\n return { ownerAddress: status.ownerAddress };\n }\n\n if (status.needsRecovery) {\n console.log('[ensureKeyshare] Recovery needed, checking backups...');\n onProgress?.('Checking backup availability...');\n const { checkServerBackupAvailability, getBackupStatus } = await import('@/vaultClient');\n const localBackupStatus = getBackupStatus(userId);\n const serverBackupResult = await checkServerBackupAvailability();\n const hasLocalBackup = localBackupStatus.local.enabled && localBackupStatus.local.lastBackup;\n const hasCloudBackup = localBackupStatus.cloud.enabled && localBackupStatus.cloud.lastBackup;\n const hasAnyBackup = serverBackupResult.hasBackup || hasLocalBackup || hasCloudBackup;\n if (!serverBackupResult.serviceAvailable) {\n if (!hasLocalBackup && !hasCloudBackup) { const e = new Error('Your account exists but backup verification failed.\\n\\nThe backup server is currently unavailable.'); (e as any).code = 'BACKUP_SERVICE_UNAVAILABLE'; (e as any).userId = userId; (e as any).serverHasKeyshare = true; throw e; }\n } else if (!hasAnyBackup) {\n const noBackupError = new Error('Your account exists but no backups are available for recovery.'); (noBackupError as any).code = 'NO_BACKUP_AVAILABLE'; (noBackupError as any).userId = userId; (noBackupError as any).serverHasKeyshare = true; throw noBackupError;\n }\n onProgress?.('Backup found - restoration required');\n const recoveryError = new Error('Account exists on server but keyshare missing locally. Please restore from backup to access your account.');\n (recoveryError as any).code = 'KEYSHARE_RECOVERY_NEEDED'; (recoveryError as any).userId = userId; (recoveryError as any).serverHasKeyshare = true; (recoveryError as any).availableBackups = { server: serverBackupResult.hasBackup, local: hasLocalBackup, cloud: hasCloudBackup };\n throw recoveryError;\n }\n\n if (status.needsDkg) { onProgress?.('Setting up secure key management...'); }\n else { throw new Error('Invalid keyshare state - neither DKG nor recovery needed but keyshare missing'); }\n return ensureKeyshareForNewUser(userId, onProgress);\n}\n\nexport async function clearLocalKeyshare(userId: string): Promise<void> {\n // Note: In iframe-based architecture, keyshares are stored in iframe's isolated localStorage\n // We can't directly clear them from parent context\n // This function is kept for API compatibility but does nothing in iframe mode\n console.log('[clearLocalKeyshare] Keyshares are now managed by secure iframe');\n console.log('[clearLocalKeyshare] To clear keyshares, user must revoke authorization in iframe');\n\n // For backwards compatibility during migration, also clear any old localStorage keys\n if (typeof window !== 'undefined' && window.localStorage) {\n const keys = [\n `tss.${userId}.keyshare`,\n `tss.${userId}.ownerAddress`,\n `tss.${userId}.sessionId`,\n ...Object.keys(window.localStorage).filter((key) => key.startsWith(`tss.${userId}.dkg.`)),\n ];\n keys.forEach((key) => window.localStorage.removeItem(key));\n console.log('[clearLocalKeyshare] Cleared old localStorage keys for migration');\n }\n}\n\nexport async function getKeyshareInfo(userId: string): Promise<{\n hasKeyshare: boolean;\n ownerAddress?: `0x${string}`;\n sessionId?: string;\n keyshareSize?: number;\n}> {\n // Get keyshare info from secure iframe\n const info = await checkKeyshare(userId);\n\n return {\n hasKeyshare: info.hasKeyshare,\n ownerAddress: info.address,\n sessionId: 'iframe-session', // Session managed by iframe\n keyshareSize: undefined, // Size not exposed for security\n };\n}\n","import { getServiceUrls } from '../../../config/lumiaPassport';\n\nexport interface AuthProvider {\n provider: 'passkey' | 'email' | 'telegram' | 'google' | 'discord' | 'twitter' | 'wallet';\n verified: boolean;\n linkedAt: string;\n lastUsedAt?: string;\n externalId: string;\n}\n\nexport interface ProvidersResponse { providers: AuthProvider[] }\n\nexport function getTssUrl(): string { return getServiceUrls().tssUrl; }\n\nexport function getProviderDisplayInfo(provider: string) {\n const providers = {\n passkey: { name: 'Passkey', icon: '🔐', description: 'Biometric authentication', color: 'blue' },\n email: { name: 'Email', icon: '📧', description: 'Email verification', color: 'gray' },\n telegram: { name: 'Telegram', icon: '📱', description: 'Telegram account', color: 'blue' },\n google: { name: 'Google', icon: '🔍', description: 'Google account', color: 'red' },\n discord: { name: 'Discord', icon: '🎮', description: 'Discord account', color: 'purple' },\n twitter: { name: 'Twitter', icon: '🐦', description: 'Twitter account', color: 'blue' },\n wallet: { name: 'Wallet', icon: '👛', description: 'External wallet (EOA)', color: 'purple' }\n } as const;\n return (providers as any)[provider] || { name: provider, icon: '🔗', description: 'Authentication provider', color: 'gray' };\n}\n\nexport function formatDate(dateString: string): string {\n if (!dateString) return 'Never';\n try {\n const date = new Date(dateString);\n return `${date.toLocaleDateString()} ${date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`;\n } catch {\n return 'Invalid date';\n }\n}\n\n","import { authenticatedFetch, ensureValidToken, jwtTokenManager } from '../index';\nimport { getTssUrl } from './types';\nimport type { AuthProvider, ProvidersResponse } from './types';\n\nexport async function getLinkedProviders(): Promise<AuthProvider[]> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n const response = await authenticatedFetch(`${getTssUrl()}/api/auth/providers`, { method: 'GET' });\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to fetch providers: ${response.statusText}`);\n }\n const data: ProvidersResponse = await response.json();\n return data.providers;\n}\n\nexport async function unlinkProvider(providerType: string, externalId?: string): Promise<void> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n let url = `${getTssUrl()}/api/auth/unlink/${providerType}`;\n if (externalId) url += `?externalId=${encodeURIComponent(externalId)}`;\n const response = await authenticatedFetch(url, { method: 'DELETE' });\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to unlink provider: ${response.statusText}`);\n }\n try {\n const data = await response.json();\n if (data?.accessToken && data?.refreshToken && data?.expiresIn) {\n jwtTokenManager.setTokens({\n accessToken: data.accessToken,\n refreshToken: data.refreshToken,\n userId: jwtTokenManager.getUserId() || '',\n expiresIn: data.expiresIn,\n hasKeyshare: (jwtTokenManager.getHasKeyshare() ?? false) as boolean,\n } as any);\n }\n } catch {}\n}\n","import { authenticatedFetch, ensureValidToken } from '../index';\nimport { getTssUrl } from './types';\n\nexport async function sendEmailLinkCode(email: string): Promise<void> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n const response = await authenticatedFetch(`${getTssUrl()}/api/auth/link/email/send-code`, {\n method: 'POST',\n body: JSON.stringify({ email })\n });\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to send email verification code: ${response.statusText}`);\n }\n}\n\nexport async function verifyEmailLinkCode(email: string, code: string): Promise<void> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n const response = await authenticatedFetch(`${getTssUrl()}/api/auth/link/email/verify-code`, {\n method: 'POST',\n body: JSON.stringify({ email, code })\n });\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to verify email and link provider: ${response.statusText}`);\n }\n}\n\n","import { authenticatedFetch, ensureValidToken, jwtTokenManager } from '../index';\nimport { base64urlToUint8Array } from '../base64url';\nimport { credentialToAttestationPayload, type AttestationCredentialPayload } from '../webauthn';\nimport { getTssUrl } from './types';\n\n// Low-level endpoint wrapper\n// API: Link passkey to existing account\n// Method: POST\n// Path: /api/auth/link/passkey\nexport async function completePasskeyLinking(payload: { challengeId: string; credential: AttestationCredentialPayload }): Promise<void> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n const response = await authenticatedFetch(`${getTssUrl()}/api/auth/link/passkey/complete`, {\n method: 'POST',\n body: JSON.stringify(payload),\n });\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to link passkey: ${response.statusText}`);\n }\n}\n\nexport async function beginPasskeyLinking(): Promise<{ challengeId: string; options: PublicKeyCredentialCreationOptions }> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n // Try preferred begin endpoint first\n let res = await authenticatedFetch(`${getTssUrl()}/api/auth/link/passkey/begin`, { method: 'POST' });\n if (res.ok) {\n const begin = await res.json();\n const options: PublicKeyCredentialCreationOptions = {\n rp: begin.rp,\n user: { id: base64urlToUint8Array(begin.user.id), name: begin.user.name, displayName: begin.user.displayName },\n challenge: base64urlToUint8Array(begin.challenge),\n pubKeyCredParams: begin.pubKeyCredParams,\n timeout: begin.timeout,\n attestation: begin.attestation,\n authenticatorSelection: { ...begin.authenticatorSelection, residentKey: begin.authenticatorSelection?.residentKey ?? 'preferred', requireResidentKey: begin.authenticatorSelection?.requireResidentKey ?? false, userVerification: begin.authenticatorSelection?.userVerification ?? 'preferred' },\n excludeCredentials: begin.excludeCredentials?.map((cred: any) => ({ type: cred.type, id: base64urlToUint8Array(cred.id), transports: cred.transports })) || undefined,\n };\n return { challengeId: begin.challengeId, options };\n }\n\n // Backward compatibility: options endpoint\n res = await authenticatedFetch(`${getTssUrl()}/api/auth/link/passkey/options`, { method: 'GET' });\n if (!res.ok) throw new Error('Failed to get passkey linking options');\n const begin = await res.json();\n const options: PublicKeyCredentialCreationOptions = {\n rp: begin.rp,\n user: { id: base64urlToUint8Array(begin.user.id), name: begin.user.name, displayName: begin.user.displayName },\n challenge: base64urlToUint8Array(begin.challenge),\n pubKeyCredParams: begin.pubKeyCredParams,\n timeout: begin.timeout,\n attestation: begin.attestation,\n authenticatorSelection: { ...begin.authenticatorSelection, residentKey: 'preferred', requireResidentKey: false, userVerification: 'preferred' },\n excludeCredentials: begin.excludeCredentials?.map((cred: any) => ({ type: cred.type, id: base64urlToUint8Array(cred.id), transports: cred.transports })) || undefined,\n };\n return { challengeId: begin.challengeId, options };\n}\n\n// High-level helper: create a new WebAuthn credential and link it using COSE attestation\nexport async function linkPasskeyWithWebAuthn(optionsOverride?: Partial<PublicKeyCredentialCreationOptions>): Promise<void> {\n if (!('credentials' in navigator) || !('create' in navigator.credentials!)) {\n throw new Error('WebAuthn not supported in this browser');\n }\n\n const userId = jwtTokenManager.getUserId();\n if (!userId) throw new Error('No authenticated user');\n\n // Fetch linking options (challengeId + creation options)\n let challengeId: string | null = null;\n let publicKeyOptions: PublicKeyCredentialCreationOptions | null = null;\n try {\n const begin = await beginPasskeyLinking();\n challengeId = begin.challengeId;\n publicKeyOptions = begin.options;\n } catch {\n // Ignore and use fallback\n }\n\n if (!publicKeyOptions) {\n // Fallback minimal options (local challenge, host RP)\n const challenge = new Uint8Array(32);\n crypto.getRandomValues(challenge);\n publicKeyOptions = {\n rp: { name: window.location.hostname || 'Lumia Passport' },\n user: {\n id: new TextEncoder().encode(userId),\n name: userId,\n displayName: userId,\n },\n challenge,\n pubKeyCredParams: [{ type: 'public-key', alg: -7 }],\n attestation: 'none',\n authenticatorSelection: { residentKey: 'preferred', userVerification: 'preferred' },\n timeout: 60000,\n } as PublicKeyCredentialCreationOptions;\n }\n\n // Improve UX: customize display name and username per creation so OS sheet shows distinct labels\n try {\n const ts = new Date().toISOString().replace(/[:.]/g, '-');\n const friendlyDisplay = `Lumia User (${ts})`;\n const friendlyName = `lumia-link.${ts}`;\n const originalUser = publicKeyOptions.user as PublicKeyCredentialUserEntity;\n publicKeyOptions = {\n ...publicKeyOptions,\n user: {\n ...originalUser,\n name: friendlyName,\n displayName: friendlyDisplay,\n },\n } as PublicKeyCredentialCreationOptions;\n } catch {}\n\n // Ensure secure context\n if (!(window.isSecureContext || window.location.hostname === 'localhost')) {\n throw new Error('Passkey requires secure context (https or localhost)');\n }\n\n // Normalize rp.id if it mismatches origin host (helps local/dev)\n try {\n const originHost = window.location.hostname;\n const rpId = (publicKeyOptions.rp as any)?.id as string | undefined;\n const suffixMatches = (host: string, rp: string) => host === rp || host.endsWith(`.${rp}`);\n if (rpId && !suffixMatches(originHost, rpId)) {\n console.warn('[PasskeyLink] Adjusting rp.id to origin host for WebAuthn', { rpId, originHost });\n publicKeyOptions = { ...publicKeyOptions, rp: { ...(publicKeyOptions.rp as any), id: originHost } } as any;\n }\n } catch {}\n\n console.log('[PasskeyLink] Calling navigator.credentials.create', {\n rp: publicKeyOptions.rp,\n timeout: publicKeyOptions.timeout,\n attestation: publicKeyOptions.attestation,\n });\n\n const credential = (await navigator.credentials.create({ publicKey: { ...publicKeyOptions, ...optionsOverride } as PublicKeyCredentialCreationOptions })) as PublicKeyCredential;\n if (!credential) throw new Error('Passkey creation was cancelled');\n\n // Convert to registration-like attestation payload (COSE format)\n const attestationPayload = credentialToAttestationPayload(credential);\n\n // If we don't have a challengeId (fallback path), emulate a local one to satisfy schema\n const cid = challengeId || 'local-' + Date.now();\n\n await completePasskeyLinking({ challengeId: cid, credential: attestationPayload });\n}\n\nfunction base64urlToUint8Array(base64url: string): Uint8Array {\n const base64 = base64url.replace(/-/g, '+').replace(/_/g, '/');\n const pad = base64.length % 4 ? 4 - (base64.length % 4) : 0;\n const padded = base64 + '='.repeat(pad);\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n","import { authenticatedFetch, ensureValidToken } from '../index';\nimport { getTssUrl } from './types';\n\nexport async function linkTelegram(telegramData: any): Promise<void> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n const response = await authenticatedFetch(`${getTssUrl()}/api/auth/link/telegram`, {\n method: 'POST',\n body: JSON.stringify(telegramData)\n });\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to link Telegram: ${response.statusText}`);\n }\n}\n\n// Lightweight widget integration helper\nexport function mountTelegramLoginWidget(container: HTMLElement, botUsername: string, onAuth: (data: any) => void, options?: { requestAccess?: 'write'; }) {\n const scriptId = 'telegram-login-widget';\n if (!document.getElementById(scriptId)) {\n const s = document.createElement('script');\n s.id = scriptId;\n s.src = 'https://telegram.org/js/telegram-widget.js?22';\n s.async = true;\n s.defer = true;\n container.parentElement?.appendChild(s);\n }\n\n // Create widget container\n const btn = document.createElement('div');\n btn.setAttribute('class', 'tg-login-button');\n btn.setAttribute('data-telegram-login', botUsername);\n btn.setAttribute('data-size', 'large');\n if (options?.requestAccess) btn.setAttribute('data-request-access', options.requestAccess);\n\n // Register callback\n const callbackName = `__lumia_tg_auth_cb_${Math.random().toString(36).slice(2)}`;\n (window as any)[callbackName] = (user: any) => onAuth(user);\n btn.setAttribute('data-onauth', callbackName);\n\n container.innerHTML = '';\n container.appendChild(btn);\n}\n\n","import { authenticatedFetch, ensureValidToken } from '../index';\nimport { getTssUrl } from './types';\nimport type { Address } from 'viem';\n\nexport interface WalletLinkRequest {\n address: Address;\n signature: string;\n message: string;\n chainId: number;\n walletName?: string; // e.g., \"MetaMask\", \"Rainbow\", \"Coinbase Wallet\"\n walletType?: string; // e.g., \"metaMask\", \"rainbow\", \"coinbaseWallet\" (connector id)\n}\n\nexport async function linkWallet(walletData: WalletLinkRequest): Promise<void> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n const response = await authenticatedFetch(`${getTssUrl()}/api/auth/link/wallet`, {\n method: 'POST',\n body: JSON.stringify(walletData)\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to link wallet: ${response.statusText}`);\n }\n}\n\nexport async function unlinkWallet(address: Address): Promise<void> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n const response = await authenticatedFetch(`${getTssUrl()}/api/auth/unlink/wallet?address=${encodeURIComponent(address)}`, {\n method: 'DELETE'\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to unlink wallet: ${response.statusText}`);\n }\n}\n\nexport function createSignatureMessage(address: Address, nonce?: string): string {\n const timestamp = Date.now();\n const nonceValue = nonce || Math.random().toString(36).substring(2, 15);\n\n return `Lumia Passport Wallet Link\\n\\nAddress: ${address}\\nNonce: ${nonceValue}\\nTimestamp: ${timestamp}\\n\\nSign this message to link your wallet to Lumia Passport`;\n}","export * from './types';\nexport * from './common';\nexport * from './email';\nexport * from './passkey';\nexport * from './telegram';\nexport * from './wallet';\n\n","// Re-export JWT functionality from @lumiapassport/core\nexport {\n type JwtTokens,\n type LoginResponse,\n type RefreshResponse,\n type VerifyResponse,\n JwtTokenManager,\n createJwtTokenManager,\n jwtTokenManager,\n configureJwtModule,\n logout,\n verifyToken,\n ensureValidToken,\n authenticatedFetch,\n loginWithUserId,\n loginWithEmail,\n loginWithTelegram,\n syncKeyshareStatus,\n} from '@lumiapassport/core/auth';\n\n// Browser-specific passkey auth functions\nexport {\n beginPasskeyAuthentication,\n completePasskeyAuthentication,\n beginPasskeyRegistration,\n completePasskeyRegistration,\n} from './passkeyAuth';\n\n// UI-specific auth modules\nexport * from './telegram';\nexport * from './passkey';\nexport * from './keyshare';\nexport * from './providers';\n\nexport type AuthMethod = 'telegram' | 'passkey' | 'development' | 'email';\n\nexport interface AuthState {\n method?: AuthMethod;\n isAuthenticated: boolean;\n userId?: string;\n displayName?: string;\n photoUrl?: string;\n accessToken?: string;\n expiresAt?: number;\n hasKeyshare?: boolean;\n needsRecovery?: boolean;\n}\n\nexport const createInitialAuthState = (): AuthState => ({ isAuthenticated: false });\n\n","/**\n * Iframe Manager for Parent SDK\n *\n * Manages secure communication with the isolated iframe wallet at auth.lumiapassport.com\n * Implements postMessage protocol with HMAC authentication and replay protection\n */\n\nimport type { Address, Hex } from 'viem';\n\n// ========================================\n// Types\n// ========================================\n\ninterface SecureMessage {\n type: string;\n messageId: string;\n timestamp: number;\n nonce: string;\n hmac?: string;\n projectId: string;\n data: Record<string, any>;\n}\n\ninterface PendingRequest {\n resolve: (value: any) => void;\n reject: (error: Error) => void;\n timestamp: number;\n}\n\ninterface Transaction {\n to: Address;\n value: string;\n data?: Hex;\n gasLimit?: string;\n}\n\nexport interface IframeManagerConfig {\n iframeUrl: string;\n projectId: string;\n debug?: boolean;\n onWalletReady?: (status: WalletReadyStatus) => void;\n themeColors?: {\n background?: string;\n text?: string;\n textSecondary?: string;\n border?: string;\n };\n}\n\nexport interface WalletReadyStatus {\n ready: boolean;\n userId?: string;\n address?: `0x${string}`;\n hasKeyshare: boolean;\n hasSession: boolean;\n timestamp: number;\n}\n\n// ========================================\n// Iframe Manager\n// ========================================\n\nexport class IframeManager {\n private iframe: HTMLIFrameElement | null = null;\n private iframeUrl: string;\n private projectId: string;\n private debug: boolean;\n private sessionToken: string | null = null;\n private isReady: boolean = false;\n private readyPromise: Promise<void>;\n private readyResolve!: () => void;\n private onWalletReadyCallback?: (status: WalletReadyStatus) => void;\n private themeColors?: IframeManagerConfig['themeColors'];\n\n // Message handling\n private pendingRequests = new Map<string, PendingRequest>();\n private usedNonces = new Set<string>();\n private messageListener: ((event: MessageEvent) => void) | null = null;\n\n // Timeouts\n private readonly REQUEST_TIMEOUT = 300000; // 5 minutes (for user interactions like consent)\n private readonly NONCE_EXPIRY = 300000; // 5 minutes\n\n constructor(config: IframeManagerConfig) {\n this.iframeUrl = config.iframeUrl;\n this.projectId = config.projectId;\n this.debug = config.debug || false;\n this.onWalletReadyCallback = config.onWalletReady;\n this.themeColors = config.themeColors;\n\n this.readyPromise = new Promise((resolve) => {\n this.readyResolve = resolve;\n });\n\n this.log('[IframeManager] Initialized with:', {\n iframeUrl: this.iframeUrl,\n projectId: this.projectId,\n hasThemeColors: !!this.themeColors,\n });\n }\n\n /**\n * Initialize iframe and wait for it to be ready\n */\n async initialize(): Promise<void> {\n if (this.iframe) {\n return this.readyPromise;\n }\n\n // Create iframe element\n this.iframe = document.createElement('iframe');\n\n // Build iframe URL with theme colors\n let iframeUrl = this.iframeUrl;\n if (this.themeColors) {\n const params = new URLSearchParams();\n if (this.themeColors.background) params.set('bg', this.themeColors.background);\n if (this.themeColors.text) params.set('text', this.themeColors.text);\n if (this.themeColors.textSecondary) params.set('textSec', this.themeColors.textSecondary);\n if (this.themeColors.border) params.set('border', this.themeColors.border);\n\n if (params.toString()) {\n iframeUrl += (iframeUrl.includes('?') ? '&' : '?') + params.toString();\n }\n }\n\n this.iframe.src = iframeUrl;\n this.iframe.id = 'lumia-passport-iframe';\n\n // Initially hidden\n this.iframe.style.display = 'none';\n this.iframe.style.position = 'fixed';\n this.iframe.style.top = '0';\n this.iframe.style.left = '0';\n this.iframe.style.width = '100%';\n this.iframe.style.height = '100%';\n this.iframe.style.border = 'none';\n this.iframe.style.zIndex = '999999';\n this.iframe.style.background = 'rgba(0, 0, 0, 0.5)';\n\n // Sandbox: strict - no popups allowed (explorer links will use postMessage to parent)\n this.iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin');\n\n // Allow WebAuthn (passkey) API in iframe\n this.iframe.setAttribute('allow', 'publickey-credentials-get *; publickey-credentials-create *');\n\n // Setup message listener\n this.messageListener = this.handleMessage.bind(this);\n window.addEventListener('message', this.messageListener);\n\n // Append to body\n document.body.appendChild(this.iframe);\n\n // Wait for IFRAME_READY message\n await this.readyPromise;\n\n // Authenticate SDK with iframe\n await this.authenticateSDK();\n\n this.log('[IframeManager] ✅ Iframe ready and authenticated');\n }\n\n /**\n * Set the onWalletReady callback\n */\n setOnWalletReady(callback: (status: WalletReadyStatus) => void): void {\n this.onWalletReadyCallback = callback;\n }\n\n /**\n * Authenticate SDK with iframe to establish session\n */\n private async authenticateSDK(): Promise<void> {\n const response = await this.sendMessage('SDK_AUTH', {\n projectId: this.projectId,\n });\n\n if (response.type === 'LUMIA_PASSPORT_SDK_AUTH_SUCCESS') {\n this.sessionToken = response.sessionToken;\n } else {\n throw new Error('SDK authentication failed');\n }\n }\n\n /**\n * Handle incoming postMessage events\n */\n private handleMessage(event: MessageEvent): void {\n const message = event.data;\n\n // Quick filter: ignore messages that are clearly not ours\n // This prevents spam from browser extensions, dev tools, etc.\n if (!message || typeof message !== 'object' || !message.type) {\n // Silently ignore messages without basic structure\n return;\n }\n\n // Check if this looks like a Lumia Passport message\n // Our expected message types from iframe\n const validIframeTypes = [\n 'LUMIA_PASSPORT_IFRAME_READY',\n 'LUMIA_PASSPORT_WALLET_READY',\n 'LUMIA_PASSPORT_SHOW_IFRAME',\n 'LUMIA_PASSPORT_HIDE_IFRAME',\n 'LUMIA_PASSPORT_SDK_AUTH_SUCCESS',\n 'LUMIA_PASSPORT_AUTH_SUCCESS',\n 'LUMIA_PASSPORT_DKG_SUCCESS',\n 'LUMIA_PASSPORT_SIGNATURE',\n 'LUMIA_PASSPORT_ADDRESS',\n 'LUMIA_PASSPORT_KEYSHARE_STATUS',\n 'LUMIA_PASSPORT_TRUSTED_APPS_LIST',\n 'LUMIA_PASSPORT_TRUSTED_APP_REMOVED',\n 'LUMIA_PASSPORT_REQUEST_NEW_TOKEN',\n 'LUMIA_PASSPORT_TOKEN_REFRESHED',\n 'LUMIA_PASSPORT_RESPONSE',\n 'LUMIA_PASSPORT_ERROR',\n ];\n\n if (!validIframeTypes.includes(message.type) && !message.messageId) {\n // Not our message type and no messageId - ignore\n return;\n }\n\n // IMPORTANT: Origin validation\n // We MUST validate that messages come from our iframe (auth.lumiapassport.com)\n // This protects against malicious actors sending fake messages from other origins\n const iframeOrigin = new URL(this.iframeUrl).origin;\n if (event.origin !== iframeOrigin) {\n // Log warning for potential security issue\n this.log('[IframeManager] ⚠️ Ignored message from invalid origin:', { received: event.origin, expected: iframeOrigin });\n return;\n }\n\n // At this point we know:\n // 1. Message has valid structure\n // 2. Message type matches our protocol\n // 3. Message originated from our iframe (auth.lumiapassport.com)\n\n // Handle IFRAME_READY\n if (message.type === 'LUMIA_PASSPORT_IFRAME_READY') {\n this.log('[IframeManager] 📨 Received LUMIA_PASSPORT_IFRAME_READY');\n this.isReady = true;\n this.readyResolve();\n return;\n }\n\n // Handle WALLET_READY status\n if (message.type === 'LUMIA_PASSPORT_WALLET_READY') {\n this.log('[IframeManager] 📨 Received LUMIA_PASSPORT_WALLET_READY', message.data);\n if (this.onWalletReadyCallback) {\n this.onWalletReadyCallback(message.data as WalletReadyStatus);\n }\n return;\n }\n\n // Handle SHOW_IFRAME request\n if (message.type === 'LUMIA_PASSPORT_SHOW_IFRAME') {\n this.log('[IframeManager] 📨 Received LUMIA_PASSPORT_SHOW_IFRAME');\n this.showIframe();\n return;\n }\n\n // Handle HIDE_IFRAME request\n if (message.type === 'LUMIA_PASSPORT_HIDE_IFRAME') {\n this.log('[IframeManager] 📨 Received LUMIA_PASSPORT_HIDE_IFRAME');\n this.hideIframe();\n return;\n }\n\n // Handle REQUEST_NEW_TOKEN from iframe\n if (message.type === 'LUMIA_PASSPORT_REQUEST_NEW_TOKEN') {\n this.log('[IframeManager] 📨 Received LUMIA_PASSPORT_REQUEST_NEW_TOKEN');\n // Handle async token refresh without blocking message processing\n this.handleTokenRefreshRequest(message).catch((error) => {\n this.log('[IframeManager] ❌ Token refresh error:', error);\n });\n return;\n }\n\n // Handle responses to our requests\n if (message.messageId) {\n const pending = this.pendingRequests.get(message.messageId);\n if (pending) {\n this.pendingRequests.delete(message.messageId);\n\n if (message.type === 'LUMIA_PASSPORT_ERROR') {\n pending.reject(new Error(message.error || 'Unknown error'));\n } else {\n pending.resolve(message.data || message);\n }\n }\n }\n }\n\n /**\n * Handle token refresh request from iframe\n */\n private async handleTokenRefreshRequest(message: any): Promise<void> {\n try {\n // Import jwtTokenManager dynamically\n const { jwtTokenManager } = await import('../auth');\n\n // Attempt to refresh the token\n const refreshSuccess = await jwtTokenManager.refreshAccessToken();\n\n if (refreshSuccess) {\n const newAccessToken = jwtTokenManager.getAccessToken();\n\n // Send new token to iframe\n if (this.iframe && this.iframe.contentWindow) {\n const iframeOrigin = new URL(this.iframeUrl).origin;\n this.iframe.contentWindow.postMessage(\n {\n type: 'LUMIA_PASSPORT_TOKEN_REFRESHED',\n messageId: message.messageId,\n accessToken: newAccessToken,\n timestamp: Date.now(),\n },\n iframeOrigin\n );\n }\n } else {\n // Send error to iframe\n if (this.iframe && this.iframe.contentWindow) {\n const iframeOrigin = new URL(this.iframeUrl).origin;\n this.iframe.contentWindow.postMessage(\n {\n type: 'LUMIA_PASSPORT_TOKEN_REFRESHED',\n messageId: message.messageId,\n error: 'Token refresh failed',\n timestamp: Date.now(),\n },\n iframeOrigin\n );\n }\n }\n } catch (error) {\n // Send error to iframe\n if (this.iframe && this.iframe.contentWindow) {\n const iframeOrigin = new URL(this.iframeUrl).origin;\n this.iframe.contentWindow.postMessage(\n {\n type: 'LUMIA_PASSPORT_TOKEN_REFRESHED',\n messageId: message.messageId,\n error: error instanceof Error ? error.message : 'Unknown error',\n timestamp: Date.now(),\n },\n iframeOrigin\n );\n }\n }\n }\n\n /**\n * Send secure message to iframe\n */\n private async sendMessage(type: string, data: Record<string, any>): Promise<any> {\n if (!this.iframe || !this.iframe.contentWindow) {\n throw new Error('Iframe not initialized');\n }\n\n const messageId = this.generateMessageId();\n const nonce = this.generateNonce();\n const timestamp = Date.now();\n\n const message: SecureMessage = {\n type,\n messageId,\n timestamp,\n nonce,\n projectId: this.projectId,\n data: {\n ...data,\n sessionToken: this.sessionToken,\n },\n };\n\n // Compute HMAC if session token is available\n if (this.sessionToken) {\n message.hmac = await this.computeHMAC(message);\n }\n\n // Create promise for response\n const responsePromise = new Promise<any>((resolve, reject) => {\n this.pendingRequests.set(messageId, {\n resolve,\n reject,\n timestamp,\n });\n\n // Set timeout\n setTimeout(() => {\n if (this.pendingRequests.has(messageId)) {\n this.pendingRequests.delete(messageId);\n reject(new Error(`Request timeout: ${type}`));\n }\n }, this.REQUEST_TIMEOUT);\n });\n\n // Send message\n const iframeOrigin = new URL(this.iframeUrl).origin;\n this.iframe.contentWindow.postMessage(message, iframeOrigin);\n\n this.log(`[IframeManager] 📤 Sent message: ${type}`, { messageId });\n\n return responsePromise;\n }\n\n /**\n * Compute HMAC for message authentication\n */\n private async computeHMAC(message: SecureMessage): Promise<string> {\n const encoder = new TextEncoder();\n const payload = JSON.stringify({\n type: message.type,\n messageId: message.messageId,\n timestamp: message.timestamp,\n nonce: message.nonce,\n data: JSON.stringify(message.data),\n });\n\n const data = encoder.encode(payload);\n const key = encoder.encode(this.sessionToken!);\n\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n key,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n\n const signature = await crypto.subtle.sign('HMAC', cryptoKey, data);\n\n return Array.from(new Uint8Array(signature))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n\n /**\n * Generate unique message ID\n */\n private generateMessageId(): string {\n return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n }\n\n /**\n * Generate nonce for replay protection\n */\n private generateNonce(): string {\n const randomBytes = new Uint8Array(16);\n crypto.getRandomValues(randomBytes);\n return Array.from(randomBytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n\n // ========================================\n // UI Methods\n // ========================================\n\n /**\n * Show iframe (for consent/confirmation UI)\n */\n showIframe(): void {\n if (this.iframe) {\n this.iframe.style.display = 'block';\n }\n }\n\n /**\n * Hide iframe\n */\n hideIframe(): void {\n if (this.iframe) {\n this.iframe.style.display = 'none';\n }\n }\n\n // ========================================\n // Public API Methods\n // ========================================\n\n /**\n * Authenticate user with application\n */\n async authenticate(userId: string): Promise<{ userId: string; address: Address | undefined }> {\n const response = await this.sendMessage('AUTHENTICATE', {\n userId,\n projectId: this.projectId,\n });\n\n if (response.type === 'LUMIA_PASSPORT_AUTH_SUCCESS') {\n return {\n userId: response.userId,\n address: response.address,\n };\n }\n\n throw new Error('Authentication failed');\n }\n\n /**\n * Start DKG (Distributed Key Generation)\n */\n async startDKG(userId: string, accessToken?: string): Promise<Address> {\n const response = await this.sendMessage('START_DKG', {\n userId,\n projectId: this.projectId,\n accessToken, // Pass access token for TSS API authentication\n });\n\n if (response.type === 'LUMIA_PASSPORT_DKG_SUCCESS') {\n return response.ownerAddress;\n }\n\n throw new Error('DKG failed');\n }\n\n /**\n * Sign transaction\n */\n async signTransaction(userId: string, transaction: Transaction, accessToken?: string): Promise<Hex> {\n const response = await this.sendMessage('SIGN_TRANSACTION', {\n userId,\n projectId: this.projectId,\n transaction,\n accessToken, // Pass access token for TSS API authentication\n });\n\n if (response.type === 'LUMIA_PASSPORT_SIGNATURE') {\n return response.signature;\n }\n\n throw new Error('Transaction signing failed');\n }\n\n /**\n * Get user's wallet address\n */\n async getAddress(userId: string): Promise<Address | undefined> {\n const response = await this.sendMessage('GET_ADDRESS', {\n userId,\n });\n\n if (response.type === 'LUMIA_PASSPORT_ADDRESS') {\n return response.address;\n }\n\n return undefined;\n }\n\n /**\n * Check if user has a keyshare\n */\n async checkKeyshare(userId: string): Promise<{ hasKeyshare: boolean; address?: Address }> {\n const response = await this.sendMessage('CHECK_KEYSHARE', {\n userId,\n });\n\n if (response.type === 'LUMIA_PASSPORT_KEYSHARE_STATUS') {\n return {\n hasKeyshare: response.hasKeyshare,\n address: response.address,\n };\n }\n\n return { hasKeyshare: false };\n }\n\n /**\n * Get trusted apps for user\n */\n async getTrustedApps(userId: string): Promise<Array<{\n userId: string;\n projectId: string;\n origin: string;\n trustedAt: number;\n }>> {\n const response = await this.sendMessage('GET_TRUSTED_APPS', {\n userId,\n });\n\n if (response.type === 'LUMIA_PASSPORT_TRUSTED_APPS_LIST') {\n return response.apps || [];\n }\n\n return [];\n }\n\n /**\n * Remove app from trusted list\n */\n async removeTrustedApp(userId: string, projectId: string, origin: string): Promise<boolean> {\n const response = await this.sendMessage('REMOVE_TRUSTED_APP', {\n userId,\n projectId,\n appOrigin: origin,\n });\n\n if (response.type === 'LUMIA_PASSPORT_TRUSTED_APP_REMOVED') {\n return response.success;\n }\n\n return false;\n }\n\n /**\n * Create backup of keyshare\n */\n async createBackup(\n userId: string,\n backupRequest: { method: 'server' | 'cloud' | 'local'; password?: string; cloudProvider?: string },\n accessToken?: string\n ): Promise<{ success: boolean; method: string; timestamp: number; error?: string }> {\n const response = await this.sendMessage('CREATE_BACKUP', {\n userId,\n backupRequest,\n accessToken, // Pass access token for TSS API authentication\n });\n\n if (response.type === 'LUMIA_PASSPORT_BACKUP_CREATED') {\n return response.result;\n }\n\n throw new Error('Unexpected response type');\n }\n\n /**\n * Restore keyshare from server backup\n */\n async restoreFromServer(\n userId: string,\n password?: string,\n accessToken?: string\n ): Promise<{ success: boolean; timestamp: number; error?: string; data?: any }> {\n const response = await this.sendMessage('RESTORE_BACKUP', {\n userId,\n password,\n accessToken, // Pass access token for TSS API authentication\n });\n\n if (response.type === 'LUMIA_PASSPORT_BACKUP_RESTORED') {\n return response.result;\n }\n\n throw new Error('Unexpected response type');\n }\n\n /**\n * Encrypt backup data without uploading (for cloud/local backups)\n * Returns encrypted data that parent can upload/download\n */\n async encryptBackupData(\n userId: string,\n password?: string\n ): Promise<any> {\n const response = await this.sendMessage('ENCRYPT_BACKUP_DATA', {\n userId,\n password,\n });\n\n if (response.type === 'LUMIA_PASSPORT_BACKUP_ENCRYPTED') {\n return response.encryptedData;\n }\n\n throw new Error('Unexpected response type');\n }\n\n /**\n * Restore keyshare from local file backup\n */\n async restoreFromLocalFile(\n userId: string,\n fileContent: string,\n password?: string\n ): Promise<{ success: boolean; timestamp: number; error?: string; data?: any }> {\n const response = await this.sendMessage('RESTORE_FROM_FILE', {\n userId,\n fileContent,\n password,\n });\n\n if (response.type === 'LUMIA_PASSPORT_FILE_RESTORED') {\n return response.result;\n }\n\n throw new Error('Unexpected response type');\n }\n\n /**\n * Get backup status for user\n */\n async getBackupStatus(userId: string): Promise<{\n server: { lastBackup?: number; error?: string };\n cloud: { lastBackup?: number; error?: string };\n local: { lastBackup?: number; error?: string };\n }> {\n const response = await this.sendMessage('GET_BACKUP_STATUS', {\n userId,\n });\n\n if (response.type === 'LUMIA_PASSPORT_BACKUP_STATUS') {\n return response.status;\n }\n\n throw new Error('Unexpected response type');\n }\n\n /**\n * Get available cloud providers\n */\n async getCloudProviders(): Promise<Array<{ id: string; name: string; available: boolean }>> {\n const response = await this.sendMessage('GET_CLOUD_PROVIDERS', {});\n\n if (response.type === 'LUMIA_PASSPORT_CLOUD_PROVIDERS') {\n return response.providers;\n }\n\n throw new Error('Unexpected response type');\n }\n\n /**\n * Cleanup and destroy iframe\n */\n destroy(): void {\n this.log('[IframeManager] Destroying iframe...');\n\n // Clear pending requests\n this.pendingRequests.forEach((pending) => {\n pending.reject(new Error('Iframe manager destroyed'));\n });\n this.pendingRequests.clear();\n\n // Remove message listener\n if (this.messageListener) {\n window.removeEventListener('message', this.messageListener);\n this.messageListener = null;\n }\n\n // Remove iframe\n if (this.iframe && this.iframe.parentNode) {\n this.iframe.parentNode.removeChild(this.iframe);\n }\n\n this.iframe = null;\n this.isReady = false;\n this.sessionToken = null;\n\n this.log('[IframeManager] ✅ Destroyed');\n }\n\n /**\n * Debug logging\n */\n private log(message: string, data?: any): void {\n if (this.debug) {\n if (data) {\n console.log(message, data);\n } else {\n console.log(message);\n }\n }\n }\n}\n\n// ========================================\n// Singleton Instance\n// ========================================\n\nlet iframeManagerInstance: IframeManager | null = null;\n\n/**\n * Get or create iframe manager singleton\n */\nexport function getIframeManager(config?: IframeManagerConfig): IframeManager {\n if (!iframeManagerInstance && config) {\n iframeManagerInstance = new IframeManager(config);\n }\n\n if (!iframeManagerInstance) {\n throw new Error(\n 'IframeManager not initialized. This usually means projectId is not configured.\\n\\n' +\n 'To fix this:\\n' +\n '1. Get your projectId from https://dashboard.lumiapassport.com/\\n' +\n '2. Add it to LumiaPassportProvider:\\n' +\n ' <LumiaPassportProvider projectId=\"your-project-id\">\\n\\n' +\n 'For more details, see the documentation.'\n );\n }\n\n return iframeManagerInstance;\n}\n\n/**\n * Wait for iframe to be ready\n * Returns a promise that resolves when iframe is initialized and authenticated\n */\nexport async function waitForIframe(): Promise<void> {\n const manager = getIframeManager();\n await manager.initialize();\n}\n\n/**\n * Destroy iframe manager singleton\n */\nexport function destroyIframeManager(): void {\n if (iframeManagerInstance) {\n iframeManagerInstance.destroy();\n iframeManagerInstance = null;\n }\n}\n","import React, { createContext, useCallback, useContext, useEffect, useState } from 'react';\n\nimport {\n defaultLumiaPassportConfig,\n type LumiaPassportConfig,\n getServiceUrls,\n getIframeUrl,\n} from '../config/lumiaPassport';\nimport { LumiaWagmiProvider } from './WagmiContext';\nimport { getIframeManager, destroyIframeManager } from '../internal/lib/iframe-manager';\nimport { initSdkErrorTracking } from '@lumiapassport/core/internal/error-tracking';\n\nexport interface WalletReadyStatus {\n ready: boolean;\n userId?: string;\n address?: `0x${string}`;\n hasKeyshare: boolean;\n hasSession: boolean;\n timestamp: number;\n}\n\nexport interface LumiaPassportCallbacks {\n onLumiaPassportConnecting?: (payload: { method: 'passkey' | 'email' | 'social' | 'wallet'; provider?: string }) => void;\n onLumiaPassportConnect?: (payload: { address: `0x${string}`; session: any }) => void;\n onLumiaPassportAccount?: (payload: { userId?: string | null; address?: `0x${string}` | null; session?: any; hasKeyshare?: boolean }) => void;\n onLumiaPassportUpdate?: (payload: { providers?: Array<any> }) => void;\n onLumiaPassportDisconnect?: (payload: { address?: `0x${string}` | null; userId?: string | null }) => void;\n onLumiaPassportError?: (payload: { error: Error; code?: string; message: string }) => void;\n onWalletReady?: (status: WalletReadyStatus) => void;\n}\n\ninterface LumiaPassportContextType {\n config: LumiaPassportConfig;\n updateConfig: (updates: Partial<LumiaPassportConfig>) => void;\n callbacks?: LumiaPassportCallbacks;\n}\n\nconst LumiaPassportContext = createContext<LumiaPassportContextType | undefined>(undefined);\n\nexport interface LumiaPassportProviderProps {\n children: React.ReactNode;\n projectId?: string;\n initialConfig?: Partial<LumiaPassportConfig>;\n callbacks?: LumiaPassportCallbacks;\n}\n\nexport const LumiaPassportProvider: React.FC<LumiaPassportProviderProps> = ({\n children,\n projectId,\n initialConfig = {},\n callbacks,\n}) => {\n const [config, setConfig] = useState<LumiaPassportConfig>(() => {\n const merged = { ...defaultLumiaPassportConfig };\n\n // Set projectId if provided\n if (projectId) {\n merged.projectId = projectId;\n } else if (initialConfig.projectId) {\n merged.projectId = initialConfig.projectId;\n }\n\n // Log warning if projectId is not set\n if (!merged.projectId) {\n console.error(\n '\\n' +\n '╔══════════════════════════════════════════════════════════════════════════╗\\n' +\n '║ ⚠️ LUMIA PASSPORT WARNING ⚠️ ║\\n' +\n '╠══════════════════════════════════════════════════════════════════════════╣\\n' +\n '║ ║\\n' +\n '║ projectId is NOT configured! ║\\n' +\n '║ ║\\n' +\n '║ Your integration will NOT work without a valid projectId. ║\\n' +\n '║ Most features will be disabled and errors will occur. ║\\n' +\n '║ ║\\n' +\n '║ To fix this: ║\\n' +\n '║ 1. Get your projectId from: https://dashboard.lumiapassport.com/ ║\\n' +\n '║ 2. Add it to your LumiaPassportProvider: ║\\n' +\n '║ ║\\n' +\n '║ <LumiaPassportProvider projectId=\"your-project-id\"> ║\\n' +\n '║ {children} ║\\n' +\n '║ </LumiaPassportProvider> ║\\n' +\n '║ ║\\n' +\n '╚══════════════════════════════════════════════════════════════════════════╝\\n'\n );\n } else {\n console.log('[LumiaPassport] ✅ Initialized with projectId:', merged.projectId);\n }\n\n if (initialConfig.passkey) merged.passkey = { ...merged.passkey, ...initialConfig.passkey };\n if (initialConfig.email) merged.email = { ...merged.email, ...initialConfig.email };\n if (initialConfig.social) {\n merged.social = { ...merged.social, ...initialConfig.social };\n if (initialConfig.social.providers) merged.social.providers = initialConfig.social.providers;\n }\n if (initialConfig.development)\n merged.development = { ...merged.development, ...initialConfig.development };\n if (initialConfig.ui) {\n merged.ui = { ...merged.ui, ...initialConfig.ui };\n if (initialConfig.ui.branding)\n merged.ui.branding = { ...merged.ui.branding, ...initialConfig.ui.branding };\n if (initialConfig.ui.modal) merged.ui.modal = { ...merged.ui.modal, ...initialConfig.ui.modal };\n }\n if (initialConfig.network) merged.network = { ...merged.network, ...initialConfig.network };\n if (initialConfig.services) merged.services = { ...merged.services, ...initialConfig.services };\n if (initialConfig.features) merged.features = { ...merged.features, ...initialConfig.features };\n if (initialConfig.warnings) merged.warnings = { ...merged.warnings, ...initialConfig.warnings };\n\n // Load saved theme from localStorage if available\n try {\n if (typeof window !== 'undefined' && window.localStorage) {\n const savedTheme = localStorage.getItem('lumia-passport-theme');\n if (savedTheme && (savedTheme === 'light' || savedTheme === 'dark' || savedTheme === 'auto')) {\n merged.ui.theme = savedTheme as 'light' | 'dark' | 'auto';\n }\n }\n } catch {}\n\n // Make services override available immediately for non-React modules\n // Set the merged services config in window.__LUMIA_SERVICES__ before calling getServiceUrls()\n try {\n if (typeof window !== 'undefined') {\n // First set the merged services from initialConfig\n window.__LUMIA_SERVICES__ = merged.services;\n // Store projectId globally for HttpClient\n (window as any).__LUMIA_PROJECT_ID__ = merged.projectId;\n console.log('[LumiaPassportProvider] Setting window.__LUMIA_SERVICES__:', merged.services);\n // Now getServiceUrls() will use the correct config\n const resolvedServices = getServiceUrls();\n console.log('[LumiaPassportProvider] Resolved services:', resolvedServices);\n }\n } catch {}\n\n // Initialize SDK error tracking (automatic, no user configuration needed)\n try {\n initSdkErrorTracking();\n } catch (error) {\n // Silently fail - don't break app if error tracking fails\n if (process.env.NODE_ENV === 'development') {\n console.warn('[LumiaPassport] Failed to initialize SDK error tracking:', error);\n }\n }\n\n return merged;\n });\n\n const updateConfig = useCallback((updates: Partial<LumiaPassportConfig>) => {\n setConfig(prev => {\n const next = { ...prev };\n if (updates.projectId !== undefined) next.projectId = updates.projectId;\n if (updates.passkey) next.passkey = { ...next.passkey, ...updates.passkey };\n if (updates.email) next.email = { ...next.email, ...updates.email };\n if (updates.social) {\n next.social = { ...next.social, ...updates.social };\n if (updates.social.providers) next.social.providers = updates.social.providers;\n }\n if (updates.development) next.development = { ...next.development, ...updates.development };\n if (updates.ui) {\n next.ui = { ...next.ui, ...updates.ui };\n if (updates.ui.branding) next.ui.branding = { ...next.ui.branding, ...updates.ui.branding };\n if (updates.ui.modal) next.ui.modal = { ...next.ui.modal, ...updates.ui.modal };\n\n // Save theme to localStorage when it changes\n if (updates.ui.theme) {\n try {\n if (typeof window !== 'undefined' && window.localStorage) {\n localStorage.setItem('lumia-passport-theme', updates.ui.theme);\n }\n } catch {}\n }\n }\n if (updates.network) next.network = { ...next.network, ...updates.network };\n if (updates.services) next.services = { ...next.services, ...updates.services };\n if (updates.features) next.features = { ...next.features, ...updates.features };\n if (updates.warnings) next.warnings = { ...next.warnings, ...updates.warnings };\n\n // Update global services when services config changes\n if (updates.services && typeof window !== 'undefined') {\n try {\n window.__LUMIA_SERVICES__ = next.services;\n console.log('[LumiaPassportProvider] Updated window.__LUMIA_SERVICES__:', next.services);\n } catch {}\n }\n\n // Update global projectId when it changes\n if (updates.projectId !== undefined && typeof window !== 'undefined') {\n try {\n (window as any).__LUMIA_PROJECT_ID__ = next.projectId;\n console.log('[LumiaPassportProvider] Updated __LUMIA_PROJECT_ID__:', next.projectId);\n } catch {}\n }\n\n return next;\n });\n }, []);\n\n // Initialize iframe manager for secure MPC operations\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const projectId = config.projectId;\n if (!projectId) {\n // Silent skip - main warning is shown during provider initialization\n return;\n }\n\n const iframeUrl = getIframeUrl();\n\n console.log('[LumiaPassport] Initializing secure iframe wallet:', {\n iframeUrl,\n projectId: `${projectId.substring(0, 10)}...`,\n note: 'All MPC operations will happen in isolated iframe context',\n });\n\n try {\n // Determine current theme\n const isDark = config.ui.theme === 'dark' ||\n (config.ui.theme === 'auto' && window.matchMedia?.('(prefers-color-scheme: dark)').matches);\n\n // Get theme colors\n const themeColors = isDark ? config.ui.colors?.dark : config.ui.colors?.light;\n\n const iframeManager = getIframeManager({\n iframeUrl,\n projectId,\n debug: config.features?.mpcSecurity ?? true,\n onWalletReady: callbacks?.onWalletReady,\n themeColors,\n });\n\n // Initialize iframe asynchronously\n iframeManager.initialize().then(() => {\n console.log('[LumiaPassport] ✅ Secure iframe wallet initialized successfully');\n }).catch((error) => {\n console.error('[LumiaPassport] ❌ Failed to initialize iframe wallet:', error);\n });\n\n // Cleanup on unmount\n return () => {\n console.log('[LumiaPassport] Cleaning up iframe manager...');\n destroyIframeManager();\n };\n } catch (error) {\n console.error('[LumiaPassport] Error setting up iframe manager:', error);\n }\n }, [config.projectId, config.features?.mpcSecurity]);\n\n return (\n <LumiaWagmiProvider>\n <LumiaPassportContext.Provider value={{ config, updateConfig, callbacks }}>\n {children}\n </LumiaPassportContext.Provider>\n </LumiaWagmiProvider>\n );\n};\n\nexport const useLumiaPassportConfig = () => {\n const ctx = useContext(LumiaPassportContext);\n if (!ctx) throw new Error('useLumiaPassportConfig must be used within a LumiaPassportProvider');\n return ctx;\n};\n","import { useMemo, useState, useEffect } from 'react';\n\nexport type Theme = 'light' | 'dark' | 'auto';\n\nexport interface ThemeColors {\n background?: string;\n text?: string;\n textSecondary?: string;\n textMuted?: string;\n border?: string;\n buttonBackground?: string;\n buttonBackgroundEnd?: string;\n buttonText?: string;\n buttonBackgroundHover?: string;\n buttonBackgroundHoverEnd?: string;\n connectedButtonBackground?: string;\n connectedButtonBorder?: string;\n}\n\nexport interface CustomColors {\n light?: ThemeColors;\n dark?: ThemeColors;\n}\n\nexport function useTheme(configTheme: Theme, customColors?: CustomColors) {\n const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>('light');\n\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const updateSystemTheme = () => setSystemTheme(mediaQuery.matches ? 'dark' : 'light');\n updateSystemTheme();\n mediaQuery.addEventListener('change', updateSystemTheme);\n return () => mediaQuery.removeEventListener('change', updateSystemTheme);\n }, []);\n\n const resolvedTheme = useMemo(() => (configTheme === 'auto' ? systemTheme : configTheme), [configTheme, systemTheme]);\n const isDark = resolvedTheme === 'dark';\n\n // Do not mutate document.body classes to avoid leaking theme into host app\n // Theme is applied via scoped classes on Lumia components only\n\n // Get custom colors for current theme\n const currentCustomColors = useMemo(() => {\n return isDark ? customColors?.dark : customColors?.light;\n }, [isDark, customColors]);\n\n // Apply custom colors as CSS variables if provided\n useEffect(() => {\n if (typeof document === 'undefined') return;\n\n const root = document.documentElement;\n\n if (currentCustomColors?.background) {\n root.style.setProperty('--lumia-bg', currentCustomColors.background);\n } else {\n root.style.removeProperty('--lumia-bg');\n }\n\n if (currentCustomColors?.text) {\n root.style.setProperty('--lumia-text', currentCustomColors.text);\n } else {\n root.style.removeProperty('--lumia-text');\n }\n\n if (currentCustomColors?.textSecondary) {\n root.style.setProperty('--lumia-text-secondary', currentCustomColors.textSecondary);\n } else {\n root.style.removeProperty('--lumia-text-secondary');\n }\n\n if (currentCustomColors?.textMuted) {\n root.style.setProperty('--lumia-text-muted', currentCustomColors.textMuted);\n } else {\n root.style.removeProperty('--lumia-text-muted');\n }\n\n if (currentCustomColors?.border) {\n root.style.setProperty('--lumia-border', currentCustomColors.border);\n } else {\n root.style.removeProperty('--lumia-border');\n }\n\n if (currentCustomColors?.buttonBackground) {\n root.style.setProperty('--lumia-button-bg', currentCustomColors.buttonBackground);\n } else {\n root.style.removeProperty('--lumia-button-bg');\n }\n\n if (currentCustomColors?.buttonBackgroundEnd) {\n root.style.setProperty('--lumia-button-bg-end', currentCustomColors.buttonBackgroundEnd);\n } else {\n root.style.removeProperty('--lumia-button-bg-end');\n }\n\n if (currentCustomColors?.buttonText) {\n root.style.setProperty('--lumia-button-text', currentCustomColors.buttonText);\n } else {\n root.style.removeProperty('--lumia-button-text');\n }\n\n if (currentCustomColors?.buttonBackgroundHover) {\n root.style.setProperty('--lumia-button-bg-hover', currentCustomColors.buttonBackgroundHover);\n } else {\n root.style.removeProperty('--lumia-button-bg-hover');\n }\n\n if (currentCustomColors?.buttonBackgroundHoverEnd) {\n root.style.setProperty('--lumia-button-bg-hover-end', currentCustomColors.buttonBackgroundHoverEnd);\n } else {\n root.style.removeProperty('--lumia-button-bg-hover-end');\n }\n\n if (currentCustomColors?.connectedButtonBackground) {\n root.style.setProperty('--lumia-connected-button-bg', currentCustomColors.connectedButtonBackground);\n } else {\n root.style.removeProperty('--lumia-connected-button-bg');\n }\n\n if (currentCustomColors?.connectedButtonBorder) {\n root.style.setProperty('--lumia-connected-button-border', currentCustomColors.connectedButtonBorder);\n } else {\n root.style.removeProperty('--lumia-connected-button-border');\n }\n }, [currentCustomColors]);\n\n const themeClasses = useMemo(\n () => {\n // Check if custom colors are provided\n const hasCustom = !!currentCustomColors;\n\n // Use CSS variables when custom colors are set, otherwise use Tailwind classes\n const background = hasCustom && currentCustomColors?.background\n ? '[background:var(--lumia-bg)]'\n : (isDark ? 'bg-gray-900' : 'bg-white');\n\n const text = hasCustom && currentCustomColors?.text\n ? '[color:var(--lumia-text)]'\n : (isDark ? 'text-white' : 'text-gray-900');\n\n const textSecondary = hasCustom && currentCustomColors?.textSecondary\n ? '[color:var(--lumia-text-secondary)]'\n : (isDark ? 'text-gray-300' : 'text-gray-600');\n\n const textMuted = hasCustom && currentCustomColors?.textMuted\n ? '[color:var(--lumia-text-muted)]'\n : (isDark ? 'text-gray-400' : 'text-gray-500');\n\n const border = hasCustom && currentCustomColors?.border\n ? '[border-color:var(--lumia-border)]'\n : (isDark ? 'border-gray-600' : 'border-gray-200');\n\n return {\n bg: background, // Alias for modalBg for backwards compatibility\n modalBg: background,\n titleText: text,\n text: text, // Alias for titleText\n bodyText: textSecondary,\n mutedText: textMuted,\n linkText: isDark ? 'text-gray-200 hover:text-blue-400' : 'text-gray-700 hover:text-blue-600',\n inputBg: isDark ? 'bg-gray-700 border-gray-600' : 'bg-white border-gray-300',\n inputText: isDark ? 'text-white placeholder:text-gray-400' : 'text-gray-900 placeholder:text-gray-400',\n // Primary CTA (Passkey sign-in) — brighter blue + hover\n primaryBtn: isDark\n ? 'bg-[#2456f0] hover:bg-[#1e49d8] text-white'\n : 'bg-[#2456f0] hover:bg-[#1e49d8] text-white',\n // Neutral secondary to avoid unintended pink accents\n secondaryBtn: isDark\n ? 'bg-gray-700 hover:bg-gray-600 text-white'\n : 'bg-gray-100 hover:bg-gray-200 text-gray-700',\n // Pink CTA used for email Continue like in old design\n ctaBtn: isDark\n ? 'bg-[#db2777] hover:bg-[#be185d] text-white'\n : 'bg-[#fde2f3] hover:bg-[#f7c1df] text-gray-600',\n // Outline buttons (Create Passkey) — subtle hover\n outlineBtn: isDark\n ? 'bg-gray-700 border-gray-600 hover:bg-gray-600 text-gray-200'\n : 'bg-white border-gray-200 hover:bg-gray-100 text-gray-700',\n actionBtn: isDark ? 'bg-gray-700 hover:bg-gray-600 text-gray-200' : 'bg-gray-100 hover:bg-gray-200 text-gray-900',\n divider: border,\n errorText: isDark ? 'text-red-400' : 'text-red-500',\n successText: isDark ? 'text-green-400' : 'text-blue-600',\n iconColor: textMuted,\n // CSS variable-based classes for better theming\n cssVars: {\n modalBg: 'lumia-bg-primary',\n text: 'lumia-text-primary',\n textSecondary: 'lumia-text-secondary',\n textMuted: 'lumia-text-muted',\n bgSecondary: 'lumia-bg-secondary',\n border: 'lumia-border-primary',\n }\n };\n },\n [isDark, currentCustomColors]\n );\n\n return { theme: resolvedTheme, isDark, classes: themeClasses };\n}\n","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n","import * as React from 'react';\n\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { X, ArrowLeft } from 'lucide-react';\n\nimport { cn } from '../../lib/utils';\n\nconst Dialog = DialogPrimitive.Root;\nconst DialogTrigger = DialogPrimitive.Trigger;\nconst DialogPortal = DialogPrimitive.Portal;\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n // Softer backdrop to match design and avoid host overrides\n 'fixed inset-0 z-[2147483646] bg-black/50 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\ntype DialogContentProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & { hideClose?: boolean };\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n DialogContentProps\n>(({ className, children, hideClose, ...props }, ref) => (\n <DialogPortal>\n {/* Scope utilities for BOTH overlay and content by wrapping them */}\n <div className=\"lumia-scope\">\n <DialogOverlay />\n <div className=\"fixed inset-0 z-[2147483647] flex items-center justify-center pointer-events-none\">\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n // Remove default rounded corners; consumers can fully control radius\n 'relative pointer-events-auto grid w-full max-w-lg gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n className\n )}\n {...props}\n >\n {/* Default hidden description to satisfy a11y if consumer omits it */}\n <DialogPrimitive.Description className=\"sr-only\">\n Lumia Passport dialog\n </DialogPrimitive.Description>\n {children}\n {!hideClose && (\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm bg-transparent text-gray-400 dark:text-gray-500 transition-all hover:text-gray-600 dark:hover:text-gray-300 focus:outline-none focus:ring-2 focus:ring-gray-300 dark:focus:ring-gray-600 focus:ring-offset-2 disabled:pointer-events-none\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </div>\n </div>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogTopBar: React.FC<{ onBack?: () => void; className?: string; showClose?: boolean }> = ({ onBack, className, showClose = false }) => (\n <div className={cn('flex items-center justify-between px-4 pt-4', className)}>\n <button\n onClick={onBack}\n disabled={!onBack}\n aria-label=\"Back\"\n className={`rounded-md p-1 ${onBack ? 'text-gray-400 hover:text-gray-600' : 'opacity-0 pointer-events-none'}`}\n >\n <ArrowLeft className=\"w-4 h-4\" />\n </button>\n {showClose && (\n <DialogPrimitive.Close aria-label=\"Close\" className=\"rounded-md p-1 text-gray-500 hover:text-gray-700 focus:outline-none\">\n <X className=\"w-4 h-4\" />\n </DialogPrimitive.Close>\n )}\n </div>\n);\n\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col space-y-1.5 text-center sm:text-left', className)} {...props} />\n);\nDialogHeader.displayName = 'DialogHeader';\n\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className)}\n {...props}\n />\n);\nDialogFooter.displayName = 'DialogFooter';\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title ref={ref} className={cn('text-lg font-semibold leading-none tracking-tight', className)} {...props} />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogTopBar,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n","import * as React from 'react';\n\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '../../lib/utils';\n\nconst buttonVariants = cva(\n 'lumia-btn inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-xl text-sm font-medium font-sans ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n {\n variants: {\n variant: {\n plain: '',\n default: 'bg-blue-600 text-white hover:bg-blue-700',\n destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\n outline: 'border border-gray-200 bg-white hover:bg-gray-100 text-gray-700',\n secondary: 'bg-gray-600 text-white hover:bg-gray-500 dark:bg-gray-700 dark:hover:bg-gray-600',\n ghost: 'hover:bg-gray-100 hover:text-gray-800',\n link: 'bg-transparent !bg-transparent text-blue-600 hover:text-blue-700 underline-offset-4 hover:underline',\n telegram: 'bg-[#0088cc] text-white hover:bg-[#0077bb]',\n success: 'bg-green-600 text-white hover:bg-green-700 dark:bg-green-700 dark:hover:bg-green-600',\n },\n size: {\n default: 'h-10 px-4 py-2',\n sm: 'h-9 rounded-xl px-3',\n lg: 'h-11 rounded-xl px-8',\n icon: 'h-10 w-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n return (\n <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />\n );\n }\n);\nButton.displayName = 'Button';\n\nexport { Button, buttonVariants };\n","import * as React from 'react';\nimport * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';\nimport { buttonVariants } from '../ui/button';\nimport { cn } from '../../lib/utils';\n\nconst AlertDialog = AlertDialogPrimitive.Root;\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger;\nconst AlertDialogPortal = AlertDialogPrimitive.Portal;\n\nconst AlertDialogOverlay = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Overlay\n className={cn(\n 'fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className\n )}\n {...props}\n ref={ref}\n />\n));\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;\n\nconst AlertDialogContent = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg',\n className\n )}\n {...props}\n />\n </AlertDialogPortal>\n));\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;\n\nconst AlertDialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col space-y-2 text-center sm:text-left', className)} {...props} />\n);\nAlertDialogHeader.displayName = 'AlertDialogHeader';\n\nconst AlertDialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className)} {...props} />\n);\nAlertDialogFooter.displayName = 'AlertDialogFooter';\n\nconst AlertDialogTitle = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Title ref={ref} className={cn('text-lg font-semibold', className)} {...props} />\n));\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;\n\nconst AlertDialogDescription = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Description ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n));\nAlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName;\n\nconst AlertDialogAction = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Action>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Action ref={ref} className={cn(buttonVariants(), className)} {...props} />\n));\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;\n\nconst AlertDialogCancel = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Cancel>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Cancel ref={ref} className={cn(buttonVariants({ variant: 'outline' }), 'mt-2 sm:mt-0', className)} {...props} />\n));\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;\n\nexport {\n AlertDialog,\n AlertDialogPortal,\n AlertDialogOverlay,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n};\n","import React from 'react';\nimport { AlertTriangle } from 'lucide-react';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from './ui/alert-dialog';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\n\ninterface ErrorAlertProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: string;\n message: string;\n actionText?: string;\n}\n\nexport const ErrorAlert: React.FC<ErrorAlertProps> = ({\n open,\n onOpenChange,\n title,\n message,\n actionText = 'OK',\n}) => {\n const { config } = useLumiaPassportConfig();\n const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n return (\n <AlertDialog open={open} onOpenChange={onOpenChange}>\n <AlertDialogContent className={`lumia-scope max-w-md ${theme.modalBg} ${isDark ? 'lumia-dark' : 'lumia-light'}`}>\n <AlertDialogHeader>\n <div className=\"flex items-center gap-3 mb-2\">\n <div className={`w-10 h-10 rounded-full flex items-center justify-center ${isDark ? 'bg-red-900/30' : 'bg-red-100'}`}>\n <AlertTriangle className={`w-5 h-5 ${isDark ? 'text-red-400' : 'text-red-600'}`} />\n </div>\n <AlertDialogTitle className={`text-left ${isDark ? 'text-red-300' : 'text-red-900'}`}>{title}</AlertDialogTitle>\n </div>\n <AlertDialogDescription className={`text-left whitespace-pre-line ${isDark ? 'text-gray-300' : 'text-gray-700'}`}>\n {message}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogAction onClick={() => onOpenChange(false)}>{actionText}</AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n};\n\nexport const useErrorAlert = () => {\n const [alertState, setAlertState] = React.useState<{\n open: boolean;\n title: string;\n message: string;\n actionText?: string;\n }>({ open: false, title: '', message: '' });\n\n const showError = React.useCallback((title: string, message: string, actionText?: string) => {\n setAlertState({ open: true, title, message, actionText });\n }, []);\n\n const hideError = React.useCallback(() => {\n setAlertState(prev => ({ ...prev, open: false }));\n }, []);\n\n const ErrorAlertComponent = React.useCallback(\n () => (\n <ErrorAlert\n open={alertState.open}\n onOpenChange={hideError}\n title={alertState.title}\n message={alertState.message}\n actionText={alertState.actionText}\n />\n ),\n [alertState, hideError]\n );\n\n return { showError, hideError, ErrorAlert: ErrorAlertComponent };\n};\n","import React from 'react';\n\ninterface LumiaLogoProps {\n size?: number;\n className?: string;\n}\n\nexport const LumiaLogo = ({ size = 25, className = '' }: LumiaLogoProps) => {\n return (\n <div\n className={`flex items-center justify-center ${className}`}\n style={{ width: size, height: size }}\n aria-label=\"Lumia Logo\"\n >\n <svg viewBox=\"0 0 512 512\" width={size} height={size}>\n <circle cx=\"256\" cy=\"256\" r=\"256\" fill=\"#060117\" strokeWidth=\"0\"/>\n <path d=\"M264.13948,48.01032l63.62778,132.2788,133.95322,68.65102h-147.34854s-48.55804-10.04649-50.23246-56.93012,0-143.99971,0-143.99971Z\" fill=\"#fefdff\" strokeWidth=\"0\"/>\n <path d=\"M50.27932,245.59045l132.27894-63.62734L251.20943,48.01032l-.00012,147.34824s-10.04654,48.55792-56.93019,50.23222c-46.88366,1.6743-143.9998-.00033-143.9998-.00033Z\" fill=\"#fefdff\" strokeWidth=\"0\"/>\n <path d=\"M247.86056,463.98968l-63.62772-132.27875-133.95315-68.65092,147.34848-.00011s48.55802,10.04646,50.23242,56.93008c1.6744,46.88362-.00004,143.9997-.00004,143.9997Z\" fill=\"#fefdff\" strokeWidth=\"0\"/>\n <path d=\"M461.72068,266.40941l-132.2789,63.62744-68.65118,133.95283.00016-147.34823s10.04655-48.55792,56.93018-50.23226c46.88364-1.67434,143.99974.00023,143.99974.00023Z\" fill=\"#fefdff\" strokeWidth=\"0\"/>\n </svg>\n </div>\n );\n};\n","import React from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\n\ninterface FailedScreenProps {\n message?: string;\n}\n\nexport const FailedScreen: React.FC<FailedScreenProps> = ({ message = 'Failed' }) => {\n const { config } = useLumiaPassportConfig();\n const { classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n\n return (\n <div className=\"text-center\">\n <div className=\"w-16 h-16 rounded-full bg-red-100 text-red-600 flex items-center justify-center mx-auto mb-4 text-3xl\">\n ✗\n </div>\n <div className={`text-lg font-medium ${theme.titleText} mb-2`}>Failed</div>\n {message && (\n <div className={`text-sm ${theme.bodyText}`}>{message}</div>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { Dialog, DialogContent, DialogTitle } from './ui/dialog';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\n\nexport const TermsOfService: React.FC<{ open: boolean; onOpenChange: (v: boolean) => void }>\n = ({ open, onOpenChange }) => {\n const { config } = useLumiaPassportConfig();\n const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className={`lumia-scope p-6 border-0 ${theme.modalBg} ${isDark ? 'lumia-dark' : 'lumia-light'}`}\n style={{\n borderRadius: config.ui.modal?.borderRadius || '24px',\n maxWidth: config.ui.modal?.width || '400px',\n ['--lumia-font-base' as any]: config.ui.fonts?.base,\n ['--lumia-font-heading' as any]: config.ui.fonts?.heading,\n fontFamily: (config.ui.fonts?.base as any) || 'system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif',\n }}\n >\n <DialogTitle>Terms of Service</DialogTitle>\n <div className=\"prose text-sm text-gray-700\">\n <p>By using Lumia Passport you agree to our terms.</p>\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n","import * as React from 'react';\n\nimport { cn } from '../../lib/utils';\n\nconst Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('rounded-xl border bg-card text-card-foreground shadow', className)} {...props} />\n )\n);\nCard.displayName = 'Card';\n\nconst CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('flex flex-col space-y-1.5 p-6', className)} {...props} />\n )\n);\nCardHeader.displayName = 'CardHeader';\n\nconst CardTitle = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLHeadingElement>>(\n ({ className, ...props }, ref) => (\n <h3 ref={ref} className={cn('text-2xl font-semibold leading-none tracking-tight', className)} {...props} />\n )\n);\nCardTitle.displayName = 'CardTitle';\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(\n ({ className, ...props }, ref) => (\n <p ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n )\n);\nCardDescription.displayName = 'CardDescription';\n\nconst CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('p-6 pt-0', className)} {...props} />\n )\n);\nCardContent.displayName = 'CardContent';\n\nexport { Card, CardHeader, CardTitle, CardDescription, CardContent };\n","import * as React from 'react';\n\nimport { cn } from '../../lib/utils';\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n 'flex h-12 w-full rounded-xl border px-3 py-2 text-sm file:border-0 file:bg-transparent file:text-sm file:font-medium focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n ref={ref}\n {...props}\n />\n );\n});\nInput.displayName = 'Input';\n\nexport { Input };\n","import * as React from 'react';\nimport { Shield, Server, Upload, CheckCircle2, AlertCircle, Key, X, Eye, EyeOff } from 'lucide-react';\nimport { Button } from './ui/button';\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from './ui/card';\nimport { Input } from './ui/input';\nimport { getShareRecoveryStats } from '../vaultClient';\nimport { getIframeManager } from '../lib/iframe-manager';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\n\ninterface KeyshareRestoreProps {\n userId: string;\n onClose?: () => void;\n onRestoreSuccess?: () => void;\n}\n\nexport default function KeyshareRestore({ userId, onClose, onRestoreSuccess }: KeyshareRestoreProps) {\n const { config } = useLumiaPassportConfig();\n const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n const [loading, setLoading] = React.useState<Record<'server' | 'file', boolean>>({ server: false, file: false });\n const [error, setError] = React.useState<string | null>(null);\n const [success, setSuccess] = React.useState<string | null>(null);\n const [showPassword, setShowPassword] = React.useState(false);\n const [useCustomPassword, setUseCustomPassword] = React.useState(false);\n const [restoreFile, setRestoreFile] = React.useState<File | null>(null);\n const [restorePassword, setRestorePassword] = React.useState('');\n const [hasServerBackup, setHasServerBackup] = React.useState<boolean | null>(null);\n const [checkingBackup, setCheckingBackup] = React.useState(true);\n\n // Get iframe manager\n const iframeManager = React.useMemo(() => {\n try {\n return getIframeManager();\n } catch (e) {\n console.error('[KeyshareRestore] Failed to get iframe manager:', e);\n return null;\n }\n }, []);\n\n // Check if backup exists on mount\n React.useEffect(() => {\n const checkBackupAvailability = async () => {\n try {\n setCheckingBackup(true);\n const stats = await getShareRecoveryStats();\n\n // Check if we have any recovery data\n const hasRecoveryData = stats && (stats.created || (stats.devices && stats.devices.length > 0));\n setHasServerBackup(!!hasRecoveryData);\n\n if (!hasRecoveryData) {\n setError('No backup found in the Vault');\n }\n } catch (err) {\n console.warn('[KeyshareRestore] Failed to check backup availability:', err);\n setHasServerBackup(false);\n setError('Failed to check backup availability');\n } finally {\n setCheckingBackup(false);\n }\n };\n\n checkBackupAvailability();\n }, [userId]);\n\n const handleRestoreFromServer = async () => {\n console.log('[KeyshareRestore] Starting server restore for userId:', userId);\n\n if (!iframeManager) {\n setError('Iframe manager not initialized');\n return;\n }\n\n setLoading(prev => ({ ...prev, server: true }));\n setError(null);\n setSuccess(null);\n\n try {\n const passwordToUse = useCustomPassword ? restorePassword : undefined;\n console.log('[KeyshareRestore] Calling iframeManager.restoreFromServer with method:', useCustomPassword ? 'password' : 'passkey');\n\n // Get JWT access token for authentication\n const jwt = await import('../auth').then(m => m.jwtTokenManager.getTokens());\n const accessToken = jwt?.accessToken;\n\n const result = await iframeManager.restoreFromServer(userId, passwordToUse, accessToken);\n\n if (result.success) {\n console.log('[KeyshareRestore] Server restore successful');\n setSuccess('Successfully restored keyshare from server backup');\n setTimeout(() => { onRestoreSuccess?.(); }, 100);\n } else {\n console.error('[KeyshareRestore] Server restore failed:', result.error);\n setError(result.error || 'Server restore failed');\n }\n } catch (err) {\n console.error('[KeyshareRestore] Server restore exception:', err);\n const errorMsg = err instanceof Error ? err.message : 'Server restore failed';\n setError(errorMsg);\n } finally {\n console.log('[KeyshareRestore] Server restore finished');\n setLoading(prev => ({ ...prev, server: false }));\n }\n };\n\n const handleRestoreFromFile = async () => {\n if (!restoreFile) { setError('Please select a backup file'); return; }\n if (useCustomPassword && !restorePassword) { setError('Please enter the backup password'); return; }\n\n if (!iframeManager) {\n setError('Iframe manager not initialized');\n return;\n }\n\n setLoading(prev => ({ ...prev, file: true }));\n setError(null);\n setSuccess(null);\n\n try {\n // Read file content\n const fileContent = await restoreFile.text();\n const passwordToUse = useCustomPassword ? restorePassword : undefined;\n\n const result = await iframeManager.restoreFromLocalFile(userId, fileContent, passwordToUse);\n\n if (result.success) {\n setSuccess('Successfully restored keyshare from backup file');\n setRestoreFile(null);\n setRestorePassword('');\n setTimeout(() => { onRestoreSuccess?.(); }, 100);\n } else {\n setError(result.error || 'File restore failed');\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'Restore failed';\n setError(errorMsg);\n } finally {\n setLoading(prev => ({ ...prev, file: false }));\n }\n };\n\n // Show loading state while checking backup\n if (checkingBackup) {\n return (\n <Card className={`${isDark ? 'border-gray-700 bg-gray-900' : 'border-blue-200 bg-blue-50'} border-0`}>\n <CardHeader className=\"pb-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Shield className={`h-6 w-6 ${isDark ? 'text-blue-400' : 'text-blue-600'}`} />\n <div>\n <CardTitle className={`text-lg ${isDark ? 'text-gray-100' : ''}`}>Checking Backup Availability</CardTitle>\n <CardDescription className={`text-sm ${isDark ? 'text-gray-400' : ''}`}>Please wait while we check for available backups...</CardDescription>\n </div>\n </div>\n {onClose && (\n <button onClick={onClose} className={`p-1 rounded transition-colors ${isDark ? 'bg-transparent text-gray-400 hover:text-gray-200' : 'bg-red-100 text-red-600 hover:bg-red-200'}`} title=\"Close\" aria-label=\"Close\">\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n <div className=\"flex items-center justify-center p-8\">\n <div className=\"text-center\">\n <div className={`animate-spin rounded-full h-8 w-8 border-b-2 ${isDark ? 'border-blue-400' : 'border-blue-600'} mx-auto mb-4`}></div>\n <p className={`text-sm ${isDark ? 'text-gray-400' : 'text-gray-600'}`}>Checking for backups...</p>\n </div>\n </div>\n </CardContent>\n </Card>\n );\n }\n\n // Show warning if no backup found\n if (hasServerBackup === false) {\n return (\n <Card className={`border-0 ${theme.bg} ${theme.divider}`}>\n <CardHeader className=\"pb-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <AlertCircle className=\"h-5 w-5 text-red-600\" />\n <CardTitle className={`text-base ${theme.titleText}`}>No Keyshare Found</CardTitle>\n </div>\n {onClose && (\n <button onClick={onClose} className={`p-1 rounded transition-colors ${theme.secondaryBtn}`} title=\"Close\" aria-label=\"Close\">\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n {/* <CardDescription className={`text-sm mt-1 ${theme.bodyText}`}>No keyshare was found for this account.</CardDescription> */}\n </CardHeader>\n <CardContent className=\"space-y-3.5\">\n <div className={`p-3 rounded ${isDark ? 'bg-red-500/15' : 'bg-red-100'}`}>\n <h4 className={`font-medium text-sm mb-1.5 ${isDark ? 'text-red-300' : 'text-red-800'}`}>Account Recovery Needed</h4>\n <p className={`text-xs leading-relaxed ${theme.text}`}>\n This device doesn't have access to your wallet keyshare, and no backup was found in the Vault.\n To access your wallet: use the original device where you created the account,\n create a backup from that device first, then try restoring on this device.\n </p>\n </div>\n\n <div className={`p-2.5 rounded border ${isDark ? 'bg-amber-500/15 border-amber-500/40' : 'bg-amber-50 border-amber-200'}`}>\n <p className={`text-xs ${theme.text}`}>\n <span className=\"font-semibold\">Alternative:</span> Try uploading a backup file if you have one saved locally, or create a new account with a different email.\n </p>\n </div>\n\n {/* Still allow file restore as fallback */}\n <div className={`p-3 rounded border ${theme.bg} ${theme.divider}`}>\n <div className=\"flex items-center gap-2 mb-2\">\n <Upload className=\"h-4 w-4 text-purple-600\" />\n <div className={`font-medium text-sm ${theme.text}`}>Try Backup File</div>\n </div>\n <div className=\"space-y-2\">\n <label className={`block w-full cursor-pointer ${theme.text}`}>\n <input\n type=\"file\"\n accept=\".json\"\n onChange={e => setRestoreFile(e.target.files?.[0] || null)}\n className=\"block w-full text-xs file:mr-3 file:py-1.5 file:px-3 file:rounded file:border-0 file:text-xs file:font-medium file:bg-purple-600 file:text-white hover:file:bg-purple-700 file:cursor-pointer\"\n />\n </label>\n {!restoreFile && (\n <p className={`text-xs ${theme.mutedText}`}>No file chosen</p>\n )}\n {restoreFile && (\n <>\n <div className={`text-xs p-2 rounded ${theme.inputBg} ${theme.text}`}>Selected: {restoreFile.name}</div>\n <Button onClick={handleRestoreFromFile} disabled={loading.file || (useCustomPassword && !restorePassword)} className=\"w-full py-2 text-sm\">\n {loading.file ? 'Restoring...' : useCustomPassword ? 'Restore' : 'Restore with Passkey'}\n </Button>\n </>\n )}\n </div>\n </div>\n\n {/* Decryption method for file restore */}\n {restoreFile && (\n <div className=\"space-y-2\">\n <div className={`text-xs font-medium ${theme.text}`}>Decryption Method:</div>\n <div className=\"flex items-center gap-2\">\n <input type=\"checkbox\" id=\"use-restore-password\" checked={useCustomPassword} onChange={e => setUseCustomPassword(e.target.checked)} className=\"rounded\" />\n <label htmlFor=\"use-restore-password\" className={`text-xs ${theme.text}`}>Use custom password instead of passkey</label>\n </div>\n {!useCustomPassword && (\n <div className={`p-2 border rounded text-xs ${theme.inputBg} ${theme.text}`}>\n <div className=\"flex items-center gap-2\"><Key className=\"h-3.5 w-3.5\" /><span>Your passkey will be used to decrypt the backup securely</span></div>\n </div>\n )}\n {useCustomPassword && (\n <div className=\"relative\">\n <Input\n type={showPassword ? 'text' : 'password'}\n placeholder=\"Enter backup decryption password\"\n value={restorePassword}\n onChange={e => setRestorePassword(e.target.value)}\n className={`pr-10 text-sm bg-transparent ${isDark ? 'text-gray-100 placeholder:text-gray-400 border-gray-600 focus-visible:ring-offset-0' : 'text-gray-900 placeholder:text-gray-500 border-gray-300'}`}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className={`absolute inset-y-0 right-2 flex items-center justify-center p-0 rounded ${isDark ? 'bg-transparent text-gray-400 hover:text-gray-200' : 'bg-transparent text-gray-500 hover:text-gray-700'}`}\n >\n {showPassword ? <EyeOff className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\n </button>\n </div>\n )}\n </div>\n )}\n\n {error && (\n <div className={`flex items-center gap-2 p-2 rounded border text-xs ${theme.errorText} ${isDark ? 'bg-red-500/15 border-red-500/40' : 'bg-red-50 border-red-200'}`}>\n <AlertCircle className=\"h-3.5 w-3.5 flex-shrink-0\" />\n <span>{error}</span>\n </div>\n )}\n {success && (\n <div className={`flex items-center gap-2 p-2 rounded border text-xs ${theme.successText} ${isDark ? 'bg-green-500/15 border-green-500/40' : 'bg-green-50 border-green-200'}`}>\n <CheckCircle2 className=\"h-3.5 w-3.5 flex-shrink-0\" />\n <span>{success}</span>\n </div>\n )}\n </CardContent>\n </Card>\n );\n }\n\n return (\n <Card className={`${isDark ? 'border-gray-700 bg-gray-900' : 'border-blue-200 bg-blue-50'} border-0`}>\n <CardHeader className=\"pb-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Shield className=\"h-5 w-5 text-blue-600\" />\n <CardTitle className={`text-base ${isDark ? 'text-gray-100' : 'text-gray-900'}`}>Restore Account Access</CardTitle>\n </div>\n {onClose && (\n <button\n onClick={onClose}\n className={`p-1 rounded transition-colors ${isDark ? 'bg-transparent text-gray-400 hover:text-gray-200' : 'bg-red-100 text-red-600 hover:bg-red-200'}`}\n title=\"Close\"\n aria-label=\"Close\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n <CardDescription className={`text-sm mt-1 ${isDark ? 'text-gray-300' : 'text-gray-600'}`}>\n Your account was found in the Vault\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3.5\">\n {error && !error.includes('No backup found') && (\n <div className=\"flex items-center gap-2 p-2 rounded bg-red-50 border border-red-200 text-red-700 text-xs\">\n <AlertCircle className=\"h-3.5 w-3.5 flex-shrink-0\" />\n <span>{error}</span>\n </div>\n )}\n {success && (\n <div className=\"flex items-center gap-2 p-2 rounded bg-green-50 border border-green-200 text-green-700 text-xs\">\n <CheckCircle2 className=\"h-3.5 w-3.5 flex-shrink-0\" />\n <span>{success}</span>\n </div>\n )}\n\n {/* Decryption Method */}\n <div className=\"space-y-2\">\n <div className={`text-xs font-medium ${isDark ? 'text-gray-300' : 'text-gray-700'}`}>Decryption Method:</div>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n id=\"use-restore-password\"\n checked={useCustomPassword}\n onChange={e => setUseCustomPassword(e.target.checked)}\n className=\"rounded\"\n />\n <label htmlFor=\"use-restore-password\" className={`text-xs ${isDark ? 'text-gray-300' : 'text-gray-700'}`}>\n Use custom password instead of passkey\n </label>\n </div>\n\n {!useCustomPassword && (\n <div className={isDark ? 'p-2 rounded bg-blue-500/10 border border-blue-500/30' : 'p-2 rounded bg-blue-50 border border-blue-200'}>\n <div className=\"flex items-center gap-2\">\n <Key className=\"h-3.5 w-3.5 text-blue-500\" />\n <p className={`text-xs ${isDark ? 'text-gray-300' : 'text-blue-700'}`}>\n Passkey will be used to decrypt the backup\n </p>\n </div>\n </div>\n )}\n\n {useCustomPassword && (\n <div className=\"relative\">\n <Input\n type={showPassword ? 'text' : 'password'}\n placeholder=\"Enter backup password\"\n value={restorePassword}\n onChange={e => setRestorePassword(e.target.value)}\n className={`pr-10 text-sm bg-transparent ${isDark ? 'text-gray-100 placeholder:text-gray-400 border-gray-600 focus-visible:ring-offset-0' : 'text-gray-900 placeholder:text-gray-500 border-gray-300'}`}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className={`absolute inset-y-0 right-2 flex items-center justify-center p-0 rounded ${isDark ? 'bg-transparent text-gray-400 hover:text-gray-200' : 'bg-transparent text-gray-500 hover:text-gray-700'}`}\n aria-label=\"Toggle password visibility\"\n >\n {showPassword ? <EyeOff className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\n </button>\n </div>\n )}\n </div>\n\n {/* Restore Methods */}\n <div className=\"space-y-2.5\">\n <div className={`text-xs font-medium ${isDark ? 'text-gray-300' : 'text-gray-700'}`}>Choose Restore Method:</div>\n\n {/* Server Backup */}\n <div className={isDark ? 'p-3 rounded bg-gray-800/50' : 'p-3 rounded bg-blue-50/50'}>\n <div className=\"flex items-center gap-2 mb-2\">\n <Server className=\"h-4 w-4 text-blue-500\" />\n <div className={`text-sm font-medium ${isDark ? 'text-gray-200' : 'text-gray-900'}`}>Server Backup</div>\n </div>\n <Button\n onClick={handleRestoreFromServer}\n disabled={loading.server || (useCustomPassword && !restorePassword)}\n className=\"w-full py-2 text-sm\"\n >\n {loading.server ? 'Restoring...' : useCustomPassword ? 'Restore with Password' : 'Restore with Passkey'}\n </Button>\n </div>\n\n {/* Backup File */}\n <div className={isDark ? 'p-3 rounded bg-gray-800/50' : 'p-3 rounded bg-purple-50/50'}>\n <div className=\"flex items-center gap-2 mb-2\">\n <Upload className=\"h-4 w-4 text-purple-500\" />\n <div className={`text-sm font-medium ${isDark ? 'text-gray-200' : 'text-gray-900'}`}>Backup File</div>\n </div>\n <div className=\"space-y-2\">\n <label className={`block w-full cursor-pointer ${isDark ? 'text-gray-300' : 'text-gray-700'}`}>\n <input\n type=\"file\"\n accept=\".json\"\n onChange={e => setRestoreFile(e.target.files?.[0] || null)}\n className={isDark\n ? \"block w-full text-xs file:mr-3 file:py-1.5 file:px-3 file:rounded file:border-0 file:text-xs file:font-medium file:bg-purple-600 file:text-white hover:file:bg-purple-700 file:cursor-pointer\"\n : \"block w-full text-xs file:mr-3 file:py-1.5 file:px-3 file:rounded file:border-0 file:text-xs file:font-medium file:bg-purple-600 file:text-white hover:file:bg-purple-700 file:cursor-pointer\"\n }\n />\n </label>\n {restoreFile && (\n <>\n <div className={`text-xs p-2 rounded ${isDark ? 'bg-gray-700 text-gray-300' : 'bg-gray-100 text-gray-600'}`}>\n {restoreFile.name}\n </div>\n <Button\n onClick={handleRestoreFromFile}\n disabled={loading.file || (useCustomPassword && !restorePassword)}\n className=\"w-full py-2 text-sm\"\n >\n {loading.file ? 'Restoring...' : 'Restore'}\n </Button>\n </>\n )}\n </div>\n </div>\n </div>\n\n {/* Help Text */}\n {!useCustomPassword && false && (\n <div className={isDark ? 'p-2 rounded bg-amber-500/10 border border-amber-500/30' : 'p-2 rounded bg-amber-50 border border-amber-200'}>\n <p className={`text-xs ${isDark ? 'text-gray-300' : 'text-amber-800'}`}>\n <span className=\"font-medium\">Note:</span> If you have multiple passkeys, the system will request the specific one used to create this backup.\n </p>\n </div>\n )}\n </CardContent>\n </Card>\n );\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\n\nexport const VerificationCodeInput: React.FC<{\n onVerifyCode: (code: string) => Promise<void> | void;\n onResendCode: () => Promise<void> | void;\n isLoading: boolean;\n expiresIn: number;\n error?: string;\n}> = ({ onVerifyCode, onResendCode, isLoading, expiresIn, error }) => {\n const { config } = useLumiaPassportConfig();\n const { classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n\n const [timeLeft, setTimeLeft] = useState(expiresIn);\n useEffect(() => { setTimeLeft(expiresIn); }, [expiresIn]);\n useEffect(() => {\n const t = setInterval(() => setTimeLeft(v => (v > 0 ? v - 1 : 0)), 1000);\n return () => clearInterval(t);\n }, []);\n\n const [digits, setDigits] = useState<string[]>(['', '', '', '', '', '']);\n const inputsRef = useRef<Array<HTMLInputElement | null>>([]);\n const lastSubmittedRef = useRef<string | null>(null);\n\n const code = useMemo(() => digits.join(''), [digits]);\n useEffect(() => {\n if (code.length === 6 && digits.every(d => d !== '') && !isLoading) {\n if (lastSubmittedRef.current !== code) {\n lastSubmittedRef.current = code;\n onVerifyCode(code);\n }\n }\n }, [code, digits, isLoading, onVerifyCode]);\n\n // Autofocus the first input on mount\n useEffect(() => {\n const t = setTimeout(() => {\n inputsRef.current[0]?.focus();\n }, 0);\n return () => clearTimeout(t);\n }, []);\n\n const handleChange = (index: number, value: string) => {\n const v = value.replace(/\\D/g, '').slice(-1);\n setDigits(prev => {\n const next = [...prev];\n next[index] = v;\n return next;\n });\n if (!v) {\n // If user cleared a digit, allow re-submission later for same code\n lastSubmittedRef.current = null;\n }\n if (v && inputsRef.current[index + 1]) inputsRef.current[index + 1]?.focus();\n };\n\n const handleKeyDown = (index: number, e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace') {\n if (digits[index]) {\n setDigits(prev => { const n = [...prev]; n[index] = ''; return n; });\n } else if (inputsRef.current[index - 1]) {\n inputsRef.current[index - 1]?.focus();\n setDigits(prev => { const n = [...prev]; n[index - 1] = ''; return n; });\n }\n }\n if (e.key === 'ArrowLeft' && inputsRef.current[index - 1]) inputsRef.current[index - 1]?.focus();\n if (e.key === 'ArrowRight' && inputsRef.current[index + 1]) inputsRef.current[index + 1]?.focus();\n };\n\n const handlePaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n const text = (e.clipboardData.getData('text') || '').replace(/\\D/g, '').slice(0, 6);\n if (text.length) {\n e.preventDefault();\n const arr = new Array(6).fill('').map((_, i) => text[i] || '');\n setDigits(arr);\n lastSubmittedRef.current = null;\n const lastIndex = Math.min(text.length, 6) - 1;\n if (inputsRef.current[lastIndex]) inputsRef.current[lastIndex]?.focus();\n }\n };\n\n const mm = Math.floor(timeLeft / 60).toString();\n const ss = (timeLeft % 60).toString().padStart(2, '0');\n\n return (\n <div className=\"text-center\">\n <div className={`flex items-center justify-center gap-2 mb-4`}>\n {digits.map((d, i) => (\n <input\n key={i}\n ref={el => (inputsRef.current[i] = el)}\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n maxLength={1}\n value={d}\n onChange={e => handleChange(i, e.target.value)}\n onKeyDown={e => handleKeyDown(i, e)}\n onPaste={handlePaste}\n className={`w-12 h-12 text-lg text-center font-semibold rounded-xl border ${theme.inputBg} ${theme.inputText} focus:outline-none focus:ring-2 focus:ring-blue-500`}\n />\n ))}\n </div>\n\n {error && <div className={`text-sm ${theme.errorText} mb-3 break-words whitespace-pre-wrap text-center`}>{error}</div>}\n <div className={`text-sm ${theme.mutedText} mb-3`}>Code expires in {mm}:{ss}</div>\n\n <div className={`text-sm ${theme.mutedText}`}>\n Didn't receive code?{' '}\n <button\n onClick={() => (timeLeft === 0 ? onResendCode() : undefined)}\n disabled={timeLeft > 0 || isLoading}\n className={`${timeLeft > 0 ? 'opacity-40 cursor-not-allowed' : `${theme.linkText} underline`} font-medium`}\n >\n Resend\n </button>\n </div>\n </div>\n );\n};\n","import { tssClient } from './httpClient';\n\n/**\n * Provider information in user profile\n * Matches the structure returned by backend /api/auth/profile\n */\nexport interface ProviderDetail {\n id: string; // Composite ID: \"provider:externalId\"\n provider: string; // Provider type: 'email', 'telegram', 'passkey', etc.\n verified: boolean; // Whether the provider is verified\n linkedAt: string; // ISO timestamp when provider was linked\n lastUsedAt: string; // ISO timestamp of last authentication\n externalId: string; // Provider-specific ID (email address, telegram ID, credential ID, etc.)\n meta?: Record<string, any>; // Provider-specific metadata (email, rpId, etc.)\n}\n\n/**\n * User profile information\n */\nexport interface UserProfile {\n userId: string;\n displayName?: string;\n avatar?: string;\n providers: ProviderDetail[];\n createdAt: string;\n updatedAt: string;\n hasKeyshare: boolean;\n}\n\nexport interface UpdateProfileRequest {\n displayName?: string;\n}\n\n/**\n * Get user profile with detailed provider information\n *\n * Backend /api/auth/profile now returns complete provider details including:\n * - Provider type and identifier\n * - Verification status\n * - Linked and last used timestamps\n * - Provider-specific metadata\n */\nexport async function getUserProfile(): Promise<UserProfile> {\n const response = await tssClient.get<UserProfile>('/api/auth/profile', true);\n\n if (!response.success || !response.data) {\n const error = response.error || 'Failed to fetch user profile';\n throw new Error(error);\n }\n\n return response.data;\n}\n\n/**\n * Update user profile\n */\nexport async function updateUserProfile(updates: UpdateProfileRequest): Promise<UserProfile> {\n const response = await tssClient.patch<UserProfile>('/api/auth/profile', updates, true);\n\n if (!response.success || !response.data) {\n const error = response.error || 'Failed to update user profile';\n throw new Error(error);\n }\n\n return response.data;\n}\n","import React, { useState } from 'react';\nimport { User } from 'lucide-react';\nimport { Button } from './ui/button';\nimport { Input } from './ui/input';\nimport { LumiaLogo } from './LumiaLogo';\nimport { useTheme } from '../hooks/useTheme';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { updateUserProfile } from '../clients/profile';\nimport { jwtTokenManager } from '../auth';\n\ninterface DisplayNameInputProps {\n onComplete: () => void;\n onSkip?: () => void;\n}\n\nexport const DisplayNameInput: React.FC<DisplayNameInputProps> = ({ onComplete, onSkip }) => {\n const [displayName, setDisplayName] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState('');\n\n const { config } = useLumiaPassportConfig();\n const { classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!displayName.trim()) {\n setError('Please enter your name');\n return;\n }\n\n if (displayName.length > 100) {\n setError('Name is too long (max 100 characters)');\n return;\n }\n\n setIsLoading(true);\n setError('');\n\n try {\n await updateUserProfile({ displayName: displayName.trim() });\n\n // Update JWT token with new display name\n jwtTokenManager.updateDisplayName(displayName.trim());\n\n onComplete();\n } catch (err: any) {\n console.error('[DisplayNameInput] Failed to update display name:', err);\n setError(err.message || 'Failed to update your name. Please try again.');\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleSkip = () => {\n if (onSkip) {\n onSkip();\n } else {\n onComplete();\n }\n };\n\n return (\n <div>\n <div className=\"flex justify-center mb-4\">\n <div className=\"w-10 h-10 bg-gradient-to-br from-purple-100 to-blue-100 rounded-full flex items-center justify-center\">\n <LumiaLogo size={28} />\n </div>\n </div>\n\n <h2 className={`text-2xl font-bold font-sans ${theme.titleText} mb-2`}>\n What's your name?\n </h2>\n\n <p className={`text-sm ${theme.bodyText} mb-6`}>\n This helps personalize your experience\n </p>\n\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div className=\"relative\">\n <User className={`absolute left-3 top-3 h-5 w-5 ${theme.iconColor}`} />\n <Input\n type=\"text\"\n placeholder=\"Enter your name\"\n value={displayName}\n onChange={(e) => {\n setDisplayName(e.target.value);\n setError('');\n }}\n className={`pl-11 h-12 ${theme.inputBg} ${theme.inputText} rounded-xl border`}\n disabled={isLoading}\n maxLength={100}\n autoFocus\n />\n </div>\n\n {error && (\n <div className={`text-sm ${theme.errorText} text-center`}>\n {error}\n </div>\n )}\n\n <Button\n type=\"submit\"\n variant=\"plain\"\n disabled={!displayName.trim() || isLoading}\n className={`w-full h-14 ${theme.ctaBtn} rounded-2xl font-semibold`}\n >\n {isLoading ? 'Saving...' : 'Continue'}\n </Button>\n\n {onSkip && (\n <div className=\"text-center mt-4\">\n <button\n type=\"button\"\n onClick={handleSkip}\n disabled={isLoading}\n className={`text-sm ${theme.mutedText} hover:${theme.linkText} transition-colors disabled:opacity-50 underline hover:no-underline bg-transparent border-0 p-0 cursor-pointer`}\n >\n Skip for now\n </button>\n </div>\n )}\n </form>\n </div>\n );\n};\n","import React, { useState } from 'react';\n\nimport { Mail, Users, Fingerprint, KeyRound, ArrowLeft } from 'lucide-react';\n\n// Temporary storage for login response before consent approval\n// This will be moved to localStorage only after user approves consent\nlet _pendingLoginResponse: any = null;\nexport function getPendingLoginResponse() { return _pendingLoginResponse; }\nexport function clearPendingLoginResponse() { _pendingLoginResponse = null; }\n\nimport {\n registerPasskey,\n authenticateWithPasskey,\n createPasskeyHelpers,\n resetWebAuthnFlags,\n hasAvailablePasskeys,\n jwtTokenManager,\n type TelegramAuthResult,\n initTelegramWidget,\n hideTelegramWidget,\n loginWithTelegram,\n} from '../auth';\nimport { useErrorAlert } from './ErrorAlert';\nimport { LumiaLogo } from './LumiaLogo';\nimport { FailedScreen } from './FailedScreen';\nimport { TermsOfService } from './TermsOfService';\nimport { Button } from './ui/button';\nimport KeyshareRestore from './KeyshareRestore';\nimport { Dialog, DialogContent, DialogTitle, DialogTopBar } from './ui/dialog';\nimport { Input } from './ui/input';\nimport { VerificationCodeInput } from './VerificationCodeInput';\nimport { DisplayNameInput } from './DisplayNameInput';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\nimport { GoogleIcon, TelegramIcon, TwitterIcon, DiscordIcon } from '../../config/lumiaPassport';\nimport { getServiceUrls } from '../../config/lumiaPassport';\nimport { addProjectIdToUrl } from '../utils/projectId';\nimport { getUserProfile } from '../clients/profile';\n\ninterface AuthModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onAuthSuccess?: () => void;\n autoCloseOnSuccess?: boolean;\n recoveryUserId?: string | null;\n onRecoveryClose?: () => void;\n onRecoverySuccess?: () => void;\n callbacks?: import('../../context/LumiaPassportContext').LumiaPassportCallbacks;\n}\n\nexport const AuthModal = ({ open, onOpenChange, onAuthSuccess, autoCloseOnSuccess = true, recoveryUserId, onRecoveryClose, onRecoverySuccess, callbacks }: AuthModalProps) => {\n\n const [email, setEmail] = useState('');\n const [step, setStep] = useState<'signin' | 'verify' | 'telegram' | 'display-name' | 'failed'>('signin');\n const { showError, ErrorAlert } = useErrorAlert();\n const [isLoading, setIsLoading] = useState(false);\n const [iframeVisible, setIframeVisible] = useState(false);\n const [failedMessage, setFailedMessage] = useState<string>('');\n const [expiresIn, setExpiresIn] = useState(300);\n const [verificationError, setVerificationError] = useState<string>('');\n const [sendError, setSendError] = useState<string>('');\n\n // Passkey state\n const [passkeyStatus, setPasskeyStatus] = useState<string>('idle');\n const [passkeyError, setPasskeyError] = useState<string>('');\n\n // Telegram state\n const [telegramCleanup, setTelegramCleanup] = useState<(() => void) | null>(null);\n const [showTelegramWidget, setShowTelegramWidget] = useState<boolean>(false);\n\n // Terms of Service state\n const [showTerms, setShowTerms] = useState<boolean>(false);\n\n // Passkey helpers\n const passkeyHelpers = React.useMemo(() => {\n return createPasskeyHelpers('');\n }, []);\n\n // Get LumiaPassport configuration from context\n const { config } = useLumiaPassportConfig();\n\n // Get theme classes based on configuration\n const { classes: theme, isDark } = useTheme(config.ui.theme, config.ui.colors);\n\n // Reset state when modal is closed\n React.useEffect(() => {\n if (!open) {\n setStep('signin');\n setEmail('');\n setVerificationError('');\n setSendError('');\n setPasskeyError('');\n setPasskeyStatus('idle');\n setFailedMessage('');\n }\n }, [open]);\n\n // Listen for iframe show/hide events to hide AuthModal when consent screen is shown\n React.useEffect(() => {\n const handleIframeMessage = (event: MessageEvent) => {\n if (event.data?.type === 'LUMIA_PASSPORT_SHOW_IFRAME') {\n setIframeVisible(true);\n } else if (event.data?.type === 'LUMIA_PASSPORT_HIDE_IFRAME') {\n setIframeVisible(false);\n }\n };\n\n window.addEventListener('message', handleIframeMessage);\n return () => window.removeEventListener('message', handleIframeMessage);\n }, []);\n\n // Helper function to check if display name is needed\n // Takes optional loginResponse to avoid making API call before tokens are saved\n const checkDisplayNameRequired = React.useCallback(async (loginResponse?: any): Promise<boolean> => {\n // Check if feature is enabled\n if (!config.features.displayNameNeeded) {\n return false;\n }\n\n // If we have loginResponse, check displayName from it (no API call needed)\n if (loginResponse) {\n if (loginResponse.displayName && loginResponse.displayName.trim()) {\n return false;\n }\n return true;\n }\n\n // Otherwise, fetch profile (only when tokens are already saved)\n try {\n const profile = await getUserProfile();\n\n // If displayName is already set, no need to ask again\n if (profile.displayName && profile.displayName.trim()) {\n return false;\n }\n\n return true;\n } catch (error: any) {\n // If it's a 404 (profile doesn't exist yet) or 401/403 (auth issue),\n // still show the display name form for new users\n if (error?.message?.includes('404') || error?.message?.includes('401') || error?.message?.includes('403')) {\n return true;\n }\n\n // For other errors, don't block the user\n return false;\n }\n }, [config.features.displayNameNeeded]);\n\n // Helpers: soften WebAuthn cancellation/timeout errors\n function normalizeWebAuthnError(err: any): { benignCancel: boolean; message: string } {\n const raw = (err?.message || String(err || '')) as string;\n const lower = raw.toLowerCase();\n // Typical cancellation/timeouts:\n // - DOMException: NotAllowedError\n // - \"The operation either timed out or was not allowed\"\n // - user gesture / abort\n const isBenign =\n (err && (err.name === 'NotAllowedError' || err.name === 'AbortError')) ||\n lower.includes('notallowederror') ||\n lower.includes('timed out') ||\n lower.includes('was not allowed') ||\n lower.includes('user cancelled') ||\n lower.includes('operation cancelled') ||\n lower.includes('aborterror');\n\n if (isBenign) return { benignCancel: true, message: '' };\n\n // Friendly mapping for a few known cases\n if (lower.includes('unknown or unsupported algorithm')) {\n return { benignCancel: false, message: 'This device cannot create a passkey with the requested algorithm.' };\n }\n return { benignCancel: false, message: raw };\n }\n\n const sendVerificationCode = async () => {\n if (!email) return;\n\n setIsLoading(true);\n setSendError('');\n\n try {\n const response = await fetch(addProjectIdToUrl(`${getServiceUrls().tssUrl}/api/auth/email/send-code`), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n email,\n purpose: 'login',\n }),\n });\n\n const data = await response.json();\n\n if (response.ok) {\n setExpiresIn(data.expiresIn || 300);\n setStep('verify');\n } else {\n // Handle different error types\n if (response.status === 429) {\n const retryAfter = data.retryAfter || 60;\n setSendError(\n `Code already sent recently. Please wait ${retryAfter} seconds before requesting another.`\n );\n } else if (response.status === 400) {\n setSendError(data.message || 'Invalid email address');\n } else {\n setSendError(data.message || 'Failed to send verification code');\n }\n }\n } catch (error) {\n const errorMessage = 'Network error. Please check your connection.';\n setSendError(errorMessage);\n\n // Trigger onLumiaPassportError callback\n try {\n callbacks?.onLumiaPassportError?.({\n error: error instanceof Error ? error : new Error(errorMessage),\n message: errorMessage\n });\n } catch {}\n } finally {\n setIsLoading(false);\n }\n };\n\n const verifyCode = async (code: string) => {\n if (isLoading) return;\n setIsLoading(true);\n setVerificationError('');\n\n try {\n // Use the official loginWithEmail function but skip token saving until consent approval\n const { loginWithEmail } = await import('../auth');\n\n const loginResponse = await loginWithEmail(email, code, { skipTokenSave: true });\n\n // Store login response temporarily - tokens will be saved in ConnectWalletButton after consent approval\n _pendingLoginResponse = loginResponse;\n\n // Check for critical server keyshare loss scenario\n if (!loginResponse.hasKeyshare && !loginResponse.isNewUser) {\n // CRITICAL: Existing user with lost server keyshare\n showError(\n 'CRITICAL ERROR',\n 'Your account data has been lost on the server.\\nThis should never happen and indicates a serious system failure.\\n\\nUnfortunately, your wallet cannot be recovered.\\nYou will need to create a new account.\\n\\nPlease contact support immediately with this error.'\n );\n\n // Reset to signin to prevent further actions\n setStep('signin');\n _pendingLoginResponse = null;\n return;\n }\n\n // Check if user needs recovery (has server keyshare but no local keyshare)\n const storage = typeof window !== 'undefined' ? window.localStorage : undefined;\n const localKeyshare = storage?.getItem(`tss.${loginResponse.userId}.keyshare`);\n const needsRecovery = loginResponse.hasKeyshare && !loginResponse.isNewUser && !localKeyshare;\n\n // Check if display name is required BEFORE starting DKG\n // Pass loginResponse to avoid API call before tokens are saved\n const displayNameRequired = await checkDisplayNameRequired(loginResponse);\n if (displayNameRequired) {\n // Temporarily save tokens so DisplayNameInput can call updateUserProfile\n // Tokens will be cleared on Cancel or kept after consent approval\n await jwtTokenManager.setTokens(loginResponse);\n setStep('display-name');\n return;\n }\n\n // Trigger session creation and DKG for new users - WAIT for completion\n try {\n if (onAuthSuccess) {\n console.log('[AuthModal] Calling onAuthSuccess...');\n await onAuthSuccess();\n console.log('[AuthModal] onAuthSuccess completed successfully');\n }\n } catch (authError: any) {\n console.log('[AuthModal] onAuthSuccess failed:', authError?.message);\n // Handle authorization errors (e.g., user clicked Cancel in consent modal)\n if (authError?.message?.includes('User denied authorization')) {\n console.log('[AuthModal] Setting failed state');\n setFailedMessage('Authorization cancelled');\n setStep('failed');\n return;\n }\n // Re-throw other errors to be handled by outer catch\n throw authError;\n }\n\n console.log('[AuthModal] Authentication successful, closing modal');\n\n // Close modal immediately after success (unless recovery is needed)\n if (autoCloseOnSuccess && !needsRecovery) {\n // Reset state first, then close modal\n setStep('signin');\n setEmail('');\n setVerificationError('');\n onOpenChange(false);\n }\n } catch (error: any) {\n\n // Handle specific error messages from loginWithEmail\n let errorMessage = '';\n if (error.message?.includes('Invalid') || error.message?.includes('invalid')) {\n errorMessage = 'Invalid verification code. Please try again.';\n } else if (error.message?.includes('expired')) {\n errorMessage = 'Verification code expired. Please request a new one.';\n } else if (error.message?.includes('429') || error.message?.includes('Too many')) {\n errorMessage = 'Too many attempts. Please try again later.';\n } else {\n errorMessage = error.message || 'Verification failed. Please try again.';\n }\n setVerificationError(errorMessage);\n\n // Trigger onLumiaPassportError callback\n try {\n callbacks?.onLumiaPassportError?.({\n error: error instanceof Error ? error : new Error(errorMessage),\n message: errorMessage\n });\n } catch {}\n } finally {\n setIsLoading(false);\n }\n };\n\n const resendCode = async () => {\n if (isLoading) return;\n setVerificationError('');\n setIsLoading(true);\n\n try {\n const response = await fetch(addProjectIdToUrl(`${getServiceUrls().tssUrl}/api/auth/email/send-code`), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n email,\n purpose: 'login',\n }),\n });\n\n const data = await response.json();\n\n if (response.ok) {\n setExpiresIn(data.expiresIn || 300);\n // The timer will reset automatically in VerificationCodeInput component\n } else {\n if (response.status === 429) {\n const retryAfter = data.retryAfter || 60;\n setVerificationError(\n `Code already sent recently. Please wait ${retryAfter} seconds before requesting another.`\n );\n } else {\n setVerificationError(data.message || 'Failed to resend verification code');\n }\n }\n } catch (error) {\n setVerificationError('Network error. Please check your connection.');\n } finally {\n setIsLoading(false);\n }\n };\n\n const goBackToSignIn = () => {\n setStep('signin');\n setVerificationError('');\n setSendError('');\n // Clean up telegram widget if going back\n if (telegramCleanup) {\n telegramCleanup();\n setTelegramCleanup(null);\n }\n };\n\n // Passkey registration\n const handlePasskeyRegister = React.useCallback(async () => {\n setPasskeyError('');\n setPasskeyStatus('registering passkey...');\n setIsLoading(true);\n\n try {\n // Auto-generate user ID for passkey registration\n const autoUserId = `user_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n const { credential, loginResponse } = await registerPasskey(autoUserId, step => {\n setPasskeyStatus(step);\n }, { skipTokenSave: true });\n\n // Store login response temporarily - tokens will be saved in ConnectWalletButton after consent approval\n _pendingLoginResponse = loginResponse;\n\n // Check if this is a new user who needs DKG setup\n if (loginResponse.isNewUser) {\n // Check if display name is required BEFORE starting DKG\n // Pass loginResponse to avoid API call before tokens are saved\n const displayNameRequired = await checkDisplayNameRequired(loginResponse);\n if (displayNameRequired) {\n // Temporarily save tokens so DisplayNameInput can call updateUserProfile\n // Tokens will be cleared on Cancel or kept after consent approval\n await jwtTokenManager.setTokens(loginResponse);\n setStep('display-name');\n return;\n }\n\n // Call onAuthSuccess to trigger real authentication and DKG\n if (onAuthSuccess) {\n await onAuthSuccess();\n }\n\n // Reset state first, then close modal\n setStep('signin');\n setEmail('');\n setVerificationError('');\n setPasskeyError('');\n setPasskeyStatus('idle');\n onOpenChange(false);\n } else {\n // Existing user - just show success\n setPasskeyStatus('Passkey registered successfully!');\n setTimeout(() => {\n setPasskeyStatus('idle');\n }, 2000);\n }\n } catch (e: any) {\n const normalized = normalizeWebAuthnError(e);\n const errorMessage = normalized.message || '';\n\n // Handle specific credential duplication errors with alerts\n if (errorMessage.includes('CREDENTIAL_EXISTS')) {\n showError(\n 'Passkey Already Registered',\n 'This passkey is already registered to another account. Please use a different passkey or sign in to the existing account.'\n );\n } else if (errorMessage.includes('CREDENTIAL_DUPLICATE')) {\n showError(\n 'Passkey Already Registered',\n 'This passkey is already registered for your account. No need to register again!'\n );\n } else if (!normalized.benignCancel) {\n setPasskeyError(errorMessage);\n }\n\n // Trigger onLumiaPassportError callback for non-benign errors\n if (!normalized.benignCancel) {\n try {\n callbacks?.onLumiaPassportError?.({\n error: e instanceof Error ? e : new Error(errorMessage),\n message: errorMessage\n });\n } catch {}\n }\n\n setPasskeyStatus('idle');\n } finally {\n setIsLoading(false);\n }\n }, [onAuthSuccess, onOpenChange, callbacks]);\n\n // Passkey authentication\n const handlePasskeyAuth = React.useCallback(async () => {\n setPasskeyError('');\n setPasskeyStatus('checking available passkeys...');\n setIsLoading(true);\n\n try {\n // Clear any existing JWT session when switching to passkey authentication\n jwtTokenManager.clearTokens();\n\n // Try to authenticate with existing passkey\n setPasskeyStatus('authenticating with passkey...');\n\n // Use passkey without specifying user ID, skip token saving until consent approval\n const result = await authenticateWithPasskey(undefined, step => {\n setPasskeyStatus(step);\n }, { skipTokenSave: true });\n\n // Store login response temporarily - tokens will be saved in ConnectWalletButton after consent approval\n _pendingLoginResponse = result.loginResponse;\n\n const hasKeyshare = result.loginResponse.hasKeyshare ?? false;\n\n // Check for critical server keyshare loss scenario\n if (!hasKeyshare && result.loginResponse.isNewUser === false) {\n // CRITICAL: Existing user with lost server keyshare\n showError(\n 'CRITICAL ERROR',\n 'Your account data has been lost on the server.\\nThis should never happen and indicates a serious system failure.\\n\\nUnfortunately, your wallet cannot be recovered.\\nYou will need to create a new account.\\n\\nPlease contact support immediately with this error.'\n );\n\n // Reset to signin to prevent further actions\n setStep('signin');\n setPasskeyError('Critical server error - contact support');\n setPasskeyStatus('idle');\n return;\n }\n\n // Check if display name is required BEFORE starting DKG\n // Pass loginResponse to avoid API call before tokens are saved\n const displayNameRequired = await checkDisplayNameRequired(result.loginResponse);\n if (displayNameRequired) {\n // Temporarily save tokens so DisplayNameInput can call updateUserProfile\n // Tokens will be cleared on Cancel or kept after consent approval\n await jwtTokenManager.setTokens(result.loginResponse);\n setStep('display-name');\n return;\n }\n\n // Call onAuthSuccess to trigger real authentication - WAIT for completion\n try {\n if (onAuthSuccess) {\n await onAuthSuccess();\n }\n } catch (authError: any) {\n // Handle authorization errors (e.g., user clicked Cancel in consent modal)\n if (authError?.message?.includes('User denied authorization')) {\n setFailedMessage('Authorization cancelled');\n setStep('failed');\n setPasskeyStatus('idle');\n return;\n }\n // Re-throw other errors to be handled by outer catch\n throw authError;\n }\n\n // Close modal immediately after success\n if (autoCloseOnSuccess) {\n // Reset state first, then close modal\n setStep('signin');\n setEmail('');\n setVerificationError('');\n setPasskeyError('');\n setPasskeyStatus('idle');\n onOpenChange(false);\n }\n } catch (e: any) {\n const normalized = normalizeWebAuthnError(e);\n const errorMessage = normalized.message || 'Authentication failed';\n if (!normalized.benignCancel) {\n setPasskeyError(errorMessage);\n\n // Trigger onLumiaPassportError callback for non-benign errors\n try {\n callbacks?.onLumiaPassportError?.({\n error: e instanceof Error ? e : new Error(errorMessage),\n message: errorMessage\n });\n } catch {}\n }\n setPasskeyStatus('idle');\n console.error('[AuthModal] Passkey authentication failed:', e);\n } finally {\n setIsLoading(false);\n }\n }, [onAuthSuccess, onOpenChange, callbacks]);\n\n // Telegram authentication\n const handleTelegramAuth = React.useCallback(async () => {\n const telegramProvider = config?.social?.providers?.find(p => (p.id || '').toLowerCase() === 'telegram' && p.enabled);\n const telegramBot = (telegramProvider as any)?.meta?.botUsername as string | undefined;\n if (!telegramBot) {\n showError('Configuration Error', 'Telegram bot not configured. Please set botUsername in social.providers meta.');\n return;\n }\n\n setStep('telegram');\n }, [config?.social?.providers, onAuthSuccess, onOpenChange, callbacks]);\n\n // Coming soon handler\n const handleComingSoon = (providerName: string) => {\n showError('Coming Soon', `${providerName} authentication is coming soon!`);\n };\n\n // Initialize Telegram widget when step becomes 'telegram' (exact copy from AuthSection)\n React.useEffect(() => {\n if (step !== 'telegram') return;\n\n const telegramProvider = config?.social?.providers?.find(p => (p.id || '').toLowerCase() === 'telegram' && p.enabled);\n const bot = (telegramProvider as any)?.meta?.botUsername as string | undefined;\n if (!bot) {\n return;\n }\n\n const cleanup = initTelegramWidget(\n bot,\n async (result: TelegramAuthResult) => {\n try {\n // Clear any existing JWT session before Telegram authentication\n jwtTokenManager.clearTokens();\n\n // Call TSS server API to authenticate with Telegram\n // Skip token saving until consent approval\n const loginResponse = await loginWithTelegram({\n id: result.user.id as number,\n first_name: (result.user as any).first_name || '',\n last_name: (result.user as any).last_name || undefined,\n username: (result.user as any).username || undefined,\n photo_url: (result.user as any).photo_url || undefined,\n auth_date: Number((result.user as any).auth_date) || Math.floor(Date.now() / 1000),\n hash: (result.user as any).hash || '',\n } as any, { skipTokenSave: true });\n\n // Store login response temporarily - tokens will be saved in ConnectWalletButton after consent approval\n _pendingLoginResponse = loginResponse;\n\n // Check for critical server keyshare loss scenario\n if (!loginResponse.hasKeyshare && !loginResponse.isNewUser) {\n // CRITICAL: Existing user with lost server keyshare\n showError(\n 'CRITICAL ERROR',\n 'Your account data has been lost on the server.\\nThis should never happen and indicates a serious system failure.\\n\\nUnfortunately, your wallet cannot be recovered.\\nYou will need to create a new account.\\n\\nPlease contact support immediately with this error.'\n );\n\n // Reset to signin to prevent further actions\n setStep('signin');\n _pendingLoginResponse = null;\n return;\n }\n\n // Check if display name is required BEFORE starting DKG\n // Pass loginResponse to avoid API call before tokens are saved\n try {\n const displayNameRequired = await checkDisplayNameRequired(loginResponse);\n if (displayNameRequired) {\n // Temporarily save tokens so DisplayNameInput can call updateUserProfile\n // Tokens will be cleared on Cancel or kept after consent approval\n await jwtTokenManager.setTokens(loginResponse);\n setStep('display-name');\n return;\n }\n\n // Call onAuthSuccess to trigger real authentication - wait for completion\n if (onAuthSuccess) {\n await onAuthSuccess();\n }\n\n // Reset state first, then close modal\n setStep('signin');\n setEmail('');\n setVerificationError('');\n setPasskeyError('');\n setPasskeyStatus('idle');\n onOpenChange(false);\n } catch (sessionError) {\n // Show appropriate error message based on error type\n let errorMessage = 'Account setup failed. Please try again.';\n\n if ((sessionError as any)?.code === 'NO_BACKUP_AVAILABLE') {\n errorMessage = 'Account recovery impossible - no backups found. Session cleared.';\n } else if ((sessionError as any)?.code === 'BACKUP_SERVICE_UNAVAILABLE') {\n errorMessage = 'Backup service temporarily unavailable. Please try again later.';\n }\n\n showError('Authentication Incomplete', errorMessage);\n\n // Stay on signin to allow retry\n setStep('signin');\n setIsLoading(false);\n }\n } catch (error) {\n // Show error to user\n showError(\n 'Telegram Authentication Failed',\n error instanceof Error ? error.message : 'Unknown error'\n );\n\n // Stay on telegram step to allow retry\n setIsLoading(false);\n }\n },\n (((telegramProvider as any)?.meta?.salt) as string | undefined) || 'demo'\n );\n\n setIsLoading(false);\n\n // Save cleanup function to state for manual cleanup\n setTelegramCleanup(() => cleanup);\n\n return () => {\n cleanup();\n setTelegramCleanup(null);\n };\n }, [step, onAuthSuccess, onOpenChange]);\n\n // Recovery step rendered inside the modal when provided\n if (recoveryUserId) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className={`lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden ${isDark ? 'lumia-dark' : 'lumia-light'}`}\n hideClose\n >\n <DialogTitle className=\"sr-only\">Restore Account Access</DialogTitle>\n <KeyshareRestore userId={recoveryUserId} onClose={onRecoveryClose} onRestoreSuccess={onRecoverySuccess} />\n </DialogContent>\n </Dialog>\n );\n }\n\n if (step === 'display-name') {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className={`lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden ${isDark ? 'lumia-dark' : 'lumia-light'}`}\n style={{\n borderRadius: config.ui.modal?.borderRadius || '24px',\n maxWidth: config.ui.modal?.width || '400px',\n }}\n hideClose\n >\n <DialogTitle className=\"sr-only\">Enter Your Name</DialogTitle>\n <div className=\"p-8\">\n <DisplayNameInput\n onComplete={async () => {\n // Close AuthModal immediately before triggering consent flow\n onOpenChange(false);\n\n // Reset state for next time\n setStep('signin');\n setEmail('');\n setVerificationError('');\n setPasskeyError('');\n setPasskeyStatus('idle');\n\n // Small delay to ensure modal is closed before showing consent\n await new Promise(resolve => setTimeout(resolve, 100));\n\n // Trigger session creation and consent modal\n if (onAuthSuccess) {\n await onAuthSuccess();\n }\n }}\n onSkip={async () => {\n // Close AuthModal immediately before triggering consent flow\n onOpenChange(false);\n\n // Reset state for next time\n setStep('signin');\n setEmail('');\n setVerificationError('');\n setPasskeyError('');\n setPasskeyStatus('idle');\n\n // Small delay to ensure modal is closed before showing consent\n await new Promise(resolve => setTimeout(resolve, 100));\n\n // Trigger session creation and consent modal even if skipped\n if (onAuthSuccess) {\n await onAuthSuccess();\n }\n }}\n />\n </div>\n </DialogContent>\n </Dialog>\n );\n }\n\n if (step === 'failed') {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className={`lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden ${isDark ? 'lumia-dark' : 'lumia-light'}`}\n style={{\n borderRadius: config.ui.modal?.borderRadius || '24px',\n maxWidth: config.ui.modal?.width || '400px',\n }}\n >\n <DialogTitle className=\"sr-only\">Authentication Failed</DialogTitle>\n <div className=\"p-8\">\n <FailedScreen message={failedMessage} />\n </div>\n </DialogContent>\n </Dialog>\n );\n }\n\n if (step === 'verify') {\n return (\n <Dialog open={open && !iframeVisible} onOpenChange={onOpenChange}>\n <DialogContent\n className={`lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden ${isDark ? 'lumia-dark' : 'lumia-light'}`}\n style={{\n borderRadius: config.ui.modal?.borderRadius || '24px',\n maxWidth: config.ui.modal?.width || '400px',\n }}\n >\n <DialogTitle className=\"sr-only\">Email Verification</DialogTitle>\n <div className=\"p-5\">\n <DialogTopBar onBack={goBackToSignIn} className=\"-mx-5 -mt-5 mb-1\" />\n {/* Header/branding kept in modal; OTP input is clean */}\n <div className=\"flex justify-center mb-4\">\n <div className=\"w-10 h-10 bg-gradient-to-br from-purple-100 to-blue-100 rounded-full flex items-center justify-center\">\n <LumiaLogo size={28} />\n </div>\n </div>\n <h2 className={`text-2xl font-bold font-sans ${theme.titleText} mb-2`}>\n Enter verification code\n </h2>\n <p className={`text-sm ${theme.bodyText} mb-6`}>We sent a verification code to<br /><span className=\"font-semibold\">{email}</span></p>\n <VerificationCodeInput\n onVerifyCode={verifyCode}\n onResendCode={resendCode}\n isLoading={isLoading}\n expiresIn={expiresIn}\n error={verificationError}\n />\n {config.features.mpcSecurity && (\n <div className={`text-xs ${theme.mutedText} mt-6 text-center`}>protected by ⚡{' '}\n {config.ui.branding.link ? (\n <a href={config.ui.branding.link.url} target=\"_blank\" rel=\"noopener noreferrer\" className={`${theme.linkText} underline font-medium`}>\n {config.ui.branding.tagline}\n </a>\n ) : (\n <span className=\"font-medium\">{config.ui.branding.tagline}</span>\n )}\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n }\n\n if (step === 'telegram') {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className={`lumia-scope p-0 border-0 ${theme.modalBg} overflow-visible ${isDark ? 'lumia-dark' : 'lumia-light'}`}\n style={{\n borderRadius: config.ui.modal?.borderRadius || '24px',\n maxWidth: config.ui.modal?.width || '400px',\n }}\n >\n <DialogTitle className=\"sr-only\">Telegram Authentication</DialogTitle>\n <div className=\"p-8\">\n <div className=\"text-center mb-6\">\n <div className=\"flex justify-center mb-4\">\n <div className=\"w-10 h-10 bg-gradient-to-br from-purple-100 to-blue-100 rounded-full flex items-center justify-center\">\n <LumiaLogo size={32} />\n </div>\n </div>\n <h2 className={`text-2xl font-bold font-sans ${theme.titleText} mb-2`}>\n Sign in with Telegram\n </h2>\n <p className={`text-sm ${theme.bodyText} mb-6`}>\n Click the button below to authenticate with Telegram\n </p>\n </div>\n\n {/* Telegram Widget Container */}\n <div className=\"flex justify-center mb-6\">\n <div id=\"tg-root\" className=\"flex justify-center\" />\n </div>\n\n {isLoading && (\n <div className={`text-center text-sm ${theme.successText} mb-4`}>\n Loading Telegram widget...\n </div>\n )}\n\n {/* Back button */}\n <div className=\"flex justify-center\">\n <Button\n variant=\"outline\"\n onClick={goBackToSignIn}\n className={`px-6 ${theme.outlineBtn}`}\n >\n ← Back to Sign In\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n }\n\n return (\n <>\n <Dialog open={open && !iframeVisible} onOpenChange={onOpenChange}>\n <DialogContent\n className={`lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden`}\n >\n <DialogTitle className=\"sr-only\">Sign in to Lumia Passport</DialogTitle>\n <div className=\"p-8\">\n <div className=\"text-center mb-8\">\n <div className=\"flex justify-center mb-4\">\n <div className=\"w-10 h-10 bg-gradient-to-br from-purple-100 to-blue-100 rounded-full flex items-center justify-center\">\n <LumiaLogo size={32} />\n </div>\n </div>\n <h2 className={`text-2xl font-bold font-sans ${theme.titleText} mb-2`}>{config.ui.title}</h2>\n {config.features.mpcSecurity && (\n <div className={`text-xs ${theme.mutedText} mb-6`}>\n protected by{' '}\n <span className=\"font-semibold\">\n ⚡{' '}\n {config.ui.branding.link ?\n <a\n href={config.ui.branding.link.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={`${theme.linkText} underline`}\n >\n {config.ui.branding.tagline}\n </a>\n : config.ui.branding.tagline}\n </span>\n </div>\n )}\n </div>\n\n <div className=\"space-y-4\">\n {(() => {\n const order = config.ui.authOrder || ['passkey', 'email', 'social'];\n const isPasskey = config.passkey.enabled;\n const isEmail = config.email.enabled;\n const hasSocial =\n config.social.enabled && config.social.providers.filter(p => p.enabled).length > 0;\n const enabled = order.filter(s =>\n s === 'passkey' ? isPasskey : s === 'email' ? isEmail : hasSocial\n ) as Array<'passkey' | 'email' | 'social'>;\n\n const renderSection = (kind: 'passkey' | 'email' | 'social') => {\n if (kind === 'passkey') {\n return (\n <div className=\"space-y-3\" key=\"passkey\">\n <Button\n variant=\"plain\"\n onClick={handlePasskeyAuth}\n disabled={isLoading}\n className={`w-full h-14 ${theme.primaryBtn} rounded-2xl font-semibold shadow-sm`}\n >\n <Fingerprint className=\"w-5 h-5 mr-2\" />\n Sign in with existing Passkey\n </Button>\n {config.passkey.showCreateButton && (\n <div className={`border-t ${theme.divider} pt-3`}>\n <div className={`text-center text-sm ${theme.bodyText} mb-3`}>\n Don't have a passkey? Create one:\n </div>\n <Button\n variant=\"plain\"\n onClick={handlePasskeyRegister}\n disabled={isLoading}\n className={`w-full h-12 ${theme.outlineBtn} rounded-xl font-medium border`}\n >\n <KeyRound className=\"w-5 h-5 mr-2\" />\n Create Passkey\n </Button>\n </div>\n )}\n {(passkeyError || passkeyStatus !== 'idle') && (\n <div className=\"text-center\">\n {passkeyError && (\n <div className={`text-sm ${theme.errorText} mb-2 break-words whitespace-pre-wrap text-left mx-auto max-w-full max-h-24 overflow-auto`}>{passkeyError}</div>\n )}\n {passkeyStatus !== 'idle' && (\n <div className={`text-sm ${theme.successText}`}>{passkeyStatus}</div>\n )}\n </div>\n )}\n </div>\n );\n }\n if (kind === 'email') {\n return (\n <div className=\"space-y-3\" key=\"email\">\n <div className=\"relative\">\n <Mail className={`absolute left-3 top-3 h-5 w-5 ${theme.iconColor}`} />\n <Input\n type=\"email\"\n placeholder={config.email.placeholder}\n value={email}\n onChange={e => setEmail(e.target.value)}\n className={`pl-11 h-12 ${theme.inputBg} ${theme.inputText} rounded-xl border`}\n />\n </div>\n <Button\n variant=\"plain\"\n className={`w-full h-14 ${theme.ctaBtn} rounded-2xl font-semibold disabled:opacity-100`}\n disabled={!email || isLoading}\n onClick={sendVerificationCode}\n >\n {isLoading ? 'Sending...' : config.email.buttonText}\n </Button>\n {sendError && (\n <div className={`text-sm ${theme.errorText} mt-2 text-center break-words whitespace-pre-wrap`}>{sendError}</div>\n )}\n </div>\n );\n }\n // social\n return (\n <div className={`grid grid-cols-${config.social.gridColumns} gap-3`} key=\"social\">\n {config.social.providers\n .filter(provider => provider.enabled)\n .map(provider => {\n const fallbackMap: Record<string, React.ComponentType<{ className?: string }> | undefined> = {\n google: GoogleIcon,\n telegram: TelegramIcon,\n x: TwitterIcon,\n twitter: TwitterIcon,\n discord: DiscordIcon,\n };\n const IconComponent = (provider.icon as React.ComponentType<{ className?: string }> | undefined) ?? fallbackMap[(provider.id || '').toLowerCase()];\n const handleClick =\n provider.id === 'telegram'\n ? handleTelegramAuth\n : () => handleComingSoon(provider.name);\n return (\n <Button\n key={provider.id}\n variant=\"outline\"\n className={`h-12 ${theme.outlineBtn} rounded-xl p-0 flex items-center justify-center [&_svg]:!w-6 [&_svg]:!h-6`}\n onClick={handleClick}\n disabled={isLoading}\n title={provider.comingSoon ? `${provider.name} (Coming Soon)` : provider.name}\n >\n {IconComponent ? (\n <IconComponent className=\"w-6 h-6\" />\n ) : (\n <span className=\"text-sm\">{provider.name}</span>\n )}\n </Button>\n );\n })}\n </div>\n );\n };\n\n const nodes: React.ReactNode[] = [];\n enabled.forEach((kind, idx) => {\n if (idx > 0) {\n nodes.push(\n <div className=\"flex items-center my-6\" key={`div-${idx}`}>\n <div className={`flex-1 border-t ${theme.divider}`} />\n <div className={`px-3 ${theme.mutedText} text-sm`}>Or</div>\n <div className={`flex-1 border-t ${theme.divider}`} />\n </div>\n );\n }\n nodes.push(renderSection(kind));\n });\n return nodes;\n })()}\n\n <div className={`text-center mt-6 text-sm ${theme.mutedText} font-medium font-sans`}>\n By signing in, you agree to the{' '}\n <button\n onClick={() => setShowTerms(true)}\n className={`bg-transparent ${theme.linkText} underline font-medium hover:opacity-80 transition-opacity`}\n >\n Terms of Service\n </button>\n </div>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n\n <TermsOfService open={showTerms} onOpenChange={setShowTerms} />\n\n <ErrorAlert />\n </>\n );\n};\n","import { publicClient as beamPublic, getBundlerUrl } from './clients/base';\n\nconst ECRECOVER_PRECOMPILE = '0x0000000000000000000000000000000000000001' as const;\nconst ECRECOVER_ABI = [\n { name: 'ecrecover', type: 'function', inputs: [ { name: 'hash', type: 'bytes32' }, { name: 'v', type: 'uint8' }, { name: 'r', type: 'bytes32' }, { name: 's', type: 'bytes32' } ], outputs: [{ name: 'addr', type: 'address' }] },\n] as const;\n\nexport const safeToBigInt = (val: any, fallback = '0x0') => { try { return BigInt(val || fallback); } catch { return BigInt(fallback); } };\nexport const pack2x128 = (hi: bigint, lo: bigint): `0x${string}` => { return `0x${((hi << 128n) | (lo & ((1n << 128n) - 1n))).toString(16).padStart(64, '0')}`; };\n\nexport async function verifySignatureAgainstOwner(opHash: `0x${string}`, signature: `0x${string}`, expectedOwner?: `0x${string}`) {\n if (!signature || signature === '0x') return;\n try {\n const recoveredAddress = await (beamPublic as any).readContract({ address: ECRECOVER_PRECOMPILE as any, abi: ECRECOVER_ABI as any, functionName: 'ecrecover', args: [ opHash, parseInt(signature.slice(-2), 16), `0x${signature.slice(2, 66)}`, `0x${signature.slice(66, 130)}` ] });\n console.error('[AA][sign][CRITICAL] Signature verification:', { opHash, signature, recoveredAddress, expectedOwner, addressesMatch: recoveredAddress?.toLowerCase() === expectedOwner?.toLowerCase() });\n } catch (e) {\n try { const { recoverAddress } = await import('viem'); const recoveredAddress = await recoverAddress({ hash: opHash, signature }); console.error('[AA][sign][CRITICAL] Signature verification (viem):', { opHash, signature, recoveredAddress, expectedOwner, addressesMatch: recoveredAddress?.toLowerCase() === expectedOwner?.toLowerCase() }); } catch (e2) { console.error('[AA][sign][ERROR] Could not verify signature:', e2); }\n }\n}\n\nexport async function fetchEntryPointNonce(account: `0x${string}`, entryPoint: `0x${string}`): Promise<`0x${string}`> {\n try {\n const epNonceAbi = [ { type: 'function', name: 'getNonce', stateMutability: 'view', inputs: [ { name: 'account', type: 'address' }, { name: 'key', type: 'uint192' } ], outputs: [{ name: '', type: 'uint256' }] } ] as const;\n const nonce = await (beamPublic as any).readContract({ address: entryPoint as any, abi: epNonceAbi as any, functionName: 'getNonce', args: [account, 0n] });\n if (typeof nonce === 'bigint') return `0x${nonce.toString(16)}`;\n } catch {}\n return '0x0';\n}\n\nfunction sanitizeUserOperation(userOp: any): any {\n const sanitized = { ...userOp };\n\n // Fix sender field if it's an object (extract address and factory fields)\n if (typeof sanitized.sender === 'object' && sanitized.sender) {\n const senderObj = sanitized.sender;\n\n // Extract the actual sender address\n sanitized.sender = senderObj.sender || senderObj.address || senderObj.smartAccountAddress;\n\n // Extract factory fields if they exist\n if (senderObj.factory) {\n sanitized.factory = senderObj.factory;\n }\n if (senderObj.factoryData) {\n sanitized.factoryData = senderObj.factoryData;\n }\n }\n\n // Ensure all hex fields are valid and properly formatted\n const hexFields = [\n 'sender', 'nonce', 'callData', 'callGasLimit', 'verificationGasLimit',\n 'preVerificationGas', 'maxFeePerGas', 'maxPriorityFeePerGas', 'signature',\n 'factory', 'factoryData', 'paymaster', 'paymasterData',\n 'paymasterVerificationGasLimit', 'paymasterPostOpGasLimit'\n ];\n\n for (const field of hexFields) {\n const value = sanitized[field];\n if (value !== undefined && value !== null) {\n if (typeof value === 'string') {\n if (value === '0x' || value === '') {\n // Convert empty hex to 0x0 for numeric fields, 0x for data fields\n if (['callData', 'factoryData', 'paymasterData', 'signature'].includes(field)) {\n sanitized[field] = '0x';\n } else {\n sanitized[field] = '0x0';\n }\n } else if (field === 'sender' || field === 'factory' || field === 'paymaster') {\n // Address fields should not have 0x prefix added if missing\n if (!value.startsWith('0x')) {\n sanitized[field] = `0x${value}`;\n }\n } else if (!value.startsWith('0x')) {\n sanitized[field] = `0x${value}`;\n }\n }\n }\n }\n\n // Remove undefined/null fields for v0.7\n Object.keys(sanitized).forEach(key => {\n if (sanitized[key] === undefined || sanitized[key] === null) {\n delete sanitized[key];\n }\n });\n\n // Ensure required fields exist with proper defaults\n if (!sanitized.callData) sanitized.callData = '0x';\n if (!sanitized.signature) sanitized.signature = '0x';\n\n return sanitized;\n}\n\nexport async function bundlerRpc(method: string, params: any[]) {\n // Sanitize UserOperation if this is eth_sendUserOperation\n let cleanParams = params;\n if (method === 'eth_sendUserOperation' && params[0]) {\n cleanParams = [sanitizeUserOperation(params[0]), params[1]];\n }\n\n const body = { jsonrpc: '2.0', id: 1, method, params: cleanParams };\n const bodyStr = JSON.stringify(body, (_k, v) => (typeof v === 'bigint' ? `0x${v.toString(16)}` : v));\n\n console.log('[AA][rpc] ->', method, bodyStr);\n\n const res = await fetch(getBundlerUrl(), { method: 'POST', headers: { 'content-type': 'application/json' }, body: bodyStr });\n const json = await res.json();\n\n if (json.error) {\n console.log('[AA][rpc] <- ERROR:', JSON.stringify(json.error));\n const detail = json.error?.data ? ` | data: ${JSON.stringify(json.error.data)}` : '';\n throw new Error((json.error.message || JSON.stringify(json.error)) + detail);\n }\n\n console.log('[AA][rpc] <- SUCCESS:', JSON.stringify(json.result));\n return json.result;\n}\n","import { parseEther, encodeFunctionData, createWalletClient, http } from 'viem';\nimport { entryPoint07Abi } from 'viem/account-abstraction';\nimport { privateKeyToAccount } from 'viem/accounts';\n\nimport { fetchEntryPointNonce, pack2x128 } from '../akHelpers';\n// Import bundler API from @lumiapassport/core\nimport {\n createUserOperationWithDynamicFees,\n estimateUserOperationGas,\n estimateUserOperationGasWithDynamicFees,\n sendUserOperationWithRetry,\n sendUserOperationV06WithRetry,\n calculateDynamicFees,\n simulateUserOperation,\n} from '@lumiapassport/core/bundler';\nimport type { UserOperationV07, UserOperationV06 } from '@lumiapassport/core/bundler';\n// Use iframe-based MPC client for secure key storage and signing\nimport { ensureDkgAndGetOwner, signDigestWithMpc } from '../lib/iframe-mpc-client';\n\nimport {\n publicClient,\n getBundlerClient,\n lumiaBeam,\n ENTRYPOINT_V07,\n ENTRYPOINT_V06,\n LUMIA_AA_FACTORY_ADDRESS,\n LUMIA_PAYMASTER_ADDRESS,\n FUNDER_PK,\n} from './base';\n\nconst PAYMASTER_VERIFICATION_GAS_LIMIT: `0x${string}` = '0x249f0';\nconst PAYMASTER_POSTOP_GAS_LIMIT: `0x${string}` = '0x186a0';\n\nconst MAX_BUNDLER_VERIFICATION_GAS = 5_000_000n;\nconst PAYMASTER_VERIFICATION_GAS = 150_000n;\nconst PAYMASTER_POSTOP_GAS = 100_000n;\n\nexport interface AccountSession {\n ownerAddress: `0x${string}`;\n smartAccountAddress: `0x${string}`;\n factoryAddress: `0x${string}`;\n ownerPrivateKey?: `0x${string}`;\n mpcUserId?: string;\n usePaymaster?: boolean;\n kind: 'lumia';\n address: `0x${string}`;\n}\n\nexport interface CreateAccountParams {\n privateKey?: `0x${string}`;\n mpcUserId?: string;\n mpcPin?: string;\n usePaymaster?: boolean;\n}\n\nconst executeAbi = [\n {\n type: 'function',\n name: 'execute',\n stateMutability: 'payable',\n inputs: [\n { name: 'target', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'data', type: 'bytes' },\n ],\n outputs: [],\n },\n] as const;\n\nfunction normalizeSignature(signature: `0x${string}`): `0x${string}` {\n const sig = signature.slice(2);\n const r = sig.slice(0, 64);\n const s = sig.slice(64, 128);\n const v = sig.slice(128, 130);\n const sBigInt = BigInt(`0x${s}`);\n const secp256k1n = BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141');\n const secp256k1nHalf = secp256k1n >> 1n;\n let canonicalS = sBigInt;\n let canonicalV = parseInt(v, 16);\n if (sBigInt > secp256k1nHalf) {\n canonicalS = secp256k1n - sBigInt;\n canonicalV = canonicalV === 27 ? 28 : canonicalV === 28 ? 27 : canonicalV === 0 ? 1 : 0;\n }\n const canonicalSHex = canonicalS.toString(16).padStart(64, '0');\n const canonicalVHex = canonicalV.toString(16).padStart(2, '0');\n return `0x${r}${canonicalSHex}${canonicalVHex}` as `0x${string}`;\n}\n\nfunction convertUserOpV07ToV06(userOpV07: UserOperationV07): UserOperationV06 {\n let initCode: `0x${string}` = '0x';\n if (userOpV07.factory && userOpV07.factoryData) {\n const factoryAddr = userOpV07.factory.startsWith('0x') ? userOpV07.factory.slice(2) : userOpV07.factory;\n const factoryDataClean = userOpV07.factoryData.startsWith('0x') ? userOpV07.factoryData.slice(2) : userOpV07.factoryData;\n initCode = `0x${factoryAddr}${factoryDataClean}` as `0x${string}`;\n }\n let paymasterAndData: `0x${string}` = '0x';\n if (userOpV07.paymaster && userOpV07.paymaster !== '0x0000000000000000000000000000000000000000') {\n const paymasterAddr = userOpV07.paymaster.startsWith('0x') ? userOpV07.paymaster.slice(2) : userOpV07.paymaster;\n const paymasterDataField = userOpV07.paymasterData || '0x';\n const paymasterDataClean = paymasterDataField === '0x' ? '' : paymasterDataField.startsWith('0x') ? paymasterDataField.slice(2) : paymasterDataField;\n paymasterAndData = `0x${paymasterAddr}${paymasterDataClean}` as `0x${string}`;\n }\n return {\n sender: userOpV07.sender,\n nonce: userOpV07.nonce,\n initCode,\n callData: userOpV07.callData,\n callGasLimit: userOpV07.callGasLimit,\n verificationGasLimit: userOpV07.verificationGasLimit,\n preVerificationGas: userOpV07.preVerificationGas,\n maxFeePerGas: userOpV07.maxFeePerGas,\n maxPriorityFeePerGas: userOpV07.maxPriorityFeePerGas,\n paymasterAndData,\n signature: userOpV07.signature,\n };\n}\n\nexport async function createAccountSession(\n params: CreateAccountParams = {}\n): Promise<AccountSession> {\n const { privateKey, mpcUserId, usePaymaster = false } = params;\n if (!privateKey && !mpcUserId) throw new Error('Either privateKey or mpcUserId must be provided');\n if (!privateKey && mpcUserId && !mpcUserId.trim()) throw new Error('mpcUserId cannot be empty when using MPC mode');\n const factoryAddress = LUMIA_AA_FACTORY_ADDRESS as `0x${string}`;\n if (!factoryAddress) throw new Error('LUMIA_AA_FACTORY_ADDRESS is not configured');\n let ownerAddress: `0x${string}`; let ownerPrivateKey: `0x${string}` | undefined;\n if (privateKey) { const account = privateKeyToAccount(privateKey); ownerAddress = account.address; ownerPrivateKey = privateKey; }\n else if (mpcUserId) { const dkgResult = await ensureDkgAndGetOwner(mpcUserId); if (!dkgResult.ownerAddress) throw new Error('Failed to get owner address from DKG'); ownerAddress = dkgResult.ownerAddress; }\n else { throw new Error('Either privateKey or mpcUserId must be provided'); }\n const saltZero = '0x0000000000000000000000000000000000000000000000000000000000000000' as const;\n const smartAccountAddress = await predictCompatAddress(ownerAddress, factoryAddress, saltZero);\n return { ownerAddress, smartAccountAddress, factoryAddress, ownerPrivateKey, mpcUserId: privateKey ? undefined : mpcUserId, usePaymaster, kind: 'lumia', address: smartAccountAddress };\n}\n\nasync function predictCompatAddress(owner: `0x${string}`, factory: `0x${string}`, salt: `0x${string}`): Promise<`0x${string}`> {\n const compatAbi = [ { type: 'function', name: 'getAddress', stateMutability: 'view', inputs: [ { name: 'owner', type: 'address' }, { name: 'salt', type: 'bytes32' } ], outputs: [{ name: '', type: 'address' }] } ] as const;\n try {\n const predicted = await (publicClient as any).readContract({ address: factory, abi: compatAbi, functionName: 'getAddress', args: [owner, salt] } as any);\n return predicted as `0x${string}`;\n } catch (error) { throw new Error(`Failed to predict account address: ${error}`); }\n}\n\nexport async function sendUserOperation(\n session: AccountSession,\n callTarget: `0x${string}`,\n amountWei: string,\n innerData: `0x${string}` = '0x',\n feeType: 'economy' | 'standard' | 'fast' = 'standard',\n entryPointVersion: 'v0.6' | 'v0.7' = 'v0.7'\n): Promise<`0x${string}`> {\n const entryPointAddress = entryPointVersion === 'v0.6' ? ENTRYPOINT_V06 : ENTRYPOINT_V07;\n const amountWeiBigInt = BigInt(amountWei);\n const isMinimalTest = callTarget === '0x0000000000000000000000000000000000000000' && amountWei === '0' && innerData === '0x';\n let callData: `0x${string}`;\n if (isMinimalTest) { callData = '0x'; }\n else { callData = encodeFunctionData({ abi: executeAbi, functionName: 'execute', args: [callTarget, amountWeiBigInt, innerData] }); }\n\n let isDeployed = false; let deploymentMethod = 'unknown';\n try { const code = await publicClient.getCode({ address: session.smartAccountAddress }); if (code && code !== '0x' && code.length > 2) { isDeployed = true; deploymentMethod = 'getCode'; } } catch {}\n\n const nonce = await fetchEntryPointNonce(session.smartAccountAddress, entryPointAddress);\n const nonceValue = BigInt(nonce);\n if (!isDeployed && nonceValue !== 0n) throw new Error(`Undeployed account has non-zero nonce: ${nonce}. This will cause CodeHashChanged error.`);\n const shouldIncludeFactory = !isDeployed;\n\n let userOp: UserOperationV07;\n if (shouldIncludeFactory) {\n const compatCreateAbi = [ { type: 'function', name: 'createAccount', stateMutability: 'payable', inputs: [ { name: 'owner', type: 'address' }, { name: 'salt', type: 'bytes32' } ], outputs: [{ name: '', type: 'address' }] } ] as const;\n const saltZero = '0x0000000000000000000000000000000000000000000000000000000000000000' as const;\n const factoryData = encodeFunctionData({ abi: compatCreateAbi, functionName: 'createAccount', args: [session.ownerAddress, saltZero] });\n try {\n const predicted = await (publicClient as any).readContract({ address: session.factoryAddress, abi: compatCreateAbi, functionName: 'createAccount', args: [session.ownerAddress, saltZero] } as any);\n const predictedStr = String(predicted).toLowerCase();\n if (predictedStr !== session.smartAccountAddress.toLowerCase()) {\n console.warn('[Account] Warning: Predicted address mismatch:', { predicted, expected: session.smartAccountAddress });\n }\n } catch (verifyErr) { console.warn('[Account] Could not verify predicted address via call:', verifyErr); }\n\n userOp = await createUserOperationWithDynamicFees(\n session.smartAccountAddress,\n nonce,\n callData,\n true, // includeFactory = true\n session.factoryAddress,\n factoryData,\n feeType\n );\n } else {\n userOp = await createUserOperationWithDynamicFees(\n session.smartAccountAddress,\n nonce,\n callData,\n false, // includeFactory = false\n undefined,\n undefined,\n feeType\n );\n }\n\n const ensureGenerousDefaults = () => {\n const toHex = (v: bigint) => `0x${v.toString(16)}`;\n const minCallGas = 0x493e0n; // 300,000 (same as original)\n const minVerificationGas = 0x989680n; // 10,000,000 (same as original)\n const minPreVerificationGas = 0x30d40n; // 200,000 (same as original)\n if (BigInt(userOp.callGasLimit || '0x0') < minCallGas) userOp.callGasLimit = toHex(minCallGas) as `0x${string}`;\n if (BigInt(userOp.verificationGasLimit || '0x0') < minVerificationGas) userOp.verificationGasLimit = toHex(minVerificationGas) as `0x${string}`;\n if (BigInt(userOp.preVerificationGas || '0x0') < minPreVerificationGas) userOp.preVerificationGas = toHex(minPreVerificationGas) as `0x${string}`;\n };\n const enforceCaps = (usePaymaster?: boolean) => {\n try {\n const envCaps: any = (typeof import.meta !== 'undefined' && (import.meta as any).env) || {};\n const maxBundlerVerifGas: bigint = envCaps.VITE_MAX_VERIFICATION_GAS ? BigInt(envCaps.VITE_MAX_VERIFICATION_GAS) : MAX_BUNDLER_VERIFICATION_GAS;\n const maxCallGas: bigint = envCaps.VITE_MAX_CALL_GAS_LIMIT ? BigInt(envCaps.VITE_MAX_CALL_GAS_LIMIT) : 0x7a120n;\n const toHex = (v: bigint) => `0x${v.toString(16)}`;\n const maxAccountVerifGas = usePaymaster ? maxBundlerVerifGas - PAYMASTER_VERIFICATION_GAS : maxBundlerVerifGas;\n const verGas = BigInt(userOp.verificationGasLimit || '0x0');\n if (verGas > maxAccountVerifGas) userOp.verificationGasLimit = toHex(maxAccountVerifGas) as `0x${string}`;\n const callGas = BigInt(userOp.callGasLimit || '0x0');\n if (callGas > maxCallGas) userOp.callGasLimit = toHex(maxCallGas) as `0x${string}`;\n } catch {}\n };\n\n let estimated = false;\n try {\n const gasEst = await estimateUserOperationGas({ ...userOp, signature: `0x${'00'.repeat(65)}` });\n userOp.callGasLimit = gasEst.callGasLimit; userOp.verificationGasLimit = gasEst.verificationGasLimit; userOp.preVerificationGas = gasEst.preVerificationGas;\n ensureGenerousDefaults(); enforceCaps(session.usePaymaster); estimated = true;\n } catch {\n ensureGenerousDefaults(); enforceCaps(session.usePaymaster);\n }\n\n try {\n const toHex = (v: bigint) => `0x${v.toString(16)}`;\n const isContractCall = !!userOp.callData && userOp.callData !== '0x';\n if (isContractCall) {\n const currentVer = BigInt(userOp.verificationGasLimit || '0x0');\n const call = BigInt(userOp.callGasLimit || '0x0');\n const postOp = 150_000n; const safety10k = 10_000n;\n let buffer = call + postOp + safety10k; buffer += buffer / 63n;\n const newVer = currentVer + buffer; userOp.verificationGasLimit = toHex(newVer) as `0x${string}`; enforceCaps(session.usePaymaster);\n }\n } catch {}\n\n if (session.usePaymaster && LUMIA_PAYMASTER_ADDRESS) {\n userOp.paymaster = LUMIA_PAYMASTER_ADDRESS as `0x${string}`; userOp.paymasterData = '0x' as `0x${string}`;\n userOp.paymasterVerificationGasLimit = PAYMASTER_VERIFICATION_GAS_LIMIT;\n userOp.paymasterPostOpGasLimit = PAYMASTER_POSTOP_GAS_LIMIT;\n }\n\n const signUserOp = async (nonce: `0x${string}`) => {\n userOp.nonce = nonce;\n let opHash: `0x${string}`;\n if (entryPointVersion === 'v0.6') {\n const userOpV06 = convertUserOpV07ToV06(userOp);\n opHash = (await (publicClient as any).readContract({ address: entryPointAddress as `0x${string}` , abi: [ { type: 'function', name: 'getUserOpHash', inputs: [ { name: 'userOp', type: 'tuple', components: [ { name: 'sender', type: 'address' }, { name: 'nonce', type: 'uint256' }, { name: 'initCode', type: 'bytes' }, { name: 'callData', type: 'bytes' }, { name: 'callGasLimit', type: 'uint256' }, { name: 'verificationGasLimit', type: 'uint256' }, { name: 'preVerificationGas', type: 'uint256' }, { name: 'maxFeePerGas', type: 'uint256' }, { name: 'maxPriorityFeePerGas', type: 'uint256' }, { name: 'paymasterAndData', type: 'bytes' }, { name: 'signature', type: 'bytes' } ] } ], outputs: [{ name: '', type: 'bytes32' }] } ] as const, functionName: 'getUserOpHash', args: [ { sender: userOpV06.sender, nonce: BigInt(userOpV06.nonce), initCode: userOpV06.initCode, callData: userOpV06.callData, callGasLimit: BigInt(userOpV06.callGasLimit), verificationGasLimit: BigInt(userOpV06.verificationGasLimit), preVerificationGas: BigInt(userOpV06.preVerificationGas), maxFeePerGas: BigInt(userOpV06.maxFeePerGas), maxPriorityFeePerGas: BigInt(userOpV06.maxPriorityFeePerGas), paymasterAndData: userOpV06.paymasterAndData, signature: '0x', } ] } as any)) as `0x${string}`;\n } else {\n const hasFactoryData = !!(userOp.factory && userOp.factoryData);\n const initCode = hasFactoryData ? (() => { const factoryAddr = (userOp.factory as string).startsWith('0x') ? (userOp.factory as string).slice(2) : (userOp.factory as string); const factoryDataClean = (userOp.factoryData as string).startsWith('0x') ? (userOp.factoryData as string).slice(2) : (userOp.factoryData as string); return `0x${factoryAddr}${factoryDataClean}` as `0x${string}`; })() : ('0x' as `0x${string}`);\n const accountGasLimits = pack2x128(BigInt(userOp.verificationGasLimit), BigInt(userOp.callGasLimit));\n const gasFees = pack2x128(BigInt(userOp.maxPriorityFeePerGas), BigInt(userOp.maxFeePerGas));\n let paymasterAndData: `0x${string}` = '0x';\n if (userOp.paymaster && userOp.paymaster !== '0x0000000000000000000000000000000000000000') {\n const verificationGasLimit = userOp.paymasterVerificationGasLimit || '0x186a0';\n const postOpGasLimit = userOp.paymasterPostOpGasLimit || '0x186a0';\n const paymasterDataField = userOp.paymasterData || '0x';\n const packedPaymasterGasLimits = pack2x128(BigInt(verificationGasLimit), BigInt(postOpGasLimit));\n const paymasterAddr = (userOp.paymaster as string).startsWith('0x') ? (userOp.paymaster as string).slice(2) : (userOp.paymaster as string);\n const paymasterDataClean = paymasterDataField === '0x' ? '' : paymasterDataField.startsWith('0x') ? paymasterDataField.slice(2) : paymasterDataField;\n paymasterAndData = `0x${paymasterAddr}${packedPaymasterGasLimits.slice(2)}${paymasterDataClean}` as `0x${string}`;\n }\n const packedForHash = { sender: session.smartAccountAddress, nonce: BigInt(nonce), initCode, callData, accountGasLimits, preVerificationGas: BigInt(userOp.preVerificationGas), gasFees, paymasterAndData, signature: '0x' as `0x${string}` };\n\n opHash = await (publicClient as any).readContract({ address: entryPointAddress as `0x${string}`, abi: entryPoint07Abi, functionName: 'getUserOpHash', args: [packedForHash] } as any);\n }\n let signature: `0x${string}`;\n if (session.mpcUserId) {\n // Pass full UserOp details for display in iframe confirmation modal\n const mpcSig = await signDigestWithMpc(session.mpcUserId, opHash, {\n sender: userOp.sender,\n nonce: userOp.nonce,\n callData: userOp.callData,\n callGasLimit: userOp.callGasLimit,\n verificationGasLimit: userOp.verificationGasLimit,\n preVerificationGas: userOp.preVerificationGas,\n maxFeePerGas: userOp.maxFeePerGas,\n maxPriorityFeePerGas: userOp.maxPriorityFeePerGas,\n paymaster: userOp.paymaster,\n factory: userOp.factory,\n factoryData: userOp.factoryData,\n callTarget, // Add callTarget so iframe can display \"To\" address\n });\n if (!mpcSig) throw new Error('MPC signing failed');\n signature = mpcSig;\n }\n else if (session.ownerPrivateKey) { const account = privateKeyToAccount(session.ownerPrivateKey); const rawSig = await account.sign({ hash: opHash }); signature = normalizeSignature(rawSig); }\n else { throw new Error('No signing method available'); }\n userOp.signature = signature;\n\n // CRITICAL FIX: Ensure sender is always a string, not an object\n if (typeof userOp.sender !== 'string') {\n userOp.sender = session.smartAccountAddress;\n }\n\n return userOp;\n };\n\n try { userOp = await signUserOp(nonce); } catch (signingError) { throw signingError; }\n\n let hash: `0x${string}`;\n if (entryPointVersion === 'v0.6') {\n const userOpV06 = convertUserOpV07ToV06(userOp);\n const resignerV06 = async (newNonce: `0x${string}`) => { const resignedV07 = await signUserOp(newNonce); return convertUserOpV07ToV06(resignedV07); };\n hash = await sendUserOperationV06WithRetry(userOpV06, resignerV06, 1);\n } else {\n hash = await sendUserOperationWithRetry(userOp, signUserOp, 1);\n }\n return hash;\n}\n\n/**\n * Prepare and sign a UserOperation without sending it to the bundler.\n * Returns the signed UserOp and its hash for backend verification and submission.\n *\n * @param session - Account session with signing credentials\n * @param callTarget - Target address for the transaction\n * @param amountWei - Amount in wei to send\n * @param innerData - Call data for the transaction\n * @param feeType - Fee tier: 'economy', 'standard', or 'fast'\n * @param entryPointVersion - EntryPoint version: 'v0.6' or 'v0.7'\n * @returns Object with signed UserOperation and its hash\n */\nexport async function prepareUserOperation(\n session: AccountSession,\n callTarget: `0x${string}`,\n amountWei: string,\n innerData: `0x${string}` = '0x',\n feeType: 'economy' | 'standard' | 'fast' = 'standard',\n entryPointVersion: 'v0.6' | 'v0.7' = 'v0.7'\n): Promise<{ userOp: UserOperationV07 | UserOperationV06; userOpHash: `0x${string}` }> {\n const entryPointAddress = entryPointVersion === 'v0.6' ? ENTRYPOINT_V06 : ENTRYPOINT_V07;\n const amountWeiBigInt = BigInt(amountWei);\n const isMinimalTest = callTarget === '0x0000000000000000000000000000000000000000' && amountWei === '0' && innerData === '0x';\n let callData: `0x${string}`;\n if (isMinimalTest) { callData = '0x'; }\n else { callData = encodeFunctionData({ abi: executeAbi, functionName: 'execute', args: [callTarget, amountWeiBigInt, innerData] }); }\n\n let isDeployed = false; let deploymentMethod = 'unknown';\n try { const code = await publicClient.getCode({ address: session.smartAccountAddress }); if (code && code !== '0x' && code.length > 2) { isDeployed = true; deploymentMethod = 'getCode'; } } catch {}\n\n const nonce = await fetchEntryPointNonce(session.smartAccountAddress, entryPointAddress);\n const nonceValue = BigInt(nonce);\n if (!isDeployed && nonceValue !== 0n) throw new Error(`Undeployed account has non-zero nonce: ${nonce}. This will cause CodeHashChanged error.`);\n const shouldIncludeFactory = !isDeployed;\n\n let userOp: UserOperationV07;\n if (shouldIncludeFactory) {\n const compatCreateAbi = [ { type: 'function', name: 'createAccount', stateMutability: 'payable', inputs: [ { name: 'owner', type: 'address' }, { name: 'salt', type: 'bytes32' } ], outputs: [{ name: '', type: 'address' }] } ] as const;\n const saltZero = '0x0000000000000000000000000000000000000000000000000000000000000000' as const;\n const factoryData = encodeFunctionData({ abi: compatCreateAbi, functionName: 'createAccount', args: [session.ownerAddress, saltZero] });\n\n userOp = await createUserOperationWithDynamicFees(\n session.smartAccountAddress,\n nonce,\n callData,\n true,\n session.factoryAddress,\n factoryData,\n feeType\n );\n } else {\n userOp = await createUserOperationWithDynamicFees(\n session.smartAccountAddress,\n nonce,\n callData,\n false,\n undefined,\n undefined,\n feeType\n );\n }\n\n const ensureGenerousDefaults = () => {\n const toHex = (v: bigint) => `0x${v.toString(16)}`;\n const minCallGas = 0x493e0n;\n const minVerificationGas = 0x989680n;\n const minPreVerificationGas = 0x30d40n;\n if (BigInt(userOp.callGasLimit || '0x0') < minCallGas) userOp.callGasLimit = toHex(minCallGas) as `0x${string}`;\n if (BigInt(userOp.verificationGasLimit || '0x0') < minVerificationGas) userOp.verificationGasLimit = toHex(minVerificationGas) as `0x${string}`;\n if (BigInt(userOp.preVerificationGas || '0x0') < minPreVerificationGas) userOp.preVerificationGas = toHex(minPreVerificationGas) as `0x${string}`;\n };\n\n const enforceCaps = (usePaymaster?: boolean) => {\n try {\n const envCaps: any = (typeof import.meta !== 'undefined' && (import.meta as any).env) || {};\n const maxBundlerVerifGas: bigint = envCaps.VITE_MAX_VERIFICATION_GAS ? BigInt(envCaps.VITE_MAX_VERIFICATION_GAS) : MAX_BUNDLER_VERIFICATION_GAS;\n const maxCallGas: bigint = envCaps.VITE_MAX_CALL_GAS_LIMIT ? BigInt(envCaps.VITE_MAX_CALL_GAS_LIMIT) : 0x7a120n;\n const toHex = (v: bigint) => `0x${v.toString(16)}`;\n const maxAccountVerifGas = usePaymaster ? maxBundlerVerifGas - PAYMASTER_VERIFICATION_GAS : maxBundlerVerifGas;\n const verGas = BigInt(userOp.verificationGasLimit || '0x0');\n if (verGas > maxAccountVerifGas) userOp.verificationGasLimit = toHex(maxAccountVerifGas) as `0x${string}`;\n const callGas = BigInt(userOp.callGasLimit || '0x0');\n if (callGas > maxCallGas) userOp.callGasLimit = toHex(maxCallGas) as `0x${string}`;\n } catch {}\n };\n\n let estimated = false;\n try {\n const gasEst = await estimateUserOperationGas({ ...userOp, signature: `0x${'00'.repeat(65)}` });\n userOp.callGasLimit = gasEst.callGasLimit; userOp.verificationGasLimit = gasEst.verificationGasLimit; userOp.preVerificationGas = gasEst.preVerificationGas;\n ensureGenerousDefaults(); enforceCaps(session.usePaymaster); estimated = true;\n } catch {\n ensureGenerousDefaults(); enforceCaps(session.usePaymaster);\n }\n\n try {\n const toHex = (v: bigint) => `0x${v.toString(16)}`;\n const isContractCall = !!userOp.callData && userOp.callData !== '0x';\n if (isContractCall) {\n const currentVer = BigInt(userOp.verificationGasLimit || '0x0');\n const call = BigInt(userOp.callGasLimit || '0x0');\n const postOp = 150_000n; const safety10k = 10_000n;\n let buffer = call + postOp + safety10k; buffer += buffer / 63n;\n const newVer = currentVer + buffer; userOp.verificationGasLimit = toHex(newVer) as `0x${string}`; enforceCaps(session.usePaymaster);\n }\n } catch {}\n\n if (session.usePaymaster && LUMIA_PAYMASTER_ADDRESS) {\n userOp.paymaster = LUMIA_PAYMASTER_ADDRESS as `0x${string}`; userOp.paymasterData = '0x' as `0x${string}`;\n userOp.paymasterVerificationGasLimit = PAYMASTER_VERIFICATION_GAS_LIMIT;\n userOp.paymasterPostOpGasLimit = PAYMASTER_POSTOP_GAS_LIMIT;\n }\n\n // Calculate UserOp hash\n userOp.nonce = nonce;\n let opHash: `0x${string}`;\n\n if (entryPointVersion === 'v0.6') {\n const userOpV06 = convertUserOpV07ToV06(userOp);\n opHash = (await (publicClient as any).readContract({\n address: entryPointAddress as `0x${string}`,\n abi: [ { type: 'function', name: 'getUserOpHash', inputs: [ { name: 'userOp', type: 'tuple', components: [ { name: 'sender', type: 'address' }, { name: 'nonce', type: 'uint256' }, { name: 'initCode', type: 'bytes' }, { name: 'callData', type: 'bytes' }, { name: 'callGasLimit', type: 'uint256' }, { name: 'verificationGasLimit', type: 'uint256' }, { name: 'preVerificationGas', type: 'uint256' }, { name: 'maxFeePerGas', type: 'uint256' }, { name: 'maxPriorityFeePerGas', type: 'uint256' }, { name: 'paymasterAndData', type: 'bytes' }, { name: 'signature', type: 'bytes' } ] } ], outputs: [{ name: '', type: 'bytes32' }] } ] as const,\n functionName: 'getUserOpHash',\n args: [ {\n sender: userOpV06.sender,\n nonce: BigInt(userOpV06.nonce),\n initCode: userOpV06.initCode,\n callData: userOpV06.callData,\n callGasLimit: BigInt(userOpV06.callGasLimit),\n verificationGasLimit: BigInt(userOpV06.verificationGasLimit),\n preVerificationGas: BigInt(userOpV06.preVerificationGas),\n maxFeePerGas: BigInt(userOpV06.maxFeePerGas),\n maxPriorityFeePerGas: BigInt(userOpV06.maxPriorityFeePerGas),\n paymasterAndData: userOpV06.paymasterAndData,\n signature: '0x',\n } ]\n } as any)) as `0x${string}`;\n } else {\n const hasFactoryData = !!(userOp.factory && userOp.factoryData);\n const initCode = hasFactoryData ? (() => {\n const factoryAddr = (userOp.factory as string).startsWith('0x') ? (userOp.factory as string).slice(2) : (userOp.factory as string);\n const factoryDataClean = (userOp.factoryData as string).startsWith('0x') ? (userOp.factoryData as string).slice(2) : (userOp.factoryData as string);\n return `0x${factoryAddr}${factoryDataClean}` as `0x${string}`;\n })() : ('0x' as `0x${string}`);\n\n const accountGasLimits = pack2x128(BigInt(userOp.verificationGasLimit), BigInt(userOp.callGasLimit));\n const gasFees = pack2x128(BigInt(userOp.maxPriorityFeePerGas), BigInt(userOp.maxFeePerGas));\n\n let paymasterAndData: `0x${string}` = '0x';\n if (userOp.paymaster && userOp.paymaster !== '0x0000000000000000000000000000000000000000') {\n const verificationGasLimit = userOp.paymasterVerificationGasLimit || '0x186a0';\n const postOpGasLimit = userOp.paymasterPostOpGasLimit || '0x186a0';\n const paymasterDataField = userOp.paymasterData || '0x';\n const packedPaymasterGasLimits = pack2x128(BigInt(verificationGasLimit), BigInt(postOpGasLimit));\n const paymasterAddr = (userOp.paymaster as string).startsWith('0x') ? (userOp.paymaster as string).slice(2) : (userOp.paymaster as string);\n const paymasterDataClean = paymasterDataField === '0x' ? '' : paymasterDataField.startsWith('0x') ? paymasterDataField.slice(2) : paymasterDataField;\n paymasterAndData = `0x${paymasterAddr}${packedPaymasterGasLimits.slice(2)}${paymasterDataClean}` as `0x${string}`;\n }\n\n const packedForHash = {\n sender: session.smartAccountAddress,\n nonce: BigInt(nonce),\n initCode,\n callData,\n accountGasLimits,\n preVerificationGas: BigInt(userOp.preVerificationGas),\n gasFees,\n paymasterAndData,\n signature: '0x' as `0x${string}`\n };\n\n opHash = await (publicClient as any).readContract({\n address: entryPointAddress as `0x${string}`,\n abi: entryPoint07Abi,\n functionName: 'getUserOpHash',\n args: [packedForHash]\n } as any);\n }\n\n // Sign the UserOp\n let signature: `0x${string}`;\n if (session.mpcUserId) {\n const mpcSig = await signDigestWithMpc(session.mpcUserId, opHash, {\n sender: userOp.sender,\n nonce: userOp.nonce,\n callData: userOp.callData,\n callGasLimit: userOp.callGasLimit,\n verificationGasLimit: userOp.verificationGasLimit,\n preVerificationGas: userOp.preVerificationGas,\n maxFeePerGas: userOp.maxFeePerGas,\n maxPriorityFeePerGas: userOp.maxPriorityFeePerGas,\n paymaster: userOp.paymaster,\n factory: userOp.factory,\n factoryData: userOp.factoryData,\n });\n if (!mpcSig) throw new Error('MPC signing failed');\n signature = mpcSig;\n } else if (session.ownerPrivateKey) {\n const account = privateKeyToAccount(session.ownerPrivateKey);\n const rawSig = await account.sign({ hash: opHash });\n signature = normalizeSignature(rawSig);\n } else {\n throw new Error('No signing method available');\n }\n\n userOp.signature = signature;\n\n // Ensure sender is always a string\n if (typeof userOp.sender !== 'string') {\n userOp.sender = session.smartAccountAddress;\n }\n\n // Return appropriate version\n if (entryPointVersion === 'v0.6') {\n const userOpV06 = convertUserOpV07ToV06(userOp);\n return { userOp: userOpV06, userOpHash: opHash };\n }\n\n return { userOp, userOpHash: opHash };\n}\n\nexport async function depositForSmartAccount(\n address: `0x${string}`,\n amountEth = '0.01',\n entryPointVersion: 'v0.6' | 'v0.7' = 'v0.7'\n) {\n if (!FUNDER_PK) throw new Error('VITE_FUNDER_PK is not set');\n const entryPointAddress = entryPointVersion === 'v0.6' ? ENTRYPOINT_V06 : ENTRYPOINT_V07;\n const entryPointDepositAbi = [ { type: 'function', name: 'depositTo', stateMutability: 'payable', inputs: [{ name: 'account', type: 'address' }], outputs: [] } ] as const;\n const funder = privateKeyToAccount(FUNDER_PK as `0x${string}`);\n const wallet = createWalletClient({ account: funder, chain: lumiaBeam, transport: http(lumiaBeam.rpcUrls.default.http[0]) });\n const hash = await (wallet as any).writeContract({ address: entryPointAddress as `0x${string}`, abi: entryPointDepositAbi, functionName: 'depositTo', args: [address], value: parseEther(amountEth), type: 'legacy', gasPrice: 1_000_000_000n } as any);\n return hash;\n}\n\nexport async function getEntryPointDeposit(\n address: `0x${string}`,\n entryPointVersion: 'v0.6' | 'v0.7' = 'v0.7'\n): Promise<bigint> {\n const entryPointAddress = entryPointVersion === 'v0.6' ? ENTRYPOINT_V06 : ENTRYPOINT_V07;\n const depositAbi = [ { type: 'function', name: 'balanceOf', stateMutability: 'view', inputs: [{ name: 'account', type: 'address' }], outputs: [{ name: '', type: 'uint256' }] } ] as const;\n return await (publicClient as any).readContract({ address: entryPointAddress as `0x${string}`, abi: depositAbi, functionName: 'balanceOf', args: [address] } as any);\n}\n","import { getSupportedEntryPoints } from 'viem/account-abstraction';\n\nimport {\n createAccountSession,\n sendUserOperation,\n depositForSmartAccount,\n getEntryPointDeposit,\n type AccountSession,\n type CreateAccountParams,\n} from './account';\nimport { getBundlerClient, getBundlerUrl } from './base';\n\nexport async function probeBundler() {\n const startedAt = Date.now();\n try {\n const entryPoints = await getSupportedEntryPoints(getBundlerClient() as any);\n const elapsedMs = Date.now() - startedAt;\n return { ok: true, url: getBundlerUrl(), ms: elapsedMs, entryPoints } as const;\n } catch (err: any) {\n const elapsedMs = Date.now() - startedAt;\n const message = err?.message || String(err);\n return { ok: false, url: getBundlerUrl(), ms: elapsedMs, error: message } as const;\n }\n}\n\nexport {\n createAccountSession,\n sendUserOperation,\n depositForSmartAccount,\n getEntryPointDeposit,\n type AccountSession,\n type CreateAccountParams,\n};\n\nexport async function createAccountClient(\n params: CreateAccountParams = {}\n): Promise<AccountSession> {\n return createAccountSession(params);\n}\n\nexport const createAkClient = createAccountClient;\nexport const createLumiaClient = createAccountClient;\nexport const sendDemoUserOp = sendUserOperation;\nexport const sendLumiaUserOp = sendUserOperation;\nexport const depositForLumiaAccount = depositForSmartAccount;\n\n","export * from './base';\nexport * from './account';\nexport * from './utils';\n","// Auto-attach package styles (inline) — no action needed in host app\nimport cssText from './styles/built.css';\ndeclare const __LUMIA_DISABLE_AUTO_CSS__: string | undefined;\n(() => {\n try {\n if (typeof document === 'undefined') return;\n // Allow host apps to opt-out of auto CSS injection\n const disabled = typeof __LUMIA_DISABLE_AUTO_CSS__ !== 'undefined' && !!__LUMIA_DISABLE_AUTO_CSS__;\n if (disabled) return;\n const markerId = 'lumia-passport-ui-kit-styles';\n if (document.getElementById(markerId)) return;\n const style = document.createElement('style');\n style.id = markerId;\n style.textContent = (cssText as unknown as string) || '';\n document.head.appendChild(style);\n } catch {}\n})();\n\nexport { LumiaPassportProvider, useLumiaPassportConfig } from './context/LumiaPassportContext';\nexport type { LumiaPassportProviderProps, LumiaPassportCallbacks } from './context/LumiaPassportContext';\nexport { LumiaSessionProvider, useLumiaSession } from './context/LumiaPassportSessionContext';\nexport type { LumiaSessionProviderProps } from './context/LumiaPassportSessionContext';\nexport { LumiaWagmiProvider } from './context/WagmiContext';\nexport { LumiaRainbowKitProvider } from './context/RainbowKitContext';\nexport type { LumiaRainbowKitProviderProps } from './context/RainbowKitContext';\nexport { ConnectWalletButton } from './components/ConnectWalletButton';\nexport type { ConnectWalletButtonProps } from './components/ConnectWalletButton';\nexport { ThemeToggle } from './components/ThemeToggle';\nexport { LumiaLogo } from './components/LumiaLogo';\nexport { useTheme } from './hooks/useTheme';\nexport type { Theme } from './hooks/useTheme';\n\n// UserOperation monitoring components\nexport { UserOpStatus } from './internal/components/UserOpStatus';\nexport { Hash } from './internal/components/Hash';\nexport { Address } from './internal/components/Address';\nexport { TransactionsList } from './internal/components/TransactionsList';\nexport { default as KeyshareBackup } from './internal/components/KeyshareBackup';\nexport type { UserOpStatusProps } from './internal/components/UserOpStatus';\nexport type { HashProps } from './internal/components/Hash';\nexport type { AddressProps } from './internal/components/Address';\n\n// Internal modals are not exported - they're used internally by ConnectWalletButton\n// For custom implementations, use the hooks and utility components below\n\n// Transaction hooks\nexport { useSendTransaction } from './hooks/useSendTransaction';\nexport type { UseSendTransactionReturn } from './hooks/useSendTransaction';\nexport type { SendTransactionParams as UserOpSendTransactionParams } from './hooks/useSendTransaction';\nexport { useUserOpStatus } from './hooks/useUserOpStatus';\nexport type {\n UseUserOpStatusReturn,\n UseUserOpStatusOptions,\n UserOpState,\n UserOpReceipt,\n UserOpMempool,\n} from './hooks/useUserOpStatus';\n\n// Public client API\nexport type { AccountSession } from './internal/clients/account';\nexport { sendUserOperation, prepareUserOperation } from './internal/clients/account';\nexport { lumiaBeam, LUMIA_EXPLORER_URL } from './internal/clients/base';\n\n// Profile API\nexport { getUserProfile, updateUserProfile } from './internal/clients/profile';\nexport type { UserProfile, UpdateProfileRequest, ProviderDetail } from './internal/clients/profile';\n\n// Wagmi configuration\nexport { wagmiConfig, queryClient } from './config/wagmi';\n\n// Blockchain modules\nexport { useTransactions } from './modules/transactions';\nexport { useAssets, useTokenInfo, useTokenBalance } from './modules/assets';\nexport { useSmartAccountTransactions } from './modules/smartAccountTransactions';\nexport { useLumiaPassportLinkedProfiles } from './modules/linkedProfiles';\nexport type { Transaction, SendTransactionParams, SendTransactionResult } from './modules/transactions';\nexport type { TokenBalance, Asset } from './modules/assets';\nexport type { UserOperation } from './modules/smartAccountTransactions';\nexport type { LumiaPassportConfig } from './config/lumiaPassport';\n\n// Iframe Manager types\nexport type { WalletReadyStatus } from './internal/lib/iframe-manager';\n\n// Note: No static import of CSS here to keep build tool-agnostic.\n// CSS is loaded via dynamic import (eval) above for Vite dev and via <link> fallback.\n",".container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=\"1\"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:\"\\201C\"\"\\201D\"\"\\2018\"\"\\2019\";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:\"`\"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:\"`\"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:rgba(17,24,39,.1);--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:hsla(0,0%,100%,.1);--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.lumia-scope{background-color:hsl(var(--background));color:hsl(var(--foreground))}.lumia-scope,.lumia-scope *,.lumia-scope :after,.lumia-scope :before{box-sizing:border-box;border-width:0;border-style:solid}.lumia-scope input,.lumia-scope select,.lumia-scope textarea{font:inherit;color:inherit;margin:0;background-color:transparent}.lumia-scope button{font:inherit;margin:0;background-color:transparent;border:0}.lumia-scope input[type=search]::-webkit-search-cancel-button,.lumia-scope input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.lumia-scope,.lumia-scope *,.lumia-scope .lumia-heading,.lumia-scope [data-radix-dialog-content],.lumia-scope [data-radix-dialog-content] *,.lumia-scope h1,.lumia-scope h2,.lumia-scope h3,.lumia-scope h4,.lumia-scope h5,.lumia-scope h6{font-family:system-ui,-apple-system,sans-serif!important}.lumia-scope .lumia-heading{font-weight:700}.lumia-scope .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.lumia-scope .pointer-events-none{pointer-events:none}.lumia-scope .pointer-events-auto{pointer-events:auto}.lumia-scope .visible{visibility:visible}.lumia-scope .collapse{visibility:collapse}.lumia-scope .static{position:static}.lumia-scope .fixed{position:fixed}.lumia-scope .absolute{position:absolute}.lumia-scope .relative{position:relative}.lumia-scope .inset-0{inset:0}.lumia-scope .inset-y-0{top:0;bottom:0}.lumia-scope .-bottom-1{bottom:-.25rem}.lumia-scope .-right-1{right:-.25rem}.lumia-scope .bottom-full{bottom:100%}.lumia-scope .left-1{left:.25rem}.lumia-scope .left-1\\/2{left:50%}.lumia-scope .left-3{left:.75rem}.lumia-scope .left-4{left:1rem}.lumia-scope .left-\\[50\\%\\]{left:50%}.lumia-scope .right-2{right:.5rem}.lumia-scope .right-3{right:.75rem}.lumia-scope .right-4{right:1rem}.lumia-scope .top-1{top:.25rem}.lumia-scope .top-1\\/2{top:50%}.lumia-scope .top-3{top:.75rem}.lumia-scope .top-4{top:1rem}.lumia-scope .top-\\[50\\%\\]{top:50%}.lumia-scope .z-10{z-index:10}.lumia-scope .z-50{z-index:50}.lumia-scope .z-\\[2147483646\\]{z-index:2147483646}.lumia-scope .z-\\[2147483647\\]{z-index:2147483647}.lumia-scope .z-\\[60\\]{z-index:60}.lumia-scope .-m-px{margin:-1px}.lumia-scope .-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.lumia-scope .mx-auto{margin-left:auto;margin-right:auto}.lumia-scope .my-6{margin-top:1.5rem;margin-bottom:1.5rem}.lumia-scope .my-auto{margin-top:auto;margin-bottom:auto}.lumia-scope .-mt-5{margin-top:-1.25rem}.lumia-scope .mb-1{margin-bottom:.25rem}.lumia-scope .mb-1\\.5{margin-bottom:.375rem}.lumia-scope .mb-2{margin-bottom:.5rem}.lumia-scope .mb-3{margin-bottom:.75rem}.lumia-scope .mb-4{margin-bottom:1rem}.lumia-scope .mb-6{margin-bottom:1.5rem}.lumia-scope .mb-8{margin-bottom:2rem}.lumia-scope .ml-1{margin-left:.25rem}.lumia-scope .ml-2{margin-left:.5rem}.lumia-scope .ml-3{margin-left:.75rem}.lumia-scope .ml-4{margin-left:1rem}.lumia-scope .ml-auto{margin-left:auto}.lumia-scope .mr-1{margin-right:.25rem}.lumia-scope .mr-1\\.5{margin-right:.375rem}.lumia-scope .mr-2{margin-right:.5rem}.lumia-scope .mt-0{margin-top:0}.lumia-scope .mt-0\\.5{margin-top:.125rem}.lumia-scope .mt-1{margin-top:.25rem}.lumia-scope .mt-1\\.5{margin-top:.375rem}.lumia-scope .mt-2{margin-top:.5rem}.lumia-scope .mt-3{margin-top:.75rem}.lumia-scope .mt-4{margin-top:1rem}.lumia-scope .mt-6{margin-top:1.5rem}.lumia-scope .block{display:block}.lumia-scope .inline-block{display:inline-block}.lumia-scope .inline{display:inline}.lumia-scope .flex{display:flex}.lumia-scope .inline-flex{display:inline-flex}.lumia-scope .table{display:table}.lumia-scope .grid{display:grid}.lumia-scope .contents{display:contents}.lumia-scope .hidden{display:none}.lumia-scope .size-4{width:1rem;height:1rem}.lumia-scope .\\!h-5{height:1.25rem!important}.lumia-scope .\\!h-6{height:1.5rem!important}.lumia-scope .h-10{height:2.5rem}.lumia-scope .h-11{height:2.75rem}.lumia-scope .h-12{height:3rem}.lumia-scope .h-14{height:3.5rem}.lumia-scope .h-16{height:4rem}.lumia-scope .h-2{height:.5rem}.lumia-scope .h-2\\.5{height:.625rem}.lumia-scope .h-3{height:.75rem}.lumia-scope .h-3\\.5{height:.875rem}.lumia-scope .h-4{height:1rem}.lumia-scope .h-48{height:12rem}.lumia-scope .h-5{height:1.25rem}.lumia-scope .h-6{height:1.5rem}.lumia-scope .h-8{height:2rem}.lumia-scope .h-9{height:2.25rem}.lumia-scope .h-\\[32px\\]{height:32px}.lumia-scope .h-fit{height:-moz-fit-content;height:fit-content}.lumia-scope .h-full{height:100%}.lumia-scope .h-px{height:1px}.lumia-scope .max-h-24{max-height:6rem}.lumia-scope .max-h-96{max-height:24rem}.lumia-scope .max-h-\\[60vh\\]{max-height:60vh}.lumia-scope .max-h-\\[80vh\\]{max-height:80vh}.lumia-scope .\\!w-5{width:1.25rem!important}.lumia-scope .\\!w-6{width:1.5rem!important}.lumia-scope .w-10{width:2.5rem}.lumia-scope .w-12{width:3rem}.lumia-scope .w-16{width:4rem}.lumia-scope .w-2{width:.5rem}.lumia-scope .w-2\\.5{width:.625rem}.lumia-scope .w-3{width:.75rem}.lumia-scope .w-3\\.5{width:.875rem}.lumia-scope .w-4{width:1rem}.lumia-scope .w-48{width:12rem}.lumia-scope .w-5{width:1.25rem}.lumia-scope .w-6{width:1.5rem}.lumia-scope .w-8{width:2rem}.lumia-scope .w-9{width:2.25rem}.lumia-scope .w-full{width:100%}.lumia-scope .w-px{width:1px}.lumia-scope .min-w-0{min-width:0}.lumia-scope .min-w-16{min-width:4rem}.lumia-scope .min-w-24{min-width:6rem}.lumia-scope .min-w-32{min-width:8rem}.lumia-scope .min-w-\\[280px\\]{min-width:280px}.lumia-scope .max-w-2xl{max-width:42rem}.lumia-scope .max-w-\\[380px\\]{max-width:380px}.lumia-scope .max-w-\\[400px\\]{max-width:400px}.lumia-scope .max-w-\\[680px\\]{max-width:680px}.lumia-scope .max-w-full{max-width:100%}.lumia-scope .max-w-lg{max-width:32rem}.lumia-scope .max-w-md{max-width:28rem}.lumia-scope .max-w-sm{max-width:24rem}.lumia-scope .flex-1{flex:1 1 0%}.lumia-scope .flex-shrink{flex-shrink:1}.lumia-scope .flex-shrink-0,.lumia-scope .shrink-0{flex-shrink:0}.lumia-scope .border-collapse{border-collapse:collapse}.lumia-scope .-translate-x-1{--tw-translate-x:-0.25rem}.lumia-scope .-translate-x-1,.lumia-scope .-translate-x-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .-translate-x-1\\/2{--tw-translate-x:-50%}.lumia-scope .-translate-y-1{--tw-translate-y:-0.25rem}.lumia-scope .-translate-y-1,.lumia-scope .-translate-y-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .-translate-y-1\\/2{--tw-translate-y:-50%}.lumia-scope .translate-x-\\[-50\\%\\]{--tw-translate-x:-50%}.lumia-scope .translate-x-\\[-50\\%\\],.lumia-scope .translate-y-\\[-50\\%\\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .translate-y-\\[-50\\%\\]{--tw-translate-y:-50%}.lumia-scope .transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes glow-warning{0%,to{box-shadow:0 0 0 rgba(234,88,12,.5)}50%{box-shadow:0 0 20px rgba(234,88,12,.8)}}.lumia-scope .animate-glow-warning{animation:glow-warning 2s ease-in-out infinite}@keyframes pulse-warning{0%,to{opacity:1}50%{opacity:.6}}.lumia-scope .animate-pulse-warning{animation:pulse-warning 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.lumia-scope .animate-spin{animation:spin 1s linear infinite}.lumia-scope .cursor-not-allowed{cursor:not-allowed}.lumia-scope .cursor-pointer{cursor:pointer}.lumia-scope .select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.lumia-scope .resize{resize:both}.lumia-scope .list-inside{list-style-position:inside}.lumia-scope .list-disc{list-style-type:disc}.lumia-scope .grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lumia-scope .grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lumia-scope .grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lumia-scope .grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lumia-scope .grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lumia-scope .grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lumia-scope .grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lumia-scope .flex-row{flex-direction:row}.lumia-scope .flex-col{flex-direction:column}.lumia-scope .flex-col-reverse{flex-direction:column-reverse}.lumia-scope .flex-wrap{flex-wrap:wrap}.lumia-scope .items-start{align-items:flex-start}.lumia-scope .items-center{align-items:center}.lumia-scope .justify-start{justify-content:flex-start}.lumia-scope .justify-end{justify-content:flex-end}.lumia-scope .justify-center{justify-content:center}.lumia-scope .justify-between{justify-content:space-between}.lumia-scope .gap-0{gap:0}.lumia-scope .gap-1{gap:.25rem}.lumia-scope .gap-2{gap:.5rem}.lumia-scope .gap-3{gap:.75rem}.lumia-scope .gap-4{gap:1rem}.lumia-scope :is(.space-x-1>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-3>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-4>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-y-0>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-0\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-2>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-2\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-3>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-3\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-4>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-6>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.lumia-scope .overflow-auto{overflow:auto}.lumia-scope .overflow-hidden{overflow:hidden}.lumia-scope .overflow-visible{overflow:visible}.lumia-scope .overflow-y-auto{overflow-y:auto}.lumia-scope .truncate{overflow:hidden;text-overflow:ellipsis}.lumia-scope .truncate,.lumia-scope .whitespace-nowrap{white-space:nowrap}.lumia-scope .whitespace-pre-line{white-space:pre-line}.lumia-scope .whitespace-pre-wrap{white-space:pre-wrap}.lumia-scope .break-words{overflow-wrap:break-word}.lumia-scope .break-all{word-break:break-all}.lumia-scope .rounded{border-radius:.25rem}.lumia-scope .rounded-2xl{border-radius:1rem}.lumia-scope .rounded-3xl{border-radius:1.5rem}.lumia-scope .rounded-full{border-radius:9999px}.lumia-scope .rounded-lg{border-radius:var(--radius)}.lumia-scope .rounded-md{border-radius:calc(var(--radius) - 2px)}.lumia-scope .rounded-sm{border-radius:calc(var(--radius) - 4px)}.lumia-scope .rounded-xl{border-radius:.75rem}.lumia-scope .border{border-width:1px}.lumia-scope .border-0{border-width:0}.lumia-scope .border-2{border-width:2px}.lumia-scope .border-b{border-bottom-width:1px}.lumia-scope .border-b-2{border-bottom-width:2px}.lumia-scope .border-t{border-top-width:1px}.lumia-scope .border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity,1))}.lumia-scope .border-amber-300{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity,1))}.lumia-scope .border-amber-400{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity,1))}.lumia-scope .border-amber-500{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity,1))}.lumia-scope .border-amber-500\\/30{border-color:rgba(245,158,11,.3)}.lumia-scope .border-amber-500\\/40{border-color:rgba(245,158,11,.4)}.lumia-scope .border-amber-900{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity,1))}.lumia-scope .border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.lumia-scope .border-blue-400{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity,1))}.lumia-scope .border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.lumia-scope .border-blue-500\\/30{border-color:rgba(59,130,246,.3)}.lumia-scope .border-blue-600{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity,1))}.lumia-scope .border-blue-800{--tw-border-opacity:1;border-color:rgb(30 64 175/var(--tw-border-opacity,1))}.lumia-scope .border-blue-900{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity,1))}.lumia-scope .border-blue-900\\/40{border-color:rgba(30,58,138,.4)}.lumia-scope .border-border{border-color:hsl(var(--border))}.lumia-scope .border-current{border-color:currentColor}.lumia-scope .border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.lumia-scope .border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.lumia-scope .border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.lumia-scope .border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity,1))}.lumia-scope .border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity,1))}.lumia-scope .border-green-500{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity,1))}.lumia-scope .border-green-500\\/40{border-color:rgba(34,197,94,.4)}.lumia-scope .border-green-800{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity,1))}.lumia-scope .border-green-900{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity,1))}.lumia-scope .border-green-900\\/60{border-color:rgba(20,83,45,.6)}.lumia-scope .border-input{border-color:hsl(var(--input))}.lumia-scope .border-orange-200{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity,1))}.lumia-scope .border-orange-800{--tw-border-opacity:1;border-color:rgb(154 52 18/var(--tw-border-opacity,1))}.lumia-scope .border-orange-900{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity,1))}.lumia-scope .border-purple-200{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity,1))}.lumia-scope .border-purple-800{--tw-border-opacity:1;border-color:rgb(107 33 168/var(--tw-border-opacity,1))}.lumia-scope .border-purple-900{--tw-border-opacity:1;border-color:rgb(88 28 135/var(--tw-border-opacity,1))}.lumia-scope .border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.lumia-scope .border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity,1))}.lumia-scope .border-red-400{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity,1))}.lumia-scope .border-red-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity,1))}.lumia-scope .border-red-500\\/40{border-color:rgba(239,68,68,.4)}.lumia-scope .border-red-800{--tw-border-opacity:1;border-color:rgb(153 27 27/var(--tw-border-opacity,1))}.lumia-scope .border-red-800\\/80{border-color:rgba(153,27,27,.8)}.lumia-scope .border-red-900{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity,1))}.lumia-scope .border-red-900\\/60{border-color:rgba(127,29,29,.6)}.lumia-scope .border-sky-200{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity,1))}.lumia-scope .border-sky-800{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity,1))}.lumia-scope .border-sky-900{--tw-border-opacity:1;border-color:rgb(12 74 110/var(--tw-border-opacity,1))}.lumia-scope .border-transparent{border-color:transparent}.lumia-scope .border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.lumia-scope .border-t-transparent{border-top-color:transparent}.lumia-scope .\\!bg-transparent{background-color:transparent!important}.lumia-scope .bg-\\[\\#0088cc\\]{--tw-bg-opacity:1;background-color:rgb(0 136 204/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#2456f0\\]{--tw-bg-opacity:1;background-color:rgb(36 86 240/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#db2777\\]{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#fde2f3\\]{--tw-bg-opacity:1;background-color:rgb(253 226 243/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-500\\/10{background-color:rgba(245,158,11,.1)}.lumia-scope .bg-amber-500\\/15{background-color:rgba(245,158,11,.15)}.lumia-scope .bg-amber-900{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-950{--tw-bg-opacity:1;background-color:rgb(69 26 3/var(--tw-bg-opacity,1))}.lumia-scope .bg-background{background-color:hsl(var(--background))}.lumia-scope .bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.lumia-scope .bg-black\\/50{background-color:rgba(0,0,0,.5)}.lumia-scope .bg-black\\/80{background-color:rgba(0,0,0,.8)}.lumia-scope .bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50\\/50{background-color:rgba(239,246,255,.5)}.lumia-scope .bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-500\\/10{background-color:rgba(59,130,246,.1)}.lumia-scope .bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-900{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-900\\/20{background-color:rgba(30,58,138,.2)}.lumia-scope .bg-blue-900\\/30{background-color:rgba(30,58,138,.3)}.lumia-scope .bg-blue-900\\/40{background-color:rgba(30,58,138,.4)}.lumia-scope .bg-blue-950{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity,1))}.lumia-scope .bg-card{background-color:hsl(var(--card))}.lumia-scope .bg-destructive{background-color:hsl(var(--destructive))}.lumia-scope .bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800\\/50{background-color:rgba(31,41,55,.5)}.lumia-scope .bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-500\\/15{background-color:rgba(34,197,94,.15)}.lumia-scope .bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900\\/30{background-color:rgba(20,83,45,.3)}.lumia-scope .bg-green-950{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-950\\/50{background-color:rgba(5,46,22,.5)}.lumia-scope .bg-orange-100{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-700{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-800{--tw-bg-opacity:1;background-color:rgb(154 52 18/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-900{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-950{--tw-bg-opacity:1;background-color:rgb(67 20 7/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-100{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-200{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-600{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity,1))}.lumia-scope .bg-primary{background-color:hsl(var(--primary))}.lumia-scope .bg-purple-100{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-200{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50\\/50{background-color:rgba(250,245,255,.5)}.lumia-scope .bg-purple-500{--tw-bg-opacity:1;background-color:rgb(168 85 247/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-500\\/10{background-color:rgba(168,85,247,.1)}.lumia-scope .bg-purple-700{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-950{--tw-bg-opacity:1;background-color:rgb(59 7 100/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-500\\/15{background-color:rgba(239,68,68,.15)}.lumia-scope .bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-700\\/80{background-color:rgba(185,28,28,.8)}.lumia-scope .bg-red-900{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-900\\/30{background-color:rgba(127,29,29,.3)}.lumia-scope .bg-red-950{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-950\\/50{background-color:rgba(69,10,10,.5)}.lumia-scope .bg-red-950\\/90{background-color:rgba(69,10,10,.9)}.lumia-scope .bg-secondary{background-color:hsl(var(--secondary))}.lumia-scope .bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-50\\/50{background-color:rgba(240,249,255,.5)}.lumia-scope .bg-sky-500{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-500\\/10{background-color:rgba(14,165,233,.1)}.lumia-scope .bg-sky-950{--tw-bg-opacity:1;background-color:rgb(8 47 73/var(--tw-bg-opacity,1))}.lumia-scope .bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.lumia-scope .bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity,1))}.lumia-scope .bg-transparent{background-color:transparent}.lumia-scope .bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.lumia-scope .bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.lumia-scope .bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.lumia-scope .from-purple-100{--tw-gradient-from:#f3e8ff var(--tw-gradient-from-position);--tw-gradient-to:rgba(243,232,255,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .from-purple-500{--tw-gradient-from:#a855f7 var(--tw-gradient-from-position);--tw-gradient-to:rgba(168,85,247,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .from-purple-600{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .to-blue-100{--tw-gradient-to:#dbeafe var(--tw-gradient-to-position)}.lumia-scope .to-blue-500{--tw-gradient-to:#3b82f6 var(--tw-gradient-to-position)}.lumia-scope .to-blue-600{--tw-gradient-to:#2563eb var(--tw-gradient-to-position)}.lumia-scope .object-contain{-o-object-fit:contain;object-fit:contain}.lumia-scope .object-cover{-o-object-fit:cover;object-fit:cover}.lumia-scope .p-0{padding:0}.lumia-scope .p-1{padding:.25rem}.lumia-scope .p-2{padding:.5rem}.lumia-scope .p-2\\.5{padding:.625rem}.lumia-scope .p-3{padding:.75rem}.lumia-scope .p-4{padding:1rem}.lumia-scope .p-5{padding:1.25rem}.lumia-scope .p-6{padding:1.5rem}.lumia-scope .p-8{padding:2rem}.lumia-scope .px-12{padding-left:3rem;padding-right:3rem}.lumia-scope .px-2{padding-left:.5rem;padding-right:.5rem}.lumia-scope .px-2\\.5{padding-left:.625rem;padding-right:.625rem}.lumia-scope .px-3{padding-left:.75rem;padding-right:.75rem}.lumia-scope .px-4{padding-left:1rem;padding-right:1rem}.lumia-scope .px-6{padding-left:1.5rem;padding-right:1.5rem}.lumia-scope .px-8{padding-left:2rem;padding-right:2rem}.lumia-scope .py-0{padding-top:0;padding-bottom:0}.lumia-scope .py-0\\.5{padding-top:.125rem;padding-bottom:.125rem}.lumia-scope .py-1{padding-top:.25rem;padding-bottom:.25rem}.lumia-scope .py-1\\.5{padding-top:.375rem;padding-bottom:.375rem}.lumia-scope .py-2{padding-top:.5rem;padding-bottom:.5rem}.lumia-scope .py-3{padding-top:.75rem;padding-bottom:.75rem}.lumia-scope .py-4{padding-top:1rem;padding-bottom:1rem}.lumia-scope .py-8{padding-top:2rem;padding-bottom:2rem}.lumia-scope .pb-3{padding-bottom:.75rem}.lumia-scope .pb-4{padding-bottom:1rem}.lumia-scope .pl-11{padding-left:2.75rem}.lumia-scope .pr-10{padding-right:2.5rem}.lumia-scope .pr-16{padding-right:4rem}.lumia-scope .pt-0{padding-top:0}.lumia-scope .pt-2{padding-top:.5rem}.lumia-scope .pt-3{padding-top:.75rem}.lumia-scope .pt-4{padding-top:1rem}.lumia-scope .text-left{text-align:left}.lumia-scope .text-center{text-align:center}.lumia-scope .text-right{text-align:right}.lumia-scope .font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.lumia-scope .font-sans{font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.lumia-scope .text-2xl{font-size:1.5rem;line-height:2rem}.lumia-scope .text-3xl{font-size:1.875rem;line-height:2.25rem}.lumia-scope .text-\\[10px\\]{font-size:10px}.lumia-scope .text-\\[11px\\]{font-size:11px}.lumia-scope .text-base{font-size:1rem;line-height:1.5rem}.lumia-scope .text-lg{font-size:1.125rem;line-height:1.75rem}.lumia-scope .text-sm{font-size:.875rem;line-height:1.25rem}.lumia-scope .text-xl{font-size:1.25rem;line-height:1.75rem}.lumia-scope .text-xs{font-size:.75rem;line-height:1rem}.lumia-scope .font-bold{font-weight:700}.lumia-scope .font-medium{font-weight:500}.lumia-scope .font-semibold{font-weight:600}.lumia-scope .italic{font-style:italic}.lumia-scope .leading-none{line-height:1}.lumia-scope .leading-relaxed{line-height:1.625}.lumia-scope .leading-tight{line-height:1.25}.lumia-scope .tracking-tight{letter-spacing:-.025em}.lumia-scope .text-amber-100{--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity,1))}.lumia-scope .text-amber-200{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity,1))}.lumia-scope .text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity,1))}.lumia-scope .text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.lumia-scope .text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity,1))}.lumia-scope .text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity,1))}.lumia-scope .text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}.lumia-scope .text-amber-900{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity,1))}.lumia-scope .text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400\\/80{color:rgba(96,165,250,.8)}.lumia-scope .text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.lumia-scope .text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .text-card-foreground{color:hsl(var(--card-foreground))}.lumia-scope .text-destructive{color:hsl(var(--destructive))}.lumia-scope .text-destructive-foreground{color:hsl(var(--destructive-foreground))}.lumia-scope .text-foreground{color:hsl(var(--foreground))}.lumia-scope .text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.lumia-scope .text-green-200{--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity,1))}.lumia-scope .text-green-300{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity,1))}.lumia-scope .text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity,1))}.lumia-scope .text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.lumia-scope .text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.lumia-scope .text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.lumia-scope .text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity,1))}.lumia-scope .text-indigo-400{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity,1))}.lumia-scope .text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.lumia-scope .text-muted-foreground{color:hsl(var(--muted-foreground))}.lumia-scope .text-orange-100{--tw-text-opacity:1;color:rgb(255 237 213/var(--tw-text-opacity,1))}.lumia-scope .text-orange-200{--tw-text-opacity:1;color:rgb(254 215 170/var(--tw-text-opacity,1))}.lumia-scope .text-orange-300{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity,1))}.lumia-scope .text-orange-400{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity,1))}.lumia-scope .text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity,1))}.lumia-scope .text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity,1))}.lumia-scope .text-orange-700{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity,1))}.lumia-scope .text-primary{color:hsl(var(--primary))}.lumia-scope .text-primary-foreground{color:hsl(var(--primary-foreground))}.lumia-scope .text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity,1))}.lumia-scope .text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity,1))}.lumia-scope .text-purple-500{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity,1))}.lumia-scope .text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity,1))}.lumia-scope .text-red-100{--tw-text-opacity:1;color:rgb(254 226 226/var(--tw-text-opacity,1))}.lumia-scope .text-red-200{--tw-text-opacity:1;color:rgb(254 202 202/var(--tw-text-opacity,1))}.lumia-scope .text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.lumia-scope .text-red-300\\/95{color:hsla(0,94%,82%,.95)}.lumia-scope .text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .text-red-400\\/80{color:hsla(0,91%,71%,.8)}.lumia-scope .text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.lumia-scope .text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.lumia-scope .text-red-600\\/90{color:rgba(220,38,38,.9)}.lumia-scope .text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.lumia-scope .text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity,1))}.lumia-scope .text-secondary-foreground{color:hsl(var(--secondary-foreground))}.lumia-scope .text-sky-400{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity,1))}.lumia-scope .text-sky-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity,1))}.lumia-scope .text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.lumia-scope .text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity,1))}.lumia-scope .underline{text-decoration-line:underline}.lumia-scope .underline-offset-4{text-underline-offset:4px}.lumia-scope .opacity-0{opacity:0}.lumia-scope .opacity-100{opacity:1}.lumia-scope .opacity-40{opacity:.4}.lumia-scope .shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.lumia-scope .shadow,.lumia-scope .shadow-2xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.lumia-scope .shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.lumia-scope .shadow-lg,.lumia-scope .shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.lumia-scope .outline{outline-style:solid}.lumia-scope .ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.lumia-scope .blur{--tw-blur:blur(8px)}.lumia-scope .blur,.lumia-scope .filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.lumia-scope .backdrop-blur{--tw-backdrop-blur:blur(8px)}.lumia-scope .backdrop-blur,.lumia-scope .backdrop-blur-sm{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.lumia-scope .backdrop-filter{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .duration-200{transition-duration:.2s}.lumia-scope .ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.lumia-scope .\\[background\\:var\\(--lumia-bg\\)\\]{background:var(--lumia-bg)}.lumia-scope .\\[border-color\\:var\\(--lumia-border\\)\\]{border-color:var(--lumia-border)}.lumia-scope .\\[color\\:var\\(--lumia-text\\)\\]{color:var(--lumia-text)}.lumia-scope .\\[color\\:var\\(--lumia-text-muted\\)\\]{color:var(--lumia-text-muted)}.lumia-scope .\\[color\\:var\\(--lumia-text-secondary\\)\\]{color:var(--lumia-text-secondary)}.lumia-scope .file\\:mr-3::file-selector-button{margin-right:.75rem}.lumia-scope .file\\:cursor-pointer::file-selector-button{cursor:pointer}.lumia-scope .file\\:rounded::file-selector-button{border-radius:.25rem}.lumia-scope .file\\:border-0::file-selector-button{border-width:0}.lumia-scope .file\\:bg-purple-600::file-selector-button{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity,1))}.lumia-scope .file\\:bg-transparent::file-selector-button{background-color:transparent}.lumia-scope .file\\:px-3::file-selector-button{padding-left:.75rem;padding-right:.75rem}.lumia-scope .file\\:py-1\\.5::file-selector-button{padding-top:.375rem;padding-bottom:.375rem}.lumia-scope .file\\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.lumia-scope .file\\:text-xs::file-selector-button{font-size:.75rem;line-height:1rem}.lumia-scope .file\\:font-medium::file-selector-button{font-weight:500}.lumia-scope .file\\:text-white::file-selector-button{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-500::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .hover\\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .hover\\:bg-\\[\\#0077bb\\]:hover{--tw-bg-opacity:1;background-color:rgb(0 119 187/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#1e49d8\\]:hover{--tw-bg-opacity:1;background-color:rgb(30 73 216/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#be185d\\]:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#f7c1df\\]:hover{--tw-bg-opacity:1;background-color:rgb(247 193 223/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-accent:hover{background-color:hsl(var(--accent))}.lumia-scope .hover\\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-900\\/60:hover{background-color:rgba(30,58,138,.6)}.lumia-scope .hover\\:bg-destructive\\/90:hover{background-color:hsl(var(--destructive)/.9)}.lumia-scope .hover\\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-900\\/30:hover{background-color:rgba(20,83,45,.3)}.lumia-scope .hover\\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-primary\\/80:hover{background-color:hsl(var(--primary)/.8)}.lumia-scope .hover\\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-600\\/90:hover{background-color:rgba(220,38,38,.9)}.lumia-scope .hover\\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-900\\/20:hover{background-color:rgba(127,29,29,.2)}.lumia-scope .hover\\:bg-secondary\\/80:hover{background-color:hsl(var(--secondary)/.8)}.lumia-scope .hover\\:bg-slate-800:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:from-purple-600:hover{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .hover\\:from-purple-700:hover{--tw-gradient-from:#7e22ce var(--tw-gradient-from-position);--tw-gradient-to:rgba(126,34,206,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .hover\\:to-blue-700:hover{--tw-gradient-to:#1d4ed8 var(--tw-gradient-to-position)}.lumia-scope .hover\\:text-blue-300:hover{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-400:hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-600:hover{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-800:hover{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-800:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-300:hover{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-400:hover{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-600:hover{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-700:hover{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .hover\\:underline:hover{text-decoration-line:underline}.lumia-scope .hover\\:no-underline:hover{text-decoration-line:none}.lumia-scope .hover\\:opacity-80:hover{opacity:.8}.lumia-scope .hover\\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .hover\\:file\\:bg-purple-700::file-selector-button:hover{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity,1))}.lumia-scope .focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus\\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus\\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.lumia-scope .focus\\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity,1))}.lumia-scope .focus\\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.lumia-scope .focus\\:ring-offset-2:focus{--tw-ring-offset-width:2px}.lumia-scope .focus-visible\\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus-visible\\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus-visible\\:ring-blue-500:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.lumia-scope .focus-visible\\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.lumia-scope .focus-visible\\:ring-offset-0:focus-visible{--tw-ring-offset-width:0px}.lumia-scope .focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.lumia-scope .disabled\\:pointer-events-none:disabled{pointer-events:none}.lumia-scope .disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.lumia-scope .disabled\\:opacity-100:disabled{opacity:1}.lumia-scope .disabled\\:opacity-50:disabled{opacity:.5}.lumia-scope :is(.group:hover .group-hover\\:opacity-100){opacity:1}@media (min-width:640px){.lumia-scope .sm\\:mt-0{margin-top:0}.lumia-scope .sm\\:flex-row{flex-direction:row}.lumia-scope .sm\\:justify-end{justify-content:flex-end}.lumia-scope :is(.sm\\:space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope .sm\\:rounded-lg{border-radius:var(--radius)}.lumia-scope .sm\\:text-left{text-align:left}}@media (prefers-color-scheme:dark){.lumia-scope .dark\\:border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .dark\\:bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .dark\\:text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .dark\\:text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .dark\\:placeholder\\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .dark\\:placeholder\\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .dark\\:hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .dark\\:focus\\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(75 85 99/var(--tw-ring-opacity,1))}}.lumia-scope :is(.\\[\\&_svg\\]\\:pointer-events-none svg){pointer-events:none}.lumia-scope :is(.\\[\\&_svg\\]\\:size-4 svg){width:1rem;height:1rem}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!h-5 svg){height:1.25rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!h-6 svg){height:1.5rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!w-5 svg){width:1.25rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!w-6 svg){width:1.5rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:shrink-0 svg){flex-shrink:0}","import React from 'react';\n\nexport type AccountSession = import('../internal/clients/account').AccountSession;\n\ninterface SessionState {\n session: AccountSession | null;\n address: `0x${string}` | null;\n status: string;\n error: string | null;\n recoveryUserId: string | null;\n isRecoveryModalOpen: boolean;\n setSession: (s: AccountSession | null) => void;\n setAddress: (a: `0x${string}` | null) => void;\n setStatus: (s: string) => void;\n setError: (e: string | null) => void;\n setRecoveryUserId: (userId: string | null) => void;\n setIsRecoveryModalOpen: (open: boolean) => void;\n}\n\nconst LumiaSessionContext = React.createContext<SessionState | undefined>(undefined);\n\nexport interface LumiaSessionProviderProps { children: React.ReactNode }\n\nexport const LumiaSessionProvider: React.FC<LumiaSessionProviderProps>\n = ({ children }) => {\n const [session, setSession] = React.useState<AccountSession | null>(null);\n const [address, setAddress] = React.useState<`0x${string}` | null>(null);\n const [status, setStatus] = React.useState<string>('idle');\n const [error, setError] = React.useState<string | null>(null);\n const [recoveryUserId, setRecoveryUserId] = React.useState<string | null>(null);\n const [isRecoveryModalOpen, setIsRecoveryModalOpen] = React.useState<boolean>(false);\n\n const value = React.useMemo(() => ({\n session, address, status, error, recoveryUserId, isRecoveryModalOpen,\n setSession, setAddress, setStatus, setError, setRecoveryUserId, setIsRecoveryModalOpen,\n }), [session, address, status, error, recoveryUserId, isRecoveryModalOpen]);\n\n return <LumiaSessionContext.Provider value={value}>{children}</LumiaSessionContext.Provider>;\n};\n\nexport function useLumiaSession() {\n const ctx = React.useContext(LumiaSessionContext);\n if (!ctx) throw new Error('useLumiaSession must be used within LumiaSessionProvider');\n return ctx;\n}\n","import React from 'react';\nimport '@rainbow-me/rainbowkit/styles.css';\nimport { RainbowKitProvider, Theme, lightTheme, darkTheme } from '@rainbow-me/rainbowkit';\nimport { WagmiProvider } from 'wagmi';\nimport { QueryClientProvider } from '@tanstack/react-query';\nimport { createRainbowConfig, rainbowTheme } from '../config/rainbowkit';\nimport { queryClient } from '../config/wagmi';\nimport { useTheme } from '../internal/hooks/useTheme';\nimport { useLumiaPassportConfig } from './LumiaPassportContext';\n\nexport interface LumiaRainbowKitProviderProps {\n children: React.ReactNode;\n}\n\nexport const LumiaRainbowKitProvider: React.FC<LumiaRainbowKitProviderProps> = ({ children }) => {\n const { config } = useLumiaPassportConfig();\n const { isDark } = useTheme(config.ui.theme, config.ui.colors);\n\n // Create config with projectId from Lumia config\n const rainbowConfig = React.useMemo(() => {\n return createRainbowConfig(config.wallet?.walletConnectProjectId);\n }, [config.wallet?.walletConnectProjectId]);\n\n // Merge custom theme with RainbowKit theme\n const customTheme: Theme = React.useMemo(() => isDark\n ? {\n ...darkTheme(),\n colors: {\n ...darkTheme().colors,\n ...rainbowTheme.darkMode.colors,\n },\n shadows: rainbowTheme.darkMode.shadows,\n radii: rainbowTheme.darkMode.radii,\n }\n : {\n ...lightTheme(),\n colors: {\n ...lightTheme().colors,\n ...rainbowTheme.lightMode.colors,\n },\n shadows: rainbowTheme.lightMode.shadows,\n radii: rainbowTheme.lightMode.radii,\n }, [isDark]);\n\n // Check if wallet provider is enabled\n const isWalletEnabled = config.wallet?.enabled ?? false;\n\n // If wallet is not enabled, just render children without RainbowKit\n if (!isWalletEnabled) {\n return <>{children}</>;\n }\n\n return (\n <WagmiProvider config={rainbowConfig}>\n {/* <QueryClientProvider client={queryClient}> */}\n <RainbowKitProvider\n theme={customTheme}\n modalSize=\"compact\"\n showRecentTransactions={true}\n >\n {children}\n </RainbowKitProvider>\n {/* </QueryClientProvider> */}\n </WagmiProvider>\n );\n};","import { getDefaultConfig } from '@rainbow-me/rainbowkit';\nimport {\n mainnet,\n polygon,\n bsc,\n arbitrum,\n optimism,\n avalanche,\n base,\n zora\n} from 'wagmi/chains';\nimport { lumiaBeam } from '../internal/clients/base';\n\n// Get WalletConnect project ID from environment or use default\nconst getProjectId = (configProjectId?: string) => {\n // First check if provided via config\n if (configProjectId) {\n return configProjectId;\n }\n\n // Check various possible environment variable formats\n if (typeof window !== 'undefined') {\n // Browser environment\n return (window as any).NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID ||\n (window as any).VITE_WALLET_CONNECT_PROJECT_ID ||\n (window as any).__WALLET_CONNECT_PROJECT_ID__ ||\n 'YOUR_PROJECT_ID';\n }\n\n // Default fallback - this will work for testing but not production\n return 'YOUR_PROJECT_ID';\n};\n\n// Create RainbowKit configuration with all popular chains\nexport const createRainbowConfig = (projectId?: string): ReturnType<typeof getDefaultConfig> => {\n return getDefaultConfig({\n appName: 'Lumia Passport',\n projectId: getProjectId(projectId),\n chains: [\n lumiaBeam, // Lumia chain first\n mainnet,\n polygon,\n bsc,\n arbitrum,\n optimism,\n avalanche,\n base,\n zora\n ],\n ssr: false, // Set to true if using SSR\n });\n};\n\n// Default config for backwards compatibility\nexport const rainbowConfig: ReturnType<typeof getDefaultConfig> = createRainbowConfig();\n\n// Custom theme for RainbowKit to match Lumia design\nexport const rainbowTheme = {\n lightMode: {\n colors: {\n accentColor: '#6366F1',\n accentColorForeground: 'white',\n actionButtonBorder: 'rgba(255, 255, 255, 0.04)',\n actionButtonBorderMobile: 'rgba(255, 255, 255, 0.08)',\n actionButtonSecondaryBackground: 'rgba(255, 255, 255, 0.08)',\n closeButton: 'rgba(60, 66, 82, 0.8)',\n closeButtonBackground: 'rgba(255, 255, 255, 0.08)',\n connectButtonBackground: 'white',\n connectButtonBackgroundError: '#FF494A',\n connectButtonInnerBackground: 'linear-gradient(0deg, rgba(255, 255, 255, 0.075), rgba(255, 255, 255, 0.15))',\n connectButtonText: '#1A1B1F',\n connectButtonTextError: 'white',\n connectionIndicator: '#30E000',\n downloadBottomCardBackground: 'linear-gradient(126deg, rgba(0, 0, 0, 0) 9.49%, rgba(120, 120, 120, 0.2) 71.04%), #FFFFFF',\n downloadTopCardBackground: 'linear-gradient(126deg, rgba(120, 120, 120, 0.2) 9.49%, rgba(0, 0, 0, 0) 71.04%), white',\n error: '#FF494A',\n generalBorder: 'rgba(0, 0, 0, 0.06)',\n generalBorderDim: 'rgba(0, 0, 0, 0.03)',\n menuItemBackground: 'rgba(60, 66, 82, 0.1)',\n modalBackdrop: 'rgba(0, 0, 0, 0.3)',\n modalBackground: 'white',\n modalBorder: 'rgba(0, 0, 0, 0.06)',\n modalText: '#1A1B1F',\n modalTextDim: 'rgba(60, 66, 82, 0.3)',\n modalTextSecondary: 'rgba(60, 66, 82, 0.6)',\n profileAction: 'white',\n profileActionHover: 'rgba(255, 255, 255, 0.08)',\n profileForeground: 'rgba(60, 66, 82, 0.06)',\n selectedOptionBorder: 'rgba(60, 66, 82, 0.1)',\n standby: '#FFD641',\n },\n shadows: {\n connectButton: '0px 4px 12px rgba(0, 0, 0, 0.1)',\n dialog: '0px 8px 32px rgba(0, 0, 0, 0.32)',\n profileDetailsAction: '0px 2px 6px rgba(37, 41, 46, 0.04)',\n selectedOption: '0px 2px 6px rgba(0, 0, 0, 0.24)',\n selectedWallet: '0px 2px 6px rgba(0, 0, 0, 0.12)',\n walletLogo: '0px 2px 16px rgba(0, 0, 0, 0.16)',\n },\n radii: {\n actionButton: '24px',\n connectButton: '24px',\n menuButton: '12px',\n modal: '24px',\n modalMobile: '24px',\n },\n },\n darkMode: {\n colors: {\n accentColor: '#6366F1',\n accentColorForeground: 'white',\n actionButtonBorder: 'rgba(255, 255, 255, 0.04)',\n actionButtonBorderMobile: 'rgba(255, 255, 255, 0.08)',\n actionButtonSecondaryBackground: 'rgba(255, 255, 255, 0.08)',\n closeButton: 'rgba(224, 232, 255, 0.6)',\n closeButtonBackground: 'rgba(255, 255, 255, 0.08)',\n connectButtonBackground: '#1A1B1F',\n connectButtonBackgroundError: '#FF494A',\n connectButtonInnerBackground: 'linear-gradient(0deg, rgba(255, 255, 255, 0.075), rgba(255, 255, 255, 0.15))',\n connectButtonText: 'white',\n connectButtonTextError: 'white',\n connectionIndicator: '#30E000',\n downloadBottomCardBackground: 'linear-gradient(126deg, rgba(255, 255, 255, 0) 9.49%, rgba(120, 120, 120, 0.1) 71.04%), #1A1B1F',\n downloadTopCardBackground: 'linear-gradient(126deg, rgba(120, 120, 120, 0.1) 9.49%, rgba(255, 255, 255, 0) 71.04%), #1A1B1F',\n error: '#FF494A',\n generalBorder: 'rgba(255, 255, 255, 0.08)',\n generalBorderDim: 'rgba(255, 255, 255, 0.04)',\n menuItemBackground: 'rgba(224, 232, 255, 0.1)',\n modalBackdrop: 'rgba(0, 0, 0, 0.5)',\n modalBackground: '#1A1B1F',\n modalBorder: 'rgba(255, 255, 255, 0.08)',\n modalText: 'white',\n modalTextDim: 'rgba(224, 232, 255, 0.3)',\n modalTextSecondary: 'rgba(224, 232, 255, 0.6)',\n profileAction: '#1A1B1F',\n profileActionHover: 'rgba(224, 232, 255, 0.1)',\n profileForeground: 'rgba(224, 232, 255, 0.06)',\n selectedOptionBorder: 'rgba(224, 232, 255, 0.1)',\n standby: '#FFD641',\n },\n shadows: {\n connectButton: '0px 4px 12px rgba(0, 0, 0, 0.1)',\n dialog: '0px 8px 32px rgba(0, 0, 0, 0.32)',\n profileDetailsAction: '0px 2px 6px rgba(37, 41, 46, 0.04)',\n selectedOption: '0px 2px 6px rgba(0, 0, 0, 0.24)',\n selectedWallet: '0px 2px 6px rgba(0, 0, 0, 0.12)',\n walletLogo: '0px 2px 16px rgba(0, 0, 0, 0.16)',\n },\n radii: {\n actionButton: '24px',\n connectButton: '24px',\n menuButton: '12px',\n modal: '24px',\n modalMobile: '24px',\n },\n },\n};","import React from 'react';\nimport { flushSync } from 'react-dom';\nimport { useBalance } from 'wagmi';\n\nimport { Button } from '../internal/components/ui/button';\nimport { Dialog, DialogContent, DialogTitle, DialogDescription } from '../internal/components/ui/dialog';\nimport { VisuallyHidden } from '../internal/components/ui/visually-hidden';\nimport { AuthModal } from '../internal/components/AuthModal';\nimport { TssManagerWithRef, type TssManagerRef } from '../internal/components/TssManager';\nimport { ManageWallet } from '../internal/components/ManageWallet';\nimport { SecurityModal } from '../internal/components/SecurityModal';\nimport KeyshareBackup from '../internal/components/KeyshareBackup';\nimport { TransactionsModal } from '../internal/components/TransactionsModal';\nimport { ViewAssetsModal } from '../internal/components/ViewAssetsModal';\nimport { SendModal } from '../internal/components/SendModal';\nimport { ReceiveModal } from '../internal/components/ReceiveModal';\nimport { BuyModal } from '../internal/components/BuyModal';\nimport { KycModal } from '../internal/components/KycModal';\nimport { jwtTokenManager, verifyToken, ensureValidToken } from '../internal/auth';\nimport { getBackupStatus } from '../internal/vaultClient';\nimport { Cloud, Laptop, Shield, Copy, ArrowUp, ArrowDown, Plus, Activity, Gem, CreditCard, Lock, ArrowUpRight, AlertTriangle, ShieldCheck } from 'lucide-react';\nimport { useLumiaPassportConfig } from '../context/LumiaPassportContext';\nimport { useTheme } from '../internal/hooks/useTheme';\nimport { useLumiaSession } from '../context/LumiaPassportSessionContext';\nimport { lumiaBeam, LUMIA_EXPLORER_URL } from '../internal/clients/base';\nimport { LumiaLogo } from '../internal/components/LumiaLogo';\nimport { useLumiaPassportLinkedProfiles } from '../modules/linkedProfiles';\nimport packageJson from '../../package.json';\n\nexport interface ConnectWalletButtonProps {\n className?: string;\n label?: string;\n usePaymaster?: boolean;\n authOpen?: boolean;\n mode?: 'default' | 'compact';\n callbacks?: import('../context/LumiaPassportContext').LumiaPassportCallbacks;\n onConnected?: (params: { address: `0x${string}`; session: any }) => void;\n}\n\nexport const ConnectWalletButton: React.FC<ConnectWalletButtonProps> = ({\n className,\n label = 'Connect Wallet',\n usePaymaster = true,\n authOpen,\n mode = 'default',\n callbacks: buttonCallbacks,\n onConnected,\n}) => {\n console.log('[ConnectWalletButton] Component rendering');\n const { config, callbacks: contextCallbacks } = useLumiaPassportConfig() as any;\n\n // Merge callbacks: button props override context callbacks\n const callbacks = React.useMemo(() => ({\n onLumiaPassportConnecting: buttonCallbacks?.onLumiaPassportConnecting ?? contextCallbacks?.onLumiaPassportConnecting,\n onLumiaPassportConnect: buttonCallbacks?.onLumiaPassportConnect ?? contextCallbacks?.onLumiaPassportConnect,\n onLumiaPassportAccount: buttonCallbacks?.onLumiaPassportAccount ?? contextCallbacks?.onLumiaPassportAccount,\n onLumiaPassportUpdate: buttonCallbacks?.onLumiaPassportUpdate ?? contextCallbacks?.onLumiaPassportUpdate,\n onLumiaPassportDisconnect: buttonCallbacks?.onLumiaPassportDisconnect ?? contextCallbacks?.onLumiaPassportDisconnect,\n onLumiaPassportError: buttonCallbacks?.onLumiaPassportError ?? contextCallbacks?.onLumiaPassportError,\n onWalletReady: buttonCallbacks?.onWalletReady ?? contextCallbacks?.onWalletReady,\n }), [buttonCallbacks, contextCallbacks]);\n const { theme: resolvedTheme, isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n const {\n session, address, status, error,\n recoveryUserId, isRecoveryModalOpen,\n setSession, setAddress, setStatus, setError,\n setRecoveryUserId, setIsRecoveryModalOpen\n } = useLumiaSession();\n const { profiles, isLoading: profilesLoading } = useLumiaPassportLinkedProfiles();\n\n\n const [isAuthModalOpen, setIsAuthModalOpen] = React.useState(false);\n const tssManagerRef = React.useRef<TssManagerRef>(null);\n const [isWalletMenuOpen, setIsWalletMenuOpen] = React.useState(false);\n\n\n const [copied, setCopied] = React.useState(false);\n const [isManageWalletOpen, setIsManageWalletOpen] = React.useState(false);\n const [isSecurityOpen, setIsSecurityOpen] = React.useState(false);\n const [isBackupOpen, setIsBackupOpen] = React.useState(false);\n const [isTransactionsOpen, setIsTransactionsOpen] = React.useState(false);\n const [isViewAssetsOpen, setIsViewAssetsOpen] = React.useState(false);\n const [isSendOpen, setIsSendOpen] = React.useState(false);\n const [isReceiveOpen, setIsReceiveOpen] = React.useState(false);\n const [isBuyOpen, setIsBuyOpen] = React.useState(false);\n const [isKycOpen, setIsKycOpen] = React.useState(false);\n\n // Register onWalletReady callback with iframe manager\n React.useEffect(() => {\n if (!callbacks?.onWalletReady) return;\n if (!config.projectId) {\n // Skip if projectId not configured - iframe manager won't be initialized\n return;\n }\n\n (async () => {\n try {\n const { getIframeManager } = await import('../internal/lib/iframe-manager');\n const iframeManager = getIframeManager();\n iframeManager.setOnWalletReady(callbacks.onWalletReady);\n } catch (e) {\n console.warn('[UI-KIT] Failed to register onWalletReady callback:', e);\n }\n })();\n }, [callbacks?.onWalletReady, config.projectId]);\n\n // Auto-open Auth modal on mount when configured and user not authenticated/connected\n React.useEffect(() => {\n try {\n // authOpen prop overrides config.ui.authOpen\n const shouldAutoOpen = authOpen ?? config?.ui?.authOpen;\n if (!address && !session && shouldAutoOpen) {\n const isAuthenticated = jwtTokenManager.isAuthenticated?.();\n if (!isAuthenticated) {\n // Trigger onLumiaPassportConnecting when auto-opening modal\n try { callbacks?.onLumiaPassportConnecting?.({ method: 'wallet' }); } catch {}\n setIsAuthModalOpen(true);\n }\n }\n } catch {}\n // run once on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const { data: balance, isLoading: balanceLoading, refetch: refetchBalance } = useBalance({\n address: address as `0x${string}` | undefined,\n chainId: lumiaBeam.id,\n query: {\n enabled: !!address,\n refetchInterval: 30000, // Refetch every 30 seconds\n refetchOnMount: true,\n refetchOnWindowFocus: true,\n },\n });\n\n const formatAddress = React.useCallback((addr: `0x${string}` | null) => {\n if (!addr) return '';\n return `${addr.slice(0, 6)}...${addr.slice(-4)}`;\n }, []);\n\n const avatar = React.useMemo(() => jwtTokenManager.getAvatar(), [isAuthModalOpen, status]);\n const displayName = React.useMemo(() => jwtTokenManager.getDisplayName(), [isAuthModalOpen, status]);\n\n const formatBalance = React.useCallback(() => {\n if (!balance || balanceLoading) return '0.0000';\n return parseFloat(balance.formatted).toFixed(4);\n }, [balance, balanceLoading]);\n\n const [hasServerVault, setHasServerVault] = React.useState(false);\n\n const indicators = React.useMemo(() => {\n const userId = jwtTokenManager.getUserId();\n if (!userId) return { server: false, local: false, backup: false };\n // Note: In iframe mode, local keyshare is stored in iframe's isolated localStorage\n // We can't directly check it from parent context, so we use server indicator\n // The local indicator now means \"has session with iframe\"\n const server = jwtTokenManager.getHasKeyshare() ?? false;\n const local = !!address; // If address exists, iframe has keyshare\n // Use the actual server vault status instead of local backup status\n return { server, local, backup: hasServerVault };\n }, [session, address, hasServerVault]);\n\n const handleAuthModalSuccess = React.useCallback(async () => {\n // Get pending login response from AuthModal (tokens not yet saved)\n const { getPendingLoginResponse, clearPendingLoginResponse } = await import('../internal/components/AuthModal');\n const loginResponse = getPendingLoginResponse();\n\n if (!loginResponse || !loginResponse.userId) {\n setError('Authentication failed - no login data available');\n return;\n }\n\n const userId = loginResponse.userId;\n const hasServerKeyshare = loginResponse.hasKeyshare ?? false;\n\n try {\n // Authenticate with iframe FIRST - this shows consent modal and waits for user action\n // If user clicks Cancel, this will throw an error and prevent token saving\n if (!config.projectId) {\n throw new Error('projectId is not configured. Cannot authenticate with iframe.');\n }\n\n const { getIframeManager } = await import('../internal/lib/iframe-manager');\n const iframeManager = getIframeManager();\n await iframeManager.authenticate(userId);\n\n // User approved consent! Now save the tokens to localStorage\n await jwtTokenManager.setTokens(loginResponse);\n clearPendingLoginResponse();\n\n // Only create session if iframe authentication succeeded (user clicked Authorize)\n const jwt = await import('../internal/auth').then(m => m.jwtTokenManager.getTokens());\n const { session: sess, address: addr } = await createSessionWithKeyshare(userId, hasServerKeyshare, jwt?.isNewUser);\n setSession(sess);\n setAddress(addr);\n setStatus('ready');\n setIsAuthModalOpen(false);\n onConnected?.({ address: addr, session: sess });\n try { callbacks?.onLumiaPassportConnect?.({ address: addr, session: sess }); } catch {}\n try { callbacks?.onLumiaPassportAccount?.({ userId, address: addr, session: sess, hasKeyshare: hasServerKeyshare }); } catch {}\n\n // Fetch vault status and update local backup indicators\n try {\n const { checkServerBackupAvailability, updateBackupStatus, getShareRecoveryStats } = await import('../internal/vaultClient');\n const result = await checkServerBackupAvailability();\n if (result.hasBackup) updateBackupStatus(userId, 'server', { enabled: true, lastBackup: Date.now() });\n else updateBackupStatus(userId, 'server', { enabled: false, error: 'No server vault found' });\n\n // Update vault status indicator\n const stats = await getShareRecoveryStats();\n const hasRecoveryData = stats && (stats.created || (stats.devices && stats.devices.length > 0));\n setHasServerVault(!!hasRecoveryData);\n } catch (e) { console.warn('[UI-KIT] Vault status check failed:', e); }\n } catch (e: any) {\n if (e?.code === 'KEYSHARE_RECOVERY_NEEDED') {\n // For recovery errors, DON'T clear tokens - they're needed for backup restoration\n // Only clear the pending login response\n clearPendingLoginResponse();\n\n // Use flushSync to immediately apply state updates\n flushSync(() => {\n setRecoveryUserId(userId);\n setIsRecoveryModalOpen(true); // Open recovery modal\n setStatus('recovery_needed');\n setError(null);\n });\n // Don't throw - recovery modal will handle this\n } else {\n // Clear pending login response AND tokens on other errors (including user clicking Cancel)\n // Tokens might have been saved temporarily for DisplayNameInput\n clearPendingLoginResponse();\n await jwtTokenManager.clearTokens();\n\n setError(e?.message || String(e));\n setStatus('error');\n // Re-throw error so AuthModal can handle it (e.g., show Failed screen)\n throw e;\n }\n }\n }, [onConnected, setAddress, setError, setSession, setStatus]);\n\n const handleDisconnect = React.useCallback(async () => {\n const prevAddress = address;\n let userId: string | null = null;\n try { userId = jwtTokenManager.getUserId() || null; } catch {}\n try { await import('@/auth').then(m => m.logout()); } catch {}\n setSession(null);\n setAddress(null);\n setStatus('idle');\n setError(null);\n try { callbacks?.onLumiaPassportDisconnect?.({ address: prevAddress as any, userId }); } catch {}\n }, [setAddress, setError, setSession, setStatus]);\n\n // Internal function to create session with keyshare (doesn't depend on TssManager component)\n const createSessionWithKeyshare = React.useCallback(async (userId: string, hasServerKeyshare: boolean, isNewUser?: boolean) => {\n try {\n // Notify that wallet connection process is starting\n try { callbacks?.onLumiaPassportConnecting?.({ method: 'wallet' }); } catch {}\n\n setStatus('checking key management setup...');\n\n const { ensureKeyshare } = await import('../internal/auth');\n await ensureKeyshare(userId, hasServerKeyshare, setStatus, isNewUser);\n\n setStatus('creating smart account...');\n const { createAccountSession, getEntryPointDeposit } = await import('../internal/clients');\n const sess = await createAccountSession({ mpcUserId: userId, mpcPin: undefined, usePaymaster });\n\n const addr = sess.address || sess.smartAccountAddress;\n setStatus('loading account data...');\n try { await getEntryPointDeposit(addr); } catch {}\n\n return { session: sess, address: addr };\n } catch (error: any) {\n // Don't reset status for recovery errors - caller will set the correct status\n if (error?.code !== 'KEYSHARE_RECOVERY_NEEDED') {\n setStatus('idle');\n }\n\n throw error; // Re-throw so caller can handle specific errors\n }\n }, [usePaymaster, setStatus, callbacks]);\n\n // Check vault status when address changes\n React.useEffect(() => {\n if (address) {\n (async () => {\n try {\n const { getShareRecoveryStats } = await import('../internal/vaultClient');\n const stats = await getShareRecoveryStats();\n const hasRecoveryData = stats && (stats.created || (stats.devices && stats.devices.length > 0));\n setHasServerVault(!!hasRecoveryData);\n } catch (e) {\n console.warn('[UI-KIT] Failed to check vault status:', e);\n setHasServerVault(false);\n }\n })();\n } else {\n setHasServerVault(false);\n }\n }, [address]);\n\n // Listen for backup status changes\n React.useEffect(() => {\n const handleBackupStatusChanged = async (event: Event) => {\n const customEvent = event as CustomEvent;\n const { method, success } = customEvent.detail || {};\n\n console.log('[ConnectWalletButton] Backup status changed:', { method, success });\n\n // If server backup was created successfully, update vault status\n if (method === 'server' && success) {\n try {\n const { getShareRecoveryStats } = await import('../internal/vaultClient');\n const stats = await getShareRecoveryStats();\n const hasRecoveryData = stats && (stats.created || (stats.devices && stats.devices.length > 0));\n setHasServerVault(!!hasRecoveryData);\n } catch (e) {\n console.warn('[UI-KIT] Failed to refresh vault status after backup:', e);\n }\n }\n };\n\n window.addEventListener('lumia-passport-backup-status-changed', handleBackupStatusChanged);\n return () => {\n window.removeEventListener('lumia-passport-backup-status-changed', handleBackupStatusChanged);\n };\n }, []);\n\n // Auto-connect on refresh if valid tokens present\n const autoConnectAttemptedRef = React.useRef(false);\n\n React.useEffect(() => {\n // Skip if already attempted in this session\n if (autoConnectAttemptedRef.current) return;\n\n const tryAutoConnect = async (attempt: number) => {\n if (address || session) return;\n\n // Skip auto-connect if projectId not configured\n if (!config.projectId) {\n return;\n }\n\n // IMPORTANT: Wait for iframe to be ready before proceeding\n try {\n const { waitForIframe } = await import('../internal/lib/iframe-manager');\n await waitForIframe();\n } catch (iframeError) {\n console.error('[UI-KIT][AutoConnect] Failed to initialize iframe:', iframeError);\n // Retry after delay\n if (attempt < 20) {\n setTimeout(() => tryAutoConnect(attempt + 1), 500);\n }\n return;\n }\n\n // Step 1: Ensure we have a valid access token (refresh if needed)\n const hasValid = await ensureValidToken();\n if (!hasValid) return;\n\n // Step 2: Get user info from token manager\n const userId = jwtTokenManager.getUserId();\n const hasKeyshare = jwtTokenManager.getHasKeyshare();\n\n // Optionally verify token to sync hasKeyshare status\n let verify = await verifyToken();\n\n if (!userId) {\n console.warn('[UI-KIT][AutoConnect] No userId found in tokens after successful validation');\n return;\n }\n\n // Use hasKeyshare from verification if available, otherwise use from token manager\n const finalHasKeyshare = verify?.hasKeyshare ?? hasKeyshare ?? false;\n\n try { callbacks?.onLumiaPassportAccount?.({ userId, address: null, session: null, hasKeyshare: finalHasKeyshare }); } catch {}\n\n try {\n // Step 3: Create session with keyshare\n const jwt = await import('../internal/auth').then(m => m.jwtTokenManager.getTokens());\n const { session: sess, address: addr } = await createSessionWithKeyshare(userId, finalHasKeyshare, jwt?.isNewUser);\n\n setSession(sess);\n setAddress(addr);\n setStatus('ready');\n\n onConnected?.({ address: addr, session: sess });\n try { callbacks?.onLumiaPassportConnect?.({ address: addr, session: sess }); } catch {}\n try { callbacks?.onLumiaPassportAccount?.({ userId, address: addr, session: sess, hasKeyshare: finalHasKeyshare }); } catch {}\n\n // Authenticate with iframe to trigger wallet ready check\n if (config.projectId) {\n try {\n const { getIframeManager } = await import('../internal/lib/iframe-manager');\n const iframeManager = getIframeManager();\n await iframeManager.authenticate(userId);\n } catch (e) {\n console.warn('[UI-KIT][AutoConnect] iframe authentication failed:', e);\n }\n }\n\n // Step 4: Update vault status\n try {\n const { checkServerBackupAvailability, updateBackupStatus, getShareRecoveryStats } = await import('../internal/vaultClient');\n const result = await checkServerBackupAvailability();\n if (result.hasBackup) updateBackupStatus(userId, 'server', { enabled: true, lastBackup: Date.now() });\n else updateBackupStatus(userId, 'server', { enabled: false, error: 'No server vault found' });\n\n // Update vault status indicator\n const stats = await getShareRecoveryStats();\n const hasRecoveryData = stats && (stats.created || (stats.devices && stats.devices.length > 0));\n setHasServerVault(!!hasRecoveryData);\n } catch (e) { console.warn('[UI-KIT][AutoConnect] Vault status check failed:', e); }\n\n } catch (e: any) {\n if (e?.code === 'KEYSHARE_RECOVERY_NEEDED') {\n // Set recovery state to open the recovery modal\n flushSync(() => {\n setRecoveryUserId(userId);\n setError(null);\n });\n\n flushSync(() => {\n setIsRecoveryModalOpen(true);\n });\n\n flushSync(() => {\n setStatus('recovery_needed');\n });\n } else {\n console.warn('[UI-KIT][AutoConnect] Unexpected error during auto-connect:', e);\n }\n }\n };\n\n autoConnectAttemptedRef.current = true;\n tryAutoConnect(0);\n }, []);\n\n // Fetch balance only once when address is set\n React.useEffect(() => {\n if (address && refetchBalance) {\n refetchBalance();\n }\n }, [address]);\n\n return (\n <div className={[className, 'lumia-scope'].filter(Boolean).join(' ')}>\n <div className=\"inline-flex items-center gap-2\">\n {!address ? (\n <div style={{ display: 'flex', justifyContent: 'center' }}>\n <button\n onClick={() => {\n setIsAuthModalOpen(true);\n }}\n className=\"lumia-gradient-btn\"\n style={{\n height: '4rem',\n paddingLeft: '3rem',\n paddingRight: '3rem',\n fontSize: '1.25rem',\n fontWeight: '600',\n color: config.ui.colors?.[isDark ? 'dark' : 'light']?.buttonText || 'white',\n borderRadius: '1rem',\n background: config.ui.colors?.[isDark ? 'dark' : 'light']?.buttonBackground && config.ui.colors?.[isDark ? 'dark' : 'light']?.buttonBackgroundEnd\n ? `linear-gradient(to right, ${config.ui.colors[isDark ? 'dark' : 'light']?.buttonBackground}, ${config.ui.colors[isDark ? 'dark' : 'light']?.buttonBackgroundEnd})`\n : 'linear-gradient(to right, #9333ea, #2563eb)',\n boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)',\n transition: 'all 0.2s',\n border: 'none',\n cursor: 'pointer'\n }}\n onMouseEnter={(e) => {\n const hoverBg = config.ui.colors?.[isDark ? 'dark' : 'light']?.buttonBackgroundHover && config.ui.colors?.[isDark ? 'dark' : 'light']?.buttonBackgroundHoverEnd\n ? `linear-gradient(to right, ${config.ui.colors[isDark ? 'dark' : 'light']?.buttonBackgroundHover}, ${config.ui.colors[isDark ? 'dark' : 'light']?.buttonBackgroundHoverEnd})`\n : 'linear-gradient(to right, #7e22ce, #1d4ed8)';\n e.currentTarget.style.background = hoverBg;\n e.currentTarget.style.transform = 'scale(1.05)';\n e.currentTarget.style.boxShadow = '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)';\n }}\n onMouseLeave={(e) => {\n const normalBg = config.ui.colors?.[isDark ? 'dark' : 'light']?.buttonBackground && config.ui.colors?.[isDark ? 'dark' : 'light']?.buttonBackgroundEnd\n ? `linear-gradient(to right, ${config.ui.colors[isDark ? 'dark' : 'light']?.buttonBackground}, ${config.ui.colors[isDark ? 'dark' : 'light']?.buttonBackgroundEnd})`\n : 'linear-gradient(to right, #9333ea, #2563eb)';\n e.currentTarget.style.background = normalBg;\n e.currentTarget.style.transform = 'scale(1)';\n e.currentTarget.style.boxShadow = '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)';\n }}\n >\n {label || 'Connect'}\n </button>\n </div>\n ) : (\n <div\n className={`relative rounded-2xl p-4 shadow-lg cursor-pointer transition-all duration-200 hover:scale-105 hover:shadow-xl max-w-sm min-w-[280px] backdrop-blur`}\n style={{\n backgroundColor: config.ui.colors?.[isDark ? 'dark' : 'light']?.connectedButtonBackground || (isDark ? 'rgba(17, 24, 39, 0.4)' : '#ffffff'),\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: config.ui.colors?.[isDark ? 'dark' : 'light']?.connectedButtonBorder || (isDark ? '#374151' : '#e5e7eb'),\n }}\n onClick={() => setIsWalletMenuOpen(true)}\n >\n <div className=\"flex items-center space-x-3\">\n <div className=\"w-10 h-10 rounded-full flex items-center justify-center flex-shrink-0 overflow-hidden bg-gradient-to-br from-purple-500 to-blue-600\">\n {avatar ? (\n // eslint-disable-next-line @next/next/no-img-element\n <img src={avatar} alt=\"User avatar\" className=\"w-full h-full object-cover\" />\n ) : (\n <span className=\"text-white font-bold text-sm\">LP</span>\n )}\n </div>\n <div className=\"text-left flex-1 min-w-0\">\n <div className={`font-semibold text-base truncate ${theme.titleText}`}>\n {mode === 'compact' && displayName ? displayName : formatAddress(address)}\n </div>\n <div className={`text-sm ${theme.mutedText}`}>{formatBalance()} LUMIA</div>\n </div>\n <div className=\"flex items-center space-x-1\">\n <div className=\"group relative\">\n <Cloud\n className={`w-3 h-3 ${indicators.server ? 'text-green-500' : 'text-orange-400'}`}\n />\n <div className=\"absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-gray-800 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-50\">\n Server Keyshare: {indicators.server ? 'Available' : 'Missing'}\n </div>\n </div>\n <div className=\"group relative\">\n <Laptop\n className={`w-3 h-3 ${indicators.local ? 'text-green-500' : 'text-orange-400'}`}\n />\n <div className=\"absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-gray-800 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-50\">\n Local Keyshare: {indicators.local ? 'Available' : 'Missing'}\n </div>\n </div>\n <div className=\"group relative\">\n <Shield\n className={`w-3 h-3 ${indicators.backup ? 'text-green-500' : 'text-orange-400'}`}\n />\n <div className=\"absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-gray-800 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-50\">\n Vault Backup: {indicators.backup ? 'Available' : 'Not Found'}\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Wallet Menu Modal */}\n {isWalletMenuOpen && address && (\n <div className=\"fixed inset-0 z-[60]\">\n <Dialog open={isWalletMenuOpen} onOpenChange={setIsWalletMenuOpen}>\n <DialogContent className={`lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden gap-0 ${isDark ? 'lumia-dark' : 'lumia-light'}`}>\n <VisuallyHidden>\n <DialogTitle>Wallet Menu</DialogTitle>\n </VisuallyHidden>\n <DialogDescription className=\"sr-only\">Smart Account wallet actions and status</DialogDescription>\n <div className={`p-4 border-b ${theme.divider}`}>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-4\">\n <div className=\"w-12 h-12 bg-gradient-to-br from-purple-500 to-blue-600 rounded-full flex items-center justify-center relative overflow-hidden\">\n {avatar ? (\n // eslint-disable-next-line @next/next/no-img-element\n <img src={avatar} alt=\"User avatar\" className=\"w-full h-full object-cover\" />\n ) : (\n <span className=\"text-white font-bold text-lg\">L</span>\n )}\n {/* TODO: Add recovery indicator */}\n {/* <div className={`absolute -bottom-1 -right-1 w-6 h-6 bg-green-500 rounded-full flex items-center justify-center border-2 ${isDark ? 'border-gray-900' : 'border-white'}`}>\n <span className=\"text-white text-xs\">✓</span>\n </div> */}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className={`font-medium text-left text-lg ${theme.titleText}`}>{displayName || 'Smart Account'}</div>\n <div className=\"flex items-center space-x-2\">\n <div className={`text-sm ${theme.mutedText}`}>{formatAddress(address)}</div>\n <button onClick={async () => { try { await navigator.clipboard.writeText(address); setCopied(true); setTimeout(() => setCopied(false), 1500); } catch {} }} title=\"Copy address\" className={`${theme.iconColor} hover:${theme.titleText} p-1`}>\n {copied ? <span className=\"text-green-500 text-sm\">✓</span> : <Copy className=\"w-4 h-4\" />}\n </button>\n </div>\n </div>\n </div>\n {/* Use built-in close button from DialogContent; no extra X here */}\n </div>\n </div>\n\n <div className=\"p-4\">\n <div className=\"grid grid-cols-3 gap-2 mb-4\">\n <button onClick={() => { setIsWalletMenuOpen(false); setIsSendOpen(true); }} className={`${isDark ? 'bg-slate-900 hover:bg-slate-800 text-blue-400' : 'bg-blue-50 hover:bg-blue-100 text-blue-600'} rounded-xl p-3 transition-colors flex items-center justify-center gap-2`}>\n <ArrowUp className=\"w-5 h-5\" />\n <span className=\"text-sm font-medium\">Send</span>\n </button>\n <button onClick={() => { setIsWalletMenuOpen(false); setIsReceiveOpen(true); }} className={`${isDark ? 'bg-slate-900 hover:bg-slate-800 text-green-400' : 'bg-green-50 hover:bg-green-100 text-green-600'} rounded-xl p-3 transition-colors flex items-center justify-center gap-2`}>\n <ArrowDown className=\"w-5 h-5\" />\n <span className=\"text-sm font-medium\">Receive</span>\n </button>\n <button onClick={() => { setIsWalletMenuOpen(false); setIsBuyOpen(true); }} className={`${isDark ? 'bg-slate-900 hover:bg-slate-800 text-purple-400' : 'bg-purple-50 hover:bg-purple-100 text-purple-600'} rounded-xl p-3 transition-colors flex items-center justify-center gap-2`}>\n <Plus className=\"w-5 h-5\" />\n <span className=\"text-sm font-medium\">Buy</span>\n </button>\n </div>\n\n {/* Backup Warning */}\n {config.warnings?.backupWarning && !hasServerVault && (\n <div className={`mb-4 p-4 rounded-xl animate-glow-warning ${isDark ? 'bg-red-950/90 border-2 border-red-800/80' : 'bg-red-50 border-2 border-red-300'}`}>\n <div className=\"flex items-start space-x-3 text-center\">\n <div className=\"flex-1 min-w-0\">\n <div className={`text-sm font-bold ${isDark ? 'text-red-200' : 'text-red-800'}`}>\n BACKUP NOT CREATED\n </div>\n <div className={`text-xs mt-1.5 font-medium ${isDark ? 'text-red-300/95' : 'text-red-700'}`}>\n Your wallet will be <strong>PERMANENTLY LOST</strong> if browser data is cleared.\n </div>\n <div className={`text-[11px] mt-1 ${isDark ? 'text-red-400/80' : 'text-red-600/90'}`}>\n ⚠️ Lumia cannot recover your wallet without a backup!\n </div>\n <button\n onClick={() => { setIsWalletMenuOpen(false); setIsBackupOpen(true); }}\n className={`mt-3 px-4 py-2 text-xs font-bold rounded-lg transition-all hover:scale-105 ${\n isDark\n ? 'bg-red-700/80 hover:bg-red-600/90 text-white shadow-lg'\n : 'bg-red-600 hover:bg-red-700 text-white shadow-lg'\n }`}\n >\n <ShieldCheck className=\"w-3.5 h-3.5 inline mr-1.5\" />\n Create Backup Now\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Email Not Connected Warning */}\n {(() => {\n // Get providers from JWT tokens (faster than API call)\n const providers = jwtTokenManager.getProviders();\n const hasEmail = providers.includes('email');\n return config.warnings?.emailNotConnectedWarning && !hasEmail && (\n <div className={`mb-4 p-3 rounded-xl ${isDark ? 'bg-blue-900/20 border border-blue-900/40' : 'bg-blue-50 border border-blue-200'}`}>\n <div className=\"flex items-start space-x-3\">\n <AlertTriangle className={`w-5 h-5 ${isDark ? 'text-blue-400' : 'text-blue-500'} mt-0.5 flex-shrink-0`} />\n <div className=\"flex-1 min-w-0\">\n <div className={`text-sm font-medium ${isDark ? 'text-blue-300' : 'text-blue-700'}`}>\n Email Not Connected\n </div>\n <div className={`text-xs mt-1 ${isDark ? 'text-blue-400/80' : 'text-blue-600'}`}>\n Connect your email for easier account recovery and additional security.\n </div>\n <button\n onClick={() => { setIsWalletMenuOpen(false); setIsManageWalletOpen(true); }}\n className={`mt-2 px-3 py-1.5 text-xs font-medium rounded-lg transition-colors ${\n isDark\n ? 'bg-blue-900/40 hover:bg-blue-900/60 text-blue-300'\n : 'bg-blue-100 hover:bg-blue-200 text-blue-700'\n }`}\n >\n <ShieldCheck className=\"w-3 h-3 inline mr-1\" />\n Connect Email\n </button>\n </div>\n </div>\n </div>\n );\n })()}\n\n {/* Network */}\n <button\n onClick={() => address && window.open(`${LUMIA_EXPLORER_URL}/address/${address}`, '_blank')}\n className={`w-full ${isDark ? 'bg-gray-800 hover:bg-gray-700' : 'bg-gray-50 hover:bg-gray-100'} rounded-xl p-3 mb-3 transition-colors cursor-pointer text-left`}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-3\">\n <div className=\"w-8 h-8 rounded-full flex items-center justify-center bg-transparent overflow-hidden\">\n {((lumiaBeam as any).logoDataUri) ? (\n <img src={(lumiaBeam as any).logoDataUri} alt=\"Chain logo\" className=\"w-full h-full object-cover\" />\n ) : ((lumiaBeam as any).logo === 'lumia') ? (\n <LumiaLogo size={32} />\n ) : (\n <span className=\"text-white text-xs font-bold\">{(lumiaBeam.name || 'L').charAt(0)}</span>\n )}\n </div>\n <div>\n <div className={`${theme.titleText} font-medium`}>{lumiaBeam.name}</div>\n <div className={theme.mutedText + ' text-sm'}>{formatBalance()} LUMIA</div>\n </div>\n </div>\n <div className={theme.iconColor}>\n <ArrowUpRight className=\"w-4 h-4\" />\n </div>\n </div>\n </button>\n\n <div className=\"space-y-1\">\n {config.features?.kycNeeded && (\n <button onClick={() => { setIsWalletMenuOpen(false); setIsKycOpen(true); }} className={`w-full text-left p-2.5 rounded-xl ${isDark ? 'bg-transparent hover:bg-gray-800' : 'bg-transparent hover:bg-gray-100'} transition-colors flex items-center space-x-3`}>\n <ShieldCheck className={`w-5 h-5 ${theme.iconColor}`} />\n <span className={theme.titleText}>KYC</span>\n </button>\n )}\n <button onClick={() => { setIsWalletMenuOpen(false); setIsTransactionsOpen(true); }} className={`w-full text-left p-2.5 rounded-xl ${isDark ? 'bg-transparent hover:bg-gray-800' : 'bg-transparent hover:bg-gray-100'} transition-colors flex items-center space-x-3`}>\n <Activity className={`w-5 h-5 ${theme.iconColor}`} />\n <span className={theme.titleText}>Transactions</span>\n </button>\n <button onClick={() => { setIsWalletMenuOpen(false); setIsViewAssetsOpen(true); }} className={`w-full text-left p-2.5 rounded-xl ${isDark ? 'bg-transparent hover:bg-gray-800' : 'bg-transparent hover:bg-gray-100'} transition-colors flex items-center space-x-3`}>\n <Gem className={`w-5 h-5 ${theme.iconColor}`} />\n <span className={theme.titleText}>View Assets</span>\n </button>\n <button onClick={() => { setIsWalletMenuOpen(false); setIsManageWalletOpen(true); }} className={`w-full text-left p-2.5 rounded-xl ${isDark ? 'bg-transparent hover:bg-gray-800' : 'bg-transparent hover:bg-gray-100'} transition-colors flex items-center space-x-3`}>\n <CreditCard className={`w-5 h-5 ${theme.iconColor}`} />\n <span className={theme.titleText}>Manage Wallet</span>\n </button>\n <button onClick={() => { setIsWalletMenuOpen(false); setIsSecurityOpen(true); }} className={`w-full text-left p-2.5 rounded-xl ${isDark ? 'bg-transparent hover:bg-gray-800' : 'bg-transparent hover:bg-gray-100'} transition-colors flex items-center space-x-3`}>\n <Lock className={`w-5 h-5 ${theme.iconColor}`} />\n <span className={theme.titleText}>Security</span>\n </button>\n <button onClick={() => { setIsWalletMenuOpen(false); setIsBackupOpen(true); }} className={`w-full text-left p-2.5 rounded-xl ${isDark ? 'bg-transparent hover:bg-gray-800' : 'bg-transparent hover:bg-gray-100'} transition-colors flex items-center space-x-3`}>\n <Shield className={`w-5 h-5 ${theme.iconColor}`} />\n <span className={theme.titleText}>Keyshare Backup</span>\n </button>\n <button onClick={async () => { await handleDisconnect(); setIsWalletMenuOpen(false); }} className={`w-full text-left p-2.5 rounded-xl ${isDark ? 'bg-transparent hover:bg-red-900/20' : 'bg-transparent hover:bg-red-50'} transition-colors flex items-center space-x-3`}>\n <ArrowUpRight className=\"w-5 h-5 text-red-600\" />\n <span className=\"text-red-600\">Disconnect Wallet</span>\n </button>\n </div>\n\n {/* Version Footer */}\n <div className={`mt-3 pt-3 border-t ${theme.divider} text-center`}>\n <div className={`text-xs ${theme.mutedText}`}>\n Lumia Passport v{packageJson.version}\n </div>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n )}\n\n {/* Manage Wallet and Security modals */}\n <ManageWallet\n open={isManageWalletOpen}\n onOpenChange={setIsManageWalletOpen}\n onBack={() => {\n setIsManageWalletOpen(false);\n setIsWalletMenuOpen(true);\n }}\n />\n <SecurityModal\n open={isSecurityOpen}\n onOpenChange={setIsSecurityOpen}\n onBack={() => {\n setIsSecurityOpen(false);\n setIsWalletMenuOpen(true);\n }}\n />\n {isBackupOpen && session?.mpcUserId && (\n <Dialog open={isBackupOpen} onOpenChange={setIsBackupOpen}>\n <DialogContent className=\"max-w-[400px] p-0\">\n <VisuallyHidden>\n <DialogTitle>Keyshare Backup</DialogTitle>\n <DialogDescription>Create and manage encrypted backups of your keyshare</DialogDescription>\n </VisuallyHidden>\n <KeyshareBackup\n userId={session.mpcUserId}\n onBackupSuccess={() => {\n console.log('[ConnectWalletButton] Backup created successfully');\n }}\n onBack={() => {\n setIsBackupOpen(false);\n setIsWalletMenuOpen(true);\n }}\n />\n </DialogContent>\n </Dialog>\n )}\n <TransactionsModal\n open={isTransactionsOpen}\n onOpenChange={setIsTransactionsOpen}\n onBack={() => {\n setIsTransactionsOpen(false);\n setIsWalletMenuOpen(true);\n }}\n />\n <ViewAssetsModal\n open={isViewAssetsOpen}\n onOpenChange={setIsViewAssetsOpen}\n onBack={() => {\n setIsViewAssetsOpen(false);\n setIsWalletMenuOpen(true);\n }}\n />\n <SendModal\n open={isSendOpen}\n onOpenChange={setIsSendOpen}\n onBack={() => {\n setIsSendOpen(false);\n setIsWalletMenuOpen(true);\n }}\n />\n <ReceiveModal\n open={isReceiveOpen}\n onOpenChange={setIsReceiveOpen}\n onBack={() => {\n setIsReceiveOpen(false);\n setIsWalletMenuOpen(true);\n }}\n />\n <BuyModal\n open={isBuyOpen}\n onOpenChange={setIsBuyOpen}\n onBack={() => {\n setIsBuyOpen(false);\n setIsWalletMenuOpen(true);\n }}\n />\n <KycModal\n open={isKycOpen}\n onOpenChange={setIsKycOpen}\n onBack={() => {\n setIsKycOpen(false);\n setIsWalletMenuOpen(true);\n }}\n />\n\n <AuthModal\n open={recoveryUserId ? isRecoveryModalOpen : isAuthModalOpen}\n onOpenChange={(open) => {\n if (recoveryUserId) {\n setIsRecoveryModalOpen(open);\n } else {\n setIsAuthModalOpen(open);\n }\n }}\n onAuthSuccess={handleAuthModalSuccess}\n autoCloseOnSuccess={!recoveryUserId}\n recoveryUserId={recoveryUserId}\n onRecoveryClose={() => {\n setRecoveryUserId(null);\n setIsRecoveryModalOpen(false);\n setIsAuthModalOpen(false);\n }}\n callbacks={callbacks}\n onRecoverySuccess={async () => {\n const verify = await verifyToken();\n const hasServerKeyshare = verify?.hasKeyshare ?? jwtTokenManager.getHasKeyshare() ?? false;\n if (recoveryUserId) {\n try {\n const { session: sess, address: addr } = await createSessionWithKeyshare(recoveryUserId, hasServerKeyshare);\n setSession(sess);\n setAddress(addr);\n setStatus('ready');\n setRecoveryUserId(null);\n setIsRecoveryModalOpen(false);\n setIsAuthModalOpen(false);\n onConnected?.({ address: addr, session: sess });\n try { callbacks?.onLumiaPassportConnect?.({ address: addr, session: sess }); } catch {}\n try { callbacks?.onLumiaPassportAccount?.({ userId: recoveryUserId, address: addr, session: sess, hasKeyshare: hasServerKeyshare }); } catch {}\n\n // Authenticate with iframe to trigger wallet ready check\n if (config.projectId) {\n try {\n const { getIframeManager } = await import('../internal/lib/iframe-manager');\n const iframeManager = getIframeManager();\n await iframeManager.authenticate(recoveryUserId);\n } catch (e) {\n console.warn('[UI-KIT] iframe authentication failed:', e);\n }\n }\n\n // Update backup status after successful recovery\n try {\n const { updateBackupStatus } = await import('../internal/vaultClient');\n updateBackupStatus(recoveryUserId, 'server', { enabled: true, lastBackup: Date.now() });\n } catch (e) {\n console.warn('[UI-KIT] Failed to update backup status:', e);\n }\n } catch (err: any) {\n setError(err?.message || String(err));\n setStatus('error');\n }\n }\n }}\n />\n\n {/* Recovery UI moved inside AuthModal */}\n\n <TssManagerWithRef\n ref={tssManagerRef}\n mpcPin={undefined}\n usePaymaster={usePaymaster}\n onSessionCreated={(sess, addr) => {\n setSession(sess);\n setAddress(addr);\n }}\n onError={msg => setError(msg)}\n setStatus={setStatus}\n />\n </div>\n );\n};\n","import React from 'react';\n\nexport interface VisuallyHiddenProps {\n children: React.ReactNode;\n}\n\nexport const VisuallyHidden: React.FC<VisuallyHiddenProps> = ({ children }) => (\n <span className=\"sr-only absolute w-px h-px p-0 -m-px overflow-hidden whitespace-nowrap border-0\">\n {children}\n </span>\n);","import React from 'react';\n\nimport { ensureKeyshare } from '../auth';\nimport { createAccountSession, getEntryPointDeposit, type AccountSession } from '../clients';\n\ninterface TssManagerProps {\n mpcPin?: string;\n usePaymaster: boolean;\n onSessionCreated: (session: AccountSession, address: `0x${string}`) => void;\n onError: (error: string) => void;\n setStatus: (status: string) => void;\n}\n\nexport default function TssManager({ mpcPin, usePaymaster, onSessionCreated, onError, setStatus }: TssManagerProps) {\n const createSessionWithKeyshare = React.useCallback(async (userId: string, hasServerKeyshare: boolean, isNewUser?: boolean) => {\n setStatus('checking key management setup...');\n await ensureKeyshare(userId, hasServerKeyshare, setStatus, isNewUser);\n setStatus('creating smart account...');\n const sess = await createAccountSession({ mpcUserId: userId, mpcPin: mpcPin || undefined, usePaymaster });\n const addr = sess.address || sess.smartAccountAddress;\n setStatus('loading account data...');\n try { await getEntryPointDeposit(addr); } catch {}\n onSessionCreated(sess, addr);\n return { session: sess, address: addr };\n }, [mpcPin, usePaymaster, onSessionCreated, setStatus]);\n\n return null;\n}\n\nexport interface TssManagerRef {\n createSessionWithKeyshare: (userId: string, hasServerKeyshare: boolean, isNewUser?: boolean) => Promise<{ session: AccountSession; address: `0x${string}` }>;\n}\n\nexport const TssManagerWithRef = React.forwardRef<TssManagerRef, TssManagerProps>((props, ref) => {\n const createSessionWithKeyshare = React.useCallback(async (userId: string, hasServerKeyshare: boolean, isNewUser?: boolean) => {\n props.setStatus('checking key management setup...');\n await ensureKeyshare(userId, hasServerKeyshare, props.setStatus, isNewUser);\n props.setStatus('creating smart account...');\n const sess = await createAccountSession({ mpcUserId: userId, mpcPin: props.mpcPin || undefined, usePaymaster: props.usePaymaster });\n const addr = sess.address || sess.smartAccountAddress;\n props.setStatus('loading account data...');\n try { await getEntryPointDeposit(addr); } catch {}\n props.onSessionCreated(sess, addr);\n return { session: sess, address: addr };\n }, [props]);\n\n React.useImperativeHandle(ref, () => ({ createSessionWithKeyshare }), [createSessionWithKeyshare]);\n return null;\n});\n","import React, { useEffect, useState } from 'react';\n\nimport { Dialog, DialogContent, DialogTitle, DialogDescription } from './ui/dialog';\nimport { VisuallyHidden } from './ui/visually-hidden';\nimport { Button } from './ui/button';\nimport { Input } from './ui/input';\nimport { getLinkedProviders, unlinkProvider } from '../auth/providers/common';\nimport { sendEmailLinkCode, verifyEmailLinkCode } from '../auth/providers/email';\nimport { linkPasskeyWithWebAuthn } from '../auth/providers/passkey';\nimport { linkTelegram, mountTelegramLoginWidget } from '../auth/providers/telegram';\nimport { getProviderDisplayInfo, formatDate, type AuthProvider } from '../auth/providers/types';\nimport { AlertTriangle, CheckCircle, Clock, Link as LinkIcon, Trash2, RefreshCw, Key, ArrowLeft, Wallet } from 'lucide-react';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\nimport { GoogleIcon, TelegramIcon, TwitterIcon, DiscordIcon } from '../../config/lumiaPassport';\nimport { VerificationCodeInput } from './VerificationCodeInput';\nimport { WalletConnectHandler } from './WalletConnectHandler';\n\nexport interface ManageWalletProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onBack?: () => void;\n}\n\nexport const ManageWallet: React.FC<ManageWalletProps> = ({ open, onOpenChange, onBack }) => {\n const [providers, setProviders] = useState<AuthProvider[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string>('');\n const [unlinking, setUnlinking] = useState<string | null>(null);\n const [confirmUnlink, setConfirmUnlink] = useState<{ provider: string; providerName: string; externalId: string } | null>(null);\n const [confirmInput, setConfirmInput] = useState('');\n const [showAdd, setShowAdd] = useState(false);\n const [providerType, setProviderType] = useState<string | null>(null);\n const [email, setEmail] = useState('');\n const [emailCode, setEmailCode] = useState('');\n const [emailCodeSent, setEmailCodeSent] = useState(false);\n const [linkIsLoading, setLinkIsLoading] = useState(false);\n const [linkError, setLinkError] = useState('');\n const [expiresIn, setExpiresIn] = useState(300);\n const [verificationError, setVerificationError] = useState<string>('');\n const { config, callbacks } = useLumiaPassportConfig() as any;\n const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n const telegramContainerRef = React.useRef<HTMLDivElement | null>(null);\n\n // State for wallet linking\n const [isWalletLinking, setIsWalletLinking] = useState(false);\n const [providersJustUpdated, setProvidersJustUpdated] = useState(false);\n\n function normalizePasskeyLinkError(msg: string): string {\n const lower = msg.toLowerCase();\n if (lower.includes('already registered') || lower.includes('credential') && lower.includes('exists')) {\n return 'This authenticator already has a credential for this site. Try a different device or security key.';\n }\n if (lower.includes('not allowed') || lower.includes('user cancelled')) {\n return 'Operation cancelled. No changes were made.';\n }\n return msg;\n }\n\n const loadProviders = async () => {\n setLoading(true); setError('');\n try { const list = await getLinkedProviders(); setProviders(list); }\n catch (e: any) { setError(e?.message || 'Failed to load authentication providers'); }\n finally { setLoading(false); }\n };\n\n useEffect(() => {\n if (open && !providersJustUpdated) {\n loadProviders();\n }\n // Reset the flag after the dialog opens\n if (open && providersJustUpdated) {\n setProvidersJustUpdated(false);\n }\n }, [open, providersJustUpdated]);\n\n // Mount Telegram widget when selected (configured via social.providers meta)\n useEffect(() => {\n const telegramProvider = config.social?.providers?.find((p: any) => (p.id || '').toLowerCase() === 'telegram' && p.enabled);\n const bot = telegramProvider?.meta?.botUsername as string | undefined;\n if (providerType === 'telegram' && telegramContainerRef.current && bot) {\n mountTelegramLoginWidget(telegramContainerRef.current, bot, async (tgUser: any) => {\n try {\n setLinkIsLoading(true);\n await linkTelegram(tgUser);\n const list = await getLinkedProviders();\n setProviders(list);\n setProvidersJustUpdated(true); // Mark that we just updated providers\n try { callbacks?.onLumiaPassportUpdate?.({ providers: list }); } catch {}\n setShowAdd(false);\n setProviderType(null);\n } catch (e: any) {\n setError(e?.message || 'Failed to link Telegram');\n } finally {\n setLinkIsLoading(false);\n }\n });\n }\n }, [providerType, config.social?.providers]);\n\n const canUnlink = (p: AuthProvider) => {\n const verified = providers.filter(x => x.verified);\n if (verified.length <= 1 && p.verified) return false;\n return true;\n };\n\n const handleUnlink = async (provider: string, externalId?: string) => {\n setUnlinking(provider);\n try {\n await unlinkProvider(provider, externalId);\n const list = await getLinkedProviders();\n setProviders(list);\n setProvidersJustUpdated(true); // Mark that we just updated providers\n try { callbacks?.onLumiaPassportUpdate?.({ providers: list }); } catch {}\n }\n catch (e: any) { setError(e?.message || 'Failed to unlink provider'); }\n finally { setUnlinking(null); setConfirmUnlink(null); }\n };\n\n const handleSendCode = async () => {\n if (!email) { setError('Please enter an email address'); return; }\n setError(''); setVerificationError(''); setLinkIsLoading(true);\n try {\n await sendEmailLinkCode(email);\n setEmailCodeSent(true);\n setExpiresIn(300);\n } catch (e: any) {\n setError(e?.message || 'Failed to send verification code');\n } finally {\n setLinkIsLoading(false);\n }\n };\n const handleVerifyCode = async (codeToVerify?: string) => {\n const code = codeToVerify ?? emailCode;\n if (!code) { setError('Please enter the verification code'); return; }\n setError(''); setVerificationError(''); setLinkIsLoading(true);\n try {\n await verifyEmailLinkCode(email, code);\n const list = await getLinkedProviders();\n setProviders(list);\n setProvidersJustUpdated(true); // Mark that we just updated providers\n try { callbacks?.onLumiaPassportUpdate?.({ providers: list }); } catch {}\n setShowAdd(false);\n setProviderType(null);\n setEmail('');\n setEmailCode('');\n setEmailCodeSent(false);\n } catch (e: any) {\n setVerificationError(e?.message || 'Failed to verify and link email');\n } finally {\n setLinkIsLoading(false);\n }\n };\n\n return (\n <>\n {/* Wallet connection handler - render outside of dialog so it works when dialog closes */}\n {config.wallet?.enabled && (\n <WalletConnectHandler\n isLinking={isWalletLinking}\n onLinkingComplete={async (success) => {\n setIsWalletLinking(false);\n if (success) {\n // Load fresh providers list\n try {\n const list = await getLinkedProviders();\n setProviders(list);\n setProvidersJustUpdated(true); // Mark that we just updated providers\n try { callbacks?.onLumiaPassportUpdate?.({ providers: list }); } catch {}\n } catch (e) {\n console.error('Failed to load providers:', e);\n }\n setShowAdd(false);\n setProviderType(null);\n // Reopen the Manage Wallet modal to show updated providers\n setTimeout(() => {\n onOpenChange(true);\n }, 500);\n }\n }}\n onError={(error) => {\n setLinkError(error);\n setIsWalletLinking(false);\n // Reopen the Manage Wallet modal to show error\n setTimeout(() => onOpenChange(true), 500);\n }}\n onLoadingChange={setLinkIsLoading}\n />\n )}\n\n <Dialog open={open} onOpenChange={(newOpen) => {\n onOpenChange(newOpen);\n // Reset wallet linking state when dialog closes\n if (!newOpen) {\n setIsWalletLinking(false);\n }\n }}>\n <DialogContent className={`lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden gap-0 ${isDark ? 'lumia-dark' : 'lumia-light'}`}>\n <div className=\"p-5\">\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center gap-2\">\n {onBack && (\n <button\n onClick={onBack}\n className={`p-1 mr-1 ${isDark ? 'text-gray-400 hover:text-gray-300' : 'text-gray-500 hover:text-gray-700'}`}\n title=\"Back\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </button>\n )}\n <div>\n <VisuallyHidden>\n <DialogTitle>Manage Wallet Authentication</DialogTitle>\n </VisuallyHidden>\n <h2 className={`text-xl font-semibold ${theme.titleText}`}>Manage Wallet Authentication</h2>\n </div>\n </div>\n </div>\n <DialogDescription className={`mb-4 ${theme.bodyText}`}>Manage your connected authentication methods</DialogDescription>\n\n {/* Providers list */}\n {error && (\n <div className={`mt-4 p-3 rounded text-sm flex items-start gap-2 break-words whitespace-pre-wrap max-h-24 overflow-auto ${isDark ? 'bg-red-900/30 border border-red-900 text-red-400' : 'bg-red-50 border border-red-200 text-red-700'}`}>\n <AlertTriangle className=\"w-4 h-4 mt-0.5 shrink-0\" />\n <span className=\"block\">{error}</span>\n </div>\n )}\n\n {loading ? (\n <div className={`flex items-center justify-center py-8 ${theme.mutedText}`}><RefreshCw className=\"w-5 h-5 mr-2 animate-spin\" />Loading authentication providers…</div>\n ) : (\n <div className=\"mt-3 space-y-3\">\n {providers.map(p => {\n const info = getProviderDisplayInfo(p.provider);\n const allowUnlink = canUnlink(p);\n return (\n <div key={`${p.provider}-${p.externalId}`} className={`border rounded-xl p-3 ${isDark ? 'border-gray-700 bg-gray-800' : 'border-gray-200 bg-white'}`}>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className={`text-lg ${isDark ? 'text-gray-400' : 'text-gray-600'}`}>{info.icon}</div>\n <div className={`text-sm font-medium ${theme.titleText}`}>{info.name}</div>\n </div>\n <div className=\"flex items-center gap-2\">\n {p.verified ? (\n <CheckCircle className={`w-4 h-4 ${isDark ? 'text-green-400' : 'text-green-500'}`} />\n ) : (\n <Clock className=\"w-4 h-4 text-yellow-500\" />\n )}\n {allowUnlink && (\n <button\n onClick={() => setConfirmUnlink({ provider: p.provider, providerName: info.name, externalId: p.externalId })}\n className={`p-1 ${isDark ? 'text-red-400 hover:text-red-300' : 'text-red-500 hover:text-red-700'}`}\n title=\"Remove provider\"\n >\n {unlinking === p.provider ? <RefreshCw className=\"w-4 h-4 animate-spin\" /> : <Trash2 className=\"w-4 h-4\" />}\n </button>\n )}\n </div>\n </div>\n <div className={`mt-2 space-y-1 text-xs ${isDark ? 'text-gray-400' : 'text-gray-600'}`}>\n <div className=\"flex items-center gap-1\"><LinkIcon className={`w-3 h-3 ${isDark ? 'text-gray-500' : 'text-gray-400'}`} />Linked: {formatDate(p.linkedAt)}</div>\n {p.lastUsedAt && (<div className=\"flex items-center gap-1\"><Clock className={`w-3 h-3 ${isDark ? 'text-gray-500' : 'text-gray-400'}`} />Last used: {formatDate(p.lastUsedAt)}</div>)}\n {p.externalId && (<div className={`text-[10px] font-mono break-all ${isDark ? 'text-gray-500' : 'text-gray-500'}`}>ID: {p.externalId}</div>)}\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {/* Add provider entrypoint */}\n <div className=\"mt-4 flex justify-end\">\n <Button variant=\"success\" onClick={() => setShowAdd(true)}>+ Add Provider</Button>\n </div>\n </div>\n </DialogContent>\n {/* Add Provider Modal */}\n <Dialog open={showAdd} onOpenChange={(v) => { setShowAdd(v); if (!v) { setProviderType(null); setEmail(''); setEmailCode(''); setEmailCodeSent(false); } }}>\n <DialogContent className={`lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden ${isDark ? 'lumia-dark' : 'lumia-light'}`}>\n <div className=\"p-5\">\n <div className=\"flex items-center gap-2 mb-3\">\n <button\n onClick={() => {\n if (providerType) {\n setProviderType(null);\n setEmailCodeSent(false);\n setEmail('');\n setEmailCode('');\n setLinkError('');\n } else {\n setShowAdd(false);\n }\n }}\n className={`p-1 mr-1 ${isDark ? 'text-gray-400 hover:text-gray-300' : 'text-gray-500 hover:text-gray-700'}`}\n title=\"Back\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </button>\n <DialogTitle className={`text-xl font-semibold ${theme.titleText}`}>Add Authentication Method</DialogTitle>\n </div>\n <DialogDescription className={`${theme.bodyText} mb-4`}>Add a new way to authenticate to your account</DialogDescription>\n\n {!providerType ? (\n <div className=\"mt-3 space-y-4\">\n {config.passkey.enabled && (\n <Button onClick={() => setProviderType('passkey')} className=\"w-full\" size=\"lg\"><Key className=\"w-4 h-4 mr-2\" />Link with Passkey</Button>\n )}\n\n {config.passkey.enabled && (config.email.enabled || config.wallet?.enabled || (config.social.enabled && config.social.providers.some(p => p.enabled))) && (\n <div className={`text-center text-sm ${theme.mutedText}`}>Or</div>\n )}\n\n {config.email.enabled && (\n <div className=\"space-y-2\">\n <Input type=\"email\" placeholder={config.email.placeholder || 'Enter your email'} value={email} onChange={e => setEmail(e.target.value)} className={`h-11 ${isDark ? 'bg-gray-800 border-gray-600 text-gray-100 placeholder:text-gray-500' : ''}`} />\n <Button onClick={() => { setProviderType('email'); handleSendCode(); }} disabled={!email} className=\"w-full\" size=\"lg\" variant=\"secondary\">Continue</Button>\n </div>\n )}\n\n {(config.wallet?.enabled || (config.social.enabled && config.social.providers.some(p => p.enabled))) && (\n <div className={`text-center text-sm ${theme.mutedText}`}>Or</div>\n )}\n\n {config.wallet?.enabled && (\n <Button\n onClick={() => {\n // Close the Add Provider modal first\n setShowAdd(false);\n setProviderType(null);\n // Close main Manage Wallet modal too\n onOpenChange(false);\n // Then trigger wallet connection\n setTimeout(() => {\n setIsWalletLinking(true);\n setLinkError('');\n }, 200);\n }}\n className=\"w-full\"\n size=\"lg\"\n variant=\"outline\"\n >\n <Wallet className=\"w-4 h-4 mr-2\" />Connect External Wallet\n </Button>\n )}\n\n {config.wallet?.enabled && config.social.enabled && config.social.providers.some(p => p.enabled) && (\n <div className={`text-center text-sm ${theme.mutedText}`}>Or</div>\n )}\n\n {config.social.enabled && (\n <div className={`grid grid-cols-${config.social.gridColumns} gap-2`}>\n {config.social.providers.filter(p => p.enabled).map(sp => {\n const map: Record<string, any> = { google: GoogleIcon, telegram: TelegramIcon, twitter: TwitterIcon, x: TwitterIcon, discord: DiscordIcon };\n const F = (sp.icon as any) || map[sp.id.toLowerCase()];\n return (\n <Button key={sp.id} variant=\"outline\" onClick={() => setProviderType(sp.id)} className={`p-0 flex items-center justify-center [&_svg]:!w-5 [&_svg]:!h-5 ${isDark ? 'bg-gray-800 border-gray-600 hover:bg-gray-700' : 'bg-white border-gray-200 hover:bg-gray-50'}`} size=\"lg\">\n {F ? <F className=\"w-6 h-6\" /> : <span className=\"text-sm\">{sp.name}</span>}\n </Button>\n );\n })}\n </div>\n )}\n\n </div>\n ) : (\n <div className=\"mt-3 space-y-3\">\n {providerType === 'email' && emailCodeSent && (\n <div className=\"space-y-2\">\n <div className={`p-3 rounded text-sm ${isDark ? 'bg-green-900/30 border border-green-900 text-green-400' : 'bg-green-50 border border-green-200 text-green-700'}`}>Verification code sent to {email}</div>\n <VerificationCodeInput\n onVerifyCode={handleVerifyCode}\n onResendCode={handleSendCode}\n isLoading={linkIsLoading}\n expiresIn={expiresIn}\n error={verificationError}\n />\n </div>\n )}\n {providerType === 'passkey' && (\n <div className=\"space-y-3\">\n <div className={`p-3 rounded-xl text-sm ${isDark ? 'bg-blue-900/30 border border-blue-900 text-blue-400' : 'bg-blue-50 border border-blue-200 text-blue-700'}`}>\n Link a passkey to your account using WebAuthn. Your device may let you choose an existing passkey; otherwise a new one will be created.\n </div>\n <Button\n onClick={async () => {\n setLinkError('');\n setLinkIsLoading(true);\n try {\n // Prefer platform authenticator (this device)\n await linkPasskeyWithWebAuthn({\n authenticatorSelection: { authenticatorAttachment: 'platform', residentKey: 'preferred', userVerification: 'preferred' }\n });\n const list = await getLinkedProviders();\n setProviders(list);\n setProvidersJustUpdated(true); // Mark that we just updated providers\n try { callbacks?.onLumiaPassportUpdate?.({ providers: list }); } catch {}\n setShowAdd(false);\n setProviderType(null);\n } catch (e: any) {\n const msg = e?.message || 'Failed to link passkey';\n setLinkError(normalizePasskeyLinkError(msg));\n } finally {\n setLinkIsLoading(false);\n }\n }}\n className=\"w-full\"\n size=\"lg\"\n disabled={linkIsLoading}\n >\n <Key className=\"w-4 h-4 mr-2\" />\n {linkIsLoading ? 'Linking…' : 'Create on This Device'}\n </Button>\n <Button\n onClick={async () => {\n setLinkError('');\n setLinkIsLoading(true);\n try {\n // Prefer cross-platform authenticator (security key / phone)\n await linkPasskeyWithWebAuthn({\n authenticatorSelection: { authenticatorAttachment: 'cross-platform', residentKey: 'preferred', userVerification: 'preferred' }\n });\n const list = await getLinkedProviders();\n setProviders(list);\n setProvidersJustUpdated(true); // Mark that we just updated providers\n try { callbacks?.onLumiaPassportUpdate?.({ providers: list }); } catch {}\n setShowAdd(false);\n setProviderType(null);\n } catch (e: any) {\n const msg = e?.message || 'Failed to link passkey';\n setLinkError(normalizePasskeyLinkError(msg));\n } finally {\n setLinkIsLoading(false);\n }\n }}\n variant=\"outline\"\n className={`w-full ${theme.outlineBtn}`}\n size=\"lg\"\n disabled={linkIsLoading}\n >\n Create on Security Key\n </Button>\n {linkError && (\n <div className={`p-3 rounded text-sm break-words whitespace-pre-wrap ${isDark ? 'bg-red-900/30 border border-red-900 text-red-400' : 'bg-red-50 border border-red-200 text-red-700'}`}>\n {linkError}\n </div>\n )}\n </div>\n )}\n {providerType === 'telegram' && (\n <div className=\"space-y-3\">\n <div className={`p-3 rounded-xl text-sm ${isDark ? 'bg-blue-900/30 border border-blue-900 text-blue-400' : 'bg-blue-50 border border-blue-200 text-blue-700'}`}>\n {(config.social?.providers?.find((p: any) => (p.id || '').toLowerCase() === 'telegram')?.meta?.botUsername)\n ? 'Authenticate with Telegram to link your account.'\n : 'Telegram bot username is not configured.'}\n </div>\n <div ref={telegramContainerRef} className=\"flex justify-center\" />\n </div>\n )}\n {/* Wallet connection is now handled directly via RainbowKit modal */}\n {providerType && providerType !== 'email' && providerType !== 'passkey' && providerType !== 'telegram' && providerType !== 'wallet' && (\n <div className={`p-3 rounded-xl text-sm ${isDark ? 'bg-blue-900/30 border border-blue-900 text-blue-400' : 'bg-blue-50 border border-blue-200 text-blue-700'}`}>\n Linking with {providerType.charAt(0).toUpperCase() + providerType.slice(1)} requires OAuth implementation.\n This would typically redirect to {providerType} for authentication.\n </div>\n )}\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n {/* Confirm Unlink Modal */}\n <Dialog open={!!confirmUnlink} onOpenChange={(v) => { if (!v) { setConfirmUnlink(null); setConfirmInput(''); } }}>\n <DialogContent className={`lumia-scope max-w-[380px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden ${isDark ? 'lumia-dark' : 'lumia-light'}`}>\n <div className=\"p-5\">\n <DialogTitle className={`text-lg font-semibold ${theme.titleText}`}>Remove Authentication Method</DialogTitle>\n <DialogDescription className={`${theme.bodyText} mt-2`}>\n This will permanently unlink {confirmUnlink?.providerName} from your account.\n You may lose access if this is your only verified method.\n </DialogDescription>\n <div className={`mt-3 p-3 rounded text-sm ${isDark ? 'bg-red-900/30 border border-red-900 text-red-400' : 'bg-red-50 border border-red-200 text-red-700'}`}>\n This action cannot be undone.\n </div>\n {confirmUnlink && (\n <div className=\"mt-3\">\n <div className={`text-xs mb-1 ${theme.mutedText}`}>Type the provider ID to confirm removal:</div>\n <div className={`text-[10px] font-mono mb-2 break-all ${isDark ? 'text-gray-400' : 'text-gray-600'}`}>{confirmUnlink.externalId}</div>\n <Input\n value={confirmInput}\n onChange={e => setConfirmInput(e.target.value)}\n placeholder=\"Enter provider ID\"\n className={`h-10 ${isDark ? 'bg-gray-800 border-gray-700 text-gray-100 placeholder:text-gray-500' : ''}`}\n />\n </div>\n )}\n <div className=\"mt-4 flex justify-end gap-2\">\n <Button className={`${theme.outlineBtn}`} variant=\"outline\" onClick={() => { setConfirmUnlink(null); setConfirmInput(''); }} disabled={!!unlinking}>Cancel</Button>\n <Button\n onClick={() => confirmUnlink && handleUnlink(confirmUnlink.provider, confirmUnlink.externalId)}\n disabled={!!unlinking || !confirmUnlink || confirmInput !== confirmUnlink.externalId}\n className={`${isDark ? 'bg-red-600 hover:bg-red-500 text-white' : 'bg-red-600 hover:bg-red-700 text-white'} rounded-xl px-4`}\n >\n {unlinking ? 'Removing…' : 'Remove'}\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n </Dialog>\n </>\n );\n};\n","import React, { useEffect } from 'react';\nimport { useConnectModal } from '@rainbow-me/rainbowkit';\nimport { useAccount, useSignMessage, useDisconnect } from 'wagmi';\nimport { linkWallet, createSignatureMessage } from '../auth/providers/wallet';\nimport type { Address } from 'viem';\n\ninterface WalletConnectHandlerProps {\n isLinking: boolean;\n onLinkingComplete: (success?: boolean) => void;\n onError: (error: string) => void;\n onLoadingChange: (loading: boolean) => void;\n}\n\nexport const WalletConnectHandler: React.FC<WalletConnectHandlerProps> = ({\n isLinking,\n onLinkingComplete,\n onError,\n onLoadingChange,\n}) => {\n const { openConnectModal } = useConnectModal();\n const { address, isConnected, chain, connector } = useAccount();\n const { disconnect } = useDisconnect();\n const { signMessageAsync } = useSignMessage();\n const [hasStartedLinking, setHasStartedLinking] = React.useState(false);\n const timeoutRef = React.useRef<NodeJS.Timeout>();\n\n // Open modal when requested\n useEffect(() => {\n if (isLinking && !hasStartedLinking) {\n setHasStartedLinking(true);\n // Always disconnect first to ensure clean state\n if (isConnected) {\n disconnect();\n // Wait for disconnect to complete\n setTimeout(() => {\n if (openConnectModal) {\n openConnectModal();\n }\n }, 200);\n } else {\n // If not connected, open modal immediately\n if (openConnectModal) {\n openConnectModal();\n }\n }\n\n // Set timeout to handle case where user closes modal without connecting\n timeoutRef.current = setTimeout(() => {\n if (!isConnected && isLinking) {\n onLinkingComplete(false); // Signal completion without success\n setHasStartedLinking(false);\n }\n }, 30000); // 30 second timeout\n }\n\n // Reset state when isLinking becomes false\n if (!isLinking && hasStartedLinking) {\n setHasStartedLinking(false);\n // Clear timeout\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n // Also disconnect if still connected\n if (isConnected) {\n disconnect();\n }\n }\n }, [isLinking, hasStartedLinking, isConnected, openConnectModal, disconnect]);\n\n // Handle wallet connection and signing\n useEffect(() => {\n if (isConnected && address && isLinking && hasStartedLinking) {\n handleWalletSign();\n }\n }, [isConnected, address, isLinking, hasStartedLinking]);\n\n const handleWalletSign = async () => {\n // Clear timeout since we're proceeding with signing\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n if (!address || !chain) {\n onError('No wallet connected');\n disconnect();\n onLinkingComplete(false);\n setHasStartedLinking(false);\n return;\n }\n\n try {\n onLoadingChange(true);\n\n // Create signature message\n const message = createSignatureMessage(address);\n\n // Request signature from wallet\n const signature = await signMessageAsync({ message });\n\n if (!signature) {\n throw new Error('Failed to get signature');\n }\n\n // Get wallet metadata\n const walletName = connector?.name || 'Unknown Wallet';\n const walletType = connector?.id || 'unknown';\n\n console.log('[WalletConnectHandler] Wallet metadata:', {\n walletName,\n walletType,\n connectorInfo: connector\n });\n\n // Link wallet to account with metadata\n await linkWallet({\n address,\n signature,\n message,\n chainId: chain.id,\n walletName,\n walletType\n });\n\n // Disconnect wallet\n disconnect();\n\n // Notify success - this will trigger providers reload in parent component\n onLinkingComplete(true); // Just pass true to indicate success\n setHasStartedLinking(false);\n\n } catch (err: any) {\n const errorMsg = err?.message || 'Failed to link wallet';\n\n // User friendly error messages\n if (errorMsg.includes('User rejected') || errorMsg.includes('User denied')) {\n onError('Signature request was cancelled');\n } else if (errorMsg.includes('already linked')) {\n onError('This wallet is already linked to another account');\n } else {\n onError(errorMsg);\n }\n\n // Disconnect on error\n disconnect();\n onLinkingComplete(false);\n setHasStartedLinking(false);\n } finally {\n onLoadingChange(false);\n }\n };\n\n return null; // This component doesn't render anything\n};","import React from 'react';\n\nimport { Dialog, DialogContent, DialogTitle, DialogDescription } from './ui/dialog';\nimport { VisuallyHidden } from './ui/visually-hidden';\nimport { Button } from './ui/button';\nimport { jwtTokenManager } from '../auth';\nimport { getKeyshareInfo } from '../auth/keyshare';\nimport { getBackupStatus, getShareRecoveryStats } from '../vaultClient';\nimport { Cloud, Laptop, Shield, AlertTriangle, CheckCircle2, Server, HardDrive, RefreshCw, Key, ArrowLeft, Trash2 } from 'lucide-react';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\n\nexport interface SecurityModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onBack?: () => void;\n}\n\nexport const SecurityModal: React.FC<SecurityModalProps> = ({ open, onOpenChange, onBack }) => {\n const userId = jwtTokenManager.getUserId();\n const serverHasKeyshare = jwtTokenManager.getHasKeyshare() ?? false;\n const backup = userId ? getBackupStatus(userId) : { server: { enabled: false }, cloud: { enabled: false }, local: { enabled: false } };\n const { config } = useLumiaPassportConfig();\n const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n\n const [isRefreshing, setIsRefreshing] = React.useState(false);\n const [localInfo, setLocalInfo] = React.useState<{\n hasKeyshare: boolean;\n ownerAddress?: `0x${string}`;\n sessionId?: string;\n keyshareSize?: number;\n } | null>(null);\n const [recoveryCreatedAt, setRecoveryCreatedAt] = React.useState<string | null>(null);\n const [recoveryBrowser, setRecoveryBrowser] = React.useState<string | null>(null);\n const [recoveryUa, setRecoveryUa] = React.useState<string | null>(null);\n const [recoveryDeviceId, setRecoveryDeviceId] = React.useState<string | null>(null);\n const [recoveryDeviceName, setRecoveryDeviceName] = React.useState<string | null>(null);\n const [recoveryCountry, setRecoveryCountry] = React.useState<string | null>(null);\n const [hasServerBackup, setHasServerBackup] = React.useState(false);\n const [trustedApps, setTrustedApps] = React.useState<Array<{\n userId: string;\n projectId: string;\n origin: string;\n trustedAt: number;\n }>>([]);\n const [appToRemove, setAppToRemove] = React.useState<{ projectId: string; origin: string; hostname: string } | null>(null);\n\n const fetchRecovery = React.useCallback(async () => {\n if (!userId) return;\n\n try {\n setIsRefreshing(true);\n\n // Load local keyshare info from iframe\n const keyshareInfo = await getKeyshareInfo(userId);\n setLocalInfo(keyshareInfo);\n\n // Load trusted apps from iframe\n const { getIframeManager } = await import('../lib/iframe-manager');\n try {\n console.log('[SecurityModal] Loading trusted apps for user:', userId);\n const iframeManager = getIframeManager();\n const apps = await iframeManager.getTrustedApps(userId);\n console.log('[SecurityModal] Received trusted apps:', apps);\n setTrustedApps(apps);\n } catch (error) {\n console.error('[SecurityModal] Failed to load trusted apps:', error);\n setTrustedApps([]);\n }\n\n // Load recovery stats\n const stats = await getShareRecoveryStats();\n\n // Check if we have any recovery data\n const hasRecoveryData = stats && (stats.created || (stats.devices && stats.devices.length > 0));\n setHasServerBackup(!!hasRecoveryData);\n\n const created = stats?.created;\n setRecoveryCreatedAt(created?.at || null);\n setRecoveryBrowser(created?.browser || null);\n setRecoveryUa(created?.ua || null);\n setRecoveryDeviceId(created?.deviceId || null);\n setRecoveryDeviceName(created?.deviceName || null);\n setRecoveryCountry(created?.country || null);\n } finally {\n setIsRefreshing(false);\n }\n }, [userId]);\n\n React.useEffect(() => {\n if (open) fetchRecovery();\n }, [open, fetchRecovery]);\n\n const parseOS = (ua?: string | null): string | null => {\n if (!ua) return null;\n if (ua.includes('Mac OS X')) return 'macOS';\n if (ua.includes('Windows')) return 'Windows';\n if (ua.includes('Android')) return 'Android';\n if (ua.includes('Linux')) return 'Linux';\n if (ua.includes('iPhone') || ua.includes('iPad') || ua.includes('iOS')) return 'iOS';\n return null;\n };\n\n const confirmRemoveTrustedApp = async () => {\n if (!userId || !appToRemove) return;\n\n try {\n console.log('[SecurityModal] Removing trusted app:', appToRemove);\n const { getIframeManager } = await import('../lib/iframe-manager');\n const iframeManager = getIframeManager();\n\n const success = await iframeManager.removeTrustedApp(userId, appToRemove.projectId, appToRemove.origin);\n\n if (success) {\n console.log('[SecurityModal] Trusted app removed successfully');\n // Close dialog and refresh the list\n setAppToRemove(null);\n await fetchRecovery();\n } else {\n console.error('[SecurityModal] Failed to remove trusted app');\n }\n } catch (error) {\n console.error('[SecurityModal] Error removing trusted app:', error);\n }\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className={`lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden gap-0 ${isDark ? 'lumia-dark' : 'lumia-light'}`}>\n <VisuallyHidden>\n <DialogTitle>Security</DialogTitle>\n </VisuallyHidden>\n <DialogDescription className=\"sr-only\">Keyshare and vault status</DialogDescription>\n <div className=\"p-5 space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n {onBack && (\n <button\n onClick={onBack}\n className={`p-1 mr-1 bg-transparent border-0 ${isDark ? 'text-gray-400 hover:text-gray-300' : 'text-gray-500 hover:text-gray-700'}`}\n title=\"Back\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </button>\n )}\n <div className={`flex items-center gap-2 ${theme.text} font-semibold`}>\n <Key className=\"h-4 w-4\" />\n <span>Keyshare Status</span>\n <button onClick={fetchRecovery} className={`p-1 bg-transparent border-0 ${isDark ? 'text-gray-400 hover:text-gray-300' : 'text-gray-500 hover:text-gray-700'}`} title=\"Refresh\">\n <RefreshCw className={`h-4 w-4 ${isRefreshing ? 'animate-spin' : ''}`} />\n </button>\n </div>\n </div>\n </div>\n\n <div className=\"grid grid-cols-3 gap-4\">\n <div className=\"space-y-2 text-center\">\n <div className=\"flex items-center justify-center gap-2\"><Cloud className={`h-4 w-4 ${isDark ? 'text-gray-400' : 'text-gray-500'}`} /><span className={`text-sm font-medium ${isDark ? 'text-gray-200' : 'text-gray-800'}`}>Server</span></div>\n <span className={`inline-flex items-center text-sm px-3 py-2 rounded-full ${serverHasKeyshare ? (isDark ? 'bg-gray-800 text-green-400' : 'bg-green-50 text-green-700') : (isDark ? 'bg-gray-800 text-orange-400' : 'bg-orange-50 text-orange-700')}`}>\n {serverHasKeyshare ? <CheckCircle2 className=\"h-4 w-4 mr-1\" /> : <AlertTriangle className=\"h-4 w-4 mr-1\" />}\n {serverHasKeyshare ? 'Ready' : 'Missing'}\n </span>\n </div>\n <div className=\"space-y-2 text-center\">\n <div className=\"flex items-center justify-center gap-2\"><Laptop className={`h-4 w-4 ${isDark ? 'text-gray-400' : 'text-gray-500'}`} /><span className={`text-sm font-medium ${isDark ? 'text-gray-200' : 'text-gray-800'}`}>Local</span></div>\n <span className={`inline-flex items-center text-sm px-3 py-2 rounded-full ${localInfo?.hasKeyshare ? (isDark ? 'bg-gray-800 text-green-400' : 'bg-green-50 text-green-700') : (isDark ? 'bg-gray-800 text-orange-400' : 'bg-orange-50 text-orange-700')}`}>\n {localInfo?.hasKeyshare ? <CheckCircle2 className=\"h-4 w-4 mr-1\" /> : <AlertTriangle className=\"h-4 w-4 mr-1\" />}\n {localInfo?.hasKeyshare ? 'Ready' : 'Missing'}\n </span>\n </div>\n <div className=\"space-y-2 text-center\">\n <div className=\"flex items-center justify-center gap-2\"><Shield className={`h-4 w-4 ${isDark ? 'text-gray-400' : 'text-gray-500'}`} /><span className={`text-sm font-medium ${isDark ? 'text-gray-200' : 'text-gray-800'}`}>Vault</span></div>\n <span className={`inline-flex items-center text-sm px-3 py-2 rounded-full ${hasServerBackup ? (isDark ? 'bg-gray-800 text-green-400' : 'bg-green-50 text-green-700') : (isDark ? 'bg-gray-800 text-orange-400' : 'bg-orange-50 text-orange-700')}`}>\n {hasServerBackup ? <CheckCircle2 className=\"h-4 w-4 mr-1\" /> : <AlertTriangle className=\"h-4 w-4 mr-1\" />}\n {hasServerBackup ? 'Ready' : 'None'}\n </span>\n </div>\n </div>\n\n {/* Local keyshare details */}\n {localInfo?.hasKeyshare && (\n <div className={`space-y-0.5 text-[10px] leading-tight ${isDark ? 'text-gray-400' : 'text-gray-600'}`}>\n {localInfo.ownerAddress && (\n <div>Owner: <span className={`font-mono break-all ${isDark ? 'text-gray-200' : 'text-gray-800'}`}>{localInfo.ownerAddress}</span></div>\n )}\n {typeof localInfo.keyshareSize === 'number' && (\n <div>Size: <span className={`font-mono ${isDark ? 'text-gray-200' : 'text-gray-800'}`}>{Math.round((localInfo.keyshareSize || 0) / 1024)}KB</span></div>\n )}\n {localInfo.sessionId && (\n <div>Session: <span className={`font-mono break-all ${isDark ? 'text-gray-200' : 'text-gray-800'}`}>{localInfo.sessionId}</span></div>\n )}\n </div>\n )}\n\n <div className={`space-y-0.5 text-[10px] leading-tight ${isDark ? 'text-gray-400' : 'text-gray-500'}`}>\n {backup.server.enabled && backup.server.lastBackup && (\n <div className=\"flex items-center gap-1\"><Server className=\"h-2.5 w-2.5 text-gray-400\" /><span>Server: {new Date(backup.server.lastBackup).toLocaleString()}</span></div>\n )}\n {!backup.server.lastBackup && recoveryCreatedAt && (\n <div className=\"flex items-center gap-1\"><Server className=\"h-2.5 w-2.5 text-gray-400\" /><span>Server: {new Date(recoveryCreatedAt).toLocaleString()}</span></div>\n )}\n {backup.cloud.enabled && backup.cloud.lastBackup && (\n <div className=\"flex items-center gap-1\"><Cloud className=\"h-2.5 w-2.5 text-gray-400\" /><span>Cloud: {new Date(backup.cloud.lastBackup).toLocaleString()}</span></div>\n )}\n {backup.local.enabled && backup.local.lastBackup && (\n <div className=\"flex items-center gap-1\"><HardDrive className=\"h-2.5 w-2.5 text-gray-400\" /><span>Local: {new Date(backup.local.lastBackup).toLocaleString()}</span></div>\n )}\n </div>\n\n {(recoveryCreatedAt || recoveryBrowser || recoveryUa || recoveryDeviceId || recoveryDeviceName) && (\n <div className={`space-y-0.5 text-[10px] leading-tight ${isDark ? 'text-gray-400' : 'text-gray-600'}`}>\n <div className={`font-medium text-[11px] ${isDark ? 'text-indigo-400' : 'text-indigo-600'}`}>Device Information:</div>\n {recoveryCreatedAt && <div>Created: {new Date(recoveryCreatedAt).toLocaleString()} </div>}\n {recoveryCountry && (<div>Country: {recoveryCountry}</div>)}\n {recoveryBrowser && (<div>Browser: {recoveryBrowser}</div>)}\n {parseOS(recoveryUa) && (<div>OS: {parseOS(recoveryUa) as string}</div>)}\n {recoveryDeviceName && (<div>Device: {recoveryDeviceName}</div>)}\n {recoveryDeviceId && (<div>Device ID: <span className=\"font-mono break-all\">{recoveryDeviceId}</span></div>)}\n </div>\n )}\n\n {/* Trusted Applications */}\n {trustedApps.length > 0 && (\n <div className={`space-y-2 ${isDark ? 'text-gray-400' : 'text-gray-600'}`}>\n <div className={`font-medium text-[11px] ${isDark ? 'text-green-400' : 'text-green-600'}`}>Trusted Applications ({trustedApps.length}):</div>\n <div className=\"space-y-1\">\n {trustedApps.map((app, index) => (\n <div key={index} className={`text-[10px] leading-tight p-2 rounded flex items-start justify-between gap-2 ${isDark ? 'bg-gray-800/50' : 'bg-gray-50'}`}>\n <div className=\"flex-1 min-w-0\">\n <div className={`font-medium ${isDark ? 'text-gray-200' : 'text-gray-800'}`}>{new URL(app.origin).hostname}</div>\n <div className={`${isDark ? 'text-gray-400' : 'text-gray-500'}`}>Trusted: {new Date(app.trustedAt).toLocaleDateString()}</div>\n </div>\n <button\n onClick={() => setAppToRemove({ projectId: app.projectId, origin: app.origin, hostname: new URL(app.origin).hostname })}\n className={`p-1 rounded transition-colors ${isDark ? 'text-gray-400 hover:text-red-400 hover:bg-red-900/20' : 'text-gray-500 hover:text-red-600 hover:bg-red-50'}`}\n title=\"Remove from trusted\"\n >\n <Trash2 className=\"h-3 w-3\" />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n\n </div>\n </DialogContent>\n\n {/* Confirmation Dialog for Removing Trusted App */}\n {appToRemove && (\n <Dialog open={!!appToRemove} onOpenChange={(open) => !open && setAppToRemove(null)}>\n <DialogContent className={`lumia-scope max-w-[380px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden gap-0 ${isDark ? 'lumia-dark' : 'lumia-light'}`}>\n <VisuallyHidden>\n <DialogTitle>Remove Trusted Application</DialogTitle>\n </VisuallyHidden>\n <DialogDescription className=\"sr-only\">Confirm removal of trusted application</DialogDescription>\n <div className=\"p-5 space-y-4\">\n <div className={`text-center ${theme.text}`}>\n <div className=\"text-lg font-semibold mb-2\">Remove Trusted App?</div>\n <div className={`text-sm ${isDark ? 'text-gray-300' : 'text-gray-700'} mb-3`}>\n <span className=\"font-medium\">{appToRemove.hostname}</span>\n </div>\n <div className={`text-xs ${isDark ? 'text-gray-400' : 'text-gray-600'} text-left space-y-2`}>\n <p>After removing this application from trusted list:</p>\n <ul className=\"list-disc list-inside space-y-1 ml-2\">\n <li>All transactions will require confirmation in a separate window</li>\n <li>You can add it back to trusted list at any time</li>\n <li>Transaction confirmation window will show \"Trust this app\" checkbox</li>\n </ul>\n </div>\n </div>\n <div className=\"flex gap-2\">\n <Button\n onClick={() => setAppToRemove(null)}\n variant=\"secondary\"\n className=\"flex-1\"\n size=\"lg\"\n >\n Cancel\n </Button>\n <Button\n onClick={confirmRemoveTrustedApp}\n variant=\"danger\"\n className=\"flex-1\"\n size=\"lg\"\n >\n Remove\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n )}\n </Dialog>\n );\n};\n","import * as React from 'react';\nimport { Shield, Server, CheckCircle2, AlertCircle, Key, Eye, EyeOff, Download, Cloud, Lock, ArrowLeft } from 'lucide-react';\nimport { Button } from './ui/button';\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from './ui/card';\nimport { Input } from './ui/input';\nimport { getIframeManager } from '../lib/iframe-manager';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\nimport type { BackupMethod, BackupStatus, BackupRequest, BackupResult } from '../../iframe/lib/types';\n\ninterface KeyshareBackupProps {\n userId: string;\n onBackupSuccess?: () => void;\n onBack?: () => void;\n}\n\nexport default function KeyshareBackup({ userId, onBackupSuccess, onBack }: KeyshareBackupProps) {\n const { config } = useLumiaPassportConfig();\n const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n\n const [backupStatus, setBackupStatus] = React.useState<BackupStatus>({\n server: {},\n cloud: {},\n local: {}\n });\n const [loading, setLoading] = React.useState<Record<BackupMethod, boolean>>({\n server: false,\n cloud: false,\n local: false\n });\n const [error, setError] = React.useState<string | null>(null);\n const [success, setSuccess] = React.useState<string | null>(null);\n const [showPassword, setShowPassword] = React.useState(false);\n const [useCustomPassword, setUseCustomPassword] = React.useState(false);\n const [customPassword, setCustomPassword] = React.useState('');\n const [cloudProviders, setCloudProviders] = React.useState<\n Array<{ id: string; name: string; available: boolean }>\n >([]);\n const [selectedCloudProvider, setSelectedCloudProvider] = React.useState<string | null>(null);\n const [hasKeyshareData, setHasKeyshareData] = React.useState(true);\n\n // Get iframe manager\n const iframeManager = React.useMemo(() => {\n try {\n return getIframeManager();\n } catch (e) {\n console.error('[KeyshareBackup] Failed to get iframe manager:', e);\n return null;\n }\n }, []);\n\n // Load available cloud providers (from parent context, not iframe)\n React.useEffect(() => {\n const loadCloudProviders = async () => {\n try {\n // Import cloud storage from parent context\n const { getAvailableCloudProviders } = await import('../cloudStorage');\n const availableProviders = getAvailableCloudProviders();\n\n const providers = availableProviders.map(p => ({\n id: p.id,\n name: p.name,\n available: p.isAvailable()\n }));\n\n setCloudProviders(providers);\n if (providers.length > 0 && !selectedCloudProvider) {\n setSelectedCloudProvider(providers[0].id);\n }\n } catch (error) {\n console.error('[KeyshareBackup] Failed to load cloud providers:', error);\n }\n };\n\n loadCloudProviders();\n }, [selectedCloudProvider]);\n\n // Refresh backup status\n const refreshStatus = React.useCallback(async () => {\n if (!iframeManager) return;\n\n try {\n const status = await iframeManager.getBackupStatus(userId);\n setBackupStatus(status);\n } catch (error) {\n console.error('[KeyshareBackup] Failed to get backup status:', error);\n }\n }, [iframeManager, userId]);\n\n React.useEffect(() => {\n refreshStatus();\n }, [refreshStatus]);\n\n const handleBackup = async (method: BackupMethod) => {\n if (!iframeManager) {\n setError('Iframe manager not initialized');\n return;\n }\n\n setLoading(prev => ({ ...prev, [method]: true }));\n setError(null);\n setSuccess(null);\n\n try {\n const password = useCustomPassword ? customPassword : undefined;\n\n if (method === 'server') {\n // Server backup: handled entirely in iframe\n const jwt = await import('../auth').then(m => m.jwtTokenManager.getTokens());\n const accessToken = jwt?.accessToken;\n\n const result = await iframeManager.createBackup(userId, {\n method,\n password,\n }, accessToken);\n\n if (result.success) {\n setSuccess('Successfully created server backup');\n await refreshStatus();\n onBackupSuccess?.();\n } else {\n throw new Error(result.error || 'Server backup failed');\n }\n } else if (method === 'cloud') {\n // Cloud backup: iframe encrypts, parent uploads to cloud\n const encryptedData = await iframeManager.encryptBackupData(userId, password);\n\n // Import cloud storage provider\n const { getAvailableCloudProviders } = await import('../cloudStorage');\n const providers = getAvailableCloudProviders();\n\n const provider = selectedCloudProvider\n ? providers.find(p => p.id === selectedCloudProvider)\n : providers[0];\n\n if (!provider) {\n throw new Error('No cloud provider available');\n }\n\n // Authenticate if needed\n if (!provider.isAuthenticated()) {\n const authenticated = await provider.authenticate();\n if (!authenticated) {\n throw new Error(`Failed to authenticate with ${provider.name}`);\n }\n }\n\n // Upload to cloud\n const timestamp = Date.now();\n const fileName = `lumia-keyshare-backup-${userId}-${timestamp}.json`;\n const fileContent = JSON.stringify(encryptedData, null, 2);\n await provider.upload(fileName, fileContent, true);\n\n setSuccess(`Successfully created cloud backup on ${provider.name}`);\n await refreshStatus();\n onBackupSuccess?.();\n } else if (method === 'local') {\n // Local file backup: iframe encrypts, parent downloads\n const encryptedData = await iframeManager.encryptBackupData(userId, password);\n\n const blob = new Blob([JSON.stringify(encryptedData, null, 2)], {\n type: 'application/json',\n });\n\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `lumia-passport-backup-${userId}-${Date.now()}.json`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n\n setSuccess('Backup file downloaded successfully');\n await refreshStatus();\n onBackupSuccess?.();\n }\n\n // Dispatch event for other components\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('lumia-passport-backup-status-changed', {\n detail: { method, success: true },\n })\n );\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'Backup creation failed';\n setError(errorMsg);\n await refreshStatus();\n } finally {\n setLoading(prev => ({ ...prev, [method]: false }));\n }\n };\n\n const formatLastBackup = (timestamp?: number) => {\n if (!timestamp) return 'Never';\n const date = new Date(timestamp);\n return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;\n };\n\n return (\n <Card className={`${theme.modalBg} border-0`}>\n <CardHeader className=\"pb-3\">\n <div className=\"flex items-center gap-2\">\n {onBack && (\n <button\n onClick={onBack}\n className={`p-1 ${isDark ? 'text-gray-400 hover:text-gray-300' : 'text-gray-500 hover:text-gray-700'}`}\n title=\"Back\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </button>\n )}\n <Shield className={`h-5 w-5 ${isDark ? 'text-green-400' : 'text-green-600'}`} />\n <CardTitle className={`text-base ${theme.titleText}`}>Create Backup</CardTitle>\n </div>\n <CardDescription className={`text-sm mt-1 ${theme.mutedText}`}>Secure your keyshare with encrypted backups</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3.5\">\n {error && (\n <div className={`flex items-center gap-2 p-2 rounded text-xs ${isDark ? 'bg-red-950/50 border border-red-900/60 text-red-300' : 'bg-red-50 border border-red-200 text-red-700'}`}>\n <AlertCircle className=\"h-3.5 w-3.5 flex-shrink-0\" />\n <span>{error}</span>\n </div>\n )}\n {success && (\n <div className={`flex items-center gap-2 p-2 rounded text-xs ${isDark ? 'bg-green-950/50 border border-green-900/60 text-green-300' : 'bg-green-50 border border-green-200 text-green-700'}`}>\n <CheckCircle2 className=\"h-3.5 w-3.5 flex-shrink-0\" />\n <span>{success}</span>\n </div>\n )}\n\n <div className=\"space-y-2\">\n <div className={`text-xs font-medium ${isDark ? 'text-gray-300' : 'text-gray-700'}`}>Encryption Method:</div>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n id=\"use-backup-password\"\n checked={useCustomPassword}\n onChange={e => setUseCustomPassword(e.target.checked)}\n className=\"rounded\"\n />\n <label htmlFor=\"use-backup-password\" className={`text-xs ${isDark ? 'text-gray-300' : 'text-gray-700'}`}>\n Use custom password instead of passkey\n </label>\n </div>\n\n {!useCustomPassword && (\n <div className={`p-2 rounded text-xs ${isDark ? 'bg-blue-500/10 border border-blue-500/30 text-gray-300' : 'bg-blue-50 border border-blue-200 text-blue-700'}`}>\n <div className=\"flex items-center gap-2\">\n <Key className=\"h-3.5 w-3.5 text-blue-500\" />\n <span>Passkey will be used to encrypt the backup</span>\n </div>\n </div>\n )}\n\n {useCustomPassword && (\n <div className=\"relative\">\n <Input\n type={showPassword ? 'text' : 'password'}\n placeholder=\"Enter backup password\"\n value={customPassword}\n onChange={e => setCustomPassword(e.target.value)}\n className={`pr-10 text-sm ${isDark ? 'bg-gray-900 border-gray-600 text-white placeholder:text-gray-500' : 'bg-white border-gray-300 text-gray-900'}`}\n style={{\n WebkitTextFillColor: isDark ? '#ffffff' : '#111827',\n }}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className={`absolute right-3 inset-y-0 my-auto h-fit z-10 bg-transparent border-0 p-0 flex items-center justify-center ${isDark ? 'text-gray-400 hover:text-gray-200' : 'text-gray-500 hover:text-gray-700'}`}\n >\n {showPassword ? <EyeOff className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\n </button>\n </div>\n )}\n </div>\n\n <div className=\"space-y-2.5\">\n <div className={`text-xs font-medium ${isDark ? 'text-gray-300' : 'text-gray-700'}`}>Choose Backup Method:</div>\n\n {/* Server Backup */}\n <div className={`p-3 rounded ${isDark ? 'bg-blue-500/10' : 'bg-blue-50/50'}`}>\n <div className=\"flex items-center gap-2 mb-2\">\n <Server className={`h-4 w-4 ${isDark ? 'text-blue-400' : 'text-blue-600'}`} />\n <div className={`text-sm font-medium ${isDark ? 'text-gray-200' : 'text-gray-900'}`}>Server Backup</div>\n </div>\n <Button\n onClick={() => handleBackup('server')}\n disabled={loading.server || (useCustomPassword && !customPassword) || !hasKeyshareData}\n className=\"w-full py-2 text-sm\"\n >\n {loading.server ? 'Creating...' : useCustomPassword ? 'Create with Password' : 'Create with Passkey'}\n </Button>\n </div>\n\n {/* Cloud Backup & File Backup in one row */}\n <div className=\"grid grid-cols-2 gap-2\">\n {/* Cloud Backup */}\n <div className={`p-3 rounded flex flex-col ${isDark ? 'bg-sky-500/10' : 'bg-sky-50/50'}`}>\n <div className=\"flex items-center gap-2 mb-2\">\n <Cloud className={`h-4 w-4 ${isDark ? 'text-sky-400' : 'text-sky-600'}`} />\n <div className={`text-sm font-medium ${isDark ? 'text-gray-200' : 'text-gray-900'}`}>Cloud</div>\n </div>\n\n {/* Cloud Provider Selection - compact */}\n {cloudProviders.length > 1 && (\n <select\n value={selectedCloudProvider || ''}\n onChange={e => setSelectedCloudProvider(e.target.value)}\n className={`text-xs border rounded px-2 py-1 w-full mb-2 ${isDark ? 'bg-gray-800 border-gray-700 text-gray-200' : 'bg-white border-gray-300'}`}\n >\n {cloudProviders.map(provider => (\n <option key={provider.id} value={provider.id} disabled={!provider.available}>\n {provider.name}\n </option>\n ))}\n </select>\n )}\n\n <Button\n onClick={() => handleBackup('cloud')}\n disabled={loading.cloud || (useCustomPassword && !customPassword) || !hasKeyshareData || cloudProviders.length === 0}\n className=\"w-full py-2 text-xs\"\n size=\"sm\"\n >\n {loading.cloud ? 'Creating...' : 'Create'}\n </Button>\n </div>\n\n {/* File Backup */}\n <div className={`p-3 rounded flex flex-col ${isDark ? 'bg-purple-500/10' : 'bg-purple-50/50'}`}>\n <div className=\"flex items-center gap-2 mb-2\">\n <Download className={`h-4 w-4 ${isDark ? 'text-purple-400' : 'text-purple-600'}`} />\n <div className={`text-sm font-medium ${isDark ? 'text-gray-200' : 'text-gray-900'}`}>File</div>\n </div>\n {/* Spacer to push button down when cloud has select */}\n {cloudProviders.length > 1 && <div className=\"h-[32px]\" />}\n <Button\n onClick={() => handleBackup('local')}\n disabled={loading.local || (useCustomPassword && !customPassword) || !hasKeyshareData}\n className=\"w-full py-2 text-xs\"\n size=\"sm\"\n >\n {loading.local ? 'Creating...' : 'Download'}\n </Button>\n </div>\n </div>\n </div>\n\n <div className={`flex items-start gap-2 p-2.5 rounded text-xs ${isDark ? 'bg-amber-500/15 border border-amber-500/30 text-gray-300' : 'bg-amber-50 border border-amber-200 text-amber-900'}`}>\n <Lock className=\"h-3.5 w-3.5 mt-0.5 flex-shrink-0 text-amber-500\" />\n <div>\n <span className=\"font-medium\">Security Notice:</span> All backups are encrypted with AES-256 using your {useCustomPassword ? 'custom password' : 'passkey'}.\n {useCustomPassword ? ' Store your password securely - ' : ' Your passkey authenticator is required to restore backups. '}\n Without backup access, you cannot recover your account if you lose this device.\n </div>\n </div>\n </CardContent>\n </Card>\n );\n}","import React from 'react';\nimport { Dialog, DialogContent, DialogTitle, DialogDescription } from './ui/dialog';\nimport { VisuallyHidden } from './ui/visually-hidden';\nimport { useSmartAccountTransactions } from '../../modules/smartAccountTransactions';\nimport { useLumiaSession } from '../../context/LumiaPassportSessionContext';\nimport { Activity, ArrowUpRight, ArrowDownRight, Clock, CheckCircle2, XCircle, ExternalLink, ArrowLeft, RefreshCw } from 'lucide-react';\nimport { formatEther } from 'viem';\nimport { getExplorerUrl } from '../clients/base';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\n\nexport interface TransactionsModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onBack?: () => void;\n}\n\ninterface Transaction {\n hash: string;\n value: string;\n from: {\n hash: string;\n is_contract: boolean;\n name: string | null;\n };\n to: {\n hash: string;\n is_contract: boolean;\n name: string | null;\n };\n status: string;\n timestamp: string;\n gas_used: string;\n fee: {\n value: string;\n };\n method: string | null;\n transaction_types: string[];\n block_number: number;\n nonce: number;\n}\n\nexport const TransactionsModal: React.FC<TransactionsModalProps> = ({ open, onOpenChange, onBack }) => {\n const { address } = useLumiaSession();\n const [transactions, setTransactions] = React.useState<Transaction[]>([]);\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const { config } = useLumiaPassportConfig();\n const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n\n const loadTransactions = React.useCallback(async () => {\n if (!address) return;\n\n setLoading(true);\n setError(null);\n try {\n const explorerUrl = getExplorerUrl();\n const baseUrl = explorerUrl.replace(/\\/$/, '');\n const apiUrl = `${baseUrl}/api/v2/addresses/${address}/transactions?items_count=20`;\n\n const response = await fetch(apiUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch transactions: ${response.status}`);\n }\n\n const data = await response.json();\n setTransactions(data.items || []);\n } catch (error) {\n console.error('Failed to load transactions:', error);\n setError(error instanceof Error ? error.message : 'Failed to load transactions');\n } finally {\n setLoading(false);\n }\n }, [address]);\n\n React.useEffect(() => {\n // Only load once when modal opens\n if (open && address && !loading && transactions.length === 0) {\n loadTransactions();\n }\n }, [open]); // Remove dependencies to prevent multiple calls\n\n const formatAddress = (addr: string) => {\n return `${addr.slice(0, 6)}...${addr.slice(-4)}`;\n };\n\n const formatTime = (timestamp: string) => {\n return new Date(timestamp).toLocaleString();\n };\n\n const formatValue = (value: string) => {\n try {\n const wei = BigInt(value);\n const eth = Number(wei) / 1e18;\n return eth.toFixed(4);\n } catch {\n return '0.0000';\n }\n };\n\n const getStatusIcon = (status: string) => {\n return status === 'ok' ?\n <CheckCircle2 className=\"w-4 h-4 text-green-500\" /> :\n <XCircle className=\"w-4 h-4 text-red-500\" />;\n };\n\n const getTransactionIcon = (from: string, to: string) => {\n const isIncoming = to.toLowerCase() === address?.toLowerCase();\n return isIncoming ?\n <ArrowDownRight className=\"w-4 h-4 text-green-500\" /> :\n <ArrowUpRight className=\"w-4 h-4 text-blue-500\" />;\n };\n\n const openInExplorer = (txHash: string) => {\n const explorerUrl = getExplorerUrl();\n window.open(`${explorerUrl}/tx/${txHash}`, '_blank');\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className={`lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden max-h-[80vh] gap-0 ${isDark ? 'lumia-dark' : 'lumia-light'}`}>\n <VisuallyHidden>\n <DialogTitle>Transaction History</DialogTitle>\n </VisuallyHidden>\n <DialogDescription className=\"sr-only\">View your transaction history</DialogDescription>\n\n <div className={`p-5 border-b ${theme.divider}`}>\n <div className=\"flex items-center gap-2\">\n {onBack && (\n <button\n onClick={onBack}\n className={`${theme.iconColor} hover:${isDark ? 'text-gray-200' : 'text-gray-700'} p-1 mr-1`}\n title=\"Back\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </button>\n )}\n <div className={`flex items-center gap-2 ${theme.titleText} font-semibold`}>\n <Activity className=\"h-5 w-5\" />\n <span>Transaction History</span>\n <button\n onClick={loadTransactions}\n disabled={loading}\n className={`${theme.iconColor} hover:${isDark ? 'text-gray-200' : 'text-gray-700'} p-1`}\n title=\"Refresh transactions\"\n >\n <RefreshCw className={`h-4 w-4 ${loading ? 'animate-spin' : ''}`} />\n </button>\n </div>\n </div>\n </div>\n\n <div className=\"p-5 max-h-[60vh] overflow-y-auto\">\n {loading ? (\n <div className=\"flex items-center justify-center py-8\">\n <div className={`${theme.mutedText}`}>Loading transactions...</div>\n </div>\n ) : error ? (\n <div className={`flex flex-col items-center justify-center py-8 ${isDark ? 'text-red-400' : 'text-red-500'}`}>\n <XCircle className=\"w-12 h-12 mb-2\" />\n <p className=\"text-center text-sm\">{error}</p>\n </div>\n ) : transactions.length === 0 ? (\n <div className={`flex flex-col items-center justify-center py-8 ${theme.mutedText}`}>\n <Activity className={`w-12 h-12 mb-2 ${isDark ? 'text-gray-600' : 'text-gray-300'}`} />\n <p className=\"text-center\">No transactions found<br/>\n <span className=\"text-xs mt-2\">Smart account transactions will appear here</span>\n </p>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {transactions.map((tx) => {\n const isIncoming = tx.to.hash.toLowerCase() === address?.toLowerCase();\n const displayAddress = isIncoming ? tx.from.hash : tx.to.hash;\n\n return (\n <div\n key={tx.hash}\n className={`${isDark ? 'bg-gray-800 hover:bg-gray-700' : 'bg-gray-50 hover:bg-gray-100'} rounded-xl p-4 transition-colors cursor-pointer`}\n onClick={() => openInExplorer(tx.hash)}\n >\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n {getTransactionIcon(tx.from.hash, tx.to.hash)}\n <span className={`font-medium ${theme.titleText}`}>\n {isIncoming ? 'Received' : 'Sent'}\n </span>\n {getStatusIcon(tx.status)}\n </div>\n <div className={`text-xs ${theme.mutedText}`}>\n {formatTime(tx.timestamp)}\n </div>\n </div>\n\n <div className=\"space-y-1 text-sm\">\n <div className=\"flex justify-between\">\n <span className={`${theme.bodyText}`}>\n {isIncoming ? 'From:' : 'To:'}\n </span>\n <span className={`font-mono ${theme.titleText}`}>\n {formatAddress(displayAddress)}\n {(isIncoming ? tx.from.is_contract : tx.to.is_contract) &&\n <span className={`text-xs ${isDark ? 'text-blue-400' : 'text-blue-600'} ml-1`}>(Contract)</span>\n }\n </span>\n </div>\n\n <div className=\"flex justify-between\">\n <span className={`${theme.bodyText}`}>Value:</span>\n <span className={`font-semibold ${theme.titleText}`}>\n {formatValue(tx.value)} LUMIA\n </span>\n </div>\n\n <div className=\"flex justify-between\">\n <span className={`${theme.bodyText}`}>Block:</span>\n <span className={`font-mono ${theme.titleText}`}>#{tx.block_number}</span>\n </div>\n\n {tx.method && (\n <div className=\"flex justify-between\">\n <span className={`${theme.bodyText}`}>Method:</span>\n <span className={`${isDark ? 'text-blue-400' : 'text-blue-600'} text-xs`}>{tx.method}</span>\n </div>\n )}\n\n {tx.transaction_types && tx.transaction_types.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mt-2\">\n {tx.transaction_types.map((type, idx) => (\n <span\n key={idx}\n className={`text-xs ${isDark ? 'bg-blue-900/30 text-blue-300' : 'bg-blue-100 text-blue-800'} px-2 py-0.5 rounded-full`}\n >\n {type.replace('_', ' ')}\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {transactions.length > 0 && (\n <div className={`p-5 border-t ${theme.divider}`}>\n <div className={`text-center text-sm ${theme.mutedText}`}>\n Total: {transactions.length} transaction{transactions.length !== 1 ? 's' : ''}\n </div>\n </div>\n )}\n </DialogContent>\n </Dialog>\n );\n};","import React from 'react';\nimport { Dialog, DialogContent, DialogTitle, DialogDescription } from './ui/dialog';\nimport { VisuallyHidden } from './ui/visually-hidden';\nimport { useAssets } from '../../modules/assets';\nimport { useLumiaSession } from '../../context/LumiaPassportSessionContext';\nimport { Gem, RefreshCw, Copy, ExternalLink, ArrowLeft } from 'lucide-react';\nimport { LUMIA_EXPLORER_URL } from '../clients/base';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\n\nexport interface ViewAssetsModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onBack?: () => void;\n}\n\nexport const ViewAssetsModal: React.FC<ViewAssetsModalProps> = ({ open, onOpenChange, onBack }) => {\n const { address } = useLumiaSession();\n const { assets, refreshBalances, isLoading } = useAssets(address as `0x${string}` | undefined);\n const [copied, setCopied] = React.useState<string | null>(null);\n const { config } = useLumiaPassportConfig();\n const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n\n const handleCopy = async (text: string, type: string) => {\n try {\n await navigator.clipboard.writeText(text);\n setCopied(type);\n setTimeout(() => setCopied(null), 1500);\n } catch (error) {\n console.error('Failed to copy:', error);\n }\n };\n\n const openInExplorer = (address: string) => {\n window.open(`${LUMIA_EXPLORER_URL}/address/${address}`, '_blank');\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className={`lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden max-h-[80vh] gap-0 ${isDark ? 'lumia-dark' : 'lumia-light'}`}>\n <VisuallyHidden>\n <DialogTitle>View Assets</DialogTitle>\n </VisuallyHidden>\n <DialogDescription className=\"sr-only\">View your token balances and assets</DialogDescription>\n\n <div className={`p-5 border-b ${theme.divider}`}>\n <div className=\"flex items-center gap-2\">\n {onBack && (\n <button\n onClick={onBack}\n className={`${theme.iconColor} hover:${isDark ? 'text-gray-200' : 'text-gray-700'} p-1 mr-1`}\n title=\"Back\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </button>\n )}\n <div className={`flex items-center gap-2 ${theme.titleText} font-semibold`}>\n <Gem className=\"h-5 w-5\" />\n <span>Your Assets</span>\n <button\n onClick={refreshBalances}\n disabled={isLoading}\n className={`${theme.iconColor} hover:${isDark ? 'text-gray-200' : 'text-gray-700'} p-1`}\n title=\"Refresh balances\"\n >\n <RefreshCw className={`h-4 w-4 ${isLoading ? 'animate-spin' : ''}`} />\n </button>\n </div>\n </div>\n </div>\n\n <div className=\"p-5 max-h-[60vh] overflow-y-auto\">\n {isLoading ? (\n <div className=\"flex items-center justify-center py-8\">\n <div className={`${theme.mutedText}`}>Loading assets...</div>\n </div>\n ) : assets.length === 0 ? (\n <div className={`flex flex-col items-center justify-center py-8 ${theme.mutedText}`}>\n <Gem className={`w-12 h-12 mb-2 ${isDark ? 'text-gray-600' : 'text-gray-300'}`} />\n <p>No assets found</p>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {assets.map((asset, index) => (\n <div key={`${asset.type}-${asset.address || 'native'}-${index}`} className={`${isDark ? 'bg-gray-800 hover:bg-gray-700' : 'bg-gray-50 hover:bg-gray-100'} rounded-xl p-4 transition-colors`}>\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 bg-gradient-to-br from-purple-500 to-blue-600 rounded-full flex items-center justify-center\">\n <span className=\"text-white font-bold text-sm\">\n {asset.symbol.charAt(0)}\n </span>\n </div>\n <div>\n <div className={`font-medium ${theme.titleText}`}>{asset.name}</div>\n <div className={`text-sm ${theme.mutedText}`}>{asset.symbol}</div>\n </div>\n </div>\n <div className=\"text-right\">\n <div className={`font-mono ${theme.titleText}`}>{asset.formattedBalance}</div>\n <div className={`text-sm ${theme.mutedText}`}>{asset.symbol}</div>\n </div>\n </div>\n\n {asset.address && (\n <div className={`space-y-2 mt-3 pt-3 border-t ${theme.divider}`}>\n <div className=\"flex items-center justify-between text-sm\">\n <span className={`${theme.bodyText}`}>Contract Address:</span>\n <div className=\"flex items-center gap-2\">\n <span className={`font-mono ${theme.titleText} text-xs`}>\n {`${asset.address.slice(0, 6)}...${asset.address.slice(-4)}`}\n </span>\n <button\n onClick={() => handleCopy(asset.address!, 'address')}\n className={`${isDark ? 'text-gray-500 hover:text-gray-300' : 'text-gray-400 hover:text-gray-600'}`}\n title=\"Copy address\"\n >\n {copied === 'address' ? (\n <span className={`${isDark ? 'text-green-400' : 'text-green-500'} text-xs`}>✓</span>\n ) : (\n <Copy className=\"w-3 h-3\" />\n )}\n </button>\n <button\n onClick={() => openInExplorer(asset.address!)}\n className={`${isDark ? 'text-gray-500 hover:text-gray-300' : 'text-gray-400 hover:text-gray-600'}`}\n title=\"View in explorer\"\n >\n <ExternalLink className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n\n {asset.decimals && (\n <div className=\"flex items-center justify-between text-sm\">\n <span className={`${theme.bodyText}`}>Decimals:</span>\n <span className={`${theme.titleText}`}>{asset.decimals}</span>\n </div>\n )}\n </div>\n )}\n\n {asset.type === 'native' && address && (\n <div className=\"mt-3 pt-3 border-t border-gray-200\">\n <div className=\"flex items-center justify-between text-sm\">\n <span className={`${theme.bodyText}`}>Your Address:</span>\n <div className=\"flex items-center gap-2\">\n <span className={`font-mono ${theme.titleText} text-xs`}>\n {`${address.slice(0, 6)}...${address.slice(-4)}`}\n </span>\n <button\n onClick={() => handleCopy(address, 'wallet')}\n className={`${isDark ? 'text-gray-500 hover:text-gray-300' : 'text-gray-400 hover:text-gray-600'}`}\n title=\"Copy wallet address\"\n >\n {copied === 'wallet' ? (\n <span className={`${isDark ? 'text-green-400' : 'text-green-500'} text-xs`}>✓</span>\n ) : (\n <Copy className=\"w-3 h-3\" />\n )}\n </button>\n <button\n onClick={() => openInExplorer(address)}\n className={`${isDark ? 'text-gray-500 hover:text-gray-300' : 'text-gray-400 hover:text-gray-600'}`}\n title=\"View in explorer\"\n >\n <ExternalLink className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n\n {assets.length > 0 && (\n <div className={`p-5 border-t ${theme.divider}`}>\n <div className={`text-center text-sm ${theme.mutedText}`}>\n Total: {assets.length} asset{assets.length !== 1 ? 's' : ''}\n </div>\n </div>\n )}\n </DialogContent>\n </Dialog>\n );\n};","import React from 'react';\nimport { useBalance, useReadContract, useReadContracts } from 'wagmi';\nimport { formatEther, formatUnits, erc20Abi } from 'viem';\nimport { lumiaBeam } from '../internal/clients/base';\n\nexport interface TokenBalance {\n address: `0x${string}`;\n name: string;\n symbol: string;\n decimals: number;\n balance: string;\n formattedBalance: string;\n logo?: string;\n}\n\nexport interface Asset {\n type: 'native' | 'erc20' | 'erc721' | 'erc1155';\n address?: `0x${string}`;\n name: string;\n symbol: string;\n balance: string;\n formattedBalance: string;\n decimals?: number;\n tokenId?: string;\n logo?: string;\n}\n\n// Common ERC20 tokens on Lumia (example addresses - would need real ones)\nconst COMMON_TOKENS: Array<{\n address: `0x${string}`;\n name: string;\n symbol: string;\n decimals: number;\n logo?: string;\n}> = [\n // Add real token addresses here when available\n // {\n // address: '0x....',\n // name: 'USD Coin',\n // symbol: 'USDC',\n // decimals: 6,\n // logo: 'https://...'\n // }\n];\n\nexport function useAssets(address?: `0x${string}`) {\n // Get native LUMIA balance\n const { data: nativeBalance, isLoading: nativeBalanceLoading, refetch: refetchNativeBalance } = useBalance({\n address,\n chainId: lumiaBeam.id,\n query: {\n enabled: !!address,\n },\n });\n\n // Get ERC20 token balances\n const tokenContracts = COMMON_TOKENS.map(token => ({\n address: token.address,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: [address as `0x${string}`],\n chainId: lumiaBeam.id,\n }));\n\n const readContractsResult: any = useReadContracts({\n contracts: tokenContracts as any,\n query: {\n enabled: !!address && COMMON_TOKENS.length > 0,\n },\n } as any);\n const { data: tokenBalances, isLoading: tokenBalancesLoading, refetch: refetchTokenBalances } = readContractsResult as any;\n\n const getAllAssets = (): Asset[] => {\n const assets: Asset[] = [];\n\n // Add native LUMIA\n if (nativeBalance) {\n assets.push({\n type: 'native',\n name: 'Lumia',\n symbol: 'LUMIA',\n balance: nativeBalance.value.toString(),\n formattedBalance: parseFloat(nativeBalance.formatted).toFixed(4),\n decimals: 18,\n });\n }\n\n // Add ERC20 tokens\n if (tokenBalances && COMMON_TOKENS.length > 0) {\n tokenBalances.forEach((balance, index) => {\n const token = COMMON_TOKENS[index];\n if (balance.status === 'success' && balance.result) {\n const balanceValue = balance.result as bigint;\n const formattedBalance = formatUnits(balanceValue, token.decimals);\n\n assets.push({\n type: 'erc20',\n address: token.address,\n name: token.name,\n symbol: token.symbol,\n balance: balanceValue.toString(),\n formattedBalance: parseFloat(formattedBalance).toFixed(4),\n decimals: token.decimals,\n logo: token.logo,\n });\n }\n });\n }\n\n return assets;\n };\n\n const getTokenBalance = (tokenAddress: `0x${string}`) => {\n const tokenIndex = COMMON_TOKENS.findIndex(token =>\n token.address.toLowerCase() === tokenAddress.toLowerCase()\n );\n\n if (tokenIndex === -1 || !tokenBalances?.[tokenIndex]) {\n return null;\n }\n\n const balance = tokenBalances[tokenIndex];\n const token = COMMON_TOKENS[tokenIndex];\n\n if (balance.status === 'success' && balance.result) {\n const balanceValue = balance.result as bigint;\n const formattedBalance = formatUnits(balanceValue, token.decimals);\n\n return {\n address: token.address,\n name: token.name,\n symbol: token.symbol,\n decimals: token.decimals,\n balance: balanceValue.toString(),\n formattedBalance: parseFloat(formattedBalance).toFixed(4),\n logo: token.logo,\n };\n }\n\n return null;\n };\n\n const refreshBalances = async () => {\n await Promise.all([\n refetchNativeBalance(),\n refetchTokenBalances(),\n ]);\n };\n\n return {\n nativeBalance,\n tokenBalances,\n assets: getAllAssets(),\n getTokenBalance,\n refreshBalances,\n isLoading: nativeBalanceLoading || tokenBalancesLoading,\n isConnected: !!address,\n };\n}\n\n// Hook for getting specific token information\nexport function useTokenInfo(tokenAddress: `0x${string}`) {\n const readContractsResult: any = useReadContracts({\n contracts: [\n { address: tokenAddress, abi: erc20Abi, functionName: 'name', chainId: lumiaBeam.id },\n { address: tokenAddress, abi: erc20Abi, functionName: 'symbol', chainId: lumiaBeam.id },\n { address: tokenAddress, abi: erc20Abi, functionName: 'decimals', chainId: lumiaBeam.id },\n ] as any,\n } as any);\n const { data: tokenData, isLoading } = readContractsResult as any;\n\n if (!tokenData || isLoading) {\n return { isLoading, tokenInfo: null };\n }\n\n const [nameResult, symbolResult, decimalsResult] = tokenData;\n\n if (nameResult.status === 'success' &&\n symbolResult.status === 'success' &&\n decimalsResult.status === 'success') {\n return {\n isLoading: false,\n tokenInfo: {\n name: nameResult.result as string,\n symbol: symbolResult.result as string,\n decimals: decimalsResult.result as number,\n address: tokenAddress,\n },\n };\n }\n\n return { isLoading: false, tokenInfo: null };\n}\n\n// Hook for getting token balance for a specific token\nexport function useTokenBalance(tokenAddress: `0x${string}`, userAddress?: `0x${string}`) {\n const { data: balance, isLoading, refetch } = useReadContract({\n address: tokenAddress,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: userAddress ? [userAddress] : undefined,\n chainId: lumiaBeam.id,\n query: {\n enabled: !!userAddress,\n },\n });\n\n const { tokenInfo } = useTokenInfo(tokenAddress);\n\n const formattedBalance = React.useMemo(() => {\n if (!balance || !tokenInfo) return '0';\n return formatUnits(balance as bigint, tokenInfo.decimals);\n }, [balance, tokenInfo]);\n\n return {\n balance,\n formattedBalance,\n tokenInfo,\n isLoading,\n refetch,\n };\n}\n","import React, { useState, useEffect } from 'react';\nimport { Dialog, DialogContent, DialogTitle, DialogDescription } from './ui/dialog';\nimport { VisuallyHidden } from './ui/visually-hidden';\nimport { Button } from './ui/button';\nimport { Send, ArrowLeft, Loader2, CheckCircle2, AlertCircle } from 'lucide-react';\nimport { useSendTransaction } from '../../hooks/useSendTransaction';\nimport { useLumiaSession } from '../../context/LumiaPassportSessionContext';\nimport { useAssets } from '../../modules/assets';\nimport { formatEther, parseEther, isAddress } from 'viem';\nimport { useBalance } from 'wagmi';\nimport { UserOpStatus } from './UserOpStatus';\nimport { lumiaBeam } from '../clients/base';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\n\nexport interface SendModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onBack?: () => void;\n recipientAddress?: string;\n amount?: string;\n}\n\nexport const SendModal: React.FC<SendModalProps> = ({\n open,\n onOpenChange,\n onBack,\n recipientAddress: initialRecipient = '',\n amount: initialAmount = ''\n}) => {\n const { address } = useLumiaSession();\n const { assets } = useAssets(address as `0x${string}` | undefined);\n const { config } = useLumiaPassportConfig();\n const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n const { sendTransaction, isLoading, error, userOpHash, reset } = useSendTransaction();\n const { refetch: refetchBalance } = useBalance({\n address: address as `0x${string}` | undefined,\n chainId: lumiaBeam.id,\n });\n\n const [recipient, setRecipient] = useState(initialRecipient);\n const [amount, setAmount] = useState(initialAmount);\n const [txStep, setTxStep] = useState<'input' | 'confirm' | 'pending' | 'success'>('input');\n const [validationError, setValidationError] = useState<string | null>(null);\n\n // Get native token balance\n const nativeAsset = assets.find(a => a.type === 'native');\n const balance = nativeAsset ? parseFloat(nativeAsset.formattedBalance) : 0;\n\n useEffect(() => {\n if (open) {\n // Reset state when modal opens\n setTxStep('input');\n setValidationError(null);\n reset();\n if (!initialRecipient) setRecipient('');\n if (!initialAmount) setAmount('');\n }\n }, [open, reset, initialRecipient, initialAmount]);\n\n const validateInput = (): boolean => {\n // Validate recipient\n if (!recipient) {\n setValidationError('Please enter a recipient address');\n return false;\n }\n\n if (!isAddress(recipient)) {\n setValidationError('Invalid recipient address');\n return false;\n }\n\n if (recipient.toLowerCase() === address?.toLowerCase()) {\n setValidationError('Cannot send to yourself');\n return false;\n }\n\n // Validate amount\n const amountNum = parseFloat(amount);\n if (!amount || isNaN(amountNum) || amountNum <= 0) {\n setValidationError('Please enter a valid amount');\n return false;\n }\n\n if (amountNum > balance) {\n setValidationError('Insufficient balance');\n return false;\n }\n\n setValidationError(null);\n return true;\n };\n\n const handleSend = async () => {\n if (!validateInput()) return;\n\n setTxStep('confirm');\n };\n\n const handleConfirm = async () => {\n setTxStep('pending');\n const hash = await sendTransaction({\n to: recipient,\n value: amount\n });\n\n if (hash) {\n setTxStep('success');\n // Refresh balance after successful transaction\n setTimeout(() => {\n refetchBalance();\n }, 2000); // Wait 2 seconds for transaction to be processed\n } else {\n setTxStep('input');\n }\n };\n\n const handleClose = () => {\n onOpenChange(false);\n };\n\n const handleMaxAmount = () => {\n // Leave some for gas\n const maxAmount = Math.max(0, balance - 0.001);\n setAmount(maxAmount.toFixed(6));\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className={`lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden max-h-[80vh] gap-0 ${isDark ? 'lumia-dark' : 'lumia-light'}`}\n style={{\n borderRadius: config.ui.modal?.borderRadius || '24px',\n maxWidth: config.ui.modal?.width || '400px',\n ['--lumia-font-base' as any]: config.ui.fonts?.base,\n ['--lumia-font-heading' as any]: config.ui.fonts?.heading,\n fontFamily: (config.ui.fonts?.base as any) || 'system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif',\n }}\n >\n <VisuallyHidden>\n <DialogTitle>Send Transaction</DialogTitle>\n </VisuallyHidden>\n <DialogDescription className=\"sr-only\">Send LUMIA tokens to another address</DialogDescription>\n\n <div className={`p-5 border-b ${theme.divider}`}>\n <div className=\"flex items-center gap-2\">\n {onBack && txStep === 'input' && (\n <button\n onClick={onBack}\n className={`${theme.iconColor} hover:${isDark ? 'text-gray-200' : 'text-gray-700'} p-1 mr-1`}\n title=\"Back\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </button>\n )}\n <div className={`flex items-center gap-2 ${theme.titleText} font-semibold`}>\n <Send className=\"h-5 w-5\" />\n <span>Send LUMIA</span>\n </div>\n </div>\n </div>\n\n <div className=\"p-5\">\n {txStep === 'input' && (\n <div className=\"space-y-4\">\n <div>\n <label className={`block text-sm font-medium ${theme.bodyText} mb-2`}>\n Recipient Address\n </label>\n <input\n type=\"text\"\n value={recipient}\n onChange={(e) => setRecipient(e.target.value)}\n placeholder=\"0x...\"\n className={`w-full px-3 py-2 border ${isDark ? 'bg-gray-800 border-gray-600 text-white placeholder:text-gray-400' : 'bg-white border-gray-300 text-gray-900 placeholder:text-gray-400'} rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500`}\n />\n </div>\n\n <div>\n <div className=\"flex justify-between items-center mb-2\">\n <label className={`text-sm font-medium ${theme.bodyText}`}>\n Amount\n </label>\n <div className={`text-sm ${theme.mutedText}`}>\n Balance: {balance.toFixed(4)} LUMIA\n </div>\n </div>\n <div className=\"relative\">\n <input\n type=\"number\"\n value={amount}\n onChange={(e) => setAmount(e.target.value)}\n placeholder=\"0.0\"\n step=\"0.000001\"\n className={`w-full px-3 py-2 pr-16 border ${isDark ? 'bg-gray-800 border-gray-600 text-white placeholder:text-gray-400' : 'bg-white border-gray-300 text-gray-900 placeholder:text-gray-400'} rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500`}\n />\n <button\n onClick={handleMaxAmount}\n className={`absolute right-2 top-1/2 -translate-y-1/2 px-2 py-1 text-xs ${isDark ? 'text-blue-400 hover:text-blue-300' : 'text-blue-600 hover:text-blue-800'}`}\n >\n MAX\n </button>\n </div>\n </div>\n\n {(validationError || error) && (\n <div className={`flex items-center gap-2 p-3 ${isDark ? 'bg-red-900/30 text-red-400' : 'bg-red-50 text-red-700'} rounded-lg`}>\n <AlertCircle className=\"h-4 w-4\" />\n <span className=\"text-sm\">{validationError || error}</span>\n </div>\n )}\n\n <Button\n onClick={handleSend}\n disabled={isLoading}\n className=\"w-full\"\n size=\"lg\"\n >\n Continue\n </Button>\n </div>\n )}\n\n {txStep === 'confirm' && (\n <div className=\"space-y-4\">\n <div className={`${isDark ? 'bg-gray-800' : 'bg-gray-50'} rounded-lg p-4`}>\n <h3 className={`font-medium ${theme.titleText} mb-3`}>Transaction Details</h3>\n <div className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between\">\n <span className={`${theme.bodyText}`}>To:</span>\n <span className={`font-mono ${theme.titleText}`}>\n {`${recipient.slice(0, 6)}...${recipient.slice(-4)}`}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className={`${theme.bodyText}`}>Amount:</span>\n <span className={`font-semibold ${theme.titleText}`}>{amount} LUMIA</span>\n </div>\n <div className=\"flex justify-between\">\n <span className={`${theme.bodyText}`}>Network:</span>\n <span className={`${theme.titleText}`}>Lumia Beam</span>\n </div>\n </div>\n </div>\n\n <div className=\"flex gap-2\">\n <Button\n onClick={() => setTxStep('input')}\n variant=\"outline\"\n className=\"flex-1\"\n size=\"lg\"\n >\n Back\n </Button>\n <Button\n onClick={handleConfirm}\n disabled={isLoading}\n className=\"flex-1\"\n size=\"lg\"\n >\n {isLoading && <Loader2 className=\"h-4 w-4 animate-spin\" />}\n Confirm\n </Button>\n </div>\n </div>\n )}\n\n {txStep === 'pending' && (\n <div className=\"py-8 text-center space-y-4\">\n <Loader2 className={`h-12 w-12 animate-spin ${isDark ? 'text-blue-400' : 'text-blue-600'} mx-auto`} />\n <div>\n <p className={`font-medium ${theme.titleText}`}>Transaction Pending</p>\n <p className={`text-sm ${theme.mutedText} mt-1`}>Please wait while we process your transaction</p>\n </div>\n </div>\n )}\n\n {txStep === 'success' && userOpHash && (\n <div className=\"space-y-4\">\n <div className=\"text-center py-4\">\n <CheckCircle2 className={`h-12 w-12 ${isDark ? 'text-green-400' : 'text-green-500'} mx-auto mb-3`} />\n <p className={`font-medium ${theme.titleText}`}>Transaction Sent!</p>\n <p className={`text-sm ${theme.mutedText} mt-1`}>Your transaction is being processed</p>\n </div>\n\n <div className={`${isDark ? 'bg-gray-800' : 'bg-gray-50'} rounded-lg p-4`}>\n <UserOpStatus userOpHash={userOpHash} chain={lumiaBeam} />\n </div>\n\n <Button\n onClick={handleClose}\n className=\"w-full\"\n size=\"lg\"\n >\n Done\n </Button>\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n","import { useState, useCallback } from 'react';\nimport { parseEther, isAddress } from 'viem';\nimport { sendUserOperation } from '../internal/clients/account';\nimport { useLumiaSession } from '../context/LumiaPassportSessionContext';\n\nexport interface SendTransactionParams {\n to: `0x${string}`;\n value: string;\n data?: `0x${string}`;\n}\n\nexport interface UseSendTransactionReturn {\n sendTransaction: (params: SendTransactionParams) => Promise<string | null>;\n isLoading: boolean;\n error: string | null;\n userOpHash: string | null;\n reset: () => void;\n}\n\nexport function useSendTransaction(): UseSendTransactionReturn {\n const { session, address } = useLumiaSession();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [userOpHash, setUserOpHash] = useState<string | null>(null);\n\n const sendTransaction = useCallback(async (params: SendTransactionParams): Promise<string | null> => {\n if (!session || !address) {\n setError('No active session');\n return null;\n }\n\n // Validate recipient address\n if (!isAddress(params.to)) {\n setError('Invalid recipient address');\n return null;\n }\n\n // Validate amount\n const value = parseFloat(params.value);\n if (isNaN(value) || value < 0) {\n setError('Invalid amount');\n return null;\n }\n\n setIsLoading(true);\n setError(null);\n setUserOpHash(null);\n\n try {\n // Convert value to wei\n const valueWei = parseEther(params.value).toString();\n\n // Send the transaction\n const hash = await sendUserOperation(\n session,\n params.to,\n valueWei,\n (params.data || '0x') as `0x${string}`,\n 'standard',\n 'v0.7'\n );\n\n setUserOpHash(hash);\n return hash;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Transaction failed';\n setError(errorMessage);\n return null;\n } finally {\n setIsLoading(false);\n }\n }, [session, address]);\n\n const reset = useCallback(() => {\n setError(null);\n setUserOpHash(null);\n setIsLoading(false);\n }, []);\n\n return {\n sendTransaction,\n isLoading,\n error,\n userOpHash,\n reset\n };\n}","import * as React from 'react';\nimport { AlertCircle, CheckCircle2, Clock, Copy, ExternalLink, RefreshCw } from 'lucide-react';\nimport { Button } from './ui/button';\nimport { Badge } from './ui/badge';\nimport { Address } from './Address';\nimport { cn } from '../utils/cn';\nimport { getBundlerUrl } from '../clients/base';\n\ntype ChainLike = {\n id: number;\n blockExplorers?: { default?: { url: string } };\n};\n\nexport type UserOpStatusProps = {\n userOpHash: `0x${string}` | string;\n chain?: ChainLike;\n className?: string;\n pollMs?: number;\n maxPollTimeMs?: number; // Maximum time to poll before giving up\n // Optional: provide external state to avoid duplicate polling\n externalState?: {\n receipt?: any | null;\n mempool?: any | null;\n error?: string | null;\n isPolling?: boolean;\n };\n};\n\nexport const UserOpStatus: React.FC<UserOpStatusProps> = ({\n userOpHash,\n chain,\n className,\n pollMs = 1000,\n maxPollTimeMs = 60000, // Default 1 minute\n externalState,\n}) => {\n // If external state is provided, use it instead of internal polling\n const useExternalState = !!externalState;\n\n const [internalReceipt, setInternalReceipt] = React.useState<any | null>(null);\n const [internalMempool, setInternalMempool] = React.useState<any | null>(null);\n const [internalError, setInternalError] = React.useState<string | null>(null);\n const [attempt, setAttempt] = React.useState<number>(0);\n const [internalRefreshing, setInternalRefreshing] = React.useState<boolean>(false);\n const [timedOut, setTimedOut] = React.useState<boolean>(false);\n const [rejected, setRejected] = React.useState<boolean>(false);\n const intervalRef = React.useRef<NodeJS.Timeout | null>(null);\n const startTimeRef = React.useRef<number>(Date.now());\n\n // Use external state if provided, otherwise use internal state\n const receipt = useExternalState ? externalState.receipt ?? null : internalReceipt;\n const mempool = useExternalState ? externalState.mempool ?? null : internalMempool;\n const error = useExternalState ? externalState.error ?? null : internalError;\n const refreshing = useExternalState ? externalState.isPolling ?? false : internalRefreshing;\n\n const rpc = React.useCallback(async (method: string, params: any[]) => {\n const body = { jsonrpc: '2.0', id: 1, method, params };\n const res = await fetch(getBundlerUrl(), {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body),\n });\n const json = await res.json();\n if (json.error) throw new Error(json.error.message || JSON.stringify(json.error));\n return json.result;\n }, []);\n\n // Normalize various bundler responses (e.g., Rundler nests fields under userOperation)\n const extractMempoolInfo = React.useCallback((m: any) => {\n if (!m) return null;\n const entryPoint = m.entryPoint || m?.userOperation?.entryPoint || null;\n const sender = m.sender || m?.userOperation?.sender || null;\n if (!entryPoint && !sender) return null;\n return { entryPoint, sender } as const;\n }, []);\n\n const tick = React.useCallback(async () => {\n // Don't poll if using external state\n if (useExternalState) return;\n\n // Check if we've exceeded the maximum polling time\n const elapsed = Date.now() - startTimeRef.current;\n if (elapsed > maxPollTimeMs) {\n setTimedOut(true);\n setInternalMempool(null);\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n return;\n }\n\n try {\n setInternalRefreshing(true);\n setInternalError(null);\n const r = await rpc('eth_getUserOperationReceipt', [userOpHash]);\n if (r) {\n setInternalReceipt(r);\n setInternalMempool(null);\n // Clear interval when we get receipt\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n return;\n }\n const m = await rpc('eth_getUserOperationByHash', [userOpHash]);\n if (m === null) {\n // null result means UserOperation was dropped from mempool - terminal state\n setRejected(true);\n setInternalMempool(null);\n // Clear interval when UserOp is rejected\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n return;\n }\n const info = extractMempoolInfo(m);\n setInternalMempool(info);\n } catch (e: any) {\n setInternalError(e?.message || String(e));\n } finally {\n setInternalRefreshing(false);\n setAttempt(x => x + 1);\n }\n }, [rpc, userOpHash, maxPollTimeMs, extractMempoolInfo, useExternalState]);\n\n // Initialize state when hash changes (skip if using external state)\n React.useEffect(() => {\n if (useExternalState) return;\n\n console.log('[UserOpStatus] Initializing polling for UserOp hash:', userOpHash);\n startTimeRef.current = Date.now();\n setTimedOut(false);\n setRejected(false);\n setInternalReceipt(null);\n setInternalMempool(null);\n setInternalError(null);\n setAttempt(0);\n setInternalRefreshing(false);\n }, [userOpHash, useExternalState]);\n\n // Start polling effect (skip if using external state)\n React.useEffect(() => {\n if (useExternalState) {\n console.log('[UserOpStatus] Using external state, skipping internal polling');\n return;\n }\n\n if (receipt) {\n console.log('[UserOpStatus] Already have receipt, not starting polling');\n return;\n }\n\n let mounted = true;\n\n const startPolling = async () => {\n if (mounted) {\n console.log('[UserOpStatus] Starting polling for hash:', userOpHash, 'pollMs:', pollMs);\n await tick();\n\n // Start interval only if still mounted and no receipt\n if (mounted && !receipt) {\n console.log('[UserOpStatus] Starting interval polling every', pollMs, 'ms');\n intervalRef.current = setInterval(() => {\n if (mounted) tick();\n }, pollMs);\n }\n }\n };\n\n startPolling();\n\n return () => {\n mounted = false;\n if (intervalRef.current) {\n console.log('[UserOpStatus] Clearing interval in cleanup');\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n };\n }, [userOpHash, pollMs, useExternalState]);\n\n const stateBadge = () => {\n if (receipt) {\n const ok = !!receipt.success;\n return (\n <Badge variant={ok ? 'success' : 'destructive'} className=\"gap-1\">\n {ok ?\n <CheckCircle2 className=\"h-3 w-3\" />\n : <AlertCircle className=\"h-3 w-3\" />}\n {ok ? 'Included' : 'Failed'}\n </Badge>\n );\n }\n if (rejected) {\n return (\n <Badge variant=\"destructive\" className=\"gap-1\">\n <AlertCircle className=\"h-3 w-3\" /> Rejected by bundler\n </Badge>\n );\n }\n if (timedOut) {\n return (\n <Badge variant=\"warning\" className=\"gap-1\">\n <AlertCircle className=\"h-3 w-3\" /> Timeout - may be rejected\n </Badge>\n );\n }\n if (mempool) {\n return (\n <Badge variant=\"outline\" className=\"gap-1\">\n <Clock className=\"h-3 w-3\" /> Pending in bundler\n </Badge>\n );\n }\n return (\n <Badge variant=\"secondary\" className=\"gap-1\">\n <Clock className=\"h-3 w-3\" /> Waiting\n </Badge>\n );\n };\n\n return (\n <div\n className={cn(\"lumia-scope bg-card text-card-foreground p-0 rounded-xl border border-border w-full max-w-[680px]\", className)}\n style={{ textAlign: 'left', listStyle: 'none' }}\n >\n {/* Header with Badge and Refresh button */}\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center gap-2\">\n {stateBadge()}\n <span className=\"text-xs text-muted-foreground\">\n This is a UserOperation hash (EIP-4337), not a L2 tx hash.\n </span>\n </div>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => tick()} disabled={refreshing} className=\"h-8\">\n <RefreshCw className={cn(\"h-3.5 w-3.5 mr-1\", refreshing && \"animate-spin\")} />\n <span className=\"text-xs\">Refresh</span>\n </Button>\n </div>\n\n {/* UserOp Hash Row */}\n <div className=\"flex items-center gap-2 mb-2\">\n <span className=\"text-sm font-medium min-w-16 shrink-0\">UO Hash</span>\n <code className=\"text-xs font-mono flex-1 select-all\">{userOpHash}</code>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 w-8 p-0\"\n onClick={async () => {\n try {\n await navigator.clipboard.writeText(userOpHash);\n } catch {}\n }}\n >\n <Copy className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n\n {/* Tx Hash Row (only when receipt exists) */}\n {receipt && receipt.receipt?.transactionHash && (\n <div className=\"flex items-center gap-2 mb-3\">\n <span className=\"text-sm font-medium min-w-16 shrink-0\">Tx Hash</span>\n <code className=\"text-xs font-mono flex-1 select-all\">\n {receipt.receipt.transactionHash}\n </code>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 w-8 p-0\"\n onClick={async () => {\n try {\n await navigator.clipboard.writeText(receipt.receipt.transactionHash);\n } catch {}\n }}\n >\n <Copy className=\"h-3.5 w-3.5\" />\n </Button>\n {chain?.blockExplorers?.default?.url && (\n <a\n href={`${chain.blockExplorers.default.url}/tx/${receipt.receipt.transactionHash}`}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"inline-flex items-center justify-center h-8 w-8 rounded-md hover:bg-accent text-foreground\"\n title=\"Open in explorer\"\n >\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n )}\n </div>\n )}\n\n {/* Block info (only when receipt exists) */}\n {receipt && (\n <div className=\"text-xs text-muted-foreground mb-3\">\n Block {parseInt(receipt.receipt?.blockNumber || '0x0', 16)} • Gas Used{' '}\n {parseInt(receipt.actualGasUsed || '0x0', 16)} • Success {String(!!receipt.success)}\n </div>\n )}\n\n {/* Bundler info */}\n <div className=\"text-xs text-muted-foreground\">\n {/* Bundler: {getBundlerUrl()} */}\n {!receipt && !timedOut && !rejected && (\n <span className=\"ml-2\">\n • Polling for {Math.round((Date.now() - startTimeRef.current) / 1000)}s\n </span>\n )}\n </div>\n\n {/* Mempool info */}\n {mempool && (\n <div className=\"text-sm text-muted-foreground mt-2\" style={{ listStyle: 'none' }}>\n <div>Seen by bundler at <Address address={mempool.entryPoint} chain={chain} showExplorer truncate={false} /></div>\n <div>sender <Address address={mempool.sender} chain={chain} truncate={false} /></div>\n </div>\n )}\n\n {/* Error messages */}\n {error && (\n <div className=\"text-sm text-destructive flex items-center gap-1 mt-4\">\n <AlertCircle className=\"h-4 w-4\" /> {error}\n </div>\n )}\n {rejected && (\n <div className=\"text-sm text-destructive flex items-center gap-1 mt-4\">\n <AlertCircle className=\"h-4 w-4\" />\n UserOperation was dropped from bundler mempool. This usually means it was invalid or\n replaced.\n </div>\n )}\n {timedOut && (\n <div className=\"text-sm text-destructive flex items-center gap-1 mt-4\">\n <AlertCircle className=\"h-4 w-4\" />\n Stopped polling after {Math.round(maxPollTimeMs / 1000)}s. UserOperation may have been\n rejected by the bundler.\n </div>\n )}\n </div>\n );\n};","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n {\n variants: {\n variant: {\n default:\n 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80',\n secondary:\n 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\n destructive:\n 'border-transparent bg-red-600 text-white hover:bg-red-700 dark:bg-red-700 dark:hover:bg-red-600',\n outline: 'text-foreground',\n success:\n 'border-transparent bg-green-600 text-white hover:bg-green-700 dark:bg-green-700 dark:hover:bg-green-600',\n warning:\n 'border-transparent bg-yellow-500 text-white hover:bg-yellow-600 dark:bg-yellow-600 dark:hover:bg-yellow-500',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n );\n}\n\nexport { Badge, badgeVariants };","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}","import * as React from 'react';\nimport { Copy, ExternalLink } from 'lucide-react';\nimport { Button } from './ui/button';\nimport { cn } from '../utils/cn';\n\ntype ChainLike = {\n id: number;\n blockExplorers?: { default?: { url: string } };\n};\n\nexport type AddressProps = {\n address?: `0x${string}` | string | null;\n chain?: ChainLike;\n className?: string;\n truncate?: boolean;\n showCopy?: boolean;\n showExplorer?: boolean;\n label?: string;\n};\n\nfunction toExplorerAddressUrl(address: string, chain?: ChainLike): string | null {\n const base = chain?.blockExplorers?.default?.url;\n if (!base) return null;\n return `${base.replace(/\\/$/, '')}/address/${address}`;\n}\n\nfunction short(addr: string): string {\n if (addr.length <= 14) return addr;\n return `${addr.slice(0, 10)}...${addr.slice(-8)}`;\n}\n\nexport const Address: React.FC<AddressProps> = ({\n address,\n chain,\n className,\n truncate = true,\n showCopy = true,\n showExplorer = true,\n label,\n}) => {\n const addr = address || '';\n const explorer = toExplorerAddressUrl(addr, chain || undefined);\n const [copied, setCopied] = React.useState(false);\n\n if (!addr) return <span className={cn('text-muted-foreground', className)}>—</span>;\n\n return (\n <div className={cn('flex items-center gap-2', className)} style={{ listStyle: 'none' }}>\n {label && <span className=\"text-sm font-medium\">{label}</span>}\n <code className=\"text-xs bg-background px-2 py-1 rounded select-all\">\n {truncate ? short(addr) : addr}\n </code>\n {showCopy && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n title={copied ? 'Copied' : 'Copy address'}\n onClick={async () => {\n try {\n await navigator.clipboard.writeText(addr);\n setCopied(true);\n setTimeout(() => setCopied(false), 1200);\n } catch {}\n }}\n >\n <Copy className=\"h-4 w-4\" />\n </Button>\n )}\n {showExplorer && explorer && (\n <a\n href={explorer}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"inline-flex items-center justify-center h-10 w-10 rounded-md hover:bg-accent text-foreground\"\n title=\"Open in explorer\"\n >\n <ExternalLink className=\"h-4 w-4\" />\n </a>\n )}\n </div>\n );\n};","import React, { useState, useEffect } from 'react';\nimport { Dialog, DialogContent, DialogTitle, DialogDescription } from './ui/dialog';\nimport { VisuallyHidden } from './ui/visually-hidden';\nimport { Button } from './ui/button';\nimport { QrCode, Copy, ArrowLeft, CheckCircle2 } from 'lucide-react';\nimport { useLumiaSession } from '../../context/LumiaPassportSessionContext';\nimport QRCode from 'qrcode';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\n\nexport interface ReceiveModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onBack?: () => void;\n}\n\nexport const ReceiveModal: React.FC<ReceiveModalProps> = ({\n open,\n onOpenChange,\n onBack\n}) => {\n const { address } = useLumiaSession();\n const [qrCodeUrl, setQrCodeUrl] = useState<string>('');\n const { config } = useLumiaPassportConfig();\n const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n const [copied, setCopied] = useState(false);\n\n useEffect(() => {\n if (open && address) {\n // Generate QR code when modal opens\n QRCode.toDataURL(address, {\n width: 200,\n margin: 1,\n color: {\n dark: isDark ? '#FFFFFF' : '#000000',\n light: isDark ? '#000000' : '#FFFFFF'\n }\n }).then(url => {\n setQrCodeUrl(url);\n }).catch(err => {\n console.error('Failed to generate QR code:', err);\n });\n }\n }, [open, address]);\n\n const handleCopy = async () => {\n if (!address) return;\n \n try {\n await navigator.clipboard.writeText(address);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n console.error('Failed to copy address:', error);\n }\n };\n\n const formatAddress = (addr: string) => {\n if (!addr) return '';\n return `${addr.slice(0, 6)}...${addr.slice(-4)}`;\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className={`lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden max-h-[80vh] gap-0 ${isDark ? 'lumia-dark' : 'lumia-light'}`}\n style={{\n borderRadius: config.ui.modal?.borderRadius || '24px',\n maxWidth: config.ui.modal?.width || '400px',\n ['--lumia-font-base' as any]: config.ui.fonts?.base,\n ['--lumia-font-heading' as any]: config.ui.fonts?.heading,\n fontFamily: (config.ui.fonts?.base as any) || 'system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif',\n }}\n >\n <VisuallyHidden>\n <DialogTitle>Receive LUMIA</DialogTitle>\n </VisuallyHidden>\n <DialogDescription className=\"sr-only\">Your wallet address and QR code for receiving LUMIA</DialogDescription>\n\n <div className={`p-5 border-b ${theme.divider}`}>\n <div className=\"flex items-center gap-2\">\n {onBack && (\n <button\n onClick={onBack}\n className={`${theme.iconColor} hover:${isDark ? 'text-gray-200' : 'text-gray-700'} p-1 mr-1`}\n title=\"Back\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </button>\n )}\n <div className={`flex items-center gap-2 ${theme.titleText} font-semibold`}>\n <QrCode className=\"h-5 w-5\" />\n <span>Receive LUMIA</span>\n </div>\n </div>\n </div>\n\n <div className=\"p-5 space-y-4\">\n {/* QR Code */}\n {qrCodeUrl && (\n <div className=\"flex justify-center\">\n <div className={`${isDark ? 'bg-white' : 'bg-white'} p-4 rounded-xl border ${theme.divider}`}>\n <img src={qrCodeUrl} alt=\"Wallet QR Code\" className=\"w-48 h-48\" />\n </div>\n </div>\n )}\n\n {/* Network Info */}\n <div className={`${isDark ? 'bg-blue-900/30 border-blue-600' : 'bg-blue-50 border-blue-200'} rounded-lg p-3`}>\n <div className={`flex items-center gap-2 ${isDark ? 'text-blue-300' : 'text-blue-700'} text-sm`}>\n <div className=\"flex-1\">\n <p className=\"font-medium\">Network: Lumia Beam</p>\n <p className={`text-xs ${isDark ? 'text-blue-400' : 'text-blue-600'} mt-0.5`}>Ensure sender is on the same network</p>\n </div>\n </div>\n </div>\n\n {/* Address Display */}\n <div className={`${isDark ? 'bg-gray-800' : 'bg-gray-50'} rounded-lg p-4`}>\n <label className={`block text-sm font-medium ${theme.bodyText} mb-2`}>\n Your Wallet Address\n </label>\n <div className=\"flex items-center gap-2\">\n <div className={`flex-1 font-mono text-sm ${isDark ? 'text-white bg-gray-700 border-gray-600' : 'text-gray-900 bg-white border-gray-300'} rounded-lg px-3 py-2 break-all`}>\n {address}\n </div>\n </div>\n <Button\n onClick={handleCopy}\n className=\"w-full mt-3\"\n size=\"lg\"\n >\n {copied ? (\n <>\n <CheckCircle2 className=\"h-4 w-4\" />\n <span>Copied!</span>\n </>\n ) : (\n <>\n <Copy className=\"h-4 w-4\" />\n <span>Copy Address</span>\n </>\n )}\n </Button>\n </div>\n\n {/* Instructions */}\n <div className={`text-center text-sm ${theme.mutedText}`}>\n <p>Share this address to receive LUMIA tokens.</p>\n <p className=\"mt-1\">Only send LUMIA tokens to this address on Lumia Beam network.</p>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n","import React from 'react';\nimport { Dialog, DialogContent, DialogTitle, DialogDescription } from './ui/dialog';\nimport { VisuallyHidden } from './ui/visually-hidden';\nimport { Button } from './ui/button';\nimport { CreditCard, ArrowLeft } from 'lucide-react';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\n\nexport interface BuyModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onBack?: () => void;\n}\n\nexport const BuyModal: React.FC<BuyModalProps> = ({ open, onOpenChange, onBack }) => {\n const { config } = useLumiaPassportConfig();\n const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className={`lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden gap-0 ${isDark ? 'lumia-dark' : 'lumia-light'}`}\n style={{\n borderRadius: config.ui.modal?.borderRadius || '24px',\n maxWidth: config.ui.modal?.width || '400px',\n ['--lumia-font-base' as any]: config.ui.fonts?.base,\n ['--lumia-font-heading' as any]: config.ui.fonts?.heading,\n fontFamily: (config.ui.fonts?.base as any) || 'system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif',\n }}\n >\n <VisuallyHidden>\n <DialogTitle>Buy Crypto</DialogTitle>\n </VisuallyHidden>\n <DialogDescription className=\"sr-only\">On-ramp placeholder</DialogDescription>\n\n <div className={`p-5 border-b ${theme.divider}`}>\n <div className=\"flex items-center gap-2\">\n {onBack && (\n <button\n onClick={onBack}\n className={`${theme.iconColor} hover:${isDark ? 'text-gray-200' : 'text-gray-700'} p-1 mr-1`}\n title=\"Back\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </button>\n )}\n <div className={`flex items-center gap-2 ${theme.titleText} font-semibold`}>\n <CreditCard className=\"h-5 w-5\" />\n <span>Buy</span>\n </div>\n </div>\n </div>\n\n <div className=\"p-5\">\n <div className={`rounded-xl p-4 text-center ${isDark ? 'bg-gray-800' : 'bg-gray-50'}`}>\n <div className={`text-sm ${theme.mutedText}`}>On-ramp coming soon…</div>\n </div>\n\n <div className=\"pt-4\">\n <Button className=\"w-full\" onClick={() => onOpenChange(false)} size=\"lg\">\n Close\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n","import React from 'react';\nimport { Dialog, DialogContent, DialogTitle, DialogDescription } from './ui/dialog';\nimport { VisuallyHidden } from './ui/visually-hidden';\nimport { Button } from './ui/button';\nimport { ShieldCheck, ArrowLeft } from 'lucide-react';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\n\nexport interface KycModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onBack?: () => void;\n}\n\nexport const KycModal: React.FC<KycModalProps> = ({ open, onOpenChange, onBack }) => {\n const { config } = useLumiaPassportConfig();\n const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n const provider = config.kyc?.provider;\n const options = config.kyc?.options || {};\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className={`lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden gap-0 ${isDark ? 'lumia-dark' : 'lumia-light'}`}\n style={{\n borderRadius: config.ui.modal?.borderRadius || '24px',\n maxWidth: config.ui.modal?.width || '400px',\n ['--lumia-font-base' as any]: config.ui.fonts?.base,\n ['--lumia-font-heading' as any]: config.ui.fonts?.heading,\n fontFamily: (config.ui.fonts?.base as any) || 'system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif',\n }}\n >\n <VisuallyHidden>\n <DialogTitle>KYC</DialogTitle>\n </VisuallyHidden>\n <DialogDescription className=\"sr-only\">KYC placeholder</DialogDescription>\n\n <div className={`p-5 border-b ${theme.divider}`}>\n <div className=\"flex items-center gap-2\">\n {onBack && (\n <button\n onClick={onBack}\n className={`${theme.iconColor} hover:${isDark ? 'text-gray-200' : 'text-gray-700'} p-1 mr-1`}\n title=\"Back\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </button>\n )}\n <div className={`flex items-center gap-2 ${theme.titleText} font-semibold`}>\n <ShieldCheck className=\"h-5 w-5\" />\n <span>KYC</span>\n </div>\n </div>\n </div>\n\n <div className=\"p-5\">\n {provider ? (\n <div className={`rounded-xl p-4 ${isDark ? 'bg-gray-800' : 'bg-gray-50'}`}>\n <div className={`text-sm ${theme.titleText} mb-2`}>KYC provider: <span className=\"font-medium\">{provider}</span></div>\n {Object.keys(options).length > 0 ? (\n <div className={`text-xs ${theme.mutedText} break-words whitespace-pre-wrap`}>\n {JSON.stringify(options, null, 2)}\n </div>\n ) : (\n <div className={`text-sm ${theme.mutedText}`}>No provider options configured.</div>\n )}\n </div>\n ) : (\n <div className={`rounded-xl p-4 text-center ${isDark ? 'bg-gray-800' : 'bg-gray-50'}`}>\n <div className={`text-sm ${theme.mutedText}`}>KYC verification coming soon…</div>\n </div>\n )}\n\n <div className=\"pt-4\">\n <Button className=\"w-full\" onClick={() => onOpenChange(false)} size=\"lg\">\n Close\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n\n","import * as React from 'react';\nimport { getLinkedProviders } from '../internal/auth/providers/common';\nimport { getProviderDisplayInfo, type AuthProvider } from '../internal/auth/providers/types';\nimport { jwtTokenManager } from '../internal/auth';\n\nexport interface LinkedProfileDisplay extends AuthProvider {\n displayName: string;\n icon?: string; // emoji or identifier; real icons are app-responsibility\n color?: string;\n}\n\nexport function useLumiaPassportLinkedProfiles() {\n const [profiles, setProfiles] = React.useState<LinkedProfileDisplay[]>([]);\n const [avatar, setAvatar] = React.useState<string | null>(null);\n const [isLoading, setIsLoading] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n\n const load = React.useCallback(async () => {\n setIsLoading(true); setError(null);\n try {\n const list = await getLinkedProviders();\n const enriched = list.map(p => {\n const info = getProviderDisplayInfo(p.provider);\n return {\n ...p,\n displayName: info.name,\n icon: info.icon,\n color: info.color,\n } as LinkedProfileDisplay;\n });\n setProfiles(enriched);\n try { setAvatar(jwtTokenManager.getAvatar() || null); } catch { setAvatar(null); }\n } catch (e: any) {\n setError(e?.message || 'Failed to load linked profiles');\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n React.useEffect(() => { load(); }, [load]);\n\n return { profiles, avatar, isLoading, error, refresh: load } as const;\n}\n\n","{\n \"name\": \"@lumiapassport/ui-kit\",\n \"version\": \"1.5.3\",\n \"description\": \"React UI components and hooks for Lumia Passport authentication and Account Abstraction\",\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"sideEffects\": false,\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"scripts\": {\n \"clean\": \"rm -rf dist\",\n \"build:css\": \"tailwindcss -c tailwind.config.cjs -i src/styles/index.css -o src/styles/built.css --minify\",\n \"build:iframe-html\": \"node scripts/copy-iframe-html.js\",\n \"build:copy-css\": \"cp src/styles/built.css dist/styles.css\",\n \"build\": \"pnpm build:css && tsup && pnpm build:iframe-html && pnpm build:copy-css\",\n \"dev\": \"pnpm build:css && tsup --watch\",\n \"dev:iframe\": \"vite --config iframe/vite.config.ts\"\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n },\n \"./styles.css\": \"./dist/styles.css\",\n \"./dist/styles.css\": \"./dist/styles.css\"\n },\n \"peerDependencies\": {\n \"@radix-ui/react-alert-dialog\": \">=1.0.0\",\n \"@radix-ui/react-dialog\": \">=1.0.0\",\n \"@radix-ui/react-slot\": \">=1.0.0\",\n \"@tanstack/react-query\": \">=5.0.0\",\n \"class-variance-authority\": \">=0.7.0\",\n \"clsx\": \">=2.1.1\",\n \"dkls23-wasm\": \">=0.1.0\",\n \"react\": \">=18\",\n \"react-dom\": \">=18\",\n \"tailwind-merge\": \">=2.2.0\",\n \"viem\": \">=2.10.0\",\n \"wagmi\": \">=2.5.0\"\n },\n \"dependencies\": {\n \"@lumiapassport/core\": \"workspace:*\",\n \"@rainbow-me/rainbowkit\": \"^2.2.8\",\n \"@sentry/browser\": \"^10.22.0\",\n \"lucide-react\": \"^0.454.0\",\n \"qrcode\": \"^1.5.0\"\n },\n \"devDependencies\": {\n \"@radix-ui/react-alert-dialog\": \"^1.0.0\",\n \"@radix-ui/react-dialog\": \"^1.0.0\",\n \"@radix-ui/react-slot\": \"^1.0.0\",\n \"@tailwindcss/typography\": \"^0.5.16\",\n \"@tanstack/react-query\": \"^5.90.2\",\n \"@types/qrcode\": \"^1.5.0\",\n \"@types/react\": \"^18.3.3\",\n \"@types/react-dom\": \"^18.3.0\",\n \"autoprefixer\": \"^10.4.20\",\n \"class-variance-authority\": \"^0.7.0\",\n \"clsx\": \"^2.1.1\",\n \"dkls23-wasm\": \"^0.1.0\",\n \"postcss\": \"^8.4.47\",\n \"react\": \"^18.3.1\",\n \"react-dom\": \"^18.3.1\",\n \"tailwind-merge\": \"^2.2.0\",\n \"tailwindcss\": \"^3.4.10\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.4.5\",\n \"viem\": \"^2.37.9\",\n \"vite\": \"^5.0.0\",\n \"wagmi\": \"^2.17.5\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/lumiachain/lumia-passport-sdk\",\n \"directory\": \"packages/ui-kit\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import React from 'react';\nimport { useLumiaPassportConfig } from '../context/LumiaPassportContext';\n\n/**\n * Theme toggle component for testing dark/light/auto mode\n * This is a demo component to showcase theme switching\n */\nexport const ThemeToggle: React.FC = () => {\n const { config, updateConfig } = useLumiaPassportConfig();\n const currentTheme = config.ui.theme;\n\n const cycleTheme = () => {\n let newTheme: 'light' | 'dark' | 'auto';\n\n // Cycle through themes: light -> dark -> auto -> light\n if (currentTheme === 'light') {\n newTheme = 'dark';\n } else if (currentTheme === 'dark') {\n newTheme = 'auto';\n } else {\n newTheme = 'light';\n }\n\n // Update configuration\n updateConfig({\n ui: {\n ...config.ui,\n theme: newTheme,\n },\n });\n };\n\n const getThemeIcon = () => {\n switch (currentTheme) {\n case 'light':\n return '☀️';\n case 'dark':\n return '🌙';\n case 'auto':\n return '☀️'; // Will show sun icon for auto mode\n default:\n return '☀️';\n }\n };\n\n const getThemeLabel = () => {\n switch (currentTheme) {\n case 'light':\n return 'light';\n case 'dark':\n return 'dark';\n case 'auto':\n return 'auto';\n default:\n return 'auto';\n }\n };\n\n return (\n <div className=\"lumia-scope\">\n <button\n onClick={cycleTheme}\n className=\"fixed top-4 right-4 z-50 flex items-center gap-2 px-4 py-2 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-xl text-sm font-medium text-gray-700 dark:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors shadow-sm\"\n title={`Current theme: ${currentTheme}. Click to switch.`}\n >\n {getThemeIcon()} {getThemeLabel()}\n </button>\n </div>\n );\n};","import React from 'react';\n\ninterface LumiaLogoProps {\n size?: number;\n className?: string;\n}\n\nexport const LumiaLogo: React.FC<LumiaLogoProps> = ({ size = 80, className = '' }) => {\n return (\n <div\n className={`flex items-center justify-center ${className}`}\n style={{ width: size, height: size }}\n >\n <svg viewBox=\"0 0 512 512\" width={size} height={size}>\n <circle cx=\"256\" cy=\"256\" r=\"256\" fill=\"#060117\" strokeWidth=\"0\"/>\n <path d=\"M264.13948,48.01032l63.62778,132.2788,133.95322,68.65102h-147.34854s-48.55804-10.04649-50.23246-56.93012,0-143.99971,0-143.99971Z\" fill=\"#fefdff\" strokeWidth=\"0\"/>\n <path d=\"M50.27932,245.59045l132.27894-63.62734L251.20943,48.01032l-.00012,147.34824s-10.04654,48.55792-56.93019,50.23222c-46.88366,1.6743-143.9998-.00033-143.9998-.00033Z\" fill=\"#fefdff\" strokeWidth=\"0\"/>\n <path d=\"M247.86056,463.98968l-63.62772-132.27875-133.95315-68.65092,147.34848-.00011s48.55802,10.04646,50.23242,56.93008c1.6744,46.88362-.00004,143.9997-.00004,143.9997Z\" fill=\"#fefdff\" strokeWidth=\"0\"/>\n <path d=\"M461.72068,266.40941l-132.2789,63.62744-68.65118,133.95283.00016-147.34823s10.04655-48.55792,56.93018-50.23226c46.88364-1.67434,143.99974.00023,143.99974.00023Z\" fill=\"#fefdff\" strokeWidth=\"0\"/>\n </svg>\n </div>\n );\n};","import { useMemo, useState, useEffect } from 'react';\n\nexport type Theme = 'light' | 'dark' | 'auto';\n\n/**\n * Hook for managing theme detection and CSS classes\n */\nexport function useTheme(configTheme: Theme) {\n const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>('light');\n\n // Listen for system theme changes\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const updateSystemTheme = () => {\n setSystemTheme(mediaQuery.matches ? 'dark' : 'light');\n };\n\n // Set initial value\n updateSystemTheme();\n\n // Listen for changes\n mediaQuery.addEventListener('change', updateSystemTheme);\n return () => mediaQuery.removeEventListener('change', updateSystemTheme);\n }, []);\n\n const resolvedTheme = useMemo(() => {\n if (configTheme === 'auto') {\n return systemTheme;\n }\n return configTheme;\n }, [configTheme, systemTheme]);\n\n const isDark = resolvedTheme === 'dark';\n\n // Theme-aware CSS classes\n const themeClasses = useMemo(\n () => ({\n // Modal background\n modalBg: isDark ? 'bg-gray-900' : 'bg-white',\n\n // Text colors\n titleText: isDark ? 'text-white' : 'text-gray-900',\n bodyText: isDark ? 'text-gray-300' : 'text-gray-600',\n mutedText: isDark ? 'text-gray-400' : 'text-gray-500',\n linkText: isDark ? 'text-gray-200 hover:text-blue-400' : 'text-gray-700 hover:text-blue-600',\n\n // Input styles\n inputBg: isDark ? 'bg-gray-800 border-gray-600' : 'bg-gray-50 border-gray-200',\n inputText:\n isDark ? 'text-white placeholder:text-gray-400' : 'text-gray-900 placeholder:text-gray-400',\n\n // Button styles\n primaryBtn:\n isDark ?\n 'bg-blue-600 hover:bg-blue-700 text-white'\n : 'bg-blue-600 hover:bg-blue-700 text-white',\n secondaryBtn:\n isDark ?\n 'bg-pink-600 hover:bg-pink-700 text-white'\n : 'bg-pink-200 hover:bg-pink-300 text-gray-700',\n outlineBtn:\n isDark ?\n 'bg-gray-700 border-gray-600 hover:bg-gray-600 text-gray-300'\n : 'border-gray-200 hover:bg-gray-50 text-gray-700',\n\n // Action buttons (Send, Receive, Buy)\n actionBtn:\n isDark ?\n 'bg-gray-700 hover:bg-gray-600 text-gray-200'\n : 'bg-gray-100 hover:bg-gray-200 text-gray-900',\n\n // Divider\n divider: isDark ? 'border-gray-600' : 'border-gray-200',\n\n // Status colors\n errorText: isDark ? 'text-red-400' : 'text-red-500',\n successText: isDark ? 'text-green-400' : 'text-blue-600',\n\n // Icon colors\n iconColor: isDark ? 'text-gray-300' : 'text-gray-600',\n }),\n [isDark]\n );\n\n return {\n theme: resolvedTheme,\n isDark,\n classes: themeClasses,\n };\n}","import * as React from 'react';\nimport { Copy, ExternalLink } from 'lucide-react';\nimport { Button } from './ui/button';\nimport { cn } from '../utils/cn';\n\ntype ChainLike = {\n id: number;\n blockExplorers?: { default?: { url: string } };\n};\n\nexport type HashProps = {\n hash?: `0x${string}` | string | null;\n chain?: ChainLike;\n className?: string;\n truncate?: boolean;\n showCopy?: boolean;\n showExplorer?: boolean;\n kind?: 'tx' | 'address' | 'block';\n label?: string;\n};\n\nfunction toExplorerUrl(\n kind: 'tx' | 'address' | 'block',\n value: string,\n chain?: ChainLike\n): string | null {\n const base = chain?.blockExplorers?.default?.url;\n if (!base) return null;\n const path =\n kind === 'tx' ? 'tx'\n : kind === 'address' ? 'address'\n : 'block';\n return `${base.replace(/\\/$/, '')}/${path}/${value}`;\n}\n\nfunction short(value: string): string {\n if (value.length <= 18) return value;\n return `${value.slice(0, 10)}...${value.slice(-8)}`;\n}\n\nexport const Hash: React.FC<HashProps> = ({\n hash,\n chain,\n className,\n truncate = true,\n showCopy = true,\n showExplorer = true,\n kind = 'tx',\n label,\n}) => {\n const value = hash || '';\n const explorer = toExplorerUrl(kind, value, chain || undefined);\n const [copied, setCopied] = React.useState(false);\n\n if (!value) return <span className={cn('text-muted-foreground', className)}>—</span>;\n\n return (\n <div className={cn('flex items-center gap-2', className)}>\n {label && <span className=\"text-sm font-medium\">{label}</span>}\n <code className=\"text-xs bg-background px-2 py-1 rounded break-all\">\n {truncate ? short(value) : value}\n </code>\n {showCopy && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n title={copied ? 'Copied' : 'Copy'}\n onClick={async () => {\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n setTimeout(() => setCopied(false), 1200);\n } catch {}\n }}\n >\n <Copy className=\"h-4 w-4\" />\n </Button>\n )}\n {showExplorer && explorer && (\n <a\n href={explorer}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"inline-flex items-center justify-center h-10 w-10 rounded-md hover:bg-accent text-foreground\"\n title=\"Open in explorer\"\n >\n <ExternalLink className=\"h-4 w-4\" />\n </a>\n )}\n </div>\n );\n};","import React, { useState, useEffect } from 'react';\nimport { getExplorerUrl } from '../clients/base';\n\ninterface TransactionFrom {\n hash: string;\n is_contract: boolean;\n name: string | null;\n}\n\ninterface TransactionTo {\n hash: string;\n is_contract: boolean;\n name: string | null;\n}\n\ninterface Transaction {\n hash: string;\n value: string;\n from: TransactionFrom;\n to: TransactionTo;\n status: string;\n timestamp: string;\n gas_used: string;\n fee: {\n value: string;\n };\n method: string | null;\n transaction_types: string[];\n}\n\ninterface TransactionsResponse {\n items: Transaction[];\n next_page_params: any;\n}\n\ninterface TransactionsListProps {\n address: string;\n itemsCount?: number;\n}\n\nexport const TransactionsList: React.FC<TransactionsListProps> = ({\n address,\n itemsCount = 10\n}) => {\n const [transactions, setTransactions] = useState<Transaction[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const fetchTransactions = async () => {\n try {\n setLoading(true);\n setError(null);\n\n const explorerUrl = getExplorerUrl();\n const baseUrl = explorerUrl.replace(/\\/$/, '');\n const apiUrl = `${baseUrl}/api/v2/addresses/${address}/transactions?items_count=${itemsCount}`;\n\n console.log('[TransactionsList] Fetching from:', apiUrl);\n\n const response = await fetch(apiUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch transactions: ${response.status}`);\n }\n\n const data: TransactionsResponse = await response.json();\n setTransactions(data.items || []);\n } catch (err) {\n console.error('[TransactionsList] Error:', err);\n setError(err instanceof Error ? err.message : 'Unknown error');\n } finally {\n setLoading(false);\n }\n };\n\n if (address) {\n fetchTransactions();\n }\n }, [address, itemsCount]);\n\n const formatValue = (value: string) => {\n try {\n const wei = BigInt(value);\n const eth = Number(wei) / 1e18;\n return eth.toFixed(4);\n } catch {\n return '0.0000';\n }\n };\n\n const formatAddress = (addr: string) => {\n return `${addr.slice(0, 6)}...${addr.slice(-4)}`;\n };\n\n const formatDate = (timestamp: string) => {\n return new Date(timestamp).toLocaleString();\n };\n\n const openTransaction = (txHash: string) => {\n const explorerUrl = getExplorerUrl();\n window.open(`${explorerUrl}/tx/${txHash}`, '_blank');\n };\n\n if (loading) {\n return (\n <div className=\"p-4 text-center\">\n <div className=\"animate-spin inline-block w-6 h-6 border-2 border-current border-t-transparent rounded-full\" />\n <p className=\"mt-2 text-sm text-gray-600\">Loading transactions...</p>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"p-4 text-center\">\n <p className=\"text-red-600 text-sm\">{error}</p>\n <button\n onClick={() => window.location.reload()}\n className=\"mt-2 text-blue-600 text-sm hover:underline\"\n >\n Retry\n </button>\n </div>\n );\n }\n\n if (transactions.length === 0) {\n return (\n <div className=\"p-4 text-center\">\n <p className=\"text-gray-600 text-sm\">No transactions found</p>\n </div>\n );\n }\n\n return (\n <div className=\"max-h-96 overflow-y-auto\">\n <div className=\"space-y-2 p-2\">\n {transactions.map((tx) => (\n <div\n key={tx.hash}\n className=\"border rounded-lg p-3 hover:bg-gray-50 cursor-pointer transition-colors\"\n onClick={() => openTransaction(tx.hash)}\n >\n <div className=\"flex justify-between items-start mb-2\">\n <div className=\"flex-1\">\n <div className=\"flex items-center space-x-2 mb-1\">\n <span className=\"text-xs font-mono bg-gray-100 px-2 py-1 rounded\">\n {formatAddress(tx.hash)}\n </span>\n <span className={`text-xs px-2 py-1 rounded ${\n tx.status === 'ok' ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800'\n }`}>\n {tx.status === 'ok' ? 'Success' : 'Failed'}\n </span>\n </div>\n\n <div className=\"text-sm space-y-1\">\n <div>\n <span className=\"text-gray-600\">From:</span>\n <span className=\"font-mono ml-1\">\n {formatAddress(tx.from.hash)}\n {tx.from.is_contract && <span className=\"text-xs text-blue-600 ml-1\">(Contract)</span>}\n </span>\n </div>\n\n <div>\n <span className=\"text-gray-600\">To:</span>\n <span className=\"font-mono ml-1\">\n {formatAddress(tx.to.hash)}\n {tx.to.is_contract && <span className=\"text-xs text-blue-600 ml-1\">(Contract)</span>}\n </span>\n </div>\n\n <div>\n <span className=\"text-gray-600\">Value:</span>\n <span className=\"font-semibold ml-1\">{formatValue(tx.value)} LUMIA</span>\n </div>\n </div>\n </div>\n\n <div className=\"text-right text-xs text-gray-500\">\n <div>{formatDate(tx.timestamp)}</div>\n <div className=\"mt-1\">\n Gas: {parseInt(tx.gas_used).toLocaleString()}\n </div>\n {tx.method && (\n <div className=\"mt-1 text-blue-600\">{tx.method}</div>\n )}\n </div>\n </div>\n\n {tx.transaction_types.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mt-2\">\n {tx.transaction_types.map((type, idx) => (\n <span\n key={idx}\n className=\"text-xs bg-blue-100 text-blue-800 px-2 py-1 rounded-full\"\n >\n {type.replace('_', ' ')}\n </span>\n ))}\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n );\n};","import * as React from 'react';\nimport { getBundlerUrl } from '../internal/clients/base';\n\nexport interface UserOpReceipt {\n userOpHash: `0x${string}`;\n sender: `0x${string}`;\n nonce: string;\n actualGasUsed: string;\n actualGasCost: string;\n success: boolean;\n receipt?: {\n transactionHash: `0x${string}`;\n blockNumber: string;\n blockHash: string;\n logs: any[];\n };\n}\n\nexport interface UserOpMempool {\n entryPoint: `0x${string}` | null;\n sender: `0x${string}` | null;\n}\n\nexport type UserOpState =\n | 'waiting' // Initial state, not yet seen by bundler\n | 'pending' // Seen in bundler mempool\n | 'included' // Successfully included in block\n | 'failed' // Failed execution\n | 'rejected' // Dropped from bundler mempool\n | 'timeout'; // Polling timeout\n\nexport interface UseUserOpStatusOptions {\n userOpHash?: `0x${string}` | string | null;\n pollMs?: number;\n maxPollTimeMs?: number;\n enabled?: boolean;\n onStateChange?: (state: UserOpState) => void;\n onReceipt?: (receipt: UserOpReceipt) => void;\n onTxHash?: (txHash: `0x${string}`) => void;\n}\n\nexport interface UseUserOpStatusReturn {\n state: UserOpState;\n receipt: UserOpReceipt | null;\n mempool: UserOpMempool | null;\n txHash: `0x${string}` | null;\n error: string | null;\n isPolling: boolean;\n refresh: () => Promise<void>;\n}\n\nexport function useUserOpStatus(options: UseUserOpStatusOptions = {}): UseUserOpStatusReturn {\n const {\n userOpHash,\n pollMs = 1000,\n maxPollTimeMs = 60000,\n enabled = true,\n onStateChange,\n onReceipt,\n onTxHash,\n } = options;\n\n const [state, setState] = React.useState<UserOpState>('waiting');\n const [receipt, setReceipt] = React.useState<UserOpReceipt | null>(null);\n const [mempool, setMempool] = React.useState<UserOpMempool | null>(null);\n const [txHash, setTxHash] = React.useState<`0x${string}` | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n const [isPolling, setIsPolling] = React.useState(false);\n\n const intervalRef = React.useRef<NodeJS.Timeout | null>(null);\n const startTimeRef = React.useRef<number>(Date.now());\n const prevStateRef = React.useRef<UserOpState>('waiting');\n\n const rpc = React.useCallback(async (method: string, params: any[]) => {\n const body = { jsonrpc: '2.0', id: 1, method, params };\n const res = await fetch(getBundlerUrl(), {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body),\n });\n const json = await res.json();\n if (json.error) throw new Error(json.error.message || JSON.stringify(json.error));\n return json.result;\n }, []);\n\n const extractMempoolInfo = React.useCallback((m: any): UserOpMempool | null => {\n if (!m) return null;\n const entryPoint = m.entryPoint || m?.userOperation?.entryPoint || null;\n const sender = m.sender || m?.userOperation?.sender || null;\n if (!entryPoint && !sender) return null;\n return { entryPoint, sender };\n }, []);\n\n const updateState = React.useCallback((newState: UserOpState) => {\n setState(newState);\n if (prevStateRef.current !== newState) {\n prevStateRef.current = newState;\n onStateChange?.(newState);\n }\n }, [onStateChange]);\n\n const tick = React.useCallback(async () => {\n if (!userOpHash || !enabled) return;\n\n // Don't poll if we already have a receipt\n if (receipt) {\n console.log('[useUserOpStatus] Already have receipt, skipping tick');\n return;\n }\n\n const elapsed = Date.now() - startTimeRef.current;\n if (elapsed > maxPollTimeMs) {\n updateState('timeout');\n setMempool(null);\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n setIsPolling(false);\n return;\n }\n\n try {\n setIsPolling(true);\n setError(null);\n\n // Check for receipt first\n const r = await rpc('eth_getUserOperationReceipt', [userOpHash]);\n if (r) {\n const newState = r.success ? 'included' : 'failed';\n console.log('[useUserOpStatus] Got receipt, updating state to:', newState);\n\n setReceipt(r);\n setMempool(null);\n const newTxHash = r.receipt?.transactionHash;\n if (newTxHash && newTxHash !== txHash) {\n setTxHash(newTxHash);\n onTxHash?.(newTxHash);\n }\n updateState(newState);\n onReceipt?.(r);\n\n // Clear interval when we get receipt\n if (intervalRef.current) {\n console.log('[useUserOpStatus] Clearing interval after receipt');\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n setIsPolling(false);\n return;\n }\n\n // Check mempool only if we don't have receipt yet\n const m = await rpc('eth_getUserOperationByHash', [userOpHash]);\n if (m === null) {\n // null result means UserOperation was dropped from mempool\n updateState('rejected');\n setMempool(null);\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n setIsPolling(false);\n return;\n }\n\n const info = extractMempoolInfo(m);\n setMempool(info);\n // Only update state to pending/waiting if we don't already have a terminal state\n if (!receipt) {\n updateState(info ? 'pending' : 'waiting');\n }\n } catch (e: any) {\n setError(e?.message || String(e));\n } finally {\n setIsPolling(false);\n }\n }, [\n rpc,\n userOpHash,\n enabled,\n receipt,\n maxPollTimeMs,\n extractMempoolInfo,\n updateState,\n onTxHash,\n onReceipt,\n ]);\n\n // Initialize state when hash changes\n React.useEffect(() => {\n if (!userOpHash || !enabled) return;\n\n console.log('[useUserOpStatus] Initializing for UserOp hash:', userOpHash);\n startTimeRef.current = Date.now();\n setState('waiting');\n prevStateRef.current = 'waiting';\n setReceipt(null);\n setMempool(null);\n setTxHash(null);\n setError(null);\n setIsPolling(false);\n }, [userOpHash, enabled]);\n\n // Start polling effect\n React.useEffect(() => {\n if (!userOpHash || !enabled) {\n console.log('[useUserOpStatus] Not starting polling - no hash or disabled');\n return;\n }\n\n if (receipt) {\n console.log('[useUserOpStatus] Not starting polling - already have receipt');\n return;\n }\n\n let mounted = true;\n\n const startPolling = async () => {\n if (mounted) {\n console.log('[useUserOpStatus] Starting polling for hash:', userOpHash);\n await tick();\n\n // Start interval only if still mounted and no receipt\n if (mounted && !receipt) {\n console.log('[useUserOpStatus] Creating interval with pollMs:', pollMs);\n intervalRef.current = setInterval(() => {\n if (mounted) {\n console.log('[useUserOpStatus] Interval tick');\n tick();\n }\n }, pollMs);\n }\n }\n };\n\n startPolling();\n\n return () => {\n console.log('[useUserOpStatus] Cleaning up polling effect');\n mounted = false;\n if (intervalRef.current) {\n console.log('[useUserOpStatus] Clearing interval in cleanup');\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n };\n }, [userOpHash, enabled, pollMs]);\n\n const refresh = React.useCallback(async () => {\n await tick();\n }, [tick]);\n\n return {\n state,\n receipt,\n mempool,\n txHash,\n error,\n isPolling,\n refresh,\n };\n}\n","import { usePublicClient, useWalletClient, useAccount } from 'wagmi';\nimport { TransactionReceipt, Hash, parseEther, formatEther, type Chain } from 'viem';\nimport { lumiaBeam } from '../internal/clients/base';\n\nexport interface Transaction {\n hash: Hash;\n from: string;\n to: string | null;\n value: string;\n gasUsed: string;\n gasPrice: string;\n blockNumber: bigint;\n timestamp: number;\n status: 'success' | 'failed' | 'pending';\n}\n\nexport interface SendTransactionParams {\n to: `0x${string}`;\n value: string; // in ETH\n data?: `0x${string}`;\n}\n\nexport interface SendTransactionResult {\n hash: Hash;\n wait: () => Promise<TransactionReceipt>;\n}\n\nexport function useTransactions() {\n const publicClient = usePublicClient({ chainId: lumiaBeam.id });\n const { data: walletClient } = useWalletClient();\n const { address } = useAccount();\n\n const sendTransaction = async (params: SendTransactionParams): Promise<SendTransactionResult> => {\n if (!walletClient) {\n throw new Error('Wallet not connected');\n }\n\n const txParams: any = {\n to: params.to,\n value: parseEther(params.value),\n data: params.data,\n chain: lumiaBeam as Chain,\n };\n // Viem 2.x types require `kzg` for blob-supporting chains; our chain doesn't use blobs.\n // Cast to any to keep DTS stable across viem versions while preserving runtime behavior.\n const hash = await (walletClient as any).sendTransaction(txParams);\n\n return {\n hash,\n wait: async () => {\n if (!publicClient) {\n throw new Error('Public client not available');\n }\n return await publicClient.waitForTransactionReceipt({ hash });\n },\n };\n };\n\n const getTransaction = async (hash: Hash) => {\n if (!publicClient) {\n throw new Error('Public client not available');\n }\n return await publicClient.getTransaction({ hash });\n };\n\n const getTransactionReceipt = async (hash: Hash) => {\n if (!publicClient) {\n throw new Error('Public client not available');\n }\n return await publicClient.getTransactionReceipt({ hash });\n };\n\n const getTransactionHistory = async (address: `0x${string}`, limit: number = 10): Promise<Transaction[]> => {\n if (!publicClient) {\n throw new Error('Public client not available');\n }\n\n try {\n // For smart accounts, we'll use a simplified approach\n // In production, you would typically use an indexer service or event logs\n\n // Option 1: Return empty for now to avoid excessive RPC calls\n // In a real implementation, you would:\n // 1. Use an indexer like The Graph or Etherscan API\n // 2. Filter UserOperationEvent events from the EntryPoint contract\n // 3. Or maintain a backend service that tracks transactions\n\n console.log('[Transactions] Fetching history for smart account:', address);\n\n // For demo purposes, return empty array to prevent RPC spam\n // Real implementation would query indexed data\n return [];\n\n // Alternative: Query only recent blocks (last 10) for demo\n // Uncomment if you want minimal transaction checking:\n /*\n const latestBlock = await publicClient.getBlockNumber();\n const transactions: Transaction[] = [];\n const blocksToCheck = 10; // Only check last 10 blocks\n\n for (let i = 0; i < blocksToCheck; i++) {\n const blockNumber = latestBlock - BigInt(i);\n try {\n const block = await publicClient.getBlock({\n blockNumber,\n includeTransactions: false, // Don't fetch full transactions\n });\n\n // In production, you'd query events here instead\n } catch {\n continue;\n }\n }\n\n return transactions;\n */\n } catch (error) {\n console.error('Failed to fetch transaction history:', error);\n return [];\n }\n };\n\n return {\n sendTransaction,\n getTransaction,\n getTransactionReceipt,\n getTransactionHistory,\n address,\n isConnected: !!address && !!walletClient,\n };\n}\n","import { Hash, formatEther, parseAbiItem } from 'viem';\nimport { lumiaBeam, ENTRYPOINT, publicClient } from '../internal/clients/base';\n\nexport interface UserOperation {\n hash: Hash;\n sender: `0x${string}`;\n nonce: bigint;\n success: boolean;\n actualGasCost: bigint;\n blockNumber: bigint;\n timestamp: number;\n transactionHash: Hash;\n}\n\n// EntryPoint UserOperationEvent\nconst USER_OP_EVENT = parseAbiItem(\n 'event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed)'\n);\n\nexport function useSmartAccountTransactions() {\n // Use the static publicClient from base instead of wagmi hook\n\n const getUserOperations = async (\n address: `0x${string}`,\n fromBlock: bigint | 'earliest' = 'earliest',\n toBlock: bigint | 'latest' = 'latest'\n ): Promise<UserOperation[]> => {\n // TEMPORARILY DISABLED to prevent RPC spam\n console.log('[getUserOperations] Disabled to prevent RPC spam');\n return [];\n\n /* Original implementation (disabled):\n if (!publicClient) {\n throw new Error('Public client not available');\n }\n\n try {\n // For efficiency, limit the block range for recent transactions\n let actualFromBlock = fromBlock;\n if (fromBlock === 'earliest' && toBlock === 'latest') {\n const latestBlock = await publicClient.getBlockNumber();\n // Only check last 1000 blocks (adjust based on chain block time)\n actualFromBlock = latestBlock > 1000n ? latestBlock - 1000n : 0n;\n }\n\n // Get UserOperationEvent events from EntryPoint\n const logs = await publicClient.getLogs({\n address: ENTRYPOINT,\n event: USER_OP_EVENT,\n args: {\n sender: address,\n },\n fromBlock: actualFromBlock,\n toBlock,\n });\n\n // Process logs into UserOperation objects\n const operations: UserOperation[] = [];\n\n for (const log of logs) {\n if (!log.args) continue;\n\n const [userOpHash, sender, , nonce, success, actualGasCost] = log.args as [\n `0x${string}`,\n `0x${string}`,\n `0x${string}`,\n bigint,\n boolean,\n bigint,\n bigint\n ];\n\n // Get block timestamp\n const block = await publicClient.getBlock({\n blockNumber: log.blockNumber,\n });\n\n operations.push({\n hash: userOpHash,\n sender,\n nonce,\n success,\n actualGasCost,\n blockNumber: log.blockNumber,\n timestamp: Number(block.timestamp),\n transactionHash: log.transactionHash,\n });\n }\n\n return operations.sort((a, b) => b.timestamp - a.timestamp);\n } catch (error) {\n console.error('Failed to fetch UserOperations:', error);\n return [];\n }\n */\n };\n\n const getRecentUserOperations = async (\n address: `0x${string}`,\n limit: number = 20\n ): Promise<UserOperation[]> => {\n if (!publicClient) {\n throw new Error('Public client not available');\n }\n\n try {\n // TEMPORARILY DISABLED to prevent RPC spam\n // In production, you should use an indexer service\n console.log('[SmartAccountTransactions] Fetching operations for:', address);\n console.log('[SmartAccountTransactions] Note: Transaction history disabled to prevent RPC spam');\n console.log('[SmartAccountTransactions] In production, use an indexer service like The Graph');\n\n // Return empty array for now\n return [];\n\n // Original implementation (commented out to prevent spam):\n /*\n const latestBlock = await publicClient.getBlockNumber();\n\n // Only check last 100 blocks to minimize requests\n const blockRange = 100n;\n const fromBlock = latestBlock > blockRange ? latestBlock - blockRange : 0n;\n\n const operations = await getUserOperations(address, fromBlock, latestBlock);\n return operations.slice(0, limit);\n */\n } catch (error) {\n console.error('Failed to fetch recent UserOperations:', error);\n return [];\n }\n };\n\n const getTransactionDetails = async (txHash: Hash) => {\n if (!publicClient) {\n throw new Error('Public client not available');\n }\n\n try {\n const [tx, receipt] = await Promise.all([\n publicClient.getTransaction({ hash: txHash }),\n publicClient.getTransactionReceipt({ hash: txHash }),\n ]);\n\n return { transaction: tx, receipt };\n } catch (error) {\n console.error('Failed to fetch transaction details:', error);\n return null;\n }\n };\n\n return {\n getUserOperations,\n getRecentUserOperations,\n getTransactionDetails,\n };\n}"],"mappings":"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","names":["import_wagmi","import_jsx_runtime","getTssUrl","base","import_viem","jwtTokenManager","import_error_tracking","getAvailableCloudProviders","base64urlToUint8Array","import_error_tracking","checkServerBackupAvailability","getBackupStatus","getTssUrl","getTssUrl","getTssUrl","getTssUrl","begin","options","base64urlToUint8Array","init_passkey","getTssUrl","init_telegram","getTssUrl","init_passkey","init_telegram","getTssUrl","import_auth","jwtTokenManager","import_error_tracking","import_jsx_runtime","projectId","import_react","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_lucide_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","ErrorAlert","showTelegramWidget","React","loginWithEmail","step","toHex","nonce","import_viem","import_account_abstraction","import_account_abstraction","init_utils","init_utils","LumiaLogo","useTheme","import_react","import_jsx_runtime","React","import_react","import_rainbowkit","import_wagmi","import_jsx_runtime","rainbowConfig","React","import_react","import_wagmi","import_jsx_runtime","import_react","React","import_react","init_passkey","init_telegram","import_lucide_react","import_react","import_rainbowkit","import_wagmi","React","import_jsx_runtime","React","error","LinkIcon","import_react","import_lucide_react","import_jsx_runtime","React","getIframeManager","open","React","import_lucide_react","import_jsx_runtime","getAvailableCloudProviders","error","import_react","import_lucide_react","import_jsx_runtime","React","error","import_react","import_react","import_wagmi","import_viem","token","React","import_lucide_react","import_jsx_runtime","React","address","import_react","import_lucide_react","import_react","import_viem","import_viem","import_wagmi","React","import_lucide_react","import_class_variance_authority","import_clsx","import_tailwind_merge","cn","import_jsx_runtime","cn","React","import_lucide_react","import_jsx_runtime","base","cn","import_jsx_runtime","cn","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","QRCode","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","React","import_jsx_runtime","React","getIframeManager","getPendingLoginResponse","clearPendingLoginResponse","checkServerBackupAvailability","updateBackupStatus","getShareRecoveryStats","ensureKeyshare","createAccountSession","getEntryPointDeposit","error","waitForIframe","import_jsx_runtime","import_jsx_runtime","LumiaLogo","import_react","useTheme","React","import_lucide_react","import_jsx_runtime","base","short","cn","import_react","import_jsx_runtime","formatDate","React","import_wagmi","import_viem","publicClient","address","import_viem"]}
|
|
1
|
+
{"version":3,"sources":["../src/config/lumiaPassport.tsx","../src/internal/utils/env.ts","../src/internal/clients/base.ts","../src/config/wagmi.ts","../src/context/WagmiContext.tsx","../src/internal/auth/base64url.ts","../src/internal/auth/webauthn.ts","../src/internal/utils/projectId.ts","../src/internal/auth/passkeyAuth.ts","../src/internal/auth/telegram.ts","../src/internal/lib/site.ts","../src/internal/auth/passkey.ts","../src/internal/lib/iframe-mpc-client.ts","../src/internal/clients/httpClient.ts","../src/internal/cloudStorage.ts","../src/internal/vaultClient.ts","../src/internal/auth/keyshare.ts","../src/internal/auth/providers/types.ts","../src/internal/auth/providers/common.ts","../src/internal/auth/providers/email.ts","../src/internal/auth/providers/passkey.ts","../src/internal/auth/providers/telegram.ts","../src/internal/auth/providers/wallet.ts","../src/internal/auth/providers/index.ts","../src/internal/auth/index.ts","../src/internal/lib/iframe-manager.ts","../src/context/LumiaPassportContext.tsx","../src/internal/hooks/useTheme.ts","../src/internal/lib/utils.ts","../src/internal/components/ui/dialog.tsx","../src/internal/components/ui/button.tsx","../src/internal/components/ui/alert-dialog.tsx","../src/internal/components/ErrorAlert.tsx","../src/internal/components/LumiaLogo.tsx","../src/internal/components/FailedScreen.tsx","../src/internal/components/TermsOfService.tsx","../src/internal/components/ui/card.tsx","../src/internal/components/ui/input.tsx","../src/internal/components/KeyshareRestore.tsx","../src/internal/components/VerificationCodeInput.tsx","../src/internal/clients/profile.ts","../src/internal/components/DisplayNameInput.tsx","../src/internal/components/AuthModal.tsx","../src/internal/akHelpers.ts","../src/internal/clients/account.ts","../src/internal/clients/utils.ts","../src/internal/clients/index.ts","../src/index.ts","../src/styles/built.css","../src/context/LumiaPassportSessionContext.tsx","../src/context/RainbowKitContext.tsx","../src/config/rainbowkit.ts","../src/components/ConnectWalletButton.tsx","../src/internal/components/ui/visually-hidden.tsx","../src/internal/components/TssManager.tsx","../src/internal/components/ManageWallet.tsx","../src/internal/components/WalletConnectHandler.tsx","../src/internal/components/SecurityModal.tsx","../src/internal/components/KeyshareBackup.tsx","../src/internal/components/TransactionsModal.tsx","../src/internal/components/ViewAssetsModal.tsx","../src/modules/assets.ts","../src/internal/components/SendModal.tsx","../src/hooks/useSendTransaction.ts","../src/internal/components/UserOpStatus.tsx","../src/internal/components/ui/badge.tsx","../src/internal/utils/cn.ts","../src/internal/components/Address.tsx","../src/internal/components/ReceiveModal.tsx","../src/internal/components/BuyModal.tsx","../src/internal/components/KycModal.tsx","../src/modules/linkedProfiles.ts","../package.json","../src/components/ThemeToggle.tsx","../src/components/LumiaLogo.tsx","../src/hooks/useTheme.ts","../src/internal/components/Hash.tsx","../src/internal/components/TransactionsList.tsx","../src/hooks/useUserOpStatus.ts","../src/modules/transactions.ts","../src/modules/smartAccountTransactions.ts"],"sourcesContent":["/**\n * LumiaPassport Configuration (library copy)\n * Default config can be overridden via Provider initialConfig\n */\n\nimport React from 'react';\n\n// Build-time injected globals (tsup.define). Declare for type-checking.\ndeclare const __LUMIA_TSS_URL__: string;\ndeclare const __LUMIA_BUNDLER_URL__: string;\ndeclare const __LUMIA_SHARE_VAULT_URL__: string;\ndeclare const __LUMIA_IFRAME_URL__: string;\ndeclare const __LUMIA_TSS_REQUIRE_WASM__: boolean;\ndeclare const __LUMIA_TSS_WASM_DEBUG__: boolean;\ndeclare const __LUMIA_TG_BOT__: string;\ndeclare const __LUMIA_TG_SALT__: string;\ndeclare const __LUMIA_AA_FACTORY_ADDRESS__: string;\ndeclare const __LUMIA_PAYMASTER_ADDRESS__: string;\ndeclare const __LUMIA_EXPLORER_URL__: string;\ndeclare const __LUMIA_RPC_URL__: string;\n\ndeclare global {\n interface Window {\n __LUMIA_SERVICES__?: Partial<{\n bundlerUrl: string;\n tssUrl: string;\n shareVaultUrl: string;\n tssRequireWasm: boolean;\n tssWasmDebug: boolean;\n }>;\n __LUMIA_PROJECT_ID__?: string;\n }\n}\n\nexport interface SocialProvider {\n id: string;\n name: string;\n enabled: boolean;\n icon: React.ComponentType<{ className?: string }>;\n comingSoon?: boolean;\n meta?: Record<string, any>;\n}\n\nexport interface LumiaPassportConfig {\n projectId?: string;\n passkey: {\n enabled: boolean;\n showCreateButton: boolean;\n primaryButtonText: string;\n };\n email: {\n enabled: boolean;\n placeholder: string;\n buttonText: string;\n verificationTitle: string;\n };\n social: {\n enabled: boolean;\n providers: SocialProvider[];\n gridColumns: number;\n };\n wallet: {\n enabled: boolean;\n supportedChains?: number[];\n requireSignature: boolean;\n walletConnectProjectId?: string;\n };\n development: {\n enabled: boolean;\n showOnProduction: boolean;\n };\n ui: {\n title: string;\n subtitle?: string;\n theme: 'light' | 'dark' | 'auto';\n // Controls the order of auth sections on the sign-in screen\n authOrder?: Array<'passkey' | 'email' | 'social'>;\n // When true, open Auth modal automatically when button mounts (for unauthenticated users)\n authOpen?: boolean;\n fonts?: {\n base?: string; // CSS font-family string\n heading?: string; // CSS font-family string for headings\n };\n colors?: {\n // Light theme colors\n light?: {\n background?: string; // Main background color\n text?: string; // Primary text color\n textSecondary?: string; // Secondary text color\n textMuted?: string; // Muted/disabled text color\n border?: string; // Border color\n buttonBackground?: string; // Connect button background (gradient start)\n buttonBackgroundEnd?: string; // Connect button background (gradient end)\n buttonText?: string; // Connect button text color\n buttonBackgroundHover?: string; // Connect button hover background (gradient start)\n buttonBackgroundHoverEnd?: string; // Connect button hover background (gradient end)\n connectedButtonBackground?: string; // Connected state button background\n connectedButtonBorder?: string; // Connected state button border\n };\n // Dark theme colors\n dark?: {\n background?: string; // Main background color\n text?: string; // Primary text color\n textSecondary?: string; // Secondary text color\n textMuted?: string; // Muted/disabled text color\n border?: string; // Border color\n buttonBackground?: string; // Connect button background (gradient start)\n buttonBackgroundEnd?: string; // Connect button background (gradient end)\n buttonText?: string; // Connect button text color\n buttonBackgroundHover?: string; // Connect button hover background (gradient start)\n buttonBackgroundHoverEnd?: string; // Connect button hover background (gradient end)\n connectedButtonBackground?: string; // Connected state button background\n connectedButtonBorder?: string; // Connected state button border\n };\n };\n branding: {\n logo?: React.ComponentType<{ size?: number }>;\n tagline: string;\n link?: { text: string; url: string };\n };\n modal: { width: string; borderRadius: string };\n };\n network: {\n name: string;\n symbol: string;\n chainId: number;\n rpcUrl: string;\n explorerUrl?: string;\n testnet?: boolean;\n };\n services: {\n bundlerUrl: string;\n tssUrl: string;\n shareVaultUrl: string;\n iframeUrl?: string; // URL for secure iframe wallet (default: https://auth.lumiapassport.com)\n tssRequireWasm?: boolean;\n tssWasmDebug?: boolean;\n };\n features: {\n mpcSecurity: boolean;\n strictMode: boolean;\n requestDeduplication: boolean;\n kycNeeded?: boolean;\n displayNameNeeded?: boolean;\n };\n warnings: {\n backupWarning: boolean;\n emailNotConnectedWarning: boolean;\n };\n kyc?: {\n provider?: 'sumsub' | 'uaepass' | 'custom';\n options?: Record<string, any>; // provider-specific metadata\n };\n}\n\nexport const GoogleIcon: React.FC<{ className?: string }> = ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className}>\n <path fill=\"#4285F4\" d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\n <path fill=\"#34A853\" d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <path fill=\"#FBBC05\" d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <path fill=\"#EA4335\" d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </svg>\n);\n\nexport const TelegramIcon: React.FC<{ className?: string }> = ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className} fill=\"#229ED9\">\n <path d=\"M9.78 18.65l.28-4.23 7.68-6.92c.34-.31-.07-.46-.52-.19L7.74 13.3 3.64 12c-.88-.25-.89-.86.2-1.3l15.97-6.16c.73-.33 1.43.18 1.15 1.3l-2.72 12.81c-.19.91-.74 1.13-1.5.71L12.6 16.3l-1.99 1.93c-.23.23-.42.42-.83.42z\" />\n </svg>\n);\n\nexport const TwitterIcon: React.FC<{ className?: string }> = ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className} fill=\"currentColor\">\n <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\" />\n </svg>\n);\n\nexport const DiscordIcon: React.FC<{ className?: string }> = ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className}>\n <path\n fill=\"#5865F2\"\n d=\"M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515a.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0a12.64 12.64 0 0 0-.617-1.25a.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.057a19.9 19.9 0 0 0 5.993 3.03a.078.078 0 0 0 .084-.028a14.09 14.09 0 0 0 1.226-1.994a.076.076 0 0 0-.041-.106a13.107 13.107 0 0 1-1.872-.892a.077.077 0 0 1-.008-.128a10.2 10.2 0 0 0 .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.127a12.299 12.299 0 0 1-1.873.892a.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028a19.839 19.839 0 0 0 6.002-3.03a.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.956-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.955-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.946 2.418-2.157 2.418Z\"\n />\n </svg>\n);\n\nexport const defaultLumiaPassportConfig: LumiaPassportConfig = {\n passkey: {\n enabled: true,\n showCreateButton: true,\n primaryButtonText: 'Sign in with Passkey'\n },\n email: {\n enabled: true,\n placeholder: 'Enter your email',\n buttonText: 'Continue',\n verificationTitle: 'Check your email'\n },\n social: {\n enabled: true,\n gridColumns: 4,\n providers: [\n { id: 'google', name: 'Google', enabled: true, icon: GoogleIcon, comingSoon: true },\n { id: 'telegram', name: 'Telegram', enabled: true, icon: TelegramIcon, comingSoon: false, meta: {\n botUsername: (typeof __LUMIA_TG_BOT__ !== 'undefined' && __LUMIA_TG_BOT__) || undefined,\n salt: (typeof __LUMIA_TG_SALT__ !== 'undefined' && __LUMIA_TG_SALT__) || 'demo'\n } }\n ]\n },\n wallet: {\n enabled: true,\n supportedChains: [1, 137, 56],\n requireSignature: true,\n walletConnectProjectId: undefined\n },\n development: {\n enabled: true,\n showOnProduction: false\n },\n ui: {\n title: 'Sign in',\n subtitle: undefined,\n theme: 'auto',\n authOrder: ['passkey', 'email', 'social'],\n authOpen: false,\n fonts: {\n base: 'system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif',\n heading: 'system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif',\n },\n branding: {\n tagline: 'Lumia Passport MPC',\n link: { text: 'Lumia Passport MPC', url: '/mpc-security' }\n },\n modal: { width: '400px', borderRadius: '24px' }\n },\n network: {\n name: 'Lumia Beam',\n symbol: 'LUMIA',\n chainId: 2030232745,\n rpcUrl: 'https://beam-rpc.lumia.org',\n explorerUrl: 'https://beam-explorer.lumia.org',\n testnet: true\n },\n services: {\n bundlerUrl: '', // Will fallback to build-time env vars\n tssUrl: '', // Will fallback to build-time env vars\n shareVaultUrl: '', // Will fallback to build-time env vars\n iframeUrl: 'https://auth.lumiapassport.com', // Secure iframe for MPC operations\n tssRequireWasm: false,\n tssWasmDebug: false\n },\n features: {\n mpcSecurity: true,\n strictMode: false,\n requestDeduplication: true,\n kycNeeded: false,\n displayNameNeeded: false\n },\n warnings: {\n backupWarning: true,\n emailNotConnectedWarning: true\n },\n kyc: {\n provider: undefined,\n options: undefined\n }\n};\n\nexport function getServiceUrls() {\n const config = defaultLumiaPassportConfig;\n const globalOverride = (typeof window !== 'undefined' && window.__LUMIA_SERVICES__) || {};\n const searchParams = typeof window !== 'undefined' ? new URLSearchParams(window.location.search) : undefined;\n const paramBundler = searchParams?.get('bundlerUrl') || undefined;\n const paramTss = searchParams?.get('tssUrl') || undefined;\n const paramVault = searchParams?.get('shareVaultUrl') || undefined;\n // Build-time injected (via tsup.define)\n const buildBundler = (typeof __LUMIA_BUNDLER_URL__ !== 'undefined' && __LUMIA_BUNDLER_URL__) || '';\n const buildTss = (typeof __LUMIA_TSS_URL__ !== 'undefined' && __LUMIA_TSS_URL__) || '';\n const buildVault = (typeof __LUMIA_SHARE_VAULT_URL__ !== 'undefined' && __LUMIA_SHARE_VAULT_URL__) || '';\n const buildRequireWasm = (typeof __LUMIA_TSS_REQUIRE_WASM__ !== 'undefined' && (__LUMIA_TSS_REQUIRE_WASM__ as any) === true) || false;\n const buildWasmDebug = (typeof __LUMIA_TSS_WASM_DEBUG__ !== 'undefined' && (__LUMIA_TSS_WASM_DEBUG__ as any) === true) || false;\n\n // Use sensible defaults as last fallback\n const defaultBundler = '/bundler';\n const defaultTss = '/tss';\n const defaultVault = '/vault';\n\n const result = {\n bundlerUrl: paramBundler || globalOverride.bundlerUrl || buildBundler || config.services.bundlerUrl || defaultBundler,\n tssUrl: paramTss || globalOverride.tssUrl || buildTss || config.services.tssUrl || defaultTss,\n shareVaultUrl: paramVault || globalOverride.shareVaultUrl || buildVault || config.services.shareVaultUrl || defaultVault,\n tssRequireWasm: globalOverride.tssRequireWasm ?? buildRequireWasm ?? config.services.tssRequireWasm ?? false,\n tssWasmDebug: globalOverride.tssWasmDebug ?? buildWasmDebug ?? config.services.tssWasmDebug ?? false\n };\n\n return result;\n}\n\nexport function getIframeUrl(): string {\n const config = defaultLumiaPassportConfig;\n\n // Build-time injected iframe URL (from LUMIA_IFRAME_URL env var)\n const buildIframeUrl = (typeof __LUMIA_IFRAME_URL__ !== 'undefined' && __LUMIA_IFRAME_URL__) || '';\n\n // Priority: build-time env var > config > default production URL\n const iframeUrl = buildIframeUrl || config.services.iframeUrl || 'https://auth.lumiapassport.com';\n\n return iframeUrl;\n}\n\nexport function getLumiaPassportConfig(): LumiaPassportConfig {\n return defaultLumiaPassportConfig;\n}\n\nexport function updateLumiaPassportConfig(updates: Partial<LumiaPassportConfig>): LumiaPassportConfig {\n const config = { ...defaultLumiaPassportConfig } as LumiaPassportConfig;\n if (updates.passkey) config.passkey = { ...config.passkey, ...updates.passkey };\n if (updates.email) config.email = { ...config.email, ...updates.email };\n if (updates.social) {\n config.social = { ...config.social, ...updates.social };\n if (updates.social.providers) config.social.providers = updates.social.providers;\n }\n if (updates.development) config.development = { ...config.development, ...updates.development };\n if (updates.ui) {\n config.ui = { ...config.ui, ...updates.ui };\n if (updates.ui.branding) config.ui.branding = { ...config.ui.branding, ...updates.ui.branding };\n if (updates.ui.modal) config.ui.modal = { ...config.ui.modal, ...updates.ui.modal };\n }\n if (updates.network) config.network = { ...config.network, ...updates.network };\n if (updates.features) config.features = { ...config.features, ...updates.features };\n if (updates.warnings) config.warnings = { ...config.warnings, ...updates.warnings };\n if (updates.kyc) config.kyc = { ...config.kyc, ...updates.kyc };\n return config;\n}\n\n// LumiaPassportConfig is already exported as a type above; avoid duplicate export.\n","/**\n * Universal environment variable access that works in both ESM and CJS builds\n */\n\ninterface EnvVars {\n VITE_FORCE_LEGACY_GAS?: string;\n VITE_LEGACY_GAS_CHAIN_IDS?: string;\n NODE_ENV?: string;\n MODE?: string;\n}\n\nfunction getEnvironmentVars(): EnvVars {\n // Try browser environment first (Vite)\n if (typeof window !== 'undefined' && (window as any).__LUMIA_ENV__) {\n return (window as any).__LUMIA_ENV__;\n }\n\n // Try import.meta.env (ESM/Vite)\n if (typeof globalThis !== 'undefined' && (globalThis as any).import?.meta?.env) {\n return (globalThis as any).import.meta.env;\n }\n\n // Try process.env (Node.js/CJS)\n if (typeof process !== 'undefined' && process.env) {\n return process.env;\n }\n\n // Fallback for browser environment without explicit env\n return {};\n}\n\nexport function getEnvVar(name: string): string | undefined {\n const env = getEnvironmentVars();\n return (env as any)[name];\n}\n\nexport function getEnvVarBool(name: string): boolean {\n const value = getEnvVar(name);\n return value === 'true' || value === '1';\n}\n\nexport function getEnvVarArray(name: string, separator = ','): string[] {\n const value = getEnvVar(name);\n return value ? value.split(separator).map(s => s.trim()).filter(Boolean) : [];\n}\n\nexport function getAllEnvVars(): EnvVars {\n return getEnvironmentVars();\n}\n","import { defineChain, http, createPublicClient, type Chain } from 'viem';\nimport { createBundlerClient } from 'viem/account-abstraction';\nimport { getServiceUrls } from '../../config/lumiaPassport';\nimport { getEnvVar } from '../utils/env';\n\n// Unified service URL resolution for all endpoints\nexport function getTssUrl(): string {\n const serviceUrls = getServiceUrls();\n const paramUrl = typeof window !== 'undefined' ? new URLSearchParams(window.location.search).get('tssUrl') || undefined : undefined;\n const envUrl = getEnvVar('VITE_LUMIA_TSS_URL') || getEnvVar('LUMIA_TSS_URL');\n return paramUrl || serviceUrls.tssUrl || envUrl || 'http://localhost:9256';\n}\n\nexport function getBundlerUrl(): string {\n const serviceUrls = getServiceUrls();\n const paramUrl = typeof window !== 'undefined' ? new URLSearchParams(window.location.search).get('bundlerUrl') || undefined : undefined;\n const envUrl = getEnvVar('VITE_LUMIA_BUNDLER_URL') || getEnvVar('LUMIA_BUNDLER_URL');\n const proxyPath = '/bundler';\n return (paramUrl || serviceUrls.bundlerUrl || envUrl || 'http://localhost:4337').replace(/^\\/$/, proxyPath);\n}\n\nexport function getShareVaultUrl(): string {\n const serviceUrls = getServiceUrls();\n const paramUrl = typeof window !== 'undefined' ? new URLSearchParams(window.location.search).get('shareVaultUrl') || undefined : undefined;\n const envUrl = getEnvVar('VITE_LUMIA_SHARE_VAULT_URL') || getEnvVar('LUMIA_SHARE_VAULT_URL');\n return paramUrl || serviceUrls.shareVaultUrl || envUrl || 'http://localhost:9090';\n}\n\n// Network selection and defaults\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst BUILD_NETWORK = typeof __LUMIA_NETWORK__ !== 'undefined' ? (__LUMIA_NETWORK__ as string) : '';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst BUILD_CHAIN_ID = typeof __LUMIA_CHAIN_ID__ !== 'undefined' ? (__LUMIA_CHAIN_ID__ as string) : '';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst BUILD_NETWORK_NAME = typeof __LUMIA_NETWORK_NAME__ !== 'undefined' ? (__LUMIA_NETWORK_NAME__ as string) : '';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst BUILD_NATIVE_SYMBOL = typeof __LUMIA_NATIVE_SYMBOL__ !== 'undefined' ? (__LUMIA_NATIVE_SYMBOL__ as string) : '';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst BUILD_CHAIN_LOGO_DATA_URI = typeof __LUMIA_CHAIN_LOGO_DATA_URI__ !== 'undefined' ? (__LUMIA_CHAIN_LOGO_DATA_URI__ as string) : '';\n\nfunction getSelectedNetwork(): 'beam' | 'prisma' {\n const paramNet = typeof window !== 'undefined' ? (new URLSearchParams(window.location.search).get('network') || '').toLowerCase() : '';\n const envNet = (getEnvVar('VITE_LUMIA_NETWORK') || getEnvVar('LUMIA_NETWORK') || BUILD_NETWORK || '').toLowerCase();\n const net = (paramNet || envNet) as string;\n return net === 'prisma' ? 'prisma' : 'beam';\n}\n\nfunction defaultRpcUrl(network: 'beam' | 'prisma'): string {\n return network === 'prisma' ? 'https://prisma-rpc.lumia.org' : 'https://beam-rpc.lumia.org';\n}\n\nfunction defaultExplorerUrl(network: 'beam' | 'prisma'): string {\n return network === 'prisma' ? 'https://explorer.lumia.org/' : 'https://beam-explorer.lumia.org/';\n}\n\nexport function getExplorerUrl(): string {\n const paramUrl = typeof window !== 'undefined' ? new URLSearchParams(window.location.search).get('explorerUrl') || undefined : undefined;\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const buildUrl = typeof __LUMIA_EXPLORER_URL__ !== 'undefined' ? __LUMIA_EXPLORER_URL__ : '';\n const envUrl = getEnvVar('VITE_LUMIA_EXPLORER_URL');\n const net = getSelectedNetwork();\n return paramUrl || (buildUrl as string) || envUrl || defaultExplorerUrl(net);\n}\n\n// Note: Previously exported BUNDLER_URL and TSS_URL constants have been removed\n// Always use getBundlerUrl(), getTssUrl(), getShareVaultUrl() functions instead\n// to ensure dynamic configuration updates are reflected\n\n// Prefer build-time injected URLs if provided\n// Legacy export for backward compatibility - use getExplorerUrl() for dynamic updates\nexport const LUMIA_EXPLORER_URL: string = getExplorerUrl();\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst BUILD_RPC_URL = typeof __LUMIA_RPC_URL__ !== 'undefined' ? __LUMIA_RPC_URL__ : '';\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst BUILD_AA_FACTORY_ADDRESS = typeof __LUMIA_AA_FACTORY_ADDRESS__ !== 'undefined' ? __LUMIA_AA_FACTORY_ADDRESS__ : '';\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst BUILD_PAYMASTER_ADDRESS = typeof __LUMIA_PAYMASTER_ADDRESS__ !== 'undefined' ? __LUMIA_PAYMASTER_ADDRESS__ : '';\n\n// Chain definitions\nconst BEAM_DEFAULTS = {\n id: 2030232745,\n name: 'Lumia Beam Testnet',\n symbol: 'LUMIA',\n};\n\nconst PRISMA_DEFAULTS = {\n // Note: chainId can be overridden via env LUMIA_CHAIN_ID\n id: Number(BUILD_CHAIN_ID || getEnvVar('VITE_LUMIA_CHAIN_ID') || getEnvVar('LUMIA_CHAIN_ID') || BEAM_DEFAULTS.id),\n name: BUILD_NETWORK_NAME || 'Lumia Prisma',\n symbol: BUILD_NATIVE_SYMBOL || 'LUMIA',\n};\n\nexport const lumiaBeamTestnet: Chain = defineChain({\n id: BEAM_DEFAULTS.id,\n name: BEAM_DEFAULTS.name,\n nativeCurrency: { name: BEAM_DEFAULTS.symbol, symbol: BEAM_DEFAULTS.symbol, decimals: 18 },\n rpcUrls: {\n default: { http: [(BUILD_RPC_URL as string) || defaultRpcUrl('beam')] },\n public: { http: [(BUILD_RPC_URL as string) || defaultRpcUrl('beam')] },\n },\n blockExplorers: { default: { name: 'Lumia Beam Explorer', url: LUMIA_EXPLORER_URL.replace(/\\/$/, '') } },\n // Custom field: logo identifier for UI\n logo: 'lumia',\n logoDataUri: BUILD_CHAIN_LOGO_DATA_URI || undefined,\n} as unknown as Chain);\n\nexport const lumiaPrisma: Chain = defineChain({\n id: PRISMA_DEFAULTS.id,\n name: PRISMA_DEFAULTS.name,\n nativeCurrency: { name: PRISMA_DEFAULTS.symbol, symbol: PRISMA_DEFAULTS.symbol, decimals: 18 },\n rpcUrls: {\n default: { http: [(BUILD_RPC_URL as string) || defaultRpcUrl('prisma')] },\n public: { http: [(BUILD_RPC_URL as string) || defaultRpcUrl('prisma')] },\n },\n blockExplorers: { default: { name: 'Lumia Explorer', url: LUMIA_EXPLORER_URL.replace(/\\/$/, '') } },\n // Custom field: logo identifier for UI\n logo: 'lumia',\n logoDataUri: BUILD_CHAIN_LOGO_DATA_URI || undefined,\n} as unknown as Chain);\n\n// Active chain is selected by env/network param; exported under the legacy name\nconst ACTIVE_CHAIN: Chain = (getSelectedNetwork() === 'prisma' ? lumiaPrisma : lumiaBeamTestnet) as Chain;\nexport const lumiaBeam: Chain = ACTIVE_CHAIN;\n\nexport const ENTRYPOINT_V07 = '0x0000000071727De22E5E9d8BAf0edAc6f37da032' as const;\nexport const ENTRYPOINT_V06 = '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789' as const;\nexport const ENTRYPOINT = ENTRYPOINT_V07;\n\nexport const LUMIA_AA_FACTORY_ADDRESS = (BUILD_AA_FACTORY_ADDRESS as string) || getEnvVar('VITE_LUMIA_AA_FACTORY_ADDRESS') || '';\nexport const FACTORY_ADDRESS = LUMIA_AA_FACTORY_ADDRESS;\nexport const COMPAT_FACTORY_ADDRESS = LUMIA_AA_FACTORY_ADDRESS;\nexport const LUMIA_FACTORY_ADDRESS = LUMIA_AA_FACTORY_ADDRESS;\nexport const LUMIA_PAYMASTER_ADDRESS = (BUILD_PAYMASTER_ADDRESS as string) || getEnvVar('VITE_LUMIA_PAYMASTER_ADDRESS') || '';\nexport const FUNDER_PK = getEnvVar('VITE_FUNDER_PK') || '';\n\nexport const publicClient = createPublicClient({\n chain: lumiaBeam,\n transport: http(lumiaBeam.rpcUrls.default.http[0], { timeout: 10_000, retryCount: 2, fetchOptions: { mode: 'cors' } }),\n});\n\n// Create bundler client dynamically to get the latest URL\nexport function getBundlerClient() {\n return createBundlerClient({\n chain: lumiaBeam,\n transport: http(getBundlerUrl(), { timeout: 10_000, retryCount: 0, fetchOptions: { mode: 'cors' } }),\n });\n}\n\nexport const bundlerClient = getBundlerClient();\n\nexport const beamPublic = publicClient;\nexport const viemBundlerClient = bundlerClient;\n","import { createConfig, http } from 'wagmi';\nimport { QueryClient } from '@tanstack/react-query';\nimport { lumiaBeam } from '../internal/clients/base';\n\nexport const queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 1000 * 60 * 5, // 5 minutes\n gcTime: 1000 * 60 * 10, // 10 minutes\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n retry: false,\n },\n },\n});\n\nexport const wagmiConfig = createConfig({\n chains: [lumiaBeam],\n transports: {\n [lumiaBeam.id]: http(lumiaBeam.rpcUrls.default.http[0], {\n timeout: 10_000,\n retryCount: 0,\n batch: false, // Disable batch requests\n fetchOptions: { mode: 'cors' },\n }),\n },\n});","import React from 'react';\nimport { WagmiProvider } from 'wagmi';\nimport { QueryClientProvider } from '@tanstack/react-query';\nimport { wagmiConfig, queryClient } from '../config/wagmi';\n\nexport interface LumiaWagmiProviderProps {\n children: React.ReactNode;\n}\n\nexport const LumiaWagmiProvider: React.FC<LumiaWagmiProviderProps> = ({ children }) => {\n return (\n <WagmiProvider config={wagmiConfig}>\n {/* <QueryClientProvider client={queryClient}> */}\n {children}\n {/* </QueryClientProvider> */}\n </WagmiProvider>\n );\n};","/**\n * Base64URL encoding/decoding utilities for browser\n * Re-exports core functionality and adds browser-specific helpers\n */\n\n// Re-export core base64url functions\nexport * from '@lumiapassport/core/auth';\n\n/**\n * Convert ArrayBuffer to base64url string (browser-specific)\n */\nexport function arrayBufferToBase64url(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n const base64 = btoa(binary);\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n\n/**\n * Convert base64url string to Uint8Array (browser-specific)\n */\nexport function base64urlToUint8Array(base64url: string): Uint8Array {\n const base64 = base64url.replace(/-/g, '+').replace(/_/g, '/');\n const pad = base64.length % 4 ? 4 - (base64.length % 4) : 0;\n const padded = base64 + '='.repeat(pad);\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n","import { arrayBufferToBase64url } from './base64url';\n\nexport type AttestationCredentialPayload = {\n id: string;\n rawId: string; // base64url\n type: string; // \"public-key\"\n response: {\n clientDataJSON: string; // base64url\n attestationObject: string; // base64url\n transports?: string[];\n };\n};\n\nexport function credentialToAttestationPayload(credential: PublicKeyCredential): AttestationCredentialPayload {\n const response = credential.response as AuthenticatorAttestationResponse & {\n getTransports?: () => string[];\n };\n\n const transports = (response as any).getTransports?.() || [];\n\n return {\n id: credential.id,\n rawId: arrayBufferToBase64url(credential.rawId),\n type: credential.type,\n response: {\n clientDataJSON: arrayBufferToBase64url(response.clientDataJSON),\n attestationObject: arrayBufferToBase64url(response.attestationObject),\n transports,\n },\n };\n}\n\n","/**\n * Helper to add projectId to URL query parameters\n * This is used across the codebase to ensure projectId is sent with every request\n */\nexport function addProjectIdToUrl(url: string): string {\n try {\n const projectId = typeof window !== 'undefined' ? (window as any).__LUMIA_PROJECT_ID__ : undefined;\n if (projectId) {\n const separator = url.includes('?') ? '&' : '?';\n return `${url}${separator}projectId=${encodeURIComponent(projectId)}`;\n }\n } catch {}\n return url;\n}\n\n/**\n * Get projectId from window global\n */\nexport function getProjectId(): string | undefined {\n try {\n return typeof window !== 'undefined' ? (window as any).__LUMIA_PROJECT_ID__ : undefined;\n } catch {\n return undefined;\n }\n}\n","/**\n * Browser-specific passkey authentication functions\n * These functions work with WebAuthn API and are UI-specific\n */\n\nimport { jwtTokenManager } from '@lumiapassport/core/auth';\nimport type { LoginResponse } from '@lumiapassport/core/auth';\nimport { credentialToAttestationPayload } from './webauthn';\nimport { arrayBufferToBase64url, base64urlToUint8Array } from './base64url';\nimport { addProjectIdToUrl } from '../utils/projectId';\nimport { getServiceUrls } from '../../config/lumiaPassport';\n\nfunction getTssUrl(): string {\n return getServiceUrls().tssUrl;\n}\n\n/**\n * Begin passkey authentication flow\n */\nexport async function beginPasskeyAuthentication(\n username?: string\n): Promise<{\n challenge: string;\n challengeId: string;\n options: PublicKeyCredentialRequestOptions;\n}> {\n const response = await fetch(\n addProjectIdToUrl(`${getTssUrl()}/api/auth/passkey/login/begin`),\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ username }),\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Failed to begin authentication');\n throw new Error(`Begin auth failed: ${response.status} ${errorText}`);\n }\n\n const beginResponse = await response.json();\n\n const options: PublicKeyCredentialRequestOptions = {\n challenge: base64urlToUint8Array(beginResponse.challenge),\n allowCredentials: (beginResponse.allowCredentials || []).map((cred: any) => ({\n type: cred.type,\n id: base64urlToUint8Array(cred.id),\n transports: cred.transports,\n })),\n timeout: beginResponse.timeout,\n userVerification: beginResponse.userVerification || 'preferred',\n extensions: beginResponse.extensions,\n };\n\n return {\n challenge: beginResponse.challenge,\n challengeId: beginResponse.challengeId,\n options,\n };\n}\n\n/**\n * Complete passkey authentication flow\n */\nexport async function completePasskeyAuthentication(\n challengeId: string,\n credential: PublicKeyCredential,\n options?: { skipTokenSave?: boolean }\n): Promise<LoginResponse> {\n const response = credential.response as AuthenticatorAssertionResponse;\n\n const credentialData = {\n id: credential.id,\n rawId: arrayBufferToBase64url(credential.rawId),\n type: credential.type,\n response: {\n clientDataJSON: arrayBufferToBase64url(response.clientDataJSON),\n authenticatorData: arrayBufferToBase64url(response.authenticatorData),\n signature: arrayBufferToBase64url(response.signature),\n userHandle: response.userHandle ? arrayBufferToBase64url(response.userHandle) : null,\n },\n };\n\n const completeResponse = await fetch(\n addProjectIdToUrl(`${getTssUrl()}/api/auth/passkey/login/complete`),\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ challengeId, credential: credentialData }),\n }\n );\n\n if (!completeResponse.ok) {\n let message = 'Authentication failed';\n try {\n const err = await completeResponse.json();\n message = err?.message || message;\n } catch {\n try {\n const text = await completeResponse.text();\n message = (text || message).slice(0, 200);\n } catch {}\n }\n throw new Error(`Complete authentication failed: ${completeResponse.status} ${message}`);\n }\n\n const loginResponse: LoginResponse = (await completeResponse.json()) as LoginResponse;\n if (!options?.skipTokenSave) {\n await jwtTokenManager.setTokens(loginResponse);\n }\n return loginResponse;\n}\n\n/**\n * Begin passkey registration flow\n */\nexport async function beginPasskeyRegistration(\n username: string\n): Promise<{\n challengeId: string;\n options: PublicKeyCredentialCreationOptions;\n}> {\n const response = await fetch(\n addProjectIdToUrl(`${getTssUrl()}/api/auth/passkey/register/begin`),\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ username }),\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Failed to begin registration');\n throw new Error(`Begin registration failed: ${response.status} ${errorText}`);\n }\n\n const beginResponse = await response.json();\n\n const options: PublicKeyCredentialCreationOptions = {\n rp: beginResponse.rp,\n user: {\n id: base64urlToUint8Array(beginResponse.user.id),\n name: beginResponse.user.name,\n displayName: beginResponse.user.displayName,\n },\n challenge: base64urlToUint8Array(beginResponse.challenge),\n pubKeyCredParams: beginResponse.pubKeyCredParams,\n timeout: beginResponse.timeout,\n attestation: beginResponse.attestation,\n authenticatorSelection: {\n ...beginResponse.authenticatorSelection,\n residentKey: 'preferred',\n requireResidentKey: false,\n userVerification: 'preferred',\n },\n excludeCredentials:\n beginResponse.excludeCredentials?.map((cred: any) => ({\n type: cred.type,\n id: base64urlToUint8Array(cred.id),\n transports: cred.transports,\n })) || undefined,\n };\n\n return {\n challengeId: beginResponse.challengeId,\n options,\n };\n}\n\n/**\n * Complete passkey registration flow\n */\nexport async function completePasskeyRegistration(\n challengeId: string,\n credential: PublicKeyCredential,\n options?: { skipTokenSave?: boolean }\n): Promise<LoginResponse> {\n const credentialData = credentialToAttestationPayload(credential);\n\n const completeResponse = await fetch(\n addProjectIdToUrl(`${getTssUrl()}/api/auth/passkey/register/complete`),\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ challengeId, credential: credentialData }),\n }\n );\n\n if (!completeResponse.ok) {\n const errorText = await completeResponse.text().catch(() => 'Registration failed');\n throw new Error(errorText);\n }\n\n const loginResponse: LoginResponse = (await completeResponse.json()) as LoginResponse;\n if (!options?.skipTokenSave) {\n await jwtTokenManager.setTokens(loginResponse);\n }\n return loginResponse;\n}\n","import { isHex, toHex, keccak256, stringToBytes } from 'viem';\n\nexport type TelegramUser = {\n id: number;\n first_name?: string;\n last_name?: string;\n username?: string;\n photo_url?: string;\n auth_date: string;\n hash: string;\n};\n\nexport interface TelegramAuthResult {\n user: TelegramUser;\n privateKey: `0x${string}`;\n displayName: string;\n}\n\nexport function deriveDemoPrivateKey(user: TelegramUser, salt: string): `0x${string}` {\n const base = `${user.id}:${salt}`;\n const h = keccak256(stringToBytes(base));\n const pk = h.slice(0, 66) as `0x${string}`;\n return isHex(pk) ? pk : (toHex(h).slice(0, 66) as `0x${string}`);\n}\n\nexport function initTelegramWidget(\n botUsername: string,\n onAuth: (result: TelegramAuthResult) => Promise<void>,\n salt: string = 'demo',\n rootId: string = 'tg-root'\n): () => void {\n const root = document.getElementById(rootId);\n if (!root) {\n console.warn(`[Telegram] No ${rootId} element found`);\n return () => {};\n }\n root.innerHTML = '';\n (window as any).onTelegramAuth = async (user: TelegramUser) => {\n if (!user?.id || !user.auth_date || !user.hash) throw new Error('Invalid Telegram auth payload');\n const privateKey = deriveDemoPrivateKey(user, salt);\n const displayName = user.first_name || user.username || `User ${user.id}`;\n await onAuth({ user, privateKey, displayName });\n };\n const script = document.createElement('script');\n script.async = true;\n script.src = 'https://telegram.org/js/telegram-widget.js?22';\n script.setAttribute('data-telegram-login', botUsername);\n script.setAttribute('data-size', 'large');\n script.setAttribute('data-userpic', 'true');\n script.setAttribute('data-onauth', 'onTelegramAuth(user)');\n script.setAttribute('data-request-access', 'write');\n script.onerror = (error) => { console.error('[Telegram] Failed to load widget script:', error); };\n root.appendChild(script);\n return () => {\n try { delete (window as any).onTelegramAuth; if (root) root.innerHTML = ''; if (script && script.parentElement && document.contains(script)) script.parentElement.removeChild(script); } catch {}\n };\n}\n\nexport function hideTelegramWidget(): void { try { const root = document.getElementById('tg-root'); if (root) root.style.display = 'none'; } catch {} }\nexport function showTelegramWidget(): void { try { const root = document.getElementById('tg-root'); if (root) root.style.display = ''; } catch {} }\n\n","export const APP_TITLE = 'Lumia Passport';\nexport const APP_SUBTITLE = 'Connect and use Lumia smart accounts';\nexport const DAPP_NAME = 'passport';\n\n","/** Passkey module (copied, lightly adapted) */\nimport { DAPP_NAME } from '../lib/site';\nimport { beginPasskeyRegistration, completePasskeyRegistration, beginPasskeyAuthentication, completePasskeyAuthentication } from './index';\n\nlet activeWebAuthnOperation: Promise<any> | null = null;\nlet conditionalUIStarting = false;\ndeclare global { interface Window { __LUMIA_CONDITIONAL_UI_ACTIVE__?: boolean } }\nfunction isConditionalUIGloballyActive(): boolean { return typeof window !== 'undefined' && window.__LUMIA_CONDITIONAL_UI_ACTIVE__ === true; }\nfunction setGlobalConditionalUI(active: boolean): void { if (typeof window !== 'undefined') window.__LUMIA_CONDITIONAL_UI_ACTIVE__ = active; }\nexport function resetWebAuthnFlags(): void { activeWebAuthnOperation = null; conditionalUIStarting = false; setGlobalConditionalUI(false); }\nfunction generatePasskeyUsername(): string { const timestamp = new Date().toISOString(); return `lumia-aa.${DAPP_NAME}-${timestamp}`; }\n\nexport interface PasskeyCredential { id: string; rawId: string; ownerPublicKey: `0x${string}` }\nexport interface PasskeyAuthResult { credential: PasskeyCredential; mpcUserId: string; loginResponse: any }\nexport interface PasskeyHelpers {\n getPasskeyKey: (key: string) => string;\n getCredId: () => string | null;\n getRawId: () => string | null;\n getOwnerPk: () => `0x${string}` | null;\n setCredId: (credId: string) => void;\n setRawId: (rawId: string) => void;\n setOwnerPk: (ownerPk: `0x${string}`) => void;\n clear: () => void;\n hasCredentials: () => boolean;\n}\n\nexport function createPasskeyHelpers(mpcUserId: string): PasskeyHelpers {\n const getPasskeyKey = (key: string) => `passkey.${mpcUserId}.${key}`;\n return {\n getPasskeyKey,\n getCredId: () => localStorage.getItem(getPasskeyKey('credId')),\n getRawId: () => localStorage.getItem(getPasskeyKey('rawId')),\n getOwnerPk: () => localStorage.getItem(getPasskeyKey('ownerPk')) as `0x${string}` | null,\n setCredId: (credId: string) => localStorage.setItem(getPasskeyKey('credId'), credId),\n setRawId: (rawId: string) => localStorage.setItem(getPasskeyKey('rawId'), rawId),\n setOwnerPk: (ownerPk: `0x${string}`) => localStorage.setItem(getPasskeyKey('ownerPk'), ownerPk),\n clear: () => { localStorage.removeItem(getPasskeyKey('credId')); localStorage.removeItem(getPasskeyKey('rawId')); localStorage.removeItem(getPasskeyKey('ownerPk')); },\n hasCredentials: () => !!(localStorage.getItem(getPasskeyKey('credId')) || localStorage.getItem(getPasskeyKey('rawId'))),\n };\n}\n\nexport function isWebAuthnSupported(): boolean { return ('credentials' in navigator && 'create' in navigator.credentials && 'get' in navigator.credentials); }\n\nexport async function hasAvailablePasskeys(): Promise<boolean> {\n if (!isWebAuthnSupported()) return false;\n try {\n const isAvailable = await Promise.race([\n PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable(),\n new Promise<boolean>((_, reject) => setTimeout(() => reject(new Error('Timeout')), 3000)),\n ]);\n if (!isAvailable) return false;\n try {\n const credential = await Promise.race([\n navigator.credentials.get({ publicKey: { challenge: new Uint8Array(32), timeout: 5000, userVerification: 'preferred' }, mediation: 'silent' as any }),\n new Promise((_, reject) => setTimeout(() => reject(new Error('Detection timeout')), 2000)),\n ]);\n return !!credential;\n } catch { return false; }\n } catch { return false; }\n}\n\nexport async function registerPasskey(mpcUserId: string, onProgress?: (s: string) => void, options?: { skipTokenSave?: boolean }): Promise<{ credential: PasskeyCredential; loginResponse: any }> {\n if (!isWebAuthnSupported()) throw new Error('WebAuthn not supported in this browser');\n const helpers = createPasskeyHelpers(mpcUserId);\n onProgress?.('Starting passkey registration...');\n const passkeyUsername = generatePasskeyUsername();\n onProgress?.('Getting registration challenge...');\n const { challengeId, options: credOptions } = await beginPasskeyRegistration(passkeyUsername);\n onProgress?.('Creating passkey credential...');\n const credential = (await navigator.credentials.create({ publicKey: credOptions })) as PublicKeyCredential;\n if (!credential) throw new Error('Failed to create passkey credential');\n onProgress?.('Verifying passkey with server...');\n const loginResponse = await completePasskeyRegistration(challengeId, credential, options);\n const rawIdB64 = btoa(String.fromCharCode(...new Uint8Array(credential.rawId)));\n const derivedOwnerPk = `0x${'0'.repeat(40)}${credential.id.slice(-24)}` as `0x${string}`;\n helpers.setCredId(credential.id); helpers.setRawId(rawIdB64); helpers.setOwnerPk(derivedOwnerPk);\n onProgress?.('Passkey registered successfully!');\n return {\n credential: { id: credential.id, rawId: rawIdB64, ownerPublicKey: derivedOwnerPk },\n loginResponse\n };\n}\n\nexport async function authenticateWithPasskey(_username?: string, onProgress?: (s: string) => void, options?: { skipTokenSave?: boolean }): Promise<PasskeyAuthResult> {\n if (!isWebAuthnSupported()) throw new Error('WebAuthn not supported in this browser');\n onProgress?.('Starting passkey authentication...');\n const { challengeId, options: beginOptions } = await beginPasskeyAuthentication();\n const getOptions = { ...beginOptions } as any; if (getOptions.allowCredentials && getOptions.allowCredentials.length === 0) delete getOptions.allowCredentials;\n const assertion = (await navigator.credentials.get({ publicKey: getOptions })) as PublicKeyCredential;\n if (!assertion) throw new Error('Passkey authentication failed - no credential returned');\n onProgress?.('Verifying passkey with server...');\n const loginResponse = await completePasskeyAuthentication(challengeId, assertion, options);\n const userHelpers = createPasskeyHelpers(loginResponse.userId);\n const rawIdB64 = btoa(String.fromCharCode(...new Uint8Array(assertion.rawId)));\n const derivedOwnerPk = `0x${'0'.repeat(40)}${assertion.id.slice(-24)}` as `0x${string}`;\n userHelpers.setCredId(assertion.id); userHelpers.setRawId(rawIdB64); userHelpers.setOwnerPk(derivedOwnerPk);\n onProgress?.('Authentication complete!');\n return {\n credential: { id: assertion.id, rawId: rawIdB64, ownerPublicKey: derivedOwnerPk },\n mpcUserId: loginResponse.userId,\n loginResponse\n };\n}\n","/**\n * Iframe-based MPC Client\n *\n * Secure implementation that uses iframe isolation for key share storage and cryptographic operations\n * This replaces the legacy mpcClient.ts localStorage-based approach with iframe-based security\n */\n\nimport type { Address, Hex } from 'viem';\nimport { getIframeManager } from './iframe-manager';\nimport { logSdkError } from '@lumiapassport/core/internal/error-tracking';\n\n/**\n * Performance statistics for MPC signing (compatible with legacy interface)\n */\nexport type MpcSigningStats = {\n startTime: number;\n endTime?: number;\n totalDurationMs?: number;\n rounds: {\n roundNumber: number;\n startTime: number;\n endTime?: number;\n durationMs?: number;\n description: string;\n clientMsgSize?: number;\n serverMsgSize?: number;\n clientMsgKind?: string;\n serverMsgKind?: string;\n }[];\n wasmLoadTime?: number;\n keyshareLoadTime?: number;\n keyshareSize?: number;\n signatureVerificationTime?: number;\n totalDataTransferred?: number;\n};\n\nlet currentSigningStats: MpcSigningStats | null = null;\n\n/**\n * Get current MPC signing statistics\n */\nexport function getCurrentMpcSigningStats(): MpcSigningStats | null {\n if (!currentSigningStats) return null;\n const clonedRounds = currentSigningStats.rounds.map((r) => ({ ...r }));\n return { ...currentSigningStats, rounds: clonedRounds };\n}\n\n/**\n * Ensure DKG is completed and get owner address\n *\n * SECURITY: All cryptographic operations now happen inside the isolated iframe\n * Key shares are stored in iframe's localStorage (auth.lumiapassport.com)\n * NOT in parent domain's localStorage\n */\nexport async function ensureDkgAndGetOwner(\n userId: string,\n _clientSeedHex?: `0x${string}` // Deprecated parameter, kept for API compatibility\n): Promise<{ sessionId: string; ownerAddress?: Address }> {\n try {\n const iframeManager = getIframeManager();\n\n // Check if user already has a keyshare in iframe\n const keyshareStatus = await iframeManager.checkKeyshare(userId);\n\n if (keyshareStatus.hasKeyshare && keyshareStatus.address) {\n // Return with dummy sessionId (actual session is managed by iframe)\n return {\n sessionId: 'iframe-session',\n ownerAddress: keyshareStatus.address,\n };\n }\n\n // Authenticate user with iframe (will show consent modal if needed)\n await iframeManager.authenticate(userId);\n\n // Get access token from jwtTokenManager for TSS API authentication\n const { jwtTokenManager } = await import('../auth');\n const accessToken = jwtTokenManager.getAccessToken();\n\n if (!accessToken) {\n throw new Error('No access token available for DKG');\n }\n\n // Start DKG in iframe\n const ownerAddress = await iframeManager.startDKG(userId, accessToken);\n\n return {\n sessionId: 'iframe-session',\n ownerAddress,\n };\n } catch (error) {\n logSdkError(\n error instanceof Error ? error : new Error('DKG failed'),\n { userId },\n 'iframe-mpc'\n );\n throw error;\n }\n}\n\n/**\n * Sign digest with MPC using iframe\n *\n * SECURITY: All signing operations happen inside the isolated iframe\n * User sees confirmation modal inside iframe (parent cannot manipulate it)\n * Key share never leaves iframe's localStorage\n */\nexport async function signDigestWithMpc(\n userId: string,\n digest32: `0x${string}`,\n userOpDetails?: {\n sender?: string;\n nonce?: string;\n callData?: string;\n callGasLimit?: string;\n verificationGasLimit?: string;\n preVerificationGas?: string;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n paymaster?: string;\n factory?: string;\n factoryData?: string;\n callTarget?: string;\n }\n): Promise<`0x${string}` | null> {\n const startTime = performance.now();\n currentSigningStats = {\n startTime,\n rounds: [],\n };\n\n try {\n const iframeManager = getIframeManager();\n\n // Get access token from jwtTokenManager for TSS API authentication\n const { jwtTokenManager } = await import('../auth');\n const accessToken = jwtTokenManager.getAccessToken();\n\n if (!accessToken) {\n throw new Error('No access token available for signing');\n }\n\n // Create transaction object with UserOp details for display + pre-computed digest\n const transaction = {\n to: userOpDetails?.callTarget || '0x0000000000000000000000000000000000000000' as Address,\n value: '0',\n data: userOpDetails?.callData as Hex || '0x' as Hex,\n digest32, // Pre-computed digest - DO NOT recompute!\n // Additional UserOp fields for display in confirmation modal\n userOpDetails,\n };\n\n // Sign transaction via iframe\n // This will show user confirmation modal inside iframe with full UserOp details\n const signature = await iframeManager.signTransaction(userId, transaction, accessToken);\n\n const endTime = performance.now();\n currentSigningStats.endTime = endTime;\n currentSigningStats.totalDurationMs = endTime - startTime;\n\n return signature;\n } catch (error) {\n logSdkError(\n error instanceof Error ? error : new Error('MPC signing failed'),\n { userId, hasUserOpDetails: !!userOpDetails },\n 'iframe-mpc'\n );\n\n const endTime = performance.now();\n if (currentSigningStats) {\n currentSigningStats.endTime = endTime;\n currentSigningStats.totalDurationMs = endTime - startTime;\n }\n\n return null;\n }\n}\n\n/**\n * Check if user has a keyshare (via iframe)\n */\nexport async function checkKeyshare(\n userId: string\n): Promise<{ hasKeyshare: boolean; address?: Address }> {\n try {\n const iframeManager = getIframeManager();\n return await iframeManager.checkKeyshare(userId);\n } catch (error) {\n console.error('[IframeMPC] Error checking keyshare:', error);\n return { hasKeyshare: false };\n }\n}\n\n/**\n * Get user's wallet address (via iframe)\n */\nexport async function getAddress(userId: string): Promise<Address | undefined> {\n try {\n const iframeManager = getIframeManager();\n return await iframeManager.getAddress(userId);\n } catch (error) {\n console.error('[IframeMPC] Error getting address:', error);\n return undefined;\n }\n}\n","import { jwtTokenManager } from '../auth';\nimport { getTssUrl, getShareVaultUrl } from './base';\nimport { addProjectIdToUrl } from '../utils/projectId';\nimport { logSdkError } from '@lumiapassport/core/internal/error-tracking';\n\ninterface ApiRequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n headers?: Record<string, string>;\n body?: any;\n requireAuth?: boolean;\n}\n\ninterface ApiResponse<T = any> {\n success: boolean;\n data?: T;\n error?: string;\n status: number;\n}\n\nclass HttpClient {\n private baseUrl: string;\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl.replace(/\\/$/, ''); // Remove trailing slash\n }\n\n private async makeRequest<T>(\n endpoint: string,\n options: ApiRequestOptions = {}\n ): Promise<ApiResponse<T>> {\n const {\n method = 'GET',\n headers = {},\n body,\n requireAuth = true\n } = options;\n\n // Add projectId to URL query params (so it's available in preflight OPTIONS request)\n const url = addProjectIdToUrl(`${this.baseUrl}${endpoint}`);\n\n // Prepare headers\n const requestHeaders: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...headers\n };\n\n // Add auth header if required\n if (requireAuth) {\n const accessToken = jwtTokenManager.getAccessToken();\n if (accessToken) {\n requestHeaders['Authorization'] = `Bearer ${accessToken}`;\n }\n }\n\n // Prepare request config\n const requestConfig: RequestInit = {\n method,\n headers: requestHeaders\n };\n\n if (body && method !== 'GET') {\n requestConfig.body = typeof body === 'string' ? body : JSON.stringify(body);\n }\n\n try {\n const response = await fetch(url, requestConfig);\n\n // Handle 401 for token refresh\n if (response.status === 401 && requireAuth) {\n const refreshSuccess = await jwtTokenManager.refreshAccessToken();\n if (refreshSuccess) {\n // Update auth header with new token\n const newAccessToken = jwtTokenManager.getAccessToken();\n if (newAccessToken) {\n requestHeaders['Authorization'] = `Bearer ${newAccessToken}`;\n requestConfig.headers = requestHeaders;\n }\n\n // Retry the request\n const retryResponse = await fetch(url, requestConfig);\n return await this.processResponse<T>(retryResponse);\n } else {\n return {\n success: false,\n error: 'Authentication failed - unable to refresh token',\n status: 401\n };\n }\n }\n\n return await this.processResponse<T>(response);\n } catch (error) {\n logSdkError(\n error instanceof Error ? error : new Error('Network error'),\n { url, method },\n 'http-client'\n );\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Network error',\n status: 0\n };\n }\n }\n\n private async processResponse<T>(response: Response): Promise<ApiResponse<T>> {\n const status = response.status;\n\n try {\n const data = await response.json();\n\n if (!response.ok) {\n return {\n success: false,\n error: data.message || data.error || `HTTP ${status}`,\n status,\n data\n };\n }\n\n return {\n success: true,\n data,\n status\n };\n } catch (parseError) {\n logSdkError(\n parseError instanceof Error ? parseError : new Error('Failed to parse response'),\n { status },\n 'http-client'\n );\n return {\n success: false,\n error: 'Invalid response format',\n status\n };\n }\n }\n\n // Convenience methods\n async get<T>(endpoint: string, requireAuth = true): Promise<ApiResponse<T>> {\n return this.makeRequest<T>(endpoint, { method: 'GET', requireAuth });\n }\n\n async post<T>(endpoint: string, body?: any, requireAuth = true): Promise<ApiResponse<T>> {\n return this.makeRequest<T>(endpoint, { method: 'POST', body, requireAuth });\n }\n\n async put<T>(endpoint: string, body?: any, requireAuth = true): Promise<ApiResponse<T>> {\n return this.makeRequest<T>(endpoint, { method: 'PUT', body, requireAuth });\n }\n\n async patch<T>(endpoint: string, body?: any, requireAuth = true): Promise<ApiResponse<T>> {\n return this.makeRequest<T>(endpoint, { method: 'PATCH', body, requireAuth });\n }\n\n async delete<T>(endpoint: string, requireAuth = true): Promise<ApiResponse<T>> {\n return this.makeRequest<T>(endpoint, { method: 'DELETE', requireAuth });\n }\n}\n\n// Factory function to create HTTP clients for different services\nexport function createHttpClient(baseUrl: string): HttpClient {\n return new HttpClient(baseUrl);\n}\n\n// Pre-configured singleton clients for our services\n// These use dynamic URLs and read projectId from window.__LUMIA_PROJECT_ID__ on each request\n// The projectId is set by LumiaPassportProvider during initialization\n// Using lazy initialization to ensure URLs are read after LumiaPassportProvider sets window.__LUMIA_SERVICES__\nlet _tssClient: HttpClient | null = null;\nlet _vaultClient: HttpClient | null = null;\n\nexport const tssClient = new Proxy({} as HttpClient, {\n get(target, prop) {\n if (!_tssClient) {\n _tssClient = createHttpClient(getTssUrl());\n }\n return (_tssClient as any)[prop];\n }\n});\n\nexport const vaultClient = new Proxy({} as HttpClient, {\n get(target, prop) {\n if (!_vaultClient) {\n _vaultClient = createHttpClient(getShareVaultUrl());\n }\n return (_vaultClient as any)[prop];\n }\n});\n\nexport { HttpClient };\nexport type { ApiResponse };","// Cloud storage integrations for secure backup files\n// Supports Google Drive, and can be extended for other providers\n\nexport interface CloudStorageProvider {\n name: string;\n id: string;\n icon: string;\n isAvailable: () => boolean;\n authenticate: () => Promise<boolean>;\n upload: (fileName: string, content: string, usePrivateStorage?: boolean) => Promise<string>; // Returns file URL or ID\n isAuthenticated: () => boolean;\n signOut: () => Promise<void>;\n}\n\n// Google Drive integration using Google Identity Services + Google API Client Library\nexport class GoogleDriveProvider implements CloudStorageProvider {\n name = 'Google Drive';\n id = 'google-drive';\n icon = '📁'; // Can be replaced with proper icon\n\n private accessToken: string | null = null;\n private readonly CLIENT_ID = __GOOGLE_DRIVE_CLIENT_ID__;\n private readonly DISCOVERY_DOC = 'https://www.googleapis.com/discovery/v1/apis/drive/v3/rest';\n private readonly SCOPES = 'https://www.googleapis.com/auth/drive.file https://www.googleapis.com/auth/drive.appdata';\n\n private gapiInitialized = false;\n private gisInitialized = false;\n\n constructor() {\n this.initializeAPIs();\n }\n\n private async initializeAPIs(): Promise<void> {\n // Load Google APIs\n if (!window.gapi) {\n await this.loadScript('https://apis.google.com/js/api.js');\n }\n\n if (!window.google?.accounts) {\n await this.loadScript('https://accounts.google.com/gsi/client');\n }\n\n // Initialize gapi\n if (!this.gapiInitialized) {\n await new Promise<void>(resolve => {\n window.gapi.load('client', resolve);\n });\n\n await window.gapi.client.init({\n discoveryDocs: [this.DISCOVERY_DOC],\n });\n\n this.gapiInitialized = true;\n }\n\n // Initialize Google Identity Services\n if (!this.gisInitialized) {\n this.gisInitialized = true;\n }\n }\n\n private loadScript(src: string): Promise<void> {\n return new Promise((resolve, reject) => {\n if (document.querySelector(`script[src=\"${src}\"]`)) {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.src = src;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(`Failed to load ${src}`));\n document.head.appendChild(script);\n });\n }\n\n isAvailable(): boolean {\n return !!this.CLIENT_ID && typeof window !== 'undefined';\n }\n\n async authenticate(): Promise<boolean> {\n if (!this.isAvailable()) {\n throw new Error(\n 'Google Drive integration is not available in this environment'\n );\n }\n\n await this.initializeAPIs();\n\n return new Promise((resolve, reject) => {\n try {\n const tokenClient = window.google.accounts.oauth2.initTokenClient({\n client_id: this.CLIENT_ID,\n scope: this.SCOPES,\n callback: (response: any) => {\n if (response.error) {\n console.error('[GoogleDrive] Authentication error:', response.error);\n reject(new Error(`Google Drive authentication failed: ${response.error}`));\n return;\n }\n\n this.accessToken = response.access_token;\n window.gapi.client.setToken({ access_token: this.accessToken });\n resolve(true);\n },\n });\n\n tokenClient.requestAccessToken({ prompt: 'consent' });\n } catch (error) {\n console.error('[GoogleDrive] Authentication initialization failed:', error);\n reject(new Error(`Google Drive authentication setup failed: ${error}`));\n }\n });\n }\n\n isAuthenticated(): boolean {\n return !!this.accessToken;\n }\n\n async signOut(): Promise<void> {\n if (this.accessToken) {\n window.google?.accounts.oauth2.revoke(this.accessToken);\n this.accessToken = null;\n window.gapi?.client.setToken(null);\n }\n }\n\n async upload(fileName: string, content: string, usePrivateStorage: boolean = true): Promise<string> {\n if (!this.isAuthenticated()) {\n throw new Error('Not authenticated with Google Drive');\n }\n\n await this.initializeAPIs();\n\n if (usePrivateStorage) {\n // Try appDataFolder first (private, hidden)\n try {\n const fileId = await this.uploadToAppDataFolder(fileName, content);\n return fileId;\n } catch (error) {\n console.warn('[GoogleDrive] AppDataFolder upload failed, trying fallback to regular folder:', error);\n // Fallback to visible folder if appDataFolder fails\n const fileId = await this.uploadToAppFolder(fileName, content);\n return fileId;\n }\n } else {\n // Upload to \"Lumia Backups\" folder (visible in Drive)\n try {\n const fileId = await this.uploadToAppFolder(fileName, content);\n return fileId;\n } catch (error) {\n console.error('[GoogleDrive] Upload failed:', error);\n throw new Error(\n `Failed to upload to Google Drive: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n }\n\n private async uploadToAppDataFolder(fileName: string, content: string): Promise<string> {\n const metadata = {\n name: fileName,\n parents: ['appDataFolder'], // Store in app-specific folder for privacy\n };\n\n return this.performUpload(metadata, content);\n }\n\n private async uploadToAppFolder(fileName: string, content: string): Promise<string> {\n // First, find or create \"Lumia Backups\" folder\n const folderName = 'Lumia Passport Backups';\n const folderId = await this.findOrCreateFolder(folderName);\n\n const metadata = {\n name: fileName,\n parents: [folderId],\n };\n\n return this.performUpload(metadata, content);\n }\n\n private async findOrCreateFolder(folderName: string): Promise<string> {\n // Search for existing folder\n const searchResponse = await fetch(\n `https://www.googleapis.com/drive/v3/files?q=name='${folderName}' and mimeType='application/vnd.google-apps.folder' and trashed=false`,\n {\n headers: { Authorization: `Bearer ${this.accessToken}` },\n }\n );\n\n if (!searchResponse.ok) {\n throw new Error(`Failed to search for folder: ${searchResponse.status}`);\n }\n\n const searchResult = await searchResponse.json();\n\n if (searchResult.files && searchResult.files.length > 0) {\n return searchResult.files[0].id; // Return existing folder ID\n }\n\n // Create new folder\n const createResponse = await fetch('https://www.googleapis.com/drive/v3/files', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.accessToken}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n name: folderName,\n mimeType: 'application/vnd.google-apps.folder',\n }),\n });\n\n if (!createResponse.ok) {\n throw new Error(`Failed to create folder: ${createResponse.status}`);\n }\n\n const createResult = await createResponse.json();\n return createResult.id;\n }\n\n private async performUpload(metadata: any, content: string): Promise<string> {\n const form = new FormData();\n form.append('metadata', new Blob([JSON.stringify(metadata)], { type: 'application/json' }));\n form.append('file', new Blob([content], { type: 'application/json' }));\n\n const response = await fetch(\n 'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart',\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.accessToken}`,\n },\n body: form,\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Google Drive upload failed: ${response.status} ${response.statusText} - ${errorText}`\n );\n }\n\n const result = await response.json();\n return result.id; // Return file ID\n }\n}\n\n// Factory function to get available cloud storage providers\nexport function getAvailableCloudProviders(): CloudStorageProvider[] {\n const providers: CloudStorageProvider[] = [];\n\n // Google Drive\n const googleDrive = new GoogleDriveProvider();\n if (googleDrive.isAvailable()) {\n providers.push(googleDrive);\n }\n\n // Future: Add more providers (Dropbox, OneDrive, etc.)\n\n return providers;\n}\n\n// Type definitions for global APIs\ndeclare global {\n interface Window {\n gapi: any;\n google: any;\n }\n}","// Client-side backup functionality for keyshares\n// Provides encrypted backup options: Server, Cloud (iCloud/etc), Local file\n\nimport { jwtTokenManager } from './auth';\nimport { getTssUrl, getShareVaultUrl } from './clients/base';\nimport { createHttpClient } from './clients/httpClient';\nimport { createPasskeyHelpers } from './auth/passkey';\nimport { logSdkError } from '@lumiapassport/core/internal/error-tracking';\n\nexport interface KeyshareBackupData {\n userId: string;\n sessionId: string;\n keyshare: string;\n ownerAddress: `0x${string}`;\n createdAt: number;\n version: string;\n}\n\nexport interface EncryptedBackup {\n data: string;\n iv: string;\n salt: string;\n version: string;\n checksum: string;\n magic: string;\n encryptionMethod: 'passkey' | 'password';\n createdAt: number;\n credentialId?: string; // WebAuthn credential ID (required for passkey method)\n}\n\nexport interface EnvelopeEncryptedShare {\n ciphertext_share: string;\n wrapped_dek: string;\n kdf: { prf: string; hkdf: string; info: string };\n alg: { data: string; wrap: string };\n aad: { userId: string; version: number; deviceId?: string };\n createdAt?: string;\n expiresAt?: string | null;\n // Server spec fields for encryption method tracking\n encryptionMethod?: \"passkey\" | \"password\"; // for client guidance during recovery\n credentialId?: string; // WebAuthn credential ID (required for passkey method)\n}\n\nexport type BackupMethod = 'server' | 'cloud' | 'local';\n\nexport class PasswordValidationError extends Error { constructor(message: string) { super(message); this.name = 'PasswordValidationError'; } }\n\nexport const BACKUP_MAGIC = 'LUMIA_PASSPORT_BACKUP_V1';\nconst BACKUP_VERSION = '1.0';\n\nexport function getBackupEncryptionMethod(backupFile: EncryptedBackup): 'passkey' | 'password' | 'unknown' {\n if (backupFile.encryptionMethod) return backupFile.encryptionMethod; return 'unknown';\n}\n\nexport function isCloudShareSupported(): { supported: boolean; canShareFiles: boolean } {\n if (typeof navigator === 'undefined' || !navigator.share) return { supported: false, canShareFiles: false };\n const canShareFiles = navigator.canShare?.({ files: [new File(['test'], 'test.txt')] }) ?? false;\n return { supported: true, canShareFiles };\n}\n\nexport async function checkPasskeyAvailability(userId: string): Promise<boolean> {\n try {\n if (!navigator.credentials || !window.PublicKeyCredential) return false;\n const challengeString = `lumia-check:${userId}`; const challenge = new TextEncoder().encode(challengeString);\n const credential = await navigator.credentials.get({ publicKey: { challenge, allowCredentials: [], userVerification: 'preferred', timeout: 5000 } });\n return !!credential;\n } catch { return false; }\n}\n\nexport interface BackupStatus { server: { enabled: boolean; lastBackup?: number; error?: string }; cloud: { enabled: boolean; lastBackup?: number; error?: string }; local: { enabled: boolean; lastBackup?: number; error?: string } }\n\n// Using unified URL functions from base.ts\n\ninterface ShareVaultToken { token: string; expiresAt: number }\n\nasync function getShareVaultToken(scopes: string[]): Promise<ShareVaultToken> {\n const httpClient = createHttpClient(getTssUrl());\n\n const response = await httpClient.post('/api/auth/token/exchange', {\n scopes,\n audience: 'lumia-passport-share-vault-service',\n ttl: 300\n });\n\n if (!response.success) {\n throw new Error(`Failed to get Share Vault token: ${response.error}`);\n }\n\n const data = response.data;\n if (!data?.resourceToken) {\n throw new Error(`Invalid token response: ${JSON.stringify(data)}`);\n }\n\n return {\n token: data.resourceToken,\n expiresAt: Date.now() + data.expiresIn * 1000\n };\n}\n\n// Share API types (aligned with Vault docs)\nexport interface RecoveryStatsDeviceEntry { deviceId: string; name?: string; count: number; lastAt: string; ip?: string; ua?: string; secChUa?: string; browser?: string }\nexport interface RecoveryStatsCreatedMeta { at: string; ip?: string; ua?: string; secChUa?: string; browser?: string; deviceId?: string; deviceName?: string; country?: string }\nexport interface RecoveryStats { created: RecoveryStatsCreatedMeta; devices: RecoveryStatsDeviceEntry[] }\n\nexport async function getShareRecoveryStats(): Promise<RecoveryStats | null> {\n try {\n const token = await getShareVaultToken(['share:get']);\n const response = await fetch(`${getShareVaultUrl()}/v1/shares/me/recovery/stats`, { method: 'GET', headers: { Authorization: `Bearer ${token.token}`, 'Content-Type': 'application/json' } });\n if (response.status === 404) return null;\n if (!response.ok) return null;\n return await response.json();\n } catch {\n return null;\n }\n}\n\nexport async function getShare(): Promise<EnvelopeEncryptedShare | null> {\n const token = await getShareVaultToken(['share:get']);\n const response = await fetch(`${getShareVaultUrl()}/v1/shares/me`, { method: 'GET', headers: { Authorization: `Bearer ${token.token}`, 'Content-Type': 'application/json' } });\n if (response.status === 404) return null;\n if (!response.ok) throw new Error(`Failed to fetch share: ${response.status} ${response.statusText}`);\n return (await response.json()) as EnvelopeEncryptedShare;\n}\n\nexport async function uploadShare(share: EnvelopeEncryptedShare, idempotencyKey: string): Promise<{ etag: string }> {\n const token = await getShareVaultToken(['share:put']);\n const response = await fetch(`${getShareVaultUrl()}/v1/shares/me`, { method: 'PUT', headers: { Authorization: `Bearer ${token.token}`, 'Content-Type': 'application/json', 'Idempotency-Key': idempotencyKey }, body: JSON.stringify(share) });\n if (!response.ok) throw new Error(`Failed to upload share: ${response.status} ${response.statusText}`);\n return (await response.json()) as { etag: string };\n}\n\nexport async function rewrapShare(payload: { wrapped_dek: string; nonce_wrap?: string; alg?: { wrap: string }; kdf?: { prf: string; hkdf?: string; info?: string } }, idempotencyKey: string): Promise<{ etag: string }> {\n const token = await getShareVaultToken(['share:rewrap']);\n const response = await fetch(`${getShareVaultUrl()}/v1/shares/me/rewrap`, { method: 'POST', headers: { Authorization: `Bearer ${token.token}`, 'Content-Type': 'application/json', 'Idempotency-Key': idempotencyKey }, body: JSON.stringify(payload) });\n if (!response.ok) throw new Error(`Failed to rewrap share: ${response.status} ${response.statusText}`);\n return (await response.json()) as { etag: string };\n}\n\nexport async function deleteShare(): Promise<void> {\n const token = await getShareVaultToken(['share:delete']);\n const response = await fetch(`${getShareVaultUrl()}/v1/shares/me`, { method: 'DELETE', headers: { Authorization: `Bearer ${token.token}` } });\n if (!response.ok && response.status !== 404) throw new Error(`Failed to delete share: ${response.status} ${response.statusText}`);\n}\n\nasync function decryptShareEnvelopeWithPasskey(userId: string, share: EnvelopeEncryptedShare): Promise<KeyshareBackupData> {\n if (!share.nonce_wrap || !share.nonce_share) throw new Error('Invalid share envelope: missing nonces');\n const kek = await deriveKEKFromPasskey(userId, share.credentialId);\n const kekKey = await crypto.subtle.importKey('raw', kek, 'AES-GCM', false, ['decrypt']);\n const wrappedDekBytes = base64ToBytes(share.wrapped_dek);\n const nonceWrapBytes = base64ToBytes(share.nonce_wrap);\n const dekBytesBuffer = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: nonceWrapBytes }, kekKey, wrappedDekBytes);\n const dekKey = await crypto.subtle.importKey('raw', new Uint8Array(dekBytesBuffer), 'AES-GCM', false, ['decrypt']);\n const cipherBytes = base64ToBytes(share.ciphertext_share);\n const nonceShareBytes = base64ToBytes(share.nonce_share);\n const plain = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: nonceShareBytes }, dekKey, cipherBytes);\n const decoder = new TextDecoder();\n return JSON.parse(decoder.decode(new Uint8Array(plain)));\n}\n\nasync function deriveKEKFromPasskey(userId: string, requiredCredentialId?: string): Promise<ArrayBuffer> {\n const challengeString = `lumia-kek:${userId}`;\n const challenge = new TextEncoder().encode(challengeString);\n\n // Helper function to decode base64url credential ID\n function base64urlToUint8Array(base64url: string): Uint8Array {\n const base64 = base64url.replace(/-/g, '+').replace(/_/g, '/');\n const pad = base64.length % 4 ? 4 - (base64.length % 4) : 0;\n const padded = base64 + '='.repeat(pad);\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n }\n\n // Use required credential ID if provided (from server backup), otherwise fallback to stored credential ID\n const targetCredentialId = requiredCredentialId || createPasskeyHelpers(userId).getCredId();\n\n const allowCredentials = targetCredentialId ? [{ id: base64urlToUint8Array(targetCredentialId), type: 'public-key' as const }] : [];\n\n try {\n const credential = (await navigator.credentials.get({\n publicKey: {\n challenge,\n allowCredentials,\n userVerification: 'required',\n extensions: { prf: { eval: { first: challenge } } },\n },\n })) as PublicKeyCredential;\n\n if (credential) {\n const extensionResults = (credential as any).getClientExtensionResults?.();\n\n if (extensionResults?.prf?.results?.first) {\n return extensionResults.prf.results.first as ArrayBuffer;\n }\n }\n\n // Fallback: HKDF on credential id\n const credentialIdBytes = new TextEncoder().encode(credential.id);\n const keyMaterial = await crypto.subtle.importKey('raw', credentialIdBytes, 'HKDF', false, ['deriveBits']);\n const kekBytes = await crypto.subtle.deriveBits({ name: 'HKDF', hash: 'SHA-256', salt: challenge, info: new TextEncoder().encode('client-share') }, keyMaterial, 256);\n return kekBytes;\n } catch (error) {\n logSdkError(\n error instanceof Error ? error : new Error('Passkey operation failed'),\n { userId },\n \"vault\"\n );\n throw error;\n }\n}\n\nasync function deriveKeyFromPassword(password: string, salt: Uint8Array): Promise<CryptoKey> {\n const encoder = new TextEncoder();\n const keyMaterial = await crypto.subtle.importKey('raw', encoder.encode(password), 'PBKDF2', false, ['deriveBits', 'deriveKey']);\n const key = await crypto.subtle.deriveKey({ name: 'PBKDF2', salt, iterations: 150000, hash: 'SHA-256' }, keyMaterial, { name: 'AES-GCM', length: 256 }, false, ['encrypt', 'decrypt']);\n return key;\n}\n\nfunction base64ToBytes(base64: string): Uint8Array { const bin = atob(base64); const bytes = new Uint8Array(bin.length); for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i); return bytes; }\nfunction bytesToBase64(bytes: Uint8Array): string { let bin = ''; for (let i = 0; i < bytes.length; i++) bin += String.fromCharCode(bytes[i]); return btoa(bin); }\nfunction bytesToHex(bytes: Uint8Array): string { return Array.from(bytes, b => b.toString(16).padStart(2, '0')).join(''); }\n\n// Demo-app compatible encrypt/decrypt for file backups\nasync function encryptKeyshare(data: KeyshareBackupData, password: string, encryptionMethod: 'passkey' | 'password' = 'password', credentialId?: string): Promise<EncryptedBackup> {\n const encoder = new TextEncoder(); const plaintext = JSON.stringify(data);\n const salt = crypto.getRandomValues(new Uint8Array(16));\n const passwordKey = await crypto.subtle.importKey('raw', encoder.encode(password), 'PBKDF2', false, ['deriveBits']);\n const keyMaterial = await crypto.subtle.deriveBits({ name: 'PBKDF2', salt, iterations: 100000, hash: 'SHA-256' }, passwordKey, 256);\n const key = await crypto.subtle.importKey('raw', keyMaterial, 'AES-GCM', false, ['encrypt']);\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encryptedData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, encoder.encode(plaintext));\n const checksumData = `${data.userId}:${data.sessionId}:${encryptionMethod}`;\n const checksumBuffer = await crypto.subtle.digest('SHA-256', encoder.encode(checksumData));\n const checksum = bytesToBase64(new Uint8Array(checksumBuffer));\n const timestamp = Date.now();\n return { data: bytesToBase64(new Uint8Array(encryptedData)), iv: bytesToBase64(iv), salt: bytesToBase64(salt), version: BACKUP_VERSION, checksum, magic: BACKUP_MAGIC, encryptionMethod, createdAt: timestamp, credentialId: encryptionMethod === 'passkey' ? credentialId : undefined };\n}\n\nasync function decryptKeyshare(encryptedBackup: EncryptedBackup, password: string): Promise<KeyshareBackupData> {\n try { if (encryptedBackup.magic && encryptedBackup.magic !== BACKUP_MAGIC) throw new PasswordValidationError('Invalid backup file format'); if (encryptedBackup.version && encryptedBackup.version !== BACKUP_VERSION) throw new PasswordValidationError(`Unsupported backup version: ${encryptedBackup.version}`); } catch (e) { if (e instanceof PasswordValidationError) throw e; }\n try {\n const encoder = new TextEncoder(); const decoder = new TextDecoder();\n const salt = base64ToBytes(encryptedBackup.salt); const iv = base64ToBytes(encryptedBackup.iv); const encryptedData = base64ToBytes(encryptedBackup.data);\n const passwordKey = await crypto.subtle.importKey('raw', encoder.encode(password), 'PBKDF2', false, ['deriveBits']);\n const keyMaterial = await crypto.subtle.deriveBits({ name: 'PBKDF2', salt, iterations: 100000, hash: 'SHA-256' }, passwordKey, 256);\n const key = await crypto.subtle.importKey('raw', keyMaterial, 'AES-GCM', false, ['decrypt']);\n const decryptedData = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, encryptedData);\n const plaintext = decoder.decode(decryptedData); const backupData = JSON.parse(plaintext) as KeyshareBackupData;\n if (encryptedBackup.checksum) { const expected = `${backupData.userId}:${backupData.sessionId}:${encryptedBackup.encryptionMethod || 'password'}`; const expectedBuf = await crypto.subtle.digest('SHA-256', encoder.encode(expected)); const expectedChecksum = bytesToBase64(new Uint8Array(expectedBuf)); if (expectedChecksum !== encryptedBackup.checksum) throw new PasswordValidationError('Backup integrity check failed - file may be corrupted or tampered with'); }\n return backupData;\n } catch (error: any) {\n const message = error?.message || String(error);\n const name = error?.name || 'Error';\n if (name === 'OperationError' || message.includes('decrypt')) throw new PasswordValidationError('Incorrect password - unable to decrypt backup file');\n if (error instanceof SyntaxError || message.includes('JSON')) throw new PasswordValidationError('Corrupted backup file - decryption succeeded but data is invalid');\n throw new Error(`Failed to decrypt backup: ${message}`);\n }\n}\n\nasync function deriveBackupPasswordFromPasskey(userId: string, credentialId?: string): Promise<{ password: string; credentialId: string }> {\n const challengeString = `lumia-backup-key:${userId}`;\n const challenge = new TextEncoder().encode(challengeString);\n\n let allowCredentials: PublicKeyCredentialDescriptor[] = [];\n\n // If credentialId is provided, use it for more deterministic passkey selection\n if (credentialId) {\n try {\n // Convert base64url credential ID to bytes\n const base64 = credentialId.replace(/-/g, '+').replace(/_/g, '/');\n const pad = base64.length % 4 ? 4 - (base64.length % 4) : 0;\n const paddedBase64 = base64 + '='.repeat(pad);\n const credentialIdBytes = Uint8Array.from(atob(paddedBase64), c => c.charCodeAt(0));\n\n allowCredentials = [{\n id: credentialIdBytes,\n type: 'public-key',\n transports: ['internal', 'hybrid']\n }];\n } catch (error) {\n console.warn('[deriveBackupPasswordFromPasskey] Failed to parse credentialId, falling back to open selection:', error);\n }\n }\n\n const credential = (await navigator.credentials.get({\n publicKey: {\n challenge,\n allowCredentials,\n userVerification: 'required'\n }\n })) as PublicKeyCredential;\n\n if (credential && credential.response) {\n const credentialIdBytes = new TextEncoder().encode(credential.id);\n const combined = new Uint8Array(credentialIdBytes.length + challengeString.length);\n combined.set(credentialIdBytes, 0);\n combined.set(new TextEncoder().encode(challengeString), credentialIdBytes.length);\n const password = bytesToBase64(combined);\n\n // Return both password and the actual credential ID used\n return { password, credentialId: credential.id };\n }\n throw new Error('Passkey key derivation failed - user must provide password manually');\n}\n\nexport function getBackupStatus(userId: string): BackupStatus { const storage = typeof window !== 'undefined' ? window.localStorage : undefined; const statusData = storage?.getItem(`lumia-passport.backup.status.${userId}`); if (statusData) { try { return JSON.parse(statusData); } catch {} } return { server: { enabled: false }, cloud: { enabled: false }, local: { enabled: false } }; }\n\nexport function updateBackupStatus(userId: string, method: BackupMethod, status: Partial<BackupStatus[BackupMethod]>): void {\n const storage = typeof window !== 'undefined' ? window.localStorage : undefined; if (!storage) return; const current = getBackupStatus(userId); (current as any)[method] = { ...(current as any)[method], ...status }; storage.setItem(`lumia-passport.backup.status.${userId}`, JSON.stringify(current)); if (typeof window !== 'undefined') { window.dispatchEvent(new CustomEvent('lumia-passport-backup-status-changed', { detail: { method, status, currentStatus: current } })); }\n}\n\nexport function clearBackupStatus(userId: string): void { const storage = typeof window !== 'undefined' ? window.localStorage : undefined; storage?.removeItem(`lumia-passport.backup.status.${userId}`); }\n\nexport async function checkServerBackupAvailability(): Promise<{ hasBackup: boolean; serviceAvailable: boolean }> {\n try {\n const token = await getShareVaultToken(['share:get']);\n const response = await fetch(`${getShareVaultUrl()}/v1/shares/me/recovery/stats`, { method: 'GET', headers: { Authorization: `Bearer ${token.token}`, 'Content-Type': 'application/json' } });\n if (response.status === 404) return { hasBackup: false, serviceAvailable: true };\n if (!response.ok) return { hasBackup: false, serviceAvailable: false };\n return { hasBackup: true, serviceAvailable: true };\n } catch { return { hasBackup: false, serviceAvailable: false }; }\n}\n\nasync function uploadShareToVault(envelope: EnvelopeEncryptedShare, token: string): Promise<void> {\n const idempotencyKey = crypto.randomUUID ? crypto.randomUUID() : `backup-${Date.now()}`;\n const response = await fetch(`${getShareVaultUrl()}/v1/shares/me`, { method: 'PUT', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}`, 'Idempotency-Key': idempotencyKey }, body: JSON.stringify(envelope) });\n if (!response.ok) { const errorText = await response.text(); throw new Error(`Failed to upload share: ${response.status} ${response.statusText} - ${errorText}`); }\n}\n\nasync function downloadShareFromVault(token: string): Promise<EnvelopeEncryptedShare> {\n const response = await fetch(`${getShareVaultUrl()}/v1/shares/me`, { method: 'GET', headers: { Authorization: `Bearer ${token}`, 'X-Client-Device-Id': 'lumia-ui-kit', 'X-Client-Device-Name': 'Lumia UI Kit' } });\n if (!response.ok) { if (response.status === 404) throw new Error('No backup found on server for this user'); const errorText = await response.text(); throw new Error(`Failed to download share: ${response.status} ${response.statusText} - ${errorText}`); }\n const envelope = (await response.json()) as EnvelopeEncryptedShare; if (!envelope.ciphertext_share || !envelope.wrapped_dek || !envelope.kdf || !envelope.alg || !envelope.aad) throw new Error('Invalid envelope structure received from Share Vault');\n return envelope;\n}\n\nasync function envelopeEncryptKeyshare(data: KeyshareBackupData, userId: string): Promise<EnvelopeEncryptedShare> {\n // Get the credential ID that will be used for encryption\n const passkeyHelpers = createPasskeyHelpers(userId);\n const credentialId = passkeyHelpers.getCredId();\n\n const dek = crypto.getRandomValues(new Uint8Array(32));\n const kekBytes = await deriveKEKFromPasskey(userId);\n const kek = await crypto.subtle.importKey('raw', kekBytes, 'AES-GCM', false, ['encrypt']);\n const plaintext = JSON.stringify(data);\n const plaintextBytes = new TextEncoder().encode(plaintext);\n const dekCryptoKey = await crypto.subtle.importKey('raw', dek, 'AES-GCM', false, ['encrypt']);\n const dataIv = crypto.getRandomValues(new Uint8Array(12));\n const encryptedData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: dataIv }, dekCryptoKey, plaintextBytes);\n const wrapIv = crypto.getRandomValues(new Uint8Array(12));\n const wrappedDekData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: wrapIv }, kek, dek);\n const ciphertextWithIv = new Uint8Array(dataIv.length + encryptedData.byteLength);\n ciphertextWithIv.set(dataIv, 0);\n ciphertextWithIv.set(new Uint8Array(encryptedData), dataIv.length);\n const wrappedDekWithIv = new Uint8Array(wrapIv.length + wrappedDekData.byteLength);\n wrappedDekWithIv.set(wrapIv, 0);\n wrappedDekWithIv.set(new Uint8Array(wrappedDekData), wrapIv.length);\n\n return {\n ciphertext_share: bytesToBase64(ciphertextWithIv),\n wrapped_dek: bytesToBase64(wrappedDekWithIv),\n kdf: { prf: 'webauthn-prf', hkdf: 'hkdf-sha256', info: 'client-share' },\n alg: { data: 'aes-256-gcm', wrap: 'aes-256-gcm' },\n aad: { userId: data.userId, version: 1, deviceId: 'lumia-ui-kit' },\n createdAt: new Date().toISOString(),\n expiresAt: null,\n encryptionMethod: 'passkey', // Track encryption method\n credentialId: credentialId || undefined // Save the credential ID used for encryption\n };\n}\n\nasync function envelopeEncryptKeyshareWithPassword(data: KeyshareBackupData, password: string): Promise<EnvelopeEncryptedShare> {\n // Generate DEK and derive KEK from password\n const dek = crypto.getRandomValues(new Uint8Array(32));\n const salt = crypto.getRandomValues(new Uint8Array(16));\n const kekKey = await deriveKeyFromPassword(password, salt);\n\n const plaintext = JSON.stringify(data);\n const plaintextBytes = new TextEncoder().encode(plaintext);\n const dekCryptoKey = await crypto.subtle.importKey('raw', dek, 'AES-GCM', false, ['encrypt']);\n const dataIv = crypto.getRandomValues(new Uint8Array(12));\n const encryptedData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: dataIv }, dekCryptoKey, plaintextBytes);\n const wrapIv = crypto.getRandomValues(new Uint8Array(12));\n const wrappedDekData = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: wrapIv }, kekKey, dek);\n\n const ciphertextWithIv = new Uint8Array(dataIv.length + encryptedData.byteLength);\n ciphertextWithIv.set(dataIv, 0);\n ciphertextWithIv.set(new Uint8Array(encryptedData), dataIv.length);\n const wrappedDekWithIv = new Uint8Array(salt.length + wrapIv.length + wrappedDekData.byteLength);\n wrappedDekWithIv.set(salt, 0);\n wrappedDekWithIv.set(wrapIv, salt.length);\n wrappedDekWithIv.set(new Uint8Array(wrappedDekData), salt.length + wrapIv.length);\n\n return {\n ciphertext_share: bytesToBase64(ciphertextWithIv),\n wrapped_dek: bytesToBase64(wrappedDekWithIv),\n kdf: { prf: 'pbkdf2', hkdf: 'hkdf-sha256', info: 'client-share' },\n alg: { data: 'aes-256-gcm', wrap: 'aes-256-gcm' },\n aad: { userId: data.userId, version: 1, deviceId: 'lumia-ui-kit' },\n createdAt: new Date().toISOString(),\n expiresAt: null,\n encryptionMethod: 'password' // Track encryption method\n };\n}\n\nasync function envelopeDecryptKeyshare(envelope: EnvelopeEncryptedShare, userId: string): Promise<KeyshareBackupData> {\n const kekBytes = await deriveKEKFromPasskey(userId, envelope.credentialId);\n const kek = await crypto.subtle.importKey('raw', kekBytes, 'AES-GCM', false, ['decrypt']);\n\n const wrappedDekWithIv = base64ToBytes(envelope.wrapped_dek);\n const wrapIv = wrappedDekWithIv.slice(0, 12);\n const wrappedDekData = wrappedDekWithIv.slice(12);\n\n try {\n const dekBytes = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: wrapIv }, kek, wrappedDekData);\n const dekCryptoKey = await crypto.subtle.importKey('raw', dekBytes, 'AES-GCM', false, ['decrypt']);\n\n const ciphertextWithIv = base64ToBytes(envelope.ciphertext_share);\n const dataIv = ciphertextWithIv.slice(0, 12);\n const encryptedData = ciphertextWithIv.slice(12);\n\n const decryptedData = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: dataIv }, dekCryptoKey, encryptedData);\n\n const plaintext = new TextDecoder().decode(decryptedData);\n const result = JSON.parse(plaintext) as KeyshareBackupData;\n return result;\n } catch (error) {\n logSdkError(\n error instanceof Error ? error : new Error('Envelope decryption failed'),\n { hasCredentialId: !!envelope.credentialId },\n \"vault\"\n );\n if (error instanceof Error && error.name === 'OperationError') {\n const credentialHint = envelope.credentialId\n ? `The backup requires a specific passkey (ID: ${envelope.credentialId.slice(-8)}...)`\n : 'The backup was encrypted with a different passkey than the one you selected';\n throw new Error(`Passkey mismatch: ${credentialHint}. If you have multiple passkeys, please try again and select the correct passkey that was used when creating this backup.`);\n }\n throw new Error('Failed to decrypt keyshare: ' + (error instanceof Error ? error.message : String(error)));\n }\n}\n\nasync function envelopeDecryptKeyshareWithPassword(envelope: EnvelopeEncryptedShare, password: string): Promise<KeyshareBackupData> {\n const wrappedDekWithSaltAndIv = base64ToBytes(envelope.wrapped_dek);\n\n // Extract salt (16 bytes), wrapIv (12 bytes), and wrapped DEK data\n const salt = wrappedDekWithSaltAndIv.slice(0, 16);\n const wrapIv = wrappedDekWithSaltAndIv.slice(16, 28);\n const wrappedDekData = wrappedDekWithSaltAndIv.slice(28);\n\n try {\n // Derive KEK from password using the same salt\n const kekKey = await deriveKeyFromPassword(password, salt);\n\n // Decrypt the DEK\n const dekBytes = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: wrapIv }, kekKey, wrappedDekData);\n\n // Import DEK as crypto key\n const dekCryptoKey = await crypto.subtle.importKey('raw', dekBytes, 'AES-GCM', false, ['decrypt']);\n\n // Decrypt main data\n const ciphertextWithIv = base64ToBytes(envelope.ciphertext_share);\n const dataIv = ciphertextWithIv.slice(0, 12);\n const encryptedData = ciphertextWithIv.slice(12);\n\n const decryptedData = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: dataIv }, dekCryptoKey, encryptedData);\n\n const plaintext = new TextDecoder().decode(decryptedData);\n const result = JSON.parse(plaintext) as KeyshareBackupData;\n return result;\n } catch (error) {\n logSdkError(\n error instanceof Error ? error : new Error('Password decryption failed'),\n { errorName: error instanceof Error ? error.name : \"unknown\" },\n \"vault\"\n );\n if (error instanceof Error && error.name === 'OperationError') {\n throw new Error('Incorrect password: Unable to decrypt the backup with the provided password.');\n }\n throw new Error('Failed to decrypt keyshare with password: ' + (error instanceof Error ? error.message : String(error)));\n }\n}\n\nexport async function backupToServer(userId: string, password?: string): Promise<void> {\n const storageData = typeof window !== 'undefined' ? window.localStorage : undefined;\n const keyshareData = storageData?.getItem(`tss.${userId}.keyshare`);\n const sessionId = storageData?.getItem(`tss.${userId}.sessionId`);\n const ownerAddress = storageData?.getItem(`tss.${userId}.ownerAddress`);\n\n if (!keyshareData || !sessionId || !ownerAddress) throw new Error('No keyshare data available for backup');\n\n const backupData = { userId, sessionId, keyshare: keyshareData, ownerAddress: ownerAddress as `0x${string}`, createdAt: Date.now(), version: BACKUP_VERSION };\n\n // Create envelope with appropriate encryption method\n const envelope = password\n ? await envelopeEncryptKeyshareWithPassword(backupData, password)\n : await envelopeEncryptKeyshare(backupData, userId);\n\n const vaultToken = await getShareVaultToken(['share:put']);\n await uploadShareToVault(envelope, vaultToken.token);\n updateBackupStatus(userId, 'server', { enabled: true, lastBackup: Date.now(), error: undefined });\n}\n\nexport async function restoreFromServer(userId: string, password: string | null = null): Promise<void> {\n const vaultToken = await getShareVaultToken(['share:get']);\n const envelope = await downloadShareFromVault(vaultToken.token);\n\n // Decrypt based on encryption method or user preference\n const backupData = password\n ? await envelopeDecryptKeyshareWithPassword(envelope, password)\n : await envelopeDecryptKeyshare(envelope, userId);\n\n if (backupData.userId !== userId) throw new Error('Server backup does not match current user');\n\n const storage = typeof window !== 'undefined' ? window.localStorage : undefined;\n if (!storage) throw new Error('localStorage not available');\n\n storage.setItem(`tss.${userId}.keyshare`, backupData.keyshare);\n storage.setItem(`tss.${userId}.sessionId`, backupData.sessionId);\n storage.setItem(`tss.${userId}.ownerAddress`, backupData.ownerAddress);\n}\n\nexport async function restoreFromBackup(file: File, password: string | null, userId: string): Promise<void> {\n const fileContent = await file.text();\n const encryptedBackup: EncryptedBackup = JSON.parse(fileContent);\n\n let decryptionPassword: string;\n if (password) {\n // Use provided password\n decryptionPassword = password;\n } else {\n // Use passkey-derived password, with specific credentialId if available\n const credentialIdFromBackup = encryptedBackup.encryptionMethod === 'passkey' ? encryptedBackup.credentialId : undefined;\n const result = await deriveBackupPasswordFromPasskey(userId, credentialIdFromBackup).catch(() => {\n throw new Error('Restore requires either password or passkey authentication');\n });\n decryptionPassword = result.password;\n }\n\n const backupData = await decryptKeyshare(encryptedBackup, decryptionPassword);\n if (backupData.userId !== userId) throw new Error('Backup file does not match current user');\n\n const storage = typeof window !== 'undefined' ? window.localStorage : undefined;\n if (!storage) throw new Error('localStorage not available');\n\n storage.setItem(`tss.${userId}.keyshare`, backupData.keyshare);\n storage.setItem(`tss.${userId}.sessionId`, backupData.sessionId);\n storage.setItem(`tss.${userId}.ownerAddress`, backupData.ownerAddress);\n}\n\nexport function getCurrentKeyshareBackupData(userId: string): KeyshareBackupData | null {\n try {\n const storage = typeof window !== 'undefined' ? window.localStorage : undefined;\n const keyshareData = storage?.getItem(`tss.${userId}.keyshare`);\n const sessionId = storage?.getItem(`tss.${userId}.sessionId`);\n const ownerAddress = storage?.getItem(`tss.${userId}.ownerAddress`);\n if (!keyshareData || !sessionId || !ownerAddress) {\n console.warn('[BACKUP] Missing keyshare data for backup:', {\n hasKeyshare: !!keyshareData,\n hasSession: !!sessionId,\n hasOwner: !!ownerAddress,\n });\n return null;\n }\n return {\n userId,\n sessionId,\n keyshare: keyshareData,\n ownerAddress: ownerAddress as `0x${string}`,\n createdAt: Date.now(),\n version: BACKUP_VERSION,\n };\n } catch (error) {\n logSdkError(\n error instanceof Error ? error : new Error('Failed to get keyshare data'),\n { userId },\n \"vault\"\n );\n return null;\n }\n}\n\nexport async function backupToLocalFile(userId: string, password?: string): Promise<void> {\n const backupData = getCurrentKeyshareBackupData(userId);\n if (!backupData) {\n throw new Error('No keyshare data available for backup');\n }\n\n // Determine encryption method and get password + credential ID\n const encryptionMethod: 'passkey' | 'password' = password ? 'password' : 'passkey';\n let backupPassword: string;\n let credentialId: string | undefined;\n\n if (password) {\n // Use provided password\n backupPassword = password;\n } else {\n // Use passkey-derived password and get the credential ID from the actual passkey used\n const result = await deriveBackupPasswordFromPasskey(userId).catch(() => {\n throw new Error('Backup requires either custom password or passkey authentication');\n });\n backupPassword = result.password;\n credentialId = result.credentialId;\n }\n\n const encryptedBackup = await encryptKeyshare(backupData, backupPassword, encryptionMethod, credentialId);\n\n const fileName = `lumia-keyshare-backup-${userId}-${Date.now()}.json`;\n const fileContent = JSON.stringify(encryptedBackup, null, 2);\n\n // Create and trigger download\n const blob = new Blob([fileContent], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n\n const a = document.createElement('a');\n a.href = url;\n a.download = fileName;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n\n updateBackupStatus(userId, 'local', { enabled: true, lastBackup: Date.now(), error: undefined });\n console.info('[BACKUP] Successfully downloaded backup file');\n}\n\nexport async function backupToCloud(\n userId: string,\n password?: string,\n providerId?: string,\n usePrivateStorage: boolean = true\n): Promise<void> {\n const backupData = getCurrentKeyshareBackupData(userId);\n if (!backupData) {\n throw new Error('No keyshare data available for backup');\n }\n\n // Determine encryption method and get password + credential ID\n const encryptionMethod: 'passkey' | 'password' = password ? 'password' : 'passkey';\n let backupPassword: string;\n let credentialId: string | undefined;\n\n if (password) {\n // Use provided password\n backupPassword = password;\n } else {\n // Use passkey-derived password and get the credential ID from the actual passkey used\n const result = await deriveBackupPasswordFromPasskey(userId).catch(() => {\n throw new Error('Backup requires either custom password or passkey authentication');\n });\n backupPassword = result.password;\n credentialId = result.credentialId;\n }\n\n const encryptedBackup = await encryptKeyshare(backupData, backupPassword, encryptionMethod, credentialId);\n\n const timestamp = Date.now();\n const fileName = `lumia-keyshare-backup-${userId}-${timestamp}.json`;\n const fileContent = JSON.stringify(encryptedBackup, null, 2);\n\n // Import cloud storage module dynamically to avoid bundle bloat\n try {\n const { getAvailableCloudProviders } = await import('./cloudStorage');\n const providers = getAvailableCloudProviders();\n\n if (providers.length === 0) {\n throw new Error(\n 'No cloud storage providers available in this environment'\n );\n }\n\n // Use specified provider or first available\n const provider = providerId ? providers.find(p => p.id === providerId) : providers[0];\n\n if (!provider) {\n throw new Error(\n providerId ?\n `Cloud provider '${providerId}' not available`\n : 'No cloud storage provider available'\n );\n }\n\n console.info(`[BACKUP] Using ${provider.name} for cloud backup`);\n\n // Authenticate if not already authenticated\n if (!provider.isAuthenticated()) {\n console.info(`[BACKUP] Authenticating with ${provider.name}`);\n const authenticated = await provider.authenticate();\n if (!authenticated) {\n throw new Error(`Failed to authenticate with ${provider.name}`);\n }\n }\n\n // Upload file to cloud storage\n console.info(`[BACKUP] Uploading backup to ${provider.name}`);\n const fileId = await provider.upload(fileName, fileContent, usePrivateStorage);\n\n updateBackupStatus(userId, 'cloud', { enabled: true, lastBackup: timestamp, error: undefined });\n } catch (error) {\n logSdkError(\n error instanceof Error ? error : new Error('Cloud backup failed'),\n { userId, providerId },\n \"vault\"\n );\n const errorMsg = error instanceof Error ? error.message : 'Cloud backup failed';\n updateBackupStatus(userId, 'cloud', { error: errorMsg });\n throw new Error(errorMsg);\n }\n}\n\nexport async function getAvailableCloudProviders(): Promise<\n Array<{ id: string; name: string; icon: string; isAuthenticated: boolean }>\n> {\n try {\n const { getAvailableCloudProviders } = await import('./cloudStorage');\n const providers = getAvailableCloudProviders();\n\n return providers.map(provider => ({\n id: provider.id,\n name: provider.name,\n icon: provider.icon,\n isAuthenticated: provider.isAuthenticated(),\n }));\n } catch (error) {\n console.warn('[BACKUP] Failed to load cloud providers:', error);\n return [];\n }\n}\n","// Use iframe-based MPC client for secure key storage\nimport {\n ensureDkgAndGetOwner,\n checkKeyshare,\n getAddress,\n} from '../lib/iframe-mpc-client';\nimport { syncKeyshareStatus } from './index';\n\nexport interface KeyshareStatus {\n hasServerKeyshare: boolean;\n hasLocalKeyshare: boolean;\n needsDkg: boolean;\n needsRecovery: boolean;\n ownerAddress?: `0x${string}`;\n}\n\nexport async function checkKeyshareStatusWithSync(userId: string): Promise<KeyshareStatus> {\n const serverHasKeyshare = await syncKeyshareStatus();\n return checkKeyshareStatus(userId, serverHasKeyshare);\n}\n\nexport async function checkKeyshareStatus(\n userId: string,\n serverHasKeyshare: boolean\n): Promise<KeyshareStatus> {\n // Check keyshare status via secure iframe\n const keyshareInfo = await checkKeyshare(userId);\n const hasLocalKeyshare = keyshareInfo.hasKeyshare;\n const localOwnerAddress = keyshareInfo.address;\n\n console.log('[checkKeyshareStatus] Checking via iframe:', {\n userId,\n serverHasKeyshare,\n hasLocalKeyshare,\n ownerAddress: localOwnerAddress,\n });\n\n let needsDkg = false;\n let needsRecovery = false;\n if (!serverHasKeyshare && !hasLocalKeyshare) needsDkg = true;\n else if (serverHasKeyshare && !hasLocalKeyshare) needsRecovery = true;\n else if (!serverHasKeyshare && hasLocalKeyshare) {\n needsDkg = true;\n }\n\n const result = {\n hasServerKeyshare: serverHasKeyshare,\n hasLocalKeyshare,\n needsDkg,\n needsRecovery,\n ownerAddress: localOwnerAddress,\n };\n console.log('[checkKeyshareStatus] Result:', result);\n\n return result;\n}\n\nasync function ensureKeyshareForNewUser(userId: string, onProgress?: (step: string) => void): Promise<{ ownerAddress: `0x${string}` }> {\n onProgress?.('Setting up secure key management...');\n const result = await ensureDkgAndGetOwner(userId);\n if (!result.ownerAddress) throw new Error('DKG completed but no owner address received');\n await syncKeyshareStatus();\n onProgress?.('Key management setup complete');\n return { ownerAddress: result.ownerAddress };\n}\n\nexport async function ensureKeyshare(\n userId: string,\n serverHasKeyshare: boolean,\n onProgress?: (step: string) => void,\n isNewUser?: boolean\n): Promise<{ ownerAddress: `0x${string}` }> {\n console.log('[ensureKeyshare] Called with:', { userId, serverHasKeyshare, isNewUser });\n\n const status = await checkKeyshareStatus(userId, serverHasKeyshare);\n\n if (!status.needsDkg && !status.needsRecovery && status.ownerAddress) {\n console.log('[ensureKeyshare] Keyshare already ready, returning');\n onProgress?.('Keyshare ready');\n return { ownerAddress: status.ownerAddress };\n }\n\n if (status.needsRecovery) {\n console.log('[ensureKeyshare] Recovery needed, checking backups...');\n onProgress?.('Checking backup availability...');\n const { checkServerBackupAvailability, getBackupStatus } = await import('@/vaultClient');\n const localBackupStatus = getBackupStatus(userId);\n const serverBackupResult = await checkServerBackupAvailability();\n const hasLocalBackup = localBackupStatus.local.enabled && localBackupStatus.local.lastBackup;\n const hasCloudBackup = localBackupStatus.cloud.enabled && localBackupStatus.cloud.lastBackup;\n const hasAnyBackup = serverBackupResult.hasBackup || hasLocalBackup || hasCloudBackup;\n if (!serverBackupResult.serviceAvailable) {\n if (!hasLocalBackup && !hasCloudBackup) { const e = new Error('Your account exists but backup verification failed.\\n\\nThe backup server is currently unavailable.'); (e as any).code = 'BACKUP_SERVICE_UNAVAILABLE'; (e as any).userId = userId; (e as any).serverHasKeyshare = true; throw e; }\n } else if (!hasAnyBackup) {\n const noBackupError = new Error('Your account exists but no backups are available for recovery.'); (noBackupError as any).code = 'NO_BACKUP_AVAILABLE'; (noBackupError as any).userId = userId; (noBackupError as any).serverHasKeyshare = true; throw noBackupError;\n }\n onProgress?.('Backup found - restoration required');\n const recoveryError = new Error('Account exists on server but keyshare missing locally. Please restore from backup to access your account.');\n (recoveryError as any).code = 'KEYSHARE_RECOVERY_NEEDED'; (recoveryError as any).userId = userId; (recoveryError as any).serverHasKeyshare = true; (recoveryError as any).availableBackups = { server: serverBackupResult.hasBackup, local: hasLocalBackup, cloud: hasCloudBackup };\n throw recoveryError;\n }\n\n if (status.needsDkg) { onProgress?.('Setting up secure key management...'); }\n else { throw new Error('Invalid keyshare state - neither DKG nor recovery needed but keyshare missing'); }\n return ensureKeyshareForNewUser(userId, onProgress);\n}\n\nexport async function clearLocalKeyshare(userId: string): Promise<void> {\n // Note: In iframe-based architecture, keyshares are stored in iframe's isolated localStorage\n // We can't directly clear them from parent context\n // This function is kept for API compatibility but does nothing in iframe mode\n console.log('[clearLocalKeyshare] Keyshares are now managed by secure iframe');\n console.log('[clearLocalKeyshare] To clear keyshares, user must revoke authorization in iframe');\n\n // For backwards compatibility during migration, also clear any old localStorage keys\n if (typeof window !== 'undefined' && window.localStorage) {\n const keys = [\n `tss.${userId}.keyshare`,\n `tss.${userId}.ownerAddress`,\n `tss.${userId}.sessionId`,\n ...Object.keys(window.localStorage).filter((key) => key.startsWith(`tss.${userId}.dkg.`)),\n ];\n keys.forEach((key) => window.localStorage.removeItem(key));\n console.log('[clearLocalKeyshare] Cleared old localStorage keys for migration');\n }\n}\n\nexport async function getKeyshareInfo(userId: string): Promise<{\n hasKeyshare: boolean;\n ownerAddress?: `0x${string}`;\n sessionId?: string;\n keyshareSize?: number;\n}> {\n // Get keyshare info from secure iframe\n const info = await checkKeyshare(userId);\n\n return {\n hasKeyshare: info.hasKeyshare,\n ownerAddress: info.address,\n sessionId: 'iframe-session', // Session managed by iframe\n keyshareSize: undefined, // Size not exposed for security\n };\n}\n","import { getServiceUrls } from '../../../config/lumiaPassport';\n\nexport interface AuthProvider {\n provider: 'passkey' | 'email' | 'telegram' | 'google' | 'discord' | 'twitter' | 'wallet';\n verified: boolean;\n linkedAt: string;\n lastUsedAt?: string;\n externalId: string;\n}\n\nexport interface ProvidersResponse { providers: AuthProvider[] }\n\nexport function getTssUrl(): string { return getServiceUrls().tssUrl; }\n\nexport function getProviderDisplayInfo(provider: string) {\n const providers = {\n passkey: { name: 'Passkey', icon: '🔐', description: 'Biometric authentication', color: 'blue' },\n email: { name: 'Email', icon: '📧', description: 'Email verification', color: 'gray' },\n telegram: { name: 'Telegram', icon: '📱', description: 'Telegram account', color: 'blue' },\n google: { name: 'Google', icon: '🔍', description: 'Google account', color: 'red' },\n discord: { name: 'Discord', icon: '🎮', description: 'Discord account', color: 'purple' },\n twitter: { name: 'Twitter', icon: '🐦', description: 'Twitter account', color: 'blue' },\n wallet: { name: 'Wallet', icon: '👛', description: 'External wallet (EOA)', color: 'purple' }\n } as const;\n return (providers as any)[provider] || { name: provider, icon: '🔗', description: 'Authentication provider', color: 'gray' };\n}\n\nexport function formatDate(dateString: string): string {\n if (!dateString) return 'Never';\n try {\n const date = new Date(dateString);\n return `${date.toLocaleDateString()} ${date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`;\n } catch {\n return 'Invalid date';\n }\n}\n\n","import { authenticatedFetch, ensureValidToken, jwtTokenManager } from '../index';\nimport { getTssUrl } from './types';\nimport type { AuthProvider, ProvidersResponse } from './types';\n\nexport async function getLinkedProviders(): Promise<AuthProvider[]> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n const response = await authenticatedFetch(`${getTssUrl()}/api/auth/providers`, { method: 'GET' });\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to fetch providers: ${response.statusText}`);\n }\n const data: ProvidersResponse = await response.json();\n return data.providers;\n}\n\nexport async function unlinkProvider(providerType: string, externalId?: string): Promise<void> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n let url = `${getTssUrl()}/api/auth/unlink/${providerType}`;\n if (externalId) url += `?externalId=${encodeURIComponent(externalId)}`;\n const response = await authenticatedFetch(url, { method: 'DELETE' });\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to unlink provider: ${response.statusText}`);\n }\n try {\n const data = await response.json();\n if (data?.accessToken && data?.refreshToken && data?.expiresIn) {\n jwtTokenManager.setTokens({\n accessToken: data.accessToken,\n refreshToken: data.refreshToken,\n userId: jwtTokenManager.getUserId() || '',\n expiresIn: data.expiresIn,\n hasKeyshare: (jwtTokenManager.getHasKeyshare() ?? false) as boolean,\n } as any);\n }\n } catch {}\n}\n","import { authenticatedFetch, ensureValidToken } from '../index';\nimport { getTssUrl } from './types';\n\nexport async function sendEmailLinkCode(email: string): Promise<void> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n const response = await authenticatedFetch(`${getTssUrl()}/api/auth/link/email/send-code`, {\n method: 'POST',\n body: JSON.stringify({ email })\n });\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to send email verification code: ${response.statusText}`);\n }\n}\n\nexport async function verifyEmailLinkCode(email: string, code: string): Promise<void> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n const response = await authenticatedFetch(`${getTssUrl()}/api/auth/link/email/verify-code`, {\n method: 'POST',\n body: JSON.stringify({ email, code })\n });\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to verify email and link provider: ${response.statusText}`);\n }\n}\n\n","import { authenticatedFetch, ensureValidToken, jwtTokenManager } from '../index';\nimport { base64urlToUint8Array } from '../base64url';\nimport { credentialToAttestationPayload, type AttestationCredentialPayload } from '../webauthn';\nimport { getTssUrl } from './types';\n\n// Low-level endpoint wrapper\n// API: Link passkey to existing account\n// Method: POST\n// Path: /api/auth/link/passkey\nexport async function completePasskeyLinking(payload: { challengeId: string; credential: AttestationCredentialPayload }): Promise<void> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n const response = await authenticatedFetch(`${getTssUrl()}/api/auth/link/passkey/complete`, {\n method: 'POST',\n body: JSON.stringify(payload),\n });\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to link passkey: ${response.statusText}`);\n }\n}\n\nexport async function beginPasskeyLinking(): Promise<{ challengeId: string; options: PublicKeyCredentialCreationOptions }> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n // Try preferred begin endpoint first\n let res = await authenticatedFetch(`${getTssUrl()}/api/auth/link/passkey/begin`, { method: 'POST' });\n if (res.ok) {\n const begin = await res.json();\n const options: PublicKeyCredentialCreationOptions = {\n rp: begin.rp,\n user: { id: base64urlToUint8Array(begin.user.id), name: begin.user.name, displayName: begin.user.displayName },\n challenge: base64urlToUint8Array(begin.challenge),\n pubKeyCredParams: begin.pubKeyCredParams,\n timeout: begin.timeout,\n attestation: begin.attestation,\n authenticatorSelection: { ...begin.authenticatorSelection, residentKey: begin.authenticatorSelection?.residentKey ?? 'preferred', requireResidentKey: begin.authenticatorSelection?.requireResidentKey ?? false, userVerification: begin.authenticatorSelection?.userVerification ?? 'preferred' },\n excludeCredentials: begin.excludeCredentials?.map((cred: any) => ({ type: cred.type, id: base64urlToUint8Array(cred.id), transports: cred.transports })) || undefined,\n };\n return { challengeId: begin.challengeId, options };\n }\n\n // Backward compatibility: options endpoint\n res = await authenticatedFetch(`${getTssUrl()}/api/auth/link/passkey/options`, { method: 'GET' });\n if (!res.ok) throw new Error('Failed to get passkey linking options');\n const begin = await res.json();\n const options: PublicKeyCredentialCreationOptions = {\n rp: begin.rp,\n user: { id: base64urlToUint8Array(begin.user.id), name: begin.user.name, displayName: begin.user.displayName },\n challenge: base64urlToUint8Array(begin.challenge),\n pubKeyCredParams: begin.pubKeyCredParams,\n timeout: begin.timeout,\n attestation: begin.attestation,\n authenticatorSelection: { ...begin.authenticatorSelection, residentKey: 'preferred', requireResidentKey: false, userVerification: 'preferred' },\n excludeCredentials: begin.excludeCredentials?.map((cred: any) => ({ type: cred.type, id: base64urlToUint8Array(cred.id), transports: cred.transports })) || undefined,\n };\n return { challengeId: begin.challengeId, options };\n}\n\n// High-level helper: create a new WebAuthn credential and link it using COSE attestation\nexport async function linkPasskeyWithWebAuthn(optionsOverride?: Partial<PublicKeyCredentialCreationOptions>): Promise<void> {\n if (!('credentials' in navigator) || !('create' in navigator.credentials!)) {\n throw new Error('WebAuthn not supported in this browser');\n }\n\n const userId = jwtTokenManager.getUserId();\n if (!userId) throw new Error('No authenticated user');\n\n // Fetch linking options (challengeId + creation options)\n let challengeId: string | null = null;\n let publicKeyOptions: PublicKeyCredentialCreationOptions | null = null;\n try {\n const begin = await beginPasskeyLinking();\n challengeId = begin.challengeId;\n publicKeyOptions = begin.options;\n } catch {\n // Ignore and use fallback\n }\n\n if (!publicKeyOptions) {\n // Fallback minimal options (local challenge, host RP)\n const challenge = new Uint8Array(32);\n crypto.getRandomValues(challenge);\n publicKeyOptions = {\n rp: { name: window.location.hostname || 'Lumia Passport' },\n user: {\n id: new TextEncoder().encode(userId),\n name: userId,\n displayName: userId,\n },\n challenge,\n pubKeyCredParams: [{ type: 'public-key', alg: -7 }],\n attestation: 'none',\n authenticatorSelection: { residentKey: 'preferred', userVerification: 'preferred' },\n timeout: 60000,\n } as PublicKeyCredentialCreationOptions;\n }\n\n // Improve UX: customize display name and username per creation so OS sheet shows distinct labels\n try {\n const ts = new Date().toISOString().replace(/[:.]/g, '-');\n const friendlyDisplay = `Lumia User (${ts})`;\n const friendlyName = `lumia-link.${ts}`;\n const originalUser = publicKeyOptions.user as PublicKeyCredentialUserEntity;\n publicKeyOptions = {\n ...publicKeyOptions,\n user: {\n ...originalUser,\n name: friendlyName,\n displayName: friendlyDisplay,\n },\n } as PublicKeyCredentialCreationOptions;\n } catch {}\n\n // Ensure secure context\n if (!(window.isSecureContext || window.location.hostname === 'localhost')) {\n throw new Error('Passkey requires secure context (https or localhost)');\n }\n\n // Normalize rp.id if it mismatches origin host (helps local/dev)\n try {\n const originHost = window.location.hostname;\n const rpId = (publicKeyOptions.rp as any)?.id as string | undefined;\n const suffixMatches = (host: string, rp: string) => host === rp || host.endsWith(`.${rp}`);\n if (rpId && !suffixMatches(originHost, rpId)) {\n console.warn('[PasskeyLink] Adjusting rp.id to origin host for WebAuthn', { rpId, originHost });\n publicKeyOptions = { ...publicKeyOptions, rp: { ...(publicKeyOptions.rp as any), id: originHost } } as any;\n }\n } catch {}\n\n console.log('[PasskeyLink] Calling navigator.credentials.create', {\n rp: publicKeyOptions.rp,\n timeout: publicKeyOptions.timeout,\n attestation: publicKeyOptions.attestation,\n });\n\n const credential = (await navigator.credentials.create({ publicKey: { ...publicKeyOptions, ...optionsOverride } as PublicKeyCredentialCreationOptions })) as PublicKeyCredential;\n if (!credential) throw new Error('Passkey creation was cancelled');\n\n // Convert to registration-like attestation payload (COSE format)\n const attestationPayload = credentialToAttestationPayload(credential);\n\n // If we don't have a challengeId (fallback path), emulate a local one to satisfy schema\n const cid = challengeId || 'local-' + Date.now();\n\n await completePasskeyLinking({ challengeId: cid, credential: attestationPayload });\n}\n\nfunction base64urlToUint8Array(base64url: string): Uint8Array {\n const base64 = base64url.replace(/-/g, '+').replace(/_/g, '/');\n const pad = base64.length % 4 ? 4 - (base64.length % 4) : 0;\n const padded = base64 + '='.repeat(pad);\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n","import { authenticatedFetch, ensureValidToken } from '../index';\nimport { getTssUrl } from './types';\n\nexport async function linkTelegram(telegramData: any): Promise<void> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n const response = await authenticatedFetch(`${getTssUrl()}/api/auth/link/telegram`, {\n method: 'POST',\n body: JSON.stringify(telegramData)\n });\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to link Telegram: ${response.statusText}`);\n }\n}\n\n// Lightweight widget integration helper\nexport function mountTelegramLoginWidget(container: HTMLElement, botUsername: string, onAuth: (data: any) => void, options?: { requestAccess?: 'write'; }) {\n const scriptId = 'telegram-login-widget';\n if (!document.getElementById(scriptId)) {\n const s = document.createElement('script');\n s.id = scriptId;\n s.src = 'https://telegram.org/js/telegram-widget.js?22';\n s.async = true;\n s.defer = true;\n container.parentElement?.appendChild(s);\n }\n\n // Create widget container\n const btn = document.createElement('div');\n btn.setAttribute('class', 'tg-login-button');\n btn.setAttribute('data-telegram-login', botUsername);\n btn.setAttribute('data-size', 'large');\n if (options?.requestAccess) btn.setAttribute('data-request-access', options.requestAccess);\n\n // Register callback\n const callbackName = `__lumia_tg_auth_cb_${Math.random().toString(36).slice(2)}`;\n (window as any)[callbackName] = (user: any) => onAuth(user);\n btn.setAttribute('data-onauth', callbackName);\n\n container.innerHTML = '';\n container.appendChild(btn);\n}\n\n","import { authenticatedFetch, ensureValidToken } from '../index';\nimport { getTssUrl } from './types';\nimport type { Address } from 'viem';\n\nexport interface WalletLinkRequest {\n address: Address;\n signature: string;\n message: string;\n chainId: number;\n walletName?: string; // e.g., \"MetaMask\", \"Rainbow\", \"Coinbase Wallet\"\n walletType?: string; // e.g., \"metaMask\", \"rainbow\", \"coinbaseWallet\" (connector id)\n}\n\nexport async function linkWallet(walletData: WalletLinkRequest): Promise<void> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n const response = await authenticatedFetch(`${getTssUrl()}/api/auth/link/wallet`, {\n method: 'POST',\n body: JSON.stringify(walletData)\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to link wallet: ${response.statusText}`);\n }\n}\n\nexport async function unlinkWallet(address: Address): Promise<void> {\n const hasValidToken = await ensureValidToken();\n if (!hasValidToken) throw new Error('No authentication token available');\n\n const response = await authenticatedFetch(`${getTssUrl()}/api/auth/unlink/wallet?address=${encodeURIComponent(address)}`, {\n method: 'DELETE'\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Failed to unlink wallet: ${response.statusText}`);\n }\n}\n\nexport function createSignatureMessage(address: Address, nonce?: string): string {\n const timestamp = Date.now();\n const nonceValue = nonce || Math.random().toString(36).substring(2, 15);\n\n return `Lumia Passport Wallet Link\\n\\nAddress: ${address}\\nNonce: ${nonceValue}\\nTimestamp: ${timestamp}\\n\\nSign this message to link your wallet to Lumia Passport`;\n}","export * from './types';\nexport * from './common';\nexport * from './email';\nexport * from './passkey';\nexport * from './telegram';\nexport * from './wallet';\n\n","// Re-export JWT functionality from @lumiapassport/core\nexport {\n type JwtTokens,\n type LoginResponse,\n type RefreshResponse,\n type VerifyResponse,\n JwtTokenManager,\n createJwtTokenManager,\n jwtTokenManager,\n configureJwtModule,\n logout,\n verifyToken,\n ensureValidToken,\n authenticatedFetch,\n loginWithUserId,\n loginWithEmail,\n loginWithTelegram,\n syncKeyshareStatus,\n} from '@lumiapassport/core/auth';\n\n// Browser-specific passkey auth functions\nexport {\n beginPasskeyAuthentication,\n completePasskeyAuthentication,\n beginPasskeyRegistration,\n completePasskeyRegistration,\n} from './passkeyAuth';\n\n// UI-specific auth modules\nexport * from './telegram';\nexport * from './passkey';\nexport * from './keyshare';\nexport * from './providers';\n\nexport type AuthMethod = 'telegram' | 'passkey' | 'development' | 'email';\n\nexport interface AuthState {\n method?: AuthMethod;\n isAuthenticated: boolean;\n userId?: string;\n displayName?: string;\n photoUrl?: string;\n accessToken?: string;\n expiresAt?: number;\n hasKeyshare?: boolean;\n needsRecovery?: boolean;\n}\n\nexport const createInitialAuthState = (): AuthState => ({ isAuthenticated: false });\n\n","/**\n * Iframe Manager for Parent SDK\n *\n * Manages secure communication with the isolated iframe wallet at auth.lumiapassport.com\n * Implements postMessage protocol with HMAC authentication and replay protection\n */\n\nimport type { Address, Hex } from 'viem';\n\n// ========================================\n// Types\n// ========================================\n\ninterface SecureMessage {\n type: string;\n messageId: string;\n timestamp: number;\n nonce: string;\n hmac?: string;\n projectId: string;\n data: Record<string, any>;\n}\n\ninterface PendingRequest {\n resolve: (value: any) => void;\n reject: (error: Error) => void;\n timestamp: number;\n}\n\ninterface Transaction {\n to: Address;\n value: string;\n data?: Hex;\n gasLimit?: string;\n}\n\nexport interface IframeManagerConfig {\n iframeUrl: string;\n projectId: string;\n debug?: boolean;\n onWalletReady?: (status: WalletReadyStatus) => void;\n themeColors?: {\n background?: string;\n text?: string;\n textSecondary?: string;\n border?: string;\n };\n}\n\nexport interface WalletReadyStatus {\n ready: boolean;\n userId?: string;\n address?: `0x${string}`;\n hasKeyshare: boolean;\n hasSession: boolean;\n timestamp: number;\n}\n\n// ========================================\n// Iframe Manager\n// ========================================\n\nexport class IframeManager {\n private iframe: HTMLIFrameElement | null = null;\n private iframeUrl: string;\n private projectId: string;\n private debug: boolean;\n private sessionToken: string | null = null;\n private isReady: boolean = false;\n private readyPromise: Promise<void>;\n private readyResolve!: () => void;\n private onWalletReadyCallback?: (status: WalletReadyStatus) => void;\n private themeColors?: IframeManagerConfig['themeColors'];\n\n // Message handling\n private pendingRequests = new Map<string, PendingRequest>();\n private usedNonces = new Set<string>();\n private messageListener: ((event: MessageEvent) => void) | null = null;\n\n // Timeouts\n private readonly REQUEST_TIMEOUT = 300000; // 5 minutes (for user interactions like consent)\n private readonly NONCE_EXPIRY = 300000; // 5 minutes\n\n constructor(config: IframeManagerConfig) {\n this.iframeUrl = config.iframeUrl;\n this.projectId = config.projectId;\n this.debug = config.debug || false;\n this.onWalletReadyCallback = config.onWalletReady;\n this.themeColors = config.themeColors;\n\n this.readyPromise = new Promise((resolve) => {\n this.readyResolve = resolve;\n });\n\n this.log('[IframeManager] Initialized with:', {\n iframeUrl: this.iframeUrl,\n projectId: this.projectId,\n hasThemeColors: !!this.themeColors,\n });\n }\n\n /**\n * Initialize iframe and wait for it to be ready\n */\n async initialize(): Promise<void> {\n if (this.iframe) {\n return this.readyPromise;\n }\n\n // Create iframe element\n this.iframe = document.createElement('iframe');\n\n // Build iframe URL with theme colors\n let iframeUrl = this.iframeUrl;\n if (this.themeColors) {\n const params = new URLSearchParams();\n if (this.themeColors.background) params.set('bg', this.themeColors.background);\n if (this.themeColors.text) params.set('text', this.themeColors.text);\n if (this.themeColors.textSecondary) params.set('textSec', this.themeColors.textSecondary);\n if (this.themeColors.border) params.set('border', this.themeColors.border);\n\n if (params.toString()) {\n iframeUrl += (iframeUrl.includes('?') ? '&' : '?') + params.toString();\n }\n }\n\n this.iframe.src = iframeUrl;\n this.iframe.id = 'lumia-passport-iframe';\n\n // Initially hidden\n this.iframe.style.display = 'none';\n this.iframe.style.position = 'fixed';\n this.iframe.style.top = '0';\n this.iframe.style.left = '0';\n this.iframe.style.width = '100%';\n this.iframe.style.height = '100%';\n this.iframe.style.border = 'none';\n this.iframe.style.zIndex = '999999';\n this.iframe.style.background = 'rgba(0, 0, 0, 0.5)';\n\n // Sandbox: strict - no popups allowed (explorer links will use postMessage to parent)\n this.iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin');\n\n // Allow WebAuthn (passkey) API in iframe\n this.iframe.setAttribute('allow', 'publickey-credentials-get *; publickey-credentials-create *');\n\n // Setup message listener\n this.messageListener = this.handleMessage.bind(this);\n window.addEventListener('message', this.messageListener);\n\n // Append to body\n document.body.appendChild(this.iframe);\n\n // Wait for IFRAME_READY message\n await this.readyPromise;\n\n // Authenticate SDK with iframe\n await this.authenticateSDK();\n\n this.log('[IframeManager] ✅ Iframe ready and authenticated');\n }\n\n /**\n * Set the onWalletReady callback\n */\n setOnWalletReady(callback: (status: WalletReadyStatus) => void): void {\n this.onWalletReadyCallback = callback;\n }\n\n /**\n * Authenticate SDK with iframe to establish session\n */\n private async authenticateSDK(): Promise<void> {\n const response = await this.sendMessage('SDK_AUTH', {\n projectId: this.projectId,\n });\n\n if (response.type === 'LUMIA_PASSPORT_SDK_AUTH_SUCCESS') {\n this.sessionToken = response.sessionToken;\n } else {\n throw new Error('SDK authentication failed');\n }\n }\n\n /**\n * Handle incoming postMessage events\n */\n private handleMessage(event: MessageEvent): void {\n const message = event.data;\n\n // Quick filter: ignore messages that are clearly not ours\n // This prevents spam from browser extensions, dev tools, etc.\n if (!message || typeof message !== 'object' || !message.type) {\n // Silently ignore messages without basic structure\n return;\n }\n\n // Check if this looks like a Lumia Passport message\n // Our expected message types from iframe\n const validIframeTypes = [\n 'LUMIA_PASSPORT_IFRAME_READY',\n 'LUMIA_PASSPORT_WALLET_READY',\n 'LUMIA_PASSPORT_SHOW_IFRAME',\n 'LUMIA_PASSPORT_HIDE_IFRAME',\n 'LUMIA_PASSPORT_SDK_AUTH_SUCCESS',\n 'LUMIA_PASSPORT_AUTH_SUCCESS',\n 'LUMIA_PASSPORT_DKG_SUCCESS',\n 'LUMIA_PASSPORT_SIGNATURE',\n 'LUMIA_PASSPORT_ADDRESS',\n 'LUMIA_PASSPORT_KEYSHARE_STATUS',\n 'LUMIA_PASSPORT_TRUSTED_APPS_LIST',\n 'LUMIA_PASSPORT_TRUSTED_APP_REMOVED',\n 'LUMIA_PASSPORT_REQUEST_NEW_TOKEN',\n 'LUMIA_PASSPORT_TOKEN_REFRESHED',\n 'LUMIA_PASSPORT_RESPONSE',\n 'LUMIA_PASSPORT_ERROR',\n ];\n\n if (!validIframeTypes.includes(message.type) && !message.messageId) {\n // Not our message type and no messageId - ignore\n return;\n }\n\n // IMPORTANT: Origin validation\n // We MUST validate that messages come from our iframe (auth.lumiapassport.com)\n // This protects against malicious actors sending fake messages from other origins\n const iframeOrigin = new URL(this.iframeUrl).origin;\n if (event.origin !== iframeOrigin) {\n // Log warning for potential security issue\n this.log('[IframeManager] ⚠️ Ignored message from invalid origin:', { received: event.origin, expected: iframeOrigin });\n return;\n }\n\n // At this point we know:\n // 1. Message has valid structure\n // 2. Message type matches our protocol\n // 3. Message originated from our iframe (auth.lumiapassport.com)\n\n // Handle IFRAME_READY\n if (message.type === 'LUMIA_PASSPORT_IFRAME_READY') {\n this.log('[IframeManager] 📨 Received LUMIA_PASSPORT_IFRAME_READY');\n this.isReady = true;\n this.readyResolve();\n return;\n }\n\n // Handle WALLET_READY status\n if (message.type === 'LUMIA_PASSPORT_WALLET_READY') {\n this.log('[IframeManager] 📨 Received LUMIA_PASSPORT_WALLET_READY', message.data);\n if (this.onWalletReadyCallback) {\n this.onWalletReadyCallback(message.data as WalletReadyStatus);\n }\n return;\n }\n\n // Handle SHOW_IFRAME request\n if (message.type === 'LUMIA_PASSPORT_SHOW_IFRAME') {\n this.log('[IframeManager] 📨 Received LUMIA_PASSPORT_SHOW_IFRAME');\n this.showIframe();\n return;\n }\n\n // Handle HIDE_IFRAME request\n if (message.type === 'LUMIA_PASSPORT_HIDE_IFRAME') {\n this.log('[IframeManager] 📨 Received LUMIA_PASSPORT_HIDE_IFRAME');\n this.hideIframe();\n return;\n }\n\n // Handle REQUEST_NEW_TOKEN from iframe\n if (message.type === 'LUMIA_PASSPORT_REQUEST_NEW_TOKEN') {\n this.log('[IframeManager] 📨 Received LUMIA_PASSPORT_REQUEST_NEW_TOKEN');\n // Handle async token refresh without blocking message processing\n this.handleTokenRefreshRequest(message).catch((error) => {\n this.log('[IframeManager] ❌ Token refresh error:', error);\n });\n return;\n }\n\n // Handle responses to our requests\n if (message.messageId) {\n const pending = this.pendingRequests.get(message.messageId);\n if (pending) {\n this.pendingRequests.delete(message.messageId);\n\n if (message.type === 'LUMIA_PASSPORT_ERROR') {\n pending.reject(new Error(message.error || 'Unknown error'));\n } else {\n pending.resolve(message.data || message);\n }\n }\n }\n }\n\n /**\n * Handle token refresh request from iframe\n */\n private async handleTokenRefreshRequest(message: any): Promise<void> {\n try {\n // Import jwtTokenManager dynamically\n const { jwtTokenManager } = await import('../auth');\n\n // Attempt to refresh the token\n const refreshSuccess = await jwtTokenManager.refreshAccessToken();\n\n if (refreshSuccess) {\n const newAccessToken = jwtTokenManager.getAccessToken();\n\n // Send new token to iframe\n if (this.iframe && this.iframe.contentWindow) {\n const iframeOrigin = new URL(this.iframeUrl).origin;\n this.iframe.contentWindow.postMessage(\n {\n type: 'LUMIA_PASSPORT_TOKEN_REFRESHED',\n messageId: message.messageId,\n accessToken: newAccessToken,\n timestamp: Date.now(),\n },\n iframeOrigin\n );\n }\n } else {\n // Send error to iframe\n if (this.iframe && this.iframe.contentWindow) {\n const iframeOrigin = new URL(this.iframeUrl).origin;\n this.iframe.contentWindow.postMessage(\n {\n type: 'LUMIA_PASSPORT_TOKEN_REFRESHED',\n messageId: message.messageId,\n error: 'Token refresh failed',\n timestamp: Date.now(),\n },\n iframeOrigin\n );\n }\n }\n } catch (error) {\n // Send error to iframe\n if (this.iframe && this.iframe.contentWindow) {\n const iframeOrigin = new URL(this.iframeUrl).origin;\n this.iframe.contentWindow.postMessage(\n {\n type: 'LUMIA_PASSPORT_TOKEN_REFRESHED',\n messageId: message.messageId,\n error: error instanceof Error ? error.message : 'Unknown error',\n timestamp: Date.now(),\n },\n iframeOrigin\n );\n }\n }\n }\n\n /**\n * Send secure message to iframe\n */\n private async sendMessage(type: string, data: Record<string, any>): Promise<any> {\n if (!this.iframe || !this.iframe.contentWindow) {\n throw new Error('Iframe not initialized');\n }\n\n const messageId = this.generateMessageId();\n const nonce = this.generateNonce();\n const timestamp = Date.now();\n\n const message: SecureMessage = {\n type,\n messageId,\n timestamp,\n nonce,\n projectId: this.projectId,\n data: {\n ...data,\n sessionToken: this.sessionToken,\n },\n };\n\n // Compute HMAC if session token is available\n if (this.sessionToken) {\n message.hmac = await this.computeHMAC(message);\n }\n\n // Create promise for response\n const responsePromise = new Promise<any>((resolve, reject) => {\n this.pendingRequests.set(messageId, {\n resolve,\n reject,\n timestamp,\n });\n\n // Set timeout\n setTimeout(() => {\n if (this.pendingRequests.has(messageId)) {\n this.pendingRequests.delete(messageId);\n reject(new Error(`Request timeout: ${type}`));\n }\n }, this.REQUEST_TIMEOUT);\n });\n\n // Send message\n const iframeOrigin = new URL(this.iframeUrl).origin;\n this.iframe.contentWindow.postMessage(message, iframeOrigin);\n\n this.log(`[IframeManager] 📤 Sent message: ${type}`, { messageId });\n\n return responsePromise;\n }\n\n /**\n * Compute HMAC for message authentication\n */\n private async computeHMAC(message: SecureMessage): Promise<string> {\n const encoder = new TextEncoder();\n const payload = JSON.stringify({\n type: message.type,\n messageId: message.messageId,\n timestamp: message.timestamp,\n nonce: message.nonce,\n data: JSON.stringify(message.data),\n });\n\n const data = encoder.encode(payload);\n const key = encoder.encode(this.sessionToken!);\n\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n key,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n\n const signature = await crypto.subtle.sign('HMAC', cryptoKey, data);\n\n return Array.from(new Uint8Array(signature))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n\n /**\n * Generate unique message ID\n */\n private generateMessageId(): string {\n return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n }\n\n /**\n * Generate nonce for replay protection\n */\n private generateNonce(): string {\n const randomBytes = new Uint8Array(16);\n crypto.getRandomValues(randomBytes);\n return Array.from(randomBytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n\n // ========================================\n // UI Methods\n // ========================================\n\n /**\n * Show iframe (for consent/confirmation UI)\n */\n showIframe(): void {\n if (this.iframe) {\n this.iframe.style.display = 'block';\n }\n }\n\n /**\n * Hide iframe\n */\n hideIframe(): void {\n if (this.iframe) {\n this.iframe.style.display = 'none';\n }\n }\n\n // ========================================\n // Public API Methods\n // ========================================\n\n /**\n * Authenticate user with application\n */\n async authenticate(userId: string): Promise<{ userId: string; address: Address | undefined }> {\n const response = await this.sendMessage('AUTHENTICATE', {\n userId,\n projectId: this.projectId,\n });\n\n if (response.type === 'LUMIA_PASSPORT_AUTH_SUCCESS') {\n return {\n userId: response.userId,\n address: response.address,\n };\n }\n\n throw new Error('Authentication failed');\n }\n\n /**\n * Start DKG (Distributed Key Generation)\n */\n async startDKG(userId: string, accessToken?: string): Promise<Address> {\n const response = await this.sendMessage('START_DKG', {\n userId,\n projectId: this.projectId,\n accessToken, // Pass access token for TSS API authentication\n });\n\n if (response.type === 'LUMIA_PASSPORT_DKG_SUCCESS') {\n return response.ownerAddress;\n }\n\n throw new Error('DKG failed');\n }\n\n /**\n * Sign transaction\n */\n async signTransaction(userId: string, transaction: Transaction, accessToken?: string): Promise<Hex> {\n const response = await this.sendMessage('SIGN_TRANSACTION', {\n userId,\n projectId: this.projectId,\n transaction,\n accessToken, // Pass access token for TSS API authentication\n });\n\n if (response.type === 'LUMIA_PASSPORT_SIGNATURE') {\n return response.signature;\n }\n\n throw new Error('Transaction signing failed');\n }\n\n /**\n * Get user's wallet address\n */\n async getAddress(userId: string): Promise<Address | undefined> {\n const response = await this.sendMessage('GET_ADDRESS', {\n userId,\n });\n\n if (response.type === 'LUMIA_PASSPORT_ADDRESS') {\n return response.address;\n }\n\n return undefined;\n }\n\n /**\n * Check if user has a keyshare\n */\n async checkKeyshare(userId: string): Promise<{ hasKeyshare: boolean; address?: Address }> {\n const response = await this.sendMessage('CHECK_KEYSHARE', {\n userId,\n });\n\n if (response.type === 'LUMIA_PASSPORT_KEYSHARE_STATUS') {\n return {\n hasKeyshare: response.hasKeyshare,\n address: response.address,\n };\n }\n\n return { hasKeyshare: false };\n }\n\n /**\n * Get trusted apps for user\n */\n async getTrustedApps(userId: string): Promise<Array<{\n userId: string;\n projectId: string;\n origin: string;\n trustedAt: number;\n }>> {\n const response = await this.sendMessage('GET_TRUSTED_APPS', {\n userId,\n });\n\n if (response.type === 'LUMIA_PASSPORT_TRUSTED_APPS_LIST') {\n return response.apps || [];\n }\n\n return [];\n }\n\n /**\n * Remove app from trusted list\n */\n async removeTrustedApp(userId: string, projectId: string, origin: string): Promise<boolean> {\n const response = await this.sendMessage('REMOVE_TRUSTED_APP', {\n userId,\n projectId,\n appOrigin: origin,\n });\n\n if (response.type === 'LUMIA_PASSPORT_TRUSTED_APP_REMOVED') {\n return response.success;\n }\n\n return false;\n }\n\n /**\n * Create backup of keyshare\n */\n async createBackup(\n userId: string,\n backupRequest: { method: 'server' | 'cloud' | 'local'; password?: string; cloudProvider?: string },\n accessToken?: string\n ): Promise<{ success: boolean; method: string; timestamp: number; error?: string }> {\n const response = await this.sendMessage('CREATE_BACKUP', {\n userId,\n backupRequest,\n accessToken, // Pass access token for TSS API authentication\n });\n\n if (response.type === 'LUMIA_PASSPORT_BACKUP_CREATED') {\n return response.result;\n }\n\n throw new Error('Unexpected response type');\n }\n\n /**\n * Restore keyshare from server backup\n */\n async restoreFromServer(\n userId: string,\n password?: string,\n accessToken?: string\n ): Promise<{ success: boolean; timestamp: number; error?: string; data?: any }> {\n const response = await this.sendMessage('RESTORE_BACKUP', {\n userId,\n password,\n accessToken, // Pass access token for TSS API authentication\n });\n\n if (response.type === 'LUMIA_PASSPORT_BACKUP_RESTORED') {\n return response.result;\n }\n\n throw new Error('Unexpected response type');\n }\n\n /**\n * Encrypt backup data without uploading (for cloud/local backups)\n * Returns encrypted data that parent can upload/download\n */\n async encryptBackupData(\n userId: string,\n password?: string\n ): Promise<any> {\n const response = await this.sendMessage('ENCRYPT_BACKUP_DATA', {\n userId,\n password,\n });\n\n if (response.type === 'LUMIA_PASSPORT_BACKUP_ENCRYPTED') {\n return response.encryptedData;\n }\n\n throw new Error('Unexpected response type');\n }\n\n /**\n * Restore keyshare from local file backup\n */\n async restoreFromLocalFile(\n userId: string,\n fileContent: string,\n password?: string\n ): Promise<{ success: boolean; timestamp: number; error?: string; data?: any }> {\n const response = await this.sendMessage('RESTORE_FROM_FILE', {\n userId,\n fileContent,\n password,\n });\n\n if (response.type === 'LUMIA_PASSPORT_FILE_RESTORED') {\n return response.result;\n }\n\n throw new Error('Unexpected response type');\n }\n\n /**\n * Get backup status for user\n */\n async getBackupStatus(userId: string): Promise<{\n server: { lastBackup?: number; error?: string };\n cloud: { lastBackup?: number; error?: string };\n local: { lastBackup?: number; error?: string };\n }> {\n const response = await this.sendMessage('GET_BACKUP_STATUS', {\n userId,\n });\n\n if (response.type === 'LUMIA_PASSPORT_BACKUP_STATUS') {\n return response.status;\n }\n\n throw new Error('Unexpected response type');\n }\n\n /**\n * Get available cloud providers\n */\n async getCloudProviders(): Promise<Array<{ id: string; name: string; available: boolean }>> {\n const response = await this.sendMessage('GET_CLOUD_PROVIDERS', {});\n\n if (response.type === 'LUMIA_PASSPORT_CLOUD_PROVIDERS') {\n return response.providers;\n }\n\n throw new Error('Unexpected response type');\n }\n\n /**\n * Cleanup and destroy iframe\n */\n destroy(): void {\n this.log('[IframeManager] Destroying iframe...');\n\n // Clear pending requests\n this.pendingRequests.forEach((pending) => {\n pending.reject(new Error('Iframe manager destroyed'));\n });\n this.pendingRequests.clear();\n\n // Remove message listener\n if (this.messageListener) {\n window.removeEventListener('message', this.messageListener);\n this.messageListener = null;\n }\n\n // Remove iframe\n if (this.iframe && this.iframe.parentNode) {\n this.iframe.parentNode.removeChild(this.iframe);\n }\n\n this.iframe = null;\n this.isReady = false;\n this.sessionToken = null;\n\n this.log('[IframeManager] ✅ Destroyed');\n }\n\n /**\n * Debug logging\n */\n private log(message: string, data?: any): void {\n if (this.debug) {\n if (data) {\n console.log(message, data);\n } else {\n console.log(message);\n }\n }\n }\n}\n\n// ========================================\n// Singleton Instance\n// ========================================\n\nlet iframeManagerInstance: IframeManager | null = null;\n\n/**\n * Get or create iframe manager singleton\n */\nexport function getIframeManager(config?: IframeManagerConfig): IframeManager {\n if (!iframeManagerInstance && config) {\n iframeManagerInstance = new IframeManager(config);\n }\n\n if (!iframeManagerInstance) {\n throw new Error(\n 'IframeManager not initialized. This usually means projectId is not configured.\\n\\n' +\n 'To fix this:\\n' +\n '1. Get your projectId from https://dashboard.lumiapassport.com/\\n' +\n '2. Add it to LumiaPassportProvider:\\n' +\n ' <LumiaPassportProvider projectId=\"your-project-id\">\\n\\n' +\n 'For more details, see the documentation.'\n );\n }\n\n return iframeManagerInstance;\n}\n\n/**\n * Wait for iframe to be ready\n * Returns a promise that resolves when iframe is initialized and authenticated\n */\nexport async function waitForIframe(): Promise<void> {\n const manager = getIframeManager();\n await manager.initialize();\n}\n\n/**\n * Destroy iframe manager singleton\n */\nexport function destroyIframeManager(): void {\n if (iframeManagerInstance) {\n iframeManagerInstance.destroy();\n iframeManagerInstance = null;\n }\n}\n","import React, { createContext, useCallback, useContext, useEffect, useState } from 'react';\n\nimport {\n defaultLumiaPassportConfig,\n type LumiaPassportConfig,\n getServiceUrls,\n getIframeUrl,\n} from '../config/lumiaPassport';\nimport { LumiaWagmiProvider } from './WagmiContext';\nimport { getIframeManager, destroyIframeManager } from '../internal/lib/iframe-manager';\nimport { initSdkErrorTracking } from '@lumiapassport/core/internal/error-tracking';\n\nexport interface WalletReadyStatus {\n ready: boolean;\n userId?: string;\n address?: `0x${string}`;\n hasKeyshare: boolean;\n hasSession: boolean;\n timestamp: number;\n}\n\nexport interface LumiaPassportCallbacks {\n onLumiaPassportConnecting?: (payload: { method: 'passkey' | 'email' | 'social' | 'wallet'; provider?: string }) => void;\n onLumiaPassportConnect?: (payload: { address: `0x${string}`; session: any }) => void;\n onLumiaPassportAccount?: (payload: { userId?: string | null; address?: `0x${string}` | null; session?: any; hasKeyshare?: boolean }) => void;\n onLumiaPassportUpdate?: (payload: { providers?: Array<any> }) => void;\n onLumiaPassportDisconnect?: (payload: { address?: `0x${string}` | null; userId?: string | null }) => void;\n onLumiaPassportError?: (payload: { error: Error; code?: string; message: string }) => void;\n onWalletReady?: (status: WalletReadyStatus) => void;\n}\n\ninterface LumiaPassportContextType {\n config: LumiaPassportConfig;\n updateConfig: (updates: Partial<LumiaPassportConfig>) => void;\n callbacks?: LumiaPassportCallbacks;\n}\n\nconst LumiaPassportContext = createContext<LumiaPassportContextType | undefined>(undefined);\n\nexport interface LumiaPassportProviderProps {\n children: React.ReactNode;\n projectId?: string;\n initialConfig?: Partial<LumiaPassportConfig>;\n callbacks?: LumiaPassportCallbacks;\n}\n\nexport const LumiaPassportProvider: React.FC<LumiaPassportProviderProps> = ({\n children,\n projectId,\n initialConfig = {},\n callbacks,\n}) => {\n const [config, setConfig] = useState<LumiaPassportConfig>(() => {\n const merged = { ...defaultLumiaPassportConfig };\n\n // Set projectId if provided\n if (projectId) {\n merged.projectId = projectId;\n } else if (initialConfig.projectId) {\n merged.projectId = initialConfig.projectId;\n }\n\n // Log warning if projectId is not set\n if (!merged.projectId) {\n console.error(\n '\\n' +\n '╔══════════════════════════════════════════════════════════════════════════╗\\n' +\n '║ ⚠️ LUMIA PASSPORT WARNING ⚠️ ║\\n' +\n '╠══════════════════════════════════════════════════════════════════════════╣\\n' +\n '║ ║\\n' +\n '║ projectId is NOT configured! ║\\n' +\n '║ ║\\n' +\n '║ Your integration will NOT work without a valid projectId. ║\\n' +\n '║ Most features will be disabled and errors will occur. ║\\n' +\n '║ ║\\n' +\n '║ To fix this: ║\\n' +\n '║ 1. Get your projectId from: https://dashboard.lumiapassport.com/ ║\\n' +\n '║ 2. Add it to your LumiaPassportProvider: ║\\n' +\n '║ ║\\n' +\n '║ <LumiaPassportProvider projectId=\"your-project-id\"> ║\\n' +\n '║ {children} ║\\n' +\n '║ </LumiaPassportProvider> ║\\n' +\n '║ ║\\n' +\n '╚══════════════════════════════════════════════════════════════════════════╝\\n'\n );\n } else {\n console.log('[LumiaPassport] ✅ Initialized with projectId:', merged.projectId);\n }\n\n if (initialConfig.passkey) merged.passkey = { ...merged.passkey, ...initialConfig.passkey };\n if (initialConfig.email) merged.email = { ...merged.email, ...initialConfig.email };\n if (initialConfig.social) {\n merged.social = { ...merged.social, ...initialConfig.social };\n if (initialConfig.social.providers) merged.social.providers = initialConfig.social.providers;\n }\n if (initialConfig.development)\n merged.development = { ...merged.development, ...initialConfig.development };\n if (initialConfig.ui) {\n merged.ui = { ...merged.ui, ...initialConfig.ui };\n if (initialConfig.ui.branding)\n merged.ui.branding = { ...merged.ui.branding, ...initialConfig.ui.branding };\n if (initialConfig.ui.modal) merged.ui.modal = { ...merged.ui.modal, ...initialConfig.ui.modal };\n }\n if (initialConfig.network) merged.network = { ...merged.network, ...initialConfig.network };\n if (initialConfig.services) merged.services = { ...merged.services, ...initialConfig.services };\n if (initialConfig.features) merged.features = { ...merged.features, ...initialConfig.features };\n if (initialConfig.warnings) merged.warnings = { ...merged.warnings, ...initialConfig.warnings };\n\n // Load saved theme from localStorage if available\n try {\n if (typeof window !== 'undefined' && window.localStorage) {\n const savedTheme = localStorage.getItem('lumia-passport-theme');\n if (savedTheme && (savedTheme === 'light' || savedTheme === 'dark' || savedTheme === 'auto')) {\n merged.ui.theme = savedTheme as 'light' | 'dark' | 'auto';\n }\n }\n } catch {}\n\n // Make services override available immediately for non-React modules\n // Set the merged services config in window.__LUMIA_SERVICES__ before calling getServiceUrls()\n try {\n if (typeof window !== 'undefined') {\n // First set the merged services from initialConfig\n window.__LUMIA_SERVICES__ = merged.services;\n // Store projectId globally for HttpClient\n (window as any).__LUMIA_PROJECT_ID__ = merged.projectId;\n console.log('[LumiaPassportProvider] Setting window.__LUMIA_SERVICES__:', merged.services);\n // Now getServiceUrls() will use the correct config\n const resolvedServices = getServiceUrls();\n console.log('[LumiaPassportProvider] Resolved services:', resolvedServices);\n }\n } catch {}\n\n // Initialize SDK error tracking (automatic, no user configuration needed)\n try {\n initSdkErrorTracking();\n } catch (error) {\n // Silently fail - don't break app if error tracking fails\n if (process.env.NODE_ENV === 'development') {\n console.warn('[LumiaPassport] Failed to initialize SDK error tracking:', error);\n }\n }\n\n return merged;\n });\n\n const updateConfig = useCallback((updates: Partial<LumiaPassportConfig>) => {\n setConfig(prev => {\n const next = { ...prev };\n if (updates.projectId !== undefined) next.projectId = updates.projectId;\n if (updates.passkey) next.passkey = { ...next.passkey, ...updates.passkey };\n if (updates.email) next.email = { ...next.email, ...updates.email };\n if (updates.social) {\n next.social = { ...next.social, ...updates.social };\n if (updates.social.providers) next.social.providers = updates.social.providers;\n }\n if (updates.development) next.development = { ...next.development, ...updates.development };\n if (updates.ui) {\n next.ui = { ...next.ui, ...updates.ui };\n if (updates.ui.branding) next.ui.branding = { ...next.ui.branding, ...updates.ui.branding };\n if (updates.ui.modal) next.ui.modal = { ...next.ui.modal, ...updates.ui.modal };\n\n // Save theme to localStorage when it changes\n if (updates.ui.theme) {\n try {\n if (typeof window !== 'undefined' && window.localStorage) {\n localStorage.setItem('lumia-passport-theme', updates.ui.theme);\n }\n } catch {}\n }\n }\n if (updates.network) next.network = { ...next.network, ...updates.network };\n if (updates.services) next.services = { ...next.services, ...updates.services };\n if (updates.features) next.features = { ...next.features, ...updates.features };\n if (updates.warnings) next.warnings = { ...next.warnings, ...updates.warnings };\n\n // Update global services when services config changes\n if (updates.services && typeof window !== 'undefined') {\n try {\n window.__LUMIA_SERVICES__ = next.services;\n console.log('[LumiaPassportProvider] Updated window.__LUMIA_SERVICES__:', next.services);\n } catch {}\n }\n\n // Update global projectId when it changes\n if (updates.projectId !== undefined && typeof window !== 'undefined') {\n try {\n (window as any).__LUMIA_PROJECT_ID__ = next.projectId;\n console.log('[LumiaPassportProvider] Updated __LUMIA_PROJECT_ID__:', next.projectId);\n } catch {}\n }\n\n return next;\n });\n }, []);\n\n // Initialize iframe manager for secure MPC operations\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const projectId = config.projectId;\n if (!projectId) {\n // Silent skip - main warning is shown during provider initialization\n return;\n }\n\n const iframeUrl = getIframeUrl();\n\n console.log('[LumiaPassport] Initializing secure iframe wallet:', {\n iframeUrl,\n projectId: `${projectId.substring(0, 10)}...`,\n note: 'All MPC operations will happen in isolated iframe context',\n });\n\n try {\n // Determine current theme\n const isDark = config.ui.theme === 'dark' ||\n (config.ui.theme === 'auto' && window.matchMedia?.('(prefers-color-scheme: dark)').matches);\n\n // Get theme colors\n const themeColors = isDark ? config.ui.colors?.dark : config.ui.colors?.light;\n\n const iframeManager = getIframeManager({\n iframeUrl,\n projectId,\n debug: config.features?.mpcSecurity ?? true,\n onWalletReady: callbacks?.onWalletReady,\n themeColors,\n });\n\n // Initialize iframe asynchronously\n iframeManager.initialize().then(() => {\n console.log('[LumiaPassport] ✅ Secure iframe wallet initialized successfully');\n }).catch((error) => {\n console.error('[LumiaPassport] ❌ Failed to initialize iframe wallet:', error);\n });\n\n // Cleanup on unmount\n return () => {\n console.log('[LumiaPassport] Cleaning up iframe manager...');\n destroyIframeManager();\n };\n } catch (error) {\n console.error('[LumiaPassport] Error setting up iframe manager:', error);\n }\n }, [config.projectId, config.features?.mpcSecurity]);\n\n return (\n <LumiaWagmiProvider>\n <LumiaPassportContext.Provider value={{ config, updateConfig, callbacks }}>\n {children}\n </LumiaPassportContext.Provider>\n </LumiaWagmiProvider>\n );\n};\n\nexport const useLumiaPassportConfig = () => {\n const ctx = useContext(LumiaPassportContext);\n if (!ctx) throw new Error('useLumiaPassportConfig must be used within a LumiaPassportProvider');\n return ctx;\n};\n","import { useMemo, useState, useEffect } from 'react';\n\nexport type Theme = 'light' | 'dark' | 'auto';\n\nexport interface ThemeColors {\n background?: string;\n text?: string;\n textSecondary?: string;\n textMuted?: string;\n border?: string;\n buttonBackground?: string;\n buttonBackgroundEnd?: string;\n buttonText?: string;\n buttonBackgroundHover?: string;\n buttonBackgroundHoverEnd?: string;\n connectedButtonBackground?: string;\n connectedButtonBorder?: string;\n}\n\nexport interface CustomColors {\n light?: ThemeColors;\n dark?: ThemeColors;\n}\n\nexport function useTheme(configTheme: Theme, customColors?: CustomColors) {\n const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>('light');\n\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const updateSystemTheme = () => setSystemTheme(mediaQuery.matches ? 'dark' : 'light');\n updateSystemTheme();\n mediaQuery.addEventListener('change', updateSystemTheme);\n return () => mediaQuery.removeEventListener('change', updateSystemTheme);\n }, []);\n\n const resolvedTheme = useMemo(() => (configTheme === 'auto' ? systemTheme : configTheme), [configTheme, systemTheme]);\n const isDark = resolvedTheme === 'dark';\n\n // Do not mutate document.body classes to avoid leaking theme into host app\n // Theme is applied via scoped classes on Lumia components only\n\n // Get custom colors for current theme\n const currentCustomColors = useMemo(() => {\n return isDark ? customColors?.dark : customColors?.light;\n }, [isDark, customColors]);\n\n // Apply custom colors as CSS variables if provided\n useEffect(() => {\n if (typeof document === 'undefined') return;\n\n const root = document.documentElement;\n\n if (currentCustomColors?.background) {\n root.style.setProperty('--lumia-bg', currentCustomColors.background);\n } else {\n root.style.removeProperty('--lumia-bg');\n }\n\n if (currentCustomColors?.text) {\n root.style.setProperty('--lumia-text', currentCustomColors.text);\n } else {\n root.style.removeProperty('--lumia-text');\n }\n\n if (currentCustomColors?.textSecondary) {\n root.style.setProperty('--lumia-text-secondary', currentCustomColors.textSecondary);\n } else {\n root.style.removeProperty('--lumia-text-secondary');\n }\n\n if (currentCustomColors?.textMuted) {\n root.style.setProperty('--lumia-text-muted', currentCustomColors.textMuted);\n } else {\n root.style.removeProperty('--lumia-text-muted');\n }\n\n if (currentCustomColors?.border) {\n root.style.setProperty('--lumia-border', currentCustomColors.border);\n } else {\n root.style.removeProperty('--lumia-border');\n }\n\n if (currentCustomColors?.buttonBackground) {\n root.style.setProperty('--lumia-button-bg', currentCustomColors.buttonBackground);\n } else {\n root.style.removeProperty('--lumia-button-bg');\n }\n\n if (currentCustomColors?.buttonBackgroundEnd) {\n root.style.setProperty('--lumia-button-bg-end', currentCustomColors.buttonBackgroundEnd);\n } else {\n root.style.removeProperty('--lumia-button-bg-end');\n }\n\n if (currentCustomColors?.buttonText) {\n root.style.setProperty('--lumia-button-text', currentCustomColors.buttonText);\n } else {\n root.style.removeProperty('--lumia-button-text');\n }\n\n if (currentCustomColors?.buttonBackgroundHover) {\n root.style.setProperty('--lumia-button-bg-hover', currentCustomColors.buttonBackgroundHover);\n } else {\n root.style.removeProperty('--lumia-button-bg-hover');\n }\n\n if (currentCustomColors?.buttonBackgroundHoverEnd) {\n root.style.setProperty('--lumia-button-bg-hover-end', currentCustomColors.buttonBackgroundHoverEnd);\n } else {\n root.style.removeProperty('--lumia-button-bg-hover-end');\n }\n\n if (currentCustomColors?.connectedButtonBackground) {\n root.style.setProperty('--lumia-connected-button-bg', currentCustomColors.connectedButtonBackground);\n } else {\n root.style.removeProperty('--lumia-connected-button-bg');\n }\n\n if (currentCustomColors?.connectedButtonBorder) {\n root.style.setProperty('--lumia-connected-button-border', currentCustomColors.connectedButtonBorder);\n } else {\n root.style.removeProperty('--lumia-connected-button-border');\n }\n }, [currentCustomColors]);\n\n const themeClasses = useMemo(\n () => {\n // Check if custom colors are provided\n const hasCustom = !!currentCustomColors;\n\n // Use CSS variables when custom colors are set, otherwise use Tailwind classes\n const background = hasCustom && currentCustomColors?.background\n ? '[background:var(--lumia-bg)]'\n : (isDark ? 'bg-gray-900' : 'bg-white');\n\n const text = hasCustom && currentCustomColors?.text\n ? '[color:var(--lumia-text)]'\n : (isDark ? 'text-white' : 'text-gray-900');\n\n const textSecondary = hasCustom && currentCustomColors?.textSecondary\n ? '[color:var(--lumia-text-secondary)]'\n : (isDark ? 'text-gray-300' : 'text-gray-600');\n\n const textMuted = hasCustom && currentCustomColors?.textMuted\n ? '[color:var(--lumia-text-muted)]'\n : (isDark ? 'text-gray-400' : 'text-gray-500');\n\n const border = hasCustom && currentCustomColors?.border\n ? '[border-color:var(--lumia-border)]'\n : (isDark ? 'border-gray-600' : 'border-gray-200');\n\n return {\n bg: background, // Alias for modalBg for backwards compatibility\n modalBg: background,\n titleText: text,\n text: text, // Alias for titleText\n bodyText: textSecondary,\n mutedText: textMuted,\n linkText: isDark ? 'text-gray-200 hover:text-blue-400' : 'text-gray-700 hover:text-blue-600',\n inputBg: isDark ? 'bg-gray-700 border-gray-600' : 'bg-white border-gray-300',\n inputText: isDark ? 'text-white placeholder:text-gray-400' : 'text-gray-900 placeholder:text-gray-400',\n // Primary CTA (Passkey sign-in) — brighter blue + hover\n primaryBtn: isDark\n ? 'bg-[#2456f0] hover:bg-[#1e49d8] text-white'\n : 'bg-[#2456f0] hover:bg-[#1e49d8] text-white',\n // Neutral secondary to avoid unintended pink accents\n secondaryBtn: isDark\n ? 'bg-gray-700 hover:bg-gray-600 text-white'\n : 'bg-gray-100 hover:bg-gray-200 text-gray-700',\n // Pink CTA used for email Continue like in old design\n ctaBtn: isDark\n ? 'bg-[#db2777] hover:bg-[#be185d] text-white'\n : 'bg-[#fde2f3] hover:bg-[#f7c1df] text-gray-600',\n // Outline buttons (Create Passkey) — subtle hover\n outlineBtn: isDark\n ? 'bg-gray-700 border-gray-600 hover:bg-gray-600 text-gray-200'\n : 'bg-white border-gray-200 hover:bg-gray-100 text-gray-700',\n actionBtn: isDark ? 'bg-gray-700 hover:bg-gray-600 text-gray-200' : 'bg-gray-100 hover:bg-gray-200 text-gray-900',\n divider: border,\n errorText: isDark ? 'text-red-400' : 'text-red-500',\n successText: isDark ? 'text-green-400' : 'text-blue-600',\n iconColor: textMuted,\n // CSS variable-based classes for better theming\n cssVars: {\n modalBg: 'lumia-bg-primary',\n text: 'lumia-text-primary',\n textSecondary: 'lumia-text-secondary',\n textMuted: 'lumia-text-muted',\n bgSecondary: 'lumia-bg-secondary',\n border: 'lumia-border-primary',\n }\n };\n },\n [isDark, currentCustomColors]\n );\n\n return { theme: resolvedTheme, isDark, classes: themeClasses };\n}\n","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n","import * as React from 'react';\n\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { X, ArrowLeft } from 'lucide-react';\n\nimport { cn } from '../../lib/utils';\n\nconst Dialog = DialogPrimitive.Root;\nconst DialogTrigger = DialogPrimitive.Trigger;\nconst DialogPortal = DialogPrimitive.Portal;\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n // Softer backdrop to match design and avoid host overrides\n 'fixed inset-0 z-[2147483646] bg-black/50 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\ntype DialogContentProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & { hideClose?: boolean };\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n DialogContentProps\n>(({ className, children, hideClose, ...props }, ref) => (\n <DialogPortal>\n {/* Scope utilities for BOTH overlay and content by wrapping them */}\n <div className=\"lumia-scope\">\n <DialogOverlay />\n <div className=\"fixed inset-0 z-[2147483647] flex items-center justify-center pointer-events-none\">\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n // Remove default rounded corners; consumers can fully control radius\n 'relative pointer-events-auto grid w-full max-w-lg gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n className\n )}\n {...props}\n >\n {/* Default hidden description to satisfy a11y if consumer omits it */}\n <DialogPrimitive.Description className=\"sr-only\">\n Lumia Passport dialog\n </DialogPrimitive.Description>\n {children}\n {!hideClose && (\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm bg-transparent text-gray-400 dark:text-gray-500 transition-all hover:text-gray-600 dark:hover:text-gray-300 focus:outline-none focus:ring-2 focus:ring-gray-300 dark:focus:ring-gray-600 focus:ring-offset-2 disabled:pointer-events-none\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </div>\n </div>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogTopBar: React.FC<{ onBack?: () => void; className?: string; showClose?: boolean }> = ({ onBack, className, showClose = false }) => (\n <div className={cn('flex items-center justify-between px-4 pt-4', className)}>\n <button\n onClick={onBack}\n disabled={!onBack}\n aria-label=\"Back\"\n className={`rounded-md p-1 ${onBack ? 'text-gray-400 hover:text-gray-600' : 'opacity-0 pointer-events-none'}`}\n >\n <ArrowLeft className=\"w-4 h-4\" />\n </button>\n {showClose && (\n <DialogPrimitive.Close aria-label=\"Close\" className=\"rounded-md p-1 text-gray-500 hover:text-gray-700 focus:outline-none\">\n <X className=\"w-4 h-4\" />\n </DialogPrimitive.Close>\n )}\n </div>\n);\n\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col space-y-1.5 text-center sm:text-left', className)} {...props} />\n);\nDialogHeader.displayName = 'DialogHeader';\n\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className)}\n {...props}\n />\n);\nDialogFooter.displayName = 'DialogFooter';\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title ref={ref} className={cn('text-lg font-semibold leading-none tracking-tight', className)} {...props} />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogTopBar,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n","import * as React from 'react';\n\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '../../lib/utils';\n\nconst buttonVariants = cva(\n 'lumia-btn inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-xl text-sm font-medium font-sans ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n {\n variants: {\n variant: {\n plain: '',\n default: 'bg-blue-600 text-white hover:bg-blue-700',\n destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\n outline: 'border border-gray-200 bg-white hover:bg-gray-100 text-gray-700',\n secondary: 'bg-gray-600 text-white hover:bg-gray-500 dark:bg-gray-700 dark:hover:bg-gray-600',\n ghost: 'hover:bg-gray-100 hover:text-gray-800',\n link: 'bg-transparent !bg-transparent text-blue-600 hover:text-blue-700 underline-offset-4 hover:underline',\n telegram: 'bg-[#0088cc] text-white hover:bg-[#0077bb]',\n success: 'bg-green-600 text-white hover:bg-green-700 dark:bg-green-700 dark:hover:bg-green-600',\n },\n size: {\n default: 'h-10 px-4 py-2',\n sm: 'h-9 rounded-xl px-3',\n lg: 'h-11 rounded-xl px-8',\n icon: 'h-10 w-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n return (\n <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />\n );\n }\n);\nButton.displayName = 'Button';\n\nexport { Button, buttonVariants };\n","import * as React from 'react';\nimport * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';\nimport { buttonVariants } from '../ui/button';\nimport { cn } from '../../lib/utils';\n\nconst AlertDialog = AlertDialogPrimitive.Root;\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger;\nconst AlertDialogPortal = AlertDialogPrimitive.Portal;\n\nconst AlertDialogOverlay = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Overlay\n className={cn(\n 'fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className\n )}\n {...props}\n ref={ref}\n />\n));\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;\n\nconst AlertDialogContent = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg',\n className\n )}\n {...props}\n />\n </AlertDialogPortal>\n));\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;\n\nconst AlertDialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col space-y-2 text-center sm:text-left', className)} {...props} />\n);\nAlertDialogHeader.displayName = 'AlertDialogHeader';\n\nconst AlertDialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className)} {...props} />\n);\nAlertDialogFooter.displayName = 'AlertDialogFooter';\n\nconst AlertDialogTitle = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Title ref={ref} className={cn('text-lg font-semibold', className)} {...props} />\n));\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;\n\nconst AlertDialogDescription = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Description ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n));\nAlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName;\n\nconst AlertDialogAction = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Action>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Action ref={ref} className={cn(buttonVariants(), className)} {...props} />\n));\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;\n\nconst AlertDialogCancel = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Cancel>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Cancel ref={ref} className={cn(buttonVariants({ variant: 'outline' }), 'mt-2 sm:mt-0', className)} {...props} />\n));\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;\n\nexport {\n AlertDialog,\n AlertDialogPortal,\n AlertDialogOverlay,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n};\n","import React from 'react';\nimport { AlertTriangle } from 'lucide-react';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from './ui/alert-dialog';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\n\ninterface ErrorAlertProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: string;\n message: string;\n actionText?: string;\n}\n\nexport const ErrorAlert: React.FC<ErrorAlertProps> = ({\n open,\n onOpenChange,\n title,\n message,\n actionText = 'OK',\n}) => {\n const { config } = useLumiaPassportConfig();\n const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n return (\n <AlertDialog open={open} onOpenChange={onOpenChange}>\n <AlertDialogContent className={`lumia-scope max-w-md ${theme.modalBg} ${isDark ? 'lumia-dark' : 'lumia-light'}`}>\n <AlertDialogHeader>\n <div className=\"flex items-center gap-3 mb-2\">\n <div className={`w-10 h-10 rounded-full flex items-center justify-center ${isDark ? 'bg-red-900/30' : 'bg-red-100'}`}>\n <AlertTriangle className={`w-5 h-5 ${isDark ? 'text-red-400' : 'text-red-600'}`} />\n </div>\n <AlertDialogTitle className={`text-left ${isDark ? 'text-red-300' : 'text-red-900'}`}>{title}</AlertDialogTitle>\n </div>\n <AlertDialogDescription className={`text-left whitespace-pre-line ${isDark ? 'text-gray-300' : 'text-gray-700'}`}>\n {message}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogAction onClick={() => onOpenChange(false)}>{actionText}</AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n};\n\nexport const useErrorAlert = () => {\n const [alertState, setAlertState] = React.useState<{\n open: boolean;\n title: string;\n message: string;\n actionText?: string;\n }>({ open: false, title: '', message: '' });\n\n const showError = React.useCallback((title: string, message: string, actionText?: string) => {\n setAlertState({ open: true, title, message, actionText });\n }, []);\n\n const hideError = React.useCallback(() => {\n setAlertState(prev => ({ ...prev, open: false }));\n }, []);\n\n const ErrorAlertComponent = React.useCallback(\n () => (\n <ErrorAlert\n open={alertState.open}\n onOpenChange={hideError}\n title={alertState.title}\n message={alertState.message}\n actionText={alertState.actionText}\n />\n ),\n [alertState, hideError]\n );\n\n return { showError, hideError, ErrorAlert: ErrorAlertComponent };\n};\n","import React from 'react';\n\ninterface LumiaLogoProps {\n size?: number;\n className?: string;\n}\n\nexport const LumiaLogo = ({ size = 25, className = '' }: LumiaLogoProps) => {\n return (\n <div\n className={`flex items-center justify-center ${className}`}\n style={{ width: size, height: size }}\n aria-label=\"Lumia Logo\"\n >\n <svg viewBox=\"0 0 512 512\" width={size} height={size}>\n <circle cx=\"256\" cy=\"256\" r=\"256\" fill=\"#060117\" strokeWidth=\"0\"/>\n <path d=\"M264.13948,48.01032l63.62778,132.2788,133.95322,68.65102h-147.34854s-48.55804-10.04649-50.23246-56.93012,0-143.99971,0-143.99971Z\" fill=\"#fefdff\" strokeWidth=\"0\"/>\n <path d=\"M50.27932,245.59045l132.27894-63.62734L251.20943,48.01032l-.00012,147.34824s-10.04654,48.55792-56.93019,50.23222c-46.88366,1.6743-143.9998-.00033-143.9998-.00033Z\" fill=\"#fefdff\" strokeWidth=\"0\"/>\n <path d=\"M247.86056,463.98968l-63.62772-132.27875-133.95315-68.65092,147.34848-.00011s48.55802,10.04646,50.23242,56.93008c1.6744,46.88362-.00004,143.9997-.00004,143.9997Z\" fill=\"#fefdff\" strokeWidth=\"0\"/>\n <path d=\"M461.72068,266.40941l-132.2789,63.62744-68.65118,133.95283.00016-147.34823s10.04655-48.55792,56.93018-50.23226c46.88364-1.67434,143.99974.00023,143.99974.00023Z\" fill=\"#fefdff\" strokeWidth=\"0\"/>\n </svg>\n </div>\n );\n};\n","import React from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\n\ninterface FailedScreenProps {\n message?: string;\n}\n\nexport const FailedScreen: React.FC<FailedScreenProps> = ({ message = 'Failed' }) => {\n const { config } = useLumiaPassportConfig();\n const { classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n\n return (\n <div className=\"text-center\">\n <div className=\"w-16 h-16 rounded-full bg-red-100 text-red-600 flex items-center justify-center mx-auto mb-4 text-3xl\">\n ✗\n </div>\n <div className={`text-lg font-medium ${theme.titleText} mb-2`}>Failed</div>\n {message && (\n <div className={`text-sm ${theme.bodyText}`}>{message}</div>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { Dialog, DialogContent, DialogTitle } from './ui/dialog';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\n\nexport const TermsOfService: React.FC<{ open: boolean; onOpenChange: (v: boolean) => void }>\n = ({ open, onOpenChange }) => {\n const { config } = useLumiaPassportConfig();\n const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className={`lumia-scope p-6 border-0 ${theme.modalBg} ${isDark ? 'lumia-dark' : 'lumia-light'}`}\n style={{\n borderRadius: config.ui.modal?.borderRadius || '24px',\n maxWidth: config.ui.modal?.width || '400px',\n ['--lumia-font-base' as any]: config.ui.fonts?.base,\n ['--lumia-font-heading' as any]: config.ui.fonts?.heading,\n fontFamily: (config.ui.fonts?.base as any) || 'system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif',\n }}\n >\n <DialogTitle>Terms of Service</DialogTitle>\n <div className=\"prose text-sm text-gray-700\">\n <p>By using Lumia Passport you agree to our terms.</p>\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n","import * as React from 'react';\n\nimport { cn } from '../../lib/utils';\n\nconst Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('rounded-xl border bg-card text-card-foreground shadow', className)} {...props} />\n )\n);\nCard.displayName = 'Card';\n\nconst CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('flex flex-col space-y-1.5 p-6', className)} {...props} />\n )\n);\nCardHeader.displayName = 'CardHeader';\n\nconst CardTitle = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLHeadingElement>>(\n ({ className, ...props }, ref) => (\n <h3 ref={ref} className={cn('text-2xl font-semibold leading-none tracking-tight', className)} {...props} />\n )\n);\nCardTitle.displayName = 'CardTitle';\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(\n ({ className, ...props }, ref) => (\n <p ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n )\n);\nCardDescription.displayName = 'CardDescription';\n\nconst CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('p-6 pt-0', className)} {...props} />\n )\n);\nCardContent.displayName = 'CardContent';\n\nexport { Card, CardHeader, CardTitle, CardDescription, CardContent };\n","import * as React from 'react';\n\nimport { cn } from '../../lib/utils';\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n 'flex h-12 w-full rounded-xl border px-3 py-2 text-sm file:border-0 file:bg-transparent file:text-sm file:font-medium focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n ref={ref}\n {...props}\n />\n );\n});\nInput.displayName = 'Input';\n\nexport { Input };\n","import * as React from 'react';\nimport { Shield, Server, Upload, CheckCircle2, AlertCircle, Key, X, Eye, EyeOff } from 'lucide-react';\nimport { Button } from './ui/button';\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from './ui/card';\nimport { Input } from './ui/input';\nimport { getShareRecoveryStats } from '../vaultClient';\nimport { getIframeManager } from '../lib/iframe-manager';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\n\ninterface KeyshareRestoreProps {\n userId: string;\n onClose?: () => void;\n onRestoreSuccess?: () => void;\n}\n\nexport default function KeyshareRestore({ userId, onClose, onRestoreSuccess }: KeyshareRestoreProps) {\n const { config } = useLumiaPassportConfig();\n const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n const [loading, setLoading] = React.useState<Record<'server' | 'file', boolean>>({ server: false, file: false });\n const [error, setError] = React.useState<string | null>(null);\n const [success, setSuccess] = React.useState<string | null>(null);\n const [showPassword, setShowPassword] = React.useState(false);\n const [useCustomPassword, setUseCustomPassword] = React.useState(false);\n const [restoreFile, setRestoreFile] = React.useState<File | null>(null);\n const [restorePassword, setRestorePassword] = React.useState('');\n const [hasServerBackup, setHasServerBackup] = React.useState<boolean | null>(null);\n const [checkingBackup, setCheckingBackup] = React.useState(true);\n\n // Get iframe manager\n const iframeManager = React.useMemo(() => {\n try {\n return getIframeManager();\n } catch (e) {\n console.error('[KeyshareRestore] Failed to get iframe manager:', e);\n return null;\n }\n }, []);\n\n // Check if backup exists on mount\n React.useEffect(() => {\n const checkBackupAvailability = async () => {\n try {\n setCheckingBackup(true);\n const stats = await getShareRecoveryStats();\n\n // Check if we have any recovery data\n const hasRecoveryData = stats && (stats.created || (stats.devices && stats.devices.length > 0));\n setHasServerBackup(!!hasRecoveryData);\n\n if (!hasRecoveryData) {\n setError('No backup found in the Vault');\n }\n } catch (err) {\n console.warn('[KeyshareRestore] Failed to check backup availability:', err);\n setHasServerBackup(false);\n setError('Failed to check backup availability');\n } finally {\n setCheckingBackup(false);\n }\n };\n\n checkBackupAvailability();\n }, [userId]);\n\n const handleRestoreFromServer = async () => {\n console.log('[KeyshareRestore] Starting server restore for userId:', userId);\n\n if (!iframeManager) {\n setError('Iframe manager not initialized');\n return;\n }\n\n setLoading(prev => ({ ...prev, server: true }));\n setError(null);\n setSuccess(null);\n\n try {\n const passwordToUse = useCustomPassword ? restorePassword : undefined;\n console.log('[KeyshareRestore] Calling iframeManager.restoreFromServer with method:', useCustomPassword ? 'password' : 'passkey');\n\n // Get JWT access token for authentication\n const jwt = await import('../auth').then(m => m.jwtTokenManager.getTokens());\n const accessToken = jwt?.accessToken;\n\n const result = await iframeManager.restoreFromServer(userId, passwordToUse, accessToken);\n\n if (result.success) {\n console.log('[KeyshareRestore] Server restore successful');\n setSuccess('Successfully restored keyshare from server backup');\n setTimeout(() => { onRestoreSuccess?.(); }, 100);\n } else {\n console.error('[KeyshareRestore] Server restore failed:', result.error);\n setError(result.error || 'Server restore failed');\n }\n } catch (err) {\n console.error('[KeyshareRestore] Server restore exception:', err);\n const errorMsg = err instanceof Error ? err.message : 'Server restore failed';\n setError(errorMsg);\n } finally {\n console.log('[KeyshareRestore] Server restore finished');\n setLoading(prev => ({ ...prev, server: false }));\n }\n };\n\n const handleRestoreFromFile = async () => {\n if (!restoreFile) { setError('Please select a backup file'); return; }\n if (useCustomPassword && !restorePassword) { setError('Please enter the backup password'); return; }\n\n if (!iframeManager) {\n setError('Iframe manager not initialized');\n return;\n }\n\n setLoading(prev => ({ ...prev, file: true }));\n setError(null);\n setSuccess(null);\n\n try {\n // Read file content\n const fileContent = await restoreFile.text();\n const passwordToUse = useCustomPassword ? restorePassword : undefined;\n\n const result = await iframeManager.restoreFromLocalFile(userId, fileContent, passwordToUse);\n\n if (result.success) {\n setSuccess('Successfully restored keyshare from backup file');\n setRestoreFile(null);\n setRestorePassword('');\n setTimeout(() => { onRestoreSuccess?.(); }, 100);\n } else {\n setError(result.error || 'File restore failed');\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'Restore failed';\n setError(errorMsg);\n } finally {\n setLoading(prev => ({ ...prev, file: false }));\n }\n };\n\n // Show loading state while checking backup\n if (checkingBackup) {\n return (\n <Card className={`${isDark ? 'border-gray-700 bg-gray-900' : 'border-blue-200 bg-blue-50'} border-0`}>\n <CardHeader className=\"pb-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Shield className={`h-6 w-6 ${isDark ? 'text-blue-400' : 'text-blue-600'}`} />\n <div>\n <CardTitle className={`text-lg ${isDark ? 'text-gray-100' : ''}`}>Checking Backup Availability</CardTitle>\n <CardDescription className={`text-sm ${isDark ? 'text-gray-400' : ''}`}>Please wait while we check for available backups...</CardDescription>\n </div>\n </div>\n {onClose && (\n <button onClick={onClose} className={`p-1 rounded transition-colors ${isDark ? 'bg-transparent text-gray-400 hover:text-gray-200' : 'bg-red-100 text-red-600 hover:bg-red-200'}`} title=\"Close\" aria-label=\"Close\">\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n <div className=\"flex items-center justify-center p-8\">\n <div className=\"text-center\">\n <div className={`animate-spin rounded-full h-8 w-8 border-b-2 ${isDark ? 'border-blue-400' : 'border-blue-600'} mx-auto mb-4`}></div>\n <p className={`text-sm ${isDark ? 'text-gray-400' : 'text-gray-600'}`}>Checking for backups...</p>\n </div>\n </div>\n </CardContent>\n </Card>\n );\n }\n\n // Show warning if no backup found\n if (hasServerBackup === false) {\n return (\n <Card className={`border-0 ${theme.bg} ${theme.divider}`}>\n <CardHeader className=\"pb-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <AlertCircle className=\"h-5 w-5 text-red-600\" />\n <CardTitle className={`text-base ${theme.titleText}`}>No Keyshare Found</CardTitle>\n </div>\n {onClose && (\n <button onClick={onClose} className={`p-1 rounded transition-colors ${theme.secondaryBtn}`} title=\"Close\" aria-label=\"Close\">\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n {/* <CardDescription className={`text-sm mt-1 ${theme.bodyText}`}>No keyshare was found for this account.</CardDescription> */}\n </CardHeader>\n <CardContent className=\"space-y-3.5\">\n <div className={`p-3 rounded ${isDark ? 'bg-red-500/15' : 'bg-red-100'}`}>\n <h4 className={`font-medium text-sm mb-1.5 ${isDark ? 'text-red-300' : 'text-red-800'}`}>Account Recovery Needed</h4>\n <p className={`text-xs leading-relaxed ${theme.text}`}>\n This device doesn't have access to your wallet keyshare, and no backup was found in the Vault.\n To access your wallet: use the original device where you created the account,\n create a backup from that device first, then try restoring on this device.\n </p>\n </div>\n\n <div className={`p-2.5 rounded border ${isDark ? 'bg-amber-500/15 border-amber-500/40' : 'bg-amber-50 border-amber-200'}`}>\n <p className={`text-xs ${theme.text}`}>\n <span className=\"font-semibold\">Alternative:</span> Try uploading a backup file if you have one saved locally, or create a new account with a different email.\n </p>\n </div>\n\n {/* Still allow file restore as fallback */}\n <div className={`p-3 rounded border ${theme.bg} ${theme.divider}`}>\n <div className=\"flex items-center gap-2 mb-2\">\n <Upload className=\"h-4 w-4 text-purple-600\" />\n <div className={`font-medium text-sm ${theme.text}`}>Try Backup File</div>\n </div>\n <div className=\"space-y-2\">\n <label className={`block w-full cursor-pointer ${theme.text}`}>\n <input\n type=\"file\"\n accept=\".json\"\n onChange={e => setRestoreFile(e.target.files?.[0] || null)}\n className=\"block w-full text-xs file:mr-3 file:py-1.5 file:px-3 file:rounded file:border-0 file:text-xs file:font-medium file:bg-purple-600 file:text-white hover:file:bg-purple-700 file:cursor-pointer\"\n />\n </label>\n {!restoreFile && (\n <p className={`text-xs ${theme.mutedText}`}>No file chosen</p>\n )}\n {restoreFile && (\n <>\n <div className={`text-xs p-2 rounded ${theme.inputBg} ${theme.text}`}>Selected: {restoreFile.name}</div>\n <Button onClick={handleRestoreFromFile} disabled={loading.file || (useCustomPassword && !restorePassword)} className=\"w-full py-2 text-sm\">\n {loading.file ? 'Restoring...' : useCustomPassword ? 'Restore' : 'Restore with Passkey'}\n </Button>\n </>\n )}\n </div>\n </div>\n\n {/* Decryption method for file restore */}\n {restoreFile && (\n <div className=\"space-y-2\">\n <div className={`text-xs font-medium ${theme.text}`}>Decryption Method:</div>\n <div className=\"flex items-center gap-2\">\n <input type=\"checkbox\" id=\"use-restore-password\" checked={useCustomPassword} onChange={e => setUseCustomPassword(e.target.checked)} className=\"rounded\" />\n <label htmlFor=\"use-restore-password\" className={`text-xs ${theme.text}`}>Use custom password instead of passkey</label>\n </div>\n {!useCustomPassword && (\n <div className={`p-2 border rounded text-xs ${theme.inputBg} ${theme.text}`}>\n <div className=\"flex items-center gap-2\"><Key className=\"h-3.5 w-3.5\" /><span>Your passkey will be used to decrypt the backup securely</span></div>\n </div>\n )}\n {useCustomPassword && (\n <div className=\"relative\">\n <Input\n type={showPassword ? 'text' : 'password'}\n placeholder=\"Enter backup decryption password\"\n value={restorePassword}\n onChange={e => setRestorePassword(e.target.value)}\n className={`pr-10 text-sm bg-transparent ${isDark ? 'text-gray-100 placeholder:text-gray-400 border-gray-600 focus-visible:ring-offset-0' : 'text-gray-900 placeholder:text-gray-500 border-gray-300'}`}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className={`absolute inset-y-0 right-2 flex items-center justify-center p-0 rounded ${isDark ? 'bg-transparent text-gray-400 hover:text-gray-200' : 'bg-transparent text-gray-500 hover:text-gray-700'}`}\n >\n {showPassword ? <EyeOff className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\n </button>\n </div>\n )}\n </div>\n )}\n\n {error && (\n <div className={`flex items-center gap-2 p-2 rounded border text-xs ${theme.errorText} ${isDark ? 'bg-red-500/15 border-red-500/40' : 'bg-red-50 border-red-200'}`}>\n <AlertCircle className=\"h-3.5 w-3.5 flex-shrink-0\" />\n <span>{error}</span>\n </div>\n )}\n {success && (\n <div className={`flex items-center gap-2 p-2 rounded border text-xs ${theme.successText} ${isDark ? 'bg-green-500/15 border-green-500/40' : 'bg-green-50 border-green-200'}`}>\n <CheckCircle2 className=\"h-3.5 w-3.5 flex-shrink-0\" />\n <span>{success}</span>\n </div>\n )}\n </CardContent>\n </Card>\n );\n }\n\n return (\n <Card className={`${isDark ? 'border-gray-700 bg-gray-900' : 'border-blue-200 bg-blue-50'} border-0`}>\n <CardHeader className=\"pb-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Shield className=\"h-5 w-5 text-blue-600\" />\n <CardTitle className={`text-base ${isDark ? 'text-gray-100' : 'text-gray-900'}`}>Restore Account Access</CardTitle>\n </div>\n {onClose && (\n <button\n onClick={onClose}\n className={`p-1 rounded transition-colors ${isDark ? 'bg-transparent text-gray-400 hover:text-gray-200' : 'bg-red-100 text-red-600 hover:bg-red-200'}`}\n title=\"Close\"\n aria-label=\"Close\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n <CardDescription className={`text-sm mt-1 ${isDark ? 'text-gray-300' : 'text-gray-600'}`}>\n Your account was found in the Vault\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3.5\">\n {error && !error.includes('No backup found') && (\n <div className=\"flex items-center gap-2 p-2 rounded bg-red-50 border border-red-200 text-red-700 text-xs\">\n <AlertCircle className=\"h-3.5 w-3.5 flex-shrink-0\" />\n <span>{error}</span>\n </div>\n )}\n {success && (\n <div className=\"flex items-center gap-2 p-2 rounded bg-green-50 border border-green-200 text-green-700 text-xs\">\n <CheckCircle2 className=\"h-3.5 w-3.5 flex-shrink-0\" />\n <span>{success}</span>\n </div>\n )}\n\n {/* Decryption Method */}\n <div className=\"space-y-2\">\n <div className={`text-xs font-medium ${isDark ? 'text-gray-300' : 'text-gray-700'}`}>Decryption Method:</div>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n id=\"use-restore-password\"\n checked={useCustomPassword}\n onChange={e => setUseCustomPassword(e.target.checked)}\n className=\"rounded\"\n />\n <label htmlFor=\"use-restore-password\" className={`text-xs ${isDark ? 'text-gray-300' : 'text-gray-700'}`}>\n Use custom password instead of passkey\n </label>\n </div>\n\n {!useCustomPassword && (\n <div className={isDark ? 'p-2 rounded bg-blue-500/10 border border-blue-500/30' : 'p-2 rounded bg-blue-50 border border-blue-200'}>\n <div className=\"flex items-center gap-2\">\n <Key className=\"h-3.5 w-3.5 text-blue-500\" />\n <p className={`text-xs ${isDark ? 'text-gray-300' : 'text-blue-700'}`}>\n Passkey will be used to decrypt the backup\n </p>\n </div>\n </div>\n )}\n\n {useCustomPassword && (\n <div className=\"relative\">\n <Input\n type={showPassword ? 'text' : 'password'}\n placeholder=\"Enter backup password\"\n value={restorePassword}\n onChange={e => setRestorePassword(e.target.value)}\n className={`pr-10 text-sm bg-transparent ${isDark ? 'text-gray-100 placeholder:text-gray-400 border-gray-600 focus-visible:ring-offset-0' : 'text-gray-900 placeholder:text-gray-500 border-gray-300'}`}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className={`absolute inset-y-0 right-2 flex items-center justify-center p-0 rounded ${isDark ? 'bg-transparent text-gray-400 hover:text-gray-200' : 'bg-transparent text-gray-500 hover:text-gray-700'}`}\n aria-label=\"Toggle password visibility\"\n >\n {showPassword ? <EyeOff className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\n </button>\n </div>\n )}\n </div>\n\n {/* Restore Methods */}\n <div className=\"space-y-2.5\">\n <div className={`text-xs font-medium ${isDark ? 'text-gray-300' : 'text-gray-700'}`}>Choose Restore Method:</div>\n\n {/* Server Backup */}\n <div className={isDark ? 'p-3 rounded bg-gray-800/50' : 'p-3 rounded bg-blue-50/50'}>\n <div className=\"flex items-center gap-2 mb-2\">\n <Server className=\"h-4 w-4 text-blue-500\" />\n <div className={`text-sm font-medium ${isDark ? 'text-gray-200' : 'text-gray-900'}`}>Server Backup</div>\n </div>\n <Button\n onClick={handleRestoreFromServer}\n disabled={loading.server || (useCustomPassword && !restorePassword)}\n className=\"w-full py-2 text-sm\"\n >\n {loading.server ? 'Restoring...' : useCustomPassword ? 'Restore with Password' : 'Restore with Passkey'}\n </Button>\n </div>\n\n {/* Backup File */}\n <div className={isDark ? 'p-3 rounded bg-gray-800/50' : 'p-3 rounded bg-purple-50/50'}>\n <div className=\"flex items-center gap-2 mb-2\">\n <Upload className=\"h-4 w-4 text-purple-500\" />\n <div className={`text-sm font-medium ${isDark ? 'text-gray-200' : 'text-gray-900'}`}>Backup File</div>\n </div>\n <div className=\"space-y-2\">\n <label className={`block w-full cursor-pointer ${isDark ? 'text-gray-300' : 'text-gray-700'}`}>\n <input\n type=\"file\"\n accept=\".json\"\n onChange={e => setRestoreFile(e.target.files?.[0] || null)}\n className={isDark\n ? \"block w-full text-xs file:mr-3 file:py-1.5 file:px-3 file:rounded file:border-0 file:text-xs file:font-medium file:bg-purple-600 file:text-white hover:file:bg-purple-700 file:cursor-pointer\"\n : \"block w-full text-xs file:mr-3 file:py-1.5 file:px-3 file:rounded file:border-0 file:text-xs file:font-medium file:bg-purple-600 file:text-white hover:file:bg-purple-700 file:cursor-pointer\"\n }\n />\n </label>\n {restoreFile && (\n <>\n <div className={`text-xs p-2 rounded ${isDark ? 'bg-gray-700 text-gray-300' : 'bg-gray-100 text-gray-600'}`}>\n {restoreFile.name}\n </div>\n <Button\n onClick={handleRestoreFromFile}\n disabled={loading.file || (useCustomPassword && !restorePassword)}\n className=\"w-full py-2 text-sm\"\n >\n {loading.file ? 'Restoring...' : 'Restore'}\n </Button>\n </>\n )}\n </div>\n </div>\n </div>\n\n {/* Help Text */}\n {!useCustomPassword && false && (\n <div className={isDark ? 'p-2 rounded bg-amber-500/10 border border-amber-500/30' : 'p-2 rounded bg-amber-50 border border-amber-200'}>\n <p className={`text-xs ${isDark ? 'text-gray-300' : 'text-amber-800'}`}>\n <span className=\"font-medium\">Note:</span> If you have multiple passkeys, the system will request the specific one used to create this backup.\n </p>\n </div>\n )}\n </CardContent>\n </Card>\n );\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\n\nexport const VerificationCodeInput: React.FC<{\n onVerifyCode: (code: string) => Promise<void> | void;\n onResendCode: () => Promise<void> | void;\n isLoading: boolean;\n expiresIn: number;\n error?: string;\n}> = ({ onVerifyCode, onResendCode, isLoading, expiresIn, error }) => {\n const { config } = useLumiaPassportConfig();\n const { classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n\n const [timeLeft, setTimeLeft] = useState(expiresIn);\n useEffect(() => { setTimeLeft(expiresIn); }, [expiresIn]);\n useEffect(() => {\n const t = setInterval(() => setTimeLeft(v => (v > 0 ? v - 1 : 0)), 1000);\n return () => clearInterval(t);\n }, []);\n\n const [digits, setDigits] = useState<string[]>(['', '', '', '', '', '']);\n const inputsRef = useRef<Array<HTMLInputElement | null>>([]);\n const lastSubmittedRef = useRef<string | null>(null);\n\n const code = useMemo(() => digits.join(''), [digits]);\n useEffect(() => {\n if (code.length === 6 && digits.every(d => d !== '') && !isLoading) {\n if (lastSubmittedRef.current !== code) {\n lastSubmittedRef.current = code;\n onVerifyCode(code);\n }\n }\n }, [code, digits, isLoading, onVerifyCode]);\n\n // Autofocus the first input on mount\n useEffect(() => {\n const t = setTimeout(() => {\n inputsRef.current[0]?.focus();\n }, 0);\n return () => clearTimeout(t);\n }, []);\n\n const handleChange = (index: number, value: string) => {\n const v = value.replace(/\\D/g, '').slice(-1);\n setDigits(prev => {\n const next = [...prev];\n next[index] = v;\n return next;\n });\n if (!v) {\n // If user cleared a digit, allow re-submission later for same code\n lastSubmittedRef.current = null;\n }\n if (v && inputsRef.current[index + 1]) inputsRef.current[index + 1]?.focus();\n };\n\n const handleKeyDown = (index: number, e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace') {\n if (digits[index]) {\n setDigits(prev => { const n = [...prev]; n[index] = ''; return n; });\n } else if (inputsRef.current[index - 1]) {\n inputsRef.current[index - 1]?.focus();\n setDigits(prev => { const n = [...prev]; n[index - 1] = ''; return n; });\n }\n }\n if (e.key === 'ArrowLeft' && inputsRef.current[index - 1]) inputsRef.current[index - 1]?.focus();\n if (e.key === 'ArrowRight' && inputsRef.current[index + 1]) inputsRef.current[index + 1]?.focus();\n };\n\n const handlePaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n const text = (e.clipboardData.getData('text') || '').replace(/\\D/g, '').slice(0, 6);\n if (text.length) {\n e.preventDefault();\n const arr = new Array(6).fill('').map((_, i) => text[i] || '');\n setDigits(arr);\n lastSubmittedRef.current = null;\n const lastIndex = Math.min(text.length, 6) - 1;\n if (inputsRef.current[lastIndex]) inputsRef.current[lastIndex]?.focus();\n }\n };\n\n const mm = Math.floor(timeLeft / 60).toString();\n const ss = (timeLeft % 60).toString().padStart(2, '0');\n\n return (\n <div className=\"text-center\">\n <div className={`flex items-center justify-center gap-2 mb-4`}>\n {digits.map((d, i) => (\n <input\n key={i}\n ref={el => (inputsRef.current[i] = el)}\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n maxLength={1}\n value={d}\n onChange={e => handleChange(i, e.target.value)}\n onKeyDown={e => handleKeyDown(i, e)}\n onPaste={handlePaste}\n className={`w-12 h-12 text-lg text-center font-semibold rounded-xl border ${theme.inputBg} ${theme.inputText} focus:outline-none focus:ring-2 focus:ring-blue-500`}\n />\n ))}\n </div>\n\n {error && <div className={`text-sm ${theme.errorText} mb-3 break-words whitespace-pre-wrap text-center`}>{error}</div>}\n <div className={`text-sm ${theme.mutedText} mb-3`}>Code expires in {mm}:{ss}</div>\n\n <div className={`text-sm ${theme.mutedText}`}>\n Didn't receive code?{' '}\n <button\n onClick={() => (timeLeft === 0 ? onResendCode() : undefined)}\n disabled={timeLeft > 0 || isLoading}\n className={`${timeLeft > 0 ? 'opacity-40 cursor-not-allowed' : `${theme.linkText} underline`} font-medium`}\n >\n Resend\n </button>\n </div>\n </div>\n );\n};\n","import { tssClient } from './httpClient';\n\n/**\n * Provider information in user profile\n * Matches the structure returned by backend /api/auth/profile\n */\nexport interface ProviderDetail {\n id: string; // Composite ID: \"provider:externalId\"\n provider: string; // Provider type: 'email', 'telegram', 'passkey', etc.\n verified: boolean; // Whether the provider is verified\n linkedAt: string; // ISO timestamp when provider was linked\n lastUsedAt: string; // ISO timestamp of last authentication\n externalId: string; // Provider-specific ID (email address, telegram ID, credential ID, etc.)\n meta?: Record<string, any>; // Provider-specific metadata (email, rpId, etc.)\n}\n\n/**\n * User profile information\n */\nexport interface UserProfile {\n userId: string;\n displayName?: string;\n avatar?: string;\n providers: ProviderDetail[];\n createdAt: string;\n updatedAt: string;\n hasKeyshare: boolean;\n}\n\nexport interface UpdateProfileRequest {\n displayName?: string;\n}\n\n/**\n * Get user profile with detailed provider information\n *\n * Backend /api/auth/profile now returns complete provider details including:\n * - Provider type and identifier\n * - Verification status\n * - Linked and last used timestamps\n * - Provider-specific metadata\n */\nexport async function getUserProfile(): Promise<UserProfile> {\n const response = await tssClient.get<UserProfile>('/api/auth/profile', true);\n\n if (!response.success || !response.data) {\n const error = response.error || 'Failed to fetch user profile';\n throw new Error(error);\n }\n\n return response.data;\n}\n\n/**\n * Update user profile\n */\nexport async function updateUserProfile(updates: UpdateProfileRequest): Promise<UserProfile> {\n const response = await tssClient.patch<UserProfile>('/api/auth/profile', updates, true);\n\n if (!response.success || !response.data) {\n const error = response.error || 'Failed to update user profile';\n throw new Error(error);\n }\n\n return response.data;\n}\n","import React, { useState } from 'react';\nimport { User } from 'lucide-react';\nimport { Button } from './ui/button';\nimport { Input } from './ui/input';\nimport { LumiaLogo } from './LumiaLogo';\nimport { useTheme } from '../hooks/useTheme';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { updateUserProfile } from '../clients/profile';\nimport { jwtTokenManager } from '../auth';\n\ninterface DisplayNameInputProps {\n onComplete: () => void;\n onSkip?: () => void;\n}\n\nexport const DisplayNameInput: React.FC<DisplayNameInputProps> = ({ onComplete, onSkip }) => {\n const [displayName, setDisplayName] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState('');\n\n const { config } = useLumiaPassportConfig();\n const { classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!displayName.trim()) {\n setError('Please enter your name');\n return;\n }\n\n if (displayName.length > 100) {\n setError('Name is too long (max 100 characters)');\n return;\n }\n\n setIsLoading(true);\n setError('');\n\n try {\n await updateUserProfile({ displayName: displayName.trim() });\n\n // Update JWT token with new display name\n jwtTokenManager.updateDisplayName(displayName.trim());\n\n onComplete();\n } catch (err: any) {\n console.error('[DisplayNameInput] Failed to update display name:', err);\n setError(err.message || 'Failed to update your name. Please try again.');\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleSkip = () => {\n if (onSkip) {\n onSkip();\n } else {\n onComplete();\n }\n };\n\n return (\n <div>\n <div className=\"flex justify-center mb-4\">\n <div className=\"w-10 h-10 bg-gradient-to-br from-purple-100 to-blue-100 rounded-full flex items-center justify-center\">\n <LumiaLogo size={28} />\n </div>\n </div>\n\n <h2 className={`text-2xl font-bold font-sans ${theme.titleText} mb-2`}>\n What's your name?\n </h2>\n\n <p className={`text-sm ${theme.bodyText} mb-6`}>\n This helps personalize your experience\n </p>\n\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div className=\"relative\">\n <User className={`absolute left-3 top-3 h-5 w-5 ${theme.iconColor}`} />\n <Input\n type=\"text\"\n placeholder=\"Enter your name\"\n value={displayName}\n onChange={(e) => {\n setDisplayName(e.target.value);\n setError('');\n }}\n className={`pl-11 h-12 ${theme.inputBg} ${theme.inputText} rounded-xl border`}\n disabled={isLoading}\n maxLength={100}\n autoFocus\n />\n </div>\n\n {error && (\n <div className={`text-sm ${theme.errorText} text-center`}>\n {error}\n </div>\n )}\n\n <Button\n type=\"submit\"\n variant=\"plain\"\n disabled={!displayName.trim() || isLoading}\n className={`w-full h-14 ${theme.ctaBtn} rounded-2xl font-semibold`}\n >\n {isLoading ? 'Saving...' : 'Continue'}\n </Button>\n\n {onSkip && (\n <div className=\"text-center mt-4\">\n <button\n type=\"button\"\n onClick={handleSkip}\n disabled={isLoading}\n className={`text-sm ${theme.mutedText} hover:${theme.linkText} transition-colors disabled:opacity-50 underline hover:no-underline bg-transparent border-0 p-0 cursor-pointer`}\n >\n Skip for now\n </button>\n </div>\n )}\n </form>\n </div>\n );\n};\n","import React, { useState } from 'react';\n\nimport { Mail, Users, Fingerprint, KeyRound, ArrowLeft } from 'lucide-react';\n\n// Temporary storage for login response before consent approval\n// This will be moved to localStorage only after user approves consent\nlet _pendingLoginResponse: any = null;\nexport function getPendingLoginResponse() { return _pendingLoginResponse; }\nexport function clearPendingLoginResponse() { _pendingLoginResponse = null; }\n\nimport {\n registerPasskey,\n authenticateWithPasskey,\n createPasskeyHelpers,\n resetWebAuthnFlags,\n hasAvailablePasskeys,\n jwtTokenManager,\n type TelegramAuthResult,\n initTelegramWidget,\n hideTelegramWidget,\n loginWithTelegram,\n} from '../auth';\nimport { useErrorAlert } from './ErrorAlert';\nimport { LumiaLogo } from './LumiaLogo';\nimport { FailedScreen } from './FailedScreen';\nimport { TermsOfService } from './TermsOfService';\nimport { Button } from './ui/button';\nimport KeyshareRestore from './KeyshareRestore';\nimport { Dialog, DialogContent, DialogTitle, DialogTopBar } from './ui/dialog';\nimport { Input } from './ui/input';\nimport { VerificationCodeInput } from './VerificationCodeInput';\nimport { DisplayNameInput } from './DisplayNameInput';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\nimport { GoogleIcon, TelegramIcon, TwitterIcon, DiscordIcon } from '../../config/lumiaPassport';\nimport { getServiceUrls } from '../../config/lumiaPassport';\nimport { addProjectIdToUrl } from '../utils/projectId';\nimport { getUserProfile } from '../clients/profile';\n\ninterface AuthModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onAuthSuccess?: () => void;\n autoCloseOnSuccess?: boolean;\n recoveryUserId?: string | null;\n onRecoveryClose?: () => void;\n onRecoverySuccess?: () => void;\n callbacks?: import('../../context/LumiaPassportContext').LumiaPassportCallbacks;\n}\n\nexport const AuthModal = ({ open, onOpenChange, onAuthSuccess, autoCloseOnSuccess = true, recoveryUserId, onRecoveryClose, onRecoverySuccess, callbacks }: AuthModalProps) => {\n\n const [email, setEmail] = useState('');\n const [step, setStep] = useState<'signin' | 'verify' | 'telegram' | 'display-name' | 'failed'>('signin');\n const { showError, ErrorAlert } = useErrorAlert();\n const [isLoading, setIsLoading] = useState(false);\n const [iframeVisible, setIframeVisible] = useState(false);\n const [failedMessage, setFailedMessage] = useState<string>('');\n const [expiresIn, setExpiresIn] = useState(300);\n const [verificationError, setVerificationError] = useState<string>('');\n const [sendError, setSendError] = useState<string>('');\n\n // Passkey state\n const [passkeyStatus, setPasskeyStatus] = useState<string>('idle');\n const [passkeyError, setPasskeyError] = useState<string>('');\n\n // Telegram state\n const [telegramCleanup, setTelegramCleanup] = useState<(() => void) | null>(null);\n const [showTelegramWidget, setShowTelegramWidget] = useState<boolean>(false);\n\n // Terms of Service state\n const [showTerms, setShowTerms] = useState<boolean>(false);\n\n // Passkey helpers\n const passkeyHelpers = React.useMemo(() => {\n return createPasskeyHelpers('');\n }, []);\n\n // Get LumiaPassport configuration from context\n const { config } = useLumiaPassportConfig();\n\n // Get theme classes based on configuration\n const { classes: theme, isDark } = useTheme(config.ui.theme, config.ui.colors);\n\n // Reset state when modal is closed\n React.useEffect(() => {\n if (!open) {\n setStep('signin');\n setEmail('');\n setVerificationError('');\n setSendError('');\n setPasskeyError('');\n setPasskeyStatus('idle');\n setFailedMessage('');\n }\n }, [open]);\n\n // Listen for iframe show/hide events to hide AuthModal when consent screen is shown\n React.useEffect(() => {\n const handleIframeMessage = (event: MessageEvent) => {\n if (event.data?.type === 'LUMIA_PASSPORT_SHOW_IFRAME') {\n setIframeVisible(true);\n } else if (event.data?.type === 'LUMIA_PASSPORT_HIDE_IFRAME') {\n setIframeVisible(false);\n }\n };\n\n window.addEventListener('message', handleIframeMessage);\n return () => window.removeEventListener('message', handleIframeMessage);\n }, []);\n\n // Helper function to check if display name is needed\n // Takes optional loginResponse to avoid making API call before tokens are saved\n const checkDisplayNameRequired = React.useCallback(async (loginResponse?: any): Promise<boolean> => {\n // Check if feature is enabled\n if (!config.features.displayNameNeeded) {\n return false;\n }\n\n // If we have loginResponse, check displayName from it (no API call needed)\n if (loginResponse) {\n if (loginResponse.displayName && loginResponse.displayName.trim()) {\n return false;\n }\n return true;\n }\n\n // Otherwise, fetch profile (only when tokens are already saved)\n try {\n const profile = await getUserProfile();\n\n // If displayName is already set, no need to ask again\n if (profile.displayName && profile.displayName.trim()) {\n return false;\n }\n\n return true;\n } catch (error: any) {\n // If it's a 404 (profile doesn't exist yet) or 401/403 (auth issue),\n // still show the display name form for new users\n if (error?.message?.includes('404') || error?.message?.includes('401') || error?.message?.includes('403')) {\n return true;\n }\n\n // For other errors, don't block the user\n return false;\n }\n }, [config.features.displayNameNeeded]);\n\n // Helpers: soften WebAuthn cancellation/timeout errors\n function normalizeWebAuthnError(err: any): { benignCancel: boolean; message: string } {\n const raw = (err?.message || String(err || '')) as string;\n const lower = raw.toLowerCase();\n // Typical cancellation/timeouts:\n // - DOMException: NotAllowedError\n // - \"The operation either timed out or was not allowed\"\n // - user gesture / abort\n const isBenign =\n (err && (err.name === 'NotAllowedError' || err.name === 'AbortError')) ||\n lower.includes('notallowederror') ||\n lower.includes('timed out') ||\n lower.includes('was not allowed') ||\n lower.includes('user cancelled') ||\n lower.includes('operation cancelled') ||\n lower.includes('aborterror');\n\n if (isBenign) return { benignCancel: true, message: '' };\n\n // Friendly mapping for a few known cases\n if (lower.includes('unknown or unsupported algorithm')) {\n return { benignCancel: false, message: 'This device cannot create a passkey with the requested algorithm.' };\n }\n return { benignCancel: false, message: raw };\n }\n\n const sendVerificationCode = async () => {\n if (!email) return;\n\n setIsLoading(true);\n setSendError('');\n\n try {\n const response = await fetch(addProjectIdToUrl(`${getServiceUrls().tssUrl}/api/auth/email/send-code`), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n email,\n purpose: 'login',\n }),\n });\n\n const data = await response.json();\n\n if (response.ok) {\n setExpiresIn(data.expiresIn || 300);\n setStep('verify');\n } else {\n // Handle different error types\n if (response.status === 429) {\n const retryAfter = data.retryAfter || 60;\n setSendError(\n `Code already sent recently. Please wait ${retryAfter} seconds before requesting another.`\n );\n } else if (response.status === 400) {\n setSendError(data.message || 'Invalid email address');\n } else {\n setSendError(data.message || 'Failed to send verification code');\n }\n }\n } catch (error) {\n const errorMessage = 'Network error. Please check your connection.';\n setSendError(errorMessage);\n\n // Trigger onLumiaPassportError callback\n try {\n callbacks?.onLumiaPassportError?.({\n error: error instanceof Error ? error : new Error(errorMessage),\n message: errorMessage\n });\n } catch {}\n } finally {\n setIsLoading(false);\n }\n };\n\n const verifyCode = async (code: string) => {\n if (isLoading) return;\n setIsLoading(true);\n setVerificationError('');\n\n try {\n // Use the official loginWithEmail function but skip token saving until consent approval\n const { loginWithEmail } = await import('../auth');\n\n const loginResponse = await loginWithEmail(email, code, { skipTokenSave: true });\n\n // Store login response temporarily - tokens will be saved in ConnectWalletButton after consent approval\n _pendingLoginResponse = loginResponse;\n\n // Check for critical server keyshare loss scenario\n if (!loginResponse.hasKeyshare && !loginResponse.isNewUser) {\n // CRITICAL: Existing user with lost server keyshare\n showError(\n 'CRITICAL ERROR',\n 'Your account data has been lost on the server.\\nThis should never happen and indicates a serious system failure.\\n\\nUnfortunately, your wallet cannot be recovered.\\nYou will need to create a new account.\\n\\nPlease contact support immediately with this error.'\n );\n\n // Reset to signin to prevent further actions\n setStep('signin');\n _pendingLoginResponse = null;\n return;\n }\n\n // Check if user needs recovery (has server keyshare but no local keyshare)\n const storage = typeof window !== 'undefined' ? window.localStorage : undefined;\n const localKeyshare = storage?.getItem(`tss.${loginResponse.userId}.keyshare`);\n const needsRecovery = loginResponse.hasKeyshare && !loginResponse.isNewUser && !localKeyshare;\n\n // Check if display name is required BEFORE starting DKG\n // Pass loginResponse to avoid API call before tokens are saved\n const displayNameRequired = await checkDisplayNameRequired(loginResponse);\n if (displayNameRequired) {\n // Temporarily save tokens so DisplayNameInput can call updateUserProfile\n // Tokens will be cleared on Cancel or kept after consent approval\n await jwtTokenManager.setTokens(loginResponse);\n setStep('display-name');\n return;\n }\n\n // Trigger session creation and DKG for new users - WAIT for completion\n try {\n if (onAuthSuccess) {\n console.log('[AuthModal] Calling onAuthSuccess...');\n await onAuthSuccess();\n console.log('[AuthModal] onAuthSuccess completed successfully');\n }\n } catch (authError: any) {\n console.log('[AuthModal] onAuthSuccess failed:', authError?.message);\n // Handle authorization errors (e.g., user clicked Cancel in consent modal)\n if (authError?.message?.includes('User denied authorization')) {\n console.log('[AuthModal] Setting failed state');\n setFailedMessage('Authorization cancelled');\n setStep('failed');\n return;\n }\n // Re-throw other errors to be handled by outer catch\n throw authError;\n }\n\n console.log('[AuthModal] Authentication successful, closing modal');\n\n // Close modal immediately after success (unless recovery is needed)\n if (autoCloseOnSuccess && !needsRecovery) {\n // Reset state first, then close modal\n setStep('signin');\n setEmail('');\n setVerificationError('');\n onOpenChange(false);\n }\n } catch (error: any) {\n\n // Handle specific error messages from loginWithEmail\n let errorMessage = '';\n if (error.message?.includes('Invalid') || error.message?.includes('invalid')) {\n errorMessage = 'Invalid verification code. Please try again.';\n } else if (error.message?.includes('expired')) {\n errorMessage = 'Verification code expired. Please request a new one.';\n } else if (error.message?.includes('429') || error.message?.includes('Too many')) {\n errorMessage = 'Too many attempts. Please try again later.';\n } else {\n errorMessage = error.message || 'Verification failed. Please try again.';\n }\n setVerificationError(errorMessage);\n\n // Trigger onLumiaPassportError callback\n try {\n callbacks?.onLumiaPassportError?.({\n error: error instanceof Error ? error : new Error(errorMessage),\n message: errorMessage\n });\n } catch {}\n } finally {\n setIsLoading(false);\n }\n };\n\n const resendCode = async () => {\n if (isLoading) return;\n setVerificationError('');\n setIsLoading(true);\n\n try {\n const response = await fetch(addProjectIdToUrl(`${getServiceUrls().tssUrl}/api/auth/email/send-code`), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n email,\n purpose: 'login',\n }),\n });\n\n const data = await response.json();\n\n if (response.ok) {\n setExpiresIn(data.expiresIn || 300);\n // The timer will reset automatically in VerificationCodeInput component\n } else {\n if (response.status === 429) {\n const retryAfter = data.retryAfter || 60;\n setVerificationError(\n `Code already sent recently. Please wait ${retryAfter} seconds before requesting another.`\n );\n } else {\n setVerificationError(data.message || 'Failed to resend verification code');\n }\n }\n } catch (error) {\n setVerificationError('Network error. Please check your connection.');\n } finally {\n setIsLoading(false);\n }\n };\n\n const goBackToSignIn = () => {\n setStep('signin');\n setVerificationError('');\n setSendError('');\n // Clean up telegram widget if going back\n if (telegramCleanup) {\n telegramCleanup();\n setTelegramCleanup(null);\n }\n };\n\n // Passkey registration\n const handlePasskeyRegister = React.useCallback(async () => {\n setPasskeyError('');\n setPasskeyStatus('registering passkey...');\n setIsLoading(true);\n\n try {\n // Auto-generate user ID for passkey registration\n const autoUserId = `user_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n const { credential, loginResponse } = await registerPasskey(autoUserId, step => {\n setPasskeyStatus(step);\n }, { skipTokenSave: true });\n\n // Store login response temporarily - tokens will be saved in ConnectWalletButton after consent approval\n _pendingLoginResponse = loginResponse;\n\n // Check if this is a new user who needs DKG setup\n if (loginResponse.isNewUser) {\n // Check if display name is required BEFORE starting DKG\n // Pass loginResponse to avoid API call before tokens are saved\n const displayNameRequired = await checkDisplayNameRequired(loginResponse);\n if (displayNameRequired) {\n // Temporarily save tokens so DisplayNameInput can call updateUserProfile\n // Tokens will be cleared on Cancel or kept after consent approval\n await jwtTokenManager.setTokens(loginResponse);\n setStep('display-name');\n return;\n }\n\n // Call onAuthSuccess to trigger real authentication and DKG\n if (onAuthSuccess) {\n await onAuthSuccess();\n }\n\n // Reset state first, then close modal\n setStep('signin');\n setEmail('');\n setVerificationError('');\n setPasskeyError('');\n setPasskeyStatus('idle');\n onOpenChange(false);\n } else {\n // Existing user - just show success\n setPasskeyStatus('Passkey registered successfully!');\n setTimeout(() => {\n setPasskeyStatus('idle');\n }, 2000);\n }\n } catch (e: any) {\n const normalized = normalizeWebAuthnError(e);\n const errorMessage = normalized.message || '';\n\n // Handle specific credential duplication errors with alerts\n if (errorMessage.includes('CREDENTIAL_EXISTS')) {\n showError(\n 'Passkey Already Registered',\n 'This passkey is already registered to another account. Please use a different passkey or sign in to the existing account.'\n );\n } else if (errorMessage.includes('CREDENTIAL_DUPLICATE')) {\n showError(\n 'Passkey Already Registered',\n 'This passkey is already registered for your account. No need to register again!'\n );\n } else if (!normalized.benignCancel) {\n setPasskeyError(errorMessage);\n }\n\n // Trigger onLumiaPassportError callback for non-benign errors\n if (!normalized.benignCancel) {\n try {\n callbacks?.onLumiaPassportError?.({\n error: e instanceof Error ? e : new Error(errorMessage),\n message: errorMessage\n });\n } catch {}\n }\n\n setPasskeyStatus('idle');\n } finally {\n setIsLoading(false);\n }\n }, [onAuthSuccess, onOpenChange, callbacks]);\n\n // Passkey authentication\n const handlePasskeyAuth = React.useCallback(async () => {\n setPasskeyError('');\n setPasskeyStatus('checking available passkeys...');\n setIsLoading(true);\n\n try {\n // Clear any existing JWT session when switching to passkey authentication\n jwtTokenManager.clearTokens();\n\n // Try to authenticate with existing passkey\n setPasskeyStatus('authenticating with passkey...');\n\n // Use passkey without specifying user ID, skip token saving until consent approval\n const result = await authenticateWithPasskey(undefined, step => {\n setPasskeyStatus(step);\n }, { skipTokenSave: true });\n\n // Store login response temporarily - tokens will be saved in ConnectWalletButton after consent approval\n _pendingLoginResponse = result.loginResponse;\n\n const hasKeyshare = result.loginResponse.hasKeyshare ?? false;\n\n // Check for critical server keyshare loss scenario\n if (!hasKeyshare && result.loginResponse.isNewUser === false) {\n // CRITICAL: Existing user with lost server keyshare\n showError(\n 'CRITICAL ERROR',\n 'Your account data has been lost on the server.\\nThis should never happen and indicates a serious system failure.\\n\\nUnfortunately, your wallet cannot be recovered.\\nYou will need to create a new account.\\n\\nPlease contact support immediately with this error.'\n );\n\n // Reset to signin to prevent further actions\n setStep('signin');\n setPasskeyError('Critical server error - contact support');\n setPasskeyStatus('idle');\n return;\n }\n\n // Check if display name is required BEFORE starting DKG\n // Pass loginResponse to avoid API call before tokens are saved\n const displayNameRequired = await checkDisplayNameRequired(result.loginResponse);\n if (displayNameRequired) {\n // Temporarily save tokens so DisplayNameInput can call updateUserProfile\n // Tokens will be cleared on Cancel or kept after consent approval\n await jwtTokenManager.setTokens(result.loginResponse);\n setStep('display-name');\n return;\n }\n\n // Call onAuthSuccess to trigger real authentication - WAIT for completion\n try {\n if (onAuthSuccess) {\n await onAuthSuccess();\n }\n } catch (authError: any) {\n // Handle authorization errors (e.g., user clicked Cancel in consent modal)\n if (authError?.message?.includes('User denied authorization')) {\n setFailedMessage('Authorization cancelled');\n setStep('failed');\n setPasskeyStatus('idle');\n return;\n }\n // Re-throw other errors to be handled by outer catch\n throw authError;\n }\n\n // Close modal immediately after success\n if (autoCloseOnSuccess) {\n // Reset state first, then close modal\n setStep('signin');\n setEmail('');\n setVerificationError('');\n setPasskeyError('');\n setPasskeyStatus('idle');\n onOpenChange(false);\n }\n } catch (e: any) {\n const normalized = normalizeWebAuthnError(e);\n const errorMessage = normalized.message || 'Authentication failed';\n if (!normalized.benignCancel) {\n setPasskeyError(errorMessage);\n\n // Trigger onLumiaPassportError callback for non-benign errors\n try {\n callbacks?.onLumiaPassportError?.({\n error: e instanceof Error ? e : new Error(errorMessage),\n message: errorMessage\n });\n } catch {}\n }\n setPasskeyStatus('idle');\n console.error('[AuthModal] Passkey authentication failed:', e);\n } finally {\n setIsLoading(false);\n }\n }, [onAuthSuccess, onOpenChange, callbacks]);\n\n // Telegram authentication\n const handleTelegramAuth = React.useCallback(async () => {\n const telegramProvider = config?.social?.providers?.find(p => (p.id || '').toLowerCase() === 'telegram' && p.enabled);\n const telegramBot = (telegramProvider as any)?.meta?.botUsername as string | undefined;\n if (!telegramBot) {\n showError('Configuration Error', 'Telegram bot not configured. Please set botUsername in social.providers meta.');\n return;\n }\n\n setStep('telegram');\n }, [config?.social?.providers, onAuthSuccess, onOpenChange, callbacks]);\n\n // Coming soon handler\n const handleComingSoon = (providerName: string) => {\n showError('Coming Soon', `${providerName} authentication is coming soon!`);\n };\n\n // Initialize Telegram widget when step becomes 'telegram' (exact copy from AuthSection)\n React.useEffect(() => {\n if (step !== 'telegram') return;\n\n const telegramProvider = config?.social?.providers?.find(p => (p.id || '').toLowerCase() === 'telegram' && p.enabled);\n const bot = (telegramProvider as any)?.meta?.botUsername as string | undefined;\n if (!bot) {\n return;\n }\n\n const cleanup = initTelegramWidget(\n bot,\n async (result: TelegramAuthResult) => {\n try {\n // Clear any existing JWT session before Telegram authentication\n jwtTokenManager.clearTokens();\n\n // Call TSS server API to authenticate with Telegram\n // Skip token saving until consent approval\n const loginResponse = await loginWithTelegram({\n id: result.user.id as number,\n first_name: (result.user as any).first_name || '',\n last_name: (result.user as any).last_name || undefined,\n username: (result.user as any).username || undefined,\n photo_url: (result.user as any).photo_url || undefined,\n auth_date: Number((result.user as any).auth_date) || Math.floor(Date.now() / 1000),\n hash: (result.user as any).hash || '',\n } as any, { skipTokenSave: true });\n\n // Store login response temporarily - tokens will be saved in ConnectWalletButton after consent approval\n _pendingLoginResponse = loginResponse;\n\n // Check for critical server keyshare loss scenario\n if (!loginResponse.hasKeyshare && !loginResponse.isNewUser) {\n // CRITICAL: Existing user with lost server keyshare\n showError(\n 'CRITICAL ERROR',\n 'Your account data has been lost on the server.\\nThis should never happen and indicates a serious system failure.\\n\\nUnfortunately, your wallet cannot be recovered.\\nYou will need to create a new account.\\n\\nPlease contact support immediately with this error.'\n );\n\n // Reset to signin to prevent further actions\n setStep('signin');\n _pendingLoginResponse = null;\n return;\n }\n\n // Check if display name is required BEFORE starting DKG\n // Pass loginResponse to avoid API call before tokens are saved\n try {\n const displayNameRequired = await checkDisplayNameRequired(loginResponse);\n if (displayNameRequired) {\n // Temporarily save tokens so DisplayNameInput can call updateUserProfile\n // Tokens will be cleared on Cancel or kept after consent approval\n await jwtTokenManager.setTokens(loginResponse);\n setStep('display-name');\n return;\n }\n\n // Call onAuthSuccess to trigger real authentication - wait for completion\n if (onAuthSuccess) {\n await onAuthSuccess();\n }\n\n // Reset state first, then close modal\n setStep('signin');\n setEmail('');\n setVerificationError('');\n setPasskeyError('');\n setPasskeyStatus('idle');\n onOpenChange(false);\n } catch (sessionError) {\n // Show appropriate error message based on error type\n let errorMessage = 'Account setup failed. Please try again.';\n\n if ((sessionError as any)?.code === 'NO_BACKUP_AVAILABLE') {\n errorMessage = 'Account recovery impossible - no backups found. Session cleared.';\n } else if ((sessionError as any)?.code === 'BACKUP_SERVICE_UNAVAILABLE') {\n errorMessage = 'Backup service temporarily unavailable. Please try again later.';\n }\n\n showError('Authentication Incomplete', errorMessage);\n\n // Stay on signin to allow retry\n setStep('signin');\n setIsLoading(false);\n }\n } catch (error) {\n // Show error to user\n showError(\n 'Telegram Authentication Failed',\n error instanceof Error ? error.message : 'Unknown error'\n );\n\n // Stay on telegram step to allow retry\n setIsLoading(false);\n }\n },\n (((telegramProvider as any)?.meta?.salt) as string | undefined) || 'demo'\n );\n\n setIsLoading(false);\n\n // Save cleanup function to state for manual cleanup\n setTelegramCleanup(() => cleanup);\n\n return () => {\n cleanup();\n setTelegramCleanup(null);\n };\n }, [step, onAuthSuccess, onOpenChange]);\n\n // Recovery step rendered inside the modal when provided\n if (recoveryUserId) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className={`lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden ${isDark ? 'lumia-dark' : 'lumia-light'}`}\n hideClose\n >\n <DialogTitle className=\"sr-only\">Restore Account Access</DialogTitle>\n <KeyshareRestore userId={recoveryUserId} onClose={onRecoveryClose} onRestoreSuccess={onRecoverySuccess} />\n </DialogContent>\n </Dialog>\n );\n }\n\n if (step === 'display-name') {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className={`lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden ${isDark ? 'lumia-dark' : 'lumia-light'}`}\n style={{\n borderRadius: config.ui.modal?.borderRadius || '24px',\n maxWidth: config.ui.modal?.width || '400px',\n }}\n hideClose\n >\n <DialogTitle className=\"sr-only\">Enter Your Name</DialogTitle>\n <div className=\"p-8\">\n <DisplayNameInput\n onComplete={async () => {\n // Close AuthModal immediately before triggering consent flow\n onOpenChange(false);\n\n // Reset state for next time\n setStep('signin');\n setEmail('');\n setVerificationError('');\n setPasskeyError('');\n setPasskeyStatus('idle');\n\n // Small delay to ensure modal is closed before showing consent\n await new Promise(resolve => setTimeout(resolve, 100));\n\n // Trigger session creation and consent modal\n if (onAuthSuccess) {\n await onAuthSuccess();\n }\n }}\n onSkip={async () => {\n // Close AuthModal immediately before triggering consent flow\n onOpenChange(false);\n\n // Reset state for next time\n setStep('signin');\n setEmail('');\n setVerificationError('');\n setPasskeyError('');\n setPasskeyStatus('idle');\n\n // Small delay to ensure modal is closed before showing consent\n await new Promise(resolve => setTimeout(resolve, 100));\n\n // Trigger session creation and consent modal even if skipped\n if (onAuthSuccess) {\n await onAuthSuccess();\n }\n }}\n />\n </div>\n </DialogContent>\n </Dialog>\n );\n }\n\n if (step === 'failed') {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className={`lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden ${isDark ? 'lumia-dark' : 'lumia-light'}`}\n style={{\n borderRadius: config.ui.modal?.borderRadius || '24px',\n maxWidth: config.ui.modal?.width || '400px',\n }}\n >\n <DialogTitle className=\"sr-only\">Authentication Failed</DialogTitle>\n <div className=\"p-8\">\n <FailedScreen message={failedMessage} />\n </div>\n </DialogContent>\n </Dialog>\n );\n }\n\n if (step === 'verify') {\n return (\n <Dialog open={open && !iframeVisible} onOpenChange={onOpenChange}>\n <DialogContent\n className={`lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden ${isDark ? 'lumia-dark' : 'lumia-light'}`}\n style={{\n borderRadius: config.ui.modal?.borderRadius || '24px',\n maxWidth: config.ui.modal?.width || '400px',\n }}\n >\n <DialogTitle className=\"sr-only\">Email Verification</DialogTitle>\n <div className=\"p-5\">\n <DialogTopBar onBack={goBackToSignIn} className=\"-mx-5 -mt-5 mb-1\" />\n {/* Header/branding kept in modal; OTP input is clean */}\n <div className=\"flex justify-center mb-4\">\n <div className=\"w-10 h-10 bg-gradient-to-br from-purple-100 to-blue-100 rounded-full flex items-center justify-center\">\n <LumiaLogo size={28} />\n </div>\n </div>\n <h2 className={`text-2xl font-bold font-sans ${theme.titleText} mb-2`}>\n Enter verification code\n </h2>\n <p className={`text-sm ${theme.bodyText} mb-6`}>We sent a verification code to<br /><span className=\"font-semibold\">{email}</span></p>\n <VerificationCodeInput\n onVerifyCode={verifyCode}\n onResendCode={resendCode}\n isLoading={isLoading}\n expiresIn={expiresIn}\n error={verificationError}\n />\n {config.features.mpcSecurity && (\n <div className={`text-xs ${theme.mutedText} mt-6 text-center`}>protected by ⚡{' '}\n {config.ui.branding.link ? (\n <a href={config.ui.branding.link.url} target=\"_blank\" rel=\"noopener noreferrer\" className={`${theme.linkText} underline font-medium`}>\n {config.ui.branding.tagline}\n </a>\n ) : (\n <span className=\"font-medium\">{config.ui.branding.tagline}</span>\n )}\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n }\n\n if (step === 'telegram') {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className={`lumia-scope p-0 border-0 ${theme.modalBg} overflow-visible ${isDark ? 'lumia-dark' : 'lumia-light'}`}\n style={{\n borderRadius: config.ui.modal?.borderRadius || '24px',\n maxWidth: config.ui.modal?.width || '400px',\n }}\n >\n <DialogTitle className=\"sr-only\">Telegram Authentication</DialogTitle>\n <div className=\"p-8\">\n <div className=\"text-center mb-6\">\n <div className=\"flex justify-center mb-4\">\n <div className=\"w-10 h-10 bg-gradient-to-br from-purple-100 to-blue-100 rounded-full flex items-center justify-center\">\n <LumiaLogo size={32} />\n </div>\n </div>\n <h2 className={`text-2xl font-bold font-sans ${theme.titleText} mb-2`}>\n Sign in with Telegram\n </h2>\n <p className={`text-sm ${theme.bodyText} mb-6`}>\n Click the button below to authenticate with Telegram\n </p>\n </div>\n\n {/* Telegram Widget Container */}\n <div className=\"flex justify-center mb-6\">\n <div id=\"tg-root\" className=\"flex justify-center\" />\n </div>\n\n {isLoading && (\n <div className={`text-center text-sm ${theme.successText} mb-4`}>\n Loading Telegram widget...\n </div>\n )}\n\n {/* Back button */}\n <div className=\"flex justify-center\">\n <Button\n variant=\"outline\"\n onClick={goBackToSignIn}\n className={`px-6 ${theme.outlineBtn}`}\n >\n ← Back to Sign In\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n }\n\n return (\n <>\n <Dialog open={open && !iframeVisible} onOpenChange={onOpenChange}>\n <DialogContent\n className={`lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden`}\n >\n <DialogTitle className=\"sr-only\">Sign in to Lumia Passport</DialogTitle>\n <div className=\"p-8\">\n <div className=\"text-center mb-8\">\n <div className=\"flex justify-center mb-4\">\n <div className=\"w-10 h-10 bg-gradient-to-br from-purple-100 to-blue-100 rounded-full flex items-center justify-center\">\n <LumiaLogo size={32} />\n </div>\n </div>\n <h2 className={`text-2xl font-bold font-sans ${theme.titleText} mb-2`}>{config.ui.title}</h2>\n {config.features.mpcSecurity && (\n <div className={`text-xs ${theme.mutedText} mb-6`}>\n protected by{' '}\n <span className=\"font-semibold\">\n ⚡{' '}\n {config.ui.branding.link ?\n <a\n href={config.ui.branding.link.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={`${theme.linkText} underline`}\n >\n {config.ui.branding.tagline}\n </a>\n : config.ui.branding.tagline}\n </span>\n </div>\n )}\n </div>\n\n <div className=\"space-y-4\">\n {(() => {\n const order = config.ui.authOrder || ['passkey', 'email', 'social'];\n const isPasskey = config.passkey.enabled;\n const isEmail = config.email.enabled;\n const hasSocial =\n config.social.enabled && config.social.providers.filter(p => p.enabled).length > 0;\n const enabled = order.filter(s =>\n s === 'passkey' ? isPasskey : s === 'email' ? isEmail : hasSocial\n ) as Array<'passkey' | 'email' | 'social'>;\n\n const renderSection = (kind: 'passkey' | 'email' | 'social') => {\n if (kind === 'passkey') {\n return (\n <div className=\"space-y-3\" key=\"passkey\">\n <Button\n variant=\"plain\"\n onClick={handlePasskeyAuth}\n disabled={isLoading}\n className={`w-full h-14 ${theme.primaryBtn} rounded-2xl font-semibold shadow-sm`}\n >\n <Fingerprint className=\"w-5 h-5 mr-2\" />\n Sign in with existing Passkey\n </Button>\n {config.passkey.showCreateButton && (\n <div className={`border-t ${theme.divider} pt-3`}>\n <div className={`text-center text-sm ${theme.bodyText} mb-3`}>\n Don't have a passkey? Create one:\n </div>\n <Button\n variant=\"plain\"\n onClick={handlePasskeyRegister}\n disabled={isLoading}\n className={`w-full h-12 ${theme.outlineBtn} rounded-xl font-medium border`}\n >\n <KeyRound className=\"w-5 h-5 mr-2\" />\n Create Passkey\n </Button>\n </div>\n )}\n {(passkeyError || passkeyStatus !== 'idle') && (\n <div className=\"text-center\">\n {passkeyError && (\n <div className={`text-sm ${theme.errorText} mb-2 break-words whitespace-pre-wrap text-left mx-auto max-w-full max-h-24 overflow-auto`}>{passkeyError}</div>\n )}\n {passkeyStatus !== 'idle' && (\n <div className={`text-sm ${theme.successText}`}>{passkeyStatus}</div>\n )}\n </div>\n )}\n </div>\n );\n }\n if (kind === 'email') {\n return (\n <div className=\"space-y-3\" key=\"email\">\n <div className=\"relative\">\n <Mail className={`absolute left-3 top-3 h-5 w-5 ${theme.iconColor}`} />\n <Input\n type=\"email\"\n placeholder={config.email.placeholder}\n value={email}\n onChange={e => setEmail(e.target.value)}\n className={`pl-11 h-12 ${theme.inputBg} ${theme.inputText} rounded-xl border`}\n />\n </div>\n <Button\n variant=\"plain\"\n className={`w-full h-14 ${theme.ctaBtn} rounded-2xl font-semibold disabled:opacity-100`}\n disabled={!email || isLoading}\n onClick={sendVerificationCode}\n >\n {isLoading ? 'Sending...' : config.email.buttonText}\n </Button>\n {sendError && (\n <div className={`text-sm ${theme.errorText} mt-2 text-center break-words whitespace-pre-wrap`}>{sendError}</div>\n )}\n </div>\n );\n }\n // social\n return (\n <div className={`grid grid-cols-${config.social.gridColumns} gap-3`} key=\"social\">\n {config.social.providers\n .filter(provider => provider.enabled)\n .map(provider => {\n const fallbackMap: Record<string, React.ComponentType<{ className?: string }> | undefined> = {\n google: GoogleIcon,\n telegram: TelegramIcon,\n x: TwitterIcon,\n twitter: TwitterIcon,\n discord: DiscordIcon,\n };\n const IconComponent = (provider.icon as React.ComponentType<{ className?: string }> | undefined) ?? fallbackMap[(provider.id || '').toLowerCase()];\n const handleClick =\n provider.id === 'telegram'\n ? handleTelegramAuth\n : () => handleComingSoon(provider.name);\n return (\n <Button\n key={provider.id}\n variant=\"outline\"\n className={`h-12 ${theme.outlineBtn} rounded-xl p-0 flex items-center justify-center [&_svg]:!w-6 [&_svg]:!h-6`}\n onClick={handleClick}\n disabled={isLoading}\n title={provider.comingSoon ? `${provider.name} (Coming Soon)` : provider.name}\n >\n {IconComponent ? (\n <IconComponent className=\"w-6 h-6\" />\n ) : (\n <span className=\"text-sm\">{provider.name}</span>\n )}\n </Button>\n );\n })}\n </div>\n );\n };\n\n const nodes: React.ReactNode[] = [];\n enabled.forEach((kind, idx) => {\n if (idx > 0) {\n nodes.push(\n <div className=\"flex items-center my-6\" key={`div-${idx}`}>\n <div className={`flex-1 border-t ${theme.divider}`} />\n <div className={`px-3 ${theme.mutedText} text-sm`}>Or</div>\n <div className={`flex-1 border-t ${theme.divider}`} />\n </div>\n );\n }\n nodes.push(renderSection(kind));\n });\n return nodes;\n })()}\n\n <div className={`text-center mt-6 text-sm ${theme.mutedText} font-medium font-sans`}>\n By signing in, you agree to the{' '}\n <button\n onClick={() => setShowTerms(true)}\n className={`bg-transparent ${theme.linkText} underline font-medium hover:opacity-80 transition-opacity`}\n >\n Terms of Service\n </button>\n </div>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n\n <TermsOfService open={showTerms} onOpenChange={setShowTerms} />\n\n <ErrorAlert />\n </>\n );\n};\n","import { publicClient as beamPublic, getBundlerUrl } from './clients/base';\n\nconst ECRECOVER_PRECOMPILE = '0x0000000000000000000000000000000000000001' as const;\nconst ECRECOVER_ABI = [\n { name: 'ecrecover', type: 'function', inputs: [ { name: 'hash', type: 'bytes32' }, { name: 'v', type: 'uint8' }, { name: 'r', type: 'bytes32' }, { name: 's', type: 'bytes32' } ], outputs: [{ name: 'addr', type: 'address' }] },\n] as const;\n\nexport const safeToBigInt = (val: any, fallback = '0x0') => { try { return BigInt(val || fallback); } catch { return BigInt(fallback); } };\nexport const pack2x128 = (hi: bigint, lo: bigint): `0x${string}` => { return `0x${((hi << 128n) | (lo & ((1n << 128n) - 1n))).toString(16).padStart(64, '0')}`; };\n\nexport async function verifySignatureAgainstOwner(opHash: `0x${string}`, signature: `0x${string}`, expectedOwner?: `0x${string}`) {\n if (!signature || signature === '0x') return;\n try {\n const recoveredAddress = await (beamPublic as any).readContract({ address: ECRECOVER_PRECOMPILE as any, abi: ECRECOVER_ABI as any, functionName: 'ecrecover', args: [ opHash, parseInt(signature.slice(-2), 16), `0x${signature.slice(2, 66)}`, `0x${signature.slice(66, 130)}` ] });\n console.error('[AA][sign][CRITICAL] Signature verification:', { opHash, signature, recoveredAddress, expectedOwner, addressesMatch: recoveredAddress?.toLowerCase() === expectedOwner?.toLowerCase() });\n } catch (e) {\n try { const { recoverAddress } = await import('viem'); const recoveredAddress = await recoverAddress({ hash: opHash, signature }); console.error('[AA][sign][CRITICAL] Signature verification (viem):', { opHash, signature, recoveredAddress, expectedOwner, addressesMatch: recoveredAddress?.toLowerCase() === expectedOwner?.toLowerCase() }); } catch (e2) { console.error('[AA][sign][ERROR] Could not verify signature:', e2); }\n }\n}\n\nexport async function fetchEntryPointNonce(account: `0x${string}`, entryPoint: `0x${string}`): Promise<`0x${string}`> {\n try {\n const epNonceAbi = [ { type: 'function', name: 'getNonce', stateMutability: 'view', inputs: [ { name: 'account', type: 'address' }, { name: 'key', type: 'uint192' } ], outputs: [{ name: '', type: 'uint256' }] } ] as const;\n const nonce = await (beamPublic as any).readContract({ address: entryPoint as any, abi: epNonceAbi as any, functionName: 'getNonce', args: [account, 0n] });\n if (typeof nonce === 'bigint') return `0x${nonce.toString(16)}`;\n } catch {}\n return '0x0';\n}\n\nfunction sanitizeUserOperation(userOp: any): any {\n const sanitized = { ...userOp };\n\n // Fix sender field if it's an object (extract address and factory fields)\n if (typeof sanitized.sender === 'object' && sanitized.sender) {\n const senderObj = sanitized.sender;\n\n // Extract the actual sender address\n sanitized.sender = senderObj.sender || senderObj.address || senderObj.smartAccountAddress;\n\n // Extract factory fields if they exist\n if (senderObj.factory) {\n sanitized.factory = senderObj.factory;\n }\n if (senderObj.factoryData) {\n sanitized.factoryData = senderObj.factoryData;\n }\n }\n\n // Ensure all hex fields are valid and properly formatted\n const hexFields = [\n 'sender', 'nonce', 'callData', 'callGasLimit', 'verificationGasLimit',\n 'preVerificationGas', 'maxFeePerGas', 'maxPriorityFeePerGas', 'signature',\n 'factory', 'factoryData', 'paymaster', 'paymasterData',\n 'paymasterVerificationGasLimit', 'paymasterPostOpGasLimit'\n ];\n\n for (const field of hexFields) {\n const value = sanitized[field];\n if (value !== undefined && value !== null) {\n if (typeof value === 'string') {\n if (value === '0x' || value === '') {\n // Convert empty hex to 0x0 for numeric fields, 0x for data fields\n if (['callData', 'factoryData', 'paymasterData', 'signature'].includes(field)) {\n sanitized[field] = '0x';\n } else {\n sanitized[field] = '0x0';\n }\n } else if (field === 'sender' || field === 'factory' || field === 'paymaster') {\n // Address fields should not have 0x prefix added if missing\n if (!value.startsWith('0x')) {\n sanitized[field] = `0x${value}`;\n }\n } else if (!value.startsWith('0x')) {\n sanitized[field] = `0x${value}`;\n }\n }\n }\n }\n\n // Remove undefined/null fields for v0.7\n Object.keys(sanitized).forEach(key => {\n if (sanitized[key] === undefined || sanitized[key] === null) {\n delete sanitized[key];\n }\n });\n\n // Ensure required fields exist with proper defaults\n if (!sanitized.callData) sanitized.callData = '0x';\n if (!sanitized.signature) sanitized.signature = '0x';\n\n return sanitized;\n}\n\nexport async function bundlerRpc(method: string, params: any[]) {\n // Sanitize UserOperation if this is eth_sendUserOperation\n let cleanParams = params;\n if (method === 'eth_sendUserOperation' && params[0]) {\n cleanParams = [sanitizeUserOperation(params[0]), params[1]];\n }\n\n const body = { jsonrpc: '2.0', id: 1, method, params: cleanParams };\n const bodyStr = JSON.stringify(body, (_k, v) => (typeof v === 'bigint' ? `0x${v.toString(16)}` : v));\n\n console.log('[AA][rpc] ->', method, bodyStr);\n\n const res = await fetch(getBundlerUrl(), { method: 'POST', headers: { 'content-type': 'application/json' }, body: bodyStr });\n const json = await res.json();\n\n if (json.error) {\n console.log('[AA][rpc] <- ERROR:', JSON.stringify(json.error));\n const detail = json.error?.data ? ` | data: ${JSON.stringify(json.error.data)}` : '';\n throw new Error((json.error.message || JSON.stringify(json.error)) + detail);\n }\n\n console.log('[AA][rpc] <- SUCCESS:', JSON.stringify(json.result));\n return json.result;\n}\n","import { parseEther, encodeFunctionData, createWalletClient, http } from 'viem';\nimport { entryPoint07Abi } from 'viem/account-abstraction';\nimport { privateKeyToAccount } from 'viem/accounts';\n\nimport { fetchEntryPointNonce, pack2x128 } from '../akHelpers';\n// Import bundler API from @lumiapassport/core\nimport {\n createUserOperationWithDynamicFees,\n estimateUserOperationGas,\n estimateUserOperationGasWithDynamicFees,\n sendUserOperationWithRetry,\n sendUserOperationV06WithRetry,\n calculateDynamicFees,\n simulateUserOperation,\n} from '@lumiapassport/core/bundler';\nimport type { UserOperationV07, UserOperationV06 } from '@lumiapassport/core/bundler';\n// Use iframe-based MPC client for secure key storage and signing\nimport { ensureDkgAndGetOwner, signDigestWithMpc } from '../lib/iframe-mpc-client';\n\nimport {\n publicClient,\n getBundlerClient,\n lumiaBeam,\n ENTRYPOINT_V07,\n ENTRYPOINT_V06,\n LUMIA_AA_FACTORY_ADDRESS,\n LUMIA_PAYMASTER_ADDRESS,\n FUNDER_PK,\n} from './base';\n\nconst PAYMASTER_VERIFICATION_GAS_LIMIT: `0x${string}` = '0x249f0';\nconst PAYMASTER_POSTOP_GAS_LIMIT: `0x${string}` = '0x186a0';\n\nconst MAX_BUNDLER_VERIFICATION_GAS = 5_000_000n;\nconst PAYMASTER_VERIFICATION_GAS = 150_000n;\nconst PAYMASTER_POSTOP_GAS = 100_000n;\n\nexport interface AccountSession {\n ownerAddress: `0x${string}`;\n smartAccountAddress: `0x${string}`;\n factoryAddress: `0x${string}`;\n ownerPrivateKey?: `0x${string}`;\n mpcUserId?: string;\n usePaymaster?: boolean;\n kind: 'lumia';\n address: `0x${string}`;\n}\n\nexport interface CreateAccountParams {\n privateKey?: `0x${string}`;\n mpcUserId?: string;\n mpcPin?: string;\n usePaymaster?: boolean;\n}\n\nconst executeAbi = [\n {\n type: 'function',\n name: 'execute',\n stateMutability: 'payable',\n inputs: [\n { name: 'target', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'data', type: 'bytes' },\n ],\n outputs: [],\n },\n] as const;\n\nfunction normalizeSignature(signature: `0x${string}`): `0x${string}` {\n const sig = signature.slice(2);\n const r = sig.slice(0, 64);\n const s = sig.slice(64, 128);\n const v = sig.slice(128, 130);\n const sBigInt = BigInt(`0x${s}`);\n const secp256k1n = BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141');\n const secp256k1nHalf = secp256k1n >> 1n;\n let canonicalS = sBigInt;\n let canonicalV = parseInt(v, 16);\n if (sBigInt > secp256k1nHalf) {\n canonicalS = secp256k1n - sBigInt;\n canonicalV = canonicalV === 27 ? 28 : canonicalV === 28 ? 27 : canonicalV === 0 ? 1 : 0;\n }\n const canonicalSHex = canonicalS.toString(16).padStart(64, '0');\n const canonicalVHex = canonicalV.toString(16).padStart(2, '0');\n return `0x${r}${canonicalSHex}${canonicalVHex}` as `0x${string}`;\n}\n\nfunction convertUserOpV07ToV06(userOpV07: UserOperationV07): UserOperationV06 {\n let initCode: `0x${string}` = '0x';\n if (userOpV07.factory && userOpV07.factoryData) {\n const factoryAddr = userOpV07.factory.startsWith('0x') ? userOpV07.factory.slice(2) : userOpV07.factory;\n const factoryDataClean = userOpV07.factoryData.startsWith('0x') ? userOpV07.factoryData.slice(2) : userOpV07.factoryData;\n initCode = `0x${factoryAddr}${factoryDataClean}` as `0x${string}`;\n }\n let paymasterAndData: `0x${string}` = '0x';\n if (userOpV07.paymaster && userOpV07.paymaster !== '0x0000000000000000000000000000000000000000') {\n const paymasterAddr = userOpV07.paymaster.startsWith('0x') ? userOpV07.paymaster.slice(2) : userOpV07.paymaster;\n const paymasterDataField = userOpV07.paymasterData || '0x';\n const paymasterDataClean = paymasterDataField === '0x' ? '' : paymasterDataField.startsWith('0x') ? paymasterDataField.slice(2) : paymasterDataField;\n paymasterAndData = `0x${paymasterAddr}${paymasterDataClean}` as `0x${string}`;\n }\n return {\n sender: userOpV07.sender,\n nonce: userOpV07.nonce,\n initCode,\n callData: userOpV07.callData,\n callGasLimit: userOpV07.callGasLimit,\n verificationGasLimit: userOpV07.verificationGasLimit,\n preVerificationGas: userOpV07.preVerificationGas,\n maxFeePerGas: userOpV07.maxFeePerGas,\n maxPriorityFeePerGas: userOpV07.maxPriorityFeePerGas,\n paymasterAndData,\n signature: userOpV07.signature,\n };\n}\n\nexport async function createAccountSession(\n params: CreateAccountParams = {}\n): Promise<AccountSession> {\n const { privateKey, mpcUserId, usePaymaster = false } = params;\n if (!privateKey && !mpcUserId) throw new Error('Either privateKey or mpcUserId must be provided');\n if (!privateKey && mpcUserId && !mpcUserId.trim()) throw new Error('mpcUserId cannot be empty when using MPC mode');\n const factoryAddress = LUMIA_AA_FACTORY_ADDRESS as `0x${string}`;\n if (!factoryAddress) throw new Error('LUMIA_AA_FACTORY_ADDRESS is not configured');\n let ownerAddress: `0x${string}`; let ownerPrivateKey: `0x${string}` | undefined;\n if (privateKey) { const account = privateKeyToAccount(privateKey); ownerAddress = account.address; ownerPrivateKey = privateKey; }\n else if (mpcUserId) { const dkgResult = await ensureDkgAndGetOwner(mpcUserId); if (!dkgResult.ownerAddress) throw new Error('Failed to get owner address from DKG'); ownerAddress = dkgResult.ownerAddress; }\n else { throw new Error('Either privateKey or mpcUserId must be provided'); }\n const saltZero = '0x0000000000000000000000000000000000000000000000000000000000000000' as const;\n const smartAccountAddress = await predictCompatAddress(ownerAddress, factoryAddress, saltZero);\n return { ownerAddress, smartAccountAddress, factoryAddress, ownerPrivateKey, mpcUserId: privateKey ? undefined : mpcUserId, usePaymaster, kind: 'lumia', address: smartAccountAddress };\n}\n\nasync function predictCompatAddress(owner: `0x${string}`, factory: `0x${string}`, salt: `0x${string}`): Promise<`0x${string}`> {\n const compatAbi = [ { type: 'function', name: 'getAddress', stateMutability: 'view', inputs: [ { name: 'owner', type: 'address' }, { name: 'salt', type: 'bytes32' } ], outputs: [{ name: '', type: 'address' }] } ] as const;\n try {\n const predicted = await (publicClient as any).readContract({ address: factory, abi: compatAbi, functionName: 'getAddress', args: [owner, salt] } as any);\n return predicted as `0x${string}`;\n } catch (error) { throw new Error(`Failed to predict account address: ${error}`); }\n}\n\nexport async function sendUserOperation(\n session: AccountSession,\n callTarget: `0x${string}`,\n amountWei: string,\n innerData: `0x${string}` = '0x',\n feeType: 'economy' | 'standard' | 'fast' = 'standard',\n entryPointVersion: 'v0.6' | 'v0.7' = 'v0.7'\n): Promise<`0x${string}`> {\n const entryPointAddress = entryPointVersion === 'v0.6' ? ENTRYPOINT_V06 : ENTRYPOINT_V07;\n const amountWeiBigInt = BigInt(amountWei);\n const isMinimalTest = callTarget === '0x0000000000000000000000000000000000000000' && amountWei === '0' && innerData === '0x';\n let callData: `0x${string}`;\n if (isMinimalTest) { callData = '0x'; }\n else { callData = encodeFunctionData({ abi: executeAbi, functionName: 'execute', args: [callTarget, amountWeiBigInt, innerData] }); }\n\n let isDeployed = false; let deploymentMethod = 'unknown';\n try { const code = await publicClient.getCode({ address: session.smartAccountAddress }); if (code && code !== '0x' && code.length > 2) { isDeployed = true; deploymentMethod = 'getCode'; } } catch {}\n\n const nonce = await fetchEntryPointNonce(session.smartAccountAddress, entryPointAddress);\n const nonceValue = BigInt(nonce);\n if (!isDeployed && nonceValue !== 0n) throw new Error(`Undeployed account has non-zero nonce: ${nonce}. This will cause CodeHashChanged error.`);\n const shouldIncludeFactory = !isDeployed;\n\n let userOp: UserOperationV07;\n if (shouldIncludeFactory) {\n const compatCreateAbi = [ { type: 'function', name: 'createAccount', stateMutability: 'payable', inputs: [ { name: 'owner', type: 'address' }, { name: 'salt', type: 'bytes32' } ], outputs: [{ name: '', type: 'address' }] } ] as const;\n const saltZero = '0x0000000000000000000000000000000000000000000000000000000000000000' as const;\n const factoryData = encodeFunctionData({ abi: compatCreateAbi, functionName: 'createAccount', args: [session.ownerAddress, saltZero] });\n try {\n const predicted = await (publicClient as any).readContract({ address: session.factoryAddress, abi: compatCreateAbi, functionName: 'createAccount', args: [session.ownerAddress, saltZero] } as any);\n const predictedStr = String(predicted).toLowerCase();\n if (predictedStr !== session.smartAccountAddress.toLowerCase()) {\n console.warn('[Account] Warning: Predicted address mismatch:', { predicted, expected: session.smartAccountAddress });\n }\n } catch (verifyErr) { console.warn('[Account] Could not verify predicted address via call:', verifyErr); }\n\n userOp = await createUserOperationWithDynamicFees(\n session.smartAccountAddress,\n nonce,\n callData,\n true, // includeFactory = true\n session.factoryAddress,\n factoryData,\n feeType\n );\n } else {\n userOp = await createUserOperationWithDynamicFees(\n session.smartAccountAddress,\n nonce,\n callData,\n false, // includeFactory = false\n undefined,\n undefined,\n feeType\n );\n }\n\n const ensureGenerousDefaults = () => {\n const toHex = (v: bigint) => `0x${v.toString(16)}`;\n const minCallGas = 0x493e0n; // 300,000 (same as original)\n const minVerificationGas = 0x989680n; // 10,000,000 (same as original)\n const minPreVerificationGas = 0x30d40n; // 200,000 (same as original)\n if (BigInt(userOp.callGasLimit || '0x0') < minCallGas) userOp.callGasLimit = toHex(minCallGas) as `0x${string}`;\n if (BigInt(userOp.verificationGasLimit || '0x0') < minVerificationGas) userOp.verificationGasLimit = toHex(minVerificationGas) as `0x${string}`;\n if (BigInt(userOp.preVerificationGas || '0x0') < minPreVerificationGas) userOp.preVerificationGas = toHex(minPreVerificationGas) as `0x${string}`;\n };\n const enforceCaps = (usePaymaster?: boolean) => {\n try {\n const envCaps: any = (typeof import.meta !== 'undefined' && (import.meta as any).env) || {};\n const maxBundlerVerifGas: bigint = envCaps.VITE_MAX_VERIFICATION_GAS ? BigInt(envCaps.VITE_MAX_VERIFICATION_GAS) : MAX_BUNDLER_VERIFICATION_GAS;\n const maxCallGas: bigint = envCaps.VITE_MAX_CALL_GAS_LIMIT ? BigInt(envCaps.VITE_MAX_CALL_GAS_LIMIT) : 0x7a120n;\n const toHex = (v: bigint) => `0x${v.toString(16)}`;\n const maxAccountVerifGas = usePaymaster ? maxBundlerVerifGas - PAYMASTER_VERIFICATION_GAS : maxBundlerVerifGas;\n const verGas = BigInt(userOp.verificationGasLimit || '0x0');\n if (verGas > maxAccountVerifGas) userOp.verificationGasLimit = toHex(maxAccountVerifGas) as `0x${string}`;\n const callGas = BigInt(userOp.callGasLimit || '0x0');\n if (callGas > maxCallGas) userOp.callGasLimit = toHex(maxCallGas) as `0x${string}`;\n } catch {}\n };\n\n let estimated = false;\n try {\n const gasEst = await estimateUserOperationGas({ ...userOp, signature: `0x${'00'.repeat(65)}` });\n userOp.callGasLimit = gasEst.callGasLimit; userOp.verificationGasLimit = gasEst.verificationGasLimit; userOp.preVerificationGas = gasEst.preVerificationGas;\n ensureGenerousDefaults(); enforceCaps(session.usePaymaster); estimated = true;\n } catch {\n ensureGenerousDefaults(); enforceCaps(session.usePaymaster);\n }\n\n try {\n const toHex = (v: bigint) => `0x${v.toString(16)}`;\n const isContractCall = !!userOp.callData && userOp.callData !== '0x';\n if (isContractCall) {\n const currentVer = BigInt(userOp.verificationGasLimit || '0x0');\n const call = BigInt(userOp.callGasLimit || '0x0');\n const postOp = 150_000n; const safety10k = 10_000n;\n let buffer = call + postOp + safety10k; buffer += buffer / 63n;\n const newVer = currentVer + buffer; userOp.verificationGasLimit = toHex(newVer) as `0x${string}`; enforceCaps(session.usePaymaster);\n }\n } catch {}\n\n if (session.usePaymaster && LUMIA_PAYMASTER_ADDRESS) {\n userOp.paymaster = LUMIA_PAYMASTER_ADDRESS as `0x${string}`; userOp.paymasterData = '0x' as `0x${string}`;\n userOp.paymasterVerificationGasLimit = PAYMASTER_VERIFICATION_GAS_LIMIT;\n userOp.paymasterPostOpGasLimit = PAYMASTER_POSTOP_GAS_LIMIT;\n }\n\n const signUserOp = async (nonce: `0x${string}`) => {\n userOp.nonce = nonce;\n let opHash: `0x${string}`;\n if (entryPointVersion === 'v0.6') {\n const userOpV06 = convertUserOpV07ToV06(userOp);\n opHash = (await (publicClient as any).readContract({ address: entryPointAddress as `0x${string}` , abi: [ { type: 'function', name: 'getUserOpHash', inputs: [ { name: 'userOp', type: 'tuple', components: [ { name: 'sender', type: 'address' }, { name: 'nonce', type: 'uint256' }, { name: 'initCode', type: 'bytes' }, { name: 'callData', type: 'bytes' }, { name: 'callGasLimit', type: 'uint256' }, { name: 'verificationGasLimit', type: 'uint256' }, { name: 'preVerificationGas', type: 'uint256' }, { name: 'maxFeePerGas', type: 'uint256' }, { name: 'maxPriorityFeePerGas', type: 'uint256' }, { name: 'paymasterAndData', type: 'bytes' }, { name: 'signature', type: 'bytes' } ] } ], outputs: [{ name: '', type: 'bytes32' }] } ] as const, functionName: 'getUserOpHash', args: [ { sender: userOpV06.sender, nonce: BigInt(userOpV06.nonce), initCode: userOpV06.initCode, callData: userOpV06.callData, callGasLimit: BigInt(userOpV06.callGasLimit), verificationGasLimit: BigInt(userOpV06.verificationGasLimit), preVerificationGas: BigInt(userOpV06.preVerificationGas), maxFeePerGas: BigInt(userOpV06.maxFeePerGas), maxPriorityFeePerGas: BigInt(userOpV06.maxPriorityFeePerGas), paymasterAndData: userOpV06.paymasterAndData, signature: '0x', } ] } as any)) as `0x${string}`;\n } else {\n const hasFactoryData = !!(userOp.factory && userOp.factoryData);\n const initCode = hasFactoryData ? (() => { const factoryAddr = (userOp.factory as string).startsWith('0x') ? (userOp.factory as string).slice(2) : (userOp.factory as string); const factoryDataClean = (userOp.factoryData as string).startsWith('0x') ? (userOp.factoryData as string).slice(2) : (userOp.factoryData as string); return `0x${factoryAddr}${factoryDataClean}` as `0x${string}`; })() : ('0x' as `0x${string}`);\n const accountGasLimits = pack2x128(BigInt(userOp.verificationGasLimit), BigInt(userOp.callGasLimit));\n const gasFees = pack2x128(BigInt(userOp.maxPriorityFeePerGas), BigInt(userOp.maxFeePerGas));\n let paymasterAndData: `0x${string}` = '0x';\n if (userOp.paymaster && userOp.paymaster !== '0x0000000000000000000000000000000000000000') {\n const verificationGasLimit = userOp.paymasterVerificationGasLimit || '0x186a0';\n const postOpGasLimit = userOp.paymasterPostOpGasLimit || '0x186a0';\n const paymasterDataField = userOp.paymasterData || '0x';\n const packedPaymasterGasLimits = pack2x128(BigInt(verificationGasLimit), BigInt(postOpGasLimit));\n const paymasterAddr = (userOp.paymaster as string).startsWith('0x') ? (userOp.paymaster as string).slice(2) : (userOp.paymaster as string);\n const paymasterDataClean = paymasterDataField === '0x' ? '' : paymasterDataField.startsWith('0x') ? paymasterDataField.slice(2) : paymasterDataField;\n paymasterAndData = `0x${paymasterAddr}${packedPaymasterGasLimits.slice(2)}${paymasterDataClean}` as `0x${string}`;\n }\n const packedForHash = { sender: session.smartAccountAddress, nonce: BigInt(nonce), initCode, callData, accountGasLimits, preVerificationGas: BigInt(userOp.preVerificationGas), gasFees, paymasterAndData, signature: '0x' as `0x${string}` };\n\n opHash = await (publicClient as any).readContract({ address: entryPointAddress as `0x${string}`, abi: entryPoint07Abi, functionName: 'getUserOpHash', args: [packedForHash] } as any);\n }\n let signature: `0x${string}`;\n if (session.mpcUserId) {\n // Pass full UserOp details for display in iframe confirmation modal\n const mpcSig = await signDigestWithMpc(session.mpcUserId, opHash, {\n sender: userOp.sender,\n nonce: userOp.nonce,\n callData: userOp.callData,\n callGasLimit: userOp.callGasLimit,\n verificationGasLimit: userOp.verificationGasLimit,\n preVerificationGas: userOp.preVerificationGas,\n maxFeePerGas: userOp.maxFeePerGas,\n maxPriorityFeePerGas: userOp.maxPriorityFeePerGas,\n paymaster: userOp.paymaster,\n factory: userOp.factory,\n factoryData: userOp.factoryData,\n callTarget, // Add callTarget so iframe can display \"To\" address\n });\n if (!mpcSig) throw new Error('MPC signing failed');\n signature = mpcSig;\n }\n else if (session.ownerPrivateKey) { const account = privateKeyToAccount(session.ownerPrivateKey); const rawSig = await account.sign({ hash: opHash }); signature = normalizeSignature(rawSig); }\n else { throw new Error('No signing method available'); }\n userOp.signature = signature;\n\n // CRITICAL FIX: Ensure sender is always a string, not an object\n if (typeof userOp.sender !== 'string') {\n userOp.sender = session.smartAccountAddress;\n }\n\n return userOp;\n };\n\n try { userOp = await signUserOp(nonce); } catch (signingError) { throw signingError; }\n\n let hash: `0x${string}`;\n if (entryPointVersion === 'v0.6') {\n const userOpV06 = convertUserOpV07ToV06(userOp);\n const resignerV06 = async (newNonce: `0x${string}`) => { const resignedV07 = await signUserOp(newNonce); return convertUserOpV07ToV06(resignedV07); };\n hash = await sendUserOperationV06WithRetry(userOpV06, resignerV06, 1);\n } else {\n hash = await sendUserOperationWithRetry(userOp, signUserOp, 1);\n }\n return hash;\n}\n\n/**\n * Prepare and sign a UserOperation without sending it to the bundler.\n * Returns the signed UserOp and its hash for backend verification and submission.\n *\n * @param session - Account session with signing credentials\n * @param callTarget - Target address for the transaction\n * @param amountWei - Amount in wei to send\n * @param innerData - Call data for the transaction\n * @param feeType - Fee tier: 'economy', 'standard', or 'fast'\n * @param entryPointVersion - EntryPoint version: 'v0.6' or 'v0.7'\n * @returns Object with signed UserOperation and its hash\n */\nexport async function prepareUserOperation(\n session: AccountSession,\n callTarget: `0x${string}`,\n amountWei: string,\n innerData: `0x${string}` = '0x',\n feeType: 'economy' | 'standard' | 'fast' = 'standard',\n entryPointVersion: 'v0.6' | 'v0.7' = 'v0.7'\n): Promise<{ userOp: UserOperationV07 | UserOperationV06; userOpHash: `0x${string}` }> {\n const entryPointAddress = entryPointVersion === 'v0.6' ? ENTRYPOINT_V06 : ENTRYPOINT_V07;\n const amountWeiBigInt = BigInt(amountWei);\n const isMinimalTest = callTarget === '0x0000000000000000000000000000000000000000' && amountWei === '0' && innerData === '0x';\n let callData: `0x${string}`;\n if (isMinimalTest) { callData = '0x'; }\n else { callData = encodeFunctionData({ abi: executeAbi, functionName: 'execute', args: [callTarget, amountWeiBigInt, innerData] }); }\n\n let isDeployed = false; let deploymentMethod = 'unknown';\n try { const code = await publicClient.getCode({ address: session.smartAccountAddress }); if (code && code !== '0x' && code.length > 2) { isDeployed = true; deploymentMethod = 'getCode'; } } catch {}\n\n const nonce = await fetchEntryPointNonce(session.smartAccountAddress, entryPointAddress);\n const nonceValue = BigInt(nonce);\n if (!isDeployed && nonceValue !== 0n) throw new Error(`Undeployed account has non-zero nonce: ${nonce}. This will cause CodeHashChanged error.`);\n const shouldIncludeFactory = !isDeployed;\n\n let userOp: UserOperationV07;\n if (shouldIncludeFactory) {\n const compatCreateAbi = [ { type: 'function', name: 'createAccount', stateMutability: 'payable', inputs: [ { name: 'owner', type: 'address' }, { name: 'salt', type: 'bytes32' } ], outputs: [{ name: '', type: 'address' }] } ] as const;\n const saltZero = '0x0000000000000000000000000000000000000000000000000000000000000000' as const;\n const factoryData = encodeFunctionData({ abi: compatCreateAbi, functionName: 'createAccount', args: [session.ownerAddress, saltZero] });\n\n userOp = await createUserOperationWithDynamicFees(\n session.smartAccountAddress,\n nonce,\n callData,\n true,\n session.factoryAddress,\n factoryData,\n feeType\n );\n } else {\n userOp = await createUserOperationWithDynamicFees(\n session.smartAccountAddress,\n nonce,\n callData,\n false,\n undefined,\n undefined,\n feeType\n );\n }\n\n const ensureGenerousDefaults = () => {\n const toHex = (v: bigint) => `0x${v.toString(16)}`;\n const minCallGas = 0x493e0n;\n const minVerificationGas = 0x989680n;\n const minPreVerificationGas = 0x30d40n;\n if (BigInt(userOp.callGasLimit || '0x0') < minCallGas) userOp.callGasLimit = toHex(minCallGas) as `0x${string}`;\n if (BigInt(userOp.verificationGasLimit || '0x0') < minVerificationGas) userOp.verificationGasLimit = toHex(minVerificationGas) as `0x${string}`;\n if (BigInt(userOp.preVerificationGas || '0x0') < minPreVerificationGas) userOp.preVerificationGas = toHex(minPreVerificationGas) as `0x${string}`;\n };\n\n const enforceCaps = (usePaymaster?: boolean) => {\n try {\n const envCaps: any = (typeof import.meta !== 'undefined' && (import.meta as any).env) || {};\n const maxBundlerVerifGas: bigint = envCaps.VITE_MAX_VERIFICATION_GAS ? BigInt(envCaps.VITE_MAX_VERIFICATION_GAS) : MAX_BUNDLER_VERIFICATION_GAS;\n const maxCallGas: bigint = envCaps.VITE_MAX_CALL_GAS_LIMIT ? BigInt(envCaps.VITE_MAX_CALL_GAS_LIMIT) : 0x7a120n;\n const toHex = (v: bigint) => `0x${v.toString(16)}`;\n const maxAccountVerifGas = usePaymaster ? maxBundlerVerifGas - PAYMASTER_VERIFICATION_GAS : maxBundlerVerifGas;\n const verGas = BigInt(userOp.verificationGasLimit || '0x0');\n if (verGas > maxAccountVerifGas) userOp.verificationGasLimit = toHex(maxAccountVerifGas) as `0x${string}`;\n const callGas = BigInt(userOp.callGasLimit || '0x0');\n if (callGas > maxCallGas) userOp.callGasLimit = toHex(maxCallGas) as `0x${string}`;\n } catch {}\n };\n\n let estimated = false;\n try {\n const gasEst = await estimateUserOperationGas({ ...userOp, signature: `0x${'00'.repeat(65)}` });\n userOp.callGasLimit = gasEst.callGasLimit; userOp.verificationGasLimit = gasEst.verificationGasLimit; userOp.preVerificationGas = gasEst.preVerificationGas;\n ensureGenerousDefaults(); enforceCaps(session.usePaymaster); estimated = true;\n } catch {\n ensureGenerousDefaults(); enforceCaps(session.usePaymaster);\n }\n\n try {\n const toHex = (v: bigint) => `0x${v.toString(16)}`;\n const isContractCall = !!userOp.callData && userOp.callData !== '0x';\n if (isContractCall) {\n const currentVer = BigInt(userOp.verificationGasLimit || '0x0');\n const call = BigInt(userOp.callGasLimit || '0x0');\n const postOp = 150_000n; const safety10k = 10_000n;\n let buffer = call + postOp + safety10k; buffer += buffer / 63n;\n const newVer = currentVer + buffer; userOp.verificationGasLimit = toHex(newVer) as `0x${string}`; enforceCaps(session.usePaymaster);\n }\n } catch {}\n\n if (session.usePaymaster && LUMIA_PAYMASTER_ADDRESS) {\n userOp.paymaster = LUMIA_PAYMASTER_ADDRESS as `0x${string}`; userOp.paymasterData = '0x' as `0x${string}`;\n userOp.paymasterVerificationGasLimit = PAYMASTER_VERIFICATION_GAS_LIMIT;\n userOp.paymasterPostOpGasLimit = PAYMASTER_POSTOP_GAS_LIMIT;\n }\n\n // Calculate UserOp hash\n userOp.nonce = nonce;\n let opHash: `0x${string}`;\n\n if (entryPointVersion === 'v0.6') {\n const userOpV06 = convertUserOpV07ToV06(userOp);\n opHash = (await (publicClient as any).readContract({\n address: entryPointAddress as `0x${string}`,\n abi: [ { type: 'function', name: 'getUserOpHash', inputs: [ { name: 'userOp', type: 'tuple', components: [ { name: 'sender', type: 'address' }, { name: 'nonce', type: 'uint256' }, { name: 'initCode', type: 'bytes' }, { name: 'callData', type: 'bytes' }, { name: 'callGasLimit', type: 'uint256' }, { name: 'verificationGasLimit', type: 'uint256' }, { name: 'preVerificationGas', type: 'uint256' }, { name: 'maxFeePerGas', type: 'uint256' }, { name: 'maxPriorityFeePerGas', type: 'uint256' }, { name: 'paymasterAndData', type: 'bytes' }, { name: 'signature', type: 'bytes' } ] } ], outputs: [{ name: '', type: 'bytes32' }] } ] as const,\n functionName: 'getUserOpHash',\n args: [ {\n sender: userOpV06.sender,\n nonce: BigInt(userOpV06.nonce),\n initCode: userOpV06.initCode,\n callData: userOpV06.callData,\n callGasLimit: BigInt(userOpV06.callGasLimit),\n verificationGasLimit: BigInt(userOpV06.verificationGasLimit),\n preVerificationGas: BigInt(userOpV06.preVerificationGas),\n maxFeePerGas: BigInt(userOpV06.maxFeePerGas),\n maxPriorityFeePerGas: BigInt(userOpV06.maxPriorityFeePerGas),\n paymasterAndData: userOpV06.paymasterAndData,\n signature: '0x',\n } ]\n } as any)) as `0x${string}`;\n } else {\n const hasFactoryData = !!(userOp.factory && userOp.factoryData);\n const initCode = hasFactoryData ? (() => {\n const factoryAddr = (userOp.factory as string).startsWith('0x') ? (userOp.factory as string).slice(2) : (userOp.factory as string);\n const factoryDataClean = (userOp.factoryData as string).startsWith('0x') ? (userOp.factoryData as string).slice(2) : (userOp.factoryData as string);\n return `0x${factoryAddr}${factoryDataClean}` as `0x${string}`;\n })() : ('0x' as `0x${string}`);\n\n const accountGasLimits = pack2x128(BigInt(userOp.verificationGasLimit), BigInt(userOp.callGasLimit));\n const gasFees = pack2x128(BigInt(userOp.maxPriorityFeePerGas), BigInt(userOp.maxFeePerGas));\n\n let paymasterAndData: `0x${string}` = '0x';\n if (userOp.paymaster && userOp.paymaster !== '0x0000000000000000000000000000000000000000') {\n const verificationGasLimit = userOp.paymasterVerificationGasLimit || '0x186a0';\n const postOpGasLimit = userOp.paymasterPostOpGasLimit || '0x186a0';\n const paymasterDataField = userOp.paymasterData || '0x';\n const packedPaymasterGasLimits = pack2x128(BigInt(verificationGasLimit), BigInt(postOpGasLimit));\n const paymasterAddr = (userOp.paymaster as string).startsWith('0x') ? (userOp.paymaster as string).slice(2) : (userOp.paymaster as string);\n const paymasterDataClean = paymasterDataField === '0x' ? '' : paymasterDataField.startsWith('0x') ? paymasterDataField.slice(2) : paymasterDataField;\n paymasterAndData = `0x${paymasterAddr}${packedPaymasterGasLimits.slice(2)}${paymasterDataClean}` as `0x${string}`;\n }\n\n const packedForHash = {\n sender: session.smartAccountAddress,\n nonce: BigInt(nonce),\n initCode,\n callData,\n accountGasLimits,\n preVerificationGas: BigInt(userOp.preVerificationGas),\n gasFees,\n paymasterAndData,\n signature: '0x' as `0x${string}`\n };\n\n opHash = await (publicClient as any).readContract({\n address: entryPointAddress as `0x${string}`,\n abi: entryPoint07Abi,\n functionName: 'getUserOpHash',\n args: [packedForHash]\n } as any);\n }\n\n // Sign the UserOp\n let signature: `0x${string}`;\n if (session.mpcUserId) {\n const mpcSig = await signDigestWithMpc(session.mpcUserId, opHash, {\n sender: userOp.sender,\n nonce: userOp.nonce,\n callData: userOp.callData,\n callGasLimit: userOp.callGasLimit,\n verificationGasLimit: userOp.verificationGasLimit,\n preVerificationGas: userOp.preVerificationGas,\n maxFeePerGas: userOp.maxFeePerGas,\n maxPriorityFeePerGas: userOp.maxPriorityFeePerGas,\n paymaster: userOp.paymaster,\n factory: userOp.factory,\n factoryData: userOp.factoryData,\n });\n if (!mpcSig) throw new Error('MPC signing failed');\n signature = mpcSig;\n } else if (session.ownerPrivateKey) {\n const account = privateKeyToAccount(session.ownerPrivateKey);\n const rawSig = await account.sign({ hash: opHash });\n signature = normalizeSignature(rawSig);\n } else {\n throw new Error('No signing method available');\n }\n\n userOp.signature = signature;\n\n // Ensure sender is always a string\n if (typeof userOp.sender !== 'string') {\n userOp.sender = session.smartAccountAddress;\n }\n\n // Return appropriate version\n if (entryPointVersion === 'v0.6') {\n const userOpV06 = convertUserOpV07ToV06(userOp);\n return { userOp: userOpV06, userOpHash: opHash };\n }\n\n return { userOp, userOpHash: opHash };\n}\n\nexport async function depositForSmartAccount(\n address: `0x${string}`,\n amountEth = '0.01',\n entryPointVersion: 'v0.6' | 'v0.7' = 'v0.7'\n) {\n if (!FUNDER_PK) throw new Error('VITE_FUNDER_PK is not set');\n const entryPointAddress = entryPointVersion === 'v0.6' ? ENTRYPOINT_V06 : ENTRYPOINT_V07;\n const entryPointDepositAbi = [ { type: 'function', name: 'depositTo', stateMutability: 'payable', inputs: [{ name: 'account', type: 'address' }], outputs: [] } ] as const;\n const funder = privateKeyToAccount(FUNDER_PK as `0x${string}`);\n const wallet = createWalletClient({ account: funder, chain: lumiaBeam, transport: http(lumiaBeam.rpcUrls.default.http[0]) });\n const hash = await (wallet as any).writeContract({ address: entryPointAddress as `0x${string}`, abi: entryPointDepositAbi, functionName: 'depositTo', args: [address], value: parseEther(amountEth), type: 'legacy', gasPrice: 1_000_000_000n } as any);\n return hash;\n}\n\nexport async function getEntryPointDeposit(\n address: `0x${string}`,\n entryPointVersion: 'v0.6' | 'v0.7' = 'v0.7'\n): Promise<bigint> {\n const entryPointAddress = entryPointVersion === 'v0.6' ? ENTRYPOINT_V06 : ENTRYPOINT_V07;\n const depositAbi = [ { type: 'function', name: 'balanceOf', stateMutability: 'view', inputs: [{ name: 'account', type: 'address' }], outputs: [{ name: '', type: 'uint256' }] } ] as const;\n return await (publicClient as any).readContract({ address: entryPointAddress as `0x${string}`, abi: depositAbi, functionName: 'balanceOf', args: [address] } as any);\n}\n","import { getSupportedEntryPoints } from 'viem/account-abstraction';\n\nimport {\n createAccountSession,\n sendUserOperation,\n depositForSmartAccount,\n getEntryPointDeposit,\n type AccountSession,\n type CreateAccountParams,\n} from './account';\nimport { getBundlerClient, getBundlerUrl } from './base';\n\nexport async function probeBundler() {\n const startedAt = Date.now();\n try {\n const entryPoints = await getSupportedEntryPoints(getBundlerClient() as any);\n const elapsedMs = Date.now() - startedAt;\n return { ok: true, url: getBundlerUrl(), ms: elapsedMs, entryPoints } as const;\n } catch (err: any) {\n const elapsedMs = Date.now() - startedAt;\n const message = err?.message || String(err);\n return { ok: false, url: getBundlerUrl(), ms: elapsedMs, error: message } as const;\n }\n}\n\nexport {\n createAccountSession,\n sendUserOperation,\n depositForSmartAccount,\n getEntryPointDeposit,\n type AccountSession,\n type CreateAccountParams,\n};\n\nexport async function createAccountClient(\n params: CreateAccountParams = {}\n): Promise<AccountSession> {\n return createAccountSession(params);\n}\n\nexport const createAkClient = createAccountClient;\nexport const createLumiaClient = createAccountClient;\nexport const sendDemoUserOp = sendUserOperation;\nexport const sendLumiaUserOp = sendUserOperation;\nexport const depositForLumiaAccount = depositForSmartAccount;\n\n","export * from './base';\nexport * from './account';\nexport * from './utils';\n","// Auto-attach package styles (inline) — no action needed in host app\nimport cssText from './styles/built.css';\ndeclare const __LUMIA_DISABLE_AUTO_CSS__: string | undefined;\n(() => {\n try {\n if (typeof document === 'undefined') return;\n // Allow host apps to opt-out of auto CSS injection\n const disabled = typeof __LUMIA_DISABLE_AUTO_CSS__ !== 'undefined' && !!__LUMIA_DISABLE_AUTO_CSS__;\n if (disabled) return;\n const markerId = 'lumia-passport-ui-kit-styles';\n if (document.getElementById(markerId)) return;\n const style = document.createElement('style');\n style.id = markerId;\n style.textContent = (cssText as unknown as string) || '';\n document.head.appendChild(style);\n } catch {}\n})();\n\nexport { LumiaPassportProvider, useLumiaPassportConfig } from './context/LumiaPassportContext';\nexport type { LumiaPassportProviderProps, LumiaPassportCallbacks } from './context/LumiaPassportContext';\n\n// New names (recommended)\nexport { LumiaPassportSessionProvider, useLumiaPassportSession } from './context/LumiaPassportSessionContext';\nexport type { LumiaPassportSessionProviderProps } from './context/LumiaPassportSessionContext';\n\n// TODO: [DEPRECATED] Remove in v2.0.0 - Deprecated aliases for backward compatibility\n/**\n * @deprecated Use `LumiaPassportSessionProvider` instead. This alias will be removed in v2.0.0\n */\nexport { LumiaSessionProvider, useLumiaSession } from './context/LumiaPassportSessionContext';\n/**\n * @deprecated Use `LumiaPassportSessionProviderProps` instead. This alias will be removed in v2.0.0\n */\nexport type { LumiaSessionProviderProps } from './context/LumiaPassportSessionContext';\n\nexport { LumiaWagmiProvider } from './context/WagmiContext';\nexport { LumiaRainbowKitProvider } from './context/RainbowKitContext';\nexport type { LumiaRainbowKitProviderProps } from './context/RainbowKitContext';\nexport { ConnectWalletButton } from './components/ConnectWalletButton';\nexport type { ConnectWalletButtonProps } from './components/ConnectWalletButton';\nexport { ThemeToggle } from './components/ThemeToggle';\nexport { LumiaLogo } from './components/LumiaLogo';\nexport { useTheme } from './hooks/useTheme';\nexport type { Theme } from './hooks/useTheme';\n\n// UserOperation monitoring components\nexport { UserOpStatus } from './internal/components/UserOpStatus';\nexport { Hash } from './internal/components/Hash';\nexport { Address } from './internal/components/Address';\nexport { TransactionsList } from './internal/components/TransactionsList';\nexport { default as KeyshareBackup } from './internal/components/KeyshareBackup';\nexport type { UserOpStatusProps } from './internal/components/UserOpStatus';\nexport type { HashProps } from './internal/components/Hash';\nexport type { AddressProps } from './internal/components/Address';\n\n// Internal modals are not exported - they're used internally by ConnectWalletButton\n// For custom implementations, use the hooks and utility components below\n\n// Transaction hooks\nexport { useSendTransaction } from './hooks/useSendTransaction';\nexport type { UseSendTransactionReturn } from './hooks/useSendTransaction';\nexport type { SendTransactionParams as UserOpSendTransactionParams } from './hooks/useSendTransaction';\nexport { useUserOpStatus } from './hooks/useUserOpStatus';\nexport type {\n UseUserOpStatusReturn,\n UseUserOpStatusOptions,\n UserOpState,\n UserOpReceipt,\n UserOpMempool,\n} from './hooks/useUserOpStatus';\n\n// Public client API\nexport type { AccountSession } from './internal/clients/account';\nexport { sendUserOperation, prepareUserOperation } from './internal/clients/account';\nexport { lumiaBeam, LUMIA_EXPLORER_URL } from './internal/clients/base';\n\n// Profile API\nexport { getUserProfile, updateUserProfile } from './internal/clients/profile';\nexport type { UserProfile, UpdateProfileRequest, ProviderDetail } from './internal/clients/profile';\n\n// Wagmi configuration\nexport { wagmiConfig, queryClient } from './config/wagmi';\n\n// Blockchain modules\nexport { useTransactions } from './modules/transactions';\nexport { useAssets, useTokenInfo, useTokenBalance } from './modules/assets';\nexport { useSmartAccountTransactions } from './modules/smartAccountTransactions';\nexport { useLumiaPassportLinkedProfiles } from './modules/linkedProfiles';\nexport type { Transaction, SendTransactionParams, SendTransactionResult } from './modules/transactions';\nexport type { TokenBalance, Asset } from './modules/assets';\nexport type { UserOperation } from './modules/smartAccountTransactions';\nexport type { LumiaPassportConfig } from './config/lumiaPassport';\n\n// Iframe Manager types\nexport type { WalletReadyStatus } from './internal/lib/iframe-manager';\n\n// Note: No static import of CSS here to keep build tool-agnostic.\n// CSS is loaded via dynamic import (eval) above for Vite dev and via <link> fallback.\n",".container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=\"1\"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:\"\\201C\"\"\\201D\"\"\\2018\"\"\\2019\";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:\"`\"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:\"`\"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:rgba(17,24,39,.1);--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:hsla(0,0%,100%,.1);--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.lumia-scope{background-color:hsl(var(--background));color:hsl(var(--foreground))}.lumia-scope,.lumia-scope *,.lumia-scope :after,.lumia-scope :before{box-sizing:border-box;border-width:0;border-style:solid}.lumia-scope input,.lumia-scope select,.lumia-scope textarea{font:inherit;color:inherit;margin:0;background-color:transparent}.lumia-scope button{font:inherit;margin:0;background-color:transparent;border:0}.lumia-scope input[type=search]::-webkit-search-cancel-button,.lumia-scope input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.lumia-scope,.lumia-scope *,.lumia-scope .lumia-heading,.lumia-scope [data-radix-dialog-content],.lumia-scope [data-radix-dialog-content] *,.lumia-scope h1,.lumia-scope h2,.lumia-scope h3,.lumia-scope h4,.lumia-scope h5,.lumia-scope h6{font-family:system-ui,-apple-system,sans-serif!important}.lumia-scope .lumia-heading{font-weight:700}.lumia-scope .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.lumia-scope .pointer-events-none{pointer-events:none}.lumia-scope .pointer-events-auto{pointer-events:auto}.lumia-scope .visible{visibility:visible}.lumia-scope .collapse{visibility:collapse}.lumia-scope .static{position:static}.lumia-scope .fixed{position:fixed}.lumia-scope .absolute{position:absolute}.lumia-scope .relative{position:relative}.lumia-scope .inset-0{inset:0}.lumia-scope .inset-y-0{top:0;bottom:0}.lumia-scope .-bottom-1{bottom:-.25rem}.lumia-scope .-right-1{right:-.25rem}.lumia-scope .bottom-full{bottom:100%}.lumia-scope .left-1{left:.25rem}.lumia-scope .left-1\\/2{left:50%}.lumia-scope .left-3{left:.75rem}.lumia-scope .left-4{left:1rem}.lumia-scope .left-\\[50\\%\\]{left:50%}.lumia-scope .right-2{right:.5rem}.lumia-scope .right-3{right:.75rem}.lumia-scope .right-4{right:1rem}.lumia-scope .top-1{top:.25rem}.lumia-scope .top-1\\/2{top:50%}.lumia-scope .top-3{top:.75rem}.lumia-scope .top-4{top:1rem}.lumia-scope .top-\\[50\\%\\]{top:50%}.lumia-scope .z-10{z-index:10}.lumia-scope .z-50{z-index:50}.lumia-scope .z-\\[2147483646\\]{z-index:2147483646}.lumia-scope .z-\\[2147483647\\]{z-index:2147483647}.lumia-scope .z-\\[60\\]{z-index:60}.lumia-scope .-m-px{margin:-1px}.lumia-scope .-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.lumia-scope .mx-auto{margin-left:auto;margin-right:auto}.lumia-scope .my-6{margin-top:1.5rem;margin-bottom:1.5rem}.lumia-scope .my-auto{margin-top:auto;margin-bottom:auto}.lumia-scope .-mt-5{margin-top:-1.25rem}.lumia-scope .mb-1{margin-bottom:.25rem}.lumia-scope .mb-1\\.5{margin-bottom:.375rem}.lumia-scope .mb-2{margin-bottom:.5rem}.lumia-scope .mb-3{margin-bottom:.75rem}.lumia-scope .mb-4{margin-bottom:1rem}.lumia-scope .mb-6{margin-bottom:1.5rem}.lumia-scope .mb-8{margin-bottom:2rem}.lumia-scope .ml-1{margin-left:.25rem}.lumia-scope .ml-2{margin-left:.5rem}.lumia-scope .ml-3{margin-left:.75rem}.lumia-scope .ml-4{margin-left:1rem}.lumia-scope .ml-auto{margin-left:auto}.lumia-scope .mr-1{margin-right:.25rem}.lumia-scope .mr-1\\.5{margin-right:.375rem}.lumia-scope .mr-2{margin-right:.5rem}.lumia-scope .mt-0{margin-top:0}.lumia-scope .mt-0\\.5{margin-top:.125rem}.lumia-scope .mt-1{margin-top:.25rem}.lumia-scope .mt-1\\.5{margin-top:.375rem}.lumia-scope .mt-2{margin-top:.5rem}.lumia-scope .mt-3{margin-top:.75rem}.lumia-scope .mt-4{margin-top:1rem}.lumia-scope .mt-6{margin-top:1.5rem}.lumia-scope .block{display:block}.lumia-scope .inline-block{display:inline-block}.lumia-scope .inline{display:inline}.lumia-scope .flex{display:flex}.lumia-scope .inline-flex{display:inline-flex}.lumia-scope .table{display:table}.lumia-scope .grid{display:grid}.lumia-scope .contents{display:contents}.lumia-scope .hidden{display:none}.lumia-scope .size-4{width:1rem;height:1rem}.lumia-scope .\\!h-5{height:1.25rem!important}.lumia-scope .\\!h-6{height:1.5rem!important}.lumia-scope .h-10{height:2.5rem}.lumia-scope .h-11{height:2.75rem}.lumia-scope .h-12{height:3rem}.lumia-scope .h-14{height:3.5rem}.lumia-scope .h-16{height:4rem}.lumia-scope .h-2{height:.5rem}.lumia-scope .h-2\\.5{height:.625rem}.lumia-scope .h-3{height:.75rem}.lumia-scope .h-3\\.5{height:.875rem}.lumia-scope .h-4{height:1rem}.lumia-scope .h-48{height:12rem}.lumia-scope .h-5{height:1.25rem}.lumia-scope .h-6{height:1.5rem}.lumia-scope .h-8{height:2rem}.lumia-scope .h-9{height:2.25rem}.lumia-scope .h-\\[32px\\]{height:32px}.lumia-scope .h-fit{height:-moz-fit-content;height:fit-content}.lumia-scope .h-full{height:100%}.lumia-scope .h-px{height:1px}.lumia-scope .max-h-24{max-height:6rem}.lumia-scope .max-h-96{max-height:24rem}.lumia-scope .max-h-\\[60vh\\]{max-height:60vh}.lumia-scope .max-h-\\[80vh\\]{max-height:80vh}.lumia-scope .\\!w-5{width:1.25rem!important}.lumia-scope .\\!w-6{width:1.5rem!important}.lumia-scope .w-10{width:2.5rem}.lumia-scope .w-12{width:3rem}.lumia-scope .w-16{width:4rem}.lumia-scope .w-2{width:.5rem}.lumia-scope .w-2\\.5{width:.625rem}.lumia-scope .w-3{width:.75rem}.lumia-scope .w-3\\.5{width:.875rem}.lumia-scope .w-4{width:1rem}.lumia-scope .w-48{width:12rem}.lumia-scope .w-5{width:1.25rem}.lumia-scope .w-6{width:1.5rem}.lumia-scope .w-8{width:2rem}.lumia-scope .w-9{width:2.25rem}.lumia-scope .w-full{width:100%}.lumia-scope .w-px{width:1px}.lumia-scope .min-w-0{min-width:0}.lumia-scope .min-w-16{min-width:4rem}.lumia-scope .min-w-24{min-width:6rem}.lumia-scope .min-w-32{min-width:8rem}.lumia-scope .min-w-\\[280px\\]{min-width:280px}.lumia-scope .max-w-2xl{max-width:42rem}.lumia-scope .max-w-\\[380px\\]{max-width:380px}.lumia-scope .max-w-\\[400px\\]{max-width:400px}.lumia-scope .max-w-\\[680px\\]{max-width:680px}.lumia-scope .max-w-full{max-width:100%}.lumia-scope .max-w-lg{max-width:32rem}.lumia-scope .max-w-md{max-width:28rem}.lumia-scope .max-w-sm{max-width:24rem}.lumia-scope .flex-1{flex:1 1 0%}.lumia-scope .flex-shrink{flex-shrink:1}.lumia-scope .flex-shrink-0,.lumia-scope .shrink-0{flex-shrink:0}.lumia-scope .border-collapse{border-collapse:collapse}.lumia-scope .-translate-x-1{--tw-translate-x:-0.25rem}.lumia-scope .-translate-x-1,.lumia-scope .-translate-x-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .-translate-x-1\\/2{--tw-translate-x:-50%}.lumia-scope .-translate-y-1{--tw-translate-y:-0.25rem}.lumia-scope .-translate-y-1,.lumia-scope .-translate-y-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .-translate-y-1\\/2{--tw-translate-y:-50%}.lumia-scope .translate-x-\\[-50\\%\\]{--tw-translate-x:-50%}.lumia-scope .translate-x-\\[-50\\%\\],.lumia-scope .translate-y-\\[-50\\%\\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .translate-y-\\[-50\\%\\]{--tw-translate-y:-50%}.lumia-scope .transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes glow-warning{0%,to{box-shadow:0 0 0 rgba(234,88,12,.5)}50%{box-shadow:0 0 20px rgba(234,88,12,.8)}}.lumia-scope .animate-glow-warning{animation:glow-warning 2s ease-in-out infinite}@keyframes pulse-warning{0%,to{opacity:1}50%{opacity:.6}}.lumia-scope .animate-pulse-warning{animation:pulse-warning 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.lumia-scope .animate-spin{animation:spin 1s linear infinite}.lumia-scope .cursor-not-allowed{cursor:not-allowed}.lumia-scope .cursor-pointer{cursor:pointer}.lumia-scope .select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.lumia-scope .resize{resize:both}.lumia-scope .list-inside{list-style-position:inside}.lumia-scope .list-disc{list-style-type:disc}.lumia-scope .grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lumia-scope .grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lumia-scope .grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lumia-scope .grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lumia-scope .grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lumia-scope .grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lumia-scope .grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lumia-scope .flex-row{flex-direction:row}.lumia-scope .flex-col{flex-direction:column}.lumia-scope .flex-col-reverse{flex-direction:column-reverse}.lumia-scope .flex-wrap{flex-wrap:wrap}.lumia-scope .items-start{align-items:flex-start}.lumia-scope .items-center{align-items:center}.lumia-scope .justify-start{justify-content:flex-start}.lumia-scope .justify-end{justify-content:flex-end}.lumia-scope .justify-center{justify-content:center}.lumia-scope .justify-between{justify-content:space-between}.lumia-scope .gap-0{gap:0}.lumia-scope .gap-1{gap:.25rem}.lumia-scope .gap-2{gap:.5rem}.lumia-scope .gap-3{gap:.75rem}.lumia-scope .gap-4{gap:1rem}.lumia-scope :is(.space-x-1>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-3>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-x-4>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope :is(.space-y-0>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-0\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-1\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-2>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-2\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-3>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-3\\.5>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-4>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.lumia-scope :is(.space-y-6>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.lumia-scope .overflow-auto{overflow:auto}.lumia-scope .overflow-hidden{overflow:hidden}.lumia-scope .overflow-visible{overflow:visible}.lumia-scope .overflow-y-auto{overflow-y:auto}.lumia-scope .truncate{overflow:hidden;text-overflow:ellipsis}.lumia-scope .truncate,.lumia-scope .whitespace-nowrap{white-space:nowrap}.lumia-scope .whitespace-pre-line{white-space:pre-line}.lumia-scope .whitespace-pre-wrap{white-space:pre-wrap}.lumia-scope .break-words{overflow-wrap:break-word}.lumia-scope .break-all{word-break:break-all}.lumia-scope .rounded{border-radius:.25rem}.lumia-scope .rounded-2xl{border-radius:1rem}.lumia-scope .rounded-3xl{border-radius:1.5rem}.lumia-scope .rounded-full{border-radius:9999px}.lumia-scope .rounded-lg{border-radius:var(--radius)}.lumia-scope .rounded-md{border-radius:calc(var(--radius) - 2px)}.lumia-scope .rounded-sm{border-radius:calc(var(--radius) - 4px)}.lumia-scope .rounded-xl{border-radius:.75rem}.lumia-scope .border{border-width:1px}.lumia-scope .border-0{border-width:0}.lumia-scope .border-2{border-width:2px}.lumia-scope .border-b{border-bottom-width:1px}.lumia-scope .border-b-2{border-bottom-width:2px}.lumia-scope .border-t{border-top-width:1px}.lumia-scope .border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity,1))}.lumia-scope .border-amber-300{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity,1))}.lumia-scope .border-amber-400{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity,1))}.lumia-scope .border-amber-500{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity,1))}.lumia-scope .border-amber-500\\/30{border-color:rgba(245,158,11,.3)}.lumia-scope .border-amber-500\\/40{border-color:rgba(245,158,11,.4)}.lumia-scope .border-amber-900{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity,1))}.lumia-scope .border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.lumia-scope .border-blue-400{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity,1))}.lumia-scope .border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.lumia-scope .border-blue-500\\/30{border-color:rgba(59,130,246,.3)}.lumia-scope .border-blue-600{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity,1))}.lumia-scope .border-blue-800{--tw-border-opacity:1;border-color:rgb(30 64 175/var(--tw-border-opacity,1))}.lumia-scope .border-blue-900{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity,1))}.lumia-scope .border-blue-900\\/40{border-color:rgba(30,58,138,.4)}.lumia-scope .border-border{border-color:hsl(var(--border))}.lumia-scope .border-current{border-color:currentColor}.lumia-scope .border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.lumia-scope .border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.lumia-scope .border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.lumia-scope .border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity,1))}.lumia-scope .border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity,1))}.lumia-scope .border-green-500{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity,1))}.lumia-scope .border-green-500\\/40{border-color:rgba(34,197,94,.4)}.lumia-scope .border-green-800{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity,1))}.lumia-scope .border-green-900{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity,1))}.lumia-scope .border-green-900\\/60{border-color:rgba(20,83,45,.6)}.lumia-scope .border-input{border-color:hsl(var(--input))}.lumia-scope .border-orange-200{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity,1))}.lumia-scope .border-orange-800{--tw-border-opacity:1;border-color:rgb(154 52 18/var(--tw-border-opacity,1))}.lumia-scope .border-orange-900{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity,1))}.lumia-scope .border-purple-200{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity,1))}.lumia-scope .border-purple-800{--tw-border-opacity:1;border-color:rgb(107 33 168/var(--tw-border-opacity,1))}.lumia-scope .border-purple-900{--tw-border-opacity:1;border-color:rgb(88 28 135/var(--tw-border-opacity,1))}.lumia-scope .border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.lumia-scope .border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity,1))}.lumia-scope .border-red-400{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity,1))}.lumia-scope .border-red-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity,1))}.lumia-scope .border-red-500\\/40{border-color:rgba(239,68,68,.4)}.lumia-scope .border-red-800{--tw-border-opacity:1;border-color:rgb(153 27 27/var(--tw-border-opacity,1))}.lumia-scope .border-red-800\\/80{border-color:rgba(153,27,27,.8)}.lumia-scope .border-red-900{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity,1))}.lumia-scope .border-red-900\\/60{border-color:rgba(127,29,29,.6)}.lumia-scope .border-sky-200{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity,1))}.lumia-scope .border-sky-800{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity,1))}.lumia-scope .border-sky-900{--tw-border-opacity:1;border-color:rgb(12 74 110/var(--tw-border-opacity,1))}.lumia-scope .border-transparent{border-color:transparent}.lumia-scope .border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.lumia-scope .border-t-transparent{border-top-color:transparent}.lumia-scope .\\!bg-transparent{background-color:transparent!important}.lumia-scope .bg-\\[\\#0088cc\\]{--tw-bg-opacity:1;background-color:rgb(0 136 204/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#2456f0\\]{--tw-bg-opacity:1;background-color:rgb(36 86 240/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#db2777\\]{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity,1))}.lumia-scope .bg-\\[\\#fde2f3\\]{--tw-bg-opacity:1;background-color:rgb(253 226 243/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-500\\/10{background-color:rgba(245,158,11,.1)}.lumia-scope .bg-amber-500\\/15{background-color:rgba(245,158,11,.15)}.lumia-scope .bg-amber-900{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity,1))}.lumia-scope .bg-amber-950{--tw-bg-opacity:1;background-color:rgb(69 26 3/var(--tw-bg-opacity,1))}.lumia-scope .bg-background{background-color:hsl(var(--background))}.lumia-scope .bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.lumia-scope .bg-black\\/50{background-color:rgba(0,0,0,.5)}.lumia-scope .bg-black\\/80{background-color:rgba(0,0,0,.8)}.lumia-scope .bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-50\\/50{background-color:rgba(239,246,255,.5)}.lumia-scope .bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-500\\/10{background-color:rgba(59,130,246,.1)}.lumia-scope .bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-900{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity,1))}.lumia-scope .bg-blue-900\\/20{background-color:rgba(30,58,138,.2)}.lumia-scope .bg-blue-900\\/30{background-color:rgba(30,58,138,.3)}.lumia-scope .bg-blue-900\\/40{background-color:rgba(30,58,138,.4)}.lumia-scope .bg-blue-950{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity,1))}.lumia-scope .bg-card{background-color:hsl(var(--card))}.lumia-scope .bg-destructive{background-color:hsl(var(--destructive))}.lumia-scope .bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .bg-gray-800\\/50{background-color:rgba(31,41,55,.5)}.lumia-scope .bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-500\\/15{background-color:rgba(34,197,94,.15)}.lumia-scope .bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-900\\/30{background-color:rgba(20,83,45,.3)}.lumia-scope .bg-green-950{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity,1))}.lumia-scope .bg-green-950\\/50{background-color:rgba(5,46,22,.5)}.lumia-scope .bg-orange-100{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-700{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-800{--tw-bg-opacity:1;background-color:rgb(154 52 18/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-900{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity,1))}.lumia-scope .bg-orange-950{--tw-bg-opacity:1;background-color:rgb(67 20 7/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-100{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-200{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity,1))}.lumia-scope .bg-pink-600{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity,1))}.lumia-scope .bg-primary{background-color:hsl(var(--primary))}.lumia-scope .bg-purple-100{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-200{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-50\\/50{background-color:rgba(250,245,255,.5)}.lumia-scope .bg-purple-500{--tw-bg-opacity:1;background-color:rgb(168 85 247/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-500\\/10{background-color:rgba(168,85,247,.1)}.lumia-scope .bg-purple-700{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity,1))}.lumia-scope .bg-purple-950{--tw-bg-opacity:1;background-color:rgb(59 7 100/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-500\\/15{background-color:rgba(239,68,68,.15)}.lumia-scope .bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-700\\/80{background-color:rgba(185,28,28,.8)}.lumia-scope .bg-red-900{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-900\\/30{background-color:rgba(127,29,29,.3)}.lumia-scope .bg-red-950{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity,1))}.lumia-scope .bg-red-950\\/50{background-color:rgba(69,10,10,.5)}.lumia-scope .bg-red-950\\/90{background-color:rgba(69,10,10,.9)}.lumia-scope .bg-secondary{background-color:hsl(var(--secondary))}.lumia-scope .bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-50\\/50{background-color:rgba(240,249,255,.5)}.lumia-scope .bg-sky-500{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity,1))}.lumia-scope .bg-sky-500\\/10{background-color:rgba(14,165,233,.1)}.lumia-scope .bg-sky-950{--tw-bg-opacity:1;background-color:rgb(8 47 73/var(--tw-bg-opacity,1))}.lumia-scope .bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.lumia-scope .bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity,1))}.lumia-scope .bg-transparent{background-color:transparent}.lumia-scope .bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.lumia-scope .bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.lumia-scope .bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.lumia-scope .bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.lumia-scope .from-purple-100{--tw-gradient-from:#f3e8ff var(--tw-gradient-from-position);--tw-gradient-to:rgba(243,232,255,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .from-purple-500{--tw-gradient-from:#a855f7 var(--tw-gradient-from-position);--tw-gradient-to:rgba(168,85,247,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .from-purple-600{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .to-blue-100{--tw-gradient-to:#dbeafe var(--tw-gradient-to-position)}.lumia-scope .to-blue-500{--tw-gradient-to:#3b82f6 var(--tw-gradient-to-position)}.lumia-scope .to-blue-600{--tw-gradient-to:#2563eb var(--tw-gradient-to-position)}.lumia-scope .object-contain{-o-object-fit:contain;object-fit:contain}.lumia-scope .object-cover{-o-object-fit:cover;object-fit:cover}.lumia-scope .p-0{padding:0}.lumia-scope .p-1{padding:.25rem}.lumia-scope .p-2{padding:.5rem}.lumia-scope .p-2\\.5{padding:.625rem}.lumia-scope .p-3{padding:.75rem}.lumia-scope .p-4{padding:1rem}.lumia-scope .p-5{padding:1.25rem}.lumia-scope .p-6{padding:1.5rem}.lumia-scope .p-8{padding:2rem}.lumia-scope .px-12{padding-left:3rem;padding-right:3rem}.lumia-scope .px-2{padding-left:.5rem;padding-right:.5rem}.lumia-scope .px-2\\.5{padding-left:.625rem;padding-right:.625rem}.lumia-scope .px-3{padding-left:.75rem;padding-right:.75rem}.lumia-scope .px-4{padding-left:1rem;padding-right:1rem}.lumia-scope .px-6{padding-left:1.5rem;padding-right:1.5rem}.lumia-scope .px-8{padding-left:2rem;padding-right:2rem}.lumia-scope .py-0{padding-top:0;padding-bottom:0}.lumia-scope .py-0\\.5{padding-top:.125rem;padding-bottom:.125rem}.lumia-scope .py-1{padding-top:.25rem;padding-bottom:.25rem}.lumia-scope .py-1\\.5{padding-top:.375rem;padding-bottom:.375rem}.lumia-scope .py-2{padding-top:.5rem;padding-bottom:.5rem}.lumia-scope .py-3{padding-top:.75rem;padding-bottom:.75rem}.lumia-scope .py-4{padding-top:1rem;padding-bottom:1rem}.lumia-scope .py-8{padding-top:2rem;padding-bottom:2rem}.lumia-scope .pb-3{padding-bottom:.75rem}.lumia-scope .pb-4{padding-bottom:1rem}.lumia-scope .pl-11{padding-left:2.75rem}.lumia-scope .pr-10{padding-right:2.5rem}.lumia-scope .pr-16{padding-right:4rem}.lumia-scope .pt-0{padding-top:0}.lumia-scope .pt-2{padding-top:.5rem}.lumia-scope .pt-3{padding-top:.75rem}.lumia-scope .pt-4{padding-top:1rem}.lumia-scope .text-left{text-align:left}.lumia-scope .text-center{text-align:center}.lumia-scope .text-right{text-align:right}.lumia-scope .font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.lumia-scope .font-sans{font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.lumia-scope .text-2xl{font-size:1.5rem;line-height:2rem}.lumia-scope .text-3xl{font-size:1.875rem;line-height:2.25rem}.lumia-scope .text-\\[10px\\]{font-size:10px}.lumia-scope .text-\\[11px\\]{font-size:11px}.lumia-scope .text-base{font-size:1rem;line-height:1.5rem}.lumia-scope .text-lg{font-size:1.125rem;line-height:1.75rem}.lumia-scope .text-sm{font-size:.875rem;line-height:1.25rem}.lumia-scope .text-xl{font-size:1.25rem;line-height:1.75rem}.lumia-scope .text-xs{font-size:.75rem;line-height:1rem}.lumia-scope .font-bold{font-weight:700}.lumia-scope .font-medium{font-weight:500}.lumia-scope .font-semibold{font-weight:600}.lumia-scope .italic{font-style:italic}.lumia-scope .leading-none{line-height:1}.lumia-scope .leading-relaxed{line-height:1.625}.lumia-scope .leading-tight{line-height:1.25}.lumia-scope .tracking-tight{letter-spacing:-.025em}.lumia-scope .text-amber-100{--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity,1))}.lumia-scope .text-amber-200{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity,1))}.lumia-scope .text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity,1))}.lumia-scope .text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.lumia-scope .text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity,1))}.lumia-scope .text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity,1))}.lumia-scope .text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}.lumia-scope .text-amber-900{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity,1))}.lumia-scope .text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .text-blue-400\\/80{color:rgba(96,165,250,.8)}.lumia-scope .text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.lumia-scope .text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .text-card-foreground{color:hsl(var(--card-foreground))}.lumia-scope .text-destructive{color:hsl(var(--destructive))}.lumia-scope .text-destructive-foreground{color:hsl(var(--destructive-foreground))}.lumia-scope .text-foreground{color:hsl(var(--foreground))}.lumia-scope .text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.lumia-scope .text-green-200{--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity,1))}.lumia-scope .text-green-300{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity,1))}.lumia-scope .text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity,1))}.lumia-scope .text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.lumia-scope .text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.lumia-scope .text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.lumia-scope .text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity,1))}.lumia-scope .text-indigo-400{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity,1))}.lumia-scope .text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.lumia-scope .text-muted-foreground{color:hsl(var(--muted-foreground))}.lumia-scope .text-orange-100{--tw-text-opacity:1;color:rgb(255 237 213/var(--tw-text-opacity,1))}.lumia-scope .text-orange-200{--tw-text-opacity:1;color:rgb(254 215 170/var(--tw-text-opacity,1))}.lumia-scope .text-orange-300{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity,1))}.lumia-scope .text-orange-400{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity,1))}.lumia-scope .text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity,1))}.lumia-scope .text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity,1))}.lumia-scope .text-orange-700{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity,1))}.lumia-scope .text-primary{color:hsl(var(--primary))}.lumia-scope .text-primary-foreground{color:hsl(var(--primary-foreground))}.lumia-scope .text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity,1))}.lumia-scope .text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity,1))}.lumia-scope .text-purple-500{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity,1))}.lumia-scope .text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity,1))}.lumia-scope .text-red-100{--tw-text-opacity:1;color:rgb(254 226 226/var(--tw-text-opacity,1))}.lumia-scope .text-red-200{--tw-text-opacity:1;color:rgb(254 202 202/var(--tw-text-opacity,1))}.lumia-scope .text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.lumia-scope .text-red-300\\/95{color:hsla(0,94%,82%,.95)}.lumia-scope .text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .text-red-400\\/80{color:hsla(0,91%,71%,.8)}.lumia-scope .text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.lumia-scope .text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.lumia-scope .text-red-600\\/90{color:rgba(220,38,38,.9)}.lumia-scope .text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.lumia-scope .text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity,1))}.lumia-scope .text-secondary-foreground{color:hsl(var(--secondary-foreground))}.lumia-scope .text-sky-400{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity,1))}.lumia-scope .text-sky-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity,1))}.lumia-scope .text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.lumia-scope .text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity,1))}.lumia-scope .underline{text-decoration-line:underline}.lumia-scope .underline-offset-4{text-underline-offset:4px}.lumia-scope .opacity-0{opacity:0}.lumia-scope .opacity-100{opacity:1}.lumia-scope .opacity-40{opacity:.4}.lumia-scope .shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.lumia-scope .shadow,.lumia-scope .shadow-2xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.lumia-scope .shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.lumia-scope .shadow-lg,.lumia-scope .shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.lumia-scope .outline{outline-style:solid}.lumia-scope .ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.lumia-scope .blur{--tw-blur:blur(8px)}.lumia-scope .blur,.lumia-scope .filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.lumia-scope .backdrop-blur{--tw-backdrop-blur:blur(8px)}.lumia-scope .backdrop-blur,.lumia-scope .backdrop-blur-sm{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.lumia-scope .backdrop-filter{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lumia-scope .transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lumia-scope .duration-200{transition-duration:.2s}.lumia-scope .ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.lumia-scope .\\[background\\:var\\(--lumia-bg\\)\\]{background:var(--lumia-bg)}.lumia-scope .\\[border-color\\:var\\(--lumia-border\\)\\]{border-color:var(--lumia-border)}.lumia-scope .\\[color\\:var\\(--lumia-text\\)\\]{color:var(--lumia-text)}.lumia-scope .\\[color\\:var\\(--lumia-text-muted\\)\\]{color:var(--lumia-text-muted)}.lumia-scope .\\[color\\:var\\(--lumia-text-secondary\\)\\]{color:var(--lumia-text-secondary)}.lumia-scope .file\\:mr-3::file-selector-button{margin-right:.75rem}.lumia-scope .file\\:cursor-pointer::file-selector-button{cursor:pointer}.lumia-scope .file\\:rounded::file-selector-button{border-radius:.25rem}.lumia-scope .file\\:border-0::file-selector-button{border-width:0}.lumia-scope .file\\:bg-purple-600::file-selector-button{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity,1))}.lumia-scope .file\\:bg-transparent::file-selector-button{background-color:transparent}.lumia-scope .file\\:px-3::file-selector-button{padding-left:.75rem;padding-right:.75rem}.lumia-scope .file\\:py-1\\.5::file-selector-button{padding-top:.375rem;padding-bottom:.375rem}.lumia-scope .file\\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.lumia-scope .file\\:text-xs::file-selector-button{font-size:.75rem;line-height:1rem}.lumia-scope .file\\:font-medium::file-selector-button{font-weight:500}.lumia-scope .file\\:text-white::file-selector-button{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .placeholder\\:text-gray-500::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .hover\\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lumia-scope .hover\\:bg-\\[\\#0077bb\\]:hover{--tw-bg-opacity:1;background-color:rgb(0 119 187/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#1e49d8\\]:hover{--tw-bg-opacity:1;background-color:rgb(30 73 216/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#be185d\\]:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-\\[\\#f7c1df\\]:hover{--tw-bg-opacity:1;background-color:rgb(247 193 223/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-accent:hover{background-color:hsl(var(--accent))}.lumia-scope .hover\\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-blue-900\\/60:hover{background-color:rgba(30,58,138,.6)}.lumia-scope .hover\\:bg-destructive\\/90:hover{background-color:hsl(var(--destructive)/.9)}.lumia-scope .hover\\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-green-900\\/30:hover{background-color:rgba(20,83,45,.3)}.lumia-scope .hover\\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-primary\\/80:hover{background-color:hsl(var(--primary)/.8)}.lumia-scope .hover\\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-600\\/90:hover{background-color:rgba(220,38,38,.9)}.lumia-scope .hover\\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-red-900\\/20:hover{background-color:rgba(127,29,29,.2)}.lumia-scope .hover\\:bg-secondary\\/80:hover{background-color:hsl(var(--secondary)/.8)}.lumia-scope .hover\\:bg-slate-800:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .hover\\:from-purple-600:hover{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .hover\\:from-purple-700:hover{--tw-gradient-from:#7e22ce var(--tw-gradient-from-position);--tw-gradient-to:rgba(126,34,206,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.lumia-scope .hover\\:to-blue-700:hover{--tw-gradient-to:#1d4ed8 var(--tw-gradient-to-position)}.lumia-scope .hover\\:text-blue-300:hover{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-400:hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-600:hover{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-blue-800:hover{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-gray-800:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-300:hover{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-400:hover{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-600:hover{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.lumia-scope .hover\\:text-red-700:hover{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.lumia-scope .hover\\:underline:hover{text-decoration-line:underline}.lumia-scope .hover\\:no-underline:hover{text-decoration-line:none}.lumia-scope .hover\\:opacity-80:hover{opacity:.8}.lumia-scope .hover\\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lumia-scope .hover\\:file\\:bg-purple-700::file-selector-button:hover{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity,1))}.lumia-scope .focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus\\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus\\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.lumia-scope .focus\\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity,1))}.lumia-scope .focus\\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.lumia-scope .focus\\:ring-offset-2:focus{--tw-ring-offset-width:2px}.lumia-scope .focus-visible\\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.lumia-scope .focus-visible\\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lumia-scope .focus-visible\\:ring-blue-500:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.lumia-scope .focus-visible\\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.lumia-scope .focus-visible\\:ring-offset-0:focus-visible{--tw-ring-offset-width:0px}.lumia-scope .focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.lumia-scope .disabled\\:pointer-events-none:disabled{pointer-events:none}.lumia-scope .disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.lumia-scope .disabled\\:opacity-100:disabled{opacity:1}.lumia-scope .disabled\\:opacity-50:disabled{opacity:.5}.lumia-scope :is(.group:hover .group-hover\\:opacity-100){opacity:1}@media (min-width:640px){.lumia-scope .sm\\:mt-0{margin-top:0}.lumia-scope .sm\\:flex-row{flex-direction:row}.lumia-scope .sm\\:justify-end{justify-content:flex-end}.lumia-scope :is(.sm\\:space-x-2>:not([hidden])~:not([hidden])){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lumia-scope .sm\\:rounded-lg{border-radius:var(--radius)}.lumia-scope .sm\\:text-left{text-align:left}}@media (prefers-color-scheme:dark){.lumia-scope .dark\\:border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.lumia-scope .dark\\:bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.lumia-scope .dark\\:text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.lumia-scope .dark\\:text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lumia-scope .dark\\:placeholder\\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .dark\\:placeholder\\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.lumia-scope .dark\\:hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.lumia-scope .dark\\:hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.lumia-scope .dark\\:focus\\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(75 85 99/var(--tw-ring-opacity,1))}}.lumia-scope :is(.\\[\\&_svg\\]\\:pointer-events-none svg){pointer-events:none}.lumia-scope :is(.\\[\\&_svg\\]\\:size-4 svg){width:1rem;height:1rem}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!h-5 svg){height:1.25rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!h-6 svg){height:1.5rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!w-5 svg){width:1.25rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:\\!w-6 svg){width:1.5rem!important}.lumia-scope :is(.\\[\\&_svg\\]\\:shrink-0 svg){flex-shrink:0}","import React from 'react';\n\nexport type AccountSession = import('../internal/clients/account').AccountSession;\n\ninterface SessionState {\n session: AccountSession | null;\n address: `0x${string}` | null;\n status: string;\n error: string | null;\n recoveryUserId: string | null;\n isRecoveryModalOpen: boolean;\n setSession: (s: AccountSession | null) => void;\n setAddress: (a: `0x${string}` | null) => void;\n setStatus: (s: string) => void;\n setError: (e: string | null) => void;\n setRecoveryUserId: (userId: string | null) => void;\n setIsRecoveryModalOpen: (open: boolean) => void;\n}\n\nconst LumiaPassportSessionContext = React.createContext<SessionState | undefined>(undefined);\n\nexport interface LumiaPassportSessionProviderProps { children: React.ReactNode }\n\nexport const LumiaPassportSessionProvider: React.FC<LumiaPassportSessionProviderProps>\n = ({ children }) => {\n const [session, setSession] = React.useState<AccountSession | null>(null);\n const [address, setAddress] = React.useState<`0x${string}` | null>(null);\n const [status, setStatus] = React.useState<string>('idle');\n const [error, setError] = React.useState<string | null>(null);\n const [recoveryUserId, setRecoveryUserId] = React.useState<string | null>(null);\n const [isRecoveryModalOpen, setIsRecoveryModalOpen] = React.useState<boolean>(false);\n\n const value = React.useMemo(() => ({\n session, address, status, error, recoveryUserId, isRecoveryModalOpen,\n setSession, setAddress, setStatus, setError, setRecoveryUserId, setIsRecoveryModalOpen,\n }), [session, address, status, error, recoveryUserId, isRecoveryModalOpen]);\n\n return <LumiaPassportSessionContext.Provider value={value}>{children}</LumiaPassportSessionContext.Provider>;\n};\n\nexport function useLumiaPassportSession() {\n const ctx = React.useContext(LumiaPassportSessionContext);\n if (!ctx) throw new Error('useLumiaPassportSession must be used within LumiaPassportSessionProvider');\n return ctx;\n}\n\n// TODO: [DEPRECATED] Remove in v2.0.0\n/**\n * @deprecated Use `useLumiaPassportSession` instead. This alias will be removed in v2.0.0\n */\nexport function useLumiaSession() {\n if (typeof window !== 'undefined') {\n console.warn(\n '[Lumia Passport] DEPRECATED: useLumiaSession is deprecated and will be removed in v2.0.0. ' +\n 'Please use useLumiaPassportSession instead.'\n );\n }\n return useLumiaPassportSession();\n}\n\n// TODO: [DEPRECATED] Remove in v2.0.0\n/**\n * @deprecated Use `LumiaPassportSessionProviderProps` instead. This alias will be removed in v2.0.0\n */\nexport type LumiaSessionProviderProps = LumiaPassportSessionProviderProps;\n\n// TODO: [DEPRECATED] Remove in v2.0.0\n/**\n * @deprecated Use `LumiaPassportSessionProvider` instead. This alias will be removed in v2.0.0\n */\nexport const LumiaSessionProvider: React.FC<LumiaSessionProviderProps> = ({ children }) => {\n if (typeof window !== 'undefined') {\n console.warn(\n '[Lumia Passport] DEPRECATED: LumiaSessionProvider is deprecated and will be removed in v2.0.0. ' +\n 'Please use LumiaPassportSessionProvider instead.'\n );\n }\n return <LumiaPassportSessionProvider>{children}</LumiaPassportSessionProvider>;\n};\n","import React from 'react';\nimport '@rainbow-me/rainbowkit/styles.css';\nimport { RainbowKitProvider, Theme, lightTheme, darkTheme } from '@rainbow-me/rainbowkit';\nimport { WagmiProvider } from 'wagmi';\nimport { QueryClientProvider } from '@tanstack/react-query';\nimport { createRainbowConfig, rainbowTheme } from '../config/rainbowkit';\nimport { queryClient } from '../config/wagmi';\nimport { useTheme } from '../internal/hooks/useTheme';\nimport { useLumiaPassportConfig } from './LumiaPassportContext';\n\nexport interface LumiaRainbowKitProviderProps {\n children: React.ReactNode;\n}\n\nexport const LumiaRainbowKitProvider: React.FC<LumiaRainbowKitProviderProps> = ({ children }) => {\n const { config } = useLumiaPassportConfig();\n const { isDark } = useTheme(config.ui.theme, config.ui.colors);\n\n // Create config with projectId from Lumia config\n const rainbowConfig = React.useMemo(() => {\n return createRainbowConfig(config.wallet?.walletConnectProjectId);\n }, [config.wallet?.walletConnectProjectId]);\n\n // Merge custom theme with RainbowKit theme\n const customTheme: Theme = React.useMemo(() => isDark\n ? {\n ...darkTheme(),\n colors: {\n ...darkTheme().colors,\n ...rainbowTheme.darkMode.colors,\n },\n shadows: rainbowTheme.darkMode.shadows,\n radii: rainbowTheme.darkMode.radii,\n }\n : {\n ...lightTheme(),\n colors: {\n ...lightTheme().colors,\n ...rainbowTheme.lightMode.colors,\n },\n shadows: rainbowTheme.lightMode.shadows,\n radii: rainbowTheme.lightMode.radii,\n }, [isDark]);\n\n // Check if wallet provider is enabled\n const isWalletEnabled = config.wallet?.enabled ?? false;\n\n // If wallet is not enabled, just render children without RainbowKit\n if (!isWalletEnabled) {\n return <>{children}</>;\n }\n\n return (\n <WagmiProvider config={rainbowConfig}>\n {/* <QueryClientProvider client={queryClient}> */}\n <RainbowKitProvider\n theme={customTheme}\n modalSize=\"compact\"\n showRecentTransactions={true}\n >\n {children}\n </RainbowKitProvider>\n {/* </QueryClientProvider> */}\n </WagmiProvider>\n );\n};","import { getDefaultConfig } from '@rainbow-me/rainbowkit';\nimport {\n mainnet,\n polygon,\n bsc,\n arbitrum,\n optimism,\n avalanche,\n base,\n zora\n} from 'wagmi/chains';\nimport { lumiaBeam } from '../internal/clients/base';\n\n// Get WalletConnect project ID from environment or use default\nconst getProjectId = (configProjectId?: string) => {\n // First check if provided via config\n if (configProjectId) {\n return configProjectId;\n }\n\n // Check various possible environment variable formats\n if (typeof window !== 'undefined') {\n // Browser environment\n return (window as any).NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID ||\n (window as any).VITE_WALLET_CONNECT_PROJECT_ID ||\n (window as any).__WALLET_CONNECT_PROJECT_ID__ ||\n 'YOUR_PROJECT_ID';\n }\n\n // Default fallback - this will work for testing but not production\n return 'YOUR_PROJECT_ID';\n};\n\n// Create RainbowKit configuration with all popular chains\nexport const createRainbowConfig = (projectId?: string): ReturnType<typeof getDefaultConfig> => {\n return getDefaultConfig({\n appName: 'Lumia Passport',\n projectId: getProjectId(projectId),\n chains: [\n lumiaBeam, // Lumia chain first\n mainnet,\n polygon,\n bsc,\n arbitrum,\n optimism,\n avalanche,\n base,\n zora\n ],\n ssr: false, // Set to true if using SSR\n });\n};\n\n// Default config for backwards compatibility\nexport const rainbowConfig: ReturnType<typeof getDefaultConfig> = createRainbowConfig();\n\n// Custom theme for RainbowKit to match Lumia design\nexport const rainbowTheme = {\n lightMode: {\n colors: {\n accentColor: '#6366F1',\n accentColorForeground: 'white',\n actionButtonBorder: 'rgba(255, 255, 255, 0.04)',\n actionButtonBorderMobile: 'rgba(255, 255, 255, 0.08)',\n actionButtonSecondaryBackground: 'rgba(255, 255, 255, 0.08)',\n closeButton: 'rgba(60, 66, 82, 0.8)',\n closeButtonBackground: 'rgba(255, 255, 255, 0.08)',\n connectButtonBackground: 'white',\n connectButtonBackgroundError: '#FF494A',\n connectButtonInnerBackground: 'linear-gradient(0deg, rgba(255, 255, 255, 0.075), rgba(255, 255, 255, 0.15))',\n connectButtonText: '#1A1B1F',\n connectButtonTextError: 'white',\n connectionIndicator: '#30E000',\n downloadBottomCardBackground: 'linear-gradient(126deg, rgba(0, 0, 0, 0) 9.49%, rgba(120, 120, 120, 0.2) 71.04%), #FFFFFF',\n downloadTopCardBackground: 'linear-gradient(126deg, rgba(120, 120, 120, 0.2) 9.49%, rgba(0, 0, 0, 0) 71.04%), white',\n error: '#FF494A',\n generalBorder: 'rgba(0, 0, 0, 0.06)',\n generalBorderDim: 'rgba(0, 0, 0, 0.03)',\n menuItemBackground: 'rgba(60, 66, 82, 0.1)',\n modalBackdrop: 'rgba(0, 0, 0, 0.3)',\n modalBackground: 'white',\n modalBorder: 'rgba(0, 0, 0, 0.06)',\n modalText: '#1A1B1F',\n modalTextDim: 'rgba(60, 66, 82, 0.3)',\n modalTextSecondary: 'rgba(60, 66, 82, 0.6)',\n profileAction: 'white',\n profileActionHover: 'rgba(255, 255, 255, 0.08)',\n profileForeground: 'rgba(60, 66, 82, 0.06)',\n selectedOptionBorder: 'rgba(60, 66, 82, 0.1)',\n standby: '#FFD641',\n },\n shadows: {\n connectButton: '0px 4px 12px rgba(0, 0, 0, 0.1)',\n dialog: '0px 8px 32px rgba(0, 0, 0, 0.32)',\n profileDetailsAction: '0px 2px 6px rgba(37, 41, 46, 0.04)',\n selectedOption: '0px 2px 6px rgba(0, 0, 0, 0.24)',\n selectedWallet: '0px 2px 6px rgba(0, 0, 0, 0.12)',\n walletLogo: '0px 2px 16px rgba(0, 0, 0, 0.16)',\n },\n radii: {\n actionButton: '24px',\n connectButton: '24px',\n menuButton: '12px',\n modal: '24px',\n modalMobile: '24px',\n },\n },\n darkMode: {\n colors: {\n accentColor: '#6366F1',\n accentColorForeground: 'white',\n actionButtonBorder: 'rgba(255, 255, 255, 0.04)',\n actionButtonBorderMobile: 'rgba(255, 255, 255, 0.08)',\n actionButtonSecondaryBackground: 'rgba(255, 255, 255, 0.08)',\n closeButton: 'rgba(224, 232, 255, 0.6)',\n closeButtonBackground: 'rgba(255, 255, 255, 0.08)',\n connectButtonBackground: '#1A1B1F',\n connectButtonBackgroundError: '#FF494A',\n connectButtonInnerBackground: 'linear-gradient(0deg, rgba(255, 255, 255, 0.075), rgba(255, 255, 255, 0.15))',\n connectButtonText: 'white',\n connectButtonTextError: 'white',\n connectionIndicator: '#30E000',\n downloadBottomCardBackground: 'linear-gradient(126deg, rgba(255, 255, 255, 0) 9.49%, rgba(120, 120, 120, 0.1) 71.04%), #1A1B1F',\n downloadTopCardBackground: 'linear-gradient(126deg, rgba(120, 120, 120, 0.1) 9.49%, rgba(255, 255, 255, 0) 71.04%), #1A1B1F',\n error: '#FF494A',\n generalBorder: 'rgba(255, 255, 255, 0.08)',\n generalBorderDim: 'rgba(255, 255, 255, 0.04)',\n menuItemBackground: 'rgba(224, 232, 255, 0.1)',\n modalBackdrop: 'rgba(0, 0, 0, 0.5)',\n modalBackground: '#1A1B1F',\n modalBorder: 'rgba(255, 255, 255, 0.08)',\n modalText: 'white',\n modalTextDim: 'rgba(224, 232, 255, 0.3)',\n modalTextSecondary: 'rgba(224, 232, 255, 0.6)',\n profileAction: '#1A1B1F',\n profileActionHover: 'rgba(224, 232, 255, 0.1)',\n profileForeground: 'rgba(224, 232, 255, 0.06)',\n selectedOptionBorder: 'rgba(224, 232, 255, 0.1)',\n standby: '#FFD641',\n },\n shadows: {\n connectButton: '0px 4px 12px rgba(0, 0, 0, 0.1)',\n dialog: '0px 8px 32px rgba(0, 0, 0, 0.32)',\n profileDetailsAction: '0px 2px 6px rgba(37, 41, 46, 0.04)',\n selectedOption: '0px 2px 6px rgba(0, 0, 0, 0.24)',\n selectedWallet: '0px 2px 6px rgba(0, 0, 0, 0.12)',\n walletLogo: '0px 2px 16px rgba(0, 0, 0, 0.16)',\n },\n radii: {\n actionButton: '24px',\n connectButton: '24px',\n menuButton: '12px',\n modal: '24px',\n modalMobile: '24px',\n },\n },\n};","import React from 'react';\nimport { flushSync } from 'react-dom';\nimport { useBalance } from 'wagmi';\n\nimport { Button } from '../internal/components/ui/button';\nimport { Dialog, DialogContent, DialogTitle, DialogDescription } from '../internal/components/ui/dialog';\nimport { VisuallyHidden } from '../internal/components/ui/visually-hidden';\nimport { AuthModal } from '../internal/components/AuthModal';\nimport { TssManagerWithRef, type TssManagerRef } from '../internal/components/TssManager';\nimport { ManageWallet } from '../internal/components/ManageWallet';\nimport { SecurityModal } from '../internal/components/SecurityModal';\nimport KeyshareBackup from '../internal/components/KeyshareBackup';\nimport { TransactionsModal } from '../internal/components/TransactionsModal';\nimport { ViewAssetsModal } from '../internal/components/ViewAssetsModal';\nimport { SendModal } from '../internal/components/SendModal';\nimport { ReceiveModal } from '../internal/components/ReceiveModal';\nimport { BuyModal } from '../internal/components/BuyModal';\nimport { KycModal } from '../internal/components/KycModal';\nimport { jwtTokenManager, verifyToken, ensureValidToken } from '../internal/auth';\nimport { getBackupStatus } from '../internal/vaultClient';\nimport { Cloud, Laptop, Shield, Copy, ArrowUp, ArrowDown, Plus, Activity, Gem, CreditCard, Lock, ArrowUpRight, AlertTriangle, ShieldCheck } from 'lucide-react';\nimport { useLumiaPassportConfig } from '../context/LumiaPassportContext';\nimport { useTheme } from '../internal/hooks/useTheme';\nimport { useLumiaPassportSession } from '../context/LumiaPassportSessionContext';\nimport { lumiaBeam, LUMIA_EXPLORER_URL } from '../internal/clients/base';\nimport { LumiaLogo } from '../internal/components/LumiaLogo';\nimport { useLumiaPassportLinkedProfiles } from '../modules/linkedProfiles';\nimport packageJson from '../../package.json';\n\nexport interface ConnectWalletButtonProps {\n className?: string;\n label?: string;\n usePaymaster?: boolean;\n authOpen?: boolean;\n mode?: 'default' | 'compact';\n callbacks?: import('../context/LumiaPassportContext').LumiaPassportCallbacks;\n onConnected?: (params: { address: `0x${string}`; session: any }) => void;\n}\n\nexport const ConnectWalletButton: React.FC<ConnectWalletButtonProps> = ({\n className,\n label = 'Connect Wallet',\n usePaymaster = true,\n authOpen,\n mode = 'default',\n callbacks: buttonCallbacks,\n onConnected,\n}) => {\n console.log('[ConnectWalletButton] Component rendering');\n const { config, callbacks: contextCallbacks } = useLumiaPassportConfig() as any;\n\n // Merge callbacks: button props override context callbacks\n const callbacks = React.useMemo(() => ({\n onLumiaPassportConnecting: buttonCallbacks?.onLumiaPassportConnecting ?? contextCallbacks?.onLumiaPassportConnecting,\n onLumiaPassportConnect: buttonCallbacks?.onLumiaPassportConnect ?? contextCallbacks?.onLumiaPassportConnect,\n onLumiaPassportAccount: buttonCallbacks?.onLumiaPassportAccount ?? contextCallbacks?.onLumiaPassportAccount,\n onLumiaPassportUpdate: buttonCallbacks?.onLumiaPassportUpdate ?? contextCallbacks?.onLumiaPassportUpdate,\n onLumiaPassportDisconnect: buttonCallbacks?.onLumiaPassportDisconnect ?? contextCallbacks?.onLumiaPassportDisconnect,\n onLumiaPassportError: buttonCallbacks?.onLumiaPassportError ?? contextCallbacks?.onLumiaPassportError,\n onWalletReady: buttonCallbacks?.onWalletReady ?? contextCallbacks?.onWalletReady,\n }), [buttonCallbacks, contextCallbacks]);\n const { theme: resolvedTheme, isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n const {\n session, address, status, error,\n recoveryUserId, isRecoveryModalOpen,\n setSession, setAddress, setStatus, setError,\n setRecoveryUserId, setIsRecoveryModalOpen\n } = useLumiaPassportSession();\n const { profiles, isLoading: profilesLoading } = useLumiaPassportLinkedProfiles();\n\n\n const [isAuthModalOpen, setIsAuthModalOpen] = React.useState(false);\n const tssManagerRef = React.useRef<TssManagerRef>(null);\n const [isWalletMenuOpen, setIsWalletMenuOpen] = React.useState(false);\n\n\n const [copied, setCopied] = React.useState(false);\n const [isManageWalletOpen, setIsManageWalletOpen] = React.useState(false);\n const [isSecurityOpen, setIsSecurityOpen] = React.useState(false);\n const [isBackupOpen, setIsBackupOpen] = React.useState(false);\n const [isTransactionsOpen, setIsTransactionsOpen] = React.useState(false);\n const [isViewAssetsOpen, setIsViewAssetsOpen] = React.useState(false);\n const [isSendOpen, setIsSendOpen] = React.useState(false);\n const [isReceiveOpen, setIsReceiveOpen] = React.useState(false);\n const [isBuyOpen, setIsBuyOpen] = React.useState(false);\n const [isKycOpen, setIsKycOpen] = React.useState(false);\n\n // Register onWalletReady callback with iframe manager\n React.useEffect(() => {\n if (!callbacks?.onWalletReady) return;\n if (!config.projectId) {\n // Skip if projectId not configured - iframe manager won't be initialized\n return;\n }\n\n (async () => {\n try {\n const { getIframeManager } = await import('../internal/lib/iframe-manager');\n const iframeManager = getIframeManager();\n iframeManager.setOnWalletReady(callbacks.onWalletReady);\n } catch (e) {\n console.warn('[UI-KIT] Failed to register onWalletReady callback:', e);\n }\n })();\n }, [callbacks?.onWalletReady, config.projectId]);\n\n // Auto-open Auth modal on mount when configured and user not authenticated/connected\n React.useEffect(() => {\n try {\n // authOpen prop overrides config.ui.authOpen\n const shouldAutoOpen = authOpen ?? config?.ui?.authOpen;\n if (!address && !session && shouldAutoOpen) {\n const isAuthenticated = jwtTokenManager.isAuthenticated?.();\n if (!isAuthenticated) {\n // Trigger onLumiaPassportConnecting when auto-opening modal\n try { callbacks?.onLumiaPassportConnecting?.({ method: 'wallet' }); } catch {}\n setIsAuthModalOpen(true);\n }\n }\n } catch {}\n // run once on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const { data: balance, isLoading: balanceLoading, refetch: refetchBalance } = useBalance({\n address: address as `0x${string}` | undefined,\n chainId: lumiaBeam.id,\n query: {\n enabled: !!address,\n refetchInterval: 30000, // Refetch every 30 seconds\n refetchOnMount: true,\n refetchOnWindowFocus: true,\n },\n });\n\n const formatAddress = React.useCallback((addr: `0x${string}` | null) => {\n if (!addr) return '';\n return `${addr.slice(0, 6)}...${addr.slice(-4)}`;\n }, []);\n\n const avatar = React.useMemo(() => jwtTokenManager.getAvatar(), [isAuthModalOpen, status]);\n const displayName = React.useMemo(() => jwtTokenManager.getDisplayName(), [isAuthModalOpen, status]);\n\n const formatBalance = React.useCallback(() => {\n if (!balance || balanceLoading) return '0.0000';\n return parseFloat(balance.formatted).toFixed(4);\n }, [balance, balanceLoading]);\n\n const [hasServerVault, setHasServerVault] = React.useState(false);\n\n const indicators = React.useMemo(() => {\n const userId = jwtTokenManager.getUserId();\n if (!userId) return { server: false, local: false, backup: false };\n // Note: In iframe mode, local keyshare is stored in iframe's isolated localStorage\n // We can't directly check it from parent context, so we use server indicator\n // The local indicator now means \"has session with iframe\"\n const server = jwtTokenManager.getHasKeyshare() ?? false;\n const local = !!address; // If address exists, iframe has keyshare\n // Use the actual server vault status instead of local backup status\n return { server, local, backup: hasServerVault };\n }, [session, address, hasServerVault]);\n\n const handleAuthModalSuccess = React.useCallback(async () => {\n // Get pending login response from AuthModal (tokens not yet saved)\n const { getPendingLoginResponse, clearPendingLoginResponse } = await import('../internal/components/AuthModal');\n const loginResponse = getPendingLoginResponse();\n\n if (!loginResponse || !loginResponse.userId) {\n setError('Authentication failed - no login data available');\n return;\n }\n\n const userId = loginResponse.userId;\n const hasServerKeyshare = loginResponse.hasKeyshare ?? false;\n\n try {\n // Authenticate with iframe FIRST - this shows consent modal and waits for user action\n // If user clicks Cancel, this will throw an error and prevent token saving\n if (!config.projectId) {\n throw new Error('projectId is not configured. Cannot authenticate with iframe.');\n }\n\n const { getIframeManager } = await import('../internal/lib/iframe-manager');\n const iframeManager = getIframeManager();\n await iframeManager.authenticate(userId);\n\n // User approved consent! Now save the tokens to localStorage\n await jwtTokenManager.setTokens(loginResponse);\n clearPendingLoginResponse();\n\n // Only create session if iframe authentication succeeded (user clicked Authorize)\n const jwt = await import('../internal/auth').then(m => m.jwtTokenManager.getTokens());\n const { session: sess, address: addr } = await createSessionWithKeyshare(userId, hasServerKeyshare, jwt?.isNewUser);\n setSession(sess);\n setAddress(addr);\n setStatus('ready');\n setIsAuthModalOpen(false);\n onConnected?.({ address: addr, session: sess });\n try { callbacks?.onLumiaPassportConnect?.({ address: addr, session: sess }); } catch {}\n try { callbacks?.onLumiaPassportAccount?.({ userId, address: addr, session: sess, hasKeyshare: hasServerKeyshare }); } catch {}\n\n // Fetch vault status and update local backup indicators\n try {\n const { checkServerBackupAvailability, updateBackupStatus, getShareRecoveryStats } = await import('../internal/vaultClient');\n const result = await checkServerBackupAvailability();\n if (result.hasBackup) updateBackupStatus(userId, 'server', { enabled: true, lastBackup: Date.now() });\n else updateBackupStatus(userId, 'server', { enabled: false, error: 'No server vault found' });\n\n // Update vault status indicator\n const stats = await getShareRecoveryStats();\n const hasRecoveryData = stats && (stats.created || (stats.devices && stats.devices.length > 0));\n setHasServerVault(!!hasRecoveryData);\n } catch (e) { console.warn('[UI-KIT] Vault status check failed:', e); }\n } catch (e: any) {\n if (e?.code === 'KEYSHARE_RECOVERY_NEEDED') {\n // For recovery errors, DON'T clear tokens - they're needed for backup restoration\n // Only clear the pending login response\n clearPendingLoginResponse();\n\n // Use flushSync to immediately apply state updates\n flushSync(() => {\n setRecoveryUserId(userId);\n setIsRecoveryModalOpen(true); // Open recovery modal\n setStatus('recovery_needed');\n setError(null);\n });\n // Don't throw - recovery modal will handle this\n } else {\n // Clear pending login response AND tokens on other errors (including user clicking Cancel)\n // Tokens might have been saved temporarily for DisplayNameInput\n clearPendingLoginResponse();\n await jwtTokenManager.clearTokens();\n\n setError(e?.message || String(e));\n setStatus('error');\n // Re-throw error so AuthModal can handle it (e.g., show Failed screen)\n throw e;\n }\n }\n }, [onConnected, setAddress, setError, setSession, setStatus]);\n\n const handleDisconnect = React.useCallback(async () => {\n const prevAddress = address;\n let userId: string | null = null;\n try { userId = jwtTokenManager.getUserId() || null; } catch {}\n try { await import('@/auth').then(m => m.logout()); } catch {}\n setSession(null);\n setAddress(null);\n setStatus('idle');\n setError(null);\n try { callbacks?.onLumiaPassportDisconnect?.({ address: prevAddress as any, userId }); } catch {}\n }, [setAddress, setError, setSession, setStatus]);\n\n // Internal function to create session with keyshare (doesn't depend on TssManager component)\n const createSessionWithKeyshare = React.useCallback(async (userId: string, hasServerKeyshare: boolean, isNewUser?: boolean) => {\n try {\n // Notify that wallet connection process is starting\n try { callbacks?.onLumiaPassportConnecting?.({ method: 'wallet' }); } catch {}\n\n setStatus('checking key management setup...');\n\n const { ensureKeyshare } = await import('../internal/auth');\n await ensureKeyshare(userId, hasServerKeyshare, setStatus, isNewUser);\n\n setStatus('creating smart account...');\n const { createAccountSession, getEntryPointDeposit } = await import('../internal/clients');\n const sess = await createAccountSession({ mpcUserId: userId, mpcPin: undefined, usePaymaster });\n\n const addr = sess.address || sess.smartAccountAddress;\n setStatus('loading account data...');\n try { await getEntryPointDeposit(addr); } catch {}\n\n return { session: sess, address: addr };\n } catch (error: any) {\n // Don't reset status for recovery errors - caller will set the correct status\n if (error?.code !== 'KEYSHARE_RECOVERY_NEEDED') {\n setStatus('idle');\n }\n\n throw error; // Re-throw so caller can handle specific errors\n }\n }, [usePaymaster, setStatus, callbacks]);\n\n // Check vault status when address changes\n React.useEffect(() => {\n if (address) {\n (async () => {\n try {\n const { getShareRecoveryStats } = await import('../internal/vaultClient');\n const stats = await getShareRecoveryStats();\n const hasRecoveryData = stats && (stats.created || (stats.devices && stats.devices.length > 0));\n setHasServerVault(!!hasRecoveryData);\n } catch (e) {\n console.warn('[UI-KIT] Failed to check vault status:', e);\n setHasServerVault(false);\n }\n })();\n } else {\n setHasServerVault(false);\n }\n }, [address]);\n\n // Listen for backup status changes\n React.useEffect(() => {\n const handleBackupStatusChanged = async (event: Event) => {\n const customEvent = event as CustomEvent;\n const { method, success } = customEvent.detail || {};\n\n console.log('[ConnectWalletButton] Backup status changed:', { method, success });\n\n // If server backup was created successfully, update vault status\n if (method === 'server' && success) {\n try {\n const { getShareRecoveryStats } = await import('../internal/vaultClient');\n const stats = await getShareRecoveryStats();\n const hasRecoveryData = stats && (stats.created || (stats.devices && stats.devices.length > 0));\n setHasServerVault(!!hasRecoveryData);\n } catch (e) {\n console.warn('[UI-KIT] Failed to refresh vault status after backup:', e);\n }\n }\n };\n\n window.addEventListener('lumia-passport-backup-status-changed', handleBackupStatusChanged);\n return () => {\n window.removeEventListener('lumia-passport-backup-status-changed', handleBackupStatusChanged);\n };\n }, []);\n\n // Auto-connect on refresh if valid tokens present\n const autoConnectAttemptedRef = React.useRef(false);\n\n React.useEffect(() => {\n // Skip if already attempted in this session\n if (autoConnectAttemptedRef.current) return;\n\n const tryAutoConnect = async (attempt: number) => {\n if (address || session) return;\n\n // Skip auto-connect if projectId not configured\n if (!config.projectId) {\n return;\n }\n\n // IMPORTANT: Wait for iframe to be ready before proceeding\n try {\n const { waitForIframe } = await import('../internal/lib/iframe-manager');\n await waitForIframe();\n } catch (iframeError) {\n console.error('[UI-KIT][AutoConnect] Failed to initialize iframe:', iframeError);\n // Retry after delay\n if (attempt < 20) {\n setTimeout(() => tryAutoConnect(attempt + 1), 500);\n }\n return;\n }\n\n // Step 1: Ensure we have a valid access token (refresh if needed)\n const hasValid = await ensureValidToken();\n if (!hasValid) return;\n\n // Step 2: Get user info from token manager\n const userId = jwtTokenManager.getUserId();\n const hasKeyshare = jwtTokenManager.getHasKeyshare();\n\n // Optionally verify token to sync hasKeyshare status\n let verify = await verifyToken();\n\n if (!userId) {\n console.warn('[UI-KIT][AutoConnect] No userId found in tokens after successful validation');\n return;\n }\n\n // Use hasKeyshare from verification if available, otherwise use from token manager\n const finalHasKeyshare = verify?.hasKeyshare ?? hasKeyshare ?? false;\n\n try { callbacks?.onLumiaPassportAccount?.({ userId, address: null, session: null, hasKeyshare: finalHasKeyshare }); } catch {}\n\n try {\n // Step 3: Create session with keyshare\n const jwt = await import('../internal/auth').then(m => m.jwtTokenManager.getTokens());\n const { session: sess, address: addr } = await createSessionWithKeyshare(userId, finalHasKeyshare, jwt?.isNewUser);\n\n setSession(sess);\n setAddress(addr);\n setStatus('ready');\n\n onConnected?.({ address: addr, session: sess });\n try { callbacks?.onLumiaPassportConnect?.({ address: addr, session: sess }); } catch {}\n try { callbacks?.onLumiaPassportAccount?.({ userId, address: addr, session: sess, hasKeyshare: finalHasKeyshare }); } catch {}\n\n // Authenticate with iframe to trigger wallet ready check\n if (config.projectId) {\n try {\n const { getIframeManager } = await import('../internal/lib/iframe-manager');\n const iframeManager = getIframeManager();\n await iframeManager.authenticate(userId);\n } catch (e) {\n console.warn('[UI-KIT][AutoConnect] iframe authentication failed:', e);\n }\n }\n\n // Step 4: Update vault status\n try {\n const { checkServerBackupAvailability, updateBackupStatus, getShareRecoveryStats } = await import('../internal/vaultClient');\n const result = await checkServerBackupAvailability();\n if (result.hasBackup) updateBackupStatus(userId, 'server', { enabled: true, lastBackup: Date.now() });\n else updateBackupStatus(userId, 'server', { enabled: false, error: 'No server vault found' });\n\n // Update vault status indicator\n const stats = await getShareRecoveryStats();\n const hasRecoveryData = stats && (stats.created || (stats.devices && stats.devices.length > 0));\n setHasServerVault(!!hasRecoveryData);\n } catch (e) { console.warn('[UI-KIT][AutoConnect] Vault status check failed:', e); }\n\n } catch (e: any) {\n if (e?.code === 'KEYSHARE_RECOVERY_NEEDED') {\n // Set recovery state to open the recovery modal\n flushSync(() => {\n setRecoveryUserId(userId);\n setError(null);\n });\n\n flushSync(() => {\n setIsRecoveryModalOpen(true);\n });\n\n flushSync(() => {\n setStatus('recovery_needed');\n });\n } else {\n console.warn('[UI-KIT][AutoConnect] Unexpected error during auto-connect:', e);\n }\n }\n };\n\n autoConnectAttemptedRef.current = true;\n tryAutoConnect(0);\n }, []);\n\n // Fetch balance only once when address is set\n React.useEffect(() => {\n if (address && refetchBalance) {\n refetchBalance();\n }\n }, [address]);\n\n return (\n <div className={[className, 'lumia-scope'].filter(Boolean).join(' ')}>\n <div className=\"inline-flex items-center gap-2\">\n {!address ? (\n <div style={{ display: 'flex', justifyContent: 'center' }}>\n <button\n onClick={() => {\n setIsAuthModalOpen(true);\n }}\n className=\"lumia-gradient-btn\"\n style={{\n height: '4rem',\n paddingLeft: '3rem',\n paddingRight: '3rem',\n fontSize: '1.25rem',\n fontWeight: '600',\n color: config.ui.colors?.[isDark ? 'dark' : 'light']?.buttonText || 'white',\n borderRadius: '1rem',\n background: config.ui.colors?.[isDark ? 'dark' : 'light']?.buttonBackground && config.ui.colors?.[isDark ? 'dark' : 'light']?.buttonBackgroundEnd\n ? `linear-gradient(to right, ${config.ui.colors[isDark ? 'dark' : 'light']?.buttonBackground}, ${config.ui.colors[isDark ? 'dark' : 'light']?.buttonBackgroundEnd})`\n : 'linear-gradient(to right, #9333ea, #2563eb)',\n boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)',\n transition: 'all 0.2s',\n border: 'none',\n cursor: 'pointer'\n }}\n onMouseEnter={(e) => {\n const hoverBg = config.ui.colors?.[isDark ? 'dark' : 'light']?.buttonBackgroundHover && config.ui.colors?.[isDark ? 'dark' : 'light']?.buttonBackgroundHoverEnd\n ? `linear-gradient(to right, ${config.ui.colors[isDark ? 'dark' : 'light']?.buttonBackgroundHover}, ${config.ui.colors[isDark ? 'dark' : 'light']?.buttonBackgroundHoverEnd})`\n : 'linear-gradient(to right, #7e22ce, #1d4ed8)';\n e.currentTarget.style.background = hoverBg;\n e.currentTarget.style.transform = 'scale(1.05)';\n e.currentTarget.style.boxShadow = '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)';\n }}\n onMouseLeave={(e) => {\n const normalBg = config.ui.colors?.[isDark ? 'dark' : 'light']?.buttonBackground && config.ui.colors?.[isDark ? 'dark' : 'light']?.buttonBackgroundEnd\n ? `linear-gradient(to right, ${config.ui.colors[isDark ? 'dark' : 'light']?.buttonBackground}, ${config.ui.colors[isDark ? 'dark' : 'light']?.buttonBackgroundEnd})`\n : 'linear-gradient(to right, #9333ea, #2563eb)';\n e.currentTarget.style.background = normalBg;\n e.currentTarget.style.transform = 'scale(1)';\n e.currentTarget.style.boxShadow = '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)';\n }}\n >\n {label || 'Connect'}\n </button>\n </div>\n ) : (\n <div\n className={`relative rounded-2xl p-4 shadow-lg cursor-pointer transition-all duration-200 hover:scale-105 hover:shadow-xl max-w-sm min-w-[280px] backdrop-blur`}\n style={{\n backgroundColor: config.ui.colors?.[isDark ? 'dark' : 'light']?.connectedButtonBackground || (isDark ? 'rgba(17, 24, 39, 0.4)' : '#ffffff'),\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: config.ui.colors?.[isDark ? 'dark' : 'light']?.connectedButtonBorder || (isDark ? '#374151' : '#e5e7eb'),\n }}\n onClick={() => setIsWalletMenuOpen(true)}\n >\n <div className=\"flex items-center space-x-3\">\n <div className=\"w-10 h-10 rounded-full flex items-center justify-center flex-shrink-0 overflow-hidden bg-gradient-to-br from-purple-500 to-blue-600\">\n {avatar ? (\n // eslint-disable-next-line @next/next/no-img-element\n <img src={avatar} alt=\"User avatar\" className=\"w-full h-full object-cover\" />\n ) : (\n <span className=\"text-white font-bold text-sm\">LP</span>\n )}\n </div>\n <div className=\"text-left flex-1 min-w-0\">\n <div className={`font-semibold text-base truncate ${theme.titleText}`}>\n {mode === 'compact' && displayName ? displayName : formatAddress(address)}\n </div>\n <div className={`text-sm ${theme.mutedText}`}>{formatBalance()} LUMIA</div>\n </div>\n <div className=\"flex items-center space-x-1\">\n <div className=\"group relative\">\n <Cloud\n className={`w-3 h-3 ${indicators.server ? 'text-green-500' : 'text-orange-400'}`}\n />\n <div className=\"absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-gray-800 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-50\">\n Server Keyshare: {indicators.server ? 'Available' : 'Missing'}\n </div>\n </div>\n <div className=\"group relative\">\n <Laptop\n className={`w-3 h-3 ${indicators.local ? 'text-green-500' : 'text-orange-400'}`}\n />\n <div className=\"absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-gray-800 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-50\">\n Local Keyshare: {indicators.local ? 'Available' : 'Missing'}\n </div>\n </div>\n <div className=\"group relative\">\n <Shield\n className={`w-3 h-3 ${indicators.backup ? 'text-green-500' : 'text-orange-400'}`}\n />\n <div className=\"absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-gray-800 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-50\">\n Vault Backup: {indicators.backup ? 'Available' : 'Not Found'}\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Wallet Menu Modal */}\n {isWalletMenuOpen && address && (\n <div className=\"fixed inset-0 z-[60]\">\n <Dialog open={isWalletMenuOpen} onOpenChange={setIsWalletMenuOpen}>\n <DialogContent className={`lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden gap-0 ${isDark ? 'lumia-dark' : 'lumia-light'}`}>\n <VisuallyHidden>\n <DialogTitle>Wallet Menu</DialogTitle>\n </VisuallyHidden>\n <DialogDescription className=\"sr-only\">Smart Account wallet actions and status</DialogDescription>\n <div className={`p-4 border-b ${theme.divider}`}>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-4\">\n <div className=\"w-12 h-12 bg-gradient-to-br from-purple-500 to-blue-600 rounded-full flex items-center justify-center relative overflow-hidden\">\n {avatar ? (\n // eslint-disable-next-line @next/next/no-img-element\n <img src={avatar} alt=\"User avatar\" className=\"w-full h-full object-cover\" />\n ) : (\n <span className=\"text-white font-bold text-lg\">L</span>\n )}\n {/* TODO: Add recovery indicator */}\n {/* <div className={`absolute -bottom-1 -right-1 w-6 h-6 bg-green-500 rounded-full flex items-center justify-center border-2 ${isDark ? 'border-gray-900' : 'border-white'}`}>\n <span className=\"text-white text-xs\">✓</span>\n </div> */}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className={`font-medium text-left text-lg ${theme.titleText}`}>{displayName || 'Smart Account'}</div>\n <div className=\"flex items-center space-x-2\">\n <div className={`text-sm ${theme.mutedText}`}>{formatAddress(address)}</div>\n <button onClick={async () => { try { await navigator.clipboard.writeText(address); setCopied(true); setTimeout(() => setCopied(false), 1500); } catch {} }} title=\"Copy address\" className={`${theme.iconColor} hover:${theme.titleText} p-1`}>\n {copied ? <span className=\"text-green-500 text-sm\">✓</span> : <Copy className=\"w-4 h-4\" />}\n </button>\n </div>\n </div>\n </div>\n {/* Use built-in close button from DialogContent; no extra X here */}\n </div>\n </div>\n\n <div className=\"p-4\">\n <div className=\"grid grid-cols-3 gap-2 mb-4\">\n <button onClick={() => { setIsWalletMenuOpen(false); setIsSendOpen(true); }} className={`${isDark ? 'bg-slate-900 hover:bg-slate-800 text-blue-400' : 'bg-blue-50 hover:bg-blue-100 text-blue-600'} rounded-xl p-3 transition-colors flex items-center justify-center gap-2`}>\n <ArrowUp className=\"w-5 h-5\" />\n <span className=\"text-sm font-medium\">Send</span>\n </button>\n <button onClick={() => { setIsWalletMenuOpen(false); setIsReceiveOpen(true); }} className={`${isDark ? 'bg-slate-900 hover:bg-slate-800 text-green-400' : 'bg-green-50 hover:bg-green-100 text-green-600'} rounded-xl p-3 transition-colors flex items-center justify-center gap-2`}>\n <ArrowDown className=\"w-5 h-5\" />\n <span className=\"text-sm font-medium\">Receive</span>\n </button>\n <button onClick={() => { setIsWalletMenuOpen(false); setIsBuyOpen(true); }} className={`${isDark ? 'bg-slate-900 hover:bg-slate-800 text-purple-400' : 'bg-purple-50 hover:bg-purple-100 text-purple-600'} rounded-xl p-3 transition-colors flex items-center justify-center gap-2`}>\n <Plus className=\"w-5 h-5\" />\n <span className=\"text-sm font-medium\">Buy</span>\n </button>\n </div>\n\n {/* Backup Warning */}\n {config.warnings?.backupWarning && !hasServerVault && (\n <div className={`mb-4 p-4 rounded-xl animate-glow-warning ${isDark ? 'bg-red-950/90 border-2 border-red-800/80' : 'bg-red-50 border-2 border-red-300'}`}>\n <div className=\"flex items-start space-x-3 text-center\">\n <div className=\"flex-1 min-w-0\">\n <div className={`text-sm font-bold ${isDark ? 'text-red-200' : 'text-red-800'}`}>\n BACKUP NOT CREATED\n </div>\n <div className={`text-xs mt-1.5 font-medium ${isDark ? 'text-red-300/95' : 'text-red-700'}`}>\n Your wallet will be <strong>PERMANENTLY LOST</strong> if browser data is cleared.\n </div>\n <div className={`text-[11px] mt-1 ${isDark ? 'text-red-400/80' : 'text-red-600/90'}`}>\n ⚠️ Lumia cannot recover your wallet without a backup!\n </div>\n <button\n onClick={() => { setIsWalletMenuOpen(false); setIsBackupOpen(true); }}\n className={`mt-3 px-4 py-2 text-xs font-bold rounded-lg transition-all hover:scale-105 ${\n isDark\n ? 'bg-red-700/80 hover:bg-red-600/90 text-white shadow-lg'\n : 'bg-red-600 hover:bg-red-700 text-white shadow-lg'\n }`}\n >\n <ShieldCheck className=\"w-3.5 h-3.5 inline mr-1.5\" />\n Create Backup Now\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Email Not Connected Warning */}\n {(() => {\n // Get providers from JWT tokens (faster than API call)\n const providers = jwtTokenManager.getProviders();\n const hasEmail = providers.includes('email');\n return config.warnings?.emailNotConnectedWarning && !hasEmail && (\n <div className={`mb-4 p-3 rounded-xl ${isDark ? 'bg-blue-900/20 border border-blue-900/40' : 'bg-blue-50 border border-blue-200'}`}>\n <div className=\"flex items-start space-x-3\">\n <AlertTriangle className={`w-5 h-5 ${isDark ? 'text-blue-400' : 'text-blue-500'} mt-0.5 flex-shrink-0`} />\n <div className=\"flex-1 min-w-0\">\n <div className={`text-sm font-medium ${isDark ? 'text-blue-300' : 'text-blue-700'}`}>\n Email Not Connected\n </div>\n <div className={`text-xs mt-1 ${isDark ? 'text-blue-400/80' : 'text-blue-600'}`}>\n Connect your email for easier account recovery and additional security.\n </div>\n <button\n onClick={() => { setIsWalletMenuOpen(false); setIsManageWalletOpen(true); }}\n className={`mt-2 px-3 py-1.5 text-xs font-medium rounded-lg transition-colors ${\n isDark\n ? 'bg-blue-900/40 hover:bg-blue-900/60 text-blue-300'\n : 'bg-blue-100 hover:bg-blue-200 text-blue-700'\n }`}\n >\n <ShieldCheck className=\"w-3 h-3 inline mr-1\" />\n Connect Email\n </button>\n </div>\n </div>\n </div>\n );\n })()}\n\n {/* Network */}\n <button\n onClick={() => address && window.open(`${LUMIA_EXPLORER_URL}/address/${address}`, '_blank')}\n className={`w-full ${isDark ? 'bg-gray-800 hover:bg-gray-700' : 'bg-gray-50 hover:bg-gray-100'} rounded-xl p-3 mb-3 transition-colors cursor-pointer text-left`}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-3\">\n <div className=\"w-8 h-8 rounded-full flex items-center justify-center bg-transparent overflow-hidden\">\n {((lumiaBeam as any).logoDataUri) ? (\n <img src={(lumiaBeam as any).logoDataUri} alt=\"Chain logo\" className=\"w-full h-full object-cover\" />\n ) : ((lumiaBeam as any).logo === 'lumia') ? (\n <LumiaLogo size={32} />\n ) : (\n <span className=\"text-white text-xs font-bold\">{(lumiaBeam.name || 'L').charAt(0)}</span>\n )}\n </div>\n <div>\n <div className={`${theme.titleText} font-medium`}>{lumiaBeam.name}</div>\n <div className={theme.mutedText + ' text-sm'}>{formatBalance()} LUMIA</div>\n </div>\n </div>\n <div className={theme.iconColor}>\n <ArrowUpRight className=\"w-4 h-4\" />\n </div>\n </div>\n </button>\n\n <div className=\"space-y-1\">\n {config.features?.kycNeeded && (\n <button onClick={() => { setIsWalletMenuOpen(false); setIsKycOpen(true); }} className={`w-full text-left p-2.5 rounded-xl ${isDark ? 'bg-transparent hover:bg-gray-800' : 'bg-transparent hover:bg-gray-100'} transition-colors flex items-center space-x-3`}>\n <ShieldCheck className={`w-5 h-5 ${theme.iconColor}`} />\n <span className={theme.titleText}>KYC</span>\n </button>\n )}\n <button onClick={() => { setIsWalletMenuOpen(false); setIsTransactionsOpen(true); }} className={`w-full text-left p-2.5 rounded-xl ${isDark ? 'bg-transparent hover:bg-gray-800' : 'bg-transparent hover:bg-gray-100'} transition-colors flex items-center space-x-3`}>\n <Activity className={`w-5 h-5 ${theme.iconColor}`} />\n <span className={theme.titleText}>Transactions</span>\n </button>\n <button onClick={() => { setIsWalletMenuOpen(false); setIsViewAssetsOpen(true); }} className={`w-full text-left p-2.5 rounded-xl ${isDark ? 'bg-transparent hover:bg-gray-800' : 'bg-transparent hover:bg-gray-100'} transition-colors flex items-center space-x-3`}>\n <Gem className={`w-5 h-5 ${theme.iconColor}`} />\n <span className={theme.titleText}>View Assets</span>\n </button>\n <button onClick={() => { setIsWalletMenuOpen(false); setIsManageWalletOpen(true); }} className={`w-full text-left p-2.5 rounded-xl ${isDark ? 'bg-transparent hover:bg-gray-800' : 'bg-transparent hover:bg-gray-100'} transition-colors flex items-center space-x-3`}>\n <CreditCard className={`w-5 h-5 ${theme.iconColor}`} />\n <span className={theme.titleText}>Manage Wallet</span>\n </button>\n <button onClick={() => { setIsWalletMenuOpen(false); setIsSecurityOpen(true); }} className={`w-full text-left p-2.5 rounded-xl ${isDark ? 'bg-transparent hover:bg-gray-800' : 'bg-transparent hover:bg-gray-100'} transition-colors flex items-center space-x-3`}>\n <Lock className={`w-5 h-5 ${theme.iconColor}`} />\n <span className={theme.titleText}>Security</span>\n </button>\n <button onClick={() => { setIsWalletMenuOpen(false); setIsBackupOpen(true); }} className={`w-full text-left p-2.5 rounded-xl ${isDark ? 'bg-transparent hover:bg-gray-800' : 'bg-transparent hover:bg-gray-100'} transition-colors flex items-center space-x-3`}>\n <Shield className={`w-5 h-5 ${theme.iconColor}`} />\n <span className={theme.titleText}>Keyshare Backup</span>\n </button>\n <button onClick={async () => { await handleDisconnect(); setIsWalletMenuOpen(false); }} className={`w-full text-left p-2.5 rounded-xl ${isDark ? 'bg-transparent hover:bg-red-900/20' : 'bg-transparent hover:bg-red-50'} transition-colors flex items-center space-x-3`}>\n <ArrowUpRight className=\"w-5 h-5 text-red-600\" />\n <span className=\"text-red-600\">Disconnect Wallet</span>\n </button>\n </div>\n\n {/* Version Footer */}\n <div className={`mt-3 pt-3 border-t ${theme.divider} text-center`}>\n <div className={`text-xs ${theme.mutedText}`}>\n Lumia Passport v{packageJson.version}\n </div>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n )}\n\n {/* Manage Wallet and Security modals */}\n <ManageWallet\n open={isManageWalletOpen}\n onOpenChange={setIsManageWalletOpen}\n onBack={() => {\n setIsManageWalletOpen(false);\n setIsWalletMenuOpen(true);\n }}\n />\n <SecurityModal\n open={isSecurityOpen}\n onOpenChange={setIsSecurityOpen}\n onBack={() => {\n setIsSecurityOpen(false);\n setIsWalletMenuOpen(true);\n }}\n />\n {isBackupOpen && session?.mpcUserId && (\n <Dialog open={isBackupOpen} onOpenChange={setIsBackupOpen}>\n <DialogContent className=\"max-w-[400px] p-0\">\n <VisuallyHidden>\n <DialogTitle>Keyshare Backup</DialogTitle>\n <DialogDescription>Create and manage encrypted backups of your keyshare</DialogDescription>\n </VisuallyHidden>\n <KeyshareBackup\n userId={session.mpcUserId}\n onBackupSuccess={() => {\n console.log('[ConnectWalletButton] Backup created successfully');\n }}\n onBack={() => {\n setIsBackupOpen(false);\n setIsWalletMenuOpen(true);\n }}\n />\n </DialogContent>\n </Dialog>\n )}\n <TransactionsModal\n open={isTransactionsOpen}\n onOpenChange={setIsTransactionsOpen}\n onBack={() => {\n setIsTransactionsOpen(false);\n setIsWalletMenuOpen(true);\n }}\n />\n <ViewAssetsModal\n open={isViewAssetsOpen}\n onOpenChange={setIsViewAssetsOpen}\n onBack={() => {\n setIsViewAssetsOpen(false);\n setIsWalletMenuOpen(true);\n }}\n />\n <SendModal\n open={isSendOpen}\n onOpenChange={setIsSendOpen}\n onBack={() => {\n setIsSendOpen(false);\n setIsWalletMenuOpen(true);\n }}\n />\n <ReceiveModal\n open={isReceiveOpen}\n onOpenChange={setIsReceiveOpen}\n onBack={() => {\n setIsReceiveOpen(false);\n setIsWalletMenuOpen(true);\n }}\n />\n <BuyModal\n open={isBuyOpen}\n onOpenChange={setIsBuyOpen}\n onBack={() => {\n setIsBuyOpen(false);\n setIsWalletMenuOpen(true);\n }}\n />\n <KycModal\n open={isKycOpen}\n onOpenChange={setIsKycOpen}\n onBack={() => {\n setIsKycOpen(false);\n setIsWalletMenuOpen(true);\n }}\n />\n\n <AuthModal\n open={recoveryUserId ? isRecoveryModalOpen : isAuthModalOpen}\n onOpenChange={(open) => {\n if (recoveryUserId) {\n setIsRecoveryModalOpen(open);\n } else {\n setIsAuthModalOpen(open);\n }\n }}\n onAuthSuccess={handleAuthModalSuccess}\n autoCloseOnSuccess={!recoveryUserId}\n recoveryUserId={recoveryUserId}\n onRecoveryClose={() => {\n setRecoveryUserId(null);\n setIsRecoveryModalOpen(false);\n setIsAuthModalOpen(false);\n }}\n callbacks={callbacks}\n onRecoverySuccess={async () => {\n const verify = await verifyToken();\n const hasServerKeyshare = verify?.hasKeyshare ?? jwtTokenManager.getHasKeyshare() ?? false;\n if (recoveryUserId) {\n try {\n const { session: sess, address: addr } = await createSessionWithKeyshare(recoveryUserId, hasServerKeyshare);\n setSession(sess);\n setAddress(addr);\n setStatus('ready');\n setRecoveryUserId(null);\n setIsRecoveryModalOpen(false);\n setIsAuthModalOpen(false);\n onConnected?.({ address: addr, session: sess });\n try { callbacks?.onLumiaPassportConnect?.({ address: addr, session: sess }); } catch {}\n try { callbacks?.onLumiaPassportAccount?.({ userId: recoveryUserId, address: addr, session: sess, hasKeyshare: hasServerKeyshare }); } catch {}\n\n // Authenticate with iframe to trigger wallet ready check\n if (config.projectId) {\n try {\n const { getIframeManager } = await import('../internal/lib/iframe-manager');\n const iframeManager = getIframeManager();\n await iframeManager.authenticate(recoveryUserId);\n } catch (e) {\n console.warn('[UI-KIT] iframe authentication failed:', e);\n }\n }\n\n // Update backup status after successful recovery\n try {\n const { updateBackupStatus } = await import('../internal/vaultClient');\n updateBackupStatus(recoveryUserId, 'server', { enabled: true, lastBackup: Date.now() });\n } catch (e) {\n console.warn('[UI-KIT] Failed to update backup status:', e);\n }\n } catch (err: any) {\n setError(err?.message || String(err));\n setStatus('error');\n }\n }\n }}\n />\n\n {/* Recovery UI moved inside AuthModal */}\n\n <TssManagerWithRef\n ref={tssManagerRef}\n mpcPin={undefined}\n usePaymaster={usePaymaster}\n onSessionCreated={(sess, addr) => {\n setSession(sess);\n setAddress(addr);\n }}\n onError={msg => setError(msg)}\n setStatus={setStatus}\n />\n </div>\n );\n};\n","import React from 'react';\n\nexport interface VisuallyHiddenProps {\n children: React.ReactNode;\n}\n\nexport const VisuallyHidden: React.FC<VisuallyHiddenProps> = ({ children }) => (\n <span className=\"sr-only absolute w-px h-px p-0 -m-px overflow-hidden whitespace-nowrap border-0\">\n {children}\n </span>\n);","import React from 'react';\n\nimport { ensureKeyshare } from '../auth';\nimport { createAccountSession, getEntryPointDeposit, type AccountSession } from '../clients';\n\ninterface TssManagerProps {\n mpcPin?: string;\n usePaymaster: boolean;\n onSessionCreated: (session: AccountSession, address: `0x${string}`) => void;\n onError: (error: string) => void;\n setStatus: (status: string) => void;\n}\n\nexport default function TssManager({ mpcPin, usePaymaster, onSessionCreated, onError, setStatus }: TssManagerProps) {\n const createSessionWithKeyshare = React.useCallback(async (userId: string, hasServerKeyshare: boolean, isNewUser?: boolean) => {\n setStatus('checking key management setup...');\n await ensureKeyshare(userId, hasServerKeyshare, setStatus, isNewUser);\n setStatus('creating smart account...');\n const sess = await createAccountSession({ mpcUserId: userId, mpcPin: mpcPin || undefined, usePaymaster });\n const addr = sess.address || sess.smartAccountAddress;\n setStatus('loading account data...');\n try { await getEntryPointDeposit(addr); } catch {}\n onSessionCreated(sess, addr);\n return { session: sess, address: addr };\n }, [mpcPin, usePaymaster, onSessionCreated, setStatus]);\n\n return null;\n}\n\nexport interface TssManagerRef {\n createSessionWithKeyshare: (userId: string, hasServerKeyshare: boolean, isNewUser?: boolean) => Promise<{ session: AccountSession; address: `0x${string}` }>;\n}\n\nexport const TssManagerWithRef = React.forwardRef<TssManagerRef, TssManagerProps>((props, ref) => {\n const createSessionWithKeyshare = React.useCallback(async (userId: string, hasServerKeyshare: boolean, isNewUser?: boolean) => {\n props.setStatus('checking key management setup...');\n await ensureKeyshare(userId, hasServerKeyshare, props.setStatus, isNewUser);\n props.setStatus('creating smart account...');\n const sess = await createAccountSession({ mpcUserId: userId, mpcPin: props.mpcPin || undefined, usePaymaster: props.usePaymaster });\n const addr = sess.address || sess.smartAccountAddress;\n props.setStatus('loading account data...');\n try { await getEntryPointDeposit(addr); } catch {}\n props.onSessionCreated(sess, addr);\n return { session: sess, address: addr };\n }, [props]);\n\n React.useImperativeHandle(ref, () => ({ createSessionWithKeyshare }), [createSessionWithKeyshare]);\n return null;\n});\n","import React, { useEffect, useState } from 'react';\n\nimport { Dialog, DialogContent, DialogTitle, DialogDescription } from './ui/dialog';\nimport { VisuallyHidden } from './ui/visually-hidden';\nimport { Button } from './ui/button';\nimport { Input } from './ui/input';\nimport { getLinkedProviders, unlinkProvider } from '../auth/providers/common';\nimport { sendEmailLinkCode, verifyEmailLinkCode } from '../auth/providers/email';\nimport { linkPasskeyWithWebAuthn } from '../auth/providers/passkey';\nimport { linkTelegram, mountTelegramLoginWidget } from '../auth/providers/telegram';\nimport { getProviderDisplayInfo, formatDate, type AuthProvider } from '../auth/providers/types';\nimport { AlertTriangle, CheckCircle, Clock, Link as LinkIcon, Trash2, RefreshCw, Key, ArrowLeft, Wallet } from 'lucide-react';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\nimport { GoogleIcon, TelegramIcon, TwitterIcon, DiscordIcon } from '../../config/lumiaPassport';\nimport { VerificationCodeInput } from './VerificationCodeInput';\nimport { WalletConnectHandler } from './WalletConnectHandler';\n\nexport interface ManageWalletProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onBack?: () => void;\n}\n\nexport const ManageWallet: React.FC<ManageWalletProps> = ({ open, onOpenChange, onBack }) => {\n const [providers, setProviders] = useState<AuthProvider[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string>('');\n const [unlinking, setUnlinking] = useState<string | null>(null);\n const [confirmUnlink, setConfirmUnlink] = useState<{ provider: string; providerName: string; externalId: string } | null>(null);\n const [confirmInput, setConfirmInput] = useState('');\n const [showAdd, setShowAdd] = useState(false);\n const [providerType, setProviderType] = useState<string | null>(null);\n const [email, setEmail] = useState('');\n const [emailCode, setEmailCode] = useState('');\n const [emailCodeSent, setEmailCodeSent] = useState(false);\n const [linkIsLoading, setLinkIsLoading] = useState(false);\n const [linkError, setLinkError] = useState('');\n const [expiresIn, setExpiresIn] = useState(300);\n const [verificationError, setVerificationError] = useState<string>('');\n const { config, callbacks } = useLumiaPassportConfig() as any;\n const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n const telegramContainerRef = React.useRef<HTMLDivElement | null>(null);\n\n // State for wallet linking\n const [isWalletLinking, setIsWalletLinking] = useState(false);\n const [providersJustUpdated, setProvidersJustUpdated] = useState(false);\n\n function normalizePasskeyLinkError(msg: string): string {\n const lower = msg.toLowerCase();\n if (lower.includes('already registered') || lower.includes('credential') && lower.includes('exists')) {\n return 'This authenticator already has a credential for this site. Try a different device or security key.';\n }\n if (lower.includes('not allowed') || lower.includes('user cancelled')) {\n return 'Operation cancelled. No changes were made.';\n }\n return msg;\n }\n\n const loadProviders = async () => {\n setLoading(true); setError('');\n try { const list = await getLinkedProviders(); setProviders(list); }\n catch (e: any) { setError(e?.message || 'Failed to load authentication providers'); }\n finally { setLoading(false); }\n };\n\n useEffect(() => {\n if (open && !providersJustUpdated) {\n loadProviders();\n }\n // Reset the flag after the dialog opens\n if (open && providersJustUpdated) {\n setProvidersJustUpdated(false);\n }\n }, [open, providersJustUpdated]);\n\n // Mount Telegram widget when selected (configured via social.providers meta)\n useEffect(() => {\n const telegramProvider = config.social?.providers?.find((p: any) => (p.id || '').toLowerCase() === 'telegram' && p.enabled);\n const bot = telegramProvider?.meta?.botUsername as string | undefined;\n if (providerType === 'telegram' && telegramContainerRef.current && bot) {\n mountTelegramLoginWidget(telegramContainerRef.current, bot, async (tgUser: any) => {\n try {\n setLinkIsLoading(true);\n await linkTelegram(tgUser);\n const list = await getLinkedProviders();\n setProviders(list);\n setProvidersJustUpdated(true); // Mark that we just updated providers\n try { callbacks?.onLumiaPassportUpdate?.({ providers: list }); } catch {}\n setShowAdd(false);\n setProviderType(null);\n } catch (e: any) {\n setError(e?.message || 'Failed to link Telegram');\n } finally {\n setLinkIsLoading(false);\n }\n });\n }\n }, [providerType, config.social?.providers]);\n\n const canUnlink = (p: AuthProvider) => {\n const verified = providers.filter(x => x.verified);\n if (verified.length <= 1 && p.verified) return false;\n return true;\n };\n\n const handleUnlink = async (provider: string, externalId?: string) => {\n setUnlinking(provider);\n try {\n await unlinkProvider(provider, externalId);\n const list = await getLinkedProviders();\n setProviders(list);\n setProvidersJustUpdated(true); // Mark that we just updated providers\n try { callbacks?.onLumiaPassportUpdate?.({ providers: list }); } catch {}\n }\n catch (e: any) { setError(e?.message || 'Failed to unlink provider'); }\n finally { setUnlinking(null); setConfirmUnlink(null); }\n };\n\n const handleSendCode = async () => {\n if (!email) { setError('Please enter an email address'); return; }\n setError(''); setVerificationError(''); setLinkIsLoading(true);\n try {\n await sendEmailLinkCode(email);\n setEmailCodeSent(true);\n setExpiresIn(300);\n } catch (e: any) {\n setError(e?.message || 'Failed to send verification code');\n } finally {\n setLinkIsLoading(false);\n }\n };\n const handleVerifyCode = async (codeToVerify?: string) => {\n const code = codeToVerify ?? emailCode;\n if (!code) { setError('Please enter the verification code'); return; }\n setError(''); setVerificationError(''); setLinkIsLoading(true);\n try {\n await verifyEmailLinkCode(email, code);\n const list = await getLinkedProviders();\n setProviders(list);\n setProvidersJustUpdated(true); // Mark that we just updated providers\n try { callbacks?.onLumiaPassportUpdate?.({ providers: list }); } catch {}\n setShowAdd(false);\n setProviderType(null);\n setEmail('');\n setEmailCode('');\n setEmailCodeSent(false);\n } catch (e: any) {\n setVerificationError(e?.message || 'Failed to verify and link email');\n } finally {\n setLinkIsLoading(false);\n }\n };\n\n return (\n <>\n {/* Wallet connection handler - render outside of dialog so it works when dialog closes */}\n {config.wallet?.enabled && (\n <WalletConnectHandler\n isLinking={isWalletLinking}\n onLinkingComplete={async (success) => {\n setIsWalletLinking(false);\n if (success) {\n // Load fresh providers list\n try {\n const list = await getLinkedProviders();\n setProviders(list);\n setProvidersJustUpdated(true); // Mark that we just updated providers\n try { callbacks?.onLumiaPassportUpdate?.({ providers: list }); } catch {}\n } catch (e) {\n console.error('Failed to load providers:', e);\n }\n setShowAdd(false);\n setProviderType(null);\n // Reopen the Manage Wallet modal to show updated providers\n setTimeout(() => {\n onOpenChange(true);\n }, 500);\n }\n }}\n onError={(error) => {\n setLinkError(error);\n setIsWalletLinking(false);\n // Reopen the Manage Wallet modal to show error\n setTimeout(() => onOpenChange(true), 500);\n }}\n onLoadingChange={setLinkIsLoading}\n />\n )}\n\n <Dialog open={open} onOpenChange={(newOpen) => {\n onOpenChange(newOpen);\n // Reset wallet linking state when dialog closes\n if (!newOpen) {\n setIsWalletLinking(false);\n }\n }}>\n <DialogContent className={`lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden gap-0 ${isDark ? 'lumia-dark' : 'lumia-light'}`}>\n <div className=\"p-5\">\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center gap-2\">\n {onBack && (\n <button\n onClick={onBack}\n className={`p-1 mr-1 ${isDark ? 'text-gray-400 hover:text-gray-300' : 'text-gray-500 hover:text-gray-700'}`}\n title=\"Back\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </button>\n )}\n <div>\n <VisuallyHidden>\n <DialogTitle>Manage Wallet Authentication</DialogTitle>\n </VisuallyHidden>\n <h2 className={`text-xl font-semibold ${theme.titleText}`}>Manage Wallet Authentication</h2>\n </div>\n </div>\n </div>\n <DialogDescription className={`mb-4 ${theme.bodyText}`}>Manage your connected authentication methods</DialogDescription>\n\n {/* Providers list */}\n {error && (\n <div className={`mt-4 p-3 rounded text-sm flex items-start gap-2 break-words whitespace-pre-wrap max-h-24 overflow-auto ${isDark ? 'bg-red-900/30 border border-red-900 text-red-400' : 'bg-red-50 border border-red-200 text-red-700'}`}>\n <AlertTriangle className=\"w-4 h-4 mt-0.5 shrink-0\" />\n <span className=\"block\">{error}</span>\n </div>\n )}\n\n {loading ? (\n <div className={`flex items-center justify-center py-8 ${theme.mutedText}`}><RefreshCw className=\"w-5 h-5 mr-2 animate-spin\" />Loading authentication providers…</div>\n ) : (\n <div className=\"mt-3 space-y-3\">\n {providers.map(p => {\n const info = getProviderDisplayInfo(p.provider);\n const allowUnlink = canUnlink(p);\n return (\n <div key={`${p.provider}-${p.externalId}`} className={`border rounded-xl p-3 ${isDark ? 'border-gray-700 bg-gray-800' : 'border-gray-200 bg-white'}`}>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className={`text-lg ${isDark ? 'text-gray-400' : 'text-gray-600'}`}>{info.icon}</div>\n <div className={`text-sm font-medium ${theme.titleText}`}>{info.name}</div>\n </div>\n <div className=\"flex items-center gap-2\">\n {p.verified ? (\n <CheckCircle className={`w-4 h-4 ${isDark ? 'text-green-400' : 'text-green-500'}`} />\n ) : (\n <Clock className=\"w-4 h-4 text-yellow-500\" />\n )}\n {allowUnlink && (\n <button\n onClick={() => setConfirmUnlink({ provider: p.provider, providerName: info.name, externalId: p.externalId })}\n className={`p-1 ${isDark ? 'text-red-400 hover:text-red-300' : 'text-red-500 hover:text-red-700'}`}\n title=\"Remove provider\"\n >\n {unlinking === p.provider ? <RefreshCw className=\"w-4 h-4 animate-spin\" /> : <Trash2 className=\"w-4 h-4\" />}\n </button>\n )}\n </div>\n </div>\n <div className={`mt-2 space-y-1 text-xs ${isDark ? 'text-gray-400' : 'text-gray-600'}`}>\n <div className=\"flex items-center gap-1\"><LinkIcon className={`w-3 h-3 ${isDark ? 'text-gray-500' : 'text-gray-400'}`} />Linked: {formatDate(p.linkedAt)}</div>\n {p.lastUsedAt && (<div className=\"flex items-center gap-1\"><Clock className={`w-3 h-3 ${isDark ? 'text-gray-500' : 'text-gray-400'}`} />Last used: {formatDate(p.lastUsedAt)}</div>)}\n {p.externalId && (<div className={`text-[10px] font-mono break-all ${isDark ? 'text-gray-500' : 'text-gray-500'}`}>ID: {p.externalId}</div>)}\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {/* Add provider entrypoint */}\n <div className=\"mt-4 flex justify-end\">\n <Button variant=\"success\" onClick={() => setShowAdd(true)}>+ Add Provider</Button>\n </div>\n </div>\n </DialogContent>\n {/* Add Provider Modal */}\n <Dialog open={showAdd} onOpenChange={(v) => { setShowAdd(v); if (!v) { setProviderType(null); setEmail(''); setEmailCode(''); setEmailCodeSent(false); } }}>\n <DialogContent className={`lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden ${isDark ? 'lumia-dark' : 'lumia-light'}`}>\n <div className=\"p-5\">\n <div className=\"flex items-center gap-2 mb-3\">\n <button\n onClick={() => {\n if (providerType) {\n setProviderType(null);\n setEmailCodeSent(false);\n setEmail('');\n setEmailCode('');\n setLinkError('');\n } else {\n setShowAdd(false);\n }\n }}\n className={`p-1 mr-1 ${isDark ? 'text-gray-400 hover:text-gray-300' : 'text-gray-500 hover:text-gray-700'}`}\n title=\"Back\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </button>\n <DialogTitle className={`text-xl font-semibold ${theme.titleText}`}>Add Authentication Method</DialogTitle>\n </div>\n <DialogDescription className={`${theme.bodyText} mb-4`}>Add a new way to authenticate to your account</DialogDescription>\n\n {!providerType ? (\n <div className=\"mt-3 space-y-4\">\n {config.passkey.enabled && (\n <Button onClick={() => setProviderType('passkey')} className=\"w-full\" size=\"lg\"><Key className=\"w-4 h-4 mr-2\" />Link with Passkey</Button>\n )}\n\n {config.passkey.enabled && (config.email.enabled || config.wallet?.enabled || (config.social.enabled && config.social.providers.some(p => p.enabled))) && (\n <div className={`text-center text-sm ${theme.mutedText}`}>Or</div>\n )}\n\n {config.email.enabled && (\n <div className=\"space-y-2\">\n <Input type=\"email\" placeholder={config.email.placeholder || 'Enter your email'} value={email} onChange={e => setEmail(e.target.value)} className={`h-11 ${isDark ? 'bg-gray-800 border-gray-600 text-gray-100 placeholder:text-gray-500' : ''}`} />\n <Button onClick={() => { setProviderType('email'); handleSendCode(); }} disabled={!email} className=\"w-full\" size=\"lg\" variant=\"secondary\">Continue</Button>\n </div>\n )}\n\n {(config.wallet?.enabled || (config.social.enabled && config.social.providers.some(p => p.enabled))) && (\n <div className={`text-center text-sm ${theme.mutedText}`}>Or</div>\n )}\n\n {config.wallet?.enabled && (\n <Button\n onClick={() => {\n // Close the Add Provider modal first\n setShowAdd(false);\n setProviderType(null);\n // Close main Manage Wallet modal too\n onOpenChange(false);\n // Then trigger wallet connection\n setTimeout(() => {\n setIsWalletLinking(true);\n setLinkError('');\n }, 200);\n }}\n className=\"w-full\"\n size=\"lg\"\n variant=\"outline\"\n >\n <Wallet className=\"w-4 h-4 mr-2\" />Connect External Wallet\n </Button>\n )}\n\n {config.wallet?.enabled && config.social.enabled && config.social.providers.some(p => p.enabled) && (\n <div className={`text-center text-sm ${theme.mutedText}`}>Or</div>\n )}\n\n {config.social.enabled && (\n <div className={`grid grid-cols-${config.social.gridColumns} gap-2`}>\n {config.social.providers.filter(p => p.enabled).map(sp => {\n const map: Record<string, any> = { google: GoogleIcon, telegram: TelegramIcon, twitter: TwitterIcon, x: TwitterIcon, discord: DiscordIcon };\n const F = (sp.icon as any) || map[sp.id.toLowerCase()];\n return (\n <Button key={sp.id} variant=\"outline\" onClick={() => setProviderType(sp.id)} className={`p-0 flex items-center justify-center [&_svg]:!w-5 [&_svg]:!h-5 ${isDark ? 'bg-gray-800 border-gray-600 hover:bg-gray-700' : 'bg-white border-gray-200 hover:bg-gray-50'}`} size=\"lg\">\n {F ? <F className=\"w-6 h-6\" /> : <span className=\"text-sm\">{sp.name}</span>}\n </Button>\n );\n })}\n </div>\n )}\n\n </div>\n ) : (\n <div className=\"mt-3 space-y-3\">\n {providerType === 'email' && emailCodeSent && (\n <div className=\"space-y-2\">\n <div className={`p-3 rounded text-sm ${isDark ? 'bg-green-900/30 border border-green-900 text-green-400' : 'bg-green-50 border border-green-200 text-green-700'}`}>Verification code sent to {email}</div>\n <VerificationCodeInput\n onVerifyCode={handleVerifyCode}\n onResendCode={handleSendCode}\n isLoading={linkIsLoading}\n expiresIn={expiresIn}\n error={verificationError}\n />\n </div>\n )}\n {providerType === 'passkey' && (\n <div className=\"space-y-3\">\n <div className={`p-3 rounded-xl text-sm ${isDark ? 'bg-blue-900/30 border border-blue-900 text-blue-400' : 'bg-blue-50 border border-blue-200 text-blue-700'}`}>\n Link a passkey to your account using WebAuthn. Your device may let you choose an existing passkey; otherwise a new one will be created.\n </div>\n <Button\n onClick={async () => {\n setLinkError('');\n setLinkIsLoading(true);\n try {\n // Prefer platform authenticator (this device)\n await linkPasskeyWithWebAuthn({\n authenticatorSelection: { authenticatorAttachment: 'platform', residentKey: 'preferred', userVerification: 'preferred' }\n });\n const list = await getLinkedProviders();\n setProviders(list);\n setProvidersJustUpdated(true); // Mark that we just updated providers\n try { callbacks?.onLumiaPassportUpdate?.({ providers: list }); } catch {}\n setShowAdd(false);\n setProviderType(null);\n } catch (e: any) {\n const msg = e?.message || 'Failed to link passkey';\n setLinkError(normalizePasskeyLinkError(msg));\n } finally {\n setLinkIsLoading(false);\n }\n }}\n className=\"w-full\"\n size=\"lg\"\n disabled={linkIsLoading}\n >\n <Key className=\"w-4 h-4 mr-2\" />\n {linkIsLoading ? 'Linking…' : 'Create on This Device'}\n </Button>\n <Button\n onClick={async () => {\n setLinkError('');\n setLinkIsLoading(true);\n try {\n // Prefer cross-platform authenticator (security key / phone)\n await linkPasskeyWithWebAuthn({\n authenticatorSelection: { authenticatorAttachment: 'cross-platform', residentKey: 'preferred', userVerification: 'preferred' }\n });\n const list = await getLinkedProviders();\n setProviders(list);\n setProvidersJustUpdated(true); // Mark that we just updated providers\n try { callbacks?.onLumiaPassportUpdate?.({ providers: list }); } catch {}\n setShowAdd(false);\n setProviderType(null);\n } catch (e: any) {\n const msg = e?.message || 'Failed to link passkey';\n setLinkError(normalizePasskeyLinkError(msg));\n } finally {\n setLinkIsLoading(false);\n }\n }}\n variant=\"outline\"\n className={`w-full ${theme.outlineBtn}`}\n size=\"lg\"\n disabled={linkIsLoading}\n >\n Create on Security Key\n </Button>\n {linkError && (\n <div className={`p-3 rounded text-sm break-words whitespace-pre-wrap ${isDark ? 'bg-red-900/30 border border-red-900 text-red-400' : 'bg-red-50 border border-red-200 text-red-700'}`}>\n {linkError}\n </div>\n )}\n </div>\n )}\n {providerType === 'telegram' && (\n <div className=\"space-y-3\">\n <div className={`p-3 rounded-xl text-sm ${isDark ? 'bg-blue-900/30 border border-blue-900 text-blue-400' : 'bg-blue-50 border border-blue-200 text-blue-700'}`}>\n {(config.social?.providers?.find((p: any) => (p.id || '').toLowerCase() === 'telegram')?.meta?.botUsername)\n ? 'Authenticate with Telegram to link your account.'\n : 'Telegram bot username is not configured.'}\n </div>\n <div ref={telegramContainerRef} className=\"flex justify-center\" />\n </div>\n )}\n {/* Wallet connection is now handled directly via RainbowKit modal */}\n {providerType && providerType !== 'email' && providerType !== 'passkey' && providerType !== 'telegram' && providerType !== 'wallet' && (\n <div className={`p-3 rounded-xl text-sm ${isDark ? 'bg-blue-900/30 border border-blue-900 text-blue-400' : 'bg-blue-50 border border-blue-200 text-blue-700'}`}>\n Linking with {providerType.charAt(0).toUpperCase() + providerType.slice(1)} requires OAuth implementation.\n This would typically redirect to {providerType} for authentication.\n </div>\n )}\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n {/* Confirm Unlink Modal */}\n <Dialog open={!!confirmUnlink} onOpenChange={(v) => { if (!v) { setConfirmUnlink(null); setConfirmInput(''); } }}>\n <DialogContent className={`lumia-scope max-w-[380px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden ${isDark ? 'lumia-dark' : 'lumia-light'}`}>\n <div className=\"p-5\">\n <DialogTitle className={`text-lg font-semibold ${theme.titleText}`}>Remove Authentication Method</DialogTitle>\n <DialogDescription className={`${theme.bodyText} mt-2`}>\n This will permanently unlink {confirmUnlink?.providerName} from your account.\n You may lose access if this is your only verified method.\n </DialogDescription>\n <div className={`mt-3 p-3 rounded text-sm ${isDark ? 'bg-red-900/30 border border-red-900 text-red-400' : 'bg-red-50 border border-red-200 text-red-700'}`}>\n This action cannot be undone.\n </div>\n {confirmUnlink && (\n <div className=\"mt-3\">\n <div className={`text-xs mb-1 ${theme.mutedText}`}>Type the provider ID to confirm removal:</div>\n <div className={`text-[10px] font-mono mb-2 break-all ${isDark ? 'text-gray-400' : 'text-gray-600'}`}>{confirmUnlink.externalId}</div>\n <Input\n value={confirmInput}\n onChange={e => setConfirmInput(e.target.value)}\n placeholder=\"Enter provider ID\"\n className={`h-10 ${isDark ? 'bg-gray-800 border-gray-700 text-gray-100 placeholder:text-gray-500' : ''}`}\n />\n </div>\n )}\n <div className=\"mt-4 flex justify-end gap-2\">\n <Button className={`${theme.outlineBtn}`} variant=\"outline\" onClick={() => { setConfirmUnlink(null); setConfirmInput(''); }} disabled={!!unlinking}>Cancel</Button>\n <Button\n onClick={() => confirmUnlink && handleUnlink(confirmUnlink.provider, confirmUnlink.externalId)}\n disabled={!!unlinking || !confirmUnlink || confirmInput !== confirmUnlink.externalId}\n className={`${isDark ? 'bg-red-600 hover:bg-red-500 text-white' : 'bg-red-600 hover:bg-red-700 text-white'} rounded-xl px-4`}\n >\n {unlinking ? 'Removing…' : 'Remove'}\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n </Dialog>\n </>\n );\n};\n","import React, { useEffect } from 'react';\nimport { useConnectModal } from '@rainbow-me/rainbowkit';\nimport { useAccount, useSignMessage, useDisconnect } from 'wagmi';\nimport { linkWallet, createSignatureMessage } from '../auth/providers/wallet';\nimport type { Address } from 'viem';\n\ninterface WalletConnectHandlerProps {\n isLinking: boolean;\n onLinkingComplete: (success?: boolean) => void;\n onError: (error: string) => void;\n onLoadingChange: (loading: boolean) => void;\n}\n\nexport const WalletConnectHandler: React.FC<WalletConnectHandlerProps> = ({\n isLinking,\n onLinkingComplete,\n onError,\n onLoadingChange,\n}) => {\n const { openConnectModal } = useConnectModal();\n const { address, isConnected, chain, connector } = useAccount();\n const { disconnect } = useDisconnect();\n const { signMessageAsync } = useSignMessage();\n const [hasStartedLinking, setHasStartedLinking] = React.useState(false);\n const timeoutRef = React.useRef<NodeJS.Timeout>();\n\n // Open modal when requested\n useEffect(() => {\n if (isLinking && !hasStartedLinking) {\n setHasStartedLinking(true);\n // Always disconnect first to ensure clean state\n if (isConnected) {\n disconnect();\n // Wait for disconnect to complete\n setTimeout(() => {\n if (openConnectModal) {\n openConnectModal();\n }\n }, 200);\n } else {\n // If not connected, open modal immediately\n if (openConnectModal) {\n openConnectModal();\n }\n }\n\n // Set timeout to handle case where user closes modal without connecting\n timeoutRef.current = setTimeout(() => {\n if (!isConnected && isLinking) {\n onLinkingComplete(false); // Signal completion without success\n setHasStartedLinking(false);\n }\n }, 30000); // 30 second timeout\n }\n\n // Reset state when isLinking becomes false\n if (!isLinking && hasStartedLinking) {\n setHasStartedLinking(false);\n // Clear timeout\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n // Also disconnect if still connected\n if (isConnected) {\n disconnect();\n }\n }\n }, [isLinking, hasStartedLinking, isConnected, openConnectModal, disconnect]);\n\n // Handle wallet connection and signing\n useEffect(() => {\n if (isConnected && address && isLinking && hasStartedLinking) {\n handleWalletSign();\n }\n }, [isConnected, address, isLinking, hasStartedLinking]);\n\n const handleWalletSign = async () => {\n // Clear timeout since we're proceeding with signing\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n if (!address || !chain) {\n onError('No wallet connected');\n disconnect();\n onLinkingComplete(false);\n setHasStartedLinking(false);\n return;\n }\n\n try {\n onLoadingChange(true);\n\n // Create signature message\n const message = createSignatureMessage(address);\n\n // Request signature from wallet\n const signature = await signMessageAsync({ message });\n\n if (!signature) {\n throw new Error('Failed to get signature');\n }\n\n // Get wallet metadata\n const walletName = connector?.name || 'Unknown Wallet';\n const walletType = connector?.id || 'unknown';\n\n console.log('[WalletConnectHandler] Wallet metadata:', {\n walletName,\n walletType,\n connectorInfo: connector\n });\n\n // Link wallet to account with metadata\n await linkWallet({\n address,\n signature,\n message,\n chainId: chain.id,\n walletName,\n walletType\n });\n\n // Disconnect wallet\n disconnect();\n\n // Notify success - this will trigger providers reload in parent component\n onLinkingComplete(true); // Just pass true to indicate success\n setHasStartedLinking(false);\n\n } catch (err: any) {\n const errorMsg = err?.message || 'Failed to link wallet';\n\n // User friendly error messages\n if (errorMsg.includes('User rejected') || errorMsg.includes('User denied')) {\n onError('Signature request was cancelled');\n } else if (errorMsg.includes('already linked')) {\n onError('This wallet is already linked to another account');\n } else {\n onError(errorMsg);\n }\n\n // Disconnect on error\n disconnect();\n onLinkingComplete(false);\n setHasStartedLinking(false);\n } finally {\n onLoadingChange(false);\n }\n };\n\n return null; // This component doesn't render anything\n};","import React from 'react';\n\nimport { Dialog, DialogContent, DialogTitle, DialogDescription } from './ui/dialog';\nimport { VisuallyHidden } from './ui/visually-hidden';\nimport { Button } from './ui/button';\nimport { jwtTokenManager } from '../auth';\nimport { getKeyshareInfo } from '../auth/keyshare';\nimport { getBackupStatus, getShareRecoveryStats } from '../vaultClient';\nimport { Cloud, Laptop, Shield, AlertTriangle, CheckCircle2, Server, HardDrive, RefreshCw, Key, ArrowLeft, Trash2 } from 'lucide-react';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\n\nexport interface SecurityModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onBack?: () => void;\n}\n\nexport const SecurityModal: React.FC<SecurityModalProps> = ({ open, onOpenChange, onBack }) => {\n const userId = jwtTokenManager.getUserId();\n const serverHasKeyshare = jwtTokenManager.getHasKeyshare() ?? false;\n const backup = userId ? getBackupStatus(userId) : { server: { enabled: false }, cloud: { enabled: false }, local: { enabled: false } };\n const { config } = useLumiaPassportConfig();\n const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n\n const [isRefreshing, setIsRefreshing] = React.useState(false);\n const [localInfo, setLocalInfo] = React.useState<{\n hasKeyshare: boolean;\n ownerAddress?: `0x${string}`;\n sessionId?: string;\n keyshareSize?: number;\n } | null>(null);\n const [recoveryCreatedAt, setRecoveryCreatedAt] = React.useState<string | null>(null);\n const [recoveryBrowser, setRecoveryBrowser] = React.useState<string | null>(null);\n const [recoveryUa, setRecoveryUa] = React.useState<string | null>(null);\n const [recoveryDeviceId, setRecoveryDeviceId] = React.useState<string | null>(null);\n const [recoveryDeviceName, setRecoveryDeviceName] = React.useState<string | null>(null);\n const [recoveryCountry, setRecoveryCountry] = React.useState<string | null>(null);\n const [hasServerBackup, setHasServerBackup] = React.useState(false);\n const [trustedApps, setTrustedApps] = React.useState<Array<{\n userId: string;\n projectId: string;\n origin: string;\n trustedAt: number;\n }>>([]);\n const [appToRemove, setAppToRemove] = React.useState<{ projectId: string; origin: string; hostname: string } | null>(null);\n\n const fetchRecovery = React.useCallback(async () => {\n if (!userId) return;\n\n try {\n setIsRefreshing(true);\n\n // Load local keyshare info from iframe\n const keyshareInfo = await getKeyshareInfo(userId);\n setLocalInfo(keyshareInfo);\n\n // Load trusted apps from iframe\n const { getIframeManager } = await import('../lib/iframe-manager');\n try {\n console.log('[SecurityModal] Loading trusted apps for user:', userId);\n const iframeManager = getIframeManager();\n const apps = await iframeManager.getTrustedApps(userId);\n console.log('[SecurityModal] Received trusted apps:', apps);\n setTrustedApps(apps);\n } catch (error) {\n console.error('[SecurityModal] Failed to load trusted apps:', error);\n setTrustedApps([]);\n }\n\n // Load recovery stats\n const stats = await getShareRecoveryStats();\n\n // Check if we have any recovery data\n const hasRecoveryData = stats && (stats.created || (stats.devices && stats.devices.length > 0));\n setHasServerBackup(!!hasRecoveryData);\n\n const created = stats?.created;\n setRecoveryCreatedAt(created?.at || null);\n setRecoveryBrowser(created?.browser || null);\n setRecoveryUa(created?.ua || null);\n setRecoveryDeviceId(created?.deviceId || null);\n setRecoveryDeviceName(created?.deviceName || null);\n setRecoveryCountry(created?.country || null);\n } finally {\n setIsRefreshing(false);\n }\n }, [userId]);\n\n React.useEffect(() => {\n if (open) fetchRecovery();\n }, [open, fetchRecovery]);\n\n const parseOS = (ua?: string | null): string | null => {\n if (!ua) return null;\n if (ua.includes('Mac OS X')) return 'macOS';\n if (ua.includes('Windows')) return 'Windows';\n if (ua.includes('Android')) return 'Android';\n if (ua.includes('Linux')) return 'Linux';\n if (ua.includes('iPhone') || ua.includes('iPad') || ua.includes('iOS')) return 'iOS';\n return null;\n };\n\n const confirmRemoveTrustedApp = async () => {\n if (!userId || !appToRemove) return;\n\n try {\n console.log('[SecurityModal] Removing trusted app:', appToRemove);\n const { getIframeManager } = await import('../lib/iframe-manager');\n const iframeManager = getIframeManager();\n\n const success = await iframeManager.removeTrustedApp(userId, appToRemove.projectId, appToRemove.origin);\n\n if (success) {\n console.log('[SecurityModal] Trusted app removed successfully');\n // Close dialog and refresh the list\n setAppToRemove(null);\n await fetchRecovery();\n } else {\n console.error('[SecurityModal] Failed to remove trusted app');\n }\n } catch (error) {\n console.error('[SecurityModal] Error removing trusted app:', error);\n }\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className={`lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden gap-0 ${isDark ? 'lumia-dark' : 'lumia-light'}`}>\n <VisuallyHidden>\n <DialogTitle>Security</DialogTitle>\n </VisuallyHidden>\n <DialogDescription className=\"sr-only\">Keyshare and vault status</DialogDescription>\n <div className=\"p-5 space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n {onBack && (\n <button\n onClick={onBack}\n className={`p-1 mr-1 bg-transparent border-0 ${isDark ? 'text-gray-400 hover:text-gray-300' : 'text-gray-500 hover:text-gray-700'}`}\n title=\"Back\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </button>\n )}\n <div className={`flex items-center gap-2 ${theme.text} font-semibold`}>\n <Key className=\"h-4 w-4\" />\n <span>Keyshare Status</span>\n <button onClick={fetchRecovery} className={`p-1 bg-transparent border-0 ${isDark ? 'text-gray-400 hover:text-gray-300' : 'text-gray-500 hover:text-gray-700'}`} title=\"Refresh\">\n <RefreshCw className={`h-4 w-4 ${isRefreshing ? 'animate-spin' : ''}`} />\n </button>\n </div>\n </div>\n </div>\n\n <div className=\"grid grid-cols-3 gap-4\">\n <div className=\"space-y-2 text-center\">\n <div className=\"flex items-center justify-center gap-2\"><Cloud className={`h-4 w-4 ${isDark ? 'text-gray-400' : 'text-gray-500'}`} /><span className={`text-sm font-medium ${isDark ? 'text-gray-200' : 'text-gray-800'}`}>Server</span></div>\n <span className={`inline-flex items-center text-sm px-3 py-2 rounded-full ${serverHasKeyshare ? (isDark ? 'bg-gray-800 text-green-400' : 'bg-green-50 text-green-700') : (isDark ? 'bg-gray-800 text-orange-400' : 'bg-orange-50 text-orange-700')}`}>\n {serverHasKeyshare ? <CheckCircle2 className=\"h-4 w-4 mr-1\" /> : <AlertTriangle className=\"h-4 w-4 mr-1\" />}\n {serverHasKeyshare ? 'Ready' : 'Missing'}\n </span>\n </div>\n <div className=\"space-y-2 text-center\">\n <div className=\"flex items-center justify-center gap-2\"><Laptop className={`h-4 w-4 ${isDark ? 'text-gray-400' : 'text-gray-500'}`} /><span className={`text-sm font-medium ${isDark ? 'text-gray-200' : 'text-gray-800'}`}>Local</span></div>\n <span className={`inline-flex items-center text-sm px-3 py-2 rounded-full ${localInfo?.hasKeyshare ? (isDark ? 'bg-gray-800 text-green-400' : 'bg-green-50 text-green-700') : (isDark ? 'bg-gray-800 text-orange-400' : 'bg-orange-50 text-orange-700')}`}>\n {localInfo?.hasKeyshare ? <CheckCircle2 className=\"h-4 w-4 mr-1\" /> : <AlertTriangle className=\"h-4 w-4 mr-1\" />}\n {localInfo?.hasKeyshare ? 'Ready' : 'Missing'}\n </span>\n </div>\n <div className=\"space-y-2 text-center\">\n <div className=\"flex items-center justify-center gap-2\"><Shield className={`h-4 w-4 ${isDark ? 'text-gray-400' : 'text-gray-500'}`} /><span className={`text-sm font-medium ${isDark ? 'text-gray-200' : 'text-gray-800'}`}>Vault</span></div>\n <span className={`inline-flex items-center text-sm px-3 py-2 rounded-full ${hasServerBackup ? (isDark ? 'bg-gray-800 text-green-400' : 'bg-green-50 text-green-700') : (isDark ? 'bg-gray-800 text-orange-400' : 'bg-orange-50 text-orange-700')}`}>\n {hasServerBackup ? <CheckCircle2 className=\"h-4 w-4 mr-1\" /> : <AlertTriangle className=\"h-4 w-4 mr-1\" />}\n {hasServerBackup ? 'Ready' : 'None'}\n </span>\n </div>\n </div>\n\n {/* Local keyshare details */}\n {localInfo?.hasKeyshare && (\n <div className={`space-y-0.5 text-[10px] leading-tight ${isDark ? 'text-gray-400' : 'text-gray-600'}`}>\n {localInfo.ownerAddress && (\n <div>Owner: <span className={`font-mono break-all ${isDark ? 'text-gray-200' : 'text-gray-800'}`}>{localInfo.ownerAddress}</span></div>\n )}\n {typeof localInfo.keyshareSize === 'number' && (\n <div>Size: <span className={`font-mono ${isDark ? 'text-gray-200' : 'text-gray-800'}`}>{Math.round((localInfo.keyshareSize || 0) / 1024)}KB</span></div>\n )}\n {localInfo.sessionId && (\n <div>Session: <span className={`font-mono break-all ${isDark ? 'text-gray-200' : 'text-gray-800'}`}>{localInfo.sessionId}</span></div>\n )}\n </div>\n )}\n\n <div className={`space-y-0.5 text-[10px] leading-tight ${isDark ? 'text-gray-400' : 'text-gray-500'}`}>\n {backup.server.enabled && backup.server.lastBackup && (\n <div className=\"flex items-center gap-1\"><Server className=\"h-2.5 w-2.5 text-gray-400\" /><span>Server: {new Date(backup.server.lastBackup).toLocaleString()}</span></div>\n )}\n {!backup.server.lastBackup && recoveryCreatedAt && (\n <div className=\"flex items-center gap-1\"><Server className=\"h-2.5 w-2.5 text-gray-400\" /><span>Server: {new Date(recoveryCreatedAt).toLocaleString()}</span></div>\n )}\n {backup.cloud.enabled && backup.cloud.lastBackup && (\n <div className=\"flex items-center gap-1\"><Cloud className=\"h-2.5 w-2.5 text-gray-400\" /><span>Cloud: {new Date(backup.cloud.lastBackup).toLocaleString()}</span></div>\n )}\n {backup.local.enabled && backup.local.lastBackup && (\n <div className=\"flex items-center gap-1\"><HardDrive className=\"h-2.5 w-2.5 text-gray-400\" /><span>Local: {new Date(backup.local.lastBackup).toLocaleString()}</span></div>\n )}\n </div>\n\n {(recoveryCreatedAt || recoveryBrowser || recoveryUa || recoveryDeviceId || recoveryDeviceName) && (\n <div className={`space-y-0.5 text-[10px] leading-tight ${isDark ? 'text-gray-400' : 'text-gray-600'}`}>\n <div className={`font-medium text-[11px] ${isDark ? 'text-indigo-400' : 'text-indigo-600'}`}>Device Information:</div>\n {recoveryCreatedAt && <div>Created: {new Date(recoveryCreatedAt).toLocaleString()} </div>}\n {recoveryCountry && (<div>Country: {recoveryCountry}</div>)}\n {recoveryBrowser && (<div>Browser: {recoveryBrowser}</div>)}\n {parseOS(recoveryUa) && (<div>OS: {parseOS(recoveryUa) as string}</div>)}\n {recoveryDeviceName && (<div>Device: {recoveryDeviceName}</div>)}\n {recoveryDeviceId && (<div>Device ID: <span className=\"font-mono break-all\">{recoveryDeviceId}</span></div>)}\n </div>\n )}\n\n {/* Trusted Applications */}\n {trustedApps.length > 0 && (\n <div className={`space-y-2 ${isDark ? 'text-gray-400' : 'text-gray-600'}`}>\n <div className={`font-medium text-[11px] ${isDark ? 'text-green-400' : 'text-green-600'}`}>Trusted Applications ({trustedApps.length}):</div>\n <div className=\"space-y-1\">\n {trustedApps.map((app, index) => (\n <div key={index} className={`text-[10px] leading-tight p-2 rounded flex items-start justify-between gap-2 ${isDark ? 'bg-gray-800/50' : 'bg-gray-50'}`}>\n <div className=\"flex-1 min-w-0\">\n <div className={`font-medium ${isDark ? 'text-gray-200' : 'text-gray-800'}`}>{new URL(app.origin).hostname}</div>\n <div className={`${isDark ? 'text-gray-400' : 'text-gray-500'}`}>Trusted: {new Date(app.trustedAt).toLocaleDateString()}</div>\n </div>\n <button\n onClick={() => setAppToRemove({ projectId: app.projectId, origin: app.origin, hostname: new URL(app.origin).hostname })}\n className={`p-1 rounded transition-colors ${isDark ? 'text-gray-400 hover:text-red-400 hover:bg-red-900/20' : 'text-gray-500 hover:text-red-600 hover:bg-red-50'}`}\n title=\"Remove from trusted\"\n >\n <Trash2 className=\"h-3 w-3\" />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n\n </div>\n </DialogContent>\n\n {/* Confirmation Dialog for Removing Trusted App */}\n {appToRemove && (\n <Dialog open={!!appToRemove} onOpenChange={(open) => !open && setAppToRemove(null)}>\n <DialogContent className={`lumia-scope max-w-[380px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden gap-0 ${isDark ? 'lumia-dark' : 'lumia-light'}`}>\n <VisuallyHidden>\n <DialogTitle>Remove Trusted Application</DialogTitle>\n </VisuallyHidden>\n <DialogDescription className=\"sr-only\">Confirm removal of trusted application</DialogDescription>\n <div className=\"p-5 space-y-4\">\n <div className={`text-center ${theme.text}`}>\n <div className=\"text-lg font-semibold mb-2\">Remove Trusted App?</div>\n <div className={`text-sm ${isDark ? 'text-gray-300' : 'text-gray-700'} mb-3`}>\n <span className=\"font-medium\">{appToRemove.hostname}</span>\n </div>\n <div className={`text-xs ${isDark ? 'text-gray-400' : 'text-gray-600'} text-left space-y-2`}>\n <p>After removing this application from trusted list:</p>\n <ul className=\"list-disc list-inside space-y-1 ml-2\">\n <li>All transactions will require confirmation in a separate window</li>\n <li>You can add it back to trusted list at any time</li>\n <li>Transaction confirmation window will show \"Trust this app\" checkbox</li>\n </ul>\n </div>\n </div>\n <div className=\"flex gap-2\">\n <Button\n onClick={() => setAppToRemove(null)}\n variant=\"secondary\"\n className=\"flex-1\"\n size=\"lg\"\n >\n Cancel\n </Button>\n <Button\n onClick={confirmRemoveTrustedApp}\n variant=\"danger\"\n className=\"flex-1\"\n size=\"lg\"\n >\n Remove\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n )}\n </Dialog>\n );\n};\n","import * as React from 'react';\nimport { Shield, Server, CheckCircle2, AlertCircle, Key, Eye, EyeOff, Download, Cloud, Lock, ArrowLeft } from 'lucide-react';\nimport { Button } from './ui/button';\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from './ui/card';\nimport { Input } from './ui/input';\nimport { getIframeManager } from '../lib/iframe-manager';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\nimport type { BackupMethod, BackupStatus, BackupRequest, BackupResult } from '../../iframe/lib/types';\n\ninterface KeyshareBackupProps {\n userId: string;\n onBackupSuccess?: () => void;\n onBack?: () => void;\n}\n\nexport default function KeyshareBackup({ userId, onBackupSuccess, onBack }: KeyshareBackupProps) {\n const { config } = useLumiaPassportConfig();\n const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n\n const [backupStatus, setBackupStatus] = React.useState<BackupStatus>({\n server: {},\n cloud: {},\n local: {}\n });\n const [loading, setLoading] = React.useState<Record<BackupMethod, boolean>>({\n server: false,\n cloud: false,\n local: false\n });\n const [error, setError] = React.useState<string | null>(null);\n const [success, setSuccess] = React.useState<string | null>(null);\n const [showPassword, setShowPassword] = React.useState(false);\n const [useCustomPassword, setUseCustomPassword] = React.useState(false);\n const [customPassword, setCustomPassword] = React.useState('');\n const [cloudProviders, setCloudProviders] = React.useState<\n Array<{ id: string; name: string; available: boolean }>\n >([]);\n const [selectedCloudProvider, setSelectedCloudProvider] = React.useState<string | null>(null);\n const [hasKeyshareData, setHasKeyshareData] = React.useState(true);\n\n // Get iframe manager\n const iframeManager = React.useMemo(() => {\n try {\n return getIframeManager();\n } catch (e) {\n console.error('[KeyshareBackup] Failed to get iframe manager:', e);\n return null;\n }\n }, []);\n\n // Load available cloud providers (from parent context, not iframe)\n React.useEffect(() => {\n const loadCloudProviders = async () => {\n try {\n // Import cloud storage from parent context\n const { getAvailableCloudProviders } = await import('../cloudStorage');\n const availableProviders = getAvailableCloudProviders();\n\n const providers = availableProviders.map(p => ({\n id: p.id,\n name: p.name,\n available: p.isAvailable()\n }));\n\n setCloudProviders(providers);\n if (providers.length > 0 && !selectedCloudProvider) {\n setSelectedCloudProvider(providers[0].id);\n }\n } catch (error) {\n console.error('[KeyshareBackup] Failed to load cloud providers:', error);\n }\n };\n\n loadCloudProviders();\n }, [selectedCloudProvider]);\n\n // Refresh backup status\n const refreshStatus = React.useCallback(async () => {\n if (!iframeManager) return;\n\n try {\n const status = await iframeManager.getBackupStatus(userId);\n setBackupStatus(status);\n } catch (error) {\n console.error('[KeyshareBackup] Failed to get backup status:', error);\n }\n }, [iframeManager, userId]);\n\n React.useEffect(() => {\n refreshStatus();\n }, [refreshStatus]);\n\n const handleBackup = async (method: BackupMethod) => {\n if (!iframeManager) {\n setError('Iframe manager not initialized');\n return;\n }\n\n setLoading(prev => ({ ...prev, [method]: true }));\n setError(null);\n setSuccess(null);\n\n try {\n const password = useCustomPassword ? customPassword : undefined;\n\n if (method === 'server') {\n // Server backup: handled entirely in iframe\n const jwt = await import('../auth').then(m => m.jwtTokenManager.getTokens());\n const accessToken = jwt?.accessToken;\n\n const result = await iframeManager.createBackup(userId, {\n method,\n password,\n }, accessToken);\n\n if (result.success) {\n setSuccess('Successfully created server backup');\n await refreshStatus();\n onBackupSuccess?.();\n } else {\n throw new Error(result.error || 'Server backup failed');\n }\n } else if (method === 'cloud') {\n // Cloud backup: iframe encrypts, parent uploads to cloud\n const encryptedData = await iframeManager.encryptBackupData(userId, password);\n\n // Import cloud storage provider\n const { getAvailableCloudProviders } = await import('../cloudStorage');\n const providers = getAvailableCloudProviders();\n\n const provider = selectedCloudProvider\n ? providers.find(p => p.id === selectedCloudProvider)\n : providers[0];\n\n if (!provider) {\n throw new Error('No cloud provider available');\n }\n\n // Authenticate if needed\n if (!provider.isAuthenticated()) {\n const authenticated = await provider.authenticate();\n if (!authenticated) {\n throw new Error(`Failed to authenticate with ${provider.name}`);\n }\n }\n\n // Upload to cloud\n const timestamp = Date.now();\n const fileName = `lumia-keyshare-backup-${userId}-${timestamp}.json`;\n const fileContent = JSON.stringify(encryptedData, null, 2);\n await provider.upload(fileName, fileContent, true);\n\n setSuccess(`Successfully created cloud backup on ${provider.name}`);\n await refreshStatus();\n onBackupSuccess?.();\n } else if (method === 'local') {\n // Local file backup: iframe encrypts, parent downloads\n const encryptedData = await iframeManager.encryptBackupData(userId, password);\n\n const blob = new Blob([JSON.stringify(encryptedData, null, 2)], {\n type: 'application/json',\n });\n\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `lumia-passport-backup-${userId}-${Date.now()}.json`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n\n setSuccess('Backup file downloaded successfully');\n await refreshStatus();\n onBackupSuccess?.();\n }\n\n // Dispatch event for other components\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('lumia-passport-backup-status-changed', {\n detail: { method, success: true },\n })\n );\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'Backup creation failed';\n setError(errorMsg);\n await refreshStatus();\n } finally {\n setLoading(prev => ({ ...prev, [method]: false }));\n }\n };\n\n const formatLastBackup = (timestamp?: number) => {\n if (!timestamp) return 'Never';\n const date = new Date(timestamp);\n return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;\n };\n\n return (\n <Card className={`${theme.modalBg} border-0`}>\n <CardHeader className=\"pb-3\">\n <div className=\"flex items-center gap-2\">\n {onBack && (\n <button\n onClick={onBack}\n className={`p-1 ${isDark ? 'text-gray-400 hover:text-gray-300' : 'text-gray-500 hover:text-gray-700'}`}\n title=\"Back\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </button>\n )}\n <Shield className={`h-5 w-5 ${isDark ? 'text-green-400' : 'text-green-600'}`} />\n <CardTitle className={`text-base ${theme.titleText}`}>Create Backup</CardTitle>\n </div>\n <CardDescription className={`text-sm mt-1 ${theme.mutedText}`}>Secure your keyshare with encrypted backups</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3.5\">\n {error && (\n <div className={`flex items-center gap-2 p-2 rounded text-xs ${isDark ? 'bg-red-950/50 border border-red-900/60 text-red-300' : 'bg-red-50 border border-red-200 text-red-700'}`}>\n <AlertCircle className=\"h-3.5 w-3.5 flex-shrink-0\" />\n <span>{error}</span>\n </div>\n )}\n {success && (\n <div className={`flex items-center gap-2 p-2 rounded text-xs ${isDark ? 'bg-green-950/50 border border-green-900/60 text-green-300' : 'bg-green-50 border border-green-200 text-green-700'}`}>\n <CheckCircle2 className=\"h-3.5 w-3.5 flex-shrink-0\" />\n <span>{success}</span>\n </div>\n )}\n\n <div className=\"space-y-2\">\n <div className={`text-xs font-medium ${isDark ? 'text-gray-300' : 'text-gray-700'}`}>Encryption Method:</div>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n id=\"use-backup-password\"\n checked={useCustomPassword}\n onChange={e => setUseCustomPassword(e.target.checked)}\n className=\"rounded\"\n />\n <label htmlFor=\"use-backup-password\" className={`text-xs ${isDark ? 'text-gray-300' : 'text-gray-700'}`}>\n Use custom password instead of passkey\n </label>\n </div>\n\n {!useCustomPassword && (\n <div className={`p-2 rounded text-xs ${isDark ? 'bg-blue-500/10 border border-blue-500/30 text-gray-300' : 'bg-blue-50 border border-blue-200 text-blue-700'}`}>\n <div className=\"flex items-center gap-2\">\n <Key className=\"h-3.5 w-3.5 text-blue-500\" />\n <span>Passkey will be used to encrypt the backup</span>\n </div>\n </div>\n )}\n\n {useCustomPassword && (\n <div className=\"relative\">\n <Input\n type={showPassword ? 'text' : 'password'}\n placeholder=\"Enter backup password\"\n value={customPassword}\n onChange={e => setCustomPassword(e.target.value)}\n className={`pr-10 text-sm ${isDark ? 'bg-gray-900 border-gray-600 text-white placeholder:text-gray-500' : 'bg-white border-gray-300 text-gray-900'}`}\n style={{\n WebkitTextFillColor: isDark ? '#ffffff' : '#111827',\n }}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className={`absolute right-3 inset-y-0 my-auto h-fit z-10 bg-transparent border-0 p-0 flex items-center justify-center ${isDark ? 'text-gray-400 hover:text-gray-200' : 'text-gray-500 hover:text-gray-700'}`}\n >\n {showPassword ? <EyeOff className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\n </button>\n </div>\n )}\n </div>\n\n <div className=\"space-y-2.5\">\n <div className={`text-xs font-medium ${isDark ? 'text-gray-300' : 'text-gray-700'}`}>Choose Backup Method:</div>\n\n {/* Server Backup */}\n <div className={`p-3 rounded ${isDark ? 'bg-blue-500/10' : 'bg-blue-50/50'}`}>\n <div className=\"flex items-center gap-2 mb-2\">\n <Server className={`h-4 w-4 ${isDark ? 'text-blue-400' : 'text-blue-600'}`} />\n <div className={`text-sm font-medium ${isDark ? 'text-gray-200' : 'text-gray-900'}`}>Server Backup</div>\n </div>\n <Button\n onClick={() => handleBackup('server')}\n disabled={loading.server || (useCustomPassword && !customPassword) || !hasKeyshareData}\n className=\"w-full py-2 text-sm\"\n >\n {loading.server ? 'Creating...' : useCustomPassword ? 'Create with Password' : 'Create with Passkey'}\n </Button>\n </div>\n\n {/* Cloud Backup & File Backup in one row */}\n <div className=\"grid grid-cols-2 gap-2\">\n {/* Cloud Backup */}\n <div className={`p-3 rounded flex flex-col ${isDark ? 'bg-sky-500/10' : 'bg-sky-50/50'}`}>\n <div className=\"flex items-center gap-2 mb-2\">\n <Cloud className={`h-4 w-4 ${isDark ? 'text-sky-400' : 'text-sky-600'}`} />\n <div className={`text-sm font-medium ${isDark ? 'text-gray-200' : 'text-gray-900'}`}>Cloud</div>\n </div>\n\n {/* Cloud Provider Selection - compact */}\n {cloudProviders.length > 1 && (\n <select\n value={selectedCloudProvider || ''}\n onChange={e => setSelectedCloudProvider(e.target.value)}\n className={`text-xs border rounded px-2 py-1 w-full mb-2 ${isDark ? 'bg-gray-800 border-gray-700 text-gray-200' : 'bg-white border-gray-300'}`}\n >\n {cloudProviders.map(provider => (\n <option key={provider.id} value={provider.id} disabled={!provider.available}>\n {provider.name}\n </option>\n ))}\n </select>\n )}\n\n <Button\n onClick={() => handleBackup('cloud')}\n disabled={loading.cloud || (useCustomPassword && !customPassword) || !hasKeyshareData || cloudProviders.length === 0}\n className=\"w-full py-2 text-xs\"\n size=\"sm\"\n >\n {loading.cloud ? 'Creating...' : 'Create'}\n </Button>\n </div>\n\n {/* File Backup */}\n <div className={`p-3 rounded flex flex-col ${isDark ? 'bg-purple-500/10' : 'bg-purple-50/50'}`}>\n <div className=\"flex items-center gap-2 mb-2\">\n <Download className={`h-4 w-4 ${isDark ? 'text-purple-400' : 'text-purple-600'}`} />\n <div className={`text-sm font-medium ${isDark ? 'text-gray-200' : 'text-gray-900'}`}>File</div>\n </div>\n {/* Spacer to push button down when cloud has select */}\n {cloudProviders.length > 1 && <div className=\"h-[32px]\" />}\n <Button\n onClick={() => handleBackup('local')}\n disabled={loading.local || (useCustomPassword && !customPassword) || !hasKeyshareData}\n className=\"w-full py-2 text-xs\"\n size=\"sm\"\n >\n {loading.local ? 'Creating...' : 'Download'}\n </Button>\n </div>\n </div>\n </div>\n\n <div className={`flex items-start gap-2 p-2.5 rounded text-xs ${isDark ? 'bg-amber-500/15 border border-amber-500/30 text-gray-300' : 'bg-amber-50 border border-amber-200 text-amber-900'}`}>\n <Lock className=\"h-3.5 w-3.5 mt-0.5 flex-shrink-0 text-amber-500\" />\n <div>\n <span className=\"font-medium\">Security Notice:</span> All backups are encrypted with AES-256 using your {useCustomPassword ? 'custom password' : 'passkey'}.\n {useCustomPassword ? ' Store your password securely - ' : ' Your passkey authenticator is required to restore backups. '}\n Without backup access, you cannot recover your account if you lose this device.\n </div>\n </div>\n </CardContent>\n </Card>\n );\n}","import React from 'react';\nimport { Dialog, DialogContent, DialogTitle, DialogDescription } from './ui/dialog';\nimport { VisuallyHidden } from './ui/visually-hidden';\nimport { useSmartAccountTransactions } from '../../modules/smartAccountTransactions';\nimport { useLumiaPassportSession } from '../../context/LumiaPassportSessionContext';\nimport { Activity, ArrowUpRight, ArrowDownRight, Clock, CheckCircle2, XCircle, ExternalLink, ArrowLeft, RefreshCw } from 'lucide-react';\nimport { formatEther } from 'viem';\nimport { getExplorerUrl } from '../clients/base';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\n\nexport interface TransactionsModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onBack?: () => void;\n}\n\ninterface Transaction {\n hash: string;\n value: string;\n from: {\n hash: string;\n is_contract: boolean;\n name: string | null;\n };\n to: {\n hash: string;\n is_contract: boolean;\n name: string | null;\n };\n status: string;\n timestamp: string;\n gas_used: string;\n fee: {\n value: string;\n };\n method: string | null;\n transaction_types: string[];\n block_number: number;\n nonce: number;\n}\n\nexport const TransactionsModal: React.FC<TransactionsModalProps> = ({ open, onOpenChange, onBack }) => {\n const { address } = useLumiaPassportSession();\n const [transactions, setTransactions] = React.useState<Transaction[]>([]);\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const { config } = useLumiaPassportConfig();\n const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n\n const loadTransactions = React.useCallback(async () => {\n if (!address) return;\n\n setLoading(true);\n setError(null);\n try {\n const explorerUrl = getExplorerUrl();\n const baseUrl = explorerUrl.replace(/\\/$/, '');\n const apiUrl = `${baseUrl}/api/v2/addresses/${address}/transactions?items_count=20`;\n\n const response = await fetch(apiUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch transactions: ${response.status}`);\n }\n\n const data = await response.json();\n setTransactions(data.items || []);\n } catch (error) {\n console.error('Failed to load transactions:', error);\n setError(error instanceof Error ? error.message : 'Failed to load transactions');\n } finally {\n setLoading(false);\n }\n }, [address]);\n\n React.useEffect(() => {\n // Only load once when modal opens\n if (open && address && !loading && transactions.length === 0) {\n loadTransactions();\n }\n }, [open]); // Remove dependencies to prevent multiple calls\n\n const formatAddress = (addr: string) => {\n return `${addr.slice(0, 6)}...${addr.slice(-4)}`;\n };\n\n const formatTime = (timestamp: string) => {\n return new Date(timestamp).toLocaleString();\n };\n\n const formatValue = (value: string) => {\n try {\n const wei = BigInt(value);\n const eth = Number(wei) / 1e18;\n return eth.toFixed(4);\n } catch {\n return '0.0000';\n }\n };\n\n const getStatusIcon = (status: string) => {\n return status === 'ok' ?\n <CheckCircle2 className=\"w-4 h-4 text-green-500\" /> :\n <XCircle className=\"w-4 h-4 text-red-500\" />;\n };\n\n const getTransactionIcon = (from: string, to: string) => {\n const isIncoming = to.toLowerCase() === address?.toLowerCase();\n return isIncoming ?\n <ArrowDownRight className=\"w-4 h-4 text-green-500\" /> :\n <ArrowUpRight className=\"w-4 h-4 text-blue-500\" />;\n };\n\n const openInExplorer = (txHash: string) => {\n const explorerUrl = getExplorerUrl();\n window.open(`${explorerUrl}/tx/${txHash}`, '_blank');\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className={`lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden max-h-[80vh] gap-0 ${isDark ? 'lumia-dark' : 'lumia-light'}`}>\n <VisuallyHidden>\n <DialogTitle>Transaction History</DialogTitle>\n </VisuallyHidden>\n <DialogDescription className=\"sr-only\">View your transaction history</DialogDescription>\n\n <div className={`p-5 border-b ${theme.divider}`}>\n <div className=\"flex items-center gap-2\">\n {onBack && (\n <button\n onClick={onBack}\n className={`${theme.iconColor} hover:${isDark ? 'text-gray-200' : 'text-gray-700'} p-1 mr-1`}\n title=\"Back\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </button>\n )}\n <div className={`flex items-center gap-2 ${theme.titleText} font-semibold`}>\n <Activity className=\"h-5 w-5\" />\n <span>Transaction History</span>\n <button\n onClick={loadTransactions}\n disabled={loading}\n className={`${theme.iconColor} hover:${isDark ? 'text-gray-200' : 'text-gray-700'} p-1`}\n title=\"Refresh transactions\"\n >\n <RefreshCw className={`h-4 w-4 ${loading ? 'animate-spin' : ''}`} />\n </button>\n </div>\n </div>\n </div>\n\n <div className=\"p-5 max-h-[60vh] overflow-y-auto\">\n {loading ? (\n <div className=\"flex items-center justify-center py-8\">\n <div className={`${theme.mutedText}`}>Loading transactions...</div>\n </div>\n ) : error ? (\n <div className={`flex flex-col items-center justify-center py-8 ${isDark ? 'text-red-400' : 'text-red-500'}`}>\n <XCircle className=\"w-12 h-12 mb-2\" />\n <p className=\"text-center text-sm\">{error}</p>\n </div>\n ) : transactions.length === 0 ? (\n <div className={`flex flex-col items-center justify-center py-8 ${theme.mutedText}`}>\n <Activity className={`w-12 h-12 mb-2 ${isDark ? 'text-gray-600' : 'text-gray-300'}`} />\n <p className=\"text-center\">No transactions found<br/>\n <span className=\"text-xs mt-2\">Smart account transactions will appear here</span>\n </p>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {transactions.map((tx) => {\n const isIncoming = tx.to.hash.toLowerCase() === address?.toLowerCase();\n const displayAddress = isIncoming ? tx.from.hash : tx.to.hash;\n\n return (\n <div\n key={tx.hash}\n className={`${isDark ? 'bg-gray-800 hover:bg-gray-700' : 'bg-gray-50 hover:bg-gray-100'} rounded-xl p-4 transition-colors cursor-pointer`}\n onClick={() => openInExplorer(tx.hash)}\n >\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n {getTransactionIcon(tx.from.hash, tx.to.hash)}\n <span className={`font-medium ${theme.titleText}`}>\n {isIncoming ? 'Received' : 'Sent'}\n </span>\n {getStatusIcon(tx.status)}\n </div>\n <div className={`text-xs ${theme.mutedText}`}>\n {formatTime(tx.timestamp)}\n </div>\n </div>\n\n <div className=\"space-y-1 text-sm\">\n <div className=\"flex justify-between\">\n <span className={`${theme.bodyText}`}>\n {isIncoming ? 'From:' : 'To:'}\n </span>\n <span className={`font-mono ${theme.titleText}`}>\n {formatAddress(displayAddress)}\n {(isIncoming ? tx.from.is_contract : tx.to.is_contract) &&\n <span className={`text-xs ${isDark ? 'text-blue-400' : 'text-blue-600'} ml-1`}>(Contract)</span>\n }\n </span>\n </div>\n\n <div className=\"flex justify-between\">\n <span className={`${theme.bodyText}`}>Value:</span>\n <span className={`font-semibold ${theme.titleText}`}>\n {formatValue(tx.value)} LUMIA\n </span>\n </div>\n\n <div className=\"flex justify-between\">\n <span className={`${theme.bodyText}`}>Block:</span>\n <span className={`font-mono ${theme.titleText}`}>#{tx.block_number}</span>\n </div>\n\n {tx.method && (\n <div className=\"flex justify-between\">\n <span className={`${theme.bodyText}`}>Method:</span>\n <span className={`${isDark ? 'text-blue-400' : 'text-blue-600'} text-xs`}>{tx.method}</span>\n </div>\n )}\n\n {tx.transaction_types && tx.transaction_types.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mt-2\">\n {tx.transaction_types.map((type, idx) => (\n <span\n key={idx}\n className={`text-xs ${isDark ? 'bg-blue-900/30 text-blue-300' : 'bg-blue-100 text-blue-800'} px-2 py-0.5 rounded-full`}\n >\n {type.replace('_', ' ')}\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {transactions.length > 0 && (\n <div className={`p-5 border-t ${theme.divider}`}>\n <div className={`text-center text-sm ${theme.mutedText}`}>\n Total: {transactions.length} transaction{transactions.length !== 1 ? 's' : ''}\n </div>\n </div>\n )}\n </DialogContent>\n </Dialog>\n );\n};","import React from 'react';\nimport { Dialog, DialogContent, DialogTitle, DialogDescription } from './ui/dialog';\nimport { VisuallyHidden } from './ui/visually-hidden';\nimport { useAssets } from '../../modules/assets';\nimport { useLumiaPassportSession } from '../../context/LumiaPassportSessionContext';\nimport { Gem, RefreshCw, Copy, ExternalLink, ArrowLeft } from 'lucide-react';\nimport { LUMIA_EXPLORER_URL } from '../clients/base';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\n\nexport interface ViewAssetsModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onBack?: () => void;\n}\n\nexport const ViewAssetsModal: React.FC<ViewAssetsModalProps> = ({ open, onOpenChange, onBack }) => {\n const { address } = useLumiaPassportSession();\n const { assets, refreshBalances, isLoading } = useAssets(address as `0x${string}` | undefined);\n const [copied, setCopied] = React.useState<string | null>(null);\n const { config } = useLumiaPassportConfig();\n const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n\n const handleCopy = async (text: string, type: string) => {\n try {\n await navigator.clipboard.writeText(text);\n setCopied(type);\n setTimeout(() => setCopied(null), 1500);\n } catch (error) {\n console.error('Failed to copy:', error);\n }\n };\n\n const openInExplorer = (address: string) => {\n window.open(`${LUMIA_EXPLORER_URL}/address/${address}`, '_blank');\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className={`lumia-scope max-w-[400px] p-0 border-0 ${theme.modalBg} rounded-2xl overflow-hidden max-h-[80vh] gap-0 ${isDark ? 'lumia-dark' : 'lumia-light'}`}>\n <VisuallyHidden>\n <DialogTitle>View Assets</DialogTitle>\n </VisuallyHidden>\n <DialogDescription className=\"sr-only\">View your token balances and assets</DialogDescription>\n\n <div className={`p-5 border-b ${theme.divider}`}>\n <div className=\"flex items-center gap-2\">\n {onBack && (\n <button\n onClick={onBack}\n className={`${theme.iconColor} hover:${isDark ? 'text-gray-200' : 'text-gray-700'} p-1 mr-1`}\n title=\"Back\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </button>\n )}\n <div className={`flex items-center gap-2 ${theme.titleText} font-semibold`}>\n <Gem className=\"h-5 w-5\" />\n <span>Your Assets</span>\n <button\n onClick={refreshBalances}\n disabled={isLoading}\n className={`${theme.iconColor} hover:${isDark ? 'text-gray-200' : 'text-gray-700'} p-1`}\n title=\"Refresh balances\"\n >\n <RefreshCw className={`h-4 w-4 ${isLoading ? 'animate-spin' : ''}`} />\n </button>\n </div>\n </div>\n </div>\n\n <div className=\"p-5 max-h-[60vh] overflow-y-auto\">\n {isLoading ? (\n <div className=\"flex items-center justify-center py-8\">\n <div className={`${theme.mutedText}`}>Loading assets...</div>\n </div>\n ) : assets.length === 0 ? (\n <div className={`flex flex-col items-center justify-center py-8 ${theme.mutedText}`}>\n <Gem className={`w-12 h-12 mb-2 ${isDark ? 'text-gray-600' : 'text-gray-300'}`} />\n <p>No assets found</p>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {assets.map((asset, index) => (\n <div key={`${asset.type}-${asset.address || 'native'}-${index}`} className={`${isDark ? 'bg-gray-800 hover:bg-gray-700' : 'bg-gray-50 hover:bg-gray-100'} rounded-xl p-4 transition-colors`}>\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 bg-gradient-to-br from-purple-500 to-blue-600 rounded-full flex items-center justify-center\">\n <span className=\"text-white font-bold text-sm\">\n {asset.symbol.charAt(0)}\n </span>\n </div>\n <div>\n <div className={`font-medium ${theme.titleText}`}>{asset.name}</div>\n <div className={`text-sm ${theme.mutedText}`}>{asset.symbol}</div>\n </div>\n </div>\n <div className=\"text-right\">\n <div className={`font-mono ${theme.titleText}`}>{asset.formattedBalance}</div>\n <div className={`text-sm ${theme.mutedText}`}>{asset.symbol}</div>\n </div>\n </div>\n\n {asset.address && (\n <div className={`space-y-2 mt-3 pt-3 border-t ${theme.divider}`}>\n <div className=\"flex items-center justify-between text-sm\">\n <span className={`${theme.bodyText}`}>Contract Address:</span>\n <div className=\"flex items-center gap-2\">\n <span className={`font-mono ${theme.titleText} text-xs`}>\n {`${asset.address.slice(0, 6)}...${asset.address.slice(-4)}`}\n </span>\n <button\n onClick={() => handleCopy(asset.address!, 'address')}\n className={`${isDark ? 'text-gray-500 hover:text-gray-300' : 'text-gray-400 hover:text-gray-600'}`}\n title=\"Copy address\"\n >\n {copied === 'address' ? (\n <span className={`${isDark ? 'text-green-400' : 'text-green-500'} text-xs`}>✓</span>\n ) : (\n <Copy className=\"w-3 h-3\" />\n )}\n </button>\n <button\n onClick={() => openInExplorer(asset.address!)}\n className={`${isDark ? 'text-gray-500 hover:text-gray-300' : 'text-gray-400 hover:text-gray-600'}`}\n title=\"View in explorer\"\n >\n <ExternalLink className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n\n {asset.decimals && (\n <div className=\"flex items-center justify-between text-sm\">\n <span className={`${theme.bodyText}`}>Decimals:</span>\n <span className={`${theme.titleText}`}>{asset.decimals}</span>\n </div>\n )}\n </div>\n )}\n\n {asset.type === 'native' && address && (\n <div className=\"mt-3 pt-3 border-t border-gray-200\">\n <div className=\"flex items-center justify-between text-sm\">\n <span className={`${theme.bodyText}`}>Your Address:</span>\n <div className=\"flex items-center gap-2\">\n <span className={`font-mono ${theme.titleText} text-xs`}>\n {`${address.slice(0, 6)}...${address.slice(-4)}`}\n </span>\n <button\n onClick={() => handleCopy(address, 'wallet')}\n className={`${isDark ? 'text-gray-500 hover:text-gray-300' : 'text-gray-400 hover:text-gray-600'}`}\n title=\"Copy wallet address\"\n >\n {copied === 'wallet' ? (\n <span className={`${isDark ? 'text-green-400' : 'text-green-500'} text-xs`}>✓</span>\n ) : (\n <Copy className=\"w-3 h-3\" />\n )}\n </button>\n <button\n onClick={() => openInExplorer(address)}\n className={`${isDark ? 'text-gray-500 hover:text-gray-300' : 'text-gray-400 hover:text-gray-600'}`}\n title=\"View in explorer\"\n >\n <ExternalLink className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n\n {assets.length > 0 && (\n <div className={`p-5 border-t ${theme.divider}`}>\n <div className={`text-center text-sm ${theme.mutedText}`}>\n Total: {assets.length} asset{assets.length !== 1 ? 's' : ''}\n </div>\n </div>\n )}\n </DialogContent>\n </Dialog>\n );\n};","import React from 'react';\nimport { useBalance, useReadContract, useReadContracts } from 'wagmi';\nimport { formatEther, formatUnits, erc20Abi } from 'viem';\nimport { lumiaBeam } from '../internal/clients/base';\n\nexport interface TokenBalance {\n address: `0x${string}`;\n name: string;\n symbol: string;\n decimals: number;\n balance: string;\n formattedBalance: string;\n logo?: string;\n}\n\nexport interface Asset {\n type: 'native' | 'erc20' | 'erc721' | 'erc1155';\n address?: `0x${string}`;\n name: string;\n symbol: string;\n balance: string;\n formattedBalance: string;\n decimals?: number;\n tokenId?: string;\n logo?: string;\n}\n\n// Common ERC20 tokens on Lumia (example addresses - would need real ones)\nconst COMMON_TOKENS: Array<{\n address: `0x${string}`;\n name: string;\n symbol: string;\n decimals: number;\n logo?: string;\n}> = [\n // Add real token addresses here when available\n // {\n // address: '0x....',\n // name: 'USD Coin',\n // symbol: 'USDC',\n // decimals: 6,\n // logo: 'https://...'\n // }\n];\n\nexport function useAssets(address?: `0x${string}`) {\n // Get native LUMIA balance\n const { data: nativeBalance, isLoading: nativeBalanceLoading, refetch: refetchNativeBalance } = useBalance({\n address,\n chainId: lumiaBeam.id,\n query: {\n enabled: !!address,\n },\n });\n\n // Get ERC20 token balances\n const tokenContracts = COMMON_TOKENS.map(token => ({\n address: token.address,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: [address as `0x${string}`],\n chainId: lumiaBeam.id,\n }));\n\n const readContractsResult: any = useReadContracts({\n contracts: tokenContracts as any,\n query: {\n enabled: !!address && COMMON_TOKENS.length > 0,\n },\n } as any);\n const { data: tokenBalances, isLoading: tokenBalancesLoading, refetch: refetchTokenBalances } = readContractsResult as any;\n\n const getAllAssets = (): Asset[] => {\n const assets: Asset[] = [];\n\n // Add native LUMIA\n if (nativeBalance) {\n assets.push({\n type: 'native',\n name: 'Lumia',\n symbol: 'LUMIA',\n balance: nativeBalance.value.toString(),\n formattedBalance: parseFloat(nativeBalance.formatted).toFixed(4),\n decimals: 18,\n });\n }\n\n // Add ERC20 tokens\n if (tokenBalances && COMMON_TOKENS.length > 0) {\n tokenBalances.forEach((balance, index) => {\n const token = COMMON_TOKENS[index];\n if (balance.status === 'success' && balance.result) {\n const balanceValue = balance.result as bigint;\n const formattedBalance = formatUnits(balanceValue, token.decimals);\n\n assets.push({\n type: 'erc20',\n address: token.address,\n name: token.name,\n symbol: token.symbol,\n balance: balanceValue.toString(),\n formattedBalance: parseFloat(formattedBalance).toFixed(4),\n decimals: token.decimals,\n logo: token.logo,\n });\n }\n });\n }\n\n return assets;\n };\n\n const getTokenBalance = (tokenAddress: `0x${string}`) => {\n const tokenIndex = COMMON_TOKENS.findIndex(token =>\n token.address.toLowerCase() === tokenAddress.toLowerCase()\n );\n\n if (tokenIndex === -1 || !tokenBalances?.[tokenIndex]) {\n return null;\n }\n\n const balance = tokenBalances[tokenIndex];\n const token = COMMON_TOKENS[tokenIndex];\n\n if (balance.status === 'success' && balance.result) {\n const balanceValue = balance.result as bigint;\n const formattedBalance = formatUnits(balanceValue, token.decimals);\n\n return {\n address: token.address,\n name: token.name,\n symbol: token.symbol,\n decimals: token.decimals,\n balance: balanceValue.toString(),\n formattedBalance: parseFloat(formattedBalance).toFixed(4),\n logo: token.logo,\n };\n }\n\n return null;\n };\n\n const refreshBalances = async () => {\n await Promise.all([\n refetchNativeBalance(),\n refetchTokenBalances(),\n ]);\n };\n\n return {\n nativeBalance,\n tokenBalances,\n assets: getAllAssets(),\n getTokenBalance,\n refreshBalances,\n isLoading: nativeBalanceLoading || tokenBalancesLoading,\n isConnected: !!address,\n };\n}\n\n// Hook for getting specific token information\nexport function useTokenInfo(tokenAddress: `0x${string}`) {\n const readContractsResult: any = useReadContracts({\n contracts: [\n { address: tokenAddress, abi: erc20Abi, functionName: 'name', chainId: lumiaBeam.id },\n { address: tokenAddress, abi: erc20Abi, functionName: 'symbol', chainId: lumiaBeam.id },\n { address: tokenAddress, abi: erc20Abi, functionName: 'decimals', chainId: lumiaBeam.id },\n ] as any,\n } as any);\n const { data: tokenData, isLoading } = readContractsResult as any;\n\n if (!tokenData || isLoading) {\n return { isLoading, tokenInfo: null };\n }\n\n const [nameResult, symbolResult, decimalsResult] = tokenData;\n\n if (nameResult.status === 'success' &&\n symbolResult.status === 'success' &&\n decimalsResult.status === 'success') {\n return {\n isLoading: false,\n tokenInfo: {\n name: nameResult.result as string,\n symbol: symbolResult.result as string,\n decimals: decimalsResult.result as number,\n address: tokenAddress,\n },\n };\n }\n\n return { isLoading: false, tokenInfo: null };\n}\n\n// Hook for getting token balance for a specific token\nexport function useTokenBalance(tokenAddress: `0x${string}`, userAddress?: `0x${string}`) {\n const { data: balance, isLoading, refetch } = useReadContract({\n address: tokenAddress,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: userAddress ? [userAddress] : undefined,\n chainId: lumiaBeam.id,\n query: {\n enabled: !!userAddress,\n },\n });\n\n const { tokenInfo } = useTokenInfo(tokenAddress);\n\n const formattedBalance = React.useMemo(() => {\n if (!balance || !tokenInfo) return '0';\n return formatUnits(balance as bigint, tokenInfo.decimals);\n }, [balance, tokenInfo]);\n\n return {\n balance,\n formattedBalance,\n tokenInfo,\n isLoading,\n refetch,\n };\n}\n","import React, { useState, useEffect } from 'react';\nimport { Dialog, DialogContent, DialogTitle, DialogDescription } from './ui/dialog';\nimport { VisuallyHidden } from './ui/visually-hidden';\nimport { Button } from './ui/button';\nimport { Send, ArrowLeft, Loader2, CheckCircle2, AlertCircle } from 'lucide-react';\nimport { useSendTransaction } from '../../hooks/useSendTransaction';\nimport { useLumiaPassportSession } from '../../context/LumiaPassportSessionContext';\nimport { useAssets } from '../../modules/assets';\nimport { formatEther, parseEther, isAddress } from 'viem';\nimport { useBalance } from 'wagmi';\nimport { UserOpStatus } from './UserOpStatus';\nimport { lumiaBeam } from '../clients/base';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\n\nexport interface SendModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onBack?: () => void;\n recipientAddress?: string;\n amount?: string;\n}\n\nexport const SendModal: React.FC<SendModalProps> = ({\n open,\n onOpenChange,\n onBack,\n recipientAddress: initialRecipient = '',\n amount: initialAmount = ''\n}) => {\n const { address } = useLumiaPassportSession();\n const { assets } = useAssets(address as `0x${string}` | undefined);\n const { config } = useLumiaPassportConfig();\n const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n const { sendTransaction, isLoading, error, userOpHash, reset } = useSendTransaction();\n const { refetch: refetchBalance } = useBalance({\n address: address as `0x${string}` | undefined,\n chainId: lumiaBeam.id,\n });\n\n const [recipient, setRecipient] = useState(initialRecipient);\n const [amount, setAmount] = useState(initialAmount);\n const [txStep, setTxStep] = useState<'input' | 'confirm' | 'pending' | 'success'>('input');\n const [validationError, setValidationError] = useState<string | null>(null);\n\n // Get native token balance\n const nativeAsset = assets.find(a => a.type === 'native');\n const balance = nativeAsset ? parseFloat(nativeAsset.formattedBalance) : 0;\n\n useEffect(() => {\n if (open) {\n // Reset state when modal opens\n setTxStep('input');\n setValidationError(null);\n reset();\n if (!initialRecipient) setRecipient('');\n if (!initialAmount) setAmount('');\n }\n }, [open, reset, initialRecipient, initialAmount]);\n\n const validateInput = (): boolean => {\n // Validate recipient\n if (!recipient) {\n setValidationError('Please enter a recipient address');\n return false;\n }\n\n if (!isAddress(recipient)) {\n setValidationError('Invalid recipient address');\n return false;\n }\n\n if (recipient.toLowerCase() === address?.toLowerCase()) {\n setValidationError('Cannot send to yourself');\n return false;\n }\n\n // Validate amount\n const amountNum = parseFloat(amount);\n if (!amount || isNaN(amountNum) || amountNum <= 0) {\n setValidationError('Please enter a valid amount');\n return false;\n }\n\n if (amountNum > balance) {\n setValidationError('Insufficient balance');\n return false;\n }\n\n setValidationError(null);\n return true;\n };\n\n const handleSend = async () => {\n if (!validateInput()) return;\n\n setTxStep('confirm');\n };\n\n const handleConfirm = async () => {\n setTxStep('pending');\n const hash = await sendTransaction({\n to: recipient,\n value: amount\n });\n\n if (hash) {\n setTxStep('success');\n // Refresh balance after successful transaction\n setTimeout(() => {\n refetchBalance();\n }, 2000); // Wait 2 seconds for transaction to be processed\n } else {\n setTxStep('input');\n }\n };\n\n const handleClose = () => {\n onOpenChange(false);\n };\n\n const handleMaxAmount = () => {\n // Leave some for gas\n const maxAmount = Math.max(0, balance - 0.001);\n setAmount(maxAmount.toFixed(6));\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className={`lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden max-h-[80vh] gap-0 ${isDark ? 'lumia-dark' : 'lumia-light'}`}\n style={{\n borderRadius: config.ui.modal?.borderRadius || '24px',\n maxWidth: config.ui.modal?.width || '400px',\n ['--lumia-font-base' as any]: config.ui.fonts?.base,\n ['--lumia-font-heading' as any]: config.ui.fonts?.heading,\n fontFamily: (config.ui.fonts?.base as any) || 'system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif',\n }}\n >\n <VisuallyHidden>\n <DialogTitle>Send Transaction</DialogTitle>\n </VisuallyHidden>\n <DialogDescription className=\"sr-only\">Send LUMIA tokens to another address</DialogDescription>\n\n <div className={`p-5 border-b ${theme.divider}`}>\n <div className=\"flex items-center gap-2\">\n {onBack && txStep === 'input' && (\n <button\n onClick={onBack}\n className={`${theme.iconColor} hover:${isDark ? 'text-gray-200' : 'text-gray-700'} p-1 mr-1`}\n title=\"Back\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </button>\n )}\n <div className={`flex items-center gap-2 ${theme.titleText} font-semibold`}>\n <Send className=\"h-5 w-5\" />\n <span>Send LUMIA</span>\n </div>\n </div>\n </div>\n\n <div className=\"p-5\">\n {txStep === 'input' && (\n <div className=\"space-y-4\">\n <div>\n <label className={`block text-sm font-medium ${theme.bodyText} mb-2`}>\n Recipient Address\n </label>\n <input\n type=\"text\"\n value={recipient}\n onChange={(e) => setRecipient(e.target.value)}\n placeholder=\"0x...\"\n className={`w-full px-3 py-2 border ${isDark ? 'bg-gray-800 border-gray-600 text-white placeholder:text-gray-400' : 'bg-white border-gray-300 text-gray-900 placeholder:text-gray-400'} rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500`}\n />\n </div>\n\n <div>\n <div className=\"flex justify-between items-center mb-2\">\n <label className={`text-sm font-medium ${theme.bodyText}`}>\n Amount\n </label>\n <div className={`text-sm ${theme.mutedText}`}>\n Balance: {balance.toFixed(4)} LUMIA\n </div>\n </div>\n <div className=\"relative\">\n <input\n type=\"number\"\n value={amount}\n onChange={(e) => setAmount(e.target.value)}\n placeholder=\"0.0\"\n step=\"0.000001\"\n className={`w-full px-3 py-2 pr-16 border ${isDark ? 'bg-gray-800 border-gray-600 text-white placeholder:text-gray-400' : 'bg-white border-gray-300 text-gray-900 placeholder:text-gray-400'} rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500`}\n />\n <button\n onClick={handleMaxAmount}\n className={`absolute right-2 top-1/2 -translate-y-1/2 px-2 py-1 text-xs ${isDark ? 'text-blue-400 hover:text-blue-300' : 'text-blue-600 hover:text-blue-800'}`}\n >\n MAX\n </button>\n </div>\n </div>\n\n {(validationError || error) && (\n <div className={`flex items-center gap-2 p-3 ${isDark ? 'bg-red-900/30 text-red-400' : 'bg-red-50 text-red-700'} rounded-lg`}>\n <AlertCircle className=\"h-4 w-4\" />\n <span className=\"text-sm\">{validationError || error}</span>\n </div>\n )}\n\n <Button\n onClick={handleSend}\n disabled={isLoading}\n className=\"w-full\"\n size=\"lg\"\n >\n Continue\n </Button>\n </div>\n )}\n\n {txStep === 'confirm' && (\n <div className=\"space-y-4\">\n <div className={`${isDark ? 'bg-gray-800' : 'bg-gray-50'} rounded-lg p-4`}>\n <h3 className={`font-medium ${theme.titleText} mb-3`}>Transaction Details</h3>\n <div className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between\">\n <span className={`${theme.bodyText}`}>To:</span>\n <span className={`font-mono ${theme.titleText}`}>\n {`${recipient.slice(0, 6)}...${recipient.slice(-4)}`}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className={`${theme.bodyText}`}>Amount:</span>\n <span className={`font-semibold ${theme.titleText}`}>{amount} LUMIA</span>\n </div>\n <div className=\"flex justify-between\">\n <span className={`${theme.bodyText}`}>Network:</span>\n <span className={`${theme.titleText}`}>Lumia Beam</span>\n </div>\n </div>\n </div>\n\n <div className=\"flex gap-2\">\n <Button\n onClick={() => setTxStep('input')}\n variant=\"outline\"\n className=\"flex-1\"\n size=\"lg\"\n >\n Back\n </Button>\n <Button\n onClick={handleConfirm}\n disabled={isLoading}\n className=\"flex-1\"\n size=\"lg\"\n >\n {isLoading && <Loader2 className=\"h-4 w-4 animate-spin\" />}\n Confirm\n </Button>\n </div>\n </div>\n )}\n\n {txStep === 'pending' && (\n <div className=\"py-8 text-center space-y-4\">\n <Loader2 className={`h-12 w-12 animate-spin ${isDark ? 'text-blue-400' : 'text-blue-600'} mx-auto`} />\n <div>\n <p className={`font-medium ${theme.titleText}`}>Transaction Pending</p>\n <p className={`text-sm ${theme.mutedText} mt-1`}>Please wait while we process your transaction</p>\n </div>\n </div>\n )}\n\n {txStep === 'success' && userOpHash && (\n <div className=\"space-y-4\">\n <div className=\"text-center py-4\">\n <CheckCircle2 className={`h-12 w-12 ${isDark ? 'text-green-400' : 'text-green-500'} mx-auto mb-3`} />\n <p className={`font-medium ${theme.titleText}`}>Transaction Sent!</p>\n <p className={`text-sm ${theme.mutedText} mt-1`}>Your transaction is being processed</p>\n </div>\n\n <div className={`${isDark ? 'bg-gray-800' : 'bg-gray-50'} rounded-lg p-4`}>\n <UserOpStatus userOpHash={userOpHash} chain={lumiaBeam} />\n </div>\n\n <Button\n onClick={handleClose}\n className=\"w-full\"\n size=\"lg\"\n >\n Done\n </Button>\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n","import { useState, useCallback } from 'react';\nimport { parseEther, isAddress } from 'viem';\nimport { sendUserOperation } from '../internal/clients/account';\nimport { useLumiaPassportSession } from '../context/LumiaPassportSessionContext';\n\nexport interface SendTransactionParams {\n to: `0x${string}`;\n value: string;\n data?: `0x${string}`;\n}\n\nexport interface UseSendTransactionReturn {\n sendTransaction: (params: SendTransactionParams) => Promise<string | null>;\n isLoading: boolean;\n error: string | null;\n userOpHash: string | null;\n reset: () => void;\n}\n\nexport function useSendTransaction(): UseSendTransactionReturn {\n const { session, address } = useLumiaPassportSession();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [userOpHash, setUserOpHash] = useState<string | null>(null);\n\n const sendTransaction = useCallback(async (params: SendTransactionParams): Promise<string | null> => {\n if (!session || !address) {\n setError('No active session');\n return null;\n }\n\n // Validate recipient address\n if (!isAddress(params.to)) {\n setError('Invalid recipient address');\n return null;\n }\n\n // Validate amount\n const value = parseFloat(params.value);\n if (isNaN(value) || value < 0) {\n setError('Invalid amount');\n return null;\n }\n\n setIsLoading(true);\n setError(null);\n setUserOpHash(null);\n\n try {\n // Convert value to wei\n const valueWei = parseEther(params.value).toString();\n\n // Send the transaction\n const hash = await sendUserOperation(\n session,\n params.to,\n valueWei,\n (params.data || '0x') as `0x${string}`,\n 'standard',\n 'v0.7'\n );\n\n setUserOpHash(hash);\n return hash;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Transaction failed';\n setError(errorMessage);\n return null;\n } finally {\n setIsLoading(false);\n }\n }, [session, address]);\n\n const reset = useCallback(() => {\n setError(null);\n setUserOpHash(null);\n setIsLoading(false);\n }, []);\n\n return {\n sendTransaction,\n isLoading,\n error,\n userOpHash,\n reset\n };\n}","import * as React from 'react';\nimport { AlertCircle, CheckCircle2, Clock, Copy, ExternalLink, RefreshCw } from 'lucide-react';\nimport { Button } from './ui/button';\nimport { Badge } from './ui/badge';\nimport { Address } from './Address';\nimport { cn } from '../utils/cn';\nimport { getBundlerUrl } from '../clients/base';\n\ntype ChainLike = {\n id: number;\n blockExplorers?: { default?: { url: string } };\n};\n\nexport type UserOpStatusProps = {\n userOpHash: `0x${string}` | string;\n chain?: ChainLike;\n className?: string;\n pollMs?: number;\n maxPollTimeMs?: number; // Maximum time to poll before giving up\n // Optional: provide external state to avoid duplicate polling\n externalState?: {\n receipt?: any | null;\n mempool?: any | null;\n error?: string | null;\n isPolling?: boolean;\n };\n};\n\nexport const UserOpStatus: React.FC<UserOpStatusProps> = ({\n userOpHash,\n chain,\n className,\n pollMs = 1000,\n maxPollTimeMs = 60000, // Default 1 minute\n externalState,\n}) => {\n // If external state is provided, use it instead of internal polling\n const useExternalState = !!externalState;\n\n const [internalReceipt, setInternalReceipt] = React.useState<any | null>(null);\n const [internalMempool, setInternalMempool] = React.useState<any | null>(null);\n const [internalError, setInternalError] = React.useState<string | null>(null);\n const [attempt, setAttempt] = React.useState<number>(0);\n const [internalRefreshing, setInternalRefreshing] = React.useState<boolean>(false);\n const [timedOut, setTimedOut] = React.useState<boolean>(false);\n const [rejected, setRejected] = React.useState<boolean>(false);\n const intervalRef = React.useRef<NodeJS.Timeout | null>(null);\n const startTimeRef = React.useRef<number>(Date.now());\n\n // Use external state if provided, otherwise use internal state\n const receipt = useExternalState ? externalState.receipt ?? null : internalReceipt;\n const mempool = useExternalState ? externalState.mempool ?? null : internalMempool;\n const error = useExternalState ? externalState.error ?? null : internalError;\n const refreshing = useExternalState ? externalState.isPolling ?? false : internalRefreshing;\n\n const rpc = React.useCallback(async (method: string, params: any[]) => {\n const body = { jsonrpc: '2.0', id: 1, method, params };\n const res = await fetch(getBundlerUrl(), {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body),\n });\n const json = await res.json();\n if (json.error) throw new Error(json.error.message || JSON.stringify(json.error));\n return json.result;\n }, []);\n\n // Normalize various bundler responses (e.g., Rundler nests fields under userOperation)\n const extractMempoolInfo = React.useCallback((m: any) => {\n if (!m) return null;\n const entryPoint = m.entryPoint || m?.userOperation?.entryPoint || null;\n const sender = m.sender || m?.userOperation?.sender || null;\n if (!entryPoint && !sender) return null;\n return { entryPoint, sender } as const;\n }, []);\n\n const tick = React.useCallback(async () => {\n // Don't poll if using external state\n if (useExternalState) return;\n\n // Check if we've exceeded the maximum polling time\n const elapsed = Date.now() - startTimeRef.current;\n if (elapsed > maxPollTimeMs) {\n setTimedOut(true);\n setInternalMempool(null);\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n return;\n }\n\n try {\n setInternalRefreshing(true);\n setInternalError(null);\n const r = await rpc('eth_getUserOperationReceipt', [userOpHash]);\n if (r) {\n setInternalReceipt(r);\n setInternalMempool(null);\n // Clear interval when we get receipt\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n return;\n }\n const m = await rpc('eth_getUserOperationByHash', [userOpHash]);\n if (m === null) {\n // null result means UserOperation was dropped from mempool - terminal state\n setRejected(true);\n setInternalMempool(null);\n // Clear interval when UserOp is rejected\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n return;\n }\n const info = extractMempoolInfo(m);\n setInternalMempool(info);\n } catch (e: any) {\n setInternalError(e?.message || String(e));\n } finally {\n setInternalRefreshing(false);\n setAttempt(x => x + 1);\n }\n }, [rpc, userOpHash, maxPollTimeMs, extractMempoolInfo, useExternalState]);\n\n // Initialize state when hash changes (skip if using external state)\n React.useEffect(() => {\n if (useExternalState) return;\n\n console.log('[UserOpStatus] Initializing polling for UserOp hash:', userOpHash);\n startTimeRef.current = Date.now();\n setTimedOut(false);\n setRejected(false);\n setInternalReceipt(null);\n setInternalMempool(null);\n setInternalError(null);\n setAttempt(0);\n setInternalRefreshing(false);\n }, [userOpHash, useExternalState]);\n\n // Start polling effect (skip if using external state)\n React.useEffect(() => {\n if (useExternalState) {\n console.log('[UserOpStatus] Using external state, skipping internal polling');\n return;\n }\n\n if (receipt) {\n console.log('[UserOpStatus] Already have receipt, not starting polling');\n return;\n }\n\n let mounted = true;\n\n const startPolling = async () => {\n if (mounted) {\n console.log('[UserOpStatus] Starting polling for hash:', userOpHash, 'pollMs:', pollMs);\n await tick();\n\n // Start interval only if still mounted and no receipt\n if (mounted && !receipt) {\n console.log('[UserOpStatus] Starting interval polling every', pollMs, 'ms');\n intervalRef.current = setInterval(() => {\n if (mounted) tick();\n }, pollMs);\n }\n }\n };\n\n startPolling();\n\n return () => {\n mounted = false;\n if (intervalRef.current) {\n console.log('[UserOpStatus] Clearing interval in cleanup');\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n };\n }, [userOpHash, pollMs, useExternalState]);\n\n const stateBadge = () => {\n if (receipt) {\n const ok = !!receipt.success;\n return (\n <Badge variant={ok ? 'success' : 'destructive'} className=\"gap-1\">\n {ok ?\n <CheckCircle2 className=\"h-3 w-3\" />\n : <AlertCircle className=\"h-3 w-3\" />}\n {ok ? 'Included' : 'Failed'}\n </Badge>\n );\n }\n if (rejected) {\n return (\n <Badge variant=\"destructive\" className=\"gap-1\">\n <AlertCircle className=\"h-3 w-3\" /> Rejected by bundler\n </Badge>\n );\n }\n if (timedOut) {\n return (\n <Badge variant=\"warning\" className=\"gap-1\">\n <AlertCircle className=\"h-3 w-3\" /> Timeout - may be rejected\n </Badge>\n );\n }\n if (mempool) {\n return (\n <Badge variant=\"outline\" className=\"gap-1\">\n <Clock className=\"h-3 w-3\" /> Pending in bundler\n </Badge>\n );\n }\n return (\n <Badge variant=\"secondary\" className=\"gap-1\">\n <Clock className=\"h-3 w-3\" /> Waiting\n </Badge>\n );\n };\n\n return (\n <div\n className={cn(\"lumia-scope bg-card text-card-foreground p-0 rounded-xl border border-border w-full max-w-[680px]\", className)}\n style={{ textAlign: 'left', listStyle: 'none' }}\n >\n {/* Header with Badge and Refresh button */}\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center gap-2\">\n {stateBadge()}\n <span className=\"text-xs text-muted-foreground\">\n This is a UserOperation hash (EIP-4337), not a L2 tx hash.\n </span>\n </div>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => tick()} disabled={refreshing} className=\"h-8\">\n <RefreshCw className={cn(\"h-3.5 w-3.5 mr-1\", refreshing && \"animate-spin\")} />\n <span className=\"text-xs\">Refresh</span>\n </Button>\n </div>\n\n {/* UserOp Hash Row */}\n <div className=\"flex items-center gap-2 mb-2\">\n <span className=\"text-sm font-medium min-w-16 shrink-0\">UO Hash</span>\n <code className=\"text-xs font-mono flex-1 select-all\">{userOpHash}</code>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 w-8 p-0\"\n onClick={async () => {\n try {\n await navigator.clipboard.writeText(userOpHash);\n } catch {}\n }}\n >\n <Copy className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n\n {/* Tx Hash Row (only when receipt exists) */}\n {receipt && receipt.receipt?.transactionHash && (\n <div className=\"flex items-center gap-2 mb-3\">\n <span className=\"text-sm font-medium min-w-16 shrink-0\">Tx Hash</span>\n <code className=\"text-xs font-mono flex-1 select-all\">\n {receipt.receipt.transactionHash}\n </code>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 w-8 p-0\"\n onClick={async () => {\n try {\n await navigator.clipboard.writeText(receipt.receipt.transactionHash);\n } catch {}\n }}\n >\n <Copy className=\"h-3.5 w-3.5\" />\n </Button>\n {chain?.blockExplorers?.default?.url && (\n <a\n href={`${chain.blockExplorers.default.url}/tx/${receipt.receipt.transactionHash}`}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"inline-flex items-center justify-center h-8 w-8 rounded-md hover:bg-accent text-foreground\"\n title=\"Open in explorer\"\n >\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n )}\n </div>\n )}\n\n {/* Block info (only when receipt exists) */}\n {receipt && (\n <div className=\"text-xs text-muted-foreground mb-3\">\n Block {parseInt(receipt.receipt?.blockNumber || '0x0', 16)} • Gas Used{' '}\n {parseInt(receipt.actualGasUsed || '0x0', 16)} • Success {String(!!receipt.success)}\n </div>\n )}\n\n {/* Bundler info */}\n <div className=\"text-xs text-muted-foreground\">\n {/* Bundler: {getBundlerUrl()} */}\n {!receipt && !timedOut && !rejected && (\n <span className=\"ml-2\">\n • Polling for {Math.round((Date.now() - startTimeRef.current) / 1000)}s\n </span>\n )}\n </div>\n\n {/* Mempool info */}\n {mempool && (\n <div className=\"text-sm text-muted-foreground mt-2\" style={{ listStyle: 'none' }}>\n <div>Seen by bundler at <Address address={mempool.entryPoint} chain={chain} showExplorer truncate={false} /></div>\n <div>sender <Address address={mempool.sender} chain={chain} truncate={false} /></div>\n </div>\n )}\n\n {/* Error messages */}\n {error && (\n <div className=\"text-sm text-destructive flex items-center gap-1 mt-4\">\n <AlertCircle className=\"h-4 w-4\" /> {error}\n </div>\n )}\n {rejected && (\n <div className=\"text-sm text-destructive flex items-center gap-1 mt-4\">\n <AlertCircle className=\"h-4 w-4\" />\n UserOperation was dropped from bundler mempool. This usually means it was invalid or\n replaced.\n </div>\n )}\n {timedOut && (\n <div className=\"text-sm text-destructive flex items-center gap-1 mt-4\">\n <AlertCircle className=\"h-4 w-4\" />\n Stopped polling after {Math.round(maxPollTimeMs / 1000)}s. UserOperation may have been\n rejected by the bundler.\n </div>\n )}\n </div>\n );\n};","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n {\n variants: {\n variant: {\n default:\n 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80',\n secondary:\n 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\n destructive:\n 'border-transparent bg-red-600 text-white hover:bg-red-700 dark:bg-red-700 dark:hover:bg-red-600',\n outline: 'text-foreground',\n success:\n 'border-transparent bg-green-600 text-white hover:bg-green-700 dark:bg-green-700 dark:hover:bg-green-600',\n warning:\n 'border-transparent bg-yellow-500 text-white hover:bg-yellow-600 dark:bg-yellow-600 dark:hover:bg-yellow-500',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n );\n}\n\nexport { Badge, badgeVariants };","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}","import * as React from 'react';\nimport { Copy, ExternalLink } from 'lucide-react';\nimport { Button } from './ui/button';\nimport { cn } from '../utils/cn';\n\ntype ChainLike = {\n id: number;\n blockExplorers?: { default?: { url: string } };\n};\n\nexport type AddressProps = {\n address?: `0x${string}` | string | null;\n chain?: ChainLike;\n className?: string;\n truncate?: boolean;\n showCopy?: boolean;\n showExplorer?: boolean;\n label?: string;\n};\n\nfunction toExplorerAddressUrl(address: string, chain?: ChainLike): string | null {\n const base = chain?.blockExplorers?.default?.url;\n if (!base) return null;\n return `${base.replace(/\\/$/, '')}/address/${address}`;\n}\n\nfunction short(addr: string): string {\n if (addr.length <= 14) return addr;\n return `${addr.slice(0, 10)}...${addr.slice(-8)}`;\n}\n\nexport const Address: React.FC<AddressProps> = ({\n address,\n chain,\n className,\n truncate = true,\n showCopy = true,\n showExplorer = true,\n label,\n}) => {\n const addr = address || '';\n const explorer = toExplorerAddressUrl(addr, chain || undefined);\n const [copied, setCopied] = React.useState(false);\n\n if (!addr) return <span className={cn('text-muted-foreground', className)}>—</span>;\n\n return (\n <div className={cn('flex items-center gap-2', className)} style={{ listStyle: 'none' }}>\n {label && <span className=\"text-sm font-medium\">{label}</span>}\n <code className=\"text-xs bg-background px-2 py-1 rounded select-all\">\n {truncate ? short(addr) : addr}\n </code>\n {showCopy && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n title={copied ? 'Copied' : 'Copy address'}\n onClick={async () => {\n try {\n await navigator.clipboard.writeText(addr);\n setCopied(true);\n setTimeout(() => setCopied(false), 1200);\n } catch {}\n }}\n >\n <Copy className=\"h-4 w-4\" />\n </Button>\n )}\n {showExplorer && explorer && (\n <a\n href={explorer}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"inline-flex items-center justify-center h-10 w-10 rounded-md hover:bg-accent text-foreground\"\n title=\"Open in explorer\"\n >\n <ExternalLink className=\"h-4 w-4\" />\n </a>\n )}\n </div>\n );\n};","import React, { useState, useEffect } from 'react';\nimport { Dialog, DialogContent, DialogTitle, DialogDescription } from './ui/dialog';\nimport { VisuallyHidden } from './ui/visually-hidden';\nimport { Button } from './ui/button';\nimport { QrCode, Copy, ArrowLeft, CheckCircle2 } from 'lucide-react';\nimport { useLumiaPassportSession } from '../../context/LumiaPassportSessionContext';\nimport QRCode from 'qrcode';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\n\nexport interface ReceiveModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onBack?: () => void;\n}\n\nexport const ReceiveModal: React.FC<ReceiveModalProps> = ({\n open,\n onOpenChange,\n onBack\n}) => {\n const { address } = useLumiaPassportSession();\n const [qrCodeUrl, setQrCodeUrl] = useState<string>('');\n const { config } = useLumiaPassportConfig();\n const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n const [copied, setCopied] = useState(false);\n\n useEffect(() => {\n if (open && address) {\n // Generate QR code when modal opens\n QRCode.toDataURL(address, {\n width: 200,\n margin: 1,\n color: {\n dark: isDark ? '#FFFFFF' : '#000000',\n light: isDark ? '#000000' : '#FFFFFF'\n }\n }).then(url => {\n setQrCodeUrl(url);\n }).catch(err => {\n console.error('Failed to generate QR code:', err);\n });\n }\n }, [open, address]);\n\n const handleCopy = async () => {\n if (!address) return;\n \n try {\n await navigator.clipboard.writeText(address);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n console.error('Failed to copy address:', error);\n }\n };\n\n const formatAddress = (addr: string) => {\n if (!addr) return '';\n return `${addr.slice(0, 6)}...${addr.slice(-4)}`;\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className={`lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden max-h-[80vh] gap-0 ${isDark ? 'lumia-dark' : 'lumia-light'}`}\n style={{\n borderRadius: config.ui.modal?.borderRadius || '24px',\n maxWidth: config.ui.modal?.width || '400px',\n ['--lumia-font-base' as any]: config.ui.fonts?.base,\n ['--lumia-font-heading' as any]: config.ui.fonts?.heading,\n fontFamily: (config.ui.fonts?.base as any) || 'system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif',\n }}\n >\n <VisuallyHidden>\n <DialogTitle>Receive LUMIA</DialogTitle>\n </VisuallyHidden>\n <DialogDescription className=\"sr-only\">Your wallet address and QR code for receiving LUMIA</DialogDescription>\n\n <div className={`p-5 border-b ${theme.divider}`}>\n <div className=\"flex items-center gap-2\">\n {onBack && (\n <button\n onClick={onBack}\n className={`${theme.iconColor} hover:${isDark ? 'text-gray-200' : 'text-gray-700'} p-1 mr-1`}\n title=\"Back\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </button>\n )}\n <div className={`flex items-center gap-2 ${theme.titleText} font-semibold`}>\n <QrCode className=\"h-5 w-5\" />\n <span>Receive LUMIA</span>\n </div>\n </div>\n </div>\n\n <div className=\"p-5 space-y-4\">\n {/* QR Code */}\n {qrCodeUrl && (\n <div className=\"flex justify-center\">\n <div className={`${isDark ? 'bg-white' : 'bg-white'} p-4 rounded-xl border ${theme.divider}`}>\n <img src={qrCodeUrl} alt=\"Wallet QR Code\" className=\"w-48 h-48\" />\n </div>\n </div>\n )}\n\n {/* Network Info */}\n <div className={`${isDark ? 'bg-blue-900/30 border-blue-600' : 'bg-blue-50 border-blue-200'} rounded-lg p-3`}>\n <div className={`flex items-center gap-2 ${isDark ? 'text-blue-300' : 'text-blue-700'} text-sm`}>\n <div className=\"flex-1\">\n <p className=\"font-medium\">Network: Lumia Beam</p>\n <p className={`text-xs ${isDark ? 'text-blue-400' : 'text-blue-600'} mt-0.5`}>Ensure sender is on the same network</p>\n </div>\n </div>\n </div>\n\n {/* Address Display */}\n <div className={`${isDark ? 'bg-gray-800' : 'bg-gray-50'} rounded-lg p-4`}>\n <label className={`block text-sm font-medium ${theme.bodyText} mb-2`}>\n Your Wallet Address\n </label>\n <div className=\"flex items-center gap-2\">\n <div className={`flex-1 font-mono text-sm ${isDark ? 'text-white bg-gray-700 border-gray-600' : 'text-gray-900 bg-white border-gray-300'} rounded-lg px-3 py-2 break-all`}>\n {address}\n </div>\n </div>\n <Button\n onClick={handleCopy}\n className=\"w-full mt-3\"\n size=\"lg\"\n >\n {copied ? (\n <>\n <CheckCircle2 className=\"h-4 w-4\" />\n <span>Copied!</span>\n </>\n ) : (\n <>\n <Copy className=\"h-4 w-4\" />\n <span>Copy Address</span>\n </>\n )}\n </Button>\n </div>\n\n {/* Instructions */}\n <div className={`text-center text-sm ${theme.mutedText}`}>\n <p>Share this address to receive LUMIA tokens.</p>\n <p className=\"mt-1\">Only send LUMIA tokens to this address on Lumia Beam network.</p>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n","import React from 'react';\nimport { Dialog, DialogContent, DialogTitle, DialogDescription } from './ui/dialog';\nimport { VisuallyHidden } from './ui/visually-hidden';\nimport { Button } from './ui/button';\nimport { CreditCard, ArrowLeft } from 'lucide-react';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\n\nexport interface BuyModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onBack?: () => void;\n}\n\nexport const BuyModal: React.FC<BuyModalProps> = ({ open, onOpenChange, onBack }) => {\n const { config } = useLumiaPassportConfig();\n const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className={`lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden gap-0 ${isDark ? 'lumia-dark' : 'lumia-light'}`}\n style={{\n borderRadius: config.ui.modal?.borderRadius || '24px',\n maxWidth: config.ui.modal?.width || '400px',\n ['--lumia-font-base' as any]: config.ui.fonts?.base,\n ['--lumia-font-heading' as any]: config.ui.fonts?.heading,\n fontFamily: (config.ui.fonts?.base as any) || 'system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif',\n }}\n >\n <VisuallyHidden>\n <DialogTitle>Buy Crypto</DialogTitle>\n </VisuallyHidden>\n <DialogDescription className=\"sr-only\">On-ramp placeholder</DialogDescription>\n\n <div className={`p-5 border-b ${theme.divider}`}>\n <div className=\"flex items-center gap-2\">\n {onBack && (\n <button\n onClick={onBack}\n className={`${theme.iconColor} hover:${isDark ? 'text-gray-200' : 'text-gray-700'} p-1 mr-1`}\n title=\"Back\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </button>\n )}\n <div className={`flex items-center gap-2 ${theme.titleText} font-semibold`}>\n <CreditCard className=\"h-5 w-5\" />\n <span>Buy</span>\n </div>\n </div>\n </div>\n\n <div className=\"p-5\">\n <div className={`rounded-xl p-4 text-center ${isDark ? 'bg-gray-800' : 'bg-gray-50'}`}>\n <div className={`text-sm ${theme.mutedText}`}>On-ramp coming soon…</div>\n </div>\n\n <div className=\"pt-4\">\n <Button className=\"w-full\" onClick={() => onOpenChange(false)} size=\"lg\">\n Close\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n","import React from 'react';\nimport { Dialog, DialogContent, DialogTitle, DialogDescription } from './ui/dialog';\nimport { VisuallyHidden } from './ui/visually-hidden';\nimport { Button } from './ui/button';\nimport { ShieldCheck, ArrowLeft } from 'lucide-react';\nimport { useLumiaPassportConfig } from '../../context/LumiaPassportContext';\nimport { useTheme } from '../hooks/useTheme';\n\nexport interface KycModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onBack?: () => void;\n}\n\nexport const KycModal: React.FC<KycModalProps> = ({ open, onOpenChange, onBack }) => {\n const { config } = useLumiaPassportConfig();\n const { isDark, classes: theme } = useTheme(config.ui.theme, config.ui.colors);\n const provider = config.kyc?.provider;\n const options = config.kyc?.options || {};\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className={`lumia-scope p-0 border-0 ${theme.modalBg} overflow-hidden gap-0 ${isDark ? 'lumia-dark' : 'lumia-light'}`}\n style={{\n borderRadius: config.ui.modal?.borderRadius || '24px',\n maxWidth: config.ui.modal?.width || '400px',\n ['--lumia-font-base' as any]: config.ui.fonts?.base,\n ['--lumia-font-heading' as any]: config.ui.fonts?.heading,\n fontFamily: (config.ui.fonts?.base as any) || 'system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif',\n }}\n >\n <VisuallyHidden>\n <DialogTitle>KYC</DialogTitle>\n </VisuallyHidden>\n <DialogDescription className=\"sr-only\">KYC placeholder</DialogDescription>\n\n <div className={`p-5 border-b ${theme.divider}`}>\n <div className=\"flex items-center gap-2\">\n {onBack && (\n <button\n onClick={onBack}\n className={`${theme.iconColor} hover:${isDark ? 'text-gray-200' : 'text-gray-700'} p-1 mr-1`}\n title=\"Back\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </button>\n )}\n <div className={`flex items-center gap-2 ${theme.titleText} font-semibold`}>\n <ShieldCheck className=\"h-5 w-5\" />\n <span>KYC</span>\n </div>\n </div>\n </div>\n\n <div className=\"p-5\">\n {provider ? (\n <div className={`rounded-xl p-4 ${isDark ? 'bg-gray-800' : 'bg-gray-50'}`}>\n <div className={`text-sm ${theme.titleText} mb-2`}>KYC provider: <span className=\"font-medium\">{provider}</span></div>\n {Object.keys(options).length > 0 ? (\n <div className={`text-xs ${theme.mutedText} break-words whitespace-pre-wrap`}>\n {JSON.stringify(options, null, 2)}\n </div>\n ) : (\n <div className={`text-sm ${theme.mutedText}`}>No provider options configured.</div>\n )}\n </div>\n ) : (\n <div className={`rounded-xl p-4 text-center ${isDark ? 'bg-gray-800' : 'bg-gray-50'}`}>\n <div className={`text-sm ${theme.mutedText}`}>KYC verification coming soon…</div>\n </div>\n )}\n\n <div className=\"pt-4\">\n <Button className=\"w-full\" onClick={() => onOpenChange(false)} size=\"lg\">\n Close\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n\n","import * as React from 'react';\nimport { getLinkedProviders } from '../internal/auth/providers/common';\nimport { getProviderDisplayInfo, type AuthProvider } from '../internal/auth/providers/types';\nimport { jwtTokenManager } from '../internal/auth';\n\nexport interface LinkedProfileDisplay extends AuthProvider {\n displayName: string;\n icon?: string; // emoji or identifier; real icons are app-responsibility\n color?: string;\n}\n\nexport function useLumiaPassportLinkedProfiles() {\n const [profiles, setProfiles] = React.useState<LinkedProfileDisplay[]>([]);\n const [avatar, setAvatar] = React.useState<string | null>(null);\n const [isLoading, setIsLoading] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n\n const load = React.useCallback(async () => {\n setIsLoading(true); setError(null);\n try {\n const list = await getLinkedProviders();\n const enriched = list.map(p => {\n const info = getProviderDisplayInfo(p.provider);\n return {\n ...p,\n displayName: info.name,\n icon: info.icon,\n color: info.color,\n } as LinkedProfileDisplay;\n });\n setProfiles(enriched);\n try { setAvatar(jwtTokenManager.getAvatar() || null); } catch { setAvatar(null); }\n } catch (e: any) {\n setError(e?.message || 'Failed to load linked profiles');\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n React.useEffect(() => { load(); }, [load]);\n\n return { profiles, avatar, isLoading, error, refresh: load } as const;\n}\n\n","{\n \"name\": \"@lumiapassport/ui-kit\",\n \"version\": \"1.6.0\",\n \"description\": \"React UI components and hooks for Lumia Passport authentication and Account Abstraction\",\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"sideEffects\": false,\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"scripts\": {\n \"clean\": \"rm -rf dist\",\n \"build:css\": \"tailwindcss -c tailwind.config.cjs -i src/styles/index.css -o src/styles/built.css --minify\",\n \"build:iframe-html\": \"node scripts/copy-iframe-html.js\",\n \"build:copy-css\": \"cp src/styles/built.css dist/styles.css\",\n \"build\": \"pnpm build:css && tsup && pnpm build:iframe-html && pnpm build:copy-css\",\n \"dev\": \"pnpm build:css && tsup --watch\",\n \"dev:iframe\": \"vite --config iframe/vite.config.ts\"\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n },\n \"./styles.css\": \"./dist/styles.css\",\n \"./dist/styles.css\": \"./dist/styles.css\"\n },\n \"peerDependencies\": {\n \"@radix-ui/react-alert-dialog\": \">=1.0.0\",\n \"@radix-ui/react-dialog\": \">=1.0.0\",\n \"@radix-ui/react-slot\": \">=1.0.0\",\n \"@tanstack/react-query\": \">=5.0.0\",\n \"class-variance-authority\": \">=0.7.0\",\n \"clsx\": \">=2.1.1\",\n \"dkls23-wasm\": \">=0.1.0\",\n \"react\": \">=18\",\n \"react-dom\": \">=18\",\n \"tailwind-merge\": \">=2.2.0\",\n \"viem\": \">=2.10.0\",\n \"wagmi\": \">=2.5.0\"\n },\n \"dependencies\": {\n \"@lumiapassport/core\": \"workspace:*\",\n \"@rainbow-me/rainbowkit\": \"^2.2.8\",\n \"@sentry/browser\": \"^10.22.0\",\n \"lucide-react\": \"^0.454.0\",\n \"qrcode\": \"^1.5.0\"\n },\n \"devDependencies\": {\n \"@radix-ui/react-alert-dialog\": \"^1.0.0\",\n \"@radix-ui/react-dialog\": \"^1.0.0\",\n \"@radix-ui/react-slot\": \"^1.0.0\",\n \"@tailwindcss/typography\": \"^0.5.16\",\n \"@tanstack/react-query\": \"^5.90.2\",\n \"@types/qrcode\": \"^1.5.0\",\n \"@types/react\": \"^18.3.3\",\n \"@types/react-dom\": \"^18.3.0\",\n \"autoprefixer\": \"^10.4.20\",\n \"class-variance-authority\": \"^0.7.0\",\n \"clsx\": \"^2.1.1\",\n \"dkls23-wasm\": \"^0.1.0\",\n \"postcss\": \"^8.4.47\",\n \"react\": \"^18.3.1\",\n \"react-dom\": \"^18.3.1\",\n \"tailwind-merge\": \"^2.2.0\",\n \"tailwindcss\": \"^3.4.10\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.4.5\",\n \"viem\": \"^2.37.9\",\n \"vite\": \"^5.0.0\",\n \"wagmi\": \"^2.17.5\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/lumiachain/lumia-passport-sdk\",\n \"directory\": \"packages/ui-kit\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import React from 'react';\nimport { useLumiaPassportConfig } from '../context/LumiaPassportContext';\n\n/**\n * Theme toggle component for testing dark/light/auto mode\n * This is a demo component to showcase theme switching\n */\nexport const ThemeToggle: React.FC = () => {\n const { config, updateConfig } = useLumiaPassportConfig();\n const currentTheme = config.ui.theme;\n\n const cycleTheme = () => {\n let newTheme: 'light' | 'dark' | 'auto';\n\n // Cycle through themes: light -> dark -> auto -> light\n if (currentTheme === 'light') {\n newTheme = 'dark';\n } else if (currentTheme === 'dark') {\n newTheme = 'auto';\n } else {\n newTheme = 'light';\n }\n\n // Update configuration\n updateConfig({\n ui: {\n ...config.ui,\n theme: newTheme,\n },\n });\n };\n\n const getThemeIcon = () => {\n switch (currentTheme) {\n case 'light':\n return '☀️';\n case 'dark':\n return '🌙';\n case 'auto':\n return '☀️'; // Will show sun icon for auto mode\n default:\n return '☀️';\n }\n };\n\n const getThemeLabel = () => {\n switch (currentTheme) {\n case 'light':\n return 'light';\n case 'dark':\n return 'dark';\n case 'auto':\n return 'auto';\n default:\n return 'auto';\n }\n };\n\n return (\n <div className=\"lumia-scope\">\n <button\n onClick={cycleTheme}\n className=\"fixed top-4 right-4 z-50 flex items-center gap-2 px-4 py-2 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-xl text-sm font-medium text-gray-700 dark:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors shadow-sm\"\n title={`Current theme: ${currentTheme}. Click to switch.`}\n >\n {getThemeIcon()} {getThemeLabel()}\n </button>\n </div>\n );\n};","import React from 'react';\n\ninterface LumiaLogoProps {\n size?: number;\n className?: string;\n}\n\nexport const LumiaLogo: React.FC<LumiaLogoProps> = ({ size = 80, className = '' }) => {\n return (\n <div\n className={`flex items-center justify-center ${className}`}\n style={{ width: size, height: size }}\n >\n <svg viewBox=\"0 0 512 512\" width={size} height={size}>\n <circle cx=\"256\" cy=\"256\" r=\"256\" fill=\"#060117\" strokeWidth=\"0\"/>\n <path d=\"M264.13948,48.01032l63.62778,132.2788,133.95322,68.65102h-147.34854s-48.55804-10.04649-50.23246-56.93012,0-143.99971,0-143.99971Z\" fill=\"#fefdff\" strokeWidth=\"0\"/>\n <path d=\"M50.27932,245.59045l132.27894-63.62734L251.20943,48.01032l-.00012,147.34824s-10.04654,48.55792-56.93019,50.23222c-46.88366,1.6743-143.9998-.00033-143.9998-.00033Z\" fill=\"#fefdff\" strokeWidth=\"0\"/>\n <path d=\"M247.86056,463.98968l-63.62772-132.27875-133.95315-68.65092,147.34848-.00011s48.55802,10.04646,50.23242,56.93008c1.6744,46.88362-.00004,143.9997-.00004,143.9997Z\" fill=\"#fefdff\" strokeWidth=\"0\"/>\n <path d=\"M461.72068,266.40941l-132.2789,63.62744-68.65118,133.95283.00016-147.34823s10.04655-48.55792,56.93018-50.23226c46.88364-1.67434,143.99974.00023,143.99974.00023Z\" fill=\"#fefdff\" strokeWidth=\"0\"/>\n </svg>\n </div>\n );\n};","import { useMemo, useState, useEffect } from 'react';\n\nexport type Theme = 'light' | 'dark' | 'auto';\n\n/**\n * Hook for managing theme detection and CSS classes\n */\nexport function useTheme(configTheme: Theme) {\n const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>('light');\n\n // Listen for system theme changes\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const updateSystemTheme = () => {\n setSystemTheme(mediaQuery.matches ? 'dark' : 'light');\n };\n\n // Set initial value\n updateSystemTheme();\n\n // Listen for changes\n mediaQuery.addEventListener('change', updateSystemTheme);\n return () => mediaQuery.removeEventListener('change', updateSystemTheme);\n }, []);\n\n const resolvedTheme = useMemo(() => {\n if (configTheme === 'auto') {\n return systemTheme;\n }\n return configTheme;\n }, [configTheme, systemTheme]);\n\n const isDark = resolvedTheme === 'dark';\n\n // Theme-aware CSS classes\n const themeClasses = useMemo(\n () => ({\n // Modal background\n modalBg: isDark ? 'bg-gray-900' : 'bg-white',\n\n // Text colors\n titleText: isDark ? 'text-white' : 'text-gray-900',\n bodyText: isDark ? 'text-gray-300' : 'text-gray-600',\n mutedText: isDark ? 'text-gray-400' : 'text-gray-500',\n linkText: isDark ? 'text-gray-200 hover:text-blue-400' : 'text-gray-700 hover:text-blue-600',\n\n // Input styles\n inputBg: isDark ? 'bg-gray-800 border-gray-600' : 'bg-gray-50 border-gray-200',\n inputText:\n isDark ? 'text-white placeholder:text-gray-400' : 'text-gray-900 placeholder:text-gray-400',\n\n // Button styles\n primaryBtn:\n isDark ?\n 'bg-blue-600 hover:bg-blue-700 text-white'\n : 'bg-blue-600 hover:bg-blue-700 text-white',\n secondaryBtn:\n isDark ?\n 'bg-pink-600 hover:bg-pink-700 text-white'\n : 'bg-pink-200 hover:bg-pink-300 text-gray-700',\n outlineBtn:\n isDark ?\n 'bg-gray-700 border-gray-600 hover:bg-gray-600 text-gray-300'\n : 'border-gray-200 hover:bg-gray-50 text-gray-700',\n\n // Action buttons (Send, Receive, Buy)\n actionBtn:\n isDark ?\n 'bg-gray-700 hover:bg-gray-600 text-gray-200'\n : 'bg-gray-100 hover:bg-gray-200 text-gray-900',\n\n // Divider\n divider: isDark ? 'border-gray-600' : 'border-gray-200',\n\n // Status colors\n errorText: isDark ? 'text-red-400' : 'text-red-500',\n successText: isDark ? 'text-green-400' : 'text-blue-600',\n\n // Icon colors\n iconColor: isDark ? 'text-gray-300' : 'text-gray-600',\n }),\n [isDark]\n );\n\n return {\n theme: resolvedTheme,\n isDark,\n classes: themeClasses,\n };\n}","import * as React from 'react';\nimport { Copy, ExternalLink } from 'lucide-react';\nimport { Button } from './ui/button';\nimport { cn } from '../utils/cn';\n\ntype ChainLike = {\n id: number;\n blockExplorers?: { default?: { url: string } };\n};\n\nexport type HashProps = {\n hash?: `0x${string}` | string | null;\n chain?: ChainLike;\n className?: string;\n truncate?: boolean;\n showCopy?: boolean;\n showExplorer?: boolean;\n kind?: 'tx' | 'address' | 'block';\n label?: string;\n};\n\nfunction toExplorerUrl(\n kind: 'tx' | 'address' | 'block',\n value: string,\n chain?: ChainLike\n): string | null {\n const base = chain?.blockExplorers?.default?.url;\n if (!base) return null;\n const path =\n kind === 'tx' ? 'tx'\n : kind === 'address' ? 'address'\n : 'block';\n return `${base.replace(/\\/$/, '')}/${path}/${value}`;\n}\n\nfunction short(value: string): string {\n if (value.length <= 18) return value;\n return `${value.slice(0, 10)}...${value.slice(-8)}`;\n}\n\nexport const Hash: React.FC<HashProps> = ({\n hash,\n chain,\n className,\n truncate = true,\n showCopy = true,\n showExplorer = true,\n kind = 'tx',\n label,\n}) => {\n const value = hash || '';\n const explorer = toExplorerUrl(kind, value, chain || undefined);\n const [copied, setCopied] = React.useState(false);\n\n if (!value) return <span className={cn('text-muted-foreground', className)}>—</span>;\n\n return (\n <div className={cn('flex items-center gap-2', className)}>\n {label && <span className=\"text-sm font-medium\">{label}</span>}\n <code className=\"text-xs bg-background px-2 py-1 rounded break-all\">\n {truncate ? short(value) : value}\n </code>\n {showCopy && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n title={copied ? 'Copied' : 'Copy'}\n onClick={async () => {\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n setTimeout(() => setCopied(false), 1200);\n } catch {}\n }}\n >\n <Copy className=\"h-4 w-4\" />\n </Button>\n )}\n {showExplorer && explorer && (\n <a\n href={explorer}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"inline-flex items-center justify-center h-10 w-10 rounded-md hover:bg-accent text-foreground\"\n title=\"Open in explorer\"\n >\n <ExternalLink className=\"h-4 w-4\" />\n </a>\n )}\n </div>\n );\n};","import React, { useState, useEffect } from 'react';\nimport { getExplorerUrl } from '../clients/base';\n\ninterface TransactionFrom {\n hash: string;\n is_contract: boolean;\n name: string | null;\n}\n\ninterface TransactionTo {\n hash: string;\n is_contract: boolean;\n name: string | null;\n}\n\ninterface Transaction {\n hash: string;\n value: string;\n from: TransactionFrom;\n to: TransactionTo;\n status: string;\n timestamp: string;\n gas_used: string;\n fee: {\n value: string;\n };\n method: string | null;\n transaction_types: string[];\n}\n\ninterface TransactionsResponse {\n items: Transaction[];\n next_page_params: any;\n}\n\ninterface TransactionsListProps {\n address: string;\n itemsCount?: number;\n}\n\nexport const TransactionsList: React.FC<TransactionsListProps> = ({\n address,\n itemsCount = 10\n}) => {\n const [transactions, setTransactions] = useState<Transaction[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const fetchTransactions = async () => {\n try {\n setLoading(true);\n setError(null);\n\n const explorerUrl = getExplorerUrl();\n const baseUrl = explorerUrl.replace(/\\/$/, '');\n const apiUrl = `${baseUrl}/api/v2/addresses/${address}/transactions?items_count=${itemsCount}`;\n\n console.log('[TransactionsList] Fetching from:', apiUrl);\n\n const response = await fetch(apiUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch transactions: ${response.status}`);\n }\n\n const data: TransactionsResponse = await response.json();\n setTransactions(data.items || []);\n } catch (err) {\n console.error('[TransactionsList] Error:', err);\n setError(err instanceof Error ? err.message : 'Unknown error');\n } finally {\n setLoading(false);\n }\n };\n\n if (address) {\n fetchTransactions();\n }\n }, [address, itemsCount]);\n\n const formatValue = (value: string) => {\n try {\n const wei = BigInt(value);\n const eth = Number(wei) / 1e18;\n return eth.toFixed(4);\n } catch {\n return '0.0000';\n }\n };\n\n const formatAddress = (addr: string) => {\n return `${addr.slice(0, 6)}...${addr.slice(-4)}`;\n };\n\n const formatDate = (timestamp: string) => {\n return new Date(timestamp).toLocaleString();\n };\n\n const openTransaction = (txHash: string) => {\n const explorerUrl = getExplorerUrl();\n window.open(`${explorerUrl}/tx/${txHash}`, '_blank');\n };\n\n if (loading) {\n return (\n <div className=\"p-4 text-center\">\n <div className=\"animate-spin inline-block w-6 h-6 border-2 border-current border-t-transparent rounded-full\" />\n <p className=\"mt-2 text-sm text-gray-600\">Loading transactions...</p>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"p-4 text-center\">\n <p className=\"text-red-600 text-sm\">{error}</p>\n <button\n onClick={() => window.location.reload()}\n className=\"mt-2 text-blue-600 text-sm hover:underline\"\n >\n Retry\n </button>\n </div>\n );\n }\n\n if (transactions.length === 0) {\n return (\n <div className=\"p-4 text-center\">\n <p className=\"text-gray-600 text-sm\">No transactions found</p>\n </div>\n );\n }\n\n return (\n <div className=\"max-h-96 overflow-y-auto\">\n <div className=\"space-y-2 p-2\">\n {transactions.map((tx) => (\n <div\n key={tx.hash}\n className=\"border rounded-lg p-3 hover:bg-gray-50 cursor-pointer transition-colors\"\n onClick={() => openTransaction(tx.hash)}\n >\n <div className=\"flex justify-between items-start mb-2\">\n <div className=\"flex-1\">\n <div className=\"flex items-center space-x-2 mb-1\">\n <span className=\"text-xs font-mono bg-gray-100 px-2 py-1 rounded\">\n {formatAddress(tx.hash)}\n </span>\n <span className={`text-xs px-2 py-1 rounded ${\n tx.status === 'ok' ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800'\n }`}>\n {tx.status === 'ok' ? 'Success' : 'Failed'}\n </span>\n </div>\n\n <div className=\"text-sm space-y-1\">\n <div>\n <span className=\"text-gray-600\">From:</span>\n <span className=\"font-mono ml-1\">\n {formatAddress(tx.from.hash)}\n {tx.from.is_contract && <span className=\"text-xs text-blue-600 ml-1\">(Contract)</span>}\n </span>\n </div>\n\n <div>\n <span className=\"text-gray-600\">To:</span>\n <span className=\"font-mono ml-1\">\n {formatAddress(tx.to.hash)}\n {tx.to.is_contract && <span className=\"text-xs text-blue-600 ml-1\">(Contract)</span>}\n </span>\n </div>\n\n <div>\n <span className=\"text-gray-600\">Value:</span>\n <span className=\"font-semibold ml-1\">{formatValue(tx.value)} LUMIA</span>\n </div>\n </div>\n </div>\n\n <div className=\"text-right text-xs text-gray-500\">\n <div>{formatDate(tx.timestamp)}</div>\n <div className=\"mt-1\">\n Gas: {parseInt(tx.gas_used).toLocaleString()}\n </div>\n {tx.method && (\n <div className=\"mt-1 text-blue-600\">{tx.method}</div>\n )}\n </div>\n </div>\n\n {tx.transaction_types.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mt-2\">\n {tx.transaction_types.map((type, idx) => (\n <span\n key={idx}\n className=\"text-xs bg-blue-100 text-blue-800 px-2 py-1 rounded-full\"\n >\n {type.replace('_', ' ')}\n </span>\n ))}\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n );\n};","import * as React from 'react';\nimport { getBundlerUrl } from '../internal/clients/base';\n\nexport interface UserOpReceipt {\n userOpHash: `0x${string}`;\n sender: `0x${string}`;\n nonce: string;\n actualGasUsed: string;\n actualGasCost: string;\n success: boolean;\n receipt?: {\n transactionHash: `0x${string}`;\n blockNumber: string;\n blockHash: string;\n logs: any[];\n };\n}\n\nexport interface UserOpMempool {\n entryPoint: `0x${string}` | null;\n sender: `0x${string}` | null;\n}\n\nexport type UserOpState =\n | 'waiting' // Initial state, not yet seen by bundler\n | 'pending' // Seen in bundler mempool\n | 'included' // Successfully included in block\n | 'failed' // Failed execution\n | 'rejected' // Dropped from bundler mempool\n | 'timeout'; // Polling timeout\n\nexport interface UseUserOpStatusOptions {\n userOpHash?: `0x${string}` | string | null;\n pollMs?: number;\n maxPollTimeMs?: number;\n enabled?: boolean;\n onStateChange?: (state: UserOpState) => void;\n onReceipt?: (receipt: UserOpReceipt) => void;\n onTxHash?: (txHash: `0x${string}`) => void;\n}\n\nexport interface UseUserOpStatusReturn {\n state: UserOpState;\n receipt: UserOpReceipt | null;\n mempool: UserOpMempool | null;\n txHash: `0x${string}` | null;\n error: string | null;\n isPolling: boolean;\n refresh: () => Promise<void>;\n}\n\nexport function useUserOpStatus(options: UseUserOpStatusOptions = {}): UseUserOpStatusReturn {\n const {\n userOpHash,\n pollMs = 1000,\n maxPollTimeMs = 60000,\n enabled = true,\n onStateChange,\n onReceipt,\n onTxHash,\n } = options;\n\n const [state, setState] = React.useState<UserOpState>('waiting');\n const [receipt, setReceipt] = React.useState<UserOpReceipt | null>(null);\n const [mempool, setMempool] = React.useState<UserOpMempool | null>(null);\n const [txHash, setTxHash] = React.useState<`0x${string}` | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n const [isPolling, setIsPolling] = React.useState(false);\n\n const intervalRef = React.useRef<NodeJS.Timeout | null>(null);\n const startTimeRef = React.useRef<number>(Date.now());\n const prevStateRef = React.useRef<UserOpState>('waiting');\n\n const rpc = React.useCallback(async (method: string, params: any[]) => {\n const body = { jsonrpc: '2.0', id: 1, method, params };\n const res = await fetch(getBundlerUrl(), {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body),\n });\n const json = await res.json();\n if (json.error) throw new Error(json.error.message || JSON.stringify(json.error));\n return json.result;\n }, []);\n\n const extractMempoolInfo = React.useCallback((m: any): UserOpMempool | null => {\n if (!m) return null;\n const entryPoint = m.entryPoint || m?.userOperation?.entryPoint || null;\n const sender = m.sender || m?.userOperation?.sender || null;\n if (!entryPoint && !sender) return null;\n return { entryPoint, sender };\n }, []);\n\n const updateState = React.useCallback((newState: UserOpState) => {\n setState(newState);\n if (prevStateRef.current !== newState) {\n prevStateRef.current = newState;\n onStateChange?.(newState);\n }\n }, [onStateChange]);\n\n const tick = React.useCallback(async () => {\n if (!userOpHash || !enabled) return;\n\n // Don't poll if we already have a receipt\n if (receipt) {\n console.log('[useUserOpStatus] Already have receipt, skipping tick');\n return;\n }\n\n const elapsed = Date.now() - startTimeRef.current;\n if (elapsed > maxPollTimeMs) {\n updateState('timeout');\n setMempool(null);\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n setIsPolling(false);\n return;\n }\n\n try {\n setIsPolling(true);\n setError(null);\n\n // Check for receipt first\n const r = await rpc('eth_getUserOperationReceipt', [userOpHash]);\n if (r) {\n const newState = r.success ? 'included' : 'failed';\n console.log('[useUserOpStatus] Got receipt, updating state to:', newState);\n\n setReceipt(r);\n setMempool(null);\n const newTxHash = r.receipt?.transactionHash;\n if (newTxHash && newTxHash !== txHash) {\n setTxHash(newTxHash);\n onTxHash?.(newTxHash);\n }\n updateState(newState);\n onReceipt?.(r);\n\n // Clear interval when we get receipt\n if (intervalRef.current) {\n console.log('[useUserOpStatus] Clearing interval after receipt');\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n setIsPolling(false);\n return;\n }\n\n // Check mempool only if we don't have receipt yet\n const m = await rpc('eth_getUserOperationByHash', [userOpHash]);\n if (m === null) {\n // null result means UserOperation was dropped from mempool\n updateState('rejected');\n setMempool(null);\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n setIsPolling(false);\n return;\n }\n\n const info = extractMempoolInfo(m);\n setMempool(info);\n // Only update state to pending/waiting if we don't already have a terminal state\n if (!receipt) {\n updateState(info ? 'pending' : 'waiting');\n }\n } catch (e: any) {\n setError(e?.message || String(e));\n } finally {\n setIsPolling(false);\n }\n }, [\n rpc,\n userOpHash,\n enabled,\n receipt,\n maxPollTimeMs,\n extractMempoolInfo,\n updateState,\n onTxHash,\n onReceipt,\n ]);\n\n // Initialize state when hash changes\n React.useEffect(() => {\n if (!userOpHash || !enabled) return;\n\n console.log('[useUserOpStatus] Initializing for UserOp hash:', userOpHash);\n startTimeRef.current = Date.now();\n setState('waiting');\n prevStateRef.current = 'waiting';\n setReceipt(null);\n setMempool(null);\n setTxHash(null);\n setError(null);\n setIsPolling(false);\n }, [userOpHash, enabled]);\n\n // Start polling effect\n React.useEffect(() => {\n if (!userOpHash || !enabled) {\n console.log('[useUserOpStatus] Not starting polling - no hash or disabled');\n return;\n }\n\n if (receipt) {\n console.log('[useUserOpStatus] Not starting polling - already have receipt');\n return;\n }\n\n let mounted = true;\n\n const startPolling = async () => {\n if (mounted) {\n console.log('[useUserOpStatus] Starting polling for hash:', userOpHash);\n await tick();\n\n // Start interval only if still mounted and no receipt\n if (mounted && !receipt) {\n console.log('[useUserOpStatus] Creating interval with pollMs:', pollMs);\n intervalRef.current = setInterval(() => {\n if (mounted) {\n console.log('[useUserOpStatus] Interval tick');\n tick();\n }\n }, pollMs);\n }\n }\n };\n\n startPolling();\n\n return () => {\n console.log('[useUserOpStatus] Cleaning up polling effect');\n mounted = false;\n if (intervalRef.current) {\n console.log('[useUserOpStatus] Clearing interval in cleanup');\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n };\n }, [userOpHash, enabled, pollMs]);\n\n const refresh = React.useCallback(async () => {\n await tick();\n }, [tick]);\n\n return {\n state,\n receipt,\n mempool,\n txHash,\n error,\n isPolling,\n refresh,\n };\n}\n","import { usePublicClient, useWalletClient, useAccount } from 'wagmi';\nimport { TransactionReceipt, Hash, parseEther, formatEther, type Chain } from 'viem';\nimport { lumiaBeam } from '../internal/clients/base';\n\nexport interface Transaction {\n hash: Hash;\n from: string;\n to: string | null;\n value: string;\n gasUsed: string;\n gasPrice: string;\n blockNumber: bigint;\n timestamp: number;\n status: 'success' | 'failed' | 'pending';\n}\n\nexport interface SendTransactionParams {\n to: `0x${string}`;\n value: string; // in ETH\n data?: `0x${string}`;\n}\n\nexport interface SendTransactionResult {\n hash: Hash;\n wait: () => Promise<TransactionReceipt>;\n}\n\nexport function useTransactions() {\n const publicClient = usePublicClient({ chainId: lumiaBeam.id });\n const { data: walletClient } = useWalletClient();\n const { address } = useAccount();\n\n const sendTransaction = async (params: SendTransactionParams): Promise<SendTransactionResult> => {\n if (!walletClient) {\n throw new Error('Wallet not connected');\n }\n\n const txParams: any = {\n to: params.to,\n value: parseEther(params.value),\n data: params.data,\n chain: lumiaBeam as Chain,\n };\n // Viem 2.x types require `kzg` for blob-supporting chains; our chain doesn't use blobs.\n // Cast to any to keep DTS stable across viem versions while preserving runtime behavior.\n const hash = await (walletClient as any).sendTransaction(txParams);\n\n return {\n hash,\n wait: async () => {\n if (!publicClient) {\n throw new Error('Public client not available');\n }\n return await publicClient.waitForTransactionReceipt({ hash });\n },\n };\n };\n\n const getTransaction = async (hash: Hash) => {\n if (!publicClient) {\n throw new Error('Public client not available');\n }\n return await publicClient.getTransaction({ hash });\n };\n\n const getTransactionReceipt = async (hash: Hash) => {\n if (!publicClient) {\n throw new Error('Public client not available');\n }\n return await publicClient.getTransactionReceipt({ hash });\n };\n\n const getTransactionHistory = async (address: `0x${string}`, limit: number = 10): Promise<Transaction[]> => {\n if (!publicClient) {\n throw new Error('Public client not available');\n }\n\n try {\n // For smart accounts, we'll use a simplified approach\n // In production, you would typically use an indexer service or event logs\n\n // Option 1: Return empty for now to avoid excessive RPC calls\n // In a real implementation, you would:\n // 1. Use an indexer like The Graph or Etherscan API\n // 2. Filter UserOperationEvent events from the EntryPoint contract\n // 3. Or maintain a backend service that tracks transactions\n\n console.log('[Transactions] Fetching history for smart account:', address);\n\n // For demo purposes, return empty array to prevent RPC spam\n // Real implementation would query indexed data\n return [];\n\n // Alternative: Query only recent blocks (last 10) for demo\n // Uncomment if you want minimal transaction checking:\n /*\n const latestBlock = await publicClient.getBlockNumber();\n const transactions: Transaction[] = [];\n const blocksToCheck = 10; // Only check last 10 blocks\n\n for (let i = 0; i < blocksToCheck; i++) {\n const blockNumber = latestBlock - BigInt(i);\n try {\n const block = await publicClient.getBlock({\n blockNumber,\n includeTransactions: false, // Don't fetch full transactions\n });\n\n // In production, you'd query events here instead\n } catch {\n continue;\n }\n }\n\n return transactions;\n */\n } catch (error) {\n console.error('Failed to fetch transaction history:', error);\n return [];\n }\n };\n\n return {\n sendTransaction,\n getTransaction,\n getTransactionReceipt,\n getTransactionHistory,\n address,\n isConnected: !!address && !!walletClient,\n };\n}\n","import { Hash, formatEther, parseAbiItem } from 'viem';\nimport { lumiaBeam, ENTRYPOINT, publicClient } from '../internal/clients/base';\n\nexport interface UserOperation {\n hash: Hash;\n sender: `0x${string}`;\n nonce: bigint;\n success: boolean;\n actualGasCost: bigint;\n blockNumber: bigint;\n timestamp: number;\n transactionHash: Hash;\n}\n\n// EntryPoint UserOperationEvent\nconst USER_OP_EVENT = parseAbiItem(\n 'event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed)'\n);\n\nexport function useSmartAccountTransactions() {\n // Use the static publicClient from base instead of wagmi hook\n\n const getUserOperations = async (\n address: `0x${string}`,\n fromBlock: bigint | 'earliest' = 'earliest',\n toBlock: bigint | 'latest' = 'latest'\n ): Promise<UserOperation[]> => {\n // TEMPORARILY DISABLED to prevent RPC spam\n console.log('[getUserOperations] Disabled to prevent RPC spam');\n return [];\n\n /* Original implementation (disabled):\n if (!publicClient) {\n throw new Error('Public client not available');\n }\n\n try {\n // For efficiency, limit the block range for recent transactions\n let actualFromBlock = fromBlock;\n if (fromBlock === 'earliest' && toBlock === 'latest') {\n const latestBlock = await publicClient.getBlockNumber();\n // Only check last 1000 blocks (adjust based on chain block time)\n actualFromBlock = latestBlock > 1000n ? latestBlock - 1000n : 0n;\n }\n\n // Get UserOperationEvent events from EntryPoint\n const logs = await publicClient.getLogs({\n address: ENTRYPOINT,\n event: USER_OP_EVENT,\n args: {\n sender: address,\n },\n fromBlock: actualFromBlock,\n toBlock,\n });\n\n // Process logs into UserOperation objects\n const operations: UserOperation[] = [];\n\n for (const log of logs) {\n if (!log.args) continue;\n\n const [userOpHash, sender, , nonce, success, actualGasCost] = log.args as [\n `0x${string}`,\n `0x${string}`,\n `0x${string}`,\n bigint,\n boolean,\n bigint,\n bigint\n ];\n\n // Get block timestamp\n const block = await publicClient.getBlock({\n blockNumber: log.blockNumber,\n });\n\n operations.push({\n hash: userOpHash,\n sender,\n nonce,\n success,\n actualGasCost,\n blockNumber: log.blockNumber,\n timestamp: Number(block.timestamp),\n transactionHash: log.transactionHash,\n });\n }\n\n return operations.sort((a, b) => b.timestamp - a.timestamp);\n } catch (error) {\n console.error('Failed to fetch UserOperations:', error);\n return [];\n }\n */\n };\n\n const getRecentUserOperations = async (\n address: `0x${string}`,\n limit: number = 20\n ): Promise<UserOperation[]> => {\n if (!publicClient) {\n throw new Error('Public client not available');\n }\n\n try {\n // TEMPORARILY DISABLED to prevent RPC spam\n // In production, you should use an indexer service\n console.log('[SmartAccountTransactions] Fetching operations for:', address);\n console.log('[SmartAccountTransactions] Note: Transaction history disabled to prevent RPC spam');\n console.log('[SmartAccountTransactions] In production, use an indexer service like The Graph');\n\n // Return empty array for now\n return [];\n\n // Original implementation (commented out to prevent spam):\n /*\n const latestBlock = await publicClient.getBlockNumber();\n\n // Only check last 100 blocks to minimize requests\n const blockRange = 100n;\n const fromBlock = latestBlock > blockRange ? latestBlock - blockRange : 0n;\n\n const operations = await getUserOperations(address, fromBlock, latestBlock);\n return operations.slice(0, limit);\n */\n } catch (error) {\n console.error('Failed to fetch recent UserOperations:', error);\n return [];\n }\n };\n\n const getTransactionDetails = async (txHash: Hash) => {\n if (!publicClient) {\n throw new Error('Public client not available');\n }\n\n try {\n const [tx, receipt] = await Promise.all([\n publicClient.getTransaction({ hash: txHash }),\n publicClient.getTransactionReceipt({ hash: txHash }),\n ]);\n\n return { transaction: tx, receipt };\n } catch (error) {\n console.error('Failed to fetch transaction details:', error);\n return null;\n }\n };\n\n return {\n getUserOperations,\n getRecentUserOperations,\n getTransactionDetails,\n };\n}"],"mappings":"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","names":["import_wagmi","import_jsx_runtime","getTssUrl","base","import_viem","jwtTokenManager","import_error_tracking","getAvailableCloudProviders","base64urlToUint8Array","import_error_tracking","checkServerBackupAvailability","getBackupStatus","getTssUrl","getTssUrl","getTssUrl","getTssUrl","begin","options","base64urlToUint8Array","init_passkey","getTssUrl","init_telegram","getTssUrl","init_passkey","init_telegram","getTssUrl","import_auth","jwtTokenManager","import_error_tracking","import_jsx_runtime","projectId","import_react","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_lucide_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","ErrorAlert","showTelegramWidget","React","loginWithEmail","step","toHex","nonce","import_viem","import_account_abstraction","import_account_abstraction","init_utils","init_utils","LumiaLogo","useTheme","import_react","import_jsx_runtime","React","import_react","import_rainbowkit","import_wagmi","import_jsx_runtime","rainbowConfig","React","import_react","import_wagmi","import_jsx_runtime","import_react","React","import_react","init_passkey","init_telegram","import_lucide_react","import_react","import_rainbowkit","import_wagmi","React","import_jsx_runtime","React","error","LinkIcon","import_react","import_lucide_react","import_jsx_runtime","React","getIframeManager","open","React","import_lucide_react","import_jsx_runtime","getAvailableCloudProviders","error","import_react","import_lucide_react","import_jsx_runtime","React","error","import_react","import_react","import_wagmi","import_viem","token","React","import_lucide_react","import_jsx_runtime","React","address","import_react","import_lucide_react","import_react","import_viem","import_viem","import_wagmi","React","import_lucide_react","import_class_variance_authority","import_clsx","import_tailwind_merge","cn","import_jsx_runtime","cn","React","import_lucide_react","import_jsx_runtime","base","cn","import_jsx_runtime","cn","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","QRCode","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","React","import_jsx_runtime","React","getIframeManager","getPendingLoginResponse","clearPendingLoginResponse","checkServerBackupAvailability","updateBackupStatus","getShareRecoveryStats","ensureKeyshare","createAccountSession","getEntryPointDeposit","error","waitForIframe","import_jsx_runtime","import_jsx_runtime","LumiaLogo","import_react","useTheme","React","import_lucide_react","import_jsx_runtime","base","short","cn","import_react","import_jsx_runtime","formatDate","React","import_wagmi","import_viem","publicClient","address","import_viem"]}
|