@authon/js 0.4.0 → 0.4.2
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.ko.md +1 -4
- package/README.md +7 -14
- package/dist/index.cjs +71 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +71 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../../shared/src/index.ts","../src/providers.ts","../src/modal.ts","../src/session.ts","../src/qrcode.ts","../src/authon.ts"],"sourcesContent":["import type { AuthonUser, BrandingConfig, PasskeyCredential, Web3Wallet } from '@authon/shared';\n\nexport type OAuthFlowMode = 'auto' | 'popup' | 'redirect';\n\nexport interface AuthonConfig {\n apiUrl?: string;\n mode?: 'popup' | 'embedded';\n containerId?: string;\n theme?: 'light' | 'dark' | 'auto';\n locale?: string;\n appearance?: Partial<BrandingConfig>;\n}\n\nexport interface OAuthSignInOptions {\n flowMode?: OAuthFlowMode;\n}\n\nexport interface AuthonEvents {\n signedIn: (user: AuthonUser) => void;\n signedOut: () => void;\n tokenRefreshed: (token: string) => void;\n mfaRequired: (mfaToken: string) => void;\n passkeyRegistered: (credential: PasskeyCredential) => void;\n web3Connected: (wallet: Web3Wallet) => void;\n error: (error: Error) => void;\n}\n\nexport type AuthonEventType = keyof AuthonEvents;\n\nexport class AuthonMfaRequiredError extends Error {\n readonly mfaToken: string;\n constructor(mfaToken: string) {\n super('MFA verification required');\n this.name = 'AuthonMfaRequiredError';\n this.mfaToken = mfaToken;\n }\n}\n","// ── Types ──\n\nexport interface AuthonUser {\n id: string;\n projectId: string;\n email: string | null;\n displayName: string | null;\n avatarUrl: string | null;\n phone: string | null;\n emailVerified: boolean;\n phoneVerified: boolean;\n isBanned: boolean;\n publicMetadata: Record<string, unknown> | null;\n lastSignInAt: string | null;\n signInCount: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface AuthonSession {\n id: string;\n userId: string;\n ipAddress: string | null;\n userAgent: string | null;\n deviceName: string | null;\n lastActiveAt: string | null;\n createdAt: string;\n expiresAt: string;\n}\n\nexport interface AuthonProvider {\n provider: string;\n enabled: boolean;\n sortOrder: number;\n configured: boolean;\n}\n\nexport interface BrandingConfig {\n logoDataUrl?: string;\n brandName?: string;\n primaryColorStart?: string;\n primaryColorEnd?: string;\n lightBg?: string;\n lightText?: string;\n darkBg?: string;\n darkText?: string;\n borderRadius?: number;\n providerOrder?: string[];\n hiddenProviders?: string[];\n showEmailPassword?: boolean;\n showDivider?: boolean;\n termsUrl?: string;\n privacyUrl?: string;\n customCss?: string;\n locale?: string;\n showSecuredBy?: boolean;\n showWeb3?: boolean;\n showPasswordless?: boolean;\n showPasskey?: boolean;\n passwordlessMethod?: 'magic_link' | 'email_otp' | 'both';\n}\n\nexport interface SessionConfig {\n accessTokenTtl?: number;\n refreshTokenTtl?: number;\n maxSessions?: number;\n singleSession?: boolean;\n}\n\nexport interface AuthTokens {\n accessToken: string;\n refreshToken: string;\n expiresIn: number;\n user: AuthonUser;\n}\n\nexport interface WebhookEvent {\n id: string;\n type: string;\n projectId: string;\n timestamp: string;\n data: Record<string, unknown>;\n}\n\n// ── MFA Types ──\n\nexport interface MfaSetupResponse {\n secret: string;\n qrCodeUri: string;\n backupCodes: string[];\n}\n\nexport interface MfaStatus {\n enabled: boolean;\n backupCodesRemaining: number;\n}\n\nexport interface MfaVerifyResponse {\n accessToken: string;\n refreshToken: string;\n expiresIn: number;\n user: AuthonUser;\n}\n\n// ── Passwordless Types ──\n\nexport interface PasswordlessResult {\n message: string;\n}\n\n// ── Passkey Types ──\n\nexport interface PasskeyCredential {\n id: string;\n name: string | null;\n createdAt: string;\n lastUsedAt: string | null;\n}\n\n// ── Web3 Types ──\n\nexport type Web3Chain = 'evm' | 'solana';\nexport type Web3WalletType =\n | 'metamask'\n | 'pexus'\n | 'walletconnect'\n | 'coinbase'\n | 'phantom'\n | 'trust'\n | 'other';\n\nexport interface Web3Wallet {\n id: string;\n address: string;\n chain: Web3Chain;\n walletType: Web3WalletType;\n chainId: number | null;\n createdAt: string;\n}\n\nexport interface Web3NonceResponse {\n message: string;\n nonce: string;\n}\n\n// ── Session Types ──\n\nexport interface SessionInfo {\n id: string;\n ipAddress: string | null;\n userAgent: string | null;\n createdAt: string;\n lastActiveAt: string | null;\n}\n\n// ── Organization Types ──\n\nexport interface AuthonOrganization {\n id: string;\n projectId: string;\n name: string;\n slug: string;\n logoUrl: string | null;\n metadata: Record<string, any> | null;\n maxMembers: number;\n createdBy: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface OrganizationMember {\n id: string;\n organizationId: string;\n userId: string;\n role: 'owner' | 'admin' | 'member';\n joinedAt: string;\n createdAt: string;\n}\n\nexport interface OrganizationInvitation {\n id: string;\n organizationId: string;\n email: string;\n role: string;\n status: 'pending' | 'accepted' | 'rejected' | 'expired';\n invitedBy: string;\n expiresAt: string;\n createdAt: string;\n}\n\nexport interface CreateOrganizationParams {\n name: string;\n slug?: string;\n logoUrl?: string;\n metadata?: Record<string, any>;\n maxMembers?: number;\n}\n\nexport interface UpdateOrganizationParams {\n name?: string;\n slug?: string;\n logoUrl?: string;\n metadata?: Record<string, any>;\n maxMembers?: number;\n}\n\nexport interface InviteMemberParams {\n email: string;\n role?: 'admin' | 'member';\n}\n\nexport interface OrganizationListResponse {\n data: AuthonOrganization[];\n total: number;\n page: number;\n limit: number;\n}\n\n// ── Audit Log Types ──\n\nexport interface AuditLogEntry {\n id: string;\n projectId: string;\n actorType: 'user' | 'admin' | 'system' | 'api_key';\n actorId: string | null;\n event: string;\n targetType: string | null;\n targetId: string | null;\n metadata: Record<string, any> | null;\n ipAddress: string | null;\n userAgent: string | null;\n createdAt: string;\n}\n\nexport interface AuditLogQueryParams {\n event?: string;\n actorId?: string;\n targetId?: string;\n dateFrom?: string;\n dateTo?: string;\n page?: number;\n limit?: number;\n}\n\nexport interface AuditLogListResponse {\n data: AuditLogEntry[];\n total: number;\n page: number;\n limit: number;\n}\n\nexport interface AuditLogStats {\n [eventType: string]: number;\n}\n\n// ── JWT Template Types ──\n\nexport interface JwtClaimMapping {\n key: string;\n source?: string;\n value?: string;\n}\n\nexport interface JwtTemplate {\n id: string;\n projectId: string;\n name: string;\n isDefault: boolean;\n claims: JwtClaimMapping[];\n allowedLifetime: number | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateJwtTemplateParams {\n name: string;\n claims: JwtClaimMapping[];\n allowedLifetime?: number;\n}\n\nexport interface UpdateJwtTemplateParams {\n name?: string;\n claims?: JwtClaimMapping[];\n allowedLifetime?: number | null;\n}\n\nexport interface JwtPreviewResponse {\n token: string;\n decoded: Record<string, any>;\n}\n\n// ── Constants ──\n\nexport const OAUTH_PROVIDERS = [\n 'google',\n 'apple',\n 'kakao',\n 'naver',\n 'facebook',\n 'github',\n 'discord',\n 'x',\n 'line',\n 'microsoft',\n] as const;\n\nexport type OAuthProviderType = (typeof OAUTH_PROVIDERS)[number];\n\nexport const PROVIDER_DISPLAY_NAMES: Record<OAuthProviderType, string> = {\n google: 'Google',\n apple: 'Apple',\n kakao: 'Kakao',\n naver: 'Naver',\n facebook: 'Facebook',\n github: 'GitHub',\n discord: 'Discord',\n x: 'X',\n line: 'LINE',\n microsoft: 'Microsoft',\n};\n\nexport const PROVIDER_COLORS: Record<OAuthProviderType, { bg: string; text: string }> = {\n google: { bg: '#ffffff', text: '#1f1f1f' },\n apple: { bg: '#000000', text: '#ffffff' },\n kakao: { bg: '#FEE500', text: '#191919' },\n naver: { bg: '#03C75A', text: '#ffffff' },\n facebook: { bg: '#1877F2', text: '#ffffff' },\n github: { bg: '#24292e', text: '#ffffff' },\n discord: { bg: '#5865F2', text: '#ffffff' },\n x: { bg: '#000000', text: '#ffffff' },\n line: { bg: '#06C755', text: '#ffffff' },\n microsoft: { bg: '#ffffff', text: '#1f1f1f' },\n};\n\nexport const WEBHOOK_EVENTS = [\n 'user.created',\n 'user.updated',\n 'user.deleted',\n 'user.banned',\n 'user.unbanned',\n 'session.created',\n 'session.ended',\n 'session.revoked',\n 'provider.linked',\n 'provider.unlinked',\n] as const;\n\nexport type WebhookEventType = (typeof WEBHOOK_EVENTS)[number];\n\nexport const API_KEY_PREFIXES = {\n PUBLISHABLE_LIVE: 'pk_live_',\n PUBLISHABLE_TEST: 'pk_test_',\n SECRET_LIVE: 'sk_live_',\n SECRET_TEST: 'sk_test_',\n} as const;\n\nexport const DEFAULT_BRANDING: BrandingConfig = {\n primaryColorStart: '#7c3aed',\n primaryColorEnd: '#4f46e5',\n lightBg: '#ffffff',\n lightText: '#111827',\n darkBg: '#0f172a',\n darkText: '#f1f5f9',\n borderRadius: 12,\n showEmailPassword: true,\n showDivider: true,\n showSecuredBy: true,\n locale: 'en',\n};\n\nexport const DEFAULT_SESSION_CONFIG: SessionConfig = {\n accessTokenTtl: 900,\n refreshTokenTtl: 604800,\n maxSessions: 5,\n singleSession: false,\n};\n\nexport const AUDIT_EVENTS = {\n AUTH_SIGNUP: 'auth.signup',\n AUTH_SIGNIN: 'auth.signin',\n AUTH_SIGNIN_FAILED: 'auth.signin.failed',\n AUTH_SIGNOUT: 'auth.signout',\n AUTH_TOKEN_REFRESH: 'auth.token.refresh',\n AUTH_MFA_SETUP: 'auth.mfa.setup',\n AUTH_MFA_VERIFY: 'auth.mfa.verify',\n AUTH_PASSKEY_REGISTER: 'auth.passkey.register',\n AUTH_WEB3_VERIFY: 'auth.web3.verify',\n ADMIN_USER_BANNED: 'admin.user.banned',\n ADMIN_USER_UNBANNED: 'admin.user.unbanned',\n ADMIN_USER_DELETED: 'admin.user.deleted',\n ORG_CREATED: 'org.created',\n ORG_DELETED: 'org.deleted',\n ORG_MEMBER_ADDED: 'org.member.added',\n ORG_MEMBER_REMOVED: 'org.member.removed',\n ORG_MEMBER_ROLE_CHANGED: 'org.member.role_changed',\n ORG_INVITATION_SENT: 'org.invitation.sent',\n ORG_INVITATION_ACCEPTED: 'org.invitation.accepted',\n} as const;\n","import { PROVIDER_COLORS, PROVIDER_DISPLAY_NAMES, type OAuthProviderType } from '@authon/shared';\n\nexport interface ProviderButtonConfig {\n provider: OAuthProviderType;\n label: string;\n bgColor: string;\n textColor: string;\n iconSvg: string;\n}\n\nconst PROVIDER_ICONS: Record<OAuthProviderType, string> = {\n google: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path fill=\"#4285F4\" d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\"/><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\"/><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\"/><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\"/></svg>`,\n apple: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\"><path d=\"M17.05 20.28c-.98.95-2.05.88-3.08.4-1.09-.5-2.08-.48-3.24 0-1.44.62-2.2.44-3.06-.4C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z\"/></svg>`,\n kakao: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path fill=\"#191919\" d=\"M12 3C6.48 3 2 6.36 2 10.43c0 2.62 1.75 4.93 4.37 6.23l-1.12 4.14c-.1.36.31.65.62.44l4.93-3.26c.39.04.79.06 1.2.06 5.52 0 10-3.36 10-7.61C22 6.36 17.52 3 12 3z\"/></svg>`,\n naver: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path fill=\"#fff\" d=\"M16.273 12.845 7.376 0H0v24h7.726V11.156L16.624 24H24V0h-7.727v12.845Z\"/></svg>`,\n facebook: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path fill=\"#fff\" d=\"M24 12.07C24 5.41 18.63 0 12 0S0 5.4 0 12.07C0 18.1 4.39 23.1 10.13 24v-8.44H7.08v-3.49h3.04V9.41c0-3.02 1.8-4.7 4.54-4.7 1.31 0 2.68.24 2.68.24v2.97h-1.5c-1.5 0-1.96.93-1.96 1.89v2.26h3.33l-.53 3.49h-2.8V24C19.62 23.1 24 18.1 24 12.07z\"/></svg>`,\n github: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"#fff\"><path d=\"M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z\"/></svg>`,\n discord: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"#fff\"><path d=\"M20.32 4.37a19.8 19.8 0 00-4.89-1.52.07.07 0 00-.08.04c-.21.38-.44.87-.61 1.26a18.27 18.27 0 00-5.49 0 12.64 12.64 0 00-.62-1.26.07.07 0 00-.08-.04 19.74 19.74 0 00-4.89 1.52.07.07 0 00-.03.03C1.11 8.39.34 12.28.73 16.12a.08.08 0 00.03.06 19.9 19.9 0 005.99 3.03.08.08 0 00.08-.03c.46-.63.87-1.3 1.22-2a.08.08 0 00-.04-.11 13.1 13.1 0 01-1.87-.9.08.08 0 01-.01-.13c.13-.09.25-.19.37-.29a.07.07 0 01.08-.01c3.93 1.8 8.18 1.8 12.07 0a.07.07 0 01.08 0c.12.1.25.2.37.3a.08.08 0 01-.01.12c-.6.35-1.22.65-1.87.9a.08.08 0 00-.04.1c.36.7.77 1.37 1.22 2a.08.08 0 00.08.03 19.83 19.83 0 006-3.03.08.08 0 00.03-.05c.47-4.87-.78-9.09-3.3-12.84a.06.06 0 00-.03-.03zM8.02 13.62c-1.11 0-2.03-1.02-2.03-2.28 0-1.26.9-2.28 2.03-2.28 1.14 0 2.04 1.03 2.03 2.28 0 1.26-.9 2.28-2.03 2.28zm7.5 0c-1.11 0-2.03-1.02-2.03-2.28 0-1.26.9-2.28 2.03-2.28 1.14 0 2.04 1.03 2.03 2.28 0 1.26-.89 2.28-2.03 2.28z\"/></svg>`,\n x: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"#fff\"><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\"/></svg>`,\n line: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"#fff\"><path d=\"M19.365 9.863c.349 0 .63.285.63.631 0 .345-.281.63-.63.63H17.61v1.125h1.755c.349 0 .63.283.63.63 0 .344-.281.629-.63.629h-2.386c-.345 0-.627-.285-.627-.629V8.108c0-.345.282-.63.63-.63h2.386c.346 0 .627.285.627.63 0 .349-.281.63-.63.63H17.61v1.125h1.755zm-3.855 3.016c0 .27-.174.51-.432.596-.064.021-.133.031-.199.031-.211 0-.391-.09-.51-.25l-2.443-3.317v2.94c0 .344-.279.629-.631.629-.346 0-.626-.285-.626-.629V8.108c0-.27.173-.51.43-.595.06-.023.136-.033.194-.033.195 0 .375.104.495.254l2.462 3.33V8.108c0-.345.282-.63.63-.63.345 0 .63.285.63.63v4.771zm-5.741 0c0 .344-.282.629-.631.629-.345 0-.627-.285-.627-.629V8.108c0-.345.282-.63.63-.63.346 0 .628.285.628.63v4.771zm-2.466.629H4.917c-.345 0-.63-.285-.63-.629V8.108c0-.345.285-.63.63-.63.348 0 .63.285.63.63v4.141h1.756c.348 0 .629.283.629.63 0 .344-.282.629-.629.629M24 10.314C24 4.943 18.615.572 12 .572S0 4.943 0 10.314c0 4.811 4.27 8.842 10.035 9.608.391.082.923.258 1.058.59.12.301.079.766.038 1.08l-.164 1.02c-.045.301-.24 1.186 1.049.645 1.291-.539 6.916-4.078 9.436-6.975C23.176 14.393 24 12.458 24 10.314\"/></svg>`,\n microsoft: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><rect fill=\"#F25022\" x=\"1\" y=\"1\" width=\"10\" height=\"10\"/><rect fill=\"#7FBA00\" x=\"13\" y=\"1\" width=\"10\" height=\"10\"/><rect fill=\"#00A4EF\" x=\"1\" y=\"13\" width=\"10\" height=\"10\"/><rect fill=\"#FFB900\" x=\"13\" y=\"13\" width=\"10\" height=\"10\"/></svg>`,\n};\n\nexport function getProviderButtonConfig(provider: OAuthProviderType): ProviderButtonConfig {\n const colors = PROVIDER_COLORS[provider];\n return {\n provider,\n label: `Continue with ${PROVIDER_DISPLAY_NAMES[provider]}`,\n bgColor: colors.bg,\n textColor: colors.text,\n iconSvg: PROVIDER_ICONS[provider],\n };\n}\n","import type { BrandingConfig, OAuthProviderType } from '@authon/shared';\nimport { DEFAULT_BRANDING } from '@authon/shared';\nimport { getProviderButtonConfig } from './providers';\n\nfunction hexToRgba(hex: string, alpha: number): string {\n const h = hex.replace('#', '');\n const r = parseInt(h.substring(0, 2), 16);\n const g = parseInt(h.substring(2, 4), 16);\n const b = parseInt(h.substring(4, 6), 16);\n return `rgba(${r},${g},${b},${alpha})`;\n}\n\nconst WALLET_OPTIONS = [\n { id: 'pexus', name: 'Pexus', color: '#7c3aed' },\n { id: 'metamask', name: 'MetaMask', color: '#f6851b' },\n { id: 'phantom', name: 'Phantom', color: '#ab9ff2' },\n] as const;\n\nfunction walletIconSvg(id: string): string {\n switch (id) {\n case 'pexus':\n return `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><rect width=\"24\" height=\"24\" rx=\"6\" fill=\"#7c3aed\"/><path d=\"M7 8h4v8H7V8zm6 0h4v8h-4V8z\" fill=\"#fff\"/></svg>`;\n case 'metamask':\n return `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><rect width=\"24\" height=\"24\" rx=\"6\" fill=\"#f6851b\"/><path d=\"M17.2 4L12 8.5l1 .7L17.2 4zM6.8 4l5.1 5.3-1-0.6L6.8 4zM16 16.2l-1.4 2.1 3 .8.8-2.9h-2.4zM5.6 16.2l.9 2.8 3-.8-1.4-2h-2.5z\" fill=\"#fff\"/></svg>`;\n case 'phantom':\n return `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><rect width=\"24\" height=\"24\" rx=\"6\" fill=\"#ab9ff2\"/><circle cx=\"9\" cy=\"11\" r=\"1.5\" fill=\"#fff\"/><circle cx=\"15\" cy=\"11\" r=\"1.5\" fill=\"#fff\"/><path d=\"M6 12c0-3.3 2.7-6 6-6s6 2.7 6 6v2c0 1.1-.9 2-2 2H8c-1.1 0-2-.9-2-2v-2z\" stroke=\"#fff\" stroke-width=\"1.5\" fill=\"none\"/></svg>`;\n default:\n return `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><rect width=\"24\" height=\"24\" rx=\"6\" fill=\"#666\"/><text x=\"12\" y=\"16\" text-anchor=\"middle\" fill=\"#fff\" font-size=\"12\">${id[0]?.toUpperCase() ?? 'W'}</text></svg>`;\n }\n}\n\nexport class ModalRenderer {\n private shadowRoot: ShadowRoot | null = null;\n private hostElement: HTMLDivElement | null = null;\n private containerElement: HTMLElement | null = null;\n private containerId: string | null = null;\n private mode: 'popup' | 'embedded';\n private theme: 'light' | 'dark' | 'auto';\n private branding: BrandingConfig;\n private themeObserver: MutationObserver | null = null;\n private mediaQueryListener: ((e: MediaQueryListEvent) => void) | null = null;\n private enabledProviders: OAuthProviderType[] = [];\n private currentView: 'signIn' | 'signUp' = 'signIn';\n private onProviderClick: (provider: OAuthProviderType) => void;\n private onEmailSubmit: (email: string, password: string, isSignUp: boolean) => void;\n private onClose: () => void;\n private onWeb3WalletSelect: (wallet: string) => void;\n private onPasswordlessSubmit: (email: string) => void;\n private onOtpVerify: (email: string, code: string) => void;\n private onPasskeyClick: () => void;\n private escHandler: ((e: KeyboardEvent) => void) | null = null;\n\n // Overlay state\n private currentOverlay: string = 'none';\n private selectedWallet: string = '';\n private overlayEmail: string = '';\n private overlayError: string = '';\n\n // Turnstile CAPTCHA\n private captchaSiteKey: string = '';\n private turnstileWidgetId: string | null = null;\n private turnstileToken: string = '';\n private turnstileWrapper: HTMLDivElement | null = null;\n\n constructor(options: {\n mode: 'popup' | 'embedded';\n theme?: 'light' | 'dark' | 'auto';\n containerId?: string;\n branding?: BrandingConfig;\n captchaSiteKey?: string;\n onProviderClick: (provider: OAuthProviderType) => void;\n onEmailSubmit: (email: string, password: string, isSignUp: boolean) => void;\n onClose: () => void;\n onWeb3WalletSelect?: (wallet: string) => void;\n onPasswordlessSubmit?: (email: string) => void;\n onOtpVerify?: (email: string, code: string) => void;\n onPasskeyClick?: () => void;\n }) {\n this.mode = options.mode;\n this.theme = options.theme || 'auto';\n this.branding = { ...DEFAULT_BRANDING, ...options.branding };\n this.captchaSiteKey = options.captchaSiteKey || '';\n this.onProviderClick = options.onProviderClick;\n this.onEmailSubmit = options.onEmailSubmit;\n this.onClose = options.onClose;\n this.onWeb3WalletSelect = options.onWeb3WalletSelect || (() => {});\n this.onPasswordlessSubmit = options.onPasswordlessSubmit || (() => {});\n this.onOtpVerify = options.onOtpVerify || (() => {});\n this.onPasskeyClick = options.onPasskeyClick || (() => {});\n\n if (options.mode === 'embedded' && options.containerId) {\n this.containerId = options.containerId;\n }\n }\n\n private resolveContainerElement(): HTMLElement | null {\n if (this.mode !== 'embedded' || !this.containerId) return null;\n const next = document.getElementById(this.containerId);\n if (this.containerElement !== next) {\n // Container changed (SPA navigation) — discard stale mount\n this.hostElement?.remove();\n this.hostElement = null;\n this.shadowRoot = null;\n }\n this.containerElement = next;\n return next;\n }\n\n setProviders(providers: OAuthProviderType[]): void {\n this.enabledProviders = providers;\n }\n\n setBranding(branding: BrandingConfig): void {\n this.branding = { ...DEFAULT_BRANDING, ...branding };\n }\n\n open(view: 'signIn' | 'signUp' = 'signIn'): void {\n this.resolveContainerElement();\n\n if (this.hostElement && !this.hostElement.isConnected) {\n this.hostElement = null;\n this.shadowRoot = null;\n }\n\n if (this.shadowRoot && this.hostElement) {\n // Modal already open — smooth in-place view switch\n this.hideOverlay();\n this.switchView(view);\n } else {\n this.currentView = view;\n this.currentOverlay = 'none';\n this.render(view);\n }\n }\n\n close(): void {\n this.stopThemeObserver();\n if (this.escHandler) {\n document.removeEventListener('keydown', this.escHandler);\n this.escHandler = null;\n }\n // Cleanup turnstile\n if (this.turnstileWidgetId !== null) {\n (window as any).turnstile?.remove(this.turnstileWidgetId);\n this.turnstileWidgetId = null;\n this.turnstileToken = '';\n }\n if (this.turnstileWrapper) {\n this.turnstileWrapper.remove();\n this.turnstileWrapper = null;\n }\n if (this.hostElement) {\n this.hostElement.remove();\n this.hostElement = null;\n this.shadowRoot = null;\n }\n const liveContainer = this.resolveContainerElement();\n if (liveContainer) {\n liveContainer.replaceChildren();\n }\n this.currentOverlay = 'none';\n }\n\n getTurnstileToken(): string {\n return this.turnstileToken;\n }\n\n resetTurnstile(): void {\n if (this.turnstileWidgetId !== null) {\n (window as any).turnstile?.reset(this.turnstileWidgetId);\n this.turnstileToken = '';\n }\n }\n\n /** Update theme at runtime without destroying form state */\n setTheme(theme: 'light' | 'dark' | 'auto'): void {\n this.theme = theme;\n this.updateThemeCSS();\n if (theme === 'auto') {\n this.startThemeObserver();\n } else {\n this.stopThemeObserver();\n }\n }\n\n private updateThemeCSS(): void {\n if (!this.shadowRoot) return;\n const styleEl = this.shadowRoot.getElementById('authon-theme-style');\n if (styleEl) {\n styleEl.textContent = this.buildCSS();\n }\n }\n\n private startThemeObserver(): void {\n this.stopThemeObserver();\n if (typeof document === 'undefined' || typeof window === 'undefined') return;\n\n // Watch for data-theme / class changes on <html>\n this.themeObserver = new MutationObserver(() => this.updateThemeCSS());\n this.themeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme', 'class'],\n });\n\n // Watch for OS-level prefers-color-scheme changes\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\n this.mediaQueryListener = () => this.updateThemeCSS();\n mq.addEventListener('change', this.mediaQueryListener);\n }\n\n private stopThemeObserver(): void {\n if (this.themeObserver) {\n this.themeObserver.disconnect();\n this.themeObserver = null;\n }\n if (this.mediaQueryListener) {\n window.matchMedia('(prefers-color-scheme: dark)').removeEventListener('change', this.mediaQueryListener);\n this.mediaQueryListener = null;\n }\n }\n\n showError(message: string): void {\n if (!this.shadowRoot) return;\n this.clearError();\n const errorEl = this.shadowRoot.getElementById('email-form');\n if (errorEl) {\n const errDiv = document.createElement('div');\n errDiv.id = 'authon-error-msg';\n errDiv.className = 'error-msg';\n errDiv.textContent = message;\n errorEl.appendChild(errDiv);\n }\n }\n\n showBanner(message: string, type: 'error' | 'warning' = 'error'): void {\n if (!this.shadowRoot) return;\n this.clearBanner();\n const inner = this.shadowRoot.getElementById('modal-inner');\n if (!inner) return;\n const banner = document.createElement('div');\n banner.id = 'authon-banner';\n banner.className = type === 'warning' ? 'banner-warning' : 'error-msg';\n banner.textContent = message;\n inner.insertBefore(banner, inner.firstChild);\n }\n\n clearBanner(): void {\n if (!this.shadowRoot) return;\n this.shadowRoot.getElementById('authon-banner')?.remove();\n }\n\n clearError(): void {\n if (!this.shadowRoot) return;\n this.shadowRoot.getElementById('authon-error-msg')?.remove();\n }\n\n showLoading(): void {\n if (!this.shadowRoot) return;\n this.hideLoading();\n const overlay = document.createElement('div');\n overlay.id = 'authon-loading-overlay';\n overlay.innerHTML = `\n <div class=\"loading-spinner\">\n <div class=\"loading-ring\"></div>\n <div class=\"loading-ring\"></div>\n <div class=\"loading-ring\"></div>\n </div>\n <div class=\"loading-text\">Signing in<span class=\"loading-dots\"><span></span><span></span><span></span></span></div>\n `;\n this.shadowRoot.querySelector('.modal-container')?.appendChild(overlay);\n }\n\n hideLoading(): void {\n if (!this.shadowRoot) return;\n this.shadowRoot.getElementById('authon-loading-overlay')?.remove();\n }\n\n // ── Flow Overlay Public API ──\n\n showOverlay(overlay: string): void {\n this.currentOverlay = overlay;\n this.overlayError = '';\n this.renderOverlay();\n }\n\n hideOverlay(): void {\n this.currentOverlay = 'none';\n this.overlayError = '';\n if (!this.shadowRoot) return;\n this.shadowRoot.getElementById('flow-overlay')?.remove();\n }\n\n showWeb3Success(walletId: string, address: string): void {\n this.selectedWallet = walletId;\n this.overlayError = '';\n // Store truncated address for rendering\n const truncated = address.length > 10\n ? `${address.slice(0, 6)}...${address.slice(-4)}`\n : address;\n this.currentOverlay = 'web3-success';\n this.renderOverlayWithData({ truncatedAddress: truncated, walletId });\n }\n\n showPasswordlessSent(): void {\n this.overlayError = '';\n this.currentOverlay = 'passwordless-sent';\n this.renderOverlay();\n }\n\n showOtpInput(email: string): void {\n this.overlayEmail = email;\n this.overlayError = '';\n this.currentOverlay = 'otp-input';\n this.renderOverlay();\n }\n\n showPasskeySuccess(): void {\n this.overlayError = '';\n this.currentOverlay = 'passkey-success';\n this.renderOverlay();\n }\n\n showOverlayError(message: string): void {\n this.overlayError = message;\n // Re-render the current overlay with the error displayed\n if (this.currentOverlay !== 'none') {\n this.renderOverlay();\n }\n }\n\n // ── Smooth view switch (no flicker) ──\n\n private switchView(view: 'signIn' | 'signUp'): void {\n if (!this.shadowRoot || view === this.currentView) return;\n this.currentView = view;\n\n const inner = this.shadowRoot.getElementById('modal-inner');\n if (!inner) return;\n\n // Cross-fade: fade out -> update -> fade in\n inner.style.opacity = '0';\n inner.style.transform = 'translateY(-4px)';\n\n setTimeout(() => {\n inner.innerHTML = this.buildInnerContent(view);\n this.attachInnerEvents(view);\n // Trigger reflow, then animate in\n void inner.offsetHeight;\n inner.style.opacity = '1';\n inner.style.transform = 'translateY(0)';\n }, 140);\n }\n\n // ── Render ──\n\n private render(view: 'signIn' | 'signUp'): void {\n const host = document.createElement('div');\n host.setAttribute('data-authon-modal', '');\n this.hostElement = host;\n\n if (this.mode === 'popup') {\n document.body.appendChild(host);\n } else {\n const container = this.resolveContainerElement();\n if (!container) {\n this.hostElement = null;\n throw new Error(`Authon container \"#${this.containerId}\" not found`);\n }\n container.replaceChildren();\n container.appendChild(host);\n }\n\n this.shadowRoot = host.attachShadow({ mode: 'open' });\n this.shadowRoot.innerHTML = this.buildShell(view);\n this.attachInnerEvents(view);\n this.attachShellEvents();\n\n // Start observing theme changes in auto mode\n if (this.theme === 'auto') {\n this.startThemeObserver();\n }\n }\n\n // ── HTML builders ──\n\n /** Shell = style + backdrop + modal-container (stable across view switches) */\n private buildShell(view: 'signIn' | 'signUp'): string {\n const popupWrapper =\n this.mode === 'popup'\n ? `<div class=\"backdrop\" id=\"backdrop\"></div>`\n : '';\n\n return `\n <style id=\"authon-theme-style\">${this.buildCSS()}</style>\n ${popupWrapper}\n <div class=\"modal-container\" role=\"dialog\" aria-modal=\"true\">\n <div id=\"modal-inner\" class=\"modal-inner\">\n ${this.buildInnerContent(view)}\n </div>\n </div>\n `;\n }\n\n /** Inner content = everything inside the modal that changes per view */\n private buildInnerContent(view: 'signIn' | 'signUp'): string {\n const b = this.branding;\n const isSignUp = view === 'signUp';\n const title = isSignUp ? 'Create your account' : 'Welcome back';\n const subtitle = isSignUp ? 'Already have an account?' : \"Don't have an account?\";\n const subtitleLink = isSignUp ? 'Sign in' : 'Sign up';\n\n const dark = this.isDark();\n\n // SignUp view: hide providers, show only email form\n const showProviders = !isSignUp;\n\n const providerButtons = showProviders\n ? this.enabledProviders\n .filter((p) => !b.hiddenProviders?.includes(p))\n .map((p) => {\n const config = getProviderButtonConfig(p);\n const isWhiteBg = config.bgColor === '#ffffff';\n const btnBg = dark && isWhiteBg ? '#f8fafc' : config.bgColor;\n const btnBorder = isWhiteBg ? (dark ? '#475569' : '#e5e7eb') : config.bgColor;\n return `<button class=\"provider-btn\" data-provider=\"${p}\" style=\"background:${btnBg};color:${config.textColor};border:1px solid ${btnBorder}\">\n <span class=\"provider-icon\">${config.iconSvg}</span>\n <span>${config.label}</span>\n </button>`;\n })\n .join('')\n : '';\n\n const divider =\n showProviders && b.showDivider !== false && b.showEmailPassword !== false\n ? `<div class=\"divider\"><span>or</span></div>`\n : '';\n\n const emailForm =\n b.showEmailPassword !== false\n ? `<form class=\"email-form\" id=\"email-form\">\n <input type=\"email\" placeholder=\"Email address\" name=\"email\" required class=\"input\" autocomplete=\"email\" />\n <input type=\"password\" placeholder=\"Password\" name=\"password\" required class=\"input\" autocomplete=\"${isSignUp ? 'new-password' : 'current-password'}\" />\n ${isSignUp ? '<p class=\"password-hint\">Must contain uppercase, lowercase, and a number (min 8 chars)</p>' : ''}\n <button type=\"submit\" class=\"submit-btn\">${isSignUp ? 'Sign up' : 'Sign in'}</button>\n </form>`\n : '';\n\n // Auth method divider and buttons (Web3, Passwordless, Passkey)\n const hasMethodAbove = (showProviders && this.enabledProviders.length > 0) || b.showEmailPassword !== false;\n const hasMethodBelow = b.showWeb3 || b.showPasswordless || b.showPasskey;\n const methodDivider = hasMethodAbove && hasMethodBelow\n ? `<div class=\"divider\"><span>or</span></div>`\n : '';\n\n const methodButtons: string[] = [];\n if (b.showWeb3) {\n methodButtons.push(`<button class=\"auth-method-btn web3-btn\" id=\"web3-btn\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M21 12V7H5a2 2 0 0 1 0-4h14v4\"/><path d=\"M3 5v14a2 2 0 0 0 2 2h16v-5\"/><path d=\"M18 12a2 2 0 0 0 0 4h4v-4h-4z\"/>\n </svg>\n <span>Connect Wallet</span>\n </button>`);\n }\n if (b.showPasswordless) {\n methodButtons.push(`<button class=\"auth-method-btn passwordless-btn\" id=\"passwordless-btn\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/>\n </svg>\n <span>Continue with Magic Link</span>\n </button>`);\n }\n if (b.showPasskey) {\n methodButtons.push(`<button class=\"auth-method-btn passkey-btn\" id=\"passkey-btn\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"10\" cy=\"7\" r=\"4\"/><path d=\"M10.3 15H7a4 4 0 0 0-4 4v2\"/><path d=\"M21.7 13.3 19 11\"/><path d=\"m21 15-2.5-1.5\"/><path d=\"m17 17 2.5-1.5\"/><path d=\"M22 9v6a1 1 0 0 1-1 1h-.5\"/><circle cx=\"18\" cy=\"9\" r=\"3\"/>\n </svg>\n <span>Sign in with Passkey</span>\n </button>`);\n }\n const authMethods = methodButtons.length > 0\n ? `<div class=\"auth-methods\">${methodButtons.join('')}</div>`\n : '';\n\n const footer =\n b.termsUrl || b.privacyUrl\n ? `<div class=\"footer\">\n ${b.termsUrl ? `<a href=\"${b.termsUrl}\" target=\"_blank\">Terms of Service</a>` : ''}\n ${b.termsUrl && b.privacyUrl ? ' · ' : ''}\n ${b.privacyUrl ? `<a href=\"${b.privacyUrl}\" target=\"_blank\">Privacy Policy</a>` : ''}\n </div>`\n : '';\n\n const titleHtml = isSignUp\n ? `<div class=\"title-row\">\n <button class=\"back-btn\" id=\"back-btn\" type=\"button\" aria-label=\"Back to sign in\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5\"/><path d=\"m12 19-7-7 7-7\"/></svg>\n </button>\n <h2 class=\"title\">${title}</h2>\n </div>`\n : `<h2 class=\"title\">${title}</h2>`;\n\n return `\n ${b.logoDataUrl ? `<img src=\"${b.logoDataUrl}\" alt=\"Logo\" class=\"logo\" />` : ''}\n ${titleHtml}\n ${b.brandName ? `<p class=\"brand-name\">${b.brandName}</p>` : ''}\n ${showProviders ? `<div class=\"providers\">${providerButtons}</div>` : ''}\n ${divider}\n ${emailForm}\n ${methodDivider}\n ${authMethods}\n <p class=\"switch-view\">${subtitle} <a href=\"#\" id=\"switch-link\">${subtitleLink}</a></p>\n ${footer}\n ${b.showSecuredBy !== false ? `<div class=\"secured-by\">Secured by <a href=\"https://authon.dev\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"secured-link\">Authon</a></div>` : ''}\n `;\n }\n\n private renderTurnstile(): void {\n if (!this.captchaSiteKey) return;\n\n const w = window as any;\n const tryRender = () => {\n if (!w.turnstile) return;\n // Render off-screen in real DOM — invisible unless challenge needed\n this.turnstileWrapper = document.createElement('div');\n this.turnstileWrapper.style.cssText = 'position:fixed;bottom:10px;right:10px;z-index:2147483647;';\n document.body.appendChild(this.turnstileWrapper);\n this.turnstileWidgetId = w.turnstile.render(this.turnstileWrapper, {\n sitekey: this.captchaSiteKey,\n callback: (token: string) => { this.turnstileToken = token; },\n 'expired-callback': () => { this.turnstileToken = ''; },\n 'error-callback': () => { this.turnstileToken = ''; },\n theme: this.isDark() ? 'dark' : 'light',\n appearance: 'interaction-only',\n });\n };\n\n if (w.turnstile) {\n tryRender();\n } else {\n const interval = setInterval(() => {\n if (w.turnstile) {\n clearInterval(interval);\n tryRender();\n }\n }, 200);\n setTimeout(() => clearInterval(interval), 10000);\n }\n }\n\n private isDark(): boolean {\n if (this.theme === 'dark') return true;\n if (this.theme === 'light') return false;\n // Auto: check host page's <html> class/attribute first, then OS preference\n if (typeof document !== 'undefined') {\n const html = document.documentElement;\n if (html.classList.contains('dark') || html.getAttribute('data-theme') === 'dark') return true;\n if (html.classList.contains('light') || html.getAttribute('data-theme') === 'light') return false;\n }\n return typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches;\n }\n\n private buildCSS(): string {\n const b = this.branding;\n const dark = this.isDark();\n const bg = dark ? (b.darkBg || '#0f172a') : (b.lightBg || '#ffffff');\n const text = dark ? (b.darkText || '#f1f5f9') : (b.lightText || '#111827');\n const mutedText = dark ? '#94a3b8' : '#6b7280';\n const dimText = dark ? '#64748b' : '#9ca3af';\n const borderColor = dark ? '#334155' : '#d1d5db';\n const dividerColor = dark ? '#334155' : '#e5e7eb';\n const inputBg = dark ? '#1e293b' : '#ffffff';\n\n return `\n :host {\n --authon-primary-start: ${b.primaryColorStart || '#7c3aed'};\n --authon-primary-end: ${b.primaryColorEnd || '#4f46e5'};\n --authon-bg: ${bg};\n --authon-text: ${text};\n --authon-muted: ${mutedText};\n --authon-dim: ${dimText};\n --authon-border: ${borderColor};\n --authon-divider: ${dividerColor};\n --authon-input-bg: ${inputBg};\n --authon-overlay-bg: ${hexToRgba(bg, 0.92)};\n --authon-overlay-bg-solid: ${hexToRgba(bg, 0.97)};\n --authon-backdrop-bg: rgba(0,0,0,${dark ? '0.7' : '0.5'});\n --authon-shadow-opacity: ${dark ? '0.5' : '0.25'};\n --authon-radius: ${b.borderRadius ?? 12}px;\n --authon-font: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n font-family: var(--authon-font);\n color: var(--authon-text);\n }\n * { box-sizing: border-box; margin: 0; padding: 0; }\n .backdrop {\n position: fixed; inset: 0; z-index: 99998;\n background: var(--authon-backdrop-bg); backdrop-filter: blur(4px);\n animation: fadeIn 0.2s ease;\n }\n .modal-container {\n ${this.mode === 'popup' ? 'position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 99999; max-height: 90vh; overflow-y: auto;' : ''}\n background: var(--authon-bg);\n color: var(--authon-text);\n border: 1px solid var(--authon-border);\n border-radius: var(--authon-radius);\n padding: 32px;\n width: 400px; max-width: 100%;\n position: ${this.mode === 'popup' ? 'fixed' : 'relative'};\n ${this.mode === 'popup' ? `box-shadow: 0 25px 50px -12px rgba(0,0,0,${dark ? '0.5' : '0.25'}); animation: slideIn 0.3s ease;` : ''}\n }\n .modal-inner {\n transition: opacity 0.14s ease, transform 0.14s ease;\n }\n .logo { display: block; margin: 0 auto 16px; max-height: 48px; }\n .title-row { display: flex; align-items: center; position: relative; margin-bottom: 8px; }\n .title-row .title { flex: 1; margin-bottom: 0; }\n .back-btn {\n position: absolute; left: 0; top: 50%; transform: translateY(-50%);\n background: none; border: none; color: var(--authon-muted);\n cursor: pointer; padding: 4px; border-radius: 6px; display: flex; align-items: center; justify-content: center;\n transition: color 0.15s, background 0.15s;\n }\n .back-btn:hover { color: var(--authon-text); background: var(--authon-divider); }\n .password-hint { font-size: 11px; color: var(--authon-dim); margin: -4px 0 2px; }\n .title { text-align: center; font-size: 24px; font-weight: 700; margin-bottom: 8px; color: var(--authon-text); }\n .brand-name { text-align: center; font-size: 14px; color: var(--authon-muted); margin-bottom: 24px; }\n .providers { display: flex; flex-direction: column; gap: 8px; margin-bottom: 16px; }\n .provider-btn {\n display: flex; align-items: center; gap: 12px;\n width: 100%; padding: 10px 16px; border-radius: calc(var(--authon-radius) * 0.67);\n font-size: 14px; font-weight: 500; cursor: pointer;\n transition: opacity 0.15s, transform 0.1s;\n font-family: var(--authon-font);\n }\n .provider-btn:hover { opacity: 0.9; }\n .provider-btn:active { transform: scale(0.98); }\n .provider-icon { display: flex; align-items: center; flex-shrink: 0; }\n .divider {\n display: flex; align-items: center; gap: 12px;\n margin: 16px 0; color: var(--authon-dim); font-size: 13px;\n }\n .divider::before, .divider::after {\n content: ''; flex: 1; height: 1px; background: var(--authon-divider);\n }\n .email-form { display: flex; flex-direction: column; gap: 10px; }\n .input {\n width: 100%; padding: 10px 14px;\n background: var(--authon-input-bg);\n color: var(--authon-text);\n border: 1px solid var(--authon-border); border-radius: calc(var(--authon-radius) * 0.5);\n font-size: 14px; font-family: var(--authon-font);\n outline: none; transition: border-color 0.15s;\n }\n .input::placeholder { color: var(--authon-dim); }\n .input:focus { border-color: var(--authon-primary-start); box-shadow: 0 0 0 3px rgba(124,58,237,0.15); }\n .submit-btn {\n width: 100%; padding: 10px;\n background: linear-gradient(135deg, var(--authon-primary-start), var(--authon-primary-end));\n color: #fff; border: none; border-radius: calc(var(--authon-radius) * 0.5);\n font-size: 14px; font-weight: 600; cursor: pointer;\n font-family: var(--authon-font); transition: opacity 0.15s;\n }\n .submit-btn:hover { opacity: 0.9; }\n .submit-btn:disabled { opacity: 0.6; cursor: not-allowed; }\n .error-msg {\n margin-top: 8px; padding: 8px 12px;\n background: rgba(239,68,68,0.1); border: 1px solid rgba(239,68,68,0.3);\n border-radius: calc(var(--authon-radius) * 0.33);\n font-size: 13px; color: #ef4444; text-align: center;\n animation: fadeIn 0.15s ease;\n }\n .banner-warning {\n margin-bottom: 16px; padding: 10px 14px;\n background: rgba(245,158,11,0.1); border: 1px solid rgba(245,158,11,0.3);\n border-radius: calc(var(--authon-radius) * 0.33);\n font-size: 13px; color: #f59e0b; text-align: center;\n animation: fadeIn 0.15s ease;\n }\n .switch-view { text-align: center; margin-top: 16px; font-size: 13px; color: var(--authon-muted); }\n .switch-view a { color: var(--authon-primary-start); text-decoration: none; font-weight: 500; }\n .switch-view a:hover { text-decoration: underline; }\n .footer { text-align: center; margin-top: 12px; font-size: 12px; color: var(--authon-dim); }\n .footer a { color: var(--authon-dim); text-decoration: none; }\n .footer a:hover { text-decoration: underline; }\n .secured-by {\n text-align: center; margin-top: 16px;\n font-size: 11px; color: var(--authon-dim);\n }\n .secured-link { font-weight: 600; color: var(--authon-muted); text-decoration: none; }\n .secured-link:hover { text-decoration: underline; }\n\n /* Auth method buttons */\n .auth-methods { display: flex; flex-direction: column; gap: 8px; }\n .auth-method-btn {\n display: flex; align-items: center; justify-content: center; gap: 8px;\n width: 100%; padding: 10px 16px;\n border-radius: calc(var(--authon-radius) * 0.5);\n font-size: 13px; font-weight: 500; cursor: pointer;\n font-family: var(--authon-font); transition: opacity 0.15s, transform 0.1s;\n }\n .auth-method-btn:hover { opacity: 0.85; }\n .auth-method-btn:active { transform: scale(0.98); }\n /* Web3 -- purple */\n .web3-btn {\n background: ${dark ? 'rgba(139,92,246,0.12)' : 'rgba(139,92,246,0.08)'};\n border: 1px solid ${dark ? 'rgba(139,92,246,0.3)' : 'rgba(139,92,246,0.25)'};\n color: ${dark ? '#c4b5fd' : '#7c3aed'};\n }\n /* Passwordless -- cyan */\n .passwordless-btn {\n background: ${dark ? 'rgba(6,182,212,0.12)' : 'rgba(6,182,212,0.08)'};\n border: 1px solid ${dark ? 'rgba(6,182,212,0.3)' : 'rgba(6,182,212,0.25)'};\n color: ${dark ? '#67e8f9' : '#0891b2'};\n }\n /* Passkey -- amber */\n .passkey-btn {\n background: ${dark ? 'rgba(245,158,11,0.12)' : 'rgba(245,158,11,0.08)'};\n border: 1px solid ${dark ? 'rgba(245,158,11,0.3)' : 'rgba(245,158,11,0.25)'};\n color: ${dark ? '#fcd34d' : '#b45309'};\n }\n\n /* Flow overlay */\n .flow-overlay {\n position: absolute; inset: 0; z-index: 10;\n background: var(--authon-overlay-bg-solid);\n backdrop-filter: blur(2px);\n border-radius: var(--authon-radius);\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n gap: 12px; padding: 24px;\n animation: fadeIn 0.2s ease;\n }\n .flow-overlay .cancel-link {\n font-size: 12px; color: var(--authon-dim); cursor: pointer; border: none;\n background: none; font-family: var(--authon-font); margin-top: 4px;\n }\n .flow-overlay .cancel-link:hover { text-decoration: underline; }\n .flow-overlay .overlay-title {\n font-size: 14px; font-weight: 600; color: var(--authon-text); text-align: center;\n }\n .flow-overlay .overlay-subtitle {\n font-size: 12px; color: var(--authon-muted); text-align: center;\n }\n .flow-overlay .overlay-error {\n padding: 6px 12px; margin-top: 4px;\n background: rgba(239,68,68,0.1); border: 1px solid rgba(239,68,68,0.3);\n border-radius: calc(var(--authon-radius) * 0.33);\n font-size: 12px; color: #ef4444; text-align: center; width: 100%;\n }\n\n /* Wallet picker */\n .wallet-picker { display: flex; flex-direction: column; gap: 8px; width: 100%; }\n .wallet-btn {\n display: flex; align-items: center; gap: 10px;\n width: 100%; padding: 10px 14px;\n background: ${dark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.04)'};\n border: 1px solid ${dark ? 'rgba(255,255,255,0.1)' : 'rgba(0,0,0,0.08)'};\n border-radius: calc(var(--authon-radius) * 0.5);\n font-size: 13px; font-weight: 500; color: var(--authon-text);\n cursor: pointer; font-family: var(--authon-font);\n transition: opacity 0.15s;\n }\n .wallet-btn:hover { opacity: 0.8; }\n .wallet-btn .wallet-icon { display: flex; align-items: center; flex-shrink: 0; }\n .wallet-btn .wallet-icon svg { border-radius: 6px; }\n\n /* Passwordless email input in overlay */\n .pwless-form { display: flex; flex-direction: column; gap: 10px; width: 100%; }\n .pwless-submit {\n width: 100%; padding: 10px;\n background: linear-gradient(135deg, #06b6d4, #0891b2);\n color: #fff; border: none; border-radius: calc(var(--authon-radius) * 0.5);\n font-size: 13px; font-weight: 600; cursor: pointer;\n font-family: var(--authon-font); transition: opacity 0.15s;\n }\n .pwless-submit:hover { opacity: 0.9; }\n .pwless-submit:disabled { opacity: 0.6; cursor: not-allowed; }\n\n /* OTP input */\n .otp-container { display: flex; flex-direction: column; align-items: center; gap: 16px; width: 100%; }\n .otp-inputs { display: flex; gap: 8px; justify-content: center; }\n .otp-digit {\n width: 40px; height: 48px; text-align: center;\n font-size: 20px; font-weight: 600; font-family: var(--authon-font);\n background: var(--authon-input-bg); color: var(--authon-text);\n border: 1px solid var(--authon-border);\n border-radius: calc(var(--authon-radius) * 0.33);\n outline: none; transition: border-color 0.15s;\n }\n .otp-digit:focus {\n border-color: var(--authon-primary-start);\n box-shadow: 0 0 0 3px rgba(124,58,237,0.15);\n }\n\n /* Success check animation */\n .success-check {\n width: 48px; height: 48px; border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n }\n .success-check svg path {\n stroke-dasharray: 20;\n stroke-dashoffset: 20;\n animation: check-draw 0.4s ease-out 0.1s forwards;\n }\n\n /* Spinner */\n .flow-spinner {\n animation: spin 0.8s linear infinite;\n }\n\n /* Passkey verifying icon */\n .passkey-icon-pulse {\n width: 48px; height: 48px; border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n background: rgba(245,158,11,0.15);\n animation: pulse 1.5s ease-in-out infinite;\n }\n\n /* Wallet connecting icon */\n .wallet-connecting-icon {\n width: 48px; height: 48px; border-radius: 12px;\n display: flex; align-items: center; justify-content: center;\n animation: pulse 1.5s ease-in-out infinite;\n }\n .wallet-connecting-icon svg { border-radius: 6px; }\n\n /* Address badge */\n .address-badge {\n display: inline-flex; align-items: center; gap: 6px;\n padding: 2px 10px; border-radius: 6px;\n background: ${dark ? 'rgba(255,255,255,0.04)' : 'rgba(0,0,0,0.03)'};\n font-size: 11px; font-family: monospace; color: var(--authon-muted);\n }\n .address-badge .wallet-icon-sm svg { width: 16px; height: 16px; border-radius: 4px; }\n\n /* Loading overlay */\n #authon-loading-overlay {\n position: absolute; inset: 0; z-index: 10;\n background: var(--authon-overlay-bg);\n backdrop-filter: blur(2px);\n border-radius: var(--authon-radius);\n display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 20px;\n animation: fadeIn 0.15s ease;\n }\n .loading-spinner { position: relative; width: 48px; height: 48px; }\n .loading-ring {\n position: absolute; inset: 0;\n border: 2.5px solid transparent; border-top-color: var(--authon-primary-start);\n border-radius: 50%; animation: spin 1s cubic-bezier(.55,.15,.45,.85) infinite;\n }\n .loading-ring:nth-child(2) {\n inset: 5px; border-top-color: transparent; border-right-color: var(--authon-primary-end);\n animation-duration: 1.2s; animation-direction: reverse; opacity: .7;\n }\n .loading-ring:nth-child(3) {\n inset: 10px; border-top-color: transparent; border-bottom-color: var(--authon-primary-start);\n animation-duration: .8s; opacity: .4;\n }\n .loading-text { font-size: 14px; font-weight: 500; color: var(--authon-muted); }\n .loading-dots { display: inline-flex; gap: 2px; margin-left: 2px; }\n .loading-dots span {\n width: 3px; height: 3px; border-radius: 50%;\n background: var(--authon-muted); animation: blink 1.4s infinite both;\n }\n .loading-dots span:nth-child(2) { animation-delay: .2s; }\n .loading-dots span:nth-child(3) { animation-delay: .4s; }\n @keyframes spin { to { transform: rotate(360deg); } }\n @keyframes blink { 0%,80%,100% { opacity: .2; } 40% { opacity: 1; } }\n @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }\n @keyframes slideIn { from { opacity: 0; transform: translate(-50%, -48%); } to { opacity: 1; transform: translate(-50%, -50%); } }\n @keyframes check-draw { to { stroke-dashoffset: 0; } }\n @keyframes pulse { 0%,100% { opacity: 1; } 50% { opacity: 0.6; } }\n ${b.customCss || ''}\n `;\n }\n\n // ── Flow Overlay Rendering ──\n\n private renderOverlay(): void {\n this.renderOverlayWithData({});\n }\n\n private renderOverlayWithData(data: Record<string, string>): void {\n if (!this.shadowRoot) return;\n const container = this.shadowRoot.querySelector('.modal-container');\n if (!container) return;\n\n // Remove existing overlay\n this.shadowRoot.getElementById('flow-overlay')?.remove();\n\n if (this.currentOverlay === 'none') return;\n\n const overlay = document.createElement('div');\n overlay.id = 'flow-overlay';\n overlay.className = 'flow-overlay';\n overlay.innerHTML = this.buildOverlayContent(data);\n container.appendChild(overlay);\n this.attachOverlayEvents(overlay);\n }\n\n private buildOverlayContent(data: Record<string, string>): string {\n const dark = this.isDark();\n const errorHtml = this.overlayError\n ? `<div class=\"overlay-error\">${this.escapeHtml(this.overlayError)}</div>`\n : '';\n // subtitleColor handled by var(--authon-dim) in CSS\n\n switch (this.currentOverlay) {\n case 'web3-picker': {\n const walletItems = WALLET_OPTIONS.map(w =>\n `<button class=\"wallet-btn\" data-wallet=\"${w.id}\">\n <span class=\"wallet-icon\">${walletIconSvg(w.id)}</span>\n <span>${w.name}</span>\n </button>`\n ).join('');\n return `\n <div class=\"overlay-title\" style=\"margin-bottom: 4px;\">Select Wallet</div>\n <div class=\"wallet-picker\">${walletItems}</div>\n ${errorHtml}\n <button class=\"cancel-link\" id=\"overlay-cancel\">Cancel</button>\n `;\n }\n\n case 'web3-connecting': {\n const wallet = WALLET_OPTIONS.find(w => w.id === this.selectedWallet);\n const walletName = wallet?.name ?? this.selectedWallet;\n return `\n <div class=\"wallet-connecting-icon\">${walletIconSvg(this.selectedWallet)}</div>\n <div style=\"display:flex;align-items:center;gap:8px;\">\n <svg class=\"flow-spinner\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" fill=\"none\" stroke=\"${wallet?.color ?? '#7c3aed'}\" stroke-width=\"2\" opacity=\"0.25\"/>\n <path d=\"M8 2a6 6 0 0 1 6 6\" fill=\"none\" stroke=\"${wallet?.color ?? '#7c3aed'}\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n </svg>\n <span class=\"overlay-subtitle\">Connecting ${this.escapeHtml(walletName)}...</span>\n </div>\n ${errorHtml}\n <button class=\"cancel-link\" id=\"overlay-cancel\">Cancel</button>\n `;\n }\n\n case 'web3-success': {\n const wallet = WALLET_OPTIONS.find(w => w.id === (data.walletId || this.selectedWallet));\n const walletColor = wallet?.color ?? '#8b5cf6';\n const truncAddr = data.truncatedAddress || '0x...';\n return `\n <div class=\"success-check\" style=\"background:linear-gradient(135deg, ${walletColor}, ${walletColor})\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M5 10l3.5 3.5L15 7\" stroke=\"white\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div class=\"overlay-title\">Wallet Connected</div>\n <div class=\"address-badge\">\n <span class=\"wallet-icon-sm\">${walletIconSvg(data.walletId || this.selectedWallet)}</span>\n <span>${this.escapeHtml(truncAddr)}</span>\n </div>\n `;\n }\n\n case 'passwordless-input': {\n return `\n <div class=\"overlay-title\">Enter your email</div>\n <div class=\"pwless-form\">\n <input type=\"email\" placeholder=\"you@example.com\" class=\"input\" id=\"pwless-email\" autocomplete=\"email\" />\n <button class=\"pwless-submit\" id=\"pwless-submit-btn\">Send Magic Link</button>\n </div>\n ${errorHtml}\n <button class=\"cancel-link\" id=\"overlay-cancel\">Cancel</button>\n `;\n }\n\n case 'passwordless-sending': {\n return `\n <svg class=\"flow-spinner\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" fill=\"none\" stroke=\"var(--authon-primary-start, #7c3aed)\" stroke-width=\"2\" opacity=\"0.25\"/>\n <path d=\"M8 2a6 6 0 0 1 6 6\" fill=\"none\" stroke=\"var(--authon-primary-start, #7c3aed)\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n </svg>\n <span class=\"overlay-subtitle\">Sending magic link...</span>\n `;\n }\n\n case 'passwordless-sent': {\n return `\n <div class=\"success-check\" style=\"background:linear-gradient(135deg, var(--authon-primary-start, #7c3aed), var(--authon-primary-end, #4f46e5))\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M5 10l3.5 3.5L15 7\" stroke=\"white\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div class=\"overlay-title\">Magic link sent!</div>\n <span class=\"overlay-subtitle\">Check your email inbox</span>\n `;\n }\n\n case 'otp-input': {\n const digitInputs = Array.from({ length: 6 }, (_, i) =>\n `<input type=\"text\" inputmode=\"numeric\" maxlength=\"1\" class=\"otp-digit\" data-idx=\"${i}\" autocomplete=\"one-time-code\" />`\n ).join('');\n return `\n <div class=\"otp-container\">\n <div class=\"overlay-title\">Enter verification code</div>\n <span class=\"overlay-subtitle\">6-digit code sent to ${this.escapeHtml(this.overlayEmail)}</span>\n <div class=\"otp-inputs\">${digitInputs}</div>\n ${errorHtml}\n <button class=\"cancel-link\" id=\"overlay-cancel\">Cancel</button>\n </div>\n `;\n }\n\n case 'passkey-verifying': {\n return `\n <div class=\"passkey-icon-pulse\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--authon-primary-start, #7c3aed)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"10\" cy=\"7\" r=\"4\"/><path d=\"M10.3 15H7a4 4 0 0 0-4 4v2\"/>\n <path d=\"M21.7 13.3 19 11\"/><path d=\"m21 15-2.5-1.5\"/><path d=\"m17 17 2.5-1.5\"/>\n <path d=\"M22 9v6a1 1 0 0 1-1 1h-.5\"/><circle cx=\"18\" cy=\"9\" r=\"3\"/>\n </svg>\n </div>\n <span class=\"overlay-subtitle\">Verifying identity...</span>\n ${errorHtml}\n <button class=\"cancel-link\" id=\"overlay-cancel\">Cancel</button>\n `;\n }\n\n case 'passkey-success': {\n return `\n <div class=\"success-check\" style=\"background:linear-gradient(135deg, var(--authon-primary-start, #7c3aed), var(--authon-primary-end, #4f46e5))\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M5 10l3.5 3.5L15 7\" stroke=\"white\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div class=\"overlay-title\">Identity verified!</div>\n `;\n }\n\n default:\n return '';\n }\n }\n\n private attachOverlayEvents(overlay: HTMLElement): void {\n if (!this.shadowRoot) return;\n\n // Cancel button\n const cancelBtn = overlay.querySelector('#overlay-cancel');\n if (cancelBtn) {\n cancelBtn.addEventListener('click', () => this.hideOverlay());\n }\n\n // Wallet buttons\n overlay.querySelectorAll('.wallet-btn').forEach((btn) => {\n btn.addEventListener('click', () => {\n const walletId = (btn as HTMLElement).dataset.wallet;\n if (walletId) {\n this.selectedWallet = walletId;\n this.onWeb3WalletSelect(walletId);\n }\n });\n });\n\n // Passwordless form submit\n const pwlessSubmit = overlay.querySelector('#pwless-submit-btn');\n const pwlessEmail = overlay.querySelector('#pwless-email') as HTMLInputElement | null;\n if (pwlessSubmit && pwlessEmail) {\n // Focus email input\n setTimeout(() => pwlessEmail.focus(), 50);\n\n const submitHandler = () => {\n const email = pwlessEmail.value.trim();\n if (!email) return;\n this.overlayEmail = email;\n this.showOverlay('passwordless-sending');\n this.onPasswordlessSubmit(email);\n };\n pwlessSubmit.addEventListener('click', submitHandler);\n pwlessEmail.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n submitHandler();\n }\n });\n }\n\n // OTP inputs\n const otpDigits = overlay.querySelectorAll('.otp-digit') as NodeListOf<HTMLInputElement>;\n if (otpDigits.length === 6) {\n // Auto-focus first digit\n setTimeout(() => otpDigits[0].focus(), 50);\n\n otpDigits.forEach((digit, idx) => {\n // Only allow digits\n digit.addEventListener('input', () => {\n const val = digit.value.replace(/\\D/g, '');\n digit.value = val.slice(0, 1);\n\n if (val && idx < 5) {\n otpDigits[idx + 1].focus();\n }\n\n // Check if all filled -> auto-submit\n const code = Array.from(otpDigits).map(d => d.value).join('');\n if (code.length === 6) {\n this.onOtpVerify(this.overlayEmail, code);\n }\n });\n\n // Backspace: move to previous\n digit.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Backspace' && !digit.value && idx > 0) {\n otpDigits[idx - 1].focus();\n otpDigits[idx - 1].value = '';\n }\n });\n\n // Paste support: fill all 6 from clipboard\n digit.addEventListener('paste', (e: ClipboardEvent) => {\n e.preventDefault();\n const pasted = (e.clipboardData?.getData('text') ?? '').replace(/\\D/g, '').slice(0, 6);\n if (pasted.length === 0) return;\n for (let i = 0; i < 6; i++) {\n otpDigits[i].value = pasted[i] || '';\n }\n // Focus last filled or next empty\n const lastIdx = Math.min(pasted.length, 5);\n otpDigits[lastIdx].focus();\n\n // Auto-submit if full code pasted\n if (pasted.length === 6) {\n this.onOtpVerify(this.overlayEmail, pasted);\n }\n });\n });\n }\n }\n\n private escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n }\n\n // ── Event binding ──\n\n /** Attach events to shell elements (backdrop, ESC) -- called once */\n private attachShellEvents(): void {\n if (!this.shadowRoot) return;\n\n const backdrop = this.shadowRoot.getElementById('backdrop');\n if (backdrop) {\n backdrop.addEventListener('click', () => this.onClose());\n }\n\n if (this.escHandler) {\n document.removeEventListener('keydown', this.escHandler);\n }\n if (this.mode === 'popup') {\n this.escHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n if (this.currentOverlay !== 'none') {\n this.hideOverlay();\n } else {\n this.onClose();\n }\n }\n };\n document.addEventListener('keydown', this.escHandler);\n }\n }\n\n /** Attach events to inner content (buttons, form, switch link) -- called on each view */\n private attachInnerEvents(view: 'signIn' | 'signUp'): void {\n if (!this.shadowRoot) return;\n\n // Provider buttons\n this.shadowRoot.querySelectorAll('.provider-btn').forEach((btn) => {\n btn.addEventListener('click', () => {\n const provider = (btn as HTMLElement).dataset.provider as OAuthProviderType;\n this.onProviderClick(provider);\n });\n });\n\n // Email form\n const form = this.shadowRoot.getElementById('email-form') as HTMLFormElement | null;\n if (form) {\n form.addEventListener('submit', (e) => {\n e.preventDefault();\n const formData = new FormData(form);\n this.onEmailSubmit(\n formData.get('email') as string,\n formData.get('password') as string,\n view === 'signUp',\n );\n });\n }\n\n // Turnstile CAPTCHA\n this.renderTurnstile();\n\n // Back button (signUp -> signIn)\n const backBtn = this.shadowRoot.getElementById('back-btn');\n if (backBtn) {\n backBtn.addEventListener('click', () => {\n this.open('signIn');\n });\n }\n\n // Switch view link\n const switchLink = this.shadowRoot.getElementById('switch-link');\n if (switchLink) {\n switchLink.addEventListener('click', (e) => {\n e.preventDefault();\n this.open(view === 'signIn' ? 'signUp' : 'signIn');\n });\n }\n\n // Web3 button\n const web3Btn = this.shadowRoot.getElementById('web3-btn');\n if (web3Btn) {\n web3Btn.addEventListener('click', () => this.showOverlay('web3-picker'));\n }\n\n // Passwordless button\n const pwlessBtn = this.shadowRoot.getElementById('passwordless-btn');\n if (pwlessBtn) {\n pwlessBtn.addEventListener('click', () => this.showOverlay('passwordless-input'));\n }\n\n // Passkey button\n const passkeyBtn = this.shadowRoot.getElementById('passkey-btn');\n if (passkeyBtn) {\n passkeyBtn.addEventListener('click', () => this.onPasskeyClick());\n }\n }\n}\n","import type { AuthonUser, AuthTokens } from '@authon/shared';\n\nexport class SessionManager {\n private accessToken: string | null = null;\n private refreshToken: string | null = null;\n private user: AuthonUser | null = null;\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private apiUrl: string;\n private publishableKey: string;\n private storageKey: string;\n\n constructor(publishableKey: string, apiUrl: string) {\n this.publishableKey = publishableKey;\n this.apiUrl = apiUrl;\n this.storageKey = `authon_session_${publishableKey.slice(0, 16)}`;\n this.restoreFromStorage();\n }\n\n private restoreFromStorage(): void {\n if (typeof window === 'undefined') return;\n try {\n const stored = localStorage.getItem(this.storageKey);\n if (!stored) return;\n const data = JSON.parse(stored);\n if (data.accessToken && data.refreshToken && data.user) {\n this.accessToken = data.accessToken;\n this.refreshToken = data.refreshToken;\n this.user = data.user;\n // Token might be expired, schedule immediate refresh\n this.scheduleRefresh(5);\n }\n } catch { /* ignore corrupt storage */ }\n }\n\n private persistToStorage(): void {\n if (typeof window === 'undefined') return;\n try {\n if (this.accessToken && this.refreshToken && this.user) {\n localStorage.setItem(this.storageKey, JSON.stringify({\n accessToken: this.accessToken,\n refreshToken: this.refreshToken,\n user: this.user,\n }));\n } else {\n localStorage.removeItem(this.storageKey);\n }\n } catch { /* ignore */ }\n }\n\n getToken(): string | null {\n return this.accessToken;\n }\n\n getUser(): AuthonUser | null {\n return this.user;\n }\n\n setSession(tokens: AuthTokens): void {\n this.accessToken = tokens.accessToken;\n this.refreshToken = tokens.refreshToken;\n this.user = tokens.user;\n this.persistToStorage();\n if (tokens.expiresIn && tokens.expiresIn > 0) {\n this.scheduleRefresh(tokens.expiresIn);\n }\n }\n\n updateUser(user: AuthonUser): void {\n this.user = user;\n }\n\n clearSession(): void {\n this.accessToken = null;\n this.refreshToken = null;\n this.user = null;\n this.persistToStorage();\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n private scheduleRefresh(expiresIn: number): void {\n if (this.refreshTimer) clearTimeout(this.refreshTimer);\n // Refresh 60 seconds before expiry\n const refreshIn = Math.max((expiresIn - 60) * 1000, 30000);\n this.refreshTimer = setTimeout(() => this.refresh(), refreshIn);\n }\n\n async refresh(): Promise<AuthTokens | null> {\n if (!this.refreshToken) {\n this.clearSession();\n return null;\n }\n try {\n const res = await fetch(`${this.apiUrl}/v1/auth/token/refresh`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.publishableKey,\n },\n credentials: 'include',\n body: JSON.stringify({ refreshToken: this.refreshToken }),\n });\n if (!res.ok) {\n this.clearSession();\n return null;\n }\n const tokens: AuthTokens = await res.json();\n this.setSession(tokens);\n return tokens;\n } catch {\n this.clearSession();\n return null;\n }\n }\n\n async signOut(): Promise<void> {\n try {\n await fetch(`${this.apiUrl}/v1/auth/signout`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.publishableKey,\n ...(this.accessToken ? { Authorization: `Bearer ${this.accessToken}` } : {}),\n },\n credentials: 'include',\n });\n } catch {\n // ignore\n }\n this.clearSession();\n }\n\n destroy(): void {\n this.clearSession();\n }\n}\n","/**\n * Minimal QR Code SVG generator — byte mode, EC Level L, versions 1–13.\n * Zero dependencies. Produces a standalone SVG string.\n */\n\n// ── GF(256) with irreducible polynomial x^8+x^4+x^3+x^2+1 (0x11D) ──\n\nconst EXP: number[] = [];\nconst LOG: number[] = new Array(256).fill(0);\n(() => {\n let v = 1;\n for (let i = 0; i < 255; i++) {\n EXP[i] = v;\n LOG[v] = i;\n v <<= 1;\n if (v & 256) v ^= 0x11d;\n }\n for (let i = 255; i < 512; i++) EXP[i] = EXP[i - 255];\n})();\n\nconst gfMul = (a: number, b: number): number => (a && b ? EXP[LOG[a] + LOG[b]] : 0);\n\n// ── Reed-Solomon error correction ──\n\nfunction rsEncode(data: number[], ecLen: number): number[] {\n // Build generator polynomial in ascending degree order\n let g = [1];\n for (let i = 0; i < ecLen; i++) {\n const ng = new Array(g.length + 1).fill(0);\n for (let j = 0; j < g.length; j++) {\n ng[j] ^= gfMul(g[j], EXP[i]);\n ng[j + 1] ^= g[j];\n }\n g = ng;\n }\n // Polynomial division: remainder of data(x)*x^ecLen / g(x)\n const rem = new Array(ecLen).fill(0);\n for (const d of data) {\n const fb = d ^ rem[0];\n for (let j = 0; j < ecLen - 1; j++) {\n rem[j] = rem[j + 1] ^ gfMul(g[ecLen - 1 - j], fb);\n }\n rem[ecLen - 1] = gfMul(g[0], fb);\n }\n return rem;\n}\n\n// ── Version tables (EC Level L only) ──\n\ninterface VerInfo {\n total: number; ec: number; g1: number; g1d: number; g2: number; g2d: number; align: number[];\n}\n\nconst VER: VerInfo[] = [\n { total: 0, ec: 0, g1: 0, g1d: 0, g2: 0, g2d: 0, align: [] }, // dummy\n { total: 26, ec: 7, g1: 1, g1d: 19, g2: 0, g2d: 0, align: [] },\n { total: 44, ec: 10, g1: 1, g1d: 34, g2: 0, g2d: 0, align: [6, 18] },\n { total: 70, ec: 15, g1: 1, g1d: 55, g2: 0, g2d: 0, align: [6, 22] },\n { total: 100, ec: 20, g1: 1, g1d: 80, g2: 0, g2d: 0, align: [6, 26] },\n { total: 134, ec: 26, g1: 1, g1d: 108, g2: 0, g2d: 0, align: [6, 30] },\n { total: 172, ec: 18, g1: 2, g1d: 68, g2: 0, g2d: 0, align: [6, 34] },\n { total: 196, ec: 20, g1: 2, g1d: 78, g2: 0, g2d: 0, align: [6, 22, 38] },\n { total: 242, ec: 24, g1: 2, g1d: 97, g2: 0, g2d: 0, align: [6, 24, 42] },\n { total: 292, ec: 30, g1: 2, g1d: 116, g2: 0, g2d: 0, align: [6, 26, 46] },\n { total: 346, ec: 18, g1: 2, g1d: 68, g2: 2, g2d: 69, align: [6, 28, 50] },\n { total: 404, ec: 20, g1: 4, g1d: 81, g2: 0, g2d: 0, align: [6, 30, 54] },\n { total: 466, ec: 24, g1: 2, g1d: 92, g2: 2, g2d: 93, align: [6, 32, 58] },\n { total: 532, ec: 26, g1: 4, g1d: 107, g2: 0, g2d: 0, align: [6, 34, 62] },\n];\n\nfunction dataCapacity(ver: number): number {\n const v = VER[ver];\n return v.g1 * v.g1d + v.g2 * v.g2d;\n}\n\nfunction pickVersion(byteLen: number): number {\n for (let v = 1; v < VER.length; v++) {\n const headerBits = 4 + (v <= 9 ? 8 : 16); // mode indicator + char count\n const available = dataCapacity(v) * 8 - headerBits;\n if (byteLen * 8 <= available) return v;\n }\n throw new Error(`Data too long for QR code (${byteLen} bytes)`);\n}\n\n// ── Data encoding (byte mode) ──\n\nfunction encodeData(bytes: number[], ver: number): number[] {\n const cap = dataCapacity(ver);\n const countBits = ver <= 9 ? 8 : 16;\n const bits: number[] = [];\n\n const push = (val: number, len: number) => {\n for (let i = len - 1; i >= 0; i--) bits.push((val >> i) & 1);\n };\n\n push(0b0100, 4); // byte mode indicator\n push(bytes.length, countBits);\n for (const b of bytes) push(b, 8);\n push(0, Math.min(4, cap * 8 - bits.length)); // terminator\n\n // Pad to byte boundary\n while (bits.length % 8) bits.push(0);\n\n // Pad codewords\n const padBytes = [0xec, 0x11];\n let pi = 0;\n while (bits.length < cap * 8) {\n push(padBytes[pi], 8);\n pi ^= 1;\n }\n\n // Convert bits to codewords\n const cw: number[] = [];\n for (let i = 0; i < bits.length; i += 8) {\n let byte = 0;\n for (let j = 0; j < 8; j++) byte = (byte << 1) | bits[i + j];\n cw.push(byte);\n }\n return cw;\n}\n\n// ── EC encoding and interleaving ──\n\nfunction computeCodewords(ver: number, dataCW: number[]): number[] {\n const v = VER[ver];\n const blocks: number[][] = [];\n const ecBlocks: number[][] = [];\n let offset = 0;\n\n for (let i = 0; i < v.g1; i++) {\n const block = dataCW.slice(offset, offset + v.g1d);\n blocks.push(block);\n ecBlocks.push(rsEncode(block, v.ec));\n offset += v.g1d;\n }\n for (let i = 0; i < v.g2; i++) {\n const block = dataCW.slice(offset, offset + v.g2d);\n blocks.push(block);\n ecBlocks.push(rsEncode(block, v.ec));\n offset += v.g2d;\n }\n\n // Interleave data\n const result: number[] = [];\n const maxDataLen = Math.max(v.g1d, v.g2d || 0);\n for (let i = 0; i < maxDataLen; i++) {\n for (const block of blocks) {\n if (i < block.length) result.push(block[i]);\n }\n }\n // Interleave EC\n for (let i = 0; i < v.ec; i++) {\n for (const block of ecBlocks) result.push(block[i]);\n }\n\n return result;\n}\n\n// ── Matrix construction ──\n\nconst UNSET = -1;\nconst DARK = 1;\nconst LIGHT = 0;\n\nfunction createMatrix(size: number): number[][] {\n return Array.from({ length: size }, () => new Array(size).fill(UNSET));\n}\n\nfunction setModule(m: number[][], r: number, c: number, dark: boolean) {\n if (r >= 0 && r < m.length && c >= 0 && c < m.length) m[r][c] = dark ? DARK : LIGHT;\n}\n\nfunction placeFinderPattern(m: number[][], row: number, col: number) {\n for (let r = -1; r <= 7; r++) {\n for (let c = -1; c <= 7; c++) {\n const dark =\n r >= 0 && r <= 6 && c >= 0 && c <= 6 &&\n (r === 0 || r === 6 || c === 0 || c === 6 || (r >= 2 && r <= 4 && c >= 2 && c <= 4));\n setModule(m, row + r, col + c, dark);\n }\n }\n}\n\nfunction placeAlignmentPattern(m: number[][], row: number, col: number) {\n for (let r = -2; r <= 2; r++) {\n for (let c = -2; c <= 2; c++) {\n const dark = Math.abs(r) === 2 || Math.abs(c) === 2 || (r === 0 && c === 0);\n m[row + r][col + c] = dark ? DARK : LIGHT;\n }\n }\n}\n\nfunction isReserved(m: number[][], r: number, c: number): boolean {\n return m[r][c] !== UNSET;\n}\n\nfunction buildMatrix(ver: number, codewords: number[]): number[][] {\n const size = ver * 4 + 17;\n const m = createMatrix(size);\n\n // Finder patterns + separators\n placeFinderPattern(m, 0, 0);\n placeFinderPattern(m, 0, size - 7);\n placeFinderPattern(m, size - 7, 0);\n\n // Timing patterns\n for (let i = 8; i < size - 8; i++) {\n m[6][i] = i % 2 === 0 ? DARK : LIGHT;\n m[i][6] = i % 2 === 0 ? DARK : LIGHT;\n }\n\n // Alignment patterns\n const ap = VER[ver].align;\n if (ap.length > 0) {\n for (const r of ap) {\n for (const c of ap) {\n // Skip if overlapping finder patterns\n if (r <= 8 && c <= 8) continue;\n if (r <= 8 && c >= size - 8) continue;\n if (r >= size - 8 && c <= 8) continue;\n placeAlignmentPattern(m, r, c);\n }\n }\n }\n\n // Dark module\n m[4 * ver + 9][8] = DARK;\n\n // Reserve format info areas (will be filled after masking)\n for (let i = 0; i < 9; i++) {\n if (m[8][i] === UNSET) m[8][i] = LIGHT; // top-left horizontal\n if (m[i][8] === UNSET) m[i][8] = LIGHT; // top-left vertical\n }\n for (let i = 0; i < 8; i++) {\n if (m[8][size - 1 - i] === UNSET) m[8][size - 1 - i] = LIGHT; // top-right\n if (m[size - 1 - i][8] === UNSET) m[size - 1 - i][8] = LIGHT; // bottom-left\n }\n\n // Reserve version info areas (version >= 7)\n if (ver >= 7) {\n for (let i = 0; i < 6; i++) {\n for (let j = 0; j < 3; j++) {\n m[i][size - 11 + j] = LIGHT;\n m[size - 11 + j][i] = LIGHT;\n }\n }\n }\n\n // Place data in zigzag pattern\n let bitIdx = 0;\n const totalBits = codewords.length * 8;\n let upward = true;\n\n for (let right = size - 1; right >= 0; right -= 2) {\n if (right === 6) right = 5; // skip timing column\n for (let i = 0; i < size; i++) {\n const row = upward ? size - 1 - i : i;\n for (const dc of [0, -1]) {\n const col = right + dc;\n if (col < 0 || col >= size) continue;\n if (isReserved(m, row, col)) continue;\n if (bitIdx < totalBits) {\n const byteIdx = bitIdx >> 3;\n const bitPos = 7 - (bitIdx & 7);\n m[row][col] = (codewords[byteIdx] >> bitPos) & 1;\n bitIdx++;\n } else {\n m[row][col] = LIGHT;\n }\n }\n }\n upward = !upward;\n }\n\n return m;\n}\n\n// ── Masking ──\n\ntype MaskFn = (r: number, c: number) => boolean;\n\nconst MASKS: MaskFn[] = [\n (r, c) => (r + c) % 2 === 0,\n (r) => r % 2 === 0,\n (_, c) => c % 3 === 0,\n (r, c) => (r + c) % 3 === 0,\n (r, c) => (Math.floor(r / 2) + Math.floor(c / 3)) % 2 === 0,\n (r, c) => ((r * c) % 2) + ((r * c) % 3) === 0,\n (r, c) => (((r * c) % 2) + ((r * c) % 3)) % 2 === 0,\n (r, c) => (((r + c) % 2) + ((r * c) % 3)) % 2 === 0,\n];\n\nfunction applyMask(m: number[][], maskIdx: number, template: number[][]): number[][] {\n const size = m.length;\n const result = m.map((row) => [...row]);\n const fn = MASKS[maskIdx];\n for (let r = 0; r < size; r++) {\n for (let c = 0; c < size; c++) {\n if (template[r][c] !== UNSET) continue; // reserved area\n if (fn(r, c)) result[r][c] ^= 1;\n }\n }\n return result;\n}\n\nfunction penalty(m: number[][]): number {\n const size = m.length;\n let score = 0;\n\n // Rule 1: consecutive same-color modules\n for (let r = 0; r < size; r++) {\n let count = 1;\n for (let c = 1; c < size; c++) {\n if (m[r][c] === m[r][c - 1]) { count++; } else {\n if (count >= 5) score += count - 2;\n count = 1;\n }\n }\n if (count >= 5) score += count - 2;\n }\n for (let c = 0; c < size; c++) {\n let count = 1;\n for (let r = 1; r < size; r++) {\n if (m[r][c] === m[r - 1][c]) { count++; } else {\n if (count >= 5) score += count - 2;\n count = 1;\n }\n }\n if (count >= 5) score += count - 2;\n }\n\n // Rule 2: 2x2 blocks\n for (let r = 0; r < size - 1; r++) {\n for (let c = 0; c < size - 1; c++) {\n const v = m[r][c];\n if (v === m[r][c + 1] && v === m[r + 1][c] && v === m[r + 1][c + 1]) score += 3;\n }\n }\n\n // Rule 3: finder-like patterns\n const pat1 = [1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0];\n const pat2 = [0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1];\n for (let r = 0; r < size; r++) {\n for (let c = 0; c <= size - 11; c++) {\n let match1 = true, match2 = true;\n for (let k = 0; k < 11; k++) {\n if (m[r][c + k] !== pat1[k]) match1 = false;\n if (m[r][c + k] !== pat2[k]) match2 = false;\n }\n if (match1 || match2) score += 40;\n }\n }\n for (let c = 0; c < size; c++) {\n for (let r = 0; r <= size - 11; r++) {\n let match1 = true, match2 = true;\n for (let k = 0; k < 11; k++) {\n if (m[r + k][c] !== pat1[k]) match1 = false;\n if (m[r + k][c] !== pat2[k]) match2 = false;\n }\n if (match1 || match2) score += 40;\n }\n }\n\n // Rule 4: dark/light ratio\n let dark = 0;\n for (let r = 0; r < size; r++) for (let c = 0; c < size; c++) if (m[r][c]) dark++;\n const pct = (dark * 100) / (size * size);\n const prev5 = Math.floor(pct / 5) * 5;\n const next5 = prev5 + 5;\n score += Math.min(Math.abs(prev5 - 50) / 5, Math.abs(next5 - 50) / 5) * 10;\n\n return score;\n}\n\n// ── Format & version information ──\n\nfunction bchEncode(data: number, gen: number, dataBits: number): number {\n let d = data << (15 - dataBits); // Shift depends on total - data bits\n const genLen = Math.floor(Math.log2(gen)) + 1;\n const totalBits = dataBits + (genLen - 1);\n d = data << (totalBits - dataBits);\n for (let i = dataBits - 1; i >= 0; i--) {\n if (d & (1 << (i + genLen - 1))) d ^= gen << i;\n }\n return (data << (genLen - 1)) | d;\n}\n\nfunction placeFormatInfo(m: number[][], maskIdx: number) {\n const size = m.length;\n // EC Level L = 01, mask pattern = maskIdx (3 bits)\n const data = (0b01 << 3) | maskIdx;\n let format = bchEncode(data, 0x537, 5);\n format ^= 0x5412;\n\n // Place around top-left finder\n const bits: number[] = [];\n for (let i = 14; i >= 0; i--) bits.push((format >> i) & 1);\n\n // Horizontal: left side of top-left finder + right side\n const hPos = [0, 1, 2, 3, 4, 5, 7, 8, size - 8, size - 7, size - 6, size - 5, size - 4, size - 3, size - 2];\n for (let i = 0; i < 15; i++) m[8][hPos[i]] = bits[i];\n\n // Vertical: bottom side of top-left finder + top side of bottom-left\n const vPos = [size - 1, size - 2, size - 3, size - 4, size - 5, size - 6, size - 7, size - 8, 7, 5, 4, 3, 2, 1, 0];\n for (let i = 0; i < 15; i++) m[vPos[i]][8] = bits[i];\n}\n\nfunction placeVersionInfo(m: number[][], ver: number) {\n if (ver < 7) return;\n const size = m.length;\n let info = bchEncode(ver, 0x1f25, 6);\n for (let i = 0; i < 18; i++) {\n const bit = (info >> i) & 1;\n const r = Math.floor(i / 3);\n const c = size - 11 + (i % 3);\n m[r][c] = bit;\n m[c][r] = bit;\n }\n}\n\n// ── Public API ──\n\nexport function generateQrSvg(text: string, moduleSize = 4): string {\n const bytes = Array.from(new TextEncoder().encode(text));\n const ver = pickVersion(bytes.length);\n const dataCW = encodeData(bytes, ver);\n const allCW = computeCodewords(ver, dataCW);\n const size = ver * 4 + 17;\n\n // Build template (tracks reserved areas)\n const template = createMatrix(size);\n placeFinderPattern(template, 0, 0);\n placeFinderPattern(template, 0, size - 7);\n placeFinderPattern(template, size - 7, 0);\n for (let i = 8; i < size - 8; i++) {\n template[6][i] = LIGHT;\n template[i][6] = LIGHT;\n }\n const ap = VER[ver].align;\n for (const r of ap) {\n for (const c of ap) {\n if (r <= 8 && c <= 8) continue;\n if (r <= 8 && c >= size - 8) continue;\n if (r >= size - 8 && c <= 8) continue;\n for (let dr = -2; dr <= 2; dr++) for (let dc = -2; dc <= 2; dc++) template[r + dr][c + dc] = LIGHT;\n }\n }\n template[4 * ver + 9][8] = LIGHT;\n for (let i = 0; i < 9; i++) {\n if (template[8][i] === UNSET) template[8][i] = LIGHT;\n if (template[i][8] === UNSET) template[i][8] = LIGHT;\n }\n for (let i = 0; i < 8; i++) {\n if (template[8][size - 1 - i] === UNSET) template[8][size - 1 - i] = LIGHT;\n if (template[size - 1 - i][8] === UNSET) template[size - 1 - i][8] = LIGHT;\n }\n if (ver >= 7) {\n for (let i = 0; i < 6; i++) for (let j = 0; j < 3; j++) {\n template[i][size - 11 + j] = LIGHT;\n template[size - 11 + j][i] = LIGHT;\n }\n }\n\n // Build matrix with data\n const base = buildMatrix(ver, allCW);\n\n // Try all 8 masks, pick lowest penalty\n let bestMask = 0;\n let bestScore = Infinity;\n for (let mask = 0; mask < 8; mask++) {\n const masked = applyMask(base, mask, template);\n placeFormatInfo(masked, mask);\n placeVersionInfo(masked, ver);\n const s = penalty(masked);\n if (s < bestScore) { bestScore = s; bestMask = mask; }\n }\n\n const final = applyMask(base, bestMask, template);\n placeFormatInfo(final, bestMask);\n placeVersionInfo(final, ver);\n\n // Render SVG\n const quiet = 4; // quiet zone modules\n const total = size + quiet * 2;\n const px = total * moduleSize;\n let svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${total} ${total}\" width=\"${px}\" height=\"${px}\" shape-rendering=\"crispEdges\">`;\n svg += `<rect width=\"${total}\" height=\"${total}\" fill=\"#fff\"/>`;\n for (let r = 0; r < size; r++) {\n for (let c = 0; c < size; c++) {\n if (final[r][c] === DARK) {\n svg += `<rect x=\"${c + quiet}\" y=\"${r + quiet}\" width=\"1\" height=\"1\" fill=\"#000\"/>`;\n }\n }\n }\n svg += '</svg>';\n return svg;\n}\n","import type {\n AuthonUser,\n AuthonOrganization,\n OrganizationMember,\n OrganizationInvitation,\n OrganizationListResponse,\n CreateOrganizationParams,\n UpdateOrganizationParams,\n InviteMemberParams,\n AuthTokens,\n BrandingConfig,\n MfaSetupResponse,\n MfaStatus,\n OAuthProviderType,\n PasskeyCredential,\n SessionInfo,\n Web3Chain,\n Web3NonceResponse,\n Web3Wallet,\n Web3WalletType,\n} from '@authon/shared';\nimport type {\n AuthonConfig,\n AuthonEventType,\n AuthonEvents,\n OAuthFlowMode,\n OAuthSignInOptions,\n} from './types';\nimport { AuthonMfaRequiredError } from './types';\nimport { ModalRenderer } from './modal';\nimport { SessionManager } from './session';\nimport { generateQrSvg } from './qrcode';\n\ninterface ProvidersResponse {\n providers: OAuthProviderType[];\n providerConfigs?: Partial<Record<OAuthProviderType, { oauthFlow?: OAuthFlowMode }>>;\n}\n\nexport class Authon {\n private publishableKey: string;\n private config: Required<Omit<AuthonConfig, 'containerId' | 'appearance'>> & {\n containerId?: string;\n appearance?: Partial<BrandingConfig>;\n };\n private session: SessionManager;\n private modal: ModalRenderer | null = null;\n private listeners: Map<string, Set<(...args: unknown[]) => void>> = new Map();\n private branding: BrandingConfig | null = null;\n private providers: OAuthProviderType[] = [];\n private providerFlowModes: Partial<Record<OAuthProviderType, OAuthFlowMode>> = {};\n private initialized = false;\n private captchaEnabled = false;\n private turnstileSiteKey = '';\n\n constructor(publishableKey: string, config?: AuthonConfig) {\n this.publishableKey = publishableKey;\n this.config = {\n apiUrl: config?.apiUrl || 'https://api.authon.dev',\n mode: config?.mode || 'popup',\n theme: config?.theme || 'auto',\n locale: config?.locale || 'en',\n containerId: config?.containerId,\n appearance: config?.appearance,\n };\n this.session = new SessionManager(publishableKey, this.config.apiUrl);\n this.consumeRedirectResultFromUrl();\n }\n\n // ── Public API ──\n\n async getProviders(): Promise<OAuthProviderType[]> {\n await this.ensureInitialized();\n return [...this.providers];\n }\n\n async openSignIn(): Promise<void> {\n await this.ensureInitialized();\n this.getModal().open('signIn');\n }\n\n async openSignUp(): Promise<void> {\n await this.ensureInitialized();\n this.getModal().open('signUp');\n }\n\n /** Update theme at runtime without destroying form state */\n setTheme(theme: 'light' | 'dark' | 'auto'): void {\n this.getModal().setTheme(theme);\n }\n\n async signInWithOAuth(provider: OAuthProviderType, options?: OAuthSignInOptions): Promise<void> {\n await this.ensureInitialized();\n await this.startOAuthFlow(provider, options);\n }\n\n async signInWithEmail(email: string, password: string, turnstileToken?: string): Promise<AuthonUser> {\n const body: Record<string, string> = { email, password };\n if (turnstileToken) body.turnstileToken = turnstileToken;\n const res = await this.apiPost<AuthTokens & { mfaRequired?: boolean; mfaToken?: string }>(\n '/v1/auth/signin',\n body,\n );\n if (res.mfaRequired && res.mfaToken) {\n this.emit('mfaRequired', res.mfaToken);\n throw new AuthonMfaRequiredError(res.mfaToken);\n }\n this.session.setSession(res);\n this.emit('signedIn', res.user);\n return res.user;\n }\n\n async signUpWithEmail(\n email: string,\n password: string,\n meta?: { displayName?: string; turnstileToken?: string },\n ): Promise<AuthonUser> {\n const tokens = await this.apiPost<AuthTokens>('/v1/auth/signup', {\n email,\n password,\n ...meta,\n });\n this.session.setSession(tokens);\n this.emit('signedIn', tokens.user);\n return tokens.user;\n }\n\n async signOut(): Promise<void> {\n await this.session.signOut();\n this.emit('signedOut');\n }\n\n getUser(): AuthonUser | null {\n return this.session.getUser();\n }\n\n getToken(): string | null {\n return this.session.getToken();\n }\n\n on<K extends AuthonEventType>(event: K, listener: AuthonEvents[K]): () => void {\n if (!this.listeners.has(event)) this.listeners.set(event, new Set());\n const set = this.listeners.get(event)!;\n set.add(listener as (...args: unknown[]) => void);\n return () => set.delete(listener as (...args: unknown[]) => void);\n }\n\n // ── MFA ──\n\n async setupMfa(): Promise<MfaSetupResponse & { qrCodeSvg: string }> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to setup MFA');\n const res = await this.apiPostAuth<MfaSetupResponse>('/v1/auth/mfa/totp/setup', undefined, token);\n return { ...res, qrCodeSvg: generateQrSvg(res.qrCodeUri) };\n }\n\n async verifyMfaSetup(code: string): Promise<void> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to verify MFA setup');\n await this.apiPostAuth<{ success: boolean }>('/v1/auth/mfa/totp/verify-setup', { code }, token);\n }\n\n async verifyMfa(mfaToken: string, code: string): Promise<AuthonUser> {\n const res = await this.apiPost<AuthTokens>('/v1/auth/mfa/verify', { mfaToken, code });\n this.session.setSession(res);\n this.emit('signedIn', res.user);\n return res.user;\n }\n\n async disableMfa(code: string): Promise<void> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to disable MFA');\n await this.apiPostAuth<{ success: boolean }>('/v1/auth/mfa/disable', { code }, token);\n }\n\n async getMfaStatus(): Promise<MfaStatus> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to get MFA status');\n const res = await fetch(`${this.config.apiUrl}/v1/auth/mfa/status`, {\n headers: {\n 'x-api-key': this.publishableKey,\n Authorization: `Bearer ${token}`,\n },\n credentials: 'include',\n });\n if (!res.ok) throw new Error(await this.parseApiError(res, '/v1/auth/mfa/status'));\n return res.json();\n }\n\n async regenerateBackupCodes(code: string): Promise<string[]> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to regenerate backup codes');\n const res = await this.apiPostAuth<{ backupCodes: string[] }>(\n '/v1/auth/mfa/backup-codes/regenerate',\n { code },\n token,\n );\n return res.backupCodes;\n }\n\n // ── Passwordless ──\n\n async sendMagicLink(email: string): Promise<void> {\n await this.apiPost<{ message: string }>('/v1/auth/passwordless/magic-link', { email });\n }\n\n async sendEmailOtp(email: string): Promise<void> {\n await this.apiPost<{ message: string }>('/v1/auth/passwordless/email-otp', { email });\n }\n\n async verifyPasswordless(options: {\n token?: string;\n email?: string;\n code?: string;\n }): Promise<AuthonUser> {\n const res = await this.apiPost<AuthTokens>('/v1/auth/passwordless/verify', options);\n this.session.setSession(res);\n this.emit('signedIn', res.user);\n return res.user;\n }\n\n // ── Passkeys ──\n\n async registerPasskey(name?: string): Promise<PasskeyCredential> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to register a passkey');\n\n const options = await this.apiPostAuth<{ options: Record<string, unknown> }>(\n '/v1/auth/passkeys/register/options',\n name ? { name } : undefined,\n token,\n );\n\n const credential = await navigator.credentials.create({\n publicKey: this.deserializeCreationOptions(options.options),\n }) as PublicKeyCredential;\n\n const attestation = credential.response as AuthenticatorAttestationResponse;\n const result = await this.apiPostAuth<PasskeyCredential>(\n '/v1/auth/passkeys/register/verify',\n {\n id: credential.id,\n rawId: this.bufferToBase64url(credential.rawId),\n type: credential.type,\n response: {\n attestationObject: this.bufferToBase64url(attestation.attestationObject),\n clientDataJSON: this.bufferToBase64url(attestation.clientDataJSON),\n },\n },\n token,\n );\n\n this.emit('passkeyRegistered', result);\n return result;\n }\n\n async authenticateWithPasskey(email?: string): Promise<AuthonUser> {\n const options = await this.apiPost<{ options: Record<string, unknown> }>(\n '/v1/auth/passkeys/authenticate/options',\n email ? { email } : undefined,\n );\n\n const credential = await navigator.credentials.get({\n publicKey: this.deserializeRequestOptions(options.options),\n }) as PublicKeyCredential;\n\n const assertion = credential.response as AuthenticatorAssertionResponse;\n const res = await this.apiPost<AuthTokens>('/v1/auth/passkeys/authenticate/verify', {\n id: credential.id,\n rawId: this.bufferToBase64url(credential.rawId),\n type: credential.type,\n response: {\n authenticatorData: this.bufferToBase64url(assertion.authenticatorData),\n clientDataJSON: this.bufferToBase64url(assertion.clientDataJSON),\n signature: this.bufferToBase64url(assertion.signature),\n userHandle: assertion.userHandle ? this.bufferToBase64url(assertion.userHandle) : undefined,\n },\n });\n\n this.session.setSession(res);\n this.emit('signedIn', res.user);\n return res.user;\n }\n\n async listPasskeys(): Promise<PasskeyCredential[]> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to list passkeys');\n return this.apiGetAuth<PasskeyCredential[]>('/v1/auth/passkeys', token);\n }\n\n async renamePasskey(passkeyId: string, name: string): Promise<PasskeyCredential> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to rename a passkey');\n return this.apiPatchAuth<PasskeyCredential>(`/v1/auth/passkeys/${passkeyId}`, { name }, token);\n }\n\n async revokePasskey(passkeyId: string): Promise<void> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to revoke a passkey');\n await this.apiDeleteAuth(`/v1/auth/passkeys/${passkeyId}`, token);\n }\n\n // ── Web3 ──\n\n async web3GetNonce(\n address: string,\n chain: Web3Chain,\n walletType: Web3WalletType,\n chainId?: number,\n ): Promise<Web3NonceResponse> {\n return this.apiPost<Web3NonceResponse>('/v1/auth/web3/nonce', {\n address,\n chain,\n walletType,\n ...(chainId != null ? { chainId } : {}),\n });\n }\n\n async web3Verify(\n message: string,\n signature: string,\n address: string,\n chain: Web3Chain,\n walletType: Web3WalletType,\n ): Promise<AuthonUser> {\n const res = await this.apiPost<AuthTokens>('/v1/auth/web3/verify', {\n message,\n signature,\n address,\n chain,\n walletType,\n });\n this.session.setSession(res);\n this.emit('signedIn', res.user);\n return res.user;\n }\n\n async listWallets(): Promise<Web3Wallet[]> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to list wallets');\n return this.apiGetAuth<Web3Wallet[]>('/v1/auth/web3/wallets', token);\n }\n\n async linkWallet(params: {\n address: string;\n chain: Web3Chain;\n walletType: Web3WalletType;\n chainId?: number;\n message: string;\n signature: string;\n }): Promise<Web3Wallet> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to link a wallet');\n const wallet = await this.apiPostAuth<Web3Wallet>('/v1/auth/web3/wallets/link', params, token);\n this.emit('web3Connected', wallet);\n return wallet;\n }\n\n async unlinkWallet(walletId: string): Promise<void> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to unlink a wallet');\n await this.apiDeleteAuth(`/v1/auth/web3/wallets/${walletId}`, token);\n }\n\n // ── User Profile ──\n\n async updateProfile(data: {\n displayName?: string;\n avatarUrl?: string;\n phone?: string;\n publicMetadata?: Record<string, unknown>;\n }): Promise<AuthonUser> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to update profile');\n const user = await this.apiPatchAuth<AuthonUser>('/v1/auth/me', data, token);\n this.session.updateUser(user);\n return user;\n }\n\n // ── Session Management ──\n\n async listSessions(): Promise<SessionInfo[]> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to list sessions');\n return this.apiGetAuth<SessionInfo[]>('/v1/auth/me/sessions', token);\n }\n\n async revokeSession(sessionId: string): Promise<void> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to revoke a session');\n await this.apiDeleteAuth(`/v1/auth/me/sessions/${sessionId}`, token);\n }\n\n // ── Organizations ──\n\n organizations = {\n list: async (): Promise<OrganizationListResponse> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to list organizations');\n return this.apiGetAuth<OrganizationListResponse>('/v1/auth/organizations', token);\n },\n\n create: async (params: CreateOrganizationParams): Promise<AuthonOrganization> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to create an organization');\n return this.apiPostAuth<AuthonOrganization>('/v1/auth/organizations', params, token);\n },\n\n get: async (orgId: string): Promise<AuthonOrganization> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to get organization');\n return this.apiGetAuth<AuthonOrganization>(`/v1/auth/organizations/${orgId}`, token);\n },\n\n update: async (orgId: string, params: UpdateOrganizationParams): Promise<AuthonOrganization> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to update organization');\n return this.apiPatchAuth<AuthonOrganization>(`/v1/auth/organizations/${orgId}`, params, token);\n },\n\n delete: async (orgId: string): Promise<void> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to delete organization');\n await this.apiDeleteAuth(`/v1/auth/organizations/${orgId}`, token);\n },\n\n getMembers: async (orgId: string): Promise<OrganizationMember[]> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to get organization members');\n return this.apiGetAuth<OrganizationMember[]>(`/v1/auth/organizations/${orgId}/members`, token);\n },\n\n invite: async (orgId: string, params: InviteMemberParams): Promise<OrganizationInvitation> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to invite a member');\n return this.apiPostAuth<OrganizationInvitation>(`/v1/auth/organizations/${orgId}/invitations`, params, token);\n },\n\n getInvitations: async (orgId: string): Promise<OrganizationInvitation[]> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to get invitations');\n return this.apiGetAuth<OrganizationInvitation[]>(`/v1/auth/organizations/${orgId}/invitations`, token);\n },\n\n acceptInvitation: async (token: string): Promise<OrganizationMember> => {\n const authToken = this.session.getToken();\n if (!authToken) throw new Error('Must be signed in to accept an invitation');\n return this.apiPostAuth<OrganizationMember>(`/v1/auth/organizations/invitations/${token}/accept`, undefined, authToken);\n },\n\n rejectInvitation: async (token: string): Promise<void> => {\n const authToken = this.session.getToken();\n if (!authToken) throw new Error('Must be signed in to reject an invitation');\n await this.apiPostAuth<void>(`/v1/auth/organizations/invitations/${token}/reject`, undefined, authToken);\n },\n\n removeMember: async (orgId: string, memberId: string): Promise<void> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to remove a member');\n await this.apiDeleteAuth(`/v1/auth/organizations/${orgId}/members/${memberId}`, token);\n },\n\n updateMemberRole: async (orgId: string, memberId: string, role: string): Promise<OrganizationMember> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to update member role');\n return this.apiPatchAuth<OrganizationMember>(`/v1/auth/organizations/${orgId}/members/${memberId}`, { role }, token);\n },\n\n leave: async (orgId: string): Promise<void> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to leave organization');\n await this.apiPostAuth<void>(`/v1/auth/organizations/${orgId}/leave`, undefined, token);\n },\n };\n\n /** Testing utilities — only available when initialized with a pk_test_ key */\n get testing(): { signIn(params: { email: string; nickname?: string }): Promise<AuthonUser> } | undefined {\n if (!this.publishableKey.startsWith('pk_test_')) return undefined;\n return {\n signIn: async (params: { email: string; nickname?: string }): Promise<AuthonUser> => {\n const res = await this.apiPost<AuthTokens>('/v1/auth/testing/token', params);\n this.session.setSession(res);\n this.emit('signedIn', res.user);\n return res.user;\n },\n };\n }\n\n destroy(): void {\n this.modal?.close();\n this.session.destroy();\n this.listeners.clear();\n }\n\n // ── Internal ──\n\n private loadTurnstileScript(): void {\n if (typeof document === 'undefined') return;\n if (document.querySelector('script[src*=\"challenges.cloudflare.com/turnstile\"]')) return;\n const script = document.createElement('script');\n script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit';\n script.async = true;\n document.head.appendChild(script);\n }\n\n private emit(event: string, ...args: unknown[]): void {\n this.listeners.get(event)?.forEach((fn) => fn(...args));\n }\n\n private async ensureInitialized(): Promise<void> {\n if (this.initialized) return;\n try {\n const [branding, providersRes] = await Promise.all([\n this.apiGet<BrandingConfig>('/v1/auth/branding'),\n this.apiGet<ProvidersResponse>('/v1/auth/providers'),\n ]);\n this.branding = { ...branding, ...this.config.appearance };\n this.captchaEnabled = !!(branding as any).captchaEnabled;\n this.turnstileSiteKey = (branding as any).turnstileSiteKey || '';\n if (this.captchaEnabled && this.turnstileSiteKey) {\n this.loadTurnstileScript();\n }\n this.providers = providersRes.providers;\n this.providerFlowModes = {};\n for (const provider of this.providers) {\n this.providerFlowModes[provider] = this.normalizeFlowMode(\n providersRes.providerConfigs?.[provider]?.oauthFlow,\n );\n }\n this.initialized = true;\n } catch (err) {\n this.emit('error', err instanceof Error ? err : new Error(String(err)));\n throw err;\n }\n }\n\n private getModal(): ModalRenderer {\n if (!this.modal) {\n this.modal = new ModalRenderer({\n mode: this.config.mode,\n theme: this.config.theme,\n containerId: this.config.containerId,\n branding: this.branding || undefined,\n captchaSiteKey: this.captchaEnabled ? this.turnstileSiteKey : undefined,\n onProviderClick: (provider) => this.startOAuthFlow(provider),\n onEmailSubmit: (email, password, isSignUp) => {\n this.modal?.clearError();\n const turnstileToken = this.modal?.getTurnstileToken?.() || undefined;\n const promise = isSignUp\n ? this.signUpWithEmail(email, password, { turnstileToken })\n : this.signInWithEmail(email, password, turnstileToken);\n promise\n .then(() => this.modal?.close())\n .catch((err) => {\n this.modal?.resetTurnstile?.();\n const msg = err instanceof Error ? err.message : String(err);\n this.modal?.showError(msg || 'Authentication failed');\n this.emit('error', err instanceof Error ? err : new Error(msg));\n });\n },\n onClose: () => this.modal?.close(),\n onWeb3WalletSelect: async (walletId: string) => {\n const chain = walletId === 'phantom' ? 'solana' as const : 'evm' as const;\n try {\n this.modal?.showOverlay?.('web3-connecting');\n const address = await this.getWalletAddress(walletId);\n const { message } = await this.web3GetNonce(address, chain, walletId as any);\n const signature = await this.requestWalletSignature(walletId, message);\n await this.web3Verify(message, signature, address, chain, walletId as any);\n this.modal?.showWeb3Success(walletId, address);\n setTimeout(() => this.modal?.close(), 2500);\n } catch (err) {\n this.modal?.showOverlayError(err instanceof Error ? err.message : String(err));\n }\n },\n onPasswordlessSubmit: async (email: string) => {\n try {\n const method = this.branding?.passwordlessMethod ?? 'magic_link';\n if (method === 'email_otp' || method === 'both') {\n await this.sendEmailOtp(email);\n this.modal?.showOtpInput(email);\n } else {\n await this.sendMagicLink(email);\n this.modal?.showPasswordlessSent();\n }\n } catch (err) {\n this.modal?.showOverlayError(err instanceof Error ? err.message : String(err));\n }\n },\n onOtpVerify: async (email: string, code: string) => {\n try {\n await this.verifyPasswordless({ email, code });\n this.modal?.close();\n } catch (err) {\n this.modal?.showOverlayError(err instanceof Error ? err.message : String(err));\n }\n },\n onPasskeyClick: async () => {\n try {\n this.modal?.showOverlay?.('passkey-verifying');\n await this.authenticateWithPasskey();\n this.modal?.showPasskeySuccess();\n setTimeout(() => this.modal?.close(), 2500);\n } catch (err) {\n this.modal?.showOverlayError(err instanceof Error ? err.message : String(err));\n }\n },\n });\n }\n if (this.branding) this.modal.setBranding(this.branding);\n this.modal.setProviders(this.providers);\n return this.modal;\n }\n\n private async startOAuthFlow(provider: OAuthProviderType, options?: OAuthSignInOptions): Promise<void> {\n try {\n const configuredFlow = this.providerFlowModes[provider] ?? 'auto';\n const flowMode = this.normalizeFlowMode(options?.flowMode ?? configuredFlow);\n\n if (flowMode === 'redirect') {\n this.modal?.showLoading();\n await this.startRedirectOAuthFlow(provider);\n return;\n }\n\n const { url, state } = await this.requestOAuthAuthorization(provider, 'popup');\n\n this.modal?.showLoading();\n\n // Open popup\n const width = 500;\n const height = 700;\n const left = window.screenX + (window.outerWidth - width) / 2;\n const top = window.screenY + (window.outerHeight - height) / 2;\n const popup = window.open(\n url,\n 'authon-oauth',\n `width=${width},height=${height},left=${left},top=${top},toolbar=no,menubar=no`,\n );\n\n if (!popup || popup.closed) {\n if (flowMode === 'auto') {\n this.modal?.showBanner('Popup unavailable. Continuing with redirect sign-in…', 'warning');\n await this.startRedirectOAuthFlow(provider);\n return;\n }\n this.modal?.hideLoading();\n this.modal?.showBanner('Pop-up blocked. Please allow pop-ups for this site and try again.', 'warning');\n this.emit('error', new Error('Popup was blocked by the browser'));\n return;\n }\n\n let resolved = false;\n let cleaned = false;\n const storageKey = `authon-oauth-${state}`;\n\n const resolve = (tokens: AuthTokens) => {\n if (resolved) return;\n resolved = true;\n cleanup();\n try { if (popup && !popup.closed) popup.close(); } catch { /* ignore */ }\n try { localStorage.removeItem(storageKey); } catch { /* ignore */ }\n this.session.setSession(tokens);\n this.modal?.close();\n this.emit('signedIn', tokens.user);\n };\n\n const handleError = (msg: string) => {\n if (resolved) return;\n cleanup();\n this.session.clearSession();\n this.modal?.hideLoading();\n this.modal?.showError(msg);\n this.emit('error', new Error(msg));\n };\n\n const pollApi = async () => {\n if (resolved || cleaned) return;\n try {\n const result = await this.apiGet<{ status: string; accessToken?: string; refreshToken?: string; expiresIn?: number; user?: AuthonUser; message?: string }>(\n `/v1/auth/oauth/poll?state=${encodeURIComponent(state)}`,\n );\n if (result.status === 'completed' && result.accessToken) {\n resolve({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken!,\n expiresIn: result.expiresIn!,\n user: result.user!,\n });\n } else if (result.status === 'error') {\n handleError(result.message || 'Authentication failed');\n }\n } catch {\n // Network error — keep polling\n }\n };\n\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n window.removeEventListener('message', messageHandler);\n window.removeEventListener('storage', storageHandler);\n document.removeEventListener('visibilitychange', visibilityHandler);\n if (apiPollTimer) clearInterval(apiPollTimer);\n if (closePollTimer) clearInterval(closePollTimer);\n if (maxTimer) clearTimeout(maxTimer);\n };\n\n // 1. postMessage handler (fast path — Chrome/Firefox desktop)\n const messageHandler = (e: MessageEvent) => {\n if (e.data?.type !== 'authon-oauth-callback') return;\n if (e.data.tokens) {\n resolve(e.data.tokens as AuthTokens);\n }\n };\n window.addEventListener('message', messageHandler);\n\n // 2. localStorage handler (mobile fallback — cross-tab communication)\n const storageHandler = (e: StorageEvent) => {\n if (e.key !== storageKey || !e.newValue) return;\n try {\n const data = JSON.parse(e.newValue);\n if (data.tokens) resolve(data.tokens as AuthTokens);\n else if (data.error) handleError(data.error);\n } catch { /* ignore */ }\n };\n window.addEventListener('storage', storageHandler);\n\n // Also check localStorage immediately in case it was set before listener\n try {\n const existing = localStorage.getItem(storageKey);\n if (existing) {\n const data = JSON.parse(existing);\n if (data.tokens) { resolve(data.tokens as AuthTokens); return; }\n }\n } catch { /* ignore */ }\n\n // 3. API polling (fallback for all browsers)\n const apiPollTimer = setInterval(pollApi, 1500);\n\n // 4. visibilitychange — poll immediately when tab regains focus (mobile)\n const visibilityHandler = () => {\n if (document.visibilityState === 'visible' && !resolved && !cleaned) {\n pollApi();\n }\n };\n document.addEventListener('visibilitychange', visibilityHandler);\n\n // 5. Popup close detection\n const closePollTimer = setInterval(() => {\n if (resolved || cleaned) return;\n try {\n if (popup && popup.closed) {\n clearInterval(closePollTimer);\n // Poll immediately + give a few more seconds\n pollApi();\n setTimeout(() => {\n if (resolved || cleaned) return;\n pollApi().then(() => {\n if (resolved || cleaned) return;\n cleanup();\n this.modal?.hideLoading();\n });\n }, 3000);\n }\n } catch {\n // Cross-origin access error — popup still open\n }\n }, 500);\n\n // 6. Max timeout (3 minutes)\n const maxTimer = setTimeout(() => {\n if (resolved || cleaned) return;\n cleanup();\n this.modal?.hideLoading();\n }, 180_000);\n } catch (err) {\n this.modal?.hideLoading();\n this.emit('error', err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n private normalizeFlowMode(mode: unknown): OAuthFlowMode {\n if (mode === 'popup' || mode === 'redirect' || mode === 'auto') {\n return mode;\n }\n return 'auto';\n }\n\n private async requestOAuthAuthorization(\n provider: OAuthProviderType,\n flowMode: 'popup' | 'redirect',\n returnTo?: string,\n ): Promise<{ url: string; state: string; flowMode?: 'popup' | 'redirect' }> {\n const redirectUri = `${this.config.apiUrl}/v1/auth/oauth/redirect`;\n const params = new URLSearchParams({\n redirectUri,\n flow: flowMode,\n });\n\n if (returnTo) {\n params.set('returnTo', returnTo);\n }\n\n return this.apiGet<{ url: string; state: string; flowMode?: 'popup' | 'redirect' }>(\n `/v1/auth/oauth/${provider}/url?${params.toString()}`,\n );\n }\n\n private async startRedirectOAuthFlow(provider: OAuthProviderType): Promise<void> {\n const { url } = await this.requestOAuthAuthorization(\n provider,\n 'redirect',\n window.location.href,\n );\n window.location.assign(url);\n }\n\n private consumeRedirectResultFromUrl(): void {\n if (typeof window === 'undefined') return;\n\n let currentUrl: URL;\n try {\n currentUrl = new URL(window.location.href);\n } catch {\n return;\n }\n\n const state = currentUrl.searchParams.get('authon_oauth_state');\n const explicitError = currentUrl.searchParams.get('authon_oauth_error');\n if (!state && !explicitError) return;\n\n let consumed = false;\n\n if (state) {\n try {\n const storageKey = `authon-oauth-${state}`;\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n const data = JSON.parse(stored) as { tokens?: AuthTokens; error?: string };\n if (data.tokens) {\n this.session.setSession(data.tokens);\n this.emit('signedIn', data.tokens.user);\n consumed = true;\n } else if (data.error) {\n this.emit('error', new Error(data.error));\n consumed = true;\n }\n localStorage.removeItem(storageKey);\n }\n } catch {\n // Ignore storage parsing failures\n }\n }\n\n if (!consumed && explicitError) {\n this.emit('error', new Error(explicitError));\n }\n\n currentUrl.searchParams.delete('authon_oauth_state');\n currentUrl.searchParams.delete('authon_oauth_error');\n window.history.replaceState({}, '', currentUrl.toString());\n }\n\n private async apiGet<T>(path: string): Promise<T> {\n const res = await fetch(`${this.config.apiUrl}${path}`, {\n headers: { 'x-api-key': this.publishableKey },\n credentials: 'include',\n });\n if (!res.ok) throw new Error(await this.parseApiError(res, path));\n return res.json();\n }\n\n private async apiPost<T>(path: string, body?: unknown): Promise<T> {\n const res = await fetch(`${this.config.apiUrl}${path}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.publishableKey,\n },\n credentials: 'include',\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!res.ok) throw new Error(await this.parseApiError(res, path));\n return res.json();\n }\n\n private async apiPostAuth<T>(path: string, body: unknown, token: string): Promise<T> {\n const res = await fetch(`${this.config.apiUrl}${path}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.publishableKey,\n Authorization: `Bearer ${token}`,\n },\n credentials: 'include',\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!res.ok) throw new Error(await this.parseApiError(res, path));\n return res.json();\n }\n\n private async apiGetAuth<T>(path: string, token: string): Promise<T> {\n const res = await fetch(`${this.config.apiUrl}${path}`, {\n headers: {\n 'x-api-key': this.publishableKey,\n Authorization: `Bearer ${token}`,\n },\n credentials: 'include',\n });\n if (!res.ok) throw new Error(await this.parseApiError(res, path));\n return res.json();\n }\n\n private async apiPatchAuth<T>(path: string, body: unknown, token: string): Promise<T> {\n const res = await fetch(`${this.config.apiUrl}${path}`, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.publishableKey,\n Authorization: `Bearer ${token}`,\n },\n credentials: 'include',\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!res.ok) throw new Error(await this.parseApiError(res, path));\n return res.json();\n }\n\n private async apiDeleteAuth(path: string, token: string): Promise<void> {\n const res = await fetch(`${this.config.apiUrl}${path}`, {\n method: 'DELETE',\n headers: {\n 'x-api-key': this.publishableKey,\n Authorization: `Bearer ${token}`,\n },\n credentials: 'include',\n });\n if (!res.ok) throw new Error(await this.parseApiError(res, path));\n }\n\n // ── Wallet helpers ──\n\n private async getWalletAddress(walletId: string): Promise<string> {\n if (walletId === 'phantom') {\n const provider = (window as any).solana;\n if (!provider?.isPhantom) throw new Error('Phantom wallet not detected. Please install it from phantom.app');\n const resp = await provider.connect();\n return resp.publicKey.toString();\n }\n // EVM wallets (MetaMask, Pexus, etc.)\n const provider = (window as any).ethereum;\n if (!provider) throw new Error(`${walletId} wallet not detected. Please install it.`);\n const accounts: string[] = await provider.request({ method: 'eth_requestAccounts' });\n return accounts[0];\n }\n\n private async requestWalletSignature(walletId: string, message: string): Promise<string> {\n if (walletId === 'phantom') {\n const provider = (window as any).solana;\n const encoded = new TextEncoder().encode(message);\n const signed = await provider.signMessage(encoded, 'utf8');\n return Array.from(new Uint8Array(signed.signature))\n .map((b: number) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n // EVM wallets\n const provider = (window as any).ethereum;\n const accounts: string[] = await provider.request({ method: 'eth_requestAccounts' });\n return provider.request({ method: 'personal_sign', params: [message, accounts[0]] });\n }\n\n // ── WebAuthn helpers ──\n\n private bufferToBase64url(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n }\n\n private base64urlToBuffer(base64url: string): ArrayBuffer {\n const base64 = base64url.replace(/-/g, '+').replace(/_/g, '/');\n const padded = base64 + '='.repeat((4 - (base64.length % 4)) % 4);\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.buffer;\n }\n\n private deserializeCreationOptions(\n options: Record<string, unknown>,\n ): PublicKeyCredentialCreationOptions {\n const opts = { ...options } as Record<string, unknown>;\n if (typeof opts.challenge === 'string') {\n opts.challenge = this.base64urlToBuffer(opts.challenge);\n }\n if (opts.user && typeof (opts.user as Record<string, unknown>).id === 'string') {\n (opts.user as Record<string, unknown>).id = this.base64urlToBuffer(\n (opts.user as Record<string, unknown>).id as string,\n );\n }\n if (Array.isArray(opts.excludeCredentials)) {\n opts.excludeCredentials = (opts.excludeCredentials as Record<string, unknown>[]).map((c) => ({\n ...c,\n id: typeof c.id === 'string' ? this.base64urlToBuffer(c.id) : c.id,\n }));\n }\n return opts as unknown as PublicKeyCredentialCreationOptions;\n }\n\n private deserializeRequestOptions(\n options: Record<string, unknown>,\n ): PublicKeyCredentialRequestOptions {\n const opts = { ...options } as Record<string, unknown>;\n if (typeof opts.challenge === 'string') {\n opts.challenge = this.base64urlToBuffer(opts.challenge);\n }\n if (Array.isArray(opts.allowCredentials)) {\n opts.allowCredentials = (opts.allowCredentials as Record<string, unknown>[]).map((c) => ({\n ...c,\n id: typeof c.id === 'string' ? this.base64urlToBuffer(c.id) : c.id,\n }));\n }\n return opts as unknown as PublicKeyCredentialRequestOptions;\n }\n\n private async parseApiError(res: Response, path: string): Promise<string> {\n try {\n const body = await res.json();\n if (Array.isArray(body.message) && body.message.length > 0) {\n return body.message[0];\n }\n if (typeof body.message === 'string' && body.message !== 'Bad Request') {\n return body.message;\n }\n } catch { /* ignore */ }\n return `API ${path}: ${res.status}`;\n }\n}\n"],"mappings":"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","names":["provider"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../../shared/src/index.ts","../src/providers.ts","../src/modal.ts","../src/session.ts","../src/qrcode.ts","../src/authon.ts"],"sourcesContent":["import type { AuthonUser, BrandingConfig, PasskeyCredential, Web3Wallet } from '@authon/shared';\n\nexport type OAuthFlowMode = 'auto' | 'popup' | 'redirect';\n\nexport interface AuthonConfig {\n apiUrl?: string;\n mode?: 'popup' | 'embedded';\n containerId?: string;\n theme?: 'light' | 'dark' | 'auto';\n locale?: string;\n appearance?: Partial<BrandingConfig>;\n}\n\nexport interface OAuthSignInOptions {\n flowMode?: OAuthFlowMode;\n}\n\nexport interface AuthonEvents {\n signedIn: (user: AuthonUser) => void;\n signedOut: () => void;\n tokenRefreshed: (token: string) => void;\n mfaRequired: (mfaToken: string) => void;\n passkeyRegistered: (credential: PasskeyCredential) => void;\n web3Connected: (wallet: Web3Wallet) => void;\n error: (error: Error) => void;\n}\n\nexport type AuthonEventType = keyof AuthonEvents;\n\nexport class AuthonMfaRequiredError extends Error {\n readonly mfaToken: string;\n constructor(mfaToken: string) {\n super('MFA verification required');\n this.name = 'AuthonMfaRequiredError';\n this.mfaToken = mfaToken;\n }\n}\n","// ── Types ──\n\nexport interface AuthonUser {\n id: string;\n projectId: string;\n email: string | null;\n displayName: string | null;\n avatarUrl: string | null;\n phone: string | null;\n emailVerified: boolean;\n phoneVerified: boolean;\n isBanned: boolean;\n publicMetadata: Record<string, unknown> | null;\n lastSignInAt: string | null;\n signInCount: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface AuthonSession {\n id: string;\n userId: string;\n ipAddress: string | null;\n userAgent: string | null;\n deviceName: string | null;\n lastActiveAt: string | null;\n createdAt: string;\n expiresAt: string;\n}\n\nexport interface AuthonProvider {\n provider: string;\n enabled: boolean;\n sortOrder: number;\n configured: boolean;\n}\n\nexport interface BrandingConfig {\n logoDataUrl?: string;\n brandName?: string;\n primaryColorStart?: string;\n primaryColorEnd?: string;\n lightBg?: string;\n lightText?: string;\n darkBg?: string;\n darkText?: string;\n borderRadius?: number;\n providerOrder?: string[];\n hiddenProviders?: string[];\n showEmailPassword?: boolean;\n showDivider?: boolean;\n termsUrl?: string;\n privacyUrl?: string;\n customCss?: string;\n locale?: string;\n showSecuredBy?: boolean;\n showWeb3?: boolean;\n showPasswordless?: boolean;\n showPasskey?: boolean;\n passwordlessMethod?: 'magic_link' | 'email_otp' | 'both';\n}\n\nexport interface SessionConfig {\n accessTokenTtl?: number;\n refreshTokenTtl?: number;\n maxSessions?: number;\n singleSession?: boolean;\n}\n\nexport interface AuthTokens {\n accessToken: string;\n refreshToken: string;\n expiresIn: number;\n user: AuthonUser;\n}\n\nexport interface WebhookEvent {\n id: string;\n type: string;\n projectId: string;\n timestamp: string;\n data: Record<string, unknown>;\n}\n\n// ── MFA Types ──\n\nexport interface MfaSetupResponse {\n secret: string;\n qrCodeUri: string;\n backupCodes: string[];\n}\n\nexport interface MfaStatus {\n enabled: boolean;\n backupCodesRemaining: number;\n}\n\nexport interface MfaVerifyResponse {\n accessToken: string;\n refreshToken: string;\n expiresIn: number;\n user: AuthonUser;\n}\n\n// ── Passwordless Types ──\n\nexport interface PasswordlessResult {\n message: string;\n}\n\n// ── Passkey Types ──\n\nexport interface PasskeyCredential {\n id: string;\n name: string | null;\n createdAt: string;\n lastUsedAt: string | null;\n}\n\n// ── Web3 Types ──\n\nexport type Web3Chain = 'evm' | 'solana';\nexport type Web3WalletType =\n | 'metamask'\n | 'pexus'\n | 'walletconnect'\n | 'coinbase'\n | 'phantom'\n | 'trust'\n | 'other';\n\nexport interface Web3Wallet {\n id: string;\n address: string;\n chain: Web3Chain;\n walletType: Web3WalletType;\n chainId: number | null;\n createdAt: string;\n}\n\nexport interface Web3NonceResponse {\n message: string;\n nonce: string;\n}\n\n// ── Session Types ──\n\nexport interface SessionInfo {\n id: string;\n ipAddress: string | null;\n userAgent: string | null;\n createdAt: string;\n lastActiveAt: string | null;\n}\n\n// ── Organization Types ──\n\nexport interface AuthonOrganization {\n id: string;\n projectId: string;\n name: string;\n slug: string;\n logoUrl: string | null;\n metadata: Record<string, any> | null;\n maxMembers: number;\n createdBy: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface OrganizationMember {\n id: string;\n organizationId: string;\n userId: string;\n role: 'owner' | 'admin' | 'member';\n joinedAt: string;\n createdAt: string;\n}\n\nexport interface OrganizationInvitation {\n id: string;\n organizationId: string;\n email: string;\n role: string;\n status: 'pending' | 'accepted' | 'rejected' | 'expired';\n invitedBy: string;\n expiresAt: string;\n createdAt: string;\n}\n\nexport interface CreateOrganizationParams {\n name: string;\n slug?: string;\n logoUrl?: string;\n metadata?: Record<string, any>;\n maxMembers?: number;\n}\n\nexport interface UpdateOrganizationParams {\n name?: string;\n slug?: string;\n logoUrl?: string;\n metadata?: Record<string, any>;\n maxMembers?: number;\n}\n\nexport interface InviteMemberParams {\n email: string;\n role?: 'admin' | 'member';\n}\n\nexport interface OrganizationListResponse {\n data: AuthonOrganization[];\n total: number;\n page: number;\n limit: number;\n}\n\n// ── Audit Log Types ──\n\nexport interface AuditLogEntry {\n id: string;\n projectId: string;\n actorType: 'user' | 'admin' | 'system' | 'api_key';\n actorId: string | null;\n event: string;\n targetType: string | null;\n targetId: string | null;\n metadata: Record<string, any> | null;\n ipAddress: string | null;\n userAgent: string | null;\n createdAt: string;\n}\n\nexport interface AuditLogQueryParams {\n event?: string;\n actorId?: string;\n targetId?: string;\n dateFrom?: string;\n dateTo?: string;\n page?: number;\n limit?: number;\n}\n\nexport interface AuditLogListResponse {\n data: AuditLogEntry[];\n total: number;\n page: number;\n limit: number;\n}\n\nexport interface AuditLogStats {\n [eventType: string]: number;\n}\n\n// ── JWT Template Types ──\n\nexport interface JwtClaimMapping {\n key: string;\n source?: string;\n value?: string;\n}\n\nexport interface JwtTemplate {\n id: string;\n projectId: string;\n name: string;\n isDefault: boolean;\n claims: JwtClaimMapping[];\n allowedLifetime: number | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateJwtTemplateParams {\n name: string;\n claims: JwtClaimMapping[];\n allowedLifetime?: number;\n}\n\nexport interface UpdateJwtTemplateParams {\n name?: string;\n claims?: JwtClaimMapping[];\n allowedLifetime?: number | null;\n}\n\nexport interface JwtPreviewResponse {\n token: string;\n decoded: Record<string, any>;\n}\n\n// ── Constants ──\n\nexport const OAUTH_PROVIDERS = [\n 'google',\n 'apple',\n 'kakao',\n 'naver',\n 'facebook',\n 'github',\n 'discord',\n 'x',\n 'line',\n 'microsoft',\n] as const;\n\nexport type OAuthProviderType = (typeof OAUTH_PROVIDERS)[number];\n\nexport const PROVIDER_DISPLAY_NAMES: Record<OAuthProviderType, string> = {\n google: 'Google',\n apple: 'Apple',\n kakao: 'Kakao',\n naver: 'Naver',\n facebook: 'Facebook',\n github: 'GitHub',\n discord: 'Discord',\n x: 'X',\n line: 'LINE',\n microsoft: 'Microsoft',\n};\n\nexport const PROVIDER_COLORS: Record<OAuthProviderType, { bg: string; text: string }> = {\n google: { bg: '#ffffff', text: '#1f1f1f' },\n apple: { bg: '#000000', text: '#ffffff' },\n kakao: { bg: '#FEE500', text: '#191919' },\n naver: { bg: '#03C75A', text: '#ffffff' },\n facebook: { bg: '#1877F2', text: '#ffffff' },\n github: { bg: '#24292e', text: '#ffffff' },\n discord: { bg: '#5865F2', text: '#ffffff' },\n x: { bg: '#000000', text: '#ffffff' },\n line: { bg: '#06C755', text: '#ffffff' },\n microsoft: { bg: '#ffffff', text: '#1f1f1f' },\n};\n\nexport const WEBHOOK_EVENTS = [\n 'user.created',\n 'user.updated',\n 'user.deleted',\n 'user.banned',\n 'user.unbanned',\n 'session.created',\n 'session.ended',\n 'session.revoked',\n 'provider.linked',\n 'provider.unlinked',\n] as const;\n\nexport type WebhookEventType = (typeof WEBHOOK_EVENTS)[number];\n\nexport const API_KEY_PREFIXES = {\n PUBLISHABLE_LIVE: 'pk_live_',\n PUBLISHABLE_TEST: 'pk_test_',\n SECRET_LIVE: 'sk_live_',\n SECRET_TEST: 'sk_test_',\n} as const;\n\nexport const DEFAULT_BRANDING: BrandingConfig = {\n primaryColorStart: '#7c3aed',\n primaryColorEnd: '#4f46e5',\n lightBg: '#ffffff',\n lightText: '#111827',\n darkBg: '#0f172a',\n darkText: '#f1f5f9',\n borderRadius: 12,\n showEmailPassword: true,\n showDivider: true,\n showSecuredBy: true,\n locale: 'en',\n};\n\nexport const DEFAULT_SESSION_CONFIG: SessionConfig = {\n accessTokenTtl: 900,\n refreshTokenTtl: 604800,\n maxSessions: 5,\n singleSession: false,\n};\n\nexport const AUDIT_EVENTS = {\n AUTH_SIGNUP: 'auth.signup',\n AUTH_SIGNIN: 'auth.signin',\n AUTH_SIGNIN_FAILED: 'auth.signin.failed',\n AUTH_SIGNOUT: 'auth.signout',\n AUTH_TOKEN_REFRESH: 'auth.token.refresh',\n AUTH_MFA_SETUP: 'auth.mfa.setup',\n AUTH_MFA_VERIFY: 'auth.mfa.verify',\n AUTH_PASSKEY_REGISTER: 'auth.passkey.register',\n AUTH_WEB3_VERIFY: 'auth.web3.verify',\n ADMIN_USER_BANNED: 'admin.user.banned',\n ADMIN_USER_UNBANNED: 'admin.user.unbanned',\n ADMIN_USER_DELETED: 'admin.user.deleted',\n ORG_CREATED: 'org.created',\n ORG_DELETED: 'org.deleted',\n ORG_MEMBER_ADDED: 'org.member.added',\n ORG_MEMBER_REMOVED: 'org.member.removed',\n ORG_MEMBER_ROLE_CHANGED: 'org.member.role_changed',\n ORG_INVITATION_SENT: 'org.invitation.sent',\n ORG_INVITATION_ACCEPTED: 'org.invitation.accepted',\n} as const;\n","import { PROVIDER_COLORS, PROVIDER_DISPLAY_NAMES, type OAuthProviderType } from '@authon/shared';\n\nexport interface ProviderButtonConfig {\n provider: OAuthProviderType;\n label: string;\n bgColor: string;\n textColor: string;\n iconSvg: string;\n}\n\nconst PROVIDER_ICONS: Record<OAuthProviderType, string> = {\n google: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path fill=\"#4285F4\" d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\"/><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\"/><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\"/><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\"/></svg>`,\n apple: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\"><path d=\"M17.05 20.28c-.98.95-2.05.88-3.08.4-1.09-.5-2.08-.48-3.24 0-1.44.62-2.2.44-3.06-.4C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z\"/></svg>`,\n kakao: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path fill=\"#191919\" d=\"M12 3C6.48 3 2 6.36 2 10.43c0 2.62 1.75 4.93 4.37 6.23l-1.12 4.14c-.1.36.31.65.62.44l4.93-3.26c.39.04.79.06 1.2.06 5.52 0 10-3.36 10-7.61C22 6.36 17.52 3 12 3z\"/></svg>`,\n naver: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path fill=\"#fff\" d=\"M16.273 12.845 7.376 0H0v24h7.726V11.156L16.624 24H24V0h-7.727v12.845Z\"/></svg>`,\n facebook: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path fill=\"#fff\" d=\"M24 12.07C24 5.41 18.63 0 12 0S0 5.4 0 12.07C0 18.1 4.39 23.1 10.13 24v-8.44H7.08v-3.49h3.04V9.41c0-3.02 1.8-4.7 4.54-4.7 1.31 0 2.68.24 2.68.24v2.97h-1.5c-1.5 0-1.96.93-1.96 1.89v2.26h3.33l-.53 3.49h-2.8V24C19.62 23.1 24 18.1 24 12.07z\"/></svg>`,\n github: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"#fff\"><path d=\"M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z\"/></svg>`,\n discord: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"#fff\"><path d=\"M20.32 4.37a19.8 19.8 0 00-4.89-1.52.07.07 0 00-.08.04c-.21.38-.44.87-.61 1.26a18.27 18.27 0 00-5.49 0 12.64 12.64 0 00-.62-1.26.07.07 0 00-.08-.04 19.74 19.74 0 00-4.89 1.52.07.07 0 00-.03.03C1.11 8.39.34 12.28.73 16.12a.08.08 0 00.03.06 19.9 19.9 0 005.99 3.03.08.08 0 00.08-.03c.46-.63.87-1.3 1.22-2a.08.08 0 00-.04-.11 13.1 13.1 0 01-1.87-.9.08.08 0 01-.01-.13c.13-.09.25-.19.37-.29a.07.07 0 01.08-.01c3.93 1.8 8.18 1.8 12.07 0a.07.07 0 01.08 0c.12.1.25.2.37.3a.08.08 0 01-.01.12c-.6.35-1.22.65-1.87.9a.08.08 0 00-.04.1c.36.7.77 1.37 1.22 2a.08.08 0 00.08.03 19.83 19.83 0 006-3.03.08.08 0 00.03-.05c.47-4.87-.78-9.09-3.3-12.84a.06.06 0 00-.03-.03zM8.02 13.62c-1.11 0-2.03-1.02-2.03-2.28 0-1.26.9-2.28 2.03-2.28 1.14 0 2.04 1.03 2.03 2.28 0 1.26-.9 2.28-2.03 2.28zm7.5 0c-1.11 0-2.03-1.02-2.03-2.28 0-1.26.9-2.28 2.03-2.28 1.14 0 2.04 1.03 2.03 2.28 0 1.26-.89 2.28-2.03 2.28z\"/></svg>`,\n x: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"#fff\"><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\"/></svg>`,\n line: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"#fff\"><path d=\"M19.365 9.863c.349 0 .63.285.63.631 0 .345-.281.63-.63.63H17.61v1.125h1.755c.349 0 .63.283.63.63 0 .344-.281.629-.63.629h-2.386c-.345 0-.627-.285-.627-.629V8.108c0-.345.282-.63.63-.63h2.386c.346 0 .627.285.627.63 0 .349-.281.63-.63.63H17.61v1.125h1.755zm-3.855 3.016c0 .27-.174.51-.432.596-.064.021-.133.031-.199.031-.211 0-.391-.09-.51-.25l-2.443-3.317v2.94c0 .344-.279.629-.631.629-.346 0-.626-.285-.626-.629V8.108c0-.27.173-.51.43-.595.06-.023.136-.033.194-.033.195 0 .375.104.495.254l2.462 3.33V8.108c0-.345.282-.63.63-.63.345 0 .63.285.63.63v4.771zm-5.741 0c0 .344-.282.629-.631.629-.345 0-.627-.285-.627-.629V8.108c0-.345.282-.63.63-.63.346 0 .628.285.628.63v4.771zm-2.466.629H4.917c-.345 0-.63-.285-.63-.629V8.108c0-.345.285-.63.63-.63.348 0 .63.285.63.63v4.141h1.756c.348 0 .629.283.629.63 0 .344-.282.629-.629.629M24 10.314C24 4.943 18.615.572 12 .572S0 4.943 0 10.314c0 4.811 4.27 8.842 10.035 9.608.391.082.923.258 1.058.59.12.301.079.766.038 1.08l-.164 1.02c-.045.301-.24 1.186 1.049.645 1.291-.539 6.916-4.078 9.436-6.975C23.176 14.393 24 12.458 24 10.314\"/></svg>`,\n microsoft: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><rect fill=\"#F25022\" x=\"1\" y=\"1\" width=\"10\" height=\"10\"/><rect fill=\"#7FBA00\" x=\"13\" y=\"1\" width=\"10\" height=\"10\"/><rect fill=\"#00A4EF\" x=\"1\" y=\"13\" width=\"10\" height=\"10\"/><rect fill=\"#FFB900\" x=\"13\" y=\"13\" width=\"10\" height=\"10\"/></svg>`,\n};\n\nexport function getProviderButtonConfig(provider: OAuthProviderType): ProviderButtonConfig {\n const colors = PROVIDER_COLORS[provider];\n return {\n provider,\n label: `Continue with ${PROVIDER_DISPLAY_NAMES[provider]}`,\n bgColor: colors.bg,\n textColor: colors.text,\n iconSvg: PROVIDER_ICONS[provider],\n };\n}\n","import type { BrandingConfig, OAuthProviderType } from '@authon/shared';\nimport { DEFAULT_BRANDING } from '@authon/shared';\nimport { getProviderButtonConfig } from './providers';\n\nfunction hexToRgba(hex: string, alpha: number): string {\n const h = hex.replace('#', '');\n const r = parseInt(h.substring(0, 2), 16);\n const g = parseInt(h.substring(2, 4), 16);\n const b = parseInt(h.substring(4, 6), 16);\n return `rgba(${r},${g},${b},${alpha})`;\n}\n\nconst WALLET_OPTIONS = [\n { id: 'pexus', name: 'Pexus', color: '#7c3aed' },\n { id: 'metamask', name: 'MetaMask', color: '#f6851b' },\n { id: 'phantom', name: 'Phantom', color: '#ab9ff2' },\n] as const;\n\nfunction walletIconSvg(id: string): string {\n switch (id) {\n case 'pexus':\n return `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><rect width=\"24\" height=\"24\" rx=\"6\" fill=\"#7c3aed\"/><path d=\"M7 8h4v8H7V8zm6 0h4v8h-4V8z\" fill=\"#fff\"/></svg>`;\n case 'metamask':\n return `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><rect width=\"24\" height=\"24\" rx=\"6\" fill=\"#f6851b\"/><path d=\"M17.2 4L12 8.5l1 .7L17.2 4zM6.8 4l5.1 5.3-1-0.6L6.8 4zM16 16.2l-1.4 2.1 3 .8.8-2.9h-2.4zM5.6 16.2l.9 2.8 3-.8-1.4-2h-2.5z\" fill=\"#fff\"/></svg>`;\n case 'phantom':\n return `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><rect width=\"24\" height=\"24\" rx=\"6\" fill=\"#ab9ff2\"/><circle cx=\"9\" cy=\"11\" r=\"1.5\" fill=\"#fff\"/><circle cx=\"15\" cy=\"11\" r=\"1.5\" fill=\"#fff\"/><path d=\"M6 12c0-3.3 2.7-6 6-6s6 2.7 6 6v2c0 1.1-.9 2-2 2H8c-1.1 0-2-.9-2-2v-2z\" stroke=\"#fff\" stroke-width=\"1.5\" fill=\"none\"/></svg>`;\n default:\n return `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><rect width=\"24\" height=\"24\" rx=\"6\" fill=\"#666\"/><text x=\"12\" y=\"16\" text-anchor=\"middle\" fill=\"#fff\" font-size=\"12\">${id[0]?.toUpperCase() ?? 'W'}</text></svg>`;\n }\n}\n\nexport class ModalRenderer {\n private shadowRoot: ShadowRoot | null = null;\n private hostElement: HTMLDivElement | null = null;\n private containerElement: HTMLElement | null = null;\n private containerId: string | null = null;\n private mode: 'popup' | 'embedded';\n private theme: 'light' | 'dark' | 'auto';\n private branding: BrandingConfig;\n private themeObserver: MutationObserver | null = null;\n private mediaQueryListener: ((e: MediaQueryListEvent) => void) | null = null;\n private enabledProviders: OAuthProviderType[] = [];\n private currentView: 'signIn' | 'signUp' = 'signIn';\n private onProviderClick: (provider: OAuthProviderType) => void;\n private onEmailSubmit: (email: string, password: string, isSignUp: boolean) => void;\n private onClose: () => void;\n private onWeb3WalletSelect: (wallet: string) => void;\n private onPasswordlessSubmit: (email: string) => void;\n private onOtpVerify: (email: string, code: string) => void;\n private onPasskeyClick: () => void;\n private escHandler: ((e: KeyboardEvent) => void) | null = null;\n\n // Overlay state\n private currentOverlay: string = 'none';\n private selectedWallet: string = '';\n private overlayEmail: string = '';\n private overlayError: string = '';\n\n // Turnstile CAPTCHA\n private captchaSiteKey: string = '';\n private turnstileWidgetId: string | null = null;\n private turnstileToken: string = '';\n private turnstileWrapper: HTMLDivElement | null = null;\n\n // Dev Teleport (test mode)\n private isTestMode: boolean = false;\n private onDevTeleport: ((email: string) => void) | null = null;\n\n constructor(options: {\n mode: 'popup' | 'embedded';\n theme?: 'light' | 'dark' | 'auto';\n containerId?: string;\n branding?: BrandingConfig;\n captchaSiteKey?: string;\n isTestMode?: boolean;\n onDevTeleport?: (email: string) => void;\n onProviderClick: (provider: OAuthProviderType) => void;\n onEmailSubmit: (email: string, password: string, isSignUp: boolean) => void;\n onClose: () => void;\n onWeb3WalletSelect?: (wallet: string) => void;\n onPasswordlessSubmit?: (email: string) => void;\n onOtpVerify?: (email: string, code: string) => void;\n onPasskeyClick?: () => void;\n }) {\n this.mode = options.mode;\n this.theme = options.theme || 'auto';\n this.branding = { ...DEFAULT_BRANDING, ...options.branding };\n this.captchaSiteKey = options.captchaSiteKey || '';\n this.isTestMode = options.isTestMode || false;\n this.onDevTeleport = options.onDevTeleport || null;\n this.onProviderClick = options.onProviderClick;\n this.onEmailSubmit = options.onEmailSubmit;\n this.onClose = options.onClose;\n this.onWeb3WalletSelect = options.onWeb3WalletSelect || (() => {});\n this.onPasswordlessSubmit = options.onPasswordlessSubmit || (() => {});\n this.onOtpVerify = options.onOtpVerify || (() => {});\n this.onPasskeyClick = options.onPasskeyClick || (() => {});\n\n if (options.mode === 'embedded' && options.containerId) {\n this.containerId = options.containerId;\n }\n }\n\n private resolveContainerElement(): HTMLElement | null {\n if (this.mode !== 'embedded' || !this.containerId) return null;\n const next = document.getElementById(this.containerId);\n if (this.containerElement !== next) {\n // Container changed (SPA navigation) — discard stale mount\n this.hostElement?.remove();\n this.hostElement = null;\n this.shadowRoot = null;\n }\n this.containerElement = next;\n return next;\n }\n\n setProviders(providers: OAuthProviderType[]): void {\n this.enabledProviders = providers;\n }\n\n setBranding(branding: BrandingConfig): void {\n this.branding = { ...DEFAULT_BRANDING, ...branding };\n }\n\n open(view: 'signIn' | 'signUp' = 'signIn'): void {\n this.resolveContainerElement();\n\n if (this.hostElement && !this.hostElement.isConnected) {\n this.hostElement = null;\n this.shadowRoot = null;\n }\n\n if (this.shadowRoot && this.hostElement) {\n // Modal already open — smooth in-place view switch\n this.hideOverlay();\n this.switchView(view);\n } else {\n this.currentView = view;\n this.currentOverlay = 'none';\n this.render(view);\n }\n }\n\n close(): void {\n this.stopThemeObserver();\n if (this.escHandler) {\n document.removeEventListener('keydown', this.escHandler);\n this.escHandler = null;\n }\n // Cleanup turnstile\n if (this.turnstileWidgetId !== null) {\n (window as any).turnstile?.remove(this.turnstileWidgetId);\n this.turnstileWidgetId = null;\n this.turnstileToken = '';\n }\n if (this.turnstileWrapper) {\n this.turnstileWrapper.remove();\n this.turnstileWrapper = null;\n }\n if (this.hostElement) {\n this.hostElement.remove();\n this.hostElement = null;\n this.shadowRoot = null;\n }\n const liveContainer = this.resolveContainerElement();\n if (liveContainer) {\n liveContainer.replaceChildren();\n }\n this.currentOverlay = 'none';\n }\n\n getTurnstileToken(): string {\n return this.turnstileToken;\n }\n\n resetTurnstile(): void {\n if (this.turnstileWidgetId !== null) {\n (window as any).turnstile?.reset(this.turnstileWidgetId);\n this.turnstileToken = '';\n }\n }\n\n /** Update theme at runtime without destroying form state */\n setTheme(theme: 'light' | 'dark' | 'auto'): void {\n this.theme = theme;\n this.updateThemeCSS();\n if (theme === 'auto') {\n this.startThemeObserver();\n } else {\n this.stopThemeObserver();\n }\n }\n\n private updateThemeCSS(): void {\n if (!this.shadowRoot) return;\n const styleEl = this.shadowRoot.getElementById('authon-theme-style');\n if (styleEl) {\n styleEl.textContent = this.buildCSS();\n }\n }\n\n private startThemeObserver(): void {\n this.stopThemeObserver();\n if (typeof document === 'undefined' || typeof window === 'undefined') return;\n\n // Watch for data-theme / class changes on <html>\n this.themeObserver = new MutationObserver(() => this.updateThemeCSS());\n this.themeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme', 'class'],\n });\n\n // Watch for OS-level prefers-color-scheme changes\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\n this.mediaQueryListener = () => this.updateThemeCSS();\n mq.addEventListener('change', this.mediaQueryListener);\n }\n\n private stopThemeObserver(): void {\n if (this.themeObserver) {\n this.themeObserver.disconnect();\n this.themeObserver = null;\n }\n if (this.mediaQueryListener) {\n window.matchMedia('(prefers-color-scheme: dark)').removeEventListener('change', this.mediaQueryListener);\n this.mediaQueryListener = null;\n }\n }\n\n showError(message: string): void {\n if (!this.shadowRoot) return;\n this.clearError();\n const errorEl = this.shadowRoot.getElementById('email-form');\n if (errorEl) {\n const errDiv = document.createElement('div');\n errDiv.id = 'authon-error-msg';\n errDiv.className = 'error-msg';\n errDiv.textContent = message;\n errorEl.appendChild(errDiv);\n }\n }\n\n showBanner(message: string, type: 'error' | 'warning' = 'error'): void {\n if (!this.shadowRoot) return;\n this.clearBanner();\n const inner = this.shadowRoot.getElementById('modal-inner');\n if (!inner) return;\n const banner = document.createElement('div');\n banner.id = 'authon-banner';\n banner.className = type === 'warning' ? 'banner-warning' : 'error-msg';\n banner.textContent = message;\n inner.insertBefore(banner, inner.firstChild);\n }\n\n clearBanner(): void {\n if (!this.shadowRoot) return;\n this.shadowRoot.getElementById('authon-banner')?.remove();\n }\n\n clearError(): void {\n if (!this.shadowRoot) return;\n this.shadowRoot.getElementById('authon-error-msg')?.remove();\n }\n\n showLoading(): void {\n if (!this.shadowRoot) return;\n this.hideLoading();\n const overlay = document.createElement('div');\n overlay.id = 'authon-loading-overlay';\n overlay.innerHTML = `\n <div class=\"loading-spinner\">\n <div class=\"loading-ring\"></div>\n <div class=\"loading-ring\"></div>\n <div class=\"loading-ring\"></div>\n </div>\n <div class=\"loading-text\">Signing in<span class=\"loading-dots\"><span></span><span></span><span></span></span></div>\n `;\n this.shadowRoot.querySelector('.modal-container')?.appendChild(overlay);\n }\n\n hideLoading(): void {\n if (!this.shadowRoot) return;\n this.shadowRoot.getElementById('authon-loading-overlay')?.remove();\n }\n\n // ── Flow Overlay Public API ──\n\n showOverlay(overlay: string): void {\n this.currentOverlay = overlay;\n this.overlayError = '';\n this.renderOverlay();\n }\n\n hideOverlay(): void {\n this.currentOverlay = 'none';\n this.overlayError = '';\n if (!this.shadowRoot) return;\n this.shadowRoot.getElementById('flow-overlay')?.remove();\n }\n\n showWeb3Success(walletId: string, address: string): void {\n this.selectedWallet = walletId;\n this.overlayError = '';\n // Store truncated address for rendering\n const truncated = address.length > 10\n ? `${address.slice(0, 6)}...${address.slice(-4)}`\n : address;\n this.currentOverlay = 'web3-success';\n this.renderOverlayWithData({ truncatedAddress: truncated, walletId });\n }\n\n showPasswordlessSent(): void {\n this.overlayError = '';\n this.currentOverlay = 'passwordless-sent';\n this.renderOverlay();\n }\n\n showOtpInput(email: string): void {\n this.overlayEmail = email;\n this.overlayError = '';\n this.currentOverlay = 'otp-input';\n this.renderOverlay();\n }\n\n showPasskeySuccess(): void {\n this.overlayError = '';\n this.currentOverlay = 'passkey-success';\n this.renderOverlay();\n }\n\n showOverlayError(message: string): void {\n this.overlayError = message;\n // Re-render the current overlay with the error displayed\n if (this.currentOverlay !== 'none') {\n this.renderOverlay();\n }\n }\n\n // ── Smooth view switch (no flicker) ──\n\n private switchView(view: 'signIn' | 'signUp'): void {\n if (!this.shadowRoot || view === this.currentView) return;\n this.currentView = view;\n\n const inner = this.shadowRoot.getElementById('modal-inner');\n if (!inner) return;\n\n // Cross-fade: fade out -> update -> fade in\n inner.style.opacity = '0';\n inner.style.transform = 'translateY(-4px)';\n\n setTimeout(() => {\n inner.innerHTML = this.buildInnerContent(view);\n this.attachInnerEvents(view);\n // Trigger reflow, then animate in\n void inner.offsetHeight;\n inner.style.opacity = '1';\n inner.style.transform = 'translateY(0)';\n }, 140);\n }\n\n // ── Render ──\n\n private render(view: 'signIn' | 'signUp'): void {\n const host = document.createElement('div');\n host.setAttribute('data-authon-modal', '');\n this.hostElement = host;\n\n if (this.mode === 'popup') {\n document.body.appendChild(host);\n } else {\n const container = this.resolveContainerElement();\n if (!container) {\n this.hostElement = null;\n throw new Error(`Authon container \"#${this.containerId}\" not found`);\n }\n container.replaceChildren();\n container.appendChild(host);\n }\n\n this.shadowRoot = host.attachShadow({ mode: 'open' });\n this.shadowRoot.innerHTML = this.buildShell(view);\n this.attachInnerEvents(view);\n this.attachShellEvents();\n\n // Start observing theme changes in auto mode\n if (this.theme === 'auto') {\n this.startThemeObserver();\n }\n }\n\n // ── HTML builders ──\n\n /** Shell = style + backdrop + modal-container (stable across view switches) */\n private buildShell(view: 'signIn' | 'signUp'): string {\n const popupWrapper =\n this.mode === 'popup'\n ? `<div class=\"backdrop\" id=\"backdrop\"></div>`\n : '';\n\n return `\n <style id=\"authon-theme-style\">${this.buildCSS()}</style>\n ${popupWrapper}\n <div class=\"modal-container\" role=\"dialog\" aria-modal=\"true\">\n <div id=\"modal-inner\" class=\"modal-inner\">\n ${this.buildInnerContent(view)}\n </div>\n </div>\n `;\n }\n\n /** Inner content = everything inside the modal that changes per view */\n private buildInnerContent(view: 'signIn' | 'signUp'): string {\n const b = this.branding;\n const isSignUp = view === 'signUp';\n const title = isSignUp ? 'Create your account' : 'Welcome back';\n const subtitle = isSignUp ? 'Already have an account?' : \"Don't have an account?\";\n const subtitleLink = isSignUp ? 'Sign in' : 'Sign up';\n\n const dark = this.isDark();\n\n // SignUp view: hide providers, show only email form\n const showProviders = !isSignUp;\n\n const providerButtons = showProviders\n ? this.enabledProviders\n .filter((p) => !b.hiddenProviders?.includes(p))\n .map((p) => {\n const config = getProviderButtonConfig(p);\n const isWhiteBg = config.bgColor === '#ffffff';\n const btnBg = dark && isWhiteBg ? '#f8fafc' : config.bgColor;\n const btnBorder = isWhiteBg ? (dark ? '#475569' : '#e5e7eb') : config.bgColor;\n return `<button class=\"provider-btn\" data-provider=\"${p}\" style=\"background:${btnBg};color:${config.textColor};border:1px solid ${btnBorder}\">\n <span class=\"provider-icon\">${config.iconSvg}</span>\n <span>${config.label}</span>\n </button>`;\n })\n .join('')\n : '';\n\n const hasVisibleProviders = showProviders && this.enabledProviders.filter((p) => !b.hiddenProviders?.includes(p)).length > 0;\n const divider =\n hasVisibleProviders && b.showDivider !== false && b.showEmailPassword !== false\n ? `<div class=\"divider\"><span>or</span></div>`\n : '';\n\n const emailForm =\n b.showEmailPassword !== false\n ? `<form class=\"email-form\" id=\"email-form\">\n <input type=\"email\" placeholder=\"Email address\" name=\"email\" required class=\"input\" autocomplete=\"email\" />\n <input type=\"password\" placeholder=\"Password\" name=\"password\" required class=\"input\" autocomplete=\"${isSignUp ? 'new-password' : 'current-password'}\" />\n ${isSignUp ? '<p class=\"password-hint\">Must contain uppercase, lowercase, and a number (min 8 chars)</p>' : ''}\n <button type=\"submit\" class=\"submit-btn\">${isSignUp ? 'Sign up' : 'Sign in'}</button>\n </form>`\n : '';\n\n // Auth method divider and buttons (Web3, Passwordless, Passkey)\n const hasMethodAbove = (showProviders && this.enabledProviders.length > 0) || b.showEmailPassword !== false;\n const hasMethodBelow = b.showWeb3 || b.showPasswordless || b.showPasskey;\n const methodDivider = hasMethodAbove && hasMethodBelow\n ? `<div class=\"divider\"><span>or</span></div>`\n : '';\n\n const methodButtons: string[] = [];\n if (b.showWeb3) {\n methodButtons.push(`<button class=\"auth-method-btn web3-btn\" id=\"web3-btn\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M21 12V7H5a2 2 0 0 1 0-4h14v4\"/><path d=\"M3 5v14a2 2 0 0 0 2 2h16v-5\"/><path d=\"M18 12a2 2 0 0 0 0 4h4v-4h-4z\"/>\n </svg>\n <span>Connect Wallet</span>\n </button>`);\n }\n if (b.showPasswordless) {\n methodButtons.push(`<button class=\"auth-method-btn passwordless-btn\" id=\"passwordless-btn\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/>\n </svg>\n <span>Continue with Magic Link</span>\n </button>`);\n }\n if (b.showPasskey) {\n methodButtons.push(`<button class=\"auth-method-btn passkey-btn\" id=\"passkey-btn\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"10\" cy=\"7\" r=\"4\"/><path d=\"M10.3 15H7a4 4 0 0 0-4 4v2\"/><path d=\"M21.7 13.3 19 11\"/><path d=\"m21 15-2.5-1.5\"/><path d=\"m17 17 2.5-1.5\"/><path d=\"M22 9v6a1 1 0 0 1-1 1h-.5\"/><circle cx=\"18\" cy=\"9\" r=\"3\"/>\n </svg>\n <span>Sign in with Passkey</span>\n </button>`);\n }\n const authMethods = methodButtons.length > 0\n ? `<div class=\"auth-methods\">${methodButtons.join('')}</div>`\n : '';\n\n const footer =\n b.termsUrl || b.privacyUrl\n ? `<div class=\"footer\">\n ${b.termsUrl ? `<a href=\"${b.termsUrl}\" target=\"_blank\">Terms of Service</a>` : ''}\n ${b.termsUrl && b.privacyUrl ? ' · ' : ''}\n ${b.privacyUrl ? `<a href=\"${b.privacyUrl}\" target=\"_blank\">Privacy Policy</a>` : ''}\n </div>`\n : '';\n\n const titleHtml = isSignUp\n ? `<div class=\"title-row\">\n <button class=\"back-btn\" id=\"back-btn\" type=\"button\" aria-label=\"Back to sign in\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 12H5\"/><path d=\"m12 19-7-7 7-7\"/></svg>\n </button>\n <h2 class=\"title\">${title}</h2>\n </div>`\n : `<h2 class=\"title\">${title}</h2>`;\n\n return `\n ${b.logoDataUrl ? `<img src=\"${b.logoDataUrl}\" alt=\"Logo\" class=\"logo\" />` : ''}\n ${titleHtml}\n ${b.brandName ? `<p class=\"brand-name\">${b.brandName}</p>` : ''}\n ${showProviders ? `<div class=\"providers\">${providerButtons}</div>` : ''}\n ${divider}\n ${emailForm}\n ${methodDivider}\n ${authMethods}\n <p class=\"switch-view\">${subtitle} <a href=\"#\" id=\"switch-link\">${subtitleLink}</a></p>\n ${footer}\n ${this.isTestMode ? `<div class=\"dev-teleport\">\n <div class=\"dev-teleport-label\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\"/></svg>\n Dev Teleport\n </div>\n <div class=\"dev-teleport-row\">\n <input type=\"email\" placeholder=\"test@example.com\" id=\"dev-teleport-email\" class=\"dev-teleport-input\" value=\"dev@test.com\" />\n <button type=\"button\" id=\"dev-teleport-btn\" class=\"dev-teleport-btn\">Go</button>\n </div>\n </div>` : ''}\n ${b.showSecuredBy !== false ? `<div class=\"secured-by\">Secured by <a href=\"https://authon.dev\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"secured-link\">Authon</a></div>` : ''}\n `;\n }\n\n private renderTurnstile(): void {\n if (!this.captchaSiteKey) return;\n\n const w = window as any;\n const tryRender = () => {\n if (!w.turnstile) return;\n // Render off-screen in real DOM — invisible unless challenge needed\n this.turnstileWrapper = document.createElement('div');\n this.turnstileWrapper.style.cssText = 'position:fixed;bottom:10px;right:10px;z-index:2147483647;';\n document.body.appendChild(this.turnstileWrapper);\n this.turnstileWidgetId = w.turnstile.render(this.turnstileWrapper, {\n sitekey: this.captchaSiteKey,\n callback: (token: string) => { this.turnstileToken = token; },\n 'expired-callback': () => { this.turnstileToken = ''; },\n 'error-callback': () => { this.turnstileToken = ''; },\n theme: this.isDark() ? 'dark' : 'light',\n appearance: 'interaction-only',\n });\n };\n\n if (w.turnstile) {\n tryRender();\n } else {\n const interval = setInterval(() => {\n if (w.turnstile) {\n clearInterval(interval);\n tryRender();\n }\n }, 200);\n setTimeout(() => clearInterval(interval), 10000);\n }\n }\n\n private isDark(): boolean {\n if (this.theme === 'dark') return true;\n if (this.theme === 'light') return false;\n // Auto: check host page's <html> class/attribute first, then OS preference\n if (typeof document !== 'undefined') {\n const html = document.documentElement;\n if (html.classList.contains('dark') || html.getAttribute('data-theme') === 'dark') return true;\n if (html.classList.contains('light') || html.getAttribute('data-theme') === 'light') return false;\n }\n return typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches;\n }\n\n private buildCSS(): string {\n const b = this.branding;\n const dark = this.isDark();\n const bg = dark ? (b.darkBg || '#0f172a') : (b.lightBg || '#ffffff');\n const text = dark ? (b.darkText || '#f1f5f9') : (b.lightText || '#111827');\n const mutedText = dark ? '#94a3b8' : '#6b7280';\n const dimText = dark ? '#64748b' : '#9ca3af';\n const borderColor = dark ? '#334155' : '#d1d5db';\n const dividerColor = dark ? '#334155' : '#e5e7eb';\n const inputBg = dark ? '#1e293b' : '#ffffff';\n\n return `\n :host {\n --authon-primary-start: ${b.primaryColorStart || '#7c3aed'};\n --authon-primary-end: ${b.primaryColorEnd || '#4f46e5'};\n --authon-bg: ${bg};\n --authon-text: ${text};\n --authon-muted: ${mutedText};\n --authon-dim: ${dimText};\n --authon-border: ${borderColor};\n --authon-divider: ${dividerColor};\n --authon-input-bg: ${inputBg};\n --authon-overlay-bg: ${hexToRgba(bg, 0.92)};\n --authon-overlay-bg-solid: ${hexToRgba(bg, 0.97)};\n --authon-backdrop-bg: rgba(0,0,0,${dark ? '0.7' : '0.5'});\n --authon-shadow-opacity: ${dark ? '0.5' : '0.25'};\n --authon-radius: ${b.borderRadius ?? 12}px;\n --authon-font: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n font-family: var(--authon-font);\n color: var(--authon-text);\n }\n * { box-sizing: border-box; margin: 0; padding: 0; }\n .backdrop {\n position: fixed; inset: 0; z-index: 99998;\n background: var(--authon-backdrop-bg); backdrop-filter: blur(4px);\n animation: fadeIn 0.2s ease;\n }\n .modal-container {\n ${this.mode === 'popup' ? 'position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 99999; max-height: 90vh; overflow-y: auto;' : ''}\n background: var(--authon-bg);\n color: var(--authon-text);\n border: 1px solid var(--authon-border);\n border-radius: var(--authon-radius);\n padding: 32px;\n width: 400px; max-width: 100%;\n position: ${this.mode === 'popup' ? 'fixed' : 'relative'};\n ${this.mode === 'popup' ? `box-shadow: 0 25px 50px -12px rgba(0,0,0,${dark ? '0.5' : '0.25'}); animation: slideIn 0.3s ease;` : ''}\n }\n .modal-inner {\n transition: opacity 0.14s ease, transform 0.14s ease;\n }\n .logo { display: block; margin: 0 auto 16px; max-height: 48px; }\n .title-row { display: flex; align-items: center; position: relative; margin-bottom: 8px; }\n .title-row .title { flex: 1; margin-bottom: 0; }\n .back-btn {\n position: absolute; left: 0; top: 50%; transform: translateY(-50%);\n background: none; border: none; color: var(--authon-muted);\n cursor: pointer; padding: 4px; border-radius: 6px; display: flex; align-items: center; justify-content: center;\n transition: color 0.15s, background 0.15s;\n }\n .back-btn:hover { color: var(--authon-text); background: var(--authon-divider); }\n .password-hint { font-size: 11px; color: var(--authon-dim); margin: -4px 0 2px; }\n .title { text-align: center; font-size: 24px; font-weight: 700; margin-bottom: 8px; color: var(--authon-text); }\n .brand-name { text-align: center; font-size: 14px; color: var(--authon-muted); margin-bottom: 24px; }\n .providers { display: flex; flex-direction: column; gap: 8px; margin-bottom: 16px; }\n .provider-btn {\n display: flex; align-items: center; gap: 12px;\n width: 100%; padding: 10px 16px; border-radius: calc(var(--authon-radius) * 0.67);\n font-size: 14px; font-weight: 500; cursor: pointer;\n transition: opacity 0.15s, transform 0.1s;\n font-family: var(--authon-font);\n }\n .provider-btn:hover { opacity: 0.9; }\n .provider-btn:active { transform: scale(0.98); }\n .provider-icon { display: flex; align-items: center; flex-shrink: 0; }\n .divider {\n display: flex; align-items: center; gap: 12px;\n margin: 16px 0; color: var(--authon-dim); font-size: 13px;\n }\n .divider::before, .divider::after {\n content: ''; flex: 1; height: 1px; background: var(--authon-divider);\n }\n .email-form { display: flex; flex-direction: column; gap: 10px; }\n .input {\n width: 100%; padding: 10px 14px;\n background: var(--authon-input-bg);\n color: var(--authon-text);\n border: 1px solid var(--authon-border); border-radius: calc(var(--authon-radius) * 0.5);\n font-size: 14px; font-family: var(--authon-font);\n outline: none; transition: border-color 0.15s;\n }\n .input::placeholder { color: var(--authon-dim); }\n .input:focus { border-color: var(--authon-primary-start); box-shadow: 0 0 0 3px rgba(124,58,237,0.15); }\n .submit-btn {\n width: 100%; padding: 10px;\n background: linear-gradient(135deg, var(--authon-primary-start), var(--authon-primary-end));\n color: #fff; border: none; border-radius: calc(var(--authon-radius) * 0.5);\n font-size: 14px; font-weight: 600; cursor: pointer;\n font-family: var(--authon-font); transition: opacity 0.15s;\n }\n .submit-btn:hover { opacity: 0.9; }\n .submit-btn:disabled { opacity: 0.6; cursor: not-allowed; }\n .error-msg {\n margin-top: 8px; padding: 8px 12px;\n background: rgba(239,68,68,0.1); border: 1px solid rgba(239,68,68,0.3);\n border-radius: calc(var(--authon-radius) * 0.33);\n font-size: 13px; color: #ef4444; text-align: center;\n animation: fadeIn 0.15s ease;\n }\n .banner-warning {\n margin-bottom: 16px; padding: 10px 14px;\n background: rgba(245,158,11,0.1); border: 1px solid rgba(245,158,11,0.3);\n border-radius: calc(var(--authon-radius) * 0.33);\n font-size: 13px; color: #f59e0b; text-align: center;\n animation: fadeIn 0.15s ease;\n }\n .switch-view { text-align: center; margin-top: 16px; font-size: 13px; color: var(--authon-muted); }\n .switch-view a { color: var(--authon-primary-start); text-decoration: none; font-weight: 500; }\n .switch-view a:hover { text-decoration: underline; }\n .footer { text-align: center; margin-top: 12px; font-size: 12px; color: var(--authon-dim); }\n .footer a { color: var(--authon-dim); text-decoration: none; }\n .footer a:hover { text-decoration: underline; }\n .secured-by {\n text-align: center; margin-top: 16px;\n font-size: 11px; color: var(--authon-dim);\n }\n .secured-link { font-weight: 600; color: var(--authon-muted); text-decoration: none; }\n .secured-link:hover { text-decoration: underline; }\n\n /* Dev Teleport */\n .dev-teleport {\n margin-top: 12px; padding: 10px;\n border-radius: calc(var(--authon-radius) * 0.5);\n background: rgba(251,191,36,0.06);\n border: 1px dashed rgba(251,191,36,0.25);\n }\n .dev-teleport-label {\n display: flex; align-items: center; gap: 4px;\n font-size: 10px; font-weight: 600; color: #fbbf24;\n margin-bottom: 8px; text-transform: uppercase; letter-spacing: 0.05em;\n }\n .dev-teleport-row { display: flex; gap: 6px; }\n .dev-teleport-input {\n flex: 1; padding: 6px 10px; font-size: 12px;\n border-radius: calc(var(--authon-radius) * 0.4);\n background: rgba(0,0,0,0.2); border: 1px solid rgba(251,191,36,0.2);\n color: #fbbf24; outline: none; font-family: ui-monospace, monospace;\n }\n .dev-teleport-input:focus { border-color: rgba(251,191,36,0.5); }\n .dev-teleport-btn {\n padding: 6px 14px; font-size: 11px; font-weight: 700;\n border-radius: calc(var(--authon-radius) * 0.4);\n background: rgba(251,191,36,0.15); border: 1px solid rgba(251,191,36,0.3);\n color: #fbbf24; cursor: pointer;\n }\n .dev-teleport-btn:hover { background: rgba(251,191,36,0.25); }\n\n /* Auth method buttons */\n .auth-methods { display: flex; flex-direction: column; gap: 8px; }\n .auth-method-btn {\n display: flex; align-items: center; justify-content: center; gap: 8px;\n width: 100%; padding: 10px 16px;\n border-radius: calc(var(--authon-radius) * 0.5);\n font-size: 13px; font-weight: 500; cursor: pointer;\n font-family: var(--authon-font); transition: opacity 0.15s, transform 0.1s;\n }\n .auth-method-btn:hover { opacity: 0.85; }\n .auth-method-btn:active { transform: scale(0.98); }\n /* Web3 -- purple */\n .web3-btn {\n background: ${dark ? 'rgba(139,92,246,0.12)' : 'rgba(139,92,246,0.08)'};\n border: 1px solid ${dark ? 'rgba(139,92,246,0.3)' : 'rgba(139,92,246,0.25)'};\n color: ${dark ? '#c4b5fd' : '#7c3aed'};\n }\n /* Passwordless -- cyan */\n .passwordless-btn {\n background: ${dark ? 'rgba(6,182,212,0.12)' : 'rgba(6,182,212,0.08)'};\n border: 1px solid ${dark ? 'rgba(6,182,212,0.3)' : 'rgba(6,182,212,0.25)'};\n color: ${dark ? '#67e8f9' : '#0891b2'};\n }\n /* Passkey -- amber */\n .passkey-btn {\n background: ${dark ? 'rgba(245,158,11,0.12)' : 'rgba(245,158,11,0.08)'};\n border: 1px solid ${dark ? 'rgba(245,158,11,0.3)' : 'rgba(245,158,11,0.25)'};\n color: ${dark ? '#fcd34d' : '#b45309'};\n }\n\n /* Flow overlay */\n .flow-overlay {\n position: absolute; inset: 0; z-index: 10;\n background: var(--authon-overlay-bg-solid);\n backdrop-filter: blur(2px);\n border-radius: var(--authon-radius);\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n gap: 12px; padding: 24px;\n animation: fadeIn 0.2s ease;\n }\n .flow-overlay .cancel-link {\n font-size: 12px; color: var(--authon-dim); cursor: pointer; border: none;\n background: none; font-family: var(--authon-font); margin-top: 4px;\n }\n .flow-overlay .cancel-link:hover { text-decoration: underline; }\n .flow-overlay .overlay-title {\n font-size: 14px; font-weight: 600; color: var(--authon-text); text-align: center;\n }\n .flow-overlay .overlay-subtitle {\n font-size: 12px; color: var(--authon-muted); text-align: center;\n }\n .flow-overlay .overlay-error {\n padding: 6px 12px; margin-top: 4px;\n background: rgba(239,68,68,0.1); border: 1px solid rgba(239,68,68,0.3);\n border-radius: calc(var(--authon-radius) * 0.33);\n font-size: 12px; color: #ef4444; text-align: center; width: 100%;\n }\n\n /* Wallet picker */\n .wallet-picker { display: flex; flex-direction: column; gap: 8px; width: 100%; }\n .wallet-btn {\n display: flex; align-items: center; gap: 10px;\n width: 100%; padding: 10px 14px;\n background: ${dark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.04)'};\n border: 1px solid ${dark ? 'rgba(255,255,255,0.1)' : 'rgba(0,0,0,0.08)'};\n border-radius: calc(var(--authon-radius) * 0.5);\n font-size: 13px; font-weight: 500; color: var(--authon-text);\n cursor: pointer; font-family: var(--authon-font);\n transition: opacity 0.15s;\n }\n .wallet-btn:hover { opacity: 0.8; }\n .wallet-btn .wallet-icon { display: flex; align-items: center; flex-shrink: 0; }\n .wallet-btn .wallet-icon svg { border-radius: 6px; }\n\n /* Passwordless email input in overlay */\n .pwless-form { display: flex; flex-direction: column; gap: 10px; width: 100%; }\n .pwless-submit {\n width: 100%; padding: 10px;\n background: linear-gradient(135deg, #06b6d4, #0891b2);\n color: #fff; border: none; border-radius: calc(var(--authon-radius) * 0.5);\n font-size: 13px; font-weight: 600; cursor: pointer;\n font-family: var(--authon-font); transition: opacity 0.15s;\n }\n .pwless-submit:hover { opacity: 0.9; }\n .pwless-submit:disabled { opacity: 0.6; cursor: not-allowed; }\n\n /* OTP input */\n .otp-container { display: flex; flex-direction: column; align-items: center; gap: 16px; width: 100%; }\n .otp-inputs { display: flex; gap: 8px; justify-content: center; }\n .otp-digit {\n width: 40px; height: 48px; text-align: center;\n font-size: 20px; font-weight: 600; font-family: var(--authon-font);\n background: var(--authon-input-bg); color: var(--authon-text);\n border: 1px solid var(--authon-border);\n border-radius: calc(var(--authon-radius) * 0.33);\n outline: none; transition: border-color 0.15s;\n }\n .otp-digit:focus {\n border-color: var(--authon-primary-start);\n box-shadow: 0 0 0 3px rgba(124,58,237,0.15);\n }\n\n /* Success check animation */\n .success-check {\n width: 48px; height: 48px; border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n }\n .success-check svg path {\n stroke-dasharray: 20;\n stroke-dashoffset: 20;\n animation: check-draw 0.4s ease-out 0.1s forwards;\n }\n\n /* Spinner */\n .flow-spinner {\n animation: spin 0.8s linear infinite;\n }\n\n /* Passkey verifying icon */\n .passkey-icon-pulse {\n width: 48px; height: 48px; border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n background: rgba(245,158,11,0.15);\n animation: pulse 1.5s ease-in-out infinite;\n }\n\n /* Wallet connecting icon */\n .wallet-connecting-icon {\n width: 48px; height: 48px; border-radius: 12px;\n display: flex; align-items: center; justify-content: center;\n animation: pulse 1.5s ease-in-out infinite;\n }\n .wallet-connecting-icon svg { border-radius: 6px; }\n\n /* Address badge */\n .address-badge {\n display: inline-flex; align-items: center; gap: 6px;\n padding: 2px 10px; border-radius: 6px;\n background: ${dark ? 'rgba(255,255,255,0.04)' : 'rgba(0,0,0,0.03)'};\n font-size: 11px; font-family: monospace; color: var(--authon-muted);\n }\n .address-badge .wallet-icon-sm svg { width: 16px; height: 16px; border-radius: 4px; }\n\n /* Loading overlay */\n #authon-loading-overlay {\n position: absolute; inset: 0; z-index: 10;\n background: var(--authon-overlay-bg);\n backdrop-filter: blur(2px);\n border-radius: var(--authon-radius);\n display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 20px;\n animation: fadeIn 0.15s ease;\n }\n .loading-spinner { position: relative; width: 48px; height: 48px; }\n .loading-ring {\n position: absolute; inset: 0;\n border: 2.5px solid transparent; border-top-color: var(--authon-primary-start);\n border-radius: 50%; animation: spin 1s cubic-bezier(.55,.15,.45,.85) infinite;\n }\n .loading-ring:nth-child(2) {\n inset: 5px; border-top-color: transparent; border-right-color: var(--authon-primary-end);\n animation-duration: 1.2s; animation-direction: reverse; opacity: .7;\n }\n .loading-ring:nth-child(3) {\n inset: 10px; border-top-color: transparent; border-bottom-color: var(--authon-primary-start);\n animation-duration: .8s; opacity: .4;\n }\n .loading-text { font-size: 14px; font-weight: 500; color: var(--authon-muted); }\n .loading-dots { display: inline-flex; gap: 2px; margin-left: 2px; }\n .loading-dots span {\n width: 3px; height: 3px; border-radius: 50%;\n background: var(--authon-muted); animation: blink 1.4s infinite both;\n }\n .loading-dots span:nth-child(2) { animation-delay: .2s; }\n .loading-dots span:nth-child(3) { animation-delay: .4s; }\n @keyframes spin { to { transform: rotate(360deg); } }\n @keyframes blink { 0%,80%,100% { opacity: .2; } 40% { opacity: 1; } }\n @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }\n @keyframes slideIn { from { opacity: 0; transform: translate(-50%, -48%); } to { opacity: 1; transform: translate(-50%, -50%); } }\n @keyframes check-draw { to { stroke-dashoffset: 0; } }\n @keyframes pulse { 0%,100% { opacity: 1; } 50% { opacity: 0.6; } }\n ${b.customCss || ''}\n `;\n }\n\n // ── Flow Overlay Rendering ──\n\n private renderOverlay(): void {\n this.renderOverlayWithData({});\n }\n\n private renderOverlayWithData(data: Record<string, string>): void {\n if (!this.shadowRoot) return;\n const container = this.shadowRoot.querySelector('.modal-container');\n if (!container) return;\n\n // Remove existing overlay\n this.shadowRoot.getElementById('flow-overlay')?.remove();\n\n if (this.currentOverlay === 'none') return;\n\n const overlay = document.createElement('div');\n overlay.id = 'flow-overlay';\n overlay.className = 'flow-overlay';\n overlay.innerHTML = this.buildOverlayContent(data);\n container.appendChild(overlay);\n this.attachOverlayEvents(overlay);\n }\n\n private buildOverlayContent(data: Record<string, string>): string {\n const dark = this.isDark();\n const errorHtml = this.overlayError\n ? `<div class=\"overlay-error\">${this.escapeHtml(this.overlayError)}</div>`\n : '';\n // subtitleColor handled by var(--authon-dim) in CSS\n\n switch (this.currentOverlay) {\n case 'web3-picker': {\n const walletItems = WALLET_OPTIONS.map(w =>\n `<button class=\"wallet-btn\" data-wallet=\"${w.id}\">\n <span class=\"wallet-icon\">${walletIconSvg(w.id)}</span>\n <span>${w.name}</span>\n </button>`\n ).join('');\n return `\n <div class=\"overlay-title\" style=\"margin-bottom: 4px;\">Select Wallet</div>\n <div class=\"wallet-picker\">${walletItems}</div>\n ${errorHtml}\n <button class=\"cancel-link\" id=\"overlay-cancel\">Cancel</button>\n `;\n }\n\n case 'web3-connecting': {\n const wallet = WALLET_OPTIONS.find(w => w.id === this.selectedWallet);\n const walletName = wallet?.name ?? this.selectedWallet;\n return `\n <div class=\"wallet-connecting-icon\">${walletIconSvg(this.selectedWallet)}</div>\n <div style=\"display:flex;align-items:center;gap:8px;\">\n <svg class=\"flow-spinner\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" fill=\"none\" stroke=\"${wallet?.color ?? '#7c3aed'}\" stroke-width=\"2\" opacity=\"0.25\"/>\n <path d=\"M8 2a6 6 0 0 1 6 6\" fill=\"none\" stroke=\"${wallet?.color ?? '#7c3aed'}\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n </svg>\n <span class=\"overlay-subtitle\">Connecting ${this.escapeHtml(walletName)}...</span>\n </div>\n ${errorHtml}\n <button class=\"cancel-link\" id=\"overlay-cancel\">Cancel</button>\n `;\n }\n\n case 'web3-success': {\n const wallet = WALLET_OPTIONS.find(w => w.id === (data.walletId || this.selectedWallet));\n const walletColor = wallet?.color ?? '#8b5cf6';\n const truncAddr = data.truncatedAddress || '0x...';\n return `\n <div class=\"success-check\" style=\"background:linear-gradient(135deg, ${walletColor}, ${walletColor})\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M5 10l3.5 3.5L15 7\" stroke=\"white\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div class=\"overlay-title\">Wallet Connected</div>\n <div class=\"address-badge\">\n <span class=\"wallet-icon-sm\">${walletIconSvg(data.walletId || this.selectedWallet)}</span>\n <span>${this.escapeHtml(truncAddr)}</span>\n </div>\n `;\n }\n\n case 'passwordless-input': {\n return `\n <div class=\"overlay-title\">Enter your email</div>\n <div class=\"pwless-form\">\n <input type=\"email\" placeholder=\"you@example.com\" class=\"input\" id=\"pwless-email\" autocomplete=\"email\" />\n <button class=\"pwless-submit\" id=\"pwless-submit-btn\">Send Magic Link</button>\n </div>\n ${errorHtml}\n <button class=\"cancel-link\" id=\"overlay-cancel\">Cancel</button>\n `;\n }\n\n case 'passwordless-sending': {\n return `\n <svg class=\"flow-spinner\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" fill=\"none\" stroke=\"var(--authon-primary-start, #7c3aed)\" stroke-width=\"2\" opacity=\"0.25\"/>\n <path d=\"M8 2a6 6 0 0 1 6 6\" fill=\"none\" stroke=\"var(--authon-primary-start, #7c3aed)\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n </svg>\n <span class=\"overlay-subtitle\">Sending magic link...</span>\n `;\n }\n\n case 'passwordless-sent': {\n return `\n <div class=\"success-check\" style=\"background:linear-gradient(135deg, var(--authon-primary-start, #7c3aed), var(--authon-primary-end, #4f46e5))\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M5 10l3.5 3.5L15 7\" stroke=\"white\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div class=\"overlay-title\">Magic link sent!</div>\n <span class=\"overlay-subtitle\">Check your email inbox</span>\n `;\n }\n\n case 'otp-input': {\n const digitInputs = Array.from({ length: 6 }, (_, i) =>\n `<input type=\"text\" inputmode=\"numeric\" maxlength=\"1\" class=\"otp-digit\" data-idx=\"${i}\" autocomplete=\"one-time-code\" />`\n ).join('');\n return `\n <div class=\"otp-container\">\n <div class=\"overlay-title\">Enter verification code</div>\n <span class=\"overlay-subtitle\">6-digit code sent to ${this.escapeHtml(this.overlayEmail)}</span>\n <div class=\"otp-inputs\">${digitInputs}</div>\n ${errorHtml}\n <button class=\"cancel-link\" id=\"overlay-cancel\">Cancel</button>\n </div>\n `;\n }\n\n case 'passkey-verifying': {\n return `\n <div class=\"passkey-icon-pulse\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--authon-primary-start, #7c3aed)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"10\" cy=\"7\" r=\"4\"/><path d=\"M10.3 15H7a4 4 0 0 0-4 4v2\"/>\n <path d=\"M21.7 13.3 19 11\"/><path d=\"m21 15-2.5-1.5\"/><path d=\"m17 17 2.5-1.5\"/>\n <path d=\"M22 9v6a1 1 0 0 1-1 1h-.5\"/><circle cx=\"18\" cy=\"9\" r=\"3\"/>\n </svg>\n </div>\n <span class=\"overlay-subtitle\">Verifying identity...</span>\n ${errorHtml}\n <button class=\"cancel-link\" id=\"overlay-cancel\">Cancel</button>\n `;\n }\n\n case 'passkey-success': {\n return `\n <div class=\"success-check\" style=\"background:linear-gradient(135deg, var(--authon-primary-start, #7c3aed), var(--authon-primary-end, #4f46e5))\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M5 10l3.5 3.5L15 7\" stroke=\"white\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div class=\"overlay-title\">Identity verified!</div>\n `;\n }\n\n default:\n return '';\n }\n }\n\n private attachOverlayEvents(overlay: HTMLElement): void {\n if (!this.shadowRoot) return;\n\n // Cancel button\n const cancelBtn = overlay.querySelector('#overlay-cancel');\n if (cancelBtn) {\n cancelBtn.addEventListener('click', () => this.hideOverlay());\n }\n\n // Wallet buttons\n overlay.querySelectorAll('.wallet-btn').forEach((btn) => {\n btn.addEventListener('click', () => {\n const walletId = (btn as HTMLElement).dataset.wallet;\n if (walletId) {\n this.selectedWallet = walletId;\n this.onWeb3WalletSelect(walletId);\n }\n });\n });\n\n // Passwordless form submit\n const pwlessSubmit = overlay.querySelector('#pwless-submit-btn');\n const pwlessEmail = overlay.querySelector('#pwless-email') as HTMLInputElement | null;\n if (pwlessSubmit && pwlessEmail) {\n // Focus email input\n setTimeout(() => pwlessEmail.focus(), 50);\n\n const submitHandler = () => {\n const email = pwlessEmail.value.trim();\n if (!email) return;\n this.overlayEmail = email;\n this.showOverlay('passwordless-sending');\n this.onPasswordlessSubmit(email);\n };\n pwlessSubmit.addEventListener('click', submitHandler);\n pwlessEmail.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n submitHandler();\n }\n });\n }\n\n // OTP inputs\n const otpDigits = overlay.querySelectorAll('.otp-digit') as NodeListOf<HTMLInputElement>;\n if (otpDigits.length === 6) {\n // Auto-focus first digit\n setTimeout(() => otpDigits[0].focus(), 50);\n\n otpDigits.forEach((digit, idx) => {\n // Only allow digits\n digit.addEventListener('input', () => {\n const val = digit.value.replace(/\\D/g, '');\n digit.value = val.slice(0, 1);\n\n if (val && idx < 5) {\n otpDigits[idx + 1].focus();\n }\n\n // Check if all filled -> auto-submit\n const code = Array.from(otpDigits).map(d => d.value).join('');\n if (code.length === 6) {\n this.onOtpVerify(this.overlayEmail, code);\n }\n });\n\n // Backspace: move to previous\n digit.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Backspace' && !digit.value && idx > 0) {\n otpDigits[idx - 1].focus();\n otpDigits[idx - 1].value = '';\n }\n });\n\n // Paste support: fill all 6 from clipboard\n digit.addEventListener('paste', (e: ClipboardEvent) => {\n e.preventDefault();\n const pasted = (e.clipboardData?.getData('text') ?? '').replace(/\\D/g, '').slice(0, 6);\n if (pasted.length === 0) return;\n for (let i = 0; i < 6; i++) {\n otpDigits[i].value = pasted[i] || '';\n }\n // Focus last filled or next empty\n const lastIdx = Math.min(pasted.length, 5);\n otpDigits[lastIdx].focus();\n\n // Auto-submit if full code pasted\n if (pasted.length === 6) {\n this.onOtpVerify(this.overlayEmail, pasted);\n }\n });\n });\n }\n }\n\n private escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n }\n\n // ── Event binding ──\n\n /** Attach events to shell elements (backdrop, ESC) -- called once */\n private attachShellEvents(): void {\n if (!this.shadowRoot) return;\n\n const backdrop = this.shadowRoot.getElementById('backdrop');\n if (backdrop) {\n backdrop.addEventListener('click', () => this.onClose());\n }\n\n if (this.escHandler) {\n document.removeEventListener('keydown', this.escHandler);\n }\n if (this.mode === 'popup') {\n this.escHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n if (this.currentOverlay !== 'none') {\n this.hideOverlay();\n } else {\n this.onClose();\n }\n }\n };\n document.addEventListener('keydown', this.escHandler);\n }\n }\n\n /** Attach events to inner content (buttons, form, switch link) -- called on each view */\n private attachInnerEvents(view: 'signIn' | 'signUp'): void {\n if (!this.shadowRoot) return;\n\n // Provider buttons\n this.shadowRoot.querySelectorAll('.provider-btn').forEach((btn) => {\n btn.addEventListener('click', () => {\n const provider = (btn as HTMLElement).dataset.provider as OAuthProviderType;\n this.onProviderClick(provider);\n });\n });\n\n // Email form\n const form = this.shadowRoot.getElementById('email-form') as HTMLFormElement | null;\n if (form) {\n form.addEventListener('submit', (e) => {\n e.preventDefault();\n const formData = new FormData(form);\n this.onEmailSubmit(\n formData.get('email') as string,\n formData.get('password') as string,\n view === 'signUp',\n );\n });\n }\n\n // Turnstile CAPTCHA\n this.renderTurnstile();\n\n // Dev Teleport\n const devTeleportBtn = this.shadowRoot.getElementById('dev-teleport-btn');\n const devTeleportEmail = this.shadowRoot.getElementById('dev-teleport-email') as HTMLInputElement | null;\n if (devTeleportBtn && devTeleportEmail && this.onDevTeleport) {\n const handler = this.onDevTeleport;\n devTeleportBtn.addEventListener('click', () => {\n const email = devTeleportEmail.value.trim();\n if (email) handler(email);\n });\n devTeleportEmail.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') {\n const email = devTeleportEmail.value.trim();\n if (email) handler(email);\n }\n });\n }\n\n // Back button (signUp -> signIn)\n const backBtn = this.shadowRoot.getElementById('back-btn');\n if (backBtn) {\n backBtn.addEventListener('click', () => {\n this.open('signIn');\n });\n }\n\n // Switch view link\n const switchLink = this.shadowRoot.getElementById('switch-link');\n if (switchLink) {\n switchLink.addEventListener('click', (e) => {\n e.preventDefault();\n this.open(view === 'signIn' ? 'signUp' : 'signIn');\n });\n }\n\n // Web3 button\n const web3Btn = this.shadowRoot.getElementById('web3-btn');\n if (web3Btn) {\n web3Btn.addEventListener('click', () => this.showOverlay('web3-picker'));\n }\n\n // Passwordless button\n const pwlessBtn = this.shadowRoot.getElementById('passwordless-btn');\n if (pwlessBtn) {\n pwlessBtn.addEventListener('click', () => this.showOverlay('passwordless-input'));\n }\n\n // Passkey button\n const passkeyBtn = this.shadowRoot.getElementById('passkey-btn');\n if (passkeyBtn) {\n passkeyBtn.addEventListener('click', () => this.onPasskeyClick());\n }\n }\n}\n","import type { AuthonUser, AuthTokens } from '@authon/shared';\n\nexport class SessionManager {\n private accessToken: string | null = null;\n private refreshToken: string | null = null;\n private user: AuthonUser | null = null;\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private apiUrl: string;\n private publishableKey: string;\n private storageKey: string;\n\n constructor(publishableKey: string, apiUrl: string) {\n this.publishableKey = publishableKey;\n this.apiUrl = apiUrl;\n this.storageKey = `authon_session_${publishableKey.slice(0, 16)}`;\n this.restoreFromStorage();\n }\n\n private restoreFromStorage(): void {\n if (typeof window === 'undefined') return;\n try {\n const stored = localStorage.getItem(this.storageKey);\n if (!stored) return;\n const data = JSON.parse(stored);\n if (data.accessToken && data.refreshToken && data.user) {\n this.accessToken = data.accessToken;\n this.refreshToken = data.refreshToken;\n this.user = data.user;\n // Token might be expired, schedule immediate refresh\n this.scheduleRefresh(5);\n }\n } catch { /* ignore corrupt storage */ }\n }\n\n private persistToStorage(): void {\n if (typeof window === 'undefined') return;\n try {\n if (this.accessToken && this.refreshToken && this.user) {\n localStorage.setItem(this.storageKey, JSON.stringify({\n accessToken: this.accessToken,\n refreshToken: this.refreshToken,\n user: this.user,\n }));\n } else {\n localStorage.removeItem(this.storageKey);\n }\n } catch { /* ignore */ }\n }\n\n getToken(): string | null {\n return this.accessToken;\n }\n\n getUser(): AuthonUser | null {\n return this.user;\n }\n\n setSession(tokens: AuthTokens): void {\n this.accessToken = tokens.accessToken;\n this.refreshToken = tokens.refreshToken;\n this.user = tokens.user;\n this.persistToStorage();\n if (tokens.expiresIn && tokens.expiresIn > 0) {\n this.scheduleRefresh(tokens.expiresIn);\n }\n }\n\n updateUser(user: AuthonUser): void {\n this.user = user;\n }\n\n clearSession(): void {\n this.accessToken = null;\n this.refreshToken = null;\n this.user = null;\n this.persistToStorage();\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n private scheduleRefresh(expiresIn: number): void {\n if (this.refreshTimer) clearTimeout(this.refreshTimer);\n // Refresh 60 seconds before expiry\n const refreshIn = Math.max((expiresIn - 60) * 1000, 30000);\n this.refreshTimer = setTimeout(() => this.refresh(), refreshIn);\n }\n\n async refresh(): Promise<AuthTokens | null> {\n if (!this.refreshToken) {\n this.clearSession();\n return null;\n }\n try {\n const res = await fetch(`${this.apiUrl}/v1/auth/token/refresh`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.publishableKey,\n },\n credentials: 'include',\n body: JSON.stringify({ refreshToken: this.refreshToken }),\n });\n if (!res.ok) {\n this.clearSession();\n return null;\n }\n const tokens: AuthTokens = await res.json();\n this.setSession(tokens);\n return tokens;\n } catch {\n this.clearSession();\n return null;\n }\n }\n\n async signOut(): Promise<void> {\n try {\n await fetch(`${this.apiUrl}/v1/auth/signout`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.publishableKey,\n ...(this.accessToken ? { Authorization: `Bearer ${this.accessToken}` } : {}),\n },\n credentials: 'include',\n });\n } catch {\n // ignore\n }\n this.clearSession();\n }\n\n destroy(): void {\n this.clearSession();\n }\n}\n","/**\n * Minimal QR Code SVG generator — byte mode, EC Level L, versions 1–13.\n * Zero dependencies. Produces a standalone SVG string.\n */\n\n// ── GF(256) with irreducible polynomial x^8+x^4+x^3+x^2+1 (0x11D) ──\n\nconst EXP: number[] = [];\nconst LOG: number[] = new Array(256).fill(0);\n(() => {\n let v = 1;\n for (let i = 0; i < 255; i++) {\n EXP[i] = v;\n LOG[v] = i;\n v <<= 1;\n if (v & 256) v ^= 0x11d;\n }\n for (let i = 255; i < 512; i++) EXP[i] = EXP[i - 255];\n})();\n\nconst gfMul = (a: number, b: number): number => (a && b ? EXP[LOG[a] + LOG[b]] : 0);\n\n// ── Reed-Solomon error correction ──\n\nfunction rsEncode(data: number[], ecLen: number): number[] {\n // Build generator polynomial in ascending degree order\n let g = [1];\n for (let i = 0; i < ecLen; i++) {\n const ng = new Array(g.length + 1).fill(0);\n for (let j = 0; j < g.length; j++) {\n ng[j] ^= gfMul(g[j], EXP[i]);\n ng[j + 1] ^= g[j];\n }\n g = ng;\n }\n // Polynomial division: remainder of data(x)*x^ecLen / g(x)\n const rem = new Array(ecLen).fill(0);\n for (const d of data) {\n const fb = d ^ rem[0];\n for (let j = 0; j < ecLen - 1; j++) {\n rem[j] = rem[j + 1] ^ gfMul(g[ecLen - 1 - j], fb);\n }\n rem[ecLen - 1] = gfMul(g[0], fb);\n }\n return rem;\n}\n\n// ── Version tables (EC Level L only) ──\n\ninterface VerInfo {\n total: number; ec: number; g1: number; g1d: number; g2: number; g2d: number; align: number[];\n}\n\nconst VER: VerInfo[] = [\n { total: 0, ec: 0, g1: 0, g1d: 0, g2: 0, g2d: 0, align: [] }, // dummy\n { total: 26, ec: 7, g1: 1, g1d: 19, g2: 0, g2d: 0, align: [] },\n { total: 44, ec: 10, g1: 1, g1d: 34, g2: 0, g2d: 0, align: [6, 18] },\n { total: 70, ec: 15, g1: 1, g1d: 55, g2: 0, g2d: 0, align: [6, 22] },\n { total: 100, ec: 20, g1: 1, g1d: 80, g2: 0, g2d: 0, align: [6, 26] },\n { total: 134, ec: 26, g1: 1, g1d: 108, g2: 0, g2d: 0, align: [6, 30] },\n { total: 172, ec: 18, g1: 2, g1d: 68, g2: 0, g2d: 0, align: [6, 34] },\n { total: 196, ec: 20, g1: 2, g1d: 78, g2: 0, g2d: 0, align: [6, 22, 38] },\n { total: 242, ec: 24, g1: 2, g1d: 97, g2: 0, g2d: 0, align: [6, 24, 42] },\n { total: 292, ec: 30, g1: 2, g1d: 116, g2: 0, g2d: 0, align: [6, 26, 46] },\n { total: 346, ec: 18, g1: 2, g1d: 68, g2: 2, g2d: 69, align: [6, 28, 50] },\n { total: 404, ec: 20, g1: 4, g1d: 81, g2: 0, g2d: 0, align: [6, 30, 54] },\n { total: 466, ec: 24, g1: 2, g1d: 92, g2: 2, g2d: 93, align: [6, 32, 58] },\n { total: 532, ec: 26, g1: 4, g1d: 107, g2: 0, g2d: 0, align: [6, 34, 62] },\n];\n\nfunction dataCapacity(ver: number): number {\n const v = VER[ver];\n return v.g1 * v.g1d + v.g2 * v.g2d;\n}\n\nfunction pickVersion(byteLen: number): number {\n for (let v = 1; v < VER.length; v++) {\n const headerBits = 4 + (v <= 9 ? 8 : 16); // mode indicator + char count\n const available = dataCapacity(v) * 8 - headerBits;\n if (byteLen * 8 <= available) return v;\n }\n throw new Error(`Data too long for QR code (${byteLen} bytes)`);\n}\n\n// ── Data encoding (byte mode) ──\n\nfunction encodeData(bytes: number[], ver: number): number[] {\n const cap = dataCapacity(ver);\n const countBits = ver <= 9 ? 8 : 16;\n const bits: number[] = [];\n\n const push = (val: number, len: number) => {\n for (let i = len - 1; i >= 0; i--) bits.push((val >> i) & 1);\n };\n\n push(0b0100, 4); // byte mode indicator\n push(bytes.length, countBits);\n for (const b of bytes) push(b, 8);\n push(0, Math.min(4, cap * 8 - bits.length)); // terminator\n\n // Pad to byte boundary\n while (bits.length % 8) bits.push(0);\n\n // Pad codewords\n const padBytes = [0xec, 0x11];\n let pi = 0;\n while (bits.length < cap * 8) {\n push(padBytes[pi], 8);\n pi ^= 1;\n }\n\n // Convert bits to codewords\n const cw: number[] = [];\n for (let i = 0; i < bits.length; i += 8) {\n let byte = 0;\n for (let j = 0; j < 8; j++) byte = (byte << 1) | bits[i + j];\n cw.push(byte);\n }\n return cw;\n}\n\n// ── EC encoding and interleaving ──\n\nfunction computeCodewords(ver: number, dataCW: number[]): number[] {\n const v = VER[ver];\n const blocks: number[][] = [];\n const ecBlocks: number[][] = [];\n let offset = 0;\n\n for (let i = 0; i < v.g1; i++) {\n const block = dataCW.slice(offset, offset + v.g1d);\n blocks.push(block);\n ecBlocks.push(rsEncode(block, v.ec));\n offset += v.g1d;\n }\n for (let i = 0; i < v.g2; i++) {\n const block = dataCW.slice(offset, offset + v.g2d);\n blocks.push(block);\n ecBlocks.push(rsEncode(block, v.ec));\n offset += v.g2d;\n }\n\n // Interleave data\n const result: number[] = [];\n const maxDataLen = Math.max(v.g1d, v.g2d || 0);\n for (let i = 0; i < maxDataLen; i++) {\n for (const block of blocks) {\n if (i < block.length) result.push(block[i]);\n }\n }\n // Interleave EC\n for (let i = 0; i < v.ec; i++) {\n for (const block of ecBlocks) result.push(block[i]);\n }\n\n return result;\n}\n\n// ── Matrix construction ──\n\nconst UNSET = -1;\nconst DARK = 1;\nconst LIGHT = 0;\n\nfunction createMatrix(size: number): number[][] {\n return Array.from({ length: size }, () => new Array(size).fill(UNSET));\n}\n\nfunction setModule(m: number[][], r: number, c: number, dark: boolean) {\n if (r >= 0 && r < m.length && c >= 0 && c < m.length) m[r][c] = dark ? DARK : LIGHT;\n}\n\nfunction placeFinderPattern(m: number[][], row: number, col: number) {\n for (let r = -1; r <= 7; r++) {\n for (let c = -1; c <= 7; c++) {\n const dark =\n r >= 0 && r <= 6 && c >= 0 && c <= 6 &&\n (r === 0 || r === 6 || c === 0 || c === 6 || (r >= 2 && r <= 4 && c >= 2 && c <= 4));\n setModule(m, row + r, col + c, dark);\n }\n }\n}\n\nfunction placeAlignmentPattern(m: number[][], row: number, col: number) {\n for (let r = -2; r <= 2; r++) {\n for (let c = -2; c <= 2; c++) {\n const dark = Math.abs(r) === 2 || Math.abs(c) === 2 || (r === 0 && c === 0);\n m[row + r][col + c] = dark ? DARK : LIGHT;\n }\n }\n}\n\nfunction isReserved(m: number[][], r: number, c: number): boolean {\n return m[r][c] !== UNSET;\n}\n\nfunction buildMatrix(ver: number, codewords: number[]): number[][] {\n const size = ver * 4 + 17;\n const m = createMatrix(size);\n\n // Finder patterns + separators\n placeFinderPattern(m, 0, 0);\n placeFinderPattern(m, 0, size - 7);\n placeFinderPattern(m, size - 7, 0);\n\n // Timing patterns\n for (let i = 8; i < size - 8; i++) {\n m[6][i] = i % 2 === 0 ? DARK : LIGHT;\n m[i][6] = i % 2 === 0 ? DARK : LIGHT;\n }\n\n // Alignment patterns\n const ap = VER[ver].align;\n if (ap.length > 0) {\n for (const r of ap) {\n for (const c of ap) {\n // Skip if overlapping finder patterns\n if (r <= 8 && c <= 8) continue;\n if (r <= 8 && c >= size - 8) continue;\n if (r >= size - 8 && c <= 8) continue;\n placeAlignmentPattern(m, r, c);\n }\n }\n }\n\n // Dark module\n m[4 * ver + 9][8] = DARK;\n\n // Reserve format info areas (will be filled after masking)\n for (let i = 0; i < 9; i++) {\n if (m[8][i] === UNSET) m[8][i] = LIGHT; // top-left horizontal\n if (m[i][8] === UNSET) m[i][8] = LIGHT; // top-left vertical\n }\n for (let i = 0; i < 8; i++) {\n if (m[8][size - 1 - i] === UNSET) m[8][size - 1 - i] = LIGHT; // top-right\n if (m[size - 1 - i][8] === UNSET) m[size - 1 - i][8] = LIGHT; // bottom-left\n }\n\n // Reserve version info areas (version >= 7)\n if (ver >= 7) {\n for (let i = 0; i < 6; i++) {\n for (let j = 0; j < 3; j++) {\n m[i][size - 11 + j] = LIGHT;\n m[size - 11 + j][i] = LIGHT;\n }\n }\n }\n\n // Place data in zigzag pattern\n let bitIdx = 0;\n const totalBits = codewords.length * 8;\n let upward = true;\n\n for (let right = size - 1; right >= 0; right -= 2) {\n if (right === 6) right = 5; // skip timing column\n for (let i = 0; i < size; i++) {\n const row = upward ? size - 1 - i : i;\n for (const dc of [0, -1]) {\n const col = right + dc;\n if (col < 0 || col >= size) continue;\n if (isReserved(m, row, col)) continue;\n if (bitIdx < totalBits) {\n const byteIdx = bitIdx >> 3;\n const bitPos = 7 - (bitIdx & 7);\n m[row][col] = (codewords[byteIdx] >> bitPos) & 1;\n bitIdx++;\n } else {\n m[row][col] = LIGHT;\n }\n }\n }\n upward = !upward;\n }\n\n return m;\n}\n\n// ── Masking ──\n\ntype MaskFn = (r: number, c: number) => boolean;\n\nconst MASKS: MaskFn[] = [\n (r, c) => (r + c) % 2 === 0,\n (r) => r % 2 === 0,\n (_, c) => c % 3 === 0,\n (r, c) => (r + c) % 3 === 0,\n (r, c) => (Math.floor(r / 2) + Math.floor(c / 3)) % 2 === 0,\n (r, c) => ((r * c) % 2) + ((r * c) % 3) === 0,\n (r, c) => (((r * c) % 2) + ((r * c) % 3)) % 2 === 0,\n (r, c) => (((r + c) % 2) + ((r * c) % 3)) % 2 === 0,\n];\n\nfunction applyMask(m: number[][], maskIdx: number, template: number[][]): number[][] {\n const size = m.length;\n const result = m.map((row) => [...row]);\n const fn = MASKS[maskIdx];\n for (let r = 0; r < size; r++) {\n for (let c = 0; c < size; c++) {\n if (template[r][c] !== UNSET) continue; // reserved area\n if (fn(r, c)) result[r][c] ^= 1;\n }\n }\n return result;\n}\n\nfunction penalty(m: number[][]): number {\n const size = m.length;\n let score = 0;\n\n // Rule 1: consecutive same-color modules\n for (let r = 0; r < size; r++) {\n let count = 1;\n for (let c = 1; c < size; c++) {\n if (m[r][c] === m[r][c - 1]) { count++; } else {\n if (count >= 5) score += count - 2;\n count = 1;\n }\n }\n if (count >= 5) score += count - 2;\n }\n for (let c = 0; c < size; c++) {\n let count = 1;\n for (let r = 1; r < size; r++) {\n if (m[r][c] === m[r - 1][c]) { count++; } else {\n if (count >= 5) score += count - 2;\n count = 1;\n }\n }\n if (count >= 5) score += count - 2;\n }\n\n // Rule 2: 2x2 blocks\n for (let r = 0; r < size - 1; r++) {\n for (let c = 0; c < size - 1; c++) {\n const v = m[r][c];\n if (v === m[r][c + 1] && v === m[r + 1][c] && v === m[r + 1][c + 1]) score += 3;\n }\n }\n\n // Rule 3: finder-like patterns\n const pat1 = [1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0];\n const pat2 = [0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1];\n for (let r = 0; r < size; r++) {\n for (let c = 0; c <= size - 11; c++) {\n let match1 = true, match2 = true;\n for (let k = 0; k < 11; k++) {\n if (m[r][c + k] !== pat1[k]) match1 = false;\n if (m[r][c + k] !== pat2[k]) match2 = false;\n }\n if (match1 || match2) score += 40;\n }\n }\n for (let c = 0; c < size; c++) {\n for (let r = 0; r <= size - 11; r++) {\n let match1 = true, match2 = true;\n for (let k = 0; k < 11; k++) {\n if (m[r + k][c] !== pat1[k]) match1 = false;\n if (m[r + k][c] !== pat2[k]) match2 = false;\n }\n if (match1 || match2) score += 40;\n }\n }\n\n // Rule 4: dark/light ratio\n let dark = 0;\n for (let r = 0; r < size; r++) for (let c = 0; c < size; c++) if (m[r][c]) dark++;\n const pct = (dark * 100) / (size * size);\n const prev5 = Math.floor(pct / 5) * 5;\n const next5 = prev5 + 5;\n score += Math.min(Math.abs(prev5 - 50) / 5, Math.abs(next5 - 50) / 5) * 10;\n\n return score;\n}\n\n// ── Format & version information ──\n\nfunction bchEncode(data: number, gen: number, dataBits: number): number {\n let d = data << (15 - dataBits); // Shift depends on total - data bits\n const genLen = Math.floor(Math.log2(gen)) + 1;\n const totalBits = dataBits + (genLen - 1);\n d = data << (totalBits - dataBits);\n for (let i = dataBits - 1; i >= 0; i--) {\n if (d & (1 << (i + genLen - 1))) d ^= gen << i;\n }\n return (data << (genLen - 1)) | d;\n}\n\nfunction placeFormatInfo(m: number[][], maskIdx: number) {\n const size = m.length;\n // EC Level L = 01, mask pattern = maskIdx (3 bits)\n const data = (0b01 << 3) | maskIdx;\n let format = bchEncode(data, 0x537, 5);\n format ^= 0x5412;\n\n // Place around top-left finder\n const bits: number[] = [];\n for (let i = 14; i >= 0; i--) bits.push((format >> i) & 1);\n\n // Horizontal: left side of top-left finder + right side\n const hPos = [0, 1, 2, 3, 4, 5, 7, 8, size - 8, size - 7, size - 6, size - 5, size - 4, size - 3, size - 2];\n for (let i = 0; i < 15; i++) m[8][hPos[i]] = bits[i];\n\n // Vertical: bottom side of top-left finder + top side of bottom-left\n const vPos = [size - 1, size - 2, size - 3, size - 4, size - 5, size - 6, size - 7, size - 8, 7, 5, 4, 3, 2, 1, 0];\n for (let i = 0; i < 15; i++) m[vPos[i]][8] = bits[i];\n}\n\nfunction placeVersionInfo(m: number[][], ver: number) {\n if (ver < 7) return;\n const size = m.length;\n let info = bchEncode(ver, 0x1f25, 6);\n for (let i = 0; i < 18; i++) {\n const bit = (info >> i) & 1;\n const r = Math.floor(i / 3);\n const c = size - 11 + (i % 3);\n m[r][c] = bit;\n m[c][r] = bit;\n }\n}\n\n// ── Public API ──\n\nexport function generateQrSvg(text: string, moduleSize = 4): string {\n const bytes = Array.from(new TextEncoder().encode(text));\n const ver = pickVersion(bytes.length);\n const dataCW = encodeData(bytes, ver);\n const allCW = computeCodewords(ver, dataCW);\n const size = ver * 4 + 17;\n\n // Build template (tracks reserved areas)\n const template = createMatrix(size);\n placeFinderPattern(template, 0, 0);\n placeFinderPattern(template, 0, size - 7);\n placeFinderPattern(template, size - 7, 0);\n for (let i = 8; i < size - 8; i++) {\n template[6][i] = LIGHT;\n template[i][6] = LIGHT;\n }\n const ap = VER[ver].align;\n for (const r of ap) {\n for (const c of ap) {\n if (r <= 8 && c <= 8) continue;\n if (r <= 8 && c >= size - 8) continue;\n if (r >= size - 8 && c <= 8) continue;\n for (let dr = -2; dr <= 2; dr++) for (let dc = -2; dc <= 2; dc++) template[r + dr][c + dc] = LIGHT;\n }\n }\n template[4 * ver + 9][8] = LIGHT;\n for (let i = 0; i < 9; i++) {\n if (template[8][i] === UNSET) template[8][i] = LIGHT;\n if (template[i][8] === UNSET) template[i][8] = LIGHT;\n }\n for (let i = 0; i < 8; i++) {\n if (template[8][size - 1 - i] === UNSET) template[8][size - 1 - i] = LIGHT;\n if (template[size - 1 - i][8] === UNSET) template[size - 1 - i][8] = LIGHT;\n }\n if (ver >= 7) {\n for (let i = 0; i < 6; i++) for (let j = 0; j < 3; j++) {\n template[i][size - 11 + j] = LIGHT;\n template[size - 11 + j][i] = LIGHT;\n }\n }\n\n // Build matrix with data\n const base = buildMatrix(ver, allCW);\n\n // Try all 8 masks, pick lowest penalty\n let bestMask = 0;\n let bestScore = Infinity;\n for (let mask = 0; mask < 8; mask++) {\n const masked = applyMask(base, mask, template);\n placeFormatInfo(masked, mask);\n placeVersionInfo(masked, ver);\n const s = penalty(masked);\n if (s < bestScore) { bestScore = s; bestMask = mask; }\n }\n\n const final = applyMask(base, bestMask, template);\n placeFormatInfo(final, bestMask);\n placeVersionInfo(final, ver);\n\n // Render SVG\n const quiet = 4; // quiet zone modules\n const total = size + quiet * 2;\n const px = total * moduleSize;\n let svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${total} ${total}\" width=\"${px}\" height=\"${px}\" shape-rendering=\"crispEdges\">`;\n svg += `<rect width=\"${total}\" height=\"${total}\" fill=\"#fff\"/>`;\n for (let r = 0; r < size; r++) {\n for (let c = 0; c < size; c++) {\n if (final[r][c] === DARK) {\n svg += `<rect x=\"${c + quiet}\" y=\"${r + quiet}\" width=\"1\" height=\"1\" fill=\"#000\"/>`;\n }\n }\n }\n svg += '</svg>';\n return svg;\n}\n","import type {\n AuthonUser,\n AuthonOrganization,\n OrganizationMember,\n OrganizationInvitation,\n OrganizationListResponse,\n CreateOrganizationParams,\n UpdateOrganizationParams,\n InviteMemberParams,\n AuthTokens,\n BrandingConfig,\n MfaSetupResponse,\n MfaStatus,\n OAuthProviderType,\n PasskeyCredential,\n SessionInfo,\n Web3Chain,\n Web3NonceResponse,\n Web3Wallet,\n Web3WalletType,\n} from '@authon/shared';\nimport type {\n AuthonConfig,\n AuthonEventType,\n AuthonEvents,\n OAuthFlowMode,\n OAuthSignInOptions,\n} from './types';\nimport { AuthonMfaRequiredError } from './types';\nimport { ModalRenderer } from './modal';\nimport { SessionManager } from './session';\nimport { generateQrSvg } from './qrcode';\n\ninterface ProvidersResponse {\n providers: OAuthProviderType[];\n providerConfigs?: Partial<Record<OAuthProviderType, { oauthFlow?: OAuthFlowMode }>>;\n}\n\nexport class Authon {\n private publishableKey: string;\n private config: Required<Omit<AuthonConfig, 'containerId' | 'appearance'>> & {\n containerId?: string;\n appearance?: Partial<BrandingConfig>;\n };\n private session: SessionManager;\n private modal: ModalRenderer | null = null;\n private listeners: Map<string, Set<(...args: unknown[]) => void>> = new Map();\n private branding: BrandingConfig | null = null;\n private providers: OAuthProviderType[] = [];\n private providerFlowModes: Partial<Record<OAuthProviderType, OAuthFlowMode>> = {};\n private initialized = false;\n private captchaEnabled = false;\n private turnstileSiteKey = '';\n\n constructor(publishableKey: string, config?: AuthonConfig) {\n this.publishableKey = publishableKey;\n this.config = {\n apiUrl: config?.apiUrl || 'https://api.authon.dev',\n mode: config?.mode || 'popup',\n theme: config?.theme || 'auto',\n locale: config?.locale || 'en',\n containerId: config?.containerId,\n appearance: config?.appearance,\n };\n this.session = new SessionManager(publishableKey, this.config.apiUrl);\n this.consumeRedirectResultFromUrl();\n }\n\n // ── Public API ──\n\n async getProviders(): Promise<OAuthProviderType[]> {\n await this.ensureInitialized();\n return [...this.providers];\n }\n\n async openSignIn(): Promise<void> {\n await this.ensureInitialized();\n this.getModal().open('signIn');\n }\n\n async openSignUp(): Promise<void> {\n await this.ensureInitialized();\n this.getModal().open('signUp');\n }\n\n /** Update theme at runtime without destroying form state */\n setTheme(theme: 'light' | 'dark' | 'auto'): void {\n this.getModal().setTheme(theme);\n }\n\n async signInWithOAuth(provider: OAuthProviderType, options?: OAuthSignInOptions): Promise<void> {\n await this.ensureInitialized();\n await this.startOAuthFlow(provider, options);\n }\n\n async signInWithEmail(email: string, password: string, turnstileToken?: string): Promise<AuthonUser> {\n const body: Record<string, string> = { email, password };\n if (turnstileToken) body.turnstileToken = turnstileToken;\n const res = await this.apiPost<AuthTokens & { mfaRequired?: boolean; mfaToken?: string }>(\n '/v1/auth/signin',\n body,\n );\n if (res.mfaRequired && res.mfaToken) {\n this.emit('mfaRequired', res.mfaToken);\n throw new AuthonMfaRequiredError(res.mfaToken);\n }\n this.session.setSession(res);\n this.emit('signedIn', res.user);\n return res.user;\n }\n\n async signUpWithEmail(\n email: string,\n password: string,\n meta?: { displayName?: string; turnstileToken?: string },\n ): Promise<AuthonUser> {\n const tokens = await this.apiPost<AuthTokens>('/v1/auth/signup', {\n email,\n password,\n ...meta,\n });\n this.session.setSession(tokens);\n this.emit('signedIn', tokens.user);\n return tokens.user;\n }\n\n async signOut(): Promise<void> {\n await this.session.signOut();\n this.emit('signedOut');\n }\n\n getUser(): AuthonUser | null {\n return this.session.getUser();\n }\n\n getToken(): string | null {\n return this.session.getToken();\n }\n\n on<K extends AuthonEventType>(event: K, listener: AuthonEvents[K]): () => void {\n if (!this.listeners.has(event)) this.listeners.set(event, new Set());\n const set = this.listeners.get(event)!;\n set.add(listener as (...args: unknown[]) => void);\n return () => set.delete(listener as (...args: unknown[]) => void);\n }\n\n // ── MFA ──\n\n async setupMfa(): Promise<MfaSetupResponse & { qrCodeSvg: string }> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to setup MFA');\n const res = await this.apiPostAuth<MfaSetupResponse>('/v1/auth/mfa/totp/setup', undefined, token);\n return { ...res, qrCodeSvg: generateQrSvg(res.qrCodeUri) };\n }\n\n async verifyMfaSetup(code: string): Promise<void> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to verify MFA setup');\n await this.apiPostAuth<{ success: boolean }>('/v1/auth/mfa/totp/verify-setup', { code }, token);\n }\n\n async verifyMfa(mfaToken: string, code: string): Promise<AuthonUser> {\n const res = await this.apiPost<AuthTokens>('/v1/auth/mfa/verify', { mfaToken, code });\n this.session.setSession(res);\n this.emit('signedIn', res.user);\n return res.user;\n }\n\n async disableMfa(code: string): Promise<void> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to disable MFA');\n await this.apiPostAuth<{ success: boolean }>('/v1/auth/mfa/disable', { code }, token);\n }\n\n async getMfaStatus(): Promise<MfaStatus> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to get MFA status');\n const res = await fetch(`${this.config.apiUrl}/v1/auth/mfa/status`, {\n headers: {\n 'x-api-key': this.publishableKey,\n Authorization: `Bearer ${token}`,\n },\n credentials: 'include',\n });\n if (!res.ok) throw new Error(await this.parseApiError(res, '/v1/auth/mfa/status'));\n return res.json();\n }\n\n async regenerateBackupCodes(code: string): Promise<string[]> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to regenerate backup codes');\n const res = await this.apiPostAuth<{ backupCodes: string[] }>(\n '/v1/auth/mfa/backup-codes/regenerate',\n { code },\n token,\n );\n return res.backupCodes;\n }\n\n // ── Passwordless ──\n\n async sendMagicLink(email: string): Promise<void> {\n await this.apiPost<{ message: string }>('/v1/auth/passwordless/magic-link', { email });\n }\n\n async sendEmailOtp(email: string): Promise<void> {\n await this.apiPost<{ message: string }>('/v1/auth/passwordless/email-otp', { email });\n }\n\n async verifyPasswordless(options: {\n token?: string;\n email?: string;\n code?: string;\n }): Promise<AuthonUser> {\n const res = await this.apiPost<AuthTokens>('/v1/auth/passwordless/verify', options);\n this.session.setSession(res);\n this.emit('signedIn', res.user);\n return res.user;\n }\n\n // ── Passkeys ──\n\n async registerPasskey(name?: string): Promise<PasskeyCredential> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to register a passkey');\n\n const options = await this.apiPostAuth<{ options: Record<string, unknown> }>(\n '/v1/auth/passkeys/register/options',\n name ? { name } : undefined,\n token,\n );\n\n const credential = await navigator.credentials.create({\n publicKey: this.deserializeCreationOptions(options.options),\n }) as PublicKeyCredential;\n\n const attestation = credential.response as AuthenticatorAttestationResponse;\n const result = await this.apiPostAuth<PasskeyCredential>(\n '/v1/auth/passkeys/register/verify',\n {\n id: credential.id,\n rawId: this.bufferToBase64url(credential.rawId),\n type: credential.type,\n response: {\n attestationObject: this.bufferToBase64url(attestation.attestationObject),\n clientDataJSON: this.bufferToBase64url(attestation.clientDataJSON),\n },\n },\n token,\n );\n\n this.emit('passkeyRegistered', result);\n return result;\n }\n\n async authenticateWithPasskey(email?: string): Promise<AuthonUser> {\n const options = await this.apiPost<{ options: Record<string, unknown> }>(\n '/v1/auth/passkeys/authenticate/options',\n email ? { email } : undefined,\n );\n\n const credential = await navigator.credentials.get({\n publicKey: this.deserializeRequestOptions(options.options),\n }) as PublicKeyCredential;\n\n const assertion = credential.response as AuthenticatorAssertionResponse;\n const res = await this.apiPost<AuthTokens>('/v1/auth/passkeys/authenticate/verify', {\n id: credential.id,\n rawId: this.bufferToBase64url(credential.rawId),\n type: credential.type,\n response: {\n authenticatorData: this.bufferToBase64url(assertion.authenticatorData),\n clientDataJSON: this.bufferToBase64url(assertion.clientDataJSON),\n signature: this.bufferToBase64url(assertion.signature),\n userHandle: assertion.userHandle ? this.bufferToBase64url(assertion.userHandle) : undefined,\n },\n });\n\n this.session.setSession(res);\n this.emit('signedIn', res.user);\n return res.user;\n }\n\n async listPasskeys(): Promise<PasskeyCredential[]> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to list passkeys');\n return this.apiGetAuth<PasskeyCredential[]>('/v1/auth/passkeys', token);\n }\n\n async renamePasskey(passkeyId: string, name: string): Promise<PasskeyCredential> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to rename a passkey');\n return this.apiPatchAuth<PasskeyCredential>(`/v1/auth/passkeys/${passkeyId}`, { name }, token);\n }\n\n async revokePasskey(passkeyId: string): Promise<void> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to revoke a passkey');\n await this.apiDeleteAuth(`/v1/auth/passkeys/${passkeyId}`, token);\n }\n\n // ── Web3 ──\n\n async web3GetNonce(\n address: string,\n chain: Web3Chain,\n walletType: Web3WalletType,\n chainId?: number,\n ): Promise<Web3NonceResponse> {\n return this.apiPost<Web3NonceResponse>('/v1/auth/web3/nonce', {\n address,\n chain,\n walletType,\n ...(chainId != null ? { chainId } : {}),\n });\n }\n\n async web3Verify(\n message: string,\n signature: string,\n address: string,\n chain: Web3Chain,\n walletType: Web3WalletType,\n ): Promise<AuthonUser> {\n const res = await this.apiPost<AuthTokens>('/v1/auth/web3/verify', {\n message,\n signature,\n address,\n chain,\n walletType,\n });\n this.session.setSession(res);\n this.emit('signedIn', res.user);\n return res.user;\n }\n\n async listWallets(): Promise<Web3Wallet[]> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to list wallets');\n return this.apiGetAuth<Web3Wallet[]>('/v1/auth/web3/wallets', token);\n }\n\n async linkWallet(params: {\n address: string;\n chain: Web3Chain;\n walletType: Web3WalletType;\n chainId?: number;\n message: string;\n signature: string;\n }): Promise<Web3Wallet> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to link a wallet');\n const wallet = await this.apiPostAuth<Web3Wallet>('/v1/auth/web3/wallets/link', params, token);\n this.emit('web3Connected', wallet);\n return wallet;\n }\n\n async unlinkWallet(walletId: string): Promise<void> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to unlink a wallet');\n await this.apiDeleteAuth(`/v1/auth/web3/wallets/${walletId}`, token);\n }\n\n // ── User Profile ──\n\n async updateProfile(data: {\n displayName?: string;\n avatarUrl?: string;\n phone?: string;\n publicMetadata?: Record<string, unknown>;\n }): Promise<AuthonUser> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to update profile');\n const user = await this.apiPatchAuth<AuthonUser>('/v1/auth/me', data, token);\n this.session.updateUser(user);\n return user;\n }\n\n // ── Session Management ──\n\n async listSessions(): Promise<SessionInfo[]> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to list sessions');\n return this.apiGetAuth<SessionInfo[]>('/v1/auth/me/sessions', token);\n }\n\n async revokeSession(sessionId: string): Promise<void> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to revoke a session');\n await this.apiDeleteAuth(`/v1/auth/me/sessions/${sessionId}`, token);\n }\n\n // ── Organizations ──\n\n organizations = {\n list: async (): Promise<OrganizationListResponse> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to list organizations');\n return this.apiGetAuth<OrganizationListResponse>('/v1/auth/organizations', token);\n },\n\n create: async (params: CreateOrganizationParams): Promise<AuthonOrganization> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to create an organization');\n return this.apiPostAuth<AuthonOrganization>('/v1/auth/organizations', params, token);\n },\n\n get: async (orgId: string): Promise<AuthonOrganization> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to get organization');\n return this.apiGetAuth<AuthonOrganization>(`/v1/auth/organizations/${orgId}`, token);\n },\n\n update: async (orgId: string, params: UpdateOrganizationParams): Promise<AuthonOrganization> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to update organization');\n return this.apiPatchAuth<AuthonOrganization>(`/v1/auth/organizations/${orgId}`, params, token);\n },\n\n delete: async (orgId: string): Promise<void> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to delete organization');\n await this.apiDeleteAuth(`/v1/auth/organizations/${orgId}`, token);\n },\n\n getMembers: async (orgId: string): Promise<OrganizationMember[]> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to get organization members');\n return this.apiGetAuth<OrganizationMember[]>(`/v1/auth/organizations/${orgId}/members`, token);\n },\n\n invite: async (orgId: string, params: InviteMemberParams): Promise<OrganizationInvitation> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to invite a member');\n return this.apiPostAuth<OrganizationInvitation>(`/v1/auth/organizations/${orgId}/invitations`, params, token);\n },\n\n getInvitations: async (orgId: string): Promise<OrganizationInvitation[]> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to get invitations');\n return this.apiGetAuth<OrganizationInvitation[]>(`/v1/auth/organizations/${orgId}/invitations`, token);\n },\n\n acceptInvitation: async (token: string): Promise<OrganizationMember> => {\n const authToken = this.session.getToken();\n if (!authToken) throw new Error('Must be signed in to accept an invitation');\n return this.apiPostAuth<OrganizationMember>(`/v1/auth/organizations/invitations/${token}/accept`, undefined, authToken);\n },\n\n rejectInvitation: async (token: string): Promise<void> => {\n const authToken = this.session.getToken();\n if (!authToken) throw new Error('Must be signed in to reject an invitation');\n await this.apiPostAuth<void>(`/v1/auth/organizations/invitations/${token}/reject`, undefined, authToken);\n },\n\n removeMember: async (orgId: string, memberId: string): Promise<void> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to remove a member');\n await this.apiDeleteAuth(`/v1/auth/organizations/${orgId}/members/${memberId}`, token);\n },\n\n updateMemberRole: async (orgId: string, memberId: string, role: string): Promise<OrganizationMember> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to update member role');\n return this.apiPatchAuth<OrganizationMember>(`/v1/auth/organizations/${orgId}/members/${memberId}`, { role }, token);\n },\n\n leave: async (orgId: string): Promise<void> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to leave organization');\n await this.apiPostAuth<void>(`/v1/auth/organizations/${orgId}/leave`, undefined, token);\n },\n };\n\n /** Testing utilities — only available when initialized with a pk_test_ key */\n get testing(): { signIn(params: { email: string; nickname?: string }): Promise<AuthonUser> } | undefined {\n if (!this.publishableKey.startsWith('pk_test_')) return undefined;\n return {\n signIn: async (params: { email: string; nickname?: string }): Promise<AuthonUser> => {\n const res = await this.apiPost<AuthTokens>('/v1/auth/testing/token', params);\n this.session.setSession(res);\n this.emit('signedIn', res.user);\n return res.user;\n },\n };\n }\n\n destroy(): void {\n this.modal?.close();\n this.session.destroy();\n this.listeners.clear();\n }\n\n // ── Internal ──\n\n private loadTurnstileScript(): void {\n if (typeof document === 'undefined') return;\n if (document.querySelector('script[src*=\"challenges.cloudflare.com/turnstile\"]')) return;\n const script = document.createElement('script');\n script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit';\n script.async = true;\n document.head.appendChild(script);\n }\n\n private emit(event: string, ...args: unknown[]): void {\n this.listeners.get(event)?.forEach((fn) => fn(...args));\n }\n\n private async ensureInitialized(): Promise<void> {\n if (this.initialized) return;\n try {\n const [branding, providersRes] = await Promise.all([\n this.apiGet<BrandingConfig>('/v1/auth/branding'),\n this.apiGet<ProvidersResponse>('/v1/auth/providers'),\n ]);\n this.branding = { ...branding, ...this.config.appearance };\n this.captchaEnabled = !!(branding as any).captchaEnabled;\n this.turnstileSiteKey = (branding as any).turnstileSiteKey || '';\n if (this.captchaEnabled && this.turnstileSiteKey) {\n this.loadTurnstileScript();\n }\n this.providers = providersRes.providers;\n this.providerFlowModes = {};\n for (const provider of this.providers) {\n this.providerFlowModes[provider] = this.normalizeFlowMode(\n providersRes.providerConfigs?.[provider]?.oauthFlow,\n );\n }\n this.initialized = true;\n } catch (err) {\n this.emit('error', err instanceof Error ? err : new Error(String(err)));\n throw err;\n }\n }\n\n private getModal(): ModalRenderer {\n if (!this.modal) {\n this.modal = new ModalRenderer({\n mode: this.config.mode,\n theme: this.config.theme,\n containerId: this.config.containerId,\n branding: this.branding || undefined,\n captchaSiteKey: this.captchaEnabled ? this.turnstileSiteKey : undefined,\n isTestMode: this.publishableKey.startsWith('pk_test_'),\n onDevTeleport: this.publishableKey.startsWith('pk_test_') ? async (email: string) => {\n this.modal?.clearError();\n try {\n await this.testing!.signIn({ email });\n this.modal?.close();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.modal?.showError(msg || 'Dev teleport failed');\n }\n } : undefined,\n onProviderClick: (provider) => this.startOAuthFlow(provider),\n onEmailSubmit: (email, password, isSignUp) => {\n this.modal?.clearError();\n const turnstileToken = this.modal?.getTurnstileToken?.() || undefined;\n const promise = isSignUp\n ? this.signUpWithEmail(email, password, { turnstileToken })\n : this.signInWithEmail(email, password, turnstileToken);\n promise\n .then(() => this.modal?.close())\n .catch((err) => {\n this.modal?.resetTurnstile?.();\n const msg = err instanceof Error ? err.message : String(err);\n this.modal?.showError(msg || 'Authentication failed');\n this.emit('error', err instanceof Error ? err : new Error(msg));\n });\n },\n onClose: () => this.modal?.close(),\n onWeb3WalletSelect: async (walletId: string) => {\n const chain = walletId === 'phantom' ? 'solana' as const : 'evm' as const;\n try {\n this.modal?.showOverlay?.('web3-connecting');\n const address = await this.getWalletAddress(walletId);\n const { message } = await this.web3GetNonce(address, chain, walletId as any);\n const signature = await this.requestWalletSignature(walletId, message);\n await this.web3Verify(message, signature, address, chain, walletId as any);\n this.modal?.showWeb3Success(walletId, address);\n setTimeout(() => this.modal?.close(), 2500);\n } catch (err) {\n this.modal?.showOverlayError(err instanceof Error ? err.message : String(err));\n }\n },\n onPasswordlessSubmit: async (email: string) => {\n try {\n const method = this.branding?.passwordlessMethod ?? 'magic_link';\n if (method === 'email_otp' || method === 'both') {\n await this.sendEmailOtp(email);\n this.modal?.showOtpInput(email);\n } else {\n await this.sendMagicLink(email);\n this.modal?.showPasswordlessSent();\n }\n } catch (err) {\n this.modal?.showOverlayError(err instanceof Error ? err.message : String(err));\n }\n },\n onOtpVerify: async (email: string, code: string) => {\n try {\n await this.verifyPasswordless({ email, code });\n this.modal?.close();\n } catch (err) {\n this.modal?.showOverlayError(err instanceof Error ? err.message : String(err));\n }\n },\n onPasskeyClick: async () => {\n try {\n this.modal?.showOverlay?.('passkey-verifying');\n await this.authenticateWithPasskey();\n this.modal?.showPasskeySuccess();\n setTimeout(() => this.modal?.close(), 2500);\n } catch (err) {\n this.modal?.showOverlayError(err instanceof Error ? err.message : String(err));\n }\n },\n });\n }\n if (this.branding) this.modal.setBranding(this.branding);\n this.modal.setProviders(this.providers);\n return this.modal;\n }\n\n private async startOAuthFlow(provider: OAuthProviderType, options?: OAuthSignInOptions): Promise<void> {\n try {\n const configuredFlow = this.providerFlowModes[provider] ?? 'auto';\n const flowMode = this.normalizeFlowMode(options?.flowMode ?? configuredFlow);\n\n if (flowMode === 'redirect') {\n this.modal?.showLoading();\n await this.startRedirectOAuthFlow(provider);\n return;\n }\n\n const { url, state } = await this.requestOAuthAuthorization(provider, 'popup');\n\n this.modal?.showLoading();\n\n // Open popup\n const width = 500;\n const height = 700;\n const left = window.screenX + (window.outerWidth - width) / 2;\n const top = window.screenY + (window.outerHeight - height) / 2;\n const popup = window.open(\n url,\n 'authon-oauth',\n `width=${width},height=${height},left=${left},top=${top},toolbar=no,menubar=no`,\n );\n\n if (!popup || popup.closed) {\n if (flowMode === 'auto') {\n this.modal?.showBanner('Popup unavailable. Continuing with redirect sign-in…', 'warning');\n await this.startRedirectOAuthFlow(provider);\n return;\n }\n this.modal?.hideLoading();\n this.modal?.showBanner('Pop-up blocked. Please allow pop-ups for this site and try again.', 'warning');\n this.emit('error', new Error('Popup was blocked by the browser'));\n return;\n }\n\n let resolved = false;\n let cleaned = false;\n const storageKey = `authon-oauth-${state}`;\n\n const resolve = (tokens: AuthTokens) => {\n if (resolved) return;\n resolved = true;\n cleanup();\n try { if (popup && !popup.closed) popup.close(); } catch { /* ignore */ }\n try { localStorage.removeItem(storageKey); } catch { /* ignore */ }\n this.session.setSession(tokens);\n this.modal?.close();\n this.emit('signedIn', tokens.user);\n };\n\n const handleError = (msg: string) => {\n if (resolved) return;\n cleanup();\n this.session.clearSession();\n this.modal?.hideLoading();\n this.modal?.showError(msg);\n this.emit('error', new Error(msg));\n };\n\n const pollApi = async () => {\n if (resolved || cleaned) return;\n try {\n const result = await this.apiGet<{ status: string; accessToken?: string; refreshToken?: string; expiresIn?: number; user?: AuthonUser; message?: string }>(\n `/v1/auth/oauth/poll?state=${encodeURIComponent(state)}`,\n );\n if (result.status === 'completed' && result.accessToken) {\n resolve({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken!,\n expiresIn: result.expiresIn!,\n user: result.user!,\n });\n } else if (result.status === 'error') {\n handleError(result.message || 'Authentication failed');\n }\n } catch {\n // Network error — keep polling\n }\n };\n\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n window.removeEventListener('message', messageHandler);\n window.removeEventListener('storage', storageHandler);\n document.removeEventListener('visibilitychange', visibilityHandler);\n if (apiPollTimer) clearInterval(apiPollTimer);\n if (closePollTimer) clearInterval(closePollTimer);\n if (maxTimer) clearTimeout(maxTimer);\n };\n\n // 1. postMessage handler (fast path — Chrome/Firefox desktop)\n const messageHandler = (e: MessageEvent) => {\n if (e.data?.type !== 'authon-oauth-callback') return;\n if (e.data.tokens) {\n resolve(e.data.tokens as AuthTokens);\n }\n };\n window.addEventListener('message', messageHandler);\n\n // 2. localStorage handler (mobile fallback — cross-tab communication)\n const storageHandler = (e: StorageEvent) => {\n if (e.key !== storageKey || !e.newValue) return;\n try {\n const data = JSON.parse(e.newValue);\n if (data.tokens) resolve(data.tokens as AuthTokens);\n else if (data.error) handleError(data.error);\n } catch { /* ignore */ }\n };\n window.addEventListener('storage', storageHandler);\n\n // Also check localStorage immediately in case it was set before listener\n try {\n const existing = localStorage.getItem(storageKey);\n if (existing) {\n const data = JSON.parse(existing);\n if (data.tokens) { resolve(data.tokens as AuthTokens); return; }\n }\n } catch { /* ignore */ }\n\n // 3. API polling (fallback for all browsers)\n const apiPollTimer = setInterval(pollApi, 1500);\n\n // 4. visibilitychange — poll immediately when tab regains focus (mobile)\n const visibilityHandler = () => {\n if (document.visibilityState === 'visible' && !resolved && !cleaned) {\n pollApi();\n }\n };\n document.addEventListener('visibilitychange', visibilityHandler);\n\n // 5. Popup close detection\n const closePollTimer = setInterval(() => {\n if (resolved || cleaned) return;\n try {\n if (popup && popup.closed) {\n clearInterval(closePollTimer);\n // Poll immediately + give a few more seconds\n pollApi();\n setTimeout(() => {\n if (resolved || cleaned) return;\n pollApi().then(() => {\n if (resolved || cleaned) return;\n cleanup();\n this.modal?.hideLoading();\n });\n }, 3000);\n }\n } catch {\n // Cross-origin access error — popup still open\n }\n }, 500);\n\n // 6. Max timeout (3 minutes)\n const maxTimer = setTimeout(() => {\n if (resolved || cleaned) return;\n cleanup();\n this.modal?.hideLoading();\n }, 180_000);\n } catch (err) {\n this.modal?.hideLoading();\n this.emit('error', err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n private normalizeFlowMode(mode: unknown): OAuthFlowMode {\n if (mode === 'popup' || mode === 'redirect' || mode === 'auto') {\n return mode;\n }\n return 'auto';\n }\n\n private async requestOAuthAuthorization(\n provider: OAuthProviderType,\n flowMode: 'popup' | 'redirect',\n returnTo?: string,\n ): Promise<{ url: string; state: string; flowMode?: 'popup' | 'redirect' }> {\n const redirectUri = `${this.config.apiUrl}/v1/auth/oauth/redirect`;\n const params = new URLSearchParams({\n redirectUri,\n flow: flowMode,\n });\n\n if (returnTo) {\n params.set('returnTo', returnTo);\n }\n\n return this.apiGet<{ url: string; state: string; flowMode?: 'popup' | 'redirect' }>(\n `/v1/auth/oauth/${provider}/url?${params.toString()}`,\n );\n }\n\n private async startRedirectOAuthFlow(provider: OAuthProviderType): Promise<void> {\n const { url } = await this.requestOAuthAuthorization(\n provider,\n 'redirect',\n window.location.href,\n );\n window.location.assign(url);\n }\n\n private consumeRedirectResultFromUrl(): void {\n if (typeof window === 'undefined') return;\n\n let currentUrl: URL;\n try {\n currentUrl = new URL(window.location.href);\n } catch {\n return;\n }\n\n const state = currentUrl.searchParams.get('authon_oauth_state');\n const explicitError = currentUrl.searchParams.get('authon_oauth_error');\n if (!state && !explicitError) return;\n\n let consumed = false;\n\n if (state) {\n try {\n const storageKey = `authon-oauth-${state}`;\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n const data = JSON.parse(stored) as { tokens?: AuthTokens; error?: string };\n if (data.tokens) {\n this.session.setSession(data.tokens);\n this.emit('signedIn', data.tokens.user);\n consumed = true;\n } else if (data.error) {\n this.emit('error', new Error(data.error));\n consumed = true;\n }\n localStorage.removeItem(storageKey);\n }\n } catch {\n // Ignore storage parsing failures\n }\n }\n\n if (!consumed && explicitError) {\n this.emit('error', new Error(explicitError));\n }\n\n currentUrl.searchParams.delete('authon_oauth_state');\n currentUrl.searchParams.delete('authon_oauth_error');\n window.history.replaceState({}, '', currentUrl.toString());\n }\n\n private async apiGet<T>(path: string): Promise<T> {\n const res = await fetch(`${this.config.apiUrl}${path}`, {\n headers: { 'x-api-key': this.publishableKey },\n credentials: 'include',\n });\n if (!res.ok) throw new Error(await this.parseApiError(res, path));\n return res.json();\n }\n\n private async apiPost<T>(path: string, body?: unknown): Promise<T> {\n const res = await fetch(`${this.config.apiUrl}${path}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.publishableKey,\n },\n credentials: 'include',\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!res.ok) throw new Error(await this.parseApiError(res, path));\n return res.json();\n }\n\n private async apiPostAuth<T>(path: string, body: unknown, token: string): Promise<T> {\n const res = await fetch(`${this.config.apiUrl}${path}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.publishableKey,\n Authorization: `Bearer ${token}`,\n },\n credentials: 'include',\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!res.ok) throw new Error(await this.parseApiError(res, path));\n return res.json();\n }\n\n private async apiGetAuth<T>(path: string, token: string): Promise<T> {\n const res = await fetch(`${this.config.apiUrl}${path}`, {\n headers: {\n 'x-api-key': this.publishableKey,\n Authorization: `Bearer ${token}`,\n },\n credentials: 'include',\n });\n if (!res.ok) throw new Error(await this.parseApiError(res, path));\n return res.json();\n }\n\n private async apiPatchAuth<T>(path: string, body: unknown, token: string): Promise<T> {\n const res = await fetch(`${this.config.apiUrl}${path}`, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.publishableKey,\n Authorization: `Bearer ${token}`,\n },\n credentials: 'include',\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!res.ok) throw new Error(await this.parseApiError(res, path));\n return res.json();\n }\n\n private async apiDeleteAuth(path: string, token: string): Promise<void> {\n const res = await fetch(`${this.config.apiUrl}${path}`, {\n method: 'DELETE',\n headers: {\n 'x-api-key': this.publishableKey,\n Authorization: `Bearer ${token}`,\n },\n credentials: 'include',\n });\n if (!res.ok) throw new Error(await this.parseApiError(res, path));\n }\n\n // ── Wallet helpers ──\n\n private async getWalletAddress(walletId: string): Promise<string> {\n if (walletId === 'phantom') {\n const provider = (window as any).solana;\n if (!provider?.isPhantom) throw new Error('Phantom wallet not detected. Please install it from phantom.app');\n const resp = await provider.connect();\n return resp.publicKey.toString();\n }\n // EVM wallets (MetaMask, Pexus, etc.)\n const provider = (window as any).ethereum;\n if (!provider) throw new Error(`${walletId} wallet not detected. Please install it.`);\n const accounts: string[] = await provider.request({ method: 'eth_requestAccounts' });\n return accounts[0];\n }\n\n private async requestWalletSignature(walletId: string, message: string): Promise<string> {\n if (walletId === 'phantom') {\n const provider = (window as any).solana;\n const encoded = new TextEncoder().encode(message);\n const signed = await provider.signMessage(encoded, 'utf8');\n return Array.from(new Uint8Array(signed.signature))\n .map((b: number) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n // EVM wallets\n const provider = (window as any).ethereum;\n const accounts: string[] = await provider.request({ method: 'eth_requestAccounts' });\n return provider.request({ method: 'personal_sign', params: [message, accounts[0]] });\n }\n\n // ── WebAuthn helpers ──\n\n private bufferToBase64url(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n }\n\n private base64urlToBuffer(base64url: string): ArrayBuffer {\n const base64 = base64url.replace(/-/g, '+').replace(/_/g, '/');\n const padded = base64 + '='.repeat((4 - (base64.length % 4)) % 4);\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.buffer;\n }\n\n private deserializeCreationOptions(\n options: Record<string, unknown>,\n ): PublicKeyCredentialCreationOptions {\n const opts = { ...options } as Record<string, unknown>;\n if (typeof opts.challenge === 'string') {\n opts.challenge = this.base64urlToBuffer(opts.challenge);\n }\n if (opts.user && typeof (opts.user as Record<string, unknown>).id === 'string') {\n (opts.user as Record<string, unknown>).id = this.base64urlToBuffer(\n (opts.user as Record<string, unknown>).id as string,\n );\n }\n if (Array.isArray(opts.excludeCredentials)) {\n opts.excludeCredentials = (opts.excludeCredentials as Record<string, unknown>[]).map((c) => ({\n ...c,\n id: typeof c.id === 'string' ? this.base64urlToBuffer(c.id) : c.id,\n }));\n }\n return opts as unknown as PublicKeyCredentialCreationOptions;\n }\n\n private deserializeRequestOptions(\n options: Record<string, unknown>,\n ): PublicKeyCredentialRequestOptions {\n const opts = { ...options } as Record<string, unknown>;\n if (typeof opts.challenge === 'string') {\n opts.challenge = this.base64urlToBuffer(opts.challenge);\n }\n if (Array.isArray(opts.allowCredentials)) {\n opts.allowCredentials = (opts.allowCredentials as Record<string, unknown>[]).map((c) => ({\n ...c,\n id: typeof c.id === 'string' ? this.base64urlToBuffer(c.id) : c.id,\n }));\n }\n return opts as unknown as PublicKeyCredentialRequestOptions;\n }\n\n private async parseApiError(res: Response, path: string): Promise<string> {\n try {\n const body = await res.json();\n if (Array.isArray(body.message) && body.message.length > 0) {\n return body.message[0];\n }\n if (typeof body.message === 'string' && body.message !== 'Bad Request') {\n return body.message;\n }\n } catch { /* ignore */ }\n return `API ${path}: ${res.status}`;\n }\n}\n"],"mappings":"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","names":["provider"]}
|