@singlebase/elements 0.7.0 → 0.9.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/dist/authui-display-C2o9gApg.cjs +961 -0
- package/dist/authui-display-C2o9gApg.cjs.map +1 -0
- package/dist/{authui-display-BM_F3-5e.js → authui-display-CRUABt43.js} +1009 -862
- package/dist/authui-display-CRUABt43.js.map +1 -0
- package/dist/authui.cjs +1 -1
- package/dist/authui.js +2 -2
- package/dist/{chat-ezUmd9II.cjs → chat-Bj6DrOaW.cjs} +237 -168
- package/dist/chat-Bj6DrOaW.cjs.map +1 -0
- package/dist/{chat-BH_3e1jT.js → chat-DNiqYF6F.js} +1098 -825
- package/dist/chat-DNiqYF6F.js.map +1 -0
- package/dist/chat-messages.d.ts +5 -0
- package/dist/chat.cjs +1 -1
- package/dist/chat.js +1 -1
- package/dist/elements/authui-account.d.ts +0 -1
- package/dist/elements/authui-buttons.d.ts +1 -1
- package/dist/elements/authui.d.ts +25 -1
- package/dist/elements/chat.d.ts +76 -4
- package/dist/index.cjs +1 -1
- package/dist/index.js +3 -3
- package/dist/messages.d.ts +34 -3
- package/dist/singlebase-elements.min.js +3113 -2664
- package/dist/singlebase-elements.min.js.map +1 -1
- package/dist/{uploader-COP8PkJ6.cjs → uploader-C57vgFME.cjs} +27 -1
- package/dist/uploader-C57vgFME.cjs.map +1 -0
- package/dist/{uploader-tdMU9Gxv.js → uploader-Cz9yfzfV.js} +27 -1
- package/dist/uploader-Cz9yfzfV.js.map +1 -0
- package/dist/uploader.cjs +1 -1
- package/dist/uploader.js +1 -1
- package/dist/utils/auth-errors.d.ts +7 -0
- package/dist/utils/oauth.d.ts +24 -0
- package/dist/utils/password.d.ts +16 -0
- package/package.json +3 -3
- package/dist/authui-display-BM_F3-5e.js.map +0 -1
- package/dist/authui-display-CMVHTNFz.cjs +0 -956
- package/dist/authui-display-CMVHTNFz.cjs.map +0 -1
- package/dist/chat-BH_3e1jT.js.map +0 -1
- package/dist/chat-ezUmd9II.cjs.map +0 -1
- package/dist/uploader-COP8PkJ6.cjs.map +0 -1
- package/dist/uploader-tdMU9Gxv.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"authui-display-BM_F3-5e.js","sources":["../src/controllers/auth-controller.ts","../src/messages.ts","../src/elements/authui-base.ts","../src/controllers/settings-controller.ts","../src/controllers/event-bridge.ts","../src/elements/authui-form-base.ts","../src/utils/profile.ts","../src/elements/authui-account.ts","../src/elements/authui-buttons.ts","../src/elements/authui.ts","../src/elements/authui-guard.ts","../src/elements/authui-display.ts"],"sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport type { AuthClient, AuthState } from \"@singlebase/singlebase-sdk\";\n\n/**\n * Subscribes a host element to an AuthClient's session state and triggers a\n * re-render on every change, so individual elements never hand-roll\n * subscribe/unsubscribe bookkeeping. Call bind(client) whenever the host's\n * resolved client changes (e.g. context updates, or .client is set).\n */\nexport class AuthController implements ReactiveController {\n private host: ReactiveControllerHost;\n private client: AuthClient | null = null;\n private unsubscribe: (() => void) | null = null;\n state: AuthState = { status: \"loading\", session: null, user: null };\n\n constructor(host: ReactiveControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n bind(client: AuthClient | null): void {\n if (client === this.client) return;\n this.unsubscribe?.();\n this.unsubscribe = null;\n this.client = client;\n if (!client) return;\n this.state = client.getState();\n this.unsubscribe = client.subscribe((state) => {\n this.state = state;\n this.host.requestUpdate();\n });\n this.host.requestUpdate();\n }\n\n hostDisconnected(): void {\n this.unsubscribe?.();\n this.unsubscribe = null;\n }\n}\n","/**\n * Default UI copy, taken verbatim from the design mock's renderVals()\n * (titles/subs/ctas maps and inline strings in project/AuthWidget.dc.html).\n * Every element accepts a .messages property with a partial override of\n * this shape — spec: \"configurable labels and messages without changing flow\n * logic\". This is deliberately a flat string bag rather than a locale-file\n * system; hosts needing full i18n supply one populated object per language.\n */\nexport interface SinglebaseAuthMessages {\n // titles\n signInTitle: string;\n signUpTitle: string;\n forgotTitle: string;\n verifyTitle: string;\n otpTitle: string;\n newPassTitle: string;\n inviteTitle: string;\n\n // subtitles\n signInSubEmailAndOauth: string;\n signInSubEmailOnly: string;\n signInSubOauthOnly: string;\n signUpSub: string;\n forgotSub: string;\n otpSub: string;\n inviteSub: string;\n\n // ctas\n signInCta: string;\n signUpCta: string;\n forgotCta: string;\n verifyCta: string;\n otpCta: string;\n newPassCta: string;\n inviteCta: string;\n continueCta: string;\n backCta: string;\n\n // accordion\n emailMethodTitle: string;\n emailMethodTitleSignUp: string;\n emailMethodMeta: string;\n emailMethodMetaSignUp: string;\n emailMethodMetaOtp: string;\n oauthMethodTitle: string;\n oauthMethodMeta: string;\n\n // fields\n fullNameLabel: string;\n fullNamePlaceholder: string;\n emailLabel: string;\n emailPlaceholder: string;\n passwordLabel: string;\n passwordPlaceholder: string;\n newPasswordLabel: string;\n newPasswordPlaceholder: string;\n confirmPasswordLabel: string;\n confirmPasswordPlaceholder: string;\n currentPasswordLabel: string;\n firstNameLabel: string;\n firstNamePlaceholder: string;\n lastNameLabel: string;\n lastNamePlaceholder: string;\n phoneLabel: string;\n phonePlaceholder: string;\n invitedEmailLabel: string;\n\n // links / affordances\n forgotLink: string;\n otpInsteadLink: string;\n footTextSignIn: string;\n footActionSignIn: string;\n footTextSignUp: string;\n footActionSignUp: string;\n resendQuestion: string;\n resendCta: string;\n oauthPrimaryLabel: string;\n oauthContinueWith: string;\n\n // blocked\n blockedTitleDisabled: string;\n blockedTitleUnavailable: string;\n blockedBodyDisabled: string;\n blockedBodyUnavailable: string;\n blockedHint: string;\n\n // account\n signOutCta: string;\n addPhotoLink: string;\n changePhotoLink: string;\n photoUploading: string;\n photoUpdated: string;\n editingLabel: string;\n uploadPhotoCta: string;\n replacePhotoCta: string;\n photoHint: string;\n doneCta: string;\n cancelCta: string;\n editAccountCta: string;\n saveChangesCta: string;\n emailChangeHint: string;\n passwordSectionTitle: string;\n passwordChangedHint: string;\n changePasswordCta: string;\n updatePasswordCta: string;\n twoFaTitle: string;\n twoFaHintOff: string;\n twoFaHintOn: string;\n twoFaScanHint: string;\n connectedTitle: string;\n connectedHint: string;\n addAnotherLabel: string;\n disconnectCta: string;\n notConnectedLabel: string;\n deleteAccountCta: string;\n deleteAccountConfirmCta: string;\n deletePanelBody: string;\n deleteConfirmLabel: string;\n deleteConfirmPlaceholder: string;\n savedNote: string;\n passwordUpdatedNote: string;\n\n // standalone change-email / change-username forms\n changeEmailTitle: string;\n newEmailLabel: string;\n changeEmailCta: string;\n changeUsernameTitle: string;\n newUsernameLabel: string;\n changeUsernameCta: string;\n\n // generic async / errors\n genericErrorMessage: string;\n rateLimitedMessage: string;\n codeSentNeutral: string;\n invalidEmailError: string;\n requiredError: string;\n passwordMinError: string;\n passwordMatchError: string;\n codeIncompleteError: string;\n invalidPhoneError: string;\n notYetSupported: string;\n\n // already-signed-in interstitial\n alreadySignedInTitle: string;\n alreadySignedInSub: string;\n alreadySignedInSubPrefix: string;\n continueHint: string;\n\n // consent line\n consentPrefix: string;\n consentJoin: string;\n termsLabel: string;\n privacyLabel: string;\n\n emailUnchangedError: string;\n emailUpdatedNote: string;\n changeEmailCtaShort: string;\n changeEmailHint: string;\n changeEmailConfirmHint: string;\n changeEmailElsewhereHint: string;\n confirmChangeCta: string;\n codeLabel: string;\n\n // provider linking\n linkRequiresSignIn: string;\n\n // oauth callback screen\n oauthCallbackTitle: string;\n oauthCallbackSub: string;\n oauthDenied: string;\n}\n\nexport const defaultMessages: SinglebaseAuthMessages = {\n signInTitle: \"Sign in\",\n signUpTitle: \"Create your account\",\n forgotTitle: \"Reset your password\",\n verifyTitle: \"Enter your code\",\n otpTitle: \"Sign in with a code\",\n newPassTitle: \"Choose a new password\",\n inviteTitle: \"You have been invited\",\n\n signInSubEmailAndOauth: \"Use your email or a connected provider.\",\n signInSubEmailOnly: \"Use your email address and password.\",\n signInSubOauthOnly: \"Continue with a connected provider.\",\n signUpSub: \"Free to start. No card required.\",\n forgotSub: \"We will email you a six-digit code to confirm it is you.\",\n otpSub: \"No password needed — we will email you a six-digit code.\",\n inviteSub: \"Set up your account to continue.\",\n\n signInCta: \"Sign in\",\n signUpCta: \"Create account\",\n forgotCta: \"Send code\",\n verifyCta: \"Verify code\",\n otpCta: \"Email me a code\",\n newPassCta: \"Save password\",\n inviteCta: \"Create account\",\n continueCta: \"Continue\",\n backCta: \"Back\",\n\n emailMethodTitle: \"Email\",\n emailMethodTitleSignUp: \"Email and password\",\n emailMethodMeta: \"Password or one-time code\",\n emailMethodMetaSignUp: \"Create with an address\",\n emailMethodMetaOtp: \"One-time code\",\n oauthMethodTitle: \"Single sign-on\",\n oauthMethodMeta: \"Google, GitHub, and more\",\n\n fullNameLabel: \"Full name\",\n fullNamePlaceholder: \"Ada Lovelace\",\n emailLabel: \"Email\",\n emailPlaceholder: \"you@company.com\",\n passwordLabel: \"Password\",\n passwordPlaceholder: \"••••••••\",\n newPasswordLabel: \"New password\",\n newPasswordPlaceholder: \"At least 10 characters\",\n confirmPasswordLabel: \"Confirm password\",\n confirmPasswordPlaceholder: \"Repeat it\",\n currentPasswordLabel: \"Current password\",\n firstNameLabel: \"First name\",\n firstNamePlaceholder: \"Ada\",\n lastNameLabel: \"Last name\",\n lastNamePlaceholder: \"Lovelace\",\n phoneLabel: \"Phone number\",\n phonePlaceholder: \"+1 (555) 000-0000\",\n invitedEmailLabel: \"Invited email\",\n\n forgotLink: \"Forgot?\",\n otpInsteadLink: \"Email me a one-time code instead\",\n footTextSignIn: \"New here?\",\n footActionSignIn: \"Create an account\",\n footTextSignUp: \"Already have an account?\",\n footActionSignUp: \"Sign in\",\n resendQuestion: \"Did not get it?\",\n resendCta: \"Resend code\",\n oauthPrimaryLabel: \"Continue with Google\",\n oauthContinueWith: \"Continue with\",\n\n blockedTitleDisabled: \"Sign-in is turned off\",\n blockedTitleUnavailable: \"Sign-in unavailable\",\n blockedBodyDisabled: \"Authentication is currently disabled for this application.\",\n blockedBodyUnavailable: \"No sign-in methods are enabled for this application.\",\n blockedHint: \"Contact the site owner if you think this is a mistake.\",\n\n signOutCta: \"Sign out\",\n addPhotoLink: \"Add photo\",\n changePhotoLink: \"Change\",\n photoUploading: \"Uploading…\",\n photoUpdated: \"Photo updated\",\n editingLabel: \"Editing\",\n uploadPhotoCta: \"Upload photo\",\n replacePhotoCta: \"Replace photo\",\n photoHint: \"PNG or JPG, up to 2 MB.\",\n doneCta: \"Done\",\n cancelCta: \"Cancel\",\n editAccountCta: \"Edit account\",\n saveChangesCta: \"Save changes\",\n emailChangeHint: \"We will send a verification link to the new address.\",\n passwordSectionTitle: \"Password\",\n passwordChangedHint: \"Last changed three months ago.\",\n changePasswordCta: \"Change password\",\n updatePasswordCta: \"Update password\",\n twoFaTitle: \"Two-factor authentication\",\n twoFaHintOff: \"Add a second step when signing in.\",\n twoFaHintOn: \"Enabled with an authenticator app.\",\n twoFaScanHint: \"Scan with your authenticator app, then enter the 6-digit code.\",\n connectedTitle: \"Connected accounts\",\n connectedHint: \"Sign in with any provider you connect here.\",\n addAnotherLabel: \"Add another\",\n disconnectCta: \"Disconnect\",\n notConnectedLabel: \"Not connected\",\n deleteAccountCta: \"Delete account\",\n deleteAccountConfirmCta: \"Permanently delete account\",\n deletePanelBody:\n \"This removes your profile, sessions and connected providers. It cannot be undone.\",\n deleteConfirmLabel: \"Type DELETE to confirm\",\n deleteConfirmPlaceholder: \"DELETE\",\n savedNote: \"Saved\",\n passwordUpdatedNote: \"Password updated\",\n\n changeEmailTitle: \"Email\",\n newEmailLabel: \"New email\",\n changeEmailCta: \"Send verification code\",\n changeUsernameTitle: \"Username\",\n newUsernameLabel: \"New username\",\n changeUsernameCta: \"Send verification code\",\n\n genericErrorMessage: \"Something went wrong. Please try again.\",\n rateLimitedMessage: \"Too many attempts. Try again in 5 minutes or reset your password.\",\n codeSentNeutral: \"If an eligible account exists, a code has been sent.\",\n invalidEmailError: \"Enter a valid email address.\",\n requiredError: \"This cannot be empty.\",\n passwordMinError: \"Use at least 10 characters.\",\n passwordMatchError: \"Both passwords must match.\",\n codeIncompleteError: \"Enter all six digits.\",\n invalidPhoneError: \"Enter a valid phone number.\",\n notYetSupported: \"Not yet supported\",\n\n alreadySignedInTitle: \"You are already signed in\",\n alreadySignedInSub: \"Continue where you left off, or sign out to use another account.\",\n alreadySignedInSubPrefix: \"Signed in as\",\n continueHint: \"Continuing takes you to your account.\",\n\n consentPrefix: \"By continuing you agree to our\",\n consentJoin: \"and\",\n termsLabel: \"Terms\",\n privacyLabel: \"Privacy Policy\",\n\n emailUnchangedError: \"That is already your email address.\",\n emailUpdatedNote: \"Email updated\",\n changeEmailCtaShort: \"Change email\",\n changeEmailHint: \"We will send a code to your current address to confirm it is you.\",\n changeEmailConfirmHint: \"Enter the code we sent, and your email becomes\",\n changeEmailElsewhereHint: \"Your email is changed below, with a verification step.\",\n confirmChangeCta: \"Confirm change\",\n codeLabel: \"Verification code\",\n linkRequiresSignIn: \"Sign in first, then link a provider.\",\n\n oauthCallbackTitle: \"Finishing sign-in\",\n oauthCallbackSub: \"One moment while we complete your sign-in.\",\n oauthDenied: \"Sign-in was cancelled or denied.\"\n};\n\nexport function resolveMessages(\n overrides?: Partial<SinglebaseAuthMessages>\n): SinglebaseAuthMessages {\n return overrides ? { ...defaultMessages, ...overrides } : defaultMessages;\n}\n","import { LitElement, type PropertyValues } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport {\n AUTHUI_PROP_KEYS,\n authUIAttributeFor,\n getDefaultClient,\n type AuthUIConfig\n} from \"@singlebase/core\";\nimport type { AuthClient, UserProfile } from \"@singlebase/singlebase-sdk\";\nimport { AuthController } from \"../controllers/auth-controller.js\";\nimport { tokenDefaults } from \"../styles/tokens.js\";\nimport { sharedStyles } from \"../styles/shared.js\";\nimport { defaultMessages, resolveMessages, type SinglebaseAuthMessages } from \"../messages.js\";\n\n/**\n * Base class for every singlebase-* element: resolves an AuthClient, exposes\n * .messages overrides, and gives subclasses a live AuthController bound to\n * whichever client won.\n */\nexport abstract class SinglebaseElementBase extends LitElement {\n static styles = [tokenDefaults, sharedStyles];\n\n @property({ attribute: false })\n accessor client: AuthClient | null = null;\n\n @property({ attribute: false })\n accessor messages: Partial<SinglebaseAuthMessages> = {};\n\n /**\n * theme/density/field-style are plain reflected attributes so a composing\n * parent can forward them verbatim to the singlebase-* children it renders.\n * CSS custom properties inherit through shadow boundaries on their own,\n * but an *attribute* selector like :host([theme=\"dark\"]) only matches\n * the element that actually carries the attribute, so it must be\n * explicitly propagated down the composition tree.\n */\n @property({ reflect: true })\n accessor theme: \"light\" | \"dark\" | undefined = undefined;\n\n @property({ reflect: true })\n accessor density: \"comfortable\" | \"compact\" | undefined = undefined;\n\n /**\n * Input chrome: boxed (default) or a single bottom rule. Reflected for the\n * same reason as theme/density — the CSS is an attribute selector.\n */\n @property({ reflect: true, attribute: \"field-style\" })\n accessor fieldStyle: \"outline\" | \"underline\" | undefined = undefined;\n\n /** Corner preset for this element: `sharp`, `default` or `round`. */\n @property({ reflect: true })\n accessor radius: \"sharp\" | \"default\" | \"round\" | undefined = undefined;\n\n protected auth = new AuthController(this);\n\n /**\n * Resolution order: an explicit `.client`, then the page's default\n * SinglebaseClient()'s auth.\n *\n * That fallback is what lets several widgets sit on one page — a header\n * sign-in, a modal, an account panel — and share one session with no\n * wiring, since SinglebaseClient() is cached per project. A page talking to\n * two projects sets `.client` on the widgets belonging to the second.\n *\n * Reading `.auth` is also what *constructs* auth: a page that only drops\n * in a widget initializes it with no bootstrap code at all.\n */\n get resolvedClient(): AuthClient | null {\n if (this.client) return this.client;\n return getDefaultClient<{ auth: AuthClient }>()?.auth ?? null;\n }\n\n /** Page-wide UI config from SinglebaseClient({ authui }), if there is one. */\n get uiConfig(): AuthUIConfig | null {\n return this.resolvedClient?.authui ?? null;\n }\n\n /**\n * Config messages sit *under* the element's own, so a page-wide translation\n * can be overridden per widget without repeating the whole bag.\n */\n get msg(): SinglebaseAuthMessages {\n const shared = this.uiConfig?.messages;\n return resolveMessages(shared ? { ...shared, ...this.messages } : this.messages);\n }\n\n /** Config keys already applied, so a later render does not fight the host. */\n private appliedConfig = new Set<string>();\n\n /**\n * Copies the page-wide config onto this element.\n *\n * An attribute present in markup always wins — that is the whole precedence\n * rule, and it is checked per key rather than wholesale, so a widget can\n * override one thing and inherit the rest. Keys the element does not have\n * are skipped, which is how one config can serve every singlebase-authui-*\n * element without any of them knowing about the others.\n */\n protected applyUIConfig(): void {\n const config = this.uiConfig;\n if (!config) return;\n\n for (const key of AUTHUI_PROP_KEYS) {\n const value = config[key];\n if (value === undefined) continue;\n if (!(key in this)) continue;\n if (this.hasAttribute(authUIAttributeFor(key))) continue;\n if (this.appliedConfig.has(key)) continue;\n\n this.appliedConfig.add(key);\n (this as unknown as Record<string, unknown>)[key] = value;\n }\n\n for (const [name, value] of Object.entries(config.tokens ?? {})) {\n if (!name.startsWith(\"--\")) continue;\n // Anything already set inline came from the host and stays.\n if (this.style.getPropertyValue(name)) continue;\n this.style.setProperty(name, value);\n }\n }\n\n // ── public API mirrored from the client, for host/SPA code ──\n isAuthenticated(): boolean {\n return this.resolvedClient?.isAuthenticated() ?? false;\n }\n\n getUser(): UserProfile | null {\n return this.resolvedClient?.getUser() ?? null;\n }\n\n async refreshSession() {\n return this.resolvedClient?.refreshSession();\n }\n\n async logout(): Promise<void> {\n await this.resolvedClient?.logout();\n }\n\n override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n this.auth.bind(this.resolvedClient);\n this.applyUIConfig();\n }\n}\n\nexport { defaultMessages };\n","import type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport type { AuthClient, AuthSettings } from \"@singlebase/singlebase-sdk\";\n\n/**\n * Loads auth.settings once per bound client and caches it, so composing\n * many form elements inside <singlebase-authui> doesn't mean many redundant\n * auth.settings calls. Each element may also be given .settings directly\n * (e.g. by a parent that already loaded them) to skip the fetch entirely.\n */\nexport class SettingsController implements ReactiveController {\n private host: ReactiveControllerHost;\n private client: AuthClient | null = null;\n private cache = new WeakMap<AuthClient, Promise<AuthSettings>>();\n settings: AuthSettings | null = null;\n error: unknown = null;\n\n constructor(host: ReactiveControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n hostConnected(): void {}\n\n load(client: AuthClient | null, override?: AuthSettings | null): void {\n if (override) {\n this.settings = override;\n return;\n }\n if (!client || client === this.client) return;\n this.client = client;\n let pending = this.cache.get(client);\n if (!pending) {\n pending = client.getSettings();\n this.cache.set(client, pending);\n }\n pending\n .then((settings) => {\n this.settings = settings;\n this.error = null;\n this.host.requestUpdate();\n })\n .catch((error) => {\n this.error = error;\n this.host.requestUpdate();\n });\n }\n}\n","import type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport type { AuthClient, AuthEventName } from \"@singlebase/singlebase-sdk\";\n\nexport const BRIDGED_EVENTS = [\n \"load\",\n \"success\",\n \"error\",\n \"signin\",\n \"signup\",\n \"signout\",\n \"session\",\n \"account-updated\",\n \"password-change\",\n \"email-change\",\n \"username-change\",\n \"expired\",\n \"navigate\",\n \"goto\"\n] as const satisfies readonly AuthEventName[];\n\n/**\n * The auth API's event names mapped onto the\n * friendlier ones. Both are dispatched so either style works.\n */\nconst SPEC_ALIASES: Partial<Record<AuthEventName, string>> = {\n load: \"auth:ready\",\n signin: \"auth:signin\",\n signup: \"auth:signup\",\n session: \"auth:session\",\n \"account-updated\": \"auth:profile-update\",\n signout: \"auth:signout\",\n error: \"auth:error\",\n navigate: \"auth:navigate\"\n};\n\n/** \"account-updated\" -> \"onAccountUpdated\" */\nexport function callbackPropFor(event: string): string {\n return \"on\" + event.replace(/(^|-)([a-z])/g, (_, __, c: string) => c.toUpperCase());\n}\n\n/**\n * Re-publishes core auth events on the host element in the two ways host\n * apps actually consume them:\n *\n * - a DOM CustomEvent (`singlebase-signin`, and the spec's `auth:signin`),\n * bubbling and composed so `document.addEventListener` works;\n * - a callback property (`el.onSignin = fn`), since HTML attributes cannot\n * carry functions.\n *\n * Event details never include tokens — consumers read the session through\n * the client, per the spec's events rule.\n */\nexport class EventBridge implements ReactiveController {\n private unsubscribes: Array<() => void> = [];\n private client: AuthClient | null = null;\n\n constructor(private host: ReactiveControllerHost & HTMLElement) {\n host.addController(this);\n }\n\n bind(client: AuthClient | null): void {\n if (client === this.client) return;\n this.release();\n this.client = client;\n if (!client) return;\n\n this.unsubscribes = BRIDGED_EVENTS.map((event) =>\n client.on(event, (detail: unknown) => this.publish(event, detail))\n );\n }\n\n private publish(event: string, detail: unknown) {\n const callback = (this.host as unknown as Record<string, unknown>)[callbackPropFor(event)];\n if (typeof callback === \"function\") {\n try {\n (callback as (d: unknown) => void).call(this.host, detail);\n } catch (error) {\n console.error(`[singlebase] ${callbackPropFor(event)} threw:`, error);\n }\n }\n\n const init: CustomEventInit = { detail, bubbles: true, composed: true };\n this.host.dispatchEvent(new CustomEvent(`singlebase-${event}`, init));\n const alias = SPEC_ALIASES[event as AuthEventName];\n if (alias) this.host.dispatchEvent(new CustomEvent(alias, init));\n }\n\n private release() {\n this.unsubscribes.forEach((off) => off());\n this.unsubscribes = [];\n }\n\n hostDisconnected(): void {\n this.release();\n this.client = null;\n }\n}\n","import { html } from \"lit\";\nimport { state } from \"lit/decorators.js\";\nimport { SinglebaseAuthError, mapErrorToHint } from \"@singlebase/singlebase-sdk\";\nimport { SinglebaseElementBase } from \"./authui-base.js\";\n\nexport type FormPhase = \"idle\" | \"submitting\" | \"success\" | \"error\";\n\n/**\n * Adds the spec's required cross-cutting form behavior to SinglebaseElementBase:\n * idle/submitting/success/error phase, a form-level error message, disabled\n * controls while submitting, an aria-live status region, and cancellation of\n * in-flight work on disconnect.\n */\nexport abstract class SinglebaseFormBase extends SinglebaseElementBase {\n @state()\n protected accessor phase: FormPhase = \"idle\";\n\n @state()\n protected accessor formError = \"\";\n\n @state()\n protected accessor noticeMessage = \"\";\n\n protected abortController: AbortController | null = null;\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.abortController?.abort();\n }\n\n protected get signal(): AbortSignal {\n this.abortController?.abort();\n this.abortController = new AbortController();\n return this.abortController.signal;\n }\n\n /** Runs task, tracking idle→submitting→success/error and mapping errors to a message. */\n protected async run(task: () => Promise<void>): Promise<void> {\n this.phase = \"submitting\";\n this.formError = \"\";\n try {\n await task();\n this.phase = \"success\";\n } catch (error) {\n if (this.isAbortError(error)) return;\n this.phase = \"error\";\n this.formError = this.describeError(error);\n }\n }\n\n private isAbortError(error: unknown): boolean {\n return error instanceof DOMException && error.name === \"AbortError\";\n }\n\n protected describeError(error: unknown): string {\n if (error instanceof SinglebaseAuthError) {\n const hint = mapErrorToHint(error.code);\n if (hint === \"disable_retry_show_rate_limited\") return this.msg.rateLimitedMessage;\n if (hint === \"generic_credentials_message\") return this.msg.genericErrorMessage;\n return this.msg.genericErrorMessage;\n }\n return this.msg.genericErrorMessage;\n }\n\n protected get submitting(): boolean {\n return this.phase === \"submitting\";\n }\n\n /** aria-live region for async status — spec requires one per form. */\n protected renderStatus() {\n return html`\n <div\n role=\"status\"\n aria-live=\"polite\"\n style=\"position:absolute;width:1px;height:1px;overflow:hidden;\"\n >\n ${this.phase === \"submitting\" ? \"Submitting…\" : \"\"}\n ${this.phase === \"success\" ? \"Done.\" : \"\"}\n </div>\n ${this.formError ? html`<p class=\"banner\" role=\"alert\">${this.formError}</p>` : null}\n ${this.noticeMessage ? html`<p class=\"notice\" role=\"status\">${this.noticeMessage}</p>` : null}\n `;\n }\n}\n","import type { UserProfile } from \"@singlebase/singlebase-sdk\";\n\n/** \"Ada Lovelace\", or \"\" when the profile carries no name at all. */\nexport function fullNameOf(user: Pick<UserProfile, \"first_name\" | \"last_name\"> | null): string {\n return [user?.first_name, user?.last_name].filter(Boolean).join(\" \").trim();\n}\n\n/**\n * Two-letter avatar initials. Falls back to the email's first letter, then to\n * a neutral glyph, so the avatar is never blank for a profile that only has\n * an address.\n */\nexport function initialsOf(\n user: Pick<UserProfile, \"first_name\" | \"last_name\" | \"email\"> | null\n): string {\n const name = fullNameOf(user);\n if (name) {\n return name\n .split(/\\s+/)\n .map((word) => word[0])\n .join(\"\")\n .slice(0, 2)\n .toUpperCase();\n }\n const email = user?.email ?? \"\";\n return email ? email[0]!.toUpperCase() : \"·\";\n}\n","import { html, nothing, type PropertyValues } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { createFilesUploadApi, type AuthSettings } from \"@singlebase/singlebase-sdk\";\nimport { SinglebaseFormBase } from \"./authui-form-base.js\";\nimport { SettingsController } from \"../controllers/settings-controller.js\";\nimport { fullNameOf, initialsOf } from \"../utils/profile.js\";\nimport \"./uploader.js\";\nimport type { SinglebaseUploader } from \"./uploader.js\";\n\n/** Two-factor setup stays hidden until the backend supports enrolment. */\nconst SHOW_TWO_FACTOR = false;\n\n/** Account deletion stays hidden until the backend supports it. */\nconst SHOW_DELETE_ACCOUNT = false;\n\n/** Sent with the photo's upload request: the server makes it the account photo. */\nconst PHOTO_OPTIONS = { profile_photo: true };\nconst PHOTO_ACCEPT = \".jpg,.jpeg,.png,.webp,image/jpeg,image/png,image/webp\";\n\ntype EditMode = \"\" | \"avatar\" | \"profile\" | \"password\" | \"email\";\n\n/**\n * The authenticated account view, laid out exactly as the design mock's\n * isAuthed branch: identity header, profile summary with grouped edit\n * cards, password section, two-factor, connected accounts and danger zone.\n *\n * Two-factor setup and account deletion have no backing operation yet, so\n * they are hidden (SHOW_TWO_FACTOR, SHOW_DELETE_ACCOUNT). Listing and\n * unlinking providers isn't supported either, and says so; connecting\n * a *new* provider is supported, so those tiles are live.\n */\n@customElement(\"singlebase-authui-account\")\nexport class SinglebaseAccountScreen extends SinglebaseFormBase {\n @property({ attribute: \"logo-text\" }) accessor logoText = \"\";\n\n /** A logo image, used instead of `logo-text` when set. */\n @property({ attribute: \"logo-url\" }) accessor logoUrl = \"\";\n @property({ attribute: false }) accessor settings: AuthSettings | null = null;\n @property({ attribute: \"nonce-storage-key\" }) accessor nonceStorageKey = \"singlebase-oauth-nonce\";\n\n @state() private accessor editMode: EditMode = \"\";\n @state() private accessor toast = \"\";\n @state() private accessor photoBusy = false;\n /** A photo URL that failed to load, so the initials show instead of a broken image. */\n @state() private accessor photoFailed = \"\";\n @state() private accessor profileSaved = \"\";\n @state() private accessor passSaved = \"\";\n @state() private accessor profileError = \"\";\n @state() private accessor newPassError = \"\";\n @state() private accessor deleteStage = 0;\n @state() private accessor confirmText = \"\";\n\n // profile draft\n @state() private accessor dFirst = \"\";\n @state() private accessor dLast = \"\";\n @state() private accessor dPhone = \"\";\n @state() private accessor dEmail = \"\";\n\n // password draft\n // email change — a two-step verified flow, never a bare field save\n @state() private accessor emailStep: \"request\" | \"confirm\" = \"request\";\n @state() private accessor dNewEmail = \"\";\n @state() private accessor emailCode = \"\";\n @state() private accessor emailError = \"\";\n @state() private accessor emailSaved = \"\";\n\n @state() private accessor curPass = \"\";\n @state() private accessor newPass = \"\";\n @state() private accessor confirmPass = \"\";\n\n private settingsCtl = new SettingsController(this);\n private flashTimer?: ReturnType<typeof setTimeout>;\n private uidBase = `sb-acct-${Math.random().toString(36).slice(2, 8)}`;\n\n private uid(k: string) {\n return `${this.uidBase}-${k}`;\n }\n\n override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n this.settingsCtl.load(this.resolvedClient, this.settings);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n clearTimeout(this.flashTimer);\n }\n\n private flash(key: \"profileSaved\" | \"passSaved\" | \"emailSaved\", message: string) {\n this[key] = message;\n clearTimeout(this.flashTimer);\n this.flashTimer = setTimeout(() => {\n this[key] = \"\";\n }, 2600);\n }\n\n /** Matches the guest screens: image when given one, else the text label. */\n private renderLogo() {\n if (this.logoUrl) {\n return html`<img\n part=\"logo\"\n src=${this.logoUrl}\n alt=${this.logoText}\n style=\"display:block;align-self:flex-start;height:var(--sb-logo-height,20px);width:auto;max-width:100%\"\n />`;\n }\n return this.logoText ? html`<div class=\"logo-dot\" part=\"logo\">${this.logoText}</div>` : nothing;\n }\n\n private get user() {\n const state = this.auth.state;\n return state.status === \"authenticated\" ? state.user : null;\n }\n\n private get fullName() {\n return fullNameOf(this.user);\n }\n\n private get initials() {\n return initialsOf(this.user);\n }\n\n // ── profile photo ─────────────────────────────────────────\n private uploadClientFor: unknown = null;\n private uploadClientCache: { files: ReturnType<typeof createFilesUploadApi> } | null = null;\n\n /**\n * The upload API bound to the same dispatcher as this widget's auth client,\n * so the photo goes to the same project with the same bearer — including on\n * a page where this widget was given its own `.client`.\n */\n private get uploadClient() {\n const client = this.resolvedClient;\n if (!client) return null;\n if (this.uploadClientFor !== client) {\n this.uploadClientFor = client;\n this.uploadClientCache = { files: createFilesUploadApi(client.dispatcher) };\n }\n return this.uploadClientCache;\n }\n\n private onChoosePhoto = () => {\n this.formError = \"\";\n this.renderRoot.querySelector<SinglebaseUploader>(\"singlebase-uploader\")?.open();\n };\n\n private onPhotoSelected = () => {\n this.photoBusy = true;\n this.toast = \"\";\n };\n\n /** The server has set the photo; read the account back to get its URL. */\n private onPhotoUploaded = async (event: Event) => {\n const { completed, failed } = (event as CustomEvent).detail;\n try {\n if (completed.length) {\n await this.resolvedClient?.getAccount();\n this.photoFailed = \"\";\n this.toast = this.msg.photoUpdated;\n } else if (failed.length) {\n this.formError = failed[0].error || this.msg.genericErrorMessage;\n }\n } catch (error) {\n this.formError = this.describeError(error);\n } finally {\n this.photoBusy = false;\n }\n };\n\n private onPhotoProblem = (event: Event) => {\n this.photoBusy = false;\n this.formError = (event as CustomEvent).detail.message;\n };\n\n private startProfileEdit() {\n const u = this.user;\n if (!u) return;\n this.dFirst = u.first_name ?? \"\";\n this.dLast = u.last_name ?? \"\";\n this.dPhone = u.phone ?? \"\";\n this.dEmail = u.email;\n this.profileError = \"\";\n this.profileSaved = \"\";\n this.passSaved = \"\";\n this.toast = \"\";\n this.editMode = \"profile\";\n }\n\n private async onSaveProfile() {\n const client = this.resolvedClient;\n if (!client) return;\n if (!this.dFirst.trim() || !this.dLast.trim()) {\n this.profileError = \"First and last name cannot be empty.\";\n return;\n }\n if (this.dPhone.replace(/\\D/g, \"\").length < 7) {\n this.profileError = this.msg.invalidPhoneError;\n return;\n }\n await this.run(async () => {\n await client.updateAccount(\n { first_name: this.dFirst, last_name: this.dLast, phone: this.dPhone },\n this.signal\n );\n this.editMode = \"\";\n this.flash(\"profileSaved\", this.msg.savedNote);\n });\n }\n\n private startPassEdit() {\n this.curPass = \"\";\n this.newPass = \"\";\n this.confirmPass = \"\";\n this.newPassError = \"\";\n this.passSaved = \"\";\n this.profileSaved = \"\";\n this.toast = \"\";\n this.editMode = \"password\";\n }\n\n private async onChangePass() {\n const client = this.resolvedClient;\n if (!client) return;\n if (!this.curPass) {\n this.newPassError = \"Enter your current password.\";\n return;\n }\n if (this.newPass.length < 10) {\n this.newPassError = this.msg.passwordMinError;\n return;\n }\n if (this.newPass !== this.confirmPass) {\n this.newPassError = this.msg.passwordMatchError;\n return;\n }\n await this.run(async () => {\n await client.changePassword({ password: this.newPass }, this.signal);\n this.editMode = \"\";\n this.curPass = \"\";\n this.newPass = \"\";\n this.confirmPass = \"\";\n this.flash(\"passSaved\", this.msg.passwordUpdatedNote);\n });\n }\n\n // ── email change ─────────────────────────────────────────\n private startEmailEdit() {\n this.emailStep = \"request\";\n this.dNewEmail = \"\";\n this.emailCode = \"\";\n this.emailError = \"\";\n this.emailSaved = \"\";\n this.toast = \"\";\n this.editMode = \"email\";\n }\n\n /**\n * Step one: ask for a code. The code goes to the address on file, not to\n * the new one — that is what proves the person asking already controls the\n * account rather than merely knowing an address.\n */\n private async onRequestEmailCode() {\n const client = this.resolvedClient;\n if (!client || !this.user) return;\n if (!this.dNewEmail.includes(\"@\")) {\n this.emailError = this.msg.invalidEmailError;\n return;\n }\n if (this.dNewEmail.toLowerCase() === this.user.email.toLowerCase()) {\n this.emailError = this.msg.emailUnchangedError;\n return;\n }\n await this.run(async () => {\n await client.requestCode({ email: this.user!.email, purpose: \"email_change\" }, this.signal);\n this.emailStep = \"confirm\";\n this.emailError = \"\";\n });\n }\n\n /** Step two: confirm the code together with the new address. */\n private async onConfirmEmailChange() {\n const client = this.resolvedClient;\n if (!client || !this.user) return;\n if (this.emailCode.length < 6) {\n this.emailError = this.msg.codeIncompleteError;\n return;\n }\n await this.run(async () => {\n await client.changeEmail(\n { email: this.user!.email, code: this.emailCode, new_email: this.dNewEmail },\n this.signal\n );\n this.editMode = \"\";\n this.emailCode = \"\";\n this.dNewEmail = \"\";\n this.flash(\"emailSaved\", this.msg.emailUpdatedNote);\n });\n }\n\n private renderEmailSection() {\n const reading = this.editMode !== \"email\";\n const locked = this.editMode !== \"\" && this.editMode !== \"email\";\n\n return html`\n <div class=\"rule\"></div>\n <div class=\"section\">\n <h3 class=\"sec-title\">${this.msg.changeEmailTitle}</h3>\n ${\n reading\n ? html`\n <div class=\"between\">\n <p class=\"hint\">${this.user?.email ?? \"\"}</p>\n <div class=\"btn-row-end\">\n ${\n this.emailSaved\n ? html`<span role=\"status\" class=\"saved-note\">${this.emailSaved}</span>`\n : nothing\n }\n <button\n type=\"button\"\n class=\"edit-link\"\n ?disabled=${locked}\n @click=${this.startEmailEdit}\n >\n ${this.msg.changeEmailCtaShort}\n </button>\n </div>\n </div>\n `\n : this.emailStep === \"request\"\n ? html`\n <div class=\"edit-card\">\n <div class=\"field\">\n <label for=${this.uid(\"newemail\")}>${this.msg.newEmailLabel}</label>\n <input\n id=${this.uid(\"newemail\")}\n type=\"email\"\n part=\"input\"\n .value=${this.dNewEmail}\n placeholder=${this.msg.emailPlaceholder}\n aria-invalid=${this.emailError ? \"true\" : \"false\"}\n ?disabled=${this.submitting}\n @input=${(e: Event) => {\n this.dNewEmail = (e.target as HTMLInputElement).value;\n this.emailError = \"\";\n }}\n />\n <p class=\"hint\">${this.msg.changeEmailHint}</p>\n </div>\n ${this.emailError ? html`<p class=\"err\">${this.emailError}</p>` : nothing}\n <div class=\"edit-actions\">\n <button\n type=\"button\"\n class=\"primary-sm\"\n ?disabled=${this.submitting}\n @click=${this.onRequestEmailCode}\n >\n ${this.submitting ? html`<span class=\"spinner\"></span>` : nothing}\n <span>${this.msg.changeEmailCta}</span>\n </button>\n <button\n type=\"button\"\n class=\"ghost-sm\"\n @click=${() => {\n this.editMode = \"\";\n this.emailError = \"\";\n }}\n >\n ${this.msg.cancelCta}\n </button>\n </div>\n </div>\n `\n : html`\n <div class=\"edit-card\">\n <p class=\"hint\">${this.msg.codeSentNeutral}</p>\n <div class=\"field\">\n <label for=${this.uid(\"emailcode\")}>${this.msg.codeLabel}</label>\n <input\n id=${this.uid(\"emailcode\")}\n type=\"text\"\n inputmode=\"numeric\"\n autocomplete=\"one-time-code\"\n part=\"input\"\n .value=${this.emailCode}\n placeholder=\"000000\"\n aria-invalid=${this.emailError ? \"true\" : \"false\"}\n ?disabled=${this.submitting}\n @input=${(e: Event) => {\n this.emailCode = (e.target as HTMLInputElement).value\n .replace(/\\D/g, \"\")\n .slice(0, 6);\n this.emailError = \"\";\n }}\n />\n <p class=\"hint\">${this.msg.changeEmailConfirmHint} ${this.dNewEmail}</p>\n </div>\n ${this.emailError ? html`<p class=\"err\">${this.emailError}</p>` : nothing}\n <div class=\"edit-actions\">\n <button\n type=\"button\"\n class=\"primary-sm\"\n ?disabled=${this.submitting}\n @click=${this.onConfirmEmailChange}\n >\n ${this.submitting ? html`<span class=\"spinner\"></span>` : nothing}\n <span>${this.msg.confirmChangeCta}</span>\n </button>\n <button\n type=\"button\"\n class=\"ghost-sm\"\n @click=${() => {\n this.editMode = \"\";\n this.emailError = \"\";\n }}\n >\n ${this.msg.cancelCta}\n </button>\n </div>\n </div>\n `\n }\n </div>\n `;\n }\n\n private async onSignOut() {\n const client = this.resolvedClient;\n if (!client) return;\n await this.run(async () => {\n await client.signOut();\n });\n }\n\n private async onConnectProvider(providerId: string) {\n const client = this.resolvedClient;\n const state = this.auth.state;\n if (!client || state.status !== \"authenticated\") return;\n await this.run(async () => {\n const nonce = await client.createOAuthNonce(this.signal);\n globalThis.sessionStorage?.setItem(this.nonceStorageKey, nonce);\n const { oauth_redirect_url } = await client.startOAuth(\n {\n provider: providerId,\n nonce,\n intent: \"link\",\n id_token: state.session.id_token,\n refresh_token: state.session.refresh_token\n },\n this.signal\n );\n globalThis.location.assign(oauth_redirect_url);\n });\n }\n\n private get availableProviders(): Array<{ id: string; name: string; mark: string }> {\n const s = this.settings ?? this.settingsCtl.settings;\n if (!s || !s.oauth_settings.enabled) return [];\n const marks: Record<string, string> = {\n google: \"G\",\n github: \"GH\",\n linkedin: \"in\",\n facebook: \"f\"\n };\n return Object.entries(s.oauth_providers)\n .filter(([, p]) => p.enabled)\n .map(([id, p]) => ({\n id,\n name: p.provider_name,\n mark: marks[id] ?? p.provider_name.slice(0, 2)\n }));\n }\n\n // ── sections ──────────────────────────────────────────────\n private renderIdentity() {\n const u = this.user;\n const locked = this.editMode !== \"\" && this.editMode !== \"avatar\";\n const photo = u?.profile_photo && u.profile_photo !== this.photoFailed ? u.profile_photo : \"\";\n return html`\n <div class=\"acct-nav\">\n <div class=\"acct-who\">\n <div class=\"avatar-col\">\n <div class=\"avatar ${photo ? \"has-photo\" : \"\"}\" part=\"avatar\">\n ${\n photo\n ? html`<img\n src=${photo}\n alt=\"\"\n part=\"avatar-image\"\n @error=${() => (this.photoFailed = photo)}\n />`\n : this.initials\n }\n </div>\n <button\n type=\"button\"\n class=\"edit-link\"\n style=\"font-size:12px\"\n ?disabled=${this.photoBusy || locked}\n @click=${this.onChoosePhoto}\n >\n ${\n this.photoBusy\n ? this.msg.photoUploading\n : u?.profile_photo\n ? this.msg.changePhotoLink\n : this.msg.addPhotoLink\n }\n </button>\n <singlebase-uploader\n style=\"display:none\"\n view=\"button\"\n max-files=\"1\"\n branding=\"false\"\n accept=${PHOTO_ACCEPT}\n .client=${this.uploadClient}\n .options=${PHOTO_OPTIONS}\n @singlebase-upload-selected=${this.onPhotoSelected}\n @singlebase-upload-complete=${this.onPhotoUploaded}\n @singlebase-upload-error=${this.onPhotoProblem}\n @singlebase-upload-rejected=${this.onPhotoProblem}\n ></singlebase-uploader>\n </div>\n <div class=\"acct-who-text\">\n <div class=\"acct-name\">${this.fullName || \"—\"}</div>\n <div class=\"acct-email\">${u?.email ?? \"\"}</div>\n </div>\n </div>\n <button type=\"button\" class=\"link-sm\" ?disabled=${this.submitting} @click=${this.onSignOut}>\n ${this.msg.signOutCta}\n </button>\n </div>\n `;\n }\n\n private renderProfileSection() {\n const u = this.user;\n if (!u) return nothing;\n const reading = this.editMode !== \"profile\";\n const locked = this.editMode !== \"\" && this.editMode !== \"profile\";\n\n const summary: Array<[string, string]> = [\n [this.msg.firstNameLabel, u.first_name || \"—\"],\n [this.msg.lastNameLabel, u.last_name || \"—\"],\n [this.msg.phoneLabel, u.phone || \"—\"],\n [this.msg.emailLabel, u.email || \"—\"]\n ];\n\n return html`\n <div class=\"section\">\n ${\n reading\n ? html`\n <div class=\"sum-list\">\n ${summary.map(\n ([label, value]) => html`\n <div class=\"sum-row\">\n <span class=\"sum-label\">${label}</span>\n <span class=\"sum-value\">${value}</span>\n </div>\n `\n )}\n </div>\n <div class=\"btn-row-end\">\n ${\n this.profileSaved\n ? html`<span role=\"status\" class=\"saved-note\">${this.profileSaved}</span>`\n : nothing\n }\n <button\n type=\"button\"\n class=\"edit-link\"\n ?disabled=${locked}\n @click=${this.startProfileEdit}\n >\n ${this.msg.editAccountCta}\n </button>\n </div>\n `\n : html`\n <div class=\"edit-card\">\n <div class=\"two-up\">\n <div class=\"field\">\n <label for=${this.uid(\"first\")}>${this.msg.firstNameLabel}</label>\n <input\n id=${this.uid(\"first\")}\n type=\"text\"\n part=\"input\"\n .value=${this.dFirst}\n placeholder=${this.msg.firstNamePlaceholder}\n ?disabled=${this.submitting}\n @input=${(e: Event) => {\n this.dFirst = (e.target as HTMLInputElement).value;\n this.profileError = \"\";\n }}\n />\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"last\")}>${this.msg.lastNameLabel}</label>\n <input\n id=${this.uid(\"last\")}\n type=\"text\"\n part=\"input\"\n .value=${this.dLast}\n placeholder=${this.msg.lastNamePlaceholder}\n ?disabled=${this.submitting}\n @input=${(e: Event) => {\n this.dLast = (e.target as HTMLInputElement).value;\n this.profileError = \"\";\n }}\n />\n </div>\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"phone\")}>${this.msg.phoneLabel}</label>\n <input\n id=${this.uid(\"phone\")}\n type=\"tel\"\n part=\"input\"\n .value=${this.dPhone}\n placeholder=${this.msg.phonePlaceholder}\n ?disabled=${this.submitting}\n @input=${(e: Event) => {\n this.dPhone = (e.target as HTMLInputElement).value;\n this.profileError = \"\";\n }}\n />\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"email\")}>${this.msg.emailLabel}</label>\n <input\n id=${this.uid(\"email\")}\n type=\"email\"\n part=\"input\"\n .value=${this.dEmail}\n disabled\n title=${this.msg.notYetSupported}\n />\n <p class=\"hint\">${this.msg.changeEmailElsewhereHint}</p>\n </div>\n ${this.profileError ? html`<p class=\"err\">${this.profileError}</p>` : nothing}\n <div class=\"edit-actions\">\n <button\n type=\"button\"\n class=\"primary-sm\"\n ?disabled=${this.submitting}\n @click=${this.onSaveProfile}\n >\n ${this.submitting ? html`<span class=\"spinner\"></span>` : nothing}\n <span>${this.msg.saveChangesCta}</span>\n </button>\n <button\n type=\"button\"\n class=\"ghost-sm\"\n @click=${() => {\n this.editMode = \"\";\n this.profileError = \"\";\n }}\n >\n ${this.msg.cancelCta}\n </button>\n </div>\n </div>\n `\n }\n </div>\n `;\n }\n\n private renderPasswordSection() {\n const reading = this.editMode !== \"password\";\n const locked = this.editMode !== \"\" && this.editMode !== \"password\";\n return html`\n <div class=\"rule\"></div>\n <div class=\"section\">\n <h3 class=\"sec-title\">${this.msg.passwordSectionTitle}</h3>\n ${\n reading\n ? html`\n <div class=\"between\">\n <p class=\"hint\">${this.msg.passwordChangedHint}</p>\n <div class=\"btn-row-end\">\n ${\n this.passSaved\n ? html`<span role=\"status\" class=\"saved-note\">${this.passSaved}</span>`\n : nothing\n }\n <button\n type=\"button\"\n class=\"edit-link\"\n ?disabled=${locked}\n @click=${this.startPassEdit}\n >\n ${this.msg.changePasswordCta}\n </button>\n </div>\n </div>\n `\n : html`\n <div class=\"edit-card\">\n <div class=\"field\">\n <label for=${this.uid(\"curpass\")}>${this.msg.currentPasswordLabel}</label>\n <input\n id=${this.uid(\"curpass\")}\n type=\"password\"\n part=\"input\"\n .value=${this.curPass}\n placeholder=${this.msg.passwordPlaceholder}\n ?disabled=${this.submitting}\n @input=${(e: Event) => {\n this.curPass = (e.target as HTMLInputElement).value;\n this.newPassError = \"\";\n }}\n />\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"newpass\")}>${this.msg.newPasswordLabel}</label>\n <input\n id=${this.uid(\"newpass\")}\n type=\"password\"\n part=\"input\"\n .value=${this.newPass}\n placeholder=${this.msg.newPasswordPlaceholder}\n aria-invalid=${this.newPassError ? \"true\" : \"false\"}\n ?disabled=${this.submitting}\n @input=${(e: Event) => {\n this.newPass = (e.target as HTMLInputElement).value;\n this.newPassError = \"\";\n }}\n />\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"confirmpass\")}>Confirm new password</label>\n <input\n id=${this.uid(\"confirmpass\")}\n type=\"password\"\n part=\"input\"\n .value=${this.confirmPass}\n placeholder=${this.msg.confirmPasswordPlaceholder}\n aria-invalid=${this.newPassError ? \"true\" : \"false\"}\n ?disabled=${this.submitting}\n @input=${(e: Event) => {\n this.confirmPass = (e.target as HTMLInputElement).value;\n this.newPassError = \"\";\n }}\n />\n ${this.newPassError ? html`<p class=\"err\">${this.newPassError}</p>` : nothing}\n </div>\n <div class=\"edit-actions\">\n <button\n type=\"button\"\n class=\"primary-sm\"\n ?disabled=${this.submitting}\n @click=${this.onChangePass}\n >\n ${this.submitting ? html`<span class=\"spinner\"></span>` : nothing}\n <span>${this.msg.updatePasswordCta}</span>\n </button>\n <button type=\"button\" class=\"ghost-sm\" @click=${() => (this.editMode = \"\")}>\n ${this.msg.cancelCta}\n </button>\n </div>\n </div>\n `\n }\n </div>\n `;\n }\n\n /** Layout preserved from the mock; no enrolment operation exists yet. */\n private renderTwoFactorSection() {\n return html`\n <div class=\"rule\"></div>\n <div class=\"section\">\n <div class=\"between\">\n <div>\n <h3 class=\"sec-title\">${this.msg.twoFaTitle}</h3>\n <p class=\"hint\">${this.msg.twoFaHintOff}</p>\n </div>\n <button\n type=\"button\"\n class=\"switch\"\n aria-pressed=\"false\"\n aria-label=${`${this.msg.twoFaTitle} (${this.msg.notYetSupported})`}\n disabled\n title=${this.msg.notYetSupported}\n >\n <span class=\"knob\"></span>\n </button>\n </div>\n <p class=\"disabled-note\">\n ${this.msg.notYetSupported} — enrolling a second factor is not part of the current API.\n </p>\n </div>\n `;\n }\n\n private renderConnectedSection() {\n const providers = this.availableProviders;\n if (providers.length === 0) return nothing;\n return html`\n <div class=\"rule\"></div>\n <div class=\"section\">\n <h3 class=\"sec-title\">${this.msg.connectedTitle}</h3>\n <p class=\"hint\">${this.msg.connectedHint}</p>\n <span class=\"sub-label\">${this.msg.addAnotherLabel}</span>\n <div class=\"tile-grid\">\n ${providers.map(\n (p) => html`\n <button\n type=\"button\"\n class=\"tile\"\n aria-label=${`Connect ${p.name}`}\n ?disabled=${this.submitting}\n @click=${() => this.onConnectProvider(p.id)}\n >\n <span class=\"tile-mark\">${p.mark}</span>\n <span class=\"tile-name\">${p.name}</span>\n <span class=\"tile-plus\">+</span>\n </button>\n `\n )}\n </div>\n <p class=\"disabled-note\">\n ${this.msg.notYetSupported} — listing or disconnecting linked providers is not part of the\n current API.\n </p>\n </div>\n `;\n }\n\n private renderDangerSection() {\n return html`\n <div class=\"rule\"></div>\n <div class=\"section\">\n ${\n this.deleteStage === 0\n ? html`<button\n type=\"button\"\n class=\"danger-link\"\n disabled\n title=${this.msg.notYetSupported}\n >\n ${this.msg.deleteAccountCta}\n </button>`\n : nothing\n }\n <p class=\"disabled-note\">\n ${this.msg.notYetSupported} — account deletion is not part of the current API.\n </p>\n </div>\n `;\n }\n\n protected override render() {\n if (!this.user) return html`<p class=\"disabled-note\">Not signed in.</p>`;\n\n return html`\n <div class=\"acct-root\">\n ${this.renderLogo()} ${this.renderIdentity()}\n <div class=\"acct-body\">\n ${this.toast ? html`<div class=\"notice\" role=\"status\">${this.toast}</div>` : nothing}\n ${this.formError ? html`<div class=\"banner\" role=\"alert\">${this.formError}</div>` : nothing}\n ${this.renderProfileSection()} ${this.renderEmailSection()}\n ${this.renderPasswordSection()}\n ${SHOW_TWO_FACTOR ? this.renderTwoFactorSection() : nothing}\n ${this.renderConnectedSection()}\n ${SHOW_DELETE_ACCOUNT ? this.renderDangerSection() : nothing}\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"singlebase-authui-account\": SinglebaseAccountScreen;\n }\n}\n","import { html, nothing, type PropertyValues } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport type { AuthSettings, OAuthIntent } from \"@singlebase/singlebase-sdk\";\nimport { SinglebaseFormBase } from \"./authui-form-base.js\";\nimport { SettingsController } from \"../controllers/settings-controller.js\";\n\nexport type ButtonsType = \"signout\" | \"oauth\" | \"link\";\n\n/**\n * The widget's action buttons, selected with `type`:\n *\n * <singlebase-authui-buttons type=\"signout\"></singlebase-authui-buttons>\n * <singlebase-authui-buttons type=\"oauth\" intent=\"signup\"></singlebase-authui-buttons>\n * <singlebase-authui-buttons type=\"link\" provider=\"github\"></singlebase-authui-buttons>\n *\n * They live under one tag rather than three because they are the same thing\n * from a host's point of view — a button that performs one auth action — and\n * every custom element name is a global, unversioned claim on any page this\n * widget is dropped into.\n */\n@customElement(\"singlebase-authui-buttons\")\nexport class SinglebaseAuthButtons extends SinglebaseFormBase {\n @property() accessor type: ButtonsType = \"signout\";\n\n /** oauth: which flow the provider buttons start. */\n @property() accessor intent: OAuthIntent = \"signin\";\n\n /** link: the provider to connect to the signed-in account. */\n @property() accessor provider = \"\";\n\n /** link: display name, when it differs from the provider id. */\n @property({ attribute: \"provider-name\" }) accessor providerName = \"\";\n\n /** Inside a card that already supplies chrome, drop this element's own. */\n @property({ type: Boolean }) accessor embedded = false;\n\n @property({ attribute: false }) accessor settings: AuthSettings | null = null;\n\n @property({ attribute: \"nonce-storage-key\" })\n accessor nonceStorageKey = \"singlebase-oauth-nonce\";\n\n private settingsCtl = new SettingsController(this);\n\n override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n if (this.type === \"oauth\") this.settingsCtl.load(this.resolvedClient, this.settings);\n }\n\n private get effectiveSettings(): AuthSettings | null {\n return this.settings ?? this.settingsCtl.settings;\n }\n\n // ── oauth ────────────────────────────────────────────────\n private get providers(): Array<{ id: string; name: string; mark: string }> {\n const s = this.effectiveSettings;\n if (!s || !s.oauth_settings.enabled) return [];\n const allowed =\n this.intent === \"signup\" ? s.oauth_settings.allow_signup : s.oauth_settings.allow_signin;\n if (!allowed && this.intent !== \"link\") return [];\n\n const marks: Record<string, string> = {\n google: \"G\",\n github: \"GH\",\n linkedin: \"in\",\n facebook: \"f\"\n };\n return Object.entries(s.oauth_providers)\n .filter(([, p]) => p.enabled)\n .map(([id, p]) => ({\n id,\n name: p.provider_name,\n mark: marks[id] ?? p.provider_name.slice(0, 2)\n }));\n }\n\n /** Shared by the oauth and link flows: nonce, start, redirect. */\n private async startOAuth(providerId: string, intent: OAuthIntent, linking = false) {\n const client = this.resolvedClient;\n if (!client) return;\n\n let idToken: string | undefined;\n let refreshToken: string | undefined;\n if (linking) {\n const state = this.auth.state;\n if (state.status !== \"authenticated\") {\n this.formError = this.msg.linkRequiresSignIn;\n this.phase = \"error\";\n return;\n }\n idToken = state.session.id_token;\n refreshToken = state.session.refresh_token;\n }\n\n await this.run(async () => {\n const nonce = await client.createOAuthNonce(this.signal);\n globalThis.sessionStorage?.setItem(this.nonceStorageKey, nonce);\n const { oauth_redirect_url } = await client.startOAuth(\n {\n provider: providerId,\n nonce,\n intent,\n ...(linking ? { id_token: idToken, refresh_token: refreshToken } : {})\n },\n this.signal\n );\n globalThis.location.assign(oauth_redirect_url);\n });\n }\n\n private renderOAuth() {\n const providers = this.providers;\n if (providers.length === 0) return nothing;\n const [primary, ...rest] = providers;\n\n return html`\n <div class=\"stack\">\n ${\n this.formError\n ? html`<div class=\"banner\" part=\"banner\" role=\"alert\">${this.formError}</div>`\n : nothing\n }\n\n <button\n type=\"button\"\n class=\"oauth-primary\"\n part=\"oauth-button\"\n ?disabled=${this.submitting}\n @click=${() => this.startOAuth(primary!.id, this.intent)}\n >\n <span class=\"g-mark\">${primary!.mark}</span>\n <span>${this.msg.oauthContinueWith} ${primary!.name}</span>\n </button>\n\n ${\n rest.length\n ? html`\n <div class=\"icon-row\">\n ${rest.map(\n (p) => html`\n <button\n type=\"button\"\n class=\"icon-btn\"\n part=\"oauth-button\"\n aria-label=${`${this.msg.oauthContinueWith} ${p.name}`}\n title=${`${this.msg.oauthContinueWith} ${p.name}`}\n ?disabled=${this.submitting}\n @click=${() => this.startOAuth(p.id, this.intent)}\n >\n <span class=\"tile-mark\">${p.mark}</span>\n </button>\n `\n )}\n </div>\n `\n : nothing\n }\n </div>\n `;\n }\n\n // ── link ─────────────────────────────────────────────────\n private renderLink() {\n return html`\n <div class=\"stack\">\n ${this.renderStatus()}\n <button\n type=\"button\"\n class=\"secondary\"\n part=\"oauth-button\"\n ?disabled=${this.submitting}\n @click=${() => this.startOAuth(this.provider, \"link\", true)}\n >\n ${this.submitting ? html`<span class=\"spinner\"></span>` : nothing}\n <span>${this.msg.oauthContinueWith} ${this.providerName || this.provider}</span>\n </button>\n </div>\n `;\n }\n\n // ── signout ──────────────────────────────────────────────\n private async onSignOut() {\n const client = this.resolvedClient;\n if (!client) return;\n await this.run(async () => {\n await client.signOut();\n });\n }\n\n private renderSignOut() {\n if (this.embedded) {\n return html`<button\n type=\"button\"\n class=\"link-sm\"\n part=\"button-signout\"\n ?disabled=${this.submitting}\n @click=${this.onSignOut}\n >\n ${this.msg.signOutCta}\n </button>`;\n }\n\n return html`\n <div class=\"stack\">\n ${this.formError ? html`<p class=\"banner\" role=\"alert\">${this.formError}</p>` : nothing}\n <button\n type=\"button\"\n class=\"link-sm\"\n part=\"button-signout\"\n ?disabled=${this.submitting}\n @click=${this.onSignOut}\n >\n ${this.msg.signOutCta}\n </button>\n </div>\n `;\n }\n\n protected override render() {\n if (this.type === \"oauth\") return this.renderOAuth();\n if (this.type === \"link\") return this.renderLink();\n return this.renderSignOut();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"singlebase-authui-buttons\": SinglebaseAuthButtons;\n }\n}\n","import { html, css, nothing, type PropertyValues } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport {\n SinglebaseAuthError,\n resolveScreen,\n type AuthClient,\n type AuthSettings\n} from \"@singlebase/singlebase-sdk\";\nimport { SinglebaseElementBase } from \"./authui-base.js\";\nimport { resolveRedirectTarget } from \"../utils/redirect.js\";\nimport { SettingsController } from \"../controllers/settings-controller.js\";\nimport { EventBridge } from \"../controllers/event-bridge.js\";\nimport { brandingStyles } from \"../styles/branding.js\";\nimport { renderBranding } from \"../utils/branding.js\";\nimport \"./authui-account.js\";\nimport \"./authui-buttons.js\";\n\n/** Screens a signed-out visitor may reach. */\nexport type GuestScreen = \"signin\" | \"signup\" | \"forgot\" | \"verify\" | \"otp\" | \"newpass\" | \"invite\";\n\n/** Screens that require a live session. */\nexport type ProtectedScreen = \"account\";\n\n/** Every value `screen` accepts. \"oauth-callback\" is entered by URL, not by hand. */\nexport type Screen = GuestScreen | ProtectedScreen | \"oauth-callback\";\n\nconst GUEST_SCREENS: GuestScreen[] = [\n \"signin\",\n \"signup\",\n \"forgot\",\n \"verify\",\n \"otp\",\n \"newpass\",\n \"invite\"\n];\n\nconst PROTECTED_SCREENS: ProtectedScreen[] = [\"account\"];\n\nconst ALL_SCREENS: Screen[] = [...GUEST_SCREENS, ...PROTECTED_SCREENS, \"oauth-callback\"];\n\nexport function isGuestScreen(value: string): value is GuestScreen {\n return (GUEST_SCREENS as string[]).includes(value);\n}\n\nexport function isProtectedScreen(value: string): value is ProtectedScreen {\n return (PROTECTED_SCREENS as string[]).includes(value);\n}\n\nexport function isScreen(value: string): value is Screen {\n return (ALL_SCREENS as string[]).includes(value);\n}\n\n/**\n * Converter for the allow-* flags, which default to true. Lit's Boolean\n * converter can only express \"present = true\", so it cannot turn a\n * default-true flag off from markup; this one reads `allow-x=\"false\"` as\n * false and leaves the default alone when the attribute is absent.\n */\nconst flagAttr = {\n // An absent attribute must mean \"default\" (true), not false. Lit calls\n // fromAttribute(null) when an attribute is *removed*, so returning false\n // there would make removing `allow-oauth=\"false\"` leave the flag off\n // forever instead of restoring the default.\n fromAttribute: (value: string | null) => (value === null ? true : value !== \"false\"),\n toAttribute: (value: boolean) => (value ? null : \"false\")\n};\n\n/**\n * The complete auth widget: routes among signin, signup, recovery, one-time\n * code, invite and OAuth-callback views (spec: AuthScreen), and renders the\n * design's full card chrome — brand panel, logo, method accordion, step bar,\n * banner/notice, actions and footer.\n *\n * Structure and styling follow project/AuthWidget.dc.html; the individual\n * sb-* form elements remain available for hosts that want to compose their\n * own screen instead of using this one.\n */\n@customElement(\"singlebase-authui\")\nexport class SinglebaseAuthScreen extends SinglebaseElementBase {\n static override styles = [\n ...SinglebaseElementBase.styles,\n brandingStyles,\n css`\n /* the mock's root */\n :host {\n display: flex;\n width: 100%;\n box-sizing: border-box;\n background: var(--sb-surface, #ffffff);\n color: var(--sb-ink, #16181a);\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: calc((var(--sb-radius, 4px) + 4px) * var(--sb-radius-scale, 1));\n overflow: hidden;\n }\n\n .brand-panel {\n flex: 0 0 40%;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n gap: 24px;\n padding: var(--sb-pad, 20px);\n background: var(--sb-surface-alt, #fafafa);\n border-right: 1px solid var(--sb-border, #e4e6e9);\n }\n\n /* A flex column would stretch an image to full width and wreck its\n aspect ratio, so both logos opt out of the cross-axis stretch. */\n .logo-img {\n display: block;\n align-self: flex-start;\n height: var(--sb-logo-height, 20px);\n width: auto;\n max-width: 100%;\n margin-bottom: 6px;\n }\n\n .brand-img {\n display: block;\n align-self: flex-start;\n height: var(--sb-brand-logo-height, 28px);\n width: auto;\n max-width: 100%;\n }\n\n .brand-mark {\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 13px;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--sb-ink, #16181a);\n }\n\n .brand-copy {\n font-size: 20px;\n line-height: 1.35;\n letter-spacing: -0.01em;\n color: var(--sb-ink, #16181a);\n text-wrap: pretty;\n }\n\n .brand-foot {\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 11px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .branding {\n margin-top: 18px;\n }\n\n /* the mock's panel */\n .panel {\n flex: 1;\n min-width: 0;\n padding: var(--sb-pad, 20px);\n }\n\n @media (max-width: 520px) {\n :host {\n flex-direction: column;\n }\n .brand-panel {\n flex: 0 0 auto;\n border-right: none;\n border-bottom: 1px solid var(--sb-border, #e4e6e9);\n }\n }\n `\n ];\n\n // ── configuration (mirrors the mock's props) ───────────────\n @property({ attribute: \"initial-screen\" }) accessor initialScreen: Screen = \"signin\";\n\n /**\n * Two-way screen binding for SPA routers: set it to deep-link a screen,\n * read it (or listen for `singlebase-screen-change`) to mirror the widget\n * into your URL. `goto()` is the imperative form.\n */\n @property({ reflect: true })\n accessor screen: Screen | \"\" = \"\";\n\n /**\n * By default the widget swaps to the account view once authenticated.\n * SPAs usually want to route away and unmount instead — set this and the\n * widget renders nothing when signed in, leaving navigation to the host.\n */\n @property({ type: Boolean, attribute: \"no-account-view\" })\n accessor noAccountView = false;\n @property({ attribute: false }) accessor settings: AuthSettings | null = null;\n\n @property({ converter: flagAttr, attribute: \"auth-enabled\" }) accessor authEnabled = true;\n @property({ converter: flagAttr, attribute: \"allow-email-signin\" }) accessor allowEmailSignin =\n true;\n @property({ converter: flagAttr, attribute: \"allow-email-signup\" }) accessor allowEmailSignup =\n true;\n @property({ converter: flagAttr, attribute: \"allow-email-otp\" }) accessor allowEmailOtp = true;\n @property({ converter: flagAttr, attribute: \"allow-oauth\" }) accessor allowOauth = true;\n @property({ converter: flagAttr, attribute: \"allow-account-creation\" })\n accessor allowAccountCreation = true;\n\n @property() accessor layout: \"card\" | \"split\" = \"card\";\n @property({ attribute: \"oauth-placement\" }) accessor oauthPlacement: \"top\" | \"bottom\" = \"bottom\";\n @property({ type: Boolean }) accessor stepped = false;\n\n /**\n * Branding is the host's, so these default to empty and the corresponding\n * slots simply do not render. (\"KEYRING\" and friends were the fictional\n * brand in the design mock — they must never ship as defaults.)\n */\n @property({ attribute: \"logo-text\" }) accessor logoText = \"\";\n\n /**\n * A logo image, used instead of `logo-text` when set. `logo-text` is still\n * worth supplying alongside it — it becomes the image's alt text.\n */\n @property({ attribute: \"logo-url\" }) accessor logoUrl = \"\";\n @property({ attribute: \"brand-line\" }) accessor brandLine = \"\";\n @property({ attribute: \"brand-foot\" }) accessor brandFoot = \"\";\n @property({ attribute: \"sign-in-title\" }) accessor signInTitle = \"\";\n\n /**\n * The \"Auth by Singlebase\" credit under the card. On by default; turn it\n * off with branding=\"false\", exactly like the allow-* flags.\n *\n * It is a plain link — no pixel, no beacon, no request of any kind. A\n * third-party network call originating from a sign-in form is the sort of\n * thing that fails a security review, and deservedly.\n */\n @property({ converter: flagAttr, attribute: \"branding\" }) accessor branding = true;\n\n /**\n * Where to send the user once a session exists. Same-origin only — an\n * absolute URL pointing anywhere else is refused, because a login widget\n * that forwards to an attacker-supplied host is an open redirect.\n *\n * When unset, a `?redirect=` (or `?next=`) parameter on the current URL is\n * used instead, so \"you were sent to the login page, now go back where you\n * were headed\" works without the host wiring anything.\n */\n @property({ attribute: \"redirect-url\" }) accessor redirectUrl = \"\";\n\n /** Shown as \"Terms\" in the consent line under the primary action. */\n @property({ attribute: \"tos-url\" }) accessor tosUrl = \"\";\n\n /** Shown as \"Privacy\" in the consent line under the primary action. */\n @property({ attribute: \"privacy-url\" }) accessor privacyUrl = \"\";\n\n /** Where the OAuth nonce is stashed between starting a flow and returning. */\n @property({ attribute: \"nonce-storage-key\" })\n accessor nonceStorageKey = \"singlebase-oauth-nonce\";\n @property({ attribute: \"invite-email\" }) accessor inviteEmail = \"\";\n @property({ attribute: \"invite-org\" }) accessor inviteOrg = \"\";\n /** Invite code carried by the invite link; when absent the widget asks for it. */\n @property({ attribute: \"invite-code\" }) accessor inviteCode = \"\";\n\n // ── state (mirrors the mock's state bag) ───────────────────\n @state() private accessor step = 0;\n @state() private accessor method = \"\";\n @state() private accessor email = \"\";\n @state() private accessor password = \"\";\n @state() private accessor name = \"\";\n @state() private accessor firstName = \"\";\n @state() private accessor lastName = \"\";\n @state() private accessor phone = \"\";\n @state() private accessor newPass = \"\";\n @state() private accessor confirmPass = \"\";\n @state() private accessor code: string[] = [\"\", \"\", \"\", \"\", \"\", \"\"];\n @state() private accessor verifyNext: \"newpass\" | \"signin_code\" | \"invite\" = \"signin_code\";\n @state() private accessor loading = false;\n @state() private accessor banner = \"\";\n @state() private accessor notice = \"\";\n @state() private accessor emailError = \"\";\n @state() private accessor passError = \"\";\n @state() private accessor newPassError = \"\";\n @state() private accessor attempts = 0;\n @state() private accessor needsMfaCode = false;\n\n private settingsCtl = new SettingsController(this);\n private bridge = new EventBridge(this);\n private uidBase = `sb-${Math.random().toString(36).slice(2, 8)}`;\n\n private uid(k: string) {\n return `${this.uidBase}-${k}`;\n }\n\n override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n this.settingsCtl.load(this.resolvedClient, this.settings);\n this.bridge.bind(this.resolvedClient);\n this.bindGoto(this.resolvedClient);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.gotoUnsubscribe?.();\n this.gotoUnsubscribe = undefined;\n this.gotoClient = null;\n this.abortController?.abort();\n }\n\n private gotoUnsubscribe?: () => void;\n private gotoClient: AuthClient | null = null;\n\n /**\n * Subscribes to auth.goto() so a host can drive every widget on the page\n * with one call. Bound here rather than in connectedCallback because the\n * app usually creates its SinglebaseAuth() instance *after* the widget\n * upgrades — at connect time there is often no client to subscribe to yet.\n */\n private bindGoto(client: AuthClient | null) {\n if (client === this.gotoClient) return;\n this.gotoUnsubscribe?.();\n this.gotoUnsubscribe = undefined;\n this.gotoClient = client;\n if (!client) return;\n\n const offGoto = client.on(\"goto\", ({ screen }) => {\n if (isScreen(screen)) this.goto(screen);\n });\n\n // Follow the redirect on an actual sign-in only. Doing this from the\n // authenticated *state* instead would also fire for a session restored\n // on page load, which is the case that should show the interstitial and\n // let the user choose.\n const offSignin = client.on(\"signin\", () => {\n this.followRedirect();\n });\n\n this.gotoUnsubscribe = () => {\n offGoto();\n offSignin();\n };\n }\n\n /** Shows a screen. The SPA-facing counterpart of the `screen` property. */\n goto(screen: Screen): void {\n if (this.screen === screen) return;\n this.screen = screen;\n this.step = 0;\n this.banner = \"\";\n this.notice = \"\";\n this.dispatchEvent(\n new CustomEvent(\"singlebase-screen-change\", {\n detail: { screen },\n bubbles: true,\n composed: true\n })\n );\n }\n\n // ── derived config: explicit props unless auth.settings says otherwise ──\n private get cfg() {\n const s = this.settings ?? this.settingsCtl.settings;\n if (!s) {\n return {\n authEnabled: this.authEnabled,\n allowEmailSignin: this.allowEmailSignin,\n allowEmailSignup: this.allowEmailSignup && this.allowAccountCreation,\n allowEmailOtp: this.allowEmailOtp,\n allowOauth: this.allowOauth,\n mfa: false\n };\n }\n const a = s.auth_settings;\n // Code-only signin is available only when the project does not require\n // password-plus-OTP MFA (the auth API's code sign-in).\n const mfa = a.second_factor === \"email_otp\";\n return {\n authEnabled: s.enabled && a.enabled && this.authEnabled,\n allowEmailSignin: a.allow_signin && this.allowEmailSignin,\n allowEmailSignup: a.allow_signup && this.allowEmailSignup && this.allowAccountCreation,\n allowEmailOtp: this.allowEmailOtp && a.allow_signin && !mfa,\n allowOauth: s.oauth_settings.enabled && this.allowOauth,\n mfa\n };\n }\n\n /** The screen the host asked for, before any guarding is applied. */\n private get requestedScreen(): Screen {\n const raw = this.screen || this.initialScreen || \"signin\";\n return isScreen(raw) ? raw : \"signin\";\n }\n\n /**\n * Resolves the screen actually rendered.\n *\n * This is the single place navigation is decided, so a protected screen\n * cannot be reached by setting an attribute, editing the URL, or calling\n * goto() — every route runs through the same auth check. The guest\n * fallbacks below additionally reflect what the project has enabled.\n */\n private get activeScreen(): Screen {\n if (this.isOAuthCallback) return \"oauth-callback\";\n\n const authenticated = this.auth.state.status === \"authenticated\";\n const requested = this.requestedScreen;\n\n if (isProtectedScreen(requested)) {\n // Never render a protected screen without a session.\n return authenticated ? requested : \"signin\";\n }\n\n if (authenticated) {\n // With no screen asked for, a signed-in visitor belongs on their\n // account. If the host *did* ask for a guest screen, honour it — the\n // interstitial below then offers to continue or sign out, rather than\n // showing a sign-in form to someone already signed in.\n const askedForOne = this.screen !== \"\" || this.initialScreen !== \"signin\";\n return askedForOne ? requested : \"account\";\n }\n\n const c = this.cfg;\n let screen = requested as GuestScreen;\n if (screen === \"signup\" && !c.allowEmailSignup) screen = \"signin\";\n if ((screen === \"forgot\" || screen === \"newpass\") && !c.allowEmailSignin) screen = \"signin\";\n if (screen === \"otp\" && !c.allowEmailOtp) screen = \"signin\";\n if (screen === \"signin\" && !c.allowEmailSignin && c.allowEmailOtp) screen = \"otp\";\n return screen;\n }\n\n /** True when a signed-in user is sitting on a guest screen (spec: offer continue/sign out). */\n private get showsSignedInInterstitial(): boolean {\n return this.auth.state.status === \"authenticated\" && isGuestScreen(this.activeScreen);\n }\n\n // ── redirect ──────────────────────────────────────────────\n\n /**\n * The post-login destination, or null when there is none.\n *\n * Only same-origin targets are accepted. A login widget that forwards to\n * an attacker-chosen host is a textbook open redirect, and the `redirect`\n * parameter it reads comes straight off the URL bar, so it is untrusted\n * input by definition.\n */\n private get redirectTarget(): string | null {\n return resolveRedirectTarget(\n this.redirectUrl || this.redirectParam,\n globalThis.location?.href,\n (reason) => console.warn(`[singlebase] ${reason}`)\n );\n }\n\n private get redirectParam(): string {\n const params = new URLSearchParams(globalThis.location?.search ?? \"\");\n return params.get(\"redirect\") ?? params.get(\"next\") ?? \"\";\n }\n\n /** Navigates to the post-login destination if there is a safe one. */\n private followRedirect(): boolean {\n const target = this.redirectTarget;\n if (!target) return false;\n globalThis.location?.assign(target);\n return true;\n }\n\n private get isOAuthCallback(): boolean {\n const params = new URLSearchParams(globalThis.location?.search ?? \"\");\n return params.has(\"access_code\") || params.has(\"error\");\n }\n\n // ── OAuth callback ────────────────────────────────────────\n //\n // Handled here rather than in a separate element: it is a screen of this\n // widget like any other, and giving it its own tag meant a second element\n // with its own copy of the loading/error handling.\n\n @state() private accessor callbackDone = false;\n\n /** Strips the provider's parameters so a reload cannot replay the exchange. */\n private cleanCallbackUrl(): void {\n const here = globalThis.location?.href;\n if (!here || !globalThis.history) return;\n const url = new URL(here);\n url.searchParams.delete(\"access_code\");\n url.searchParams.delete(\"error\");\n globalThis.history.replaceState({}, \"\", url.toString());\n }\n\n /**\n * Completes the provider round trip. Runs once per landing: the URL is\n * cleaned immediately so a refresh cannot resend a single-use access code.\n */\n private async handleOAuthCallback(): Promise<void> {\n if (this.callbackDone) return;\n this.callbackDone = true;\n\n const params = new URLSearchParams(globalThis.location?.search ?? \"\");\n const accessCode = params.get(\"access_code\");\n const denied = params.get(\"error\");\n const client = this.resolvedClient;\n\n if (denied) {\n this.cleanCallbackUrl();\n this.banner = this.msg.oauthDenied;\n return;\n }\n\n if (!accessCode || !client) return;\n\n const nonce = globalThis.sessionStorage?.getItem(this.nonceStorageKey);\n this.cleanCallbackUrl();\n\n if (!nonce) {\n // No nonce means this response cannot be tied to a flow this browser\n // started, so it is not safe to exchange.\n this.banner = this.msg.genericErrorMessage;\n return;\n }\n\n await this.withLoading(async () => {\n await client.completeOAuth({ access_code: accessCode, nonce }, this.signal());\n globalThis.sessionStorage?.removeItem(this.nonceStorageKey);\n });\n }\n\n /** The small logo above a screen title: image when given one, else text. */\n private renderLogo() {\n if (this.logoUrl) {\n return html`<img class=\"logo-img\" part=\"logo\" src=${this.logoUrl} alt=${this.logoText} />`;\n }\n return this.logoText ? html`<div class=\"logo-dot\" part=\"logo\">${this.logoText}</div>` : nothing;\n }\n\n /** The larger logo in the split layout's brand panel. */\n private renderBrandMark() {\n if (this.logoUrl) {\n return html`<img class=\"brand-img\" part=\"logo\" src=${this.logoUrl} alt=${this.logoText} />`;\n }\n return this.logoText\n ? html`<div class=\"brand-mark\" part=\"logo\">${this.logoText}</div>`\n : nothing;\n }\n\n private renderBranding() {\n return renderBranding(this.branding, \"Auth\");\n }\n\n /** Every screen renders inside this, so the credit appears once and only once. */\n private panel(content: unknown) {\n return html`<div class=\"panel\">${content}${this.renderBranding()}</div>`;\n }\n\n private renderOAuthCallback() {\n return html`\n <div class=\"stack\">\n <div class=\"head\">\n ${this.renderLogo()}\n <h2 class=\"title\" part=\"title\">${this.msg.oauthCallbackTitle}</h2>\n <p class=\"sub\">${this.msg.oauthCallbackSub}</p>\n </div>\n ${\n this.banner\n ? html`<div class=\"banner\" part=\"banner\" role=\"alert\">${this.banner}</div>`\n : html`<div class=\"stack\" style=\"align-items:center;\">\n <span class=\"spinner\" part=\"spinner\"></span>\n </div>`\n }\n ${\n this.banner\n ? html`<button type=\"button\" class=\"ghost\" @click=${() => this.goto(\"signin\")}>\n <span>${this.msg.backCta}</span>\n </button>`\n : nothing\n }\n </div>\n `;\n }\n\n private setScreen(screen: GuestScreen, patch: Record<string, unknown> = {}) {\n const changed = this.screen !== screen;\n this.screen = screen;\n this.banner = \"\";\n this.emailError = \"\";\n this.passError = \"\";\n Object.assign(this, patch);\n if (changed) {\n this.dispatchEvent(\n new CustomEvent(\"singlebase-screen-change\", {\n detail: { screen },\n bubbles: true,\n composed: true\n })\n );\n }\n }\n\n // ── submit ────────────────────────────────────────────────\n private async withLoading(task: () => Promise<void>) {\n this.loading = true;\n this.banner = \"\";\n try {\n await task();\n } catch (error) {\n this.banner = this.describeError(error);\n } finally {\n this.loading = false;\n }\n }\n\n private describeError(error: unknown): string {\n if (error instanceof SinglebaseAuthError) {\n if (error.code === \"AUTH_RATE_LIMITED\") return this.msg.rateLimitedMessage;\n if (error.code === \"INVALID_TOKEN\") return \"That code is not valid. Check it and try again.\";\n }\n return this.msg.genericErrorMessage;\n }\n\n private get codeValue() {\n return this.code.join(\"\");\n }\n\n private async onSubmit(e?: Event) {\n e?.preventDefault();\n const client = this.resolvedClient;\n if (!client) return;\n const screen = this.activeScreen;\n const c = this.cfg;\n\n if (screen === \"forgot\" || screen === \"otp\") {\n if (!this.email.includes(\"@\")) {\n this.emailError = this.msg.invalidEmailError;\n return;\n }\n const purpose = screen === \"forgot\" ? \"password_reset\" : \"signin\";\n await this.withLoading(async () => {\n await client.requestCode({ email: this.email, purpose }, this.signal());\n this.notice = this.msg.codeSentNeutral;\n this.screen = \"verify\";\n this.verifyNext = screen === \"forgot\" ? \"newpass\" : \"signin_code\";\n this.code = [\"\", \"\", \"\", \"\", \"\", \"\"];\n });\n return;\n }\n\n if (screen === \"verify\") {\n if (this.codeValue.length < 6) {\n this.banner = this.msg.codeIncompleteError;\n return;\n }\n if (this.verifyNext === \"newpass\") {\n // Code is confirmed together with the new password by auth.confirm_code.\n this.setScreen(\"newpass\", { notice: \"\" });\n return;\n }\n await this.withLoading(async () => {\n await client.signIn(\n { email: this.email, grant_type: \"code\", code: this.codeValue },\n this.signal()\n );\n this.notice = \"\";\n });\n return;\n }\n\n if (screen === \"newpass\") {\n if (this.newPass.length < 10) {\n this.newPassError = this.msg.passwordMinError;\n return;\n }\n if (this.newPass !== this.confirmPass) {\n this.newPassError = this.msg.passwordMatchError;\n return;\n }\n await this.withLoading(async () => {\n await client.resetPassword(\n { email: this.email, code: this.codeValue, new_password: this.newPass },\n this.signal()\n );\n this.newPass = \"\";\n this.confirmPass = \"\";\n });\n return;\n }\n\n if (screen === \"invite\") {\n if (!this.firstName.trim() || !this.lastName.trim()) {\n this.banner = \"Enter your first and last name.\";\n return;\n }\n if (this.phone.replace(/\\D/g, \"\").length < 7) {\n this.banner = this.msg.invalidPhoneError;\n return;\n }\n if (this.password.length < 10) {\n this.passError = this.msg.passwordMinError;\n return;\n }\n const code = this.inviteCode || this.codeValue;\n if (code.length < 6) {\n this.banner = this.msg.codeIncompleteError;\n return;\n }\n await this.withLoading(async () => {\n await client.acceptInvite(\n {\n email: this.inviteEmail,\n grant_type: \"code\",\n purpose: \"invite\",\n code,\n password: this.password,\n phone: this.phone\n },\n this.signal()\n );\n });\n return;\n }\n\n if (\n this.stepped &&\n ((screen === \"signup\" && this.step < 2) || (screen === \"signin\" && this.step < 1))\n ) {\n if (!this.email.includes(\"@\")) {\n this.emailError = this.msg.invalidEmailError;\n return;\n }\n this.step += 1;\n return;\n }\n\n if (!this.email.includes(\"@\")) {\n this.emailError = this.msg.invalidEmailError;\n return;\n }\n\n if (screen === \"signup\") {\n if (this.password.length < 8) {\n this.passError = \"Password must be at least 8 characters.\";\n return;\n }\n const [first, ...rest] = this.name.trim().split(/\\s+/);\n await this.withLoading(async () => {\n const result = await client.signUp(\n {\n email: this.email,\n password: this.password,\n first_name: first || this.name,\n last_name: rest.join(\" \") || \"—\"\n },\n this.signal()\n );\n const next = resolveScreen({\n next_action: result.next_action,\n next_operation: result.next_operation\n });\n this.setScreen(\"signin\", {\n notice: \"Account created. Sign in to continue.\",\n step: 0,\n password: \"\",\n needsMfaCode: next === \"signin_with_code\"\n });\n });\n return;\n }\n\n // signin\n if (this.password.length < 8) {\n this.attempts += 1;\n this.passError = \"Password must be at least 8 characters.\";\n this.banner = this.attempts >= 3 ? this.msg.rateLimitedMessage : \"\";\n return;\n }\n await this.withLoading(async () => {\n try {\n await client.signIn(\n {\n email: this.email,\n password: this.password,\n ...(this.needsMfaCode ? { code: this.codeValue } : {})\n },\n this.signal()\n );\n this.step = 0;\n } catch (error) {\n if (error instanceof SinglebaseAuthError && error.code === \"CODE_REQUIRED\") {\n this.needsMfaCode = true;\n await client.requestCode({ email: this.email, purpose: \"signin\" }, this.signal());\n this.notice = this.msg.codeSentNeutral;\n return;\n }\n if (error instanceof SinglebaseAuthError && error.code === \"INVALID_CREDENTIALS\") {\n this.attempts += 1;\n this.banner =\n this.attempts >= 3\n ? this.msg.rateLimitedMessage\n : \"That email and password do not match.\";\n return;\n }\n throw error;\n }\n });\n }\n\n private abortController: AbortController | null = null;\n private signal(): AbortSignal {\n this.abortController?.abort();\n this.abortController = new AbortController();\n return this.abortController.signal;\n }\n\n private onCodeInput(index: number, e: Event) {\n const input = e.target as HTMLInputElement;\n const entered = input.value.replace(/\\D/g, \"\");\n\n // Autofill of a `one-time-code` field arrives as the whole code in one\n // cell; spread it instead of keeping only the last digit.\n if (entered.length > 1) {\n this.fillCode(index, entered);\n return;\n }\n\n const digit = entered.slice(-1);\n const next = this.code.slice();\n next[index] = digit;\n this.code = next;\n this.banner = \"\";\n if (digit) {\n const inputs = this.renderRoot.querySelectorAll<HTMLInputElement>(\n \".code-row input, .code-row-sm input\"\n );\n inputs[index + 1]?.focus();\n }\n }\n\n private onCodePaste(index: number, e: ClipboardEvent) {\n const digits = (e.clipboardData?.getData(\"text\") ?? \"\").replace(/\\D/g, \"\");\n if (!digits) return;\n e.preventDefault();\n this.fillCode(index, digits);\n }\n\n private fillCode(index: number, digits: string) {\n const next = this.code.slice();\n for (let i = 0; i < digits.length && index + i < next.length; i += 1) {\n next[index + i] = digits[i]!;\n }\n this.code = next;\n this.banner = \"\";\n\n const landed = Math.min(index + digits.length, next.length - 1);\n void this.updateComplete.then(() => {\n const inputs = this.renderRoot.querySelectorAll<HTMLInputElement>(\n \".code-row input, .code-row-sm input\"\n );\n inputs[landed]?.focus();\n });\n }\n\n private async onResend() {\n const client = this.resolvedClient;\n if (!client || this.loading) return;\n const purpose = this.verifyNext === \"newpass\" ? \"password_reset\" : \"signin\";\n await this.withLoading(async () => {\n await client.requestCode({ email: this.email, purpose }, this.signal());\n this.notice = \"New code sent.\";\n this.code = [\"\", \"\", \"\", \"\", \"\", \"\"];\n });\n }\n\n private goBack() {\n if (this.step > 0 && [\"forgot\", \"verify\", \"otp\", \"newpass\"].indexOf(this.activeScreen) < 0) {\n this.step -= 1;\n this.banner = \"\";\n this.notice = \"\";\n return;\n }\n this.setScreen(\"signin\", { step: 0, notice: \"\", code: [\"\", \"\", \"\", \"\", \"\", \"\"] });\n }\n\n // ── copy helpers (mirror the mock's titles/subs/ctas maps) ──\n private titleFor(screen: GuestScreen): string {\n const m = this.msg;\n switch (screen) {\n case \"signup\":\n return m.signUpTitle;\n case \"forgot\":\n return m.forgotTitle;\n case \"verify\":\n return m.verifyTitle;\n case \"otp\":\n return m.otpTitle;\n case \"newpass\":\n return m.newPassTitle;\n case \"invite\":\n return m.inviteTitle;\n default:\n return this.signInTitle || m.signInTitle;\n }\n }\n\n private subFor(screen: GuestScreen): string {\n const m = this.msg;\n const c = this.cfg;\n switch (screen) {\n case \"signup\":\n return m.signUpSub;\n case \"forgot\":\n return m.forgotSub;\n case \"verify\":\n return `We sent a 6-digit code to ${this.email || \"your inbox\"}. It expires in 10 minutes.`;\n case \"otp\":\n return m.otpSub;\n case \"newpass\":\n return `Your code is confirmed. Set a new password for ${this.email || \"your account\"}.`;\n case \"invite\":\n return `${this.inviteOrg || \"Acme\"} invited you to join. Set up your account to continue.`;\n default:\n if (!c.allowEmailSignin && !c.allowEmailOtp) return m.signInSubOauthOnly;\n return c.allowOauth ? m.signInSubEmailAndOauth : m.signInSubEmailOnly;\n }\n }\n\n private ctaFor(screen: GuestScreen): string {\n const m = this.msg;\n if (\n this.stepped &&\n ((screen === \"signup\" && this.step < 2) || (screen === \"signin\" && this.step < 1))\n ) {\n return m.continueCta;\n }\n switch (screen) {\n case \"signup\":\n return m.signUpCta;\n case \"forgot\":\n return m.forgotCta;\n case \"verify\":\n return m.verifyCta;\n case \"otp\":\n return m.otpCta;\n case \"newpass\":\n return m.newPassCta;\n case \"invite\":\n return m.inviteCta;\n default:\n return m.signInCta;\n }\n }\n\n private stepPct(): number {\n if (!this.stepped) return 100;\n const total = this.activeScreen === \"signup\" ? 3 : 2;\n return Math.round(((this.step + 1) / total) * 100);\n }\n\n // ── render pieces ─────────────────────────────────────────\n private renderPrimary(label: string) {\n return html`\n <button type=\"submit\" class=\"primary\" part=\"button-primary\" ?disabled=${this.loading}>\n ${this.loading ? html`<span class=\"spinner\" part=\"spinner\"></span>` : nothing}\n <span>${label}</span>\n </button>\n `;\n }\n\n private renderEmailField(id: string) {\n return html`\n <div class=\"field\">\n <label for=${id}>${this.msg.emailLabel}</label>\n <input\n id=${id}\n type=\"email\"\n part=\"input\"\n .value=${this.email}\n placeholder=${this.msg.emailPlaceholder}\n aria-invalid=${this.emailError ? \"true\" : \"false\"}\n ?disabled=${this.loading}\n @input=${(e: Event) => {\n this.email = (e.target as HTMLInputElement).value;\n this.emailError = \"\";\n this.banner = \"\";\n }}\n />\n ${this.emailError ? html`<p class=\"err\">${this.emailError}</p>` : nothing}\n </div>\n `;\n }\n\n private renderPasswordField(id: string, showForgot: boolean) {\n return html`\n <div class=\"field\">\n <div class=\"label-row\">\n <label for=${id}>${this.msg.passwordLabel}</label>\n ${\n showForgot\n ? html`<button\n type=\"button\"\n class=\"link-sm\"\n @click=${() => this.setScreen(\"forgot\", { step: 0 })}\n >\n ${this.msg.forgotLink}\n </button>`\n : nothing\n }\n </div>\n <input\n id=${id}\n type=\"password\"\n part=\"input\"\n .value=${this.password}\n placeholder=${this.msg.passwordPlaceholder}\n aria-invalid=${this.passError ? \"true\" : \"false\"}\n ?disabled=${this.loading}\n @input=${(e: Event) => {\n this.password = (e.target as HTMLInputElement).value;\n this.passError = \"\";\n this.banner = \"\";\n }}\n />\n ${this.passError ? html`<p class=\"err\">${this.passError}</p>` : nothing}\n </div>\n `;\n }\n\n private renderCodeRow(small = false) {\n return html`\n <div class=${small ? \"code-row-sm\" : \"code-row\"} role=\"group\" aria-label=\"Verification code\">\n ${this.code.map(\n (digit, i) => html`\n <input\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"1\"\n part=\"code-box\"\n aria-label=${`Digit ${i + 1}`}\n autocomplete=${i === 0 ? \"one-time-code\" : \"off\"}\n .value=${digit}\n ?disabled=${this.loading}\n @input=${(e: Event) => this.onCodeInput(i, e)}\n @paste=${(e: ClipboardEvent) => this.onCodePaste(i, e)}\n />\n `\n )}\n </div>\n `;\n }\n\n /** The email/password method accordion body for signin, signup and otp. */\n private renderEmailMethodBody(screen: GuestScreen) {\n const c = this.cfg;\n const stepped = this.stepped;\n const showName = screen === \"signup\" && (!stepped || this.step === 0);\n const showEmail =\n (screen === \"signup\" && (!stepped || this.step === 1)) ||\n (screen === \"signin\" && (!stepped || this.step === 0)) ||\n screen === \"otp\";\n const showPassword =\n (screen === \"signup\" && (!stepped || this.step === 2)) ||\n (screen === \"signin\" && (!stepped || this.step === 1));\n const showOtpLink =\n screen === \"signin\" && c.allowEmailSignin && c.allowEmailOtp && (!stepped || this.step === 0);\n\n return html`\n ${\n showName\n ? html`\n <div class=\"field\">\n <label for=${this.uid(\"name\")}>${this.msg.fullNameLabel}</label>\n <input\n id=${this.uid(\"name\")}\n type=\"text\"\n part=\"input\"\n .value=${this.name}\n placeholder=${this.msg.fullNamePlaceholder}\n ?disabled=${this.loading}\n @input=${(e: Event) => (this.name = (e.target as HTMLInputElement).value)}\n />\n </div>\n `\n : nothing\n }\n ${showEmail ? this.renderEmailField(this.uid(\"email\")) : nothing}\n ${showPassword ? this.renderPasswordField(this.uid(\"pass\"), c.allowEmailSignin && screen === \"signin\") : nothing}\n ${\n this.needsMfaCode && screen === \"signin\"\n ? html`\n <div class=\"field\">\n <span class=\"label\">Verification code</span>\n ${this.renderCodeRow(true)}\n </div>\n `\n : nothing\n }\n ${this.renderPrimary(this.ctaFor(screen))}\n ${\n showOtpLink\n ? html`<button\n type=\"button\"\n class=\"edit-link\"\n @click=${() => this.setScreen(\"otp\", { step: 0 })}\n >\n ${this.msg.otpInsteadLink}\n </button>`\n : nothing\n }\n `;\n }\n\n private renderAccordion(screen: GuestScreen) {\n const c = this.cfg;\n const hasEmail =\n (screen === \"signin\" && c.allowEmailSignin) ||\n (screen === \"signup\" && c.allowEmailSignup) ||\n (screen === \"otp\" && c.allowEmailOtp);\n const hasOauth = c.allowOauth;\n if (!hasEmail && !hasOauth) return nothing;\n\n const showHeads = hasEmail && hasOauth;\n const method = !hasEmail ? \"oauth\" : !hasOauth ? \"email\" : this.method || \"email\";\n const emailOpen = method === \"email\";\n const oauthOpen = method === \"oauth\";\n\n const emailTitle =\n screen === \"signup\" ? this.msg.emailMethodTitleSignUp : this.msg.emailMethodTitle;\n const emailMeta =\n screen === \"otp\"\n ? this.msg.emailMethodMetaOtp\n : screen === \"signup\"\n ? this.msg.emailMethodMetaSignUp\n : this.msg.emailMethodMeta;\n\n const item = (\n open: boolean,\n title: string,\n meta: string,\n body: unknown,\n onToggle: () => void,\n key: string\n ) => html`\n <div class=\"acc-item ${open ? \"open\" : \"\"} ${showHeads ? \"\" : \"bare\"}\" part=\"acc-item\">\n ${\n showHeads\n ? html`\n <button\n type=\"button\"\n class=\"acc-head\"\n aria-expanded=${open ? \"true\" : \"false\"}\n aria-controls=${this.uid(`acc-${key}`)}\n @click=${onToggle}\n >\n <span class=\"chev\" aria-hidden=\"true\">›</span>\n <span class=\"acc-title\">${title}</span>\n <span class=\"acc-meta\">${meta}</span>\n </button>\n `\n : nothing\n }\n <div class=\"acc-body\" id=${this.uid(`acc-${key}`)}>\n <div class=\"acc-clip\">\n <div class=\"acc-inner\">${body}</div>\n </div>\n </div>\n </div>\n `;\n\n const emailItem = hasEmail\n ? item(\n emailOpen,\n emailTitle,\n emailMeta,\n this.renderEmailMethodBody(screen),\n () => (this.method = emailOpen ? \"\" : \"email\"),\n \"email\"\n )\n : nothing;\n\n const oauthItem = hasOauth\n ? item(\n oauthOpen,\n this.msg.oauthMethodTitle,\n this.msg.oauthMethodMeta,\n html`<singlebase-authui-buttons\n type=\"oauth\"\n embedded\n theme=${ifDefined(this.theme)}\n density=${ifDefined(this.density)}\n field-style=${ifDefined(this.fieldStyle)}\n .client=${this.resolvedClient}\n .messages=${this.messages}\n .settings=${this.settings ?? this.settingsCtl.settings}\n intent=${screen === \"signup\" ? \"signup\" : \"signin\"}\n ></singlebase-authui-buttons>`,\n () => (this.method = oauthOpen ? \"\" : \"oauth\"),\n \"oauth\"\n )\n : nothing;\n\n return html`\n <div class=\"acc-wrap\">\n ${this.oauthPlacement === \"top\" ? html`${oauthItem}${emailItem}` : html`${emailItem}${oauthItem}`}\n </div>\n `;\n }\n\n private renderScreenBody(screen: GuestScreen) {\n const c = this.cfg;\n const showMethods = [\"signin\", \"signup\", \"otp\"].indexOf(screen) >= 0;\n\n if (showMethods) return this.renderAccordion(screen);\n\n if (screen === \"forgot\") {\n return html`<div class=\"fields\">${this.renderEmailField(this.uid(\"reset\"))}</div>`;\n }\n\n if (screen === \"verify\") {\n return html`\n ${this.renderCodeRow()}\n <div class=\"resend-row\">\n <span class=\"hint\">${this.msg.resendQuestion}</span>\n <button type=\"button\" class=\"link-sm\" ?disabled=${this.loading} @click=${this.onResend}>\n ${this.msg.resendCta}\n </button>\n </div>\n `;\n }\n\n if (screen === \"newpass\") {\n return html`\n <div class=\"fields\">\n <div class=\"field\">\n <label for=${this.uid(\"newpass\")}>${this.msg.newPasswordLabel}</label>\n <input\n id=${this.uid(\"newpass\")}\n type=\"password\"\n part=\"input\"\n .value=${this.newPass}\n placeholder=${this.msg.newPasswordPlaceholder}\n aria-invalid=${this.newPassError ? \"true\" : \"false\"}\n ?disabled=${this.loading}\n @input=${(e: Event) => {\n this.newPass = (e.target as HTMLInputElement).value;\n this.newPassError = \"\";\n }}\n />\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"confirmpass\")}>${this.msg.confirmPasswordLabel}</label>\n <input\n id=${this.uid(\"confirmpass\")}\n type=\"password\"\n part=\"input\"\n .value=${this.confirmPass}\n placeholder=${this.msg.confirmPasswordPlaceholder}\n aria-invalid=${this.newPassError ? \"true\" : \"false\"}\n ?disabled=${this.loading}\n @input=${(e: Event) => {\n this.confirmPass = (e.target as HTMLInputElement).value;\n this.newPassError = \"\";\n }}\n />\n ${this.newPassError ? html`<p class=\"err\">${this.newPassError}</p>` : nothing}\n </div>\n </div>\n `;\n }\n\n if (screen === \"invite\") {\n return html`\n <div class=\"fields\">\n <div class=\"invite-box\">\n <span class=\"invite-label\">${this.msg.invitedEmailLabel}</span>\n <span class=\"invite-email\">${this.inviteEmail}</span>\n </div>\n ${\n this.inviteCode\n ? nothing\n : html`<div class=\"field\">\n <span class=\"label\">Invite code</span>\n ${this.renderCodeRow(true)}\n </div>`\n }\n <div class=\"two-up\">\n <div class=\"field\">\n <label for=${this.uid(\"first\")}>${this.msg.firstNameLabel}</label>\n <input\n id=${this.uid(\"first\")}\n type=\"text\"\n part=\"input\"\n .value=${this.firstName}\n placeholder=${this.msg.firstNamePlaceholder}\n ?disabled=${this.loading}\n @input=${(e: Event) => (this.firstName = (e.target as HTMLInputElement).value)}\n />\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"last\")}>${this.msg.lastNameLabel}</label>\n <input\n id=${this.uid(\"last\")}\n type=\"text\"\n part=\"input\"\n .value=${this.lastName}\n placeholder=${this.msg.lastNamePlaceholder}\n ?disabled=${this.loading}\n @input=${(e: Event) => (this.lastName = (e.target as HTMLInputElement).value)}\n />\n </div>\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"phone\")}>${this.msg.phoneLabel}</label>\n <input\n id=${this.uid(\"phone\")}\n type=\"tel\"\n part=\"input\"\n .value=${this.phone}\n placeholder=${this.msg.phonePlaceholder}\n ?disabled=${this.loading}\n @input=${(e: Event) => (this.phone = (e.target as HTMLInputElement).value)}\n />\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"invitepass\")}>${this.msg.passwordLabel}</label>\n <input\n id=${this.uid(\"invitepass\")}\n type=\"password\"\n part=\"input\"\n .value=${this.password}\n placeholder=${this.msg.newPasswordPlaceholder}\n aria-invalid=${this.passError ? \"true\" : \"false\"}\n ?disabled=${this.loading}\n @input=${(e: Event) => {\n this.password = (e.target as HTMLInputElement).value;\n this.passError = \"\";\n }}\n />\n ${this.passError ? html`<p class=\"err\">${this.passError}</p>` : nothing}\n </div>\n </div>\n `;\n }\n\n return nothing;\n }\n\n private renderGuest(screen: GuestScreen) {\n const c = this.cfg;\n const showPrimary = [\"forgot\", \"verify\", \"newpass\", \"invite\"].indexOf(screen) >= 0;\n const showBack =\n (this.stepped && this.step > 0) ||\n [\"forgot\", \"verify\", \"otp\", \"newpass\"].indexOf(screen) >= 0;\n const showFoot =\n (screen === \"signin\" && c.allowEmailSignup) || (screen === \"signup\" && c.allowEmailSignin);\n const showStepBar = this.stepped && (screen === \"signin\" || screen === \"signup\");\n\n return html`\n <form class=\"stack\" @submit=${this.onSubmit} novalidate>\n <div class=\"head\">\n ${this.layout !== \"split\" ? this.renderLogo() : nothing}\n <h2 class=\"title\" part=\"title\">${this.titleFor(screen)}</h2>\n <p class=\"sub\">${this.subFor(screen)}</p>\n </div>\n\n ${\n showStepBar\n ? html`<div class=\"step-bar\">\n <div class=\"step-fill\" style=\"width:${this.stepPct()}%\"></div>\n </div>`\n : nothing\n }\n ${this.banner ? html`<div class=\"banner\" part=\"banner\" role=\"alert\">${this.banner}</div>` : nothing}\n ${this.notice ? html`<div class=\"notice\" part=\"notice\" role=\"status\">${this.notice}</div>` : nothing}\n ${this.renderScreenBody(screen)}\n ${\n showPrimary || showBack\n ? html`\n <div class=\"actions\">\n ${showPrimary ? this.renderPrimary(this.ctaFor(screen)) : nothing}\n ${\n showBack\n ? html`<button type=\"button\" class=\"ghost\" @click=${this.goBack}>\n ${this.msg.backCta}\n </button>`\n : nothing\n }\n </div>\n `\n : nothing\n }\n ${\n showFoot\n ? html`\n <p class=\"foot\">\n <span\n >${screen === \"signup\" ? this.msg.footTextSignUp : this.msg.footTextSignIn}</span\n >\n <button\n type=\"button\"\n class=\"link\"\n @click=${() =>\n this.setScreen(screen === \"signup\" ? \"signin\" : \"signup\", {\n step: 0,\n notice: \"\"\n })}\n >\n ${screen === \"signup\" ? this.msg.footActionSignUp : this.msg.footActionSignIn}\n </button>\n </p>\n `\n : nothing\n }\n ${this.renderConsent()}\n\n <span class=\"sr-only\" role=\"status\" aria-live=\"polite\">\n ${this.loading ? \"Submitting…\" : \"\"}\n </span>\n </form>\n `;\n }\n\n private renderBlocked() {\n const c = this.cfg;\n const disabled = !c.authEnabled;\n return html`\n <div class=\"stack\">\n <div class=\"head\">\n ${this.layout !== \"split\" ? this.renderLogo() : nothing}\n <h2 class=\"title\" part=\"title\">\n ${disabled ? this.msg.blockedTitleDisabled : this.msg.blockedTitleUnavailable}\n </h2>\n <p class=\"sub\">\n ${disabled ? this.msg.blockedBodyDisabled : this.msg.blockedBodyUnavailable}\n </p>\n </div>\n <div class=\"notice\" part=\"notice\" role=\"status\">${this.msg.blockedHint}</div>\n </div>\n `;\n }\n\n /**\n * Shown when a signed-in visitor lands on a guest screen. Rather than\n * presenting a sign-in form to someone already signed in, offer the two\n * things they could actually want: carry on, or switch accounts.\n */\n private renderSignedIn() {\n const user = this.auth.state.status === \"authenticated\" ? this.auth.state.user : null;\n const target = this.redirectTarget;\n\n return html`\n <div class=\"stack\">\n <div class=\"head\">\n ${this.renderLogo()}\n <h2 class=\"title\" part=\"title\">${this.msg.alreadySignedInTitle}</h2>\n <p class=\"sub\">\n ${\n user?.email\n ? `${this.msg.alreadySignedInSubPrefix} ${user.email}.`\n : this.msg.alreadySignedInSub\n }\n </p>\n </div>\n\n <div class=\"actions\">\n <button type=\"button\" class=\"primary\" part=\"button-primary\" @click=${this.onContinue}>\n <span>${this.msg.continueCta}</span>\n </button>\n <button type=\"button\" class=\"ghost\" @click=${this.onInterstitialSignOut}>\n <span>${this.msg.signOutCta}</span>\n </button>\n </div>\n\n ${target ? nothing : html`<p class=\"hint\">${this.msg.continueHint}</p>`}\n </div>\n `;\n }\n\n private onContinue = () => {\n if (this.followRedirect()) return;\n // Nothing to redirect to: show the account view and let the host route\n // off the event if it wants to.\n this.dispatchEvent(\n new CustomEvent(\"singlebase-continue\", {\n detail: { user: this.getUser() },\n bubbles: true,\n composed: true\n })\n );\n this.goto(\"account\");\n };\n\n private onInterstitialSignOut = async () => {\n await this.resolvedClient?.logout();\n this.goto(\"signin\");\n };\n\n /** The Terms/Privacy consent line, rendered only when the host supplies a link. */\n private renderConsent() {\n if (!this.tosUrl && !this.privacyUrl) return nothing;\n const tos = this.tosUrl\n ? html`<a class=\"link-sm\" href=${this.tosUrl} target=\"_blank\" rel=\"noopener noreferrer\"\n >${this.msg.termsLabel}</a\n >`\n : nothing;\n const privacy = this.privacyUrl\n ? html`<a class=\"link-sm\" href=${this.privacyUrl} target=\"_blank\" rel=\"noopener noreferrer\"\n >${this.msg.privacyLabel}</a\n >`\n : nothing;\n\n return html`\n <p class=\"hint\" part=\"consent\">\n ${this.msg.consentPrefix}\n ${tos}${\n this.tosUrl && this.privacyUrl ? html` ${this.msg.consentJoin} ` : nothing\n }${privacy}.\n </p>\n `;\n }\n\n protected override render() {\n const screen = this.activeScreen;\n\n if (screen === \"oauth-callback\") {\n void this.handleOAuthCallback();\n return this.panel(this.renderOAuthCallback());\n }\n\n if (screen === \"account\") {\n // `no-account-view` is the SPA case: render nothing and let the host\n // route away on the signin event instead.\n if (this.noAccountView) return nothing;\n return this.panel(html`\n <singlebase-authui-account\n theme=${ifDefined(this.theme)}\n density=${ifDefined(this.density)}\n field-style=${ifDefined(this.fieldStyle)}\n .client=${this.resolvedClient}\n .messages=${this.messages}\n logo-text=${this.logoText}\n logo-url=${this.logoUrl}\n ></singlebase-authui-account>\n `);\n }\n\n if (this.showsSignedInInterstitial) {\n if (this.noAccountView) return nothing;\n return this.panel(this.renderSignedIn());\n }\n\n const c = this.cfg;\n const noMethods = !c.allowEmailSignin && !c.allowEmailOtp && !c.allowOauth;\n const blocked = !c.authEnabled || (noMethods && isGuestScreen(screen));\n\n return html`\n ${\n this.layout === \"split\"\n ? html`\n <div class=\"brand-panel\">\n ${this.renderBrandMark()}\n ${this.brandLine ? html`<div class=\"brand-copy\">${this.brandLine}</div>` : nothing}\n ${this.brandFoot ? html`<div class=\"brand-foot\">${this.brandFoot}</div>` : nothing}\n </div>\n `\n : nothing\n }\n ${this.panel(blocked ? this.renderBlocked() : this.renderGuest(screen as GuestScreen))}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"singlebase-authui\": SinglebaseAuthScreen;\n }\n}\n","import { html } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { matchesPredicate, validatePredicate, type Predicate } from \"@singlebase/core\";\nimport { SinglebaseElementBase } from \"./authui-base.js\";\n\nexport type GuardState = \"loading\" | \"authenticated\" | \"unauthenticated\";\n\nconst GUARD_STATES: GuardState[] = [\"loading\", \"authenticated\", \"unauthenticated\"];\n\n/**\n * Renders content conditionally on auth state, and optionally on a predicate\n * over the signed-in profile.\n *\n * Two shapes, because wrapping a single line of markup in a slotted <div> is\n * a lot of ceremony:\n *\n * <!-- long form: one guard, several states -->\n * <singlebase-authui-guard>\n * <div slot=\"loading\">Checking…</div>\n * <div slot=\"authenticated\">Welcome back</div>\n * <div slot=\"unauthenticated\"><singlebase-authui></singlebase-authui></div>\n * </singlebase-authui-guard>\n *\n * <!-- short form: the guard itself carries the state -->\n * <singlebase-authui-guard slot=\"loading\">Checking…</singlebase-authui-guard>\n *\n * With a predicate it also filters on the profile:\n *\n * <singlebase-authui-guard slot=\"authenticated\" predicate='{\"roles\":{\"$in\":[\"admin\"]}}'>\n * <admin-panel></admin-panel>\n * </singlebase-authui-guard>\n *\n * A predicate only ever narrows the *authenticated* state: a signed-out\n * visitor is unauthenticated whether or not a filter is present, so a guard\n * can never leak content by failing open.\n */\n@customElement(\"singlebase-authui-guard\")\nexport class SinglebaseAuthGuard extends SinglebaseElementBase {\n /**\n * Short form. When set, every child of this guard belongs to that state and\n * no per-child `slot` attributes are needed.\n *\n * Note this reuses the standard `slot` attribute name, which is inert here:\n * the guard is not itself inside another shadow root's slot, so the name is\n * free to mean \"the state these children belong to\".\n */\n @property({ reflect: true })\n accessor slot = \"\";\n\n /**\n * One-level, Mongo-style filter over the signed-in `user_profile`.\n * Dot notation reaches nested values; see core's predicate module for the\n * supported operators.\n */\n @property({\n converter: {\n fromAttribute: (value: string | null): Predicate | null => {\n if (!value) return null;\n try {\n return JSON.parse(value) as Predicate;\n } catch {\n console.error(\"[singlebase] guard predicate is not valid JSON:\", value);\n return null;\n }\n },\n toAttribute: (value: Predicate | null) => (value ? JSON.stringify(value) : null)\n }\n })\n accessor predicate: Predicate | null = null;\n\n /**\n * What to show when the user is signed in but the predicate does not match.\n * Defaults to \"unauthenticated\" so a filtered guard degrades to the\n * signed-out branch; set \"hidden\" to render nothing at all.\n */\n @property({ attribute: \"on-mismatch\" })\n accessor onMismatch: \"unauthenticated\" | \"hidden\" = \"unauthenticated\";\n\n private warnedFor: string | null = null;\n\n protected override createRenderRoot() {\n // Light DOM: the host's own markup stays the host's, and the hidden\n // toggling below applies to real light-DOM children.\n return this;\n }\n\n /** The state this guard currently resolves to, after applying the predicate. */\n get activeState(): GuardState | \"hidden\" {\n const status = this.auth.state.status;\n\n if (status === \"loading\") return \"loading\";\n if (status !== \"authenticated\") return \"unauthenticated\";\n\n if (!this.predicate) return \"authenticated\";\n\n this.warnOnce(this.predicate);\n const user = this.auth.state.user;\n if (matchesPredicate(user, this.predicate)) return \"authenticated\";\n return this.onMismatch === \"hidden\" ? \"hidden\" : \"unauthenticated\";\n }\n\n /** Surfaces a malformed predicate once, rather than silently never matching. */\n private warnOnce(predicate: Predicate) {\n const key = JSON.stringify(predicate);\n if (this.warnedFor === key) return;\n this.warnedFor = key;\n for (const problem of validatePredicate(predicate)) {\n console.warn(`[singlebase] <singlebase-authui-guard> predicate: ${problem}`);\n }\n }\n\n override render() {\n const active = this.activeState;\n\n if (this.slot) {\n // Short form: the whole guard is shown or hidden as one unit.\n const show = GUARD_STATES.includes(this.slot as GuardState) && this.slot === active;\n this.toggleAttribute(\"hidden\", !show);\n return html`<slot></slot>`;\n }\n\n this.toggleAttribute(\"hidden\", false);\n for (const child of Array.from(this.children)) {\n const childSlot = child.getAttribute(\"slot\");\n child.toggleAttribute(\"hidden\", childSlot !== active);\n }\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"singlebase-authui-guard\": SinglebaseAuthGuard;\n }\n}\n","import { css, html, nothing, type PropertyValues } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { getPath } from \"@singlebase/core\";\nimport { SinglebaseElementBase } from \"./authui-base.js\";\nimport { initialsOf } from \"../utils/profile.js\";\n\n/** Where the avatar looks for its image when no path is given. */\nconst DEFAULT_AVATAR_PATH = \"profile_photo\";\n\n/**\n * Displays one value from the signed-in profile, as text or as an avatar.\n *\n * Hello <singlebase-authui-display path=\"first_name\" fallback=\"there\"></singlebase-authui-display>\n * <singlebase-authui-display avatar></singlebase-authui-display>\n *\n * Three rules shape the behaviour:\n *\n * - While auth state is still loading it renders nothing. Showing the\n * fallback first would mean every signed-in visitor watches \"Hello there\"\n * flip to \"Hello Ada\" on each page load.\n * - Values resolve against `user_profile` and nothing else. The element\n * deliberately cannot reach session or token data, which must never be\n * written into the DOM.\n * - Values are rendered as text, never as markup. Fields like first_name are\n * supplied by the user at signup, so they are untrusted by definition.\n */\n@customElement(\"singlebase-authui-display\")\nexport class SinglebaseAuthDisplay extends SinglebaseElementBase {\n static override styles = [\n ...SinglebaseElementBase.styles,\n css`\n /* Text sits in a sentence; an avatar is a box the host sizes. */\n :host {\n display: inline;\n }\n\n :host([avatar]) {\n display: inline-block;\n width: 42px;\n height: 42px;\n vertical-align: middle;\n }\n\n img,\n .initials {\n display: block;\n width: 100%;\n height: 100%;\n border-radius: inherit;\n box-sizing: border-box;\n }\n\n img {\n object-fit: cover;\n }\n\n /* Matches the avatar in the account view. */\n .initials {\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--sb-surface-alt, #fafafa);\n border: 1px dashed var(--sb-border, #e4e6e9);\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 0.8em;\n color: var(--sb-muted-ink, #61666c);\n user-select: none;\n }\n `\n ];\n\n /**\n * Dot-notated path into the profile: \"first_name\", \"metadata.tier\". In\n * avatar mode it names the image field and defaults to \"profile_photo\".\n */\n @property() accessor path = \"\";\n\n /** Shown when signed out, or when the value is empty. Text mode only. */\n @property() accessor fallback = \"\";\n\n /** Render an image with an initials fallback instead of text. */\n @property({ type: Boolean, reflect: true }) accessor avatar = false;\n\n /**\n * Alternative text for the avatar image. Left empty the image is treated as\n * decorative, which is right when a name sits beside it — pass a value only\n * when the avatar is the sole identifier.\n */\n @property() accessor alt = \"\";\n\n /** Set when the image 404s, so a dead URL falls back to initials. */\n @state() private accessor imageFailed = false;\n\n override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n // A new source deserves a fresh attempt.\n if (changed.has(\"path\") || changed.has(\"avatar\")) this.imageFailed = false;\n }\n\n private get profile() {\n const state = this.auth.state;\n return state.status === \"authenticated\" ? state.user : null;\n }\n\n /** The resolved value as a string, or \"\" when there is nothing to show. */\n private get textValue(): string {\n const profile = this.profile;\n if (!profile || !this.path) return \"\";\n\n const value = getPath(profile, this.path);\n if (value === null || value === undefined || value === \"\") return \"\";\n if (Array.isArray(value)) return value.filter((v) => v != null).join(\", \");\n // An object would stringify to \"[object Object]\"; treat it as absent.\n if (typeof value === \"object\") return \"\";\n return String(value);\n }\n\n private get avatarSrc(): string {\n const profile = this.profile;\n if (!profile) return \"\";\n const value = getPath(profile, this.path || DEFAULT_AVATAR_PATH);\n return typeof value === \"string\" ? value : \"\";\n }\n\n protected override render() {\n // Nothing at all until the session has been read — see the class comment.\n if (this.auth.state.status === \"loading\") return nothing;\n\n if (this.avatar) return this.renderAvatar();\n\n const value = this.textValue;\n if (value) return html`<span part=\"text\">${value}</span>`;\n return this.fallback ? html`<span part=\"text\">${this.fallback}</span>` : nothing;\n }\n\n private renderAvatar() {\n const profile = this.profile;\n if (!profile) return nothing;\n\n const src = this.avatarSrc;\n if (src && !this.imageFailed) {\n return html`<img\n part=\"avatar-image\"\n src=${src}\n alt=${this.alt}\n @error=${() => (this.imageFailed = true)}\n />`;\n }\n\n return html`<span\n part=\"avatar-initials\"\n class=\"initials\"\n aria-hidden=${this.alt ? \"false\" : \"true\"}\n >${initialsOf(profile)}</span\n >`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"singlebase-authui-display\": SinglebaseAuthDisplay;\n }\n}\n"],"names":["AuthController","host","__publicField","client","_a","state","defaultMessages","resolveMessages","overrides","SinglebaseElementBase","LitElement","__privateAdd","_client","_messages","_theme","_density","_fieldStyle","_radius","__privateGet","_","__privateSet","getDefaultClient","shared","config","key","AUTHUI_PROP_KEYS","value","authUIAttributeFor","name","changed","tokenDefaults","sharedStyles","__decorateClass","property","SettingsController","override","pending","settings","error","BRIDGED_EVENTS","SPEC_ALIASES","callbackPropFor","event","__","c","EventBridge","detail","callback","init","alias","off","SinglebaseFormBase","_phase","_formError","_noticeMessage","task","SinglebaseAuthError","hint","mapErrorToHint","html","fullNameOf","user","initialsOf","word","email","PHOTO_OPTIONS","PHOTO_ACCEPT","SinglebaseAccountScreen","_logoText","_logoUrl","_settings","_nonceStorageKey","_editMode","_toast","_photoBusy","_photoFailed","_profileSaved","_passSaved","_profileError","_newPassError","_deleteStage","_confirmText","_dFirst","_dLast","_dPhone","_dEmail","_emailStep","_dNewEmail","_emailCode","_emailError","_emailSaved","_curPass","_newPass","_confirmPass","completed","failed","k","message","nothing","createFilesUploadApi","u","reading","locked","e","providerId","nonce","oauth_redirect_url","s","marks","p","id","photo","summary","label","providers","customElement","SinglebaseAuthButtons","_type","_intent","_provider","_providerName","_embedded","intent","linking","idToken","refreshToken","primary","rest","GUEST_SCREENS","PROTECTED_SCREENS","ALL_SCREENS","isGuestScreen","isProtectedScreen","isScreen","flagAttr","SinglebaseAuthScreen","_initialScreen","_screen","_noAccountView","_authEnabled","_allowEmailSignin","_allowEmailSignup","_allowEmailOtp","_allowOauth","_allowAccountCreation","_layout","_oauthPlacement","_stepped","_brandLine","_brandFoot","_signInTitle","_branding","_redirectUrl","_tosUrl","_privacyUrl","_inviteEmail","_inviteOrg","_inviteCode","_step","_method","_email","_password","_name","_firstName","_lastName","_phone","_code","_verifyNext","_loading","_banner","_notice","_passError","_attempts","_needsMfaCode","_callbackDone","_b","offGoto","screen","offSignin","a","mfa","raw","authenticated","requested","resolveRedirectTarget","reason","params","target","here","url","accessCode","denied","renderBranding","content","patch","purpose","code","first","result","next","resolveScreen","index","entered","digit","digits","i","landed","m","total","showForgot","small","stepped","showName","showEmail","showPassword","showOtpLink","hasEmail","hasOauth","showHeads","method","emailOpen","oauthOpen","emailTitle","emailMeta","item","open","title","meta","body","onToggle","emailItem","oauthItem","ifDefined","showPrimary","showBack","showFoot","showStepBar","disabled","tos","privacy","noMethods","blocked","brandingStyles","css","GUARD_STATES","SinglebaseAuthGuard","_slot","_predicate","_onMismatch","status","matchesPredicate","predicate","problem","validatePredicate","active","show","child","childSlot","DEFAULT_AVATAR_PATH","SinglebaseAuthDisplay","_path","_fallback","_avatar","_alt","_imageFailed","profile","getPath","v","src"],"mappings":"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"}
|