@authon/js 0.7.2 → 0.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../../../node_modules/.pnpm/@authon+shared@0.3.0/node_modules/@authon/shared/src/index.ts","../src/providers.ts","../src/i18n.ts","../src/modal.ts","../src/profile.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}\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","export type AuthonLocale = keyof typeof translations;\n\nexport const translations = {\n en: {\n welcomeBack: 'Welcome back',\n createAccount: 'Create your account',\n alreadyHaveAccount: 'Already have an account?',\n dontHaveAccount: \"Don't have an account?\",\n signIn: 'Sign in',\n signUp: 'Sign up',\n or: 'or',\n emailAddress: 'Email address',\n password: 'Password',\n passwordHint: 'Must contain uppercase, lowercase, and a number (min 8 chars)',\n continueWith: 'Continue with',\n connectWallet: 'Connect Wallet',\n magicLink: 'Continue with Magic Link',\n passkey: 'Sign in with Passkey',\n securedBy: 'Secured by',\n backToSignIn: 'Back to sign in',\n profile: 'Profile',\n editProfile: 'Edit Profile',\n displayName: 'Display Name',\n save: 'Save',\n signOut: 'Sign Out',\n sessions: 'Active Sessions',\n },\n ko: {\n welcomeBack: '다시 오신 걸 환영합니다',\n createAccount: '계정 만들기',\n alreadyHaveAccount: '이미 계정이 있으신가요?',\n dontHaveAccount: '계정이 없으신가요?',\n signIn: '로그인',\n signUp: '회원가입',\n or: '또는',\n emailAddress: '이메일 주소',\n password: '비밀번호',\n passwordHint: '대문자, 소문자, 숫자 포함 (최소 8자)',\n continueWith: '(으)로 계속하기',\n connectWallet: '지갑 연결',\n magicLink: '매직 링크로 계속하기',\n passkey: '패스키로 로그인',\n securedBy: '보안 제공',\n backToSignIn: '로그인으로 돌아가기',\n profile: '프로필',\n editProfile: '프로필 편집',\n displayName: '표시 이름',\n save: '저장',\n signOut: '로그아웃',\n sessions: '활성 세션',\n },\n ja: {\n welcomeBack: 'おかえりなさい',\n createAccount: 'アカウントを作成',\n alreadyHaveAccount: 'すでにアカウントをお持ちですか?',\n dontHaveAccount: 'アカウントをお持ちでないですか?',\n signIn: 'ログイン',\n signUp: '新規登録',\n or: 'または',\n emailAddress: 'メールアドレス',\n password: 'パスワード',\n passwordHint: '大文字、小文字、数字を含む(8文字以上)',\n continueWith: 'で続行',\n connectWallet: 'ウォレット接続',\n magicLink: 'マジックリンクで続行',\n passkey: 'パスキーでログイン',\n securedBy: 'セキュリティ提供',\n backToSignIn: 'ログインに戻る',\n profile: 'プロフィール',\n editProfile: 'プロフィール編集',\n displayName: '表示名',\n save: '保存',\n signOut: 'サインアウト',\n sessions: 'アクティブセッション',\n },\n 'zh-CN': {\n welcomeBack: '欢迎回来',\n createAccount: '创建账户',\n alreadyHaveAccount: '已有账户?',\n dontHaveAccount: '没有账户?',\n signIn: '登录',\n signUp: '注册',\n or: '或',\n emailAddress: '邮箱地址',\n password: '密码',\n passwordHint: '需包含大写、小写字母和数字(至少8位)',\n continueWith: '继续使用',\n connectWallet: '连接钱包',\n magicLink: '使用魔法链接继续',\n passkey: '使用通行密钥登录',\n securedBy: '安全保障',\n backToSignIn: '返回登录',\n profile: '个人资料',\n editProfile: '编辑资料',\n displayName: '显示名称',\n save: '保存',\n signOut: '退出登录',\n sessions: '活跃会话',\n },\n 'zh-TW': {\n welcomeBack: '歡迎回來',\n createAccount: '建立帳戶',\n alreadyHaveAccount: '已有帳戶?',\n dontHaveAccount: '沒有帳戶?',\n signIn: '登入',\n signUp: '註冊',\n or: '或',\n emailAddress: '電子郵件',\n password: '密碼',\n passwordHint: '需包含大寫、小寫字母和數字(至少8位)',\n continueWith: '繼續使用',\n connectWallet: '連接錢包',\n magicLink: '使用魔法連結繼續',\n passkey: '使用通行金鑰登入',\n securedBy: '安全保障',\n backToSignIn: '返回登入',\n profile: '個人資料',\n editProfile: '編輯資料',\n displayName: '顯示名稱',\n save: '儲存',\n signOut: '登出',\n sessions: '活躍工作階段',\n },\n 'pt-BR': {\n welcomeBack: 'Bem-vindo de volta',\n createAccount: 'Crie sua conta',\n alreadyHaveAccount: 'Ja tem uma conta?',\n dontHaveAccount: 'Nao tem uma conta?',\n signIn: 'Entrar',\n signUp: 'Cadastrar',\n or: 'ou',\n emailAddress: 'Endereco de e-mail',\n password: 'Senha',\n passwordHint: 'Deve conter maiusculas, minusculas e numeros (min 8 caracteres)',\n continueWith: 'Continuar com',\n connectWallet: 'Conectar carteira',\n magicLink: 'Continuar com Magic Link',\n passkey: 'Entrar com Passkey',\n securedBy: 'Protegido por',\n backToSignIn: 'Voltar ao login',\n profile: 'Perfil',\n editProfile: 'Editar perfil',\n displayName: 'Nome de exibicao',\n save: 'Salvar',\n signOut: 'Sair',\n sessions: 'Sessoes ativas',\n },\n es: {\n welcomeBack: 'Bienvenido de nuevo',\n createAccount: 'Crea tu cuenta',\n alreadyHaveAccount: 'Ya tienes una cuenta?',\n dontHaveAccount: 'No tienes una cuenta?',\n signIn: 'Iniciar sesion',\n signUp: 'Registrarse',\n or: 'o',\n emailAddress: 'Correo electronico',\n password: 'Contrasena',\n passwordHint: 'Debe contener mayusculas, minusculas y numeros (min 8 caracteres)',\n continueWith: 'Continuar con',\n connectWallet: 'Conectar billetera',\n magicLink: 'Continuar con Magic Link',\n passkey: 'Iniciar con Passkey',\n securedBy: 'Protegido por',\n backToSignIn: 'Volver al inicio de sesion',\n profile: 'Perfil',\n editProfile: 'Editar perfil',\n displayName: 'Nombre de visualizacion',\n save: 'Guardar',\n signOut: 'Cerrar sesion',\n sessions: 'Sesiones activas',\n },\n de: {\n welcomeBack: 'Willkommen zuruck',\n createAccount: 'Konto erstellen',\n alreadyHaveAccount: 'Bereits ein Konto?',\n dontHaveAccount: 'Noch kein Konto?',\n signIn: 'Anmelden',\n signUp: 'Registrieren',\n or: 'oder',\n emailAddress: 'E-Mail-Adresse',\n password: 'Passwort',\n passwordHint: 'Gross-/Kleinbuchstaben und Zahl erforderlich (mind. 8 Zeichen)',\n continueWith: 'Weiter mit',\n connectWallet: 'Wallet verbinden',\n magicLink: 'Weiter mit Magic Link',\n passkey: 'Mit Passkey anmelden',\n securedBy: 'Gesichert durch',\n backToSignIn: 'Zuruck zur Anmeldung',\n profile: 'Profil',\n editProfile: 'Profil bearbeiten',\n displayName: 'Anzeigename',\n save: 'Speichern',\n signOut: 'Abmelden',\n sessions: 'Aktive Sitzungen',\n },\n fr: {\n welcomeBack: 'Bon retour',\n createAccount: 'Creez votre compte',\n alreadyHaveAccount: 'Vous avez deja un compte ?',\n dontHaveAccount: \"Vous n'avez pas de compte ?\",\n signIn: 'Se connecter',\n signUp: \"S'inscrire\",\n or: 'ou',\n emailAddress: 'Adresse e-mail',\n password: 'Mot de passe',\n passwordHint: 'Doit contenir majuscules, minuscules et chiffres (min 8 caracteres)',\n continueWith: 'Continuer avec',\n connectWallet: 'Connecter le portefeuille',\n magicLink: 'Continuer avec Magic Link',\n passkey: 'Se connecter avec Passkey',\n securedBy: 'Securise par',\n backToSignIn: 'Retour a la connexion',\n profile: 'Profil',\n editProfile: 'Modifier le profil',\n displayName: \"Nom d'affichage\",\n save: 'Enregistrer',\n signOut: 'Se deconnecter',\n sessions: 'Sessions actives',\n },\n hi: {\n welcomeBack: 'वापसी पर स्वागत है',\n createAccount: 'अपना खाता बनाएं',\n alreadyHaveAccount: 'पहले से खाता है?',\n dontHaveAccount: 'खाता नहीं है?',\n signIn: 'साइन इन',\n signUp: 'साइन अप',\n or: 'या',\n emailAddress: 'ईमेल पता',\n password: 'पासवर्ड',\n passwordHint: 'बड़े, छोटे अक्षर और संख्या आवश्यक (कम से कम 8 अक्षर)',\n continueWith: 'से जारी रखें',\n connectWallet: 'वॉलेट कनेक्ट करें',\n magicLink: 'मैजिक लिंक से जारी रखें',\n passkey: 'पासकी से साइन इन',\n securedBy: 'सुरक्षा प्रदाता',\n backToSignIn: 'साइन इन पर वापस जाएं',\n profile: 'प्रोफ़ाइल',\n editProfile: 'प्रोफ़ाइल संपादित करें',\n displayName: 'प्रदर्शन नाम',\n save: 'सहेजें',\n signOut: 'साइन आउट',\n sessions: 'सक्रिय सत्र',\n },\n tr: {\n welcomeBack: 'Tekrar hos geldiniz',\n createAccount: 'Hesap olusturun',\n alreadyHaveAccount: 'Zaten bir hesabiniz var mi?',\n dontHaveAccount: 'Hesabiniz yok mu?',\n signIn: 'Giris yap',\n signUp: 'Kaydol',\n or: 'veya',\n emailAddress: 'E-posta adresi',\n password: 'Sifre',\n passwordHint: 'Buyuk, kucuk harf ve rakam icermeli (en az 8 karakter)',\n continueWith: 'ile devam et',\n connectWallet: 'Cuzdan bagla',\n magicLink: 'Magic Link ile devam et',\n passkey: 'Passkey ile giris yap',\n securedBy: 'Guvenlik saglayici',\n backToSignIn: 'Girise don',\n profile: 'Profil',\n editProfile: 'Profili duzenle',\n displayName: 'Goruntu adi',\n save: 'Kaydet',\n signOut: 'Cikis yap',\n sessions: 'Aktif oturumlar',\n },\n id: {\n welcomeBack: 'Selamat datang kembali',\n createAccount: 'Buat akun Anda',\n alreadyHaveAccount: 'Sudah punya akun?',\n dontHaveAccount: 'Belum punya akun?',\n signIn: 'Masuk',\n signUp: 'Daftar',\n or: 'atau',\n emailAddress: 'Alamat email',\n password: 'Kata sandi',\n passwordHint: 'Harus mengandung huruf besar, kecil, dan angka (min 8 karakter)',\n continueWith: 'Lanjutkan dengan',\n connectWallet: 'Hubungkan dompet',\n magicLink: 'Lanjutkan dengan Magic Link',\n passkey: 'Masuk dengan Passkey',\n securedBy: 'Diamankan oleh',\n backToSignIn: 'Kembali ke login',\n profile: 'Profil',\n editProfile: 'Edit profil',\n displayName: 'Nama tampilan',\n save: 'Simpan',\n signOut: 'Keluar',\n sessions: 'Sesi aktif',\n },\n vi: {\n welcomeBack: 'Chao mung tro lai',\n createAccount: 'Tao tai khoan',\n alreadyHaveAccount: 'Da co tai khoan?',\n dontHaveAccount: 'Chua co tai khoan?',\n signIn: 'Dang nhap',\n signUp: 'Dang ky',\n or: 'hoac',\n emailAddress: 'Dia chi email',\n password: 'Mat khau',\n passwordHint: 'Can chu hoa, chu thuong va so (toi thieu 8 ky tu)',\n continueWith: 'Tiep tuc voi',\n connectWallet: 'Ket noi vi',\n magicLink: 'Tiep tuc voi Magic Link',\n passkey: 'Dang nhap voi Passkey',\n securedBy: 'Bao mat boi',\n backToSignIn: 'Quay lai dang nhap',\n profile: 'Ho so',\n editProfile: 'Chinh sua ho so',\n displayName: 'Ten hien thi',\n save: 'Luu',\n signOut: 'Dang xuat',\n sessions: 'Phien dang nhap hoat dong',\n },\n th: {\n welcomeBack: 'ยินดีต้อนรับกลับ',\n createAccount: 'สร้างบัญชี',\n alreadyHaveAccount: 'มีบัญชีอยู่แล้ว?',\n dontHaveAccount: 'ยังไม่มีบัญชี?',\n signIn: 'เข้าสู่ระบบ',\n signUp: 'สมัครสมาชิก',\n or: 'หรือ',\n emailAddress: 'อีเมล',\n password: 'รหัสผ่าน',\n passwordHint: 'ต้องมีตัวพิมพ์ใหญ่ ตัวพิมพ์เล็ก และตัวเลข (อย่างน้อย 8 ตัว)',\n continueWith: 'ดำเนินการต่อด้วย',\n connectWallet: 'เชื่อมต่อกระเป๋า',\n magicLink: 'ดำเนินการต่อด้วย Magic Link',\n passkey: 'เข้าสู่ระบบด้วย Passkey',\n securedBy: 'รักษาความปลอดภัยโดย',\n backToSignIn: 'กลับไปเข้าสู่ระบบ',\n profile: 'โปรไฟล์',\n editProfile: 'แก้ไขโปรไฟล์',\n displayName: 'ชื่อที่แสดง',\n save: 'บันทึก',\n signOut: 'ออกจากระบบ',\n sessions: 'เซสชันที่ใช้งานอยู่',\n },\n ru: {\n welcomeBack: 'С возвращением',\n createAccount: 'Создайте аккаунт',\n alreadyHaveAccount: 'Уже есть аккаунт?',\n dontHaveAccount: 'Нет аккаунта?',\n signIn: 'Войти',\n signUp: 'Зарегистрироваться',\n or: 'или',\n emailAddress: 'Электронная почта',\n password: 'Пароль',\n passwordHint: 'Заглавные, строчные буквы и цифры (мин. 8 символов)',\n continueWith: 'Продолжить с',\n connectWallet: 'Подключить кошелек',\n magicLink: 'Продолжить с Magic Link',\n passkey: 'Войти с Passkey',\n securedBy: 'Защищено',\n backToSignIn: 'Вернуться к входу',\n profile: 'Профиль',\n editProfile: 'Редактировать профиль',\n displayName: 'Отображаемое имя',\n save: 'Сохранить',\n signOut: 'Выйти',\n sessions: 'Активные сеансы',\n },\n it: {\n welcomeBack: 'Bentornato',\n createAccount: 'Crea il tuo account',\n alreadyHaveAccount: 'Hai gia un account?',\n dontHaveAccount: 'Non hai un account?',\n signIn: 'Accedi',\n signUp: 'Registrati',\n or: 'o',\n emailAddress: 'Indirizzo email',\n password: 'Password',\n passwordHint: 'Deve contenere maiuscole, minuscole e numeri (min 8 caratteri)',\n continueWith: 'Continua con',\n connectWallet: 'Connetti portafoglio',\n magicLink: 'Continua con Magic Link',\n passkey: 'Accedi con Passkey',\n securedBy: 'Protetto da',\n backToSignIn: \"Torna all'accesso\",\n profile: 'Profilo',\n editProfile: 'Modifica profilo',\n displayName: 'Nome visualizzato',\n save: 'Salva',\n signOut: 'Esci',\n sessions: 'Sessioni attive',\n },\n pl: {\n welcomeBack: 'Witaj ponownie',\n createAccount: 'Utworz konto',\n alreadyHaveAccount: 'Masz juz konto?',\n dontHaveAccount: 'Nie masz konta?',\n signIn: 'Zaloguj sie',\n signUp: 'Zarejestruj sie',\n or: 'lub',\n emailAddress: 'Adres e-mail',\n password: 'Haslo',\n passwordHint: 'Wielkie, male litery i cyfry (min 8 znakow)',\n continueWith: 'Kontynuuj z',\n connectWallet: 'Polacz portfel',\n magicLink: 'Kontynuuj z Magic Link',\n passkey: 'Zaloguj sie z Passkey',\n securedBy: 'Zabezpieczone przez',\n backToSignIn: 'Powrot do logowania',\n profile: 'Profil',\n editProfile: 'Edytuj profil',\n displayName: 'Nazwa wyswietlana',\n save: 'Zapisz',\n signOut: 'Wyloguj sie',\n sessions: 'Aktywne sesje',\n },\n nl: {\n welcomeBack: 'Welkom terug',\n createAccount: 'Maak je account aan',\n alreadyHaveAccount: 'Heb je al een account?',\n dontHaveAccount: 'Nog geen account?',\n signIn: 'Inloggen',\n signUp: 'Registreren',\n or: 'of',\n emailAddress: 'E-mailadres',\n password: 'Wachtwoord',\n passwordHint: 'Hoofdletters, kleine letters en cijfers vereist (min 8 tekens)',\n continueWith: 'Doorgaan met',\n connectWallet: 'Portemonnee verbinden',\n magicLink: 'Doorgaan met Magic Link',\n passkey: 'Inloggen met Passkey',\n securedBy: 'Beveiligd door',\n backToSignIn: 'Terug naar inloggen',\n profile: 'Profiel',\n editProfile: 'Profiel bewerken',\n displayName: 'Weergavenaam',\n save: 'Opslaan',\n signOut: 'Uitloggen',\n sessions: 'Actieve sessies',\n },\n ar: {\n welcomeBack: 'مرحبًا بعودتك',\n createAccount: 'أنشئ حسابك',\n alreadyHaveAccount: 'لديك حساب بالفعل؟',\n dontHaveAccount: 'ليس لديك حساب؟',\n signIn: 'تسجيل الدخول',\n signUp: 'إنشاء حساب',\n or: 'أو',\n emailAddress: 'البريد الإلكتروني',\n password: 'كلمة المرور',\n passwordHint: 'يجب أن تحتوي على أحرف كبيرة وصغيرة وأرقام (8 أحرف على الأقل)',\n continueWith: 'المتابعة باستخدام',\n connectWallet: 'ربط المحفظة',\n magicLink: 'المتابعة باستخدام Magic Link',\n passkey: 'تسجيل الدخول باستخدام Passkey',\n securedBy: 'محمي بواسطة',\n backToSignIn: 'العودة لتسجيل الدخول',\n profile: 'الملف الشخصي',\n editProfile: 'تعديل الملف الشخصي',\n displayName: 'الاسم المعروض',\n save: 'حفظ',\n signOut: 'تسجيل الخروج',\n sessions: 'الجلسات النشطة',\n },\n sv: {\n welcomeBack: 'Valkommen tillbaka',\n createAccount: 'Skapa ditt konto',\n alreadyHaveAccount: 'Har du redan ett konto?',\n dontHaveAccount: 'Har du inget konto?',\n signIn: 'Logga in',\n signUp: 'Registrera dig',\n or: 'eller',\n emailAddress: 'E-postadress',\n password: 'Losenord',\n passwordHint: 'Stora, sma bokstaver och siffror kravs (minst 8 tecken)',\n continueWith: 'Fortsatt med',\n connectWallet: 'Anslut planbok',\n magicLink: 'Fortsatt med Magic Link',\n passkey: 'Logga in med Passkey',\n securedBy: 'Sakrad av',\n backToSignIn: 'Tillbaka till inloggning',\n profile: 'Profil',\n editProfile: 'Redigera profil',\n displayName: 'Visningsnamn',\n save: 'Spara',\n signOut: 'Logga ut',\n sessions: 'Aktiva sessioner',\n },\n uk: {\n welcomeBack: 'З поверненням',\n createAccount: 'Створіть обліковий запис',\n alreadyHaveAccount: 'Вже є обліковий запис?',\n dontHaveAccount: 'Немає облікового запису?',\n signIn: 'Увійти',\n signUp: 'Зареєструватися',\n or: 'або',\n emailAddress: 'Електронна пошта',\n password: 'Пароль',\n passwordHint: 'Великі, малі літери та цифри (мін. 8 символів)',\n continueWith: 'Продовжити з',\n connectWallet: \"Підключити гаманець\",\n magicLink: 'Продовжити з Magic Link',\n passkey: 'Увійти з Passkey',\n securedBy: 'Захищено',\n backToSignIn: 'Повернутися до входу',\n profile: 'Профіль',\n editProfile: 'Редагувати профіль',\n displayName: 'Відображуване ім\\'я',\n save: 'Зберегти',\n signOut: 'Вийти',\n sessions: 'Активні сеанси',\n },\n} as const;\n\nexport interface TranslationStrings {\n welcomeBack: string;\n createAccount: string;\n alreadyHaveAccount: string;\n dontHaveAccount: string;\n signIn: string;\n signUp: string;\n or: string;\n emailAddress: string;\n password: string;\n passwordHint: string;\n continueWith: string;\n connectWallet: string;\n magicLink: string;\n passkey: string;\n securedBy: string;\n backToSignIn: string;\n profile: string;\n editProfile: string;\n displayName: string;\n save: string;\n signOut: string;\n sessions: string;\n}\n\nexport function getStrings(locale: string): TranslationStrings {\n if (locale in translations) return translations[locale as AuthonLocale];\n const lang = locale.split('-')[0].split('_')[0];\n if (lang in translations) return translations[lang as AuthonLocale];\n return translations.en;\n}\n","import type { BrandingConfig, OAuthProviderType } from '@authon/shared';\nimport { DEFAULT_BRANDING } from '@authon/shared';\nimport { getProviderButtonConfig } from './providers';\nimport { getStrings, type TranslationStrings } from './i18n';\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 // i18n\n private t: TranslationStrings;\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 locale?: string;\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.t = getStrings(options.locale || 'en');\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 this.setSubmitLoading(false);\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 setSubmitLoading(loading: boolean): void {\n if (!this.shadowRoot) return;\n const btn = this.shadowRoot.querySelector('.submit-btn') as HTMLButtonElement | null;\n if (!btn) return;\n if (loading) {\n btn.dataset.originalText = btn.textContent || '';\n btn.innerHTML = '<span style=\"display:inline-flex;align-items:center;gap:6px\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" style=\"animation:spin 0.8s linear infinite\"><circle cx=\"7\" cy=\"7\" r=\"5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" opacity=\"0.3\"/><path d=\"M7 2a5 5 0 0 1 5 5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/></svg></span>';\n btn.disabled = true;\n btn.style.opacity = '0.7';\n } else {\n btn.innerHTML = btn.dataset.originalText || 'Continue';\n btn.disabled = false;\n btn.style.opacity = '1';\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 showVerificationInput(\n email: string,\n onVerify: (code: string) => Promise<void>,\n onResend: () => Promise<void>,\n ): void {\n if (!this.shadowRoot) return;\n const inner = this.shadowRoot.querySelector('.modal-inner');\n if (!inner) return;\n\n inner.innerHTML = `\n <div style=\"text-align:center;padding:8px 0\">\n <div style=\"width:48px;height:48px;border-radius:12px;background:color-mix(in srgb, var(--authon-primary-start) 15%, transparent);display:flex;align-items:center;justify-content:center;margin:0 auto 16px\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--authon-primary-start)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z\"/><polyline points=\"22,6 12,13 2,6\"/></svg>\n </div>\n <h2 class=\"title\" style=\"font-size:20px;margin-bottom:4px\">${this.t.welcomeBack.includes('Welcome') ? 'Check your email' : this.t.welcomeBack}</h2>\n <p style=\"font-size:13px;color:var(--authon-muted);margin-bottom:20px\">${email}</p>\n </div>\n <div class=\"email-form\" id=\"verify-form\">\n <input type=\"text\" id=\"verify-code\" class=\"input\" placeholder=\"000000\" maxlength=\"6\" inputmode=\"numeric\" autocomplete=\"one-time-code\" style=\"text-align:center;font-size:20px;letter-spacing:0.2em;font-family:ui-monospace,monospace\" />\n <button type=\"button\" id=\"verify-submit\" class=\"submit-btn\">${this.t.signIn}</button>\n </div>\n <p style=\"text-align:center;margin-top:12px;font-size:12px;color:var(--authon-dim)\">\n <a href=\"#\" id=\"resend-link\" style=\"color:var(--authon-primary-start);text-decoration:none;font-weight:500\">${this.t.backToSignIn.includes('Back') ? 'Resend code' : this.t.backToSignIn}</a>\n </p>\n `;\n\n const codeInput = this.shadowRoot.getElementById('verify-code') as HTMLInputElement;\n const submitBtn = this.shadowRoot.getElementById('verify-submit');\n const resendLink = this.shadowRoot.getElementById('resend-link');\n\n codeInput?.focus();\n codeInput?.addEventListener('input', () => {\n codeInput.value = codeInput.value.replace(/\\D/g, '').slice(0, 6);\n });\n\n submitBtn?.addEventListener('click', async () => {\n const code = codeInput?.value?.trim();\n if (!code || code.length < 6) return;\n submitBtn.textContent = '...';\n (submitBtn as HTMLButtonElement).disabled = true;\n await onVerify(code);\n });\n\n codeInput?.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') submitBtn?.click();\n });\n\n resendLink?.addEventListener('click', async (e) => {\n e.preventDefault();\n resendLink.textContent = '...';\n await onResend();\n resendLink.textContent = 'Sent!';\n setTimeout(() => { resendLink.textContent = 'Resend code'; }, 2000);\n });\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 ? this.t.createAccount : this.t.welcomeBack;\n const subtitle = isSignUp ? this.t.alreadyHaveAccount : this.t.dontHaveAccount;\n const subtitleLink = isSignUp ? this.t.signIn : this.t.signUp;\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>${this.t.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=\"${this.t.emailAddress}\" name=\"email\" required class=\"input\" autocomplete=\"email\" />\n <input type=\"password\" placeholder=\"${this.t.password}\" name=\"password\" required class=\"input\" autocomplete=\"${isSignUp ? 'new-password' : 'current-password'}\" />\n ${isSignUp ? `<p class=\"password-hint\">${this.t.passwordHint}</p>` : ''}\n <button type=\"submit\" class=\"submit-btn\">${isSignUp ? this.t.signUp : this.t.signIn}</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>${this.t.connectWallet}</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>${this.t.magicLink}</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>${this.t.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\">${this.t.securedBy} <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, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\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 this.setSubmitLoading(true);\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, BrandingConfig, SessionInfo } from '@authon/shared';\nimport { DEFAULT_BRANDING } from '@authon/shared';\nimport { getStrings, type TranslationStrings } from './i18n';\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\nfunction formatRelativeTime(dateStr: string | null): string {\n if (!dateStr) return '—';\n const diff = Date.now() - new Date(dateStr).getTime();\n const minutes = Math.floor(diff / 60000);\n if (minutes < 1) return 'just now';\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n}\n\nfunction parseUserAgent(ua: string | null): string {\n if (!ua) return 'Unknown device';\n if (/iPhone|iPad/.test(ua)) return 'iOS';\n if (/Android/.test(ua)) return 'Android';\n if (/Windows/.test(ua)) return 'Windows';\n if (/Macintosh|Mac OS/.test(ua)) return 'macOS';\n if (/Linux/.test(ua)) return 'Linux';\n return 'Unknown device';\n}\n\nexport class ProfileRenderer {\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 t: TranslationStrings;\n\n private user: AuthonUser;\n private sessions: SessionInfo[];\n private isEditMode: boolean = false;\n\n private onSave: (data: { displayName?: string; avatarUrl?: string }) => Promise<void>;\n private onSignOut: () => Promise<void>;\n private onRevokeSession: (sessionId: string) => Promise<void>;\n private onClose: () => void;\n\n private escHandler: ((e: KeyboardEvent) => void) | null = null;\n\n constructor(options: {\n mode: 'popup' | 'embedded';\n theme?: 'light' | 'dark' | 'auto';\n containerId?: string;\n branding?: BrandingConfig;\n locale?: string;\n user: AuthonUser;\n sessions?: SessionInfo[];\n onSave: (data: { displayName?: string; avatarUrl?: string }) => Promise<void>;\n onSignOut: () => Promise<void>;\n onRevokeSession: (sessionId: string) => Promise<void>;\n onClose: () => void;\n }) {\n this.mode = options.mode;\n this.theme = options.theme || 'auto';\n this.branding = { ...DEFAULT_BRANDING, ...options.branding };\n this.t = getStrings(options.locale || 'en');\n this.user = options.user;\n this.sessions = options.sessions || [];\n this.onSave = options.onSave;\n this.onSignOut = options.onSignOut;\n this.onRevokeSession = options.onRevokeSession;\n this.onClose = options.onClose;\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 this.hostElement?.remove();\n this.hostElement = null;\n this.shadowRoot = null;\n }\n this.containerElement = next;\n return next;\n }\n\n open(): 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 this.rerender();\n } else {\n this.isEditMode = false;\n this.render();\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 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 }\n\n updateUser(user: AuthonUser): void {\n this.user = user;\n if (this.shadowRoot) this.rerender();\n }\n\n updateSessions(sessions: SessionInfo[]): void {\n this.sessions = sessions;\n if (this.shadowRoot) this.rerender();\n }\n\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 showSaving(): void {\n if (!this.shadowRoot) return;\n const btn = this.shadowRoot.getElementById('profile-save-btn') as HTMLButtonElement | null;\n if (btn) {\n btn.disabled = true;\n btn.textContent = '...';\n }\n }\n\n showSaveError(message: string): void {\n if (!this.shadowRoot) return;\n const btn = this.shadowRoot.getElementById('profile-save-btn') as HTMLButtonElement | null;\n if (btn) {\n btn.disabled = false;\n btn.textContent = this.t.save;\n }\n this.showInlineError('profile-error', message);\n }\n\n private showInlineError(id: string, message: string): void {\n if (!this.shadowRoot) return;\n this.shadowRoot.getElementById(id)?.remove();\n const errEl = document.createElement('div');\n errEl.id = id;\n errEl.className = 'error-msg';\n errEl.textContent = message;\n this.shadowRoot.querySelector('.profile-actions')?.appendChild(errEl);\n }\n\n private updateThemeCSS(): void {\n if (!this.shadowRoot) return;\n const styleEl = this.shadowRoot.getElementById('authon-profile-theme-style');\n if (styleEl) styleEl.textContent = this.buildCSS();\n }\n\n private startThemeObserver(): void {\n this.stopThemeObserver();\n if (typeof document === 'undefined' || typeof window === 'undefined') return;\n\n this.themeObserver = new MutationObserver(() => this.updateThemeCSS());\n this.themeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme', 'class'],\n });\n\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 private isDark(): boolean {\n if (this.theme === 'dark') return true;\n if (this.theme === 'light') return false;\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 render(): void {\n const host = document.createElement('div');\n host.setAttribute('data-authon-profile', '');\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 profile 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();\n this.attachEvents();\n\n if (this.mode === 'popup') {\n this.escHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') { this.onClose(); this.close(); }\n };\n document.addEventListener('keydown', this.escHandler);\n }\n\n if (this.theme === 'auto') this.startThemeObserver();\n }\n\n private rerender(): void {\n if (!this.shadowRoot) return;\n const inner = this.shadowRoot.getElementById('profile-inner');\n if (!inner) return;\n inner.style.opacity = '0';\n inner.style.transform = 'translateY(-4px)';\n setTimeout(() => {\n inner.innerHTML = this.buildInnerContent();\n this.attachInnerEvents();\n void inner.offsetHeight;\n inner.style.opacity = '1';\n inner.style.transform = 'translateY(0)';\n }, 120);\n }\n\n private buildShell(): string {\n const popupWrapper = this.mode === 'popup'\n ? `<div class=\"backdrop\" id=\"profile-backdrop\"></div>`\n : '';\n\n return `\n <style id=\"authon-profile-theme-style\">${this.buildCSS()}</style>\n ${popupWrapper}\n <div class=\"profile-container\" role=\"dialog\" aria-modal=\"true\" aria-label=\"${this.t.profile}\">\n <div id=\"profile-inner\" class=\"profile-inner\">\n ${this.buildInnerContent()}\n </div>\n </div>\n `;\n }\n\n private buildInnerContent(): string {\n const u = this.user;\n const initials = (u.displayName || u.email || '?')\n .split(/\\s+/)\n .map((w) => w[0]?.toUpperCase() ?? '')\n .slice(0, 2)\n .join('');\n\n const avatarHtml = u.avatarUrl\n ? `<img class=\"avatar-img\" src=\"${u.avatarUrl}\" alt=\"${u.displayName || ''}\" />`\n : `<div class=\"avatar-placeholder\">${initials}</div>`;\n\n const closeBtn = this.mode === 'popup'\n ? `<button class=\"close-btn\" id=\"profile-close-btn\" aria-label=\"Close\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M12 4L4 12M4 4l8 8\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"/>\n </svg>\n </button>`\n : '';\n\n if (this.isEditMode) {\n return this.buildEditContent(avatarHtml, closeBtn);\n }\n\n return this.buildViewContent(avatarHtml, closeBtn, u);\n }\n\n private buildViewContent(avatarHtml: string, closeBtn: string, u: AuthonUser): string {\n const sessionsHtml = this.sessions.length > 0\n ? `<div class=\"section\">\n <div class=\"section-label\">${this.t.sessions}</div>\n <div class=\"sessions-list\">\n ${this.sessions.map((s) => `\n <div class=\"session-item\" data-session-id=\"${s.id}\">\n <div class=\"session-info\">\n <span class=\"session-device\">${parseUserAgent(s.userAgent)}</span>\n <span class=\"session-meta\">${s.ipAddress || ''} &middot; ${formatRelativeTime(s.lastActiveAt)}</span>\n </div>\n <button class=\"session-revoke-btn\" data-session-id=\"${s.id}\" aria-label=\"Revoke session\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M10.5 3.5L3.5 10.5M3.5 3.5l7 7\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\n </svg>\n </button>\n </div>\n `).join('')}\n </div>\n </div>`\n : '';\n\n return `\n <div class=\"profile-header\">\n <div class=\"avatar-wrap\">${avatarHtml}</div>\n <div class=\"header-text\">\n <div class=\"display-name\">${u.displayName || '—'}</div>\n <div class=\"email\">${u.email || '—'}</div>\n </div>\n ${closeBtn}\n </div>\n\n <div class=\"section\">\n <div class=\"field-row\">\n <span class=\"field-label\">${this.t.emailAddress}</span>\n <span class=\"field-value readonly\">${u.email || '—'}</span>\n </div>\n <div class=\"field-row\">\n <span class=\"field-label\">${this.t.displayName}</span>\n <span class=\"field-value\">${u.displayName || '—'}</span>\n </div>\n </div>\n\n ${sessionsHtml}\n\n <div class=\"profile-actions\">\n <button class=\"edit-btn\" id=\"profile-edit-btn\">${this.t.editProfile}</button>\n <button class=\"signout-btn\" id=\"profile-signout-btn\">${this.t.signOut}</button>\n </div>\n `;\n }\n\n private buildEditContent(avatarHtml: string, closeBtn: string): string {\n const u = this.user;\n return `\n <div class=\"profile-header\">\n <div class=\"avatar-wrap\">${avatarHtml}</div>\n <div class=\"header-text\">\n <div class=\"display-name\">${this.t.editProfile}</div>\n <div class=\"email\">${u.email || '—'}</div>\n </div>\n ${closeBtn}\n </div>\n\n <div class=\"section\">\n <div class=\"field-group\">\n <label class=\"field-label\" for=\"profile-displayname-input\">${this.t.displayName}</label>\n <input\n id=\"profile-displayname-input\"\n class=\"input\"\n type=\"text\"\n value=\"${u.displayName || ''}\"\n placeholder=\"${this.t.displayName}\"\n autocomplete=\"name\"\n />\n </div>\n <div class=\"field-group\">\n <label class=\"field-label\" for=\"profile-avatar-input\">Avatar URL</label>\n <input\n id=\"profile-avatar-input\"\n class=\"input\"\n type=\"url\"\n value=\"${u.avatarUrl || ''}\"\n placeholder=\"https://...\"\n autocomplete=\"off\"\n />\n </div>\n <div class=\"field-group\">\n <label class=\"field-label\">${this.t.emailAddress}</label>\n <input class=\"input readonly\" type=\"email\" value=\"${u.email || ''}\" disabled />\n </div>\n </div>\n\n <div class=\"profile-actions\">\n <button class=\"save-btn\" id=\"profile-save-btn\">${this.t.save}</button>\n <button class=\"cancel-btn\" id=\"profile-cancel-btn\">Cancel</button>\n </div>\n `;\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 const sectionBg = dark ? '#1e293b' : '#f9fafb';\n const sessionItemBg = dark ? '#263148' : '#f3f4f6';\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-section-bg: ${sectionBg};\n --authon-session-bg: ${sessionItemBg};\n --authon-backdrop-bg: rgba(0,0,0,${dark ? '0.7' : '0.5'});\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\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\n .profile-container {\n ${this.mode === 'popup'\n ? 'position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 99999; max-height: 90vh; overflow-y: auto;'\n : ''}\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: 24px;\n width: 380px; max-width: 100%;\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\n .profile-inner {\n transition: opacity 0.12s ease, transform 0.12s ease;\n }\n\n .profile-header {\n display: flex;\n align-items: center;\n gap: 14px;\n margin-bottom: 20px;\n position: relative;\n }\n\n .avatar-wrap { flex-shrink: 0; }\n\n .avatar-img {\n width: 52px; height: 52px;\n border-radius: 50%;\n object-fit: cover;\n border: 2px solid var(--authon-border);\n }\n\n .avatar-placeholder {\n width: 52px; height: 52px;\n border-radius: 50%;\n background: linear-gradient(135deg, var(--authon-primary-start), var(--authon-primary-end));\n display: flex; align-items: center; justify-content: center;\n font-size: 18px; font-weight: 700; color: #fff;\n flex-shrink: 0;\n }\n\n .header-text { flex: 1; min-width: 0; }\n\n .display-name {\n font-size: 16px; font-weight: 600;\n color: var(--authon-text);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n }\n\n .email {\n font-size: 13px; color: var(--authon-muted);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n margin-top: 2px;\n }\n\n .close-btn {\n position: absolute; top: 0; right: 0;\n background: none; border: none;\n color: var(--authon-muted); cursor: pointer;\n padding: 4px; border-radius: 6px;\n display: flex; align-items: center; justify-content: center;\n transition: color 0.15s, background 0.15s;\n }\n .close-btn:hover { color: var(--authon-text); background: var(--authon-divider); }\n\n .section {\n background: var(--authon-section-bg);\n border: 1px solid var(--authon-border);\n border-radius: calc(var(--authon-radius) * 0.67);\n padding: 12px 14px;\n margin-bottom: 12px;\n display: flex; flex-direction: column; gap: 10px;\n }\n\n .section-label {\n font-size: 11px; font-weight: 600;\n text-transform: uppercase; letter-spacing: 0.05em;\n color: var(--authon-dim); margin-bottom: 2px;\n }\n\n .field-row {\n display: flex; align-items: center; justify-content: space-between; gap: 8px;\n }\n\n .field-label {\n font-size: 12px; color: var(--authon-muted); flex-shrink: 0;\n }\n\n .field-value {\n font-size: 13px; color: var(--authon-text);\n text-align: right; min-width: 0;\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n }\n\n .field-value.readonly { color: var(--authon-dim); }\n\n .field-group {\n display: flex; flex-direction: column; gap: 4px;\n }\n\n .input {\n width: 100%; padding: 9px 12px;\n background: var(--authon-input-bg);\n color: var(--authon-text);\n border: 1px solid var(--authon-border);\n border-radius: calc(var(--authon-radius) * 0.5);\n font-size: 13px; 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 ${hexToRgba(b.primaryColorStart || '#7c3aed', 0.15)}; }\n .input.readonly, .input:disabled { color: var(--authon-dim); cursor: not-allowed; background: var(--authon-section-bg); }\n\n .sessions-list { display: flex; flex-direction: column; gap: 6px; }\n\n .session-item {\n display: flex; align-items: center; justify-content: space-between;\n background: var(--authon-session-bg);\n border-radius: calc(var(--authon-radius) * 0.5);\n padding: 8px 10px; gap: 8px;\n }\n\n .session-info { display: flex; flex-direction: column; gap: 2px; min-width: 0; }\n\n .session-device {\n font-size: 13px; font-weight: 500; color: var(--authon-text);\n }\n\n .session-meta {\n font-size: 11px; color: var(--authon-dim);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n }\n\n .session-revoke-btn {\n background: none; border: none;\n color: var(--authon-dim); cursor: pointer;\n padding: 4px; border-radius: 4px; flex-shrink: 0;\n display: flex; align-items: center; justify-content: center;\n transition: color 0.15s, background 0.15s;\n }\n .session-revoke-btn:hover { color: #ef4444; background: rgba(239,68,68,0.1); }\n\n .profile-actions {\n display: flex; flex-direction: column; gap: 8px;\n margin-top: 4px;\n }\n\n .edit-btn {\n width: 100%; padding: 10px;\n background: linear-gradient(135deg, var(--authon-primary-start), var(--authon-primary-end));\n color: #fff; border: none;\n 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 .edit-btn:hover { opacity: 0.9; }\n\n .save-btn {\n width: 100%; padding: 10px;\n background: linear-gradient(135deg, var(--authon-primary-start), var(--authon-primary-end));\n color: #fff; border: none;\n 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 .save-btn:hover { opacity: 0.9; }\n .save-btn:disabled { opacity: 0.6; cursor: not-allowed; }\n\n .cancel-btn {\n width: 100%; padding: 10px;\n background: none;\n color: var(--authon-muted);\n border: 1px solid var(--authon-border);\n border-radius: calc(var(--authon-radius) * 0.5);\n font-size: 14px; font-weight: 500; cursor: pointer;\n font-family: var(--authon-font); transition: background 0.15s, color 0.15s;\n }\n .cancel-btn:hover { background: var(--authon-divider); color: var(--authon-text); }\n\n .signout-btn {\n width: 100%; padding: 10px;\n background: none;\n color: #ef4444;\n border: 1px solid rgba(239,68,68,0.3);\n border-radius: calc(var(--authon-radius) * 0.5);\n font-size: 14px; font-weight: 500; cursor: pointer;\n font-family: var(--authon-font); transition: background 0.15s;\n }\n .signout-btn:hover { background: rgba(239,68,68,0.08); }\n\n .error-msg {\n 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\n @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }\n @keyframes slideIn { from { opacity: 0; transform: translate(-50%, calc(-50% - 8px)); } to { opacity: 1; transform: translate(-50%, -50%); } }\n `;\n }\n\n private attachEvents(): void {\n this.attachBackdropEvent();\n this.attachInnerEvents();\n }\n\n private attachBackdropEvent(): void {\n if (!this.shadowRoot || this.mode !== 'popup') return;\n const backdrop = this.shadowRoot.getElementById('profile-backdrop');\n if (backdrop) {\n backdrop.addEventListener('click', () => { this.onClose(); this.close(); });\n }\n }\n\n private attachInnerEvents(): void {\n if (!this.shadowRoot) return;\n\n const closeBtn = this.shadowRoot.getElementById('profile-close-btn');\n closeBtn?.addEventListener('click', () => { this.onClose(); this.close(); });\n\n const editBtn = this.shadowRoot.getElementById('profile-edit-btn');\n editBtn?.addEventListener('click', () => {\n this.isEditMode = true;\n this.rerender();\n });\n\n const cancelBtn = this.shadowRoot.getElementById('profile-cancel-btn');\n cancelBtn?.addEventListener('click', () => {\n this.isEditMode = false;\n this.rerender();\n });\n\n const saveBtn = this.shadowRoot.getElementById('profile-save-btn');\n saveBtn?.addEventListener('click', async () => {\n const nameInput = this.shadowRoot!.getElementById('profile-displayname-input') as HTMLInputElement | null;\n const avatarInput = this.shadowRoot!.getElementById('profile-avatar-input') as HTMLInputElement | null;\n\n const displayName = nameInput?.value.trim();\n const avatarUrl = avatarInput?.value.trim();\n\n this.showSaving();\n this.shadowRoot!.getElementById('profile-error')?.remove();\n\n try {\n await this.onSave({\n displayName: displayName || undefined,\n avatarUrl: avatarUrl || undefined,\n });\n this.isEditMode = false;\n this.rerender();\n } catch (err) {\n this.showSaveError(err instanceof Error ? err.message : 'Save failed');\n }\n });\n\n const signOutBtn = this.shadowRoot.getElementById('profile-signout-btn');\n signOutBtn?.addEventListener('click', async () => {\n if (signOutBtn instanceof HTMLButtonElement) {\n signOutBtn.disabled = true;\n signOutBtn.textContent = '...';\n }\n try {\n await this.onSignOut();\n this.close();\n } catch (_) {\n if (signOutBtn instanceof HTMLButtonElement) {\n signOutBtn.disabled = false;\n signOutBtn.textContent = this.t.signOut;\n }\n }\n });\n\n this.shadowRoot.querySelectorAll<HTMLButtonElement>('.session-revoke-btn').forEach((btn) => {\n btn.addEventListener('click', async () => {\n const sessionId = btn.dataset.sessionId;\n if (!sessionId) return;\n btn.disabled = true;\n try {\n await this.onRevokeSession(sessionId);\n this.sessions = this.sessions.filter((s) => s.id !== sessionId);\n this.rerender();\n } catch (_) {\n btn.disabled = false;\n }\n });\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 { ProfileRenderer } from './profile';\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 profile: ProfileRenderer | 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 async openProfile(): Promise<void> {\n const user = this.getUser();\n if (!user) throw new Error('Must be signed in to open profile');\n\n const token = this.session.getToken();\n let sessions: import('@authon/shared').SessionInfo[] = [];\n if (token) {\n try {\n sessions = await this.listSessions();\n } catch (_) {\n // non-fatal: show profile without sessions\n }\n }\n\n if (!this.profile) {\n this.profile = new ProfileRenderer({\n mode: this.config.mode,\n theme: this.config.theme,\n locale: this.config.locale,\n containerId: this.config.containerId,\n branding: this.branding || undefined,\n user,\n sessions,\n onSave: async (data) => {\n const updated = await this.updateProfile(data);\n this.profile?.updateUser(updated);\n },\n onSignOut: async () => {\n await this.signOut();\n this.profile = null;\n },\n onRevokeSession: async (sessionId: string) => {\n await this.revokeSession(sessionId);\n },\n onClose: () => {\n this.profile?.close();\n this.profile = null;\n },\n });\n } else {\n this.profile.updateUser(user);\n this.profile.updateSessions(sessions);\n }\n\n this.profile.open();\n }\n\n closeProfile(): void {\n this.profile?.close();\n this.profile = null;\n }\n\n /** Update theme at runtime without destroying form state */\n setTheme(theme: 'light' | 'dark' | 'auto'): void {\n this.getModal().setTheme(theme);\n this.profile?.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 | { needsVerification: true; email: string }> {\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; needsVerification?: boolean; email?: string }>(\n '/v1/auth/signin',\n body,\n );\n if (res.needsVerification) {\n this.emit('verificationRequired', res.email);\n return { needsVerification: true, email: res.email! };\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 | { needsVerification: true; email: string }> {\n const res = await this.apiPost<AuthTokens & { needsVerification?: boolean; email?: string }>('/v1/auth/signup', {\n email,\n password,\n ...meta,\n });\n if (res.needsVerification) {\n this.emit('verificationRequired', res.email);\n return { needsVerification: true, email: res.email! };\n }\n this.session.setSession(res);\n this.emit('signedIn', res.user);\n return res.user;\n }\n\n async verifyEmail(email: string, code: string): Promise<AuthonUser> {\n const res = await this.apiPost<AuthTokens>('/v1/auth/verify-email', { email, code });\n this.session.setSession(res);\n this.emit('signedIn', res.user);\n return res.user;\n }\n\n async resendVerificationCode(email: string): Promise<void> {\n await this.apiPost<{ sent: true }>('/v1/auth/resend-code', { email });\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.profile?.close();\n this.profile = null;\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 locale: this.config.locale,\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 if (isSignUp) {\n this.signUpWithEmail(email, password, { turnstileToken })\n .then((result) => {\n if ('needsVerification' in result && result.needsVerification) {\n this.modal?.setSubmitLoading(false);\n this.modal?.showVerificationInput(email, async (code: string) => {\n try {\n await this.verifyEmail(email, code);\n this.modal?.close();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.modal?.showError(msg || 'Verification failed');\n }\n }, async () => {\n await this.resendVerificationCode(email);\n });\n } else {\n this.modal?.close();\n }\n })\n .catch((err) => {\n this.modal?.resetTurnstile?.();\n this.modal?.setSubmitLoading(false);\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 } else {\n this.signInWithEmail(email, password, turnstileToken)\n .then((result) => {\n if ('needsVerification' in result && result.needsVerification) {\n this.modal?.setSubmitLoading(false);\n this.modal?.showVerificationInput(email, async (code: string) => {\n try {\n await this.verifyEmail(email, code);\n this.modal?.close();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.modal?.showError(msg || 'Verification failed');\n }\n }, async () => {\n await this.resendVerificationCode(email);\n });\n } else {\n this.modal?.close();\n }\n })\n .catch((err) => {\n this.modal?.resetTurnstile?.();\n this.modal?.setSubmitLoading(false);\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 },\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 as any)?.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":["hexToRgba","provider"]}
1
+ {"version":3,"sources":["../src/types.ts","../../../node_modules/.pnpm/@authon+shared@0.3.0/node_modules/@authon/shared/src/index.ts","../src/providers.ts","../src/i18n.ts","../src/modal.ts","../src/profile.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}\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","export type AuthonLocale = keyof typeof translations;\n\nexport const translations = {\n en: {\n welcomeBack: 'Welcome back',\n createAccount: 'Create your account',\n alreadyHaveAccount: 'Already have an account?',\n dontHaveAccount: \"Don't have an account?\",\n signIn: 'Sign in',\n signUp: 'Sign up',\n or: 'or',\n emailAddress: 'Email address',\n password: 'Password',\n passwordHint: 'Must contain uppercase, lowercase, and a number (min 8 chars)',\n continueWith: 'Continue with',\n connectWallet: 'Connect Wallet',\n magicLink: 'Continue with Magic Link',\n passkey: 'Sign in with Passkey',\n securedBy: 'Secured by',\n backToSignIn: 'Back to sign in',\n profile: 'Profile',\n editProfile: 'Edit Profile',\n displayName: 'Display Name',\n save: 'Save',\n signOut: 'Sign Out',\n sessions: 'Active Sessions',\n },\n ko: {\n welcomeBack: '다시 오신 걸 환영합니다',\n createAccount: '계정 만들기',\n alreadyHaveAccount: '이미 계정이 있으신가요?',\n dontHaveAccount: '계정이 없으신가요?',\n signIn: '로그인',\n signUp: '회원가입',\n or: '또는',\n emailAddress: '이메일 주소',\n password: '비밀번호',\n passwordHint: '대문자, 소문자, 숫자 포함 (최소 8자)',\n continueWith: '(으)로 계속하기',\n connectWallet: '지갑 연결',\n magicLink: '매직 링크로 계속하기',\n passkey: '패스키로 로그인',\n securedBy: '보안 제공',\n backToSignIn: '로그인으로 돌아가기',\n profile: '프로필',\n editProfile: '프로필 편집',\n displayName: '표시 이름',\n save: '저장',\n signOut: '로그아웃',\n sessions: '활성 세션',\n },\n ja: {\n welcomeBack: 'おかえりなさい',\n createAccount: 'アカウントを作成',\n alreadyHaveAccount: 'すでにアカウントをお持ちですか?',\n dontHaveAccount: 'アカウントをお持ちでないですか?',\n signIn: 'ログイン',\n signUp: '新規登録',\n or: 'または',\n emailAddress: 'メールアドレス',\n password: 'パスワード',\n passwordHint: '大文字、小文字、数字を含む(8文字以上)',\n continueWith: 'で続行',\n connectWallet: 'ウォレット接続',\n magicLink: 'マジックリンクで続行',\n passkey: 'パスキーでログイン',\n securedBy: 'セキュリティ提供',\n backToSignIn: 'ログインに戻る',\n profile: 'プロフィール',\n editProfile: 'プロフィール編集',\n displayName: '表示名',\n save: '保存',\n signOut: 'サインアウト',\n sessions: 'アクティブセッション',\n },\n 'zh-CN': {\n welcomeBack: '欢迎回来',\n createAccount: '创建账户',\n alreadyHaveAccount: '已有账户?',\n dontHaveAccount: '没有账户?',\n signIn: '登录',\n signUp: '注册',\n or: '或',\n emailAddress: '邮箱地址',\n password: '密码',\n passwordHint: '需包含大写、小写字母和数字(至少8位)',\n continueWith: '继续使用',\n connectWallet: '连接钱包',\n magicLink: '使用魔法链接继续',\n passkey: '使用通行密钥登录',\n securedBy: '安全保障',\n backToSignIn: '返回登录',\n profile: '个人资料',\n editProfile: '编辑资料',\n displayName: '显示名称',\n save: '保存',\n signOut: '退出登录',\n sessions: '活跃会话',\n },\n 'zh-TW': {\n welcomeBack: '歡迎回來',\n createAccount: '建立帳戶',\n alreadyHaveAccount: '已有帳戶?',\n dontHaveAccount: '沒有帳戶?',\n signIn: '登入',\n signUp: '註冊',\n or: '或',\n emailAddress: '電子郵件',\n password: '密碼',\n passwordHint: '需包含大寫、小寫字母和數字(至少8位)',\n continueWith: '繼續使用',\n connectWallet: '連接錢包',\n magicLink: '使用魔法連結繼續',\n passkey: '使用通行金鑰登入',\n securedBy: '安全保障',\n backToSignIn: '返回登入',\n profile: '個人資料',\n editProfile: '編輯資料',\n displayName: '顯示名稱',\n save: '儲存',\n signOut: '登出',\n sessions: '活躍工作階段',\n },\n 'pt-BR': {\n welcomeBack: 'Bem-vindo de volta',\n createAccount: 'Crie sua conta',\n alreadyHaveAccount: 'Ja tem uma conta?',\n dontHaveAccount: 'Nao tem uma conta?',\n signIn: 'Entrar',\n signUp: 'Cadastrar',\n or: 'ou',\n emailAddress: 'Endereco de e-mail',\n password: 'Senha',\n passwordHint: 'Deve conter maiusculas, minusculas e numeros (min 8 caracteres)',\n continueWith: 'Continuar com',\n connectWallet: 'Conectar carteira',\n magicLink: 'Continuar com Magic Link',\n passkey: 'Entrar com Passkey',\n securedBy: 'Protegido por',\n backToSignIn: 'Voltar ao login',\n profile: 'Perfil',\n editProfile: 'Editar perfil',\n displayName: 'Nome de exibicao',\n save: 'Salvar',\n signOut: 'Sair',\n sessions: 'Sessoes ativas',\n },\n es: {\n welcomeBack: 'Bienvenido de nuevo',\n createAccount: 'Crea tu cuenta',\n alreadyHaveAccount: 'Ya tienes una cuenta?',\n dontHaveAccount: 'No tienes una cuenta?',\n signIn: 'Iniciar sesion',\n signUp: 'Registrarse',\n or: 'o',\n emailAddress: 'Correo electronico',\n password: 'Contrasena',\n passwordHint: 'Debe contener mayusculas, minusculas y numeros (min 8 caracteres)',\n continueWith: 'Continuar con',\n connectWallet: 'Conectar billetera',\n magicLink: 'Continuar con Magic Link',\n passkey: 'Iniciar con Passkey',\n securedBy: 'Protegido por',\n backToSignIn: 'Volver al inicio de sesion',\n profile: 'Perfil',\n editProfile: 'Editar perfil',\n displayName: 'Nombre de visualizacion',\n save: 'Guardar',\n signOut: 'Cerrar sesion',\n sessions: 'Sesiones activas',\n },\n de: {\n welcomeBack: 'Willkommen zuruck',\n createAccount: 'Konto erstellen',\n alreadyHaveAccount: 'Bereits ein Konto?',\n dontHaveAccount: 'Noch kein Konto?',\n signIn: 'Anmelden',\n signUp: 'Registrieren',\n or: 'oder',\n emailAddress: 'E-Mail-Adresse',\n password: 'Passwort',\n passwordHint: 'Gross-/Kleinbuchstaben und Zahl erforderlich (mind. 8 Zeichen)',\n continueWith: 'Weiter mit',\n connectWallet: 'Wallet verbinden',\n magicLink: 'Weiter mit Magic Link',\n passkey: 'Mit Passkey anmelden',\n securedBy: 'Gesichert durch',\n backToSignIn: 'Zuruck zur Anmeldung',\n profile: 'Profil',\n editProfile: 'Profil bearbeiten',\n displayName: 'Anzeigename',\n save: 'Speichern',\n signOut: 'Abmelden',\n sessions: 'Aktive Sitzungen',\n },\n fr: {\n welcomeBack: 'Bon retour',\n createAccount: 'Creez votre compte',\n alreadyHaveAccount: 'Vous avez deja un compte ?',\n dontHaveAccount: \"Vous n'avez pas de compte ?\",\n signIn: 'Se connecter',\n signUp: \"S'inscrire\",\n or: 'ou',\n emailAddress: 'Adresse e-mail',\n password: 'Mot de passe',\n passwordHint: 'Doit contenir majuscules, minuscules et chiffres (min 8 caracteres)',\n continueWith: 'Continuer avec',\n connectWallet: 'Connecter le portefeuille',\n magicLink: 'Continuer avec Magic Link',\n passkey: 'Se connecter avec Passkey',\n securedBy: 'Securise par',\n backToSignIn: 'Retour a la connexion',\n profile: 'Profil',\n editProfile: 'Modifier le profil',\n displayName: \"Nom d'affichage\",\n save: 'Enregistrer',\n signOut: 'Se deconnecter',\n sessions: 'Sessions actives',\n },\n hi: {\n welcomeBack: 'वापसी पर स्वागत है',\n createAccount: 'अपना खाता बनाएं',\n alreadyHaveAccount: 'पहले से खाता है?',\n dontHaveAccount: 'खाता नहीं है?',\n signIn: 'साइन इन',\n signUp: 'साइन अप',\n or: 'या',\n emailAddress: 'ईमेल पता',\n password: 'पासवर्ड',\n passwordHint: 'बड़े, छोटे अक्षर और संख्या आवश्यक (कम से कम 8 अक्षर)',\n continueWith: 'से जारी रखें',\n connectWallet: 'वॉलेट कनेक्ट करें',\n magicLink: 'मैजिक लिंक से जारी रखें',\n passkey: 'पासकी से साइन इन',\n securedBy: 'सुरक्षा प्रदाता',\n backToSignIn: 'साइन इन पर वापस जाएं',\n profile: 'प्रोफ़ाइल',\n editProfile: 'प्रोफ़ाइल संपादित करें',\n displayName: 'प्रदर्शन नाम',\n save: 'सहेजें',\n signOut: 'साइन आउट',\n sessions: 'सक्रिय सत्र',\n },\n tr: {\n welcomeBack: 'Tekrar hos geldiniz',\n createAccount: 'Hesap olusturun',\n alreadyHaveAccount: 'Zaten bir hesabiniz var mi?',\n dontHaveAccount: 'Hesabiniz yok mu?',\n signIn: 'Giris yap',\n signUp: 'Kaydol',\n or: 'veya',\n emailAddress: 'E-posta adresi',\n password: 'Sifre',\n passwordHint: 'Buyuk, kucuk harf ve rakam icermeli (en az 8 karakter)',\n continueWith: 'ile devam et',\n connectWallet: 'Cuzdan bagla',\n magicLink: 'Magic Link ile devam et',\n passkey: 'Passkey ile giris yap',\n securedBy: 'Guvenlik saglayici',\n backToSignIn: 'Girise don',\n profile: 'Profil',\n editProfile: 'Profili duzenle',\n displayName: 'Goruntu adi',\n save: 'Kaydet',\n signOut: 'Cikis yap',\n sessions: 'Aktif oturumlar',\n },\n id: {\n welcomeBack: 'Selamat datang kembali',\n createAccount: 'Buat akun Anda',\n alreadyHaveAccount: 'Sudah punya akun?',\n dontHaveAccount: 'Belum punya akun?',\n signIn: 'Masuk',\n signUp: 'Daftar',\n or: 'atau',\n emailAddress: 'Alamat email',\n password: 'Kata sandi',\n passwordHint: 'Harus mengandung huruf besar, kecil, dan angka (min 8 karakter)',\n continueWith: 'Lanjutkan dengan',\n connectWallet: 'Hubungkan dompet',\n magicLink: 'Lanjutkan dengan Magic Link',\n passkey: 'Masuk dengan Passkey',\n securedBy: 'Diamankan oleh',\n backToSignIn: 'Kembali ke login',\n profile: 'Profil',\n editProfile: 'Edit profil',\n displayName: 'Nama tampilan',\n save: 'Simpan',\n signOut: 'Keluar',\n sessions: 'Sesi aktif',\n },\n vi: {\n welcomeBack: 'Chao mung tro lai',\n createAccount: 'Tao tai khoan',\n alreadyHaveAccount: 'Da co tai khoan?',\n dontHaveAccount: 'Chua co tai khoan?',\n signIn: 'Dang nhap',\n signUp: 'Dang ky',\n or: 'hoac',\n emailAddress: 'Dia chi email',\n password: 'Mat khau',\n passwordHint: 'Can chu hoa, chu thuong va so (toi thieu 8 ky tu)',\n continueWith: 'Tiep tuc voi',\n connectWallet: 'Ket noi vi',\n magicLink: 'Tiep tuc voi Magic Link',\n passkey: 'Dang nhap voi Passkey',\n securedBy: 'Bao mat boi',\n backToSignIn: 'Quay lai dang nhap',\n profile: 'Ho so',\n editProfile: 'Chinh sua ho so',\n displayName: 'Ten hien thi',\n save: 'Luu',\n signOut: 'Dang xuat',\n sessions: 'Phien dang nhap hoat dong',\n },\n th: {\n welcomeBack: 'ยินดีต้อนรับกลับ',\n createAccount: 'สร้างบัญชี',\n alreadyHaveAccount: 'มีบัญชีอยู่แล้ว?',\n dontHaveAccount: 'ยังไม่มีบัญชี?',\n signIn: 'เข้าสู่ระบบ',\n signUp: 'สมัครสมาชิก',\n or: 'หรือ',\n emailAddress: 'อีเมล',\n password: 'รหัสผ่าน',\n passwordHint: 'ต้องมีตัวพิมพ์ใหญ่ ตัวพิมพ์เล็ก และตัวเลข (อย่างน้อย 8 ตัว)',\n continueWith: 'ดำเนินการต่อด้วย',\n connectWallet: 'เชื่อมต่อกระเป๋า',\n magicLink: 'ดำเนินการต่อด้วย Magic Link',\n passkey: 'เข้าสู่ระบบด้วย Passkey',\n securedBy: 'รักษาความปลอดภัยโดย',\n backToSignIn: 'กลับไปเข้าสู่ระบบ',\n profile: 'โปรไฟล์',\n editProfile: 'แก้ไขโปรไฟล์',\n displayName: 'ชื่อที่แสดง',\n save: 'บันทึก',\n signOut: 'ออกจากระบบ',\n sessions: 'เซสชันที่ใช้งานอยู่',\n },\n ru: {\n welcomeBack: 'С возвращением',\n createAccount: 'Создайте аккаунт',\n alreadyHaveAccount: 'Уже есть аккаунт?',\n dontHaveAccount: 'Нет аккаунта?',\n signIn: 'Войти',\n signUp: 'Зарегистрироваться',\n or: 'или',\n emailAddress: 'Электронная почта',\n password: 'Пароль',\n passwordHint: 'Заглавные, строчные буквы и цифры (мин. 8 символов)',\n continueWith: 'Продолжить с',\n connectWallet: 'Подключить кошелек',\n magicLink: 'Продолжить с Magic Link',\n passkey: 'Войти с Passkey',\n securedBy: 'Защищено',\n backToSignIn: 'Вернуться к входу',\n profile: 'Профиль',\n editProfile: 'Редактировать профиль',\n displayName: 'Отображаемое имя',\n save: 'Сохранить',\n signOut: 'Выйти',\n sessions: 'Активные сеансы',\n },\n it: {\n welcomeBack: 'Bentornato',\n createAccount: 'Crea il tuo account',\n alreadyHaveAccount: 'Hai gia un account?',\n dontHaveAccount: 'Non hai un account?',\n signIn: 'Accedi',\n signUp: 'Registrati',\n or: 'o',\n emailAddress: 'Indirizzo email',\n password: 'Password',\n passwordHint: 'Deve contenere maiuscole, minuscole e numeri (min 8 caratteri)',\n continueWith: 'Continua con',\n connectWallet: 'Connetti portafoglio',\n magicLink: 'Continua con Magic Link',\n passkey: 'Accedi con Passkey',\n securedBy: 'Protetto da',\n backToSignIn: \"Torna all'accesso\",\n profile: 'Profilo',\n editProfile: 'Modifica profilo',\n displayName: 'Nome visualizzato',\n save: 'Salva',\n signOut: 'Esci',\n sessions: 'Sessioni attive',\n },\n pl: {\n welcomeBack: 'Witaj ponownie',\n createAccount: 'Utworz konto',\n alreadyHaveAccount: 'Masz juz konto?',\n dontHaveAccount: 'Nie masz konta?',\n signIn: 'Zaloguj sie',\n signUp: 'Zarejestruj sie',\n or: 'lub',\n emailAddress: 'Adres e-mail',\n password: 'Haslo',\n passwordHint: 'Wielkie, male litery i cyfry (min 8 znakow)',\n continueWith: 'Kontynuuj z',\n connectWallet: 'Polacz portfel',\n magicLink: 'Kontynuuj z Magic Link',\n passkey: 'Zaloguj sie z Passkey',\n securedBy: 'Zabezpieczone przez',\n backToSignIn: 'Powrot do logowania',\n profile: 'Profil',\n editProfile: 'Edytuj profil',\n displayName: 'Nazwa wyswietlana',\n save: 'Zapisz',\n signOut: 'Wyloguj sie',\n sessions: 'Aktywne sesje',\n },\n nl: {\n welcomeBack: 'Welkom terug',\n createAccount: 'Maak je account aan',\n alreadyHaveAccount: 'Heb je al een account?',\n dontHaveAccount: 'Nog geen account?',\n signIn: 'Inloggen',\n signUp: 'Registreren',\n or: 'of',\n emailAddress: 'E-mailadres',\n password: 'Wachtwoord',\n passwordHint: 'Hoofdletters, kleine letters en cijfers vereist (min 8 tekens)',\n continueWith: 'Doorgaan met',\n connectWallet: 'Portemonnee verbinden',\n magicLink: 'Doorgaan met Magic Link',\n passkey: 'Inloggen met Passkey',\n securedBy: 'Beveiligd door',\n backToSignIn: 'Terug naar inloggen',\n profile: 'Profiel',\n editProfile: 'Profiel bewerken',\n displayName: 'Weergavenaam',\n save: 'Opslaan',\n signOut: 'Uitloggen',\n sessions: 'Actieve sessies',\n },\n ar: {\n welcomeBack: 'مرحبًا بعودتك',\n createAccount: 'أنشئ حسابك',\n alreadyHaveAccount: 'لديك حساب بالفعل؟',\n dontHaveAccount: 'ليس لديك حساب؟',\n signIn: 'تسجيل الدخول',\n signUp: 'إنشاء حساب',\n or: 'أو',\n emailAddress: 'البريد الإلكتروني',\n password: 'كلمة المرور',\n passwordHint: 'يجب أن تحتوي على أحرف كبيرة وصغيرة وأرقام (8 أحرف على الأقل)',\n continueWith: 'المتابعة باستخدام',\n connectWallet: 'ربط المحفظة',\n magicLink: 'المتابعة باستخدام Magic Link',\n passkey: 'تسجيل الدخول باستخدام Passkey',\n securedBy: 'محمي بواسطة',\n backToSignIn: 'العودة لتسجيل الدخول',\n profile: 'الملف الشخصي',\n editProfile: 'تعديل الملف الشخصي',\n displayName: 'الاسم المعروض',\n save: 'حفظ',\n signOut: 'تسجيل الخروج',\n sessions: 'الجلسات النشطة',\n },\n sv: {\n welcomeBack: 'Valkommen tillbaka',\n createAccount: 'Skapa ditt konto',\n alreadyHaveAccount: 'Har du redan ett konto?',\n dontHaveAccount: 'Har du inget konto?',\n signIn: 'Logga in',\n signUp: 'Registrera dig',\n or: 'eller',\n emailAddress: 'E-postadress',\n password: 'Losenord',\n passwordHint: 'Stora, sma bokstaver och siffror kravs (minst 8 tecken)',\n continueWith: 'Fortsatt med',\n connectWallet: 'Anslut planbok',\n magicLink: 'Fortsatt med Magic Link',\n passkey: 'Logga in med Passkey',\n securedBy: 'Sakrad av',\n backToSignIn: 'Tillbaka till inloggning',\n profile: 'Profil',\n editProfile: 'Redigera profil',\n displayName: 'Visningsnamn',\n save: 'Spara',\n signOut: 'Logga ut',\n sessions: 'Aktiva sessioner',\n },\n uk: {\n welcomeBack: 'З поверненням',\n createAccount: 'Створіть обліковий запис',\n alreadyHaveAccount: 'Вже є обліковий запис?',\n dontHaveAccount: 'Немає облікового запису?',\n signIn: 'Увійти',\n signUp: 'Зареєструватися',\n or: 'або',\n emailAddress: 'Електронна пошта',\n password: 'Пароль',\n passwordHint: 'Великі, малі літери та цифри (мін. 8 символів)',\n continueWith: 'Продовжити з',\n connectWallet: \"Підключити гаманець\",\n magicLink: 'Продовжити з Magic Link',\n passkey: 'Увійти з Passkey',\n securedBy: 'Захищено',\n backToSignIn: 'Повернутися до входу',\n profile: 'Профіль',\n editProfile: 'Редагувати профіль',\n displayName: 'Відображуване ім\\'я',\n save: 'Зберегти',\n signOut: 'Вийти',\n sessions: 'Активні сеанси',\n },\n} as const;\n\nexport interface TranslationStrings {\n welcomeBack: string;\n createAccount: string;\n alreadyHaveAccount: string;\n dontHaveAccount: string;\n signIn: string;\n signUp: string;\n or: string;\n emailAddress: string;\n password: string;\n passwordHint: string;\n continueWith: string;\n connectWallet: string;\n magicLink: string;\n passkey: string;\n securedBy: string;\n backToSignIn: string;\n profile: string;\n editProfile: string;\n displayName: string;\n save: string;\n signOut: string;\n sessions: string;\n}\n\nexport function getStrings(locale: string): TranslationStrings {\n if (locale in translations) return translations[locale as AuthonLocale];\n const lang = locale.split('-')[0].split('_')[0];\n if (lang in translations) return translations[lang as AuthonLocale];\n return translations.en;\n}\n","import type { BrandingConfig, OAuthProviderType } from '@authon/shared';\nimport { DEFAULT_BRANDING } from '@authon/shared';\nimport { getProviderButtonConfig } from './providers';\nimport { getStrings, type TranslationStrings } from './i18n';\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 // i18n\n private t: TranslationStrings;\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 locale?: string;\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.t = getStrings(options.locale || 'en');\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 this.setSubmitLoading(false);\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 setSubmitLoading(loading: boolean): void {\n if (!this.shadowRoot) return;\n const btn = this.shadowRoot.querySelector('.submit-btn') as HTMLButtonElement | null;\n if (!btn) return;\n if (loading) {\n btn.dataset.originalText = btn.textContent || '';\n btn.innerHTML = '<span style=\"display:inline-flex;align-items:center;gap:6px\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" style=\"animation:spin 0.8s linear infinite\"><circle cx=\"7\" cy=\"7\" r=\"5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" opacity=\"0.3\"/><path d=\"M7 2a5 5 0 0 1 5 5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/></svg></span>';\n btn.disabled = true;\n btn.style.opacity = '0.7';\n } else {\n btn.innerHTML = btn.dataset.originalText || 'Continue';\n btn.disabled = false;\n btn.style.opacity = '1';\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 showVerificationInput(\n email: string,\n onVerify: (code: string) => Promise<void>,\n onResend: () => Promise<void>,\n ): void {\n if (!this.shadowRoot) return;\n const inner = this.shadowRoot.querySelector('.modal-inner');\n if (!inner) return;\n\n inner.innerHTML = `\n <div style=\"text-align:center;padding:8px 0\">\n <div style=\"width:48px;height:48px;border-radius:12px;background:color-mix(in srgb, var(--authon-primary-start) 15%, transparent);display:flex;align-items:center;justify-content:center;margin:0 auto 16px\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--authon-primary-start)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z\"/><polyline points=\"22,6 12,13 2,6\"/></svg>\n </div>\n <h2 class=\"title\" style=\"font-size:20px;margin-bottom:4px\">${this.t.welcomeBack.includes('Welcome') ? 'Check your email' : this.t.welcomeBack}</h2>\n <p style=\"font-size:13px;color:var(--authon-muted);margin-bottom:20px\">${email}</p>\n </div>\n <div class=\"email-form\" id=\"verify-form\">\n <div id=\"verify-error\" style=\"display:none;padding:8px 12px;background:rgba(239,68,68,0.1);border:1px solid rgba(239,68,68,0.3);border-radius:8px;font-size:13px;color:#ef4444;text-align:center;margin-bottom:4px\"></div>\n <input type=\"text\" id=\"verify-code\" class=\"input\" placeholder=\"000000\" maxlength=\"6\" inputmode=\"numeric\" autocomplete=\"one-time-code\" style=\"text-align:center;font-size:20px;letter-spacing:0.2em;font-family:ui-monospace,monospace\" />\n <button type=\"button\" id=\"verify-submit\" class=\"submit-btn\">${this.t.signIn}</button>\n </div>\n <p style=\"text-align:center;margin-top:12px;font-size:12px;color:var(--authon-dim)\">\n <a href=\"#\" id=\"resend-link\" style=\"color:var(--authon-primary-start);text-decoration:none;font-weight:500\">${this.t.backToSignIn.includes('Back') ? 'Resend code' : this.t.backToSignIn}</a>\n </p>\n `;\n\n const codeInput = this.shadowRoot.getElementById('verify-code') as HTMLInputElement;\n const submitBtn = this.shadowRoot.getElementById('verify-submit');\n const resendLink = this.shadowRoot.getElementById('resend-link');\n\n codeInput?.focus();\n codeInput?.addEventListener('input', () => {\n codeInput.value = codeInput.value.replace(/\\D/g, '').slice(0, 6);\n });\n\n const verifyError = this.shadowRoot.getElementById('verify-error');\n submitBtn?.addEventListener('click', async () => {\n const code = codeInput?.value?.trim();\n if (!code || code.length < 6) return;\n if (verifyError) { verifyError.style.display = 'none'; }\n submitBtn.textContent = '...';\n (submitBtn as HTMLButtonElement).disabled = true;\n try {\n await onVerify(code);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (verifyError) {\n verifyError.textContent = msg || 'Verification failed';\n verifyError.style.display = 'block';\n }\n submitBtn.textContent = this.t.signIn;\n (submitBtn as HTMLButtonElement).disabled = false;\n if (codeInput) { codeInput.value = ''; codeInput.focus(); }\n }\n });\n\n codeInput?.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') submitBtn?.click();\n });\n\n resendLink?.addEventListener('click', async (e) => {\n e.preventDefault();\n resendLink.textContent = '...';\n await onResend();\n resendLink.textContent = 'Sent!';\n setTimeout(() => { resendLink.textContent = 'Resend code'; }, 2000);\n });\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 ? this.t.createAccount : this.t.welcomeBack;\n const subtitle = isSignUp ? this.t.alreadyHaveAccount : this.t.dontHaveAccount;\n const subtitleLink = isSignUp ? this.t.signIn : this.t.signUp;\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>${this.t.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=\"${this.t.emailAddress}\" name=\"email\" required class=\"input\" autocomplete=\"email\" />\n <input type=\"password\" placeholder=\"${this.t.password}\" name=\"password\" required class=\"input\" autocomplete=\"${isSignUp ? 'new-password' : 'current-password'}\" />\n ${isSignUp ? `<p class=\"password-hint\">${this.t.passwordHint}</p>` : ''}\n <button type=\"submit\" class=\"submit-btn\">${isSignUp ? this.t.signUp : this.t.signIn}</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>${this.t.connectWallet}</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>${this.t.magicLink}</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>${this.t.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\">${this.t.securedBy} <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, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\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 this.setSubmitLoading(true);\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, BrandingConfig, SessionInfo } from '@authon/shared';\nimport { DEFAULT_BRANDING } from '@authon/shared';\nimport { getStrings, type TranslationStrings } from './i18n';\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\nfunction formatRelativeTime(dateStr: string | null): string {\n if (!dateStr) return '—';\n const diff = Date.now() - new Date(dateStr).getTime();\n const minutes = Math.floor(diff / 60000);\n if (minutes < 1) return 'just now';\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n}\n\nfunction parseUserAgent(ua: string | null): string {\n if (!ua) return 'Unknown device';\n if (/iPhone|iPad/.test(ua)) return 'iOS';\n if (/Android/.test(ua)) return 'Android';\n if (/Windows/.test(ua)) return 'Windows';\n if (/Macintosh|Mac OS/.test(ua)) return 'macOS';\n if (/Linux/.test(ua)) return 'Linux';\n return 'Unknown device';\n}\n\nexport class ProfileRenderer {\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 t: TranslationStrings;\n\n private user: AuthonUser;\n private sessions: SessionInfo[];\n private isEditMode: boolean = false;\n\n private onSave: (data: { displayName?: string; avatarUrl?: string }) => Promise<void>;\n private onSignOut: () => Promise<void>;\n private onRevokeSession: (sessionId: string) => Promise<void>;\n private onClose: () => void;\n\n private escHandler: ((e: KeyboardEvent) => void) | null = null;\n\n constructor(options: {\n mode: 'popup' | 'embedded';\n theme?: 'light' | 'dark' | 'auto';\n containerId?: string;\n branding?: BrandingConfig;\n locale?: string;\n user: AuthonUser;\n sessions?: SessionInfo[];\n onSave: (data: { displayName?: string; avatarUrl?: string }) => Promise<void>;\n onSignOut: () => Promise<void>;\n onRevokeSession: (sessionId: string) => Promise<void>;\n onClose: () => void;\n }) {\n this.mode = options.mode;\n this.theme = options.theme || 'auto';\n this.branding = { ...DEFAULT_BRANDING, ...options.branding };\n this.t = getStrings(options.locale || 'en');\n this.user = options.user;\n this.sessions = options.sessions || [];\n this.onSave = options.onSave;\n this.onSignOut = options.onSignOut;\n this.onRevokeSession = options.onRevokeSession;\n this.onClose = options.onClose;\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 this.hostElement?.remove();\n this.hostElement = null;\n this.shadowRoot = null;\n }\n this.containerElement = next;\n return next;\n }\n\n open(): 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 this.rerender();\n } else {\n this.isEditMode = false;\n this.render();\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 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 }\n\n updateUser(user: AuthonUser): void {\n this.user = user;\n if (this.shadowRoot) this.rerender();\n }\n\n updateSessions(sessions: SessionInfo[]): void {\n this.sessions = sessions;\n if (this.shadowRoot) this.rerender();\n }\n\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 showSaving(): void {\n if (!this.shadowRoot) return;\n const btn = this.shadowRoot.getElementById('profile-save-btn') as HTMLButtonElement | null;\n if (btn) {\n btn.disabled = true;\n btn.textContent = '...';\n }\n }\n\n showSaveError(message: string): void {\n if (!this.shadowRoot) return;\n const btn = this.shadowRoot.getElementById('profile-save-btn') as HTMLButtonElement | null;\n if (btn) {\n btn.disabled = false;\n btn.textContent = this.t.save;\n }\n this.showInlineError('profile-error', message);\n }\n\n private showInlineError(id: string, message: string): void {\n if (!this.shadowRoot) return;\n this.shadowRoot.getElementById(id)?.remove();\n const errEl = document.createElement('div');\n errEl.id = id;\n errEl.className = 'error-msg';\n errEl.textContent = message;\n this.shadowRoot.querySelector('.profile-actions')?.appendChild(errEl);\n }\n\n private updateThemeCSS(): void {\n if (!this.shadowRoot) return;\n const styleEl = this.shadowRoot.getElementById('authon-profile-theme-style');\n if (styleEl) styleEl.textContent = this.buildCSS();\n }\n\n private startThemeObserver(): void {\n this.stopThemeObserver();\n if (typeof document === 'undefined' || typeof window === 'undefined') return;\n\n this.themeObserver = new MutationObserver(() => this.updateThemeCSS());\n this.themeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme', 'class'],\n });\n\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 private isDark(): boolean {\n if (this.theme === 'dark') return true;\n if (this.theme === 'light') return false;\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 render(): void {\n const host = document.createElement('div');\n host.setAttribute('data-authon-profile', '');\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 profile 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();\n this.attachEvents();\n\n if (this.mode === 'popup') {\n this.escHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') { this.onClose(); this.close(); }\n };\n document.addEventListener('keydown', this.escHandler);\n }\n\n if (this.theme === 'auto') this.startThemeObserver();\n }\n\n private rerender(): void {\n if (!this.shadowRoot) return;\n const inner = this.shadowRoot.getElementById('profile-inner');\n if (!inner) return;\n inner.style.opacity = '0';\n inner.style.transform = 'translateY(-4px)';\n setTimeout(() => {\n inner.innerHTML = this.buildInnerContent();\n this.attachInnerEvents();\n void inner.offsetHeight;\n inner.style.opacity = '1';\n inner.style.transform = 'translateY(0)';\n }, 120);\n }\n\n private buildShell(): string {\n const popupWrapper = this.mode === 'popup'\n ? `<div class=\"backdrop\" id=\"profile-backdrop\"></div>`\n : '';\n\n return `\n <style id=\"authon-profile-theme-style\">${this.buildCSS()}</style>\n ${popupWrapper}\n <div class=\"profile-container\" role=\"dialog\" aria-modal=\"true\" aria-label=\"${this.t.profile}\">\n <div id=\"profile-inner\" class=\"profile-inner\">\n ${this.buildInnerContent()}\n </div>\n </div>\n `;\n }\n\n private buildInnerContent(): string {\n const u = this.user;\n const initials = (u.displayName || u.email || '?')\n .split(/\\s+/)\n .map((w) => w[0]?.toUpperCase() ?? '')\n .slice(0, 2)\n .join('');\n\n const avatarHtml = u.avatarUrl\n ? `<img class=\"avatar-img\" src=\"${u.avatarUrl}\" alt=\"${u.displayName || ''}\" />`\n : `<div class=\"avatar-placeholder\">${initials}</div>`;\n\n const closeBtn = this.mode === 'popup'\n ? `<button class=\"close-btn\" id=\"profile-close-btn\" aria-label=\"Close\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M12 4L4 12M4 4l8 8\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"/>\n </svg>\n </button>`\n : '';\n\n if (this.isEditMode) {\n return this.buildEditContent(avatarHtml, closeBtn);\n }\n\n return this.buildViewContent(avatarHtml, closeBtn, u);\n }\n\n private buildViewContent(avatarHtml: string, closeBtn: string, u: AuthonUser): string {\n const sessionsHtml = this.sessions.length > 0\n ? `<div class=\"section\">\n <div class=\"section-label\">${this.t.sessions}</div>\n <div class=\"sessions-list\">\n ${this.sessions.map((s) => `\n <div class=\"session-item\" data-session-id=\"${s.id}\">\n <div class=\"session-info\">\n <span class=\"session-device\">${parseUserAgent(s.userAgent)}</span>\n <span class=\"session-meta\">${s.ipAddress || ''} &middot; ${formatRelativeTime(s.lastActiveAt)}</span>\n </div>\n <button class=\"session-revoke-btn\" data-session-id=\"${s.id}\" aria-label=\"Revoke session\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M10.5 3.5L3.5 10.5M3.5 3.5l7 7\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\n </svg>\n </button>\n </div>\n `).join('')}\n </div>\n </div>`\n : '';\n\n return `\n <div class=\"profile-header\">\n <div class=\"avatar-wrap\">${avatarHtml}</div>\n <div class=\"header-text\">\n <div class=\"display-name\">${u.displayName || '—'}</div>\n <div class=\"email\">${u.email || '—'}</div>\n </div>\n ${closeBtn}\n </div>\n\n <div class=\"section\">\n <div class=\"field-row\">\n <span class=\"field-label\">${this.t.emailAddress}</span>\n <span class=\"field-value readonly\">${u.email || '—'}</span>\n </div>\n <div class=\"field-row\">\n <span class=\"field-label\">${this.t.displayName}</span>\n <span class=\"field-value\">${u.displayName || '—'}</span>\n </div>\n </div>\n\n ${sessionsHtml}\n\n <div class=\"profile-actions\">\n <button class=\"edit-btn\" id=\"profile-edit-btn\">${this.t.editProfile}</button>\n <button class=\"signout-btn\" id=\"profile-signout-btn\">${this.t.signOut}</button>\n </div>\n `;\n }\n\n private buildEditContent(avatarHtml: string, closeBtn: string): string {\n const u = this.user;\n return `\n <div class=\"profile-header\">\n <div class=\"avatar-wrap\">${avatarHtml}</div>\n <div class=\"header-text\">\n <div class=\"display-name\">${this.t.editProfile}</div>\n <div class=\"email\">${u.email || '—'}</div>\n </div>\n ${closeBtn}\n </div>\n\n <div class=\"section\">\n <div class=\"field-group\">\n <label class=\"field-label\" for=\"profile-displayname-input\">${this.t.displayName}</label>\n <input\n id=\"profile-displayname-input\"\n class=\"input\"\n type=\"text\"\n value=\"${u.displayName || ''}\"\n placeholder=\"${this.t.displayName}\"\n autocomplete=\"name\"\n />\n </div>\n <div class=\"field-group\">\n <label class=\"field-label\" for=\"profile-avatar-input\">Avatar URL</label>\n <input\n id=\"profile-avatar-input\"\n class=\"input\"\n type=\"url\"\n value=\"${u.avatarUrl || ''}\"\n placeholder=\"https://...\"\n autocomplete=\"off\"\n />\n </div>\n <div class=\"field-group\">\n <label class=\"field-label\">${this.t.emailAddress}</label>\n <input class=\"input readonly\" type=\"email\" value=\"${u.email || ''}\" disabled />\n </div>\n </div>\n\n <div class=\"profile-actions\">\n <button class=\"save-btn\" id=\"profile-save-btn\">${this.t.save}</button>\n <button class=\"cancel-btn\" id=\"profile-cancel-btn\">Cancel</button>\n </div>\n `;\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 const sectionBg = dark ? '#1e293b' : '#f9fafb';\n const sessionItemBg = dark ? '#263148' : '#f3f4f6';\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-section-bg: ${sectionBg};\n --authon-session-bg: ${sessionItemBg};\n --authon-backdrop-bg: rgba(0,0,0,${dark ? '0.7' : '0.5'});\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\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\n .profile-container {\n ${this.mode === 'popup'\n ? 'position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 99999; max-height: 90vh; overflow-y: auto;'\n : ''}\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: 24px;\n width: 380px; max-width: 100%;\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\n .profile-inner {\n transition: opacity 0.12s ease, transform 0.12s ease;\n }\n\n .profile-header {\n display: flex;\n align-items: center;\n gap: 14px;\n margin-bottom: 20px;\n position: relative;\n }\n\n .avatar-wrap { flex-shrink: 0; }\n\n .avatar-img {\n width: 52px; height: 52px;\n border-radius: 50%;\n object-fit: cover;\n border: 2px solid var(--authon-border);\n }\n\n .avatar-placeholder {\n width: 52px; height: 52px;\n border-radius: 50%;\n background: linear-gradient(135deg, var(--authon-primary-start), var(--authon-primary-end));\n display: flex; align-items: center; justify-content: center;\n font-size: 18px; font-weight: 700; color: #fff;\n flex-shrink: 0;\n }\n\n .header-text { flex: 1; min-width: 0; }\n\n .display-name {\n font-size: 16px; font-weight: 600;\n color: var(--authon-text);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n }\n\n .email {\n font-size: 13px; color: var(--authon-muted);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n margin-top: 2px;\n }\n\n .close-btn {\n position: absolute; top: 0; right: 0;\n background: none; border: none;\n color: var(--authon-muted); cursor: pointer;\n padding: 4px; border-radius: 6px;\n display: flex; align-items: center; justify-content: center;\n transition: color 0.15s, background 0.15s;\n }\n .close-btn:hover { color: var(--authon-text); background: var(--authon-divider); }\n\n .section {\n background: var(--authon-section-bg);\n border: 1px solid var(--authon-border);\n border-radius: calc(var(--authon-radius) * 0.67);\n padding: 12px 14px;\n margin-bottom: 12px;\n display: flex; flex-direction: column; gap: 10px;\n }\n\n .section-label {\n font-size: 11px; font-weight: 600;\n text-transform: uppercase; letter-spacing: 0.05em;\n color: var(--authon-dim); margin-bottom: 2px;\n }\n\n .field-row {\n display: flex; align-items: center; justify-content: space-between; gap: 8px;\n }\n\n .field-label {\n font-size: 12px; color: var(--authon-muted); flex-shrink: 0;\n }\n\n .field-value {\n font-size: 13px; color: var(--authon-text);\n text-align: right; min-width: 0;\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n }\n\n .field-value.readonly { color: var(--authon-dim); }\n\n .field-group {\n display: flex; flex-direction: column; gap: 4px;\n }\n\n .input {\n width: 100%; padding: 9px 12px;\n background: var(--authon-input-bg);\n color: var(--authon-text);\n border: 1px solid var(--authon-border);\n border-radius: calc(var(--authon-radius) * 0.5);\n font-size: 13px; 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 ${hexToRgba(b.primaryColorStart || '#7c3aed', 0.15)}; }\n .input.readonly, .input:disabled { color: var(--authon-dim); cursor: not-allowed; background: var(--authon-section-bg); }\n\n .sessions-list { display: flex; flex-direction: column; gap: 6px; }\n\n .session-item {\n display: flex; align-items: center; justify-content: space-between;\n background: var(--authon-session-bg);\n border-radius: calc(var(--authon-radius) * 0.5);\n padding: 8px 10px; gap: 8px;\n }\n\n .session-info { display: flex; flex-direction: column; gap: 2px; min-width: 0; }\n\n .session-device {\n font-size: 13px; font-weight: 500; color: var(--authon-text);\n }\n\n .session-meta {\n font-size: 11px; color: var(--authon-dim);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n }\n\n .session-revoke-btn {\n background: none; border: none;\n color: var(--authon-dim); cursor: pointer;\n padding: 4px; border-radius: 4px; flex-shrink: 0;\n display: flex; align-items: center; justify-content: center;\n transition: color 0.15s, background 0.15s;\n }\n .session-revoke-btn:hover { color: #ef4444; background: rgba(239,68,68,0.1); }\n\n .profile-actions {\n display: flex; flex-direction: column; gap: 8px;\n margin-top: 4px;\n }\n\n .edit-btn {\n width: 100%; padding: 10px;\n background: linear-gradient(135deg, var(--authon-primary-start), var(--authon-primary-end));\n color: #fff; border: none;\n 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 .edit-btn:hover { opacity: 0.9; }\n\n .save-btn {\n width: 100%; padding: 10px;\n background: linear-gradient(135deg, var(--authon-primary-start), var(--authon-primary-end));\n color: #fff; border: none;\n 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 .save-btn:hover { opacity: 0.9; }\n .save-btn:disabled { opacity: 0.6; cursor: not-allowed; }\n\n .cancel-btn {\n width: 100%; padding: 10px;\n background: none;\n color: var(--authon-muted);\n border: 1px solid var(--authon-border);\n border-radius: calc(var(--authon-radius) * 0.5);\n font-size: 14px; font-weight: 500; cursor: pointer;\n font-family: var(--authon-font); transition: background 0.15s, color 0.15s;\n }\n .cancel-btn:hover { background: var(--authon-divider); color: var(--authon-text); }\n\n .signout-btn {\n width: 100%; padding: 10px;\n background: none;\n color: #ef4444;\n border: 1px solid rgba(239,68,68,0.3);\n border-radius: calc(var(--authon-radius) * 0.5);\n font-size: 14px; font-weight: 500; cursor: pointer;\n font-family: var(--authon-font); transition: background 0.15s;\n }\n .signout-btn:hover { background: rgba(239,68,68,0.08); }\n\n .error-msg {\n 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\n @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }\n @keyframes slideIn { from { opacity: 0; transform: translate(-50%, calc(-50% - 8px)); } to { opacity: 1; transform: translate(-50%, -50%); } }\n `;\n }\n\n private attachEvents(): void {\n this.attachBackdropEvent();\n this.attachInnerEvents();\n }\n\n private attachBackdropEvent(): void {\n if (!this.shadowRoot || this.mode !== 'popup') return;\n const backdrop = this.shadowRoot.getElementById('profile-backdrop');\n if (backdrop) {\n backdrop.addEventListener('click', () => { this.onClose(); this.close(); });\n }\n }\n\n private attachInnerEvents(): void {\n if (!this.shadowRoot) return;\n\n const closeBtn = this.shadowRoot.getElementById('profile-close-btn');\n closeBtn?.addEventListener('click', () => { this.onClose(); this.close(); });\n\n const editBtn = this.shadowRoot.getElementById('profile-edit-btn');\n editBtn?.addEventListener('click', () => {\n this.isEditMode = true;\n this.rerender();\n });\n\n const cancelBtn = this.shadowRoot.getElementById('profile-cancel-btn');\n cancelBtn?.addEventListener('click', () => {\n this.isEditMode = false;\n this.rerender();\n });\n\n const saveBtn = this.shadowRoot.getElementById('profile-save-btn');\n saveBtn?.addEventListener('click', async () => {\n const nameInput = this.shadowRoot!.getElementById('profile-displayname-input') as HTMLInputElement | null;\n const avatarInput = this.shadowRoot!.getElementById('profile-avatar-input') as HTMLInputElement | null;\n\n const displayName = nameInput?.value.trim();\n const avatarUrl = avatarInput?.value.trim();\n\n this.showSaving();\n this.shadowRoot!.getElementById('profile-error')?.remove();\n\n try {\n await this.onSave({\n displayName: displayName || undefined,\n avatarUrl: avatarUrl || undefined,\n });\n this.isEditMode = false;\n this.rerender();\n } catch (err) {\n this.showSaveError(err instanceof Error ? err.message : 'Save failed');\n }\n });\n\n const signOutBtn = this.shadowRoot.getElementById('profile-signout-btn');\n signOutBtn?.addEventListener('click', async () => {\n if (signOutBtn instanceof HTMLButtonElement) {\n signOutBtn.disabled = true;\n signOutBtn.textContent = '...';\n }\n try {\n await this.onSignOut();\n this.close();\n } catch (_) {\n if (signOutBtn instanceof HTMLButtonElement) {\n signOutBtn.disabled = false;\n signOutBtn.textContent = this.t.signOut;\n }\n }\n });\n\n this.shadowRoot.querySelectorAll<HTMLButtonElement>('.session-revoke-btn').forEach((btn) => {\n btn.addEventListener('click', async () => {\n const sessionId = btn.dataset.sessionId;\n if (!sessionId) return;\n btn.disabled = true;\n try {\n await this.onRevokeSession(sessionId);\n this.sessions = this.sessions.filter((s) => s.id !== sessionId);\n this.rerender();\n } catch (_) {\n btn.disabled = false;\n }\n });\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 { ProfileRenderer } from './profile';\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 profile: ProfileRenderer | 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 async openProfile(): Promise<void> {\n const user = this.getUser();\n if (!user) throw new Error('Must be signed in to open profile');\n\n const token = this.session.getToken();\n let sessions: import('@authon/shared').SessionInfo[] = [];\n if (token) {\n try {\n sessions = await this.listSessions();\n } catch (_) {\n // non-fatal: show profile without sessions\n }\n }\n\n if (!this.profile) {\n this.profile = new ProfileRenderer({\n mode: this.config.mode,\n theme: this.config.theme,\n locale: this.config.locale,\n containerId: this.config.containerId,\n branding: this.branding || undefined,\n user,\n sessions,\n onSave: async (data) => {\n const updated = await this.updateProfile(data);\n this.profile?.updateUser(updated);\n },\n onSignOut: async () => {\n await this.signOut();\n this.profile = null;\n },\n onRevokeSession: async (sessionId: string) => {\n await this.revokeSession(sessionId);\n },\n onClose: () => {\n this.profile?.close();\n this.profile = null;\n },\n });\n } else {\n this.profile.updateUser(user);\n this.profile.updateSessions(sessions);\n }\n\n this.profile.open();\n }\n\n closeProfile(): void {\n this.profile?.close();\n this.profile = null;\n }\n\n /** Update theme at runtime without destroying form state */\n setTheme(theme: 'light' | 'dark' | 'auto'): void {\n this.getModal().setTheme(theme);\n this.profile?.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 | { needsVerification: true; email: string }> {\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; needsVerification?: boolean; email?: string }>(\n '/v1/auth/signin',\n body,\n );\n if (res.needsVerification) {\n this.emit('verificationRequired', res.email);\n return { needsVerification: true, email: res.email! };\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 | { needsVerification: true; email: string }> {\n const res = await this.apiPost<AuthTokens & { needsVerification?: boolean; email?: string }>('/v1/auth/signup', {\n email,\n password,\n ...meta,\n });\n if (res.needsVerification) {\n this.emit('verificationRequired', res.email);\n return { needsVerification: true, email: res.email! };\n }\n this.session.setSession(res);\n this.emit('signedIn', res.user);\n return res.user;\n }\n\n async verifyEmail(email: string, code: string): Promise<AuthonUser> {\n const res = await this.apiPost<AuthTokens>('/v1/auth/verify-email', { email, code });\n this.session.setSession(res);\n this.emit('signedIn', res.user);\n return res.user;\n }\n\n async resendVerificationCode(email: string): Promise<void> {\n await this.apiPost<{ sent: true }>('/v1/auth/resend-code', { email });\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.profile?.close();\n this.profile = null;\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 locale: this.config.locale,\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 if (isSignUp) {\n this.signUpWithEmail(email, password, { turnstileToken })\n .then((result) => {\n if ('needsVerification' in result && result.needsVerification) {\n this.modal?.setSubmitLoading(false);\n this.modal?.showVerificationInput(email, async (code: string) => {\n await this.verifyEmail(email, code);\n this.modal?.close();\n }, async () => {\n await this.resendVerificationCode(email);\n });\n } else {\n this.modal?.close();\n }\n })\n .catch((err) => {\n this.modal?.resetTurnstile?.();\n this.modal?.setSubmitLoading(false);\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 } else {\n this.signInWithEmail(email, password, turnstileToken)\n .then((result) => {\n if ('needsVerification' in result && result.needsVerification) {\n this.modal?.setSubmitLoading(false);\n this.modal?.showVerificationInput(email, async (code: string) => {\n await this.verifyEmail(email, code);\n this.modal?.close();\n }, async () => {\n await this.resendVerificationCode(email);\n });\n } else {\n this.modal?.close();\n }\n })\n .catch((err) => {\n this.modal?.resetTurnstile?.();\n this.modal?.setSubmitLoading(false);\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 },\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 as any)?.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":["hexToRgba","provider"]}