@luminaryworks/auth-react 0.5.0 → 0.7.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/index.css +227 -4
- package/dist/index.css.map +1 -1
- package/dist/index.d.ts +119 -2
- package/dist/index.js +727 -18
- package/dist/index.js.map +1 -1
- package/dist/style.css +227 -4
- package/dist/style.css.map +1 -1
- package/package.json +4 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/hosted-oidc-experience-adapter.ts","../src/login-experience-adapter.ts","../src/register-policy.ts","../src/logto-experience-adapter.ts","../src/oidc-client.ts","../src/experience-client.ts","../src/auth-gate.ts","../src/LuminaryAuthProvider.tsx","../src/HeadlessLoginPanel.module.scss","../src/HeadlessLoginPanel.tsx","../src/ReauthOverlay.tsx","../src/AuthGateProvider.tsx","../src/post-login-path.ts"],"names":["WebStorageStateStore","UserManager","OidcClient","createContext","useMemo","useState","useCallback","useEffect","jsx","useContext","panel","brand","logo","product","title","subtitle","form","channelTabs","channelTab","channelTabActive","codeRow","codeInput","secondaryBtn","socialStack","input","passwordField","passwordInput","passwordToggle","primaryBtn","socialBtn","socialLogo","logoFallback","cancelBtn","divider","dividerLine","dividerText","hint","domainsHint","switchMode","switchModeBtn","error","footer","result","jsxs","Fragment","useSyncExternalStore","storageKey"],"mappings":"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","file":"index.js","sourcesContent":["export interface LuminaryIdpConfig {\n /**\n * OIDC issuer. Prefer Auth Gateway (`http://localhost:3010/oidc`) so products\n * stay IdP-agnostic; direct Logto issuer is OK for local MVP.\n */\n issuer: string;\n clientId: string;\n redirectUri: string;\n /**\n * Popup OIDC callback. Defaults to `redirectUri` (same `/auth/callback`).\n * Must be registered on the IdP application.\n */\n popupRedirectUri?: string;\n postLogoutRedirectUri?: string;\n scopes?: string;\n /** API resource indicator (access token `aud`) */\n audience?: string;\n /** localStorage key for access token */\n tokenStorageKey?: string;\n /**\n * Logto Experience API base (no trailing slash), e.g. Auth Gateway\n * `http://localhost:3010` or direct Logto `http://localhost:3001`.\n * When set, Headless password sign-in is attempted before OIDC popup fallback.\n */\n experienceApiBase?: string;\n /**\n * IAM catalog id: `logto` (default Headless), `oidc` / `zitadel` (Hosted Redirect).\n * Ignored when `HeadlessLoginPanel` receives an explicit `experienceAdapter`.\n */\n iamProvider?: string;\n}\n\nexport interface LuminaryAuthSession {\n accessToken: string;\n idToken?: string;\n expiresAt?: number;\n profile?: Record<string, unknown>;\n}\n\nexport function isIdpConfigured(config: Partial<LuminaryIdpConfig>): config is LuminaryIdpConfig {\n return Boolean(config.issuer && config.clientId && config.redirectUri);\n}\n\n/** Resolve issuer from Auth Gateway base URL or direct IDP_ISSUER. */\nexport function resolveIssuer(env: Record<string, string | undefined>): string | undefined {\n // Prefer explicit IdP issuer so JWT `iss` validation matches Logto.\n // Auth Gateway is a CORS/proxy front — set via VITE_AUTH_EXPERIENCE_URL / VITE_AUTH_GATEWAY_URL.\n const explicit = env.VITE_IDP_ISSUER ?? env.PUBLIC_IDP_ISSUER ?? env.IDP_ISSUER;\n if (explicit) return explicit;\n const gateway = env.VITE_AUTH_GATEWAY_URL ?? env.PUBLIC_AUTH_GATEWAY_URL ?? env.AUTH_GATEWAY_URL;\n if (gateway) return `${gateway.replace(/\\/$/, \"\")}/oidc`;\n return undefined;\n}\n\n/** Derive Experience API host from Gateway URL or by stripping `/oidc` from issuer. */\nexport function resolveExperienceApiBase(env: Record<string, string | undefined>): string | undefined {\n const explicit =\n env.VITE_AUTH_EXPERIENCE_URL ??\n env.PUBLIC_AUTH_EXPERIENCE_URL ??\n env.AUTH_EXPERIENCE_URL;\n if (explicit) return explicit.replace(/\\/$/, \"\");\n\n const gateway = env.VITE_AUTH_GATEWAY_URL ?? env.PUBLIC_AUTH_GATEWAY_URL ?? env.AUTH_GATEWAY_URL;\n if (gateway) return gateway.replace(/\\/$/, \"\");\n\n const issuer = resolveIssuer(env);\n if (!issuer) return undefined;\n return issuer.replace(/\\/$/, \"\").replace(/\\/oidc$/i, \"\");\n}\n\nexport function readIdpConfigFromEnv(env: Record<string, string | undefined>): Partial<LuminaryIdpConfig> {\n const redirectUri = env.VITE_IDP_REDIRECT_URI ?? env.PUBLIC_IDP_REDIRECT_URI ?? \"\";\n return {\n issuer: resolveIssuer(env),\n clientId: env.VITE_IDP_CLIENT_ID ?? env.PUBLIC_IDP_CLIENT_ID,\n redirectUri,\n popupRedirectUri: env.VITE_IDP_POPUP_REDIRECT_URI ?? env.PUBLIC_IDP_POPUP_REDIRECT_URI ?? redirectUri,\n postLogoutRedirectUri: env.VITE_IDP_POST_LOGOUT_URI ?? env.PUBLIC_IDP_POST_LOGOUT_URI,\n scopes: env.VITE_IDP_SCOPES ?? env.PUBLIC_IDP_SCOPES ?? \"openid profile email offline_access\",\n audience: env.VITE_IDP_AUDIENCE ?? env.PUBLIC_IDP_AUDIENCE,\n tokenStorageKey: env.VITE_IDP_TOKEN_KEY ?? \"luminary_access_token\",\n experienceApiBase: resolveExperienceApiBase(env),\n iamProvider:\n env.VITE_IAM_PROVIDER ?? env.PUBLIC_IAM_PROVIDER ?? env.IAM_PROVIDER ?? env.IDP_MODE,\n };\n}\n","import type { LoginExperienceAdapter, LoginExperienceCapability } from \"./login-experience-adapter\";\n\n/**\n * Standard OIDC Hosted Redirect adapter.\n *\n * Used for enterprise OIDC and reserved IAM plugins (ZITADEL) that have no\n * shipped Headless Experience API. Password and social stay on the IdP hosted UI.\n */\nexport class HostedOidcExperienceAdapter implements LoginExperienceAdapter {\n readonly capabilities: readonly LoginExperienceCapability[] = [];\n\n constructor(readonly provider = \"hosted\") {}\n}\n","import { HostedOidcExperienceAdapter } from \"./hosted-oidc-experience-adapter\";\nimport { LogtoExperienceAdapter } from \"./logto-experience-adapter\";\n\n/**\n * Capabilities exposed by a headless login-experience provider.\n *\n * Consumers can use these flags to avoid assuming that every provider supports\n * Logto's password, connector-discovery, or direct social-login flows.\n */\nexport const LOGIN_EXPERIENCE_CAPABILITIES = {\n passwordSignIn: \"password-sign-in\",\n /** Username + password self-register via Experience (Logto NewPasswordIdentity). */\n passwordSignUp: \"password-sign-up\",\n /** Email + verification code + password self-register. */\n emailCodeSignUp: \"email-code-sign-up\",\n socialConnectors: \"social-connectors\",\n socialDirectSignIn: \"social-direct-sign-in\",\n} as const;\n\nexport type LoginExperienceCapability =\n (typeof LOGIN_EXPERIENCE_CAPABILITIES)[keyof typeof LOGIN_EXPERIENCE_CAPABILITIES];\n\nexport type ExperienceIdentifierType = \"email\" | \"username\" | \"phone\";\n\nexport interface ExperiencePasswordSignInInput {\n /** Experience API origin (no trailing slash). Prefer SPA origin when proxied. */\n apiBase: string;\n identifier: string;\n password: string;\n identifierType?: ExperienceIdentifierType;\n /** Required to bootstrap the OIDC interaction cookie before Experience calls. */\n issuer?: string;\n clientId?: string;\n redirectUri?: string;\n audience?: string;\n scopes?: string;\n /** Carried in OIDC state for post-login return (UserManager PKCE). */\n returnUrl?: string;\n}\n\nexport interface ExperiencePasswordSignInResult {\n /** Continue URL from Experience submit (complete OIDC interaction). */\n redirectTo?: string;\n raw?: unknown;\n}\n\n/** Same OIDC bootstrap fields as sign-in; username must match Logto username rules. */\nexport type ExperiencePasswordSignUpInput = ExperiencePasswordSignInInput & {\n /** Optional CAPTCHA token for Logto bot protection (Turnstile / reCAPTCHA). */\n captchaToken?: string;\n};\n\nexport type ExperiencePasswordSignUpResult = ExperiencePasswordSignInResult;\n\nexport interface ExperienceEmailSignUpSendCodeInput {\n apiBase: string;\n email: string;\n /** @deprecated alias of email */\n identifier?: string;\n captchaToken?: string;\n issuer?: string;\n clientId?: string;\n redirectUri?: string;\n audience?: string;\n scopes?: string;\n returnUrl?: string;\n}\n\nexport interface ExperienceEmailSignUpSendCodeResult {\n verificationId: string;\n}\n\nexport interface ExperienceEmailSignUpCompleteInput {\n apiBase: string;\n email: string;\n password: string;\n code: string;\n verificationId: string;\n identifier?: string;\n captchaToken?: string;\n issuer?: string;\n clientId?: string;\n redirectUri?: string;\n audience?: string;\n scopes?: string;\n returnUrl?: string;\n}\n\nexport interface ExperienceSocialConnector {\n id: string;\n target: string;\n name: string;\n logo?: string;\n}\n\nexport interface FetchSocialConnectorsInput {\n /** Same origin as Experience / IdP (e.g. SPA proxy or http://localhost:3001). */\n apiBase: string;\n appId?: string;\n}\n\nexport interface SocialSignInRequest {\n /** Provider-specific authorize parameters, passed through by the OIDC client. */\n extraQueryParams?: Record<string, string>;\n}\n\n/**\n * Provider boundary for non-standard login-experience APIs.\n *\n * Standard OIDC redirect/popup and PKCE handling intentionally remain in the\n * OIDC client. Only provider-specific Experience operations belong here.\n */\nexport interface LoginExperienceAdapter {\n readonly provider: string;\n readonly capabilities: readonly LoginExperienceCapability[];\n experiencePasswordSignIn?(\n input: ExperiencePasswordSignInInput,\n ): Promise<ExperiencePasswordSignInResult>;\n /**\n * Self-register with username + password (Logto Register + NewPasswordIdentity).\n * Email/phone sign-up needs verification codes — not covered by this method.\n */\n experiencePasswordSignUp?(\n input: ExperiencePasswordSignUpInput,\n ): Promise<ExperiencePasswordSignUpResult>;\n sendRegisterEmailCode?(\n input: ExperienceEmailSignUpSendCodeInput,\n ): Promise<ExperienceEmailSignUpSendCodeResult>;\n experienceEmailPasswordSignUp?(\n input: ExperienceEmailSignUpCompleteInput,\n ): Promise<ExperiencePasswordSignUpResult>;\n fetchSocialConnectors?(\n input: FetchSocialConnectorsInput,\n ): Promise<ExperienceSocialConnector[]>;\n createSocialSignInRequest?(target: string): SocialSignInRequest;\n}\n\nexport type LoginExperienceProvider = \"logto\" | \"hosted\" | \"oidc\" | \"zitadel\" | (string & {});\n\nconst HOSTED_LOGIN_PROVIDERS = new Set([\"hosted\", \"oidc\", \"external_oidc\", \"zitadel\"]);\n\nfunction normalizeLoginExperienceProvider(provider: string): \"logto\" | \"hosted\" {\n const key = provider.trim().toLowerCase();\n if (!key || key === \"logto\") return \"logto\";\n if (HOSTED_LOGIN_PROVIDERS.has(key)) return \"hosted\";\n throw new Error(\n `Unknown login experience provider \"${provider}\". Shipped: logto (default). Hosted OIDC: oidc / hosted / zitadel.`,\n );\n}\n\n/**\n * Factory for built-in login adapters.\n *\n * - `logto`: Experience API Headless (password + social connectors)\n * - `hosted` / `oidc` / `zitadel`: standard OIDC Hosted Redirect (no empty vendor SDK)\n *\n * Products may still pass a custom `LoginExperienceAdapter`. Do not add stub\n * adapters for unintegrated Headless APIs.\n */\nexport function createLoginExperienceAdapter(\n provider: LoginExperienceProvider = \"logto\",\n): LoginExperienceAdapter {\n const kind = normalizeLoginExperienceProvider(provider);\n if (kind === \"logto\") return new LogtoExperienceAdapter();\n return new HostedOidcExperienceAdapter(provider.trim().toLowerCase() || \"hosted\");\n}\n\nconst adapterCache = new Map<string, LoginExperienceAdapter>();\n\n/**\n * Resolve an explicit product adapter, or the catalog adapter for `iamProvider`.\n * Defaults to Logto for backward compatibility.\n */\nexport function resolveLoginExperienceAdapter(\n adapter?: LoginExperienceAdapter | null,\n iamProvider?: string | null,\n): LoginExperienceAdapter {\n if (adapter) return adapter;\n const key = iamProvider?.trim() || \"logto\";\n const cached = adapterCache.get(key);\n if (cached) return cached;\n const created = createLoginExperienceAdapter(key);\n adapterCache.set(key, created);\n return created;\n}\n\n/** `VITE_IAM_PROVIDER` / `IAM_PROVIDER` / older `IDP_MODE`. */\nexport function resolveLoginExperienceProviderFromEnv(\n env: Record<string, string | undefined> = {},\n): LoginExperienceProvider {\n return env.VITE_IAM_PROVIDER ?? env.PUBLIC_IAM_PROVIDER ?? env.IAM_PROVIDER ?? env.IDP_MODE ?? \"logto\";\n}\n","/**\n * Self-register email policy for early ToC / hosted SaaS.\n *\n * Why allowlist: disposable / game / temporary mailboxes drive bot farms and\n * verification-email cost. Early stage: only well-known consumer providers.\n * Enterprise / private: set mode `off` or extend allowlist with corporate domains.\n */\n\n/** Popular consumer inboxes (CN + global). Lowercase host only. */\nexport const DEFAULT_REGISTER_EMAIL_ALLOWLIST: readonly string[] = [\n // Google\n \"gmail.com\",\n \"googlemail.com\",\n // Tencent / QQ\n \"qq.com\",\n \"foxmail.com\",\n // NetEase\n \"163.com\",\n \"126.com\",\n \"yeah.net\",\n // Microsoft\n \"outlook.com\",\n \"hotmail.com\",\n \"live.com\",\n \"msn.com\",\n // Apple\n \"icloud.com\",\n \"me.com\",\n \"mac.com\",\n // Yahoo\n \"yahoo.com\",\n \"yahoo.co.jp\",\n // Proton\n \"proton.me\",\n \"protonmail.com\",\n // Others commonly used by real users\n \"sina.com\",\n \"sina.cn\",\n \"aliyun.com\",\n \"139.com\",\n];\n\n/** Common disposable / throwaway hosts (used when mode is blocklist or as extra deny). */\nexport const DEFAULT_DISPOSABLE_EMAIL_BLOCKLIST: readonly string[] = [\n \"mailinator.com\",\n \"guerrillamail.com\",\n \"guerrillamail.net\",\n \"10minutemail.com\",\n \"tempmail.com\",\n \"temp-mail.org\",\n \"yopmail.com\",\n \"trashmail.com\",\n \"sharklasers.com\",\n \"getnada.com\",\n \"maildrop.cc\",\n \"discard.email\",\n \"mailnesia.com\",\n];\n\nexport type RegisterEmailMode = \"allowlist\" | \"blocklist\" | \"off\";\n\nexport interface RegisterEmailPolicy {\n mode: RegisterEmailMode;\n allowlist: readonly string[];\n blocklist: readonly string[];\n}\n\nexport interface RegisterEmailPolicyInput {\n mode?: string | null;\n allowlist?: string | readonly string[] | null;\n blocklist?: string | readonly string[] | null;\n}\n\nfunction parseList(raw: string | readonly string[] | null | undefined): string[] {\n if (!raw) return [];\n const parts = Array.isArray(raw) ? raw : String(raw).split(/[\\s,;]+/);\n return [\n ...new Set(\n parts\n .map((s) => s.trim().toLowerCase().replace(/^@/, \"\"))\n .filter(Boolean),\n ),\n ];\n}\n\nexport function normalizeRegisterEmailMode(raw: string | null | undefined): RegisterEmailMode {\n const key = (raw || \"allowlist\").trim().toLowerCase();\n if (key === \"off\" || key === \"false\" || key === \"0\" || key === \"disabled\") return \"off\";\n if (key === \"blocklist\" || key === \"deny\" || key === \"blacklist\") return \"blocklist\";\n return \"allowlist\";\n}\n\nexport function resolveRegisterEmailPolicy(input: RegisterEmailPolicyInput = {}): RegisterEmailPolicy {\n const mode = normalizeRegisterEmailMode(input.mode);\n const allowlist = parseList(input.allowlist);\n const blocklist = parseList(input.blocklist);\n return {\n mode,\n allowlist: allowlist.length ? allowlist : DEFAULT_REGISTER_EMAIL_ALLOWLIST,\n blocklist: blocklist.length ? blocklist : DEFAULT_DISPOSABLE_EMAIL_BLOCKLIST,\n };\n}\n\n/** Read VITE_/PUBLIC_/AUTH_REGISTER_* from a static env map (bundler-safe). */\nexport function readRegisterEmailPolicyFromEnv(\n env: Record<string, string | undefined> = {},\n): RegisterEmailPolicy {\n return resolveRegisterEmailPolicy({\n mode:\n env.VITE_AUTH_REGISTER_EMAIL_MODE ||\n env.PUBLIC_AUTH_REGISTER_EMAIL_MODE ||\n env.NEXT_PUBLIC_AUTH_REGISTER_EMAIL_MODE ||\n env.AUTH_REGISTER_EMAIL_MODE,\n allowlist:\n env.VITE_AUTH_REGISTER_EMAIL_ALLOWLIST ||\n env.PUBLIC_AUTH_REGISTER_EMAIL_ALLOWLIST ||\n env.NEXT_PUBLIC_AUTH_REGISTER_EMAIL_ALLOWLIST ||\n env.AUTH_REGISTER_EMAIL_ALLOWLIST,\n blocklist:\n env.VITE_AUTH_REGISTER_EMAIL_BLOCKLIST ||\n env.PUBLIC_AUTH_REGISTER_EMAIL_BLOCKLIST ||\n env.NEXT_PUBLIC_AUTH_REGISTER_EMAIL_BLOCKLIST ||\n env.AUTH_REGISTER_EMAIL_BLOCKLIST,\n });\n}\n\nexport function emailDomain(email: string): string | null {\n const trimmed = email.trim().toLowerCase();\n const at = trimmed.lastIndexOf(\"@\");\n if (at <= 0 || at === trimmed.length - 1) return null;\n if (trimmed.includes(\" \") || trimmed.indexOf(\"@\") !== at) return null;\n return trimmed.slice(at + 1);\n}\n\nexport function isValidEmailShape(email: string): boolean {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email.trim());\n}\n\nexport type RegisterEmailDecision =\n | { ok: true; domain: string }\n | { ok: false; reason: \"invalid\" | \"not_allowed\" | \"disposable\"; domain?: string };\n\n/**\n * Enforce register email policy. `off` still rejects disposable hosts when\n * `blocklist` is non-empty (defense in depth); pass `blocklist: []` to disable.\n */\nexport function evaluateRegisterEmail(\n email: string,\n policy: RegisterEmailPolicy = resolveRegisterEmailPolicy(),\n): RegisterEmailDecision {\n if (!isValidEmailShape(email)) return { ok: false, reason: \"invalid\" };\n const domain = emailDomain(email);\n if (!domain) return { ok: false, reason: \"invalid\" };\n\n if (policy.blocklist.includes(domain)) {\n return { ok: false, reason: \"disposable\", domain };\n }\n\n if (policy.mode === \"off\") return { ok: true, domain };\n\n if (policy.mode === \"blocklist\") return { ok: true, domain };\n\n if (!policy.allowlist.includes(domain)) {\n return { ok: false, reason: \"not_allowed\", domain };\n }\n return { ok: true, domain };\n}\n\nexport function registerEmailRejectionMessage(decision: RegisterEmailDecision): string {\n if (decision.ok) return \"\";\n if (decision.reason === \"invalid\") return \"Enter a valid email address\";\n if (decision.reason === \"disposable\") {\n return \"Temporary or disposable email addresses are not allowed\";\n }\n return \"This email provider is not accepted for self-registration. Use Gmail, Outlook, QQ, 163, iCloud, or another allowed provider — or sign in with Google / GitHub.\";\n}\n\n/**\n * Human-readable domain list for the register form (allowlist mode only).\n * Returns null when domains are not restricted to an allowlist.\n */\nexport function formatAllowedEmailDomains(\n policy: RegisterEmailPolicy,\n options?: { max?: number },\n): string | null {\n if (policy.mode !== \"allowlist\") return null;\n const list = [...policy.allowlist].map((d) => d.toLowerCase()).filter(Boolean);\n if (!list.length) return null;\n const max = options?.max ?? 16;\n const shown = list.slice(0, max);\n const rest = list.length - shown.length;\n const body = shown.join(\", \");\n return rest > 0 ? `${body}, +${rest} more` : body;\n}\n\n/** Short policy note under the email field on the register form. */\nexport function registerEmailDomainsHint(\n policy: RegisterEmailPolicy,\n labels?: {\n allowedDomainsPrefix?: string;\n allowedDomainsOpen?: string;\n allowedDomainsBlocklist?: string;\n },\n): string | null {\n const prefix = labels?.allowedDomainsPrefix ?? \"Allowed email domains\";\n const formatted = formatAllowedEmailDomains(policy);\n if (formatted) return `${prefix}: ${formatted}`;\n if (policy.mode === \"blocklist\") {\n return (\n labels?.allowedDomainsBlocklist ??\n \"Most email providers are accepted. Temporary / disposable addresses are blocked.\"\n );\n }\n if (policy.mode === \"off\" && policy.blocklist.length > 0) {\n return (\n labels?.allowedDomainsBlocklist ??\n \"Most email providers are accepted. Temporary / disposable addresses are blocked.\"\n );\n }\n return (\n labels?.allowedDomainsOpen ?? \"Email registration is open for most providers.\"\n );\n}\n\n/** Public policy document from Auth Gateway `GET /api/register-policy`. */\nexport interface PublicRegisterPolicyResponse {\n mode?: string;\n allowlist?: string[];\n blocklist?: string[];\n ipDailyLimit?: number;\n codeHourlyLimit?: number;\n enabled?: boolean;\n}\n\n/**\n * Fetch live register policy from Auth Gateway (or any host that serves `/api/register-policy`).\n * Falls back to built-in defaults when the endpoint is missing.\n */\nexport async function fetchRegisterEmailPolicy(\n apiBase: string,\n init?: RequestInit,\n): Promise<RegisterEmailPolicy> {\n const base = apiBase.replace(/\\/$/, \"\");\n try {\n const res = await fetch(`${base}/api/register-policy`, {\n credentials: \"omit\",\n headers: { Accept: \"application/json\" },\n ...init,\n });\n if (!res.ok) return resolveRegisterEmailPolicy();\n const data = (await res.json()) as PublicRegisterPolicyResponse;\n return resolveRegisterEmailPolicy({\n mode: data.mode,\n allowlist: data.allowlist,\n blocklist: data.blocklist,\n });\n } catch {\n return resolveRegisterEmailPolicy();\n }\n}\n","/**\n * Logto Experience API (Headless) adapter.\n * Prefer same-origin Experience base (SPA proxies /api/experience) so cookies\n * work on HTTP localhost.\n */\n\nimport { prepareSignInRequestUrl } from \"./oidc-client\";\nimport {\n LOGIN_EXPERIENCE_CAPABILITIES,\n type ExperienceEmailSignUpCompleteInput,\n type ExperienceEmailSignUpSendCodeInput,\n type ExperienceEmailSignUpSendCodeResult,\n type ExperienceIdentifierType,\n type ExperiencePasswordSignInInput,\n type ExperiencePasswordSignInResult,\n type ExperiencePasswordSignUpInput,\n type ExperiencePasswordSignUpResult,\n type ExperienceSocialConnector,\n type FetchSocialConnectorsInput,\n type LoginExperienceAdapter,\n type LoginExperienceCapability,\n type SocialSignInRequest,\n} from \"./login-experience-adapter\";\nimport {\n evaluateRegisterEmail,\n registerEmailRejectionMessage,\n resolveRegisterEmailPolicy,\n type RegisterEmailPolicy,\n} from \"./register-policy\";\nimport type { LuminaryIdpConfig } from \"./types\";\n\n/** Logto username pattern for NewPasswordIdentity (see Experience API docs). */\nconst LOGTO_USERNAME_RE = /^[A-Za-z_]\\w*$/;\n\nexport function isLogtoRegisterUsername(value: string): boolean {\n return LOGTO_USERNAME_RE.test(value.trim());\n}\n\nfunction experienceUrl(apiBase: string, path: string): string {\n return `${apiBase.replace(/\\/$/, \"\")}/api/experience${path}`;\n}\n\nasync function experienceFetch<T>(apiBase: string, path: string, init: RequestInit): Promise<T> {\n const res = await fetch(experienceUrl(apiBase, path), {\n credentials: \"include\",\n ...init,\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...(init.headers ?? {}),\n },\n });\n const text = await res.text();\n let data: unknown = null;\n if (text) {\n try {\n data = JSON.parse(text) as unknown;\n } catch {\n data = text;\n }\n }\n if (!res.ok) {\n const msg =\n data && typeof data === \"object\" && data !== null && \"message\" in data\n ? String((data as { message: unknown }).message)\n : `Experience API ${res.status}`;\n throw new Error(msg);\n }\n return data as T;\n}\n\nfunction guessIdentifierType(identifier: string): ExperienceIdentifierType {\n if (identifier.includes(\"@\")) return \"email\";\n if (/^\\+?\\d{6,}$/.test(identifier.trim())) return \"phone\";\n return \"username\";\n}\n\n/**\n * Force authorize onto the Experience/SPA origin so Set-Cookie lands on the\n * same host as subsequent `/api/experience` calls (dev proxy strips Domain).\n */\nexport function sameOriginAuthorizeUrl(authorizeUrl: string, apiBase: string): string {\n const u = new URL(authorizeUrl);\n const base = new URL(apiBase);\n if (u.origin === base.origin) return authorizeUrl;\n return `${base.origin}${u.pathname}${u.search}${u.hash}`;\n}\n\n/**\n * Logto creates its interaction cookie after an authorize request. The\n * standard OIDC client creates and persists the PKCE request; this adapter only\n * applies Logto's same-origin interaction bootstrap.\n */\nasync function bootstrapOidcInteraction(input: ExperiencePasswordSignInInput): Promise<void> {\n if (!input.issuer || !input.clientId || !input.redirectUri) return;\n if (typeof document === \"undefined\") return;\n\n const config: LuminaryIdpConfig = {\n issuer: input.issuer,\n clientId: input.clientId,\n redirectUri: input.redirectUri,\n audience: input.audience,\n scopes: input.scopes,\n experienceApiBase: input.apiBase,\n };\n\n const signinUrl = await prepareSignInRequestUrl(config, {\n returnUrl: input.returnUrl,\n });\n const authorizeUrl = sameOriginAuthorizeUrl(signinUrl, input.apiBase);\n\n await new Promise<void>((resolve) => {\n const iframe = document.createElement(\"iframe\");\n iframe.setAttribute(\"aria-hidden\", \"true\");\n iframe.tabIndex = -1;\n iframe.style.cssText = \"position:absolute;width:0;height:0;border:0;visibility:hidden\";\n let settled = false;\n const finish = () => {\n if (settled) return;\n settled = true;\n iframe.remove();\n resolve();\n };\n iframe.addEventListener(\"load\", () => {\n window.setTimeout(finish, 400);\n });\n iframe.src = authorizeUrl;\n document.body.appendChild(iframe);\n window.setTimeout(finish, 2500);\n });\n}\n\n/** Build Logto's provider-specific direct sign-in authorize parameter. */\nexport function createLogtoDirectSignInRequest(directSignIn: string): SocialSignInRequest {\n return { extraQueryParams: { direct_sign_in: directSignIn } };\n}\n\n/** Built-in adapter for Logto's non-standard Experience API. */\nexport class LogtoExperienceAdapter implements LoginExperienceAdapter {\n readonly provider = \"logto\";\n readonly capabilities: readonly LoginExperienceCapability[] = [\n LOGIN_EXPERIENCE_CAPABILITIES.passwordSignIn,\n LOGIN_EXPERIENCE_CAPABILITIES.passwordSignUp,\n LOGIN_EXPERIENCE_CAPABILITIES.emailCodeSignUp,\n LOGIN_EXPERIENCE_CAPABILITIES.socialConnectors,\n LOGIN_EXPERIENCE_CAPABILITIES.socialDirectSignIn,\n ];\n\n emailPolicy: RegisterEmailPolicy = resolveRegisterEmailPolicy();\n\n async experiencePasswordSignIn(\n input: ExperiencePasswordSignInInput,\n ): Promise<ExperiencePasswordSignInResult> {\n const { apiBase, identifier, password } = input;\n await bootstrapOidcInteraction(input);\n\n const primary = input.identifierType ?? guessIdentifierType(identifier);\n const alternates: ExperienceIdentifierType[] =\n primary === \"phone\"\n ? [primary]\n : primary === \"email\"\n ? [\"email\", \"username\"]\n : [\"username\", \"email\"];\n\n let lastError: Error | undefined;\n for (const identifierType of alternates) {\n try {\n await experienceFetch(apiBase, \"\", {\n method: \"PUT\",\n body: JSON.stringify({ interactionEvent: \"SignIn\" }),\n });\n\n const verified = await experienceFetch<{ verificationId?: string }>(\n apiBase,\n \"/verification/password\",\n {\n method: \"POST\",\n body: JSON.stringify({\n identifier: { type: identifierType, value: identifier },\n password,\n }),\n },\n );\n\n const verificationId = verified?.verificationId;\n if (!verificationId) {\n throw new Error(\"Experience API did not return verificationId\");\n }\n\n await experienceFetch(apiBase, \"/identification\", {\n method: \"POST\",\n body: JSON.stringify({ verificationId }),\n });\n\n const submitted = await experienceFetch<{ redirectTo?: string }>(\n apiBase,\n \"/submit\",\n {\n method: \"POST\",\n body: JSON.stringify({}),\n },\n );\n\n return { redirectTo: submitted?.redirectTo, raw: submitted };\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n }\n }\n throw lastError ?? new Error(\"Experience password sign-in failed\");\n }\n\n /**\n * Register with username + password via NewPasswordIdentity.\n * Email/phone self-register requires verification codes — use social or invite instead.\n */\n async experiencePasswordSignUp(\n input: ExperiencePasswordSignUpInput,\n ): Promise<ExperiencePasswordSignUpResult> {\n const { apiBase, identifier, password } = input;\n const username = identifier.trim();\n if (!isLogtoRegisterUsername(username)) {\n throw new Error(\n \"Register with a username (letters, digits, underscore; start with a letter or _). Use social login for email-based accounts.\",\n );\n }\n if (!password || password.length < 8) {\n throw new Error(\"Password must be at least 8 characters\");\n }\n\n await bootstrapOidcInteraction(input);\n\n await experienceFetch(apiBase, \"\", {\n method: \"PUT\",\n body: JSON.stringify({\n interactionEvent: \"Register\",\n ...(input.captchaToken ? { captchaToken: input.captchaToken } : {}),\n }),\n });\n\n const verified = await experienceFetch<{ verificationId?: string }>(\n apiBase,\n \"/verification/new-password-identity\",\n {\n method: \"POST\",\n body: JSON.stringify({\n identifier: { type: \"username\", value: username },\n password,\n }),\n },\n );\n\n const verificationId = verified?.verificationId;\n if (!verificationId) {\n throw new Error(\"Experience API did not return verificationId\");\n }\n\n await experienceFetch(apiBase, \"/identification\", {\n method: \"POST\",\n body: JSON.stringify({ verificationId }),\n });\n\n const submitted = await experienceFetch<{ redirectTo?: string }>(apiBase, \"/submit\", {\n method: \"POST\",\n body: JSON.stringify({}),\n });\n\n return { redirectTo: submitted?.redirectTo, raw: submitted };\n }\n\n async sendRegisterEmailCode(\n input: ExperienceEmailSignUpSendCodeInput,\n ): Promise<ExperienceEmailSignUpSendCodeResult> {\n const email = (input.email || input.identifier || \"\").trim().toLowerCase();\n const decision = evaluateRegisterEmail(email, this.emailPolicy);\n if (!decision.ok) {\n throw new Error(registerEmailRejectionMessage(decision));\n }\n\n await bootstrapOidcInteraction({\n apiBase: input.apiBase,\n identifier: email,\n password: \"\",\n issuer: input.issuer,\n clientId: input.clientId,\n redirectUri: input.redirectUri,\n audience: input.audience,\n scopes: input.scopes,\n returnUrl: input.returnUrl,\n });\n\n await experienceFetch(input.apiBase, \"\", {\n method: \"PUT\",\n body: JSON.stringify({\n interactionEvent: \"Register\",\n ...(input.captchaToken ? { captchaToken: input.captchaToken } : {}),\n }),\n });\n\n const sent = await experienceFetch<{ verificationId?: string }>(\n input.apiBase,\n \"/verification/verification-code\",\n {\n method: \"POST\",\n body: JSON.stringify({\n identifier: { type: \"email\", value: email },\n interactionEvent: \"Register\",\n }),\n },\n );\n\n if (!sent?.verificationId) {\n throw new Error(\"Experience API did not return verificationId for email code\");\n }\n return { verificationId: sent.verificationId };\n }\n\n async experienceEmailPasswordSignUp(\n input: ExperienceEmailSignUpCompleteInput,\n ): Promise<ExperiencePasswordSignUpResult> {\n const email = (input.email || input.identifier || \"\").trim().toLowerCase();\n const decision = evaluateRegisterEmail(email, this.emailPolicy);\n if (!decision.ok) {\n throw new Error(registerEmailRejectionMessage(decision));\n }\n if (!input.password || input.password.length < 8) {\n throw new Error(\"Password must be at least 8 characters\");\n }\n if (!input.code?.trim() || !input.verificationId?.trim()) {\n throw new Error(\"Email verification code is required\");\n }\n\n // Continue the Register interaction created by sendRegisterEmailCode — do not PUT Register again.\n\n const verified = await experienceFetch<{ verificationId?: string }>(\n input.apiBase,\n \"/verification/verification-code/verify\",\n {\n method: \"POST\",\n body: JSON.stringify({\n identifier: { type: \"email\", value: email },\n verificationId: input.verificationId,\n code: input.code.trim(),\n }),\n },\n );\n\n const codeVerificationId = verified?.verificationId || input.verificationId;\n\n try {\n await experienceFetch(input.apiBase, \"/identification\", {\n method: \"POST\",\n body: JSON.stringify({ verificationId: codeVerificationId }),\n });\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n if (!/missing_profile/i.test(msg)) {\n // Logto returns missing_profile when password is still required — continue.\n // Other errors (already in use, etc.) must surface.\n if (!/422|password|profile/i.test(msg)) {\n throw error instanceof Error ? error : new Error(msg);\n }\n }\n }\n\n await experienceFetch(input.apiBase, \"/profile\", {\n method: \"POST\",\n body: JSON.stringify({ type: \"password\", value: input.password }),\n });\n\n await experienceFetch(input.apiBase, \"/identification\", {\n method: \"POST\",\n body: JSON.stringify({}),\n });\n\n const submitted = await experienceFetch<{ redirectTo?: string }>(input.apiBase, \"/submit\", {\n method: \"POST\",\n body: JSON.stringify({}),\n });\n\n return { redirectTo: submitted?.redirectTo, raw: submitted };\n }\n\n async fetchSocialConnectors(\n input: FetchSocialConnectorsInput,\n ): Promise<ExperienceSocialConnector[]> {\n const url = new URL(`${input.apiBase.replace(/\\/$/, \"\")}/api/.well-known/sign-in-exp`);\n if (input.appId?.trim()) url.searchParams.set(\"appId\", input.appId.trim());\n const res = await fetch(url.toString(), {\n // Public metadata — omit cookies so browsers do not require credentialed CORS.\n credentials: \"omit\",\n headers: { Accept: \"application/json\" },\n });\n if (!res.ok) {\n throw new Error(`sign-in-exp ${res.status}`);\n }\n const data = (await res.json()) as {\n socialConnectors?: Array<{\n id?: string;\n target?: string;\n name?: string | Record<string, string>;\n logo?: string;\n }>;\n };\n return (data.socialConnectors ?? [])\n .filter(\n (\n connector,\n ): connector is {\n id: string;\n target: string;\n name?: string | Record<string, string>;\n logo?: string;\n } => Boolean(connector?.id && connector?.target),\n )\n .map((connector) => ({\n id: connector.id,\n target: connector.target,\n name: localizeName(connector.name) || titleCase(connector.target),\n logo: connector.logo,\n }));\n }\n\n createSocialSignInRequest(target: string): SocialSignInRequest {\n return createLogtoDirectSignInRequest(`social:${target}`);\n }\n}\n\nfunction localizeName(name: string | Record<string, string> | undefined): string {\n if (!name) return \"\";\n if (typeof name === \"string\") return name;\n return name[\"zh-CN\"] || name.en || Object.values(name)[0] || \"\";\n}\n\nfunction titleCase(target: string): string {\n if (!target) return \"\";\n return target.charAt(0).toUpperCase() + target.slice(1);\n}\n","import {\n OidcClient,\n UserManager,\n WebStorageStateStore,\n type User,\n} from \"oidc-client-ts\";\nimport { createLogtoDirectSignInRequest } from \"./logto-experience-adapter\";\nimport type { LuminaryAuthSession, LuminaryIdpConfig } from \"./types\";\n\nlet manager: UserManager | null = null;\n\nfunction storageKey(config: LuminaryIdpConfig): string {\n return config.tokenStorageKey ?? \"luminary_access_token\";\n}\n\nfunction popupRedirectUri(config: LuminaryIdpConfig): string {\n return config.popupRedirectUri ?? config.redirectUri;\n}\n\nfunction sharedStateStore() {\n // localStorage so popup/redirect/Experience callback windows can resolve PKCE state.\n return new WebStorageStateStore({ store: window.localStorage });\n}\n\nfunction clientSettings(config: LuminaryIdpConfig) {\n const resource = config.audience?.trim() || undefined;\n return {\n authority: config.issuer.replace(/\\/$/, \"\"),\n metadataUrl: resolveOidcMetadataUrl(config),\n client_id: config.clientId,\n redirect_uri: config.redirectUri,\n post_logout_redirect_uri: config.postLogoutRedirectUri ?? config.redirectUri,\n response_type: \"code\" as const,\n scope: config.scopes ?? \"openid profile email offline_access\",\n stateStore: sharedStateStore(),\n extraQueryParams: resource ? { resource } : undefined,\n extraTokenParams: resource ? { resource } : undefined,\n };\n}\n\nfunction userManagerSettings(config: LuminaryIdpConfig) {\n const resource = config.audience?.trim() || undefined;\n return {\n ...clientSettings(config),\n popup_redirect_uri: popupRedirectUri(config),\n automaticSilentRenew: true,\n loadUserInfo: !resource,\n userStore: sharedStateStore(),\n };\n}\n\nexport function createUserManager(config: LuminaryIdpConfig): UserManager {\n if (manager) return manager;\n manager = new UserManager(userManagerSettings(config));\n return manager;\n}\n\n/**\n * When Experience/Gateway base differs from the IdP issuer origin, fetch OIDC discovery\n * via the gateway (CORS) while keeping `authority` = Logto issuer (JWT `iss`).\n */\nfunction resolveOidcMetadataUrl(config: LuminaryIdpConfig): string | undefined {\n const proxyBase = config.experienceApiBase?.replace(/\\/$/, \"\");\n if (!proxyBase) return undefined;\n try {\n if (new URL(proxyBase).origin === new URL(config.issuer).origin) return undefined;\n } catch {\n return undefined;\n }\n return `${proxyBase}/oidc/.well-known/openid-configuration`;\n}\n\nexport function resetUserManager(): void {\n manager = null;\n}\n\nexport interface SignInOptions {\n returnUrl?: string;\n /** Provider-specific authorize parameters supplied by an experience adapter. */\n extraQueryParams?: Record<string, string>;\n /**\n * Logto direct sign-in, e.g. `social:google` / `social:github` / `sso:<connectorId>`.\n * Skips the hosted password page and opens the provider immediately.\n * @deprecated Prefer a LoginExperienceAdapter, which supplies extraQueryParams.\n */\n directSignIn?: string;\n}\n\nfunction signInArgs(config: LuminaryIdpConfig, options?: SignInOptions | string) {\n const normalized: SignInOptions =\n typeof options === \"string\" ? { returnUrl: options } : (options ?? {});\n const resource = config.audience?.trim();\n const extraQueryParams: Record<string, string> = { ...normalized.extraQueryParams };\n if (resource) extraQueryParams.resource = resource;\n if (normalized.directSignIn) {\n Object.assign(\n extraQueryParams,\n createLogtoDirectSignInRequest(normalized.directSignIn).extraQueryParams,\n );\n }\n return {\n state: normalized.returnUrl ? { returnUrl: normalized.returnUrl } : undefined,\n extraQueryParams: Object.keys(extraQueryParams).length ? extraQueryParams : undefined,\n };\n}\n\nexport async function signInRedirect(\n config: LuminaryIdpConfig,\n returnUrlOrOptions?: string | SignInOptions,\n): Promise<void> {\n resetUserManager();\n const um = createUserManager(config);\n await um.signinRedirect(signInArgs(config, returnUrlOrOptions));\n}\n\n/**\n * Persist PKCE state (same store as {@link createUserManager}) and return the\n * authorize URL — used by Experience headless bootstrap before navigating to\n * `redirectTo` from `/api/experience/submit`.\n */\nexport async function prepareSignInRequestUrl(\n config: LuminaryIdpConfig,\n returnUrlOrOptions?: string | SignInOptions,\n): Promise<string> {\n resetUserManager();\n // Warm the singleton so callback uses identical settings/stores.\n createUserManager(config);\n const client = new OidcClient(clientSettings(config));\n const args = signInArgs(config, returnUrlOrOptions);\n const request = await client.createSigninRequest({\n state: args.state,\n extraQueryParams: {\n ...(args.extraQueryParams ?? {}),\n prompt: \"login\",\n },\n });\n return request.url;\n}\n\n/**\n * OIDC login in a popup window (not an iframe). Opener keeps SPA state;\n * callback page in the popup must call {@link handleSignInPopupCallback}.\n */\nexport async function signInPopup(\n config: LuminaryIdpConfig,\n returnUrlOrOptions?: string | SignInOptions,\n): Promise<{ session: LuminaryAuthSession; returnUrl?: string }> {\n resetUserManager();\n const um = createUserManager(config);\n const user = await um.signinPopup(signInArgs(config, returnUrlOrOptions));\n const session = toSession(user);\n if (!session.accessToken) {\n throw new Error(\"IdP did not return access_token (check audience / API resource)\");\n }\n assertJwtAccessToken(session.accessToken);\n localStorage.setItem(storageKey(config), session.accessToken);\n const stateReturnUrl =\n typeof user.state === \"object\" && user.state && \"returnUrl\" in user.state\n ? String((user.state as { returnUrl?: string }).returnUrl ?? \"\")\n : undefined;\n return { session, returnUrl: stateReturnUrl || undefined };\n}\n\nexport async function handleSignInCallback(config: LuminaryIdpConfig): Promise<{\n session: LuminaryAuthSession;\n returnUrl?: string;\n}> {\n const um = createUserManager(config);\n const user = await um.signinRedirectCallback();\n const session = toSession(user);\n assertJwtAccessToken(session.accessToken);\n localStorage.setItem(storageKey(config), session.accessToken);\n const returnUrl =\n typeof user.state === \"object\" && user.state && \"returnUrl\" in user.state\n ? String((user.state as { returnUrl?: string }).returnUrl ?? \"\")\n : undefined;\n return { session, returnUrl: returnUrl || undefined };\n}\n\n/**\n * Complete popup OIDC in the popup window. Notifies the opener and closes.\n * Do not run product SSO exchange here — the opener handles that after signInPopup resolves.\n */\nexport async function handleSignInPopupCallback(config: LuminaryIdpConfig): Promise<void> {\n const um = createUserManager(config);\n await um.signinPopupCallback();\n}\n\n/** True when this window is likely an OIDC popup callback. */\nexport function isOidcPopupWindow(): boolean {\n try {\n return Boolean(window.opener && window.opener !== window);\n } catch {\n return false;\n }\n}\n\nexport async function signOutRedirect(config: LuminaryIdpConfig): Promise<void> {\n localStorage.removeItem(storageKey(config));\n const um = createUserManager(config);\n await um.signoutRedirect();\n}\n\nexport function getStoredAccessToken(config: LuminaryIdpConfig): string | null {\n return localStorage.getItem(storageKey(config));\n}\n\nexport function clearStoredSession(config: LuminaryIdpConfig): void {\n localStorage.removeItem(storageKey(config));\n}\n\nfunction toSession(user: User): LuminaryAuthSession {\n return {\n accessToken: user.access_token,\n idToken: user.id_token,\n expiresAt: user.expires_at ? user.expires_at * 1000 : undefined,\n profile: user.profile as Record<string, unknown>,\n };\n}\n\nfunction assertJwtAccessToken(accessToken: string): void {\n if (accessToken.split(\".\").length !== 3) {\n throw new Error(\n \"Received non-JWT access_token. Pass resource (audience) on authorize/token and register the API resource at the IdP.\",\n );\n }\n}\n\nexport async function getCurrentUser(config: LuminaryIdpConfig): Promise<LuminaryAuthSession | null> {\n const um = createUserManager(config);\n const user = await um.getUser();\n if (!user || user.expired) return null;\n return toSession(user);\n}\n","/**\n * @deprecated Import the adapter APIs from the package root instead.\n *\n * This module remains as a compatibility facade for existing consumers.\n */\nimport {\n LOGIN_EXPERIENCE_CAPABILITIES,\n resolveLoginExperienceAdapter,\n} from \"./login-experience-adapter\";\n\nexport type {\n ExperienceIdentifierType,\n ExperiencePasswordSignInInput,\n ExperiencePasswordSignInResult,\n ExperienceSocialConnector,\n FetchSocialConnectorsInput,\n} from \"./login-experience-adapter\";\nexport { sameOriginAuthorizeUrl } from \"./logto-experience-adapter\";\n\nimport type {\n ExperiencePasswordSignInInput,\n ExperiencePasswordSignInResult,\n ExperienceSocialConnector,\n FetchSocialConnectorsInput,\n} from \"./login-experience-adapter\";\n\n/** @deprecated Use a LoginExperienceAdapter instance. */\nexport function experiencePasswordSignIn(\n input: ExperiencePasswordSignInInput,\n): Promise<ExperiencePasswordSignInResult> {\n const adapter = resolveLoginExperienceAdapter();\n if (\n !adapter.capabilities.includes(LOGIN_EXPERIENCE_CAPABILITIES.passwordSignIn) ||\n !adapter.experiencePasswordSignIn\n ) {\n return Promise.reject(new Error(\"Login experience does not support password sign-in\"));\n }\n return adapter.experiencePasswordSignIn(input);\n}\n\n/** @deprecated Use a LoginExperienceAdapter instance. */\nexport function fetchSocialConnectors(\n input: FetchSocialConnectorsInput,\n): Promise<ExperienceSocialConnector[]> {\n const adapter = resolveLoginExperienceAdapter();\n if (\n !adapter.capabilities.includes(LOGIN_EXPERIENCE_CAPABILITIES.socialConnectors) ||\n !adapter.fetchSocialConnectors\n ) {\n return Promise.reject(new Error(\"Login experience does not support social connectors\"));\n }\n return adapter.fetchSocialConnectors(input);\n}\n","/**\n * AuthGate — single-flight 401 recovery with optional token refresh + reauth UI.\n * Products wire tryRefresh / onReauthRequired; API clients call handleUnauthorized + waitIfBlocked.\n */\n\nexport type AuthGatePhase = \"idle\" | \"refreshing\" | \"reauth\";\n\nexport type UnauthorizedDisposition = \"retry\" | \"fail\";\n\nexport interface AuthGateSnapshot {\n phase: AuthGatePhase;\n /** True while refresh or interactive reauth is in flight. */\n blocked: boolean;\n lastError?: string;\n}\n\nexport interface AuthGateConfig {\n /**\n * Attempt silent product-token (or OIDC) refresh before showing reauth UI.\n * Return true if a new session was established.\n */\n tryRefresh?: () => Promise<boolean>;\n /** Called once when interactive reauth is required (open modal / popup). */\n onReauthRequired?: () => void;\n /** Called when reauth succeeds or is cancelled (phase back to idle). */\n onSettled?: (ok: boolean) => void;\n}\n\ntype Waiter = {\n resolve: (disposition: UnauthorizedDisposition) => void;\n};\n\nclass AuthGateCoordinator {\n private phase: AuthGatePhase = \"idle\";\n private lastError?: string;\n /** Cached for useSyncExternalStore — must keep referential equality when unchanged. */\n private snapshot: AuthGateSnapshot = { phase: \"idle\", blocked: false };\n private config: AuthGateConfig = {};\n private flight: Promise<UnauthorizedDisposition> | null = null;\n private reauthWaiters: Waiter[] = [];\n private listeners = new Set<() => void>();\n\n configure(config: AuthGateConfig): void {\n this.config = { ...this.config, ...config };\n }\n\n getSnapshot = (): AuthGateSnapshot => this.snapshot;\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n };\n\n private emit(): void {\n for (const listener of this.listeners) listener();\n }\n\n private setPhase(phase: AuthGatePhase, lastError?: string): void {\n if (this.phase === phase && this.lastError === lastError) return;\n this.phase = phase;\n this.lastError = lastError;\n this.snapshot = {\n phase,\n blocked: phase !== \"idle\",\n lastError,\n };\n this.emit();\n }\n\n /** Await while a recovery is in flight (pause outbound API traffic). */\n async waitIfBlocked(): Promise<void> {\n if (!this.flight) return;\n await this.flight;\n }\n\n /**\n * Single-flight 401 handler.\n * Concurrent callers share one recovery; all receive the same disposition.\n */\n handleUnauthorized(errorMessage?: string): Promise<UnauthorizedDisposition> {\n if (this.flight) return this.flight;\n this.flight = this.runRecovery(errorMessage).finally(() => {\n this.flight = null;\n });\n return this.flight;\n }\n\n /** Open reauth UI without a preceding 401 (cold start / deep link). */\n requestReauth(errorMessage?: string): Promise<UnauthorizedDisposition> {\n return this.handleUnauthorized(errorMessage);\n }\n\n /** Product calls after popup / Headless login restored the session. */\n completeReauth(): void {\n if (this.phase !== \"reauth\") return;\n const waiters = this.reauthWaiters.splice(0, this.reauthWaiters.length);\n this.setPhase(\"idle\");\n this.config.onSettled?.(true);\n for (const w of waiters) w.resolve(\"retry\");\n }\n\n /** User dismissed reauth; fail queued recovery waiters. */\n cancelReauth(errorMessage?: string): void {\n if (this.phase !== \"reauth\") return;\n const waiters = this.reauthWaiters.splice(0, this.reauthWaiters.length);\n this.setPhase(\"idle\", errorMessage);\n this.config.onSettled?.(false);\n for (const w of waiters) w.resolve(\"fail\");\n }\n\n private async runRecovery(errorMessage?: string): Promise<UnauthorizedDisposition> {\n this.lastError = errorMessage;\n\n if (this.config.tryRefresh) {\n this.setPhase(\"refreshing\", errorMessage);\n try {\n const ok = await this.config.tryRefresh();\n if (ok) {\n this.setPhase(\"idle\");\n this.config.onSettled?.(true);\n return \"retry\";\n }\n } catch (e) {\n this.lastError = e instanceof Error ? e.message : String(e);\n }\n }\n\n this.setPhase(\"reauth\", this.lastError);\n this.config.onReauthRequired?.();\n\n return new Promise<UnauthorizedDisposition>((resolve) => {\n this.reauthWaiters.push({ resolve });\n });\n }\n}\n\n/** Process-wide gate (one per SPA bundle). */\nexport const authGate = new AuthGateCoordinator();\n\n/**\n * Run an async request; on 401, recover via AuthGate and retry once.\n * `isUnauthorized` defaults to checking `status === 401` or `statusCode === 401`.\n */\nexport async function withAuthGateRetry<T>(\n execute: () => Promise<T>,\n options?: {\n isUnauthorized?: (error: unknown) => boolean;\n /** Skip gate (e.g. refresh / sso / login endpoints). */\n bypass?: boolean;\n },\n): Promise<T> {\n if (options?.bypass) return execute();\n\n await authGate.waitIfBlocked();\n\n try {\n return await execute();\n } catch (error) {\n if (!(options?.isUnauthorized ?? defaultIsUnauthorized)(error)) throw error;\n const disposition = await authGate.handleUnauthorized(messageOf(error));\n if (disposition !== \"retry\") throw error;\n return execute();\n }\n}\n\nfunction defaultIsUnauthorized(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n const e = error as { status?: number; statusCode?: number; response?: { status?: number } };\n return e.status === 401 || e.statusCode === 401 || e.response?.status === 401;\n}\n\nfunction messageOf(error: unknown): string | undefined {\n if (error instanceof Error) return error.message;\n if (error && typeof error === \"object\" && \"message\" in error) {\n const m = (error as { message?: unknown }).message;\n return typeof m === \"string\" ? m : undefined;\n }\n return undefined;\n}\n","import { createContext, useCallback, useContext, useEffect, useMemo, useState } from \"react\";\nimport {\n clearStoredSession,\n getCurrentUser,\n getStoredAccessToken,\n handleSignInCallback,\n signInPopup,\n signInRedirect,\n signOutRedirect,\n} from \"./oidc-client\";\nimport { isIdpConfigured, readIdpConfigFromEnv, type LuminaryAuthSession, type LuminaryIdpConfig } from \"./types\";\n\ninterface LuminaryAuthContextValue {\n configured: boolean;\n session: LuminaryAuthSession | null;\n accessToken: string | null;\n loading: boolean;\n login: (returnUrl?: string) => Promise<void>;\n /** Popup OIDC — keeps the opener SPA mounted. */\n loginPopup: (returnUrl?: string) => Promise<LuminaryAuthSession>;\n logout: () => Promise<void>;\n completeCallback: () => Promise<{ returnUrl?: string }>;\n refreshSession: () => Promise<void>;\n}\n\nconst LuminaryAuthContext = createContext<LuminaryAuthContextValue | null>(null);\n\nexport interface LuminaryAuthProviderProps {\n config?: Partial<LuminaryIdpConfig>;\n children: React.ReactNode;\n}\n\nexport function LuminaryAuthProvider({ config: configProp, children }: LuminaryAuthProviderProps) {\n const config = useMemo(() => configProp ?? {}, [configProp]);\n const configured = isIdpConfigured(config);\n const [session, setSession] = useState<LuminaryAuthSession | null>(null);\n const [loading, setLoading] = useState(configured);\n\n const refreshSession = useCallback(async () => {\n if (!configured) {\n setSession(null);\n setLoading(false);\n return;\n }\n setLoading(true);\n try {\n const current = await getCurrentUser(config);\n setSession(current);\n } catch {\n setSession(null);\n } finally {\n setLoading(false);\n }\n }, [config, configured]);\n\n useEffect(() => {\n void refreshSession();\n }, [refreshSession]);\n\n const login = useCallback(\n async (returnUrl?: string) => {\n if (!configured) throw new Error(\"IdP not configured\");\n await signInRedirect(config, returnUrl);\n },\n [config, configured],\n );\n\n const loginPopup = useCallback(\n async (returnUrl?: string) => {\n if (!configured) throw new Error(\"IdP not configured\");\n const { session: next } = await signInPopup(config, returnUrl);\n setSession(next);\n return next;\n },\n [config, configured],\n );\n\n const logout = useCallback(async () => {\n if (!configured) {\n clearStoredSession(config as LuminaryIdpConfig);\n setSession(null);\n return;\n }\n setSession(null);\n await signOutRedirect(config);\n }, [config, configured]);\n\n const completeCallback = useCallback(async () => {\n if (!configured) throw new Error(\"IdP not configured\");\n const { session: next, returnUrl } = await handleSignInCallback(config);\n setSession(next);\n return { returnUrl };\n }, [config, configured]);\n\n const value = useMemo<LuminaryAuthContextValue>(\n () => ({\n configured,\n session,\n accessToken: session?.accessToken ?? (configured ? getStoredAccessToken(config) : null),\n loading,\n login,\n loginPopup,\n logout,\n completeCallback,\n refreshSession,\n }),\n [configured, session, loading, login, loginPopup, logout, completeCallback, refreshSession, config],\n );\n\n return <LuminaryAuthContext.Provider value={value}>{children}</LuminaryAuthContext.Provider>;\n}\n\nexport function useLuminaryAuth(): LuminaryAuthContextValue {\n const ctx = useContext(LuminaryAuthContext);\n if (!ctx) throw new Error(\"useLuminaryAuth must be used within LuminaryAuthProvider\");\n return ctx;\n}\n\nexport { isIdpConfigured, readIdpConfigFromEnv };\nexport type { LuminaryAuthSession, LuminaryIdpConfig };\n",".panel {\n --lw-auth-theme: #1677ff;\n --lw-auth-theme-deep: color-mix(in srgb, var(--lw-auth-theme) 72%, #000);\n width: min(100%, 400px);\n padding: 28px 28px 22px;\n border-radius: 16px;\n background: rgba(255, 255, 255, 0.96);\n color: #14212b;\n box-shadow: 0 24px 64px rgba(15, 23, 42, 0.28);\n font-family: \"Segoe UI\", \"PingFang SC\", \"Noto Sans SC\", sans-serif;\n}\n\n.brand {\n display: flex;\n gap: 14px;\n align-items: center;\n margin-bottom: 12px;\n}\n\n.logo {\n border-radius: 12px;\n display: block;\n}\n\n.product {\n margin: 0;\n font-size: 13px;\n font-weight: 650;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--lw-auth-theme);\n}\n\n.title {\n margin: 2px 0 0;\n font-size: 22px;\n font-weight: 700;\n line-height: 1.25;\n}\n\n.subtitle {\n margin: 0 0 18px;\n font-size: 14px;\n line-height: 1.5;\n color: #4b5c68;\n}\n\n.form {\n display: grid;\n gap: 10px;\n}\n\n.channelTabs {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 6px;\n margin-bottom: 2px;\n}\n\n.channelTab {\n border: 1px solid #c9d5de;\n border-radius: 10px;\n padding: 8px 10px;\n font-size: 13px;\n font-weight: 650;\n cursor: pointer;\n color: #4b5c68;\n background: #f7fafc;\n}\n.channelTab:disabled {\n opacity: 0.65;\n cursor: not-allowed;\n}\n\n.channelTabActive {\n color: var(--lw-auth-theme-deep);\n border-color: var(--lw-auth-theme);\n background: color-mix(in srgb, var(--lw-auth-theme) 10%, #fff);\n}\n\n.codeRow {\n display: grid;\n grid-template-columns: 1fr auto;\n gap: 8px;\n align-items: stretch;\n}\n\n.codeInput {\n min-width: 0;\n}\n\n.secondaryBtn {\n border: 1px solid #b7c9d4;\n border-radius: 10px;\n padding: 0 12px;\n font-size: 13px;\n font-weight: 650;\n cursor: pointer;\n color: #14212b;\n background: #fff;\n white-space: nowrap;\n}\n.secondaryBtn:disabled {\n opacity: 0.65;\n cursor: not-allowed;\n}\n\n.socialStack {\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n font-size: 12px;\n}\n\n.input {\n width: 100%;\n box-sizing: border-box;\n border: 1px solid #c9d5de;\n border-radius: 10px;\n padding: 10px 12px;\n font-size: 14px;\n outline: none;\n background: #f7fafc;\n}\n.input:focus {\n border-color: var(--lw-auth-theme);\n}\n.input:disabled {\n opacity: 0.65;\n cursor: not-allowed;\n}\n\n.passwordField {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.passwordInput {\n padding-right: 42px;\n}\n\n.passwordToggle {\n position: absolute;\n right: 4px;\n top: 50%;\n transform: translateY(-50%);\n z-index: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: none;\n border-radius: 4px;\n padding: 0;\n color: #5a6b76;\n background: transparent;\n cursor: pointer;\n}\n.passwordToggle:hover:not(:disabled) {\n color: var(--lw-auth-theme);\n background: color-mix(in srgb, var(--lw-auth-theme) 12%, transparent);\n}\n.passwordToggle:focus-visible {\n outline: 2px solid var(--lw-auth-theme);\n outline-offset: 1px;\n}\n.passwordToggle:disabled {\n opacity: 0.65;\n cursor: not-allowed;\n}\n\n.primaryBtn {\n border: none;\n border-radius: 10px;\n padding: 11px 14px;\n font-size: 14px;\n font-weight: 650;\n cursor: pointer;\n color: #fff;\n background: linear-gradient(135deg, var(--lw-auth-theme) 0%, var(--lw-auth-theme-deep) 100%);\n}\n.primaryBtn:disabled {\n opacity: 0.65;\n cursor: not-allowed;\n}\n\n.socialBtn {\n flex: 1 1 calc(50% - 5px);\n min-width: min(140px, 100%);\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n border: 1px solid #b7c9d4;\n border-radius: 10px;\n padding: 11px 10px;\n font-size: 14px;\n font-weight: 650;\n cursor: pointer;\n color: #14212b;\n background: #fff;\n}\n.socialBtn:disabled {\n opacity: 0.65;\n cursor: not-allowed;\n}\n\n.socialLogo {\n flex-shrink: 0;\n display: block;\n}\n\n.logoFallback {\n width: 18px;\n height: 18px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--lw-auth-theme) 14%, #fff);\n color: var(--lw-auth-theme-deep);\n font-size: 11px;\n font-weight: 700;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.cancelBtn {\n margin-top: 10px;\n width: 100%;\n border: none;\n background: transparent;\n color: #5a6b76;\n font-size: 13px;\n cursor: pointer;\n padding: 8px;\n}\n.cancelBtn:disabled {\n opacity: 0.65;\n cursor: not-allowed;\n}\n\n.divider {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 14px 0;\n color: #90a0ab;\n}\n\n.dividerLine {\n flex: 1;\n height: 1px;\n background: #d5e0e7;\n}\n\n.dividerText {\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n}\n\n.hint {\n margin: 10px 0 0;\n font-size: 12px;\n color: #6b7c87;\n line-height: 1.45;\n}\n\n.domainsHint {\n margin: -2px 0 0;\n font-size: 12px;\n line-height: 1.45;\n color: #4b5c68;\n word-break: break-word;\n}\n\n.switchMode {\n margin: 12px 0 0;\n text-align: center;\n}\n\n.switchModeBtn {\n border: none;\n background: transparent;\n color: var(--lw-auth-theme);\n font-size: 13px;\n font-weight: 650;\n cursor: pointer;\n padding: 4px 8px;\n text-decoration: underline;\n text-underline-offset: 3px;\n}\n.switchModeBtn:disabled {\n opacity: 0.65;\n cursor: not-allowed;\n}\n\n.error {\n margin: 12px 0 0;\n font-size: 13px;\n color: #b42318;\n line-height: 1.4;\n}\n\n.footer {\n margin-top: 18px;\n padding-top: 12px;\n border-top: 1px solid #e4ebf0;\n font-size: 12px;\n color: #6b7c87;\n display: flex;\n gap: 8px;\n justify-content: center;\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkhlYWRsZXNzTG9naW5QYW5lbC5tb2R1bGUuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFrQkE7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBLGVBVFU7RUFVVjtFQUNBLE9BekJJO0VBMEJKO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0EsT0E3RE07OztBQWdFUjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQSxlQWhFVTtFQWlFVjtFQUNBO0VBQ0E7RUFDQTtFQUNBLE9BbkZNO0VBb0ZOLFlBM0VROztBQTZFUjtFQUNFO0VBQ0E7OztBQUlKO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFOzs7QUFHRjtFQUNFO0VBQ0EsZUFqR1U7RUFrR1Y7RUFDQTtFQUNBO0VBQ0E7RUFDQSxPQXJISTtFQXNISjtFQUNBOztBQUVBO0VBQ0U7RUFDQTs7O0FBSUo7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQSxlQTNIVTtFQTRIVjtFQUNBO0VBQ0E7RUFDQSxZQXBJUTs7QUFzSVI7RUFDRTs7QUFHRjtFQUNFO0VBQ0E7OztBQUlKO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxlQWhLVTtFQWlLVjtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFO0VBQ0E7O0FBR0Y7RUFDRTtFQUNBOztBQUdGO0VBQ0U7RUFDQTs7O0FBSUo7RUFDRTtFQUNBLGVBekxVO0VBMExWO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFO0VBQ0E7OztBQUlKO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxlQS9NVTtFQWdOVjtFQUNBO0VBQ0E7RUFDQTtFQUNBLE9Bbk9JO0VBb09KOztBQUVBO0VBQ0U7RUFDQTs7O0FBSUo7RUFDRTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQSxlQXBPVTtFQXFPVjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBOzs7QUFJSjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsT0EzUVE7OztBQThRVjtFQUNFO0VBQ0E7RUFDQSxZQWxSSzs7O0FBcVJQO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQSxPQXBTSztFQXFTTDs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQSxPQTdTTTtFQThTTjs7O0FBR0Y7RUFDRTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFO0VBQ0E7OztBQUlKO0VBQ0U7RUFDQTtFQUNBLE9BL1RPO0VBZ1VQOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsT0FsVks7RUFtVkw7RUFDQTtFQUNBIiwic291cmNlc0NvbnRlbnQiOlsiJGluazogIzE0MjEyYjtcbiRtdXRlZDogIzRiNWM2ODtcbiRoaW50OiAjNmI3Yzg3O1xuJGJyYW5kOiAjM2Q2ZjhmO1xuJGJyYW5kLWRlZXA6ICMxNTQ4NWM7XG4kYnJhbmQtbWlkOiAjMWY2ZjhiO1xuJGJvcmRlcjogI2M5ZDVkZTtcbiRib3JkZXItc29mdDogI2I3YzlkNDtcbiRsaW5lOiAjZDVlMGU3O1xuJGRpdmlkZXI6ICM5MGEwYWI7XG4kc3VyZmFjZTogI2Y3ZmFmYztcbiRmYWxsYmFjay1iZzogI2U4ZWVmMjtcbiRkYW5nZXI6ICNiNDIzMTg7XG4kZm9vdGVyLWxpbmU6ICNlNGViZjA7XG4kcmFkaXVzLWxnOiAxNnB4O1xuJHJhZGl1cy1tZDogMTBweDtcbiRyYWRpdXMtc206IDRweDtcblxuLnBhbmVsIHtcbiAgLS1sdy1hdXRoLXRoZW1lOiAjMTY3N2ZmO1xuICAtLWx3LWF1dGgtdGhlbWUtZGVlcDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWx3LWF1dGgtdGhlbWUpIDcyJSwgIzAwMCk7XG4gIHdpZHRoOiBtaW4oMTAwJSwgNDAwcHgpO1xuICBwYWRkaW5nOiAyOHB4IDI4cHggMjJweDtcbiAgYm9yZGVyLXJhZGl1czogJHJhZGl1cy1sZztcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk2KTtcbiAgY29sb3I6ICRpbms7XG4gIGJveC1zaGFkb3c6IDAgMjRweCA2NHB4IHJnYmEoMTUsIDIzLCA0MiwgMC4yOCk7XG4gIGZvbnQtZmFtaWx5OiBcIlNlZ29lIFVJXCIsIFwiUGluZ0ZhbmcgU0NcIiwgXCJOb3RvIFNhbnMgU0NcIiwgc2Fucy1zZXJpZjtcbn1cblxuLmJyYW5kIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiAxNHB4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBtYXJnaW4tYm90dG9tOiAxMnB4O1xufVxuXG4ubG9nbyB7XG4gIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4ucHJvZHVjdCB7XG4gIG1hcmdpbjogMDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBmb250LXdlaWdodDogNjUwO1xuICBsZXR0ZXItc3BhY2luZzogMC4wNGVtO1xuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICBjb2xvcjogdmFyKC0tbHctYXV0aC10aGVtZSk7XG59XG5cbi50aXRsZSB7XG4gIG1hcmdpbjogMnB4IDAgMDtcbiAgZm9udC1zaXplOiAyMnB4O1xuICBmb250LXdlaWdodDogNzAwO1xuICBsaW5lLWhlaWdodDogMS4yNTtcbn1cblxuLnN1YnRpdGxlIHtcbiAgbWFyZ2luOiAwIDAgMThweDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogMS41O1xuICBjb2xvcjogJG11dGVkO1xufVxuXG4uZm9ybSB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdhcDogMTBweDtcbn1cblxuLmNoYW5uZWxUYWJzIHtcbiAgZGlzcGxheTogZ3JpZDtcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyO1xuICBnYXA6IDZweDtcbiAgbWFyZ2luLWJvdHRvbTogMnB4O1xufVxuXG4uY2hhbm5lbFRhYiB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICRib3JkZXI7XG4gIGJvcmRlci1yYWRpdXM6ICRyYWRpdXMtbWQ7XG4gIHBhZGRpbmc6IDhweCAxMHB4O1xuICBmb250LXNpemU6IDEzcHg7XG4gIGZvbnQtd2VpZ2h0OiA2NTA7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgY29sb3I6ICRtdXRlZDtcbiAgYmFja2dyb3VuZDogJHN1cmZhY2U7XG5cbiAgJjpkaXNhYmxlZCB7XG4gICAgb3BhY2l0eTogMC42NTtcbiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICB9XG59XG5cbi5jaGFubmVsVGFiQWN0aXZlIHtcbiAgY29sb3I6IHZhcigtLWx3LWF1dGgtdGhlbWUtZGVlcCk7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tbHctYXV0aC10aGVtZSk7XG4gIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1sdy1hdXRoLXRoZW1lKSAxMCUsICNmZmYpO1xufVxuXG4uY29kZVJvdyB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIGF1dG87XG4gIGdhcDogOHB4O1xuICBhbGlnbi1pdGVtczogc3RyZXRjaDtcbn1cblxuLmNvZGVJbnB1dCB7XG4gIG1pbi13aWR0aDogMDtcbn1cblxuLnNlY29uZGFyeUJ0biB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICRib3JkZXItc29mdDtcbiAgYm9yZGVyLXJhZGl1czogJHJhZGl1cy1tZDtcbiAgcGFkZGluZzogMCAxMnB4O1xuICBmb250LXNpemU6IDEzcHg7XG4gIGZvbnQtd2VpZ2h0OiA2NTA7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgY29sb3I6ICRpbms7XG4gIGJhY2tncm91bmQ6ICNmZmY7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG5cbiAgJjpkaXNhYmxlZCB7XG4gICAgb3BhY2l0eTogMC42NTtcbiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICB9XG59XG5cbi5zb2NpYWxTdGFjayB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgZ2FwOiAxMHB4O1xuICBmb250LXNpemU6IDEycHg7XG59XG5cbi5pbnB1dCB7XG4gIHdpZHRoOiAxMDAlO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBib3JkZXI6IDFweCBzb2xpZCAkYm9yZGVyO1xuICBib3JkZXItcmFkaXVzOiAkcmFkaXVzLW1kO1xuICBwYWRkaW5nOiAxMHB4IDEycHg7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgb3V0bGluZTogbm9uZTtcbiAgYmFja2dyb3VuZDogJHN1cmZhY2U7XG5cbiAgJjpmb2N1cyB7XG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1sdy1hdXRoLXRoZW1lKTtcbiAgfVxuXG4gICY6ZGlzYWJsZWQge1xuICAgIG9wYWNpdHk6IDAuNjU7XG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgfVxufVxuXG4ucGFzc3dvcmRGaWVsZCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLnBhc3N3b3JkSW5wdXQge1xuICBwYWRkaW5nLXJpZ2h0OiA0MnB4O1xufVxuXG4ucGFzc3dvcmRUb2dnbGUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHJpZ2h0OiA0cHg7XG4gIHRvcDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIHotaW5kZXg6IDE7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgd2lkdGg6IDM2cHg7XG4gIGhlaWdodDogMzZweDtcbiAgYm9yZGVyOiBub25lO1xuICBib3JkZXItcmFkaXVzOiAkcmFkaXVzLXNtO1xuICBwYWRkaW5nOiAwO1xuICBjb2xvcjogIzVhNmI3NjtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGN1cnNvcjogcG9pbnRlcjtcblxuICAmOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcbiAgICBjb2xvcjogdmFyKC0tbHctYXV0aC10aGVtZSk7XG4gICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWx3LWF1dGgtdGhlbWUpIDEyJSwgdHJhbnNwYXJlbnQpO1xuICB9XG5cbiAgJjpmb2N1cy12aXNpYmxlIHtcbiAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tbHctYXV0aC10aGVtZSk7XG4gICAgb3V0bGluZS1vZmZzZXQ6IDFweDtcbiAgfVxuXG4gICY6ZGlzYWJsZWQge1xuICAgIG9wYWNpdHk6IDAuNjU7XG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgfVxufVxuXG4ucHJpbWFyeUJ0biB7XG4gIGJvcmRlcjogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogJHJhZGl1cy1tZDtcbiAgcGFkZGluZzogMTFweCAxNHB4O1xuICBmb250LXNpemU6IDE0cHg7XG4gIGZvbnQtd2VpZ2h0OiA2NTA7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHZhcigtLWx3LWF1dGgtdGhlbWUpIDAlLCB2YXIoLS1sdy1hdXRoLXRoZW1lLWRlZXApIDEwMCUpO1xuXG4gICY6ZGlzYWJsZWQge1xuICAgIG9wYWNpdHk6IDAuNjU7XG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgfVxufVxuXG4uc29jaWFsQnRuIHtcbiAgZmxleDogMSAxIGNhbGMoNTAlIC0gNXB4KTtcbiAgbWluLXdpZHRoOiBtaW4oMTQwcHgsIDEwMCUpO1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgZ2FwOiA4cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICRib3JkZXItc29mdDtcbiAgYm9yZGVyLXJhZGl1czogJHJhZGl1cy1tZDtcbiAgcGFkZGluZzogMTFweCAxMHB4O1xuICBmb250LXNpemU6IDE0cHg7XG4gIGZvbnQtd2VpZ2h0OiA2NTA7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgY29sb3I6ICRpbms7XG4gIGJhY2tncm91bmQ6ICNmZmY7XG5cbiAgJjpkaXNhYmxlZCB7XG4gICAgb3BhY2l0eTogMC42NTtcbiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICB9XG59XG5cbi5zb2NpYWxMb2dvIHtcbiAgZmxleC1zaHJpbms6IDA7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4ubG9nb0ZhbGxiYWNrIHtcbiAgd2lkdGg6IDE4cHg7XG4gIGhlaWdodDogMThweDtcbiAgYm9yZGVyLXJhZGl1czogJHJhZGl1cy1zbTtcbiAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWx3LWF1dGgtdGhlbWUpIDE0JSwgI2ZmZik7XG4gIGNvbG9yOiB2YXIoLS1sdy1hdXRoLXRoZW1lLWRlZXApO1xuICBmb250LXNpemU6IDExcHg7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgZmxleC1zaHJpbms6IDA7XG59XG5cbi5jYW5jZWxCdG4ge1xuICBtYXJnaW4tdG9wOiAxMHB4O1xuICB3aWR0aDogMTAwJTtcbiAgYm9yZGVyOiBub25lO1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgY29sb3I6ICM1YTZiNzY7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBwYWRkaW5nOiA4cHg7XG5cbiAgJjpkaXNhYmxlZCB7XG4gICAgb3BhY2l0eTogMC42NTtcbiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICB9XG59XG5cbi5kaXZpZGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAxMHB4O1xuICBtYXJnaW46IDE0cHggMDtcbiAgY29sb3I6ICRkaXZpZGVyO1xufVxuXG4uZGl2aWRlckxpbmUge1xuICBmbGV4OiAxO1xuICBoZWlnaHQ6IDFweDtcbiAgYmFja2dyb3VuZDogJGxpbmU7XG59XG5cbi5kaXZpZGVyVGV4dCB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDhlbTtcbn1cblxuLmhpbnQge1xuICBtYXJnaW46IDEwcHggMCAwO1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiAkaGludDtcbiAgbGluZS1oZWlnaHQ6IDEuNDU7XG59XG5cbi5kb21haW5zSGludCB7XG4gIG1hcmdpbjogLTJweCAwIDA7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgbGluZS1oZWlnaHQ6IDEuNDU7XG4gIGNvbG9yOiAkbXV0ZWQ7XG4gIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XG59XG5cbi5zd2l0Y2hNb2RlIHtcbiAgbWFyZ2luOiAxMnB4IDAgMDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG4uc3dpdGNoTW9kZUJ0biB7XG4gIGJvcmRlcjogbm9uZTtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGNvbG9yOiB2YXIoLS1sdy1hdXRoLXRoZW1lKTtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBmb250LXdlaWdodDogNjUwO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHBhZGRpbmc6IDRweCA4cHg7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICB0ZXh0LXVuZGVybGluZS1vZmZzZXQ6IDNweDtcblxuICAmOmRpc2FibGVkIHtcbiAgICBvcGFjaXR5OiAwLjY1O1xuICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIH1cbn1cblxuLmVycm9yIHtcbiAgbWFyZ2luOiAxMnB4IDAgMDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBjb2xvcjogJGRhbmdlcjtcbiAgbGluZS1oZWlnaHQ6IDEuNDtcbn1cblxuLmZvb3RlciB7XG4gIG1hcmdpbi10b3A6IDE4cHg7XG4gIHBhZGRpbmctdG9wOiAxMnB4O1xuICBib3JkZXItdG9wOiAxcHggc29saWQgJGZvb3Rlci1saW5lO1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiAkaGludDtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiA4cHg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuIl19 */","import { useEffect, useState, type CSSProperties, type FormEvent, type ReactNode } from \"react\";\nimport {\n LOGIN_EXPERIENCE_CAPABILITIES,\n resolveLoginExperienceAdapter,\n type ExperienceSocialConnector,\n type LoginExperienceAdapter,\n type SocialSignInRequest,\n} from \"./login-experience-adapter\";\nimport { LogtoExperienceAdapter } from \"./logto-experience-adapter\";\nimport { signInPopup, signInRedirect, prepareSignInRequestUrl } from \"./oidc-client\";\nimport {\n evaluateRegisterEmail,\n fetchRegisterEmailPolicy,\n registerEmailDomainsHint,\n registerEmailRejectionMessage,\n resolveRegisterEmailPolicy,\n type RegisterEmailPolicy,\n} from \"./register-policy\";\nimport { isIdpConfigured, type LuminaryAuthSession, type LuminaryIdpConfig } from \"./types\";\nimport styles from \"./HeadlessLoginPanel.module.scss\";\n\n/** @deprecated Prefer dynamic connectors from IdP; kept for prop typing. */\nexport type SocialProviderTarget = string;\n\nexport interface HeadlessLoginLabels {\n title?: string;\n subtitle?: string;\n identifierPlaceholder?: string;\n /** Placeholder when panel is in register mode (username). */\n registerIdentifierPlaceholder?: string;\n passwordPlaceholder?: string;\n confirmPasswordPlaceholder?: string;\n submitPassword?: string;\n submitRegister?: string;\n /** Hosted OIDC button shown when the adapter has no password capability. */\n submitSso?: string;\n submitGoogle?: string;\n submitGithub?: string;\n socialDivider?: string;\n hint?: string;\n registerHint?: string;\n cancel?: string;\n experienceUnavailable?: string;\n showPassword?: string;\n hidePassword?: string;\n /** Switch link when on sign-in: \"Create an account\" */\n registerLink?: string;\n /** Switch link when on register: \"Already have an account? Sign in\" */\n loginLink?: string;\n passwordMismatch?: string;\n registerTitle?: string;\n registerSubtitle?: string;\n registerWithEmail?: string;\n registerWithUsername?: string;\n emailPlaceholder?: string;\n verificationCodePlaceholder?: string;\n sendCode?: string;\n resendCode?: string;\n /** Prefix before the allowlisted domain list, e.g. \"Allowed email domains\". */\n allowedDomainsPrefix?: string;\n /** Shown when mode is off / unrestricted (aside from disposable blocklist). */\n allowedDomainsOpen?: string;\n /** Shown when only disposable domains are blocked. */\n allowedDomainsBlocklist?: string;\n /**\n * Desktop/mobile system-browser social login: tell the user to finish in the browser\n * and return to the app (loopback / deep link callback).\n */\n waitingExternalBrowser?: string;\n}\n\nexport interface HeadlessLoginPanelProps {\n config: Partial<LuminaryIdpConfig>;\n /** Login-experience provider. Defaults to the catalog adapter for `config.iamProvider`. */\n experienceAdapter?: LoginExperienceAdapter;\n /** Product display name shown as brand signal */\n productName: string;\n logoSrc?: string;\n labels?: HeadlessLoginLabels;\n returnUrl?: string;\n /** Prefer popup (default) for reauth; redirect for full-page SPA; external for desktop/mobile system browser (RFC 8252). */\n mode?: \"popup\" | \"redirect\" | \"external\";\n /**\n * Open an authorize URL in the OS browser / Custom Tabs / ASWebAuthenticationSession.\n * Required when `mode=\"external\"` (Google / GitHub / hosted SSO). Password Headless stays in-app.\n */\n openExternalUrl?: (url: string) => void | Promise<void>;\n /**\n * Show Experience social connectors (Google / GitHub / …).\n * Default `true`. Set `false` for admin / internal consoles that only allow\n * password (or enterprise SSO via IdP) — hides divider + social buttons and\n * skips fetching connectors.\n * Equivalent to `socialProviders={[]}` when false.\n */\n showSocialConnectors?: boolean;\n /**\n * Show self-register switch + register form.\n * Default `true` for end-user product logins. Set `false` for admin / ops consoles.\n */\n showRegister?: boolean;\n /**\n * Email domain policy for self-register.\n * If omitted, the panel loads `GET {experienceApiBase}/api/register-policy` when available,\n * otherwise uses built-in consumer allowlist defaults.\n */\n registerEmailPolicy?: RegisterEmailPolicy;\n /**\n * When true (default), fetch live policy from Auth Gateway `/api/register-policy`.\n * Set false to use only `registerEmailPolicy` / built-in defaults (e.g. local auth-dev-proxy).\n */\n fetchRegisterPolicy?: boolean;\n /**\n * Optional CAPTCHA token provider (Cloudflare Turnstile / reCAPTCHA).\n * Token is sent as `captchaToken` on Experience Register init when Logto bot protection is on.\n */\n getCaptchaToken?: () => Promise<string | undefined>;\n /**\n * Social providers (when `showSocialConnectors` is not `false`):\n * - omit / `\"auto\"` — load enabled connectors from IdP (google, github, x, …)\n * - `string[]` — only these targets (still prefers IdP logos/names when available)\n * - `[]` — hide social buttons\n */\n socialProviders?: \"auto\" | SocialProviderTarget[];\n showCancel?: boolean;\n onCancel?: () => void;\n /**\n * Called after OIDC session is obtained (popup) or before redirect navigation.\n * Products typically exchange OIDC access token → product JWT here.\n */\n onOidcSession?: (session: LuminaryAuthSession, returnUrl?: string) => Promise<void> | void;\n /** When Experience returns redirectTo, open it (default: same-tab assign). */\n onExperienceRedirect?: (redirectTo: string) => void;\n footer?: ReactNode;\n className?: string;\n style?: CSSProperties;\n /**\n * Brand accent for primary CTA / focus / product label.\n * Defaults to ecosystem primary `#1677ff`.\n */\n themeColor?: string;\n}\n\n/** Shared default accent for product login panels (shared/brand --lw-primary). */\nexport const DEFAULT_LOGIN_THEME_COLOR = \"#1677ff\";\n\nconst defaults: Required<HeadlessLoginLabels> = {\n title: \"Sign in\",\n subtitle: \"Use your LuminaryWorks unified account\",\n identifierPlaceholder: \"Email or username\",\n registerIdentifierPlaceholder: \"Username\",\n passwordPlaceholder: \"Password\",\n confirmPasswordPlaceholder: \"Confirm password\",\n submitPassword: \"Sign in with password\",\n submitRegister: \"Create account\",\n submitSso: \"Continue with unified account\",\n submitGoogle: \"Google\",\n submitGithub: \"GitHub\",\n socialDivider: \"or\",\n hint: \"Social providers open directly. Password uses your LuminaryWorks account.\",\n registerHint:\n \"Email register needs a code (Gmail / Outlook / QQ / 163 / iCloud …). Username is an alternative. Prefer one-click? Use a social provider.\",\n cancel: \"Cancel\",\n experienceUnavailable: \"Password sign-in is unavailable; use a social provider instead.\",\n showPassword: \"Show password\",\n hidePassword: \"Hide password\",\n registerLink: \"Create an account\",\n loginLink: \"Already have an account? Sign in\",\n passwordMismatch: \"Passwords do not match\",\n registerTitle: \"Create account\",\n registerSubtitle: \"Create your LuminaryWorks unified account\",\n registerWithEmail: \"Email\",\n registerWithUsername: \"Username\",\n emailPlaceholder: \"Email\",\n verificationCodePlaceholder: \"Verification code\",\n sendCode: \"Send code\",\n resendCode: \"Resend code\",\n allowedDomainsPrefix: \"Allowed email domains\",\n allowedDomainsOpen: \"Email registration is open for most providers.\",\n allowedDomainsBlocklist:\n \"Most email providers are accepted. Temporary / disposable addresses are blocked.\",\n waitingExternalBrowser:\n \"Finish signing in with your browser, then return to this app.\",\n};\n\nfunction resolveSieBase(config: Partial<LuminaryIdpConfig>): string | undefined {\n // Prefer same-origin Experience base (SPA proxies /api/.well-known) to avoid\n // cross-port CORS on local Logto. Fall back to issuer origin only when needed.\n const explicit = config.experienceApiBase?.trim();\n if (explicit) return explicit.replace(/\\/$/, \"\");\n if (config.issuer) {\n try {\n return new URL(config.issuer).origin;\n } catch {\n /* fall through */\n }\n }\n return undefined;\n}\n\nfunction labelFor(connector: ExperienceSocialConnector, labels: Required<HeadlessLoginLabels>): string {\n if (connector.target === \"google\" && labels.submitGoogle) return labels.submitGoogle;\n if (connector.target === \"github\" && labels.submitGithub) return labels.submitGithub;\n return connector.name;\n}\n\nfunction cx(...parts: Array<string | undefined | false>): string {\n return parts.filter(Boolean).join(\" \");\n}\n\nexport function HeadlessLoginPanel({\n config,\n experienceAdapter: experienceAdapterProp,\n productName,\n logoSrc,\n labels: labelsProp,\n returnUrl,\n mode = \"popup\",\n openExternalUrl,\n showSocialConnectors = true,\n showRegister = true,\n registerEmailPolicy: registerEmailPolicyProp,\n fetchRegisterPolicy = true,\n getCaptchaToken,\n socialProviders = \"auto\",\n showCancel,\n onCancel,\n onOidcSession,\n onExperienceRedirect,\n footer,\n className,\n style,\n themeColor = DEFAULT_LOGIN_THEME_COLOR,\n}: HeadlessLoginPanelProps) {\n const experienceAdapter = resolveLoginExperienceAdapter(\n experienceAdapterProp,\n config.iamProvider,\n );\n const [emailPolicy, setEmailPolicy] = useState<RegisterEmailPolicy>(\n () => registerEmailPolicyProp ?? resolveRegisterEmailPolicy(),\n );\n useEffect(() => {\n if (registerEmailPolicyProp) {\n setEmailPolicy(registerEmailPolicyProp);\n return;\n }\n if (!fetchRegisterPolicy || !showRegister) {\n setEmailPolicy(resolveRegisterEmailPolicy());\n return;\n }\n const base = config.experienceApiBase?.trim();\n if (!base) {\n setEmailPolicy(resolveRegisterEmailPolicy());\n return;\n }\n let cancelled = false;\n void fetchRegisterEmailPolicy(base).then((policy) => {\n if (!cancelled) setEmailPolicy(policy);\n });\n return () => {\n cancelled = true;\n };\n }, [\n config.experienceApiBase,\n fetchRegisterPolicy,\n registerEmailPolicyProp,\n showRegister,\n ]);\n useEffect(() => {\n if (experienceAdapter instanceof LogtoExperienceAdapter) {\n experienceAdapter.emailPolicy = emailPolicy;\n }\n }, [emailPolicy, experienceAdapter]);\n const labels = { ...defaults, ...labelsProp };\n const configured = isIdpConfigured(config);\n const [panelMode, setPanelMode] = useState<\"sign-in\" | \"register\">(\"sign-in\");\n const [registerChannel, setRegisterChannel] = useState<\"email\" | \"username\">(\"email\");\n const [identifier, setIdentifier] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [confirmPassword, setConfirmPassword] = useState(\"\");\n const [verificationCode, setVerificationCode] = useState(\"\");\n const [emailVerificationId, setEmailVerificationId] = useState<string | null>(null);\n const [passwordVisible, setPasswordVisible] = useState(false);\n const panelStyle: CSSProperties = {\n ...style,\n [\"--lw-auth-theme\" as string]: themeColor || DEFAULT_LOGIN_THEME_COLOR,\n };\n const [loading, setLoading] = useState<\"password\" | string | null>(null);\n const [error, setError] = useState(\"\");\n const [awaitingExternal, setAwaitingExternal] = useState(false);\n const [connectors, setConnectors] = useState<ExperienceSocialConnector[]>([]);\n const socialEnabled =\n showSocialConnectors !== false &&\n !(Array.isArray(socialProviders) && socialProviders.length === 0) &&\n experienceAdapter.capabilities.includes(LOGIN_EXPERIENCE_CAPABILITIES.socialConnectors) &&\n experienceAdapter.capabilities.includes(LOGIN_EXPERIENCE_CAPABILITIES.socialDirectSignIn) &&\n typeof experienceAdapter.fetchSocialConnectors === \"function\" &&\n typeof experienceAdapter.createSocialSignInRequest === \"function\";\n const passwordEnabled =\n experienceAdapter.capabilities.includes(LOGIN_EXPERIENCE_CAPABILITIES.passwordSignIn) &&\n typeof experienceAdapter.experiencePasswordSignIn === \"function\";\n const registerEnabled =\n showRegister !== false &&\n ((experienceAdapter.capabilities.includes(LOGIN_EXPERIENCE_CAPABILITIES.passwordSignUp) &&\n typeof experienceAdapter.experiencePasswordSignUp === \"function\") ||\n (experienceAdapter.capabilities.includes(LOGIN_EXPERIENCE_CAPABILITIES.emailCodeSignUp) &&\n typeof experienceAdapter.sendRegisterEmailCode === \"function\" &&\n typeof experienceAdapter.experienceEmailPasswordSignUp === \"function\"));\n const emailRegisterEnabled =\n experienceAdapter.capabilities.includes(LOGIN_EXPERIENCE_CAPABILITIES.emailCodeSignUp) &&\n typeof experienceAdapter.sendRegisterEmailCode === \"function\" &&\n typeof experienceAdapter.experienceEmailPasswordSignUp === \"function\";\n const usernameRegisterEnabled =\n experienceAdapter.capabilities.includes(LOGIN_EXPERIENCE_CAPABILITIES.passwordSignUp) &&\n typeof experienceAdapter.experiencePasswordSignUp === \"function\";\n const isRegister = panelMode === \"register\" && registerEnabled;\n const useEmailRegister = isRegister && registerChannel === \"email\" && emailRegisterEnabled;\n\n // Browser back from IdP restores bfcache with loading still set → \"…\".\n useEffect(() => {\n const resetBusy = () => {\n setLoading(null);\n setAwaitingExternal(false);\n };\n window.addEventListener(\"pageshow\", resetBusy);\n window.addEventListener(\"popstate\", resetBusy);\n return () => {\n window.removeEventListener(\"pageshow\", resetBusy);\n window.removeEventListener(\"popstate\", resetBusy);\n };\n }, []);\n\n useEffect(() => {\n const fetchConnectors = experienceAdapter.fetchSocialConnectors;\n if (!socialEnabled || !fetchConnectors) {\n setConnectors([]);\n return;\n }\n let cancelled = false;\n const sieBase = resolveSieBase(config);\n const allowlist =\n socialProviders === \"auto\" || socialProviders === undefined\n ? null\n : new Set(socialProviders.map((t) => t.toLowerCase()));\n\n const apply = (list: ExperienceSocialConnector[]) => {\n const filtered = allowlist\n ? list.filter((c) => allowlist.has(c.target.toLowerCase()))\n : list;\n if (!cancelled) setConnectors(filtered);\n };\n\n if (!sieBase) {\n // No Experience base — do not invent Google/GitHub buttons. Fake fallbacks\n // start OIDC `direct_sign_in` and dump users on Logto `/sign-in`.\n if (!cancelled) setConnectors([]);\n return;\n }\n\n void fetchConnectors.call(experienceAdapter, { apiBase: sieBase, appId: config.clientId })\n .then((list) => {\n apply(list);\n })\n .catch(() => {\n if (!cancelled) setConnectors([]);\n });\n\n return () => {\n cancelled = true;\n };\n }, [\n config.clientId,\n config.experienceApiBase,\n config.issuer,\n experienceAdapter,\n socialEnabled,\n socialProviders,\n ]);\n\n const runOidc = async (experienceRequest?: SocialSignInRequest) => {\n if (!configured) throw new Error(\"IdP not configured\");\n if (mode === \"external\") {\n if (!openExternalUrl) {\n throw new Error(\"openExternalUrl is required when mode is \\\"external\\\"\");\n }\n const url = await prepareSignInRequestUrl(config as LuminaryIdpConfig, {\n returnUrl,\n ...experienceRequest,\n });\n setAwaitingExternal(true);\n await openExternalUrl(url);\n setLoading(null);\n return;\n }\n if (mode === \"redirect\") {\n await signInRedirect(config, { returnUrl, ...experienceRequest });\n return;\n }\n const { session, returnUrl: next } = await signInPopup(config, {\n returnUrl,\n ...experienceRequest,\n });\n await onOidcSession?.(session, next);\n };\n\n const runSocial = async (target: string) => {\n setError(\"\");\n setLoading(target);\n try {\n if (\n !socialEnabled ||\n !experienceAdapter.capabilities.includes(\n LOGIN_EXPERIENCE_CAPABILITIES.socialDirectSignIn,\n ) ||\n !experienceAdapter.createSocialSignInRequest\n ) {\n throw new Error(\"Login experience does not support direct social sign-in\");\n }\n await runOidc(experienceAdapter.createSocialSignInRequest(target));\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n setLoading(null);\n setAwaitingExternal(false);\n }\n };\n\n const runHostedOidc = async () => {\n setError(\"\");\n setLoading(\"sso\");\n try {\n await runOidc();\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n setLoading(null);\n setAwaitingExternal(false);\n }\n };\n\n const followExperienceRedirect = (redirectTo: string) => {\n if (onExperienceRedirect) {\n onExperienceRedirect(redirectTo);\n return;\n }\n window.location.assign(redirectTo);\n };\n\n const runPassword = async (event: FormEvent) => {\n event.preventDefault();\n if (!configured) return;\n setError(\"\");\n setLoading(\"password\");\n try {\n const apiBase = config.experienceApiBase?.trim();\n if (!apiBase) {\n throw new Error(labels.experienceUnavailable);\n }\n const captchaToken = getCaptchaToken ? await getCaptchaToken() : undefined;\n if (isRegister) {\n if (password !== confirmPassword) {\n throw new Error(labels.passwordMismatch);\n }\n if (useEmailRegister) {\n if (!experienceAdapter.experienceEmailPasswordSignUp || !emailVerificationId) {\n throw new Error(\"Send and enter the email verification code first\");\n }\n const decision = evaluateRegisterEmail(identifier.trim(), emailPolicy);\n if (!decision.ok) throw new Error(registerEmailRejectionMessage(decision));\n const result = await experienceAdapter.experienceEmailPasswordSignUp({\n apiBase,\n identifier: identifier.trim(),\n email: identifier.trim(),\n password,\n code: verificationCode,\n verificationId: emailVerificationId,\n captchaToken,\n issuer: config.issuer,\n clientId: config.clientId,\n redirectUri: config.redirectUri,\n audience: config.audience,\n scopes: config.scopes,\n returnUrl,\n });\n if (result.redirectTo) {\n followExperienceRedirect(result.redirectTo);\n return;\n }\n throw new Error(\"Experience API did not return redirectTo\");\n }\n if (!usernameRegisterEnabled || !experienceAdapter.experiencePasswordSignUp) {\n throw new Error(labels.experienceUnavailable);\n }\n const result = await experienceAdapter.experiencePasswordSignUp({\n apiBase,\n identifier: identifier.trim(),\n password,\n captchaToken,\n issuer: config.issuer,\n clientId: config.clientId,\n redirectUri: config.redirectUri,\n audience: config.audience,\n scopes: config.scopes,\n returnUrl,\n });\n if (result.redirectTo) {\n followExperienceRedirect(result.redirectTo);\n return;\n }\n throw new Error(\"Experience API did not return redirectTo\");\n }\n if (\n !passwordEnabled ||\n !experienceAdapter.capabilities.includes(\n LOGIN_EXPERIENCE_CAPABILITIES.passwordSignIn,\n ) ||\n !experienceAdapter.experiencePasswordSignIn\n ) {\n throw new Error(labels.experienceUnavailable);\n }\n const result = await experienceAdapter.experiencePasswordSignIn({\n apiBase,\n identifier: identifier.trim(),\n password,\n issuer: config.issuer,\n clientId: config.clientId,\n redirectUri: config.redirectUri,\n audience: config.audience,\n scopes: config.scopes,\n returnUrl,\n });\n if (result.redirectTo) {\n followExperienceRedirect(result.redirectTo);\n return;\n }\n throw new Error(\"Experience API did not return redirectTo\");\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n setLoading(null);\n }\n };\n\n const runSendCode = async () => {\n if (!configured || !useEmailRegister) return;\n setError(\"\");\n setLoading(\"send-code\");\n try {\n const apiBase = config.experienceApiBase?.trim();\n if (!apiBase || !experienceAdapter.sendRegisterEmailCode) {\n throw new Error(labels.experienceUnavailable);\n }\n const email = identifier.trim();\n const decision = evaluateRegisterEmail(email, emailPolicy);\n if (!decision.ok) throw new Error(registerEmailRejectionMessage(decision));\n const captchaToken = getCaptchaToken ? await getCaptchaToken() : undefined;\n const sent = await experienceAdapter.sendRegisterEmailCode({\n apiBase,\n identifier: email,\n email,\n captchaToken,\n issuer: config.issuer,\n clientId: config.clientId,\n redirectUri: config.redirectUri,\n audience: config.audience,\n scopes: config.scopes,\n returnUrl,\n });\n setEmailVerificationId(sent.verificationId);\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setLoading(null);\n }\n };\n\n const switchPanelMode = (next: \"sign-in\" | \"register\") => {\n setPanelMode(next);\n setError(\"\");\n setConfirmPassword(\"\");\n setVerificationCode(\"\");\n setEmailVerificationId(null);\n };\n\n const busy = loading !== null;\n const showSocial = socialEnabled && connectors.length > 0;\n const showHint = Boolean(labelsProp?.hint) || showSocial || isRegister;\n const formReady =\n Boolean(identifier.trim()) &&\n Boolean(password) &&\n (!isRegister || Boolean(confirmPassword)) &&\n (!useEmailRegister || (Boolean(verificationCode.trim()) && Boolean(emailVerificationId)));\n const titleText = isRegister ? labels.registerTitle : labels.title;\n const subtitleText = isRegister ? labels.registerSubtitle : labels.subtitle;\n const identifierPlaceholder = isRegister\n ? useEmailRegister\n ? labels.emailPlaceholder\n : labels.registerIdentifierPlaceholder\n : labels.identifierPlaceholder;\n const submitLabel = isRegister ? labels.submitRegister : labels.submitPassword;\n const hintText = isRegister ? labels.registerHint : labels.hint;\n const domainsHint =\n useEmailRegister\n ? registerEmailDomainsHint(emailPolicy, {\n allowedDomainsPrefix: labels.allowedDomainsPrefix,\n allowedDomainsOpen: labels.allowedDomainsOpen,\n allowedDomainsBlocklist: labels.allowedDomainsBlocklist,\n })\n : null;\n\n return (\n <div className={cx(styles.panel, className)} style={panelStyle}>\n <header className={styles.brand}>\n {logoSrc ? <img src={logoSrc} alt=\"\" width={48} height={48} className={styles.logo} /> : null}\n <div>\n <p className={styles.product}>{productName}</p>\n <h2 className={styles.title}>{titleText}</h2>\n </div>\n </header>\n <p className={styles.subtitle}>{subtitleText}</p>\n\n {configured ? (\n <>\n {passwordEnabled ? (\n <form onSubmit={(e) => void runPassword(e)} className={styles.form}>\n {isRegister && emailRegisterEnabled && usernameRegisterEnabled ? (\n <div className={styles.channelTabs} role=\"tablist\" aria-label=\"Register method\">\n <button\n type=\"button\"\n role=\"tab\"\n className={cx(\n styles.channelTab,\n registerChannel === \"email\" && styles.channelTabActive,\n )}\n aria-selected={registerChannel === \"email\"}\n disabled={busy}\n onClick={() => {\n setRegisterChannel(\"email\");\n setEmailVerificationId(null);\n setVerificationCode(\"\");\n setError(\"\");\n }}\n >\n {labels.registerWithEmail}\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n className={cx(\n styles.channelTab,\n registerChannel === \"username\" && styles.channelTabActive,\n )}\n aria-selected={registerChannel === \"username\"}\n disabled={busy}\n onClick={() => {\n setRegisterChannel(\"username\");\n setEmailVerificationId(null);\n setVerificationCode(\"\");\n setError(\"\");\n }}\n >\n {labels.registerWithUsername}\n </button>\n </div>\n ) : null}\n <input\n type={useEmailRegister ? \"email\" : \"text\"}\n name=\"identifier\"\n autoComplete={isRegister ? \"username\" : \"username\"}\n placeholder={identifierPlaceholder}\n value={identifier}\n onChange={(e) => {\n setIdentifier(e.target.value);\n if (useEmailRegister) {\n setEmailVerificationId(null);\n }\n }}\n className={styles.input}\n disabled={busy}\n />\n {domainsHint ? (\n <p className={styles.domainsHint} data-testid=\"register-allowed-domains\">\n {domainsHint}\n </p>\n ) : null}\n {useEmailRegister ? (\n <div className={styles.codeRow}>\n <input\n type=\"text\"\n name=\"verificationCode\"\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n placeholder={labels.verificationCodePlaceholder}\n value={verificationCode}\n onChange={(e) => setVerificationCode(e.target.value)}\n className={cx(styles.input, styles.codeInput)}\n disabled={busy}\n />\n <button\n type=\"button\"\n className={styles.secondaryBtn}\n disabled={busy || !identifier.trim()}\n onClick={() => void runSendCode()}\n >\n {loading === \"send-code\"\n ? \"…\"\n : emailVerificationId\n ? labels.resendCode\n : labels.sendCode}\n </button>\n </div>\n ) : null}\n <div className={styles.passwordField}>\n <input\n type={passwordVisible ? \"text\" : \"password\"}\n name=\"password\"\n autoComplete={isRegister ? \"new-password\" : \"current-password\"}\n placeholder={labels.passwordPlaceholder}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n className={cx(styles.input, styles.passwordInput)}\n disabled={busy}\n />\n <button\n type=\"button\"\n className={styles.passwordToggle}\n disabled={busy}\n aria-label={passwordVisible ? labels.hidePassword : labels.showPassword}\n aria-pressed={passwordVisible}\n onClick={() => setPasswordVisible((v) => !v)}\n >\n <PasswordVisibilityIcon visible={passwordVisible} />\n </button>\n </div>\n {isRegister ? (\n <div className={styles.passwordField}>\n <input\n type={passwordVisible ? \"text\" : \"password\"}\n name=\"confirmPassword\"\n autoComplete=\"new-password\"\n placeholder={labels.confirmPasswordPlaceholder}\n value={confirmPassword}\n onChange={(e) => setConfirmPassword(e.target.value)}\n className={cx(styles.input, styles.passwordInput)}\n disabled={busy}\n />\n </div>\n ) : null}\n <button type=\"submit\" className={styles.primaryBtn} disabled={busy || !formReady}>\n {loading === \"password\" ? \"…\" : submitLabel}\n </button>\n </form>\n ) : (\n <div className={styles.form}>\n <button\n type=\"button\"\n className={styles.primaryBtn}\n disabled={busy}\n onClick={() => void runHostedOidc()}\n >\n {loading === \"sso\" ? \"…\" : labels.submitSso}\n </button>\n </div>\n )}\n {showHint ? <p className={styles.hint}>{hintText}</p> : null}\n\n {registerEnabled && passwordEnabled ? (\n <p className={styles.switchMode}>\n <button\n type=\"button\"\n className={styles.switchModeBtn}\n disabled={busy}\n onClick={() => switchPanelMode(isRegister ? \"sign-in\" : \"register\")}\n >\n {isRegister ? labels.loginLink : labels.registerLink}\n </button>\n </p>\n ) : null}\n\n {awaitingExternal ? (\n <p className={styles.hint} role=\"status\">\n {labels.waitingExternalBrowser}\n </p>\n ) : null}\n\n {showSocial ? (\n <div className={styles.divider} aria-hidden>\n <span className={styles.dividerLine} />\n <span className={styles.dividerText}>{labels.socialDivider}</span>\n <span className={styles.dividerLine} />\n </div>\n ) : null}\n {showSocial ? (\n <div className={styles.socialStack}>\n {connectors.map((connector) => (\n <button\n key={connector.id}\n type=\"button\"\n className={styles.socialBtn}\n disabled={busy}\n onClick={() => void runSocial(connector.target)}\n >\n <SocialLogo connector={connector} />\n {loading === connector.target ? \"…\" : labelFor(connector, labels)}\n </button>\n ))}\n </div>\n ) : null}\n\n </>\n ) : (\n <p className={styles.error}>IdP is not configured (issuer / clientId / redirectUri).</p>\n )}\n\n {error ? <p className={styles.error}>{error}</p> : null}\n\n {showCancel ? (\n <button type=\"button\" className={styles.cancelBtn} disabled={busy} onClick={onCancel}>\n {labels.cancel}\n </button>\n ) : null}\n\n {footer ? <footer className={styles.footer}>{footer}</footer> : null}\n </div>\n );\n}\n\nfunction SocialLogo({ connector }: { connector: ExperienceSocialConnector }) {\n if (connector.logo) {\n return <img src={connector.logo} alt=\"\" width={18} height={18} className={styles.socialLogo} />;\n }\n return (\n <span className={styles.logoFallback} aria-hidden>\n {connector.name.slice(0, 1).toUpperCase()}\n </span>\n );\n}\n\nfunction PasswordVisibilityIcon({ visible }: { visible: boolean }) {\n // Filled icons (antd Eye / EyeInvisible style) — no dependency.\n if (visible) {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\" aria-hidden>\n <path d=\"M942.2 486.2C847.4 286.5 704.1 186 512 186c-57.9 0-111.5 9.8-160.3 27.7l72.3 72.3C457 273.3 483.5 266 512 266c161.3 0 279.4 81.8 362.7 254-26.3 54.4-57.5 100.2-93.3 136.1l59.6 59.6C891.4 655.7 932.5 578.5 942.2 537.7a60.3 60.3 0 000-51.5zM336.6 278.6l-59.9-59.9C230.6 255.4 182.8 296.4 141.9 348.1 95.4 412.1 64.6 486.5 51.8 512a60.3 60.3 0 000 51.5C115.3 719.5 224.6 814.8 365.4 860.1l72.5-72.5C353.6 761.6 286.3 698.3 241.3 612.5 220.6 573.1 205 528.6 194.5 486.2c24.5-50.4 55.1-92.1 90.8-124.9l51.3-51.3zM606.6 556.6A112 112 0 01467.4 417.4L606.6 556.6zM508 624c-26.5 0-50.9-9.2-70.2-24.6l-59.9 59.9A175.3 175.3 0 00508 688c97.2 0 176-78.8 176-176 0-26.5-9.2-50.9-24.6-70.2l-59.9 59.9c15.4 19.3 24.6 43.7 24.6 70.2 0 61.9-50.1 112-112 112zM880 112L112 880l48 48 768-768z\" />\n </svg>\n );\n }\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\" aria-hidden>\n <path d=\"M942.2 486.2C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3a60.3 60.3 0 000 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3a60.3 60.3 0 000-51.5zM512 766c-161.3 0-279.4-81.8-362.7-254C232.6 339.8 350.7 258 512 258c161.3 0 279.4 81.8 362.7 254C791.5 684.2 673.4 766 512 766z\" />\n <path d=\"M508 336c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm0 288c-61.9 0-112-50.1-112-112s50.1-112 112-112 112 50.1 112 112-50.1 112-112 112z\" />\n </svg>\n );\n}\n","import { useSyncExternalStore, type CSSProperties, type ReactNode } from \"react\";\nimport { authGate } from \"./auth-gate\";\nimport { HeadlessLoginPanel, type HeadlessLoginLabels } from \"./HeadlessLoginPanel\";\nimport type { LuminaryAuthSession, LuminaryIdpConfig } from \"./types\";\n\nexport interface ReauthOverlayProps {\n config: Partial<LuminaryIdpConfig>;\n productName: string;\n logoSrc?: string;\n labels?: HeadlessLoginLabels;\n returnUrl?: string;\n /** Brand accent forwarded to HeadlessLoginPanel (default `#1677ff`). */\n themeColor?: string;\n /** Exchange OIDC token / persist product session, then AuthGate completes. */\n onOidcSession: (session: LuminaryAuthSession, returnUrl?: string) => Promise<void> | void;\n /** Optional custom body instead of HeadlessLoginPanel */\n children?: ReactNode;\n /** Allow dismiss → cancelReauth (default true for mid-session; false for hard gate). */\n dismissible?: boolean;\n onDismiss?: () => void;\n}\n\n/**\n * Full-viewport soft gate shown while AuthGate phase is `reauth` (or `refreshing` spinner).\n * Does not iframe the IdP — uses Headless panel + OIDC popup.\n */\nexport function ReauthOverlay({\n config,\n productName,\n logoSrc,\n labels,\n returnUrl,\n themeColor,\n onOidcSession,\n children,\n dismissible = true,\n onDismiss,\n}: ReauthOverlayProps) {\n const snapshot = useSyncExternalStore(authGate.subscribe, authGate.getSnapshot, authGate.getSnapshot);\n\n if (snapshot.phase === \"idle\") return null;\n\n const resolvedReturnUrl =\n returnUrl ??\n (() => {\n if (typeof window === \"undefined\") return undefined;\n const hash = window.location.hash.replace(/^#/, \"\");\n if (!hash || hash.startsWith(\"/login\") || hash.startsWith(\"/auth/\")) return undefined;\n return hash.startsWith(\"/\") ? hash : `/${hash}`;\n })();\n\n const handleSession = async (session: LuminaryAuthSession, next?: string) => {\n await onOidcSession(session, next);\n authGate.completeReauth();\n };\n\n const handleCancel = () => {\n onDismiss?.();\n authGate.cancelReauth(\"cancelled\");\n };\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={productName}\n style={backdropStyle}\n onClick={dismissible ? handleCancel : undefined}\n >\n <div style={centerStyle} onClick={(e) => e.stopPropagation()}>\n {snapshot.phase === \"refreshing\" ? (\n <div style={spinnerCardStyle}>\n <div style={spinnerStyle} />\n <p style={{ margin: 0, color: \"#e8eef2\" }}>Refreshing session…</p>\n </div>\n ) : children ? (\n children\n ) : (\n <HeadlessLoginPanel\n config={config}\n productName={productName}\n logoSrc={logoSrc}\n themeColor={themeColor}\n labels={{\n title: labels?.title ?? \"Session expired\",\n subtitle: labels?.subtitle ?? \"Sign in again to keep working — this page will not reload.\",\n ...labels,\n }}\n returnUrl={resolvedReturnUrl}\n mode=\"popup\"\n showRegister={false}\n showCancel={dismissible}\n onCancel={handleCancel}\n onOidcSession={handleSession}\n />\n )}\n </div>\n </div>\n );\n}\n\nconst backdropStyle: CSSProperties = {\n position: \"fixed\",\n inset: 0,\n zIndex: 10000,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 24,\n background:\n \"radial-gradient(1200px 600px at 20% 10%, rgba(56, 120, 150, 0.35), transparent 55%), rgba(10, 18, 24, 0.72)\",\n backdropFilter: \"blur(6px)\",\n};\n\nconst centerStyle: CSSProperties = {\n width: \"min(100%, 420px)\",\n};\n\nconst spinnerCardStyle: CSSProperties = {\n display: \"grid\",\n justifyItems: \"center\",\n gap: 14,\n padding: 28,\n borderRadius: 16,\n background: \"rgba(20, 32, 40, 0.88)\",\n};\n\nconst spinnerStyle: CSSProperties = {\n width: 36,\n height: 36,\n borderRadius: \"50%\",\n border: \"3px solid rgba(255,255,255,0.2)\",\n borderTopColor: \"#7ec8e3\",\n animation: \"luminary-auth-spin 0.8s linear infinite\",\n};\n\n// Inject keyframes once\nif (typeof document !== \"undefined\" && !document.getElementById(\"luminary-auth-spin-style\")) {\n const style = document.createElement(\"style\");\n style.id = \"luminary-auth-spin-style\";\n style.textContent = `@keyframes luminary-auth-spin { to { transform: rotate(360deg); } }`;\n document.head.appendChild(style);\n}\n","import { createContext, useContext, useEffect, useMemo, type ReactNode } from \"react\";\nimport { useSyncExternalStore } from \"react\";\nimport { authGate, type AuthGateConfig, type AuthGateSnapshot } from \"./auth-gate\";\nimport { ReauthOverlay, type ReauthOverlayProps } from \"./ReauthOverlay\";\nimport type { LuminaryAuthSession, LuminaryIdpConfig } from \"./types\";\n\ninterface AuthGateContextValue {\n snapshot: AuthGateSnapshot;\n requestReauth: (message?: string) => Promise<\"retry\" | \"fail\">;\n completeReauth: () => void;\n cancelReauth: (message?: string) => void;\n}\n\nconst AuthGateContext = createContext<AuthGateContextValue | null>(null);\n\nexport interface AuthGateProviderProps extends AuthGateConfig {\n children: ReactNode;\n /** When set, mounts {@link ReauthOverlay} automatically. */\n overlay?: Omit<ReauthOverlayProps, \"onOidcSession\"> & {\n onOidcSession: (session: LuminaryAuthSession, returnUrl?: string) => Promise<void> | void;\n config: Partial<LuminaryIdpConfig>;\n };\n}\n\nexport function AuthGateProvider({\n children,\n tryRefresh,\n onReauthRequired,\n onSettled,\n overlay,\n}: AuthGateProviderProps) {\n useEffect(() => {\n authGate.configure({ tryRefresh, onReauthRequired, onSettled });\n }, [tryRefresh, onReauthRequired, onSettled]);\n\n const snapshot = useSyncExternalStore(authGate.subscribe, authGate.getSnapshot, authGate.getSnapshot);\n\n const value = useMemo<AuthGateContextValue>(\n () => ({\n snapshot,\n requestReauth: (message?: string) => authGate.requestReauth(message),\n completeReauth: () => authGate.completeReauth(),\n cancelReauth: (message?: string) => authGate.cancelReauth(message),\n }),\n [snapshot],\n );\n\n return (\n <AuthGateContext.Provider value={value}>\n {children}\n {overlay ? <ReauthOverlay {...overlay} /> : null}\n </AuthGateContext.Provider>\n );\n}\n\nexport function useAuthGate(): AuthGateContextValue {\n const ctx = useContext(AuthGateContext);\n if (!ctx) throw new Error(\"useAuthGate must be used within AuthGateProvider\");\n return ctx;\n}\n\n/** Optional hook — returns null outside provider (for shared API helpers). */\nexport function useAuthGateOptional(): AuthGateContextValue | null {\n return useContext(AuthGateContext);\n}\n","export interface PostLoginPathOptions {\n /** sessionStorage key (product-scoped), e.g. `dv:postLoginPath` */\n storageKey: string;\n /** Default destination when nothing remembered */\n defaultPath?: string;\n /** Extra paths that must not be used as return targets */\n unsafePrefixes?: string[];\n}\n\nconst DEFAULT_UNSAFE = [\"/login\", \"/auth\", \"/exception\"];\n\nfunction normalizeAppPath(path: string, fallback: string): string {\n const raw = path.replace(/^#/, \"\").trim();\n if (!raw) return fallback.startsWith(\"/\") ? fallback : `/${fallback}`;\n return raw.startsWith(\"/\") ? raw : `/${raw}`;\n}\n\nfunction isUnsafeReturnPath(path: string, unsafePrefixes: string[], fallback: string): boolean {\n const p = normalizeAppPath(path, fallback);\n if (p === \"/\") return true;\n return unsafePrefixes.some((prefix) => p === prefix || p.startsWith(`${prefix}/`) || p.startsWith(prefix));\n}\n\n/**\n * sessionStorage helpers for OIDC redirect return paths.\n * Product-specific ACL checks (e.g. 403 fallback) stay in the product.\n */\nexport function createPostLoginPathHelpers(options: PostLoginPathOptions) {\n const storageKey = options.storageKey;\n const defaultPath = options.defaultPath?.startsWith(\"/\")\n ? options.defaultPath\n : `/${options.defaultPath || \"home\"}`;\n const unsafePrefixes = [...DEFAULT_UNSAFE, ...(options.unsafePrefixes || [])];\n\n function rememberPostLoginPath(path: string): void {\n const normalized = normalizeAppPath(path, defaultPath);\n if (isUnsafeReturnPath(normalized, unsafePrefixes, defaultPath)) return;\n try {\n sessionStorage.setItem(storageKey, normalized);\n } catch {\n /* ignore */\n }\n }\n\n function peekPostLoginPath(): string | undefined {\n try {\n const v = sessionStorage.getItem(storageKey);\n if (!v || isUnsafeReturnPath(v, unsafePrefixes, defaultPath)) return undefined;\n return normalizeAppPath(v, defaultPath);\n } catch {\n return undefined;\n }\n }\n\n function consumePostLoginPath(fallback = defaultPath): string {\n const remembered = peekPostLoginPath();\n try {\n sessionStorage.removeItem(storageKey);\n } catch {\n /* ignore */\n }\n return remembered ?? normalizeAppPath(fallback, defaultPath);\n }\n\n return {\n rememberPostLoginPath,\n peekPostLoginPath,\n consumePostLoginPath,\n normalizeAppPath: (path: string) => normalizeAppPath(path, defaultPath),\n isUnsafeReturnPath: (path: string) => isUnsafeReturnPath(path, unsafePrefixes, defaultPath),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/hosted-oidc-experience-adapter.ts","../src/login-experience-adapter.ts","../src/register-policy.ts","../src/logto-experience-adapter.ts","../src/oidc-client.ts","../src/experience-client.ts","../src/auth-gate.ts","../src/LuminaryAuthProvider.tsx","../src/login-labels.ts","../src/HeadlessLoginPanel.module.scss","../src/HeadlessLoginPanel.tsx","../src/ReauthOverlay.tsx","../src/AuthGateProvider.tsx","../src/login-legal.ts","../src/LoginLanguageSwitcher.module.scss","../src/LoginLanguageSwitcher.tsx","../src/LoginCanvas.module.scss","../src/LoginCanvas.tsx","../src/post-login-path.ts"],"names":["WebStorageStateStore","UserManager","OidcClient","createContext","useMemo","useState","useCallback","useEffect","jsx","useContext","panel","brand","logo","product","title","subtitle","form","channelTabs","channelTab","channelTabActive","codeRow","codeInput","secondaryBtn","socialStack","input","passwordField","passwordInput","passwordToggle","primaryBtn","socialBtn","socialLogo","logoFallback","cancelBtn","divider","dividerLine","dividerText","hint","domainsHint","switchMode","switchModeBtn","error","consent","consentInvalid","consentError","consentLinks","footer","useRef","result","jsxs","Fragment","useSyncExternalStore","defaults","switch","trigger","icon","caret","menu","item","itemActive","onDark","useId","canvas","grid","lang","decor","slot","slotFill","storageKey"],"mappings":"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","file":"index.js","sourcesContent":["export interface LuminaryIdpConfig {\n /**\n * OIDC issuer. Prefer Auth Gateway (`http://localhost:3010/oidc`) so products\n * stay IdP-agnostic; direct Logto issuer is OK for local MVP.\n */\n issuer: string;\n clientId: string;\n redirectUri: string;\n /**\n * Popup OIDC callback. Defaults to `redirectUri` (same `/auth/callback`).\n * Must be registered on the IdP application.\n */\n popupRedirectUri?: string;\n postLogoutRedirectUri?: string;\n scopes?: string;\n /** API resource indicator (access token `aud`) */\n audience?: string;\n /** localStorage key for access token */\n tokenStorageKey?: string;\n /**\n * Logto Experience API base (no trailing slash), e.g. Auth Gateway\n * `http://localhost:3010` or direct Logto `http://localhost:3001`.\n * When set, Headless password sign-in is attempted before OIDC popup fallback.\n */\n experienceApiBase?: string;\n /**\n * IAM catalog id: `logto` (default Headless), `oidc` / `zitadel` (Hosted Redirect).\n * Ignored when `HeadlessLoginPanel` receives an explicit `experienceAdapter`.\n */\n iamProvider?: string;\n}\n\nexport interface LuminaryAuthSession {\n accessToken: string;\n idToken?: string;\n expiresAt?: number;\n profile?: Record<string, unknown>;\n}\n\nexport function isIdpConfigured(config: Partial<LuminaryIdpConfig>): config is LuminaryIdpConfig {\n return Boolean(config.issuer && config.clientId && config.redirectUri);\n}\n\n/** Resolve issuer from Auth Gateway base URL or direct IDP_ISSUER. */\nexport function resolveIssuer(env: Record<string, string | undefined>): string | undefined {\n // Prefer explicit IdP issuer so JWT `iss` validation matches Logto.\n // Auth Gateway is a CORS/proxy front — set via VITE_AUTH_EXPERIENCE_URL / VITE_AUTH_GATEWAY_URL.\n const explicit = env.VITE_IDP_ISSUER ?? env.PUBLIC_IDP_ISSUER ?? env.IDP_ISSUER;\n if (explicit) return explicit;\n const gateway = env.VITE_AUTH_GATEWAY_URL ?? env.PUBLIC_AUTH_GATEWAY_URL ?? env.AUTH_GATEWAY_URL;\n if (gateway) return `${gateway.replace(/\\/$/, \"\")}/oidc`;\n return undefined;\n}\n\n/** Derive Experience API host from Gateway URL or by stripping `/oidc` from issuer. */\nexport function resolveExperienceApiBase(env: Record<string, string | undefined>): string | undefined {\n const explicit =\n env.VITE_AUTH_EXPERIENCE_URL ??\n env.PUBLIC_AUTH_EXPERIENCE_URL ??\n env.AUTH_EXPERIENCE_URL;\n if (explicit) return explicit.replace(/\\/$/, \"\");\n\n const gateway = env.VITE_AUTH_GATEWAY_URL ?? env.PUBLIC_AUTH_GATEWAY_URL ?? env.AUTH_GATEWAY_URL;\n if (gateway) return gateway.replace(/\\/$/, \"\");\n\n const issuer = resolveIssuer(env);\n if (!issuer) return undefined;\n return issuer.replace(/\\/$/, \"\").replace(/\\/oidc$/i, \"\");\n}\n\nexport function readIdpConfigFromEnv(env: Record<string, string | undefined>): Partial<LuminaryIdpConfig> {\n const redirectUri = env.VITE_IDP_REDIRECT_URI ?? env.PUBLIC_IDP_REDIRECT_URI ?? \"\";\n return {\n issuer: resolveIssuer(env),\n clientId: env.VITE_IDP_CLIENT_ID ?? env.PUBLIC_IDP_CLIENT_ID,\n redirectUri,\n popupRedirectUri: env.VITE_IDP_POPUP_REDIRECT_URI ?? env.PUBLIC_IDP_POPUP_REDIRECT_URI ?? redirectUri,\n postLogoutRedirectUri: env.VITE_IDP_POST_LOGOUT_URI ?? env.PUBLIC_IDP_POST_LOGOUT_URI,\n scopes: env.VITE_IDP_SCOPES ?? env.PUBLIC_IDP_SCOPES ?? \"openid profile email offline_access\",\n audience: env.VITE_IDP_AUDIENCE ?? env.PUBLIC_IDP_AUDIENCE,\n tokenStorageKey: env.VITE_IDP_TOKEN_KEY ?? \"luminary_access_token\",\n experienceApiBase: resolveExperienceApiBase(env),\n iamProvider:\n env.VITE_IAM_PROVIDER ?? env.PUBLIC_IAM_PROVIDER ?? env.IAM_PROVIDER ?? env.IDP_MODE,\n };\n}\n","import type { LoginExperienceAdapter, LoginExperienceCapability } from \"./login-experience-adapter\";\n\n/**\n * Standard OIDC Hosted Redirect adapter.\n *\n * Used for enterprise OIDC and reserved IAM plugins (ZITADEL) that have no\n * shipped Headless Experience API. Password and social stay on the IdP hosted UI.\n */\nexport class HostedOidcExperienceAdapter implements LoginExperienceAdapter {\n readonly capabilities: readonly LoginExperienceCapability[] = [];\n\n constructor(readonly provider = \"hosted\") {}\n}\n","import { HostedOidcExperienceAdapter } from \"./hosted-oidc-experience-adapter\";\nimport { LogtoExperienceAdapter } from \"./logto-experience-adapter\";\n\n/**\n * Capabilities exposed by a headless login-experience provider.\n *\n * Consumers can use these flags to avoid assuming that every provider supports\n * Logto's password, connector-discovery, or direct social-login flows.\n */\nexport const LOGIN_EXPERIENCE_CAPABILITIES = {\n passwordSignIn: \"password-sign-in\",\n /** Username + password self-register via Experience (Logto NewPasswordIdentity). */\n passwordSignUp: \"password-sign-up\",\n /** Email + verification code + password self-register. */\n emailCodeSignUp: \"email-code-sign-up\",\n socialConnectors: \"social-connectors\",\n socialDirectSignIn: \"social-direct-sign-in\",\n} as const;\n\nexport type LoginExperienceCapability =\n (typeof LOGIN_EXPERIENCE_CAPABILITIES)[keyof typeof LOGIN_EXPERIENCE_CAPABILITIES];\n\nexport type ExperienceIdentifierType = \"email\" | \"username\" | \"phone\";\n\nexport interface ExperiencePasswordSignInInput {\n /** Experience API origin (no trailing slash). Prefer SPA origin when proxied. */\n apiBase: string;\n identifier: string;\n password: string;\n identifierType?: ExperienceIdentifierType;\n /** Required to bootstrap the OIDC interaction cookie before Experience calls. */\n issuer?: string;\n clientId?: string;\n redirectUri?: string;\n audience?: string;\n scopes?: string;\n /** Carried in OIDC state for post-login return (UserManager PKCE). */\n returnUrl?: string;\n}\n\nexport interface ExperiencePasswordSignInResult {\n /** Continue URL from Experience submit (complete OIDC interaction). */\n redirectTo?: string;\n /** Password succeeded, but Logto still requires an authenticator code. */\n mfaRequired?: boolean;\n raw?: unknown;\n}\n\nexport interface ExperienceMfaTotpInput {\n apiBase: string;\n code: string;\n}\n\n/** Same OIDC bootstrap fields as sign-in; username must match Logto username rules. */\nexport type ExperiencePasswordSignUpInput = ExperiencePasswordSignInInput & {\n /** Optional CAPTCHA token for Logto bot protection (Turnstile / reCAPTCHA). */\n captchaToken?: string;\n};\n\nexport type ExperiencePasswordSignUpResult = ExperiencePasswordSignInResult;\n\nexport interface ExperienceEmailSignUpSendCodeInput {\n apiBase: string;\n email: string;\n /** @deprecated alias of email */\n identifier?: string;\n captchaToken?: string;\n issuer?: string;\n clientId?: string;\n redirectUri?: string;\n audience?: string;\n scopes?: string;\n returnUrl?: string;\n}\n\nexport interface ExperienceEmailSignUpSendCodeResult {\n verificationId: string;\n}\n\nexport interface ExperienceEmailSignUpCompleteInput {\n apiBase: string;\n email: string;\n password: string;\n code: string;\n verificationId: string;\n identifier?: string;\n captchaToken?: string;\n issuer?: string;\n clientId?: string;\n redirectUri?: string;\n audience?: string;\n scopes?: string;\n returnUrl?: string;\n}\n\nexport interface ExperienceSocialConnector {\n id: string;\n target: string;\n name: string;\n logo?: string;\n}\n\nexport interface FetchSocialConnectorsInput {\n /** Same origin as Experience / IdP (e.g. SPA proxy or http://localhost:3001). */\n apiBase: string;\n appId?: string;\n}\n\nexport interface SocialSignInRequest {\n /** Provider-specific authorize parameters, passed through by the OIDC client. */\n extraQueryParams?: Record<string, string>;\n}\n\n/**\n * Provider boundary for non-standard login-experience APIs.\n *\n * Standard OIDC redirect/popup and PKCE handling intentionally remain in the\n * OIDC client. Only provider-specific Experience operations belong here.\n */\nexport interface LoginExperienceAdapter {\n readonly provider: string;\n readonly capabilities: readonly LoginExperienceCapability[];\n experiencePasswordSignIn?(\n input: ExperiencePasswordSignInInput,\n ): Promise<ExperiencePasswordSignInResult>;\n /** Finish a pending TOTP challenge on the current Experience session, then submit. */\n experienceVerifyTotp?(input: ExperienceMfaTotpInput): Promise<ExperiencePasswordSignInResult>;\n /**\n * Self-register with username + password (Logto Register + NewPasswordIdentity).\n * Email/phone sign-up needs verification codes — not covered by this method.\n */\n experiencePasswordSignUp?(\n input: ExperiencePasswordSignUpInput,\n ): Promise<ExperiencePasswordSignUpResult>;\n sendRegisterEmailCode?(\n input: ExperienceEmailSignUpSendCodeInput,\n ): Promise<ExperienceEmailSignUpSendCodeResult>;\n experienceEmailPasswordSignUp?(\n input: ExperienceEmailSignUpCompleteInput,\n ): Promise<ExperiencePasswordSignUpResult>;\n fetchSocialConnectors?(\n input: FetchSocialConnectorsInput,\n ): Promise<ExperienceSocialConnector[]>;\n createSocialSignInRequest?(target: string): SocialSignInRequest;\n}\n\nexport type LoginExperienceProvider = \"logto\" | \"hosted\" | \"oidc\" | \"zitadel\" | (string & {});\n\nconst HOSTED_LOGIN_PROVIDERS = new Set([\"hosted\", \"oidc\", \"external_oidc\", \"zitadel\"]);\n\nfunction normalizeLoginExperienceProvider(provider: string): \"logto\" | \"hosted\" {\n const key = provider.trim().toLowerCase();\n if (!key || key === \"logto\") return \"logto\";\n if (HOSTED_LOGIN_PROVIDERS.has(key)) return \"hosted\";\n throw new Error(\n `Unknown login experience provider \"${provider}\". Shipped: logto (default). Hosted OIDC: oidc / hosted / zitadel.`,\n );\n}\n\n/**\n * Factory for built-in login adapters.\n *\n * - `logto`: Experience API Headless (password + social connectors)\n * - `hosted` / `oidc` / `zitadel`: standard OIDC Hosted Redirect (no empty vendor SDK)\n *\n * Products may still pass a custom `LoginExperienceAdapter`. Do not add stub\n * adapters for unintegrated Headless APIs.\n */\nexport function createLoginExperienceAdapter(\n provider: LoginExperienceProvider = \"logto\",\n): LoginExperienceAdapter {\n const kind = normalizeLoginExperienceProvider(provider);\n if (kind === \"logto\") return new LogtoExperienceAdapter();\n return new HostedOidcExperienceAdapter(provider.trim().toLowerCase() || \"hosted\");\n}\n\nconst adapterCache = new Map<string, LoginExperienceAdapter>();\n\n/**\n * Resolve an explicit product adapter, or the catalog adapter for `iamProvider`.\n * Defaults to Logto for backward compatibility.\n */\nexport function resolveLoginExperienceAdapter(\n adapter?: LoginExperienceAdapter | null,\n iamProvider?: string | null,\n): LoginExperienceAdapter {\n if (adapter) return adapter;\n const key = iamProvider?.trim() || \"logto\";\n const cached = adapterCache.get(key);\n if (cached) return cached;\n const created = createLoginExperienceAdapter(key);\n adapterCache.set(key, created);\n return created;\n}\n\n/** `VITE_IAM_PROVIDER` / `IAM_PROVIDER` / older `IDP_MODE`. */\nexport function resolveLoginExperienceProviderFromEnv(\n env: Record<string, string | undefined> = {},\n): LoginExperienceProvider {\n return env.VITE_IAM_PROVIDER ?? env.PUBLIC_IAM_PROVIDER ?? env.IAM_PROVIDER ?? env.IDP_MODE ?? \"logto\";\n}\n","/**\n * Self-register email policy for early ToC / hosted SaaS.\n *\n * Why allowlist: disposable / game / temporary mailboxes drive bot farms and\n * verification-email cost. Early stage: only well-known consumer providers.\n * Enterprise / private: set mode `off` or extend allowlist with corporate domains.\n */\n\n/** Popular consumer inboxes (CN + global). Lowercase host only. */\nexport const DEFAULT_REGISTER_EMAIL_ALLOWLIST: readonly string[] = [\n // Google\n \"gmail.com\",\n \"googlemail.com\",\n // Tencent / QQ\n \"qq.com\",\n \"foxmail.com\",\n // NetEase\n \"163.com\",\n \"126.com\",\n \"yeah.net\",\n // Microsoft\n \"outlook.com\",\n \"hotmail.com\",\n \"live.com\",\n \"msn.com\",\n // Apple\n \"icloud.com\",\n \"me.com\",\n \"mac.com\",\n // Yahoo\n \"yahoo.com\",\n \"yahoo.co.jp\",\n // Proton\n \"proton.me\",\n \"protonmail.com\",\n // Others commonly used by real users\n \"sina.com\",\n \"sina.cn\",\n \"aliyun.com\",\n \"139.com\",\n];\n\n/** Common disposable / throwaway hosts (used when mode is blocklist or as extra deny). */\nexport const DEFAULT_DISPOSABLE_EMAIL_BLOCKLIST: readonly string[] = [\n \"mailinator.com\",\n \"guerrillamail.com\",\n \"guerrillamail.net\",\n \"10minutemail.com\",\n \"tempmail.com\",\n \"temp-mail.org\",\n \"yopmail.com\",\n \"trashmail.com\",\n \"sharklasers.com\",\n \"getnada.com\",\n \"maildrop.cc\",\n \"discard.email\",\n \"mailnesia.com\",\n];\n\nexport type RegisterEmailMode = \"allowlist\" | \"blocklist\" | \"off\";\n\nexport interface RegisterEmailPolicy {\n mode: RegisterEmailMode;\n allowlist: readonly string[];\n blocklist: readonly string[];\n}\n\nexport interface RegisterEmailPolicyInput {\n mode?: string | null;\n allowlist?: string | readonly string[] | null;\n blocklist?: string | readonly string[] | null;\n}\n\nfunction parseList(raw: string | readonly string[] | null | undefined): string[] {\n if (!raw) return [];\n const parts = Array.isArray(raw) ? raw : String(raw).split(/[\\s,;]+/);\n return [\n ...new Set(\n parts\n .map((s) => s.trim().toLowerCase().replace(/^@/, \"\"))\n .filter(Boolean),\n ),\n ];\n}\n\nexport function normalizeRegisterEmailMode(raw: string | null | undefined): RegisterEmailMode {\n const key = (raw || \"allowlist\").trim().toLowerCase();\n if (key === \"off\" || key === \"false\" || key === \"0\" || key === \"disabled\") return \"off\";\n if (key === \"blocklist\" || key === \"deny\" || key === \"blacklist\") return \"blocklist\";\n return \"allowlist\";\n}\n\nexport function resolveRegisterEmailPolicy(input: RegisterEmailPolicyInput = {}): RegisterEmailPolicy {\n const mode = normalizeRegisterEmailMode(input.mode);\n const allowlist = parseList(input.allowlist);\n const blocklist = parseList(input.blocklist);\n return {\n mode,\n allowlist: allowlist.length ? allowlist : DEFAULT_REGISTER_EMAIL_ALLOWLIST,\n blocklist: blocklist.length ? blocklist : DEFAULT_DISPOSABLE_EMAIL_BLOCKLIST,\n };\n}\n\n/** Read VITE_/PUBLIC_/AUTH_REGISTER_* from a static env map (bundler-safe). */\nexport function readRegisterEmailPolicyFromEnv(\n env: Record<string, string | undefined> = {},\n): RegisterEmailPolicy {\n return resolveRegisterEmailPolicy({\n mode:\n env.VITE_AUTH_REGISTER_EMAIL_MODE ||\n env.PUBLIC_AUTH_REGISTER_EMAIL_MODE ||\n env.NEXT_PUBLIC_AUTH_REGISTER_EMAIL_MODE ||\n env.AUTH_REGISTER_EMAIL_MODE,\n allowlist:\n env.VITE_AUTH_REGISTER_EMAIL_ALLOWLIST ||\n env.PUBLIC_AUTH_REGISTER_EMAIL_ALLOWLIST ||\n env.NEXT_PUBLIC_AUTH_REGISTER_EMAIL_ALLOWLIST ||\n env.AUTH_REGISTER_EMAIL_ALLOWLIST,\n blocklist:\n env.VITE_AUTH_REGISTER_EMAIL_BLOCKLIST ||\n env.PUBLIC_AUTH_REGISTER_EMAIL_BLOCKLIST ||\n env.NEXT_PUBLIC_AUTH_REGISTER_EMAIL_BLOCKLIST ||\n env.AUTH_REGISTER_EMAIL_BLOCKLIST,\n });\n}\n\nexport function emailDomain(email: string): string | null {\n const trimmed = email.trim().toLowerCase();\n const at = trimmed.lastIndexOf(\"@\");\n if (at <= 0 || at === trimmed.length - 1) return null;\n if (trimmed.includes(\" \") || trimmed.indexOf(\"@\") !== at) return null;\n return trimmed.slice(at + 1);\n}\n\nexport function isValidEmailShape(email: string): boolean {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email.trim());\n}\n\nexport type RegisterEmailDecision =\n | { ok: true; domain: string }\n | { ok: false; reason: \"invalid\" | \"not_allowed\" | \"disposable\"; domain?: string };\n\n/**\n * Enforce register email policy. `off` still rejects disposable hosts when\n * `blocklist` is non-empty (defense in depth); pass `blocklist: []` to disable.\n */\nexport function evaluateRegisterEmail(\n email: string,\n policy: RegisterEmailPolicy = resolveRegisterEmailPolicy(),\n): RegisterEmailDecision {\n if (!isValidEmailShape(email)) return { ok: false, reason: \"invalid\" };\n const domain = emailDomain(email);\n if (!domain) return { ok: false, reason: \"invalid\" };\n\n if (policy.blocklist.includes(domain)) {\n return { ok: false, reason: \"disposable\", domain };\n }\n\n if (policy.mode === \"off\") return { ok: true, domain };\n\n if (policy.mode === \"blocklist\") return { ok: true, domain };\n\n if (!policy.allowlist.includes(domain)) {\n return { ok: false, reason: \"not_allowed\", domain };\n }\n return { ok: true, domain };\n}\n\nexport function registerEmailRejectionMessage(decision: RegisterEmailDecision): string {\n if (decision.ok) return \"\";\n if (decision.reason === \"invalid\") return \"Enter a valid email address\";\n if (decision.reason === \"disposable\") {\n return \"Temporary or disposable email addresses are not allowed\";\n }\n return \"This email provider is not accepted for self-registration. Use Gmail, Outlook, QQ, 163, iCloud, or another allowed provider — or sign in with Google / GitHub.\";\n}\n\n/**\n * Human-readable domain list for the register form (allowlist mode only).\n * Returns null when domains are not restricted to an allowlist.\n */\nexport function formatAllowedEmailDomains(\n policy: RegisterEmailPolicy,\n options?: { max?: number },\n): string | null {\n if (policy.mode !== \"allowlist\") return null;\n const list = [...policy.allowlist].map((d) => d.toLowerCase()).filter(Boolean);\n if (!list.length) return null;\n const max = options?.max ?? 16;\n const shown = list.slice(0, max);\n const rest = list.length - shown.length;\n const body = shown.join(\", \");\n return rest > 0 ? `${body}, +${rest} more` : body;\n}\n\n/** Short policy note under the email field on the register form. */\nexport function registerEmailDomainsHint(\n policy: RegisterEmailPolicy,\n labels?: {\n allowedDomainsPrefix?: string;\n allowedDomainsOpen?: string;\n allowedDomainsBlocklist?: string;\n },\n): string | null {\n const prefix = labels?.allowedDomainsPrefix ?? \"Allowed email domains\";\n const formatted = formatAllowedEmailDomains(policy);\n if (formatted) return `${prefix}: ${formatted}`;\n if (policy.mode === \"blocklist\") {\n return (\n labels?.allowedDomainsBlocklist ??\n \"Most email providers are accepted. Temporary / disposable addresses are blocked.\"\n );\n }\n if (policy.mode === \"off\" && policy.blocklist.length > 0) {\n return (\n labels?.allowedDomainsBlocklist ??\n \"Most email providers are accepted. Temporary / disposable addresses are blocked.\"\n );\n }\n return (\n labels?.allowedDomainsOpen ?? \"Email registration is open for most providers.\"\n );\n}\n\n/** Public policy document from Auth Gateway `GET /api/register-policy`. */\nexport interface PublicRegisterPolicyResponse {\n mode?: string;\n allowlist?: string[];\n blocklist?: string[];\n ipDailyLimit?: number;\n codeHourlyLimit?: number;\n enabled?: boolean;\n}\n\n/**\n * Fetch live register policy from Auth Gateway (or any host that serves `/api/register-policy`).\n * Falls back to built-in defaults when the endpoint is missing.\n */\nexport async function fetchRegisterEmailPolicy(\n apiBase: string,\n init?: RequestInit,\n): Promise<RegisterEmailPolicy> {\n const base = apiBase.replace(/\\/$/, \"\");\n try {\n const res = await fetch(`${base}/api/register-policy`, {\n credentials: \"omit\",\n headers: { Accept: \"application/json\" },\n ...init,\n });\n if (!res.ok) return resolveRegisterEmailPolicy();\n const data = (await res.json()) as PublicRegisterPolicyResponse;\n return resolveRegisterEmailPolicy({\n mode: data.mode,\n allowlist: data.allowlist,\n blocklist: data.blocklist,\n });\n } catch {\n return resolveRegisterEmailPolicy();\n }\n}\n","/**\n * Logto Experience API (Headless) adapter.\n * Prefer same-origin Experience base (SPA proxies /api/experience) so cookies\n * work on HTTP localhost.\n */\n\nimport { prepareSignInRequestUrl } from \"./oidc-client\";\nimport {\n LOGIN_EXPERIENCE_CAPABILITIES,\n type ExperienceEmailSignUpCompleteInput,\n type ExperienceEmailSignUpSendCodeInput,\n type ExperienceEmailSignUpSendCodeResult,\n type ExperienceIdentifierType,\n type ExperienceMfaTotpInput,\n type ExperiencePasswordSignInInput,\n type ExperiencePasswordSignInResult,\n type ExperiencePasswordSignUpInput,\n type ExperiencePasswordSignUpResult,\n type ExperienceSocialConnector,\n type FetchSocialConnectorsInput,\n type LoginExperienceAdapter,\n type LoginExperienceCapability,\n type SocialSignInRequest,\n} from \"./login-experience-adapter\";\nimport {\n evaluateRegisterEmail,\n registerEmailRejectionMessage,\n resolveRegisterEmailPolicy,\n type RegisterEmailPolicy,\n} from \"./register-policy\";\nimport type { LuminaryIdpConfig } from \"./types\";\n\n/** Logto username pattern for NewPasswordIdentity (see Experience API docs). */\nconst LOGTO_USERNAME_RE = /^[A-Za-z_]\\w*$/;\n\nexport function isLogtoRegisterUsername(value: string): boolean {\n return LOGTO_USERNAME_RE.test(value.trim());\n}\n\nfunction experienceUrl(apiBase: string, path: string): string {\n return `${apiBase.replace(/\\/$/, \"\")}/api/experience${path}`;\n}\n\nexport class ExperienceApiError extends Error {\n readonly status: number;\n readonly code: string;\n\n constructor(status: number, code: string, message: string) {\n super(message);\n this.name = \"ExperienceApiError\";\n this.status = status;\n this.code = code;\n }\n}\n\nconst MFA_REQUIRED_CODE = \"session.mfa.require_mfa_verification\";\n\nexport function isMfaVerificationRequired(error: unknown): boolean {\n return error instanceof ExperienceApiError && error.code === MFA_REQUIRED_CODE;\n}\n\nasync function experienceFetch<T>(apiBase: string, path: string, init: RequestInit): Promise<T> {\n const res = await fetch(experienceUrl(apiBase, path), {\n credentials: \"include\",\n ...init,\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...(init.headers ?? {}),\n },\n });\n const text = await res.text();\n let data: unknown = null;\n if (text) {\n try {\n data = JSON.parse(text) as unknown;\n } catch {\n data = text;\n }\n }\n if (!res.ok) {\n const body = data && typeof data === \"object\" && data !== null ? (data as { code?: unknown; message?: unknown }) : null;\n const code = typeof body?.code === \"string\" ? body.code : \"\";\n const msg = typeof body?.message === \"string\" ? body.message : `Experience API ${res.status}`;\n throw new ExperienceApiError(res.status, code, msg);\n }\n return data as T;\n}\n\nfunction guessIdentifierType(identifier: string): ExperienceIdentifierType {\n if (identifier.includes(\"@\")) return \"email\";\n if (/^\\+?\\d{6,}$/.test(identifier.trim())) return \"phone\";\n return \"username\";\n}\n\n/**\n * Force authorize onto the Experience/SPA origin so Set-Cookie lands on the\n * same host as subsequent `/api/experience` calls (dev proxy strips Domain).\n */\nexport function sameOriginAuthorizeUrl(authorizeUrl: string, apiBase: string): string {\n const u = new URL(authorizeUrl);\n const base = new URL(apiBase);\n if (u.origin === base.origin) return authorizeUrl;\n return `${base.origin}${u.pathname}${u.search}${u.hash}`;\n}\n\n/**\n * Logto creates its interaction cookie after an authorize request. The\n * standard OIDC client creates and persists the PKCE request; this adapter only\n * applies Logto's same-origin interaction bootstrap.\n */\nasync function bootstrapOidcInteraction(input: ExperiencePasswordSignInInput): Promise<void> {\n if (!input.issuer || !input.clientId || !input.redirectUri) return;\n if (typeof document === \"undefined\") return;\n\n const config: LuminaryIdpConfig = {\n issuer: input.issuer,\n clientId: input.clientId,\n redirectUri: input.redirectUri,\n audience: input.audience,\n scopes: input.scopes,\n experienceApiBase: input.apiBase,\n };\n\n const signinUrl = await prepareSignInRequestUrl(config, {\n returnUrl: input.returnUrl,\n });\n const authorizeUrl = sameOriginAuthorizeUrl(signinUrl, input.apiBase);\n\n await new Promise<void>((resolve) => {\n const iframe = document.createElement(\"iframe\");\n iframe.setAttribute(\"aria-hidden\", \"true\");\n iframe.tabIndex = -1;\n iframe.style.cssText = \"position:absolute;width:0;height:0;border:0;visibility:hidden\";\n let settled = false;\n const finish = () => {\n if (settled) return;\n settled = true;\n iframe.remove();\n resolve();\n };\n iframe.addEventListener(\"load\", () => {\n window.setTimeout(finish, 400);\n });\n iframe.src = authorizeUrl;\n document.body.appendChild(iframe);\n window.setTimeout(finish, 2500);\n });\n}\n\n/** Build Logto's provider-specific direct sign-in authorize parameter. */\nexport function createLogtoDirectSignInRequest(directSignIn: string): SocialSignInRequest {\n return { extraQueryParams: { direct_sign_in: directSignIn } };\n}\n\n/** Built-in adapter for Logto's non-standard Experience API. */\nexport class LogtoExperienceAdapter implements LoginExperienceAdapter {\n readonly provider = \"logto\";\n readonly capabilities: readonly LoginExperienceCapability[] = [\n LOGIN_EXPERIENCE_CAPABILITIES.passwordSignIn,\n LOGIN_EXPERIENCE_CAPABILITIES.passwordSignUp,\n LOGIN_EXPERIENCE_CAPABILITIES.emailCodeSignUp,\n LOGIN_EXPERIENCE_CAPABILITIES.socialConnectors,\n LOGIN_EXPERIENCE_CAPABILITIES.socialDirectSignIn,\n ];\n\n emailPolicy: RegisterEmailPolicy = resolveRegisterEmailPolicy();\n\n async experiencePasswordSignIn(\n input: ExperiencePasswordSignInInput,\n ): Promise<ExperiencePasswordSignInResult> {\n const { apiBase, identifier, password } = input;\n await bootstrapOidcInteraction(input);\n\n const primary = input.identifierType ?? guessIdentifierType(identifier);\n const alternates: ExperienceIdentifierType[] =\n primary === \"phone\"\n ? [primary]\n : primary === \"email\"\n ? [\"email\", \"username\"]\n : [\"username\", \"email\"];\n\n let lastError: Error | undefined;\n for (const identifierType of alternates) {\n try {\n await experienceFetch(apiBase, \"\", {\n method: \"PUT\",\n body: JSON.stringify({ interactionEvent: \"SignIn\" }),\n });\n\n const verified = await experienceFetch<{ verificationId?: string }>(\n apiBase,\n \"/verification/password\",\n {\n method: \"POST\",\n body: JSON.stringify({\n identifier: { type: identifierType, value: identifier },\n password,\n }),\n },\n );\n\n const verificationId = verified?.verificationId;\n if (!verificationId) {\n throw new Error(\"Experience API did not return verificationId\");\n }\n\n await experienceFetch(apiBase, \"/identification\", {\n method: \"POST\",\n body: JSON.stringify({ verificationId }),\n });\n\n try {\n const submitted = await experienceFetch<{ redirectTo?: string }>(\n apiBase,\n \"/submit\",\n {\n method: \"POST\",\n body: JSON.stringify({}),\n },\n );\n return { redirectTo: submitted?.redirectTo, raw: submitted };\n } catch (error) {\n if (isMfaVerificationRequired(error)) {\n return { mfaRequired: true };\n }\n throw error;\n }\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n }\n }\n throw lastError ?? new Error(\"Experience password sign-in failed\");\n }\n\n /** Verify the user's existing authenticator code, then submit the interaction. */\n async experienceVerifyTotp(input: ExperienceMfaTotpInput): Promise<ExperiencePasswordSignInResult> {\n const code = input.code.trim();\n if (!code) {\n throw new Error(\"Authenticator code is required\");\n }\n await experienceFetch(input.apiBase, \"/verification/totp/verify\", {\n method: \"POST\",\n body: JSON.stringify({ code }),\n });\n const submitted = await experienceFetch<{ redirectTo?: string }>(input.apiBase, \"/submit\", {\n method: \"POST\",\n body: JSON.stringify({}),\n });\n return { redirectTo: submitted?.redirectTo, raw: submitted };\n }\n\n /**\n * Register with username + password via NewPasswordIdentity.\n * Email/phone self-register requires verification codes — use social or invite instead.\n */\n async experiencePasswordSignUp(\n input: ExperiencePasswordSignUpInput,\n ): Promise<ExperiencePasswordSignUpResult> {\n const { apiBase, identifier, password } = input;\n const username = identifier.trim();\n if (!isLogtoRegisterUsername(username)) {\n throw new Error(\n \"Register with a username (letters, digits, underscore; start with a letter or _). Use social login for email-based accounts.\",\n );\n }\n if (!password || password.length < 8) {\n throw new Error(\"Password must be at least 8 characters\");\n }\n\n await bootstrapOidcInteraction(input);\n\n await experienceFetch(apiBase, \"\", {\n method: \"PUT\",\n body: JSON.stringify({\n interactionEvent: \"Register\",\n ...(input.captchaToken ? { captchaToken: input.captchaToken } : {}),\n }),\n });\n\n const verified = await experienceFetch<{ verificationId?: string }>(\n apiBase,\n \"/verification/new-password-identity\",\n {\n method: \"POST\",\n body: JSON.stringify({\n identifier: { type: \"username\", value: username },\n password,\n }),\n },\n );\n\n const verificationId = verified?.verificationId;\n if (!verificationId) {\n throw new Error(\"Experience API did not return verificationId\");\n }\n\n await experienceFetch(apiBase, \"/identification\", {\n method: \"POST\",\n body: JSON.stringify({ verificationId }),\n });\n\n const submitted = await experienceFetch<{ redirectTo?: string }>(apiBase, \"/submit\", {\n method: \"POST\",\n body: JSON.stringify({}),\n });\n\n return { redirectTo: submitted?.redirectTo, raw: submitted };\n }\n\n async sendRegisterEmailCode(\n input: ExperienceEmailSignUpSendCodeInput,\n ): Promise<ExperienceEmailSignUpSendCodeResult> {\n const email = (input.email || input.identifier || \"\").trim().toLowerCase();\n const decision = evaluateRegisterEmail(email, this.emailPolicy);\n if (!decision.ok) {\n throw new Error(registerEmailRejectionMessage(decision));\n }\n\n await bootstrapOidcInteraction({\n apiBase: input.apiBase,\n identifier: email,\n password: \"\",\n issuer: input.issuer,\n clientId: input.clientId,\n redirectUri: input.redirectUri,\n audience: input.audience,\n scopes: input.scopes,\n returnUrl: input.returnUrl,\n });\n\n await experienceFetch(input.apiBase, \"\", {\n method: \"PUT\",\n body: JSON.stringify({\n interactionEvent: \"Register\",\n ...(input.captchaToken ? { captchaToken: input.captchaToken } : {}),\n }),\n });\n\n const sent = await experienceFetch<{ verificationId?: string }>(\n input.apiBase,\n \"/verification/verification-code\",\n {\n method: \"POST\",\n body: JSON.stringify({\n identifier: { type: \"email\", value: email },\n interactionEvent: \"Register\",\n }),\n },\n );\n\n if (!sent?.verificationId) {\n throw new Error(\"Experience API did not return verificationId for email code\");\n }\n return { verificationId: sent.verificationId };\n }\n\n async experienceEmailPasswordSignUp(\n input: ExperienceEmailSignUpCompleteInput,\n ): Promise<ExperiencePasswordSignUpResult> {\n const email = (input.email || input.identifier || \"\").trim().toLowerCase();\n const decision = evaluateRegisterEmail(email, this.emailPolicy);\n if (!decision.ok) {\n throw new Error(registerEmailRejectionMessage(decision));\n }\n if (!input.password || input.password.length < 8) {\n throw new Error(\"Password must be at least 8 characters\");\n }\n if (!input.code?.trim() || !input.verificationId?.trim()) {\n throw new Error(\"Email verification code is required\");\n }\n\n // Continue the Register interaction created by sendRegisterEmailCode — do not PUT Register again.\n\n const verified = await experienceFetch<{ verificationId?: string }>(\n input.apiBase,\n \"/verification/verification-code/verify\",\n {\n method: \"POST\",\n body: JSON.stringify({\n identifier: { type: \"email\", value: email },\n verificationId: input.verificationId,\n code: input.code.trim(),\n }),\n },\n );\n\n const codeVerificationId = verified?.verificationId || input.verificationId;\n\n try {\n await experienceFetch(input.apiBase, \"/identification\", {\n method: \"POST\",\n body: JSON.stringify({ verificationId: codeVerificationId }),\n });\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n if (!/missing_profile/i.test(msg)) {\n // Logto returns missing_profile when password is still required — continue.\n // Other errors (already in use, etc.) must surface.\n if (!/422|password|profile/i.test(msg)) {\n throw error instanceof Error ? error : new Error(msg);\n }\n }\n }\n\n await experienceFetch(input.apiBase, \"/profile\", {\n method: \"POST\",\n body: JSON.stringify({ type: \"password\", value: input.password }),\n });\n\n await experienceFetch(input.apiBase, \"/identification\", {\n method: \"POST\",\n body: JSON.stringify({}),\n });\n\n const submitted = await experienceFetch<{ redirectTo?: string }>(input.apiBase, \"/submit\", {\n method: \"POST\",\n body: JSON.stringify({}),\n });\n\n return { redirectTo: submitted?.redirectTo, raw: submitted };\n }\n\n async fetchSocialConnectors(\n input: FetchSocialConnectorsInput,\n ): Promise<ExperienceSocialConnector[]> {\n const url = new URL(`${input.apiBase.replace(/\\/$/, \"\")}/api/.well-known/sign-in-exp`);\n if (input.appId?.trim()) url.searchParams.set(\"appId\", input.appId.trim());\n const res = await fetch(url.toString(), {\n // Public metadata — omit cookies so browsers do not require credentialed CORS.\n credentials: \"omit\",\n headers: { Accept: \"application/json\" },\n });\n if (!res.ok) {\n throw new Error(`sign-in-exp ${res.status}`);\n }\n const data = (await res.json()) as {\n socialConnectors?: Array<{\n id?: string;\n target?: string;\n name?: string | Record<string, string>;\n logo?: string;\n }>;\n };\n return (data.socialConnectors ?? [])\n .filter(\n (\n connector,\n ): connector is {\n id: string;\n target: string;\n name?: string | Record<string, string>;\n logo?: string;\n } => Boolean(connector?.id && connector?.target),\n )\n .map((connector) => ({\n id: connector.id,\n target: connector.target,\n name: localizeName(connector.name) || titleCase(connector.target),\n logo: connector.logo,\n }));\n }\n\n createSocialSignInRequest(target: string): SocialSignInRequest {\n return createLogtoDirectSignInRequest(`social:${target}`);\n }\n}\n\nfunction localizeName(name: string | Record<string, string> | undefined): string {\n if (!name) return \"\";\n if (typeof name === \"string\") return name;\n return name[\"zh-CN\"] || name.en || Object.values(name)[0] || \"\";\n}\n\nfunction titleCase(target: string): string {\n if (!target) return \"\";\n return target.charAt(0).toUpperCase() + target.slice(1);\n}\n","import {\n OidcClient,\n UserManager,\n WebStorageStateStore,\n type User,\n} from \"oidc-client-ts\";\nimport { createLogtoDirectSignInRequest } from \"./logto-experience-adapter\";\nimport type { LuminaryAuthSession, LuminaryIdpConfig } from \"./types\";\n\nlet manager: UserManager | null = null;\n\nfunction storageKey(config: LuminaryIdpConfig): string {\n return config.tokenStorageKey ?? \"luminary_access_token\";\n}\n\nfunction popupRedirectUri(config: LuminaryIdpConfig): string {\n return config.popupRedirectUri ?? config.redirectUri;\n}\n\nfunction sharedStateStore() {\n // localStorage so popup/redirect/Experience callback windows can resolve PKCE state.\n return new WebStorageStateStore({ store: window.localStorage });\n}\n\nfunction clientSettings(config: LuminaryIdpConfig) {\n const resource = config.audience?.trim() || undefined;\n return {\n authority: config.issuer.replace(/\\/$/, \"\"),\n metadataUrl: resolveOidcMetadataUrl(config),\n client_id: config.clientId,\n redirect_uri: config.redirectUri,\n post_logout_redirect_uri: config.postLogoutRedirectUri ?? config.redirectUri,\n response_type: \"code\" as const,\n scope: config.scopes ?? \"openid profile email offline_access\",\n stateStore: sharedStateStore(),\n extraQueryParams: resource ? { resource } : undefined,\n extraTokenParams: resource ? { resource } : undefined,\n };\n}\n\nfunction userManagerSettings(config: LuminaryIdpConfig) {\n const resource = config.audience?.trim() || undefined;\n return {\n ...clientSettings(config),\n popup_redirect_uri: popupRedirectUri(config),\n automaticSilentRenew: true,\n loadUserInfo: !resource,\n userStore: sharedStateStore(),\n };\n}\n\nexport function createUserManager(config: LuminaryIdpConfig): UserManager {\n if (manager) return manager;\n manager = new UserManager(userManagerSettings(config));\n return manager;\n}\n\n/**\n * When Experience/Gateway base differs from the IdP issuer origin, fetch OIDC discovery\n * via the gateway (CORS) while keeping `authority` = Logto issuer (JWT `iss`).\n */\nfunction resolveOidcMetadataUrl(config: LuminaryIdpConfig): string | undefined {\n const proxyBase = config.experienceApiBase?.replace(/\\/$/, \"\");\n if (!proxyBase) return undefined;\n try {\n if (new URL(proxyBase).origin === new URL(config.issuer).origin) return undefined;\n } catch {\n return undefined;\n }\n return `${proxyBase}/oidc/.well-known/openid-configuration`;\n}\n\nexport function resetUserManager(): void {\n manager = null;\n}\n\nexport interface SignInOptions {\n returnUrl?: string;\n /** Provider-specific authorize parameters supplied by an experience adapter. */\n extraQueryParams?: Record<string, string>;\n /**\n * Logto direct sign-in, e.g. `social:google` / `social:github` / `sso:<connectorId>`.\n * Skips the hosted password page and opens the provider immediately.\n * @deprecated Prefer a LoginExperienceAdapter, which supplies extraQueryParams.\n */\n directSignIn?: string;\n}\n\nfunction signInArgs(config: LuminaryIdpConfig, options?: SignInOptions | string) {\n const normalized: SignInOptions =\n typeof options === \"string\" ? { returnUrl: options } : (options ?? {});\n const resource = config.audience?.trim();\n const extraQueryParams: Record<string, string> = { ...normalized.extraQueryParams };\n if (resource) extraQueryParams.resource = resource;\n if (normalized.directSignIn) {\n Object.assign(\n extraQueryParams,\n createLogtoDirectSignInRequest(normalized.directSignIn).extraQueryParams,\n );\n }\n return {\n state: normalized.returnUrl ? { returnUrl: normalized.returnUrl } : undefined,\n extraQueryParams: Object.keys(extraQueryParams).length ? extraQueryParams : undefined,\n };\n}\n\nexport async function signInRedirect(\n config: LuminaryIdpConfig,\n returnUrlOrOptions?: string | SignInOptions,\n): Promise<void> {\n resetUserManager();\n const um = createUserManager(config);\n await um.signinRedirect(signInArgs(config, returnUrlOrOptions));\n}\n\n/**\n * Persist PKCE state (same store as {@link createUserManager}) and return the\n * authorize URL — used by Experience headless bootstrap before navigating to\n * `redirectTo` from `/api/experience/submit`.\n */\nexport async function prepareSignInRequestUrl(\n config: LuminaryIdpConfig,\n returnUrlOrOptions?: string | SignInOptions,\n): Promise<string> {\n resetUserManager();\n // Warm the singleton so callback uses identical settings/stores.\n createUserManager(config);\n const client = new OidcClient(clientSettings(config));\n const args = signInArgs(config, returnUrlOrOptions);\n const request = await client.createSigninRequest({\n state: args.state,\n extraQueryParams: {\n ...(args.extraQueryParams ?? {}),\n prompt: \"login\",\n },\n });\n return request.url;\n}\n\n/**\n * OIDC login in a popup window (not an iframe). Opener keeps SPA state;\n * callback page in the popup must call {@link handleSignInPopupCallback}.\n */\nexport async function signInPopup(\n config: LuminaryIdpConfig,\n returnUrlOrOptions?: string | SignInOptions,\n): Promise<{ session: LuminaryAuthSession; returnUrl?: string }> {\n resetUserManager();\n const um = createUserManager(config);\n const user = await um.signinPopup(signInArgs(config, returnUrlOrOptions));\n const session = toSession(user);\n if (!session.accessToken) {\n throw new Error(\"IdP did not return access_token (check audience / API resource)\");\n }\n assertJwtAccessToken(session.accessToken);\n localStorage.setItem(storageKey(config), session.accessToken);\n const stateReturnUrl =\n typeof user.state === \"object\" && user.state && \"returnUrl\" in user.state\n ? String((user.state as { returnUrl?: string }).returnUrl ?? \"\")\n : undefined;\n return { session, returnUrl: stateReturnUrl || undefined };\n}\n\nexport async function handleSignInCallback(config: LuminaryIdpConfig): Promise<{\n session: LuminaryAuthSession;\n returnUrl?: string;\n}> {\n const um = createUserManager(config);\n const user = await um.signinRedirectCallback();\n const session = toSession(user);\n assertJwtAccessToken(session.accessToken);\n localStorage.setItem(storageKey(config), session.accessToken);\n const returnUrl =\n typeof user.state === \"object\" && user.state && \"returnUrl\" in user.state\n ? String((user.state as { returnUrl?: string }).returnUrl ?? \"\")\n : undefined;\n return { session, returnUrl: returnUrl || undefined };\n}\n\n/**\n * Complete popup OIDC in the popup window. Notifies the opener and closes.\n * Do not run product SSO exchange here — the opener handles that after signInPopup resolves.\n */\nexport async function handleSignInPopupCallback(config: LuminaryIdpConfig): Promise<void> {\n const um = createUserManager(config);\n await um.signinPopupCallback();\n}\n\n/** True when this window is likely an OIDC popup callback. */\nexport function isOidcPopupWindow(): boolean {\n try {\n return Boolean(window.opener && window.opener !== window);\n } catch {\n return false;\n }\n}\n\nexport async function signOutRedirect(config: LuminaryIdpConfig): Promise<void> {\n localStorage.removeItem(storageKey(config));\n const um = createUserManager(config);\n await um.signoutRedirect();\n}\n\nexport function getStoredAccessToken(config: LuminaryIdpConfig): string | null {\n return localStorage.getItem(storageKey(config));\n}\n\nexport function clearStoredSession(config: LuminaryIdpConfig): void {\n localStorage.removeItem(storageKey(config));\n}\n\nfunction toSession(user: User): LuminaryAuthSession {\n return {\n accessToken: user.access_token,\n idToken: user.id_token,\n expiresAt: user.expires_at ? user.expires_at * 1000 : undefined,\n profile: user.profile as Record<string, unknown>,\n };\n}\n\nfunction assertJwtAccessToken(accessToken: string): void {\n if (accessToken.split(\".\").length !== 3) {\n throw new Error(\n \"Received non-JWT access_token. Pass resource (audience) on authorize/token and register the API resource at the IdP.\",\n );\n }\n}\n\nexport async function getCurrentUser(config: LuminaryIdpConfig): Promise<LuminaryAuthSession | null> {\n const um = createUserManager(config);\n const user = await um.getUser();\n if (!user || user.expired) return null;\n return toSession(user);\n}\n","/**\n * @deprecated Import the adapter APIs from the package root instead.\n *\n * This module remains as a compatibility facade for existing consumers.\n */\nimport {\n LOGIN_EXPERIENCE_CAPABILITIES,\n resolveLoginExperienceAdapter,\n} from \"./login-experience-adapter\";\n\nexport type {\n ExperienceIdentifierType,\n ExperiencePasswordSignInInput,\n ExperiencePasswordSignInResult,\n ExperienceSocialConnector,\n FetchSocialConnectorsInput,\n} from \"./login-experience-adapter\";\nexport { sameOriginAuthorizeUrl } from \"./logto-experience-adapter\";\n\nimport type {\n ExperiencePasswordSignInInput,\n ExperiencePasswordSignInResult,\n ExperienceSocialConnector,\n FetchSocialConnectorsInput,\n} from \"./login-experience-adapter\";\n\n/** @deprecated Use a LoginExperienceAdapter instance. */\nexport function experiencePasswordSignIn(\n input: ExperiencePasswordSignInInput,\n): Promise<ExperiencePasswordSignInResult> {\n const adapter = resolveLoginExperienceAdapter();\n if (\n !adapter.capabilities.includes(LOGIN_EXPERIENCE_CAPABILITIES.passwordSignIn) ||\n !adapter.experiencePasswordSignIn\n ) {\n return Promise.reject(new Error(\"Login experience does not support password sign-in\"));\n }\n return adapter.experiencePasswordSignIn(input);\n}\n\n/** @deprecated Use a LoginExperienceAdapter instance. */\nexport function fetchSocialConnectors(\n input: FetchSocialConnectorsInput,\n): Promise<ExperienceSocialConnector[]> {\n const adapter = resolveLoginExperienceAdapter();\n if (\n !adapter.capabilities.includes(LOGIN_EXPERIENCE_CAPABILITIES.socialConnectors) ||\n !adapter.fetchSocialConnectors\n ) {\n return Promise.reject(new Error(\"Login experience does not support social connectors\"));\n }\n return adapter.fetchSocialConnectors(input);\n}\n","/**\n * AuthGate — single-flight 401 recovery with optional token refresh + reauth UI.\n * Products wire tryRefresh / onReauthRequired; API clients call handleUnauthorized + waitIfBlocked.\n */\n\nexport type AuthGatePhase = \"idle\" | \"refreshing\" | \"reauth\";\n\nexport type UnauthorizedDisposition = \"retry\" | \"fail\";\n\nexport interface AuthGateSnapshot {\n phase: AuthGatePhase;\n /** True while refresh or interactive reauth is in flight. */\n blocked: boolean;\n lastError?: string;\n}\n\nexport interface AuthGateConfig {\n /**\n * Attempt silent product-token (or OIDC) refresh before showing reauth UI.\n * Return true if a new session was established.\n */\n tryRefresh?: () => Promise<boolean>;\n /** Called once when interactive reauth is required (open modal / popup). */\n onReauthRequired?: () => void;\n /** Called when reauth succeeds or is cancelled (phase back to idle). */\n onSettled?: (ok: boolean) => void;\n}\n\ntype Waiter = {\n resolve: (disposition: UnauthorizedDisposition) => void;\n};\n\nclass AuthGateCoordinator {\n private phase: AuthGatePhase = \"idle\";\n private lastError?: string;\n /** Cached for useSyncExternalStore — must keep referential equality when unchanged. */\n private snapshot: AuthGateSnapshot = { phase: \"idle\", blocked: false };\n private config: AuthGateConfig = {};\n private flight: Promise<UnauthorizedDisposition> | null = null;\n private reauthWaiters: Waiter[] = [];\n private listeners = new Set<() => void>();\n\n configure(config: AuthGateConfig): void {\n this.config = { ...this.config, ...config };\n }\n\n getSnapshot = (): AuthGateSnapshot => this.snapshot;\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n };\n\n private emit(): void {\n for (const listener of this.listeners) listener();\n }\n\n private setPhase(phase: AuthGatePhase, lastError?: string): void {\n if (this.phase === phase && this.lastError === lastError) return;\n this.phase = phase;\n this.lastError = lastError;\n this.snapshot = {\n phase,\n blocked: phase !== \"idle\",\n lastError,\n };\n this.emit();\n }\n\n /** Await while a recovery is in flight (pause outbound API traffic). */\n async waitIfBlocked(): Promise<void> {\n if (!this.flight) return;\n await this.flight;\n }\n\n /**\n * Single-flight 401 handler.\n * Concurrent callers share one recovery; all receive the same disposition.\n */\n handleUnauthorized(errorMessage?: string): Promise<UnauthorizedDisposition> {\n if (this.flight) return this.flight;\n this.flight = this.runRecovery(errorMessage).finally(() => {\n this.flight = null;\n });\n return this.flight;\n }\n\n /** Open reauth UI without a preceding 401 (cold start / deep link). */\n requestReauth(errorMessage?: string): Promise<UnauthorizedDisposition> {\n return this.handleUnauthorized(errorMessage);\n }\n\n /** Product calls after popup / Headless login restored the session. */\n completeReauth(): void {\n if (this.phase !== \"reauth\") return;\n const waiters = this.reauthWaiters.splice(0, this.reauthWaiters.length);\n this.setPhase(\"idle\");\n this.config.onSettled?.(true);\n for (const w of waiters) w.resolve(\"retry\");\n }\n\n /** User dismissed reauth; fail queued recovery waiters. */\n cancelReauth(errorMessage?: string): void {\n if (this.phase !== \"reauth\") return;\n const waiters = this.reauthWaiters.splice(0, this.reauthWaiters.length);\n this.setPhase(\"idle\", errorMessage);\n this.config.onSettled?.(false);\n for (const w of waiters) w.resolve(\"fail\");\n }\n\n private async runRecovery(errorMessage?: string): Promise<UnauthorizedDisposition> {\n this.lastError = errorMessage;\n\n if (this.config.tryRefresh) {\n this.setPhase(\"refreshing\", errorMessage);\n try {\n const ok = await this.config.tryRefresh();\n if (ok) {\n this.setPhase(\"idle\");\n this.config.onSettled?.(true);\n return \"retry\";\n }\n } catch (e) {\n this.lastError = e instanceof Error ? e.message : String(e);\n }\n }\n\n this.setPhase(\"reauth\", this.lastError);\n this.config.onReauthRequired?.();\n\n return new Promise<UnauthorizedDisposition>((resolve) => {\n this.reauthWaiters.push({ resolve });\n });\n }\n}\n\n/** Process-wide gate (one per SPA bundle). */\nexport const authGate = new AuthGateCoordinator();\n\n/**\n * Run an async request; on 401, recover via AuthGate and retry once.\n * `isUnauthorized` defaults to checking `status === 401` or `statusCode === 401`.\n */\nexport async function withAuthGateRetry<T>(\n execute: () => Promise<T>,\n options?: {\n isUnauthorized?: (error: unknown) => boolean;\n /** Skip gate (e.g. refresh / sso / login endpoints). */\n bypass?: boolean;\n },\n): Promise<T> {\n if (options?.bypass) return execute();\n\n await authGate.waitIfBlocked();\n\n try {\n return await execute();\n } catch (error) {\n if (!(options?.isUnauthorized ?? defaultIsUnauthorized)(error)) throw error;\n const disposition = await authGate.handleUnauthorized(messageOf(error));\n if (disposition !== \"retry\") throw error;\n return execute();\n }\n}\n\nfunction defaultIsUnauthorized(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n const e = error as { status?: number; statusCode?: number; response?: { status?: number } };\n return e.status === 401 || e.statusCode === 401 || e.response?.status === 401;\n}\n\nfunction messageOf(error: unknown): string | undefined {\n if (error instanceof Error) return error.message;\n if (error && typeof error === \"object\" && \"message\" in error) {\n const m = (error as { message?: unknown }).message;\n return typeof m === \"string\" ? m : undefined;\n }\n return undefined;\n}\n","import { createContext, useCallback, useContext, useEffect, useMemo, useState } from \"react\";\nimport {\n clearStoredSession,\n getCurrentUser,\n getStoredAccessToken,\n handleSignInCallback,\n signInPopup,\n signInRedirect,\n signOutRedirect,\n} from \"./oidc-client\";\nimport { isIdpConfigured, readIdpConfigFromEnv, type LuminaryAuthSession, type LuminaryIdpConfig } from \"./types\";\n\ninterface LuminaryAuthContextValue {\n configured: boolean;\n session: LuminaryAuthSession | null;\n accessToken: string | null;\n loading: boolean;\n login: (returnUrl?: string) => Promise<void>;\n /** Popup OIDC — keeps the opener SPA mounted. */\n loginPopup: (returnUrl?: string) => Promise<LuminaryAuthSession>;\n logout: () => Promise<void>;\n completeCallback: () => Promise<{ returnUrl?: string }>;\n refreshSession: () => Promise<void>;\n}\n\nconst LuminaryAuthContext = createContext<LuminaryAuthContextValue | null>(null);\n\nexport interface LuminaryAuthProviderProps {\n config?: Partial<LuminaryIdpConfig>;\n children: React.ReactNode;\n}\n\nexport function LuminaryAuthProvider({ config: configProp, children }: LuminaryAuthProviderProps) {\n const config = useMemo(() => configProp ?? {}, [configProp]);\n const configured = isIdpConfigured(config);\n const [session, setSession] = useState<LuminaryAuthSession | null>(null);\n const [loading, setLoading] = useState(configured);\n\n const refreshSession = useCallback(async () => {\n if (!configured) {\n setSession(null);\n setLoading(false);\n return;\n }\n setLoading(true);\n try {\n const current = await getCurrentUser(config);\n setSession(current);\n } catch {\n setSession(null);\n } finally {\n setLoading(false);\n }\n }, [config, configured]);\n\n useEffect(() => {\n void refreshSession();\n }, [refreshSession]);\n\n const login = useCallback(\n async (returnUrl?: string) => {\n if (!configured) throw new Error(\"IdP not configured\");\n await signInRedirect(config, returnUrl);\n },\n [config, configured],\n );\n\n const loginPopup = useCallback(\n async (returnUrl?: string) => {\n if (!configured) throw new Error(\"IdP not configured\");\n const { session: next } = await signInPopup(config, returnUrl);\n setSession(next);\n return next;\n },\n [config, configured],\n );\n\n const logout = useCallback(async () => {\n if (!configured) {\n clearStoredSession(config as LuminaryIdpConfig);\n setSession(null);\n return;\n }\n setSession(null);\n await signOutRedirect(config);\n }, [config, configured]);\n\n const completeCallback = useCallback(async () => {\n if (!configured) throw new Error(\"IdP not configured\");\n const { session: next, returnUrl } = await handleSignInCallback(config);\n setSession(next);\n return { returnUrl };\n }, [config, configured]);\n\n const value = useMemo<LuminaryAuthContextValue>(\n () => ({\n configured,\n session,\n accessToken: session?.accessToken ?? (configured ? getStoredAccessToken(config) : null),\n loading,\n login,\n loginPopup,\n logout,\n completeCallback,\n refreshSession,\n }),\n [configured, session, loading, login, loginPopup, logout, completeCallback, refreshSession, config],\n );\n\n return <LuminaryAuthContext.Provider value={value}>{children}</LuminaryAuthContext.Provider>;\n}\n\nexport function useLuminaryAuth(): LuminaryAuthContextValue {\n const ctx = useContext(LuminaryAuthContext);\n if (!ctx) throw new Error(\"useLuminaryAuth must be used within LuminaryAuthProvider\");\n return ctx;\n}\n\nexport { isIdpConfigured, readIdpConfigFromEnv };\nexport type { LuminaryAuthSession, LuminaryIdpConfig };\n","import type { HeadlessLoginLabels } from \"./HeadlessLoginPanel\";\n\n/** Locales shipped with the shared login card. Products may pass a wider menu. */\nexport type LoginLocale =\n | \"zh-CN\"\n | \"zh-TW\"\n | \"ja\"\n | \"ko\"\n | \"en\"\n | \"pt\"\n | \"nl\"\n | \"it\"\n | \"es\"\n | \"fr\";\n\nexport interface LoginLocaleOption {\n code: string;\n label: string;\n short: string;\n}\n\n/** Menu order: CJK and English first; long European names, then Spanish and French. */\nexport const DEFAULT_LOGIN_LOCALES: readonly LoginLocaleOption[] = [\n { code: \"zh-CN\", label: \"简体中文\", short: \"简\" },\n { code: \"zh-TW\", label: \"繁體中文\", short: \"繁\" },\n { code: \"ja\", label: \"日本語\", short: \"JA\" },\n { code: \"ko\", label: \"한국어\", short: \"KO\" },\n { code: \"en\", label: \"English\", short: \"EN\" },\n { code: \"pt\", label: \"Português\", short: \"PT\" },\n { code: \"nl\", label: \"Nederlands\", short: \"NL\" },\n { code: \"it\", label: \"Italiano\", short: \"IT\" },\n { code: \"es\", label: \"Español\", short: \"ES\" },\n { code: \"fr\", label: \"Français\", short: \"FR\" },\n];\n\nconst ZH_CN: HeadlessLoginLabels = {\n title: \"登录\",\n subtitle: \"使用 LuminaryWorks 统一账号\",\n identifierPlaceholder: \"邮箱或用户名\",\n registerIdentifierPlaceholder: \"用户名\",\n passwordPlaceholder: \"密码\",\n confirmPasswordPlaceholder: \"确认密码\",\n submitPassword: \"密码登录\",\n submitRegister: \"创建账号\",\n submitSso: \"使用统一账号继续\",\n submitGoogle: \"Google\",\n submitGithub: \"GitHub\",\n socialDivider: \"或\",\n hint: \"社交账号会直接打开对应服务。密码登录使用你的 LuminaryWorks 账号。\",\n registerHint: \"邮箱注册需要验证码。也可以用用户名注册,或改用社交账号一键登录。\",\n cancel: \"取消\",\n experienceUnavailable: \"密码登录暂不可用,请改用社交账号。\",\n showPassword: \"显示密码\",\n hidePassword: \"隐藏密码\",\n registerLink: \"创建账号\",\n loginLink: \"已有账号?去登录\",\n passwordMismatch: \"两次密码不一致\",\n registerTitle: \"创建账号\",\n registerSubtitle: \"创建 LuminaryWorks 统一账号\",\n registerWithEmail: \"邮箱\",\n registerWithUsername: \"用户名\",\n emailPlaceholder: \"邮箱\",\n verificationCodePlaceholder: \"验证码\",\n sendCode: \"发送验证码\",\n resendCode: \"重新发送\",\n allowedDomainsPrefix: \"允许的邮箱域名\",\n allowedDomainsOpen: \"大多数邮箱都可以注册。\",\n allowedDomainsBlocklist: \"大多数邮箱可用。临时邮箱会被拒绝。\",\n waitingExternalBrowser: \"请在浏览器中完成登录,然后回到本应用。\",\n consentRequired: \"请先同意用户协议后再继续。\",\n mfaTitle: \"身份验证码\",\n mfaSubtitle: \"输入验证器应用中的 6 位数字。\",\n mfaCodePlaceholder: \"6 位验证码\",\n mfaSubmit: \"验证并继续\",\n mfaBack: \"返回\",\n};\n\nconst ZH_TW: HeadlessLoginLabels = {\n title: \"登入\",\n subtitle: \"使用 LuminaryWorks 統一帳號\",\n identifierPlaceholder: \"電子郵件或使用者名稱\",\n registerIdentifierPlaceholder: \"使用者名稱\",\n passwordPlaceholder: \"密碼\",\n confirmPasswordPlaceholder: \"確認密碼\",\n submitPassword: \"密碼登入\",\n submitRegister: \"建立帳號\",\n submitSso: \"使用統一帳號繼續\",\n submitGoogle: \"Google\",\n submitGithub: \"GitHub\",\n socialDivider: \"或\",\n hint: \"社交帳號會直接開啟對應服務。密碼登入使用你的 LuminaryWorks 帳號。\",\n registerHint: \"電子郵件註冊需要驗證碼。也可以用使用者名稱註冊,或改用社交帳號。\",\n cancel: \"取消\",\n experienceUnavailable: \"密碼登入暫不可用,請改用社交帳號。\",\n showPassword: \"顯示密碼\",\n hidePassword: \"隱藏密碼\",\n registerLink: \"建立帳號\",\n loginLink: \"已有帳號?去登入\",\n passwordMismatch: \"兩次密碼不一致\",\n registerTitle: \"建立帳號\",\n registerSubtitle: \"建立 LuminaryWorks 統一帳號\",\n registerWithEmail: \"電子郵件\",\n registerWithUsername: \"使用者名稱\",\n emailPlaceholder: \"電子郵件\",\n verificationCodePlaceholder: \"驗證碼\",\n sendCode: \"發送驗證碼\",\n resendCode: \"重新發送\",\n allowedDomainsPrefix: \"允許的電子郵件網域\",\n allowedDomainsOpen: \"大多數電子郵件都可以註冊。\",\n allowedDomainsBlocklist: \"大多數電子郵件可用。臨時信箱會被拒絕。\",\n waitingExternalBrowser: \"請在瀏覽器中完成登入,然後回到本應用。\",\n consentRequired: \"請先同意使用條款後再繼續。\",\n mfaTitle: \"身分驗證碼\",\n mfaSubtitle: \"輸入驗證器應用程式中的 6 位數字。\",\n mfaCodePlaceholder: \"6 位驗證碼\",\n mfaSubmit: \"驗證並繼續\",\n mfaBack: \"返回\",\n};\n\nconst ES: HeadlessLoginLabels = {\n title: \"Iniciar sesión\",\n subtitle: \"Usa tu cuenta unificada de LuminaryWorks\",\n identifierPlaceholder: \"Correo o usuario\",\n registerIdentifierPlaceholder: \"Usuario\",\n passwordPlaceholder: \"Contraseña\",\n confirmPasswordPlaceholder: \"Confirmar contraseña\",\n submitPassword: \"Entrar con contraseña\",\n submitRegister: \"Crear cuenta\",\n submitSso: \"Continuar con la cuenta unificada\",\n submitGoogle: \"Google\",\n submitGithub: \"GitHub\",\n socialDivider: \"o\",\n hint: \"Las redes abren el proveedor directamente. La contraseña usa tu cuenta LuminaryWorks.\",\n registerHint:\n \"El registro por correo pide un código. También puedes usar un nombre de usuario o una red social.\",\n cancel: \"Cancelar\",\n experienceUnavailable: \"El inicio con contraseña no está disponible. Usa una red social.\",\n showPassword: \"Mostrar contraseña\",\n hidePassword: \"Ocultar contraseña\",\n registerLink: \"Crear una cuenta\",\n loginLink: \"¿Ya tienes cuenta? Inicia sesión\",\n passwordMismatch: \"Las contraseñas no coinciden\",\n registerTitle: \"Crear cuenta\",\n registerSubtitle: \"Crea tu cuenta unificada de LuminaryWorks\",\n registerWithEmail: \"Correo\",\n registerWithUsername: \"Usuario\",\n emailPlaceholder: \"Correo\",\n verificationCodePlaceholder: \"Código\",\n sendCode: \"Enviar código\",\n resendCode: \"Reenviar\",\n allowedDomainsPrefix: \"Dominios de correo permitidos\",\n allowedDomainsOpen: \"El registro por correo está abierto para la mayoría de proveedores.\",\n allowedDomainsBlocklist: \"Se aceptan la mayoría de correos. Se bloquean direcciones temporales.\",\n waitingExternalBrowser: \"Termina el inicio de sesión en el navegador y vuelve a esta app.\",\n consentRequired: \"Acepta los términos antes de continuar.\",\n};\n\nconst JA: HeadlessLoginLabels = {\n title: \"ログイン\",\n subtitle: \"LuminaryWorks 統合アカウントを使用\",\n identifierPlaceholder: \"メールまたはユーザー名\",\n registerIdentifierPlaceholder: \"ユーザー名\",\n passwordPlaceholder: \"パスワード\",\n confirmPasswordPlaceholder: \"パスワード確認\",\n submitPassword: \"パスワードでログイン\",\n submitRegister: \"アカウント作成\",\n submitSso: \"統合アカウントで続ける\",\n submitGoogle: \"Google\",\n submitGithub: \"GitHub\",\n socialDivider: \"または\",\n hint: \"ソーシャルは各サービスを直接開きます。パスワードは LuminaryWorks アカウントです。\",\n registerHint: \"メール登録には確認コードが必要です。ユーザー名またはソーシャルも使えます。\",\n cancel: \"キャンセル\",\n experienceUnavailable: \"パスワードログインは使えません。ソーシャルをお使いください。\",\n showPassword: \"パスワードを表示\",\n hidePassword: \"パスワードを隠す\",\n registerLink: \"アカウントを作成\",\n loginLink: \"アカウントをお持ちですか?ログイン\",\n passwordMismatch: \"パスワードが一致しません\",\n registerTitle: \"アカウント作成\",\n registerSubtitle: \"LuminaryWorks 統合アカウントを作成\",\n registerWithEmail: \"メール\",\n registerWithUsername: \"ユーザー名\",\n emailPlaceholder: \"メール\",\n verificationCodePlaceholder: \"確認コード\",\n sendCode: \"コードを送信\",\n resendCode: \"再送信\",\n allowedDomainsPrefix: \"利用できるメールドメイン\",\n allowedDomainsOpen: \"ほとんどのメールで登録できます。\",\n allowedDomainsBlocklist: \"ほとんどのメールは使えます。使い捨てアドレスは拒否されます。\",\n waitingExternalBrowser: \"ブラウザでログインを終えたら、このアプリに戻ってください。\",\n consentRequired: \"続ける前に利用規約へ同意してください。\",\n};\n\nconst KO: HeadlessLoginLabels = {\n title: \"로그인\",\n subtitle: \"LuminaryWorks 통합 계정 사용\",\n identifierPlaceholder: \"이메일 또는 사용자 이름\",\n registerIdentifierPlaceholder: \"사용자 이름\",\n passwordPlaceholder: \"비밀번호\",\n confirmPasswordPlaceholder: \"비밀번호 확인\",\n submitPassword: \"비밀번호로 로그인\",\n submitRegister: \"계정 만들기\",\n submitSso: \"통합 계정으로 계속\",\n submitGoogle: \"Google\",\n submitGithub: \"GitHub\",\n socialDivider: \"또는\",\n hint: \"소셜 로그인은 해당 서비스를 바로 엽니다. 비밀번호는 LuminaryWorks 계정입니다.\",\n registerHint: \"이메일 가입에는 인증 코드가 필요합니다. 사용자 이름이나 소셜도 사용할 수 있습니다.\",\n cancel: \"취소\",\n experienceUnavailable: \"비밀번호 로그인을 사용할 수 없습니다. 소셜 로그인을 사용하세요.\",\n showPassword: \"비밀번호 표시\",\n hidePassword: \"비밀번호 숨기기\",\n registerLink: \"계정 만들기\",\n loginLink: \"계정이 있나요? 로그인\",\n passwordMismatch: \"비밀번호가 일치하지 않습니다\",\n registerTitle: \"계정 만들기\",\n registerSubtitle: \"LuminaryWorks 통합 계정 만들기\",\n registerWithEmail: \"이메일\",\n registerWithUsername: \"사용자 이름\",\n emailPlaceholder: \"이메일\",\n verificationCodePlaceholder: \"인증 코드\",\n sendCode: \"코드 보내기\",\n resendCode: \"다시 보내기\",\n allowedDomainsPrefix: \"허용된 이메일 도메인\",\n allowedDomainsOpen: \"대부분의 이메일로 가입할 수 있습니다.\",\n allowedDomainsBlocklist: \"대부분의 이메일을 허용합니다. 임시 주소는 거부됩니다.\",\n waitingExternalBrowser: \"브라우저에서 로그인을 마친 뒤 이 앱으로 돌아오세요.\",\n consentRequired: \"계속하려면 약관에 동의하세요.\",\n};\n\nconst PT: HeadlessLoginLabels = {\n title: \"Entrar\",\n subtitle: \"Use a conta unificada LuminaryWorks\",\n identifierPlaceholder: \"E-mail ou usuário\",\n registerIdentifierPlaceholder: \"Usuário\",\n passwordPlaceholder: \"Senha\",\n confirmPasswordPlaceholder: \"Confirmar senha\",\n submitPassword: \"Entrar com senha\",\n submitRegister: \"Criar conta\",\n submitSso: \"Continuar com a conta unificada\",\n submitGoogle: \"Google\",\n submitGithub: \"GitHub\",\n socialDivider: \"ou\",\n hint: \"Redes sociais abrem o provedor direto. A senha usa sua conta LuminaryWorks.\",\n registerHint: \"O cadastro por e-mail pede um código. Também dá para usar usuário ou rede social.\",\n cancel: \"Cancelar\",\n experienceUnavailable: \"Entrada por senha indisponível. Use uma rede social.\",\n showPassword: \"Mostrar senha\",\n hidePassword: \"Ocultar senha\",\n registerLink: \"Criar uma conta\",\n loginLink: \"Já tem conta? Entrar\",\n passwordMismatch: \"As senhas não coincidem\",\n registerTitle: \"Criar conta\",\n registerSubtitle: \"Crie sua conta unificada LuminaryWorks\",\n registerWithEmail: \"E-mail\",\n registerWithUsername: \"Usuário\",\n emailPlaceholder: \"E-mail\",\n verificationCodePlaceholder: \"Código\",\n sendCode: \"Enviar código\",\n resendCode: \"Reenviar\",\n allowedDomainsPrefix: \"Domínios de e-mail permitidos\",\n allowedDomainsOpen: \"O cadastro por e-mail está aberto para a maioria dos provedores.\",\n allowedDomainsBlocklist: \"A maioria dos e-mails é aceita. Endereços temporários são bloqueados.\",\n waitingExternalBrowser: \"Conclua o login no navegador e volte a este app.\",\n consentRequired: \"Aceite os termos antes de continuar.\",\n};\n\nconst NL: HeadlessLoginLabels = {\n title: \"Inloggen\",\n subtitle: \"Gebruik je LuminaryWorks-account\",\n identifierPlaceholder: \"E-mail of gebruikersnaam\",\n registerIdentifierPlaceholder: \"Gebruikersnaam\",\n passwordPlaceholder: \"Wachtwoord\",\n confirmPasswordPlaceholder: \"Bevestig wachtwoord\",\n submitPassword: \"Inloggen met wachtwoord\",\n submitRegister: \"Account maken\",\n submitSso: \"Doorgaan met unified account\",\n submitGoogle: \"Google\",\n submitGithub: \"GitHub\",\n socialDivider: \"of\",\n hint: \"Sociale logins openen de provider direct. Het wachtwoord is je LuminaryWorks-account.\",\n registerHint: \"Registreren via e-mail vraagt een code. Een gebruikersnaam of sociale login kan ook.\",\n cancel: \"Annuleren\",\n experienceUnavailable: \"Inloggen met wachtwoord is niet beschikbaar. Gebruik een sociale login.\",\n showPassword: \"Wachtwoord tonen\",\n hidePassword: \"Wachtwoord verbergen\",\n registerLink: \"Account maken\",\n loginLink: \"Al een account? Inloggen\",\n passwordMismatch: \"Wachtwoorden komen niet overeen\",\n registerTitle: \"Account maken\",\n registerSubtitle: \"Maak je LuminaryWorks-account\",\n registerWithEmail: \"E-mail\",\n registerWithUsername: \"Gebruikersnaam\",\n emailPlaceholder: \"E-mail\",\n verificationCodePlaceholder: \"Code\",\n sendCode: \"Code versturen\",\n resendCode: \"Opnieuw\",\n allowedDomainsPrefix: \"Toegestane e-maildomeinen\",\n allowedDomainsOpen: \"Registreren kan met de meeste e-mailproviders.\",\n allowedDomainsBlocklist: \"De meeste adressen zijn toegestaan. Tijdelijke adressen worden geweigerd.\",\n waitingExternalBrowser: \"Rond het inloggen af in de browser en kom terug naar deze app.\",\n consentRequired: \"Ga eerst akkoord met de voorwaarden.\",\n};\n\nconst IT: HeadlessLoginLabels = {\n title: \"Accedi\",\n subtitle: \"Usa l'account unificato LuminaryWorks\",\n identifierPlaceholder: \"Email o nome utente\",\n registerIdentifierPlaceholder: \"Nome utente\",\n passwordPlaceholder: \"Password\",\n confirmPasswordPlaceholder: \"Conferma password\",\n submitPassword: \"Accedi con password\",\n submitRegister: \"Crea account\",\n submitSso: \"Continua con l'account unificato\",\n submitGoogle: \"Google\",\n submitGithub: \"GitHub\",\n socialDivider: \"oppure\",\n hint: \"I social aprono il provider. La password usa il tuo account LuminaryWorks.\",\n registerHint: \"La registrazione email chiede un codice. Puoi anche usare un nome utente o un social.\",\n cancel: \"Annulla\",\n experienceUnavailable: \"Accesso con password non disponibile. Usa un social.\",\n showPassword: \"Mostra password\",\n hidePassword: \"Nascondi password\",\n registerLink: \"Crea un account\",\n loginLink: \"Hai già un account? Accedi\",\n passwordMismatch: \"Le password non coincidono\",\n registerTitle: \"Crea account\",\n registerSubtitle: \"Crea il tuo account unificato LuminaryWorks\",\n registerWithEmail: \"Email\",\n registerWithUsername: \"Nome utente\",\n emailPlaceholder: \"Email\",\n verificationCodePlaceholder: \"Codice\",\n sendCode: \"Invia codice\",\n resendCode: \"Invia di nuovo\",\n allowedDomainsPrefix: \"Domini email consentiti\",\n allowedDomainsOpen: \"La registrazione email è aperta per la maggior parte dei provider.\",\n allowedDomainsBlocklist: \"La maggior parte delle email è accettata. Gli indirizzi temporanei sono bloccati.\",\n waitingExternalBrowser: \"Completa l'accesso nel browser e torna a questa app.\",\n consentRequired: \"Accetta i termini prima di continuare.\",\n};\n\nconst FR: HeadlessLoginLabels = {\n title: \"Connexion\",\n subtitle: \"Utilisez votre compte unifié LuminaryWorks\",\n identifierPlaceholder: \"E-mail ou nom d'utilisateur\",\n registerIdentifierPlaceholder: \"Nom d'utilisateur\",\n passwordPlaceholder: \"Mot de passe\",\n confirmPasswordPlaceholder: \"Confirmer le mot de passe\",\n submitPassword: \"Se connecter avec mot de passe\",\n submitRegister: \"Créer un compte\",\n submitSso: \"Continuer avec le compte unifié\",\n submitGoogle: \"Google\",\n submitGithub: \"GitHub\",\n socialDivider: \"ou\",\n hint: \"Les réseaux ouvrent le fournisseur. Le mot de passe utilise votre compte LuminaryWorks.\",\n registerHint:\n \"L'inscription par e-mail demande un code. Un nom d'utilisateur ou un réseau social convient aussi.\",\n cancel: \"Annuler\",\n experienceUnavailable: \"Connexion par mot de passe indisponible. Utilisez un réseau social.\",\n showPassword: \"Afficher le mot de passe\",\n hidePassword: \"Masquer le mot de passe\",\n registerLink: \"Créer un compte\",\n loginLink: \"Déjà un compte ? Se connecter\",\n passwordMismatch: \"Les mots de passe ne correspondent pas\",\n registerTitle: \"Créer un compte\",\n registerSubtitle: \"Créez votre compte unifié LuminaryWorks\",\n registerWithEmail: \"E-mail\",\n registerWithUsername: \"Nom d'utilisateur\",\n emailPlaceholder: \"E-mail\",\n verificationCodePlaceholder: \"Code\",\n sendCode: \"Envoyer le code\",\n resendCode: \"Renvoyer\",\n allowedDomainsPrefix: \"Domaines e-mail autorisés\",\n allowedDomainsOpen: \"L'inscription par e-mail est ouverte pour la plupart des fournisseurs.\",\n allowedDomainsBlocklist: \"La plupart des e-mails sont acceptés. Les adresses jetables sont refusées.\",\n waitingExternalBrowser: \"Terminez la connexion dans le navigateur, puis revenez à cette application.\",\n consentRequired: \"Acceptez les conditions avant de continuer.\",\n mfaTitle: \"Code d'authentification\",\n mfaSubtitle: \"Saisissez le code à 6 chiffres de votre application.\",\n mfaCodePlaceholder: \"123456\",\n mfaSubmit: \"Vérifier et continuer\",\n mfaBack: \"Retour\",\n};\n\nconst BY_LOCALE: Record<LoginLocale, HeadlessLoginLabels | undefined> = {\n en: undefined,\n \"zh-CN\": ZH_CN,\n \"zh-TW\": ZH_TW,\n ja: JA,\n ko: KO,\n pt: PT,\n nl: NL,\n it: IT,\n es: ES,\n fr: FR,\n};\n\n/** Normalize product locale tags (`zh`, `zh-Hans`) onto the card dictionary. */\nexport function normalizeLoginLocale(locale: string | undefined): LoginLocale {\n const raw = (locale ?? \"en\").trim().toLowerCase();\n if (raw === \"zh\" || raw === \"zh-cn\" || raw === \"zh-hans\" || raw.startsWith(\"zh-cn\")) {\n return \"zh-CN\";\n }\n if (raw === \"zh-tw\" || raw === \"zh-hant\" || raw.startsWith(\"zh-tw\") || raw.startsWith(\"zh-hk\")) {\n return \"zh-TW\";\n }\n if (raw === \"ja\" || raw.startsWith(\"ja-\")) return \"ja\";\n if (raw === \"ko\" || raw.startsWith(\"ko-\")) return \"ko\";\n if (raw === \"pt\" || raw.startsWith(\"pt-\")) return \"pt\";\n if (raw === \"nl\" || raw.startsWith(\"nl-\")) return \"nl\";\n if (raw === \"it\" || raw.startsWith(\"it-\")) return \"it\";\n if (raw === \"es\" || raw.startsWith(\"es-\")) return \"es\";\n if (raw === \"fr\" || raw.startsWith(\"fr-\")) return \"fr\";\n if (raw === \"en\" || raw.startsWith(\"en-\")) return \"en\";\n return \"en\";\n}\n\n/** Card copy for a locale. English is the panel default, so `en` returns `{}`. */\nexport function loginLabels(locale: string | undefined): HeadlessLoginLabels {\n return BY_LOCALE[normalizeLoginLocale(locale)] ?? {};\n}\n",".panel {\n --lw-auth-theme: #1677ff;\n --lw-auth-theme-deep: color-mix(in srgb, var(--lw-auth-theme) 72%, #000);\n box-sizing: border-box;\n width: min(100%, 400px);\n max-width: 400px;\n padding: 28px 28px 22px;\n border-radius: 16px;\n background: rgba(255, 255, 255, 0.96);\n color: #14212b;\n box-shadow: 0 24px 64px rgba(15, 23, 42, 0.28);\n font-family: \"Segoe UI\", \"PingFang SC\", \"Noto Sans SC\", sans-serif;\n}\n\n.brand {\n display: flex;\n gap: 14px;\n align-items: center;\n margin-bottom: 12px;\n}\n\n.logo {\n border-radius: 12px;\n display: block;\n}\n\n.product {\n margin: 0;\n font-size: 13px;\n font-weight: 650;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--lw-auth-theme);\n}\n\n.title {\n margin: 2px 0 0;\n font-size: 22px;\n font-weight: 700;\n line-height: 1.25;\n}\n\n.subtitle {\n margin: 0 0 18px;\n font-size: 14px;\n line-height: 1.5;\n color: #4b5c68;\n}\n\n.form {\n display: grid;\n gap: 10px;\n}\n\n.channelTabs {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 6px;\n margin-bottom: 2px;\n}\n\n.channelTab {\n border: 1px solid #c9d5de;\n border-radius: 10px;\n padding: 8px 10px;\n font-size: 13px;\n font-weight: 650;\n cursor: pointer;\n color: #4b5c68;\n background: #f7fafc;\n}\n.channelTab:disabled {\n opacity: 0.65;\n cursor: not-allowed;\n}\n\n.channelTabActive {\n color: var(--lw-auth-theme-deep);\n border-color: var(--lw-auth-theme);\n background: color-mix(in srgb, var(--lw-auth-theme) 10%, #fff);\n}\n\n.codeRow {\n display: grid;\n grid-template-columns: 1fr auto;\n gap: 8px;\n align-items: stretch;\n}\n\n.codeInput {\n min-width: 0;\n}\n\n.secondaryBtn {\n border: 1px solid #b7c9d4;\n border-radius: 10px;\n padding: 0 12px;\n font-size: 13px;\n font-weight: 650;\n cursor: pointer;\n color: #14212b;\n background: #fff;\n white-space: nowrap;\n}\n.secondaryBtn:disabled {\n opacity: 0.65;\n cursor: not-allowed;\n}\n\n.socialStack {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 10px;\n font-size: 12px;\n}\n\n.input {\n width: 100%;\n box-sizing: border-box;\n border: 1px solid #c9d5de;\n border-radius: 10px;\n padding: 10px 12px;\n font-size: 14px;\n outline: none;\n background: #f7fafc;\n}\n.input:focus {\n border-color: var(--lw-auth-theme);\n}\n.input:disabled {\n opacity: 0.65;\n cursor: not-allowed;\n}\n\n.passwordField {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.passwordInput {\n padding-right: 42px;\n}\n\n.passwordToggle {\n position: absolute;\n right: 4px;\n top: 50%;\n transform: translateY(-50%);\n z-index: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: none;\n border-radius: 4px;\n padding: 0;\n color: #5a6b76;\n background: transparent;\n cursor: pointer;\n}\n.passwordToggle:hover:not(:disabled) {\n color: var(--lw-auth-theme);\n background: color-mix(in srgb, var(--lw-auth-theme) 12%, transparent);\n}\n.passwordToggle:focus-visible {\n outline: 2px solid var(--lw-auth-theme);\n outline-offset: 1px;\n}\n.passwordToggle:disabled {\n opacity: 0.65;\n cursor: not-allowed;\n}\n\n.primaryBtn {\n border: none;\n border-radius: 10px;\n padding: 11px 14px;\n font-size: 14px;\n font-weight: 650;\n cursor: pointer;\n color: #fff;\n background: linear-gradient(135deg, var(--lw-auth-theme) 0%, var(--lw-auth-theme-deep) 100%);\n}\n.primaryBtn:disabled {\n opacity: 0.65;\n cursor: not-allowed;\n}\n\n.socialBtn {\n width: 100%;\n min-width: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n border: 1px solid #b7c9d4;\n border-radius: 10px;\n padding: 11px 10px;\n font-size: 14px;\n font-weight: 650;\n cursor: pointer;\n color: #14212b;\n background: #fff;\n}\n.socialBtn:disabled {\n opacity: 0.65;\n cursor: not-allowed;\n}\n\n.socialLogo {\n flex-shrink: 0;\n display: block;\n}\n\n.logoFallback {\n width: 18px;\n height: 18px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--lw-auth-theme) 14%, #fff);\n color: var(--lw-auth-theme-deep);\n font-size: 11px;\n font-weight: 700;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.cancelBtn {\n margin-top: 10px;\n width: 100%;\n border: none;\n background: transparent;\n color: #5a6b76;\n font-size: 13px;\n cursor: pointer;\n padding: 8px;\n}\n.cancelBtn:disabled {\n opacity: 0.65;\n cursor: not-allowed;\n}\n\n.divider {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 14px 0;\n color: #90a0ab;\n}\n\n.dividerLine {\n flex: 1;\n height: 1px;\n background: #d5e0e7;\n}\n\n.dividerText {\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n}\n\n.hint {\n margin: 10px 0 0;\n font-size: 12px;\n color: #6b7c87;\n line-height: 1.45;\n}\n\n.domainsHint {\n margin: -2px 0 0;\n font-size: 12px;\n line-height: 1.45;\n color: #4b5c68;\n word-break: break-word;\n}\n\n.switchMode {\n margin: 12px 0 0;\n text-align: center;\n}\n\n.switchModeBtn {\n border: none;\n background: transparent;\n color: var(--lw-auth-theme);\n font-size: 13px;\n font-weight: 650;\n cursor: pointer;\n padding: 4px 8px;\n text-decoration: underline;\n text-underline-offset: 3px;\n}\n.switchModeBtn:disabled {\n opacity: 0.65;\n cursor: not-allowed;\n}\n\n.error {\n margin: 12px 0 0;\n font-size: 13px;\n color: #b42318;\n line-height: 1.4;\n}\n\n.consent {\n margin: 12px 0 0;\n font-size: 13px;\n line-height: 1.45;\n color: #14212b;\n}\n\n.consentInvalid {\n margin: 12px -8px 0;\n padding: 8px;\n border: 1px solid #b42318;\n border-radius: 10px;\n background: rgba(180, 35, 24, 0.06);\n}\n\n.consentError {\n margin: 8px 0 0;\n font-size: 13px;\n font-weight: 650;\n line-height: 1.4;\n color: #b42318;\n}\n\n.consentLinks {\n margin: 0;\n}\n.consentLinks a {\n color: var(--lw-auth-theme);\n}\n\n.footer {\n margin-top: 18px;\n padding-top: 12px;\n border-top: 1px solid #e4ebf0;\n font-size: 12px;\n color: #6b7c87;\n display: flex;\n gap: 8px;\n justify-content: center;\n}\n\n@media (max-width: 420px) {\n .panel {\n padding: 22px 16px 18px;\n }\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkhlYWRsZXNzTG9naW5QYW5lbC5tb2R1bGUuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFrQkE7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxlQVhVO0VBWVY7RUFDQSxPQTNCSTtFQTRCSjtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBLE9BL0RNOzs7QUFrRVI7RUFDRTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0EsZUFsRVU7RUFtRVY7RUFDQTtFQUNBO0VBQ0E7RUFDQSxPQXJGTTtFQXNGTixZQTdFUTs7QUErRVI7RUFDRTtFQUNBOzs7QUFJSjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTs7O0FBR0Y7RUFDRTtFQUNBLGVBbkdVO0VBb0dWO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsT0F2SEk7RUF3SEo7RUFDQTs7QUFFQTtFQUNFO0VBQ0E7OztBQUlKO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0EsZUE3SFU7RUE4SFY7RUFDQTtFQUNBO0VBQ0EsWUF0SVE7O0FBd0lSO0VBQ0U7O0FBR0Y7RUFDRTtFQUNBOzs7QUFJSjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsZUFsS1U7RUFtS1Y7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBOztBQUdGO0VBQ0U7RUFDQTs7QUFHRjtFQUNFO0VBQ0E7OztBQUlKO0VBQ0U7RUFDQSxlQTNMVTtFQTRMVjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBOzs7QUFJSjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsZUFqTlU7RUFrTlY7RUFDQTtFQUNBO0VBQ0E7RUFDQSxPQXJPSTtFQXNPSjs7QUFFQTtFQUNFO0VBQ0E7OztBQUlKO0VBQ0U7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0EsZUF0T1U7RUF1T1Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7RUFDQTs7O0FBSUo7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBLE9BN1FROzs7QUFnUlY7RUFDRTtFQUNBO0VBQ0EsWUFwUks7OztBQXVSUDtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0EsT0F0U0s7RUF1U0w7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0EsT0EvU007RUFnVE47OztBQUdGO0VBQ0U7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBOzs7QUFJSjtFQUNFO0VBQ0E7RUFDQSxPQWpVTztFQWtVUDs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQSxPQXJWSTs7O0FBd1ZOO0VBQ0U7RUFDQTtFQUNBO0VBQ0EsZUE3VVU7RUE4VVY7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQSxPQXpWTzs7O0FBNFZUO0VBQ0U7O0FBQ0E7RUFDRTs7O0FBSUo7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBLE9BbFhLO0VBbVhMO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtJQUNFIiwic291cmNlc0NvbnRlbnQiOlsiJGluazogIzE0MjEyYjtcbiRtdXRlZDogIzRiNWM2ODtcbiRoaW50OiAjNmI3Yzg3O1xuJGJyYW5kOiAjM2Q2ZjhmO1xuJGJyYW5kLWRlZXA6ICMxNTQ4NWM7XG4kYnJhbmQtbWlkOiAjMWY2ZjhiO1xuJGJvcmRlcjogI2M5ZDVkZTtcbiRib3JkZXItc29mdDogI2I3YzlkNDtcbiRsaW5lOiAjZDVlMGU3O1xuJGRpdmlkZXI6ICM5MGEwYWI7XG4kc3VyZmFjZTogI2Y3ZmFmYztcbiRmYWxsYmFjay1iZzogI2U4ZWVmMjtcbiRkYW5nZXI6ICNiNDIzMTg7XG4kZm9vdGVyLWxpbmU6ICNlNGViZjA7XG4kcmFkaXVzLWxnOiAxNnB4O1xuJHJhZGl1cy1tZDogMTBweDtcbiRyYWRpdXMtc206IDRweDtcblxuLnBhbmVsIHtcbiAgLS1sdy1hdXRoLXRoZW1lOiAjMTY3N2ZmO1xuICAtLWx3LWF1dGgtdGhlbWUtZGVlcDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWx3LWF1dGgtdGhlbWUpIDcyJSwgIzAwMCk7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHdpZHRoOiBtaW4oMTAwJSwgNDAwcHgpO1xuICBtYXgtd2lkdGg6IDQwMHB4O1xuICBwYWRkaW5nOiAyOHB4IDI4cHggMjJweDtcbiAgYm9yZGVyLXJhZGl1czogJHJhZGl1cy1sZztcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk2KTtcbiAgY29sb3I6ICRpbms7XG4gIGJveC1zaGFkb3c6IDAgMjRweCA2NHB4IHJnYmEoMTUsIDIzLCA0MiwgMC4yOCk7XG4gIGZvbnQtZmFtaWx5OiBcIlNlZ29lIFVJXCIsIFwiUGluZ0ZhbmcgU0NcIiwgXCJOb3RvIFNhbnMgU0NcIiwgc2Fucy1zZXJpZjtcbn1cblxuLmJyYW5kIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiAxNHB4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBtYXJnaW4tYm90dG9tOiAxMnB4O1xufVxuXG4ubG9nbyB7XG4gIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4ucHJvZHVjdCB7XG4gIG1hcmdpbjogMDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBmb250LXdlaWdodDogNjUwO1xuICBsZXR0ZXItc3BhY2luZzogMC4wNGVtO1xuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICBjb2xvcjogdmFyKC0tbHctYXV0aC10aGVtZSk7XG59XG5cbi50aXRsZSB7XG4gIG1hcmdpbjogMnB4IDAgMDtcbiAgZm9udC1zaXplOiAyMnB4O1xuICBmb250LXdlaWdodDogNzAwO1xuICBsaW5lLWhlaWdodDogMS4yNTtcbn1cblxuLnN1YnRpdGxlIHtcbiAgbWFyZ2luOiAwIDAgMThweDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogMS41O1xuICBjb2xvcjogJG11dGVkO1xufVxuXG4uZm9ybSB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdhcDogMTBweDtcbn1cblxuLmNoYW5uZWxUYWJzIHtcbiAgZGlzcGxheTogZ3JpZDtcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyO1xuICBnYXA6IDZweDtcbiAgbWFyZ2luLWJvdHRvbTogMnB4O1xufVxuXG4uY2hhbm5lbFRhYiB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICRib3JkZXI7XG4gIGJvcmRlci1yYWRpdXM6ICRyYWRpdXMtbWQ7XG4gIHBhZGRpbmc6IDhweCAxMHB4O1xuICBmb250LXNpemU6IDEzcHg7XG4gIGZvbnQtd2VpZ2h0OiA2NTA7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgY29sb3I6ICRtdXRlZDtcbiAgYmFja2dyb3VuZDogJHN1cmZhY2U7XG5cbiAgJjpkaXNhYmxlZCB7XG4gICAgb3BhY2l0eTogMC42NTtcbiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICB9XG59XG5cbi5jaGFubmVsVGFiQWN0aXZlIHtcbiAgY29sb3I6IHZhcigtLWx3LWF1dGgtdGhlbWUtZGVlcCk7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tbHctYXV0aC10aGVtZSk7XG4gIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1sdy1hdXRoLXRoZW1lKSAxMCUsICNmZmYpO1xufVxuXG4uY29kZVJvdyB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIGF1dG87XG4gIGdhcDogOHB4O1xuICBhbGlnbi1pdGVtczogc3RyZXRjaDtcbn1cblxuLmNvZGVJbnB1dCB7XG4gIG1pbi13aWR0aDogMDtcbn1cblxuLnNlY29uZGFyeUJ0biB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICRib3JkZXItc29mdDtcbiAgYm9yZGVyLXJhZGl1czogJHJhZGl1cy1tZDtcbiAgcGFkZGluZzogMCAxMnB4O1xuICBmb250LXNpemU6IDEzcHg7XG4gIGZvbnQtd2VpZ2h0OiA2NTA7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgY29sb3I6ICRpbms7XG4gIGJhY2tncm91bmQ6ICNmZmY7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG5cbiAgJjpkaXNhYmxlZCB7XG4gICAgb3BhY2l0eTogMC42NTtcbiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICB9XG59XG5cbi5zb2NpYWxTdGFjayB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIG1pbm1heCgwLCAxZnIpKTtcbiAgZ2FwOiAxMHB4O1xuICBmb250LXNpemU6IDEycHg7XG59XG5cbi5pbnB1dCB7XG4gIHdpZHRoOiAxMDAlO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBib3JkZXI6IDFweCBzb2xpZCAkYm9yZGVyO1xuICBib3JkZXItcmFkaXVzOiAkcmFkaXVzLW1kO1xuICBwYWRkaW5nOiAxMHB4IDEycHg7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgb3V0bGluZTogbm9uZTtcbiAgYmFja2dyb3VuZDogJHN1cmZhY2U7XG5cbiAgJjpmb2N1cyB7XG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1sdy1hdXRoLXRoZW1lKTtcbiAgfVxuXG4gICY6ZGlzYWJsZWQge1xuICAgIG9wYWNpdHk6IDAuNjU7XG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgfVxufVxuXG4ucGFzc3dvcmRGaWVsZCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLnBhc3N3b3JkSW5wdXQge1xuICBwYWRkaW5nLXJpZ2h0OiA0MnB4O1xufVxuXG4ucGFzc3dvcmRUb2dnbGUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHJpZ2h0OiA0cHg7XG4gIHRvcDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIHotaW5kZXg6IDE7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgd2lkdGg6IDM2cHg7XG4gIGhlaWdodDogMzZweDtcbiAgYm9yZGVyOiBub25lO1xuICBib3JkZXItcmFkaXVzOiAkcmFkaXVzLXNtO1xuICBwYWRkaW5nOiAwO1xuICBjb2xvcjogIzVhNmI3NjtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGN1cnNvcjogcG9pbnRlcjtcblxuICAmOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcbiAgICBjb2xvcjogdmFyKC0tbHctYXV0aC10aGVtZSk7XG4gICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWx3LWF1dGgtdGhlbWUpIDEyJSwgdHJhbnNwYXJlbnQpO1xuICB9XG5cbiAgJjpmb2N1cy12aXNpYmxlIHtcbiAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tbHctYXV0aC10aGVtZSk7XG4gICAgb3V0bGluZS1vZmZzZXQ6IDFweDtcbiAgfVxuXG4gICY6ZGlzYWJsZWQge1xuICAgIG9wYWNpdHk6IDAuNjU7XG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgfVxufVxuXG4ucHJpbWFyeUJ0biB7XG4gIGJvcmRlcjogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogJHJhZGl1cy1tZDtcbiAgcGFkZGluZzogMTFweCAxNHB4O1xuICBmb250LXNpemU6IDE0cHg7XG4gIGZvbnQtd2VpZ2h0OiA2NTA7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHZhcigtLWx3LWF1dGgtdGhlbWUpIDAlLCB2YXIoLS1sdy1hdXRoLXRoZW1lLWRlZXApIDEwMCUpO1xuXG4gICY6ZGlzYWJsZWQge1xuICAgIG9wYWNpdHk6IDAuNjU7XG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgfVxufVxuXG4uc29jaWFsQnRuIHtcbiAgd2lkdGg6IDEwMCU7XG4gIG1pbi13aWR0aDogMDtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGdhcDogOHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCAkYm9yZGVyLXNvZnQ7XG4gIGJvcmRlci1yYWRpdXM6ICRyYWRpdXMtbWQ7XG4gIHBhZGRpbmc6IDExcHggMTBweDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBmb250LXdlaWdodDogNjUwO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGNvbG9yOiAkaW5rO1xuICBiYWNrZ3JvdW5kOiAjZmZmO1xuXG4gICY6ZGlzYWJsZWQge1xuICAgIG9wYWNpdHk6IDAuNjU7XG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgfVxufVxuXG4uc29jaWFsTG9nbyB7XG4gIGZsZXgtc2hyaW5rOiAwO1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLmxvZ29GYWxsYmFjayB7XG4gIHdpZHRoOiAxOHB4O1xuICBoZWlnaHQ6IDE4cHg7XG4gIGJvcmRlci1yYWRpdXM6ICRyYWRpdXMtc207XG4gIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1sdy1hdXRoLXRoZW1lKSAxNCUsICNmZmYpO1xuICBjb2xvcjogdmFyKC0tbHctYXV0aC10aGVtZS1kZWVwKTtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBmb250LXdlaWdodDogNzAwO1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGZsZXgtc2hyaW5rOiAwO1xufVxuXG4uY2FuY2VsQnRuIHtcbiAgbWFyZ2luLXRvcDogMTBweDtcbiAgd2lkdGg6IDEwMCU7XG4gIGJvcmRlcjogbm9uZTtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGNvbG9yOiAjNWE2Yjc2O1xuICBmb250LXNpemU6IDEzcHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgcGFkZGluZzogOHB4O1xuXG4gICY6ZGlzYWJsZWQge1xuICAgIG9wYWNpdHk6IDAuNjU7XG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgfVxufVxuXG4uZGl2aWRlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMTBweDtcbiAgbWFyZ2luOiAxNHB4IDA7XG4gIGNvbG9yOiAkZGl2aWRlcjtcbn1cblxuLmRpdmlkZXJMaW5lIHtcbiAgZmxleDogMTtcbiAgaGVpZ2h0OiAxcHg7XG4gIGJhY2tncm91bmQ6ICRsaW5lO1xufVxuXG4uZGl2aWRlclRleHQge1xuICBmb250LXNpemU6IDEycHg7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIGxldHRlci1zcGFjaW5nOiAwLjA4ZW07XG59XG5cbi5oaW50IHtcbiAgbWFyZ2luOiAxMHB4IDAgMDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogJGhpbnQ7XG4gIGxpbmUtaGVpZ2h0OiAxLjQ1O1xufVxuXG4uZG9tYWluc0hpbnQge1xuICBtYXJnaW46IC0ycHggMCAwO1xuICBmb250LXNpemU6IDEycHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjQ1O1xuICBjb2xvcjogJG11dGVkO1xuICB3b3JkLWJyZWFrOiBicmVhay13b3JkO1xufVxuXG4uc3dpdGNoTW9kZSB7XG4gIG1hcmdpbjogMTJweCAwIDA7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLnN3aXRjaE1vZGVCdG4ge1xuICBib3JkZXI6IG5vbmU7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICBjb2xvcjogdmFyKC0tbHctYXV0aC10aGVtZSk7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgZm9udC13ZWlnaHQ6IDY1MDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBwYWRkaW5nOiA0cHggOHB4O1xuICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbiAgdGV4dC11bmRlcmxpbmUtb2Zmc2V0OiAzcHg7XG5cbiAgJjpkaXNhYmxlZCB7XG4gICAgb3BhY2l0eTogMC42NTtcbiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICB9XG59XG5cbi5lcnJvciB7XG4gIG1hcmdpbjogMTJweCAwIDA7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgY29sb3I6ICRkYW5nZXI7XG4gIGxpbmUtaGVpZ2h0OiAxLjQ7XG59XG5cbi5jb25zZW50IHtcbiAgbWFyZ2luOiAxMnB4IDAgMDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBsaW5lLWhlaWdodDogMS40NTtcbiAgY29sb3I6ICRpbms7XG59XG5cbi5jb25zZW50SW52YWxpZCB7XG4gIG1hcmdpbjogMTJweCAtOHB4IDA7XG4gIHBhZGRpbmc6IDhweDtcbiAgYm9yZGVyOiAxcHggc29saWQgJGRhbmdlcjtcbiAgYm9yZGVyLXJhZGl1czogJHJhZGl1cy1tZDtcbiAgYmFja2dyb3VuZDogcmdiYSgxODAsIDM1LCAyNCwgMC4wNik7XG59XG5cbi5jb25zZW50RXJyb3Ige1xuICBtYXJnaW46IDhweCAwIDA7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgZm9udC13ZWlnaHQ6IDY1MDtcbiAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgY29sb3I6ICRkYW5nZXI7XG59XG5cbi5jb25zZW50TGlua3Mge1xuICBtYXJnaW46IDA7XG4gIGEge1xuICAgIGNvbG9yOiB2YXIoLS1sdy1hdXRoLXRoZW1lKTtcbiAgfVxufVxuXG4uZm9vdGVyIHtcbiAgbWFyZ2luLXRvcDogMThweDtcbiAgcGFkZGluZy10b3A6IDEycHg7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAkZm9vdGVyLWxpbmU7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6ICRoaW50O1xuICBkaXNwbGF5OiBmbGV4O1xuICBnYXA6IDhweDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA0MjBweCkge1xuICAucGFuZWwge1xuICAgIHBhZGRpbmc6IDIycHggMTZweCAxOHB4O1xuICB9XG59XG4iXX0= */","import {\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type FormEvent,\n type ReactNode,\n} from \"react\";\nimport {\n LOGIN_EXPERIENCE_CAPABILITIES,\n resolveLoginExperienceAdapter,\n type ExperienceSocialConnector,\n type LoginExperienceAdapter,\n type SocialSignInRequest,\n} from \"./login-experience-adapter\";\nimport { LogtoExperienceAdapter } from \"./logto-experience-adapter\";\nimport { signInPopup, signInRedirect, prepareSignInRequestUrl } from \"./oidc-client\";\nimport {\n evaluateRegisterEmail,\n fetchRegisterEmailPolicy,\n registerEmailDomainsHint,\n registerEmailRejectionMessage,\n resolveRegisterEmailPolicy,\n type RegisterEmailPolicy,\n} from \"./register-policy\";\nimport { loginLabels } from \"./login-labels\";\nimport type { LoginLegalDocument } from \"./login-legal\";\nimport { isIdpConfigured, type LuminaryAuthSession, type LuminaryIdpConfig } from \"./types\";\nimport styles from \"./HeadlessLoginPanel.module.scss\";\n\n/** @deprecated Prefer dynamic connectors from IdP; kept for prop typing. */\nexport type SocialProviderTarget = string;\n\nexport interface HeadlessLoginLabels {\n title?: string;\n subtitle?: string;\n identifierPlaceholder?: string;\n /** Placeholder when panel is in register mode (username). */\n registerIdentifierPlaceholder?: string;\n passwordPlaceholder?: string;\n confirmPasswordPlaceholder?: string;\n submitPassword?: string;\n submitRegister?: string;\n /** Hosted OIDC button shown when the adapter has no password capability. */\n submitSso?: string;\n submitGoogle?: string;\n submitGithub?: string;\n socialDivider?: string;\n hint?: string;\n registerHint?: string;\n cancel?: string;\n experienceUnavailable?: string;\n showPassword?: string;\n hidePassword?: string;\n /** Switch link when on sign-in: \"Create an account\" */\n registerLink?: string;\n /** Switch link when on register: \"Already have an account? Sign in\" */\n loginLink?: string;\n passwordMismatch?: string;\n registerTitle?: string;\n registerSubtitle?: string;\n registerWithEmail?: string;\n registerWithUsername?: string;\n emailPlaceholder?: string;\n verificationCodePlaceholder?: string;\n sendCode?: string;\n resendCode?: string;\n /** Prefix before the allowlisted domain list, e.g. \"Allowed email domains\". */\n allowedDomainsPrefix?: string;\n /** Shown when mode is off / unrestricted (aside from disposable blocklist). */\n allowedDomainsOpen?: string;\n /** Shown when only disposable domains are blocked. */\n allowedDomainsBlocklist?: string;\n /**\n * Desktop/mobile system-browser social login: tell the user to finish in the browser\n * and return to the app (loopback / deep link callback).\n */\n waitingExternalBrowser?: string;\n /** Shown when password/social/SSO is blocked because product terms are not accepted. */\n consentRequired?: string;\n mfaTitle?: string;\n mfaSubtitle?: string;\n mfaCodePlaceholder?: string;\n mfaSubmit?: string;\n mfaBack?: string;\n}\n\nexport interface HeadlessLoginPanelProps {\n config: Partial<LuminaryIdpConfig>;\n /** Login-experience provider. Defaults to the catalog adapter for `config.iamProvider`. */\n experienceAdapter?: LoginExperienceAdapter;\n /** Product display name shown as brand signal */\n productName: string;\n logoSrc?: string;\n labels?: HeadlessLoginLabels;\n /**\n * Card copy locale. Unknown tags fall back to English.\n * Explicit `labels` still override individual keys.\n */\n locale?: string;\n returnUrl?: string;\n /** Prefer popup (default) for reauth; redirect for full-page SPA; external for desktop/mobile system browser (RFC 8252). */\n mode?: \"popup\" | \"redirect\" | \"external\";\n /**\n * Open an authorize URL in the OS browser / Custom Tabs / ASWebAuthenticationSession.\n * Required when `mode=\"external\"` (Google / GitHub / hosted SSO). Password Headless stays in-app.\n */\n openExternalUrl?: (url: string) => void | Promise<void>;\n /**\n * Show Experience social connectors (Google / GitHub / …).\n * Default `true`. Set `false` for admin / internal consoles that only allow\n * password (or enterprise SSO via IdP) — hides divider + social buttons and\n * skips fetching connectors.\n * Equivalent to `socialProviders={[]}` when false.\n */\n showSocialConnectors?: boolean;\n /**\n * Show self-register switch + register form.\n * Default `true` for end-user product logins. Set `false` for admin / ops consoles.\n */\n showRegister?: boolean;\n /**\n * Email domain policy for self-register.\n * If omitted, the panel loads `GET {experienceApiBase}/api/register-policy` when available,\n * otherwise uses built-in consumer allowlist defaults.\n */\n registerEmailPolicy?: RegisterEmailPolicy;\n /**\n * When true (default), fetch live policy from Auth Gateway `/api/register-policy`.\n * Set false to use only `registerEmailPolicy` / built-in defaults (e.g. local auth-dev-proxy).\n */\n fetchRegisterPolicy?: boolean;\n /**\n * Optional CAPTCHA token provider (Cloudflare Turnstile / reCAPTCHA).\n * Token is sent as `captchaToken` on Experience Register init when Logto bot protection is on.\n */\n getCaptchaToken?: () => Promise<string | undefined>;\n /**\n * Social providers (when `showSocialConnectors` is not `false`):\n * - omit / `\"auto\"` — load enabled connectors from IdP (google, github, x, …)\n * - `string[]` — only these targets (still prefers IdP logos/names when available)\n * - `[]` — hide social buttons\n */\n socialProviders?: \"auto\" | SocialProviderTarget[];\n showCancel?: boolean;\n onCancel?: () => void;\n /**\n * Called after OIDC session is obtained (popup) or before redirect navigation.\n * Products typically exchange OIDC access token → product JWT here.\n */\n onOidcSession?: (session: LuminaryAuthSession, returnUrl?: string) => Promise<void> | void;\n /** When Experience returns redirectTo, open it (default: same-tab assign). */\n onExperienceRedirect?: (redirectTo: string) => void;\n /**\n * Product terms / remember-account controls. Rendered after the password form\n * and before Google/GitHub so clickwrap sits next to every sign-in action.\n * Prefer this when the product needs extra checkboxes (remember identifier).\n */\n consent?: ReactNode;\n /**\n * Configurable legal links (LuminaryWorks platform ToS + product ToS + privacy).\n * Shown only when `consent` is omitted. Use `readLoginLegalConfigFromEnv` +\n * `buildLoginLegalDocuments` so URLs stay env-driven.\n */\n consentDocuments?: LoginLegalDocument[];\n /**\n * When `false`, password, register, hosted SSO, and social buttons do not start\n * IdP — products must collect an unchecked terms checkbox first.\n * Default `true` (no gate) for consoles that do not show product ToS yet.\n */\n consentOk?: boolean;\n /** Called when an action is blocked because `consentOk` is false. */\n onConsentBlocked?: () => void;\n /** Prefill identifier (remember-account). Never pass a stored password. */\n initialIdentifier?: string;\n onIdentifierChange?: (identifier: string) => void;\n footer?: ReactNode;\n className?: string;\n style?: CSSProperties;\n /**\n * Brand accent for primary CTA / focus / product label.\n * Defaults to ecosystem primary `#1677ff`.\n */\n themeColor?: string;\n}\n\n/** Shared default accent for product login panels (shared/brand --lw-primary). */\nexport const DEFAULT_LOGIN_THEME_COLOR = \"#1677ff\";\n\n/** Unified login card width. Product pages must not invent a second width. */\nexport const LOGIN_CARD_MAX_WIDTH = 400;\n\nconst defaults: Required<HeadlessLoginLabels> = {\n title: \"Sign in\",\n subtitle: \"Use your LuminaryWorks unified account\",\n identifierPlaceholder: \"Email or username\",\n registerIdentifierPlaceholder: \"Username\",\n passwordPlaceholder: \"Password\",\n confirmPasswordPlaceholder: \"Confirm password\",\n submitPassword: \"Sign in with password\",\n submitRegister: \"Create account\",\n submitSso: \"Continue with unified account\",\n submitGoogle: \"Google\",\n submitGithub: \"GitHub\",\n socialDivider: \"or\",\n hint: \"Social providers open directly. Password uses your LuminaryWorks account.\",\n registerHint:\n \"Email register needs a code (Gmail / Outlook / QQ / 163 / iCloud …). Username is an alternative. Prefer one-click? Use a social provider.\",\n cancel: \"Cancel\",\n experienceUnavailable: \"Password sign-in is unavailable; use a social provider instead.\",\n showPassword: \"Show password\",\n hidePassword: \"Hide password\",\n registerLink: \"Create an account\",\n loginLink: \"Already have an account? Sign in\",\n passwordMismatch: \"Passwords do not match\",\n registerTitle: \"Create account\",\n registerSubtitle: \"Create your LuminaryWorks unified account\",\n registerWithEmail: \"Email\",\n registerWithUsername: \"Username\",\n emailPlaceholder: \"Email\",\n verificationCodePlaceholder: \"Verification code\",\n sendCode: \"Send code\",\n resendCode: \"Resend code\",\n allowedDomainsPrefix: \"Allowed email domains\",\n allowedDomainsOpen: \"Email registration is open for most providers.\",\n allowedDomainsBlocklist:\n \"Most email providers are accepted. Temporary / disposable addresses are blocked.\",\n waitingExternalBrowser:\n \"Finish signing in with your browser, then return to this app.\",\n consentRequired: \"Please agree to the terms before continuing.\",\n mfaTitle: \"Authenticator code\",\n mfaSubtitle: \"Enter the 6-digit code from your authenticator app.\",\n mfaCodePlaceholder: \"123456\",\n mfaSubmit: \"Verify and continue\",\n mfaBack: \"Back\",\n};\n\nfunction resolveSieBase(config: Partial<LuminaryIdpConfig>): string | undefined {\n // Prefer same-origin Experience base (SPA proxies /api/.well-known) to avoid\n // cross-port CORS on local Logto. Fall back to issuer origin only when needed.\n const explicit = config.experienceApiBase?.trim();\n if (explicit) return explicit.replace(/\\/$/, \"\");\n if (config.issuer) {\n try {\n return new URL(config.issuer).origin;\n } catch {\n /* fall through */\n }\n }\n return undefined;\n}\n\nfunction labelFor(connector: ExperienceSocialConnector, labels: Required<HeadlessLoginLabels>): string {\n if (connector.target === \"google\" && labels.submitGoogle) return labels.submitGoogle;\n if (connector.target === \"github\" && labels.submitGithub) return labels.submitGithub;\n return connector.name;\n}\n\nfunction cx(...parts: Array<string | undefined | false>): string {\n return parts.filter(Boolean).join(\" \");\n}\n\nexport function HeadlessLoginPanel({\n config,\n experienceAdapter: experienceAdapterProp,\n productName,\n logoSrc,\n labels: labelsProp,\n locale,\n returnUrl,\n mode = \"popup\",\n openExternalUrl,\n showSocialConnectors = true,\n showRegister = true,\n registerEmailPolicy: registerEmailPolicyProp,\n fetchRegisterPolicy = true,\n getCaptchaToken,\n socialProviders = \"auto\",\n showCancel,\n onCancel,\n onOidcSession,\n onExperienceRedirect,\n consent,\n consentDocuments,\n consentOk = true,\n onConsentBlocked,\n initialIdentifier,\n onIdentifierChange,\n footer,\n className,\n style,\n themeColor = DEFAULT_LOGIN_THEME_COLOR,\n}: HeadlessLoginPanelProps) {\n const experienceAdapter = resolveLoginExperienceAdapter(\n experienceAdapterProp,\n config.iamProvider,\n );\n const [emailPolicy, setEmailPolicy] = useState<RegisterEmailPolicy>(\n () => registerEmailPolicyProp ?? resolveRegisterEmailPolicy(),\n );\n useEffect(() => {\n if (registerEmailPolicyProp) {\n setEmailPolicy(registerEmailPolicyProp);\n return;\n }\n if (!fetchRegisterPolicy || !showRegister) {\n setEmailPolicy(resolveRegisterEmailPolicy());\n return;\n }\n const base = config.experienceApiBase?.trim();\n if (!base) {\n setEmailPolicy(resolveRegisterEmailPolicy());\n return;\n }\n let cancelled = false;\n void fetchRegisterEmailPolicy(base).then((policy) => {\n if (!cancelled) setEmailPolicy(policy);\n });\n return () => {\n cancelled = true;\n };\n }, [\n config.experienceApiBase,\n fetchRegisterPolicy,\n registerEmailPolicyProp,\n showRegister,\n ]);\n useEffect(() => {\n if (experienceAdapter instanceof LogtoExperienceAdapter) {\n experienceAdapter.emailPolicy = emailPolicy;\n }\n }, [emailPolicy, experienceAdapter]);\n const labels = { ...defaults, ...loginLabels(locale), ...labelsProp };\n const configured = isIdpConfigured(config);\n const [panelMode, setPanelMode] = useState<\"sign-in\" | \"register\">(\"sign-in\");\n const [registerChannel, setRegisterChannel] = useState<\"email\" | \"username\">(\"email\");\n const [identifier, setIdentifier] = useState(initialIdentifier ?? \"\");\n const hydratedIdentifier = useRef(false);\n useEffect(() => {\n if (hydratedIdentifier.current) return;\n if (!initialIdentifier) return;\n hydratedIdentifier.current = true;\n setIdentifier(initialIdentifier);\n }, [initialIdentifier]);\n const [password, setPassword] = useState(\"\");\n const [confirmPassword, setConfirmPassword] = useState(\"\");\n const [verificationCode, setVerificationCode] = useState(\"\");\n const [emailVerificationId, setEmailVerificationId] = useState<string | null>(null);\n const [passwordVisible, setPasswordVisible] = useState(false);\n const panelStyle: CSSProperties = {\n width: `min(100%, ${LOGIN_CARD_MAX_WIDTH}px)`,\n maxWidth: LOGIN_CARD_MAX_WIDTH,\n ...style,\n [\"--lw-auth-theme\" as string]: themeColor || DEFAULT_LOGIN_THEME_COLOR,\n };\n const [loading, setLoading] = useState<\"password\" | string | null>(null);\n const [error, setError] = useState(\"\");\n const [consentBlocked, setConsentBlocked] = useState(false);\n const [mfaPending, setMfaPending] = useState(false);\n const [mfaCode, setMfaCode] = useState(\"\");\n const [awaitingExternal, setAwaitingExternal] = useState(false);\n const [connectors, setConnectors] = useState<ExperienceSocialConnector[]>([]);\n const socialEnabled =\n showSocialConnectors !== false &&\n !(Array.isArray(socialProviders) && socialProviders.length === 0) &&\n experienceAdapter.capabilities.includes(LOGIN_EXPERIENCE_CAPABILITIES.socialConnectors) &&\n experienceAdapter.capabilities.includes(LOGIN_EXPERIENCE_CAPABILITIES.socialDirectSignIn) &&\n typeof experienceAdapter.fetchSocialConnectors === \"function\" &&\n typeof experienceAdapter.createSocialSignInRequest === \"function\";\n const passwordEnabled =\n experienceAdapter.capabilities.includes(LOGIN_EXPERIENCE_CAPABILITIES.passwordSignIn) &&\n typeof experienceAdapter.experiencePasswordSignIn === \"function\";\n const registerEnabled =\n showRegister !== false &&\n ((experienceAdapter.capabilities.includes(LOGIN_EXPERIENCE_CAPABILITIES.passwordSignUp) &&\n typeof experienceAdapter.experiencePasswordSignUp === \"function\") ||\n (experienceAdapter.capabilities.includes(LOGIN_EXPERIENCE_CAPABILITIES.emailCodeSignUp) &&\n typeof experienceAdapter.sendRegisterEmailCode === \"function\" &&\n typeof experienceAdapter.experienceEmailPasswordSignUp === \"function\"));\n const emailRegisterEnabled =\n experienceAdapter.capabilities.includes(LOGIN_EXPERIENCE_CAPABILITIES.emailCodeSignUp) &&\n typeof experienceAdapter.sendRegisterEmailCode === \"function\" &&\n typeof experienceAdapter.experienceEmailPasswordSignUp === \"function\";\n const usernameRegisterEnabled =\n experienceAdapter.capabilities.includes(LOGIN_EXPERIENCE_CAPABILITIES.passwordSignUp) &&\n typeof experienceAdapter.experiencePasswordSignUp === \"function\";\n const isRegister = panelMode === \"register\" && registerEnabled;\n const useEmailRegister = isRegister && registerChannel === \"email\" && emailRegisterEnabled;\n\n // Browser back from IdP restores bfcache with loading still set → \"…\".\n useEffect(() => {\n const resetBusy = () => {\n setLoading(null);\n setAwaitingExternal(false);\n };\n window.addEventListener(\"pageshow\", resetBusy);\n window.addEventListener(\"popstate\", resetBusy);\n return () => {\n window.removeEventListener(\"pageshow\", resetBusy);\n window.removeEventListener(\"popstate\", resetBusy);\n };\n }, []);\n\n useEffect(() => {\n const fetchConnectors = experienceAdapter.fetchSocialConnectors;\n if (!socialEnabled || !fetchConnectors) {\n setConnectors([]);\n return;\n }\n let cancelled = false;\n const sieBase = resolveSieBase(config);\n const allowlist =\n socialProviders === \"auto\" || socialProviders === undefined\n ? null\n : new Set(socialProviders.map((t) => t.toLowerCase()));\n\n const apply = (list: ExperienceSocialConnector[]) => {\n const filtered = allowlist\n ? list.filter((c) => allowlist.has(c.target.toLowerCase()))\n : list;\n if (!cancelled) setConnectors(filtered);\n };\n\n if (!sieBase) {\n // No Experience base — do not invent Google/GitHub buttons. Fake fallbacks\n // start OIDC `direct_sign_in` and dump users on Logto `/sign-in`.\n if (!cancelled) setConnectors([]);\n return;\n }\n\n void fetchConnectors.call(experienceAdapter, { apiBase: sieBase, appId: config.clientId })\n .then((list) => {\n apply(list);\n })\n .catch(() => {\n if (!cancelled) setConnectors([]);\n });\n\n return () => {\n cancelled = true;\n };\n }, [\n config.clientId,\n config.experienceApiBase,\n config.issuer,\n experienceAdapter,\n socialEnabled,\n socialProviders,\n ]);\n\n useEffect(() => {\n if (consentOk) setConsentBlocked(false);\n }, [consentOk]);\n\n const ensureConsent = (): boolean => {\n if (consentOk) return true;\n setConsentBlocked(true);\n onConsentBlocked?.();\n return false;\n };\n\n const runOidc = async (experienceRequest?: SocialSignInRequest) => {\n if (!configured) throw new Error(\"IdP not configured\");\n if (mode === \"external\") {\n if (!openExternalUrl) {\n throw new Error(\"openExternalUrl is required when mode is \\\"external\\\"\");\n }\n const url = await prepareSignInRequestUrl(config as LuminaryIdpConfig, {\n returnUrl,\n ...experienceRequest,\n });\n setAwaitingExternal(true);\n await openExternalUrl(url);\n setLoading(null);\n return;\n }\n if (mode === \"redirect\") {\n await signInRedirect(config, { returnUrl, ...experienceRequest });\n return;\n }\n const { session, returnUrl: next } = await signInPopup(config, {\n returnUrl,\n ...experienceRequest,\n });\n await onOidcSession?.(session, next);\n };\n\n const runSocial = async (target: string) => {\n if (!ensureConsent()) return;\n setError(\"\");\n setLoading(target);\n try {\n if (\n !socialEnabled ||\n !experienceAdapter.capabilities.includes(\n LOGIN_EXPERIENCE_CAPABILITIES.socialDirectSignIn,\n ) ||\n !experienceAdapter.createSocialSignInRequest\n ) {\n throw new Error(\"Login experience does not support direct social sign-in\");\n }\n await runOidc(experienceAdapter.createSocialSignInRequest(target));\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n setLoading(null);\n setAwaitingExternal(false);\n }\n };\n\n const runHostedOidc = async () => {\n if (!ensureConsent()) return;\n setError(\"\");\n setLoading(\"sso\");\n try {\n await runOidc();\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n setLoading(null);\n setAwaitingExternal(false);\n }\n };\n\n const followExperienceRedirect = (redirectTo: string) => {\n if (onExperienceRedirect) {\n onExperienceRedirect(redirectTo);\n return;\n }\n window.location.assign(redirectTo);\n };\n\n const runPassword = async (event: FormEvent) => {\n event.preventDefault();\n if (!configured) return;\n if (!ensureConsent()) return;\n setError(\"\");\n setLoading(\"password\");\n try {\n const apiBase = config.experienceApiBase?.trim();\n if (!apiBase) {\n throw new Error(labels.experienceUnavailable);\n }\n const captchaToken = getCaptchaToken ? await getCaptchaToken() : undefined;\n if (isRegister) {\n if (password !== confirmPassword) {\n throw new Error(labels.passwordMismatch);\n }\n if (useEmailRegister) {\n if (!experienceAdapter.experienceEmailPasswordSignUp || !emailVerificationId) {\n throw new Error(\"Send and enter the email verification code first\");\n }\n const decision = evaluateRegisterEmail(identifier.trim(), emailPolicy);\n if (!decision.ok) throw new Error(registerEmailRejectionMessage(decision));\n const result = await experienceAdapter.experienceEmailPasswordSignUp({\n apiBase,\n identifier: identifier.trim(),\n email: identifier.trim(),\n password,\n code: verificationCode,\n verificationId: emailVerificationId,\n captchaToken,\n issuer: config.issuer,\n clientId: config.clientId,\n redirectUri: config.redirectUri,\n audience: config.audience,\n scopes: config.scopes,\n returnUrl,\n });\n if (result.redirectTo) {\n followExperienceRedirect(result.redirectTo);\n return;\n }\n throw new Error(\"Experience API did not return redirectTo\");\n }\n if (!usernameRegisterEnabled || !experienceAdapter.experiencePasswordSignUp) {\n throw new Error(labels.experienceUnavailable);\n }\n const result = await experienceAdapter.experiencePasswordSignUp({\n apiBase,\n identifier: identifier.trim(),\n password,\n captchaToken,\n issuer: config.issuer,\n clientId: config.clientId,\n redirectUri: config.redirectUri,\n audience: config.audience,\n scopes: config.scopes,\n returnUrl,\n });\n if (result.redirectTo) {\n followExperienceRedirect(result.redirectTo);\n return;\n }\n throw new Error(\"Experience API did not return redirectTo\");\n }\n if (\n !passwordEnabled ||\n !experienceAdapter.capabilities.includes(\n LOGIN_EXPERIENCE_CAPABILITIES.passwordSignIn,\n ) ||\n !experienceAdapter.experiencePasswordSignIn\n ) {\n throw new Error(labels.experienceUnavailable);\n }\n const result = await experienceAdapter.experiencePasswordSignIn({\n apiBase,\n identifier: identifier.trim(),\n password,\n issuer: config.issuer,\n clientId: config.clientId,\n redirectUri: config.redirectUri,\n audience: config.audience,\n scopes: config.scopes,\n returnUrl,\n });\n if (result.mfaRequired) {\n setMfaPending(true);\n setMfaCode(\"\");\n setLoading(null);\n return;\n }\n if (result.redirectTo) {\n followExperienceRedirect(result.redirectTo);\n return;\n }\n throw new Error(\"Experience API did not return redirectTo\");\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n setLoading(null);\n }\n };\n\n const runMfa = async (event: FormEvent) => {\n event.preventDefault();\n if (!configured || !ensureConsent()) return;\n setError(\"\");\n setLoading(\"mfa\");\n try {\n const apiBase = config.experienceApiBase?.trim();\n if (!apiBase || !experienceAdapter.experienceVerifyTotp) {\n throw new Error(labels.experienceUnavailable);\n }\n const result = await experienceAdapter.experienceVerifyTotp({\n apiBase,\n code: mfaCode,\n });\n if (result.redirectTo) {\n followExperienceRedirect(result.redirectTo);\n return;\n }\n throw new Error(\"Experience API did not return redirectTo\");\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n setLoading(null);\n }\n };\n\n const runSendCode = async () => {\n if (!configured || !useEmailRegister) return;\n if (!ensureConsent()) return;\n setError(\"\");\n setLoading(\"send-code\");\n try {\n const apiBase = config.experienceApiBase?.trim();\n if (!apiBase || !experienceAdapter.sendRegisterEmailCode) {\n throw new Error(labels.experienceUnavailable);\n }\n const email = identifier.trim();\n const decision = evaluateRegisterEmail(email, emailPolicy);\n if (!decision.ok) throw new Error(registerEmailRejectionMessage(decision));\n const captchaToken = getCaptchaToken ? await getCaptchaToken() : undefined;\n const sent = await experienceAdapter.sendRegisterEmailCode({\n apiBase,\n identifier: email,\n email,\n captchaToken,\n issuer: config.issuer,\n clientId: config.clientId,\n redirectUri: config.redirectUri,\n audience: config.audience,\n scopes: config.scopes,\n returnUrl,\n });\n setEmailVerificationId(sent.verificationId);\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setLoading(null);\n }\n };\n\n const switchPanelMode = (next: \"sign-in\" | \"register\") => {\n setPanelMode(next);\n setError(\"\");\n setConfirmPassword(\"\");\n setVerificationCode(\"\");\n setEmailVerificationId(null);\n };\n\n const busy = loading !== null;\n const showSocial = socialEnabled && connectors.length > 0;\n const showHint = Boolean(labelsProp?.hint) || showSocial || isRegister;\n const formReady =\n Boolean(identifier.trim()) &&\n Boolean(password) &&\n (!isRegister || Boolean(confirmPassword)) &&\n (!useEmailRegister || (Boolean(verificationCode.trim()) && Boolean(emailVerificationId)));\n const titleText = mfaPending ? labels.mfaTitle : isRegister ? labels.registerTitle : labels.title;\n const subtitleText = mfaPending\n ? labels.mfaSubtitle\n : isRegister\n ? labels.registerSubtitle\n : labels.subtitle;\n const identifierPlaceholder = isRegister\n ? useEmailRegister\n ? labels.emailPlaceholder\n : labels.registerIdentifierPlaceholder\n : labels.identifierPlaceholder;\n const submitLabel = isRegister ? labels.submitRegister : labels.submitPassword;\n const hintText = isRegister ? labels.registerHint : labels.hint;\n const domainsHint =\n useEmailRegister\n ? registerEmailDomainsHint(emailPolicy, {\n allowedDomainsPrefix: labels.allowedDomainsPrefix,\n allowedDomainsOpen: labels.allowedDomainsOpen,\n allowedDomainsBlocklist: labels.allowedDomainsBlocklist,\n })\n : null;\n\n return (\n <div className={cx(styles.panel, className)} style={panelStyle}>\n <header className={styles.brand}>\n {logoSrc ? <img src={logoSrc} alt=\"\" width={48} height={48} className={styles.logo} /> : null}\n <div>\n <p className={styles.product}>{productName}</p>\n <h2 className={styles.title}>{titleText}</h2>\n </div>\n </header>\n <p className={styles.subtitle}>{subtitleText}</p>\n\n {configured ? (\n <>\n {passwordEnabled && mfaPending ? (\n <form onSubmit={(e) => void runMfa(e)} className={styles.form}>\n <input\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n name=\"totp\"\n placeholder={labels.mfaCodePlaceholder}\n value={mfaCode}\n onChange={(e) => setMfaCode(e.target.value)}\n className={styles.input}\n disabled={busy}\n />\n <button\n type=\"submit\"\n className={styles.primaryBtn}\n disabled={busy || mfaCode.trim().length < 6}\n >\n {loading === \"mfa\" ? \"…\" : labels.mfaSubmit}\n </button>\n <button\n type=\"button\"\n className={styles.cancelBtn}\n disabled={busy}\n onClick={() => {\n setMfaPending(false);\n setMfaCode(\"\");\n setError(\"\");\n }}\n >\n {labels.mfaBack}\n </button>\n </form>\n ) : passwordEnabled ? (\n <form onSubmit={(e) => void runPassword(e)} className={styles.form}>\n {isRegister && emailRegisterEnabled && usernameRegisterEnabled ? (\n <div className={styles.channelTabs} role=\"tablist\" aria-label=\"Register method\">\n <button\n type=\"button\"\n role=\"tab\"\n className={cx(\n styles.channelTab,\n registerChannel === \"email\" && styles.channelTabActive,\n )}\n aria-selected={registerChannel === \"email\"}\n disabled={busy}\n onClick={() => {\n setRegisterChannel(\"email\");\n setEmailVerificationId(null);\n setVerificationCode(\"\");\n setError(\"\");\n }}\n >\n {labels.registerWithEmail}\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n className={cx(\n styles.channelTab,\n registerChannel === \"username\" && styles.channelTabActive,\n )}\n aria-selected={registerChannel === \"username\"}\n disabled={busy}\n onClick={() => {\n setRegisterChannel(\"username\");\n setEmailVerificationId(null);\n setVerificationCode(\"\");\n setError(\"\");\n }}\n >\n {labels.registerWithUsername}\n </button>\n </div>\n ) : null}\n <input\n type={useEmailRegister ? \"email\" : \"text\"}\n name=\"identifier\"\n autoComplete={isRegister ? \"username\" : \"username\"}\n placeholder={identifierPlaceholder}\n value={identifier}\n onChange={(e) => {\n const next = e.target.value;\n setIdentifier(next);\n onIdentifierChange?.(next);\n if (useEmailRegister) {\n setEmailVerificationId(null);\n }\n }}\n className={styles.input}\n disabled={busy}\n />\n {domainsHint ? (\n <p className={styles.domainsHint} data-testid=\"register-allowed-domains\">\n {domainsHint}\n </p>\n ) : null}\n {useEmailRegister ? (\n <div className={styles.codeRow}>\n <input\n type=\"text\"\n name=\"verificationCode\"\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n placeholder={labels.verificationCodePlaceholder}\n value={verificationCode}\n onChange={(e) => setVerificationCode(e.target.value)}\n className={cx(styles.input, styles.codeInput)}\n disabled={busy}\n />\n <button\n type=\"button\"\n className={styles.secondaryBtn}\n disabled={busy || !identifier.trim()}\n onClick={() => void runSendCode()}\n >\n {loading === \"send-code\"\n ? \"…\"\n : emailVerificationId\n ? labels.resendCode\n : labels.sendCode}\n </button>\n </div>\n ) : null}\n <div className={styles.passwordField}>\n <input\n type={passwordVisible ? \"text\" : \"password\"}\n name=\"password\"\n autoComplete={isRegister ? \"new-password\" : \"current-password\"}\n placeholder={labels.passwordPlaceholder}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n className={cx(styles.input, styles.passwordInput)}\n disabled={busy}\n />\n <button\n type=\"button\"\n className={styles.passwordToggle}\n disabled={busy}\n aria-label={passwordVisible ? labels.hidePassword : labels.showPassword}\n aria-pressed={passwordVisible}\n onClick={() => setPasswordVisible((v) => !v)}\n >\n <PasswordVisibilityIcon visible={passwordVisible} />\n </button>\n </div>\n {isRegister ? (\n <div className={styles.passwordField}>\n <input\n type={passwordVisible ? \"text\" : \"password\"}\n name=\"confirmPassword\"\n autoComplete=\"new-password\"\n placeholder={labels.confirmPasswordPlaceholder}\n value={confirmPassword}\n onChange={(e) => setConfirmPassword(e.target.value)}\n className={cx(styles.input, styles.passwordInput)}\n disabled={busy}\n />\n </div>\n ) : null}\n <button type=\"submit\" className={styles.primaryBtn} disabled={busy || !formReady}>\n {loading === \"password\" ? \"…\" : submitLabel}\n </button>\n </form>\n ) : (\n <div className={styles.form}>\n <button\n type=\"button\"\n className={styles.primaryBtn}\n disabled={busy}\n onClick={() => void runHostedOidc()}\n >\n {loading === \"sso\" ? \"…\" : labels.submitSso}\n </button>\n </div>\n )}\n {consent || (consentDocuments && consentDocuments.length > 0) || consentBlocked ? (\n <div className={cx(styles.consent, consentBlocked && styles.consentInvalid)}>\n {consent ? (\n consent\n ) : consentDocuments && consentDocuments.length > 0 ? (\n <p className={styles.consentLinks}>\n {consentDocuments.map((doc, index) => (\n <span key={doc.id}>\n {index > 0 ? \" · \" : null}\n <a href={doc.href} target=\"_blank\" rel=\"noopener noreferrer\">\n {doc.label}\n </a>\n </span>\n ))}\n </p>\n ) : null}\n {consentBlocked ? <p className={styles.consentError}>{labels.consentRequired}</p> : null}\n </div>\n ) : null}\n\n {showHint ? <p className={styles.hint}>{hintText}</p> : null}\n\n {registerEnabled && passwordEnabled ? (\n <p className={styles.switchMode}>\n <button\n type=\"button\"\n className={styles.switchModeBtn}\n disabled={busy}\n onClick={() => switchPanelMode(isRegister ? \"sign-in\" : \"register\")}\n >\n {isRegister ? labels.loginLink : labels.registerLink}\n </button>\n </p>\n ) : null}\n\n {awaitingExternal ? (\n <p className={styles.hint} role=\"status\">\n {labels.waitingExternalBrowser}\n </p>\n ) : null}\n\n {showSocial ? (\n <div className={styles.divider} aria-hidden>\n <span className={styles.dividerLine} />\n <span className={styles.dividerText}>{labels.socialDivider}</span>\n <span className={styles.dividerLine} />\n </div>\n ) : null}\n {showSocial ? (\n <div className={styles.socialStack}>\n {connectors.map((connector) => (\n <button\n key={connector.id}\n type=\"button\"\n className={styles.socialBtn}\n disabled={busy}\n onClick={() => void runSocial(connector.target)}\n >\n <SocialLogo connector={connector} />\n {loading === connector.target ? \"…\" : labelFor(connector, labels)}\n </button>\n ))}\n </div>\n ) : null}\n\n </>\n ) : (\n <p className={styles.error}>IdP is not configured (issuer / clientId / redirectUri).</p>\n )}\n\n {error ? <p className={styles.error}>{error}</p> : null}\n\n {showCancel ? (\n <button type=\"button\" className={styles.cancelBtn} disabled={busy} onClick={onCancel}>\n {labels.cancel}\n </button>\n ) : null}\n\n {footer ? <footer className={styles.footer}>{footer}</footer> : null}\n </div>\n );\n}\n\nfunction SocialLogo({ connector }: { connector: ExperienceSocialConnector }) {\n if (connector.logo) {\n return <img src={connector.logo} alt=\"\" width={18} height={18} className={styles.socialLogo} />;\n }\n return (\n <span className={styles.logoFallback} aria-hidden>\n {connector.name.slice(0, 1).toUpperCase()}\n </span>\n );\n}\n\nfunction PasswordVisibilityIcon({ visible }: { visible: boolean }) {\n // Filled icons (antd Eye / EyeInvisible style) — no dependency.\n if (visible) {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\" aria-hidden>\n <path d=\"M942.2 486.2C847.4 286.5 704.1 186 512 186c-57.9 0-111.5 9.8-160.3 27.7l72.3 72.3C457 273.3 483.5 266 512 266c161.3 0 279.4 81.8 362.7 254-26.3 54.4-57.5 100.2-93.3 136.1l59.6 59.6C891.4 655.7 932.5 578.5 942.2 537.7a60.3 60.3 0 000-51.5zM336.6 278.6l-59.9-59.9C230.6 255.4 182.8 296.4 141.9 348.1 95.4 412.1 64.6 486.5 51.8 512a60.3 60.3 0 000 51.5C115.3 719.5 224.6 814.8 365.4 860.1l72.5-72.5C353.6 761.6 286.3 698.3 241.3 612.5 220.6 573.1 205 528.6 194.5 486.2c24.5-50.4 55.1-92.1 90.8-124.9l51.3-51.3zM606.6 556.6A112 112 0 01467.4 417.4L606.6 556.6zM508 624c-26.5 0-50.9-9.2-70.2-24.6l-59.9 59.9A175.3 175.3 0 00508 688c97.2 0 176-78.8 176-176 0-26.5-9.2-50.9-24.6-70.2l-59.9 59.9c15.4 19.3 24.6 43.7 24.6 70.2 0 61.9-50.1 112-112 112zM880 112L112 880l48 48 768-768z\" />\n </svg>\n );\n }\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\" aria-hidden>\n <path d=\"M942.2 486.2C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3a60.3 60.3 0 000 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3a60.3 60.3 0 000-51.5zM512 766c-161.3 0-279.4-81.8-362.7-254C232.6 339.8 350.7 258 512 258c161.3 0 279.4 81.8 362.7 254C791.5 684.2 673.4 766 512 766z\" />\n <path d=\"M508 336c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm0 288c-61.9 0-112-50.1-112-112s50.1-112 112-112 112 50.1 112 112-50.1 112-112 112z\" />\n </svg>\n );\n}\n","import { useSyncExternalStore, type CSSProperties, type ReactNode } from \"react\";\nimport { authGate } from \"./auth-gate\";\nimport { HeadlessLoginPanel, type HeadlessLoginLabels } from \"./HeadlessLoginPanel\";\nimport type { LuminaryAuthSession, LuminaryIdpConfig } from \"./types\";\n\nexport interface ReauthOverlayProps {\n config: Partial<LuminaryIdpConfig>;\n productName: string;\n logoSrc?: string;\n labels?: HeadlessLoginLabels;\n returnUrl?: string;\n /** Brand accent forwarded to HeadlessLoginPanel (default `#1677ff`). */\n themeColor?: string;\n /** Exchange OIDC token / persist product session, then AuthGate completes. */\n onOidcSession: (session: LuminaryAuthSession, returnUrl?: string) => Promise<void> | void;\n /** Optional custom body instead of HeadlessLoginPanel */\n children?: ReactNode;\n /** Allow dismiss → cancelReauth (default true for mid-session; false for hard gate). */\n dismissible?: boolean;\n onDismiss?: () => void;\n}\n\n/**\n * Full-viewport soft gate shown while AuthGate phase is `reauth` (or `refreshing` spinner).\n * Does not iframe the IdP — uses Headless panel + OIDC popup.\n */\nexport function ReauthOverlay({\n config,\n productName,\n logoSrc,\n labels,\n returnUrl,\n themeColor,\n onOidcSession,\n children,\n dismissible = true,\n onDismiss,\n}: ReauthOverlayProps) {\n const snapshot = useSyncExternalStore(authGate.subscribe, authGate.getSnapshot, authGate.getSnapshot);\n\n if (snapshot.phase === \"idle\") return null;\n\n const resolvedReturnUrl =\n returnUrl ??\n (() => {\n if (typeof window === \"undefined\") return undefined;\n const hash = window.location.hash.replace(/^#/, \"\");\n if (!hash || hash.startsWith(\"/login\") || hash.startsWith(\"/auth/\")) return undefined;\n return hash.startsWith(\"/\") ? hash : `/${hash}`;\n })();\n\n const handleSession = async (session: LuminaryAuthSession, next?: string) => {\n await onOidcSession(session, next);\n authGate.completeReauth();\n };\n\n const handleCancel = () => {\n onDismiss?.();\n authGate.cancelReauth(\"cancelled\");\n };\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={productName}\n style={backdropStyle}\n onClick={dismissible ? handleCancel : undefined}\n >\n <div style={centerStyle} onClick={(e) => e.stopPropagation()}>\n {snapshot.phase === \"refreshing\" ? (\n <div style={spinnerCardStyle}>\n <div style={spinnerStyle} />\n <p style={{ margin: 0, color: \"#e8eef2\" }}>Refreshing session…</p>\n </div>\n ) : children ? (\n children\n ) : (\n <HeadlessLoginPanel\n config={config}\n productName={productName}\n logoSrc={logoSrc}\n themeColor={themeColor}\n labels={{\n title: labels?.title ?? \"Session expired\",\n subtitle: labels?.subtitle ?? \"Sign in again to keep working — this page will not reload.\",\n ...labels,\n }}\n returnUrl={resolvedReturnUrl}\n mode=\"popup\"\n showRegister={false}\n showCancel={dismissible}\n onCancel={handleCancel}\n onOidcSession={handleSession}\n />\n )}\n </div>\n </div>\n );\n}\n\nconst backdropStyle: CSSProperties = {\n position: \"fixed\",\n inset: 0,\n zIndex: 10000,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 24,\n background:\n \"radial-gradient(1200px 600px at 20% 10%, rgba(56, 120, 150, 0.35), transparent 55%), rgba(10, 18, 24, 0.72)\",\n backdropFilter: \"blur(6px)\",\n};\n\nconst centerStyle: CSSProperties = {\n width: \"min(100%, 420px)\",\n};\n\nconst spinnerCardStyle: CSSProperties = {\n display: \"grid\",\n justifyItems: \"center\",\n gap: 14,\n padding: 28,\n borderRadius: 16,\n background: \"rgba(20, 32, 40, 0.88)\",\n};\n\nconst spinnerStyle: CSSProperties = {\n width: 36,\n height: 36,\n borderRadius: \"50%\",\n border: \"3px solid rgba(255,255,255,0.2)\",\n borderTopColor: \"#7ec8e3\",\n animation: \"luminary-auth-spin 0.8s linear infinite\",\n};\n\n// Inject keyframes once\nif (typeof document !== \"undefined\" && !document.getElementById(\"luminary-auth-spin-style\")) {\n const style = document.createElement(\"style\");\n style.id = \"luminary-auth-spin-style\";\n style.textContent = `@keyframes luminary-auth-spin { to { transform: rotate(360deg); } }`;\n document.head.appendChild(style);\n}\n","import { createContext, useContext, useEffect, useMemo, type ReactNode } from \"react\";\nimport { useSyncExternalStore } from \"react\";\nimport { authGate, type AuthGateConfig, type AuthGateSnapshot } from \"./auth-gate\";\nimport { ReauthOverlay, type ReauthOverlayProps } from \"./ReauthOverlay\";\nimport type { LuminaryAuthSession, LuminaryIdpConfig } from \"./types\";\n\ninterface AuthGateContextValue {\n snapshot: AuthGateSnapshot;\n requestReauth: (message?: string) => Promise<\"retry\" | \"fail\">;\n completeReauth: () => void;\n cancelReauth: (message?: string) => void;\n}\n\nconst AuthGateContext = createContext<AuthGateContextValue | null>(null);\n\nexport interface AuthGateProviderProps extends AuthGateConfig {\n children: ReactNode;\n /** When set, mounts {@link ReauthOverlay} automatically. */\n overlay?: Omit<ReauthOverlayProps, \"onOidcSession\"> & {\n onOidcSession: (session: LuminaryAuthSession, returnUrl?: string) => Promise<void> | void;\n config: Partial<LuminaryIdpConfig>;\n };\n}\n\nexport function AuthGateProvider({\n children,\n tryRefresh,\n onReauthRequired,\n onSettled,\n overlay,\n}: AuthGateProviderProps) {\n useEffect(() => {\n authGate.configure({ tryRefresh, onReauthRequired, onSettled });\n }, [tryRefresh, onReauthRequired, onSettled]);\n\n const snapshot = useSyncExternalStore(authGate.subscribe, authGate.getSnapshot, authGate.getSnapshot);\n\n const value = useMemo<AuthGateContextValue>(\n () => ({\n snapshot,\n requestReauth: (message?: string) => authGate.requestReauth(message),\n completeReauth: () => authGate.completeReauth(),\n cancelReauth: (message?: string) => authGate.cancelReauth(message),\n }),\n [snapshot],\n );\n\n return (\n <AuthGateContext.Provider value={value}>\n {children}\n {overlay ? <ReauthOverlay {...overlay} /> : null}\n </AuthGateContext.Provider>\n );\n}\n\nexport function useAuthGate(): AuthGateContextValue {\n const ctx = useContext(AuthGateContext);\n if (!ctx) throw new Error(\"useAuthGate must be used within AuthGateProvider\");\n return ctx;\n}\n\n/** Optional hook — returns null outside provider (for shared API helpers). */\nexport function useAuthGateOptional(): AuthGateContextValue | null {\n return useContext(AuthGateContext);\n}\n","export const DEFAULT_PLATFORM_TERMS_URL = \"https://luminaryworks.dev/legal/terms\";\nexport const DEFAULT_PLATFORM_PRIVACY_URL = \"https://luminaryworks.dev/legal/privacy\";\n\nexport type LoginLegalUrls = {\n platformTermsUrl: string;\n platformPrivacyUrl: string;\n productTermsUrl: string;\n productPrivacyUrl: string;\n};\n\nexport type LoginLegalDocument = {\n id: string;\n href: string;\n label: string;\n};\n\nfunction pickEnv(\n env: Record<string, string | undefined>,\n name: string,\n): string | undefined {\n const keys = [`VITE_${name}`, `PUBLIC_${name}`, `NEXT_PUBLIC_${name}`, name];\n for (const key of keys) {\n const value = env[key]?.trim();\n if (value) return value;\n }\n return undefined;\n}\n\n/**\n * Login clickwrap URLs. The checkbox links the product terms and the privacy\n * notice. Product terms must incorporate the LuminaryWorks platform terms by\n * reference; those platform URLs stay configurable for the legal pages.\n */\nexport function readLoginLegalConfigFromEnv(\n env: Record<string, string | undefined>,\n defaults?: Partial<LoginLegalUrls>,\n): LoginLegalUrls {\n return {\n platformTermsUrl:\n pickEnv(env, \"LEGAL_PLATFORM_TERMS_URL\") ||\n defaults?.platformTermsUrl ||\n DEFAULT_PLATFORM_TERMS_URL,\n platformPrivacyUrl:\n pickEnv(env, \"LEGAL_PLATFORM_PRIVACY_URL\") ||\n defaults?.platformPrivacyUrl ||\n DEFAULT_PLATFORM_PRIVACY_URL,\n productTermsUrl:\n pickEnv(env, \"LEGAL_PRODUCT_TERMS_URL\") ||\n defaults?.productTermsUrl ||\n \"/legal/terms\",\n productPrivacyUrl:\n pickEnv(env, \"LEGAL_PRODUCT_PRIVACY_URL\") ||\n defaults?.productPrivacyUrl ||\n \"/legal/privacy\",\n };\n}\n\nexport function buildLoginLegalDocuments(\n urls: LoginLegalUrls,\n labels: {\n /** Kept so existing callers compile. Not shown; product terms incorporate it. */\n platformTerms?: string;\n productTerms: string;\n privacy: string;\n },\n): LoginLegalDocument[] {\n const docs: LoginLegalDocument[] = [\n {\n id: \"product-terms\",\n href: urls.productTermsUrl,\n label: labels.productTerms,\n },\n {\n id: \"privacy\",\n href: urls.productPrivacyUrl || urls.platformPrivacyUrl,\n label: labels.privacy,\n },\n ];\n return docs.filter((row) => row.href.length > 0 && row.label.length > 0);\n}\n",".switch {\n position: relative;\n display: inline-flex;\n}\n\n.trigger {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n height: 32px;\n padding: 0 10px 0 8px;\n border: 1px solid rgba(15, 23, 42, 0.12);\n border-radius: 999px;\n background: rgba(255, 255, 255, 0.86);\n color: #243044;\n font: inherit;\n font-size: 13px;\n line-height: 1;\n cursor: pointer;\n backdrop-filter: blur(8px);\n}\n.trigger:hover, .trigger[aria-expanded=true] {\n border-color: var(--lw-login-accent, #1677ff);\n color: #0f172a;\n}\n\n.icon {\n width: 14px;\n height: 14px;\n display: block;\n}\n\n.caret {\n width: 10px;\n height: 10px;\n opacity: 0.65;\n}\n\n.menu {\n position: absolute;\n top: calc(100% + 6px);\n right: 0;\n z-index: 20;\n min-width: 168px;\n margin: 0;\n padding: 6px;\n list-style: none;\n border-radius: 12px;\n background: #fff;\n box-shadow: 0 12px 40px rgba(15, 23, 42, 0.16);\n}\n\n.item {\n display: block;\n width: 100%;\n border: 0;\n border-radius: 8px;\n padding: 8px 10px;\n background: transparent;\n color: #1f2937;\n font: inherit;\n font-size: 14px;\n text-align: left;\n cursor: pointer;\n}\n.item:hover {\n background: #f3f6fb;\n}\n\n.itemActive {\n background: color-mix(in srgb, var(--lw-login-accent, #1677ff) 14%, #fff);\n color: var(--lw-login-accent, #1677ff);\n font-weight: 650;\n}\n\n.onDark {\n border-color: rgba(255, 255, 255, 0.22);\n background: rgba(15, 23, 42, 0.28);\n color: rgba(255, 255, 255, 0.92);\n}\n.onDark:hover, .onDark[aria-expanded=true] {\n border-color: rgba(255, 255, 255, 0.55);\n color: #fff;\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkxvZ2luTGFuZ3VhZ2VTd2l0Y2hlci5tb2R1bGUuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUVFO0VBQ0E7OztBQUlKO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTs7O0FBSUo7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOztBQUVBO0VBRUU7RUFDQSIsInNvdXJjZXNDb250ZW50IjpbIi5zd2l0Y2gge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xufVxuXG4udHJpZ2dlciB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDZweDtcbiAgaGVpZ2h0OiAzMnB4O1xuICBwYWRkaW5nOiAwIDEwcHggMCA4cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTUsIDIzLCA0MiwgMC4xMik7XG4gIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODYpO1xuICBjb2xvcjogIzI0MzA0NDtcbiAgZm9udDogaW5oZXJpdDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBsaW5lLWhlaWdodDogMTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoOHB4KTtcblxuICAmOmhvdmVyLFxuICAmW2FyaWEtZXhwYW5kZWQ9XCJ0cnVlXCJdIHtcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWx3LWxvZ2luLWFjY2VudCwgIzE2NzdmZik7XG4gICAgY29sb3I6ICMwZjE3MmE7XG4gIH1cbn1cblxuLmljb24ge1xuICB3aWR0aDogMTRweDtcbiAgaGVpZ2h0OiAxNHB4O1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLmNhcmV0IHtcbiAgd2lkdGg6IDEwcHg7XG4gIGhlaWdodDogMTBweDtcbiAgb3BhY2l0eTogMC42NTtcbn1cblxuLm1lbnUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogY2FsYygxMDAlICsgNnB4KTtcbiAgcmlnaHQ6IDA7XG4gIHotaW5kZXg6IDIwO1xuICBtaW4td2lkdGg6IDE2OHB4O1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDZweDtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgYmFja2dyb3VuZDogI2ZmZjtcbiAgYm94LXNoYWRvdzogMCAxMnB4IDQwcHggcmdiYSgxNSwgMjMsIDQyLCAwLjE2KTtcbn1cblxuLml0ZW0ge1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2lkdGg6IDEwMCU7XG4gIGJvcmRlcjogMDtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBwYWRkaW5nOiA4cHggMTBweDtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGNvbG9yOiAjMWYyOTM3O1xuICBmb250OiBpbmhlcml0O1xuICBmb250LXNpemU6IDE0cHg7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGN1cnNvcjogcG9pbnRlcjtcblxuICAmOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kOiAjZjNmNmZiO1xuICB9XG59XG5cbi5pdGVtQWN0aXZlIHtcbiAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWx3LWxvZ2luLWFjY2VudCwgIzE2NzdmZikgMTQlLCAjZmZmKTtcbiAgY29sb3I6IHZhcigtLWx3LWxvZ2luLWFjY2VudCwgIzE2NzdmZik7XG4gIGZvbnQtd2VpZ2h0OiA2NTA7XG59XG5cbi5vbkRhcmsge1xuICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yMik7XG4gIGJhY2tncm91bmQ6IHJnYmEoMTUsIDIzLCA0MiwgMC4yOCk7XG4gIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpO1xuXG4gICY6aG92ZXIsXG4gICZbYXJpYS1leHBhbmRlZD1cInRydWVcIl0ge1xuICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjU1KTtcbiAgICBjb2xvcjogI2ZmZjtcbiAgfVxufVxuIl19 */","import { useEffect, useId, useRef, useState } from \"react\";\nimport {\n DEFAULT_LOGIN_LOCALES,\n normalizeLoginLocale,\n type LoginLocaleOption,\n} from \"./login-labels\";\nimport styles from \"./LoginLanguageSwitcher.module.scss\";\n\nexport interface LoginLanguageSwitcherProps {\n locale: string;\n onChange: (locale: string) => void;\n locales?: readonly LoginLocaleOption[];\n /** Accessible name, e.g. \"Language\" / \"语言\". */\n label?: string;\n variant?: \"default\" | \"onDark\";\n}\n\nfunction GlobeIcon() {\n return (\n <svg className={styles.icon} viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" />\n <ellipse cx=\"12\" cy=\"12\" rx=\"4\" ry=\"9\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" />\n <path d=\"M3 12h18M5 8h14M5 16h14\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" />\n </svg>\n );\n}\n\nexport function LoginLanguageSwitcher({\n locale,\n onChange,\n locales = DEFAULT_LOGIN_LOCALES,\n label = \"Language\",\n variant = \"default\",\n}: LoginLanguageSwitcherProps) {\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const menuId = useId();\n const current =\n locales.find((item) => item.code === locale) ??\n locales.find((item) => normalizeLoginLocale(item.code) === normalizeLoginLocale(locale)) ??\n locales[0];\n\n useEffect(() => {\n if (!open) return;\n const onPointer = (event: MouseEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) setOpen(false);\n };\n const onKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setOpen(false);\n };\n document.addEventListener(\"mousedown\", onPointer);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"mousedown\", onPointer);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [open]);\n\n return (\n <div className={styles.switch} ref={rootRef}>\n <button\n type=\"button\"\n className={variant === \"onDark\" ? `${styles.trigger} ${styles.onDark}` : styles.trigger}\n aria-label={label}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={menuId}\n onClick={() => setOpen((value) => !value)}\n >\n <GlobeIcon />\n <span>{current?.short ?? \"EN\"}</span>\n <svg className={styles.caret} viewBox=\"0 0 12 12\" aria-hidden=\"true\">\n <path d=\"M2.5 4.5 6 8l3.5-3.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.4\" />\n </svg>\n </button>\n {open ? (\n <ul className={styles.menu} id={menuId} role=\"listbox\" aria-label={label}>\n {locales.map((item) => {\n const active = item.code === current?.code;\n return (\n <li key={item.code} role=\"presentation\">\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={active}\n className={active ? `${styles.item} ${styles.itemActive}` : styles.item}\n onClick={() => {\n onChange(item.code);\n setOpen(false);\n }}\n >\n {item.label}\n </button>\n </li>\n );\n })}\n </ul>\n ) : null}\n </div>\n );\n}\n",".canvas {\n --lw-login-accent: #1677ff;\n position: relative;\n min-height: 100dvh;\n display: grid;\n place-items: center;\n padding: 56px 20px 24px;\n overflow: hidden;\n background: radial-gradient(900px 480px at 8% -8%, color-mix(in srgb, var(--lw-login-accent) 28%, transparent), transparent 58%), radial-gradient(720px 420px at 100% 12%, color-mix(in srgb, var(--lw-login-accent) 16%, transparent), transparent 52%), linear-gradient(165deg, var(--lw-login-bg-a, #f4f7fb) 0%, var(--lw-login-bg-b, #e7eef6) 100%);\n color: var(--lw-login-ink, #122033);\n}\n\n.canvas[data-tone=console] {\n --lw-login-accent: #7eb6ff;\n --lw-login-bg-a: #0e1726;\n --lw-login-bg-b: #1a2740;\n --lw-login-ink: #e8eef8;\n --lw-login-grid: rgba(255, 255, 255, 0.05);\n}\n\n.canvas[data-tone=vista] {\n --lw-login-accent: #1677ff;\n --lw-login-bg-a: #f4f7fb;\n --lw-login-bg-b: #dde7f0;\n --lw-login-grid: rgba(11, 18, 32, 0.045);\n}\n\n.canvas[data-tone=data] {\n --lw-login-accent: #7c3aed;\n --lw-login-bg-a: #0a0f1e;\n --lw-login-bg-b: #0a0f1e;\n --lw-login-ink: #e8eefc;\n --lw-login-grid: rgba(255, 255, 255, 0.045);\n}\n\n.canvas[data-tone=edu] {\n --lw-login-accent: #7ec8ff;\n --lw-login-bg-a: #0a348c;\n --lw-login-bg-b: #1d7aef;\n --lw-login-ink: #f4f8ff;\n --lw-login-grid: rgba(255, 255, 255, 0.07);\n}\n\n.grid {\n position: absolute;\n inset: 0;\n pointer-events: none;\n background-image: linear-gradient(var(--lw-login-grid, rgba(15, 23, 42, 0.04)) 1px, transparent 1px), linear-gradient(90deg, var(--lw-login-grid, rgba(15, 23, 42, 0.04)) 1px, transparent 1px);\n background-size: 48px 48px;\n mask-image: radial-gradient(ellipse at center, #000 18%, transparent 74%);\n}\n\n.lang {\n position: fixed;\n top: 14px;\n right: 16px;\n z-index: 5;\n}\n\n.decor {\n position: absolute;\n inset: 0;\n pointer-events: none;\n z-index: 0;\n}\n\n.slot {\n position: relative;\n z-index: 1;\n width: min(440px, 100%);\n}\n\n.slotFill {\n width: min(1120px, 100%);\n}\n\n@media (max-width: 720px) {\n .canvas {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n overflow-x: hidden;\n overflow-y: auto;\n padding: 72px 16px 28px;\n }\n .lang {\n top: 12px;\n right: 12px;\n }\n}\n@media (max-width: 420px) {\n .canvas {\n padding: 64px 12px 20px;\n }\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkxvZ2luQ2FudmFzLm1vZHVsZS5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxZQUNFO0VBR0Y7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0Esa0JBQ0U7RUFFRjtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTs7O0FBR0Y7RUFDRTtJQUNFO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBOztFQUdGO0lBQ0U7SUFDQTs7O0FBSUo7RUFDRTtJQUNFIiwic291cmNlc0NvbnRlbnQiOlsiLmNhbnZhcyB7XG4gIC0tbHctbG9naW4tYWNjZW50OiAjMTY3N2ZmO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1pbi1oZWlnaHQ6IDEwMGR2aDtcbiAgZGlzcGxheTogZ3JpZDtcbiAgcGxhY2UtaXRlbXM6IGNlbnRlcjtcbiAgcGFkZGluZzogNTZweCAyMHB4IDI0cHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJhY2tncm91bmQ6XG4gICAgcmFkaWFsLWdyYWRpZW50KDkwMHB4IDQ4MHB4IGF0IDglIC04JSwgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWx3LWxvZ2luLWFjY2VudCkgMjglLCB0cmFuc3BhcmVudCksIHRyYW5zcGFyZW50IDU4JSksXG4gICAgcmFkaWFsLWdyYWRpZW50KDcyMHB4IDQyMHB4IGF0IDEwMCUgMTIlLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbHctbG9naW4tYWNjZW50KSAxNiUsIHRyYW5zcGFyZW50KSwgdHJhbnNwYXJlbnQgNTIlKSxcbiAgICBsaW5lYXItZ3JhZGllbnQoMTY1ZGVnLCB2YXIoLS1sdy1sb2dpbi1iZy1hLCAjZjRmN2ZiKSAwJSwgdmFyKC0tbHctbG9naW4tYmctYiwgI2U3ZWVmNikgMTAwJSk7XG4gIGNvbG9yOiB2YXIoLS1sdy1sb2dpbi1pbmssICMxMjIwMzMpO1xufVxuXG4uY2FudmFzW2RhdGEtdG9uZT1cImNvbnNvbGVcIl0ge1xuICAtLWx3LWxvZ2luLWFjY2VudDogIzdlYjZmZjtcbiAgLS1sdy1sb2dpbi1iZy1hOiAjMGUxNzI2O1xuICAtLWx3LWxvZ2luLWJnLWI6ICMxYTI3NDA7XG4gIC0tbHctbG9naW4taW5rOiAjZThlZWY4O1xuICAtLWx3LWxvZ2luLWdyaWQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSk7XG59XG5cbi5jYW52YXNbZGF0YS10b25lPVwidmlzdGFcIl0ge1xuICAtLWx3LWxvZ2luLWFjY2VudDogIzE2NzdmZjtcbiAgLS1sdy1sb2dpbi1iZy1hOiAjZjRmN2ZiO1xuICAtLWx3LWxvZ2luLWJnLWI6ICNkZGU3ZjA7XG4gIC0tbHctbG9naW4tZ3JpZDogcmdiYSgxMSwgMTgsIDMyLCAwLjA0NSk7XG59XG5cbi5jYW52YXNbZGF0YS10b25lPVwiZGF0YVwiXSB7XG4gIC0tbHctbG9naW4tYWNjZW50OiAjN2MzYWVkO1xuICAtLWx3LWxvZ2luLWJnLWE6ICMwYTBmMWU7XG4gIC0tbHctbG9naW4tYmctYjogIzBhMGYxZTtcbiAgLS1sdy1sb2dpbi1pbms6ICNlOGVlZmM7XG4gIC0tbHctbG9naW4tZ3JpZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0NSk7XG59XG5cbi5jYW52YXNbZGF0YS10b25lPVwiZWR1XCJdIHtcbiAgLS1sdy1sb2dpbi1hY2NlbnQ6ICM3ZWM4ZmY7XG4gIC0tbHctbG9naW4tYmctYTogIzBhMzQ4YztcbiAgLS1sdy1sb2dpbi1iZy1iOiAjMWQ3YWVmO1xuICAtLWx3LWxvZ2luLWluazogI2Y0ZjhmZjtcbiAgLS1sdy1sb2dpbi1ncmlkOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDcpO1xufVxuXG4uZ3JpZCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaW5zZXQ6IDA7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBiYWNrZ3JvdW5kLWltYWdlOlxuICAgIGxpbmVhci1ncmFkaWVudCh2YXIoLS1sdy1sb2dpbi1ncmlkLCByZ2JhKDE1LCAyMywgNDIsIDAuMDQpKSAxcHgsIHRyYW5zcGFyZW50IDFweCksXG4gICAgbGluZWFyLWdyYWRpZW50KDkwZGVnLCB2YXIoLS1sdy1sb2dpbi1ncmlkLCByZ2JhKDE1LCAyMywgNDIsIDAuMDQpKSAxcHgsIHRyYW5zcGFyZW50IDFweCk7XG4gIGJhY2tncm91bmQtc2l6ZTogNDhweCA0OHB4O1xuICBtYXNrLWltYWdlOiByYWRpYWwtZ3JhZGllbnQoZWxsaXBzZSBhdCBjZW50ZXIsICMwMDAgMTglLCB0cmFuc3BhcmVudCA3NCUpO1xufVxuXG4ubGFuZyB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAxNHB4O1xuICByaWdodDogMTZweDtcbiAgei1pbmRleDogNTtcbn1cblxuLmRlY29yIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBpbnNldDogMDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIHotaW5kZXg6IDA7XG59XG5cbi5zbG90IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICB3aWR0aDogbWluKDQ0MHB4LCAxMDAlKTtcbn1cblxuLnNsb3RGaWxsIHtcbiAgd2lkdGg6IG1pbigxMTIwcHgsIDEwMCUpO1xufVxuXG5AbWVkaWEgKG1heC13aWR0aDogNzIwcHgpIHtcbiAgLmNhbnZhcyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIHBhZGRpbmc6IDcycHggMTZweCAyOHB4O1xuICB9XG5cbiAgLmxhbmcge1xuICAgIHRvcDogMTJweDtcbiAgICByaWdodDogMTJweDtcbiAgfVxufVxuXG5AbWVkaWEgKG1heC13aWR0aDogNDIwcHgpIHtcbiAgLmNhbnZhcyB7XG4gICAgcGFkZGluZzogNjRweCAxMnB4IDIwcHg7XG4gIH1cbn1cbiJdfQ== */","import type { ReactNode } from \"react\";\nimport { LoginLanguageSwitcher } from \"./LoginLanguageSwitcher\";\nimport type { LoginLocaleOption } from \"./login-labels\";\nimport styles from \"./LoginCanvas.module.scss\";\n\nexport type LoginCanvasTone = \"console\" | \"vista\" | \"data\" | \"edu\";\n\nexport interface LoginCanvasProps {\n tone: LoginCanvasTone;\n locale: string;\n onLocaleChange: (locale: string) => void;\n locales?: readonly LoginLocaleOption[];\n languageLabel?: string;\n /** Full-width slot for split layouts (hero + card). Default centers a single card. */\n fill?: boolean;\n decor?: ReactNode;\n children: ReactNode;\n}\n\nexport function LoginCanvas({\n tone,\n locale,\n onLocaleChange,\n locales,\n languageLabel,\n fill = false,\n decor,\n children,\n}: LoginCanvasProps) {\n return (\n <div className={styles.canvas} data-tone={tone}>\n <div className={styles.grid} aria-hidden=\"true\" />\n {decor ? <div className={styles.decor}>{decor}</div> : null}\n <div className={styles.lang}>\n <LoginLanguageSwitcher\n locale={locale}\n onChange={onLocaleChange}\n locales={locales}\n label={languageLabel}\n variant={tone === \"console\" || tone === \"data\" || tone === \"edu\" ? \"onDark\" : \"default\"}\n />\n </div>\n <div className={fill ? `${styles.slot} ${styles.slotFill}` : styles.slot}>{children}</div>\n </div>\n );\n}\n","export interface PostLoginPathOptions {\n /** sessionStorage key (product-scoped), e.g. `dv:postLoginPath` */\n storageKey: string;\n /** Default destination when nothing remembered */\n defaultPath?: string;\n /** Extra paths that must not be used as return targets */\n unsafePrefixes?: string[];\n}\n\nconst DEFAULT_UNSAFE = [\"/login\", \"/auth\", \"/exception\"];\n\nfunction normalizeAppPath(path: string, fallback: string): string {\n const raw = path.replace(/^#/, \"\").trim();\n if (!raw) return fallback.startsWith(\"/\") ? fallback : `/${fallback}`;\n return raw.startsWith(\"/\") ? raw : `/${raw}`;\n}\n\nfunction isUnsafeReturnPath(path: string, unsafePrefixes: string[], fallback: string): boolean {\n const p = normalizeAppPath(path, fallback);\n if (p === \"/\") return true;\n return unsafePrefixes.some((prefix) => p === prefix || p.startsWith(`${prefix}/`) || p.startsWith(prefix));\n}\n\n/**\n * sessionStorage helpers for OIDC redirect return paths.\n * Product-specific ACL checks (e.g. 403 fallback) stay in the product.\n */\nexport function createPostLoginPathHelpers(options: PostLoginPathOptions) {\n const storageKey = options.storageKey;\n const defaultPath = options.defaultPath?.startsWith(\"/\")\n ? options.defaultPath\n : `/${options.defaultPath || \"home\"}`;\n const unsafePrefixes = [...DEFAULT_UNSAFE, ...(options.unsafePrefixes || [])];\n\n function rememberPostLoginPath(path: string): void {\n const normalized = normalizeAppPath(path, defaultPath);\n if (isUnsafeReturnPath(normalized, unsafePrefixes, defaultPath)) return;\n try {\n sessionStorage.setItem(storageKey, normalized);\n } catch {\n /* ignore */\n }\n }\n\n function peekPostLoginPath(): string | undefined {\n try {\n const v = sessionStorage.getItem(storageKey);\n if (!v || isUnsafeReturnPath(v, unsafePrefixes, defaultPath)) return undefined;\n return normalizeAppPath(v, defaultPath);\n } catch {\n return undefined;\n }\n }\n\n function consumePostLoginPath(fallback = defaultPath): string {\n const remembered = peekPostLoginPath();\n try {\n sessionStorage.removeItem(storageKey);\n } catch {\n /* ignore */\n }\n return remembered ?? normalizeAppPath(fallback, defaultPath);\n }\n\n return {\n rememberPostLoginPath,\n peekPostLoginPath,\n consumePostLoginPath,\n normalizeAppPath: (path: string) => normalizeAppPath(path, defaultPath),\n isUnsafeReturnPath: (path: string) => isUnsafeReturnPath(path, unsafePrefixes, defaultPath),\n };\n}\n"]}
|