@singlebase/elements 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/authui-display-C2o9gApg.cjs +961 -0
- package/dist/authui-display-C2o9gApg.cjs.map +1 -0
- package/dist/{authui-display-BM_F3-5e.js → authui-display-CRUABt43.js} +1009 -862
- package/dist/authui-display-CRUABt43.js.map +1 -0
- package/dist/authui.cjs +1 -1
- package/dist/authui.js +2 -2
- package/dist/{chat-ezUmd9II.cjs → chat-Bj6DrOaW.cjs} +237 -168
- package/dist/chat-Bj6DrOaW.cjs.map +1 -0
- package/dist/{chat-BH_3e1jT.js → chat-DNiqYF6F.js} +1098 -825
- package/dist/chat-DNiqYF6F.js.map +1 -0
- package/dist/chat-messages.d.ts +5 -0
- package/dist/chat.cjs +1 -1
- package/dist/chat.js +1 -1
- package/dist/elements/authui-account.d.ts +0 -1
- package/dist/elements/authui-buttons.d.ts +1 -1
- package/dist/elements/authui.d.ts +25 -1
- package/dist/elements/chat.d.ts +76 -4
- package/dist/index.cjs +1 -1
- package/dist/index.js +3 -3
- package/dist/messages.d.ts +34 -3
- package/dist/singlebase-elements.min.js +3113 -2664
- package/dist/singlebase-elements.min.js.map +1 -1
- package/dist/{uploader-COP8PkJ6.cjs → uploader-C57vgFME.cjs} +27 -1
- package/dist/uploader-C57vgFME.cjs.map +1 -0
- package/dist/{uploader-tdMU9Gxv.js → uploader-Cz9yfzfV.js} +27 -1
- package/dist/uploader-Cz9yfzfV.js.map +1 -0
- package/dist/uploader.cjs +1 -1
- package/dist/uploader.js +1 -1
- package/dist/utils/auth-errors.d.ts +7 -0
- package/dist/utils/oauth.d.ts +24 -0
- package/dist/utils/password.d.ts +16 -0
- package/package.json +3 -3
- package/dist/authui-display-BM_F3-5e.js.map +0 -1
- package/dist/authui-display-CMVHTNFz.cjs +0 -956
- package/dist/authui-display-CMVHTNFz.cjs.map +0 -1
- package/dist/chat-BH_3e1jT.js.map +0 -1
- package/dist/chat-ezUmd9II.cjs.map +0 -1
- package/dist/uploader-COP8PkJ6.cjs.map +0 -1
- package/dist/uploader-tdMU9Gxv.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"singlebase-elements.min.js","sources":["../../core/dist/index.js","../../singlebase-sdk/dist/index.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/css-tag.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/reactive-element.js","../../../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/lit-html.js","../../../node_modules/.pnpm/lit-element@4.2.2/node_modules/lit-element/lit-element.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/custom-element.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/property.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/state.js","../../../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directives/if-defined.js","../src/controllers/auth-controller.ts","../src/styles/tokens.ts","../src/styles/shared.ts","../src/messages.ts","../src/elements/authui-base.ts","../src/utils/redirect.ts","../src/controllers/settings-controller.ts","../src/controllers/event-bridge.ts","../src/styles/branding.ts","../src/utils/branding.ts","../src/elements/authui-form-base.ts","../src/utils/profile.ts","../src/upload-messages.ts","../src/utils/files.ts","../src/utils/inspect.ts","../src/elements/uploader.ts","../src/elements/authui-account.ts","../src/elements/authui-buttons.ts","../src/elements/authui.ts","../src/elements/authui-guard.ts","../src/elements/authui-display.ts","../../../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directive.js","../../../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directive-helpers.js","../../../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directives/repeat.js","../src/styles/chat.ts","../src/chat-messages.ts","../src/utils/markdown.ts","../src/utils/svg.ts","../src/elements/chat.ts","../src/standalone.ts"],"sourcesContent":["class g extends Error {\n constructor(t, r) {\n super(t.message), this.name = \"SinglebaseError\", this.status = t.status, this.type = t.type, this.code = t.message, this.details = t.details, this.traceId = t.trace_id ?? null, this.cause = r;\n }\n static fromNetworkError(t) {\n return new g(\n {\n type: \"NETWORK_ERROR\",\n status: 0,\n message: \"NETWORK_ERROR\"\n },\n t\n );\n }\n}\nconst L = {\n INVALID_PAYLOAD: \"highlight_invalid_fields\",\n INVALID_CREDENTIALS: \"generic_credentials_message\",\n CODE_REQUIRED: \"reveal_code_input\",\n INVALID_TOKEN: \"expired_or_invalid_code_message\",\n INVALID_ID_TOKEN: \"attempt_refresh_or_signout\",\n INVALID_BEARER_TOKEN: \"attempt_refresh_or_signout\",\n INVALID_SESSION: \"clear_session_and_ask_signin\",\n INVALID_TOKEN_AUDIENCE: \"clear_session_config_error\",\n REQUIRE_PASSWORD_CHANGE: \"route_to_recovery_or_invite\",\n INVALID_PASSWORD: \"show_password_requirements\",\n MISSING_PROFILE_DATA: \"require_changed_field\",\n AUTH_RATE_LIMITED: \"disable_retry_show_rate_limited\",\n AUTH_DISABLED: \"render_auth_unavailable\",\n EMAIL_PROVIDER_DISABLED: \"hide_email_forms\",\n EMAIL_SIGNUP_DISABLED: \"hide_signup\",\n OAUTH_DISABLED: \"hide_oauth\",\n OAUTH_SIGNUP_DISABLED: \"remove_oauth_from_signup\",\n INVALID_OAUTH_PROVIDER: \"refresh_settings_hide_provider\",\n INVALID_NONCE: \"restart_oauth_new_nonce\",\n SIGN_IN_TO_LINK_PROVIDER: \"ask_signin_then_link\",\n AUTHENTICATION_REQUIRED: \"route_to_signin\",\n UNAUTHORIZED_DOMAIN: \"show_integrator_config_error\"\n};\nfunction z(e) {\n return L[e] ?? \"unknown\";\n}\nfunction k(e) {\n return e === \"localhost\" || e === \"127.0.0.1\" || e === \"0.0.0.0\";\n}\nconst p = \"https://v1.api.singlebase.io\";\nfunction C(e) {\n if (e.baseUrl === void 0) return p;\n if (e.baseUrl === null || String(e.baseUrl).trim() === \"\")\n throw new Error(\n `SinglebaseOptions.baseUrl cannot be null or empty. Omit it to use ${p}.`\n );\n return String(e.baseUrl).trim().replace(/\\/+$/, \"\");\n}\nfunction P(e) {\n var n;\n const t = C(e);\n B(t);\n const r = (n = e.urlAccessKey) == null ? void 0 : n.trim();\n return r ? `${t}/${encodeURIComponent(r)}` : t;\n}\nfunction B(e) {\n let t;\n try {\n t = new URL(e);\n } catch {\n throw new Error(`SinglebaseOptions.baseUrl is not a valid URL: ${e}`);\n }\n if (t.protocol !== \"https:\" && !k(t.hostname))\n throw new Error(\n `SinglebaseOptions.baseUrl must use HTTPS outside of localhost/127.0.0.1/0.0.0.0 (got ${t.protocol})`\n );\n}\nasync function m(e, t, r, n = {}) {\n const s = P(e), o = { operation: t, payload: r };\n n.options && (o.options = n.options);\n const a = { \"Content-Type\": \"application/json\" };\n e.apiKey && (a[\"X-API-Key\"] = e.apiKey), n.token && (a.Authorization = `Bearer ${n.token}`);\n const c = e.fetch ?? globalThis.fetch;\n let i;\n try {\n i = await c(s, {\n method: \"POST\",\n headers: a,\n body: JSON.stringify(o),\n signal: n.signal\n });\n } catch (h) {\n throw g.fromNetworkError(h);\n }\n let f;\n try {\n f = await i.json();\n } catch (h) {\n throw g.fromNetworkError(h);\n }\n if (\"error\" in f)\n throw new g(f.error);\n return f.data;\n}\nconst K = /* @__PURE__ */ new Set([\"INVALID_ID_TOKEN\", \"INVALID_BEARER_TOKEN\"]);\nclass X {\n constructor(t) {\n this.options = t, this.bridge = null, this.provider = null;\n }\n /** Registers the session owner (the auth client) as the token source. */\n setAuthBridge(t) {\n this.bridge = t;\n }\n /** Registers a factory that builds+hydrates the token source on first need. */\n setAuthProvider(t) {\n this.provider = t;\n }\n async resolveBridge() {\n return this.bridge ? this.bridge : this.provider ? (this.bridge = await this.provider(), this.bridge) : null;\n }\n /**\n * Sends one operation. Injects the session bearer unless told otherwise,\n * and on a stale-token error refreshes once and retries the call exactly\n * once — never looping.\n */\n async dispatch(t, { bearer: r, signal: n } = {}) {\n const s = r !== void 0, o = s ? null : await this.resolveBridge(), a = s ? r : (o == null ? void 0 : o.getToken()) ?? null, c = { token: a, signal: n, options: t.options };\n try {\n return await m(\n this.options,\n t.operation,\n t.payload ?? {},\n c\n );\n } catch (i) {\n const f = i instanceof g ? i.code : \"\";\n if (!(!s && a !== null && o !== null && K.has(f))) throw i;\n const A = await o.refresh();\n if (!A) throw i;\n return m(\n this.options,\n t.operation,\n t.payload ?? {},\n { ...c, token: A }\n );\n }\n }\n}\nconst j = \"singlebase-auth\", V = 1, l = \"session\", E = \"wrapping-key\", d = \"session\";\nfunction I() {\n let e = null;\n return {\n get: () => e,\n set: (t) => {\n e = t;\n },\n clear: () => {\n e = null;\n }\n };\n}\nfunction R(e, t) {\n return {\n get: () => {\n var n;\n const r = (n = e()) == null ? void 0 : n.getItem(t);\n if (!r) return null;\n try {\n return JSON.parse(r);\n } catch {\n return null;\n }\n },\n set: (r) => {\n var n;\n (n = e()) == null || n.setItem(t, JSON.stringify(r));\n },\n clear: () => {\n var r;\n (r = e()) == null || r.removeItem(t);\n }\n };\n}\nfunction ee(e = \"singlebase-auth-session\") {\n return R(() => globalThis.localStorage, e);\n}\nfunction M(e = \"singlebase-auth-session\") {\n return R(() => globalThis.sessionStorage, e);\n}\nfunction b(e) {\n return new Promise((t, r) => {\n e.onsuccess = () => t(e.result), e.onerror = () => r(e.error);\n });\n}\nfunction w() {\n return new Promise((e, t) => {\n const r = globalThis.indexedDB.open(j, V);\n r.onupgradeneeded = () => {\n r.result.objectStoreNames.contains(l) || r.result.createObjectStore(l);\n }, r.onsuccess = () => e(r.result), r.onerror = () => t(r.error), r.onblocked = () => t(new Error(\"indexedDB open blocked\"));\n });\n}\nasync function S(e) {\n const t = await w();\n try {\n const r = t.transaction(l, \"readonly\");\n return await b(r.objectStore(l).get(e));\n } finally {\n t.close();\n }\n}\nasync function T(e, t) {\n const r = await w();\n try {\n const n = r.transaction(l, \"readwrite\");\n await b(n.objectStore(l).put(t, e));\n } finally {\n r.close();\n }\n}\nasync function D(e) {\n const t = await w();\n try {\n const r = t.transaction(l, \"readwrite\");\n await b(r.objectStore(l).delete(e));\n } finally {\n t.close();\n }\n}\nfunction H() {\n return typeof globalThis.indexedDB < \"u\" && typeof globalThis.crypto < \"u\" && typeof globalThis.crypto.subtle < \"u\";\n}\nfunction x() {\n let e = null;\n async function t() {\n return e || (e = (async () => {\n const r = await S(E);\n if (r) return r;\n const n = await globalThis.crypto.subtle.generateKey(\n { name: \"AES-GCM\", length: 256 },\n // non-extractable: crypto.subtle can use it, JS can never read it\n !1,\n [\"encrypt\", \"decrypt\"]\n );\n return await T(E, n), n;\n })().catch((r) => {\n throw e = null, r;\n })), e;\n }\n return {\n async get() {\n const r = await S(d);\n if (!r) return null;\n try {\n const n = await t(), s = await globalThis.crypto.subtle.decrypt(\n { name: \"AES-GCM\", iv: r.iv },\n n,\n r.data\n );\n return JSON.parse(new TextDecoder().decode(s));\n } catch {\n return await D(d).catch(() => {\n }), null;\n }\n },\n async set(r) {\n const n = await t(), s = globalThis.crypto.getRandomValues(new Uint8Array(12)), o = await globalThis.crypto.subtle.encrypt(\n { name: \"AES-GCM\", iv: s },\n n,\n new TextEncoder().encode(JSON.stringify(r))\n );\n await T(d, { iv: s, data: o });\n },\n async clear() {\n await D(d).catch(() => {\n });\n }\n };\n}\nfunction te() {\n let e = null, t = !1;\n async function r() {\n if (e) return e;\n if (!t) {\n if (t = !0, H()) {\n const n = x();\n try {\n return await n.get(), e = n, e;\n } catch {\n }\n }\n e = typeof globalThis.sessionStorage < \"u\" ? M() : I();\n }\n return e ?? I();\n }\n return {\n async get() {\n try {\n return await (await r()).get();\n } catch {\n return null;\n }\n },\n async set(n) {\n try {\n await (await r()).set(n);\n } catch {\n }\n },\n async clear() {\n try {\n await (await r()).clear();\n } catch {\n }\n }\n };\n}\nclass re {\n constructor() {\n this.listeners = /* @__PURE__ */ new Map();\n }\n on(t, r) {\n let n = this.listeners.get(t);\n return n || (n = /* @__PURE__ */ new Set(), this.listeners.set(t, n)), n.add(r), () => n.delete(r);\n }\n emit(t, r) {\n const n = this.listeners.get(t);\n if (n)\n for (const s of n) s(r);\n }\n}\nconst ne = [\n \"theme\",\n \"density\",\n \"fieldStyle\",\n \"radius\",\n \"layout\",\n \"oauthPlacement\",\n \"stepped\",\n \"logoUrl\",\n \"logoText\",\n \"brandLine\",\n \"brandFoot\",\n \"signInTitle\",\n \"branding\",\n \"brandingText\",\n \"brandingUrl\",\n \"initialScreen\",\n \"noAccountView\",\n \"redirectUrl\",\n \"tosUrl\",\n \"privacyUrl\",\n \"nonceStorageKey\",\n \"authEnabled\",\n \"allowEmailSignin\",\n \"allowEmailSignup\",\n \"allowEmailOtp\",\n \"allowOauth\",\n \"allowAccountCreation\",\n \"inviteEmail\",\n \"inviteOrg\",\n \"inviteCode\"\n];\nfunction se(e) {\n return e.replace(/[A-Z]/g, (t) => \"-\" + t.toLowerCase());\n}\nconst G = [\n \"$eq\",\n \"$ne\",\n \"$in\",\n \"$nin\",\n \"$gt\",\n \"$gte\",\n \"$lt\",\n \"$lte\",\n \"$elemMatch\"\n], v = new Set(G);\nfunction J(e) {\n if (e === null || typeof e != \"object\" || Array.isArray(e)) return !1;\n const t = Object.keys(e);\n return t.length > 0 && t.every((r) => v.has(r));\n}\nfunction W(e, t) {\n let r = e;\n for (const n of t.split(\".\")) {\n if (r == null || typeof r != \"object\") return;\n r = r[n];\n }\n return r;\n}\nfunction u(e, t) {\n if (e === t) return !0;\n if (Array.isArray(e) && Array.isArray(t))\n return e.length === t.length && e.every((r, n) => u(r, t[n]));\n if (e && t && typeof e == \"object\" && typeof t == \"object\") {\n const r = Object.keys(e), n = Object.keys(t);\n return r.length === n.length && r.every(\n (s) => u(e[s], t[s])\n );\n }\n return !1;\n}\nfunction q(e, t) {\n return typeof e == \"number\" && typeof t == \"number\" ? Number.isNaN(e) || Number.isNaN(t) ? null : e - t : typeof e == \"string\" && typeof t == \"string\" ? e < t ? -1 : e > t ? 1 : 0 : e instanceof Date && t instanceof Date ? e.getTime() - t.getTime() : null;\n}\nfunction U(e, t, r) {\n switch (e) {\n case \"$eq\":\n return u(t, r);\n case \"$ne\":\n return !u(t, r);\n case \"$in\":\n return Array.isArray(r) ? Array.isArray(t) ? t.some((n) => r.some((s) => u(n, s))) : r.some((n) => u(t, n)) : !1;\n case \"$nin\":\n return Array.isArray(r) ? !U(\"$in\", t, r) : !1;\n case \"$gt\":\n case \"$gte\":\n case \"$lt\":\n case \"$lte\": {\n const n = q(t, r);\n return n === null ? !1 : e === \"$gt\" ? n > 0 : e === \"$gte\" ? n >= 0 : e === \"$lt\" ? n < 0 : n <= 0;\n }\n case \"$elemMatch\":\n return Array.isArray(t) ? t.some((n) => $(n, r)) : !1;\n default:\n return !1;\n }\n}\nfunction $(e, t) {\n return J(t) ? Object.entries(t).every(\n ([r, n]) => U(r, e, n)\n ) : u(e, t);\n}\nfunction oe(e, t) {\n if (!t) return !0;\n const r = Object.entries(t);\n return r.length === 0 ? !0 : e == null ? !1 : r.every(([n, s]) => $(W(e, n), s));\n}\nfunction ie(e) {\n if (e == null) return [];\n if (typeof e != \"object\" || Array.isArray(e))\n return [\"predicate must be an object\"];\n const t = [];\n for (const [r, n] of Object.entries(e)) {\n if (r.startsWith(\"$\")) {\n t.push(`\"${r}\": top-level operators are not supported; use a field name`);\n continue;\n }\n if (n === null || typeof n != \"object\" || Array.isArray(n)) continue;\n const s = Object.keys(n), o = s.filter((a) => a.startsWith(\"$\"));\n if (o.length === 0) {\n t.push(\n `\"${r}\": nested objects are not supported; use dot notation, e.g. \"${r}.field\"`\n );\n continue;\n }\n o.length !== s.length && t.push(`\"${r}\": cannot mix operators with plain keys`);\n for (const a of o)\n v.has(a) || t.push(`\"${r}\": unsupported operator \"${a}\"`);\n }\n return t;\n}\nconst y = () => {\n};\nfunction F() {\n return { post: y, subscribe: () => y, close: y };\n}\nfunction Y() {\n const e = globalThis.crypto;\n return e && \"randomUUID\" in e ? e.randomUUID() : Math.random().toString(36).slice(2) + Date.now().toString(36);\n}\nfunction ae(e) {\n var n;\n const t = Y(), r = globalThis.BroadcastChannel;\n if (r) {\n let s;\n try {\n s = new r(e);\n } catch {\n return O(e, t);\n }\n return (n = s.unref) == null || n.call(s), {\n post(o) {\n try {\n s.postMessage({ signal: o, from: t, at: Date.now() });\n } catch {\n }\n },\n subscribe(o) {\n const a = (c) => {\n const i = c.data;\n !i || typeof i != \"object\" || i.from !== t && (i.signal !== \"session-changed\" && i.signal !== \"signout\" || o(i));\n };\n return s.addEventListener(\"message\", a), () => s.removeEventListener(\"message\", a);\n },\n close() {\n try {\n s.close();\n } catch {\n }\n }\n };\n }\n return O(e, t);\n}\nfunction O(e, t) {\n const r = Q();\n if (!r) return F();\n const n = `${e}:signal`;\n return {\n post(s) {\n try {\n r.setItem(n, JSON.stringify({ signal: s, from: t, at: Date.now() }));\n } catch {\n }\n },\n subscribe(s) {\n var a;\n const o = (c) => {\n if (!(c.key !== n || !c.newValue))\n try {\n const i = JSON.parse(c.newValue);\n if (i.from === t || i.signal !== \"session-changed\" && i.signal !== \"signout\") return;\n s(i);\n } catch {\n }\n };\n return (a = globalThis.addEventListener) == null || a.call(globalThis, \"storage\", o), () => {\n var c;\n return (c = globalThis.removeEventListener) == null ? void 0 : c.call(globalThis, \"storage\", o);\n };\n },\n close: y\n };\n}\nfunction Q() {\n try {\n const e = globalThis.localStorage;\n if (!e) return null;\n const t = \"__singlebase_probe__\";\n return e.setItem(t, \"1\"), e.removeItem(t), e;\n } catch {\n return null;\n }\n}\nconst N = Symbol.for(\"singlebase.client.registry\");\nfunction _() {\n const e = globalThis;\n let t = e[N];\n return t || (t = { instances: /* @__PURE__ */ new Map(), default: null }, e[N] = t), t;\n}\nfunction Z(e) {\n return [\n e.baseUrl ?? p,\n e.urlAccessKey ?? \"\",\n e.apiKey ?? \"\",\n e.audience ?? \"web\"\n ].join(\"|\");\n}\nfunction ce(e, t) {\n const r = _(), n = Z(e), s = r.instances.get(n);\n if (s) return s;\n const o = t();\n return r.instances.set(n, o), r.default || (r.default = o), o;\n}\nfunction le() {\n return _().default;\n}\nfunction ue(e) {\n _().default = e;\n}\nfunction fe(e) {\n const t = _();\n for (const [r, n] of t.instances)\n n === e && t.instances.delete(r);\n t.default === e && (t.default = t.instances.values().next().value ?? null);\n}\nexport {\n ne as AUTHUI_PROP_KEYS,\n p as DEFAULT_BASE_URL,\n re as EventEmitter,\n G as OPERATORS,\n X as RpcDispatcher,\n g as SinglebaseAuthError,\n g as SinglebaseError,\n B as assertSecureBaseUrl,\n se as authUIAttributeFor,\n H as canUseCryptoStorage,\n Z as clientKey,\n ae as crossTabChannel,\n te as defaultStorage,\n P as endpointFor,\n le as getDefaultClient,\n W as getPath,\n x as indexedDbCryptoStorage,\n ee as localStorageAdapter,\n z as mapErrorToHint,\n oe as matchesPredicate,\n I as memoryStorage,\n F as noopCrossTabChannel,\n m as request,\n C as resolveBaseUrl,\n ce as resolveClient,\n M as sessionStorageAdapter,\n ue as setDefaultClient,\n fe as unregisterClient,\n ie as validatePredicate\n};\n//# sourceMappingURL=index.js.map\n","import { EventEmitter as R, defaultStorage as P, RpcDispatcher as D, noopCrossTabChannel as N, crossTabChannel as U, DEFAULT_BASE_URL as F, SinglebaseError as S, resolveClient as M, unregisterClient as x } from \"@singlebase/core\";\nimport { SinglebaseAuthError as ae, SinglebaseError as re, getDefaultClient as ie, indexedDbCryptoStorage as oe, localStorageAdapter as ce, mapErrorToHint as ue, memoryStorage as le, sessionStorageAdapter as de, setDefaultClient as he } from \"@singlebase/core\";\nconst B = [\"pointerdown\", \"keydown\", \"scroll\", \"focus\", \"touchstart\"], b = {\n enabled: !0,\n skewSeconds: 60,\n idleAfterMs: 15 * 60 * 1e3,\n minIntervalMs: 30 * 1e3\n};\nclass W {\n constructor(e, s, r) {\n this.refresh = s, this.onFailure = r, this.timer = null, this.lastActivityAt = Date.now(), this.stopped = !1, this.listening = !1, this.pendingWake = !1, this.onActivityBound = () => this.onActivity(), this.options = {\n enabled: (e == null ? void 0 : e.enabled) ?? b.enabled,\n skewSeconds: (e == null ? void 0 : e.skewSeconds) ?? b.skewSeconds,\n idleAfterMs: (e == null ? void 0 : e.idleAfterMs) ?? b.idleAfterMs,\n minIntervalMs: (e == null ? void 0 : e.minIntervalMs) ?? b.minIntervalMs,\n activityEvents: (e == null ? void 0 : e.activityEvents) ?? B\n };\n }\n get isRunning() {\n return this.timer !== null;\n }\n /** (Re)arms the scheduler for the given session. */\n start(e) {\n !this.options.enabled || this.stopped || (this.listen(), this.schedule(e));\n }\n /** Pauses until the next `start()` — used on signout. */\n stop() {\n this.clearTimer(), this.unlisten();\n }\n /**\n * Stops for good. Used when a refresh fails: the session cannot be\n * recovered without a fresh sign-in, so the loop must not restart by\n * itself.\n */\n stopPermanently() {\n this.stopped = !0, this.stop();\n }\n /** Allows a future sign-in to resume auto-refresh after a permanent stop. */\n reset() {\n this.stopped = !1;\n }\n clearTimer() {\n this.timer && (clearTimeout(this.timer), this.timer = null);\n }\n listen() {\n var e;\n if (!(this.listening || typeof globalThis.addEventListener != \"function\")) {\n for (const s of this.options.activityEvents)\n globalThis.addEventListener(s, this.onActivityBound, { passive: !0, capture: !0 });\n (e = globalThis.addEventListener) == null || e.call(globalThis, \"visibilitychange\", this.onActivityBound, { passive: !0 }), this.listening = !0;\n }\n }\n unlisten() {\n var e;\n if (!(!this.listening || typeof globalThis.removeEventListener != \"function\")) {\n for (const s of this.options.activityEvents)\n globalThis.removeEventListener(s, this.onActivityBound, {\n capture: !0\n });\n (e = globalThis.removeEventListener) == null || e.call(globalThis, \"visibilitychange\", this.onActivityBound), this.listening = !1;\n }\n }\n /**\n * Marks the user as active. Called by the DOM listeners, and available to\n * hosts that know about activity the DOM cannot see — an SPA route change,\n * a websocket message, a background save.\n */\n notifyActivity() {\n this.onActivity();\n }\n onActivity() {\n this.lastActivityAt = Date.now(), this.pendingWake && !this.stopped && (this.pendingWake = !1, this.run());\n }\n get isIdle() {\n return Date.now() - this.lastActivityAt > this.options.idleAfterMs;\n }\n schedule(e) {\n if (this.clearTimer(), this.stopped || !this.options.enabled) return;\n const s = e.token_info.exp * 1e3 - Date.now(), r = Math.max(\n s - this.options.skewSeconds * 1e3,\n this.options.minIntervalMs\n );\n this.timer = setTimeout(() => {\n if (this.timer = null, this.isIdle) {\n this.pendingWake = !0;\n return;\n }\n this.run();\n }, r);\n }\n async run() {\n if (!this.stopped)\n try {\n const e = await this.refresh();\n this.schedule(e);\n } catch (e) {\n this.stopPermanently(), this.onFailure(e);\n }\n }\n}\nconst H = 60;\nclass V {\n constructor(e, s) {\n this.storage = e, this.refresher = s, this.state = { status: \"loading\", session: null, user: null }, this.listeners = /* @__PURE__ */ new Set(), this.refreshing = null, this.onLocalChange = null;\n }\n getState() {\n return this.state;\n }\n subscribe(e) {\n return this.listeners.add(e), () => this.listeners.delete(e);\n }\n setState(e) {\n this.state = e;\n for (const s of this.listeners) s(e);\n }\n /** Loads the persisted session (if any) and validates/refreshes it. */\n async initialize() {\n const e = await this.storage.get();\n if (!e) {\n this.setState({ status: \"unauthenticated\", session: null, user: null });\n return;\n }\n if (this.needsRefresh(e)) {\n try {\n const s = await this.refreshOnce(e);\n await this.adopt(s);\n } catch (s) {\n await this.clear(), this.setState({ status: \"error\", session: null, user: null, error: s });\n }\n return;\n }\n this.setState({ status: \"authenticated\", session: e, user: e.user_profile });\n }\n needsRefresh(e) {\n const s = Date.now() / 1e3;\n return e.token_info.exp - s <= H;\n }\n /** Adopts a freshly-returned session: persists it and updates state. */\n async adopt(e) {\n var s;\n await this.storage.set(e), this.setState({ status: \"authenticated\", session: e, user: e.user_profile }), (s = this.onLocalChange) == null || s.call(this, \"session-changed\");\n }\n /** Merges an updated profile (from user.get/user.update) into the current session. */\n async adoptProfile(e) {\n var r;\n if (this.state.status !== \"authenticated\") return;\n const s = { ...this.state.session, user_profile: e };\n await this.storage.set(s), this.setState({ status: \"authenticated\", session: s, user: e }), (r = this.onLocalChange) == null || r.call(this, \"session-changed\");\n }\n async clear() {\n var e;\n await this.storage.clear(), this.setState({ status: \"unauthenticated\", session: null, user: null }), (e = this.onLocalChange) == null || e.call(this, \"signout\");\n }\n /**\n * Re-reads shared storage after another tab reported a change, and adopts\n * whatever it finds. No network call and no refresh: the tab that made the\n * change already did that work, and this tab must not spend the single-use\n * refresh token a second time.\n */\n async syncFromStorage() {\n const e = await this.storage.get();\n return e ? this.state.status === \"authenticated\" && this.state.session.id_token === e.id_token ? \"unchanged\" : (this.setState({ status: \"authenticated\", session: e, user: e.user_profile }), \"adopted\") : this.state.status === \"unauthenticated\" ? \"unchanged\" : (this.setState({ status: \"unauthenticated\", session: null, user: null }), \"cleared\");\n }\n /**\n * Single-flight refresh: concurrent callers await the same in-flight\n * promise instead of each spending the single-use refresh token.\n */\n async refreshOnce(e) {\n return this.refreshing || (this.refreshing = this.refresher(e).finally(() => {\n this.refreshing = null;\n })), this.refreshing;\n }\n /**\n * For a protected call that just failed with an auth-shaped error: refresh\n * once (sharing any in-flight refresh) and hand back the new session, or\n * throw/clear if refresh itself fails. Callers retry their original\n * request exactly once with the result — never loop.\n */\n async refreshAfterFailure() {\n if (this.state.status !== \"authenticated\")\n throw new Error(\"Cannot refresh: no authenticated session\");\n try {\n const e = await this.refreshOnce(this.state.session);\n return await this.adopt(e), e;\n } catch (e) {\n throw await this.clear(), e;\n }\n }\n}\nconst l = {\n settings: \"auth.settings\",\n signup: \"auth.signup\",\n signin: \"auth.signin\",\n refresh: \"auth.refresh\",\n signout: \"auth.signout\",\n requestCode: \"auth.request_code\",\n confirmCode: \"auth.confirm_code\",\n changePassword: \"auth.change_password\",\n getAccount: \"user.get\",\n updateAccount: \"user.update\",\n nonce: \"auth.nonce\",\n oauthConnect: \"auth.oauth_connect\",\n oauthSignin: \"auth.oauth_signin\"\n};\nfunction q(a, e) {\n const s = a.audience ?? \"web\", r = new R(), y = a.storage ?? P(), f = e ?? new D(a);\n for (const [t, o] of Object.entries(a.on ?? {}))\n o && r.on(t, o);\n const g = async (t) => f.dispatch(\n {\n operation: l.refresh,\n payload: {\n id_token: t.id_token,\n refresh_token: t.refresh_token,\n aud: s\n }\n },\n { bearer: null }\n ), i = new V(y, g), c = a.crossTab === !1 ? N() : U(\n `singlebase-auth:${a.baseUrl ?? F}|${a.urlAccessKey ?? \"\"}`\n );\n i.onLocalChange = (t) => c.post(t);\n const d = c.subscribe(() => {\n w.then(async () => {\n const t = await i.syncFromStorage();\n if (t === \"unchanged\") return;\n if (t === \"cleared\") {\n r.emit(\"signout\", null), r.emit(\"session\", null);\n return;\n }\n const o = i.getState();\n o.status === \"authenticated\" && r.emit(\"session\", o.session);\n });\n }), m = typeof a.autoRefresh == \"boolean\" ? { enabled: a.autoRefresh } : a.autoRefresh, p = new W(\n m,\n async () => await A.refreshSession(),\n (t) => {\n i.clear();\n const o = t instanceof S ? t.code : \"REFRESH_FAILED\";\n r.emit(\"expired\", { reason: o }), r.emit(\"session\", null);\n }\n );\n f.setAuthBridge({\n getToken: () => {\n const t = i.getState();\n return t.status === \"authenticated\" ? t.session.id_token : null;\n },\n refresh: async () => {\n try {\n return (await i.refreshAfterFailure()).id_token;\n } catch {\n return null;\n }\n }\n }), i.subscribe((t) => {\n t.status === \"authenticated\" ? (p.reset(), p.start(t.session)) : p.stop();\n });\n const w = i.initialize().then(() => {\n r.emit(\"load\", i.getState());\n });\n async function u(t, o) {\n try {\n const n = await o();\n return r.emit(\"success\", { operation: t }), n;\n } catch (n) {\n const _ = n instanceof S ? n.code : \"UNKNOWN_ERROR\", T = n instanceof Error ? n.message : String(n);\n throw r.emit(\"error\", { code: _, message: T, operation: t }), n;\n }\n }\n const h = (t, o, n = {}) => f.dispatch({ operation: t, payload: o }, n), A = {\n ready: w,\n dispatcher: f,\n authui: a.authui ?? null,\n dispatch: (t, o) => f.dispatch(t, o),\n getSettings: (t) => u(l.settings, () => h(l.settings, {}, { bearer: null, signal: t })),\n signUp: (t, o) => u(l.signup, async () => {\n const n = await h(\n l.signup,\n { ...t, aud: t.aud ?? s },\n { bearer: null, signal: o }\n );\n return r.emit(\"signup\", n), r.emit(\"navigate\", {\n next_action: n.next_action,\n next_operation: n.next_operation\n }), n;\n }),\n signIn: (t, o) => u(l.signin, async () => {\n const n = await h(\n l.signin,\n { ...t, aud: t.aud ?? s },\n { bearer: null, signal: o }\n );\n return await i.adopt(n), r.emit(\"signin\", n), r.emit(\"session\", n), n;\n }),\n requestCode: (t, o) => u(l.requestCode, async () => {\n const n = await h(\n l.requestCode,\n { ...t, aud: t.aud ?? s },\n { bearer: null, signal: o }\n );\n return r.emit(\"navigate\", {\n next_action: n.next_action,\n next_operation: n.next_operation\n }), n;\n }),\n resetPassword: (t, o) => u(l.confirmCode, async () => {\n const n = await h(\n l.confirmCode,\n { ...t, purpose: \"password_reset\", aud: t.aud ?? s },\n { bearer: null, signal: o }\n );\n return await i.adopt(n), r.emit(\"signin\", n), r.emit(\"session\", n), n;\n }),\n acceptInvite: (t, o) => u(l.signin, async () => {\n const n = await h(\n l.signin,\n { ...t, aud: t.aud ?? s },\n { bearer: null, signal: o }\n );\n return await i.adopt(n), r.emit(\"signin\", n), r.emit(\"session\", n), n;\n }),\n refreshSession: () => u(l.refresh, async () => {\n const t = i.getState();\n if (t.status !== \"authenticated\")\n throw new Error(\"Cannot refresh: no authenticated session\");\n const o = await i.refreshOnce(t.session);\n return await i.adopt(o), r.emit(\"session\", o), o;\n }),\n async signOut() {\n const t = i.getState();\n if (p.stop(), t.status === \"authenticated\")\n try {\n await h(l.signout, {}, { bearer: t.session.id_token });\n } catch {\n }\n await i.clear(), r.emit(\"signout\", null), r.emit(\"session\", null), r.emit(\"success\", { operation: l.signout });\n },\n logout() {\n return A.signOut();\n },\n getAccount: (t) => u(l.getAccount, async () => {\n const o = await h(l.getAccount, {}, { signal: t });\n return await i.adoptProfile(o), o;\n }),\n updateAccount: (t, o) => u(l.updateAccount, async () => {\n const n = await h(l.updateAccount, t, {\n signal: o\n });\n return await i.adoptProfile(n), r.emit(\"account-updated\", n), n;\n }),\n changePassword: (t, o) => u(l.changePassword, async () => {\n const n = await h(\n l.changePassword,\n { ...t, aud: t.aud ?? s },\n { signal: o }\n );\n return await i.adopt(n), r.emit(\"password-change\", n), r.emit(\"session\", n), n;\n }),\n changeEmail: (t, o) => u(l.confirmCode, async () => {\n const n = await h(\n l.confirmCode,\n {\n email: t.email,\n purpose: \"email_change\",\n code: t.code,\n new_email: t.new_email,\n aud: t.aud ?? s\n },\n { signal: o }\n );\n return await i.adopt(n), r.emit(\"email-change\", n), r.emit(\"session\", n), n;\n }),\n changeUsername: (t, o) => u(l.confirmCode, async () => {\n const n = await h(\n l.confirmCode,\n {\n email: t.email,\n purpose: \"username_change\",\n code: t.code,\n new_username: t.new_username,\n aud: t.aud ?? s\n },\n { signal: o }\n );\n return await i.adopt(n), r.emit(\"username-change\", n), r.emit(\"session\", n), n;\n }),\n createOAuthNonce: (t) => u(l.nonce, async () => (await h(l.nonce, {}, { bearer: null, signal: t })).nonce),\n startOAuth: (t, o) => u(l.oauthConnect, async () => {\n const n = t.nonce ?? await A.createOAuthNonce(o);\n return h(\n l.oauthConnect,\n { ...t, nonce: n, intent: t.intent ?? \"signin\", aud: t.aud ?? s },\n { bearer: null, signal: o }\n );\n }),\n completeOAuth: (t, o) => u(l.oauthSignin, async () => {\n const n = await h(\n l.oauthSignin,\n { ...t, aud: t.aud ?? s },\n { bearer: null, signal: o }\n );\n return await i.adopt(n), r.emit(\"signin\", n), r.emit(\"session\", n), n;\n }),\n isAuthenticated: () => i.getState().status === \"authenticated\",\n getUser: () => {\n const t = i.getState();\n return t.status === \"authenticated\" ? t.user : null;\n },\n get user() {\n return A.getUser();\n },\n get authenticated() {\n return A.isAuthenticated();\n },\n async getSession() {\n await w;\n const t = i.getState();\n return t.status === \"authenticated\" ? t.session : null;\n },\n getState: () => i.getState(),\n subscribe: (t) => i.subscribe(t),\n on: r.on.bind(r),\n goto: (t) => r.emit(\"goto\", { screen: t }),\n destroy() {\n p.stopPermanently(), f.setAuthBridge(null), i.onLocalChange = null, d(), c.close();\n }\n };\n return A;\n}\nconst z = {\n SIGNIN: \"signin\",\n SIGNIN_WITH_CODE: \"signin_with_code\",\n ACCEPT_INVITE_WITH_CODE: \"accept_invite\",\n RESET_PASSWORD_WITH_CODE: \"reset_password_confirm\",\n CHANGE_EMAIL_WITH_CODE: \"change_email_confirm\",\n CHANGE_USERNAME_WITH_CODE: \"change_username_confirm\"\n};\nfunction ee(a) {\n return a.next_action === null ? \"authenticated\" : z[a.next_action];\n}\nconst E = 10;\nfunction v(a, e) {\n const s = [];\n for (let r = 0; r < a.length; r += e) s.push(a.slice(r, r + e));\n return s;\n}\nfunction C(a) {\n return typeof Blob < \"u\" && a instanceof Blob;\n}\nfunction k(a) {\n return C(a) ? { file: a } : a;\n}\nfunction L(a) {\n var s;\n const e = a.filename ?? ((s = a.file) == null ? void 0 : s.name);\n if (!e)\n throw new S({\n type: \"INVALID_PAYLOAD\",\n status: 0,\n message: \"MISSING_FILENAME\"\n });\n return e;\n}\nfunction G(a) {\n const e = a.file, s = { filename: L(a) }, r = a.contentType ?? (e && C(e) ? e.type : \"\");\n return r && (s.content_type = r), a.bucket && (s.bucket = a.bucket), a.newName && (s.new_name = a.newName), a.publicRead !== void 0 && (s.public_read = a.publicRead), a.metadata && (s.metadata = a.metadata), a.options && (s.options = a.options), s;\n}\nfunction O(a) {\n return new S({ type: \"INVALID_RESPONSE\", status: 0, message: a });\n}\nfunction K(a, e) {\n if (!Array.isArray(a) || a.length !== e)\n throw O(\"INVALID_UPLOAD_RESPONSE\");\n return a.map((s) => {\n var y;\n const r = (y = s == null ? void 0 : s.upload) == null ? void 0 : y.url;\n if (!(s != null && s.id) || !(s != null && s.upload_token) || typeof r != \"string\")\n throw O(\"INVALID_UPLOAD_RESPONSE\");\n return {\n id: String(s.id),\n upload: { url: r, fields: s.upload.fields ?? {} },\n uploadToken: String(s.upload_token)\n };\n });\n}\nfunction I(a) {\n if (a && typeof a == \"object\" && \"code\" in a && \"message\" in a) {\n const { code: s, message: r } = a;\n return { code: String(s), message: String(r).slice(0, 500) };\n }\n return { code: \"UPLOAD_FAILED\", message: (a instanceof Error ? a.message : String(a ?? \"\")).slice(0, 500) };\n}\nasync function $(a, e, s, r) {\n const y = await a(e, { method: \"POST\", body: s, signal: r });\n return y.status ?? (y.ok ? 200 : 500);\n}\nfunction X(a, e, s, r) {\n return new Promise((y, f) => {\n const g = new XMLHttpRequest();\n if (g.open(\"POST\", a), g.upload.onprogress = (i) => {\n s(i.loaded, i.lengthComputable ? i.total : 0);\n }, g.onload = () => y(g.status), g.onerror = () => f(new Error(\"NETWORK_ERROR\")), g.onabort = () => f(new Error(\"ABORTED\")), r) {\n if (r.aborted) {\n f(new Error(\"ABORTED\"));\n return;\n }\n r.addEventListener(\"abort\", () => g.abort(), { once: !0 });\n }\n g.send(e);\n });\n}\nfunction Y(a) {\n const e = (i, c, d) => a.dispatch({ operation: i, payload: { files: c } }, { signal: d == null ? void 0 : d.signal });\n async function s(i, c) {\n const d = Array.from(i, k), m = [];\n for (const p of v(d, E)) {\n const w = p.map(\n (h) => G(c != null && c.bucket ? { bucket: c.bucket, ...h } : h)\n ), u = await e(\"files.initiate_upload\", w, c);\n m.push(...K(u, p.length));\n }\n return m;\n }\n async function r(i, c, d) {\n const m = k(i), p = new FormData();\n for (const [n, _] of Object.entries(c.upload.fields ?? {}))\n p.append(n, _);\n const w = m.file, u = C(w) ? w : new Blob([w]), h = u.size ?? 0;\n p.append(\"file\", u, L(m));\n const A = d == null ? void 0 : d.onProgress, t = A ? (n, _) => A({\n input: m,\n id: c.id,\n loaded: n,\n total: _,\n percent: _ > 0 ? Math.min(100, Math.round(n / _ * 100)) : 0\n }) : void 0;\n let o;\n try {\n o = t && typeof XMLHttpRequest < \"u\" ? await X(c.upload.url, p, t, d == null ? void 0 : d.signal) : await $(\n a.options.fetch ?? globalThis.fetch,\n c.upload.url,\n p,\n d == null ? void 0 : d.signal\n );\n } catch (n) {\n throw new S(\n { type: \"UPLOAD_FAILED\", status: 0, message: \"UPLOAD_FAILED\" },\n n\n );\n }\n if (o >= 400)\n throw new S({ type: \"UPLOAD_FAILED\", status: o, message: \"UPLOAD_FAILED\" });\n return t == null || t(h, h), { id: c.id, uploadToken: c.uploadToken };\n }\n async function y(i, c) {\n const d = [];\n for (const m of v(i, E)) {\n const p = await e(\n \"files.complete_upload\",\n m.map(({ id: w, uploadToken: u }) => ({ id: w, upload_token: u })),\n c\n );\n if (!Array.isArray(p)) throw O(\"INVALID_UPLOAD_RESPONSE\");\n d.push(...p);\n }\n return d;\n }\n async function f(i, c) {\n for (const d of v(i, E))\n await e(\n \"files.fail_upload\",\n d.map(({ id: m, uploadToken: p, error: w }) => ({\n id: m,\n upload_token: p,\n error: I(w)\n })),\n c\n );\n }\n async function g(i, c) {\n const d = Array.from(i, k), m = { completed: [], failed: [] };\n for (const u of v(d, E)) {\n const h = await s(u, c), A = [], t = [];\n if (await Promise.all(\n u.map(async (o, n) => {\n const _ = h[n];\n try {\n A.push({ input: o, completion: await r(o, _, c) });\n } catch (T) {\n t.push({ input: o, id: _.id, uploadToken: _.uploadToken, error: T });\n }\n })\n ), A.length)\n try {\n const o = await y(\n A.map((n) => n.completion),\n c\n );\n A.forEach((n, _) => {\n m.completed.push({ input: n.input, id: n.completion.id, file: o[_] });\n });\n } catch (o) {\n const n = I(o);\n A.forEach((_) => {\n m.failed.push({ input: _.input, id: _.completion.id, error: n });\n });\n }\n if (t.length) {\n try {\n await f(\n t.map((o) => ({ id: o.id, uploadToken: o.uploadToken, error: o.error })),\n c\n );\n } catch {\n }\n t.forEach((o) => {\n m.failed.push({ input: o.input, id: o.id, error: I(o.error) });\n });\n }\n }\n const p = new Map(d.map((u, h) => [u, h])), w = (u) => p.get(u.input) ?? 0;\n return m.completed.sort((u, h) => w(u) - w(h)), m.failed.sort((u, h) => w(u) - w(h)), m;\n }\n return { initiateUpload: s, uploadToRemote: r, completeUpload: y, failUpload: f, upload: g };\n}\nfunction j(a, e, s) {\n const r = (f, g, i = {}) => {\n const { options: c, ...d } = i;\n return e(\n {\n operation: `${a}.${f}`,\n payload: g ?? {},\n options: c\n },\n d\n );\n }, y = { call: r, ...s };\n return new Proxy(y, {\n get(f, g) {\n const i = f;\n return typeof g == \"symbol\" || g in i ? i[g] : (c, d) => r(g, c, d);\n }\n });\n}\nfunction Z(a) {\n return M(a, () => J(a));\n}\nfunction J(a) {\n const e = new D(a);\n let s = null;\n function r() {\n if (!s) {\n const { auth: i, ...c } = a;\n s = q({ ...c, ...i }, e);\n }\n return s;\n }\n e.setAuthProvider(async () => {\n const i = r();\n return await i.ready, {\n getToken: () => i.isAuthenticated() ? i.getState().session.id_token : null,\n refresh: async () => {\n try {\n return (await i.refreshSession()).id_token;\n } catch {\n return null;\n }\n }\n };\n });\n const y = /* @__PURE__ */ new Map(), f = (i) => {\n let c = y.get(i);\n return c || (c = j(\n i,\n (d, m) => e.dispatch(d, m),\n // `files` is the one namespace with a flow the proxy can't express:\n // uploads go straight to storage, so they need real methods.\n i === \"files\" ? Y(e) : void 0\n ), y.set(i, c)), c;\n }, g = {\n get auth() {\n return r();\n },\n dispatcher: e,\n data: f(\"data\"),\n files: f(\"files\"),\n user: f(\"user\"),\n users: f(\"users\"),\n llm: f(\"llm\"),\n service: f,\n dispatch: (i, c) => e.dispatch(i, c),\n isAuthenticated: () => (s == null ? void 0 : s.isAuthenticated()) ?? !1,\n getUser: () => (s == null ? void 0 : s.getUser()) ?? null,\n destroy() {\n s == null || s.destroy(), x(g);\n }\n };\n return g;\n}\nfunction te(a) {\n return Z(a).auth;\n}\nexport {\n W as AutoRefreshScheduler,\n E as FILES_BATCH_SIZE,\n V as SessionStore,\n te as SinglebaseAuth,\n ae as SinglebaseAuthError,\n Z as SinglebaseClient,\n re as SinglebaseError,\n q as createAuthClient,\n Y as createFilesUploadApi,\n ie as getDefaultClient,\n oe as indexedDbCryptoStorage,\n ce as localStorageAdapter,\n ue as mapErrorToHint,\n le as memoryStorage,\n I as normalizeUploadError,\n ee as resolveScreen,\n de as sessionStorageAdapter,\n he as setDefaultClient\n};\n//# sourceMappingURL=index.js.map\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1],t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,css,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:h,getOwnPropertyNames:r,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),b={attribute:!0,type:String,converter:u,reflect:!1,useDefault:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class y extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=b){if(s.state&&(s.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((s=Object.create(s)).wrapped=!0),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),h=this.getPropertyDescriptor(t,i,s);void 0!==h&&e(this.prototype,t,h)}}static getPropertyDescriptor(t,s,i){const{get:e,set:r}=h(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get:e,set(s){const h=e?.call(this);r?.call(this,s),this.requestUpdate(t,h,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...r(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$ET(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const h=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==h?this.removeAttribute(e):this.setAttribute(e,h),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),h=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e;const r=h.fromAttribute(s,t.type);this[e]=r??this._$Ej?.get(e)??r,this._$Em=null}}requestUpdate(t,s,i,e=!1,h){if(void 0!==t){const r=this.constructor;if(!1===e&&(h=this[t]),i??=r.getPropertyOptions(t),!((i.hasChanged??f)(h,s)||i.useDefault&&i.reflect&&h===this._$Ej?.get(t)&&!this.hasAttribute(r._$Eu(t,i))))return;this.C(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,s,{useDefault:i,reflect:e,wrapped:h},r){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,r??s??this[t]),!0!==h||void 0!==r)||(this._$AL.has(t)||(this.hasUpdated||i||(s=void 0),this._$AL.set(t,s)),!0===e&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t){const{wrapped:t}=i,e=this[s];!0!==t||this._$AL.has(s)||void 0===e||this.C(s,void 0,i,e)}}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(s)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}}y.elementStyles=[],y.shadowRootOptions={mode:\"open\"},y[d(\"elementProperties\")]=new Map,y[d(\"finalized\")]=new Map,p?.({ReactiveElement:y}),(a.reactiveElementVersions??=[]).push(\"2.1.2\");export{y as ReactiveElement,s as adoptStyles,u as defaultConverter,t as getCompatibleStyle,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,i=t=>t,s=t.trustedTypes,e=s?s.createPolicy(\"lit-html\",{createHTML:t=>t}):void 0,h=\"$lit$\",o=`lit$${Math.random().toFixed(9).slice(2)}$`,n=\"?\"+o,r=`<${n}>`,l=document,c=()=>l.createComment(\"\"),a=t=>null===t||\"object\"!=typeof t&&\"function\"!=typeof t,u=Array.isArray,d=t=>u(t)||\"function\"==typeof t?.[Symbol.iterator],f=\"[ \\t\\n\\f\\r]\",v=/<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g,_=/-->/g,m=/>/g,p=RegExp(`>|${f}(?:([^\\\\s\"'>=/]+)(${f}*=${f}*(?:[^ \\t\\n\\f\\r\"'\\`<>=]|(\"|')|))|$)`,\"g\"),g=/'/g,$=/\"/g,y=/^(?:script|style|textarea|title)$/i,x=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),b=x(1),w=x(2),T=x(3),E=Symbol.for(\"lit-noChange\"),A=Symbol.for(\"lit-nothing\"),C=new WeakMap,P=l.createTreeWalker(l,129);function V(t,i){if(!u(t)||!t.hasOwnProperty(\"raw\"))throw Error(\"invalid template strings array\");return void 0!==e?e.createHTML(i):i}const N=(t,i)=>{const s=t.length-1,e=[];let n,l=2===i?\"<svg>\":3===i?\"<math>\":\"\",c=v;for(let i=0;i<s;i++){const s=t[i];let a,u,d=-1,f=0;for(;f<s.length&&(c.lastIndex=f,u=c.exec(s),null!==u);)f=c.lastIndex,c===v?\"!--\"===u[1]?c=_:void 0!==u[1]?c=m:void 0!==u[2]?(y.test(u[2])&&(n=RegExp(\"</\"+u[2],\"g\")),c=p):void 0!==u[3]&&(c=p):c===p?\">\"===u[0]?(c=n??v,d=-1):void 0===u[1]?d=-2:(d=c.lastIndex-u[2].length,a=u[1],c=void 0===u[3]?p:'\"'===u[3]?$:g):c===$||c===g?c=p:c===_||c===m?c=v:(c=p,n=void 0);const x=c===p&&t[i+1].startsWith(\"/>\")?\" \":\"\";l+=c===v?s+r:d>=0?(e.push(a),s.slice(0,d)+h+s.slice(d)+o+x):s+o+(-2===d?i:x)}return[V(t,l+(t[s]||\"<?>\")+(2===i?\"</svg>\":3===i?\"</math>\":\"\")),e]};class S{constructor({strings:t,_$litType$:i},e){let r;this.parts=[];let l=0,a=0;const u=t.length-1,d=this.parts,[f,v]=N(t,i);if(this.el=S.createElement(f,e),P.currentNode=this.el.content,2===i||3===i){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(r=P.nextNode())&&d.length<u;){if(1===r.nodeType){if(r.hasAttributes())for(const t of r.getAttributeNames())if(t.endsWith(h)){const i=v[a++],s=r.getAttribute(t).split(o),e=/([.?@])?(.*)/.exec(i);d.push({type:1,index:l,name:e[2],strings:s,ctor:\".\"===e[1]?I:\"?\"===e[1]?L:\"@\"===e[1]?z:H}),r.removeAttribute(t)}else t.startsWith(o)&&(d.push({type:6,index:l}),r.removeAttribute(t));if(y.test(r.tagName)){const t=r.textContent.split(o),i=t.length-1;if(i>0){r.textContent=s?s.emptyScript:\"\";for(let s=0;s<i;s++)r.append(t[s],c()),P.nextNode(),d.push({type:2,index:++l});r.append(t[i],c())}}}else if(8===r.nodeType)if(r.data===n)d.push({type:2,index:l});else{let t=-1;for(;-1!==(t=r.data.indexOf(o,t+1));)d.push({type:7,index:l}),t+=o.length-1}l++}}static createElement(t,i){const s=l.createElement(\"template\");return s.innerHTML=t,s}}function M(t,i,s=t,e){if(i===E)return i;let h=void 0!==e?s._$Co?.[e]:s._$Cl;const o=a(i)?void 0:i._$litDirective$;return h?.constructor!==o&&(h?._$AO?.(!1),void 0===o?h=void 0:(h=new o(t),h._$AT(t,s,e)),void 0!==e?(s._$Co??=[])[e]=h:s._$Cl=h),void 0!==h&&(i=M(t,h._$AS(t,i.values),h,e)),i}class R{constructor(t,i){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=i}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:i},parts:s}=this._$AD,e=(t?.creationScope??l).importNode(i,!0);P.currentNode=e;let h=P.nextNode(),o=0,n=0,r=s[0];for(;void 0!==r;){if(o===r.index){let i;2===r.type?i=new k(h,h.nextSibling,this,t):1===r.type?i=new r.ctor(h,r.name,r.strings,this,t):6===r.type&&(i=new Z(h,this,t)),this._$AV.push(i),r=s[++n]}o!==r?.index&&(h=P.nextNode(),o++)}return P.currentNode=l,e}p(t){let i=0;for(const s of this._$AV)void 0!==s&&(void 0!==s.strings?(s._$AI(t,s,i),i+=s.strings.length-2):s._$AI(t[i])),i++}}class k{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,i,s,e){this.type=2,this._$AH=A,this._$AN=void 0,this._$AA=t,this._$AB=i,this._$AM=s,this.options=e,this._$Cv=e?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const i=this._$AM;return void 0!==i&&11===t?.nodeType&&(t=i.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,i=this){t=M(this,t,i),a(t)?t===A||null==t||\"\"===t?(this._$AH!==A&&this._$AR(),this._$AH=A):t!==this._$AH&&t!==E&&this._(t):void 0!==t._$litType$?this.$(t):void 0!==t.nodeType?this.T(t):d(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==A&&a(this._$AH)?this._$AA.nextSibling.data=t:this.T(l.createTextNode(t)),this._$AH=t}$(t){const{values:i,_$litType$:s}=t,e=\"number\"==typeof s?this._$AC(t):(void 0===s.el&&(s.el=S.createElement(V(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===e)this._$AH.p(i);else{const t=new R(e,this),s=t.u(this.options);t.p(i),this.T(s),this._$AH=t}}_$AC(t){let i=C.get(t.strings);return void 0===i&&C.set(t.strings,i=new S(t)),i}k(t){u(this._$AH)||(this._$AH=[],this._$AR());const i=this._$AH;let s,e=0;for(const h of t)e===i.length?i.push(s=new k(this.O(c()),this.O(c()),this,this.options)):s=i[e],s._$AI(h),e++;e<i.length&&(this._$AR(s&&s._$AB.nextSibling,e),i.length=e)}_$AR(t=this._$AA.nextSibling,s){for(this._$AP?.(!1,!0,s);t!==this._$AB;){const s=i(t).nextSibling;i(t).remove(),t=s}}setConnected(t){void 0===this._$AM&&(this._$Cv=t,this._$AP?.(t))}}class H{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,i,s,e,h){this.type=1,this._$AH=A,this._$AN=void 0,this.element=t,this.name=i,this._$AM=e,this.options=h,s.length>2||\"\"!==s[0]||\"\"!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=A}_$AI(t,i=this,s,e){const h=this.strings;let o=!1;if(void 0===h)t=M(this,t,i,0),o=!a(t)||t!==this._$AH&&t!==E,o&&(this._$AH=t);else{const e=t;let n,r;for(t=h[0],n=0;n<h.length-1;n++)r=M(this,e[s+n],i,n),r===E&&(r=this._$AH[n]),o||=!a(r)||r!==this._$AH[n],r===A?t=A:t!==A&&(t+=(r??\"\")+h[n+1]),this._$AH[n]=r}o&&!e&&this.j(t)}j(t){t===A?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??\"\")}}class I extends H{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===A?void 0:t}}class L extends H{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==A)}}class z extends H{constructor(t,i,s,e,h){super(t,i,s,e,h),this.type=5}_$AI(t,i=this){if((t=M(this,t,i,0)??A)===E)return;const s=this._$AH,e=t===A&&s!==A||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,h=t!==A&&(s===A||e);e&&this.element.removeEventListener(this.name,this,s),h&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){\"function\"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}}class Z{constructor(t,i,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=i,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){M(this,t)}}const j={M:h,P:o,A:n,C:1,L:N,R,D:d,V:M,I:k,H,N:L,U:z,B:I,F:Z},B=t.litHtmlPolyfillSupport;B?.(S,k),(t.litHtmlVersions??=[]).push(\"3.3.3\");const D=(t,i,s)=>{const e=s?.renderBefore??i;let h=e._$litPart$;if(void 0===h){const t=s?.renderBefore??null;e._$litPart$=h=new k(i.insertBefore(c(),t),t,void 0,s??{})}return h._$AI(t),h};export{j as _$LH,b as html,T as mathml,E as noChange,A as nothing,D as render,w as svg};\n//# sourceMappingURL=lit-html.js.map\n","import{ReactiveElement as t}from\"@lit/reactive-element\";export*from\"@lit/reactive-element\";import{render as e,noChange as r}from\"lit-html\";export*from\"lit-html\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const s=globalThis;class i extends t{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const r=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=e(r,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return r}}i._$litElement$=!0,i[\"finalized\"]=!0,s.litElementHydrateSupport?.({LitElement:i});const o=s.litElementPolyfillSupport;o?.({LitElement:i});const n={_$AK:(t,e,r)=>{t._$AK(e,r)},_$AL:t=>t._$AL};(s.litElementVersions??=[]).push(\"4.2.2\");export{i as LitElement,n as _$LE};\n//# sourceMappingURL=lit-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer(()=>{customElements.define(t,e)}):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","import{notEqual as t,defaultConverter as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:e,reflect:!1,hasChanged:t},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),\"setter\"===n&&((t=Object.create(t)).wrapped=!0),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t,!0,r)},init(e){return void 0!==e&&this.C(o,void 0,t,e),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t,!0,r)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import{property as t}from\"./property.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function r(r){return t({...r,state:!0,attribute:!1})}export{r as state};\n//# sourceMappingURL=state.js.map\n","import{nothing as t}from\"../lit-html.js\";\n/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o=o=>o??t;export{o as ifDefined};\n//# sourceMappingURL=if-defined.js.map\n","import type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport type { AuthClient, AuthState } from \"@singlebase/singlebase-sdk\";\n\n/**\n * Subscribes a host element to an AuthClient's session state and triggers a\n * re-render on every change, so individual elements never hand-roll\n * subscribe/unsubscribe bookkeeping. Call bind(client) whenever the host's\n * resolved client changes (e.g. context updates, or .client is set).\n */\nexport class AuthController implements ReactiveController {\n private host: ReactiveControllerHost;\n private client: AuthClient | null = null;\n private unsubscribe: (() => void) | null = null;\n state: AuthState = { status: \"loading\", session: null, user: null };\n\n constructor(host: ReactiveControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n bind(client: AuthClient | null): void {\n if (client === this.client) return;\n this.unsubscribe?.();\n this.unsubscribe = null;\n this.client = client;\n if (!client) return;\n this.state = client.getState();\n this.unsubscribe = client.subscribe((state) => {\n this.state = state;\n this.host.requestUpdate();\n });\n this.host.requestUpdate();\n }\n\n hostDisconnected(): void {\n this.unsubscribe?.();\n this.unsubscribe = null;\n }\n}\n","import { css, unsafeCSS } from \"lit\";\n\n/**\n * Default values for every --sb-* design token, ported from the design\n * mock's tokens()/styles() functions. These are consumed as var(--sb-x,\n * DEFAULT) fallbacks at each point of use (see shared.ts) — never assigned\n * unconditionally on :host — so that a value set by a host application, or\n * by a theme/density attribute forwarded down from a composing parent\n * element, actually inherits through\n * nested shadow roots instead of being reset back to these defaults by every\n * descendant's own :host rule.\n */\nexport const TOKEN_DEFAULTS = {\n font: `\"Geist\", -apple-system, \"Segoe UI\", Helvetica, sans-serif`,\n mono: `\"Geist Mono\", ui-monospace, monospace`,\n accent: \"#111111\",\n onAccent: \"#ffffff\",\n radius: \"4px\",\n /** Multiplies every corner. The `radius` attribute sets it per element. */\n radiusScale: \"1\",\n surface: \"#ffffff\",\n surfaceAlt: \"#fafafa\",\n ink: \"#16181a\",\n mutedInk: \"#61666c\",\n border: \"#e4e6e9\",\n borderStrong: \"#cdd1d6\",\n danger: \"#b4231a\",\n dangerBg: \"#fdf1f0\",\n dangerBorder: \"#f3d6d3\",\n dangerOutline: \"#e8c4c0\",\n dangerPanelBorder: \"#efd9d6\",\n dangerPanelBg: \"#fdf7f6\",\n ok: \"#0f6b4a\",\n okBg: \"#f0f7f3\",\n okBorder: \"#cfe5da\",\n gap: \"16px\",\n pad: \"20px\",\n fieldPad: \"11px 13px\"\n} as const;\n\n/**\n * Base host layout plus the theme=\"dark\"/density=\"compact\" attribute\n * overrides. These overrides are legitimate unconditional assignments —\n * they only fire when *this* element carries the attribute — but every\n * composite element (<singlebase-authui>, <singlebase-authui-account>) must forward\n * theme/density/field-style to the singlebase-* children it renders for the\n * override to reach elements that don't carry the attribute directly.\n */\nexport const tokenDefaults = css`\n :host {\n display: block;\n box-sizing: border-box;\n font-family: var(--sb-font, ${unsafeCSS(TOKEN_DEFAULTS.font)});\n color: var(--sb-ink, ${unsafeCSS(TOKEN_DEFAULTS.ink)});\n }\n\n :host([theme=\"dark\"]) {\n /* The light default accent is near-black, which disappears on a dark\n surface — primary buttons and links both use it. A host that sets its\n own --sb-accent still wins: outer-page declarations beat :host rules. */\n --sb-accent: #f3f4f5;\n --sb-on-accent: #17181b;\n --sb-surface: #17181b;\n --sb-surface-alt: #202226;\n --sb-ink: #f3f4f5;\n --sb-muted-ink: #a2a8ae;\n --sb-border: #2c2f34;\n --sb-border-strong: #3a3e44;\n --sb-danger: #f08379;\n --sb-danger-bg: rgba(240, 131, 121, 0.1);\n --sb-danger-border: rgba(240, 131, 121, 0.3);\n --sb-danger-outline: rgba(240, 131, 121, 0.4);\n --sb-danger-panel-border: rgba(240, 131, 121, 0.3);\n --sb-danger-panel-bg: rgba(240, 131, 121, 0.06);\n --sb-ok: #6fd1a6;\n --sb-ok-bg: rgba(111, 209, 166, 0.1);\n --sb-ok-border: rgba(111, 209, 166, 0.28);\n }\n\n /* Corner presets. They set the scale on this element only, so a page-wide\n :root { --sb-radius-scale } (or --sb-radius) applies to every element\n that doesn't carry the attribute. */\n :host([radius=\"sharp\"]) {\n --sb-radius-scale: 0.35;\n }\n\n :host([radius=\"default\"]) {\n --sb-radius-scale: 1;\n }\n\n :host([radius=\"round\"]) {\n --sb-radius-scale: 1.8;\n }\n\n :host([density=\"compact\"]) {\n --sb-gap: 12px;\n --sb-pad: 16px;\n --sb-field-pad: 9px 11px;\n }\n`;\n","import { css } from \"lit\";\n\n/**\n * Shared internal styles, ported value-for-value from the design mock's\n * styles(t) / acc(t, open, bare) functions in project/AuthWidget.dc.html.\n * The mock computed these as inline style objects per render; here they are\n * static Shadow DOM CSS driven by the --sb-* tokens, with part hooks so\n * hosts can reach internals via ::part().\n */\nexport const sharedStyles = css`\n /* ── layout primitives ───────────────────────────────────── */\n .stack {\n display: flex;\n flex-direction: column;\n gap: var(--sb-gap, 16px);\n }\n\n .fields {\n display: flex;\n flex-direction: column;\n gap: var(--sb-gap, 16px);\n }\n\n .head {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .two-up {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: var(--sb-gap, 16px);\n }\n\n .actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .rule {\n height: 1px;\n background: var(--sb-border, #e4e6e9);\n }\n\n .between {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n }\n\n /* ── type ────────────────────────────────────────────────── */\n .logo-dot {\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 12px;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--sb-muted-ink, #61666c);\n margin-bottom: 6px;\n }\n\n .title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n letter-spacing: -0.015em;\n color: var(--sb-ink, #16181a);\n }\n\n .sub {\n margin: 0;\n font-size: 13.5px;\n line-height: 1.5;\n color: var(--sb-muted-ink, #61666c);\n text-wrap: pretty;\n }\n\n .sec-title {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n letter-spacing: -0.01em;\n color: var(--sb-ink, #16181a);\n }\n\n .hint {\n margin: 0;\n font-size: 12.5px;\n line-height: 1.5;\n color: var(--sb-muted-ink, #61666c);\n text-wrap: pretty;\n }\n\n .sub-label {\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 11px;\n letter-spacing: 0.07em;\n text-transform: uppercase;\n color: var(--sb-muted-ink, #61666c);\n }\n\n /* ── fields ──────────────────────────────────────────────── */\n .field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .label-row {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 8px;\n }\n\n label,\n .label {\n font-size: 12.5px;\n font-weight: 500;\n color: var(--sb-muted-ink, #61666c);\n letter-spacing: 0.01em;\n }\n\n input {\n width: 100%;\n box-sizing: border-box;\n font: inherit;\n font-size: 14px;\n color: var(--sb-ink, #16181a);\n background: var(--sb-surface-alt, #fafafa);\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n padding: var(--sb-field-pad, 11px 13px);\n outline: none;\n }\n\n input:focus {\n border-color: var(--sb-accent, #111111);\n }\n\n input[aria-invalid=\"true\"] {\n border-color: var(--sb-danger, #b4231a);\n }\n\n /* field-style=\"underline\" — code boxes keep their box, they read as cells */\n :host([field-style=\"underline\"]) *:not(.code-row):not(.code-row-sm) > input {\n background: transparent;\n border: none;\n border-bottom: 1px solid var(--sb-border-strong, #cdd1d6);\n border-radius: 0;\n padding: 9px 2px;\n }\n\n p.err {\n margin: 0;\n font-size: 12.5px;\n color: var(--sb-danger, #b4231a);\n }\n\n /* ── code entry ──────────────────────────────────────────── */\n .code-row {\n display: grid;\n grid-template-columns: repeat(6, 1fr);\n gap: 8px;\n }\n\n .code-row input {\n text-align: center;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 18px;\n padding: 12px 0;\n }\n\n .code-row-sm {\n display: grid;\n grid-template-columns: repeat(6, 1fr);\n gap: 6px;\n }\n\n .code-row-sm input {\n text-align: center;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 14px;\n padding: 8px 0;\n }\n\n .resend-row {\n display: flex;\n align-items: baseline;\n gap: 8px;\n }\n\n /* ── buttons ─────────────────────────────────────────────── */\n button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n font: inherit;\n font-size: 13.5px;\n font-weight: 500;\n border-radius: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n cursor: pointer;\n padding: 9px 14px;\n border: 1px solid transparent;\n transition:\n background 0.15s,\n border-color 0.15s,\n filter 0.15s,\n color 0.15s;\n }\n\n button:disabled {\n cursor: not-allowed;\n }\n\n button.primary {\n background: var(--sb-accent, #111111);\n color: var(--sb-on-accent, #ffffff);\n width: 100%;\n }\n\n button.primary:hover:not(:disabled) {\n filter: brightness(0.92);\n }\n\n button.primary-sm {\n background: var(--sb-accent, #111111);\n color: var(--sb-on-accent, #ffffff);\n padding: 7px 12px;\n }\n\n button.primary-sm:hover:not(:disabled) {\n filter: brightness(0.92);\n }\n\n button.ghost {\n background: transparent;\n color: var(--sb-muted-ink, #61666c);\n border: 1px solid var(--sb-border, #e4e6e9);\n width: 100%;\n }\n\n button.ghost-sm {\n background: transparent;\n color: var(--sb-muted-ink, #61666c);\n border: 1px solid var(--sb-border, #e4e6e9);\n padding: 7px 12px;\n }\n\n button.ghost:hover:not(:disabled),\n button.ghost-sm:hover:not(:disabled) {\n background: var(--sb-surface-alt, #fafafa);\n color: var(--sb-ink, #16181a);\n }\n\n button.secondary {\n background: var(--sb-surface, #ffffff);\n color: var(--sb-ink, #16181a);\n border: 1px solid var(--sb-border-strong, #cdd1d6);\n padding: 7px 12px;\n }\n\n button.secondary:hover:not(:disabled) {\n background: var(--sb-surface-alt, #fafafa);\n }\n\n button.link {\n font: inherit;\n font-size: 13px;\n font-weight: 500;\n color: var(--sb-accent, #111111);\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n text-decoration: underline;\n text-underline-offset: 3px;\n }\n\n button.link-sm {\n font: inherit;\n font-size: 12.5px;\n font-weight: 400;\n color: var(--sb-muted-ink, #61666c);\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n text-decoration: underline;\n text-underline-offset: 3px;\n }\n\n /* the mock's editLink: a muted underlined affordance that inks on hover */\n button.edit-link {\n align-self: flex-start;\n font: inherit;\n font-size: 12.5px;\n font-weight: 400;\n color: var(--sb-muted-ink, #61666c);\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n text-decoration: underline;\n text-underline-offset: 3px;\n transition: color 0.15s;\n }\n\n button.edit-link:hover:not(:disabled) {\n color: var(--sb-ink, #16181a);\n }\n\n button.edit-link:disabled {\n opacity: 0.4;\n }\n\n button.danger-link {\n align-self: flex-start;\n font: inherit;\n font-size: 12.5px;\n font-weight: 400;\n color: var(--sb-muted-ink, #61666c);\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n text-decoration: underline;\n text-underline-offset: 3px;\n transition: color 0.15s;\n }\n\n button.danger-link:hover:not(:disabled) {\n color: var(--sb-danger, #b4231a);\n }\n\n button.danger {\n padding: 7px 12px;\n background: transparent;\n color: var(--sb-danger, #b4231a);\n border: 1px solid var(--sb-danger-outline, #e8c4c0);\n }\n\n button.danger:hover:not(:disabled) {\n background: var(--sb-danger-bg, #fdf1f0);\n }\n\n button.danger:disabled {\n opacity: 0.45;\n }\n\n .btn-row {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n }\n\n .btn-row-end {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 12px;\n flex-wrap: wrap;\n }\n\n .edit-actions {\n display: flex;\n gap: 8px;\n padding-top: 2px;\n }\n\n /* ── feedback ────────────────────────────────────────────── */\n .banner,\n .notice {\n font-size: 13px;\n line-height: 1.45;\n border-radius: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n padding: 10px 12px;\n }\n\n .banner {\n color: var(--sb-danger, #b4231a);\n background: var(--sb-danger-bg, #fdf1f0);\n border: 1px solid var(--sb-danger-border, #f3d6d3);\n }\n\n .notice {\n color: var(--sb-ok, #0f6b4a);\n background: var(--sb-ok-bg, #f0f7f3);\n border: 1px solid var(--sb-ok-border, #cfe5da);\n }\n\n .saved-note {\n font-size: 12.5px;\n font-weight: 500;\n color: var(--sb-ok, #0f6b4a);\n }\n\n .spinner {\n width: 13px;\n height: 13px;\n border: 2px solid rgba(255, 255, 255, 0.4);\n border-top-color: var(--sb-on-accent, #ffffff);\n border-radius: 50%;\n animation: sb-spin 0.7s linear infinite;\n }\n\n @keyframes sb-spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n }\n\n /* ── step bar ────────────────────────────────────────────── */\n .step-bar {\n height: 3px;\n background: var(--sb-border, #e4e6e9);\n border-radius: 99px;\n overflow: hidden;\n }\n\n .step-fill {\n height: 100%;\n background: var(--sb-accent, #111111);\n transition: width 0.3s;\n }\n\n /* ── footer link row ─────────────────────────────────────── */\n .foot {\n margin: 0;\n display: flex;\n gap: 6px;\n justify-content: center;\n font-size: 13px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n /* ── oauth ───────────────────────────────────────────────── */\n .oauth-primary {\n background: var(--sb-surface, #ffffff);\n color: var(--sb-ink, #16181a);\n border: 1px solid var(--sb-border-strong, #cdd1d6);\n width: 100%;\n }\n\n .oauth-primary:hover:not(:disabled) {\n background: var(--sb-surface-alt, #fafafa);\n }\n\n .g-mark {\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-weight: 500;\n font-size: 13px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .icon-row {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n }\n\n .icon-btn {\n padding: 7px 0;\n background: var(--sb-surface, #ffffff);\n color: var(--sb-muted-ink, #61666c);\n border: 1px solid var(--sb-border, #e4e6e9);\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 13px;\n }\n\n .icon-btn:hover:not(:disabled) {\n background: var(--sb-surface-alt, #fafafa);\n color: var(--sb-ink, #16181a);\n }\n\n /* ── accordion (method picker) ───────────────────────────── */\n .acc-wrap {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .acc-item {\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n overflow: hidden;\n background: transparent;\n transition:\n border-color 0.2s,\n background 0.2s;\n }\n\n .acc-item.open {\n border-color: var(--sb-border-strong, #cdd1d6);\n background: var(--sb-surface, #ffffff);\n }\n\n .acc-item.bare {\n border: none;\n background: transparent;\n }\n\n .acc-head {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n box-sizing: border-box;\n font: inherit;\n text-align: left;\n background: transparent;\n border: none;\n border-radius: 0;\n padding: 11px 12px;\n cursor: pointer;\n color: var(--sb-ink, #16181a);\n transition: background 0.15s;\n }\n\n .acc-head:hover {\n background: var(--sb-surface-alt, #fafafa);\n }\n\n .chev {\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 13px;\n color: var(--sb-muted-ink, #61666c);\n line-height: 1;\n transform: rotate(0deg);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .acc-item.open .chev {\n transform: rotate(90deg);\n }\n\n .acc-title {\n font-size: 13.5px;\n font-weight: 500;\n color: var(--sb-ink, #16181a);\n letter-spacing: -0.005em;\n }\n\n .acc-meta {\n font-size: 12px;\n color: var(--sb-muted-ink, #61666c);\n margin-left: auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .acc-body {\n display: grid;\n grid-template-rows: 0fr;\n opacity: 0;\n transition:\n grid-template-rows 0.28s cubic-bezier(0.32, 0.72, 0, 1),\n opacity 0.16s ease;\n }\n\n .acc-item.open .acc-body {\n grid-template-rows: 1fr;\n opacity: 1;\n transition:\n grid-template-rows 0.34s cubic-bezier(0.32, 0.72, 0, 1),\n opacity 0.26s ease 0.06s;\n }\n\n .acc-clip {\n overflow: hidden;\n min-height: 0;\n }\n\n .acc-inner {\n display: flex;\n flex-direction: column;\n gap: var(--sb-gap, 16px);\n padding: 2px 12px 14px;\n transform: translateY(-4px);\n transition: transform 0.3s cubic-bezier(0.32, 0.72, 0, 1);\n }\n\n .acc-item.open .acc-inner {\n transform: translateY(0);\n }\n\n .acc-item.bare .acc-inner {\n padding: 0;\n }\n\n /* ── invite ──────────────────────────────────────────────── */\n .invite-box {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 10px 12px;\n background: var(--sb-surface-alt, #fafafa);\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n }\n\n .invite-label {\n font-size: 11.5px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n color: var(--sb-muted-ink, #61666c);\n }\n\n .invite-email {\n font-size: 14px;\n color: var(--sb-ink, #16181a);\n }\n\n /* ── account ─────────────────────────────────────────────── */\n .acct-root {\n display: flex;\n flex-direction: column;\n gap: 22px;\n width: 100%;\n }\n\n .acct-nav {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n padding-bottom: 18px;\n border-bottom: 1px solid var(--sb-border, #e4e6e9);\n }\n\n .acct-who {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .avatar-col {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 42px;\n height: 42px;\n border-radius: 50%;\n background: var(--sb-surface-alt, #fafafa);\n border: 1px dashed var(--sb-border, #e4e6e9);\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 13px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .avatar.has-photo {\n border-style: solid;\n overflow: hidden;\n }\n .avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .avatar-lg {\n width: 56px;\n height: 56px;\n border-radius: 50%;\n background: var(--sb-surface-alt, #fafafa);\n border: 1px dashed var(--sb-border-strong, #cdd1d6);\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 13px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .avatar-row {\n display: flex;\n align-items: center;\n gap: 14px;\n }\n\n .avatar-actions {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .acct-who-text {\n min-width: 0;\n }\n\n .acct-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--sb-ink, #16181a);\n letter-spacing: -0.01em;\n }\n\n .acct-email {\n font-size: 12.5px;\n color: var(--sb-muted-ink, #61666c);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .acct-body {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 22px;\n }\n\n .section {\n display: flex;\n flex-direction: column;\n gap: 14px;\n }\n\n .sum-list {\n display: flex;\n flex-direction: column;\n }\n\n .sum-row {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 16px;\n padding: 15px 0;\n border-bottom: 1px solid var(--sb-border, #e4e6e9);\n }\n\n .sum-label {\n flex: 0 0 auto;\n font-size: 12.5px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .sum-value {\n min-width: 0;\n font-size: 13.5px;\n color: var(--sb-ink, #16181a);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .edit-card {\n display: flex;\n flex-direction: column;\n gap: var(--sb-gap, 16px);\n padding: 14px;\n background: var(--sb-surface-alt, #fafafa);\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n }\n\n /* 2FA switch */\n .switch {\n flex: 0 0 auto;\n width: 42px;\n height: 24px;\n border-radius: 99px;\n border: 1px solid var(--sb-border-strong, #cdd1d6);\n background: var(--sb-surface-alt, #fafafa);\n cursor: pointer;\n padding: 2px;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n transition:\n background 0.15s,\n border-color 0.15s;\n }\n\n .switch[aria-pressed=\"true\"] {\n border-color: var(--sb-accent, #111111);\n background: var(--sb-accent, #111111);\n justify-content: flex-end;\n }\n\n .knob {\n width: 18px;\n height: 18px;\n border-radius: 50%;\n background: var(--sb-muted-ink, #61666c);\n display: block;\n }\n\n .switch[aria-pressed=\"true\"] .knob {\n background: var(--sb-on-accent, #ffffff);\n }\n\n .qr-row {\n display: flex;\n gap: 14px;\n align-items: flex-start;\n }\n\n .qr-box {\n flex: 0 0 auto;\n width: 74px;\n height: 74px;\n border-radius: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n background: var(--sb-surface-alt, #fafafa);\n border: 1px dashed var(--sb-border-strong, #cdd1d6);\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 12px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .qr-text {\n display: flex;\n flex-direction: column;\n gap: 10px;\n min-width: 0;\n }\n\n /* connected accounts */\n .list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .conn-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 10px 12px;\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n background: var(--sb-surface-alt, #fafafa);\n }\n\n .conn-left {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n }\n\n .conn-mark {\n flex: 0 0 auto;\n width: 28px;\n height: 28px;\n border-radius: 50%;\n background: var(--sb-surface, #ffffff);\n border: 1px solid var(--sb-border, #e4e6e9);\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 11px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .conn-name {\n font-size: 13.5px;\n font-weight: 500;\n color: var(--sb-ink, #16181a);\n }\n\n .meta-row {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .dot {\n flex: 0 0 auto;\n width: 5px;\n height: 5px;\n border-radius: 50%;\n background: var(--sb-ok, #0f6b4a);\n }\n\n .conn-meta {\n font-size: 12px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .tile-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(118px, 1fr));\n gap: 8px;\n }\n\n .tile {\n display: flex;\n align-items: center;\n gap: 8px;\n font: inherit;\n text-align: left;\n padding: 10px 11px;\n border-radius: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n border: 1px dashed var(--sb-border-strong, #cdd1d6);\n background: transparent;\n cursor: pointer;\n transition:\n background 0.15s,\n border-color 0.15s,\n color 0.15s;\n }\n\n .tile:hover:not(:disabled) {\n background: var(--sb-surface-alt, #fafafa);\n border-color: var(--sb-accent, #111111);\n border-style: solid;\n }\n\n .tile-mark {\n flex: 0 0 auto;\n width: 22px;\n height: 22px;\n border-radius: 50%;\n background: var(--sb-surface-alt, #fafafa);\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 10.5px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .tile-name {\n font-size: 13px;\n color: var(--sb-ink, #16181a);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .tile-plus {\n margin-left: auto;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 14px;\n line-height: 1;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .delete-panel {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 14px;\n border: 1px solid var(--sb-danger-panel-border, #efd9d6);\n border-radius: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n background: var(--sb-danger-panel-bg, #fdf7f6);\n }\n\n .disabled-note {\n font-size: 12px;\n color: var(--sb-muted-ink, #61666c);\n font-style: italic;\n }\n`;\n","/**\n * Default UI copy, taken verbatim from the design mock's renderVals()\n * (titles/subs/ctas maps and inline strings in project/AuthWidget.dc.html).\n * Every element accepts a .messages property with a partial override of\n * this shape — spec: \"configurable labels and messages without changing flow\n * logic\". This is deliberately a flat string bag rather than a locale-file\n * system; hosts needing full i18n supply one populated object per language.\n */\nexport interface SinglebaseAuthMessages {\n // titles\n signInTitle: string;\n signUpTitle: string;\n forgotTitle: string;\n verifyTitle: string;\n otpTitle: string;\n newPassTitle: string;\n inviteTitle: string;\n\n // subtitles\n signInSubEmailAndOauth: string;\n signInSubEmailOnly: string;\n signInSubOauthOnly: string;\n signUpSub: string;\n forgotSub: string;\n otpSub: string;\n inviteSub: string;\n\n // ctas\n signInCta: string;\n signUpCta: string;\n forgotCta: string;\n verifyCta: string;\n otpCta: string;\n newPassCta: string;\n inviteCta: string;\n continueCta: string;\n backCta: string;\n\n // accordion\n emailMethodTitle: string;\n emailMethodTitleSignUp: string;\n emailMethodMeta: string;\n emailMethodMetaSignUp: string;\n emailMethodMetaOtp: string;\n oauthMethodTitle: string;\n oauthMethodMeta: string;\n\n // fields\n fullNameLabel: string;\n fullNamePlaceholder: string;\n emailLabel: string;\n emailPlaceholder: string;\n passwordLabel: string;\n passwordPlaceholder: string;\n newPasswordLabel: string;\n newPasswordPlaceholder: string;\n confirmPasswordLabel: string;\n confirmPasswordPlaceholder: string;\n currentPasswordLabel: string;\n firstNameLabel: string;\n firstNamePlaceholder: string;\n lastNameLabel: string;\n lastNamePlaceholder: string;\n phoneLabel: string;\n phonePlaceholder: string;\n invitedEmailLabel: string;\n\n // links / affordances\n forgotLink: string;\n otpInsteadLink: string;\n footTextSignIn: string;\n footActionSignIn: string;\n footTextSignUp: string;\n footActionSignUp: string;\n resendQuestion: string;\n resendCta: string;\n oauthPrimaryLabel: string;\n oauthContinueWith: string;\n\n // blocked\n blockedTitleDisabled: string;\n blockedTitleUnavailable: string;\n blockedBodyDisabled: string;\n blockedBodyUnavailable: string;\n blockedHint: string;\n\n // account\n signOutCta: string;\n addPhotoLink: string;\n changePhotoLink: string;\n photoUploading: string;\n photoUpdated: string;\n editingLabel: string;\n uploadPhotoCta: string;\n replacePhotoCta: string;\n photoHint: string;\n doneCta: string;\n cancelCta: string;\n editAccountCta: string;\n saveChangesCta: string;\n emailChangeHint: string;\n passwordSectionTitle: string;\n passwordChangedHint: string;\n changePasswordCta: string;\n updatePasswordCta: string;\n twoFaTitle: string;\n twoFaHintOff: string;\n twoFaHintOn: string;\n twoFaScanHint: string;\n connectedTitle: string;\n connectedHint: string;\n addAnotherLabel: string;\n disconnectCta: string;\n notConnectedLabel: string;\n deleteAccountCta: string;\n deleteAccountConfirmCta: string;\n deletePanelBody: string;\n deleteConfirmLabel: string;\n deleteConfirmPlaceholder: string;\n savedNote: string;\n passwordUpdatedNote: string;\n\n // standalone change-email / change-username forms\n changeEmailTitle: string;\n newEmailLabel: string;\n changeEmailCta: string;\n changeUsernameTitle: string;\n newUsernameLabel: string;\n changeUsernameCta: string;\n\n // generic async / errors\n genericErrorMessage: string;\n rateLimitedMessage: string;\n codeSentNeutral: string;\n invalidEmailError: string;\n requiredError: string;\n passwordMinError: string;\n passwordMatchError: string;\n codeIncompleteError: string;\n invalidPhoneError: string;\n notYetSupported: string;\n\n // already-signed-in interstitial\n alreadySignedInTitle: string;\n alreadySignedInSub: string;\n alreadySignedInSubPrefix: string;\n continueHint: string;\n\n // consent line\n consentPrefix: string;\n consentJoin: string;\n termsLabel: string;\n privacyLabel: string;\n\n emailUnchangedError: string;\n emailUpdatedNote: string;\n changeEmailCtaShort: string;\n changeEmailHint: string;\n changeEmailConfirmHint: string;\n changeEmailElsewhereHint: string;\n confirmChangeCta: string;\n codeLabel: string;\n\n // provider linking\n linkRequiresSignIn: string;\n\n // oauth callback screen\n oauthCallbackTitle: string;\n oauthCallbackSub: string;\n oauthDenied: string;\n}\n\nexport const defaultMessages: SinglebaseAuthMessages = {\n signInTitle: \"Sign in\",\n signUpTitle: \"Create your account\",\n forgotTitle: \"Reset your password\",\n verifyTitle: \"Enter your code\",\n otpTitle: \"Sign in with a code\",\n newPassTitle: \"Choose a new password\",\n inviteTitle: \"You have been invited\",\n\n signInSubEmailAndOauth: \"Use your email or a connected provider.\",\n signInSubEmailOnly: \"Use your email address and password.\",\n signInSubOauthOnly: \"Continue with a connected provider.\",\n signUpSub: \"Free to start. No card required.\",\n forgotSub: \"We will email you a six-digit code to confirm it is you.\",\n otpSub: \"No password needed — we will email you a six-digit code.\",\n inviteSub: \"Set up your account to continue.\",\n\n signInCta: \"Sign in\",\n signUpCta: \"Create account\",\n forgotCta: \"Send code\",\n verifyCta: \"Verify code\",\n otpCta: \"Email me a code\",\n newPassCta: \"Save password\",\n inviteCta: \"Create account\",\n continueCta: \"Continue\",\n backCta: \"Back\",\n\n emailMethodTitle: \"Email\",\n emailMethodTitleSignUp: \"Email and password\",\n emailMethodMeta: \"Password or one-time code\",\n emailMethodMetaSignUp: \"Create with an address\",\n emailMethodMetaOtp: \"One-time code\",\n oauthMethodTitle: \"Single sign-on\",\n oauthMethodMeta: \"Google, GitHub, and more\",\n\n fullNameLabel: \"Full name\",\n fullNamePlaceholder: \"Ada Lovelace\",\n emailLabel: \"Email\",\n emailPlaceholder: \"you@company.com\",\n passwordLabel: \"Password\",\n passwordPlaceholder: \"••••••••\",\n newPasswordLabel: \"New password\",\n newPasswordPlaceholder: \"At least 10 characters\",\n confirmPasswordLabel: \"Confirm password\",\n confirmPasswordPlaceholder: \"Repeat it\",\n currentPasswordLabel: \"Current password\",\n firstNameLabel: \"First name\",\n firstNamePlaceholder: \"Ada\",\n lastNameLabel: \"Last name\",\n lastNamePlaceholder: \"Lovelace\",\n phoneLabel: \"Phone number\",\n phonePlaceholder: \"+1 (555) 000-0000\",\n invitedEmailLabel: \"Invited email\",\n\n forgotLink: \"Forgot?\",\n otpInsteadLink: \"Email me a one-time code instead\",\n footTextSignIn: \"New here?\",\n footActionSignIn: \"Create an account\",\n footTextSignUp: \"Already have an account?\",\n footActionSignUp: \"Sign in\",\n resendQuestion: \"Did not get it?\",\n resendCta: \"Resend code\",\n oauthPrimaryLabel: \"Continue with Google\",\n oauthContinueWith: \"Continue with\",\n\n blockedTitleDisabled: \"Sign-in is turned off\",\n blockedTitleUnavailable: \"Sign-in unavailable\",\n blockedBodyDisabled: \"Authentication is currently disabled for this application.\",\n blockedBodyUnavailable: \"No sign-in methods are enabled for this application.\",\n blockedHint: \"Contact the site owner if you think this is a mistake.\",\n\n signOutCta: \"Sign out\",\n addPhotoLink: \"Add photo\",\n changePhotoLink: \"Change\",\n photoUploading: \"Uploading…\",\n photoUpdated: \"Photo updated\",\n editingLabel: \"Editing\",\n uploadPhotoCta: \"Upload photo\",\n replacePhotoCta: \"Replace photo\",\n photoHint: \"PNG or JPG, up to 2 MB.\",\n doneCta: \"Done\",\n cancelCta: \"Cancel\",\n editAccountCta: \"Edit account\",\n saveChangesCta: \"Save changes\",\n emailChangeHint: \"We will send a verification link to the new address.\",\n passwordSectionTitle: \"Password\",\n passwordChangedHint: \"Last changed three months ago.\",\n changePasswordCta: \"Change password\",\n updatePasswordCta: \"Update password\",\n twoFaTitle: \"Two-factor authentication\",\n twoFaHintOff: \"Add a second step when signing in.\",\n twoFaHintOn: \"Enabled with an authenticator app.\",\n twoFaScanHint: \"Scan with your authenticator app, then enter the 6-digit code.\",\n connectedTitle: \"Connected accounts\",\n connectedHint: \"Sign in with any provider you connect here.\",\n addAnotherLabel: \"Add another\",\n disconnectCta: \"Disconnect\",\n notConnectedLabel: \"Not connected\",\n deleteAccountCta: \"Delete account\",\n deleteAccountConfirmCta: \"Permanently delete account\",\n deletePanelBody:\n \"This removes your profile, sessions and connected providers. It cannot be undone.\",\n deleteConfirmLabel: \"Type DELETE to confirm\",\n deleteConfirmPlaceholder: \"DELETE\",\n savedNote: \"Saved\",\n passwordUpdatedNote: \"Password updated\",\n\n changeEmailTitle: \"Email\",\n newEmailLabel: \"New email\",\n changeEmailCta: \"Send verification code\",\n changeUsernameTitle: \"Username\",\n newUsernameLabel: \"New username\",\n changeUsernameCta: \"Send verification code\",\n\n genericErrorMessage: \"Something went wrong. Please try again.\",\n rateLimitedMessage: \"Too many attempts. Try again in 5 minutes or reset your password.\",\n codeSentNeutral: \"If an eligible account exists, a code has been sent.\",\n invalidEmailError: \"Enter a valid email address.\",\n requiredError: \"This cannot be empty.\",\n passwordMinError: \"Use at least 10 characters.\",\n passwordMatchError: \"Both passwords must match.\",\n codeIncompleteError: \"Enter all six digits.\",\n invalidPhoneError: \"Enter a valid phone number.\",\n notYetSupported: \"Not yet supported\",\n\n alreadySignedInTitle: \"You are already signed in\",\n alreadySignedInSub: \"Continue where you left off, or sign out to use another account.\",\n alreadySignedInSubPrefix: \"Signed in as\",\n continueHint: \"Continuing takes you to your account.\",\n\n consentPrefix: \"By continuing you agree to our\",\n consentJoin: \"and\",\n termsLabel: \"Terms\",\n privacyLabel: \"Privacy Policy\",\n\n emailUnchangedError: \"That is already your email address.\",\n emailUpdatedNote: \"Email updated\",\n changeEmailCtaShort: \"Change email\",\n changeEmailHint: \"We will send a code to your current address to confirm it is you.\",\n changeEmailConfirmHint: \"Enter the code we sent, and your email becomes\",\n changeEmailElsewhereHint: \"Your email is changed below, with a verification step.\",\n confirmChangeCta: \"Confirm change\",\n codeLabel: \"Verification code\",\n linkRequiresSignIn: \"Sign in first, then link a provider.\",\n\n oauthCallbackTitle: \"Finishing sign-in\",\n oauthCallbackSub: \"One moment while we complete your sign-in.\",\n oauthDenied: \"Sign-in was cancelled or denied.\"\n};\n\nexport function resolveMessages(\n overrides?: Partial<SinglebaseAuthMessages>\n): SinglebaseAuthMessages {\n return overrides ? { ...defaultMessages, ...overrides } : defaultMessages;\n}\n","import { LitElement, type PropertyValues } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport {\n AUTHUI_PROP_KEYS,\n authUIAttributeFor,\n getDefaultClient,\n type AuthUIConfig\n} from \"@singlebase/core\";\nimport type { AuthClient, UserProfile } from \"@singlebase/singlebase-sdk\";\nimport { AuthController } from \"../controllers/auth-controller.js\";\nimport { tokenDefaults } from \"../styles/tokens.js\";\nimport { sharedStyles } from \"../styles/shared.js\";\nimport { defaultMessages, resolveMessages, type SinglebaseAuthMessages } from \"../messages.js\";\n\n/**\n * Base class for every singlebase-* element: resolves an AuthClient, exposes\n * .messages overrides, and gives subclasses a live AuthController bound to\n * whichever client won.\n */\nexport abstract class SinglebaseElementBase extends LitElement {\n static styles = [tokenDefaults, sharedStyles];\n\n @property({ attribute: false })\n accessor client: AuthClient | null = null;\n\n @property({ attribute: false })\n accessor messages: Partial<SinglebaseAuthMessages> = {};\n\n /**\n * theme/density/field-style are plain reflected attributes so a composing\n * parent can forward them verbatim to the singlebase-* children it renders.\n * CSS custom properties inherit through shadow boundaries on their own,\n * but an *attribute* selector like :host([theme=\"dark\"]) only matches\n * the element that actually carries the attribute, so it must be\n * explicitly propagated down the composition tree.\n */\n @property({ reflect: true })\n accessor theme: \"light\" | \"dark\" | undefined = undefined;\n\n @property({ reflect: true })\n accessor density: \"comfortable\" | \"compact\" | undefined = undefined;\n\n /**\n * Input chrome: boxed (default) or a single bottom rule. Reflected for the\n * same reason as theme/density — the CSS is an attribute selector.\n */\n @property({ reflect: true, attribute: \"field-style\" })\n accessor fieldStyle: \"outline\" | \"underline\" | undefined = undefined;\n\n /** Corner preset for this element: `sharp`, `default` or `round`. */\n @property({ reflect: true })\n accessor radius: \"sharp\" | \"default\" | \"round\" | undefined = undefined;\n\n protected auth = new AuthController(this);\n\n /**\n * Resolution order: an explicit `.client`, then the page's default\n * SinglebaseClient()'s auth.\n *\n * That fallback is what lets several widgets sit on one page — a header\n * sign-in, a modal, an account panel — and share one session with no\n * wiring, since SinglebaseClient() is cached per project. A page talking to\n * two projects sets `.client` on the widgets belonging to the second.\n *\n * Reading `.auth` is also what *constructs* auth: a page that only drops\n * in a widget initializes it with no bootstrap code at all.\n */\n get resolvedClient(): AuthClient | null {\n if (this.client) return this.client;\n return getDefaultClient<{ auth: AuthClient }>()?.auth ?? null;\n }\n\n /** Page-wide UI config from SinglebaseClient({ authui }), if there is one. */\n get uiConfig(): AuthUIConfig | null {\n return this.resolvedClient?.authui ?? null;\n }\n\n /**\n * Config messages sit *under* the element's own, so a page-wide translation\n * can be overridden per widget without repeating the whole bag.\n */\n get msg(): SinglebaseAuthMessages {\n const shared = this.uiConfig?.messages;\n return resolveMessages(shared ? { ...shared, ...this.messages } : this.messages);\n }\n\n /** Config keys already applied, so a later render does not fight the host. */\n private appliedConfig = new Set<string>();\n\n /**\n * Copies the page-wide config onto this element.\n *\n * An attribute present in markup always wins — that is the whole precedence\n * rule, and it is checked per key rather than wholesale, so a widget can\n * override one thing and inherit the rest. Keys the element does not have\n * are skipped, which is how one config can serve every singlebase-authui-*\n * element without any of them knowing about the others.\n */\n protected applyUIConfig(): void {\n const config = this.uiConfig;\n if (!config) return;\n\n for (const key of AUTHUI_PROP_KEYS) {\n const value = config[key];\n if (value === undefined) continue;\n if (!(key in this)) continue;\n if (this.hasAttribute(authUIAttributeFor(key))) continue;\n if (this.appliedConfig.has(key)) continue;\n\n this.appliedConfig.add(key);\n (this as unknown as Record<string, unknown>)[key] = value;\n }\n\n for (const [name, value] of Object.entries(config.tokens ?? {})) {\n if (!name.startsWith(\"--\")) continue;\n // Anything already set inline came from the host and stays.\n if (this.style.getPropertyValue(name)) continue;\n this.style.setProperty(name, value);\n }\n }\n\n // ── public API mirrored from the client, for host/SPA code ──\n isAuthenticated(): boolean {\n return this.resolvedClient?.isAuthenticated() ?? false;\n }\n\n getUser(): UserProfile | null {\n return this.resolvedClient?.getUser() ?? null;\n }\n\n async refreshSession() {\n return this.resolvedClient?.refreshSession();\n }\n\n async logout(): Promise<void> {\n await this.resolvedClient?.logout();\n }\n\n override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n this.auth.bind(this.resolvedClient);\n this.applyUIConfig();\n }\n}\n\nexport { defaultMessages };\n","/**\n * Resolves a post-login destination, or null when there isn't a safe one.\n *\n * The candidate usually comes from a `?redirect=` parameter, which is\n * attacker-controllable: anyone can send a victim a link to your own login\n * page carrying `?redirect=https://evil.example`. If the widget followed it,\n * the victim would sign in on a page they trust and then be handed to a site\n * they don't — a textbook open redirect, and a convincing one precisely\n * because the login step was genuine.\n *\n * So the rule is same-origin only. Relative paths resolve against the current\n * page; anything landing on another origin is refused, and the caller is told\n * why rather than left wondering where the redirect went.\n */\nexport function resolveRedirectTarget(\n candidate: string | null | undefined,\n currentHref: string | null | undefined,\n onRefused?: (reason: string) => void\n): string | null {\n if (!candidate || !currentHref) return null;\n\n let here: URL;\n try {\n here = new URL(currentHref);\n } catch {\n return null;\n }\n\n let target: URL;\n try {\n target = new URL(candidate, here.href);\n } catch {\n onRefused?.(`\"${candidate}\" is not a valid URL`);\n return null;\n }\n\n // Only ever http(s). A `javascript:` or `data:` candidate resolves to a URL\n // object quite happily, and assigning it would execute script.\n if (target.protocol !== \"http:\" && target.protocol !== \"https:\") {\n onRefused?.(`refusing redirect to unsupported scheme \"${target.protocol}\"`);\n return null;\n }\n\n if (target.origin !== here.origin) {\n onRefused?.(`refusing cross-origin redirect to ${target.origin}; same-origin only`);\n return null;\n }\n\n // Already there — redirecting would just reload, and can loop.\n if (target.href === here.href) return null;\n\n return target.href;\n}\n","import type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport type { AuthClient, AuthSettings } from \"@singlebase/singlebase-sdk\";\n\n/**\n * Loads auth.settings once per bound client and caches it, so composing\n * many form elements inside <singlebase-authui> doesn't mean many redundant\n * auth.settings calls. Each element may also be given .settings directly\n * (e.g. by a parent that already loaded them) to skip the fetch entirely.\n */\nexport class SettingsController implements ReactiveController {\n private host: ReactiveControllerHost;\n private client: AuthClient | null = null;\n private cache = new WeakMap<AuthClient, Promise<AuthSettings>>();\n settings: AuthSettings | null = null;\n error: unknown = null;\n\n constructor(host: ReactiveControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n hostConnected(): void {}\n\n load(client: AuthClient | null, override?: AuthSettings | null): void {\n if (override) {\n this.settings = override;\n return;\n }\n if (!client || client === this.client) return;\n this.client = client;\n let pending = this.cache.get(client);\n if (!pending) {\n pending = client.getSettings();\n this.cache.set(client, pending);\n }\n pending\n .then((settings) => {\n this.settings = settings;\n this.error = null;\n this.host.requestUpdate();\n })\n .catch((error) => {\n this.error = error;\n this.host.requestUpdate();\n });\n }\n}\n","import type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport type { AuthClient, AuthEventName } from \"@singlebase/singlebase-sdk\";\n\nexport const BRIDGED_EVENTS = [\n \"load\",\n \"success\",\n \"error\",\n \"signin\",\n \"signup\",\n \"signout\",\n \"session\",\n \"account-updated\",\n \"password-change\",\n \"email-change\",\n \"username-change\",\n \"expired\",\n \"navigate\",\n \"goto\"\n] as const satisfies readonly AuthEventName[];\n\n/**\n * The auth API's event names mapped onto the\n * friendlier ones. Both are dispatched so either style works.\n */\nconst SPEC_ALIASES: Partial<Record<AuthEventName, string>> = {\n load: \"auth:ready\",\n signin: \"auth:signin\",\n signup: \"auth:signup\",\n session: \"auth:session\",\n \"account-updated\": \"auth:profile-update\",\n signout: \"auth:signout\",\n error: \"auth:error\",\n navigate: \"auth:navigate\"\n};\n\n/** \"account-updated\" -> \"onAccountUpdated\" */\nexport function callbackPropFor(event: string): string {\n return \"on\" + event.replace(/(^|-)([a-z])/g, (_, __, c: string) => c.toUpperCase());\n}\n\n/**\n * Re-publishes core auth events on the host element in the two ways host\n * apps actually consume them:\n *\n * - a DOM CustomEvent (`singlebase-signin`, and the spec's `auth:signin`),\n * bubbling and composed so `document.addEventListener` works;\n * - a callback property (`el.onSignin = fn`), since HTML attributes cannot\n * carry functions.\n *\n * Event details never include tokens — consumers read the session through\n * the client, per the spec's events rule.\n */\nexport class EventBridge implements ReactiveController {\n private unsubscribes: Array<() => void> = [];\n private client: AuthClient | null = null;\n\n constructor(private host: ReactiveControllerHost & HTMLElement) {\n host.addController(this);\n }\n\n bind(client: AuthClient | null): void {\n if (client === this.client) return;\n this.release();\n this.client = client;\n if (!client) return;\n\n this.unsubscribes = BRIDGED_EVENTS.map((event) =>\n client.on(event, (detail: unknown) => this.publish(event, detail))\n );\n }\n\n private publish(event: string, detail: unknown) {\n const callback = (this.host as unknown as Record<string, unknown>)[callbackPropFor(event)];\n if (typeof callback === \"function\") {\n try {\n (callback as (d: unknown) => void).call(this.host, detail);\n } catch (error) {\n console.error(`[singlebase] ${callbackPropFor(event)} threw:`, error);\n }\n }\n\n const init: CustomEventInit = { detail, bubbles: true, composed: true };\n this.host.dispatchEvent(new CustomEvent(`singlebase-${event}`, init));\n const alias = SPEC_ALIASES[event as AuthEventName];\n if (alias) this.host.dispatchEvent(new CustomEvent(alias, init));\n }\n\n private release() {\n this.unsubscribes.forEach((off) => off());\n this.unsubscribes = [];\n }\n\n hostDisconnected(): void {\n this.release();\n this.client = null;\n }\n}\n","import { css } from \"lit\";\n\n/**\n * The \"… by Singlebase\" credit, identical in every element: same font, size,\n * spacing and hover. Each element only decides where it sits.\n */\nexport const brandingStyles = css`\n .branding {\n text-align: center;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 10.5px;\n line-height: 1.4;\n letter-spacing: 0.06em;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .branding a {\n color: inherit;\n text-decoration: none;\n }\n\n .branding a:hover {\n color: var(--sb-ink, #16181a);\n text-decoration: underline;\n text-underline-offset: 3px;\n }\n`;\n","import { html, nothing } from \"lit\";\n\nexport const BRANDING_URL = \"https://singlebase.io\";\nexport const BRANDING_TITLE = \"Singlebase.io\";\n\n/**\n * The fixed \"… by Singlebase\" credit. It can be hidden, never changed.\n * It's a plain link: it makes no request until someone clicks it.\n */\nexport function renderBranding(show: boolean, product: \"Auth\" | \"Chat\" | \"Files\") {\n if (!show) return nothing;\n return html`<div class=\"branding\" part=\"branding\">\n <a href=${BRANDING_URL} title=${BRANDING_TITLE} target=\"_blank\" rel=\"noopener noreferrer\"\n >${product} by Singlebase</a\n >\n </div>`;\n}\n","import { html } from \"lit\";\nimport { state } from \"lit/decorators.js\";\nimport { SinglebaseAuthError, mapErrorToHint } from \"@singlebase/singlebase-sdk\";\nimport { SinglebaseElementBase } from \"./authui-base.js\";\n\nexport type FormPhase = \"idle\" | \"submitting\" | \"success\" | \"error\";\n\n/**\n * Adds the spec's required cross-cutting form behavior to SinglebaseElementBase:\n * idle/submitting/success/error phase, a form-level error message, disabled\n * controls while submitting, an aria-live status region, and cancellation of\n * in-flight work on disconnect.\n */\nexport abstract class SinglebaseFormBase extends SinglebaseElementBase {\n @state()\n protected accessor phase: FormPhase = \"idle\";\n\n @state()\n protected accessor formError = \"\";\n\n @state()\n protected accessor noticeMessage = \"\";\n\n protected abortController: AbortController | null = null;\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.abortController?.abort();\n }\n\n protected get signal(): AbortSignal {\n this.abortController?.abort();\n this.abortController = new AbortController();\n return this.abortController.signal;\n }\n\n /** Runs task, tracking idle→submitting→success/error and mapping errors to a message. */\n protected async run(task: () => Promise<void>): Promise<void> {\n this.phase = \"submitting\";\n this.formError = \"\";\n try {\n await task();\n this.phase = \"success\";\n } catch (error) {\n if (this.isAbortError(error)) return;\n this.phase = \"error\";\n this.formError = this.describeError(error);\n }\n }\n\n private isAbortError(error: unknown): boolean {\n return error instanceof DOMException && error.name === \"AbortError\";\n }\n\n protected describeError(error: unknown): string {\n if (error instanceof SinglebaseAuthError) {\n const hint = mapErrorToHint(error.code);\n if (hint === \"disable_retry_show_rate_limited\") return this.msg.rateLimitedMessage;\n if (hint === \"generic_credentials_message\") return this.msg.genericErrorMessage;\n return this.msg.genericErrorMessage;\n }\n return this.msg.genericErrorMessage;\n }\n\n protected get submitting(): boolean {\n return this.phase === \"submitting\";\n }\n\n /** aria-live region for async status — spec requires one per form. */\n protected renderStatus() {\n return html`\n <div\n role=\"status\"\n aria-live=\"polite\"\n style=\"position:absolute;width:1px;height:1px;overflow:hidden;\"\n >\n ${this.phase === \"submitting\" ? \"Submitting…\" : \"\"}\n ${this.phase === \"success\" ? \"Done.\" : \"\"}\n </div>\n ${this.formError ? html`<p class=\"banner\" role=\"alert\">${this.formError}</p>` : null}\n ${this.noticeMessage ? html`<p class=\"notice\" role=\"status\">${this.noticeMessage}</p>` : null}\n `;\n }\n}\n","import type { UserProfile } from \"@singlebase/singlebase-sdk\";\n\n/** \"Ada Lovelace\", or \"\" when the profile carries no name at all. */\nexport function fullNameOf(user: Pick<UserProfile, \"first_name\" | \"last_name\"> | null): string {\n return [user?.first_name, user?.last_name].filter(Boolean).join(\" \").trim();\n}\n\n/**\n * Two-letter avatar initials. Falls back to the email's first letter, then to\n * a neutral glyph, so the avatar is never blank for a profile that only has\n * an address.\n */\nexport function initialsOf(\n user: Pick<UserProfile, \"first_name\" | \"last_name\" | \"email\"> | null\n): string {\n const name = fullNameOf(user);\n if (name) {\n return name\n .split(/\\s+/)\n .map((word) => word[0])\n .join(\"\")\n .slice(0, 2)\n .toUpperCase();\n }\n const email = user?.email ?? \"\";\n return email ? email[0]!.toUpperCase() : \"·\";\n}\n","/**\n * Default copy for <singlebase-uploader>. Same shape and contract as the\n * auth bag in messages.ts: a flat set of strings, overridable in whole or in\n * part through the element's `.messages` property.\n *\n * `{n}`, `{max}`, `{name}` and `{size}` are filled in by `fill()`.\n */\nexport interface SinglebaseUploadMessages {\n heading: string;\n description: string;\n\n // dropzone\n dropTitle: string;\n dropSub: string;\n hintUpTo: string;\n\n // controls\n chooseFiles: string;\n chooseFile: string;\n addMore: string;\n remove: string;\n rename: string;\n retry: string;\n uploadCtaOne: string;\n uploadCtaMany: string;\n\n // compact view\n attachments: string;\n dropOrChoose: string;\n\n // status\n checking: string;\n pagesLabel: string;\n countOne: string;\n countMany: string;\n uploading: string;\n uploaded: string;\n failedLabel: string;\n\n // problems\n errTooMany: string;\n errTooLarge: string;\n errTooSmall: string;\n errDuplicate: string;\n errType: string;\n errNoClient: string;\n errUpload: string;\n errProtected: string;\n errTooManyPages: string;\n}\n\nexport const defaultUploadMessages: SinglebaseUploadMessages = {\n heading: \"Upload files\",\n description: \"Add one or more files. You can review the list before uploading.\",\n\n dropTitle: \"Drag and drop files here\",\n dropSub: \"or browse from your device\",\n hintUpTo: \"up to {size} each\",\n\n chooseFiles: \"Choose files\",\n chooseFile: \"Choose file\",\n addMore: \"+ Add more files\",\n remove: \"Remove\",\n rename: \"Rename\",\n retry: \"Retry\",\n uploadCtaOne: \"Upload {n} file\",\n uploadCtaMany: \"Upload {n} files\",\n\n attachments: \"Attachments\",\n dropOrChoose: \"Drop files or choose\",\n\n checking: \"Checking…\",\n pagesLabel: \"{n} pages\",\n countOne: \"{n} file of {max}\",\n countMany: \"{n} files of {max}\",\n uploading: \"Uploading…\",\n uploaded: \"Uploaded\",\n failedLabel: \"Failed\",\n\n errTooMany: \"You can upload up to {max} files.\",\n errTooLarge: \"{name} is larger than {size}.\",\n errTooSmall: \"{name} is smaller than {size}.\",\n errDuplicate: \"{name} is already in the list.\",\n errType: \"{name} isn't an accepted file type.\",\n errNoClient: \"No Singlebase client found on this page.\",\n errUpload: \"Upload failed.\",\n errProtected: \"{name} is password protected.\",\n errTooManyPages: \"{name} has {pages} pages; the limit is {max}.\"\n};\n\nexport function resolveUploadMessages(\n overrides?: Partial<SinglebaseUploadMessages>\n): SinglebaseUploadMessages {\n return overrides ? { ...defaultUploadMessages, ...overrides } : defaultUploadMessages;\n}\n\n/** Fills `{token}` placeholders. Values are plain text and rendered as text. */\nexport function fill(template: string, values: Record<string, string | number>): string {\n return template.replace(/\\{(\\w+)\\}/g, (match, key) =>\n key in values ? String(values[key]) : match\n );\n}\n","/**\n * Small pure helpers for <singlebase-uploader>: parsing and printing\n * sizes, matching an `accept` list, and the identity a duplicate is judged by.\n * Kept out of the element so they can be tested without a DOM.\n */\n\nconst UNITS: Record<string, number> = {\n b: 1,\n kb: 1024,\n mb: 1024 * 1024,\n gb: 1024 * 1024 * 1024\n};\n\n/** \"25MB\" / \"500 kb\" / \"1048576\" → bytes. 0 means \"no limit\". */\nexport function parseSize(value: string | number | null | undefined): number {\n if (typeof value === \"number\") return value > 0 ? value : 0;\n if (!value) return 0;\n const match = String(value)\n .trim()\n .toLowerCase()\n .match(/^([\\d.]+)\\s*(b|kb|mb|gb)?$/);\n if (!match) return 0;\n const amount = Number.parseFloat(match[1]);\n if (!Number.isFinite(amount) || amount <= 0) return 0;\n return Math.round(amount * (UNITS[match[2] ?? \"b\"] ?? 1));\n}\n\nexport function formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n\n/** The extension in lowercase, without the dot. \"\" when there is none. */\nexport function fileExtension(filename: string): string {\n const dot = filename.lastIndexOf(\".\");\n if (dot <= 0 || dot === filename.length - 1) return \"\";\n return filename.slice(dot + 1).toLowerCase();\n}\n\n/** The extension, uppercased and clipped, for the little type chip. */\nexport function extensionOf(filename: string): string {\n return fileExtension(filename).toUpperCase().slice(0, 4);\n}\n\n/**\n * Matches one file against an `accept` list, using the same vocabulary as the\n * attribute on `<input type=\"file\">`: extensions (\".pdf\"), exact MIME types\n * (\"application/pdf\") and wildcards (\"image/*\"). An empty list accepts\n * everything.\n *\n * This is a convenience, not a security control — the browser's own file\n * dialog filter and this check are both trivially bypassed by a drop, so the\n * server remains the authority on what it will store.\n */\nexport function acceptsFile(accept: string, name: string, type: string): boolean {\n const rules = accept\n .split(\",\")\n .map((rule) => rule.trim().toLowerCase())\n .filter(Boolean);\n if (!rules.length) return true;\n\n const lowerName = name.toLowerCase();\n const lowerType = (type || \"\").toLowerCase();\n\n return rules.some((rule) => {\n if (rule.startsWith(\".\")) return lowerName.endsWith(rule);\n if (rule.endsWith(\"/*\")) return lowerType.startsWith(rule.slice(0, -1));\n return lowerType === rule;\n });\n}\n\n/** Human list of accepted kinds for the hint line: \".pdf,image/png\" → \"PDF, PNG\". */\nexport function acceptSummary(accept: string): string {\n const parts = accept\n .split(\",\")\n .map((rule) => rule.trim())\n .filter(Boolean)\n .map((rule) => {\n if (rule.startsWith(\".\")) return rule.slice(1).toUpperCase();\n if (rule.endsWith(\"/*\")) return rule.slice(0, -2).toUpperCase();\n const slash = rule.indexOf(\"/\");\n return (slash >= 0 ? rule.slice(slash + 1) : rule).toUpperCase();\n });\n return [...new Set(parts)].join(\", \");\n}\n\n/**\n * Two picks are the same file when name, size and mtime all match. Content\n * hashing would be exact but means reading every byte before the user has\n * even pressed upload; this is what a file manager uses, and it is enough to\n * stop the common case of dropping the same batch twice.\n */\nexport function fileKey(file: { name: string; size: number; lastModified?: number }): string {\n return `${file.name}:${file.size}:${file.lastModified ?? 0}`;\n}\n\n/** Replaces the base name, keeping the original extension. */\nexport function renameKeepingExtension(original: string, typed: string): string {\n const clean = typed.trim().replace(/[/\\\\]/g, \"\");\n if (!clean) return original;\n const dot = original.lastIndexOf(\".\");\n const extension = dot > 0 ? original.slice(dot) : \"\";\n if (!extension) return clean;\n return clean.toLowerCase().endsWith(extension.toLowerCase()) ? clean : clean + extension;\n}\n","/**\n * Reads a few facts out of a file before it is uploaded: how many pages it\n * has, and whether it is encrypted. Everything here runs in the browser on\n * the bytes the user picked — no upload, no dependency, no worker.\n *\n * Two honest caveats, both of which the documentation repeats:\n *\n * - **This is a convenience, not a security control.** Anyone can bypass it.\n * The server still has to enforce whatever actually matters.\n * - **Facts can be unknown.** A page count is `null` when the structure\n * can't be read, and callers treat unknown as \"rule doesn't apply\" rather\n * than rejecting a file they simply failed to parse.\n */\n\nexport interface FileFacts {\n /** Pages for PDF and DOCX, slides for PPTX. Null when undeterminable. */\n pages: number | null;\n /** True when encrypted, false when plainly not, null when unknown. */\n encrypted: boolean | null;\n}\n\nconst UNKNOWN: FileFacts = { pages: null, encrypted: null };\n\n/** How much of a large PDF to look at, from each end. */\nconst PDF_HEAD = 16 * 1024 * 1024;\nconst PDF_TAIL = 2 * 1024 * 1024;\n\n/** Ceilings for the compressed-PDF fallback, so a hostile file can't stall the tab. */\nconst MAX_STREAMS = 40;\nconst MAX_INFLATED = 4 * 1024 * 1024;\n\nconst OOXML = new Set([\"docx\", \"pptx\", \"xlsx\"]);\n\n/** Inspects one file. Never throws — an unreadable file is simply unknown. */\nexport async function inspectFile(file: Blob, extension: string): Promise<FileFacts> {\n try {\n if (extension === \"pdf\") return await inspectPdf(file);\n if (OOXML.has(extension)) return await inspectOoxml(file, extension);\n } catch {\n // A corrupt or surprising file is not a rejection reason on its own.\n }\n return UNKNOWN;\n}\n\n/** True when this extension has anything worth reading bytes for. */\nexport function isInspectable(extension: string): boolean {\n return extension === \"pdf\" || OOXML.has(extension);\n}\n\n// ── PDF ──────────────────────────────────────────────────────\n\nasync function inspectPdf(file: Blob): Promise<FileFacts> {\n const head = await bytesOf(file.slice(0, PDF_HEAD));\n const tail =\n file.size > PDF_HEAD ? await bytesOf(file.slice(Math.max(0, file.size - PDF_TAIL))) : null;\n\n const text = latin1(head) + (tail ? latin1(tail) : \"\");\n\n // An encrypted PDF names /Encrypt in its trailer. The whole file is still\n // readable — it is the content streams that are encrypted — so this is a\n // reliable marker rather than a guess.\n const encrypted = /\\/Encrypt[\\s/<>\\]]/.test(text);\n\n let pages = pageCountIn(text);\n if (pages === null) pages = await pageCountInStreams(head);\n\n return { pages, encrypted };\n}\n\n/**\n * The page tree's root node carries `/Count` with the document total, so the\n * largest `/Count` next to a `/Pages` node is the answer. Files that write\n * the tree without counts fall back to counting `/Type /Page` objects.\n */\nfunction pageCountIn(text: string): number | null {\n if (/\\/Type\\s*\\/Pages/.test(text)) {\n let max = 0;\n for (const match of text.matchAll(/\\/Count\\s+(\\d+)/g)) {\n max = Math.max(max, Number(match[1]));\n }\n if (max > 0) return max;\n }\n const direct = text.match(/\\/Type\\s*\\/Page[^s]/g);\n return direct?.length ? direct.length : null;\n}\n\n/**\n * PDF 1.5 and later may pack the page tree into compressed object streams,\n * where a plain scan sees nothing. Inflating the streams and scanning the\n * result recovers the count, using only DecompressionStream.\n */\nasync function pageCountInStreams(bytes: Uint8Array): Promise<number | null> {\n if (typeof DecompressionStream === \"undefined\") return null;\n\n const text = latin1(bytes);\n let inflated = \"\";\n let streams = 0;\n\n for (const match of text.matchAll(/stream\\r?\\n/g)) {\n if (streams >= MAX_STREAMS || inflated.length >= MAX_INFLATED) break;\n const start = match.index! + match[0].length;\n let end = text.indexOf(\"endstream\", start);\n if (end < 0) break;\n // Writers put an EOL between the data and the keyword. It has to come off:\n // the decompressor rejects anything trailing the compressed data.\n while (end > start && (text[end - 1] === \"\\n\" || text[end - 1] === \"\\r\")) end -= 1;\n streams += 1;\n try {\n const out = await inflate(bytes.subarray(start, end), \"deflate\");\n inflated += latin1(out);\n } catch {\n // Not a zlib stream (an image, or a different filter). Skip it.\n }\n }\n\n return inflated ? pageCountIn(inflated) : null;\n}\n\n// ── OOXML (docx / pptx / xlsx) ───────────────────────────────\n\nasync function inspectOoxml(file: Blob, extension: string): Promise<FileFacts> {\n const magic = await bytesOf(file.slice(0, 8));\n\n // A password-protected Office file is not a zip at all: Office encrypts the\n // package and wraps it in an OLE compound file. The magic bytes say so\n // outright, which makes this the one exact check in this module.\n if (isCompoundFile(magic)) return { pages: null, encrypted: true };\n if (magic[0] !== 0x50 || magic[1] !== 0x4b) return UNKNOWN;\n\n const app = await readZipEntry(file, \"docProps/app.xml\");\n if (!app) return { pages: null, encrypted: false };\n\n // Word records Pages, PowerPoint records Slides. Excel records neither.\n const tag = extension === \"pptx\" ? \"Slides\" : \"Pages\";\n const match = new TextDecoder().decode(app).match(new RegExp(`<${tag}>(\\\\d+)</${tag}>`));\n return { pages: match ? Number(match[1]) : null, encrypted: false };\n}\n\nfunction isCompoundFile(magic: Uint8Array): boolean {\n const SIGNATURE = [0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1];\n return SIGNATURE.every((byte, i) => magic[i] === byte);\n}\n\n/**\n * Pulls one entry out of a zip by walking the central directory. Enough of\n * the format to find a small known file, and no more: zip64 archives return\n * null, which reads as \"unknown\" upstream.\n */\nasync function readZipEntry(file: Blob, wanted: string): Promise<Uint8Array | null> {\n const tailSize = Math.min(file.size, 66_000);\n const tail = new DataView(await file.slice(file.size - tailSize).arrayBuffer());\n\n let eocd = -1;\n for (let i = tail.byteLength - 22; i >= 0; i--) {\n if (tail.getUint32(i, true) === 0x06054b50) {\n eocd = i;\n break;\n }\n }\n if (eocd < 0) return null;\n\n const size = tail.getUint32(eocd + 12, true);\n const offset = tail.getUint32(eocd + 16, true);\n if (!size || offset === 0xffffffff) return null;\n\n const cd = new DataView(await file.slice(offset, offset + size).arrayBuffer());\n const decoder = new TextDecoder();\n let p = 0;\n\n while (p + 46 <= cd.byteLength && cd.getUint32(p, true) === 0x02014b50) {\n const method = cd.getUint16(p + 10, true);\n const compressed = cd.getUint32(p + 20, true);\n const nameLength = cd.getUint16(p + 28, true);\n const extraLength = cd.getUint16(p + 30, true);\n const commentLength = cd.getUint16(p + 32, true);\n const localOffset = cd.getUint32(p + 42, true);\n const name = decoder.decode(new Uint8Array(cd.buffer, cd.byteOffset + p + 46, nameLength));\n\n if (name === wanted) {\n // The central directory's name/extra lengths may differ from the local\n // header's, so the data offset has to come from the local header.\n const local = new DataView(await file.slice(localOffset, localOffset + 30).arrayBuffer());\n const start = localOffset + 30 + local.getUint16(26, true) + local.getUint16(28, true);\n const data = await bytesOf(file.slice(start, start + compressed));\n if (method === 0) return data;\n if (method === 8 && typeof DecompressionStream !== \"undefined\") {\n return await inflate(data, \"deflate-raw\");\n }\n return null;\n }\n\n p += 46 + nameLength + extraLength + commentLength;\n }\n return null;\n}\n\n// ── plumbing ─────────────────────────────────────────────────\n\nasync function bytesOf(blob: Blob): Promise<Uint8Array> {\n return new Uint8Array(await blob.arrayBuffer());\n}\n\nasync function inflate(data: Uint8Array, format: \"deflate\" | \"deflate-raw\"): Promise<Uint8Array> {\n const stream = new Blob([data as BlobPart]).stream().pipeThrough(new DecompressionStream(format));\n return new Uint8Array(await new Response(stream).arrayBuffer());\n}\n\n/** Bytes as one char each, so PDF structure can be matched with a regex. */\nfunction latin1(bytes: Uint8Array): string {\n let out = \"\";\n const CHUNK = 32_768;\n for (let i = 0; i < bytes.length; i += CHUNK) {\n out += String.fromCharCode(...bytes.subarray(i, i + CHUNK));\n }\n return out;\n}\n","import { LitElement, css, html, nothing } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { getDefaultClient } from \"@singlebase/core\";\nimport type {\n FileUploadInput,\n FilesUploadApi,\n SinglebaseClientInstance,\n UploadProgress\n} from \"@singlebase/singlebase-sdk\";\n\n/** What the uploader needs from a client: `files.upload`, and nothing else. */\nexport type UploaderClient = { files: Pick<FilesUploadApi, \"upload\"> };\nimport { tokenDefaults } from \"../styles/tokens.js\";\nimport { sharedStyles } from \"../styles/shared.js\";\nimport { brandingStyles } from \"../styles/branding.js\";\nimport { renderBranding } from \"../utils/branding.js\";\nimport { fill, resolveUploadMessages, type SinglebaseUploadMessages } from \"../upload-messages.js\";\nimport { resolveRedirectTarget } from \"../utils/redirect.js\";\nimport {\n acceptSummary,\n acceptsFile,\n extensionOf,\n fileExtension,\n fileKey,\n formatSize,\n parseSize,\n renameKeepingExtension\n} from \"../utils/files.js\";\nimport { inspectFile, isInspectable } from \"../utils/inspect.js\";\n\n/** JSON in markup, an object in JavaScript. Bad JSON is ignored, not thrown. */\nconst jsonAttr = {\n fromAttribute: (value: string | null) => {\n if (!value) return {};\n try {\n const parsed = JSON.parse(value);\n return parsed && typeof parsed === \"object\" ? parsed : {};\n } catch {\n console.warn(\"[singlebase-uploader] an attribute holds invalid JSON; ignoring it\");\n return {};\n }\n },\n toAttribute: (value: unknown) => JSON.stringify(value ?? {})\n};\n\n/** Present-but-empty means true, so `dropzone` and `dropzone=\"false\"` both read. */\nconst flagAttr = {\n fromAttribute: (value: string | null) => (value === null ? true : value !== \"false\"),\n toAttribute: (value: boolean) => (value ? null : \"false\")\n};\n\nexport type UploadView = \"full\" | \"compact\" | \"button\";\nexport type UploadItemStatus = \"checking\" | \"ready\" | \"uploading\" | \"done\" | \"error\";\n\n/**\n * Per-format limits, keyed by extension: `{ pdf: { maxPages: 10 } }`.\n *\n * `maxPages` and `allowProtected` need the file's bytes read, which only\n * works for `pdf`, `docx`, `pptx` and `xlsx`; the size bounds apply to any\n * extension and override the element-wide ones for that kind.\n */\nexport interface FileRule {\n maxPages?: number;\n maxSize?: string | number;\n minSize?: string | number;\n /** Set false to refuse password-protected files. Default: allowed. */\n allowProtected?: boolean;\n}\n\nexport type FileRules = Record<string, FileRule>;\n\nexport interface UploadItem {\n /** Identity for de-duplication: name, size and mtime. */\n key: string;\n file: File;\n /** The saved name, which the user may have edited. */\n name: string;\n status: UploadItemStatus;\n percent: number;\n error: string;\n /** The stored file record, once the upload completes. */\n record: unknown;\n /** Pages (slides for pptx) when they could be read, else null. */\n pages: number | null;\n /** Whether the file is encrypted, when that could be determined. */\n encrypted: boolean | null;\n /** A local object URL for image thumbnails; \"\" for everything else. */\n preview: string;\n}\n\n/**\n * Every setting in one object, for configuring an element from script. Keys\n * are the element's property names.\n */\nexport interface UploaderConfig {\n view: UploadView;\n dropzone: boolean;\n allowRename: boolean;\n autoUpload: boolean;\n branding: boolean;\n logoUrl: string;\n logoText: string;\n heading: string;\n description: string;\n maxFiles: number;\n maxSize: string | number;\n minSize: string | number;\n accept: string;\n rules: FileRules;\n bucket: string;\n publicRead: boolean;\n redirectUrl: string;\n metadata: Record<string, unknown>;\n options: Record<string, unknown>;\n messages: Partial<SinglebaseUploadMessages>;\n theme: \"light\" | \"dark\";\n density: \"comfortable\" | \"compact\";\n radius: \"sharp\" | \"default\" | \"round\";\n onComplete: SinglebaseUploader[\"onComplete\"];\n onError: SinglebaseUploader[\"onError\"];\n}\n\nconst CONFIG_KEYS: readonly (keyof UploaderConfig)[] = [\n \"view\",\n \"dropzone\",\n \"allowRename\",\n \"autoUpload\",\n \"branding\",\n \"logoUrl\",\n \"logoText\",\n \"heading\",\n \"description\",\n \"maxFiles\",\n \"maxSize\",\n \"minSize\",\n \"accept\",\n \"rules\",\n \"bucket\",\n \"publicRead\",\n \"redirectUrl\",\n \"metadata\",\n \"options\",\n \"messages\",\n \"theme\",\n \"density\",\n \"radius\",\n \"onComplete\",\n \"onError\"\n];\n\n/**\n * A file picker that uploads straight to storage.\n *\n * <singlebase-uploader></singlebase-uploader>\n * <singlebase-uploader view=\"compact\" accept=\".pdf,image/*\"></singlebase-uploader>\n * <singlebase-uploader view=\"button\" max-files=\"1\"></singlebase-uploader>\n *\n * It owns the staging list — picking, renaming, removing, validating, and the\n * progress of each file — and nothing else. When the batch finishes it emits\n * the stored records and stops; what the application does with them (attach\n * them to a record, show a gallery, save an avatar) is the application's\n * decision, not the widget's.\n *\n * Failures are per file. One rejected upload leaves the rest completed and\n * offers that row a retry, mirroring the SDK's own behaviour.\n */\n@customElement(\"singlebase-uploader\")\nexport class SinglebaseUploader extends LitElement {\n static styles = [\n tokenDefaults,\n sharedStyles,\n brandingStyles,\n css`\n .card {\n display: flex;\n flex-direction: column;\n gap: 14px;\n box-sizing: border-box;\n padding: var(--sb-pad, 20px);\n background: var(--sb-surface, #ffffff);\n color: var(--sb-ink, #16181a);\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: calc((var(--sb-radius, 4px) + 4px) * var(--sb-radius-scale, 1));\n }\n\n .logo-img {\n display: block;\n align-self: flex-start;\n height: var(--sb-logo-height, 20px);\n width: auto;\n max-width: 100%;\n }\n\n .brand-mark {\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 13px;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--sb-ink, #16181a);\n }\n\n .head-block {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .count {\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 11.5px;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--sb-muted-ink, #61666c);\n }\n\n /* ── dropzone ─────────────────────────────────────── */\n .drop {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 30px 20px;\n text-align: center;\n border: 1px dashed var(--sb-border-strong, #cdd1d6);\n border-radius: calc((var(--sb-radius, 4px) + 2px) * var(--sb-radius-scale, 1));\n background: var(--sb-surface, #ffffff);\n transition:\n border-color 0.15s,\n background 0.15s;\n }\n\n .drop[data-drag=\"true\"] {\n border-color: var(--sb-accent, #111111);\n background: var(--sb-surface-alt, #fafafa);\n }\n\n .arrow {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 42px;\n height: 42px;\n margin-bottom: 4px;\n font-size: 18px;\n line-height: 1;\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: 50%;\n color: var(--sb-ink, #16181a);\n }\n\n .drop-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--sb-ink, #16181a);\n }\n\n /* the compact single-line dropzone */\n .strip {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 10px 12px;\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: calc((var(--sb-radius, 4px) + 2px) * var(--sb-radius-scale, 1));\n background: var(--sb-surface-alt, #fafafa);\n transition:\n border-color 0.15s,\n background 0.15s;\n }\n\n .strip[data-drag=\"true\"] {\n border-color: var(--sb-accent, #111111);\n }\n\n .strip-label {\n font-size: 14px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n /* ── file rows ────────────────────────────────────── */\n .rows {\n display: flex;\n flex-direction: column;\n }\n\n .row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 0;\n border-top: 1px solid var(--sb-border, #e4e6e9);\n }\n\n .rows .row:first-child {\n border-top: none;\n }\n\n .chip {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 46px;\n height: 46px;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 10.5px;\n letter-spacing: 0.04em;\n color: var(--sb-muted-ink, #61666c);\n background: var(--sb-surface-alt, #fafafa);\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n overflow: hidden;\n }\n\n .thumb {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .meta {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .name {\n font-size: 14px;\n font-weight: 500;\n color: var(--sb-ink, #16181a);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n button.name {\n align-self: flex-start;\n max-width: 100%;\n padding: 0;\n border: none;\n background: none;\n text-align: left;\n border-radius: 0;\n }\n\n button.name:hover {\n text-decoration: underline;\n text-underline-offset: 3px;\n }\n\n .name-input {\n font-size: 14px;\n padding: 6px 8px;\n }\n\n .sz {\n font-size: 12px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .sz[data-state=\"error\"] {\n color: var(--sb-danger, #b4231a);\n }\n\n .sz[data-state=\"done\"] {\n color: var(--sb-ok, #0f6b4a);\n }\n\n .bar {\n height: 3px;\n margin-top: 2px;\n border-radius: 999px;\n background: var(--sb-border, #e4e6e9);\n overflow: hidden;\n }\n\n .bar-fill {\n height: 100%;\n background: var(--sb-accent, #111111);\n transition: width 0.2s linear;\n }\n\n .row-act {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n /* ── the dashed \"add more\" affordance ─────────────── */\n button.add-more {\n width: 100%;\n padding: 14px;\n color: var(--sb-ink, #16181a);\n background: none;\n border: 1px dashed var(--sb-border-strong, #cdd1d6);\n border-radius: calc((var(--sb-radius, 4px) + 2px) * var(--sb-radius-scale, 1));\n }\n\n button.add-more:hover:not(:disabled) {\n background: var(--sb-surface-alt, #fafafa);\n }\n\n button.wide {\n width: 100%;\n padding: 13px;\n font-size: 14px;\n }\n\n /* the button view is just a control, not a card */\n :host([view=\"button\"]) {\n display: inline-block;\n }\n\n .button-view {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n `\n ];\n\n // ── wiring ────────────────────────────────────────────────\n /** An explicit client. Omit it and the page's SinglebaseClient() is used. */\n @property({ attribute: false })\n accessor client: UploaderClient | null = null;\n\n @property({ attribute: false })\n accessor messages: Partial<SinglebaseUploadMessages> = {};\n\n @property({ reflect: true })\n accessor theme: \"light\" | \"dark\" | undefined = undefined;\n\n @property({ reflect: true })\n accessor density: \"comfortable\" | \"compact\" | undefined = undefined;\n\n /** Corner preset for this element: `sharp`, `default` or `round`. */\n @property({ reflect: true })\n accessor radius: \"sharp\" | \"default\" | \"round\" | undefined = undefined;\n\n // ── shape ─────────────────────────────────────────────────\n /**\n * `full` is the card with a dropzone and a reviewable list, `compact` the\n * one-line attachments row, `button` a single control that uploads as soon\n * as a file is chosen.\n */\n @property({ reflect: true })\n accessor view: UploadView = \"full\";\n\n /** Show the drop target. Off leaves the picker button on its own. */\n @property({ converter: flagAttr })\n accessor dropzone = true;\n\n /** Let the user edit the saved filename before uploading. */\n @property({ converter: flagAttr, attribute: \"allow-rename\" })\n accessor allowRename = true;\n\n /** Upload as soon as files are picked, with no review step. */\n @property({ type: Boolean, attribute: \"auto-upload\" })\n accessor autoUpload = false;\n\n /** The \"Files by Singlebase\" credit. A plain link — it makes no request. */\n @property({ converter: flagAttr })\n accessor branding = true;\n\n @property({ attribute: \"logo-url\" }) accessor logoUrl = \"\";\n @property({ attribute: \"logo-text\" }) accessor logoText = \"\";\n @property() accessor heading = \"\";\n @property() accessor description = \"\";\n\n // ── limits ────────────────────────────────────────────────\n @property({ type: Number, attribute: \"max-files\" }) accessor maxFiles = 10;\n\n /** Bytes, or a human size like \"25MB\". 0 or \"\" means no limit. */\n @property({ attribute: \"max-size\" }) accessor maxSize: string | number = \"25MB\";\n @property({ attribute: \"min-size\" }) accessor minSize: string | number = 0;\n\n /** Same vocabulary as `<input type=\"file\" accept>`. */\n @property() accessor accept = \"\";\n\n /**\n * Per-format limits, as JSON in markup or an object in JavaScript:\n *\n * rules='{\"pdf\":{\"maxPages\":10,\"allowProtected\":false}}'\n *\n * Checking pages and encryption means reading the file in the browser, so\n * it is a convenience for the person picking files — never a substitute\n * for the server enforcing the same limits.\n */\n @property({ converter: jsonAttr })\n accessor rules: FileRules = {};\n\n // ── destination ───────────────────────────────────────────\n @property() accessor bucket = \"default\";\n\n /** Metadata attached to every file this element uploads. */\n @property({ converter: jsonAttr })\n accessor metadata: Record<string, unknown> = {};\n\n /**\n * `options` sent with every file's upload request — for instance\n * `{ profile_photo: true }`, which makes the upload the account's photo.\n */\n @property({ converter: jsonAttr })\n accessor options: Record<string, unknown> = {};\n @property({ type: Boolean, attribute: \"public-read\" }) accessor publicRead = false;\n\n /** Where to go once every file has uploaded. Same-origin only. */\n @property({ attribute: \"redirect-url\" }) accessor redirectUrl = \"\";\n\n /** Callback forms of the two events, for frameworks that prefer props. */\n @property({ attribute: false })\n accessor onComplete:\n ((detail: { completed: UploadItem[]; failed: UploadItem[] }) => void) | null = null;\n\n @property({ attribute: false })\n accessor onError: ((detail: { message: string }) => void) | null = null;\n\n // ── state ─────────────────────────────────────────────────\n @state() private accessor items: UploadItem[] = [];\n @state() private accessor notice = \"\";\n @state() private accessor busy = false;\n @state() private accessor dragging = false;\n @state() private accessor editing = \"\";\n\n get msg(): SinglebaseUploadMessages {\n return resolveUploadMessages(this.messages);\n }\n\n /** An explicit `.client`, else the page default. */\n get resolvedClient(): UploaderClient | null {\n return this.client ?? getDefaultClient<SinglebaseClientInstance>() ?? null;\n }\n\n /** The staging list, for host code that wants to inspect or persist it. */\n get files(): readonly UploadItem[] {\n return this.items;\n }\n\n /** Overall progress across the current batch, 0–100. */\n get percent(): number {\n const active = this.items.filter((item) => item.status !== \"ready\");\n if (!active.length) return 0;\n return Math.round(active.reduce((sum, item) => sum + item.percent, 0) / active.length);\n }\n\n // ── public API ────────────────────────────────────────────\n /** Opens the file picker. */\n open(): void {\n this.renderRoot.querySelector<HTMLInputElement>(\"input[type=file]\")?.click();\n }\n\n /**\n * Applies several settings at once:\n *\n * document.getElementById(\"docs\").config = { maxFiles: 5, metadata: { folder: \"q3\" } };\n *\n * Unknown keys are ignored. Reading it returns the current settings.\n */\n set config(value: Partial<UploaderConfig>) {\n const target = this as unknown as Record<string, unknown>;\n for (const key of CONFIG_KEYS) {\n if (value && key in value) target[key] = value[key];\n }\n }\n\n /**\n * Changes settings on the fly. Only the keys you pass change; staged files\n * stay. Returns the element, so calls chain.\n */\n configure(options: Partial<UploaderConfig>): this {\n this.config = options;\n return this;\n }\n\n get config(): Partial<UploaderConfig> {\n const source = this as unknown as Record<string, unknown>;\n return Object.fromEntries(CONFIG_KEYS.map((key) => [key, source[key]]));\n }\n\n /** Drops every staged file and any notice. */\n clear(): void {\n this.items.forEach(releasePreview);\n this.items = [];\n this.notice = \"\";\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.items.forEach(releasePreview);\n }\n\n /** Uploads everything staged. Rows that already succeeded are left alone. */\n async upload(): Promise<void> {\n if (this.busy) return;\n const pending = this.items.filter((item) => item.status === \"ready\" || item.status === \"error\");\n if (!pending.length) return;\n\n const client = this.resolvedClient;\n if (!client) {\n this.fail(this.msg.errNoClient);\n return;\n }\n\n this.busy = true;\n this.notice = \"\";\n for (const item of pending) {\n item.status = \"uploading\";\n item.percent = 0;\n item.error = \"\";\n }\n this.items = [...this.items];\n\n // The SDK hands each progress and result entry back the very input object\n // it was given, so identity is all that is needed to find the row again.\n const rowOf = new Map<FileUploadInput, UploadItem>();\n const inputs = pending.map((item) => {\n const input: FileUploadInput = { file: item.file, filename: item.file.name };\n if (this.bucket) input.bucket = this.bucket;\n if (this.publicRead) input.publicRead = true;\n if (item.name !== item.file.name) input.newName = item.name;\n if (Object.keys(this.metadata ?? {}).length) input.metadata = { ...this.metadata };\n if (Object.keys(this.options ?? {}).length) input.options = { ...this.options };\n rowOf.set(input, item);\n return input;\n });\n\n try {\n const result = await client.files.upload(inputs, {\n onProgress: (progress: UploadProgress) => {\n const row = rowOf.get(progress.input);\n if (!row) return;\n row.percent = progress.percent;\n this.items = [...this.items];\n this.emit(\"singlebase-upload-progress\", { file: row, percent: this.percent });\n }\n });\n\n for (const entry of result.completed) {\n const row = rowOf.get(entry.input);\n if (!row) continue;\n row.status = \"done\";\n row.percent = 100;\n row.record = entry.file;\n }\n for (const entry of result.failed) {\n const row = rowOf.get(entry.input);\n if (!row) continue;\n row.status = \"error\";\n row.error = entry.error.message || entry.error.code;\n }\n this.items = [...this.items];\n\n const completed = result.completed\n .map((entry) => rowOf.get(entry.input))\n .filter(Boolean) as UploadItem[];\n const failed = result.failed\n .map((entry) => rowOf.get(entry.input))\n .filter(Boolean) as UploadItem[];\n\n this.emit(\"singlebase-upload-complete\", { completed, failed });\n this.onComplete?.({ completed, failed });\n\n if (failed.length) {\n this.notice = this.msg.errUpload;\n } else {\n this.redirect();\n }\n } catch (error) {\n // Initiation failed for the whole batch — nothing reached storage.\n for (const item of pending) {\n item.status = \"error\";\n item.error = \"\";\n }\n this.items = [...this.items];\n this.fail(errorMessage(error) || this.msg.errUpload);\n } finally {\n this.busy = false;\n }\n }\n\n // ── staging ───────────────────────────────────────────────\n /** The rule for this filename's extension, if the host set one. */\n private ruleFor(filename: string): FileRule | null {\n const extension = fileExtension(filename);\n if (!extension) return null;\n for (const [key, rule] of Object.entries(this.rules ?? {})) {\n if (key.toLowerCase().replace(/^\\./, \"\") === extension) return rule;\n }\n return null;\n }\n\n private async add(list: ArrayLike<File>): Promise<void> {\n // The button view is a one-shot control: a new pick replaces whatever\n // finished last time, so a max-files=\"1\" button can be used again.\n if (this.view === \"button\") {\n const finished = this.items.filter((i) => i.status === \"done\" || i.status === \"error\");\n finished.forEach(releasePreview);\n this.items = this.items.filter((i) => !finished.includes(i));\n }\n const limit = this.maxFiles > 0 ? this.maxFiles : Number.POSITIVE_INFINITY;\n const next = [...this.items];\n const before = next.length;\n const staged: UploadItem[] = [];\n let problem = \"\";\n\n for (const file of Array.from(list)) {\n if (next.length >= limit) {\n problem = fill(this.msg.errTooMany, { max: limit });\n break;\n }\n if (this.accept && !acceptsFile(this.accept, file.name, file.type)) {\n problem = fill(this.msg.errType, { name: file.name });\n continue;\n }\n\n // A rule's own size bounds win over the element-wide ones for its kind.\n const rule = this.ruleFor(file.name);\n const maxBytes = parseSize(rule?.maxSize ?? this.maxSize);\n const minBytes = parseSize(rule?.minSize ?? this.minSize);\n if (maxBytes && file.size > maxBytes) {\n problem = fill(this.msg.errTooLarge, { name: file.name, size: formatSize(maxBytes) });\n continue;\n }\n if (minBytes && file.size < minBytes) {\n problem = fill(this.msg.errTooSmall, { name: file.name, size: formatSize(minBytes) });\n continue;\n }\n const key = fileKey(file);\n if (next.some((item) => item.key === key)) {\n problem = fill(this.msg.errDuplicate, { name: file.name });\n continue;\n }\n\n const item: UploadItem = {\n key,\n file,\n name: file.name,\n // Reading bytes takes a moment, so the row appears immediately as\n // \"checking\" rather than the widget freezing on a picked file.\n status: this.needsInspection(rule, file.name) ? \"checking\" : \"ready\",\n percent: 0,\n error: \"\",\n record: null,\n pages: null,\n encrypted: null,\n preview: previewFor(file)\n };\n next.push(item);\n staged.push(item);\n }\n\n this.notice = problem;\n if (problem) this.emit(\"singlebase-upload-rejected\", { message: problem });\n if (next.length === before) return;\n\n this.items = next;\n this.emit(\"singlebase-upload-selected\", { files: this.items });\n\n await Promise.all(\n staged\n .filter((item) => item.status === \"checking\")\n .map((item) => this.inspect(item, this.ruleFor(item.file.name)!))\n );\n\n if (this.autoUpload || this.view === \"button\") void this.upload();\n }\n\n private needsInspection(rule: FileRule | null, filename: string): boolean {\n if (!rule) return false;\n if (!isInspectable(fileExtension(filename))) return false;\n return rule.maxPages !== undefined || rule.allowProtected === false;\n }\n\n /**\n * Reads the file and applies the rule. A fact the reader could not\n * determine is not grounds for rejection — an unreadable page count means\n * the page rule simply doesn't apply to that file.\n */\n private async inspect(item: UploadItem, rule: FileRule): Promise<void> {\n const facts = await inspectFile(item.file, fileExtension(item.file.name));\n item.pages = facts.pages;\n item.encrypted = facts.encrypted;\n\n let problem = \"\";\n if (rule.allowProtected === false && facts.encrypted === true) {\n problem = fill(this.msg.errProtected, { name: item.name });\n } else if (rule.maxPages && facts.pages !== null && facts.pages > rule.maxPages) {\n problem = fill(this.msg.errTooManyPages, {\n name: item.name,\n pages: facts.pages,\n max: rule.maxPages\n });\n }\n\n if (problem) {\n releasePreview(item);\n this.items = this.items.filter((staged) => staged !== item);\n this.notice = problem;\n this.emit(\"singlebase-upload-rejected\", { message: problem });\n } else {\n item.status = \"ready\";\n this.items = [...this.items];\n }\n }\n\n /** Drops one staged file. Named for the row action, not Element.remove(). */\n private removeItem(key: string): void {\n this.items.filter((item) => item.key === key).forEach(releasePreview);\n this.items = this.items.filter((item) => item.key !== key);\n this.notice = \"\";\n }\n\n private commitRename(item: UploadItem, typed: string): void {\n item.name = renameKeepingExtension(item.file.name, typed);\n this.editing = \"\";\n this.items = [...this.items];\n }\n\n private fail(message: string): void {\n this.notice = message;\n this.emit(\"singlebase-upload-error\", { message });\n this.onError?.({ message });\n }\n\n private emit(name: string, detail: unknown): void {\n this.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true }));\n }\n\n private redirect(): void {\n if (!this.redirectUrl || typeof location === \"undefined\") return;\n const target = resolveRedirectTarget(this.redirectUrl, location.href, (reason) =>\n console.warn(`[singlebase-uploader] ${reason}`)\n );\n if (target) location.assign(target);\n }\n\n // ── events ────────────────────────────────────────────────\n private onPick(event: Event): void {\n const input = event.target as HTMLInputElement;\n if (input.files?.length) this.add(input.files);\n // Reset, or picking the same file twice in a row fires no change event.\n input.value = \"\";\n }\n\n private onDrop(event: DragEvent): void {\n event.preventDefault();\n this.dragging = false;\n const dropped = event.dataTransfer?.files;\n if (dropped?.length) this.add(dropped);\n }\n\n private onDragOver(event: DragEvent): void {\n event.preventDefault();\n this.dragging = true;\n }\n\n private onDragLeave(): void {\n this.dragging = false;\n }\n\n // ── rendering ─────────────────────────────────────────────\n private get canAddMore(): boolean {\n return this.maxFiles <= 0 || this.items.length < this.maxFiles;\n }\n\n /** True while any staged file is still being read. */\n private get checking(): boolean {\n return this.items.some((item) => item.status === \"checking\");\n }\n\n private get pendingCount(): number {\n return this.items.filter((item) => item.status === \"ready\" || item.status === \"error\").length;\n }\n\n private get hint(): string {\n const kinds = acceptSummary(this.accept);\n const maxBytes = parseSize(this.maxSize);\n const size = maxBytes ? fill(this.msg.hintUpTo, { size: formatSize(maxBytes) }) : \"\";\n return [kinds, size].filter(Boolean).join(\" · \");\n }\n\n private renderInput() {\n return html`<input\n class=\"sr-only\"\n type=\"file\"\n ?multiple=${this.maxFiles !== 1}\n accept=${this.accept || nothing}\n @change=${this.onPick}\n />`;\n }\n\n private renderLogo() {\n if (this.logoUrl) {\n return html`<img\n class=\"logo-img\"\n src=${this.logoUrl}\n alt=${this.logoText || \"Logo\"}\n part=\"logo\"\n />`;\n }\n if (this.logoText) return html`<div class=\"brand-mark\" part=\"logo\">${this.logoText}</div>`;\n return nothing;\n }\n\n private renderBranding() {\n return renderBranding(this.branding, \"Files\");\n }\n\n private renderNotice() {\n if (!this.notice) return nothing;\n return html`<div class=\"banner\" role=\"alert\" part=\"error\">${this.notice}</div>`;\n }\n\n private renderCount() {\n if (!this.items.length) return nothing;\n const template = this.items.length === 1 ? this.msg.countOne : this.msg.countMany;\n return html`<div class=\"count\" part=\"count\">\n ${fill(template, { n: this.items.length, max: this.maxFiles })}\n </div>`;\n }\n\n private renderStatus(item: UploadItem): string {\n const size = formatSize(item.file.size);\n if (item.status === \"checking\") return `${size} · ${this.msg.checking}`;\n if (item.status === \"uploading\") return `${size} · ${this.msg.uploading}`;\n if (item.status === \"done\") return `${size} · ${this.msg.uploaded}`;\n if (item.status === \"error\") {\n return `${size} · ${item.error || this.msg.failedLabel}`;\n }\n // A page count is only shown once it has actually been read.\n const pages = item.pages ? ` · ${fill(this.msg.pagesLabel, { n: item.pages })}` : \"\";\n return size + pages;\n }\n\n private renderRow(item: UploadItem) {\n const editable = this.allowRename && item.status === \"ready\";\n const busyRow = item.status === \"uploading\" || item.status === \"done\";\n return html`<div class=\"row\" part=\"file\">\n <div class=\"chip\" part=\"file-type\">\n ${\n item.preview\n ? html`<img class=\"thumb\" src=${item.preview} alt=\"\" part=\"preview\" />`\n : extensionOf(item.name) || \"FILE\"\n }\n </div>\n <div class=\"meta\">\n ${\n this.editing === item.key\n ? html`<input\n class=\"name-input\"\n .value=${item.name}\n autofocus\n @keydown=${(event: KeyboardEvent) => {\n if (event.key === \"Enter\") {\n this.commitRename(item, (event.target as HTMLInputElement).value);\n } else if (event.key === \"Escape\") {\n this.editing = \"\";\n }\n }}\n @blur=${(event: FocusEvent) =>\n this.commitRename(item, (event.target as HTMLInputElement).value)}\n />`\n : editable\n ? html`<button\n class=\"name\"\n title=${this.msg.rename}\n @click=${() => {\n this.editing = item.key;\n }}\n >\n ${item.name}\n </button>`\n : html`<div class=\"name\">${item.name}</div>`\n }\n <div class=\"sz\" data-state=${item.status}>${this.renderStatus(item)}</div>\n ${\n item.status === \"uploading\"\n ? html`<div class=\"bar\" part=\"progress\">\n <div class=\"bar-fill\" style=\"width:${item.percent}%\"></div>\n </div>`\n : nothing\n }\n </div>\n <div class=\"row-act\">\n ${\n item.status === \"error\"\n ? html`<button class=\"link-sm\" @click=${() => void this.upload()}>\n ${this.msg.retry}\n </button>`\n : nothing\n }\n ${\n item.status === \"uploading\" || item.status === \"done\"\n ? nothing\n : html`<button class=\"link-sm\" @click=${() => this.removeItem(item.key)}>\n ${this.msg.remove}\n </button>`\n }\n </div>\n </div>`;\n }\n\n private renderRows() {\n if (!this.items.length) return nothing;\n return html`<div class=\"rows\" part=\"files\">\n ${this.items.map((item) => this.renderRow(item))}\n </div>`;\n }\n\n private renderDropzone() {\n return html`<div class=\"drop\" part=\"dropzone\" data-drag=${String(this.dragging)}>\n <div class=\"arrow\" aria-hidden=\"true\">↑</div>\n <div class=\"drop-title\">${this.msg.dropTitle}</div>\n <button class=\"link\" @click=${this.open}>${this.msg.dropSub}</button>\n ${this.hint ? html`<div class=\"hint\">${this.hint}</div>` : nothing}\n </div>`;\n }\n\n private renderUploadCta() {\n const n = this.pendingCount;\n // Kept on screen while busy: a primary button that vanishes mid-upload\n // makes the card jump just as the user is watching it.\n if (this.autoUpload || (!n && !this.busy)) return nothing;\n const template = n === 1 ? this.msg.uploadCtaOne : this.msg.uploadCtaMany;\n return html`<button\n class=\"primary wide\"\n part=\"submit\"\n ?disabled=${this.busy || this.checking}\n @click=${() => void this.upload()}\n >\n ${this.busy ? this.msg.uploading : fill(template, { n })}\n </button>`;\n }\n\n /**\n * The whole card is the drop surface. Once files are staged the big zone is\n * replaced by the \"add more\" control, and a drop should still land.\n */\n private renderFull() {\n const showDrop = this.dropzone && !this.items.length && this.canAddMore;\n return html`<div\n class=\"card\"\n part=\"card\"\n @dragover=${this.onDragOver}\n @dragleave=${this.onDragLeave}\n @drop=${this.onDrop}\n >\n ${\n this.logoUrl || this.logoText || this.heading || this.description\n ? html`<div class=\"head-block\">\n ${this.renderLogo()}\n ${this.heading ? html`<div class=\"title\">${this.heading}</div>` : nothing}\n ${this.description ? html`<div class=\"sub\">${this.description}</div>` : nothing}\n </div>`\n : nothing\n }\n ${this.renderCount()} ${this.renderNotice()} ${this.renderRows()}\n ${showDrop ? this.renderDropzone() : nothing}\n ${\n !showDrop && this.canAddMore\n ? html`<button class=\"add-more\" @click=${this.open}>${this.msg.addMore}</button>`\n : nothing\n }\n ${this.renderUploadCta()} ${this.renderBranding()}\n </div>`;\n }\n\n private renderCompact() {\n return html`<div\n class=\"card\"\n part=\"card\"\n @dragover=${this.onDragOver}\n @dragleave=${this.onDragLeave}\n @drop=${this.onDrop}\n >\n <div class=\"between\">\n <span class=\"sec-title\">${this.heading || this.msg.attachments}</span>\n <span class=\"count\">${this.items.length} / ${this.maxFiles}</span>\n </div>\n ${\n this.dropzone\n ? html`<div class=\"strip\" part=\"dropzone\" data-drag=${String(this.dragging)}>\n <span class=\"strip-label\">${this.msg.dropOrChoose}</span>\n <button class=\"secondary\" ?disabled=${!this.canAddMore} @click=${this.open}>\n ${this.msg.chooseFiles}\n </button>\n </div>`\n : html`<button class=\"secondary\" ?disabled=${!this.canAddMore} @click=${this.open}>\n ${this.msg.chooseFiles}\n </button>`\n }\n ${this.hint ? html`<div class=\"hint\">${this.hint}</div>` : nothing} ${this.renderNotice()}\n ${this.renderRows()} ${this.renderUploadCta()} ${this.renderBranding()}\n </div>`;\n }\n\n private renderButton() {\n const active = this.items[this.items.length - 1];\n return html`<div class=\"button-view\">\n <button class=\"primary\" ?disabled=${this.busy || !this.canAddMore} @click=${this.open}>\n ${this.busy ? this.msg.uploading : this.msg.chooseFile}\n </button>\n ${\n active && active.status !== \"ready\"\n ? html`<div class=\"sz\" data-state=${active.status}>${this.renderStatus(active)}</div>`\n : nothing\n }\n ${this.renderNotice()}\n </div>`;\n }\n\n override render() {\n return html`${this.renderInput()}${\n this.view === \"button\"\n ? this.renderButton()\n : this.view === \"compact\"\n ? this.renderCompact()\n : this.renderFull()\n }`;\n }\n}\n\n/**\n * A local thumbnail for images. The object URL points at the bytes already in\n * memory — nothing is uploaded to draw it — and it is revoked when the row\n * goes away so a long session doesn't leak blobs.\n */\nfunction previewFor(file: File): string {\n if (!file.type.startsWith(\"image/\") || typeof URL.createObjectURL !== \"function\") return \"\";\n return URL.createObjectURL(file);\n}\n\nfunction releasePreview(item: UploadItem): void {\n if (item.preview) URL.revokeObjectURL(item.preview);\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : \"\";\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"singlebase-uploader\": SinglebaseUploader;\n }\n}\n","import { html, nothing, type PropertyValues } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { createFilesUploadApi, type AuthSettings } from \"@singlebase/singlebase-sdk\";\nimport { SinglebaseFormBase } from \"./authui-form-base.js\";\nimport { SettingsController } from \"../controllers/settings-controller.js\";\nimport { fullNameOf, initialsOf } from \"../utils/profile.js\";\nimport \"./uploader.js\";\nimport type { SinglebaseUploader } from \"./uploader.js\";\n\n/** Two-factor setup stays hidden until the backend supports enrolment. */\nconst SHOW_TWO_FACTOR = false;\n\n/** Account deletion stays hidden until the backend supports it. */\nconst SHOW_DELETE_ACCOUNT = false;\n\n/** Sent with the photo's upload request: the server makes it the account photo. */\nconst PHOTO_OPTIONS = { profile_photo: true };\nconst PHOTO_ACCEPT = \".jpg,.jpeg,.png,.webp,image/jpeg,image/png,image/webp\";\n\ntype EditMode = \"\" | \"avatar\" | \"profile\" | \"password\" | \"email\";\n\n/**\n * The authenticated account view, laid out exactly as the design mock's\n * isAuthed branch: identity header, profile summary with grouped edit\n * cards, password section, two-factor, connected accounts and danger zone.\n *\n * Two-factor setup and account deletion have no backing operation yet, so\n * they are hidden (SHOW_TWO_FACTOR, SHOW_DELETE_ACCOUNT). Listing and\n * unlinking providers isn't supported either, and says so; connecting\n * a *new* provider is supported, so those tiles are live.\n */\n@customElement(\"singlebase-authui-account\")\nexport class SinglebaseAccountScreen extends SinglebaseFormBase {\n @property({ attribute: \"logo-text\" }) accessor logoText = \"\";\n\n /** A logo image, used instead of `logo-text` when set. */\n @property({ attribute: \"logo-url\" }) accessor logoUrl = \"\";\n @property({ attribute: false }) accessor settings: AuthSettings | null = null;\n @property({ attribute: \"nonce-storage-key\" }) accessor nonceStorageKey = \"singlebase-oauth-nonce\";\n\n @state() private accessor editMode: EditMode = \"\";\n @state() private accessor toast = \"\";\n @state() private accessor photoBusy = false;\n /** A photo URL that failed to load, so the initials show instead of a broken image. */\n @state() private accessor photoFailed = \"\";\n @state() private accessor profileSaved = \"\";\n @state() private accessor passSaved = \"\";\n @state() private accessor profileError = \"\";\n @state() private accessor newPassError = \"\";\n @state() private accessor deleteStage = 0;\n @state() private accessor confirmText = \"\";\n\n // profile draft\n @state() private accessor dFirst = \"\";\n @state() private accessor dLast = \"\";\n @state() private accessor dPhone = \"\";\n @state() private accessor dEmail = \"\";\n\n // password draft\n // email change — a two-step verified flow, never a bare field save\n @state() private accessor emailStep: \"request\" | \"confirm\" = \"request\";\n @state() private accessor dNewEmail = \"\";\n @state() private accessor emailCode = \"\";\n @state() private accessor emailError = \"\";\n @state() private accessor emailSaved = \"\";\n\n @state() private accessor curPass = \"\";\n @state() private accessor newPass = \"\";\n @state() private accessor confirmPass = \"\";\n\n private settingsCtl = new SettingsController(this);\n private flashTimer?: ReturnType<typeof setTimeout>;\n private uidBase = `sb-acct-${Math.random().toString(36).slice(2, 8)}`;\n\n private uid(k: string) {\n return `${this.uidBase}-${k}`;\n }\n\n override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n this.settingsCtl.load(this.resolvedClient, this.settings);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n clearTimeout(this.flashTimer);\n }\n\n private flash(key: \"profileSaved\" | \"passSaved\" | \"emailSaved\", message: string) {\n this[key] = message;\n clearTimeout(this.flashTimer);\n this.flashTimer = setTimeout(() => {\n this[key] = \"\";\n }, 2600);\n }\n\n /** Matches the guest screens: image when given one, else the text label. */\n private renderLogo() {\n if (this.logoUrl) {\n return html`<img\n part=\"logo\"\n src=${this.logoUrl}\n alt=${this.logoText}\n style=\"display:block;align-self:flex-start;height:var(--sb-logo-height,20px);width:auto;max-width:100%\"\n />`;\n }\n return this.logoText ? html`<div class=\"logo-dot\" part=\"logo\">${this.logoText}</div>` : nothing;\n }\n\n private get user() {\n const state = this.auth.state;\n return state.status === \"authenticated\" ? state.user : null;\n }\n\n private get fullName() {\n return fullNameOf(this.user);\n }\n\n private get initials() {\n return initialsOf(this.user);\n }\n\n // ── profile photo ─────────────────────────────────────────\n private uploadClientFor: unknown = null;\n private uploadClientCache: { files: ReturnType<typeof createFilesUploadApi> } | null = null;\n\n /**\n * The upload API bound to the same dispatcher as this widget's auth client,\n * so the photo goes to the same project with the same bearer — including on\n * a page where this widget was given its own `.client`.\n */\n private get uploadClient() {\n const client = this.resolvedClient;\n if (!client) return null;\n if (this.uploadClientFor !== client) {\n this.uploadClientFor = client;\n this.uploadClientCache = { files: createFilesUploadApi(client.dispatcher) };\n }\n return this.uploadClientCache;\n }\n\n private onChoosePhoto = () => {\n this.formError = \"\";\n this.renderRoot.querySelector<SinglebaseUploader>(\"singlebase-uploader\")?.open();\n };\n\n private onPhotoSelected = () => {\n this.photoBusy = true;\n this.toast = \"\";\n };\n\n /** The server has set the photo; read the account back to get its URL. */\n private onPhotoUploaded = async (event: Event) => {\n const { completed, failed } = (event as CustomEvent).detail;\n try {\n if (completed.length) {\n await this.resolvedClient?.getAccount();\n this.photoFailed = \"\";\n this.toast = this.msg.photoUpdated;\n } else if (failed.length) {\n this.formError = failed[0].error || this.msg.genericErrorMessage;\n }\n } catch (error) {\n this.formError = this.describeError(error);\n } finally {\n this.photoBusy = false;\n }\n };\n\n private onPhotoProblem = (event: Event) => {\n this.photoBusy = false;\n this.formError = (event as CustomEvent).detail.message;\n };\n\n private startProfileEdit() {\n const u = this.user;\n if (!u) return;\n this.dFirst = u.first_name ?? \"\";\n this.dLast = u.last_name ?? \"\";\n this.dPhone = u.phone ?? \"\";\n this.dEmail = u.email;\n this.profileError = \"\";\n this.profileSaved = \"\";\n this.passSaved = \"\";\n this.toast = \"\";\n this.editMode = \"profile\";\n }\n\n private async onSaveProfile() {\n const client = this.resolvedClient;\n if (!client) return;\n if (!this.dFirst.trim() || !this.dLast.trim()) {\n this.profileError = \"First and last name cannot be empty.\";\n return;\n }\n if (this.dPhone.replace(/\\D/g, \"\").length < 7) {\n this.profileError = this.msg.invalidPhoneError;\n return;\n }\n await this.run(async () => {\n await client.updateAccount(\n { first_name: this.dFirst, last_name: this.dLast, phone: this.dPhone },\n this.signal\n );\n this.editMode = \"\";\n this.flash(\"profileSaved\", this.msg.savedNote);\n });\n }\n\n private startPassEdit() {\n this.curPass = \"\";\n this.newPass = \"\";\n this.confirmPass = \"\";\n this.newPassError = \"\";\n this.passSaved = \"\";\n this.profileSaved = \"\";\n this.toast = \"\";\n this.editMode = \"password\";\n }\n\n private async onChangePass() {\n const client = this.resolvedClient;\n if (!client) return;\n if (!this.curPass) {\n this.newPassError = \"Enter your current password.\";\n return;\n }\n if (this.newPass.length < 10) {\n this.newPassError = this.msg.passwordMinError;\n return;\n }\n if (this.newPass !== this.confirmPass) {\n this.newPassError = this.msg.passwordMatchError;\n return;\n }\n await this.run(async () => {\n await client.changePassword({ password: this.newPass }, this.signal);\n this.editMode = \"\";\n this.curPass = \"\";\n this.newPass = \"\";\n this.confirmPass = \"\";\n this.flash(\"passSaved\", this.msg.passwordUpdatedNote);\n });\n }\n\n // ── email change ─────────────────────────────────────────\n private startEmailEdit() {\n this.emailStep = \"request\";\n this.dNewEmail = \"\";\n this.emailCode = \"\";\n this.emailError = \"\";\n this.emailSaved = \"\";\n this.toast = \"\";\n this.editMode = \"email\";\n }\n\n /**\n * Step one: ask for a code. The code goes to the address on file, not to\n * the new one — that is what proves the person asking already controls the\n * account rather than merely knowing an address.\n */\n private async onRequestEmailCode() {\n const client = this.resolvedClient;\n if (!client || !this.user) return;\n if (!this.dNewEmail.includes(\"@\")) {\n this.emailError = this.msg.invalidEmailError;\n return;\n }\n if (this.dNewEmail.toLowerCase() === this.user.email.toLowerCase()) {\n this.emailError = this.msg.emailUnchangedError;\n return;\n }\n await this.run(async () => {\n await client.requestCode({ email: this.user!.email, purpose: \"email_change\" }, this.signal);\n this.emailStep = \"confirm\";\n this.emailError = \"\";\n });\n }\n\n /** Step two: confirm the code together with the new address. */\n private async onConfirmEmailChange() {\n const client = this.resolvedClient;\n if (!client || !this.user) return;\n if (this.emailCode.length < 6) {\n this.emailError = this.msg.codeIncompleteError;\n return;\n }\n await this.run(async () => {\n await client.changeEmail(\n { email: this.user!.email, code: this.emailCode, new_email: this.dNewEmail },\n this.signal\n );\n this.editMode = \"\";\n this.emailCode = \"\";\n this.dNewEmail = \"\";\n this.flash(\"emailSaved\", this.msg.emailUpdatedNote);\n });\n }\n\n private renderEmailSection() {\n const reading = this.editMode !== \"email\";\n const locked = this.editMode !== \"\" && this.editMode !== \"email\";\n\n return html`\n <div class=\"rule\"></div>\n <div class=\"section\">\n <h3 class=\"sec-title\">${this.msg.changeEmailTitle}</h3>\n ${\n reading\n ? html`\n <div class=\"between\">\n <p class=\"hint\">${this.user?.email ?? \"\"}</p>\n <div class=\"btn-row-end\">\n ${\n this.emailSaved\n ? html`<span role=\"status\" class=\"saved-note\">${this.emailSaved}</span>`\n : nothing\n }\n <button\n type=\"button\"\n class=\"edit-link\"\n ?disabled=${locked}\n @click=${this.startEmailEdit}\n >\n ${this.msg.changeEmailCtaShort}\n </button>\n </div>\n </div>\n `\n : this.emailStep === \"request\"\n ? html`\n <div class=\"edit-card\">\n <div class=\"field\">\n <label for=${this.uid(\"newemail\")}>${this.msg.newEmailLabel}</label>\n <input\n id=${this.uid(\"newemail\")}\n type=\"email\"\n part=\"input\"\n .value=${this.dNewEmail}\n placeholder=${this.msg.emailPlaceholder}\n aria-invalid=${this.emailError ? \"true\" : \"false\"}\n ?disabled=${this.submitting}\n @input=${(e: Event) => {\n this.dNewEmail = (e.target as HTMLInputElement).value;\n this.emailError = \"\";\n }}\n />\n <p class=\"hint\">${this.msg.changeEmailHint}</p>\n </div>\n ${this.emailError ? html`<p class=\"err\">${this.emailError}</p>` : nothing}\n <div class=\"edit-actions\">\n <button\n type=\"button\"\n class=\"primary-sm\"\n ?disabled=${this.submitting}\n @click=${this.onRequestEmailCode}\n >\n ${this.submitting ? html`<span class=\"spinner\"></span>` : nothing}\n <span>${this.msg.changeEmailCta}</span>\n </button>\n <button\n type=\"button\"\n class=\"ghost-sm\"\n @click=${() => {\n this.editMode = \"\";\n this.emailError = \"\";\n }}\n >\n ${this.msg.cancelCta}\n </button>\n </div>\n </div>\n `\n : html`\n <div class=\"edit-card\">\n <p class=\"hint\">${this.msg.codeSentNeutral}</p>\n <div class=\"field\">\n <label for=${this.uid(\"emailcode\")}>${this.msg.codeLabel}</label>\n <input\n id=${this.uid(\"emailcode\")}\n type=\"text\"\n inputmode=\"numeric\"\n autocomplete=\"one-time-code\"\n part=\"input\"\n .value=${this.emailCode}\n placeholder=\"000000\"\n aria-invalid=${this.emailError ? \"true\" : \"false\"}\n ?disabled=${this.submitting}\n @input=${(e: Event) => {\n this.emailCode = (e.target as HTMLInputElement).value\n .replace(/\\D/g, \"\")\n .slice(0, 6);\n this.emailError = \"\";\n }}\n />\n <p class=\"hint\">${this.msg.changeEmailConfirmHint} ${this.dNewEmail}</p>\n </div>\n ${this.emailError ? html`<p class=\"err\">${this.emailError}</p>` : nothing}\n <div class=\"edit-actions\">\n <button\n type=\"button\"\n class=\"primary-sm\"\n ?disabled=${this.submitting}\n @click=${this.onConfirmEmailChange}\n >\n ${this.submitting ? html`<span class=\"spinner\"></span>` : nothing}\n <span>${this.msg.confirmChangeCta}</span>\n </button>\n <button\n type=\"button\"\n class=\"ghost-sm\"\n @click=${() => {\n this.editMode = \"\";\n this.emailError = \"\";\n }}\n >\n ${this.msg.cancelCta}\n </button>\n </div>\n </div>\n `\n }\n </div>\n `;\n }\n\n private async onSignOut() {\n const client = this.resolvedClient;\n if (!client) return;\n await this.run(async () => {\n await client.signOut();\n });\n }\n\n private async onConnectProvider(providerId: string) {\n const client = this.resolvedClient;\n const state = this.auth.state;\n if (!client || state.status !== \"authenticated\") return;\n await this.run(async () => {\n const nonce = await client.createOAuthNonce(this.signal);\n globalThis.sessionStorage?.setItem(this.nonceStorageKey, nonce);\n const { oauth_redirect_url } = await client.startOAuth(\n {\n provider: providerId,\n nonce,\n intent: \"link\",\n id_token: state.session.id_token,\n refresh_token: state.session.refresh_token\n },\n this.signal\n );\n globalThis.location.assign(oauth_redirect_url);\n });\n }\n\n private get availableProviders(): Array<{ id: string; name: string; mark: string }> {\n const s = this.settings ?? this.settingsCtl.settings;\n if (!s || !s.oauth_settings.enabled) return [];\n const marks: Record<string, string> = {\n google: \"G\",\n github: \"GH\",\n linkedin: \"in\",\n facebook: \"f\"\n };\n return Object.entries(s.oauth_providers)\n .filter(([, p]) => p.enabled)\n .map(([id, p]) => ({\n id,\n name: p.provider_name,\n mark: marks[id] ?? p.provider_name.slice(0, 2)\n }));\n }\n\n // ── sections ──────────────────────────────────────────────\n private renderIdentity() {\n const u = this.user;\n const locked = this.editMode !== \"\" && this.editMode !== \"avatar\";\n const photo = u?.profile_photo && u.profile_photo !== this.photoFailed ? u.profile_photo : \"\";\n return html`\n <div class=\"acct-nav\">\n <div class=\"acct-who\">\n <div class=\"avatar-col\">\n <div class=\"avatar ${photo ? \"has-photo\" : \"\"}\" part=\"avatar\">\n ${\n photo\n ? html`<img\n src=${photo}\n alt=\"\"\n part=\"avatar-image\"\n @error=${() => (this.photoFailed = photo)}\n />`\n : this.initials\n }\n </div>\n <button\n type=\"button\"\n class=\"edit-link\"\n style=\"font-size:12px\"\n ?disabled=${this.photoBusy || locked}\n @click=${this.onChoosePhoto}\n >\n ${\n this.photoBusy\n ? this.msg.photoUploading\n : u?.profile_photo\n ? this.msg.changePhotoLink\n : this.msg.addPhotoLink\n }\n </button>\n <singlebase-uploader\n style=\"display:none\"\n view=\"button\"\n max-files=\"1\"\n branding=\"false\"\n accept=${PHOTO_ACCEPT}\n .client=${this.uploadClient}\n .options=${PHOTO_OPTIONS}\n @singlebase-upload-selected=${this.onPhotoSelected}\n @singlebase-upload-complete=${this.onPhotoUploaded}\n @singlebase-upload-error=${this.onPhotoProblem}\n @singlebase-upload-rejected=${this.onPhotoProblem}\n ></singlebase-uploader>\n </div>\n <div class=\"acct-who-text\">\n <div class=\"acct-name\">${this.fullName || \"—\"}</div>\n <div class=\"acct-email\">${u?.email ?? \"\"}</div>\n </div>\n </div>\n <button type=\"button\" class=\"link-sm\" ?disabled=${this.submitting} @click=${this.onSignOut}>\n ${this.msg.signOutCta}\n </button>\n </div>\n `;\n }\n\n private renderProfileSection() {\n const u = this.user;\n if (!u) return nothing;\n const reading = this.editMode !== \"profile\";\n const locked = this.editMode !== \"\" && this.editMode !== \"profile\";\n\n const summary: Array<[string, string]> = [\n [this.msg.firstNameLabel, u.first_name || \"—\"],\n [this.msg.lastNameLabel, u.last_name || \"—\"],\n [this.msg.phoneLabel, u.phone || \"—\"],\n [this.msg.emailLabel, u.email || \"—\"]\n ];\n\n return html`\n <div class=\"section\">\n ${\n reading\n ? html`\n <div class=\"sum-list\">\n ${summary.map(\n ([label, value]) => html`\n <div class=\"sum-row\">\n <span class=\"sum-label\">${label}</span>\n <span class=\"sum-value\">${value}</span>\n </div>\n `\n )}\n </div>\n <div class=\"btn-row-end\">\n ${\n this.profileSaved\n ? html`<span role=\"status\" class=\"saved-note\">${this.profileSaved}</span>`\n : nothing\n }\n <button\n type=\"button\"\n class=\"edit-link\"\n ?disabled=${locked}\n @click=${this.startProfileEdit}\n >\n ${this.msg.editAccountCta}\n </button>\n </div>\n `\n : html`\n <div class=\"edit-card\">\n <div class=\"two-up\">\n <div class=\"field\">\n <label for=${this.uid(\"first\")}>${this.msg.firstNameLabel}</label>\n <input\n id=${this.uid(\"first\")}\n type=\"text\"\n part=\"input\"\n .value=${this.dFirst}\n placeholder=${this.msg.firstNamePlaceholder}\n ?disabled=${this.submitting}\n @input=${(e: Event) => {\n this.dFirst = (e.target as HTMLInputElement).value;\n this.profileError = \"\";\n }}\n />\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"last\")}>${this.msg.lastNameLabel}</label>\n <input\n id=${this.uid(\"last\")}\n type=\"text\"\n part=\"input\"\n .value=${this.dLast}\n placeholder=${this.msg.lastNamePlaceholder}\n ?disabled=${this.submitting}\n @input=${(e: Event) => {\n this.dLast = (e.target as HTMLInputElement).value;\n this.profileError = \"\";\n }}\n />\n </div>\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"phone\")}>${this.msg.phoneLabel}</label>\n <input\n id=${this.uid(\"phone\")}\n type=\"tel\"\n part=\"input\"\n .value=${this.dPhone}\n placeholder=${this.msg.phonePlaceholder}\n ?disabled=${this.submitting}\n @input=${(e: Event) => {\n this.dPhone = (e.target as HTMLInputElement).value;\n this.profileError = \"\";\n }}\n />\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"email\")}>${this.msg.emailLabel}</label>\n <input\n id=${this.uid(\"email\")}\n type=\"email\"\n part=\"input\"\n .value=${this.dEmail}\n disabled\n title=${this.msg.notYetSupported}\n />\n <p class=\"hint\">${this.msg.changeEmailElsewhereHint}</p>\n </div>\n ${this.profileError ? html`<p class=\"err\">${this.profileError}</p>` : nothing}\n <div class=\"edit-actions\">\n <button\n type=\"button\"\n class=\"primary-sm\"\n ?disabled=${this.submitting}\n @click=${this.onSaveProfile}\n >\n ${this.submitting ? html`<span class=\"spinner\"></span>` : nothing}\n <span>${this.msg.saveChangesCta}</span>\n </button>\n <button\n type=\"button\"\n class=\"ghost-sm\"\n @click=${() => {\n this.editMode = \"\";\n this.profileError = \"\";\n }}\n >\n ${this.msg.cancelCta}\n </button>\n </div>\n </div>\n `\n }\n </div>\n `;\n }\n\n private renderPasswordSection() {\n const reading = this.editMode !== \"password\";\n const locked = this.editMode !== \"\" && this.editMode !== \"password\";\n return html`\n <div class=\"rule\"></div>\n <div class=\"section\">\n <h3 class=\"sec-title\">${this.msg.passwordSectionTitle}</h3>\n ${\n reading\n ? html`\n <div class=\"between\">\n <p class=\"hint\">${this.msg.passwordChangedHint}</p>\n <div class=\"btn-row-end\">\n ${\n this.passSaved\n ? html`<span role=\"status\" class=\"saved-note\">${this.passSaved}</span>`\n : nothing\n }\n <button\n type=\"button\"\n class=\"edit-link\"\n ?disabled=${locked}\n @click=${this.startPassEdit}\n >\n ${this.msg.changePasswordCta}\n </button>\n </div>\n </div>\n `\n : html`\n <div class=\"edit-card\">\n <div class=\"field\">\n <label for=${this.uid(\"curpass\")}>${this.msg.currentPasswordLabel}</label>\n <input\n id=${this.uid(\"curpass\")}\n type=\"password\"\n part=\"input\"\n .value=${this.curPass}\n placeholder=${this.msg.passwordPlaceholder}\n ?disabled=${this.submitting}\n @input=${(e: Event) => {\n this.curPass = (e.target as HTMLInputElement).value;\n this.newPassError = \"\";\n }}\n />\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"newpass\")}>${this.msg.newPasswordLabel}</label>\n <input\n id=${this.uid(\"newpass\")}\n type=\"password\"\n part=\"input\"\n .value=${this.newPass}\n placeholder=${this.msg.newPasswordPlaceholder}\n aria-invalid=${this.newPassError ? \"true\" : \"false\"}\n ?disabled=${this.submitting}\n @input=${(e: Event) => {\n this.newPass = (e.target as HTMLInputElement).value;\n this.newPassError = \"\";\n }}\n />\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"confirmpass\")}>Confirm new password</label>\n <input\n id=${this.uid(\"confirmpass\")}\n type=\"password\"\n part=\"input\"\n .value=${this.confirmPass}\n placeholder=${this.msg.confirmPasswordPlaceholder}\n aria-invalid=${this.newPassError ? \"true\" : \"false\"}\n ?disabled=${this.submitting}\n @input=${(e: Event) => {\n this.confirmPass = (e.target as HTMLInputElement).value;\n this.newPassError = \"\";\n }}\n />\n ${this.newPassError ? html`<p class=\"err\">${this.newPassError}</p>` : nothing}\n </div>\n <div class=\"edit-actions\">\n <button\n type=\"button\"\n class=\"primary-sm\"\n ?disabled=${this.submitting}\n @click=${this.onChangePass}\n >\n ${this.submitting ? html`<span class=\"spinner\"></span>` : nothing}\n <span>${this.msg.updatePasswordCta}</span>\n </button>\n <button type=\"button\" class=\"ghost-sm\" @click=${() => (this.editMode = \"\")}>\n ${this.msg.cancelCta}\n </button>\n </div>\n </div>\n `\n }\n </div>\n `;\n }\n\n /** Layout preserved from the mock; no enrolment operation exists yet. */\n private renderTwoFactorSection() {\n return html`\n <div class=\"rule\"></div>\n <div class=\"section\">\n <div class=\"between\">\n <div>\n <h3 class=\"sec-title\">${this.msg.twoFaTitle}</h3>\n <p class=\"hint\">${this.msg.twoFaHintOff}</p>\n </div>\n <button\n type=\"button\"\n class=\"switch\"\n aria-pressed=\"false\"\n aria-label=${`${this.msg.twoFaTitle} (${this.msg.notYetSupported})`}\n disabled\n title=${this.msg.notYetSupported}\n >\n <span class=\"knob\"></span>\n </button>\n </div>\n <p class=\"disabled-note\">\n ${this.msg.notYetSupported} — enrolling a second factor is not part of the current API.\n </p>\n </div>\n `;\n }\n\n private renderConnectedSection() {\n const providers = this.availableProviders;\n if (providers.length === 0) return nothing;\n return html`\n <div class=\"rule\"></div>\n <div class=\"section\">\n <h3 class=\"sec-title\">${this.msg.connectedTitle}</h3>\n <p class=\"hint\">${this.msg.connectedHint}</p>\n <span class=\"sub-label\">${this.msg.addAnotherLabel}</span>\n <div class=\"tile-grid\">\n ${providers.map(\n (p) => html`\n <button\n type=\"button\"\n class=\"tile\"\n aria-label=${`Connect ${p.name}`}\n ?disabled=${this.submitting}\n @click=${() => this.onConnectProvider(p.id)}\n >\n <span class=\"tile-mark\">${p.mark}</span>\n <span class=\"tile-name\">${p.name}</span>\n <span class=\"tile-plus\">+</span>\n </button>\n `\n )}\n </div>\n <p class=\"disabled-note\">\n ${this.msg.notYetSupported} — listing or disconnecting linked providers is not part of the\n current API.\n </p>\n </div>\n `;\n }\n\n private renderDangerSection() {\n return html`\n <div class=\"rule\"></div>\n <div class=\"section\">\n ${\n this.deleteStage === 0\n ? html`<button\n type=\"button\"\n class=\"danger-link\"\n disabled\n title=${this.msg.notYetSupported}\n >\n ${this.msg.deleteAccountCta}\n </button>`\n : nothing\n }\n <p class=\"disabled-note\">\n ${this.msg.notYetSupported} — account deletion is not part of the current API.\n </p>\n </div>\n `;\n }\n\n protected override render() {\n if (!this.user) return html`<p class=\"disabled-note\">Not signed in.</p>`;\n\n return html`\n <div class=\"acct-root\">\n ${this.renderLogo()} ${this.renderIdentity()}\n <div class=\"acct-body\">\n ${this.toast ? html`<div class=\"notice\" role=\"status\">${this.toast}</div>` : nothing}\n ${this.formError ? html`<div class=\"banner\" role=\"alert\">${this.formError}</div>` : nothing}\n ${this.renderProfileSection()} ${this.renderEmailSection()}\n ${this.renderPasswordSection()}\n ${SHOW_TWO_FACTOR ? this.renderTwoFactorSection() : nothing}\n ${this.renderConnectedSection()}\n ${SHOW_DELETE_ACCOUNT ? this.renderDangerSection() : nothing}\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"singlebase-authui-account\": SinglebaseAccountScreen;\n }\n}\n","import { html, nothing, type PropertyValues } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport type { AuthSettings, OAuthIntent } from \"@singlebase/singlebase-sdk\";\nimport { SinglebaseFormBase } from \"./authui-form-base.js\";\nimport { SettingsController } from \"../controllers/settings-controller.js\";\n\nexport type ButtonsType = \"signout\" | \"oauth\" | \"link\";\n\n/**\n * The widget's action buttons, selected with `type`:\n *\n * <singlebase-authui-buttons type=\"signout\"></singlebase-authui-buttons>\n * <singlebase-authui-buttons type=\"oauth\" intent=\"signup\"></singlebase-authui-buttons>\n * <singlebase-authui-buttons type=\"link\" provider=\"github\"></singlebase-authui-buttons>\n *\n * They live under one tag rather than three because they are the same thing\n * from a host's point of view — a button that performs one auth action — and\n * every custom element name is a global, unversioned claim on any page this\n * widget is dropped into.\n */\n@customElement(\"singlebase-authui-buttons\")\nexport class SinglebaseAuthButtons extends SinglebaseFormBase {\n @property() accessor type: ButtonsType = \"signout\";\n\n /** oauth: which flow the provider buttons start. */\n @property() accessor intent: OAuthIntent = \"signin\";\n\n /** link: the provider to connect to the signed-in account. */\n @property() accessor provider = \"\";\n\n /** link: display name, when it differs from the provider id. */\n @property({ attribute: \"provider-name\" }) accessor providerName = \"\";\n\n /** Inside a card that already supplies chrome, drop this element's own. */\n @property({ type: Boolean }) accessor embedded = false;\n\n @property({ attribute: false }) accessor settings: AuthSettings | null = null;\n\n @property({ attribute: \"nonce-storage-key\" })\n accessor nonceStorageKey = \"singlebase-oauth-nonce\";\n\n private settingsCtl = new SettingsController(this);\n\n override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n if (this.type === \"oauth\") this.settingsCtl.load(this.resolvedClient, this.settings);\n }\n\n private get effectiveSettings(): AuthSettings | null {\n return this.settings ?? this.settingsCtl.settings;\n }\n\n // ── oauth ────────────────────────────────────────────────\n private get providers(): Array<{ id: string; name: string; mark: string }> {\n const s = this.effectiveSettings;\n if (!s || !s.oauth_settings.enabled) return [];\n const allowed =\n this.intent === \"signup\" ? s.oauth_settings.allow_signup : s.oauth_settings.allow_signin;\n if (!allowed && this.intent !== \"link\") return [];\n\n const marks: Record<string, string> = {\n google: \"G\",\n github: \"GH\",\n linkedin: \"in\",\n facebook: \"f\"\n };\n return Object.entries(s.oauth_providers)\n .filter(([, p]) => p.enabled)\n .map(([id, p]) => ({\n id,\n name: p.provider_name,\n mark: marks[id] ?? p.provider_name.slice(0, 2)\n }));\n }\n\n /** Shared by the oauth and link flows: nonce, start, redirect. */\n private async startOAuth(providerId: string, intent: OAuthIntent, linking = false) {\n const client = this.resolvedClient;\n if (!client) return;\n\n let idToken: string | undefined;\n let refreshToken: string | undefined;\n if (linking) {\n const state = this.auth.state;\n if (state.status !== \"authenticated\") {\n this.formError = this.msg.linkRequiresSignIn;\n this.phase = \"error\";\n return;\n }\n idToken = state.session.id_token;\n refreshToken = state.session.refresh_token;\n }\n\n await this.run(async () => {\n const nonce = await client.createOAuthNonce(this.signal);\n globalThis.sessionStorage?.setItem(this.nonceStorageKey, nonce);\n const { oauth_redirect_url } = await client.startOAuth(\n {\n provider: providerId,\n nonce,\n intent,\n ...(linking ? { id_token: idToken, refresh_token: refreshToken } : {})\n },\n this.signal\n );\n globalThis.location.assign(oauth_redirect_url);\n });\n }\n\n private renderOAuth() {\n const providers = this.providers;\n if (providers.length === 0) return nothing;\n const [primary, ...rest] = providers;\n\n return html`\n <div class=\"stack\">\n ${\n this.formError\n ? html`<div class=\"banner\" part=\"banner\" role=\"alert\">${this.formError}</div>`\n : nothing\n }\n\n <button\n type=\"button\"\n class=\"oauth-primary\"\n part=\"oauth-button\"\n ?disabled=${this.submitting}\n @click=${() => this.startOAuth(primary!.id, this.intent)}\n >\n <span class=\"g-mark\">${primary!.mark}</span>\n <span>${this.msg.oauthContinueWith} ${primary!.name}</span>\n </button>\n\n ${\n rest.length\n ? html`\n <div class=\"icon-row\">\n ${rest.map(\n (p) => html`\n <button\n type=\"button\"\n class=\"icon-btn\"\n part=\"oauth-button\"\n aria-label=${`${this.msg.oauthContinueWith} ${p.name}`}\n title=${`${this.msg.oauthContinueWith} ${p.name}`}\n ?disabled=${this.submitting}\n @click=${() => this.startOAuth(p.id, this.intent)}\n >\n <span class=\"tile-mark\">${p.mark}</span>\n </button>\n `\n )}\n </div>\n `\n : nothing\n }\n </div>\n `;\n }\n\n // ── link ─────────────────────────────────────────────────\n private renderLink() {\n return html`\n <div class=\"stack\">\n ${this.renderStatus()}\n <button\n type=\"button\"\n class=\"secondary\"\n part=\"oauth-button\"\n ?disabled=${this.submitting}\n @click=${() => this.startOAuth(this.provider, \"link\", true)}\n >\n ${this.submitting ? html`<span class=\"spinner\"></span>` : nothing}\n <span>${this.msg.oauthContinueWith} ${this.providerName || this.provider}</span>\n </button>\n </div>\n `;\n }\n\n // ── signout ──────────────────────────────────────────────\n private async onSignOut() {\n const client = this.resolvedClient;\n if (!client) return;\n await this.run(async () => {\n await client.signOut();\n });\n }\n\n private renderSignOut() {\n if (this.embedded) {\n return html`<button\n type=\"button\"\n class=\"link-sm\"\n part=\"button-signout\"\n ?disabled=${this.submitting}\n @click=${this.onSignOut}\n >\n ${this.msg.signOutCta}\n </button>`;\n }\n\n return html`\n <div class=\"stack\">\n ${this.formError ? html`<p class=\"banner\" role=\"alert\">${this.formError}</p>` : nothing}\n <button\n type=\"button\"\n class=\"link-sm\"\n part=\"button-signout\"\n ?disabled=${this.submitting}\n @click=${this.onSignOut}\n >\n ${this.msg.signOutCta}\n </button>\n </div>\n `;\n }\n\n protected override render() {\n if (this.type === \"oauth\") return this.renderOAuth();\n if (this.type === \"link\") return this.renderLink();\n return this.renderSignOut();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"singlebase-authui-buttons\": SinglebaseAuthButtons;\n }\n}\n","import { html, css, nothing, type PropertyValues } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport {\n SinglebaseAuthError,\n resolveScreen,\n type AuthClient,\n type AuthSettings\n} from \"@singlebase/singlebase-sdk\";\nimport { SinglebaseElementBase } from \"./authui-base.js\";\nimport { resolveRedirectTarget } from \"../utils/redirect.js\";\nimport { SettingsController } from \"../controllers/settings-controller.js\";\nimport { EventBridge } from \"../controllers/event-bridge.js\";\nimport { brandingStyles } from \"../styles/branding.js\";\nimport { renderBranding } from \"../utils/branding.js\";\nimport \"./authui-account.js\";\nimport \"./authui-buttons.js\";\n\n/** Screens a signed-out visitor may reach. */\nexport type GuestScreen = \"signin\" | \"signup\" | \"forgot\" | \"verify\" | \"otp\" | \"newpass\" | \"invite\";\n\n/** Screens that require a live session. */\nexport type ProtectedScreen = \"account\";\n\n/** Every value `screen` accepts. \"oauth-callback\" is entered by URL, not by hand. */\nexport type Screen = GuestScreen | ProtectedScreen | \"oauth-callback\";\n\nconst GUEST_SCREENS: GuestScreen[] = [\n \"signin\",\n \"signup\",\n \"forgot\",\n \"verify\",\n \"otp\",\n \"newpass\",\n \"invite\"\n];\n\nconst PROTECTED_SCREENS: ProtectedScreen[] = [\"account\"];\n\nconst ALL_SCREENS: Screen[] = [...GUEST_SCREENS, ...PROTECTED_SCREENS, \"oauth-callback\"];\n\nexport function isGuestScreen(value: string): value is GuestScreen {\n return (GUEST_SCREENS as string[]).includes(value);\n}\n\nexport function isProtectedScreen(value: string): value is ProtectedScreen {\n return (PROTECTED_SCREENS as string[]).includes(value);\n}\n\nexport function isScreen(value: string): value is Screen {\n return (ALL_SCREENS as string[]).includes(value);\n}\n\n/**\n * Converter for the allow-* flags, which default to true. Lit's Boolean\n * converter can only express \"present = true\", so it cannot turn a\n * default-true flag off from markup; this one reads `allow-x=\"false\"` as\n * false and leaves the default alone when the attribute is absent.\n */\nconst flagAttr = {\n // An absent attribute must mean \"default\" (true), not false. Lit calls\n // fromAttribute(null) when an attribute is *removed*, so returning false\n // there would make removing `allow-oauth=\"false\"` leave the flag off\n // forever instead of restoring the default.\n fromAttribute: (value: string | null) => (value === null ? true : value !== \"false\"),\n toAttribute: (value: boolean) => (value ? null : \"false\")\n};\n\n/**\n * The complete auth widget: routes among signin, signup, recovery, one-time\n * code, invite and OAuth-callback views (spec: AuthScreen), and renders the\n * design's full card chrome — brand panel, logo, method accordion, step bar,\n * banner/notice, actions and footer.\n *\n * Structure and styling follow project/AuthWidget.dc.html; the individual\n * sb-* form elements remain available for hosts that want to compose their\n * own screen instead of using this one.\n */\n@customElement(\"singlebase-authui\")\nexport class SinglebaseAuthScreen extends SinglebaseElementBase {\n static override styles = [\n ...SinglebaseElementBase.styles,\n brandingStyles,\n css`\n /* the mock's root */\n :host {\n display: flex;\n width: 100%;\n box-sizing: border-box;\n background: var(--sb-surface, #ffffff);\n color: var(--sb-ink, #16181a);\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: calc((var(--sb-radius, 4px) + 4px) * var(--sb-radius-scale, 1));\n overflow: hidden;\n }\n\n .brand-panel {\n flex: 0 0 40%;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n gap: 24px;\n padding: var(--sb-pad, 20px);\n background: var(--sb-surface-alt, #fafafa);\n border-right: 1px solid var(--sb-border, #e4e6e9);\n }\n\n /* A flex column would stretch an image to full width and wreck its\n aspect ratio, so both logos opt out of the cross-axis stretch. */\n .logo-img {\n display: block;\n align-self: flex-start;\n height: var(--sb-logo-height, 20px);\n width: auto;\n max-width: 100%;\n margin-bottom: 6px;\n }\n\n .brand-img {\n display: block;\n align-self: flex-start;\n height: var(--sb-brand-logo-height, 28px);\n width: auto;\n max-width: 100%;\n }\n\n .brand-mark {\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 13px;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--sb-ink, #16181a);\n }\n\n .brand-copy {\n font-size: 20px;\n line-height: 1.35;\n letter-spacing: -0.01em;\n color: var(--sb-ink, #16181a);\n text-wrap: pretty;\n }\n\n .brand-foot {\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 11px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .branding {\n margin-top: 18px;\n }\n\n /* the mock's panel */\n .panel {\n flex: 1;\n min-width: 0;\n padding: var(--sb-pad, 20px);\n }\n\n @media (max-width: 520px) {\n :host {\n flex-direction: column;\n }\n .brand-panel {\n flex: 0 0 auto;\n border-right: none;\n border-bottom: 1px solid var(--sb-border, #e4e6e9);\n }\n }\n `\n ];\n\n // ── configuration (mirrors the mock's props) ───────────────\n @property({ attribute: \"initial-screen\" }) accessor initialScreen: Screen = \"signin\";\n\n /**\n * Two-way screen binding for SPA routers: set it to deep-link a screen,\n * read it (or listen for `singlebase-screen-change`) to mirror the widget\n * into your URL. `goto()` is the imperative form.\n */\n @property({ reflect: true })\n accessor screen: Screen | \"\" = \"\";\n\n /**\n * By default the widget swaps to the account view once authenticated.\n * SPAs usually want to route away and unmount instead — set this and the\n * widget renders nothing when signed in, leaving navigation to the host.\n */\n @property({ type: Boolean, attribute: \"no-account-view\" })\n accessor noAccountView = false;\n @property({ attribute: false }) accessor settings: AuthSettings | null = null;\n\n @property({ converter: flagAttr, attribute: \"auth-enabled\" }) accessor authEnabled = true;\n @property({ converter: flagAttr, attribute: \"allow-email-signin\" }) accessor allowEmailSignin =\n true;\n @property({ converter: flagAttr, attribute: \"allow-email-signup\" }) accessor allowEmailSignup =\n true;\n @property({ converter: flagAttr, attribute: \"allow-email-otp\" }) accessor allowEmailOtp = true;\n @property({ converter: flagAttr, attribute: \"allow-oauth\" }) accessor allowOauth = true;\n @property({ converter: flagAttr, attribute: \"allow-account-creation\" })\n accessor allowAccountCreation = true;\n\n @property() accessor layout: \"card\" | \"split\" = \"card\";\n @property({ attribute: \"oauth-placement\" }) accessor oauthPlacement: \"top\" | \"bottom\" = \"bottom\";\n @property({ type: Boolean }) accessor stepped = false;\n\n /**\n * Branding is the host's, so these default to empty and the corresponding\n * slots simply do not render. (\"KEYRING\" and friends were the fictional\n * brand in the design mock — they must never ship as defaults.)\n */\n @property({ attribute: \"logo-text\" }) accessor logoText = \"\";\n\n /**\n * A logo image, used instead of `logo-text` when set. `logo-text` is still\n * worth supplying alongside it — it becomes the image's alt text.\n */\n @property({ attribute: \"logo-url\" }) accessor logoUrl = \"\";\n @property({ attribute: \"brand-line\" }) accessor brandLine = \"\";\n @property({ attribute: \"brand-foot\" }) accessor brandFoot = \"\";\n @property({ attribute: \"sign-in-title\" }) accessor signInTitle = \"\";\n\n /**\n * The \"Auth by Singlebase\" credit under the card. On by default; turn it\n * off with branding=\"false\", exactly like the allow-* flags.\n *\n * It is a plain link — no pixel, no beacon, no request of any kind. A\n * third-party network call originating from a sign-in form is the sort of\n * thing that fails a security review, and deservedly.\n */\n @property({ converter: flagAttr, attribute: \"branding\" }) accessor branding = true;\n\n /**\n * Where to send the user once a session exists. Same-origin only — an\n * absolute URL pointing anywhere else is refused, because a login widget\n * that forwards to an attacker-supplied host is an open redirect.\n *\n * When unset, a `?redirect=` (or `?next=`) parameter on the current URL is\n * used instead, so \"you were sent to the login page, now go back where you\n * were headed\" works without the host wiring anything.\n */\n @property({ attribute: \"redirect-url\" }) accessor redirectUrl = \"\";\n\n /** Shown as \"Terms\" in the consent line under the primary action. */\n @property({ attribute: \"tos-url\" }) accessor tosUrl = \"\";\n\n /** Shown as \"Privacy\" in the consent line under the primary action. */\n @property({ attribute: \"privacy-url\" }) accessor privacyUrl = \"\";\n\n /** Where the OAuth nonce is stashed between starting a flow and returning. */\n @property({ attribute: \"nonce-storage-key\" })\n accessor nonceStorageKey = \"singlebase-oauth-nonce\";\n @property({ attribute: \"invite-email\" }) accessor inviteEmail = \"\";\n @property({ attribute: \"invite-org\" }) accessor inviteOrg = \"\";\n /** Invite code carried by the invite link; when absent the widget asks for it. */\n @property({ attribute: \"invite-code\" }) accessor inviteCode = \"\";\n\n // ── state (mirrors the mock's state bag) ───────────────────\n @state() private accessor step = 0;\n @state() private accessor method = \"\";\n @state() private accessor email = \"\";\n @state() private accessor password = \"\";\n @state() private accessor name = \"\";\n @state() private accessor firstName = \"\";\n @state() private accessor lastName = \"\";\n @state() private accessor phone = \"\";\n @state() private accessor newPass = \"\";\n @state() private accessor confirmPass = \"\";\n @state() private accessor code: string[] = [\"\", \"\", \"\", \"\", \"\", \"\"];\n @state() private accessor verifyNext: \"newpass\" | \"signin_code\" | \"invite\" = \"signin_code\";\n @state() private accessor loading = false;\n @state() private accessor banner = \"\";\n @state() private accessor notice = \"\";\n @state() private accessor emailError = \"\";\n @state() private accessor passError = \"\";\n @state() private accessor newPassError = \"\";\n @state() private accessor attempts = 0;\n @state() private accessor needsMfaCode = false;\n\n private settingsCtl = new SettingsController(this);\n private bridge = new EventBridge(this);\n private uidBase = `sb-${Math.random().toString(36).slice(2, 8)}`;\n\n private uid(k: string) {\n return `${this.uidBase}-${k}`;\n }\n\n override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n this.settingsCtl.load(this.resolvedClient, this.settings);\n this.bridge.bind(this.resolvedClient);\n this.bindGoto(this.resolvedClient);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.gotoUnsubscribe?.();\n this.gotoUnsubscribe = undefined;\n this.gotoClient = null;\n this.abortController?.abort();\n }\n\n private gotoUnsubscribe?: () => void;\n private gotoClient: AuthClient | null = null;\n\n /**\n * Subscribes to auth.goto() so a host can drive every widget on the page\n * with one call. Bound here rather than in connectedCallback because the\n * app usually creates its SinglebaseAuth() instance *after* the widget\n * upgrades — at connect time there is often no client to subscribe to yet.\n */\n private bindGoto(client: AuthClient | null) {\n if (client === this.gotoClient) return;\n this.gotoUnsubscribe?.();\n this.gotoUnsubscribe = undefined;\n this.gotoClient = client;\n if (!client) return;\n\n const offGoto = client.on(\"goto\", ({ screen }) => {\n if (isScreen(screen)) this.goto(screen);\n });\n\n // Follow the redirect on an actual sign-in only. Doing this from the\n // authenticated *state* instead would also fire for a session restored\n // on page load, which is the case that should show the interstitial and\n // let the user choose.\n const offSignin = client.on(\"signin\", () => {\n this.followRedirect();\n });\n\n this.gotoUnsubscribe = () => {\n offGoto();\n offSignin();\n };\n }\n\n /** Shows a screen. The SPA-facing counterpart of the `screen` property. */\n goto(screen: Screen): void {\n if (this.screen === screen) return;\n this.screen = screen;\n this.step = 0;\n this.banner = \"\";\n this.notice = \"\";\n this.dispatchEvent(\n new CustomEvent(\"singlebase-screen-change\", {\n detail: { screen },\n bubbles: true,\n composed: true\n })\n );\n }\n\n // ── derived config: explicit props unless auth.settings says otherwise ──\n private get cfg() {\n const s = this.settings ?? this.settingsCtl.settings;\n if (!s) {\n return {\n authEnabled: this.authEnabled,\n allowEmailSignin: this.allowEmailSignin,\n allowEmailSignup: this.allowEmailSignup && this.allowAccountCreation,\n allowEmailOtp: this.allowEmailOtp,\n allowOauth: this.allowOauth,\n mfa: false\n };\n }\n const a = s.auth_settings;\n // Code-only signin is available only when the project does not require\n // password-plus-OTP MFA (the auth API's code sign-in).\n const mfa = a.second_factor === \"email_otp\";\n return {\n authEnabled: s.enabled && a.enabled && this.authEnabled,\n allowEmailSignin: a.allow_signin && this.allowEmailSignin,\n allowEmailSignup: a.allow_signup && this.allowEmailSignup && this.allowAccountCreation,\n allowEmailOtp: this.allowEmailOtp && a.allow_signin && !mfa,\n allowOauth: s.oauth_settings.enabled && this.allowOauth,\n mfa\n };\n }\n\n /** The screen the host asked for, before any guarding is applied. */\n private get requestedScreen(): Screen {\n const raw = this.screen || this.initialScreen || \"signin\";\n return isScreen(raw) ? raw : \"signin\";\n }\n\n /**\n * Resolves the screen actually rendered.\n *\n * This is the single place navigation is decided, so a protected screen\n * cannot be reached by setting an attribute, editing the URL, or calling\n * goto() — every route runs through the same auth check. The guest\n * fallbacks below additionally reflect what the project has enabled.\n */\n private get activeScreen(): Screen {\n if (this.isOAuthCallback) return \"oauth-callback\";\n\n const authenticated = this.auth.state.status === \"authenticated\";\n const requested = this.requestedScreen;\n\n if (isProtectedScreen(requested)) {\n // Never render a protected screen without a session.\n return authenticated ? requested : \"signin\";\n }\n\n if (authenticated) {\n // With no screen asked for, a signed-in visitor belongs on their\n // account. If the host *did* ask for a guest screen, honour it — the\n // interstitial below then offers to continue or sign out, rather than\n // showing a sign-in form to someone already signed in.\n const askedForOne = this.screen !== \"\" || this.initialScreen !== \"signin\";\n return askedForOne ? requested : \"account\";\n }\n\n const c = this.cfg;\n let screen = requested as GuestScreen;\n if (screen === \"signup\" && !c.allowEmailSignup) screen = \"signin\";\n if ((screen === \"forgot\" || screen === \"newpass\") && !c.allowEmailSignin) screen = \"signin\";\n if (screen === \"otp\" && !c.allowEmailOtp) screen = \"signin\";\n if (screen === \"signin\" && !c.allowEmailSignin && c.allowEmailOtp) screen = \"otp\";\n return screen;\n }\n\n /** True when a signed-in user is sitting on a guest screen (spec: offer continue/sign out). */\n private get showsSignedInInterstitial(): boolean {\n return this.auth.state.status === \"authenticated\" && isGuestScreen(this.activeScreen);\n }\n\n // ── redirect ──────────────────────────────────────────────\n\n /**\n * The post-login destination, or null when there is none.\n *\n * Only same-origin targets are accepted. A login widget that forwards to\n * an attacker-chosen host is a textbook open redirect, and the `redirect`\n * parameter it reads comes straight off the URL bar, so it is untrusted\n * input by definition.\n */\n private get redirectTarget(): string | null {\n return resolveRedirectTarget(\n this.redirectUrl || this.redirectParam,\n globalThis.location?.href,\n (reason) => console.warn(`[singlebase] ${reason}`)\n );\n }\n\n private get redirectParam(): string {\n const params = new URLSearchParams(globalThis.location?.search ?? \"\");\n return params.get(\"redirect\") ?? params.get(\"next\") ?? \"\";\n }\n\n /** Navigates to the post-login destination if there is a safe one. */\n private followRedirect(): boolean {\n const target = this.redirectTarget;\n if (!target) return false;\n globalThis.location?.assign(target);\n return true;\n }\n\n private get isOAuthCallback(): boolean {\n const params = new URLSearchParams(globalThis.location?.search ?? \"\");\n return params.has(\"access_code\") || params.has(\"error\");\n }\n\n // ── OAuth callback ────────────────────────────────────────\n //\n // Handled here rather than in a separate element: it is a screen of this\n // widget like any other, and giving it its own tag meant a second element\n // with its own copy of the loading/error handling.\n\n @state() private accessor callbackDone = false;\n\n /** Strips the provider's parameters so a reload cannot replay the exchange. */\n private cleanCallbackUrl(): void {\n const here = globalThis.location?.href;\n if (!here || !globalThis.history) return;\n const url = new URL(here);\n url.searchParams.delete(\"access_code\");\n url.searchParams.delete(\"error\");\n globalThis.history.replaceState({}, \"\", url.toString());\n }\n\n /**\n * Completes the provider round trip. Runs once per landing: the URL is\n * cleaned immediately so a refresh cannot resend a single-use access code.\n */\n private async handleOAuthCallback(): Promise<void> {\n if (this.callbackDone) return;\n this.callbackDone = true;\n\n const params = new URLSearchParams(globalThis.location?.search ?? \"\");\n const accessCode = params.get(\"access_code\");\n const denied = params.get(\"error\");\n const client = this.resolvedClient;\n\n if (denied) {\n this.cleanCallbackUrl();\n this.banner = this.msg.oauthDenied;\n return;\n }\n\n if (!accessCode || !client) return;\n\n const nonce = globalThis.sessionStorage?.getItem(this.nonceStorageKey);\n this.cleanCallbackUrl();\n\n if (!nonce) {\n // No nonce means this response cannot be tied to a flow this browser\n // started, so it is not safe to exchange.\n this.banner = this.msg.genericErrorMessage;\n return;\n }\n\n await this.withLoading(async () => {\n await client.completeOAuth({ access_code: accessCode, nonce }, this.signal());\n globalThis.sessionStorage?.removeItem(this.nonceStorageKey);\n });\n }\n\n /** The small logo above a screen title: image when given one, else text. */\n private renderLogo() {\n if (this.logoUrl) {\n return html`<img class=\"logo-img\" part=\"logo\" src=${this.logoUrl} alt=${this.logoText} />`;\n }\n return this.logoText ? html`<div class=\"logo-dot\" part=\"logo\">${this.logoText}</div>` : nothing;\n }\n\n /** The larger logo in the split layout's brand panel. */\n private renderBrandMark() {\n if (this.logoUrl) {\n return html`<img class=\"brand-img\" part=\"logo\" src=${this.logoUrl} alt=${this.logoText} />`;\n }\n return this.logoText\n ? html`<div class=\"brand-mark\" part=\"logo\">${this.logoText}</div>`\n : nothing;\n }\n\n private renderBranding() {\n return renderBranding(this.branding, \"Auth\");\n }\n\n /** Every screen renders inside this, so the credit appears once and only once. */\n private panel(content: unknown) {\n return html`<div class=\"panel\">${content}${this.renderBranding()}</div>`;\n }\n\n private renderOAuthCallback() {\n return html`\n <div class=\"stack\">\n <div class=\"head\">\n ${this.renderLogo()}\n <h2 class=\"title\" part=\"title\">${this.msg.oauthCallbackTitle}</h2>\n <p class=\"sub\">${this.msg.oauthCallbackSub}</p>\n </div>\n ${\n this.banner\n ? html`<div class=\"banner\" part=\"banner\" role=\"alert\">${this.banner}</div>`\n : html`<div class=\"stack\" style=\"align-items:center;\">\n <span class=\"spinner\" part=\"spinner\"></span>\n </div>`\n }\n ${\n this.banner\n ? html`<button type=\"button\" class=\"ghost\" @click=${() => this.goto(\"signin\")}>\n <span>${this.msg.backCta}</span>\n </button>`\n : nothing\n }\n </div>\n `;\n }\n\n private setScreen(screen: GuestScreen, patch: Record<string, unknown> = {}) {\n const changed = this.screen !== screen;\n this.screen = screen;\n this.banner = \"\";\n this.emailError = \"\";\n this.passError = \"\";\n Object.assign(this, patch);\n if (changed) {\n this.dispatchEvent(\n new CustomEvent(\"singlebase-screen-change\", {\n detail: { screen },\n bubbles: true,\n composed: true\n })\n );\n }\n }\n\n // ── submit ────────────────────────────────────────────────\n private async withLoading(task: () => Promise<void>) {\n this.loading = true;\n this.banner = \"\";\n try {\n await task();\n } catch (error) {\n this.banner = this.describeError(error);\n } finally {\n this.loading = false;\n }\n }\n\n private describeError(error: unknown): string {\n if (error instanceof SinglebaseAuthError) {\n if (error.code === \"AUTH_RATE_LIMITED\") return this.msg.rateLimitedMessage;\n if (error.code === \"INVALID_TOKEN\") return \"That code is not valid. Check it and try again.\";\n }\n return this.msg.genericErrorMessage;\n }\n\n private get codeValue() {\n return this.code.join(\"\");\n }\n\n private async onSubmit(e?: Event) {\n e?.preventDefault();\n const client = this.resolvedClient;\n if (!client) return;\n const screen = this.activeScreen;\n const c = this.cfg;\n\n if (screen === \"forgot\" || screen === \"otp\") {\n if (!this.email.includes(\"@\")) {\n this.emailError = this.msg.invalidEmailError;\n return;\n }\n const purpose = screen === \"forgot\" ? \"password_reset\" : \"signin\";\n await this.withLoading(async () => {\n await client.requestCode({ email: this.email, purpose }, this.signal());\n this.notice = this.msg.codeSentNeutral;\n this.screen = \"verify\";\n this.verifyNext = screen === \"forgot\" ? \"newpass\" : \"signin_code\";\n this.code = [\"\", \"\", \"\", \"\", \"\", \"\"];\n });\n return;\n }\n\n if (screen === \"verify\") {\n if (this.codeValue.length < 6) {\n this.banner = this.msg.codeIncompleteError;\n return;\n }\n if (this.verifyNext === \"newpass\") {\n // Code is confirmed together with the new password by auth.confirm_code.\n this.setScreen(\"newpass\", { notice: \"\" });\n return;\n }\n await this.withLoading(async () => {\n await client.signIn(\n { email: this.email, grant_type: \"code\", code: this.codeValue },\n this.signal()\n );\n this.notice = \"\";\n });\n return;\n }\n\n if (screen === \"newpass\") {\n if (this.newPass.length < 10) {\n this.newPassError = this.msg.passwordMinError;\n return;\n }\n if (this.newPass !== this.confirmPass) {\n this.newPassError = this.msg.passwordMatchError;\n return;\n }\n await this.withLoading(async () => {\n await client.resetPassword(\n { email: this.email, code: this.codeValue, new_password: this.newPass },\n this.signal()\n );\n this.newPass = \"\";\n this.confirmPass = \"\";\n });\n return;\n }\n\n if (screen === \"invite\") {\n if (!this.firstName.trim() || !this.lastName.trim()) {\n this.banner = \"Enter your first and last name.\";\n return;\n }\n if (this.phone.replace(/\\D/g, \"\").length < 7) {\n this.banner = this.msg.invalidPhoneError;\n return;\n }\n if (this.password.length < 10) {\n this.passError = this.msg.passwordMinError;\n return;\n }\n const code = this.inviteCode || this.codeValue;\n if (code.length < 6) {\n this.banner = this.msg.codeIncompleteError;\n return;\n }\n await this.withLoading(async () => {\n await client.acceptInvite(\n {\n email: this.inviteEmail,\n grant_type: \"code\",\n purpose: \"invite\",\n code,\n password: this.password,\n phone: this.phone\n },\n this.signal()\n );\n });\n return;\n }\n\n if (\n this.stepped &&\n ((screen === \"signup\" && this.step < 2) || (screen === \"signin\" && this.step < 1))\n ) {\n if (!this.email.includes(\"@\")) {\n this.emailError = this.msg.invalidEmailError;\n return;\n }\n this.step += 1;\n return;\n }\n\n if (!this.email.includes(\"@\")) {\n this.emailError = this.msg.invalidEmailError;\n return;\n }\n\n if (screen === \"signup\") {\n if (this.password.length < 8) {\n this.passError = \"Password must be at least 8 characters.\";\n return;\n }\n const [first, ...rest] = this.name.trim().split(/\\s+/);\n await this.withLoading(async () => {\n const result = await client.signUp(\n {\n email: this.email,\n password: this.password,\n first_name: first || this.name,\n last_name: rest.join(\" \") || \"—\"\n },\n this.signal()\n );\n const next = resolveScreen({\n next_action: result.next_action,\n next_operation: result.next_operation\n });\n this.setScreen(\"signin\", {\n notice: \"Account created. Sign in to continue.\",\n step: 0,\n password: \"\",\n needsMfaCode: next === \"signin_with_code\"\n });\n });\n return;\n }\n\n // signin\n if (this.password.length < 8) {\n this.attempts += 1;\n this.passError = \"Password must be at least 8 characters.\";\n this.banner = this.attempts >= 3 ? this.msg.rateLimitedMessage : \"\";\n return;\n }\n await this.withLoading(async () => {\n try {\n await client.signIn(\n {\n email: this.email,\n password: this.password,\n ...(this.needsMfaCode ? { code: this.codeValue } : {})\n },\n this.signal()\n );\n this.step = 0;\n } catch (error) {\n if (error instanceof SinglebaseAuthError && error.code === \"CODE_REQUIRED\") {\n this.needsMfaCode = true;\n await client.requestCode({ email: this.email, purpose: \"signin\" }, this.signal());\n this.notice = this.msg.codeSentNeutral;\n return;\n }\n if (error instanceof SinglebaseAuthError && error.code === \"INVALID_CREDENTIALS\") {\n this.attempts += 1;\n this.banner =\n this.attempts >= 3\n ? this.msg.rateLimitedMessage\n : \"That email and password do not match.\";\n return;\n }\n throw error;\n }\n });\n }\n\n private abortController: AbortController | null = null;\n private signal(): AbortSignal {\n this.abortController?.abort();\n this.abortController = new AbortController();\n return this.abortController.signal;\n }\n\n private onCodeInput(index: number, e: Event) {\n const input = e.target as HTMLInputElement;\n const entered = input.value.replace(/\\D/g, \"\");\n\n // Autofill of a `one-time-code` field arrives as the whole code in one\n // cell; spread it instead of keeping only the last digit.\n if (entered.length > 1) {\n this.fillCode(index, entered);\n return;\n }\n\n const digit = entered.slice(-1);\n const next = this.code.slice();\n next[index] = digit;\n this.code = next;\n this.banner = \"\";\n if (digit) {\n const inputs = this.renderRoot.querySelectorAll<HTMLInputElement>(\n \".code-row input, .code-row-sm input\"\n );\n inputs[index + 1]?.focus();\n }\n }\n\n private onCodePaste(index: number, e: ClipboardEvent) {\n const digits = (e.clipboardData?.getData(\"text\") ?? \"\").replace(/\\D/g, \"\");\n if (!digits) return;\n e.preventDefault();\n this.fillCode(index, digits);\n }\n\n private fillCode(index: number, digits: string) {\n const next = this.code.slice();\n for (let i = 0; i < digits.length && index + i < next.length; i += 1) {\n next[index + i] = digits[i]!;\n }\n this.code = next;\n this.banner = \"\";\n\n const landed = Math.min(index + digits.length, next.length - 1);\n void this.updateComplete.then(() => {\n const inputs = this.renderRoot.querySelectorAll<HTMLInputElement>(\n \".code-row input, .code-row-sm input\"\n );\n inputs[landed]?.focus();\n });\n }\n\n private async onResend() {\n const client = this.resolvedClient;\n if (!client || this.loading) return;\n const purpose = this.verifyNext === \"newpass\" ? \"password_reset\" : \"signin\";\n await this.withLoading(async () => {\n await client.requestCode({ email: this.email, purpose }, this.signal());\n this.notice = \"New code sent.\";\n this.code = [\"\", \"\", \"\", \"\", \"\", \"\"];\n });\n }\n\n private goBack() {\n if (this.step > 0 && [\"forgot\", \"verify\", \"otp\", \"newpass\"].indexOf(this.activeScreen) < 0) {\n this.step -= 1;\n this.banner = \"\";\n this.notice = \"\";\n return;\n }\n this.setScreen(\"signin\", { step: 0, notice: \"\", code: [\"\", \"\", \"\", \"\", \"\", \"\"] });\n }\n\n // ── copy helpers (mirror the mock's titles/subs/ctas maps) ──\n private titleFor(screen: GuestScreen): string {\n const m = this.msg;\n switch (screen) {\n case \"signup\":\n return m.signUpTitle;\n case \"forgot\":\n return m.forgotTitle;\n case \"verify\":\n return m.verifyTitle;\n case \"otp\":\n return m.otpTitle;\n case \"newpass\":\n return m.newPassTitle;\n case \"invite\":\n return m.inviteTitle;\n default:\n return this.signInTitle || m.signInTitle;\n }\n }\n\n private subFor(screen: GuestScreen): string {\n const m = this.msg;\n const c = this.cfg;\n switch (screen) {\n case \"signup\":\n return m.signUpSub;\n case \"forgot\":\n return m.forgotSub;\n case \"verify\":\n return `We sent a 6-digit code to ${this.email || \"your inbox\"}. It expires in 10 minutes.`;\n case \"otp\":\n return m.otpSub;\n case \"newpass\":\n return `Your code is confirmed. Set a new password for ${this.email || \"your account\"}.`;\n case \"invite\":\n return `${this.inviteOrg || \"Acme\"} invited you to join. Set up your account to continue.`;\n default:\n if (!c.allowEmailSignin && !c.allowEmailOtp) return m.signInSubOauthOnly;\n return c.allowOauth ? m.signInSubEmailAndOauth : m.signInSubEmailOnly;\n }\n }\n\n private ctaFor(screen: GuestScreen): string {\n const m = this.msg;\n if (\n this.stepped &&\n ((screen === \"signup\" && this.step < 2) || (screen === \"signin\" && this.step < 1))\n ) {\n return m.continueCta;\n }\n switch (screen) {\n case \"signup\":\n return m.signUpCta;\n case \"forgot\":\n return m.forgotCta;\n case \"verify\":\n return m.verifyCta;\n case \"otp\":\n return m.otpCta;\n case \"newpass\":\n return m.newPassCta;\n case \"invite\":\n return m.inviteCta;\n default:\n return m.signInCta;\n }\n }\n\n private stepPct(): number {\n if (!this.stepped) return 100;\n const total = this.activeScreen === \"signup\" ? 3 : 2;\n return Math.round(((this.step + 1) / total) * 100);\n }\n\n // ── render pieces ─────────────────────────────────────────\n private renderPrimary(label: string) {\n return html`\n <button type=\"submit\" class=\"primary\" part=\"button-primary\" ?disabled=${this.loading}>\n ${this.loading ? html`<span class=\"spinner\" part=\"spinner\"></span>` : nothing}\n <span>${label}</span>\n </button>\n `;\n }\n\n private renderEmailField(id: string) {\n return html`\n <div class=\"field\">\n <label for=${id}>${this.msg.emailLabel}</label>\n <input\n id=${id}\n type=\"email\"\n part=\"input\"\n .value=${this.email}\n placeholder=${this.msg.emailPlaceholder}\n aria-invalid=${this.emailError ? \"true\" : \"false\"}\n ?disabled=${this.loading}\n @input=${(e: Event) => {\n this.email = (e.target as HTMLInputElement).value;\n this.emailError = \"\";\n this.banner = \"\";\n }}\n />\n ${this.emailError ? html`<p class=\"err\">${this.emailError}</p>` : nothing}\n </div>\n `;\n }\n\n private renderPasswordField(id: string, showForgot: boolean) {\n return html`\n <div class=\"field\">\n <div class=\"label-row\">\n <label for=${id}>${this.msg.passwordLabel}</label>\n ${\n showForgot\n ? html`<button\n type=\"button\"\n class=\"link-sm\"\n @click=${() => this.setScreen(\"forgot\", { step: 0 })}\n >\n ${this.msg.forgotLink}\n </button>`\n : nothing\n }\n </div>\n <input\n id=${id}\n type=\"password\"\n part=\"input\"\n .value=${this.password}\n placeholder=${this.msg.passwordPlaceholder}\n aria-invalid=${this.passError ? \"true\" : \"false\"}\n ?disabled=${this.loading}\n @input=${(e: Event) => {\n this.password = (e.target as HTMLInputElement).value;\n this.passError = \"\";\n this.banner = \"\";\n }}\n />\n ${this.passError ? html`<p class=\"err\">${this.passError}</p>` : nothing}\n </div>\n `;\n }\n\n private renderCodeRow(small = false) {\n return html`\n <div class=${small ? \"code-row-sm\" : \"code-row\"} role=\"group\" aria-label=\"Verification code\">\n ${this.code.map(\n (digit, i) => html`\n <input\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"1\"\n part=\"code-box\"\n aria-label=${`Digit ${i + 1}`}\n autocomplete=${i === 0 ? \"one-time-code\" : \"off\"}\n .value=${digit}\n ?disabled=${this.loading}\n @input=${(e: Event) => this.onCodeInput(i, e)}\n @paste=${(e: ClipboardEvent) => this.onCodePaste(i, e)}\n />\n `\n )}\n </div>\n `;\n }\n\n /** The email/password method accordion body for signin, signup and otp. */\n private renderEmailMethodBody(screen: GuestScreen) {\n const c = this.cfg;\n const stepped = this.stepped;\n const showName = screen === \"signup\" && (!stepped || this.step === 0);\n const showEmail =\n (screen === \"signup\" && (!stepped || this.step === 1)) ||\n (screen === \"signin\" && (!stepped || this.step === 0)) ||\n screen === \"otp\";\n const showPassword =\n (screen === \"signup\" && (!stepped || this.step === 2)) ||\n (screen === \"signin\" && (!stepped || this.step === 1));\n const showOtpLink =\n screen === \"signin\" && c.allowEmailSignin && c.allowEmailOtp && (!stepped || this.step === 0);\n\n return html`\n ${\n showName\n ? html`\n <div class=\"field\">\n <label for=${this.uid(\"name\")}>${this.msg.fullNameLabel}</label>\n <input\n id=${this.uid(\"name\")}\n type=\"text\"\n part=\"input\"\n .value=${this.name}\n placeholder=${this.msg.fullNamePlaceholder}\n ?disabled=${this.loading}\n @input=${(e: Event) => (this.name = (e.target as HTMLInputElement).value)}\n />\n </div>\n `\n : nothing\n }\n ${showEmail ? this.renderEmailField(this.uid(\"email\")) : nothing}\n ${showPassword ? this.renderPasswordField(this.uid(\"pass\"), c.allowEmailSignin && screen === \"signin\") : nothing}\n ${\n this.needsMfaCode && screen === \"signin\"\n ? html`\n <div class=\"field\">\n <span class=\"label\">Verification code</span>\n ${this.renderCodeRow(true)}\n </div>\n `\n : nothing\n }\n ${this.renderPrimary(this.ctaFor(screen))}\n ${\n showOtpLink\n ? html`<button\n type=\"button\"\n class=\"edit-link\"\n @click=${() => this.setScreen(\"otp\", { step: 0 })}\n >\n ${this.msg.otpInsteadLink}\n </button>`\n : nothing\n }\n `;\n }\n\n private renderAccordion(screen: GuestScreen) {\n const c = this.cfg;\n const hasEmail =\n (screen === \"signin\" && c.allowEmailSignin) ||\n (screen === \"signup\" && c.allowEmailSignup) ||\n (screen === \"otp\" && c.allowEmailOtp);\n const hasOauth = c.allowOauth;\n if (!hasEmail && !hasOauth) return nothing;\n\n const showHeads = hasEmail && hasOauth;\n const method = !hasEmail ? \"oauth\" : !hasOauth ? \"email\" : this.method || \"email\";\n const emailOpen = method === \"email\";\n const oauthOpen = method === \"oauth\";\n\n const emailTitle =\n screen === \"signup\" ? this.msg.emailMethodTitleSignUp : this.msg.emailMethodTitle;\n const emailMeta =\n screen === \"otp\"\n ? this.msg.emailMethodMetaOtp\n : screen === \"signup\"\n ? this.msg.emailMethodMetaSignUp\n : this.msg.emailMethodMeta;\n\n const item = (\n open: boolean,\n title: string,\n meta: string,\n body: unknown,\n onToggle: () => void,\n key: string\n ) => html`\n <div class=\"acc-item ${open ? \"open\" : \"\"} ${showHeads ? \"\" : \"bare\"}\" part=\"acc-item\">\n ${\n showHeads\n ? html`\n <button\n type=\"button\"\n class=\"acc-head\"\n aria-expanded=${open ? \"true\" : \"false\"}\n aria-controls=${this.uid(`acc-${key}`)}\n @click=${onToggle}\n >\n <span class=\"chev\" aria-hidden=\"true\">›</span>\n <span class=\"acc-title\">${title}</span>\n <span class=\"acc-meta\">${meta}</span>\n </button>\n `\n : nothing\n }\n <div class=\"acc-body\" id=${this.uid(`acc-${key}`)}>\n <div class=\"acc-clip\">\n <div class=\"acc-inner\">${body}</div>\n </div>\n </div>\n </div>\n `;\n\n const emailItem = hasEmail\n ? item(\n emailOpen,\n emailTitle,\n emailMeta,\n this.renderEmailMethodBody(screen),\n () => (this.method = emailOpen ? \"\" : \"email\"),\n \"email\"\n )\n : nothing;\n\n const oauthItem = hasOauth\n ? item(\n oauthOpen,\n this.msg.oauthMethodTitle,\n this.msg.oauthMethodMeta,\n html`<singlebase-authui-buttons\n type=\"oauth\"\n embedded\n theme=${ifDefined(this.theme)}\n density=${ifDefined(this.density)}\n field-style=${ifDefined(this.fieldStyle)}\n .client=${this.resolvedClient}\n .messages=${this.messages}\n .settings=${this.settings ?? this.settingsCtl.settings}\n intent=${screen === \"signup\" ? \"signup\" : \"signin\"}\n ></singlebase-authui-buttons>`,\n () => (this.method = oauthOpen ? \"\" : \"oauth\"),\n \"oauth\"\n )\n : nothing;\n\n return html`\n <div class=\"acc-wrap\">\n ${this.oauthPlacement === \"top\" ? html`${oauthItem}${emailItem}` : html`${emailItem}${oauthItem}`}\n </div>\n `;\n }\n\n private renderScreenBody(screen: GuestScreen) {\n const c = this.cfg;\n const showMethods = [\"signin\", \"signup\", \"otp\"].indexOf(screen) >= 0;\n\n if (showMethods) return this.renderAccordion(screen);\n\n if (screen === \"forgot\") {\n return html`<div class=\"fields\">${this.renderEmailField(this.uid(\"reset\"))}</div>`;\n }\n\n if (screen === \"verify\") {\n return html`\n ${this.renderCodeRow()}\n <div class=\"resend-row\">\n <span class=\"hint\">${this.msg.resendQuestion}</span>\n <button type=\"button\" class=\"link-sm\" ?disabled=${this.loading} @click=${this.onResend}>\n ${this.msg.resendCta}\n </button>\n </div>\n `;\n }\n\n if (screen === \"newpass\") {\n return html`\n <div class=\"fields\">\n <div class=\"field\">\n <label for=${this.uid(\"newpass\")}>${this.msg.newPasswordLabel}</label>\n <input\n id=${this.uid(\"newpass\")}\n type=\"password\"\n part=\"input\"\n .value=${this.newPass}\n placeholder=${this.msg.newPasswordPlaceholder}\n aria-invalid=${this.newPassError ? \"true\" : \"false\"}\n ?disabled=${this.loading}\n @input=${(e: Event) => {\n this.newPass = (e.target as HTMLInputElement).value;\n this.newPassError = \"\";\n }}\n />\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"confirmpass\")}>${this.msg.confirmPasswordLabel}</label>\n <input\n id=${this.uid(\"confirmpass\")}\n type=\"password\"\n part=\"input\"\n .value=${this.confirmPass}\n placeholder=${this.msg.confirmPasswordPlaceholder}\n aria-invalid=${this.newPassError ? \"true\" : \"false\"}\n ?disabled=${this.loading}\n @input=${(e: Event) => {\n this.confirmPass = (e.target as HTMLInputElement).value;\n this.newPassError = \"\";\n }}\n />\n ${this.newPassError ? html`<p class=\"err\">${this.newPassError}</p>` : nothing}\n </div>\n </div>\n `;\n }\n\n if (screen === \"invite\") {\n return html`\n <div class=\"fields\">\n <div class=\"invite-box\">\n <span class=\"invite-label\">${this.msg.invitedEmailLabel}</span>\n <span class=\"invite-email\">${this.inviteEmail}</span>\n </div>\n ${\n this.inviteCode\n ? nothing\n : html`<div class=\"field\">\n <span class=\"label\">Invite code</span>\n ${this.renderCodeRow(true)}\n </div>`\n }\n <div class=\"two-up\">\n <div class=\"field\">\n <label for=${this.uid(\"first\")}>${this.msg.firstNameLabel}</label>\n <input\n id=${this.uid(\"first\")}\n type=\"text\"\n part=\"input\"\n .value=${this.firstName}\n placeholder=${this.msg.firstNamePlaceholder}\n ?disabled=${this.loading}\n @input=${(e: Event) => (this.firstName = (e.target as HTMLInputElement).value)}\n />\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"last\")}>${this.msg.lastNameLabel}</label>\n <input\n id=${this.uid(\"last\")}\n type=\"text\"\n part=\"input\"\n .value=${this.lastName}\n placeholder=${this.msg.lastNamePlaceholder}\n ?disabled=${this.loading}\n @input=${(e: Event) => (this.lastName = (e.target as HTMLInputElement).value)}\n />\n </div>\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"phone\")}>${this.msg.phoneLabel}</label>\n <input\n id=${this.uid(\"phone\")}\n type=\"tel\"\n part=\"input\"\n .value=${this.phone}\n placeholder=${this.msg.phonePlaceholder}\n ?disabled=${this.loading}\n @input=${(e: Event) => (this.phone = (e.target as HTMLInputElement).value)}\n />\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"invitepass\")}>${this.msg.passwordLabel}</label>\n <input\n id=${this.uid(\"invitepass\")}\n type=\"password\"\n part=\"input\"\n .value=${this.password}\n placeholder=${this.msg.newPasswordPlaceholder}\n aria-invalid=${this.passError ? \"true\" : \"false\"}\n ?disabled=${this.loading}\n @input=${(e: Event) => {\n this.password = (e.target as HTMLInputElement).value;\n this.passError = \"\";\n }}\n />\n ${this.passError ? html`<p class=\"err\">${this.passError}</p>` : nothing}\n </div>\n </div>\n `;\n }\n\n return nothing;\n }\n\n private renderGuest(screen: GuestScreen) {\n const c = this.cfg;\n const showPrimary = [\"forgot\", \"verify\", \"newpass\", \"invite\"].indexOf(screen) >= 0;\n const showBack =\n (this.stepped && this.step > 0) ||\n [\"forgot\", \"verify\", \"otp\", \"newpass\"].indexOf(screen) >= 0;\n const showFoot =\n (screen === \"signin\" && c.allowEmailSignup) || (screen === \"signup\" && c.allowEmailSignin);\n const showStepBar = this.stepped && (screen === \"signin\" || screen === \"signup\");\n\n return html`\n <form class=\"stack\" @submit=${this.onSubmit} novalidate>\n <div class=\"head\">\n ${this.layout !== \"split\" ? this.renderLogo() : nothing}\n <h2 class=\"title\" part=\"title\">${this.titleFor(screen)}</h2>\n <p class=\"sub\">${this.subFor(screen)}</p>\n </div>\n\n ${\n showStepBar\n ? html`<div class=\"step-bar\">\n <div class=\"step-fill\" style=\"width:${this.stepPct()}%\"></div>\n </div>`\n : nothing\n }\n ${this.banner ? html`<div class=\"banner\" part=\"banner\" role=\"alert\">${this.banner}</div>` : nothing}\n ${this.notice ? html`<div class=\"notice\" part=\"notice\" role=\"status\">${this.notice}</div>` : nothing}\n ${this.renderScreenBody(screen)}\n ${\n showPrimary || showBack\n ? html`\n <div class=\"actions\">\n ${showPrimary ? this.renderPrimary(this.ctaFor(screen)) : nothing}\n ${\n showBack\n ? html`<button type=\"button\" class=\"ghost\" @click=${this.goBack}>\n ${this.msg.backCta}\n </button>`\n : nothing\n }\n </div>\n `\n : nothing\n }\n ${\n showFoot\n ? html`\n <p class=\"foot\">\n <span\n >${screen === \"signup\" ? this.msg.footTextSignUp : this.msg.footTextSignIn}</span\n >\n <button\n type=\"button\"\n class=\"link\"\n @click=${() =>\n this.setScreen(screen === \"signup\" ? \"signin\" : \"signup\", {\n step: 0,\n notice: \"\"\n })}\n >\n ${screen === \"signup\" ? this.msg.footActionSignUp : this.msg.footActionSignIn}\n </button>\n </p>\n `\n : nothing\n }\n ${this.renderConsent()}\n\n <span class=\"sr-only\" role=\"status\" aria-live=\"polite\">\n ${this.loading ? \"Submitting…\" : \"\"}\n </span>\n </form>\n `;\n }\n\n private renderBlocked() {\n const c = this.cfg;\n const disabled = !c.authEnabled;\n return html`\n <div class=\"stack\">\n <div class=\"head\">\n ${this.layout !== \"split\" ? this.renderLogo() : nothing}\n <h2 class=\"title\" part=\"title\">\n ${disabled ? this.msg.blockedTitleDisabled : this.msg.blockedTitleUnavailable}\n </h2>\n <p class=\"sub\">\n ${disabled ? this.msg.blockedBodyDisabled : this.msg.blockedBodyUnavailable}\n </p>\n </div>\n <div class=\"notice\" part=\"notice\" role=\"status\">${this.msg.blockedHint}</div>\n </div>\n `;\n }\n\n /**\n * Shown when a signed-in visitor lands on a guest screen. Rather than\n * presenting a sign-in form to someone already signed in, offer the two\n * things they could actually want: carry on, or switch accounts.\n */\n private renderSignedIn() {\n const user = this.auth.state.status === \"authenticated\" ? this.auth.state.user : null;\n const target = this.redirectTarget;\n\n return html`\n <div class=\"stack\">\n <div class=\"head\">\n ${this.renderLogo()}\n <h2 class=\"title\" part=\"title\">${this.msg.alreadySignedInTitle}</h2>\n <p class=\"sub\">\n ${\n user?.email\n ? `${this.msg.alreadySignedInSubPrefix} ${user.email}.`\n : this.msg.alreadySignedInSub\n }\n </p>\n </div>\n\n <div class=\"actions\">\n <button type=\"button\" class=\"primary\" part=\"button-primary\" @click=${this.onContinue}>\n <span>${this.msg.continueCta}</span>\n </button>\n <button type=\"button\" class=\"ghost\" @click=${this.onInterstitialSignOut}>\n <span>${this.msg.signOutCta}</span>\n </button>\n </div>\n\n ${target ? nothing : html`<p class=\"hint\">${this.msg.continueHint}</p>`}\n </div>\n `;\n }\n\n private onContinue = () => {\n if (this.followRedirect()) return;\n // Nothing to redirect to: show the account view and let the host route\n // off the event if it wants to.\n this.dispatchEvent(\n new CustomEvent(\"singlebase-continue\", {\n detail: { user: this.getUser() },\n bubbles: true,\n composed: true\n })\n );\n this.goto(\"account\");\n };\n\n private onInterstitialSignOut = async () => {\n await this.resolvedClient?.logout();\n this.goto(\"signin\");\n };\n\n /** The Terms/Privacy consent line, rendered only when the host supplies a link. */\n private renderConsent() {\n if (!this.tosUrl && !this.privacyUrl) return nothing;\n const tos = this.tosUrl\n ? html`<a class=\"link-sm\" href=${this.tosUrl} target=\"_blank\" rel=\"noopener noreferrer\"\n >${this.msg.termsLabel}</a\n >`\n : nothing;\n const privacy = this.privacyUrl\n ? html`<a class=\"link-sm\" href=${this.privacyUrl} target=\"_blank\" rel=\"noopener noreferrer\"\n >${this.msg.privacyLabel}</a\n >`\n : nothing;\n\n return html`\n <p class=\"hint\" part=\"consent\">\n ${this.msg.consentPrefix}\n ${tos}${\n this.tosUrl && this.privacyUrl ? html` ${this.msg.consentJoin} ` : nothing\n }${privacy}.\n </p>\n `;\n }\n\n protected override render() {\n const screen = this.activeScreen;\n\n if (screen === \"oauth-callback\") {\n void this.handleOAuthCallback();\n return this.panel(this.renderOAuthCallback());\n }\n\n if (screen === \"account\") {\n // `no-account-view` is the SPA case: render nothing and let the host\n // route away on the signin event instead.\n if (this.noAccountView) return nothing;\n return this.panel(html`\n <singlebase-authui-account\n theme=${ifDefined(this.theme)}\n density=${ifDefined(this.density)}\n field-style=${ifDefined(this.fieldStyle)}\n .client=${this.resolvedClient}\n .messages=${this.messages}\n logo-text=${this.logoText}\n logo-url=${this.logoUrl}\n ></singlebase-authui-account>\n `);\n }\n\n if (this.showsSignedInInterstitial) {\n if (this.noAccountView) return nothing;\n return this.panel(this.renderSignedIn());\n }\n\n const c = this.cfg;\n const noMethods = !c.allowEmailSignin && !c.allowEmailOtp && !c.allowOauth;\n const blocked = !c.authEnabled || (noMethods && isGuestScreen(screen));\n\n return html`\n ${\n this.layout === \"split\"\n ? html`\n <div class=\"brand-panel\">\n ${this.renderBrandMark()}\n ${this.brandLine ? html`<div class=\"brand-copy\">${this.brandLine}</div>` : nothing}\n ${this.brandFoot ? html`<div class=\"brand-foot\">${this.brandFoot}</div>` : nothing}\n </div>\n `\n : nothing\n }\n ${this.panel(blocked ? this.renderBlocked() : this.renderGuest(screen as GuestScreen))}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"singlebase-authui\": SinglebaseAuthScreen;\n }\n}\n","import { html } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { matchesPredicate, validatePredicate, type Predicate } from \"@singlebase/core\";\nimport { SinglebaseElementBase } from \"./authui-base.js\";\n\nexport type GuardState = \"loading\" | \"authenticated\" | \"unauthenticated\";\n\nconst GUARD_STATES: GuardState[] = [\"loading\", \"authenticated\", \"unauthenticated\"];\n\n/**\n * Renders content conditionally on auth state, and optionally on a predicate\n * over the signed-in profile.\n *\n * Two shapes, because wrapping a single line of markup in a slotted <div> is\n * a lot of ceremony:\n *\n * <!-- long form: one guard, several states -->\n * <singlebase-authui-guard>\n * <div slot=\"loading\">Checking…</div>\n * <div slot=\"authenticated\">Welcome back</div>\n * <div slot=\"unauthenticated\"><singlebase-authui></singlebase-authui></div>\n * </singlebase-authui-guard>\n *\n * <!-- short form: the guard itself carries the state -->\n * <singlebase-authui-guard slot=\"loading\">Checking…</singlebase-authui-guard>\n *\n * With a predicate it also filters on the profile:\n *\n * <singlebase-authui-guard slot=\"authenticated\" predicate='{\"roles\":{\"$in\":[\"admin\"]}}'>\n * <admin-panel></admin-panel>\n * </singlebase-authui-guard>\n *\n * A predicate only ever narrows the *authenticated* state: a signed-out\n * visitor is unauthenticated whether or not a filter is present, so a guard\n * can never leak content by failing open.\n */\n@customElement(\"singlebase-authui-guard\")\nexport class SinglebaseAuthGuard extends SinglebaseElementBase {\n /**\n * Short form. When set, every child of this guard belongs to that state and\n * no per-child `slot` attributes are needed.\n *\n * Note this reuses the standard `slot` attribute name, which is inert here:\n * the guard is not itself inside another shadow root's slot, so the name is\n * free to mean \"the state these children belong to\".\n */\n @property({ reflect: true })\n accessor slot = \"\";\n\n /**\n * One-level, Mongo-style filter over the signed-in `user_profile`.\n * Dot notation reaches nested values; see core's predicate module for the\n * supported operators.\n */\n @property({\n converter: {\n fromAttribute: (value: string | null): Predicate | null => {\n if (!value) return null;\n try {\n return JSON.parse(value) as Predicate;\n } catch {\n console.error(\"[singlebase] guard predicate is not valid JSON:\", value);\n return null;\n }\n },\n toAttribute: (value: Predicate | null) => (value ? JSON.stringify(value) : null)\n }\n })\n accessor predicate: Predicate | null = null;\n\n /**\n * What to show when the user is signed in but the predicate does not match.\n * Defaults to \"unauthenticated\" so a filtered guard degrades to the\n * signed-out branch; set \"hidden\" to render nothing at all.\n */\n @property({ attribute: \"on-mismatch\" })\n accessor onMismatch: \"unauthenticated\" | \"hidden\" = \"unauthenticated\";\n\n private warnedFor: string | null = null;\n\n protected override createRenderRoot() {\n // Light DOM: the host's own markup stays the host's, and the hidden\n // toggling below applies to real light-DOM children.\n return this;\n }\n\n /** The state this guard currently resolves to, after applying the predicate. */\n get activeState(): GuardState | \"hidden\" {\n const status = this.auth.state.status;\n\n if (status === \"loading\") return \"loading\";\n if (status !== \"authenticated\") return \"unauthenticated\";\n\n if (!this.predicate) return \"authenticated\";\n\n this.warnOnce(this.predicate);\n const user = this.auth.state.user;\n if (matchesPredicate(user, this.predicate)) return \"authenticated\";\n return this.onMismatch === \"hidden\" ? \"hidden\" : \"unauthenticated\";\n }\n\n /** Surfaces a malformed predicate once, rather than silently never matching. */\n private warnOnce(predicate: Predicate) {\n const key = JSON.stringify(predicate);\n if (this.warnedFor === key) return;\n this.warnedFor = key;\n for (const problem of validatePredicate(predicate)) {\n console.warn(`[singlebase] <singlebase-authui-guard> predicate: ${problem}`);\n }\n }\n\n override render() {\n const active = this.activeState;\n\n if (this.slot) {\n // Short form: the whole guard is shown or hidden as one unit.\n const show = GUARD_STATES.includes(this.slot as GuardState) && this.slot === active;\n this.toggleAttribute(\"hidden\", !show);\n return html`<slot></slot>`;\n }\n\n this.toggleAttribute(\"hidden\", false);\n for (const child of Array.from(this.children)) {\n const childSlot = child.getAttribute(\"slot\");\n child.toggleAttribute(\"hidden\", childSlot !== active);\n }\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"singlebase-authui-guard\": SinglebaseAuthGuard;\n }\n}\n","import { css, html, nothing, type PropertyValues } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { getPath } from \"@singlebase/core\";\nimport { SinglebaseElementBase } from \"./authui-base.js\";\nimport { initialsOf } from \"../utils/profile.js\";\n\n/** Where the avatar looks for its image when no path is given. */\nconst DEFAULT_AVATAR_PATH = \"profile_photo\";\n\n/**\n * Displays one value from the signed-in profile, as text or as an avatar.\n *\n * Hello <singlebase-authui-display path=\"first_name\" fallback=\"there\"></singlebase-authui-display>\n * <singlebase-authui-display avatar></singlebase-authui-display>\n *\n * Three rules shape the behaviour:\n *\n * - While auth state is still loading it renders nothing. Showing the\n * fallback first would mean every signed-in visitor watches \"Hello there\"\n * flip to \"Hello Ada\" on each page load.\n * - Values resolve against `user_profile` and nothing else. The element\n * deliberately cannot reach session or token data, which must never be\n * written into the DOM.\n * - Values are rendered as text, never as markup. Fields like first_name are\n * supplied by the user at signup, so they are untrusted by definition.\n */\n@customElement(\"singlebase-authui-display\")\nexport class SinglebaseAuthDisplay extends SinglebaseElementBase {\n static override styles = [\n ...SinglebaseElementBase.styles,\n css`\n /* Text sits in a sentence; an avatar is a box the host sizes. */\n :host {\n display: inline;\n }\n\n :host([avatar]) {\n display: inline-block;\n width: 42px;\n height: 42px;\n vertical-align: middle;\n }\n\n img,\n .initials {\n display: block;\n width: 100%;\n height: 100%;\n border-radius: inherit;\n box-sizing: border-box;\n }\n\n img {\n object-fit: cover;\n }\n\n /* Matches the avatar in the account view. */\n .initials {\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--sb-surface-alt, #fafafa);\n border: 1px dashed var(--sb-border, #e4e6e9);\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 0.8em;\n color: var(--sb-muted-ink, #61666c);\n user-select: none;\n }\n `\n ];\n\n /**\n * Dot-notated path into the profile: \"first_name\", \"metadata.tier\". In\n * avatar mode it names the image field and defaults to \"profile_photo\".\n */\n @property() accessor path = \"\";\n\n /** Shown when signed out, or when the value is empty. Text mode only. */\n @property() accessor fallback = \"\";\n\n /** Render an image with an initials fallback instead of text. */\n @property({ type: Boolean, reflect: true }) accessor avatar = false;\n\n /**\n * Alternative text for the avatar image. Left empty the image is treated as\n * decorative, which is right when a name sits beside it — pass a value only\n * when the avatar is the sole identifier.\n */\n @property() accessor alt = \"\";\n\n /** Set when the image 404s, so a dead URL falls back to initials. */\n @state() private accessor imageFailed = false;\n\n override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n // A new source deserves a fresh attempt.\n if (changed.has(\"path\") || changed.has(\"avatar\")) this.imageFailed = false;\n }\n\n private get profile() {\n const state = this.auth.state;\n return state.status === \"authenticated\" ? state.user : null;\n }\n\n /** The resolved value as a string, or \"\" when there is nothing to show. */\n private get textValue(): string {\n const profile = this.profile;\n if (!profile || !this.path) return \"\";\n\n const value = getPath(profile, this.path);\n if (value === null || value === undefined || value === \"\") return \"\";\n if (Array.isArray(value)) return value.filter((v) => v != null).join(\", \");\n // An object would stringify to \"[object Object]\"; treat it as absent.\n if (typeof value === \"object\") return \"\";\n return String(value);\n }\n\n private get avatarSrc(): string {\n const profile = this.profile;\n if (!profile) return \"\";\n const value = getPath(profile, this.path || DEFAULT_AVATAR_PATH);\n return typeof value === \"string\" ? value : \"\";\n }\n\n protected override render() {\n // Nothing at all until the session has been read — see the class comment.\n if (this.auth.state.status === \"loading\") return nothing;\n\n if (this.avatar) return this.renderAvatar();\n\n const value = this.textValue;\n if (value) return html`<span part=\"text\">${value}</span>`;\n return this.fallback ? html`<span part=\"text\">${this.fallback}</span>` : nothing;\n }\n\n private renderAvatar() {\n const profile = this.profile;\n if (!profile) return nothing;\n\n const src = this.avatarSrc;\n if (src && !this.imageFailed) {\n return html`<img\n part=\"avatar-image\"\n src=${src}\n alt=${this.alt}\n @error=${() => (this.imageFailed = true)}\n />`;\n }\n\n return html`<span\n part=\"avatar-initials\"\n class=\"initials\"\n aria-hidden=${this.alt ? \"false\" : \"true\"}\n >${initialsOf(profile)}</span\n >`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"singlebase-authui-display\": SinglebaseAuthDisplay;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},e=t=>(...e)=>({_$litDirective$:t,values:e});class i{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}}export{i as Directive,t as PartType,e as directive};\n//# sourceMappingURL=directive.js.map\n","import{_$LH as o}from\"./lit-html.js\";\n/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{I:t}=o,i=o=>o,n=o=>null===o||\"object\"!=typeof o&&\"function\"!=typeof o,e={HTML:1,SVG:2,MATHML:3},l=(o,t)=>void 0===t?void 0!==o?._$litType$:o?._$litType$===t,d=o=>null!=o?._$litType$?.h,c=o=>void 0!==o?._$litDirective$,f=o=>o?._$litDirective$,r=o=>void 0===o.strings,s=()=>document.createComment(\"\"),v=(o,n,e)=>{const l=o._$AA.parentNode,d=void 0===n?o._$AB:n._$AA;if(void 0===e){const i=l.insertBefore(s(),d),n=l.insertBefore(s(),d);e=new t(i,n,o,o.options)}else{const t=e._$AB.nextSibling,n=e._$AM,c=n!==o;if(c){let t;e._$AQ?.(o),e._$AM=o,void 0!==e._$AP&&(t=o._$AU)!==n._$AU&&e._$AP(t)}if(t!==d||c){let o=e._$AA;for(;o!==t;){const t=i(o).nextSibling;i(l).insertBefore(o,d),o=t}}}return e},u=(o,t,i=o)=>(o._$AI(t,i),o),m={},p=(o,t=m)=>o._$AH=t,M=o=>o._$AH,h=o=>{o._$AR(),o._$AA.remove()},j=o=>{o._$AR()};export{e as TemplateResultType,j as clearPart,M as getCommittedValue,f as getDirectiveClass,v as insertPart,d as isCompiledTemplateResult,c as isDirectiveResult,n as isPrimitive,r as isSingleExpression,l as isTemplateResult,h as removePart,u as setChildPartValue,p as setCommittedValue};\n//# sourceMappingURL=directive-helpers.js.map\n","import{noChange as e}from\"../lit-html.js\";import{directive as s,Directive as t,PartType as r}from\"../directive.js\";import{getCommittedValue as l,setChildPartValue as o,insertPart as i,removePart as n,setCommittedValue as f}from\"../directive-helpers.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst u=(e,s,t)=>{const r=new Map;for(let l=s;l<=t;l++)r.set(e[l],l);return r},c=s(class extends t{constructor(e){if(super(e),e.type!==r.CHILD)throw Error(\"repeat() can only be used in text expressions\")}dt(e,s,t){let r;void 0===t?t=s:void 0!==s&&(r=s);const l=[],o=[];let i=0;for(const s of e)l[i]=r?r(s,i):i,o[i]=t(s,i),i++;return{values:o,keys:l}}render(e,s,t){return this.dt(e,s,t).values}update(s,[t,r,c]){const d=l(s),{values:p,keys:a}=this.dt(t,r,c);if(!Array.isArray(d))return this.ut=a,p;const h=this.ut??=[],v=[];let m,y,x=0,j=d.length-1,k=0,w=p.length-1;for(;x<=j&&k<=w;)if(null===d[x])x++;else if(null===d[j])j--;else if(h[x]===a[k])v[k]=o(d[x],p[k]),x++,k++;else if(h[j]===a[w])v[w]=o(d[j],p[w]),j--,w--;else if(h[x]===a[w])v[w]=o(d[x],p[w]),i(s,v[w+1],d[x]),x++,w--;else if(h[j]===a[k])v[k]=o(d[j],p[k]),i(s,d[x],d[j]),j--,k++;else if(void 0===m&&(m=u(a,k,w),y=u(h,x,j)),m.has(h[x]))if(m.has(h[j])){const e=y.get(a[k]),t=void 0!==e?d[e]:null;if(null===t){const e=i(s,d[x]);o(e,p[k]),v[k]=e}else v[k]=o(t,p[k]),i(s,d[x],t),d[e]=null;k++}else n(d[j]),j--;else n(d[x]),x++;for(;k<=w;){const e=i(s,v[w+1]);o(e,p[k]),v[k++]=e}for(;x<=j;){const e=d[x++];null!==e&&n(e)}return this.ut=a,f(s,v),e}});export{c as repeat};\n//# sourceMappingURL=repeat.js.map\n","import { css } from \"lit\";\n\n/**\n * The glow's rotating angle has to be a registered custom property to\n * animate, and registration only works at document level, not in a shadow\n * root's stylesheet. Registering twice throws, which is fine to ignore.\n */\nif (typeof CSS !== \"undefined\" && \"registerProperty\" in CSS) {\n try {\n CSS.registerProperty({\n name: \"--sb-ai-angle\",\n syntax: \"<angle>\",\n inherits: false,\n initialValue: \"0deg\"\n });\n } catch {\n /* already registered */\n }\n}\n\n/**\n * <singlebase-chat> styles. Every colour comes from the shared --sb-* tokens\n * (plus --sb-hover, --sb-ink-2 and --sb-divider, which only the chat uses),\n * so a page themes the chat, the auth widget and the uploader in one place.\n */\nexport const chatStyles = css`\n :host {\n --c-ink: var(--sb-ink, #16181a);\n --c-ink2: var(--sb-ink-2, #41464b);\n --c-muted: var(--sb-muted-ink, #61666c);\n --c-faint: #8a8f95;\n --c-bg: var(--sb-surface, #ffffff);\n --c-bg2: var(--sb-surface-alt, #fafafa);\n --c-hover: var(--sb-hover, #f2f3f4);\n --c-line: var(--sb-border, #e4e6e9);\n --c-line2: var(--sb-divider, #ecedee);\n --c-strong: var(--sb-border-strong, #cdd1d6);\n --c-brand: var(--sb-accent, #16181a);\n --c-on-brand: var(--sb-on-accent, #ffffff);\n --c-danger: var(--sb-danger, #b4231a);\n --c-ok: var(--sb-ok, #0f6b4a);\n --c-mono: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n --c-r: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n --c-r2: calc(var(--c-r) * 1.5);\n --c-r3: calc(var(--c-r) * 2);\n --c-r4: calc(var(--c-r) * 3);\n --c-glow: 0.6;\n --c-conic: conic-gradient(\n from var(--sb-ai-angle, 0deg),\n oklch(0.72 0.15 295),\n oklch(0.74 0.13 245),\n oklch(0.8 0.11 190),\n oklch(0.84 0.12 85),\n oklch(0.78 0.12 350),\n oklch(0.72 0.15 295)\n );\n --c-z: var(--sb-chat-z, 1000);\n display: block;\n height: 100%;\n min-height: 0;\n color-scheme: light;\n }\n\n :host([theme=\"dark\"]) {\n --sb-hover: #24272b;\n --sb-ink-2: #c9ccd0;\n --sb-divider: #26292d;\n --c-faint: #7c8187;\n color-scheme: dark;\n }\n\n :host([glow=\"vivid\"]) {\n --c-glow: 1;\n }\n\n :host([embed=\"inline\"]) {\n height: auto;\n }\n\n :host([embed=\"launcher\"]) {\n height: 0;\n }\n\n * {\n box-sizing: border-box;\n }\n\n button {\n font: inherit;\n color: inherit;\n }\n\n button:focus-visible,\n input:focus-visible,\n textarea:focus-visible,\n [role=\"button\"]:focus-visible {\n outline: 2px solid var(--c-ink);\n outline-offset: 1px;\n }\n\n .mono {\n font-family: var(--c-mono);\n }\n\n .label {\n font-family: var(--c-mono);\n font-size: 11px;\n letter-spacing: 0.07em;\n text-transform: uppercase;\n color: var(--c-muted);\n }\n\n /* ── frames ───────────────────────────────────────────── */\n\n .frame {\n position: relative;\n display: flex;\n height: 100%;\n min-height: 0;\n background: var(--c-bg);\n color: var(--c-ink);\n overflow: hidden;\n }\n\n .frame.boxed {\n border: 1px solid var(--c-line);\n border-radius: var(--c-r4);\n }\n\n .frame.inline {\n width: 440px;\n height: 660px;\n min-width: 340px;\n min-height: 480px;\n max-width: 100%;\n resize: both;\n box-shadow: 0 1px 2px rgba(22, 24, 26, 0.06);\n }\n\n @media (max-width: 559px) {\n .frame.inline {\n width: 100%;\n min-width: 0;\n resize: none;\n }\n }\n\n .frame.launcher {\n position: fixed;\n bottom: 96px;\n right: 24px;\n z-index: var(--c-z);\n width: 420px;\n height: min(680px, calc(100vh - 120px));\n max-width: calc(100vw - 48px);\n box-shadow: 0 24px 60px -24px rgba(22, 24, 26, 0.35);\n transform-origin: bottom right;\n animation: scaleIn 0.2s ease-out;\n }\n\n :host([position=\"left\"]) .frame.launcher {\n right: auto;\n left: 24px;\n transform-origin: bottom left;\n }\n\n .frame.expanded {\n position: fixed;\n inset: 24px;\n width: auto;\n height: auto;\n max-width: none;\n z-index: var(--c-z);\n resize: none;\n box-shadow: 0 24px 60px -24px rgba(22, 24, 26, 0.35);\n animation: scaleIn 0.2s ease-out;\n }\n\n .frame.full {\n position: fixed;\n inset: 0;\n width: auto;\n height: auto;\n max-width: none;\n border-radius: 0;\n border: none;\n z-index: var(--c-z);\n resize: none;\n }\n\n .root {\n position: relative;\n display: flex;\n flex: 1;\n min-width: 0;\n min-height: 0;\n font-family: var(--sb-font, \"Geist\", -apple-system, \"Segoe UI\", Helvetica, sans-serif);\n background: var(--c-bg);\n color: var(--c-ink);\n }\n\n /* ── launcher ─────────────────────────────────────────── */\n\n .launcher-btn {\n position: fixed;\n bottom: 24px;\n right: 24px;\n z-index: calc(var(--c-z) + 1);\n width: 56px;\n height: 56px;\n border-radius: 999px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n cursor: pointer;\n background: var(--c-brand);\n color: var(--c-on-brand);\n box-shadow: 0 12px 28px -10px rgba(22, 24, 26, 0.45);\n }\n\n :host([position=\"left\"]) .launcher-btn,\n :host([position=\"left\"]) .bubble {\n right: auto;\n left: 24px;\n }\n\n .badge {\n position: absolute;\n top: 2px;\n right: 2px;\n width: 12px;\n height: 12px;\n border-radius: 999px;\n background: var(--c-danger);\n border: 2px solid var(--c-bg);\n }\n\n .bubble {\n position: fixed;\n bottom: 96px;\n right: 24px;\n z-index: var(--c-z);\n width: 260px;\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 12px 10px 12px 14px;\n background: var(--c-bg);\n color: var(--c-ink);\n border: 1px solid var(--c-line);\n border-radius: calc(var(--c-r) * 2.5);\n box-shadow: 0 12px 32px -12px rgba(22, 24, 26, 0.25);\n font-family: var(--sb-font, \"Geist\", -apple-system, \"Segoe UI\", Helvetica, sans-serif);\n animation: aiIn 0.25s ease-out;\n }\n\n .bubble-text {\n flex: 1;\n min-width: 0;\n text-align: left;\n font-size: 13.5px;\n line-height: 1.45;\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n }\n\n /* ── icon buttons ─────────────────────────────────────── */\n\n .icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 28px;\n height: 28px;\n padding: 0;\n border: none;\n border-radius: var(--c-r);\n background: transparent;\n color: var(--c-muted);\n cursor: pointer;\n }\n\n .icon:hover:not(:disabled),\n .icon.on {\n color: var(--c-ink);\n }\n\n .icon:hover:not(:disabled) {\n background: var(--c-hover);\n }\n\n .icon.danger:hover:not(:disabled) {\n color: var(--c-danger);\n }\n\n .icon:disabled {\n opacity: 0.4;\n cursor: default;\n }\n\n .icon.sm {\n width: 24px;\n height: 24px;\n }\n\n svg.i {\n width: 16px;\n height: 16px;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n\n svg.i.filled path {\n fill: currentColor;\n }\n\n @media (pointer: coarse) {\n .icon {\n width: 44px;\n height: 44px;\n }\n }\n\n /* ── sidebar ──────────────────────────────────────────── */\n\n .scrim {\n position: absolute;\n inset: 0;\n z-index: 29;\n background: rgba(22, 24, 26, 0.18);\n }\n\n .sidebar {\n display: flex;\n flex-direction: column;\n min-height: 0;\n min-width: 0;\n background: var(--c-bg2);\n border-right: 1px solid var(--c-line);\n }\n\n .sidebar.docked {\n position: relative;\n flex: 0 0 272px;\n width: 272px;\n }\n\n .sidebar.overlay {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n z-index: 30;\n width: min(280px, 86%);\n box-shadow: 12px 0 32px -16px rgba(22, 24, 26, 0.25);\n animation: slideIn 0.15s ease-out;\n }\n\n .side-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 14px 12px 10px 16px;\n }\n\n .side-tools {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 0 12px 8px;\n }\n\n .new-chat {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n min-height: 34px;\n font-size: 13px;\n font-weight: 500;\n color: var(--c-on-brand);\n background: var(--c-brand);\n border: 1px solid var(--c-brand);\n border-radius: var(--c-r2);\n padding: 8px 12px;\n cursor: pointer;\n }\n\n .new-chat:hover {\n filter: brightness(1.2);\n }\n\n .search {\n width: 100%;\n font: inherit;\n font-size: 13px;\n color: var(--c-ink);\n background: var(--c-bg);\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n padding: 8px 10px;\n outline: none;\n }\n\n .search:focus {\n border-color: var(--c-ink);\n }\n\n .threads {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 1px;\n padding: 4px 12px 12px;\n }\n\n .group {\n font-family: var(--c-mono);\n font-size: 11px;\n letter-spacing: 0.07em;\n text-transform: uppercase;\n color: var(--c-muted);\n padding: 10px 8px 6px;\n }\n\n .thread {\n display: flex;\n align-items: center;\n gap: 4px;\n min-height: 34px;\n width: 100%;\n font-size: 13px;\n color: var(--c-ink);\n border-radius: var(--c-r2);\n padding: 3px 4px 3px 10px;\n cursor: pointer;\n }\n\n .thread:hover {\n background: var(--c-hover);\n }\n\n .thread.active {\n background: var(--c-line2);\n font-weight: 500;\n }\n\n .thread-title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .thread-actions {\n display: none;\n gap: 0;\n }\n\n .thread:hover .thread-actions,\n .thread:focus-within .thread-actions {\n display: flex;\n }\n\n .thread-rename {\n flex: 1;\n min-width: 0;\n font: inherit;\n color: var(--c-ink);\n background: var(--c-bg);\n border: 1px solid var(--c-ink);\n border-radius: var(--c-r);\n padding: 3px 6px;\n outline: none;\n }\n\n .side-extra {\n display: none;\n }\n\n .side-extra.filled {\n display: block;\n padding: 12px 16px;\n border-top: 1px solid var(--c-line);\n font-size: 12.5px;\n }\n\n .side-note {\n font-size: 12.5px;\n color: var(--c-muted);\n padding: 6px 10px;\n }\n\n .skeleton {\n height: 28px;\n margin: 3px 0;\n border-radius: var(--c-r2);\n background: linear-gradient(90deg, var(--c-hover) 0%, var(--c-line2) 50%, var(--c-hover) 100%);\n background-size: 200% 100%;\n animation: aiShimmer 1.6s linear infinite;\n }\n\n /* ── main column ──────────────────────────────────────── */\n\n .main {\n container: chat / inline-size;\n position: relative;\n flex: 1;\n min-width: 0;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n min-height: 52px;\n padding: 10px 8px 10px 12px;\n border-bottom: 1px solid var(--c-line);\n }\n\n .header-left {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n }\n\n .header-right {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n gap: 2px;\n }\n\n .title {\n min-width: 0;\n font-size: 14px;\n font-weight: 600;\n letter-spacing: -0.01em;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n background: none;\n border: none;\n padding: 2px 4px;\n border-radius: var(--c-r);\n cursor: text;\n animation: aiIn 0.25s ease-out;\n }\n\n .title:hover:not(:disabled) {\n background: var(--c-hover);\n }\n\n .title:disabled {\n cursor: default;\n }\n\n .title-input {\n min-width: 0;\n width: 320px;\n max-width: 100%;\n font: inherit;\n font-size: 14px;\n font-weight: 600;\n color: var(--c-ink);\n background: var(--c-bg);\n border: 1px solid var(--c-ink);\n border-radius: var(--c-r);\n padding: 2px 6px;\n outline: none;\n }\n\n .divider {\n width: 1px;\n height: 18px;\n background: var(--c-line);\n margin: 0 4px;\n }\n\n .menu-wrap {\n position: relative;\n }\n\n .menu-scrim {\n position: fixed;\n inset: 0;\n z-index: 40;\n }\n\n .menu {\n position: absolute;\n right: 0;\n top: 34px;\n z-index: 41;\n width: 220px;\n display: flex;\n flex-direction: column;\n padding: 4px;\n background: var(--c-bg);\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n box-shadow: 0 12px 32px -12px rgba(22, 24, 26, 0.22);\n animation: aiIn 0.15s ease-out;\n }\n\n .menu .label {\n font-size: 10.5px;\n padding: 8px 10px 6px;\n }\n\n .menu-item {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 10px;\n width: 100%;\n text-align: left;\n font-size: 13px;\n background: none;\n border: none;\n border-radius: var(--c-r);\n padding: 8px 10px;\n cursor: pointer;\n }\n\n .menu-item:hover {\n background: var(--c-hover);\n }\n\n .menu-item .ext {\n font-family: var(--c-mono);\n font-size: 11px;\n color: var(--c-muted);\n }\n\n .scroller {\n position: relative;\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n }\n\n .banner {\n margin: 10px 16px 0;\n padding: 8px 12px;\n font-size: 12.5px;\n color: var(--c-ink2);\n background: var(--c-bg2);\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n }\n\n /* ── welcome ──────────────────────────────────────────── */\n\n .welcome-slot {\n min-height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n\n ::slotted([slot=\"welcome\"]) {\n box-sizing: border-box;\n width: 100%;\n max-width: 640px;\n margin: 0 auto;\n padding: 28px 18px;\n }\n\n .welcome {\n max-width: 640px;\n min-height: 100%;\n margin: 0 auto;\n display: flex;\n flex-direction: column;\n justify-content: center;\n gap: 20px;\n padding: 28px 18px;\n }\n\n .welcome-head {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .welcome-logo {\n width: 32px;\n height: 32px;\n object-fit: contain;\n border-radius: var(--c-r2);\n }\n\n .welcome h2 {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n letter-spacing: -0.01em;\n }\n\n .welcome p {\n margin: 0;\n font-size: 14px;\n line-height: 1.55;\n color: var(--c-muted);\n text-wrap: pretty;\n }\n\n .prompts {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 8px;\n }\n\n .prompt {\n display: flex;\n flex-direction: column;\n gap: 4px;\n text-align: left;\n background: var(--c-bg);\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n padding: 12px 14px;\n cursor: pointer;\n transition:\n border-color 0.15s,\n box-shadow 0.15s;\n }\n\n .prompt:hover {\n border-color: var(--c-ink);\n box-shadow: 0 6px 18px -10px rgba(22, 24, 26, 0.25);\n }\n\n .prompt .label {\n font-size: 10.5px;\n letter-spacing: 0.06em;\n }\n\n .prompt-text {\n font-size: 13.5px;\n font-weight: 500;\n line-height: 1.4;\n }\n\n @container chat (max-width: 480px) {\n .prompts {\n grid-template-columns: minmax(0, 1fr);\n }\n }\n\n /* ── messages ─────────────────────────────────────────── */\n\n .thread-view {\n max-width: 760px;\n margin: 0 auto;\n display: flex;\n flex-direction: column;\n gap: 30px;\n padding: 20px 16px 28px;\n }\n\n .msg {\n position: relative;\n display: flex;\n flex-direction: column;\n border-radius: var(--c-r3);\n }\n\n .msg.user {\n align-self: flex-end;\n max-width: 80%;\n align-items: flex-end;\n gap: 6px;\n margin-bottom: -22px;\n animation: aiIn 0.25s ease-out;\n }\n\n .bubble-user {\n padding: 10px 14px;\n font-size: 14.5px;\n line-height: 1.6;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n background: var(--c-hover);\n border-radius: calc(var(--c-r) * 2.5) calc(var(--c-r) * 2.5) 2px calc(var(--c-r) * 2.5);\n }\n\n .attachments {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: 6px;\n }\n\n .doc-chip {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 6px 10px;\n font-size: 12.5px;\n border-radius: var(--c-r2);\n border: 1px solid var(--c-line);\n background: var(--c-bg);\n }\n\n .doc-chip .ext {\n font-family: var(--c-mono);\n font-size: 10px;\n letter-spacing: 0.04em;\n color: var(--c-muted);\n }\n\n .doc-chip .name {\n max-width: 180px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .toolbar {\n display: flex;\n align-items: center;\n gap: 2px;\n opacity: 0;\n transition: opacity 0.15s;\n }\n\n .msg:hover .toolbar,\n .msg:focus-within .toolbar,\n .toolbar.pinned {\n opacity: 1;\n }\n\n @media (hover: none) {\n .toolbar {\n opacity: 1;\n }\n }\n\n .msg.bot .toolbar {\n margin-left: -6px;\n }\n\n .time {\n font-family: var(--c-mono);\n font-size: 11px;\n color: var(--c-faint);\n padding: 0 6px;\n font-variant-numeric: tabular-nums;\n }\n\n .note {\n font-size: 12px;\n color: var(--c-muted);\n }\n\n .spacer {\n flex: 1;\n }\n\n .saved {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-family: var(--c-mono);\n font-size: 10.5px;\n letter-spacing: 0.05em;\n text-transform: uppercase;\n color: var(--c-ink);\n }\n\n .saved svg {\n width: 12px;\n height: 12px;\n fill: currentColor;\n stroke: currentColor;\n stroke-width: 1.5;\n }\n\n .bot-body {\n position: relative;\n z-index: 1;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .edit-box {\n width: 440px;\n max-width: 100%;\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 8px;\n border: 1px solid var(--c-ink);\n border-radius: var(--c-r3);\n background: var(--c-bg);\n }\n\n .edit-box textarea {\n width: 100%;\n resize: vertical;\n font: inherit;\n font-size: 14px;\n line-height: 1.5;\n color: var(--c-ink);\n background: transparent;\n border: none;\n outline: none;\n padding: 4px;\n }\n\n .row-end {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n }\n\n .btn {\n font-size: 12.5px;\n font-weight: 500;\n border-radius: var(--c-r);\n padding: 6px 12px;\n cursor: pointer;\n background: transparent;\n color: var(--c-muted);\n border: 1px solid var(--c-line);\n }\n\n .btn:hover {\n color: var(--c-ink);\n background: var(--c-bg2);\n }\n\n .btn.primary {\n background: var(--c-brand);\n color: var(--c-on-brand);\n border-color: var(--c-brand);\n }\n\n .btn.primary:hover {\n filter: brightness(1.2);\n }\n\n .error-card {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 10px 12px;\n font-size: 13px;\n color: var(--c-danger);\n border: 1px solid var(--sb-danger-border, #f3d6d3);\n background: var(--sb-danger-bg, #fdf1f0);\n border-radius: var(--c-r2);\n }\n\n .followups {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 6px;\n }\n\n .followup {\n display: inline-flex;\n align-items: baseline;\n gap: 8px;\n text-align: left;\n font-size: 13px;\n background: var(--c-bg);\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n padding: 6px 12px;\n cursor: pointer;\n animation: aiIn 0.25s ease-out;\n }\n\n .followup:hover {\n background: var(--c-hover);\n }\n\n .followup .arrow {\n font-family: var(--c-mono);\n color: var(--c-muted);\n }\n\n .jump {\n position: absolute;\n left: 50%;\n bottom: 8px;\n transform: translateX(-50%);\n z-index: 5;\n font-size: 12.5px;\n font-weight: 500;\n color: var(--c-on-brand);\n background: var(--c-brand);\n border: none;\n border-radius: 999px;\n padding: 6px 14px;\n cursor: pointer;\n box-shadow: 0 8px 20px -10px rgba(22, 24, 26, 0.4);\n animation: aiIn 0.2s ease-out;\n }\n\n /* ── rendered answer ──────────────────────────────────── */\n\n .answer {\n display: flex;\n flex-direction: column;\n gap: 14px;\n font-size: 14.5px;\n line-height: 1.7;\n }\n\n .answer p {\n margin: 0;\n text-wrap: pretty;\n overflow-wrap: anywhere;\n }\n\n .answer .raw {\n white-space: pre-wrap;\n }\n\n .answer h3 {\n margin: 6px 0 0;\n font-size: 15.5px;\n font-weight: 600;\n letter-spacing: -0.01em;\n line-height: 1.4;\n }\n\n .answer ul,\n .answer ol {\n margin: 0;\n padding-left: 20px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .answer li {\n line-height: 1.65;\n padding-left: 2px;\n }\n\n .answer strong {\n font-weight: 600;\n }\n\n .answer a {\n color: var(--c-ink);\n text-underline-offset: 3px;\n }\n\n .answer code.inline {\n font-family: var(--c-mono);\n font-size: 12.5px;\n background: var(--c-hover);\n border-radius: calc(var(--c-r) * 0.75);\n padding: 1px 5px;\n }\n\n .answer h3.h1 {\n font-size: 18px;\n }\n\n .answer h3.h2 {\n font-size: 16.5px;\n }\n\n .answer h3.h4 {\n font-size: 14.5px;\n }\n\n .answer hr {\n width: 100%;\n border: none;\n border-top: 1px solid var(--c-line);\n margin: 4px 0;\n }\n\n .answer li.task {\n list-style: none;\n margin-left: -18px;\n }\n\n .answer li.task input {\n margin: 0 6px 0 0;\n vertical-align: -1px;\n accent-color: var(--c-brand);\n }\n\n .callout {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 13.5px;\n line-height: 1.6;\n padding: 10px 14px;\n border: 1px solid var(--c-line);\n border-left: 3px solid var(--callout, var(--c-ink));\n border-radius: var(--c-r2);\n background: color-mix(in srgb, var(--callout, var(--c-ink)) 7%, var(--c-bg));\n }\n\n .callout-title {\n font-weight: 600;\n color: var(--callout, var(--c-ink));\n }\n\n .callout.note {\n --callout: oklch(0.55 0.15 255);\n }\n\n .callout.tip {\n --callout: oklch(0.55 0.12 160);\n }\n\n .callout.important {\n --callout: oklch(0.52 0.17 300);\n }\n\n .callout.warning {\n --callout: oklch(0.6 0.14 70);\n }\n\n .callout.caution {\n --callout: var(--c-danger);\n }\n\n .jtree {\n padding: 10px 14px;\n overflow-x: auto;\n font-family: var(--c-mono);\n font-size: 12.5px;\n line-height: 1.7;\n }\n\n .jtree summary {\n cursor: pointer;\n list-style-position: outside;\n }\n\n .jkids {\n padding-left: 16px;\n border-left: 1px solid var(--c-line);\n margin-left: 4px;\n }\n\n .jkey {\n color: var(--c-ink2);\n }\n\n .jmeta {\n color: var(--c-muted);\n }\n\n .jv.string {\n color: oklch(0.52 0.12 160);\n }\n\n .jv.number {\n color: oklch(0.55 0.15 255);\n }\n\n .jv.boolean,\n .jv.null {\n color: oklch(0.52 0.17 300);\n }\n\n .table th button.sort {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font: inherit;\n color: inherit;\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n }\n\n .table th .arrow {\n font-size: 10px;\n opacity: 0.5;\n }\n\n .table th[aria-sort=\"ascending\"] .arrow,\n .table th[aria-sort=\"descending\"] .arrow {\n opacity: 1;\n }\n\n .table-note {\n padding: 7px 12px;\n font-size: 12px;\n color: var(--c-muted);\n border-top: 1px solid var(--c-line2);\n background: var(--c-bg2);\n }\n\n figure.svg {\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n align-items: flex-start;\n }\n\n figure.svg img {\n display: block;\n width: min(100%, 480px);\n height: auto;\n max-height: 420px;\n object-fit: contain;\n padding: 12px;\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n background: #ffffff;\n }\n\n .custom-block {\n min-width: 0;\n }\n\n .quote {\n font-size: 13.5px;\n line-height: 1.6;\n color: var(--c-ink2);\n background: var(--c-bg2);\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n padding: 10px 14px;\n }\n\n .code {\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n overflow: hidden;\n background: var(--c-bg2);\n }\n\n .code-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 7px 12px;\n border-bottom: 1px solid var(--c-line);\n }\n\n .code-head .label {\n font-size: 11px;\n }\n\n .text-btn {\n font-size: 12px;\n color: var(--c-muted);\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n }\n\n .text-btn:hover {\n color: var(--c-ink);\n }\n\n .text-btn.underline {\n text-decoration: underline;\n text-underline-offset: 3px;\n }\n\n .code pre {\n margin: 0;\n padding: 12px 14px;\n overflow-x: auto;\n font-family: var(--c-mono);\n font-size: 13px;\n line-height: 1.6;\n }\n\n .table {\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n overflow-x: auto;\n }\n\n .table table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n font-variant-numeric: tabular-nums;\n }\n\n .table th {\n text-align: left;\n font-size: 12px;\n font-weight: 500;\n color: var(--c-muted);\n background: var(--c-bg2);\n border-bottom: 1px solid var(--c-line);\n padding: 9px 12px;\n white-space: nowrap;\n }\n\n .table td {\n padding: 9px 12px;\n border-top: 1px solid var(--c-line2);\n white-space: nowrap;\n }\n\n .table th:first-child,\n .table td:first-child {\n min-width: 120px;\n }\n\n .cite {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 17px;\n height: 17px;\n padding: 0 4px;\n margin: 0 1px 0 3px;\n vertical-align: 2px;\n font: 500 10px var(--c-mono);\n border-radius: calc(var(--c-r) * 0.75);\n cursor: pointer;\n border: 1px solid var(--c-strong);\n background: var(--c-hover);\n color: var(--c-ink);\n }\n\n .cite:hover,\n .cite.active {\n background: var(--c-ink);\n color: var(--c-bg);\n border-color: var(--c-ink);\n }\n\n .chart {\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 14px;\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n padding: 14px 16px 12px;\n background: var(--c-bg);\n }\n\n .chart-head {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n justify-content: space-between;\n gap: 8px 16px;\n }\n\n .chart-title {\n font-size: 13px;\n font-weight: 600;\n }\n\n .legend {\n display: flex;\n flex-wrap: wrap;\n gap: 4px 12px;\n }\n\n .legend span {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--c-ink2);\n }\n\n .swatch {\n width: 8px;\n height: 8px;\n border-radius: 2px;\n }\n\n .bars {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .bar-row {\n display: grid;\n grid-template-columns: 92px minmax(0, 1fr) 64px;\n align-items: center;\n gap: 12px;\n }\n\n .bar-label {\n font-size: 12.5px;\n color: var(--c-ink2);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .bar-track {\n display: flex;\n height: 12px;\n background: var(--c-hover);\n border-radius: 2px;\n overflow: hidden;\n }\n\n .bar-fill {\n display: flex;\n height: 100%;\n transform-origin: left;\n animation: aiGrow 0.8s cubic-bezier(0.2, 0.8, 0.2, 1);\n }\n\n .bar-value {\n font-family: var(--c-mono);\n font-size: 11.5px;\n text-align: right;\n font-variant-numeric: tabular-nums;\n }\n\n .line-chart {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding-left: 48px;\n }\n\n .plot {\n position: relative;\n height: 170px;\n }\n\n .tick {\n position: absolute;\n left: 0;\n right: 0;\n border-top: 1px dashed var(--c-line2);\n }\n\n .tick.base {\n border-top: 1px solid var(--c-strong);\n }\n\n .tick span,\n .x-labels span {\n font-family: var(--c-mono);\n font-size: 10.5px;\n color: var(--c-faint);\n white-space: nowrap;\n font-variant-numeric: tabular-nums;\n }\n\n .tick span {\n position: absolute;\n right: calc(100% + 8px);\n top: -7px;\n }\n\n .plot svg {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n overflow: visible;\n }\n\n .plot polyline {\n fill: none;\n stroke-width: 2;\n vector-effect: non-scaling-stroke;\n stroke-linejoin: round;\n stroke-linecap: round;\n stroke-dasharray: 1;\n animation: aiDraw 1s ease-out;\n }\n\n .x-labels {\n display: flex;\n justify-content: space-between;\n gap: 4px;\n }\n\n .chart-pending {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 190px;\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n background: linear-gradient(90deg, var(--c-bg2) 0%, var(--c-hover) 50%, var(--c-bg2) 100%);\n background-size: 200% 100%;\n animation: aiShimmer 1.6s linear infinite;\n }\n\n .gallery {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: 10px;\n max-width: 520px;\n }\n\n .gallery.many {\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n max-width: 100%;\n }\n\n .gallery figure {\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n }\n\n .gallery img {\n width: 100%;\n aspect-ratio: 16 / 10;\n max-height: 320px;\n object-fit: contain;\n border-radius: var(--c-r2);\n border: 1px solid var(--c-line);\n background: var(--c-bg2);\n }\n\n .img-missing {\n aspect-ratio: 16 / 9;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--c-r2);\n border: 1px dashed var(--c-strong);\n background: repeating-linear-gradient(135deg, var(--c-bg2) 0 10px, var(--c-hover) 10px 20px);\n }\n\n figcaption {\n font-family: var(--c-mono);\n font-size: 11px;\n color: var(--c-muted);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .caret {\n display: inline-block;\n width: 7px;\n height: 15px;\n margin-top: -6px;\n background: var(--c-brand);\n animation: rgcaret 1s steps(1) infinite;\n }\n\n /* ── sources ──────────────────────────────────────────── */\n\n .retrieval {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n background: var(--c-bg2);\n }\n\n .retrieval-toggle {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n text-align: left;\n font-size: 12.5px;\n color: var(--c-ink2);\n background: none;\n border: none;\n padding: 9px 12px;\n cursor: pointer;\n }\n\n .retrieval-toggle .chev,\n .retrieval-toggle .ms {\n font-family: var(--c-mono);\n font-size: 11px;\n color: var(--c-muted);\n }\n\n .retrieval-list {\n display: flex;\n flex-direction: column;\n border-top: 1px solid var(--c-line);\n padding: 4px 12px;\n }\n\n .passage {\n display: grid;\n grid-template-columns: 22px minmax(0, 1fr) 64px;\n align-items: center;\n gap: 10px;\n width: 100%;\n text-align: left;\n background: none;\n border: none;\n border-bottom: 1px solid var(--c-line2);\n padding: 8px 0;\n cursor: pointer;\n }\n\n .passage:last-child {\n border-bottom: none;\n }\n\n .passage .n,\n .passage .score {\n font-family: var(--c-mono);\n font-size: 11px;\n color: var(--c-muted);\n font-variant-numeric: tabular-nums;\n }\n\n .passage .what {\n display: flex;\n flex-direction: column;\n gap: 1px;\n min-width: 0;\n }\n\n .passage .what span:first-child {\n font-size: 12.5px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .passage .what span:last-child {\n font-size: 11.5px;\n color: var(--c-muted);\n }\n\n .relevance {\n display: flex;\n flex-direction: column;\n gap: 3px;\n align-items: flex-end;\n }\n\n .relevance-track {\n width: 64px;\n height: 3px;\n background: var(--c-line);\n border-radius: 99px;\n overflow: hidden;\n }\n\n .relevance-fill {\n display: block;\n height: 100%;\n background: var(--c-brand);\n }\n\n .cards {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .card-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n gap: 8px;\n }\n\n .source-card {\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n text-align: left;\n padding: 10px 12px;\n border-radius: var(--c-r2);\n cursor: pointer;\n background: var(--c-bg);\n border: 1px solid var(--c-line);\n }\n\n .source-card:hover,\n .source-card.active {\n border-color: var(--c-ink);\n }\n\n .source-card .top {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n }\n\n .num {\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: calc(var(--c-r) * 0.75);\n border: 1px solid var(--c-strong);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-family: var(--c-mono);\n font-size: 10px;\n background: var(--c-bg);\n }\n\n .source-card .t {\n font-size: 13px;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .source-card .s {\n font-size: 12px;\n line-height: 1.45;\n color: var(--c-muted);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .panel {\n display: flex;\n flex-direction: column;\n min-height: 0;\n min-width: 0;\n background: var(--c-bg);\n border-left: 1px solid var(--c-line);\n animation: aiIn 0.15s ease-out;\n }\n\n .panel.docked {\n position: relative;\n flex: 0 0 400px;\n width: 400px;\n }\n\n .panel.overlay {\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: 30;\n width: min(420px, 100%);\n box-shadow: -12px 0 32px -16px rgba(22, 24, 26, 0.25);\n }\n\n .panel-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 14px 18px;\n border-bottom: 1px solid var(--c-line);\n }\n\n .panel-body {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 18px;\n }\n\n .panel-body h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n letter-spacing: -0.01em;\n }\n\n .panel-meta {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .panel-meta .path {\n font-family: var(--c-mono);\n font-size: 11px;\n color: var(--c-muted);\n overflow-wrap: anywhere;\n }\n\n .panel-meta .meta {\n font-size: 12px;\n color: var(--c-muted);\n }\n\n .passage-box {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px 14px;\n border-radius: var(--c-r2);\n background: var(--c-hover);\n border: 1px solid var(--c-strong);\n }\n\n .passage-box .text {\n font-size: 13px;\n line-height: 1.6;\n color: var(--c-ink2);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n }\n\n .passage-foot {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--c-line);\n }\n\n .copy-ref {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n background: var(--c-bg);\n border: 1px solid var(--c-line);\n border-radius: var(--c-r);\n padding: 4px 8px;\n cursor: pointer;\n }\n\n .copy-ref:hover {\n border-color: var(--c-strong);\n }\n\n .panel-foot {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 12px 18px 16px;\n border-top: 1px solid var(--c-line);\n }\n\n .chips {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n }\n\n .chip {\n font-size: 12px;\n background: var(--c-bg);\n border: 1px solid var(--c-line);\n border-radius: var(--c-r);\n padding: 4px 8px;\n cursor: pointer;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .chip:hover {\n border-color: var(--c-ink);\n }\n\n /* ── composer ─────────────────────────────────────────── */\n\n .composer-wrap {\n padding: 0 12px 12px;\n }\n\n .composer-wrap.reader {\n padding-top: 10px;\n }\n\n .composer-col {\n max-width: 760px;\n margin: 0 auto;\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .composer-box {\n position: relative;\n }\n\n .composer {\n position: relative;\n z-index: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 8px;\n border-radius: calc(var(--c-r) * 2.25);\n background: var(--c-bg);\n border: 1px solid var(--c-strong);\n box-shadow:\n 0 1px 2px rgba(22, 24, 26, 0.04),\n 0 12px 32px -18px rgba(22, 24, 26, 0.22);\n transition: border-color 0.15s;\n }\n\n .composer:focus-within {\n border-color: var(--c-ink);\n }\n\n .composer.busy {\n border-color: transparent;\n }\n\n :host([glow=\"off\"]) .composer.busy {\n border-color: var(--c-strong);\n }\n\n .composer textarea {\n width: 100%;\n resize: none;\n font: inherit;\n font-size: 14.5px;\n line-height: 1.5;\n color: var(--c-ink);\n background: transparent;\n border: none;\n outline: none;\n padding: 6px 6px 2px;\n max-height: 176px;\n }\n\n .composer textarea::placeholder {\n color: var(--c-faint);\n }\n\n .composer-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n }\n\n .attach {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12.5px;\n color: var(--c-muted);\n background: none;\n border: none;\n border-radius: var(--c-r);\n padding: 6px 8px;\n cursor: pointer;\n }\n\n .attach:hover {\n background: var(--c-hover);\n color: var(--c-ink);\n }\n\n .send {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border-radius: var(--c-r2);\n border: 1px solid var(--c-brand);\n cursor: pointer;\n background: var(--c-brand);\n color: var(--c-on-brand);\n transition: background 0.15s;\n }\n\n .send:disabled {\n cursor: default;\n background: var(--c-line);\n border-color: var(--c-line);\n color: var(--c-faint);\n }\n\n .send.stop {\n background: var(--c-bg);\n color: var(--c-ink);\n border-color: var(--c-ink);\n }\n\n .send.stop svg {\n fill: currentColor;\n stroke: none;\n }\n\n .pending-files {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n padding: 2px 2px 4px;\n }\n\n .pending-file {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 4px 8px 4px 4px;\n font-size: 12.5px;\n border-radius: var(--c-r2);\n border: 1px solid var(--c-line);\n background: var(--c-bg2);\n animation: aiIn 0.2s ease-out;\n }\n\n .pending-file .ext {\n width: 28px;\n height: 28px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--c-r);\n background: var(--c-bg);\n border: 1px solid var(--c-line);\n font-family: var(--c-mono);\n font-size: 9px;\n letter-spacing: 0.03em;\n color: var(--c-muted);\n }\n\n .pending-file .meta {\n display: flex;\n flex-direction: column;\n gap: 1px;\n min-width: 0;\n }\n\n .pending-file.kept {\n background: var(--c-bg);\n border-style: dashed;\n }\n\n .pending-file .name {\n max-width: 160px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .pending-file .size {\n font-family: var(--c-mono);\n font-size: 10.5px;\n color: var(--c-muted);\n }\n\n .pending-file button {\n font-size: 15px;\n line-height: 1;\n color: var(--c-muted);\n background: none;\n border: none;\n padding: 0 0 0 2px;\n cursor: pointer;\n }\n\n .pending-file button:hover {\n color: var(--c-danger);\n }\n\n .footnote {\n text-align: center;\n font-size: 11.5px;\n color: var(--c-muted);\n }\n\n .branding {\n padding: 0 12px 10px;\n margin-top: -4px;\n }\n\n .toast {\n position: absolute;\n left: 50%;\n bottom: 124px;\n transform: translateX(-50%);\n z-index: 35;\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 9px 14px;\n background: var(--c-ink);\n color: var(--c-bg);\n font-size: 13px;\n border-radius: var(--c-r2);\n box-shadow: 0 12px 32px -12px rgba(22, 24, 26, 0.25);\n white-space: nowrap;\n animation: aiIn 0.2s ease-out;\n }\n\n .toast button {\n font-size: 13px;\n font-weight: 500;\n color: var(--c-bg);\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n text-decoration: underline;\n text-underline-offset: 3px;\n }\n\n .drop {\n position: absolute;\n inset: 10px;\n z-index: 36;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 6px;\n text-align: center;\n padding: 16px;\n border: 1.5px dashed var(--c-ink);\n border-radius: var(--c-r3);\n background: color-mix(in srgb, var(--c-bg) 92%, transparent);\n }\n\n .drop strong {\n font-size: 15px;\n font-weight: 600;\n }\n\n .drop span {\n font-size: 12.5px;\n color: var(--c-muted);\n }\n\n /* ── AI glow ──────────────────────────────────────────── */\n\n .halo {\n position: absolute;\n inset: -18px -24px;\n z-index: 0;\n pointer-events: none;\n opacity: var(--c-glow);\n }\n\n .halo::before {\n content: \"\";\n position: absolute;\n inset: 0;\n border-radius: 20px;\n background: var(--c-conic);\n filter: blur(32px);\n opacity: 0.45;\n animation:\n aiSpin 5s linear infinite,\n aiBreathe 2.6s ease-in-out infinite;\n }\n\n .arrived {\n position: absolute;\n inset: -12px -16px;\n z-index: 0;\n pointer-events: none;\n border-radius: var(--c-r4);\n animation: aiDone 2.6s ease-out forwards;\n }\n\n .arrived .wash {\n position: absolute;\n inset: 0;\n border-radius: inherit;\n background: var(--c-conic);\n filter: blur(26px);\n opacity: calc(0.22 * var(--c-glow) + 0.06);\n animation: aiSpin 2.6s linear infinite;\n }\n\n .ring {\n position: absolute;\n inset: 0;\n border-radius: inherit;\n padding: 1px;\n background: var(--c-conic);\n -webkit-mask:\n linear-gradient(#000 0 0) content-box,\n linear-gradient(#000 0 0);\n -webkit-mask-composite: xor;\n mask-composite: exclude;\n animation: aiSpin 2.6s linear infinite;\n pointer-events: none;\n }\n\n .arrived .sweep {\n position: absolute;\n inset: 0;\n border-radius: inherit;\n overflow: hidden;\n }\n\n .arrived .sweep::before {\n content: \"\";\n position: absolute;\n inset: 0;\n background: linear-gradient(\n 100deg,\n transparent 25%,\n oklch(0.88 0.07 260 / 0.5) 50%,\n transparent 75%\n );\n animation: aiSweep 1.6s cubic-bezier(0.3, 0.6, 0.3, 1) forwards;\n }\n\n .pill {\n position: relative;\n display: inline-flex;\n align-self: flex-start;\n align-items: center;\n gap: 9px;\n padding: 6px 14px 6px 10px;\n border-radius: 999px;\n background: var(--c-bg);\n box-shadow: 0 0 24px -6px oklch(0.7 0.15 280 / 0.5);\n animation: aiIn 0.25s ease-out;\n }\n\n .pill .ring {\n border-radius: 999px;\n animation-duration: 2.4s;\n }\n\n .pill .dot {\n width: 9px;\n height: 9px;\n border-radius: 50%;\n background: var(--c-conic);\n animation:\n aiSpin 1.6s linear infinite,\n aiPulse 1.6s ease-in-out infinite;\n }\n\n .pill .shimmer {\n font-size: 12.5px;\n font-weight: 500;\n background: linear-gradient(90deg, var(--c-faint) 0%, var(--c-ink) 45%, var(--c-faint) 90%);\n background-size: 200% 100%;\n -webkit-background-clip: text;\n background-clip: text;\n color: transparent;\n animation: aiShimmer 1.8s linear infinite;\n }\n\n .composer-glow {\n position: absolute;\n inset: -4px;\n z-index: 0;\n border-radius: var(--c-r4);\n background: var(--c-conic);\n filter: blur(14px);\n opacity: calc(0.32 + 0.23 * (var(--c-glow) - 0.6) / 0.4);\n animation: aiSpin 4s linear infinite;\n pointer-events: none;\n }\n\n .composer-ring {\n position: absolute;\n inset: 0;\n z-index: 2;\n border-radius: calc(var(--c-r) * 2.25);\n pointer-events: none;\n }\n\n .composer-ring .ring {\n animation-duration: 3s;\n }\n\n :host([glow=\"off\"]) .halo,\n :host([glow=\"off\"]) .arrived,\n :host([glow=\"off\"]) .composer-glow,\n :host([glow=\"off\"]) .composer-ring,\n :host([glow=\"off\"]) .pill .ring {\n display: none;\n }\n\n :host([glow=\"off\"]) .pill {\n box-shadow: inset 0 0 0 1px var(--c-line);\n }\n\n :host([glow=\"off\"]) .pill .dot {\n background: var(--c-ink);\n }\n\n @keyframes aiSpin {\n to {\n --sb-ai-angle: 360deg;\n }\n }\n\n @keyframes aiShimmer {\n from {\n background-position: 200% 0;\n }\n to {\n background-position: -200% 0;\n }\n }\n\n @keyframes aiBreathe {\n 0%,\n 100% {\n transform: scale(0.97);\n }\n 50% {\n transform: scale(1.03);\n }\n }\n\n @keyframes aiPulse {\n 0%,\n 100% {\n transform: scale(0.8);\n }\n 50% {\n transform: scale(1.15);\n }\n }\n\n @keyframes aiDone {\n 0% {\n opacity: 0;\n }\n 12% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n }\n\n @keyframes aiSweep {\n from {\n transform: translateX(-100%);\n }\n to {\n transform: translateX(100%);\n }\n }\n\n @keyframes aiIn {\n from {\n opacity: 0;\n transform: translateY(4px);\n }\n to {\n opacity: 1;\n transform: none;\n }\n }\n\n @keyframes scaleIn {\n from {\n opacity: 0;\n transform: translateY(12px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: none;\n }\n }\n\n @keyframes slideIn {\n from {\n opacity: 0;\n transform: translateX(-8px);\n }\n to {\n opacity: 1;\n transform: none;\n }\n }\n\n @keyframes aiGrow {\n from {\n transform: scaleX(0);\n }\n }\n\n @keyframes aiDraw {\n from {\n stroke-dashoffset: 1;\n }\n to {\n stroke-dashoffset: 0;\n }\n }\n\n @keyframes rgcaret {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n }\n .caret {\n display: none;\n }\n }\n\n @media print {\n .sidebar,\n .scrim,\n .header-right,\n .composer-wrap,\n .branding,\n .toolbar,\n .followups,\n .panel,\n .toast {\n display: none !important;\n }\n .frame,\n .scroller {\n overflow: visible;\n height: auto;\n }\n }\n`;\n","/**\n * Default copy for <singlebase-chat>. Same contract as the auth and upload\n * bags: flat strings, overridable in whole or in part through `.messages`.\n *\n * `{name}`, `{n}` and `{query}` are filled in by `fill()` from upload-messages.\n */\nexport interface SinglebaseChatMessages {\n // welcome, per mode\n eyebrowChat: string;\n eyebrowRag: string;\n headingChat: string;\n headingRag: string;\n descriptionChat: string;\n descriptionRag: string;\n eyebrowKb: string;\n headingKb: string;\n descriptionKb: string;\n\n // composer\n placeholderChat: string;\n placeholderRag: string;\n placeholderKb: string;\n footnote: string;\n attach: string;\n send: string;\n stop: string;\n removeFile: string;\n inThisChat: string;\n removeFromChat: string;\n attachmentFailed: string;\n dropTitle: string;\n dropSub: string;\n\n // status pills\n thinking: string;\n searching: string;\n\n // sidebar\n chats: string;\n newChat: string;\n searchChats: string;\n groupBookmarked: string;\n groupToday: string;\n groupYesterday: string;\n groupWeek: string;\n groupOlder: string;\n noChats: string;\n noMatch: string;\n loadingChats: string;\n showChats: string;\n hideSidebar: string;\n\n // header\n untitled: string;\n renameChat: string;\n bookmarkChat: string;\n unbookmarkChat: string;\n exportChat: string;\n deleteChat: string;\n expand: string;\n restore: string;\n minimize: string;\n\n // export menu\n exportHeading: string;\n exportMarkdown: string;\n exportJson: string;\n exportText: string;\n exportCopy: string;\n\n // message toolbar\n copy: string;\n copied: string;\n edit: string;\n saveResend: string;\n cancel: string;\n regenerate: string;\n helpful: string;\n notHelpful: string;\n markedHelpful: string;\n thanksFeedback: string;\n bookmarkMessage: string;\n unbookmarkMessage: string;\n deleteMessage: string;\n saved: string;\n stopped: string;\n emptyReply: string;\n newReply: string;\n you: string;\n\n // sources\n sourcesCited: string;\n sourcesRetrieved: string;\n searchedSources: string;\n sourceLabel: string;\n openSource: string;\n citedPassage: string;\n copyReference: string;\n alsoCited: string;\n close: string;\n\n // rendered blocks\n renderingChart: string;\n renderingSvg: string;\n copySvg: string;\n showRaw: string;\n showFormatted: string;\n showingRows: string;\n calloutNote: string;\n calloutTip: string;\n calloutImportant: string;\n calloutWarning: string;\n calloutCaution: string;\n\n // toasts\n undo: string;\n chatDeleted: string;\n messageDeleted: string;\n messageBookmarked: string;\n bookmarkRemoved: string;\n chatBookmarked: string;\n chatUnbookmarked: string;\n exported: string;\n copiedMarkdown: string;\n fileTooLarge: string;\n fileType: string;\n tooManyFiles: string;\n\n // errors\n errGeneric: string;\n errNotFound: string;\n errKbSource: string;\n errNoClient: string;\n errLoad: string;\n retry: string;\n offline: string;\n\n // launcher\n bubbleText: string;\n openChat: string;\n closeChat: string;\n dismiss: string;\n}\n\nexport const defaultChatMessages: SinglebaseChatMessages = {\n eyebrowChat: \"Chat\",\n eyebrowRag: \"Grounded answers\",\n headingChat: \"What can I help with?\",\n headingRag: \"Ask your knowledge base\",\n descriptionChat: \"Ask anything. Attach text files to give it more context.\",\n descriptionRag:\n \"Answers are grounded in your sources, with a citation for every claim. Attach text files to search them too.\",\n eyebrowKb: \"Knowledge base\",\n headingKb: \"Ask the knowledge base\",\n descriptionKb: \"Answers come only from the knowledge base, with a citation for every claim.\",\n\n placeholderChat: \"Message {name}…\",\n placeholderRag: \"Ask about your sources…\",\n placeholderKb: \"Ask the knowledge base…\",\n footnote: \"{name} can make mistakes. Check important details.\",\n attach: \"Attach files\",\n send: \"Send message\",\n stop: \"Stop generating\",\n removeFile: \"Remove file\",\n inThisChat: \"In this chat\",\n removeFromChat: \"Remove from this chat\",\n attachmentFailed: \"Couldn't read {name}.\",\n dropTitle: \"Drop files to attach\",\n dropSub: \"Text, Markdown, CSV and JSON files are added as context.\",\n\n thinking: \"Thinking\",\n searching: \"Searching sources\",\n\n chats: \"Chats\",\n newChat: \"New chat\",\n searchChats: \"Search chats\",\n groupBookmarked: \"Bookmarked\",\n groupToday: \"Today\",\n groupYesterday: \"Yesterday\",\n groupWeek: \"Previous 7 days\",\n groupOlder: \"Older\",\n noChats: \"No chats yet.\",\n noMatch: \"No chats match “{query}”.\",\n loadingChats: \"Loading chats\",\n showChats: \"Show chats\",\n hideSidebar: \"Hide sidebar\",\n\n untitled: \"New chat\",\n renameChat: \"Rename chat\",\n bookmarkChat: \"Bookmark chat\",\n unbookmarkChat: \"Remove chat bookmark\",\n exportChat: \"Export chat\",\n deleteChat: \"Delete chat\",\n expand: \"Expand\",\n restore: \"Restore size\",\n minimize: \"Minimize chat\",\n\n exportHeading: \"Export this chat\",\n exportMarkdown: \"Markdown\",\n exportJson: \"JSON\",\n exportText: \"Plain text\",\n exportCopy: \"Copy as Markdown\",\n\n copy: \"Copy\",\n copied: \"Copied\",\n edit: \"Edit and resend\",\n saveResend: \"Save & resend\",\n cancel: \"Cancel\",\n regenerate: \"Regenerate\",\n helpful: \"Helpful\",\n notHelpful: \"Not helpful\",\n markedHelpful: \"Marked helpful\",\n thanksFeedback: \"Thanks for the feedback\",\n bookmarkMessage: \"Bookmark message\",\n unbookmarkMessage: \"Remove bookmark\",\n deleteMessage: \"Delete message\",\n saved: \"Saved\",\n stopped: \"Stopped\",\n emptyReply: \"(empty response)\",\n newReply: \"New reply\",\n you: \"You\",\n\n sourcesCited: \"Cited sources\",\n sourcesRetrieved: \"Sources\",\n searchedSources: \"Searched {n} sources\",\n sourceLabel: \"Source {n}\",\n openSource: \"Open source {n}\",\n citedPassage: \"Cited passage\",\n copyReference: \"Copy passage with reference\",\n alsoCited: \"Also cited\",\n close: \"Close\",\n\n renderingChart: \"Rendering chart\",\n renderingSvg: \"Rendering drawing\",\n copySvg: \"Copy SVG\",\n showRaw: \"View raw\",\n showFormatted: \"View formatted\",\n showingRows: \"Showing {n} of {total} rows\",\n calloutNote: \"Note\",\n calloutTip: \"Tip\",\n calloutImportant: \"Important\",\n calloutWarning: \"Warning\",\n calloutCaution: \"Caution\",\n\n undo: \"Undo\",\n chatDeleted: \"Chat deleted\",\n messageDeleted: \"Message deleted\",\n messageBookmarked: \"Message bookmarked\",\n bookmarkRemoved: \"Bookmark removed\",\n chatBookmarked: \"Chat bookmarked\",\n chatUnbookmarked: \"Chat removed from bookmarks\",\n exported: \"Exported {name}\",\n copiedMarkdown: \"Copied as Markdown\",\n fileTooLarge: \"{name} is larger than {size}.\",\n fileType: \"{name} isn't a text file.\",\n tooManyFiles: \"Attach up to {n} files at a time.\",\n\n errGeneric: \"Something went wrong.\",\n errNotFound: \"This chat no longer exists. Retry to start a new one.\",\n errKbSource: \"No knowledge base is set up for this chat.\",\n errNoClient: \"Chat isn't connected. Create a SinglebaseClient() on this page.\",\n errLoad: \"Couldn't load this chat.\",\n retry: \"Retry\",\n offline: \"You're offline. Messages will send when you reconnect.\",\n\n bubbleText: \"Hi! Questions? Ask me here.\",\n openChat: \"Open chat\",\n closeChat: \"Close chat\",\n dismiss: \"Dismiss\"\n};\n\nexport function resolveChatMessages(\n overrides: Partial<SinglebaseChatMessages> | undefined\n): SinglebaseChatMessages {\n return { ...defaultChatMessages, ...(overrides ?? {}) };\n}\n","/**\n * The Markdown <singlebase-chat> renders, parsed into plain blocks. Nothing\n * here produces HTML: the element turns blocks into Lit templates, so model\n * output is always text, never markup.\n *\n * Blocks: paragraphs, `#`–`####` headings, nested `-`/`*`/`1.` lists and task\n * lists, `>` quotes, `> [!NOTE]` callouts, `---` rules, pipe tables (with\n * alignment), `` images, and fenced code. Fences with a known\n * language become richer blocks: ```chart, ```csv / ```tsv, ```json,\n * ```callout and ```svg.\n *\n * Inline: `**bold**`, `*italic*` / `_italic_`, `~~strike~~`, `` `code` ``,\n * `[text](https://…)`, bare https links and `[n]` citations.\n */\n\nexport interface ChartSeries {\n name: string;\n values: number[];\n}\n\nexport interface ChartSpec {\n type: \"bar\" | \"line\";\n title: string;\n unit: string;\n labels: string[];\n series: ChartSeries[];\n}\n\nexport interface ImageRef {\n alt: string;\n src: string;\n}\n\nexport interface ListItem {\n text: string;\n /** Nesting level, 0 for top-level items. */\n depth: number;\n /** A task list item's state, or null for an ordinary item. */\n checked: boolean | null;\n}\n\nexport type Align = \"left\" | \"center\" | \"right\" | null;\nexport type CalloutKind = \"note\" | \"tip\" | \"important\" | \"warning\" | \"caution\";\n\nexport type Block =\n | { type: \"p\"; text: string }\n | { type: \"h\"; level: number; text: string }\n | { type: \"list\"; ordered: boolean; items: ListItem[] }\n | { type: \"quote\"; text: string }\n | { type: \"hr\" }\n | { type: \"code\"; lang: string; text: string }\n | { type: \"table\"; head: string[]; rows: string[][]; align: Align[] }\n | { type: \"chart\"; spec: ChartSpec }\n | { type: \"json\"; value: unknown; source: string }\n | { type: \"callout\"; kind: CalloutKind; title: string; text: string }\n | { type: \"svg\"; source: string }\n | { type: \"img\"; images: ImageRef[] }\n | { type: \"pending\"; kind: \"chart\" | \"svg\" }\n | { type: \"raw\"; text: string };\n\nexport type Segment =\n | { type: \"text\"; text: string }\n | { type: \"bold\"; text: string }\n | { type: \"italic\"; text: string }\n | { type: \"strike\"; text: string }\n | { type: \"code\"; text: string }\n | { type: \"link\"; text: string; href: string }\n | { type: \"cite\"; n: number };\n\n/**\n * How much of a reply is formatted. `raw` shows the text exactly as written,\n * `plain` is text with light formatting, `advanced` adds tables, CSV, JSON and\n * SVG, and `rich` adds callouts, charts, images and the host's own blocks.\n */\nexport type ChatFormat = \"raw\" | \"plain\" | \"advanced\" | \"rich\";\n\nconst TABLE_ROW = /^\\|.*\\|$/;\nconst TABLE_RULE = /^\\|[\\s:|-]+\\|$/;\nconst IMAGE_LINE = /^!\\[([^\\]]*)\\]\\(([^)]*)\\)$/;\nconst LIST_ITEM = /^(\\s*)([-*+]|\\d+[.)])\\s+(.*)$/;\nconst TASK = /^\\[( |x|X)\\]\\s+/;\nconst RULE = /^(-{3,}|\\*{3,}|_{3,})$/;\nconst ALERT = /^\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\]\\s*(.*)$/i;\nconst CALLOUT_KINDS: CalloutKind[] = [\"note\", \"tip\", \"important\", \"warning\", \"caution\"];\n\n/** Parses `text` into blocks. An unclosed fence is still streaming. */\nexport function parseMarkdown(text: string): Block[] {\n const blocks: Block[] = [];\n const parts = (text ?? \"\").replace(/\\r/g, \"\").split(\"```\");\n\n parts.forEach((part, index) => {\n if (index % 2 === 1) {\n const newline = part.indexOf(\"\\n\");\n const info = (newline > -1 ? part.slice(0, newline) : part).trim();\n const body = (newline > -1 ? part.slice(newline + 1) : \"\").replace(/\\n$/, \"\");\n blocks.push(fencedBlock(info, body, index === parts.length - 1));\n return;\n }\n\n for (const chunk of part.split(/\\n{2,}/)) {\n if (!chunk.trim()) continue;\n blocks.push(...parseChunk(chunk));\n }\n });\n\n return blocks;\n}\n\nfunction fencedBlock(info: string, body: string, open: boolean): Block {\n const [word = \"\", ...rest] = info.split(/\\s+/);\n const lang = word.toLowerCase();\n\n if (lang === \"chart\") {\n const spec = open ? null : parseChart(body);\n return spec ? { type: \"chart\", spec } : { type: \"pending\", kind: \"chart\" };\n }\n if (lang === \"svg\") {\n return open || !/<svg[\\s>]/i.test(body)\n ? { type: \"pending\", kind: \"svg\" }\n : { type: \"svg\", source: body.trim() };\n }\n if (!open && (lang === \"csv\" || lang === \"tsv\")) {\n const rows = parseDelimited(body, lang === \"tsv\" ? \"\\t\" : \",\");\n if (rows.length > 1) {\n return { type: \"table\", head: rows[0], rows: rows.slice(1), align: rows[0].map(() => null) };\n }\n }\n if (!open && lang === \"json\") {\n try {\n return { type: \"json\", value: JSON.parse(body), source: body };\n } catch {\n /* not valid JSON: show it as code */\n }\n }\n if (lang === \"callout\") {\n const kind = (rest[0] ?? \"\").toLowerCase() as CalloutKind;\n const known = CALLOUT_KINDS.includes(kind);\n return {\n type: \"callout\",\n kind: known ? kind : \"note\",\n title: (known ? rest.slice(1) : rest).join(\" \"),\n text: body.trim()\n };\n }\n return { type: \"code\", lang: lang || \"code\", text: body };\n}\n\nfunction parseChunk(chunk: string): Block[] {\n const raw = chunk.split(\"\\n\").filter((line) => line.trim());\n const lines = raw.map((line) => line.trim());\n\n if (lines.length > 1 && lines.every((line) => TABLE_ROW.test(line))) {\n const cells = (line: string) =>\n line\n .replace(/^\\||\\|$/g, \"\")\n .split(\"|\")\n .map((cell) => cell.trim());\n const ruleIndex = lines.findIndex((line) => TABLE_RULE.test(line));\n const align: Align[] =\n ruleIndex > -1\n ? cells(lines[ruleIndex]).map((cell) =>\n /^:-+:$/.test(cell)\n ? \"center\"\n : /^-+:$/.test(cell)\n ? \"right\"\n : /^:-+$/.test(cell)\n ? \"left\"\n : null\n )\n : [];\n const rows = lines.filter((line) => !TABLE_RULE.test(line)).map(cells);\n const head = rows[0] ?? [];\n return [\n { type: \"table\", head, rows: rows.slice(1), align: head.map((_, i) => align[i] ?? null) }\n ];\n }\n\n if (lines.length === 1 && RULE.test(lines[0])) return [{ type: \"hr\" }];\n\n if (lines.every((line) => IMAGE_LINE.test(line))) {\n return [\n {\n type: \"img\",\n images: lines.map((line) => {\n const match = line.match(IMAGE_LINE)!;\n return { alt: match[1], src: match[2] };\n })\n }\n ];\n }\n\n if (lines.every((line) => line.startsWith(\">\"))) {\n const body = lines.map((line) => line.replace(/^>\\s?/, \"\"));\n const alert = body[0].match(ALERT);\n if (alert) {\n return [\n {\n type: \"callout\",\n kind: alert[1].toLowerCase() as CalloutKind,\n title: alert[2].trim(),\n text: body.slice(1).join(\"\\n\").trim()\n }\n ];\n }\n return [{ type: \"quote\", text: body.join(\" \") }];\n }\n\n if (LIST_ITEM.test(raw[0])) {\n const items: ListItem[] = [];\n for (const line of raw) {\n const match = line.match(LIST_ITEM);\n if (match) {\n const task = match[3].match(TASK);\n items.push({\n text: task ? match[3].replace(TASK, \"\") : match[3],\n depth: Math.min(3, Math.floor(match[1].replace(/\\t/g, \" \").length / 2)),\n checked: task ? task[1] !== \" \" : null\n });\n } else {\n // A wrapped line belongs to the item above it.\n items[items.length - 1].text += ` ${line.trim()}`;\n }\n }\n return [{ type: \"list\", ordered: /^\\s*\\d/.test(raw[0]), items }];\n }\n\n // A heading followed by more lines in the same chunk: split it off.\n const heading = lines[0].match(/^(#{1,4})\\s+(.*)$/);\n if (heading) {\n const rest = raw.slice(1).join(\"\\n\");\n return [\n { type: \"h\", level: heading[1].length, text: heading[2] },\n ...(rest ? parseChunk(rest) : [])\n ];\n }\n\n return [{ type: \"p\", text: lines.join(\" \") }];\n}\n\n/** CSV/TSV with quoted fields. Rows are padded to the header's width. */\nexport function parseDelimited(body: string, separator = \",\"): string[][] {\n const rows: string[][] = [];\n let row: string[] = [];\n let field = \"\";\n let quoted = false;\n const text = body.replace(/\\r/g, \"\");\n\n for (let i = 0; i < text.length; i++) {\n const c = text[i];\n if (quoted) {\n if (c === '\"' && text[i + 1] === '\"') {\n field += '\"';\n i++;\n } else if (c === '\"') quoted = false;\n else field += c;\n } else if (c === '\"' && field === \"\") quoted = true;\n else if (c === separator) {\n row.push(field.trim());\n field = \"\";\n } else if (c === \"\\n\") {\n row.push(field.trim());\n if (row.some(Boolean)) rows.push(row);\n row = [];\n field = \"\";\n } else field += c;\n }\n row.push(field.trim());\n if (row.some(Boolean)) rows.push(row);\n\n const width = rows[0]?.length ?? 0;\n return rows.map((r) => (r.length < width ? [...r, ...Array(width - r.length).fill(\"\")] : r));\n}\n\n/** A ```chart body, or null when it is not a usable spec. */\nexport function parseChart(body: string): ChartSpec | null {\n let raw: any;\n try {\n raw = JSON.parse(body);\n } catch {\n return null;\n }\n if (!raw || typeof raw !== \"object\") return null;\n const series = (Array.isArray(raw.series) ? raw.series : [])\n .filter((entry: any) => entry && Array.isArray(entry.values))\n .map((entry: any, index: number) => ({\n name: String(entry.name ?? `Series ${index + 1}`),\n values: entry.values.map((value: unknown) => Number(value) || 0)\n }));\n if (!series.length) return null;\n const labels = Array.isArray(raw.labels)\n ? raw.labels.map(String)\n : series[0].values.map((_: number, i: number) => String(i + 1));\n return {\n type: raw.type === \"line\" ? \"line\" : \"bar\",\n title: String(raw.title ?? \"\"),\n unit: String(raw.unit ?? \"\"),\n labels,\n series\n };\n}\n\nconst INLINE = new RegExp(\n [\n /\\*\\*([^*]+)\\*\\*/.source, // 1 bold\n /~~([^~]+)~~/.source, // 2 strike\n /`([^`]+)`/.source, // 3 code\n /\\[([^\\]]+)\\]\\((https?:\\/\\/[^)\\s]+)\\)/.source, // 4, 5 link\n /(https?:\\/\\/[^\\s<>()]*[^\\s<>().,;:!?'\"\\]])/.source, // 6 bare link\n /(?<![\\w*])\\*(?![\\s*])([^*\\n]+?)\\*(?![\\w*])/.source, // 7 *italic*\n /(?<![\\w_])_(?![\\s_])([^_\\n]+?)_(?![\\w_])/.source, // 8 _italic_\n /\\s?\\[(\\d+(?:\\s*,\\s*\\d+)*)\\]/.source // 9 citation\n ].join(\"|\"),\n \"g\"\n);\n\n/**\n * Inline segments of one line. Citations only become chips when `maxCite`\n * is at least the cited number; anything else stays literal text.\n */\nexport function parseInline(text: string, maxCite = 0): Segment[] {\n const out: Segment[] = [];\n let last = 0;\n let match: RegExpExecArray | null;\n INLINE.lastIndex = 0;\n\n const pushText = (value: string) => {\n if (!value) return;\n const prev = out[out.length - 1];\n if (prev?.type === \"text\") prev.text += value;\n else out.push({ type: \"text\", text: value });\n };\n\n while ((match = INLINE.exec(text))) {\n pushText(text.slice(last, match.index));\n if (match[1] !== undefined) out.push({ type: \"bold\", text: match[1] });\n else if (match[2] !== undefined) out.push({ type: \"strike\", text: match[2] });\n else if (match[3] !== undefined) out.push({ type: \"code\", text: match[3] });\n else if (match[4] !== undefined) out.push({ type: \"link\", text: match[4], href: match[5] });\n else if (match[6] !== undefined) out.push({ type: \"link\", text: match[6], href: match[6] });\n else if (match[7] !== undefined) out.push({ type: \"italic\", text: match[7] });\n else if (match[8] !== undefined) out.push({ type: \"italic\", text: match[8] });\n else {\n const numbers = match[9].split(\",\").map((n) => Number(n.trim()));\n const valid = numbers.filter((n) => n >= 1 && n <= maxCite);\n if (!maxCite) pushText(match[0]);\n else valid.forEach((n) => out.push({ type: \"cite\", n }));\n }\n last = match.index + match[0].length;\n }\n pushText(text.slice(last));\n return out;\n}\n\n/**\n * Tidies the tail of a reply that is still arriving, so half-written syntax\n * doesn't flash on screen: an unfinished table row, link or image is held\n * back, and an unpaired `**`, `~~` or backtick is dropped until its partner\n * arrives. Only the last paragraph outside a code fence is touched.\n */\nexport function settleStreaming(text: string): string {\n if (((text ?? \"\").match(/```/g) ?? []).length % 2 === 1) return text;\n const cut = text.lastIndexOf(\"\\n\\n\");\n const head = cut > -1 ? text.slice(0, cut + 2) : \"\";\n let tail = cut > -1 ? text.slice(cut + 2) : text;\n\n const lines = tail.split(\"\\n\");\n const last = lines[lines.length - 1];\n if (last.trimStart().startsWith(\"|\") && !last.trimEnd().endsWith(\"|\")) lines.pop();\n tail = lines.join(\"\\n\");\n\n tail = tail.replace(/!?\\[[^\\]\\n]*(\\]\\([^)\\n]*)?$/, \"\");\n for (const marker of [\"**\", \"~~\", \"`\"]) {\n const count = tail.split(marker).length - 1;\n if (count % 2 === 1) {\n const at = tail.lastIndexOf(marker);\n tail = tail.slice(0, at) + tail.slice(at + marker.length);\n }\n }\n return head + tail;\n}\n\n/** Every citation number used in `text`. */\nexport function citedNumbers(text: string): Set<number> {\n const found = new Set<number>();\n for (const group of (text ?? \"\").match(/\\[(\\d+(?:\\s*,\\s*\\d+)*)\\]/g) ?? []) {\n group\n .replace(/[[\\]]/g, \"\")\n .split(\",\")\n .forEach((n) => found.add(Number(n.trim())));\n }\n return found;\n}\n\nfunction chartRows(spec: ChartSpec): string[][] {\n return [\n [\"\", ...spec.series.map((s) => s.name)],\n ...spec.labels.map((label, i) => [\n label,\n ...spec.series.map((s) => (s.values[i] === undefined ? \"\" : `${s.values[i]}${spec.unit}`))\n ])\n ];\n}\n\nconst rowsText = (rows: string[][]) => rows.map((r) => r.join(\" · \")).join(\"\\n\");\nconst CALLOUT_LABELS: Record<CalloutKind, string> = {\n note: \"Note\",\n tip: \"Tip\",\n important: \"Important\",\n warning: \"Warning\",\n caution: \"Caution\"\n};\n\n/**\n * Applies the format level. Blocks a level doesn't draw become the nearest\n * thing it does, so nothing the model wrote is ever lost:\n *\n * - `rich`: everything as written.\n * - `advanced`: tables, CSV, JSON and SVG; charts become data tables,\n * callouts become quotes, images become \"Image: alt\".\n * - `plain`: text only; tables become plain rows, data and SVG become code.\n *\n * `raw` never gets here: the element shows the text without parsing it.\n */\nexport function adaptBlocks(blocks: Block[], level: Exclude<ChatFormat, \"raw\">): Block[] {\n if (level === \"rich\") return blocks;\n const simple = level === \"plain\";\n\n return blocks.map((block): Block => {\n switch (block.type) {\n case \"chart\": {\n const [head, ...rows] = chartRows(block.spec);\n if (simple) {\n return {\n type: \"raw\",\n text: [block.spec.title, rowsText([head, ...rows])].filter(Boolean).join(\"\\n\")\n };\n }\n return {\n type: \"table\",\n head: block.spec.title ? [block.spec.title, ...head.slice(1)] : head,\n rows,\n align: head.map(() => null)\n };\n }\n case \"pending\":\n return block.kind === \"svg\" && !simple ? block : { type: \"raw\", text: \"\" };\n case \"callout\":\n return {\n type: \"quote\",\n text: `**${block.title || CALLOUT_LABELS[block.kind]}** ${block.text}`.trim()\n };\n case \"img\":\n return {\n type: \"p\",\n text: block.images.map((image) => `Image: ${image.alt || \"untitled\"}`).join(\" · \")\n };\n case \"table\":\n return simple ? { type: \"raw\", text: rowsText([block.head, ...block.rows]) } : block;\n case \"json\":\n return simple ? { type: \"code\", lang: \"json\", text: block.source } : block;\n case \"svg\":\n return simple ? { type: \"code\", lang: \"svg\", text: block.source } : block;\n default:\n return block;\n }\n });\n}\n\n/**\n * Splits the `FOLLOWUPS:` tail the model is asked to write off the visible\n * answer. Questions may be `|`-separated or one per line.\n */\nexport function splitFollowups(content: string): { text: string; followups: string[] } {\n const source = content ?? \"\";\n const index = source.search(/FOLLOWUPS:/i);\n if (index < 0) return { text: source.trim(), followups: [] };\n const tail = source.slice(index).replace(/^FOLLOWUPS:/i, \"\");\n const followups = tail\n .split(/\\||\\n/)\n .map((q) => q.replace(/^\\s*(?:[-*↳→]|\\d+[.)])\\s*/, \"\").trim())\n .filter(Boolean)\n .slice(0, 3);\n return { text: source.slice(0, index).trim(), followups };\n}\n\n/** A one-line plain rendering, for snippets and search. */\nexport function plainText(text: string): string {\n return (text ?? \"\")\n .replace(/```(\\w*)[\\s\\S]*?(```|$)/g, (_m, lang) =>\n lang === \"chart\" ? \"[Chart] \" : lang === \"svg\" ? \"[Drawing] \" : \"[Code] \"\n )\n .replace(/!\\[([^\\]]*)\\]\\([^)]*\\)/g, \"[Image: $1]\")\n .replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^)\\s]+)\\)/g, \"$1\")\n .replace(/\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\]/gi, \"\")\n .replace(/[*#>`~]/g, \"\")\n .replace(/\\|/g, \" \")\n .replace(/\\s?\\[\\d+(?:\\s*,\\s*\\d+)*\\]/g, \"\")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\n/** The first message, cut at a word boundary: a title until a better one lands. */\nexport function provisionalTitle(text: string, max = 48): string {\n const clean = plainText(text);\n if (clean.length <= max) return clean;\n const cut = clean.slice(0, max);\n const space = cut.lastIndexOf(\" \");\n return (space > max / 2 ? cut.slice(0, space) : cut).trim();\n}\n\n/** A model-written title: no quotes, no trailing punctuation, 80 characters. */\nexport function cleanTitle(value: unknown): string {\n return String(value ?? \"\")\n .split(\"\\n\")[0]\n .trim()\n .replace(/^[\"'“”‘’]+|[\"'“”‘’]+$/g, \"\")\n .replace(/^title:\\s*/i, \"\")\n .replace(/[.!?:;,]+$/, \"\")\n .trim()\n .slice(0, 80);\n}\n\n/** Only these reach an `<img src>` or a link: no javascript:, no stray schemes. */\nexport function isSafeUrl(url: string, image = false): boolean {\n if (/^https?:\\/\\//i.test(url)) return true;\n return image && /^(blob:|data:image\\/)/i.test(url);\n}\n","/**\n * Model-written SVG, made safe to show.\n *\n * The real protection is how it's shown: as an `<img>` data URL, where the\n * browser runs no scripts and loads no external resources. On top of that\n * the markup is cleaned, so what we hand the browser has no scripts, event\n * handlers, embedded HTML or outside references to begin with.\n */\n\nconst MAX_SVG_BYTES = 200_000;\n\nconst DROP_ELEMENTS = new Set([\n \"script\",\n \"foreignobject\",\n \"iframe\",\n \"object\",\n \"embed\",\n \"image\",\n \"audio\",\n \"video\",\n \"animate\",\n \"set\",\n \"animatemotion\",\n \"animatetransform\",\n \"handler\",\n \"listener\"\n]);\n\n/** The cleaned SVG as a data URL for `<img src>`, or null when it isn't usable. */\nexport function svgDataUrl(source: string): string | null {\n if (!source || source.length > MAX_SVG_BYTES || typeof DOMParser === \"undefined\") return null;\n\n const doc = new DOMParser().parseFromString(source, \"image/svg+xml\");\n const root = doc.documentElement;\n if (!root || root.nodeName.toLowerCase() !== \"svg\" || doc.querySelector(\"parsererror\")) {\n return null;\n }\n\n const walk = (el: Element) => {\n for (const child of Array.from(el.children)) {\n const name = child.nodeName.toLowerCase();\n if (DROP_ELEMENTS.has(name)) child.remove();\n else if (name === \"a\") {\n // Links can't work inside an image; keep what they wrap.\n const inner = Array.from(child.childNodes);\n child.replaceWith(...inner);\n inner.forEach((node) => node instanceof Element && walk(node));\n } else walk(child);\n }\n for (const attr of Array.from(el.attributes)) {\n const name = attr.name.toLowerCase();\n const value = attr.value.trim().toLowerCase();\n const external = (name === \"href\" || name.endsWith(\":href\")) && !value.startsWith(\"#\");\n const scripted = value.includes(\"javascript:\") || /url\\(\\s*['\"]?(?!#)/.test(value);\n if (name.startsWith(\"on\") || external || scripted) el.removeAttribute(attr.name);\n }\n };\n walk(root);\n // <style> may pull in outside resources; keep its rules, drop any url() or @import.\n for (const style of Array.from(root.querySelectorAll(\"style\"))) {\n style.textContent = (style.textContent ?? \"\")\n .replace(/@import[^;]*;?/gi, \"\")\n .replace(/url\\(\\s*['\"]?(?!#)[^)]*\\)/gi, \"none\");\n }\n\n root.setAttribute(\"xmlns\", \"http://www.w3.org/2000/svg\");\n const markup = new XMLSerializer().serializeToString(root);\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(markup)}`;\n}\n","import { LitElement, html, nothing, svg, type PropertyValues, type TemplateResult } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport { getDefaultClient } from \"@singlebase/core\";\nimport type { SinglebaseClientInstance } from \"@singlebase/singlebase-sdk\";\nimport { tokenDefaults } from \"../styles/tokens.js\";\nimport { chatStyles } from \"../styles/chat.js\";\nimport { brandingStyles } from \"../styles/branding.js\";\nimport { renderBranding } from \"../utils/branding.js\";\nimport { resolveChatMessages, type SinglebaseChatMessages } from \"../chat-messages.js\";\nimport { fill } from \"../upload-messages.js\";\nimport { formatSize } from \"../utils/files.js\";\nimport {\n adaptBlocks,\n citedNumbers,\n cleanTitle,\n isSafeUrl,\n parseInline,\n parseMarkdown,\n plainText,\n provisionalTitle,\n settleStreaming,\n splitFollowups,\n type Block,\n type ChartSpec,\n type ListItem,\n type ChatFormat\n} from \"../utils/markdown.js\";\nimport { svgDataUrl } from \"../utils/svg.js\";\n\n// ── public types ───────────────────────────────────────────\n\n/**\n * How answers use sources: `chat` free-form, `rag` prefers sources and cites\n * them, `kb` answers only from sources (docsets, retrieval, attachments).\n */\nexport type ChatMode = \"chat\" | \"rag\" | \"kb\";\nexport type ChatEmbed = \"page\" | \"inline\" | \"launcher\";\nexport type ChatGlow = \"subtle\" | \"vivid\" | \"off\";\nexport type ChatExportFormat = \"md\" | \"txt\" | \"json\" | \"copy\";\n/** `auto` docks when there's room; `none` removes the list and its toggle. */\nexport type ChatSidebar = \"auto\" | \"open\" | \"closed\" | \"none\";\n\n/** What the chat needs from a client: `llm.call`, and nothing else. */\nexport type ChatClient = {\n llm: {\n call<T = unknown>(\n method: string,\n payload?: unknown,\n options?: { signal?: AbortSignal }\n ): Promise<T>;\n };\n};\n\n/** A row of `llm.list_chats`. */\nexport interface ChatSummary {\n _id: string;\n title: string | null;\n bookmarked?: boolean;\n message_count?: number;\n _created_at?: string;\n _modified_at?: string;\n}\n\n/** A text file attached to one message, sent to the model as retrieval. */\nexport interface ChatAttachment {\n name: string;\n size: number;\n content: string;\n mime?: string;\n}\n\n/** A file the service keeps on the chat (attachments-mode=\"payload\"). */\nexport interface ChatSavedAttachment {\n id: string;\n name: string;\n type?: string;\n mime?: string;\n size?: number;\n status?: string;\n}\n\nexport interface ChatMessage {\n /** Local identity, stable across renders. */\n key: string;\n /** The server's message id, once known. Bookmark and delete need it. */\n id: string | null;\n role: \"user\" | \"assistant\";\n /** The text. For replies, the FOLLOWUPS tail is already split off. */\n content: string;\n at: number;\n bookmarked: boolean;\n /** Retrieved documents the reply used, as the server recorded them. */\n sources: Record<string, unknown>[];\n followups: string[];\n phase: \"pending\" | \"streaming\" | \"done\" | \"error\";\n error?: string;\n stopped?: boolean;\n feedback?: \"up\" | \"down\";\n attachments?: ChatAttachment[];\n execTime?: number;\n model?: string;\n}\n\n/**\n * Draws a fenced block the host knows about, e.g. ```order {\"id\":\"A-1\"}```.\n * Return a Lit template, a DOM node or text; return null to fall back to code.\n */\nexport type ChatBlockRenderer = (\n source: string,\n context: { lang: string; message: ChatMessage }\n) => unknown;\n\n/**\n * Runs before each message is sent. Return the payload (changed or not), a new\n * payload, or `false` to cancel. Anything else stops the send.\n */\nexport type ChatBeforeSend = (\n payload: Record<string, unknown>,\n context: { chatId: string | null; isNew: boolean; message: ChatMessage }\n) => Record<string, unknown> | false | Promise<Record<string, unknown> | false>;\n\n/** Runs after a reply is parsed. Return the blocks to draw. */\nexport type ChatAfterParse = (\n blocks: Block[],\n context: { message: ChatMessage; format: ChatFormat }\n) => Block[];\n\nexport interface ChatPrompt {\n label?: string;\n text: string;\n}\n\n/** Every setting in one object, keyed by property name. */\nexport interface ChatConfig {\n /** The client to chat with. Defaults to the page's SinglebaseClient(). */\n client: ChatClient | null;\n /** Opens this saved chat. */\n chatId: string;\n embed: ChatEmbed;\n mode: ChatMode;\n format: ChatFormat;\n renderers: Record<string, ChatBlockRenderer>;\n beforeSend: ChatBeforeSend | null;\n afterParse: ChatAfterParse | null;\n glow: ChatGlow;\n position: \"right\" | \"left\";\n sidebar: ChatSidebar;\n showTitle: boolean;\n assistantName: string;\n logoUrl: string;\n heading: string;\n description: string;\n eyebrow: string;\n prompts: string | (string | ChatPrompt)[];\n bubbleText: string;\n greetingBubble: boolean;\n unreadBadge: boolean;\n allowUpload: boolean;\n allowExport: boolean;\n allowRaw: boolean;\n allowCopy: boolean;\n allowRegenerate: boolean;\n allowBookmark: boolean;\n allowDelete: boolean;\n allowRename: boolean;\n allowFeedback: boolean;\n showTime: boolean;\n showComposer: boolean;\n footnote: string;\n branding: boolean;\n followups: boolean;\n docsets: string | string[];\n attachmentsMode: \"retrieval\" | \"payload\";\n saveAttachments: boolean;\n showFollowups: boolean;\n showSources: boolean;\n showNewChat: boolean;\n showBookmarked: boolean;\n allowSearch: boolean;\n autoTitle: boolean;\n model: string;\n params: Record<string, unknown>;\n systemMessage: string;\n retrieval: Record<string, unknown>[];\n metadata: Record<string, unknown>;\n messages: Partial<SinglebaseChatMessages>;\n theme: \"light\" | \"dark\";\n radius: \"sharp\" | \"default\" | \"round\";\n}\n\nconst CONFIG_KEYS: readonly (keyof ChatConfig)[] = [\n \"embed\",\n \"mode\",\n \"format\",\n \"renderers\",\n \"beforeSend\",\n \"afterParse\",\n \"glow\",\n \"position\",\n \"sidebar\",\n \"showTitle\",\n \"assistantName\",\n \"logoUrl\",\n \"heading\",\n \"description\",\n \"eyebrow\",\n \"prompts\",\n \"bubbleText\",\n \"greetingBubble\",\n \"unreadBadge\",\n \"allowUpload\",\n \"allowExport\",\n \"allowRaw\",\n \"allowCopy\",\n \"allowRegenerate\",\n \"allowBookmark\",\n \"allowDelete\",\n \"allowRename\",\n \"allowFeedback\",\n \"showTime\",\n \"showComposer\",\n \"footnote\",\n \"branding\",\n \"followups\",\n \"docsets\",\n \"attachmentsMode\",\n \"saveAttachments\",\n \"showFollowups\",\n \"showSources\",\n \"showNewChat\",\n \"showBookmarked\",\n \"allowSearch\",\n \"autoTitle\",\n \"model\",\n \"params\",\n \"systemMessage\",\n \"retrieval\",\n \"metadata\",\n \"messages\",\n \"theme\",\n \"radius\"\n];\n\n// ── attribute converters ───────────────────────────────────\n\n/** JSON in markup, an object or array in JavaScript. Bad JSON is ignored. */\nconst jsonAttr = {\n fromAttribute: (value: string | null) => {\n if (!value) return undefined;\n try {\n return JSON.parse(value);\n } catch {\n console.warn(\"[singlebase-chat] an attribute holds invalid JSON; ignoring it\");\n return undefined;\n }\n },\n toAttribute: (value: unknown) => JSON.stringify(value ?? null)\n};\n\n/** Present-but-empty means true, so `branding` and `branding=\"false\"` both read. */\nconst flagAttr = {\n fromAttribute: (value: string | null) => (value === null ? true : value !== \"false\"),\n toAttribute: (value: boolean) => (value ? null : \"false\")\n};\n\n/** Bare `sidebar` or `=\"true\"` means open, `=\"false\"` closed; unknown is auto. */\nconst sidebarAttr = {\n fromAttribute: (value: string | null): ChatSidebar => {\n if (value === null) return \"auto\";\n if (value === \"\" || value === \"true\") return \"open\";\n if (value === \"false\") return \"closed\";\n return ([\"auto\", \"open\", \"closed\", \"none\"] as const).includes(value as ChatSidebar)\n ? (value as ChatSidebar)\n : \"auto\";\n },\n toAttribute: (value: ChatSidebar) => (value === \"auto\" ? null : value)\n};\n\n// ── constants ──────────────────────────────────────────────\n\nconst SIDEBAR_WIDTH = 272;\nconst DOCK_SIDEBAR_AT = 820;\nconst DOCK_PANEL_AT = 940;\nconst MAX_FILES = 5;\nconst MAX_FILE_SIZE = 512 * 1024;\nconst TEXT_FILE = /\\.(md|markdown|txt|csv|tsv|json|html?|ya?ml|xml|log)$/i;\nconst TOAST_MS = 5000;\nconst MAX_TABLE_ROWS = 200;\nconst MAX_JSON_NODES = 2000;\nconst CALLOUT_MESSAGE = {\n note: \"calloutNote\",\n tip: \"calloutTip\",\n important: \"calloutImportant\",\n warning: \"calloutWarning\",\n caution: \"calloutCaution\"\n} as const;\nconst ARRIVED_MS = 2600;\n\nconst CHART_COLORS = [\n \"var(--c-ink)\",\n \"oklch(0.58 0.13 255)\",\n \"oklch(0.63 0.1 175)\",\n \"oklch(0.74 0.12 70)\"\n];\n\n/** How each mode asks the model to answer. Sent once, when a chat is created. */\nconst MODE_PROMPTS: Record<ChatMode, string> = {\n chat: \"Be helpful and concise. Use Markdown when it helps: headings, lists, **bold**, code blocks and tables.\",\n rag:\n \"Prefer the sources provided with each message, numbered in the order given, and put a citation like [1] right after each claim they support. \" +\n \"If they don't cover the question, you may answer from general knowledge, but say clearly that it isn't from the sources.\",\n kb:\n \"Answer ONLY from the sources provided with each message, numbered in the order given. \" +\n \"Put a citation like [1] right after each claim. Do not use outside knowledge. \" +\n \"If the sources don't contain the answer, say that you can't find it in the available sources.\"\n};\n\n/** What the model may write at each format level, so it only uses what renders. */\nconst FORMAT_PROMPTS: Record<ChatFormat, string> = {\n raw: \"Reply in plain text. Don't use Markdown or any other markup.\",\n plain:\n \"Format with light Markdown only: short paragraphs, lists, **bold**, *italics*, `inline code`, code blocks and links. \" +\n \"Don't use tables, charts, callouts, images or other special blocks.\",\n advanced:\n \"You can use Markdown: headings, lists, task lists, **bold**, *italics*, links, code blocks and pipe tables. \" +\n 'For data, use a fenced \"csv\" block or a fenced \"json\" block. ' +\n 'For a diagram or illustration, write a self-contained fenced \"svg\" block with a viewBox, and no scripts, links or external images. ' +\n \"Don't use charts, callouts or images.\",\n rich:\n \"When the answer is about data, lead with one sentence stating the key finding, with key numbers in **bold**, then show the data visually. \" +\n \"You can use Markdown: headings, lists, task lists, **bold**, *italics*, links, code blocks and pipe tables. \" +\n 'For data, use a fenced \"csv\" block or a fenced \"json\" block. ' +\n 'For a diagram or illustration, write a self-contained fenced \"svg\" block with a viewBox, and no scripts, links or external images. ' +\n 'For trends and comparisons, use a fenced \"chart\" block containing only JSON: ' +\n '{\"type\":\"bar\"|\"line\",\"title\":string,\"unit\":string,\"labels\":[string],\"series\":[{\"name\":string,\"values\":[number]}]}. ' +\n \"For notes and warnings, use callouts: a quote starting with [!NOTE], [!TIP], [!IMPORTANT], [!WARNING] or [!CAUTION]. \" +\n \"Images use .\"\n};\n\nconst FOLLOWUP_PROMPT =\n \"After the answer, on a final line write FOLLOWUPS: followed by three short follow-up questions the user might ask next, separated by |.\";\n\nconst DEFAULT_PROMPTS: Record<ChatMode, [string, string][]> = {\n chat: [\n [\"Write\", \"Draft a short welcome email for new users\"],\n [\"Explain\", \"Explain how refresh tokens work, simply\"],\n [\"Code\", \"Write a JavaScript debounce function\"],\n [\"Plan\", \"Outline a one-week plan to learn TypeScript\"]\n ],\n rag: [\n [\"Overview\", \"What topics do these sources cover?\"],\n [\"Summarize\", \"Summarize the most important points\"],\n [\"Find\", \"Where is the refund policy described?\"],\n [\"Explain\", \"Explain the setup steps in plain language\"]\n ],\n kb: [\n [\"Find\", \"Where is the refund policy described?\"],\n [\"How to\", \"How do I reset my password?\"],\n [\"Limits\", \"What are the plan limits?\"],\n [\"Policy\", \"What happens when my account is deleted?\"]\n ]\n};\n\n// ── icons ──────────────────────────────────────────────────\n\nconst icon = (body: TemplateResult, cls = \"\") =>\n html`<svg class=\"i ${cls}\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">${body}</svg>`;\n\nconst I = {\n sidebar: () =>\n icon(\n svg`<rect x=\"2\" y=\"2.5\" width=\"12\" height=\"11\" rx=\"1.5\"></rect><path d=\"M6 2.5v11\"></path>`\n ),\n plus: () => icon(svg`<path d=\"M8 3v10M3 8h10\"></path>`),\n bookmark: (on = false) =>\n icon(svg`<path d=\"M4.5 2.5h7v11L8 11l-3.5 2.5z\"></path>`, on ? \"filled\" : \"\"),\n download: () => icon(svg`<path d=\"M8 2.5v8M4.5 7.5L8 11l3.5-3.5M2.5 13.5h11\"></path>`),\n trash: () => icon(svg`<path d=\"M2.5 4.5h11M6.5 4.5v-2h3v2M4 4.5l.7 9h6.6l.7-9\"></path>`),\n pencil: () => icon(svg`<path d=\"M10.5 2.5l3 3L6 13H3v-3z\"></path>`),\n copy: () =>\n icon(\n svg`<rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8\" rx=\"1.5\"></rect><path d=\"M10.5 5.5v-2a1 1 0 0 0-1-1h-6a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2\"></path>`\n ),\n raw: () => icon(svg`<path d=\"M5.5 4.5L2 8l3.5 3.5M10.5 4.5L14 8l-3.5 3.5\"></path>`),\n refresh: () => icon(svg`<path d=\"M13.5 8A5.5 5.5 0 1 1 11.9 4.1M13.5 2v3.5H10\"></path>`),\n thumb: (down = false) =>\n html`<svg\n class=\"i\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n style=${down ? \"transform:rotate(180deg)\" : \"\"}\n >\n <path\n d=\"M5 7v6.5H2.5V7zM5 7l2.5-4.5a1.3 1.3 0 0 1 1.9 1.4L9 6.5h3.6a1 1 0 0 1 1 1.2l-1 4.8a1 1 0 0 1-1 .8H5\"\n ></path>\n </svg>`,\n expand: () => icon(svg`<path d=\"M9.5 2.5h4v4M13.5 2.5L9 7M6.5 13.5h-4v-4M2.5 13.5L7 9\"></path>`),\n restore: () => icon(svg`<path d=\"M13.5 6.5h-4v-4M9.5 6.5l4-4M2.5 9.5h4v4M6.5 9.5l-4 4\"></path>`),\n minimize: () => icon(svg`<path d=\"M4 8h8\"></path>`),\n close: () => icon(svg`<path d=\"M4 4l8 8M12 4l-8 8\"></path>`),\n clip: () =>\n icon(\n svg`<path d=\"M13 7.5l-5.3 5.3a3 3 0 0 1-4.3-4.3L9 2.9a2 2 0 0 1 2.9 2.9L6.4 11.3a1 1 0 0 1-1.4-1.4L10 5\"></path>`\n ),\n up: () => icon(svg`<path d=\"M8 13V3M3.5 7.5L8 3l4.5 4.5\"></path>`),\n stop: () => icon(svg`<rect x=\"4.5\" y=\"4.5\" width=\"7\" height=\"7\" rx=\"1\"></rect>`),\n chat: () =>\n html`<svg\n width=\"22\"\n height=\"22\"\n viewBox=\"0 0 22 22\"\n aria-hidden=\"true\"\n style=\"fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round\"\n >\n <path\n d=\"M4 5.5A2.5 2.5 0 0 1 6.5 3h9A2.5 2.5 0 0 1 18 5.5v7a2.5 2.5 0 0 1-2.5 2.5H9l-4 3.5V15H6.5\"\n ></path>\n </svg>`,\n chevronDown: () =>\n html`<svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n aria-hidden=\"true\"\n style=\"fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round\"\n >\n <path d=\"M5 8l5 5 5-5\"></path>\n </svg>`\n};\n\n// ── helpers ────────────────────────────────────────────────\n\nlet keySeed = 0;\nconst newKey = () => `m${Date.now().toString(36)}${(keySeed++).toString(36)}`;\n\nfunction isNotFound(error: unknown): boolean {\n const e = error as { message?: string; code?: string; details?: { status?: number } } | null;\n return e?.message === \"NOT_FOUND\" || e?.code === \"NOT_FOUND\" || e?.details?.status === 404;\n}\n\nfunction errorCode(error: unknown): string {\n const e = error as { code?: string; message?: string } | null;\n return e?.code || e?.message || \"UNKNOWN\";\n}\n\nconst reducedMotion = () =>\n typeof matchMedia !== \"undefined\" && matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n\nconst formatNumber = (value: number, unit: string) =>\n (Number.isInteger(value) ? value.toLocaleString(\"en-US\") : value.toFixed(1)) + unit;\n\nconst fileExt = (name: string) => {\n const dot = name.lastIndexOf(\".\");\n return dot > 0 ? name.slice(dot + 1, dot + 5).toUpperCase() : \"FILE\";\n};\n\n/** A readable view of whatever shape the server recorded for a source. */\nexport function describeSource(source: Record<string, unknown>, n: number) {\n const s = source ?? {};\n const meta = (s.metadata && typeof s.metadata === \"object\" ? s.metadata : {}) as Record<\n string,\n unknown\n >;\n const pick = (...values: unknown[]) =>\n values.find((v) => typeof v === \"string\" && v.trim()) as string | undefined;\n const text =\n pick(s.content, s.text, s.page_content, s.body, s.snippet, s.chunk, meta.content) ??\n JSON.stringify(s, null, 2);\n const score = [s.score, s.relevance, s._score, meta.score].find((v) => typeof v === \"number\") as\n number | undefined;\n const number = typeof s.n === \"number\" && s.n > 0 ? s.n : n;\n return {\n n: number,\n title: pick(s.title, s.name, s.filename, meta.title, meta.name) ?? `Source ${number}`,\n section: pick(s.section, s.heading, meta.section) ?? \"\",\n path: pick(s.path, s.url, s.key, meta.path, meta.url) ?? \"\",\n collection: pick(s.collection, s.namespace, s.dbname, meta.collection) ?? \"\",\n updated: pick(s.updated, s._modified_at, meta.updated) ?? \"\",\n text,\n score: score === undefined ? null : Math.max(0, Math.min(1, score))\n };\n}\n\n/** The saved entries of a service `attachments` list. */\nfunction toSavedFiles(list: unknown): ChatSavedAttachment[] {\n if (!Array.isArray(list)) return [];\n return list\n .filter((item) => item && typeof item === \"object\" && (item._id || item.id))\n .filter((item) => item.saved !== false && item.status !== \"failed\")\n .map((item) => ({\n id: String(item._id ?? item.id),\n name: String(item.name ?? \"file\"),\n type: item.type,\n mime: item.mime,\n size: typeof item.size === \"number\" ? item.size : undefined,\n status: item.status\n }));\n}\n\nfunction toRetrieval(files: ChatAttachment[]): Record<string, unknown>[] {\n const out: Record<string, unknown>[] = [];\n const documents: { title: string; content: string }[] = [];\n for (const file of files) {\n if (/\\.csv$/i.test(file.name)) out.push({ type: \"csv\", data: file.content });\n else if (/\\.json$/i.test(file.name)) {\n try {\n out.push({ type: \"json\", data: JSON.parse(file.content) });\n } catch {\n documents.push({ title: file.name, content: file.content });\n }\n } else documents.push({ title: file.name, content: file.content });\n }\n if (documents.length) out.push({ type: \"docs\", payload: { documents } });\n return out;\n}\n\nfunction dayGroup(iso: string | undefined): \"today\" | \"yesterday\" | \"week\" | \"older\" {\n const at = iso ? Date.parse(iso) : NaN;\n if (Number.isNaN(at)) return \"older\";\n const start = new Date();\n start.setHours(0, 0, 0, 0);\n const day = 86_400_000;\n if (at >= start.getTime()) return \"today\";\n if (at >= start.getTime() - day) return \"yesterday\";\n if (at >= start.getTime() - 7 * day) return \"week\";\n return \"older\";\n}\n\ninterface Toast {\n key: number;\n text: string;\n undo?: () => void;\n commit?: () => void;\n}\n\n/**\n * An AI chat workspace backed by the `llm.*` service.\n *\n * <singlebase-chat></singlebase-chat>\n * <singlebase-chat embed=\"inline\" mode=\"rag\" retrieval='[{\"type\":\"kdb\",\"namespace\":\"docs\"}]'></singlebase-chat>\n * <singlebase-chat embed=\"launcher\" greeting-bubble unread-badge></singlebase-chat>\n *\n * Conversations live on the server, scoped to the signed-in user: the list\n * comes from `llm.list_chats`, a thread from `llm.get_chat`, and each turn is\n * one `llm.chat`. Titles and follow-up questions never add turns to the\n * conversation — titles come from `llm.generate`, follow-ups from the reply.\n */\n@customElement(\"singlebase-chat\")\nexport class SinglebaseChat extends LitElement {\n static styles = [tokenDefaults, brandingStyles, chatStyles];\n\n // ── wiring ────────────────────────────────────────────────\n /** An explicit client. Omit it and the page's SinglebaseClient() is used. */\n @property({ attribute: false })\n accessor client: ChatClient | null = null;\n\n @property({ attribute: false })\n accessor messages: Partial<SinglebaseChatMessages> = {};\n\n @property({ reflect: true })\n accessor theme: \"light\" | \"dark\" | undefined = undefined;\n\n /** Corner preset for this element: `sharp`, `default` or `round`. */\n @property({ reflect: true })\n accessor radius: \"sharp\" | \"default\" | \"round\" | undefined = undefined;\n\n // ── behaviour ─────────────────────────────────────────────\n /** `chat` free-form, `rag` grounded with citations, `rich` charts and tables. */\n @property({ reflect: true }) accessor mode: ChatMode = \"chat\";\n\n /**\n * How much of a reply is formatted: `raw` (the text as written), `plain`\n * (light formatting), `advanced` (+ tables, CSV, JSON and SVG) or `rich`\n * (+ callouts, charts, images and `renderers`). Copy and export always use\n * the original text.\n */\n @property({ reflect: true }) accessor format: ChatFormat = \"advanced\";\n\n /** Your own fenced blocks, by language. Drawn at the `rich` level. */\n @property({ attribute: false }) accessor renderers: Record<string, ChatBlockRenderer> = {};\n\n /**\n * Preflight for every message: gets the `llm.chat` payload, returns it\n * (changed or not), or `false` to cancel. May be async.\n */\n @property({ attribute: false }) accessor beforeSend: ChatBeforeSend | null = null;\n\n /** Rewrites a reply's parsed blocks before they're drawn. Returns the blocks. */\n @property({ attribute: false }) accessor afterParse: ChatAfterParse | null = null;\n\n @property({ reflect: true }) accessor glow: ChatGlow = \"subtle\";\n\n /**\n * Docsets to answer from: slugs or ids, comma-separated in markup or an\n * array in JavaScript. Sent as `{ source: \"docset\", ids }`.\n */\n @property() accessor docsets: string | string[] = \"\";\n\n /**\n * How attached files reach the service: `retrieval` (this message only;\n * works with every service version) or `payload` (as `attachments`, which\n * the service keeps on the chat for later turns).\n */\n @property({ attribute: \"attachments-mode\" }) accessor attachmentsMode: \"retrieval\" | \"payload\" =\n \"retrieval\";\n\n /** With attachments-mode=\"payload\": keep attached files on the chat. */\n @property({ converter: flagAttr, attribute: \"save-attachments\" }) accessor saveAttachments = true;\n\n /** Ask the model for follow-up questions with each reply. */\n @property({ converter: flagAttr }) accessor followups = true;\n\n /** The \"Cited sources\" cards and the \"Searched n sources\" row under answers. */\n @property({ converter: flagAttr, attribute: \"show-sources\" }) accessor showSources = true;\n\n /** The New chat button. */\n @property({ converter: flagAttr, attribute: \"show-new-chat\" }) accessor showNewChat = true;\n\n /** The pinned \"Bookmarked\" group in the chat list. */\n @property({ converter: flagAttr, attribute: \"show-bookmarked\" }) accessor showBookmarked = true;\n\n /** Show the follow-up questions under the latest reply. */\n @property({ converter: flagAttr, attribute: \"show-followups\" }) accessor showFollowups = true;\n\n /** The search box in the chat list. */\n @property({ converter: flagAttr, attribute: \"allow-search\" }) accessor allowSearch = true;\n\n /** Replace the provisional title with a model-written one after the first reply. */\n @property({ converter: flagAttr, attribute: \"auto-title\" }) accessor autoTitle = true;\n\n /** Model for new turns; empty uses the chat's, then the project default. */\n @property() accessor model = \"\";\n\n @property({ converter: jsonAttr }) accessor params: Record<string, unknown> = {};\n\n /** Extra instructions, sent when a chat is created. */\n @property({ attribute: \"system-message\" }) accessor systemMessage = \"\";\n\n /** Retrieval sources sent with every turn: `[{\"type\":\"kdb\",\"namespace\":\"docs\"}]`. */\n @property({ converter: jsonAttr }) accessor retrieval: Record<string, unknown>[] = [];\n\n /** Stored on each user message. Never sent to the model. */\n @property({ converter: jsonAttr }) accessor metadata: Record<string, unknown> = {};\n\n // ── embed and layout ──────────────────────────────────────\n @property({ reflect: true }) accessor embed: ChatEmbed = \"page\";\n\n /** Launcher side. */\n @property({ reflect: true }) accessor position: \"right\" | \"left\" = \"right\";\n\n /**\n * The chat list: `auto` docks it when there's room, `open` / `closed` set\n * how it starts, `none` removes it and its toggle entirely.\n */\n @property({ converter: sidebarAttr }) accessor sidebar: ChatSidebar = \"auto\";\n\n @property({ converter: flagAttr, attribute: \"show-title\" }) accessor showTitle = true;\n\n /** Opens this chat on load. */\n @property({ attribute: \"chat-id\" }) accessor chatIdAttr = \"\";\n\n // ── brand and content ─────────────────────────────────────\n /** Used in placeholders, exports and labels. Never shown above messages. */\n @property({ attribute: \"assistant-name\" }) accessor assistantName = \"Assistant\";\n\n @property({ attribute: \"logo-url\" }) accessor logoUrl = \"\";\n @property() accessor heading = \"\";\n @property() accessor description = \"\";\n\n /** The small label above the heading. Unset uses the mode's; `\"\"` hides it. */\n @property() accessor eyebrow: string | undefined = undefined;\n\n /**\n * Suggested prompts: `|`-separated in markup, an array in JavaScript.\n * `\"none\"` or `[]` shows no suggestions.\n */\n @property() accessor prompts: string | (string | ChatPrompt)[] = \"\";\n\n @property({ attribute: \"bubble-text\" }) accessor bubbleText = \"\";\n @property({ type: Boolean, attribute: \"greeting-bubble\" }) accessor greetingBubble = false;\n @property({ type: Boolean, attribute: \"unread-badge\" }) accessor unreadBadge = false;\n\n @property({ converter: flagAttr, attribute: \"allow-upload\" }) accessor allowUpload = true;\n @property({ converter: flagAttr, attribute: \"allow-export\" }) accessor allowExport = true;\n\n /** Copy buttons on messages. */\n @property({ converter: flagAttr, attribute: \"allow-copy\" }) accessor allowCopy = true;\n\n /** Regenerate on the latest reply. */\n @property({ converter: flagAttr, attribute: \"allow-regenerate\" }) accessor allowRegenerate = true;\n\n /** Bookmark buttons for chats and messages. */\n @property({ converter: flagAttr, attribute: \"allow-bookmark\" }) accessor allowBookmark = true;\n\n /** Delete buttons for chats and messages. */\n @property({ converter: flagAttr, attribute: \"allow-delete\" }) accessor allowDelete = true;\n\n /** Renaming a chat from its title or the chat list. */\n @property({ converter: flagAttr, attribute: \"allow-rename\" }) accessor allowRename = true;\n\n /** The helpful / not helpful buttons on replies. */\n @property({ converter: flagAttr, attribute: \"allow-feedback\" }) accessor allowFeedback = true;\n\n /**\n * The message box. Off, the chat only shows the conversation — pair it with\n * `chat-id` to display a saved chat read-only.\n */\n @property({ converter: flagAttr, attribute: \"show-composer\" }) accessor showComposer = true;\n\n /** Message times in the toolbars. */\n @property({ converter: flagAttr, attribute: \"show-time\" }) accessor showTime = true;\n\n /**\n * The line under the composer. Unset uses the default (\"{name} can make\n * mistakes…\"); an empty string hides it.\n */\n @property() accessor footnote: string | undefined = undefined;\n\n /** A per-reply toggle between the formatted answer and the text as written. */\n @property({ type: Boolean, attribute: \"allow-raw\" }) accessor allowRaw = false;\n\n /** The \"Chat by Singlebase\" credit. A plain link — it makes no request. */\n @property({ converter: flagAttr }) accessor branding = true;\n\n // ── state ─────────────────────────────────────────────────\n @state() private accessor chatList: ChatSummary[] = [];\n @state() private accessor listState: \"idle\" | \"loading\" | \"ready\" | \"error\" = \"idle\";\n @state() private accessor activeId: string | null = null;\n @state() private accessor chatTitle = \"\";\n @state() private accessor bookmarked = false;\n @state() private accessor msgs: ChatMessage[] = [];\n @state() private accessor loadingThread = false;\n @state() private accessor threadError = \"\";\n @state() private accessor busy = false;\n @state() private accessor draft = \"\";\n @state() private accessor files: ChatAttachment[] = [];\n @state() private accessor search = \"\";\n @state() private accessor sidebarOpen: boolean | null = null;\n @state() private accessor width = 0;\n @state() private accessor panel: { key: string; n: number } | null = null;\n @state() private accessor menuOpen = false;\n @state() private accessor editingKey = \"\";\n @state() private accessor editDraft = \"\";\n @state() private accessor editingTitle = false;\n @state() private accessor renamingId = \"\";\n @state() private accessor toast: Toast | null = null;\n @state() private accessor copiedKey = \"\";\n @state() private accessor retrievalOpen = new Set<string>();\n @state() private accessor rawKeys = new Set<string>();\n @state() private accessor savedFiles: ChatSavedAttachment[] = [];\n @state() private accessor hasSidebarContent = false;\n @state() private accessor sorts = new Map<string, { col: number; dir: 1 | -1 }>();\n @state() private accessor arrivedKey = \"\";\n @state() private accessor dragging = false;\n @state() private accessor showJump = false;\n @state() private accessor offline = false;\n @state() private accessor isOpen = false;\n @state() private accessor expanded = false;\n @state() private accessor bubble = false;\n @state() private accessor seen = false;\n @state() private accessor mobile = false;\n\n private run = 0;\n private abort: AbortController | null = null;\n private revealTimer: ReturnType<typeof setInterval> | undefined;\n private timers = new Set<ReturnType<typeof setTimeout>>();\n private toastTimer: ReturnType<typeof setTimeout> | undefined;\n private stick = true;\n private renamed = new Set<string>();\n private observer: ResizeObserver | null = null;\n private observed: Element | null = null;\n private media: MediaQueryList | null = null;\n private focusNext = \"\";\n private bubbleScheduled = false;\n private pendingChatId = \"\";\n\n get msg(): SinglebaseChatMessages {\n return resolveChatMessages(this.messages);\n }\n\n /** An explicit `.client`, else the page default. */\n get resolvedClient(): ChatClient | null {\n return this.client ?? getDefaultClient<SinglebaseClientInstance>() ?? null;\n }\n\n /** The open conversation's id, or null for a new chat. */\n get chatId(): string | null {\n return this.activeId;\n }\n\n /** The open conversation's messages. */\n get thread(): readonly ChatMessage[] {\n return this.msgs;\n }\n\n /** `format`, falling back to the default for anything unknown. */\n /** `docsets` as a clean list of ids. */\n private get docsetIds(): string[] {\n const value = this.docsets;\n const list = Array.isArray(value) ? value : String(value ?? \"\").split(/[\\s,]+/);\n return [...new Set(list.map((id) => String(id).trim()).filter(Boolean))];\n }\n\n /** The files this chat keeps on the service. */\n get attachments(): readonly ChatSavedAttachment[] {\n return this.savedFiles;\n }\n\n private get formatLevel(): ChatFormat {\n return ([\"raw\", \"plain\", \"advanced\", \"rich\"] as const).includes(this.format)\n ? this.format\n : \"advanced\";\n }\n\n /** The loaded chat list. */\n get chats(): readonly ChatSummary[] {\n return this.chatList;\n }\n\n /**\n * Every setting in one object, keyed by property name:\n *\n * chat.config = { client, mode: \"rag\", format: \"rich\", retrieval: [...], chatId: \"…\" };\n *\n * Unknown keys are ignored. `chatId` opens that chat; reading `config`\n * returns the current settings with `chatId` as the open chat.\n */\n set config(value: Partial<ChatConfig>) {\n if (!value) return;\n const target = this as unknown as Record<string, unknown>;\n if (\"client\" in value) this.client = value.client ?? null;\n for (const key of CONFIG_KEYS) {\n if (key in value) target[key] = value[key];\n }\n if (value.chatId && value.chatId !== this.activeId) {\n if (this.hasUpdated) void this.openChat(value.chatId);\n else this.chatIdAttr = value.chatId;\n }\n }\n\n /**\n * Changes settings on the fly. Only the keys you pass change; the chat keeps\n * its conversation and re-renders in place. Returns the element, so calls chain.\n *\n * chat.configure({ format: \"rich\" }).configure({ theme: \"dark\" });\n */\n configure(options: Partial<ChatConfig>): this {\n this.config = options;\n return this;\n }\n\n get config(): Partial<ChatConfig> {\n const source = this as unknown as Record<string, unknown>;\n return {\n client: this.client,\n chatId: this.activeId ?? \"\",\n ...Object.fromEntries(CONFIG_KEYS.map((key) => [key, source[key]]))\n };\n }\n\n // ── lifecycle ─────────────────────────────────────────────\n override connectedCallback(): void {\n super.connectedCallback();\n this.offline = typeof navigator !== \"undefined\" && navigator.onLine === false;\n window.addEventListener(\"online\", this.onNetwork);\n window.addEventListener(\"offline\", this.onNetwork);\n this.media = typeof matchMedia !== \"undefined\" ? matchMedia(\"(max-width: 559px)\") : null;\n this.mobile = !!this.media?.matches;\n this.media?.addEventListener(\"change\", this.onMedia);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n window.removeEventListener(\"online\", this.onNetwork);\n window.removeEventListener(\"offline\", this.onNetwork);\n this.media?.removeEventListener(\"change\", this.onMedia);\n this.observer?.disconnect();\n this.observer = null;\n this.observed = null;\n this.flushToast();\n this.halt();\n this.timers.forEach(clearTimeout);\n this.timers.clear();\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n if (changed.has(\"retrieval\") && !Array.isArray(this.retrieval)) {\n const value = this.retrieval as unknown;\n this.retrieval = value && typeof value === \"object\" ? [value as Record<string, unknown>] : [];\n }\n if (changed.has(\"params\") && (!this.params || typeof this.params !== \"object\"))\n this.params = {};\n if (changed.has(\"metadata\") && (!this.metadata || typeof this.metadata !== \"object\")) {\n this.metadata = {};\n }\n if (changed.has(\"sidebar\")) {\n if (this.sidebar === \"open\") this.sidebarOpen = true;\n else if (this.sidebar === \"closed\" || this.sidebar === \"none\") this.sidebarOpen = false;\n else if (this.width) this.sidebarOpen = this.docked;\n }\n if (this.embed === \"launcher\" && this.greetingBubble && !this.bubbleScheduled) {\n this.bubbleScheduled = true;\n this.later(() => {\n if (!this.isOpen && !this.seen) this.bubble = true;\n }, 1200);\n }\n }\n\n override firstUpdated(): void {\n if (this.chatIdAttr) void this.openChat(this.chatIdAttr);\n }\n\n override updated(): void {\n // The root is re-created when a launcher opens, so re-observe as needed.\n const root = this.renderRoot.querySelector(\".root\");\n if (root !== this.observed) {\n this.observer?.disconnect();\n this.observed = root;\n if (root && typeof ResizeObserver !== \"undefined\") {\n this.observer ??= new ResizeObserver(([entry]) => {\n const width = Math.round(entry.contentRect.width);\n if (width === this.width) return;\n this.width = width;\n if (this.sidebarOpen === null) this.sidebarOpen = this.sidebar === \"auto\" && this.docked;\n });\n this.observer.observe(root);\n }\n }\n\n if (this.sidebarOpen && this.listState === \"idle\" && this.resolvedClient) void this.loadChats();\n if (this.pendingChatId && this.resolvedClient) void this.openChat(this.pendingChatId);\n\n if (this.focusNext) {\n const target = this.renderRoot.querySelector<HTMLInputElement | HTMLTextAreaElement>(\n this.focusNext\n );\n this.focusNext = \"\";\n if (target) {\n target.focus();\n if (\"select\" in target && target.tagName === \"INPUT\") target.select();\n }\n }\n }\n\n private onNetwork = () => {\n this.offline = navigator.onLine === false;\n };\n\n private onMedia = () => {\n this.mobile = !!this.media?.matches;\n };\n\n private later(fn: () => void, ms: number) {\n const id = setTimeout(() => {\n this.timers.delete(id);\n fn();\n }, ms);\n this.timers.add(id);\n }\n\n private emit(name: string, detail: unknown) {\n this.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true }));\n }\n\n private get docked(): boolean {\n return this.embed === \"page\" && this.width >= DOCK_SIDEBAR_AT;\n }\n\n private get panelDocked(): boolean {\n const used = this.docked && this.sidebarOpen ? SIDEBAR_WIDTH : 0;\n return this.width - used >= DOCK_PANEL_AT;\n }\n\n // ── public API ────────────────────────────────────────────\n /** Starts a new, empty conversation. */\n newChat(): void {\n this.halt();\n this.pendingChatId = \"\";\n this.savedFiles = [];\n this.loadingThread = false;\n this.activeId = null;\n this.chatTitle = \"\";\n this.bookmarked = false;\n this.msgs = [];\n this.threadError = \"\";\n this.resetViewState();\n this.focusNext = \"textarea.input\";\n }\n\n /** Opens a saved conversation. */\n async openChat(id: string): Promise<void> {\n const client = this.resolvedClient;\n if (!id) return;\n this.halt();\n this.savedFiles = [];\n const summary = this.chatList.find((chat) => chat._id === id);\n this.activeId = id;\n this.chatTitle = summary?.title ?? \"\";\n this.bookmarked = !!summary?.bookmarked;\n this.msgs = [];\n this.threadError = \"\";\n this.resetViewState();\n if (!client) {\n // Opened before a client was set (common when `.client` is assigned\n // after the element is created): open it as soon as one arrives.\n this.pendingChatId = id;\n this.loadingThread = true;\n return;\n }\n\n const run = ++this.run;\n this.pendingChatId = \"\";\n this.loadingThread = true;\n try {\n const data = await client.llm.call<ChatSummary & { messages?: any[] }>(\"get_chat\", {\n _id: id\n });\n if (run !== this.run) return;\n this.chatTitle = data?.title ?? \"\";\n this.bookmarked = !!data?.bookmarked;\n this.msgs = (data?.messages ?? [])\n .filter((m) => m && (m.role === \"user\" || m.role === \"assistant\"))\n .map((m) => this.fromServer(m));\n this.savedFiles = toSavedFiles((data as { attachments?: unknown })?.attachments);\n this.upsertChat({ ...summary, ...data, _id: id } as ChatSummary);\n this.stick = true;\n void this.scrollToBottom();\n } catch (error) {\n if (run !== this.run) return;\n if (isNotFound(error)) {\n this.chatList = this.chatList.filter((chat) => chat._id !== id);\n this.newChat();\n this.showToast(this.msg.errNotFound);\n } else {\n this.threadError = this.msg.errLoad;\n }\n } finally {\n if (run === this.run) this.loadingThread = false;\n }\n }\n\n /** Sends a message; with no argument, sends the composer's text. */\n async send(text?: string): Promise<void> {\n const content = (typeof text === \"string\" ? text : this.draft).trim();\n if (!content || this.busy) return;\n const attachments = this.files;\n this.draft = \"\";\n this.files = [];\n const input = this.renderRoot.querySelector<HTMLTextAreaElement>(\"textarea.input\");\n if (input) input.style.height = \"auto\";\n await this.runTurn(this.userMessage(content, attachments));\n }\n\n /** Stops waiting for, or revealing, the current reply. */\n stop(): void {\n if (!this.busy) return;\n const last = this.msgs[this.msgs.length - 1];\n this.halt();\n if (last?.role === \"assistant\" && (last.phase === \"pending\" || last.phase === \"streaming\")) {\n last.phase = \"done\";\n last.stopped = true;\n last.followups = [];\n this.msgs = [...this.msgs];\n }\n }\n\n /** Downloads the open conversation, or copies it as Markdown. */\n exportChat(format: ChatExportFormat = \"md\"): void {\n if (!this.msgs.length) return;\n this.menuOpen = false;\n const title = this.chatTitle || this.msg.untitled;\n const who = (m: ChatMessage) => (m.role === \"user\" ? this.msg.you : this.assistantName);\n const when = (at: number) => new Date(at || Date.now()).toLocaleString();\n const sources = (m: ChatMessage) =>\n m.sources.map((s, i) => {\n const d = describeSource(s, i + 1);\n return `[${d.n}] ${d.title}${d.path ? ` — ${d.path}` : \"\"}`;\n });\n const files = (m: ChatMessage) => (m.attachments ?? []).map((a) => a.name);\n\n let body: string;\n let mime = \"text/markdown\";\n let ext = \"md\";\n if (format === \"json\") {\n body = JSON.stringify(\n {\n exportedAt: new Date().toISOString(),\n id: this.activeId,\n title,\n mode: this.mode,\n bookmarked: this.bookmarked,\n messages: this.msgs.map((m) => ({\n role: m.role,\n text: m.content,\n at: new Date(m.at || Date.now()).toISOString(),\n bookmarked: m.bookmarked,\n attachments: files(m),\n sources: sources(m)\n }))\n },\n null,\n 2\n );\n mime = \"application/json\";\n ext = \"json\";\n } else if (format === \"txt\") {\n body =\n `${title}\\n${\"=\".repeat(title.length)}\\n\\n` +\n this.msgs\n .map((m) =>\n [\n `${who(m)} · ${when(m.at)}`,\n files(m).length ? `Attachments: ${files(m).join(\", \")}` : \"\",\n m.content,\n sources(m).length ? `Sources:\\n${sources(m).join(\"\\n\")}` : \"\"\n ]\n .filter(Boolean)\n .join(\"\\n\")\n )\n .join(\"\\n\\n\");\n mime = \"text/plain\";\n ext = \"txt\";\n } else {\n body =\n `# ${title}\\n\\n` +\n this.msgs\n .map((m) =>\n [\n `### ${who(m)} · ${when(m.at)}`,\n files(m).length ? `Attachments: ${files(m).join(\", \")}` : \"\",\n m.content,\n sources(m).length\n ? `**Sources**\\n\\n${sources(m)\n .map((s) => `- ${s}`)\n .join(\"\\n\")}`\n : \"\"\n ]\n .filter(Boolean)\n .join(\"\\n\\n\")\n )\n .join(\"\\n\\n---\\n\\n\") +\n \"\\n\";\n }\n\n this.emit(\"singlebase-chat-export\", { chatId: this.activeId, format });\n if (format === \"copy\") {\n void navigator.clipboard?.writeText(body).catch(() => {});\n this.showToast(this.msg.copiedMarkdown);\n return;\n }\n\n const slug =\n title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\") || \"chat\";\n const name = `${slug}-${new Date().toISOString().slice(0, 10)}.${ext}`;\n const url = URL.createObjectURL(new Blob([body], { type: mime }));\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = name;\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n setTimeout(() => URL.revokeObjectURL(url), 2000);\n this.showToast(fill(this.msg.exported, { name }));\n }\n\n /** Inline and launcher: fill the window. */\n expand(): void {\n this.expanded = true;\n this.emit(\"singlebase-chat-expand\", { expanded: true });\n }\n\n collapse(): void {\n this.expanded = false;\n this.emit(\"singlebase-chat-expand\", { expanded: false });\n }\n\n /** Launcher: open the panel. */\n open(): void {\n this.isOpen = true;\n this.seen = true;\n this.bubble = false;\n this.focusNext = \"textarea.input\";\n this.emit(\"singlebase-chat-open\", {});\n }\n\n /** Launcher: close the panel. */\n close(): void {\n this.isOpen = false;\n this.expanded = false;\n this.emit(\"singlebase-chat-close\", {});\n }\n\n // ── turns ─────────────────────────────────────────────────\n private userMessage(content: string, attachments: ChatAttachment[] = []): ChatMessage {\n return {\n key: newKey(),\n id: null,\n role: \"user\",\n content,\n at: Date.now(),\n bookmarked: false,\n sources: [],\n followups: [],\n phase: \"done\",\n attachments\n };\n }\n\n private systemPrompt(): string {\n return [\n this.systemMessage,\n MODE_PROMPTS[this.mode] ?? MODE_PROMPTS.chat,\n FORMAT_PROMPTS[this.formatLevel],\n this.followups ? FOLLOWUP_PROMPT : \"\"\n ]\n .filter(Boolean)\n .join(\"\\n\\n\");\n }\n\n private payloadFor(user: ChatMessage): Record<string, unknown> {\n const payload: Record<string, unknown> = { message: user.content, format: \"markdown\" };\n if (this.activeId) {\n payload._id = this.activeId;\n } else {\n payload.title = provisionalTitle(user.content);\n payload.system_message = this.systemPrompt();\n }\n payload.mode = this.mode;\n if (this.model) payload.model = this.model;\n if (Object.keys(this.params ?? {}).length) payload.params = this.params;\n\n // Files go either as this turn's retrieval (works everywhere) or, with\n // attachments-mode=\"payload\", as attachments the service keeps on the chat.\n const files = user.attachments ?? [];\n const asPayload = this.attachmentsMode === \"payload\";\n if (asPayload && files.length) {\n payload.attachments = files.map((file) => ({\n type: \"content\",\n content: file.content,\n name: file.name,\n ...(file.mime ? { mime: file.mime } : {}),\n size: file.size,\n save_attachment: this.saveAttachments\n }));\n }\n\n const names = asPayload ? [] : files.map((file) => file.name);\n if (Object.keys(this.metadata ?? {}).length || names.length) {\n payload.metadata = { ...this.metadata, ...(names.length ? { attachments: names } : {}) };\n }\n\n const docsets = this.docsetIds;\n const retrieval = [\n ...(docsets.length ? [{ source: \"docset\", ids: docsets }] : []),\n ...(this.retrieval ?? []),\n ...(asPayload ? [] : toRetrieval(files))\n ];\n if (retrieval.length) payload.retrieval = retrieval;\n return payload;\n }\n\n private async runTurn(user: ChatMessage): Promise<void> {\n const bot: ChatMessage = {\n key: newKey(),\n id: null,\n role: \"assistant\",\n content: \"\",\n at: Date.now(),\n bookmarked: false,\n sources: [],\n followups: [],\n phase: \"pending\"\n };\n this.msgs = [...this.msgs, user, bot];\n this.busy = true;\n this.panel = null;\n this.stick = true;\n void this.scrollToBottom();\n this.emit(\"singlebase-chat-send\", { chatId: this.activeId, text: user.content });\n\n const client = this.resolvedClient;\n if (!client) {\n this.failTurn(bot, this.msg.errNoClient, \"NO_CLIENT\");\n this.busy = false;\n return;\n }\n\n const run = ++this.run;\n const controller = new AbortController();\n this.abort = controller;\n const isNew = !this.activeId;\n let payload = this.payloadFor(user);\n\n if (this.beforeSend) {\n let out: unknown;\n try {\n out = await this.beforeSend(payload, { chatId: this.activeId, isNew, message: user });\n } catch (error) {\n out = error;\n }\n if (run !== this.run) return;\n if (out === false) {\n // Cancelled: nothing was sent, so undo the turn and give the text back.\n this.msgs = this.msgs.filter((m) => m !== user && m !== bot);\n this.draft = user.content;\n this.busy = false;\n this.abort = null;\n return;\n }\n const valid =\n !!out &&\n typeof out === \"object\" &&\n typeof (out as { message?: unknown }).message === \"string\";\n if (!valid || !(out as { message: string }).message.trim()) {\n // Never fall back to the unmodified request: a hook that strips data\n // and forgets to return must not send the original.\n console.error(\n \"[singlebase-chat] beforeSend must return the request object (with a message) or false to cancel; the message was not sent.\",\n out\n );\n this.failTurn(bot, this.msg.errGeneric, \"BEFORE_SEND_INVALID\");\n this.busy = false;\n this.abort = null;\n return;\n }\n payload = out as Record<string, unknown>;\n }\n\n try {\n const data = await client.llm.call<any>(\"chat\", payload, { signal: controller.signal });\n const chatId: string | null = data?._id || data?.chat_id || this.activeId;\n\n // A new chat exists now even if the user moved on; keep it in the list.\n if (isNew && chatId) {\n this.upsertChat({\n _id: chatId,\n title: data?.title || (payload.title as string),\n bookmarked: !!data?.bookmarked,\n _modified_at: new Date().toISOString()\n });\n }\n if (run !== this.run) return;\n\n if (chatId) this.activeId = chatId;\n if (isNew) {\n this.chatTitle = data?.title || (payload.title as string);\n this.bookmarked = !!data?.bookmarked;\n }\n\n const reply = data?.message ?? {};\n const raw =\n typeof reply.content === \"string\"\n ? reply.content\n : data?.json !== undefined\n ? JSON.stringify(data.json, null, 2)\n : \"\";\n const { text, followups } = splitFollowups(raw);\n user.id = reply.reply_to ?? null;\n this.applyAttachmentResults(data?.attachments);\n Object.assign(bot, {\n id: reply._id ?? null,\n content: text,\n sources: Array.isArray(reply.sources) ? reply.sources : [],\n followups,\n execTime: typeof reply.exec_time === \"number\" ? reply.exec_time : undefined,\n model: reply.model,\n at: Date.now()\n });\n this.emit(\"singlebase-chat-response\", { chatId, message: bot });\n\n await this.reveal(bot, run);\n if (isNew && chatId && this.autoTitle) void this.retitle(chatId, user.content, bot.content);\n } catch (error) {\n if (run !== this.run) return;\n const notFound = isNotFound(error);\n if (notFound) {\n this.chatList = this.chatList.filter((chat) => chat._id !== this.activeId);\n this.activeId = null;\n }\n const code = errorCode(error);\n const message = notFound\n ? this.msg.errNotFound\n : code === \"KB_SOURCE_REQUIRED\"\n ? this.msg.errKbSource\n : this.msg.errGeneric;\n this.failTurn(bot, message, code);\n } finally {\n if (run === this.run) {\n this.busy = false;\n this.abort = null;\n // Follow-ups appear once the turn is over; keep them in view.\n if (this.stick) void this.scrollToBottom();\n }\n }\n }\n\n private failTurn(bot: ChatMessage, message: string, code: string) {\n bot.phase = \"error\";\n bot.error = message;\n this.msgs = [...this.msgs];\n this.emit(\"singlebase-chat-error\", { chatId: this.activeId, code, message });\n }\n\n /**\n * The service answers in one piece; this reveals it progressively so it\n * reads like a stream. Capped at about a second and a half.\n */\n private reveal(bot: ChatMessage, run: number): Promise<void> {\n const total = bot.content.length;\n const finish = () => {\n bot.phase = \"done\";\n this.msgs = [...this.msgs];\n this.arrivedKey = bot.key;\n this.later(() => {\n if (this.arrivedKey === bot.key) this.arrivedKey = \"\";\n }, ARRIVED_MS);\n if (this.stick) void this.scrollToBottom();\n else this.showJump = true;\n };\n\n if (!total || reducedMotion()) {\n finish();\n return Promise.resolve();\n }\n\n const full = bot.content;\n const step = Math.max(4, Math.ceil(total / 90));\n let shown = 0;\n bot.phase = \"streaming\";\n bot.content = \"\";\n\n return new Promise((resolve) => {\n this.revealTimer = setInterval(() => {\n if (run !== this.run) {\n clearInterval(this.revealTimer);\n resolve();\n return;\n }\n shown = Math.min(total, shown + step);\n bot.content = full.slice(0, shown);\n if (shown >= total) {\n clearInterval(this.revealTimer);\n finish();\n resolve();\n return;\n }\n this.msgs = [...this.msgs];\n if (this.stick) void this.scrollToBottom();\n }, 16);\n });\n }\n\n /** Cancels any request or reveal in flight. */\n private halt() {\n this.run++;\n this.abort?.abort();\n this.abort = null;\n clearInterval(this.revealTimer);\n this.busy = false;\n }\n\n private async retitle(chatId: string, question: string, answer: string) {\n const client = this.resolvedClient;\n if (!client || this.renamed.has(chatId)) return;\n try {\n const data = await client.llm.call<{ result?: unknown }>(\"generate\", {\n user_input: `user: ${question}\\nassistant: ${answer.slice(0, 1500)}`,\n custom_instructions:\n \"Write a concise title (3–6 words, sentence case, no quotes, no trailing punctuation) for this conversation.\",\n format: \"text\"\n });\n const title = cleanTitle(data?.result);\n if (!title || this.renamed.has(chatId)) return;\n await client.llm.call(\"update_chat\", { _id: chatId, title });\n this.applyTitle(chatId, title, true);\n } catch {\n // Cosmetic: the provisional title stays.\n }\n }\n\n private applyTitle(chatId: string, title: string, auto: boolean) {\n this.chatList = this.chatList.map((chat) => (chat._id === chatId ? { ...chat, title } : chat));\n if (this.activeId === chatId) this.chatTitle = title;\n this.emit(\"singlebase-chat-title\", { chatId, title, auto });\n }\n\n /**\n * Enter and blur both land here. Saving on Enter directly (not via blur())\n * matters: blur never fires on an input that doesn't have focus.\n */\n private commitTitle(value: string) {\n if (!this.editingTitle) return;\n this.editingTitle = false;\n if (this.activeId) void this.renameChat(this.activeId, value);\n }\n\n private commitRename(chatId: string, value: string) {\n if (this.renamingId !== chatId) return;\n this.renamingId = \"\";\n void this.renameChat(chatId, value);\n }\n\n private async renameChat(chatId: string, value: string) {\n const title = value.trim().slice(0, 80);\n const previous = this.chatList.find((chat) => chat._id === chatId)?.title ?? this.chatTitle;\n if (!title || title === previous) return;\n this.renamed.add(chatId);\n this.applyTitle(chatId, title, false);\n try {\n await this.resolvedClient?.llm.call(\"update_chat\", { _id: chatId, title });\n } catch {\n this.applyTitle(chatId, previous ?? \"\", false);\n this.showToast(this.msg.errGeneric);\n }\n }\n\n private fromServer(m: any): ChatMessage {\n const assistant = m.role === \"assistant\";\n const { text, followups } = assistant\n ? splitFollowups(String(m.content ?? \"\"))\n : { text: String(m.content ?? \"\"), followups: [] };\n return {\n key: newKey(),\n id: m._id ?? null,\n role: assistant ? \"assistant\" : \"user\",\n content: text,\n at: Date.parse(m._created_at ?? \"\") || 0,\n bookmarked: !!m.bookmarked,\n sources: Array.isArray(m.sources) ? m.sources : [],\n followups,\n phase: \"done\",\n execTime: typeof m.exec_time === \"number\" ? m.exec_time : undefined,\n model: m.model\n };\n }\n\n // ── chat list ─────────────────────────────────────────────\n private async loadChats() {\n const client = this.resolvedClient;\n if (!client) return;\n this.listState = \"loading\";\n try {\n const data = await client.llm.call<{ items?: ChatSummary[] }>(\"list_chats\", { limit: 100 });\n this.chatList = [...(data?.items ?? [])];\n this.listState = \"ready\";\n } catch {\n this.listState = \"error\";\n }\n }\n\n /**\n * A new chat goes on top. A chat already in the list is updated where it is,\n * keeping its dates, so opening or using a chat never reorders the list; the\n * next load from the server brings the fresh order.\n */\n private upsertChat(chat: ChatSummary) {\n const index = this.chatList.findIndex((c) => c._id === chat._id);\n if (index < 0) {\n this.chatList = [chat, ...this.chatList];\n return;\n }\n const existing = this.chatList[index];\n const next = [...this.chatList];\n next[index] = {\n ...existing,\n ...chat,\n _created_at: existing._created_at ?? chat._created_at,\n _modified_at: existing._modified_at ?? chat._modified_at\n };\n this.chatList = next;\n }\n\n // ── actions ───────────────────────────────────────────────\n private resetViewState() {\n this.panel = null;\n this.menuOpen = false;\n this.editingKey = \"\";\n this.editingTitle = false;\n this.showJump = false;\n this.retrievalOpen = new Set();\n // A docked list stays put; a drawer gets out of the way.\n if (this.sidebarOpen && !this.docked) this.sidebarOpen = false;\n }\n\n private async deleteOnServer(ids: (string | null)[]) {\n const client = this.resolvedClient;\n const chatId = this.activeId;\n if (!client || !chatId) return;\n for (const id of ids) {\n if (!id) continue;\n await client.llm.call(\"delete_chat_message\", { _id: chatId, message_id: id }).catch(() => {});\n }\n }\n\n private async regenerate() {\n if (this.busy) return;\n const index = this.msgs.map((m) => m.role).lastIndexOf(\"assistant\");\n const user = this.msgs[index - 1];\n if (index < 1 || user?.role !== \"user\") return;\n const removed = this.msgs.slice(index - 1);\n this.msgs = this.msgs.slice(0, index - 1);\n await this.deleteOnServer(removed.map((m) => m.id));\n await this.runTurn(this.userMessage(user.content, user.attachments));\n }\n\n private async retry(bot: ChatMessage) {\n if (this.busy) return;\n const index = this.msgs.indexOf(bot);\n const user = this.msgs[index - 1];\n if (user?.role !== \"user\") return;\n this.msgs = this.msgs.slice(0, index - 1);\n await this.runTurn(this.userMessage(user.content, user.attachments));\n }\n\n private async saveEdit(m: ChatMessage) {\n const text = this.editDraft.trim();\n const index = this.msgs.indexOf(m);\n this.editingKey = \"\";\n if (!text || index < 0 || this.busy) return;\n const removed = this.msgs.slice(index);\n this.msgs = this.msgs.slice(0, index);\n await this.deleteOnServer(removed.map((x) => x.id));\n await this.runTurn(this.userMessage(text, m.attachments));\n }\n\n private toggleRaw(key: string) {\n const next = new Set(this.rawKeys);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n this.rawKeys = next;\n }\n\n /** Adds newly saved files, and says which ones the service couldn't read. */\n private applyAttachmentResults(list: unknown) {\n if (!Array.isArray(list)) return;\n const saved = toSavedFiles(list).filter((f) => !this.savedFiles.some((x) => x.id === f.id));\n if (saved.length) this.savedFiles = [...this.savedFiles, ...saved];\n const failed = list\n .filter((item) => item?.status === \"failed\")\n .map((item) => String(item.name ?? \"file\"));\n if (failed.length) this.showToast(fill(this.msg.attachmentFailed, { name: failed.join(\", \") }));\n }\n\n /** Removes a file the service keeps on this chat. */\n private async removeSavedFile(file: ChatSavedAttachment) {\n const chatId = this.activeId;\n if (!chatId) return;\n const before = this.savedFiles;\n this.savedFiles = before.filter((f) => f !== file);\n try {\n await this.resolvedClient?.llm.call(\"remove_chat_attachment\", {\n _id: chatId,\n attachment_id: file.id\n });\n } catch {\n if (this.activeId === chatId) this.savedFiles = before;\n this.showToast(this.msg.errGeneric);\n }\n }\n\n private copy(key: string, text: string) {\n void navigator.clipboard?.writeText(text).catch(() => {});\n this.copiedKey = key;\n this.later(() => {\n if (this.copiedKey === key) this.copiedKey = \"\";\n }, 1400);\n }\n\n private async toggleMessageBookmark(m: ChatMessage) {\n const chatId = this.activeId;\n if (!chatId || !m.id) return;\n m.bookmarked = !m.bookmarked;\n this.msgs = [...this.msgs];\n this.showToast(m.bookmarked ? this.msg.messageBookmarked : this.msg.bookmarkRemoved);\n this.emit(\"singlebase-chat-bookmark\", { chatId, messageId: m.id, bookmarked: m.bookmarked });\n try {\n await this.resolvedClient?.llm.call(\"bookmark_chat_message\", {\n _id: chatId,\n message_id: m.id,\n bookmarked: m.bookmarked\n });\n } catch {\n m.bookmarked = !m.bookmarked;\n this.msgs = [...this.msgs];\n this.showToast(this.msg.errGeneric);\n }\n }\n\n private async toggleChatBookmark(chatId: string) {\n const current =\n this.chatList.find((chat) => chat._id === chatId)?.bookmarked ??\n (chatId === this.activeId ? this.bookmarked : false);\n const next = !current;\n const apply = (value: boolean) => {\n this.chatList = this.chatList.map((chat) =>\n chat._id === chatId ? { ...chat, bookmarked: value } : chat\n );\n if (chatId === this.activeId) this.bookmarked = value;\n };\n apply(next);\n this.showToast(next ? this.msg.chatBookmarked : this.msg.chatUnbookmarked);\n this.emit(\"singlebase-chat-bookmark\", { chatId, bookmarked: next });\n try {\n await this.resolvedClient?.llm.call(\"bookmark_chat\", { _id: chatId, bookmarked: next });\n } catch {\n apply(current);\n this.showToast(this.msg.errGeneric);\n }\n }\n\n /** Removed at once; the server call waits out the undo window. */\n private deleteMessage(m: ChatMessage) {\n const chatId = this.activeId;\n const index = this.msgs.indexOf(m);\n if (index < 0) return;\n this.msgs = this.msgs.filter((x) => x !== m);\n if (this.panel?.key === m.key) this.panel = null;\n this.showToast(this.msg.messageDeleted, {\n undo: () => {\n if (this.activeId !== chatId) return;\n const next = [...this.msgs];\n next.splice(index, 0, m);\n this.msgs = next;\n },\n commit: () => {\n this.emit(\"singlebase-chat-message-delete\", { chatId, messageId: m.id });\n if (chatId && m.id) {\n void this.resolvedClient?.llm\n .call(\"delete_chat_message\", { _id: chatId, message_id: m.id })\n .catch(() => {});\n }\n }\n });\n }\n\n private deleteChat(chatId: string) {\n const index = this.chatList.findIndex((chat) => chat._id === chatId);\n const summary = this.chatList[index] ?? {\n _id: chatId,\n title: this.chatTitle,\n bookmarked: this.bookmarked\n };\n const wasActive = chatId === this.activeId;\n const snapshot = wasActive\n ? { title: this.chatTitle, bookmarked: this.bookmarked, msgs: this.msgs }\n : null;\n this.chatList = this.chatList.filter((chat) => chat._id !== chatId);\n if (wasActive) this.newChat();\n\n this.showToast(this.msg.chatDeleted, {\n undo: () => {\n const next = [...this.chatList];\n next.splice(Math.max(0, index), 0, summary);\n this.chatList = next;\n if (snapshot && !this.activeId && !this.msgs.length) {\n this.activeId = chatId;\n this.chatTitle = snapshot.title;\n this.bookmarked = snapshot.bookmarked;\n this.msgs = snapshot.msgs;\n }\n },\n commit: () => {\n this.emit(\"singlebase-chat-delete\", { chatId });\n void this.resolvedClient?.llm.call(\"delete_chat\", { _id: chatId }).catch(() => {});\n }\n });\n }\n\n private feedback(m: ChatMessage, value: \"up\" | \"down\") {\n m.feedback = value;\n this.msgs = [...this.msgs];\n this.emit(\"singlebase-chat-feedback\", {\n chatId: this.activeId,\n messageId: m.id,\n value,\n text: m.content\n });\n }\n\n // ── toasts ────────────────────────────────────────────────\n private showToast(text: string, actions: { undo?: () => void; commit?: () => void } = {}) {\n this.flushToast();\n const toast: Toast = { key: Date.now(), text, ...actions };\n this.toast = toast;\n this.toastTimer = setTimeout(() => {\n if (this.toast === toast) this.flushToast();\n }, TOAST_MS);\n }\n\n /** Ends the current toast, committing whatever it was holding back. */\n private flushToast() {\n const toast = this.toast;\n clearTimeout(this.toastTimer);\n this.toast = null;\n toast?.commit?.();\n }\n\n private undo() {\n const toast = this.toast;\n clearTimeout(this.toastTimer);\n this.toast = null;\n toast?.undo?.();\n }\n\n // ── files ─────────────────────────────────────────────────\n private async addFiles(list: FileList | File[] | null | undefined) {\n const picked = Array.from(list ?? []);\n if (!picked.length) return;\n const accepted: ChatAttachment[] = [];\n for (const file of picked) {\n if (this.files.length + accepted.length >= MAX_FILES) {\n this.showToast(fill(this.msg.tooManyFiles, { n: MAX_FILES }));\n break;\n }\n if (!TEXT_FILE.test(file.name) && !file.type.startsWith(\"text/\")) {\n this.showToast(fill(this.msg.fileType, { name: file.name }));\n continue;\n }\n if (file.size > MAX_FILE_SIZE) {\n this.showToast(\n fill(this.msg.fileTooLarge, { name: file.name, size: formatSize(MAX_FILE_SIZE) })\n );\n continue;\n }\n accepted.push({\n name: file.name,\n size: file.size,\n content: await file.text(),\n ...(file.type ? { mime: file.type } : {})\n });\n }\n if (!accepted.length) return;\n this.files = [...this.files, ...accepted];\n this.emit(\"singlebase-chat-files\", {\n files: accepted.map(({ name, size }) => ({ name, size }))\n });\n }\n\n // ── scrolling ─────────────────────────────────────────────\n private async scrollToBottom() {\n await this.updateComplete;\n const scroller = this.renderRoot.querySelector(\".scroller\");\n if (scroller) scroller.scrollTop = scroller.scrollHeight;\n this.showJump = false;\n }\n\n private onScroll(event: Event) {\n const el = event.currentTarget as HTMLElement;\n this.stick = el.scrollHeight - el.scrollTop - el.clientHeight < 80;\n if (this.stick) this.showJump = false;\n }\n\n private jumpToLatest() {\n this.stick = true;\n void this.scrollToBottom();\n }\n\n // ── keyboard ──────────────────────────────────────────────\n private onKeydown(event: KeyboardEvent) {\n if (event.key !== \"Escape\") return;\n if (this.menuOpen) this.menuOpen = false;\n else if (this.panel) this.panel = null;\n else if (this.sidebarOpen && !this.docked) this.sidebarOpen = false;\n else if (this.expanded) this.collapse();\n else if (this.embed === \"launcher\" && this.isOpen) this.close();\n else return;\n event.stopPropagation();\n }\n\n private onComposerKey(event: KeyboardEvent) {\n if (event.key === \"Enter\" && !event.shiftKey && !event.isComposing) {\n event.preventDefault();\n void this.send();\n }\n }\n\n private onComposerInput(event: Event) {\n const el = event.target as HTMLTextAreaElement;\n el.style.height = \"auto\";\n el.style.height = `${Math.min(176, el.scrollHeight)}px`;\n this.draft = el.value;\n }\n\n // ── drag and drop ─────────────────────────────────────────\n private onDragEnter(event: DragEvent) {\n if (!this.allowUpload || !this.showComposer) return;\n if (!Array.from(event.dataTransfer?.types ?? []).includes(\"Files\")) return;\n event.preventDefault();\n this.dragging = true;\n }\n\n private onDragLeave(event: DragEvent) {\n const target = event.currentTarget as HTMLElement;\n if (!target.contains(event.relatedTarget as Node)) this.dragging = false;\n }\n\n private onDrop(event: DragEvent) {\n event.preventDefault();\n this.dragging = false;\n if (this.allowUpload) void this.addFiles(event.dataTransfer?.files);\n }\n\n // ── render ────────────────────────────────────────────────\n override render() {\n if (this.embed === \"launcher\") return this.renderLauncher();\n const classes = [\n \"frame\",\n this.embed === \"inline\" ? \"inline boxed\" : \"\",\n this.expanded ? \"expanded boxed\" : \"\"\n ].join(\" \");\n return html`<div class=${classes} part=\"frame\">${this.renderWorkspace()}</div>`;\n }\n\n private renderLauncher() {\n const msg = this.msg;\n const frame = [\n \"frame launcher boxed\",\n this.expanded ? \"expanded\" : \"\",\n this.mobile ? \"full\" : \"\"\n ].join(\" \");\n const panel = this.isOpen\n ? html`<div class=${frame} role=\"dialog\" aria-label=${this.assistantName} part=\"frame\">\n ${this.renderWorkspace()}\n </div>`\n : nothing;\n const bubble =\n this.bubble && !this.isOpen\n ? html`<div class=\"bubble\" part=\"bubble\">\n <button type=\"button\" class=\"bubble-text\" @click=${() => this.open()}>\n ${this.bubbleText || msg.bubbleText}\n </button>\n <button\n type=\"button\"\n class=\"icon sm\"\n aria-label=${msg.dismiss}\n title=${msg.dismiss}\n @click=${() => (this.bubble = false)}\n >\n ${I.close()}\n </button>\n </div>`\n : nothing;\n const hideButton = this.isOpen && (this.expanded || this.mobile);\n const button = hideButton\n ? nothing\n : html`<button\n type=\"button\"\n class=\"launcher-btn\"\n part=\"launcher\"\n aria-label=${this.isOpen ? msg.closeChat : msg.openChat}\n aria-expanded=${this.isOpen ? \"true\" : \"false\"}\n @click=${() => (this.isOpen ? this.close() : this.open())}\n >\n ${this.isOpen ? I.chevronDown() : I.chat()}\n ${this.unreadBadge && !this.seen && !this.isOpen ? html`<span class=\"badge\"></span>` : nothing}\n </button>`;\n return html`${panel}${bubble}${button}`;\n }\n\n private renderWorkspace() {\n const overlay = !this.docked;\n return html`<div class=\"root\" @keydown=${this.onKeydown}>\n ${\n this.sidebarOpen && overlay\n ? html`<div class=\"scrim\" @click=${() => (this.sidebarOpen = false)}></div>`\n : nothing\n }\n ${this.sidebarOpen && this.sidebar !== \"none\" ? this.renderSidebar(overlay) : nothing}\n <main\n class=\"main\"\n @dragenter=${this.onDragEnter}\n @dragover=${(e: DragEvent) => e.preventDefault()}\n >\n ${this.renderHeader()}\n ${this.offline ? html`<div class=\"banner\" role=\"status\">${this.msg.offline}</div>` : nothing}\n <div\n class=\"scroller\"\n role=\"log\"\n aria-live=\"polite\"\n aria-busy=${this.busy ? \"true\" : \"false\"}\n part=\"messages\"\n @scroll=${this.onScroll}\n >\n ${\n this.msgs.length || this.loadingThread || this.threadError\n ? this.renderThread()\n : this.renderWelcome()\n }\n </div>\n ${\n this.showJump\n ? html`<button type=\"button\" class=\"jump\" @click=${this.jumpToLatest}>\n ↓ ${this.msg.newReply}\n </button>`\n : nothing\n }\n ${this.renderComposer()} ${renderBranding(this.branding, \"Chat\")}\n ${\n this.toast\n ? html`<div class=\"toast\" role=\"status\">\n <span>${this.toast.text}</span>\n ${\n this.toast.undo\n ? html`<button type=\"button\" @click=${this.undo}>${this.msg.undo}</button>`\n : nothing\n }\n </div>`\n : nothing\n }\n ${\n this.dragging\n ? html`<div\n class=\"drop\"\n @dragover=${(e: DragEvent) => e.preventDefault()}\n @dragleave=${this.onDragLeave}\n @drop=${this.onDrop}\n >\n <strong>${this.msg.dropTitle}</strong><span>${this.msg.dropSub}</span>\n </div>`\n : nothing\n }\n </main>\n ${this.renderPanel()}\n </div>`;\n }\n\n private renderSidebar(overlay: boolean) {\n const msg = this.msg;\n const query = this.allowSearch ? this.search.trim().toLowerCase() : \"\";\n const shown = this.chatList.filter(\n (chat) => !query || (chat.title ?? \"\").toLowerCase().includes(query)\n );\n // Bookmarked chats get their own group on top, unless show-bookmarked is off.\n const pinned = (c: ChatSummary) => this.showBookmarked && !!c.bookmarked;\n const inDay = (day: ReturnType<typeof dayGroup>) =>\n shown.filter((c) => !pinned(c) && dayGroup(c._modified_at ?? c._created_at) === day);\n const groups: [string, ChatSummary[]][] = [\n [msg.groupBookmarked, shown.filter(pinned)],\n [msg.groupToday, inDay(\"today\")],\n [msg.groupYesterday, inDay(\"yesterday\")],\n [msg.groupWeek, inDay(\"week\")],\n [msg.groupOlder, inDay(\"older\")]\n ];\n\n let body: unknown;\n if (this.listState === \"loading\" && !this.chatList.length) {\n body = html`<div aria-label=${msg.loadingChats}>\n ${[1, 2, 3, 4].map(() => html`<div class=\"skeleton\"></div>`)}\n </div>`;\n } else if (!shown.length) {\n body = html`<span class=\"side-note\"\n >${query ? fill(msg.noMatch, { query: this.search.trim() }) : msg.noChats}</span\n >`;\n } else {\n body = groups\n .filter(([, rows]) => rows.length)\n .map(\n ([label, rows]) =>\n html`<div class=\"group\">${label}</div>\n ${rows.map((chat) => this.renderThreadRow(chat))}`\n );\n }\n\n return html`<aside\n class=\"sidebar ${overlay ? \"overlay\" : \"docked\"}\"\n part=\"sidebar\"\n aria-label=${msg.chats}\n >\n <div class=\"side-head\">\n <span class=\"label\">${msg.chats}</span>\n <button\n type=\"button\"\n class=\"icon\"\n title=${msg.hideSidebar}\n aria-label=${msg.hideSidebar}\n @click=${() => (this.sidebarOpen = false)}\n >\n ${I.sidebar()}\n </button>\n </div>\n <div class=\"side-tools\">\n ${\n this.showNewChat\n ? html`<button type=\"button\" class=\"new-chat\" @click=${() => this.newChat()}>\n ${I.plus()}<span>${msg.newChat}</span>\n </button>`\n : nothing\n }\n ${\n this.allowSearch\n ? html`<input\n class=\"search\"\n type=\"search\"\n placeholder=${msg.searchChats}\n aria-label=${msg.searchChats}\n .value=${this.search}\n @input=${(e: Event) => (this.search = (e.target as HTMLInputElement).value)}\n />`\n : nothing\n }\n </div>\n <div class=\"threads\">${body}</div>\n <div class=\"side-extra ${this.hasSidebarContent ? \"filled\" : \"\"}\" part=\"sidebar-extra\">\n <slot\n name=\"sidebar\"\n @slotchange=${(e: Event) =>\n (this.hasSidebarContent = (e.target as HTMLSlotElement).assignedNodes().length > 0)}\n ></slot>\n </div>\n </aside>`;\n }\n\n private renderThreadRow(chat: ChatSummary) {\n const msg = this.msg;\n const active = chat._id === this.activeId;\n const title = chat.title || msg.untitled;\n if (this.renamingId === chat._id) {\n return html`<div class=\"thread active\">\n <input\n class=\"thread-rename\"\n maxlength=\"80\"\n .value=${title}\n aria-label=${msg.renameChat}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Enter\")\n this.commitRename(chat._id, (e.target as HTMLInputElement).value);\n if (e.key === \"Escape\") {\n e.stopPropagation();\n this.renamingId = \"\";\n }\n }}\n @blur=${(e: Event) => this.commitRename(chat._id, (e.target as HTMLInputElement).value)}\n />\n </div>`;\n }\n const stop = (fn: () => void) => (e: Event) => {\n e.stopPropagation();\n fn();\n };\n return html`<div\n class=\"thread ${active ? \"active\" : \"\"}\"\n role=\"button\"\n tabindex=\"0\"\n aria-current=${active ? \"true\" : \"false\"}\n @click=${() => this.openChat(chat._id)}\n @keydown=${(e: KeyboardEvent) => e.key === \"Enter\" && this.openChat(chat._id)}\n >\n <span class=\"thread-title\">${title}</span>\n <span class=\"thread-actions\">\n ${\n this.allowBookmark\n ? html`<button\n type=\"button\"\n class=\"icon sm ${chat.bookmarked ? \"on\" : \"\"}\"\n title=${chat.bookmarked ? msg.unbookmarkChat : msg.bookmarkChat}\n aria-label=${chat.bookmarked ? msg.unbookmarkChat : msg.bookmarkChat}\n @click=${stop(() => this.toggleChatBookmark(chat._id))}\n >\n ${I.bookmark(!!chat.bookmarked)}\n </button>`\n : nothing\n }\n ${\n this.allowRename\n ? html`<button\n type=\"button\"\n class=\"icon sm\"\n title=${msg.renameChat}\n aria-label=${msg.renameChat}\n @click=${stop(() => {\n this.renamingId = chat._id;\n this.focusNext = \"input.thread-rename\";\n })}\n >\n ${I.pencil()}\n </button>`\n : nothing\n }\n ${\n this.allowDelete\n ? html`<button\n type=\"button\"\n class=\"icon sm danger\"\n title=${msg.deleteChat}\n aria-label=${msg.deleteChat}\n @click=${stop(() => this.deleteChat(chat._id))}\n >\n ${I.trash()}\n </button>`\n : nothing\n }\n </span>\n </div>`;\n }\n\n private renderHeader() {\n const msg = this.msg;\n const hasChat = !!this.activeId;\n const canExpand = (this.embed === \"inline\" || this.embed === \"launcher\") && !this.mobile;\n const minimize =\n this.embed === \"launcher\" ? () => this.close() : this.expanded ? () => this.collapse() : null;\n\n let title: unknown = nothing;\n if (this.showTitle) {\n title = this.editingTitle\n ? html`<input\n class=\"title-input\"\n maxlength=\"80\"\n .value=${this.chatTitle}\n aria-label=${msg.renameChat}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Enter\") this.commitTitle((e.target as HTMLInputElement).value);\n if (e.key === \"Escape\") {\n e.stopPropagation();\n this.editingTitle = false;\n }\n }}\n @blur=${(e: Event) => this.commitTitle((e.target as HTMLInputElement).value)}\n />`\n : html`<button\n type=\"button\"\n class=\"title\"\n part=\"title\"\n ?disabled=${!hasChat || !this.allowRename}\n title=${hasChat && this.allowRename ? msg.renameChat : \"\"}\n @click=${() => {\n this.editingTitle = true;\n this.focusNext = \"input.title-input\";\n }}\n >\n ${this.chatTitle || msg.untitled}\n </button>`;\n }\n\n return html`<header class=\"header\" part=\"header\">\n <div class=\"header-left\">\n ${\n this.sidebar === \"none\" || (this.sidebarOpen && this.docked)\n ? nothing\n : html`<button\n type=\"button\"\n class=\"icon\"\n title=${msg.showChats}\n aria-label=${msg.showChats}\n @click=${() => (this.sidebarOpen = true)}\n >\n ${I.sidebar()}\n </button>`\n }\n ${title}\n </div>\n <div class=\"header-right\">\n ${\n this.sidebar === \"none\" && this.showNewChat\n ? html`<button\n type=\"button\"\n class=\"icon\"\n ?disabled=${!this.msgs.length && !hasChat}\n title=${msg.newChat}\n aria-label=${msg.newChat}\n @click=${() => this.newChat()}\n >\n ${I.plus()}\n </button>`\n : nothing\n }\n ${\n this.allowBookmark\n ? html`<button\n type=\"button\"\n class=\"icon ${this.bookmarked ? \"on\" : \"\"}\"\n ?disabled=${!hasChat}\n title=${this.bookmarked ? msg.unbookmarkChat : msg.bookmarkChat}\n aria-label=${this.bookmarked ? msg.unbookmarkChat : msg.bookmarkChat}\n @click=${() => this.activeId && this.toggleChatBookmark(this.activeId)}\n >\n ${I.bookmark(this.bookmarked)}\n </button>`\n : nothing\n }\n ${\n this.allowExport\n ? html`<div class=\"menu-wrap\">\n <button\n type=\"button\"\n class=\"icon ${this.menuOpen ? \"on\" : \"\"}\"\n ?disabled=${!this.msgs.length}\n title=${msg.exportChat}\n aria-label=${msg.exportChat}\n aria-haspopup=\"menu\"\n aria-expanded=${this.menuOpen ? \"true\" : \"false\"}\n @click=${() => (this.menuOpen = !this.menuOpen)}\n >\n ${I.download()}\n </button>\n ${this.menuOpen ? this.renderExportMenu() : nothing}\n </div>`\n : nothing\n }\n ${\n this.allowDelete\n ? html`<button\n type=\"button\"\n class=\"icon danger\"\n ?disabled=${!hasChat}\n title=${msg.deleteChat}\n aria-label=${msg.deleteChat}\n @click=${() => this.activeId && this.deleteChat(this.activeId)}\n >\n ${I.trash()}\n </button>`\n : nothing\n }\n ${\n canExpand || minimize\n ? html`<span class=\"divider\"></span> ${\n canExpand\n ? html`<button\n type=\"button\"\n class=\"icon\"\n title=${this.expanded ? msg.restore : msg.expand}\n aria-label=${this.expanded ? msg.restore : msg.expand}\n @click=${() => (this.expanded ? this.collapse() : this.expand())}\n >\n ${this.expanded ? I.restore() : I.expand()}\n </button>`\n : nothing\n }\n ${\n minimize\n ? html`<button\n type=\"button\"\n class=\"icon\"\n title=${msg.minimize}\n aria-label=${msg.minimize}\n @click=${minimize}\n >\n ${I.minimize()}\n </button>`\n : nothing\n }`\n : nothing\n }\n </div>\n </header>`;\n }\n\n private renderExportMenu() {\n const msg = this.msg;\n const items: [string, string, ChatExportFormat][] = [\n [msg.exportMarkdown, \".md\", \"md\"],\n [msg.exportJson, \".json\", \"json\"],\n [msg.exportText, \".txt\", \"txt\"],\n [msg.exportCopy, \"\", \"copy\"]\n ];\n return html`<div class=\"menu-scrim\" @click=${() => (this.menuOpen = false)}></div>\n <div class=\"menu\" role=\"menu\">\n <span class=\"label\">${msg.exportHeading}</span>\n ${items.map(\n ([label, ext, format]) =>\n html`<button\n type=\"button\"\n role=\"menuitem\"\n class=\"menu-item\"\n @click=${() => this.exportChat(format)}\n >\n <span>${label}</span><span class=\"ext\">${ext}</span>\n </button>`\n )}\n </div>`;\n }\n\n /** The suggestion cards. `[]` or `\"none\"` shows none; unset uses the mode's. */\n private promptList(): ChatPrompt[] {\n const custom = this.prompts;\n if (Array.isArray(custom)) {\n return custom\n .map((p) => (typeof p === \"string\" ? { text: p } : p))\n .filter((p) => p?.text)\n .slice(0, 4);\n }\n if (typeof custom === \"string\" && custom.trim().toLowerCase() === \"none\") return [];\n if (typeof custom === \"string\" && custom.trim()) {\n return custom\n .split(\"|\")\n .map((text) => text.trim())\n .filter(Boolean)\n .slice(0, 4)\n .map((text) => ({ text }));\n }\n return (DEFAULT_PROMPTS[this.mode] ?? DEFAULT_PROMPTS.chat).map(([label, text]) => ({\n label,\n text\n }));\n }\n\n private renderWelcome() {\n const msg = this.msg;\n const mode = this.mode === \"rag\" ? \"Rag\" : this.mode === \"kb\" ? \"Kb\" : \"Chat\";\n const pick = (key: string) => msg[`${key}${mode}` as keyof SinglebaseChatMessages];\n const eyebrow = this.eyebrow ?? pick(\"eyebrow\");\n const prompts = this.promptList();\n // Anything the page puts in slot=\"welcome\" replaces this whole screen.\n return html`<div class=\"welcome-slot\">\n <slot name=\"welcome\"\n ><div class=\"welcome\" part=\"welcome\">\n <div class=\"welcome-head\">\n ${\n this.logoUrl && isSafeUrl(this.logoUrl, true)\n ? html`<img class=\"welcome-logo\" src=${this.logoUrl} alt=\"\" />`\n : nothing\n }\n ${eyebrow ? html`<span class=\"label\">${eyebrow}</span>` : nothing}\n <h2>${this.heading || pick(\"heading\")}</h2>\n <p>${this.description || pick(\"description\")}</p>\n </div>\n ${\n prompts.length\n ? html`<div class=\"prompts\">\n ${prompts.map(\n (p) =>\n html`<button\n type=\"button\"\n class=\"prompt\"\n part=\"prompt\"\n @click=${() => this.send(p.text)}\n >\n <span class=\"label\">${p.label || \"Suggested\"}</span>\n <span class=\"prompt-text\">${p.text}</span>\n </button>`\n )}\n </div>`\n : nothing\n }\n </div></slot\n >\n </div>`;\n }\n\n private renderThread() {\n const lastBot = this.msgs.map((m) => m.role).lastIndexOf(\"assistant\");\n return html`<div class=\"thread-view\">\n ${\n this.threadError\n ? html`<div class=\"error-card\" role=\"alert\">\n <span>${this.threadError}</span>\n ${\n this.activeId\n ? html`<button\n type=\"button\"\n class=\"btn\"\n @click=${() => this.openChat(this.activeId!)}\n >\n ${this.msg.retry}\n </button>`\n : nothing\n }\n </div>`\n : nothing\n }\n ${this.loadingThread ? html`${[1, 2].map(() => html`<div class=\"skeleton\" style=\"height:48px\"></div>`)}` : nothing}\n ${repeat(\n this.msgs,\n (m) => m.key,\n (m, i) => (m.role === \"user\" ? this.renderUser(m) : this.renderBot(m, i === lastBot))\n )}\n </div>`;\n }\n\n private renderUser(m: ChatMessage) {\n const msg = this.msg;\n const time = m.at\n ? new Date(m.at).toLocaleTimeString([], { hour: \"numeric\", minute: \"2-digit\" })\n : \"\";\n const files = m.attachments ?? [];\n return html`<div class=\"msg user\" part=\"message user\">\n ${\n files.length\n ? html`<div class=\"attachments\">\n ${files.map((f) => html`<span class=\"doc-chip\"><span class=\"ext\">${fileExt(f.name)}</span><span class=\"name\">${f.name}</span></span>`)}\n </div>`\n : nothing\n }\n ${\n this.editingKey === m.key\n ? html`<div class=\"edit-box\">\n <textarea\n rows=\"3\"\n class=\"edit-input\"\n .value=${this.editDraft}\n @input=${(e: Event) => (this.editDraft = (e.target as HTMLTextAreaElement).value)}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n this.editingKey = \"\";\n }\n }}\n ></textarea>\n <div class=\"row-end\">\n <button type=\"button\" class=\"btn\" @click=${() => (this.editingKey = \"\")}>\n ${msg.cancel}\n </button>\n <button type=\"button\" class=\"btn primary\" @click=${() => this.saveEdit(m)}>\n ${msg.saveResend}\n </button>\n </div>\n </div>`\n : html`<div class=\"bubble-user\">${m.content}</div>\n <div class=\"toolbar\">\n ${this.allowBookmark && m.bookmarked ? html`<span class=\"saved\">${I.bookmark(true)}${msg.saved}</span>` : nothing}\n ${this.showTime ? html`<span class=\"time\">${time}</span>` : nothing}\n ${\n !this.busy\n ? html`<button\n type=\"button\"\n class=\"icon\"\n title=${msg.edit}\n aria-label=${msg.edit}\n @click=${() => {\n this.editingKey = m.key;\n this.editDraft = m.content;\n this.focusNext = \"textarea.edit-input\";\n }}\n >\n ${I.pencil()}\n </button>`\n : nothing\n }\n ${\n this.allowCopy\n ? html`<button\n type=\"button\"\n class=\"icon\"\n title=${this.copiedKey === m.key ? msg.copied : msg.copy}\n aria-label=${msg.copy}\n @click=${() => this.copy(m.key, m.content)}\n >\n ${I.copy()}\n </button>`\n : nothing\n }\n ${\n this.allowBookmark && m.id\n ? html`<button\n type=\"button\"\n class=\"icon ${m.bookmarked ? \"on\" : \"\"}\"\n title=${m.bookmarked ? msg.unbookmarkMessage : msg.bookmarkMessage}\n aria-label=${m.bookmarked ? msg.unbookmarkMessage : msg.bookmarkMessage}\n @click=${() => this.toggleMessageBookmark(m)}\n >\n ${I.bookmark(m.bookmarked)}\n </button>`\n : nothing\n }\n ${\n this.allowDelete\n ? html`<button\n type=\"button\"\n class=\"icon danger\"\n title=${msg.deleteMessage}\n aria-label=${msg.deleteMessage}\n @click=${() => this.deleteMessage(m)}\n >\n ${I.trash()}\n </button>`\n : nothing\n }\n </div>`\n }\n </div>`;\n }\n\n private pillLabel(): string {\n if (this.mode === \"rag\" || this.mode === \"kb\") return this.msg.searching;\n return this.msg.thinking;\n }\n\n private renderBot(m: ChatMessage, latest: boolean) {\n const msg = this.msg;\n const pending = m.phase === \"pending\";\n const done = m.phase === \"done\";\n const count = m.sources.length;\n const cited = citedNumbers(m.content);\n const numbered = m.sources.map((s, i) => describeSource(s, i + 1));\n const cards = cited.size ? numbered.filter((s) => cited.has(s.n)) : numbered;\n const time = m.at\n ? new Date(m.at).toLocaleTimeString([], { hour: \"numeric\", minute: \"2-digit\" })\n : \"\";\n const copyText =\n m.content +\n (cards.length ? `\\n\\nSources:\\n${cards.map((s) => `[${s.n}] ${s.title}`).join(\"\\n\")}` : \"\");\n const retrievalOpen = this.retrievalOpen.has(m.key);\n\n return html`<div class=\"msg bot\" part=\"message assistant\">\n ${pending ? html`<div class=\"halo\"></div>` : nothing}\n ${\n this.arrivedKey === m.key\n ? html`<div class=\"arrived\">\n <div class=\"wash\"></div>\n <div class=\"ring\"></div>\n <div class=\"sweep\"></div>\n </div>`\n : nothing\n }\n <div class=\"bot-body\">\n ${this.allowBookmark && m.bookmarked ? html`<span class=\"saved\">${I.bookmark(true)}${msg.saved}</span>` : nothing}\n ${\n pending\n ? html`<div class=\"pill\" role=\"status\">\n <span class=\"ring\"></span><span class=\"dot\"></span>\n <span class=\"shimmer\">${this.pillLabel()}</span>\n </div>`\n : nothing\n }\n ${\n this.showSources && count && !pending\n ? html`<div class=\"retrieval\">\n <button\n type=\"button\"\n class=\"retrieval-toggle\"\n aria-expanded=${retrievalOpen ? \"true\" : \"false\"}\n @click=${() => {\n const next = new Set(this.retrievalOpen);\n if (next.has(m.key)) next.delete(m.key);\n else next.add(m.key);\n this.retrievalOpen = next;\n }}\n >\n <span class=\"chev\">${retrievalOpen ? \"▾\" : \"▸\"}</span>\n <span style=\"flex:1\">${fill(msg.searchedSources, { n: count })}</span>\n ${m.execTime !== undefined ? html`<span class=\"ms\">${m.execTime.toFixed(1)}s</span>` : nothing}\n </button>\n ${\n retrievalOpen\n ? html`<div class=\"retrieval-list\">\n ${numbered.map(\n (s) =>\n html`<button\n type=\"button\"\n class=\"passage\"\n @click=${() => (this.panel = { key: m.key, n: s.n })}\n >\n <span class=\"n\">${s.n}</span>\n <span class=\"what\"\n ><span>${s.title}${s.section ? ` · ${s.section}` : \"\"}</span\n ><span>${s.collection || s.path}</span></span\n >\n ${\n s.score !== null\n ? html`<span class=\"relevance\"\n ><span class=\"score\">${s.score.toFixed(2)}</span>\n <span class=\"relevance-track\"\n ><span\n class=\"relevance-fill\"\n style=\"width:${Math.round(s.score * 100)}%\"\n ></span></span\n ></span>`\n : html`<span></span>`\n }\n </button>`\n )}\n </div>`\n : nothing\n }\n </div>`\n : nothing\n }\n ${!pending ? this.renderAnswer(m) : nothing}\n ${m.phase === \"streaming\" ? html`<span class=\"caret\"></span>` : nothing}\n ${\n m.phase === \"error\"\n ? html`<div class=\"error-card\" role=\"alert\">\n <span>${m.error}</span>\n <button type=\"button\" class=\"btn\" @click=${() => this.retry(m)}>\n ${msg.retry}\n </button>\n </div>`\n : nothing\n }\n ${\n this.showSources && done && cards.length\n ? html`<div class=\"cards\">\n <span class=\"label\">${cited.size ? msg.sourcesCited : msg.sourcesRetrieved}</span>\n <div class=\"card-grid\">\n ${cards.map(\n (s) =>\n html`<button\n type=\"button\"\n class=\"source-card ${this.panel?.key === m.key && this.panel.n === s.n ? \"active\" : \"\"}\"\n @click=${() => (this.panel = { key: m.key, n: s.n })}\n >\n <span class=\"top\"\n ><span class=\"num\">${s.n}</span\n >${s.collection ? html`<span class=\"label\">${s.collection}</span>` : nothing}</span\n >\n <span class=\"t\">${s.title}${s.section ? ` · ${s.section}` : \"\"}</span>\n <span class=\"s\">${s.text}</span>\n </button>`\n )}\n </div>\n </div>`\n : nothing\n }\n ${\n done\n ? html`<div class=\"toolbar ${latest ? \"pinned\" : \"\"}\">\n ${\n this.allowCopy\n ? html`<button\n type=\"button\"\n class=\"icon\"\n title=${this.copiedKey === m.key ? msg.copied : msg.copy}\n aria-label=${msg.copy}\n @click=${() => this.copy(m.key, copyText)}\n >\n ${I.copy()}\n </button>`\n : nothing\n }\n ${\n this.allowRaw && this.formatLevel !== \"raw\" && m.content\n ? html`<button\n type=\"button\"\n class=\"icon ${this.rawKeys.has(m.key) ? \"on\" : \"\"}\"\n title=${this.rawKeys.has(m.key) ? msg.showFormatted : msg.showRaw}\n aria-label=${msg.showRaw}\n aria-pressed=${this.rawKeys.has(m.key) ? \"true\" : \"false\"}\n @click=${() => this.toggleRaw(m.key)}\n >\n ${I.raw()}\n </button>`\n : nothing\n }\n ${\n this.allowRegenerate && latest && !this.busy\n ? html`<button\n type=\"button\"\n class=\"icon\"\n title=${msg.regenerate}\n aria-label=${msg.regenerate}\n @click=${() => this.regenerate()}\n >\n ${I.refresh()}\n </button>`\n : nothing\n }\n ${\n this.allowBookmark && m.id\n ? html`<button\n type=\"button\"\n class=\"icon ${m.bookmarked ? \"on\" : \"\"}\"\n title=${m.bookmarked ? msg.unbookmarkMessage : msg.bookmarkMessage}\n aria-label=${m.bookmarked ? msg.unbookmarkMessage : msg.bookmarkMessage}\n @click=${() => this.toggleMessageBookmark(m)}\n >\n ${I.bookmark(m.bookmarked)}\n </button>`\n : nothing\n }\n ${\n this.allowDelete\n ? html`<button\n type=\"button\"\n class=\"icon danger\"\n title=${msg.deleteMessage}\n aria-label=${msg.deleteMessage}\n @click=${() => this.deleteMessage(m)}\n >\n ${I.trash()}\n </button>`\n : nothing\n }\n ${this.showTime ? html`<span class=\"time\">${time}</span>` : nothing}\n ${m.stopped ? html`<span class=\"note\">${msg.stopped}</span>` : nothing}\n <span class=\"spacer\"></span>\n ${\n !this.allowFeedback\n ? nothing\n : m.feedback\n ? html`<span class=\"note\"\n >${m.feedback === \"up\" ? msg.markedHelpful : msg.thanksFeedback}</span\n >`\n : html`<button\n type=\"button\"\n class=\"icon\"\n title=${msg.helpful}\n aria-label=${msg.helpful}\n @click=${() => this.feedback(m, \"up\")}\n >\n ${I.thumb()}\n </button>\n <button\n type=\"button\"\n class=\"icon\"\n title=${msg.notHelpful}\n aria-label=${msg.notHelpful}\n @click=${() => this.feedback(m, \"down\")}\n >\n ${I.thumb(true)}\n </button>`\n }\n </div>`\n : nothing\n }\n ${\n this.showFollowups && done && latest && !this.busy && m.followups.length\n ? html`<div class=\"followups\">\n ${m.followups.map(\n (q) =>\n html`<button type=\"button\" class=\"followup\" @click=${() => this.send(q)}>\n <span class=\"arrow\">↳</span><span>${q}</span>\n </button>`\n )}\n </div>`\n : nothing\n }\n </div>\n </div>`;\n }\n\n private renderAnswer(m: ChatMessage) {\n if (m.phase === \"error\" && !m.content) return nothing;\n if (m.phase === \"done\" && !m.content) {\n return m.stopped\n ? nothing\n : html`<div class=\"answer\"><p class=\"note\">${this.msg.emptyReply}</p></div>`;\n }\n const level = this.formatLevel;\n if (level === \"raw\" || (this.allowRaw && this.rawKeys.has(m.key))) {\n return html`<div class=\"answer\" part=\"answer\"><p class=\"raw\">${m.content}</p></div>`;\n }\n const source = m.phase === \"streaming\" ? settleStreaming(m.content) : m.content;\n let blocks = adaptBlocks(parseMarkdown(source), level);\n if (this.afterParse) {\n try {\n const out = this.afterParse(blocks, { message: m, format: level });\n if (Array.isArray(out)) blocks = out;\n else\n console.warn(\n \"[singlebase-chat] afterParse must return an array of blocks; showing the original.\"\n );\n } catch (error) {\n console.warn(\"[singlebase-chat] afterParse failed; showing the original.\", error);\n }\n }\n // Citations may go up to the highest source number the service gave.\n const maxCite = m.sources.reduce(\n (max: number, source, i) => Math.max(max, describeSource(source, i + 1).n),\n 0\n );\n return html`<div class=\"answer\" part=\"answer\">\n ${blocks.map((b, i) => this.renderBlock(b, m, maxCite, i))}\n </div>`;\n }\n\n private renderInline(text: string, m: ChatMessage, maxCite: number) {\n return parseInline(text, maxCite).map((seg) => {\n switch (seg.type) {\n case \"bold\":\n return html`<strong>${seg.text}</strong>`;\n case \"italic\":\n return html`<em>${seg.text}</em>`;\n case \"strike\":\n return html`<s>${seg.text}</s>`;\n case \"code\":\n return html`<code class=\"inline\">${seg.text}</code>`;\n case \"link\":\n return html`<a href=${seg.href} target=\"_blank\" rel=\"noopener noreferrer nofollow\"\n >${seg.text}</a\n >`;\n case \"cite\": {\n const cls = this.panel?.key === m.key && this.panel.n === seg.n ? \"cite active\" : \"cite\";\n const label = fill(this.msg.openSource, { n: seg.n });\n const open = () => (this.panel = { key: m.key, n: seg.n });\n // Kept on one line: whitespace inside the chip would sit next to the number.\n // prettier-ignore\n return html`<button type=\"button\" class=${cls} aria-label=${label} @click=${open}>${seg.n}</button>`;\n }\n default:\n return seg.text;\n }\n });\n }\n\n private renderBlock(block: Block, m: ChatMessage, maxCite: number, index: number): unknown {\n switch (block.type) {\n case \"p\":\n return html`<p>${this.renderInline(block.text, m, maxCite)}</p>`;\n case \"raw\":\n return html`<p class=\"raw\">${block.text}</p>`;\n case \"h\":\n return html`<h3 class=\"h${block.level}\">${this.renderInline(block.text, m, maxCite)}</h3>`;\n case \"hr\":\n return html`<hr />`;\n case \"list\":\n return this.renderList(block.ordered, block.items, m, maxCite);\n case \"quote\":\n return html`<div class=\"quote\">${this.renderInline(block.text, m, maxCite)}</div>`;\n case \"callout\":\n return html`<div class=\"callout ${block.kind}\" role=\"note\" part=\"callout\">\n <strong class=\"callout-title\"\n >${block.title || this.msg[CALLOUT_MESSAGE[block.kind]]}</strong\n >\n ${block.text\n .split(\"\\n\")\n .filter((line) => line.trim())\n .map((line) => html`<p>${this.renderInline(line, m, maxCite)}</p>`)}\n </div>`;\n case \"code\":\n return (\n this.renderCustom(block.lang, block.text, m) ??\n this.renderCode(block.lang, block.text, `${m.key}:${index}`)\n );\n case \"table\":\n return this.renderTable(\n block.head,\n block.rows,\n block.align,\n m,\n maxCite,\n `${m.key}:${index}`\n );\n case \"json\":\n return this.renderJsonBlock(block.value, block.source, `${m.key}:${index}`);\n case \"svg\": {\n const url = svgDataUrl(block.source);\n if (!url) return this.renderCode(\"svg\", block.source, `${m.key}:${index}`);\n const key = `${m.key}:${index}`;\n return html`<figure class=\"svg\" part=\"svg\">\n <img src=${url} alt=\"Drawing\" />\n <figcaption>\n <button type=\"button\" class=\"text-btn\" @click=${() => this.copy(key, block.source)}>\n ${this.copiedKey === key ? this.msg.copied : this.msg.copySvg}\n </button>\n </figcaption>\n </figure>`;\n }\n case \"pending\":\n return html`<div class=\"chart-pending\">\n <span class=\"label\"\n >${block.kind === \"svg\" ? this.msg.renderingSvg : this.msg.renderingChart}</span\n >\n </div>`;\n case \"chart\":\n return this.renderChart(block.spec);\n case \"img\":\n return html`<div class=\"gallery ${block.images.length > 1 ? \"many\" : \"\"}\">\n ${block.images.map(\n (image) =>\n html`<figure>\n ${\n image.src && isSafeUrl(image.src, true)\n ? html`<img\n src=${image.src}\n alt=${image.alt}\n loading=\"lazy\"\n referrerpolicy=\"no-referrer\"\n />`\n : html`<div class=\"img-missing\"><span class=\"label\">Image</span></div>`\n }\n ${image.alt ? html`<figcaption>${image.alt}</figcaption>` : nothing}\n </figure>`\n )}\n </div>`;\n default:\n return nothing;\n }\n }\n\n private renderList(ordered: boolean, items: ListItem[], m: ChatMessage, maxCite: number) {\n const rows = items.map(\n (item) =>\n html`<li\n class=${item.checked === null ? \"\" : \"task\"}\n style=${item.depth ? `margin-left:${item.depth * 20}px` : \"\"}\n >\n ${\n item.checked === null\n ? nothing\n : html`<input type=\"checkbox\" disabled .checked=${item.checked} aria-hidden=\"true\" />`\n }\n ${this.renderInline(item.text, m, maxCite)}\n </li>`\n );\n return ordered\n ? html`<ol>\n ${rows}\n </ol>`\n : html`<ul>\n ${rows}\n </ul>`;\n }\n\n private renderCode(lang: string, text: string, key: string) {\n return html`<div class=\"code\">\n <div class=\"code-head\">\n <span class=\"label\">${lang}</span>\n <button type=\"button\" class=\"text-btn\" @click=${() => this.copy(key, text)}>\n ${this.copiedKey === key ? this.msg.copied : this.msg.copy}\n </button>\n </div>\n <pre><code>${text}</code></pre>\n </div>`;\n }\n\n /** A host renderer for this language, at the rich level only. */\n private renderCustom(lang: string, text: string, m: ChatMessage): unknown {\n const draw = this.formatLevel === \"rich\" ? this.renderers?.[lang] : undefined;\n if (typeof draw !== \"function\" || m.phase === \"streaming\") return null;\n try {\n const out = draw(text, { lang, message: m });\n return out === null || out === undefined\n ? null\n : html`<div class=\"custom-block\">${out}</div>`;\n } catch (error) {\n console.warn(`[singlebase-chat] the \"${lang}\" renderer failed; showing the source`, error);\n return null;\n }\n }\n\n private renderTable(\n head: string[],\n rows: string[][],\n align: (string | null)[],\n m: ChatMessage,\n maxCite: number,\n key: string\n ) {\n const numeric = (value: string) =>\n /^[-+]?[$€£¥]?\\s?[\\d,.]+\\s?%?$/.test(value.trim()) && /\\d/.test(value);\n const toNumber = (value: string) => Number(value.replace(/[^\\d.+-]/g, \"\"));\n const alignOf = head.map((_, col) => {\n if (align[col]) return align[col];\n const cells = rows.map((r) => r[col] ?? \"\").filter(Boolean);\n return cells.length && cells.filter(numeric).length / cells.length >= 0.8 ? \"right\" : null;\n });\n\n const sort = this.sorts.get(key);\n let shown = rows;\n if (sort) {\n shown = [...rows].sort((a, b) => {\n const x = a[sort.col] ?? \"\";\n const y = b[sort.col] ?? \"\";\n const diff =\n numeric(x) && numeric(y)\n ? toNumber(x) - toNumber(y)\n : x.localeCompare(y, undefined, { numeric: true });\n return diff * sort.dir;\n });\n }\n const total = shown.length;\n shown = shown.slice(0, MAX_TABLE_ROWS);\n\n const sortBy = (col: number) => {\n const next = new Map(this.sorts);\n const current = next.get(key);\n if (current?.col === col && current.dir === -1) next.delete(key);\n else next.set(key, { col, dir: current?.col === col ? -1 : 1 });\n this.sorts = next;\n };\n const style = (col: number) => (alignOf[col] ? `text-align:${alignOf[col]}` : \"\");\n\n return html`<div class=\"table\" part=\"table\">\n <table>\n <thead>\n <tr>\n ${head.map((cell, col) => {\n const state =\n sort?.col === col ? (sort.dir === 1 ? \"ascending\" : \"descending\") : \"none\";\n return html`<th style=${style(col)} aria-sort=${state}>\n ${\n rows.length > 1\n ? html`<button type=\"button\" class=\"sort\" @click=${() => sortBy(col)}>\n ${this.renderInline(cell, m, maxCite)}<span class=\"arrow\"\n >${state === \"ascending\" ? \"↑\" : state === \"descending\" ? \"↓\" : \"↕\"}</span\n >\n </button>`\n : this.renderInline(cell, m, maxCite)\n }\n </th>`;\n })}\n </tr>\n </thead>\n <tbody>\n ${shown.map(\n (row) =>\n html`<tr>\n ${head.map(\n (_, col) =>\n html`<td style=${style(col)}>\n ${this.renderInline(row[col] ?? \"\", m, maxCite)}\n </td>`\n )}\n </tr>`\n )}\n </tbody>\n </table>\n ${\n total > shown.length\n ? html`<div class=\"table-note\">\n ${fill(this.msg.showingRows, { n: shown.length, total })}\n </div>`\n : nothing\n }\n </div>`;\n }\n\n private renderJsonBlock(value: unknown, source: string, key: string) {\n let nodes = 0;\n const count = (v: unknown): void => {\n nodes++;\n if (nodes <= MAX_JSON_NODES && v && typeof v === \"object\") Object.values(v).forEach(count);\n };\n count(value);\n if (nodes > MAX_JSON_NODES) return this.renderCode(\"json\", source, key);\n\n const node = (v: unknown, depth: number, name?: string): unknown => {\n const label = name === undefined ? nothing : html`<span class=\"jkey\">${name}</span>: `;\n if (v && typeof v === \"object\") {\n const entries = Object.entries(v);\n const meta = Array.isArray(v) ? `[${entries.length}]` : `{${entries.length}}`;\n return html`<details class=\"jnode\" ?open=${depth < 2}>\n <summary>${label}<span class=\"jmeta\">${meta}</span></summary>\n <div class=\"jkids\">${entries.map(([k, child]) => node(child, depth + 1, k))}</div>\n </details>`;\n }\n const type = v === null ? \"null\" : typeof v;\n return html`<div class=\"jleaf\">\n ${label}<span class=\"jv ${type}\">${JSON.stringify(v)}</span>\n </div>`;\n };\n\n return html`<div class=\"code json\" part=\"json\">\n <div class=\"code-head\">\n <span class=\"label\">json</span>\n <button type=\"button\" class=\"text-btn\" @click=${() => this.copy(key, source)}>\n ${this.copiedKey === key ? this.msg.copied : this.msg.copy}\n </button>\n </div>\n <div class=\"jtree\">${node(value, 0)}</div>\n </div>`;\n }\n\n private renderChart(spec: ChartSpec) {\n const legend =\n spec.series.length > 1\n ? html`<span class=\"legend\">\n ${spec.series.map(\n (s, k) =>\n html`<span\n ><span\n class=\"swatch\"\n style=\"background:${CHART_COLORS[k % CHART_COLORS.length]}\"\n ></span\n >${s.name}</span\n >`\n )}\n </span>`\n : nothing;\n const head = html`<div class=\"chart-head\">\n <span class=\"chart-title\">${spec.title}</span>${legend}\n </div>`;\n\n if (spec.type === \"line\") {\n const peak = Math.max(0, ...spec.series.flatMap((s) => s.values));\n const scale = Math.pow(10, Math.floor(Math.log10(peak || 1)));\n const max = (Math.ceil((peak / scale) * 2) / 2) * scale || 1;\n const n = Math.max(spec.labels.length, ...spec.series.map((s) => s.values.length));\n return html`<figure class=\"chart\" part=\"chart\" aria-label=${spec.title}>\n ${head}\n <div class=\"line-chart\">\n <div class=\"plot\">\n ${[1, 0.5, 0].map(\n (f) =>\n html`<div class=\"tick ${f === 0 ? \"base\" : \"\"}\" style=\"top:${(1 - f) * 100}%\">\n <span>${formatNumber(Math.round(max * f), spec.unit)}</span>\n </div>`\n )}\n <svg\n viewBox=\"0 0 600 170\"\n preserveAspectRatio=\"none\"\n role=\"img\"\n aria-label=${spec.title}\n >\n ${spec.series.map(\n (\n s,\n k\n ) => svg`<polyline pathLength=\"1\" stroke=${CHART_COLORS[k % CHART_COLORS.length]}\n points=${s.values\n .map(\n (v, i) =>\n `${(n > 1 ? (i / (n - 1)) * 600 : 300).toFixed(1)},${(170 - (v / max) * 170).toFixed(1)}`\n )\n .join(\n \" \"\n )}><title>${s.name}: ${s.values.map((v) => formatNumber(v, spec.unit)).join(\", \")}</title></polyline>`\n )}\n </svg>\n </div>\n <div class=\"x-labels\">${spec.labels.map((label) => html`<span>${label}</span>`)}</div>\n </div>\n </figure>`;\n }\n\n const totals = spec.labels.map((_, i) =>\n spec.series.reduce((sum, s) => sum + (s.values[i] || 0), 0)\n );\n const max = Math.max(0, ...totals) || 1;\n return html`<figure class=\"chart\" part=\"chart\" aria-label=${spec.title}>\n ${head}\n <div class=\"bars\">\n ${spec.labels.map(\n (label, i) =>\n html`<div class=\"bar-row\" title=\"${label}: ${formatNumber(totals[i], spec.unit)}\">\n <span class=\"bar-label\">${label}</span>\n <span class=\"bar-track\"\n ><span class=\"bar-fill\" style=\"width:${(Math.max(0, totals[i]) / max) * 100}%\">\n ${spec.series.map(\n (s, k) =>\n html`<span\n style=\"flex:${Math.max(0, s.values[i] || 0)};background:${spec.series.length > 1 ? CHART_COLORS[k % CHART_COLORS.length] : \"var(--c-ink)\"}\"\n ></span>`\n )}\n </span></span\n >\n <span class=\"bar-value\">${formatNumber(totals[i], spec.unit)}</span>\n </div>`\n )}\n </div>\n </figure>`;\n }\n\n private renderPanel() {\n if (!this.panel) return nothing;\n const m = this.msgs.find((x) => x.key === this.panel!.key);\n if (!m) return nothing;\n const numbered = m.sources.map((x, i) => describeSource(x, i + 1));\n const s = numbered.find((x) => x.n === this.panel!.n);\n if (!s) return nothing;\n const msg = this.msg;\n const cited = citedNumbers(m.content);\n const others = numbered.filter((o) => o.n !== s.n && (!cited.size || cited.has(o.n)));\n const refKey = `ref:${m.key}:${s.n}`;\n const reference = `\"${s.text}\"\\n— ${s.title} [${s.n}]${s.path ? `\\n${s.path}` : \"\"}${s.updated ? ` · Updated ${s.updated}` : \"\"}`;\n const meta = [\n s.updated ? `Updated ${s.updated}` : \"\",\n s.score !== null ? `Relevance ${s.score.toFixed(2)}` : \"\"\n ]\n .filter(Boolean)\n .join(\" · \");\n\n return html`<aside\n class=\"panel ${this.panelDocked ? \"docked\" : \"overlay\"}\"\n part=\"panel\"\n role=\"region\"\n aria-label=${fill(msg.sourceLabel, { n: s.n })}\n >\n <div class=\"panel-head\">\n <span class=\"label\"\n >${fill(msg.sourceLabel, { n: s.n })}${s.collection ? ` · ${s.collection}` : \"\"}</span\n >\n <button type=\"button\" class=\"text-btn underline\" @click=${() => (this.panel = null)}>\n ${msg.close}\n </button>\n </div>\n <div class=\"panel-body\">\n <div class=\"panel-meta\">\n <h3>${s.title}</h3>\n ${s.section ? html`<span class=\"meta\">${s.section}</span>` : nothing}\n ${s.path ? html`<span class=\"path\">${s.path}</span>` : nothing}\n ${meta ? html`<span class=\"meta\">${meta}</span>` : nothing}\n </div>\n <div class=\"passage-box\">\n <span class=\"text\">${s.text}</span>\n <div class=\"passage-foot\">\n <span class=\"label\">${msg.citedPassage}</span>\n <button\n type=\"button\"\n class=\"copy-ref\"\n title=${msg.copyReference}\n aria-label=${msg.copyReference}\n @click=${() => this.copy(refKey, reference)}\n >\n ${I.copy()}<span>${this.copiedKey === refKey ? msg.copied : msg.copy}</span>\n </button>\n </div>\n </div>\n </div>\n ${\n others.length\n ? html`<div class=\"panel-foot\">\n <span class=\"label\">${msg.alsoCited}</span>\n <div class=\"chips\">\n ${others.map(\n (o) =>\n html`<button\n type=\"button\"\n class=\"chip\"\n @click=${() => (this.panel = { key: m.key, n: o.n })}\n >\n ${o.n} · ${o.title}\n </button>`\n )}\n </div>\n </div>`\n : nothing\n }\n </aside>`;\n }\n\n private renderComposer() {\n const msg = this.msg;\n const placeholder =\n this.mode === \"rag\"\n ? msg.placeholderRag\n : this.mode === \"kb\"\n ? msg.placeholderKb\n : fill(msg.placeholderChat, { name: this.assistantName });\n const cantSend = !this.draft.trim();\n const footnote =\n this.footnote === \"\"\n ? nothing\n : html`<span class=\"footnote\" part=\"footnote\"\n >${this.footnote ?? fill(msg.footnote, { name: this.assistantName })}</span\n >`;\n // Without a composer the chat is a reader: the conversation, and the footnote.\n if (!this.showComposer) {\n return html`<div class=\"composer-wrap reader\">\n <div class=\"composer-col\">${footnote}</div>\n </div>`;\n }\n return html`<div class=\"composer-wrap\">\n <div class=\"composer-col\">\n <input\n type=\"file\"\n multiple\n hidden\n accept=\".md,.markdown,.txt,.csv,.tsv,.json,.html,.htm,.yaml,.yml,.xml,.log,text/*\"\n @change=${(e: Event) => {\n const input = e.target as HTMLInputElement;\n void this.addFiles(input.files).then(() => (input.value = \"\"));\n }}\n />\n <div class=\"composer-box\">\n ${this.busy ? html`<div class=\"composer-glow\"></div>` : nothing}\n <div class=\"composer ${this.busy ? \"busy\" : \"\"}\" part=\"composer\">\n ${\n this.savedFiles.length\n ? html`<div class=\"pending-files\" part=\"saved-files\">\n ${this.savedFiles.map(\n (f) =>\n html`<div class=\"pending-file kept\">\n <span class=\"ext\">${fileExt(f.name)}</span>\n <span class=\"meta\"\n ><span class=\"name\">${f.name}</span\n ><span class=\"size\">${msg.inThisChat}</span></span\n >\n <button\n type=\"button\"\n aria-label=${msg.removeFromChat}\n title=${msg.removeFromChat}\n @click=${() => this.removeSavedFile(f)}\n >\n ×\n </button>\n </div>`\n )}\n </div>`\n : nothing\n }\n ${\n this.files.length\n ? html`<div class=\"pending-files\">\n ${this.files.map(\n (f) =>\n html`<div class=\"pending-file\">\n <span class=\"ext\">${fileExt(f.name)}</span>\n <span class=\"meta\"\n ><span class=\"name\">${f.name}</span\n ><span class=\"size\">${formatSize(f.size)}</span></span\n >\n <button\n type=\"button\"\n aria-label=${msg.removeFile}\n title=${msg.removeFile}\n @click=${() => (this.files = this.files.filter((x) => x !== f))}\n >\n ×\n </button>\n </div>`\n )}\n </div>`\n : nothing\n }\n <textarea\n class=\"input\"\n rows=\"1\"\n placeholder=${placeholder}\n aria-label=${placeholder}\n .value=${this.draft}\n @input=${this.onComposerInput}\n @keydown=${this.onComposerKey}\n ></textarea>\n <div class=\"composer-row\">\n <div>\n ${\n this.allowUpload\n ? html`<button\n type=\"button\"\n class=\"attach\"\n title=${msg.attach}\n aria-label=${msg.attach}\n @click=${() => this.renderRoot.querySelector<HTMLInputElement>(\"input[type=file]\")?.click()}\n >\n ${I.clip()}\n </button>`\n : nothing\n }\n </div>\n ${\n this.busy\n ? html`<button\n type=\"button\"\n class=\"send stop\"\n title=${msg.stop}\n aria-label=${msg.stop}\n @click=${() => this.stop()}\n >\n ${I.stop()}\n </button>`\n : html`<button\n type=\"button\"\n class=\"send\"\n title=${msg.send}\n aria-label=${msg.send}\n ?disabled=${cantSend}\n @click=${() => this.send()}\n >\n ${I.up()}\n </button>`\n }\n </div>\n </div>\n ${this.busy ? html`<div class=\"composer-ring\"><div class=\"ring\"></div></div>` : nothing}\n </div>\n ${footnote}\n </div>\n </div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"singlebase-chat\": SinglebaseChat;\n }\n}\n","/**\n * Entry point for the self-contained `<script type=\"module\">` build.\n *\n * On top of registering every element it does two things the npm entry point\n * deliberately does not:\n *\n * 1. exposes the SDK on `window.Singlebase`, so a page with no bundler can\n * still reach `Singlebase.SinglebaseClient(...)`;\n * 2. reads configuration off its own <script> tag, so the common case —\n * \"drop in a tag, show a sign-in box\" — needs no JavaScript at all.\n *\n * Only the `wk_`-prefixed web key ever belongs in these attributes. They are\n * public page source; a root, server or agent key must never appear here.\n */\nimport { SinglebaseClient, type SinglebaseClientOptions } from \"@singlebase/singlebase-sdk\";\n\nexport * from \"./index.js\";\nexport { SinglebaseClient, SinglebaseAuth } from \"@singlebase/singlebase-sdk\";\n\nfunction autoConfig(): SinglebaseClientOptions | null {\n const script =\n (document.currentScript as HTMLScriptElement | null) ??\n document.querySelector<HTMLScriptElement>(\n \"script[data-singlebase-api-key], script[data-singlebase-url-access-key], script[data-singlebase-base-url]\"\n );\n if (!script) return null;\n\n const { baseUrl, singlebaseUrlAccessKey, singlebaseApiKey, singlebaseBaseUrl } =\n script.dataset as Record<string, string | undefined>;\n\n // Every connection option is optional, so a tag configures a client when it\n // carries at least one of them. A bare tag is a plain library load: creating\n // a client then would claim the page default before the app's own call.\n const base = singlebaseBaseUrl ?? baseUrl;\n if (!singlebaseApiKey && !singlebaseUrlAccessKey && !base) return null;\n\n // Only what the tag actually sets: the SDK supplies the default base URL.\n const config: SinglebaseClientOptions = {};\n if (base) config.baseUrl = base;\n if (singlebaseUrlAccessKey) config.urlAccessKey = singlebaseUrlAccessKey;\n if (singlebaseApiKey) config.apiKey = singlebaseApiKey;\n return config;\n}\n\nif (typeof document !== \"undefined\") {\n const config = autoConfig();\n if (config) {\n try {\n // Constructing the client registers it as the page default, which is\n // what lets a bare <singlebase-authui> find a session.\n SinglebaseClient(config);\n } catch (error) {\n console.error(\"[singlebase] auto-configuration failed:\", error);\n }\n }\n\n const globalScope = globalThis as unknown as Record<string, unknown>;\n globalScope.Singlebase = {\n ...(globalScope.Singlebase as Record<string, unknown> | undefined),\n SinglebaseClient\n };\n}\n"],"names":["g","r","L","z","e","k","p","C","P","n","t","B","m","s","o","a","c","i","h","f","K","X$1","A","j","V","l","E","d","I","R","M","b","w","S","T","D","H","x","te","re","ne","se","G","v","J","W","u","q","U","$","oe","ie","y","F","Y","ae","O","Q","N","_","Z","ce","le","fe","V$1","ee","X","n$3","y$1","_a","_b","AuthController","host","__publicField","client","state","TOKEN_DEFAULTS","tokenDefaults","css","unsafeCSS","sharedStyles","defaultMessages","resolveMessages","overrides","SinglebaseElementBase","LitElement","__privateAdd","_client","_messages","_theme","_density","_fieldStyle","_radius","__privateGet","__privateSet","getDefaultClient","shared","config","key","AUTHUI_PROP_KEYS","value","authUIAttributeFor","name","changed","__decorateClass","property","resolveRedirectTarget","candidate","currentHref","onRefused","here","target","SettingsController","override","pending","settings","error","BRIDGED_EVENTS","SPEC_ALIASES","callbackPropFor","event","__","EventBridge","detail","callback","init","alias","off","brandingStyles","BRANDING_URL","BRANDING_TITLE","renderBranding","show","product","html","nothing","SinglebaseFormBase","_phase","_formError","_noticeMessage","task","SinglebaseAuthError","hint","mapErrorToHint","fullNameOf","user","initialsOf","word","email","defaultUploadMessages","resolveUploadMessages","fill","template","values","match","UNITS","parseSize","amount","formatSize","bytes","fileExtension","filename","dot","extensionOf","acceptsFile","accept","type","rules","rule","lowerName","lowerType","acceptSummary","parts","slash","fileKey","file","renameKeepingExtension","original","typed","clean","extension","UNKNOWN","PDF_HEAD","PDF_TAIL","MAX_STREAMS","MAX_INFLATED","OOXML","inspectFile","inspectPdf","inspectOoxml","isInspectable","head","bytesOf","tail","text","latin1","encrypted","pages","pageCountIn","pageCountInStreams","max","direct","inflated","streams","start","end","out","inflate","magic","isCompoundFile","app","readZipEntry","tag","byte","wanted","tailSize","eocd","size","offset","cd","decoder","method","compressed","nameLength","extraLength","commentLength","localOffset","local","data","blob","format","stream","jsonAttr","parsed","flagAttr","CONFIG_KEYS","SinglebaseUploader","_view","_dropzone","_allowRename","_autoUpload","_branding","_logoUrl","_logoText","_heading","_description","_maxFiles","_maxSize","_minSize","_accept","_rules","_bucket","_metadata","_options","_publicRead","_redirectUrl","_onComplete","_onError","_items","_notice","_busy","_dragging","_editing","active","item","sum","options","source","releasePreview","rowOf","inputs","input","result","progress","row","entry","completed","failed","errorMessage","list","finished","limit","next","before","staged","problem","maxBytes","minBytes","previewFor","facts","message","reason","dropped","kinds","editable","showDrop","customElement","PHOTO_OPTIONS","PHOTO_ACCEPT","SinglebaseAccountScreen","_settings","_nonceStorageKey","_editMode","_toast","_photoBusy","_photoFailed","_profileSaved","_passSaved","_profileError","_newPassError","_deleteStage","_confirmText","_dFirst","_dLast","_dPhone","_dEmail","_emailStep","_dNewEmail","_emailCode","_emailError","_emailSaved","_curPass","_newPass","_confirmPass","createFilesUploadApi","reading","locked","providerId","nonce","oauth_redirect_url","marks","id","photo","summary","label","providers","SinglebaseAuthButtons","_type","_intent","_provider","_providerName","_embedded","intent","linking","idToken","refreshToken","primary","rest","GUEST_SCREENS","PROTECTED_SCREENS","ALL_SCREENS","isGuestScreen","isProtectedScreen","isScreen","SinglebaseAuthScreen","_initialScreen","_screen","_noAccountView","_authEnabled","_allowEmailSignin","_allowEmailSignup","_allowEmailOtp","_allowOauth","_allowAccountCreation","_layout","_oauthPlacement","_stepped","_brandLine","_brandFoot","_signInTitle","_tosUrl","_privacyUrl","_inviteEmail","_inviteOrg","_inviteCode","_step","_method","_email","_password","_name","_firstName","_lastName","_phone","_code","_verifyNext","_loading","_banner","_passError","_attempts","_needsMfaCode","_callbackDone","offGoto","screen","offSignin","mfa","raw","authenticated","requested","params","url","accessCode","denied","content","patch","purpose","code","first","resolveScreen","index","entered","digit","digits","landed","total","showForgot","small","stepped","showName","showEmail","showPassword","showOtpLink","hasEmail","hasOauth","showHeads","emailOpen","oauthOpen","emailTitle","emailMeta","open","title","meta","body","onToggle","emailItem","oauthItem","ifDefined","showPrimary","showBack","showFoot","showStepBar","disabled","tos","privacy","noMethods","blocked","GUARD_STATES","SinglebaseAuthGuard","_slot","_predicate","_onMismatch","status","matchesPredicate","predicate","validatePredicate","child","childSlot","DEFAULT_AVATAR_PATH","SinglebaseAuthDisplay","_path","_fallback","_avatar","_alt","_imageFailed","profile","getPath","src","i$1","chatStyles","defaultChatMessages","resolveChatMessages","TABLE_ROW","TABLE_RULE","IMAGE_LINE","LIST_ITEM","TASK","RULE","ALERT","CALLOUT_KINDS","parseMarkdown","blocks","part","newline","info","fencedBlock","chunk","parseChunk","lang","spec","parseChart","rows","parseDelimited","kind","known","line","lines","cells","cell","ruleIndex","align","alert","items","heading","separator","field","quoted","width","series","labels","INLINE","parseInline","maxCite","last","pushText","prev","valid","settleStreaming","cut","marker","at","citedNumbers","found","group","chartRows","rowsText","CALLOUT_LABELS","adaptBlocks","level","simple","block","image","splitFollowups","followups","plainText","_m","provisionalTitle","space","cleanTitle","isSafeUrl","MAX_SVG_BYTES","DROP_ELEMENTS","svgDataUrl","doc","root","walk","el","inner","node","attr","external","scripted","style","markup","sidebarAttr","SIDEBAR_WIDTH","DOCK_SIDEBAR_AT","DOCK_PANEL_AT","MAX_FILES","MAX_FILE_SIZE","TEXT_FILE","TOAST_MS","MAX_TABLE_ROWS","MAX_JSON_NODES","CALLOUT_MESSAGE","ARRIVED_MS","CHART_COLORS","MODE_PROMPTS","FORMAT_PROMPTS","FOLLOWUP_PROMPT","DEFAULT_PROMPTS","icon","cls","svg","on","down","keySeed","newKey","isNotFound","errorCode","reducedMotion","formatNumber","unit","fileExt","describeSource","pick","score","number","toSavedFiles","toRetrieval","files","documents","dayGroup","iso","day","SinglebaseChat","_mode","_format","_renderers","_beforeSend","_afterParse","_glow","_docsets","_attachmentsMode","_saveAttachments","_followups","_showSources","_showNewChat","_showBookmarked","_showFollowups","_allowSearch","_autoTitle","_model","_params","_systemMessage","_retrieval","_embed","_position","_sidebar","_showTitle","_chatIdAttr","_assistantName","_eyebrow","_prompts","_bubbleText","_greetingBubble","_unreadBadge","_allowUpload","_allowExport","_allowCopy","_allowRegenerate","_allowBookmark","_allowDelete","_allowFeedback","_showComposer","_showTime","_footnote","_allowRaw","_chatList","_listState","_activeId","_chatTitle","_bookmarked","_msgs","_loadingThread","_threadError","_draft","_files","_search","_sidebarOpen","_width","_panel","_menuOpen","_editingKey","_editDraft","_editingTitle","_renamingId","_copiedKey","_retrievalOpen","_rawKeys","_savedFiles","_hasSidebarContent","_sorts","_arrivedKey","_showJump","_offline","_isOpen","_expanded","_bubble","_seen","_mobile","fn","ms","used","chat","run","attachments","who","when","sources","mime","ext","anchor","payload","asPayload","names","docsets","retrieval","bot","controller","isNew","chatId","reply","notFound","finish","full","step","shown","resolve","question","answer","auto","previous","assistant","existing","ids","removed","saved","current","apply","wasActive","snapshot","actions","toast","picked","accepted","scroller","classes","msg","frame","panel","bubble","button","overlay","query","pinned","inDay","groups","stop","hasChat","canExpand","minimize","custom","mode","eyebrow","prompts","lastBot","repeat","time","latest","done","count","cited","numbered","cards","copyText","retrievalOpen","seg","ordered","draw","numeric","toNumber","alignOf","col","sort","sortBy","nodes","depth","entries","legend","peak","scale","totals","others","refKey","reference","placeholder","cantSend","footnote","autoConfig","script","baseUrl","singlebaseUrlAccessKey","singlebaseApiKey","singlebaseBaseUrl","base","SinglebaseClient","globalScope"],"mappings":"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A;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAA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AAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;A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","x_google_ignoreList":[2,3,4,5,6,7,8,9,31,32,33]}
|
|
1
|
+
{"version":3,"file":"singlebase-elements.min.js","sources":["../../core/dist/index.js","../../singlebase-sdk/dist/index.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/css-tag.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/reactive-element.js","../../../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/lit-html.js","../../../node_modules/.pnpm/lit-element@4.2.2/node_modules/lit-element/lit-element.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/custom-element.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/property.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/state.js","../../../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directives/if-defined.js","../src/controllers/auth-controller.ts","../src/styles/tokens.ts","../src/styles/shared.ts","../src/messages.ts","../src/elements/authui-base.ts","../src/utils/redirect.ts","../src/controllers/settings-controller.ts","../src/controllers/event-bridge.ts","../src/styles/branding.ts","../src/utils/branding.ts","../src/utils/oauth.ts","../src/utils/auth-errors.ts","../src/utils/password.ts","../src/elements/authui-form-base.ts","../src/utils/profile.ts","../src/upload-messages.ts","../src/utils/files.ts","../src/utils/inspect.ts","../src/elements/uploader.ts","../src/elements/authui-account.ts","../src/elements/authui-buttons.ts","../src/elements/authui.ts","../src/elements/authui-guard.ts","../src/elements/authui-display.ts","../../../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directive.js","../../../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directive-helpers.js","../../../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directives/repeat.js","../src/styles/chat.ts","../src/chat-messages.ts","../src/utils/markdown.ts","../src/utils/svg.ts","../src/elements/chat.ts","../src/standalone.ts"],"sourcesContent":["class g extends Error {\n constructor(t, r) {\n super(t.message), this.name = \"SinglebaseError\", this.status = t.status, this.type = t.type, this.code = t.message, this.details = t.details, this.traceId = t.trace_id ?? null, this.cause = r;\n }\n static fromNetworkError(t) {\n return new g(\n {\n type: \"NETWORK_ERROR\",\n status: 0,\n message: \"NETWORK_ERROR\"\n },\n t\n );\n }\n}\nconst $ = {\n INVALID_PAYLOAD: \"highlight_invalid_fields\",\n INVALID_CREDENTIALS: \"generic_credentials_message\",\n CODE_REQUIRED: \"reveal_code_input\",\n INVALID_TOKEN: \"expired_or_invalid_code_message\",\n INVALID_ID_TOKEN: \"attempt_refresh_or_signout\",\n INVALID_BEARER_TOKEN: \"attempt_refresh_or_signout\",\n INVALID_SESSION: \"clear_session_and_ask_signin\",\n INVALID_TOKEN_AUDIENCE: \"clear_session_config_error\",\n REQUIRE_PASSWORD_CHANGE: \"route_to_recovery_or_invite\",\n INVALID_PASSWORD: \"show_password_requirements\",\n MISSING_PROFILE_DATA: \"require_changed_field\",\n AUTH_RATE_LIMITED: \"disable_retry_show_rate_limited\",\n AUTH_DISABLED: \"render_auth_unavailable\",\n EMAIL_PROVIDER_DISABLED: \"hide_email_forms\",\n EMAIL_SIGNUP_DISABLED: \"hide_signup\",\n OAUTH_DISABLED: \"hide_oauth\",\n OAUTH_SIGNIN_DISABLED: \"remove_oauth_from_signin\",\n OAUTH_SIGNUP_DISABLED: \"remove_oauth_from_signup\",\n INVALID_OAUTH_PROVIDER: \"refresh_settings_hide_provider\",\n MISSING_OAUTH_CREDENTIALS: \"show_integrator_config_error\",\n OAUTH_VERIFICATION_FAILED: \"restart_oauth\",\n VERIFIED_PROVIDER_EMAIL_REQUIRED: \"explain_verified_email_required\",\n INVALID_NONCE: \"restart_oauth_new_nonce\",\n SIGN_IN_TO_LINK_PROVIDER: \"ask_signin_then_link\",\n PROVIDER_ALREADY_LINKED: \"provider_already_linked\",\n AUTHENTICATION_REQUIRED: \"route_to_signin\",\n UNAUTHORIZED_DOMAIN: \"show_integrator_config_error\"\n};\nfunction z(e) {\n return $[e] ?? \"unknown\";\n}\nfunction k(e) {\n return e === \"localhost\" || e === \"127.0.0.1\" || e === \"0.0.0.0\";\n}\nconst p = \"https://v1.api.singlebase.io\";\nfunction C(e) {\n if (e.baseUrl === void 0) return p;\n if (e.baseUrl === null || String(e.baseUrl).trim() === \"\")\n throw new Error(\n `SinglebaseOptions.baseUrl cannot be null or empty. Omit it to use ${p}.`\n );\n return String(e.baseUrl).trim().replace(/\\/+$/, \"\");\n}\nfunction P(e) {\n var n;\n const t = C(e);\n B(t);\n const r = (n = e.urlAccessKey) == null ? void 0 : n.trim();\n return r ? `${t}/${encodeURIComponent(r)}` : t;\n}\nfunction B(e) {\n let t;\n try {\n t = new URL(e);\n } catch {\n throw new Error(`SinglebaseOptions.baseUrl is not a valid URL: ${e}`);\n }\n if (t.protocol !== \"https:\" && !k(t.hostname))\n throw new Error(\n `SinglebaseOptions.baseUrl must use HTTPS outside of localhost/127.0.0.1/0.0.0.0 (got ${t.protocol})`\n );\n}\nasync function I(e, t, r, n = {}) {\n const s = P(e), o = { operation: t, payload: r };\n n.options && (o.options = n.options);\n const a = { \"Content-Type\": \"application/json\" };\n e.apiKey && (a[\"X-API-Key\"] = e.apiKey), n.token && (a.Authorization = `Bearer ${n.token}`);\n const c = e.fetch ?? globalThis.fetch;\n let i;\n try {\n i = await c(s, {\n method: \"POST\",\n headers: a,\n body: JSON.stringify(o),\n signal: n.signal\n });\n } catch (h) {\n throw g.fromNetworkError(h);\n }\n let f;\n try {\n f = await i.json();\n } catch (h) {\n throw g.fromNetworkError(h);\n }\n if (\"error\" in f)\n throw new g(f.error);\n return f.data;\n}\nconst K = /* @__PURE__ */ new Set([\"INVALID_ID_TOKEN\", \"INVALID_BEARER_TOKEN\"]);\nclass X {\n constructor(t) {\n this.options = t, this.bridge = null, this.provider = null;\n }\n /** Registers the session owner (the auth client) as the token source. */\n setAuthBridge(t) {\n this.bridge = t;\n }\n /** Registers a factory that builds+hydrates the token source on first need. */\n setAuthProvider(t) {\n this.provider = t;\n }\n async resolveBridge() {\n return this.bridge ? this.bridge : this.provider ? (this.bridge = await this.provider(), this.bridge) : null;\n }\n /**\n * Sends one operation. Injects the session bearer unless told otherwise,\n * and on a stale-token error refreshes once and retries the call exactly\n * once — never looping.\n */\n async dispatch(t, { bearer: r, signal: n } = {}) {\n const s = r !== void 0, o = s ? null : await this.resolveBridge(), a = s ? r : (o == null ? void 0 : o.getToken()) ?? null, c = { token: a, signal: n, options: t.options };\n try {\n return await I(\n this.options,\n t.operation,\n t.payload ?? {},\n c\n );\n } catch (i) {\n const f = i instanceof g ? i.code : \"\";\n if (!(!s && a !== null && o !== null && K.has(f))) throw i;\n const A = await o.refresh();\n if (!A) throw i;\n return I(\n this.options,\n t.operation,\n t.payload ?? {},\n { ...c, token: A }\n );\n }\n }\n}\nconst V = \"singlebase-auth\", j = 1, l = \"session\", m = \"wrapping-key\", d = \"session\";\nfunction w() {\n let e = null;\n return {\n get: () => e,\n set: (t) => {\n e = t;\n },\n clear: () => {\n e = null;\n }\n };\n}\nfunction N(e, t) {\n return {\n get: () => {\n var n;\n const r = (n = e()) == null ? void 0 : n.getItem(t);\n if (!r) return null;\n try {\n return JSON.parse(r);\n } catch {\n return null;\n }\n },\n set: (r) => {\n var n;\n (n = e()) == null || n.setItem(t, JSON.stringify(r));\n },\n clear: () => {\n var r;\n (r = e()) == null || r.removeItem(t);\n }\n };\n}\nfunction ee(e = \"singlebase-auth-session\") {\n return N(() => globalThis.localStorage, e);\n}\nfunction H(e = \"singlebase-auth-session\") {\n return N(() => globalThis.sessionStorage, e);\n}\nfunction b(e) {\n return new Promise((t, r) => {\n e.onsuccess = () => t(e.result), e.onerror = () => r(e.error);\n });\n}\nfunction E() {\n return new Promise((e, t) => {\n const r = globalThis.indexedDB.open(V, j);\n r.onupgradeneeded = () => {\n r.result.objectStoreNames.contains(l) || r.result.createObjectStore(l);\n }, r.onsuccess = () => e(r.result), r.onerror = () => t(r.error), r.onblocked = () => t(new Error(\"indexedDB open blocked\"));\n });\n}\nasync function S(e) {\n const t = await E();\n try {\n const r = t.transaction(l, \"readonly\");\n return await b(r.objectStore(l).get(e));\n } finally {\n t.close();\n }\n}\nasync function D(e, t) {\n const r = await E();\n try {\n const n = r.transaction(l, \"readwrite\");\n await b(n.objectStore(l).put(t, e));\n } finally {\n r.close();\n }\n}\nasync function T(e) {\n const t = await E();\n try {\n const r = t.transaction(l, \"readwrite\");\n await b(r.objectStore(l).delete(e));\n } finally {\n t.close();\n }\n}\nfunction M() {\n return typeof globalThis.indexedDB < \"u\" && typeof globalThis.crypto < \"u\" && typeof globalThis.crypto.subtle < \"u\";\n}\nfunction G() {\n let e = null;\n async function t() {\n return e || (e = (async () => {\n const r = await S(m);\n if (r) return r;\n const n = await globalThis.crypto.subtle.generateKey(\n { name: \"AES-GCM\", length: 256 },\n // non-extractable: crypto.subtle can use it, JS can never read it\n !1,\n [\"encrypt\", \"decrypt\"]\n );\n return await D(m, n), n;\n })().catch((r) => {\n throw e = null, r;\n })), e;\n }\n return {\n async get() {\n const r = await S(d);\n if (!r) return null;\n try {\n const n = await t(), s = await globalThis.crypto.subtle.decrypt(\n { name: \"AES-GCM\", iv: r.iv },\n n,\n r.data\n );\n return JSON.parse(new TextDecoder().decode(s));\n } catch {\n return await T(d).catch(() => {\n }), null;\n }\n },\n async set(r) {\n const n = await t(), s = globalThis.crypto.getRandomValues(new Uint8Array(12)), o = await globalThis.crypto.subtle.encrypt(\n { name: \"AES-GCM\", iv: s },\n n,\n new TextEncoder().encode(JSON.stringify(r))\n );\n await D(d, { iv: s, data: o });\n },\n async clear() {\n await T(d).catch(() => {\n });\n }\n };\n}\nfunction te() {\n let e = null, t = !1;\n async function r() {\n if (e) return e;\n if (!t) {\n if (t = !0, M()) {\n const n = G();\n try {\n return await n.get(), e = n, e;\n } catch {\n }\n }\n e = typeof globalThis.sessionStorage < \"u\" ? H() : w();\n }\n return e ?? w();\n }\n return {\n async get() {\n try {\n return await (await r()).get();\n } catch {\n return null;\n }\n },\n async set(n) {\n try {\n await (await r()).set(n);\n } catch {\n }\n },\n async clear() {\n try {\n await (await r()).clear();\n } catch {\n }\n }\n };\n}\nclass re {\n constructor() {\n this.listeners = /* @__PURE__ */ new Map();\n }\n on(t, r) {\n let n = this.listeners.get(t);\n return n || (n = /* @__PURE__ */ new Set(), this.listeners.set(t, n)), n.add(r), () => n.delete(r);\n }\n emit(t, r) {\n const n = this.listeners.get(t);\n if (n)\n for (const s of n) s(r);\n }\n}\nconst ne = [\n \"theme\",\n \"density\",\n \"fieldStyle\",\n \"radius\",\n \"layout\",\n \"oauthPlacement\",\n \"stepped\",\n \"logoUrl\",\n \"logoText\",\n \"brandLine\",\n \"brandFoot\",\n \"signInTitle\",\n \"branding\",\n \"initialScreen\",\n \"noAccountView\",\n \"redirectUrl\",\n \"tosUrl\",\n \"privacyUrl\",\n \"nonceStorageKey\",\n \"authEnabled\",\n \"allowEmailSignin\",\n \"allowEmailSignup\",\n \"allowEmailOtp\",\n \"allowOauth\",\n \"allowAccountCreation\",\n \"inviteEmail\",\n \"inviteOrg\",\n \"inviteCode\"\n];\nfunction se(e) {\n return e.replace(/[A-Z]/g, (t) => \"-\" + t.toLowerCase());\n}\nconst x = [\n \"$eq\",\n \"$ne\",\n \"$in\",\n \"$nin\",\n \"$gt\",\n \"$gte\",\n \"$lt\",\n \"$lte\",\n \"$elemMatch\"\n], v = new Set(x);\nfunction F(e) {\n if (e === null || typeof e != \"object\" || Array.isArray(e)) return !1;\n const t = Object.keys(e);\n return t.length > 0 && t.every((r) => v.has(r));\n}\nfunction J(e, t) {\n let r = e;\n for (const n of t.split(\".\")) {\n if (r == null || typeof r != \"object\") return;\n r = r[n];\n }\n return r;\n}\nfunction u(e, t) {\n if (e === t) return !0;\n if (Array.isArray(e) && Array.isArray(t))\n return e.length === t.length && e.every((r, n) => u(r, t[n]));\n if (e && t && typeof e == \"object\" && typeof t == \"object\") {\n const r = Object.keys(e), n = Object.keys(t);\n return r.length === n.length && r.every(\n (s) => u(e[s], t[s])\n );\n }\n return !1;\n}\nfunction W(e, t) {\n return typeof e == \"number\" && typeof t == \"number\" ? Number.isNaN(e) || Number.isNaN(t) ? null : e - t : typeof e == \"string\" && typeof t == \"string\" ? e < t ? -1 : e > t ? 1 : 0 : e instanceof Date && t instanceof Date ? e.getTime() - t.getTime() : null;\n}\nfunction U(e, t, r) {\n switch (e) {\n case \"$eq\":\n return u(t, r);\n case \"$ne\":\n return !u(t, r);\n case \"$in\":\n return Array.isArray(r) ? Array.isArray(t) ? t.some((n) => r.some((s) => u(n, s))) : r.some((n) => u(t, n)) : !1;\n case \"$nin\":\n return Array.isArray(r) ? !U(\"$in\", t, r) : !1;\n case \"$gt\":\n case \"$gte\":\n case \"$lt\":\n case \"$lte\": {\n const n = W(t, r);\n return n === null ? !1 : e === \"$gt\" ? n > 0 : e === \"$gte\" ? n >= 0 : e === \"$lt\" ? n < 0 : n <= 0;\n }\n case \"$elemMatch\":\n return Array.isArray(t) ? t.some((n) => L(n, r)) : !1;\n default:\n return !1;\n }\n}\nfunction L(e, t) {\n return F(t) ? Object.entries(t).every(\n ([r, n]) => U(r, e, n)\n ) : u(e, t);\n}\nfunction oe(e, t) {\n if (!t) return !0;\n const r = Object.entries(t);\n return r.length === 0 ? !0 : e == null ? !1 : r.every(([n, s]) => L(J(e, n), s));\n}\nfunction ie(e) {\n if (e == null) return [];\n if (typeof e != \"object\" || Array.isArray(e))\n return [\"predicate must be an object\"];\n const t = [];\n for (const [r, n] of Object.entries(e)) {\n if (r.startsWith(\"$\")) {\n t.push(`\"${r}\": top-level operators are not supported; use a field name`);\n continue;\n }\n if (n === null || typeof n != \"object\" || Array.isArray(n)) continue;\n const s = Object.keys(n), o = s.filter((a) => a.startsWith(\"$\"));\n if (o.length === 0) {\n t.push(\n `\"${r}\": nested objects are not supported; use dot notation, e.g. \"${r}.field\"`\n );\n continue;\n }\n o.length !== s.length && t.push(`\"${r}\": cannot mix operators with plain keys`);\n for (const a of o)\n v.has(a) || t.push(`\"${r}\": unsupported operator \"${a}\"`);\n }\n return t;\n}\nconst _ = () => {\n};\nfunction q() {\n return { post: _, subscribe: () => _, close: _ };\n}\nfunction Y() {\n const e = globalThis.crypto;\n return e && \"randomUUID\" in e ? e.randomUUID() : Math.random().toString(36).slice(2) + Date.now().toString(36);\n}\nfunction ae(e) {\n var n;\n const t = Y(), r = globalThis.BroadcastChannel;\n if (r) {\n let s;\n try {\n s = new r(e);\n } catch {\n return O(e, t);\n }\n return (n = s.unref) == null || n.call(s), {\n post(o) {\n try {\n s.postMessage({ signal: o, from: t, at: Date.now() });\n } catch {\n }\n },\n subscribe(o) {\n const a = (c) => {\n const i = c.data;\n !i || typeof i != \"object\" || i.from !== t && (i.signal !== \"session-changed\" && i.signal !== \"signout\" || o(i));\n };\n return s.addEventListener(\"message\", a), () => s.removeEventListener(\"message\", a);\n },\n close() {\n try {\n s.close();\n } catch {\n }\n }\n };\n }\n return O(e, t);\n}\nfunction O(e, t) {\n const r = Q();\n if (!r) return q();\n const n = `${e}:signal`;\n return {\n post(s) {\n try {\n r.setItem(n, JSON.stringify({ signal: s, from: t, at: Date.now() }));\n } catch {\n }\n },\n subscribe(s) {\n var a;\n const o = (c) => {\n if (!(c.key !== n || !c.newValue))\n try {\n const i = JSON.parse(c.newValue);\n if (i.from === t || i.signal !== \"session-changed\" && i.signal !== \"signout\") return;\n s(i);\n } catch {\n }\n };\n return (a = globalThis.addEventListener) == null || a.call(globalThis, \"storage\", o), () => {\n var c;\n return (c = globalThis.removeEventListener) == null ? void 0 : c.call(globalThis, \"storage\", o);\n };\n },\n close: _\n };\n}\nfunction Q() {\n try {\n const e = globalThis.localStorage;\n if (!e) return null;\n const t = \"__singlebase_probe__\";\n return e.setItem(t, \"1\"), e.removeItem(t), e;\n } catch {\n return null;\n }\n}\nconst R = Symbol.for(\"singlebase.client.registry\");\nfunction y() {\n const e = globalThis;\n let t = e[R];\n return t || (t = { instances: /* @__PURE__ */ new Map(), default: null }, e[R] = t), t;\n}\nfunction Z(e) {\n return [\n e.baseUrl ?? p,\n e.urlAccessKey ?? \"\",\n e.apiKey ?? \"\",\n e.audience ?? \"web\"\n ].join(\"|\");\n}\nfunction ce(e, t) {\n const r = y(), n = Z(e), s = r.instances.get(n);\n if (s) return s;\n const o = t();\n return r.instances.set(n, o), r.default || (r.default = o), o;\n}\nfunction le() {\n return y().default;\n}\nfunction ue(e) {\n y().default = e;\n}\nfunction fe(e) {\n const t = y();\n for (const [r, n] of t.instances)\n n === e && t.instances.delete(r);\n t.default === e && (t.default = t.instances.values().next().value ?? null);\n}\nexport {\n ne as AUTHUI_PROP_KEYS,\n p as DEFAULT_BASE_URL,\n re as EventEmitter,\n x as OPERATORS,\n X as RpcDispatcher,\n g as SinglebaseAuthError,\n g as SinglebaseError,\n B as assertSecureBaseUrl,\n se as authUIAttributeFor,\n M as canUseCryptoStorage,\n Z as clientKey,\n ae as crossTabChannel,\n te as defaultStorage,\n P as endpointFor,\n le as getDefaultClient,\n J as getPath,\n G as indexedDbCryptoStorage,\n ee as localStorageAdapter,\n z as mapErrorToHint,\n oe as matchesPredicate,\n w as memoryStorage,\n q as noopCrossTabChannel,\n I as request,\n C as resolveBaseUrl,\n ce as resolveClient,\n H as sessionStorageAdapter,\n ue as setDefaultClient,\n fe as unregisterClient,\n ie as validatePredicate\n};\n//# sourceMappingURL=index.js.map\n","import { EventEmitter as R, defaultStorage as P, RpcDispatcher as D, noopCrossTabChannel as N, crossTabChannel as U, DEFAULT_BASE_URL as F, SinglebaseError as S, resolveClient as M, unregisterClient as x } from \"@singlebase/core\";\nimport { SinglebaseAuthError as ae, SinglebaseError as re, getDefaultClient as ie, indexedDbCryptoStorage as oe, localStorageAdapter as ce, mapErrorToHint as ue, memoryStorage as le, sessionStorageAdapter as de, setDefaultClient as he } from \"@singlebase/core\";\nconst B = [\"pointerdown\", \"keydown\", \"scroll\", \"focus\", \"touchstart\"], b = {\n enabled: !0,\n skewSeconds: 60,\n idleAfterMs: 15 * 60 * 1e3,\n minIntervalMs: 30 * 1e3\n};\nclass W {\n constructor(e, s, r) {\n this.refresh = s, this.onFailure = r, this.timer = null, this.lastActivityAt = Date.now(), this.stopped = !1, this.listening = !1, this.pendingWake = !1, this.onActivityBound = () => this.onActivity(), this.options = {\n enabled: (e == null ? void 0 : e.enabled) ?? b.enabled,\n skewSeconds: (e == null ? void 0 : e.skewSeconds) ?? b.skewSeconds,\n idleAfterMs: (e == null ? void 0 : e.idleAfterMs) ?? b.idleAfterMs,\n minIntervalMs: (e == null ? void 0 : e.minIntervalMs) ?? b.minIntervalMs,\n activityEvents: (e == null ? void 0 : e.activityEvents) ?? B\n };\n }\n get isRunning() {\n return this.timer !== null;\n }\n /** (Re)arms the scheduler for the given session. */\n start(e) {\n !this.options.enabled || this.stopped || (this.listen(), this.schedule(e));\n }\n /** Pauses until the next `start()` — used on signout. */\n stop() {\n this.clearTimer(), this.unlisten();\n }\n /**\n * Stops for good. Used when a refresh fails: the session cannot be\n * recovered without a fresh sign-in, so the loop must not restart by\n * itself.\n */\n stopPermanently() {\n this.stopped = !0, this.stop();\n }\n /** Allows a future sign-in to resume auto-refresh after a permanent stop. */\n reset() {\n this.stopped = !1;\n }\n clearTimer() {\n this.timer && (clearTimeout(this.timer), this.timer = null);\n }\n listen() {\n var e;\n if (!(this.listening || typeof globalThis.addEventListener != \"function\")) {\n for (const s of this.options.activityEvents)\n globalThis.addEventListener(s, this.onActivityBound, { passive: !0, capture: !0 });\n (e = globalThis.addEventListener) == null || e.call(globalThis, \"visibilitychange\", this.onActivityBound, { passive: !0 }), this.listening = !0;\n }\n }\n unlisten() {\n var e;\n if (!(!this.listening || typeof globalThis.removeEventListener != \"function\")) {\n for (const s of this.options.activityEvents)\n globalThis.removeEventListener(s, this.onActivityBound, {\n capture: !0\n });\n (e = globalThis.removeEventListener) == null || e.call(globalThis, \"visibilitychange\", this.onActivityBound), this.listening = !1;\n }\n }\n /**\n * Marks the user as active. Called by the DOM listeners, and available to\n * hosts that know about activity the DOM cannot see — an SPA route change,\n * a websocket message, a background save.\n */\n notifyActivity() {\n this.onActivity();\n }\n onActivity() {\n this.lastActivityAt = Date.now(), this.pendingWake && !this.stopped && (this.pendingWake = !1, this.run());\n }\n get isIdle() {\n return Date.now() - this.lastActivityAt > this.options.idleAfterMs;\n }\n schedule(e) {\n if (this.clearTimer(), this.stopped || !this.options.enabled) return;\n const s = e.token_info.exp * 1e3 - Date.now(), r = Math.max(\n s - this.options.skewSeconds * 1e3,\n this.options.minIntervalMs\n );\n this.timer = setTimeout(() => {\n if (this.timer = null, this.isIdle) {\n this.pendingWake = !0;\n return;\n }\n this.run();\n }, r);\n }\n async run() {\n if (!this.stopped)\n try {\n const e = await this.refresh();\n this.schedule(e);\n } catch (e) {\n this.stopPermanently(), this.onFailure(e);\n }\n }\n}\nconst H = 60;\nclass V {\n constructor(e, s) {\n this.storage = e, this.refresher = s, this.state = { status: \"loading\", session: null, user: null }, this.listeners = /* @__PURE__ */ new Set(), this.refreshing = null, this.onLocalChange = null;\n }\n getState() {\n return this.state;\n }\n subscribe(e) {\n return this.listeners.add(e), () => this.listeners.delete(e);\n }\n setState(e) {\n this.state = e;\n for (const s of this.listeners) s(e);\n }\n /** Loads the persisted session (if any) and validates/refreshes it. */\n async initialize() {\n const e = await this.storage.get();\n if (!e) {\n this.setState({ status: \"unauthenticated\", session: null, user: null });\n return;\n }\n if (this.needsRefresh(e)) {\n try {\n const s = await this.refreshOnce(e);\n await this.adopt(s);\n } catch (s) {\n await this.clear(), this.setState({ status: \"error\", session: null, user: null, error: s });\n }\n return;\n }\n this.setState({ status: \"authenticated\", session: e, user: e.user_profile });\n }\n needsRefresh(e) {\n const s = Date.now() / 1e3;\n return e.token_info.exp - s <= H;\n }\n /** Adopts a freshly-returned session: persists it and updates state. */\n async adopt(e) {\n var s;\n await this.storage.set(e), this.setState({ status: \"authenticated\", session: e, user: e.user_profile }), (s = this.onLocalChange) == null || s.call(this, \"session-changed\");\n }\n /** Merges an updated profile (from user.get/user.update) into the current session. */\n async adoptProfile(e) {\n var r;\n if (this.state.status !== \"authenticated\") return;\n const s = { ...this.state.session, user_profile: e };\n await this.storage.set(s), this.setState({ status: \"authenticated\", session: s, user: e }), (r = this.onLocalChange) == null || r.call(this, \"session-changed\");\n }\n async clear() {\n var e;\n await this.storage.clear(), this.setState({ status: \"unauthenticated\", session: null, user: null }), (e = this.onLocalChange) == null || e.call(this, \"signout\");\n }\n /**\n * Re-reads shared storage after another tab reported a change, and adopts\n * whatever it finds. No network call and no refresh: the tab that made the\n * change already did that work, and this tab must not spend the single-use\n * refresh token a second time.\n */\n async syncFromStorage() {\n const e = await this.storage.get();\n return e ? this.state.status === \"authenticated\" && this.state.session.id_token === e.id_token ? \"unchanged\" : (this.setState({ status: \"authenticated\", session: e, user: e.user_profile }), \"adopted\") : this.state.status === \"unauthenticated\" ? \"unchanged\" : (this.setState({ status: \"unauthenticated\", session: null, user: null }), \"cleared\");\n }\n /**\n * Single-flight refresh: concurrent callers await the same in-flight\n * promise instead of each spending the single-use refresh token.\n */\n async refreshOnce(e) {\n return this.refreshing || (this.refreshing = this.refresher(e).finally(() => {\n this.refreshing = null;\n })), this.refreshing;\n }\n /**\n * For a protected call that just failed with an auth-shaped error: refresh\n * once (sharing any in-flight refresh) and hand back the new session, or\n * throw/clear if refresh itself fails. Callers retry their original\n * request exactly once with the result — never loop.\n */\n async refreshAfterFailure() {\n if (this.state.status !== \"authenticated\")\n throw new Error(\"Cannot refresh: no authenticated session\");\n try {\n const e = await this.refreshOnce(this.state.session);\n return await this.adopt(e), e;\n } catch (e) {\n throw await this.clear(), e;\n }\n }\n}\nconst l = {\n settings: \"auth.settings\",\n signup: \"auth.signup\",\n signin: \"auth.signin\",\n refresh: \"auth.refresh\",\n signout: \"auth.signout\",\n requestCode: \"auth.request_code\",\n confirmCode: \"auth.confirm_code\",\n changePassword: \"auth.change_password\",\n getAccount: \"user.get\",\n updateAccount: \"user.update\",\n nonce: \"auth.nonce\",\n oauthConnect: \"auth.oauth_connect\",\n oauthSignin: \"auth.oauth_signin\"\n};\nfunction q(a, e) {\n const s = a.audience ?? \"web\", r = new R(), y = a.storage ?? P(), f = e ?? new D(a);\n for (const [t, o] of Object.entries(a.on ?? {}))\n o && r.on(t, o);\n const g = async (t) => f.dispatch(\n {\n operation: l.refresh,\n payload: {\n id_token: t.id_token,\n refresh_token: t.refresh_token,\n aud: s\n }\n },\n { bearer: null }\n ), i = new V(y, g), c = a.crossTab === !1 ? N() : U(\n `singlebase-auth:${a.baseUrl ?? F}|${a.urlAccessKey ?? \"\"}`\n );\n i.onLocalChange = (t) => c.post(t);\n const d = c.subscribe(() => {\n w.then(async () => {\n const t = await i.syncFromStorage();\n if (t === \"unchanged\") return;\n if (t === \"cleared\") {\n r.emit(\"signout\", null), r.emit(\"session\", null);\n return;\n }\n const o = i.getState();\n o.status === \"authenticated\" && r.emit(\"session\", o.session);\n });\n }), m = typeof a.autoRefresh == \"boolean\" ? { enabled: a.autoRefresh } : a.autoRefresh, p = new W(\n m,\n async () => await A.refreshSession(),\n (t) => {\n i.clear();\n const o = t instanceof S ? t.code : \"REFRESH_FAILED\";\n r.emit(\"expired\", { reason: o }), r.emit(\"session\", null);\n }\n );\n f.setAuthBridge({\n getToken: () => {\n const t = i.getState();\n return t.status === \"authenticated\" ? t.session.id_token : null;\n },\n refresh: async () => {\n try {\n return (await i.refreshAfterFailure()).id_token;\n } catch {\n return null;\n }\n }\n }), i.subscribe((t) => {\n t.status === \"authenticated\" ? (p.reset(), p.start(t.session)) : p.stop();\n });\n const w = i.initialize().then(() => {\n r.emit(\"load\", i.getState());\n });\n async function u(t, o) {\n try {\n const n = await o();\n return r.emit(\"success\", { operation: t }), n;\n } catch (n) {\n const _ = n instanceof S ? n.code : \"UNKNOWN_ERROR\", T = n instanceof Error ? n.message : String(n);\n throw r.emit(\"error\", { code: _, message: T, operation: t }), n;\n }\n }\n const h = (t, o, n = {}) => f.dispatch({ operation: t, payload: o }, n), A = {\n ready: w,\n dispatcher: f,\n authui: a.authui ?? null,\n dispatch: (t, o) => f.dispatch(t, o),\n getSettings: (t) => u(l.settings, () => h(l.settings, {}, { bearer: null, signal: t })),\n signUp: (t, o) => u(l.signup, async () => {\n const n = await h(\n l.signup,\n { ...t, aud: t.aud ?? s },\n { bearer: null, signal: o }\n );\n return r.emit(\"signup\", n), r.emit(\"navigate\", {\n next_action: n.next_action,\n next_operation: n.next_operation\n }), n;\n }),\n signIn: (t, o) => u(l.signin, async () => {\n const n = await h(\n l.signin,\n { ...t, aud: t.aud ?? s },\n { bearer: null, signal: o }\n );\n return await i.adopt(n), r.emit(\"signin\", n), r.emit(\"session\", n), n;\n }),\n requestCode: (t, o) => u(l.requestCode, async () => {\n const n = await h(\n l.requestCode,\n { ...t, aud: t.aud ?? s },\n { bearer: null, signal: o }\n );\n return r.emit(\"navigate\", {\n next_action: n.next_action,\n next_operation: n.next_operation\n }), n;\n }),\n resetPassword: (t, o) => u(l.confirmCode, async () => {\n const n = await h(\n l.confirmCode,\n { ...t, purpose: \"password_reset\", aud: t.aud ?? s },\n { bearer: null, signal: o }\n );\n return await i.adopt(n), r.emit(\"signin\", n), r.emit(\"session\", n), n;\n }),\n acceptInvite: (t, o) => u(l.signin, async () => {\n const n = await h(\n l.signin,\n { ...t, aud: t.aud ?? s },\n { bearer: null, signal: o }\n );\n return await i.adopt(n), r.emit(\"signin\", n), r.emit(\"session\", n), n;\n }),\n refreshSession: () => u(l.refresh, async () => {\n const t = i.getState();\n if (t.status !== \"authenticated\")\n throw new Error(\"Cannot refresh: no authenticated session\");\n const o = await i.refreshOnce(t.session);\n return await i.adopt(o), r.emit(\"session\", o), o;\n }),\n async signOut() {\n const t = i.getState();\n if (p.stop(), t.status === \"authenticated\")\n try {\n await h(l.signout, {}, { bearer: t.session.id_token });\n } catch {\n }\n await i.clear(), r.emit(\"signout\", null), r.emit(\"session\", null), r.emit(\"success\", { operation: l.signout });\n },\n logout() {\n return A.signOut();\n },\n getAccount: (t) => u(l.getAccount, async () => {\n const o = await h(l.getAccount, {}, { signal: t });\n return await i.adoptProfile(o), o;\n }),\n updateAccount: (t, o) => u(l.updateAccount, async () => {\n const n = await h(l.updateAccount, t, {\n signal: o\n });\n return await i.adoptProfile(n), r.emit(\"account-updated\", n), n;\n }),\n changePassword: (t, o) => u(l.changePassword, async () => {\n const n = await h(\n l.changePassword,\n { ...t, aud: t.aud ?? s },\n { signal: o }\n );\n return await i.adopt(n), r.emit(\"password-change\", n), r.emit(\"session\", n), n;\n }),\n changeEmail: (t, o) => u(l.confirmCode, async () => {\n const n = await h(\n l.confirmCode,\n {\n email: t.email,\n purpose: \"email_change\",\n code: t.code,\n new_email: t.new_email,\n aud: t.aud ?? s\n },\n { signal: o }\n );\n return await i.adopt(n), r.emit(\"email-change\", n), r.emit(\"session\", n), n;\n }),\n changeUsername: (t, o) => u(l.confirmCode, async () => {\n const n = await h(\n l.confirmCode,\n {\n email: t.email,\n purpose: \"username_change\",\n code: t.code,\n new_username: t.new_username,\n aud: t.aud ?? s\n },\n { signal: o }\n );\n return await i.adopt(n), r.emit(\"username-change\", n), r.emit(\"session\", n), n;\n }),\n createOAuthNonce: (t) => u(l.nonce, async () => (await h(l.nonce, {}, { bearer: null, signal: t })).nonce),\n startOAuth: (t, o) => u(l.oauthConnect, async () => {\n const n = t.nonce ?? await A.createOAuthNonce(o);\n return { ...await h(\n l.oauthConnect,\n { ...t, nonce: n, intent: t.intent ?? \"signin\", aud: t.aud ?? s },\n { bearer: null, signal: o }\n ), nonce: n };\n }),\n completeOAuth: (t, o) => u(l.oauthSignin, async () => {\n const n = await h(\n l.oauthSignin,\n { ...t, aud: t.aud ?? s },\n { bearer: null, signal: o }\n );\n return await i.adopt(n), r.emit(\"signin\", n), r.emit(\"session\", n), n;\n }),\n isAuthenticated: () => i.getState().status === \"authenticated\",\n getUser: () => {\n const t = i.getState();\n return t.status === \"authenticated\" ? t.user : null;\n },\n get user() {\n return A.getUser();\n },\n get authenticated() {\n return A.isAuthenticated();\n },\n async getSession() {\n await w;\n const t = i.getState();\n return t.status === \"authenticated\" ? t.session : null;\n },\n getState: () => i.getState(),\n subscribe: (t) => i.subscribe(t),\n on: r.on.bind(r),\n goto: (t) => r.emit(\"goto\", { screen: t }),\n destroy() {\n p.stopPermanently(), f.setAuthBridge(null), i.onLocalChange = null, d(), c.close();\n }\n };\n return A;\n}\nconst z = {\n SIGNIN: \"signin\",\n SIGNIN_WITH_CODE: \"signin_with_code\",\n ACCEPT_INVITE_WITH_CODE: \"accept_invite\",\n RESET_PASSWORD_WITH_CODE: \"reset_password_confirm\",\n CHANGE_EMAIL_WITH_CODE: \"change_email_confirm\",\n CHANGE_USERNAME_WITH_CODE: \"change_username_confirm\"\n};\nfunction ee(a) {\n return a.next_action === null ? \"authenticated\" : z[a.next_action];\n}\nconst E = 10;\nfunction v(a, e) {\n const s = [];\n for (let r = 0; r < a.length; r += e) s.push(a.slice(r, r + e));\n return s;\n}\nfunction C(a) {\n return typeof Blob < \"u\" && a instanceof Blob;\n}\nfunction k(a) {\n return C(a) ? { file: a } : a;\n}\nfunction L(a) {\n var s;\n const e = a.filename ?? ((s = a.file) == null ? void 0 : s.name);\n if (!e)\n throw new S({\n type: \"INVALID_PAYLOAD\",\n status: 0,\n message: \"MISSING_FILENAME\"\n });\n return e;\n}\nfunction G(a) {\n const e = a.file, s = { filename: L(a) }, r = a.contentType ?? (e && C(e) ? e.type : \"\");\n return r && (s.content_type = r), a.bucket && (s.bucket = a.bucket), a.newName && (s.new_name = a.newName), a.publicRead !== void 0 && (s.public_read = a.publicRead), a.metadata && (s.metadata = a.metadata), a.options && (s.options = a.options), s;\n}\nfunction O(a) {\n return new S({ type: \"INVALID_RESPONSE\", status: 0, message: a });\n}\nfunction K(a, e) {\n if (!Array.isArray(a) || a.length !== e)\n throw O(\"INVALID_UPLOAD_RESPONSE\");\n return a.map((s) => {\n var y;\n const r = (y = s == null ? void 0 : s.upload) == null ? void 0 : y.url;\n if (!(s != null && s.id) || !(s != null && s.upload_token) || typeof r != \"string\")\n throw O(\"INVALID_UPLOAD_RESPONSE\");\n return {\n id: String(s.id),\n upload: { url: r, fields: s.upload.fields ?? {} },\n uploadToken: String(s.upload_token)\n };\n });\n}\nfunction I(a) {\n if (a && typeof a == \"object\" && \"code\" in a && \"message\" in a) {\n const { code: s, message: r } = a;\n return { code: String(s), message: String(r).slice(0, 500) };\n }\n return { code: \"UPLOAD_FAILED\", message: (a instanceof Error ? a.message : String(a ?? \"\")).slice(0, 500) };\n}\nasync function $(a, e, s, r) {\n const y = await a(e, { method: \"POST\", body: s, signal: r });\n return y.status ?? (y.ok ? 200 : 500);\n}\nfunction X(a, e, s, r) {\n return new Promise((y, f) => {\n const g = new XMLHttpRequest();\n if (g.open(\"POST\", a), g.upload.onprogress = (i) => {\n s(i.loaded, i.lengthComputable ? i.total : 0);\n }, g.onload = () => y(g.status), g.onerror = () => f(new Error(\"NETWORK_ERROR\")), g.onabort = () => f(new Error(\"ABORTED\")), r) {\n if (r.aborted) {\n f(new Error(\"ABORTED\"));\n return;\n }\n r.addEventListener(\"abort\", () => g.abort(), { once: !0 });\n }\n g.send(e);\n });\n}\nfunction Y(a) {\n const e = (i, c, d) => a.dispatch({ operation: i, payload: { files: c } }, { signal: d == null ? void 0 : d.signal });\n async function s(i, c) {\n const d = Array.from(i, k), m = [];\n for (const p of v(d, E)) {\n const w = p.map(\n (h) => G(c != null && c.bucket ? { bucket: c.bucket, ...h } : h)\n ), u = await e(\"files.initiate_upload\", w, c);\n m.push(...K(u, p.length));\n }\n return m;\n }\n async function r(i, c, d) {\n const m = k(i), p = new FormData();\n for (const [n, _] of Object.entries(c.upload.fields ?? {}))\n p.append(n, _);\n const w = m.file, u = C(w) ? w : new Blob([w]), h = u.size ?? 0;\n p.append(\"file\", u, L(m));\n const A = d == null ? void 0 : d.onProgress, t = A ? (n, _) => A({\n input: m,\n id: c.id,\n loaded: n,\n total: _,\n percent: _ > 0 ? Math.min(100, Math.round(n / _ * 100)) : 0\n }) : void 0;\n let o;\n try {\n o = t && typeof XMLHttpRequest < \"u\" ? await X(c.upload.url, p, t, d == null ? void 0 : d.signal) : await $(\n a.options.fetch ?? globalThis.fetch,\n c.upload.url,\n p,\n d == null ? void 0 : d.signal\n );\n } catch (n) {\n throw new S(\n { type: \"UPLOAD_FAILED\", status: 0, message: \"UPLOAD_FAILED\" },\n n\n );\n }\n if (o >= 400)\n throw new S({ type: \"UPLOAD_FAILED\", status: o, message: \"UPLOAD_FAILED\" });\n return t == null || t(h, h), { id: c.id, uploadToken: c.uploadToken };\n }\n async function y(i, c) {\n const d = [];\n for (const m of v(i, E)) {\n const p = await e(\n \"files.complete_upload\",\n m.map(({ id: w, uploadToken: u }) => ({ id: w, upload_token: u })),\n c\n );\n if (!Array.isArray(p)) throw O(\"INVALID_UPLOAD_RESPONSE\");\n d.push(...p);\n }\n return d;\n }\n async function f(i, c) {\n for (const d of v(i, E))\n await e(\n \"files.fail_upload\",\n d.map(({ id: m, uploadToken: p, error: w }) => ({\n id: m,\n upload_token: p,\n error: I(w)\n })),\n c\n );\n }\n async function g(i, c) {\n const d = Array.from(i, k), m = { completed: [], failed: [] };\n for (const u of v(d, E)) {\n const h = await s(u, c), A = [], t = [];\n if (await Promise.all(\n u.map(async (o, n) => {\n const _ = h[n];\n try {\n A.push({ input: o, completion: await r(o, _, c) });\n } catch (T) {\n t.push({ input: o, id: _.id, uploadToken: _.uploadToken, error: T });\n }\n })\n ), A.length)\n try {\n const o = await y(\n A.map((n) => n.completion),\n c\n );\n A.forEach((n, _) => {\n m.completed.push({ input: n.input, id: n.completion.id, file: o[_] });\n });\n } catch (o) {\n const n = I(o);\n A.forEach((_) => {\n m.failed.push({ input: _.input, id: _.completion.id, error: n });\n });\n }\n if (t.length) {\n try {\n await f(\n t.map((o) => ({ id: o.id, uploadToken: o.uploadToken, error: o.error })),\n c\n );\n } catch {\n }\n t.forEach((o) => {\n m.failed.push({ input: o.input, id: o.id, error: I(o.error) });\n });\n }\n }\n const p = new Map(d.map((u, h) => [u, h])), w = (u) => p.get(u.input) ?? 0;\n return m.completed.sort((u, h) => w(u) - w(h)), m.failed.sort((u, h) => w(u) - w(h)), m;\n }\n return { initiateUpload: s, uploadToRemote: r, completeUpload: y, failUpload: f, upload: g };\n}\nfunction j(a, e, s) {\n const r = (f, g, i = {}) => {\n const { options: c, ...d } = i;\n return e(\n {\n operation: `${a}.${f}`,\n payload: g ?? {},\n options: c\n },\n d\n );\n }, y = { call: r, ...s };\n return new Proxy(y, {\n get(f, g) {\n const i = f;\n return typeof g == \"symbol\" || g in i ? i[g] : (c, d) => r(g, c, d);\n }\n });\n}\nfunction Z(a) {\n return M(a, () => J(a));\n}\nfunction J(a) {\n const e = new D(a);\n let s = null;\n function r() {\n if (!s) {\n const { auth: i, ...c } = a;\n s = q({ ...c, ...i }, e);\n }\n return s;\n }\n e.setAuthProvider(async () => {\n const i = r();\n return await i.ready, {\n getToken: () => i.isAuthenticated() ? i.getState().session.id_token : null,\n refresh: async () => {\n try {\n return (await i.refreshSession()).id_token;\n } catch {\n return null;\n }\n }\n };\n });\n const y = /* @__PURE__ */ new Map(), f = (i) => {\n let c = y.get(i);\n return c || (c = j(\n i,\n (d, m) => e.dispatch(d, m),\n // `files` is the one namespace with a flow the proxy can't express:\n // uploads go straight to storage, so they need real methods.\n i === \"files\" ? Y(e) : void 0\n ), y.set(i, c)), c;\n }, g = {\n get auth() {\n return r();\n },\n dispatcher: e,\n data: f(\"data\"),\n files: f(\"files\"),\n user: f(\"user\"),\n users: f(\"users\"),\n llm: f(\"llm\"),\n service: f,\n dispatch: (i, c) => e.dispatch(i, c),\n isAuthenticated: () => (s == null ? void 0 : s.isAuthenticated()) ?? !1,\n getUser: () => (s == null ? void 0 : s.getUser()) ?? null,\n destroy() {\n s == null || s.destroy(), x(g);\n }\n };\n return g;\n}\nfunction te(a) {\n return Z(a).auth;\n}\nexport {\n W as AutoRefreshScheduler,\n E as FILES_BATCH_SIZE,\n V as SessionStore,\n te as SinglebaseAuth,\n ae as SinglebaseAuthError,\n Z as SinglebaseClient,\n re as SinglebaseError,\n q as createAuthClient,\n Y as createFilesUploadApi,\n ie as getDefaultClient,\n oe as indexedDbCryptoStorage,\n ce as localStorageAdapter,\n ue as mapErrorToHint,\n le as memoryStorage,\n I as normalizeUploadError,\n ee as resolveScreen,\n de as sessionStorageAdapter,\n he as setDefaultClient\n};\n//# sourceMappingURL=index.js.map\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1],t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,css,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:h,getOwnPropertyNames:r,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),b={attribute:!0,type:String,converter:u,reflect:!1,useDefault:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class y extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=b){if(s.state&&(s.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((s=Object.create(s)).wrapped=!0),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),h=this.getPropertyDescriptor(t,i,s);void 0!==h&&e(this.prototype,t,h)}}static getPropertyDescriptor(t,s,i){const{get:e,set:r}=h(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get:e,set(s){const h=e?.call(this);r?.call(this,s),this.requestUpdate(t,h,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...r(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$ET(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const h=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==h?this.removeAttribute(e):this.setAttribute(e,h),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),h=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e;const r=h.fromAttribute(s,t.type);this[e]=r??this._$Ej?.get(e)??r,this._$Em=null}}requestUpdate(t,s,i,e=!1,h){if(void 0!==t){const r=this.constructor;if(!1===e&&(h=this[t]),i??=r.getPropertyOptions(t),!((i.hasChanged??f)(h,s)||i.useDefault&&i.reflect&&h===this._$Ej?.get(t)&&!this.hasAttribute(r._$Eu(t,i))))return;this.C(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,s,{useDefault:i,reflect:e,wrapped:h},r){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,r??s??this[t]),!0!==h||void 0!==r)||(this._$AL.has(t)||(this.hasUpdated||i||(s=void 0),this._$AL.set(t,s)),!0===e&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t){const{wrapped:t}=i,e=this[s];!0!==t||this._$AL.has(s)||void 0===e||this.C(s,void 0,i,e)}}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(s)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}}y.elementStyles=[],y.shadowRootOptions={mode:\"open\"},y[d(\"elementProperties\")]=new Map,y[d(\"finalized\")]=new Map,p?.({ReactiveElement:y}),(a.reactiveElementVersions??=[]).push(\"2.1.2\");export{y as ReactiveElement,s as adoptStyles,u as defaultConverter,t as getCompatibleStyle,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,i=t=>t,s=t.trustedTypes,e=s?s.createPolicy(\"lit-html\",{createHTML:t=>t}):void 0,h=\"$lit$\",o=`lit$${Math.random().toFixed(9).slice(2)}$`,n=\"?\"+o,r=`<${n}>`,l=document,c=()=>l.createComment(\"\"),a=t=>null===t||\"object\"!=typeof t&&\"function\"!=typeof t,u=Array.isArray,d=t=>u(t)||\"function\"==typeof t?.[Symbol.iterator],f=\"[ \\t\\n\\f\\r]\",v=/<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g,_=/-->/g,m=/>/g,p=RegExp(`>|${f}(?:([^\\\\s\"'>=/]+)(${f}*=${f}*(?:[^ \\t\\n\\f\\r\"'\\`<>=]|(\"|')|))|$)`,\"g\"),g=/'/g,$=/\"/g,y=/^(?:script|style|textarea|title)$/i,x=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),b=x(1),w=x(2),T=x(3),E=Symbol.for(\"lit-noChange\"),A=Symbol.for(\"lit-nothing\"),C=new WeakMap,P=l.createTreeWalker(l,129);function V(t,i){if(!u(t)||!t.hasOwnProperty(\"raw\"))throw Error(\"invalid template strings array\");return void 0!==e?e.createHTML(i):i}const N=(t,i)=>{const s=t.length-1,e=[];let n,l=2===i?\"<svg>\":3===i?\"<math>\":\"\",c=v;for(let i=0;i<s;i++){const s=t[i];let a,u,d=-1,f=0;for(;f<s.length&&(c.lastIndex=f,u=c.exec(s),null!==u);)f=c.lastIndex,c===v?\"!--\"===u[1]?c=_:void 0!==u[1]?c=m:void 0!==u[2]?(y.test(u[2])&&(n=RegExp(\"</\"+u[2],\"g\")),c=p):void 0!==u[3]&&(c=p):c===p?\">\"===u[0]?(c=n??v,d=-1):void 0===u[1]?d=-2:(d=c.lastIndex-u[2].length,a=u[1],c=void 0===u[3]?p:'\"'===u[3]?$:g):c===$||c===g?c=p:c===_||c===m?c=v:(c=p,n=void 0);const x=c===p&&t[i+1].startsWith(\"/>\")?\" \":\"\";l+=c===v?s+r:d>=0?(e.push(a),s.slice(0,d)+h+s.slice(d)+o+x):s+o+(-2===d?i:x)}return[V(t,l+(t[s]||\"<?>\")+(2===i?\"</svg>\":3===i?\"</math>\":\"\")),e]};class S{constructor({strings:t,_$litType$:i},e){let r;this.parts=[];let l=0,a=0;const u=t.length-1,d=this.parts,[f,v]=N(t,i);if(this.el=S.createElement(f,e),P.currentNode=this.el.content,2===i||3===i){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(r=P.nextNode())&&d.length<u;){if(1===r.nodeType){if(r.hasAttributes())for(const t of r.getAttributeNames())if(t.endsWith(h)){const i=v[a++],s=r.getAttribute(t).split(o),e=/([.?@])?(.*)/.exec(i);d.push({type:1,index:l,name:e[2],strings:s,ctor:\".\"===e[1]?I:\"?\"===e[1]?L:\"@\"===e[1]?z:H}),r.removeAttribute(t)}else t.startsWith(o)&&(d.push({type:6,index:l}),r.removeAttribute(t));if(y.test(r.tagName)){const t=r.textContent.split(o),i=t.length-1;if(i>0){r.textContent=s?s.emptyScript:\"\";for(let s=0;s<i;s++)r.append(t[s],c()),P.nextNode(),d.push({type:2,index:++l});r.append(t[i],c())}}}else if(8===r.nodeType)if(r.data===n)d.push({type:2,index:l});else{let t=-1;for(;-1!==(t=r.data.indexOf(o,t+1));)d.push({type:7,index:l}),t+=o.length-1}l++}}static createElement(t,i){const s=l.createElement(\"template\");return s.innerHTML=t,s}}function M(t,i,s=t,e){if(i===E)return i;let h=void 0!==e?s._$Co?.[e]:s._$Cl;const o=a(i)?void 0:i._$litDirective$;return h?.constructor!==o&&(h?._$AO?.(!1),void 0===o?h=void 0:(h=new o(t),h._$AT(t,s,e)),void 0!==e?(s._$Co??=[])[e]=h:s._$Cl=h),void 0!==h&&(i=M(t,h._$AS(t,i.values),h,e)),i}class R{constructor(t,i){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=i}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:i},parts:s}=this._$AD,e=(t?.creationScope??l).importNode(i,!0);P.currentNode=e;let h=P.nextNode(),o=0,n=0,r=s[0];for(;void 0!==r;){if(o===r.index){let i;2===r.type?i=new k(h,h.nextSibling,this,t):1===r.type?i=new r.ctor(h,r.name,r.strings,this,t):6===r.type&&(i=new Z(h,this,t)),this._$AV.push(i),r=s[++n]}o!==r?.index&&(h=P.nextNode(),o++)}return P.currentNode=l,e}p(t){let i=0;for(const s of this._$AV)void 0!==s&&(void 0!==s.strings?(s._$AI(t,s,i),i+=s.strings.length-2):s._$AI(t[i])),i++}}class k{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,i,s,e){this.type=2,this._$AH=A,this._$AN=void 0,this._$AA=t,this._$AB=i,this._$AM=s,this.options=e,this._$Cv=e?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const i=this._$AM;return void 0!==i&&11===t?.nodeType&&(t=i.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,i=this){t=M(this,t,i),a(t)?t===A||null==t||\"\"===t?(this._$AH!==A&&this._$AR(),this._$AH=A):t!==this._$AH&&t!==E&&this._(t):void 0!==t._$litType$?this.$(t):void 0!==t.nodeType?this.T(t):d(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==A&&a(this._$AH)?this._$AA.nextSibling.data=t:this.T(l.createTextNode(t)),this._$AH=t}$(t){const{values:i,_$litType$:s}=t,e=\"number\"==typeof s?this._$AC(t):(void 0===s.el&&(s.el=S.createElement(V(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===e)this._$AH.p(i);else{const t=new R(e,this),s=t.u(this.options);t.p(i),this.T(s),this._$AH=t}}_$AC(t){let i=C.get(t.strings);return void 0===i&&C.set(t.strings,i=new S(t)),i}k(t){u(this._$AH)||(this._$AH=[],this._$AR());const i=this._$AH;let s,e=0;for(const h of t)e===i.length?i.push(s=new k(this.O(c()),this.O(c()),this,this.options)):s=i[e],s._$AI(h),e++;e<i.length&&(this._$AR(s&&s._$AB.nextSibling,e),i.length=e)}_$AR(t=this._$AA.nextSibling,s){for(this._$AP?.(!1,!0,s);t!==this._$AB;){const s=i(t).nextSibling;i(t).remove(),t=s}}setConnected(t){void 0===this._$AM&&(this._$Cv=t,this._$AP?.(t))}}class H{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,i,s,e,h){this.type=1,this._$AH=A,this._$AN=void 0,this.element=t,this.name=i,this._$AM=e,this.options=h,s.length>2||\"\"!==s[0]||\"\"!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=A}_$AI(t,i=this,s,e){const h=this.strings;let o=!1;if(void 0===h)t=M(this,t,i,0),o=!a(t)||t!==this._$AH&&t!==E,o&&(this._$AH=t);else{const e=t;let n,r;for(t=h[0],n=0;n<h.length-1;n++)r=M(this,e[s+n],i,n),r===E&&(r=this._$AH[n]),o||=!a(r)||r!==this._$AH[n],r===A?t=A:t!==A&&(t+=(r??\"\")+h[n+1]),this._$AH[n]=r}o&&!e&&this.j(t)}j(t){t===A?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??\"\")}}class I extends H{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===A?void 0:t}}class L extends H{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==A)}}class z extends H{constructor(t,i,s,e,h){super(t,i,s,e,h),this.type=5}_$AI(t,i=this){if((t=M(this,t,i,0)??A)===E)return;const s=this._$AH,e=t===A&&s!==A||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,h=t!==A&&(s===A||e);e&&this.element.removeEventListener(this.name,this,s),h&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){\"function\"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}}class Z{constructor(t,i,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=i,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){M(this,t)}}const j={M:h,P:o,A:n,C:1,L:N,R,D:d,V:M,I:k,H,N:L,U:z,B:I,F:Z},B=t.litHtmlPolyfillSupport;B?.(S,k),(t.litHtmlVersions??=[]).push(\"3.3.3\");const D=(t,i,s)=>{const e=s?.renderBefore??i;let h=e._$litPart$;if(void 0===h){const t=s?.renderBefore??null;e._$litPart$=h=new k(i.insertBefore(c(),t),t,void 0,s??{})}return h._$AI(t),h};export{j as _$LH,b as html,T as mathml,E as noChange,A as nothing,D as render,w as svg};\n//# sourceMappingURL=lit-html.js.map\n","import{ReactiveElement as t}from\"@lit/reactive-element\";export*from\"@lit/reactive-element\";import{render as e,noChange as r}from\"lit-html\";export*from\"lit-html\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const s=globalThis;class i extends t{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const r=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=e(r,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return r}}i._$litElement$=!0,i[\"finalized\"]=!0,s.litElementHydrateSupport?.({LitElement:i});const o=s.litElementPolyfillSupport;o?.({LitElement:i});const n={_$AK:(t,e,r)=>{t._$AK(e,r)},_$AL:t=>t._$AL};(s.litElementVersions??=[]).push(\"4.2.2\");export{i as LitElement,n as _$LE};\n//# sourceMappingURL=lit-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer(()=>{customElements.define(t,e)}):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","import{notEqual as t,defaultConverter as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:e,reflect:!1,hasChanged:t},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),\"setter\"===n&&((t=Object.create(t)).wrapped=!0),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t,!0,r)},init(e){return void 0!==e&&this.C(o,void 0,t,e),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t,!0,r)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import{property as t}from\"./property.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function r(r){return t({...r,state:!0,attribute:!1})}export{r as state};\n//# sourceMappingURL=state.js.map\n","import{nothing as t}from\"../lit-html.js\";\n/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o=o=>o??t;export{o as ifDefined};\n//# sourceMappingURL=if-defined.js.map\n","import type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport type { AuthClient, AuthState } from \"@singlebase/singlebase-sdk\";\n\n/**\n * Subscribes a host element to an AuthClient's session state and triggers a\n * re-render on every change, so individual elements never hand-roll\n * subscribe/unsubscribe bookkeeping. Call bind(client) whenever the host's\n * resolved client changes (e.g. context updates, or .client is set).\n */\nexport class AuthController implements ReactiveController {\n private host: ReactiveControllerHost;\n private client: AuthClient | null = null;\n private unsubscribe: (() => void) | null = null;\n state: AuthState = { status: \"loading\", session: null, user: null };\n\n constructor(host: ReactiveControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n bind(client: AuthClient | null): void {\n if (client === this.client) return;\n this.unsubscribe?.();\n this.unsubscribe = null;\n this.client = client;\n if (!client) return;\n this.state = client.getState();\n this.unsubscribe = client.subscribe((state) => {\n this.state = state;\n this.host.requestUpdate();\n });\n this.host.requestUpdate();\n }\n\n hostDisconnected(): void {\n this.unsubscribe?.();\n this.unsubscribe = null;\n }\n}\n","import { css, unsafeCSS } from \"lit\";\n\n/**\n * Default values for every --sb-* design token, ported from the design\n * mock's tokens()/styles() functions. These are consumed as var(--sb-x,\n * DEFAULT) fallbacks at each point of use (see shared.ts) — never assigned\n * unconditionally on :host — so that a value set by a host application, or\n * by a theme/density attribute forwarded down from a composing parent\n * element, actually inherits through\n * nested shadow roots instead of being reset back to these defaults by every\n * descendant's own :host rule.\n */\nexport const TOKEN_DEFAULTS = {\n font: `\"Geist\", -apple-system, \"Segoe UI\", Helvetica, sans-serif`,\n mono: `\"Geist Mono\", ui-monospace, monospace`,\n accent: \"#111111\",\n onAccent: \"#ffffff\",\n radius: \"4px\",\n /** Multiplies every corner. The `radius` attribute sets it per element. */\n radiusScale: \"1\",\n surface: \"#ffffff\",\n surfaceAlt: \"#fafafa\",\n ink: \"#16181a\",\n mutedInk: \"#61666c\",\n border: \"#e4e6e9\",\n borderStrong: \"#cdd1d6\",\n danger: \"#b4231a\",\n dangerBg: \"#fdf1f0\",\n dangerBorder: \"#f3d6d3\",\n dangerOutline: \"#e8c4c0\",\n dangerPanelBorder: \"#efd9d6\",\n dangerPanelBg: \"#fdf7f6\",\n ok: \"#0f6b4a\",\n okBg: \"#f0f7f3\",\n okBorder: \"#cfe5da\",\n gap: \"16px\",\n pad: \"20px\",\n fieldPad: \"11px 13px\"\n} as const;\n\n/**\n * Base host layout plus the theme=\"dark\"/density=\"compact\" attribute\n * overrides. These overrides are legitimate unconditional assignments —\n * they only fire when *this* element carries the attribute — but every\n * composite element (<singlebase-authui>, <singlebase-authui-account>) must forward\n * theme/density/field-style to the singlebase-* children it renders for the\n * override to reach elements that don't carry the attribute directly.\n */\nexport const tokenDefaults = css`\n :host {\n display: block;\n box-sizing: border-box;\n font-family: var(--sb-font, ${unsafeCSS(TOKEN_DEFAULTS.font)});\n color: var(--sb-ink, ${unsafeCSS(TOKEN_DEFAULTS.ink)});\n }\n\n :host([theme=\"dark\"]) {\n /* The light default accent is near-black, which disappears on a dark\n surface — primary buttons and links both use it. A host that sets its\n own --sb-accent still wins: outer-page declarations beat :host rules. */\n --sb-accent: #f3f4f5;\n --sb-on-accent: #17181b;\n --sb-surface: #17181b;\n --sb-surface-alt: #202226;\n --sb-ink: #f3f4f5;\n --sb-muted-ink: #a2a8ae;\n --sb-border: #2c2f34;\n --sb-border-strong: #3a3e44;\n --sb-danger: #f08379;\n --sb-danger-bg: rgba(240, 131, 121, 0.1);\n --sb-danger-border: rgba(240, 131, 121, 0.3);\n --sb-danger-outline: rgba(240, 131, 121, 0.4);\n --sb-danger-panel-border: rgba(240, 131, 121, 0.3);\n --sb-danger-panel-bg: rgba(240, 131, 121, 0.06);\n --sb-ok: #6fd1a6;\n --sb-ok-bg: rgba(111, 209, 166, 0.1);\n --sb-ok-border: rgba(111, 209, 166, 0.28);\n }\n\n /* Corner presets. They set the scale on this element only, so a page-wide\n :root { --sb-radius-scale } (or --sb-radius) applies to every element\n that doesn't carry the attribute. */\n :host([radius=\"sharp\"]) {\n --sb-radius-scale: 0.35;\n }\n\n :host([radius=\"default\"]) {\n --sb-radius-scale: 1;\n }\n\n :host([radius=\"round\"]) {\n --sb-radius-scale: 1.8;\n }\n\n :host([density=\"compact\"]) {\n --sb-gap: 12px;\n --sb-pad: 16px;\n --sb-field-pad: 9px 11px;\n }\n`;\n","import { css } from \"lit\";\n\n/**\n * Shared internal styles, ported value-for-value from the design mock's\n * styles(t) / acc(t, open, bare) functions in project/AuthWidget.dc.html.\n * The mock computed these as inline style objects per render; here they are\n * static Shadow DOM CSS driven by the --sb-* tokens, with part hooks so\n * hosts can reach internals via ::part().\n */\nexport const sharedStyles = css`\n /* ── layout primitives ───────────────────────────────────── */\n .stack {\n display: flex;\n flex-direction: column;\n gap: var(--sb-gap, 16px);\n }\n\n .fields {\n display: flex;\n flex-direction: column;\n gap: var(--sb-gap, 16px);\n }\n\n .head {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .two-up {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: var(--sb-gap, 16px);\n }\n\n .actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .rule {\n height: 1px;\n background: var(--sb-border, #e4e6e9);\n }\n\n .between {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n }\n\n /* ── type ────────────────────────────────────────────────── */\n .logo-dot {\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 12px;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--sb-muted-ink, #61666c);\n margin-bottom: 6px;\n }\n\n .title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n letter-spacing: -0.015em;\n color: var(--sb-ink, #16181a);\n }\n\n .sub {\n margin: 0;\n font-size: 13.5px;\n line-height: 1.5;\n color: var(--sb-muted-ink, #61666c);\n text-wrap: pretty;\n }\n\n .sec-title {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n letter-spacing: -0.01em;\n color: var(--sb-ink, #16181a);\n }\n\n .hint {\n margin: 0;\n font-size: 12.5px;\n line-height: 1.5;\n color: var(--sb-muted-ink, #61666c);\n text-wrap: pretty;\n }\n\n .pw-rules {\n margin-top: 6px;\n font-size: 12px;\n line-height: 1.5;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .pw-rules summary {\n cursor: pointer;\n width: fit-content;\n }\n\n .pw-rules summary:hover {\n color: var(--sb-ink, #16181a);\n }\n\n .pw-rules ul {\n margin: 4px 0 0;\n padding-left: 18px;\n }\n\n .consent {\n text-align: center;\n text-wrap: balance;\n }\n\n .sub-label {\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 11px;\n letter-spacing: 0.07em;\n text-transform: uppercase;\n color: var(--sb-muted-ink, #61666c);\n }\n\n /* ── fields ──────────────────────────────────────────────── */\n .field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .label-row {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 8px;\n }\n\n label,\n .label {\n font-size: 12.5px;\n font-weight: 500;\n color: var(--sb-muted-ink, #61666c);\n letter-spacing: 0.01em;\n }\n\n input {\n width: 100%;\n box-sizing: border-box;\n font: inherit;\n font-size: 14px;\n color: var(--sb-ink, #16181a);\n background: var(--sb-surface-alt, #fafafa);\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n padding: var(--sb-field-pad, 11px 13px);\n outline: none;\n }\n\n input:focus {\n border-color: var(--sb-accent, #111111);\n }\n\n input[aria-invalid=\"true\"] {\n border-color: var(--sb-danger, #b4231a);\n }\n\n /* field-style=\"underline\" — code boxes keep their box, they read as cells */\n :host([field-style=\"underline\"]) *:not(.code-row):not(.code-row-sm) > input {\n background: transparent;\n border: none;\n border-bottom: 1px solid var(--sb-border-strong, #cdd1d6);\n border-radius: 0;\n padding: 9px 2px;\n }\n\n p.err {\n margin: 0;\n font-size: 12.5px;\n color: var(--sb-danger, #b4231a);\n }\n\n /* ── code entry ──────────────────────────────────────────── */\n .code-row {\n display: grid;\n grid-template-columns: repeat(6, 1fr);\n gap: 8px;\n }\n\n .code-row input {\n text-align: center;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 18px;\n padding: 12px 0;\n }\n\n .code-row-sm {\n display: grid;\n grid-template-columns: repeat(6, 1fr);\n gap: 6px;\n }\n\n .code-row-sm input {\n text-align: center;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 14px;\n padding: 8px 0;\n }\n\n .resend-row {\n display: flex;\n align-items: baseline;\n gap: 8px;\n }\n\n /* ── buttons ─────────────────────────────────────────────── */\n button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n font: inherit;\n font-size: 13.5px;\n font-weight: 500;\n border-radius: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n cursor: pointer;\n padding: 9px 14px;\n border: 1px solid transparent;\n transition:\n background 0.15s,\n border-color 0.15s,\n filter 0.15s,\n color 0.15s;\n }\n\n button:disabled {\n cursor: not-allowed;\n }\n\n button.primary {\n background: var(--sb-accent, #111111);\n color: var(--sb-on-accent, #ffffff);\n width: 100%;\n }\n\n button.primary:hover:not(:disabled) {\n filter: brightness(0.92);\n }\n\n button.primary-sm {\n background: var(--sb-accent, #111111);\n color: var(--sb-on-accent, #ffffff);\n padding: 7px 12px;\n }\n\n button.primary-sm:hover:not(:disabled) {\n filter: brightness(0.92);\n }\n\n button.ghost {\n background: transparent;\n color: var(--sb-muted-ink, #61666c);\n border: 1px solid var(--sb-border, #e4e6e9);\n width: 100%;\n }\n\n button.ghost-sm {\n background: transparent;\n color: var(--sb-muted-ink, #61666c);\n border: 1px solid var(--sb-border, #e4e6e9);\n padding: 7px 12px;\n }\n\n button.ghost:hover:not(:disabled),\n button.ghost-sm:hover:not(:disabled) {\n background: var(--sb-surface-alt, #fafafa);\n color: var(--sb-ink, #16181a);\n }\n\n button.secondary {\n background: var(--sb-surface, #ffffff);\n color: var(--sb-ink, #16181a);\n border: 1px solid var(--sb-border-strong, #cdd1d6);\n padding: 7px 12px;\n }\n\n button.secondary:hover:not(:disabled) {\n background: var(--sb-surface-alt, #fafafa);\n }\n\n button.link {\n font: inherit;\n font-size: 13px;\n font-weight: 500;\n color: var(--sb-accent, #111111);\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n text-decoration: underline;\n text-underline-offset: 3px;\n }\n\n button.link-sm {\n font: inherit;\n font-size: 12.5px;\n font-weight: 400;\n color: var(--sb-muted-ink, #61666c);\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n text-decoration: underline;\n text-underline-offset: 3px;\n }\n\n /* the mock's editLink: a muted underlined affordance that inks on hover */\n button.edit-link {\n align-self: flex-start;\n font: inherit;\n font-size: 12.5px;\n font-weight: 400;\n color: var(--sb-muted-ink, #61666c);\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n text-decoration: underline;\n text-underline-offset: 3px;\n transition: color 0.15s;\n }\n\n button.edit-link:hover:not(:disabled) {\n color: var(--sb-ink, #16181a);\n }\n\n button.edit-link:disabled {\n opacity: 0.4;\n }\n\n button.danger-link {\n align-self: flex-start;\n font: inherit;\n font-size: 12.5px;\n font-weight: 400;\n color: var(--sb-muted-ink, #61666c);\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n text-decoration: underline;\n text-underline-offset: 3px;\n transition: color 0.15s;\n }\n\n button.danger-link:hover:not(:disabled) {\n color: var(--sb-danger, #b4231a);\n }\n\n button.danger {\n padding: 7px 12px;\n background: transparent;\n color: var(--sb-danger, #b4231a);\n border: 1px solid var(--sb-danger-outline, #e8c4c0);\n }\n\n button.danger:hover:not(:disabled) {\n background: var(--sb-danger-bg, #fdf1f0);\n }\n\n button.danger:disabled {\n opacity: 0.45;\n }\n\n .btn-row {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n }\n\n .btn-row-end {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 12px;\n flex-wrap: wrap;\n }\n\n .edit-actions {\n display: flex;\n gap: 8px;\n padding-top: 2px;\n }\n\n /* ── feedback ────────────────────────────────────────────── */\n .banner,\n .notice {\n font-size: 13px;\n line-height: 1.45;\n border-radius: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n padding: 10px 12px;\n }\n\n .banner {\n color: var(--sb-danger, #b4231a);\n background: var(--sb-danger-bg, #fdf1f0);\n border: 1px solid var(--sb-danger-border, #f3d6d3);\n }\n\n .notice {\n color: var(--sb-ok, #0f6b4a);\n background: var(--sb-ok-bg, #f0f7f3);\n border: 1px solid var(--sb-ok-border, #cfe5da);\n }\n\n .saved-note {\n font-size: 12.5px;\n font-weight: 500;\n color: var(--sb-ok, #0f6b4a);\n }\n\n .spinner {\n width: 13px;\n height: 13px;\n border: 2px solid rgba(255, 255, 255, 0.4);\n border-top-color: var(--sb-on-accent, #ffffff);\n border-radius: 50%;\n animation: sb-spin 0.7s linear infinite;\n }\n\n @keyframes sb-spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n }\n\n /* ── step bar ────────────────────────────────────────────── */\n .step-bar {\n height: 3px;\n background: var(--sb-border, #e4e6e9);\n border-radius: 99px;\n overflow: hidden;\n }\n\n .step-fill {\n height: 100%;\n background: var(--sb-accent, #111111);\n transition: width 0.3s;\n }\n\n /* ── footer link row ─────────────────────────────────────── */\n .foot {\n margin: 0;\n display: flex;\n gap: 6px;\n justify-content: center;\n font-size: 13px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n /* ── oauth ───────────────────────────────────────────────── */\n .oauth-primary {\n background: var(--sb-surface, #ffffff);\n color: var(--sb-ink, #16181a);\n border: 1px solid var(--sb-border-strong, #cdd1d6);\n width: 100%;\n }\n\n .oauth-primary:hover:not(:disabled) {\n background: var(--sb-surface-alt, #fafafa);\n }\n\n .g-mark {\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-weight: 500;\n font-size: 13px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .icon-row {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n }\n\n .icon-btn {\n padding: 7px 0;\n background: var(--sb-surface, #ffffff);\n color: var(--sb-muted-ink, #61666c);\n border: 1px solid var(--sb-border, #e4e6e9);\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 13px;\n }\n\n .icon-btn:hover:not(:disabled) {\n background: var(--sb-surface-alt, #fafafa);\n color: var(--sb-ink, #16181a);\n }\n\n /* ── accordion (method picker) ───────────────────────────── */\n .acc-wrap {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .acc-item {\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n overflow: hidden;\n background: transparent;\n transition:\n border-color 0.2s,\n background 0.2s;\n }\n\n .acc-item.open {\n border-color: var(--sb-border-strong, #cdd1d6);\n background: var(--sb-surface, #ffffff);\n }\n\n .acc-item.bare {\n border: none;\n background: transparent;\n }\n\n .acc-head {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n box-sizing: border-box;\n font: inherit;\n text-align: left;\n background: transparent;\n border: none;\n border-radius: 0;\n padding: 11px 12px;\n cursor: pointer;\n color: var(--sb-ink, #16181a);\n transition: background 0.15s;\n }\n\n .acc-head:hover {\n background: var(--sb-surface-alt, #fafafa);\n }\n\n .chev {\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 13px;\n color: var(--sb-muted-ink, #61666c);\n line-height: 1;\n transform: rotate(0deg);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .acc-item.open .chev {\n transform: rotate(90deg);\n }\n\n .acc-title {\n font-size: 13.5px;\n font-weight: 500;\n color: var(--sb-ink, #16181a);\n letter-spacing: -0.005em;\n }\n\n .acc-meta {\n font-size: 12px;\n color: var(--sb-muted-ink, #61666c);\n margin-left: auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .acc-body {\n display: grid;\n grid-template-rows: 0fr;\n opacity: 0;\n transition:\n grid-template-rows 0.28s cubic-bezier(0.32, 0.72, 0, 1),\n opacity 0.16s ease;\n }\n\n .acc-item.open .acc-body {\n grid-template-rows: 1fr;\n opacity: 1;\n transition:\n grid-template-rows 0.34s cubic-bezier(0.32, 0.72, 0, 1),\n opacity 0.26s ease 0.06s;\n }\n\n .acc-clip {\n overflow: hidden;\n min-height: 0;\n }\n\n .acc-inner {\n display: flex;\n flex-direction: column;\n gap: var(--sb-gap, 16px);\n padding: 2px 12px 14px;\n transform: translateY(-4px);\n transition: transform 0.3s cubic-bezier(0.32, 0.72, 0, 1);\n }\n\n .acc-item.open .acc-inner {\n transform: translateY(0);\n }\n\n .acc-item.bare .acc-inner {\n padding: 0;\n }\n\n /* ── invite ──────────────────────────────────────────────── */\n .invite-box {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 10px 12px;\n background: var(--sb-surface-alt, #fafafa);\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n }\n\n .invite-label {\n font-size: 11.5px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n color: var(--sb-muted-ink, #61666c);\n }\n\n .invite-email {\n font-size: 14px;\n color: var(--sb-ink, #16181a);\n }\n\n /* ── account ─────────────────────────────────────────────── */\n .acct-root {\n display: flex;\n flex-direction: column;\n gap: 22px;\n width: 100%;\n }\n\n .acct-nav {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n padding-bottom: 18px;\n border-bottom: 1px solid var(--sb-border, #e4e6e9);\n }\n\n .acct-who {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .avatar-col {\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n }\n\n .avatar {\n flex: 0 0 auto;\n width: 42px;\n height: 42px;\n border-radius: 50%;\n background: var(--sb-surface-alt, #fafafa);\n border: 1px dashed var(--sb-border, #e4e6e9);\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 13px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .avatar.has-photo {\n border-style: solid;\n overflow: hidden;\n }\n .avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .avatar-lg {\n width: 56px;\n height: 56px;\n border-radius: 50%;\n background: var(--sb-surface-alt, #fafafa);\n border: 1px dashed var(--sb-border-strong, #cdd1d6);\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 13px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .avatar-row {\n display: flex;\n align-items: center;\n gap: 14px;\n }\n\n .avatar-actions {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .acct-who-text {\n min-width: 0;\n }\n\n .acct-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--sb-ink, #16181a);\n letter-spacing: -0.01em;\n }\n\n .acct-email {\n font-size: 12.5px;\n color: var(--sb-muted-ink, #61666c);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .acct-body {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 22px;\n }\n\n .section {\n display: flex;\n flex-direction: column;\n gap: 14px;\n }\n\n .sum-list {\n display: flex;\n flex-direction: column;\n }\n\n .sum-row {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 16px;\n padding: 15px 0;\n border-bottom: 1px solid var(--sb-border, #e4e6e9);\n }\n\n .sum-label {\n flex: 0 0 auto;\n font-size: 12.5px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .sum-value {\n min-width: 0;\n font-size: 13.5px;\n color: var(--sb-ink, #16181a);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .edit-card {\n display: flex;\n flex-direction: column;\n gap: var(--sb-gap, 16px);\n padding: 14px;\n background: var(--sb-surface-alt, #fafafa);\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n }\n\n /* 2FA switch */\n .switch {\n flex: 0 0 auto;\n width: 42px;\n height: 24px;\n border-radius: 99px;\n border: 1px solid var(--sb-border-strong, #cdd1d6);\n background: var(--sb-surface-alt, #fafafa);\n cursor: pointer;\n padding: 2px;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n transition:\n background 0.15s,\n border-color 0.15s;\n }\n\n .switch[aria-pressed=\"true\"] {\n border-color: var(--sb-accent, #111111);\n background: var(--sb-accent, #111111);\n justify-content: flex-end;\n }\n\n .knob {\n width: 18px;\n height: 18px;\n border-radius: 50%;\n background: var(--sb-muted-ink, #61666c);\n display: block;\n }\n\n .switch[aria-pressed=\"true\"] .knob {\n background: var(--sb-on-accent, #ffffff);\n }\n\n .qr-row {\n display: flex;\n gap: 14px;\n align-items: flex-start;\n }\n\n .qr-box {\n flex: 0 0 auto;\n width: 74px;\n height: 74px;\n border-radius: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n background: var(--sb-surface-alt, #fafafa);\n border: 1px dashed var(--sb-border-strong, #cdd1d6);\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 12px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .qr-text {\n display: flex;\n flex-direction: column;\n gap: 10px;\n min-width: 0;\n }\n\n /* connected accounts */\n .list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .conn-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 10px 12px;\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n background: var(--sb-surface-alt, #fafafa);\n }\n\n .conn-left {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n }\n\n .conn-mark {\n flex: 0 0 auto;\n width: 28px;\n height: 28px;\n border-radius: 50%;\n background: var(--sb-surface, #ffffff);\n border: 1px solid var(--sb-border, #e4e6e9);\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 11px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .conn-name {\n font-size: 13.5px;\n font-weight: 500;\n color: var(--sb-ink, #16181a);\n }\n\n .meta-row {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .dot {\n flex: 0 0 auto;\n width: 5px;\n height: 5px;\n border-radius: 50%;\n background: var(--sb-ok, #0f6b4a);\n }\n\n .conn-meta {\n font-size: 12px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .tile-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(118px, 1fr));\n gap: 8px;\n }\n\n .tile {\n display: flex;\n align-items: center;\n gap: 8px;\n font: inherit;\n text-align: left;\n padding: 10px 11px;\n border-radius: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n border: 1px dashed var(--sb-border-strong, #cdd1d6);\n background: transparent;\n cursor: pointer;\n transition:\n background 0.15s,\n border-color 0.15s,\n color 0.15s;\n }\n\n .tile:hover:not(:disabled) {\n background: var(--sb-surface-alt, #fafafa);\n border-color: var(--sb-accent, #111111);\n border-style: solid;\n }\n\n .tile-mark {\n flex: 0 0 auto;\n width: 22px;\n height: 22px;\n border-radius: 50%;\n background: var(--sb-surface-alt, #fafafa);\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 10.5px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .tile-name {\n font-size: 13px;\n color: var(--sb-ink, #16181a);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .tile-plus {\n margin-left: auto;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 14px;\n line-height: 1;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .delete-panel {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 14px;\n border: 1px solid var(--sb-danger-panel-border, #efd9d6);\n border-radius: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n background: var(--sb-danger-panel-bg, #fdf7f6);\n }\n\n .disabled-note {\n font-size: 12px;\n color: var(--sb-muted-ink, #61666c);\n font-style: italic;\n }\n`;\n","/**\n * Default UI copy, taken verbatim from the design mock's renderVals()\n * (titles/subs/ctas maps and inline strings in project/AuthWidget.dc.html).\n * Every element accepts a .messages property with a partial override of\n * this shape — spec: \"configurable labels and messages without changing flow\n * logic\". This is deliberately a flat string bag rather than a locale-file\n * system; hosts needing full i18n supply one populated object per language.\n */\nexport interface SinglebaseAuthMessages {\n // titles\n signInTitle: string;\n signUpTitle: string;\n forgotTitle: string;\n verifyTitle: string;\n otpTitle: string;\n newPassTitle: string;\n inviteTitle: string;\n\n // subtitles\n signInSubEmailAndOauth: string;\n signInSubEmailOnly: string;\n signInSubOauthOnly: string;\n signUpSub: string;\n forgotSub: string;\n otpSub: string;\n inviteSub: string;\n\n // ctas\n signInCta: string;\n signUpCta: string;\n forgotCta: string;\n verifyCta: string;\n otpCta: string;\n newPassCta: string;\n inviteCta: string;\n continueCta: string;\n backCta: string;\n\n // accordion\n emailMethodTitle: string;\n emailMethodTitleSignUp: string;\n emailMethodMeta: string;\n emailMethodMetaSignUp: string;\n emailMethodMetaOtp: string;\n oauthMethodTitle: string;\n oauthMethodMeta: string;\n\n // fields\n fullNameLabel: string;\n fullNamePlaceholder: string;\n emailLabel: string;\n emailPlaceholder: string;\n passwordLabel: string;\n passwordPlaceholder: string;\n newPasswordLabel: string;\n newPasswordPlaceholder: string;\n newPasswordPlaceholderPlain: string;\n passwordRulesLabel: string;\n passwordRuleLength: string;\n passwordRuleMinLength: string;\n passwordRuleLowercase: string;\n passwordRuleUppercase: string;\n passwordRuleNumber: string;\n passwordRuleSymbol: string;\n confirmPasswordLabel: string;\n confirmPasswordPlaceholder: string;\n firstNameLabel: string;\n firstNamePlaceholder: string;\n lastNameLabel: string;\n lastNamePlaceholder: string;\n phoneLabel: string;\n phonePlaceholder: string;\n invitedEmailLabel: string;\n\n // links / affordances\n forgotLink: string;\n otpInsteadLink: string;\n footTextSignIn: string;\n footActionSignIn: string;\n footTextSignUp: string;\n footActionSignUp: string;\n resendQuestion: string;\n resendCta: string;\n oauthContinueWith: string;\n\n // blocked\n blockedTitleDisabled: string;\n blockedTitleUnavailable: string;\n blockedBodyDisabled: string;\n blockedBodyUnavailable: string;\n blockedHint: string;\n\n // account\n signOutCta: string;\n addPhotoLink: string;\n changePhotoLink: string;\n photoUploading: string;\n photoUpdated: string;\n editingLabel: string;\n uploadPhotoCta: string;\n replacePhotoCta: string;\n photoHint: string;\n doneCta: string;\n cancelCta: string;\n editAccountCta: string;\n saveChangesCta: string;\n emailChangeHint: string;\n passwordSectionTitle: string;\n passwordChangedHint: string;\n changePasswordCta: string;\n updatePasswordCta: string;\n twoFaTitle: string;\n twoFaHintOff: string;\n twoFaHintOn: string;\n twoFaScanHint: string;\n connectedTitle: string;\n connectedHint: string;\n addAnotherLabel: string;\n disconnectCta: string;\n notConnectedLabel: string;\n deleteAccountCta: string;\n deleteAccountConfirmCta: string;\n deletePanelBody: string;\n deleteConfirmLabel: string;\n deleteConfirmPlaceholder: string;\n savedNote: string;\n passwordUpdatedNote: string;\n\n // standalone change-email / change-username forms\n changeEmailTitle: string;\n newEmailLabel: string;\n changeEmailCta: string;\n changeUsernameTitle: string;\n newUsernameLabel: string;\n changeUsernameCta: string;\n\n // generic async / errors\n genericErrorMessage: string;\n rateLimitedMessage: string;\n codeSentNeutral: string;\n invalidEmailError: string;\n requiredError: string;\n passwordTooShortError: string;\n passwordTooLongError: string;\n passwordNeedsLowercaseError: string;\n passwordNeedsUppercaseError: string;\n passwordNeedsNumberError: string;\n passwordNeedsSymbolError: string;\n invalidPasswordMessage: string;\n passwordMatchError: string;\n invalidCodeError: string;\n invalidCredentialsError: string;\n codeResentNotice: string;\n confirmNewPasswordLabel: string;\n notSignedInNote: string;\n connectProviderLabel: string;\n digitLabel: string;\n accountCreatedNotice: string;\n inviteCodeLabel: string;\n submittingStatus: string;\n doneStatus: string;\n codeIncompleteError: string;\n invalidPhoneError: string;\n firstNameRequiredError: string;\n notYetSupported: string;\n\n // already-signed-in interstitial\n alreadySignedInTitle: string;\n alreadySignedInSub: string;\n alreadySignedInSubPrefix: string;\n continueHint: string;\n\n // consent line\n consentPrefix: string;\n consentJoin: string;\n termsLabel: string;\n privacyLabel: string;\n\n emailUnchangedError: string;\n emailUpdatedNote: string;\n changeEmailCtaShort: string;\n changeEmailHint: string;\n changeEmailConfirmHint: string;\n changeEmailElsewhereHint: string;\n confirmChangeCta: string;\n codeLabel: string;\n\n // provider linking\n linkRequiresSignIn: string;\n\n // oauth callback screen\n oauthCallbackTitle: string;\n oauthCallbackSub: string;\n oauthDenied: string;\n oauthRetryMessage: string;\n oauthUnavailableMessage: string;\n oauthVerifiedEmailMessage: string;\n providerConnectedNotice: string;\n signInToLinkMessage: string;\n providerAlreadyLinkedMessage: string;\n oauthNoAccountMessage: string;\n}\n\nexport const defaultMessages: SinglebaseAuthMessages = {\n signInTitle: \"Sign in\",\n signUpTitle: \"Create your account\",\n forgotTitle: \"Reset your password\",\n verifyTitle: \"Enter your code\",\n otpTitle: \"Sign in with a code\",\n newPassTitle: \"Choose a new password\",\n inviteTitle: \"You have been invited\",\n\n signInSubEmailAndOauth: \"Use your email or a connected provider.\",\n signInSubEmailOnly: \"Use your email address and password.\",\n signInSubOauthOnly: \"Continue with a connected provider.\",\n signUpSub: \"Free to start. No card required.\",\n forgotSub: \"We will email you a six-digit code to confirm it is you.\",\n otpSub: \"No password needed — we will email you a six-digit code.\",\n inviteSub: \"Set up your account to continue.\",\n\n signInCta: \"Sign in\",\n signUpCta: \"Create account\",\n forgotCta: \"Send code\",\n verifyCta: \"Verify code\",\n otpCta: \"Email me a code\",\n newPassCta: \"Save password\",\n inviteCta: \"Create account\",\n continueCta: \"Continue\",\n backCta: \"Back\",\n\n emailMethodTitle: \"Email\",\n emailMethodTitleSignUp: \"Email and password\",\n emailMethodMeta: \"Password or one-time code\",\n emailMethodMetaSignUp: \"Create with an address\",\n emailMethodMetaOtp: \"One-time code\",\n oauthMethodTitle: \"Single sign-on\",\n oauthMethodMeta: \"Use an account you already have\",\n\n fullNameLabel: \"Full name\",\n fullNamePlaceholder: \"Ada Lovelace\",\n emailLabel: \"Email\",\n emailPlaceholder: \"you@company.com\",\n passwordLabel: \"Password\",\n passwordPlaceholder: \"••••••••\",\n newPasswordLabel: \"New password\",\n newPasswordPlaceholder: \"At least {min} characters\",\n newPasswordPlaceholderPlain: \"Choose a password\",\n passwordRulesLabel: \"Password requirements\",\n passwordRuleLength: \"{min}–{max} characters\",\n passwordRuleMinLength: \"At least {min} characters\",\n passwordRuleLowercase: \"A lowercase letter\",\n passwordRuleUppercase: \"An uppercase letter\",\n passwordRuleNumber: \"A number\",\n passwordRuleSymbol: \"A symbol\",\n confirmPasswordLabel: \"Confirm password\",\n confirmPasswordPlaceholder: \"Repeat it\",\n firstNameLabel: \"First name\",\n firstNamePlaceholder: \"Ada\",\n lastNameLabel: \"Last name\",\n lastNamePlaceholder: \"Lovelace\",\n phoneLabel: \"Phone number\",\n phonePlaceholder: \"+1 (555) 000-0000\",\n invitedEmailLabel: \"Invited email\",\n\n forgotLink: \"Forgot?\",\n otpInsteadLink: \"Email me a one-time code instead\",\n footTextSignIn: \"New here?\",\n footActionSignIn: \"Create an account\",\n footTextSignUp: \"Already have an account?\",\n footActionSignUp: \"Sign in\",\n resendQuestion: \"Did not get it?\",\n resendCta: \"Resend code\",\n oauthContinueWith: \"Continue with\",\n\n blockedTitleDisabled: \"Sign-in is turned off\",\n blockedTitleUnavailable: \"Sign-in unavailable\",\n blockedBodyDisabled: \"Authentication is currently disabled for this application.\",\n blockedBodyUnavailable: \"No sign-in methods are enabled for this application.\",\n blockedHint: \"Contact the site owner if you think this is a mistake.\",\n\n signOutCta: \"Sign out\",\n addPhotoLink: \"Add photo\",\n changePhotoLink: \"Change\",\n photoUploading: \"Uploading…\",\n photoUpdated: \"Photo updated\",\n editingLabel: \"Editing\",\n uploadPhotoCta: \"Upload photo\",\n replacePhotoCta: \"Replace photo\",\n photoHint: \"PNG or JPG, up to 2 MB.\",\n doneCta: \"Done\",\n cancelCta: \"Cancel\",\n editAccountCta: \"Edit account\",\n saveChangesCta: \"Save changes\",\n emailChangeHint: \"We will send a verification link to the new address.\",\n passwordSectionTitle: \"Password\",\n passwordChangedHint: \"Last changed three months ago.\",\n changePasswordCta: \"Change password\",\n updatePasswordCta: \"Update password\",\n twoFaTitle: \"Two-factor authentication\",\n twoFaHintOff: \"Add a second step when signing in.\",\n twoFaHintOn: \"Enabled with an authenticator app.\",\n twoFaScanHint: \"Scan with your authenticator app, then enter the 6-digit code.\",\n connectedTitle: \"Connected accounts\",\n connectedHint: \"Sign in with any provider you connect here.\",\n addAnotherLabel: \"Add another\",\n disconnectCta: \"Disconnect\",\n notConnectedLabel: \"Not connected\",\n deleteAccountCta: \"Delete account\",\n deleteAccountConfirmCta: \"Permanently delete account\",\n deletePanelBody:\n \"This removes your profile, sessions and connected providers. It cannot be undone.\",\n deleteConfirmLabel: \"Type DELETE to confirm\",\n deleteConfirmPlaceholder: \"DELETE\",\n savedNote: \"Saved\",\n passwordUpdatedNote: \"Password updated\",\n\n changeEmailTitle: \"Email\",\n newEmailLabel: \"New email\",\n changeEmailCta: \"Send verification code\",\n changeUsernameTitle: \"Username\",\n newUsernameLabel: \"New username\",\n changeUsernameCta: \"Send verification code\",\n\n genericErrorMessage: \"Something went wrong. Please try again.\",\n rateLimitedMessage: \"Too many attempts. Wait a few minutes, then try again.\",\n codeSentNeutral: \"If an eligible account exists, a code has been sent.\",\n invalidEmailError: \"Enter a valid email address.\",\n requiredError: \"This cannot be empty.\",\n passwordTooShortError: \"Use at least {min} characters.\",\n passwordTooLongError: \"Use at most {max} characters.\",\n passwordNeedsLowercaseError: \"Include a lowercase letter.\",\n passwordNeedsUppercaseError: \"Include an uppercase letter.\",\n passwordNeedsNumberError: \"Include a number.\",\n passwordNeedsSymbolError: \"Include a symbol.\",\n invalidPasswordMessage: \"That password doesn't meet the requirements.\",\n passwordMatchError: \"Both passwords must match.\",\n invalidCodeError: \"That code is not valid. Check it and try again.\",\n invalidCredentialsError: \"That email and password do not match.\",\n codeResentNotice: \"New code sent.\",\n confirmNewPasswordLabel: \"Confirm new password\",\n notSignedInNote: \"Not signed in.\",\n connectProviderLabel: \"Connect {name}\",\n digitLabel: \"Digit {n}\",\n accountCreatedNotice: \"Account created. Sign in to continue.\",\n inviteCodeLabel: \"Invite code\",\n submittingStatus: \"Submitting…\",\n doneStatus: \"Done.\",\n codeIncompleteError: \"Enter all six digits.\",\n invalidPhoneError: \"Enter a valid phone number.\",\n firstNameRequiredError: \"Enter your first name.\",\n notYetSupported: \"Not yet supported\",\n\n alreadySignedInTitle: \"You are already signed in\",\n alreadySignedInSub: \"Continue where you left off, or sign out to use another account.\",\n alreadySignedInSubPrefix: \"Signed in as\",\n continueHint: \"Continuing takes you to your account.\",\n\n consentPrefix: \"By continuing you agree to our\",\n consentJoin: \"and\",\n termsLabel: \"Terms\",\n privacyLabel: \"Privacy Policy\",\n\n emailUnchangedError: \"That is already your email address.\",\n emailUpdatedNote: \"Email updated\",\n changeEmailCtaShort: \"Change email\",\n changeEmailHint: \"We will send a code to your current address to confirm it is you.\",\n changeEmailConfirmHint: \"Enter the code we sent, and your email becomes\",\n changeEmailElsewhereHint: \"Your email is changed below, with a verification step.\",\n confirmChangeCta: \"Confirm change\",\n codeLabel: \"Verification code\",\n linkRequiresSignIn: \"Sign in first, then link a provider.\",\n\n oauthCallbackTitle: \"Finishing sign-in\",\n oauthCallbackSub: \"One moment while we complete your sign-in.\",\n oauthDenied: \"Sign-in was cancelled or denied.\",\n oauthRetryMessage: \"We couldn't finish signing you in with that provider. Please try again.\",\n oauthUnavailableMessage: \"This sign-in option isn't available right now.\",\n oauthVerifiedEmailMessage:\n \"Your provider account needs a verified email address. Verify it with the provider, then try again.\",\n providerConnectedNotice: \"{name} is now connected to your account.\",\n signInToLinkMessage:\n \"An account with this email already exists. Sign in first, then connect the provider from your account.\",\n providerAlreadyLinkedMessage: \"That provider account is already connected to another account.\",\n oauthNoAccountMessage:\n \"There's no account for that provider yet. Create an account first, or sign in another way.\"\n};\n\nexport function resolveMessages(\n overrides?: Partial<SinglebaseAuthMessages>\n): SinglebaseAuthMessages {\n return overrides ? { ...defaultMessages, ...overrides } : defaultMessages;\n}\n","import { LitElement, type PropertyValues } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport {\n AUTHUI_PROP_KEYS,\n authUIAttributeFor,\n getDefaultClient,\n type AuthUIConfig\n} from \"@singlebase/core\";\nimport type { AuthClient, UserProfile } from \"@singlebase/singlebase-sdk\";\nimport { AuthController } from \"../controllers/auth-controller.js\";\nimport { tokenDefaults } from \"../styles/tokens.js\";\nimport { sharedStyles } from \"../styles/shared.js\";\nimport { defaultMessages, resolveMessages, type SinglebaseAuthMessages } from \"../messages.js\";\n\n/**\n * Base class for every singlebase-* element: resolves an AuthClient, exposes\n * .messages overrides, and gives subclasses a live AuthController bound to\n * whichever client won.\n */\nexport abstract class SinglebaseElementBase extends LitElement {\n static styles = [tokenDefaults, sharedStyles];\n\n @property({ attribute: false })\n accessor client: AuthClient | null = null;\n\n @property({ attribute: false })\n accessor messages: Partial<SinglebaseAuthMessages> = {};\n\n /**\n * theme/density/field-style are plain reflected attributes so a composing\n * parent can forward them verbatim to the singlebase-* children it renders.\n * CSS custom properties inherit through shadow boundaries on their own,\n * but an *attribute* selector like :host([theme=\"dark\"]) only matches\n * the element that actually carries the attribute, so it must be\n * explicitly propagated down the composition tree.\n */\n @property({ reflect: true })\n accessor theme: \"light\" | \"dark\" | undefined = undefined;\n\n @property({ reflect: true })\n accessor density: \"comfortable\" | \"compact\" | undefined = undefined;\n\n /**\n * Input chrome: boxed (default) or a single bottom rule. Reflected for the\n * same reason as theme/density — the CSS is an attribute selector.\n */\n @property({ reflect: true, attribute: \"field-style\" })\n accessor fieldStyle: \"outline\" | \"underline\" | undefined = undefined;\n\n /** Corner preset for this element: `sharp`, `default` or `round`. */\n @property({ reflect: true })\n accessor radius: \"sharp\" | \"default\" | \"round\" | undefined = undefined;\n\n protected auth = new AuthController(this);\n\n /**\n * Resolution order: an explicit `.client`, then the page's default\n * SinglebaseClient()'s auth.\n *\n * That fallback is what lets several widgets sit on one page — a header\n * sign-in, a modal, an account panel — and share one session with no\n * wiring, since SinglebaseClient() is cached per project. A page talking to\n * two projects sets `.client` on the widgets belonging to the second.\n *\n * Reading `.auth` is also what *constructs* auth: a page that only drops\n * in a widget initializes it with no bootstrap code at all.\n */\n get resolvedClient(): AuthClient | null {\n if (this.client) return this.client;\n return getDefaultClient<{ auth: AuthClient }>()?.auth ?? null;\n }\n\n /** Page-wide UI config from SinglebaseClient({ authui }), if there is one. */\n get uiConfig(): AuthUIConfig | null {\n return this.resolvedClient?.authui ?? null;\n }\n\n /**\n * Config messages sit *under* the element's own, so a page-wide translation\n * can be overridden per widget without repeating the whole bag.\n */\n get msg(): SinglebaseAuthMessages {\n const shared = this.uiConfig?.messages;\n return resolveMessages(shared ? { ...shared, ...this.messages } : this.messages);\n }\n\n /** Config keys already applied, so a later render does not fight the host. */\n private appliedConfig = new Set<string>();\n\n /**\n * Copies the page-wide config onto this element.\n *\n * An attribute present in markup always wins — that is the whole precedence\n * rule, and it is checked per key rather than wholesale, so a widget can\n * override one thing and inherit the rest. Keys the element does not have\n * are skipped, which is how one config can serve every singlebase-authui-*\n * element without any of them knowing about the others.\n */\n protected applyUIConfig(): void {\n const config = this.uiConfig;\n if (!config) return;\n\n for (const key of AUTHUI_PROP_KEYS) {\n const value = config[key];\n if (value === undefined) continue;\n if (!(key in this)) continue;\n if (this.hasAttribute(authUIAttributeFor(key))) continue;\n if (this.appliedConfig.has(key)) continue;\n\n this.appliedConfig.add(key);\n (this as unknown as Record<string, unknown>)[key] = value;\n }\n\n for (const [name, value] of Object.entries(config.tokens ?? {})) {\n if (!name.startsWith(\"--\")) continue;\n // Anything already set inline came from the host and stays.\n if (this.style.getPropertyValue(name)) continue;\n this.style.setProperty(name, value);\n }\n }\n\n // ── public API mirrored from the client, for host/SPA code ──\n isAuthenticated(): boolean {\n return this.resolvedClient?.isAuthenticated() ?? false;\n }\n\n getUser(): UserProfile | null {\n return this.resolvedClient?.getUser() ?? null;\n }\n\n async refreshSession() {\n return this.resolvedClient?.refreshSession();\n }\n\n async logout(): Promise<void> {\n await this.resolvedClient?.logout();\n }\n\n override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n this.auth.bind(this.resolvedClient);\n this.applyUIConfig();\n }\n}\n\nexport { defaultMessages };\n","/**\n * Resolves a post-login destination, or null when there isn't a safe one.\n *\n * The candidate usually comes from a `?redirect=` parameter, which is\n * attacker-controllable: anyone can send a victim a link to your own login\n * page carrying `?redirect=https://evil.example`. If the widget followed it,\n * the victim would sign in on a page they trust and then be handed to a site\n * they don't — a textbook open redirect, and a convincing one precisely\n * because the login step was genuine.\n *\n * So the rule is same-origin only. Relative paths resolve against the current\n * page; anything landing on another origin is refused, and the caller is told\n * why rather than left wondering where the redirect went.\n */\nexport function resolveRedirectTarget(\n candidate: string | null | undefined,\n currentHref: string | null | undefined,\n onRefused?: (reason: string) => void\n): string | null {\n if (!candidate || !currentHref) return null;\n\n let here: URL;\n try {\n here = new URL(currentHref);\n } catch {\n return null;\n }\n\n let target: URL;\n try {\n target = new URL(candidate, here.href);\n } catch {\n onRefused?.(`\"${candidate}\" is not a valid URL`);\n return null;\n }\n\n // Only ever http(s). A `javascript:` or `data:` candidate resolves to a URL\n // object quite happily, and assigning it would execute script.\n if (target.protocol !== \"http:\" && target.protocol !== \"https:\") {\n onRefused?.(`refusing redirect to unsupported scheme \"${target.protocol}\"`);\n return null;\n }\n\n if (target.origin !== here.origin) {\n onRefused?.(`refusing cross-origin redirect to ${target.origin}; same-origin only`);\n return null;\n }\n\n // Already there — redirecting would just reload, and can loop.\n if (target.href === here.href) return null;\n\n return target.href;\n}\n","import type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport type { AuthClient, AuthSettings } from \"@singlebase/singlebase-sdk\";\n\n/**\n * Loads auth.settings once per bound client and caches it, so composing\n * many form elements inside <singlebase-authui> doesn't mean many redundant\n * auth.settings calls. Each element may also be given .settings directly\n * (e.g. by a parent that already loaded them) to skip the fetch entirely.\n */\nexport class SettingsController implements ReactiveController {\n private host: ReactiveControllerHost;\n private client: AuthClient | null = null;\n private cache = new WeakMap<AuthClient, Promise<AuthSettings>>();\n settings: AuthSettings | null = null;\n error: unknown = null;\n\n constructor(host: ReactiveControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n hostConnected(): void {}\n\n load(client: AuthClient | null, override?: AuthSettings | null): void {\n if (override) {\n this.settings = override;\n return;\n }\n if (!client || client === this.client) return;\n this.client = client;\n let pending = this.cache.get(client);\n if (!pending) {\n pending = client.getSettings();\n this.cache.set(client, pending);\n }\n pending\n .then((settings) => {\n this.settings = settings;\n this.error = null;\n this.host.requestUpdate();\n })\n .catch((error) => {\n this.error = error;\n this.host.requestUpdate();\n });\n }\n}\n","import type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport type { AuthClient, AuthEventName } from \"@singlebase/singlebase-sdk\";\n\nexport const BRIDGED_EVENTS = [\n \"load\",\n \"success\",\n \"error\",\n \"signin\",\n \"signup\",\n \"signout\",\n \"session\",\n \"account-updated\",\n \"password-change\",\n \"email-change\",\n \"username-change\",\n \"expired\",\n \"navigate\",\n \"goto\"\n] as const satisfies readonly AuthEventName[];\n\n/**\n * The auth API's event names mapped onto the\n * friendlier ones. Both are dispatched so either style works.\n */\nconst SPEC_ALIASES: Partial<Record<AuthEventName, string>> = {\n load: \"auth:ready\",\n signin: \"auth:signin\",\n signup: \"auth:signup\",\n session: \"auth:session\",\n \"account-updated\": \"auth:profile-update\",\n signout: \"auth:signout\",\n error: \"auth:error\",\n navigate: \"auth:navigate\"\n};\n\n/** \"account-updated\" -> \"onAccountUpdated\" */\nexport function callbackPropFor(event: string): string {\n return \"on\" + event.replace(/(^|-)([a-z])/g, (_, __, c: string) => c.toUpperCase());\n}\n\n/**\n * Re-publishes core auth events on the host element in the two ways host\n * apps actually consume them:\n *\n * - a DOM CustomEvent (`singlebase-signin`, and the spec's `auth:signin`),\n * bubbling and composed so `document.addEventListener` works;\n * - a callback property (`el.onSignin = fn`), since HTML attributes cannot\n * carry functions.\n *\n * Event details never include tokens — consumers read the session through\n * the client, per the spec's events rule.\n */\nexport class EventBridge implements ReactiveController {\n private unsubscribes: Array<() => void> = [];\n private client: AuthClient | null = null;\n\n constructor(private host: ReactiveControllerHost & HTMLElement) {\n host.addController(this);\n }\n\n bind(client: AuthClient | null): void {\n if (client === this.client) return;\n this.release();\n this.client = client;\n if (!client) return;\n\n this.unsubscribes = BRIDGED_EVENTS.map((event) =>\n client.on(event, (detail: unknown) => this.publish(event, detail))\n );\n }\n\n private publish(event: string, detail: unknown) {\n const callback = (this.host as unknown as Record<string, unknown>)[callbackPropFor(event)];\n if (typeof callback === \"function\") {\n try {\n (callback as (d: unknown) => void).call(this.host, detail);\n } catch (error) {\n console.error(`[singlebase] ${callbackPropFor(event)} threw:`, error);\n }\n }\n\n const init: CustomEventInit = { detail, bubbles: true, composed: true };\n this.host.dispatchEvent(new CustomEvent(`singlebase-${event}`, init));\n const alias = SPEC_ALIASES[event as AuthEventName];\n if (alias) this.host.dispatchEvent(new CustomEvent(alias, init));\n }\n\n private release() {\n this.unsubscribes.forEach((off) => off());\n this.unsubscribes = [];\n }\n\n hostDisconnected(): void {\n this.release();\n this.client = null;\n }\n}\n","import { css } from \"lit\";\n\n/**\n * The \"… by Singlebase\" credit, identical in every element: same font, size,\n * spacing and hover. Each element only decides where it sits.\n */\nexport const brandingStyles = css`\n .branding {\n text-align: center;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 10.5px;\n line-height: 1.4;\n letter-spacing: 0.06em;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .branding a {\n color: inherit;\n text-decoration: none;\n }\n\n .branding a:hover {\n color: var(--sb-ink, #16181a);\n text-decoration: underline;\n text-underline-offset: 3px;\n }\n`;\n","import { html, nothing } from \"lit\";\n\nexport const BRANDING_URL = \"https://singlebase.io\";\nexport const BRANDING_TITLE = \"Singlebase.io\";\n\n/**\n * The fixed \"… by Singlebase\" credit. It can be hidden, never changed.\n * It's a plain link: it makes no request until someone clicks it.\n */\nexport function renderBranding(show: boolean, product: \"Auth\" | \"Chat\" | \"Files\") {\n if (!show) return nothing;\n return html`<div class=\"branding\" part=\"branding\">\n <a href=${BRANDING_URL} title=${BRANDING_TITLE} target=\"_blank\" rel=\"noopener noreferrer\"\n >${product} by Singlebase</a\n >\n </div>`;\n}\n","import type { AuthSettings, OAuthIntent, OAuthProviderName } from \"@singlebase/singlebase-sdk\";\n\nexport interface OAuthProviderOption {\n id: OAuthProviderName;\n /** The project's `provider_name`, never a hard-coded label. */\n name: string;\n /** A short mark for the button. */\n mark: string;\n}\n\n/** Where a link flow remembers its provider across the redirect. */\nexport const linkStorageKey = (nonceKey: string) => `${nonceKey}:link`;\n\nconst MARKS: Record<string, string> = { google: \"G\", github: \"GH\", linkedin: \"in\", facebook: \"f\" };\n\n/** OAuth is usable only when it's on and the project has a frontend return URL. */\nexport function oauthReady(settings: AuthSettings | null | undefined): boolean {\n const o = settings?.oauth_settings;\n return !!o?.enabled && !!o.redirect_url?.trim();\n}\n\n/**\n * The intent to send for a sign-in button. The service's `signup` intent signs\n * an existing account in and creates one for a new person, while `signin`\n * refuses anyone it doesn't know. So when the project allows OAuth sign-up, a\n * sign-in button uses `signup` and first-time visitors aren't turned away.\n */\nexport function startIntent(\n settings: AuthSettings | null | undefined,\n intent: OAuthIntent\n): OAuthIntent {\n return intent === \"signin\" && settings?.oauth_settings.allow_signup ? \"signup\" : intent;\n}\n\n/**\n * The enabled providers for an intent. Sign-in and sign-up also follow the\n * project's `allow_signin` / `allow_signup`; linking only needs OAuth on.\n */\nexport function oauthProviders(\n settings: AuthSettings | null | undefined,\n intent: OAuthIntent\n): OAuthProviderOption[] {\n if (!settings || !oauthReady(settings)) return [];\n const o = settings.oauth_settings;\n if (intent === \"signin\" && !o.allow_signin) return [];\n if (intent === \"signup\" && !o.allow_signup) return [];\n\n return Object.entries(settings.oauth_providers ?? {})\n .filter(([, p]) => p.enabled)\n .map(([id, p]) => ({\n id: id as OAuthProviderName,\n name: p.provider_name,\n mark: MARKS[id] ?? p.provider_name.slice(0, 2)\n }));\n}\n","import { SinglebaseAuthError, mapErrorToHint } from \"@singlebase/singlebase-sdk\";\nimport type { SinglebaseAuthMessages } from \"../messages.js\";\n\n/**\n * The message to show for a failed auth call, following the spec's error\n * table. Messages stay generic where detail could reveal whether an account\n * exists or how a provider is set up.\n */\nexport function describeAuthError(error: unknown, msg: SinglebaseAuthMessages): string {\n if (!(error instanceof SinglebaseAuthError)) return msg.genericErrorMessage;\n\n switch (mapErrorToHint(error.code)) {\n case \"disable_retry_show_rate_limited\":\n return msg.rateLimitedMessage;\n case \"show_password_requirements\":\n return msg.invalidPasswordMessage;\n case \"expired_or_invalid_code_message\":\n return msg.invalidCodeError;\n case \"explain_verified_email_required\":\n return msg.oauthVerifiedEmailMessage;\n case \"restart_oauth\":\n case \"restart_oauth_new_nonce\":\n return msg.oauthRetryMessage;\n case \"ask_signin_then_link\":\n return msg.signInToLinkMessage;\n case \"provider_already_linked\":\n return msg.providerAlreadyLinkedMessage;\n case \"hide_oauth\":\n case \"remove_oauth_from_signin\":\n case \"remove_oauth_from_signup\":\n case \"refresh_settings_hide_provider\":\n return msg.oauthUnavailableMessage;\n case \"show_integrator_config_error\":\n // Meant for the developer, not the visitor: say what to fix in the console.\n console.warn(`[singlebase] Auth is misconfigured for this project (${error.code}).`);\n return error.code === \"MISSING_OAUTH_CREDENTIALS\"\n ? msg.oauthUnavailableMessage\n : msg.genericErrorMessage;\n default:\n return msg.genericErrorMessage;\n }\n}\n","import { html, nothing } from \"lit\";\nimport type { PasswordPolicy } from \"@singlebase/singlebase-sdk\";\nimport type { SinglebaseAuthMessages } from \"../messages.js\";\n\n/** The placeholder for a new-password field: the policy's minimum, when known. */\nexport function newPasswordPlaceholder(\n policy: PasswordPolicy | null | undefined,\n msg: SinglebaseAuthMessages\n): string {\n const min = policy?.LENGTH?.[0];\n return min\n ? msg.newPasswordPlaceholder.replace(\"{min}\", String(min))\n : msg.newPasswordPlaceholderPlain;\n}\n\n/**\n * Checks a new password against the project's `password_policy` and returns\n * the first rule it breaks, or \"\" when it passes. Without a policy (settings\n * not loaded yet) nothing is checked here and the server decides.\n */\nexport function passwordError(\n password: string,\n policy: PasswordPolicy | null | undefined,\n msg: SinglebaseAuthMessages\n): string {\n if (!password) return msg.requiredError;\n if (!policy) return \"\";\n\n const [min, max] = policy.LENGTH ?? [0, 0];\n if (min && password.length < min) return msg.passwordTooShortError.replace(\"{min}\", String(min));\n if (max && password.length > max) return msg.passwordTooLongError.replace(\"{max}\", String(max));\n if (policy.LOWERCASE && !/[a-z]/.test(password)) return msg.passwordNeedsLowercaseError;\n if (policy.UPPERCASE && !/[A-Z]/.test(password)) return msg.passwordNeedsUppercaseError;\n if (policy.NUMBERS && !/\\d/.test(password)) return msg.passwordNeedsNumberError;\n if (policy.SYMBOLS && !/[^A-Za-z0-9\\s]/.test(password)) return msg.passwordNeedsSymbolError;\n return \"\";\n}\n\ninterface PasswordRule {\n label: string;\n}\n\n/** The policy's rules as readable labels. */\nfunction passwordRules(\n policy: PasswordPolicy | null | undefined,\n msg: SinglebaseAuthMessages\n): PasswordRule[] {\n if (!policy) return [];\n const [min, max] = policy.LENGTH ?? [0, 0];\n const rules: PasswordRule[] = [];\n if (min || max) {\n const label = max\n ? msg.passwordRuleLength.replace(\"{min}\", String(min || 1)).replace(\"{max}\", String(max))\n : msg.passwordRuleMinLength.replace(\"{min}\", String(min));\n rules.push({ label });\n }\n if (policy.LOWERCASE) rules.push({ label: msg.passwordRuleLowercase });\n if (policy.UPPERCASE) rules.push({ label: msg.passwordRuleUppercase });\n if (policy.NUMBERS) rules.push({ label: msg.passwordRuleNumber });\n if (policy.SYMBOLS) rules.push({ label: msg.passwordRuleSymbol });\n return rules;\n}\n\n/**\n * The policy's requirements as a small hint under a new-password field,\n * closed until opened. It only lists the rules; validation stays on submit.\n */\nexport function renderPasswordRules(\n policy: PasswordPolicy | null | undefined,\n msg: SinglebaseAuthMessages\n) {\n const rules = passwordRules(policy, msg);\n if (rules.length === 0) return nothing;\n return html`<details class=\"pw-rules\" part=\"password-rules\">\n <summary>${msg.passwordRulesLabel}</summary>\n <ul>\n ${rules.map((rule) => html`<li>${rule.label}</li>`)}\n </ul>\n </details>`;\n}\n","import { html } from \"lit\";\nimport { state } from \"lit/decorators.js\";\nimport { SinglebaseElementBase } from \"./authui-base.js\";\nimport { describeAuthError } from \"../utils/auth-errors.js\";\n\nexport type FormPhase = \"idle\" | \"submitting\" | \"success\" | \"error\";\n\n/**\n * Adds the spec's required cross-cutting form behavior to SinglebaseElementBase:\n * idle/submitting/success/error phase, a form-level error message, disabled\n * controls while submitting, an aria-live status region, and cancellation of\n * in-flight work on disconnect.\n */\nexport abstract class SinglebaseFormBase extends SinglebaseElementBase {\n @state()\n protected accessor phase: FormPhase = \"idle\";\n\n @state()\n protected accessor formError = \"\";\n\n @state()\n protected accessor noticeMessage = \"\";\n\n protected abortController: AbortController | null = null;\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.abortController?.abort();\n }\n\n protected get signal(): AbortSignal {\n this.abortController?.abort();\n this.abortController = new AbortController();\n return this.abortController.signal;\n }\n\n /** Runs task, tracking idle→submitting→success/error and mapping errors to a message. */\n protected async run(task: () => Promise<void>): Promise<void> {\n this.phase = \"submitting\";\n this.formError = \"\";\n try {\n await task();\n this.phase = \"success\";\n } catch (error) {\n if (this.isAbortError(error)) return;\n this.phase = \"error\";\n this.formError = this.describeError(error);\n }\n }\n\n private isAbortError(error: unknown): boolean {\n return error instanceof DOMException && error.name === \"AbortError\";\n }\n\n protected describeError(error: unknown): string {\n return describeAuthError(error, this.msg);\n }\n\n protected get submitting(): boolean {\n return this.phase === \"submitting\";\n }\n\n /** aria-live region for async status — spec requires one per form. */\n protected renderStatus() {\n return html`\n <div\n role=\"status\"\n aria-live=\"polite\"\n style=\"position:absolute;width:1px;height:1px;overflow:hidden;\"\n >\n ${this.phase === \"submitting\" ? this.msg.submittingStatus : \"\"}\n ${this.phase === \"success\" ? this.msg.doneStatus : \"\"}\n </div>\n ${this.formError ? html`<p class=\"banner\" role=\"alert\">${this.formError}</p>` : null}\n ${this.noticeMessage ? html`<p class=\"notice\" role=\"status\">${this.noticeMessage}</p>` : null}\n `;\n }\n}\n","import type { UserProfile } from \"@singlebase/singlebase-sdk\";\n\n/** \"Ada Lovelace\", or \"\" when the profile carries no name at all. */\nexport function fullNameOf(user: Pick<UserProfile, \"first_name\" | \"last_name\"> | null): string {\n return [user?.first_name, user?.last_name].filter(Boolean).join(\" \").trim();\n}\n\n/**\n * Two-letter avatar initials. Falls back to the email's first letter, then to\n * a neutral glyph, so the avatar is never blank for a profile that only has\n * an address.\n */\nexport function initialsOf(\n user: Pick<UserProfile, \"first_name\" | \"last_name\" | \"email\"> | null\n): string {\n const name = fullNameOf(user);\n if (name) {\n return name\n .split(/\\s+/)\n .map((word) => word[0])\n .join(\"\")\n .slice(0, 2)\n .toUpperCase();\n }\n const email = user?.email ?? \"\";\n return email ? email[0]!.toUpperCase() : \"·\";\n}\n","/**\n * Default copy for <singlebase-uploader>. Same shape and contract as the\n * auth bag in messages.ts: a flat set of strings, overridable in whole or in\n * part through the element's `.messages` property.\n *\n * `{n}`, `{max}`, `{name}` and `{size}` are filled in by `fill()`.\n */\nexport interface SinglebaseUploadMessages {\n heading: string;\n description: string;\n\n // dropzone\n dropTitle: string;\n dropSub: string;\n hintUpTo: string;\n\n // controls\n chooseFiles: string;\n chooseFile: string;\n addMore: string;\n remove: string;\n rename: string;\n retry: string;\n uploadCtaOne: string;\n uploadCtaMany: string;\n\n // compact view\n attachments: string;\n dropOrChoose: string;\n\n // status\n checking: string;\n pagesLabel: string;\n countOne: string;\n countMany: string;\n uploading: string;\n uploaded: string;\n failedLabel: string;\n\n // problems\n errTooMany: string;\n errTooLarge: string;\n errTooSmall: string;\n errDuplicate: string;\n errType: string;\n errNoClient: string;\n errUpload: string;\n errProtected: string;\n errTooManyPages: string;\n}\n\nexport const defaultUploadMessages: SinglebaseUploadMessages = {\n heading: \"Upload files\",\n description: \"Add one or more files. You can review the list before uploading.\",\n\n dropTitle: \"Drag and drop files here\",\n dropSub: \"or browse from your device\",\n hintUpTo: \"up to {size} each\",\n\n chooseFiles: \"Choose files\",\n chooseFile: \"Choose file\",\n addMore: \"+ Add more files\",\n remove: \"Remove\",\n rename: \"Rename\",\n retry: \"Retry\",\n uploadCtaOne: \"Upload {n} file\",\n uploadCtaMany: \"Upload {n} files\",\n\n attachments: \"Attachments\",\n dropOrChoose: \"Drop files or choose\",\n\n checking: \"Checking…\",\n pagesLabel: \"{n} pages\",\n countOne: \"{n} file of {max}\",\n countMany: \"{n} files of {max}\",\n uploading: \"Uploading…\",\n uploaded: \"Uploaded\",\n failedLabel: \"Failed\",\n\n errTooMany: \"You can upload up to {max} files.\",\n errTooLarge: \"{name} is larger than {size}.\",\n errTooSmall: \"{name} is smaller than {size}.\",\n errDuplicate: \"{name} is already in the list.\",\n errType: \"{name} isn't an accepted file type.\",\n errNoClient: \"No Singlebase client found on this page.\",\n errUpload: \"Upload failed.\",\n errProtected: \"{name} is password protected.\",\n errTooManyPages: \"{name} has {pages} pages; the limit is {max}.\"\n};\n\nexport function resolveUploadMessages(\n overrides?: Partial<SinglebaseUploadMessages>\n): SinglebaseUploadMessages {\n return overrides ? { ...defaultUploadMessages, ...overrides } : defaultUploadMessages;\n}\n\n/** Fills `{token}` placeholders. Values are plain text and rendered as text. */\nexport function fill(template: string, values: Record<string, string | number>): string {\n return template.replace(/\\{(\\w+)\\}/g, (match, key) =>\n key in values ? String(values[key]) : match\n );\n}\n","/**\n * Small pure helpers for <singlebase-uploader>: parsing and printing\n * sizes, matching an `accept` list, and the identity a duplicate is judged by.\n * Kept out of the element so they can be tested without a DOM.\n */\n\nconst UNITS: Record<string, number> = {\n b: 1,\n kb: 1024,\n mb: 1024 * 1024,\n gb: 1024 * 1024 * 1024\n};\n\n/** \"25MB\" / \"500 kb\" / \"1048576\" → bytes. 0 means \"no limit\". */\nexport function parseSize(value: string | number | null | undefined): number {\n if (typeof value === \"number\") return value > 0 ? value : 0;\n if (!value) return 0;\n const match = String(value)\n .trim()\n .toLowerCase()\n .match(/^([\\d.]+)\\s*(b|kb|mb|gb)?$/);\n if (!match) return 0;\n const amount = Number.parseFloat(match[1]);\n if (!Number.isFinite(amount) || amount <= 0) return 0;\n return Math.round(amount * (UNITS[match[2] ?? \"b\"] ?? 1));\n}\n\nexport function formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n\n/** The extension in lowercase, without the dot. \"\" when there is none. */\nexport function fileExtension(filename: string): string {\n const dot = filename.lastIndexOf(\".\");\n if (dot <= 0 || dot === filename.length - 1) return \"\";\n return filename.slice(dot + 1).toLowerCase();\n}\n\n/** The extension, uppercased and clipped, for the little type chip. */\nexport function extensionOf(filename: string): string {\n return fileExtension(filename).toUpperCase().slice(0, 4);\n}\n\n/**\n * Matches one file against an `accept` list, using the same vocabulary as the\n * attribute on `<input type=\"file\">`: extensions (\".pdf\"), exact MIME types\n * (\"application/pdf\") and wildcards (\"image/*\"). An empty list accepts\n * everything.\n *\n * This is a convenience, not a security control — the browser's own file\n * dialog filter and this check are both trivially bypassed by a drop, so the\n * server remains the authority on what it will store.\n */\nexport function acceptsFile(accept: string, name: string, type: string): boolean {\n const rules = accept\n .split(\",\")\n .map((rule) => rule.trim().toLowerCase())\n .filter(Boolean);\n if (!rules.length) return true;\n\n const lowerName = name.toLowerCase();\n const lowerType = (type || \"\").toLowerCase();\n\n return rules.some((rule) => {\n if (rule.startsWith(\".\")) return lowerName.endsWith(rule);\n if (rule.endsWith(\"/*\")) return lowerType.startsWith(rule.slice(0, -1));\n return lowerType === rule;\n });\n}\n\n/** Human list of accepted kinds for the hint line: \".pdf,image/png\" → \"PDF, PNG\". */\nexport function acceptSummary(accept: string): string {\n const parts = accept\n .split(\",\")\n .map((rule) => rule.trim())\n .filter(Boolean)\n .map((rule) => {\n if (rule.startsWith(\".\")) return rule.slice(1).toUpperCase();\n if (rule.endsWith(\"/*\")) return rule.slice(0, -2).toUpperCase();\n const slash = rule.indexOf(\"/\");\n return (slash >= 0 ? rule.slice(slash + 1) : rule).toUpperCase();\n });\n return [...new Set(parts)].join(\", \");\n}\n\n/**\n * Two picks are the same file when name, size and mtime all match. Content\n * hashing would be exact but means reading every byte before the user has\n * even pressed upload; this is what a file manager uses, and it is enough to\n * stop the common case of dropping the same batch twice.\n */\nexport function fileKey(file: { name: string; size: number; lastModified?: number }): string {\n return `${file.name}:${file.size}:${file.lastModified ?? 0}`;\n}\n\n/** Replaces the base name, keeping the original extension. */\nexport function renameKeepingExtension(original: string, typed: string): string {\n const clean = typed.trim().replace(/[/\\\\]/g, \"\");\n if (!clean) return original;\n const dot = original.lastIndexOf(\".\");\n const extension = dot > 0 ? original.slice(dot) : \"\";\n if (!extension) return clean;\n return clean.toLowerCase().endsWith(extension.toLowerCase()) ? clean : clean + extension;\n}\n","/**\n * Reads a few facts out of a file before it is uploaded: how many pages it\n * has, and whether it is encrypted. Everything here runs in the browser on\n * the bytes the user picked — no upload, no dependency, no worker.\n *\n * Two honest caveats, both of which the documentation repeats:\n *\n * - **This is a convenience, not a security control.** Anyone can bypass it.\n * The server still has to enforce whatever actually matters.\n * - **Facts can be unknown.** A page count is `null` when the structure\n * can't be read, and callers treat unknown as \"rule doesn't apply\" rather\n * than rejecting a file they simply failed to parse.\n */\n\nexport interface FileFacts {\n /** Pages for PDF and DOCX, slides for PPTX. Null when undeterminable. */\n pages: number | null;\n /** True when encrypted, false when plainly not, null when unknown. */\n encrypted: boolean | null;\n}\n\nconst UNKNOWN: FileFacts = { pages: null, encrypted: null };\n\n/** How much of a large PDF to look at, from each end. */\nconst PDF_HEAD = 16 * 1024 * 1024;\nconst PDF_TAIL = 2 * 1024 * 1024;\n\n/** Ceilings for the compressed-PDF fallback, so a hostile file can't stall the tab. */\nconst MAX_STREAMS = 40;\nconst MAX_INFLATED = 4 * 1024 * 1024;\n\nconst OOXML = new Set([\"docx\", \"pptx\", \"xlsx\"]);\n\n/** Inspects one file. Never throws — an unreadable file is simply unknown. */\nexport async function inspectFile(file: Blob, extension: string): Promise<FileFacts> {\n try {\n if (extension === \"pdf\") return await inspectPdf(file);\n if (OOXML.has(extension)) return await inspectOoxml(file, extension);\n } catch {\n // A corrupt or surprising file is not a rejection reason on its own.\n }\n return UNKNOWN;\n}\n\n/** True when this extension has anything worth reading bytes for. */\nexport function isInspectable(extension: string): boolean {\n return extension === \"pdf\" || OOXML.has(extension);\n}\n\n// ── PDF ──────────────────────────────────────────────────────\n\nasync function inspectPdf(file: Blob): Promise<FileFacts> {\n const head = await bytesOf(file.slice(0, PDF_HEAD));\n const tail =\n file.size > PDF_HEAD ? await bytesOf(file.slice(Math.max(0, file.size - PDF_TAIL))) : null;\n\n const text = latin1(head) + (tail ? latin1(tail) : \"\");\n\n // An encrypted PDF names /Encrypt in its trailer. The whole file is still\n // readable — it is the content streams that are encrypted — so this is a\n // reliable marker rather than a guess.\n const encrypted = /\\/Encrypt[\\s/<>\\]]/.test(text);\n\n let pages = pageCountIn(text);\n if (pages === null) pages = await pageCountInStreams(head);\n\n return { pages, encrypted };\n}\n\n/**\n * The page tree's root node carries `/Count` with the document total, so the\n * largest `/Count` next to a `/Pages` node is the answer. Files that write\n * the tree without counts fall back to counting `/Type /Page` objects.\n */\nfunction pageCountIn(text: string): number | null {\n if (/\\/Type\\s*\\/Pages/.test(text)) {\n let max = 0;\n for (const match of text.matchAll(/\\/Count\\s+(\\d+)/g)) {\n max = Math.max(max, Number(match[1]));\n }\n if (max > 0) return max;\n }\n const direct = text.match(/\\/Type\\s*\\/Page[^s]/g);\n return direct?.length ? direct.length : null;\n}\n\n/**\n * PDF 1.5 and later may pack the page tree into compressed object streams,\n * where a plain scan sees nothing. Inflating the streams and scanning the\n * result recovers the count, using only DecompressionStream.\n */\nasync function pageCountInStreams(bytes: Uint8Array): Promise<number | null> {\n if (typeof DecompressionStream === \"undefined\") return null;\n\n const text = latin1(bytes);\n let inflated = \"\";\n let streams = 0;\n\n for (const match of text.matchAll(/stream\\r?\\n/g)) {\n if (streams >= MAX_STREAMS || inflated.length >= MAX_INFLATED) break;\n const start = match.index! + match[0].length;\n let end = text.indexOf(\"endstream\", start);\n if (end < 0) break;\n // Writers put an EOL between the data and the keyword. It has to come off:\n // the decompressor rejects anything trailing the compressed data.\n while (end > start && (text[end - 1] === \"\\n\" || text[end - 1] === \"\\r\")) end -= 1;\n streams += 1;\n try {\n const out = await inflate(bytes.subarray(start, end), \"deflate\");\n inflated += latin1(out);\n } catch {\n // Not a zlib stream (an image, or a different filter). Skip it.\n }\n }\n\n return inflated ? pageCountIn(inflated) : null;\n}\n\n// ── OOXML (docx / pptx / xlsx) ───────────────────────────────\n\nasync function inspectOoxml(file: Blob, extension: string): Promise<FileFacts> {\n const magic = await bytesOf(file.slice(0, 8));\n\n // A password-protected Office file is not a zip at all: Office encrypts the\n // package and wraps it in an OLE compound file. The magic bytes say so\n // outright, which makes this the one exact check in this module.\n if (isCompoundFile(magic)) return { pages: null, encrypted: true };\n if (magic[0] !== 0x50 || magic[1] !== 0x4b) return UNKNOWN;\n\n const app = await readZipEntry(file, \"docProps/app.xml\");\n if (!app) return { pages: null, encrypted: false };\n\n // Word records Pages, PowerPoint records Slides. Excel records neither.\n const tag = extension === \"pptx\" ? \"Slides\" : \"Pages\";\n const match = new TextDecoder().decode(app).match(new RegExp(`<${tag}>(\\\\d+)</${tag}>`));\n return { pages: match ? Number(match[1]) : null, encrypted: false };\n}\n\nfunction isCompoundFile(magic: Uint8Array): boolean {\n const SIGNATURE = [0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1];\n return SIGNATURE.every((byte, i) => magic[i] === byte);\n}\n\n/**\n * Pulls one entry out of a zip by walking the central directory. Enough of\n * the format to find a small known file, and no more: zip64 archives return\n * null, which reads as \"unknown\" upstream.\n */\nasync function readZipEntry(file: Blob, wanted: string): Promise<Uint8Array | null> {\n const tailSize = Math.min(file.size, 66_000);\n const tail = new DataView(await file.slice(file.size - tailSize).arrayBuffer());\n\n let eocd = -1;\n for (let i = tail.byteLength - 22; i >= 0; i--) {\n if (tail.getUint32(i, true) === 0x06054b50) {\n eocd = i;\n break;\n }\n }\n if (eocd < 0) return null;\n\n const size = tail.getUint32(eocd + 12, true);\n const offset = tail.getUint32(eocd + 16, true);\n if (!size || offset === 0xffffffff) return null;\n\n const cd = new DataView(await file.slice(offset, offset + size).arrayBuffer());\n const decoder = new TextDecoder();\n let p = 0;\n\n while (p + 46 <= cd.byteLength && cd.getUint32(p, true) === 0x02014b50) {\n const method = cd.getUint16(p + 10, true);\n const compressed = cd.getUint32(p + 20, true);\n const nameLength = cd.getUint16(p + 28, true);\n const extraLength = cd.getUint16(p + 30, true);\n const commentLength = cd.getUint16(p + 32, true);\n const localOffset = cd.getUint32(p + 42, true);\n const name = decoder.decode(new Uint8Array(cd.buffer, cd.byteOffset + p + 46, nameLength));\n\n if (name === wanted) {\n // The central directory's name/extra lengths may differ from the local\n // header's, so the data offset has to come from the local header.\n const local = new DataView(await file.slice(localOffset, localOffset + 30).arrayBuffer());\n const start = localOffset + 30 + local.getUint16(26, true) + local.getUint16(28, true);\n const data = await bytesOf(file.slice(start, start + compressed));\n if (method === 0) return data;\n if (method === 8 && typeof DecompressionStream !== \"undefined\") {\n return await inflate(data, \"deflate-raw\");\n }\n return null;\n }\n\n p += 46 + nameLength + extraLength + commentLength;\n }\n return null;\n}\n\n// ── plumbing ─────────────────────────────────────────────────\n\nasync function bytesOf(blob: Blob): Promise<Uint8Array> {\n return new Uint8Array(await blob.arrayBuffer());\n}\n\nasync function inflate(data: Uint8Array, format: \"deflate\" | \"deflate-raw\"): Promise<Uint8Array> {\n const stream = new Blob([data as BlobPart]).stream().pipeThrough(new DecompressionStream(format));\n return new Uint8Array(await new Response(stream).arrayBuffer());\n}\n\n/** Bytes as one char each, so PDF structure can be matched with a regex. */\nfunction latin1(bytes: Uint8Array): string {\n let out = \"\";\n const CHUNK = 32_768;\n for (let i = 0; i < bytes.length; i += CHUNK) {\n out += String.fromCharCode(...bytes.subarray(i, i + CHUNK));\n }\n return out;\n}\n","import { LitElement, css, html, nothing } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { getDefaultClient } from \"@singlebase/core\";\nimport type {\n FileUploadInput,\n FilesUploadApi,\n SinglebaseClientInstance,\n UploadProgress\n} from \"@singlebase/singlebase-sdk\";\n\n/** What the uploader needs from a client: `files.upload`, and nothing else. */\nexport type UploaderClient = { files: Pick<FilesUploadApi, \"upload\"> };\nimport { tokenDefaults } from \"../styles/tokens.js\";\nimport { sharedStyles } from \"../styles/shared.js\";\nimport { brandingStyles } from \"../styles/branding.js\";\nimport { renderBranding } from \"../utils/branding.js\";\nimport { fill, resolveUploadMessages, type SinglebaseUploadMessages } from \"../upload-messages.js\";\nimport { resolveRedirectTarget } from \"../utils/redirect.js\";\nimport {\n acceptSummary,\n acceptsFile,\n extensionOf,\n fileExtension,\n fileKey,\n formatSize,\n parseSize,\n renameKeepingExtension\n} from \"../utils/files.js\";\nimport { inspectFile, isInspectable } from \"../utils/inspect.js\";\n\n/** JSON in markup, an object in JavaScript. Bad JSON is ignored, not thrown. */\nconst jsonAttr = {\n fromAttribute: (value: string | null) => {\n if (!value) return {};\n try {\n const parsed = JSON.parse(value);\n return parsed && typeof parsed === \"object\" ? parsed : {};\n } catch {\n console.warn(\"[singlebase-uploader] an attribute holds invalid JSON; ignoring it\");\n return {};\n }\n },\n toAttribute: (value: unknown) => JSON.stringify(value ?? {})\n};\n\n/** Present-but-empty means true, so `dropzone` and `dropzone=\"false\"` both read. */\nconst flagAttr = {\n fromAttribute: (value: string | null) => (value === null ? true : value !== \"false\"),\n toAttribute: (value: boolean) => (value ? null : \"false\")\n};\n\nexport type UploadView = \"full\" | \"compact\" | \"button\";\nexport type UploadItemStatus = \"checking\" | \"ready\" | \"uploading\" | \"done\" | \"error\";\n\n/**\n * Per-format limits, keyed by extension: `{ pdf: { maxPages: 10 } }`.\n *\n * `maxPages` and `allowProtected` need the file's bytes read, which only\n * works for `pdf`, `docx`, `pptx` and `xlsx`; the size bounds apply to any\n * extension and override the element-wide ones for that kind.\n */\nexport interface FileRule {\n maxPages?: number;\n maxSize?: string | number;\n minSize?: string | number;\n /** Set false to refuse password-protected files. Default: allowed. */\n allowProtected?: boolean;\n}\n\nexport type FileRules = Record<string, FileRule>;\n\nexport interface UploadItem {\n /** Identity for de-duplication: name, size and mtime. */\n key: string;\n file: File;\n /** The saved name, which the user may have edited. */\n name: string;\n status: UploadItemStatus;\n percent: number;\n error: string;\n /** The stored file record, once the upload completes. */\n record: unknown;\n /** Pages (slides for pptx) when they could be read, else null. */\n pages: number | null;\n /** Whether the file is encrypted, when that could be determined. */\n encrypted: boolean | null;\n /** A local object URL for image thumbnails; \"\" for everything else. */\n preview: string;\n}\n\n/**\n * Every setting in one object, for configuring an element from script. Keys\n * are the element's property names.\n */\nexport interface UploaderConfig {\n view: UploadView;\n dropzone: boolean;\n allowRename: boolean;\n autoUpload: boolean;\n branding: boolean;\n logoUrl: string;\n logoText: string;\n heading: string;\n description: string;\n maxFiles: number;\n maxSize: string | number;\n minSize: string | number;\n accept: string;\n rules: FileRules;\n bucket: string;\n publicRead: boolean;\n redirectUrl: string;\n metadata: Record<string, unknown>;\n options: Record<string, unknown>;\n messages: Partial<SinglebaseUploadMessages>;\n theme: \"light\" | \"dark\";\n density: \"comfortable\" | \"compact\";\n radius: \"sharp\" | \"default\" | \"round\";\n onComplete: SinglebaseUploader[\"onComplete\"];\n onError: SinglebaseUploader[\"onError\"];\n}\n\nconst CONFIG_KEYS: readonly (keyof UploaderConfig)[] = [\n \"view\",\n \"dropzone\",\n \"allowRename\",\n \"autoUpload\",\n \"branding\",\n \"logoUrl\",\n \"logoText\",\n \"heading\",\n \"description\",\n \"maxFiles\",\n \"maxSize\",\n \"minSize\",\n \"accept\",\n \"rules\",\n \"bucket\",\n \"publicRead\",\n \"redirectUrl\",\n \"metadata\",\n \"options\",\n \"messages\",\n \"theme\",\n \"density\",\n \"radius\",\n \"onComplete\",\n \"onError\"\n];\n\n/**\n * A file picker that uploads straight to storage.\n *\n * <singlebase-uploader></singlebase-uploader>\n * <singlebase-uploader view=\"compact\" accept=\".pdf,image/*\"></singlebase-uploader>\n * <singlebase-uploader view=\"button\" max-files=\"1\"></singlebase-uploader>\n *\n * It owns the staging list — picking, renaming, removing, validating, and the\n * progress of each file — and nothing else. When the batch finishes it emits\n * the stored records and stops; what the application does with them (attach\n * them to a record, show a gallery, save an avatar) is the application's\n * decision, not the widget's.\n *\n * Failures are per file. One rejected upload leaves the rest completed and\n * offers that row a retry, mirroring the SDK's own behaviour.\n */\n@customElement(\"singlebase-uploader\")\nexport class SinglebaseUploader extends LitElement {\n static styles = [\n tokenDefaults,\n sharedStyles,\n brandingStyles,\n css`\n .card {\n display: flex;\n flex-direction: column;\n gap: 14px;\n box-sizing: border-box;\n padding: var(--sb-pad, 20px);\n background: var(--sb-surface, #ffffff);\n color: var(--sb-ink, #16181a);\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: calc((var(--sb-radius, 4px) + 4px) * var(--sb-radius-scale, 1));\n }\n\n .logo-img {\n display: block;\n align-self: flex-start;\n height: var(--sb-logo-height, 20px);\n width: auto;\n max-width: 100%;\n }\n\n .brand-mark {\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 13px;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--sb-ink, #16181a);\n }\n\n .head-block {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .count {\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 11.5px;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--sb-muted-ink, #61666c);\n }\n\n /* ── dropzone ─────────────────────────────────────── */\n .drop {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 30px 20px;\n text-align: center;\n border: 1px dashed var(--sb-border-strong, #cdd1d6);\n border-radius: calc((var(--sb-radius, 4px) + 2px) * var(--sb-radius-scale, 1));\n background: var(--sb-surface, #ffffff);\n transition:\n border-color 0.15s,\n background 0.15s;\n }\n\n .drop[data-drag=\"true\"] {\n border-color: var(--sb-accent, #111111);\n background: var(--sb-surface-alt, #fafafa);\n }\n\n .arrow {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 42px;\n height: 42px;\n margin-bottom: 4px;\n font-size: 18px;\n line-height: 1;\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: 50%;\n color: var(--sb-ink, #16181a);\n }\n\n .drop-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--sb-ink, #16181a);\n }\n\n /* the compact single-line dropzone */\n .strip {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 10px 12px;\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: calc((var(--sb-radius, 4px) + 2px) * var(--sb-radius-scale, 1));\n background: var(--sb-surface-alt, #fafafa);\n transition:\n border-color 0.15s,\n background 0.15s;\n }\n\n .strip[data-drag=\"true\"] {\n border-color: var(--sb-accent, #111111);\n }\n\n .strip-label {\n font-size: 14px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n /* ── file rows ────────────────────────────────────── */\n .rows {\n display: flex;\n flex-direction: column;\n }\n\n .row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 0;\n border-top: 1px solid var(--sb-border, #e4e6e9);\n }\n\n .rows .row:first-child {\n border-top: none;\n }\n\n .chip {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 46px;\n height: 46px;\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 10.5px;\n letter-spacing: 0.04em;\n color: var(--sb-muted-ink, #61666c);\n background: var(--sb-surface-alt, #fafafa);\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n overflow: hidden;\n }\n\n .thumb {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .meta {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .name {\n font-size: 14px;\n font-weight: 500;\n color: var(--sb-ink, #16181a);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n button.name {\n align-self: flex-start;\n max-width: 100%;\n padding: 0;\n border: none;\n background: none;\n text-align: left;\n border-radius: 0;\n }\n\n button.name:hover {\n text-decoration: underline;\n text-underline-offset: 3px;\n }\n\n .name-input {\n font-size: 14px;\n padding: 6px 8px;\n }\n\n .sz {\n font-size: 12px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .sz[data-state=\"error\"] {\n color: var(--sb-danger, #b4231a);\n }\n\n .sz[data-state=\"done\"] {\n color: var(--sb-ok, #0f6b4a);\n }\n\n .bar {\n height: 3px;\n margin-top: 2px;\n border-radius: 999px;\n background: var(--sb-border, #e4e6e9);\n overflow: hidden;\n }\n\n .bar-fill {\n height: 100%;\n background: var(--sb-accent, #111111);\n transition: width 0.2s linear;\n }\n\n .row-act {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n /* ── the dashed \"add more\" affordance ─────────────── */\n button.add-more {\n width: 100%;\n padding: 14px;\n color: var(--sb-ink, #16181a);\n background: none;\n border: 1px dashed var(--sb-border-strong, #cdd1d6);\n border-radius: calc((var(--sb-radius, 4px) + 2px) * var(--sb-radius-scale, 1));\n }\n\n button.add-more:hover:not(:disabled) {\n background: var(--sb-surface-alt, #fafafa);\n }\n\n button.wide {\n width: 100%;\n padding: 13px;\n font-size: 14px;\n }\n\n /* the button view is just a control, not a card */\n :host([view=\"button\"]) {\n display: inline-block;\n }\n\n .button-view {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n `\n ];\n\n // ── wiring ────────────────────────────────────────────────\n /** An explicit client. Omit it and the page's SinglebaseClient() is used. */\n @property({ attribute: false })\n accessor client: UploaderClient | null = null;\n\n @property({ attribute: false })\n accessor messages: Partial<SinglebaseUploadMessages> = {};\n\n @property({ reflect: true })\n accessor theme: \"light\" | \"dark\" | undefined = undefined;\n\n @property({ reflect: true })\n accessor density: \"comfortable\" | \"compact\" | undefined = undefined;\n\n /** Corner preset for this element: `sharp`, `default` or `round`. */\n @property({ reflect: true })\n accessor radius: \"sharp\" | \"default\" | \"round\" | undefined = undefined;\n\n // ── shape ─────────────────────────────────────────────────\n /**\n * `full` is the card with a dropzone and a reviewable list, `compact` the\n * one-line attachments row, `button` a single control that uploads as soon\n * as a file is chosen.\n */\n @property({ reflect: true })\n accessor view: UploadView = \"full\";\n\n /** Show the drop target. Off leaves the picker button on its own. */\n @property({ converter: flagAttr })\n accessor dropzone = true;\n\n /** Let the user edit the saved filename before uploading. */\n @property({ converter: flagAttr, attribute: \"allow-rename\" })\n accessor allowRename = true;\n\n /** Upload as soon as files are picked, with no review step. */\n @property({ type: Boolean, attribute: \"auto-upload\" })\n accessor autoUpload = false;\n\n /** The \"Files by Singlebase\" credit. A plain link — it makes no request. */\n @property({ converter: flagAttr })\n accessor branding = true;\n\n @property({ attribute: \"logo-url\" }) accessor logoUrl = \"\";\n @property({ attribute: \"logo-text\" }) accessor logoText = \"\";\n @property() accessor heading = \"\";\n @property() accessor description = \"\";\n\n // ── limits ────────────────────────────────────────────────\n @property({ type: Number, attribute: \"max-files\" }) accessor maxFiles = 10;\n\n /** Bytes, or a human size like \"25MB\". 0 or \"\" means no limit. */\n @property({ attribute: \"max-size\" }) accessor maxSize: string | number = \"25MB\";\n @property({ attribute: \"min-size\" }) accessor minSize: string | number = 0;\n\n /** Same vocabulary as `<input type=\"file\" accept>`. */\n @property() accessor accept = \"\";\n\n /**\n * Per-format limits, as JSON in markup or an object in JavaScript:\n *\n * rules='{\"pdf\":{\"maxPages\":10,\"allowProtected\":false}}'\n *\n * Checking pages and encryption means reading the file in the browser, so\n * it is a convenience for the person picking files — never a substitute\n * for the server enforcing the same limits.\n */\n @property({ converter: jsonAttr })\n accessor rules: FileRules = {};\n\n // ── destination ───────────────────────────────────────────\n @property() accessor bucket = \"default\";\n\n /** Metadata attached to every file this element uploads. */\n @property({ converter: jsonAttr })\n accessor metadata: Record<string, unknown> = {};\n\n /**\n * `options` sent with every file's upload request — for instance\n * `{ profile_photo: true }`, which makes the upload the account's photo.\n */\n @property({ converter: jsonAttr })\n accessor options: Record<string, unknown> = {};\n @property({ type: Boolean, attribute: \"public-read\" }) accessor publicRead = false;\n\n /** Where to go once every file has uploaded. Same-origin only. */\n @property({ attribute: \"redirect-url\" }) accessor redirectUrl = \"\";\n\n /** Callback forms of the two events, for frameworks that prefer props. */\n @property({ attribute: false })\n accessor onComplete:\n ((detail: { completed: UploadItem[]; failed: UploadItem[] }) => void) | null = null;\n\n @property({ attribute: false })\n accessor onError: ((detail: { message: string }) => void) | null = null;\n\n // ── state ─────────────────────────────────────────────────\n @state() private accessor items: UploadItem[] = [];\n @state() private accessor notice = \"\";\n @state() private accessor busy = false;\n @state() private accessor dragging = false;\n @state() private accessor editing = \"\";\n\n get msg(): SinglebaseUploadMessages {\n return resolveUploadMessages(this.messages);\n }\n\n /** An explicit `.client`, else the page default. */\n get resolvedClient(): UploaderClient | null {\n return this.client ?? getDefaultClient<SinglebaseClientInstance>() ?? null;\n }\n\n /** The staging list, for host code that wants to inspect or persist it. */\n get files(): readonly UploadItem[] {\n return this.items;\n }\n\n /** Overall progress across the current batch, 0–100. */\n get percent(): number {\n const active = this.items.filter((item) => item.status !== \"ready\");\n if (!active.length) return 0;\n return Math.round(active.reduce((sum, item) => sum + item.percent, 0) / active.length);\n }\n\n // ── public API ────────────────────────────────────────────\n /** Opens the file picker. */\n open(): void {\n this.renderRoot.querySelector<HTMLInputElement>(\"input[type=file]\")?.click();\n }\n\n /**\n * Applies several settings at once:\n *\n * document.getElementById(\"docs\").config = { maxFiles: 5, metadata: { folder: \"q3\" } };\n *\n * Unknown keys are ignored. Reading it returns the current settings.\n */\n set config(value: Partial<UploaderConfig>) {\n const target = this as unknown as Record<string, unknown>;\n for (const key of CONFIG_KEYS) {\n if (value && key in value) target[key] = value[key];\n }\n }\n\n /**\n * Changes settings on the fly. Only the keys you pass change; staged files\n * stay. Returns the element, so calls chain.\n */\n configure(options: Partial<UploaderConfig>): this {\n this.config = options;\n return this;\n }\n\n get config(): Partial<UploaderConfig> {\n const source = this as unknown as Record<string, unknown>;\n return Object.fromEntries(CONFIG_KEYS.map((key) => [key, source[key]]));\n }\n\n /** Drops every staged file and any notice. */\n clear(): void {\n this.items.forEach(releasePreview);\n this.items = [];\n this.notice = \"\";\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.items.forEach(releasePreview);\n }\n\n /** Uploads everything staged. Rows that already succeeded are left alone. */\n async upload(): Promise<void> {\n if (this.busy) return;\n const pending = this.items.filter((item) => item.status === \"ready\" || item.status === \"error\");\n if (!pending.length) return;\n\n const client = this.resolvedClient;\n if (!client) {\n this.fail(this.msg.errNoClient);\n return;\n }\n\n this.busy = true;\n this.notice = \"\";\n for (const item of pending) {\n item.status = \"uploading\";\n item.percent = 0;\n item.error = \"\";\n }\n this.items = [...this.items];\n\n // The SDK hands each progress and result entry back the very input object\n // it was given, so identity is all that is needed to find the row again.\n const rowOf = new Map<FileUploadInput, UploadItem>();\n const inputs = pending.map((item) => {\n const input: FileUploadInput = { file: item.file, filename: item.file.name };\n if (this.bucket) input.bucket = this.bucket;\n if (this.publicRead) input.publicRead = true;\n if (item.name !== item.file.name) input.newName = item.name;\n if (Object.keys(this.metadata ?? {}).length) input.metadata = { ...this.metadata };\n if (Object.keys(this.options ?? {}).length) input.options = { ...this.options };\n rowOf.set(input, item);\n return input;\n });\n\n try {\n const result = await client.files.upload(inputs, {\n onProgress: (progress: UploadProgress) => {\n const row = rowOf.get(progress.input);\n if (!row) return;\n row.percent = progress.percent;\n this.items = [...this.items];\n this.emit(\"singlebase-upload-progress\", { file: row, percent: this.percent });\n }\n });\n\n for (const entry of result.completed) {\n const row = rowOf.get(entry.input);\n if (!row) continue;\n row.status = \"done\";\n row.percent = 100;\n row.record = entry.file;\n }\n for (const entry of result.failed) {\n const row = rowOf.get(entry.input);\n if (!row) continue;\n row.status = \"error\";\n row.error = entry.error.message || entry.error.code;\n }\n this.items = [...this.items];\n\n const completed = result.completed\n .map((entry) => rowOf.get(entry.input))\n .filter(Boolean) as UploadItem[];\n const failed = result.failed\n .map((entry) => rowOf.get(entry.input))\n .filter(Boolean) as UploadItem[];\n\n this.emit(\"singlebase-upload-complete\", { completed, failed });\n this.onComplete?.({ completed, failed });\n\n if (failed.length) {\n this.notice = this.msg.errUpload;\n } else {\n this.redirect();\n }\n } catch (error) {\n // Initiation failed for the whole batch — nothing reached storage.\n for (const item of pending) {\n item.status = \"error\";\n item.error = \"\";\n }\n this.items = [...this.items];\n this.fail(errorMessage(error) || this.msg.errUpload);\n } finally {\n this.busy = false;\n }\n }\n\n // ── staging ───────────────────────────────────────────────\n /** The rule for this filename's extension, if the host set one. */\n private ruleFor(filename: string): FileRule | null {\n const extension = fileExtension(filename);\n if (!extension) return null;\n for (const [key, rule] of Object.entries(this.rules ?? {})) {\n if (key.toLowerCase().replace(/^\\./, \"\") === extension) return rule;\n }\n return null;\n }\n\n private async add(list: ArrayLike<File>): Promise<void> {\n // The button view is a one-shot control: a new pick replaces whatever\n // finished last time, so a max-files=\"1\" button can be used again.\n if (this.view === \"button\") {\n const finished = this.items.filter((i) => i.status === \"done\" || i.status === \"error\");\n finished.forEach(releasePreview);\n this.items = this.items.filter((i) => !finished.includes(i));\n }\n const limit = this.maxFiles > 0 ? this.maxFiles : Number.POSITIVE_INFINITY;\n const next = [...this.items];\n const before = next.length;\n const staged: UploadItem[] = [];\n let problem = \"\";\n\n for (const file of Array.from(list)) {\n if (next.length >= limit) {\n problem = fill(this.msg.errTooMany, { max: limit });\n break;\n }\n if (this.accept && !acceptsFile(this.accept, file.name, file.type)) {\n problem = fill(this.msg.errType, { name: file.name });\n continue;\n }\n\n // A rule's own size bounds win over the element-wide ones for its kind.\n const rule = this.ruleFor(file.name);\n const maxBytes = parseSize(rule?.maxSize ?? this.maxSize);\n const minBytes = parseSize(rule?.minSize ?? this.minSize);\n if (maxBytes && file.size > maxBytes) {\n problem = fill(this.msg.errTooLarge, { name: file.name, size: formatSize(maxBytes) });\n continue;\n }\n if (minBytes && file.size < minBytes) {\n problem = fill(this.msg.errTooSmall, { name: file.name, size: formatSize(minBytes) });\n continue;\n }\n const key = fileKey(file);\n if (next.some((item) => item.key === key)) {\n problem = fill(this.msg.errDuplicate, { name: file.name });\n continue;\n }\n\n const item: UploadItem = {\n key,\n file,\n name: file.name,\n // Reading bytes takes a moment, so the row appears immediately as\n // \"checking\" rather than the widget freezing on a picked file.\n status: this.needsInspection(rule, file.name) ? \"checking\" : \"ready\",\n percent: 0,\n error: \"\",\n record: null,\n pages: null,\n encrypted: null,\n preview: previewFor(file)\n };\n next.push(item);\n staged.push(item);\n }\n\n this.notice = problem;\n if (problem) this.emit(\"singlebase-upload-rejected\", { message: problem });\n if (next.length === before) return;\n\n this.items = next;\n this.emit(\"singlebase-upload-selected\", { files: this.items });\n\n await Promise.all(\n staged\n .filter((item) => item.status === \"checking\")\n .map((item) => this.inspect(item, this.ruleFor(item.file.name)!))\n );\n\n if (this.autoUpload || this.view === \"button\") void this.upload();\n }\n\n private needsInspection(rule: FileRule | null, filename: string): boolean {\n if (!rule) return false;\n if (!isInspectable(fileExtension(filename))) return false;\n return rule.maxPages !== undefined || rule.allowProtected === false;\n }\n\n /**\n * Reads the file and applies the rule. A fact the reader could not\n * determine is not grounds for rejection — an unreadable page count means\n * the page rule simply doesn't apply to that file.\n */\n private async inspect(item: UploadItem, rule: FileRule): Promise<void> {\n const facts = await inspectFile(item.file, fileExtension(item.file.name));\n item.pages = facts.pages;\n item.encrypted = facts.encrypted;\n\n let problem = \"\";\n if (rule.allowProtected === false && facts.encrypted === true) {\n problem = fill(this.msg.errProtected, { name: item.name });\n } else if (rule.maxPages && facts.pages !== null && facts.pages > rule.maxPages) {\n problem = fill(this.msg.errTooManyPages, {\n name: item.name,\n pages: facts.pages,\n max: rule.maxPages\n });\n }\n\n if (problem) {\n releasePreview(item);\n this.items = this.items.filter((staged) => staged !== item);\n this.notice = problem;\n this.emit(\"singlebase-upload-rejected\", { message: problem });\n } else {\n item.status = \"ready\";\n this.items = [...this.items];\n }\n }\n\n /** Drops one staged file. Named for the row action, not Element.remove(). */\n private removeItem(key: string): void {\n this.items.filter((item) => item.key === key).forEach(releasePreview);\n this.items = this.items.filter((item) => item.key !== key);\n this.notice = \"\";\n }\n\n private commitRename(item: UploadItem, typed: string): void {\n item.name = renameKeepingExtension(item.file.name, typed);\n this.editing = \"\";\n this.items = [...this.items];\n }\n\n private fail(message: string): void {\n this.notice = message;\n this.emit(\"singlebase-upload-error\", { message });\n this.onError?.({ message });\n }\n\n private emit(name: string, detail: unknown): void {\n this.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true }));\n }\n\n private redirect(): void {\n if (!this.redirectUrl || typeof location === \"undefined\") return;\n const target = resolveRedirectTarget(this.redirectUrl, location.href, (reason) =>\n console.warn(`[singlebase-uploader] ${reason}`)\n );\n if (target) location.assign(target);\n }\n\n // ── events ────────────────────────────────────────────────\n private onPick(event: Event): void {\n const input = event.target as HTMLInputElement;\n if (input.files?.length) this.add(input.files);\n // Reset, or picking the same file twice in a row fires no change event.\n input.value = \"\";\n }\n\n private onDrop(event: DragEvent): void {\n event.preventDefault();\n this.dragging = false;\n const dropped = event.dataTransfer?.files;\n if (dropped?.length) this.add(dropped);\n }\n\n private onDragOver(event: DragEvent): void {\n event.preventDefault();\n this.dragging = true;\n }\n\n private onDragLeave(): void {\n this.dragging = false;\n }\n\n // ── rendering ─────────────────────────────────────────────\n private get canAddMore(): boolean {\n return this.maxFiles <= 0 || this.items.length < this.maxFiles;\n }\n\n /** True while any staged file is still being read. */\n private get checking(): boolean {\n return this.items.some((item) => item.status === \"checking\");\n }\n\n private get pendingCount(): number {\n return this.items.filter((item) => item.status === \"ready\" || item.status === \"error\").length;\n }\n\n private get hint(): string {\n const kinds = acceptSummary(this.accept);\n const maxBytes = parseSize(this.maxSize);\n const size = maxBytes ? fill(this.msg.hintUpTo, { size: formatSize(maxBytes) }) : \"\";\n return [kinds, size].filter(Boolean).join(\" · \");\n }\n\n private renderInput() {\n return html`<input\n class=\"sr-only\"\n type=\"file\"\n ?multiple=${this.maxFiles !== 1}\n accept=${this.accept || nothing}\n @change=${this.onPick}\n />`;\n }\n\n private renderLogo() {\n if (this.logoUrl) {\n return html`<img\n class=\"logo-img\"\n src=${this.logoUrl}\n alt=${this.logoText || \"Logo\"}\n part=\"logo\"\n />`;\n }\n if (this.logoText) return html`<div class=\"brand-mark\" part=\"logo\">${this.logoText}</div>`;\n return nothing;\n }\n\n private renderBranding() {\n return renderBranding(this.branding, \"Files\");\n }\n\n private renderNotice() {\n if (!this.notice) return nothing;\n return html`<div class=\"banner\" role=\"alert\" part=\"error\">${this.notice}</div>`;\n }\n\n private renderCount() {\n if (!this.items.length) return nothing;\n const template = this.items.length === 1 ? this.msg.countOne : this.msg.countMany;\n return html`<div class=\"count\" part=\"count\">\n ${fill(template, { n: this.items.length, max: this.maxFiles })}\n </div>`;\n }\n\n private renderStatus(item: UploadItem): string {\n const size = formatSize(item.file.size);\n if (item.status === \"checking\") return `${size} · ${this.msg.checking}`;\n if (item.status === \"uploading\") return `${size} · ${this.msg.uploading}`;\n if (item.status === \"done\") return `${size} · ${this.msg.uploaded}`;\n if (item.status === \"error\") {\n return `${size} · ${item.error || this.msg.failedLabel}`;\n }\n // A page count is only shown once it has actually been read.\n const pages = item.pages ? ` · ${fill(this.msg.pagesLabel, { n: item.pages })}` : \"\";\n return size + pages;\n }\n\n private renderRow(item: UploadItem) {\n const editable = this.allowRename && item.status === \"ready\";\n const busyRow = item.status === \"uploading\" || item.status === \"done\";\n return html`<div class=\"row\" part=\"file\">\n <div class=\"chip\" part=\"file-type\">\n ${\n item.preview\n ? html`<img class=\"thumb\" src=${item.preview} alt=\"\" part=\"preview\" />`\n : extensionOf(item.name) || \"FILE\"\n }\n </div>\n <div class=\"meta\">\n ${\n this.editing === item.key\n ? html`<input\n class=\"name-input\"\n .value=${item.name}\n autofocus\n @keydown=${(event: KeyboardEvent) => {\n if (event.key === \"Enter\") {\n this.commitRename(item, (event.target as HTMLInputElement).value);\n } else if (event.key === \"Escape\") {\n this.editing = \"\";\n }\n }}\n @blur=${(event: FocusEvent) =>\n this.commitRename(item, (event.target as HTMLInputElement).value)}\n />`\n : editable\n ? html`<button\n class=\"name\"\n title=${this.msg.rename}\n @click=${() => {\n this.editing = item.key;\n }}\n >\n ${item.name}\n </button>`\n : html`<div class=\"name\">${item.name}</div>`\n }\n <div class=\"sz\" data-state=${item.status}>${this.renderStatus(item)}</div>\n ${\n item.status === \"uploading\"\n ? html`<div class=\"bar\" part=\"progress\">\n <div class=\"bar-fill\" style=\"width:${item.percent}%\"></div>\n </div>`\n : nothing\n }\n </div>\n <div class=\"row-act\">\n ${\n item.status === \"error\"\n ? html`<button class=\"link-sm\" @click=${() => void this.upload()}>\n ${this.msg.retry}\n </button>`\n : nothing\n }\n ${\n item.status === \"uploading\" || item.status === \"done\"\n ? nothing\n : html`<button class=\"link-sm\" @click=${() => this.removeItem(item.key)}>\n ${this.msg.remove}\n </button>`\n }\n </div>\n </div>`;\n }\n\n private renderRows() {\n if (!this.items.length) return nothing;\n return html`<div class=\"rows\" part=\"files\">\n ${this.items.map((item) => this.renderRow(item))}\n </div>`;\n }\n\n private renderDropzone() {\n return html`<div class=\"drop\" part=\"dropzone\" data-drag=${String(this.dragging)}>\n <div class=\"arrow\" aria-hidden=\"true\">↑</div>\n <div class=\"drop-title\">${this.msg.dropTitle}</div>\n <button class=\"link\" @click=${this.open}>${this.msg.dropSub}</button>\n ${this.hint ? html`<div class=\"hint\">${this.hint}</div>` : nothing}\n </div>`;\n }\n\n private renderUploadCta() {\n const n = this.pendingCount;\n // Kept on screen while busy: a primary button that vanishes mid-upload\n // makes the card jump just as the user is watching it.\n if (this.autoUpload || (!n && !this.busy)) return nothing;\n const template = n === 1 ? this.msg.uploadCtaOne : this.msg.uploadCtaMany;\n return html`<button\n class=\"primary wide\"\n part=\"submit\"\n ?disabled=${this.busy || this.checking}\n @click=${() => void this.upload()}\n >\n ${this.busy ? this.msg.uploading : fill(template, { n })}\n </button>`;\n }\n\n /**\n * The whole card is the drop surface. Once files are staged the big zone is\n * replaced by the \"add more\" control, and a drop should still land.\n */\n private renderFull() {\n const showDrop = this.dropzone && !this.items.length && this.canAddMore;\n return html`<div\n class=\"card\"\n part=\"card\"\n @dragover=${this.onDragOver}\n @dragleave=${this.onDragLeave}\n @drop=${this.onDrop}\n >\n ${\n this.logoUrl || this.logoText || this.heading || this.description\n ? html`<div class=\"head-block\">\n ${this.renderLogo()}\n ${this.heading ? html`<div class=\"title\">${this.heading}</div>` : nothing}\n ${this.description ? html`<div class=\"sub\">${this.description}</div>` : nothing}\n </div>`\n : nothing\n }\n ${this.renderCount()} ${this.renderNotice()} ${this.renderRows()}\n ${showDrop ? this.renderDropzone() : nothing}\n ${\n !showDrop && this.canAddMore\n ? html`<button class=\"add-more\" @click=${this.open}>${this.msg.addMore}</button>`\n : nothing\n }\n ${this.renderUploadCta()} ${this.renderBranding()}\n </div>`;\n }\n\n private renderCompact() {\n return html`<div\n class=\"card\"\n part=\"card\"\n @dragover=${this.onDragOver}\n @dragleave=${this.onDragLeave}\n @drop=${this.onDrop}\n >\n <div class=\"between\">\n <span class=\"sec-title\">${this.heading || this.msg.attachments}</span>\n <span class=\"count\">${this.items.length} / ${this.maxFiles}</span>\n </div>\n ${\n this.dropzone\n ? html`<div class=\"strip\" part=\"dropzone\" data-drag=${String(this.dragging)}>\n <span class=\"strip-label\">${this.msg.dropOrChoose}</span>\n <button class=\"secondary\" ?disabled=${!this.canAddMore} @click=${this.open}>\n ${this.msg.chooseFiles}\n </button>\n </div>`\n : html`<button class=\"secondary\" ?disabled=${!this.canAddMore} @click=${this.open}>\n ${this.msg.chooseFiles}\n </button>`\n }\n ${this.hint ? html`<div class=\"hint\">${this.hint}</div>` : nothing} ${this.renderNotice()}\n ${this.renderRows()} ${this.renderUploadCta()} ${this.renderBranding()}\n </div>`;\n }\n\n private renderButton() {\n const active = this.items[this.items.length - 1];\n return html`<div class=\"button-view\">\n <button class=\"primary\" ?disabled=${this.busy || !this.canAddMore} @click=${this.open}>\n ${this.busy ? this.msg.uploading : this.msg.chooseFile}\n </button>\n ${\n active && active.status !== \"ready\"\n ? html`<div class=\"sz\" data-state=${active.status}>${this.renderStatus(active)}</div>`\n : nothing\n }\n ${this.renderNotice()}\n </div>`;\n }\n\n override render() {\n return html`${this.renderInput()}${\n this.view === \"button\"\n ? this.renderButton()\n : this.view === \"compact\"\n ? this.renderCompact()\n : this.renderFull()\n }`;\n }\n}\n\n/**\n * A local thumbnail for images. The object URL points at the bytes already in\n * memory — nothing is uploaded to draw it — and it is revoked when the row\n * goes away so a long session doesn't leak blobs.\n */\nfunction previewFor(file: File): string {\n if (!file.type.startsWith(\"image/\") || typeof URL.createObjectURL !== \"function\") return \"\";\n return URL.createObjectURL(file);\n}\n\nfunction releasePreview(item: UploadItem): void {\n if (item.preview) URL.revokeObjectURL(item.preview);\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : \"\";\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"singlebase-uploader\": SinglebaseUploader;\n }\n}\n","import { html, nothing, type PropertyValues } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport {\n createFilesUploadApi,\n type AuthSettings,\n type OAuthProviderName,\n type UpdateAccountInput\n} from \"@singlebase/singlebase-sdk\";\nimport { SinglebaseFormBase } from \"./authui-form-base.js\";\nimport { SettingsController } from \"../controllers/settings-controller.js\";\nimport { fullNameOf, initialsOf } from \"../utils/profile.js\";\nimport { linkStorageKey, oauthProviders, type OAuthProviderOption } from \"../utils/oauth.js\";\nimport { newPasswordPlaceholder, passwordError, renderPasswordRules } from \"../utils/password.js\";\nimport \"./uploader.js\";\nimport type { SinglebaseUploader } from \"./uploader.js\";\n\n/** Two-factor setup stays hidden until the backend supports enrolment. */\nconst SHOW_TWO_FACTOR = false;\n\n/** Account deletion stays hidden until the backend supports it. */\nconst SHOW_DELETE_ACCOUNT = false;\n\n/** Sent with the photo's upload request: the server makes it the account photo. */\nconst PHOTO_OPTIONS = { profile_photo: true };\nconst PHOTO_ACCEPT = \".jpg,.jpeg,.png,.webp,image/jpeg,image/png,image/webp\";\n\ntype EditMode = \"\" | \"avatar\" | \"profile\" | \"password\" | \"email\";\n\n/**\n * The authenticated account view, laid out exactly as the design mock's\n * isAuthed branch: identity header, profile summary with grouped edit\n * cards, password section, two-factor, connected accounts and danger zone.\n *\n * Two-factor setup and account deletion have no backing operation yet, so\n * they are hidden (SHOW_TWO_FACTOR, SHOW_DELETE_ACCOUNT). Listing and\n * unlinking providers isn't supported either, and says so; connecting\n * a *new* provider is supported, so those tiles are live.\n */\n@customElement(\"singlebase-authui-account\")\nexport class SinglebaseAccountScreen extends SinglebaseFormBase {\n @property({ attribute: \"logo-text\" }) accessor logoText = \"\";\n\n /** A logo image, used instead of `logo-text` when set. */\n @property({ attribute: \"logo-url\" }) accessor logoUrl = \"\";\n @property({ attribute: false }) accessor settings: AuthSettings | null = null;\n @property({ attribute: \"nonce-storage-key\" }) accessor nonceStorageKey = \"singlebase-oauth-nonce\";\n\n @state() private accessor editMode: EditMode = \"\";\n @state() private accessor toast = \"\";\n @state() private accessor photoBusy = false;\n /** A photo URL that failed to load, so the initials show instead of a broken image. */\n @state() private accessor photoFailed = \"\";\n @state() private accessor profileSaved = \"\";\n @state() private accessor passSaved = \"\";\n @state() private accessor profileError = \"\";\n @state() private accessor newPassError = \"\";\n @state() private accessor deleteStage = 0;\n @state() private accessor confirmText = \"\";\n\n // profile draft\n @state() private accessor dFirst = \"\";\n @state() private accessor dLast = \"\";\n @state() private accessor dPhone = \"\";\n @state() private accessor dEmail = \"\";\n\n // password draft\n // email change — a two-step verified flow, never a bare field save\n @state() private accessor emailStep: \"request\" | \"confirm\" = \"request\";\n @state() private accessor dNewEmail = \"\";\n @state() private accessor emailCode = \"\";\n @state() private accessor emailError = \"\";\n @state() private accessor emailSaved = \"\";\n\n @state() private accessor newPass = \"\";\n @state() private accessor confirmPass = \"\";\n\n private settingsCtl = new SettingsController(this);\n private flashTimer?: ReturnType<typeof setTimeout>;\n private uidBase = `sb-acct-${Math.random().toString(36).slice(2, 8)}`;\n\n private uid(k: string) {\n return `${this.uidBase}-${k}`;\n }\n\n override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n this.settingsCtl.load(this.resolvedClient, this.settings);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n clearTimeout(this.flashTimer);\n }\n\n private flash(key: \"profileSaved\" | \"passSaved\" | \"emailSaved\", message: string) {\n this[key] = message;\n clearTimeout(this.flashTimer);\n this.flashTimer = setTimeout(() => {\n this[key] = \"\";\n }, 2600);\n }\n\n /** Matches the guest screens: image when given one, else the text label. */\n private renderLogo() {\n if (this.logoUrl) {\n return html`<img\n part=\"logo\"\n src=${this.logoUrl}\n alt=${this.logoText}\n style=\"display:block;align-self:flex-start;height:var(--sb-logo-height,20px);width:auto;max-width:100%\"\n />`;\n }\n return this.logoText ? html`<div class=\"logo-dot\" part=\"logo\">${this.logoText}</div>` : nothing;\n }\n\n private get user() {\n const state = this.auth.state;\n return state.status === \"authenticated\" ? state.user : null;\n }\n\n private get fullName() {\n return fullNameOf(this.user);\n }\n\n private get initials() {\n return initialsOf(this.user);\n }\n\n // ── profile photo ─────────────────────────────────────────\n private uploadClientFor: unknown = null;\n private uploadClientCache: { files: ReturnType<typeof createFilesUploadApi> } | null = null;\n\n /**\n * The upload API bound to the same dispatcher as this widget's auth client,\n * so the photo goes to the same project with the same bearer — including on\n * a page where this widget was given its own `.client`.\n */\n private get uploadClient() {\n const client = this.resolvedClient;\n if (!client) return null;\n if (this.uploadClientFor !== client) {\n this.uploadClientFor = client;\n this.uploadClientCache = { files: createFilesUploadApi(client.dispatcher) };\n }\n return this.uploadClientCache;\n }\n\n private onChoosePhoto = () => {\n this.formError = \"\";\n this.renderRoot.querySelector<SinglebaseUploader>(\"singlebase-uploader\")?.open();\n };\n\n private onPhotoSelected = () => {\n this.photoBusy = true;\n this.toast = \"\";\n };\n\n /** The server has set the photo; read the account back to get its URL. */\n private onPhotoUploaded = async (event: Event) => {\n const { completed, failed } = (event as CustomEvent).detail;\n try {\n if (completed.length) {\n await this.resolvedClient?.getAccount();\n this.photoFailed = \"\";\n this.toast = this.msg.photoUpdated;\n } else if (failed.length) {\n this.formError = failed[0].error || this.msg.genericErrorMessage;\n }\n } catch (error) {\n this.formError = this.describeError(error);\n } finally {\n this.photoBusy = false;\n }\n };\n\n private onPhotoProblem = (event: Event) => {\n this.photoBusy = false;\n this.formError = (event as CustomEvent).detail.message;\n };\n\n private startProfileEdit() {\n const u = this.user;\n if (!u) return;\n this.dFirst = u.first_name ?? \"\";\n this.dLast = u.last_name ?? \"\";\n this.dPhone = u.phone ?? \"\";\n this.dEmail = u.email;\n this.profileError = \"\";\n this.profileSaved = \"\";\n this.passSaved = \"\";\n this.toast = \"\";\n this.editMode = \"profile\";\n }\n\n private async onSaveProfile() {\n const client = this.resolvedClient;\n if (!client) return;\n const first = this.dFirst.trim();\n const last = this.dLast.trim();\n const phone = this.dPhone.trim();\n if (!first) {\n this.profileError = this.msg.firstNameRequiredError;\n return;\n }\n // Phone is optional; check it only when one is given.\n if (phone && phone.replace(/\\D/g, \"\").length < 7) {\n this.profileError = this.msg.invalidPhoneError;\n return;\n }\n\n // Send only what changed: user.update needs at least one changed field.\n const u = this.user;\n const changes: UpdateAccountInput = {};\n if (first !== (u?.first_name ?? \"\")) changes.first_name = first;\n if (last !== (u?.last_name ?? \"\")) changes.last_name = last;\n if (phone !== (u?.phone ?? \"\")) changes.phone = phone;\n if (Object.keys(changes).length === 0) {\n this.editMode = \"\";\n return;\n }\n\n await this.run(async () => {\n await client.updateAccount(changes, this.signal);\n this.editMode = \"\";\n this.flash(\"profileSaved\", this.msg.savedNote);\n });\n }\n\n private startPassEdit() {\n this.newPass = \"\";\n this.confirmPass = \"\";\n this.newPassError = \"\";\n this.passSaved = \"\";\n this.profileSaved = \"\";\n this.toast = \"\";\n this.editMode = \"password\";\n }\n\n private async onChangePass() {\n const client = this.resolvedClient;\n if (!client) return;\n // The signed-in session authorizes the change (auth.change_password takes\n // only the new password), so accounts created with OAuth can set one too.\n const settings = this.settings ?? this.settingsCtl.settings;\n const problem = passwordError(this.newPass, settings?.auth_settings.password_policy, this.msg);\n if (problem) {\n this.newPassError = problem;\n return;\n }\n if (this.newPass !== this.confirmPass) {\n this.newPassError = this.msg.passwordMatchError;\n return;\n }\n await this.run(async () => {\n await client.changePassword({ password: this.newPass }, this.signal);\n this.editMode = \"\";\n this.newPass = \"\";\n this.confirmPass = \"\";\n this.flash(\"passSaved\", this.msg.passwordUpdatedNote);\n });\n }\n\n // ── email change ─────────────────────────────────────────\n private startEmailEdit() {\n this.emailStep = \"request\";\n this.dNewEmail = \"\";\n this.emailCode = \"\";\n this.emailError = \"\";\n this.emailSaved = \"\";\n this.toast = \"\";\n this.editMode = \"email\";\n }\n\n /**\n * Step one: ask for a code. The code goes to the address on file, not to\n * the new one — that is what proves the person asking already controls the\n * account rather than merely knowing an address.\n */\n private async onRequestEmailCode() {\n const client = this.resolvedClient;\n if (!client || !this.user) return;\n if (!this.dNewEmail.includes(\"@\")) {\n this.emailError = this.msg.invalidEmailError;\n return;\n }\n if (this.dNewEmail.toLowerCase() === this.user.email.toLowerCase()) {\n this.emailError = this.msg.emailUnchangedError;\n return;\n }\n await this.run(async () => {\n await client.requestCode({ email: this.user!.email, purpose: \"email_change\" }, this.signal);\n this.emailStep = \"confirm\";\n this.emailError = \"\";\n });\n }\n\n /** Step two: confirm the code together with the new address. */\n private async onConfirmEmailChange() {\n const client = this.resolvedClient;\n if (!client || !this.user) return;\n if (this.emailCode.length < 6) {\n this.emailError = this.msg.codeIncompleteError;\n return;\n }\n await this.run(async () => {\n await client.changeEmail(\n { email: this.user!.email, code: this.emailCode, new_email: this.dNewEmail },\n this.signal\n );\n this.editMode = \"\";\n this.emailCode = \"\";\n this.dNewEmail = \"\";\n this.flash(\"emailSaved\", this.msg.emailUpdatedNote);\n });\n }\n\n private renderEmailSection() {\n const reading = this.editMode !== \"email\";\n const locked = this.editMode !== \"\" && this.editMode !== \"email\";\n\n return html`\n <div class=\"rule\"></div>\n <div class=\"section\">\n <h3 class=\"sec-title\">${this.msg.changeEmailTitle}</h3>\n ${\n reading\n ? html`\n <div class=\"between\">\n <p class=\"hint\">${this.user?.email ?? \"\"}</p>\n <div class=\"btn-row-end\">\n ${\n this.emailSaved\n ? html`<span role=\"status\" class=\"saved-note\">${this.emailSaved}</span>`\n : nothing\n }\n <button\n type=\"button\"\n class=\"edit-link\"\n ?disabled=${locked}\n @click=${this.startEmailEdit}\n >\n ${this.msg.changeEmailCtaShort}\n </button>\n </div>\n </div>\n `\n : this.emailStep === \"request\"\n ? html`\n <div class=\"edit-card\">\n <div class=\"field\">\n <label for=${this.uid(\"newemail\")}>${this.msg.newEmailLabel}</label>\n <input\n id=${this.uid(\"newemail\")}\n type=\"email\"\n part=\"input\"\n .value=${this.dNewEmail}\n placeholder=${this.msg.emailPlaceholder}\n aria-invalid=${this.emailError ? \"true\" : \"false\"}\n ?disabled=${this.submitting}\n @input=${(e: Event) => {\n this.dNewEmail = (e.target as HTMLInputElement).value;\n this.emailError = \"\";\n }}\n />\n <p class=\"hint\">${this.msg.changeEmailHint}</p>\n </div>\n ${this.emailError ? html`<p class=\"err\">${this.emailError}</p>` : nothing}\n <div class=\"edit-actions\">\n <button\n type=\"button\"\n class=\"primary-sm\"\n ?disabled=${this.submitting}\n @click=${this.onRequestEmailCode}\n >\n ${this.submitting ? html`<span class=\"spinner\"></span>` : nothing}\n <span>${this.msg.changeEmailCta}</span>\n </button>\n <button\n type=\"button\"\n class=\"ghost-sm\"\n @click=${() => {\n this.editMode = \"\";\n this.emailError = \"\";\n }}\n >\n ${this.msg.cancelCta}\n </button>\n </div>\n </div>\n `\n : html`\n <div class=\"edit-card\">\n <p class=\"hint\">${this.msg.codeSentNeutral}</p>\n <div class=\"field\">\n <label for=${this.uid(\"emailcode\")}>${this.msg.codeLabel}</label>\n <input\n id=${this.uid(\"emailcode\")}\n type=\"text\"\n inputmode=\"numeric\"\n autocomplete=\"one-time-code\"\n part=\"input\"\n .value=${this.emailCode}\n placeholder=\"000000\"\n aria-invalid=${this.emailError ? \"true\" : \"false\"}\n ?disabled=${this.submitting}\n @input=${(e: Event) => {\n this.emailCode = (e.target as HTMLInputElement).value\n .replace(/\\D/g, \"\")\n .slice(0, 6);\n this.emailError = \"\";\n }}\n />\n <p class=\"hint\">${this.msg.changeEmailConfirmHint} ${this.dNewEmail}</p>\n </div>\n ${this.emailError ? html`<p class=\"err\">${this.emailError}</p>` : nothing}\n <div class=\"edit-actions\">\n <button\n type=\"button\"\n class=\"primary-sm\"\n ?disabled=${this.submitting}\n @click=${this.onConfirmEmailChange}\n >\n ${this.submitting ? html`<span class=\"spinner\"></span>` : nothing}\n <span>${this.msg.confirmChangeCta}</span>\n </button>\n <button\n type=\"button\"\n class=\"ghost-sm\"\n @click=${() => {\n this.editMode = \"\";\n this.emailError = \"\";\n }}\n >\n ${this.msg.cancelCta}\n </button>\n </div>\n </div>\n `\n }\n </div>\n `;\n }\n\n private async onSignOut() {\n const client = this.resolvedClient;\n if (!client) return;\n await this.run(async () => {\n await client.signOut();\n });\n }\n\n private async onConnectProvider(providerId: OAuthProviderName) {\n const client = this.resolvedClient;\n const state = this.auth.state;\n if (!client || state.status !== \"authenticated\") return;\n await this.run(async () => {\n const nonce = await client.createOAuthNonce(this.signal);\n globalThis.sessionStorage?.setItem(this.nonceStorageKey, nonce);\n globalThis.sessionStorage?.setItem(linkStorageKey(this.nonceStorageKey), providerId);\n const { oauth_redirect_url } = await client.startOAuth(\n {\n provider: providerId,\n nonce,\n intent: \"link\",\n id_token: state.session.id_token,\n refresh_token: state.session.refresh_token\n },\n this.signal\n );\n globalThis.location.assign(oauth_redirect_url);\n });\n }\n\n private get availableProviders(): OAuthProviderOption[] {\n return oauthProviders(this.settings ?? this.settingsCtl.settings, \"link\");\n }\n\n // ── sections ──────────────────────────────────────────────\n private renderIdentity() {\n const u = this.user;\n const locked = this.editMode !== \"\" && this.editMode !== \"avatar\";\n const photo = u?.profile_photo && u.profile_photo !== this.photoFailed ? u.profile_photo : \"\";\n return html`\n <div class=\"acct-nav\">\n <div class=\"acct-who\">\n <div class=\"avatar-col\">\n <div class=\"avatar ${photo ? \"has-photo\" : \"\"}\" part=\"avatar\">\n ${\n photo\n ? html`<img\n src=${photo}\n alt=\"\"\n part=\"avatar-image\"\n @error=${() => (this.photoFailed = photo)}\n />`\n : this.initials\n }\n </div>\n <button\n type=\"button\"\n class=\"edit-link\"\n style=\"font-size:12px\"\n ?disabled=${this.photoBusy || locked}\n @click=${this.onChoosePhoto}\n >\n ${\n this.photoBusy\n ? this.msg.photoUploading\n : u?.profile_photo\n ? this.msg.changePhotoLink\n : this.msg.addPhotoLink\n }\n </button>\n <singlebase-uploader\n style=\"display:none\"\n view=\"button\"\n max-files=\"1\"\n branding=\"false\"\n accept=${PHOTO_ACCEPT}\n .client=${this.uploadClient}\n .options=${PHOTO_OPTIONS}\n @singlebase-upload-selected=${this.onPhotoSelected}\n @singlebase-upload-complete=${this.onPhotoUploaded}\n @singlebase-upload-error=${this.onPhotoProblem}\n @singlebase-upload-rejected=${this.onPhotoProblem}\n ></singlebase-uploader>\n </div>\n <div class=\"acct-who-text\">\n <div class=\"acct-name\">${this.fullName || \"—\"}</div>\n <div class=\"acct-email\">${u?.email ?? \"\"}</div>\n </div>\n </div>\n <button type=\"button\" class=\"link-sm\" ?disabled=${this.submitting} @click=${this.onSignOut}>\n ${this.msg.signOutCta}\n </button>\n </div>\n `;\n }\n\n private renderProfileSection() {\n const u = this.user;\n if (!u) return nothing;\n const reading = this.editMode !== \"profile\";\n const locked = this.editMode !== \"\" && this.editMode !== \"profile\";\n\n const summary: Array<[string, string]> = [\n [this.msg.firstNameLabel, u.first_name || \"—\"],\n [this.msg.lastNameLabel, u.last_name || \"—\"],\n [this.msg.phoneLabel, u.phone || \"—\"],\n [this.msg.emailLabel, u.email || \"—\"]\n ];\n\n return html`\n <div class=\"section\">\n ${\n reading\n ? html`\n <div class=\"sum-list\">\n ${summary.map(\n ([label, value]) => html`\n <div class=\"sum-row\">\n <span class=\"sum-label\">${label}</span>\n <span class=\"sum-value\">${value}</span>\n </div>\n `\n )}\n </div>\n <div class=\"btn-row-end\">\n ${\n this.profileSaved\n ? html`<span role=\"status\" class=\"saved-note\">${this.profileSaved}</span>`\n : nothing\n }\n <button\n type=\"button\"\n class=\"edit-link\"\n ?disabled=${locked}\n @click=${this.startProfileEdit}\n >\n ${this.msg.editAccountCta}\n </button>\n </div>\n `\n : html`\n <div class=\"edit-card\">\n <div class=\"two-up\">\n <div class=\"field\">\n <label for=${this.uid(\"first\")}>${this.msg.firstNameLabel}</label>\n <input\n id=${this.uid(\"first\")}\n type=\"text\"\n part=\"input\"\n .value=${this.dFirst}\n placeholder=${this.msg.firstNamePlaceholder}\n ?disabled=${this.submitting}\n @input=${(e: Event) => {\n this.dFirst = (e.target as HTMLInputElement).value;\n this.profileError = \"\";\n }}\n />\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"last\")}>${this.msg.lastNameLabel}</label>\n <input\n id=${this.uid(\"last\")}\n type=\"text\"\n part=\"input\"\n .value=${this.dLast}\n placeholder=${this.msg.lastNamePlaceholder}\n ?disabled=${this.submitting}\n @input=${(e: Event) => {\n this.dLast = (e.target as HTMLInputElement).value;\n this.profileError = \"\";\n }}\n />\n </div>\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"phone\")}>${this.msg.phoneLabel}</label>\n <input\n id=${this.uid(\"phone\")}\n type=\"tel\"\n part=\"input\"\n .value=${this.dPhone}\n placeholder=${this.msg.phonePlaceholder}\n ?disabled=${this.submitting}\n @input=${(e: Event) => {\n this.dPhone = (e.target as HTMLInputElement).value;\n this.profileError = \"\";\n }}\n />\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"email\")}>${this.msg.emailLabel}</label>\n <input\n id=${this.uid(\"email\")}\n type=\"email\"\n part=\"input\"\n .value=${this.dEmail}\n disabled\n title=${this.msg.notYetSupported}\n />\n <p class=\"hint\">${this.msg.changeEmailElsewhereHint}</p>\n </div>\n ${this.profileError ? html`<p class=\"err\">${this.profileError}</p>` : nothing}\n <div class=\"edit-actions\">\n <button\n type=\"button\"\n class=\"primary-sm\"\n ?disabled=${this.submitting}\n @click=${this.onSaveProfile}\n >\n ${this.submitting ? html`<span class=\"spinner\"></span>` : nothing}\n <span>${this.msg.saveChangesCta}</span>\n </button>\n <button\n type=\"button\"\n class=\"ghost-sm\"\n @click=${() => {\n this.editMode = \"\";\n this.profileError = \"\";\n }}\n >\n ${this.msg.cancelCta}\n </button>\n </div>\n </div>\n `\n }\n </div>\n `;\n }\n\n private renderPasswordSection() {\n const reading = this.editMode !== \"password\";\n const locked = this.editMode !== \"\" && this.editMode !== \"password\";\n return html`\n <div class=\"rule\"></div>\n <div class=\"section\">\n <h3 class=\"sec-title\">${this.msg.passwordSectionTitle}</h3>\n ${\n reading\n ? html`\n <div class=\"between\">\n <p class=\"hint\">${this.msg.passwordChangedHint}</p>\n <div class=\"btn-row-end\">\n ${\n this.passSaved\n ? html`<span role=\"status\" class=\"saved-note\">${this.passSaved}</span>`\n : nothing\n }\n <button\n type=\"button\"\n class=\"edit-link\"\n ?disabled=${locked}\n @click=${this.startPassEdit}\n >\n ${this.msg.changePasswordCta}\n </button>\n </div>\n </div>\n `\n : html`\n <div class=\"edit-card\">\n <div class=\"field\">\n <label for=${this.uid(\"newpass\")}>${this.msg.newPasswordLabel}</label>\n <input\n id=${this.uid(\"newpass\")}\n type=\"password\"\n part=\"input\"\n .value=${this.newPass}\n placeholder=${newPasswordPlaceholder(\n (this.settings ?? this.settingsCtl.settings)?.auth_settings.password_policy,\n this.msg\n )}\n aria-invalid=${this.newPassError ? \"true\" : \"false\"}\n ?disabled=${this.submitting}\n @input=${(e: Event) => {\n this.newPass = (e.target as HTMLInputElement).value;\n this.newPassError = \"\";\n }}\n />\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"confirmpass\")}\n >${this.msg.confirmNewPasswordLabel}</label\n >\n <input\n id=${this.uid(\"confirmpass\")}\n type=\"password\"\n part=\"input\"\n .value=${this.confirmPass}\n placeholder=${this.msg.confirmPasswordPlaceholder}\n aria-invalid=${this.newPassError ? \"true\" : \"false\"}\n ?disabled=${this.submitting}\n @input=${(e: Event) => {\n this.confirmPass = (e.target as HTMLInputElement).value;\n this.newPassError = \"\";\n }}\n />\n ${renderPasswordRules((this.settings ?? this.settingsCtl.settings)?.auth_settings.password_policy, this.msg)}\n ${this.newPassError ? html`<p class=\"err\">${this.newPassError}</p>` : nothing}\n </div>\n <div class=\"edit-actions\">\n <button\n type=\"button\"\n class=\"primary-sm\"\n ?disabled=${this.submitting}\n @click=${this.onChangePass}\n >\n ${this.submitting ? html`<span class=\"spinner\"></span>` : nothing}\n <span>${this.msg.updatePasswordCta}</span>\n </button>\n <button type=\"button\" class=\"ghost-sm\" @click=${() => (this.editMode = \"\")}>\n ${this.msg.cancelCta}\n </button>\n </div>\n </div>\n `\n }\n </div>\n `;\n }\n\n /** Layout preserved from the mock; no enrolment operation exists yet. */\n private renderTwoFactorSection() {\n return html`\n <div class=\"rule\"></div>\n <div class=\"section\">\n <div class=\"between\">\n <div>\n <h3 class=\"sec-title\">${this.msg.twoFaTitle}</h3>\n <p class=\"hint\">${this.msg.twoFaHintOff}</p>\n </div>\n <button\n type=\"button\"\n class=\"switch\"\n aria-pressed=\"false\"\n aria-label=${`${this.msg.twoFaTitle} (${this.msg.notYetSupported})`}\n disabled\n title=${this.msg.notYetSupported}\n >\n <span class=\"knob\"></span>\n </button>\n </div>\n <p class=\"disabled-note\">\n ${this.msg.notYetSupported} — enrolling a second factor is not part of the current API.\n </p>\n </div>\n `;\n }\n\n private renderConnectedSection() {\n const providers = this.availableProviders;\n if (providers.length === 0) return nothing;\n return html`\n <div class=\"rule\"></div>\n <div class=\"section\">\n <h3 class=\"sec-title\">${this.msg.connectedTitle}</h3>\n <p class=\"hint\">${this.msg.connectedHint}</p>\n <span class=\"sub-label\">${this.msg.addAnotherLabel}</span>\n <div class=\"tile-grid\">\n ${providers.map(\n (p) => html`\n <button\n type=\"button\"\n class=\"tile\"\n aria-label=${this.msg.connectProviderLabel.replace(\"{name}\", p.name)}\n ?disabled=${this.submitting}\n @click=${() => this.onConnectProvider(p.id)}\n >\n <span class=\"tile-mark\">${p.mark}</span>\n <span class=\"tile-name\">${p.name}</span>\n <span class=\"tile-plus\">+</span>\n </button>\n `\n )}\n </div>\n </div>\n `;\n }\n\n private renderDangerSection() {\n return html`\n <div class=\"rule\"></div>\n <div class=\"section\">\n ${\n this.deleteStage === 0\n ? html`<button\n type=\"button\"\n class=\"danger-link\"\n disabled\n title=${this.msg.notYetSupported}\n >\n ${this.msg.deleteAccountCta}\n </button>`\n : nothing\n }\n <p class=\"disabled-note\">\n ${this.msg.notYetSupported} — account deletion is not part of the current API.\n </p>\n </div>\n `;\n }\n\n protected override render() {\n if (!this.user) return html`<p class=\"disabled-note\">${this.msg.notSignedInNote}</p>`;\n\n return html`\n <div class=\"acct-root\">\n ${this.renderLogo()} ${this.renderIdentity()}\n <div class=\"acct-body\">\n ${this.toast ? html`<div class=\"notice\" role=\"status\">${this.toast}</div>` : nothing}\n ${this.formError ? html`<div class=\"banner\" role=\"alert\">${this.formError}</div>` : nothing}\n ${this.renderProfileSection()} ${this.renderEmailSection()}\n ${this.renderPasswordSection()}\n ${SHOW_TWO_FACTOR ? this.renderTwoFactorSection() : nothing}\n ${this.renderConnectedSection()}\n ${SHOW_DELETE_ACCOUNT ? this.renderDangerSection() : nothing}\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"singlebase-authui-account\": SinglebaseAccountScreen;\n }\n}\n","import { html, nothing, type PropertyValues } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport type { AuthSettings, OAuthIntent, OAuthProviderName } from \"@singlebase/singlebase-sdk\";\nimport { SinglebaseFormBase } from \"./authui-form-base.js\";\nimport { SettingsController } from \"../controllers/settings-controller.js\";\nimport {\n linkStorageKey,\n oauthProviders,\n startIntent,\n type OAuthProviderOption\n} from \"../utils/oauth.js\";\n\nexport type ButtonsType = \"signout\" | \"oauth\" | \"link\";\n\n/**\n * The widget's action buttons, selected with `type`:\n *\n * <singlebase-authui-buttons type=\"signout\"></singlebase-authui-buttons>\n * <singlebase-authui-buttons type=\"oauth\" intent=\"signup\"></singlebase-authui-buttons>\n * <singlebase-authui-buttons type=\"link\" provider=\"github\"></singlebase-authui-buttons>\n *\n * They live under one tag rather than three because they are the same thing\n * from a host's point of view — a button that performs one auth action — and\n * every custom element name is a global, unversioned claim on any page this\n * widget is dropped into.\n */\n@customElement(\"singlebase-authui-buttons\")\nexport class SinglebaseAuthButtons extends SinglebaseFormBase {\n @property() accessor type: ButtonsType = \"signout\";\n\n /** oauth: which flow the provider buttons start. */\n @property() accessor intent: OAuthIntent = \"signin\";\n\n /** link: the provider to connect to the signed-in account. */\n @property() accessor provider = \"\";\n\n /** link: label override. By default it's the project's `provider_name`. */\n @property({ attribute: \"provider-name\" }) accessor providerName = \"\";\n\n /** Inside a card that already supplies chrome, drop this element's own. */\n @property({ type: Boolean }) accessor embedded = false;\n\n @property({ attribute: false }) accessor settings: AuthSettings | null = null;\n\n @property({ attribute: \"nonce-storage-key\" })\n accessor nonceStorageKey = \"singlebase-oauth-nonce\";\n\n private settingsCtl = new SettingsController(this);\n\n override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n if (this.type !== \"signout\") this.settingsCtl.load(this.resolvedClient, this.settings);\n }\n\n private get effectiveSettings(): AuthSettings | null {\n return this.settings ?? this.settingsCtl.settings;\n }\n\n // ── oauth ────────────────────────────────────────────────\n private get providers(): OAuthProviderOption[] {\n return oauthProviders(this.effectiveSettings, this.intent);\n }\n\n /** Shared by the oauth and link flows: nonce, start, redirect. */\n private async startOAuth(providerId: OAuthProviderName, intent: OAuthIntent, linking = false) {\n const client = this.resolvedClient;\n if (!client) return;\n\n let idToken: string | undefined;\n let refreshToken: string | undefined;\n if (linking) {\n const state = this.auth.state;\n if (state.status !== \"authenticated\") {\n this.formError = this.msg.linkRequiresSignIn;\n this.phase = \"error\";\n return;\n }\n idToken = state.session.id_token;\n refreshToken = state.session.refresh_token;\n }\n\n await this.run(async () => {\n const nonce = await client.createOAuthNonce(this.signal);\n globalThis.sessionStorage?.setItem(this.nonceStorageKey, nonce);\n const linkKey = linkStorageKey(this.nonceStorageKey);\n if (linking) globalThis.sessionStorage?.setItem(linkKey, providerId);\n else globalThis.sessionStorage?.removeItem(linkKey);\n const { oauth_redirect_url } = await client.startOAuth(\n {\n provider: providerId,\n nonce,\n intent: startIntent(this.effectiveSettings, intent),\n ...(linking ? { id_token: idToken, refresh_token: refreshToken } : {})\n },\n this.signal\n );\n globalThis.location.assign(oauth_redirect_url);\n });\n }\n\n private renderOAuth() {\n const providers = this.providers;\n if (providers.length === 0) return nothing;\n const [primary, ...rest] = providers;\n\n return html`\n <div class=\"stack\">\n ${\n this.formError\n ? html`<div class=\"banner\" part=\"banner\" role=\"alert\">${this.formError}</div>`\n : nothing\n }\n\n <button\n type=\"button\"\n class=\"oauth-primary\"\n part=\"oauth-button\"\n ?disabled=${this.submitting}\n @click=${() => this.startOAuth(primary!.id, this.intent)}\n >\n <span class=\"g-mark\">${primary!.mark}</span>\n <span>${this.msg.oauthContinueWith} ${primary!.name}</span>\n </button>\n\n ${\n rest.length\n ? html`\n <div class=\"icon-row\">\n ${rest.map(\n (p) => html`\n <button\n type=\"button\"\n class=\"icon-btn\"\n part=\"oauth-button\"\n aria-label=${`${this.msg.oauthContinueWith} ${p.name}`}\n title=${`${this.msg.oauthContinueWith} ${p.name}`}\n ?disabled=${this.submitting}\n @click=${() => this.startOAuth(p.id, this.intent)}\n >\n <span class=\"tile-mark\">${p.mark}</span>\n </button>\n `\n )}\n </div>\n `\n : nothing\n }\n </div>\n `;\n }\n\n // ── link ─────────────────────────────────────────────────\n private renderLink() {\n // Once settings are known, only link a provider the project has enabled.\n const settings = this.effectiveSettings;\n const option = oauthProviders(settings, \"link\").find((p) => p.id === this.provider);\n if (settings && !option) return nothing;\n const name = this.providerName || option?.name || this.provider;\n\n return html`\n <div class=\"stack\">\n ${this.renderStatus()}\n <button\n type=\"button\"\n class=\"secondary\"\n part=\"oauth-button\"\n ?disabled=${this.submitting}\n @click=${() => this.startOAuth(this.provider as OAuthProviderName, \"link\", true)}\n >\n ${this.submitting ? html`<span class=\"spinner\"></span>` : nothing}\n <span>${this.msg.oauthContinueWith} ${name}</span>\n </button>\n </div>\n `;\n }\n\n // ── signout ──────────────────────────────────────────────\n private async onSignOut() {\n const client = this.resolvedClient;\n if (!client) return;\n await this.run(async () => {\n await client.signOut();\n });\n }\n\n private renderSignOut() {\n if (this.embedded) {\n return html`<button\n type=\"button\"\n class=\"link-sm\"\n part=\"button-signout\"\n ?disabled=${this.submitting}\n @click=${this.onSignOut}\n >\n ${this.msg.signOutCta}\n </button>`;\n }\n\n return html`\n <div class=\"stack\">\n ${this.formError ? html`<p class=\"banner\" role=\"alert\">${this.formError}</p>` : nothing}\n <button\n type=\"button\"\n class=\"link-sm\"\n part=\"button-signout\"\n ?disabled=${this.submitting}\n @click=${this.onSignOut}\n >\n ${this.msg.signOutCta}\n </button>\n </div>\n `;\n }\n\n protected override render() {\n if (this.type === \"oauth\") return this.renderOAuth();\n if (this.type === \"link\") return this.renderLink();\n return this.renderSignOut();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"singlebase-authui-buttons\": SinglebaseAuthButtons;\n }\n}\n","import { html, css, nothing, type PropertyValues } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport {\n SinglebaseAuthError,\n resolveScreen,\n type AuthClient,\n type AuthSettings\n} from \"@singlebase/singlebase-sdk\";\nimport { SinglebaseElementBase } from \"./authui-base.js\";\nimport { resolveRedirectTarget } from \"../utils/redirect.js\";\nimport { SettingsController } from \"../controllers/settings-controller.js\";\nimport { EventBridge } from \"../controllers/event-bridge.js\";\nimport { brandingStyles } from \"../styles/branding.js\";\nimport { renderBranding } from \"../utils/branding.js\";\nimport { linkStorageKey, oauthProviders, oauthReady } from \"../utils/oauth.js\";\nimport { describeAuthError } from \"../utils/auth-errors.js\";\nimport { newPasswordPlaceholder, passwordError, renderPasswordRules } from \"../utils/password.js\";\nimport \"./authui-account.js\";\nimport \"./authui-buttons.js\";\n\n/** The `error` value of a cancelled OAuth return. */\nconst OAUTH_DENIED = \"oauth_denied\";\n\n/** The parameter a failed OAuth return carries its error code in. */\nconst OAUTH_ERROR = \"oauth_error\";\n\n/** An OAuth error code: upper-case letters and underscores, nothing else. */\nconst OAUTH_ERROR_CODE = /^[A-Z][A-Z0-9_]{0,63}$/;\n\n/** Screens a signed-out visitor may reach. */\nexport type GuestScreen = \"signin\" | \"signup\" | \"forgot\" | \"verify\" | \"otp\" | \"newpass\" | \"invite\";\n\n/** Screens that require a live session. */\nexport type ProtectedScreen = \"account\";\n\n/** Every value `screen` accepts. \"oauth-callback\" is entered by URL, not by hand. */\nexport type Screen = GuestScreen | ProtectedScreen | \"oauth-callback\";\n\nconst GUEST_SCREENS: GuestScreen[] = [\n \"signin\",\n \"signup\",\n \"forgot\",\n \"verify\",\n \"otp\",\n \"newpass\",\n \"invite\"\n];\n\nconst PROTECTED_SCREENS: ProtectedScreen[] = [\"account\"];\n\nconst ALL_SCREENS: Screen[] = [...GUEST_SCREENS, ...PROTECTED_SCREENS, \"oauth-callback\"];\n\nexport function isGuestScreen(value: string): value is GuestScreen {\n return (GUEST_SCREENS as string[]).includes(value);\n}\n\nexport function isProtectedScreen(value: string): value is ProtectedScreen {\n return (PROTECTED_SCREENS as string[]).includes(value);\n}\n\nexport function isScreen(value: string): value is Screen {\n return (ALL_SCREENS as string[]).includes(value);\n}\n\n/**\n * Converter for the allow-* flags, which default to true. Lit's Boolean\n * converter can only express \"present = true\", so it cannot turn a\n * default-true flag off from markup; this one reads `allow-x=\"false\"` as\n * false and leaves the default alone when the attribute is absent.\n */\nconst flagAttr = {\n // An absent attribute must mean \"default\" (true), not false. Lit calls\n // fromAttribute(null) when an attribute is *removed*, so returning false\n // there would make removing `allow-oauth=\"false\"` leave the flag off\n // forever instead of restoring the default.\n fromAttribute: (value: string | null) => (value === null ? true : value !== \"false\"),\n toAttribute: (value: boolean) => (value ? null : \"false\")\n};\n\n/**\n * The complete auth widget: routes among signin, signup, recovery, one-time\n * code, invite and OAuth-callback views (spec: AuthScreen), and renders the\n * design's full card chrome — brand panel, logo, method accordion, step bar,\n * banner/notice, actions and footer.\n *\n * Structure and styling follow project/AuthWidget.dc.html; the individual\n * sb-* form elements remain available for hosts that want to compose their\n * own screen instead of using this one.\n */\n@customElement(\"singlebase-authui\")\nexport class SinglebaseAuthScreen extends SinglebaseElementBase {\n static override styles = [\n ...SinglebaseElementBase.styles,\n brandingStyles,\n css`\n /* the mock's root */\n :host {\n display: flex;\n width: 100%;\n box-sizing: border-box;\n background: var(--sb-surface, #ffffff);\n color: var(--sb-ink, #16181a);\n border: 1px solid var(--sb-border, #e4e6e9);\n border-radius: calc((var(--sb-radius, 4px) + 4px) * var(--sb-radius-scale, 1));\n overflow: hidden;\n }\n\n .brand-panel {\n flex: 0 0 40%;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n gap: 24px;\n padding: var(--sb-pad, 20px);\n background: var(--sb-surface-alt, #fafafa);\n border-right: 1px solid var(--sb-border, #e4e6e9);\n }\n\n /* A flex column would stretch an image to full width and wreck its\n aspect ratio, so both logos opt out of the cross-axis stretch. */\n .logo-img {\n display: block;\n align-self: flex-start;\n height: var(--sb-logo-height, 20px);\n width: auto;\n max-width: 100%;\n margin-bottom: 6px;\n }\n\n .brand-img {\n display: block;\n align-self: flex-start;\n height: var(--sb-brand-logo-height, 28px);\n width: auto;\n max-width: 100%;\n }\n\n .brand-mark {\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 13px;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--sb-ink, #16181a);\n }\n\n .brand-copy {\n font-size: 20px;\n line-height: 1.35;\n letter-spacing: -0.01em;\n color: var(--sb-ink, #16181a);\n text-wrap: pretty;\n }\n\n .brand-foot {\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 11px;\n color: var(--sb-muted-ink, #61666c);\n }\n\n .branding {\n margin-top: 18px;\n }\n\n /* the mock's panel */\n .panel {\n flex: 1;\n min-width: 0;\n padding: var(--sb-pad, 20px);\n }\n\n @media (max-width: 520px) {\n :host {\n flex-direction: column;\n }\n .brand-panel {\n flex: 0 0 auto;\n border-right: none;\n border-bottom: 1px solid var(--sb-border, #e4e6e9);\n }\n }\n `\n ];\n\n // ── configuration (mirrors the mock's props) ───────────────\n @property({ attribute: \"initial-screen\" }) accessor initialScreen: Screen = \"signin\";\n\n /**\n * Two-way screen binding for SPA routers: set it to deep-link a screen,\n * read it (or listen for `singlebase-screen-change`) to mirror the widget\n * into your URL. `goto()` is the imperative form.\n */\n @property({ reflect: true })\n accessor screen: Screen | \"\" = \"\";\n\n /**\n * By default the widget swaps to the account view once authenticated.\n * SPAs usually want to route away and unmount instead — set this and the\n * widget renders nothing when signed in, leaving navigation to the host.\n */\n @property({ type: Boolean, attribute: \"no-account-view\" })\n accessor noAccountView = false;\n @property({ attribute: false }) accessor settings: AuthSettings | null = null;\n\n @property({ converter: flagAttr, attribute: \"auth-enabled\" }) accessor authEnabled = true;\n @property({ converter: flagAttr, attribute: \"allow-email-signin\" }) accessor allowEmailSignin =\n true;\n @property({ converter: flagAttr, attribute: \"allow-email-signup\" }) accessor allowEmailSignup =\n true;\n @property({ converter: flagAttr, attribute: \"allow-email-otp\" }) accessor allowEmailOtp = true;\n @property({ converter: flagAttr, attribute: \"allow-oauth\" }) accessor allowOauth = true;\n @property({ converter: flagAttr, attribute: \"allow-account-creation\" })\n accessor allowAccountCreation = true;\n\n @property() accessor layout: \"card\" | \"split\" = \"card\";\n @property({ attribute: \"oauth-placement\" }) accessor oauthPlacement: \"top\" | \"bottom\" = \"bottom\";\n @property({ type: Boolean }) accessor stepped = false;\n\n /**\n * Branding is the host's, so these default to empty and the corresponding\n * slots simply do not render. (\"KEYRING\" and friends were the fictional\n * brand in the design mock — they must never ship as defaults.)\n */\n @property({ attribute: \"logo-text\" }) accessor logoText = \"\";\n\n /**\n * A logo image, used instead of `logo-text` when set. `logo-text` is still\n * worth supplying alongside it — it becomes the image's alt text.\n */\n @property({ attribute: \"logo-url\" }) accessor logoUrl = \"\";\n @property({ attribute: \"brand-line\" }) accessor brandLine = \"\";\n @property({ attribute: \"brand-foot\" }) accessor brandFoot = \"\";\n @property({ attribute: \"sign-in-title\" }) accessor signInTitle = \"\";\n\n /**\n * The \"Auth by Singlebase\" credit under the card. On by default; turn it\n * off with branding=\"false\", exactly like the allow-* flags.\n *\n * It is a plain link — no pixel, no beacon, no request of any kind. A\n * third-party network call originating from a sign-in form is the sort of\n * thing that fails a security review, and deservedly.\n */\n @property({ converter: flagAttr, attribute: \"branding\" }) accessor branding = true;\n\n /**\n * Where to send the user once a session exists. Same-origin only — an\n * absolute URL pointing anywhere else is refused, because a login widget\n * that forwards to an attacker-supplied host is an open redirect.\n *\n * When unset, a `?redirect=` (or `?next=`) parameter on the current URL is\n * used instead, so \"you were sent to the login page, now go back where you\n * were headed\" works without the host wiring anything.\n */\n @property({ attribute: \"redirect-url\" }) accessor redirectUrl = \"\";\n\n /** Shown as \"Terms\" in the consent line under the primary action. */\n @property({ attribute: \"tos-url\" }) accessor tosUrl = \"\";\n\n /** Shown as \"Privacy\" in the consent line under the primary action. */\n @property({ attribute: \"privacy-url\" }) accessor privacyUrl = \"\";\n\n /** Where the OAuth nonce is stashed between starting a flow and returning. */\n @property({ attribute: \"nonce-storage-key\" })\n accessor nonceStorageKey = \"singlebase-oauth-nonce\";\n @property({ attribute: \"invite-email\" }) accessor inviteEmail = \"\";\n @property({ attribute: \"invite-org\" }) accessor inviteOrg = \"\";\n /** Invite code carried by the invite link; when absent the widget asks for it. */\n @property({ attribute: \"invite-code\" }) accessor inviteCode = \"\";\n\n // ── state (mirrors the mock's state bag) ───────────────────\n @state() private accessor step = 0;\n @state() private accessor method = \"\";\n @state() private accessor email = \"\";\n @state() private accessor password = \"\";\n @state() private accessor name = \"\";\n @state() private accessor firstName = \"\";\n @state() private accessor lastName = \"\";\n @state() private accessor phone = \"\";\n @state() private accessor newPass = \"\";\n @state() private accessor confirmPass = \"\";\n @state() private accessor code: string[] = [\"\", \"\", \"\", \"\", \"\", \"\"];\n @state() private accessor verifyNext: \"newpass\" | \"signin_code\" | \"invite\" = \"signin_code\";\n @state() private accessor loading = false;\n @state() private accessor banner = \"\";\n @state() private accessor notice = \"\";\n @state() private accessor emailError = \"\";\n @state() private accessor passError = \"\";\n @state() private accessor newPassError = \"\";\n @state() private accessor needsMfaCode = false;\n\n private settingsCtl = new SettingsController(this);\n private bridge = new EventBridge(this);\n private uidBase = `sb-${Math.random().toString(36).slice(2, 8)}`;\n\n private uid(k: string) {\n return `${this.uidBase}-${k}`;\n }\n\n override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n this.settingsCtl.load(this.resolvedClient, this.settings);\n this.bridge.bind(this.resolvedClient);\n this.bindGoto(this.resolvedClient);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.gotoUnsubscribe?.();\n this.gotoUnsubscribe = undefined;\n this.gotoClient = null;\n this.abortController?.abort();\n }\n\n private gotoUnsubscribe?: () => void;\n private gotoClient: AuthClient | null = null;\n\n /**\n * Subscribes to auth.goto() so a host can drive every widget on the page\n * with one call. Bound here rather than in connectedCallback because the\n * app usually creates its SinglebaseAuth() instance *after* the widget\n * upgrades — at connect time there is often no client to subscribe to yet.\n */\n private bindGoto(client: AuthClient | null) {\n if (client === this.gotoClient) return;\n this.gotoUnsubscribe?.();\n this.gotoUnsubscribe = undefined;\n this.gotoClient = client;\n if (!client) return;\n\n const offGoto = client.on(\"goto\", ({ screen }) => {\n if (isScreen(screen)) this.goto(screen);\n });\n\n // Follow the redirect on an actual sign-in only. Doing this from the\n // authenticated *state* instead would also fire for a session restored\n // on page load, which is the case that should show the interstitial and\n // let the user choose.\n const offSignin = client.on(\"signin\", () => {\n this.followRedirect();\n });\n\n this.gotoUnsubscribe = () => {\n offGoto();\n offSignin();\n };\n }\n\n /** Shows a screen. The SPA-facing counterpart of the `screen` property. */\n goto(screen: Screen): void {\n if (this.screen === screen) return;\n this.screen = screen;\n this.step = 0;\n this.banner = \"\";\n this.notice = \"\";\n this.dispatchEvent(\n new CustomEvent(\"singlebase-screen-change\", {\n detail: { screen },\n bubbles: true,\n composed: true\n })\n );\n }\n\n // ── derived config: explicit props unless auth.settings says otherwise ──\n private get cfg() {\n const s = this.settings ?? this.settingsCtl.settings;\n if (!s) {\n return {\n authEnabled: this.authEnabled,\n allowEmailSignin: this.allowEmailSignin,\n allowEmailSignup: this.allowEmailSignup && this.allowAccountCreation,\n allowEmailOtp: this.allowEmailOtp,\n allowOauth: this.allowOauth,\n allowRecovery: this.allowEmailSignin,\n mfa: false\n };\n }\n const a = s.auth_settings;\n // Code-only signin is available only when the project does not require\n // password-plus-OTP MFA (the auth API's code sign-in).\n const mfa = a.second_factor === \"email_otp\";\n return {\n authEnabled: s.enabled && a.enabled && this.authEnabled,\n allowEmailSignin: a.allow_signin && this.allowEmailSignin,\n allowEmailSignup: a.allow_signup && this.allowEmailSignup && this.allowAccountCreation,\n allowEmailOtp: this.allowEmailOtp && a.allow_signin && !mfa,\n allowOauth: oauthReady(s) && this.allowOauth,\n // Email recovery is offered only when the project verifies it by code.\n allowRecovery:\n a.allow_signin && this.allowEmailSignin && a.password_recovery_verification === \"email_otp\",\n mfa\n };\n }\n\n /** The screen the host asked for, before any guarding is applied. */\n private get requestedScreen(): Screen {\n const raw = this.screen || this.initialScreen || \"signin\";\n return isScreen(raw) ? raw : \"signin\";\n }\n\n /**\n * Resolves the screen actually rendered.\n *\n * This is the single place navigation is decided, so a protected screen\n * cannot be reached by setting an attribute, editing the URL, or calling\n * goto() — every route runs through the same auth check. The guest\n * fallbacks below additionally reflect what the project has enabled.\n */\n private get activeScreen(): Screen {\n const authenticated = this.auth.state.status === \"authenticated\";\n\n // The callback screen stays up while the exchange runs, and after a failed\n // return for a signed-out visitor (it offers a way back). A signed-in one\n // sees the outcome on the account view instead.\n if (this.isOAuthCallback || this.callbackPhase === \"working\") return \"oauth-callback\";\n if (this.callbackPhase === \"failed\" && !authenticated) return \"oauth-callback\";\n\n const requested = this.requestedScreen;\n\n if (isProtectedScreen(requested)) {\n // Never render a protected screen without a session.\n return authenticated ? requested : \"signin\";\n }\n\n if (authenticated) {\n // With no screen asked for, a signed-in visitor belongs on their\n // account. If the host *did* ask for a guest screen, honour it — the\n // interstitial below then offers to continue or sign out, rather than\n // showing a sign-in form to someone already signed in.\n const askedForOne = this.screen !== \"\" || this.initialScreen !== \"signin\";\n return askedForOne ? requested : \"account\";\n }\n\n const c = this.cfg;\n let screen = requested as GuestScreen;\n if (screen === \"signup\" && !c.allowEmailSignup) screen = \"signin\";\n if ((screen === \"forgot\" || screen === \"newpass\") && !c.allowRecovery) screen = \"signin\";\n if (screen === \"otp\" && !c.allowEmailOtp) screen = \"signin\";\n if (screen === \"signin\" && !c.allowEmailSignin && c.allowEmailOtp) screen = \"otp\";\n return screen;\n }\n\n /** True when a signed-in user is sitting on a guest screen (spec: offer continue/sign out). */\n private get showsSignedInInterstitial(): boolean {\n return this.auth.state.status === \"authenticated\" && isGuestScreen(this.activeScreen);\n }\n\n // ── redirect ──────────────────────────────────────────────\n\n /**\n * The post-login destination, or null when there is none.\n *\n * Only same-origin targets are accepted. A login widget that forwards to\n * an attacker-chosen host is a textbook open redirect, and the `redirect`\n * parameter it reads comes straight off the URL bar, so it is untrusted\n * input by definition.\n */\n private get redirectTarget(): string | null {\n return resolveRedirectTarget(\n this.redirectUrl || this.redirectParam,\n globalThis.location?.href,\n (reason) => console.warn(`[singlebase] ${reason}`)\n );\n }\n\n private get redirectParam(): string {\n const params = new URLSearchParams(globalThis.location?.search ?? \"\");\n return params.get(\"redirect\") ?? params.get(\"next\") ?? \"\";\n }\n\n /** Navigates to the post-login destination if there is a safe one. */\n private followRedirect(): boolean {\n const target = this.redirectTarget;\n if (!target) return false;\n globalThis.location?.assign(target);\n return true;\n }\n\n /**\n * Only the OAuth return counts: `?access_code=`, `?error=oauth_denied` or\n * `?oauth_error=<CODE>`. Any other `?error=` belongs to the host page.\n */\n private get isOAuthCallback(): boolean {\n const params = new URLSearchParams(globalThis.location?.search ?? \"\");\n return (\n params.has(\"access_code\") || params.get(\"error\") === OAUTH_DENIED || params.has(OAUTH_ERROR)\n );\n }\n\n // ── OAuth callback ────────────────────────────────────────\n //\n // Handled here rather than in a separate element: it is a screen of this\n // widget like any other, and giving it its own tag meant a second element\n // with its own copy of the loading/error handling.\n\n @state() private accessor callbackDone = false;\n\n /** Where the OAuth return stands once its URL has been cleaned. */\n @state() private accessor callbackPhase: \"\" | \"working\" | \"failed\" = \"\";\n\n /** \"{name} is now connected\", after a provider link completes. */\n @state() private accessor linkNotice = \"\";\n\n /** Strips the provider's parameters so a reload cannot replay the exchange. */\n private cleanCallbackUrl(): void {\n const here = globalThis.location?.href;\n if (!here || !globalThis.history) return;\n const url = new URL(here);\n url.searchParams.delete(\"access_code\");\n url.searchParams.delete(OAUTH_ERROR);\n if (url.searchParams.get(\"error\") === OAUTH_DENIED) url.searchParams.delete(\"error\");\n globalThis.history.replaceState({}, \"\", url.toString());\n }\n\n /**\n * Completes the provider round trip. Runs once per landing: the URL is\n * cleaned immediately so a refresh cannot resend a single-use access code.\n */\n private async handleOAuthCallback(): Promise<void> {\n if (this.callbackDone) return;\n\n const params = new URLSearchParams(globalThis.location?.search ?? \"\");\n const accessCode = params.get(\"access_code\");\n const denied = params.get(\"error\") === OAUTH_DENIED;\n const failed = params.get(OAUTH_ERROR);\n const client = this.resolvedClient;\n\n // Wait for a client before using up the single-use code.\n if (accessCode && !client) return;\n this.callbackDone = true;\n\n if (denied || failed || !accessCode || !client) {\n globalThis.sessionStorage?.removeItem(this.nonceStorageKey);\n globalThis.sessionStorage?.removeItem(linkStorageKey(this.nonceStorageKey));\n this.cleanCallbackUrl();\n this.banner = denied ? this.msg.oauthDenied : this.describeOAuthError(failed ?? \"\");\n this.callbackPhase = \"failed\";\n return;\n }\n\n const nonce = globalThis.sessionStorage?.getItem(this.nonceStorageKey);\n const linkKey = linkStorageKey(this.nonceStorageKey);\n const linking = globalThis.sessionStorage?.getItem(linkKey);\n globalThis.sessionStorage?.removeItem(linkKey);\n this.cleanCallbackUrl();\n\n if (!nonce) {\n // No nonce means this response cannot be tied to a flow this browser\n // started, so it is not safe to exchange.\n this.banner = this.msg.genericErrorMessage;\n this.callbackPhase = \"failed\";\n return;\n }\n\n this.callbackPhase = \"working\";\n await this.withLoading(async () => {\n await client.completeOAuth({ access_code: accessCode, nonce }, this.signal());\n globalThis.sessionStorage?.removeItem(this.nonceStorageKey);\n if (linking) {\n // A link keeps the same session; say what changed on the account view.\n const settings = this.settings ?? this.settingsCtl.settings;\n const name =\n oauthProviders(settings, \"link\").find((p) => p.id === linking)?.name ?? linking;\n this.linkNotice = this.msg.providerConnectedNotice.replace(\"{name}\", name);\n }\n });\n this.callbackPhase = this.banner ? \"failed\" : \"\";\n }\n\n /** The small logo above a screen title: image when given one, else text. */\n private renderLogo() {\n if (this.logoUrl) {\n return html`<img class=\"logo-img\" part=\"logo\" src=${this.logoUrl} alt=${this.logoText} />`;\n }\n return this.logoText ? html`<div class=\"logo-dot\" part=\"logo\">${this.logoText}</div>` : nothing;\n }\n\n /** The larger logo in the split layout's brand panel. */\n private renderBrandMark() {\n if (this.logoUrl) {\n return html`<img class=\"brand-img\" part=\"logo\" src=${this.logoUrl} alt=${this.logoText} />`;\n }\n return this.logoText\n ? html`<div class=\"brand-mark\" part=\"logo\">${this.logoText}</div>`\n : nothing;\n }\n\n private renderBranding() {\n return renderBranding(this.branding, \"Auth\");\n }\n\n /** Every screen renders inside this, so the credit appears once and only once. */\n private panel(content: unknown) {\n return html`<div class=\"panel\">${content}${this.renderBranding()}</div>`;\n }\n\n private renderOAuthCallback() {\n return html`\n <div class=\"stack\">\n <div class=\"head\">\n ${this.renderLogo()}\n <h2 class=\"title\" part=\"title\">${this.msg.oauthCallbackTitle}</h2>\n <p class=\"sub\">${this.msg.oauthCallbackSub}</p>\n </div>\n ${\n this.banner\n ? html`<div class=\"banner\" part=\"banner\" role=\"alert\">${this.banner}</div>`\n : html`<div class=\"stack\" style=\"align-items:center;\">\n <span class=\"spinner\" part=\"spinner\"></span>\n </div>`\n }\n ${\n this.banner\n ? html`<button\n type=\"button\"\n class=\"ghost\"\n @click=${() => {\n this.callbackPhase = \"\";\n this.goto(\"signin\");\n }}\n >\n <span>${this.msg.backCta}</span>\n </button>`\n : nothing\n }\n </div>\n `;\n }\n\n private setScreen(screen: GuestScreen, patch: Record<string, unknown> = {}) {\n const changed = this.screen !== screen;\n this.screen = screen;\n this.banner = \"\";\n this.emailError = \"\";\n this.passError = \"\";\n Object.assign(this, patch);\n if (changed) {\n this.dispatchEvent(\n new CustomEvent(\"singlebase-screen-change\", {\n detail: { screen },\n bubbles: true,\n composed: true\n })\n );\n }\n }\n\n // ── submit ────────────────────────────────────────────────\n private async withLoading(task: () => Promise<void>) {\n this.loading = true;\n this.banner = \"\";\n try {\n await task();\n } catch (error) {\n this.banner = this.describeError(error);\n } finally {\n this.loading = false;\n }\n }\n\n private describeError(error: unknown): string {\n return describeAuthError(error, this.msg);\n }\n\n /**\n * The message for a code the backend sent back on the redirect. The code is\n * only ever looked up, never shown, so a crafted URL can't put text on the page.\n */\n private describeOAuthError(code: string): string {\n if (!OAUTH_ERROR_CODE.test(code)) return this.msg.genericErrorMessage;\n // On an OAuth return, \"invalid credentials\" means no account has that provider.\n if (code === \"INVALID_CREDENTIALS\") return this.msg.oauthNoAccountMessage;\n return describeAuthError(\n new SinglebaseAuthError({ type: \"AUTH_ERROR\", status: 400, message: code }),\n this.msg\n );\n }\n\n /** The requirements hint under a field that creates a password. */\n private get passwordHint() {\n const settings = this.settings ?? this.settingsCtl.settings;\n return renderPasswordRules(settings?.auth_settings.password_policy, this.msg);\n }\n\n /** The placeholder for a field that creates a password. */\n private get newPasswordHint(): string {\n const settings = this.settings ?? this.settingsCtl.settings;\n return newPasswordPlaceholder(settings?.auth_settings.password_policy, this.msg);\n }\n\n /** The project's password rules, checked wherever a password is created. */\n private checkNewPassword(password: string): string {\n const settings = this.settings ?? this.settingsCtl.settings;\n return passwordError(password, settings?.auth_settings.password_policy, this.msg);\n }\n\n private get codeValue() {\n return this.code.join(\"\");\n }\n\n private async onSubmit(e?: Event) {\n e?.preventDefault();\n const client = this.resolvedClient;\n if (!client) return;\n const screen = this.activeScreen;\n const c = this.cfg;\n\n if (screen === \"forgot\" || screen === \"otp\") {\n if (!this.email.includes(\"@\")) {\n this.emailError = this.msg.invalidEmailError;\n return;\n }\n const purpose = screen === \"forgot\" ? \"password_reset\" : \"signin\";\n await this.withLoading(async () => {\n await client.requestCode({ email: this.email, purpose }, this.signal());\n this.notice = this.msg.codeSentNeutral;\n this.screen = \"verify\";\n this.verifyNext = screen === \"forgot\" ? \"newpass\" : \"signin_code\";\n this.code = [\"\", \"\", \"\", \"\", \"\", \"\"];\n });\n return;\n }\n\n if (screen === \"verify\") {\n if (this.codeValue.length < 6) {\n this.banner = this.msg.codeIncompleteError;\n return;\n }\n if (this.verifyNext === \"newpass\") {\n // Code is confirmed together with the new password by auth.confirm_code.\n this.setScreen(\"newpass\", { notice: \"\" });\n return;\n }\n await this.withLoading(async () => {\n await client.signIn(\n { email: this.email, grant_type: \"code\", code: this.codeValue },\n this.signal()\n );\n this.notice = \"\";\n });\n return;\n }\n\n if (screen === \"newpass\") {\n const problem = this.checkNewPassword(this.newPass);\n if (problem) {\n this.newPassError = problem;\n return;\n }\n if (this.newPass !== this.confirmPass) {\n this.newPassError = this.msg.passwordMatchError;\n return;\n }\n await this.withLoading(async () => {\n await client.resetPassword(\n { email: this.email, code: this.codeValue, new_password: this.newPass },\n this.signal()\n );\n this.newPass = \"\";\n this.confirmPass = \"\";\n });\n return;\n }\n\n if (screen === \"invite\") {\n // Names and phone are optional here; check the phone only when given.\n const phone = this.phone.trim();\n if (phone && phone.replace(/\\D/g, \"\").length < 7) {\n this.banner = this.msg.invalidPhoneError;\n return;\n }\n const problem = this.checkNewPassword(this.password);\n if (problem) {\n this.passError = problem;\n return;\n }\n const code = this.inviteCode || this.codeValue;\n if (code.length < 6) {\n this.banner = this.msg.codeIncompleteError;\n return;\n }\n await this.withLoading(async () => {\n await client.acceptInvite(\n {\n email: this.inviteEmail,\n grant_type: \"code\",\n purpose: \"invite\",\n code,\n password: this.password,\n ...(phone ? { phone } : {})\n },\n this.signal()\n );\n // auth.invite takes no names, so save any that were typed to the new\n // account. It's a nicety: a failure here doesn't undo the invite.\n const first = this.firstName.trim();\n const last = this.lastName.trim();\n if (first || last) {\n await client\n .updateAccount(\n { ...(first ? { first_name: first } : {}), ...(last ? { last_name: last } : {}) },\n this.signal()\n )\n .catch(() => undefined);\n }\n });\n return;\n }\n\n if (\n this.stepped &&\n ((screen === \"signup\" && this.step < 2) || (screen === \"signin\" && this.step < 1))\n ) {\n // Check the field this step shows: sign-up asks for the name first.\n if (screen === \"signup\" && this.step === 0) {\n if (!this.name.trim()) {\n this.banner = this.msg.firstNameRequiredError;\n return;\n }\n } else if (!this.email.includes(\"@\")) {\n this.emailError = this.msg.invalidEmailError;\n return;\n }\n this.banner = \"\";\n this.step += 1;\n return;\n }\n\n if (!this.email.includes(\"@\")) {\n this.emailError = this.msg.invalidEmailError;\n return;\n }\n\n if (screen === \"signup\") {\n // Checked in field order: name, then password.\n // One name field: the first word is the first name, the rest (if any) the last.\n const [first = \"\", ...rest] = this.name.trim().split(/\\s+/);\n if (!first) {\n this.banner = this.msg.firstNameRequiredError;\n return;\n }\n const problem = this.checkNewPassword(this.password);\n if (problem) {\n this.passError = problem;\n return;\n }\n const last = rest.join(\" \");\n await this.withLoading(async () => {\n const result = await client.signUp(\n {\n email: this.email,\n password: this.password,\n first_name: first,\n ...(last ? { last_name: last } : {})\n },\n this.signal()\n );\n const next = resolveScreen({\n next_action: result.next_action,\n next_operation: result.next_operation\n });\n this.setScreen(\"signin\", {\n notice: this.msg.accountCreatedNotice,\n step: 0,\n password: \"\",\n needsMfaCode: next === \"signin_with_code\"\n });\n });\n return;\n }\n\n // signin: an existing password is checked by the server, not the policy.\n if (!this.password) {\n this.passError = this.msg.requiredError;\n return;\n }\n await this.withLoading(async () => {\n try {\n await client.signIn(\n {\n email: this.email,\n password: this.password,\n ...(this.needsMfaCode ? { code: this.codeValue } : {})\n },\n this.signal()\n );\n this.step = 0;\n } catch (error) {\n if (error instanceof SinglebaseAuthError && error.code === \"CODE_REQUIRED\") {\n this.needsMfaCode = true;\n await client.requestCode({ email: this.email, purpose: \"signin\" }, this.signal());\n this.notice = this.msg.codeSentNeutral;\n return;\n }\n if (error instanceof SinglebaseAuthError && error.code === \"INVALID_CREDENTIALS\") {\n // The server rate-limits for real (AUTH_RATE_LIMITED); don't guess here.\n this.banner = this.msg.invalidCredentialsError;\n return;\n }\n throw error;\n }\n });\n }\n\n private abortController: AbortController | null = null;\n private signal(): AbortSignal {\n this.abortController?.abort();\n this.abortController = new AbortController();\n return this.abortController.signal;\n }\n\n private onCodeInput(index: number, e: Event) {\n const input = e.target as HTMLInputElement;\n const entered = input.value.replace(/\\D/g, \"\");\n\n // Autofill of a `one-time-code` field arrives as the whole code in one\n // cell; spread it instead of keeping only the last digit.\n if (entered.length > 1) {\n this.fillCode(index, entered);\n return;\n }\n\n const digit = entered.slice(-1);\n const next = this.code.slice();\n next[index] = digit;\n this.code = next;\n this.banner = \"\";\n if (digit) {\n const inputs = this.renderRoot.querySelectorAll<HTMLInputElement>(\n \".code-row input, .code-row-sm input\"\n );\n inputs[index + 1]?.focus();\n }\n }\n\n private onCodePaste(index: number, e: ClipboardEvent) {\n const digits = (e.clipboardData?.getData(\"text\") ?? \"\").replace(/\\D/g, \"\");\n if (!digits) return;\n e.preventDefault();\n this.fillCode(index, digits);\n }\n\n private fillCode(index: number, digits: string) {\n const next = this.code.slice();\n for (let i = 0; i < digits.length && index + i < next.length; i += 1) {\n next[index + i] = digits[i]!;\n }\n this.code = next;\n this.banner = \"\";\n\n const landed = Math.min(index + digits.length, next.length - 1);\n void this.updateComplete.then(() => {\n const inputs = this.renderRoot.querySelectorAll<HTMLInputElement>(\n \".code-row input, .code-row-sm input\"\n );\n inputs[landed]?.focus();\n });\n }\n\n private async onResend() {\n const client = this.resolvedClient;\n if (!client || this.loading) return;\n const purpose = this.verifyNext === \"newpass\" ? \"password_reset\" : \"signin\";\n await this.withLoading(async () => {\n await client.requestCode({ email: this.email, purpose }, this.signal());\n this.notice = this.msg.codeResentNotice;\n this.code = [\"\", \"\", \"\", \"\", \"\", \"\"];\n });\n }\n\n private goBack() {\n if (this.step > 0 && [\"forgot\", \"verify\", \"otp\", \"newpass\"].indexOf(this.activeScreen) < 0) {\n this.step -= 1;\n this.banner = \"\";\n this.notice = \"\";\n return;\n }\n this.setScreen(\"signin\", { step: 0, notice: \"\", code: [\"\", \"\", \"\", \"\", \"\", \"\"] });\n }\n\n // ── copy helpers (mirror the mock's titles/subs/ctas maps) ──\n private titleFor(screen: GuestScreen): string {\n const m = this.msg;\n switch (screen) {\n case \"signup\":\n return m.signUpTitle;\n case \"forgot\":\n return m.forgotTitle;\n case \"verify\":\n return m.verifyTitle;\n case \"otp\":\n return m.otpTitle;\n case \"newpass\":\n return m.newPassTitle;\n case \"invite\":\n return m.inviteTitle;\n default:\n return this.signInTitle || m.signInTitle;\n }\n }\n\n private subFor(screen: GuestScreen): string {\n const m = this.msg;\n const c = this.cfg;\n switch (screen) {\n case \"signup\":\n return m.signUpSub;\n case \"forgot\":\n return m.forgotSub;\n case \"verify\":\n return `We sent a 6-digit code to ${this.email || \"your inbox\"}. It expires in 10 minutes.`;\n case \"otp\":\n return m.otpSub;\n case \"newpass\":\n return `Your code is confirmed. Set a new password for ${this.email || \"your account\"}.`;\n case \"invite\":\n return `${this.inviteOrg || \"Acme\"} invited you to join. Set up your account to continue.`;\n default:\n if (!c.allowEmailSignin && !c.allowEmailOtp) return m.signInSubOauthOnly;\n return c.allowOauth ? m.signInSubEmailAndOauth : m.signInSubEmailOnly;\n }\n }\n\n private ctaFor(screen: GuestScreen): string {\n const m = this.msg;\n if (\n this.stepped &&\n ((screen === \"signup\" && this.step < 2) || (screen === \"signin\" && this.step < 1))\n ) {\n return m.continueCta;\n }\n switch (screen) {\n case \"signup\":\n return m.signUpCta;\n case \"forgot\":\n return m.forgotCta;\n case \"verify\":\n return m.verifyCta;\n case \"otp\":\n return m.otpCta;\n case \"newpass\":\n return m.newPassCta;\n case \"invite\":\n return m.inviteCta;\n default:\n return m.signInCta;\n }\n }\n\n private stepPct(): number {\n if (!this.stepped) return 100;\n const total = this.activeScreen === \"signup\" ? 3 : 2;\n return Math.round(((this.step + 1) / total) * 100);\n }\n\n // ── render pieces ─────────────────────────────────────────\n private renderPrimary(label: string) {\n return html`\n <button type=\"submit\" class=\"primary\" part=\"button-primary\" ?disabled=${this.loading}>\n ${this.loading ? html`<span class=\"spinner\" part=\"spinner\"></span>` : nothing}\n <span>${label}</span>\n </button>\n `;\n }\n\n private renderEmailField(id: string) {\n return html`\n <div class=\"field\">\n <label for=${id}>${this.msg.emailLabel}</label>\n <input\n id=${id}\n type=\"email\"\n part=\"input\"\n .value=${this.email}\n placeholder=${this.msg.emailPlaceholder}\n aria-invalid=${this.emailError ? \"true\" : \"false\"}\n ?disabled=${this.loading}\n @input=${(e: Event) => {\n this.email = (e.target as HTMLInputElement).value;\n this.emailError = \"\";\n this.banner = \"\";\n }}\n />\n ${this.emailError ? html`<p class=\"err\">${this.emailError}</p>` : nothing}\n </div>\n `;\n }\n\n private renderPasswordField(id: string, showForgot: boolean, creating = false) {\n return html`\n <div class=\"field\">\n <div class=\"label-row\">\n <label for=${id}>${this.msg.passwordLabel}</label>\n ${\n showForgot\n ? html`<button\n type=\"button\"\n class=\"link-sm\"\n @click=${() => this.setScreen(\"forgot\", { step: 0 })}\n >\n ${this.msg.forgotLink}\n </button>`\n : nothing\n }\n </div>\n <input\n id=${id}\n type=\"password\"\n part=\"input\"\n .value=${this.password}\n placeholder=${creating ? this.newPasswordHint : this.msg.passwordPlaceholder}\n aria-invalid=${this.passError ? \"true\" : \"false\"}\n ?disabled=${this.loading}\n @input=${(e: Event) => {\n this.password = (e.target as HTMLInputElement).value;\n this.passError = \"\";\n this.banner = \"\";\n }}\n />\n ${creating ? this.passwordHint : nothing}\n ${this.passError ? html`<p class=\"err\">${this.passError}</p>` : nothing}\n </div>\n `;\n }\n\n private renderCodeRow(small = false) {\n return html`\n <div\n class=${small ? \"code-row-sm\" : \"code-row\"}\n role=\"group\"\n aria-label=${this.msg.codeLabel}\n >\n ${this.code.map(\n (digit, i) => html`\n <input\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"1\"\n part=\"code-box\"\n aria-label=${this.msg.digitLabel.replace(\"{n}\", String(i + 1))}\n autocomplete=${i === 0 ? \"one-time-code\" : \"off\"}\n .value=${digit}\n ?disabled=${this.loading}\n @input=${(e: Event) => this.onCodeInput(i, e)}\n @paste=${(e: ClipboardEvent) => this.onCodePaste(i, e)}\n />\n `\n )}\n </div>\n `;\n }\n\n /** The email/password method accordion body for signin, signup and otp. */\n private renderEmailMethodBody(screen: GuestScreen) {\n const c = this.cfg;\n const stepped = this.stepped;\n const showName = screen === \"signup\" && (!stepped || this.step === 0);\n const showEmail =\n (screen === \"signup\" && (!stepped || this.step === 1)) ||\n (screen === \"signin\" && (!stepped || this.step === 0)) ||\n screen === \"otp\";\n const showPassword =\n (screen === \"signup\" && (!stepped || this.step === 2)) ||\n (screen === \"signin\" && (!stepped || this.step === 1));\n const showOtpLink =\n screen === \"signin\" && c.allowEmailSignin && c.allowEmailOtp && (!stepped || this.step === 0);\n\n return html`\n ${\n showName\n ? html`\n <div class=\"field\">\n <label for=${this.uid(\"name\")}>${this.msg.fullNameLabel}</label>\n <input\n id=${this.uid(\"name\")}\n type=\"text\"\n part=\"input\"\n .value=${this.name}\n placeholder=${this.msg.fullNamePlaceholder}\n ?disabled=${this.loading}\n @input=${(e: Event) => (this.name = (e.target as HTMLInputElement).value)}\n />\n </div>\n `\n : nothing\n }\n ${showEmail ? this.renderEmailField(this.uid(\"email\")) : nothing}\n ${\n showPassword\n ? this.renderPasswordField(\n this.uid(\"pass\"),\n c.allowRecovery && screen === \"signin\",\n screen === \"signup\"\n )\n : nothing\n }\n ${\n this.needsMfaCode && screen === \"signin\"\n ? html`\n <div class=\"field\">\n <span class=\"label\">${this.msg.codeLabel}</span>\n ${this.renderCodeRow(true)}\n </div>\n `\n : nothing\n }\n ${this.renderPrimary(this.ctaFor(screen))}\n ${\n showOtpLink\n ? html`<button\n type=\"button\"\n class=\"edit-link\"\n @click=${() => this.setScreen(\"otp\", { step: 0 })}\n >\n ${this.msg.otpInsteadLink}\n </button>`\n : nothing\n }\n `;\n }\n\n private renderAccordion(screen: GuestScreen) {\n const c = this.cfg;\n const hasEmail =\n (screen === \"signin\" && c.allowEmailSignin) ||\n (screen === \"signup\" && c.allowEmailSignup) ||\n (screen === \"otp\" && c.allowEmailOtp);\n // With settings loaded, show OAuth only when this screen has providers.\n const settings = this.settings ?? this.settingsCtl.settings;\n const providers = oauthProviders(settings, screen === \"signup\" ? \"signup\" : \"signin\");\n const hasOauth = c.allowOauth && (!settings || providers.length > 0);\n if (!hasEmail && !hasOauth) return nothing;\n\n const showHeads = hasEmail && hasOauth;\n const method = !hasEmail ? \"oauth\" : !hasOauth ? \"email\" : this.method || \"email\";\n const emailOpen = method === \"email\";\n const oauthOpen = method === \"oauth\";\n\n const emailTitle =\n screen === \"signup\" ? this.msg.emailMethodTitleSignUp : this.msg.emailMethodTitle;\n const emailMeta =\n screen === \"otp\"\n ? this.msg.emailMethodMetaOtp\n : screen === \"signup\"\n ? this.msg.emailMethodMetaSignUp\n : this.msg.emailMethodMeta;\n\n const item = (\n open: boolean,\n title: string,\n meta: string,\n body: unknown,\n onToggle: () => void,\n key: string\n ) => html`\n <div class=\"acc-item ${open ? \"open\" : \"\"} ${showHeads ? \"\" : \"bare\"}\" part=\"acc-item\">\n ${\n showHeads\n ? html`\n <button\n type=\"button\"\n class=\"acc-head\"\n aria-expanded=${open ? \"true\" : \"false\"}\n aria-controls=${this.uid(`acc-${key}`)}\n @click=${onToggle}\n >\n <span class=\"chev\" aria-hidden=\"true\">›</span>\n <span class=\"acc-title\">${title}</span>\n <span class=\"acc-meta\">${meta}</span>\n </button>\n `\n : nothing\n }\n <div class=\"acc-body\" id=${this.uid(`acc-${key}`)}>\n <div class=\"acc-clip\">\n <div class=\"acc-inner\">${body}</div>\n </div>\n </div>\n </div>\n `;\n\n const emailItem = hasEmail\n ? item(\n emailOpen,\n emailTitle,\n emailMeta,\n this.renderEmailMethodBody(screen),\n () => (this.method = emailOpen ? \"\" : \"email\"),\n \"email\"\n )\n : nothing;\n\n const oauthItem = hasOauth\n ? item(\n oauthOpen,\n this.msg.oauthMethodTitle,\n providers.length ? providers.map((p) => p.name).join(\", \") : this.msg.oauthMethodMeta,\n html`<singlebase-authui-buttons\n type=\"oauth\"\n embedded\n theme=${ifDefined(this.theme)}\n density=${ifDefined(this.density)}\n field-style=${ifDefined(this.fieldStyle)}\n .client=${this.resolvedClient}\n .messages=${this.messages}\n .settings=${this.settings ?? this.settingsCtl.settings}\n intent=${screen === \"signup\" ? \"signup\" : \"signin\"}\n ></singlebase-authui-buttons>`,\n () => (this.method = oauthOpen ? \"\" : \"oauth\"),\n \"oauth\"\n )\n : nothing;\n\n return html`\n <div class=\"acc-wrap\">\n ${this.oauthPlacement === \"top\" ? html`${oauthItem}${emailItem}` : html`${emailItem}${oauthItem}`}\n </div>\n `;\n }\n\n private renderScreenBody(screen: GuestScreen) {\n const c = this.cfg;\n const showMethods = [\"signin\", \"signup\", \"otp\"].indexOf(screen) >= 0;\n\n if (showMethods) return this.renderAccordion(screen);\n\n if (screen === \"forgot\") {\n return html`<div class=\"fields\">${this.renderEmailField(this.uid(\"reset\"))}</div>`;\n }\n\n if (screen === \"verify\") {\n return html`\n ${this.renderCodeRow()}\n <div class=\"resend-row\">\n <span class=\"hint\">${this.msg.resendQuestion}</span>\n <button type=\"button\" class=\"link-sm\" ?disabled=${this.loading} @click=${this.onResend}>\n ${this.msg.resendCta}\n </button>\n </div>\n `;\n }\n\n if (screen === \"newpass\") {\n return html`\n <div class=\"fields\">\n <div class=\"field\">\n <label for=${this.uid(\"newpass\")}>${this.msg.newPasswordLabel}</label>\n <input\n id=${this.uid(\"newpass\")}\n type=\"password\"\n part=\"input\"\n .value=${this.newPass}\n placeholder=${this.newPasswordHint}\n aria-invalid=${this.newPassError ? \"true\" : \"false\"}\n ?disabled=${this.loading}\n @input=${(e: Event) => {\n this.newPass = (e.target as HTMLInputElement).value;\n this.newPassError = \"\";\n }}\n />\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"confirmpass\")}>${this.msg.confirmPasswordLabel}</label>\n <input\n id=${this.uid(\"confirmpass\")}\n type=\"password\"\n part=\"input\"\n .value=${this.confirmPass}\n placeholder=${this.msg.confirmPasswordPlaceholder}\n aria-invalid=${this.newPassError ? \"true\" : \"false\"}\n ?disabled=${this.loading}\n @input=${(e: Event) => {\n this.confirmPass = (e.target as HTMLInputElement).value;\n this.newPassError = \"\";\n }}\n />\n ${this.passwordHint}\n ${this.newPassError ? html`<p class=\"err\">${this.newPassError}</p>` : nothing}\n </div>\n </div>\n `;\n }\n\n if (screen === \"invite\") {\n return html`\n <div class=\"fields\">\n <div class=\"invite-box\">\n <span class=\"invite-label\">${this.msg.invitedEmailLabel}</span>\n <span class=\"invite-email\">${this.inviteEmail}</span>\n </div>\n ${\n this.inviteCode\n ? nothing\n : html`<div class=\"field\">\n <span class=\"label\">${this.msg.inviteCodeLabel}</span>\n ${this.renderCodeRow(true)}\n </div>`\n }\n <div class=\"two-up\">\n <div class=\"field\">\n <label for=${this.uid(\"first\")}>${this.msg.firstNameLabel}</label>\n <input\n id=${this.uid(\"first\")}\n type=\"text\"\n part=\"input\"\n .value=${this.firstName}\n placeholder=${this.msg.firstNamePlaceholder}\n ?disabled=${this.loading}\n @input=${(e: Event) => (this.firstName = (e.target as HTMLInputElement).value)}\n />\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"last\")}>${this.msg.lastNameLabel}</label>\n <input\n id=${this.uid(\"last\")}\n type=\"text\"\n part=\"input\"\n .value=${this.lastName}\n placeholder=${this.msg.lastNamePlaceholder}\n ?disabled=${this.loading}\n @input=${(e: Event) => (this.lastName = (e.target as HTMLInputElement).value)}\n />\n </div>\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"phone\")}>${this.msg.phoneLabel}</label>\n <input\n id=${this.uid(\"phone\")}\n type=\"tel\"\n part=\"input\"\n .value=${this.phone}\n placeholder=${this.msg.phonePlaceholder}\n ?disabled=${this.loading}\n @input=${(e: Event) => (this.phone = (e.target as HTMLInputElement).value)}\n />\n </div>\n <div class=\"field\">\n <label for=${this.uid(\"invitepass\")}>${this.msg.passwordLabel}</label>\n <input\n id=${this.uid(\"invitepass\")}\n type=\"password\"\n part=\"input\"\n .value=${this.password}\n placeholder=${this.newPasswordHint}\n aria-invalid=${this.passError ? \"true\" : \"false\"}\n ?disabled=${this.loading}\n @input=${(e: Event) => {\n this.password = (e.target as HTMLInputElement).value;\n this.passError = \"\";\n }}\n />\n ${this.passwordHint}\n ${this.passError ? html`<p class=\"err\">${this.passError}</p>` : nothing}\n </div>\n </div>\n `;\n }\n\n return nothing;\n }\n\n private renderGuest(screen: GuestScreen) {\n const c = this.cfg;\n const showPrimary = [\"forgot\", \"verify\", \"newpass\", \"invite\"].indexOf(screen) >= 0;\n const showBack =\n (this.stepped && this.step > 0) ||\n [\"forgot\", \"verify\", \"otp\", \"newpass\"].indexOf(screen) >= 0;\n const showFoot =\n (screen === \"signin\" && c.allowEmailSignup) || (screen === \"signup\" && c.allowEmailSignin);\n const showStepBar = this.stepped && (screen === \"signin\" || screen === \"signup\");\n\n return html`\n <form class=\"stack\" @submit=${this.onSubmit} novalidate>\n <div class=\"head\">\n ${this.layout !== \"split\" ? this.renderLogo() : nothing}\n <h2 class=\"title\" part=\"title\">${this.titleFor(screen)}</h2>\n <p class=\"sub\">${this.subFor(screen)}</p>\n </div>\n\n ${\n showStepBar\n ? html`<div class=\"step-bar\">\n <div class=\"step-fill\" style=\"width:${this.stepPct()}%\"></div>\n </div>`\n : nothing\n }\n ${this.banner ? html`<div class=\"banner\" part=\"banner\" role=\"alert\">${this.banner}</div>` : nothing}\n ${this.notice ? html`<div class=\"notice\" part=\"notice\" role=\"status\">${this.notice}</div>` : nothing}\n ${this.renderScreenBody(screen)}\n ${\n showPrimary || showBack\n ? html`\n <div class=\"actions\">\n ${showPrimary ? this.renderPrimary(this.ctaFor(screen)) : nothing}\n ${\n showBack\n ? html`<button type=\"button\" class=\"ghost\" @click=${this.goBack}>\n ${this.msg.backCta}\n </button>`\n : nothing\n }\n </div>\n `\n : nothing\n }\n ${\n showFoot\n ? html`\n <p class=\"foot\">\n <span\n >${screen === \"signup\" ? this.msg.footTextSignUp : this.msg.footTextSignIn}</span\n >\n <button\n type=\"button\"\n class=\"link\"\n @click=${() =>\n this.setScreen(screen === \"signup\" ? \"signin\" : \"signup\", {\n step: 0,\n notice: \"\"\n })}\n >\n ${screen === \"signup\" ? this.msg.footActionSignUp : this.msg.footActionSignIn}\n </button>\n </p>\n `\n : nothing\n }\n ${this.renderConsent()}\n\n <span class=\"sr-only\" role=\"status\" aria-live=\"polite\">\n ${this.loading ? this.msg.submittingStatus : \"\"}\n </span>\n </form>\n `;\n }\n\n private renderBlocked() {\n const c = this.cfg;\n const disabled = !c.authEnabled;\n return html`\n <div class=\"stack\">\n <div class=\"head\">\n ${this.layout !== \"split\" ? this.renderLogo() : nothing}\n <h2 class=\"title\" part=\"title\">\n ${disabled ? this.msg.blockedTitleDisabled : this.msg.blockedTitleUnavailable}\n </h2>\n <p class=\"sub\">\n ${disabled ? this.msg.blockedBodyDisabled : this.msg.blockedBodyUnavailable}\n </p>\n </div>\n <div class=\"notice\" part=\"notice\" role=\"status\">${this.msg.blockedHint}</div>\n </div>\n `;\n }\n\n /**\n * Shown when a signed-in visitor lands on a guest screen. Rather than\n * presenting a sign-in form to someone already signed in, offer the two\n * things they could actually want: carry on, or switch accounts.\n */\n private renderSignedIn() {\n const user = this.auth.state.status === \"authenticated\" ? this.auth.state.user : null;\n const target = this.redirectTarget;\n\n return html`\n <div class=\"stack\">\n <div class=\"head\">\n ${this.renderLogo()}\n <h2 class=\"title\" part=\"title\">${this.msg.alreadySignedInTitle}</h2>\n <p class=\"sub\">\n ${\n user?.email\n ? `${this.msg.alreadySignedInSubPrefix} ${user.email}.`\n : this.msg.alreadySignedInSub\n }\n </p>\n </div>\n\n <div class=\"actions\">\n <button type=\"button\" class=\"primary\" part=\"button-primary\" @click=${this.onContinue}>\n <span>${this.msg.continueCta}</span>\n </button>\n <button type=\"button\" class=\"ghost\" @click=${this.onInterstitialSignOut}>\n <span>${this.msg.signOutCta}</span>\n </button>\n </div>\n\n ${target ? nothing : html`<p class=\"hint\">${this.msg.continueHint}</p>`}\n </div>\n `;\n }\n\n private onContinue = () => {\n if (this.followRedirect()) return;\n // Nothing to redirect to: show the account view and let the host route\n // off the event if it wants to.\n this.dispatchEvent(\n new CustomEvent(\"singlebase-continue\", {\n detail: { user: this.getUser() },\n bubbles: true,\n composed: true\n })\n );\n this.goto(\"account\");\n };\n\n private onInterstitialSignOut = async () => {\n await this.resolvedClient?.logout();\n this.goto(\"signin\");\n };\n\n /** The Terms/Privacy consent line, rendered only when the host supplies a link. */\n private renderConsent() {\n if (!this.tosUrl && !this.privacyUrl) return nothing;\n const tos = this.tosUrl\n ? html`<a class=\"link-sm\" href=${this.tosUrl} target=\"_blank\" rel=\"noopener noreferrer\"\n >${this.msg.termsLabel}</a\n >`\n : nothing;\n const privacy = this.privacyUrl\n ? html`<a class=\"link-sm\" href=${this.privacyUrl} target=\"_blank\" rel=\"noopener noreferrer\"\n >${this.msg.privacyLabel}</a\n >`\n : nothing;\n\n return html`\n <p class=\"hint consent\" part=\"consent\">\n ${this.msg.consentPrefix}\n ${tos}${\n this.tosUrl && this.privacyUrl ? html` ${this.msg.consentJoin} ` : nothing\n }${privacy}.\n </p>\n `;\n }\n\n /**\n * The OAuth return is handled after the first render, not during it: state\n * set while rendering is dropped, so the widget wouldn't leave the callback\n * screen once the URL is cleaned.\n */\n protected override updated(changed: PropertyValues): void {\n super.updated(changed);\n if (this.activeScreen === \"oauth-callback\") void this.handleOAuthCallback();\n }\n\n protected override render() {\n const screen = this.activeScreen;\n\n if (screen === \"oauth-callback\") {\n return this.panel(this.renderOAuthCallback());\n }\n\n if (screen === \"account\") {\n // `no-account-view` is the SPA case: render nothing and let the host\n // route away on the signin event instead.\n if (this.noAccountView) return nothing;\n // Only the outcome of an OAuth return shows here, never a guest screen's\n // leftover message (such as \"Account created\").\n const failed = this.callbackPhase === \"failed\" && this.banner;\n return this.panel(html`\n ${failed ? html`<div class=\"banner\" part=\"banner\" role=\"alert\">${this.banner}</div>` : nothing}\n ${this.linkNotice ? html`<div class=\"notice\" part=\"notice\" role=\"status\">${this.linkNotice}</div>` : nothing}\n <singlebase-authui-account\n theme=${ifDefined(this.theme)}\n density=${ifDefined(this.density)}\n field-style=${ifDefined(this.fieldStyle)}\n .client=${this.resolvedClient}\n .messages=${this.messages}\n logo-text=${this.logoText}\n logo-url=${this.logoUrl}\n ></singlebase-authui-account>\n `);\n }\n\n if (this.showsSignedInInterstitial) {\n if (this.noAccountView) return nothing;\n return this.panel(this.renderSignedIn());\n }\n\n const c = this.cfg;\n const noMethods = !c.allowEmailSignin && !c.allowEmailOtp && !c.allowOauth;\n const blocked = !c.authEnabled || (noMethods && isGuestScreen(screen));\n\n return html`\n ${\n this.layout === \"split\"\n ? html`\n <div class=\"brand-panel\">\n ${this.renderBrandMark()}\n ${this.brandLine ? html`<div class=\"brand-copy\">${this.brandLine}</div>` : nothing}\n ${this.brandFoot ? html`<div class=\"brand-foot\">${this.brandFoot}</div>` : nothing}\n </div>\n `\n : nothing\n }\n ${this.panel(blocked ? this.renderBlocked() : this.renderGuest(screen as GuestScreen))}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"singlebase-authui\": SinglebaseAuthScreen;\n }\n}\n","import { html } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { matchesPredicate, validatePredicate, type Predicate } from \"@singlebase/core\";\nimport { SinglebaseElementBase } from \"./authui-base.js\";\n\nexport type GuardState = \"loading\" | \"authenticated\" | \"unauthenticated\";\n\nconst GUARD_STATES: GuardState[] = [\"loading\", \"authenticated\", \"unauthenticated\"];\n\n/**\n * Renders content conditionally on auth state, and optionally on a predicate\n * over the signed-in profile.\n *\n * Two shapes, because wrapping a single line of markup in a slotted <div> is\n * a lot of ceremony:\n *\n * <!-- long form: one guard, several states -->\n * <singlebase-authui-guard>\n * <div slot=\"loading\">Checking…</div>\n * <div slot=\"authenticated\">Welcome back</div>\n * <div slot=\"unauthenticated\"><singlebase-authui></singlebase-authui></div>\n * </singlebase-authui-guard>\n *\n * <!-- short form: the guard itself carries the state -->\n * <singlebase-authui-guard slot=\"loading\">Checking…</singlebase-authui-guard>\n *\n * With a predicate it also filters on the profile:\n *\n * <singlebase-authui-guard slot=\"authenticated\" predicate='{\"roles\":{\"$in\":[\"admin\"]}}'>\n * <admin-panel></admin-panel>\n * </singlebase-authui-guard>\n *\n * A predicate only ever narrows the *authenticated* state: a signed-out\n * visitor is unauthenticated whether or not a filter is present, so a guard\n * can never leak content by failing open.\n */\n@customElement(\"singlebase-authui-guard\")\nexport class SinglebaseAuthGuard extends SinglebaseElementBase {\n /**\n * Short form. When set, every child of this guard belongs to that state and\n * no per-child `slot` attributes are needed.\n *\n * Note this reuses the standard `slot` attribute name, which is inert here:\n * the guard is not itself inside another shadow root's slot, so the name is\n * free to mean \"the state these children belong to\".\n */\n @property({ reflect: true })\n accessor slot = \"\";\n\n /**\n * One-level, Mongo-style filter over the signed-in `user_profile`.\n * Dot notation reaches nested values; see core's predicate module for the\n * supported operators.\n */\n @property({\n converter: {\n fromAttribute: (value: string | null): Predicate | null => {\n if (!value) return null;\n try {\n return JSON.parse(value) as Predicate;\n } catch {\n console.error(\"[singlebase] guard predicate is not valid JSON:\", value);\n return null;\n }\n },\n toAttribute: (value: Predicate | null) => (value ? JSON.stringify(value) : null)\n }\n })\n accessor predicate: Predicate | null = null;\n\n /**\n * What to show when the user is signed in but the predicate does not match.\n * Defaults to \"unauthenticated\" so a filtered guard degrades to the\n * signed-out branch; set \"hidden\" to render nothing at all.\n */\n @property({ attribute: \"on-mismatch\" })\n accessor onMismatch: \"unauthenticated\" | \"hidden\" = \"unauthenticated\";\n\n private warnedFor: string | null = null;\n\n protected override createRenderRoot() {\n // Light DOM: the host's own markup stays the host's, and the hidden\n // toggling below applies to real light-DOM children.\n return this;\n }\n\n /** The state this guard currently resolves to, after applying the predicate. */\n get activeState(): GuardState | \"hidden\" {\n const status = this.auth.state.status;\n\n if (status === \"loading\") return \"loading\";\n if (status !== \"authenticated\") return \"unauthenticated\";\n\n if (!this.predicate) return \"authenticated\";\n\n this.warnOnce(this.predicate);\n const user = this.auth.state.user;\n if (matchesPredicate(user, this.predicate)) return \"authenticated\";\n return this.onMismatch === \"hidden\" ? \"hidden\" : \"unauthenticated\";\n }\n\n /** Surfaces a malformed predicate once, rather than silently never matching. */\n private warnOnce(predicate: Predicate) {\n const key = JSON.stringify(predicate);\n if (this.warnedFor === key) return;\n this.warnedFor = key;\n for (const problem of validatePredicate(predicate)) {\n console.warn(`[singlebase] <singlebase-authui-guard> predicate: ${problem}`);\n }\n }\n\n override render() {\n const active = this.activeState;\n\n if (this.slot) {\n // Short form: the whole guard is shown or hidden as one unit.\n const show = GUARD_STATES.includes(this.slot as GuardState) && this.slot === active;\n this.toggleAttribute(\"hidden\", !show);\n return html`<slot></slot>`;\n }\n\n this.toggleAttribute(\"hidden\", false);\n for (const child of Array.from(this.children)) {\n const childSlot = child.getAttribute(\"slot\");\n child.toggleAttribute(\"hidden\", childSlot !== active);\n }\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"singlebase-authui-guard\": SinglebaseAuthGuard;\n }\n}\n","import { css, html, nothing, type PropertyValues } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { getPath } from \"@singlebase/core\";\nimport { SinglebaseElementBase } from \"./authui-base.js\";\nimport { initialsOf } from \"../utils/profile.js\";\n\n/** Where the avatar looks for its image when no path is given. */\nconst DEFAULT_AVATAR_PATH = \"profile_photo\";\n\n/**\n * Displays one value from the signed-in profile, as text or as an avatar.\n *\n * Hello <singlebase-authui-display path=\"first_name\" fallback=\"there\"></singlebase-authui-display>\n * <singlebase-authui-display avatar></singlebase-authui-display>\n *\n * Three rules shape the behaviour:\n *\n * - While auth state is still loading it renders nothing. Showing the\n * fallback first would mean every signed-in visitor watches \"Hello there\"\n * flip to \"Hello Ada\" on each page load.\n * - Values resolve against `user_profile` and nothing else. The element\n * deliberately cannot reach session or token data, which must never be\n * written into the DOM.\n * - Values are rendered as text, never as markup. Fields like first_name are\n * supplied by the user at signup, so they are untrusted by definition.\n */\n@customElement(\"singlebase-authui-display\")\nexport class SinglebaseAuthDisplay extends SinglebaseElementBase {\n static override styles = [\n ...SinglebaseElementBase.styles,\n css`\n /* Text sits in a sentence; an avatar is a box the host sizes. */\n :host {\n display: inline;\n }\n\n :host([avatar]) {\n display: inline-block;\n width: 42px;\n height: 42px;\n vertical-align: middle;\n }\n\n img,\n .initials {\n display: block;\n width: 100%;\n height: 100%;\n border-radius: inherit;\n box-sizing: border-box;\n }\n\n img {\n object-fit: cover;\n }\n\n /* Matches the avatar in the account view. */\n .initials {\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--sb-surface-alt, #fafafa);\n border: 1px dashed var(--sb-border, #e4e6e9);\n font-family: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n font-size: 0.8em;\n color: var(--sb-muted-ink, #61666c);\n user-select: none;\n }\n `\n ];\n\n /**\n * Dot-notated path into the profile: \"first_name\", \"metadata.tier\". In\n * avatar mode it names the image field and defaults to \"profile_photo\".\n */\n @property() accessor path = \"\";\n\n /** Shown when signed out, or when the value is empty. Text mode only. */\n @property() accessor fallback = \"\";\n\n /** Render an image with an initials fallback instead of text. */\n @property({ type: Boolean, reflect: true }) accessor avatar = false;\n\n /**\n * Alternative text for the avatar image. Left empty the image is treated as\n * decorative, which is right when a name sits beside it — pass a value only\n * when the avatar is the sole identifier.\n */\n @property() accessor alt = \"\";\n\n /** Set when the image 404s, so a dead URL falls back to initials. */\n @state() private accessor imageFailed = false;\n\n override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n // A new source deserves a fresh attempt.\n if (changed.has(\"path\") || changed.has(\"avatar\")) this.imageFailed = false;\n }\n\n private get profile() {\n const state = this.auth.state;\n return state.status === \"authenticated\" ? state.user : null;\n }\n\n /** The resolved value as a string, or \"\" when there is nothing to show. */\n private get textValue(): string {\n const profile = this.profile;\n if (!profile || !this.path) return \"\";\n\n const value = getPath(profile, this.path);\n if (value === null || value === undefined || value === \"\") return \"\";\n if (Array.isArray(value)) return value.filter((v) => v != null).join(\", \");\n // An object would stringify to \"[object Object]\"; treat it as absent.\n if (typeof value === \"object\") return \"\";\n return String(value);\n }\n\n private get avatarSrc(): string {\n const profile = this.profile;\n if (!profile) return \"\";\n const value = getPath(profile, this.path || DEFAULT_AVATAR_PATH);\n return typeof value === \"string\" ? value : \"\";\n }\n\n protected override render() {\n // Nothing at all until the session has been read — see the class comment.\n if (this.auth.state.status === \"loading\") return nothing;\n\n if (this.avatar) return this.renderAvatar();\n\n const value = this.textValue;\n if (value) return html`<span part=\"text\">${value}</span>`;\n return this.fallback ? html`<span part=\"text\">${this.fallback}</span>` : nothing;\n }\n\n private renderAvatar() {\n const profile = this.profile;\n if (!profile) return nothing;\n\n const src = this.avatarSrc;\n if (src && !this.imageFailed) {\n return html`<img\n part=\"avatar-image\"\n src=${src}\n alt=${this.alt}\n @error=${() => (this.imageFailed = true)}\n />`;\n }\n\n return html`<span\n part=\"avatar-initials\"\n class=\"initials\"\n aria-hidden=${this.alt ? \"false\" : \"true\"}\n >${initialsOf(profile)}</span\n >`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"singlebase-authui-display\": SinglebaseAuthDisplay;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},e=t=>(...e)=>({_$litDirective$:t,values:e});class i{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}}export{i as Directive,t as PartType,e as directive};\n//# sourceMappingURL=directive.js.map\n","import{_$LH as o}from\"./lit-html.js\";\n/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{I:t}=o,i=o=>o,n=o=>null===o||\"object\"!=typeof o&&\"function\"!=typeof o,e={HTML:1,SVG:2,MATHML:3},l=(o,t)=>void 0===t?void 0!==o?._$litType$:o?._$litType$===t,d=o=>null!=o?._$litType$?.h,c=o=>void 0!==o?._$litDirective$,f=o=>o?._$litDirective$,r=o=>void 0===o.strings,s=()=>document.createComment(\"\"),v=(o,n,e)=>{const l=o._$AA.parentNode,d=void 0===n?o._$AB:n._$AA;if(void 0===e){const i=l.insertBefore(s(),d),n=l.insertBefore(s(),d);e=new t(i,n,o,o.options)}else{const t=e._$AB.nextSibling,n=e._$AM,c=n!==o;if(c){let t;e._$AQ?.(o),e._$AM=o,void 0!==e._$AP&&(t=o._$AU)!==n._$AU&&e._$AP(t)}if(t!==d||c){let o=e._$AA;for(;o!==t;){const t=i(o).nextSibling;i(l).insertBefore(o,d),o=t}}}return e},u=(o,t,i=o)=>(o._$AI(t,i),o),m={},p=(o,t=m)=>o._$AH=t,M=o=>o._$AH,h=o=>{o._$AR(),o._$AA.remove()},j=o=>{o._$AR()};export{e as TemplateResultType,j as clearPart,M as getCommittedValue,f as getDirectiveClass,v as insertPart,d as isCompiledTemplateResult,c as isDirectiveResult,n as isPrimitive,r as isSingleExpression,l as isTemplateResult,h as removePart,u as setChildPartValue,p as setCommittedValue};\n//# sourceMappingURL=directive-helpers.js.map\n","import{noChange as e}from\"../lit-html.js\";import{directive as s,Directive as t,PartType as r}from\"../directive.js\";import{getCommittedValue as l,setChildPartValue as o,insertPart as i,removePart as n,setCommittedValue as f}from\"../directive-helpers.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst u=(e,s,t)=>{const r=new Map;for(let l=s;l<=t;l++)r.set(e[l],l);return r},c=s(class extends t{constructor(e){if(super(e),e.type!==r.CHILD)throw Error(\"repeat() can only be used in text expressions\")}dt(e,s,t){let r;void 0===t?t=s:void 0!==s&&(r=s);const l=[],o=[];let i=0;for(const s of e)l[i]=r?r(s,i):i,o[i]=t(s,i),i++;return{values:o,keys:l}}render(e,s,t){return this.dt(e,s,t).values}update(s,[t,r,c]){const d=l(s),{values:p,keys:a}=this.dt(t,r,c);if(!Array.isArray(d))return this.ut=a,p;const h=this.ut??=[],v=[];let m,y,x=0,j=d.length-1,k=0,w=p.length-1;for(;x<=j&&k<=w;)if(null===d[x])x++;else if(null===d[j])j--;else if(h[x]===a[k])v[k]=o(d[x],p[k]),x++,k++;else if(h[j]===a[w])v[w]=o(d[j],p[w]),j--,w--;else if(h[x]===a[w])v[w]=o(d[x],p[w]),i(s,v[w+1],d[x]),x++,w--;else if(h[j]===a[k])v[k]=o(d[j],p[k]),i(s,d[x],d[j]),j--,k++;else if(void 0===m&&(m=u(a,k,w),y=u(h,x,j)),m.has(h[x]))if(m.has(h[j])){const e=y.get(a[k]),t=void 0!==e?d[e]:null;if(null===t){const e=i(s,d[x]);o(e,p[k]),v[k]=e}else v[k]=o(t,p[k]),i(s,d[x],t),d[e]=null;k++}else n(d[j]),j--;else n(d[x]),x++;for(;k<=w;){const e=i(s,v[w+1]);o(e,p[k]),v[k++]=e}for(;x<=j;){const e=d[x++];null!==e&&n(e)}return this.ut=a,f(s,v),e}});export{c as repeat};\n//# sourceMappingURL=repeat.js.map\n","import { css } from \"lit\";\n\n/**\n * The glow's rotating angle has to be a registered custom property to\n * animate, and registration only works at document level, not in a shadow\n * root's stylesheet. Registering twice throws, which is fine to ignore.\n */\nif (typeof CSS !== \"undefined\" && \"registerProperty\" in CSS) {\n try {\n CSS.registerProperty({\n name: \"--sb-ai-angle\",\n syntax: \"<angle>\",\n inherits: false,\n initialValue: \"0deg\"\n });\n } catch {\n /* already registered */\n }\n}\n\n/**\n * <singlebase-chat> styles. Every colour comes from the shared --sb-* tokens\n * (plus --sb-hover, --sb-ink-2 and --sb-divider, which only the chat uses),\n * so a page themes the chat, the auth widget and the uploader in one place.\n */\nexport const chatStyles = css`\n :host {\n --c-ink: var(--sb-ink, #16181a);\n --c-ink2: var(--sb-ink-2, #41464b);\n --c-muted: var(--sb-muted-ink, #61666c);\n --c-faint: #8a8f95;\n --c-bg: var(--sb-surface, #ffffff);\n --c-bg2: var(--sb-surface-alt, #fafafa);\n --c-hover: var(--sb-hover, #f2f3f4);\n --c-line: var(--sb-border, #e4e6e9);\n --c-line2: var(--sb-divider, #ecedee);\n --c-strong: var(--sb-border-strong, #cdd1d6);\n --c-brand: var(--sb-accent, #16181a);\n --c-on-brand: var(--sb-on-accent, #ffffff);\n --c-danger: var(--sb-danger, #b4231a);\n --c-ok: var(--sb-ok, #0f6b4a);\n --c-mono: var(--sb-mono, \"Geist Mono\", ui-monospace, monospace);\n --c-r: calc(var(--sb-radius, 4px) * var(--sb-radius-scale, 1));\n --c-r2: calc(var(--c-r) * 1.5);\n --c-r3: calc(var(--c-r) * 2);\n --c-r4: calc(var(--c-r) * 3);\n --c-glow: 0.6;\n --c-conic: conic-gradient(\n from var(--sb-ai-angle, 0deg),\n oklch(0.72 0.15 295),\n oklch(0.74 0.13 245),\n oklch(0.8 0.11 190),\n oklch(0.84 0.12 85),\n oklch(0.78 0.12 350),\n oklch(0.72 0.15 295)\n );\n --c-z: var(--sb-chat-z, 1000);\n display: block;\n height: 100%;\n min-height: 0;\n color-scheme: light;\n }\n\n :host([theme=\"dark\"]) {\n --sb-hover: #24272b;\n --sb-ink-2: #c9ccd0;\n --sb-divider: #26292d;\n --c-faint: #7c8187;\n color-scheme: dark;\n }\n\n :host([glow=\"vivid\"]) {\n --c-glow: 1;\n }\n\n :host([embed=\"inline\"]) {\n height: auto;\n }\n\n :host([embed=\"launcher\"]) {\n height: 0;\n }\n\n * {\n box-sizing: border-box;\n }\n\n button {\n font: inherit;\n color: inherit;\n }\n\n button:focus-visible,\n input:focus-visible,\n textarea:focus-visible,\n [role=\"button\"]:focus-visible {\n outline: 2px solid var(--c-ink);\n outline-offset: 1px;\n }\n\n .mono {\n font-family: var(--c-mono);\n }\n\n .label {\n font-family: var(--c-mono);\n font-size: 11px;\n letter-spacing: 0.07em;\n text-transform: uppercase;\n color: var(--c-muted);\n }\n\n /* ── frames ───────────────────────────────────────────── */\n\n .frame {\n position: relative;\n display: flex;\n height: 100%;\n min-height: 0;\n background: var(--c-bg);\n color: var(--c-ink);\n overflow: hidden;\n }\n\n .frame.boxed {\n border: 1px solid var(--c-line);\n border-radius: var(--c-r4);\n }\n\n .frame.inline {\n width: 440px;\n height: 660px;\n min-width: 340px;\n min-height: 480px;\n max-width: 100%;\n resize: both;\n box-shadow: 0 1px 2px rgba(22, 24, 26, 0.06);\n }\n\n @media (max-width: 559px) {\n .frame.inline {\n width: 100%;\n min-width: 0;\n resize: none;\n }\n }\n\n .frame.launcher {\n position: fixed;\n bottom: 96px;\n right: 24px;\n z-index: var(--c-z);\n width: 420px;\n height: min(680px, calc(100vh - 120px));\n max-width: calc(100vw - 48px);\n box-shadow: 0 24px 60px -24px rgba(22, 24, 26, 0.35);\n transform-origin: bottom right;\n animation: scaleIn 0.2s ease-out;\n }\n\n :host([position=\"left\"]) .frame.launcher {\n right: auto;\n left: 24px;\n transform-origin: bottom left;\n }\n\n .frame.expanded {\n position: fixed;\n inset: 24px;\n width: auto;\n height: auto;\n max-width: none;\n z-index: var(--c-z);\n resize: none;\n box-shadow: 0 24px 60px -24px rgba(22, 24, 26, 0.35);\n animation: scaleIn 0.2s ease-out;\n }\n\n .frame.full {\n position: fixed;\n inset: 0;\n width: auto;\n height: auto;\n max-width: none;\n border-radius: 0;\n border: none;\n z-index: var(--c-z);\n resize: none;\n }\n\n .root {\n position: relative;\n display: flex;\n flex: 1;\n min-width: 0;\n min-height: 0;\n font-family: var(--sb-font, \"Geist\", -apple-system, \"Segoe UI\", Helvetica, sans-serif);\n background: var(--c-bg);\n color: var(--c-ink);\n }\n\n /* ── launcher ─────────────────────────────────────────── */\n\n .launcher-btn {\n position: fixed;\n bottom: 24px;\n right: 24px;\n z-index: calc(var(--c-z) + 1);\n width: 56px;\n height: 56px;\n border-radius: 999px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n cursor: pointer;\n background: var(--c-brand);\n color: var(--c-on-brand);\n box-shadow: 0 12px 28px -10px rgba(22, 24, 26, 0.45);\n }\n\n :host([position=\"left\"]) .launcher-btn,\n :host([position=\"left\"]) .bubble {\n right: auto;\n left: 24px;\n }\n\n .badge {\n position: absolute;\n top: 2px;\n right: 2px;\n width: 12px;\n height: 12px;\n border-radius: 999px;\n background: var(--c-danger);\n border: 2px solid var(--c-bg);\n }\n\n .bubble {\n position: fixed;\n bottom: 96px;\n right: 24px;\n z-index: var(--c-z);\n width: 260px;\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 12px 10px 12px 14px;\n background: var(--c-bg);\n color: var(--c-ink);\n border: 1px solid var(--c-line);\n border-radius: calc(var(--c-r) * 2.5);\n box-shadow: 0 12px 32px -12px rgba(22, 24, 26, 0.25);\n font-family: var(--sb-font, \"Geist\", -apple-system, \"Segoe UI\", Helvetica, sans-serif);\n animation: aiIn 0.25s ease-out;\n }\n\n .bubble-text {\n flex: 1;\n min-width: 0;\n text-align: left;\n font-size: 13.5px;\n line-height: 1.45;\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n }\n\n /* ── icon buttons ─────────────────────────────────────── */\n\n .icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 28px;\n height: 28px;\n padding: 0;\n border: none;\n border-radius: var(--c-r);\n background: transparent;\n color: var(--c-muted);\n cursor: pointer;\n }\n\n .icon:hover:not(:disabled),\n .icon.on {\n color: var(--c-ink);\n }\n\n .icon:hover:not(:disabled) {\n background: var(--c-hover);\n }\n\n .icon.danger:hover:not(:disabled) {\n color: var(--c-danger);\n }\n\n .icon:disabled {\n opacity: 0.4;\n cursor: default;\n }\n\n .icon.sm {\n width: 24px;\n height: 24px;\n }\n\n svg.i {\n width: 16px;\n height: 16px;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n\n svg.i.filled path {\n fill: currentColor;\n }\n\n @media (pointer: coarse) {\n .icon {\n width: 44px;\n height: 44px;\n }\n }\n\n /* ── sidebar ──────────────────────────────────────────── */\n\n .scrim {\n position: absolute;\n inset: 0;\n z-index: 29;\n background: rgba(22, 24, 26, 0.18);\n }\n\n .sidebar {\n display: flex;\n flex-direction: column;\n min-height: 0;\n min-width: 0;\n background: var(--c-bg2);\n border-right: 1px solid var(--c-line);\n }\n\n .sidebar.docked {\n position: relative;\n flex: 0 0 272px;\n width: 272px;\n }\n\n .sidebar.overlay {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n z-index: 30;\n width: min(280px, 86%);\n box-shadow: 12px 0 32px -16px rgba(22, 24, 26, 0.25);\n animation: slideIn 0.15s ease-out;\n }\n\n .side-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 14px 12px 10px 16px;\n }\n\n .side-tools {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 0 12px 8px;\n }\n\n .new-chat {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n min-height: 34px;\n font-size: 13px;\n font-weight: 500;\n color: var(--c-on-brand);\n background: var(--c-brand);\n border: 1px solid var(--c-brand);\n border-radius: var(--c-r2);\n padding: 8px 12px;\n cursor: pointer;\n }\n\n .new-chat:hover {\n filter: brightness(1.2);\n }\n\n .search {\n width: 100%;\n font: inherit;\n font-size: 13px;\n color: var(--c-ink);\n background: var(--c-bg);\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n padding: 8px 10px;\n outline: none;\n }\n\n .search:focus {\n border-color: var(--c-ink);\n }\n\n .threads {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 1px;\n padding: 4px 12px 12px;\n }\n\n .group {\n font-family: var(--c-mono);\n font-size: 11px;\n letter-spacing: 0.07em;\n text-transform: uppercase;\n color: var(--c-muted);\n padding: 10px 8px 6px;\n }\n\n .thread {\n display: flex;\n align-items: center;\n gap: 4px;\n min-height: 34px;\n width: 100%;\n font-size: 13px;\n color: var(--c-ink);\n border-radius: var(--c-r2);\n padding: 3px 4px 3px 10px;\n cursor: pointer;\n }\n\n .thread:hover {\n background: var(--c-hover);\n }\n\n .thread.active {\n background: var(--c-line2);\n font-weight: 500;\n }\n\n .thread-title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .thread-actions {\n display: none;\n gap: 0;\n }\n\n .thread:hover .thread-actions,\n .thread:focus-within .thread-actions {\n display: flex;\n }\n\n .thread-rename {\n flex: 1;\n min-width: 0;\n font: inherit;\n color: var(--c-ink);\n background: var(--c-bg);\n border: 1px solid var(--c-ink);\n border-radius: var(--c-r);\n padding: 3px 6px;\n outline: none;\n }\n\n .side-extra {\n display: none;\n }\n\n .side-extra.filled {\n display: block;\n padding: 12px 16px;\n border-top: 1px solid var(--c-line);\n font-size: 12.5px;\n }\n\n .side-note {\n font-size: 12.5px;\n color: var(--c-muted);\n padding: 6px 10px;\n }\n\n .skeleton {\n height: 28px;\n margin: 3px 0;\n border-radius: var(--c-r2);\n background: linear-gradient(90deg, var(--c-hover) 0%, var(--c-line2) 50%, var(--c-hover) 100%);\n background-size: 200% 100%;\n animation: aiShimmer 1.6s linear infinite;\n }\n\n /* ── main column ──────────────────────────────────────── */\n\n .main {\n container: chat / inline-size;\n position: relative;\n flex: 1;\n min-width: 0;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n min-height: 52px;\n padding: 10px 8px 10px 12px;\n border-bottom: 1px solid var(--c-line);\n }\n\n .header-left {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n }\n\n .header-right {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n gap: 2px;\n }\n\n .title {\n min-width: 0;\n font-size: 14px;\n font-weight: 600;\n letter-spacing: -0.01em;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n background: none;\n border: none;\n padding: 2px 4px;\n border-radius: var(--c-r);\n cursor: text;\n animation: aiIn 0.25s ease-out;\n }\n\n .title:hover:not(:disabled) {\n background: var(--c-hover);\n }\n\n .title:disabled {\n cursor: default;\n }\n\n .title-input {\n min-width: 0;\n width: 320px;\n max-width: 100%;\n font: inherit;\n font-size: 14px;\n font-weight: 600;\n color: var(--c-ink);\n background: var(--c-bg);\n border: 1px solid var(--c-ink);\n border-radius: var(--c-r);\n padding: 2px 6px;\n outline: none;\n }\n\n .divider {\n width: 1px;\n height: 18px;\n background: var(--c-line);\n margin: 0 4px;\n }\n\n .menu-wrap {\n position: relative;\n }\n\n .menu-scrim {\n position: fixed;\n inset: 0;\n z-index: 40;\n }\n\n .menu {\n position: absolute;\n right: 0;\n top: 34px;\n z-index: 41;\n width: 220px;\n display: flex;\n flex-direction: column;\n padding: 4px;\n background: var(--c-bg);\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n box-shadow: 0 12px 32px -12px rgba(22, 24, 26, 0.22);\n animation: aiIn 0.15s ease-out;\n }\n\n .menu .label {\n font-size: 10.5px;\n padding: 8px 10px 6px;\n }\n\n .menu-item {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 10px;\n width: 100%;\n text-align: left;\n font-size: 13px;\n background: none;\n border: none;\n border-radius: var(--c-r);\n padding: 8px 10px;\n cursor: pointer;\n }\n\n .menu-item:hover {\n background: var(--c-hover);\n }\n\n .menu-item .ext {\n font-family: var(--c-mono);\n font-size: 11px;\n color: var(--c-muted);\n }\n\n .scroller {\n position: relative;\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n }\n\n .banner {\n margin: 10px 16px 0;\n padding: 8px 12px;\n font-size: 12.5px;\n color: var(--c-ink2);\n background: var(--c-bg2);\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n }\n\n /* ── welcome ──────────────────────────────────────────── */\n\n .welcome-slot {\n min-height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n\n ::slotted([slot=\"welcome\"]) {\n box-sizing: border-box;\n width: 100%;\n max-width: 640px;\n margin: 0 auto;\n padding: 28px 18px;\n }\n\n .welcome {\n max-width: 640px;\n min-height: 100%;\n margin: 0 auto;\n display: flex;\n flex-direction: column;\n justify-content: center;\n gap: 20px;\n padding: 28px 18px;\n }\n\n .welcome-head {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .welcome-logo {\n width: 32px;\n height: 32px;\n object-fit: contain;\n border-radius: var(--c-r2);\n }\n\n .welcome h2 {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n letter-spacing: -0.01em;\n }\n\n .welcome p {\n margin: 0;\n font-size: 14px;\n line-height: 1.55;\n color: var(--c-muted);\n text-wrap: pretty;\n }\n\n .prompts {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 8px;\n }\n\n .prompt {\n display: flex;\n flex-direction: column;\n gap: 4px;\n text-align: left;\n background: var(--c-bg);\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n padding: 12px 14px;\n cursor: pointer;\n transition:\n border-color 0.15s,\n box-shadow 0.15s;\n }\n\n .prompt:hover {\n border-color: var(--c-ink);\n box-shadow: 0 6px 18px -10px rgba(22, 24, 26, 0.25);\n }\n\n /* A starter question that hasn't arrived yet. */\n .prompt.skeleton {\n min-height: 62px;\n cursor: default;\n background: var(--c-soft, rgba(22, 24, 26, 0.04));\n border-style: dashed;\n animation: aiBreathe 1.6s ease-in-out infinite;\n }\n\n .prompt.skeleton:hover {\n border-color: var(--c-line);\n box-shadow: none;\n }\n\n .prompt .label {\n font-size: 10.5px;\n letter-spacing: 0.06em;\n }\n\n .prompt-text {\n font-size: 13.5px;\n font-weight: 500;\n line-height: 1.4;\n }\n\n @container chat (max-width: 480px) {\n .prompts {\n grid-template-columns: minmax(0, 1fr);\n }\n }\n\n /* ── messages ─────────────────────────────────────────── */\n\n .thread-view {\n max-width: 760px;\n margin: 0 auto;\n display: flex;\n flex-direction: column;\n gap: 30px;\n padding: 20px 16px 28px;\n }\n\n .msg {\n position: relative;\n display: flex;\n flex-direction: column;\n border-radius: var(--c-r3);\n }\n\n .msg.user {\n align-self: flex-end;\n max-width: 80%;\n align-items: flex-end;\n gap: 6px;\n margin-bottom: -22px;\n animation: aiIn 0.25s ease-out;\n }\n\n .bubble-user {\n padding: 10px 14px;\n font-size: 14.5px;\n line-height: 1.6;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n background: var(--c-hover);\n border-radius: calc(var(--c-r) * 2.5) calc(var(--c-r) * 2.5) 2px calc(var(--c-r) * 2.5);\n }\n\n .attachments {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: 6px;\n }\n\n .doc-chip {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 6px 10px;\n font-size: 12.5px;\n border-radius: var(--c-r2);\n border: 1px solid var(--c-line);\n background: var(--c-bg);\n }\n\n .doc-chip .ext {\n font-family: var(--c-mono);\n font-size: 10px;\n letter-spacing: 0.04em;\n color: var(--c-muted);\n }\n\n .doc-chip .name {\n max-width: 180px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .toolbar {\n display: flex;\n align-items: center;\n gap: 2px;\n opacity: 0;\n transition: opacity 0.15s;\n }\n\n .msg:hover .toolbar,\n .msg:focus-within .toolbar,\n .toolbar.pinned {\n opacity: 1;\n }\n\n @media (hover: none) {\n .toolbar {\n opacity: 1;\n }\n }\n\n .msg.bot .toolbar {\n margin-left: -6px;\n }\n\n .time {\n font-family: var(--c-mono);\n font-size: 11px;\n color: var(--c-faint);\n padding: 0 6px;\n font-variant-numeric: tabular-nums;\n }\n\n .note {\n font-size: 12px;\n color: var(--c-muted);\n }\n\n .spacer {\n flex: 1;\n }\n\n .saved {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-family: var(--c-mono);\n font-size: 10.5px;\n letter-spacing: 0.05em;\n text-transform: uppercase;\n color: var(--c-ink);\n }\n\n .saved svg {\n width: 12px;\n height: 12px;\n fill: currentColor;\n stroke: currentColor;\n stroke-width: 1.5;\n }\n\n .bot-body {\n position: relative;\n z-index: 1;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .edit-box {\n width: 440px;\n max-width: 100%;\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 8px;\n border: 1px solid var(--c-ink);\n border-radius: var(--c-r3);\n background: var(--c-bg);\n }\n\n .edit-box textarea {\n width: 100%;\n resize: vertical;\n font: inherit;\n font-size: 14px;\n line-height: 1.5;\n color: var(--c-ink);\n background: transparent;\n border: none;\n outline: none;\n padding: 4px;\n }\n\n .row-end {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n }\n\n .btn {\n font-size: 12.5px;\n font-weight: 500;\n border-radius: var(--c-r);\n padding: 6px 12px;\n cursor: pointer;\n background: transparent;\n color: var(--c-muted);\n border: 1px solid var(--c-line);\n }\n\n .btn:hover {\n color: var(--c-ink);\n background: var(--c-bg2);\n }\n\n .btn.primary {\n background: var(--c-brand);\n color: var(--c-on-brand);\n border-color: var(--c-brand);\n }\n\n .btn.primary:hover {\n filter: brightness(1.2);\n }\n\n .error-card {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 10px 12px;\n font-size: 13px;\n color: var(--c-danger);\n border: 1px solid var(--sb-danger-border, #f3d6d3);\n background: var(--sb-danger-bg, #fdf1f0);\n border-radius: var(--c-r2);\n }\n\n .followups {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 6px;\n }\n\n .followup {\n display: inline-flex;\n align-items: baseline;\n gap: 8px;\n text-align: left;\n font-size: 13px;\n background: var(--c-bg);\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n padding: 6px 12px;\n cursor: pointer;\n animation: aiIn 0.25s ease-out;\n }\n\n .followup:hover {\n background: var(--c-hover);\n }\n\n .followup .arrow {\n font-family: var(--c-mono);\n color: var(--c-muted);\n }\n\n .jump {\n position: absolute;\n left: 50%;\n bottom: 8px;\n transform: translateX(-50%);\n z-index: 5;\n font-size: 12.5px;\n font-weight: 500;\n color: var(--c-on-brand);\n background: var(--c-brand);\n border: none;\n border-radius: 999px;\n padding: 6px 14px;\n cursor: pointer;\n box-shadow: 0 8px 20px -10px rgba(22, 24, 26, 0.4);\n animation: aiIn 0.2s ease-out;\n }\n\n /* ── rendered answer ──────────────────────────────────── */\n\n .answer {\n display: flex;\n flex-direction: column;\n gap: 14px;\n font-size: 14.5px;\n line-height: 1.7;\n }\n\n .answer p {\n margin: 0;\n text-wrap: pretty;\n overflow-wrap: anywhere;\n }\n\n .answer .raw {\n white-space: pre-wrap;\n }\n\n .answer h3 {\n margin: 6px 0 0;\n font-size: 15.5px;\n font-weight: 600;\n letter-spacing: -0.01em;\n line-height: 1.4;\n }\n\n .answer ul,\n .answer ol {\n margin: 0;\n padding-left: 20px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .answer li {\n line-height: 1.65;\n padding-left: 2px;\n }\n\n .answer strong {\n font-weight: 600;\n }\n\n .answer a {\n color: var(--c-ink);\n text-underline-offset: 3px;\n }\n\n .answer code.inline {\n font-family: var(--c-mono);\n font-size: 12.5px;\n background: var(--c-hover);\n border-radius: calc(var(--c-r) * 0.75);\n padding: 1px 5px;\n }\n\n .answer h3.h1 {\n font-size: 18px;\n }\n\n .answer h3.h2 {\n font-size: 16.5px;\n }\n\n .answer h3.h4 {\n font-size: 14.5px;\n }\n\n .answer hr {\n width: 100%;\n border: none;\n border-top: 1px solid var(--c-line);\n margin: 4px 0;\n }\n\n .answer li.task {\n list-style: none;\n margin-left: -18px;\n }\n\n .answer li.task input {\n margin: 0 6px 0 0;\n vertical-align: -1px;\n accent-color: var(--c-brand);\n }\n\n .callout {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 13.5px;\n line-height: 1.6;\n padding: 10px 14px;\n border: 1px solid var(--c-line);\n border-left: 3px solid var(--callout, var(--c-ink));\n border-radius: var(--c-r2);\n background: color-mix(in srgb, var(--callout, var(--c-ink)) 7%, var(--c-bg));\n }\n\n .callout-title {\n font-weight: 600;\n color: var(--callout, var(--c-ink));\n }\n\n .callout.note {\n --callout: oklch(0.55 0.15 255);\n }\n\n .callout.tip {\n --callout: oklch(0.55 0.12 160);\n }\n\n .callout.important {\n --callout: oklch(0.52 0.17 300);\n }\n\n .callout.warning {\n --callout: oklch(0.6 0.14 70);\n }\n\n .callout.caution {\n --callout: var(--c-danger);\n }\n\n .jtree {\n padding: 10px 14px;\n overflow-x: auto;\n font-family: var(--c-mono);\n font-size: 12.5px;\n line-height: 1.7;\n }\n\n .jtree summary {\n cursor: pointer;\n list-style-position: outside;\n }\n\n .jkids {\n padding-left: 16px;\n border-left: 1px solid var(--c-line);\n margin-left: 4px;\n }\n\n .jkey {\n color: var(--c-ink2);\n }\n\n .jmeta {\n color: var(--c-muted);\n }\n\n .jv.string {\n color: oklch(0.52 0.12 160);\n }\n\n .jv.number {\n color: oklch(0.55 0.15 255);\n }\n\n .jv.boolean,\n .jv.null {\n color: oklch(0.52 0.17 300);\n }\n\n .table th button.sort {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font: inherit;\n color: inherit;\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n }\n\n .table th .arrow {\n font-size: 10px;\n opacity: 0.5;\n }\n\n .table th[aria-sort=\"ascending\"] .arrow,\n .table th[aria-sort=\"descending\"] .arrow {\n opacity: 1;\n }\n\n .table-note {\n padding: 7px 12px;\n font-size: 12px;\n color: var(--c-muted);\n border-top: 1px solid var(--c-line2);\n background: var(--c-bg2);\n }\n\n figure.svg {\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n align-items: flex-start;\n }\n\n figure.svg img {\n display: block;\n width: min(100%, 480px);\n height: auto;\n max-height: 420px;\n object-fit: contain;\n padding: 12px;\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n background: #ffffff;\n }\n\n .custom-block {\n min-width: 0;\n }\n\n .quote {\n font-size: 13.5px;\n line-height: 1.6;\n color: var(--c-ink2);\n background: var(--c-bg2);\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n padding: 10px 14px;\n }\n\n .code {\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n overflow: hidden;\n background: var(--c-bg2);\n }\n\n .code-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 7px 12px;\n border-bottom: 1px solid var(--c-line);\n }\n\n .code-head .label {\n font-size: 11px;\n }\n\n .text-btn {\n font-size: 12px;\n color: var(--c-muted);\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n }\n\n .text-btn:hover {\n color: var(--c-ink);\n }\n\n .text-btn.underline {\n text-decoration: underline;\n text-underline-offset: 3px;\n }\n\n .code pre {\n margin: 0;\n padding: 12px 14px;\n overflow-x: auto;\n font-family: var(--c-mono);\n font-size: 13px;\n line-height: 1.6;\n }\n\n .table {\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n overflow-x: auto;\n }\n\n .table table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n font-variant-numeric: tabular-nums;\n }\n\n .table th {\n text-align: left;\n font-size: 12px;\n font-weight: 500;\n color: var(--c-muted);\n background: var(--c-bg2);\n border-bottom: 1px solid var(--c-line);\n padding: 9px 12px;\n white-space: nowrap;\n }\n\n .table td {\n padding: 9px 12px;\n border-top: 1px solid var(--c-line2);\n white-space: nowrap;\n }\n\n .table th:first-child,\n .table td:first-child {\n min-width: 120px;\n }\n\n .cite {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 17px;\n height: 17px;\n padding: 0 4px;\n margin: 0 1px 0 3px;\n vertical-align: 2px;\n font: 500 10px var(--c-mono);\n border-radius: calc(var(--c-r) * 0.75);\n cursor: pointer;\n border: 1px solid var(--c-strong);\n background: var(--c-hover);\n color: var(--c-ink);\n }\n\n .cite:hover,\n .cite.active {\n background: var(--c-ink);\n color: var(--c-bg);\n border-color: var(--c-ink);\n }\n\n .chart {\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 14px;\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n padding: 14px 16px 12px;\n background: var(--c-bg);\n }\n\n .chart-head {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n justify-content: space-between;\n gap: 8px 16px;\n }\n\n .chart-title {\n font-size: 13px;\n font-weight: 600;\n }\n\n .legend {\n display: flex;\n flex-wrap: wrap;\n gap: 4px 12px;\n }\n\n .legend span {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--c-ink2);\n }\n\n .swatch {\n width: 8px;\n height: 8px;\n border-radius: 2px;\n }\n\n .bars {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .bar-row {\n display: grid;\n grid-template-columns: 92px minmax(0, 1fr) 64px;\n align-items: center;\n gap: 12px;\n }\n\n .bar-label {\n font-size: 12.5px;\n color: var(--c-ink2);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .bar-track {\n display: flex;\n height: 12px;\n background: var(--c-hover);\n border-radius: 2px;\n overflow: hidden;\n }\n\n .bar-fill {\n display: flex;\n height: 100%;\n transform-origin: left;\n animation: aiGrow 0.8s cubic-bezier(0.2, 0.8, 0.2, 1);\n }\n\n .bar-value {\n font-family: var(--c-mono);\n font-size: 11.5px;\n text-align: right;\n font-variant-numeric: tabular-nums;\n }\n\n .line-chart {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding-left: 48px;\n }\n\n .plot {\n position: relative;\n height: 170px;\n }\n\n .tick {\n position: absolute;\n left: 0;\n right: 0;\n border-top: 1px dashed var(--c-line2);\n }\n\n .tick.base {\n border-top: 1px solid var(--c-strong);\n }\n\n .tick span,\n .x-labels span {\n font-family: var(--c-mono);\n font-size: 10.5px;\n color: var(--c-faint);\n white-space: nowrap;\n font-variant-numeric: tabular-nums;\n }\n\n .tick span {\n position: absolute;\n right: calc(100% + 8px);\n top: -7px;\n }\n\n .plot svg {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n overflow: visible;\n }\n\n .plot polyline {\n fill: none;\n stroke-width: 2;\n vector-effect: non-scaling-stroke;\n stroke-linejoin: round;\n stroke-linecap: round;\n stroke-dasharray: 1;\n animation: aiDraw 1s ease-out;\n }\n\n .x-labels {\n display: flex;\n justify-content: space-between;\n gap: 4px;\n }\n\n .chart-pending {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 190px;\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n background: linear-gradient(90deg, var(--c-bg2) 0%, var(--c-hover) 50%, var(--c-bg2) 100%);\n background-size: 200% 100%;\n animation: aiShimmer 1.6s linear infinite;\n }\n\n .gallery {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: 10px;\n max-width: 520px;\n }\n\n .gallery.many {\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n max-width: 100%;\n }\n\n .gallery figure {\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n }\n\n .gallery img {\n width: 100%;\n aspect-ratio: 16 / 10;\n max-height: 320px;\n object-fit: contain;\n border-radius: var(--c-r2);\n border: 1px solid var(--c-line);\n background: var(--c-bg2);\n }\n\n .img-missing {\n aspect-ratio: 16 / 9;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--c-r2);\n border: 1px dashed var(--c-strong);\n background: repeating-linear-gradient(135deg, var(--c-bg2) 0 10px, var(--c-hover) 10px 20px);\n }\n\n figcaption {\n font-family: var(--c-mono);\n font-size: 11px;\n color: var(--c-muted);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .caret {\n display: inline-block;\n width: 7px;\n height: 15px;\n margin-top: -6px;\n background: var(--c-brand);\n animation: rgcaret 1s steps(1) infinite;\n }\n\n /* ── sources ──────────────────────────────────────────── */\n\n .retrieval {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--c-line);\n border-radius: var(--c-r2);\n background: var(--c-bg2);\n }\n\n .retrieval-toggle {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n text-align: left;\n font-size: 12.5px;\n color: var(--c-ink2);\n background: none;\n border: none;\n padding: 9px 12px;\n cursor: pointer;\n }\n\n .retrieval-toggle .chev,\n .retrieval-toggle .ms {\n font-family: var(--c-mono);\n font-size: 11px;\n color: var(--c-muted);\n }\n\n .retrieval-list {\n display: flex;\n flex-direction: column;\n border-top: 1px solid var(--c-line);\n padding: 4px 12px;\n }\n\n .passage {\n display: grid;\n grid-template-columns: 22px minmax(0, 1fr) 64px;\n align-items: center;\n gap: 10px;\n width: 100%;\n text-align: left;\n background: none;\n border: none;\n border-bottom: 1px solid var(--c-line2);\n padding: 8px 0;\n cursor: pointer;\n }\n\n .passage:last-child {\n border-bottom: none;\n }\n\n .passage .n,\n .passage .score {\n font-family: var(--c-mono);\n font-size: 11px;\n color: var(--c-muted);\n font-variant-numeric: tabular-nums;\n }\n\n .passage .what {\n display: flex;\n flex-direction: column;\n gap: 1px;\n min-width: 0;\n }\n\n .passage .what span:first-child {\n font-size: 12.5px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .passage .what span:last-child {\n font-size: 11.5px;\n color: var(--c-muted);\n }\n\n .relevance {\n display: flex;\n flex-direction: column;\n gap: 3px;\n align-items: flex-end;\n }\n\n .relevance-track {\n width: 64px;\n height: 3px;\n background: var(--c-line);\n border-radius: 99px;\n overflow: hidden;\n }\n\n .relevance-fill {\n display: block;\n height: 100%;\n background: var(--c-brand);\n }\n\n .cards {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .card-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n gap: 8px;\n }\n\n .source-card {\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n text-align: left;\n padding: 10px 12px;\n border-radius: var(--c-r2);\n cursor: pointer;\n background: var(--c-bg);\n border: 1px solid var(--c-line);\n }\n\n .source-card:hover,\n .source-card.active {\n border-color: var(--c-ink);\n }\n\n .source-card .top {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n }\n\n .num {\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: calc(var(--c-r) * 0.75);\n border: 1px solid var(--c-strong);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-family: var(--c-mono);\n font-size: 10px;\n background: var(--c-bg);\n }\n\n .source-card .nums {\n display: inline-flex;\n flex-wrap: wrap;\n gap: 3px;\n }\n\n .source-card .t {\n font-size: 13px;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .source-card .s {\n font-size: 12px;\n line-height: 1.45;\n color: var(--c-muted);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .panel {\n display: flex;\n flex-direction: column;\n min-height: 0;\n min-width: 0;\n background: var(--c-bg);\n border-left: 1px solid var(--c-line);\n animation: aiIn 0.15s ease-out;\n }\n\n .panel.docked {\n position: relative;\n flex: 0 0 400px;\n width: 400px;\n }\n\n .panel.overlay {\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: 30;\n width: min(420px, 100%);\n box-shadow: -12px 0 32px -16px rgba(22, 24, 26, 0.25);\n }\n\n .panel-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 14px 18px;\n border-bottom: 1px solid var(--c-line);\n }\n\n .panel-body {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 18px;\n }\n\n .panel-body h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n letter-spacing: -0.01em;\n }\n\n .panel-meta {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .panel-meta .path {\n font-family: var(--c-mono);\n font-size: 11px;\n color: var(--c-muted);\n overflow-wrap: anywhere;\n }\n\n .panel-meta .meta {\n font-size: 12px;\n color: var(--c-muted);\n }\n\n .passage-box {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px 14px;\n border-radius: var(--c-r2);\n background: var(--c-hover);\n border: 1px solid var(--c-strong);\n }\n\n /* The passage the reader clicked, among several from one document. */\n .passage-box.current {\n border-color: var(--c-ink);\n box-shadow: 0 0 0 1px var(--c-ink);\n }\n\n .passage-head {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n }\n\n .passage-box .text {\n font-size: 13px;\n line-height: 1.6;\n color: var(--c-ink2);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n }\n\n .passage-foot {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--c-line);\n }\n\n .copy-ref {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n background: var(--c-bg);\n border: 1px solid var(--c-line);\n border-radius: var(--c-r);\n padding: 4px 8px;\n cursor: pointer;\n }\n\n .copy-ref:hover {\n border-color: var(--c-strong);\n }\n\n .panel-foot {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 12px 18px 16px;\n border-top: 1px solid var(--c-line);\n }\n\n .chips {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n }\n\n .chip {\n font-size: 12px;\n background: var(--c-bg);\n border: 1px solid var(--c-line);\n border-radius: var(--c-r);\n padding: 4px 8px;\n cursor: pointer;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .chip:hover {\n border-color: var(--c-ink);\n }\n\n /* ── composer ─────────────────────────────────────────── */\n\n .composer-wrap {\n padding: 0 12px 12px;\n }\n\n .composer-wrap.reader {\n padding-top: 10px;\n }\n\n .composer-col {\n max-width: 760px;\n margin: 0 auto;\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .composer-box {\n position: relative;\n }\n\n .composer {\n position: relative;\n z-index: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 8px;\n border-radius: calc(var(--c-r) * 2.25);\n background: var(--c-bg);\n border: 1px solid var(--c-strong);\n box-shadow:\n 0 1px 2px rgba(22, 24, 26, 0.04),\n 0 12px 32px -18px rgba(22, 24, 26, 0.22);\n transition: border-color 0.15s;\n }\n\n .composer:focus-within {\n border-color: var(--c-ink);\n }\n\n .composer.busy {\n border-color: transparent;\n }\n\n :host([glow=\"off\"]) .composer.busy {\n border-color: var(--c-strong);\n }\n\n .composer textarea {\n width: 100%;\n resize: none;\n font: inherit;\n font-size: 14.5px;\n line-height: 1.5;\n color: var(--c-ink);\n background: transparent;\n border: none;\n outline: none;\n padding: 6px 6px 2px;\n max-height: 176px;\n }\n\n .composer textarea::placeholder {\n color: var(--c-faint);\n }\n\n .composer-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n }\n\n .attach {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12.5px;\n color: var(--c-muted);\n background: none;\n border: none;\n border-radius: var(--c-r);\n padding: 6px 8px;\n cursor: pointer;\n }\n\n .attach:hover {\n background: var(--c-hover);\n color: var(--c-ink);\n }\n\n .send {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border-radius: var(--c-r2);\n border: 1px solid var(--c-brand);\n cursor: pointer;\n background: var(--c-brand);\n color: var(--c-on-brand);\n transition: background 0.15s;\n }\n\n .send:disabled {\n cursor: default;\n background: var(--c-line);\n border-color: var(--c-line);\n color: var(--c-faint);\n }\n\n .send.stop {\n background: var(--c-bg);\n color: var(--c-ink);\n border-color: var(--c-ink);\n }\n\n .send.stop svg {\n fill: currentColor;\n stroke: none;\n }\n\n .pending-files {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n padding: 2px 2px 4px;\n }\n\n .pending-file {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 4px 8px 4px 4px;\n font-size: 12.5px;\n border-radius: var(--c-r2);\n border: 1px solid var(--c-line);\n background: var(--c-bg2);\n animation: aiIn 0.2s ease-out;\n }\n\n .pending-file .ext {\n width: 28px;\n height: 28px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--c-r);\n background: var(--c-bg);\n border: 1px solid var(--c-line);\n font-family: var(--c-mono);\n font-size: 9px;\n letter-spacing: 0.03em;\n color: var(--c-muted);\n }\n\n .pending-file .meta {\n display: flex;\n flex-direction: column;\n gap: 1px;\n min-width: 0;\n }\n\n .pending-file.kept {\n background: var(--c-bg);\n border-style: dashed;\n }\n\n .pending-file .name {\n max-width: 160px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .pending-file .size {\n font-family: var(--c-mono);\n font-size: 10.5px;\n color: var(--c-muted);\n }\n\n .pending-file button {\n font-size: 15px;\n line-height: 1;\n color: var(--c-muted);\n background: none;\n border: none;\n padding: 0 0 0 2px;\n cursor: pointer;\n }\n\n .pending-file button:hover {\n color: var(--c-danger);\n }\n\n .footnote {\n text-align: center;\n font-size: 11.5px;\n color: var(--c-muted);\n }\n\n .branding {\n padding: 0 12px 10px;\n margin-top: -4px;\n }\n\n .toast {\n position: absolute;\n left: 50%;\n bottom: 124px;\n transform: translateX(-50%);\n z-index: 35;\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 9px 14px;\n background: var(--c-ink);\n color: var(--c-bg);\n font-size: 13px;\n border-radius: var(--c-r2);\n box-shadow: 0 12px 32px -12px rgba(22, 24, 26, 0.25);\n white-space: nowrap;\n animation: aiIn 0.2s ease-out;\n }\n\n .toast button {\n font-size: 13px;\n font-weight: 500;\n color: var(--c-bg);\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n text-decoration: underline;\n text-underline-offset: 3px;\n }\n\n .drop {\n position: absolute;\n inset: 10px;\n z-index: 36;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 6px;\n text-align: center;\n padding: 16px;\n border: 1.5px dashed var(--c-ink);\n border-radius: var(--c-r3);\n background: color-mix(in srgb, var(--c-bg) 92%, transparent);\n }\n\n .drop strong {\n font-size: 15px;\n font-weight: 600;\n }\n\n .drop span {\n font-size: 12.5px;\n color: var(--c-muted);\n }\n\n /* ── AI glow ──────────────────────────────────────────── */\n\n .halo {\n position: absolute;\n inset: -18px -24px;\n z-index: 0;\n pointer-events: none;\n opacity: var(--c-glow);\n }\n\n .halo::before {\n content: \"\";\n position: absolute;\n inset: 0;\n border-radius: 20px;\n background: var(--c-conic);\n filter: blur(32px);\n opacity: 0.45;\n animation:\n aiSpin 5s linear infinite,\n aiBreathe 2.6s ease-in-out infinite;\n }\n\n .arrived {\n position: absolute;\n inset: -12px -16px;\n z-index: 0;\n pointer-events: none;\n border-radius: var(--c-r4);\n animation: aiDone 2.6s ease-out forwards;\n }\n\n .arrived .wash {\n position: absolute;\n inset: 0;\n border-radius: inherit;\n background: var(--c-conic);\n filter: blur(26px);\n opacity: calc(0.22 * var(--c-glow) + 0.06);\n animation: aiSpin 2.6s linear infinite;\n }\n\n .ring {\n position: absolute;\n inset: 0;\n border-radius: inherit;\n padding: 1px;\n background: var(--c-conic);\n -webkit-mask:\n linear-gradient(#000 0 0) content-box,\n linear-gradient(#000 0 0);\n -webkit-mask-composite: xor;\n mask-composite: exclude;\n animation: aiSpin 2.6s linear infinite;\n pointer-events: none;\n }\n\n .arrived .sweep {\n position: absolute;\n inset: 0;\n border-radius: inherit;\n overflow: hidden;\n }\n\n .arrived .sweep::before {\n content: \"\";\n position: absolute;\n inset: 0;\n background: linear-gradient(\n 100deg,\n transparent 25%,\n oklch(0.88 0.07 260 / 0.5) 50%,\n transparent 75%\n );\n animation: aiSweep 1.6s cubic-bezier(0.3, 0.6, 0.3, 1) forwards;\n }\n\n .pill {\n position: relative;\n display: inline-flex;\n align-self: flex-start;\n align-items: center;\n gap: 9px;\n padding: 6px 14px 6px 10px;\n border-radius: 999px;\n background: var(--c-bg);\n box-shadow: 0 0 24px -6px oklch(0.7 0.15 280 / 0.5);\n animation: aiIn 0.25s ease-out;\n }\n\n .pill .ring {\n border-radius: 999px;\n animation-duration: 2.4s;\n }\n\n .pill .dot {\n width: 9px;\n height: 9px;\n border-radius: 50%;\n background: var(--c-conic);\n animation:\n aiSpin 1.6s linear infinite,\n aiPulse 1.6s ease-in-out infinite;\n }\n\n .pill .shimmer {\n font-size: 12.5px;\n font-weight: 500;\n background: linear-gradient(90deg, var(--c-faint) 0%, var(--c-ink) 45%, var(--c-faint) 90%);\n background-size: 200% 100%;\n -webkit-background-clip: text;\n background-clip: text;\n color: transparent;\n animation: aiShimmer 1.8s linear infinite;\n }\n\n .composer-glow {\n position: absolute;\n inset: -4px;\n z-index: 0;\n border-radius: var(--c-r4);\n background: var(--c-conic);\n filter: blur(14px);\n opacity: calc(0.32 + 0.23 * (var(--c-glow) - 0.6) / 0.4);\n animation: aiSpin 4s linear infinite;\n pointer-events: none;\n }\n\n .composer-ring {\n position: absolute;\n inset: 0;\n z-index: 2;\n border-radius: calc(var(--c-r) * 2.25);\n pointer-events: none;\n }\n\n .composer-ring .ring {\n animation-duration: 3s;\n }\n\n :host([glow=\"off\"]) .halo,\n :host([glow=\"off\"]) .arrived,\n :host([glow=\"off\"]) .composer-glow,\n :host([glow=\"off\"]) .composer-ring,\n :host([glow=\"off\"]) .pill .ring {\n display: none;\n }\n\n :host([glow=\"off\"]) .pill {\n box-shadow: inset 0 0 0 1px var(--c-line);\n }\n\n :host([glow=\"off\"]) .pill .dot {\n background: var(--c-ink);\n }\n\n @keyframes aiSpin {\n to {\n --sb-ai-angle: 360deg;\n }\n }\n\n @keyframes aiShimmer {\n from {\n background-position: 200% 0;\n }\n to {\n background-position: -200% 0;\n }\n }\n\n @keyframes aiBreathe {\n 0%,\n 100% {\n transform: scale(0.97);\n }\n 50% {\n transform: scale(1.03);\n }\n }\n\n @keyframes aiPulse {\n 0%,\n 100% {\n transform: scale(0.8);\n }\n 50% {\n transform: scale(1.15);\n }\n }\n\n @keyframes aiDone {\n 0% {\n opacity: 0;\n }\n 12% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n }\n\n @keyframes aiSweep {\n from {\n transform: translateX(-100%);\n }\n to {\n transform: translateX(100%);\n }\n }\n\n @keyframes aiIn {\n from {\n opacity: 0;\n transform: translateY(4px);\n }\n to {\n opacity: 1;\n transform: none;\n }\n }\n\n @keyframes scaleIn {\n from {\n opacity: 0;\n transform: translateY(12px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: none;\n }\n }\n\n @keyframes slideIn {\n from {\n opacity: 0;\n transform: translateX(-8px);\n }\n to {\n opacity: 1;\n transform: none;\n }\n }\n\n @keyframes aiGrow {\n from {\n transform: scaleX(0);\n }\n }\n\n @keyframes aiDraw {\n from {\n stroke-dashoffset: 1;\n }\n to {\n stroke-dashoffset: 0;\n }\n }\n\n @keyframes rgcaret {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n }\n .caret {\n display: none;\n }\n }\n\n @media print {\n .sidebar,\n .scrim,\n .header-right,\n .composer-wrap,\n .branding,\n .toolbar,\n .followups,\n .panel,\n .toast {\n display: none !important;\n }\n .frame,\n .scroller {\n overflow: visible;\n height: auto;\n }\n }\n`;\n","/**\n * Default copy for <singlebase-chat>. Same contract as the auth and upload\n * bags: flat strings, overridable in whole or in part through `.messages`.\n *\n * `{name}`, `{n}` and `{query}` are filled in by `fill()` from upload-messages.\n */\nexport interface SinglebaseChatMessages {\n // welcome, per mode\n eyebrowChat: string;\n eyebrowRag: string;\n headingChat: string;\n headingRag: string;\n descriptionChat: string;\n descriptionRag: string;\n eyebrowKb: string;\n headingKb: string;\n descriptionKb: string;\n\n // composer\n placeholderChat: string;\n placeholderRag: string;\n placeholderKb: string;\n footnote: string;\n attach: string;\n send: string;\n stop: string;\n removeFile: string;\n inThisChat: string;\n removeFromChat: string;\n attachmentFailed: string;\n dropTitle: string;\n dropSub: string;\n\n // status pills\n thinking: string;\n searching: string;\n\n // sidebar\n chats: string;\n newChat: string;\n searchChats: string;\n groupBookmarked: string;\n groupToday: string;\n groupYesterday: string;\n groupWeek: string;\n groupOlder: string;\n noChats: string;\n noMatch: string;\n loadingChats: string;\n showChats: string;\n hideSidebar: string;\n\n // header\n untitled: string;\n renameChat: string;\n bookmarkChat: string;\n unbookmarkChat: string;\n exportChat: string;\n deleteChat: string;\n expand: string;\n restore: string;\n minimize: string;\n\n // export menu\n exportHeading: string;\n viewOptions: string;\n viewHeading: string;\n viewFollowups: string;\n viewSources: string;\n exportMarkdown: string;\n exportJson: string;\n exportText: string;\n exportCopy: string;\n\n // message toolbar\n copy: string;\n copied: string;\n edit: string;\n saveResend: string;\n cancel: string;\n regenerate: string;\n helpful: string;\n notHelpful: string;\n markedHelpful: string;\n thanksFeedback: string;\n bookmarkMessage: string;\n unbookmarkMessage: string;\n deleteMessage: string;\n saved: string;\n stopped: string;\n emptyReply: string;\n newReply: string;\n you: string;\n\n // sources\n sourcesCited: string;\n sourcesRetrieved: string;\n searchedSources: string;\n sourceLabel: string;\n openSource: string;\n citedPassage: string;\n passageCount: string;\n copyReference: string;\n alsoCited: string;\n close: string;\n\n // rendered blocks\n renderingChart: string;\n renderingSvg: string;\n copySvg: string;\n showRaw: string;\n showFormatted: string;\n showingRows: string;\n calloutNote: string;\n calloutTip: string;\n calloutImportant: string;\n calloutWarning: string;\n calloutCaution: string;\n\n // toasts\n undo: string;\n chatDeleted: string;\n messageDeleted: string;\n messageBookmarked: string;\n bookmarkRemoved: string;\n chatBookmarked: string;\n chatUnbookmarked: string;\n exported: string;\n copiedMarkdown: string;\n fileTooLarge: string;\n fileType: string;\n tooManyFiles: string;\n\n // errors\n errGeneric: string;\n errNotFound: string;\n errKbSource: string;\n errNoClient: string;\n errLoad: string;\n retry: string;\n offline: string;\n\n // launcher\n bubbleText: string;\n openChat: string;\n closeChat: string;\n dismiss: string;\n}\n\nexport const defaultChatMessages: SinglebaseChatMessages = {\n eyebrowChat: \"Chat\",\n eyebrowRag: \"Grounded answers\",\n headingChat: \"What can I help with?\",\n headingRag: \"Ask your knowledge base\",\n descriptionChat: \"Ask anything. Attach text files to give it more context.\",\n descriptionRag:\n \"Answers are grounded in your sources, with a citation for every claim. Attach text files to search them too.\",\n eyebrowKb: \"Knowledge base\",\n headingKb: \"Ask the knowledge base\",\n descriptionKb: \"Answers come only from the knowledge base, with a citation for every claim.\",\n\n placeholderChat: \"Message {name}…\",\n placeholderRag: \"Ask about your sources…\",\n placeholderKb: \"Ask the knowledge base…\",\n footnote: \"{name} can make mistakes. Check important details.\",\n attach: \"Attach files\",\n send: \"Send message\",\n stop: \"Stop generating\",\n removeFile: \"Remove file\",\n inThisChat: \"In this chat\",\n removeFromChat: \"Remove from this chat\",\n attachmentFailed: \"Couldn't read {name}.\",\n dropTitle: \"Drop files to attach\",\n dropSub: \"Text, Markdown, CSV and JSON files are added as context.\",\n\n thinking: \"Thinking\",\n searching: \"Searching sources\",\n\n chats: \"Chats\",\n newChat: \"New chat\",\n searchChats: \"Search chats\",\n groupBookmarked: \"Bookmarked\",\n groupToday: \"Today\",\n groupYesterday: \"Yesterday\",\n groupWeek: \"Previous 7 days\",\n groupOlder: \"Older\",\n noChats: \"No chats yet.\",\n noMatch: \"No chats match “{query}”.\",\n loadingChats: \"Loading chats\",\n showChats: \"Show chats\",\n hideSidebar: \"Hide sidebar\",\n\n untitled: \"New chat\",\n renameChat: \"Rename chat\",\n bookmarkChat: \"Bookmark chat\",\n unbookmarkChat: \"Remove chat bookmark\",\n exportChat: \"Export chat\",\n deleteChat: \"Delete chat\",\n expand: \"Expand\",\n restore: \"Restore size\",\n minimize: \"Minimize chat\",\n\n exportHeading: \"Export this chat\",\n viewOptions: \"View options\",\n viewHeading: \"Show in answers\",\n viewFollowups: \"Suggested questions\",\n viewSources: \"Sources\",\n exportMarkdown: \"Markdown\",\n exportJson: \"JSON\",\n exportText: \"Plain text\",\n exportCopy: \"Copy as Markdown\",\n\n copy: \"Copy\",\n copied: \"Copied\",\n edit: \"Edit and resend\",\n saveResend: \"Save & resend\",\n cancel: \"Cancel\",\n regenerate: \"Regenerate\",\n helpful: \"Helpful\",\n notHelpful: \"Not helpful\",\n markedHelpful: \"Marked helpful\",\n thanksFeedback: \"Thanks for the feedback\",\n bookmarkMessage: \"Bookmark message\",\n unbookmarkMessage: \"Remove bookmark\",\n deleteMessage: \"Delete message\",\n saved: \"Saved\",\n stopped: \"Stopped\",\n emptyReply: \"(empty response)\",\n newReply: \"New reply\",\n you: \"You\",\n\n sourcesCited: \"Cited sources\",\n sourcesRetrieved: \"Sources\",\n searchedSources: \"Searched {n} sources\",\n sourceLabel: \"Source {n}\",\n openSource: \"Open source {n}\",\n citedPassage: \"Cited passage\",\n passageCount: \"{n} passages\",\n copyReference: \"Copy passage with reference\",\n alsoCited: \"Also cited\",\n close: \"Close\",\n\n renderingChart: \"Rendering chart\",\n renderingSvg: \"Rendering drawing\",\n copySvg: \"Copy SVG\",\n showRaw: \"View raw\",\n showFormatted: \"View formatted\",\n showingRows: \"Showing {n} of {total} rows\",\n calloutNote: \"Note\",\n calloutTip: \"Tip\",\n calloutImportant: \"Important\",\n calloutWarning: \"Warning\",\n calloutCaution: \"Caution\",\n\n undo: \"Undo\",\n chatDeleted: \"Chat deleted\",\n messageDeleted: \"Message deleted\",\n messageBookmarked: \"Message bookmarked\",\n bookmarkRemoved: \"Bookmark removed\",\n chatBookmarked: \"Chat bookmarked\",\n chatUnbookmarked: \"Chat removed from bookmarks\",\n exported: \"Exported {name}\",\n copiedMarkdown: \"Copied as Markdown\",\n fileTooLarge: \"{name} is larger than {size}.\",\n fileType: \"{name} isn't a text file.\",\n tooManyFiles: \"Attach up to {n} files at a time.\",\n\n errGeneric: \"Something went wrong.\",\n errNotFound: \"This chat no longer exists. Retry to start a new one.\",\n errKbSource: \"No knowledge base is set up for this chat.\",\n errNoClient: \"Chat isn't connected. Create a SinglebaseClient() on this page.\",\n errLoad: \"Couldn't load this chat.\",\n retry: \"Retry\",\n offline: \"You're offline. Messages will send when you reconnect.\",\n\n bubbleText: \"Hi! Questions? Ask me here.\",\n openChat: \"Open chat\",\n closeChat: \"Close chat\",\n dismiss: \"Dismiss\"\n};\n\nexport function resolveChatMessages(\n overrides: Partial<SinglebaseChatMessages> | undefined\n): SinglebaseChatMessages {\n return { ...defaultChatMessages, ...(overrides ?? {}) };\n}\n","/**\n * The Markdown <singlebase-chat> renders, parsed into plain blocks. Nothing\n * here produces HTML: the element turns blocks into Lit templates, so model\n * output is always text, never markup.\n *\n * Blocks: paragraphs, `#`–`####` headings, nested `-`/`*`/`1.` lists and task\n * lists, `>` quotes, `> [!NOTE]` callouts, `---` rules, pipe tables (with\n * alignment), `` images, and fenced code. Fences with a known\n * language become richer blocks: ```chart, ```csv / ```tsv, ```json,\n * ```callout and ```svg.\n *\n * Inline: `**bold**`, `*italic*` / `_italic_`, `~~strike~~`, `` `code` ``,\n * `[text](https://…)`, bare https links and `[n]` citations.\n */\n\nexport interface ChartSeries {\n name: string;\n values: number[];\n}\n\nexport interface ChartSpec {\n type: \"bar\" | \"line\";\n title: string;\n unit: string;\n labels: string[];\n series: ChartSeries[];\n}\n\nexport interface ImageRef {\n alt: string;\n src: string;\n}\n\nexport interface ListItem {\n text: string;\n /** Nesting level, 0 for top-level items. */\n depth: number;\n /** A task list item's state, or null for an ordinary item. */\n checked: boolean | null;\n}\n\nexport type Align = \"left\" | \"center\" | \"right\" | null;\nexport type CalloutKind = \"note\" | \"tip\" | \"important\" | \"warning\" | \"caution\";\n\nexport type Block =\n | { type: \"p\"; text: string }\n | { type: \"h\"; level: number; text: string }\n | { type: \"list\"; ordered: boolean; items: ListItem[] }\n | { type: \"quote\"; text: string }\n | { type: \"hr\" }\n | { type: \"code\"; lang: string; text: string }\n | { type: \"table\"; head: string[]; rows: string[][]; align: Align[] }\n | { type: \"chart\"; spec: ChartSpec }\n | { type: \"json\"; value: unknown; source: string }\n | { type: \"callout\"; kind: CalloutKind; title: string; text: string }\n | { type: \"svg\"; source: string }\n | { type: \"img\"; images: ImageRef[] }\n | { type: \"pending\"; kind: \"chart\" | \"svg\" }\n | { type: \"raw\"; text: string };\n\nexport type Segment =\n | { type: \"text\"; text: string }\n | { type: \"bold\"; text: string }\n | { type: \"italic\"; text: string }\n | { type: \"strike\"; text: string }\n | { type: \"code\"; text: string }\n | { type: \"link\"; text: string; href: string }\n | { type: \"cite\"; n: number };\n\n/**\n * How much of a reply is formatted. `raw` shows the text exactly as written,\n * `plain` is text with light formatting, `advanced` adds tables, CSV, JSON and\n * SVG, and `rich` adds callouts, charts, images and the host's own blocks.\n */\nexport type ChatFormat = \"raw\" | \"plain\" | \"advanced\" | \"rich\";\n\nconst TABLE_ROW = /^\\|.*\\|$/;\nconst TABLE_RULE = /^\\|[\\s:|-]+\\|$/;\nconst IMAGE_LINE = /^!\\[([^\\]]*)\\]\\(([^)]*)\\)$/;\nconst LIST_ITEM = /^(\\s*)([-*+]|\\d+[.)])\\s+(.*)$/;\nconst TASK = /^\\[( |x|X)\\]\\s+/;\nconst RULE = /^(-{3,}|\\*{3,}|_{3,})$/;\nconst ALERT = /^\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\]\\s*(.*)$/i;\nconst CALLOUT_KINDS: CalloutKind[] = [\"note\", \"tip\", \"important\", \"warning\", \"caution\"];\n\n/** Parses `text` into blocks. An unclosed fence is still streaming. */\nexport function parseMarkdown(text: string): Block[] {\n const blocks: Block[] = [];\n const parts = (text ?? \"\").replace(/\\r/g, \"\").split(\"```\");\n\n parts.forEach((part, index) => {\n if (index % 2 === 1) {\n const newline = part.indexOf(\"\\n\");\n const info = (newline > -1 ? part.slice(0, newline) : part).trim();\n const body = (newline > -1 ? part.slice(newline + 1) : \"\").replace(/\\n$/, \"\");\n blocks.push(fencedBlock(info, body, index === parts.length - 1));\n return;\n }\n\n for (const chunk of part.split(/\\n{2,}/)) {\n if (!chunk.trim()) continue;\n blocks.push(...parseChunk(chunk));\n }\n });\n\n return blocks;\n}\n\nfunction fencedBlock(info: string, body: string, open: boolean): Block {\n const [word = \"\", ...rest] = info.split(/\\s+/);\n const lang = word.toLowerCase();\n\n if (lang === \"chart\") {\n const spec = open ? null : parseChart(body);\n return spec ? { type: \"chart\", spec } : { type: \"pending\", kind: \"chart\" };\n }\n if (lang === \"svg\") {\n return open || !/<svg[\\s>]/i.test(body)\n ? { type: \"pending\", kind: \"svg\" }\n : { type: \"svg\", source: body.trim() };\n }\n if (!open && (lang === \"csv\" || lang === \"tsv\")) {\n const rows = parseDelimited(body, lang === \"tsv\" ? \"\\t\" : \",\");\n if (rows.length > 1) {\n return { type: \"table\", head: rows[0], rows: rows.slice(1), align: rows[0].map(() => null) };\n }\n }\n if (!open && lang === \"json\") {\n try {\n return { type: \"json\", value: JSON.parse(body), source: body };\n } catch {\n /* not valid JSON: show it as code */\n }\n }\n if (lang === \"callout\") {\n const kind = (rest[0] ?? \"\").toLowerCase() as CalloutKind;\n const known = CALLOUT_KINDS.includes(kind);\n return {\n type: \"callout\",\n kind: known ? kind : \"note\",\n title: (known ? rest.slice(1) : rest).join(\" \"),\n text: body.trim()\n };\n }\n return { type: \"code\", lang: lang || \"code\", text: body };\n}\n\nfunction parseChunk(chunk: string): Block[] {\n const raw = chunk.split(\"\\n\").filter((line) => line.trim());\n const lines = raw.map((line) => line.trim());\n\n if (lines.length > 1 && lines.every((line) => TABLE_ROW.test(line))) {\n const cells = (line: string) =>\n line\n .replace(/^\\||\\|$/g, \"\")\n .split(\"|\")\n .map((cell) => cell.trim());\n const ruleIndex = lines.findIndex((line) => TABLE_RULE.test(line));\n const align: Align[] =\n ruleIndex > -1\n ? cells(lines[ruleIndex]).map((cell) =>\n /^:-+:$/.test(cell)\n ? \"center\"\n : /^-+:$/.test(cell)\n ? \"right\"\n : /^:-+$/.test(cell)\n ? \"left\"\n : null\n )\n : [];\n const rows = lines.filter((line) => !TABLE_RULE.test(line)).map(cells);\n const head = rows[0] ?? [];\n return [\n { type: \"table\", head, rows: rows.slice(1), align: head.map((_, i) => align[i] ?? null) }\n ];\n }\n\n if (lines.length === 1 && RULE.test(lines[0])) return [{ type: \"hr\" }];\n\n if (lines.every((line) => IMAGE_LINE.test(line))) {\n return [\n {\n type: \"img\",\n images: lines.map((line) => {\n const match = line.match(IMAGE_LINE)!;\n return { alt: match[1], src: match[2] };\n })\n }\n ];\n }\n\n if (lines.every((line) => line.startsWith(\">\"))) {\n const body = lines.map((line) => line.replace(/^>\\s?/, \"\"));\n const alert = body[0].match(ALERT);\n if (alert) {\n return [\n {\n type: \"callout\",\n kind: alert[1].toLowerCase() as CalloutKind,\n title: alert[2].trim(),\n text: body.slice(1).join(\"\\n\").trim()\n }\n ];\n }\n return [{ type: \"quote\", text: body.join(\" \") }];\n }\n\n if (LIST_ITEM.test(raw[0])) {\n const items: ListItem[] = [];\n for (const line of raw) {\n const match = line.match(LIST_ITEM);\n if (match) {\n const task = match[3].match(TASK);\n items.push({\n text: task ? match[3].replace(TASK, \"\") : match[3],\n depth: Math.min(3, Math.floor(match[1].replace(/\\t/g, \" \").length / 2)),\n checked: task ? task[1] !== \" \" : null\n });\n } else {\n // A wrapped line belongs to the item above it.\n items[items.length - 1].text += ` ${line.trim()}`;\n }\n }\n return [{ type: \"list\", ordered: /^\\s*\\d/.test(raw[0]), items }];\n }\n\n // A heading followed by more lines in the same chunk: split it off.\n const heading = lines[0].match(/^(#{1,4})\\s+(.*)$/);\n if (heading) {\n const rest = raw.slice(1).join(\"\\n\");\n return [\n { type: \"h\", level: heading[1].length, text: heading[2] },\n ...(rest ? parseChunk(rest) : [])\n ];\n }\n\n return [{ type: \"p\", text: lines.join(\" \") }];\n}\n\n/** CSV/TSV with quoted fields. Rows are padded to the header's width. */\nexport function parseDelimited(body: string, separator = \",\"): string[][] {\n const rows: string[][] = [];\n let row: string[] = [];\n let field = \"\";\n let quoted = false;\n const text = body.replace(/\\r/g, \"\");\n\n for (let i = 0; i < text.length; i++) {\n const c = text[i];\n if (quoted) {\n if (c === '\"' && text[i + 1] === '\"') {\n field += '\"';\n i++;\n } else if (c === '\"') quoted = false;\n else field += c;\n } else if (c === '\"' && field === \"\") quoted = true;\n else if (c === separator) {\n row.push(field.trim());\n field = \"\";\n } else if (c === \"\\n\") {\n row.push(field.trim());\n if (row.some(Boolean)) rows.push(row);\n row = [];\n field = \"\";\n } else field += c;\n }\n row.push(field.trim());\n if (row.some(Boolean)) rows.push(row);\n\n const width = rows[0]?.length ?? 0;\n return rows.map((r) => (r.length < width ? [...r, ...Array(width - r.length).fill(\"\")] : r));\n}\n\n/** A ```chart body, or null when it is not a usable spec. */\nexport function parseChart(body: string): ChartSpec | null {\n let raw: any;\n try {\n raw = JSON.parse(body);\n } catch {\n return null;\n }\n if (!raw || typeof raw !== \"object\") return null;\n const series = (Array.isArray(raw.series) ? raw.series : [])\n .filter((entry: any) => entry && Array.isArray(entry.values))\n .map((entry: any, index: number) => ({\n name: String(entry.name ?? `Series ${index + 1}`),\n values: entry.values.map((value: unknown) => Number(value) || 0)\n }));\n if (!series.length) return null;\n const labels = Array.isArray(raw.labels)\n ? raw.labels.map(String)\n : series[0].values.map((_: number, i: number) => String(i + 1));\n return {\n type: raw.type === \"line\" ? \"line\" : \"bar\",\n title: String(raw.title ?? \"\"),\n unit: String(raw.unit ?? \"\"),\n labels,\n series\n };\n}\n\nconst INLINE = new RegExp(\n [\n /\\*\\*([^*]+)\\*\\*/.source, // 1 bold\n /~~([^~]+)~~/.source, // 2 strike\n /`([^`]+)`/.source, // 3 code\n /\\[([^\\]]+)\\]\\((https?:\\/\\/[^)\\s]+)\\)/.source, // 4, 5 link\n /(https?:\\/\\/[^\\s<>()]*[^\\s<>().,;:!?'\"\\]])/.source, // 6 bare link\n /(?<![\\w*])\\*(?![\\s*])([^*\\n]+?)\\*(?![\\w*])/.source, // 7 *italic*\n /(?<![\\w_])_(?![\\s_])([^_\\n]+?)_(?![\\w_])/.source, // 8 _italic_\n /\\s?\\[(\\d+(?:\\s*,\\s*\\d+)*)\\]/.source // 9 citation\n ].join(\"|\"),\n \"g\"\n);\n\n/**\n * Inline segments of one line. Citations only become chips when `maxCite`\n * is at least the cited number; anything else stays literal text.\n */\nexport function parseInline(text: string, maxCite = 0): Segment[] {\n const out: Segment[] = [];\n let last = 0;\n let match: RegExpExecArray | null;\n INLINE.lastIndex = 0;\n\n const pushText = (value: string) => {\n if (!value) return;\n const prev = out[out.length - 1];\n if (prev?.type === \"text\") prev.text += value;\n else out.push({ type: \"text\", text: value });\n };\n\n while ((match = INLINE.exec(text))) {\n pushText(text.slice(last, match.index));\n if (match[1] !== undefined) out.push({ type: \"bold\", text: match[1] });\n else if (match[2] !== undefined) out.push({ type: \"strike\", text: match[2] });\n else if (match[3] !== undefined) out.push({ type: \"code\", text: match[3] });\n else if (match[4] !== undefined) out.push({ type: \"link\", text: match[4], href: match[5] });\n else if (match[6] !== undefined) out.push({ type: \"link\", text: match[6], href: match[6] });\n else if (match[7] !== undefined) out.push({ type: \"italic\", text: match[7] });\n else if (match[8] !== undefined) out.push({ type: \"italic\", text: match[8] });\n else {\n const numbers = match[9].split(\",\").map((n) => Number(n.trim()));\n const valid = numbers.filter((n) => n >= 1 && n <= maxCite);\n if (!maxCite) pushText(match[0]);\n else valid.forEach((n) => out.push({ type: \"cite\", n }));\n }\n last = match.index + match[0].length;\n }\n pushText(text.slice(last));\n return out;\n}\n\n/**\n * Tidies the tail of a reply that is still arriving, so half-written syntax\n * doesn't flash on screen: an unfinished table row, link or image is held\n * back, and an unpaired `**`, `~~` or backtick is dropped until its partner\n * arrives. Only the last paragraph outside a code fence is touched.\n */\nexport function settleStreaming(text: string): string {\n if (((text ?? \"\").match(/```/g) ?? []).length % 2 === 1) return text;\n const cut = text.lastIndexOf(\"\\n\\n\");\n const head = cut > -1 ? text.slice(0, cut + 2) : \"\";\n let tail = cut > -1 ? text.slice(cut + 2) : text;\n\n const lines = tail.split(\"\\n\");\n const last = lines[lines.length - 1];\n if (last.trimStart().startsWith(\"|\") && !last.trimEnd().endsWith(\"|\")) lines.pop();\n tail = lines.join(\"\\n\");\n\n tail = tail.replace(/!?\\[[^\\]\\n]*(\\]\\([^)\\n]*)?$/, \"\");\n for (const marker of [\"**\", \"~~\", \"`\"]) {\n const count = tail.split(marker).length - 1;\n if (count % 2 === 1) {\n const at = tail.lastIndexOf(marker);\n tail = tail.slice(0, at) + tail.slice(at + marker.length);\n }\n }\n return head + tail;\n}\n\n/** Every citation number used in `text`. */\nexport function citedNumbers(text: string): Set<number> {\n const found = new Set<number>();\n for (const group of (text ?? \"\").match(/\\[(\\d+(?:\\s*,\\s*\\d+)*)\\]/g) ?? []) {\n group\n .replace(/[[\\]]/g, \"\")\n .split(\",\")\n .forEach((n) => found.add(Number(n.trim())));\n }\n return found;\n}\n\nfunction chartRows(spec: ChartSpec): string[][] {\n return [\n [\"\", ...spec.series.map((s) => s.name)],\n ...spec.labels.map((label, i) => [\n label,\n ...spec.series.map((s) => (s.values[i] === undefined ? \"\" : `${s.values[i]}${spec.unit}`))\n ])\n ];\n}\n\nconst rowsText = (rows: string[][]) => rows.map((r) => r.join(\" · \")).join(\"\\n\");\nconst CALLOUT_LABELS: Record<CalloutKind, string> = {\n note: \"Note\",\n tip: \"Tip\",\n important: \"Important\",\n warning: \"Warning\",\n caution: \"Caution\"\n};\n\n/**\n * Applies the format level. Blocks a level doesn't draw become the nearest\n * thing it does, so nothing the model wrote is ever lost:\n *\n * - `rich`: everything as written.\n * - `advanced`: tables, CSV, JSON and SVG; charts become data tables,\n * callouts become quotes, images become \"Image: alt\".\n * - `plain`: text only; tables become plain rows, data and SVG become code.\n *\n * `raw` never gets here: the element shows the text without parsing it.\n */\nexport function adaptBlocks(blocks: Block[], level: Exclude<ChatFormat, \"raw\">): Block[] {\n if (level === \"rich\") return blocks;\n const simple = level === \"plain\";\n\n return blocks.map((block): Block => {\n switch (block.type) {\n case \"chart\": {\n const [head, ...rows] = chartRows(block.spec);\n if (simple) {\n return {\n type: \"raw\",\n text: [block.spec.title, rowsText([head, ...rows])].filter(Boolean).join(\"\\n\")\n };\n }\n return {\n type: \"table\",\n head: block.spec.title ? [block.spec.title, ...head.slice(1)] : head,\n rows,\n align: head.map(() => null)\n };\n }\n case \"pending\":\n return block.kind === \"svg\" && !simple ? block : { type: \"raw\", text: \"\" };\n case \"callout\":\n return {\n type: \"quote\",\n text: `**${block.title || CALLOUT_LABELS[block.kind]}** ${block.text}`.trim()\n };\n case \"img\":\n return {\n type: \"p\",\n text: block.images.map((image) => `Image: ${image.alt || \"untitled\"}`).join(\" · \")\n };\n case \"table\":\n return simple ? { type: \"raw\", text: rowsText([block.head, ...block.rows]) } : block;\n case \"json\":\n return simple ? { type: \"code\", lang: \"json\", text: block.source } : block;\n case \"svg\":\n return simple ? { type: \"code\", lang: \"svg\", text: block.source } : block;\n default:\n return block;\n }\n });\n}\n\n/**\n * Splits the `FOLLOWUPS:` tail the model is asked to write off the visible\n * answer. Questions may be `|`-separated or one per line.\n */\nexport function splitFollowups(content: string): { text: string; followups: string[] } {\n const source = content ?? \"\";\n const index = source.search(/FOLLOWUPS:/i);\n if (index < 0) return { text: source.trim(), followups: [] };\n const tail = source.slice(index).replace(/^FOLLOWUPS:/i, \"\");\n const followups = tail\n .split(/\\||\\n/)\n .map((q) => q.replace(/^\\s*(?:[-*↳→]|\\d+[.)])\\s*/, \"\").trim())\n .filter(Boolean)\n .slice(0, 3);\n return { text: source.slice(0, index).trim(), followups };\n}\n\n/** A one-line plain rendering, for snippets and search. */\nexport function plainText(text: string): string {\n return (text ?? \"\")\n .replace(/```(\\w*)[\\s\\S]*?(```|$)/g, (_m, lang) =>\n lang === \"chart\" ? \"[Chart] \" : lang === \"svg\" ? \"[Drawing] \" : \"[Code] \"\n )\n .replace(/!\\[([^\\]]*)\\]\\([^)]*\\)/g, \"[Image: $1]\")\n .replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^)\\s]+)\\)/g, \"$1\")\n .replace(/\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\]/gi, \"\")\n .replace(/[*#>`~]/g, \"\")\n .replace(/\\|/g, \" \")\n .replace(/\\s?\\[\\d+(?:\\s*,\\s*\\d+)*\\]/g, \"\")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\n/** The first message, cut at a word boundary: a title until a better one lands. */\nexport function provisionalTitle(text: string, max = 48): string {\n const clean = plainText(text);\n if (clean.length <= max) return clean;\n const cut = clean.slice(0, max);\n const space = cut.lastIndexOf(\" \");\n return (space > max / 2 ? cut.slice(0, space) : cut).trim();\n}\n\n/** A model-written title: no quotes, no trailing punctuation, 80 characters. */\nexport function cleanTitle(value: unknown): string {\n return String(value ?? \"\")\n .split(\"\\n\")[0]\n .trim()\n .replace(/^[\"'“”‘’]+|[\"'“”‘’]+$/g, \"\")\n .replace(/^title:\\s*/i, \"\")\n .replace(/[.!?:;,]+$/, \"\")\n .trim()\n .slice(0, 80);\n}\n\n/** Only these reach an `<img src>` or a link: no javascript:, no stray schemes. */\nexport function isSafeUrl(url: string, image = false): boolean {\n if (/^https?:\\/\\//i.test(url)) return true;\n return image && /^(blob:|data:image\\/)/i.test(url);\n}\n","/**\n * Model-written SVG, made safe to show.\n *\n * The real protection is how it's shown: as an `<img>` data URL, where the\n * browser runs no scripts and loads no external resources. On top of that\n * the markup is cleaned, so what we hand the browser has no scripts, event\n * handlers, embedded HTML or outside references to begin with.\n */\n\nconst MAX_SVG_BYTES = 200_000;\n\nconst DROP_ELEMENTS = new Set([\n \"script\",\n \"foreignobject\",\n \"iframe\",\n \"object\",\n \"embed\",\n \"image\",\n \"audio\",\n \"video\",\n \"animate\",\n \"set\",\n \"animatemotion\",\n \"animatetransform\",\n \"handler\",\n \"listener\"\n]);\n\n/** The cleaned SVG as a data URL for `<img src>`, or null when it isn't usable. */\nexport function svgDataUrl(source: string): string | null {\n if (!source || source.length > MAX_SVG_BYTES || typeof DOMParser === \"undefined\") return null;\n\n const doc = new DOMParser().parseFromString(source, \"image/svg+xml\");\n const root = doc.documentElement;\n if (!root || root.nodeName.toLowerCase() !== \"svg\" || doc.querySelector(\"parsererror\")) {\n return null;\n }\n\n const walk = (el: Element) => {\n for (const child of Array.from(el.children)) {\n const name = child.nodeName.toLowerCase();\n if (DROP_ELEMENTS.has(name)) child.remove();\n else if (name === \"a\") {\n // Links can't work inside an image; keep what they wrap.\n const inner = Array.from(child.childNodes);\n child.replaceWith(...inner);\n inner.forEach((node) => node instanceof Element && walk(node));\n } else walk(child);\n }\n for (const attr of Array.from(el.attributes)) {\n const name = attr.name.toLowerCase();\n const value = attr.value.trim().toLowerCase();\n const external = (name === \"href\" || name.endsWith(\":href\")) && !value.startsWith(\"#\");\n const scripted = value.includes(\"javascript:\") || /url\\(\\s*['\"]?(?!#)/.test(value);\n if (name.startsWith(\"on\") || external || scripted) el.removeAttribute(attr.name);\n }\n };\n walk(root);\n // <style> may pull in outside resources; keep its rules, drop any url() or @import.\n for (const style of Array.from(root.querySelectorAll(\"style\"))) {\n style.textContent = (style.textContent ?? \"\")\n .replace(/@import[^;]*;?/gi, \"\")\n .replace(/url\\(\\s*['\"]?(?!#)[^)]*\\)/gi, \"none\");\n }\n\n root.setAttribute(\"xmlns\", \"http://www.w3.org/2000/svg\");\n const markup = new XMLSerializer().serializeToString(root);\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(markup)}`;\n}\n","import { LitElement, html, nothing, svg, type PropertyValues, type TemplateResult } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport { getDefaultClient } from \"@singlebase/core\";\nimport type { SinglebaseClientInstance } from \"@singlebase/singlebase-sdk\";\nimport { tokenDefaults } from \"../styles/tokens.js\";\nimport { chatStyles } from \"../styles/chat.js\";\nimport { brandingStyles } from \"../styles/branding.js\";\nimport { renderBranding } from \"../utils/branding.js\";\nimport { resolveChatMessages, type SinglebaseChatMessages } from \"../chat-messages.js\";\nimport { fill } from \"../upload-messages.js\";\nimport { formatSize } from \"../utils/files.js\";\nimport {\n adaptBlocks,\n citedNumbers,\n cleanTitle,\n isSafeUrl,\n parseInline,\n parseMarkdown,\n plainText,\n provisionalTitle,\n settleStreaming,\n splitFollowups,\n type Block,\n type ChartSpec,\n type ListItem,\n type ChatFormat\n} from \"../utils/markdown.js\";\nimport { svgDataUrl } from \"../utils/svg.js\";\n\n// ── public types ───────────────────────────────────────────\n\n/**\n * How answers use sources: `chat` free-form, `rag` prefers sources and cites\n * them, `kb` answers only from sources (docsets, retrieval, attachments).\n */\nexport type ChatMode = \"chat\" | \"rag\" | \"kb\";\nexport type ChatEmbed = \"page\" | \"inline\" | \"launcher\";\nexport type ChatGlow = \"subtle\" | \"vivid\" | \"off\";\nexport type ChatExportFormat = \"md\" | \"txt\" | \"json\" | \"copy\";\n/** `auto` docks when there's room; `none` removes the list and its toggle. */\nexport type ChatSidebar = \"auto\" | \"open\" | \"closed\" | \"none\";\n\n/** What the chat needs from a client: `llm.call`, and nothing else. */\nexport type ChatClient = {\n llm: {\n call<T = unknown>(\n method: string,\n payload?: unknown,\n options?: { signal?: AbortSignal }\n ): Promise<T>;\n };\n};\n\n/** A row of `llm.list_chats`. */\nexport interface ChatSummary {\n _id: string;\n title: string | null;\n /** The caller-chosen key this chat can also be opened by. */\n key?: string | null;\n bookmarked?: boolean;\n message_count?: number;\n _created_at?: string;\n _modified_at?: string;\n}\n\n/** A text file attached to one message, sent to the model as retrieval. */\nexport interface ChatAttachment {\n name: string;\n size: number;\n content: string;\n mime?: string;\n}\n\n/** A file the service keeps on the chat (attachments-mode=\"payload\"). */\nexport interface ChatSavedAttachment {\n id: string;\n name: string;\n type?: string;\n mime?: string;\n size?: number;\n status?: string;\n}\n\nexport interface ChatMessage {\n /** Local identity, stable across renders. */\n key: string;\n /** The server's message id, once known. Bookmark and delete need it. */\n id: string | null;\n role: \"user\" | \"assistant\";\n /** The text. For replies, the FOLLOWUPS tail is already split off. */\n content: string;\n at: number;\n bookmarked: boolean;\n /** Retrieved documents the reply used, as the server recorded them. */\n sources: Record<string, unknown>[];\n followups: string[];\n phase: \"pending\" | \"streaming\" | \"done\" | \"error\";\n error?: string;\n stopped?: boolean;\n feedback?: \"up\" | \"down\";\n attachments?: ChatAttachment[];\n execTime?: number;\n model?: string;\n}\n\n/**\n * Draws a fenced block the host knows about, e.g. ```order {\"id\":\"A-1\"}```.\n * Return a Lit template, a DOM node or text; return null to fall back to code.\n */\nexport type ChatBlockRenderer = (\n source: string,\n context: { lang: string; message: ChatMessage }\n) => unknown;\n\n/**\n * Runs before each message is sent. Return the payload (changed or not), a new\n * payload, or `false` to cancel. Anything else stops the send.\n */\nexport type ChatBeforeSend = (\n payload: Record<string, unknown>,\n context: { chatId: string | null; isNew: boolean; message: ChatMessage }\n) => Record<string, unknown> | false | Promise<Record<string, unknown> | false>;\n\n/** Runs after a reply is parsed. Return the blocks to draw. */\nexport type ChatAfterParse = (\n blocks: Block[],\n context: { message: ChatMessage; format: ChatFormat }\n) => Block[];\n\nexport interface ChatPrompt {\n label?: string;\n text: string;\n}\n\n/** Every setting in one object, keyed by property name. */\nexport interface ChatConfig {\n /** The client to chat with. Defaults to the page's SinglebaseClient(). */\n client: ChatClient | null;\n /** Opens this saved chat. */\n chatId: string;\n chatKey: string;\n embed: ChatEmbed;\n mode: ChatMode;\n format: ChatFormat;\n renderers: Record<string, ChatBlockRenderer>;\n beforeSend: ChatBeforeSend | null;\n afterParse: ChatAfterParse | null;\n glow: ChatGlow;\n position: \"right\" | \"left\";\n sidebar: ChatSidebar;\n showTitle: boolean;\n assistantName: string;\n logoUrl: string;\n heading: string;\n description: string;\n eyebrow: string;\n prompts: string | (string | ChatPrompt)[];\n bubbleText: string;\n greetingBubble: boolean;\n unreadBadge: boolean;\n allowUpload: boolean;\n allowExport: boolean;\n allowRaw: boolean;\n allowCopy: boolean;\n allowRegenerate: boolean;\n allowBookmark: boolean;\n allowDelete: boolean;\n allowRename: boolean;\n allowFeedback: boolean;\n showTime: boolean;\n showComposer: boolean;\n footnote: string;\n branding: boolean;\n followups: boolean;\n docsets: string | string[];\n attachmentsMode: \"retrieval\" | \"payload\";\n saveAttachments: boolean;\n showFollowups: boolean;\n showSources: boolean;\n allowViewOptions: boolean;\n showNewChat: boolean;\n showBookmarked: boolean;\n allowSearch: boolean;\n autoTitle: boolean;\n model: string;\n params: Record<string, unknown>;\n systemMessage: string;\n retrieval: Record<string, unknown>[];\n metadata: Record<string, unknown>;\n messages: Partial<SinglebaseChatMessages>;\n theme: \"light\" | \"dark\";\n radius: \"sharp\" | \"default\" | \"round\";\n}\n\nconst CONFIG_KEYS: readonly (keyof ChatConfig)[] = [\n \"embed\",\n \"mode\",\n \"format\",\n \"renderers\",\n \"beforeSend\",\n \"afterParse\",\n \"glow\",\n \"position\",\n \"sidebar\",\n \"showTitle\",\n \"assistantName\",\n \"logoUrl\",\n \"heading\",\n \"description\",\n \"eyebrow\",\n \"prompts\",\n \"chatKey\",\n \"bubbleText\",\n \"greetingBubble\",\n \"unreadBadge\",\n \"allowUpload\",\n \"allowExport\",\n \"allowRaw\",\n \"allowCopy\",\n \"allowRegenerate\",\n \"allowBookmark\",\n \"allowDelete\",\n \"allowRename\",\n \"allowFeedback\",\n \"showTime\",\n \"showComposer\",\n \"footnote\",\n \"branding\",\n \"followups\",\n \"docsets\",\n \"attachmentsMode\",\n \"saveAttachments\",\n \"showFollowups\",\n \"showSources\",\n \"allowViewOptions\",\n \"showNewChat\",\n \"showBookmarked\",\n \"allowSearch\",\n \"autoTitle\",\n \"model\",\n \"params\",\n \"systemMessage\",\n \"retrieval\",\n \"metadata\",\n \"messages\",\n \"theme\",\n \"radius\"\n];\n\n// ── attribute converters ───────────────────────────────────\n\n/** JSON in markup, an object or array in JavaScript. Bad JSON is ignored. */\nconst jsonAttr = {\n fromAttribute: (value: string | null) => {\n if (!value) return undefined;\n try {\n return JSON.parse(value);\n } catch {\n console.warn(\"[singlebase-chat] an attribute holds invalid JSON; ignoring it\");\n return undefined;\n }\n },\n toAttribute: (value: unknown) => JSON.stringify(value ?? null)\n};\n\n/** Present-but-empty means true, so `branding` and `branding=\"false\"` both read. */\nconst flagAttr = {\n fromAttribute: (value: string | null) => (value === null ? true : value !== \"false\"),\n toAttribute: (value: boolean) => (value ? null : \"false\")\n};\n\n/** Bare `sidebar` or `=\"true\"` means open, `=\"false\"` closed; unknown is auto. */\nconst sidebarAttr = {\n fromAttribute: (value: string | null): ChatSidebar => {\n if (value === null) return \"auto\";\n if (value === \"\" || value === \"true\") return \"open\";\n if (value === \"false\") return \"closed\";\n return ([\"auto\", \"open\", \"closed\", \"none\"] as const).includes(value as ChatSidebar)\n ? (value as ChatSidebar)\n : \"auto\";\n },\n toAttribute: (value: ChatSidebar) => (value === \"auto\" ? null : value)\n};\n\n// ── constants ──────────────────────────────────────────────\n\nconst SIDEBAR_WIDTH = 272;\nconst DOCK_SIDEBAR_AT = 820;\nconst DOCK_PANEL_AT = 940;\nconst MAX_FILES = 5;\nconst MAX_FILE_SIZE = 512 * 1024;\nconst TEXT_FILE = /\\.(md|markdown|txt|csv|tsv|json|html?|ya?ml|xml|log)$/i;\nconst TOAST_MS = 5000;\nconst MAX_TABLE_ROWS = 200;\nconst MAX_JSON_NODES = 2000;\nconst CALLOUT_MESSAGE = {\n note: \"calloutNote\",\n tip: \"calloutTip\",\n important: \"calloutImportant\",\n warning: \"calloutWarning\",\n caution: \"calloutCaution\"\n} as const;\nconst ARRIVED_MS = 2600;\n\nconst CHART_COLORS = [\n \"var(--c-ink)\",\n \"oklch(0.58 0.13 255)\",\n \"oklch(0.63 0.1 175)\",\n \"oklch(0.74 0.12 70)\"\n];\n\n/** How each mode asks the model to answer. Sent once, when a chat is created. */\nconst MODE_PROMPTS: Record<ChatMode, string> = {\n chat: \"Be helpful and concise. Use Markdown when it helps: headings, lists, **bold**, code blocks and tables.\",\n rag:\n \"Prefer the sources provided with each message, numbered in the order given, and put a citation like [1] right after each claim they support. \" +\n \"If they don't cover the question, you may answer from general knowledge, but say clearly that it isn't from the sources.\",\n kb:\n \"Answer ONLY from the sources provided with each message, numbered in the order given. \" +\n \"Put a citation like [1] right after each claim. Do not use outside knowledge. \" +\n \"If the sources don't contain the answer, say that you can't find it in the available sources.\"\n};\n\n/** What the model may write at each format level, so it only uses what renders. */\nconst FORMAT_PROMPTS: Record<ChatFormat, string> = {\n raw: \"Reply in plain text. Don't use Markdown or any other markup.\",\n plain:\n \"Format with light Markdown only: short paragraphs, lists, **bold**, *italics*, `inline code`, code blocks and links. \" +\n \"Don't use tables, charts, callouts, images or other special blocks.\",\n advanced:\n \"You can use Markdown: headings, lists, task lists, **bold**, *italics*, links, code blocks and pipe tables. \" +\n 'For data, use a fenced \"csv\" block or a fenced \"json\" block. ' +\n 'For a diagram or illustration, write a self-contained fenced \"svg\" block with a viewBox, and no scripts, links or external images. ' +\n \"Don't use charts, callouts or images.\",\n rich:\n \"When the answer is about data, lead with one sentence stating the key finding, with key numbers in **bold**, then show the data visually. \" +\n \"You can use Markdown: headings, lists, task lists, **bold**, *italics*, links, code blocks and pipe tables. \" +\n 'For data, use a fenced \"csv\" block or a fenced \"json\" block. ' +\n 'For a diagram or illustration, write a self-contained fenced \"svg\" block with a viewBox, and no scripts, links or external images. ' +\n 'For trends and comparisons, use a fenced \"chart\" block containing only JSON: ' +\n '{\"type\":\"bar\"|\"line\",\"title\":string,\"unit\":string,\"labels\":[string],\"series\":[{\"name\":string,\"values\":[number]}]}. ' +\n \"For notes and warnings, use callouts: a quote starting with [!NOTE], [!TIP], [!IMPORTANT], [!WARNING] or [!CAUTION]. \" +\n \"Images use .\"\n};\n\nconst FOLLOWUP_PROMPT =\n \"After the answer, on a final line write FOLLOWUPS: followed by three short follow-up questions the user might ask next, separated by |.\";\n\nconst DEFAULT_PROMPTS: Record<ChatMode, [string, string][]> = {\n chat: [\n [\"Write\", \"Draft a short welcome email for new users\"],\n [\"Explain\", \"Explain how refresh tokens work, simply\"],\n [\"Code\", \"Write a JavaScript debounce function\"],\n [\"Plan\", \"Outline a one-week plan to learn TypeScript\"]\n ],\n rag: [\n [\"Overview\", \"What topics do these sources cover?\"],\n [\"Summarize\", \"Summarize the most important points\"],\n [\"Find\", \"Where is the refund policy described?\"],\n [\"Explain\", \"Explain the setup steps in plain language\"]\n ],\n kb: [\n [\"Find\", \"Where is the refund policy described?\"],\n [\"How to\", \"How do I reset my password?\"],\n [\"Limits\", \"What are the plan limits?\"],\n [\"Policy\", \"What happens when my account is deleted?\"]\n ]\n};\n\n// ── icons ──────────────────────────────────────────────────\n\nconst icon = (body: TemplateResult, cls = \"\") =>\n html`<svg class=\"i ${cls}\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">${body}</svg>`;\n\nconst I = {\n sidebar: () =>\n icon(\n svg`<rect x=\"2\" y=\"2.5\" width=\"12\" height=\"11\" rx=\"1.5\"></rect><path d=\"M6 2.5v11\"></path>`\n ),\n plus: () => icon(svg`<path d=\"M8 3v10M3 8h10\"></path>`),\n bookmark: (on = false) =>\n icon(svg`<path d=\"M4.5 2.5h7v11L8 11l-3.5 2.5z\"></path>`, on ? \"filled\" : \"\"),\n download: () => icon(svg`<path d=\"M8 2.5v8M4.5 7.5L8 11l3.5-3.5M2.5 13.5h11\"></path>`),\n trash: () => icon(svg`<path d=\"M2.5 4.5h11M6.5 4.5v-2h3v2M4 4.5l.7 9h6.6l.7-9\"></path>`),\n pencil: () => icon(svg`<path d=\"M10.5 2.5l3 3L6 13H3v-3z\"></path>`),\n copy: () =>\n icon(\n svg`<rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8\" rx=\"1.5\"></rect><path d=\"M10.5 5.5v-2a1 1 0 0 0-1-1h-6a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2\"></path>`\n ),\n raw: () => icon(svg`<path d=\"M5.5 4.5L2 8l3.5 3.5M10.5 4.5L14 8l-3.5 3.5\"></path>`),\n refresh: () => icon(svg`<path d=\"M13.5 8A5.5 5.5 0 1 1 11.9 4.1M13.5 2v3.5H10\"></path>`),\n thumb: (down = false) =>\n html`<svg\n class=\"i\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n style=${down ? \"transform:rotate(180deg)\" : \"\"}\n >\n <path\n d=\"M5 7v6.5H2.5V7zM5 7l2.5-4.5a1.3 1.3 0 0 1 1.9 1.4L9 6.5h3.6a1 1 0 0 1 1 1.2l-1 4.8a1 1 0 0 1-1 .8H5\"\n ></path>\n </svg>`,\n expand: () => icon(svg`<path d=\"M9.5 2.5h4v4M13.5 2.5L9 7M6.5 13.5h-4v-4M2.5 13.5L7 9\"></path>`),\n restore: () => icon(svg`<path d=\"M13.5 6.5h-4v-4M9.5 6.5l4-4M2.5 9.5h4v4M6.5 9.5l-4 4\"></path>`),\n minimize: () => icon(svg`<path d=\"M4 8h8\"></path>`),\n view: () =>\n icon(\n svg`<path d=\"M2.5 4.5h7M12.5 4.5h1M2.5 11.5h1M6.5 11.5h7\"></path><circle cx=\"11\" cy=\"4.5\" r=\"1.5\"></circle><circle cx=\"5\" cy=\"11.5\" r=\"1.5\"></circle>`\n ),\n check: () => icon(svg`<path d=\"M3.5 8.5l3 3 6-7\"></path>`),\n close: () => icon(svg`<path d=\"M4 4l8 8M12 4l-8 8\"></path>`),\n clip: () =>\n icon(\n svg`<path d=\"M13 7.5l-5.3 5.3a3 3 0 0 1-4.3-4.3L9 2.9a2 2 0 0 1 2.9 2.9L6.4 11.3a1 1 0 0 1-1.4-1.4L10 5\"></path>`\n ),\n up: () => icon(svg`<path d=\"M8 13V3M3.5 7.5L8 3l4.5 4.5\"></path>`),\n stop: () => icon(svg`<rect x=\"4.5\" y=\"4.5\" width=\"7\" height=\"7\" rx=\"1\"></rect>`),\n chat: () =>\n html`<svg\n width=\"22\"\n height=\"22\"\n viewBox=\"0 0 22 22\"\n aria-hidden=\"true\"\n style=\"fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round\"\n >\n <path\n d=\"M4 5.5A2.5 2.5 0 0 1 6.5 3h9A2.5 2.5 0 0 1 18 5.5v7a2.5 2.5 0 0 1-2.5 2.5H9l-4 3.5V15H6.5\"\n ></path>\n </svg>`,\n chevronDown: () =>\n html`<svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n aria-hidden=\"true\"\n style=\"fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round\"\n >\n <path d=\"M5 8l5 5 5-5\"></path>\n </svg>`\n};\n\n// ── helpers ────────────────────────────────────────────────\n\nlet keySeed = 0;\nconst newKey = () => `m${Date.now().toString(36)}${(keySeed++).toString(36)}`;\n\nconst VIEW_PREFS_KEY = \"singlebase-chat:view\";\n\n/** The reader's view choices. Storage can be missing or blocked, so this never throws. */\nfunction readViewPrefs(): { followups?: boolean; sources?: boolean } {\n try {\n const saved = JSON.parse(globalThis.localStorage?.getItem(VIEW_PREFS_KEY) ?? \"{}\");\n return { followups: saved?.followups === true, sources: saved?.sources === true };\n } catch {\n return {};\n }\n}\n\nfunction writeViewPrefs(prefs: { followups?: boolean; sources?: boolean }): void {\n try {\n globalThis.localStorage?.setItem(VIEW_PREFS_KEY, JSON.stringify(prefs));\n } catch {\n // Not saved: the choice still holds for this page view.\n }\n}\n\nfunction isNotFound(error: unknown): boolean {\n const e = error as { message?: string; code?: string; details?: { status?: number } } | null;\n return e?.message === \"NOT_FOUND\" || e?.code === \"NOT_FOUND\" || e?.details?.status === 404;\n}\n\nfunction errorCode(error: unknown): string {\n const e = error as { code?: string; message?: string } | null;\n return e?.code || e?.message || \"UNKNOWN\";\n}\n\nconst reducedMotion = () =>\n typeof matchMedia !== \"undefined\" && matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n\nconst formatNumber = (value: number, unit: string) =>\n (Number.isInteger(value) ? value.toLocaleString(\"en-US\") : value.toFixed(1)) + unit;\n\nconst fileExt = (name: string) => {\n const dot = name.lastIndexOf(\".\");\n return dot > 0 ? name.slice(dot + 1, dot + 5).toUpperCase() : \"FILE\";\n};\n\n/** A readable view of whatever shape the server recorded for a source. */\nexport function describeSource(source: Record<string, unknown>, n: number) {\n const s = source ?? {};\n const meta = (s.metadata && typeof s.metadata === \"object\" ? s.metadata : {}) as Record<\n string,\n unknown\n >;\n const pick = (...values: unknown[]) =>\n values.find((v) => typeof v === \"string\" && v.trim()) as string | undefined;\n const text =\n pick(s.content, s.text, s.page_content, s.body, s.snippet, s.chunk, meta.content) ??\n JSON.stringify(s, null, 2);\n const score = [s.score, s.relevance, s._score, meta.score].find((v) => typeof v === \"number\") as\n number | undefined;\n const number = typeof s.n === \"number\" && s.n > 0 ? s.n : n;\n const title = pick(s.title, s.name, s.filename, meta.title, meta.name) ?? `Source ${number}`;\n const path = pick(s.path, s.url, s.key, meta.path, meta.url) ?? \"\";\n const collection = pick(s.collection, s.namespace, s.dbname, meta.collection) ?? \"\";\n // Passages of one document share this. The service puts the document's id\n // in `id`; without one, fall back to its path, then its title.\n const document =\n pick(s.document_id, s.id, s._id, s.attachment_id, s.file_id, meta.document_id) ??\n (path || title);\n return {\n n: number,\n doc: `${typeof s.type === \"string\" ? s.type : \"\"}|${collection}|${document}`,\n title,\n section: pick(s.section, s.heading, meta.section) ?? \"\",\n path,\n collection,\n updated: pick(s.updated, s._modified_at, meta.updated) ?? \"\",\n text,\n score: score === undefined ? null : Math.max(0, Math.min(1, score))\n };\n}\n\ntype DescribedSource = ReturnType<typeof describeSource>;\n\n/** One document and the passages of it that a reply used. */\nexport interface SourceGroup {\n doc: string;\n /** The first passage: it supplies the title, path and preview. */\n first: DescribedSource;\n items: DescribedSource[];\n}\n\n/**\n * Groups passages by the document they come from, keeping first-seen order.\n * A file split into passages comes back as several numbered sources; shown one\n * by one it looks like the same document repeated.\n */\nexport function groupSources(sources: DescribedSource[]): SourceGroup[] {\n const groups = new Map<string, SourceGroup>();\n for (const source of sources) {\n const group = groups.get(source.doc);\n if (group) group.items.push(source);\n else groups.set(source.doc, { doc: source.doc, first: source, items: [source] });\n }\n return [...groups.values()];\n}\n\n/** The saved entries of a service `attachments` list. */\nfunction toSavedFiles(list: unknown): ChatSavedAttachment[] {\n if (!Array.isArray(list)) return [];\n return list\n .filter((item) => item && typeof item === \"object\" && (item._id || item.id))\n .filter((item) => item.saved !== false && item.status !== \"failed\")\n .map((item) => ({\n id: String(item._id ?? item.id),\n name: String(item.name ?? \"file\"),\n type: item.type,\n mime: item.mime,\n size: typeof item.size === \"number\" ? item.size : undefined,\n status: item.status\n }));\n}\n\nfunction toRetrieval(files: ChatAttachment[]): Record<string, unknown>[] {\n const out: Record<string, unknown>[] = [];\n const documents: { title: string; content: string }[] = [];\n for (const file of files) {\n if (/\\.csv$/i.test(file.name)) out.push({ source: \"csv\", data: file.content });\n else if (/\\.json$/i.test(file.name)) {\n try {\n out.push({ source: \"json\", data: JSON.parse(file.content) });\n } catch {\n documents.push({ title: file.name, content: file.content });\n }\n } else documents.push({ title: file.name, content: file.content });\n }\n if (documents.length) out.push({ source: \"docs\", payload: { documents } });\n return out;\n}\n\nfunction dayGroup(iso: string | undefined): \"today\" | \"yesterday\" | \"week\" | \"older\" {\n const at = iso ? Date.parse(iso) : NaN;\n if (Number.isNaN(at)) return \"older\";\n const start = new Date();\n start.setHours(0, 0, 0, 0);\n const day = 86_400_000;\n if (at >= start.getTime()) return \"today\";\n if (at >= start.getTime() - day) return \"yesterday\";\n if (at >= start.getTime() - 7 * day) return \"week\";\n return \"older\";\n}\n\ninterface Toast {\n key: number;\n text: string;\n undo?: () => void;\n commit?: () => void;\n}\n\n/**\n * An AI chat workspace backed by the `llm.*` service.\n *\n * <singlebase-chat></singlebase-chat>\n * <singlebase-chat embed=\"inline\" mode=\"rag\" retrieval='[{\"type\":\"kdb\",\"namespace\":\"docs\"}]'></singlebase-chat>\n * <singlebase-chat embed=\"launcher\" greeting-bubble unread-badge></singlebase-chat>\n *\n * Conversations live on the server, scoped to the signed-in user: the list\n * comes from `llm.list_chats`, a thread from `llm.get_chat`, and each turn is\n * one `llm.chat`. Titles and follow-up questions never add turns to the\n * conversation — titles come from `llm.generate`, follow-ups from the reply.\n */\n@customElement(\"singlebase-chat\")\nexport class SinglebaseChat extends LitElement {\n static styles = [tokenDefaults, brandingStyles, chatStyles];\n\n // ── wiring ────────────────────────────────────────────────\n /** An explicit client. Omit it and the page's SinglebaseClient() is used. */\n @property({ attribute: false })\n accessor client: ChatClient | null = null;\n\n @property({ attribute: false })\n accessor messages: Partial<SinglebaseChatMessages> = {};\n\n @property({ reflect: true })\n accessor theme: \"light\" | \"dark\" | undefined = undefined;\n\n /** Corner preset for this element: `sharp`, `default` or `round`. */\n @property({ reflect: true })\n accessor radius: \"sharp\" | \"default\" | \"round\" | undefined = undefined;\n\n // ── behaviour ─────────────────────────────────────────────\n /** `chat` free-form, `rag` grounded with citations, `rich` charts and tables. */\n @property({ reflect: true }) accessor mode: ChatMode = \"chat\";\n\n /**\n * How much of a reply is formatted: `raw` (the text as written), `plain`\n * (light formatting), `advanced` (+ tables, CSV, JSON and SVG) or `rich`\n * (+ callouts, charts, images and `renderers`). Copy and export always use\n * the original text.\n */\n @property({ reflect: true }) accessor format: ChatFormat = \"advanced\";\n\n /** Your own fenced blocks, by language. Drawn at the `rich` level. */\n @property({ attribute: false }) accessor renderers: Record<string, ChatBlockRenderer> = {};\n\n /**\n * Preflight for every message: gets the `llm.chat` payload, returns it\n * (changed or not), or `false` to cancel. May be async.\n */\n @property({ attribute: false }) accessor beforeSend: ChatBeforeSend | null = null;\n\n /** Rewrites a reply's parsed blocks before they're drawn. Returns the blocks. */\n @property({ attribute: false }) accessor afterParse: ChatAfterParse | null = null;\n\n @property({ reflect: true }) accessor glow: ChatGlow = \"subtle\";\n\n /**\n * Docsets to answer from: slugs or ids, comma-separated in markup or an\n * array in JavaScript. Sent as `{ source: \"docset\", ids }`.\n */\n @property() accessor docsets: string | string[] = \"\";\n\n /**\n * How attached files reach the service: `payload` (as `attachments`, which\n * the service keeps on the chat for later turns) or `retrieval` (with this\n * message only).\n */\n @property({ attribute: \"attachments-mode\" }) accessor attachmentsMode: \"retrieval\" | \"payload\" =\n \"payload\";\n\n /** With attachments-mode=\"payload\": keep attached files on the chat. */\n @property({ converter: flagAttr, attribute: \"save-attachments\" }) accessor saveAttachments = true;\n\n /** Ask the model for follow-up questions with each reply. */\n @property({ converter: flagAttr }) accessor followups = true;\n\n /** The \"Cited sources\" cards and the \"Searched n sources\" row under answers. */\n @property({ converter: flagAttr, attribute: \"show-sources\" }) accessor showSources = true;\n\n /** The New chat button. */\n @property({ converter: flagAttr, attribute: \"show-new-chat\" }) accessor showNewChat = true;\n\n /** The pinned \"Bookmarked\" group in the chat list. */\n @property({ converter: flagAttr, attribute: \"show-bookmarked\" }) accessor showBookmarked = true;\n\n /** Show the follow-up questions under the latest reply. */\n @property({ converter: flagAttr, attribute: \"show-followups\" }) accessor showFollowups = true;\n\n /**\n * Adds a header menu where the reader can hide suggested questions and\n * sources for a cleaner view. Their choice is remembered in this browser.\n */\n @property({ type: Boolean, attribute: \"allow-view-options\" }) accessor allowViewOptions = false;\n\n /** The search box in the chat list. */\n @property({ converter: flagAttr, attribute: \"allow-search\" }) accessor allowSearch = true;\n\n /** Replace the provisional title with a model-written one after the first reply. */\n @property({ converter: flagAttr, attribute: \"auto-title\" }) accessor autoTitle = true;\n\n /** Model for new turns; empty uses the chat's, then the project default. */\n @property() accessor model = \"\";\n\n @property({ converter: jsonAttr }) accessor params: Record<string, unknown> = {};\n\n /** Extra instructions, sent when a chat is created. */\n @property({ attribute: \"system-message\" }) accessor systemMessage = \"\";\n\n /** Retrieval sources sent with every turn: `[{\"type\":\"kdb\",\"namespace\":\"docs\"}]`. */\n @property({ converter: jsonAttr }) accessor retrieval: Record<string, unknown>[] = [];\n\n /** Stored on each user message. Never sent to the model. */\n @property({ converter: jsonAttr }) accessor metadata: Record<string, unknown> = {};\n\n // ── embed and layout ──────────────────────────────────────\n @property({ reflect: true }) accessor embed: ChatEmbed = \"page\";\n\n /** Launcher side. */\n @property({ reflect: true }) accessor position: \"right\" | \"left\" = \"right\";\n\n /**\n * The chat list: `auto` docks it when there's room, `open` / `closed` set\n * how it starts, `none` removes it and its toggle entirely.\n */\n @property({ converter: sidebarAttr }) accessor sidebar: ChatSidebar = \"auto\";\n\n @property({ converter: flagAttr, attribute: \"show-title\" }) accessor showTitle = true;\n\n /** Opens this chat on load. */\n @property({ attribute: \"chat-id\" }) accessor chatIdAttr = \"\";\n\n /**\n * A key of your own for this conversation, unique per signed-in user. The\n * chat with this key is opened if there is one; otherwise the first message\n * creates it, so the same key reopens it later. `chat-id` wins if both are set.\n */\n @property({ attribute: \"chat-key\" }) accessor chatKey = \"\";\n\n // ── brand and content ─────────────────────────────────────\n /** Used in placeholders, exports and labels. Never shown above messages. */\n @property({ attribute: \"assistant-name\" }) accessor assistantName = \"Assistant\";\n\n @property({ attribute: \"logo-url\" }) accessor logoUrl = \"\";\n @property() accessor heading = \"\";\n @property() accessor description = \"\";\n\n /** The small label above the heading. Unset uses the mode's; `\"\"` hides it. */\n @property() accessor eyebrow: string | undefined = undefined;\n\n /**\n * Suggested prompts: `|`-separated in markup, an array in JavaScript.\n * `\"none\"` or `[]` shows no suggestions. `\"auto\"` asks the service for\n * starter questions drawn from the chat's context (`retrieval`, `docsets`\n * and saved attachments); they're stored on the chat and reused on reload.\n */\n @property() accessor prompts: string | (string | ChatPrompt)[] = \"\";\n\n @property({ attribute: \"bubble-text\" }) accessor bubbleText = \"\";\n @property({ type: Boolean, attribute: \"greeting-bubble\" }) accessor greetingBubble = false;\n @property({ type: Boolean, attribute: \"unread-badge\" }) accessor unreadBadge = false;\n\n @property({ converter: flagAttr, attribute: \"allow-upload\" }) accessor allowUpload = true;\n @property({ converter: flagAttr, attribute: \"allow-export\" }) accessor allowExport = true;\n\n /** Copy buttons on messages. */\n @property({ converter: flagAttr, attribute: \"allow-copy\" }) accessor allowCopy = true;\n\n /** Regenerate on the latest reply. */\n @property({ converter: flagAttr, attribute: \"allow-regenerate\" }) accessor allowRegenerate = true;\n\n /** Bookmark buttons for chats and messages. */\n @property({ converter: flagAttr, attribute: \"allow-bookmark\" }) accessor allowBookmark = true;\n\n /** Delete buttons for chats and messages. */\n @property({ converter: flagAttr, attribute: \"allow-delete\" }) accessor allowDelete = true;\n\n /** Renaming a chat from its title or the chat list. */\n @property({ converter: flagAttr, attribute: \"allow-rename\" }) accessor allowRename = true;\n\n /** The helpful / not helpful buttons on replies. */\n @property({ converter: flagAttr, attribute: \"allow-feedback\" }) accessor allowFeedback = true;\n\n /**\n * The message box. Off, the chat only shows the conversation — pair it with\n * `chat-id` to display a saved chat read-only.\n */\n @property({ converter: flagAttr, attribute: \"show-composer\" }) accessor showComposer = true;\n\n /** Message times in the toolbars. */\n @property({ converter: flagAttr, attribute: \"show-time\" }) accessor showTime = true;\n\n /**\n * The line under the composer. Unset uses the default (\"{name} can make\n * mistakes…\"); an empty string hides it.\n */\n @property() accessor footnote: string | undefined = undefined;\n\n /** A per-reply toggle between the formatted answer and the text as written. */\n @property({ type: Boolean, attribute: \"allow-raw\" }) accessor allowRaw = false;\n\n /** The \"Chat by Singlebase\" credit. A plain link — it makes no request. */\n @property({ converter: flagAttr }) accessor branding = true;\n\n // ── state ─────────────────────────────────────────────────\n @state() private accessor chatList: ChatSummary[] = [];\n @state() private accessor listState: \"idle\" | \"loading\" | \"ready\" | \"error\" = \"idle\";\n @state() private accessor activeId: string | null = null;\n @state() private accessor chatTitle = \"\";\n @state() private accessor bookmarked = false;\n @state() private accessor msgs: ChatMessage[] = [];\n @state() private accessor loadingThread = false;\n @state() private accessor threadError = \"\";\n @state() private accessor busy = false;\n @state() private accessor draft = \"\";\n @state() private accessor files: ChatAttachment[] = [];\n @state() private accessor search = \"\";\n @state() private accessor sidebarOpen: boolean | null = null;\n @state() private accessor width = 0;\n @state() private accessor panel: { key: string; n: number } | null = null;\n @state() private accessor menuOpen = false;\n @state() private accessor viewOpen = false;\n\n /** What the reader chose to hide, when `allow-view-options` lets them. */\n @state() private accessor viewHidden: { followups?: boolean; sources?: boolean } =\n readViewPrefs();\n @state() private accessor editingKey = \"\";\n @state() private accessor editDraft = \"\";\n @state() private accessor editingTitle = false;\n @state() private accessor renamingId = \"\";\n @state() private accessor toast: Toast | null = null;\n @state() private accessor copiedKey = \"\";\n @state() private accessor retrievalOpen = new Set<string>();\n @state() private accessor rawKeys = new Set<string>();\n @state() private accessor savedFiles: ChatSavedAttachment[] = [];\n @state() private accessor hasSidebarContent = false;\n @state() private accessor sorts = new Map<string, { col: number; dir: 1 | -1 }>();\n @state() private accessor arrivedKey = \"\";\n @state() private accessor dragging = false;\n @state() private accessor showJump = false;\n @state() private accessor offline = false;\n @state() private accessor isOpen = false;\n @state() private accessor expanded = false;\n @state() private accessor bubble = false;\n @state() private accessor seen = false;\n @state() private accessor mobile = false;\n\n private run = 0;\n private abort: AbortController | null = null;\n private revealTimer: ReturnType<typeof setInterval> | undefined;\n private timers = new Set<ReturnType<typeof setTimeout>>();\n private toastTimer: ReturnType<typeof setTimeout> | undefined;\n private stick = true;\n private renamed = new Set<string>();\n private observer: ResizeObserver | null = null;\n private observed: Element | null = null;\n private resizeTimer: ReturnType<typeof setTimeout> | undefined;\n private shownPassage = \"\";\n private media: MediaQueryList | null = null;\n private focusNext = \"\";\n private bubbleScheduled = false;\n private pendingChatId = \"\";\n\n /** Starter questions the service generated for this chat's context. */\n @state() private accessor starterList: string[] = [];\n @state() private accessor startersLoading = false;\n\n /** The key the open conversation is created under, until the user leaves it. */\n private boundKey = \"\";\n /** The open chat was prepared but has no messages yet. */\n private prepared = false;\n private syncedKey = \"\";\n private syncSignature = \"\";\n private syncRun = 0;\n\n get msg(): SinglebaseChatMessages {\n return resolveChatMessages(this.messages);\n }\n\n /** An explicit `.client`, else the page default. */\n get resolvedClient(): ChatClient | null {\n return this.client ?? getDefaultClient<SinglebaseClientInstance>() ?? null;\n }\n\n /** The open conversation's id, or null for a new chat. */\n get chatId(): string | null {\n return this.activeId;\n }\n\n /** The open conversation's messages. */\n get thread(): readonly ChatMessage[] {\n return this.msgs;\n }\n\n /** The starter questions from `prompts=\"auto\"`, if any. */\n get starters(): readonly string[] {\n return this.starterList;\n }\n\n /** `format`, falling back to the default for anything unknown. */\n /** `docsets` as a clean list of ids. */\n private get docsetIds(): string[] {\n const value = this.docsets;\n const list = Array.isArray(value) ? value : String(value ?? \"\").split(/[\\s,]+/);\n return [...new Set(list.map((id) => String(id).trim()).filter(Boolean))];\n }\n\n /** The files this chat keeps on the service. */\n get attachments(): readonly ChatSavedAttachment[] {\n return this.savedFiles;\n }\n\n private get formatLevel(): ChatFormat {\n return ([\"raw\", \"plain\", \"advanced\", \"rich\"] as const).includes(this.format)\n ? this.format\n : \"advanced\";\n }\n\n /** The loaded chat list. */\n get chats(): readonly ChatSummary[] {\n return this.chatList;\n }\n\n /**\n * Every setting in one object, keyed by property name:\n *\n * chat.config = { client, mode: \"rag\", format: \"rich\", retrieval: [...], chatId: \"…\" };\n *\n * Unknown keys are ignored. `chatId` opens that chat; reading `config`\n * returns the current settings with `chatId` as the open chat.\n */\n set config(value: Partial<ChatConfig>) {\n if (!value) return;\n const target = this as unknown as Record<string, unknown>;\n if (\"client\" in value) this.client = value.client ?? null;\n for (const key of CONFIG_KEYS) {\n if (key in value) target[key] = value[key];\n }\n if (value.chatId && value.chatId !== this.activeId) {\n if (this.hasUpdated) void this.openChat(value.chatId);\n else this.chatIdAttr = value.chatId;\n }\n }\n\n /**\n * Changes settings on the fly. Only the keys you pass change; the chat keeps\n * its conversation and re-renders in place. Returns the element, so calls chain.\n *\n * chat.configure({ format: \"rich\" }).configure({ theme: \"dark\" });\n */\n configure(options: Partial<ChatConfig>): this {\n this.config = options;\n return this;\n }\n\n get config(): Partial<ChatConfig> {\n const source = this as unknown as Record<string, unknown>;\n return {\n client: this.client,\n chatId: this.activeId ?? \"\",\n ...Object.fromEntries(CONFIG_KEYS.map((key) => [key, source[key]]))\n };\n }\n\n // ── lifecycle ─────────────────────────────────────────────\n override connectedCallback(): void {\n super.connectedCallback();\n this.offline = typeof navigator !== \"undefined\" && navigator.onLine === false;\n window.addEventListener(\"online\", this.onNetwork);\n window.addEventListener(\"offline\", this.onNetwork);\n this.media = typeof matchMedia !== \"undefined\" ? matchMedia(\"(max-width: 559px)\") : null;\n this.mobile = !!this.media?.matches;\n this.media?.addEventListener(\"change\", this.onMedia);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n window.removeEventListener(\"online\", this.onNetwork);\n window.removeEventListener(\"offline\", this.onNetwork);\n this.media?.removeEventListener(\"change\", this.onMedia);\n this.observer?.disconnect();\n clearTimeout(this.resizeTimer);\n this.observer = null;\n this.observed = null;\n this.flushToast();\n this.halt();\n this.timers.forEach(clearTimeout);\n this.timers.clear();\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n if (changed.has(\"retrieval\") && !Array.isArray(this.retrieval)) {\n const value = this.retrieval as unknown;\n this.retrieval = value && typeof value === \"object\" ? [value as Record<string, unknown>] : [];\n }\n if (changed.has(\"params\") && (!this.params || typeof this.params !== \"object\"))\n this.params = {};\n if (changed.has(\"metadata\") && (!this.metadata || typeof this.metadata !== \"object\")) {\n this.metadata = {};\n }\n if (changed.has(\"sidebar\")) {\n if (this.sidebar === \"open\") this.sidebarOpen = true;\n else if (this.sidebar === \"closed\" || this.sidebar === \"none\") this.sidebarOpen = false;\n else if (this.width) this.sidebarOpen = this.docked;\n }\n if (this.embed === \"launcher\" && this.greetingBubble && !this.bubbleScheduled) {\n this.bubbleScheduled = true;\n this.later(() => {\n if (!this.isOpen && !this.seen) this.bubble = true;\n }, 1200);\n }\n }\n\n override firstUpdated(): void {\n if (this.chatIdAttr) void this.openChat(this.chatIdAttr);\n }\n\n override updated(): void {\n // The root is re-created when a launcher opens, so re-observe as needed.\n const root = this.renderRoot.querySelector(\".root\");\n if (root !== this.observed) {\n this.observer?.disconnect();\n this.observed = root;\n if (root && typeof ResizeObserver !== \"undefined\") {\n this.observer ??= new ResizeObserver(([entry]) => {\n const width = Math.round(entry.contentRect.width);\n if (width === this.width) return;\n // Apply it after this callback: changing layout inside it makes the\n // browser report a \"ResizeObserver loop\". A timer, not an animation\n // frame, so it also runs while the tab is in the background.\n clearTimeout(this.resizeTimer);\n this.resizeTimer = setTimeout(() => {\n this.width = width;\n if (this.sidebarOpen === null) {\n this.sidebarOpen = this.sidebar === \"auto\" && this.docked;\n }\n });\n });\n this.observer.observe(root);\n }\n }\n\n if (this.sidebarOpen && this.listState === \"idle\" && this.resolvedClient) void this.loadChats();\n if (this.pendingChatId && this.resolvedClient) void this.openChat(this.pendingChatId);\n void this.syncKeyedChat();\n\n // Bring the clicked passage into view when a document lists several.\n const shown = this.panel ? `${this.panel.key}:${this.panel.n}` : \"\";\n if (shown !== this.shownPassage) {\n this.shownPassage = shown;\n this.renderRoot.querySelector(\".passage-box.current\")?.scrollIntoView({ block: \"nearest\" });\n }\n\n if (this.focusNext) {\n const target = this.renderRoot.querySelector<HTMLInputElement | HTMLTextAreaElement>(\n this.focusNext\n );\n this.focusNext = \"\";\n if (target) {\n target.focus();\n if (\"select\" in target && target.tagName === \"INPUT\") target.select();\n }\n }\n }\n\n private onNetwork = () => {\n this.offline = navigator.onLine === false;\n };\n\n private onMedia = () => {\n this.mobile = !!this.media?.matches;\n };\n\n private later(fn: () => void, ms: number) {\n const id = setTimeout(() => {\n this.timers.delete(id);\n fn();\n }, ms);\n this.timers.add(id);\n }\n\n private emit(name: string, detail: unknown) {\n this.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true }));\n }\n\n private get docked(): boolean {\n return this.embed === \"page\" && this.width >= DOCK_SIDEBAR_AT;\n }\n\n private get panelDocked(): boolean {\n const used = this.docked && this.sidebarOpen ? SIDEBAR_WIDTH : 0;\n return this.width - used >= DOCK_PANEL_AT;\n }\n\n // ── public API ────────────────────────────────────────────\n /** Starts a new, empty conversation. */\n newChat(): void {\n this.halt();\n this.leaveKeyedChat();\n this.pendingChatId = \"\";\n this.savedFiles = [];\n this.loadingThread = false;\n this.activeId = null;\n this.chatTitle = \"\";\n this.bookmarked = false;\n this.msgs = [];\n this.threadError = \"\";\n this.resetViewState();\n this.focusNext = \"textarea.input\";\n }\n\n /** Opens a saved conversation. */\n async openChat(id: string): Promise<void> {\n const client = this.resolvedClient;\n if (!id) return;\n this.halt();\n this.leaveKeyedChat();\n this.savedFiles = [];\n const summary = this.chatList.find((chat) => chat._id === id);\n this.activeId = id;\n this.chatTitle = summary?.title ?? \"\";\n this.bookmarked = !!summary?.bookmarked;\n this.msgs = [];\n this.threadError = \"\";\n this.resetViewState();\n if (!client) {\n // Opened before a client was set (common when `.client` is assigned\n // after the element is created): open it as soon as one arrives.\n this.pendingChatId = id;\n this.loadingThread = true;\n return;\n }\n\n const run = ++this.run;\n this.pendingChatId = \"\";\n this.loadingThread = true;\n try {\n const data = await client.llm.call<ChatSummary & { messages?: any[] }>(\"get_chat\", {\n _id: id\n });\n if (run !== this.run) return;\n this.showChat(data);\n this.upsertChat({ ...summary, ...data, _id: id } as ChatSummary);\n } catch (error) {\n if (run !== this.run) return;\n if (isNotFound(error)) {\n this.chatList = this.chatList.filter((chat) => chat._id !== id);\n this.newChat();\n this.showToast(this.msg.errNotFound);\n } else {\n this.threadError = this.msg.errLoad;\n }\n } finally {\n if (run === this.run) this.loadingThread = false;\n }\n }\n\n /** Suggested questions under answers: the page's setting, then the reader's. */\n private get followupsVisible(): boolean {\n return this.showFollowups && !(this.allowViewOptions && this.viewHidden.followups);\n }\n\n /** Source cards and the \"searched\" row: the page's setting, then the reader's. */\n private get sourcesVisible(): boolean {\n return this.showSources && !(this.allowViewOptions && this.viewHidden.sources);\n }\n\n private toggleView(key: \"followups\" | \"sources\"): void {\n this.viewHidden = { ...this.viewHidden, [key]: !this.viewHidden[key] };\n writeViewPrefs(this.viewHidden);\n this.emit(\"singlebase-chat-view\", {\n followups: this.followupsVisible,\n sources: this.sourcesVisible\n });\n }\n\n /** Puts a chat from `llm.get_chat` (or `llm.prepare_chat`) on screen. */\n private showChat(data: (ChatSummary & { messages?: any[] }) | null | undefined): void {\n this.chatTitle = data?.title ?? \"\";\n this.bookmarked = !!data?.bookmarked;\n this.msgs = (data?.messages ?? [])\n .filter((m) => m && (m.role === \"user\" || m.role === \"assistant\"))\n .map((m) => this.fromServer(m));\n this.savedFiles = toSavedFiles((data as { attachments?: unknown })?.attachments);\n this.stick = true;\n void this.scrollToBottom();\n }\n\n // ── chat key and starter questions ────────────────────────\n private get wantsStarters(): boolean {\n return typeof this.prompts === \"string\" && this.prompts.trim().toLowerCase() === \"auto\";\n }\n\n /** The user moved to another conversation: stop tying messages to the key. */\n private leaveKeyedChat(): void {\n this.syncRun += 1;\n this.boundKey = \"\";\n this.prepared = false;\n this.startersLoading = false;\n }\n\n /** Docsets first, then the page's own retrieval entries. */\n private baseRetrieval(): Record<string, unknown>[] {\n const docsets = this.docsetIds;\n return [\n ...(docsets.length ? [{ source: \"docset\", ids: docsets }] : []),\n ...(this.retrieval ?? [])\n ];\n }\n\n /**\n * Opens the chat for `chat-key`, and with `prompts=\"auto\"` prepares the chat\n * with its context so the service returns stored starter questions.\n *\n * It runs when the key or the context changes. A change of context alone\n * never replaces a conversation that already has messages.\n */\n private async syncKeyedChat(): Promise<void> {\n const client = this.resolvedClient;\n const key = this.chatKey.trim();\n const auto = this.wantsStarters;\n if (!client || (!key && !auto)) return;\n if (this.chatIdAttr || this.pendingChatId) return; // chat-id wins\n\n const retrieval = this.baseRetrieval();\n const signature = JSON.stringify([key, auto, this.mode, retrieval]);\n if (signature === this.syncSignature) return;\n this.syncSignature = signature;\n\n const keyChanged = key !== this.syncedKey;\n this.syncedKey = key;\n if (!keyChanged && (this.msgs.length || this.busy)) return;\n\n if (keyChanged) {\n this.halt();\n this.activeId = null;\n this.chatTitle = \"\";\n this.bookmarked = false;\n this.msgs = [];\n this.savedFiles = [];\n this.threadError = \"\";\n }\n const sync = ++this.syncRun;\n this.boundKey = key;\n this.prepared = false;\n this.starterList = [];\n this.startersLoading = auto;\n this.loadingThread = !!key;\n\n try {\n let data: (ChatSummary & { messages?: any[]; starters?: unknown }) | null = null;\n if (auto) {\n const payload: Record<string, unknown> = {\n system_message: this.systemPrompt(),\n mode: this.mode,\n starters: 4\n };\n if (key) payload.key = key;\n if (this.model) payload.model = this.model;\n if (Object.keys(this.params ?? {}).length) payload.params = this.params;\n if (Object.keys(this.metadata ?? {}).length) payload.metadata = this.metadata;\n if (retrieval.length) payload.retrieval = retrieval;\n try {\n data = await client.llm.call(\"prepare_chat\", payload);\n } catch (error) {\n // A service without prepare_chat: the key can still open its chat.\n if (!key) throw error;\n }\n }\n if (!data?._id && key) data = await client.llm.call(\"get_chat\", { key });\n if (sync !== this.syncRun || this.msgs.length || this.busy) return;\n\n if (data?._id) {\n this.activeId = data._id;\n this.showChat(data);\n this.prepared = this.msgs.length === 0;\n if (!this.prepared) this.upsertChat(data);\n this.starterList = Array.isArray(data.starters)\n ? data.starters.map((q) => String(q).trim()).filter(Boolean)\n : [];\n if (this.starterList.length) {\n this.emit(\"singlebase-chat-starters\", { chatId: data._id, starters: this.starterList });\n }\n }\n } catch (error) {\n if (sync !== this.syncRun) return;\n // No chat has this key yet: stay on a new one, and the first message\n // creates it. Starters are a nicety, so their failure isn't shown.\n if (key && !auto && !isNotFound(error)) this.threadError = this.msg.errLoad;\n } finally {\n if (sync === this.syncRun) {\n this.startersLoading = false;\n this.loadingThread = false;\n }\n }\n }\n\n /** Sends a message; with no argument, sends the composer's text. */\n async send(text?: string): Promise<void> {\n const content = (typeof text === \"string\" ? text : this.draft).trim();\n if (!content || this.busy) return;\n const attachments = this.files;\n this.draft = \"\";\n this.files = [];\n const input = this.renderRoot.querySelector<HTMLTextAreaElement>(\"textarea.input\");\n if (input) input.style.height = \"auto\";\n await this.runTurn(this.userMessage(content, attachments));\n }\n\n /** Stops waiting for, or revealing, the current reply. */\n stop(): void {\n if (!this.busy) return;\n const last = this.msgs[this.msgs.length - 1];\n this.halt();\n if (last?.role === \"assistant\" && (last.phase === \"pending\" || last.phase === \"streaming\")) {\n last.phase = \"done\";\n last.stopped = true;\n last.followups = [];\n this.msgs = [...this.msgs];\n }\n }\n\n /** Downloads the open conversation, or copies it as Markdown. */\n exportChat(format: ChatExportFormat = \"md\"): void {\n if (!this.msgs.length) return;\n this.menuOpen = false;\n const title = this.chatTitle || this.msg.untitled;\n const who = (m: ChatMessage) => (m.role === \"user\" ? this.msg.you : this.assistantName);\n const when = (at: number) => new Date(at || Date.now()).toLocaleString();\n const sources = (m: ChatMessage) =>\n m.sources.map((s, i) => {\n const d = describeSource(s, i + 1);\n return `[${d.n}] ${d.title}${d.path ? ` — ${d.path}` : \"\"}`;\n });\n const files = (m: ChatMessage) => (m.attachments ?? []).map((a) => a.name);\n\n let body: string;\n let mime = \"text/markdown\";\n let ext = \"md\";\n if (format === \"json\") {\n body = JSON.stringify(\n {\n exportedAt: new Date().toISOString(),\n id: this.activeId,\n title,\n mode: this.mode,\n bookmarked: this.bookmarked,\n messages: this.msgs.map((m) => ({\n role: m.role,\n text: m.content,\n at: new Date(m.at || Date.now()).toISOString(),\n bookmarked: m.bookmarked,\n attachments: files(m),\n sources: sources(m)\n }))\n },\n null,\n 2\n );\n mime = \"application/json\";\n ext = \"json\";\n } else if (format === \"txt\") {\n body =\n `${title}\\n${\"=\".repeat(title.length)}\\n\\n` +\n this.msgs\n .map((m) =>\n [\n `${who(m)} · ${when(m.at)}`,\n files(m).length ? `Attachments: ${files(m).join(\", \")}` : \"\",\n m.content,\n sources(m).length ? `Sources:\\n${sources(m).join(\"\\n\")}` : \"\"\n ]\n .filter(Boolean)\n .join(\"\\n\")\n )\n .join(\"\\n\\n\");\n mime = \"text/plain\";\n ext = \"txt\";\n } else {\n body =\n `# ${title}\\n\\n` +\n this.msgs\n .map((m) =>\n [\n `### ${who(m)} · ${when(m.at)}`,\n files(m).length ? `Attachments: ${files(m).join(\", \")}` : \"\",\n m.content,\n sources(m).length\n ? `**Sources**\\n\\n${sources(m)\n .map((s) => `- ${s}`)\n .join(\"\\n\")}`\n : \"\"\n ]\n .filter(Boolean)\n .join(\"\\n\\n\")\n )\n .join(\"\\n\\n---\\n\\n\") +\n \"\\n\";\n }\n\n this.emit(\"singlebase-chat-export\", { chatId: this.activeId, format });\n if (format === \"copy\") {\n void navigator.clipboard?.writeText(body).catch(() => {});\n this.showToast(this.msg.copiedMarkdown);\n return;\n }\n\n const slug =\n title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\") || \"chat\";\n const name = `${slug}-${new Date().toISOString().slice(0, 10)}.${ext}`;\n const url = URL.createObjectURL(new Blob([body], { type: mime }));\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = name;\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n setTimeout(() => URL.revokeObjectURL(url), 2000);\n this.showToast(fill(this.msg.exported, { name }));\n }\n\n /** Inline and launcher: fill the window. */\n expand(): void {\n this.expanded = true;\n this.emit(\"singlebase-chat-expand\", { expanded: true });\n }\n\n collapse(): void {\n this.expanded = false;\n this.emit(\"singlebase-chat-expand\", { expanded: false });\n }\n\n /** Launcher: open the panel. */\n open(): void {\n this.isOpen = true;\n this.seen = true;\n this.bubble = false;\n this.focusNext = \"textarea.input\";\n this.emit(\"singlebase-chat-open\", {});\n }\n\n /** Launcher: close the panel. */\n close(): void {\n this.isOpen = false;\n this.expanded = false;\n this.emit(\"singlebase-chat-close\", {});\n }\n\n // ── turns ─────────────────────────────────────────────────\n private userMessage(content: string, attachments: ChatAttachment[] = []): ChatMessage {\n return {\n key: newKey(),\n id: null,\n role: \"user\",\n content,\n at: Date.now(),\n bookmarked: false,\n sources: [],\n followups: [],\n phase: \"done\",\n attachments\n };\n }\n\n private systemPrompt(): string {\n return [\n this.systemMessage,\n MODE_PROMPTS[this.mode] ?? MODE_PROMPTS.chat,\n FORMAT_PROMPTS[this.formatLevel],\n this.followups ? FOLLOWUP_PROMPT : \"\"\n ]\n .filter(Boolean)\n .join(\"\\n\\n\");\n }\n\n private payloadFor(user: ChatMessage): Record<string, unknown> {\n const payload: Record<string, unknown> = { message: user.content, format: \"markdown\" };\n if (this.activeId) {\n payload._id = this.activeId;\n // A prepared chat already has its instructions; it only lacks a title.\n if (this.prepared) payload.title = provisionalTitle(user.content);\n } else {\n payload.title = provisionalTitle(user.content);\n payload.system_message = this.systemPrompt();\n if (this.boundKey) payload.key = this.boundKey;\n }\n payload.mode = this.mode;\n if (this.model) payload.model = this.model;\n if (Object.keys(this.params ?? {}).length) payload.params = this.params;\n\n // Files go either as this turn's retrieval (works everywhere) or, with\n // attachments-mode=\"payload\", as attachments the service keeps on the chat.\n const files = user.attachments ?? [];\n const asPayload = this.attachmentsMode === \"payload\";\n if (asPayload && files.length) {\n payload.attachments = files.map((file) => ({\n type: \"content\",\n content: file.content,\n name: file.name,\n ...(file.mime ? { mime: file.mime } : {}),\n size: file.size,\n save_attachment: this.saveAttachments\n }));\n }\n\n const names = asPayload ? [] : files.map((file) => file.name);\n if (Object.keys(this.metadata ?? {}).length || names.length) {\n payload.metadata = { ...this.metadata, ...(names.length ? { attachments: names } : {}) };\n }\n\n const retrieval = [...this.baseRetrieval(), ...(asPayload ? [] : toRetrieval(files))];\n if (retrieval.length) payload.retrieval = retrieval;\n return payload;\n }\n\n private async runTurn(user: ChatMessage): Promise<void> {\n const bot: ChatMessage = {\n key: newKey(),\n id: null,\n role: \"assistant\",\n content: \"\",\n at: Date.now(),\n bookmarked: false,\n sources: [],\n followups: [],\n phase: \"pending\"\n };\n this.msgs = [...this.msgs, user, bot];\n this.busy = true;\n this.panel = null;\n this.stick = true;\n void this.scrollToBottom();\n this.emit(\"singlebase-chat-send\", { chatId: this.activeId, text: user.content });\n\n const client = this.resolvedClient;\n if (!client) {\n this.failTurn(bot, this.msg.errNoClient, \"NO_CLIENT\");\n this.busy = false;\n return;\n }\n\n const run = ++this.run;\n const controller = new AbortController();\n this.abort = controller;\n const isNew = !this.activeId || this.prepared;\n let payload = this.payloadFor(user);\n\n if (this.beforeSend) {\n let out: unknown;\n try {\n out = await this.beforeSend(payload, { chatId: this.activeId, isNew, message: user });\n } catch (error) {\n out = error;\n }\n if (run !== this.run) return;\n if (out === false) {\n // Cancelled: nothing was sent, so undo the turn and give the text back.\n this.msgs = this.msgs.filter((m) => m !== user && m !== bot);\n this.draft = user.content;\n this.busy = false;\n this.abort = null;\n return;\n }\n const valid =\n !!out &&\n typeof out === \"object\" &&\n typeof (out as { message?: unknown }).message === \"string\";\n if (!valid || !(out as { message: string }).message.trim()) {\n // Never fall back to the unmodified request: a hook that strips data\n // and forgets to return must not send the original.\n console.error(\n \"[singlebase-chat] beforeSend must return the request object (with a message) or false to cancel; the message was not sent.\",\n out\n );\n this.failTurn(bot, this.msg.errGeneric, \"BEFORE_SEND_INVALID\");\n this.busy = false;\n this.abort = null;\n return;\n }\n payload = out as Record<string, unknown>;\n }\n\n try {\n const data = await client.llm.call<any>(\"chat\", payload, { signal: controller.signal });\n const chatId: string | null = data?._id || data?.chat_id || this.activeId;\n\n // A new chat exists now even if the user moved on; keep it in the list.\n if (isNew && chatId) {\n this.upsertChat({\n _id: chatId,\n title: data?.title || (payload.title as string),\n bookmarked: !!data?.bookmarked,\n _modified_at: new Date().toISOString()\n });\n }\n if (run !== this.run) return;\n\n if (chatId) this.activeId = chatId;\n this.prepared = false;\n if (isNew) {\n this.chatTitle = data?.title || (payload.title as string);\n this.bookmarked = !!data?.bookmarked;\n }\n\n const reply = data?.message ?? {};\n const raw =\n typeof reply.content === \"string\"\n ? reply.content\n : data?.json !== undefined\n ? JSON.stringify(data.json, null, 2)\n : \"\";\n const { text, followups } = splitFollowups(raw);\n user.id = reply.reply_to ?? null;\n this.applyAttachmentResults(data?.attachments);\n Object.assign(bot, {\n id: reply._id ?? null,\n content: text,\n sources: Array.isArray(reply.sources) ? reply.sources : [],\n followups,\n execTime: typeof reply.exec_time === \"number\" ? reply.exec_time : undefined,\n model: reply.model,\n at: Date.now()\n });\n this.emit(\"singlebase-chat-response\", { chatId, message: bot });\n\n await this.reveal(bot, run);\n if (isNew && chatId && this.autoTitle) void this.retitle(chatId, user.content, bot.content);\n } catch (error) {\n if (run !== this.run) return;\n const notFound = isNotFound(error);\n if (notFound) {\n this.chatList = this.chatList.filter((chat) => chat._id !== this.activeId);\n this.activeId = null;\n }\n const code = errorCode(error);\n const message = notFound\n ? this.msg.errNotFound\n : code === \"KB_SOURCE_REQUIRED\"\n ? this.msg.errKbSource\n : this.msg.errGeneric;\n this.failTurn(bot, message, code);\n } finally {\n if (run === this.run) {\n this.busy = false;\n this.abort = null;\n // Follow-ups appear once the turn is over; keep them in view.\n if (this.stick) void this.scrollToBottom();\n }\n }\n }\n\n private failTurn(bot: ChatMessage, message: string, code: string) {\n bot.phase = \"error\";\n bot.error = message;\n this.msgs = [...this.msgs];\n this.emit(\"singlebase-chat-error\", { chatId: this.activeId, code, message });\n }\n\n /**\n * The service answers in one piece; this reveals it progressively so it\n * reads like a stream. Capped at about a second and a half.\n */\n private reveal(bot: ChatMessage, run: number): Promise<void> {\n const total = bot.content.length;\n const finish = () => {\n bot.phase = \"done\";\n this.msgs = [...this.msgs];\n this.arrivedKey = bot.key;\n this.later(() => {\n if (this.arrivedKey === bot.key) this.arrivedKey = \"\";\n }, ARRIVED_MS);\n if (this.stick) void this.scrollToBottom();\n else this.showJump = true;\n };\n\n if (!total || reducedMotion()) {\n finish();\n return Promise.resolve();\n }\n\n const full = bot.content;\n const step = Math.max(4, Math.ceil(total / 90));\n let shown = 0;\n bot.phase = \"streaming\";\n bot.content = \"\";\n\n return new Promise((resolve) => {\n this.revealTimer = setInterval(() => {\n if (run !== this.run) {\n clearInterval(this.revealTimer);\n resolve();\n return;\n }\n shown = Math.min(total, shown + step);\n bot.content = full.slice(0, shown);\n if (shown >= total) {\n clearInterval(this.revealTimer);\n finish();\n resolve();\n return;\n }\n this.msgs = [...this.msgs];\n if (this.stick) void this.scrollToBottom();\n }, 16);\n });\n }\n\n /** Cancels any request or reveal in flight. */\n private halt() {\n this.run++;\n this.abort?.abort();\n this.abort = null;\n clearInterval(this.revealTimer);\n this.busy = false;\n }\n\n private async retitle(chatId: string, question: string, answer: string) {\n const client = this.resolvedClient;\n if (!client || this.renamed.has(chatId)) return;\n try {\n const data = await client.llm.call<{ result?: unknown }>(\"generate\", {\n user_input: `user: ${question}\\nassistant: ${answer.slice(0, 1500)}`,\n custom_instructions:\n \"Write a concise title (3–6 words, sentence case, no quotes, no trailing punctuation) for this conversation.\",\n format: \"text\"\n });\n const title = cleanTitle(data?.result);\n if (!title || this.renamed.has(chatId)) return;\n await client.llm.call(\"update_chat\", { _id: chatId, title });\n this.applyTitle(chatId, title, true);\n } catch {\n // Cosmetic: the provisional title stays.\n }\n }\n\n private applyTitle(chatId: string, title: string, auto: boolean) {\n this.chatList = this.chatList.map((chat) => (chat._id === chatId ? { ...chat, title } : chat));\n if (this.activeId === chatId) this.chatTitle = title;\n this.emit(\"singlebase-chat-title\", { chatId, title, auto });\n }\n\n /**\n * Enter and blur both land here. Saving on Enter directly (not via blur())\n * matters: blur never fires on an input that doesn't have focus.\n */\n private commitTitle(value: string) {\n if (!this.editingTitle) return;\n this.editingTitle = false;\n if (this.activeId) void this.renameChat(this.activeId, value);\n }\n\n private commitRename(chatId: string, value: string) {\n if (this.renamingId !== chatId) return;\n this.renamingId = \"\";\n void this.renameChat(chatId, value);\n }\n\n private async renameChat(chatId: string, value: string) {\n const title = value.trim().slice(0, 80);\n const previous = this.chatList.find((chat) => chat._id === chatId)?.title ?? this.chatTitle;\n if (!title || title === previous) return;\n this.renamed.add(chatId);\n this.applyTitle(chatId, title, false);\n try {\n await this.resolvedClient?.llm.call(\"update_chat\", { _id: chatId, title });\n } catch {\n this.applyTitle(chatId, previous ?? \"\", false);\n this.showToast(this.msg.errGeneric);\n }\n }\n\n private fromServer(m: any): ChatMessage {\n const assistant = m.role === \"assistant\";\n const { text, followups } = assistant\n ? splitFollowups(String(m.content ?? \"\"))\n : { text: String(m.content ?? \"\"), followups: [] };\n return {\n key: newKey(),\n id: m._id ?? null,\n role: assistant ? \"assistant\" : \"user\",\n content: text,\n at: Date.parse(m._created_at ?? \"\") || 0,\n bookmarked: !!m.bookmarked,\n sources: Array.isArray(m.sources) ? m.sources : [],\n followups,\n phase: \"done\",\n execTime: typeof m.exec_time === \"number\" ? m.exec_time : undefined,\n model: m.model\n };\n }\n\n // ── chat list ─────────────────────────────────────────────\n private async loadChats() {\n const client = this.resolvedClient;\n if (!client) return;\n this.listState = \"loading\";\n try {\n const data = await client.llm.call<{ items?: ChatSummary[] }>(\"list_chats\", { limit: 100 });\n this.chatList = [...(data?.items ?? [])];\n this.listState = \"ready\";\n } catch {\n this.listState = \"error\";\n }\n }\n\n /**\n * A new chat goes on top. A chat already in the list is updated where it is,\n * keeping its dates, so opening or using a chat never reorders the list; the\n * next load from the server brings the fresh order.\n */\n private upsertChat(chat: ChatSummary) {\n const index = this.chatList.findIndex((c) => c._id === chat._id);\n if (index < 0) {\n this.chatList = [chat, ...this.chatList];\n return;\n }\n const existing = this.chatList[index];\n const next = [...this.chatList];\n next[index] = {\n ...existing,\n ...chat,\n _created_at: existing._created_at ?? chat._created_at,\n _modified_at: existing._modified_at ?? chat._modified_at\n };\n this.chatList = next;\n }\n\n // ── actions ───────────────────────────────────────────────\n private resetViewState() {\n this.panel = null;\n this.menuOpen = false;\n this.viewOpen = false;\n this.editingKey = \"\";\n this.editingTitle = false;\n this.showJump = false;\n this.retrievalOpen = new Set();\n // A docked list stays put; a drawer gets out of the way.\n if (this.sidebarOpen && !this.docked) this.sidebarOpen = false;\n }\n\n private async deleteOnServer(ids: (string | null)[]) {\n const client = this.resolvedClient;\n const chatId = this.activeId;\n if (!client || !chatId) return;\n for (const id of ids) {\n if (!id) continue;\n await client.llm.call(\"delete_chat_message\", { _id: chatId, message_id: id }).catch(() => {});\n }\n }\n\n private async regenerate() {\n if (this.busy) return;\n const index = this.msgs.map((m) => m.role).lastIndexOf(\"assistant\");\n const user = this.msgs[index - 1];\n if (index < 1 || user?.role !== \"user\") return;\n const removed = this.msgs.slice(index - 1);\n this.msgs = this.msgs.slice(0, index - 1);\n await this.deleteOnServer(removed.map((m) => m.id));\n await this.runTurn(this.userMessage(user.content, user.attachments));\n }\n\n private async retry(bot: ChatMessage) {\n if (this.busy) return;\n const index = this.msgs.indexOf(bot);\n const user = this.msgs[index - 1];\n if (user?.role !== \"user\") return;\n this.msgs = this.msgs.slice(0, index - 1);\n await this.runTurn(this.userMessage(user.content, user.attachments));\n }\n\n private async saveEdit(m: ChatMessage) {\n const text = this.editDraft.trim();\n const index = this.msgs.indexOf(m);\n this.editingKey = \"\";\n if (!text || index < 0 || this.busy) return;\n const removed = this.msgs.slice(index);\n this.msgs = this.msgs.slice(0, index);\n await this.deleteOnServer(removed.map((x) => x.id));\n await this.runTurn(this.userMessage(text, m.attachments));\n }\n\n private toggleRaw(key: string) {\n const next = new Set(this.rawKeys);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n this.rawKeys = next;\n }\n\n /** Adds newly saved files, and says which ones the service couldn't read. */\n private applyAttachmentResults(list: unknown) {\n if (!Array.isArray(list)) return;\n const saved = toSavedFiles(list).filter((f) => !this.savedFiles.some((x) => x.id === f.id));\n if (saved.length) this.savedFiles = [...this.savedFiles, ...saved];\n const failed = list\n .filter((item) => item?.status === \"failed\")\n .map((item) => String(item.name ?? \"file\"));\n if (failed.length) this.showToast(fill(this.msg.attachmentFailed, { name: failed.join(\", \") }));\n }\n\n /** Removes a file the service keeps on this chat. */\n private async removeSavedFile(file: ChatSavedAttachment) {\n const chatId = this.activeId;\n if (!chatId) return;\n const before = this.savedFiles;\n this.savedFiles = before.filter((f) => f !== file);\n try {\n await this.resolvedClient?.llm.call(\"remove_chat_attachment\", {\n _id: chatId,\n attachment_id: file.id\n });\n } catch {\n if (this.activeId === chatId) this.savedFiles = before;\n this.showToast(this.msg.errGeneric);\n }\n }\n\n private copy(key: string, text: string) {\n void navigator.clipboard?.writeText(text).catch(() => {});\n this.copiedKey = key;\n this.later(() => {\n if (this.copiedKey === key) this.copiedKey = \"\";\n }, 1400);\n }\n\n private async toggleMessageBookmark(m: ChatMessage) {\n const chatId = this.activeId;\n if (!chatId || !m.id) return;\n m.bookmarked = !m.bookmarked;\n this.msgs = [...this.msgs];\n this.showToast(m.bookmarked ? this.msg.messageBookmarked : this.msg.bookmarkRemoved);\n this.emit(\"singlebase-chat-bookmark\", { chatId, messageId: m.id, bookmarked: m.bookmarked });\n try {\n await this.resolvedClient?.llm.call(\"bookmark_chat_message\", {\n _id: chatId,\n message_id: m.id,\n bookmarked: m.bookmarked\n });\n } catch {\n m.bookmarked = !m.bookmarked;\n this.msgs = [...this.msgs];\n this.showToast(this.msg.errGeneric);\n }\n }\n\n private async toggleChatBookmark(chatId: string) {\n const current =\n this.chatList.find((chat) => chat._id === chatId)?.bookmarked ??\n (chatId === this.activeId ? this.bookmarked : false);\n const next = !current;\n const apply = (value: boolean) => {\n this.chatList = this.chatList.map((chat) =>\n chat._id === chatId ? { ...chat, bookmarked: value } : chat\n );\n if (chatId === this.activeId) this.bookmarked = value;\n };\n apply(next);\n this.showToast(next ? this.msg.chatBookmarked : this.msg.chatUnbookmarked);\n this.emit(\"singlebase-chat-bookmark\", { chatId, bookmarked: next });\n try {\n await this.resolvedClient?.llm.call(\"bookmark_chat\", { _id: chatId, bookmarked: next });\n } catch {\n apply(current);\n this.showToast(this.msg.errGeneric);\n }\n }\n\n /** Removed at once; the server call waits out the undo window. */\n private deleteMessage(m: ChatMessage) {\n const chatId = this.activeId;\n const index = this.msgs.indexOf(m);\n if (index < 0) return;\n this.msgs = this.msgs.filter((x) => x !== m);\n if (this.panel?.key === m.key) this.panel = null;\n this.showToast(this.msg.messageDeleted, {\n undo: () => {\n if (this.activeId !== chatId) return;\n const next = [...this.msgs];\n next.splice(index, 0, m);\n this.msgs = next;\n },\n commit: () => {\n this.emit(\"singlebase-chat-message-delete\", { chatId, messageId: m.id });\n if (chatId && m.id) {\n void this.resolvedClient?.llm\n .call(\"delete_chat_message\", { _id: chatId, message_id: m.id })\n .catch(() => {});\n }\n }\n });\n }\n\n private deleteChat(chatId: string) {\n const index = this.chatList.findIndex((chat) => chat._id === chatId);\n const summary = this.chatList[index] ?? {\n _id: chatId,\n title: this.chatTitle,\n bookmarked: this.bookmarked\n };\n const wasActive = chatId === this.activeId;\n const snapshot = wasActive\n ? { title: this.chatTitle, bookmarked: this.bookmarked, msgs: this.msgs }\n : null;\n this.chatList = this.chatList.filter((chat) => chat._id !== chatId);\n if (wasActive) this.newChat();\n\n this.showToast(this.msg.chatDeleted, {\n undo: () => {\n const next = [...this.chatList];\n next.splice(Math.max(0, index), 0, summary);\n this.chatList = next;\n if (snapshot && !this.activeId && !this.msgs.length) {\n this.activeId = chatId;\n this.chatTitle = snapshot.title;\n this.bookmarked = snapshot.bookmarked;\n this.msgs = snapshot.msgs;\n }\n },\n commit: () => {\n this.emit(\"singlebase-chat-delete\", { chatId });\n void this.resolvedClient?.llm.call(\"delete_chat\", { _id: chatId }).catch(() => {});\n }\n });\n }\n\n private feedback(m: ChatMessage, value: \"up\" | \"down\") {\n m.feedback = value;\n this.msgs = [...this.msgs];\n this.emit(\"singlebase-chat-feedback\", {\n chatId: this.activeId,\n messageId: m.id,\n value,\n text: m.content\n });\n }\n\n // ── toasts ────────────────────────────────────────────────\n private showToast(text: string, actions: { undo?: () => void; commit?: () => void } = {}) {\n this.flushToast();\n const toast: Toast = { key: Date.now(), text, ...actions };\n this.toast = toast;\n this.toastTimer = setTimeout(() => {\n if (this.toast === toast) this.flushToast();\n }, TOAST_MS);\n }\n\n /** Ends the current toast, committing whatever it was holding back. */\n private flushToast() {\n const toast = this.toast;\n clearTimeout(this.toastTimer);\n this.toast = null;\n toast?.commit?.();\n }\n\n private undo() {\n const toast = this.toast;\n clearTimeout(this.toastTimer);\n this.toast = null;\n toast?.undo?.();\n }\n\n // ── files ─────────────────────────────────────────────────\n private async addFiles(list: FileList | File[] | null | undefined) {\n const picked = Array.from(list ?? []);\n if (!picked.length) return;\n const accepted: ChatAttachment[] = [];\n for (const file of picked) {\n if (this.files.length + accepted.length >= MAX_FILES) {\n this.showToast(fill(this.msg.tooManyFiles, { n: MAX_FILES }));\n break;\n }\n if (!TEXT_FILE.test(file.name) && !file.type.startsWith(\"text/\")) {\n this.showToast(fill(this.msg.fileType, { name: file.name }));\n continue;\n }\n if (file.size > MAX_FILE_SIZE) {\n this.showToast(\n fill(this.msg.fileTooLarge, { name: file.name, size: formatSize(MAX_FILE_SIZE) })\n );\n continue;\n }\n accepted.push({\n name: file.name,\n size: file.size,\n content: await file.text(),\n ...(file.type ? { mime: file.type } : {})\n });\n }\n if (!accepted.length) return;\n this.files = [...this.files, ...accepted];\n this.emit(\"singlebase-chat-files\", {\n files: accepted.map(({ name, size }) => ({ name, size }))\n });\n }\n\n // ── scrolling ─────────────────────────────────────────────\n private async scrollToBottom() {\n await this.updateComplete;\n const scroller = this.renderRoot.querySelector(\".scroller\");\n if (scroller) scroller.scrollTop = scroller.scrollHeight;\n this.showJump = false;\n }\n\n private onScroll(event: Event) {\n const el = event.currentTarget as HTMLElement;\n this.stick = el.scrollHeight - el.scrollTop - el.clientHeight < 80;\n if (this.stick) this.showJump = false;\n }\n\n private jumpToLatest() {\n this.stick = true;\n void this.scrollToBottom();\n }\n\n // ── keyboard ──────────────────────────────────────────────\n private onKeydown(event: KeyboardEvent) {\n if (event.key !== \"Escape\") return;\n if (this.menuOpen) this.menuOpen = false;\n else if (this.viewOpen) this.viewOpen = false;\n else if (this.panel) this.panel = null;\n else if (this.sidebarOpen && !this.docked) this.sidebarOpen = false;\n else if (this.expanded) this.collapse();\n else if (this.embed === \"launcher\" && this.isOpen) this.close();\n else return;\n event.stopPropagation();\n }\n\n private onComposerKey(event: KeyboardEvent) {\n if (event.key === \"Enter\" && !event.shiftKey && !event.isComposing) {\n event.preventDefault();\n void this.send();\n }\n }\n\n private onComposerInput(event: Event) {\n const el = event.target as HTMLTextAreaElement;\n el.style.height = \"auto\";\n el.style.height = `${Math.min(176, el.scrollHeight)}px`;\n this.draft = el.value;\n }\n\n // ── drag and drop ─────────────────────────────────────────\n private onDragEnter(event: DragEvent) {\n if (!this.allowUpload || !this.showComposer) return;\n if (!Array.from(event.dataTransfer?.types ?? []).includes(\"Files\")) return;\n event.preventDefault();\n this.dragging = true;\n }\n\n private onDragLeave(event: DragEvent) {\n const target = event.currentTarget as HTMLElement;\n if (!target.contains(event.relatedTarget as Node)) this.dragging = false;\n }\n\n private onDrop(event: DragEvent) {\n event.preventDefault();\n this.dragging = false;\n if (this.allowUpload) void this.addFiles(event.dataTransfer?.files);\n }\n\n // ── render ────────────────────────────────────────────────\n override render() {\n if (this.embed === \"launcher\") return this.renderLauncher();\n const classes = [\n \"frame\",\n this.embed === \"inline\" ? \"inline boxed\" : \"\",\n this.expanded ? \"expanded boxed\" : \"\"\n ].join(\" \");\n return html`<div class=${classes} part=\"frame\">${this.renderWorkspace()}</div>`;\n }\n\n private renderLauncher() {\n const msg = this.msg;\n const frame = [\n \"frame launcher boxed\",\n this.expanded ? \"expanded\" : \"\",\n this.mobile ? \"full\" : \"\"\n ].join(\" \");\n const panel = this.isOpen\n ? html`<div class=${frame} role=\"dialog\" aria-label=${this.assistantName} part=\"frame\">\n ${this.renderWorkspace()}\n </div>`\n : nothing;\n const bubble =\n this.bubble && !this.isOpen\n ? html`<div class=\"bubble\" part=\"bubble\">\n <button type=\"button\" class=\"bubble-text\" @click=${() => this.open()}>\n ${this.bubbleText || msg.bubbleText}\n </button>\n <button\n type=\"button\"\n class=\"icon sm\"\n aria-label=${msg.dismiss}\n title=${msg.dismiss}\n @click=${() => (this.bubble = false)}\n >\n ${I.close()}\n </button>\n </div>`\n : nothing;\n const hideButton = this.isOpen && (this.expanded || this.mobile);\n const button = hideButton\n ? nothing\n : html`<button\n type=\"button\"\n class=\"launcher-btn\"\n part=\"launcher\"\n aria-label=${this.isOpen ? msg.closeChat : msg.openChat}\n aria-expanded=${this.isOpen ? \"true\" : \"false\"}\n @click=${() => (this.isOpen ? this.close() : this.open())}\n >\n ${this.isOpen ? I.chevronDown() : I.chat()}\n ${this.unreadBadge && !this.seen && !this.isOpen ? html`<span class=\"badge\"></span>` : nothing}\n </button>`;\n return html`${panel}${bubble}${button}`;\n }\n\n private renderWorkspace() {\n const overlay = !this.docked;\n return html`<div class=\"root\" @keydown=${this.onKeydown}>\n ${\n this.sidebarOpen && overlay\n ? html`<div class=\"scrim\" @click=${() => (this.sidebarOpen = false)}></div>`\n : nothing\n }\n ${this.sidebarOpen && this.sidebar !== \"none\" ? this.renderSidebar(overlay) : nothing}\n <main\n class=\"main\"\n @dragenter=${this.onDragEnter}\n @dragover=${(e: DragEvent) => e.preventDefault()}\n >\n ${this.renderHeader()}\n ${this.offline ? html`<div class=\"banner\" role=\"status\">${this.msg.offline}</div>` : nothing}\n <div\n class=\"scroller\"\n role=\"log\"\n aria-live=\"polite\"\n aria-busy=${this.busy ? \"true\" : \"false\"}\n part=\"messages\"\n @scroll=${this.onScroll}\n >\n ${\n this.msgs.length || this.loadingThread || this.threadError\n ? this.renderThread()\n : this.renderWelcome()\n }\n </div>\n ${\n this.showJump\n ? html`<button type=\"button\" class=\"jump\" @click=${this.jumpToLatest}>\n ↓ ${this.msg.newReply}\n </button>`\n : nothing\n }\n ${this.renderComposer()} ${renderBranding(this.branding, \"Chat\")}\n ${\n this.toast\n ? html`<div class=\"toast\" role=\"status\">\n <span>${this.toast.text}</span>\n ${\n this.toast.undo\n ? html`<button type=\"button\" @click=${this.undo}>${this.msg.undo}</button>`\n : nothing\n }\n </div>`\n : nothing\n }\n ${\n this.dragging\n ? html`<div\n class=\"drop\"\n @dragover=${(e: DragEvent) => e.preventDefault()}\n @dragleave=${this.onDragLeave}\n @drop=${this.onDrop}\n >\n <strong>${this.msg.dropTitle}</strong><span>${this.msg.dropSub}</span>\n </div>`\n : nothing\n }\n </main>\n ${this.renderPanel()}\n </div>`;\n }\n\n private renderSidebar(overlay: boolean) {\n const msg = this.msg;\n const query = this.allowSearch ? this.search.trim().toLowerCase() : \"\";\n const shown = this.chatList.filter(\n (chat) => !query || (chat.title ?? \"\").toLowerCase().includes(query)\n );\n // Bookmarked chats get their own group on top, unless show-bookmarked is off.\n const pinned = (c: ChatSummary) => this.showBookmarked && !!c.bookmarked;\n const inDay = (day: ReturnType<typeof dayGroup>) =>\n shown.filter((c) => !pinned(c) && dayGroup(c._modified_at ?? c._created_at) === day);\n const groups: [string, ChatSummary[]][] = [\n [msg.groupBookmarked, shown.filter(pinned)],\n [msg.groupToday, inDay(\"today\")],\n [msg.groupYesterday, inDay(\"yesterday\")],\n [msg.groupWeek, inDay(\"week\")],\n [msg.groupOlder, inDay(\"older\")]\n ];\n\n let body: unknown;\n if (this.listState === \"loading\" && !this.chatList.length) {\n body = html`<div aria-label=${msg.loadingChats}>\n ${[1, 2, 3, 4].map(() => html`<div class=\"skeleton\"></div>`)}\n </div>`;\n } else if (!shown.length) {\n body = html`<span class=\"side-note\"\n >${query ? fill(msg.noMatch, { query: this.search.trim() }) : msg.noChats}</span\n >`;\n } else {\n body = groups\n .filter(([, rows]) => rows.length)\n .map(\n ([label, rows]) =>\n html`<div class=\"group\">${label}</div>\n ${rows.map((chat) => this.renderThreadRow(chat))}`\n );\n }\n\n return html`<aside\n class=\"sidebar ${overlay ? \"overlay\" : \"docked\"}\"\n part=\"sidebar\"\n aria-label=${msg.chats}\n >\n <div class=\"side-head\">\n <span class=\"label\">${msg.chats}</span>\n <button\n type=\"button\"\n class=\"icon\"\n title=${msg.hideSidebar}\n aria-label=${msg.hideSidebar}\n @click=${() => (this.sidebarOpen = false)}\n >\n ${I.sidebar()}\n </button>\n </div>\n <div class=\"side-tools\">\n ${\n this.showNewChat\n ? html`<button type=\"button\" class=\"new-chat\" @click=${() => this.newChat()}>\n ${I.plus()}<span>${msg.newChat}</span>\n </button>`\n : nothing\n }\n ${\n this.allowSearch\n ? html`<input\n class=\"search\"\n type=\"search\"\n placeholder=${msg.searchChats}\n aria-label=${msg.searchChats}\n .value=${this.search}\n @input=${(e: Event) => (this.search = (e.target as HTMLInputElement).value)}\n />`\n : nothing\n }\n </div>\n <div class=\"threads\">${body}</div>\n <div class=\"side-extra ${this.hasSidebarContent ? \"filled\" : \"\"}\" part=\"sidebar-extra\">\n <slot\n name=\"sidebar\"\n @slotchange=${(e: Event) =>\n (this.hasSidebarContent = (e.target as HTMLSlotElement).assignedNodes().length > 0)}\n ></slot>\n </div>\n </aside>`;\n }\n\n private renderThreadRow(chat: ChatSummary) {\n const msg = this.msg;\n const active = chat._id === this.activeId;\n const title = chat.title || msg.untitled;\n if (this.renamingId === chat._id) {\n return html`<div class=\"thread active\">\n <input\n class=\"thread-rename\"\n maxlength=\"80\"\n .value=${title}\n aria-label=${msg.renameChat}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Enter\")\n this.commitRename(chat._id, (e.target as HTMLInputElement).value);\n if (e.key === \"Escape\") {\n e.stopPropagation();\n this.renamingId = \"\";\n }\n }}\n @blur=${(e: Event) => this.commitRename(chat._id, (e.target as HTMLInputElement).value)}\n />\n </div>`;\n }\n const stop = (fn: () => void) => (e: Event) => {\n e.stopPropagation();\n fn();\n };\n return html`<div\n class=\"thread ${active ? \"active\" : \"\"}\"\n role=\"button\"\n tabindex=\"0\"\n aria-current=${active ? \"true\" : \"false\"}\n @click=${() => this.openChat(chat._id)}\n @keydown=${(e: KeyboardEvent) => e.key === \"Enter\" && this.openChat(chat._id)}\n >\n <span class=\"thread-title\">${title}</span>\n <span class=\"thread-actions\">\n ${\n this.allowBookmark\n ? html`<button\n type=\"button\"\n class=\"icon sm ${chat.bookmarked ? \"on\" : \"\"}\"\n title=${chat.bookmarked ? msg.unbookmarkChat : msg.bookmarkChat}\n aria-label=${chat.bookmarked ? msg.unbookmarkChat : msg.bookmarkChat}\n @click=${stop(() => this.toggleChatBookmark(chat._id))}\n >\n ${I.bookmark(!!chat.bookmarked)}\n </button>`\n : nothing\n }\n ${\n this.allowRename\n ? html`<button\n type=\"button\"\n class=\"icon sm\"\n title=${msg.renameChat}\n aria-label=${msg.renameChat}\n @click=${stop(() => {\n this.renamingId = chat._id;\n this.focusNext = \"input.thread-rename\";\n })}\n >\n ${I.pencil()}\n </button>`\n : nothing\n }\n ${\n this.allowDelete\n ? html`<button\n type=\"button\"\n class=\"icon sm danger\"\n title=${msg.deleteChat}\n aria-label=${msg.deleteChat}\n @click=${stop(() => this.deleteChat(chat._id))}\n >\n ${I.trash()}\n </button>`\n : nothing\n }\n </span>\n </div>`;\n }\n\n private renderHeader() {\n const msg = this.msg;\n const hasChat = !!this.activeId;\n const canExpand = (this.embed === \"inline\" || this.embed === \"launcher\") && !this.mobile;\n const minimize =\n this.embed === \"launcher\" ? () => this.close() : this.expanded ? () => this.collapse() : null;\n\n let title: unknown = nothing;\n if (this.showTitle) {\n title = this.editingTitle\n ? html`<input\n class=\"title-input\"\n maxlength=\"80\"\n .value=${this.chatTitle}\n aria-label=${msg.renameChat}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Enter\") this.commitTitle((e.target as HTMLInputElement).value);\n if (e.key === \"Escape\") {\n e.stopPropagation();\n this.editingTitle = false;\n }\n }}\n @blur=${(e: Event) => this.commitTitle((e.target as HTMLInputElement).value)}\n />`\n : html`<button\n type=\"button\"\n class=\"title\"\n part=\"title\"\n ?disabled=${!hasChat || !this.allowRename}\n title=${hasChat && this.allowRename ? msg.renameChat : \"\"}\n @click=${() => {\n this.editingTitle = true;\n this.focusNext = \"input.title-input\";\n }}\n >\n ${this.chatTitle || msg.untitled}\n </button>`;\n }\n\n return html`<header class=\"header\" part=\"header\">\n <div class=\"header-left\">\n ${\n this.sidebar === \"none\" || (this.sidebarOpen && this.docked)\n ? nothing\n : html`<button\n type=\"button\"\n class=\"icon\"\n title=${msg.showChats}\n aria-label=${msg.showChats}\n @click=${() => (this.sidebarOpen = true)}\n >\n ${I.sidebar()}\n </button>`\n }\n ${title}\n </div>\n <div class=\"header-right\">\n ${\n this.sidebar === \"none\" && this.showNewChat\n ? html`<button\n type=\"button\"\n class=\"icon\"\n ?disabled=${!this.msgs.length && !hasChat}\n title=${msg.newChat}\n aria-label=${msg.newChat}\n @click=${() => this.newChat()}\n >\n ${I.plus()}\n </button>`\n : nothing\n }\n ${\n this.allowBookmark\n ? html`<button\n type=\"button\"\n class=\"icon ${this.bookmarked ? \"on\" : \"\"}\"\n ?disabled=${!hasChat}\n title=${this.bookmarked ? msg.unbookmarkChat : msg.bookmarkChat}\n aria-label=${this.bookmarked ? msg.unbookmarkChat : msg.bookmarkChat}\n @click=${() => this.activeId && this.toggleChatBookmark(this.activeId)}\n >\n ${I.bookmark(this.bookmarked)}\n </button>`\n : nothing\n }\n ${\n this.allowViewOptions && (this.showFollowups || this.showSources)\n ? html`<div class=\"menu-wrap\">\n <button\n type=\"button\"\n class=\"icon ${this.viewOpen ? \"on\" : \"\"}\"\n title=${msg.viewOptions}\n aria-label=${msg.viewOptions}\n aria-haspopup=\"menu\"\n aria-expanded=${this.viewOpen ? \"true\" : \"false\"}\n @click=${() => {\n this.menuOpen = false;\n this.viewOpen = !this.viewOpen;\n }}\n >\n ${I.view()}\n </button>\n ${this.viewOpen ? this.renderViewMenu() : nothing}\n </div>`\n : nothing\n }\n ${\n this.allowExport\n ? html`<div class=\"menu-wrap\">\n <button\n type=\"button\"\n class=\"icon ${this.menuOpen ? \"on\" : \"\"}\"\n ?disabled=${!this.msgs.length}\n title=${msg.exportChat}\n aria-label=${msg.exportChat}\n aria-haspopup=\"menu\"\n aria-expanded=${this.menuOpen ? \"true\" : \"false\"}\n @click=${() => {\n this.viewOpen = false;\n this.menuOpen = !this.menuOpen;\n }}\n >\n ${I.download()}\n </button>\n ${this.menuOpen ? this.renderExportMenu() : nothing}\n </div>`\n : nothing\n }\n ${\n this.allowDelete\n ? html`<button\n type=\"button\"\n class=\"icon danger\"\n ?disabled=${!hasChat}\n title=${msg.deleteChat}\n aria-label=${msg.deleteChat}\n @click=${() => this.activeId && this.deleteChat(this.activeId)}\n >\n ${I.trash()}\n </button>`\n : nothing\n }\n ${\n canExpand || minimize\n ? html`<span class=\"divider\"></span> ${\n canExpand\n ? html`<button\n type=\"button\"\n class=\"icon\"\n title=${this.expanded ? msg.restore : msg.expand}\n aria-label=${this.expanded ? msg.restore : msg.expand}\n @click=${() => (this.expanded ? this.collapse() : this.expand())}\n >\n ${this.expanded ? I.restore() : I.expand()}\n </button>`\n : nothing\n }\n ${\n minimize\n ? html`<button\n type=\"button\"\n class=\"icon\"\n title=${msg.minimize}\n aria-label=${msg.minimize}\n @click=${minimize}\n >\n ${I.minimize()}\n </button>`\n : nothing\n }`\n : nothing\n }\n </div>\n </header>`;\n }\n\n /** Lets the reader hide suggested questions and sources for a cleaner view. */\n private renderViewMenu() {\n const msg = this.msg;\n const items: [string, \"followups\" | \"sources\", boolean][] = [];\n if (this.showFollowups) items.push([msg.viewFollowups, \"followups\", this.followupsVisible]);\n if (this.showSources) items.push([msg.viewSources, \"sources\", this.sourcesVisible]);\n return html`<div class=\"menu-scrim\" @click=${() => (this.viewOpen = false)}></div>\n <div class=\"menu\" role=\"menu\">\n <span class=\"label\">${msg.viewHeading}</span>\n ${items.map(\n ([label, key, on]) =>\n html`<button\n type=\"button\"\n role=\"menuitemcheckbox\"\n aria-checked=${on ? \"true\" : \"false\"}\n class=\"menu-item\"\n @click=${() => this.toggleView(key)}\n >\n <span>${label}</span><span class=\"ext\">${on ? I.check() : nothing}</span>\n </button>`\n )}\n </div>`;\n }\n\n private renderExportMenu() {\n const msg = this.msg;\n const items: [string, string, ChatExportFormat][] = [\n [msg.exportMarkdown, \".md\", \"md\"],\n [msg.exportJson, \".json\", \"json\"],\n [msg.exportText, \".txt\", \"txt\"],\n [msg.exportCopy, \"\", \"copy\"]\n ];\n return html`<div class=\"menu-scrim\" @click=${() => (this.menuOpen = false)}></div>\n <div class=\"menu\" role=\"menu\">\n <span class=\"label\">${msg.exportHeading}</span>\n ${items.map(\n ([label, ext, format]) =>\n html`<button\n type=\"button\"\n role=\"menuitem\"\n class=\"menu-item\"\n @click=${() => this.exportChat(format)}\n >\n <span>${label}</span><span class=\"ext\">${ext}</span>\n </button>`\n )}\n </div>`;\n }\n\n /** The suggestion cards. `[]` or `\"none\"` shows none; unset uses the mode's. */\n private promptList(): ChatPrompt[] {\n const custom = this.wantsStarters ? \"\" : this.prompts;\n if (this.wantsStarters && this.starterList.length) {\n return this.starterList.slice(0, 4).map((text) => ({ text }));\n }\n if (Array.isArray(custom)) {\n return custom\n .map((p) => (typeof p === \"string\" ? { text: p } : p))\n .filter((p) => p?.text)\n .slice(0, 4);\n }\n if (typeof custom === \"string\" && custom.trim().toLowerCase() === \"none\") return [];\n if (typeof custom === \"string\" && custom.trim()) {\n return custom\n .split(\"|\")\n .map((text) => text.trim())\n .filter(Boolean)\n .slice(0, 4)\n .map((text) => ({ text }));\n }\n return (DEFAULT_PROMPTS[this.mode] ?? DEFAULT_PROMPTS.chat).map(([label, text]) => ({\n label,\n text\n }));\n }\n\n private renderWelcome() {\n const msg = this.msg;\n const mode = this.mode === \"rag\" ? \"Rag\" : this.mode === \"kb\" ? \"Kb\" : \"Chat\";\n const pick = (key: string) => msg[`${key}${mode}` as keyof SinglebaseChatMessages];\n const eyebrow = this.eyebrow ?? pick(\"eyebrow\");\n const prompts = this.promptList();\n // Anything the page puts in slot=\"welcome\" replaces this whole screen.\n return html`<div class=\"welcome-slot\">\n <slot name=\"welcome\"\n ><div class=\"welcome\" part=\"welcome\">\n <div class=\"welcome-head\">\n ${\n this.logoUrl && isSafeUrl(this.logoUrl, true)\n ? html`<img class=\"welcome-logo\" src=${this.logoUrl} alt=\"\" />`\n : nothing\n }\n ${eyebrow ? html`<span class=\"label\">${eyebrow}</span>` : nothing}\n <h2>${this.heading || pick(\"heading\")}</h2>\n <p>${this.description || pick(\"description\")}</p>\n </div>\n ${\n this.startersLoading\n ? html`<div class=\"prompts\" aria-hidden=\"true\">\n ${[0, 1, 2, 3].map(() => html`<div class=\"prompt skeleton\"></div>`)}\n </div>`\n : prompts.length\n ? html`<div class=\"prompts\">\n ${prompts.map(\n (p) =>\n html`<button\n type=\"button\"\n class=\"prompt\"\n part=\"prompt\"\n @click=${() => this.send(p.text)}\n >\n <span class=\"label\">${p.label || \"Suggested\"}</span>\n <span class=\"prompt-text\">${p.text}</span>\n </button>`\n )}\n </div>`\n : nothing\n }\n </div></slot\n >\n </div>`;\n }\n\n private renderThread() {\n const lastBot = this.msgs.map((m) => m.role).lastIndexOf(\"assistant\");\n return html`<div class=\"thread-view\">\n ${\n this.threadError\n ? html`<div class=\"error-card\" role=\"alert\">\n <span>${this.threadError}</span>\n ${\n this.activeId\n ? html`<button\n type=\"button\"\n class=\"btn\"\n @click=${() => this.openChat(this.activeId!)}\n >\n ${this.msg.retry}\n </button>`\n : nothing\n }\n </div>`\n : nothing\n }\n ${this.loadingThread ? html`${[1, 2].map(() => html`<div class=\"skeleton\" style=\"height:48px\"></div>`)}` : nothing}\n ${repeat(\n this.msgs,\n (m) => m.key,\n (m, i) => (m.role === \"user\" ? this.renderUser(m) : this.renderBot(m, i === lastBot))\n )}\n </div>`;\n }\n\n private renderUser(m: ChatMessage) {\n const msg = this.msg;\n const time = m.at\n ? new Date(m.at).toLocaleTimeString([], { hour: \"numeric\", minute: \"2-digit\" })\n : \"\";\n const files = m.attachments ?? [];\n return html`<div class=\"msg user\" part=\"message user\">\n ${\n files.length\n ? html`<div class=\"attachments\">\n ${files.map((f) => html`<span class=\"doc-chip\"><span class=\"ext\">${fileExt(f.name)}</span><span class=\"name\">${f.name}</span></span>`)}\n </div>`\n : nothing\n }\n ${\n this.editingKey === m.key\n ? html`<div class=\"edit-box\">\n <textarea\n rows=\"3\"\n class=\"edit-input\"\n .value=${this.editDraft}\n @input=${(e: Event) => (this.editDraft = (e.target as HTMLTextAreaElement).value)}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n this.editingKey = \"\";\n }\n }}\n ></textarea>\n <div class=\"row-end\">\n <button type=\"button\" class=\"btn\" @click=${() => (this.editingKey = \"\")}>\n ${msg.cancel}\n </button>\n <button type=\"button\" class=\"btn primary\" @click=${() => this.saveEdit(m)}>\n ${msg.saveResend}\n </button>\n </div>\n </div>`\n : html`<div class=\"bubble-user\">${m.content}</div>\n <div class=\"toolbar\">\n ${this.allowBookmark && m.bookmarked ? html`<span class=\"saved\">${I.bookmark(true)}${msg.saved}</span>` : nothing}\n ${this.showTime ? html`<span class=\"time\">${time}</span>` : nothing}\n ${\n !this.busy\n ? html`<button\n type=\"button\"\n class=\"icon\"\n title=${msg.edit}\n aria-label=${msg.edit}\n @click=${() => {\n this.editingKey = m.key;\n this.editDraft = m.content;\n this.focusNext = \"textarea.edit-input\";\n }}\n >\n ${I.pencil()}\n </button>`\n : nothing\n }\n ${\n this.allowCopy\n ? html`<button\n type=\"button\"\n class=\"icon\"\n title=${this.copiedKey === m.key ? msg.copied : msg.copy}\n aria-label=${msg.copy}\n @click=${() => this.copy(m.key, m.content)}\n >\n ${I.copy()}\n </button>`\n : nothing\n }\n ${\n this.allowBookmark && m.id\n ? html`<button\n type=\"button\"\n class=\"icon ${m.bookmarked ? \"on\" : \"\"}\"\n title=${m.bookmarked ? msg.unbookmarkMessage : msg.bookmarkMessage}\n aria-label=${m.bookmarked ? msg.unbookmarkMessage : msg.bookmarkMessage}\n @click=${() => this.toggleMessageBookmark(m)}\n >\n ${I.bookmark(m.bookmarked)}\n </button>`\n : nothing\n }\n ${\n this.allowDelete\n ? html`<button\n type=\"button\"\n class=\"icon danger\"\n title=${msg.deleteMessage}\n aria-label=${msg.deleteMessage}\n @click=${() => this.deleteMessage(m)}\n >\n ${I.trash()}\n </button>`\n : nothing\n }\n </div>`\n }\n </div>`;\n }\n\n private pillLabel(): string {\n if (this.mode === \"rag\" || this.mode === \"kb\") return this.msg.searching;\n return this.msg.thinking;\n }\n\n private renderBot(m: ChatMessage, latest: boolean) {\n const msg = this.msg;\n const pending = m.phase === \"pending\";\n const done = m.phase === \"done\";\n const count = m.sources.length;\n const cited = citedNumbers(m.content);\n const numbered = m.sources.map((s, i) => describeSource(s, i + 1));\n const cards = groupSources(cited.size ? numbered.filter((s) => cited.has(s.n)) : numbered);\n const searched = groupSources(numbered);\n const inPanel = (group: SourceGroup) =>\n this.panel?.key === m.key && group.items.some((s) => s.n === this.panel!.n);\n const time = m.at\n ? new Date(m.at).toLocaleTimeString([], { hour: \"numeric\", minute: \"2-digit\" })\n : \"\";\n const copyText =\n m.content +\n (cards.length\n ? `\\n\\nSources:\\n${cards\n .map((g) => `${g.items.map((s) => `[${s.n}]`).join(\"\")} ${g.first.title}`)\n .join(\"\\n\")}`\n : \"\");\n const retrievalOpen = this.retrievalOpen.has(m.key);\n\n return html`<div class=\"msg bot\" part=\"message assistant\">\n ${pending ? html`<div class=\"halo\"></div>` : nothing}\n ${\n this.arrivedKey === m.key\n ? html`<div class=\"arrived\">\n <div class=\"wash\"></div>\n <div class=\"ring\"></div>\n <div class=\"sweep\"></div>\n </div>`\n : nothing\n }\n <div class=\"bot-body\">\n ${this.allowBookmark && m.bookmarked ? html`<span class=\"saved\">${I.bookmark(true)}${msg.saved}</span>` : nothing}\n ${\n pending\n ? html`<div class=\"pill\" role=\"status\">\n <span class=\"ring\"></span><span class=\"dot\"></span>\n <span class=\"shimmer\">${this.pillLabel()}</span>\n </div>`\n : nothing\n }\n ${\n this.sourcesVisible && count && !pending\n ? html`<div class=\"retrieval\">\n <button\n type=\"button\"\n class=\"retrieval-toggle\"\n aria-expanded=${retrievalOpen ? \"true\" : \"false\"}\n @click=${() => {\n const next = new Set(this.retrievalOpen);\n if (next.has(m.key)) next.delete(m.key);\n else next.add(m.key);\n this.retrievalOpen = next;\n }}\n >\n <span class=\"chev\">${retrievalOpen ? \"▾\" : \"▸\"}</span>\n <span style=\"flex:1\">${fill(msg.searchedSources, { n: searched.length })}</span>\n ${m.execTime !== undefined ? html`<span class=\"ms\">${m.execTime.toFixed(1)}s</span>` : nothing}\n </button>\n ${\n retrievalOpen\n ? html`<div class=\"retrieval-list\">\n ${searched.map((g) => {\n const s = g.first;\n const scores = g.items\n .map((x) => x.score)\n .filter((x): x is number => x !== null);\n const score = scores.length ? Math.max(...scores) : null;\n const detail =\n g.items.length > 1\n ? fill(msg.passageCount, { n: g.items.length })\n : s.section;\n return html`<button\n type=\"button\"\n class=\"passage\"\n @click=${() => (this.panel = { key: m.key, n: s.n })}\n >\n <span class=\"n\">${s.n}</span>\n <span class=\"what\"\n ><span>${s.title}${detail ? ` · ${detail}` : \"\"}</span\n ><span>${s.collection || s.path}</span></span\n >\n ${\n score !== null\n ? html`<span class=\"relevance\"\n ><span class=\"score\">${score.toFixed(2)}</span>\n <span class=\"relevance-track\"\n ><span\n class=\"relevance-fill\"\n style=\"width:${Math.round(score * 100)}%\"\n ></span></span\n ></span>`\n : html`<span></span>`\n }\n </button>`;\n })}\n </div>`\n : nothing\n }\n </div>`\n : nothing\n }\n ${!pending ? this.renderAnswer(m) : nothing}\n ${m.phase === \"streaming\" ? html`<span class=\"caret\"></span>` : nothing}\n ${\n m.phase === \"error\"\n ? html`<div class=\"error-card\" role=\"alert\">\n <span>${m.error}</span>\n <button type=\"button\" class=\"btn\" @click=${() => this.retry(m)}>\n ${msg.retry}\n </button>\n </div>`\n : nothing\n }\n ${\n this.sourcesVisible && done && cards.length\n ? html`<div class=\"cards\">\n <span class=\"label\">${cited.size ? msg.sourcesCited : msg.sourcesRetrieved}</span>\n <div class=\"card-grid\">\n ${cards.map((g) => {\n const s = g.first;\n const detail =\n g.items.length > 1\n ? fill(msg.passageCount, { n: g.items.length })\n : s.section;\n return html`<button\n type=\"button\"\n class=\"source-card ${inPanel(g) ? \"active\" : \"\"}\"\n @click=${() => (this.panel = { key: m.key, n: s.n })}\n >\n <span class=\"top\"\n ><span class=\"nums\"\n >${g.items.map((x) => html`<span class=\"num\">${x.n}</span>`)}</span\n >${s.collection ? html`<span class=\"label\">${s.collection}</span>` : nothing}</span\n >\n <span class=\"t\">${s.title}${detail ? ` · ${detail}` : \"\"}</span>\n <span class=\"s\">${s.text}</span>\n </button>`;\n })}\n </div>\n </div>`\n : nothing\n }\n ${\n done\n ? html`<div class=\"toolbar ${latest ? \"pinned\" : \"\"}\">\n ${\n this.allowCopy\n ? html`<button\n type=\"button\"\n class=\"icon\"\n title=${this.copiedKey === m.key ? msg.copied : msg.copy}\n aria-label=${msg.copy}\n @click=${() => this.copy(m.key, copyText)}\n >\n ${I.copy()}\n </button>`\n : nothing\n }\n ${\n this.allowRaw && this.formatLevel !== \"raw\" && m.content\n ? html`<button\n type=\"button\"\n class=\"icon ${this.rawKeys.has(m.key) ? \"on\" : \"\"}\"\n title=${this.rawKeys.has(m.key) ? msg.showFormatted : msg.showRaw}\n aria-label=${msg.showRaw}\n aria-pressed=${this.rawKeys.has(m.key) ? \"true\" : \"false\"}\n @click=${() => this.toggleRaw(m.key)}\n >\n ${I.raw()}\n </button>`\n : nothing\n }\n ${\n this.allowRegenerate && latest && !this.busy\n ? html`<button\n type=\"button\"\n class=\"icon\"\n title=${msg.regenerate}\n aria-label=${msg.regenerate}\n @click=${() => this.regenerate()}\n >\n ${I.refresh()}\n </button>`\n : nothing\n }\n ${\n this.allowBookmark && m.id\n ? html`<button\n type=\"button\"\n class=\"icon ${m.bookmarked ? \"on\" : \"\"}\"\n title=${m.bookmarked ? msg.unbookmarkMessage : msg.bookmarkMessage}\n aria-label=${m.bookmarked ? msg.unbookmarkMessage : msg.bookmarkMessage}\n @click=${() => this.toggleMessageBookmark(m)}\n >\n ${I.bookmark(m.bookmarked)}\n </button>`\n : nothing\n }\n ${\n this.allowDelete\n ? html`<button\n type=\"button\"\n class=\"icon danger\"\n title=${msg.deleteMessage}\n aria-label=${msg.deleteMessage}\n @click=${() => this.deleteMessage(m)}\n >\n ${I.trash()}\n </button>`\n : nothing\n }\n ${this.showTime ? html`<span class=\"time\">${time}</span>` : nothing}\n ${m.stopped ? html`<span class=\"note\">${msg.stopped}</span>` : nothing}\n <span class=\"spacer\"></span>\n ${\n !this.allowFeedback\n ? nothing\n : m.feedback\n ? html`<span class=\"note\"\n >${m.feedback === \"up\" ? msg.markedHelpful : msg.thanksFeedback}</span\n >`\n : html`<button\n type=\"button\"\n class=\"icon\"\n title=${msg.helpful}\n aria-label=${msg.helpful}\n @click=${() => this.feedback(m, \"up\")}\n >\n ${I.thumb()}\n </button>\n <button\n type=\"button\"\n class=\"icon\"\n title=${msg.notHelpful}\n aria-label=${msg.notHelpful}\n @click=${() => this.feedback(m, \"down\")}\n >\n ${I.thumb(true)}\n </button>`\n }\n </div>`\n : nothing\n }\n ${\n this.followupsVisible && done && latest && !this.busy && m.followups.length\n ? html`<div class=\"followups\">\n ${m.followups.map(\n (q) =>\n html`<button type=\"button\" class=\"followup\" @click=${() => this.send(q)}>\n <span class=\"arrow\">↳</span><span>${q}</span>\n </button>`\n )}\n </div>`\n : nothing\n }\n </div>\n </div>`;\n }\n\n private renderAnswer(m: ChatMessage) {\n if (m.phase === \"error\" && !m.content) return nothing;\n if (m.phase === \"done\" && !m.content) {\n return m.stopped\n ? nothing\n : html`<div class=\"answer\"><p class=\"note\">${this.msg.emptyReply}</p></div>`;\n }\n const level = this.formatLevel;\n if (level === \"raw\" || (this.allowRaw && this.rawKeys.has(m.key))) {\n return html`<div class=\"answer\" part=\"answer\"><p class=\"raw\">${m.content}</p></div>`;\n }\n const source = m.phase === \"streaming\" ? settleStreaming(m.content) : m.content;\n let blocks = adaptBlocks(parseMarkdown(source), level);\n if (this.afterParse) {\n try {\n const out = this.afterParse(blocks, { message: m, format: level });\n if (Array.isArray(out)) blocks = out;\n else\n console.warn(\n \"[singlebase-chat] afterParse must return an array of blocks; showing the original.\"\n );\n } catch (error) {\n console.warn(\"[singlebase-chat] afterParse failed; showing the original.\", error);\n }\n }\n // Citations may go up to the highest source number the service gave.\n const maxCite = m.sources.reduce(\n (max: number, source, i) => Math.max(max, describeSource(source, i + 1).n),\n 0\n );\n return html`<div class=\"answer\" part=\"answer\">\n ${blocks.map((b, i) => this.renderBlock(b, m, maxCite, i))}\n </div>`;\n }\n\n private renderInline(text: string, m: ChatMessage, maxCite: number) {\n return parseInline(text, maxCite).map((seg) => {\n switch (seg.type) {\n case \"bold\":\n return html`<strong>${seg.text}</strong>`;\n case \"italic\":\n return html`<em>${seg.text}</em>`;\n case \"strike\":\n return html`<s>${seg.text}</s>`;\n case \"code\":\n return html`<code class=\"inline\">${seg.text}</code>`;\n case \"link\":\n return html`<a href=${seg.href} target=\"_blank\" rel=\"noopener noreferrer nofollow\"\n >${seg.text}</a\n >`;\n case \"cite\": {\n const cls = this.panel?.key === m.key && this.panel.n === seg.n ? \"cite active\" : \"cite\";\n const label = fill(this.msg.openSource, { n: seg.n });\n const open = () => (this.panel = { key: m.key, n: seg.n });\n // Kept on one line: whitespace inside the chip would sit next to the number.\n // prettier-ignore\n return html`<button type=\"button\" class=${cls} aria-label=${label} @click=${open}>${seg.n}</button>`;\n }\n default:\n return seg.text;\n }\n });\n }\n\n private renderBlock(block: Block, m: ChatMessage, maxCite: number, index: number): unknown {\n switch (block.type) {\n case \"p\":\n return html`<p>${this.renderInline(block.text, m, maxCite)}</p>`;\n case \"raw\":\n return html`<p class=\"raw\">${block.text}</p>`;\n case \"h\":\n return html`<h3 class=\"h${block.level}\">${this.renderInline(block.text, m, maxCite)}</h3>`;\n case \"hr\":\n return html`<hr />`;\n case \"list\":\n return this.renderList(block.ordered, block.items, m, maxCite);\n case \"quote\":\n return html`<div class=\"quote\">${this.renderInline(block.text, m, maxCite)}</div>`;\n case \"callout\":\n return html`<div class=\"callout ${block.kind}\" role=\"note\" part=\"callout\">\n <strong class=\"callout-title\"\n >${block.title || this.msg[CALLOUT_MESSAGE[block.kind]]}</strong\n >\n ${block.text\n .split(\"\\n\")\n .filter((line) => line.trim())\n .map((line) => html`<p>${this.renderInline(line, m, maxCite)}</p>`)}\n </div>`;\n case \"code\":\n return (\n this.renderCustom(block.lang, block.text, m) ??\n this.renderCode(block.lang, block.text, `${m.key}:${index}`)\n );\n case \"table\":\n return this.renderTable(\n block.head,\n block.rows,\n block.align,\n m,\n maxCite,\n `${m.key}:${index}`\n );\n case \"json\":\n return this.renderJsonBlock(block.value, block.source, `${m.key}:${index}`);\n case \"svg\": {\n const url = svgDataUrl(block.source);\n if (!url) return this.renderCode(\"svg\", block.source, `${m.key}:${index}`);\n const key = `${m.key}:${index}`;\n return html`<figure class=\"svg\" part=\"svg\">\n <img src=${url} alt=\"Drawing\" />\n <figcaption>\n <button type=\"button\" class=\"text-btn\" @click=${() => this.copy(key, block.source)}>\n ${this.copiedKey === key ? this.msg.copied : this.msg.copySvg}\n </button>\n </figcaption>\n </figure>`;\n }\n case \"pending\":\n return html`<div class=\"chart-pending\">\n <span class=\"label\"\n >${block.kind === \"svg\" ? this.msg.renderingSvg : this.msg.renderingChart}</span\n >\n </div>`;\n case \"chart\":\n return this.renderChart(block.spec);\n case \"img\":\n return html`<div class=\"gallery ${block.images.length > 1 ? \"many\" : \"\"}\">\n ${block.images.map(\n (image) =>\n html`<figure>\n ${\n image.src && isSafeUrl(image.src, true)\n ? html`<img\n src=${image.src}\n alt=${image.alt}\n loading=\"lazy\"\n referrerpolicy=\"no-referrer\"\n />`\n : html`<div class=\"img-missing\"><span class=\"label\">Image</span></div>`\n }\n ${image.alt ? html`<figcaption>${image.alt}</figcaption>` : nothing}\n </figure>`\n )}\n </div>`;\n default:\n return nothing;\n }\n }\n\n private renderList(ordered: boolean, items: ListItem[], m: ChatMessage, maxCite: number) {\n const rows = items.map(\n (item) =>\n html`<li\n class=${item.checked === null ? \"\" : \"task\"}\n style=${item.depth ? `margin-left:${item.depth * 20}px` : \"\"}\n >\n ${\n item.checked === null\n ? nothing\n : html`<input type=\"checkbox\" disabled .checked=${item.checked} aria-hidden=\"true\" />`\n }\n ${this.renderInline(item.text, m, maxCite)}\n </li>`\n );\n return ordered\n ? html`<ol>\n ${rows}\n </ol>`\n : html`<ul>\n ${rows}\n </ul>`;\n }\n\n private renderCode(lang: string, text: string, key: string) {\n return html`<div class=\"code\">\n <div class=\"code-head\">\n <span class=\"label\">${lang}</span>\n <button type=\"button\" class=\"text-btn\" @click=${() => this.copy(key, text)}>\n ${this.copiedKey === key ? this.msg.copied : this.msg.copy}\n </button>\n </div>\n <pre><code>${text}</code></pre>\n </div>`;\n }\n\n /** A host renderer for this language, at the rich level only. */\n private renderCustom(lang: string, text: string, m: ChatMessage): unknown {\n const draw = this.formatLevel === \"rich\" ? this.renderers?.[lang] : undefined;\n if (typeof draw !== \"function\" || m.phase === \"streaming\") return null;\n try {\n const out = draw(text, { lang, message: m });\n return out === null || out === undefined\n ? null\n : html`<div class=\"custom-block\">${out}</div>`;\n } catch (error) {\n console.warn(`[singlebase-chat] the \"${lang}\" renderer failed; showing the source`, error);\n return null;\n }\n }\n\n private renderTable(\n head: string[],\n rows: string[][],\n align: (string | null)[],\n m: ChatMessage,\n maxCite: number,\n key: string\n ) {\n const numeric = (value: string) =>\n /^[-+]?[$€£¥]?\\s?[\\d,.]+\\s?%?$/.test(value.trim()) && /\\d/.test(value);\n const toNumber = (value: string) => Number(value.replace(/[^\\d.+-]/g, \"\"));\n const alignOf = head.map((_, col) => {\n if (align[col]) return align[col];\n const cells = rows.map((r) => r[col] ?? \"\").filter(Boolean);\n return cells.length && cells.filter(numeric).length / cells.length >= 0.8 ? \"right\" : null;\n });\n\n const sort = this.sorts.get(key);\n let shown = rows;\n if (sort) {\n shown = [...rows].sort((a, b) => {\n const x = a[sort.col] ?? \"\";\n const y = b[sort.col] ?? \"\";\n const diff =\n numeric(x) && numeric(y)\n ? toNumber(x) - toNumber(y)\n : x.localeCompare(y, undefined, { numeric: true });\n return diff * sort.dir;\n });\n }\n const total = shown.length;\n shown = shown.slice(0, MAX_TABLE_ROWS);\n\n const sortBy = (col: number) => {\n const next = new Map(this.sorts);\n const current = next.get(key);\n if (current?.col === col && current.dir === -1) next.delete(key);\n else next.set(key, { col, dir: current?.col === col ? -1 : 1 });\n this.sorts = next;\n };\n const style = (col: number) => (alignOf[col] ? `text-align:${alignOf[col]}` : \"\");\n\n return html`<div class=\"table\" part=\"table\">\n <table>\n <thead>\n <tr>\n ${head.map((cell, col) => {\n const state =\n sort?.col === col ? (sort.dir === 1 ? \"ascending\" : \"descending\") : \"none\";\n return html`<th style=${style(col)} aria-sort=${state}>\n ${\n rows.length > 1\n ? html`<button type=\"button\" class=\"sort\" @click=${() => sortBy(col)}>\n ${this.renderInline(cell, m, maxCite)}<span class=\"arrow\"\n >${state === \"ascending\" ? \"↑\" : state === \"descending\" ? \"↓\" : \"↕\"}</span\n >\n </button>`\n : this.renderInline(cell, m, maxCite)\n }\n </th>`;\n })}\n </tr>\n </thead>\n <tbody>\n ${shown.map(\n (row) =>\n html`<tr>\n ${head.map(\n (_, col) =>\n html`<td style=${style(col)}>\n ${this.renderInline(row[col] ?? \"\", m, maxCite)}\n </td>`\n )}\n </tr>`\n )}\n </tbody>\n </table>\n ${\n total > shown.length\n ? html`<div class=\"table-note\">\n ${fill(this.msg.showingRows, { n: shown.length, total })}\n </div>`\n : nothing\n }\n </div>`;\n }\n\n private renderJsonBlock(value: unknown, source: string, key: string) {\n let nodes = 0;\n const count = (v: unknown): void => {\n nodes++;\n if (nodes <= MAX_JSON_NODES && v && typeof v === \"object\") Object.values(v).forEach(count);\n };\n count(value);\n if (nodes > MAX_JSON_NODES) return this.renderCode(\"json\", source, key);\n\n const node = (v: unknown, depth: number, name?: string): unknown => {\n const label = name === undefined ? nothing : html`<span class=\"jkey\">${name}</span>: `;\n if (v && typeof v === \"object\") {\n const entries = Object.entries(v);\n const meta = Array.isArray(v) ? `[${entries.length}]` : `{${entries.length}}`;\n return html`<details class=\"jnode\" ?open=${depth < 2}>\n <summary>${label}<span class=\"jmeta\">${meta}</span></summary>\n <div class=\"jkids\">${entries.map(([k, child]) => node(child, depth + 1, k))}</div>\n </details>`;\n }\n const type = v === null ? \"null\" : typeof v;\n return html`<div class=\"jleaf\">\n ${label}<span class=\"jv ${type}\">${JSON.stringify(v)}</span>\n </div>`;\n };\n\n return html`<div class=\"code json\" part=\"json\">\n <div class=\"code-head\">\n <span class=\"label\">json</span>\n <button type=\"button\" class=\"text-btn\" @click=${() => this.copy(key, source)}>\n ${this.copiedKey === key ? this.msg.copied : this.msg.copy}\n </button>\n </div>\n <div class=\"jtree\">${node(value, 0)}</div>\n </div>`;\n }\n\n private renderChart(spec: ChartSpec) {\n const legend =\n spec.series.length > 1\n ? html`<span class=\"legend\">\n ${spec.series.map(\n (s, k) =>\n html`<span\n ><span\n class=\"swatch\"\n style=\"background:${CHART_COLORS[k % CHART_COLORS.length]}\"\n ></span\n >${s.name}</span\n >`\n )}\n </span>`\n : nothing;\n const head = html`<div class=\"chart-head\">\n <span class=\"chart-title\">${spec.title}</span>${legend}\n </div>`;\n\n if (spec.type === \"line\") {\n const peak = Math.max(0, ...spec.series.flatMap((s) => s.values));\n const scale = Math.pow(10, Math.floor(Math.log10(peak || 1)));\n const max = (Math.ceil((peak / scale) * 2) / 2) * scale || 1;\n const n = Math.max(spec.labels.length, ...spec.series.map((s) => s.values.length));\n return html`<figure class=\"chart\" part=\"chart\" aria-label=${spec.title}>\n ${head}\n <div class=\"line-chart\">\n <div class=\"plot\">\n ${[1, 0.5, 0].map(\n (f) =>\n html`<div class=\"tick ${f === 0 ? \"base\" : \"\"}\" style=\"top:${(1 - f) * 100}%\">\n <span>${formatNumber(Math.round(max * f), spec.unit)}</span>\n </div>`\n )}\n <svg\n viewBox=\"0 0 600 170\"\n preserveAspectRatio=\"none\"\n role=\"img\"\n aria-label=${spec.title}\n >\n ${spec.series.map(\n (\n s,\n k\n ) => svg`<polyline pathLength=\"1\" stroke=${CHART_COLORS[k % CHART_COLORS.length]}\n points=${s.values\n .map(\n (v, i) =>\n `${(n > 1 ? (i / (n - 1)) * 600 : 300).toFixed(1)},${(170 - (v / max) * 170).toFixed(1)}`\n )\n .join(\n \" \"\n )}><title>${s.name}: ${s.values.map((v) => formatNumber(v, spec.unit)).join(\", \")}</title></polyline>`\n )}\n </svg>\n </div>\n <div class=\"x-labels\">${spec.labels.map((label) => html`<span>${label}</span>`)}</div>\n </div>\n </figure>`;\n }\n\n const totals = spec.labels.map((_, i) =>\n spec.series.reduce((sum, s) => sum + (s.values[i] || 0), 0)\n );\n const max = Math.max(0, ...totals) || 1;\n return html`<figure class=\"chart\" part=\"chart\" aria-label=${spec.title}>\n ${head}\n <div class=\"bars\">\n ${spec.labels.map(\n (label, i) =>\n html`<div class=\"bar-row\" title=\"${label}: ${formatNumber(totals[i], spec.unit)}\">\n <span class=\"bar-label\">${label}</span>\n <span class=\"bar-track\"\n ><span class=\"bar-fill\" style=\"width:${(Math.max(0, totals[i]) / max) * 100}%\">\n ${spec.series.map(\n (s, k) =>\n html`<span\n style=\"flex:${Math.max(0, s.values[i] || 0)};background:${spec.series.length > 1 ? CHART_COLORS[k % CHART_COLORS.length] : \"var(--c-ink)\"}\"\n ></span>`\n )}\n </span></span\n >\n <span class=\"bar-value\">${formatNumber(totals[i], spec.unit)}</span>\n </div>`\n )}\n </div>\n </figure>`;\n }\n\n private renderPanel() {\n if (!this.panel) return nothing;\n const m = this.msgs.find((x) => x.key === this.panel!.key);\n if (!m) return nothing;\n const numbered = m.sources.map((x, i) => describeSource(x, i + 1));\n const s = numbered.find((x) => x.n === this.panel!.n);\n if (!s) return nothing;\n const msg = this.msg;\n const cited = citedNumbers(m.content);\n const used = numbered.filter((o) => o.n === s.n || !cited.size || cited.has(o.n));\n const groups = groupSources(used);\n // Every cited passage of this document, with the chosen one marked.\n const passages = groups.find((g) => g.doc === s.doc)?.items ?? [s];\n const others = groups.filter((g) => g.doc !== s.doc);\n const scores = passages.map((x) => x.score).filter((x): x is number => x !== null);\n const meta = [\n s.updated ? `Updated ${s.updated}` : \"\",\n scores.length ? `Relevance ${Math.max(...scores).toFixed(2)}` : \"\",\n passages.length > 1 ? fill(msg.passageCount, { n: passages.length }) : \"\"\n ]\n .filter(Boolean)\n .join(\" · \");\n const reference = (x: typeof s) =>\n `\"${x.text}\"\\n— ${x.title} [${x.n}]${x.path ? `\\n${x.path}` : \"\"}${x.updated ? ` · Updated ${x.updated}` : \"\"}`;\n\n return html`<aside\n class=\"panel ${this.panelDocked ? \"docked\" : \"overlay\"}\"\n part=\"panel\"\n role=\"region\"\n aria-label=${fill(msg.sourceLabel, { n: s.n })}\n >\n <div class=\"panel-head\">\n <span class=\"label\"\n >${fill(msg.sourceLabel, { n: passages.map((x) => x.n).join(\", \") })}${s.collection ? ` · ${s.collection}` : \"\"}</span\n >\n <button type=\"button\" class=\"text-btn underline\" @click=${() => (this.panel = null)}>\n ${msg.close}\n </button>\n </div>\n <div class=\"panel-body\">\n <div class=\"panel-meta\">\n <h3>${s.title}</h3>\n ${passages.length === 1 && s.section ? html`<span class=\"meta\">${s.section}</span>` : nothing}\n ${s.path ? html`<span class=\"path\">${s.path}</span>` : nothing}\n ${meta ? html`<span class=\"meta\">${meta}</span>` : nothing}\n </div>\n ${passages.map((x) => {\n const refKey = `ref:${m.key}:${x.n}`;\n return html`<div\n class=\"passage-box ${passages.length > 1 && x.n === s.n ? \"current\" : \"\"}\"\n data-n=${x.n}\n >\n ${\n passages.length > 1\n ? html`<span class=\"passage-head\"\n ><span class=\"num\">${x.n}</span\n >${x.section ? html`<span class=\"meta\">${x.section}</span>` : nothing}</span\n >`\n : nothing\n }\n <span class=\"text\">${x.text}</span>\n <div class=\"passage-foot\">\n <span class=\"label\">${msg.citedPassage}</span>\n <button\n type=\"button\"\n class=\"copy-ref\"\n title=${msg.copyReference}\n aria-label=${msg.copyReference}\n @click=${() => this.copy(refKey, reference(x))}\n >\n ${I.copy()}<span>${this.copiedKey === refKey ? msg.copied : msg.copy}</span>\n </button>\n </div>\n </div>`;\n })}\n </div>\n ${\n others.length\n ? html`<div class=\"panel-foot\">\n <span class=\"label\">${msg.alsoCited}</span>\n <div class=\"chips\">\n ${others.map(\n (g) =>\n html`<button\n type=\"button\"\n class=\"chip\"\n @click=${() => (this.panel = { key: m.key, n: g.first.n })}\n >\n ${g.items.map((x) => x.n).join(\", \")} · ${g.first.title}\n </button>`\n )}\n </div>\n </div>`\n : nothing\n }\n </aside>`;\n }\n\n private renderComposer() {\n const msg = this.msg;\n const placeholder =\n this.mode === \"rag\"\n ? msg.placeholderRag\n : this.mode === \"kb\"\n ? msg.placeholderKb\n : fill(msg.placeholderChat, { name: this.assistantName });\n const cantSend = !this.draft.trim();\n const footnote =\n this.footnote === \"\"\n ? nothing\n : html`<span class=\"footnote\" part=\"footnote\"\n >${this.footnote ?? fill(msg.footnote, { name: this.assistantName })}</span\n >`;\n // Without a composer the chat is a reader: the conversation, and the footnote.\n if (!this.showComposer) {\n return html`<div class=\"composer-wrap reader\">\n <div class=\"composer-col\">${footnote}</div>\n </div>`;\n }\n return html`<div class=\"composer-wrap\">\n <div class=\"composer-col\">\n <input\n type=\"file\"\n multiple\n hidden\n accept=\".md,.markdown,.txt,.csv,.tsv,.json,.html,.htm,.yaml,.yml,.xml,.log,text/*\"\n @change=${(e: Event) => {\n const input = e.target as HTMLInputElement;\n void this.addFiles(input.files).then(() => (input.value = \"\"));\n }}\n />\n <div class=\"composer-box\">\n ${this.busy ? html`<div class=\"composer-glow\"></div>` : nothing}\n <div class=\"composer ${this.busy ? \"busy\" : \"\"}\" part=\"composer\">\n ${\n this.savedFiles.length\n ? html`<div class=\"pending-files\" part=\"saved-files\">\n ${this.savedFiles.map(\n (f) =>\n html`<div class=\"pending-file kept\">\n <span class=\"ext\">${fileExt(f.name)}</span>\n <span class=\"meta\"\n ><span class=\"name\">${f.name}</span\n ><span class=\"size\">${msg.inThisChat}</span></span\n >\n <button\n type=\"button\"\n aria-label=${msg.removeFromChat}\n title=${msg.removeFromChat}\n @click=${() => this.removeSavedFile(f)}\n >\n ×\n </button>\n </div>`\n )}\n </div>`\n : nothing\n }\n ${\n this.files.length\n ? html`<div class=\"pending-files\">\n ${this.files.map(\n (f) =>\n html`<div class=\"pending-file\">\n <span class=\"ext\">${fileExt(f.name)}</span>\n <span class=\"meta\"\n ><span class=\"name\">${f.name}</span\n ><span class=\"size\">${formatSize(f.size)}</span></span\n >\n <button\n type=\"button\"\n aria-label=${msg.removeFile}\n title=${msg.removeFile}\n @click=${() => (this.files = this.files.filter((x) => x !== f))}\n >\n ×\n </button>\n </div>`\n )}\n </div>`\n : nothing\n }\n <textarea\n class=\"input\"\n rows=\"1\"\n placeholder=${placeholder}\n aria-label=${placeholder}\n .value=${this.draft}\n @input=${this.onComposerInput}\n @keydown=${this.onComposerKey}\n ></textarea>\n <div class=\"composer-row\">\n <div>\n ${\n this.allowUpload\n ? html`<button\n type=\"button\"\n class=\"attach\"\n title=${msg.attach}\n aria-label=${msg.attach}\n @click=${() => this.renderRoot.querySelector<HTMLInputElement>(\"input[type=file]\")?.click()}\n >\n ${I.clip()}\n </button>`\n : nothing\n }\n </div>\n ${\n this.busy\n ? html`<button\n type=\"button\"\n class=\"send stop\"\n title=${msg.stop}\n aria-label=${msg.stop}\n @click=${() => this.stop()}\n >\n ${I.stop()}\n </button>`\n : html`<button\n type=\"button\"\n class=\"send\"\n title=${msg.send}\n aria-label=${msg.send}\n ?disabled=${cantSend}\n @click=${() => this.send()}\n >\n ${I.up()}\n </button>`\n }\n </div>\n </div>\n ${this.busy ? html`<div class=\"composer-ring\"><div class=\"ring\"></div></div>` : nothing}\n </div>\n ${footnote}\n </div>\n </div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"singlebase-chat\": SinglebaseChat;\n }\n}\n","/**\n * Entry point for the self-contained `<script type=\"module\">` build.\n *\n * On top of registering every element it does two things the npm entry point\n * deliberately does not:\n *\n * 1. exposes the SDK on `window.Singlebase`, so a page with no bundler can\n * still reach `Singlebase.SinglebaseClient(...)`;\n * 2. reads configuration off its own <script> tag, so the common case —\n * \"drop in a tag, show a sign-in box\" — needs no JavaScript at all.\n *\n * Only the `wk_`-prefixed web key ever belongs in these attributes. They are\n * public page source; a root, server or agent key must never appear here.\n */\nimport { SinglebaseClient, type SinglebaseClientOptions } from \"@singlebase/singlebase-sdk\";\n\nexport * from \"./index.js\";\nexport { SinglebaseClient, SinglebaseAuth } from \"@singlebase/singlebase-sdk\";\n\nfunction autoConfig(): SinglebaseClientOptions | null {\n const script =\n (document.currentScript as HTMLScriptElement | null) ??\n document.querySelector<HTMLScriptElement>(\n \"script[data-singlebase-api-key], script[data-singlebase-url-access-key], script[data-singlebase-base-url]\"\n );\n if (!script) return null;\n\n const { baseUrl, singlebaseUrlAccessKey, singlebaseApiKey, singlebaseBaseUrl } =\n script.dataset as Record<string, string | undefined>;\n\n // Every connection option is optional, so a tag configures a client when it\n // carries at least one of them. A bare tag is a plain library load: creating\n // a client then would claim the page default before the app's own call.\n const base = singlebaseBaseUrl ?? baseUrl;\n if (!singlebaseApiKey && !singlebaseUrlAccessKey && !base) return null;\n\n // Only what the tag actually sets: the SDK supplies the default base URL.\n const config: SinglebaseClientOptions = {};\n if (base) config.baseUrl = base;\n if (singlebaseUrlAccessKey) config.urlAccessKey = singlebaseUrlAccessKey;\n if (singlebaseApiKey) config.apiKey = singlebaseApiKey;\n return config;\n}\n\nif (typeof document !== \"undefined\") {\n const config = autoConfig();\n if (config) {\n try {\n // Constructing the client registers it as the page default, which is\n // what lets a bare <singlebase-authui> find a session.\n SinglebaseClient(config);\n } catch (error) {\n console.error(\"[singlebase] auto-configuration failed:\", error);\n }\n }\n\n const globalScope = globalThis as unknown as Record<string, unknown>;\n globalScope.Singlebase = {\n ...(globalScope.Singlebase as Record<string, unknown> | undefined),\n SinglebaseClient\n };\n}\n"],"names":["g","r","$","z","e","k","p","C","P","n","t","B","I","s","o","a","c","i","h","f","K","X$1","A","V","j","l","m","d","w","N","H","b","E","S","D","T","M","G","te","re","ne","se","x","v","F","J","u","W","U","L","oe","ie","_","q","Y","ae","O","Q","R","y","Z","ce","le","fe","V$1","ee","X","n$3","y$1","_a","_b","AuthController","host","__publicField","client","state","TOKEN_DEFAULTS","tokenDefaults","css","unsafeCSS","sharedStyles","defaultMessages","resolveMessages","overrides","SinglebaseElementBase","LitElement","__privateAdd","_client","_messages","_theme","_density","_fieldStyle","_radius","__privateGet","__privateSet","getDefaultClient","shared","config","key","AUTHUI_PROP_KEYS","value","authUIAttributeFor","name","changed","__decorateClass","property","resolveRedirectTarget","candidate","currentHref","onRefused","here","target","SettingsController","override","pending","settings","error","BRIDGED_EVENTS","SPEC_ALIASES","callbackPropFor","event","__","EventBridge","detail","callback","init","alias","off","brandingStyles","BRANDING_URL","BRANDING_TITLE","renderBranding","show","product","html","nothing","linkStorageKey","nonceKey","MARKS","oauthReady","startIntent","intent","oauthProviders","id","describeAuthError","msg","SinglebaseAuthError","mapErrorToHint","newPasswordPlaceholder","policy","min","passwordError","password","max","passwordRules","rules","label","renderPasswordRules","rule","SinglebaseFormBase","_phase","_formError","_noticeMessage","task","fullNameOf","user","initialsOf","word","email","defaultUploadMessages","resolveUploadMessages","fill","template","values","match","UNITS","parseSize","amount","formatSize","bytes","fileExtension","filename","dot","extensionOf","acceptsFile","accept","type","lowerName","lowerType","acceptSummary","parts","slash","fileKey","file","renameKeepingExtension","original","typed","clean","extension","UNKNOWN","PDF_HEAD","PDF_TAIL","MAX_STREAMS","MAX_INFLATED","OOXML","inspectFile","inspectPdf","inspectOoxml","isInspectable","head","bytesOf","tail","text","latin1","encrypted","pages","pageCountIn","pageCountInStreams","direct","inflated","streams","start","end","out","inflate","magic","isCompoundFile","app","readZipEntry","tag","byte","wanted","tailSize","eocd","size","offset","cd","decoder","method","compressed","nameLength","extraLength","commentLength","localOffset","local","data","blob","format","stream","jsonAttr","parsed","flagAttr","CONFIG_KEYS","SinglebaseUploader","_view","_dropzone","_allowRename","_autoUpload","_branding","_logoUrl","_logoText","_heading","_description","_maxFiles","_maxSize","_minSize","_accept","_rules","_bucket","_metadata","_options","_publicRead","_redirectUrl","_onComplete","_onError","_items","_notice","_busy","_dragging","_editing","active","item","sum","options","source","releasePreview","rowOf","inputs","input","result","progress","row","entry","completed","failed","errorMessage","list","finished","limit","next","before","staged","problem","maxBytes","minBytes","previewFor","facts","message","reason","dropped","kinds","editable","showDrop","customElement","PHOTO_OPTIONS","PHOTO_ACCEPT","SinglebaseAccountScreen","_settings","_nonceStorageKey","_editMode","_toast","_photoBusy","_photoFailed","_profileSaved","_passSaved","_profileError","_newPassError","_deleteStage","_confirmText","_dFirst","_dLast","_dPhone","_dEmail","_emailStep","_dNewEmail","_emailCode","_emailError","_emailSaved","_newPass","_confirmPass","createFilesUploadApi","first","last","phone","changes","reading","locked","providerId","nonce","oauth_redirect_url","photo","summary","providers","SinglebaseAuthButtons","_type","_intent","_provider","_providerName","_embedded","linking","idToken","refreshToken","linkKey","_c","primary","rest","option","OAUTH_DENIED","OAUTH_ERROR","OAUTH_ERROR_CODE","GUEST_SCREENS","PROTECTED_SCREENS","ALL_SCREENS","isGuestScreen","isProtectedScreen","isScreen","SinglebaseAuthScreen","_initialScreen","_screen","_noAccountView","_authEnabled","_allowEmailSignin","_allowEmailSignup","_allowEmailOtp","_allowOauth","_allowAccountCreation","_layout","_oauthPlacement","_stepped","_brandLine","_brandFoot","_signInTitle","_tosUrl","_privacyUrl","_inviteEmail","_inviteOrg","_inviteCode","_step","_method","_email","_password","_name","_firstName","_lastName","_phone","_code","_verifyNext","_loading","_banner","_passError","_needsMfaCode","_callbackDone","_callbackPhase","_linkNotice","offGoto","screen","offSignin","mfa","raw","authenticated","requested","params","url","accessCode","denied","_d","_e","_f","content","patch","code","purpose","resolveScreen","index","entered","digit","digits","landed","total","showForgot","creating","small","stepped","showName","showEmail","showPassword","showOtpLink","hasEmail","hasOauth","showHeads","emailOpen","oauthOpen","emailTitle","emailMeta","open","title","meta","body","onToggle","emailItem","oauthItem","ifDefined","showPrimary","showBack","showFoot","showStepBar","disabled","tos","privacy","noMethods","blocked","GUARD_STATES","SinglebaseAuthGuard","_slot","_predicate","_onMismatch","status","matchesPredicate","predicate","validatePredicate","child","childSlot","DEFAULT_AVATAR_PATH","SinglebaseAuthDisplay","_path","_fallback","_avatar","_alt","_imageFailed","profile","getPath","src","i$1","chatStyles","defaultChatMessages","resolveChatMessages","TABLE_ROW","TABLE_RULE","IMAGE_LINE","LIST_ITEM","TASK","RULE","ALERT","CALLOUT_KINDS","parseMarkdown","blocks","part","newline","info","fencedBlock","chunk","parseChunk","lang","spec","parseChart","rows","parseDelimited","kind","known","line","lines","cells","cell","ruleIndex","align","alert","items","heading","separator","field","quoted","width","series","labels","INLINE","parseInline","maxCite","pushText","prev","valid","settleStreaming","cut","marker","at","citedNumbers","found","group","chartRows","rowsText","CALLOUT_LABELS","adaptBlocks","level","simple","block","image","splitFollowups","followups","plainText","_m","provisionalTitle","space","cleanTitle","isSafeUrl","MAX_SVG_BYTES","DROP_ELEMENTS","svgDataUrl","doc","root","walk","el","inner","node","attr","external","scripted","style","markup","sidebarAttr","SIDEBAR_WIDTH","DOCK_SIDEBAR_AT","DOCK_PANEL_AT","MAX_FILES","MAX_FILE_SIZE","TEXT_FILE","TOAST_MS","MAX_TABLE_ROWS","MAX_JSON_NODES","CALLOUT_MESSAGE","ARRIVED_MS","CHART_COLORS","MODE_PROMPTS","FORMAT_PROMPTS","FOLLOWUP_PROMPT","DEFAULT_PROMPTS","icon","cls","svg","on","down","keySeed","newKey","VIEW_PREFS_KEY","readViewPrefs","saved","writeViewPrefs","prefs","isNotFound","errorCode","reducedMotion","formatNumber","unit","fileExt","describeSource","pick","score","number","path","collection","document","groupSources","sources","groups","toSavedFiles","toRetrieval","files","documents","dayGroup","iso","day","SinglebaseChat","_mode","_format","_renderers","_beforeSend","_afterParse","_glow","_docsets","_attachmentsMode","_saveAttachments","_followups","_showSources","_showNewChat","_showBookmarked","_showFollowups","_allowViewOptions","_allowSearch","_autoTitle","_model","_params","_systemMessage","_retrieval","_embed","_position","_sidebar","_showTitle","_chatIdAttr","_chatKey","_assistantName","_eyebrow","_prompts","_bubbleText","_greetingBubble","_unreadBadge","_allowUpload","_allowExport","_allowCopy","_allowRegenerate","_allowBookmark","_allowDelete","_allowFeedback","_showComposer","_showTime","_footnote","_allowRaw","_chatList","_listState","_activeId","_chatTitle","_bookmarked","_msgs","_loadingThread","_threadError","_draft","_files","_search","_sidebarOpen","_width","_panel","_menuOpen","_viewOpen","_viewHidden","_editingKey","_editDraft","_editingTitle","_renamingId","_copiedKey","_retrievalOpen","_rawKeys","_savedFiles","_hasSidebarContent","_sorts","_arrivedKey","_showJump","_offline","_isOpen","_expanded","_bubble","_seen","_mobile","_starterList","_startersLoading","shown","fn","ms","used","chat","run","docsets","auto","retrieval","signature","keyChanged","sync","payload","attachments","who","when","mime","ext","anchor","asPayload","names","bot","controller","isNew","chatId","reply","notFound","finish","full","step","resolve","question","answer","previous","assistant","existing","ids","removed","current","apply","wasActive","snapshot","actions","toast","picked","accepted","scroller","classes","frame","panel","bubble","button","overlay","query","pinned","inDay","stop","hasChat","canExpand","minimize","custom","mode","eyebrow","prompts","lastBot","repeat","time","latest","done","count","cited","numbered","cards","searched","inPanel","copyText","retrievalOpen","scores","seg","ordered","draw","numeric","toNumber","alignOf","col","sort","sortBy","nodes","depth","entries","legend","peak","scale","totals","passages","others","reference","refKey","placeholder","cantSend","footnote","autoConfig","script","baseUrl","singlebaseUrlAccessKey","singlebaseApiKey","singlebaseBaseUrl","base","SinglebaseClient","globalScope"],"mappings":"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AAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AA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AAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AA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","x_google_ignoreList":[2,3,4,5,6,7,8,9,34,35,36]}
|