@authon/js 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +190 -0
- package/README.md +408 -51
- package/dist/index.cjs +782 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +79 -2
- package/dist/index.d.ts +79 -2
- package/dist/index.js +780 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/modal.ts","../src/providers.ts","../src/session.ts","../src/authon.ts"],"sourcesContent":["import type { BrandingConfig, OAuthProviderType } from '@authon/shared';\nimport { DEFAULT_BRANDING } from '@authon/shared';\nimport { getProviderButtonConfig } from './providers';\n\nexport class ModalRenderer {\n private shadowRoot: ShadowRoot | null = null;\n private hostElement: HTMLDivElement | null = null;\n private containerElement: HTMLElement | null = null;\n private mode: 'popup' | 'embedded';\n private theme: 'light' | 'dark' | 'auto';\n private branding: BrandingConfig;\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 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 onProviderClick: (provider: OAuthProviderType) => void;\n onEmailSubmit: (email: string, password: string, isSignUp: boolean) => 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.onProviderClick = options.onProviderClick;\n this.onEmailSubmit = options.onEmailSubmit;\n this.onClose = options.onClose;\n\n if (options.mode === 'embedded' && options.containerId) {\n this.containerElement = document.getElementById(options.containerId);\n }\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 if (this.shadowRoot && this.hostElement) {\n // Modal already open — smooth in-place view switch\n this.switchView(view);\n } else {\n this.currentView = view;\n this.render(view);\n }\n }\n\n close(): void {\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 if (this.containerElement) {\n this.containerElement.innerHTML = '';\n }\n }\n\n showError(message: string): void {\n if (!this.shadowRoot) return;\n this.clearError();\n const errorEl = this.shadowRoot.getElementById('email-form');\n if (errorEl) {\n const errDiv = document.createElement('div');\n errDiv.id = 'authon-error-msg';\n errDiv.className = 'error-msg';\n errDiv.textContent = message;\n errorEl.appendChild(errDiv);\n }\n }\n\n showBanner(message: string, type: 'error' | 'warning' = 'error'): void {\n if (!this.shadowRoot) return;\n this.clearBanner();\n const inner = this.shadowRoot.getElementById('modal-inner');\n if (!inner) return;\n const banner = document.createElement('div');\n banner.id = 'authon-banner';\n banner.className = type === 'warning' ? 'banner-warning' : 'error-msg';\n banner.textContent = message;\n inner.insertBefore(banner, inner.firstChild);\n }\n\n clearBanner(): void {\n if (!this.shadowRoot) return;\n this.shadowRoot.getElementById('authon-banner')?.remove();\n }\n\n clearError(): void {\n if (!this.shadowRoot) return;\n this.shadowRoot.getElementById('authon-error-msg')?.remove();\n }\n\n showLoading(): void {\n if (!this.shadowRoot) return;\n this.hideLoading();\n const overlay = document.createElement('div');\n overlay.id = 'authon-loading-overlay';\n overlay.innerHTML = `\n <div class=\"loading-spinner\">\n <div class=\"loading-ring\"></div>\n <div class=\"loading-ring\"></div>\n <div class=\"loading-ring\"></div>\n </div>\n <div class=\"loading-text\">Signing in<span class=\"loading-dots\"><span></span><span></span><span></span></span></div>\n `;\n this.shadowRoot.querySelector('.modal-container')?.appendChild(overlay);\n }\n\n hideLoading(): void {\n if (!this.shadowRoot) return;\n this.shadowRoot.getElementById('authon-loading-overlay')?.remove();\n }\n\n // ── 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 if (this.containerElement) {\n this.containerElement.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\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>${this.buildCSS()}</style>\n ${popupWrapper}\n <div class=\"modal-container\" role=\"dialog\" aria-modal=\"true\">\n <div id=\"modal-inner\" class=\"modal-inner\">\n ${this.buildInnerContent(view)}\n </div>\n </div>\n `;\n }\n\n /** Inner content = everything inside the modal that changes per view */\n private buildInnerContent(view: 'signIn' | 'signUp'): string {\n const b = this.branding;\n const isSignUp = view === 'signUp';\n const title = isSignUp ? 'Create your account' : 'Welcome back';\n const subtitle = isSignUp ? 'Already have an account?' : \"Don't have an account?\";\n const subtitleLink = isSignUp ? 'Sign in' : 'Sign up';\n\n const dark = this.isDark();\n\n // SignUp view: hide providers, show only email form\n const showProviders = !isSignUp;\n\n const providerButtons = showProviders\n ? this.enabledProviders\n .filter((p) => !b.hiddenProviders?.includes(p))\n .map((p) => {\n const config = getProviderButtonConfig(p);\n const isWhiteBg = config.bgColor === '#ffffff';\n const btnBg = dark && isWhiteBg ? '#f8fafc' : config.bgColor;\n const btnBorder = isWhiteBg ? (dark ? '#475569' : '#e5e7eb') : config.bgColor;\n return `<button class=\"provider-btn\" data-provider=\"${p}\" style=\"background:${btnBg};color:${config.textColor};border:1px solid ${btnBorder}\">\n <span class=\"provider-icon\">${config.iconSvg}</span>\n <span>${config.label}</span>\n </button>`;\n })\n .join('')\n : '';\n\n const divider =\n showProviders && b.showDivider !== false && b.showEmailPassword !== false\n ? `<div class=\"divider\"><span>or</span></div>`\n : '';\n\n const emailForm =\n b.showEmailPassword !== false\n ? `<form class=\"email-form\" id=\"email-form\">\n <input type=\"email\" placeholder=\"Email address\" name=\"email\" required class=\"input\" autocomplete=\"email\" />\n <input type=\"password\" placeholder=\"Password\" name=\"password\" required class=\"input\" autocomplete=\"${isSignUp ? 'new-password' : 'current-password'}\" />\n ${isSignUp ? '<p class=\"password-hint\">Must contain uppercase, lowercase, and a number (min 8 chars)</p>' : ''}\n <button type=\"submit\" class=\"submit-btn\">${isSignUp ? 'Sign up' : 'Sign in'}</button>\n </form>`\n : '';\n\n 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 <p class=\"switch-view\">${subtitle} <a href=\"#\" id=\"switch-link\">${subtitleLink}</a></p>\n ${footer}\n ${b.showSecuredBy !== false ? `<div class=\"secured-by\">Secured by <a href=\"https://authon.dev\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"secured-link\">Authon</a></div>` : ''}\n `;\n }\n\n private isDark(): boolean {\n if (this.theme === 'dark') return true;\n if (this.theme === 'light') return false;\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-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: rgba(0,0,0,${dark ? '0.7' : '0.5'}); 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 /* Loading overlay */\n #authon-loading-overlay {\n position: absolute; inset: 0; z-index: 10;\n background: ${dark ? 'rgba(15,23,42,0.92)' : 'rgba(255,255,255,0.92)'};\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 ${b.customCss || ''}\n `;\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') this.onClose();\n };\n document.addEventListener('keydown', this.escHandler);\n }\n }\n\n /** Attach events to inner content (buttons, form, switch link) — called on each view */\n private attachInnerEvents(view: 'signIn' | 'signUp'): void {\n if (!this.shadowRoot) return;\n\n // Provider buttons\n this.shadowRoot.querySelectorAll('.provider-btn').forEach((btn) => {\n btn.addEventListener('click', () => {\n const provider = (btn as HTMLElement).dataset.provider as OAuthProviderType;\n this.onProviderClick(provider);\n });\n });\n\n // Email form\n const form = this.shadowRoot.getElementById('email-form') as HTMLFormElement | null;\n if (form) {\n form.addEventListener('submit', (e) => {\n e.preventDefault();\n const formData = new FormData(form);\n this.onEmailSubmit(\n formData.get('email') as string,\n formData.get('password') as string,\n view === 'signUp',\n );\n });\n }\n\n // 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}\n","import { PROVIDER_COLORS, PROVIDER_DISPLAY_NAMES, type OAuthProviderType } from '@authon/shared';\n\nexport interface ProviderButtonConfig {\n provider: OAuthProviderType;\n label: string;\n bgColor: string;\n textColor: string;\n iconSvg: string;\n}\n\nconst PROVIDER_ICONS: Record<OAuthProviderType, string> = {\n google: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path fill=\"#4285F4\" d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\"/><path fill=\"#34A853\" d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"/><path fill=\"#FBBC05\" d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"/><path fill=\"#EA4335\" d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"/></svg>`,\n apple: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\"><path d=\"M17.05 20.28c-.98.95-2.05.88-3.08.4-1.09-.5-2.08-.48-3.24 0-1.44.62-2.2.44-3.06-.4C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z\"/></svg>`,\n kakao: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path fill=\"#191919\" d=\"M12 3C6.48 3 2 6.36 2 10.43c0 2.62 1.75 4.93 4.37 6.23l-1.12 4.14c-.1.36.31.65.62.44l4.93-3.26c.39.04.79.06 1.2.06 5.52 0 10-3.36 10-7.61C22 6.36 17.52 3 12 3z\"/></svg>`,\n naver: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path fill=\"#fff\" d=\"M16.273 12.845 7.376 0H0v24h7.726V11.156L16.624 24H24V0h-7.727v12.845Z\"/></svg>`,\n facebook: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path fill=\"#fff\" d=\"M24 12.07C24 5.41 18.63 0 12 0S0 5.4 0 12.07C0 18.1 4.39 23.1 10.13 24v-8.44H7.08v-3.49h3.04V9.41c0-3.02 1.8-4.7 4.54-4.7 1.31 0 2.68.24 2.68.24v2.97h-1.5c-1.5 0-1.96.93-1.96 1.89v2.26h3.33l-.53 3.49h-2.8V24C19.62 23.1 24 18.1 24 12.07z\"/></svg>`,\n github: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"#fff\"><path d=\"M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z\"/></svg>`,\n discord: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"#fff\"><path d=\"M20.32 4.37a19.8 19.8 0 00-4.89-1.52.07.07 0 00-.08.04c-.21.38-.44.87-.61 1.26a18.27 18.27 0 00-5.49 0 12.64 12.64 0 00-.62-1.26.07.07 0 00-.08-.04 19.74 19.74 0 00-4.89 1.52.07.07 0 00-.03.03C1.11 8.39.34 12.28.73 16.12a.08.08 0 00.03.06 19.9 19.9 0 005.99 3.03.08.08 0 00.08-.03c.46-.63.87-1.3 1.22-2a.08.08 0 00-.04-.11 13.1 13.1 0 01-1.87-.9.08.08 0 01-.01-.13c.13-.09.25-.19.37-.29a.07.07 0 01.08-.01c3.93 1.8 8.18 1.8 12.07 0a.07.07 0 01.08 0c.12.1.25.2.37.3a.08.08 0 01-.01.12c-.6.35-1.22.65-1.87.9a.08.08 0 00-.04.1c.36.7.77 1.37 1.22 2a.08.08 0 00.08.03 19.83 19.83 0 006-3.03.08.08 0 00.03-.05c.47-4.87-.78-9.09-3.3-12.84a.06.06 0 00-.03-.03zM8.02 13.62c-1.11 0-2.03-1.02-2.03-2.28 0-1.26.9-2.28 2.03-2.28 1.14 0 2.04 1.03 2.03 2.28 0 1.26-.9 2.28-2.03 2.28zm7.5 0c-1.11 0-2.03-1.02-2.03-2.28 0-1.26.9-2.28 2.03-2.28 1.14 0 2.04 1.03 2.03 2.28 0 1.26-.89 2.28-2.03 2.28z\"/></svg>`,\n x: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"#fff\"><path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\"/></svg>`,\n line: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"#fff\"><path d=\"M19.365 9.863c.349 0 .63.285.63.631 0 .345-.281.63-.63.63H17.61v1.125h1.755c.349 0 .63.283.63.63 0 .344-.281.629-.63.629h-2.386c-.345 0-.627-.285-.627-.629V8.108c0-.345.282-.63.63-.63h2.386c.346 0 .627.285.627.63 0 .349-.281.63-.63.63H17.61v1.125h1.755zm-3.855 3.016c0 .27-.174.51-.432.596-.064.021-.133.031-.199.031-.211 0-.391-.09-.51-.25l-2.443-3.317v2.94c0 .344-.279.629-.631.629-.346 0-.626-.285-.626-.629V8.108c0-.27.173-.51.43-.595.06-.023.136-.033.194-.033.195 0 .375.104.495.254l2.462 3.33V8.108c0-.345.282-.63.63-.63.345 0 .63.285.63.63v4.771zm-5.741 0c0 .344-.282.629-.631.629-.345 0-.627-.285-.627-.629V8.108c0-.345.282-.63.63-.63.346 0 .628.285.628.63v4.771zm-2.466.629H4.917c-.345 0-.63-.285-.63-.629V8.108c0-.345.285-.63.63-.63.348 0 .63.285.63.63v4.141h1.756c.348 0 .629.283.629.63 0 .344-.282.629-.629.629M24 10.314C24 4.943 18.615.572 12 .572S0 4.943 0 10.314c0 4.811 4.27 8.842 10.035 9.608.391.082.923.258 1.058.59.12.301.079.766.038 1.08l-.164 1.02c-.045.301-.24 1.186 1.049.645 1.291-.539 6.916-4.078 9.436-6.975C23.176 14.393 24 12.458 24 10.314\"/></svg>`,\n microsoft: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><rect fill=\"#F25022\" x=\"1\" y=\"1\" width=\"10\" height=\"10\"/><rect fill=\"#7FBA00\" x=\"13\" y=\"1\" width=\"10\" height=\"10\"/><rect fill=\"#00A4EF\" x=\"1\" y=\"13\" width=\"10\" height=\"10\"/><rect fill=\"#FFB900\" x=\"13\" y=\"13\" width=\"10\" height=\"10\"/></svg>`,\n};\n\nexport function getProviderButtonConfig(provider: OAuthProviderType): ProviderButtonConfig {\n const colors = PROVIDER_COLORS[provider];\n return {\n provider,\n label: `Continue with ${PROVIDER_DISPLAY_NAMES[provider]}`,\n bgColor: colors.bg,\n textColor: colors.text,\n iconSvg: PROVIDER_ICONS[provider],\n };\n}\n","import type { 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\n constructor(publishableKey: string, apiUrl: string) {\n this.publishableKey = publishableKey;\n this.apiUrl = apiUrl;\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 if (tokens.expiresIn && tokens.expiresIn > 0) {\n this.scheduleRefresh(tokens.expiresIn);\n }\n }\n\n clearSession(): void {\n this.accessToken = null;\n this.refreshToken = null;\n this.user = null;\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","import type { AuthonUser, AuthTokens, BrandingConfig, OAuthProviderType } from '@authon/shared';\nimport type {\n AuthonConfig,\n AuthonEventType,\n AuthonEvents,\n OAuthFlowMode,\n OAuthSignInOptions,\n} from './types';\nimport { ModalRenderer } from './modal';\nimport { SessionManager } from './session';\n\ninterface ProvidersResponse {\n providers: OAuthProviderType[];\n providerConfigs?: Partial<Record<OAuthProviderType, { oauthFlow?: OAuthFlowMode }>>;\n}\n\nexport class Authon {\n private publishableKey: string;\n private config: Required<Omit<AuthonConfig, 'containerId' | 'appearance'>> & {\n containerId?: string;\n appearance?: Partial<BrandingConfig>;\n };\n private session: SessionManager;\n private modal: ModalRenderer | null = null;\n private listeners: Map<string, Set<(...args: unknown[]) => void>> = new Map();\n private branding: BrandingConfig | null = null;\n private providers: OAuthProviderType[] = [];\n private providerFlowModes: Partial<Record<OAuthProviderType, OAuthFlowMode>> = {};\n private initialized = false;\n\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 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 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): Promise<AuthonUser> {\n const tokens = await this.apiPost<AuthTokens>('/v1/auth/signin', { email, password });\n this.session.setSession(tokens);\n this.emit('signedIn', tokens.user);\n return tokens.user;\n }\n\n async signUpWithEmail(\n email: string,\n password: string,\n meta?: { displayName?: string },\n ): Promise<AuthonUser> {\n const tokens = await this.apiPost<AuthTokens>('/v1/auth/signup', {\n email,\n password,\n ...meta,\n });\n this.session.setSession(tokens);\n this.emit('signedIn', tokens.user);\n return tokens.user;\n }\n\n async signOut(): Promise<void> {\n await this.session.signOut();\n this.emit('signedOut');\n }\n\n getUser(): AuthonUser | null {\n return this.session.getUser();\n }\n\n getToken(): string | null {\n return this.session.getToken();\n }\n\n on<K extends AuthonEventType>(event: K, listener: AuthonEvents[K]): () => void {\n if (!this.listeners.has(event)) this.listeners.set(event, new Set());\n const set = this.listeners.get(event)!;\n set.add(listener as (...args: unknown[]) => void);\n return () => set.delete(listener as (...args: unknown[]) => void);\n }\n\n destroy(): void {\n this.modal?.close();\n this.session.destroy();\n this.listeners.clear();\n }\n\n // ── Internal ──\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.providers = providersRes.providers;\n this.providerFlowModes = {};\n for (const provider of this.providers) {\n this.providerFlowModes[provider] = this.normalizeFlowMode(\n providersRes.providerConfigs?.[provider]?.oauthFlow,\n );\n }\n this.initialized = true;\n } catch (err) {\n this.emit('error', err instanceof Error ? err : new Error(String(err)));\n throw err;\n }\n }\n\n private getModal(): ModalRenderer {\n if (!this.modal) {\n this.modal = new ModalRenderer({\n mode: this.config.mode,\n theme: this.config.theme,\n containerId: this.config.containerId,\n branding: this.branding || undefined,\n onProviderClick: (provider) => this.startOAuthFlow(provider),\n onEmailSubmit: (email, password, isSignUp) => {\n this.modal?.clearError();\n const promise = isSignUp\n ? this.signUpWithEmail(email, password)\n : this.signInWithEmail(email, password);\n promise\n .then(() => this.modal?.close())\n .catch((err) => {\n const msg = err instanceof Error ? err.message : String(err);\n this.modal?.showError(msg || 'Authentication failed');\n this.emit('error', err instanceof Error ? err : new Error(msg));\n });\n },\n onClose: () => this.modal?.close(),\n });\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 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":[]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/modal.ts","../src/providers.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","import type { BrandingConfig, OAuthProviderType } from '@authon/shared';\nimport { DEFAULT_BRANDING } from '@authon/shared';\nimport { getProviderButtonConfig } from './providers';\n\nexport class ModalRenderer {\n private shadowRoot: ShadowRoot | null = null;\n private hostElement: HTMLDivElement | null = null;\n private containerElement: HTMLElement | null = null;\n private mode: 'popup' | 'embedded';\n private theme: 'light' | 'dark' | 'auto';\n private branding: BrandingConfig;\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 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 onProviderClick: (provider: OAuthProviderType) => void;\n onEmailSubmit: (email: string, password: string, isSignUp: boolean) => 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.onProviderClick = options.onProviderClick;\n this.onEmailSubmit = options.onEmailSubmit;\n this.onClose = options.onClose;\n\n if (options.mode === 'embedded' && options.containerId) {\n this.containerElement = document.getElementById(options.containerId);\n }\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 if (this.shadowRoot && this.hostElement) {\n // Modal already open — smooth in-place view switch\n this.switchView(view);\n } else {\n this.currentView = view;\n this.render(view);\n }\n }\n\n close(): void {\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 if (this.containerElement) {\n this.containerElement.innerHTML = '';\n }\n }\n\n showError(message: string): void {\n if (!this.shadowRoot) return;\n this.clearError();\n const errorEl = this.shadowRoot.getElementById('email-form');\n if (errorEl) {\n const errDiv = document.createElement('div');\n errDiv.id = 'authon-error-msg';\n errDiv.className = 'error-msg';\n errDiv.textContent = message;\n errorEl.appendChild(errDiv);\n }\n }\n\n showBanner(message: string, type: 'error' | 'warning' = 'error'): void {\n if (!this.shadowRoot) return;\n this.clearBanner();\n const inner = this.shadowRoot.getElementById('modal-inner');\n if (!inner) return;\n const banner = document.createElement('div');\n banner.id = 'authon-banner';\n banner.className = type === 'warning' ? 'banner-warning' : 'error-msg';\n banner.textContent = message;\n inner.insertBefore(banner, inner.firstChild);\n }\n\n clearBanner(): void {\n if (!this.shadowRoot) return;\n this.shadowRoot.getElementById('authon-banner')?.remove();\n }\n\n clearError(): void {\n if (!this.shadowRoot) return;\n this.shadowRoot.getElementById('authon-error-msg')?.remove();\n }\n\n showLoading(): void {\n if (!this.shadowRoot) return;\n this.hideLoading();\n const overlay = document.createElement('div');\n overlay.id = 'authon-loading-overlay';\n overlay.innerHTML = `\n <div class=\"loading-spinner\">\n <div class=\"loading-ring\"></div>\n <div class=\"loading-ring\"></div>\n <div class=\"loading-ring\"></div>\n </div>\n <div class=\"loading-text\">Signing in<span class=\"loading-dots\"><span></span><span></span><span></span></span></div>\n `;\n this.shadowRoot.querySelector('.modal-container')?.appendChild(overlay);\n }\n\n hideLoading(): void {\n if (!this.shadowRoot) return;\n this.shadowRoot.getElementById('authon-loading-overlay')?.remove();\n }\n\n // ── 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 if (this.containerElement) {\n this.containerElement.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\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>${this.buildCSS()}</style>\n ${popupWrapper}\n <div class=\"modal-container\" role=\"dialog\" aria-modal=\"true\">\n <div id=\"modal-inner\" class=\"modal-inner\">\n ${this.buildInnerContent(view)}\n </div>\n </div>\n `;\n }\n\n /** Inner content = everything inside the modal that changes per view */\n private buildInnerContent(view: 'signIn' | 'signUp'): string {\n const b = this.branding;\n const isSignUp = view === 'signUp';\n const title = isSignUp ? 'Create your account' : 'Welcome back';\n const subtitle = isSignUp ? 'Already have an account?' : \"Don't have an account?\";\n const subtitleLink = isSignUp ? 'Sign in' : 'Sign up';\n\n const dark = this.isDark();\n\n // SignUp view: hide providers, show only email form\n const showProviders = !isSignUp;\n\n const providerButtons = showProviders\n ? this.enabledProviders\n .filter((p) => !b.hiddenProviders?.includes(p))\n .map((p) => {\n const config = getProviderButtonConfig(p);\n const isWhiteBg = config.bgColor === '#ffffff';\n const btnBg = dark && isWhiteBg ? '#f8fafc' : config.bgColor;\n const btnBorder = isWhiteBg ? (dark ? '#475569' : '#e5e7eb') : config.bgColor;\n return `<button class=\"provider-btn\" data-provider=\"${p}\" style=\"background:${btnBg};color:${config.textColor};border:1px solid ${btnBorder}\">\n <span class=\"provider-icon\">${config.iconSvg}</span>\n <span>${config.label}</span>\n </button>`;\n })\n .join('')\n : '';\n\n const divider =\n showProviders && b.showDivider !== false && b.showEmailPassword !== false\n ? `<div class=\"divider\"><span>or</span></div>`\n : '';\n\n const emailForm =\n b.showEmailPassword !== false\n ? `<form class=\"email-form\" id=\"email-form\">\n <input type=\"email\" placeholder=\"Email address\" name=\"email\" required class=\"input\" autocomplete=\"email\" />\n <input type=\"password\" placeholder=\"Password\" name=\"password\" required class=\"input\" autocomplete=\"${isSignUp ? 'new-password' : 'current-password'}\" />\n ${isSignUp ? '<p class=\"password-hint\">Must contain uppercase, lowercase, and a number (min 8 chars)</p>' : ''}\n <button type=\"submit\" class=\"submit-btn\">${isSignUp ? 'Sign up' : 'Sign in'}</button>\n </form>`\n : '';\n\n 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 <p class=\"switch-view\">${subtitle} <a href=\"#\" id=\"switch-link\">${subtitleLink}</a></p>\n ${footer}\n ${b.showSecuredBy !== false ? `<div class=\"secured-by\">Secured by <a href=\"https://authon.dev\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"secured-link\">Authon</a></div>` : ''}\n `;\n }\n\n private isDark(): boolean {\n if (this.theme === 'dark') return true;\n if (this.theme === 'light') return false;\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-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: rgba(0,0,0,${dark ? '0.7' : '0.5'}); 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 /* Loading overlay */\n #authon-loading-overlay {\n position: absolute; inset: 0; z-index: 10;\n background: ${dark ? 'rgba(15,23,42,0.92)' : 'rgba(255,255,255,0.92)'};\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 ${b.customCss || ''}\n `;\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') this.onClose();\n };\n document.addEventListener('keydown', this.escHandler);\n }\n }\n\n /** Attach events to inner content (buttons, form, switch link) — called on each view */\n private attachInnerEvents(view: 'signIn' | 'signUp'): void {\n if (!this.shadowRoot) return;\n\n // Provider buttons\n this.shadowRoot.querySelectorAll('.provider-btn').forEach((btn) => {\n btn.addEventListener('click', () => {\n const provider = (btn as HTMLElement).dataset.provider as OAuthProviderType;\n this.onProviderClick(provider);\n });\n });\n\n // Email form\n const form = this.shadowRoot.getElementById('email-form') as HTMLFormElement | null;\n if (form) {\n form.addEventListener('submit', (e) => {\n e.preventDefault();\n const formData = new FormData(form);\n this.onEmailSubmit(\n formData.get('email') as string,\n formData.get('password') as string,\n view === 'signUp',\n );\n });\n }\n\n // 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}\n","import { PROVIDER_COLORS, PROVIDER_DISPLAY_NAMES, type OAuthProviderType } from '@authon/shared';\n\nexport interface ProviderButtonConfig {\n provider: OAuthProviderType;\n label: string;\n bgColor: string;\n textColor: string;\n iconSvg: string;\n}\n\nconst PROVIDER_ICONS: Record<OAuthProviderType, string> = {\n google: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path fill=\"#4285F4\" d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\"/><path fill=\"#34A853\" d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"/><path fill=\"#FBBC05\" d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"/><path fill=\"#EA4335\" d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"/></svg>`,\n apple: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\"><path d=\"M17.05 20.28c-.98.95-2.05.88-3.08.4-1.09-.5-2.08-.48-3.24 0-1.44.62-2.2.44-3.06-.4C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z\"/></svg>`,\n kakao: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path fill=\"#191919\" d=\"M12 3C6.48 3 2 6.36 2 10.43c0 2.62 1.75 4.93 4.37 6.23l-1.12 4.14c-.1.36.31.65.62.44l4.93-3.26c.39.04.79.06 1.2.06 5.52 0 10-3.36 10-7.61C22 6.36 17.52 3 12 3z\"/></svg>`,\n naver: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path fill=\"#fff\" d=\"M16.273 12.845 7.376 0H0v24h7.726V11.156L16.624 24H24V0h-7.727v12.845Z\"/></svg>`,\n facebook: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><path fill=\"#fff\" d=\"M24 12.07C24 5.41 18.63 0 12 0S0 5.4 0 12.07C0 18.1 4.39 23.1 10.13 24v-8.44H7.08v-3.49h3.04V9.41c0-3.02 1.8-4.7 4.54-4.7 1.31 0 2.68.24 2.68.24v2.97h-1.5c-1.5 0-1.96.93-1.96 1.89v2.26h3.33l-.53 3.49h-2.8V24C19.62 23.1 24 18.1 24 12.07z\"/></svg>`,\n github: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"#fff\"><path d=\"M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z\"/></svg>`,\n discord: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"#fff\"><path d=\"M20.32 4.37a19.8 19.8 0 00-4.89-1.52.07.07 0 00-.08.04c-.21.38-.44.87-.61 1.26a18.27 18.27 0 00-5.49 0 12.64 12.64 0 00-.62-1.26.07.07 0 00-.08-.04 19.74 19.74 0 00-4.89 1.52.07.07 0 00-.03.03C1.11 8.39.34 12.28.73 16.12a.08.08 0 00.03.06 19.9 19.9 0 005.99 3.03.08.08 0 00.08-.03c.46-.63.87-1.3 1.22-2a.08.08 0 00-.04-.11 13.1 13.1 0 01-1.87-.9.08.08 0 01-.01-.13c.13-.09.25-.19.37-.29a.07.07 0 01.08-.01c3.93 1.8 8.18 1.8 12.07 0a.07.07 0 01.08 0c.12.1.25.2.37.3a.08.08 0 01-.01.12c-.6.35-1.22.65-1.87.9a.08.08 0 00-.04.1c.36.7.77 1.37 1.22 2a.08.08 0 00.08.03 19.83 19.83 0 006-3.03.08.08 0 00.03-.05c.47-4.87-.78-9.09-3.3-12.84a.06.06 0 00-.03-.03zM8.02 13.62c-1.11 0-2.03-1.02-2.03-2.28 0-1.26.9-2.28 2.03-2.28 1.14 0 2.04 1.03 2.03 2.28 0 1.26-.9 2.28-2.03 2.28zm7.5 0c-1.11 0-2.03-1.02-2.03-2.28 0-1.26.9-2.28 2.03-2.28 1.14 0 2.04 1.03 2.03 2.28 0 1.26-.89 2.28-2.03 2.28z\"/></svg>`,\n x: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"#fff\"><path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\"/></svg>`,\n line: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"#fff\"><path d=\"M19.365 9.863c.349 0 .63.285.63.631 0 .345-.281.63-.63.63H17.61v1.125h1.755c.349 0 .63.283.63.63 0 .344-.281.629-.63.629h-2.386c-.345 0-.627-.285-.627-.629V8.108c0-.345.282-.63.63-.63h2.386c.346 0 .627.285.627.63 0 .349-.281.63-.63.63H17.61v1.125h1.755zm-3.855 3.016c0 .27-.174.51-.432.596-.064.021-.133.031-.199.031-.211 0-.391-.09-.51-.25l-2.443-3.317v2.94c0 .344-.279.629-.631.629-.346 0-.626-.285-.626-.629V8.108c0-.27.173-.51.43-.595.06-.023.136-.033.194-.033.195 0 .375.104.495.254l2.462 3.33V8.108c0-.345.282-.63.63-.63.345 0 .63.285.63.63v4.771zm-5.741 0c0 .344-.282.629-.631.629-.345 0-.627-.285-.627-.629V8.108c0-.345.282-.63.63-.63.346 0 .628.285.628.63v4.771zm-2.466.629H4.917c-.345 0-.63-.285-.63-.629V8.108c0-.345.285-.63.63-.63.348 0 .63.285.63.63v4.141h1.756c.348 0 .629.283.629.63 0 .344-.282.629-.629.629M24 10.314C24 4.943 18.615.572 12 .572S0 4.943 0 10.314c0 4.811 4.27 8.842 10.035 9.608.391.082.923.258 1.058.59.12.301.079.766.038 1.08l-.164 1.02c-.045.301-.24 1.186 1.049.645 1.291-.539 6.916-4.078 9.436-6.975C23.176 14.393 24 12.458 24 10.314\"/></svg>`,\n microsoft: `<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\"><rect fill=\"#F25022\" x=\"1\" y=\"1\" width=\"10\" height=\"10\"/><rect fill=\"#7FBA00\" x=\"13\" y=\"1\" width=\"10\" height=\"10\"/><rect fill=\"#00A4EF\" x=\"1\" y=\"13\" width=\"10\" height=\"10\"/><rect fill=\"#FFB900\" x=\"13\" y=\"13\" width=\"10\" height=\"10\"/></svg>`,\n};\n\nexport function getProviderButtonConfig(provider: OAuthProviderType): ProviderButtonConfig {\n const colors = PROVIDER_COLORS[provider];\n return {\n provider,\n label: `Continue with ${PROVIDER_DISPLAY_NAMES[provider]}`,\n bgColor: colors.bg,\n textColor: colors.text,\n iconSvg: PROVIDER_ICONS[provider],\n };\n}\n","import type { 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\n constructor(publishableKey: string, apiUrl: string) {\n this.publishableKey = publishableKey;\n this.apiUrl = apiUrl;\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 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 if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n private scheduleRefresh(expiresIn: number): void {\n if (this.refreshTimer) clearTimeout(this.refreshTimer);\n // Refresh 60 seconds before expiry\n const refreshIn = Math.max((expiresIn - 60) * 1000, 30000);\n this.refreshTimer = setTimeout(() => this.refresh(), refreshIn);\n }\n\n async refresh(): Promise<AuthTokens | null> {\n if (!this.refreshToken) {\n this.clearSession();\n return null;\n }\n try {\n const res = await fetch(`${this.apiUrl}/v1/auth/token/refresh`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.publishableKey,\n },\n credentials: 'include',\n body: JSON.stringify({ refreshToken: this.refreshToken }),\n });\n if (!res.ok) {\n this.clearSession();\n return null;\n }\n const tokens: AuthTokens = await res.json();\n this.setSession(tokens);\n return tokens;\n } catch {\n this.clearSession();\n return null;\n }\n }\n\n async signOut(): Promise<void> {\n try {\n await fetch(`${this.apiUrl}/v1/auth/signout`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.publishableKey,\n ...(this.accessToken ? { Authorization: `Bearer ${this.accessToken}` } : {}),\n },\n credentials: 'include',\n });\n } catch {\n // ignore\n }\n this.clearSession();\n }\n\n destroy(): void {\n this.clearSession();\n }\n}\n","/**\n * Minimal QR Code SVG generator — byte mode, EC Level L, versions 1–13.\n * Zero dependencies. Produces a standalone SVG string.\n */\n\n// ── GF(256) with irreducible polynomial x^8+x^4+x^3+x^2+1 (0x11D) ──\n\nconst EXP: number[] = [];\nconst LOG: number[] = new Array(256).fill(0);\n(() => {\n let v = 1;\n for (let i = 0; i < 255; i++) {\n EXP[i] = v;\n LOG[v] = i;\n v <<= 1;\n if (v & 256) v ^= 0x11d;\n }\n for (let i = 255; i < 512; i++) EXP[i] = EXP[i - 255];\n})();\n\nconst gfMul = (a: number, b: number): number => (a && b ? EXP[LOG[a] + LOG[b]] : 0);\n\n// ── Reed-Solomon error correction ──\n\nfunction rsEncode(data: number[], ecLen: number): number[] {\n // Build generator polynomial in ascending degree order\n let g = [1];\n for (let i = 0; i < ecLen; i++) {\n const ng = new Array(g.length + 1).fill(0);\n for (let j = 0; j < g.length; j++) {\n ng[j] ^= gfMul(g[j], EXP[i]);\n ng[j + 1] ^= g[j];\n }\n g = ng;\n }\n // Polynomial division: remainder of data(x)*x^ecLen / g(x)\n const rem = new Array(ecLen).fill(0);\n for (const d of data) {\n const fb = d ^ rem[0];\n for (let j = 0; j < ecLen - 1; j++) {\n rem[j] = rem[j + 1] ^ gfMul(g[ecLen - 1 - j], fb);\n }\n rem[ecLen - 1] = gfMul(g[0], fb);\n }\n return rem;\n}\n\n// ── Version tables (EC Level L only) ──\n\ninterface VerInfo {\n total: number; ec: number; g1: number; g1d: number; g2: number; g2d: number; align: number[];\n}\n\nconst VER: VerInfo[] = [\n { total: 0, ec: 0, g1: 0, g1d: 0, g2: 0, g2d: 0, align: [] }, // dummy\n { total: 26, ec: 7, g1: 1, g1d: 19, g2: 0, g2d: 0, align: [] },\n { total: 44, ec: 10, g1: 1, g1d: 34, g2: 0, g2d: 0, align: [6, 18] },\n { total: 70, ec: 15, g1: 1, g1d: 55, g2: 0, g2d: 0, align: [6, 22] },\n { total: 100, ec: 20, g1: 1, g1d: 80, g2: 0, g2d: 0, align: [6, 26] },\n { total: 134, ec: 26, g1: 1, g1d: 108, g2: 0, g2d: 0, align: [6, 30] },\n { total: 172, ec: 18, g1: 2, g1d: 68, g2: 0, g2d: 0, align: [6, 34] },\n { total: 196, ec: 20, g1: 2, g1d: 78, g2: 0, g2d: 0, align: [6, 22, 38] },\n { total: 242, ec: 24, g1: 2, g1d: 97, g2: 0, g2d: 0, align: [6, 24, 42] },\n { total: 292, ec: 30, g1: 2, g1d: 116, g2: 0, g2d: 0, align: [6, 26, 46] },\n { total: 346, ec: 18, g1: 2, g1d: 68, g2: 2, g2d: 69, align: [6, 28, 50] },\n { total: 404, ec: 20, g1: 4, g1d: 81, g2: 0, g2d: 0, align: [6, 30, 54] },\n { total: 466, ec: 24, g1: 2, g1d: 92, g2: 2, g2d: 93, align: [6, 32, 58] },\n { total: 532, ec: 26, g1: 4, g1d: 107, g2: 0, g2d: 0, align: [6, 34, 62] },\n];\n\nfunction dataCapacity(ver: number): number {\n const v = VER[ver];\n return v.g1 * v.g1d + v.g2 * v.g2d;\n}\n\nfunction pickVersion(byteLen: number): number {\n for (let v = 1; v < VER.length; v++) {\n const headerBits = 4 + (v <= 9 ? 8 : 16); // mode indicator + char count\n const available = dataCapacity(v) * 8 - headerBits;\n if (byteLen * 8 <= available) return v;\n }\n throw new Error(`Data too long for QR code (${byteLen} bytes)`);\n}\n\n// ── Data encoding (byte mode) ──\n\nfunction encodeData(bytes: number[], ver: number): number[] {\n const cap = dataCapacity(ver);\n const countBits = ver <= 9 ? 8 : 16;\n const bits: number[] = [];\n\n const push = (val: number, len: number) => {\n for (let i = len - 1; i >= 0; i--) bits.push((val >> i) & 1);\n };\n\n push(0b0100, 4); // byte mode indicator\n push(bytes.length, countBits);\n for (const b of bytes) push(b, 8);\n push(0, Math.min(4, cap * 8 - bits.length)); // terminator\n\n // Pad to byte boundary\n while (bits.length % 8) bits.push(0);\n\n // Pad codewords\n const padBytes = [0xec, 0x11];\n let pi = 0;\n while (bits.length < cap * 8) {\n push(padBytes[pi], 8);\n pi ^= 1;\n }\n\n // Convert bits to codewords\n const cw: number[] = [];\n for (let i = 0; i < bits.length; i += 8) {\n let byte = 0;\n for (let j = 0; j < 8; j++) byte = (byte << 1) | bits[i + j];\n cw.push(byte);\n }\n return cw;\n}\n\n// ── EC encoding and interleaving ──\n\nfunction computeCodewords(ver: number, dataCW: number[]): number[] {\n const v = VER[ver];\n const blocks: number[][] = [];\n const ecBlocks: number[][] = [];\n let offset = 0;\n\n for (let i = 0; i < v.g1; i++) {\n const block = dataCW.slice(offset, offset + v.g1d);\n blocks.push(block);\n ecBlocks.push(rsEncode(block, v.ec));\n offset += v.g1d;\n }\n for (let i = 0; i < v.g2; i++) {\n const block = dataCW.slice(offset, offset + v.g2d);\n blocks.push(block);\n ecBlocks.push(rsEncode(block, v.ec));\n offset += v.g2d;\n }\n\n // Interleave data\n const result: number[] = [];\n const maxDataLen = Math.max(v.g1d, v.g2d || 0);\n for (let i = 0; i < maxDataLen; i++) {\n for (const block of blocks) {\n if (i < block.length) result.push(block[i]);\n }\n }\n // Interleave EC\n for (let i = 0; i < v.ec; i++) {\n for (const block of ecBlocks) result.push(block[i]);\n }\n\n return result;\n}\n\n// ── Matrix construction ──\n\nconst UNSET = -1;\nconst DARK = 1;\nconst LIGHT = 0;\n\nfunction createMatrix(size: number): number[][] {\n return Array.from({ length: size }, () => new Array(size).fill(UNSET));\n}\n\nfunction setModule(m: number[][], r: number, c: number, dark: boolean) {\n if (r >= 0 && r < m.length && c >= 0 && c < m.length) m[r][c] = dark ? DARK : LIGHT;\n}\n\nfunction placeFinderPattern(m: number[][], row: number, col: number) {\n for (let r = -1; r <= 7; r++) {\n for (let c = -1; c <= 7; c++) {\n const dark =\n r >= 0 && r <= 6 && c >= 0 && c <= 6 &&\n (r === 0 || r === 6 || c === 0 || c === 6 || (r >= 2 && r <= 4 && c >= 2 && c <= 4));\n setModule(m, row + r, col + c, dark);\n }\n }\n}\n\nfunction placeAlignmentPattern(m: number[][], row: number, col: number) {\n for (let r = -2; r <= 2; r++) {\n for (let c = -2; c <= 2; c++) {\n const dark = Math.abs(r) === 2 || Math.abs(c) === 2 || (r === 0 && c === 0);\n m[row + r][col + c] = dark ? DARK : LIGHT;\n }\n }\n}\n\nfunction isReserved(m: number[][], r: number, c: number): boolean {\n return m[r][c] !== UNSET;\n}\n\nfunction buildMatrix(ver: number, codewords: number[]): number[][] {\n const size = ver * 4 + 17;\n const m = createMatrix(size);\n\n // Finder patterns + separators\n placeFinderPattern(m, 0, 0);\n placeFinderPattern(m, 0, size - 7);\n placeFinderPattern(m, size - 7, 0);\n\n // Timing patterns\n for (let i = 8; i < size - 8; i++) {\n m[6][i] = i % 2 === 0 ? DARK : LIGHT;\n m[i][6] = i % 2 === 0 ? DARK : LIGHT;\n }\n\n // Alignment patterns\n const ap = VER[ver].align;\n if (ap.length > 0) {\n for (const r of ap) {\n for (const c of ap) {\n // Skip if overlapping finder patterns\n if (r <= 8 && c <= 8) continue;\n if (r <= 8 && c >= size - 8) continue;\n if (r >= size - 8 && c <= 8) continue;\n placeAlignmentPattern(m, r, c);\n }\n }\n }\n\n // Dark module\n m[4 * ver + 9][8] = DARK;\n\n // Reserve format info areas (will be filled after masking)\n for (let i = 0; i < 9; i++) {\n if (m[8][i] === UNSET) m[8][i] = LIGHT; // top-left horizontal\n if (m[i][8] === UNSET) m[i][8] = LIGHT; // top-left vertical\n }\n for (let i = 0; i < 8; i++) {\n if (m[8][size - 1 - i] === UNSET) m[8][size - 1 - i] = LIGHT; // top-right\n if (m[size - 1 - i][8] === UNSET) m[size - 1 - i][8] = LIGHT; // bottom-left\n }\n\n // Reserve version info areas (version >= 7)\n if (ver >= 7) {\n for (let i = 0; i < 6; i++) {\n for (let j = 0; j < 3; j++) {\n m[i][size - 11 + j] = LIGHT;\n m[size - 11 + j][i] = LIGHT;\n }\n }\n }\n\n // Place data in zigzag pattern\n let bitIdx = 0;\n const totalBits = codewords.length * 8;\n let upward = true;\n\n for (let right = size - 1; right >= 0; right -= 2) {\n if (right === 6) right = 5; // skip timing column\n for (let i = 0; i < size; i++) {\n const row = upward ? size - 1 - i : i;\n for (const dc of [0, -1]) {\n const col = right + dc;\n if (col < 0 || col >= size) continue;\n if (isReserved(m, row, col)) continue;\n if (bitIdx < totalBits) {\n const byteIdx = bitIdx >> 3;\n const bitPos = 7 - (bitIdx & 7);\n m[row][col] = (codewords[byteIdx] >> bitPos) & 1;\n bitIdx++;\n } else {\n m[row][col] = LIGHT;\n }\n }\n }\n upward = !upward;\n }\n\n return m;\n}\n\n// ── Masking ──\n\ntype MaskFn = (r: number, c: number) => boolean;\n\nconst MASKS: MaskFn[] = [\n (r, c) => (r + c) % 2 === 0,\n (r) => r % 2 === 0,\n (_, c) => c % 3 === 0,\n (r, c) => (r + c) % 3 === 0,\n (r, c) => (Math.floor(r / 2) + Math.floor(c / 3)) % 2 === 0,\n (r, c) => ((r * c) % 2) + ((r * c) % 3) === 0,\n (r, c) => (((r * c) % 2) + ((r * c) % 3)) % 2 === 0,\n (r, c) => (((r + c) % 2) + ((r * c) % 3)) % 2 === 0,\n];\n\nfunction applyMask(m: number[][], maskIdx: number, template: number[][]): number[][] {\n const size = m.length;\n const result = m.map((row) => [...row]);\n const fn = MASKS[maskIdx];\n for (let r = 0; r < size; r++) {\n for (let c = 0; c < size; c++) {\n if (template[r][c] !== UNSET) continue; // reserved area\n if (fn(r, c)) result[r][c] ^= 1;\n }\n }\n return result;\n}\n\nfunction penalty(m: number[][]): number {\n const size = m.length;\n let score = 0;\n\n // Rule 1: consecutive same-color modules\n for (let r = 0; r < size; r++) {\n let count = 1;\n for (let c = 1; c < size; c++) {\n if (m[r][c] === m[r][c - 1]) { count++; } else {\n if (count >= 5) score += count - 2;\n count = 1;\n }\n }\n if (count >= 5) score += count - 2;\n }\n for (let c = 0; c < size; c++) {\n let count = 1;\n for (let r = 1; r < size; r++) {\n if (m[r][c] === m[r - 1][c]) { count++; } else {\n if (count >= 5) score += count - 2;\n count = 1;\n }\n }\n if (count >= 5) score += count - 2;\n }\n\n // Rule 2: 2x2 blocks\n for (let r = 0; r < size - 1; r++) {\n for (let c = 0; c < size - 1; c++) {\n const v = m[r][c];\n if (v === m[r][c + 1] && v === m[r + 1][c] && v === m[r + 1][c + 1]) score += 3;\n }\n }\n\n // Rule 3: finder-like patterns\n const pat1 = [1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0];\n const pat2 = [0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1];\n for (let r = 0; r < size; r++) {\n for (let c = 0; c <= size - 11; c++) {\n let match1 = true, match2 = true;\n for (let k = 0; k < 11; k++) {\n if (m[r][c + k] !== pat1[k]) match1 = false;\n if (m[r][c + k] !== pat2[k]) match2 = false;\n }\n if (match1 || match2) score += 40;\n }\n }\n for (let c = 0; c < size; c++) {\n for (let r = 0; r <= size - 11; r++) {\n let match1 = true, match2 = true;\n for (let k = 0; k < 11; k++) {\n if (m[r + k][c] !== pat1[k]) match1 = false;\n if (m[r + k][c] !== pat2[k]) match2 = false;\n }\n if (match1 || match2) score += 40;\n }\n }\n\n // Rule 4: dark/light ratio\n let dark = 0;\n for (let r = 0; r < size; r++) for (let c = 0; c < size; c++) if (m[r][c]) dark++;\n const pct = (dark * 100) / (size * size);\n const prev5 = Math.floor(pct / 5) * 5;\n const next5 = prev5 + 5;\n score += Math.min(Math.abs(prev5 - 50) / 5, Math.abs(next5 - 50) / 5) * 10;\n\n return score;\n}\n\n// ── Format & version information ──\n\nfunction bchEncode(data: number, gen: number, dataBits: number): number {\n let d = data << (15 - dataBits); // Shift depends on total - data bits\n const genLen = Math.floor(Math.log2(gen)) + 1;\n const totalBits = dataBits + (genLen - 1);\n d = data << (totalBits - dataBits);\n for (let i = dataBits - 1; i >= 0; i--) {\n if (d & (1 << (i + genLen - 1))) d ^= gen << i;\n }\n return (data << (genLen - 1)) | d;\n}\n\nfunction placeFormatInfo(m: number[][], maskIdx: number) {\n const size = m.length;\n // EC Level L = 01, mask pattern = maskIdx (3 bits)\n const data = (0b01 << 3) | maskIdx;\n let format = bchEncode(data, 0x537, 5);\n format ^= 0x5412;\n\n // Place around top-left finder\n const bits: number[] = [];\n for (let i = 14; i >= 0; i--) bits.push((format >> i) & 1);\n\n // Horizontal: left side of top-left finder + right side\n const hPos = [0, 1, 2, 3, 4, 5, 7, 8, size - 8, size - 7, size - 6, size - 5, size - 4, size - 3, size - 2];\n for (let i = 0; i < 15; i++) m[8][hPos[i]] = bits[i];\n\n // Vertical: bottom side of top-left finder + top side of bottom-left\n const vPos = [size - 1, size - 2, size - 3, size - 4, size - 5, size - 6, size - 7, size - 8, 7, 5, 4, 3, 2, 1, 0];\n for (let i = 0; i < 15; i++) m[vPos[i]][8] = bits[i];\n}\n\nfunction placeVersionInfo(m: number[][], ver: number) {\n if (ver < 7) return;\n const size = m.length;\n let info = bchEncode(ver, 0x1f25, 6);\n for (let i = 0; i < 18; i++) {\n const bit = (info >> i) & 1;\n const r = Math.floor(i / 3);\n const c = size - 11 + (i % 3);\n m[r][c] = bit;\n m[c][r] = bit;\n }\n}\n\n// ── Public API ──\n\nexport function generateQrSvg(text: string, moduleSize = 4): string {\n const bytes = Array.from(new TextEncoder().encode(text));\n const ver = pickVersion(bytes.length);\n const dataCW = encodeData(bytes, ver);\n const allCW = computeCodewords(ver, dataCW);\n const size = ver * 4 + 17;\n\n // Build template (tracks reserved areas)\n const template = createMatrix(size);\n placeFinderPattern(template, 0, 0);\n placeFinderPattern(template, 0, size - 7);\n placeFinderPattern(template, size - 7, 0);\n for (let i = 8; i < size - 8; i++) {\n template[6][i] = LIGHT;\n template[i][6] = LIGHT;\n }\n const ap = VER[ver].align;\n for (const r of ap) {\n for (const c of ap) {\n if (r <= 8 && c <= 8) continue;\n if (r <= 8 && c >= size - 8) continue;\n if (r >= size - 8 && c <= 8) continue;\n for (let dr = -2; dr <= 2; dr++) for (let dc = -2; dc <= 2; dc++) template[r + dr][c + dc] = LIGHT;\n }\n }\n template[4 * ver + 9][8] = LIGHT;\n for (let i = 0; i < 9; i++) {\n if (template[8][i] === UNSET) template[8][i] = LIGHT;\n if (template[i][8] === UNSET) template[i][8] = LIGHT;\n }\n for (let i = 0; i < 8; i++) {\n if (template[8][size - 1 - i] === UNSET) template[8][size - 1 - i] = LIGHT;\n if (template[size - 1 - i][8] === UNSET) template[size - 1 - i][8] = LIGHT;\n }\n if (ver >= 7) {\n for (let i = 0; i < 6; i++) for (let j = 0; j < 3; j++) {\n template[i][size - 11 + j] = LIGHT;\n template[size - 11 + j][i] = LIGHT;\n }\n }\n\n // Build matrix with data\n const base = buildMatrix(ver, allCW);\n\n // Try all 8 masks, pick lowest penalty\n let bestMask = 0;\n let bestScore = Infinity;\n for (let mask = 0; mask < 8; mask++) {\n const masked = applyMask(base, mask, template);\n placeFormatInfo(masked, mask);\n placeVersionInfo(masked, ver);\n const s = penalty(masked);\n if (s < bestScore) { bestScore = s; bestMask = mask; }\n }\n\n const final = applyMask(base, bestMask, template);\n placeFormatInfo(final, bestMask);\n placeVersionInfo(final, ver);\n\n // Render SVG\n const quiet = 4; // quiet zone modules\n const total = size + quiet * 2;\n const px = total * moduleSize;\n let svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${total} ${total}\" width=\"${px}\" height=\"${px}\" shape-rendering=\"crispEdges\">`;\n svg += `<rect width=\"${total}\" height=\"${total}\" fill=\"#fff\"/>`;\n for (let r = 0; r < size; r++) {\n for (let c = 0; c < size; c++) {\n if (final[r][c] === DARK) {\n svg += `<rect x=\"${c + quiet}\" y=\"${r + quiet}\" width=\"1\" height=\"1\" fill=\"#000\"/>`;\n }\n }\n }\n svg += '</svg>';\n return svg;\n}\n","import type {\n AuthonUser,\n AuthonOrganization,\n OrganizationMember,\n OrganizationInvitation,\n OrganizationListResponse,\n CreateOrganizationParams,\n UpdateOrganizationParams,\n InviteMemberParams,\n AuthTokens,\n BrandingConfig,\n MfaSetupResponse,\n MfaStatus,\n OAuthProviderType,\n PasskeyCredential,\n SessionInfo,\n Web3Chain,\n Web3NonceResponse,\n Web3Wallet,\n Web3WalletType,\n} from '@authon/shared';\nimport type {\n AuthonConfig,\n AuthonEventType,\n AuthonEvents,\n OAuthFlowMode,\n OAuthSignInOptions,\n} from './types';\nimport { AuthonMfaRequiredError } from './types';\nimport { ModalRenderer } from './modal';\nimport { SessionManager } from './session';\nimport { generateQrSvg } from './qrcode';\n\ninterface ProvidersResponse {\n providers: OAuthProviderType[];\n providerConfigs?: Partial<Record<OAuthProviderType, { oauthFlow?: OAuthFlowMode }>>;\n}\n\nexport class Authon {\n private publishableKey: string;\n private config: Required<Omit<AuthonConfig, 'containerId' | 'appearance'>> & {\n containerId?: string;\n appearance?: Partial<BrandingConfig>;\n };\n private session: SessionManager;\n private modal: ModalRenderer | null = null;\n private listeners: Map<string, Set<(...args: unknown[]) => void>> = new Map();\n private branding: BrandingConfig | null = null;\n private providers: OAuthProviderType[] = [];\n private providerFlowModes: Partial<Record<OAuthProviderType, OAuthFlowMode>> = {};\n private initialized = false;\n\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 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): Promise<AuthonUser> {\n const res = await this.apiPost<AuthTokens & { mfaRequired?: boolean; mfaToken?: string }>(\n '/v1/auth/signin',\n { email, password },\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 },\n ): Promise<AuthonUser> {\n const tokens = await this.apiPost<AuthTokens>('/v1/auth/signup', {\n email,\n password,\n ...meta,\n });\n this.session.setSession(tokens);\n this.emit('signedIn', tokens.user);\n return tokens.user;\n }\n\n async signOut(): Promise<void> {\n await this.session.signOut();\n this.emit('signedOut');\n }\n\n getUser(): AuthonUser | null {\n return this.session.getUser();\n }\n\n getToken(): string | null {\n return this.session.getToken();\n }\n\n on<K extends AuthonEventType>(event: K, listener: AuthonEvents[K]): () => void {\n if (!this.listeners.has(event)) this.listeners.set(event, new Set());\n const set = this.listeners.get(event)!;\n set.add(listener as (...args: unknown[]) => void);\n return () => set.delete(listener as (...args: unknown[]) => void);\n }\n\n // ── MFA ──\n\n async setupMfa(): Promise<MfaSetupResponse & { qrCodeSvg: string }> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to setup MFA');\n const res = await this.apiPostAuth<MfaSetupResponse>('/v1/auth/mfa/totp/setup', undefined, token);\n return { ...res, qrCodeSvg: generateQrSvg(res.qrCodeUri) };\n }\n\n async verifyMfaSetup(code: string): Promise<void> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to verify MFA setup');\n await this.apiPostAuth<{ success: boolean }>('/v1/auth/mfa/totp/verify-setup', { code }, token);\n }\n\n async verifyMfa(mfaToken: string, code: string): Promise<AuthonUser> {\n const res = await this.apiPost<AuthTokens>('/v1/auth/mfa/verify', { mfaToken, code });\n this.session.setSession(res);\n this.emit('signedIn', res.user);\n return res.user;\n }\n\n async disableMfa(code: string): Promise<void> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to disable MFA');\n await this.apiPostAuth<{ success: boolean }>('/v1/auth/mfa/disable', { code }, token);\n }\n\n async getMfaStatus(): Promise<MfaStatus> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to get MFA status');\n const res = await fetch(`${this.config.apiUrl}/v1/auth/mfa/status`, {\n headers: {\n 'x-api-key': this.publishableKey,\n Authorization: `Bearer ${token}`,\n },\n credentials: 'include',\n });\n if (!res.ok) throw new Error(await this.parseApiError(res, '/v1/auth/mfa/status'));\n return res.json();\n }\n\n async regenerateBackupCodes(code: string): Promise<string[]> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to regenerate backup codes');\n const res = await this.apiPostAuth<{ backupCodes: string[] }>(\n '/v1/auth/mfa/backup-codes/regenerate',\n { code },\n token,\n );\n return res.backupCodes;\n }\n\n // ── Passwordless ──\n\n async sendMagicLink(email: string): Promise<void> {\n await this.apiPost<{ message: string }>('/v1/auth/passwordless/magic-link', { email });\n }\n\n async sendEmailOtp(email: string): Promise<void> {\n await this.apiPost<{ message: string }>('/v1/auth/passwordless/email-otp', { email });\n }\n\n async verifyPasswordless(options: {\n token?: string;\n email?: string;\n code?: string;\n }): Promise<AuthonUser> {\n const res = await this.apiPost<AuthTokens>('/v1/auth/passwordless/verify', options);\n this.session.setSession(res);\n this.emit('signedIn', res.user);\n return res.user;\n }\n\n // ── Passkeys ──\n\n async registerPasskey(name?: string): Promise<PasskeyCredential> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to register a passkey');\n\n const options = await this.apiPostAuth<{ options: Record<string, unknown> }>(\n '/v1/auth/passkeys/register/options',\n name ? { name } : undefined,\n token,\n );\n\n const credential = await navigator.credentials.create({\n publicKey: this.deserializeCreationOptions(options.options),\n }) as PublicKeyCredential;\n\n const attestation = credential.response as AuthenticatorAttestationResponse;\n const result = await this.apiPostAuth<PasskeyCredential>(\n '/v1/auth/passkeys/register/verify',\n {\n id: credential.id,\n rawId: this.bufferToBase64url(credential.rawId),\n type: credential.type,\n response: {\n attestationObject: this.bufferToBase64url(attestation.attestationObject),\n clientDataJSON: this.bufferToBase64url(attestation.clientDataJSON),\n },\n },\n token,\n );\n\n this.emit('passkeyRegistered', result);\n return result;\n }\n\n async authenticateWithPasskey(email?: string): Promise<AuthonUser> {\n const options = await this.apiPost<{ options: Record<string, unknown> }>(\n '/v1/auth/passkeys/authenticate/options',\n email ? { email } : undefined,\n );\n\n const credential = await navigator.credentials.get({\n publicKey: this.deserializeRequestOptions(options.options),\n }) as PublicKeyCredential;\n\n const assertion = credential.response as AuthenticatorAssertionResponse;\n const res = await this.apiPost<AuthTokens>('/v1/auth/passkeys/authenticate/verify', {\n id: credential.id,\n rawId: this.bufferToBase64url(credential.rawId),\n type: credential.type,\n response: {\n authenticatorData: this.bufferToBase64url(assertion.authenticatorData),\n clientDataJSON: this.bufferToBase64url(assertion.clientDataJSON),\n signature: this.bufferToBase64url(assertion.signature),\n userHandle: assertion.userHandle ? this.bufferToBase64url(assertion.userHandle) : undefined,\n },\n });\n\n this.session.setSession(res);\n this.emit('signedIn', res.user);\n return res.user;\n }\n\n async listPasskeys(): Promise<PasskeyCredential[]> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to list passkeys');\n return this.apiGetAuth<PasskeyCredential[]>('/v1/auth/passkeys', token);\n }\n\n async renamePasskey(passkeyId: string, name: string): Promise<PasskeyCredential> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to rename a passkey');\n return this.apiPatchAuth<PasskeyCredential>(`/v1/auth/passkeys/${passkeyId}`, { name }, token);\n }\n\n async revokePasskey(passkeyId: string): Promise<void> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to revoke a passkey');\n await this.apiDeleteAuth(`/v1/auth/passkeys/${passkeyId}`, token);\n }\n\n // ── Web3 ──\n\n async web3GetNonce(\n address: string,\n chain: Web3Chain,\n walletType: Web3WalletType,\n chainId?: number,\n ): Promise<Web3NonceResponse> {\n return this.apiPost<Web3NonceResponse>('/v1/auth/web3/nonce', {\n address,\n chain,\n walletType,\n ...(chainId != null ? { chainId } : {}),\n });\n }\n\n async web3Verify(\n message: string,\n signature: string,\n address: string,\n chain: Web3Chain,\n walletType: Web3WalletType,\n ): Promise<AuthonUser> {\n const res = await this.apiPost<AuthTokens>('/v1/auth/web3/verify', {\n message,\n signature,\n address,\n chain,\n walletType,\n });\n this.session.setSession(res);\n this.emit('signedIn', res.user);\n return res.user;\n }\n\n async listWallets(): Promise<Web3Wallet[]> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to list wallets');\n return this.apiGetAuth<Web3Wallet[]>('/v1/auth/web3/wallets', token);\n }\n\n async linkWallet(params: {\n address: string;\n chain: Web3Chain;\n walletType: Web3WalletType;\n chainId?: number;\n message: string;\n signature: string;\n }): Promise<Web3Wallet> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to link a wallet');\n const wallet = await this.apiPostAuth<Web3Wallet>('/v1/auth/web3/wallets/link', params, token);\n this.emit('web3Connected', wallet);\n return wallet;\n }\n\n async unlinkWallet(walletId: string): Promise<void> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to unlink a wallet');\n await this.apiDeleteAuth(`/v1/auth/web3/wallets/${walletId}`, token);\n }\n\n // ── User Profile ──\n\n async updateProfile(data: {\n displayName?: string;\n avatarUrl?: string;\n phone?: string;\n publicMetadata?: Record<string, unknown>;\n }): Promise<AuthonUser> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to update profile');\n const user = await this.apiPatchAuth<AuthonUser>('/v1/auth/me', data, token);\n this.session.updateUser(user);\n return user;\n }\n\n // ── Session Management ──\n\n async listSessions(): Promise<SessionInfo[]> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to list sessions');\n return this.apiGetAuth<SessionInfo[]>('/v1/auth/me/sessions', token);\n }\n\n async revokeSession(sessionId: string): Promise<void> {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to revoke a session');\n await this.apiDeleteAuth(`/v1/auth/me/sessions/${sessionId}`, token);\n }\n\n // ── Organizations ──\n\n organizations = {\n list: async (): Promise<OrganizationListResponse> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to list organizations');\n return this.apiGetAuth<OrganizationListResponse>('/v1/auth/organizations', token);\n },\n\n create: async (params: CreateOrganizationParams): Promise<AuthonOrganization> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to create an organization');\n return this.apiPostAuth<AuthonOrganization>('/v1/auth/organizations', params, token);\n },\n\n get: async (orgId: string): Promise<AuthonOrganization> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to get organization');\n return this.apiGetAuth<AuthonOrganization>(`/v1/auth/organizations/${orgId}`, token);\n },\n\n update: async (orgId: string, params: UpdateOrganizationParams): Promise<AuthonOrganization> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to update organization');\n return this.apiPatchAuth<AuthonOrganization>(`/v1/auth/organizations/${orgId}`, params, token);\n },\n\n delete: async (orgId: string): Promise<void> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to delete organization');\n await this.apiDeleteAuth(`/v1/auth/organizations/${orgId}`, token);\n },\n\n getMembers: async (orgId: string): Promise<OrganizationMember[]> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to get organization members');\n return this.apiGetAuth<OrganizationMember[]>(`/v1/auth/organizations/${orgId}/members`, token);\n },\n\n invite: async (orgId: string, params: InviteMemberParams): Promise<OrganizationInvitation> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to invite a member');\n return this.apiPostAuth<OrganizationInvitation>(`/v1/auth/organizations/${orgId}/invitations`, params, token);\n },\n\n getInvitations: async (orgId: string): Promise<OrganizationInvitation[]> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to get invitations');\n return this.apiGetAuth<OrganizationInvitation[]>(`/v1/auth/organizations/${orgId}/invitations`, token);\n },\n\n acceptInvitation: async (token: string): Promise<OrganizationMember> => {\n const authToken = this.session.getToken();\n if (!authToken) throw new Error('Must be signed in to accept an invitation');\n return this.apiPostAuth<OrganizationMember>(`/v1/auth/organizations/invitations/${token}/accept`, undefined, authToken);\n },\n\n rejectInvitation: async (token: string): Promise<void> => {\n const authToken = this.session.getToken();\n if (!authToken) throw new Error('Must be signed in to reject an invitation');\n await this.apiPostAuth<void>(`/v1/auth/organizations/invitations/${token}/reject`, undefined, authToken);\n },\n\n removeMember: async (orgId: string, memberId: string): Promise<void> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to remove a member');\n await this.apiDeleteAuth(`/v1/auth/organizations/${orgId}/members/${memberId}`, token);\n },\n\n updateMemberRole: async (orgId: string, memberId: string, role: string): Promise<OrganizationMember> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to update member role');\n return this.apiPatchAuth<OrganizationMember>(`/v1/auth/organizations/${orgId}/members/${memberId}`, { role }, token);\n },\n\n leave: async (orgId: string): Promise<void> => {\n const token = this.session.getToken();\n if (!token) throw new Error('Must be signed in to leave organization');\n await this.apiPostAuth<void>(`/v1/auth/organizations/${orgId}/leave`, undefined, token);\n },\n };\n\n destroy(): void {\n this.modal?.close();\n this.session.destroy();\n this.listeners.clear();\n }\n\n // ── Internal ──\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.providers = providersRes.providers;\n this.providerFlowModes = {};\n for (const provider of this.providers) {\n this.providerFlowModes[provider] = this.normalizeFlowMode(\n providersRes.providerConfigs?.[provider]?.oauthFlow,\n );\n }\n this.initialized = true;\n } catch (err) {\n this.emit('error', err instanceof Error ? err : new Error(String(err)));\n throw err;\n }\n }\n\n private getModal(): ModalRenderer {\n if (!this.modal) {\n this.modal = new ModalRenderer({\n mode: this.config.mode,\n theme: this.config.theme,\n containerId: this.config.containerId,\n branding: this.branding || undefined,\n onProviderClick: (provider) => this.startOAuthFlow(provider),\n onEmailSubmit: (email, password, isSignUp) => {\n this.modal?.clearError();\n const promise = isSignUp\n ? this.signUpWithEmail(email, password)\n : this.signInWithEmail(email, password);\n promise\n .then(() => this.modal?.close())\n .catch((err) => {\n const msg = err instanceof Error ? err.message : String(err);\n this.modal?.showError(msg || 'Authentication failed');\n this.emit('error', err instanceof Error ? err : new Error(msg));\n });\n },\n onClose: () => this.modal?.close(),\n });\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 // ── 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":[]}
|